From 8fd79d4f273dcd1cb14c7490f92b5e71f233f500 Mon Sep 17 00:00:00 2001 From: teravus Date: Sun, 5 Apr 2009 08:05:17 +0000 Subject: [PATCH] * Re-committing Bullet w/libbulletnet git-svn-id: file:///var/svn/opensim-libs@95 7c4940e8-6ff7-4914-b775-378afef7cd2e --- BulletPhysics/bulletTrunk/AUTHORS | 22 + BulletPhysics/bulletTrunk/BspDemo.bsp | Bin 0 -> 105100 bytes .../BulletConsoleTest.csproj | 58 + .../BulletDotNET/BulletConsoleTest/Program.cs | 162 + .../Properties/AssemblyInfo.cs | 36 + .../BulletDotNET/BulletDotNET.csproj | 88 + .../BulletDotNET/BulletDotNET/Native.cs | 27 + .../BulletDotNET/Properties/AssemblyInfo.cs | 36 + .../ClosestNotMeRayResultCallback.cs | 99 + .../CollisionShapes/btBoxShape.cs | 147 + .../CollisionShapes/btCapsuleShape.cs | 103 + .../btGImpactCollisionAlgorithm.cs | 10 + .../CollisionShapes/btGImpactMeshShape.cs | 92 + .../CollisionShapes/btSphereShape.cs | 105 + .../btStridingMeshInterface.cs | 33 + .../btTriangleIndexVertexArray.cs | 110 + .../CollisionShapes/btTriangleMesh.cs | 142 + .../bulletCollision/btAxisSweep3.cs | 91 + .../bulletCollision/btBroadphaseInterface.cs | 25 + .../btCollisionConfiguration.cs | 26 + .../bulletCollision/btCollisionDispatcher.cs | 97 + .../bulletCollision/btCollisionObject.cs | 592 + .../bulletCollision/btCollisionShape.cs | 236 + .../btDefaultCollisionConfiguration.cs | 86 + .../bulletCollision/btDispatcher.cs | 24 + .../bulletCollision/btGhostObject.cs | 88 + .../btHeightfieldTerrainShape.cs | 111 + .../btPairCachingGhostObject.cs | 81 + .../bulletCollision/btRayResultCallback.cs | 15 + .../bulletDynamics/btCollisionWorld.cs | 92 + .../bulletDynamics/btConstraintInfo2.cs | 97 + .../bulletDynamics/btConstraintSolver.cs | 25 + .../bulletDynamics/btDefaultMotionState.cs | 114 + .../bulletDynamics/btDiscreteDynamicsWorld.cs | 143 + .../bulletDynamics/btGeneric6DofConstraint.cs | 137 + .../bulletDynamics/btMotionState.cs | 91 + .../bulletDynamics/btRigidBody.cs | 458 + .../btRigidBodyConstructionInfo.cs | 149 + .../btSequentialImpulseConstraintSolver.cs | 87 + .../bulletDynamics/btTypedConstraint.cs | 46 + .../BulletDotNET/bulletMath/btMatrix3x3.cs | 177 + .../BulletDotNET/bulletMath/btQuaternion.cs | 316 + .../BulletDotNET/bulletMath/btTransform.cs | 238 + .../BulletDotNET/bulletMath/btVector3.cs | 260 + BulletPhysics/bulletTrunk/BulletLicense.txt | 17 + BulletPhysics/bulletTrunk/Bullet_Faq.pdf | Bin 0 -> 58005 bytes .../bulletTrunk/Bullet_User_Manual.pdf | Bin 0 -> 735298 bytes BulletPhysics/bulletTrunk/CMakeLists.txt | 71 + BulletPhysics/bulletTrunk/ChangeLog | 724 + .../Demos/AllBulletDemos/CMakeLists.txt | 48 + .../Demos/AllBulletDemos/DemoEntries.cpp | 164 + .../Demos/AllBulletDemos/DemoEntries.h | 34 + .../bulletTrunk/Demos/AllBulletDemos/Jamfile | 24 + .../bulletTrunk/Demos/AllBulletDemos/Main.cpp | 534 + .../Demos/AllBulletDemos/Makefile.am | 35 + .../bulletTrunk/Demos/BasicDemo/BasicDemo.cpp | 233 + .../bulletTrunk/Demos/BasicDemo/BasicDemo.h | 73 + .../Demos/BasicDemo/CMakeLists.txt | 26 + .../bulletTrunk/Demos/BasicDemo/Jamfile | 3 + .../bulletTrunk/Demos/BasicDemo/Makefile.am | 5 + .../Demos/BasicDemo/Makefile.original | 49 + .../bulletTrunk/Demos/BasicDemo/main.cpp | 89 + .../Demos/Benchmarks/BenchmarkDemo.cpp | 1215 + .../Demos/Benchmarks/BenchmarkDemo.h | 214 + .../Demos/Benchmarks/CMakeLists.txt | 25 + .../bulletTrunk/Demos/Benchmarks/Jamfile | 3 + .../bulletTrunk/Demos/Benchmarks/Taru.mdl | 188 + .../Demos/Benchmarks/landscape.mdl | 84369 ++++++++++++++++ .../bulletTrunk/Demos/Benchmarks/main.cpp | 45 + .../Demos/BspDemo/BspConverter.cpp | 207 + .../bulletTrunk/Demos/BspDemo/BspConverter.h | 39 + .../bulletTrunk/Demos/BspDemo/BspDemo.cpp | 305 + .../bulletTrunk/Demos/BspDemo/BspDemo.h | 69 + .../bulletTrunk/Demos/BspDemo/BspLoader.cpp | 730 + .../bulletTrunk/Demos/BspDemo/BspLoader.h | 295 + .../bulletTrunk/Demos/BspDemo/CMakeLists.txt | 26 + .../bulletTrunk/Demos/BspDemo/Jamfile | 3 + .../bulletTrunk/Demos/BspDemo/main.cpp | 59 + .../Demos/BulletDinoDemo/BulletDino.c | 996 + .../Demos/BulletDinoDemo/CMakeLists.txt | 61 + .../bulletTrunk/Demos/BulletDinoDemo/Jamfile | 3 + .../bulletTrunk/Demos/CMakeLists.txt | 12 + .../Demos/CcdPhysicsDemo/CMakeLists.txt | 26 + .../Demos/CcdPhysicsDemo/CcdPhysicsDemo.cpp | 681 + .../Demos/CcdPhysicsDemo/CcdPhysicsDemo.h | 83 + .../bulletTrunk/Demos/CcdPhysicsDemo/Jamfile | 3 + .../Demos/CcdPhysicsDemo/Makefile.am | 5 + .../bulletTrunk/Demos/CcdPhysicsDemo/main.cpp | 49 + .../Demos/CellSpuDemo/BasicDemo2.cpp | 277 + .../Demos/CellSpuDemo/BasicDemo2.h | 62 + .../Demos/CellSpuDemo/ibmsdk/Makefile | 69 + .../Demos/CharacterDemo/CMakeLists.txt | 31 + .../Demos/CharacterDemo/CharacterDemo.cpp | 490 + .../Demos/CharacterDemo/CharacterDemo.h | 153 + .../DynamicCharacterController.cpp | 204 + .../DynamicCharacterController.h | 55 + .../bulletTrunk/Demos/CharacterDemo/Jamfile | 9 + .../bulletTrunk/Demos/CharacterDemo/main.cpp | 19 + .../Demos/ColladaDemo/CMakeLists.txt | 25 + .../Demos/ColladaDemo/ColladaDemo.cpp | 209 + .../Demos/ColladaDemo/ColladaDemo.h | 38 + .../bulletTrunk/Demos/ColladaDemo/Jamfile | 32 + .../bulletTrunk/Demos/ColladaDemo/Makefile.am | 5 + .../Demos/CollisionDemo/CollisionDemo.cpp | 296 + .../Demos/CollisionDemo/CollisionDemo.h | 34 + .../bulletTrunk/Demos/CollisionDemo/Jamfile | 3 + .../CollisionInterfaceDemo.cpp | 190 + .../CollisionInterfaceDemo.h | 36 + .../Demos/CollisionInterfaceDemo/Jamfile | 3 + .../ConcaveConvexcastDemo.cpp | 517 + .../ConcaveConvexcastDemo.h | 84 + .../Demos/ConcaveConvexcastDemo/main.cpp | 15 + .../Demos/ConcaveDemo/ConcaveDemo.h | 84 + .../Demos/ConcaveDemo/ConcavePhysicsDemo.cpp | 454 + .../bulletTrunk/Demos/ConcaveDemo/Jamfile | 3 + .../bulletTrunk/Demos/ConcaveDemo/main.cpp | 19 + .../ConcaveRaycastDemo/ConcaveRaycastDemo.cpp | 493 + .../ConcaveRaycastDemo/ConcaveRaycastDemo.h | 85 + .../Demos/ConcaveRaycastDemo/main.cpp | 15 + .../Demos/ConstraintDemo/CMakeLists.txt | 26 + .../Demos/ConstraintDemo/ConstraintDemo.cpp | 433 + .../Demos/ConstraintDemo/ConstraintDemo.h | 56 + .../bulletTrunk/Demos/ConstraintDemo/Jamfile | 3 + .../bulletTrunk/Demos/ConstraintDemo/main.cpp | 20 + .../ContinuousConvexCollision.h | 35 + .../ContinuousConvexCollisionDemo.cpp | 287 + .../Demos/ContinuousConvexCollision/Jamfile | 3 + .../ConvexDecompositionDemo/CMakeLists.txt | 26 + .../ConvexDecompositionDemo.cpp | 519 + .../ConvexDecompositionDemo.h | 78 + .../Demos/ConvexDecompositionDemo/Jamfile | 22 + .../Demos/ConvexDecompositionDemo/main.cpp | 32 + .../ConvexHullDistanceDemo.cpp | 195 + .../Demos/ConvexHullDistance/Jamfile | 3 + .../DoublePrecisionDemo.cpp | 278 + .../DoublePrecisionDemo/DoublePrecisionDemo.h | 41 + .../Demos/DoublePrecisionDemo/Jamfile | 3 + .../Demos/DynamicControlDemo/MotorDemo.cpp | 444 + .../Demos/DynamicControlDemo/MotorDemo.h | 78 + .../Demos/DynamicControlDemo/main.cpp | 28 + .../bulletTrunk/Demos/EPAPenDepthDemo/Jamfile | 20 + .../EPAPenDepthDemo/PenetrationTestBullet.cpp | 857 + .../Demos/ForkLiftDemo/CMakeLists.txt | 62 + .../Demos/ForkLiftDemo/ForkLiftDemo.cpp | 857 + .../Demos/ForkLiftDemo/ForkLiftDemo.h | 112 + .../bulletTrunk/Demos/ForkLiftDemo/Jamfile | 3 + .../bulletTrunk/Demos/ForkLiftDemo/main.cpp | 18 + .../Demos/GenericJointDemo/CMakeLists.txt | 25 + .../GenericJointDemo/GenericJointDemo.cpp | 160 + .../Demos/GenericJointDemo/GenericJointDemo.h | 44 + .../Demos/GenericJointDemo/Jamfile | 3 + .../Demos/GenericJointDemo/Ragdoll.cpp | 373 + .../Demos/GenericJointDemo/Ragdoll.h | 71 + .../Demos/GimpactTestDemo/BunnyMesh.h | 1379 + .../Demos/GimpactTestDemo/GimpactTestDemo.cpp | 684 + .../Demos/GimpactTestDemo/GimpactTestDemo.h | 131 + .../bulletTrunk/Demos/GimpactTestDemo/Jamfile | 21 + .../Demos/GimpactTestDemo/TorusMesh.h | 921 + .../Demos/GimpactTestDemo/main.cpp | 13 + .../Demos/GjkConvexCastDemo/Jamfile | 3 + .../LinearConvexCastDemo.cpp | 185 + .../GjkConvexCastDemo/LinearConvexCastDemo.h | 44 + .../Demos/GjkConvexCastDemo/main.cpp | 17 + .../BulletHfFluid/btHfFluid.cpp | 1044 + .../BulletHfFluid/btHfFluid.h | 243 + .../btHfFluidBuoyantConvexShape.cpp | 194 + .../btHfFluidBuoyantConvexShape.h | 62 + ...tHfFluidBuoyantShapeCollisionAlgorithm.cpp | 74 + .../btHfFluidBuoyantShapeCollisionAlgorithm.h | 87 + .../BulletHfFluid/btHfFluidCollisionShape.cpp | 18 + .../BulletHfFluid/btHfFluidCollisionShape.h | 94 + .../btHfFluidRigidCollisionAlgorithm.cpp | 133 + .../btHfFluidRigidCollisionAlgorithm.h | 81 + .../btHfFluidRigidCollisionConfiguration.cpp | 87 + .../btHfFluidRigidCollisionConfiguration.h | 47 + .../btHfFluidRigidDynamicsWorld.cpp | 273 + .../btHfFluidRigidDynamicsWorld.h | 92 + .../Demos/HeightFieldFluidDemo/CMakeLists.txt | 35 + .../HeightFieldFluidDemo/HfFluidDemo.cpp | 1458 + .../Demos/HeightFieldFluidDemo/HfFluidDemo.h | 152 + .../HfFluidDemo_GL_ShapeDrawer.cpp | 606 + .../HfFluidDemo_GL_ShapeDrawer.h | 37 + .../Demos/HeightFieldFluidDemo/Jamfile | 5 + .../Demos/HeightFieldFluidDemo/main.cpp | 39 + .../Demos/HelloWorld/CMakeLists.txt | 14 + .../Demos/HelloWorld/HelloWorld.cpp | 175 + .../bulletTrunk/Demos/HelloWorld/Jamfile | 3 + BulletPhysics/bulletTrunk/Demos/Jamfile | 106 + BulletPhysics/bulletTrunk/Demos/Makefile.am | 5 + .../Demos/MovingConcaveDemo/CMakeLists.txt | 61 + .../Demos/MovingConcaveDemo/ConcaveDemo.h | 48 + .../MovingConcaveDemo/ConcavePhysicsDemo.cpp | 1927 + .../Demos/MovingConcaveDemo/Jamfile | 19 + .../Demos/MultiMaterialDemo/Jamfile | 3 + .../MultiMaterialDemo/MultiMaterialDemo.cpp | 382 + .../MultiMaterialDemo/MultiMaterialDemo.h | 84 + .../Demos/MultiMaterialDemo/main.cpp | 22 + .../Demos/MultiThreadedDemo/CMakeLists.txt | 29 + .../Demos/MultiThreadedDemo/Jamfile | 27 + .../Demos/MultiThreadedDemo/Makefile.am | 5 + .../MultiThreadedDemo/MultiThreadedDemo.cpp | 480 + .../MultiThreadedDemo/MultiThreadedDemo.h | 79 + .../Demos/MultiThreadedDemo/main.cpp | 36 + .../bulletTrunk/Demos/OpenGL/BMF_Api.cpp | 162 + .../bulletTrunk/Demos/OpenGL/BMF_Api.h | 128 + .../Demos/OpenGL/BMF_BitmapFont.cpp | 208 + .../bulletTrunk/Demos/OpenGL/BMF_BitmapFont.h | 111 + .../bulletTrunk/Demos/OpenGL/BMF_FontData.h | 56 + .../bulletTrunk/Demos/OpenGL/BMF_Fonts.h | 75 + .../bulletTrunk/Demos/OpenGL/BMF_Settings.h | 52 + .../Demos/OpenGL/BMF_font_helv10.cpp | 491 + .../bulletTrunk/Demos/OpenGL/CMakeLists.txt | 34 + .../Demos/OpenGL/DebugCastResult.h | 88 + .../Demos/OpenGL/DemoApplication.cpp | 1328 + .../Demos/OpenGL/DemoApplication.h | 229 + .../Demos/OpenGL/GLDebugDrawer.cpp | 130 + .../bulletTrunk/Demos/OpenGL/GLDebugDrawer.h | 38 + .../Demos/OpenGL/GL_ShapeDrawer.cpp | 850 + .../bulletTrunk/Demos/OpenGL/GL_ShapeDrawer.h | 68 + .../Demos/OpenGL/GL_Simplex1to4.cpp | 76 + .../bulletTrunk/Demos/OpenGL/GL_Simplex1to4.h | 40 + .../bulletTrunk/Demos/OpenGL/GlutStuff.cpp | 99 + .../bulletTrunk/Demos/OpenGL/GlutStuff.h | 52 + .../bulletTrunk/Demos/OpenGL/Jamfile | 19 + .../bulletTrunk/Demos/OpenGL/Makefile.am | 12 + .../Demos/OpenGL/RenderTexture.cpp | 73 + .../bulletTrunk/Demos/OpenGL/RenderTexture.h | 63 + .../bulletTrunk/Demos/OpenGL/ibmsdk/Makefile | 45 + .../bulletTrunk/Demos/OpenPL_Demo/CApi.cpp | 159 + .../Demos/OpenPL_Demo/OpenPL_Demo.c | 44 + .../Demos/RagdollDemo/CMakeLists.txt | 25 + .../bulletTrunk/Demos/RagdollDemo/Jamfile | 3 + .../Demos/RagdollDemo/RagdollDemo.cpp | 504 + .../Demos/RagdollDemo/RagdollDemo.h | 77 + .../bulletTrunk/Demos/RagdollDemo/main.cpp | 31 + .../bulletTrunk/Demos/Raytracer/Jamfile | 3 + .../bulletTrunk/Demos/Raytracer/Raytracer.cpp | 578 + .../bulletTrunk/Demos/Raytracer/Raytracer.h | 65 + .../bulletTrunk/Demos/Raytracer/main.cpp | 16 + .../bulletTrunk/Demos/SimplexDemo/Jamfile | 3 + .../Demos/SimplexDemo/SimplexDemo.cpp | 123 + .../Demos/SimplexDemo/SimplexDemo.h | 36 + .../Demos/SliderConstraintDemo/CMakeLists.txt | 26 + .../Demos/SliderConstraintDemo/Jamfile | 3 + .../SliderConstraintDemo.cpp | 439 + .../SliderConstraintDemo.h | 71 + .../Demos/SliderConstraintDemo/main.cpp | 24 + .../bulletTrunk/Demos/SoftDemo/CMakeLists.txt | 27 + .../bulletTrunk/Demos/SoftDemo/Jamfile | 3 + .../bulletTrunk/Demos/SoftDemo/Makefile.am | 5 + .../bulletTrunk/Demos/SoftDemo/SoftDemo.cpp | 1800 + .../bulletTrunk/Demos/SoftDemo/SoftDemo.h | 189 + .../bulletTrunk/Demos/SoftDemo/bunny.inl | 1836 + .../bulletTrunk/Demos/SoftDemo/cube.inl | 1988 + .../bulletTrunk/Demos/SoftDemo/main.cpp | 37 + .../bulletTrunk/Demos/TerrainDemo/Jamfile | 3 + .../bulletTrunk/Demos/TerrainDemo/Makefile.am | 6 + .../Demos/TerrainDemo/TerrainDemo.cpp | 928 + .../Demos/TerrainDemo/TerrainDemo.h | 27 + .../bulletTrunk/Demos/TerrainDemo/main.cpp | 14 + .../UserCollisionAlgorithm/CMakeLists.txt | 25 + .../Demos/UserCollisionAlgorithm/Jamfile | 3 + .../UserCollisionAlgorithm.cpp | 175 + .../UserCollisionAlgorithm.h | 36 + .../Demos/VehicleDemo/CMakeLists.txt | 26 + .../bulletTrunk/Demos/VehicleDemo/Jamfile | 3 + .../bulletTrunk/Demos/VehicleDemo/Makefile.am | 5 + .../Demos/VehicleDemo/VehicleDemo.cpp | 667 + .../Demos/VehicleDemo/VehicleDemo.h | 90 + .../bulletTrunk/Demos/VehicleDemo/main.cpp | 18 + BulletPhysics/bulletTrunk/Doxyfile | 763 + .../TemplateIcon.icns | Bin 0 -> 52318 bytes .../AllBulletDemos.xcodeproj/project.pbxproj | 1867 + .../AllBulletDemos.xcodeproj/zakariya.pbxuser | 248 + .../zakariya.perspectivev3 | 1517 + .../AllBulletDemos_Prefix.pch | 7 + .../Extras/AllBulletDemosOSX/BulletIcon.icns | Bin 0 -> 28472 bytes .../Extras/AllBulletDemosOSX/BulletIcon.psd | Bin 0 -> 101941 bytes .../English.lproj/Credits.rtf | 11 + .../English.lproj/InfoPlist.strings | Bin 0 -> 92 bytes .../English.lproj/MainMenu.xib | 2157 + .../Extras/AllBulletDemosOSX/Info.plist | 28 + .../Extras/AllBulletDemosOSX/README.txt | 6 + .../Extras/AllBulletDemosOSX/main.m | 14 + .../Extras/AllBulletDemosOSX/src/BTDemo.h | 106 + .../Extras/AllBulletDemosOSX/src/BTDemo.mm | 408 + .../src/BTDemosAppController.h | 54 + .../src/BTDemosAppController.m | 151 + .../src/BTSimulationParameters.h | 47 + .../src/BTSimulationParameters.m | 96 + .../src/toolkit/BTFullscreenWindow.h | 25 + .../src/toolkit/BTFullscreenWindow.m | 48 + .../src/toolkit/BTGLUTKeyAdapter.h | 46 + .../src/toolkit/BTGLUTKeyAdapter.m | 128 + .../src/toolkit/BTOpenGLDisplayDelegate.h | 50 + .../src/toolkit/BTOpenGLView.h | 65 + .../src/toolkit/BTOpenGLView.m | 603 + .../BulletColladaConverter/CMakeLists.txt | 12 + .../ColladaConverter.cpp | 3714 + .../BulletColladaConverter/ColladaConverter.h | 251 + .../Extras/BulletColladaConverter/Jamfile | 20 + .../CDTestFramework/AntTweakBar/ChangeLog.txt | 23 + .../CDTestFramework/AntTweakBar/Clean.bat | 19 + .../CDTestFramework/AntTweakBar/License.txt | 23 + .../CDTestFramework/AntTweakBar/Readme.txt | 15 + .../AntTweakBar/examples/Examples.ncb | Bin 0 -> 150528 bytes .../AntTweakBar/examples/Examples.sln | 65 + .../AntTweakBar/examples/Examples.suo | Bin 0 -> 15360 bytes .../AntTweakBar/examples/Makefile | 80 + .../AntTweakBar/examples/Makefile.x86_64 | 82 + .../AntTweakBar/examples/TwAdvanced1.cpp | 693 + .../AntTweakBar/examples/TwAdvanced1.vcproj | 142 + .../AntTweakBar/examples/TwCopyDLL.vcproj | 53 + .../AntTweakBar/examples/TwSimpleDX9.cpp | 228 + .../AntTweakBar/examples/TwSimpleDX9.vcproj | 138 + .../AntTweakBar/examples/TwSimpleGLFW.c | 200 + .../AntTweakBar/examples/TwSimpleGLFW.vcproj | 137 + .../AntTweakBar/examples/TwSimpleGLUT.c | 194 + .../AntTweakBar/examples/TwSimpleGLUT.vcproj | 141 + .../AntTweakBar/examples/TwSimpleSDL.c | 216 + .../AntTweakBar/examples/TwSimpleSDL.vcproj | 178 + .../AntTweakBar/examples/glfw.h | 482 + .../AntTweakBar/examples/glfwdll.lib | Bin 0 -> 15196 bytes .../AntTweakBar/include/AntTweakBar.h | 288 + .../AntTweakBar/lib/AntTweakBar.dll | Bin 0 -> 315392 bytes .../AntTweakBar/lib/AntTweakBar.exp | Bin 0 -> 4769 bytes .../AntTweakBar/lib/AntTweakBar.lib | Bin 0 -> 8904 bytes .../AntTweakBar/lib/Readme.txt | 6 + .../AntTweakBar/lib/libAntTweakBar.so.ldd | 4 + .../AntTweakBar/src/AntPerfTimer.h | 58 + .../AntTweakBar/src/AntTweakBar.rc | 83 + .../AntTweakBar/src/AntTweakBar.sln | 29 + .../AntTweakBar/src/AntTweakBar.vcproj | 380 + .../AntTweakBar/src/LoadOGL.cpp | 498 + .../CDTestFramework/AntTweakBar/src/LoadOGL.h | 393 + .../CDTestFramework/AntTweakBar/src/Makefile | 98 + .../AntTweakBar/src/Makefile.x86_64 | 97 + .../CDTestFramework/AntTweakBar/src/TwBar.cpp | 4841 + .../CDTestFramework/AntTweakBar/src/TwBar.h | 337 + .../AntTweakBar/src/TwColors.cpp | 161 + .../AntTweakBar/src/TwColors.h | 81 + .../AntTweakBar/src/TwDirect3D9.cpp | 674 + .../AntTweakBar/src/TwDirect3D9.h | 77 + .../AntTweakBar/src/TwEventGLFW.c | 191 + .../AntTweakBar/src/TwEventGLUT.c | 148 + .../AntTweakBar/src/TwEventSDL.c | 70 + .../AntTweakBar/src/TwEventWin32.c | 188 + .../AntTweakBar/src/TwFonts.cpp | 3935 + .../CDTestFramework/AntTweakBar/src/TwFonts.h | 67 + .../CDTestFramework/AntTweakBar/src/TwGraph.h | 54 + .../CDTestFramework/AntTweakBar/src/TwMgr.cpp | 3265 + .../CDTestFramework/AntTweakBar/src/TwMgr.h | 309 + .../AntTweakBar/src/TwOpenGL.cpp | 574 + .../AntTweakBar/src/TwOpenGL.h | 72 + .../AntTweakBar/src/TwPrecomp.cpp | 1 + .../AntTweakBar/src/TwPrecomp.h | 65 + .../AntTweakBar/src/res/FontChars.txt | 232 + .../AntTweakBar/src/res/FontLargeAA.pgm | 1197 + .../AntTweakBar/src/res/FontNormal.pgm | 895 + .../AntTweakBar/src/res/FontNormalAA.pgm | 1012 + .../AntTweakBar/src/res/FontSmall.pgm | 603 + .../AntTweakBar/src/res/TwXCursors.h | 909 + .../AntTweakBar/src/res/cur00000.cur | Bin 0 -> 326 bytes .../AntTweakBar/src/res/cur00001.cur | Bin 0 -> 326 bytes .../AntTweakBar/src/res/cur00002.cur | Bin 0 -> 326 bytes .../AntTweakBar/src/res/cur00003.cur | Bin 0 -> 326 bytes .../AntTweakBar/src/res/cur00004.cur | Bin 0 -> 326 bytes .../AntTweakBar/src/res/cur00005.cur | Bin 0 -> 326 bytes .../AntTweakBar/src/res/cur00006.cur | Bin 0 -> 326 bytes .../AntTweakBar/src/res/cur00007.cur | Bin 0 -> 326 bytes .../AntTweakBar/src/res/cur00008.cur | Bin 0 -> 326 bytes .../AntTweakBar/src/res/cur00009.cur | Bin 0 -> 326 bytes .../AntTweakBar/src/res/cur00010.cur | Bin 0 -> 326 bytes .../AntTweakBar/src/res/cur00011.cur | Bin 0 -> 326 bytes .../AntTweakBar/src/res/cur00012.cur | Bin 0 -> 326 bytes .../AntTweakBar/src/res/cur00013.cur | Bin 0 -> 326 bytes .../AntTweakBar/src/res/curs00.pbm | 32 + .../AntTweakBar/src/res/curs01.pbm | 32 + .../AntTweakBar/src/res/curs02.pbm | 32 + .../AntTweakBar/src/res/curs03.pbm | 32 + .../AntTweakBar/src/res/curs04.pbm | 32 + .../AntTweakBar/src/res/curs05.pbm | 32 + .../AntTweakBar/src/res/curs06.pbm | 32 + .../AntTweakBar/src/res/curs07.pbm | 32 + .../AntTweakBar/src/res/curs08.pbm | 32 + .../AntTweakBar/src/res/curs09.pbm | 32 + .../AntTweakBar/src/res/curs10.pbm | 32 + .../AntTweakBar/src/res/curs11.pbm | 32 + .../AntTweakBar/src/res/curs12.pbm | 32 + .../AntTweakBar/src/res/curs13.pbm | 32 + .../AntTweakBar/src/res/mask00.pbm | 32 + .../AntTweakBar/src/res/mask01.pbm | 32 + .../AntTweakBar/src/res/mask02.pbm | 32 + .../AntTweakBar/src/res/mask03.pbm | 32 + .../AntTweakBar/src/res/mask04.pbm | 32 + .../AntTweakBar/src/res/mask05.pbm | 32 + .../AntTweakBar/src/res/mask06.pbm | 32 + .../AntTweakBar/src/res/mask07.pbm | 32 + .../AntTweakBar/src/res/mask08.pbm | 32 + .../AntTweakBar/src/res/mask09.pbm | 32 + .../AntTweakBar/src/res/mask10.pbm | 32 + .../AntTweakBar/src/res/mask11.pbm | 32 + .../AntTweakBar/src/res/mask12.pbm | 32 + .../AntTweakBar/src/res/mask13.pbm | 32 + .../AntTweakBar/src/resource.h | 29 + .../CDTestFramework/Bin/AntTweakBar.dll | Bin 0 -> 315392 bytes .../Extras/CDTestFramework/Bin/Opcode.dll | Bin 0 -> 438272 bytes .../CDTestFramework/BipartiteBoxPruning.cpp | 165 + .../CDTestFramework/BipartiteBoxPruning.h | 51 + .../BulletSAPCompleteBoxPruningTest.cpp | 1061 + .../BulletSAPCompleteBoxPruningTest.h | 65 + .../CDTestFramework/CDTestFramework.cpp | 444 + .../Extras/CDTestFramework/CDTestFramework.h | 20 + .../CDTestFramework/CDTestFramework.sln | 78 + .../CDTestFramework/CDTestFramework.txt | 31 + .../CDTestFramework/CDTestFramework.vcproj | 365 + .../Extras/CDTestFramework/Camera.cpp | 156 + .../Extras/CDTestFramework/Camera.h | 32 + .../CDTestFramework/CapsuleMeshQuery.cpp | 127 + .../Extras/CDTestFramework/CapsuleMeshQuery.h | 49 + .../Extras/CDTestFramework/CollisionTest.cpp | 38 + .../Extras/CDTestFramework/CollisionTest.h | 50 + .../CDTestFramework/CompleteBoxPruning.cpp | 168 + .../CDTestFramework/CompleteBoxPruning.h | 53 + .../Extras/CDTestFramework/GLFontData.h | 1047 + .../Extras/CDTestFramework/GLFontRenderer.cpp | 207 + .../Extras/CDTestFramework/GLFontRenderer.h | 37 + .../Extras/CDTestFramework/GLUT32.DLL | Bin 0 -> 237568 bytes .../Extras/CDTestFramework/History.txt | 11 + .../Extras/CDTestFramework/IceHelpers.cpp | 358 + .../Extras/CDTestFramework/IceHelpers.h | 41 + .../Extras/CDTestFramework/License.txt | 49 + .../Extras/CDTestFramework/License.txt.bak | 0 .../Extras/CDTestFramework/OBBMeshQuery.cpp | 157 + .../Extras/CDTestFramework/OBBMeshQuery.h | 53 + .../CDTestFramework/Opcode/Ice/IceAABB.cpp | 422 + .../CDTestFramework/Opcode/Ice/IceAABB.h | 514 + .../Opcode/Ice/IceAllocator.cpp | 805 + .../CDTestFramework/Opcode/Ice/IceAllocator.h | 52 + .../CDTestFramework/Opcode/Ice/IceAssert.h | 48 + .../CDTestFramework/Opcode/Ice/IceAxes.h | 70 + .../Opcode/Ice/IceBitArray.cpp | 73 + .../CDTestFramework/Opcode/Ice/IceBitArray.h | 82 + .../Opcode/Ice/IceBoundingSphere.h | 158 + .../Opcode/Ice/IceContainer.cpp | 423 + .../CDTestFramework/Opcode/Ice/IceContainer.h | 254 + .../CDTestFramework/Opcode/Ice/IceFPU.h | 403 + .../CDTestFramework/Opcode/Ice/IceHPoint.cpp | 87 + .../CDTestFramework/Opcode/Ice/IceHPoint.h | 173 + .../CDTestFramework/Opcode/Ice/IceHashing.h | 78 + .../Opcode/Ice/IceIndexedTriangle.cpp | 564 + .../Opcode/Ice/IceIndexedTriangle.h | 84 + .../CDTestFramework/Opcode/Ice/IceLSS.h | 91 + .../Opcode/Ice/IceMatrix3x3.cpp | 64 + .../CDTestFramework/Opcode/Ice/IceMatrix3x3.h | 512 + .../Opcode/Ice/IceMatrix4x4.cpp | 152 + .../CDTestFramework/Opcode/Ice/IceMatrix4x4.h | 471 + .../Opcode/Ice/IceMemoryMacros.h | 180 + .../CDTestFramework/Opcode/Ice/IceOBB.cpp | 339 + .../CDTestFramework/Opcode/Ice/IceOBB.h | 193 + .../CDTestFramework/Opcode/Ice/IcePairs.h | 61 + .../CDTestFramework/Opcode/Ice/IcePlane.cpp | 61 + .../CDTestFramework/Opcode/Ice/IcePlane.h | 129 + .../CDTestFramework/Opcode/Ice/IcePoint.cpp | 209 + .../CDTestFramework/Opcode/Ice/IcePoint.h | 544 + .../Opcode/Ice/IcePreprocessor.h | 158 + .../CDTestFramework/Opcode/Ice/IceRandom.cpp | 52 + .../CDTestFramework/Opcode/Ice/IceRandom.h | 58 + .../CDTestFramework/Opcode/Ice/IceRay.cpp | 100 + .../CDTestFramework/Opcode/Ice/IceRay.h | 114 + .../Opcode/Ice/IceRevisitedRadix.cpp | 592 + .../Opcode/Ice/IceRevisitedRadix.h | 74 + .../CDTestFramework/Opcode/Ice/IceSegment.cpp | 73 + .../CDTestFramework/Opcode/Ice/IceSegment.h | 71 + .../Opcode/Ice/IceTriangle.cpp | 302 + .../CDTestFramework/Opcode/Ice/IceTriangle.h | 84 + .../CDTestFramework/Opcode/Ice/IceTrilist.h | 77 + .../CDTestFramework/Opcode/Ice/IceTypes.h | 181 + .../CDTestFramework/Opcode/Ice/IceUtils.cpp | 55 + .../CDTestFramework/Opcode/Ice/IceUtils.h | 377 + .../CDTestFramework/Opcode/Ice/_IceAABB.h | 522 + .../Opcode/Ice/_IceContainer.cpp | 361 + .../Opcode/Ice/_IceContainer.h | 228 + .../CDTestFramework/Opcode/Ice/_IceFPU.h | 333 + .../Opcode/Ice/_IceMemoryMacros.h | 121 + .../Opcode/Ice/_IcePreprocessor.h | 144 + .../Opcode/Ice/_IceRevisitedRadix.cpp | 536 + .../Opcode/Ice/_IceRevisitedRadix.h | 81 + .../CDTestFramework/Opcode/Ice/_IceTypes.h | 173 + .../CDTestFramework/Opcode/Ice/_IceUtils.h | 272 + .../Opcode/OPC_AABBCollider.cpp | 705 + .../CDTestFramework/Opcode/OPC_AABBCollider.h | 106 + .../CDTestFramework/Opcode/OPC_AABBTree.cpp | 582 + .../CDTestFramework/Opcode/OPC_AABBTree.h | 146 + .../CDTestFramework/Opcode/OPC_ArraySAP.cpp | 1221 + .../CDTestFramework/Opcode/OPC_ArraySAP.h | 159 + .../CDTestFramework/Opcode/OPC_BaseModel.cpp | 147 + .../CDTestFramework/Opcode/OPC_BaseModel.h | 184 + .../Opcode/OPC_BoxBoxOverlap.h | 139 + .../CDTestFramework/Opcode/OPC_BoxPruning.cpp | 376 + .../CDTestFramework/Opcode/OPC_BoxPruning.h | 40 + .../CDTestFramework/Opcode/OPC_Collider.cpp | 63 + .../CDTestFramework/Opcode/OPC_Collider.h | 185 + .../CDTestFramework/Opcode/OPC_Common.cpp | 57 + .../CDTestFramework/Opcode/OPC_Common.h | 110 + .../Opcode/OPC_HybridModel.cpp | 475 + .../CDTestFramework/Opcode/OPC_HybridModel.h | 115 + .../CDTestFramework/Opcode/OPC_IceHook.h | 92 + .../Opcode/OPC_LSSAABBOverlap.h | 539 + .../Opcode/OPC_LSSCollider.cpp | 734 + .../CDTestFramework/Opcode/OPC_LSSCollider.h | 108 + .../Opcode/OPC_LSSTriOverlap.h | 696 + .../Opcode/OPC_MeshInterface.cpp | 308 + .../Opcode/OPC_MeshInterface.h | 191 + .../CDTestFramework/Opcode/OPC_Model.cpp | 231 + .../Extras/CDTestFramework/Opcode/OPC_Model.h | 74 + .../Opcode/OPC_OBBCollider.cpp | 776 + .../CDTestFramework/Opcode/OPC_OBBCollider.h | 151 + .../Opcode/OPC_OptimizedTree.cpp | 791 + .../Opcode/OPC_OptimizedTree.h | 215 + .../CDTestFramework/Opcode/OPC_Picking.cpp | 191 + .../CDTestFramework/Opcode/OPC_Picking.h | 54 + .../Opcode/OPC_PlanesAABBOverlap.h | 67 + .../Opcode/OPC_PlanesCollider.cpp | 662 + .../Opcode/OPC_PlanesCollider.h | 130 + .../Opcode/OPC_PlanesTriOverlap.h | 57 + .../Opcode/OPC_RayAABBOverlap.h | 81 + .../Opcode/OPC_RayCollider.cpp | 771 + .../CDTestFramework/Opcode/OPC_RayCollider.h | 234 + .../Opcode/OPC_RayTriOverlap.h | 106 + .../CDTestFramework/Opcode/OPC_Settings.h | 58 + .../Opcode/OPC_SphereAABBOverlap.h | 145 + .../Opcode/OPC_SphereCollider.cpp | 735 + .../Opcode/OPC_SphereCollider.h | 105 + .../Opcode/OPC_SphereTriOverlap.h | 203 + .../Opcode/OPC_SweepAndPrune.cpp | 673 + .../Opcode/OPC_SweepAndPrune.h | 95 + .../Opcode/OPC_TreeBuilders.cpp | 264 + .../CDTestFramework/Opcode/OPC_TreeBuilders.h | 182 + .../Opcode/OPC_TreeCollider.cpp | 952 + .../CDTestFramework/Opcode/OPC_TreeCollider.h | 253 + .../Opcode/OPC_TriBoxOverlap.h | 356 + .../Opcode/OPC_TriTriOverlap.h | 295 + .../Opcode/OPC_VolumeCollider.cpp | 112 + .../Opcode/OPC_VolumeCollider.h | 147 + .../Extras/CDTestFramework/Opcode/Opcode.cpp | 74 + .../Extras/CDTestFramework/Opcode/Opcode.dsp | 517 + .../Extras/CDTestFramework/Opcode/Opcode.dsw | 29 + .../Extras/CDTestFramework/Opcode/Opcode.h | 99 + .../Extras/CDTestFramework/Opcode/Opcode.sln | 21 + .../CDTestFramework/Opcode/Opcode.vcproj | 1416 + .../Extras/CDTestFramework/Opcode/ReadMe.txt | 188 + .../Extras/CDTestFramework/Opcode/StdAfx.cpp | 19 + .../Extras/CDTestFramework/Opcode/StdAfx.h | 33 + .../CDTestFramework/OpcodeArraySAPTest.cpp | 215 + .../CDTestFramework/OpcodeArraySAPTest.h | 52 + .../Extras/CDTestFramework/Profiling.h | 102 + .../Extras/CDTestFramework/ReadMe.txt | 22 + .../CDTestFramework/RenderingHelpers.cpp | 1164 + .../Extras/CDTestFramework/RenderingHelpers.h | 26 + .../CDTestFramework/SphereMeshQuery.cpp | 141 + .../Extras/CDTestFramework/SphereMeshQuery.h | 48 + .../Extras/CDTestFramework/Terrain.cpp | 470 + .../Extras/CDTestFramework/Terrain.h | 47 + .../Extras/CDTestFramework/convex1.bin | Bin 0 -> 2924 bytes .../Extras/CDTestFramework/stdafx.cpp | 23 + .../Extras/CDTestFramework/stdafx.h | 23 + .../bulletTrunk/Extras/CMakeLists.txt | 1 + .../Extras/COLLADA_DOM/CMakeLists.txt | 213 + .../bulletTrunk/Extras/COLLADA_DOM/Jamfile | 38 + .../COLLADA_DOM/include/1.4/dom/domAccessor.h | 164 + .../include/1.4/dom/domAnimation.h | 218 + .../include/1.4/dom/domAnimation_clip.h | 187 + .../COLLADA_DOM/include/1.4/dom/domAsset.h | 1235 + .../include/1.4/dom/domBind_material.h | 205 + .../include/1.4/dom/domBool_array.h | 144 + .../COLLADA_DOM/include/1.4/dom/domBox.h | 172 + .../COLLADA_DOM/include/1.4/dom/domCOLLADA.h | 534 + .../COLLADA_DOM/include/1.4/dom/domCamera.h | 694 + .../COLLADA_DOM/include/1.4/dom/domCapsule.h | 254 + .../include/1.4/dom/domCg_connect_param.h | 121 + .../include/1.4/dom/domCg_newarray_type.h | 200 + .../include/1.4/dom/domCg_newparam.h | 342 + .../include/1.4/dom/domCg_param_type.h | 8428 ++ .../include/1.4/dom/domCg_sampler1D.h | 90 + .../include/1.4/dom/domCg_sampler2D.h | 90 + .../include/1.4/dom/domCg_sampler3D.h | 90 + .../include/1.4/dom/domCg_samplerCUBE.h | 90 + .../include/1.4/dom/domCg_samplerDEPTH.h | 90 + .../include/1.4/dom/domCg_samplerRECT.h | 90 + .../include/1.4/dom/domCg_setarray_type.h | 188 + .../include/1.4/dom/domCg_setparam.h | 194 + .../include/1.4/dom/domCg_setparam_simple.h | 138 + .../include/1.4/dom/domCg_setuser_type.h | 233 + .../include/1.4/dom/domCg_surface_type.h | 341 + .../COLLADA_DOM/include/1.4/dom/domChannel.h | 112 + .../1.4/dom/domCommon_color_or_texture_type.h | 369 + .../1.4/dom/domCommon_float_or_param_type.h | 272 + .../include/1.4/dom/domCommon_newparam_type.h | 540 + .../1.4/dom/domCommon_transparent_type.h | 85 + .../include/1.4/dom/domConstants.h | 1093 + .../include/1.4/dom/domController.h | 175 + .../include/1.4/dom/domConvex_mesh.h | 236 + .../COLLADA_DOM/include/1.4/dom/domCylinder.h | 253 + .../COLLADA_DOM/include/1.4/dom/domEffect.h | 215 + .../COLLADA_DOM/include/1.4/dom/domElements.h | 871 + .../include/1.4/dom/domEllipsoid.h | 148 + .../COLLADA_DOM/include/1.4/dom/domExtra.h | 150 + .../include/1.4/dom/domFloat_array.h | 180 + .../include/1.4/dom/domForce_field.h | 148 + .../include/1.4/dom/domFx_annotate_common.h | 126 + .../1.4/dom/domFx_annotate_type_common.h | 1321 + .../include/1.4/dom/domFx_basic_type_common.h | 2379 + .../include/1.4/dom/domFx_clearcolor_common.h | 139 + .../include/1.4/dom/domFx_cleardepth_common.h | 134 + .../1.4/dom/domFx_clearstencil_common.h | 134 + .../include/1.4/dom/domFx_code_profile.h | 143 + .../1.4/dom/domFx_colortarget_common.h | 206 + .../1.4/dom/domFx_depthtarget_common.h | 206 + .../include/1.4/dom/domFx_include_common.h | 167 + .../include/1.4/dom/domFx_newparam_common.h | 313 + .../include/1.4/dom/domFx_profile_abstract.h | 69 + .../include/1.4/dom/domFx_sampler1D_common.h | 698 + .../include/1.4/dom/domFx_sampler2D_common.h | 771 + .../include/1.4/dom/domFx_sampler3D_common.h | 844 + .../1.4/dom/domFx_samplerCUBE_common.h | 844 + .../1.4/dom/domFx_samplerDEPTH_common.h | 474 + .../1.4/dom/domFx_samplerRECT_common.h | 771 + .../include/1.4/dom/domFx_setparam_common.h | 122 + .../1.4/dom/domFx_stenciltarget_common.h | 206 + .../include/1.4/dom/domFx_surface_common.h | 638 + .../dom/domFx_surface_format_hint_common.h | 448 + .../1.4/dom/domFx_surface_init_common.h | 278 + .../1.4/dom/domFx_surface_init_cube_common.h | 458 + .../1.4/dom/domFx_surface_init_from_common.h | 191 + .../dom/domFx_surface_init_planar_common.h | 179 + .../dom/domFx_surface_init_volume_common.h | 281 + .../COLLADA_DOM/include/1.4/dom/domGeometry.h | 181 + .../include/1.4/dom/domGl_hook_abstract.h | 65 + .../include/1.4/dom/domGl_pipeline_settings.h | 12361 +++ .../include/1.4/dom/domGl_sampler1D.h | 93 + .../include/1.4/dom/domGl_sampler2D.h | 93 + .../include/1.4/dom/domGl_sampler3D.h | 93 + .../include/1.4/dom/domGl_samplerCUBE.h | 93 + .../include/1.4/dom/domGl_samplerDEPTH.h | 93 + .../include/1.4/dom/domGl_samplerRECT.h | 93 + .../1.4/dom/domGles_basic_type_common.h | 2358 + .../include/1.4/dom/domGles_newparam.h | 313 + .../1.4/dom/domGles_pipeline_settings.h | 7233 ++ .../include/1.4/dom/domGles_sampler_state.h | 657 + .../domGles_texcombiner_argumentAlpha_type.h | 166 + .../domGles_texcombiner_argumentRGB_type.h | 166 + .../domGles_texcombiner_commandAlpha_type.h | 155 + .../dom/domGles_texcombiner_commandRGB_type.h | 159 + .../dom/domGles_texcombiner_command_type.h | 113 + .../1.4/dom/domGles_texenv_command_type.h | 150 + .../1.4/dom/domGles_texture_constant_type.h | 152 + .../1.4/dom/domGles_texture_pipeline.h | 196 + .../include/1.4/dom/domGles_texture_unit.h | 355 + .../include/1.4/dom/domGlsl_newarray_type.h | 174 + .../include/1.4/dom/domGlsl_newparam.h | 313 + .../include/1.4/dom/domGlsl_param_type.h | 1370 + .../include/1.4/dom/domGlsl_setarray_type.h | 174 + .../include/1.4/dom/domGlsl_setparam.h | 189 + .../include/1.4/dom/domGlsl_setparam_simple.h | 138 + .../include/1.4/dom/domGlsl_surface_type.h | 342 + .../include/1.4/dom/domIDREF_array.h | 144 + .../COLLADA_DOM/include/1.4/dom/domImage.h | 398 + .../include/1.4/dom/domInputGlobal.h | 164 + .../include/1.4/dom/domInputLocal.h | 164 + .../include/1.4/dom/domInputLocalOffset.h | 222 + .../include/1.4/dom/domInstanceWithExtra.h | 211 + .../include/1.4/dom/domInstance_camera.h | 70 + .../include/1.4/dom/domInstance_controller.h | 252 + .../include/1.4/dom/domInstance_effect.h | 358 + .../include/1.4/dom/domInstance_force_field.h | 70 + .../include/1.4/dom/domInstance_geometry.h | 157 + .../include/1.4/dom/domInstance_light.h | 70 + .../include/1.4/dom/domInstance_material.h | 386 + .../include/1.4/dom/domInstance_node.h | 70 + .../1.4/dom/domInstance_physics_material.h | 70 + .../1.4/dom/domInstance_physics_model.h | 218 + .../include/1.4/dom/domInstance_rigid_body.h | 954 + .../1.4/dom/domInstance_rigid_constraint.h | 138 + .../include/1.4/dom/domInt_array.h | 179 + .../1.4/dom/domLibrary_animation_clips.h | 148 + .../include/1.4/dom/domLibrary_animations.h | 146 + .../include/1.4/dom/domLibrary_cameras.h | 146 + .../include/1.4/dom/domLibrary_controllers.h | 146 + .../include/1.4/dom/domLibrary_effects.h | 146 + .../include/1.4/dom/domLibrary_force_fields.h | 146 + .../include/1.4/dom/domLibrary_geometries.h | 146 + .../include/1.4/dom/domLibrary_images.h | 146 + .../include/1.4/dom/domLibrary_lights.h | 146 + .../include/1.4/dom/domLibrary_materials.h | 146 + .../include/1.4/dom/domLibrary_nodes.h | 146 + .../1.4/dom/domLibrary_physics_materials.h | 148 + .../1.4/dom/domLibrary_physics_models.h | 147 + .../1.4/dom/domLibrary_physics_scenes.h | 147 + .../1.4/dom/domLibrary_visual_scenes.h | 147 + .../COLLADA_DOM/include/1.4/dom/domLight.h | 666 + .../COLLADA_DOM/include/1.4/dom/domLines.h | 169 + .../include/1.4/dom/domLinestrips.h | 174 + .../COLLADA_DOM/include/1.4/dom/domLookat.h | 113 + .../COLLADA_DOM/include/1.4/dom/domMaterial.h | 141 + .../COLLADA_DOM/include/1.4/dom/domMatrix.h | 112 + .../COLLADA_DOM/include/1.4/dom/domMesh.h | 238 + .../COLLADA_DOM/include/1.4/dom/domMorph.h | 241 + .../include/1.4/dom/domName_array.h | 144 + .../COLLADA_DOM/include/1.4/dom/domNode.h | 394 + .../Extras/COLLADA_DOM/include/1.4/dom/domP.h | 94 + .../COLLADA_DOM/include/1.4/dom/domParam.h | 156 + .../include/1.4/dom/domPhysics_material.h | 247 + .../include/1.4/dom/domPhysics_model.h | 180 + .../include/1.4/dom/domPhysics_scene.h | 263 + .../COLLADA_DOM/include/1.4/dom/domPlane.h | 174 + .../COLLADA_DOM/include/1.4/dom/domPolygons.h | 366 + .../COLLADA_DOM/include/1.4/dom/domPolylist.h | 259 + .../include/1.4/dom/domProfile_CG.h | 1248 + .../include/1.4/dom/domProfile_COMMON.h | 768 + .../include/1.4/dom/domProfile_GLES.h | 1106 + .../include/1.4/dom/domProfile_GLSL.h | 1223 + .../include/1.4/dom/domRigid_body.h | 832 + .../include/1.4/dom/domRigid_constraint.h | 1198 + .../COLLADA_DOM/include/1.4/dom/domRotate.h | 111 + .../COLLADA_DOM/include/1.4/dom/domSampler.h | 108 + .../COLLADA_DOM/include/1.4/dom/domScale.h | 70 + .../COLLADA_DOM/include/1.4/dom/domSkew.h | 111 + .../COLLADA_DOM/include/1.4/dom/domSkin.h | 607 + .../COLLADA_DOM/include/1.4/dom/domSource.h | 282 + .../COLLADA_DOM/include/1.4/dom/domSphere.h | 167 + .../COLLADA_DOM/include/1.4/dom/domSpline.h | 214 + .../include/1.4/dom/domTapered_capsule.h | 344 + .../include/1.4/dom/domTapered_cylinder.h | 344 + .../include/1.4/dom/domTargetableFloat.h | 143 + .../include/1.4/dom/domTargetableFloat3.h | 148 + .../include/1.4/dom/domTechnique.h | 137 + .../include/1.4/dom/domTranslate.h | 70 + .../include/1.4/dom/domTriangles.h | 169 + .../COLLADA_DOM/include/1.4/dom/domTrifans.h | 174 + .../include/1.4/dom/domTristrips.h | 174 + .../COLLADA_DOM/include/1.4/dom/domTypes.h | 1258 + .../COLLADA_DOM/include/1.4/dom/domVertices.h | 140 + .../include/1.4/dom/domVisual_scene.h | 437 + .../Extras/COLLADA_DOM/include/dae.h | 104 + .../Extras/COLLADA_DOM/include/dae/daeArray.h | 635 + .../COLLADA_DOM/include/dae/daeArrayTypes.h | 30 + .../COLLADA_DOM/include/dae/daeAtomicType.h | 736 + .../COLLADA_DOM/include/dae/daeDatabase.h | 265 + .../COLLADA_DOM/include/dae/daeDocument.h | 157 + .../Extras/COLLADA_DOM/include/dae/daeDom.h | 32 + .../COLLADA_DOM/include/dae/daeDomTypes.h | 68 + .../COLLADA_DOM/include/dae/daeElement.h | 476 + .../Extras/COLLADA_DOM/include/dae/daeError.h | 50 + .../COLLADA_DOM/include/dae/daeErrorHandler.h | 65 + .../COLLADA_DOM/include/dae/daeGCCPlatform.h | 30 + .../include/dae/daeGenericPlatform.h | 32 + .../Extras/COLLADA_DOM/include/dae/daeIDRef.h | 346 + .../COLLADA_DOM/include/dae/daeIOPlugin.h | 112 + .../include/dae/daeIntegrationObject.h | 179 + .../COLLADA_DOM/include/dae/daeInterface.h | 231 + .../COLLADA_DOM/include/dae/daeMemorySystem.h | 63 + .../COLLADA_DOM/include/dae/daeMetaAny.h | 44 + .../include/dae/daeMetaAttribute.h | 287 + .../COLLADA_DOM/include/dae/daeMetaCMPolicy.h | 120 + .../COLLADA_DOM/include/dae/daeMetaChoice.h | 44 + .../COLLADA_DOM/include/dae/daeMetaElement.h | 395 + .../include/dae/daeMetaElementAttribute.h | 189 + .../COLLADA_DOM/include/dae/daeMetaGroup.h | 55 + .../COLLADA_DOM/include/dae/daeMetaSequence.h | 51 + .../COLLADA_DOM/include/dae/daeSIDResolver.h | 149 + .../COLLADA_DOM/include/dae/daeSmartRef.h | 156 + .../COLLADA_DOM/include/dae/daeStringRef.h | 108 + .../COLLADA_DOM/include/dae/daeStringTable.h | 64 + .../Extras/COLLADA_DOM/include/dae/daeTypes.h | 70 + .../Extras/COLLADA_DOM/include/dae/daeURI.h | 506 + .../include/dae/daeWin32Platform.h | 51 + .../Extras/COLLADA_DOM/include/dae/domAny.h | 139 + .../Extras/COLLADA_DOM/include/dom.h | 28 + .../include/modules/daeLIBXMLPlugin.h | 92 + .../include/modules/daeLIBXMLResolver.h | 52 + .../include/modules/daeSTLDatabase.h | 93 + .../include/modules/stdErrPlugin.h | 33 + .../bulletTrunk/Extras/COLLADA_DOM/readme.txt | 3 + .../COLLADA_DOM/scea-shared-source-lic1.0.txt | 64 + .../scea-shared-source-license1.0.pdf | Bin 0 -> 18764 bytes .../COLLADA_DOM/src/1.4/dom/dom1.4_vc8.vcproj | 1499 + .../COLLADA_DOM/src/1.4/dom/domAccessor.cpp | 111 + .../COLLADA_DOM/src/1.4/dom/domAnimation.cpp | 179 + .../src/1.4/dom/domAnimation_clip.cpp | 120 + .../COLLADA_DOM/src/1.4/dom/domAsset.cpp | 658 + .../src/1.4/dom/domBind_material.cpp | 120 + .../COLLADA_DOM/src/1.4/dom/domBool_array.cpp | 94 + .../Extras/COLLADA_DOM/src/1.4/dom/domBox.cpp | 105 + .../COLLADA_DOM/src/1.4/dom/domCOLLADA.cpp | 268 + .../COLLADA_DOM/src/1.4/dom/domCamera.cpp | 454 + .../COLLADA_DOM/src/1.4/dom/domCapsule.cpp | 147 + .../src/1.4/dom/domCg_connect_param.cpp | 63 + .../src/1.4/dom/domCg_newarray_type.cpp | 97 + .../src/1.4/dom/domCg_newparam.cpp | 187 + .../src/1.4/dom/domCg_param_type.cpp | 4598 + .../src/1.4/dom/domCg_sampler1D.cpp | 117 + .../src/1.4/dom/domCg_sampler2D.cpp | 123 + .../src/1.4/dom/domCg_sampler3D.cpp | 129 + .../src/1.4/dom/domCg_samplerCUBE.cpp | 129 + .../src/1.4/dom/domCg_samplerDEPTH.cpp | 99 + .../src/1.4/dom/domCg_samplerRECT.cpp | 123 + .../src/1.4/dom/domCg_setarray_type.cpp | 91 + .../src/1.4/dom/domCg_setparam.cpp | 108 + .../src/1.4/dom/domCg_setparam_simple.cpp | 81 + .../src/1.4/dom/domCg_setuser_type.cpp | 121 + .../src/1.4/dom/domCg_surface_type.cpp | 266 + .../COLLADA_DOM/src/1.4/dom/domChannel.cpp | 76 + .../dom/domCommon_color_or_texture_type.cpp | 228 + .../1.4/dom/domCommon_float_or_param_type.cpp | 159 + .../src/1.4/dom/domCommon_newparam_type.cpp | 301 + .../1.4/dom/domCommon_transparent_type.cpp | 97 + .../COLLADA_DOM/src/1.4/dom/domConstants.cpp | 1088 + .../COLLADA_DOM/src/1.4/dom/domController.cpp | 113 + .../src/1.4/dom/domConvex_mesh.cpp | 139 + .../COLLADA_DOM/src/1.4/dom/domCylinder.cpp | 147 + .../COLLADA_DOM/src/1.4/dom/domEffect.cpp | 152 + .../COLLADA_DOM/src/1.4/dom/domEllipsoid.cpp | 99 + .../COLLADA_DOM/src/1.4/dom/domExtra.cpp | 102 + .../src/1.4/dom/domFloat_array.cpp | 118 + .../src/1.4/dom/domForce_field.cpp | 97 + .../src/1.4/dom/domFx_annotate_common.cpp | 75 + .../1.4/dom/domFx_annotate_type_common.cpp | 734 + .../src/1.4/dom/domFx_basic_type_common.cpp | 1322 + .../src/1.4/dom/domFx_clearcolor_common.cpp | 73 + .../src/1.4/dom/domFx_cleardepth_common.cpp | 73 + .../src/1.4/dom/domFx_clearstencil_common.cpp | 73 + .../src/1.4/dom/domFx_code_profile.cpp | 72 + .../src/1.4/dom/domFx_colortarget_common.cpp | 112 + .../src/1.4/dom/domFx_depthtarget_common.cpp | 112 + .../src/1.4/dom/domFx_include_common.cpp | 76 + .../src/1.4/dom/domFx_newparam_common.cpp | 165 + .../src/1.4/dom/domFx_profile_abstract.cpp | 52 + .../src/1.4/dom/domFx_sampler1D_common.cpp | 399 + .../src/1.4/dom/domFx_sampler2D_common.cpp | 441 + .../src/1.4/dom/domFx_sampler3D_common.cpp | 483 + .../src/1.4/dom/domFx_samplerCUBE_common.cpp | 483 + .../src/1.4/dom/domFx_samplerDEPTH_common.cpp | 273 + .../src/1.4/dom/domFx_samplerRECT_common.cpp | 441 + .../1.4/dom/domFx_stenciltarget_common.cpp | 112 + .../src/1.4/dom/domFx_surface_common.cpp | 322 + .../dom/domFx_surface_format_hint_common.cpp | 231 + .../src/1.4/dom/domFx_surface_init_common.cpp | 152 + .../dom/domFx_surface_init_cube_common.cpp | 244 + .../dom/domFx_surface_init_from_common.cpp | 96 + .../dom/domFx_surface_init_planar_common.cpp | 101 + .../dom/domFx_surface_init_volume_common.cpp | 151 + .../COLLADA_DOM/src/1.4/dom/domGeometry.cpp | 119 + .../src/1.4/dom/domGl_hook_abstract.cpp | 52 + .../src/1.4/dom/domGl_pipeline_settings.cpp | 8371 ++ .../src/1.4/dom/domGl_sampler1D.cpp | 117 + .../src/1.4/dom/domGl_sampler2D.cpp | 123 + .../src/1.4/dom/domGl_sampler3D.cpp | 129 + .../src/1.4/dom/domGl_samplerCUBE.cpp | 129 + .../src/1.4/dom/domGl_samplerDEPTH.cpp | 99 + .../src/1.4/dom/domGl_samplerRECT.cpp | 123 + .../src/1.4/dom/domGles_basic_type_common.cpp | 1304 + .../src/1.4/dom/domGles_newparam.cpp | 165 + .../src/1.4/dom/domGles_pipeline_settings.cpp | 4948 + .../src/1.4/dom/domGles_sampler_state.cpp | 368 + ...domGles_texcombiner_argumentAlpha_type.cpp | 86 + .../domGles_texcombiner_argumentRGB_type.cpp | 86 + .../domGles_texcombiner_commandAlpha_type.cpp | 86 + .../domGles_texcombiner_commandRGB_type.cpp | 86 + .../dom/domGles_texcombiner_command_type.cpp | 75 + .../1.4/dom/domGles_texenv_command_type.cpp | 85 + .../1.4/dom/domGles_texture_constant_type.cpp | 75 + .../src/1.4/dom/domGles_texture_pipeline.cpp | 90 + .../src/1.4/dom/domGles_texture_unit.cpp | 202 + .../src/1.4/dom/domGlsl_newarray_type.cpp | 85 + .../src/1.4/dom/domGlsl_newparam.cpp | 181 + .../src/1.4/dom/domGlsl_param_type.cpp | 776 + .../src/1.4/dom/domGlsl_setarray_type.cpp | 85 + .../src/1.4/dom/domGlsl_setparam.cpp | 108 + .../src/1.4/dom/domGlsl_setparam_simple.cpp | 81 + .../src/1.4/dom/domGlsl_surface_type.cpp | 266 + .../src/1.4/dom/domIDREF_array.cpp | 94 + .../COLLADA_DOM/src/1.4/dom/domImage.cpp | 231 + .../src/1.4/dom/domInputGlobal.cpp | 76 + .../COLLADA_DOM/src/1.4/dom/domInputLocal.cpp | 76 + .../src/1.4/dom/domInputLocalOffset.cpp | 99 + .../src/1.4/dom/domInstanceWithExtra.cpp | 98 + .../src/1.4/dom/domInstance_camera.cpp | 97 + .../src/1.4/dom/domInstance_controller.cpp | 147 + .../src/1.4/dom/domInstance_effect.cpp | 224 + .../src/1.4/dom/domInstance_force_field.cpp | 97 + .../src/1.4/dom/domInstance_geometry.cpp | 104 + .../src/1.4/dom/domInstance_light.cpp | 97 + .../src/1.4/dom/domInstance_material.cpp | 235 + .../src/1.4/dom/domInstance_node.cpp | 97 + .../1.4/dom/domInstance_physics_material.cpp | 97 + .../src/1.4/dom/domInstance_physics_model.cpp | 128 + .../src/1.4/dom/domInstance_rigid_body.cpp | 585 + .../1.4/dom/domInstance_rigid_constraint.cpp | 97 + .../COLLADA_DOM/src/1.4/dom/domInt_array.cpp | 118 + .../1.4/dom/domLibrary_animation_clips.cpp | 97 + .../src/1.4/dom/domLibrary_animations.cpp | 97 + .../src/1.4/dom/domLibrary_cameras.cpp | 97 + .../src/1.4/dom/domLibrary_controllers.cpp | 97 + .../src/1.4/dom/domLibrary_effects.cpp | 97 + .../src/1.4/dom/domLibrary_force_fields.cpp | 97 + .../src/1.4/dom/domLibrary_geometries.cpp | 97 + .../src/1.4/dom/domLibrary_images.cpp | 97 + .../src/1.4/dom/domLibrary_lights.cpp | 97 + .../src/1.4/dom/domLibrary_materials.cpp | 97 + .../src/1.4/dom/domLibrary_nodes.cpp | 97 + .../1.4/dom/domLibrary_physics_materials.cpp | 97 + .../src/1.4/dom/domLibrary_physics_models.cpp | 97 + .../src/1.4/dom/domLibrary_physics_scenes.cpp | 97 + .../src/1.4/dom/domLibrary_visual_scenes.cpp | 97 + .../COLLADA_DOM/src/1.4/dom/domLight.cpp | 368 + .../COLLADA_DOM/src/1.4/dom/domLines.cpp | 109 + .../COLLADA_DOM/src/1.4/dom/domLinestrips.cpp | 109 + .../COLLADA_DOM/src/1.4/dom/domLookat.cpp | 71 + .../COLLADA_DOM/src/1.4/dom/domMaterial.cpp | 97 + .../COLLADA_DOM/src/1.4/dom/domMatrix.cpp | 71 + .../COLLADA_DOM/src/1.4/dom/domMesh.cpp | 127 + .../COLLADA_DOM/src/1.4/dom/domMorph.cpp | 145 + .../COLLADA_DOM/src/1.4/dom/domName_array.cpp | 94 + .../COLLADA_DOM/src/1.4/dom/domNode.cpp | 207 + .../Extras/COLLADA_DOM/src/1.4/dom/domP.cpp | 60 + .../COLLADA_DOM/src/1.4/dom/domParam.cpp | 105 + .../src/1.4/dom/domPhysics_material.cpp | 154 + .../src/1.4/dom/domPhysics_model.cpp | 109 + .../src/1.4/dom/domPhysics_scene.cpp | 160 + .../COLLADA_DOM/src/1.4/dom/domPlane.cpp | 105 + .../COLLADA_DOM/src/1.4/dom/domPolygons.cpp | 206 + .../COLLADA_DOM/src/1.4/dom/domPolylist.cpp | 151 + .../COLLADA_DOM/src/1.4/dom/domProfile_CG.cpp | 723 + .../src/1.4/dom/domProfile_COMMON.cpp | 565 + .../src/1.4/dom/domProfile_GLES.cpp | 654 + .../src/1.4/dom/domProfile_GLSL.cpp | 704 + .../COLLADA_DOM/src/1.4/dom/domRigid_body.cpp | 477 + .../src/1.4/dom/domRigid_constraint.cpp | 677 + .../COLLADA_DOM/src/1.4/dom/domRotate.cpp | 71 + .../COLLADA_DOM/src/1.4/dom/domSampler.cpp | 74 + .../COLLADA_DOM/src/1.4/dom/domScale.cpp | 71 + .../COLLADA_DOM/src/1.4/dom/domSkew.cpp | 71 + .../COLLADA_DOM/src/1.4/dom/domSkin.cpp | 322 + .../COLLADA_DOM/src/1.4/dom/domSource.cpp | 177 + .../COLLADA_DOM/src/1.4/dom/domSphere.cpp | 105 + .../COLLADA_DOM/src/1.4/dom/domSpline.cpp | 132 + .../src/1.4/dom/domTapered_capsule.cpp | 189 + .../src/1.4/dom/domTapered_cylinder.cpp | 189 + .../src/1.4/dom/domTargetableFloat.cpp | 71 + .../src/1.4/dom/domTargetableFloat3.cpp | 71 + .../COLLADA_DOM/src/1.4/dom/domTechnique.cpp | 90 + .../COLLADA_DOM/src/1.4/dom/domTranslate.cpp | 71 + .../COLLADA_DOM/src/1.4/dom/domTriangles.cpp | 109 + .../COLLADA_DOM/src/1.4/dom/domTrifans.cpp | 109 + .../COLLADA_DOM/src/1.4/dom/domTristrips.cpp | 109 + .../COLLADA_DOM/src/1.4/dom/domTypes.cpp | 2937 + .../COLLADA_DOM/src/1.4/dom/domVertices.cpp | 92 + .../src/1.4/dom/domVisual_scene.cpp | 248 + .../Extras/COLLADA_DOM/src/dae/dae.cpp | 385 + .../Extras/COLLADA_DOM/src/dae/daeArray.cpp | 85 + .../COLLADA_DOM/src/dae/daeAtomicType.cpp | 779 + .../COLLADA_DOM/src/dae/daeDocument.cpp | 104 + .../Extras/COLLADA_DOM/src/dae/daeDom.cpp | 24 + .../Extras/COLLADA_DOM/src/dae/daeElement.cpp | 554 + .../Extras/COLLADA_DOM/src/dae/daeError.cpp | 45 + .../COLLADA_DOM/src/dae/daeErrorHandler.cpp | 43 + .../Extras/COLLADA_DOM/src/dae/daeIDRef.cpp | 276 + .../COLLADA_DOM/src/dae/daeMemorySystem.cpp | 34 + .../Extras/COLLADA_DOM/src/dae/daeMetaAny.cpp | 61 + .../COLLADA_DOM/src/dae/daeMetaAttribute.cpp | 174 + .../COLLADA_DOM/src/dae/daeMetaCMPolicy.cpp | 22 + .../COLLADA_DOM/src/dae/daeMetaChoice.cpp | 99 + .../COLLADA_DOM/src/dae/daeMetaElement.cpp | 522 + .../src/dae/daeMetaElementAttribute.cpp | 227 + .../COLLADA_DOM/src/dae/daeMetaGroup.cpp | 139 + .../COLLADA_DOM/src/dae/daeMetaSequence.cpp | 76 + .../COLLADA_DOM/src/dae/daeSIDResolver.cpp | 371 + .../COLLADA_DOM/src/dae/daeStringRef.cpp | 58 + .../COLLADA_DOM/src/dae/daeStringTable.cpp | 78 + .../Extras/COLLADA_DOM/src/dae/daeURI.cpp | 1282 + .../Extras/COLLADA_DOM/src/dae/dae_vc8.vcproj | 463 + .../Extras/COLLADA_DOM/src/dae/domAny.cpp | 113 + .../LIBXMLPlugin/LIBXMLPlugin_vc8.vcproj | 311 + .../modules/LIBXMLPlugin/daeLIBXMLPlugin.cpp | 920 + .../LIBXMLPlugin/daeLIBXMLResolver.cpp | 138 + .../STLDatabase/STLDatabase_vc8.vcproj | 298 + .../modules/STLDatabase/daeSTLDatabase.cpp | 619 + .../src/modules/stdErrPlugin/stdErrPlugin.cpp | 33 + .../stdErrPlugin/stdErrPlugin_vc8.vcproj | 299 + .../Extras/CSharpWrapper/AssemblyInfo.cpp | 42 + .../Extras/CSharpWrapper/BulletPhysics.sln | 198 + .../Extras/CSharpWrapper/BulletPhysics.vcproj | 209 + .../CSharpWrapper/BulletPhysicsapp.csproj | 78 + .../Extras/CSharpWrapper/BulletWrapper.cpp | 21 + .../Extras/CSharpWrapper/BulletWrapper.h | 422 + .../Extras/CSharpWrapper/Program.cs | 52 + .../CSharpWrapper/Properties/AssemblyInfo.cs | 33 + .../Properties/Resources.Designer.cs | 63 + .../CSharpWrapper/Properties/Resources.resx | 117 + .../Properties/Settings.Designer.cs | 26 + .../Properties/Settings.settings | 7 + .../bulletTrunk/Extras/CUDA/README.txt | 13 + .../Extras/CUDA/bt3DGridBroadphase.cpp | 604 + .../Extras/CUDA/bt3DGridBroadphaseFunc.h | 444 + .../Extras/CUDA/btCudaBroadphase.cpp | 201 + .../Extras/CUDA/btCudaBroadphase.cu | 173 + .../Extras/CUDA/btCudaBroadphase.h | 152 + .../Extras/CUDA/btCudaBroadphaseKernel.h | 105 + .../bulletTrunk/Extras/CUDA/cutil_gl_error.h | 86 + .../bulletTrunk/Extras/CUDA/cutil_math.h | 767 + .../Extras/CUDA/libbulletcuda.vcproj | 601 + .../bulletTrunk/Extras/CUDA/param.cpp | 3 + BulletPhysics/bulletTrunk/Extras/CUDA/param.h | 226 + .../bulletTrunk/Extras/CUDA/paramgl.cpp | 209 + .../bulletTrunk/Extras/CUDA/paramgl.h | 54 + .../Extras/CUDA/particleSystem.cpp | 806 + .../bulletTrunk/Extras/CUDA/particleSystem.cu | 336 + .../Extras/CUDA/particleSystem.cuh | 57 + .../bulletTrunk/Extras/CUDA/particleSystem.h | 193 + .../bulletTrunk/Extras/CUDA/particles.cpp | 571 + .../bulletTrunk/Extras/CUDA/particles.sln | 228 + .../bulletTrunk/Extras/CUDA/particles.vcproj | 880 + .../Extras/CUDA/particles_kernel.cu | 381 + .../Extras/CUDA/particles_kernel.cuh | 46 + .../bulletTrunk/Extras/CUDA/radixsort.cu | 79 + .../bulletTrunk/Extras/CUDA/radixsort.cuh | 63 + .../Extras/CUDA/radixsort_kernel.cu | 577 + .../Extras/CUDA/render_particles.cpp | 260 + .../Extras/CUDA/render_particles.h | 82 + .../bulletTrunk/Extras/CUDA/shaders.cpp | 41 + .../bulletTrunk/Extras/CUDA/shaders.h | 2 + .../Extras/ConvexDecomposition/CMakeLists.txt | 15 + .../ConvexDecomposition/ConvexBuilder.cpp | 373 + .../ConvexDecomposition/ConvexBuilder.h | 112 + .../ConvexDecomposition.cpp | 375 + .../ConvexDecomposition/ConvexDecomposition.h | 220 + .../Extras/ConvexDecomposition/Jamfile | 15 + .../Extras/ConvexDecomposition/bestfit.cpp | 466 + .../Extras/ConvexDecomposition/bestfit.h | 65 + .../Extras/ConvexDecomposition/bestfitobb.cpp | 173 + .../Extras/ConvexDecomposition/bestfitobb.h | 43 + .../Extras/ConvexDecomposition/cd_hull.cpp | 3257 + .../Extras/ConvexDecomposition/cd_hull.h | 153 + .../Extras/ConvexDecomposition/cd_vector.h | 1185 + .../ConvexDecomposition/cd_wavefront.cpp | 860 + .../Extras/ConvexDecomposition/cd_wavefront.h | 62 + .../Extras/ConvexDecomposition/concavity.cpp | 795 + .../Extras/ConvexDecomposition/concavity.h | 60 + .../Extras/ConvexDecomposition/fitsphere.cpp | 202 + .../Extras/ConvexDecomposition/fitsphere.h | 43 + .../Extras/ConvexDecomposition/float_math.cpp | 257 + .../Extras/ConvexDecomposition/float_math.h | 72 + .../Extras/ConvexDecomposition/meshvolume.cpp | 128 + .../Extras/ConvexDecomposition/meshvolume.h | 45 + .../Extras/ConvexDecomposition/planetri.cpp | 238 + .../Extras/ConvexDecomposition/planetri.h | 58 + .../Extras/ConvexDecomposition/raytri.cpp | 134 + .../Extras/ConvexDecomposition/raytri.h | 45 + .../Extras/ConvexDecomposition/splitplane.cpp | 306 + .../Extras/ConvexDecomposition/splitplane.h | 59 + .../Extras/ConvexDecomposition/vlookup.cpp | 307 + .../Extras/ConvexDecomposition/vlookup.h | 119 + BulletPhysics/bulletTrunk/Extras/EPA/Epa.cpp | 569 + BulletPhysics/bulletTrunk/Extras/EPA/Epa.h | 68 + .../bulletTrunk/Extras/EPA/EpaCommon.h | 30 + .../bulletTrunk/Extras/EPA/EpaFace.cpp | 254 + .../bulletTrunk/Extras/EPA/EpaFace.h | 83 + .../bulletTrunk/Extras/EPA/EpaHalfEdge.h | 58 + .../Extras/EPA/EpaPenetrationDepthSolver.cpp | 202 + .../Extras/EPA/EpaPenetrationDepthSolver.h | 56 + .../bulletTrunk/Extras/EPA/EpaPolyhedron.cpp | 1026 + .../bulletTrunk/Extras/EPA/EpaPolyhedron.h | 89 + .../bulletTrunk/Extras/EPA/EpaVertex.h | 61 + BulletPhysics/bulletTrunk/Extras/EPA/Jamfile | 10 + .../ExtraSolid35/CombinedSimplexSolver.cpp | 227 + .../ExtraSolid35/CombinedSimplexSolver.h | 62 + .../ExtraSolid35/ExtraSolid35_vc7.vcproj | 137 + .../ExtraSolid35/ExtraSolid35_vc8.vcproj | 195 + .../bulletTrunk/Extras/ExtraSolid35/Jamfile | 10 + .../Extras/ExtraSolid35/LICENSE_QPL.txt | 110 + .../Extras/ExtraSolid35/ReadMe.txt | 21 + .../Extras/ExtraSolid35/Solid35.vcproj | 129 + .../Solid3EpaPenetrationDepth.cpp | 589 + .../ExtraSolid35/Solid3EpaPenetrationDepth.h | 44 + .../Solid3JohnsonSimplexSolver.cpp | 450 + .../ExtraSolid35/Solid3JohnsonSimplexSolver.h | 105 + .../Extras/GIMPACTUtils/CMakeLists.txt | 14 + .../bulletTrunk/Extras/GIMPACTUtils/Jamfile | 11 + .../btGImpactConvexDecompositionShape.cpp | 240 + .../btGImpactConvexDecompositionShape.h | 87 + BulletPhysics/bulletTrunk/Extras/Jamfile | 15 + .../bulletTrunk/Extras/LibXML/AUTHORS | 5 + .../bulletTrunk/Extras/LibXML/CMakeLists.txt | 57 + .../bulletTrunk/Extras/LibXML/COPYING | 27 + .../bulletTrunk/Extras/LibXML/ChangeLog | 17734 ++++ .../Extras/LibXML/Compatibility.txt | 2 + .../bulletTrunk/Extras/LibXML/Copyright | 27 + .../bulletTrunk/Extras/LibXML/DOCBparser.c | 305 + .../bulletTrunk/Extras/LibXML/HTMLparser.c | 6247 ++ .../bulletTrunk/Extras/LibXML/HTMLtree.c | 1213 + .../bulletTrunk/Extras/LibXML/INSTALL | 61 + .../bulletTrunk/Extras/LibXML/Jamfile | 18 + .../bulletTrunk/Extras/LibXML/Makefile.am | 1184 + .../bulletTrunk/Extras/LibXML/Makefile.in | 2420 + .../Extras/LibXML/Makefile.original | 375 + .../bulletTrunk/Extras/LibXML/Makefile.tests | 35 + BulletPhysics/bulletTrunk/Extras/LibXML/NEWS | 1610 + .../bulletTrunk/Extras/LibXML/README | 39 + .../bulletTrunk/Extras/LibXML/README.tests | 29 + BulletPhysics/bulletTrunk/Extras/LibXML/SAX.c | 180 + .../bulletTrunk/Extras/LibXML/SAX2.c | 2890 + BulletPhysics/bulletTrunk/Extras/LibXML/TODO | 278 + .../bulletTrunk/Extras/LibXML/TODO_SCHEMAS | 31 + .../bulletTrunk/Extras/LibXML/acconfig.h | 16 + .../bulletTrunk/Extras/LibXML/acinclude.m4 | 28 + .../bulletTrunk/Extras/LibXML/aclocal.m4 | 7282 ++ .../Extras/LibXML/autom4te.cache/output.0 | 30542 ++++++ .../Extras/LibXML/autom4te.cache/requests | 116 + .../Extras/LibXML/autom4te.cache/traces.0 | 1025 + .../bulletTrunk/Extras/LibXML/c14n.c | 1928 + .../bulletTrunk/Extras/LibXML/catalog.c | 3788 + .../Extras/LibXML/check-relaxng-test-suite.py | 394 + .../LibXML/check-relaxng-test-suite2.py | 418 + .../LibXML/check-xinclude-test-suite.py | 221 + .../Extras/LibXML/check-xml-test-suite.py | 409 + .../Extras/LibXML/check-xsddata-test-suite.py | 420 + .../bulletTrunk/Extras/LibXML/chvalid.c | 336 + .../bulletTrunk/Extras/LibXML/config-ps3.h | 286 + .../bulletTrunk/Extras/LibXML/config-win32.h | 116 + .../bulletTrunk/Extras/LibXML/config.guess | 1411 + .../bulletTrunk/Extras/LibXML/config.h | 296 + .../bulletTrunk/Extras/LibXML/config.h.in | 295 + .../bulletTrunk/Extras/LibXML/config.log | 3300 + .../bulletTrunk/Extras/LibXML/config.status | 1470 + .../bulletTrunk/Extras/LibXML/config.sub | 1500 + .../bulletTrunk/Extras/LibXML/config2.h | 296 + .../bulletTrunk/Extras/LibXML/configure | 30542 ++++++ .../bulletTrunk/Extras/LibXML/configure.in | 1369 + .../bulletTrunk/Extras/LibXML/dbgen.pl | 43 + .../bulletTrunk/Extras/LibXML/dbgenattr.pl | 42 + .../bulletTrunk/Extras/LibXML/debugXML.c | 3264 + .../bulletTrunk/Extras/LibXML/depcomp | 530 + .../bulletTrunk/Extras/LibXML/dict.c | 901 + .../bulletTrunk/Extras/LibXML/doc/Makefile | 759 + .../bulletTrunk/Extras/LibXML/doc/Makefile.am | 123 + .../bulletTrunk/Extras/LibXML/doc/Makefile.in | 759 + .../Extras/LibXML/doc/devhelp/Makefile | 495 + .../Extras/LibXML/doc/devhelp/Makefile.am | 73 + .../Extras/LibXML/doc/devhelp/Makefile.in | 495 + .../Extras/LibXML/doc/examples/Makefile | 134 + .../Extras/LibXML/doc/examples/Makefile.am | 134 + .../Extras/LibXML/doc/examples/Makefile.in | 134 + .../bulletTrunk/Extras/LibXML/elfgcchack.h | 17426 ++++ .../bulletTrunk/Extras/LibXML/encoding.c | 3289 + .../bulletTrunk/Extras/LibXML/entities.c | 965 + .../bulletTrunk/Extras/LibXML/error.c | 986 + .../Extras/LibXML/example/.deps/gjobread.Po | 1 + .../Extras/LibXML/example/Makefile | 539 + .../Extras/LibXML/example/Makefile.am | 10 + .../Extras/LibXML/example/Makefile.in | 539 + .../bulletTrunk/Extras/LibXML/genUnicode.py | 478 + .../bulletTrunk/Extras/LibXML/gentest.py | 956 + .../bulletTrunk/Extras/LibXML/globals.c | 1094 + .../bulletTrunk/Extras/LibXML/hash.c | 1079 + .../Extras/LibXML/include/Makefile | 582 + .../Extras/LibXML/include/Makefile.in | 582 + .../Extras/LibXML/include/libxml/DOCBparser.h | 96 + .../Extras/LibXML/include/libxml/HTMLparser.h | 300 + .../Extras/LibXML/include/libxml/HTMLtree.h | 147 + .../Extras/LibXML/include/libxml/Makefile | 559 + .../Extras/LibXML/include/libxml/Makefile.am | 57 + .../Extras/LibXML/include/libxml/Makefile.in | 559 + .../Extras/LibXML/include/libxml/SAX.h | 173 + .../Extras/LibXML/include/libxml/SAX2.h | 176 + .../Extras/LibXML/include/libxml/c14n.h | 105 + .../Extras/LibXML/include/libxml/catalog.h | 182 + .../Extras/LibXML/include/libxml/chvalid.h | 230 + .../Extras/LibXML/include/libxml/debugXML.h | 217 + .../Extras/LibXML/include/libxml/dict.h | 69 + .../Extras/LibXML/include/libxml/encoding.h | 226 + .../Extras/LibXML/include/libxml/entities.h | 139 + .../Extras/LibXML/include/libxml/globals.h | 455 + .../Extras/LibXML/include/libxml/hash.h | 233 + .../Extras/LibXML/include/libxml/list.h | 137 + .../Extras/LibXML/include/libxml/nanoftp.h | 143 + .../Extras/LibXML/include/libxml/nanohttp.h | 81 + .../Extras/LibXML/include/libxml/parser.h | 1217 + .../LibXML/include/libxml/parserInternals.h | 602 + .../Extras/LibXML/include/libxml/pattern.h | 100 + .../Extras/LibXML/include/libxml/relaxng.h | 196 + .../LibXML/include/libxml/schemasInternals.h | 958 + .../Extras/LibXML/include/libxml/schematron.h | 124 + .../Extras/LibXML/include/libxml/threads.h | 80 + .../Extras/LibXML/include/libxml/tree.h | 1161 + .../Extras/LibXML/include/libxml/uri.h | 87 + .../Extras/LibXML/include/libxml/valid.h | 458 + .../Extras/LibXML/include/libxml/xinclude.h | 121 + .../Extras/LibXML/include/libxml/xlink.h | 189 + .../Extras/LibXML/include/libxml/xmlIO.h | 360 + .../LibXML/include/libxml/xmlautomata.h | 146 + .../Extras/LibXML/include/libxml/xmlerror.h | 936 + .../Extras/LibXML/include/libxml/xmlexports.h | 157 + .../Extras/LibXML/include/libxml/xmlmemory.h | 222 + .../Extras/LibXML/include/libxml/xmlmodule.h | 57 + .../Extras/LibXML/include/libxml/xmlreader.h | 408 + .../Extras/LibXML/include/libxml/xmlregexp.h | 216 + .../Extras/LibXML/include/libxml/xmlsave.h | 84 + .../Extras/LibXML/include/libxml/xmlschemas.h | 198 + .../LibXML/include/libxml/xmlschemastypes.h | 151 + .../Extras/LibXML/include/libxml/xmlstring.h | 140 + .../Extras/LibXML/include/libxml/xmlunicode.h | 202 + .../Extras/LibXML/include/libxml/xmlversion.h | 396 + .../LibXML/include/libxml/xmlversion.h.in | 396 + .../Extras/LibXML/include/libxml/xmlwriter.h | 459 + .../Extras/LibXML/include/libxml/xpath.h | 539 + .../LibXML/include/libxml/xpathInternals.h | 630 + .../Extras/LibXML/include/libxml/xpointer.h | 114 + .../Extras/LibXML/include/win32config.h | 113 + .../Extras/LibXML/include/wsockcompat.h | 81 + .../bulletTrunk/Extras/LibXML/install-sh | 250 + .../bulletTrunk/Extras/LibXML/legacy.c | 1343 + .../bulletTrunk/Extras/LibXML/libtool | 7828 ++ .../Extras/LibXML/libxml-2.0-uninstalled.pc | 12 + .../LibXML/libxml-2.0-uninstalled.pc.in | 12 + .../bulletTrunk/Extras/LibXML/libxml-2.0.pc | 12 + .../Extras/LibXML/libxml-2.0.pc.in | 12 + .../bulletTrunk/Extras/LibXML/libxml.3 | 71 + .../bulletTrunk/Extras/LibXML/libxml.h | 101 + .../bulletTrunk/Extras/LibXML/libxml.m4 | 188 + .../bulletTrunk/Extras/LibXML/libxml.spec.in | 133 + .../bulletTrunk/Extras/LibXML/libxml2.spec | 133 + .../bulletTrunk/Extras/LibXML/list.c | 779 + .../bulletTrunk/Extras/LibXML/ltmain.sh | 6863 ++ .../bulletTrunk/Extras/LibXML/missing | 336 + .../bulletTrunk/Extras/LibXML/mkinstalldirs | 99 + .../bulletTrunk/Extras/LibXML/nanoftp.c | 2109 + .../bulletTrunk/Extras/LibXML/nanohttp.c | 1791 + .../bulletTrunk/Extras/LibXML/parser.c | 13509 +++ .../Extras/LibXML/parserInternals.c | 2060 + .../bulletTrunk/Extras/LibXML/pattern.c | 2607 + .../Extras/LibXML/python/.deps/libxml.Plo | 1 + .../Extras/LibXML/python/.deps/libxml2-py.Plo | 1 + .../Extras/LibXML/python/.deps/types.Plo | 1 + .../bulletTrunk/Extras/LibXML/python/Makefile | 752 + .../Extras/LibXML/python/Makefile.am | 75 + .../Extras/LibXML/python/Makefile.in | 752 + .../bulletTrunk/Extras/LibXML/python/setup.py | 242 + .../Extras/LibXML/python/setup.py.in | 242 + .../Extras/LibXML/python/tests/Makefile | 494 + .../Extras/LibXML/python/tests/Makefile.am | 78 + .../Extras/LibXML/python/tests/Makefile.in | 494 + .../bulletTrunk/Extras/LibXML/regressions.py | 350 + .../bulletTrunk/Extras/LibXML/regressions.xml | 226 + .../bulletTrunk/Extras/LibXML/relaxng.c | 10813 ++ .../bulletTrunk/Extras/LibXML/schematron.c | 1734 + .../bulletTrunk/Extras/LibXML/stamp-h1 | 1 + .../bulletTrunk/Extras/LibXML/threads.c | 865 + .../bulletTrunk/Extras/LibXML/tree.c | 9415 ++ .../bulletTrunk/Extras/LibXML/trio.c | 6870 ++ .../bulletTrunk/Extras/LibXML/trio.h | 216 + .../bulletTrunk/Extras/LibXML/triodef.h | 222 + .../bulletTrunk/Extras/LibXML/trionan.c | 915 + .../bulletTrunk/Extras/LibXML/trionan.h | 84 + .../bulletTrunk/Extras/LibXML/triop.h | 150 + .../bulletTrunk/Extras/LibXML/triostr.c | 2110 + .../bulletTrunk/Extras/LibXML/triostr.h | 140 + BulletPhysics/bulletTrunk/Extras/LibXML/uri.c | 2441 + .../bulletTrunk/Extras/LibXML/valid.c | 6945 ++ .../bulletTrunk/Extras/LibXML/xinclude.c | 2529 + .../bulletTrunk/Extras/LibXML/xlink.c | 183 + .../bulletTrunk/Extras/LibXML/xml2-config | 106 + .../bulletTrunk/Extras/LibXML/xml2-config.1 | 31 + .../bulletTrunk/Extras/LibXML/xml2-config.in | 106 + .../bulletTrunk/Extras/LibXML/xml2Conf.sh.in | 8 + .../bulletTrunk/Extras/LibXML/xmlIO.c | 3826 + .../bulletTrunk/Extras/LibXML/xmlmemory.c | 1042 + .../bulletTrunk/Extras/LibXML/xmlmodule.c | 447 + .../bulletTrunk/Extras/LibXML/xmlreader.c | 5659 ++ .../bulletTrunk/Extras/LibXML/xmlregexp.c | 7954 ++ .../bulletTrunk/Extras/LibXML/xmlsave.c | 2336 + .../bulletTrunk/Extras/LibXML/xmlschemas.c | 28407 ++++++ .../Extras/LibXML/xmlschemastypes.c | 6101 ++ .../bulletTrunk/Extras/LibXML/xmlstring.c | 984 + .../bulletTrunk/Extras/LibXML/xmlunicode.c | 3179 + .../bulletTrunk/Extras/LibXML/xmlwriter.c | 4605 + .../bulletTrunk/Extras/LibXML/xpath.c | 14568 +++ .../bulletTrunk/Extras/LibXML/xpointer.c | 3003 + .../bulletTrunk/Extras/LibXML/xstc/Makefile | 551 + .../Extras/LibXML/xstc/Makefile.am | 131 + .../Extras/LibXML/xstc/Makefile.in | 551 + BulletPhysics/bulletTrunk/Extras/Makefile.am | 546 + .../Extras/MayaPlugin/BulletDynamica.6_module | 1 + .../Extras/MayaPlugin/BulletMayaPlugin.sln | 70 + .../Extras/MayaPlugin/BulletMayaPlugin.vcproj | 968 + .../bulletTrunk/Extras/MayaPlugin/Jamfile | 20 + .../bulletTrunk/Extras/MayaPlugin/Makefile | 87 + .../Extras/MayaPlugin/Makefile.mac | 79 + .../bulletTrunk/Extras/MayaPlugin/README | 23 + .../bulletTrunk/Extras/MayaPlugin/box_shape.h | 44 + .../Extras/MayaPlugin/box_shape_impl.h | 39 + .../Extras/MayaPlugin/bt_box_shape.h | 96 + .../Extras/MayaPlugin/bt_collision_shape.h | 51 + .../Extras/MayaPlugin/bt_constraint.h | 52 + .../Extras/MayaPlugin/bt_convex_hull_shape.h | 152 + .../Extras/MayaPlugin/bt_mesh_shape.h | 168 + .../Extras/MayaPlugin/bt_nail_constraint.h | 82 + .../Extras/MayaPlugin/bt_plane_shape.h | 84 + .../Extras/MayaPlugin/bt_rigid_body.h | 186 + .../Extras/MayaPlugin/bt_solver.cpp | 66 + .../bulletTrunk/Extras/MayaPlugin/bt_solver.h | 137 + .../Extras/MayaPlugin/bt_sphere_shape.h | 107 + .../bulletTrunk/Extras/MayaPlugin/bullet.nsi | 78 + .../Extras/MayaPlugin/colladaExport.cpp | 148 + .../Extras/MayaPlugin/colladaExport.h | 89 + .../Extras/MayaPlugin/collisionShapeNode.cpp | 324 + .../Extras/MayaPlugin/collisionShapeNode.h | 80 + .../Extras/MayaPlugin/collision_shape.h | 68 + .../Extras/MayaPlugin/collision_shape_impl.h | 49 + .../Extras/MayaPlugin/constraint.h | 52 + .../Extras/MayaPlugin/constraint_impl.h | 37 + .../Extras/MayaPlugin/convex_hull_shape.h | 44 + .../MayaPlugin/convex_hull_shape_impl.h | 39 + .../Extras/MayaPlugin/dNailConstraintCmd.cpp | 133 + .../Extras/MayaPlugin/dNailConstraintCmd.h | 58 + .../Extras/MayaPlugin/dRigidBodyArrayCmd.cpp | 147 + .../Extras/MayaPlugin/dRigidBodyArrayCmd.h | 58 + .../Extras/MayaPlugin/dRigidBodyCmd.cpp | 147 + .../Extras/MayaPlugin/dRigidBodyCmd.h | 58 + .../Extras/MayaPlugin/dSolverCmd.cpp | 131 + .../Extras/MayaPlugin/dSolverCmd.h | 56 + .../Extras/MayaPlugin/dSolverNode.cpp | 833 + .../Extras/MayaPlugin/dSolverNode.h | 92 + .../Extras/MayaPlugin/doc/index.html | 123 + .../Extras/MayaPlugin/drawUtils.cpp | 171 + .../bulletTrunk/Extras/MayaPlugin/drawUtils.h | 33 + .../Extras/MayaPlugin/icons/dynamica.xpm | 511 + .../icons/dynamicaCreateActiveBoxRB.xpm | 114 + .../icons/dynamicaCreateActiveBoxRBArray.xpm | 100 + .../icons/dynamicaCreateActiveHullRB.xpm | 273 + .../icons/dynamicaCreateActiveHullRBArray.xpm | 145 + .../icons/dynamicaCreateActiveMeshRB.xpm | 247 + .../icons/dynamicaCreateActiveMeshRBArray.xpm | 174 + .../icons/dynamicaCreateActivePlaneRB.xpm | 55 + .../dynamicaCreateActivePlaneRBArray.xpm | 66 + .../icons/dynamicaCreateActiveRB.xpm | 37 + .../icons/dynamicaCreateActiveSphereRB.xpm | 229 + .../dynamicaCreateActiveSphereRBArray.xpm | 134 + .../icons/dynamicaCreateNailConstraint.xpm | 213 + .../icons/dynamicaCreatePassiveBoxRB.xpm | 112 + .../icons/dynamicaCreatePassiveBoxRBArray.xpm | 100 + .../icons/dynamicaCreatePassiveHullRB.xpm | 159 + .../dynamicaCreatePassiveHullRBArray.xpm | 125 + .../icons/dynamicaCreatePassiveMeshRB.xpm | 152 + .../dynamicaCreatePassiveMeshRBArray.xpm | 128 + .../icons/dynamicaCreatePassivePlaneRB.xpm | 108 + .../dynamicaCreatePassivePlaneRBArray.xpm | 117 + .../icons/dynamicaCreatePassiveRB.xpm | 37 + .../icons/dynamicaCreatePassiveSphereRB.xpm | 177 + .../dynamicaCreatePassiveSphereRBArray.xpm | 122 + .../bulletTrunk/Extras/MayaPlugin/install.bat | 4 + .../bulletTrunk/Extras/MayaPlugin/mathUtils.h | 184 + .../bulletTrunk/Extras/MayaPlugin/mayaUtils.h | 38 + .../Extras/MayaPlugin/mesh_shape.h | 44 + .../Extras/MayaPlugin/mesh_shape_impl.h | 39 + .../bulletTrunk/Extras/MayaPlugin/mvl/base.h | 35 + .../bulletTrunk/Extras/MayaPlugin/mvl/mat.h | 399 + .../bulletTrunk/Extras/MayaPlugin/mvl/quat.h | 279 + .../Extras/MayaPlugin/mvl/traits.h | 85 + .../bulletTrunk/Extras/MayaPlugin/mvl/util.h | 61 + .../bulletTrunk/Extras/MayaPlugin/mvl/vec.h | 347 + .../Extras/MayaPlugin/nailConstraintNode.cpp | 324 + .../Extras/MayaPlugin/nailConstraintNode.h | 94 + .../Extras/MayaPlugin/nail_constraint.h | 91 + .../Extras/MayaPlugin/nail_constraint_impl.h | 46 + .../bulletTrunk/Extras/MayaPlugin/pdbIO.cpp | 308 + .../bulletTrunk/Extras/MayaPlugin/pdbIO.h | 76 + .../Extras/MayaPlugin/plane_shape.h | 44 + .../Extras/MayaPlugin/plane_shape_impl.h | 39 + .../Extras/MayaPlugin/pluginMain.cpp | 174 + .../Extras/MayaPlugin/rigidBodyArrayNode.cpp | 540 + .../Extras/MayaPlugin/rigidBodyArrayNode.h | 119 + .../Extras/MayaPlugin/rigidBodyNode.cpp | 542 + .../Extras/MayaPlugin/rigidBodyNode.h | 107 + .../Extras/MayaPlugin/rigid_body.h | 89 + .../Extras/MayaPlugin/rigid_body_impl.h | 62 + .../Extras/MayaPlugin/scenes/donuts.ma | 313 + .../Extras/MayaPlugin/scenes/field1.ma | 345 + .../Extras/MayaPlugin/scenes/field2.ma | 404 + .../Extras/MayaPlugin/scenes/onepeanut.ma | 159 + .../Extras/MayaPlugin/scenes/peanutBox.ma | 719 + .../Extras/MayaPlugin/scenes/peanutFunnel.ma | 616 + .../scripts/AEdCollisionShapeTemplate.mel | 41 + .../scripts/AEdNailConstraintTemplate.mel | 39 + .../scripts/AEdRigidBodyArrayTemplate.mel | 89 + .../scripts/AEdRigidBodyTemplate.mel | 102 + .../MayaPlugin/scripts/AEdSolverTemplate.mel | 50 + .../Extras/MayaPlugin/scripts/dynamica.mel | 23 + .../Extras/MayaPlugin/scripts/dynamicaUI.mel | 709 + .../Extras/MayaPlugin/shared_ptr.h | 199 + .../bulletTrunk/Extras/MayaPlugin/solver.cpp | 166 + .../bulletTrunk/Extras/MayaPlugin/solver.h | 99 + .../Extras/MayaPlugin/solver_impl.h | 76 + .../Extras/MayaPlugin/sphere_shape.h | 45 + .../Extras/MayaPlugin/sphere_shape_impl.h | 38 + .../bulletTrunk/Extras/freeglut/COPYING | 27 + .../bulletTrunk/Extras/freeglut/GL/freeglut.h | 22 + .../Extras/freeglut/GL/freeglut_ext.h | 135 + .../Extras/freeglut/GL/freeglut_std.h | 578 + .../bulletTrunk/Extras/freeglut/GL/glut.h | 21 + .../Extras/freeglut/freeglut_callbacks.c | 361 + .../Extras/freeglut/freeglut_cursor.c | 262 + .../Extras/freeglut/freeglut_display.c | 94 + .../Extras/freeglut/freeglut_ext.c | 205 + .../Extras/freeglut/freeglut_font.c | 380 + .../Extras/freeglut/freeglut_font_data.c | 2020 + .../Extras/freeglut/freeglut_gamemode.c | 597 + .../Extras/freeglut/freeglut_geometry.c | 1153 + .../freeglut/freeglut_glutfont_definitions.c | 77 + .../Extras/freeglut/freeglut_init.c | 892 + .../Extras/freeglut/freeglut_internal.h | 846 + .../Extras/freeglut/freeglut_joystick.c | 1779 + .../Extras/freeglut/freeglut_main.c | 1823 + .../Extras/freeglut/freeglut_menu.c | 985 + .../Extras/freeglut/freeglut_misc.c | 171 + .../Extras/freeglut/freeglut_overlay.c | 45 + .../Extras/freeglut/freeglut_state.c | 664 + .../freeglut/freeglut_stroke_mono_roman.c | 2848 + .../Extras/freeglut/freeglut_stroke_roman.c | 2848 + .../Extras/freeglut/freeglut_structure.c | 590 + .../Extras/freeglut/freeglut_teapot.c | 200 + .../Extras/freeglut/freeglut_teapot_data.h | 2429 + .../Extras/freeglut/freeglut_videoresize.c | 50 + .../Extras/freeglut/freeglut_window.c | 1115 + .../bulletTrunk/Extras/glui/CMakeLists.txt | 66 + .../bulletTrunk/Extras/glui/GL/glui.h | 2719 + BulletPhysics/bulletTrunk/Extras/glui/Jamfile | 18 + .../bulletTrunk/Extras/glui/algebra3.cpp | 1609 + .../bulletTrunk/Extras/glui/algebra3.h | 475 + .../bulletTrunk/Extras/glui/arcball.cpp | 237 + .../bulletTrunk/Extras/glui/arcball.h | 97 + .../bulletTrunk/Extras/glui/glui.cpp | 2171 + .../Extras/glui/glui_add_controls.cpp | 319 + .../Extras/glui/glui_bitmap_img_data.cpp | 138 + .../bulletTrunk/Extras/glui/glui_bitmaps.cpp | 176 + .../bulletTrunk/Extras/glui/glui_button.cpp | 186 + .../bulletTrunk/Extras/glui/glui_checkbox.cpp | 188 + .../bulletTrunk/Extras/glui/glui_column.cpp | 89 + .../Extras/glui/glui_commandline.cpp | 197 + .../bulletTrunk/Extras/glui/glui_control.cpp | 1203 + .../bulletTrunk/Extras/glui/glui_edittext.cpp | 1198 + .../Extras/glui/glui_filebrowser.cpp | 165 + .../bulletTrunk/Extras/glui/glui_internal.h | 107 + .../Extras/glui/glui_internal_control.h | 45 + .../bulletTrunk/Extras/glui/glui_list.cpp | 542 + .../bulletTrunk/Extras/glui/glui_listbox.cpp | 448 + .../Extras/glui/glui_mouse_iaction.cpp | 210 + .../bulletTrunk/Extras/glui/glui_node.cpp | 212 + .../bulletTrunk/Extras/glui/glui_panel.cpp | 186 + .../bulletTrunk/Extras/glui/glui_radio.cpp | 362 + .../bulletTrunk/Extras/glui/glui_rollout.cpp | 275 + .../bulletTrunk/Extras/glui/glui_rotation.cpp | 473 + .../Extras/glui/glui_scrollbar.cpp | 832 + .../Extras/glui/glui_separator.cpp | 75 + .../bulletTrunk/Extras/glui/glui_spinner.cpp | 630 + .../Extras/glui/glui_statictext.cpp | 105 + .../bulletTrunk/Extras/glui/glui_string.cpp | 62 + .../bulletTrunk/Extras/glui/glui_textbox.cpp | 1108 + .../Extras/glui/glui_translation.cpp | 559 + .../bulletTrunk/Extras/glui/glui_tree.cpp | 278 + .../Extras/glui/glui_treepanel.cpp | 388 + .../bulletTrunk/Extras/glui/glui_window.cpp | 44 + .../bulletTrunk/Extras/glui/quaternion.cpp | 243 + .../bulletTrunk/Extras/glui/quaternion.h | 114 + .../bulletTrunk/Extras/glui/readme.txt | 228 + .../bulletTrunk/Extras/iff/CMakeLists.txt | 11 + BulletPhysics/bulletTrunk/Extras/iff/IFF.txt | 1423 + BulletPhysics/bulletTrunk/Extras/iff/Jamfile | 32 + BulletPhysics/bulletTrunk/Extras/iff/iff.h | 460 + .../bulletTrunk/Extras/iff/iffCheck/Jamfile | 3 + .../Extras/iff/iffCheck/iffcheck.cpp | 233 + .../Extras/iff/iffCreateTest/main.cpp | 236 + BulletPhysics/bulletTrunk/Extras/iff/iffr.cpp | 370 + BulletPhysics/bulletTrunk/Extras/iff/iffw.cpp | 243 + .../Extras/khx2dae/Bullet_dae_screenshot.jpg | Bin 0 -> 18301 bytes .../khx2dae/Havok5.5toColladaPhysics.dae | 480 + .../Extras/khx2dae/Havok_hkx_screenshot.jpg | Bin 0 -> 16013 bytes .../Extras/khx2dae/SimpleLoadDemo.patch | 428 + .../bulletTrunk/Extras/khx2dae/readme.txt | 6 + .../BU_AlgebraicPolynomialSolver.cpp | 360 + .../BU_AlgebraicPolynomialSolver.h | 45 + .../obsolete/AlgebraicCCD/BU_Collidable.cpp | 25 + .../obsolete/AlgebraicCCD/BU_Collidable.h | 57 + .../AlgebraicCCD/BU_CollisionPair.cpp | 581 + .../obsolete/AlgebraicCCD/BU_CollisionPair.h | 54 + .../obsolete/AlgebraicCCD/BU_EdgeEdge.cpp | 578 + .../obsolete/AlgebraicCCD/BU_EdgeEdge.h | 76 + .../AlgebraicCCD/BU_MotionStateInterface.h | 50 + .../BU_PolynomialSolverInterface.h | 39 + .../obsolete/AlgebraicCCD/BU_Screwing.cpp | 200 + .../obsolete/AlgebraicCCD/BU_Screwing.h | 77 + .../AlgebraicCCD/BU_StaticMotionState.h | 91 + .../obsolete/AlgebraicCCD/BU_VertexPoly.cpp | 159 + .../obsolete/AlgebraicCCD/BU_VertexPoly.h | 43 + .../Extras/obsolete/BulletX/Keys/BulletX.snk | Bin 0 -> 160 bytes .../obsolete/BulletX/Keys/BulletXDemos.snk | Bin 0 -> 160 bytes .../Extras/obsolete/BulletX/Keys/Demos.snk | Bin 0 -> 160 bytes .../BulletX/Source/SharedContent/Models/box.x | 228 + .../Source/SharedContent/Models/cylinder.x | 786 + .../Source/SharedContent/Models/sphere.x | 936 + .../Source/SharedContent/bullet_ico.ico | Bin 0 -> 21630 bytes .../XnaDevRu.BulletX.Demos.Basic/BasicDemo.cs | 71 + .../XnaDevRu.BulletX.Demos.Basic/Program.cs | 40 + .../Properties/AssemblyInfo.cs | 33 + .../XnaDevRu.BulletX.Demos.Basic.csproj | 97 + .../XnaDevRu.BulletX.Demos.Ccd/CcdDemo.cs | 108 + .../XnaDevRu.BulletX.Demos.Ccd/Program.cs | 40 + .../Properties/AssemblyInfo.cs | 33 + .../XnaDevRu.BulletX.Demos.Ccd.csproj | 93 + .../ConstraintDemo.cs | 121 + .../Program.cs | 40 + .../Properties/AssemblyInfo.cs | 33 + .../XnaDevRu.BulletX.Demos.Constraints.csproj | 93 + .../XnaDevRu.BulletX.Demos/BulletXDemos.snk | Bin 0 -> 160 bytes .../Source/XnaDevRu.BulletX.Demos/DemoGame.cs | 589 + .../Properties/AssemblyInfo.cs | 31 + .../XnaDevRu.BulletX.Demos.csproj | 115 + .../Source/XnaDevRu.BulletX/BulletDebug.cs | 68 + .../Source/XnaDevRu.BulletX/BulletX.snk | Bin 0 -> 160 bytes .../BroadphaseCollision/AxisSweep3.cs | 623 + .../BroadphaseNativeTypes.cs | 68 + .../BroadphaseCollision/BroadphasePair.cs | 113 + .../BroadphaseCollision/BroadphaseProxy.cs | 91 + .../BroadphaseCollision/CollisionAlgorithm.cs | 51 + .../CollisionAlgorithmConstructionInfo.cs | 42 + .../BroadphaseCollision/DispatcherInfo.cs | 54 + .../BroadphaseCollision/IBroadphase.cs | 36 + .../BroadphaseCollision/IDispatcher.cs | 42 + .../BroadphaseCollision/IOverlapCallback.cs | 33 + .../OverlappingPairCache.cs | 159 + .../BroadphaseCollision/SimpleBroadphase.cs | 128 + .../SimpleBroadphaseProxy.cs | 46 + .../BridgeTriangleRaycastCallback.cs | 59 + .../CollisionAlgorithmCreateFunc.cs | 40 + .../CollisionDispatch/CollisionDispatcher.cs | 280 + .../CollisionDispatch/CollisionObject.cs | 163 + .../CollisionPairCallback.cs | 48 + .../CollisionDispatch/CollisionWorld.cs | 358 + .../CompoundCollisionAlgorithm.cs | 157 + .../ConvexConcaveCollisionAlgorithm.cs | 189 + .../ConvexConvexCollisionAlgorithm.cs | 193 + .../ConvexTriangleCallback.cs | 130 + .../CollisionDispatch/EmptyAlgorithm.cs | 52 + .../CollisionDispatch/ManifoldResult.cs | 147 + .../SimulationIslandManager.cs | 304 + .../SphereBoxCollisionAlgorithm.cs | 270 + .../SphereSphereCollisionAlgorithm.cs | 104 + .../SphereTriangleCollisionAlgorithm.cs | 100 + .../SphereTriangleDetector.cs | 214 + .../Collision/CollisionDispatch/UnionFind.cs | 151 + .../CollisionShapes/BUSimplex1to4.cs | 215 + .../Collision/CollisionShapes/BoxShape.cs | 316 + .../CollisionShapes/BvhTriangleMeshShape.cs | 83 + .../CollisionShapes/CollisionShape.cs | 148 + .../CollisionShapes/CompoundShape.cs | 183 + .../Collision/CollisionShapes/ConcaveShape.cs | 55 + .../Collision/CollisionShapes/ConeShape.cs | 208 + .../CollisionShapes/ConvexHullShape.cs | 184 + .../Collision/CollisionShapes/ConvexShape.cs | 141 + .../ConvexTriangleMeshShape.cs | 185 + .../CollisionShapes/CylinderShape.cs | 136 + .../CollisionShapes/CylinderShapeX.cs | 100 + .../CollisionShapes/CylinderShapeZ.cs | 100 + .../Collision/CollisionShapes/EmptyShape.cs | 80 + .../CollisionShapes/FilteredCallback.cs | 55 + .../InternalTriangleIndexCallback.cs | 33 + .../LocalSupportVertexCallback.cs | 58 + .../CollisionShapes/MinkowskiSumShape.cs | 99 + .../CollisionShapes/MultiSphereShape.cs | 154 + .../CollisionShapes/NodeOverlapCallback.cs | 32 + .../Collision/CollisionShapes/OptimizedBvh.cs | 293 + .../CollisionShapes/OptimizedBvhNode.cs | 63 + .../CollisionShapes/PolyhedralConvexShape.cs | 133 + .../Collision/CollisionShapes/SphereShape.cs | 116 + .../CollisionShapes/StaticPlaneShape.cs | 124 + .../CollisionShapes/StridingMeshInterface.cs | 115 + .../CollisionShapes/SupportVertexCallback.cs | 67 + .../CollisionShapes/TriangleBuffer.cs | 80 + .../CollisionShapes/TriangleCallback.cs | 33 + .../TriangleIndexVertexArray.cs | 136 + .../Collision/CollisionShapes/TriangleMesh.cs | 102 + .../CollisionShapes/TriangleMeshShape.cs | 160 + .../CollisionShapes/TriangleShape.cs | 187 + .../ContinuousConvexCollision.cs | 199 + .../NarrowPhaseCollision/ConvexCast.cs | 73 + .../DiscreteCollisionDetectorInterface.cs | 117 + .../NarrowPhaseCollision/GjkConvexCast.cs | 176 + .../Collision/NarrowPhaseCollision/GjkEpa.cs | 633 + .../GjkEpaPenetrationDepthSolver.cs | 56 + .../NarrowPhaseCollision/GjkEpaSolver.cs | 101 + .../NarrowPhaseCollision/GjkPairDetector.cs | 343 + .../IConvexPenetrationDepthSolver.cs | 42 + .../NarrowPhaseCollision/ISimplexSolver.cs | 48 + .../NarrowPhaseCollision/ManifoldPoint.cs | 78 + .../MinkowskiPenetrationDepthSolver.cs | 246 + .../PersistentManifold.cs | 272 + .../NarrowPhaseCollision/PointCollector.cs | 64 + .../SubsimplexConvexCast.cs | 142 + .../TriangleRaycastCallback.cs | 115 + .../VoronoiSimplexSolver.cs | 643 + .../ConstraintSolver/ContactConstraint.cs | 488 + .../ConstraintSolver/ContactSolverInfo.cs | 62 + .../ConstraintSolver/Generic6DofConstraint.cs | 440 + .../ConstraintSolver/HingeConstraint.cs | 246 + .../ConstraintSolver/IConstraintSolver.cs | 32 + .../ConstraintSolver/JacobianEntry.cs | 155 + .../ConstraintSolver/Point2PointConstraint.cs | 157 + .../SequentialImpulseConstraintSolver.cs | 915 + .../Solve2LinearConstraint.cs | 188 + .../Dynamics/ConstraintSolver/SolverBody.cs | 78 + .../ConstraintSolver/SolverConstraint.cs | 77 + .../ConstraintSolver/TypedConstraint.cs | 88 + .../Dynamics/DiscreteDynamicsWorld.cs | 790 + .../Dynamics/DynamicsWorld.cs | 59 + .../XnaDevRu.BulletX/Dynamics/RigidBody.cs | 446 + .../Dynamics/SimpleDynamicsWorld.cs | 211 + .../Dynamics/Vehicle/RaycastVehicle.cs | 94 + .../Dynamics/Vehicle/VehicleRaycaster.cs | 49 + .../Dynamics/Vehicle/WheelInfo.cs | 529 + .../Exceptions/BulletException.cs | 53 + .../Source/XnaDevRu.BulletX/IDebugDraw.cs | 60 + .../LinearMath/DefaultMotionState.cs | 66 + .../XnaDevRu.BulletX/LinearMath/MathHelper.cs | 581 + .../LinearMath/MatrixOperations.cs | 116 + .../LinearMath/MotionState.cs | 44 + .../XnaDevRu.BulletX/LinearMath/QuadWord.cs | 88 + .../XnaDevRu.BulletX/LinearMath/Quaternion.cs | 198 + .../LinearMath/TransformUtil.cs | 101 + .../XnaDevRu.BulletX/LinearMath/Vector3.cs | 221 + .../XnaDevRu.BulletX/LinearMath/Vector4.cs | 110 + .../Properties/AssemblyInfo.cs | 31 + .../Source/XnaDevRu.BulletX/XnaDebugDrawer.cs | 142 + .../XnaDevRu.BulletX/XnaDevRu.BulletX.csproj | 534 + .../XnaDevRu.BulletX/XnaDevRu.BulletX.sln | 51 + .../Source/XnaDevRu.Demos/Camera.cs | 175 + .../Source/XnaDevRu.Demos/Demos.snk | Bin 0 -> 160 bytes .../Source/XnaDevRu.Demos/Framerate.cs | 167 + .../XnaDevRu.Demos/Properties/AssemblyInfo.cs | 31 + .../XnaDevRu.Demos/XnaDevRu.Demos.csproj | 86 + .../Source/XnaDevRu.Demos/XnaDevRu.Demos.sln | 20 + .../Extras/obsolete/BulletX/readme.txt | 20 + .../Extras/obsolete/GPUphysics/CHANGES | 52 + .../Extras/obsolete/GPUphysics/CMakeLists.txt | 67 + .../obsolete/GPUphysics/DEBUGGING_README | 43 + .../Extras/obsolete/GPUphysics/GPU_physics.h | 116 + .../obsolete/GPUphysics/GPU_physics_demo.cpp | 949 + .../Extras/obsolete/GPUphysics/Jamfile | 23 + .../Extras/obsolete/GPUphysics/LICENSE | 25 + .../Extras/obsolete/GPUphysics/Makefile | 22 + .../Extras/obsolete/GPUphysics/Makefile.Mac | 22 + .../Extras/obsolete/GPUphysics/README | 106 + .../Extras/obsolete/GPUphysics/clock.cpp | 79 + .../Extras/obsolete/GPUphysics/clock.h | 45 + .../obsolete/GPUphysics/collisionShader.frag | 30 + .../obsolete/GPUphysics/cubeShader.frag | 6 + .../obsolete/GPUphysics/cubeShader.vert | 42 + .../GPUphysics/cubeShaderNoTexture.vert | 12 + .../Extras/obsolete/GPUphysics/fboSupport.cpp | 396 + .../Extras/obsolete/GPUphysics/fboSupport.h | 101 + .../obsolete/GPUphysics/shaderSupport.cpp | 430 + .../obsolete/GPUphysics/shaderSupport.h | 76 + .../obsolete/SATConvexCollision/Geometry.cpp | 229 + .../obsolete/SATConvexCollision/Geometry.h | 195 + .../obsolete/SATConvexCollision/Geometry.inl | 436 + .../obsolete/SATConvexCollision/Hull.cpp | 1080 + .../Extras/obsolete/SATConvexCollision/Hull.h | 174 + .../obsolete/SATConvexCollision/Hull.inl | 100 + .../SATConvexCollision/HullContactCollector.h | 38 + .../obsolete/SATConvexCollision/Maths.h | 175 + .../obsolete/SATConvexCollision/Matrix.cpp | 204 + .../obsolete/SATConvexCollision/Matrix.h | 208 + .../obsolete/SATConvexCollision/Matrix.inl | 609 + .../obsolete/SATConvexCollision/Memory2.h | 63 + .../obsolete/SATConvexCollision/Quat.cpp | 108 + .../Extras/obsolete/SATConvexCollision/Quat.h | 87 + .../obsolete/SATConvexCollision/Quat.inl | 189 + .../obsolete/SATConvexCollision/Scalar.cpp | 39 + .../obsolete/SATConvexCollision/Scalar.h | 106 + .../obsolete/SATConvexCollision/Scalar.inl | 196 + .../obsolete/SATConvexCollision/Shape.cpp | 34 + .../obsolete/SATConvexCollision/Shape.h | 67 + .../obsolete/SATConvexCollision/Vector.cpp | 55 + .../obsolete/SATConvexCollision/Vector.h | 349 + .../obsolete/SATConvexCollision/Vector.inl | 1110 + .../SATConvexCollision/VectorBase.cpp | 49 + .../obsolete/SATConvexCollision/VectorBase.h | 142 + .../SATConvexCollision/VectorBase.inl | 213 + .../Extras/obsolete/test_BulletOde.cpp | 531 + .../Extras/quickstep/btOdeContactJoint.cpp | 273 + .../Extras/quickstep/btOdeContactJoint.h | 50 + .../Extras/quickstep/btOdeJoint.cpp | 25 + .../bulletTrunk/Extras/quickstep/btOdeJoint.h | 94 + .../Extras/quickstep/btOdeMacros.h | 212 + .../btOdeQuickstepConstraintSolver.cpp | 392 + .../btOdeQuickstepConstraintSolver.h | 94 + .../Extras/quickstep/btOdeSolverBody.h | 48 + .../Extras/quickstep/btOdeTypedJoint.cpp | 860 + .../Extras/quickstep/btOdeTypedJoint.h | 142 + .../bulletTrunk/Extras/quickstep/btSorLcp.cpp | 690 + .../bulletTrunk/Extras/quickstep/btSorLcp.h | 110 + .../bulletTrunk/Extras/readblend/LICENSE.txt | 24 + .../bulletTrunk/Extras/readblend/Makefile | 36 + .../Extras/readblend/README.blendstruct | 26 + .../Extras/readblend/ReadBlend.sln | 20 + .../Extras/readblend/ReadBlend.vcproj | 213 + .../bulletTrunk/Extras/readblend/abs-file.h | 226 + .../bulletTrunk/Extras/readblend/readblend.c | 2397 + .../bulletTrunk/Extras/readblend/readblend.h | 459 + .../bulletTrunk/Extras/readblend/testblend.c | 110 + .../Extras/simdmathlibrary/LICENSE | 28 + .../Extras/simdmathlibrary/Make.defs | 92 + .../Extras/simdmathlibrary/Make.rules | 82 + .../Extras/simdmathlibrary/Make.test | 87 + .../Extras/simdmathlibrary/Makefile | 53 + .../bulletTrunk/Extras/simdmathlibrary/README | 128 + .../Extras/simdmathlibrary/common/Makefile | 47 + .../Extras/simdmathlibrary/common/absi4.c | 36 + .../Extras/simdmathlibrary/common/acosf4.c | 36 + .../Extras/simdmathlibrary/common/asinf4.c | 36 + .../Extras/simdmathlibrary/common/atan2f4.c | 36 + .../Extras/simdmathlibrary/common/atanf4.c | 36 + .../Extras/simdmathlibrary/common/cbrtf4.c | 36 + .../Extras/simdmathlibrary/common/ceild2.c | 36 + .../Extras/simdmathlibrary/common/ceilf4.c | 36 + .../simdmathlibrary/common/common-test.h | 228 + .../simdmathlibrary/common/copysignd2.c | 36 + .../simdmathlibrary/common/copysignf4.c | 36 + .../Extras/simdmathlibrary/common/cosd2.c | 36 + .../Extras/simdmathlibrary/common/cosf4.c | 36 + .../Extras/simdmathlibrary/common/divd2.c | 36 + .../Extras/simdmathlibrary/common/divf4.c | 36 + .../Extras/simdmathlibrary/common/divi4.c | 36 + .../Extras/simdmathlibrary/common/divu4.c | 36 + .../Extras/simdmathlibrary/common/exp2f4.c | 36 + .../Extras/simdmathlibrary/common/expf4.c | 36 + .../Extras/simdmathlibrary/common/expm1f4.c | 36 + .../Extras/simdmathlibrary/common/fabsd2.c | 36 + .../Extras/simdmathlibrary/common/fabsf4.c | 37 + .../Extras/simdmathlibrary/common/fdimd2.c | 36 + .../Extras/simdmathlibrary/common/fdimf4.c | 36 + .../Extras/simdmathlibrary/common/floord2.c | 36 + .../Extras/simdmathlibrary/common/floorf4.c | 36 + .../Extras/simdmathlibrary/common/fmad2.c | 36 + .../Extras/simdmathlibrary/common/fmaf4.c | 36 + .../Extras/simdmathlibrary/common/fmaxd2.c | 36 + .../Extras/simdmathlibrary/common/fmaxf4.c | 36 + .../Extras/simdmathlibrary/common/fmind2.c | 36 + .../Extras/simdmathlibrary/common/fminf4.c | 36 + .../Extras/simdmathlibrary/common/fmodd2.c | 36 + .../Extras/simdmathlibrary/common/fmodf4.c | 36 + .../simdmathlibrary/common/fpclassifyd2.c | 36 + .../simdmathlibrary/common/fpclassifyf4.c | 36 + .../Extras/simdmathlibrary/common/frexpd2.c | 36 + .../Extras/simdmathlibrary/common/frexpf4.c | 36 + .../Extras/simdmathlibrary/common/hypotd2.c | 36 + .../Extras/simdmathlibrary/common/hypotf4.c | 36 + .../Extras/simdmathlibrary/common/ilogbd2.c | 36 + .../Extras/simdmathlibrary/common/ilogbf4.c | 36 + .../Extras/simdmathlibrary/common/irintf4.c | 39 + .../Extras/simdmathlibrary/common/iroundf4.c | 38 + .../simdmathlibrary/common/is0denormd2.c | 36 + .../simdmathlibrary/common/is0denormf4.c | 35 + .../Extras/simdmathlibrary/common/isequald2.c | 35 + .../Extras/simdmathlibrary/common/isequalf4.c | 36 + .../simdmathlibrary/common/isfinited2.c | 37 + .../simdmathlibrary/common/isfinitef4.c | 36 + .../simdmathlibrary/common/isgreaterd2.c | 36 + .../simdmathlibrary/common/isgreaterequald2.c | 36 + .../simdmathlibrary/common/isgreaterequalf4.c | 36 + .../simdmathlibrary/common/isgreaterf4.c | 36 + .../Extras/simdmathlibrary/common/isinfd2.c | 36 + .../Extras/simdmathlibrary/common/isinff4.c | 36 + .../Extras/simdmathlibrary/common/islessd2.c | 36 + .../simdmathlibrary/common/islessequald2.c | 36 + .../simdmathlibrary/common/islessequalf4.c | 36 + .../Extras/simdmathlibrary/common/islessf4.c | 36 + .../simdmathlibrary/common/islessgreaterd2.c | 36 + .../simdmathlibrary/common/islessgreaterf4.c | 36 + .../Extras/simdmathlibrary/common/isnand2.c | 36 + .../Extras/simdmathlibrary/common/isnanf4.c | 36 + .../simdmathlibrary/common/isnormald2.c | 36 + .../simdmathlibrary/common/isnormalf4.c | 36 + .../simdmathlibrary/common/isunorderedd2.c | 36 + .../simdmathlibrary/common/isunorderedf4.c | 36 + .../Extras/simdmathlibrary/common/ldexpd2.c | 38 + .../Extras/simdmathlibrary/common/ldexpf4.c | 36 + .../Extras/simdmathlibrary/common/llabsi2.c | 36 + .../Extras/simdmathlibrary/common/lldivi2.c | 36 + .../Extras/simdmathlibrary/common/lldivu2.c | 36 + .../Extras/simdmathlibrary/common/llrintd2.c | 37 + .../Extras/simdmathlibrary/common/llrintf4.c | 37 + .../Extras/simdmathlibrary/common/llroundd2.c | 37 + .../Extras/simdmathlibrary/common/llroundf4.c | 37 + .../Extras/simdmathlibrary/common/log10f4.c | 36 + .../Extras/simdmathlibrary/common/log1pf4.c | 36 + .../Extras/simdmathlibrary/common/log2f4.c | 36 + .../Extras/simdmathlibrary/common/logbd2.c | 36 + .../Extras/simdmathlibrary/common/logbf4.c | 36 + .../Extras/simdmathlibrary/common/logf4.c | 36 + .../Extras/simdmathlibrary/common/modfd2.c | 36 + .../Extras/simdmathlibrary/common/modff4.c | 36 + .../simdmathlibrary/common/nearbyintd2.c | 37 + .../simdmathlibrary/common/nearbyintf4.c | 39 + .../Extras/simdmathlibrary/common/negated2.c | 37 + .../Extras/simdmathlibrary/common/negatef4.c | 36 + .../Extras/simdmathlibrary/common/negatei4.c | 36 + .../Extras/simdmathlibrary/common/negatell2.c | 36 + .../simdmathlibrary/common/nextafterd2.c | 36 + .../simdmathlibrary/common/nextafterf4.c | 38 + .../Extras/simdmathlibrary/common/powf4.c | 36 + .../Extras/simdmathlibrary/common/recipd2.c | 36 + .../Extras/simdmathlibrary/common/recipf4.c | 36 + .../simdmathlibrary/common/remainderd2.c | 37 + .../simdmathlibrary/common/remainderf4.c | 36 + .../Extras/simdmathlibrary/common/remquod2.c | 36 + .../Extras/simdmathlibrary/common/remquof4.c | 36 + .../Extras/simdmathlibrary/common/rintd2.c | 37 + .../Extras/simdmathlibrary/common/rintf4.c | 38 + .../Extras/simdmathlibrary/common/roundd2.c | 37 + .../Extras/simdmathlibrary/common/roundf4.c | 37 + .../Extras/simdmathlibrary/common/rsqrtd2.c | 36 + .../Extras/simdmathlibrary/common/rsqrtf4.c | 36 + .../simdmathlibrary/common/scalbllnd2.c | 38 + .../Extras/simdmathlibrary/common/scalbnf4.c | 38 + .../Extras/simdmathlibrary/common/signbitd2.c | 36 + .../Extras/simdmathlibrary/common/signbitf4.c | 36 + .../Extras/simdmathlibrary/common/simdmath.h | 732 + .../simdmathlibrary/common/simdmath/_sincos.h | 78 + .../Extras/simdmathlibrary/common/sincosd2.c | 36 + .../Extras/simdmathlibrary/common/sincosf4.c | 36 + .../Extras/simdmathlibrary/common/sind2.c | 36 + .../Extras/simdmathlibrary/common/sinf4.c | 36 + .../Extras/simdmathlibrary/common/sqrtd2.c | 36 + .../Extras/simdmathlibrary/common/sqrtf4.c | 36 + .../Extras/simdmathlibrary/common/tand2.c | 36 + .../Extras/simdmathlibrary/common/tanf4.c | 36 + .../Extras/simdmathlibrary/common/truncd2.c | 37 + .../Extras/simdmathlibrary/common/truncf4.c | 37 + .../Extras/simdmathlibrary/ppu/Makefile | 52 + .../simdmathlibrary/ppu/simdmath/_vec_utils.h | 51 + .../simdmathlibrary/ppu/simdmath/absi4.h | 42 + .../simdmathlibrary/ppu/simdmath/acosf4.h | 82 + .../simdmathlibrary/ppu/simdmath/asinf4.h | 95 + .../simdmathlibrary/ppu/simdmath/atan2f4.h | 67 + .../simdmathlibrary/ppu/simdmath/atanf4.h | 87 + .../simdmathlibrary/ppu/simdmath/cbrtf4.h | 97 + .../simdmathlibrary/ppu/simdmath/ceilf4.h | 42 + .../simdmathlibrary/ppu/simdmath/copysignf4.h | 45 + .../simdmathlibrary/ppu/simdmath/cosf4.h | 107 + .../simdmathlibrary/ppu/simdmath/divf4.h | 51 + .../simdmathlibrary/ppu/simdmath/divi4.h | 105 + .../simdmathlibrary/ppu/simdmath/exp2f4.h | 137 + .../simdmathlibrary/ppu/simdmath/expf4.h | 69 + .../simdmathlibrary/ppu/simdmath/expm1f4.h | 63 + .../simdmathlibrary/ppu/simdmath/fabsf4.h | 42 + .../simdmathlibrary/ppu/simdmath/fdimf4.h | 45 + .../simdmathlibrary/ppu/simdmath/floorf4.h | 43 + .../simdmathlibrary/ppu/simdmath/fmaf4.h | 42 + .../simdmathlibrary/ppu/simdmath/fmaxf4.h | 43 + .../simdmathlibrary/ppu/simdmath/fminf4.h | 43 + .../simdmathlibrary/ppu/simdmath/fmodf4.h | 88 + .../simdmathlibrary/ppu/simdmath/frexpf4.h | 54 + .../simdmathlibrary/ppu/simdmath/hypotf4.h | 46 + .../simdmathlibrary/ppu/simdmath/ilogbf4.h | 52 + .../simdmathlibrary/ppu/simdmath/ldexpf4.h | 63 + .../simdmathlibrary/ppu/simdmath/log10f4.h | 83 + .../simdmathlibrary/ppu/simdmath/log1pf4.h | 61 + .../simdmathlibrary/ppu/simdmath/log2f4.h | 77 + .../simdmathlibrary/ppu/simdmath/logbf4.h | 48 + .../simdmathlibrary/ppu/simdmath/logf4.h | 77 + .../simdmathlibrary/ppu/simdmath/modff4.h | 53 + .../simdmathlibrary/ppu/simdmath/negatef4.h | 44 + .../simdmathlibrary/ppu/simdmath/negatei4.h | 45 + .../simdmathlibrary/ppu/simdmath/powf4.h | 61 + .../simdmathlibrary/ppu/simdmath/recipf4.h | 50 + .../simdmathlibrary/ppu/simdmath/rsqrtf4.h | 57 + .../simdmathlibrary/ppu/simdmath/sincosf4.h | 113 + .../simdmathlibrary/ppu/simdmath/sinf4.h | 107 + .../simdmathlibrary/ppu/simdmath/sqrtf4.h | 59 + .../simdmathlibrary/ppu/simdmath/tanf4.h | 98 + .../simdmathlibrary/ppu/simdmath/truncf4.h | 43 + .../Extras/simdmathlibrary/ppu/tests/Makefile | 41 + .../Extras/simdmathlibrary/ppu/tests/absi4.c | 73 + .../Extras/simdmathlibrary/ppu/tests/ceilf4.c | 92 + .../simdmathlibrary/ppu/tests/copysignf4.c | 67 + .../Extras/simdmathlibrary/ppu/tests/divf4.c | 128 + .../Extras/simdmathlibrary/ppu/tests/divi4.c | 124 + .../Extras/simdmathlibrary/ppu/tests/fabsf4.c | 85 + .../simdmathlibrary/ppu/tests/floorf4.c | 92 + .../simdmathlibrary/ppu/tests/fminf4_fmaxf4.c | 91 + .../Extras/simdmathlibrary/ppu/tests/fmodf4.c | 129 + .../Extras/simdmathlibrary/ppu/tests/modff4.c | 108 + .../simdmathlibrary/ppu/tests/negatef4.c | 86 + .../simdmathlibrary/ppu/tests/negatei4.c | 83 + .../simdmathlibrary/ppu/tests/recipf4.c | 108 + .../simdmathlibrary/ppu/tests/rsqrtf4.c | 95 + .../Extras/simdmathlibrary/ppu/tests/sqrtf4.c | 100 + .../simdmathlibrary/ppu/tests/testutils.c | 67 + .../simdmathlibrary/ppu/tests/testutils.h | 110 + .../simdmathlibrary/ppu/tests/truncf4.c | 93 + .../Extras/simdmathlibrary/simdmath.spec | 108 + .../Extras/simdmathlibrary/spu/Makefile | 60 + .../simdmathlibrary/spu/simdmath/_lldiv.h | 116 + .../simdmathlibrary/spu/simdmath/_remainder.h | 84 + .../simdmathlibrary/spu/simdmath/_vec_utils.h | 57 + .../simdmathlibrary/spu/simdmath/absi4.h | 44 + .../simdmathlibrary/spu/simdmath/acosf4.h | 82 + .../simdmathlibrary/spu/simdmath/asinf4.h | 92 + .../simdmathlibrary/spu/simdmath/atan2f4.h | 66 + .../simdmathlibrary/spu/simdmath/atanf4.h | 81 + .../simdmathlibrary/spu/simdmath/cbrtf4.h | 95 + .../simdmathlibrary/spu/simdmath/ceild2.h | 99 + .../simdmathlibrary/spu/simdmath/ceilf4.h | 58 + .../simdmathlibrary/spu/simdmath/copysignd2.h | 43 + .../simdmathlibrary/spu/simdmath/copysignf4.h | 43 + .../simdmathlibrary/spu/simdmath/cosd2.h | 46 + .../simdmathlibrary/spu/simdmath/cosf4.h | 46 + .../simdmathlibrary/spu/simdmath/divd2.h | 47 + .../simdmathlibrary/spu/simdmath/divf4.h | 50 + .../simdmathlibrary/spu/simdmath/divi4.h | 67 + .../simdmathlibrary/spu/simdmath/divu4.h | 102 + .../simdmathlibrary/spu/simdmath/exp2f4.h | 135 + .../simdmathlibrary/spu/simdmath/expf4.h | 70 + .../simdmathlibrary/spu/simdmath/expm1f4.h | 62 + .../simdmathlibrary/spu/simdmath/fabsd2.h | 42 + .../simdmathlibrary/spu/simdmath/fabsf4.h | 42 + .../simdmathlibrary/spu/simdmath/fdimd2.h | 51 + .../simdmathlibrary/spu/simdmath/fdimf4.h | 43 + .../simdmathlibrary/spu/simdmath/floord2.h | 99 + .../simdmathlibrary/spu/simdmath/floorf4.h | 58 + .../simdmathlibrary/spu/simdmath/fmad2.h | 42 + .../simdmathlibrary/spu/simdmath/fmaf4.h | 42 + .../simdmathlibrary/spu/simdmath/fmaxd2.h | 71 + .../simdmathlibrary/spu/simdmath/fmaxf4.h | 43 + .../simdmathlibrary/spu/simdmath/fmind2.h | 71 + .../simdmathlibrary/spu/simdmath/fminf4.h | 43 + .../simdmathlibrary/spu/simdmath/fmodd2.h | 282 + .../simdmathlibrary/spu/simdmath/fmodf4.h | 94 + .../spu/simdmath/fpclassifyd2.h | 83 + .../spu/simdmath/fpclassifyf4.h | 67 + .../simdmathlibrary/spu/simdmath/frexpd2.h | 98 + .../simdmathlibrary/spu/simdmath/frexpf4.h | 52 + .../simdmathlibrary/spu/simdmath/hypotd2.h | 47 + .../simdmathlibrary/spu/simdmath/hypotf4.h | 47 + .../simdmathlibrary/spu/simdmath/ilogbd2.h | 83 + .../simdmathlibrary/spu/simdmath/ilogbf4.h | 50 + .../simdmathlibrary/spu/simdmath/irintf4.h | 45 + .../simdmathlibrary/spu/simdmath/iroundf4.h | 61 + .../spu/simdmath/is0denormd2.h | 51 + .../spu/simdmath/is0denormf4.h | 42 + .../simdmathlibrary/spu/simdmath/isequald2.h | 61 + .../simdmathlibrary/spu/simdmath/isequalf4.h | 42 + .../simdmathlibrary/spu/simdmath/isfinited2.h | 51 + .../simdmathlibrary/spu/simdmath/isfinitef4.h | 45 + .../spu/simdmath/isgreaterd2.h | 71 + .../spu/simdmath/isgreaterequald2.h | 73 + .../spu/simdmath/isgreaterequalf4.h | 46 + .../spu/simdmath/isgreaterf4.h | 42 + .../simdmathlibrary/spu/simdmath/isinfd2.h | 51 + .../simdmathlibrary/spu/simdmath/isinff4.h | 45 + .../simdmathlibrary/spu/simdmath/islessd2.h | 71 + .../spu/simdmath/islessequald2.h | 73 + .../spu/simdmath/islessequalf4.h | 46 + .../simdmathlibrary/spu/simdmath/islessf4.h | 42 + .../spu/simdmath/islessgreaterd2.h | 61 + .../spu/simdmath/islessgreaterf4.h | 46 + .../simdmathlibrary/spu/simdmath/isnand2.h | 56 + .../simdmathlibrary/spu/simdmath/isnanf4.h | 45 + .../simdmathlibrary/spu/simdmath/isnormald2.h | 53 + .../simdmathlibrary/spu/simdmath/isnormalf4.h | 43 + .../spu/simdmath/isunorderedd2.h | 67 + .../spu/simdmath/isunorderedf4.h | 46 + .../simdmathlibrary/spu/simdmath/ldexpd2.h | 266 + .../simdmathlibrary/spu/simdmath/ldexpf4.h | 62 + .../simdmathlibrary/spu/simdmath/llabsi2.h | 50 + .../simdmathlibrary/spu/simdmath/lldivi2.h | 85 + .../simdmathlibrary/spu/simdmath/lldivu2.h | 104 + .../simdmathlibrary/spu/simdmath/llrintd2.h | 115 + .../simdmathlibrary/spu/simdmath/llrintf4.h | 107 + .../simdmathlibrary/spu/simdmath/llroundd2.h | 97 + .../simdmathlibrary/spu/simdmath/llroundf4.h | 120 + .../simdmathlibrary/spu/simdmath/log10f4.h | 83 + .../simdmathlibrary/spu/simdmath/log1pf4.h | 60 + .../simdmathlibrary/spu/simdmath/log2f4.h | 78 + .../simdmathlibrary/spu/simdmath/logbd2.h | 86 + .../simdmathlibrary/spu/simdmath/logbf4.h | 46 + .../simdmathlibrary/spu/simdmath/logf4.h | 76 + .../simdmathlibrary/spu/simdmath/modfd2.h | 59 + .../simdmathlibrary/spu/simdmath/modff4.h | 52 + .../spu/simdmath/nearbyintd2.h | 76 + .../spu/simdmath/nearbyintf4.h | 55 + .../simdmathlibrary/spu/simdmath/negated2.h | 42 + .../simdmathlibrary/spu/simdmath/negatef4.h | 43 + .../simdmathlibrary/spu/simdmath/negatei4.h | 43 + .../simdmathlibrary/spu/simdmath/negatell2.h | 47 + .../spu/simdmath/nextafterd2.h | 97 + .../spu/simdmath/nextafterf4.h | 72 + .../simdmathlibrary/spu/simdmath/powf4.h | 60 + .../simdmathlibrary/spu/simdmath/recipd2.h | 88 + .../simdmathlibrary/spu/simdmath/recipf4.h | 50 + .../spu/simdmath/remainderd2.h | 110 + .../spu/simdmath/remainderf4.h | 115 + .../simdmathlibrary/spu/simdmath/remquod2.h | 155 + .../simdmathlibrary/spu/simdmath/remquof4.h | 191 + .../simdmathlibrary/spu/simdmath/rintd2.h | 72 + .../simdmathlibrary/spu/simdmath/rintf4.h | 54 + .../simdmathlibrary/spu/simdmath/roundd2.h | 78 + .../simdmathlibrary/spu/simdmath/roundf4.h | 69 + .../simdmathlibrary/spu/simdmath/rsqrtd2.h | 105 + .../simdmathlibrary/spu/simdmath/rsqrtf4.h | 51 + .../simdmathlibrary/spu/simdmath/scalbllnd2.h | 268 + .../simdmathlibrary/spu/simdmath/scalbnf4.h | 75 + .../simdmathlibrary/spu/simdmath/signbitd2.h | 48 + .../simdmathlibrary/spu/simdmath/signbitf4.h | 42 + .../simdmathlibrary/spu/simdmath/sincosd2.h | 149 + .../simdmathlibrary/spu/simdmath/sincosf4.h | 113 + .../simdmathlibrary/spu/simdmath/sind2.h | 49 + .../simdmathlibrary/spu/simdmath/sinf4.h | 49 + .../simdmathlibrary/spu/simdmath/sqrtd2.h | 113 + .../simdmathlibrary/spu/simdmath/sqrtf4.h | 52 + .../simdmathlibrary/spu/simdmath/tand2.h | 125 + .../simdmathlibrary/spu/simdmath/tanf4.h | 95 + .../simdmathlibrary/spu/simdmath/truncd2.h | 66 + .../simdmathlibrary/spu/simdmath/truncf4.h | 52 + .../Extras/simdmathlibrary/spu/tests/Makefile | 51 + .../Extras/simdmathlibrary/spu/tests/absi4.c | 90 + .../Extras/simdmathlibrary/spu/tests/ceild2.c | 156 + .../Extras/simdmathlibrary/spu/tests/ceilf4.c | 108 + .../simdmathlibrary/spu/tests/copysignd2.c | 74 + .../simdmathlibrary/spu/tests/copysignf4.c | 75 + .../Extras/simdmathlibrary/spu/tests/divd2.c | 153 + .../Extras/simdmathlibrary/spu/tests/divf4.c | 128 + .../Extras/simdmathlibrary/spu/tests/divi4.c | 123 + .../Extras/simdmathlibrary/spu/tests/divu4.c | 146 + .../Extras/simdmathlibrary/spu/tests/fabsd2.c | 103 + .../Extras/simdmathlibrary/spu/tests/fabsf4.c | 106 + .../Extras/simdmathlibrary/spu/tests/fdimd2.c | 173 + .../simdmathlibrary/spu/tests/floord2.c | 157 + .../simdmathlibrary/spu/tests/floorf4.c | 109 + .../Extras/simdmathlibrary/spu/tests/fmad2.c | 146 + .../simdmathlibrary/spu/tests/fmind2_fmaxd2.c | 225 + .../simdmathlibrary/spu/tests/fminf4_fmaxf4.c | 124 + .../Extras/simdmathlibrary/spu/tests/fmodd2.c | 364 + .../Extras/simdmathlibrary/spu/tests/fmodf4.c | 145 + .../simdmathlibrary/spu/tests/fpclassifyd2.c | 225 + .../simdmathlibrary/spu/tests/fpclassifyf4.c | 200 + .../simdmathlibrary/spu/tests/frexpd2.c | 418 + .../simdmathlibrary/spu/tests/frexpf4.c | 405 + .../simdmathlibrary/spu/tests/hypotd2.c | 341 + .../simdmathlibrary/spu/tests/hypotf4.c | 208 + .../simdmathlibrary/spu/tests/ilogbd2.c | 316 + .../simdmathlibrary/spu/tests/ilogbf4.c | 317 + .../simdmathlibrary/spu/tests/irintf4.c | 96 + .../simdmathlibrary/spu/tests/iroundf4.c | 96 + .../simdmathlibrary/spu/tests/is0denormd2.c | 225 + .../simdmathlibrary/spu/tests/is0denormf4.c | 200 + .../simdmathlibrary/spu/tests/isequald2.c | 271 + .../simdmathlibrary/spu/tests/isequalf4.c | 151 + .../simdmathlibrary/spu/tests/isfinited2.c | 225 + .../simdmathlibrary/spu/tests/isfinitef4.c | 131 + .../simdmathlibrary/spu/tests/isgreaterd2.c | 271 + .../spu/tests/isgreaterequald2.c | 271 + .../spu/tests/isgreaterequalf4.c | 151 + .../simdmathlibrary/spu/tests/isgreaterf4.c | 151 + .../simdmathlibrary/spu/tests/isinfd2.c | 225 + .../simdmathlibrary/spu/tests/isinff4.c | 131 + .../simdmathlibrary/spu/tests/islessd2.c | 272 + .../simdmathlibrary/spu/tests/islessequald2.c | 271 + .../simdmathlibrary/spu/tests/islessequalf4.c | 151 + .../simdmathlibrary/spu/tests/islessf4.c | 151 + .../spu/tests/islessgreaterd2.c | 271 + .../spu/tests/islessgreaterf4.c | 151 + .../simdmathlibrary/spu/tests/isnand2.c | 226 + .../simdmathlibrary/spu/tests/isnanf4.c | 130 + .../simdmathlibrary/spu/tests/isnormald2.c | 225 + .../simdmathlibrary/spu/tests/isnormalf4.c | 131 + .../simdmathlibrary/spu/tests/isunorderedd2.c | 271 + .../simdmathlibrary/spu/tests/isunorderedf4.c | 151 + .../simdmathlibrary/spu/tests/ldexpd2.c | 250 + .../simdmathlibrary/spu/tests/llabsi2.c | 94 + .../simdmathlibrary/spu/tests/lldivi2.c | 126 + .../simdmathlibrary/spu/tests/lldivu2.c | 125 + .../simdmathlibrary/spu/tests/llrintd2.c | 215 + .../simdmathlibrary/spu/tests/llrintf4.c | 123 + .../simdmathlibrary/spu/tests/llroundd2.c | 113 + .../simdmathlibrary/spu/tests/llroundf4.c | 125 + .../Extras/simdmathlibrary/spu/tests/logbd2.c | 314 + .../Extras/simdmathlibrary/spu/tests/logbf4.c | 316 + .../Extras/simdmathlibrary/spu/tests/modfd2.c | 109 + .../Extras/simdmathlibrary/spu/tests/modff4.c | 124 + .../simdmathlibrary/spu/tests/nearbyintd2.c | 178 + .../simdmathlibrary/spu/tests/nearbyintf4.c | 95 + .../simdmathlibrary/spu/tests/negated2.c | 83 + .../simdmathlibrary/spu/tests/negatef4.c | 87 + .../simdmathlibrary/spu/tests/negatei4.c | 83 + .../simdmathlibrary/spu/tests/negatell2.c | 86 + .../simdmathlibrary/spu/tests/nextafterd2.c | 153 + .../simdmathlibrary/spu/tests/nextafterf4.c | 162 + .../simdmathlibrary/spu/tests/recipd2.c | 131 + .../simdmathlibrary/spu/tests/recipf4.c | 114 + .../simdmathlibrary/spu/tests/remainderd2.c | 125 + .../simdmathlibrary/spu/tests/remainderf4.c | 143 + .../simdmathlibrary/spu/tests/remquod2.c | 151 + .../simdmathlibrary/spu/tests/remquof4.c | 145 + .../Extras/simdmathlibrary/spu/tests/rintd2.c | 180 + .../Extras/simdmathlibrary/spu/tests/rintf4.c | 94 + .../simdmathlibrary/spu/tests/roundd2.c | 151 + .../simdmathlibrary/spu/tests/roundf4.c | 100 + .../simdmathlibrary/spu/tests/rsqrtd2.c | 126 + .../simdmathlibrary/spu/tests/rsqrtf4.c | 93 + .../simdmathlibrary/spu/tests/scalbllnd2.c | 251 + .../simdmathlibrary/spu/tests/scalbnf4.c | 117 + .../simdmathlibrary/spu/tests/signbitd2.c | 195 + .../simdmathlibrary/spu/tests/signbitf4.c | 195 + .../Extras/simdmathlibrary/spu/tests/sqrtd2.c | 128 + .../Extras/simdmathlibrary/spu/tests/sqrtf4.c | 92 + .../simdmathlibrary/spu/tests/testutils.c | 321 + .../simdmathlibrary/spu/tests/testutils.h | 87 + .../simdmathlibrary/spu/tests/truncd2.c | 145 + .../simdmathlibrary/spu/tests/truncf4.c | 108 + .../cache/CommonPublicLicense-1.0 | 213 + .../software_cache/cache/include/Makefile | 28 + .../software_cache/cache/include/README | 32 + .../Extras/software_cache/cache/include/api.h | 31 + .../software_cache/cache/include/cbe_mfc.h | 245 + .../software_cache/cache/include/defs.h | 149 + .../Extras/software_cache/cache/include/dma.h | 40 + .../software_cache/cache/include/ilog2.h | 35 + .../software_cache/cache/include/memset.h | 68 + .../cache/include/nway-lookup.h | 194 + .../software_cache/cache/include/nway-miss.h | 51 + .../software_cache/cache/include/nway-opt.h | 153 + .../cache/include/nway-replace.h | 38 + .../software_cache/cache/include/nway.h | 105 + .../software_cache/cache/include/spe_cache.h | 32 + .../cache/include/vec_literal.h | 74 + .../Extras/vectormathlibrary/LICENSE | 31 + .../Extras/vectormathlibrary/Makefile | 119 + .../Extras/vectormathlibrary/README | 86 + .../doc/Vector_Math_Library-Overview.pdf | Bin 0 -> 207118 bytes .../include/vectormath/SSE/cpp/boolInVec.h | 247 + .../include/vectormath/SSE/cpp/floatInVec.h | 340 + .../include/vectormath/SSE/cpp/mat_aos.h | 2190 + .../include/vectormath/SSE/cpp/quat_aos.h | 533 + .../include/vectormath/SSE/cpp/readme_e.txt | 1 + .../include/vectormath/SSE/cpp/vec_aos.h | 1391 + .../include/vectormath/SSE/cpp/vecidx_aos.h | 80 + .../vectormath/SSE/cpp/vectormath_aos.h | 2500 + .../include/vectormath/c/vectormath_aos.h | 41 + .../include/vectormath/c/vectormath_aos_v.h | 41 + .../include/vectormath/c/vectormath_soa.h | 41 + .../include/vectormath/c/vectormath_soa_v.h | 41 + .../include/vectormath/cpp/vectormath_aos.h | 43 + .../include/vectormath/cpp/vectormath_soa.h | 41 + .../include/vectormath/ppu/c/mat_aos.h | 1833 + .../include/vectormath/ppu/c/mat_aos_v.h | 1026 + .../include/vectormath/ppu/c/mat_soa.h | 1493 + .../include/vectormath/ppu/c/mat_soa_v.h | 1063 + .../include/vectormath/ppu/c/quat_aos.h | 379 + .../include/vectormath/ppu/c/quat_aos_v.h | 312 + .../include/vectormath/ppu/c/quat_soa.h | 415 + .../include/vectormath/ppu/c/quat_soa_v.h | 319 + .../include/vectormath/ppu/c/vec_aos.h | 1125 + .../include/vectormath/ppu/c/vec_aos_v.h | 953 + .../include/vectormath/ppu/c/vec_soa.h | 1223 + .../include/vectormath/ppu/c/vec_soa_v.h | 958 + .../include/vectormath/ppu/c/vec_types.h | 59 + .../include/vectormath/ppu/c/vectormath_aos.h | 1960 + .../vectormath/ppu/c/vectormath_aos_v.h | 1925 + .../include/vectormath/ppu/c/vectormath_soa.h | 2013 + .../vectormath/ppu/c/vectormath_soa_v.h | 1979 + .../include/vectormath/ppu/cpp/boolInVec.h | 261 + .../include/vectormath/ppu/cpp/floatInVec.h | 361 + .../include/vectormath/ppu/cpp/mat_aos.h | 2188 + .../include/vectormath/ppu/cpp/mat_soa.h | 1744 + .../include/vectormath/ppu/cpp/quat_aos.h | 536 + .../include/vectormath/ppu/cpp/quat_soa.h | 479 + .../include/vectormath/ppu/cpp/vec_aos.h | 1492 + .../include/vectormath/ppu/cpp/vec_soa.h | 1425 + .../include/vectormath/ppu/cpp/vecidx_aos.h | 80 + .../vectormath/ppu/cpp/vectormath_aos.h | 2244 + .../vectormath/ppu/cpp/vectormath_soa.h | 1919 + .../include/vectormath/scalar/c/mat_aos.h | 1452 + .../include/vectormath/scalar/c/mat_aos_v.h | 1006 + .../include/vectormath/scalar/c/quat_aos.h | 368 + .../include/vectormath/scalar/c/quat_aos_v.h | 300 + .../include/vectormath/scalar/c/vec_aos.h | 971 + .../include/vectormath/scalar/c/vec_aos_v.h | 848 + .../vectormath/scalar/c/vectormath_aos.h | 1879 + .../vectormath/scalar/c/vectormath_aos_v.h | 1845 + .../include/vectormath/scalar/cpp/mat_aos.h | 1643 + .../include/vectormath/scalar/cpp/quat_aos.h | 432 + .../include/vectormath/scalar/cpp/vec_aos.h | 1173 + .../vectormath/scalar/cpp/vectormath_aos.h | 1809 + .../include/vectormath/spu/c/mat_aos.h | 1833 + .../include/vectormath/spu/c/mat_aos_v.h | 1029 + .../include/vectormath/spu/c/mat_soa.h | 1493 + .../include/vectormath/spu/c/mat_soa_v.h | 1063 + .../include/vectormath/spu/c/quat_aos.h | 371 + .../include/vectormath/spu/c/quat_aos_v.h | 312 + .../include/vectormath/spu/c/quat_soa.h | 419 + .../include/vectormath/spu/c/quat_soa_v.h | 319 + .../include/vectormath/spu/c/vec_aos.h | 1029 + .../include/vectormath/spu/c/vec_aos_v.h | 951 + .../include/vectormath/spu/c/vec_soa.h | 1237 + .../include/vectormath/spu/c/vec_soa_v.h | 962 + .../include/vectormath/spu/c/vectormath_aos.h | 1951 + .../vectormath/spu/c/vectormath_aos_v.h | 1916 + .../include/vectormath/spu/c/vectormath_soa.h | 2012 + .../vectormath/spu/c/vectormath_soa_v.h | 1978 + .../include/vectormath/spu/cpp/boolInVec.h | 246 + .../include/vectormath/spu/cpp/floatInVec.h | 339 + .../include/vectormath/spu/cpp/mat_aos.h | 2027 + .../include/vectormath/spu/cpp/mat_soa.h | 1744 + .../include/vectormath/spu/cpp/quat_aos.h | 417 + .../include/vectormath/spu/cpp/quat_soa.h | 483 + .../include/vectormath/spu/cpp/vec_aos.h | 1167 + .../include/vectormath/spu/cpp/vec_soa.h | 1439 + .../include/vectormath/spu/cpp/vecidx_aos.h | 64 + .../vectormath/spu/cpp/vectormath_aos.h | 1851 + .../vectormath/spu/cpp/vectormath_soa.h | 1921 + .../Extras/vectormathlibrary/tests/Makefile | 138 + .../Extras/vectormathlibrary/tests/clean.pl | 109 + .../Extras/vectormathlibrary/tests/compare.pl | 95 + .../vectormathlibrary/tests/main_vmtest.cpp | 163 + .../Extras/vectormathlibrary/tests/test.h | 346 + .../vectormathlibrary/tests/test1_aos_c.c | 1153 + .../vectormathlibrary/tests/test1_aos_cpp.cpp | 1102 + .../tests/test1_reference.txt | 680 + .../vectormathlibrary/tests/test1_soa_c.c | 1006 + .../vectormathlibrary/tests/test1_soa_cpp.cpp | 931 + .../vectormathlibrary/tests/test2_aos_c.c | 852 + .../vectormathlibrary/tests/test2_aos_cpp.cpp | 784 + .../tests/test2_reference.txt | 1190 + .../vectormathlibrary/tests/test2_soa_c.c | 760 + .../vectormathlibrary/tests/test2_soa_cpp.cpp | 718 + .../vectormathlibrary/tests/test3_aos_c.c | 524 + .../vectormathlibrary/tests/test3_aos_cpp.cpp | 476 + .../tests/test3_reference.txt | 392 + .../vectormathlibrary/tests/test3_soa_c.c | 433 + .../vectormathlibrary/tests/test3_soa_cpp.cpp | 410 + .../vectormathlibrary/tests/test4_aos_c.c | 567 + .../vectormathlibrary/tests/test4_aos_cpp.cpp | 492 + .../tests/test4_reference.txt | 524 + .../vectormathlibrary/tests/test4_soa_c.c | 474 + .../vectormathlibrary/tests/test4_soa_cpp.cpp | 426 + .../Extras/vectormathlibrary/vectormath.spec | 81 + BulletPhysics/bulletTrunk/GLUT32.DLL | Bin 0 -> 160256 bytes .../bulletTrunk/Glut/EmptyGL/GL/egl_cpx.h | 13 + .../bulletTrunk/Glut/EmptyGL/GL/egl_defs.h | 706 + .../bulletTrunk/Glut/EmptyGL/GL/egl_logged.h | 20 + .../bulletTrunk/Glut/EmptyGL/GL/egl_tokens.h | 459 + .../bulletTrunk/Glut/EmptyGL/GL/egl_void.h | 422 + .../bulletTrunk/Glut/EmptyGL/GL/gl.h | 47 + .../bulletTrunk/Glut/EmptyGL/GL/glu.h | 23 + .../bulletTrunk/Glut/EmptyGL/GL/glut.h | 60 + BulletPhysics/bulletTrunk/Glut/GL/glew.h | 10697 ++ BulletPhysics/bulletTrunk/Glut/GL/glext.h | 3326 + BulletPhysics/bulletTrunk/Glut/GL/glut.h | 601 + BulletPhysics/bulletTrunk/Glut/GL/glxew.h | 1091 + BulletPhysics/bulletTrunk/Glut/GL/glxext.h | 546 + BulletPhysics/bulletTrunk/Glut/GL/wglew.h | 958 + BulletPhysics/bulletTrunk/Glut/GL/wglext.h | 466 + BulletPhysics/bulletTrunk/Glut/glew32.lib | Bin 0 -> 308030 bytes BulletPhysics/bulletTrunk/Glut/glut32.lib | Bin 0 -> 29180 bytes BulletPhysics/bulletTrunk/INSTALL | 38 + BulletPhysics/bulletTrunk/Jamfile.in | 66 + BulletPhysics/bulletTrunk/Jamrules | 21 + BulletPhysics/bulletTrunk/LICENSE | 19 + BulletPhysics/bulletTrunk/Makefile.am | 7 + BulletPhysics/bulletTrunk/NEWS | 4 + BulletPhysics/bulletTrunk/README | 7 + BulletPhysics/bulletTrunk/RELEASING.TXT | 34 + BulletPhysics/bulletTrunk/VERSION | 1 + BulletPhysics/bulletTrunk/acinclude.m4 | 3056 + BulletPhysics/bulletTrunk/autogen.sh | 61 + BulletPhysics/bulletTrunk/bullet.pc.in | 11 + BulletPhysics/bulletTrunk/config.h.in | 104 + BulletPhysics/bulletTrunk/configure.ac | 192 + BulletPhysics/bulletTrunk/convex0.bin | Bin 0 -> 548 bytes BulletPhysics/bulletTrunk/file.obj | 3578 + BulletPhysics/bulletTrunk/glew32.dll | Bin 0 -> 204800 bytes .../bulletTrunk/heightfield128x128.raw | 37 + BulletPhysics/bulletTrunk/install-sh | 322 + BulletPhysics/bulletTrunk/jam-2.5/Build.com | 31 + BulletPhysics/bulletTrunk/jam-2.5/Build.mpw | 47 + BulletPhysics/bulletTrunk/jam-2.5/Jam.html | 1329 + BulletPhysics/bulletTrunk/jam-2.5/Jambase | 2096 + .../bulletTrunk/jam-2.5/Jambase.html | 939 + BulletPhysics/bulletTrunk/jam-2.5/Jamfile | 152 + .../bulletTrunk/jam-2.5/Jamfile.html | 1450 + BulletPhysics/bulletTrunk/jam-2.5/Makefile | 65 + BulletPhysics/bulletTrunk/jam-2.5/Porting | 68 + BulletPhysics/bulletTrunk/jam-2.5/README | 154 + BulletPhysics/bulletTrunk/jam-2.5/RELNOTES | 1130 + BulletPhysics/bulletTrunk/jam-2.5/builtins.c | 318 + BulletPhysics/bulletTrunk/jam-2.5/builtins.h | 14 + BulletPhysics/bulletTrunk/jam-2.5/command.c | 67 + BulletPhysics/bulletTrunk/jam-2.5/command.h | 59 + BulletPhysics/bulletTrunk/jam-2.5/compile.c | 929 + BulletPhysics/bulletTrunk/jam-2.5/compile.h | 61 + BulletPhysics/bulletTrunk/jam-2.5/execcmd.h | 23 + BulletPhysics/bulletTrunk/jam-2.5/execmac.c | 70 + BulletPhysics/bulletTrunk/jam-2.5/execunix.c | 385 + BulletPhysics/bulletTrunk/jam-2.5/execvms.c | 168 + BulletPhysics/bulletTrunk/jam-2.5/expand.c | 534 + BulletPhysics/bulletTrunk/jam-2.5/expand.h | 18 + BulletPhysics/bulletTrunk/jam-2.5/filemac.c | 168 + BulletPhysics/bulletTrunk/jam-2.5/filent.c | 276 + BulletPhysics/bulletTrunk/jam-2.5/fileos2.c | 134 + BulletPhysics/bulletTrunk/jam-2.5/filesys.h | 18 + BulletPhysics/bulletTrunk/jam-2.5/fileunix.c | 392 + BulletPhysics/bulletTrunk/jam-2.5/filevms.c | 321 + BulletPhysics/bulletTrunk/jam-2.5/glob.c | 159 + BulletPhysics/bulletTrunk/jam-2.5/hash.c | 257 + BulletPhysics/bulletTrunk/jam-2.5/hash.h | 20 + BulletPhysics/bulletTrunk/jam-2.5/headers.c | 130 + BulletPhysics/bulletTrunk/jam-2.5/headers.h | 11 + BulletPhysics/bulletTrunk/jam-2.5/jam.c | 377 + BulletPhysics/bulletTrunk/jam-2.5/jam.h | 519 + BulletPhysics/bulletTrunk/jam-2.5/jambase.c | 1292 + BulletPhysics/bulletTrunk/jam-2.5/jambase.h | 15 + BulletPhysics/bulletTrunk/jam-2.5/jamgram.c | 932 + BulletPhysics/bulletTrunk/jam-2.5/jamgram.h | 51 + BulletPhysics/bulletTrunk/jam-2.5/jamgram.y | 355 + BulletPhysics/bulletTrunk/jam-2.5/jamgram.yy | 310 + .../bulletTrunk/jam-2.5/jamgramtab.h | 45 + BulletPhysics/bulletTrunk/jam-2.5/lists.c | 289 + BulletPhysics/bulletTrunk/jam-2.5/lists.h | 84 + BulletPhysics/bulletTrunk/jam-2.5/make.c | 526 + BulletPhysics/bulletTrunk/jam-2.5/make.h | 14 + BulletPhysics/bulletTrunk/jam-2.5/make1.c | 659 + BulletPhysics/bulletTrunk/jam-2.5/mkjambase.c | 125 + BulletPhysics/bulletTrunk/jam-2.5/newstr.c | 98 + BulletPhysics/bulletTrunk/jam-2.5/newstr.h | 16 + BulletPhysics/bulletTrunk/jam-2.5/option.c | 105 + BulletPhysics/bulletTrunk/jam-2.5/option.h | 25 + BulletPhysics/bulletTrunk/jam-2.5/parse.c | 119 + BulletPhysics/bulletTrunk/jam-2.5/parse.h | 44 + .../bulletTrunk/jam-2.5/patchlevel.h | 5 + BulletPhysics/bulletTrunk/jam-2.5/pathmac.c | 283 + BulletPhysics/bulletTrunk/jam-2.5/pathsys.h | 51 + BulletPhysics/bulletTrunk/jam-2.5/pathunix.c | 235 + BulletPhysics/bulletTrunk/jam-2.5/pathvms.c | 431 + BulletPhysics/bulletTrunk/jam-2.5/regexp.c | 1325 + BulletPhysics/bulletTrunk/jam-2.5/regexp.h | 29 + BulletPhysics/bulletTrunk/jam-2.5/rules.c | 363 + BulletPhysics/bulletTrunk/jam-2.5/rules.h | 180 + BulletPhysics/bulletTrunk/jam-2.5/scan.c | 395 + BulletPhysics/bulletTrunk/jam-2.5/scan.h | 54 + BulletPhysics/bulletTrunk/jam-2.5/search.c | 87 + BulletPhysics/bulletTrunk/jam-2.5/search.h | 13 + BulletPhysics/bulletTrunk/jam-2.5/timestamp.c | 205 + BulletPhysics/bulletTrunk/jam-2.5/timestamp.h | 12 + BulletPhysics/bulletTrunk/jam-2.5/variable.c | 345 + BulletPhysics/bulletTrunk/jam-2.5/variable.h | 27 + BulletPhysics/bulletTrunk/jam-2.5/yyacc | 88 + BulletPhysics/bulletTrunk/jenga.dae | 5632 ++ BulletPhysics/bulletTrunk/lib/readme.txt | 13 + .../bulletTrunk/mk/jam/application.jam | 164 + .../bulletTrunk/mk/jam/assembler.jam | 50 + .../bulletTrunk/mk/jam/bisonflex.jam | 165 + BulletPhysics/bulletTrunk/mk/jam/build.jam | 83 + BulletPhysics/bulletTrunk/mk/jam/clean.jam | 37 + BulletPhysics/bulletTrunk/mk/jam/compiler.jam | 76 + BulletPhysics/bulletTrunk/mk/jam/docs.jam | 688 + BulletPhysics/bulletTrunk/mk/jam/dump.jam | 128 + BulletPhysics/bulletTrunk/mk/jam/flags.jam | 172 + BulletPhysics/bulletTrunk/mk/jam/groups.jam | 61 + BulletPhysics/bulletTrunk/mk/jam/help.jam | 85 + BulletPhysics/bulletTrunk/mk/jam/helper.jam | 594 + BulletPhysics/bulletTrunk/mk/jam/install.jam | 213 + .../bulletTrunk/mk/jam/jamcompatibility.jam | 349 + BulletPhysics/bulletTrunk/mk/jam/library.jam | 323 + BulletPhysics/bulletTrunk/mk/jam/macosx.jam | 354 + BulletPhysics/bulletTrunk/mk/jam/msvcgen.jam | 1558 + .../bulletTrunk/mk/jam/objectivec.jam | 80 + BulletPhysics/bulletTrunk/mk/jam/objects.jam | 250 + BulletPhysics/bulletTrunk/mk/jam/options.jam | 38 + BulletPhysics/bulletTrunk/mk/jam/plugin.jam | 179 + BulletPhysics/bulletTrunk/mk/jam/property.jam | 58 + BulletPhysics/bulletTrunk/mk/jam/resource.jam | 109 + BulletPhysics/bulletTrunk/mk/jam/static.jam | 353 + BulletPhysics/bulletTrunk/mk/jam/strip.jam | 36 + BulletPhysics/bulletTrunk/mk/jam/subdir.jam | 109 + BulletPhysics/bulletTrunk/mk/jam/swig.jam | 225 + BulletPhysics/bulletTrunk/mk/jam/unittest.jam | 576 + BulletPhysics/bulletTrunk/mk/jam/unix.jam | 159 + BulletPhysics/bulletTrunk/mk/jam/variant.jam | 58 + BulletPhysics/bulletTrunk/mk/jam/win32.jam | 563 + .../bulletTrunk/mk/msvcgen/control.tlib | 226 + .../bulletTrunk/mk/msvcgen/macros.tlib | 301 + .../bulletTrunk/mk/msvcgen/project6.tlib | 125 + .../bulletTrunk/mk/msvcgen/project7.tlib | 145 + .../bulletTrunk/mk/msvcgen/projectsn71.tlib | 139 + .../bulletTrunk/mk/msvcgen/projectx6.tlib | 99 + .../bulletTrunk/mk/msvcgen/projectx7.tlib | 175 + .../bulletTrunk/mk/msvcgen/projectxenon8.tlib | 147 + .../bulletTrunk/mk/msvcgen/projectxsn71.tlib | 121 + .../bulletTrunk/mk/msvcgen/workspace6.tlib | 65 + .../bulletTrunk/mk/msvcgen/workspace7.tlib | 66 + .../bulletTrunk/mk/msvcgen/workspacesn71.tlib | 66 + .../mk/msvcgen/workspacexenon8.tlib | 66 + .../bulletTrunk/msvc/6/appAllBulletDemos.dsp | 321 + .../bulletTrunk/msvc/6/appBasicDemo.dsp | 245 + .../bulletTrunk/msvc/6/appBenchmarks.dsp | 245 + .../bulletTrunk/msvc/6/appBspDemo.dsp | 261 + .../bulletTrunk/msvc/6/appBulletDino.dsp | 233 + .../bulletTrunk/msvc/6/appCcdPhysicsDemo.dsp | 245 + .../bulletTrunk/msvc/6/appCharacterDemo.dsp | 269 + .../bulletTrunk/msvc/6/appColladaDemo.dsp | 241 + .../bulletTrunk/msvc/6/appCollisionDemo.dsp | 241 + .../msvc/6/appCollisionInterfaceDemo.dsp | 241 + .../bulletTrunk/msvc/6/appConcaveDemo.dsp | 245 + .../bulletTrunk/msvc/6/appConstraintDemo.dsp | 245 + .../msvc/6/appContinuousConvexCollision.dsp | 241 + .../msvc/6/appConvexDecompositionDemo.dsp | 245 + .../msvc/6/appDoublePrecisionDemo.dsp | 241 + .../bulletTrunk/msvc/6/appEPAPenDepthDemo.dsp | 233 + .../bulletTrunk/msvc/6/appForkLiftDemo.dsp | 245 + .../bulletTrunk/msvc/6/appGPUphysics.dsp | 217 + .../msvc/6/appGenericJointDemo.dsp | 249 + .../bulletTrunk/msvc/6/appGimpactTestDemo.dsp | 253 + .../msvc/6/appGjkConvexCastDemo.dsp | 245 + .../msvc/6/appHeightFieldFluidDemo.dsp | 309 + .../bulletTrunk/msvc/6/appHelloWorld.dsp | 233 + .../msvc/6/appMovingConcaveDemo.dsp | 241 + .../msvc/6/appMultiMaterialDemo.dsp | 245 + .../msvc/6/appMultiThreadedDemo.dsp | 245 + .../bulletTrunk/msvc/6/appRagdollDemo.dsp | 245 + .../bulletTrunk/msvc/6/appRaytracer.dsp | 245 + .../bulletTrunk/msvc/6/appSimplexDemo.dsp | 241 + .../msvc/6/appSliderConstraintDemo.dsp | 245 + .../bulletTrunk/msvc/6/appSoftBodyDemo.dsp | 245 + .../bulletTrunk/msvc/6/appTerrainDemo.dsp | 245 + .../msvc/6/appUserCollisionAlgorithm.dsp | 241 + .../bulletTrunk/msvc/6/appVehicleDemo.dsp | 245 + .../bulletTrunk/msvc/6/appiffCheck.dsp | 233 + .../bulletTrunk/msvc/6/appiffCreateTest.dsp | 233 + .../bulletTrunk/msvc/6/grpall_bullet.dsp | 221 + .../msvc/6/grpall_bullet_corelib.dsp | 221 + .../bulletTrunk/msvc/6/grpapps_bullet.dsp | 221 + .../msvc/6/grpapps_bullet_corelib.dsp | 221 + .../bulletTrunk/msvc/6/grplibs_bullet.dsp | 221 + .../msvc/6/grplibs_bullet_corelib.dsp | 221 + .../msvc/6/libBulletColladaConverter.dsp | 237 + .../bulletTrunk/msvc/6/libExtraSolid35.dsp | 135 + .../bulletTrunk/msvc/6/libGIMPACTUtils.dsp | 229 + .../bulletTrunk/msvc/6/libbulletcollision.dsp | 1021 + .../bulletTrunk/msvc/6/libbulletdynamics.dsp | 393 + .../bulletTrunk/msvc/6/libbulletmath.dsp | 333 + .../msvc/6/libbulletmultithreaded.dsp | 381 + .../msvc/6/libbulletopenglsupport.dsp | 313 + .../bulletTrunk/msvc/6/libbulletsoftbody.dsp | 293 + .../bulletTrunk/msvc/6/libcolladadom.dsp | 1021 + .../msvc/6/libconvexdecomposition.dsp | 345 + BulletPhysics/bulletTrunk/msvc/6/libglui.dsp | 377 + BulletPhysics/bulletTrunk/msvc/6/libiff.dsp | 233 + .../bulletTrunk/msvc/6/liblibxml.dsp | 461 + .../bulletTrunk/msvc/6/wksbullet.dsw | 1352 + .../msvc/7/appAllBulletDemos.vcproj | 523 + .../bulletTrunk/msvc/7/appBasicDemo.vcproj | 466 + .../bulletTrunk/msvc/7/appBenchmarks.vcproj | 466 + .../bulletTrunk/msvc/7/appBspDemo.vcproj | 478 + .../bulletTrunk/msvc/7/appBulletDino.vcproj | 456 + .../msvc/7/appCcdPhysicsDemo.vcproj | 466 + .../msvc/7/appCharacterDemo.vcproj | 484 + .../bulletTrunk/msvc/7/appColladaDemo.vcproj | 463 + .../msvc/7/appCollisionDemo.vcproj | 463 + .../msvc/7/appCollisionInterfaceDemo.vcproj | 463 + .../bulletTrunk/msvc/7/appConcaveDemo.vcproj | 466 + .../msvc/7/appConstraintDemo.vcproj | 466 + .../7/appContinuousConvexCollision.vcproj | 463 + .../msvc/7/appConvexDecompositionDemo.vcproj | 466 + .../msvc/7/appDoublePrecisionDemo.vcproj | 463 + .../msvc/7/appEPAPenDepthDemo.vcproj | 456 + .../bulletTrunk/msvc/7/appForkLiftDemo.vcproj | 466 + .../bulletTrunk/msvc/7/appGPUphysics.vcproj | 343 + .../msvc/7/appGenericJointDemo.vcproj | 469 + .../msvc/7/appGimpactTestDemo.vcproj | 472 + .../msvc/7/appGjkConvexCastDemo.vcproj | 466 + .../msvc/7/appHeightFieldFluidDemo.vcproj | 514 + .../bulletTrunk/msvc/7/appHelloWorld.vcproj | 456 + .../msvc/7/appMovingConcaveDemo.vcproj | 463 + .../msvc/7/appMultiMaterialDemo.vcproj | 466 + .../msvc/7/appMultiThreadedDemo.vcproj | 466 + .../bulletTrunk/msvc/7/appRagdollDemo.vcproj | 466 + .../bulletTrunk/msvc/7/appRaytracer.vcproj | 466 + .../bulletTrunk/msvc/7/appSimplexDemo.vcproj | 463 + .../msvc/7/appSliderConstraintDemo.vcproj | 466 + .../bulletTrunk/msvc/7/appSoftBodyDemo.vcproj | 466 + .../bulletTrunk/msvc/7/appTerrainDemo.vcproj | 466 + .../msvc/7/appUserCollisionAlgorithm.vcproj | 463 + .../bulletTrunk/msvc/7/appVehicleDemo.vcproj | 466 + .../bulletTrunk/msvc/7/appiffCheck.vcproj | 456 + .../msvc/7/appiffCreateTest.vcproj | 456 + .../bulletTrunk/msvc/7/grpall_bullet.vcproj | 429 + .../msvc/7/grpall_bullet_corelib.vcproj | 429 + .../bulletTrunk/msvc/7/grpapps_bullet.vcproj | 429 + .../msvc/7/grpapps_bullet_corelib.vcproj | 429 + .../bulletTrunk/msvc/7/grplibs_bullet.vcproj | 429 + .../msvc/7/grplibs_bullet_corelib.vcproj | 429 + .../msvc/7/libBulletColladaConverter.vcproj | 439 + .../bulletTrunk/msvc/7/libExtraSolid35.vcproj | 190 + .../bulletTrunk/msvc/7/libGIMPACTUtils.vcproj | 432 + .../msvc/7/libbulletcollision.vcproj | 1027 + .../msvc/7/libbulletdynamics.vcproj | 556 + .../bulletTrunk/msvc/7/libbulletmath.vcproj | 511 + .../msvc/7/libbulletmultithreaded.vcproj | 547 + .../msvc/7/libbulletopenglsupport.vcproj | 496 + .../msvc/7/libbulletsoftbody.vcproj | 481 + .../bulletTrunk/msvc/7/libcolladadom.vcproj | 1026 + .../msvc/7/libconvexdecomposition.vcproj | 520 + .../bulletTrunk/msvc/7/libglui.vcproj | 544 + .../bulletTrunk/msvc/7/libiff.vcproj | 435 + .../bulletTrunk/msvc/7/liblibxml.vcproj | 607 + .../bulletTrunk/msvc/7/wksbullet.sln | 975 + .../msvc/71/appAllBulletDemos.vcproj | 523 + .../bulletTrunk/msvc/71/appBasicDemo.vcproj | 466 + .../bulletTrunk/msvc/71/appBenchmarks.vcproj | 466 + .../bulletTrunk/msvc/71/appBspDemo.vcproj | 478 + .../bulletTrunk/msvc/71/appBulletDino.vcproj | 456 + .../msvc/71/appCcdPhysicsDemo.vcproj | 466 + .../msvc/71/appCharacterDemo.vcproj | 484 + .../bulletTrunk/msvc/71/appColladaDemo.vcproj | 463 + .../msvc/71/appCollisionDemo.vcproj | 463 + .../msvc/71/appCollisionInterfaceDemo.vcproj | 463 + .../bulletTrunk/msvc/71/appConcaveDemo.vcproj | 466 + .../msvc/71/appConstraintDemo.vcproj | 466 + .../71/appContinuousConvexCollision.vcproj | 463 + .../msvc/71/appConvexDecompositionDemo.vcproj | 466 + .../msvc/71/appDoublePrecisionDemo.vcproj | 463 + .../msvc/71/appEPAPenDepthDemo.vcproj | 456 + .../msvc/71/appForkLiftDemo.vcproj | 466 + .../bulletTrunk/msvc/71/appGPUphysics.vcproj | 343 + .../msvc/71/appGenericJointDemo.vcproj | 469 + .../msvc/71/appGimpactTestDemo.vcproj | 472 + .../msvc/71/appGjkConvexCastDemo.vcproj | 466 + .../msvc/71/appHeightFieldFluidDemo.vcproj | 514 + .../bulletTrunk/msvc/71/appHelloWorld.vcproj | 456 + .../msvc/71/appMovingConcaveDemo.vcproj | 463 + .../msvc/71/appMultiMaterialDemo.vcproj | 466 + .../msvc/71/appMultiThreadedDemo.vcproj | 466 + .../bulletTrunk/msvc/71/appRagdollDemo.vcproj | 466 + .../bulletTrunk/msvc/71/appRaytracer.vcproj | 466 + .../bulletTrunk/msvc/71/appSimplexDemo.vcproj | 463 + .../msvc/71/appSliderConstraintDemo.vcproj | 466 + .../msvc/71/appSoftBodyDemo.vcproj | 466 + .../bulletTrunk/msvc/71/appTerrainDemo.vcproj | 466 + .../msvc/71/appUserCollisionAlgorithm.vcproj | 463 + .../bulletTrunk/msvc/71/appVehicleDemo.vcproj | 466 + .../bulletTrunk/msvc/71/appiffCheck.vcproj | 456 + .../msvc/71/appiffCreateTest.vcproj | 456 + .../bulletTrunk/msvc/71/grpall_bullet.vcproj | 429 + .../msvc/71/grpall_bullet_corelib.vcproj | 429 + .../bulletTrunk/msvc/71/grpapps_bullet.vcproj | 429 + .../msvc/71/grpapps_bullet_corelib.vcproj | 429 + .../bulletTrunk/msvc/71/grplibs_bullet.vcproj | 429 + .../msvc/71/grplibs_bullet_corelib.vcproj | 429 + .../msvc/71/libBulletColladaConverter.vcproj | 439 + .../msvc/71/libGIMPACTUtils.vcproj | 432 + .../msvc/71/libbulletcollision.vcproj | 1027 + .../msvc/71/libbulletdynamics.vcproj | 556 + .../bulletTrunk/msvc/71/libbulletmath.vcproj | 511 + .../msvc/71/libbulletmultithreaded.vcproj | 547 + .../msvc/71/libbulletopenglsupport.vcproj | 496 + .../msvc/71/libbulletsoftbody.vcproj | 481 + .../bulletTrunk/msvc/71/libcolladadom.vcproj | 1026 + .../msvc/71/libconvexdecomposition.vcproj | 520 + .../bulletTrunk/msvc/71/libglui.vcproj | 544 + .../bulletTrunk/msvc/71/libiff.vcproj | 435 + .../bulletTrunk/msvc/71/liblibxml.vcproj | 607 + .../bulletTrunk/msvc/71/wksbullet.sln | 975 + .../msvc/8/appAllBulletDemos.vcproj | 731 + .../bulletTrunk/msvc/8/appBasicDemo.vcproj | 655 + .../bulletTrunk/msvc/8/appBenchmarks.vcproj | 655 + .../bulletTrunk/msvc/8/appBspDemo.vcproj | 671 + .../bulletTrunk/msvc/8/appBulletDino.vcproj | 643 + .../msvc/8/appCcdPhysicsDemo.vcproj | 655 + .../msvc/8/appCharacterDemo.vcproj | 679 + .../bulletTrunk/msvc/8/appColladaDemo.vcproj | 651 + .../msvc/8/appCollisionDemo.vcproj | 651 + .../msvc/8/appCollisionInterfaceDemo.vcproj | 651 + .../bulletTrunk/msvc/8/appConcaveDemo.vcproj | 655 + .../msvc/8/appConstraintDemo.vcproj | 655 + .../8/appContinuousConvexCollision.vcproj | 651 + .../msvc/8/appConvexDecompositionDemo.vcproj | 655 + .../msvc/8/appDoublePrecisionDemo.vcproj | 651 + .../msvc/8/appEPAPenDepthDemo.vcproj | 643 + .../bulletTrunk/msvc/8/appForkLiftDemo.vcproj | 655 + .../bulletTrunk/msvc/8/appGPUphysics.vcproj | 343 + .../msvc/8/appGenericJointDemo.vcproj | 659 + .../msvc/8/appGimpactTestDemo.vcproj | 663 + .../msvc/8/appGjkConvexCastDemo.vcproj | 655 + .../msvc/8/appHeightFieldFluidDemo.vcproj | 719 + .../bulletTrunk/msvc/8/appHelloWorld.vcproj | 643 + .../msvc/8/appMovingConcaveDemo.vcproj | 651 + .../msvc/8/appMultiMaterialDemo.vcproj | 655 + .../msvc/8/appMultiThreadedDemo.vcproj | 655 + .../bulletTrunk/msvc/8/appRagdollDemo.vcproj | 655 + .../bulletTrunk/msvc/8/appRaytracer.vcproj | 655 + .../bulletTrunk/msvc/8/appSimplexDemo.vcproj | 651 + .../msvc/8/appSliderConstraintDemo.vcproj | 655 + .../bulletTrunk/msvc/8/appSoftBodyDemo.vcproj | 655 + .../bulletTrunk/msvc/8/appTerrainDemo.vcproj | 655 + .../msvc/8/appUserCollisionAlgorithm.vcproj | 651 + .../bulletTrunk/msvc/8/appVehicleDemo.vcproj | 655 + .../bulletTrunk/msvc/8/appiffCheck.vcproj | 643 + .../msvc/8/appiffCreateTest.vcproj | 643 + .../bulletTrunk/msvc/8/grpall_bullet.vcproj | 514 + .../msvc/8/grpall_bullet_corelib.vcproj | 429 + .../bulletTrunk/msvc/8/grpapps_bullet.vcproj | 514 + .../msvc/8/grpapps_bullet_corelib.vcproj | 429 + .../bulletTrunk/msvc/8/grplibs_bullet.vcproj | 514 + .../msvc/8/grplibs_bullet_corelib.vcproj | 429 + .../msvc/8/libBulletColladaConverter.vcproj | 528 + .../bulletTrunk/msvc/8/libExtraSolid35.vcproj | 190 + .../bulletTrunk/msvc/8/libGIMPACTUtils.vcproj | 520 + .../msvc/8/libbulletcollision.vcproj | 1313 + .../msvc/8/libbulletdynamics.vcproj | 685 + .../bulletTrunk/msvc/8/libbulletmath.vcproj | 624 + .../msvc/8/libbulletmultithreaded.vcproj | 672 + .../bulletTrunk/msvc/8/libbulletnet.vcproj | 444 + .../msvc/8/libbulletopenglsupport.vcproj | 604 + .../msvc/8/libbulletsoftbody.vcproj | 584 + .../bulletTrunk/msvc/8/libcolladadom.vcproj | 1312 + .../msvc/8/libconvexdecomposition.vcproj | 636 + .../bulletTrunk/msvc/8/libglui.vcproj | 668 + .../bulletTrunk/msvc/8/libiff.vcproj | 524 + .../bulletTrunk/msvc/8/liblibxml.vcproj | 752 + .../bulletTrunk/msvc/8/wksbullet.sln | 1067 + .../bulletTrunk/msvc/appAllBulletDemos.rc | 30 + .../bulletTrunk/msvc/appBasicDemo.rc | 30 + .../bulletTrunk/msvc/appBenchmarks.rc | 30 + BulletPhysics/bulletTrunk/msvc/appBspDemo.rc | 30 + .../bulletTrunk/msvc/appBulletDino.rc | 30 + .../bulletTrunk/msvc/appCcdPhysicsDemo.rc | 30 + .../bulletTrunk/msvc/appCharacterDemo.rc | 30 + .../bulletTrunk/msvc/appColladaDemo.rc | 30 + .../bulletTrunk/msvc/appCollisionDemo.rc | 30 + .../msvc/appCollisionInterfaceDemo.rc | 30 + .../bulletTrunk/msvc/appConcaveDemo.rc | 30 + .../bulletTrunk/msvc/appConstraintDemo.rc | 30 + .../msvc/appContinuousConvexCollision.rc | 30 + .../msvc/appConvexDecompositionDemo.rc | 30 + .../msvc/appDoublePrecisionDemo.rc | 30 + .../bulletTrunk/msvc/appEPAPenDepthDemo.rc | 30 + .../bulletTrunk/msvc/appForkLiftDemo.rc | 30 + .../bulletTrunk/msvc/appGPUphysics.rc | 30 + .../bulletTrunk/msvc/appGenericJointDemo.rc | 30 + .../bulletTrunk/msvc/appGimpactTestDemo.rc | 30 + .../bulletTrunk/msvc/appGjkConvexCastDemo.rc | 30 + .../msvc/appHeightFieldFluidDemo.rc | 30 + .../bulletTrunk/msvc/appHelloWorld.rc | 30 + .../bulletTrunk/msvc/appMovingConcaveDemo.rc | 30 + .../bulletTrunk/msvc/appMultiMaterialDemo.rc | 30 + .../bulletTrunk/msvc/appMultiThreadedDemo.rc | 30 + .../bulletTrunk/msvc/appRagdollDemo.rc | 30 + .../bulletTrunk/msvc/appRaytracer.rc | 30 + .../bulletTrunk/msvc/appSimplexDemo.rc | 30 + .../msvc/appSliderConstraintDemo.rc | 30 + .../bulletTrunk/msvc/appSoftBodyDemo.rc | 30 + .../bulletTrunk/msvc/appTerrainDemo.rc | 30 + .../msvc/appUserCollisionAlgorithm.rc | 30 + .../bulletTrunk/msvc/appVehicleDemo.rc | 30 + BulletPhysics/bulletTrunk/msvc/appiffCheck.rc | 30 + .../bulletTrunk/msvc/appiffCreateTest.rc | 30 + .../bulletTrunk/msvc/autoexp_dat.txt | 66 + BulletPhysics/bulletTrunk/msvc/bullet_ico.ico | Bin 0 -> 21630 bytes BulletPhysics/bulletTrunk/src/Bullet-C-Api.h | 176 + .../BroadphaseCollision/btAxisSweep3.cpp | 37 + .../BroadphaseCollision/btAxisSweep3.h | 1024 + .../btBroadphaseInterface.h | 74 + .../BroadphaseCollision/btBroadphaseProxy.cpp | 17 + .../BroadphaseCollision/btBroadphaseProxy.h | 251 + .../btCollisionAlgorithm.cpp | 23 + .../btCollisionAlgorithm.h | 80 + .../BroadphaseCollision/btDbvt.cpp | 1295 + .../BroadphaseCollision/btDbvt.h | 1255 + .../BroadphaseCollision/btDbvtBroadphase.cpp | 727 + .../BroadphaseCollision/btDbvtBroadphase.h | 126 + .../BroadphaseCollision/btDispatcher.cpp | 22 + .../BroadphaseCollision/btDispatcher.h | 106 + .../btMultiSapBroadphase.cpp | 489 + .../btMultiSapBroadphase.h | 151 + .../btOverlappingPairCache.cpp | 633 + .../btOverlappingPairCache.h | 468 + .../btOverlappingPairCallback.h | 40 + .../BroadphaseCollision/btQuantizedBvh.cpp | 1148 + .../BroadphaseCollision/btQuantizedBvh.h | 473 + .../btSimpleBroadphase.cpp | 330 + .../BroadphaseCollision/btSimpleBroadphase.h | 170 + .../src/BulletCollision/CMakeLists.txt | 234 + .../SphereTriangleDetector.cpp | 209 + .../SphereTriangleDetector.h | 49 + .../btActivatingCollisionAlgorithm.cpp | 47 + .../btActivatingCollisionAlgorithm.h | 36 + .../btBoxBoxCollisionAlgorithm.cpp | 85 + .../btBoxBoxCollisionAlgorithm.h | 66 + .../CollisionDispatch/btBoxBoxDetector.cpp | 689 + .../CollisionDispatch/btBoxBoxDetector.h | 44 + .../btCollisionConfiguration.h | 47 + .../CollisionDispatch/btCollisionCreateFunc.h | 45 + .../btCollisionDispatcher.cpp | 303 + .../CollisionDispatch/btCollisionDispatcher.h | 147 + .../CollisionDispatch/btCollisionObject.cpp | 68 + .../CollisionDispatch/btCollisionObject.h | 421 + .../CollisionDispatch/btCollisionWorld.cpp | 835 + .../CollisionDispatch/btCollisionWorld.h | 410 + .../btCompoundCollisionAlgorithm.cpp | 342 + .../btCompoundCollisionAlgorithm.h | 86 + .../btConvexConcaveCollisionAlgorithm.cpp | 317 + .../btConvexConcaveCollisionAlgorithm.h | 116 + .../btConvexConvexAlgorithm.cpp | 396 + .../btConvexConvexAlgorithm.h | 108 + .../btConvexPlaneCollisionAlgorithm.cpp | 155 + .../btConvexPlaneCollisionAlgorithm.h | 84 + .../btDefaultCollisionConfiguration.cpp | 297 + .../btDefaultCollisionConfiguration.h | 126 + .../btEmptyCollisionAlgorithm.cpp | 34 + .../btEmptyCollisionAlgorithm.h | 54 + .../CollisionDispatch/btGhostObject.cpp | 171 + .../CollisionDispatch/btGhostObject.h | 174 + .../CollisionDispatch/btManifoldResult.cpp | 119 + .../CollisionDispatch/btManifoldResult.h | 105 + .../btSimulationIslandManager.cpp | 390 + .../btSimulationIslandManager.h | 81 + .../btSphereBoxCollisionAlgorithm.cpp | 260 + .../btSphereBoxCollisionAlgorithm.h | 75 + .../btSphereSphereCollisionAlgorithm.cpp | 105 + .../btSphereSphereCollisionAlgorithm.h | 66 + .../btSphereTriangleCollisionAlgorithm.cpp | 84 + .../btSphereTriangleCollisionAlgorithm.h | 69 + .../CollisionDispatch/btUnionFind.cpp | 81 + .../CollisionDispatch/btUnionFind.h | 124 + .../CollisionShapes/btBoxShape.cpp | 42 + .../CollisionShapes/btBoxShape.h | 317 + .../btBvhTriangleMeshShape.cpp | 374 + .../CollisionShapes/btBvhTriangleMeshShape.h | 86 + .../CollisionShapes/btCapsuleShape.cpp | 171 + .../CollisionShapes/btCapsuleShape.h | 118 + .../CollisionShapes/btCollisionMargin.h | 26 + .../CollisionShapes/btCollisionShape.cpp | 98 + .../CollisionShapes/btCollisionShape.h | 112 + .../CollisionShapes/btCompoundShape.cpp | 273 + .../CollisionShapes/btCompoundShape.h | 172 + .../CollisionShapes/btConcaveShape.cpp | 28 + .../CollisionShapes/btConcaveShape.h | 60 + .../CollisionShapes/btConeShape.cpp | 133 + .../CollisionShapes/btConeShape.h | 100 + .../CollisionShapes/btConvexHullShape.cpp | 187 + .../CollisionShapes/btConvexHullShape.h | 95 + .../CollisionShapes/btConvexInternalShape.cpp | 81 + .../CollisionShapes/btConvexInternalShape.h | 93 + .../btConvexPointCloudShape.cpp | 156 + .../CollisionShapes/btConvexPointCloudShape.h | 96 + .../CollisionShapes/btConvexShape.cpp | 379 + .../CollisionShapes/btConvexShape.h | 82 + .../btConvexTriangleMeshShape.cpp | 314 + .../btConvexTriangleMeshShape.h | 61 + .../CollisionShapes/btCylinderShape.cpp | 206 + .../CollisionShapes/btCylinderShape.h | 134 + .../CollisionShapes/btEmptyShape.cpp | 50 + .../CollisionShapes/btEmptyShape.h | 70 + .../btHeightfieldTerrainShape.cpp | 411 + .../btHeightfieldTerrainShape.h | 161 + .../CollisionShapes/btMaterial.h | 34 + .../CollisionShapes/btMinkowskiSumShape.cpp | 59 + .../CollisionShapes/btMinkowskiSumShape.h | 60 + .../CollisionShapes/btMultiSphereShape.cpp | 149 + .../CollisionShapes/btMultiSphereShape.h | 74 + .../btMultimaterialTriangleMeshShape.cpp | 45 + .../btMultimaterialTriangleMeshShape.h | 123 + .../CollisionShapes/btOptimizedBvh.cpp | 390 + .../CollisionShapes/btOptimizedBvh.h | 63 + .../btPolyhedralConvexShape.cpp | 185 + .../CollisionShapes/btPolyhedralConvexShape.h | 90 + .../btScaledBvhTriangleMeshShape.cpp | 120 + .../btScaledBvhTriangleMeshShape.h | 62 + .../CollisionShapes/btShapeHull.cpp | 164 + .../CollisionShapes/btShapeHull.h | 56 + .../CollisionShapes/btSphereShape.cpp | 71 + .../CollisionShapes/btSphereShape.h | 74 + .../CollisionShapes/btStaticPlaneShape.cpp | 107 + .../CollisionShapes/btStaticPlaneShape.h | 64 + .../btStridingMeshInterface.cpp | 124 + .../CollisionShapes/btStridingMeshInterface.h | 96 + .../CollisionShapes/btTetrahedronShape.cpp | 200 + .../CollisionShapes/btTetrahedronShape.h | 74 + .../CollisionShapes/btTriangleBuffer.cpp | 35 + .../CollisionShapes/btTriangleBuffer.h | 69 + .../CollisionShapes/btTriangleCallback.cpp | 28 + .../CollisionShapes/btTriangleCallback.h | 42 + .../btTriangleIndexVertexArray.cpp | 99 + .../btTriangleIndexVertexArray.h | 115 + .../btTriangleIndexVertexMaterialArray.cpp | 87 + .../btTriangleIndexVertexMaterialArray.h | 84 + .../CollisionShapes/btTriangleMesh.cpp | 139 + .../CollisionShapes/btTriangleMesh.h | 69 + .../CollisionShapes/btTriangleMeshShape.cpp | 209 + .../CollisionShapes/btTriangleMeshShape.h | 85 + .../CollisionShapes/btTriangleShape.h | 174 + .../CollisionShapes/btUniformScalingShape.cpp | 115 + .../CollisionShapes/btUniformScalingShape.h | 87 + .../bulletTrunk/src/BulletCollision/Doxyfile | 746 + .../BulletCollision/Gimpact/btBoxCollision.h | 647 + .../BulletCollision/Gimpact/btClipPolygon.h | 182 + .../Gimpact/btContactProcessing.cpp | 181 + .../Gimpact/btContactProcessing.h | 145 + .../BulletCollision/Gimpact/btGImpactBvh.cpp | 498 + .../BulletCollision/Gimpact/btGImpactBvh.h | 394 + .../Gimpact/btGImpactCollisionAlgorithm.cpp | 897 + .../Gimpact/btGImpactCollisionAlgorithm.h | 306 + .../Gimpact/btGImpactMassUtil.h | 60 + .../Gimpact/btGImpactQuantizedBvh.cpp | 528 + .../Gimpact/btGImpactQuantizedBvh.h | 372 + .../Gimpact/btGImpactShape.cpp | 183 + .../BulletCollision/Gimpact/btGImpactShape.h | 1122 + .../Gimpact/btGenericPoolAllocator.cpp | 283 + .../Gimpact/btGenericPoolAllocator.h | 163 + .../Gimpact/btGeometryOperations.h | 212 + .../BulletCollision/Gimpact/btQuantization.h | 88 + .../Gimpact/btTriangleShapeEx.cpp | 218 + .../Gimpact/btTriangleShapeEx.h | 180 + .../src/BulletCollision/Gimpact/gim_array.h | 326 + .../Gimpact/gim_basic_geometry_operations.h | 543 + .../src/BulletCollision/Gimpact/gim_bitset.h | 123 + .../Gimpact/gim_box_collision.h | 590 + .../BulletCollision/Gimpact/gim_box_set.cpp | 182 + .../src/BulletCollision/Gimpact/gim_box_set.h | 671 + .../Gimpact/gim_clip_polygon.h | 210 + .../BulletCollision/Gimpact/gim_contact.cpp | 146 + .../src/BulletCollision/Gimpact/gim_contact.h | 164 + .../BulletCollision/Gimpact/gim_geom_types.h | 97 + .../BulletCollision/Gimpact/gim_geometry.h | 42 + .../BulletCollision/Gimpact/gim_hash_table.h | 902 + .../BulletCollision/Gimpact/gim_linear_math.h | 1573 + .../src/BulletCollision/Gimpact/gim_math.h | 157 + .../BulletCollision/Gimpact/gim_memory.cpp | 135 + .../src/BulletCollision/Gimpact/gim_memory.h | 190 + .../BulletCollision/Gimpact/gim_radixsort.h | 406 + .../Gimpact/gim_tri_collision.cpp | 640 + .../Gimpact/gim_tri_collision.h | 379 + .../bulletTrunk/src/BulletCollision/Jamfile | 14 + .../btContinuousConvexCollision.cpp | 227 + .../btContinuousConvexCollision.h | 52 + .../NarrowPhaseCollision/btConvexCast.cpp | 20 + .../NarrowPhaseCollision/btConvexCast.h | 73 + .../btConvexPenetrationDepthSolver.h | 42 + .../btDiscreteCollisionDetectorInterface.h | 88 + .../NarrowPhaseCollision/btGjkConvexCast.cpp | 176 + .../NarrowPhaseCollision/btGjkConvexCast.h | 50 + .../NarrowPhaseCollision/btGjkEpa2.cpp | 943 + .../NarrowPhaseCollision/btGjkEpa2.h | 71 + .../btGjkEpaPenetrationDepthSolver.cpp | 54 + .../btGjkEpaPenetrationDepthSolver.h | 39 + .../btGjkPairDetector.cpp | 364 + .../NarrowPhaseCollision/btGjkPairDetector.h | 94 + .../NarrowPhaseCollision/btManifoldPoint.h | 125 + .../btMinkowskiPenetrationDepthSolver.cpp | 334 + .../btMinkowskiPenetrationDepthSolver.h | 36 + .../btPersistentManifold.cpp | 259 + .../btPersistentManifold.h | 203 + .../NarrowPhaseCollision/btPointCollector.h | 61 + .../btRaycastCallback.cpp | 175 + .../NarrowPhaseCollision/btRaycastCallback.h | 71 + .../btSimplexSolverInterface.h | 63 + .../btSubSimplexConvexCast.cpp | 157 + .../btSubSimplexConvexCast.h | 50 + .../btVoronoiSimplexSolver.cpp | 605 + .../btVoronoiSimplexSolver.h | 157 + .../src/BulletCollision/ibmsdk/Makefile | 112 + .../src/BulletDynamics/CMakeLists.txt | 93 + .../btCharacterControllerInterface.h | 44 + .../btKinematicCharacterController.cpp | 476 + .../btKinematicCharacterController.h | 127 + .../btConeTwistConstraint.cpp | 989 + .../ConstraintSolver/btConeTwistConstraint.h | 229 + .../ConstraintSolver/btConstraintSolver.h | 52 + .../ConstraintSolver/btContactConstraint.cpp | 429 + .../ConstraintSolver/btContactConstraint.h | 122 + .../ConstraintSolver/btContactSolverInfo.h | 85 + .../btGeneric6DofConstraint.cpp | 829 + .../btGeneric6DofConstraint.h | 480 + .../ConstraintSolver/btHingeConstraint.cpp | 666 + .../ConstraintSolver/btHingeConstraint.h | 178 + .../ConstraintSolver/btJacobianEntry.h | 156 + .../btPoint2PointConstraint.cpp | 230 + .../btPoint2PointConstraint.h | 98 + .../btSequentialImpulseConstraintSolver.cpp | 1027 + .../btSequentialImpulseConstraintSolver.h | 101 + .../ConstraintSolver/btSliderConstraint.cpp | 817 + .../ConstraintSolver/btSliderConstraint.h | 229 + .../btSolve2LinearConstraint.cpp | 255 + .../btSolve2LinearConstraint.h | 107 + .../ConstraintSolver/btSolverBody.h | 179 + .../ConstraintSolver/btSolverConstraint.h | 94 + .../ConstraintSolver/btTypedConstraint.cpp | 114 + .../ConstraintSolver/btTypedConstraint.h | 176 + .../BulletDynamics/Dynamics/Bullet-C-API.cpp | 408 + .../Dynamics/btActionInterface.h | 39 + .../Dynamics/btContinuousDynamicsWorld.cpp | 192 + .../Dynamics/btContinuousDynamicsWorld.h | 46 + .../Dynamics/btDiscreteDynamicsWorld.cpp | 1404 + .../Dynamics/btDiscreteDynamicsWorld.h | 179 + .../BulletDynamics/Dynamics/btDynamicsWorld.h | 141 + .../BulletDynamics/Dynamics/btRigidBody.cpp | 317 + .../src/BulletDynamics/Dynamics/btRigidBody.h | 503 + .../Dynamics/btSimpleDynamicsWorld.cpp | 243 + .../Dynamics/btSimpleDynamicsWorld.h | 78 + .../bulletTrunk/src/BulletDynamics/Jamfile | 13 + .../Vehicle/btRaycastVehicle.cpp | 758 + .../BulletDynamics/Vehicle/btRaycastVehicle.h | 209 + .../Vehicle/btVehicleRaycaster.h | 35 + .../BulletDynamics/Vehicle/btWheelInfo.cpp | 56 + .../src/BulletDynamics/Vehicle/btWheelInfo.h | 116 + .../src/BulletDynamics/ibmsdk/Makefile | 53 + .../src/BulletMultiThreaded/CMakeLists.txt | 73 + .../src/BulletMultiThreaded/Jamfile | 14 + .../src/BulletMultiThreaded/Makefile.original | 187 + .../BulletMultiThreaded/PlatformDefinitions.h | 82 + .../PosixThreadSupport.cpp | 249 + .../BulletMultiThreaded/PosixThreadSupport.h | 121 + .../src/BulletMultiThreaded/PpuAddressSpace.h | 18 + .../SequentialThreadSupport.cpp | 93 + .../SequentialThreadSupport.h | 87 + .../BulletMultiThreaded/SpuBatchRaycaster.cpp | 151 + .../BulletMultiThreaded/SpuBatchRaycaster.h | 49 + .../SpuCollisionObjectWrapper.cpp | 48 + .../SpuCollisionObjectWrapper.h | 35 + .../SpuCollisionTaskProcess.cpp | 304 + .../SpuCollisionTaskProcess.h | 154 + .../SpuContactManifoldCollisionAlgorithm.cpp | 69 + .../SpuContactManifoldCollisionAlgorithm.h | 120 + .../src/BulletMultiThreaded/SpuDoubleBuffer.h | 107 + .../src/BulletMultiThreaded/SpuFakeDma.cpp | 209 + .../src/BulletMultiThreaded/SpuFakeDma.h | 135 + .../SpuGatheringCollisionDispatcher.cpp | 219 + .../SpuGatheringCollisionDispatcher.h | 69 + .../SpuIntegrationTask/readme.txt | 1 + .../BulletMultiThreaded/SpuLibspe2Support.cpp | 257 + .../BulletMultiThreaded/SpuLibspe2Support.h | 180 + .../SpuNarrowPhaseCollisionTask/Box.h | 164 + .../SpuCollisionShapes.cpp | 542 + .../SpuCollisionShapes.h | 125 + .../SpuContactResult.cpp | 231 + .../SpuContactResult.h | 112 + .../SpuConvexPenetrationDepthSolver.h | 51 + .../SpuEpaPenetrationDepthSolver.cpp | 37 + .../SpuEpaPenetrationDepthSolver.h | 47 + .../SpuGatheringCollisionTask.cpp | 1160 + .../SpuGatheringCollisionTask.h | 140 + .../SpuGjkEpa2.cpp | 851 + .../SpuNarrowPhaseCollisionTask/SpuGjkEpa2.h | 38 + .../SpuGjkPairDetector.cpp | 316 + .../SpuGjkPairDetector.h | 103 + .../SpuLocalSupport.h | 19 + .../SpuMinkowskiPenetrationDepthSolver.cpp | 347 + .../SpuMinkowskiPenetrationDepthSolver.h | 47 + .../SpuPreferredPenetrationDirections.h | 70 + .../SpuVoronoiSimplexSolver.cpp | 605 + .../SpuVoronoiSimplexSolver.h | 155 + .../boxBoxDistance.cpp | 1155 + .../boxBoxDistance.h | 66 + .../SpuNarrowPhaseCollisionTask/readme.txt | 1 + .../BulletMultiThreaded/SpuParallelSolver.cpp | 643 + .../BulletMultiThreaded/SpuParallelSolver.h | 75 + .../SpuRaycastTask/SpuRaycastTask.cpp | 786 + .../SpuRaycastTask/SpuRaycastTask.h | 50 + .../SpuSubSimplexConvexCast.cpp | 152 + .../SpuRaycastTask/SpuSubSimplexConvexCast.h | 60 + .../SpuRaycastTaskProcess.cpp | 189 + .../SpuRaycastTaskProcess.h | 72 + .../SpuSampleTask/SpuSampleTask.cpp | 214 + .../SpuSampleTask/SpuSampleTask.h | 54 + .../SpuSampleTask/readme.txt | 1 + .../SpuSampleTaskProcess.cpp | 222 + .../SpuSampleTaskProcess.h | 153 + .../SpuSolverTask/SpuParallellSolverTask.cpp | 2153 + .../SpuSolverTask/SpuParallellSolverTask.h | 183 + .../src/BulletMultiThreaded/SpuSync.h | 148 + .../Win32ThreadSupport.cpp | 259 + .../BulletMultiThreaded/Win32ThreadSupport.h | 125 + .../btThreadSupportInterface.cpp | 22 + .../btThreadSupportInterface.h | 48 + .../vectormath/scalar/cpp/mat_aos.h | 1643 + .../vectormath/scalar/cpp/quat_aos.h | 432 + .../vectormath/scalar/cpp/vec_aos.h | 1173 + .../vectormath/scalar/cpp/vectormath_aos.h | 1809 + .../BulletMultiThreaded/vectormath2bullet.h | 73 + .../src/BulletSoftBody/CMakeLists.txt | 43 + .../bulletTrunk/src/BulletSoftBody/Jamfile | 9 + .../src/BulletSoftBody/btSoftBody.cpp | 2697 + .../src/BulletSoftBody/btSoftBody.h | 848 + .../btSoftBodyConcaveCollisionAlgorithm.cpp | 369 + .../btSoftBodyConcaveCollisionAlgorithm.h | 153 + .../src/BulletSoftBody/btSoftBodyHelpers.cpp | 859 + .../src/BulletSoftBody/btSoftBodyHelpers.h | 119 + .../src/BulletSoftBody/btSoftBodyInternals.h | 914 + ...oftBodyRigidBodyCollisionConfiguration.cpp | 134 + ...tSoftBodyRigidBodyCollisionConfiguration.h | 48 + .../btSoftRigidCollisionAlgorithm.cpp | 82 + .../btSoftRigidCollisionAlgorithm.h | 75 + .../btSoftRigidDynamicsWorld.cpp | 142 + .../BulletSoftBody/btSoftRigidDynamicsWorld.h | 82 + .../btSoftSoftCollisionAlgorithm.cpp | 46 + .../btSoftSoftCollisionAlgorithm.h | 69 + .../src/BulletSoftBody/btSparseSDF.h | 306 + BulletPhysics/bulletTrunk/src/CMakeLists.txt | 11 + BulletPhysics/bulletTrunk/src/Jamfile | 7 + .../bulletTrunk/src/LinearMath/CMakeLists.txt | 51 + .../bulletTrunk/src/LinearMath/Jamfile | 10 + .../bulletTrunk/src/LinearMath/btAabbUtil2.h | 236 + .../src/LinearMath/btAlignedAllocator.cpp | 205 + .../src/LinearMath/btAlignedAllocator.h | 107 + .../src/LinearMath/btAlignedObjectArray.h | 442 + .../src/LinearMath/btConvexHull.cpp | 1174 + .../bulletTrunk/src/LinearMath/btConvexHull.h | 241 + .../src/LinearMath/btDefaultMotionState.h | 38 + .../src/LinearMath/btGeometryUtil.cpp | 185 + .../src/LinearMath/btGeometryUtil.h | 42 + .../bulletTrunk/src/LinearMath/btHashMap.h | 303 + .../bulletTrunk/src/LinearMath/btIDebugDraw.h | 297 + .../bulletTrunk/src/LinearMath/btList.h | 73 + .../bulletTrunk/src/LinearMath/btMatrix3x3.h | 618 + .../bulletTrunk/src/LinearMath/btMinMax.h | 69 + .../src/LinearMath/btMotionState.h | 40 + .../src/LinearMath/btPoolAllocator.h | 102 + .../bulletTrunk/src/LinearMath/btQuadWord.h | 180 + .../bulletTrunk/src/LinearMath/btQuaternion.h | 401 + .../src/LinearMath/btQuickprof.cpp | 346 + .../bulletTrunk/src/LinearMath/btQuickprof.h | 370 + .../bulletTrunk/src/LinearMath/btRandom.h | 42 + .../bulletTrunk/src/LinearMath/btScalar.h | 439 + .../bulletTrunk/src/LinearMath/btStackAlloc.h | 116 + .../bulletTrunk/src/LinearMath/btTransform.h | 243 + .../src/LinearMath/btTransformUtil.h | 247 + .../bulletTrunk/src/LinearMath/btVector3.h | 638 + .../src/LinearMath/ibmsdk/Makefile | 39 + BulletPhysics/bulletTrunk/src/Makefile.am | 552 + .../bulletTrunk/src/btBulletCollisionCommon.h | 66 + .../bulletTrunk/src/btBulletDynamicsCommon.h | 46 + BulletPhysics/bulletTrunk/src/ibmsdk/Makefile | 16 + .../ClosestNotMeRaycastResultCallback_net.cpp | 74 + .../ClosestNotMeRaycastResultCallback_net.h | 9 + .../bulletTrunk/src/libbulletnet/Makefile | 67 + .../src/libbulletnet/btAxisSweep3_net.cpp | 29 + .../src/libbulletnet/btAxisSweep3_net.h | 9 + .../src/libbulletnet/btBoxShape_net.cpp | 60 + .../src/libbulletnet/btBoxShape_net.h | 15 + .../src/libbulletnet/btCapsuleShape_net.cpp | 26 + .../src/libbulletnet/btCapsuleShape_net.h | 9 + .../btCollisionDispatcher_net.cpp | 27 + .../libbulletnet/btCollisionDispatcher_net.h | 10 + .../libbulletnet/btCollisionObject_net.cpp | 266 + .../src/libbulletnet/btCollisionObject_net.h | 57 + .../src/libbulletnet/btCollisionShape_net.cpp | 95 + .../src/libbulletnet/btCollisionShape_net.h | 22 + .../src/libbulletnet/btCollisionWorld_net.cpp | 42 + .../src/libbulletnet/btCollisionWorld_net.h | 14 + .../btDefaultCollisionConfiguration_net.cpp | 16 + .../btDefaultCollisionConfiguration_net.h | 8 + .../libbulletnet/btDefaultMotionState_net.cpp | 43 + .../libbulletnet/btDefaultMotionState_net.h | 11 + .../btDiscreteDynamicsWorld_net.cpp | 48 + .../btDiscreteDynamicsWorld_net.h | 13 + .../libbulletnet/btGImpactMeshShape_net.cpp | 22 + .../src/libbulletnet/btGImpactMeshShape_net.h | 8 + .../btGeneric6DofConstraint_net.cpp | 64 + .../btGeneric6DofConstraint_net.h | 20 + .../src/libbulletnet/btGhostObject_net.cpp | 44 + .../src/libbulletnet/btGhostObject_net.h | 11 + .../btHeightfieldTerrainShape_net.cpp | 32 + .../btHeightfieldTerrainShape_net.h | 10 + .../btKinematicCharacterController.h | 9 + .../src/libbulletnet/btMatrix3x3_net.cpp | 71 + .../src/libbulletnet/btMatrix3x3_net.h | 18 + .../src/libbulletnet/btMotionState_net.cpp | 26 + .../src/libbulletnet/btMotionState_net.h | 8 + .../src/libbulletnet/btQuaternion_net.cpp | 129 + .../src/libbulletnet/btQuaternion_net.h | 32 + .../btRigidBodyConstructionInfo_net.cpp | 47 + .../btRigidBodyConstructionInfo_net.h | 14 + .../src/libbulletnet/btRigidBody_net.cpp | 221 + .../src/libbulletnet/btRigidBody_net.h | 49 + ...tSequentialImpulseConstraintSolver_net.cpp | 16 + .../btSequentialImpulseConstraintSolver_net.h | 8 + .../src/libbulletnet/btSphereShape_net.cpp | 33 + .../src/libbulletnet/btSphereShape_net.h | 10 + .../src/libbulletnet/btTransform_net.cpp | 105 + .../src/libbulletnet/btTransform_net.h | 23 + .../btTriangleIndexVertexArray_net.cpp | 18 + .../btTriangleIndexVertexArray_net.h | 7 + .../src/libbulletnet/btTriangleMesh_net.cpp | 49 + .../src/libbulletnet/btTriangleMesh_net.h | 13 + .../libbulletnet/btTypedConstraint_net.cpp | 90 + .../src/libbulletnet/btTypedConstraint_net.h | 20 + .../src/libbulletnet/btvector3_net.cpp | 120 + .../src/libbulletnet/btvector3_net.h | 25 + .../src/libbulletnet/bulletnet_net.cpp | 31 + .../src/libbulletnet/bulletnet_net.h | 9 + .../src/libbulletnet/conversion.cpp | 30 + .../bulletTrunk/src/libbulletnet/conversion.h | 49 + .../bulletTrunk/src/libbulletnet/main.h | 8 + 3114 files changed, 1247955 insertions(+) create mode 100644 BulletPhysics/bulletTrunk/AUTHORS create mode 100644 BulletPhysics/bulletTrunk/BspDemo.bsp create mode 100644 BulletPhysics/bulletTrunk/BulletDotNET/BulletConsoleTest/BulletConsoleTest.csproj create mode 100644 BulletPhysics/bulletTrunk/BulletDotNET/BulletConsoleTest/Program.cs create mode 100644 BulletPhysics/bulletTrunk/BulletDotNET/BulletConsoleTest/Properties/AssemblyInfo.cs create mode 100644 BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/BulletDotNET.csproj create mode 100644 BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/Native.cs create mode 100644 BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/Properties/AssemblyInfo.cs create mode 100644 BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/ClosestNotMeRayResultCallback.cs create mode 100644 BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/CollisionShapes/btBoxShape.cs create mode 100644 BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/CollisionShapes/btCapsuleShape.cs create mode 100644 BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/CollisionShapes/btGImpactCollisionAlgorithm.cs create mode 100644 BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/CollisionShapes/btGImpactMeshShape.cs create mode 100644 BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/CollisionShapes/btSphereShape.cs create mode 100644 BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/CollisionShapes/btStridingMeshInterface.cs create mode 100644 BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/CollisionShapes/btTriangleIndexVertexArray.cs create mode 100644 BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/CollisionShapes/btTriangleMesh.cs create mode 100644 BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/btAxisSweep3.cs create mode 100644 BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/btBroadphaseInterface.cs create mode 100644 BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/btCollisionConfiguration.cs create mode 100644 BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/btCollisionDispatcher.cs create mode 100644 BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/btCollisionObject.cs create mode 100644 BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/btCollisionShape.cs create mode 100644 BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/btDefaultCollisionConfiguration.cs create mode 100644 BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/btDispatcher.cs create mode 100644 BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/btGhostObject.cs create mode 100644 BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/btHeightfieldTerrainShape.cs create mode 100644 BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/btPairCachingGhostObject.cs create mode 100644 BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/btRayResultCallback.cs create mode 100644 BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletDynamics/btCollisionWorld.cs create mode 100644 BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletDynamics/btConstraintInfo2.cs create mode 100644 BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletDynamics/btConstraintSolver.cs create mode 100644 BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletDynamics/btDefaultMotionState.cs create mode 100644 BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletDynamics/btDiscreteDynamicsWorld.cs create mode 100644 BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletDynamics/btGeneric6DofConstraint.cs create mode 100644 BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletDynamics/btMotionState.cs create mode 100644 BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletDynamics/btRigidBody.cs create mode 100644 BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletDynamics/btRigidBodyConstructionInfo.cs create mode 100644 BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletDynamics/btSequentialImpulseConstraintSolver.cs create mode 100644 BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletDynamics/btTypedConstraint.cs create mode 100644 BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletMath/btMatrix3x3.cs create mode 100644 BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletMath/btQuaternion.cs create mode 100644 BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletMath/btTransform.cs create mode 100644 BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletMath/btVector3.cs create mode 100644 BulletPhysics/bulletTrunk/BulletLicense.txt create mode 100644 BulletPhysics/bulletTrunk/Bullet_Faq.pdf create mode 100644 BulletPhysics/bulletTrunk/Bullet_User_Manual.pdf create mode 100644 BulletPhysics/bulletTrunk/CMakeLists.txt create mode 100644 BulletPhysics/bulletTrunk/ChangeLog create mode 100644 BulletPhysics/bulletTrunk/Demos/AllBulletDemos/CMakeLists.txt create mode 100644 BulletPhysics/bulletTrunk/Demos/AllBulletDemos/DemoEntries.cpp create mode 100644 BulletPhysics/bulletTrunk/Demos/AllBulletDemos/DemoEntries.h create mode 100644 BulletPhysics/bulletTrunk/Demos/AllBulletDemos/Jamfile create mode 100644 BulletPhysics/bulletTrunk/Demos/AllBulletDemos/Main.cpp create mode 100644 BulletPhysics/bulletTrunk/Demos/AllBulletDemos/Makefile.am create mode 100644 BulletPhysics/bulletTrunk/Demos/BasicDemo/BasicDemo.cpp create mode 100644 BulletPhysics/bulletTrunk/Demos/BasicDemo/BasicDemo.h create mode 100644 BulletPhysics/bulletTrunk/Demos/BasicDemo/CMakeLists.txt create mode 100644 BulletPhysics/bulletTrunk/Demos/BasicDemo/Jamfile create mode 100644 BulletPhysics/bulletTrunk/Demos/BasicDemo/Makefile.am create mode 100644 BulletPhysics/bulletTrunk/Demos/BasicDemo/Makefile.original create mode 100644 BulletPhysics/bulletTrunk/Demos/BasicDemo/main.cpp create mode 100644 BulletPhysics/bulletTrunk/Demos/Benchmarks/BenchmarkDemo.cpp create mode 100644 BulletPhysics/bulletTrunk/Demos/Benchmarks/BenchmarkDemo.h create mode 100644 BulletPhysics/bulletTrunk/Demos/Benchmarks/CMakeLists.txt create mode 100644 BulletPhysics/bulletTrunk/Demos/Benchmarks/Jamfile create mode 100644 BulletPhysics/bulletTrunk/Demos/Benchmarks/Taru.mdl create mode 100644 BulletPhysics/bulletTrunk/Demos/Benchmarks/landscape.mdl create mode 100644 BulletPhysics/bulletTrunk/Demos/Benchmarks/main.cpp create mode 100644 BulletPhysics/bulletTrunk/Demos/BspDemo/BspConverter.cpp create mode 100644 BulletPhysics/bulletTrunk/Demos/BspDemo/BspConverter.h create mode 100644 BulletPhysics/bulletTrunk/Demos/BspDemo/BspDemo.cpp create mode 100644 BulletPhysics/bulletTrunk/Demos/BspDemo/BspDemo.h create mode 100644 BulletPhysics/bulletTrunk/Demos/BspDemo/BspLoader.cpp create mode 100644 BulletPhysics/bulletTrunk/Demos/BspDemo/BspLoader.h create mode 100644 BulletPhysics/bulletTrunk/Demos/BspDemo/CMakeLists.txt create mode 100644 BulletPhysics/bulletTrunk/Demos/BspDemo/Jamfile create mode 100644 BulletPhysics/bulletTrunk/Demos/BspDemo/main.cpp create mode 100644 BulletPhysics/bulletTrunk/Demos/BulletDinoDemo/BulletDino.c create mode 100644 BulletPhysics/bulletTrunk/Demos/BulletDinoDemo/CMakeLists.txt create mode 100644 BulletPhysics/bulletTrunk/Demos/BulletDinoDemo/Jamfile create mode 100644 BulletPhysics/bulletTrunk/Demos/CMakeLists.txt create mode 100644 BulletPhysics/bulletTrunk/Demos/CcdPhysicsDemo/CMakeLists.txt create mode 100644 BulletPhysics/bulletTrunk/Demos/CcdPhysicsDemo/CcdPhysicsDemo.cpp create mode 100644 BulletPhysics/bulletTrunk/Demos/CcdPhysicsDemo/CcdPhysicsDemo.h create mode 100644 BulletPhysics/bulletTrunk/Demos/CcdPhysicsDemo/Jamfile create mode 100644 BulletPhysics/bulletTrunk/Demos/CcdPhysicsDemo/Makefile.am create mode 100644 BulletPhysics/bulletTrunk/Demos/CcdPhysicsDemo/main.cpp create mode 100644 BulletPhysics/bulletTrunk/Demos/CellSpuDemo/BasicDemo2.cpp create mode 100644 BulletPhysics/bulletTrunk/Demos/CellSpuDemo/BasicDemo2.h create mode 100644 BulletPhysics/bulletTrunk/Demos/CellSpuDemo/ibmsdk/Makefile create mode 100644 BulletPhysics/bulletTrunk/Demos/CharacterDemo/CMakeLists.txt create mode 100644 BulletPhysics/bulletTrunk/Demos/CharacterDemo/CharacterDemo.cpp create mode 100644 BulletPhysics/bulletTrunk/Demos/CharacterDemo/CharacterDemo.h create mode 100644 BulletPhysics/bulletTrunk/Demos/CharacterDemo/DynamicCharacterController.cpp create mode 100644 BulletPhysics/bulletTrunk/Demos/CharacterDemo/DynamicCharacterController.h create mode 100644 BulletPhysics/bulletTrunk/Demos/CharacterDemo/Jamfile create mode 100644 BulletPhysics/bulletTrunk/Demos/CharacterDemo/main.cpp create mode 100644 BulletPhysics/bulletTrunk/Demos/ColladaDemo/CMakeLists.txt create mode 100644 BulletPhysics/bulletTrunk/Demos/ColladaDemo/ColladaDemo.cpp create mode 100644 BulletPhysics/bulletTrunk/Demos/ColladaDemo/ColladaDemo.h create mode 100644 BulletPhysics/bulletTrunk/Demos/ColladaDemo/Jamfile create mode 100644 BulletPhysics/bulletTrunk/Demos/ColladaDemo/Makefile.am create mode 100644 BulletPhysics/bulletTrunk/Demos/CollisionDemo/CollisionDemo.cpp create mode 100644 BulletPhysics/bulletTrunk/Demos/CollisionDemo/CollisionDemo.h create mode 100644 BulletPhysics/bulletTrunk/Demos/CollisionDemo/Jamfile create mode 100644 BulletPhysics/bulletTrunk/Demos/CollisionInterfaceDemo/CollisionInterfaceDemo.cpp create mode 100644 BulletPhysics/bulletTrunk/Demos/CollisionInterfaceDemo/CollisionInterfaceDemo.h create mode 100644 BulletPhysics/bulletTrunk/Demos/CollisionInterfaceDemo/Jamfile create mode 100644 BulletPhysics/bulletTrunk/Demos/ConcaveConvexcastDemo/ConcaveConvexcastDemo.cpp create mode 100644 BulletPhysics/bulletTrunk/Demos/ConcaveConvexcastDemo/ConcaveConvexcastDemo.h create mode 100644 BulletPhysics/bulletTrunk/Demos/ConcaveConvexcastDemo/main.cpp create mode 100644 BulletPhysics/bulletTrunk/Demos/ConcaveDemo/ConcaveDemo.h create mode 100644 BulletPhysics/bulletTrunk/Demos/ConcaveDemo/ConcavePhysicsDemo.cpp create mode 100644 BulletPhysics/bulletTrunk/Demos/ConcaveDemo/Jamfile create mode 100644 BulletPhysics/bulletTrunk/Demos/ConcaveDemo/main.cpp create mode 100644 BulletPhysics/bulletTrunk/Demos/ConcaveRaycastDemo/ConcaveRaycastDemo.cpp create mode 100644 BulletPhysics/bulletTrunk/Demos/ConcaveRaycastDemo/ConcaveRaycastDemo.h create mode 100644 BulletPhysics/bulletTrunk/Demos/ConcaveRaycastDemo/main.cpp create mode 100644 BulletPhysics/bulletTrunk/Demos/ConstraintDemo/CMakeLists.txt create mode 100644 BulletPhysics/bulletTrunk/Demos/ConstraintDemo/ConstraintDemo.cpp create mode 100644 BulletPhysics/bulletTrunk/Demos/ConstraintDemo/ConstraintDemo.h create mode 100644 BulletPhysics/bulletTrunk/Demos/ConstraintDemo/Jamfile create mode 100644 BulletPhysics/bulletTrunk/Demos/ConstraintDemo/main.cpp create mode 100644 BulletPhysics/bulletTrunk/Demos/ContinuousConvexCollision/ContinuousConvexCollision.h create mode 100644 BulletPhysics/bulletTrunk/Demos/ContinuousConvexCollision/ContinuousConvexCollisionDemo.cpp create mode 100644 BulletPhysics/bulletTrunk/Demos/ContinuousConvexCollision/Jamfile create mode 100644 BulletPhysics/bulletTrunk/Demos/ConvexDecompositionDemo/CMakeLists.txt create mode 100644 BulletPhysics/bulletTrunk/Demos/ConvexDecompositionDemo/ConvexDecompositionDemo.cpp create mode 100644 BulletPhysics/bulletTrunk/Demos/ConvexDecompositionDemo/ConvexDecompositionDemo.h create mode 100644 BulletPhysics/bulletTrunk/Demos/ConvexDecompositionDemo/Jamfile create mode 100644 BulletPhysics/bulletTrunk/Demos/ConvexDecompositionDemo/main.cpp create mode 100644 BulletPhysics/bulletTrunk/Demos/ConvexHullDistance/ConvexHullDistanceDemo.cpp create mode 100644 BulletPhysics/bulletTrunk/Demos/ConvexHullDistance/Jamfile create mode 100644 BulletPhysics/bulletTrunk/Demos/DoublePrecisionDemo/DoublePrecisionDemo.cpp create mode 100644 BulletPhysics/bulletTrunk/Demos/DoublePrecisionDemo/DoublePrecisionDemo.h create mode 100644 BulletPhysics/bulletTrunk/Demos/DoublePrecisionDemo/Jamfile create mode 100644 BulletPhysics/bulletTrunk/Demos/DynamicControlDemo/MotorDemo.cpp create mode 100644 BulletPhysics/bulletTrunk/Demos/DynamicControlDemo/MotorDemo.h create mode 100644 BulletPhysics/bulletTrunk/Demos/DynamicControlDemo/main.cpp create mode 100644 BulletPhysics/bulletTrunk/Demos/EPAPenDepthDemo/Jamfile create mode 100644 BulletPhysics/bulletTrunk/Demos/EPAPenDepthDemo/PenetrationTestBullet.cpp create mode 100644 BulletPhysics/bulletTrunk/Demos/ForkLiftDemo/CMakeLists.txt create mode 100644 BulletPhysics/bulletTrunk/Demos/ForkLiftDemo/ForkLiftDemo.cpp create mode 100644 BulletPhysics/bulletTrunk/Demos/ForkLiftDemo/ForkLiftDemo.h create mode 100644 BulletPhysics/bulletTrunk/Demos/ForkLiftDemo/Jamfile create mode 100644 BulletPhysics/bulletTrunk/Demos/ForkLiftDemo/main.cpp create mode 100644 BulletPhysics/bulletTrunk/Demos/GenericJointDemo/CMakeLists.txt create mode 100644 BulletPhysics/bulletTrunk/Demos/GenericJointDemo/GenericJointDemo.cpp create mode 100644 BulletPhysics/bulletTrunk/Demos/GenericJointDemo/GenericJointDemo.h create mode 100644 BulletPhysics/bulletTrunk/Demos/GenericJointDemo/Jamfile create mode 100644 BulletPhysics/bulletTrunk/Demos/GenericJointDemo/Ragdoll.cpp create mode 100644 BulletPhysics/bulletTrunk/Demos/GenericJointDemo/Ragdoll.h create mode 100644 BulletPhysics/bulletTrunk/Demos/GimpactTestDemo/BunnyMesh.h create mode 100644 BulletPhysics/bulletTrunk/Demos/GimpactTestDemo/GimpactTestDemo.cpp create mode 100644 BulletPhysics/bulletTrunk/Demos/GimpactTestDemo/GimpactTestDemo.h create mode 100644 BulletPhysics/bulletTrunk/Demos/GimpactTestDemo/Jamfile create mode 100644 BulletPhysics/bulletTrunk/Demos/GimpactTestDemo/TorusMesh.h create mode 100644 BulletPhysics/bulletTrunk/Demos/GimpactTestDemo/main.cpp create mode 100644 BulletPhysics/bulletTrunk/Demos/GjkConvexCastDemo/Jamfile create mode 100644 BulletPhysics/bulletTrunk/Demos/GjkConvexCastDemo/LinearConvexCastDemo.cpp create mode 100644 BulletPhysics/bulletTrunk/Demos/GjkConvexCastDemo/LinearConvexCastDemo.h create mode 100644 BulletPhysics/bulletTrunk/Demos/GjkConvexCastDemo/main.cpp create mode 100644 BulletPhysics/bulletTrunk/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluid.cpp create mode 100644 BulletPhysics/bulletTrunk/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluid.h create mode 100644 BulletPhysics/bulletTrunk/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidBuoyantConvexShape.cpp create mode 100644 BulletPhysics/bulletTrunk/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidBuoyantConvexShape.h create mode 100644 BulletPhysics/bulletTrunk/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidBuoyantShapeCollisionAlgorithm.cpp create mode 100644 BulletPhysics/bulletTrunk/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidBuoyantShapeCollisionAlgorithm.h create mode 100644 BulletPhysics/bulletTrunk/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidCollisionShape.cpp create mode 100644 BulletPhysics/bulletTrunk/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidCollisionShape.h create mode 100644 BulletPhysics/bulletTrunk/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidRigidCollisionAlgorithm.cpp create mode 100644 BulletPhysics/bulletTrunk/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidRigidCollisionAlgorithm.h create mode 100644 BulletPhysics/bulletTrunk/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidRigidCollisionConfiguration.cpp create mode 100644 BulletPhysics/bulletTrunk/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidRigidCollisionConfiguration.h create mode 100644 BulletPhysics/bulletTrunk/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidRigidDynamicsWorld.cpp create mode 100644 BulletPhysics/bulletTrunk/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidRigidDynamicsWorld.h create mode 100644 BulletPhysics/bulletTrunk/Demos/HeightFieldFluidDemo/CMakeLists.txt create mode 100644 BulletPhysics/bulletTrunk/Demos/HeightFieldFluidDemo/HfFluidDemo.cpp create mode 100644 BulletPhysics/bulletTrunk/Demos/HeightFieldFluidDemo/HfFluidDemo.h create mode 100644 BulletPhysics/bulletTrunk/Demos/HeightFieldFluidDemo/HfFluidDemo_GL_ShapeDrawer.cpp create mode 100644 BulletPhysics/bulletTrunk/Demos/HeightFieldFluidDemo/HfFluidDemo_GL_ShapeDrawer.h create mode 100644 BulletPhysics/bulletTrunk/Demos/HeightFieldFluidDemo/Jamfile create mode 100644 BulletPhysics/bulletTrunk/Demos/HeightFieldFluidDemo/main.cpp create mode 100644 BulletPhysics/bulletTrunk/Demos/HelloWorld/CMakeLists.txt create mode 100644 BulletPhysics/bulletTrunk/Demos/HelloWorld/HelloWorld.cpp create mode 100644 BulletPhysics/bulletTrunk/Demos/HelloWorld/Jamfile create mode 100644 BulletPhysics/bulletTrunk/Demos/Jamfile create mode 100644 BulletPhysics/bulletTrunk/Demos/Makefile.am create mode 100644 BulletPhysics/bulletTrunk/Demos/MovingConcaveDemo/CMakeLists.txt create mode 100644 BulletPhysics/bulletTrunk/Demos/MovingConcaveDemo/ConcaveDemo.h create mode 100644 BulletPhysics/bulletTrunk/Demos/MovingConcaveDemo/ConcavePhysicsDemo.cpp create mode 100644 BulletPhysics/bulletTrunk/Demos/MovingConcaveDemo/Jamfile create mode 100644 BulletPhysics/bulletTrunk/Demos/MultiMaterialDemo/Jamfile create mode 100644 BulletPhysics/bulletTrunk/Demos/MultiMaterialDemo/MultiMaterialDemo.cpp create mode 100644 BulletPhysics/bulletTrunk/Demos/MultiMaterialDemo/MultiMaterialDemo.h create mode 100644 BulletPhysics/bulletTrunk/Demos/MultiMaterialDemo/main.cpp create mode 100644 BulletPhysics/bulletTrunk/Demos/MultiThreadedDemo/CMakeLists.txt create mode 100644 BulletPhysics/bulletTrunk/Demos/MultiThreadedDemo/Jamfile create mode 100644 BulletPhysics/bulletTrunk/Demos/MultiThreadedDemo/Makefile.am create mode 100644 BulletPhysics/bulletTrunk/Demos/MultiThreadedDemo/MultiThreadedDemo.cpp create mode 100644 BulletPhysics/bulletTrunk/Demos/MultiThreadedDemo/MultiThreadedDemo.h create mode 100644 BulletPhysics/bulletTrunk/Demos/MultiThreadedDemo/main.cpp create mode 100644 BulletPhysics/bulletTrunk/Demos/OpenGL/BMF_Api.cpp create mode 100644 BulletPhysics/bulletTrunk/Demos/OpenGL/BMF_Api.h create mode 100644 BulletPhysics/bulletTrunk/Demos/OpenGL/BMF_BitmapFont.cpp create mode 100644 BulletPhysics/bulletTrunk/Demos/OpenGL/BMF_BitmapFont.h create mode 100644 BulletPhysics/bulletTrunk/Demos/OpenGL/BMF_FontData.h create mode 100644 BulletPhysics/bulletTrunk/Demos/OpenGL/BMF_Fonts.h create mode 100644 BulletPhysics/bulletTrunk/Demos/OpenGL/BMF_Settings.h create mode 100644 BulletPhysics/bulletTrunk/Demos/OpenGL/BMF_font_helv10.cpp create mode 100644 BulletPhysics/bulletTrunk/Demos/OpenGL/CMakeLists.txt create mode 100644 BulletPhysics/bulletTrunk/Demos/OpenGL/DebugCastResult.h create mode 100644 BulletPhysics/bulletTrunk/Demos/OpenGL/DemoApplication.cpp create mode 100644 BulletPhysics/bulletTrunk/Demos/OpenGL/DemoApplication.h create mode 100644 BulletPhysics/bulletTrunk/Demos/OpenGL/GLDebugDrawer.cpp create mode 100644 BulletPhysics/bulletTrunk/Demos/OpenGL/GLDebugDrawer.h create mode 100644 BulletPhysics/bulletTrunk/Demos/OpenGL/GL_ShapeDrawer.cpp create mode 100644 BulletPhysics/bulletTrunk/Demos/OpenGL/GL_ShapeDrawer.h create mode 100644 BulletPhysics/bulletTrunk/Demos/OpenGL/GL_Simplex1to4.cpp create mode 100644 BulletPhysics/bulletTrunk/Demos/OpenGL/GL_Simplex1to4.h create mode 100644 BulletPhysics/bulletTrunk/Demos/OpenGL/GlutStuff.cpp create mode 100644 BulletPhysics/bulletTrunk/Demos/OpenGL/GlutStuff.h create mode 100644 BulletPhysics/bulletTrunk/Demos/OpenGL/Jamfile create mode 100644 BulletPhysics/bulletTrunk/Demos/OpenGL/Makefile.am create mode 100644 BulletPhysics/bulletTrunk/Demos/OpenGL/RenderTexture.cpp create mode 100644 BulletPhysics/bulletTrunk/Demos/OpenGL/RenderTexture.h create mode 100644 BulletPhysics/bulletTrunk/Demos/OpenGL/ibmsdk/Makefile create mode 100644 BulletPhysics/bulletTrunk/Demos/OpenPL_Demo/CApi.cpp create mode 100644 BulletPhysics/bulletTrunk/Demos/OpenPL_Demo/OpenPL_Demo.c create mode 100644 BulletPhysics/bulletTrunk/Demos/RagdollDemo/CMakeLists.txt create mode 100644 BulletPhysics/bulletTrunk/Demos/RagdollDemo/Jamfile create mode 100644 BulletPhysics/bulletTrunk/Demos/RagdollDemo/RagdollDemo.cpp create mode 100644 BulletPhysics/bulletTrunk/Demos/RagdollDemo/RagdollDemo.h create mode 100644 BulletPhysics/bulletTrunk/Demos/RagdollDemo/main.cpp create mode 100644 BulletPhysics/bulletTrunk/Demos/Raytracer/Jamfile create mode 100644 BulletPhysics/bulletTrunk/Demos/Raytracer/Raytracer.cpp create mode 100644 BulletPhysics/bulletTrunk/Demos/Raytracer/Raytracer.h create mode 100644 BulletPhysics/bulletTrunk/Demos/Raytracer/main.cpp create mode 100644 BulletPhysics/bulletTrunk/Demos/SimplexDemo/Jamfile create mode 100644 BulletPhysics/bulletTrunk/Demos/SimplexDemo/SimplexDemo.cpp create mode 100644 BulletPhysics/bulletTrunk/Demos/SimplexDemo/SimplexDemo.h create mode 100644 BulletPhysics/bulletTrunk/Demos/SliderConstraintDemo/CMakeLists.txt create mode 100644 BulletPhysics/bulletTrunk/Demos/SliderConstraintDemo/Jamfile create mode 100644 BulletPhysics/bulletTrunk/Demos/SliderConstraintDemo/SliderConstraintDemo.cpp create mode 100644 BulletPhysics/bulletTrunk/Demos/SliderConstraintDemo/SliderConstraintDemo.h create mode 100644 BulletPhysics/bulletTrunk/Demos/SliderConstraintDemo/main.cpp create mode 100644 BulletPhysics/bulletTrunk/Demos/SoftDemo/CMakeLists.txt create mode 100644 BulletPhysics/bulletTrunk/Demos/SoftDemo/Jamfile create mode 100644 BulletPhysics/bulletTrunk/Demos/SoftDemo/Makefile.am create mode 100644 BulletPhysics/bulletTrunk/Demos/SoftDemo/SoftDemo.cpp create mode 100644 BulletPhysics/bulletTrunk/Demos/SoftDemo/SoftDemo.h create mode 100644 BulletPhysics/bulletTrunk/Demos/SoftDemo/bunny.inl create mode 100644 BulletPhysics/bulletTrunk/Demos/SoftDemo/cube.inl create mode 100644 BulletPhysics/bulletTrunk/Demos/SoftDemo/main.cpp create mode 100644 BulletPhysics/bulletTrunk/Demos/TerrainDemo/Jamfile create mode 100644 BulletPhysics/bulletTrunk/Demos/TerrainDemo/Makefile.am create mode 100644 BulletPhysics/bulletTrunk/Demos/TerrainDemo/TerrainDemo.cpp create mode 100644 BulletPhysics/bulletTrunk/Demos/TerrainDemo/TerrainDemo.h create mode 100644 BulletPhysics/bulletTrunk/Demos/TerrainDemo/main.cpp create mode 100644 BulletPhysics/bulletTrunk/Demos/UserCollisionAlgorithm/CMakeLists.txt create mode 100644 BulletPhysics/bulletTrunk/Demos/UserCollisionAlgorithm/Jamfile create mode 100644 BulletPhysics/bulletTrunk/Demos/UserCollisionAlgorithm/UserCollisionAlgorithm.cpp create mode 100644 BulletPhysics/bulletTrunk/Demos/UserCollisionAlgorithm/UserCollisionAlgorithm.h create mode 100644 BulletPhysics/bulletTrunk/Demos/VehicleDemo/CMakeLists.txt create mode 100644 BulletPhysics/bulletTrunk/Demos/VehicleDemo/Jamfile create mode 100644 BulletPhysics/bulletTrunk/Demos/VehicleDemo/Makefile.am create mode 100644 BulletPhysics/bulletTrunk/Demos/VehicleDemo/VehicleDemo.cpp create mode 100644 BulletPhysics/bulletTrunk/Demos/VehicleDemo/VehicleDemo.h create mode 100644 BulletPhysics/bulletTrunk/Demos/VehicleDemo/main.cpp create mode 100644 BulletPhysics/bulletTrunk/Doxyfile create mode 100644 BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/AllBulletDemos.xcodeproj/TemplateIcon.icns create mode 100644 BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/AllBulletDemos.xcodeproj/project.pbxproj create mode 100644 BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/AllBulletDemos.xcodeproj/zakariya.pbxuser create mode 100644 BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/AllBulletDemos.xcodeproj/zakariya.perspectivev3 create mode 100644 BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/AllBulletDemos_Prefix.pch create mode 100644 BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/BulletIcon.icns create mode 100644 BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/BulletIcon.psd create mode 100644 BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/English.lproj/Credits.rtf create mode 100644 BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/English.lproj/InfoPlist.strings create mode 100644 BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/English.lproj/MainMenu.xib create mode 100644 BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/Info.plist create mode 100644 BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/README.txt create mode 100644 BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/main.m create mode 100644 BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/src/BTDemo.h create mode 100644 BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/src/BTDemo.mm create mode 100644 BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/src/BTDemosAppController.h create mode 100644 BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/src/BTDemosAppController.m create mode 100644 BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/src/BTSimulationParameters.h create mode 100644 BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/src/BTSimulationParameters.m create mode 100644 BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/src/toolkit/BTFullscreenWindow.h create mode 100644 BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/src/toolkit/BTFullscreenWindow.m create mode 100644 BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/src/toolkit/BTGLUTKeyAdapter.h create mode 100644 BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/src/toolkit/BTGLUTKeyAdapter.m create mode 100644 BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/src/toolkit/BTOpenGLDisplayDelegate.h create mode 100644 BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/src/toolkit/BTOpenGLView.h create mode 100644 BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/src/toolkit/BTOpenGLView.m create mode 100644 BulletPhysics/bulletTrunk/Extras/BulletColladaConverter/CMakeLists.txt create mode 100644 BulletPhysics/bulletTrunk/Extras/BulletColladaConverter/ColladaConverter.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/BulletColladaConverter/ColladaConverter.h create mode 100644 BulletPhysics/bulletTrunk/Extras/BulletColladaConverter/Jamfile create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/ChangeLog.txt create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/Clean.bat create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/License.txt create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/Readme.txt create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/examples/Examples.ncb create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/examples/Examples.sln create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/examples/Examples.suo create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/examples/Makefile create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/examples/Makefile.x86_64 create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/examples/TwAdvanced1.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/examples/TwAdvanced1.vcproj create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/examples/TwCopyDLL.vcproj create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/examples/TwSimpleDX9.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/examples/TwSimpleDX9.vcproj create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/examples/TwSimpleGLFW.c create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/examples/TwSimpleGLFW.vcproj create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/examples/TwSimpleGLUT.c create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/examples/TwSimpleGLUT.vcproj create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/examples/TwSimpleSDL.c create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/examples/TwSimpleSDL.vcproj create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/examples/glfw.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/examples/glfwdll.lib create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/include/AntTweakBar.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/lib/AntTweakBar.dll create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/lib/AntTweakBar.exp create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/lib/AntTweakBar.lib create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/lib/Readme.txt create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/lib/libAntTweakBar.so.ldd create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/AntPerfTimer.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/AntTweakBar.rc create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/AntTweakBar.sln create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/AntTweakBar.vcproj create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/LoadOGL.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/LoadOGL.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/Makefile create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/Makefile.x86_64 create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/TwBar.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/TwBar.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/TwColors.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/TwColors.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/TwDirect3D9.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/TwDirect3D9.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/TwEventGLFW.c create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/TwEventGLUT.c create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/TwEventSDL.c create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/TwEventWin32.c create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/TwFonts.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/TwFonts.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/TwGraph.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/TwMgr.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/TwMgr.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/TwOpenGL.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/TwOpenGL.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/TwPrecomp.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/TwPrecomp.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/res/FontChars.txt create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/res/FontLargeAA.pgm create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/res/FontNormal.pgm create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/res/FontNormalAA.pgm create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/res/FontSmall.pgm create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/res/TwXCursors.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/res/cur00000.cur create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/res/cur00001.cur create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/res/cur00002.cur create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/res/cur00003.cur create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/res/cur00004.cur create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/res/cur00005.cur create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/res/cur00006.cur create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/res/cur00007.cur create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/res/cur00008.cur create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/res/cur00009.cur create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/res/cur00010.cur create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/res/cur00011.cur create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/res/cur00012.cur create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/res/cur00013.cur create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/res/curs00.pbm create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/res/curs01.pbm create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/res/curs02.pbm create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/res/curs03.pbm create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/res/curs04.pbm create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/res/curs05.pbm create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/res/curs06.pbm create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/res/curs07.pbm create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/res/curs08.pbm create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/res/curs09.pbm create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/res/curs10.pbm create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/res/curs11.pbm create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/res/curs12.pbm create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/res/curs13.pbm create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/res/mask00.pbm create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/res/mask01.pbm create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/res/mask02.pbm create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/res/mask03.pbm create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/res/mask04.pbm create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/res/mask05.pbm create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/res/mask06.pbm create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/res/mask07.pbm create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/res/mask08.pbm create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/res/mask09.pbm create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/res/mask10.pbm create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/res/mask11.pbm create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/res/mask12.pbm create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/res/mask13.pbm create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/resource.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Bin/AntTweakBar.dll create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Bin/Opcode.dll create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/BipartiteBoxPruning.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/BipartiteBoxPruning.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/BulletSAPCompleteBoxPruningTest.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/BulletSAPCompleteBoxPruningTest.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/CDTestFramework.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/CDTestFramework.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/CDTestFramework.sln create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/CDTestFramework.txt create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/CDTestFramework.vcproj create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Camera.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Camera.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/CapsuleMeshQuery.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/CapsuleMeshQuery.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/CollisionTest.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/CollisionTest.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/CompleteBoxPruning.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/CompleteBoxPruning.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/GLFontData.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/GLFontRenderer.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/GLFontRenderer.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/GLUT32.DLL create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/History.txt create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/IceHelpers.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/IceHelpers.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/License.txt create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/License.txt.bak create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/OBBMeshQuery.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/OBBMeshQuery.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceAABB.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceAABB.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceAllocator.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceAllocator.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceAssert.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceAxes.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceBitArray.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceBitArray.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceBoundingSphere.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceContainer.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceContainer.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceFPU.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceHPoint.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceHPoint.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceHashing.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceIndexedTriangle.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceIndexedTriangle.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceLSS.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceMatrix3x3.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceMatrix3x3.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceMatrix4x4.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceMatrix4x4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceMemoryMacros.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceOBB.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceOBB.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IcePairs.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IcePlane.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IcePlane.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IcePoint.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IcePoint.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IcePreprocessor.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceRandom.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceRandom.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceRay.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceRay.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceRevisitedRadix.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceRevisitedRadix.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceSegment.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceSegment.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceTriangle.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceTriangle.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceTrilist.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceTypes.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceUtils.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceUtils.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/_IceAABB.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/_IceContainer.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/_IceContainer.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/_IceFPU.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/_IceMemoryMacros.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/_IcePreprocessor.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/_IceRevisitedRadix.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/_IceRevisitedRadix.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/_IceTypes.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/_IceUtils.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_AABBCollider.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_AABBCollider.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_AABBTree.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_AABBTree.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_ArraySAP.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_ArraySAP.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_BaseModel.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_BaseModel.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_BoxBoxOverlap.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_BoxPruning.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_BoxPruning.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_Collider.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_Collider.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_Common.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_Common.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_HybridModel.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_HybridModel.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_IceHook.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_LSSAABBOverlap.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_LSSCollider.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_LSSCollider.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_LSSTriOverlap.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_MeshInterface.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_MeshInterface.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_Model.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_Model.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_OBBCollider.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_OBBCollider.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_OptimizedTree.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_OptimizedTree.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_Picking.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_Picking.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_PlanesAABBOverlap.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_PlanesCollider.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_PlanesCollider.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_PlanesTriOverlap.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_RayAABBOverlap.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_RayCollider.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_RayCollider.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_RayTriOverlap.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_Settings.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_SphereAABBOverlap.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_SphereCollider.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_SphereCollider.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_SphereTriOverlap.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_SweepAndPrune.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_SweepAndPrune.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_TreeBuilders.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_TreeBuilders.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_TreeCollider.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_TreeCollider.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_TriBoxOverlap.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_TriTriOverlap.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_VolumeCollider.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_VolumeCollider.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Opcode.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Opcode.dsp create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Opcode.dsw create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Opcode.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Opcode.sln create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Opcode.vcproj create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/ReadMe.txt create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/StdAfx.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/StdAfx.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/OpcodeArraySAPTest.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/OpcodeArraySAPTest.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Profiling.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/ReadMe.txt create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/RenderingHelpers.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/RenderingHelpers.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/SphereMeshQuery.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/SphereMeshQuery.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Terrain.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/Terrain.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/convex1.bin create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/stdafx.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/CDTestFramework/stdafx.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CMakeLists.txt create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/CMakeLists.txt create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/Jamfile create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domAccessor.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domAnimation.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domAnimation_clip.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domAsset.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domBind_material.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domBool_array.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domBox.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCOLLADA.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCamera.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCapsule.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCg_connect_param.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCg_newarray_type.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCg_newparam.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCg_param_type.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCg_sampler1D.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCg_sampler2D.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCg_sampler3D.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCg_samplerCUBE.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCg_samplerDEPTH.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCg_samplerRECT.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCg_setarray_type.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCg_setparam.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCg_setparam_simple.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCg_setuser_type.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCg_surface_type.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domChannel.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCommon_color_or_texture_type.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCommon_float_or_param_type.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCommon_newparam_type.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCommon_transparent_type.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domConstants.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domController.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domConvex_mesh.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCylinder.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domEffect.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domElements.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domEllipsoid.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domExtra.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFloat_array.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domForce_field.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_annotate_common.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_annotate_type_common.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_basic_type_common.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_clearcolor_common.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_cleardepth_common.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_clearstencil_common.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_code_profile.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_colortarget_common.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_depthtarget_common.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_include_common.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_newparam_common.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_profile_abstract.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_sampler1D_common.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_sampler2D_common.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_sampler3D_common.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_samplerCUBE_common.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_samplerDEPTH_common.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_samplerRECT_common.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_setparam_common.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_stenciltarget_common.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_surface_common.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_surface_format_hint_common.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_surface_init_common.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_surface_init_cube_common.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_surface_init_from_common.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_surface_init_planar_common.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_surface_init_volume_common.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGeometry.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGl_hook_abstract.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGl_pipeline_settings.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGl_sampler1D.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGl_sampler2D.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGl_sampler3D.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGl_samplerCUBE.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGl_samplerDEPTH.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGl_samplerRECT.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGles_basic_type_common.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGles_newparam.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGles_pipeline_settings.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGles_sampler_state.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGles_texcombiner_argumentAlpha_type.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGles_texcombiner_argumentRGB_type.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGles_texcombiner_commandAlpha_type.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGles_texcombiner_commandRGB_type.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGles_texcombiner_command_type.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGles_texenv_command_type.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGles_texture_constant_type.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGles_texture_pipeline.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGles_texture_unit.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGlsl_newarray_type.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGlsl_newparam.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGlsl_param_type.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGlsl_setarray_type.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGlsl_setparam.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGlsl_setparam_simple.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGlsl_surface_type.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domIDREF_array.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domImage.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domInputGlobal.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domInputLocal.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domInputLocalOffset.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domInstanceWithExtra.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domInstance_camera.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domInstance_controller.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domInstance_effect.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domInstance_force_field.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domInstance_geometry.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domInstance_light.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domInstance_material.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domInstance_node.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domInstance_physics_material.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domInstance_physics_model.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domInstance_rigid_body.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domInstance_rigid_constraint.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domInt_array.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domLibrary_animation_clips.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domLibrary_animations.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domLibrary_cameras.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domLibrary_controllers.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domLibrary_effects.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domLibrary_force_fields.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domLibrary_geometries.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domLibrary_images.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domLibrary_lights.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domLibrary_materials.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domLibrary_nodes.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domLibrary_physics_materials.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domLibrary_physics_models.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domLibrary_physics_scenes.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domLibrary_visual_scenes.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domLight.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domLines.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domLinestrips.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domLookat.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domMaterial.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domMatrix.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domMesh.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domMorph.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domName_array.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domNode.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domP.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domParam.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domPhysics_material.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domPhysics_model.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domPhysics_scene.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domPlane.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domPolygons.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domPolylist.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domProfile_CG.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domProfile_COMMON.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domProfile_GLES.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domProfile_GLSL.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domRigid_body.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domRigid_constraint.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domRotate.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domSampler.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domScale.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domSkew.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domSkin.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domSource.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domSphere.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domSpline.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domTapered_capsule.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domTapered_cylinder.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domTargetableFloat.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domTargetableFloat3.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domTechnique.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domTranslate.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domTriangles.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domTrifans.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domTristrips.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domTypes.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domVertices.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domVisual_scene.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeArray.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeArrayTypes.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeAtomicType.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeDatabase.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeDocument.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeDom.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeDomTypes.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeElement.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeError.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeErrorHandler.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeGCCPlatform.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeGenericPlatform.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeIDRef.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeIOPlugin.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeIntegrationObject.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeInterface.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeMemorySystem.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeMetaAny.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeMetaAttribute.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeMetaCMPolicy.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeMetaChoice.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeMetaElement.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeMetaElementAttribute.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeMetaGroup.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeMetaSequence.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeSIDResolver.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeSmartRef.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeStringRef.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeStringTable.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeTypes.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeURI.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeWin32Platform.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/domAny.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dom.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/modules/daeLIBXMLPlugin.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/modules/daeLIBXMLResolver.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/modules/daeSTLDatabase.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/modules/stdErrPlugin.h create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/readme.txt create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/scea-shared-source-lic1.0.txt create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/scea-shared-source-license1.0.pdf create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/dom1.4_vc8.vcproj create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domAccessor.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domAnimation.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domAnimation_clip.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domAsset.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domBind_material.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domBool_array.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domBox.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCOLLADA.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCamera.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCapsule.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCg_connect_param.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCg_newarray_type.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCg_newparam.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCg_param_type.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCg_sampler1D.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCg_sampler2D.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCg_sampler3D.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCg_samplerCUBE.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCg_samplerDEPTH.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCg_samplerRECT.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCg_setarray_type.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCg_setparam.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCg_setparam_simple.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCg_setuser_type.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCg_surface_type.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domChannel.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCommon_color_or_texture_type.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCommon_float_or_param_type.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCommon_newparam_type.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCommon_transparent_type.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domConstants.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domController.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domConvex_mesh.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCylinder.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domEffect.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domEllipsoid.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domExtra.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFloat_array.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domForce_field.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_annotate_common.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_annotate_type_common.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_basic_type_common.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_clearcolor_common.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_cleardepth_common.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_clearstencil_common.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_code_profile.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_colortarget_common.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_depthtarget_common.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_include_common.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_newparam_common.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_profile_abstract.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_sampler1D_common.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_sampler2D_common.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_sampler3D_common.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_samplerCUBE_common.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_samplerDEPTH_common.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_samplerRECT_common.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_stenciltarget_common.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_surface_common.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_surface_format_hint_common.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_surface_init_common.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_surface_init_cube_common.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_surface_init_from_common.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_surface_init_planar_common.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_surface_init_volume_common.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGeometry.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGl_hook_abstract.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGl_pipeline_settings.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGl_sampler1D.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGl_sampler2D.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGl_sampler3D.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGl_samplerCUBE.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGl_samplerDEPTH.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGl_samplerRECT.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGles_basic_type_common.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGles_newparam.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGles_pipeline_settings.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGles_sampler_state.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGles_texcombiner_argumentAlpha_type.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGles_texcombiner_argumentRGB_type.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGles_texcombiner_commandAlpha_type.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGles_texcombiner_commandRGB_type.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGles_texcombiner_command_type.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGles_texenv_command_type.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGles_texture_constant_type.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGles_texture_pipeline.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGles_texture_unit.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGlsl_newarray_type.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGlsl_newparam.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGlsl_param_type.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGlsl_setarray_type.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGlsl_setparam.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGlsl_setparam_simple.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGlsl_surface_type.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domIDREF_array.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domImage.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domInputGlobal.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domInputLocal.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domInputLocalOffset.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domInstanceWithExtra.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domInstance_camera.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domInstance_controller.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domInstance_effect.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domInstance_force_field.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domInstance_geometry.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domInstance_light.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domInstance_material.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domInstance_node.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domInstance_physics_material.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domInstance_physics_model.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domInstance_rigid_body.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domInstance_rigid_constraint.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domInt_array.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domLibrary_animation_clips.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domLibrary_animations.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domLibrary_cameras.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domLibrary_controllers.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domLibrary_effects.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domLibrary_force_fields.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domLibrary_geometries.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domLibrary_images.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domLibrary_lights.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domLibrary_materials.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domLibrary_nodes.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domLibrary_physics_materials.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domLibrary_physics_models.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domLibrary_physics_scenes.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domLibrary_visual_scenes.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domLight.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domLines.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domLinestrips.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domLookat.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domMaterial.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domMatrix.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domMesh.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domMorph.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domName_array.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domNode.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domP.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domParam.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domPhysics_material.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domPhysics_model.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domPhysics_scene.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domPlane.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domPolygons.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domPolylist.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domProfile_CG.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domProfile_COMMON.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domProfile_GLES.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domProfile_GLSL.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domRigid_body.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domRigid_constraint.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domRotate.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domSampler.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domScale.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domSkew.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domSkin.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domSource.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domSphere.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domSpline.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domTapered_capsule.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domTapered_cylinder.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domTargetableFloat.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domTargetableFloat3.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domTechnique.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domTranslate.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domTriangles.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domTrifans.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domTristrips.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domTypes.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domVertices.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domVisual_scene.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/dae.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/daeArray.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/daeAtomicType.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/daeDocument.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/daeDom.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/daeElement.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/daeError.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/daeErrorHandler.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/daeIDRef.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/daeMemorySystem.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/daeMetaAny.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/daeMetaAttribute.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/daeMetaCMPolicy.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/daeMetaChoice.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/daeMetaElement.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/daeMetaElementAttribute.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/daeMetaGroup.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/daeMetaSequence.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/daeSIDResolver.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/daeStringRef.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/daeStringTable.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/daeURI.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/dae_vc8.vcproj create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/domAny.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/modules/LIBXMLPlugin/LIBXMLPlugin_vc8.vcproj create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/modules/LIBXMLPlugin/daeLIBXMLPlugin.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/modules/LIBXMLPlugin/daeLIBXMLResolver.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/modules/STLDatabase/STLDatabase_vc8.vcproj create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/modules/STLDatabase/daeSTLDatabase.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/modules/stdErrPlugin/stdErrPlugin.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/modules/stdErrPlugin/stdErrPlugin_vc8.vcproj create mode 100644 BulletPhysics/bulletTrunk/Extras/CSharpWrapper/AssemblyInfo.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/CSharpWrapper/BulletPhysics.sln create mode 100644 BulletPhysics/bulletTrunk/Extras/CSharpWrapper/BulletPhysics.vcproj create mode 100644 BulletPhysics/bulletTrunk/Extras/CSharpWrapper/BulletPhysicsapp.csproj create mode 100644 BulletPhysics/bulletTrunk/Extras/CSharpWrapper/BulletWrapper.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/CSharpWrapper/BulletWrapper.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CSharpWrapper/Program.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/CSharpWrapper/Properties/AssemblyInfo.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/CSharpWrapper/Properties/Resources.Designer.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/CSharpWrapper/Properties/Resources.resx create mode 100644 BulletPhysics/bulletTrunk/Extras/CSharpWrapper/Properties/Settings.Designer.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/CSharpWrapper/Properties/Settings.settings create mode 100644 BulletPhysics/bulletTrunk/Extras/CUDA/README.txt create mode 100644 BulletPhysics/bulletTrunk/Extras/CUDA/bt3DGridBroadphase.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/CUDA/bt3DGridBroadphaseFunc.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CUDA/btCudaBroadphase.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/CUDA/btCudaBroadphase.cu create mode 100644 BulletPhysics/bulletTrunk/Extras/CUDA/btCudaBroadphase.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CUDA/btCudaBroadphaseKernel.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CUDA/cutil_gl_error.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CUDA/cutil_math.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CUDA/libbulletcuda.vcproj create mode 100644 BulletPhysics/bulletTrunk/Extras/CUDA/param.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/CUDA/param.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CUDA/paramgl.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/CUDA/paramgl.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CUDA/particleSystem.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/CUDA/particleSystem.cu create mode 100644 BulletPhysics/bulletTrunk/Extras/CUDA/particleSystem.cuh create mode 100644 BulletPhysics/bulletTrunk/Extras/CUDA/particleSystem.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CUDA/particles.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/CUDA/particles.sln create mode 100644 BulletPhysics/bulletTrunk/Extras/CUDA/particles.vcproj create mode 100644 BulletPhysics/bulletTrunk/Extras/CUDA/particles_kernel.cu create mode 100644 BulletPhysics/bulletTrunk/Extras/CUDA/particles_kernel.cuh create mode 100644 BulletPhysics/bulletTrunk/Extras/CUDA/radixsort.cu create mode 100644 BulletPhysics/bulletTrunk/Extras/CUDA/radixsort.cuh create mode 100644 BulletPhysics/bulletTrunk/Extras/CUDA/radixsort_kernel.cu create mode 100644 BulletPhysics/bulletTrunk/Extras/CUDA/render_particles.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/CUDA/render_particles.h create mode 100644 BulletPhysics/bulletTrunk/Extras/CUDA/shaders.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/CUDA/shaders.h create mode 100644 BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/CMakeLists.txt create mode 100644 BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/ConvexBuilder.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/ConvexBuilder.h create mode 100644 BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/ConvexDecomposition.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/ConvexDecomposition.h create mode 100644 BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/Jamfile create mode 100644 BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/bestfit.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/bestfit.h create mode 100644 BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/bestfitobb.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/bestfitobb.h create mode 100644 BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/cd_hull.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/cd_hull.h create mode 100644 BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/cd_vector.h create mode 100644 BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/cd_wavefront.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/cd_wavefront.h create mode 100644 BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/concavity.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/concavity.h create mode 100644 BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/fitsphere.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/fitsphere.h create mode 100644 BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/float_math.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/float_math.h create mode 100644 BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/meshvolume.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/meshvolume.h create mode 100644 BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/planetri.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/planetri.h create mode 100644 BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/raytri.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/raytri.h create mode 100644 BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/splitplane.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/splitplane.h create mode 100644 BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/vlookup.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/vlookup.h create mode 100644 BulletPhysics/bulletTrunk/Extras/EPA/Epa.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/EPA/Epa.h create mode 100644 BulletPhysics/bulletTrunk/Extras/EPA/EpaCommon.h create mode 100644 BulletPhysics/bulletTrunk/Extras/EPA/EpaFace.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/EPA/EpaFace.h create mode 100644 BulletPhysics/bulletTrunk/Extras/EPA/EpaHalfEdge.h create mode 100644 BulletPhysics/bulletTrunk/Extras/EPA/EpaPenetrationDepthSolver.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/EPA/EpaPenetrationDepthSolver.h create mode 100644 BulletPhysics/bulletTrunk/Extras/EPA/EpaPolyhedron.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/EPA/EpaPolyhedron.h create mode 100644 BulletPhysics/bulletTrunk/Extras/EPA/EpaVertex.h create mode 100644 BulletPhysics/bulletTrunk/Extras/EPA/Jamfile create mode 100644 BulletPhysics/bulletTrunk/Extras/ExtraSolid35/CombinedSimplexSolver.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/ExtraSolid35/CombinedSimplexSolver.h create mode 100644 BulletPhysics/bulletTrunk/Extras/ExtraSolid35/ExtraSolid35_vc7.vcproj create mode 100644 BulletPhysics/bulletTrunk/Extras/ExtraSolid35/ExtraSolid35_vc8.vcproj create mode 100644 BulletPhysics/bulletTrunk/Extras/ExtraSolid35/Jamfile create mode 100644 BulletPhysics/bulletTrunk/Extras/ExtraSolid35/LICENSE_QPL.txt create mode 100644 BulletPhysics/bulletTrunk/Extras/ExtraSolid35/ReadMe.txt create mode 100644 BulletPhysics/bulletTrunk/Extras/ExtraSolid35/Solid35.vcproj create mode 100644 BulletPhysics/bulletTrunk/Extras/ExtraSolid35/Solid3EpaPenetrationDepth.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/ExtraSolid35/Solid3EpaPenetrationDepth.h create mode 100644 BulletPhysics/bulletTrunk/Extras/ExtraSolid35/Solid3JohnsonSimplexSolver.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/ExtraSolid35/Solid3JohnsonSimplexSolver.h create mode 100644 BulletPhysics/bulletTrunk/Extras/GIMPACTUtils/CMakeLists.txt create mode 100644 BulletPhysics/bulletTrunk/Extras/GIMPACTUtils/Jamfile create mode 100644 BulletPhysics/bulletTrunk/Extras/GIMPACTUtils/btGImpactConvexDecompositionShape.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/GIMPACTUtils/btGImpactConvexDecompositionShape.h create mode 100644 BulletPhysics/bulletTrunk/Extras/Jamfile create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/AUTHORS create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/CMakeLists.txt create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/COPYING create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/ChangeLog create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/Compatibility.txt create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/Copyright create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/DOCBparser.c create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/HTMLparser.c create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/HTMLtree.c create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/INSTALL create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/Jamfile create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/Makefile.am create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/Makefile.in create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/Makefile.original create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/Makefile.tests create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/NEWS create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/README create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/README.tests create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/SAX.c create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/SAX2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/TODO create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/TODO_SCHEMAS create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/acconfig.h create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/acinclude.m4 create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/aclocal.m4 create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/autom4te.cache/output.0 create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/autom4te.cache/requests create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/autom4te.cache/traces.0 create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/c14n.c create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/catalog.c create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/check-relaxng-test-suite.py create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/check-relaxng-test-suite2.py create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/check-xinclude-test-suite.py create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/check-xml-test-suite.py create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/check-xsddata-test-suite.py create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/chvalid.c create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/config-ps3.h create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/config-win32.h create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/config.guess create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/config.h create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/config.h.in create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/config.log create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/config.status create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/config.sub create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/config2.h create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/configure create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/configure.in create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/dbgen.pl create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/dbgenattr.pl create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/debugXML.c create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/depcomp create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/dict.c create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/doc/Makefile create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/doc/Makefile.am create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/doc/Makefile.in create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/doc/devhelp/Makefile create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/doc/devhelp/Makefile.am create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/doc/devhelp/Makefile.in create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/doc/examples/Makefile create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/doc/examples/Makefile.am create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/doc/examples/Makefile.in create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/elfgcchack.h create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/encoding.c create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/entities.c create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/error.c create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/example/.deps/gjobread.Po create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/example/Makefile create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/example/Makefile.am create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/example/Makefile.in create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/genUnicode.py create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/gentest.py create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/globals.c create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/hash.c create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/include/Makefile create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/include/Makefile.in create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/include/libxml/DOCBparser.h create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/include/libxml/HTMLparser.h create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/include/libxml/HTMLtree.h create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/include/libxml/Makefile create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/include/libxml/Makefile.am create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/include/libxml/Makefile.in create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/include/libxml/SAX.h create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/include/libxml/SAX2.h create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/include/libxml/c14n.h create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/include/libxml/catalog.h create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/include/libxml/chvalid.h create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/include/libxml/debugXML.h create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/include/libxml/dict.h create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/include/libxml/encoding.h create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/include/libxml/entities.h create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/include/libxml/globals.h create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/include/libxml/hash.h create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/include/libxml/list.h create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/include/libxml/nanoftp.h create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/include/libxml/nanohttp.h create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/include/libxml/parser.h create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/include/libxml/parserInternals.h create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/include/libxml/pattern.h create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/include/libxml/relaxng.h create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/include/libxml/schemasInternals.h create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/include/libxml/schematron.h create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/include/libxml/threads.h create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/include/libxml/tree.h create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/include/libxml/uri.h create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/include/libxml/valid.h create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/include/libxml/xinclude.h create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/include/libxml/xlink.h create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/include/libxml/xmlIO.h create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/include/libxml/xmlautomata.h create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/include/libxml/xmlerror.h create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/include/libxml/xmlexports.h create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/include/libxml/xmlmemory.h create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/include/libxml/xmlmodule.h create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/include/libxml/xmlreader.h create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/include/libxml/xmlregexp.h create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/include/libxml/xmlsave.h create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/include/libxml/xmlschemas.h create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/include/libxml/xmlschemastypes.h create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/include/libxml/xmlstring.h create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/include/libxml/xmlunicode.h create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/include/libxml/xmlversion.h create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/include/libxml/xmlversion.h.in create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/include/libxml/xmlwriter.h create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/include/libxml/xpath.h create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/include/libxml/xpathInternals.h create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/include/libxml/xpointer.h create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/include/win32config.h create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/include/wsockcompat.h create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/install-sh create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/legacy.c create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/libtool create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/libxml-2.0-uninstalled.pc create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/libxml-2.0-uninstalled.pc.in create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/libxml-2.0.pc create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/libxml-2.0.pc.in create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/libxml.3 create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/libxml.h create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/libxml.m4 create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/libxml.spec.in create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/libxml2.spec create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/list.c create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/ltmain.sh create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/missing create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/mkinstalldirs create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/nanoftp.c create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/nanohttp.c create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/parser.c create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/parserInternals.c create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/pattern.c create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/python/.deps/libxml.Plo create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/python/.deps/libxml2-py.Plo create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/python/.deps/types.Plo create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/python/Makefile create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/python/Makefile.am create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/python/Makefile.in create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/python/setup.py create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/python/setup.py.in create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/python/tests/Makefile create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/python/tests/Makefile.am create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/python/tests/Makefile.in create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/regressions.py create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/regressions.xml create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/relaxng.c create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/schematron.c create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/stamp-h1 create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/threads.c create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/tree.c create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/trio.c create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/trio.h create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/triodef.h create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/trionan.c create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/trionan.h create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/triop.h create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/triostr.c create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/triostr.h create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/uri.c create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/valid.c create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/xinclude.c create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/xlink.c create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/xml2-config create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/xml2-config.1 create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/xml2-config.in create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/xml2Conf.sh.in create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/xmlIO.c create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/xmlmemory.c create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/xmlmodule.c create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/xmlreader.c create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/xmlregexp.c create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/xmlsave.c create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/xmlschemas.c create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/xmlschemastypes.c create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/xmlstring.c create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/xmlunicode.c create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/xmlwriter.c create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/xpath.c create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/xpointer.c create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/xstc/Makefile create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/xstc/Makefile.am create mode 100644 BulletPhysics/bulletTrunk/Extras/LibXML/xstc/Makefile.in create mode 100644 BulletPhysics/bulletTrunk/Extras/Makefile.am create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/BulletDynamica.6_module create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/BulletMayaPlugin.sln create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/BulletMayaPlugin.vcproj create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/Jamfile create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/Makefile create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/Makefile.mac create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/README create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/box_shape.h create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/box_shape_impl.h create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/bt_box_shape.h create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/bt_collision_shape.h create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/bt_constraint.h create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/bt_convex_hull_shape.h create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/bt_mesh_shape.h create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/bt_nail_constraint.h create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/bt_plane_shape.h create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/bt_rigid_body.h create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/bt_solver.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/bt_solver.h create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/bt_sphere_shape.h create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/bullet.nsi create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/colladaExport.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/colladaExport.h create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/collisionShapeNode.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/collisionShapeNode.h create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/collision_shape.h create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/collision_shape_impl.h create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/constraint.h create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/constraint_impl.h create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/convex_hull_shape.h create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/convex_hull_shape_impl.h create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/dNailConstraintCmd.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/dNailConstraintCmd.h create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/dRigidBodyArrayCmd.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/dRigidBodyArrayCmd.h create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/dRigidBodyCmd.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/dRigidBodyCmd.h create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/dSolverCmd.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/dSolverCmd.h create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/dSolverNode.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/dSolverNode.h create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/doc/index.html create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/drawUtils.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/drawUtils.h create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/icons/dynamica.xpm create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/icons/dynamicaCreateActiveBoxRB.xpm create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/icons/dynamicaCreateActiveBoxRBArray.xpm create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/icons/dynamicaCreateActiveHullRB.xpm create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/icons/dynamicaCreateActiveHullRBArray.xpm create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/icons/dynamicaCreateActiveMeshRB.xpm create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/icons/dynamicaCreateActiveMeshRBArray.xpm create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/icons/dynamicaCreateActivePlaneRB.xpm create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/icons/dynamicaCreateActivePlaneRBArray.xpm create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/icons/dynamicaCreateActiveRB.xpm create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/icons/dynamicaCreateActiveSphereRB.xpm create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/icons/dynamicaCreateActiveSphereRBArray.xpm create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/icons/dynamicaCreateNailConstraint.xpm create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/icons/dynamicaCreatePassiveBoxRB.xpm create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/icons/dynamicaCreatePassiveBoxRBArray.xpm create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/icons/dynamicaCreatePassiveHullRB.xpm create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/icons/dynamicaCreatePassiveHullRBArray.xpm create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/icons/dynamicaCreatePassiveMeshRB.xpm create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/icons/dynamicaCreatePassiveMeshRBArray.xpm create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/icons/dynamicaCreatePassivePlaneRB.xpm create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/icons/dynamicaCreatePassivePlaneRBArray.xpm create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/icons/dynamicaCreatePassiveRB.xpm create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/icons/dynamicaCreatePassiveSphereRB.xpm create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/icons/dynamicaCreatePassiveSphereRBArray.xpm create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/install.bat create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/mathUtils.h create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/mayaUtils.h create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/mesh_shape.h create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/mesh_shape_impl.h create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/mvl/base.h create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/mvl/mat.h create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/mvl/quat.h create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/mvl/traits.h create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/mvl/util.h create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/mvl/vec.h create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/nailConstraintNode.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/nailConstraintNode.h create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/nail_constraint.h create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/nail_constraint_impl.h create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/pdbIO.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/pdbIO.h create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/plane_shape.h create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/plane_shape_impl.h create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/pluginMain.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/rigidBodyArrayNode.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/rigidBodyArrayNode.h create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/rigidBodyNode.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/rigidBodyNode.h create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/rigid_body.h create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/rigid_body_impl.h create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/scenes/donuts.ma create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/scenes/field1.ma create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/scenes/field2.ma create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/scenes/onepeanut.ma create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/scenes/peanutBox.ma create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/scenes/peanutFunnel.ma create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/scripts/AEdCollisionShapeTemplate.mel create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/scripts/AEdNailConstraintTemplate.mel create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/scripts/AEdRigidBodyArrayTemplate.mel create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/scripts/AEdRigidBodyTemplate.mel create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/scripts/AEdSolverTemplate.mel create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/scripts/dynamica.mel create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/scripts/dynamicaUI.mel create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/shared_ptr.h create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/solver.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/solver.h create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/solver_impl.h create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/sphere_shape.h create mode 100644 BulletPhysics/bulletTrunk/Extras/MayaPlugin/sphere_shape_impl.h create mode 100644 BulletPhysics/bulletTrunk/Extras/freeglut/COPYING create mode 100644 BulletPhysics/bulletTrunk/Extras/freeglut/GL/freeglut.h create mode 100644 BulletPhysics/bulletTrunk/Extras/freeglut/GL/freeglut_ext.h create mode 100644 BulletPhysics/bulletTrunk/Extras/freeglut/GL/freeglut_std.h create mode 100644 BulletPhysics/bulletTrunk/Extras/freeglut/GL/glut.h create mode 100644 BulletPhysics/bulletTrunk/Extras/freeglut/freeglut_callbacks.c create mode 100644 BulletPhysics/bulletTrunk/Extras/freeglut/freeglut_cursor.c create mode 100644 BulletPhysics/bulletTrunk/Extras/freeglut/freeglut_display.c create mode 100644 BulletPhysics/bulletTrunk/Extras/freeglut/freeglut_ext.c create mode 100644 BulletPhysics/bulletTrunk/Extras/freeglut/freeglut_font.c create mode 100644 BulletPhysics/bulletTrunk/Extras/freeglut/freeglut_font_data.c create mode 100644 BulletPhysics/bulletTrunk/Extras/freeglut/freeglut_gamemode.c create mode 100644 BulletPhysics/bulletTrunk/Extras/freeglut/freeglut_geometry.c create mode 100644 BulletPhysics/bulletTrunk/Extras/freeglut/freeglut_glutfont_definitions.c create mode 100644 BulletPhysics/bulletTrunk/Extras/freeglut/freeglut_init.c create mode 100644 BulletPhysics/bulletTrunk/Extras/freeglut/freeglut_internal.h create mode 100644 BulletPhysics/bulletTrunk/Extras/freeglut/freeglut_joystick.c create mode 100644 BulletPhysics/bulletTrunk/Extras/freeglut/freeglut_main.c create mode 100644 BulletPhysics/bulletTrunk/Extras/freeglut/freeglut_menu.c create mode 100644 BulletPhysics/bulletTrunk/Extras/freeglut/freeglut_misc.c create mode 100644 BulletPhysics/bulletTrunk/Extras/freeglut/freeglut_overlay.c create mode 100644 BulletPhysics/bulletTrunk/Extras/freeglut/freeglut_state.c create mode 100644 BulletPhysics/bulletTrunk/Extras/freeglut/freeglut_stroke_mono_roman.c create mode 100644 BulletPhysics/bulletTrunk/Extras/freeglut/freeglut_stroke_roman.c create mode 100644 BulletPhysics/bulletTrunk/Extras/freeglut/freeglut_structure.c create mode 100644 BulletPhysics/bulletTrunk/Extras/freeglut/freeglut_teapot.c create mode 100644 BulletPhysics/bulletTrunk/Extras/freeglut/freeglut_teapot_data.h create mode 100644 BulletPhysics/bulletTrunk/Extras/freeglut/freeglut_videoresize.c create mode 100644 BulletPhysics/bulletTrunk/Extras/freeglut/freeglut_window.c create mode 100644 BulletPhysics/bulletTrunk/Extras/glui/CMakeLists.txt create mode 100644 BulletPhysics/bulletTrunk/Extras/glui/GL/glui.h create mode 100644 BulletPhysics/bulletTrunk/Extras/glui/Jamfile create mode 100644 BulletPhysics/bulletTrunk/Extras/glui/algebra3.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/glui/algebra3.h create mode 100644 BulletPhysics/bulletTrunk/Extras/glui/arcball.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/glui/arcball.h create mode 100644 BulletPhysics/bulletTrunk/Extras/glui/glui.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/glui/glui_add_controls.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/glui/glui_bitmap_img_data.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/glui/glui_bitmaps.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/glui/glui_button.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/glui/glui_checkbox.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/glui/glui_column.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/glui/glui_commandline.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/glui/glui_control.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/glui/glui_edittext.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/glui/glui_filebrowser.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/glui/glui_internal.h create mode 100644 BulletPhysics/bulletTrunk/Extras/glui/glui_internal_control.h create mode 100644 BulletPhysics/bulletTrunk/Extras/glui/glui_list.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/glui/glui_listbox.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/glui/glui_mouse_iaction.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/glui/glui_node.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/glui/glui_panel.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/glui/glui_radio.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/glui/glui_rollout.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/glui/glui_rotation.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/glui/glui_scrollbar.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/glui/glui_separator.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/glui/glui_spinner.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/glui/glui_statictext.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/glui/glui_string.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/glui/glui_textbox.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/glui/glui_translation.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/glui/glui_tree.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/glui/glui_treepanel.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/glui/glui_window.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/glui/quaternion.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/glui/quaternion.h create mode 100644 BulletPhysics/bulletTrunk/Extras/glui/readme.txt create mode 100644 BulletPhysics/bulletTrunk/Extras/iff/CMakeLists.txt create mode 100644 BulletPhysics/bulletTrunk/Extras/iff/IFF.txt create mode 100644 BulletPhysics/bulletTrunk/Extras/iff/Jamfile create mode 100644 BulletPhysics/bulletTrunk/Extras/iff/iff.h create mode 100644 BulletPhysics/bulletTrunk/Extras/iff/iffCheck/Jamfile create mode 100644 BulletPhysics/bulletTrunk/Extras/iff/iffCheck/iffcheck.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/iff/iffCreateTest/main.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/iff/iffr.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/iff/iffw.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/khx2dae/Bullet_dae_screenshot.jpg create mode 100644 BulletPhysics/bulletTrunk/Extras/khx2dae/Havok5.5toColladaPhysics.dae create mode 100644 BulletPhysics/bulletTrunk/Extras/khx2dae/Havok_hkx_screenshot.jpg create mode 100644 BulletPhysics/bulletTrunk/Extras/khx2dae/SimpleLoadDemo.patch create mode 100644 BulletPhysics/bulletTrunk/Extras/khx2dae/readme.txt create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/AlgebraicCCD/BU_AlgebraicPolynomialSolver.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/AlgebraicCCD/BU_AlgebraicPolynomialSolver.h create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/AlgebraicCCD/BU_Collidable.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/AlgebraicCCD/BU_Collidable.h create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/AlgebraicCCD/BU_CollisionPair.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/AlgebraicCCD/BU_CollisionPair.h create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/AlgebraicCCD/BU_EdgeEdge.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/AlgebraicCCD/BU_EdgeEdge.h create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/AlgebraicCCD/BU_MotionStateInterface.h create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/AlgebraicCCD/BU_PolynomialSolverInterface.h create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/AlgebraicCCD/BU_Screwing.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/AlgebraicCCD/BU_Screwing.h create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/AlgebraicCCD/BU_StaticMotionState.h create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/AlgebraicCCD/BU_VertexPoly.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/AlgebraicCCD/BU_VertexPoly.h create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Keys/BulletX.snk create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Keys/BulletXDemos.snk create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Keys/Demos.snk create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/SharedContent/Models/box.x create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/SharedContent/Models/cylinder.x create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/SharedContent/Models/sphere.x create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/SharedContent/bullet_ico.ico create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX.Demos.Basic/BasicDemo.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX.Demos.Basic/Program.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX.Demos.Basic/Properties/AssemblyInfo.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX.Demos.Basic/XnaDevRu.BulletX.Demos.Basic.csproj create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX.Demos.Ccd/CcdDemo.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX.Demos.Ccd/Program.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX.Demos.Ccd/Properties/AssemblyInfo.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX.Demos.Ccd/XnaDevRu.BulletX.Demos.Ccd.csproj create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX.Demos.Constraints/ConstraintDemo.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX.Demos.Constraints/Program.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX.Demos.Constraints/Properties/AssemblyInfo.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX.Demos.Constraints/XnaDevRu.BulletX.Demos.Constraints.csproj create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX.Demos/BulletXDemos.snk create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX.Demos/DemoGame.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX.Demos/Properties/AssemblyInfo.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX.Demos/XnaDevRu.BulletX.Demos.csproj create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/BulletDebug.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/BulletX.snk create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Collision/BroadphaseCollision/AxisSweep3.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Collision/BroadphaseCollision/BroadphaseNativeTypes.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Collision/BroadphaseCollision/BroadphasePair.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Collision/BroadphaseCollision/BroadphaseProxy.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Collision/BroadphaseCollision/CollisionAlgorithm.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Collision/BroadphaseCollision/CollisionAlgorithmConstructionInfo.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Collision/BroadphaseCollision/DispatcherInfo.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Collision/BroadphaseCollision/IBroadphase.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Collision/BroadphaseCollision/IDispatcher.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Collision/BroadphaseCollision/IOverlapCallback.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Collision/BroadphaseCollision/OverlappingPairCache.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Collision/BroadphaseCollision/SimpleBroadphase.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Collision/BroadphaseCollision/SimpleBroadphaseProxy.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Collision/CollisionDispatch/BridgeTriangleRaycastCallback.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Collision/CollisionDispatch/CollisionAlgorithmCreateFunc.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Collision/CollisionDispatch/CollisionDispatcher.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Collision/CollisionDispatch/CollisionObject.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Collision/CollisionDispatch/CollisionPairCallback.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Collision/CollisionDispatch/CollisionWorld.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Collision/CollisionDispatch/CompoundCollisionAlgorithm.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Collision/CollisionDispatch/ConvexConcaveCollisionAlgorithm.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Collision/CollisionDispatch/ConvexConvexCollisionAlgorithm.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Collision/CollisionDispatch/ConvexTriangleCallback.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Collision/CollisionDispatch/EmptyAlgorithm.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Collision/CollisionDispatch/ManifoldResult.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Collision/CollisionDispatch/SimulationIslandManager.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Collision/CollisionDispatch/SphereBoxCollisionAlgorithm.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Collision/CollisionDispatch/SphereSphereCollisionAlgorithm.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Collision/CollisionDispatch/SphereTriangleCollisionAlgorithm.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Collision/CollisionDispatch/SphereTriangleDetector.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Collision/CollisionDispatch/UnionFind.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Collision/CollisionShapes/BUSimplex1to4.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Collision/CollisionShapes/BoxShape.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Collision/CollisionShapes/BvhTriangleMeshShape.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Collision/CollisionShapes/CollisionShape.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Collision/CollisionShapes/CompoundShape.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Collision/CollisionShapes/ConcaveShape.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Collision/CollisionShapes/ConeShape.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Collision/CollisionShapes/ConvexHullShape.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Collision/CollisionShapes/ConvexShape.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Collision/CollisionShapes/ConvexTriangleMeshShape.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Collision/CollisionShapes/CylinderShape.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Collision/CollisionShapes/CylinderShapeX.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Collision/CollisionShapes/CylinderShapeZ.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Collision/CollisionShapes/EmptyShape.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Collision/CollisionShapes/FilteredCallback.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Collision/CollisionShapes/InternalTriangleIndexCallback.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Collision/CollisionShapes/LocalSupportVertexCallback.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Collision/CollisionShapes/MinkowskiSumShape.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Collision/CollisionShapes/MultiSphereShape.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Collision/CollisionShapes/NodeOverlapCallback.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Collision/CollisionShapes/OptimizedBvh.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Collision/CollisionShapes/OptimizedBvhNode.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Collision/CollisionShapes/PolyhedralConvexShape.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Collision/CollisionShapes/SphereShape.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Collision/CollisionShapes/StaticPlaneShape.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Collision/CollisionShapes/StridingMeshInterface.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Collision/CollisionShapes/SupportVertexCallback.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Collision/CollisionShapes/TriangleBuffer.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Collision/CollisionShapes/TriangleCallback.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Collision/CollisionShapes/TriangleIndexVertexArray.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Collision/CollisionShapes/TriangleMesh.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Collision/CollisionShapes/TriangleMeshShape.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Collision/CollisionShapes/TriangleShape.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Collision/NarrowPhaseCollision/ContinuousConvexCollision.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Collision/NarrowPhaseCollision/ConvexCast.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Collision/NarrowPhaseCollision/DiscreteCollisionDetectorInterface.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Collision/NarrowPhaseCollision/GjkConvexCast.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Collision/NarrowPhaseCollision/GjkEpa.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Collision/NarrowPhaseCollision/GjkEpaPenetrationDepthSolver.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Collision/NarrowPhaseCollision/GjkEpaSolver.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Collision/NarrowPhaseCollision/GjkPairDetector.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Collision/NarrowPhaseCollision/IConvexPenetrationDepthSolver.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Collision/NarrowPhaseCollision/ISimplexSolver.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Collision/NarrowPhaseCollision/ManifoldPoint.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Collision/NarrowPhaseCollision/MinkowskiPenetrationDepthSolver.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Collision/NarrowPhaseCollision/PersistentManifold.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Collision/NarrowPhaseCollision/PointCollector.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Collision/NarrowPhaseCollision/SubsimplexConvexCast.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Collision/NarrowPhaseCollision/TriangleRaycastCallback.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Collision/NarrowPhaseCollision/VoronoiSimplexSolver.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Dynamics/ConstraintSolver/ContactConstraint.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Dynamics/ConstraintSolver/ContactSolverInfo.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Dynamics/ConstraintSolver/Generic6DofConstraint.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Dynamics/ConstraintSolver/HingeConstraint.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Dynamics/ConstraintSolver/IConstraintSolver.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Dynamics/ConstraintSolver/JacobianEntry.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Dynamics/ConstraintSolver/Point2PointConstraint.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Dynamics/ConstraintSolver/SequentialImpulseConstraintSolver.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Dynamics/ConstraintSolver/Solve2LinearConstraint.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Dynamics/ConstraintSolver/SolverBody.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Dynamics/ConstraintSolver/SolverConstraint.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Dynamics/ConstraintSolver/TypedConstraint.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Dynamics/DiscreteDynamicsWorld.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Dynamics/DynamicsWorld.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Dynamics/RigidBody.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Dynamics/SimpleDynamicsWorld.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Dynamics/Vehicle/RaycastVehicle.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Dynamics/Vehicle/VehicleRaycaster.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Dynamics/Vehicle/WheelInfo.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Exceptions/BulletException.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/IDebugDraw.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/LinearMath/DefaultMotionState.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/LinearMath/MathHelper.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/LinearMath/MatrixOperations.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/LinearMath/MotionState.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/LinearMath/QuadWord.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/LinearMath/Quaternion.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/LinearMath/TransformUtil.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/LinearMath/Vector3.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/LinearMath/Vector4.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/Properties/AssemblyInfo.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/XnaDebugDrawer.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/Source/XnaDevRu.BulletX/XnaDevRu.BulletX.csproj create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.BulletX/XnaDevRu.BulletX.sln create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.Demos/Source/XnaDevRu.Demos/Camera.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.Demos/Source/XnaDevRu.Demos/Demos.snk create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.Demos/Source/XnaDevRu.Demos/Framerate.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.Demos/Source/XnaDevRu.Demos/Properties/AssemblyInfo.cs create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.Demos/Source/XnaDevRu.Demos/XnaDevRu.Demos.csproj create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/Source/XnaDevRu.Demos/XnaDevRu.Demos.sln create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/BulletX/readme.txt create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/GPUphysics/CHANGES create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/GPUphysics/CMakeLists.txt create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/GPUphysics/DEBUGGING_README create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/GPUphysics/GPU_physics.h create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/GPUphysics/GPU_physics_demo.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/GPUphysics/Jamfile create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/GPUphysics/LICENSE create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/GPUphysics/Makefile create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/GPUphysics/Makefile.Mac create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/GPUphysics/README create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/GPUphysics/clock.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/GPUphysics/clock.h create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/GPUphysics/collisionShader.frag create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/GPUphysics/cubeShader.frag create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/GPUphysics/cubeShader.vert create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/GPUphysics/cubeShaderNoTexture.vert create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/GPUphysics/fboSupport.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/GPUphysics/fboSupport.h create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/GPUphysics/shaderSupport.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/GPUphysics/shaderSupport.h create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/SATConvexCollision/Geometry.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/SATConvexCollision/Geometry.h create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/SATConvexCollision/Geometry.inl create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/SATConvexCollision/Hull.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/SATConvexCollision/Hull.h create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/SATConvexCollision/Hull.inl create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/SATConvexCollision/HullContactCollector.h create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/SATConvexCollision/Maths.h create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/SATConvexCollision/Matrix.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/SATConvexCollision/Matrix.h create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/SATConvexCollision/Matrix.inl create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/SATConvexCollision/Memory2.h create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/SATConvexCollision/Quat.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/SATConvexCollision/Quat.h create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/SATConvexCollision/Quat.inl create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/SATConvexCollision/Scalar.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/SATConvexCollision/Scalar.h create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/SATConvexCollision/Scalar.inl create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/SATConvexCollision/Shape.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/SATConvexCollision/Shape.h create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/SATConvexCollision/Vector.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/SATConvexCollision/Vector.h create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/SATConvexCollision/Vector.inl create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/SATConvexCollision/VectorBase.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/SATConvexCollision/VectorBase.h create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/SATConvexCollision/VectorBase.inl create mode 100644 BulletPhysics/bulletTrunk/Extras/obsolete/test_BulletOde.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/quickstep/btOdeContactJoint.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/quickstep/btOdeContactJoint.h create mode 100644 BulletPhysics/bulletTrunk/Extras/quickstep/btOdeJoint.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/quickstep/btOdeJoint.h create mode 100644 BulletPhysics/bulletTrunk/Extras/quickstep/btOdeMacros.h create mode 100644 BulletPhysics/bulletTrunk/Extras/quickstep/btOdeQuickstepConstraintSolver.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/quickstep/btOdeQuickstepConstraintSolver.h create mode 100644 BulletPhysics/bulletTrunk/Extras/quickstep/btOdeSolverBody.h create mode 100644 BulletPhysics/bulletTrunk/Extras/quickstep/btOdeTypedJoint.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/quickstep/btOdeTypedJoint.h create mode 100644 BulletPhysics/bulletTrunk/Extras/quickstep/btSorLcp.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/quickstep/btSorLcp.h create mode 100644 BulletPhysics/bulletTrunk/Extras/readblend/LICENSE.txt create mode 100644 BulletPhysics/bulletTrunk/Extras/readblend/Makefile create mode 100644 BulletPhysics/bulletTrunk/Extras/readblend/README.blendstruct create mode 100644 BulletPhysics/bulletTrunk/Extras/readblend/ReadBlend.sln create mode 100644 BulletPhysics/bulletTrunk/Extras/readblend/ReadBlend.vcproj create mode 100644 BulletPhysics/bulletTrunk/Extras/readblend/abs-file.h create mode 100644 BulletPhysics/bulletTrunk/Extras/readblend/readblend.c create mode 100644 BulletPhysics/bulletTrunk/Extras/readblend/readblend.h create mode 100644 BulletPhysics/bulletTrunk/Extras/readblend/testblend.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/LICENSE create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/Make.defs create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/Make.rules create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/Make.test create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/Makefile create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/README create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/Makefile create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/absi4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/acosf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/asinf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/atan2f4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/atanf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/cbrtf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/ceild2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/ceilf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/common-test.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/copysignd2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/copysignf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/cosd2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/cosf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/divd2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/divf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/divi4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/divu4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/exp2f4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/expf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/expm1f4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/fabsd2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/fabsf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/fdimd2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/fdimf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/floord2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/floorf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/fmad2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/fmaf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/fmaxd2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/fmaxf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/fmind2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/fminf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/fmodd2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/fmodf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/fpclassifyd2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/fpclassifyf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/frexpd2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/frexpf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/hypotd2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/hypotf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/ilogbd2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/ilogbf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/irintf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/iroundf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/is0denormd2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/is0denormf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/isequald2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/isequalf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/isfinited2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/isfinitef4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/isgreaterd2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/isgreaterequald2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/isgreaterequalf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/isgreaterf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/isinfd2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/isinff4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/islessd2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/islessequald2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/islessequalf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/islessf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/islessgreaterd2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/islessgreaterf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/isnand2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/isnanf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/isnormald2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/isnormalf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/isunorderedd2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/isunorderedf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/ldexpd2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/ldexpf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/llabsi2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/lldivi2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/lldivu2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/llrintd2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/llrintf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/llroundd2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/llroundf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/log10f4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/log1pf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/log2f4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/logbd2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/logbf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/logf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/modfd2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/modff4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/nearbyintd2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/nearbyintf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/negated2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/negatef4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/negatei4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/negatell2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/nextafterd2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/nextafterf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/powf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/recipd2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/recipf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/remainderd2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/remainderf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/remquod2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/remquof4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/rintd2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/rintf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/roundd2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/roundf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/rsqrtd2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/rsqrtf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/scalbllnd2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/scalbnf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/signbitd2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/signbitf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/simdmath.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/simdmath/_sincos.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/sincosd2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/sincosf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/sind2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/sinf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/sqrtd2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/sqrtf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/tand2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/tanf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/truncd2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/common/truncf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/ppu/Makefile create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/ppu/simdmath/_vec_utils.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/ppu/simdmath/absi4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/ppu/simdmath/acosf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/ppu/simdmath/asinf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/ppu/simdmath/atan2f4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/ppu/simdmath/atanf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/ppu/simdmath/cbrtf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/ppu/simdmath/ceilf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/ppu/simdmath/copysignf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/ppu/simdmath/cosf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/ppu/simdmath/divf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/ppu/simdmath/divi4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/ppu/simdmath/exp2f4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/ppu/simdmath/expf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/ppu/simdmath/expm1f4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/ppu/simdmath/fabsf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/ppu/simdmath/fdimf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/ppu/simdmath/floorf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/ppu/simdmath/fmaf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/ppu/simdmath/fmaxf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/ppu/simdmath/fminf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/ppu/simdmath/fmodf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/ppu/simdmath/frexpf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/ppu/simdmath/hypotf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/ppu/simdmath/ilogbf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/ppu/simdmath/ldexpf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/ppu/simdmath/log10f4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/ppu/simdmath/log1pf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/ppu/simdmath/log2f4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/ppu/simdmath/logbf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/ppu/simdmath/logf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/ppu/simdmath/modff4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/ppu/simdmath/negatef4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/ppu/simdmath/negatei4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/ppu/simdmath/powf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/ppu/simdmath/recipf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/ppu/simdmath/rsqrtf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/ppu/simdmath/sincosf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/ppu/simdmath/sinf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/ppu/simdmath/sqrtf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/ppu/simdmath/tanf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/ppu/simdmath/truncf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/ppu/tests/Makefile create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/ppu/tests/absi4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/ppu/tests/ceilf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/ppu/tests/copysignf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/ppu/tests/divf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/ppu/tests/divi4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/ppu/tests/fabsf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/ppu/tests/floorf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/ppu/tests/fminf4_fmaxf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/ppu/tests/fmodf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/ppu/tests/modff4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/ppu/tests/negatef4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/ppu/tests/negatei4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/ppu/tests/recipf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/ppu/tests/rsqrtf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/ppu/tests/sqrtf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/ppu/tests/testutils.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/ppu/tests/testutils.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/ppu/tests/truncf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/simdmath.spec create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/Makefile create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/_lldiv.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/_remainder.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/_vec_utils.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/absi4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/acosf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/asinf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/atan2f4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/atanf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/cbrtf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/ceild2.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/ceilf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/copysignd2.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/copysignf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/cosd2.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/cosf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/divd2.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/divf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/divi4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/divu4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/exp2f4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/expf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/expm1f4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/fabsd2.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/fabsf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/fdimd2.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/fdimf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/floord2.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/floorf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/fmad2.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/fmaf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/fmaxd2.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/fmaxf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/fmind2.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/fminf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/fmodd2.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/fmodf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/fpclassifyd2.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/fpclassifyf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/frexpd2.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/frexpf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/hypotd2.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/hypotf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/ilogbd2.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/ilogbf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/irintf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/iroundf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/is0denormd2.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/is0denormf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/isequald2.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/isequalf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/isfinited2.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/isfinitef4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/isgreaterd2.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/isgreaterequald2.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/isgreaterequalf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/isgreaterf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/isinfd2.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/isinff4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/islessd2.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/islessequald2.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/islessequalf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/islessf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/islessgreaterd2.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/islessgreaterf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/isnand2.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/isnanf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/isnormald2.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/isnormalf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/isunorderedd2.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/isunorderedf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/ldexpd2.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/ldexpf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/llabsi2.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/lldivi2.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/lldivu2.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/llrintd2.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/llrintf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/llroundd2.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/llroundf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/log10f4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/log1pf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/log2f4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/logbd2.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/logbf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/logf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/modfd2.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/modff4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/nearbyintd2.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/nearbyintf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/negated2.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/negatef4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/negatei4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/negatell2.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/nextafterd2.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/nextafterf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/powf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/recipd2.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/recipf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/remainderd2.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/remainderf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/remquod2.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/remquof4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/rintd2.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/rintf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/roundd2.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/roundf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/rsqrtd2.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/rsqrtf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/scalbllnd2.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/scalbnf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/signbitd2.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/signbitf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/sincosd2.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/sincosf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/sind2.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/sinf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/sqrtd2.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/sqrtf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/tand2.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/tanf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/truncd2.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/simdmath/truncf4.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/Makefile create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/absi4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/ceild2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/ceilf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/copysignd2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/copysignf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/divd2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/divf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/divi4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/divu4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/fabsd2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/fabsf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/fdimd2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/floord2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/floorf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/fmad2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/fmind2_fmaxd2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/fminf4_fmaxf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/fmodd2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/fmodf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/fpclassifyd2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/fpclassifyf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/frexpd2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/frexpf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/hypotd2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/hypotf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/ilogbd2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/ilogbf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/irintf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/iroundf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/is0denormd2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/is0denormf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/isequald2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/isequalf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/isfinited2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/isfinitef4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/isgreaterd2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/isgreaterequald2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/isgreaterequalf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/isgreaterf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/isinfd2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/isinff4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/islessd2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/islessequald2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/islessequalf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/islessf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/islessgreaterd2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/islessgreaterf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/isnand2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/isnanf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/isnormald2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/isnormalf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/isunorderedd2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/isunorderedf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/ldexpd2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/llabsi2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/lldivi2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/lldivu2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/llrintd2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/llrintf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/llroundd2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/llroundf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/logbd2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/logbf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/modfd2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/modff4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/nearbyintd2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/nearbyintf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/negated2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/negatef4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/negatei4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/negatell2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/nextafterd2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/nextafterf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/recipd2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/recipf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/remainderd2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/remainderf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/remquod2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/remquof4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/rintd2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/rintf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/roundd2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/roundf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/rsqrtd2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/rsqrtf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/scalbllnd2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/scalbnf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/signbitd2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/signbitf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/sqrtd2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/sqrtf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/testutils.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/testutils.h create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/truncd2.c create mode 100644 BulletPhysics/bulletTrunk/Extras/simdmathlibrary/spu/tests/truncf4.c create mode 100644 BulletPhysics/bulletTrunk/Extras/software_cache/cache/CommonPublicLicense-1.0 create mode 100644 BulletPhysics/bulletTrunk/Extras/software_cache/cache/include/Makefile create mode 100644 BulletPhysics/bulletTrunk/Extras/software_cache/cache/include/README create mode 100644 BulletPhysics/bulletTrunk/Extras/software_cache/cache/include/api.h create mode 100644 BulletPhysics/bulletTrunk/Extras/software_cache/cache/include/cbe_mfc.h create mode 100644 BulletPhysics/bulletTrunk/Extras/software_cache/cache/include/defs.h create mode 100644 BulletPhysics/bulletTrunk/Extras/software_cache/cache/include/dma.h create mode 100644 BulletPhysics/bulletTrunk/Extras/software_cache/cache/include/ilog2.h create mode 100644 BulletPhysics/bulletTrunk/Extras/software_cache/cache/include/memset.h create mode 100644 BulletPhysics/bulletTrunk/Extras/software_cache/cache/include/nway-lookup.h create mode 100644 BulletPhysics/bulletTrunk/Extras/software_cache/cache/include/nway-miss.h create mode 100644 BulletPhysics/bulletTrunk/Extras/software_cache/cache/include/nway-opt.h create mode 100644 BulletPhysics/bulletTrunk/Extras/software_cache/cache/include/nway-replace.h create mode 100644 BulletPhysics/bulletTrunk/Extras/software_cache/cache/include/nway.h create mode 100644 BulletPhysics/bulletTrunk/Extras/software_cache/cache/include/spe_cache.h create mode 100644 BulletPhysics/bulletTrunk/Extras/software_cache/cache/include/vec_literal.h create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/LICENSE create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/Makefile create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/README create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/doc/Vector_Math_Library-Overview.pdf create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/include/vectormath/SSE/cpp/boolInVec.h create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/include/vectormath/SSE/cpp/floatInVec.h create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/include/vectormath/SSE/cpp/mat_aos.h create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/include/vectormath/SSE/cpp/quat_aos.h create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/include/vectormath/SSE/cpp/readme_e.txt create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/include/vectormath/SSE/cpp/vec_aos.h create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/include/vectormath/SSE/cpp/vecidx_aos.h create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/include/vectormath/SSE/cpp/vectormath_aos.h create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/include/vectormath/c/vectormath_aos.h create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/include/vectormath/c/vectormath_aos_v.h create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/include/vectormath/c/vectormath_soa.h create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/include/vectormath/c/vectormath_soa_v.h create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/include/vectormath/cpp/vectormath_aos.h create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/include/vectormath/cpp/vectormath_soa.h create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/include/vectormath/ppu/c/mat_aos.h create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/include/vectormath/ppu/c/mat_aos_v.h create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/include/vectormath/ppu/c/mat_soa.h create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/include/vectormath/ppu/c/mat_soa_v.h create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/include/vectormath/ppu/c/quat_aos.h create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/include/vectormath/ppu/c/quat_aos_v.h create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/include/vectormath/ppu/c/quat_soa.h create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/include/vectormath/ppu/c/quat_soa_v.h create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/include/vectormath/ppu/c/vec_aos.h create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/include/vectormath/ppu/c/vec_aos_v.h create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/include/vectormath/ppu/c/vec_soa.h create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/include/vectormath/ppu/c/vec_soa_v.h create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/include/vectormath/ppu/c/vec_types.h create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/include/vectormath/ppu/c/vectormath_aos.h create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/include/vectormath/ppu/c/vectormath_aos_v.h create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/include/vectormath/ppu/c/vectormath_soa.h create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/include/vectormath/ppu/c/vectormath_soa_v.h create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/include/vectormath/ppu/cpp/boolInVec.h create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/include/vectormath/ppu/cpp/floatInVec.h create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/include/vectormath/ppu/cpp/mat_aos.h create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/include/vectormath/ppu/cpp/mat_soa.h create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/include/vectormath/ppu/cpp/quat_aos.h create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/include/vectormath/ppu/cpp/quat_soa.h create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/include/vectormath/ppu/cpp/vec_aos.h create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/include/vectormath/ppu/cpp/vec_soa.h create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/include/vectormath/ppu/cpp/vecidx_aos.h create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/include/vectormath/ppu/cpp/vectormath_aos.h create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/include/vectormath/ppu/cpp/vectormath_soa.h create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/include/vectormath/scalar/c/mat_aos.h create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/include/vectormath/scalar/c/mat_aos_v.h create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/include/vectormath/scalar/c/quat_aos.h create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/include/vectormath/scalar/c/quat_aos_v.h create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/include/vectormath/scalar/c/vec_aos.h create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/include/vectormath/scalar/c/vec_aos_v.h create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/include/vectormath/scalar/c/vectormath_aos.h create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/include/vectormath/scalar/c/vectormath_aos_v.h create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/include/vectormath/scalar/cpp/mat_aos.h create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/include/vectormath/scalar/cpp/quat_aos.h create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/include/vectormath/scalar/cpp/vec_aos.h create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/include/vectormath/scalar/cpp/vectormath_aos.h create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/include/vectormath/spu/c/mat_aos.h create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/include/vectormath/spu/c/mat_aos_v.h create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/include/vectormath/spu/c/mat_soa.h create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/include/vectormath/spu/c/mat_soa_v.h create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/include/vectormath/spu/c/quat_aos.h create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/include/vectormath/spu/c/quat_aos_v.h create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/include/vectormath/spu/c/quat_soa.h create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/include/vectormath/spu/c/quat_soa_v.h create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/include/vectormath/spu/c/vec_aos.h create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/include/vectormath/spu/c/vec_aos_v.h create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/include/vectormath/spu/c/vec_soa.h create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/include/vectormath/spu/c/vec_soa_v.h create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/include/vectormath/spu/c/vectormath_aos.h create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/include/vectormath/spu/c/vectormath_aos_v.h create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/include/vectormath/spu/c/vectormath_soa.h create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/include/vectormath/spu/c/vectormath_soa_v.h create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/include/vectormath/spu/cpp/boolInVec.h create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/include/vectormath/spu/cpp/floatInVec.h create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/include/vectormath/spu/cpp/mat_aos.h create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/include/vectormath/spu/cpp/mat_soa.h create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/include/vectormath/spu/cpp/quat_aos.h create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/include/vectormath/spu/cpp/quat_soa.h create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/include/vectormath/spu/cpp/vec_aos.h create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/include/vectormath/spu/cpp/vec_soa.h create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/include/vectormath/spu/cpp/vecidx_aos.h create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/include/vectormath/spu/cpp/vectormath_aos.h create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/include/vectormath/spu/cpp/vectormath_soa.h create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/tests/Makefile create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/tests/clean.pl create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/tests/compare.pl create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/tests/main_vmtest.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/tests/test.h create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/tests/test1_aos_c.c create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/tests/test1_aos_cpp.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/tests/test1_reference.txt create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/tests/test1_soa_c.c create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/tests/test1_soa_cpp.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/tests/test2_aos_c.c create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/tests/test2_aos_cpp.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/tests/test2_reference.txt create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/tests/test2_soa_c.c create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/tests/test2_soa_cpp.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/tests/test3_aos_c.c create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/tests/test3_aos_cpp.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/tests/test3_reference.txt create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/tests/test3_soa_c.c create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/tests/test3_soa_cpp.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/tests/test4_aos_c.c create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/tests/test4_aos_cpp.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/tests/test4_reference.txt create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/tests/test4_soa_c.c create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/tests/test4_soa_cpp.cpp create mode 100644 BulletPhysics/bulletTrunk/Extras/vectormathlibrary/vectormath.spec create mode 100644 BulletPhysics/bulletTrunk/GLUT32.DLL create mode 100644 BulletPhysics/bulletTrunk/Glut/EmptyGL/GL/egl_cpx.h create mode 100644 BulletPhysics/bulletTrunk/Glut/EmptyGL/GL/egl_defs.h create mode 100644 BulletPhysics/bulletTrunk/Glut/EmptyGL/GL/egl_logged.h create mode 100644 BulletPhysics/bulletTrunk/Glut/EmptyGL/GL/egl_tokens.h create mode 100644 BulletPhysics/bulletTrunk/Glut/EmptyGL/GL/egl_void.h create mode 100644 BulletPhysics/bulletTrunk/Glut/EmptyGL/GL/gl.h create mode 100644 BulletPhysics/bulletTrunk/Glut/EmptyGL/GL/glu.h create mode 100644 BulletPhysics/bulletTrunk/Glut/EmptyGL/GL/glut.h create mode 100644 BulletPhysics/bulletTrunk/Glut/GL/glew.h create mode 100644 BulletPhysics/bulletTrunk/Glut/GL/glext.h create mode 100644 BulletPhysics/bulletTrunk/Glut/GL/glut.h create mode 100644 BulletPhysics/bulletTrunk/Glut/GL/glxew.h create mode 100644 BulletPhysics/bulletTrunk/Glut/GL/glxext.h create mode 100644 BulletPhysics/bulletTrunk/Glut/GL/wglew.h create mode 100644 BulletPhysics/bulletTrunk/Glut/GL/wglext.h create mode 100644 BulletPhysics/bulletTrunk/Glut/glew32.lib create mode 100644 BulletPhysics/bulletTrunk/Glut/glut32.lib create mode 100644 BulletPhysics/bulletTrunk/INSTALL create mode 100644 BulletPhysics/bulletTrunk/Jamfile.in create mode 100644 BulletPhysics/bulletTrunk/Jamrules create mode 100644 BulletPhysics/bulletTrunk/LICENSE create mode 100644 BulletPhysics/bulletTrunk/Makefile.am create mode 100644 BulletPhysics/bulletTrunk/NEWS create mode 100644 BulletPhysics/bulletTrunk/README create mode 100644 BulletPhysics/bulletTrunk/RELEASING.TXT create mode 100644 BulletPhysics/bulletTrunk/VERSION create mode 100644 BulletPhysics/bulletTrunk/acinclude.m4 create mode 100644 BulletPhysics/bulletTrunk/autogen.sh create mode 100644 BulletPhysics/bulletTrunk/bullet.pc.in create mode 100644 BulletPhysics/bulletTrunk/config.h.in create mode 100644 BulletPhysics/bulletTrunk/configure.ac create mode 100644 BulletPhysics/bulletTrunk/convex0.bin create mode 100644 BulletPhysics/bulletTrunk/file.obj create mode 100644 BulletPhysics/bulletTrunk/glew32.dll create mode 100644 BulletPhysics/bulletTrunk/heightfield128x128.raw create mode 100644 BulletPhysics/bulletTrunk/install-sh create mode 100644 BulletPhysics/bulletTrunk/jam-2.5/Build.com create mode 100644 BulletPhysics/bulletTrunk/jam-2.5/Build.mpw create mode 100644 BulletPhysics/bulletTrunk/jam-2.5/Jam.html create mode 100644 BulletPhysics/bulletTrunk/jam-2.5/Jambase create mode 100644 BulletPhysics/bulletTrunk/jam-2.5/Jambase.html create mode 100644 BulletPhysics/bulletTrunk/jam-2.5/Jamfile create mode 100644 BulletPhysics/bulletTrunk/jam-2.5/Jamfile.html create mode 100644 BulletPhysics/bulletTrunk/jam-2.5/Makefile create mode 100644 BulletPhysics/bulletTrunk/jam-2.5/Porting create mode 100644 BulletPhysics/bulletTrunk/jam-2.5/README create mode 100644 BulletPhysics/bulletTrunk/jam-2.5/RELNOTES create mode 100644 BulletPhysics/bulletTrunk/jam-2.5/builtins.c create mode 100644 BulletPhysics/bulletTrunk/jam-2.5/builtins.h create mode 100644 BulletPhysics/bulletTrunk/jam-2.5/command.c create mode 100644 BulletPhysics/bulletTrunk/jam-2.5/command.h create mode 100644 BulletPhysics/bulletTrunk/jam-2.5/compile.c create mode 100644 BulletPhysics/bulletTrunk/jam-2.5/compile.h create mode 100644 BulletPhysics/bulletTrunk/jam-2.5/execcmd.h create mode 100644 BulletPhysics/bulletTrunk/jam-2.5/execmac.c create mode 100644 BulletPhysics/bulletTrunk/jam-2.5/execunix.c create mode 100644 BulletPhysics/bulletTrunk/jam-2.5/execvms.c create mode 100644 BulletPhysics/bulletTrunk/jam-2.5/expand.c create mode 100644 BulletPhysics/bulletTrunk/jam-2.5/expand.h create mode 100644 BulletPhysics/bulletTrunk/jam-2.5/filemac.c create mode 100644 BulletPhysics/bulletTrunk/jam-2.5/filent.c create mode 100644 BulletPhysics/bulletTrunk/jam-2.5/fileos2.c create mode 100644 BulletPhysics/bulletTrunk/jam-2.5/filesys.h create mode 100644 BulletPhysics/bulletTrunk/jam-2.5/fileunix.c create mode 100644 BulletPhysics/bulletTrunk/jam-2.5/filevms.c create mode 100644 BulletPhysics/bulletTrunk/jam-2.5/glob.c create mode 100644 BulletPhysics/bulletTrunk/jam-2.5/hash.c create mode 100644 BulletPhysics/bulletTrunk/jam-2.5/hash.h create mode 100644 BulletPhysics/bulletTrunk/jam-2.5/headers.c create mode 100644 BulletPhysics/bulletTrunk/jam-2.5/headers.h create mode 100644 BulletPhysics/bulletTrunk/jam-2.5/jam.c create mode 100644 BulletPhysics/bulletTrunk/jam-2.5/jam.h create mode 100644 BulletPhysics/bulletTrunk/jam-2.5/jambase.c create mode 100644 BulletPhysics/bulletTrunk/jam-2.5/jambase.h create mode 100644 BulletPhysics/bulletTrunk/jam-2.5/jamgram.c create mode 100644 BulletPhysics/bulletTrunk/jam-2.5/jamgram.h create mode 100644 BulletPhysics/bulletTrunk/jam-2.5/jamgram.y create mode 100644 BulletPhysics/bulletTrunk/jam-2.5/jamgram.yy create mode 100644 BulletPhysics/bulletTrunk/jam-2.5/jamgramtab.h create mode 100644 BulletPhysics/bulletTrunk/jam-2.5/lists.c create mode 100644 BulletPhysics/bulletTrunk/jam-2.5/lists.h create mode 100644 BulletPhysics/bulletTrunk/jam-2.5/make.c create mode 100644 BulletPhysics/bulletTrunk/jam-2.5/make.h create mode 100644 BulletPhysics/bulletTrunk/jam-2.5/make1.c create mode 100644 BulletPhysics/bulletTrunk/jam-2.5/mkjambase.c create mode 100644 BulletPhysics/bulletTrunk/jam-2.5/newstr.c create mode 100644 BulletPhysics/bulletTrunk/jam-2.5/newstr.h create mode 100644 BulletPhysics/bulletTrunk/jam-2.5/option.c create mode 100644 BulletPhysics/bulletTrunk/jam-2.5/option.h create mode 100644 BulletPhysics/bulletTrunk/jam-2.5/parse.c create mode 100644 BulletPhysics/bulletTrunk/jam-2.5/parse.h create mode 100644 BulletPhysics/bulletTrunk/jam-2.5/patchlevel.h create mode 100644 BulletPhysics/bulletTrunk/jam-2.5/pathmac.c create mode 100644 BulletPhysics/bulletTrunk/jam-2.5/pathsys.h create mode 100644 BulletPhysics/bulletTrunk/jam-2.5/pathunix.c create mode 100644 BulletPhysics/bulletTrunk/jam-2.5/pathvms.c create mode 100644 BulletPhysics/bulletTrunk/jam-2.5/regexp.c create mode 100644 BulletPhysics/bulletTrunk/jam-2.5/regexp.h create mode 100644 BulletPhysics/bulletTrunk/jam-2.5/rules.c create mode 100644 BulletPhysics/bulletTrunk/jam-2.5/rules.h create mode 100644 BulletPhysics/bulletTrunk/jam-2.5/scan.c create mode 100644 BulletPhysics/bulletTrunk/jam-2.5/scan.h create mode 100644 BulletPhysics/bulletTrunk/jam-2.5/search.c create mode 100644 BulletPhysics/bulletTrunk/jam-2.5/search.h create mode 100644 BulletPhysics/bulletTrunk/jam-2.5/timestamp.c create mode 100644 BulletPhysics/bulletTrunk/jam-2.5/timestamp.h create mode 100644 BulletPhysics/bulletTrunk/jam-2.5/variable.c create mode 100644 BulletPhysics/bulletTrunk/jam-2.5/variable.h create mode 100644 BulletPhysics/bulletTrunk/jam-2.5/yyacc create mode 100644 BulletPhysics/bulletTrunk/jenga.dae create mode 100644 BulletPhysics/bulletTrunk/lib/readme.txt create mode 100644 BulletPhysics/bulletTrunk/mk/jam/application.jam create mode 100644 BulletPhysics/bulletTrunk/mk/jam/assembler.jam create mode 100644 BulletPhysics/bulletTrunk/mk/jam/bisonflex.jam create mode 100644 BulletPhysics/bulletTrunk/mk/jam/build.jam create mode 100644 BulletPhysics/bulletTrunk/mk/jam/clean.jam create mode 100644 BulletPhysics/bulletTrunk/mk/jam/compiler.jam create mode 100644 BulletPhysics/bulletTrunk/mk/jam/docs.jam create mode 100644 BulletPhysics/bulletTrunk/mk/jam/dump.jam create mode 100644 BulletPhysics/bulletTrunk/mk/jam/flags.jam create mode 100644 BulletPhysics/bulletTrunk/mk/jam/groups.jam create mode 100644 BulletPhysics/bulletTrunk/mk/jam/help.jam create mode 100644 BulletPhysics/bulletTrunk/mk/jam/helper.jam create mode 100644 BulletPhysics/bulletTrunk/mk/jam/install.jam create mode 100644 BulletPhysics/bulletTrunk/mk/jam/jamcompatibility.jam create mode 100644 BulletPhysics/bulletTrunk/mk/jam/library.jam create mode 100644 BulletPhysics/bulletTrunk/mk/jam/macosx.jam create mode 100644 BulletPhysics/bulletTrunk/mk/jam/msvcgen.jam create mode 100644 BulletPhysics/bulletTrunk/mk/jam/objectivec.jam create mode 100644 BulletPhysics/bulletTrunk/mk/jam/objects.jam create mode 100644 BulletPhysics/bulletTrunk/mk/jam/options.jam create mode 100644 BulletPhysics/bulletTrunk/mk/jam/plugin.jam create mode 100644 BulletPhysics/bulletTrunk/mk/jam/property.jam create mode 100644 BulletPhysics/bulletTrunk/mk/jam/resource.jam create mode 100644 BulletPhysics/bulletTrunk/mk/jam/static.jam create mode 100644 BulletPhysics/bulletTrunk/mk/jam/strip.jam create mode 100644 BulletPhysics/bulletTrunk/mk/jam/subdir.jam create mode 100644 BulletPhysics/bulletTrunk/mk/jam/swig.jam create mode 100644 BulletPhysics/bulletTrunk/mk/jam/unittest.jam create mode 100644 BulletPhysics/bulletTrunk/mk/jam/unix.jam create mode 100644 BulletPhysics/bulletTrunk/mk/jam/variant.jam create mode 100644 BulletPhysics/bulletTrunk/mk/jam/win32.jam create mode 100644 BulletPhysics/bulletTrunk/mk/msvcgen/control.tlib create mode 100644 BulletPhysics/bulletTrunk/mk/msvcgen/macros.tlib create mode 100644 BulletPhysics/bulletTrunk/mk/msvcgen/project6.tlib create mode 100644 BulletPhysics/bulletTrunk/mk/msvcgen/project7.tlib create mode 100644 BulletPhysics/bulletTrunk/mk/msvcgen/projectsn71.tlib create mode 100644 BulletPhysics/bulletTrunk/mk/msvcgen/projectx6.tlib create mode 100644 BulletPhysics/bulletTrunk/mk/msvcgen/projectx7.tlib create mode 100644 BulletPhysics/bulletTrunk/mk/msvcgen/projectxenon8.tlib create mode 100644 BulletPhysics/bulletTrunk/mk/msvcgen/projectxsn71.tlib create mode 100644 BulletPhysics/bulletTrunk/mk/msvcgen/workspace6.tlib create mode 100644 BulletPhysics/bulletTrunk/mk/msvcgen/workspace7.tlib create mode 100644 BulletPhysics/bulletTrunk/mk/msvcgen/workspacesn71.tlib create mode 100644 BulletPhysics/bulletTrunk/mk/msvcgen/workspacexenon8.tlib create mode 100644 BulletPhysics/bulletTrunk/msvc/6/appAllBulletDemos.dsp create mode 100644 BulletPhysics/bulletTrunk/msvc/6/appBasicDemo.dsp create mode 100644 BulletPhysics/bulletTrunk/msvc/6/appBenchmarks.dsp create mode 100644 BulletPhysics/bulletTrunk/msvc/6/appBspDemo.dsp create mode 100644 BulletPhysics/bulletTrunk/msvc/6/appBulletDino.dsp create mode 100644 BulletPhysics/bulletTrunk/msvc/6/appCcdPhysicsDemo.dsp create mode 100644 BulletPhysics/bulletTrunk/msvc/6/appCharacterDemo.dsp create mode 100644 BulletPhysics/bulletTrunk/msvc/6/appColladaDemo.dsp create mode 100644 BulletPhysics/bulletTrunk/msvc/6/appCollisionDemo.dsp create mode 100644 BulletPhysics/bulletTrunk/msvc/6/appCollisionInterfaceDemo.dsp create mode 100644 BulletPhysics/bulletTrunk/msvc/6/appConcaveDemo.dsp create mode 100644 BulletPhysics/bulletTrunk/msvc/6/appConstraintDemo.dsp create mode 100644 BulletPhysics/bulletTrunk/msvc/6/appContinuousConvexCollision.dsp create mode 100644 BulletPhysics/bulletTrunk/msvc/6/appConvexDecompositionDemo.dsp create mode 100644 BulletPhysics/bulletTrunk/msvc/6/appDoublePrecisionDemo.dsp create mode 100644 BulletPhysics/bulletTrunk/msvc/6/appEPAPenDepthDemo.dsp create mode 100644 BulletPhysics/bulletTrunk/msvc/6/appForkLiftDemo.dsp create mode 100644 BulletPhysics/bulletTrunk/msvc/6/appGPUphysics.dsp create mode 100644 BulletPhysics/bulletTrunk/msvc/6/appGenericJointDemo.dsp create mode 100644 BulletPhysics/bulletTrunk/msvc/6/appGimpactTestDemo.dsp create mode 100644 BulletPhysics/bulletTrunk/msvc/6/appGjkConvexCastDemo.dsp create mode 100644 BulletPhysics/bulletTrunk/msvc/6/appHeightFieldFluidDemo.dsp create mode 100644 BulletPhysics/bulletTrunk/msvc/6/appHelloWorld.dsp create mode 100644 BulletPhysics/bulletTrunk/msvc/6/appMovingConcaveDemo.dsp create mode 100644 BulletPhysics/bulletTrunk/msvc/6/appMultiMaterialDemo.dsp create mode 100644 BulletPhysics/bulletTrunk/msvc/6/appMultiThreadedDemo.dsp create mode 100644 BulletPhysics/bulletTrunk/msvc/6/appRagdollDemo.dsp create mode 100644 BulletPhysics/bulletTrunk/msvc/6/appRaytracer.dsp create mode 100644 BulletPhysics/bulletTrunk/msvc/6/appSimplexDemo.dsp create mode 100644 BulletPhysics/bulletTrunk/msvc/6/appSliderConstraintDemo.dsp create mode 100644 BulletPhysics/bulletTrunk/msvc/6/appSoftBodyDemo.dsp create mode 100644 BulletPhysics/bulletTrunk/msvc/6/appTerrainDemo.dsp create mode 100644 BulletPhysics/bulletTrunk/msvc/6/appUserCollisionAlgorithm.dsp create mode 100644 BulletPhysics/bulletTrunk/msvc/6/appVehicleDemo.dsp create mode 100644 BulletPhysics/bulletTrunk/msvc/6/appiffCheck.dsp create mode 100644 BulletPhysics/bulletTrunk/msvc/6/appiffCreateTest.dsp create mode 100644 BulletPhysics/bulletTrunk/msvc/6/grpall_bullet.dsp create mode 100644 BulletPhysics/bulletTrunk/msvc/6/grpall_bullet_corelib.dsp create mode 100644 BulletPhysics/bulletTrunk/msvc/6/grpapps_bullet.dsp create mode 100644 BulletPhysics/bulletTrunk/msvc/6/grpapps_bullet_corelib.dsp create mode 100644 BulletPhysics/bulletTrunk/msvc/6/grplibs_bullet.dsp create mode 100644 BulletPhysics/bulletTrunk/msvc/6/grplibs_bullet_corelib.dsp create mode 100644 BulletPhysics/bulletTrunk/msvc/6/libBulletColladaConverter.dsp create mode 100644 BulletPhysics/bulletTrunk/msvc/6/libExtraSolid35.dsp create mode 100644 BulletPhysics/bulletTrunk/msvc/6/libGIMPACTUtils.dsp create mode 100644 BulletPhysics/bulletTrunk/msvc/6/libbulletcollision.dsp create mode 100644 BulletPhysics/bulletTrunk/msvc/6/libbulletdynamics.dsp create mode 100644 BulletPhysics/bulletTrunk/msvc/6/libbulletmath.dsp create mode 100644 BulletPhysics/bulletTrunk/msvc/6/libbulletmultithreaded.dsp create mode 100644 BulletPhysics/bulletTrunk/msvc/6/libbulletopenglsupport.dsp create mode 100644 BulletPhysics/bulletTrunk/msvc/6/libbulletsoftbody.dsp create mode 100644 BulletPhysics/bulletTrunk/msvc/6/libcolladadom.dsp create mode 100644 BulletPhysics/bulletTrunk/msvc/6/libconvexdecomposition.dsp create mode 100644 BulletPhysics/bulletTrunk/msvc/6/libglui.dsp create mode 100644 BulletPhysics/bulletTrunk/msvc/6/libiff.dsp create mode 100644 BulletPhysics/bulletTrunk/msvc/6/liblibxml.dsp create mode 100644 BulletPhysics/bulletTrunk/msvc/6/wksbullet.dsw create mode 100644 BulletPhysics/bulletTrunk/msvc/7/appAllBulletDemos.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/7/appBasicDemo.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/7/appBenchmarks.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/7/appBspDemo.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/7/appBulletDino.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/7/appCcdPhysicsDemo.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/7/appCharacterDemo.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/7/appColladaDemo.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/7/appCollisionDemo.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/7/appCollisionInterfaceDemo.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/7/appConcaveDemo.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/7/appConstraintDemo.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/7/appContinuousConvexCollision.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/7/appConvexDecompositionDemo.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/7/appDoublePrecisionDemo.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/7/appEPAPenDepthDemo.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/7/appForkLiftDemo.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/7/appGPUphysics.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/7/appGenericJointDemo.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/7/appGimpactTestDemo.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/7/appGjkConvexCastDemo.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/7/appHeightFieldFluidDemo.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/7/appHelloWorld.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/7/appMovingConcaveDemo.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/7/appMultiMaterialDemo.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/7/appMultiThreadedDemo.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/7/appRagdollDemo.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/7/appRaytracer.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/7/appSimplexDemo.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/7/appSliderConstraintDemo.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/7/appSoftBodyDemo.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/7/appTerrainDemo.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/7/appUserCollisionAlgorithm.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/7/appVehicleDemo.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/7/appiffCheck.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/7/appiffCreateTest.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/7/grpall_bullet.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/7/grpall_bullet_corelib.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/7/grpapps_bullet.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/7/grpapps_bullet_corelib.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/7/grplibs_bullet.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/7/grplibs_bullet_corelib.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/7/libBulletColladaConverter.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/7/libExtraSolid35.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/7/libGIMPACTUtils.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/7/libbulletcollision.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/7/libbulletdynamics.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/7/libbulletmath.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/7/libbulletmultithreaded.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/7/libbulletopenglsupport.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/7/libbulletsoftbody.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/7/libcolladadom.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/7/libconvexdecomposition.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/7/libglui.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/7/libiff.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/7/liblibxml.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/7/wksbullet.sln create mode 100644 BulletPhysics/bulletTrunk/msvc/71/appAllBulletDemos.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/71/appBasicDemo.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/71/appBenchmarks.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/71/appBspDemo.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/71/appBulletDino.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/71/appCcdPhysicsDemo.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/71/appCharacterDemo.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/71/appColladaDemo.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/71/appCollisionDemo.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/71/appCollisionInterfaceDemo.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/71/appConcaveDemo.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/71/appConstraintDemo.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/71/appContinuousConvexCollision.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/71/appConvexDecompositionDemo.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/71/appDoublePrecisionDemo.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/71/appEPAPenDepthDemo.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/71/appForkLiftDemo.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/71/appGPUphysics.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/71/appGenericJointDemo.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/71/appGimpactTestDemo.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/71/appGjkConvexCastDemo.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/71/appHeightFieldFluidDemo.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/71/appHelloWorld.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/71/appMovingConcaveDemo.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/71/appMultiMaterialDemo.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/71/appMultiThreadedDemo.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/71/appRagdollDemo.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/71/appRaytracer.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/71/appSimplexDemo.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/71/appSliderConstraintDemo.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/71/appSoftBodyDemo.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/71/appTerrainDemo.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/71/appUserCollisionAlgorithm.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/71/appVehicleDemo.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/71/appiffCheck.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/71/appiffCreateTest.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/71/grpall_bullet.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/71/grpall_bullet_corelib.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/71/grpapps_bullet.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/71/grpapps_bullet_corelib.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/71/grplibs_bullet.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/71/grplibs_bullet_corelib.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/71/libBulletColladaConverter.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/71/libGIMPACTUtils.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/71/libbulletcollision.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/71/libbulletdynamics.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/71/libbulletmath.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/71/libbulletmultithreaded.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/71/libbulletopenglsupport.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/71/libbulletsoftbody.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/71/libcolladadom.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/71/libconvexdecomposition.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/71/libglui.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/71/libiff.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/71/liblibxml.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/71/wksbullet.sln create mode 100644 BulletPhysics/bulletTrunk/msvc/8/appAllBulletDemos.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/8/appBasicDemo.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/8/appBenchmarks.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/8/appBspDemo.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/8/appBulletDino.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/8/appCcdPhysicsDemo.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/8/appCharacterDemo.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/8/appColladaDemo.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/8/appCollisionDemo.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/8/appCollisionInterfaceDemo.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/8/appConcaveDemo.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/8/appConstraintDemo.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/8/appContinuousConvexCollision.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/8/appConvexDecompositionDemo.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/8/appDoublePrecisionDemo.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/8/appEPAPenDepthDemo.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/8/appForkLiftDemo.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/8/appGPUphysics.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/8/appGenericJointDemo.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/8/appGimpactTestDemo.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/8/appGjkConvexCastDemo.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/8/appHeightFieldFluidDemo.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/8/appHelloWorld.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/8/appMovingConcaveDemo.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/8/appMultiMaterialDemo.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/8/appMultiThreadedDemo.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/8/appRagdollDemo.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/8/appRaytracer.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/8/appSimplexDemo.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/8/appSliderConstraintDemo.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/8/appSoftBodyDemo.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/8/appTerrainDemo.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/8/appUserCollisionAlgorithm.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/8/appVehicleDemo.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/8/appiffCheck.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/8/appiffCreateTest.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/8/grpall_bullet.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/8/grpall_bullet_corelib.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/8/grpapps_bullet.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/8/grpapps_bullet_corelib.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/8/grplibs_bullet.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/8/grplibs_bullet_corelib.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/8/libBulletColladaConverter.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/8/libExtraSolid35.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/8/libGIMPACTUtils.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/8/libbulletcollision.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/8/libbulletdynamics.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/8/libbulletmath.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/8/libbulletmultithreaded.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/8/libbulletnet.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/8/libbulletopenglsupport.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/8/libbulletsoftbody.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/8/libcolladadom.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/8/libconvexdecomposition.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/8/libglui.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/8/libiff.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/8/liblibxml.vcproj create mode 100644 BulletPhysics/bulletTrunk/msvc/8/wksbullet.sln create mode 100644 BulletPhysics/bulletTrunk/msvc/appAllBulletDemos.rc create mode 100644 BulletPhysics/bulletTrunk/msvc/appBasicDemo.rc create mode 100644 BulletPhysics/bulletTrunk/msvc/appBenchmarks.rc create mode 100644 BulletPhysics/bulletTrunk/msvc/appBspDemo.rc create mode 100644 BulletPhysics/bulletTrunk/msvc/appBulletDino.rc create mode 100644 BulletPhysics/bulletTrunk/msvc/appCcdPhysicsDemo.rc create mode 100644 BulletPhysics/bulletTrunk/msvc/appCharacterDemo.rc create mode 100644 BulletPhysics/bulletTrunk/msvc/appColladaDemo.rc create mode 100644 BulletPhysics/bulletTrunk/msvc/appCollisionDemo.rc create mode 100644 BulletPhysics/bulletTrunk/msvc/appCollisionInterfaceDemo.rc create mode 100644 BulletPhysics/bulletTrunk/msvc/appConcaveDemo.rc create mode 100644 BulletPhysics/bulletTrunk/msvc/appConstraintDemo.rc create mode 100644 BulletPhysics/bulletTrunk/msvc/appContinuousConvexCollision.rc create mode 100644 BulletPhysics/bulletTrunk/msvc/appConvexDecompositionDemo.rc create mode 100644 BulletPhysics/bulletTrunk/msvc/appDoublePrecisionDemo.rc create mode 100644 BulletPhysics/bulletTrunk/msvc/appEPAPenDepthDemo.rc create mode 100644 BulletPhysics/bulletTrunk/msvc/appForkLiftDemo.rc create mode 100644 BulletPhysics/bulletTrunk/msvc/appGPUphysics.rc create mode 100644 BulletPhysics/bulletTrunk/msvc/appGenericJointDemo.rc create mode 100644 BulletPhysics/bulletTrunk/msvc/appGimpactTestDemo.rc create mode 100644 BulletPhysics/bulletTrunk/msvc/appGjkConvexCastDemo.rc create mode 100644 BulletPhysics/bulletTrunk/msvc/appHeightFieldFluidDemo.rc create mode 100644 BulletPhysics/bulletTrunk/msvc/appHelloWorld.rc create mode 100644 BulletPhysics/bulletTrunk/msvc/appMovingConcaveDemo.rc create mode 100644 BulletPhysics/bulletTrunk/msvc/appMultiMaterialDemo.rc create mode 100644 BulletPhysics/bulletTrunk/msvc/appMultiThreadedDemo.rc create mode 100644 BulletPhysics/bulletTrunk/msvc/appRagdollDemo.rc create mode 100644 BulletPhysics/bulletTrunk/msvc/appRaytracer.rc create mode 100644 BulletPhysics/bulletTrunk/msvc/appSimplexDemo.rc create mode 100644 BulletPhysics/bulletTrunk/msvc/appSliderConstraintDemo.rc create mode 100644 BulletPhysics/bulletTrunk/msvc/appSoftBodyDemo.rc create mode 100644 BulletPhysics/bulletTrunk/msvc/appTerrainDemo.rc create mode 100644 BulletPhysics/bulletTrunk/msvc/appUserCollisionAlgorithm.rc create mode 100644 BulletPhysics/bulletTrunk/msvc/appVehicleDemo.rc create mode 100644 BulletPhysics/bulletTrunk/msvc/appiffCheck.rc create mode 100644 BulletPhysics/bulletTrunk/msvc/appiffCreateTest.rc create mode 100644 BulletPhysics/bulletTrunk/msvc/autoexp_dat.txt create mode 100644 BulletPhysics/bulletTrunk/msvc/bullet_ico.ico create mode 100644 BulletPhysics/bulletTrunk/src/Bullet-C-Api.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/BroadphaseCollision/btAxisSweep3.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/BroadphaseCollision/btAxisSweep3.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/BroadphaseCollision/btBroadphaseInterface.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/BroadphaseCollision/btBroadphaseProxy.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/BroadphaseCollision/btBroadphaseProxy.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/BroadphaseCollision/btCollisionAlgorithm.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/BroadphaseCollision/btCollisionAlgorithm.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/BroadphaseCollision/btDbvt.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/BroadphaseCollision/btDbvt.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/BroadphaseCollision/btDbvtBroadphase.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/BroadphaseCollision/btDbvtBroadphase.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/BroadphaseCollision/btDispatcher.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/BroadphaseCollision/btDispatcher.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/BroadphaseCollision/btMultiSapBroadphase.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/BroadphaseCollision/btMultiSapBroadphase.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/BroadphaseCollision/btOverlappingPairCache.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/BroadphaseCollision/btOverlappingPairCache.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/BroadphaseCollision/btOverlappingPairCallback.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/BroadphaseCollision/btQuantizedBvh.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/BroadphaseCollision/btQuantizedBvh.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/BroadphaseCollision/btSimpleBroadphase.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/BroadphaseCollision/btSimpleBroadphase.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CMakeLists.txt create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionDispatch/SphereTriangleDetector.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionDispatch/SphereTriangleDetector.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionDispatch/btActivatingCollisionAlgorithm.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionDispatch/btActivatingCollisionAlgorithm.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionDispatch/btBoxBoxCollisionAlgorithm.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionDispatch/btBoxBoxCollisionAlgorithm.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionDispatch/btBoxBoxDetector.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionDispatch/btBoxBoxDetector.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionDispatch/btCollisionConfiguration.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionDispatch/btCollisionCreateFunc.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionDispatch/btCollisionDispatcher.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionDispatch/btCollisionDispatcher.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionDispatch/btCollisionObject.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionDispatch/btCollisionObject.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionDispatch/btCollisionWorld.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionDispatch/btCollisionWorld.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionDispatch/btCompoundCollisionAlgorithm.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionDispatch/btCompoundCollisionAlgorithm.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionDispatch/btConvexConcaveCollisionAlgorithm.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionDispatch/btConvexConcaveCollisionAlgorithm.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionDispatch/btConvexConvexAlgorithm.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionDispatch/btConvexConvexAlgorithm.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionDispatch/btConvexPlaneCollisionAlgorithm.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionDispatch/btConvexPlaneCollisionAlgorithm.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionDispatch/btDefaultCollisionConfiguration.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionDispatch/btDefaultCollisionConfiguration.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionDispatch/btEmptyCollisionAlgorithm.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionDispatch/btEmptyCollisionAlgorithm.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionDispatch/btGhostObject.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionDispatch/btGhostObject.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionDispatch/btManifoldResult.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionDispatch/btManifoldResult.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionDispatch/btSimulationIslandManager.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionDispatch/btSimulationIslandManager.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionDispatch/btSphereBoxCollisionAlgorithm.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionDispatch/btSphereBoxCollisionAlgorithm.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionDispatch/btSphereSphereCollisionAlgorithm.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionDispatch/btSphereSphereCollisionAlgorithm.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionDispatch/btSphereTriangleCollisionAlgorithm.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionDispatch/btSphereTriangleCollisionAlgorithm.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionDispatch/btUnionFind.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionDispatch/btUnionFind.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionShapes/btBoxShape.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionShapes/btBoxShape.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionShapes/btBvhTriangleMeshShape.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionShapes/btBvhTriangleMeshShape.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionShapes/btCapsuleShape.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionShapes/btCapsuleShape.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionShapes/btCollisionMargin.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionShapes/btCollisionShape.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionShapes/btCollisionShape.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionShapes/btCompoundShape.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionShapes/btCompoundShape.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionShapes/btConcaveShape.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionShapes/btConcaveShape.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionShapes/btConeShape.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionShapes/btConeShape.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionShapes/btConvexHullShape.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionShapes/btConvexHullShape.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionShapes/btConvexInternalShape.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionShapes/btConvexInternalShape.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionShapes/btConvexPointCloudShape.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionShapes/btConvexPointCloudShape.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionShapes/btConvexShape.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionShapes/btConvexShape.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionShapes/btConvexTriangleMeshShape.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionShapes/btConvexTriangleMeshShape.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionShapes/btCylinderShape.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionShapes/btCylinderShape.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionShapes/btEmptyShape.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionShapes/btEmptyShape.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionShapes/btHeightfieldTerrainShape.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionShapes/btHeightfieldTerrainShape.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionShapes/btMaterial.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionShapes/btMinkowskiSumShape.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionShapes/btMinkowskiSumShape.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionShapes/btMultiSphereShape.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionShapes/btMultiSphereShape.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionShapes/btMultimaterialTriangleMeshShape.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionShapes/btMultimaterialTriangleMeshShape.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionShapes/btOptimizedBvh.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionShapes/btOptimizedBvh.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionShapes/btPolyhedralConvexShape.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionShapes/btPolyhedralConvexShape.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionShapes/btScaledBvhTriangleMeshShape.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionShapes/btScaledBvhTriangleMeshShape.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionShapes/btShapeHull.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionShapes/btShapeHull.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionShapes/btSphereShape.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionShapes/btSphereShape.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionShapes/btStaticPlaneShape.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionShapes/btStaticPlaneShape.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionShapes/btStridingMeshInterface.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionShapes/btStridingMeshInterface.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionShapes/btTetrahedronShape.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionShapes/btTetrahedronShape.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionShapes/btTriangleBuffer.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionShapes/btTriangleBuffer.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionShapes/btTriangleCallback.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionShapes/btTriangleCallback.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionShapes/btTriangleIndexVertexArray.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionShapes/btTriangleIndexVertexArray.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionShapes/btTriangleIndexVertexMaterialArray.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionShapes/btTriangleIndexVertexMaterialArray.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionShapes/btTriangleMesh.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionShapes/btTriangleMesh.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionShapes/btTriangleMeshShape.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionShapes/btTriangleMeshShape.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionShapes/btTriangleShape.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionShapes/btUniformScalingShape.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/CollisionShapes/btUniformScalingShape.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/Doxyfile create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/Gimpact/btBoxCollision.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/Gimpact/btClipPolygon.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/Gimpact/btContactProcessing.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/Gimpact/btContactProcessing.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/Gimpact/btGImpactBvh.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/Gimpact/btGImpactBvh.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/Gimpact/btGImpactCollisionAlgorithm.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/Gimpact/btGImpactCollisionAlgorithm.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/Gimpact/btGImpactMassUtil.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/Gimpact/btGImpactQuantizedBvh.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/Gimpact/btGImpactQuantizedBvh.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/Gimpact/btGImpactShape.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/Gimpact/btGImpactShape.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/Gimpact/btGenericPoolAllocator.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/Gimpact/btGenericPoolAllocator.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/Gimpact/btGeometryOperations.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/Gimpact/btQuantization.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/Gimpact/btTriangleShapeEx.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/Gimpact/btTriangleShapeEx.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/Gimpact/gim_array.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/Gimpact/gim_basic_geometry_operations.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/Gimpact/gim_bitset.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/Gimpact/gim_box_collision.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/Gimpact/gim_box_set.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/Gimpact/gim_box_set.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/Gimpact/gim_clip_polygon.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/Gimpact/gim_contact.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/Gimpact/gim_contact.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/Gimpact/gim_geom_types.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/Gimpact/gim_geometry.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/Gimpact/gim_hash_table.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/Gimpact/gim_linear_math.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/Gimpact/gim_math.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/Gimpact/gim_memory.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/Gimpact/gim_memory.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/Gimpact/gim_radixsort.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/Gimpact/gim_tri_collision.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/Gimpact/gim_tri_collision.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/Jamfile create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/NarrowPhaseCollision/btContinuousConvexCollision.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/NarrowPhaseCollision/btContinuousConvexCollision.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/NarrowPhaseCollision/btConvexCast.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/NarrowPhaseCollision/btConvexCast.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/NarrowPhaseCollision/btConvexPenetrationDepthSolver.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/NarrowPhaseCollision/btDiscreteCollisionDetectorInterface.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/NarrowPhaseCollision/btGjkConvexCast.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/NarrowPhaseCollision/btGjkConvexCast.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/NarrowPhaseCollision/btGjkEpa2.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/NarrowPhaseCollision/btGjkEpa2.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/NarrowPhaseCollision/btGjkEpaPenetrationDepthSolver.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/NarrowPhaseCollision/btGjkEpaPenetrationDepthSolver.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/NarrowPhaseCollision/btGjkPairDetector.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/NarrowPhaseCollision/btGjkPairDetector.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/NarrowPhaseCollision/btManifoldPoint.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/NarrowPhaseCollision/btMinkowskiPenetrationDepthSolver.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/NarrowPhaseCollision/btMinkowskiPenetrationDepthSolver.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/NarrowPhaseCollision/btPersistentManifold.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/NarrowPhaseCollision/btPersistentManifold.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/NarrowPhaseCollision/btPointCollector.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/NarrowPhaseCollision/btRaycastCallback.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/NarrowPhaseCollision/btRaycastCallback.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/NarrowPhaseCollision/btSimplexSolverInterface.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/NarrowPhaseCollision/btSubSimplexConvexCast.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/NarrowPhaseCollision/btSubSimplexConvexCast.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletCollision/ibmsdk/Makefile create mode 100644 BulletPhysics/bulletTrunk/src/BulletDynamics/CMakeLists.txt create mode 100644 BulletPhysics/bulletTrunk/src/BulletDynamics/Character/btCharacterControllerInterface.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletDynamics/Character/btKinematicCharacterController.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletDynamics/Character/btKinematicCharacterController.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletDynamics/ConstraintSolver/btConeTwistConstraint.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletDynamics/ConstraintSolver/btConeTwistConstraint.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletDynamics/ConstraintSolver/btConstraintSolver.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletDynamics/ConstraintSolver/btContactConstraint.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletDynamics/ConstraintSolver/btContactConstraint.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletDynamics/ConstraintSolver/btContactSolverInfo.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletDynamics/ConstraintSolver/btHingeConstraint.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletDynamics/ConstraintSolver/btHingeConstraint.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletDynamics/ConstraintSolver/btJacobianEntry.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletDynamics/ConstraintSolver/btPoint2PointConstraint.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletDynamics/ConstraintSolver/btPoint2PointConstraint.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletDynamics/ConstraintSolver/btSliderConstraint.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletDynamics/ConstraintSolver/btSliderConstraint.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletDynamics/ConstraintSolver/btSolve2LinearConstraint.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletDynamics/ConstraintSolver/btSolve2LinearConstraint.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletDynamics/ConstraintSolver/btSolverBody.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletDynamics/ConstraintSolver/btSolverConstraint.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletDynamics/ConstraintSolver/btTypedConstraint.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletDynamics/ConstraintSolver/btTypedConstraint.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletDynamics/Dynamics/Bullet-C-API.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletDynamics/Dynamics/btActionInterface.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletDynamics/Dynamics/btContinuousDynamicsWorld.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletDynamics/Dynamics/btContinuousDynamicsWorld.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletDynamics/Dynamics/btDiscreteDynamicsWorld.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletDynamics/Dynamics/btDynamicsWorld.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletDynamics/Dynamics/btRigidBody.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletDynamics/Dynamics/btRigidBody.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletDynamics/Dynamics/btSimpleDynamicsWorld.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletDynamics/Dynamics/btSimpleDynamicsWorld.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletDynamics/Jamfile create mode 100644 BulletPhysics/bulletTrunk/src/BulletDynamics/Vehicle/btRaycastVehicle.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletDynamics/Vehicle/btRaycastVehicle.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletDynamics/Vehicle/btVehicleRaycaster.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletDynamics/Vehicle/btWheelInfo.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletDynamics/Vehicle/btWheelInfo.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletDynamics/ibmsdk/Makefile create mode 100644 BulletPhysics/bulletTrunk/src/BulletMultiThreaded/CMakeLists.txt create mode 100644 BulletPhysics/bulletTrunk/src/BulletMultiThreaded/Jamfile create mode 100644 BulletPhysics/bulletTrunk/src/BulletMultiThreaded/Makefile.original create mode 100644 BulletPhysics/bulletTrunk/src/BulletMultiThreaded/PlatformDefinitions.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletMultiThreaded/PosixThreadSupport.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletMultiThreaded/PosixThreadSupport.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletMultiThreaded/PpuAddressSpace.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletMultiThreaded/SequentialThreadSupport.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletMultiThreaded/SequentialThreadSupport.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletMultiThreaded/SpuBatchRaycaster.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletMultiThreaded/SpuBatchRaycaster.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletMultiThreaded/SpuCollisionObjectWrapper.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletMultiThreaded/SpuCollisionObjectWrapper.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletMultiThreaded/SpuCollisionTaskProcess.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletMultiThreaded/SpuCollisionTaskProcess.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletMultiThreaded/SpuContactManifoldCollisionAlgorithm.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletMultiThreaded/SpuContactManifoldCollisionAlgorithm.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletMultiThreaded/SpuDoubleBuffer.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletMultiThreaded/SpuFakeDma.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletMultiThreaded/SpuFakeDma.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletMultiThreaded/SpuGatheringCollisionDispatcher.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletMultiThreaded/SpuGatheringCollisionDispatcher.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletMultiThreaded/SpuIntegrationTask/readme.txt create mode 100644 BulletPhysics/bulletTrunk/src/BulletMultiThreaded/SpuLibspe2Support.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletMultiThreaded/SpuLibspe2Support.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletMultiThreaded/SpuNarrowPhaseCollisionTask/Box.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletMultiThreaded/SpuNarrowPhaseCollisionTask/SpuCollisionShapes.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletMultiThreaded/SpuNarrowPhaseCollisionTask/SpuCollisionShapes.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletMultiThreaded/SpuNarrowPhaseCollisionTask/SpuContactResult.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletMultiThreaded/SpuNarrowPhaseCollisionTask/SpuContactResult.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletMultiThreaded/SpuNarrowPhaseCollisionTask/SpuConvexPenetrationDepthSolver.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletMultiThreaded/SpuNarrowPhaseCollisionTask/SpuEpaPenetrationDepthSolver.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletMultiThreaded/SpuNarrowPhaseCollisionTask/SpuEpaPenetrationDepthSolver.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletMultiThreaded/SpuNarrowPhaseCollisionTask/SpuGatheringCollisionTask.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletMultiThreaded/SpuNarrowPhaseCollisionTask/SpuGatheringCollisionTask.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletMultiThreaded/SpuNarrowPhaseCollisionTask/SpuGjkEpa2.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletMultiThreaded/SpuNarrowPhaseCollisionTask/SpuGjkEpa2.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletMultiThreaded/SpuNarrowPhaseCollisionTask/SpuGjkPairDetector.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletMultiThreaded/SpuNarrowPhaseCollisionTask/SpuGjkPairDetector.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletMultiThreaded/SpuNarrowPhaseCollisionTask/SpuLocalSupport.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletMultiThreaded/SpuNarrowPhaseCollisionTask/SpuMinkowskiPenetrationDepthSolver.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletMultiThreaded/SpuNarrowPhaseCollisionTask/SpuMinkowskiPenetrationDepthSolver.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletMultiThreaded/SpuNarrowPhaseCollisionTask/SpuPreferredPenetrationDirections.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletMultiThreaded/SpuNarrowPhaseCollisionTask/SpuVoronoiSimplexSolver.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletMultiThreaded/SpuNarrowPhaseCollisionTask/SpuVoronoiSimplexSolver.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletMultiThreaded/SpuNarrowPhaseCollisionTask/boxBoxDistance.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletMultiThreaded/SpuNarrowPhaseCollisionTask/boxBoxDistance.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletMultiThreaded/SpuNarrowPhaseCollisionTask/readme.txt create mode 100644 BulletPhysics/bulletTrunk/src/BulletMultiThreaded/SpuParallelSolver.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletMultiThreaded/SpuParallelSolver.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletMultiThreaded/SpuRaycastTask/SpuRaycastTask.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletMultiThreaded/SpuRaycastTask/SpuRaycastTask.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletMultiThreaded/SpuRaycastTask/SpuSubSimplexConvexCast.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletMultiThreaded/SpuRaycastTask/SpuSubSimplexConvexCast.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletMultiThreaded/SpuRaycastTaskProcess.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletMultiThreaded/SpuRaycastTaskProcess.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletMultiThreaded/SpuSampleTask/SpuSampleTask.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletMultiThreaded/SpuSampleTask/SpuSampleTask.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletMultiThreaded/SpuSampleTask/readme.txt create mode 100644 BulletPhysics/bulletTrunk/src/BulletMultiThreaded/SpuSampleTaskProcess.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletMultiThreaded/SpuSampleTaskProcess.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletMultiThreaded/SpuSolverTask/SpuParallellSolverTask.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletMultiThreaded/SpuSolverTask/SpuParallellSolverTask.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletMultiThreaded/SpuSync.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletMultiThreaded/Win32ThreadSupport.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletMultiThreaded/Win32ThreadSupport.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletMultiThreaded/btThreadSupportInterface.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletMultiThreaded/btThreadSupportInterface.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletMultiThreaded/vectormath/scalar/cpp/mat_aos.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletMultiThreaded/vectormath/scalar/cpp/quat_aos.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletMultiThreaded/vectormath/scalar/cpp/vec_aos.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletMultiThreaded/vectormath/scalar/cpp/vectormath_aos.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletMultiThreaded/vectormath2bullet.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletSoftBody/CMakeLists.txt create mode 100644 BulletPhysics/bulletTrunk/src/BulletSoftBody/Jamfile create mode 100644 BulletPhysics/bulletTrunk/src/BulletSoftBody/btSoftBody.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletSoftBody/btSoftBody.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletSoftBody/btSoftBodyConcaveCollisionAlgorithm.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletSoftBody/btSoftBodyConcaveCollisionAlgorithm.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletSoftBody/btSoftBodyHelpers.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletSoftBody/btSoftBodyHelpers.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletSoftBody/btSoftBodyInternals.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletSoftBody/btSoftBodyRigidBodyCollisionConfiguration.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletSoftBody/btSoftBodyRigidBodyCollisionConfiguration.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletSoftBody/btSoftRigidCollisionAlgorithm.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletSoftBody/btSoftRigidCollisionAlgorithm.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletSoftBody/btSoftRigidDynamicsWorld.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletSoftBody/btSoftRigidDynamicsWorld.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletSoftBody/btSoftSoftCollisionAlgorithm.cpp create mode 100644 BulletPhysics/bulletTrunk/src/BulletSoftBody/btSoftSoftCollisionAlgorithm.h create mode 100644 BulletPhysics/bulletTrunk/src/BulletSoftBody/btSparseSDF.h create mode 100644 BulletPhysics/bulletTrunk/src/CMakeLists.txt create mode 100644 BulletPhysics/bulletTrunk/src/Jamfile create mode 100644 BulletPhysics/bulletTrunk/src/LinearMath/CMakeLists.txt create mode 100644 BulletPhysics/bulletTrunk/src/LinearMath/Jamfile create mode 100644 BulletPhysics/bulletTrunk/src/LinearMath/btAabbUtil2.h create mode 100644 BulletPhysics/bulletTrunk/src/LinearMath/btAlignedAllocator.cpp create mode 100644 BulletPhysics/bulletTrunk/src/LinearMath/btAlignedAllocator.h create mode 100644 BulletPhysics/bulletTrunk/src/LinearMath/btAlignedObjectArray.h create mode 100644 BulletPhysics/bulletTrunk/src/LinearMath/btConvexHull.cpp create mode 100644 BulletPhysics/bulletTrunk/src/LinearMath/btConvexHull.h create mode 100644 BulletPhysics/bulletTrunk/src/LinearMath/btDefaultMotionState.h create mode 100644 BulletPhysics/bulletTrunk/src/LinearMath/btGeometryUtil.cpp create mode 100644 BulletPhysics/bulletTrunk/src/LinearMath/btGeometryUtil.h create mode 100644 BulletPhysics/bulletTrunk/src/LinearMath/btHashMap.h create mode 100644 BulletPhysics/bulletTrunk/src/LinearMath/btIDebugDraw.h create mode 100644 BulletPhysics/bulletTrunk/src/LinearMath/btList.h create mode 100644 BulletPhysics/bulletTrunk/src/LinearMath/btMatrix3x3.h create mode 100644 BulletPhysics/bulletTrunk/src/LinearMath/btMinMax.h create mode 100644 BulletPhysics/bulletTrunk/src/LinearMath/btMotionState.h create mode 100644 BulletPhysics/bulletTrunk/src/LinearMath/btPoolAllocator.h create mode 100644 BulletPhysics/bulletTrunk/src/LinearMath/btQuadWord.h create mode 100644 BulletPhysics/bulletTrunk/src/LinearMath/btQuaternion.h create mode 100644 BulletPhysics/bulletTrunk/src/LinearMath/btQuickprof.cpp create mode 100644 BulletPhysics/bulletTrunk/src/LinearMath/btQuickprof.h create mode 100644 BulletPhysics/bulletTrunk/src/LinearMath/btRandom.h create mode 100644 BulletPhysics/bulletTrunk/src/LinearMath/btScalar.h create mode 100644 BulletPhysics/bulletTrunk/src/LinearMath/btStackAlloc.h create mode 100644 BulletPhysics/bulletTrunk/src/LinearMath/btTransform.h create mode 100644 BulletPhysics/bulletTrunk/src/LinearMath/btTransformUtil.h create mode 100644 BulletPhysics/bulletTrunk/src/LinearMath/btVector3.h create mode 100644 BulletPhysics/bulletTrunk/src/LinearMath/ibmsdk/Makefile create mode 100644 BulletPhysics/bulletTrunk/src/Makefile.am create mode 100644 BulletPhysics/bulletTrunk/src/btBulletCollisionCommon.h create mode 100644 BulletPhysics/bulletTrunk/src/btBulletDynamicsCommon.h create mode 100644 BulletPhysics/bulletTrunk/src/ibmsdk/Makefile create mode 100644 BulletPhysics/bulletTrunk/src/libbulletnet/ClosestNotMeRaycastResultCallback_net.cpp create mode 100644 BulletPhysics/bulletTrunk/src/libbulletnet/ClosestNotMeRaycastResultCallback_net.h create mode 100644 BulletPhysics/bulletTrunk/src/libbulletnet/Makefile create mode 100644 BulletPhysics/bulletTrunk/src/libbulletnet/btAxisSweep3_net.cpp create mode 100644 BulletPhysics/bulletTrunk/src/libbulletnet/btAxisSweep3_net.h create mode 100644 BulletPhysics/bulletTrunk/src/libbulletnet/btBoxShape_net.cpp create mode 100644 BulletPhysics/bulletTrunk/src/libbulletnet/btBoxShape_net.h create mode 100644 BulletPhysics/bulletTrunk/src/libbulletnet/btCapsuleShape_net.cpp create mode 100644 BulletPhysics/bulletTrunk/src/libbulletnet/btCapsuleShape_net.h create mode 100644 BulletPhysics/bulletTrunk/src/libbulletnet/btCollisionDispatcher_net.cpp create mode 100644 BulletPhysics/bulletTrunk/src/libbulletnet/btCollisionDispatcher_net.h create mode 100644 BulletPhysics/bulletTrunk/src/libbulletnet/btCollisionObject_net.cpp create mode 100644 BulletPhysics/bulletTrunk/src/libbulletnet/btCollisionObject_net.h create mode 100644 BulletPhysics/bulletTrunk/src/libbulletnet/btCollisionShape_net.cpp create mode 100644 BulletPhysics/bulletTrunk/src/libbulletnet/btCollisionShape_net.h create mode 100644 BulletPhysics/bulletTrunk/src/libbulletnet/btCollisionWorld_net.cpp create mode 100644 BulletPhysics/bulletTrunk/src/libbulletnet/btCollisionWorld_net.h create mode 100644 BulletPhysics/bulletTrunk/src/libbulletnet/btDefaultCollisionConfiguration_net.cpp create mode 100644 BulletPhysics/bulletTrunk/src/libbulletnet/btDefaultCollisionConfiguration_net.h create mode 100644 BulletPhysics/bulletTrunk/src/libbulletnet/btDefaultMotionState_net.cpp create mode 100644 BulletPhysics/bulletTrunk/src/libbulletnet/btDefaultMotionState_net.h create mode 100644 BulletPhysics/bulletTrunk/src/libbulletnet/btDiscreteDynamicsWorld_net.cpp create mode 100644 BulletPhysics/bulletTrunk/src/libbulletnet/btDiscreteDynamicsWorld_net.h create mode 100644 BulletPhysics/bulletTrunk/src/libbulletnet/btGImpactMeshShape_net.cpp create mode 100644 BulletPhysics/bulletTrunk/src/libbulletnet/btGImpactMeshShape_net.h create mode 100644 BulletPhysics/bulletTrunk/src/libbulletnet/btGeneric6DofConstraint_net.cpp create mode 100644 BulletPhysics/bulletTrunk/src/libbulletnet/btGeneric6DofConstraint_net.h create mode 100644 BulletPhysics/bulletTrunk/src/libbulletnet/btGhostObject_net.cpp create mode 100644 BulletPhysics/bulletTrunk/src/libbulletnet/btGhostObject_net.h create mode 100644 BulletPhysics/bulletTrunk/src/libbulletnet/btHeightfieldTerrainShape_net.cpp create mode 100644 BulletPhysics/bulletTrunk/src/libbulletnet/btHeightfieldTerrainShape_net.h create mode 100644 BulletPhysics/bulletTrunk/src/libbulletnet/btKinematicCharacterController.h create mode 100644 BulletPhysics/bulletTrunk/src/libbulletnet/btMatrix3x3_net.cpp create mode 100644 BulletPhysics/bulletTrunk/src/libbulletnet/btMatrix3x3_net.h create mode 100644 BulletPhysics/bulletTrunk/src/libbulletnet/btMotionState_net.cpp create mode 100644 BulletPhysics/bulletTrunk/src/libbulletnet/btMotionState_net.h create mode 100644 BulletPhysics/bulletTrunk/src/libbulletnet/btQuaternion_net.cpp create mode 100644 BulletPhysics/bulletTrunk/src/libbulletnet/btQuaternion_net.h create mode 100644 BulletPhysics/bulletTrunk/src/libbulletnet/btRigidBodyConstructionInfo_net.cpp create mode 100644 BulletPhysics/bulletTrunk/src/libbulletnet/btRigidBodyConstructionInfo_net.h create mode 100644 BulletPhysics/bulletTrunk/src/libbulletnet/btRigidBody_net.cpp create mode 100644 BulletPhysics/bulletTrunk/src/libbulletnet/btRigidBody_net.h create mode 100644 BulletPhysics/bulletTrunk/src/libbulletnet/btSequentialImpulseConstraintSolver_net.cpp create mode 100644 BulletPhysics/bulletTrunk/src/libbulletnet/btSequentialImpulseConstraintSolver_net.h create mode 100644 BulletPhysics/bulletTrunk/src/libbulletnet/btSphereShape_net.cpp create mode 100644 BulletPhysics/bulletTrunk/src/libbulletnet/btSphereShape_net.h create mode 100644 BulletPhysics/bulletTrunk/src/libbulletnet/btTransform_net.cpp create mode 100644 BulletPhysics/bulletTrunk/src/libbulletnet/btTransform_net.h create mode 100644 BulletPhysics/bulletTrunk/src/libbulletnet/btTriangleIndexVertexArray_net.cpp create mode 100644 BulletPhysics/bulletTrunk/src/libbulletnet/btTriangleIndexVertexArray_net.h create mode 100644 BulletPhysics/bulletTrunk/src/libbulletnet/btTriangleMesh_net.cpp create mode 100644 BulletPhysics/bulletTrunk/src/libbulletnet/btTriangleMesh_net.h create mode 100644 BulletPhysics/bulletTrunk/src/libbulletnet/btTypedConstraint_net.cpp create mode 100644 BulletPhysics/bulletTrunk/src/libbulletnet/btTypedConstraint_net.h create mode 100644 BulletPhysics/bulletTrunk/src/libbulletnet/btvector3_net.cpp create mode 100644 BulletPhysics/bulletTrunk/src/libbulletnet/btvector3_net.h create mode 100644 BulletPhysics/bulletTrunk/src/libbulletnet/bulletnet_net.cpp create mode 100644 BulletPhysics/bulletTrunk/src/libbulletnet/bulletnet_net.h create mode 100644 BulletPhysics/bulletTrunk/src/libbulletnet/conversion.cpp create mode 100644 BulletPhysics/bulletTrunk/src/libbulletnet/conversion.h create mode 100644 BulletPhysics/bulletTrunk/src/libbulletnet/main.h diff --git a/BulletPhysics/bulletTrunk/AUTHORS b/BulletPhysics/bulletTrunk/AUTHORS new file mode 100644 index 00000000..f2cc86dd --- /dev/null +++ b/BulletPhysics/bulletTrunk/AUTHORS @@ -0,0 +1,22 @@ + +Bullet Physics Library is an open source project with help from the community at the Physics Forum +See the forum at http://bulletphysics.com + +The project was started by Erwin Coumans + +Following people contributed to Bullet +(random order, please let us know on the forum if your name should be in this list) + +Gino van den Bergen: LinearMath classes +Christer Ericson: parts of the voronoi simplex solver +Simon Hobbs: 3d axis sweep and prune, Extras/SATCollision, separating axis theorem + SIMD code +Dirk Gregorius: generic D6 constraint +Erin Catto: accumulated impulse in sequential impulse +Nathanael Presson: EPA penetration depth calculation +Francisco Leon: GIMPACT Concave Concave collision +Joerg Henrichs: make buildsystem (work in progress) +Eric Sunshine: jam + msvcgen buildsystem +Steve Baker: GPU physics and general implementation improvements +Jay Lee: Double precision support +KleMiX, aka Vsevolod Klementjev, managed version, rewritten in C# for XNA +Erwin Coumans: most other source code diff --git a/BulletPhysics/bulletTrunk/BspDemo.bsp b/BulletPhysics/bulletTrunk/BspDemo.bsp new file mode 100644 index 0000000000000000000000000000000000000000..4ed414d75b92d4d94b05589c46bc8f66bee34686 GIT binary patch literal 105100 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 HQ-1y*qN~We literal 0 HcmV?d00001 diff --git a/BulletPhysics/bulletTrunk/BulletDotNET/BulletConsoleTest/BulletConsoleTest.csproj b/BulletPhysics/bulletTrunk/BulletDotNET/BulletConsoleTest/BulletConsoleTest.csproj new file mode 100644 index 00000000..a068e4ec --- /dev/null +++ b/BulletPhysics/bulletTrunk/BulletDotNET/BulletConsoleTest/BulletConsoleTest.csproj @@ -0,0 +1,58 @@ + + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {B8BA2397-1342-4CF8-91A6-07B2480BF00D} + Exe + Properties + BulletConsoleTest + BulletConsoleTest + v2.0 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + ..\bin\Release\ + TRACE + prompt + 4 + true + false + + + + + + + + + + + + + {F969D6F1-1B88-489E-A04C-5DCEF5E7BD92} + BulletDotNET + + + + + \ No newline at end of file diff --git a/BulletPhysics/bulletTrunk/BulletDotNET/BulletConsoleTest/Program.cs b/BulletPhysics/bulletTrunk/BulletDotNET/BulletConsoleTest/Program.cs new file mode 100644 index 00000000..6f581e3d --- /dev/null +++ b/BulletPhysics/bulletTrunk/BulletDotNET/BulletConsoleTest/Program.cs @@ -0,0 +1,162 @@ +using System; +using BulletDotNET; + + +namespace BulletConsoleTest +{ + class Program + { + static void Main(string[] args) + { + btVector3 testvec = new btVector3(-2, 1, 0); + Console.WriteLine(String.Format("Original: {0}", testvec.testStr())); + btVector3 testvec2 = testvec.absolute(); + Console.WriteLine(String.Format("absolute: {0}", testvec2.testStr())); + Console.WriteLine(String.Format("angle:{0}", testvec.angle(testvec2))); + Console.WriteLine(String.Format("closestAxis(orig):{0}", testvec.closestAxis())); + btVector3 testvec3 = testvec.cross(testvec2); + Console.WriteLine(String.Format("cross: {0}", testvec3.testStr())); + Console.WriteLine(String.Format("distance: {0}", testvec.distance(testvec2))); + Console.WriteLine(String.Format("distance2: {0}", testvec.distance2(testvec2))); + Console.WriteLine(String.Format("dot: {0}", testvec.dot(testvec2))); + Console.WriteLine(String.Format("furthestAxis(orig): {0}", testvec.furthestAxis())); + btVector3 testvec4 = testvec.normalized(); + Console.WriteLine(String.Format("normalized: {0}", testvec4.testStr())); + testvec4.setInterpolate3(testvec, testvec2, 0.5f); + Console.WriteLine(String.Format("interpolate3: {0}", testvec4.testStr())); + testvec4.setValue(7f, -0.09f, 2.5f); + Console.WriteLine(String.Format("setvec: {0}", testvec4.testStr())); + testvec4.setX(5.0f); + testvec4.setY(-0.25f); + testvec4.setZ(90f); + testvec.setValue(0, 0, -1024); + testvec2.setValue(256, 256, 1024); + Console.WriteLine(String.Format("setvecIndividual: {0}", testvec4.testStr())); + btAxisSweep3 testbtAxisSweep3 = new btAxisSweep3(testvec, testvec2, 50); + btDefaultCollisionConfiguration colconfig = new btDefaultCollisionConfiguration(); + btCollisionDispatcher coldisp = new btCollisionDispatcher(colconfig); + btSequentialImpulseConstraintSolver seqimpconssol = new btSequentialImpulseConstraintSolver(); + btDiscreteDynamicsWorld dynamicsWorld = new btDiscreteDynamicsWorld(coldisp, testbtAxisSweep3, seqimpconssol, + colconfig); + dynamicsWorld.setGravity(new btVector3(0, 0, -9.87f)); + Console.WriteLine(String.Format("stepWorld: {0}", dynamicsWorld.stepSimulation((6f / 60), 5, (1f / 60)))); + Console.WriteLine(String.Format("stepWorld: {0}", dynamicsWorld.stepSimulation((6f / 60), 5, (1f / 60)))); + Console.WriteLine(String.Format("stepWorld: {0}", dynamicsWorld.stepSimulation((6f / 60), 5, (1f / 60)))); + Console.WriteLine(String.Format("stepWorld: {0}", dynamicsWorld.stepSimulation((6f / 60), 5, (1f / 60)))); + btQuaternion testquat = new btQuaternion(50, 0, 0, 1); + btQuaternion testquatnorm = testquat.normalized(); + Console.WriteLine(String.Format("testquat: {0}", testquat.testStr())); + Console.WriteLine(String.Format("testquatnormalize: {0}", testquatnorm.testStr())); + Console.WriteLine(String.Format("testquatLength: {0}", testquat.length())); + Console.WriteLine(String.Format("testquatnormalizeLength: {0}", testquatnorm.length())); + + float[] heightdata = new float[256*256]; + for (int j=0;j<256*256;j++) + { + if (j%2==0) + heightdata[j] = 21f; + else + heightdata[j] = 28f; + + } + + btHeightfieldTerrainShape obj = new btHeightfieldTerrainShape(256, 256, heightdata, 1.0f, 0, 256, + (int)btHeightfieldTerrainShape.UPAxis.Z, + (int)btHeightfieldTerrainShape.PHY_ScalarType. + PHY_FLOAT, false); + + btCapsuleShape cap = new btCapsuleShape(0.23f, 3); + + btTriangleMesh testMesh = new btTriangleMesh(true, false); + testMesh.addTriangle(new btVector3(1, 0, 1), new btVector3(1, 0, -1), new btVector3(-1, 0, -1), false); + testMesh.addTriangle(new btVector3(1, -1, 1), new btVector3(1, -1, -1), new btVector3(-1, -1, -1), false); + testMesh.addTriangle(new btVector3(1, -1, 1), new btVector3(1, 0, 1), new btVector3(-1, -1, -1), false); + testMesh.addTriangle(new btVector3(1, 0, 1), new btVector3(1, -1, -1), new btVector3(-1, 0, -1), false); + testMesh.addTriangle(new btVector3(1, -1, -1), new btVector3(-1, 0, -1), new btVector3(-1, -1, -1), false); + testMesh.addTriangle(new btVector3(1, -1, -1), new btVector3(1, 0, -1), new btVector3(-1, 0, -1), false); + testMesh.addTriangle(new btVector3(1, 0, 1), new btVector3(1, -1, -1), new btVector3(1, 0, -1), false); + testMesh.addTriangle(new btVector3(1, -1, 1), new btVector3(1, -1, -1), new btVector3(1, 0, 1), false); + btGImpactMeshShape meshtest = new btGImpactMeshShape(testMesh); + meshtest.updateBound(); + + btRigidBody groundbody = new btRigidBody(0, + new btDefaultMotionState( + new btTransform(new btQuaternion(0, 0, 0, 1), + new btVector3(128, 128, 256f / 2f))), obj, + new btVector3(0, 0, 0)); + + btRigidBody capbody = new btRigidBody(200, + new btDefaultMotionState( + new btTransform(new btQuaternion(0, 0, 0, 1), + new btVector3(128, 128, 25))), cap, + new btVector3(0, 0, 0)); + + btRigidBody meshbody = new btRigidBody(200, + new btDefaultMotionState( + new btTransform(new btQuaternion(0, 0, 0, 1), + new btVector3(128, 128, 29))), meshtest, + new btVector3(0, 0, 0)); + + + btRigidBodyConstructionInfo constructioninfotest = new btRigidBodyConstructionInfo(); + constructioninfotest.m_collisionShape = new btBoxShape(new btVector3(0.5f,0.5f,0.5f)); + constructioninfotest.m_localInertia = new btVector3(0, 0, 0); + constructioninfotest.m_motionState = new btDefaultMotionState(new btTransform(new btQuaternion(0.3f, -0.4f, 0.8f, 0.1f), new btVector3(128.5f, 128, 25)), + new btTransform(new btQuaternion(0,0,0,1),new btVector3(0,0.25f,0))); + constructioninfotest.m_startWorldTransform = new btTransform(new btQuaternion(0,0,0,1),new btVector3(0,0,0)); + constructioninfotest.m_mass = 2000000; + constructioninfotest.m_linearDamping = 0; + constructioninfotest.m_angularDamping = 0; + constructioninfotest.m_friction = 0.1f; + constructioninfotest.m_restitution = 0; + constructioninfotest.m_linearSleepingThreshold = 0.8f; + constructioninfotest.m_angularSleepingThreshold = 1; + constructioninfotest.m_additionalDamping = false; + constructioninfotest.m_additionalDampingFactor = 0.005f; + constructioninfotest.m_additionalLinearDampingThresholdSqr = 0.01f; + constructioninfotest.m_additionalAngularDampingThresholdSqr = 0.01f; + constructioninfotest.m_additionalAngularDampingFactor = 0.01f; + constructioninfotest.commit(); + btGImpactCollisionAlgorithm.registerAlgorithm(coldisp); + btRigidBody cubetest = new btRigidBody(constructioninfotest); + + dynamicsWorld.addRigidBody(groundbody); + dynamicsWorld.addRigidBody(cubetest); + dynamicsWorld.addRigidBody(capbody); + dynamicsWorld.addRigidBody(meshbody); + + int frame = 0; + for (int i = 0; i < 26; i++ ) + { + int frames = dynamicsWorld.stepSimulation(((i%60) / 60f), 10, (1f / 60)); + frame += frames; + Console.WriteLine(String.Format("Cube: frame {0} frames: {1} POS:{2}, quat:{3}", frame, frames, cubetest.getInterpolationWorldTransform().getOrigin().testStr(), cubetest.getWorldTransform().getRotation().testStr())); + Console.WriteLine(String.Format("Cap: frame {0} frames: {1} POS:{2}, quat:{3}", frame, frames, capbody.getInterpolationWorldTransform().getOrigin().testStr(), capbody.getWorldTransform().getRotation().testStr())); + Console.WriteLine(String.Format("Mesh: frame {0} frames: {1} POS:{2}, quat:{3}", frame, frames, meshbody.getInterpolationWorldTransform().getOrigin().testStr(), meshbody.getWorldTransform().getRotation().testStr())); + + } + + dynamicsWorld.removeRigidBody(meshbody); + dynamicsWorld.removeRigidBody(capbody); + dynamicsWorld.removeRigidBody(cubetest); + dynamicsWorld.removeRigidBody(groundbody); + cubetest.Dispose(); + groundbody.Dispose(); + capbody.Dispose(); + cap.Dispose(); + obj.Dispose(); + testbtAxisSweep3.Dispose(); + dynamicsWorld.Dispose(); + coldisp.Dispose(); + colconfig.Dispose(); + seqimpconssol.Dispose(); + + + testvec.Dispose(); + testvec2.Dispose(); + testvec3.Dispose(); + testvec4.Dispose(); + + } + } +} diff --git a/BulletPhysics/bulletTrunk/BulletDotNET/BulletConsoleTest/Properties/AssemblyInfo.cs b/BulletPhysics/bulletTrunk/BulletDotNET/BulletConsoleTest/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..a2af2504 --- /dev/null +++ b/BulletPhysics/bulletTrunk/BulletDotNET/BulletConsoleTest/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("BulletConsoleTest")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("BulletConsoleTest")] +[assembly: AssemblyCopyright("Copyright © 2009")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("a4b7bc75-fd33-4385-a0e6-92d3d99b6bec")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/BulletDotNET.csproj b/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/BulletDotNET.csproj new file mode 100644 index 00000000..6c547790 --- /dev/null +++ b/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/BulletDotNET.csproj @@ -0,0 +1,88 @@ + + + + Debug + AnyCPU + 9.0.30729 + 2.0 + {F969D6F1-1B88-489E-A04C-5DCEF5E7BD92} + Library + Properties + BulletDotNET + BulletDotNET + v2.0 + 512 + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + ..\bin\Release\ + TRACE + prompt + 4 + true + false + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/Native.cs b/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/Native.cs new file mode 100644 index 00000000..2464b1d5 --- /dev/null +++ b/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/Native.cs @@ -0,0 +1,27 @@ +using System; + +namespace BulletDotNET +{ + public static class Native + { + public const string Dll = "libbulletnet"; + + public static object GetObject(IntPtr raw, Type t) + { + if (raw == IntPtr.Zero) + throw new InvalidOperationException(); + object o; + + try + { + o = Activator.CreateInstance(t, raw); + } + catch (TypeLoadException) + { + throw new InvalidOperationException(); + } + + return o; + } + } +} diff --git a/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/Properties/AssemblyInfo.cs b/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..d871b845 --- /dev/null +++ b/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/Properties/AssemblyInfo.cs @@ -0,0 +1,36 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("BulletDotNET")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("")] +[assembly: AssemblyProduct("BulletDotNET")] +[assembly: AssemblyCopyright("Copyright © 2009")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("d54a5c1c-3a54-4a8a-a14d-88ebba9ce706")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the values or you can default the Build and Revision Numbers +// by using the '*' as shown below: +// [assembly: AssemblyVersion("1.0.*")] +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/ClosestNotMeRayResultCallback.cs b/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/ClosestNotMeRayResultCallback.cs new file mode 100644 index 00000000..90d850f9 --- /dev/null +++ b/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/ClosestNotMeRayResultCallback.cs @@ -0,0 +1,99 @@ +using System; +using System.Runtime.InteropServices; +using System.Security; + +namespace BulletDotNET +{ + public class ClosestNotMeRayResultCallback : btRayResultCallback, IDisposable + { + + public static ClosestNotMeRayResultCallback FromIntPtr(IntPtr handle) + { + return (ClosestNotMeRayResultCallback)Native.GetObject(handle, + typeof(ClosestNotMeRayResultCallback)); + } + + public ClosestNotMeRayResultCallback(IntPtr handle) + { + m_handle = handle; + } + + public ClosestNotMeRayResultCallback(btRigidBody body) + { + m_handle = BulletHelper_CreateClosestNotMeRaycastResultCallback(body.Handle); + } + + public bool hasHit() + { + return BulletHelper_ClosestNotMeRaycastResultCallback_hasHit(m_handle); + } + + public btVector3 getHitPointWorld() + { + IntPtr resultHandle = BulletHelper_ClosestNotMeRaycastResultCallback_getHitPointWorld(m_handle); + if (resultHandle != IntPtr.Zero) + return btVector3.FromIntPtr(resultHandle); + else + return null; + } + + + #region NativeInvokes + + + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletHelper_CreateClosestNotMeRaycastResultCallback(IntPtr body); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern bool BulletHelper_ClosestNotMeRaycastResultCallback_hasHit(IntPtr handle); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletHelper_ClosestNotMeRaycastResultCallback_getHitPointWorld(IntPtr handle); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletHelper_ClosestNotMeRaycastResultCallback_delete(IntPtr handle); + #endregion + + #region IDisposable Members + + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + #endregion + + protected virtual void Dispose(bool disposing) + { + // Check to see if Dispose has already been called. + if (!m_disposed) + { + // If disposing equals true, dispose all managed + // and unmanaged resources. + if (disposing) + { + // Dispose managed resources. + // none yet + } + // Release unmanaged resources. If disposing is false, + // only the following code is executed. + BulletHelper_ClosestNotMeRaycastResultCallback_delete(m_handle); + m_handle = IntPtr.Zero; + // Note that this is not thread safe. + // Another thread could start disposing the object + // after the managed resources are disposed, + // but before the disposed flag is set to true. + // If thread safety is necessary, it must be + // implemented by the client. + + } + m_disposed = true; + } + + ~ClosestNotMeRayResultCallback() + { + // Do not re-create Dispose clean-up code here. + // Calling Dispose(false) is optimal in terms of + // readability and maintainability. + Dispose(false); + } + } +} diff --git a/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/CollisionShapes/btBoxShape.cs b/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/CollisionShapes/btBoxShape.cs new file mode 100644 index 00000000..a95d0a2a --- /dev/null +++ b/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/CollisionShapes/btBoxShape.cs @@ -0,0 +1,147 @@ +using System; +using System.Runtime.InteropServices; +using System.Security; + +namespace BulletDotNET +{ + public class btBoxShape : btCollisionShape, IDisposable + { + public static new btBoxShape FromIntPtr(IntPtr handle) + { + return (btBoxShape)Native.GetObject(handle, typeof(btBoxShape)); + } + + public btBoxShape(IntPtr handle) + : base(handle) + { + + } + + public btBoxShape(btVector3 boxHalfExtents) + : base() + { + m_handle = BulletAPI_CreateBtBoxShape(boxHalfExtents.Handle); + } + + public btVector3 getHalfExtentsWithMargin() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return btVector3.FromIntPtr(BulletAPI_BtBoxShape_getHalfExtentsWithMargin(m_handle)); + } + + public btVector3 getHalfExtentsWithoutMargin() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return btVector3.FromIntPtr(BulletAPI_BtBoxShape_getHalfExtentsWithoutMargin(m_handle)); + } + + public static int getNumPlanes() + { + return 6; + } + + public static int getNumVerticies() + { + return 8; + } + + public static int getNumEdges() + { + return 12; + } + + public btVector3 getVertex(int i) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return btVector3.FromIntPtr(BulletAPI_BtBoxShape_getVertex(m_handle, i)); + } + + public bool isInside(btVector3 pt, float tolerance) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return BulletAPI_BtBoxShape_isInside(m_handle, pt.Handle, tolerance); + } + + public void setMargins(float collisionMargin) + { + BulletAPI_BtBoxShape_setMargins(m_handle,collisionMargin); + } + + #region Native Invokes + + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_CreateBtBoxShape(IntPtr boxHalfExtents); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_BtBoxShape_getHalfExtentsWithMargin(IntPtr handle); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_BtBoxShape_getHalfExtentsWithoutMargin(IntPtr handle); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_BtBoxShape_getVertex(IntPtr handle, int i); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern bool BulletAPI_BtBoxShape_isInside(IntPtr handle, IntPtr pt, float tolerance); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtBoxShape_setLocalScaling(IntPtr handle, IntPtr scaling); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtBoxShape_setMargins(IntPtr handle, float collisionMargin); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtBoxShape_delete(IntPtr handle); + + + #endregion + + + #region IDisposable Members + + public new void Dispose() + { + Dispose(true); + } + + #endregion + + protected virtual new void Dispose(bool disposing) + { + // Check to see if Dispose has already been called. + if (!m_disposed) + { + // If disposing equals true, dispose all managed + // and unmanaged resources. + if (disposing) + { + // Dispose managed resources. + base.Dispose(); + + } + // Release unmanaged resources. If disposing is false, + // only the following code is executed. + //BulletAPI_BtRigidBody_delete(m_handle); + //m_handle = IntPtr.Zero; + // Note that this is not thread safe. + // Another thread could start disposing the object + // after the managed resources are disposed, + // but before the disposed flag is set to true. + // If thread safety is necessary, it must be + // implemented by the client. + + } + m_disposed = true; + } + + ~btBoxShape() + { + // Do not re-create Dispose clean-up code here. + // Calling Dispose(false) is optimal in terms of + // readability and maintainability. + Dispose(false); + } + + } +} diff --git a/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/CollisionShapes/btCapsuleShape.cs b/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/CollisionShapes/btCapsuleShape.cs new file mode 100644 index 00000000..906d4c15 --- /dev/null +++ b/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/CollisionShapes/btCapsuleShape.cs @@ -0,0 +1,103 @@ +using System; +using System.Runtime.InteropServices; +using System.Security; + +namespace BulletDotNET +{ + public class btCapsuleShape : btCollisionShape, IDisposable + { + public static new btCapsuleShape FromIntPtr(IntPtr handle) + { + return (btCapsuleShape)Native.GetObject(handle, typeof(btCapsuleShape)); + } + + public btCapsuleShape(IntPtr handle) + : base(handle) + { + + } + + public btCapsuleShape(float radius, float height) : base() + { + m_handle = BulletAPI_CreateBtCapsuleShape(radius, height); + } + + public float getRadius() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + + return BulletAPI_BtCapsuleShape_getRadius(m_handle); + } + + public float getHalfHeight() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + + return BulletAPI_BtCapsuleShape_getHalfHeight(m_handle); + } + + #region Native Invokes + + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_CreateBtCapsuleShape(float radius, float height); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern float BulletAPI_BtCapsuleShape_getRadius(IntPtr handle); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern float BulletAPI_BtCapsuleShape_getHalfHeight(IntPtr handle); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtCapsuleShape_delete(IntPtr handle); + + #endregion + + + #region IDisposable Members + + public new void Dispose() + { + Dispose(true); + } + + #endregion + + protected virtual new void Dispose(bool disposing) + { + // Check to see if Dispose has already been called. + if (!m_disposed) + { + // If disposing equals true, dispose all managed + // and unmanaged resources. + if (disposing) + { + // Dispose managed resources. + base.Dispose(); + + } + // Release unmanaged resources. If disposing is false, + // only the following code is executed. + //BulletAPI_BtRigidBody_delete(m_handle); + //m_handle = IntPtr.Zero; + // Note that this is not thread safe. + // Another thread could start disposing the object + // after the managed resources are disposed, + // but before the disposed flag is set to true. + // If thread safety is necessary, it must be + // implemented by the client. + + } + m_disposed = true; + } + + ~btCapsuleShape() + { + // Do not re-create Dispose clean-up code here. + // Calling Dispose(false) is optimal in terms of + // readability and maintainability. + Dispose(false); + } + + } +} diff --git a/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/CollisionShapes/btGImpactCollisionAlgorithm.cs b/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/CollisionShapes/btGImpactCollisionAlgorithm.cs new file mode 100644 index 00000000..ad1eddc5 --- /dev/null +++ b/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/CollisionShapes/btGImpactCollisionAlgorithm.cs @@ -0,0 +1,10 @@ +namespace BulletDotNET +{ + public static class btGImpactCollisionAlgorithm + { + public static void registerAlgorithm(btCollisionDispatcher dispatcher) + { + dispatcher.RegisterGImpact(); + } + } +} diff --git a/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/CollisionShapes/btGImpactMeshShape.cs b/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/CollisionShapes/btGImpactMeshShape.cs new file mode 100644 index 00000000..5939197f --- /dev/null +++ b/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/CollisionShapes/btGImpactMeshShape.cs @@ -0,0 +1,92 @@ +using System; +using System.Runtime.InteropServices; +using System.Security; + +namespace BulletDotNET +{ + public class btGImpactMeshShape : btCollisionShape, IDisposable + { + public static new btGImpactMeshShape FromIntPtr(IntPtr handle) + { + return (btGImpactMeshShape)Native.GetObject(handle, typeof(btGImpactMeshShape)); + } + + public btGImpactMeshShape(IntPtr handle) + : base(handle) + { + + } + + public btGImpactMeshShape(btStridingMeshInterface meshInterface) + : base() + { + m_handle = BulletAPI_CreateBtGImpactMeshShape(meshInterface.Handle); + } + + public void updateBound() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + BulletAPI_BtGImpactMeshShape_updateBound(m_handle); + } + + #region Native Invokes + + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_CreateBtGImpactMeshShape(IntPtr meshInterface); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtGImpactMeshShape_updateBound(IntPtr handle); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_btSphereShape_delete(IntPtr handle); + + #endregion + + + #region IDisposable Members + + public new void Dispose() + { + Dispose(true); + } + + #endregion + + protected virtual new void Dispose(bool disposing) + { + // Check to see if Dispose has already been called. + if (!m_disposed) + { + // If disposing equals true, dispose all managed + // and unmanaged resources. + if (disposing) + { + // Dispose managed resources. + base.Dispose(); + + } + // Release unmanaged resources. If disposing is false, + // only the following code is executed. + //BulletAPI_BtRigidBody_delete(m_handle); + //m_handle = IntPtr.Zero; + // Note that this is not thread safe. + // Another thread could start disposing the object + // after the managed resources are disposed, + // but before the disposed flag is set to true. + // If thread safety is necessary, it must be + // implemented by the client. + + } + m_disposed = true; + } + + ~btGImpactMeshShape() + { + // Do not re-create Dispose clean-up code here. + // Calling Dispose(false) is optimal in terms of + // readability and maintainability. + Dispose(false); + } + + } +} diff --git a/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/CollisionShapes/btSphereShape.cs b/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/CollisionShapes/btSphereShape.cs new file mode 100644 index 00000000..f4c27e86 --- /dev/null +++ b/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/CollisionShapes/btSphereShape.cs @@ -0,0 +1,105 @@ +using System; +using System.Runtime.InteropServices; +using System.Security; + +namespace BulletDotNET +{ + public class btSphereShape : btCollisionShape, IDisposable + { + public static new btSphereShape FromIntPtr(IntPtr handle) + { + return (btSphereShape)Native.GetObject(handle, typeof(btSphereShape)); + } + + public btSphereShape(IntPtr handle) + : base(handle) + { + + } + + public btSphereShape(float radius) + : base() + { + m_handle = BulletAPI_CreateBtSphereShape(radius); + } + + + public void setUnscaledRadius(float radius) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + BulletAPI_BtSphereShape_setUnscaledRadius(m_handle, radius); + } + + public float getRadius() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return BulletAPI_btSphereShape_getRadius(m_handle); + } + + + + #region Native Invokes + + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_CreateBtSphereShape(float radius); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern float BulletAPI_btSphereShape_getRadius(IntPtr handle); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtSphereShape_setUnscaledRadius(IntPtr handle, float unscaledRadius); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_btSphereShape_delete(IntPtr handle); + + #endregion + + + #region IDisposable Members + + public new void Dispose() + { + Dispose(true); + } + + #endregion + + protected virtual new void Dispose(bool disposing) + { + // Check to see if Dispose has already been called. + if (!m_disposed) + { + // If disposing equals true, dispose all managed + // and unmanaged resources. + if (disposing) + { + // Dispose managed resources. + base.Dispose(); + + } + // Release unmanaged resources. If disposing is false, + // only the following code is executed. + //BulletAPI_BtRigidBody_delete(m_handle); + //m_handle = IntPtr.Zero; + // Note that this is not thread safe. + // Another thread could start disposing the object + // after the managed resources are disposed, + // but before the disposed flag is set to true. + // If thread safety is necessary, it must be + // implemented by the client. + + } + m_disposed = true; + } + + ~btSphereShape() + { + // Do not re-create Dispose clean-up code here. + // Calling Dispose(false) is optimal in terms of + // readability and maintainability. + Dispose(false); + } + + } +} diff --git a/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/CollisionShapes/btStridingMeshInterface.cs b/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/CollisionShapes/btStridingMeshInterface.cs new file mode 100644 index 00000000..0908e1bb --- /dev/null +++ b/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/CollisionShapes/btStridingMeshInterface.cs @@ -0,0 +1,33 @@ +using System; + + +namespace BulletDotNET +{ + public class btStridingMeshInterface + { + public static btStridingMeshInterface FromIntPtr(IntPtr handle) + { + return (btStridingMeshInterface)Native.GetObject(handle, typeof(btStridingMeshInterface)); + } + + public IntPtr m_handle = IntPtr.Zero; + public bool m_displosed = false; + + public IntPtr Handle + { + get { return m_handle; } + } + + // Don't use this one except by a base class. You're responsible for setting m_handle! + public btStridingMeshInterface() + { + + } + + public btStridingMeshInterface(IntPtr handle) + { + m_handle = handle; + } + + } +} diff --git a/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/CollisionShapes/btTriangleIndexVertexArray.cs b/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/CollisionShapes/btTriangleIndexVertexArray.cs new file mode 100644 index 00000000..b0b57fab --- /dev/null +++ b/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/CollisionShapes/btTriangleIndexVertexArray.cs @@ -0,0 +1,110 @@ +using System; +using System.Runtime.InteropServices; +using System.Security; + +namespace BulletDotNET +{ + public class btTriangleIndexVertexArray : btStridingMeshInterface, IDisposable + { + private bool usethisdispose = false; + + public static new btTriangleIndexVertexArray FromIntPtr(IntPtr handle) + { + return (btTriangleIndexVertexArray)Native.GetObject(handle, typeof(btTriangleIndexVertexArray)); + } + + public new IntPtr Handle + { + get { return m_handle; } + } + + protected new IntPtr m_handle + { + get { return base.m_handle; } + set { base.m_handle = value; } + } + + //Expose m_disposed of base class to derived classes while still being protected. + protected bool m_disposed + { + get { return m_displosed; } + set { m_displosed = value; } + } + + // Don't use this one except by a base class. You're responsible for setting m_handle! + public btTriangleIndexVertexArray() + { + + } + + public btTriangleIndexVertexArray(IntPtr handle) + { + m_handle = handle; + } + + public btTriangleIndexVertexArray(int numTriangles, int[] triangleIndexBase, + int triangleIndexStride, int numVerticies, + float[] vertexBase, int vertexStride) + { + usethisdispose = true; + m_handle = BulletAPI_CreateBtTriangleIndexVertexArray(numTriangles, triangleIndexBase, triangleIndexStride, + numVerticies, vertexBase, vertexStride); + } + + + + #region Native Invokes + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_CreateBtTriangleIndexVertexArray(int numTriangles, int[] triangleIndexBase, + int triangleIndexStride, int numVerticies, + float[] vertexBase, int vertexStride); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtTriangleIndexVertexArray_delete(IntPtr handle); + #endregion + + #region IDisposable Members + + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + #endregion + + protected virtual void Dispose(bool disposing) + { + // Check to see if Dispose has already been called. + if (!m_disposed) + { + // If disposing equals true, dispose all managed + // and unmanaged resources. + if (disposing) + { + // Dispose managed resources. + // none yet + } + // Release unmanaged resources. If disposing is false, + // only the following code is executed. + BulletAPI_BtTriangleIndexVertexArray_delete(m_handle); + m_handle = IntPtr.Zero; + // Note that this is not thread safe. + // Another thread could start disposing the object + // after the managed resources are disposed, + // but before the disposed flag is set to true. + // If thread safety is necessary, it must be + // implemented by the client. + + } + m_disposed = true; + } + + ~btTriangleIndexVertexArray() + { + // Do not re-create Dispose clean-up code here. + // Calling Dispose(false) is optimal in terms of + // readability and maintainability. + Dispose(false); + } + } +} diff --git a/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/CollisionShapes/btTriangleMesh.cs b/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/CollisionShapes/btTriangleMesh.cs new file mode 100644 index 00000000..0ee86fe6 --- /dev/null +++ b/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/CollisionShapes/btTriangleMesh.cs @@ -0,0 +1,142 @@ +using System; +using System.Runtime.InteropServices; +using System.Security; + +namespace BulletDotNET +{ + public class btTriangleMesh : btTriangleIndexVertexArray, IDisposable + { + + public static new btTriangleMesh FromIntPtr(IntPtr handle) + { + return (btTriangleMesh)Native.GetObject(handle, typeof(btTriangleMesh)); + } + + public new IntPtr Handle + { + get { return m_handle; } + } + + public btTriangleMesh(bool use32BitIndices, bool use4componentVertices) + { + m_handle = BulletAPI_CreateBtTriangleMesh(use32BitIndices, use4componentVertices); + } + + public void addIndex(int index) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + BulletAPI_BtTriangleMesh_addIndex(m_handle, index); + } + + public void addTriangle( btVector3 vertex0, btVector3 vertex1, btVector3 vertex2, bool removeDuplicates) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + BulletAPI_BtTriangleMesh_addTriangle(m_handle, vertex0.Handle, vertex1.Handle, vertex2.Handle, + removeDuplicates); + } + + public int findOrAddVertex(btVector3 vertex, bool removeDuplicateVertices) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return BulletAPI_BtTriangleMesh_findOrAddVertex(m_handle, vertex.Handle, removeDuplicateVertices); + } + + public int getNumTriangles() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return BulletAPI_BtTriangleMesh_getNumTriangles(m_handle); + } + + public bool getUse32BitIndices() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return BulletAPI_BtTriangleMesh_getUse32BitIndices(m_handle); + } + + public bool getUse4componentVertices() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return BulletAPI_BtTriangleMesh_getUse4componentVertices(m_handle); + } + + + #region Native Invokes + + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_CreateBtTriangleMesh(bool use32BitIndices, bool use4componentVerticies); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtTriangleMesh_addIndex(IntPtr handle, int index); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtTriangleMesh_addTriangle(IntPtr handle, IntPtr vertex0, IntPtr vertex1, IntPtr vertex2, bool removeDuplicateVertices); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern int BulletAPI_BtTriangleMesh_findOrAddVertex(IntPtr handle, IntPtr vertex, bool removeDuplicateVertices); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern int BulletAPI_BtTriangleMesh_getNumTriangles(IntPtr handle); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern bool BulletAPI_BtTriangleMesh_getUse32BitIndices(IntPtr handle); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern bool BulletAPI_BtTriangleMesh_getUse4componentVertices(IntPtr handle); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtTriangleMesh_delete(IntPtr handle); + + #endregion + + + #region IDisposable Members + + public new void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + #endregion + + protected new virtual void Dispose(bool disposing) + { + // Check to see if Dispose has already been called. + if (!m_disposed) + { + // If disposing equals true, dispose all managed + // and unmanaged resources. + if (disposing) + { + // Dispose managed resources. + // none yet + } + // Release unmanaged resources. If disposing is false, + // only the following code is executed. + BulletAPI_BtTriangleMesh_delete(m_handle); + m_handle = IntPtr.Zero; + // Note that this is not thread safe. + // Another thread could start disposing the object + // after the managed resources are disposed, + // but before the disposed flag is set to true. + // If thread safety is necessary, it must be + // implemented by the client. + + } + m_disposed = true; + } + + ~btTriangleMesh() + { + // Do not re-create Dispose clean-up code here. + // Calling Dispose(false) is optimal in terms of + // readability and maintainability. + Dispose(false); + } + } +} diff --git a/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/btAxisSweep3.cs b/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/btAxisSweep3.cs new file mode 100644 index 00000000..9d42996d --- /dev/null +++ b/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/btAxisSweep3.cs @@ -0,0 +1,91 @@ +using System; +using System.Runtime.InteropServices; +using System.Security; + + +namespace BulletDotNET +{ + public class btAxisSweep3 : btBroadphaseInterface, IDisposable + { + private IntPtr m_handle = IntPtr.Zero; + + private bool m_disposed = false; + + public static btAxisSweep3 FromIntPtr(IntPtr handle) + { + return (btAxisSweep3)Native.GetObject(handle, typeof(btAxisSweep3)); + } + + public new IntPtr Handle + { + get { return m_handle; } + } + + public btAxisSweep3(IntPtr handle) : base(handle) + { + m_handle = handle; + } + + public btAxisSweep3(btVector3 worldAabbMin, btVector3 worldAabbMax, int MaxProxies) + { + m_handle = BulletAPI_CreateBtAxisSweep3(worldAabbMin.Handle, worldAabbMax.Handle, MaxProxies); + base.Handle = m_handle; + } + + #region Native Invokes + + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_CreateBtAxisSweep3(IntPtr worldAabbMin, IntPtr worldAabbMax, int MaxProxies); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtAxisSweep3_delete(IntPtr ax); + + #endregion + + + #region IDisposable Members + + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + #endregion + + protected virtual void Dispose(bool disposing) + { + // Check to see if Dispose has already been called. + if (!m_disposed) + { + // If disposing equals true, dispose all managed + // and unmanaged resources. + if (disposing) + { + // Dispose managed resources. + // none yet + } + // Release unmanaged resources. If disposing is false, + // only the following code is executed. + BulletAPI_BtAxisSweep3_delete(m_handle); + m_handle = IntPtr.Zero; + // Note that this is not thread safe. + // Another thread could start disposing the object + // after the managed resources are disposed, + // but before the disposed flag is set to true. + // If thread safety is necessary, it must be + // implemented by the client. + + } + m_disposed = true; + } + + ~btAxisSweep3() + { + // Do not re-create Dispose clean-up code here. + // Calling Dispose(false) is optimal in terms of + // readability and maintainability. + Dispose(false); + } + + } +} diff --git a/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/btBroadphaseInterface.cs b/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/btBroadphaseInterface.cs new file mode 100644 index 00000000..0fdaf2ca --- /dev/null +++ b/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/btBroadphaseInterface.cs @@ -0,0 +1,25 @@ +using System; + + +namespace BulletDotNET +{ + public class btBroadphaseInterface + { + private IntPtr m_handle; + + public IntPtr Handle + { + get { return m_handle; } + set { m_handle = value; } + } + + public btBroadphaseInterface(IntPtr handle) + { + m_handle = handle; + } + public btBroadphaseInterface() + { + m_handle = IntPtr.Zero; + } + } +} diff --git a/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/btCollisionConfiguration.cs b/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/btCollisionConfiguration.cs new file mode 100644 index 00000000..2ccad336 --- /dev/null +++ b/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/btCollisionConfiguration.cs @@ -0,0 +1,26 @@ +using System; +using System.Collections.Generic; +using System.Text; + +namespace BulletDotNET +{ + public class btCollisionConfiguration + { + private IntPtr m_handle; + + public IntPtr Handle + { + get { return m_handle; } + set { m_handle = value; } + } + + public btCollisionConfiguration(IntPtr handle) + { + m_handle = handle; + } + public btCollisionConfiguration() + { + m_handle = IntPtr.Zero; + } + } +} diff --git a/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/btCollisionDispatcher.cs b/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/btCollisionDispatcher.cs new file mode 100644 index 00000000..c424fa76 --- /dev/null +++ b/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/btCollisionDispatcher.cs @@ -0,0 +1,97 @@ +using System; +using System.Runtime.InteropServices; +using System.Security; + +namespace BulletDotNET +{ + public class btCollisionDispatcher : btDispatcher, IDisposable + { + private IntPtr m_handle = IntPtr.Zero; + + private bool m_disposed = false; + + public static btCollisionDispatcher FromIntPtr(IntPtr handle) + { + return (btCollisionDispatcher)Native.GetObject(handle, typeof(btCollisionDispatcher)); + } + + public new IntPtr Handle + { + get { return m_handle; } + } + + public btCollisionDispatcher(IntPtr handle) : base(handle) + { + m_handle = handle; + } + + public btCollisionDispatcher(btCollisionConfiguration config) + { + m_handle = BulletAPI_CreateBtCollisionDispatcher(config.Handle); + base.Handle = m_handle; + } + + // Registers using the GImpact collision algorithm (so things will collide) + public void RegisterGImpact() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + BulletAPI_BtCollisionDispatcher_RegisterGImpact(m_handle); + } + + #region Native Invokes + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_CreateBtCollisionDispatcher(IntPtr config); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtCollisionDispatcher_RegisterGImpact(IntPtr handle); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtCollisionDispatcher_delete(IntPtr obj); + #endregion + + #region IDisposable Members + + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + #endregion + + protected virtual void Dispose(bool disposing) + { + // Check to see if Dispose has already been called. + if (!m_disposed) + { + // If disposing equals true, dispose all managed + // and unmanaged resources. + if (disposing) + { + // Dispose managed resources. + // none yet + } + // Release unmanaged resources. If disposing is false, + // only the following code is executed. + BulletAPI_BtCollisionDispatcher_delete(m_handle); + m_handle = IntPtr.Zero; + // Note that this is not thread safe. + // Another thread could start disposing the object + // after the managed resources are disposed, + // but before the disposed flag is set to true. + // If thread safety is necessary, it must be + // implemented by the client. + + } + m_disposed = true; + } + + ~btCollisionDispatcher() + { + // Do not re-create Dispose clean-up code here. + // Calling Dispose(false) is optimal in terms of + // readability and maintainability. + Dispose(false); + } + } +} diff --git a/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/btCollisionObject.cs b/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/btCollisionObject.cs new file mode 100644 index 00000000..7e04f8c0 --- /dev/null +++ b/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/btCollisionObject.cs @@ -0,0 +1,592 @@ +using System; +using System.Runtime.InteropServices; +using System.Security; +using System.Text; + +namespace BulletDotNET +{ + public class btCollisionObject : IDisposable + { + protected IntPtr m_handle = IntPtr.Zero; + + protected bool m_disposed = false; + + public static btCollisionObject FromIntPtr(IntPtr handle) + { + return (btCollisionObject)Native.GetObject(handle, + typeof(btCollisionObject)); + } + + public IntPtr Handle + { + get { return m_handle; } + } + + public btCollisionObject(IntPtr handle) + { + m_handle = handle; + } + + public btCollisionObject() + { + //m_handle = BulletAPI_CreateBtCollisionObject(); + } + + public void activate(bool forceActivate) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + BulletAPI_BtCollisionObject_activate(m_handle, forceActivate); + } + + public bool checkCollideWith(btCollisionObject collisionObject) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return BulletAPI_BtCollisionObject_checkCollideWith(m_handle, collisionObject.Handle); + } + + public void forceActivationState(int newState) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + BulletAPI_BtCollisionObject_forceActivationState(m_handle, newState); + } + + public int getActivationState() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return BulletAPI_BtCollisionObject_getActivationState(m_handle); + } + + public btVector3 getAnisotropicFriction() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return btVector3.FromIntPtr(BulletAPI_BtCollisionObject_getAnisotropicFriction(m_handle)); + } + + // TODO: FIXME: create btBroadPhaseProxy object + private IntPtr getBroadPhaseHandle() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return BulletAPI_BtCollisionObject_getBroadphaseHandle(m_handle); + } + + public float getCcdMotionThreshold() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return BulletAPI_BtCollisionObject_getCcdMotionThreshold(m_handle); + } + + public float getCcdSquareMotionThreshold() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return BulletAPI_BtCollisionObject_getCcdSquareMotionThreshold(m_handle); + } + + public float getCcdSweptSphereRadius() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return BulletAPI_BtCollisionObject_getCcdSweptSphereRadius(m_handle); + } + + public int getCollisionFlags() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return BulletAPI_BtCollisionObject_getCollisionFlags(m_handle); + } + + public btCollisionShape getCollisionShape() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return btCollisionShape.FromIntPtr(BulletAPI_BtCollisionObject_getCollisionShape(m_handle)); + } + + public int getCompanionId() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return BulletAPI_BtCollisionObject_getCompanionId(m_handle); + } + + public float getContactProcessingThreshold() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return BulletAPI_BtCollisionObject_getContactProcessingThreshold(m_handle); + } + + public float getDeactivationTime() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return BulletAPI_BtCollisionObject_getDeactivationTime(m_handle); + } + + public float getFriction() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return BulletAPI_BtCollisionObject_getFriction(m_handle); + } + + public float getHitFraction() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return BulletAPI_BtCollisionObject_getHitFraction(m_handle); + } + + public btVector3 getInterpolationAngularVelocity() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return btVector3.FromIntPtr(BulletAPI_BtCollisionObject_getInterpolationAngularVelocity(m_handle)); + } + + public btVector3 getInterpolationLinearVelocity() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return btVector3.FromIntPtr(BulletAPI_BtCollisionObject_getInterpolationLinearVelocity(m_handle)); + } + + public btTransform getInterpolationWorldTransform() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return btTransform.FromIntPtr(BulletAPI_BtCollisionObject_getInterpolationWorldTransform(m_handle)); + } + + public int getIslandTag() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return BulletAPI_BtCollisionObject_getIslandTag(m_handle); + } + + public float getRestitution() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return BulletAPI_BtCollisionObject_getRestitution(m_handle); + } + + public btCollisionShape getRootCollisionShape() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return btCollisionShape.FromIntPtr(BulletAPI_BtCollisionObject_getRootCollisionShape(m_handle)); + } + + public IntPtr getUserPointer() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return BulletAPI_BtCollisionObject_getUserPointer(m_handle); + } + + public btTransform getWorldTransform() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return btTransform.FromIntPtr(BulletAPI_BtCollisionObject_getWorldTransform(m_handle)); + } + + public bool hasAnisotropicFriction() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return BulletAPI_BtCollisionObject_hasAnisotropicFriction(m_handle); + } + + public bool hasContactResponse() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return BulletAPI_BtCollisionObject_hasContactResponse(m_handle); + } + + public bool isActive() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return BulletAPI_BtCollisionObject_isActive(m_handle); + } + + public bool isKinematicObject() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return BulletAPI_BtCollisionObject_isKinematicObject(m_handle); + } + + public bool isStaticObject() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return BulletAPI_BtCollisionObject_isStaticObject(m_handle); + } + + public bool isStaticOrKinematicObject() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return BulletAPI_BtCollisionObject_isStaticOrKinematicObject(m_handle); + } + + public bool mergesSimulationIslands() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return BulletAPI_BtCollisionObject_mergesSimulationIslands(m_handle); + } + + + public void setActivationState(int newState) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + BulletAPI_BtCollisionObject_setActivationState(m_handle, newState); + } + + + public void setAnisotropicFriction(btVector3 anisotropicFriction) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + BulletAPI_BtCollisionObject_setAnisotropicFriction(m_handle, anisotropicFriction.Handle); + } + + // TODO: FIXME: add btBroadPhaseProxyObject + private void setBroadphaseHandle(IntPtr bphandle) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + BulletAPI_BtCollisionObject_setBroadphaseHandle(m_handle, bphandle); + } + + public void setCcdMotionThreshold(float ccdMotionThreshold) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + BulletAPI_BtCollisionObject_setCcdMotionThreshold(m_handle, ccdMotionThreshold); + } + + public void setCcdSweptSphereRadius(float radius) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + BulletAPI_BtCollisionObject_setCcdSweptSphereRadius(m_handle, radius); + } + + public void setCollisionFlags(int flags) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + BulletAPI_BtCollisionObject_setCollisionFlags(m_handle, flags); + } + + public void setCollisionShape(btCollisionShape collisionShape) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + BulletAPI_BtCollisionObject_setCollisionShape(m_handle, collisionShape.Handle); + } + + public void setCompanionId(int id) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + BulletAPI_BtCollisionObject_setCompanionId(m_handle, id); + } + + public void setContactProcessingThreshold(float contactProcessingThreshold) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + BulletAPI_BtCollisionObject_setContactProcessingThreshold(m_handle, contactProcessingThreshold); + } + + public void setDeactivationTime(float time) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + BulletAPI_BtCollisionObject_setDeactivationTime(m_handle, time); + } + + public void setFriction(float frict) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + BulletAPI_BtCollisionObject_setFriction(m_handle, frict); + } + + public void setHitFraction(float hitFraction) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + BulletAPI_BtCollisionObject_setHitFraction(m_handle, hitFraction); + } + + public void setInterpolationAngularVelocity(btVector3 angvel) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + BulletAPI_BtCollisionObject_setInterpolationAngularVelocity(m_handle, angvel.Handle); + } + + public void setInterpolationLinearVelocity(btVector3 linvel) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + BulletAPI_BtCollisionObject_setInterpolationLinearVelocity(m_handle, linvel.Handle); + } + + public void setInterpolationWorldTransform(btTransform trans) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + BulletAPI_BtCollisionObject_setInterpolationWorldTransform(m_handle, trans.Handle); + } + + public void setIslandTag(int tag) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + BulletAPI_BtCollisionObject_setIslandTag(m_handle, tag); + } + + public void setRestitution(float rest) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + BulletAPI_BtCollisionObject_setRestitution(m_handle, rest); + } + + public void setUserPointer(IntPtr userPointer) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + BulletAPI_BtCollisionObject_setUserPointer(m_handle, userPointer); + } + + public void setWorldTransform(btTransform worldTrans) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + BulletAPI_BtCollisionObject_setWorldTransform(m_handle, worldTrans.Handle); + } + + + #region Native Invokes + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_CreateBtCollisionObject(); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtCollisionObject_activate(IntPtr handle, bool forceActivate); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern bool BulletAPI_BtCollisionObject_checkCollideWith(IntPtr handle, IntPtr collisionObject); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtCollisionObject_forceActivationState(IntPtr handle, int newState); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern int BulletAPI_BtCollisionObject_getActivationState(IntPtr handle); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_BtCollisionObject_getAnisotropicFriction(IntPtr handle);//btVector3 + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_BtCollisionObject_getBroadphaseHandle(IntPtr handle); // btBroadPhaseProxy + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern float BulletAPI_BtCollisionObject_getCcdMotionThreshold(IntPtr handle); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern float BulletAPI_BtCollisionObject_getCcdSquareMotionThreshold(IntPtr handle); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern float BulletAPI_BtCollisionObject_getCcdSweptSphereRadius(IntPtr handle); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern int BulletAPI_BtCollisionObject_getCollisionFlags(IntPtr handle); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_BtCollisionObject_getCollisionShape(IntPtr handle); //btCollisionShape + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern int BulletAPI_BtCollisionObject_getCompanionId(IntPtr handle); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern float BulletAPI_BtCollisionObject_getContactProcessingThreshold(IntPtr handle); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern float BulletAPI_BtCollisionObject_getDeactivationTime(IntPtr handle); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern float BulletAPI_BtCollisionObject_getFriction(IntPtr handle); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern float BulletAPI_BtCollisionObject_getHitFraction(IntPtr handle); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_BtCollisionObject_getInterpolationAngularVelocity(IntPtr handle);//btVector3 + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_BtCollisionObject_getInterpolationLinearVelocity(IntPtr handle);//btVector3 + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_BtCollisionObject_getInterpolationWorldTransform(IntPtr handle);//btTransform + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern int BulletAPI_BtCollisionObject_getIslandTag(IntPtr handle); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern float BulletAPI_BtCollisionObject_getRestitution(IntPtr handle); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_BtCollisionObject_getRootCollisionShape(IntPtr handle); //btCollisionShape + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_BtCollisionObject_getUserPointer(IntPtr handle); // pointer + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_BtCollisionObject_getWorldTransform(IntPtr handle); //btTransform + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern bool BulletAPI_BtCollisionObject_hasAnisotropicFriction(IntPtr handle); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern bool BulletAPI_BtCollisionObject_hasContactResponse(IntPtr handle); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern bool BulletAPI_BtCollisionObject_isActive(IntPtr handle); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern bool BulletAPI_BtCollisionObject_isKinematicObject(IntPtr handle); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern bool BulletAPI_BtCollisionObject_isStaticObject(IntPtr handle); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern bool BulletAPI_BtCollisionObject_isStaticOrKinematicObject(IntPtr handle); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern bool BulletAPI_BtCollisionObject_mergesSimulationIslands(IntPtr handle); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtCollisionObject_setActivationState(IntPtr handle, int newState); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtCollisionObject_setAnisotropicFriction(IntPtr handle, IntPtr anisotropicFriction); // anisotropicFriction btVector3 + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtCollisionObject_setBroadphaseHandle(IntPtr handle, IntPtr bphandle); //btBroadphaseProxy + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtCollisionObject_setCcdMotionThreshold(IntPtr handle, float ccdMotionThreshold); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtCollisionObject_setCcdSweptSphereRadius(IntPtr handle, float radius); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtCollisionObject_setCollisionFlags(IntPtr handle, int flags); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtCollisionObject_setCollisionShape(IntPtr handle, IntPtr collisionShape); // btCollisionShape + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtCollisionObject_setCompanionId(IntPtr handle, int id); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtCollisionObject_setContactProcessingThreshold(IntPtr handle, float contactProcessingThreshold); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtCollisionObject_setDeactivationTime(IntPtr handle, float time); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtCollisionObject_setFriction(IntPtr handle, float frict); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtCollisionObject_setHitFraction(IntPtr handle, float hitFraction); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtCollisionObject_setInterpolationAngularVelocity(IntPtr handle, IntPtr angvel); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtCollisionObject_setInterpolationLinearVelocity(IntPtr handle, IntPtr linvel); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtCollisionObject_setInterpolationWorldTransform(IntPtr handle, IntPtr trans); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtCollisionObject_setIslandTag(IntPtr handle, int tag); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtCollisionObject_setRestitution(IntPtr handle, float rest); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtCollisionObject_setUserPointer(IntPtr handle, IntPtr userPointer); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtCollisionObject_setWorldTransform(IntPtr handle, IntPtr worldTrans); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtCollisionObject_delete(IntPtr handle); + #endregion + + #region IDisposable Members + + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + #endregion + + protected virtual void Dispose(bool disposing) + { + // Check to see if Dispose has already been called. + if (!m_disposed) + { + // If disposing equals true, dispose all managed + // and unmanaged resources. + if (disposing) + { + // Dispose managed resources. + // none yet + } + // Release unmanaged resources. If disposing is false, + // only the following code is executed. + BulletAPI_BtCollisionObject_delete(m_handle); + m_handle = IntPtr.Zero; + // Note that this is not thread safe. + // Another thread could start disposing the object + // after the managed resources are disposed, + // but before the disposed flag is set to true. + // If thread safety is necessary, it must be + // implemented by the client. + + } + m_disposed = true; + } + + ~btCollisionObject() + { + // Do not re-create Dispose clean-up code here. + // Calling Dispose(false) is optimal in terms of + // readability and maintainability. + Dispose(false); + } + } +} diff --git a/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/btCollisionShape.cs b/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/btCollisionShape.cs new file mode 100644 index 00000000..2a7f3456 --- /dev/null +++ b/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/btCollisionShape.cs @@ -0,0 +1,236 @@ +using System; +using System.Runtime.InteropServices; +using System.Security; + +namespace BulletDotNET +{ + public class btCollisionShape : IDisposable + { + protected IntPtr m_handle = IntPtr.Zero; + + protected bool m_disposed = false; + + public static btCollisionShape FromIntPtr(IntPtr handle) + { + return (btCollisionShape)Native.GetObject(handle, + typeof(btCollisionShape)); + } + + public IntPtr Handle + { + get { return m_handle; } + } + + public btCollisionShape(IntPtr handle) + { + m_handle = handle; + } + + public btCollisionShape() + { + m_handle = BulletAPI_CreateBtCollisionShape(); + } + + public void calculateLocalInertia(float mass, btVector3 inertia) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + BulletAPI_BtCollisionShape_calculateLocalInertia(m_handle, mass, inertia.Handle); + } + + public float getAngularMotionDisk() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return BulletAPI_BtCollisionShape_getAngularMotionDisk(m_handle); + } + + public btVector3 getLocalScaling() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + return btVector3.FromIntPtr(BulletAPI_BtCollisionShape_getLocalScaling(m_handle)); + } + + public float getContactBreakingThreshold() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return BulletAPI_BtCollisionShape_getContactBreakingThreshold(m_handle); + } + + public float getMargin() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return BulletAPI_BtCollisionShape_getMargin(m_handle); + } + + public int getShapeType() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return BulletAPI_BtCollisionShape_getShapeType(m_handle); + } + + public IntPtr getUserPointer() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return BulletAPI_BtCollisionShape_getUserPointer(m_handle); + } + + public bool isCompound() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return BulletAPI_BtCollisionShape_isCompound(m_handle); + } + + public bool isConcave() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return BulletAPI_BtCollisionShape_isConcave(m_handle); + } + + public bool isConvex() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return BulletAPI_BtCollisionShape_isConvex(m_handle); + } + + public bool isInfinite() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return BulletAPI_BtCollisionShape_isInfinite(m_handle); + } + + public bool isPolyhedral() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return BulletAPI_BtCollisionShape_isPolyhedral(m_handle); + } + + public void setLocalScaling(btVector3 scaling) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + BulletAPI_BtCollisionShape_setLocalScaling(m_handle, scaling.Handle); + } + + public void setMargin(float scaling) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + BulletAPI_BtCollisionShape_setMargin(m_handle, scaling); + } + + public void setUserPointer(IntPtr ptr) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + BulletAPI_BtCollisionShape_setUserPointer(m_handle, ptr); + } + + #region Native Invokes + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_CreateBtCollisionShape(); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtCollisionShape_calculateLocalInertia(IntPtr handle, float mass, IntPtr inertia); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern float BulletAPI_BtCollisionShape_getAngularMotionDisk(IntPtr handle); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_BtCollisionShape_getLocalScaling(IntPtr handle); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern float BulletAPI_BtCollisionShape_getContactBreakingThreshold(IntPtr handle); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern float BulletAPI_BtCollisionShape_getMargin(IntPtr handle); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern int BulletAPI_BtCollisionShape_getShapeType(IntPtr handle); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_BtCollisionShape_getUserPointer(IntPtr handle); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern bool BulletAPI_BtCollisionShape_isCompound(IntPtr handle); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern bool BulletAPI_BtCollisionShape_isConcave(IntPtr handle); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern bool BulletAPI_BtCollisionShape_isConvex(IntPtr handle); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern bool BulletAPI_BtCollisionShape_isInfinite(IntPtr handle); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern bool BulletAPI_BtCollisionShape_isPolyhedral(IntPtr handle); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtCollisionShape_setLocalScaling(IntPtr handle, IntPtr scaling); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtCollisionShape_setMargin(IntPtr handle, float margin); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtCollisionShape_setUserPointer(IntPtr handle, IntPtr ptr); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtCollisionShape_delete(IntPtr obj); + + #endregion + + #region IDisposable Members + + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + #endregion + + protected virtual void Dispose(bool disposing) + { + // Check to see if Dispose has already been called. + if (!m_disposed) + { + // If disposing equals true, dispose all managed + // and unmanaged resources. + if (disposing) + { + // If we deliberately called Dispose, then call the virtual dispose + // If a derived class was disposed, then let it handle the unmanaged memory + BulletAPI_BtCollisionShape_delete(m_handle); + } + // Release unmanaged resources. If disposing is false, + // only the following code is executed. + // + m_handle = IntPtr.Zero; + // Note that this is not thread safe. + // Another thread could start disposing the object + // after the managed resources are disposed, + // but before the disposed flag is set to true. + // If thread safety is necessary, it must be + // implemented by the client. + + } + m_disposed = true; + } + + ~btCollisionShape() + { + // Do not re-create Dispose clean-up code here. + // Calling Dispose(false) is optimal in terms of + // readability and maintainability. + Dispose(false); + } + } +} diff --git a/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/btDefaultCollisionConfiguration.cs b/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/btDefaultCollisionConfiguration.cs new file mode 100644 index 00000000..493ff6bd --- /dev/null +++ b/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/btDefaultCollisionConfiguration.cs @@ -0,0 +1,86 @@ +using System; +using System.Runtime.InteropServices; +using System.Security; + +namespace BulletDotNET +{ + public class btDefaultCollisionConfiguration : btCollisionConfiguration, IDisposable + { + private IntPtr m_handle = IntPtr.Zero; + + private bool m_disposed = false; + + protected static btDefaultCollisionConfiguration FromIntPtr(IntPtr handle) + { + return (btDefaultCollisionConfiguration)Native.GetObject(handle, typeof(btDefaultCollisionConfiguration)); + } + + public new IntPtr Handle + { + get { return m_handle; } + } + + public btDefaultCollisionConfiguration(IntPtr handle) : base(handle) + { + m_handle = handle; + } + + public btDefaultCollisionConfiguration() + { + m_handle = BulletAPI_CreateBtDefaultCollisionConfiguration(); + base.Handle = m_handle; + } + + #region Native Invokes + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_CreateBtDefaultCollisionConfiguration(); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtDefaultCollisionConfiguration_delete(IntPtr ax); + #endregion + + #region IDisposable Members + + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + #endregion + + protected virtual void Dispose(bool disposing) + { + // Check to see if Dispose has already been called. + if (!m_disposed) + { + // If disposing equals true, dispose all managed + // and unmanaged resources. + if (disposing) + { + // Dispose managed resources. + // none yet + } + // Release unmanaged resources. If disposing is false, + // only the following code is executed. + BulletAPI_BtDefaultCollisionConfiguration_delete(m_handle); + m_handle = IntPtr.Zero; + // Note that this is not thread safe. + // Another thread could start disposing the object + // after the managed resources are disposed, + // but before the disposed flag is set to true. + // If thread safety is necessary, it must be + // implemented by the client. + + } + m_disposed = true; + } + + ~btDefaultCollisionConfiguration() + { + // Do not re-create Dispose clean-up code here. + // Calling Dispose(false) is optimal in terms of + // readability and maintainability. + Dispose(false); + } + } +} diff --git a/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/btDispatcher.cs b/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/btDispatcher.cs new file mode 100644 index 00000000..0670e983 --- /dev/null +++ b/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/btDispatcher.cs @@ -0,0 +1,24 @@ +using System; + +namespace BulletDotNET +{ + public class btDispatcher + { + private IntPtr m_handle; + + public IntPtr Handle + { + get { return m_handle; } + set { m_handle = value; } + } + + public btDispatcher(IntPtr handle) + { + m_handle = handle; + } + public btDispatcher() + { + m_handle = IntPtr.Zero; + } + } +} diff --git a/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/btGhostObject.cs b/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/btGhostObject.cs new file mode 100644 index 00000000..4f4b19fb --- /dev/null +++ b/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/btGhostObject.cs @@ -0,0 +1,88 @@ +using System; +using System.Runtime.InteropServices; +using System.Security; +namespace BulletDotNET +{ + public class btGhostObject : btCollisionObject, IDisposable + { + public static new btGhostObject FromIntPtr(IntPtr handle) + { + return (btGhostObject)Native.GetObject(handle, typeof(btGhostObject)); + } + + public btGhostObject(IntPtr handle) + : base(handle) + { + + } + + public btGhostObject() : base() + { + if (!(this is btPairCachingGhostObject)) + { + m_handle = BulletAPI_CreateBtGhostObject(); + } + } + + + #region Native Invokes + + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_CreateBtGhostObject(); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern int BulletAPI_BtGhostObject_getNumOverlappingObjects(IntPtr handle); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_BtGhostObject_getHalfHeight(IntPtr handle, int index); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtGhostObject_delete(IntPtr handle); + + #endregion + + #region IDisposable Members + + public new void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + #endregion + + protected virtual new void Dispose(bool disposing) + { + // Check to see if Dispose has already been called. + if (!m_disposed) + { + // If disposing equals true, dispose all managed + // and unmanaged resources. + if (disposing) + { + // Dispose managed resources. + // none yet + base.Dispose(false); + + } + // Release unmanaged resources. If disposing is false, + // only the following code is executed. + //BulletAPI_BtRigidBody_delete(m_handle); + //m_handle = IntPtr.Zero; + // Note that this is not thread safe. + // Another thread could start disposing the object + // after the managed resources are disposed, + // but before the disposed flag is set to true. + // If thread safety is necessary, it must be + // implemented by the client. + + } + m_disposed = true; + } + + ~btGhostObject() + { + // Do not re-create Dispose clean-up code here. + // Calling Dispose(false) is optimal in terms of + // readability and maintainability. + Dispose(false); + } + } +} diff --git a/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/btHeightfieldTerrainShape.cs b/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/btHeightfieldTerrainShape.cs new file mode 100644 index 00000000..171d7968 --- /dev/null +++ b/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/btHeightfieldTerrainShape.cs @@ -0,0 +1,111 @@ +using System; +using System.Runtime.InteropServices; +using System.Security; + +namespace BulletDotNET +{ + public class btHeightfieldTerrainShape : btCollisionShape, IDisposable + { + public enum UPAxis : int + { + X = 0, + Y = 1, + Z = 2 + } + public enum PHY_ScalarType : int + { + PHY_FLOAT = 0, + PHY_DOUBLE = 1, + PHY_INTEGER = 2, + PHY_SHORT = 3, + PHY_FIXEDPOINT88 = 4, + PHY_UCHAR = 5 + } + + public static new btHeightfieldTerrainShape FromIntPtr(IntPtr handle) + { + return (btHeightfieldTerrainShape)Native.GetObject(handle, typeof(btHeightfieldTerrainShape)); + } + + public btHeightfieldTerrainShape(IntPtr handle) : base(handle) + { + + } + + public btHeightfieldTerrainShape(int heightStickWidth, int heightStickLength, float[] heightfieldData, float heightScale, float minHeight, float maxHeight, int upAxis, int heightDataType, bool flipQuadEdges) + : base() + { + m_handle = BulletAPI_CreateBtHeightfieldTerrainShape(heightStickWidth, heightStickLength, heightfieldData, heightScale, minHeight, maxHeight, upAxis, heightDataType, flipQuadEdges); + } + + public btVector3 getLocalScaling() + { + return btVector3.FromIntPtr(BulletAPI_BtHeightFieldTerrainShape_getLocalScaling(m_handle)); + } + + public void setLocalScaling(btVector3 scaling) + { + BulletAPI_BtHeightFieldTerrainShape_setLocalScaling(m_handle, scaling.Handle); + } + + #region Native Invokes + + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_CreateBtHeightfieldTerrainShape (int heightStickWidth, int heightStickLength, [MarshalAs(UnmanagedType.LPArray)] float[] heightfieldData, float heightScale, float minHeight, float maxHeight,int upAxis, int heightDataType, bool flipQuadEdges); + + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_BtHeightFieldTerrainShape_getLocalScaling(IntPtr handle); // btVector3 + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtHeightFieldTerrainShape_setLocalScaling(IntPtr handle, IntPtr scaling);//btVector3 + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtHeightFieldTerrainShape_delete(IntPtr handle); + + #endregion + + + #region IDisposable Members + + public new void Dispose() + { + Dispose(true); + } + + #endregion + + protected virtual new void Dispose(bool disposing) + { + // Check to see if Dispose has already been called. + if (!m_disposed) + { + // If disposing equals true, dispose all managed + // and unmanaged resources. + if (disposing) + { + // Dispose managed resources. + base.Dispose(); + + } + // Release unmanaged resources. If disposing is false, + // only the following code is executed. + //BulletAPI_BtRigidBody_delete(m_handle); + //m_handle = IntPtr.Zero; + // Note that this is not thread safe. + // Another thread could start disposing the object + // after the managed resources are disposed, + // but before the disposed flag is set to true. + // If thread safety is necessary, it must be + // implemented by the client. + + } + m_disposed = true; + } + + ~btHeightfieldTerrainShape() + { + // Do not re-create Dispose clean-up code here. + // Calling Dispose(false) is optimal in terms of + // readability and maintainability. + Dispose(false); + } + } +} diff --git a/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/btPairCachingGhostObject.cs b/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/btPairCachingGhostObject.cs new file mode 100644 index 00000000..5eb8a8c3 --- /dev/null +++ b/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/btPairCachingGhostObject.cs @@ -0,0 +1,81 @@ +using System; +using System.Runtime.InteropServices; +using System.Security; +namespace BulletDotNET +{ + public class btPairCachingGhostObject : btGhostObject + { + public static new btPairCachingGhostObject FromIntPtr(IntPtr handle) + { + return (btPairCachingGhostObject)Native.GetObject(handle, typeof(btPairCachingGhostObject)); + } + + public btPairCachingGhostObject(IntPtr handle) + : base(handle) + { + + } + + public btPairCachingGhostObject() + : base() + { + m_handle = BulletAPI_CreateBtPairCachingGhostObject(); + } + + + #region Native Invokes + + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_CreateBtPairCachingGhostObject(); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtPairCachingGhostObject_delete(IntPtr handle); + + #endregion + + #region IDisposable Members + + public new void Dispose() + { + Dispose(true); + } + + #endregion + + protected virtual new void Dispose(bool disposing) + { + // Check to see if Dispose has already been called. + if (!m_disposed) + { + // If disposing equals true, dispose all managed + // and unmanaged resources. + if (disposing) + { + // Dispose managed resources. + // none yet + base.Dispose(); + + } + // Release unmanaged resources. If disposing is false, + // only the following code is executed. + //BulletAPI_BtRigidBody_delete(m_handle); + //m_handle = IntPtr.Zero; + // Note that this is not thread safe. + // Another thread could start disposing the object + // after the managed resources are disposed, + // but before the disposed flag is set to true. + // If thread safety is necessary, it must be + // implemented by the client. + + } + m_disposed = true; + } + + ~btPairCachingGhostObject() + { + // Do not re-create Dispose clean-up code here. + // Calling Dispose(false) is optimal in terms of + // readability and maintainability. + Dispose(false); + } + } +} diff --git a/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/btRayResultCallback.cs b/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/btRayResultCallback.cs new file mode 100644 index 00000000..a18d6078 --- /dev/null +++ b/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletCollision/btRayResultCallback.cs @@ -0,0 +1,15 @@ +using System; + +namespace BulletDotNET +{ + public class btRayResultCallback + { + protected IntPtr m_handle; + protected bool m_disposed; + + public IntPtr Handle + { + get { return m_handle; } + } + } +} diff --git a/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletDynamics/btCollisionWorld.cs b/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletDynamics/btCollisionWorld.cs new file mode 100644 index 00000000..a94ab1ff --- /dev/null +++ b/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletDynamics/btCollisionWorld.cs @@ -0,0 +1,92 @@ +using System; +using System.Runtime.InteropServices; +using System.Security; + +namespace BulletDotNET +{ + public class btCollisionWorld + { + protected IntPtr m_handle = IntPtr.Zero; + protected bool m_disposed = false; + + public btCollisionWorld() + { + + } + + public btCollisionWorld(IntPtr handle) + { + m_handle = handle; + } + + public void addCollisionObject(btCollisionObject collisionObject, int collisionFilterGroup, int collisionFilterMask) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + BulletAPI_btCollisionWorld_addCollisionObject(m_handle, collisionObject.Handle, collisionFilterGroup, + collisionFilterMask); + } + + public btBroadphaseInterface getBroadPhase() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return btAxisSweep3.FromIntPtr(BulletAPI_btCollisionWorld_getBroadphase(m_handle)); + } + + public btDispatcher getDispatcher() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return btCollisionDispatcher.FromIntPtr(m_handle); + } + + public int getNumCollisionObjects() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return BulletAPI_btCollisionWorld_getNumCollisionObjects(m_handle); + } + + public void rayTest(btVector3 rayFromWorld, btVector3 rayToWorld, btRayResultCallback resultCallback) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + BulletAPI_btCollisionWorld_rayTest(m_handle, rayFromWorld.Handle, rayToWorld.Handle, resultCallback.Handle); + } + + public void removeCollisionObject(btCollisionObject obj) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + BulletAPI_btCollisionWorld_removeCollisionObject(m_handle, obj.Handle); + + } + + #region NativeInvokes + + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_btCollisionWorld_addCollisionObject(IntPtr handle, IntPtr collisionObject, int collisionFilterGroup, int collisionFilterMask); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_btCollisionWorld_getBroadphase(IntPtr handle); //btBroadphaseInterface* + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_btCollisionWorld_getPairCache(IntPtr handle); //btOverlappingPairCache* + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_btCollisionWorld_getDispatcher(IntPtr handle); //btDispatcher* + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern int BulletAPI_btCollisionWorld_getNumCollisionObjects(IntPtr handle); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_btCollisionWorld_rayTest(IntPtr handle, IntPtr rayFromWorld, IntPtr rayToWorld, IntPtr resultCallback); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_btCollisionWorld_removeCollisionObject(IntPtr handle, IntPtr collisionObject); + + #endregion + + } +} diff --git a/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletDynamics/btConstraintInfo2.cs b/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletDynamics/btConstraintInfo2.cs new file mode 100644 index 00000000..9f9b28d3 --- /dev/null +++ b/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletDynamics/btConstraintInfo2.cs @@ -0,0 +1,97 @@ +using System; +using System.Collections.Generic; +using System.Runtime.InteropServices; +using System.Security; +using System.Text; + +namespace BulletDotNET +{ + public class btConstraintInfo2 : IDisposable + { + protected IntPtr m_handle = IntPtr.Zero; + + protected bool m_disposed = false; + + public static btConstraintInfo2 FromIntPtr(IntPtr handle) + { + return (btConstraintInfo2)Native.GetObject(handle, + typeof(btConstraintInfo2)); + } + + public IntPtr Handle + { + get { return m_handle; } + } + + public btConstraintInfo2(IntPtr handle) + { + m_handle = handle; + } + + public btConstraintInfo2(float fps, float erp, + float m_J1linearAxis,float m_J1angularAxis,float m_J2linearAxis,float m_J2angularAxis, + int rowskip, float constraintError, float cfm, float lowerLimit, float upperLimit, float index) + { + m_handle = BulletAPI_BtTypedConstraint_CreateBtConstraintInfo2(fps, erp, m_J1linearAxis, m_J1angularAxis, + m_J2linearAxis, m_J2angularAxis, rowskip, + constraintError, cfm, lowerLimit, + upperLimit, index); + } + + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_BtTypedConstraint_CreateBtConstraintInfo2(float fps, float erp, + float m_J1linearAxis,float m_J1angularAxis,float m_J2linearAxis,float m_J2angularAxis, + int rowskip, float constraintError, float cfm, float lowerLimit, float upperLimit, float index); + + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtTypedConstraint_BtConstraintInfo2_delete(IntPtr handle); + + + #region IDisposable Members + + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + #endregion + + protected virtual new void Dispose(bool disposing) + { + // Check to see if Dispose has already been called. + if (!m_disposed) + { + // If disposing equals true, dispose all managed + // and unmanaged resources. + if (disposing) + { + // Dispose managed resources. + // none yet + + + } + // Release unmanaged resources. If disposing is false, + // only the following code is executed. + BulletAPI_BtTypedConstraint_BtConstraintInfo2_delete(m_handle); + m_handle = IntPtr.Zero; + // Note that this is not thread safe. + // Another thread could start disposing the object + // after the managed resources are disposed, + // but before the disposed flag is set to true. + // If thread safety is necessary, it must be + // implemented by the client. + + } + m_disposed = true; + } + + ~btConstraintInfo2() + { + // Do not re-create Dispose clean-up code here. + // Calling Dispose(false) is optimal in terms of + // readability and maintainability. + Dispose(false); + } + } +} diff --git a/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletDynamics/btConstraintSolver.cs b/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletDynamics/btConstraintSolver.cs new file mode 100644 index 00000000..8b98d41f --- /dev/null +++ b/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletDynamics/btConstraintSolver.cs @@ -0,0 +1,25 @@ +using System; + + +namespace BulletDotNET +{ + public class btConstraintSolver + { + private IntPtr m_handle; + + public IntPtr Handle + { + get { return m_handle; } + set { m_handle = value; } + } + + public btConstraintSolver(IntPtr handle) + { + m_handle = handle; + } + public btConstraintSolver() + { + m_handle = IntPtr.Zero; + } + } +} diff --git a/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletDynamics/btDefaultMotionState.cs b/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletDynamics/btDefaultMotionState.cs new file mode 100644 index 00000000..0b8073d9 --- /dev/null +++ b/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletDynamics/btDefaultMotionState.cs @@ -0,0 +1,114 @@ +using System; +using System.Runtime.InteropServices; +using System.Security; + +namespace BulletDotNET +{ + public class btDefaultMotionState : btMotionState, IDisposable + { + + public static new btDefaultMotionState FromIntPtr(IntPtr handle) + { + return (btDefaultMotionState)Native.GetObject(handle, typeof(btDefaultMotionState)); + } + + + public btDefaultMotionState(IntPtr handle) : base(handle) + { + m_handle = handle; + } + + public btDefaultMotionState(): base() + { + m_handle = BulletAPI_CreateBtDefaultMotionState(); + } + + public btDefaultMotionState(btTransform startTrans) : base() + { + m_handle = BulletAPI_CreateBtDefaultMotionStateStartTrans(startTrans.Handle); + } + + public btDefaultMotionState(btTransform startTrans, btTransform centerOfMassOffset) + { + m_handle = BulletAPI_CreateBtDefaultMotionStateStartTransCenterOfMassOffset(startTrans.Handle, centerOfMassOffset.Handle); + } + + public void getWorldTransform(out btTransform result) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + result = btTransform.getIdentity(); + BulletAPI_BtDefaultMotionState_getWorldTransform(m_handle, result.Handle); + } + + public void setWorldTransform(btTransform t) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + BulletAPI_BtDefaultMotionState_setWorldTransform(m_handle, t.Handle); + } + + #region Native Invokes + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_CreateBtDefaultMotionState(); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_CreateBtDefaultMotionStateStartTrans(IntPtr startTrans); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_CreateBtDefaultMotionStateStartTransCenterOfMassOffset(IntPtr startTrans, + IntPtr + centerOfMassOffset); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtDefaultMotionState_getWorldTransform(IntPtr handle, IntPtr centerOfMassWorldTrans ); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtDefaultMotionState_setWorldTransform(IntPtr handle, IntPtr t ); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtDefaultMotionState_delete(IntPtr obj); + + #endregion + + #region IDisposable Members + + public new void Dispose() + { + Dispose(true); + } + + #endregion + + protected virtual new void Dispose(bool disposing) + { + // Check to see if Dispose has already been called. + if (!m_disposed) + { + // If disposing equals true, dispose all managed + // and unmanaged resources. + if (disposing) + { + // Dispose managed resources. + // none yet + base.Dispose(); + } + // Release unmanaged resources. If disposing is false, + // only the following code is executed. + m_handle = IntPtr.Zero; + // Note that this is not thread safe. + // Another thread could start disposing the object + // after the managed resources are disposed, + // but before the disposed flag is set to true. + // If thread safety is necessary, it must be + // implemented by the client. + + } + m_disposed = true; + } + + ~btDefaultMotionState() + { + // Do not re-create Dispose clean-up code here. + // Calling Dispose(false) is optimal in terms of + // readability and maintainability. + Dispose(false); + } + } +} diff --git a/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletDynamics/btDiscreteDynamicsWorld.cs b/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletDynamics/btDiscreteDynamicsWorld.cs new file mode 100644 index 00000000..98511257 --- /dev/null +++ b/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletDynamics/btDiscreteDynamicsWorld.cs @@ -0,0 +1,143 @@ +using System; +using System.Runtime.InteropServices; +using System.Security; + +namespace BulletDotNET +{ + public class btDiscreteDynamicsWorld : btCollisionWorld, IDisposable + { + + + protected static btDiscreteDynamicsWorld FromIntPtr(IntPtr handle) + { + return (btDiscreteDynamicsWorld)Native.GetObject(handle, + typeof(btDiscreteDynamicsWorld)); + } + + public IntPtr Handle + { + get { return m_handle; } + } + + public btDiscreteDynamicsWorld(IntPtr handle) : base(handle) + { + + } + + public btDiscreteDynamicsWorld(btDispatcher dispatcher, btBroadphaseInterface broadphase, btConstraintSolver solver, btCollisionConfiguration collisionconfig) + { + m_handle = BulletAPI_CreateBtDynamicsWorld(dispatcher.Handle, broadphase.Handle, solver.Handle, collisionconfig.Handle); + } + + public void setGravity(btVector3 v) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + BulletAPI_BtDynamicsWorld_setGravity(m_handle,v.Handle); + } + + public int stepSimulation(float timeStep, int maxSubSteps, float fixedTimeStep) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return BulletAPI_BtDynamicsWorld_stepSimulation(m_handle, timeStep, maxSubSteps, fixedTimeStep); + } + + public void addRigidBody(btRigidBody body) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + BulletAPI_BtDynamicsWorld_addRigidBody(m_handle, body.Handle); + } + + public void removeRigidBody(btRigidBody body) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + BulletAPI_BtDynamicsWorld_removeRigidBody(m_handle, body.Handle); + } + + + public void removeConstraint(btTypedConstraint pconstraint) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + if (pconstraint.Handle == IntPtr.Zero) + throw new ObjectDisposedException(ToString()); + + BulletAPI_BtDynamicsWorld_removeConstraint(m_handle, pconstraint.Handle); + } + + + #region Native Invokes + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_CreateBtDynamicsWorld(IntPtr dispatcher, IntPtr broadphase, IntPtr solver, IntPtr collisionconfig); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_CreateBtDynamicsWorld_Specific(IntPtr dispatcher, IntPtr broadphase, IntPtr solver, IntPtr collisionconfig); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtDynamicsWorld_addRigidBody(IntPtr handle, IntPtr body); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtDynamicsWorld_removeRigidBody(IntPtr handle, IntPtr body); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtDynamicsWorld_setGravity(IntPtr dynamicsWorld, IntPtr v); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern int BulletAPI_BtDynamicsWorld_stepSimulation(IntPtr dynamicsWorld, float timeStep, int maxSubSteps, + float fixedTimeStep); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtDynamicsWorld_removeConstraint(IntPtr dynamicsWorld, IntPtr constraint); + + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtDynamicsWorld_delete(IntPtr obj); + #endregion + + #region IDisposable Members + + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + #endregion + + protected virtual void Dispose(bool disposing) + { + // Check to see if Dispose has already been called. + if (!m_disposed) + { + // If disposing equals true, dispose all managed + // and unmanaged resources. + if (disposing) + { + // Dispose managed resources. + // none yet + } + // Release unmanaged resources. If disposing is false, + // only the following code is executed. + BulletAPI_BtDynamicsWorld_delete(m_handle); + m_handle = IntPtr.Zero; + // Note that this is not thread safe. + // Another thread could start disposing the object + // after the managed resources are disposed, + // but before the disposed flag is set to true. + // If thread safety is necessary, it must be + // implemented by the client. + + } + m_disposed = true; + } + + ~btDiscreteDynamicsWorld() + { + // Do not re-create Dispose clean-up code here. + // Calling Dispose(false) is optimal in terms of + // readability and maintainability. + Dispose(false); + } + } +} diff --git a/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletDynamics/btGeneric6DofConstraint.cs b/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletDynamics/btGeneric6DofConstraint.cs new file mode 100644 index 00000000..ee3479ce --- /dev/null +++ b/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletDynamics/btGeneric6DofConstraint.cs @@ -0,0 +1,137 @@ +using System; +using System.Runtime.InteropServices; +using System.Security; + + +namespace BulletDotNET +{ + public class btGeneric6DofConstraint : btTypedConstraint, IDisposable + { + + public static new btGeneric6DofConstraint FromIntPtr(IntPtr handle) + { + return (btGeneric6DofConstraint)Native.GetObject(handle, typeof(btGeneric6DofConstraint)); + } + + public btGeneric6DofConstraint(IntPtr handle) + : base(handle) + { + + } + + public btGeneric6DofConstraint(btRigidBody rbA, btRigidBody rbB, btTransform frameInA, btTransform frameInB, bool useLinearReferenceFrameA) + : base() + { + m_handle = BulletAPI_CreateBtGeneric6DofConstraint(rbA.Handle, rbB.Handle, frameInA.Handle, frameInB.Handle, useLinearReferenceFrameA); + } + + public void setLinearUpperLimit(btVector3 linearUpper) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + BulletAPI_BtGeneric6DofConstraint_setLinearUpperLimit(m_handle, linearUpper.Handle); + } + public void setLinearLowerLimit(btVector3 linearLower) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + BulletAPI_BtGeneric6DofConstraint_setLinearLowerLimit(m_handle, linearLower.Handle); + } + + public void setAngularUpperLimit(btVector3 linearUpper) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + BulletAPI_BtGeneric6DofConstraint_setAngularUpperLimit(m_handle, linearUpper.Handle); + } + + public void setAngularLowerLimit(btVector3 linearLower) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + BulletAPI_BtGeneric6DofConstraint_setAngularLowerLimit(m_handle, linearLower.Handle); + } + + public void setLimits(int axis, float lo, float hi) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + BulletAPI_BtGeneric6DofConstraint_setLimits(m_handle, axis, lo, hi); + } + + public bool isLimted(int limitIndex) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return BulletAPI_BtGeneric6DofConstraint_isLimited(m_handle, limitIndex); + } + + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_CreateBtGeneric6DofConstraint(IntPtr rbA, IntPtr rbB, IntPtr frameInA, IntPtr frameInB, bool useLinearReferenceFrameA);//btRigidBody/btTranform + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtGeneric6DofConstraint_delete(IntPtr handle);//btVector3 + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtGeneric6DofConstraint_setLinearUpperLimit(IntPtr handle, IntPtr linearUpper);//btVector3 + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtGeneric6DofConstraint_setLinearLowerLimit(IntPtr handle, IntPtr linearLower);//btMotionState + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtGeneric6DofConstraint_setAngularUpperLimit(IntPtr handle, IntPtr angularUpper);//btbroadphaseProxy + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtGeneric6DofConstraint_setAngularLowerLimit(IntPtr handle, IntPtr angularLower); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern bool BulletAPI_BtGeneric6DofConstraint_isLimited(IntPtr handle, int limitIndex);//btVector3 + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtGeneric6DofConstraint_setLimits(IntPtr handle, int axis, float lo, float hi); + + #region IDisposable Members + + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + #endregion + + protected virtual void Dispose(bool disposing) + { + // Check to see if Dispose has already been called. + if (!m_disposed) + { + // If disposing equals true, dispose all managed + // and unmanaged resources. + if (disposing) + { + // Dispose managed resources. + // none yet + } + // Release unmanaged resources. If disposing is false, + // only the following code is executed. + BulletAPI_BtGeneric6DofConstraint_delete(m_handle); + m_handle = IntPtr.Zero; + // Note that this is not thread safe. + // Another thread could start disposing the object + // after the managed resources are disposed, + // but before the disposed flag is set to true. + // If thread safety is necessary, it must be + // implemented by the client. + + } + m_disposed = true; + } + + ~btGeneric6DofConstraint() + { + // Do not re-create Dispose clean-up code here. + // Calling Dispose(false) is optimal in terms of + // readability and maintainability. + Dispose(false); + } + } +} diff --git a/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletDynamics/btMotionState.cs b/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletDynamics/btMotionState.cs new file mode 100644 index 00000000..cf7cb9af --- /dev/null +++ b/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletDynamics/btMotionState.cs @@ -0,0 +1,91 @@ +using System; +using System.Runtime.InteropServices; +using System.Security; + + +namespace BulletDotNET +{ + public class btMotionState : IDisposable + { + protected IntPtr m_handle = IntPtr.Zero; + + protected bool m_disposed = false; + + public static btMotionState FromIntPtr(IntPtr handle) + { + return (btMotionState)Native.GetObject(handle, typeof(btMotionState)); + } + + public IntPtr Handle + { + get { return m_handle; } + } + + /// + /// Do not use!, for C++ Interop only! + /// + public btMotionState() + { + + } + + public btMotionState(IntPtr handle) + { + m_handle = handle; + } + #region Native Invokes + + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtMotionState_getWorldTransform(IntPtr handle, IntPtr centerOfMassWorldTrans); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtMotionState_setWorldTransform(IntPtr handle, IntPtr t); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtMotionState_delete(IntPtr obj); + #endregion + + #region IDisposable Members + + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + #endregion + + protected virtual void Dispose(bool disposing) + { + // Check to see if Dispose has already been called. + if (!m_disposed) + { + // If disposing equals true, dispose all managed + // and unmanaged resources. + if (disposing) + { + // Dispose managed resources. + // none yet + } + // Release unmanaged resources. If disposing is false, + // only the following code is executed. + BulletAPI_BtMotionState_delete(m_handle); + m_handle = IntPtr.Zero; + // Note that this is not thread safe. + // Another thread could start disposing the object + // after the managed resources are disposed, + // but before the disposed flag is set to true. + // If thread safety is necessary, it must be + // implemented by the client. + + } + m_disposed = true; + } + + ~btMotionState() + { + // Do not re-create Dispose clean-up code here. + // Calling Dispose(false) is optimal in terms of + // readability and maintainability. + Dispose(false); + } + } +} diff --git a/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletDynamics/btRigidBody.cs b/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletDynamics/btRigidBody.cs new file mode 100644 index 00000000..30562f8c --- /dev/null +++ b/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletDynamics/btRigidBody.cs @@ -0,0 +1,458 @@ +using System; +using System.Runtime.InteropServices; +using System.Security; + +namespace BulletDotNET +{ + public class btRigidBody : btCollisionObject + { + + protected btRigidBodyConstructionInfo m_constructionInfo; + + + + public static new btRigidBody FromIntPtr(IntPtr handle) + { + return (btRigidBody)Native.GetObject(handle, typeof(btRigidBody)); + } + + public btRigidBody(IntPtr handle) : base(handle) + { + + } + + public btRigidBody(btRigidBodyConstructionInfo constructionInfo) : base() + { + m_handle = BulletAPI_CreateBtRigidBody(constructionInfo.Handle); + m_constructionInfo = constructionInfo; + } + + public btRigidBody(float mass, btMotionState motionState, btCollisionShape collisionShape) + { + + m_constructionInfo = new btRigidBodyConstructionInfo(); + m_constructionInfo.m_collisionShape = collisionShape; + m_constructionInfo.m_localInertia = new btVector3(0, 0, 0); + m_constructionInfo.m_motionState = motionState; + m_constructionInfo.m_startWorldTransform = btTransform.getIdentity(); + m_constructionInfo.SetGenericDefaultValues(); + m_constructionInfo.m_mass = mass; + m_constructionInfo.commit(); + m_handle = BulletAPI_CreateBtRigidBody(m_constructionInfo.Handle); + } + + public btRigidBody(float mass, btMotionState motionState, btCollisionShape collisionShape, btVector3 localInertia) + { + + m_constructionInfo = new btRigidBodyConstructionInfo(); + m_constructionInfo.m_collisionShape = collisionShape; + m_constructionInfo.m_localInertia = localInertia; + m_constructionInfo.m_motionState = motionState; + m_constructionInfo.m_startWorldTransform = btTransform.getIdentity(); + m_constructionInfo.SetGenericDefaultValues(); + m_constructionInfo.m_mass = mass; + m_constructionInfo.commit(); + m_handle = BulletAPI_CreateBtRigidBody(m_constructionInfo.Handle); + } + + + public void applyCentralForce(btVector3 force) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + BulletAPI_BtRigidBody_applyCentralForce(m_handle, force.Handle); + } + + public void applyCentralImpulse(btVector3 force) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + BulletAPI_BtRigidBody_applyCentralImpulse(m_handle, force.Handle); + } + + public void applyForce(btVector3 force, btVector3 rel_pos) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + BulletAPI_BtRigidBody_applyForce(m_handle, force.Handle, rel_pos.Handle); + } + + public void applyImpulse(btVector3 force, btVector3 rel_pos) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + BulletAPI_BtRigidBody_applyImpulse(m_handle, force.Handle, rel_pos.Handle); + } + + public void applyTorque(btVector3 torque) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + BulletAPI_BtRigidBody_applyTorque(m_handle, torque.Handle); + } + + public void applyTorqueImpulse(btVector3 torque) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + BulletAPI_BtRigidBody_applyTorqueImpulse(m_handle, torque.Handle); + } + + public void clearForces() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + BulletAPI_BtRigidBody_clearForces(m_handle); + } + + public float computeAngularImpulseDenominator(btVector3 axis) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return BulletAPI_BtRigidBody_computeAngularImpulseDenominator(m_handle,axis.Handle); + } + + public float computeImpulseDenominator(btVector3 pos, btVector3 normal) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return BulletAPI_BtRigidBody_computeImpulseDenominator(m_handle, pos.Handle, normal.Handle); + } + + public float getAngularDamping() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return BulletAPI_BtRigidBody_getAngularDamping(m_handle); + } + + public btVector3 getAngularFactor() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return btVector3.FromIntPtr(BulletAPI_BtRigidBody_getAngularFactor(m_handle)); + } + + public float getAngularSleepingThreshold() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return BulletAPI_BtRigidBody_getAngularSleepingThreshold(m_handle); + } + + public btVector3 getCenterOfMassPosition() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return btVector3.FromIntPtr(BulletAPI_BtRigidBody_getCenterOfMassPosition(m_handle)); + } + + public btTransform getCenterOfMassTransform() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return btTransform.FromIntPtr(BulletAPI_BtRigidBody_getCenterOfMassTransform(m_handle)); + } + + public btTypedConstraint getConstraintRef(int index) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return btTypedConstraint.FromIntPtr(BulletAPI_BtRigidBody_getConstraintRef(m_handle, index)); + } + + public btVector3 getGravity() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return btVector3.FromIntPtr(BulletAPI_BtRigidBody_getGravity(m_handle)); + } + + public btVector3 getInvInertiaDiagLocal() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return btVector3.FromIntPtr(BulletAPI_BtRigidBody_getInvInertiaDiagLocal(m_handle)); + } + + public btMatrix3x3 getInvInertiaTensorWorld() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return btMatrix3x3.FromIntPtr(BulletAPI_BtRigidBody_getInvInertiaTensorWorld(m_handle)); + } + + public float getInvMass() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return BulletAPI_BtRigidBody_getInvMass(m_handle); + } + + public float getLinearDamping() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return BulletAPI_BtRigidBody_getLinearDamping(m_handle); + } + + public btMotionState getMotionState() + { + return btMotionState.FromIntPtr(BulletAPI_BtRigidBody_getMotionState(m_handle)); + } + + public int getNumConstraintRefs() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return BulletAPI_BtRigidBody_getNumConstraintRefs(m_handle); + } + + public btVector3 getTotalForce() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return btVector3.FromIntPtr(BulletAPI_BtRigidBody_getTotalForce(m_handle)); + } + + public btVector3 getVelocityInLocalPoint(btVector3 rel_pos) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return btVector3.FromIntPtr(BulletAPI_BtRigidBody_getVelocityInLocalPoint(m_handle,rel_pos.Handle)); + } + + public bool isInWorld() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return BulletAPI_BtRigidBody_isInWorld(m_handle); + } + + public void setAngularFactor(float angFac) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + BulletAPI_BtRigidBody_setAngularFactor(m_handle, angFac); + } + + public void setAngularVelocity(btVector3 ang_vel) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + BulletAPI_BtRigidBody_setAngularVelocity(m_handle, ang_vel.Handle); + } + + public void setInvInertiaDiagLocal(btVector3 diagInvInertia) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + BulletAPI_BtRigidBody_setInvInertiaDiagLocal(m_handle, diagInvInertia.Handle); + } + + public void setLinearVelocity(btVector3 lin_vel) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + BulletAPI_BtRigidBody_setLinearVelocity(m_handle, lin_vel.Handle); + } + + public void setMotionState(btMotionState motionState) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + BulletAPI_BtRigidBody_setMotionState(m_handle, motionState.Handle); + } + + public void setSleepingThresholds(float linear, float angular) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + BulletAPI_BtRigidBody_setSleepingThresholds(m_handle, linear, angular); + } + + public void translate(btVector3 v) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + BulletAPI_BtRigidBody_translate(m_handle, v.Handle); + } + + public void updateDeactivation(float timeStep) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + BulletAPI_BtRigidBody_updateDeactivation(m_handle, timeStep); + } + + #region Native Invokes + + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_CreateBtRigidBody(IntPtr constructionInfo); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_CreateBtRigidBodyParams(float mass, IntPtr motionState, IntPtr collisionShape, IntPtr localInertia); + [DllImport(Native.Dll),SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtRigidBody_applyCentralForce(IntPtr handle, IntPtr force);//btVector3 + [DllImport(Native.Dll),SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtRigidBody_applyCentralImpulse(IntPtr handle, IntPtr impulse);//btVector3 + [DllImport(Native.Dll),SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtRigidBody_applyForce(IntPtr handle, IntPtr force, IntPtr rel_pos);//btVector3 + [DllImport(Native.Dll),SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtRigidBody_applyImpulse(IntPtr handle, IntPtr impulse, IntPtr rel_pos);//btVector3 + [DllImport(Native.Dll),SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtRigidBody_applyTorque(IntPtr handle, IntPtr torque);//btVector3 + [DllImport(Native.Dll),SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtRigidBody_applyTorqueImpulse(IntPtr handle, IntPtr torque);//btVector3 + [DllImport(Native.Dll),SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtRigidBody_clearForces(IntPtr handle); + [DllImport(Native.Dll),SuppressUnmanagedCodeSecurity] + static extern float BulletAPI_BtRigidBody_computeAngularImpulseDenominator(IntPtr handle, IntPtr axis);//btVector3 + [DllImport(Native.Dll),SuppressUnmanagedCodeSecurity] + static extern float BulletAPI_BtRigidBody_computeImpulseDenominator(IntPtr handle, IntPtr pos, IntPtr normal);//btVector3 + [DllImport(Native.Dll),SuppressUnmanagedCodeSecurity] + static extern float BulletAPI_BtRigidBody_getAngularDamping(IntPtr handle); + [DllImport(Native.Dll),SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_BtRigidBody_getAngularFactor(IntPtr handle); //btVector3 + [DllImport(Native.Dll),SuppressUnmanagedCodeSecurity] + static extern float BulletAPI_BtRigidBody_getAngularSleepingThreshold(IntPtr handle); + [DllImport(Native.Dll),SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_BtRigidBody_getAngularVelocity(IntPtr handle); //btVector3 + [DllImport(Native.Dll),SuppressUnmanagedCodeSecurity] + static extern float BulletAPI_BtRigidBody_getLinearSleepingThreshold(IntPtr handle); + [DllImport(Native.Dll),SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_BtRigidBody_getCenterOfMassPosition(IntPtr handle); //btVector3 + [DllImport(Native.Dll),SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_BtRigidBody_getCenterOfMassTransform(IntPtr handle); //btTransform + [DllImport(Native.Dll),SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_BtRigidBody_getConstraintRef(IntPtr handle, int index); //btTypedConstraint + [DllImport(Native.Dll),SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_BtRigidBody_getGravity(IntPtr handle); //btVector3 + [DllImport(Native.Dll),SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_BtRigidBody_getInvInertiaDiagLocal(IntPtr handle); //btVector3 + [DllImport(Native.Dll),SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_BtRigidBody_getInvInertiaTensorWorld(IntPtr handle); //btMatrix3x3 + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern float BulletAPI_BtRigidBody_getInvMass(IntPtr handle); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern float BulletAPI_BtRigidBody_getLinearDamping(IntPtr handle); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_BtRigidBody_getLinearVelocity(IntPtr handle);//btVector3 + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_BtRigidBody_getMotionState(IntPtr handle);//btMotionState + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern int BulletAPI_BtRigidBody_getNumConstraintRefs(IntPtr handle); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_BtRigidBody_getTotalForce(IntPtr handle);//btVector3 + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_BtRigidBody_getTotalTorque(IntPtr handle);//btVector3 + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_BtRigidBody_getVelocityInLocalPoint(IntPtr handle, IntPtr rel_pos);//btVector3 + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern bool BulletAPI_BtRigidBody_isInWorld(IntPtr handle); + [DllImport(Native.Dll),SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtRigidBody_setAngularFactor(IntPtr handle, float angFac); + [DllImport(Native.Dll),SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtRigidBody_setAngularVelocity(IntPtr handle, IntPtr ang_vel);//btVector3 + [DllImport(Native.Dll),SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtRigidBody_setInvInertiaDiagLocal(IntPtr handle, IntPtr diagInvInertia);//btVector3 + [DllImport(Native.Dll),SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtRigidBody_setLinearVelocity(IntPtr handle, IntPtr lin_vel);//btVector3 + [DllImport(Native.Dll),SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtRigidBody_setMotionState(IntPtr handle, IntPtr motionState);//btMotionState + [DllImport(Native.Dll),SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtRigidBody_setNewBroadphaseProxy(IntPtr handle, IntPtr broadphaseProxy);//btbroadphaseProxy + [DllImport(Native.Dll),SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtRigidBody_setSleepingThresholds(IntPtr handle, float linear, float angular); + [DllImport(Native.Dll),SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtRigidBody_translate(IntPtr handle, IntPtr v);//btVector3 + [DllImport(Native.Dll),SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtRigidBody_updateDeactivation(IntPtr handle, float timeStep); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtRigidBody_delete(IntPtr obj); + + #endregion + + #region IDisposable Members + + public new void Dispose() + { + Dispose(true); + } + + #endregion + + protected virtual new void Dispose(bool disposing) + { + // Check to see if Dispose has already been called. + if (!m_disposed) + { + // If disposing equals true, dispose all managed + // and unmanaged resources. + if (disposing) + { + // Dispose managed resources. + // none yet + + if (m_constructionInfo.Handle != IntPtr.Zero) + { + m_constructionInfo.Dispose(); + } + base.Dispose(false); + + } + // Release unmanaged resources. If disposing is false, + // only the following code is executed. + BulletAPI_BtRigidBody_delete(m_handle); + m_handle = IntPtr.Zero; + // Note that this is not thread safe. + // Another thread could start disposing the object + // after the managed resources are disposed, + // but before the disposed flag is set to true. + // If thread safety is necessary, it must be + // implemented by the client. + + } + m_disposed = true; + } + + ~btRigidBody() + { + // Do not re-create Dispose clean-up code here. + // Calling Dispose(false) is optimal in terms of + // readability and maintainability. + Dispose(false); + } + } +} diff --git a/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletDynamics/btRigidBodyConstructionInfo.cs b/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletDynamics/btRigidBodyConstructionInfo.cs new file mode 100644 index 00000000..c3cc46bb --- /dev/null +++ b/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletDynamics/btRigidBodyConstructionInfo.cs @@ -0,0 +1,149 @@ +using System; +using System.Runtime.InteropServices; +using System.Security; + +namespace BulletDotNET +{ + + public class btRigidBodyConstructionInfo : IDisposable + { + public float m_mass; + + ///When a motionState is provided, the rigid body will initialize its world transform from the motion state + ///In this case, m_startWorldTransform is ignored. + public btMotionState m_motionState; + public btTransform m_startWorldTransform; + public btCollisionShape m_collisionShape; + public btVector3 m_localInertia; + public float m_linearDamping; + public float m_angularDamping; + + public float m_friction; + ///best simulation results when friction is non-zero + public float m_restitution; + public float m_linearSleepingThreshold; + public float m_angularSleepingThreshold; + + //Additional damping can help avoiding lowpass jitter motion, help stability for ragdolls etc. + //Such damping is undesirable, so once the overall simulation quality of the rigid body dynamics system has improved, this should become obsolete + public bool m_additionalDamping; + public float m_additionalDampingFactor; + public float m_additionalLinearDampingThresholdSqr; + public float m_additionalAngularDampingThresholdSqr; + public float m_additionalAngularDampingFactor; + + protected IntPtr m_handle = IntPtr.Zero; + + protected bool m_disposed = false; + + public static btMotionState FromIntPtr(IntPtr handle) + { + return (btMotionState)Native.GetObject(handle, typeof(btMotionState)); + } + + public IntPtr Handle + { + get { return m_handle; } + } + + public void commit() + { + + BulletAPI_BtRigidBodyConstructionInfo_Commit(m_handle, + m_mass, m_motionState.Handle, m_startWorldTransform.Handle, m_collisionShape.Handle, + m_localInertia.Handle, m_linearDamping, m_angularDamping, m_friction, + m_restitution, m_linearSleepingThreshold, m_angularSleepingThreshold, + m_additionalDamping, m_additionalDampingFactor, + m_additionalLinearDampingThresholdSqr, m_additionalAngularDampingThresholdSqr, + m_additionalAngularDampingFactor); + } + + public btRigidBodyConstructionInfo() + { + m_handle = BulletAPI_CreateBtRigidBodyConstructionInfo(); + } + + public void SetGenericDefaultValues() + { + m_linearDamping = 0; + m_angularDamping = 0; + m_friction = 0.5f; + m_restitution = 0; + m_linearSleepingThreshold = 0.8f; + m_angularSleepingThreshold = 1; + m_additionalDamping = false; + m_additionalDampingFactor = 0.005f; + m_additionalLinearDampingThresholdSqr = 0.01f; + m_additionalAngularDampingThresholdSqr = 0.01f; + m_additionalAngularDampingFactor = 0.01f; + } + + public btRigidBodyConstructionInfo(IntPtr handle) + { + m_handle = handle; + } + + #region Native Invokes + + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_CreateBtRigidBodyConstructionInfo(); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtRigidBodyConstructionInfo_Commit(IntPtr constructionInfoloc, + float mass, IntPtr motionState, IntPtr startWorldTransform, IntPtr collisionShape, + IntPtr localInertia, float linearDamping, float angularDamping, float friction, + float restitution, float linearSleepingThreshold, float angularSleepingThreshold, + bool additionalDamping, float additionalDampingFactor, + float additionalLinearDampingThresholdSqr, float additionalAngularDampingThresholdSqr, + float additionalAngularDampingFactor); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtRigidBodyConstructionInfo_delete(IntPtr obj); + + #endregion + + #region IDisposable Members + + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + #endregion + + protected virtual void Dispose(bool disposing) + { + // Check to see if Dispose has already been called. + if (!m_disposed) + { + // If disposing equals true, dispose all managed + // and unmanaged resources. + if (disposing) + { + // Dispose managed resources. + // none yet + } + // Release unmanaged resources. If disposing is false, + // only the following code is executed. + BulletAPI_BtRigidBodyConstructionInfo_delete(m_handle); + m_handle = IntPtr.Zero; + // Note that this is not thread safe. + // Another thread could start disposing the object + // after the managed resources are disposed, + // but before the disposed flag is set to true. + // If thread safety is necessary, it must be + // implemented by the client. + + } + m_disposed = true; + } + + ~btRigidBodyConstructionInfo() + { + // Do not re-create Dispose clean-up code here. + // Calling Dispose(false) is optimal in terms of + // readability and maintainability. + Dispose(false); + } + + } +} diff --git a/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletDynamics/btSequentialImpulseConstraintSolver.cs b/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletDynamics/btSequentialImpulseConstraintSolver.cs new file mode 100644 index 00000000..900e4d57 --- /dev/null +++ b/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletDynamics/btSequentialImpulseConstraintSolver.cs @@ -0,0 +1,87 @@ +using System; +using System.Runtime.InteropServices; +using System.Security; + +namespace BulletDotNET +{ + public class btSequentialImpulseConstraintSolver : btConstraintSolver, IDisposable + { + private IntPtr m_handle = IntPtr.Zero; + + private bool m_disposed = false; + + protected static btSequentialImpulseConstraintSolver FromIntPtr(IntPtr handle) + { + return (btSequentialImpulseConstraintSolver)Native.GetObject(handle, + typeof(btSequentialImpulseConstraintSolver)); + } + + public new IntPtr Handle + { + get { return m_handle; } + } + + public btSequentialImpulseConstraintSolver(IntPtr handle) : base(handle) + { + m_handle = handle; + } + + public btSequentialImpulseConstraintSolver() + { + m_handle = BulletAPI_CreateBtSequentialImpulseConstraintSolver(); + base.Handle = m_handle; + } + + #region Native Invokes + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_CreateBtSequentialImpulseConstraintSolver(); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtSequentialImpulseConstraintSolver_delete(IntPtr obj); + #endregion + + #region IDisposable Members + + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + #endregion + + protected virtual void Dispose(bool disposing) + { + // Check to see if Dispose has already been called. + if (!m_disposed) + { + // If disposing equals true, dispose all managed + // and unmanaged resources. + if (disposing) + { + // Dispose managed resources. + // none yet + } + // Release unmanaged resources. If disposing is false, + // only the following code is executed. + BulletAPI_BtSequentialImpulseConstraintSolver_delete(m_handle); + m_handle = IntPtr.Zero; + // Note that this is not thread safe. + // Another thread could start disposing the object + // after the managed resources are disposed, + // but before the disposed flag is set to true. + // If thread safety is necessary, it must be + // implemented by the client. + + } + m_disposed = true; + } + + ~btSequentialImpulseConstraintSolver() + { + // Do not re-create Dispose clean-up code here. + // Calling Dispose(false) is optimal in terms of + // readability and maintainability. + Dispose(false); + } + } +} diff --git a/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletDynamics/btTypedConstraint.cs b/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletDynamics/btTypedConstraint.cs new file mode 100644 index 00000000..e962d992 --- /dev/null +++ b/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletDynamics/btTypedConstraint.cs @@ -0,0 +1,46 @@ +using System; +using System.Runtime.InteropServices; +using System.Security; + +namespace BulletDotNET +{ + public class btTypedConstraint + { + protected IntPtr m_handle = IntPtr.Zero; + + protected bool m_disposed = false; + + public static btTypedConstraint FromIntPtr(IntPtr handle) + { + return (btTypedConstraint)Native.GetObject(handle, + typeof(btTypedConstraint)); + } + + public IntPtr Handle + { + get { return m_handle; } + } + + public btTypedConstraint(IntPtr handle) + { + m_handle = handle; + } + + /// + /// Don't use this! + /// purely for classes derived from this + /// + public btTypedConstraint() + { + + } + + public void getInfo2(ref btConstraintInfo2 b) + { + BulletAPI_BtTypedConstraint_getInfo2(m_handle, b.Handle); + } + + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtTypedConstraint_getInfo2(IntPtr handle, IntPtr b); + } +} diff --git a/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletMath/btMatrix3x3.cs b/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletMath/btMatrix3x3.cs new file mode 100644 index 00000000..8f5f2e3b --- /dev/null +++ b/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletMath/btMatrix3x3.cs @@ -0,0 +1,177 @@ +using System; +using System.Runtime.InteropServices; +using System.Security; +using System.Text; + +namespace BulletDotNET +{ + public class btMatrix3x3 : IDisposable + { + + private IntPtr m_handle = IntPtr.Zero; + + private bool m_disposed = false; + + public static btMatrix3x3 FromIntPtr(IntPtr handle) + { + return (btMatrix3x3)Native.GetObject(handle, + typeof(btMatrix3x3)); + } + + public IntPtr Handle + { + get { return m_handle; } + } + + public btMatrix3x3(IntPtr handle) + { + m_handle = handle; + } + + public btMatrix3x3() + { + m_handle = BulletAPI_CreateBtMatrix3x3(); + } + + public btMatrix3x3(btQuaternion q) + { + m_handle = BulletAPI_CreateBtMatrix3x3Quaternion(q.Handle); + } + + public btMatrix3x3(float xx, float xy, float xz, float yx, float yy, float yz, float zx, float zy, float zz) + { + m_handle = BulletAPI_CreateBtMatrix3x3Floats(xx, xy, xz, yx, yy, yz, zx, zy, zz); + } + + public btMatrix3x3 absolute() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return FromIntPtr(BulletAPI_BtMatrix3x3_absolute(m_handle)); + } + + public btMatrix3x3 adjoint() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return FromIntPtr(BulletAPI_BtMatrix3x3_adjoint(m_handle)); + } + + public btMatrix3x3 inverse() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return FromIntPtr(BulletAPI_BtMatrix3x3_inverse(m_handle)); + } + + public btMatrix3x3 determinant() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return FromIntPtr(BulletAPI_BtMatrix3x3_determinant(m_handle)); + } + + public btVector3 getColumn(int i) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return btVector3.FromIntPtr(BulletAPI_BtMatrix3x3_getColumn(m_handle, i)); + } + + public void getOpenGLSubMatrix(out float[] m) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + m = new float[12]; + BulletAPI_BtMatrix3x3_getOpenGLSubMatrix(m_handle, m); + } + + public void setRotation(btQuaternion q) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + BulletAPI_BtMatrix3x3_setRotation(m_handle, q.Handle); + } + + #region Native Invokes + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_CreateBtMatrix3x3(); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_CreateBtMatrix3x3Quaternion(IntPtr q); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_CreateBtMatrix3x3Floats(float xx, float xy, float xz, float yx, float yy, float yz, float zx, float zy, float zz); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_CreateBtMatrix3x3Other(IntPtr m); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_BtMatrix3x3_absolute(IntPtr handle); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_BtMatrix3x3_adjoint(IntPtr handle); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_BtMatrix3x3_inverse(IntPtr handle); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_BtMatrix3x3_determinant(IntPtr handle); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtMatrix3x3_diagonalize(IntPtr handle, IntPtr rot, float threshold, int maxSteps); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_BtMatrix3x3_getColumn(IntPtr handle,int i); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtMatrix3x3_getOpenGLSubMatrix(IntPtr handle, [MarshalAs(UnmanagedType.LPArray)]float[] f); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtMatrix3x3_setRotation(IntPtr handle, IntPtr q); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtMatrix3x3_delete(IntPtr obj); + #endregion + + #region IDisposable Members + + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + #endregion + + protected virtual void Dispose(bool disposing) + { + // Check to see if Dispose has already been called. + if (!m_disposed) + { + // If disposing equals true, dispose all managed + // and unmanaged resources. + if (disposing) + { + // Dispose managed resources. + // none yet + } + // Release unmanaged resources. If disposing is false, + // only the following code is executed. + BulletAPI_BtMatrix3x3_delete(m_handle); + m_handle = IntPtr.Zero; + // Note that this is not thread safe. + // Another thread could start disposing the object + // after the managed resources are disposed, + // but before the disposed flag is set to true. + // If thread safety is necessary, it must be + // implemented by the client. + + } + m_disposed = true; + } + + ~btMatrix3x3() + { + // Do not re-create Dispose clean-up code here. + // Calling Dispose(false) is optimal in terms of + // readability and maintainability. + Dispose(false); + } + } +} diff --git a/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletMath/btQuaternion.cs b/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletMath/btQuaternion.cs new file mode 100644 index 00000000..d19a473d --- /dev/null +++ b/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletMath/btQuaternion.cs @@ -0,0 +1,316 @@ +using System; +using System.Runtime.InteropServices; +using System.Security; +using System.Text; + +namespace BulletDotNET +{ + public class btQuaternion : IDisposable + { + private IntPtr m_handle = IntPtr.Zero; + + private bool m_disposed = false; + + public static btQuaternion FromIntPtr(IntPtr handle) + { + return (btQuaternion)Native.GetObject(handle, + typeof(btQuaternion)); + } + + public IntPtr Handle + { + get { return m_handle; } + } + + public btQuaternion(IntPtr handle) + { + m_handle = handle; + } + + public btQuaternion() + { + m_handle = BulletAPI_CreateBtQuaternion(); + } + + public btQuaternion(float x, float y, float z, float w) + { + m_handle = BulletAPI_CreateBtQuaternionFourFloats(x,y,z,w); + } + + public btQuaternion(btVector3 axis, float w) + { + m_handle = BulletAPI_CreateBtQuaternionAxisAngle(axis.Handle, w); + } + + public btQuaternion(float yaw, float pitch, float roll) + { + m_handle = BulletAPI_CreateBtQuaternionEuler(yaw,pitch,roll); + } + + public float angle(btQuaternion q) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return BulletAPI_BtQuaternion_angle(m_handle, q.Handle); + } + + public float dot(btQuaternion q) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return BulletAPI_BtQuaternion_dot(m_handle, q.Handle); + } + + public btQuaternion farthest(btQuaternion q) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return FromIntPtr(BulletAPI_BtQuaternion_farthest(m_handle, q.Handle)); + } + + public float getAngle() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return BulletAPI_BtQuaternion_getAngle(m_handle); + } + + public btQuaternion inverse() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return FromIntPtr(BulletAPI_BtQuaternion_inverse(m_handle)); + } + + public btQuaternion getIdentity() + { + return new btQuaternion(0, 0, 0, 1); + } + + public float length() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return BulletAPI_BtQuaternion_length(m_handle); + } + + public float length2() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return BulletAPI_BtQuaternion_length2(m_handle); + } + + public btQuaternion normalize() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return FromIntPtr(BulletAPI_BtQuaternion_normalize(m_handle)); + } + + public btQuaternion normalized() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return FromIntPtr(BulletAPI_BtQuaternion_normalized(m_handle)); + } + + public void setEuler(float yaw, float pitch, float roll) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + BulletAPI_BtQuaternion_setEuler(m_handle, yaw, pitch, roll); + } + + public void setEulerZYX(float yaw, float pitch, float roll) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + BulletAPI_BtQuaternion_setEulerZYX(m_handle, yaw, pitch, roll); + } + + public void setRotation(btVector3 axis, float angle) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + BulletAPI_BtQuaternion_setRotation(m_handle, axis.Handle, angle); + } + + public btQuaternion slerp(btQuaternion q, float t) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return FromIntPtr(BulletAPI_BtQuaternion_slerp(m_handle, q.Handle, t)); + } + + public string testStr() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + StringBuilder resulttxt = new StringBuilder(); + float[] vals = getValues(); + resulttxt.Append("<"); + resulttxt.Append(getX()); + resulttxt.Append(","); + resulttxt.Append(getY()); + resulttxt.Append(","); + resulttxt.Append(getZ()); + resulttxt.Append(","); + resulttxt.Append(getW()); + resulttxt.Append(">"); + return resulttxt.ToString(); + } + + public float getW() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return BulletAPI_BtQuaternion_getW(m_handle); + } + + public float getX() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return BulletAPI_BtQuaternion_getX(m_handle); + } + public float getY() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return BulletAPI_BtQuaternion_getY(m_handle); + } + public float getZ() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return BulletAPI_BtQuaternion_getZ(m_handle); + } + public float[] getValues() + { + float[] result = new float[4]; + + BulletAPI_BtQuaternion_getValues(m_handle, result); + float[] resultm = new float[4]; + int i = 0; + resultm[i] = result[i++]; + resultm[i] = result[i++]; + resultm[i] = result[i++]; + resultm[i] = result[i]; + return resultm; + } + #region Native Invokes + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_CreateBtQuaternion(); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_CreateBtQuaternionFourFloats(float x, float y, float z, float w); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_CreateBtQuaternionAxisAngle(IntPtr axis, float angle); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_CreateBtQuaternionEuler(float yaw, float pitch, float roll); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern float BulletAPI_BtQuaternion_angle(IntPtr handle, IntPtr q); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern float BulletAPI_BtQuaternion_dot(IntPtr handle, IntPtr q); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_BtQuaternion_farthest(IntPtr handle, IntPtr qd); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern float BulletAPI_BtQuaternion_getAngle(IntPtr handle); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern float BulletAPI_BtQuaternion_getW(IntPtr handle); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtQuaternion_getValues(IntPtr handle,[MarshalAs(UnmanagedType.LPArray)] float[] v); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern float BulletAPI_BtQuaternion_getX(IntPtr handle); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern float BulletAPI_BtQuaternion_getY(IntPtr handle); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern float BulletAPI_BtQuaternion_getZ(IntPtr handle); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_BtQuaternion_inverse(IntPtr handle); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern float BulletAPI_BtQuaternion_length(IntPtr handle); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern float BulletAPI_BtQuaternion_length2(IntPtr handle); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_BtQuaternion_normalize(IntPtr handle); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_BtQuaternion_normalized(IntPtr handle); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtQuaternion_setEuler(IntPtr handle, float yaw, float pitch, float roll); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtQuaternion_setEulerZYX(IntPtr handle, float yaw, float pitch, float roll); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtQuaternion_setRotation(IntPtr handle, IntPtr axis, float angle); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_BtQuaternion_slerp(IntPtr handle, IntPtr q, float t); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtQuaternion_delete(IntPtr obj); + + + #endregion + + #region IDisposable Members + + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + #endregion + + protected virtual void Dispose(bool disposing) + { + // Check to see if Dispose has already been called. + if (!m_disposed) + { + // If disposing equals true, dispose all managed + // and unmanaged resources. + if (disposing) + { + // Dispose managed resources. + // none yet + } + // Release unmanaged resources. If disposing is false, + // only the following code is executed. + BulletAPI_BtQuaternion_delete(m_handle); + m_handle = IntPtr.Zero; + // Note that this is not thread safe. + // Another thread could start disposing the object + // after the managed resources are disposed, + // but before the disposed flag is set to true. + // If thread safety is necessary, it must be + // implemented by the client. + + } + m_disposed = true; + } + + ~btQuaternion() + { + // Do not re-create Dispose clean-up code here. + // Calling Dispose(false) is optimal in terms of + // readability and maintainability. + Dispose(false); + } + } +} diff --git a/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletMath/btTransform.cs b/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletMath/btTransform.cs new file mode 100644 index 00000000..3fba15dd --- /dev/null +++ b/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletMath/btTransform.cs @@ -0,0 +1,238 @@ +using System; +using System.Runtime.InteropServices; +using System.Security; +using System.Text; + +namespace BulletDotNET +{ + public class btTransform : IDisposable + { + private IntPtr m_handle = IntPtr.Zero; + + private bool m_disposed = false; + + public static btTransform FromIntPtr(IntPtr handle) + { + return (btTransform)Native.GetObject(handle, + typeof(btTransform)); + } + + public IntPtr Handle + { + get { return m_handle; } + } + + public btTransform(IntPtr handle) + { + m_handle = handle; + } + + public btTransform() + { + m_handle = BulletAPI_CreateBtTransform(); + } + + public btTransform(btQuaternion q, btVector3 v) + { + m_handle = BulletAPI_CreateBtTransformQuaternionVector3(q.Handle, v.Handle); + } + + public btTransform(btTransform t) + { + m_handle = BulletAPI_CreateBtTransformOtherTransform(t.Handle); + } + + public btMatrix3x3 getBasis() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return btMatrix3x3.FromIntPtr(BulletAPI_BtTransform_getBasis(m_handle)); + } + + public static btTransform getIdentity() + { + return new btTransform(new btQuaternion(0,0,0,1),new btVector3(0,0,0)); + } + + public void getOpenGLMatrix(out float[] m) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + m = new float[12]; + BulletAPI_BtTransform_getOpenGLMatrix(m_handle, m); + } + + public btVector3 getOrigin() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return btVector3.FromIntPtr(BulletAPI_BtTransform_getOrigin(m_handle)); + } + + public btQuaternion getRotation() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return btQuaternion.FromIntPtr(BulletAPI_BtTransform_getRotation(m_handle)); + } + + public btTransform inverse() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return FromIntPtr(BulletAPI_BtTransform_inverse(m_handle)); + } + + public btTransform inverseTimes(btTransform t) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return FromIntPtr(BulletAPI_BtTransform_inverseTimes(m_handle,t.Handle)); + } + + public btTransform invXform(btVector3 inVec) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + return FromIntPtr(BulletAPI_BtTransform_invXform(m_handle, inVec.Handle)); + } + + public void mult(btTransform t1, btTransform t2) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + BulletAPI_BtTransform_mult(m_handle, t1.Handle, t2.Handle); + } + + public void setBasis(btMatrix3x3 basis) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + BulletAPI_BtTransform_setBasis(m_handle, basis.Handle); + } + + public void setFromOpenGLMatrix(float[] m) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + BulletAPI_BtTransform_setFromOpenGLMatrix(m_handle, m); + } + + public void setOrigin(btMatrix3x3 origin) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + BulletAPI_BtTransform_setOrigin(m_handle, origin.Handle); + } + + public void setRotation(btQuaternion q) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + BulletAPI_BtTransform_setRotation(m_handle, q.Handle); + } + + #region Native Invokes + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_CreateBtTransform(); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_CreateBtTransformQuaternionVector3(IntPtr q, IntPtr v); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_CreateBtTransformMatrix3Vector3(IntPtr m, IntPtr v); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_CreateBtTransformOtherTransform(IntPtr t); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_BtTransform_getBasis(IntPtr handle); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_BtTransform_getIdentity(IntPtr handle); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtTransform_getOpenGLMatrix(IntPtr handle, [MarshalAs(UnmanagedType.LPArray)] float[] m); // float array! + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_BtTransform_getOrigin(IntPtr handle); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_BtTransform_getRotation(IntPtr handle); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_BtTransform_inverse(IntPtr handle); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_BtTransform_inverseTimes(IntPtr handle, IntPtr t); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_BtTransform_invXform(IntPtr handle, IntPtr inVec); // // btVector3 + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtTransform_mult(IntPtr handle, IntPtr t1, IntPtr t2); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtTransform_setBasis(IntPtr handle, IntPtr basis); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtTransform_setFromOpenGLMatrix(IntPtr handle, [MarshalAs(UnmanagedType.LPArray)] float[] m); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtTransform_setOrigin(IntPtr handle, IntPtr origin); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtTransform_setRotation(IntPtr handle, IntPtr q); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtTransform_delete(IntPtr handle); + #endregion + + #region IDisposable Members + + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + #endregion + + protected virtual void Dispose(bool disposing) + { + // Check to see if Dispose has already been called. + if (!m_disposed) + { + // If disposing equals true, dispose all managed + // and unmanaged resources. + if (disposing) + { + // Dispose managed resources. + // none yet + } + // Release unmanaged resources. If disposing is false, + // only the following code is executed. + try + { + BulletAPI_BtTransform_delete(m_handle); + } + catch (AccessViolationException) + { + } + + m_handle = IntPtr.Zero; + // Note that this is not thread safe. + // Another thread could start disposing the object + // after the managed resources are disposed, + // but before the disposed flag is set to true. + // If thread safety is necessary, it must be + // implemented by the client. + + } + m_disposed = true; + } + + ~btTransform() + { + // Do not re-create Dispose clean-up code here. + // Calling Dispose(false) is optimal in terms of + // readability and maintainability. + Dispose(false); + } + } +} diff --git a/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletMath/btVector3.cs b/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletMath/btVector3.cs new file mode 100644 index 00000000..7c3afb7a --- /dev/null +++ b/BulletPhysics/bulletTrunk/BulletDotNET/BulletDotNET/bulletMath/btVector3.cs @@ -0,0 +1,260 @@ +using System; +using System.Runtime.InteropServices; +using System.Security; +using System.Text; + +namespace BulletDotNET +{ + public class btVector3 : IDisposable + { + private IntPtr m_handle = IntPtr.Zero; + + private bool m_disposed = false; + + public static btVector3 FromIntPtr(IntPtr handle) + { + return (btVector3)Native.GetObject(handle, typeof(btVector3)); + } + + public IntPtr Handle + { + get { return m_handle; } + } + + public btVector3(float x, float y, float z) + { + m_handle = BulletAPI_CreateBtVector3(x, y, z); + } + + public btVector3(IntPtr handle) + { + m_handle = handle; + } + + public btVector3 absolute() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + return FromIntPtr(BulletAPI_BtVector3_absolute(m_handle)); + } + + public float angle(btVector3 v) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + return BulletAPI_BtVector3_angle(m_handle, v.Handle); + } + + public int closestAxis() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + return BulletAPI_BtVector3_closestAxis(m_handle); + } + + public btVector3 cross(btVector3 v) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + return FromIntPtr(BulletAPI_BtVector3_cross(m_handle, v.Handle)); + } + + public float distance(btVector3 v) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + return BulletAPI_BtVector3_distance(m_handle, v.Handle); + } + + public float distance2(btVector3 v) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + return BulletAPI_BtVector3_distance2(m_handle, v.Handle); + } + + public float dot(btVector3 v) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + return BulletAPI_BtVector3_dot(m_handle, v.Handle); + } + + public int furthestAxis() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + return BulletAPI_BtVector3_furthestAxis(m_handle); + } + + public float getX() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + return BulletAPI_BtVector3_GetX(m_handle); + } + + public float getY() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + return BulletAPI_BtVector3_GetY(m_handle); + } + + public float getZ() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + return BulletAPI_BtVector3_GetZ(m_handle); + } + + public btVector3 normalized() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + return FromIntPtr(BulletAPI_BtVector3_normalized(m_handle)); + } + + public void setInterpolate3(btVector3 v0, btVector3 v1, float rt) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + BulletAPI_BtVector3_setInterpolate3(m_handle, v0.Handle, v1.Handle, rt); + } + + public void setValue(float x, float y, float z) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + BulletAPI_BtVector3_setValue(m_handle, x, y, z); + } + + public void setX(float x) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + BulletAPI_BtVector3_setX(m_handle, x); + } + + public void setY(float y) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + BulletAPI_BtVector3_setY(m_handle, y); + } + + public void setZ(float z) + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + BulletAPI_BtVector3_setZ(m_handle, z); + } + + + public string testStr() + { + if (m_disposed) + throw new ObjectDisposedException(ToString()); + + StringBuilder resulttxt = new StringBuilder(); + resulttxt.Append("<"); + resulttxt.Append(getX()); + resulttxt.Append(","); + resulttxt.Append(getY()); + resulttxt.Append(","); + resulttxt.Append(getZ()); + resulttxt.Append(">"); + return resulttxt.ToString(); + } + + #region Native Invokes + + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_CreateBtVector3(float x, float y, float z); + [DllImport(Native.Dll),SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_BtVector3_absolute(IntPtr umv); + [DllImport(Native.Dll),SuppressUnmanagedCodeSecurity] + static extern float BulletAPI_BtVector3_angle(IntPtr umv, IntPtr v); + [DllImport(Native.Dll),SuppressUnmanagedCodeSecurity] + static extern int BulletAPI_BtVector3_closestAxis(IntPtr umv); + [DllImport(Native.Dll),SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_BtVector3_cross(IntPtr umv, IntPtr v); + [DllImport(Native.Dll),SuppressUnmanagedCodeSecurity] + static extern float BulletAPI_BtVector3_distance(IntPtr umv, IntPtr v); + [DllImport(Native.Dll),SuppressUnmanagedCodeSecurity] + static extern float BulletAPI_BtVector3_distance2(IntPtr umv, IntPtr v); + [DllImport(Native.Dll),SuppressUnmanagedCodeSecurity] + static extern float BulletAPI_BtVector3_dot(IntPtr umv, IntPtr v); + [DllImport(Native.Dll),SuppressUnmanagedCodeSecurity] + static extern int BulletAPI_BtVector3_furthestAxis(IntPtr umv); + [DllImport(Native.Dll),SuppressUnmanagedCodeSecurity] + static extern float BulletAPI_BtVector3_GetX(IntPtr umv); + [DllImport(Native.Dll),SuppressUnmanagedCodeSecurity] + static extern float BulletAPI_BtVector3_GetY(IntPtr umv); + [DllImport(Native.Dll),SuppressUnmanagedCodeSecurity] + static extern float BulletAPI_BtVector3_GetZ(IntPtr umv); + [DllImport(Native.Dll),SuppressUnmanagedCodeSecurity] + static extern IntPtr BulletAPI_BtVector3_normalized(IntPtr umv); + [DllImport(Native.Dll),SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtVector3_setInterpolate3(IntPtr umv, IntPtr v0, IntPtr v1, float rt); + [DllImport(Native.Dll),SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtVector3_setValue(IntPtr umv, float x, float y, float z); + [DllImport(Native.Dll),SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtVector3_setX(IntPtr umv, float x); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtVector3_setY(IntPtr umv, float y); + [DllImport(Native.Dll), SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtVector3_setZ(IntPtr umv, float z); + [DllImport(Native.Dll),SuppressUnmanagedCodeSecurity] + static extern void BulletAPI_BtVector3_delete(IntPtr umv); + + #endregion + + #region IDisposable Members + + public void Dispose() + { + Dispose(true); + GC.SuppressFinalize(this); + } + + #endregion + + protected virtual void Dispose(bool disposing) + { + // Check to see if Dispose has already been called. + if (!m_disposed) + { + // If disposing equals true, dispose all managed + // and unmanaged resources. + if (disposing) + { + // Dispose managed resources. + // none yet + } + // Release unmanaged resources. If disposing is false, + // only the following code is executed. + BulletAPI_BtVector3_delete(m_handle); + m_handle = IntPtr.Zero; + // Note that this is not thread safe. + // Another thread could start disposing the object + // after the managed resources are disposed, + // but before the disposed flag is set to true. + // If thread safety is necessary, it must be + // implemented by the client. + + } + m_disposed = true; + } + + ~btVector3() + { + // Do not re-create Dispose clean-up code here. + // Calling Dispose(false) is optimal in terms of + // readability and maintainability. + Dispose(false); + } + + + } +} diff --git a/BulletPhysics/bulletTrunk/BulletLicense.txt b/BulletPhysics/bulletTrunk/BulletLicense.txt new file mode 100644 index 00000000..c3ec68c2 --- /dev/null +++ b/BulletPhysics/bulletTrunk/BulletLicense.txt @@ -0,0 +1,17 @@ +/* +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + + +Free for commercial use, but please mail bullet@erwincoumans.com to report projects, and join the forum at +www.continuousphysics.com/Bullet/phpBB2 diff --git a/BulletPhysics/bulletTrunk/Bullet_Faq.pdf b/BulletPhysics/bulletTrunk/Bullet_Faq.pdf new file mode 100644 index 0000000000000000000000000000000000000000..c4e8da94f7432239fe2540165b049d6d7e0593bb GIT binary patch literal 58005 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 literal 0 HcmV?d00001 diff --git a/BulletPhysics/bulletTrunk/Bullet_User_Manual.pdf b/BulletPhysics/bulletTrunk/Bullet_User_Manual.pdf new file mode 100644 index 0000000000000000000000000000000000000000..86f7c33cbc29d2491eea26a64c6018523f59d35f GIT binary patch literal 735298 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�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

jc@A?PE_9nXP44NX_>`RHZL_-3>2K$n`$N3laVZ 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%0AfR_lZ^K!j8ZME7hQt{OP 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%0A|j)5HWaQT{VTu4IZ&E|DBxm_k_ov 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 SuwyV*qtZwR+e7> IFF converter) + +2008 October 20 + - added SCE Physics Effects box-box collision detection for SPU/BulletMultiThreaded version + See Bullet/src/BulletMultiThreaded/SpuNarrowPhaseCollisionTask/boxBoxDistance.cpp + Thanks to Sony Computer Entertainment Japan, SCEI for the contribution + +2008 October 17 + - Added btGhostObject support, this helps character controller, explosions, triggers and other local spatial queries + +2008 October 10 + - Moved aabb to btBroadphaseProxy, improves rayTest dramatically. Further raytest improvements using the broadphase acceleration structures are planned + - Moved BulletMultiThreaded from Extras to /src/BulletMultiThreaded for better integration + + +2008 October 3 + - Add support for autoconf automake + ./autogen.sh and ./configure will create both Makefile and Jamfile. CMake and autogenerated Visual Studio projectfiles remain supported too. + - Improved ColladaConverter: plane shape export, and callback for shape construction to allow deletion of memory + +2008 Sept 30 + - Improved Soft Body support, fixed issues related to soft body colliding against concave triangle meshes + - Shared more code between regular version and SPU/BulletMultiThreaded, in particular GJK/EPA + +2008 Sept 28 + - Fixed rotation issues in Dynamic Maya Plugin + +2008 Sept 11 + - Enable CCD motion clamping for btDiscreteDynamicsWorld, to avoid tunneling. A more advanced solution will be implemented in btContinuousDynamicsWorld. + +2008 Sept 7 + - Add btScaledBvhTriangleMeshShape, to allow re-use of btBvhTriangleMeshShape of different sizes, without copying of the BVH data. + +2008 Sept 5 + - Enabled Demos/ForkLiftDemo + Thanks Roman Ponomarev. + +2008 Sept 4 + - Added btCudaBroadphase in Extras/CUDA: some research into accelerating Bullet using CUDA. + Thanks to the particle demo from the NVidia CUDA SDK. + +2008 Sept 3 + - Several bug fixes and contributions related to inertia tensor, memory leaks etc. + Thanks to Ole K. + +2008 Sept 1 + - Updated CDTestFramework, with latest version of OPCODE Array SAP. See Extras/CDTestFramework + Thanks to Pierre Terdiman for the update + +2008 August 25 + - Walt Disney Studios contributes their in-house Maya Plugin for simulating Bullet physics, with options for other engines such as PhysBam or PhysX. + Thanks to Nicola Candussi and Arthur Shek + +2008 August 14 + - Improved performance for btDbvtBroadphase, based on dual dynamic AABB trees (one for static, one for dynamic objects, where objects can move from one to the other tree) + Thanks to Nathanael Presson again, for all his work. + +2008 July 31 + - Added Havok .hkx to COLLADA Physics .dae converter patch+information + - Fix btSubsimplexConvexCast + Thanks to Nacho, http://www.bulletphysics.com/Bullet/phpBB3/viewtopic.php?f=9&t=2422) + - Fix in rendering, GL_STENCIL + - btTriangleIndexVertexArray indices should be unsigned int/unsigned short int, + - Made InternalProcessAllTriangles virtual, thanks to + Both thank to Fullmetalcoder, http://www.bulletphysics.com/Bullet/phpBB3/viewtopic.php?f=9&t=2401 + - clamp impulse for btPoint2PointConstraint + Thanks to Martijn Reuvers, http://www.bulletphysics.com/Bullet/phpBB3/viewtopic.php?f=9&t=2418 + - Free memory of bvh, pass in scaling factor (optional) + Thanks to Roy Eltham, http://www.bulletphysics.com/Bullet/phpBB3/viewtopic.php?f=9&t=2375 + +2008 July 27 + +btDbvtBroadphase: + - Fixed a performance issues reported by 'reltham' + - Added btDbvtBroadphase::optimize() for people who want good performances right +away or don't do dynamics. + - fixed compilation issues when DBVT_BP_PROFILE was set. +btSoftBody: + - Fixed singular matrix issues related to polar decomposition (flat meshes). +DemoApplication: + - Shadows (enable/disable through 'g' or DemoApplication::setShadows(bool)). + - Texture can be enable/disable through 'u' +CDFramework: + - fixed compilation issues. + All thanks to Nathanael Presson + +2008 July 10 + - Added btMultimaterialTriangleMeshShape and MultiMaterialDemo + Thanks to Alex Silverman for the contribution + +2008 June 30 + - Added initial support for kinematic character controller + Thanks to John McCutchan + +2008 April 14 + - Added ray cast support for Soft Bodies + Thanks to Nathanael Presson for the contribution + +2008 April 9 + - Cleanup of Stan Melax ConvexHull, removed Extras/ConvexHull, moved sources into LinearMath/BulletCollision + +2008 April 4 + - Added btSliderConstraint and demo + Thanks Roman Ponomarev + +2008 April 3 + - Fixed btMinkowskiSumShape, and added hitpoint to btSubsimplexConvexCast + +2008 April 2 + - Added Extras/CdTestFrameWork + Thanks Pierre Terdiman + +2008 April 1 + - Added posix thread (pthread) support + Thanks Enrico + +2008 March 30 + - Added Soft Body, cloth, rope and deformable volumes, including demos and interaction + Thanks Nathanael Presson for this great contribution + + 2008 March 17 + - Improved BulletColladaConverter + Thanks John McCutchan + +2008 March 15 + - btMultiSapBroadphase in a working state. Needs more optimizations to be fully useable. + - Allow btOptimizedBvh to be used for arbitrary objects, not just triangles + - added quicksort to btAlignedObjectArray + - removed btTypedUserInfo, added btHashMap + +2008 March 30 + - Moved quickstep solver and boxbox into Bullet/src folder + Thanks Russell L. Smith for permission to redistribute Open Dynamics Engine quickstep and box-box under the ZLib license + +2008 Feb 27 + - Added initial version for Character Control Demo + - Applied fixes to IBM Cell SDK 3.0 build makefiles + Thanks Jochen and mojo for reporting/providing patch: http://www.bulletphysics.com/Bullet/phpBB3/viewtopic.php?f=9&t=1922 + +2008 Feb 8 + - Bugfixes in ConvexCast support against the world. + Thanks to Isgmasa for reporting/providing fix: http://www.bulletphysics.com/Bullet/phpBB3/viewtopic.php?f=9&t=1823 + +2008 Feb 6 + - Added btCapsuleShapeX and btCapsuleShapeZ for capsules around X and Z axis (default capsule is around Y) + +2008 Feb 3 + - Added btTypedUserInfo, useful for serialization + +2008 Jan 31 + - Add support for 16 and 32-bit indices for SPU / BulletMultiThreaded version. + +2008 Jan 29 + - Added COLLADA Physics export/serialization/snapshot from any Bullet btDynamicsWorld. Saving the physics world into a text .xml file is useful for debugging etc. + +2008 Jan 23 + - Added Stan Melax Convex Hull utility library in Extras/ConvexHull. This is useful to render non-polyhedral convex objects, and to simplify convex polyhedra. + +2008 Jan 14 + - Add support for batch raycasting on SPU / BulletMultiThreaded + +2007 Dec 16 + - Added btRigidBodyConstructionInfo, to make it easier to set individual setting (and leave other untouched) during rigid body construction. + Thanks Vangelis Kokkevis for pointing this out. + - Fixed memoryleak in the ConstraintDemo and Raytracer demo. + - Fixed issue with clearing forces/gravity at the end of the stepSimulation, instead of during internalSingleStepSimulation. + Thanks chunky for pointing this out: http://www.bulletphysics.com/Bullet/phpBB3/viewtopic.php?f=9&t=1780 + - Disabled additional damping in rigid body by default, but enable it in most demos. Set btRigidBodyConstructionInfo m_additionalDamping to true to enable this. + - Removed obsolete QUICKPROF BEGIN/END_PROFILE, and enabled BT_PROFILE. Profiling is enabled by default (see Bullet/Demos/OpenGL/DemoApplication.cpp how to use this). + User can switch off profiling by enabling define BT_NO_PROFILE in Bullet/src/btQuickprof.h. + +2007 Dec 14 + - Added Hello World and BulletMultiThreaded demos + - Add portable version of BulletMultiThreaded, through SequentialThreadSupport (non-parallel but sharing the same code-path) + - Add Cmake support for AllBulletDemos + + +2007 Dec 11 + - Moved the 'btRigidBody::clearForce' to the end of the stepSimulation, instead of in each substep. + See discussion http://www.bulletphysics.com/Bullet/phpBB3/viewtopic.php?f=9&t=1601 + - Added btConvexPlaneCollisionAlgorithm, makes planes perform better, and prevents tunneling + Thanks Andy O'Neil for reporting the performance/functionality issue + - Fixes for IBM Cell SDK 3.0 + Thanks to Jochen Roth for the patch. + +2007 Dec 10 + - Fixes in btHeightfieldTerrainShape + Thanks to Jay Lee for the patch. + +2007 Dec 9 + - Only update aabb of active objects + Thanks Peter Tchernev for reporting (http://bulletphysics.com/Bullet/phpBB3/viewtopic.php?f=9&t=1764 ) + - Added workaround to compile libxml under Visual Studio 2008 Beta 2 + - Make glui compile under MSVC 9.0 beta (vsnprintf is already defined) + +2007 Dec 6 + - Added DynamicControlDemo, showing dynamic control through constraint motors + Thanks to Eddy Boxerman + - Add support for generic concave shapes for convex cast. + - Added convex cast query to collision world. + - Added workaround for OpenGL bug in Mac OS X 10.5.0 (Leopard) + - Added concave raycast demo + All above thanks to John McCutchan (JMC) + - Fixed issues that prevent Linux version to compile. + Thanks to Enrico for reporting and patch, see + - Fixed misleading name 'numTriangleIndices' into 'numTriangles' + Thanks Sean Tasker for reporting: + +2007 Nov 28: + - Added raycast against trianglemesh. Will be extended to object cast soon. + Thanks John McCutchan (JMC) + - make getNumPoints const correct, add const getPoints(). + Thanks Dirk Gregorius + - Bugfix: allow btCollisionObjects (non-btRigidBody) to interact properly with btRigidBody for cache-friendly btSequentialImpulseConstraintSolver. + Thanks Andy O'Neil for pointing this out. + - Bugfix: don't fail if spheres have identical center, use arbitrary separating normal (1,0,0) + Thanks Sean Tasker for reporting! http://www.bulletphysics.com/Bullet/phpBB3/viewtopic.php?f=9&t=1681 + + +2007, November 20 + - Added hierarchical profiling + - Fixed memory leak in btMultiSapBroadphase, + - Fixed hash function (typo, should use 2 proxies) + Thanks to Stephen (shatcher) for reporting and fixes! http://www.bulletphysics.com/Bullet/phpBB3/viewtopic.php?f=9&t=1696 + +2007 Nov 11 + - Fixed parallel solver (BulletMultiThreaded) friction issue + - Terminate Win32 Threads when closing the CcdPhysicsDemo (when USE_PARALLEL_SOLVER/USE_PARALLEL_DISPATCHER is defined) + +2007 Nov 6 + - Added support for 16-bit indices for triangle meshes + - Added support for multiple mesh parts using btBvhTriangleMeshShape. + Thanks to Tim Johansson + +2007 Oct 22 + - All memory allocations go through btAlignedAlloc/btAlignedFree. User can override this to verify memory leaks + - added a few more demos to AllBulletDemos + - fix for one of the constructors of btHingeConstraint + Thanks Marcus Hennix + +2007 Oct 20 + - included glui, a GLUT/OpenGL based toolkit for some graphical user elements + Removed dynamic_cast from glui, to allow linkage without rtti + - added Box2D framework using glui, allowing all demos to run within one executable + Thanks Erin Catto for the FrameWork skeleton (http://www.box2d.org) + +2007 Ocy 17 + - Allow user to pass in their own memory (stack and pool) allocators, through collisionConfiguration. See demos how to use this + +2007 Oct 14 + - Included working version of Cell SPU parallel optimized version for Libspe2 SPU task scheduler. + This version compiles and runs on Playstation 3 Linux and IBM CellBlade, see BulletSpuOptimized.pdf for build instructions + (Official Playstation 3 developers can request a SPURS version through Sony PS3 Devnet.) + Thanks to IBM 'Extreme Blue' project for the contribution + http://www-913.ibm.com/employment/us/extremeblue/ + Thanks Minh Cuong Tran, Benjamin Hoeferlin, Frederick Roth and Martina Huellmann + for various contributions to get this initial Libspe2 parallel version up and running. + +2007 Oct 13 + - made 'btCollisionShape::calculateLocalInertia' const + Thanks to cgripeos, see http://www.bulletphysics.com/Bullet/phpBB3/viewtopic.php?f=9&t=1514 + - applied a large patch to remove warnings + Thanks to Enrico, see http://www.bulletphysics.com/Bullet/phpBB3/viewtopic.php?f=9&t=1568 + - removed SSE includes, added #incude for memset in Extras/quickstep, thanks Eternl Knight + +2007 Oct 11 + - added Hashed Overlapping Pair Cache, recommended by Pierre Terdiman. It works like a charm, thanks Pierre and Erin Catto (code from Box2D) + - modified some margins inside btBoxShape, btCylinderShape and btSphereShape + - added cone debug rendering (for cones with x, y and z up-axis) + - added improvements for optional Extra/quickstep, thanks to Remotion + - some performance improvements for Bullet constraint solver + +2007 Sept 28 + - upgraded GIMPACT to version 0.3 + Thanks to Francisco Leon + +2007 Sept 27 + - added contribution from IBM Extreme Blue project for Libspe2 support. This allow to execute BulletMultiThreaded on Cell SPU under PS3 Linux and Cell Blade. See http://www-913.ibm.com/employment/us/extremeblue + Thanks to Minh Cuong Tran, Frederick Roth, Martina Heullmann and Benjamin Hoeferlin. + +2007 Sept 13 + - Improved btGenericD6Constraint. It can be used to create ragdolls (similar to the new btConeTwistConstraint). See GenericJointDemo + - Added support for Bullet constraints in the optional Extras/quickstep ODE solver. See CcdPhysicsDemo, enable #COMPARE_WITH_QUICKSTEP and add libquickstep to the dependencies. + For both patches/improvements thanks Francisco Leon/projectileman + +2007 Sept 10 + - removed union from btQuadWordStorage, it caused issues under certain version of gcc/Linux + +2007 Sept 10 + - Reverted constraint solver, due to some issues. Need to review the recent memory allocation changes. + - Fixed issue with kinematic objects rotating at low speed: quaternion was de-normalized, passing value > 1 into acosf returns #IND00 invalid values + - 16 byte memory alignment for BVH serialization + - memory cleanup for btPoolAllocator + +2007 Sept 9 + - Added serialization for BVH/btBvhTriangleMeshShape, including endian swapping. See ConcaveDemo for an example. + Thanks to Phil Knight for the contribution. + - Fixed issues related to stack allocator/compound collision algorithm + Thanks Proctoid, http://www.bulletphysics.com/Bullet/phpBB3/viewtopic.php?f=18&t=1460 + - Increase some default memory pool settings, and added a fallback for the constraints solver to use heap memory + - Removed accidential testing code in btScalar.h related to operator new. + - Enable btAxis3Sweep and bt32BitAxis3Sweep to be linked in at the same time, using template + +2007 Sept 7 + - Replaced several dynamic memory allocations by stack allocation and pool allocations + - Added branch-free quantized aabb bounding box overlap check, works better on Playstation 3 and XBox 360 + Thanks to Phil Knight. Also see www.cellperformance.com for related articles + - Collision algorithms and settings for the memory/stack allocator can be done using btDefaultCollisionConfiguration + This is an API change. See demos how to modify existing implementations with a one-liner. + - Register several collision algorithms by default (sphere-sphere, sphere-box, sphere-triangle) + - Use other traveral method for BVH by default, this improves triangle mesh collision performance. + +2007 Aug 31 + - fixed MSVC 6 build + Thanks Proctoid, http://www.continuousphysics.com/Bullet/phpBB2/viewtopic.php?t=1375 + - fixed double precision build issues + Thanks Alex Silverman, http://www.continuousphysics.com/Bullet/phpBB2/viewtopic.php?t=1434 + +2007 Aug 24 + - fixed bug in btMatrix3x3::transposeTimes(const btMatrix3x3& m) const. Luckily it wasn't used in core parts of the library (yet). + Thanks to Jay Lee + +2007 Aug 15 + - fixed bug in Extras/GIMPACT 0.2 related to moving triangle meshes + Thanks Thomas, http://www.continuousphysics.com/Bullet/phpBB2/viewtopic.php?t=1368 + +2007 Aug 14 + - added parallel constraint solver. Works on Playstation 3 Cell SPU and multi core (Win Threads on PC and XBox 360). + See Extras/BulletMultiThreaded for SpuSolverTask subfolder and SpuParallelSolver.cpp + Thanks Marten Svanfeldt (Starbreeze Studios) + - fixed some bugs related to parallel collision detection (Extras/BulletMultiThreaded) + Thanks Marten Svanfeldt (Starbreeze Studios) + +2007 Aug 2 + - added compound and concave-convex (swapped) case for BulletMultiThreaded collision detection, thanks to Marten Svanfeldt + - refactored broadphase and overlapping pair cache. This allows performance improvement by combining multiple broadphases. This helps add/remove of large batches of objects and large worlds. See also Pierre Terdiman forum topic: + http://www.continuousphysics.com/Bullet/phpBB2/viewtopic.php?t=1329 + + +2007 July 27 + - added Ragdoll Demo + Thanks to Marten Svanfeldt (Starbreeze Studios) + + - added Vector Math library for SIMD 3D graphics linear algebra (vector, matrix, quaternion) + See Bullet/Extras/vectormathlibrary + Supports SIMD SSE, PowerPC PPU and Cell SPU (including PS3 Linux and CellBlade), as well as generic portable scalar version + Will be used to improve BulletMultiThreaded performance + Open Sourced by Sony Computer Entertainment Inc. under the new BSD license + - added SIMD math library + 4-way SIMD for common math functions like atan2f4, cosf4, floorf4, fabsf4, rsqrtf4 etc. Used by Vector Math library under PPU and SPU. + Supports PowerPC (PPU) and Cell SPU, including PS3 Linux and CellBlade. + See Bullet/Extras/simdmathlibrary + Open sourced by Sony Computer Entertainment Inc. under the new BSD license + + +2007 July 25 + - added several patches: per-rigidbody sleeping threshold. added Assert to prevent deletion of rigidbody while constraints are still pointing at it + Thanks to Marten Svanfeldt (Starbreeze Studios) + +2007 July 13 + - fixed relative #include paths again. We can't use "../" relative paths: some compilers choke on it (it causes extreme long paths) + Within the libraries, we always need to start with "BulletCollision/" or "BulletDynamics/ or "LinearMath/" + +2007 July 10 + - Updated Bullet User Manual + +2007 July 5 + - added btConeTwistConstraint, especially useful for ragdolls. See Demos/RagdollDemo + Thanks to Marten Svanfeldt (Starbreeze Studios) + +2007 June 29 + - btHeightfieldTerrainShape: Added heightfield support, with customizations + - Upgraded to GIMPACT 0.2, see Extras/GIMPACT and MovingConcaveDemo + - Several patches from Marten Svanfeldt (Starbreeze Studios) + Improved collision filtering (in broadphase and rigidbody) + Improved debug rendering + Allow to set collision filter group/mask in addRigidBody + + +2007 June 15 + - Changed btAlignedObjectArray to call copy constructor/replacement new for duplication, rather then assignment operator (operator=). + +2007 June 11 + - Added multi-threading. Originally for Playstation 3 Cell SPU, but the same code can run using Win32 Threads using fake DMA transfers (memcpy) + Libspe2 support for Cell Blade / PS3 Linux is upcoming + See Extras/BulletMultiThreaded. Usage: replace btCollisionDispatcher by btSpuGatheringCollisionDispatcher + + - Added managed Bullet library, entirely rewritten in C# for Windows and XBox 360 XNA + See Extras/BulletX + Thanks to KleMiX, aka Vsevolod Klementjev + +2007 May 31 + - sign-bit went wrong in case of 32-bit broadphase, causing quantization problems. + Thanks DevO for reporting. + +2007 May 23 + - Fixed quantization problem for planar triangle meshes in btOptimizedBvh + Thanks Phil Knight for reporting and helping to fix this bug. + +2007 May 20 + - btAxisSweep3: Fixed a bug in btAxisSweep3 (sweep and prune) related to object removal. Only showed up when at least one btStaticPlaneShape was inserted. + Thanks tbp for more details on reproducing case. + - btAxisSweep3: Fixed issue with full 32bit precision btAxisSweep3 (define BP_USE_FIXEDPOINT_INT_32), it used only 0xffff/65536 for quantization instead of full integer space (0xffffffff) + - btRaycastVehicle: Added 'getForwardVector' and getCurrentSpeedKmHour utility functions + - Fixed local scaling issues (btConvexTriangleMeshShape, btBvhTriangleMeshShape, removed scaling from btMatrix3x3). + Thanks Volker for reporting! + - Added second filename search, so that starting BspDemo and ConvexDecompositionDemo from within Visual Studio (without setting the starting path) still works + +2007 April 22 + - Added braking functionality to btRaycastVehicle + - Removed tons of warnings, under MSVC 2005 compilation in -W4 + +2007 March 21 + - Fixed issues: comma at end of enum causes errors for some compilers + - Fixed initialization bug in LocalRayResult ( m_localShapeInfo(localShapeInfo) ) + +2007 March 20 + - Added refit tree to quantized stackless tree, and updated ConcaveDemo as example. + +2007 March 17 + - Added constraint solver optimizations, avoiding cross products during iterations, and gather rigidbody/constraint info in contiguous memory (btSolverBody/btSolverConstraint) + - These optimizations don't give large benefit yet, but it has good potential. Turned on by default. Can be switched off using solver->setSolverMode(SOLVER_RANDMIZE_ORDER). + - Enabled anti-jitter for rigid bodies. This is experimental, and can be switched off by setting a global (it is experimental so no proper interface) gJitterVelocityDampingFactor = 1.0; + - Fixed bug in islandmanifold.heapSort(btPersistentManifoldSortPredicate()); , thanks Noehrgel for reporting this (affected Sun Solaris) + +2007 March 12 + - Added compile-time toggle between on 16-bit and 32-bit fixed-point SAP broadphase. + This allows the number of bodies to exceed 32767 + - Enable useQuantizedAabbCompression on btTriangleMesh, see ColladaDemo + +2007 March 8 + - Fixed bug in constraint/island sorting (caused by replacing STL by dedicated btAlignedObjectArray with heapSort) + Thanks Clemens Unterkofler for pointing this out! + +2007 March 6 + - removed STL from the Bullet library: replace std::vector by btAlignedObjectArray. Also removed the std::set for overlapping pair set, and turned it into an overlapping pair array. The SAP only adds objects, never removed. Removal is postponed for during traversal of overlapping pairs (duplicates and non-overlapping pairs are removed during that traversal). + - added heap sort and binary search/linear search to btAlignedObjectArray + - fixed wrong cast, thanks Hamstray, http://www.continuousphysics.com/Bullet/phpBB2/viewtopic.php?t=1015 + + +2007 Feb 25 + - Improved performance of convex collision shapes, cache local AABB instead of recomputation. This fixes issue with very slow performance in larger .bsp levels + +2007 Feb 24 + - Added compressed/quantized AABB tree, 16 bytes per node, while supporting 32-bit (triangle) indices. + Should be faster and smaller then original version (quantized aabb check is done in integer space) + Original aabb tree nodes are still supported. They are 44 bytes, with full floating point precision and additional subPart index. + - added meter-unit scaling support in ColladaConverter.cpp + +2007 Feb 21 + - Build system: updated bullet.pc.in library names + - Updated EPA comparison integration (missing parameter) + +2007 Jan 04 + - fixed optimized AABB tree building: in some cases the tree building fails due to unbalanced trees, which generated stack overflow + +2006 Dec 15 + - added contribution to allow double precision collision detection/dynamics. Define BT_USE_DOUBLE_PRECISION in your project and libraries that include Bullet + +2006 Dec 14 + - merged contact and non-contact constraint solving into one loop, will improve stability of jointed bodies during collisions + - added first draft for hingeConstraint motor + +2006 Dec 8, Erwin Coumans + - preparation for SIMD: added btAlignedAllocator and btAlignedObjectArray, to replace stl std::vector, same interface, but compatible with 16 byte alignment + - cleaned up dependencies in autogenerated msvc projectfiles + - aligned btVector3 on 16 bytes boundary, under win32. see if developers will come up with problems + +2006 Dec 04, Erwin Coumans + Added btNearCallback. This is similar to Open Dynamics Engine (ODE) dNearCallback, but important differences: + - contact points are persistent (lifetime more then one frame, for warmstarting/incremental contact point management) + - continuous collision detection, time of impact + Added btRigidBody::isInWorld(), returns true if btRigidBody is inside a btCollisionWorld/btDynamicsWorld derived class + Added angularFactor to btRigidbody, this helps some character control (no angular impulse applied) + + +2006 Nov 28 + Moved StackAlloc from EPA into LinearMath/btStackAlloc + renamed internal class ConcaveShape into btConcaveShape + added btHeightfieldTerrainShape (not completed yet) + +2006 Nov 15 Nathanael Presson + Added EPA penetration depth algorithm, Expanding Polytope Algorithm + Added Pierre Terdiman penetration depth comparison/test DEMO + Fixed Bullet's Minkowski sampling penetration depth solver + Contributed by Nathanael Presson + +2006 Nov 11 Francisco León Nájera + Added GIMPACT trimesh collision detection: concave versus concave, + Contributed by Francisco León Nájera + +2006 Nov 2 + Minor refactoring: btCollisionObject changes from struct into class, added accessor methods + Force use of btMotionState to synchronize graphics transform, disabled old btRigidBody constructor that accepts btTransform + Renamed treshold into threshold throughout the code + +2006 Oct 30 + Enable decoupling of physics and graphics framerate using interpolation and internal fixed timestep, based on btMotionState + Enabled raycast vehicle demo (still needs tuning) + Refresh contact points, even when they are already persistent. + Fixed debugDraw colors (thanks pc0de for reporting) + Use Dispatcher in ConcaveConvexCollisionAlgorithm (so it uses the registered collision algorithm, not hardcoded convexconcave) + Improved performance of constraint solver by precalculating the cross product/impulse arm + Added collision comparison code: ODE box-box, also sphere-triangle + Added safety check into GJK, and an assert for AABB's that are very large + Fixed kinematic support (deriving velocities for animated objects) + Updated comparison/optional quickstep solver in Extras + UserCollisionAlgorithm demonstrates btTriangleMesh usage (easier trimesh compared to index array version) + Removed scaling from btTransform (we only want to deal with rigid transforms) + +2006 Oct 4 + Fixed minor leak in btOptimizeBVH + Cleanup of btRigidBody construction + added getW() in btQuaternion + assert when setLinearVelocity is called on btRigidBody + renamed projectfile library from collada-dom to colladadom (to make VC6 happy) + +2006 Sept 27 + Big Refactoring: renamed and moved files, create a replacement for CcdPhysicsEnvironment/CcdPhysicsController. + All Bullet classes in LinearMath, BulletCollision and BulletDynamics start with bt, and methods start with lowercase. + Moved classes into src folder, which is the only include folder needed. + Added 2 headerfiles in src: btBulletCollisionCommon.h and btBulletDynamicsCommon.h + +2006 Sept 23 + Fixed 2 bugs, causing crashes when removing objects. Should do better unit-testing. UnionFind and 3D SAP were involved. + +2006 Sept 19 + Allow programmable friction and contact solver model. User can register their own functions for several interaction types. + Improved performance, and removed hardcoded maximum overlaps (switched from C-array to stl::set) + +2006 Sept 16 + Added Bullet 2.0 User Manual + Allow registration of custom user collision algorithms + +2006 Sept 10 + Started cleaning up demos + +2006 Sept 4 + Fixed concave collision bug (caused instability/missing collisions in meshes/compounds) + Fixed memoryleak in OptimizedBvh, added RayTestSingle to CollisionWorld + Prepared for VehicleDemo + Increased Performance (island generation for sleeping objects took too much time) + Better COLLADA 1.4.1 physics conformance in ColladaDemo + +2006 August 11 + Added Quake BspDemo + Improved CCD for compound and non-convex objects + +2006 August 10 + Added per-triangle material (friction/restitution) support for non-convex meshes. See ConcaveDemo for usage. + +2006 August 9 + Added CMake support (see http://cmake.org) + This can autogenerate makefiles, projectfiles cross platform (including MacOS X Xcode ) + Just run cmake . in the root folder and it will autogenerate build files + +2006 July 26 Erwin Coumans + Upgraded to COLLADA-DOM 1.4.1, latest SVN version + ColladaDemo can export snapshots to .dae + +2006 July 24 Erwin Coumans + Added Compound CollisionShape support + (this is still low performance -> requires stackless tree-versus-tree traversal for better performance) + +2006 July 15 Erwin Coumans + Added initial support for Parallel execution (collision detection, constraint solving) + See ParallelPhysicsEnvironment in Extras\PhysicsInterface\CcdPhysics + +2006 July 10 Erwin Coumans + Added MacOS X support (some build issues mainly) + +2006 July 5 Erwin Coumans + Improved COLLADA 1.4 physics import, both COLLADA-DOM and FCollada + +2006 June 29 Erwin Coumans + Refactoring of the broadphase + Moved some optional files to Extras: Algebraic ccd and EPA, quickstep + Moved the limits on bodies/overlap to 32k and 65k + +2006 June 25 Erwin Coumans + Added basic Collision Filtering, during broadphase + Allow adding meshes to the TriangleIndexVertexArray, + (input for TriangleMeshShape) + Preparation for CompoundShape + +2006 June 19 Erwin Coumans + Added support for COLLADA Physics Import. + Both jam and Visual Studio can compile ColladaDemo + +2006 June 18 Dirk Gregorius + Started implementing Generic6DOF joint and setup basic interface + + +2006 June 17 Frank Richter + Bumped version in configure.ac to 1.5.6 (assuming that "1.5f" is + the next version released). + Updated files in mk/autoconf and mk/jam with copies from CS; fixes a + GLU detection issue on MinGW. + Set msvc/bullet_ico.ico as the default application icon. + Disabled exceptions for gcc builds. + Applied a patch from Michael D. Adams to fix a warning with gcc. +2006 jUNE 16 Erwin Coumans + Constraints now merge simulation islands. + +2006 May 24 + Improved GJK accuracy, fixed GjkConvexCast issue, thanks to ~MyXa~ for reporting + +2006 May 19 + Added restitution support + Moved out Friction and Dynamics info from ManifoldPoint (removed logical dependency) + Added a void* m_userPersistentData in ManifoldPoint. + Added a ContactDestroyedCallback, to allow user to handle destruction of m_userPersistentData + +2006 May 13 + Fixed some bugs in friction / jacobian calculations. Reported by Dirk Gregorius. Thanks! + +2006 May 9 + Fixed raycasting filtering + Moved repository to SVN at https://svn.sourceforge.net/svnroot/bullet + +2006 April 27 + Moved raycasting to CollisionWorld, to make it more generic + Added basic CCD option in the CcdCollisionDemo + Fixed 'noResponse' mode, for triggering rigidbodies (useful for Artificial Intelligence queries) + Improved Bullet/ODE sample (in Extras) + +2006 April 10 + Separating Axis Test (SAT) convex hull collision detector, contribution by Simon Hobbs + Added SIMD SSE Math classes (for above SAT) + Added Mouse picking in CcdPhysicsDemo + Improved penetration depth estimation in MinkowskiPenetrationDepthSolver, both accuracy and performance + Added Hinge constraint + Added quickprof profiling (see http://sourceforge.net/projects/quickprof ) + +2006 March 21 Frank Richter + Removed VC manifest files. + Removed superfluous "grpplugins" projects. + +2006 March 20 Erwin Coumans + Clamped the acculumated impulse rather then intermediate impulse (within the iteration) + Use the persistent contacts for reusing the impulse + Separated friction and normal solving for better stability + Decreased the default number of iterations of the constraint solver from 10 to 4 + +2006 March 19 Frank Richter + Removed a couple of CSisms from the VC projects. + Fixed VC include & lib paths to go to the Addtional* options + instead the command line arguments. + Added pkgconfig support. + +2006 March 14 Frank Richter + Added support for shipped GLUT on MinGW. + Fixed GLUT support on MinGW. + +2006 March 13 Frank Richter + Bolted on Jam-based build system. + Generated VC project files. + Fixed GCC warnings. + Fixed Linux build issues. + +2006 March 13 +Added 3D Sweep and Prune Broadphase Collision Detection, Contribution from Simon Hobbs. + +2006 March 2 + Minor change in license to ZLib/LibPNG + This makes it legally a bit easier to deploy on Playstation 3 + Prepared for more generic constraints, added ConstraintsDemo + +2006 Feb 23 + Rearranged files and dependencies to allow for easier standalone Collision Detection without Bullet Dynamics. + See Demos/CollisionInterfaceDemo and Extras/ode/ode/test/test_BulletGjk.cpp for examples how to use. + +2005 August 6 + Bullet 0.2 release with demos, sources, doxygen, draft manual + +2005 June 1 + First public release of Bullet + + +... todo: add history + +2003 Initial version (continuous collision detection) diff --git a/BulletPhysics/bulletTrunk/Demos/AllBulletDemos/CMakeLists.txt b/BulletPhysics/bulletTrunk/Demos/AllBulletDemos/CMakeLists.txt new file mode 100644 index 00000000..c2f461be --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/AllBulletDemos/CMakeLists.txt @@ -0,0 +1,48 @@ +# This is basically the overall name of the project in Visual Studio this is the name of the Solution File + + +# For every executable you have with a main method you should have an add_executable line below. +# For every add executable line you should list every .cpp and .h file you have associated with that executable. + + +# You shouldn't have to modify anything below this line +######################################################## + +LINK_DIRECTORIES( +"C:/MinGW/lib" +) + +INCLUDE_DIRECTORIES( +${BULLET_PHYSICS_SOURCE_DIR}/Extras/BulletColladaConverter ${BULLET_PHYSICS_SOURCE_DIR}/Extras ${BULLET_PHYSICS_SOURCE_DIR}/Extras/GIMPACTUtils ${BULLET_PHYSICS_SOURCE_DIR}/Extras/ConvexDecomposition ${BULLET_PHYSICS_SOURCE_DIR}/Extras/LibXML ${BULLET_PHYSICS_SOURCE_DIR}/Extras/LibXML/include ${BULLET_PHYSICS_SOURCE_DIR}/Extras/COLLADA_DOM/include/1.4 ${BULLET_PHYSICS_SOURCE_DIR}/Extras/COLLADA_DOM/include ${BULLET_PHYSICS_SOURCE_DIR}/src ${BULLET_PHYSICS_SOURCE_DIR}/Demos/OpenGL } +) + +LINK_LIBRARIES( +BulletColladaConverter GLUI GIMPACTUtils ConvexDecomposition ColladaDom XML OpenGLSupport BulletSoftBody BulletDynamics BulletCollision LinearMath ${GLUT_glut_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} +) + + + +ADD_EXECUTABLE(AppAllBulletDemos + Main.cpp + DemoEntries.cpp + ../CcdPhysicsDemo/CcdPhysicsDemo.cpp + ../BasicDemo/BasicDemo.cpp + ../Benchmarks/BenchmarkDemo.cpp + ../BspDemo/BspDemo.cpp + ../BspDemo/BspConverter.cpp + ../BspDemo/BspLoader.cpp + ../DynamicControlDemo/MotorDemo.cpp + ../ConcaveDemo/ConcavePhysicsDemo.cpp + ../ConcaveRaycastDemo/ConcaveRaycastDemo.cpp + ../ConcaveConvexcastDemo/ConcaveConvexcastDemo.cpp + ../ConvexDecompositionDemo/ConvexDecompositionDemo.cpp + ../SliderConstraintDemo/SliderConstraintDemo.cpp + ../RagdollDemo/RagdollDemo.cpp + ../GimpactTestDemo/GimpactTestDemo.cpp + ../Raytracer/Raytracer.cpp + ../GjkConvexCastDemo/LinearConvexCastDemo.cpp + ../ForkLiftDemo/ForkLiftDemo.cpp + ../SoftDemo/SoftDemo.cpp + ../ConstraintDemo/ConstraintDemo.cpp +) + diff --git a/BulletPhysics/bulletTrunk/Demos/AllBulletDemos/DemoEntries.cpp b/BulletPhysics/bulletTrunk/Demos/AllBulletDemos/DemoEntries.cpp new file mode 100644 index 00000000..97735e46 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/AllBulletDemos/DemoEntries.cpp @@ -0,0 +1,164 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#include "DemoEntries.h" + +#include "../CcdPhysicsDemo/CcdPhysicsDemo.h" +#include "../BspDemo/BspDemo.h" +#include "../BasicDemo/BasicDemo.h" +#include "../ConcaveDemo/ConcaveDemo.h" +#include "../ConcaveRaycastDemo/ConcaveRaycastDemo.h" +#include "../ConcaveConvexcastDemo/ConcaveConvexcastDemo.h" +#include "../ConvexDecompositionDemo/ConvexDecompositionDemo.h" +#include "../DynamicControlDemo/MotorDemo.h" +#include "../SliderConstraintDemo/SliderConstraintDemo.h" +#include "../RagdollDemo/RagdollDemo.h" +#include "../GimpactTestDemo/GimpactTestDemo.h" +#include "../Raytracer/Raytracer.h" +#include "../GjkConvexCastDemo/LinearConvexCastDemo.h" +#include "../ForkLiftDemo/ForkLiftDemo.h" +#include "../ConstraintDemo/ConstraintDemo.h" +#include "../Benchmarks/BenchmarkDemo.h" +#include "../SoftDemo/SoftDemo.h" + + +#include "GlutStuff.h"//OpenGL stuff +#include "BMF_Api.h"//font stuff + +extern int gNumAlignedAllocs; +extern int gNumAlignedFree; +extern int gTotalBytesAlignedAllocs; + +class btEmptyDebugDemo : public DemoApplication +{ +public: + btEmptyDebugDemo() + { + + } + + virtual void clientMoveAndDisplay() + { + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + float xOffset = 10.f; + float yStart = 20.f; + float yIncr = 20.f; + char buf[124]; + + + glColor3f(0, 0, 0); + + setOrthographicProjection(); + + glRasterPos3f(xOffset,yStart,0); + sprintf(buf,"gNumAlignedAllocs= %d",gNumAlignedAllocs); + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); + yStart += yIncr; + + glRasterPos3f(xOffset,yStart,0); + sprintf(buf,"gNumAlignedFree= %d",gNumAlignedFree); + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); + yStart += yIncr; + + glRasterPos3f(xOffset,yStart,0); + sprintf(buf,"# alloc-free = %d",gNumAlignedAllocs-gNumAlignedFree); + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); + yStart += yIncr; +#ifdef BT_DEBUG_MEMORY_ALLOCATIONS + glRasterPos3f(xOffset,yStart,0); + sprintf(buf,"gTotalBytesAlignedAllocs = %d",gTotalBytesAlignedAllocs); + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); + yStart += yIncr; +#endif //BT_DEBUG_MEMORY_ALLOCATIONS + + glFlush(); + glutSwapBuffers(); + + } + + static DemoApplication* Create() + { + btEmptyDebugDemo* demo = new btEmptyDebugDemo(); + demo->myinit(); + return demo; + } + +}; + + +btDemoEntry g_demoEntries[] = +{ + + {"ConstraintDemo",ConstraintDemo::Create}, + {"ForkLift Demo",ForkLiftDemo::Create}, + {"Ragdoll Demo",RagdollDemo::Create}, + {"Basic Demo", BasicDemo::Create}, + {"Convex Decomposition",ConvexDecompositionDemo::Create}, + {"Concave Moving", GimpactConcaveDemo::Create}, +// {"Dynamic Control Demo",MotorDemo::Create}, + //{"ConcaveDemo",ConcaveDemo::Create}, + {"Concave Convexcast Demo",ConcaveConvexcastDemo::Create}, + // {"SoftBody Cloth",SoftDemo0::Create}, + + {"SoftBody Ropes Attach",SoftDemo4::Create}, + {"SoftBody Cloth Attach",SoftDemo5::Create}, + {"SoftBody Cluster Collide1",SoftDemo19::Create}, +// {"SoftBody Volume",SoftDemo2::Create}, + {"SoftBody Pressure",SoftDemo1::Create}, + {"SoftBody Cluster Car",SoftDemo24::Create}, + {"SoftBody Cluster Robot",SoftDemo25::Create}, + // {"SoftBody Ropes",SoftDemo3::Create}, + {"SoftBody Sticks",SoftDemo6::Create}, +// {"SoftBody Collide",SoftDemo7::Create}, +// {"SoftBody Collide2",SoftDemo8::Create}, +// {"SoftBody Collide3",SoftDemo9::Create}, +// {"SoftBody Impact",SoftDemo10::Create}, + {"SoftBody Aero",SoftDemo11::Create}, +// {"SoftBody Friction",SoftDemo12::Create}, +// {"SoftBody Torus",SoftDemo13::Create}, +// {"SoftBody Torus Match",SoftDemo14::Create}, +// {"SoftBody Bunny",SoftDemo15::Create}, +// {"SoftBody Bunny Match",SoftDemo16::Create}, + {"SoftBody Init Cutting",SoftDemo17::Create}, +// {"SoftBody Cluster Deform",SoftDemo18::Create}, + +// {"SoftBody Cluster Collide2",SoftDemo20::Create}, +// {"SoftBody Cluster Socket",SoftDemo21::Create}, +// {"SoftBody Cluster Hinge",SoftDemo22::Create}, +// {"SoftBody Cluster Combine",SoftDemo23::Create}, +// {"SoftBody Cluster Stack Soft",SoftDemo26::Create}, + {"SoftBody Cluster Stack Mixed",SoftDemo27::Create}, + +// {"SliderConstraint",SliderConstraintDemo::Create}, + {"CcdPhysicsDemo", CcdPhysicsDemo::Create}, +// {"ConcaveRaycastDemo",ConcaveRaycastDemo::Create}, + //{"BspDemo", BspDemo::Create}, +// {"Raytracer Test",Raytracer::Create}, +// {"GjkConvexCast",LinearConvexCastDemo::Create}, + {"Benchmark 3000 FALL",BenchmarkDemo1::Create}, + {"Benchmark 1000 STACK",BenchmarkDemo2::Create}, + {"Benchmark 136 RAGDOLLS",BenchmarkDemo3::Create}, + {"Benchmark 1000 CONVEX",BenchmarkDemo4::Create}, + {"Benchmark Mesh-Prim",BenchmarkDemo5::Create}, + {"Benchmark Mesh-Convex",BenchmarkDemo6::Create}, + {"Benchmark Raycast",BenchmarkDemo7::Create}, + + {"MemoryLeak Checker",btEmptyDebugDemo::Create}, + {0, 0} +}; + + diff --git a/BulletPhysics/bulletTrunk/Demos/AllBulletDemos/DemoEntries.h b/BulletPhysics/bulletTrunk/Demos/AllBulletDemos/DemoEntries.h new file mode 100644 index 00000000..41fd8571 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/AllBulletDemos/DemoEntries.h @@ -0,0 +1,34 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef BT_DEMO_ENTRIES_H +#define BT_DEMO_ENTRIES_H + + +class DemoApplication; + +typedef DemoApplication* DemoCreateFcn(); + +struct btDemoEntry +{ + const char *name; + DemoCreateFcn *createFcn; +}; + +extern btDemoEntry g_demoEntries[]; + + + +#endif //BT_DEMO_ENTRIES_H diff --git a/BulletPhysics/bulletTrunk/Demos/AllBulletDemos/Jamfile b/BulletPhysics/bulletTrunk/Demos/AllBulletDemos/Jamfile new file mode 100644 index 00000000..8aa7dd02 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/AllBulletDemos/Jamfile @@ -0,0 +1,24 @@ +SubDir TOP Demos AllBulletDemos ; + +FrameWorkDemo AllBulletDemos : +[ Wildcard *.h *.cpp ] + ../CcdPhysicsDemo/CcdPhysicsDemo.cpp + ../BasicDemo/BasicDemo.cpp + ../Benchmarks/BenchmarkDemo.cpp + ../BspDemo/BspDemo.cpp + ../BspDemo/BspConverter.cpp + ../BspDemo/BspLoader.cpp + ../DynamicControlDemo/MotorDemo.cpp + ../ConcaveDemo/ConcavePhysicsDemo.cpp + ../ConcaveRaycastDemo/ConcaveRaycastDemo.cpp + ../ConcaveConvexcastDemo/ConcaveConvexcastDemo.cpp + ../ConvexDecompositionDemo/ConvexDecompositionDemo.cpp + ../RagdollDemo/RagdollDemo.cpp + ../SliderConstraintDemo/SliderConstraintDemo.cpp + ../GimpactTestDemo/GimpactTestDemo.cpp + ../Raytracer/Raytracer.cpp + ../GjkConvexCastDemo/LinearConvexCastDemo.cpp + ../ForkLiftDemo/ForkLiftDemo.cpp + ../SoftDemo/SoftDemo.cpp + ../ConstraintDemo/ConstraintDemo.cpp +; diff --git a/BulletPhysics/bulletTrunk/Demos/AllBulletDemos/Main.cpp b/BulletPhysics/bulletTrunk/Demos/AllBulletDemos/Main.cpp new file mode 100644 index 00000000..4df1737a --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/AllBulletDemos/Main.cpp @@ -0,0 +1,534 @@ +/* +* Copyright (c) 2006-2007 Erin Catto http://www.gphysics.com +* +* This software is provided 'as-is', without any express or implied +* warranty. In no event will the authors be held liable for any damages +* arising from the use of this software. +* Permission is granted to anyone to use this software for any purpose, +* including commercial applications, and to alter it and redistribute it +* freely, subject to the following restrictions: +* 1. The origin of this software must not be misrepresented; you must not +* claim that you wrote the original software. If you use this software +* in a product, an acknowledgment in the product documentation would be +* appreciated but is not required. +* 2. Altered source versions must be plainly marked as such, and must not be +* misrepresented as being the original software. +* 3. This notice may not be removed or altered from any source distribution. +*/ + +#include + +#include "glui/GL/glui.h" +#include "LinearMath/btScalar.h" +#include "LinearMath/btMinMax.h" +#include "BulletDynamics/ConstraintSolver/btSequentialImpulseConstraintSolver.h" +#include "DemoApplication.h" +#include "DemoEntries.h" +#include "BulletDynamics/Dynamics/btDiscreteDynamicsWorld.h" + +#include "GLDebugDrawer.h" + +#include "LinearMath/btQuickprof.h" + + + +namespace +{ + int testIndex=1; + int testSelection=0; + btDemoEntry* entry; + DemoApplication* demo; + int iterationCount; + int width; + int height; + int framePeriod;//todo: test if this value should be 0 + int mainWindow; + GLUI *glui; + float hz; + float viewZoom=20.f; + float viewX; + float viewY; + int tx, ty, tw, th; + int gDrawAabb; + int gWireFrame; + int gHelpText; + int gDebugConstraints; + int gDebugContacts; + int gDrawTextures=1; + int gDrawShadows=0; + int gDrawClusters=0; + int gDebugNoDeactivation; + int gUseWarmstarting; + int gRandomizeConstraints; + int gUseSplitImpulse; + float gErp; + float gSlop; + float gErp2; + float gWarmStartingParameter; +} + + + +void setDefaultSettings() +{ + viewX = 0.0f; + viewY = 0.0f; + framePeriod = 6;//16;//16;//todo: test if this value should be 0 + + width = 800;//640; + height = 600;//1024;//480; + iterationCount = 10; + gDrawAabb=0; + gWireFrame=0; + gDebugContacts=0; + //enable constraint debug visualization for first demo, only if user hasn't overridden the setting + if (testSelection>1) + { + gDebugConstraints=0; + } else + { + gDebugConstraints=1; + } + gHelpText = 0; + gDrawTextures=1; + gDrawShadows=0; + gDrawClusters=0; + + gDebugNoDeactivation = 0; + gUseSplitImpulse = 0; + gUseWarmstarting = 1; + gRandomizeConstraints = 1; + gErp = 0.2f; + gSlop=0.0f; + gErp2 = 0.1f; + gWarmStartingParameter = 0.85f; + +} + +void setDefaultSettingsAndSync() +{ + setDefaultSettings(); + glui->sync_live(); +} + + +void TogglePause() +{ + if (demo) + demo->toggleIdle(); +} + +void ResetScene() +{ + if (demo) + demo->clientResetScene(); +} + +void NextScene() +{ + testSelection++; + if (testSelection>1) + { + gDebugConstraints=0; + } else + { + gDebugConstraints=1; + } + + if(testSelection>23) + testSelection=0; + if (glui) + glui->sync_live(); +} + + +void SingleSimulationStep() +{ + if (demo) + demo->clientMoveAndDisplay(); +} + + +void Resize(int w, int h) +{ + width = w; + height = h; + + GLUI_Master.get_viewport_area( &tx, &ty, &tw, &th ); + glViewport( tx, ty, tw, th ); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + if (demo) + demo->reshape(tw, th); +} + +DemoApplication* CreatDemo(btDemoEntry* entry) +{ + DemoApplication* demo = entry->createFcn(); + btAssert(demo); + if (demo->getDynamicsWorld()) + { + demo->getDynamicsWorld()->setDebugDrawer(new GLDebugDrawer()); + gDrawTextures = demo->getTexturing(); + gDrawShadows = demo->getShadows(); + if (glui) + glui->sync_live(); + } + +#ifndef BT_NO_PROFILE + CProfileManager::Reset(); +#endif //BT_NO_PROFILE + + return demo; + +} + +/*b2Vec2 ConvertScreenToWorld(int x, int y) +{ + b2Vec2 p; + + float ratio = float(tw) / float(th); + float u = x / float(tw); + float v = (th - y) / float(th); + p.x = viewZoom * (viewX - ratio) * (1.0f - u) + viewZoom * (ratio + viewX) * u; + p.y = viewZoom * (viewY - 0.1f) * (1.0f - v) + viewZoom * (viewY + 1.9f) * v; + return p; +} +*/ + +// This is used to control the frame rate (60Hz). +void Timer(int) +{ + glutSetWindow(mainWindow); + glutPostRedisplay(); + glutTimerFunc(framePeriod, Timer, 0); +} + +void SimulationLoop() +{ + Resize(width, height); + + + + if (gDrawAabb) + { + demo->setDebugMode(demo->getDebugMode() |btIDebugDraw::DBG_DrawAabb); + } else + { + demo->setDebugMode(demo->getDebugMode() & (~btIDebugDraw::DBG_DrawAabb)); + } + if (gWireFrame) + { + demo->setDebugMode(demo->getDebugMode() |btIDebugDraw::DBG_DrawWireframe); + } else + { + demo->setDebugMode(demo->getDebugMode() & (~btIDebugDraw::DBG_DrawWireframe)); + + } + if (gHelpText) + { + demo->setDebugMode(demo->getDebugMode() & (~btIDebugDraw::DBG_NoHelpText)); + } else + { + demo->setDebugMode(demo->getDebugMode() |btIDebugDraw::DBG_NoHelpText); + } + if (gDebugConstraints) + { + demo->setDebugMode(demo->getDebugMode() |btIDebugDraw::DBG_DrawConstraints+btIDebugDraw::DBG_DrawConstraintLimits); + } else + { + demo->setDebugMode(demo->getDebugMode() & (~btIDebugDraw::DBG_DrawConstraints+btIDebugDraw::DBG_DrawConstraintLimits)); + } + if (gDebugContacts) + { + demo->setDebugMode(demo->getDebugMode() |btIDebugDraw::DBG_DrawContactPoints); + } else + { + demo->setDebugMode(demo->getDebugMode() & (~btIDebugDraw::DBG_DrawContactPoints)); + } + + demo->setTexturing(0!=gDrawTextures); + demo->setShadows(0!=gDrawShadows); + demo->setDrawClusters(0!=gDrawClusters); + + if (gDebugNoDeactivation) + { + demo->setDebugMode(demo->getDebugMode() |btIDebugDraw::DBG_NoDeactivation); + } else + { + demo->setDebugMode(demo->getDebugMode() & (~btIDebugDraw::DBG_NoDeactivation)); + } + + + + + if (demo->getDynamicsWorld() && demo->getDynamicsWorld()->getWorldType() == BT_DISCRETE_DYNAMICS_WORLD) + { + btDiscreteDynamicsWorld* discreteWorld = (btDiscreteDynamicsWorld*) demo->getDynamicsWorld(); + discreteWorld->getSolverInfo().m_numIterations = iterationCount; + discreteWorld->getSolverInfo().m_erp = gErp; + discreteWorld->getSolverInfo().m_erp2 = gErp2; + + discreteWorld->getSolverInfo().m_linearSlop = gSlop; + + discreteWorld->getSolverInfo().m_warmstartingFactor = gWarmStartingParameter; + discreteWorld->getSolverInfo().m_splitImpulse = gUseSplitImpulse; + + btSequentialImpulseConstraintSolver* solver = ((btSequentialImpulseConstraintSolver*) discreteWorld->getConstraintSolver()); + + if (gUseWarmstarting) + { + discreteWorld->getSolverInfo().m_solverMode |= SOLVER_USE_WARMSTARTING; + } else + { + discreteWorld->getSolverInfo().m_solverMode &= (~SOLVER_USE_WARMSTARTING); + } + if (gRandomizeConstraints) + { + discreteWorld->getSolverInfo().m_solverMode |= SOLVER_RANDMIZE_ORDER; + } else + { + discreteWorld->getSolverInfo().m_solverMode &= (~SOLVER_RANDMIZE_ORDER); + } + } + + if (!demo->isIdle()) + { + demo->clientMoveAndDisplay(); + + + } + else + { + demo->displayCallback(); + } + if (testSelection != testIndex) + { + if (testSelection>1) + { + gDebugConstraints=0; + } else + { + gDebugConstraints=1; + } + + testIndex = testSelection; + if (demo->getDynamicsWorld() && demo->getDynamicsWorld()->getDebugDrawer()) + delete demo->getDynamicsWorld()->getDebugDrawer(); + delete demo; + entry = g_demoEntries + testIndex; + demo = CreatDemo(entry); + viewZoom = 20.0f; + viewX = 0.0f; + viewY = 0.0f; + Resize(width, height); + } +} + +void RestartScene() +{ + if (demo->getDynamicsWorld() && demo->getDynamicsWorld()->getDebugDrawer()) + delete demo->getDynamicsWorld()->getDebugDrawer(); + delete demo; + entry = g_demoEntries + testIndex; + demo = CreatDemo(entry); + viewZoom = 20.0f; + viewX = 0.0f; + viewY = 0.0f; + Resize(width, height); +} + +void Keyboard(unsigned char key, int x, int y) +{ + + + + + switch (key) + { + case 27: + exit(0); + break; + + // Press 'r' to reset. + case 'r': + if (demo->getDynamicsWorld() && demo->getDynamicsWorld()->getDebugDrawer()) + delete demo->getDynamicsWorld()->getDebugDrawer(); + delete demo; + demo = CreatDemo(entry); + Resize(width,height); + break; + + default: + if (demo) + { + demo->keyboardCallback(key,x,y); + } + } +} + +void KeyboardSpecialUp(int key, int x, int y) +{ + if (demo) + { + demo->specialKeyboardUp(key,x,y); + } + +} + + + + +void KeyboardSpecial(int key, int x, int y) +{ + + if (demo) + { + demo->specialKeyboard(key,x,y); + } + +} + + +void Mouse(int button, int state, int x, int y) +{ + if (demo) + demo->mouseFunc(button,state,x,y); +} + +void MouseMotion(int x, int y) +{ + demo->mouseMotionFunc(x,y); +} + +#ifdef BT_USE_FREEGLUT +#include "GL/freeglut_ext.h" +#endif + +int main(int argc, char** argv) +{ + +//#define CHECK_FPU_EXCEPTIONS 1 +#ifdef CHECK_FPU_EXCEPTIONS + + int cw = _control87(0, 0); + + // Set the exception masks off, turn exceptions on + cw &= ~(EM_ZERODIVIDE | EM_INVALID); + + printf("control87 = %#x\n", cw); + + // Set the control word + _control87(cw, MCW_EM); +#endif //CHECK_FPU_EXCEPTIONS + + + setDefaultSettings(); + + int bulletVersion = btGetVersion(); + printf("Bullet version %d\n",bulletVersion); + + glutInit(&argc, argv); + glutInitDisplayMode(GLUT_RGBA | GLUT_DOUBLE |GLUT_DEPTH | GLUT_STENCIL); + glutInitWindowSize(width, height); + mainWindow = glutCreateWindow("http://bulletphysics.com"); +#ifdef BT_USE_FREEGLUT + glutSetOption (GLUT_ACTION_ON_WINDOW_CLOSE, GLUT_ACTION_GLUTMAINLOOP_RETURNS); +#endif + entry = g_demoEntries + testIndex; + demo = CreatDemo(entry); + + glutDisplayFunc(SimulationLoop); + GLUI_Master.set_glutReshapeFunc(Resize); + GLUI_Master.set_glutKeyboardFunc(Keyboard); + GLUI_Master.set_glutSpecialFunc(KeyboardSpecial); + GLUI_Master.set_glutSpecialUpFunc(KeyboardSpecialUp); + GLUI_Master.set_glutMouseFunc(Mouse); + glutMotionFunc(MouseMotion); + + + glui = GLUI_Master.create_glui_subwindow( mainWindow, + GLUI_SUBWINDOW_RIGHT ); + + + + glui->add_statictext("Tests"); + GLUI_Listbox* testList = + glui->add_listbox("", &testSelection); + glui->add_button("Next Scene", 0,(GLUI_Update_CB)NextScene); + + glui->add_separator(); + + GLUI_Spinner* iterationSpinner = + glui->add_spinner("Iterations", GLUI_SPINNER_INT, &iterationCount); + iterationSpinner->set_int_limits(1, 250); + +/* GLUI_Spinner* hertzSpinner = + glui->add_spinner("Hertz", GLUI_SPINNER_FLOAT, &hz); + hertzSpinner->set_float_limits(5.0f, 200.0f); +*/ + + + glui->add_checkbox("DisableDeactivation", &gDebugNoDeactivation); + glui->add_checkbox("Split Impulse", &gUseSplitImpulse); + GLUI_Spinner* spinner = 0; + + spinner = glui->add_spinner("ERP", GLUI_SPINNER_FLOAT, &gErp); +// spinner->set_float_limits(0.f,1.f); +// spinner = glui->add_spinner("ERP2", GLUI_SPINNER_FLOAT, &gErp2); + spinner->set_float_limits(0.f,1.f); + spinner = glui->add_spinner("Slop", GLUI_SPINNER_FLOAT, &gSlop); + spinner->set_float_limits(0.f,1.f); +// spinner = glui->add_spinner("WSP", GLUI_SPINNER_FLOAT,&gWarmStartingParameter); +// spinner->set_float_limits (0.f,1.0); + glui->add_checkbox("Warmstarting", &gUseWarmstarting); + glui->add_checkbox("Randomize Constraints", &gRandomizeConstraints); + + + glui->add_button("Reset Defaults", 0,(GLUI_Update_CB)setDefaultSettingsAndSync); + glui->add_separator(); + + GLUI_Panel* drawPanel = glui->add_panel("Debug Draw"); + + + glui->add_checkbox_to_panel(drawPanel, "Help", &gHelpText); + glui->add_checkbox_to_panel(drawPanel, "AABBs", &gDrawAabb); + glui->add_checkbox_to_panel(drawPanel, "Wireframe", &gWireFrame); + glui->add_checkbox_to_panel(drawPanel, "Contacts", &gDebugContacts); + glui->add_checkbox_to_panel(drawPanel, "Constraints", &gDebugConstraints); + + glui->add_checkbox_to_panel(drawPanel, "Textures", &gDrawTextures); + glui->add_checkbox_to_panel(drawPanel, "Shadows", &gDrawShadows); + glui->add_checkbox_to_panel(drawPanel, "Clusters", &gDrawClusters); + + int testCount = 0; + btDemoEntry* e = g_demoEntries; + while (e->createFcn) + { + testList->add_item(testCount, e->name); + ++testCount; + ++e; + } + + glui->add_separator(); + + glui->add_button("Toggle Pause", 0,(GLUI_Update_CB)TogglePause); + + glui->add_button("Single Step", 0,(GLUI_Update_CB)SingleSimulationStep); + glui->add_button("Reset Scene", 0,(GLUI_Update_CB)ResetScene); + glui->add_button("Restart Scene", 0,(GLUI_Update_CB)RestartScene); + + glui->add_separator(); + +// glui->add_button("Exit", 0,(GLUI_Update_CB)exit); + + glui->set_main_gfx_window( mainWindow ); + + // Use a timer to control the frame rate. + glutTimerFunc(framePeriod, Timer, 0); + + glutMainLoop(); + + return 0; +} diff --git a/BulletPhysics/bulletTrunk/Demos/AllBulletDemos/Makefile.am b/BulletPhysics/bulletTrunk/Demos/AllBulletDemos/Makefile.am new file mode 100644 index 00000000..e9441266 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/AllBulletDemos/Makefile.am @@ -0,0 +1,35 @@ +noinst_PROGRAMS=AllBulletDemo + +AllBulletDemo_SOURCES=\ + ../SoftDemo/SoftDemo.cpp \ + ../Benchmarks/BenchmarkDemo.cpp \ + ../ConstraintDemo/ConstraintDemo.cpp \ + ../ForkLiftDemo/ForkLiftDemo.cpp \ + ../RagdollDemo/RagdollDemo.cpp \ + ../BasicDemo/BasicDemo.cpp \ + ../CcdPhysicsDemo/CcdPhysicsDemo.cpp \ + ../SliderConstraintDemo/SliderConstraintDemo.cpp \ + ../ConcaveRaycastDemo/ConcaveRaycastDemo.cpp \ + ../Raytracer/Raytracer.cpp \ + ../BspDemo/BspDemo.cpp \ + ../BspDemo/BspLoader.cpp \ + ../BspDemo/BspConverter.cpp \ + ../ConcaveConvexcastDemo/ConcaveConvexcastDemo.cpp \ + ../ConvexDecompositionDemo/ConvexDecompositionDemo.cpp \ + ../GimpactTestDemo/GimpactTestDemo.cpp \ + ../GjkConvexCastDemo/LinearConvexCastDemo.cpp \ + ../ConcaveDemo/ConcavePhysicsDemo.cpp \ + ../DynamicControlDemo/MotorDemo.cpp \ + DemoEntries.cpp \ + DemoEntries.h\ + Main.cpp +AllBulletDemo_CXXFLAGS=\ + -I@top_builddir@/src \ + -I@top_builddir@/Extras/GIMPACTUtils \ + -I@top_builddir@/Extras/ConvexDecomposition \ + -I@top_builddir@/Extras \ + -I@top_builddir@/Demos/OpenGL \ + -I@top_builddir@/Demos/SoftDemo \ + -I@top_builddir@/Demos/Benchmarks \ + $(CXXFLAGS) +AllBulletDemo_LDADD=-L../OpenGL -lbulletopenglsupport -L../../src -L../../Extras -lgimpactutils -lconvexdecomposition -lbulletsoftbody -lbulletdynamics -lbulletcollision -lbulletmath -lglui @opengl_LIBS@ diff --git a/BulletPhysics/bulletTrunk/Demos/BasicDemo/BasicDemo.cpp b/BulletPhysics/bulletTrunk/Demos/BasicDemo/BasicDemo.cpp new file mode 100644 index 00000000..73224a50 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/BasicDemo/BasicDemo.cpp @@ -0,0 +1,233 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + + +///create 125 (5x5x5) dynamic object +#define ARRAY_SIZE_X 5 +#define ARRAY_SIZE_Y 5 +#define ARRAY_SIZE_Z 5 + +//maximum number of objects (and allow user to shoot additional boxes) +#define MAX_PROXIES (ARRAY_SIZE_X*ARRAY_SIZE_Y*ARRAY_SIZE_Z + 1024) + +///scaling of the objects (0.1 = 20 centimeter boxes ) +#define SCALING 1. +#define START_POS_X -5 +#define START_POS_Y -5 +#define START_POS_Z -3 + +#include "BasicDemo.h" +#include "GlutStuff.h" +///btBulletDynamicsCommon.h is the main Bullet include file, contains most common include files. +#include "btBulletDynamicsCommon.h" +#include //printf debugging + + +void BasicDemo::clientMoveAndDisplay() +{ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + //simple dynamics world doesn't handle fixed-time-stepping + float ms = getDeltaTimeMicroseconds(); + + ///step the simulation + if (m_dynamicsWorld) + { + m_dynamicsWorld->stepSimulation(ms / 1000000.f); + //optional but useful: debug drawing + m_dynamicsWorld->debugDrawWorld(); + } + + renderme(); + + glFlush(); + + glutSwapBuffers(); + +} + + + +void BasicDemo::displayCallback(void) { + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + renderme(); + + //optional but useful: debug drawing to detect problems + if (m_dynamicsWorld) + m_dynamicsWorld->debugDrawWorld(); + + glFlush(); + glutSwapBuffers(); +} + + + + + +void BasicDemo::initPhysics() +{ + setTexturing(true); + setShadows(true); + + setCameraDistance(btScalar(SCALING*50.)); + + ///collision configuration contains default setup for memory, collision setup + m_collisionConfiguration = new btDefaultCollisionConfiguration(); + //m_collisionConfiguration->setConvexConvexMultipointIterations(); + + ///use the default collision dispatcher. For parallel processing you can use a diffent dispatcher (see Extras/BulletMultiThreaded) + m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); + + m_broadphase = new btDbvtBroadphase(); + + ///the default constraint solver. For parallel processing you can use a different solver (see Extras/BulletMultiThreaded) + btSequentialImpulseConstraintSolver* sol = new btSequentialImpulseConstraintSolver; + m_solver = sol; + + m_dynamicsWorld = new btDiscreteDynamicsWorld(m_dispatcher,m_broadphase,m_solver,m_collisionConfiguration); + + m_dynamicsWorld->setGravity(btVector3(0,-10,0)); + + ///create a few basic rigid bodies + btCollisionShape* groundShape = new btBoxShape(btVector3(btScalar(50.),btScalar(50.),btScalar(50.))); +// btCollisionShape* groundShape = new btStaticPlaneShape(btVector3(0,1,0),50); + + m_collisionShapes.push_back(groundShape); + + btTransform groundTransform; + groundTransform.setIdentity(); + groundTransform.setOrigin(btVector3(0,-50,0)); + + //We can also use DemoApplication::localCreateRigidBody, but for clarity it is provided here: + { + btScalar mass(0.); + + //rigidbody is dynamic if and only if mass is non zero, otherwise static + bool isDynamic = (mass != 0.f); + + btVector3 localInertia(0,0,0); + if (isDynamic) + groundShape->calculateLocalInertia(mass,localInertia); + + //using motionstate is recommended, it provides interpolation capabilities, and only synchronizes 'active' objects + btDefaultMotionState* myMotionState = new btDefaultMotionState(groundTransform); + btRigidBody::btRigidBodyConstructionInfo rbInfo(mass,myMotionState,groundShape,localInertia); + btRigidBody* body = new btRigidBody(rbInfo); + + //add the body to the dynamics world + m_dynamicsWorld->addRigidBody(body); + } + + + { + //create a few dynamic rigidbodies + // Re-using the same collision is better for memory usage and performance + + btCollisionShape* colShape = new btBoxShape(btVector3(SCALING*1,SCALING*1,SCALING*1)); + //btCollisionShape* colShape = new btSphereShape(btScalar(1.)); + m_collisionShapes.push_back(colShape); + + /// Create Dynamic Objects + btTransform startTransform; + startTransform.setIdentity(); + + btScalar mass(1.f); + + //rigidbody is dynamic if and only if mass is non zero, otherwise static + bool isDynamic = (mass != 0.f); + + btVector3 localInertia(0,0,0); + if (isDynamic) + colShape->calculateLocalInertia(mass,localInertia); + + float start_x = START_POS_X - ARRAY_SIZE_X/2; + float start_y = START_POS_Y; + float start_z = START_POS_Z - ARRAY_SIZE_Z/2; + + for (int k=0;ksetContactProcessingThreshold(colShape->getContactBreakingThreshold()); + body->setActivationState(ISLAND_SLEEPING); + + m_dynamicsWorld->addRigidBody(body); + body->setActivationState(ISLAND_SLEEPING); + } + } + } + } + + + clientResetScene(); +} + + +void BasicDemo::exitPhysics() +{ + + //cleanup in the reverse order of creation/initialization + + //remove the rigidbodies from the dynamics world and delete them + int i; + for (i=m_dynamicsWorld->getNumCollisionObjects()-1; i>=0 ;i--) + { + btCollisionObject* obj = m_dynamicsWorld->getCollisionObjectArray()[i]; + btRigidBody* body = btRigidBody::upcast(obj); + if (body && body->getMotionState()) + { + delete body->getMotionState(); + } + m_dynamicsWorld->removeCollisionObject( obj ); + delete obj; + } + + //delete collision shapes + for (int j=0;j m_collisionShapes; + + btBroadphaseInterface* m_broadphase; + + btCollisionDispatcher* m_dispatcher; + + btConstraintSolver* m_solver; + + btDefaultCollisionConfiguration* m_collisionConfiguration; + + public: + + BasicDemo() + { + } + virtual ~BasicDemo() + { + exitPhysics(); + } + void initPhysics(); + + void exitPhysics(); + + virtual void clientMoveAndDisplay(); + + virtual void displayCallback(); + + static DemoApplication* Create() + { + BasicDemo* demo = new BasicDemo; + demo->myinit(); + demo->initPhysics(); + return demo; + } + + +}; + +#endif //BASIC_DEMO_H + diff --git a/BulletPhysics/bulletTrunk/Demos/BasicDemo/CMakeLists.txt b/BulletPhysics/bulletTrunk/Demos/BasicDemo/CMakeLists.txt new file mode 100644 index 00000000..32baf8b8 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/BasicDemo/CMakeLists.txt @@ -0,0 +1,26 @@ +# This is basically the overall name of the project in Visual Studio this is the name of the Solution File + + +# For every executable you have with a main method you should have an add_executable line below. +# For every add executable line you should list every .cpp and .h file you have associated with that executable. + + +# This is the variable for Windows. I use this to define the root of my directory structure. +SET(GLUT_ROOT ${BULLET_PHYSICS_SOURCE_DIR}/Glut) + +# You shouldn't have to modify anything below this line +######################################################## + +INCLUDE_DIRECTORIES( +${BULLET_PHYSICS_SOURCE_DIR}/src ${BULLET_PHYSICS_SOURCE_DIR}/Demos/OpenGL } +) + +LINK_LIBRARIES( +OpenGLSupport BulletDynamics BulletCollision LinearMath ${GLUT_glut_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} +) + +ADD_EXECUTABLE(AppBasicDemo + main.cpp + BasicDemo.cpp +) + diff --git a/BulletPhysics/bulletTrunk/Demos/BasicDemo/Jamfile b/BulletPhysics/bulletTrunk/Demos/BasicDemo/Jamfile new file mode 100644 index 00000000..3584562d --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/BasicDemo/Jamfile @@ -0,0 +1,3 @@ +SubDir TOP Demos BasicDemo ; + +BulletDemo BasicDemo : [ Wildcard *.h *.cpp ] ; diff --git a/BulletPhysics/bulletTrunk/Demos/BasicDemo/Makefile.am b/BulletPhysics/bulletTrunk/Demos/BasicDemo/Makefile.am new file mode 100644 index 00000000..71a2a284 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/BasicDemo/Makefile.am @@ -0,0 +1,5 @@ +noinst_PROGRAMS=BasicDemo + +BasicDemo_SOURCES=BasicDemo.cpp BasicDemo.h main.cpp +BasicDemo_CXXFLAGS=-I@top_builddir@/src -I@top_builddir@/Demos/OpenGL $(CXXFLAGS) +BasicDemo_LDADD=-L../OpenGL -lbulletopenglsupport -L../../src -lbulletdynamics -lbulletcollision -lbulletmath @opengl_LIBS@ diff --git a/BulletPhysics/bulletTrunk/Demos/BasicDemo/Makefile.original b/BulletPhysics/bulletTrunk/Demos/BasicDemo/Makefile.original new file mode 100644 index 00000000..53d3eaeb --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/BasicDemo/Makefile.original @@ -0,0 +1,49 @@ +__ARCH_BITS__ := 32 + +# define macros +RM=rm -f +OUTDIR=. +CELLSDKDIR=/opt/ibm/cell-sdk +ARCHITECTUREFLAG=-m$(__ARCH_BITS__) +USE_CESOF=1 +ifeq "$(__ARCH_BITS__)" "64" + DEFFLAGS= -DUSE_LIBSPE2 -DUSE_ADDR64 -DUSE_PARALLEL_DISPATCHER + GCC=ppu-g++ +else + DEFFLAGS= -DUSE_LIBSPE2 -DUSE_PARALLEL_DISPATCHER + GCC=ppu32-g++ +endif +DEBUGFLAG= +ifeq "$(USE_CESOF)" "1" + CFLAGS= $(ARCHITECTUREFLAG) $(DEBUGFLAG) -DUSE_CESOF -W -Wall -Winline -O3 -mabi=altivec -maltivec -include altivec.h -include stdbool.h -c +else + CFLAGS= $(ARCHITECTUREFLAG) $(DEBUGFLAG) -W -Wall -Winline -O3 -mabi=altivec -maltivec -include altivec.h -include stdbool.h -c +endif +INCLUDEDIR= -I. -I$(CELLSDKDIR)/prototype/sysroot/usr/include -I../../src -I../OpenGL +LFLAGS= $(ARCHITECTUREFLAG) -Wl,-m,elf$(__ARCH_BITS__)ppc +ifeq "$(USE_CESOF)" "1" + LIBRARIES= -lstdc++ -lsupc++ -lgcc -lgcov -lspe2 -lpthread -L../../out/linuxppc/optimize/libs \ + -lbulletmultithreaded -lspu -lbulletdynamics -lbulletcollision -lbulletmath \ + -L$(CELLSDKDIR)/prototype/sysroot/usr/lib$(__ARCH_BITS__) -R$(CELLSDKDIR)/prototype/sysroot/usr/lib +else + LIBRARIES= -lstdc++ -lsupc++ -lgcc -lgcov -lspe2 -lpthread -L../../out/linuxppc/optimize/libs \ + -lbulletmultithreaded -lbulletdynamics -lbulletcollision -lbulletmath \ + -L$(CELLSDKDIR)/prototype/sysroot/usr/lib$(__ARCH_BITS__) -R$(CELLSDKDIR)/prototype/sysroot/usr/lib +endif + +DemoApplication : + $(GCC) $(DEFFLAGS) $(CFLAGS) $(INCLUDEDIR) -o $(OUTDIR)/$@.o ../OpenGL/$@.cpp + + +BasicDemo : DemoApplication + $(GCC) $(DEFFLAGS) $(CFLAGS) $(INCLUDEDIR) -o $(OUTDIR)/$@.o $@.cpp + + + +all : BasicDemo + $(GCC) -o$(OUTDIR)/BasicDemo $(OUTDIR)/BasicDemo.o $(OUTDIR)/DemoApplication.o $(LFLAGS) $(LIBRARIES) + + +clean : + $(RM) $(OUTDIR)/BasicDemo ; $(RM) $(OUTDIR)/BasicDemo.o ; $(RM) $(OUTDIR)/DemoApplication.o + diff --git a/BulletPhysics/bulletTrunk/Demos/BasicDemo/main.cpp b/BulletPhysics/bulletTrunk/Demos/BasicDemo/main.cpp new file mode 100644 index 00000000..2773a655 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/BasicDemo/main.cpp @@ -0,0 +1,89 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2007 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#include "BasicDemo.h" +#include "GlutStuff.h" +#include "GLDebugDrawer.h" +#include "btBulletDynamicsCommon.h" +#include "LinearMath/btHashMap.h" + +class OurValue + { + int m_uid; + + public: + OurValue(const btVector3& initialPos) + :m_position(initialPos) + { + static int gUid=0; + m_uid=gUid; + gUid++; + } + + btVector3 m_position; + int getUid() const + { + return m_uid; + } + }; + + +int main(int argc,char** argv) +{ + GLDebugDrawer gDebugDrawer; + + ///testing the btHashMap + btHashMap,OurValue> map; + + OurValue value1(btVector3(2,3,4)); + btHashKey key1(value1.getUid()); + map.insert(key1,value1); + + + OurValue value2(btVector3(5,6,7)); + btHashKey key2(value2.getUid()); + map.insert(key2,value2); + + + { + OurValue value3(btVector3(7,8,9)); + btHashKey key3(value3.getUid()); + map.insert(key3,value3); + } + + + map.remove(key2); + + const OurValue* ourPtr = map.find(key1); + for (int i=0;im_position.getX(),tmp->m_position.getY(),tmp->m_position.getZ()); + } + + BasicDemo ccdDemo; + ccdDemo.initPhysics(); + ccdDemo.getDynamicsWorld()->setDebugDrawer(&gDebugDrawer); + + +#ifdef CHECK_MEMORY_LEAKS + ccdDemo.exitPhysics(); +#else + return glutmain(argc, argv,640,480,"Bullet Physics Demo. http://bulletphysics.com",&ccdDemo); +#endif + + //default glut doesn't return from mainloop + return 0; +} \ No newline at end of file diff --git a/BulletPhysics/bulletTrunk/Demos/Benchmarks/BenchmarkDemo.cpp b/BulletPhysics/bulletTrunk/Demos/Benchmarks/BenchmarkDemo.cpp new file mode 100644 index 00000000..dc731756 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/Benchmarks/BenchmarkDemo.cpp @@ -0,0 +1,1215 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +// Collision Radius +#define COLLISION_RADIUS 0.0f + + + +#include "BenchmarkDemo.h" +#include "GlutStuff.h" +///btBulletDynamicsCommon.h is the main Bullet include file, contains most common include files. +#include "btBulletDynamicsCommon.h" +#include //printf debugging +#include "Taru.mdl" +#include "landscape.mdl" +#include "BulletCollision/BroadphaseCollision/btDbvtBroadphase.h" +#include "BulletMultiThreaded/SpuGatheringCollisionDispatcher.h" +#include "BulletMultiThreaded/SequentialThreadSupport.h" +#include "BulletMultiThreaded/SpuNarrowPhaseCollisionTask/SpuGatheringCollisionTask.h" +#include "BulletCollision/CollisionDispatch/btSimulationIslandManager.h" + + + + +class btRaycastBar2 +{ +public: + btVector3 source[NUMRAYS]; + btVector3 dest[NUMRAYS]; + btVector3 direction[NUMRAYS]; + btVector3 hit[NUMRAYS]; + btVector3 normal[NUMRAYS]; + + int frame_counter; + int ms; + int sum_ms; + int sum_ms_samples; + int min_ms; + int max_ms; + +#ifdef USE_BT_CLOCK + btClock frame_timer; +#endif //USE_BT_CLOCK + + btScalar dx; + btScalar min_x; + btScalar max_x; + btScalar max_y; + btScalar sign; + + btRaycastBar2 () + { + ms = 0; + max_ms = 0; + min_ms = 9999.0; + sum_ms_samples = 0; + sum_ms = 0; + } + + + + btRaycastBar2 (btScalar ray_length, btScalar z,btScalar max_y) + { + frame_counter = 0; + ms = 0; + max_ms = 0; + min_ms = 9999.0; + sum_ms_samples = 0; + sum_ms = 0; + dx = 10.0; + min_x = 0; + max_x = 0; + this->max_y = max_y; + sign = 1.0; + btScalar dalpha = 2*SIMD_2_PI/NUMRAYS; + for (int i = 0; i < NUMRAYS; i++) + { + btScalar alpha = dalpha * i; + // rotate around by alpha degrees y + btQuaternion q(btVector3(0.0, 1.0, 0.0), alpha); + direction[i] = btVector3(1.0, 0.0, 0.0); + direction[i] = quatRotate(q , direction[i]); + direction[i] = direction[i] * ray_length; + + + source[i] = btVector3(min_x, max_y, z); + dest[i] = source[i] + direction[i]; + dest[i][1]=-1000; + normal[i] = btVector3(1.0, 0.0, 0.0); + } + } + + void move (btScalar dt) + { + if (dt > (1.0/60.0)) + dt = 1.0/60.0; + for (int i = 0; i < NUMRAYS; i++) + { + source[i][0] += dx * dt * sign; + dest[i][0] += dx * dt * sign; + } + if (source[0][0] < min_x) + sign = 1.0; + else if (source[0][0] > max_x) + sign = -1.0; + } + + void cast (btCollisionWorld* cw) + { +#ifdef USE_BT_CLOCK + frame_timer.reset (); +#endif //USE_BT_CLOCK + +#ifdef BATCH_RAYCASTER + if (!gBatchRaycaster) + return; + + gBatchRaycaster->clearRays (); + for (int i = 0; i < NUMRAYS; i++) + { + gBatchRaycaster->addRay (source[i], dest[i]); + } + gBatchRaycaster->performBatchRaycast (); + for (int i = 0; i < gBatchRaycaster->getNumRays (); i++) + { + const SpuRaycastTaskWorkUnitOut& out = (*gBatchRaycaster)[i]; + hit[i].setInterpolate3(source[i],dest[i],out.hitFraction); + normal[i] = out.hitNormal; + normal[i].normalize (); + } +#else + for (int i = 0; i < NUMRAYS; i++) + { + btCollisionWorld::ClosestRayResultCallback cb(source[i], dest[i]); + + cw->rayTest (source[i], dest[i], cb); + if (cb.hasHit ()) + { + hit[i] = cb.m_hitPointWorld; + normal[i] = cb.m_hitNormalWorld; + normal[i].normalize (); + } else { + hit[i] = dest[i]; + normal[i] = btVector3(1.0, 0.0, 0.0); + } + + } +#ifdef USE_BT_CLOCK + ms += frame_timer.getTimeMilliseconds (); +#endif //USE_BT_CLOCK + frame_counter++; + if (frame_counter > 50) + { + min_ms = ms < min_ms ? ms : min_ms; + max_ms = ms > max_ms ? ms : max_ms; + sum_ms += ms; + sum_ms_samples++; + btScalar mean_ms = (btScalar)sum_ms/(btScalar)sum_ms_samples; + printf("%d rays in %d ms %d %d %f\n", NUMRAYS * frame_counter, ms, min_ms, max_ms, mean_ms); + ms = 0; + frame_counter = 0; + } +#endif + } + + void draw () + { + glDisable (GL_LIGHTING); + glColor3f (0.0, 1.0, 0.0); + glBegin (GL_LINES); + int i; + + for (i = 0; i < NUMRAYS; i++) + { + glVertex3f (source[i][0], source[i][1], source[i][2]); + glVertex3f (hit[i][0], hit[i][1], hit[i][2]); + } + glEnd (); + glColor3f (1.0, 1.0, 1.0); + glBegin (GL_LINES); + for (i = 0; i < NUMRAYS; i++) + { + glVertex3f (hit[i][0], hit[i][1], hit[i][2]); + glVertex3f (hit[i][0] + normal[i][0], hit[i][1] + normal[i][1], hit[i][2] + normal[i][2]); + } + glEnd (); + glColor3f (0.0, 1.0, 1.0); + glBegin (GL_POINTS); + for ( i = 0; i < NUMRAYS; i++) + { + glVertex3f (hit[i][0], hit[i][1], hit[i][2]); + } + glEnd (); + glEnable (GL_LIGHTING); + } +}; + + +static btRaycastBar2 raycastBar; + + +void BenchmarkDemo::clientMoveAndDisplay() +{ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + //simple dynamics world doesn't handle fixed-time-stepping + float ms = getDeltaTimeMicroseconds(); + + ///step the simulation + if (m_dynamicsWorld) + { + m_dynamicsWorld->stepSimulation(btScalar(1./60.)); + //optional but useful: debug drawing + m_dynamicsWorld->debugDrawWorld(); + } + + if (m_benchmark==7) + { + castRays(); + + raycastBar.draw(); + + } + + renderme(); + + glFlush(); + + glutSwapBuffers(); + +} + + + +void BenchmarkDemo::displayCallback(void) { + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + renderme(); + + //optional but useful: debug drawing to detect problems + if (m_dynamicsWorld) + m_dynamicsWorld->debugDrawWorld(); + + glFlush(); + glutSwapBuffers(); +} + + + + + +void BenchmarkDemo::initPhysics() +{ + + setCameraDistance(btScalar(100.)); + + ///collision configuration contains default setup for memory, collision setup + m_collisionConfiguration = new btDefaultCollisionConfiguration(); + + ///use the default collision dispatcher. For parallel processing you can use a diffent dispatcher (see Extras/BulletMultiThreaded) + m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); + +#if 0 + SequentialThreadSupport::SequentialThreadConstructionInfo sci("spuCD", + processCollisionTask, + createCollisionLocalStoreMemory); + + SequentialThreadSupport* seq = new SequentialThreadSupport(sci); + m_dispatcher = new SpuGatheringCollisionDispatcher(seq,1,m_collisionConfiguration); +#endif + + + ///the maximum size of the collision world. Make sure objects stay within these boundaries + ///Don't make the world AABB size too large, it will harm simulation quality and performance + btVector3 worldAabbMin(-10000,-10000,-10000); + btVector3 worldAabbMax(10000,10000,10000); + + btHashedOverlappingPairCache* pairCache = new btHashedOverlappingPairCache(); + m_overlappingPairCache = new btAxisSweep3(worldAabbMin,worldAabbMax,3500,pairCache); +// m_overlappingPairCache = new btSimpleBroadphase(); +// m_overlappingPairCache = new btDbvtBroadphase(); + + + + ///the default constraint solver. For parallel processing you can use a different solver (see Extras/BulletMultiThreaded) + btSequentialImpulseConstraintSolver* sol = new btSequentialImpulseConstraintSolver; + + m_solver = sol; + + btDiscreteDynamicsWorld* dynamicsWorld; + m_dynamicsWorld = dynamicsWorld = new btDiscreteDynamicsWorld(m_dispatcher,m_overlappingPairCache,m_solver,m_collisionConfiguration); + dynamicsWorld->getSimulationIslandManager()->setSplitIslands(false); + + + m_dynamicsWorld->setGravity(btVector3(0,-10,0)); + + if (m_benchmark<5) + { + ///create a few basic rigid bodies + // btCollisionShape* groundShape = new btBoxShape(btVector3(btScalar(50.),btScalar(50.),btScalar(50.))); + btCollisionShape* groundShape = new btStaticPlaneShape(btVector3(0,1,0),0); + + m_collisionShapes.push_back(groundShape); + + btTransform groundTransform; + groundTransform.setIdentity(); + groundTransform.setOrigin(btVector3(0,0,0)); + + //We can also use DemoApplication::localCreateRigidBody, but for clarity it is provided here: + { + btScalar mass(0.); + + //rigidbody is dynamic if and only if mass is non zero, otherwise static + bool isDynamic = (mass != 0.f); + + btVector3 localInertia(0,0,0); + if (isDynamic) + groundShape->calculateLocalInertia(mass,localInertia); + + //using motionstate is recommended, it provides interpolation capabilities, and only synchronizes 'active' objects + btDefaultMotionState* myMotionState = new btDefaultMotionState(groundTransform); + btRigidBody::btRigidBodyConstructionInfo rbInfo(mass,myMotionState,groundShape,localInertia); + btRigidBody* body = new btRigidBody(rbInfo); + + //add the body to the dynamics world + m_dynamicsWorld->addRigidBody(body); + } + } + + switch (m_benchmark) + { + case 1: + { + createTest1(); + break; + } + case 2: + { + createTest2(); + break; + } + case 3: + { + createTest3(); + break; + } + case 4: + { + createTest4(); + break; + } + case 5: + { + createTest5(); + break; + } + case 6: + { + createTest6(); + break; + } + case 7: + { + createTest7(); + break; + } + + + default: + { + } + } + + + clientResetScene(); +} + + +void BenchmarkDemo::createTest1() +{ + // 3000 + int size = 8; + const float cubeSize = 1.0f; + float spacing = cubeSize; + btVector3 pos(0.0f, cubeSize * 2,0.f); + float offset = -size * (cubeSize * 2.0f + spacing) * 0.5f; + + btBoxShape* blockShape = new btBoxShape(btVector3(cubeSize-COLLISION_RADIUS,cubeSize-COLLISION_RADIUS,cubeSize-COLLISION_RADIUS)); + btVector3 localInertia(0,0,0); + float mass = 2.f; + blockShape->calculateLocalInertia(mass,localInertia); + + btTransform trans; + trans.setIdentity(); + + for(int k=0;k<47;k++) { + for(int j=0;jcalculateLocalInertia(mass,localInertia); + + float diffX = boxSize[0] * 1.0f; + float diffY = boxSize[1] * 1.0f; + float diffZ = boxSize[2] * 1.0f; + + float offset = -stackSize * (diffZ * 2.0f) * 0.5f; + btVector3 pos(0.0f, diffY, 0.0f); + + btTransform trans; + trans.setIdentity(); + + while(stackSize) { + for(int i=0;icalculateLocalInertia(mass,localInertia); + + + float diffX = boxSize[0]; + float diffY = boxSize[1]; + float diffZ = boxSize[2]; + + float offsetX = -stackSize * (diffX * 2.0f + space) * 0.5f; + float offsetZ = -stackSize * (diffZ * 2.0f + space) * 0.5f; + while(stackSize) { + for(int j=0;jlocalCreateRigidBody(mass,trans,blockShape); + + + } + } + offsetX += diffX; + offsetZ += diffZ; + pos[1] += (diffY * 2.0f + space); + stackSize--; + } + +} + + const btVector3 rotate( const btQuaternion& quat, const btVector3 & vec ) +{ + float tmpX, tmpY, tmpZ, tmpW; + tmpX = ( ( ( quat.getW() * vec.getX() ) + ( quat.getY() * vec.getZ() ) ) - ( quat.getZ() * vec.getY() ) ); + tmpY = ( ( ( quat.getW() * vec.getY() ) + ( quat.getZ() * vec.getX() ) ) - ( quat.getX() * vec.getZ() ) ); + tmpZ = ( ( ( quat.getW() * vec.getZ() ) + ( quat.getX() * vec.getY() ) ) - ( quat.getY() * vec.getX() ) ); + tmpW = ( ( ( quat.getX() * vec.getX() ) + ( quat.getY() * vec.getY() ) ) + ( quat.getZ() * vec.getZ() ) ); + return btVector3( + ( ( ( ( tmpW * quat.getX() ) + ( tmpX * quat.getW() ) ) - ( tmpY * quat.getZ() ) ) + ( tmpZ * quat.getY() ) ), + ( ( ( ( tmpW * quat.getY() ) + ( tmpY * quat.getW() ) ) - ( tmpZ * quat.getX() ) ) + ( tmpX * quat.getZ() ) ), + ( ( ( ( tmpW * quat.getZ() ) + ( tmpZ * quat.getW() ) ) - ( tmpX * quat.getY() ) ) + ( tmpY * quat.getX() ) ) + ); +} + +void BenchmarkDemo::createTowerCircle(const btVector3& offsetPosition,int stackSize,int rotSize,const btVector3& boxSize) +{ + + btBoxShape* blockShape = new btBoxShape(btVector3(boxSize[0]-COLLISION_RADIUS,boxSize[1]-COLLISION_RADIUS,boxSize[2]-COLLISION_RADIUS)); + + btTransform trans; + trans.setIdentity(); + + float mass = 1.f; + btVector3 localInertia(0,0,0); + blockShape->calculateLocalInertia(mass,localInertia); + + + float radius = 1.3f * rotSize * boxSize[0] / SIMD_PI; + + // create active boxes + btQuaternion rotY(0,1,0,0); + float posY = boxSize[1]; + + for(int i=0;icalculateLocalInertia(mass,localInertia); + + btDefaultMotionState* myMotionState = new btDefaultMotionState(startTransform); + + btRigidBody::btRigidBodyConstructionInfo rbInfo(mass,myMotionState,shape,localInertia); + btRigidBody* body = new btRigidBody(rbInfo); + + m_ownerWorld->addRigidBody(body); + + return body; + } + +public: + RagDoll (btDynamicsWorld* ownerWorld, const btVector3& positionOffset,btScalar scale) + : m_ownerWorld (ownerWorld) + { + // Setup the geometry + m_shapes[BODYPART_PELVIS] = new btCapsuleShape(btScalar(0.15)*scale, btScalar(0.20)*scale); + m_shapes[BODYPART_SPINE] = new btCapsuleShape(btScalar(0.15)*scale, btScalar(0.28)*scale); + m_shapes[BODYPART_HEAD] = new btCapsuleShape(btScalar(0.10)*scale, btScalar(0.05)*scale); + m_shapes[BODYPART_LEFT_UPPER_LEG] = new btCapsuleShape(btScalar(0.07)*scale, btScalar(0.45)*scale); + m_shapes[BODYPART_LEFT_LOWER_LEG] = new btCapsuleShape(btScalar(0.05)*scale, btScalar(0.37)*scale); + m_shapes[BODYPART_RIGHT_UPPER_LEG] = new btCapsuleShape(btScalar(0.07)*scale, btScalar(0.45)*scale); + m_shapes[BODYPART_RIGHT_LOWER_LEG] = new btCapsuleShape(btScalar(0.05)*scale, btScalar(0.37)*scale); + m_shapes[BODYPART_LEFT_UPPER_ARM] = new btCapsuleShape(btScalar(0.05)*scale, btScalar(0.33)*scale); + m_shapes[BODYPART_LEFT_LOWER_ARM] = new btCapsuleShape(btScalar(0.04)*scale, btScalar(0.25)*scale); + m_shapes[BODYPART_RIGHT_UPPER_ARM] = new btCapsuleShape(btScalar(0.05)*scale, btScalar(0.33)*scale); + m_shapes[BODYPART_RIGHT_LOWER_ARM] = new btCapsuleShape(btScalar(0.04)*scale, btScalar(0.25)*scale); + + // Setup all the rigid bodies + btTransform offset; offset.setIdentity(); + offset.setOrigin(positionOffset); + + btTransform transform; + transform.setIdentity(); + transform.setOrigin(scale*btVector3(btScalar(0.), btScalar(1.), btScalar(0.))); + m_bodies[BODYPART_PELVIS] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_PELVIS]); + + transform.setIdentity(); + transform.setOrigin(scale*btVector3(btScalar(0.), btScalar(1.2), btScalar(0.))); + m_bodies[BODYPART_SPINE] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_SPINE]); + + transform.setIdentity(); + transform.setOrigin(scale*btVector3(btScalar(0.), btScalar(1.6), btScalar(0.))); + m_bodies[BODYPART_HEAD] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_HEAD]); + + transform.setIdentity(); + transform.setOrigin(scale*btVector3(btScalar(-0.18), btScalar(0.65), btScalar(0.))); + m_bodies[BODYPART_LEFT_UPPER_LEG] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_LEFT_UPPER_LEG]); + + transform.setIdentity(); + transform.setOrigin(scale*btVector3(btScalar(-0.18), btScalar(0.2), btScalar(0.))); + m_bodies[BODYPART_LEFT_LOWER_LEG] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_LEFT_LOWER_LEG]); + + transform.setIdentity(); + transform.setOrigin(scale*btVector3(btScalar(0.18), btScalar(0.65), btScalar(0.))); + m_bodies[BODYPART_RIGHT_UPPER_LEG] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_RIGHT_UPPER_LEG]); + + transform.setIdentity(); + transform.setOrigin(scale*btVector3(btScalar(0.18), btScalar(0.2), btScalar(0.))); + m_bodies[BODYPART_RIGHT_LOWER_LEG] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_RIGHT_LOWER_LEG]); + + transform.setIdentity(); + transform.setOrigin(scale*btVector3(btScalar(-0.35), btScalar(1.45), btScalar(0.))); + transform.getBasis().setEulerZYX(0,0,M_PI_2); + m_bodies[BODYPART_LEFT_UPPER_ARM] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_LEFT_UPPER_ARM]); + + transform.setIdentity(); + transform.setOrigin(scale*btVector3(btScalar(-0.7), btScalar(1.45), btScalar(0.))); + transform.getBasis().setEulerZYX(0,0,M_PI_2); + m_bodies[BODYPART_LEFT_LOWER_ARM] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_LEFT_LOWER_ARM]); + + transform.setIdentity(); + transform.setOrigin(scale*btVector3(btScalar(0.35), btScalar(1.45), btScalar(0.))); + transform.getBasis().setEulerZYX(0,0,-M_PI_2); + m_bodies[BODYPART_RIGHT_UPPER_ARM] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_RIGHT_UPPER_ARM]); + + transform.setIdentity(); + transform.setOrigin(scale*btVector3(btScalar(0.7), btScalar(1.45), btScalar(0.))); + transform.getBasis().setEulerZYX(0,0,-M_PI_2); + m_bodies[BODYPART_RIGHT_LOWER_ARM] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_RIGHT_LOWER_ARM]); + + // Setup some damping on the m_bodies + for (int i = 0; i < BODYPART_COUNT; ++i) + { + m_bodies[i]->setDamping(0.05, 0.85); + m_bodies[i]->setDeactivationTime(0.8); + m_bodies[i]->setSleepingThresholds(1.6, 2.5); + } + + // Now setup the constraints + btHingeConstraint* hingeC; + btConeTwistConstraint* coneC; + + btTransform localA, localB; + + localA.setIdentity(); localB.setIdentity(); + localA.getBasis().setEulerZYX(0,M_PI_2,0); localA.setOrigin(scale*btVector3(btScalar(0.), btScalar(0.15), btScalar(0.))); + localB.getBasis().setEulerZYX(0,M_PI_2,0); localB.setOrigin(scale*btVector3(btScalar(0.), btScalar(-0.15), btScalar(0.))); + hingeC = new btHingeConstraint(*m_bodies[BODYPART_PELVIS], *m_bodies[BODYPART_SPINE], localA, localB); + hingeC->setLimit(btScalar(-M_PI_4), btScalar(M_PI_2)); + m_joints[JOINT_PELVIS_SPINE] = hingeC; + m_ownerWorld->addConstraint(m_joints[JOINT_PELVIS_SPINE], true); + + + localA.setIdentity(); localB.setIdentity(); + localA.getBasis().setEulerZYX(0,0,M_PI_2); localA.setOrigin(scale*btVector3(btScalar(0.), btScalar(0.30), btScalar(0.))); + localB.getBasis().setEulerZYX(0,0,M_PI_2); localB.setOrigin(scale*btVector3(btScalar(0.), btScalar(-0.14), btScalar(0.))); + coneC = new btConeTwistConstraint(*m_bodies[BODYPART_SPINE], *m_bodies[BODYPART_HEAD], localA, localB); + coneC->setLimit(M_PI_4, M_PI_4, M_PI_2); + m_joints[JOINT_SPINE_HEAD] = coneC; + m_ownerWorld->addConstraint(m_joints[JOINT_SPINE_HEAD], true); + + + localA.setIdentity(); localB.setIdentity(); + localA.getBasis().setEulerZYX(0,0,-M_PI_4*5); localA.setOrigin(scale*btVector3(btScalar(-0.18), btScalar(-0.10), btScalar(0.))); + localB.getBasis().setEulerZYX(0,0,-M_PI_4*5); localB.setOrigin(scale*btVector3(btScalar(0.), btScalar(0.225), btScalar(0.))); + coneC = new btConeTwistConstraint(*m_bodies[BODYPART_PELVIS], *m_bodies[BODYPART_LEFT_UPPER_LEG], localA, localB); + coneC->setLimit(M_PI_4, M_PI_4, 0); + m_joints[JOINT_LEFT_HIP] = coneC; + m_ownerWorld->addConstraint(m_joints[JOINT_LEFT_HIP], true); + + localA.setIdentity(); localB.setIdentity(); + localA.getBasis().setEulerZYX(0,M_PI_2,0); localA.setOrigin(scale*btVector3(btScalar(0.), btScalar(-0.225), btScalar(0.))); + localB.getBasis().setEulerZYX(0,M_PI_2,0); localB.setOrigin(scale*btVector3(btScalar(0.), btScalar(0.185), btScalar(0.))); + hingeC = new btHingeConstraint(*m_bodies[BODYPART_LEFT_UPPER_LEG], *m_bodies[BODYPART_LEFT_LOWER_LEG], localA, localB); + hingeC->setLimit(btScalar(0), btScalar(M_PI_2)); + m_joints[JOINT_LEFT_KNEE] = hingeC; + m_ownerWorld->addConstraint(m_joints[JOINT_LEFT_KNEE], true); + + + localA.setIdentity(); localB.setIdentity(); + localA.getBasis().setEulerZYX(0,0,M_PI_4); localA.setOrigin(scale*btVector3(btScalar(0.18), btScalar(-0.10), btScalar(0.))); + localB.getBasis().setEulerZYX(0,0,M_PI_4); localB.setOrigin(scale*btVector3(btScalar(0.), btScalar(0.225), btScalar(0.))); + coneC = new btConeTwistConstraint(*m_bodies[BODYPART_PELVIS], *m_bodies[BODYPART_RIGHT_UPPER_LEG], localA, localB); + coneC->setLimit(M_PI_4, M_PI_4, 0); + m_joints[JOINT_RIGHT_HIP] = coneC; + m_ownerWorld->addConstraint(m_joints[JOINT_RIGHT_HIP], true); + + localA.setIdentity(); localB.setIdentity(); + localA.getBasis().setEulerZYX(0,M_PI_2,0); localA.setOrigin(scale*btVector3(btScalar(0.), btScalar(-0.225), btScalar(0.))); + localB.getBasis().setEulerZYX(0,M_PI_2,0); localB.setOrigin(scale*btVector3(btScalar(0.), btScalar(0.185), btScalar(0.))); + hingeC = new btHingeConstraint(*m_bodies[BODYPART_RIGHT_UPPER_LEG], *m_bodies[BODYPART_RIGHT_LOWER_LEG], localA, localB); + hingeC->setLimit(btScalar(0), btScalar(M_PI_2)); + m_joints[JOINT_RIGHT_KNEE] = hingeC; + m_ownerWorld->addConstraint(m_joints[JOINT_RIGHT_KNEE], true); + + + localA.setIdentity(); localB.setIdentity(); + localA.getBasis().setEulerZYX(0,0,M_PI); localA.setOrigin(scale*btVector3(btScalar(-0.2), btScalar(0.15), btScalar(0.))); + localB.getBasis().setEulerZYX(0,0,M_PI_2); localB.setOrigin(scale*btVector3(btScalar(0.), btScalar(-0.18), btScalar(0.))); + coneC = new btConeTwistConstraint(*m_bodies[BODYPART_SPINE], *m_bodies[BODYPART_LEFT_UPPER_ARM], localA, localB); + coneC->setLimit(M_PI_2, M_PI_2, 0); + m_joints[JOINT_LEFT_SHOULDER] = coneC; + m_ownerWorld->addConstraint(m_joints[JOINT_LEFT_SHOULDER], true); + + localA.setIdentity(); localB.setIdentity(); + localA.getBasis().setEulerZYX(0,M_PI_2,0); localA.setOrigin(scale*btVector3(btScalar(0.), btScalar(0.18), btScalar(0.))); + localB.getBasis().setEulerZYX(0,M_PI_2,0); localB.setOrigin(scale*btVector3(btScalar(0.), btScalar(-0.14), btScalar(0.))); + hingeC = new btHingeConstraint(*m_bodies[BODYPART_LEFT_UPPER_ARM], *m_bodies[BODYPART_LEFT_LOWER_ARM], localA, localB); + hingeC->setLimit(btScalar(-M_PI_2), btScalar(0)); + m_joints[JOINT_LEFT_ELBOW] = hingeC; + m_ownerWorld->addConstraint(m_joints[JOINT_LEFT_ELBOW], true); + + + + localA.setIdentity(); localB.setIdentity(); + localA.getBasis().setEulerZYX(0,0,0); localA.setOrigin(scale*btVector3(btScalar(0.2), btScalar(0.15), btScalar(0.))); + localB.getBasis().setEulerZYX(0,0,M_PI_2); localB.setOrigin(scale*btVector3(btScalar(0.), btScalar(-0.18), btScalar(0.))); + coneC = new btConeTwistConstraint(*m_bodies[BODYPART_SPINE], *m_bodies[BODYPART_RIGHT_UPPER_ARM], localA, localB); + coneC->setLimit(M_PI_2, M_PI_2, 0); + m_joints[JOINT_RIGHT_SHOULDER] = coneC; + m_ownerWorld->addConstraint(m_joints[JOINT_RIGHT_SHOULDER], true); + + localA.setIdentity(); localB.setIdentity(); + localA.getBasis().setEulerZYX(0,M_PI_2,0); localA.setOrigin(scale*btVector3(btScalar(0.), btScalar(0.18), btScalar(0.))); + localB.getBasis().setEulerZYX(0,M_PI_2,0); localB.setOrigin(scale*btVector3(btScalar(0.), btScalar(-0.14), btScalar(0.))); + hingeC = new btHingeConstraint(*m_bodies[BODYPART_RIGHT_UPPER_ARM], *m_bodies[BODYPART_RIGHT_LOWER_ARM], localA, localB); + hingeC->setLimit(btScalar(-M_PI_2), btScalar(0)); + m_joints[JOINT_RIGHT_ELBOW] = hingeC; + m_ownerWorld->addConstraint(m_joints[JOINT_RIGHT_ELBOW], true); + } + + virtual ~RagDoll () + { + int i; + + // Remove all constraints + for ( i = 0; i < JOINT_COUNT; ++i) + { + m_ownerWorld->removeConstraint(m_joints[i]); + delete m_joints[i]; m_joints[i] = 0; + } + + // Remove all bodies and shapes + for ( i = 0; i < BODYPART_COUNT; ++i) + { + m_ownerWorld->removeRigidBody(m_bodies[i]); + + delete m_bodies[i]->getMotionState(); + + delete m_bodies[i]; m_bodies[i] = 0; + delete m_shapes[i]; m_shapes[i] = 0; + } + } +}; + +void BenchmarkDemo::createTest3() +{ + setCameraDistance(btScalar(50.)); + + int size = 16; + + float sizeX = 1.f; + float sizeY = 1.f; + + int rc=0; + + btScalar scale(3.5); + btVector3 pos(0.0f, sizeY, 0.0f); + while(size) { + float offset = -size * (sizeX * 6.0f) * 0.5f; + for(int i=0;isetLocalScaling(btVector3(scaling,scaling,scaling)); + + for (int i=0;iaddPoint(vtx*(1./scaling)); + } + + btTransform trans; + trans.setIdentity(); + + float mass = 1.f; + btVector3 localInertia(0,0,0); + convexHullShape->calculateLocalInertia(mass,localInertia); + + for(int k=0;k<15;k++) { + for(int j=0;jaddIndexedMesh(part,PHY_SHORT); + + bool useQuantizedAabbCompression = true; + btBvhTriangleMeshShape* trimeshShape = new btBvhTriangleMeshShape(meshInterface,useQuantizedAabbCompression); + btVector3 localInertia(0,0,0); + trans.setOrigin(btVector3(0,-25,0)); + + btRigidBody* body = localCreateRigidBody(0,trans,trimeshShape); + body->setFriction (0.9); + + } + +} + + +void BenchmarkDemo::createTest5() +{ + setCameraDistance(btScalar(250.)); + btVector3 boxSize(1.5f,1.5f,1.5f); + float boxMass = 1.0f; + float sphereRadius = 1.5f; + float sphereMass = 1.0f; + float capsuleHalf = 2.0f; + float capsuleRadius = 1.0f; + float capsuleMass = 1.0f; + + { + int size = 10; + int height = 10; + + const float cubeSize = boxSize[0]; + float spacing = 2.0f; + btVector3 pos(0.0f, 20.0f, 0.0f); + float offset = -size * (cubeSize * 2.0f + spacing) * 0.5f; + + int numBodies = 0; + + for(int k=0;kaddPoint(vtx); + } + + btTransform trans; + trans.setIdentity(); + + float mass = 1.f; + btVector3 localInertia(0,0,0); + convexHullShape->calculateLocalInertia(mass,localInertia); + + + { + int size = 10; + int height = 10; + + const float cubeSize = boxSize[0]; + float spacing = 2.0f; + btVector3 pos(0.0f, 20.0f, 0.0f); + float offset = -size * (cubeSize * 2.0f + spacing) * 0.5f; + + + for(int k=0;kgetNumCollisionObjects()-1; i>=0 ;i--) + { + btCollisionObject* obj = m_dynamicsWorld->getCollisionObjectArray()[i]; + btRigidBody* body = btRigidBody::upcast(obj); + if (body && body->getMotionState()) + { + delete body->getMotionState(); + } + m_dynamicsWorld->removeCollisionObject( obj ); + delete obj; + } + + //delete collision shapes + for (int j=0;j m_collisionShapes; + + btAlignedObjectArray m_ragdolls; + + btBroadphaseInterface* m_overlappingPairCache; + + btCollisionDispatcher* m_dispatcher; + + btConstraintSolver* m_solver; + + btDefaultCollisionConfiguration* m_collisionConfiguration; + + int m_benchmark; + + void createTest1(); + void createTest2(); + void createTest3(); + void createTest4(); + void createTest5(); + void createTest6(); + void createTest7(); + + void createWall(const btVector3& offsetPosition,int stackSize,const btVector3& boxSize); + void createPyramid(const btVector3& offsetPosition,int stackSize,const btVector3& boxSize); + void createTowerCircle(const btVector3& offsetPosition,int stackSize,int rotSize,const btVector3& boxSize); + void createLargeMeshBody(); + + + class SpuBatchRaycaster* m_batchRaycaster; + class btThreadSupportInterface* m_batchRaycasterThreadSupport; + + void castRays(); + void initRays(); + + public: + + BenchmarkDemo(int benchmark) + :m_benchmark(benchmark) + { + } + virtual ~BenchmarkDemo() + { + exitPhysics(); + } + void initPhysics(); + + void exitPhysics(); + + virtual void clientMoveAndDisplay(); + + virtual void displayCallback(); + + + + +}; + +class BenchmarkDemo1 : public BenchmarkDemo +{ +public: + BenchmarkDemo1() + :BenchmarkDemo(1) + { + } + + static DemoApplication* Create() + { + BenchmarkDemo1* demo = new BenchmarkDemo1; + demo->myinit(); + demo->initPhysics(); + return demo; + } +}; + +class BenchmarkDemo2 : public BenchmarkDemo +{ +public: + BenchmarkDemo2() + :BenchmarkDemo(2) + { + } + + static DemoApplication* Create() + { + BenchmarkDemo2* demo = new BenchmarkDemo2; + demo->myinit(); + demo->initPhysics(); + return demo; + } +}; + +class BenchmarkDemo3 : public BenchmarkDemo +{ +public: + BenchmarkDemo3() + :BenchmarkDemo(3) + { + } + + static DemoApplication* Create() + { + BenchmarkDemo3* demo = new BenchmarkDemo3; + demo->myinit(); + demo->initPhysics(); + return demo; + } +}; + +class BenchmarkDemo4 : public BenchmarkDemo +{ +public: + BenchmarkDemo4() + :BenchmarkDemo(4) + { + } + + static DemoApplication* Create() + { + BenchmarkDemo4* demo = new BenchmarkDemo4; + demo->myinit(); + demo->initPhysics(); + return demo; + } +}; + + +class BenchmarkDemo5 : public BenchmarkDemo +{ +public: + BenchmarkDemo5() + :BenchmarkDemo(5) + { + } + + static DemoApplication* Create() + { + BenchmarkDemo5* demo = new BenchmarkDemo5; + demo->myinit(); + demo->initPhysics(); + return demo; + } +}; + + +class BenchmarkDemo6 : public BenchmarkDemo +{ +public: + BenchmarkDemo6() + :BenchmarkDemo(6) + { + } + + static DemoApplication* Create() + { + BenchmarkDemo6* demo = new BenchmarkDemo6; + demo->myinit(); + demo->initPhysics(); + return demo; + } +}; + +class BenchmarkDemo7 : public BenchmarkDemo +{ +public: + BenchmarkDemo7() + :BenchmarkDemo(7) + { + } + + static DemoApplication* Create() + { + BenchmarkDemo7* demo = new BenchmarkDemo7; + demo->myinit(); + demo->initPhysics(); + return demo; + } +}; + +#endif //BENCHMARK_DEMO_H + diff --git a/BulletPhysics/bulletTrunk/Demos/Benchmarks/CMakeLists.txt b/BulletPhysics/bulletTrunk/Demos/Benchmarks/CMakeLists.txt new file mode 100644 index 00000000..fe144fab --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/Benchmarks/CMakeLists.txt @@ -0,0 +1,25 @@ +# This is basically the overall name of the project in Visual Studio this is the name of the Solution File + + +# For every executable you have with a main method you should have an add_executable line below. +# For every add executable line you should list every .cpp and .h file you have associated with that executable. + + +# You shouldn't have to modify anything below this line +######################################################## + + + +INCLUDE_DIRECTORIES( +${BULLET_PHYSICS_SOURCE_DIR}/src ${BULLET_PHYSICS_SOURCE_DIR}/Demos/OpenGL } +) + +LINK_LIBRARIES( +OpenGLSupport BulletDynamics BulletCollision LinearMath ${GLUT_glut_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} +) + +ADD_EXECUTABLE(AppBenchmarks + main.cpp + BenchmarkDemo.cpp +) + diff --git a/BulletPhysics/bulletTrunk/Demos/Benchmarks/Jamfile b/BulletPhysics/bulletTrunk/Demos/Benchmarks/Jamfile new file mode 100644 index 00000000..01d51385 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/Benchmarks/Jamfile @@ -0,0 +1,3 @@ +SubDir TOP Demos Benchmarks ; + +BulletDemo Benchmarks : [ Wildcard *.h *.cpp ] ; diff --git a/BulletPhysics/bulletTrunk/Demos/Benchmarks/Taru.mdl b/BulletPhysics/bulletTrunk/Demos/Benchmarks/Taru.mdl new file mode 100644 index 00000000..4e3d6b1b --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/Benchmarks/Taru.mdl @@ -0,0 +1,188 @@ +#define TaruVtxCount 43 +#define TaruIdxCount 132 + +float TaruVtx[] = { +1.08664f,-1.99237f,0.0f, +0.768369f,-1.99237f,-0.768369f, +1.28852f,1.34412e-007f,-1.28852f, +1.82224f,1.90735e-007f,0.0f, +0.0f,-1.99237f,-1.08664f, +0.0f,0.0f,-1.82224f, +0.0f,-1.99237f,-1.08664f, +-0.768369f,-1.99237f,-0.768369f, +-1.28852f,1.34412e-007f,-1.28852f, +0.0f,0.0f,-1.82224f, +-1.08664f,-1.99237f,1.82086e-007f, +-1.82224f,1.90735e-007f,1.59305e-007f, +-0.768369f,-1.99237f,0.76837f, +-1.28852f,2.47058e-007f,1.28852f, +1.42495e-007f,-1.99237f,1.08664f, +2.38958e-007f,2.70388e-007f,1.82224f, +0.768369f,-1.99237f,0.768369f, +1.28852f,2.47058e-007f,1.28852f, +0.768369f,1.99237f,-0.768369f, +1.08664f,1.99237f,0.0f, +0.0f,1.99237f,-1.08664f, +-0.768369f,1.99237f,-0.768369f, +0.0f,1.99237f,-1.08664f, +-1.08664f,1.99237f,0.0f, +-0.768369f,1.99237f,0.768369f, +1.42495e-007f,1.99237f,1.08664f, +0.768369f,1.99237f,0.768369f, +1.42495e-007f,-1.99237f,1.08664f, +-0.768369f,-1.99237f,0.76837f, +-1.08664f,-1.99237f,1.82086e-007f, +-0.768369f,-1.99237f,-0.768369f, +0.0f,-1.99237f,-1.08664f, +0.768369f,-1.99237f,-0.768369f, +1.08664f,-1.99237f,0.0f, +0.768369f,-1.99237f,0.768369f, +0.768369f,1.99237f,-0.768369f, +0.0f,1.99237f,-1.08664f, +-0.768369f,1.99237f,-0.768369f, +-1.08664f,1.99237f,0.0f, +-0.768369f,1.99237f,0.768369f, +1.42495e-007f,1.99237f,1.08664f, +0.768369f,1.99237f,0.768369f, +1.08664f,1.99237f,0.0f, +}; + +float TaruNml[] = { +0.938103f,-0.346356f,0.0f, +0.663339f,-0.346356f,-0.663339f, +0.707107f,0.0f,-0.707107f, +1.0f,0.0f,0.0f, +0.0f,-0.346356f,-0.938103f, +0.0f,0.0f,-1.0f, +0.0f,-0.346356f,-0.938103f, +-0.663339f,-0.346356f,-0.663339f, +-0.707107f,0.0f,-0.707107f, +0.0f,0.0f,-1.0f, +-0.938103f,-0.346356f,0.0f, +-1.0f,0.0f,0.0f, +-0.663339f,-0.346356f,0.663339f, +-0.707107f,0.0f,0.707107f, +0.0f,-0.346356f,0.938103f, +1.21445e-007f,0.0f,1.0f, +0.663339f,-0.346356f,0.663339f, +0.707107f,0.0f,0.707107f, +0.663339f,0.346356f,-0.663339f, +0.938103f,0.346356f,0.0f, +0.0f,0.346356f,-0.938103f, +-0.663339f,0.346356f,-0.663339f, +0.0f,0.346356f,-0.938103f, +-0.938103f,0.346356f,0.0f, +-0.663339f,0.346356f,0.663339f, +1.2508e-007f,0.346356f,0.938103f, +0.663339f,0.346356f,0.663339f, +0.0f,-1.0f,0.0f, +0.0f,-1.0f,0.0f, +0.0f,-1.0f,0.0f, +0.0f,-1.0f,0.0f, +0.0f,-1.0f,0.0f, +0.0f,-1.0f,0.0f, +0.0f,-1.0f,0.0f, +0.0f,-1.0f,0.0f, +0.0f,1.0f,0.0f, +0.0f,1.0f,0.0f, +0.0f,1.0f,0.0f, +0.0f,1.0f,0.0f, +0.0f,1.0f,0.0f, +0.0f,1.0f,0.0f, +0.0f,1.0f,0.0f, +0.0f,1.0f,0.0f, +}; + +float TaruTex[] = { +0.75f,0.0f, +0.875f,0.0f, +0.875f,0.5f, +0.75f,0.5f, +1.0f,0.0f, +1.0f,0.5f, +0.0f,0.0f, +0.125f,0.0f, +0.125f,0.5f, +0.0f,0.5f, +0.25f,0.0f, +0.25f,0.5f, +0.375f,0.0f, +0.375f,0.5f, +0.5f,0.0f, +0.5f,0.5f, +0.625f,0.0f, +0.625f,0.5f, +0.875f,1.0f, +0.75f,1.0f, +1.0f,1.0f, +0.125f,1.0f, +0.0f,1.0f, +0.25f,1.0f, +0.375f,1.0f, +0.5f,1.0f, +0.625f,1.0f, +1.0f,0.5f, +0.853553f,0.146447f, +0.5f,0.0f, +0.146447f,0.146447f, +0.0f,0.5f, +0.146447f,0.853553f, +0.5f,1.0f, +0.853553f,0.853553f, +0.146447f,0.853553f, +0.0f,0.5f, +0.146447f,0.146447f, +0.5f,0.0f, +0.853553f,0.146447f, +1.0f,0.5f, +0.853553f,0.853553f, +0.5f,1.0f, +}; + +unsigned short TaruIdx[] = { +0,1,2, +2,3,0, +1,4,5, +5,2,1, +6,7,8, +8,9,6, +7,10,11, +11,8,7, +10,12,13, +13,11,10, +12,14,15, +15,13,12, +14,16,17, +17,15,14, +16,0,3, +3,17,16, +3,2,18, +18,19,3, +2,5,20, +20,18,2, +9,8,21, +21,22,9, +8,11,23, +23,21,8, +11,13,24, +24,23,11, +13,15,25, +25,24,13, +15,17,26, +26,25,15, +17,3,19, +19,26,17, +27,28,29, +29,30,31, +31,32,33, +29,31,33, +27,29,33, +34,27,33, +35,36,37, +37,38,39, +39,40,41, +37,39,41, +35,37,41, +42,35,41, +}; + diff --git a/BulletPhysics/bulletTrunk/Demos/Benchmarks/landscape.mdl b/BulletPhysics/bulletTrunk/Demos/Benchmarks/landscape.mdl new file mode 100644 index 00000000..6b879b23 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/Benchmarks/landscape.mdl @@ -0,0 +1,84369 @@ +#define Landscape02VtxCount 1980 +#define Landscape02IdxCount 11310 +#include "LinearMath/btScalar.h" + +btScalar Landscape02Vtx[] = { +-250.0f,2.99192f,113.281f, +-250.0f,2.18397f,117.188f, +-246.094f,1.62262f,113.281f, +-246.094f,1.51628f,117.188f, +-242.188f,0.847411f,113.281f, +-242.188f,0.628327f,117.188f, +-238.281f,-0.697436f,113.281f, +-238.281f,-0.567933f,117.188f, +-234.375f,-2.65115f,113.281f, +-234.375f,-2.01568f,117.188f, +-230.469f,-3.82201f,113.281f, +-230.469f,-3.41089f,117.188f, +-226.563f,-3.99138f,113.281f, +-226.563f,-3.82758f,117.188f, +-222.656f,-5.51066f,113.281f, +-222.656f,-5.01586f,117.188f, +-218.75f,-5.62904f,113.281f, +-218.75f,-4.74822f,117.188f, +-214.844f,-4.90514f,113.281f, +-214.844f,-3.30853f,117.188f, +-210.938f,-2.9572f,113.281f, +-210.938f,-2.32499f,117.188f, +-207.031f,-2.44242f,113.281f, +-207.031f,-1.71509f,117.188f, +-203.125f,-1.5086f,113.281f, +-203.125f,-1.19203f,117.188f, +-199.219f,-0.130838f,113.281f, +-199.219f,0.219498f,117.188f, +-195.313f,0.985417f,113.281f, +-195.313f,1.66304f,117.188f, +-191.406f,3.20064f,113.281f, +-191.406f,4.35105f,117.188f, +-187.5f,4.6779f,113.281f, +-187.5f,6.33228f,117.188f, +-183.594f,6.16902f,113.281f, +-183.594f,8.00972f,117.188f, +-179.688f,8.18835f,113.281f, +-179.688f,9.71486f,117.188f, +-175.781f,9.35082f,113.281f, +-175.781f,10.7727f,117.188f, +-171.875f,9.50665f,113.281f, +-171.875f,11.358f,117.188f, +-167.969f,12.1301f,113.281f, +-167.969f,12.5239f,117.188f, +-164.063f,14.8728f,113.281f, +-164.063f,14.6278f,117.188f, +-160.156f,16.3761f,113.281f, +-160.156f,17.2069f,117.188f, +-156.25f,18.5367f,113.281f, +-156.25f,19.9779f,117.188f, +-152.344f,22.4636f,113.281f, +-152.344f,23.4607f,117.188f, +-148.438f,26.1459f,113.281f, +-148.438f,26.6108f,117.188f, +-144.531f,28.6071f,113.281f, +-144.531f,28.4635f,117.188f, +-140.625f,30.2795f,113.281f, +-140.625f,29.7705f,117.188f, +-136.719f,32.2229f,113.281f, +-136.719f,31.0684f,117.188f, +-132.813f,32.8919f,113.281f, +-132.813f,31.8395f,117.188f, +-128.906f,33.5143f,113.281f, +-128.906f,32.1658f,117.188f, +-125.0f,34.6963f,113.281f, +-125.0f,34.7478f,117.188f, +-121.094f,37.3995f,113.281f, +-121.094f,36.0624f,117.188f, +-117.188f,38.0464f,113.281f, +-117.188f,37.2702f,117.188f, +-113.281f,37.8506f,113.281f, +-113.281f,37.3474f,117.188f, +-109.375f,37.8984f,113.281f, +-109.375f,37.242f,117.188f, +-105.469f,36.0464f,113.281f, +-105.469f,36.1544f,117.188f, +-101.563f,34.1136f,113.281f, +-101.563f,33.403f,117.188f, +-97.6563f,32.0925f,113.281f, +-97.6563f,31.294f,117.188f, +-93.75f,29.8306f,113.281f, +-93.75f,29.4961f,117.188f, +-89.8438f,30.1499f,113.281f, +-89.8438f,29.0556f,117.188f, +-85.9375f,28.8377f,113.281f, +-85.9375f,28.2757f,117.188f, +-82.0313f,26.9726f,113.281f, +-82.0313f,26.6322f,117.188f, +-78.125f,25.4597f,113.281f, +-78.125f,24.8286f,117.188f, +-74.2188f,23.3572f,113.281f, +-74.2188f,22.7019f,117.188f, +-70.3125f,21.1615f,113.281f, +-70.3125f,20.4725f,117.188f, +-66.4063f,18.1212f,113.281f, +-66.4063f,17.984f,117.188f, +-62.5f,16.3411f,113.281f, +-62.5f,16.3033f,117.188f, +-58.5938f,15.075f,113.281f, +-58.5938f,14.2087f,117.188f, +-54.6875f,14.2482f,113.281f, +-54.6875f,12.8086f,117.188f, +-50.7813f,13.7945f,113.281f, +-50.7813f,12.5463f,117.188f, +-46.875f,12.7086f,113.281f, +-46.875f,12.1781f,117.188f, +-42.9688f,10.5756f,113.281f, +-42.9688f,11.1391f,117.188f, +-39.0625f,9.99343f,113.281f, +-39.0625f,10.4623f,117.188f, +-35.1563f,11.0936f,113.281f, +-35.1563f,11.0528f,117.188f, +-31.25f,11.9553f,113.281f, +-31.25f,11.454f,117.188f, +-27.3438f,11.5734f,113.281f, +-27.3438f,10.5577f,117.188f, +-23.4375f,11.0397f,113.281f, +-23.4375f,10.6328f,117.188f, +-19.5313f,12.5166f,113.281f, +-19.5313f,12.5569f,117.188f, +-15.625f,13.856f,113.281f, +-15.625f,13.5389f,117.188f, +-11.7188f,14.525f,113.281f, +-11.7188f,14.3792f,117.188f, +-7.8125f,14.7554f,113.281f, +-7.8125f,15.4809f,117.188f, +-3.90625f,15.9168f,113.281f, +-3.90625f,16.1008f,117.188f, +0.0f,17.0728f,113.281f, +0.0f,17.3675f,117.188f, +3.90625f,18.3498f,113.281f, +3.90625f,18.919f,117.188f, +-250.0f,4.66213f,109.375f, +-246.094f,2.25542f,109.375f, +-242.188f,0.972654f,109.375f, +-238.281f,-1.95429f,109.375f, +-234.375f,-2.74128f,109.375f, +-230.469f,-3.62525f,109.375f, +-226.563f,-4.55305f,109.375f, +-222.656f,-6.4124f,109.375f, +-218.75f,-6.73329f,109.375f, +-214.844f,-5.91703f,109.375f, +-210.938f,-4.73996f,109.375f, +-207.031f,-3.31105f,109.375f, +-203.125f,-2.06764f,109.375f, +-199.219f,-0.969242f,109.375f, +-195.313f,0.268778f,109.375f, +-191.406f,1.94799f,109.375f, +-187.5f,2.80754f,109.375f, +-183.594f,4.22131f,109.375f, +-179.688f,5.20723f,109.375f, +-175.781f,7.47197f,109.375f, +-171.875f,9.45267f,109.375f, +-167.969f,12.6425f,109.375f, +-164.063f,14.9382f,109.375f, +-160.156f,16.7967f,109.375f, +-156.25f,19.5153f,109.375f, +-152.344f,21.4005f,109.375f, +-148.438f,25.1259f,109.375f, +-144.531f,28.4102f,109.375f, +-140.625f,30.7572f,109.375f, +-136.719f,33.0194f,109.375f, +-132.813f,33.072f,109.375f, +-128.906f,33.1358f,109.375f, +-125.0f,35.0549f,109.375f, +-121.094f,36.4427f,109.375f, +-117.188f,38.3265f,109.375f, +-113.281f,38.5339f,109.375f, +-109.375f,37.0126f,109.375f, +-105.469f,34.9063f,109.375f, +-101.563f,32.9886f,109.375f, +-97.6563f,30.8964f,109.375f, +-93.75f,30.5048f,109.375f, +-89.8438f,30.4943f,109.375f, +-85.9375f,28.8782f,109.375f, +-82.0313f,28.1966f,109.375f, +-78.125f,25.9164f,109.375f, +-74.2188f,23.3428f,109.375f, +-70.3125f,20.9839f,109.375f, +-66.4063f,18.3885f,109.375f, +-62.5f,16.9034f,109.375f, +-58.5938f,15.2602f,109.375f, +-54.6875f,14.3223f,109.375f, +-50.7813f,13.3767f,109.375f, +-46.875f,12.5798f,109.375f, +-42.9688f,11.3276f,109.375f, +-39.0625f,11.0169f,109.375f, +-35.1563f,11.7482f,109.375f, +-31.25f,12.5037f,109.375f, +-27.3438f,12.3832f,109.375f, +-23.4375f,12.3097f,109.375f, +-19.5313f,12.6165f,109.375f, +-15.625f,13.7744f,109.375f, +-11.7188f,14.363f,109.375f, +-7.8125f,14.828f,109.375f, +-3.90625f,15.599f,109.375f, +0.0f,16.3885f,109.375f, +3.90625f,18.0017f,109.375f, +-250.0f,5.23892f,105.469f, +-246.094f,2.90481f,105.469f, +-242.188f,0.264647f,105.469f, +-238.281f,-0.288927f,105.469f, +-234.375f,-0.910295f,105.469f, +-230.469f,-2.20742f,105.469f, +-226.563f,-3.6968f,105.469f, +-222.656f,-5.2145f,105.469f, +-218.75f,-6.07198f,105.469f, +-214.844f,-5.42535f,105.469f, +-210.938f,-4.82182f,105.469f, +-207.031f,-3.22017f,105.469f, +-203.125f,-2.28037f,105.469f, +-199.219f,-1.51966f,105.469f, +-195.313f,-0.0464115f,105.469f, +-191.406f,1.73523f,105.469f, +-187.5f,2.72489f,105.469f, +-183.594f,4.39996f,105.469f, +-179.688f,5.48007f,105.469f, +-175.781f,7.27769f,105.469f, +-171.875f,10.1115f,105.469f, +-167.969f,13.0557f,105.469f, +-164.063f,15.7105f,105.469f, +-160.156f,17.8448f,105.469f, +-156.25f,19.8398f,105.469f, +-152.344f,21.6672f,105.469f, +-148.438f,24.1475f,105.469f, +-144.531f,28.4217f,105.469f, +-140.625f,31.6921f,105.469f, +-136.719f,34.3814f,105.469f, +-132.813f,34.9011f,105.469f, +-128.906f,33.8056f,105.469f, +-125.0f,34.3226f,105.469f, +-121.094f,35.6061f,105.469f, +-117.188f,37.9636f,105.469f, +-113.281f,38.6673f,105.469f, +-109.375f,36.8831f,105.469f, +-105.469f,34.5846f,105.469f, +-101.563f,32.2221f,105.469f, +-97.6563f,30.3826f,105.469f, +-93.75f,30.4243f,105.469f, +-89.8438f,30.7761f,105.469f, +-85.9375f,29.8335f,105.469f, +-82.0313f,28.0208f,105.469f, +-78.125f,25.7215f,105.469f, +-74.2188f,22.9019f,105.469f, +-70.3125f,20.9096f,105.469f, +-66.4063f,18.2558f,105.469f, +-62.5f,16.689f,105.469f, +-58.5938f,15.8032f,105.469f, +-54.6875f,14.8311f,105.469f, +-50.7813f,13.7628f,105.469f, +-46.875f,13.0048f,105.469f, +-42.9688f,11.9222f,105.469f, +-39.0625f,12.021f,105.469f, +-35.1563f,12.2727f,105.469f, +-31.25f,12.6336f,105.469f, +-27.3438f,12.6865f,105.469f, +-23.4375f,12.3758f,105.469f, +-19.5313f,13.0149f,105.469f, +-15.625f,14.0448f,105.469f, +-11.7188f,14.6064f,105.469f, +-7.8125f,15.1105f,105.469f, +-3.90625f,15.8367f,105.469f, +0.0f,16.822f,105.469f, +3.90625f,17.9608f,105.469f, +-250.0f,4.27755f,101.563f, +-246.094f,2.84639f,101.563f, +-242.188f,2.00001f,101.563f, +-238.281f,1.59426f,101.563f, +-234.375f,0.494548f,101.563f, +-230.469f,-1.78619f,101.563f, +-226.563f,-2.8668f,101.563f, +-222.656f,-5.00406f,101.563f, +-218.75f,-6.01721f,101.563f, +-214.844f,-5.29731f,101.563f, +-210.938f,-4.08939f,101.563f, +-207.031f,-3.76734f,101.563f, +-203.125f,-2.53974f,101.563f, +-199.219f,-1.06933f,101.563f, +-195.313f,-0.447271f,101.563f, +-191.406f,1.52362f,101.563f, +-187.5f,3.40783f,101.563f, +-183.594f,4.48418f,101.563f, +-179.688f,6.791f,101.563f, +-175.781f,8.68642f,101.563f, +-171.875f,11.1511f,101.563f, +-167.969f,14.4536f,101.563f, +-164.063f,17.5923f,101.563f, +-160.156f,19.4108f,101.563f, +-156.25f,20.7669f,101.563f, +-152.344f,22.2683f,101.563f, +-148.438f,24.0251f,101.563f, +-144.531f,27.7431f,101.563f, +-140.625f,31.4827f,101.563f, +-136.719f,34.3945f,101.563f, +-132.813f,35.3451f,101.563f, +-128.906f,34.9912f,101.563f, +-125.0f,34.2253f,101.563f, +-121.094f,35.1765f,101.563f, +-117.188f,37.3095f,101.563f, +-113.281f,37.7256f,101.563f, +-109.375f,36.2331f,101.563f, +-105.469f,34.435f,101.563f, +-101.563f,32.1021f,101.563f, +-97.6563f,31.0728f,101.563f, +-93.75f,30.7462f,101.563f, +-89.8438f,30.8125f,101.563f, +-85.9375f,29.6802f,101.563f, +-82.0313f,27.3023f,101.563f, +-78.125f,25.1113f,101.563f, +-74.2188f,22.6475f,101.563f, +-70.3125f,20.1315f,101.563f, +-66.4063f,18.0132f,101.563f, +-62.5f,17.1414f,101.563f, +-58.5938f,16.7884f,101.563f, +-54.6875f,15.7107f,101.563f, +-50.7813f,14.6855f,101.563f, +-46.875f,13.3626f,101.563f, +-42.9688f,11.6073f,101.563f, +-39.0625f,11.3359f,101.563f, +-35.1563f,12.4227f,101.563f, +-31.25f,13.068f,101.563f, +-27.3438f,12.4485f,101.563f, +-23.4375f,11.8491f,101.563f, +-19.5313f,13.6925f,101.563f, +-15.625f,14.7114f,101.563f, +-11.7188f,14.963f,101.563f, +-7.8125f,15.0631f,101.563f, +-3.90625f,16.1214f,101.563f, +0.0f,17.0818f,101.563f, +3.90625f,17.7074f,101.563f, +-250.0f,4.24758f,97.6563f, +-246.094f,3.92716f,97.6563f, +-242.188f,3.12473f,97.6563f, +-238.281f,2.07357f,97.6563f, +-234.375f,0.407895f,97.6563f, +-230.469f,-0.904646f,97.6563f, +-226.563f,-2.62182f,97.6563f, +-222.656f,-3.89204f,97.6563f, +-218.75f,-5.61944f,97.6563f, +-214.844f,-4.00077f,97.6563f, +-210.938f,-2.40041f,97.6563f, +-207.031f,-2.40061f,97.6563f, +-203.125f,-1.96286f,97.6563f, +-199.219f,-1.48062f,97.6563f, +-195.313f,-0.101653f,97.6563f, +-191.406f,1.73583f,97.6563f, +-187.5f,3.67572f,97.6563f, +-183.594f,5.12213f,97.6563f, +-179.688f,7.63637f,97.6563f, +-175.781f,10.1724f,97.6563f, +-171.875f,12.2812f,97.6563f, +-167.969f,15.2851f,97.6563f, +-164.063f,18.2233f,97.6563f, +-160.156f,20.4971f,97.6563f, +-156.25f,21.878f,97.6563f, +-152.344f,23.2306f,97.6563f, +-148.438f,24.2686f,97.6563f, +-144.531f,28.1874f,97.6563f, +-140.625f,31.2597f,97.6563f, +-136.719f,33.3133f,97.6563f, +-132.813f,35.319f,97.6563f, +-128.906f,35.1009f,97.6563f, +-125.0f,34.8265f,97.6563f, +-121.094f,34.2935f,97.6563f, +-117.188f,36.4908f,97.6563f, +-113.281f,37.1964f,97.6563f, +-109.375f,36.1354f,97.6563f, +-105.469f,34.3852f,97.6563f, +-101.563f,30.8829f,97.6563f, +-97.6563f,30.1091f,97.6563f, +-93.75f,30.9329f,97.6563f, +-89.8438f,30.8751f,97.6563f, +-85.9375f,29.018f,97.6563f, +-82.0313f,27.3105f,97.6563f, +-78.125f,25.0087f,97.6563f, +-74.2188f,21.6466f,97.6563f, +-70.3125f,18.5043f,97.6563f, +-66.4063f,18.66f,97.6563f, +-62.5f,18.1592f,97.6563f, +-58.5938f,17.521f,97.6563f, +-54.6875f,16.3389f,97.6563f, +-50.7813f,14.8664f,97.6563f, +-46.875f,13.5991f,97.6563f, +-42.9688f,11.873f,97.6563f, +-39.0625f,11.498f,97.6563f, +-35.1563f,11.5171f,97.6563f, +-31.25f,12.5588f,97.6563f, +-27.3438f,12.2172f,97.6563f, +-23.4375f,11.2491f,97.6563f, +-19.5313f,13.2373f,97.6563f, +-15.625f,13.5683f,97.6563f, +-11.7188f,14.0875f,97.6563f, +-7.8125f,14.6591f,97.6563f, +-3.90625f,15.1275f,97.6563f, +0.0f,15.8243f,97.6563f, +3.90625f,18.0176f,97.6563f, +-250.0f,4.93619f,93.75f, +-246.094f,3.50077f,93.75f, +-242.188f,2.88532f,93.75f, +-238.281f,2.19691f,93.75f, +-234.375f,1.45343f,93.75f, +-230.469f,-0.151238f,93.75f, +-226.563f,-1.0856f,93.75f, +-222.656f,-2.29205f,93.75f, +-218.75f,-3.83678f,93.75f, +-214.844f,-2.73856f,93.75f, +-210.938f,-2.19574f,93.75f, +-207.031f,-0.222008f,93.75f, +-203.125f,-0.117961f,93.75f, +-199.219f,-0.17607f,93.75f, +-195.313f,1.32212f,93.75f, +-191.406f,2.64292f,93.75f, +-187.5f,3.72678f,93.75f, +-183.594f,5.78729f,93.75f, +-179.688f,9.09616f,93.75f, +-175.781f,11.4833f,93.75f, +-171.875f,13.1923f,93.75f, +-167.969f,15.68f,93.75f, +-164.063f,17.9844f,93.75f, +-160.156f,20.7688f,93.75f, +-156.25f,23.4925f,93.75f, +-152.344f,25.2252f,93.75f, +-148.438f,25.9373f,93.75f, +-144.531f,28.1941f,93.75f, +-140.625f,31.9896f,93.75f, +-136.719f,33.5688f,93.75f, +-132.813f,34.7177f,93.75f, +-128.906f,35.1459f,93.75f, +-125.0f,34.9785f,93.75f, +-121.094f,34.3971f,93.75f, +-117.188f,35.2455f,93.75f, +-113.281f,36.0209f,93.75f, +-109.375f,35.244f,93.75f, +-105.469f,33.4542f,93.75f, +-101.563f,30.3707f,93.75f, +-97.6563f,30.709f,93.75f, +-93.75f,31.2489f,93.75f, +-89.8438f,30.5476f,93.75f, +-85.9375f,28.5982f,93.75f, +-82.0313f,26.6838f,93.75f, +-78.125f,24.1646f,93.75f, +-74.2188f,21.261f,93.75f, +-70.3125f,19.8206f,93.75f, +-66.4063f,19.4952f,93.75f, +-62.5f,18.3276f,93.75f, +-58.5938f,18.1028f,93.75f, +-54.6875f,17.0878f,93.75f, +-50.7813f,15.0144f,93.75f, +-46.875f,13.5565f,93.75f, +-42.9688f,11.0211f,93.75f, +-39.0625f,11.1986f,93.75f, +-35.1563f,10.4097f,93.75f, +-31.25f,11.2207f,93.75f, +-27.3438f,11.4539f,93.75f, +-23.4375f,11.4014f,93.75f, +-19.5313f,12.2344f,93.75f, +-15.625f,13.5348f,93.75f, +-11.7188f,14.2772f,93.75f, +-7.8125f,14.0447f,93.75f, +-3.90625f,14.1587f,93.75f, +0.0f,15.3266f,93.75f, +3.90625f,17.1671f,93.75f, +-250.0f,5.40499f,89.8438f, +-246.094f,3.9236f,89.8438f, +-242.188f,2.78029f,89.8438f, +-238.281f,2.337f,89.8438f, +-234.375f,1.45614f,89.8438f, +-230.469f,0.487402f,89.8438f, +-226.563f,0.814658f,89.8438f, +-222.656f,-0.244101f,89.8438f, +-218.75f,-2.09422f,89.8438f, +-214.844f,-1.48441f,89.8438f, +-210.938f,-0.695794f,89.8438f, +-207.031f,0.742314f,89.8438f, +-203.125f,1.30594f,89.8438f, +-199.219f,1.49011f,89.8438f, +-195.313f,2.5687f,89.8438f, +-191.406f,3.72318f,89.8438f, +-187.5f,4.658f,89.8438f, +-183.594f,7.20615f,89.8438f, +-179.688f,9.85211f,89.8438f, +-175.781f,12.8482f,89.8438f, +-171.875f,14.6361f,89.8438f, +-167.969f,16.6036f,89.8438f, +-164.063f,19.7308f,89.8438f, +-160.156f,22.7068f,89.8438f, +-156.25f,24.421f,89.8438f, +-152.344f,25.8961f,89.8438f, +-148.438f,27.1249f,89.8438f, +-144.531f,29.0138f,89.8438f, +-140.625f,31.6384f,89.8438f, +-136.719f,33.9142f,89.8438f, +-132.813f,34.3317f,89.8438f, +-128.906f,36.0856f,89.8438f, +-125.0f,35.5134f,89.8438f, +-121.094f,34.7035f,89.8438f, +-117.188f,33.6847f,89.8438f, +-113.281f,34.2624f,89.8438f, +-109.375f,34.2147f,89.8438f, +-105.469f,32.2925f,89.8438f, +-101.563f,30.4889f,89.8438f, +-97.6563f,30.8562f,89.8438f, +-93.75f,31.4717f,89.8438f, +-89.8438f,30.2623f,89.8438f, +-85.9375f,28.4623f,89.8438f, +-82.0313f,26.6117f,89.8438f, +-78.125f,24.1755f,89.8438f, +-74.2188f,22.4752f,89.8438f, +-70.3125f,20.3246f,89.8438f, +-66.4063f,19.488f,89.8438f, +-62.5f,18.6447f,89.8438f, +-58.5938f,17.8933f,89.8438f, +-54.6875f,16.177f,89.8438f, +-50.7813f,15.2537f,89.8438f, +-46.875f,13.5232f,89.8438f, +-42.9688f,11.842f,89.8438f, +-39.0625f,10.223f,89.8438f, +-35.1563f,9.54441f,89.8438f, +-31.25f,9.73488f,89.8438f, +-27.3438f,10.7057f,89.8438f, +-23.4375f,11.9185f,89.8438f, +-19.5313f,13.2106f,89.8438f, +-15.625f,13.0807f,89.8438f, +-11.7188f,12.8112f,89.8438f, +-7.8125f,12.7972f,89.8438f, +-3.90625f,14.1049f,89.8438f, +0.0f,14.9674f,89.8438f, +3.90625f,15.6427f,89.8438f, +-250.0f,6.21462f,85.9375f, +-246.094f,4.66025f,85.9375f, +-242.188f,3.36279f,85.9375f, +-238.281f,1.97426f,85.9375f, +-234.375f,0.590897f,85.9375f, +-230.469f,2.01222f,85.9375f, +-226.563f,2.15192f,85.9375f, +-222.656f,0.78006f,85.9375f, +-218.75f,-0.424968f,85.9375f, +-214.844f,-0.512869f,85.9375f, +-210.938f,0.00319427f,85.9375f, +-207.031f,1.05715f,85.9375f, +-203.125f,2.11926f,85.9375f, +-199.219f,2.48862f,85.9375f, +-195.313f,3.89944f,85.9375f, +-191.406f,5.71899f,85.9375f, +-187.5f,6.41674f,85.9375f, +-183.594f,7.94295f,85.9375f, +-179.688f,10.9562f,85.9375f, +-175.781f,13.1951f,85.9375f, +-171.875f,15.7827f,85.9375f, +-167.969f,17.6951f,85.9375f, +-164.063f,20.2261f,85.9375f, +-160.156f,22.5211f,85.9375f, +-156.25f,24.8103f,85.9375f, +-152.344f,26.6666f,85.9375f, +-148.438f,27.7052f,85.9375f, +-144.531f,29.2234f,85.9375f, +-140.625f,31.4629f,85.9375f, +-136.719f,34.0955f,85.9375f, +-132.813f,34.7124f,85.9375f, +-128.906f,36.1712f,85.9375f, +-125.0f,36.4743f,85.9375f, +-121.094f,35.3967f,85.9375f, +-117.188f,34.3505f,85.9375f, +-113.281f,33.5175f,85.9375f, +-109.375f,32.9976f,85.9375f, +-105.469f,31.7882f,85.9375f, +-101.563f,31.1746f,85.9375f, +-97.6563f,31.0271f,85.9375f, +-93.75f,31.5303f,85.9375f, +-89.8438f,30.8744f,85.9375f, +-85.9375f,28.1434f,85.9375f, +-82.0313f,25.9196f,85.9375f, +-78.125f,24.4044f,85.9375f, +-74.2188f,21.9984f,85.9375f, +-70.3125f,20.0411f,85.9375f, +-66.4063f,19.9449f,85.9375f, +-62.5f,18.3893f,85.9375f, +-58.5938f,16.9846f,85.9375f, +-54.6875f,15.6155f,85.9375f, +-50.7813f,14.6152f,85.9375f, +-46.875f,12.7358f,85.9375f, +-42.9688f,12.1599f,85.9375f, +-39.0625f,10.1045f,85.9375f, +-35.1563f,9.61416f,85.9375f, +-31.25f,10.0784f,85.9375f, +-27.3438f,10.2188f,85.9375f, +-23.4375f,11.574f,85.9375f, +-19.5313f,11.8712f,85.9375f, +-15.625f,11.9109f,85.9375f, +-11.7188f,11.509f,85.9375f, +-7.8125f,13.9979f,85.9375f, +-3.90625f,14.8453f,85.9375f, +0.0f,14.7941f,85.9375f, +3.90625f,15.5916f,85.9375f, +-250.0f,6.94324f,82.0313f, +-246.094f,4.77131f,82.0313f, +-242.188f,3.62143f,82.0313f, +-238.281f,2.50324f,82.0313f, +-234.375f,1.40345f,82.0313f, +-230.469f,2.05881f,82.0313f, +-226.563f,2.41769f,82.0313f, +-222.656f,1.23736f,82.0313f, +-218.75f,1.59545f,82.0313f, +-214.844f,1.25313f,82.0313f, +-210.938f,1.53594f,82.0313f, +-207.031f,2.33073f,82.0313f, +-203.125f,2.59696f,82.0313f, +-199.219f,4.25487f,82.0313f, +-195.313f,5.86136f,82.0313f, +-191.406f,7.54631f,82.0313f, +-187.5f,8.7315f,82.0313f, +-183.594f,9.65737f,82.0313f, +-179.688f,11.5328f,82.0313f, +-175.781f,14.3069f,82.0313f, +-171.875f,16.2889f,82.0313f, +-167.969f,17.6379f,82.0313f, +-164.063f,20.4422f,82.0313f, +-160.156f,22.9557f,82.0313f, +-156.25f,25.0731f,82.0313f, +-152.344f,27.3881f,82.0313f, +-148.438f,28.7955f,82.0313f, +-144.531f,30.2575f,82.0313f, +-140.625f,32.5888f,82.0313f, +-136.719f,33.9884f,82.0313f, +-132.813f,34.4838f,82.0313f, +-128.906f,35.7672f,82.0313f, +-125.0f,36.1002f,82.0313f, +-121.094f,35.9318f,82.0313f, +-117.188f,34.9715f,82.0313f, +-113.281f,33.3187f,82.0313f, +-109.375f,31.9477f,82.0313f, +-105.469f,31.4437f,82.0313f, +-101.563f,31.2817f,82.0313f, +-97.6563f,32.08f,82.0313f, +-93.75f,31.4037f,82.0313f, +-89.8438f,30.2769f,82.0313f, +-85.9375f,28.1374f,82.0313f, +-82.0313f,25.4814f,82.0313f, +-78.125f,24.1831f,82.0313f, +-74.2188f,22.6148f,82.0313f, +-70.3125f,19.2585f,82.0313f, +-66.4063f,18.6785f,82.0313f, +-62.5f,17.7889f,82.0313f, +-58.5938f,16.5855f,82.0313f, +-54.6875f,14.6918f,82.0313f, +-50.7813f,12.9532f,82.0313f, +-46.875f,12.1502f,82.0313f, +-42.9688f,11.3533f,82.0313f, +-39.0625f,9.8302f,82.0313f, +-35.1563f,9.95311f,82.0313f, +-31.25f,10.7631f,82.0313f, +-27.3438f,10.2187f,82.0313f, +-23.4375f,10.1072f,82.0313f, +-19.5313f,11.299f,82.0313f, +-15.625f,11.5563f,82.0313f, +-11.7188f,13.9188f,82.0313f, +-7.8125f,15.247f,82.0313f, +-3.90625f,15.6866f,82.0313f, +0.0f,15.9694f,82.0313f, +3.90625f,16.9644f,82.0313f, +-250.0f,6.39735f,78.125f, +-246.094f,5.09353f,78.125f, +-242.188f,4.53503f,78.125f, +-238.281f,3.72522f,78.125f, +-234.375f,3.02648f,78.125f, +-230.469f,3.02057f,78.125f, +-226.563f,3.8807f,78.125f, +-222.656f,4.47382f,78.125f, +-218.75f,3.84005f,78.125f, +-214.844f,2.7347f,78.125f, +-210.938f,4.55018f,78.125f, +-207.031f,5.04579f,78.125f, +-203.125f,4.45937f,78.125f, +-199.219f,5.32656f,78.125f, +-195.313f,7.13791f,78.125f, +-191.406f,8.89822f,78.125f, +-187.5f,10.3911f,78.125f, +-183.594f,11.3679f,78.125f, +-179.688f,13.4068f,78.125f, +-175.781f,16.3393f,78.125f, +-171.875f,17.801f,78.125f, +-167.969f,19.0455f,78.125f, +-164.063f,21.4178f,78.125f, +-160.156f,23.555f,78.125f, +-156.25f,25.3953f,78.125f, +-152.344f,26.9657f,78.125f, +-148.438f,28.8194f,78.125f, +-144.531f,31.456f,78.125f, +-140.625f,33.3499f,78.125f, +-136.719f,34.2296f,78.125f, +-132.813f,34.5964f,78.125f, +-128.906f,35.7399f,78.125f, +-125.0f,35.4576f,78.125f, +-121.094f,35.7986f,78.125f, +-117.188f,34.4641f,78.125f, +-113.281f,33.925f,78.125f, +-109.375f,32.0574f,78.125f, +-105.469f,31.6743f,78.125f, +-101.563f,31.65f,78.125f, +-97.6563f,31.9461f,78.125f, +-93.75f,31.2261f,78.125f, +-89.8438f,30.4701f,78.125f, +-85.9375f,27.7569f,78.125f, +-82.0313f,25.4553f,78.125f, +-78.125f,23.3917f,78.125f, +-74.2188f,21.6944f,78.125f, +-70.3125f,18.6818f,78.125f, +-66.4063f,17.4066f,78.125f, +-62.5f,17.1317f,78.125f, +-58.5938f,16.5093f,78.125f, +-54.6875f,14.9512f,78.125f, +-50.7813f,13.228f,78.125f, +-46.875f,11.4638f,78.125f, +-42.9688f,10.3877f,78.125f, +-39.0625f,9.7131f,78.125f, +-35.1563f,10.0477f,78.125f, +-31.25f,10.325f,78.125f, +-27.3438f,10.317f,78.125f, +-23.4375f,10.9076f,78.125f, +-19.5313f,11.7808f,78.125f, +-15.625f,14.1905f,78.125f, +-11.7188f,15.6035f,78.125f, +-7.8125f,16.0979f,78.125f, +-3.90625f,16.6425f,78.125f, +0.0f,17.2837f,78.125f, +3.90625f,18.8244f,78.125f, +-250.0f,6.03592f,74.2188f, +-246.094f,5.17606f,74.2188f, +-242.188f,3.7036f,74.2188f, +-238.281f,3.69f,74.2188f, +-234.375f,4.60611f,74.2188f, +-230.469f,4.52682f,74.2188f, +-226.563f,5.59937f,74.2188f, +-222.656f,6.25837f,74.2188f, +-218.75f,5.11517f,74.2188f, +-214.844f,4.67242f,74.2188f, +-210.938f,5.76173f,74.2188f, +-207.031f,6.80461f,74.2188f, +-203.125f,6.95083f,74.2188f, +-199.219f,7.35893f,74.2188f, +-195.313f,8.63949f,74.2188f, +-191.406f,10.4144f,74.2188f, +-187.5f,11.8105f,74.2188f, +-183.594f,13.4583f,74.2188f, +-179.688f,15.5665f,74.2188f, +-175.781f,18.2568f,74.2188f, +-171.875f,19.1732f,74.2188f, +-167.969f,21.3098f,74.2188f, +-164.063f,23.6359f,74.2188f, +-160.156f,25.3154f,74.2188f, +-156.25f,27.6289f,74.2188f, +-152.344f,28.8953f,74.2188f, +-148.438f,30.5098f,74.2188f, +-144.531f,32.3942f,74.2188f, +-140.625f,33.3325f,74.2188f, +-136.719f,33.8009f,74.2188f, +-132.813f,35.0803f,74.2188f, +-128.906f,34.737f,74.2188f, +-125.0f,34.3656f,74.2188f, +-121.094f,34.2107f,74.2188f, +-117.188f,33.1645f,74.2188f, +-113.281f,32.0615f,74.2188f, +-109.375f,32.0827f,74.2188f, +-105.469f,32.4658f,74.2188f, +-101.563f,31.6315f,74.2188f, +-97.6563f,30.9698f,74.2188f, +-93.75f,30.6464f,74.2188f, +-89.8438f,29.9645f,74.2188f, +-85.9375f,27.4393f,74.2188f, +-82.0313f,25.2807f,74.2188f, +-78.125f,23.57f,74.2188f, +-74.2188f,20.653f,74.2188f, +-70.3125f,18.1395f,74.2188f, +-66.4063f,17.6585f,74.2188f, +-62.5f,17.2798f,74.2188f, +-58.5938f,16.6041f,74.2188f, +-54.6875f,14.6913f,74.2188f, +-50.7813f,13.1416f,74.2188f, +-46.875f,10.9374f,74.2188f, +-42.9688f,9.39485f,74.2188f, +-39.0625f,9.21956f,74.2188f, +-35.1563f,9.74875f,74.2188f, +-31.25f,10.3932f,74.2188f, +-27.3438f,10.7996f,74.2188f, +-23.4375f,11.5538f,74.2188f, +-19.5313f,13.5418f,74.2188f, +-15.625f,15.6336f,74.2188f, +-11.7188f,16.3846f,74.2188f, +-7.8125f,17.738f,74.2188f, +-3.90625f,17.98f,74.2188f, +0.0f,19.1669f,74.2188f, +3.90625f,20.6829f,74.2188f, +-250.0f,5.45149f,70.3125f, +-246.094f,4.83779f,70.3125f, +-242.188f,3.60093f,70.3125f, +-238.281f,3.26469f,70.3125f, +-234.375f,4.06145f,70.3125f, +-230.469f,5.31565f,70.3125f, +-226.563f,6.65809f,70.3125f, +-222.656f,6.70538f,70.3125f, +-218.75f,6.93258f,70.3125f, +-214.844f,6.84841f,70.3125f, +-210.938f,6.9662f,70.3125f, +-207.031f,7.74003f,70.3125f, +-203.125f,8.68749f,70.3125f, +-199.219f,9.06225f,70.3125f, +-195.313f,10.0803f,70.3125f, +-191.406f,12.202f,70.3125f, +-187.5f,14.063f,70.3125f, +-183.594f,15.732f,70.3125f, +-179.688f,18.3972f,70.3125f, +-175.781f,19.5054f,70.3125f, +-171.875f,20.8927f,70.3125f, +-167.969f,23.3843f,70.3125f, +-164.063f,25.5894f,70.3125f, +-160.156f,27.0506f,70.3125f, +-156.25f,28.6483f,70.3125f, +-152.344f,31.3986f,70.3125f, +-148.438f,32.5255f,70.3125f, +-144.531f,33.0315f,70.3125f, +-140.625f,33.0927f,70.3125f, +-136.719f,33.7595f,70.3125f, +-132.813f,34.1872f,70.3125f, +-128.906f,33.4924f,70.3125f, +-125.0f,34.1817f,70.3125f, +-121.094f,33.4642f,70.3125f, +-117.188f,32.3231f,70.3125f, +-113.281f,32.1235f,70.3125f, +-109.375f,32.674f,70.3125f, +-105.469f,32.7558f,70.3125f, +-101.563f,32.4896f,70.3125f, +-97.6563f,30.7945f,70.3125f, +-93.75f,30.1182f,70.3125f, +-89.8438f,28.6969f,70.3125f, +-85.9375f,26.606f,70.3125f, +-82.0313f,24.8053f,70.3125f, +-78.125f,23.3599f,70.3125f, +-74.2188f,20.5363f,70.3125f, +-70.3125f,18.2858f,70.3125f, +-66.4063f,17.647f,70.3125f, +-62.5f,17.3761f,70.3125f, +-58.5938f,16.3124f,70.3125f, +-54.6875f,14.016f,70.3125f, +-50.7813f,11.6317f,70.3125f, +-46.875f,9.68832f,70.3125f, +-42.9688f,8.63692f,70.3125f, +-39.0625f,8.52412f,70.3125f, +-35.1563f,10.3549f,70.3125f, +-31.25f,11.1185f,70.3125f, +-27.3438f,12.8223f,70.3125f, +-23.4375f,14.2548f,70.3125f, +-19.5313f,15.4066f,70.3125f, +-15.625f,16.875f,70.3125f, +-11.7188f,17.7202f,70.3125f, +-7.8125f,18.6716f,70.3125f, +-3.90625f,19.72f,70.3125f, +0.0f,21.3086f,70.3125f, +3.90625f,22.948f,70.3125f, +-250.0f,4.53118f,66.4063f, +-246.094f,3.73568f,66.4063f, +-242.188f,3.80679f,66.4063f, +-238.281f,4.42509f,66.4063f, +-234.375f,5.0317f,66.4063f, +-230.469f,6.63484f,66.4063f, +-226.563f,7.65599f,66.4063f, +-222.656f,8.55305f,66.4063f, +-218.75f,8.71866f,66.4063f, +-214.844f,7.68897f,66.4063f, +-210.938f,8.59141f,66.4063f, +-207.031f,9.73811f,66.4063f, +-203.125f,10.1348f,66.4063f, +-199.219f,10.1075f,66.4063f, +-195.313f,11.1394f,66.4063f, +-191.406f,13.5829f,66.4063f, +-187.5f,15.4951f,66.4063f, +-183.594f,17.5574f,66.4063f, +-179.688f,19.9291f,66.4063f, +-175.781f,21.0567f,66.4063f, +-171.875f,22.5003f,66.4063f, +-167.969f,25.5993f,66.4063f, +-164.063f,27.0097f,66.4063f, +-160.156f,27.9166f,66.4063f, +-156.25f,29.8989f,66.4063f, +-152.344f,32.1785f,66.4063f, +-148.438f,34.0669f,66.4063f, +-144.531f,34.5129f,66.4063f, +-140.625f,34.1795f,66.4063f, +-136.719f,33.3311f,66.4063f, +-132.813f,32.969f,66.4063f, +-128.906f,32.9477f,66.4063f, +-125.0f,33.5186f,66.4063f, +-121.094f,32.9715f,66.4063f, +-117.188f,32.4898f,66.4063f, +-113.281f,33.0858f,66.4063f, +-109.375f,32.6501f,66.4063f, +-105.469f,32.847f,66.4063f, +-101.563f,32.8074f,66.4063f, +-97.6563f,31.5661f,66.4063f, +-93.75f,29.4807f,66.4063f, +-89.8438f,28.6706f,66.4063f, +-85.9375f,26.408f,66.4063f, +-82.0313f,24.3989f,66.4063f, +-78.125f,22.4069f,66.4063f, +-74.2188f,20.2026f,66.4063f, +-70.3125f,18.5513f,66.4063f, +-66.4063f,17.0548f,66.4063f, +-62.5f,17.0623f,66.4063f, +-58.5938f,15.9909f,66.4063f, +-54.6875f,13.3885f,66.4063f, +-50.7813f,11.8657f,66.4063f, +-46.875f,9.02652f,66.4063f, +-42.9688f,8.99046f,66.4063f, +-39.0625f,10.0543f,66.4063f, +-35.1563f,11.7078f,66.4063f, +-31.25f,12.4956f,66.4063f, +-27.3438f,14.0575f,66.4063f, +-23.4375f,15.2147f,66.4063f, +-19.5313f,16.7089f,66.4063f, +-15.625f,17.8009f,66.4063f, +-11.7188f,19.0086f,66.4063f, +-7.8125f,20.9864f,66.4063f, +-3.90625f,22.6943f,66.4063f, +0.0f,23.9641f,66.4063f, +3.90625f,25.5564f,66.4063f, +-250.0f,4.6779f,62.5f, +-246.094f,4.41735f,62.5f, +-242.188f,3.93647f,62.5f, +-238.281f,4.50648f,62.5f, +-234.375f,5.52163f,62.5f, +-230.469f,7.10395f,62.5f, +-226.563f,8.10257f,62.5f, +-222.656f,8.36726f,62.5f, +-218.75f,8.58321f,62.5f, +-214.844f,8.56809f,62.5f, +-210.938f,9.95321f,62.5f, +-207.031f,10.4904f,62.5f, +-203.125f,10.812f,62.5f, +-199.219f,11.5942f,62.5f, +-195.313f,13.0371f,62.5f, +-191.406f,14.6432f,62.5f, +-187.5f,16.7375f,62.5f, +-183.594f,18.4129f,62.5f, +-179.688f,20.9534f,62.5f, +-175.781f,23.1161f,62.5f, +-171.875f,25.0267f,62.5f, +-167.969f,26.7355f,62.5f, +-164.063f,27.6983f,62.5f, +-160.156f,29.1111f,62.5f, +-156.25f,31.1905f,62.5f, +-152.344f,32.9766f,62.5f, +-148.438f,33.4703f,62.5f, +-144.531f,33.714f,62.5f, +-140.625f,33.649f,62.5f, +-136.719f,33.0246f,62.5f, +-132.813f,32.7386f,62.5f, +-128.906f,32.6069f,62.5f, +-125.0f,32.6579f,62.5f, +-121.094f,31.5955f,62.5f, +-117.188f,31.8589f,62.5f, +-113.281f,32.7188f,62.5f, +-109.375f,32.889f,62.5f, +-105.469f,32.7317f,62.5f, +-101.563f,32.4229f,62.5f, +-97.6563f,31.2118f,62.5f, +-93.75f,30.6824f,62.5f, +-89.8438f,28.584f,62.5f, +-85.9375f,26.1183f,62.5f, +-82.0313f,23.8148f,62.5f, +-78.125f,22.0333f,62.5f, +-74.2188f,20.178f,62.5f, +-70.3125f,18.704f,62.5f, +-66.4063f,16.8036f,62.5f, +-62.5f,15.7173f,62.5f, +-58.5938f,13.9284f,62.5f, +-54.6875f,13.0731f,62.5f, +-50.7813f,11.8974f,62.5f, +-46.875f,9.91347f,62.5f, +-42.9688f,10.1439f,62.5f, +-39.0625f,11.304f,62.5f, +-35.1563f,12.5111f,62.5f, +-31.25f,14.112f,62.5f, +-27.3438f,15.3325f,62.5f, +-23.4375f,16.6214f,62.5f, +-19.5313f,17.8469f,62.5f, +-15.625f,19.2987f,62.5f, +-11.7188f,20.9518f,62.5f, +-7.8125f,23.4289f,62.5f, +-3.90625f,24.9379f,62.5f, +0.0f,26.156f,62.5f, +3.90625f,27.1929f,62.5f, +-250.0f,4.23938f,58.5938f, +-246.094f,4.819f,58.5938f, +-242.188f,4.63067f,58.5938f, +-238.281f,5.29023f,58.5938f, +-234.375f,6.48193f,58.5938f, +-230.469f,6.85856f,58.5938f, +-226.563f,8.4748f,58.5938f, +-222.656f,8.76416f,58.5938f, +-218.75f,9.24425f,58.5938f, +-214.844f,9.67654f,58.5938f, +-210.938f,10.8063f,58.5938f, +-207.031f,12.3237f,58.5938f, +-203.125f,12.7409f,58.5938f, +-199.219f,12.7587f,58.5938f, +-195.313f,14.3653f,58.5938f, +-191.406f,16.1467f,58.5938f, +-187.5f,17.0489f,58.5938f, +-183.594f,19.2091f,58.5938f, +-179.688f,21.7856f,58.5938f, +-175.781f,24.7829f,58.5938f, +-171.875f,26.2396f,58.5938f, +-167.969f,27.2756f,58.5938f, +-164.063f,28.2919f,58.5938f, +-160.156f,30.5945f,58.5938f, +-156.25f,32.2617f,58.5938f, +-152.344f,32.9049f,58.5938f, +-148.438f,32.8002f,58.5938f, +-144.531f,32.4751f,58.5938f, +-140.625f,32.4049f,58.5938f, +-136.719f,33.5631f,58.5938f, +-132.813f,33.3828f,58.5938f, +-128.906f,33.1064f,58.5938f, +-125.0f,32.3054f,58.5938f, +-121.094f,32.5047f,58.5938f, +-117.188f,32.3246f,58.5938f, +-113.281f,32.4393f,58.5938f, +-109.375f,32.553f,58.5938f, +-105.469f,32.9281f,58.5938f, +-101.563f,31.8539f,58.5938f, +-97.6563f,30.9253f,58.5938f, +-93.75f,30.4328f,58.5938f, +-89.8438f,28.3295f,58.5938f, +-85.9375f,25.5393f,58.5938f, +-82.0313f,23.0691f,58.5938f, +-78.125f,21.505f,58.5938f, +-74.2188f,21.0748f,58.5938f, +-70.3125f,19.1186f,58.5938f, +-66.4063f,16.7814f,58.5938f, +-62.5f,15.2179f,58.5938f, +-58.5938f,14.1291f,58.5938f, +-54.6875f,13.2351f,58.5938f, +-50.7813f,11.896f,58.5938f, +-46.875f,11.0911f,58.5938f, +-42.9688f,12.7485f,58.5938f, +-39.0625f,13.7045f,58.5938f, +-35.1563f,14.6128f,58.5938f, +-31.25f,15.546f,58.5938f, +-27.3438f,16.7828f,58.5938f, +-23.4375f,18.7578f,58.5938f, +-19.5313f,19.7951f,58.5938f, +-15.625f,21.8594f,58.5938f, +-11.7188f,22.7269f,58.5938f, +-7.8125f,24.983f,58.5938f, +-3.90625f,26.43f,58.5938f, +0.0f,27.4466f,58.5938f, +3.90625f,28.3495f,58.5938f, +-250.0f,3.62748f,54.6875f, +-246.094f,3.83329f,54.6875f, +-242.188f,4.44022f,54.6875f, +-238.281f,5.27514f,54.6875f, +-234.375f,7.43995f,54.6875f, +-230.469f,7.59176f,54.6875f, +-226.563f,8.28985f,54.6875f, +-222.656f,9.62184f,54.6875f, +-218.75f,10.6613f,54.6875f, +-214.844f,11.0914f,54.6875f, +-210.938f,12.2186f,54.6875f, +-207.031f,13.1985f,54.6875f, +-203.125f,13.9982f,54.6875f, +-199.219f,14.3187f,54.6875f, +-195.313f,14.8791f,54.6875f, +-191.406f,16.5829f,54.6875f, +-187.5f,18.231f,54.6875f, +-183.594f,20.0621f,54.6875f, +-179.688f,22.8941f,54.6875f, +-175.781f,25.0841f,54.6875f, +-171.875f,26.5655f,54.6875f, +-167.969f,27.3542f,54.6875f, +-164.063f,29.2247f,54.6875f, +-160.156f,30.91f,54.6875f, +-156.25f,33.3376f,54.6875f, +-152.344f,32.8808f,54.6875f, +-148.438f,32.5783f,54.6875f, +-144.531f,32.6138f,54.6875f, +-140.625f,32.9002f,54.6875f, +-136.719f,34.2312f,54.6875f, +-132.813f,33.8335f,54.6875f, +-128.906f,32.8545f,54.6875f, +-125.0f,33.6683f,54.6875f, +-121.094f,32.9953f,54.6875f, +-117.188f,32.5096f,54.6875f, +-113.281f,32.4307f,54.6875f, +-109.375f,31.8214f,54.6875f, +-105.469f,31.851f,54.6875f, +-101.563f,31.6383f,54.6875f, +-97.6563f,30.4359f,54.6875f, +-93.75f,28.9306f,54.6875f, +-89.8438f,26.5955f,54.6875f, +-85.9375f,24.7234f,54.6875f, +-82.0313f,23.0595f,54.6875f, +-78.125f,21.3558f,54.6875f, +-74.2188f,20.3788f,54.6875f, +-70.3125f,19.3201f,54.6875f, +-66.4063f,16.9597f,54.6875f, +-62.5f,14.6652f,54.6875f, +-58.5938f,14.4899f,54.6875f, +-54.6875f,13.3432f,54.6875f, +-50.7813f,12.3286f,54.6875f, +-46.875f,12.6498f,54.6875f, +-42.9688f,14.2651f,54.6875f, +-39.0625f,15.6887f,54.6875f, +-35.1563f,16.2038f,54.6875f, +-31.25f,17.2337f,54.6875f, +-27.3438f,18.7628f,54.6875f, +-23.4375f,20.2472f,54.6875f, +-19.5313f,21.6809f,54.6875f, +-15.625f,24.084f,54.6875f, +-11.7188f,25.1582f,54.6875f, +-7.8125f,26.7f,54.6875f, +-3.90625f,27.5421f,54.6875f, +0.0f,28.3244f,54.6875f, +3.90625f,29.2057f,54.6875f, +-250.0f,3.74657f,50.7813f, +-246.094f,3.89172f,50.7813f, +-242.188f,4.12295f,50.7813f, +-238.281f,5.16915f,50.7813f, +-234.375f,6.30394f,50.7813f, +-230.469f,7.21975f,50.7813f, +-226.563f,8.61249f,50.7813f, +-222.656f,10.1295f,50.7813f, +-218.75f,12.2813f,50.7813f, +-214.844f,12.3309f,50.7813f, +-210.938f,13.3907f,50.7813f, +-207.031f,14.1528f,50.7813f, +-203.125f,14.0334f,50.7813f, +-199.219f,14.814f,50.7813f, +-195.313f,16.69f,50.7813f, +-191.406f,17.639f,50.7813f, +-187.5f,19.261f,50.7813f, +-183.594f,20.748f,50.7813f, +-179.688f,23.3343f,50.7813f, +-175.781f,25.4837f,50.7813f, +-171.875f,26.8456f,50.7813f, +-167.969f,27.7788f,50.7813f, +-164.063f,30.0174f,50.7813f, +-160.156f,31.0689f,50.7813f, +-156.25f,32.5898f,50.7813f, +-152.344f,32.5672f,50.7813f, +-148.438f,32.4654f,50.7813f, +-144.531f,33.702f,50.7813f, +-140.625f,34.7593f,50.7813f, +-136.719f,33.9086f,50.7813f, +-132.813f,33.681f,50.7813f, +-128.906f,33.6369f,50.7813f, +-125.0f,34.0371f,50.7813f, +-121.094f,34.0479f,50.7813f, +-117.188f,34.513f,50.7813f, +-113.281f,33.7072f,50.7813f, +-109.375f,32.2763f,50.7813f, +-105.469f,32.0608f,50.7813f, +-101.563f,31.0833f,50.7813f, +-97.6563f,29.9168f,50.7813f, +-93.75f,28.7604f,50.7813f, +-89.8438f,26.9563f,50.7813f, +-85.9375f,24.7908f,50.7813f, +-82.0313f,23.7925f,50.7813f, +-78.125f,21.7037f,50.7813f, +-74.2188f,19.5308f,50.7813f, +-70.3125f,19.3367f,50.7813f, +-66.4063f,17.8482f,50.7813f, +-62.5f,14.2491f,50.7813f, +-58.5938f,14.7414f,50.7813f, +-54.6875f,14.0395f,50.7813f, +-50.7813f,12.9738f,50.7813f, +-46.875f,13.9471f,50.7813f, +-42.9688f,15.8319f,50.7813f, +-39.0625f,16.6566f,50.7813f, +-35.1563f,17.1252f,50.7813f, +-31.25f,18.6998f,50.7813f, +-27.3438f,20.877f,50.7813f, +-23.4375f,22.0249f,50.7813f, +-19.5313f,22.9369f,50.7813f, +-15.625f,25.686f,50.7813f, +-11.7188f,26.1758f,50.7813f, +-7.8125f,28.3828f,50.7813f, +-3.90625f,28.7973f,50.7813f, +0.0f,29.7276f,50.7813f, +3.90625f,30.4306f,50.7813f, +-250.0f,3.69244f,46.875f, +-246.094f,3.88583f,46.875f, +-242.188f,3.98468f,46.875f, +-238.281f,5.01772f,46.875f, +-234.375f,7.23791f,46.875f, +-230.469f,7.78117f,46.875f, +-226.563f,8.55298f,46.875f, +-222.656f,10.2684f,46.875f, +-218.75f,11.1917f,46.875f, +-214.844f,12.411f,46.875f, +-210.938f,13.7214f,46.875f, +-207.031f,14.4662f,46.875f, +-203.125f,15.536f,46.875f, +-199.219f,15.6035f,46.875f, +-195.313f,16.8456f,46.875f, +-191.406f,18.4656f,46.875f, +-187.5f,19.415f,46.875f, +-183.594f,20.8504f,46.875f, +-179.688f,23.9388f,46.875f, +-175.781f,26.2956f,46.875f, +-171.875f,27.6728f,46.875f, +-167.969f,28.2497f,46.875f, +-164.063f,29.6503f,46.875f, +-160.156f,31.9344f,46.875f, +-156.25f,33.4163f,46.875f, +-152.344f,33.428f,46.875f, +-148.438f,33.3157f,46.875f, +-144.531f,33.6261f,46.875f, +-140.625f,35.1888f,46.875f, +-136.719f,34.8434f,46.875f, +-132.813f,34.1219f,46.875f, +-128.906f,34.4564f,46.875f, +-125.0f,34.9729f,46.875f, +-121.094f,34.8811f,46.875f, +-117.188f,35.185f,46.875f, +-113.281f,34.138f,46.875f, +-109.375f,32.7077f,46.875f, +-105.469f,32.2219f,46.875f, +-101.563f,31.2475f,46.875f, +-97.6563f,29.9637f,46.875f, +-93.75f,28.1214f,46.875f, +-89.8438f,27.0889f,46.875f, +-85.9375f,25.092f,46.875f, +-82.0313f,23.3983f,46.875f, +-78.125f,22.275f,46.875f, +-74.2188f,19.8598f,46.875f, +-70.3125f,18.8797f,46.875f, +-66.4063f,17.2468f,46.875f, +-62.5f,15.4985f,46.875f, +-58.5938f,14.5357f,46.875f, +-54.6875f,14.6964f,46.875f, +-50.7813f,13.3496f,46.875f, +-46.875f,15.6354f,46.875f, +-42.9688f,16.7177f,46.875f, +-39.0625f,17.4527f,46.875f, +-35.1563f,18.2826f,46.875f, +-31.25f,20.3293f,46.875f, +-27.3438f,22.684f,46.875f, +-23.4375f,23.538f,46.875f, +-19.5313f,24.3046f,46.875f, +-15.625f,26.1113f,46.875f, +-11.7188f,27.4881f,46.875f, +-7.8125f,29.3572f,46.875f, +-3.90625f,29.786f,46.875f, +0.0f,30.3637f,46.875f, +3.90625f,30.8772f,46.875f, +-250.0f,4.08083f,42.9688f, +-246.094f,4.09778f,42.9688f, +-242.188f,3.87631f,42.9688f, +-238.281f,5.12214f,42.9688f, +-234.375f,6.70993f,42.9688f, +-230.469f,7.75806f,42.9688f, +-226.563f,8.13676f,42.9688f, +-222.656f,8.85151f,42.9688f, +-218.75f,10.9378f,42.9688f, +-214.844f,12.4043f,42.9688f, +-210.938f,13.4636f,42.9688f, +-207.031f,14.7352f,42.9688f, +-203.125f,15.605f,42.9688f, +-199.219f,15.7497f,42.9688f, +-195.313f,17.184f,42.9688f, +-191.406f,19.3679f,42.9688f, +-187.5f,21.1701f,42.9688f, +-183.594f,22.7204f,42.9688f, +-179.688f,24.8128f,42.9688f, +-175.781f,26.7707f,42.9688f, +-171.875f,27.7521f,42.9688f, +-167.969f,28.8689f,42.9688f, +-164.063f,31.1205f,42.9688f, +-160.156f,33.289f,42.9688f, +-156.25f,34.2815f,42.9688f, +-152.344f,33.9797f,42.9688f, +-148.438f,34.2527f,42.9688f, +-144.531f,34.1886f,42.9688f, +-140.625f,34.868f,42.9688f, +-136.719f,35.6569f,42.9688f, +-132.813f,35.4999f,42.9688f, +-128.906f,35.4373f,42.9688f, +-125.0f,36.373f,42.9688f, +-121.094f,35.4304f,42.9688f, +-117.188f,34.3543f,42.9688f, +-113.281f,35.0651f,42.9688f, +-109.375f,33.5051f,42.9688f, +-105.469f,32.471f,42.9688f, +-101.563f,31.2764f,42.9688f, +-97.6563f,29.7633f,42.9688f, +-93.75f,27.9107f,42.9688f, +-89.8438f,26.5273f,42.9688f, +-85.9375f,25.2444f,42.9688f, +-82.0313f,23.6093f,42.9688f, +-78.125f,21.9684f,42.9688f, +-74.2188f,19.4992f,42.9688f, +-70.3125f,17.8231f,42.9688f, +-66.4063f,17.4082f,42.9688f, +-62.5f,17.0938f,42.9688f, +-58.5938f,15.3348f,42.9688f, +-54.6875f,14.7964f,42.9688f, +-50.7813f,14.9948f,42.9688f, +-46.875f,17.1807f,42.9688f, +-42.9688f,18.118f,42.9688f, +-39.0625f,19.0809f,42.9688f, +-35.1563f,19.6971f,42.9688f, +-31.25f,21.652f,42.9688f, +-27.3438f,23.4343f,42.9688f, +-23.4375f,24.5708f,42.9688f, +-19.5313f,25.2003f,42.9688f, +-15.625f,26.8391f,42.9688f, +-11.7188f,28.9343f,42.9688f, +-7.8125f,29.9079f,42.9688f, +-3.90625f,31.268f,42.9688f, +0.0f,31.3916f,42.9688f, +3.90625f,31.8945f,42.9688f, +-250.0f,4.27976f,39.0625f, +-246.094f,4.20341f,39.0625f, +-242.188f,3.80298f,39.0625f, +-238.281f,4.79243f,39.0625f, +-234.375f,5.51846f,39.0625f, +-230.469f,6.91597f,39.0625f, +-226.563f,8.25726f,39.0625f, +-222.656f,8.85037f,39.0625f, +-218.75f,9.57429f,39.0625f, +-214.844f,11.3899f,39.0625f, +-210.938f,12.5806f,39.0625f, +-207.031f,14.2509f,39.0625f, +-203.125f,14.7828f,39.0625f, +-199.219f,15.9801f,39.0625f, +-195.313f,17.4225f,39.0625f, +-191.406f,19.6018f,39.0625f, +-187.5f,22.1095f,39.0625f, +-183.594f,23.8333f,39.0625f, +-179.688f,25.0671f,39.0625f, +-175.781f,27.1067f,39.0625f, +-171.875f,28.5f,39.0625f, +-167.969f,29.9625f,39.0625f, +-164.063f,32.3895f,39.0625f, +-160.156f,33.8224f,39.0625f, +-156.25f,34.3349f,39.0625f, +-152.344f,34.4661f,39.0625f, +-148.438f,34.7236f,39.0625f, +-144.531f,34.1129f,39.0625f, +-140.625f,34.9033f,39.0625f, +-136.719f,35.6229f,39.0625f, +-132.813f,35.7143f,39.0625f, +-128.906f,36.7151f,39.0625f, +-125.0f,36.9574f,39.0625f, +-121.094f,36.0729f,39.0625f, +-117.188f,35.2171f,39.0625f, +-113.281f,34.9343f,39.0625f, +-109.375f,34.5707f,39.0625f, +-105.469f,33.5046f,39.0625f, +-101.563f,31.353f,39.0625f, +-97.6563f,30.0283f,39.0625f, +-93.75f,28.6272f,39.0625f, +-89.8438f,26.4389f,39.0625f, +-85.9375f,24.8159f,39.0625f, +-82.0313f,23.0295f,39.0625f, +-78.125f,21.1082f,39.0625f, +-74.2188f,19.1239f,39.0625f, +-70.3125f,18.0914f,39.0625f, +-66.4063f,17.3227f,39.0625f, +-62.5f,17.1022f,39.0625f, +-58.5938f,16.4298f,39.0625f, +-54.6875f,15.6704f,39.0625f, +-50.7813f,16.5664f,39.0625f, +-46.875f,18.478f,39.0625f, +-42.9688f,19.4144f,39.0625f, +-39.0625f,19.9351f,39.0625f, +-35.1563f,20.3447f,39.0625f, +-31.25f,22.4348f,39.0625f, +-27.3438f,24.5713f,39.0625f, +-23.4375f,25.5465f,39.0625f, +-19.5313f,26.485f,39.0625f, +-15.625f,28.292f,39.0625f, +-11.7188f,30.0016f,39.0625f, +-7.8125f,32.2532f,39.0625f, +-3.90625f,33.6327f,39.0625f, +0.0f,33.835f,39.0625f, +3.90625f,34.9171f,39.0625f, +-250.0f,3.91889f,35.1563f, +-246.094f,3.38127f,35.1563f, +-242.188f,3.26935f,35.1563f, +-238.281f,4.06778f,35.1563f, +-234.375f,4.87411f,35.1563f, +-230.469f,6.48873f,35.1563f, +-226.563f,7.17326f,35.1563f, +-222.656f,8.21235f,35.1563f, +-218.75f,8.21965f,35.1563f, +-214.844f,10.417f,35.1563f, +-210.938f,11.9497f,35.1563f, +-207.031f,13.4145f,35.1563f, +-203.125f,14.0876f,35.1563f, +-199.219f,15.5077f,35.1563f, +-195.313f,16.9011f,35.1563f, +-191.406f,20.4395f,35.1563f, +-187.5f,23.001f,35.1563f, +-183.594f,24.0199f,35.1563f, +-179.688f,25.7082f,35.1563f, +-175.781f,27.3018f,35.1563f, +-171.875f,28.9584f,35.1563f, +-167.969f,31.1478f,35.1563f, +-164.063f,32.8635f,35.1563f, +-160.156f,33.5517f,35.1563f, +-156.25f,34.5761f,35.1563f, +-152.344f,34.5761f,35.1563f, +-148.438f,34.2002f,35.1563f, +-144.531f,34.7177f,35.1563f, +-140.625f,35.5653f,35.1563f, +-136.719f,35.7993f,35.1563f, +-132.813f,37.1127f,35.1563f, +-128.906f,37.2477f,35.1563f, +-125.0f,36.8734f,35.1563f, +-121.094f,35.4154f,35.1563f, +-117.188f,34.8545f,35.1563f, +-113.281f,35.4317f,35.1563f, +-109.375f,34.9205f,35.1563f, +-105.469f,33.5115f,35.1563f, +-101.563f,32.2368f,35.1563f, +-97.6563f,30.3601f,35.1563f, +-93.75f,29.2913f,35.1563f, +-89.8438f,27.4791f,35.1563f, +-85.9375f,24.811f,35.1563f, +-82.0313f,23.4984f,35.1563f, +-78.125f,21.456f,35.1563f, +-74.2188f,19.8992f,35.1563f, +-70.3125f,17.7354f,35.1563f, +-66.4063f,17.3066f,35.1563f, +-62.5f,17.1745f,35.1563f, +-58.5938f,16.5285f,35.1563f, +-54.6875f,17.2826f,35.1563f, +-50.7813f,18.6936f,35.1563f, +-46.875f,19.4228f,35.1563f, +-42.9688f,20.2022f,35.1563f, +-39.0625f,21.4261f,35.1563f, +-35.1563f,21.5779f,35.1563f, +-31.25f,24.0097f,35.1563f, +-27.3438f,25.4481f,35.1563f, +-23.4375f,26.0036f,35.1563f, +-19.5313f,27.4346f,35.1563f, +-15.625f,30.2459f,35.1563f, +-11.7188f,32.81f,35.1563f, +-7.8125f,34.7924f,35.1563f, +-3.90625f,35.8907f,35.1563f, +0.0f,36.9755f,35.1563f, +3.90625f,38.5427f,35.1563f, +-250.0f,2.28536f,31.25f, +-246.094f,1.63842f,31.25f, +-242.188f,2.40273f,31.25f, +-238.281f,3.19518f,31.25f, +-234.375f,3.99394f,31.25f, +-230.469f,4.99674f,31.25f, +-226.563f,5.63235f,31.25f, +-222.656f,6.86331f,31.25f, +-218.75f,7.37515f,31.25f, +-214.844f,9.34737f,31.25f, +-210.938f,11.7034f,31.25f, +-207.031f,13.4309f,31.25f, +-203.125f,14.4474f,31.25f, +-199.219f,15.8817f,31.25f, +-195.313f,17.87f,31.25f, +-191.406f,20.9938f,31.25f, +-187.5f,23.5333f,31.25f, +-183.594f,24.4107f,31.25f, +-179.688f,26.0811f,31.25f, +-175.781f,27.9797f,31.25f, +-171.875f,29.4813f,31.25f, +-167.969f,31.7071f,31.25f, +-164.063f,33.0836f,31.25f, +-160.156f,33.5998f,31.25f, +-156.25f,33.5304f,31.25f, +-152.344f,33.9929f,31.25f, +-148.438f,35.4297f,31.25f, +-144.531f,36.4531f,31.25f, +-140.625f,35.9197f,31.25f, +-136.719f,36.6849f,31.25f, +-132.813f,37.8161f,31.25f, +-128.906f,37.6166f,31.25f, +-125.0f,36.9426f,31.25f, +-121.094f,35.6388f,31.25f, +-117.188f,35.0026f,31.25f, +-113.281f,35.386f,31.25f, +-109.375f,34.6287f,31.25f, +-105.469f,33.8962f,31.25f, +-101.563f,32.1844f,31.25f, +-97.6563f,30.7868f,31.25f, +-93.75f,29.267f,31.25f, +-89.8438f,27.2585f,31.25f, +-85.9375f,25.4236f,31.25f, +-82.0313f,23.0281f,31.25f, +-78.125f,21.4593f,31.25f, +-74.2188f,19.4556f,31.25f, +-70.3125f,18.0982f,31.25f, +-66.4063f,17.1214f,31.25f, +-62.5f,17.1751f,31.25f, +-58.5938f,17.1429f,31.25f, +-54.6875f,18.4434f,31.25f, +-50.7813f,19.9422f,31.25f, +-46.875f,21.2124f,31.25f, +-42.9688f,21.2106f,31.25f, +-39.0625f,22.1346f,31.25f, +-35.1563f,23.3082f,31.25f, +-31.25f,24.7044f,31.25f, +-27.3438f,26.2688f,31.25f, +-23.4375f,27.5692f,31.25f, +-19.5313f,30.4099f,31.25f, +-15.625f,33.0453f,31.25f, +-11.7188f,34.9857f,31.25f, +-7.8125f,37.0727f,31.25f, +-3.90625f,39.2219f,31.25f, +0.0f,40.3658f,31.25f, +3.90625f,41.4381f,31.25f, +-250.0f,0.4773f,27.3438f, +-246.094f,0.631847f,27.3438f, +-242.188f,1.21449f,27.3438f, +-238.281f,1.52728f,27.3438f, +-234.375f,2.73146f,27.3438f, +-230.469f,3.65375f,27.3438f, +-226.563f,5.03467f,27.3438f, +-222.656f,6.27065f,27.3438f, +-218.75f,7.56964f,27.3438f, +-214.844f,9.63719f,27.3438f, +-210.938f,11.4022f,27.3438f, +-207.031f,12.7085f,27.3438f, +-203.125f,14.3808f,27.3438f, +-199.219f,15.9121f,27.3438f, +-195.313f,17.8953f,27.3438f, +-191.406f,20.8456f,27.3438f, +-187.5f,22.7705f,27.3438f, +-183.594f,24.5794f,27.3437f, +-179.688f,27.055f,27.3438f, +-175.781f,29.3548f,27.3437f, +-171.875f,30.4534f,27.3438f, +-167.969f,32.4366f,27.3437f, +-164.063f,34.4967f,27.3438f, +-160.156f,34.9614f,27.3437f, +-156.25f,34.9405f,27.3438f, +-152.344f,35.7165f,27.3437f, +-148.438f,37.0387f,27.3438f, +-144.531f,38.0934f,27.3437f, +-140.625f,37.3872f,27.3438f, +-136.719f,36.4336f,27.3437f, +-132.813f,37.0365f,27.3438f, +-128.906f,37.2591f,27.3437f, +-125.0f,36.5502f,27.3438f, +-121.094f,35.4814f,27.3437f, +-117.188f,35.3267f,27.3438f, +-113.281f,34.3757f,27.3437f, +-109.375f,34.2455f,27.3438f, +-105.469f,33.6851f,27.3437f, +-101.563f,32.3527f,27.3438f, +-97.6563f,30.111f,27.3437f, +-93.75f,28.4912f,27.3438f, +-89.8438f,27.0398f,27.3437f, +-85.9375f,24.9699f,27.3438f, +-82.0313f,22.9703f,27.3437f, +-78.125f,21.7502f,27.3438f, +-74.2188f,18.8537f,27.3438f, +-70.3125f,18.2353f,27.3438f, +-66.4063f,18.3708f,27.3438f, +-62.5f,18.6738f,27.3438f, +-58.5938f,18.5559f,27.3438f, +-54.6875f,19.1603f,27.3438f, +-50.7813f,20.8349f,27.3438f, +-46.875f,21.6092f,27.3438f, +-42.9688f,21.9317f,27.3437f, +-39.0625f,23.0486f,27.3438f, +-35.1563f,24.8675f,27.3437f, +-31.25f,25.6906f,27.3438f, +-27.3438f,27.9695f,27.3437f, +-23.4375f,30.3105f,27.3438f, +-19.5313f,33.9897f,27.3437f, +-15.625f,35.6988f,27.3438f, +-11.7188f,37.9213f,27.3437f, +-7.8125f,40.1355f,27.3438f, +-3.90625f,41.6062f,27.3437f, +0.0f,42.273f,27.3438f, +3.90625f,42.7334f,27.3437f, +-250.0f,0.178144f,23.4375f, +-246.094f,1.07943f,23.4375f, +-242.188f,1.52473f,23.4375f, +-238.281f,2.58652f,23.4375f, +-234.375f,3.51451f,23.4375f, +-230.469f,4.23103f,23.4375f, +-226.563f,5.80506f,23.4375f, +-222.656f,7.26086f,23.4375f, +-218.75f,8.85201f,23.4375f, +-214.844f,10.9029f,23.4375f, +-210.938f,12.7138f,23.4375f, +-207.031f,14.9249f,23.4375f, +-203.125f,15.6506f,23.4375f, +-199.219f,16.529f,23.4375f, +-195.313f,17.1535f,23.4375f, +-191.406f,20.5632f,23.4375f, +-187.5f,23.1009f,23.4375f, +-183.594f,24.7859f,23.4375f, +-179.688f,26.8635f,23.4375f, +-175.781f,28.5723f,23.4375f, +-171.875f,30.2918f,23.4375f, +-167.969f,32.7768f,23.4375f, +-164.063f,34.6199f,23.4375f, +-160.156f,35.6902f,23.4375f, +-156.25f,37.1166f,23.4375f, +-152.344f,37.0816f,23.4375f, +-148.438f,37.9995f,23.4375f, +-144.531f,38.687f,23.4375f, +-140.625f,37.9261f,23.4375f, +-136.719f,36.7476f,23.4375f, +-132.813f,37.1839f,23.4375f, +-128.906f,36.8682f,23.4375f, +-125.0f,36.2555f,23.4375f, +-121.094f,34.8461f,23.4375f, +-117.188f,34.5757f,23.4375f, +-113.281f,33.8965f,23.4375f, +-109.375f,33.4987f,23.4375f, +-105.469f,33.02f,23.4375f, +-101.563f,31.4543f,23.4375f, +-97.6563f,29.5899f,23.4375f, +-93.75f,27.8808f,23.4375f, +-89.8438f,26.4886f,23.4375f, +-85.9375f,24.5413f,23.4375f, +-82.0313f,22.6097f,23.4375f, +-78.125f,21.38f,23.4375f, +-74.2188f,19.2574f,23.4375f, +-70.3125f,19.6862f,23.4375f, +-66.4063f,19.3283f,23.4375f, +-62.5f,20.3608f,23.4375f, +-58.5938f,20.9969f,23.4375f, +-54.6875f,20.5645f,23.4375f, +-50.7813f,21.6338f,23.4375f, +-46.875f,22.0705f,23.4375f, +-42.9688f,23.2924f,23.4375f, +-39.0625f,24.8627f,23.4375f, +-35.1563f,25.9292f,23.4375f, +-31.25f,27.2133f,23.4375f, +-27.3438f,29.7296f,23.4375f, +-23.4375f,32.8149f,23.4375f, +-19.5313f,35.5321f,23.4375f, +-15.625f,38.2144f,23.4375f, +-11.7188f,40.2421f,23.4375f, +-7.8125f,41.7479f,23.4375f, +-3.90625f,43.372f,23.4375f, +0.0f,43.7526f,23.4375f, +3.90625f,44.6783f,23.4375f, +-250.0f,0.138221f,19.5313f, +-246.094f,1.4004f,19.5313f, +-242.188f,3.26515f,19.5313f, +-238.281f,3.65276f,19.5313f, +-234.375f,4.90602f,19.5313f, +-230.469f,6.03349f,19.5313f, +-226.563f,7.99773f,19.5313f, +-222.656f,9.41728f,19.5313f, +-218.75f,10.0435f,19.5313f, +-214.844f,12.1613f,19.5313f, +-210.938f,13.6999f,19.5313f, +-207.031f,15.7603f,19.5313f, +-203.125f,16.1549f,19.5313f, +-199.219f,17.1021f,19.5313f, +-195.313f,18.1867f,19.5313f, +-191.406f,20.6836f,19.5313f, +-187.5f,23.0865f,19.5312f, +-183.594f,24.3015f,19.5313f, +-179.688f,26.6623f,19.5312f, +-175.781f,28.232f,19.5313f, +-171.875f,30.6454f,19.5312f, +-167.969f,32.8674f,19.5313f, +-164.063f,35.0881f,19.5312f, +-160.156f,37.2715f,19.5313f, +-156.25f,38.6025f,19.5312f, +-152.344f,38.2781f,19.5313f, +-148.438f,38.4813f,19.5312f, +-144.531f,38.3281f,19.5313f, +-140.625f,38.1441f,19.5312f, +-136.719f,37.6066f,19.5312f, +-132.813f,37.2097f,19.5312f, +-128.906f,36.5694f,19.5312f, +-125.0f,36.2416f,19.5312f, +-121.094f,34.5305f,19.5312f, +-117.188f,33.3684f,19.5312f, +-113.281f,32.7805f,19.5312f, +-109.375f,31.8563f,19.5312f, +-105.469f,31.3398f,19.5312f, +-101.563f,29.7387f,19.5312f, +-97.6563f,28.7121f,19.5312f, +-93.75f,27.8904f,19.5312f, +-89.8438f,26.0256f,19.5312f, +-85.9375f,24.5469f,19.5312f, +-82.0313f,23.3531f,19.5312f, +-78.125f,21.4621f,19.5313f, +-74.2188f,20.3507f,19.5313f, +-70.3125f,20.1879f,19.5313f, +-66.4063f,20.9838f,19.5313f, +-62.5f,22.229f,19.5312f, +-58.5938f,22.355f,19.5312f, +-54.6875f,22.7659f,19.5312f, +-50.7813f,22.9258f,19.5312f, +-46.875f,23.554f,19.5312f, +-42.9688f,24.3861f,19.5312f, +-39.0625f,25.5112f,19.5312f, +-35.1563f,26.8691f,19.5312f, +-31.25f,28.968f,19.5312f, +-27.3438f,31.0124f,19.5312f, +-23.4375f,34.8357f,19.5312f, +-19.5313f,37.2362f,19.5312f, +-15.625f,39.5924f,19.5312f, +-11.7188f,41.5691f,19.5312f, +-7.8125f,43.2441f,19.5312f, +-3.90625f,45.1168f,19.5312f, +0.0f,45.7555f,19.5312f, +3.90625f,46.9055f,19.5312f, +-250.0f,0.462936f,15.625f, +-246.094f,2.15489f,15.625f, +-242.188f,3.69232f,15.625f, +-238.281f,4.89361f,15.625f, +-234.375f,6.95706f,15.625f, +-230.469f,8.37916f,15.625f, +-226.563f,9.21515f,15.625f, +-222.656f,10.0624f,15.625f, +-218.75f,11.6477f,15.625f, +-214.844f,13.257f,15.625f, +-210.938f,14.8699f,15.625f, +-207.031f,15.9852f,15.625f, +-203.125f,17.025f,15.625f, +-199.219f,17.8511f,15.625f, +-195.313f,20.3581f,15.625f, +-191.406f,22.0829f,15.625f, +-187.5f,24.4216f,15.625f, +-183.594f,25.5625f,15.625f, +-179.688f,27.0961f,15.625f, +-175.781f,30.0958f,15.625f, +-171.875f,31.7977f,15.625f, +-167.969f,34.7043f,15.625f, +-164.063f,37.1655f,15.625f, +-160.156f,37.6823f,15.625f, +-156.25f,37.6204f,15.625f, +-152.344f,37.8037f,15.625f, +-148.438f,37.8555f,15.625f, +-144.531f,37.9638f,15.625f, +-140.625f,37.4821f,15.625f, +-136.719f,37.0202f,15.625f, +-132.813f,36.4604f,15.625f, +-128.906f,36.1575f,15.625f, +-125.0f,35.4218f,15.625f, +-121.094f,33.5202f,15.625f, +-117.188f,32.116f,15.625f, +-113.281f,30.9352f,15.625f, +-109.375f,29.8297f,15.625f, +-105.469f,29.9146f,15.625f, +-101.563f,28.7245f,15.625f, +-97.6563f,27.7205f,15.625f, +-93.75f,27.4217f,15.625f, +-89.8438f,25.8557f,15.625f, +-85.9375f,24.0609f,15.625f, +-82.0313f,22.7869f,15.625f, +-78.125f,20.4923f,15.625f, +-74.2188f,21.0025f,15.625f, +-70.3125f,21.2985f,15.625f, +-66.4063f,22.5717f,15.625f, +-62.5f,23.0569f,15.625f, +-58.5938f,23.2123f,15.625f, +-54.6875f,24.1861f,15.625f, +-50.7813f,24.5626f,15.625f, +-46.875f,25.1259f,15.625f, +-42.9688f,25.9995f,15.625f, +-39.0625f,26.8682f,15.625f, +-35.1563f,27.8593f,15.625f, +-31.25f,29.8924f,15.625f, +-27.3438f,32.8894f,15.625f, +-23.4375f,36.2901f,15.625f, +-19.5313f,38.2475f,15.625f, +-15.625f,40.593f,15.625f, +-11.7188f,42.2973f,15.625f, +-7.8125f,45.3308f,15.625f, +-3.90625f,47.345f,15.625f, +0.0f,48.9808f,15.625f, +3.90625f,49.2295f,15.625f, +-250.0f,1.16646f,11.7188f, +-246.094f,2.99331f,11.7188f, +-242.188f,4.37829f,11.7188f, +-238.281f,5.21593f,11.7188f, +-234.375f,6.84374f,11.7188f, +-230.469f,8.34616f,11.7188f, +-226.563f,9.2826f,11.7188f, +-222.656f,9.90104f,11.7188f, +-218.75f,10.9211f,11.7187f, +-214.844f,13.6881f,11.7187f, +-210.938f,15.7745f,11.7187f, +-207.031f,16.2325f,11.7187f, +-203.125f,17.2525f,11.7187f, +-199.219f,19.1108f,11.7187f, +-195.313f,21.4743f,11.7187f, +-191.406f,24.021f,11.7187f, +-187.5f,25.8676f,11.7187f, +-183.594f,27.021f,11.7187f, +-179.688f,28.254f,11.7187f, +-175.781f,31.6036f,11.7187f, +-171.875f,32.629f,11.7187f, +-167.969f,34.9526f,11.7187f, +-164.063f,36.8236f,11.7187f, +-160.156f,37.152f,11.7187f, +-156.25f,37.6659f,11.7187f, +-152.344f,37.4102f,11.7187f, +-148.438f,37.0806f,11.7187f, +-144.531f,37.6299f,11.7187f, +-140.625f,36.7269f,11.7187f, +-136.719f,36.4841f,11.7187f, +-132.813f,35.2557f,11.7187f, +-128.906f,34.7066f,11.7187f, +-125.0f,34.0947f,11.7187f, +-121.094f,32.7343f,11.7187f, +-117.188f,31.5605f,11.7187f, +-113.281f,30.7492f,11.7187f, +-109.375f,30.1608f,11.7187f, +-105.469f,29.9144f,11.7187f, +-101.563f,28.5532f,11.7187f, +-97.6563f,26.2051f,11.7187f, +-93.75f,26.0432f,11.7187f, +-89.8438f,25.1831f,11.7187f, +-85.9375f,23.7935f,11.7187f, +-82.0313f,22.6952f,11.7187f, +-78.125f,21.9812f,11.7187f, +-74.2188f,22.3423f,11.7187f, +-70.3125f,22.4959f,11.7187f, +-66.4063f,22.9438f,11.7187f, +-62.5f,23.6591f,11.7187f, +-58.5938f,24.1634f,11.7187f, +-54.6875f,24.8781f,11.7187f, +-50.7813f,25.3471f,11.7187f, +-46.875f,25.7599f,11.7187f, +-42.9688f,26.61f,11.7187f, +-39.0625f,27.5033f,11.7187f, +-35.1563f,29.2751f,11.7187f, +-31.25f,31.9147f,11.7187f, +-27.3438f,34.1964f,11.7187f, +-23.4375f,36.7734f,11.7187f, +-19.5313f,39.2441f,11.7187f, +-15.625f,41.3269f,11.7187f, +-11.7188f,44.2682f,11.7187f, +-7.8125f,47.2458f,11.7187f, +-3.90625f,49.2199f,11.7187f, +0.0f,50.2546f,11.7187f, +3.90625f,51.1233f,11.7187f, +-250.0f,1.52698f,7.8125f, +-246.094f,2.97227f,7.8125f, +-242.188f,3.77319f,7.8125f, +-238.281f,4.81095f,7.8125f, +-234.375f,5.94458f,7.8125f, +-230.469f,7.45352f,7.8125f, +-226.563f,8.9683f,7.8125f, +-222.656f,9.37348f,7.8125f, +-218.75f,10.3818f,7.8125f, +-214.844f,13.0632f,7.8125f, +-210.938f,15.5836f,7.8125f, +-207.031f,17.1532f,7.8125f, +-203.125f,19.3065f,7.8125f, +-199.219f,21.746f,7.8125f, +-195.313f,23.0026f,7.8125f, +-191.406f,25.1876f,7.8125f, +-187.5f,27.4911f,7.8125f, +-183.594f,28.651f,7.8125f, +-179.688f,28.9685f,7.8125f, +-175.781f,31.1275f,7.8125f, +-171.875f,32.457f,7.8125f, +-167.969f,34.4336f,7.8125f, +-164.063f,35.9124f,7.8125f, +-160.156f,36.5078f,7.8125f, +-156.25f,36.9999f,7.8125f, +-152.344f,36.9517f,7.8125f, +-148.438f,37.9713f,7.8125f, +-144.531f,37.929f,7.8125f, +-140.625f,37.5334f,7.8125f, +-136.719f,36.2798f,7.8125f, +-132.813f,35.1904f,7.8125f, +-128.906f,33.7356f,7.8125f, +-125.0f,34.0968f,7.8125f, +-121.094f,33.5838f,7.8125f, +-117.188f,32.9371f,7.8125f, +-113.281f,32.0353f,7.8125f, +-109.375f,31.4623f,7.8125f, +-105.469f,30.5184f,7.8125f, +-101.563f,28.7396f,7.8125f, +-97.6563f,27.2715f,7.8125f, +-93.75f,26.1242f,7.8125f, +-89.8438f,24.5691f,7.8125f, +-85.9375f,23.931f,7.8125f, +-82.0313f,23.7643f,7.8125f, +-78.125f,22.4588f,7.8125f, +-74.2188f,22.5395f,7.8125f, +-70.3125f,22.9322f,7.8125f, +-66.4063f,23.4361f,7.8125f, +-62.5f,24.2733f,7.8125f, +-58.5938f,24.1873f,7.8125f, +-54.6875f,24.2666f,7.8125f, +-50.7813f,25.2522f,7.8125f, +-46.875f,26.3494f,7.8125f, +-42.9688f,26.8365f,7.8125f, +-39.0625f,27.5515f,7.8125f, +-35.1563f,30.4441f,7.8125f, +-31.25f,33.5547f,7.8125f, +-27.3438f,36.1409f,7.8125f, +-23.4375f,38.1103f,7.8125f, +-19.5313f,39.8171f,7.8125f, +-15.625f,42.1146f,7.8125f, +-11.7188f,45.3603f,7.8125f, +-7.8125f,47.6602f,7.8125f, +-3.90625f,49.963f,7.8125f, +0.0f,51.8119f,7.8125f, +3.90625f,52.2527f,7.8125f, +-250.0f,0.139875f,3.90625f, +-246.094f,1.72995f,3.90625f, +-242.188f,2.60122f,3.90625f, +-238.281f,4.01346f,3.90625f, +-234.375f,5.13654f,3.90625f, +-230.469f,6.69665f,3.90625f, +-226.563f,8.43203f,3.90625f, +-222.656f,9.83442f,3.90625f, +-218.75f,11.3645f,3.90625f, +-214.844f,14.222f,3.90625f, +-210.938f,16.1758f,3.90625f, +-207.031f,18.9127f,3.90625f, +-203.125f,21.2478f,3.90625f, +-199.219f,23.0589f,3.90625f, +-195.313f,24.6025f,3.90625f, +-191.406f,25.8143f,3.90625f, +-187.5f,27.5696f,3.90625f, +-183.594f,29.2176f,3.90625f, +-179.688f,29.6835f,3.90625f, +-175.781f,30.7416f,3.90625f, +-171.875f,31.4405f,3.90625f, +-167.969f,33.0831f,3.90625f, +-164.063f,34.6225f,3.90625f, +-160.156f,35.4992f,3.90625f, +-156.25f,37.4126f,3.90625f, +-152.344f,38.453f,3.90625f, +-148.438f,38.9974f,3.90625f, +-144.531f,38.7871f,3.90625f, +-140.625f,37.6021f,3.90625f, +-136.719f,36.1797f,3.90625f, +-132.813f,34.9906f,3.90625f, +-128.906f,34.1304f,3.90625f, +-125.0f,34.3517f,3.90625f, +-121.094f,33.6612f,3.90625f, +-117.188f,32.7047f,3.90625f, +-113.281f,32.3958f,3.90625f, +-109.375f,31.0818f,3.90625f, +-105.469f,30.9536f,3.90625f, +-101.563f,29.8205f,3.90625f, +-97.6563f,28.4796f,3.90625f, +-93.75f,27.6494f,3.90625f, +-89.8438f,25.5721f,3.90625f, +-85.9375f,24.227f,3.90625f, +-82.0313f,23.2611f,3.90625f, +-78.125f,22.4589f,3.90625f, +-74.2188f,23.2261f,3.90625f, +-70.3125f,23.5025f,3.90625f, +-66.4063f,23.6913f,3.90625f, +-62.5f,24.6785f,3.90625f, +-58.5938f,25.4946f,3.90625f, +-54.6875f,25.9722f,3.90625f, +-50.7813f,26.1977f,3.90625f, +-46.875f,26.8539f,3.90625f, +-42.9688f,27.7268f,3.90625f, +-39.0625f,29.2046f,3.90625f, +-35.1563f,31.79f,3.90625f, +-31.25f,34.2658f,3.90625f, +-27.3438f,35.9914f,3.90625f, +-23.4375f,38.3776f,3.90625f, +-19.5313f,39.8852f,3.90625f, +-15.625f,43.1455f,3.90625f, +-11.7188f,45.5059f,3.90625f, +-7.8125f,47.4257f,3.90625f, +-3.90625f,49.9032f,3.90625f, +0.0f,52.0322f,3.90625f, +3.90625f,52.6186f,3.90625f, +}; + +btScalar Landscape02Nml[] = { +0.376889f,0.897995f,0.227068f, +0.251083f,0.961355f,0.112931f, +0.256071f,0.961946f,0.0953332f, +0.188246f,0.981544f,0.0336933f, +0.321782f,0.946812f,0.00191405f, +0.277829f,0.960055f,0.0332431f, +0.366908f,0.922321f,-0.121252f, +0.346681f,0.936118f,-0.0591191f, +0.34598f,0.936023f,-0.0644918f, +0.326882f,0.934733f,-0.139364f, +0.195537f,0.979014f,-0.0574119f, +0.208421f,0.974173f,-0.0868766f, +0.220158f,0.96963f,-0.106528f, +0.21764f,0.974169f,-0.0602246f, +0.194781f,0.966032f,-0.169831f, +0.137923f,0.97923f,-0.148611f, +-0.0890295f,0.968844f,-0.231118f, +-0.164208f,0.952108f,-0.257926f, +-0.299547f,0.905883f,-0.299413f, +-0.331781f,0.892916f,-0.304338f, +-0.275234f,0.921181f,-0.275086f, +-0.190055f,0.968186f,-0.162776f, +-0.191147f,0.964101f,-0.184313f, +-0.167051f,0.973656f,-0.155201f, +-0.260549f,0.956867f,-0.128527f, +-0.236175f,0.968373f,-0.080466f, +-0.305083f,0.942279f,-0.137969f, +-0.32302f,0.940678f,-0.103844f, +-0.376654f,0.91108f,-0.167524f, +-0.43665f,0.882087f,-0.176802f, +-0.404697f,0.87224f,-0.274621f, +-0.461396f,0.842558f,-0.277868f, +-0.340534f,0.861872f,-0.375783f, +-0.381498f,0.847049f,-0.370091f, +-0.349262f,0.83292f,-0.429255f, +-0.383821f,0.842401f,-0.378209f, +-0.350717f,0.827302f,-0.438826f, +-0.312636f,0.886963f,-0.339934f, +-0.202637f,0.921293f,-0.331899f, +-0.164853f,0.917655f,-0.361571f, +-0.320762f,0.929092f,-0.184116f, +-0.291289f,0.89543f,-0.336684f, +-0.523923f,0.850919f,-0.0379686f, +-0.415222f,0.907809f,-0.0589323f, +-0.464751f,0.884928f,0.030152f, +-0.464228f,0.885715f,0.00114487f, +-0.460666f,0.887573f,-0.00119475f, +-0.527574f,0.824073f,-0.206324f, +-0.569463f,0.819886f,-0.0591577f, +-0.624043f,0.739025f,-0.253797f, +-0.677912f,0.708815f,-0.19498f, +-0.654991f,0.737431f,-0.164874f, +-0.612102f,0.778841f,-0.136883f, +-0.555251f,0.829082f,-0.0657209f, +-0.466796f,0.884362f,-0.00238444f, +-0.393172f,0.917844f,0.0545768f, +-0.415266f,0.902781f,0.111985f, +-0.346174f,0.92512f,0.155936f, +-0.270143f,0.942251f,0.197955f, +-0.242693f,0.931939f,0.269424f, +-0.146828f,0.979561f,0.137484f, +-0.151815f,0.949716f,0.273847f, +-0.23746f,0.962635f,0.130183f, +-0.242269f,0.936807f,0.252385f, +-0.439066f,0.897439f,0.0427119f, +-0.506925f,0.859633f,0.0637107f, +-0.369534f,0.927612f,0.0545955f, +-0.266432f,0.921234f,0.283447f, +-0.0849634f,0.983229f,0.161377f, +-0.142422f,0.97399f,0.176238f, +0.059987f,0.992193f,0.109333f, +-0.00609097f,0.990503f,0.137353f, +0.218751f,0.975042f,-0.0379662f, +0.195675f,0.973574f,0.117747f, +0.412438f,0.903178f,-0.119012f, +0.389829f,0.920771f,0.01463f, +0.471887f,0.878868f,-0.0700914f, +0.512637f,0.843878f,0.158344f, +0.438398f,0.898776f,-0.0028899f, +0.463505f,0.872879f,0.152466f, +0.213581f,0.96879f,0.125817f, +0.217949f,0.966902f,0.132661f, +0.150053f,0.978231f,0.143348f, +0.183142f,0.954792f,0.234161f, +0.324547f,0.937949f,0.122152f, +0.305949f,0.944044f,0.123194f, +0.404781f,0.90011f,0.161105f, +0.386685f,0.917163f,0.0963685f, +0.43511f,0.894378f,0.103764f, +0.444378f,0.884165f,0.144156f, +0.485066f,0.871945f,0.0665013f, +0.480511f,0.864609f,0.146835f, +0.542329f,0.83784f,0.0624783f, +0.538258f,0.834152f,0.120286f, +0.497652f,0.86488f,0.0657686f, +0.471897f,0.881288f,0.0253797f, +0.368509f,0.927548f,0.0620863f, +0.391828f,0.918428f,0.0544149f, +0.284879f,0.953389f,0.0994662f, +0.359932f,0.902669f,0.235877f, +0.19297f,0.969614f,0.150374f, +0.198191f,0.923716f,0.327825f, +0.174784f,0.978101f,0.113003f, +0.121688f,0.95783f,0.260297f, +0.3291f,0.939598f,0.094074f, +0.241925f,0.967997f,0.066744f, +0.275982f,0.959352f,0.0589789f, +0.207349f,0.969048f,-0.133986f, +-0.048418f,0.997403f,0.0533214f, +-0.0214229f,0.995947f,-0.0873486f, +-0.224808f,0.97209f,0.0671032f, +-0.154526f,0.98721f,0.0392114f, +-0.0539424f,0.990401f,0.127262f, +0.0294265f,0.986864f,0.158851f, +0.115045f,0.967726f,0.224212f, +0.135755f,0.967813f,0.211917f, +-0.0987201f,0.976534f,0.191406f, +-0.208734f,0.974954f,0.0767793f, +-0.346094f,0.938088f,0.0144628f, +-0.364883f,0.930977f,0.0119327f, +-0.234075f,0.972082f,0.0162811f, +-0.216489f,0.973875f,0.0685516f, +-0.126585f,0.991898f,0.0107448f, +-0.188432f,0.981937f,-0.0171439f, +-0.186728f,0.980312f,-0.0641921f, +-0.243763f,0.959118f,-0.14378f, +-0.256453f,0.962392f,-0.0896326f, +-0.227009f,0.972481f,-0.0524148f, +-0.308642f,0.945388f,-0.104794f, +-0.322884f,0.94242f,-0.0871231f, +-0.32494f,0.940988f,-0.0946312f, +-0.365791f,0.920972f,-0.134189f, +0.507209f,0.830952f,0.228598f, +0.427157f,0.893788f,0.136676f, +0.390358f,0.920644f,0.00595094f, +0.357f,0.931227f,0.0732586f, +0.253669f,0.95455f,0.156478f, +0.247974f,0.954291f,0.166849f, +0.303694f,0.950352f,0.0678299f, +0.260247f,0.965246f,0.0238949f, +-0.0615746f,0.996768f,-0.0515863f, +-0.225111f,0.970921f,-0.0814727f, +-0.33579f,0.924057f,-0.18266f, +-0.286567f,0.949099f,-0.13073f, +-0.266283f,0.957101f,-0.114241f, +-0.297972f,0.942451f,-0.151651f, +-0.345158f,0.930403f,-0.123358f, +-0.323606f,0.933615f,-0.153759f, +-0.295216f,0.935234f,-0.195409f, +-0.294262f,0.935546f,-0.195355f, +-0.367877f,0.896699f,-0.246165f, +-0.460611f,0.856308f,-0.233612f, +-0.493615f,0.869663f,0.00556421f, +-0.56572f,0.819247f,0.0937815f, +-0.482796f,0.868728f,0.110547f, +-0.473443f,0.870107f,0.136985f, +-0.486628f,0.863931f,0.12968f, +-0.584612f,0.809918f,-0.0475519f, +-0.673803f,0.720247f,-0.165027f, +-0.584438f,0.811258f,-0.0171189f, +-0.49626f,0.855798f,0.146063f, +-0.266763f,0.927018f,0.26358f, +-0.000318467f,0.974136f,0.225963f, +-0.2098f,0.977621f,0.015525f, +-0.363964f,0.929076f,-0.0659462f, +-0.427799f,0.890708f,-0.153708f, +-0.226888f,0.973494f,-0.0288381f, +0.176474f,0.981f,0.080593f, +0.382766f,0.920418f,-0.0794987f, +0.4558f,0.874041f,-0.16822f, +0.44168f,0.87342f,-0.205075f, +0.269141f,0.944688f,-0.187422f, +0.0983269f,0.994746f,0.0285051f, +0.164874f,0.980231f,0.10938f, +0.300398f,0.949423f,0.0914149f, +0.370498f,0.925363f,0.0802133f, +0.51325f,0.857062f,0.0449297f, +0.515688f,0.85628f,-0.0291725f, +0.532902f,0.845818f,-0.0246416f, +0.470584f,0.882352f,0.00224652f, +0.358364f,0.932053f,0.0534101f, +0.299916f,0.948938f,0.0978121f, +0.234125f,0.96956f,0.0716857f, +0.201429f,0.97943f,0.0119968f, +0.257021f,0.965839f,0.0330825f, +0.205585f,0.966488f,0.153741f, +-0.0291083f,0.972977f,0.22906f, +-0.183781f,0.97216f,0.145362f, +-0.0880966f,0.991634f,0.0943445f, +0.0404056f,0.991359f,0.124796f, +-0.0259416f,0.986408f,0.162256f, +-0.213262f,0.97241f,0.0945471f, +-0.221976f,0.974645f,0.0281856f, +-0.137418f,0.990413f,0.014064f, +-0.147111f,0.988464f,0.0360112f, +-0.213681f,0.97687f,0.00813376f, +-0.286716f,0.957516f,-0.0309366f, +-0.362687f,0.929548f,-0.0663186f, +0.471826f,0.881687f,0.00273101f, +0.493844f,0.862721f,0.108764f, +0.305852f,0.940961f,0.145073f, +0.225186f,0.91763f,0.327484f, +0.255894f,0.905552f,0.33837f, +0.302798f,0.922674f,0.238719f, +0.353759f,0.914443f,0.196594f, +0.301669f,0.941039f,0.153105f, +0.00675732f,0.993813f,0.110864f, +-0.180673f,0.978312f,0.101302f, +-0.247784f,0.966857f,0.0615767f, +-0.309703f,0.949482f,-0.0506691f, +-0.243038f,0.969623f,-0.0276337f, +-0.257234f,0.966017f,-0.0253295f, +-0.381367f,0.920413f,-0.0860151f, +-0.354157f,0.93479f,-0.027217f, +-0.299485f,0.952671f,0.0522246f, +-0.356888f,0.9323f,0.0587106f, +-0.335176f,0.924244f,0.182839f, +-0.500593f,0.855036f,0.135351f, +-0.576428f,0.801243f,0.160441f, +-0.583679f,0.788168f,0.195218f, +-0.491918f,0.829821f,0.263465f, +-0.431671f,0.862042f,0.2656f, +-0.443518f,0.883408f,0.151265f, +-0.464317f,0.881859f,0.0820666f, +-0.652068f,0.753609f,-0.0829502f, +-0.681939f,0.728217f,-0.068254f, +-0.591161f,0.804152f,0.0621953f, +-0.352647f,0.921747f,0.161318f, +0.0545396f,0.95959f,0.276065f, +0.0694942f,0.971972f,0.224591f, +-0.253858f,0.964902f,-0.0672354f, +-0.408551f,0.900688f,-0.147807f, +-0.327666f,0.933936f,-0.142825f, +0.129878f,0.985787f,-0.106564f, +0.442239f,0.89421f,-0.0693695f, +0.506959f,0.860716f,-0.0464834f, +0.440087f,0.895465f,-0.0668225f, +0.226441f,0.974021f,0.00265329f, +-0.0272959f,0.999596f,0.00787303f, +0.0903893f,0.995643f,0.0228958f, +0.359925f,0.931179f,0.0579615f, +0.431266f,0.899788f,-0.0662666f, +0.53735f,0.839722f,-0.0782406f, +0.525898f,0.846474f,-0.0831443f, +0.503404f,0.859213f,-0.0913118f, +0.450901f,0.892319f,-0.0213084f, +0.278054f,0.959353f,0.048252f, +0.254295f,0.953824f,0.159853f, +0.246692f,0.953779f,0.171608f, +0.237766f,0.960301f,0.145908f, +0.249319f,0.965473f,0.0755121f, +0.140552f,0.989905f,0.0182753f, +-0.0589195f,0.996842f,0.0532477f, +-0.101426f,0.988847f,0.109061f, +-0.043669f,0.99706f,0.0629708f, +0.0474685f,0.998853f,-0.0063145f, +-0.0867729f,0.996136f,-0.0135299f, +-0.196161f,0.972844f,0.12286f, +-0.192413f,0.974994f,0.111196f, +-0.123107f,0.990318f,0.0641543f, +-0.164426f,0.985628f,0.0387435f, +-0.213922f,0.974633f,0.0657922f, +-0.241049f,0.968373f,0.0644173f, +-0.307154f,0.951627f,-0.00792363f, +0.280771f,0.958227f,-0.0544817f, +0.299035f,0.949091f,0.0990176f, +0.225174f,0.937279f,0.266091f, +0.201765f,0.945847f,0.254291f, +0.341377f,0.920786f,0.18872f, +0.3743f,0.913661f,0.158502f, +0.359138f,0.923211f,0.136755f, +0.36518f,0.919296f,0.146759f, +0.0046348f,0.996002f,0.0892048f, +-0.241229f,0.954179f,0.177061f, +-0.158349f,0.951157f,0.265002f, +-0.207545f,0.971279f,0.116375f, +-0.289845f,0.957072f,0.00156201f, +-0.257416f,0.96626f,0.00885102f, +-0.326801f,0.944936f,0.0172234f, +-0.439204f,0.898379f,-0.00377194f, +-0.336537f,0.936282f,0.100589f, +-0.407285f,0.907139f,0.105914f, +-0.44858f,0.865076f,0.224543f, +-0.454994f,0.838311f,0.300358f, +-0.578424f,0.785375f,0.220483f, +-0.613986f,0.761879f,0.206302f, +-0.509143f,0.819763f,0.262226f, +-0.364105f,0.879908f,0.30527f, +-0.344494f,0.905138f,0.249097f, +-0.369295f,0.913195f,0.172323f, +-0.574832f,0.817482f,0.0359178f, +-0.689125f,0.724332f,-0.0212343f, +-0.619919f,0.781232f,-0.0733212f, +-0.441345f,0.892835f,-0.0897783f, +-0.0649595f,0.996915f,0.0440505f, +0.146397f,0.977716f,0.150467f, +-0.0177868f,0.998167f,0.0578468f, +-0.37006f,0.91802f,-0.14246f, +-0.30849f,0.937533f,-0.160828f, +0.107382f,0.980696f,-0.163415f, +0.392635f,0.914926f,-0.093533f, +0.501877f,0.862749f,-0.0615151f, +0.381618f,0.912204f,-0.14917f, +0.160415f,0.986769f,-0.0235493f, +0.0253729f,0.99703f,0.0727145f, +0.144484f,0.989507f,0.000443305f, +0.379228f,0.922372f,-0.073601f, +0.493599f,0.867009f,-0.0682314f, +0.529895f,0.842151f,-0.099967f, +0.549367f,0.821638f,-0.152008f, +0.439412f,0.876451f,-0.196851f, +0.349224f,0.935858f,0.0470259f, +0.182079f,0.971589f,0.151205f, +0.194383f,0.962201f,0.190749f, +0.266182f,0.94835f,0.172569f, +0.284034f,0.949535f,0.133071f, +0.347472f,0.93345f,0.089069f, +0.226103f,0.974059f,0.00925465f, +-0.0773561f,0.993257f,-0.0863519f, +-0.200366f,0.974099f,-0.104811f, +-0.00292133f,0.99995f,-0.00953497f, +0.144264f,0.988303f,-0.0494442f, +-0.155865f,0.979469f,-0.127857f, +-0.286146f,0.957784f,-0.0277406f, +-0.165259f,0.985103f,-0.0475661f, +-0.069504f,0.996782f,-0.0399387f, +-0.139315f,0.988254f,-0.0628056f, +-0.230813f,0.967463f,-0.103639f, +-0.24543f,0.966984f,-0.0686046f, +-0.189537f,0.981091f,0.0391957f, +0.151487f,0.988375f,0.0128779f, +0.16936f,0.984329f,0.0491336f, +0.218781f,0.968894f,0.115672f, +0.279098f,0.952669f,0.120523f, +0.344688f,0.931221f,0.118397f, +0.359727f,0.914297f,0.186165f, +0.326371f,0.918389f,0.223703f, +0.361839f,0.886899f,0.287197f, +-0.000924981f,0.965442f,0.260617f, +-0.321168f,0.914653f,0.24548f, +-0.23578f,0.933549f,0.269988f, +-0.0519805f,0.910912f,0.409313f, +-0.120702f,0.947306f,0.296721f, +-0.257649f,0.956241f,0.138637f, +-0.340179f,0.924947f,0.169564f, +-0.415425f,0.90289f,0.110507f, +-0.41038f,0.91038f,0.0528755f, +-0.447459f,0.881081f,0.153222f, +-0.521314f,0.820871f,0.233245f, +-0.470597f,0.83806f,0.27603f, +-0.530303f,0.820989f,0.211554f, +-0.59428f,0.795918f,0.11552f, +-0.564828f,0.823165f,0.0580397f, +-0.435129f,0.882511f,0.17843f, +-0.320859f,0.891866f,0.318787f, +-0.272192f,0.902535f,0.33368f, +-0.476067f,0.856837f,0.197967f, +-0.671403f,0.739101f,0.0543033f, +-0.548598f,0.834125f,0.0572312f, +-0.459373f,0.883769f,-0.0890421f, +-0.194341f,0.977153f,-0.0860449f, +0.0638196f,0.997784f,0.0188364f, +0.119241f,0.989813f,0.0777976f, +-0.189205f,0.978439f,-0.0828203f, +-0.328042f,0.913868f,-0.239234f, +0.0439005f,0.976566f,-0.210694f, +0.345392f,0.929362f,-0.130351f, +0.531991f,0.841029f,-0.0982628f, +0.385958f,0.912021f,-0.13876f, +0.00996624f,0.998173f,-0.059598f, +-0.0397997f,0.999182f,0.00710574f, +0.22423f,0.974041f,-0.0310806f, +0.399529f,0.909843f,-0.112084f, +0.472825f,0.876316f,-0.0922302f, +0.567959f,0.818431f,-0.0871407f, +0.591097f,0.802347f,-0.0827227f, +0.294969f,0.954774f,-0.0374031f, +0.136562f,0.986139f,0.0942395f, +0.140836f,0.978895f,0.148089f, +0.208743f,0.962024f,0.175889f, +0.331657f,0.931412f,0.149918f, +0.32318f,0.945148f,0.0474422f, +0.378499f,0.925602f,0.000447487f, +0.240237f,0.969087f,-0.0561752f, +0.0676245f,0.996927f,-0.0395359f, +-0.154966f,0.962822f,-0.221268f, +-0.087338f,0.971663f,-0.219642f, +0.144581f,0.983839f,-0.105631f, +-0.0884322f,0.993076f,-0.0773351f, +-0.293638f,0.94457f,-0.146848f, +-0.135408f,0.983934f,-0.116358f, +-0.103543f,0.987494f,-0.11889f, +-0.104597f,0.98248f,-0.15425f, +-0.176622f,0.962045f,-0.208023f, +-0.325467f,0.923065f,-0.204992f, +-0.403927f,0.903415f,-0.143824f, +0.344389f,0.929213f,0.134014f, +0.233815f,0.972165f,0.0150206f, +0.162621f,0.985815f,-0.0415186f, +0.195602f,0.980526f,0.0175561f, +0.28987f,0.950331f,0.113346f, +0.255987f,0.942074f,0.216718f, +0.263495f,0.890351f,0.371275f, +0.315069f,0.864416f,0.391812f, +0.0646003f,0.916859f,0.39395f, +-0.213657f,0.9234f,0.318877f, +-0.307635f,0.926495f,0.216719f, +-0.201977f,0.923807f,0.325246f, +-0.0210673f,0.916391f,0.399731f, +-0.17042f,0.919713f,0.353674f, +-0.316748f,0.899919f,0.299695f, +-0.294061f,0.92391f,0.244781f, +-0.396636f,0.905857f,0.14867f, +-0.523471f,0.83043f,0.190696f, +-0.568887f,0.791598f,0.223024f, +-0.446362f,0.844948f,0.294659f, +-0.453253f,0.853996f,0.255447f, +-0.541011f,0.824142f,0.167623f, +-0.550736f,0.81694f,0.171169f, +-0.53915f,0.819657f,0.193597f, +-0.444412f,0.862352f,0.242584f, +-0.285315f,0.907749f,0.30755f, +-0.329395f,0.886574f,0.324786f, +-0.610599f,0.78547f,0.101022f, +-0.543486f,0.838015f,0.0485148f, +-0.319704f,0.945394f,0.0634074f, +-0.262212f,0.963421f,-0.055354f, +0.000253525f,0.995852f,0.0909893f, +0.105619f,0.991464f,0.0764441f, +0.0245363f,0.999682f,-0.00586488f, +-0.22917f,0.926966f,-0.29701f, +-0.0159754f,0.943632f,-0.33061f, +0.309925f,0.920539f,-0.237812f, +0.48714f,0.850311f,-0.199165f, +0.288684f,0.955866f,-0.0546085f, +-0.0787222f,0.994967f,0.0619939f, +0.0273777f,0.99772f,0.0616831f, +0.291481f,0.955243f,-0.0505022f, +0.438727f,0.89664f,-0.0596253f, +0.485213f,0.871546f,-0.0705428f, +0.5406f,0.839608f,-0.0530067f, +0.49511f,0.866937f,0.0573254f, +0.280189f,0.947413f,0.154605f, +0.158816f,0.979113f,0.126949f, +0.168625f,0.983554f,0.0647105f, +0.187616f,0.98216f,0.0127302f, +0.334023f,0.942557f,0.00379923f, +0.401318f,0.914355f,0.0538517f, +0.424638f,0.905172f,0.0185914f, +0.289448f,0.956081f,-0.0461475f, +0.0899479f,0.980871f,-0.172633f, +-0.00560791f,0.970967f,-0.23915f, +-0.153691f,0.938842f,-0.308149f, +-0.0450622f,0.984719f,-0.168219f, +-0.0818032f,0.994271f,0.0687937f, +-0.254478f,0.967062f,-0.0056871f, +-0.190127f,0.974114f,-0.122284f, +-0.0615121f,0.986397f,-0.152435f, +-0.0478084f,0.984317f,-0.169808f, +-0.157882f,0.979732f,-0.123284f, +-0.307356f,0.93941f,-0.151791f, +-0.432596f,0.869844f,-0.237133f, +0.35469f,0.923204f,0.147951f, +0.317903f,0.938384f,0.135547f, +0.209784f,0.976723f,0.0447562f, +0.188401f,0.980806f,-0.0502544f, +0.153267f,0.987748f,-0.0293859f, +0.102074f,0.966336f,0.236167f, +0.128463f,0.933972f,0.333456f, +0.308207f,0.882627f,0.354934f, +0.141883f,0.91146f,0.386148f, +-0.174863f,0.945456f,0.274837f, +-0.248524f,0.937312f,0.244299f, +-0.268339f,0.945888f,0.182456f, +-0.0843285f,0.960488f,0.265238f, +-0.151825f,0.934815f,0.321045f, +-0.286064f,0.900967f,0.326231f, +-0.240679f,0.904695f,0.351568f, +-0.362345f,0.88785f,0.2836f, +-0.538142f,0.813225f,0.221511f, +-0.57294f,0.797677f,0.188284f, +-0.51091f,0.838129f,0.191079f, +-0.412611f,0.865658f,0.283528f, +-0.528395f,0.821979f,0.212483f, +-0.579097f,0.792111f,0.192891f, +-0.502268f,0.843036f,0.192398f, +-0.402738f,0.896524f,0.184518f, +-0.323371f,0.930281f,0.173231f, +-0.341027f,0.92193f,0.183699f, +-0.49586f,0.861123f,0.112209f, +-0.562176f,0.82675f,-0.0210484f, +-0.29935f,0.952705f,0.0523715f, +-0.273263f,0.96182f,0.0151701f, +-0.127856f,0.984802f,0.117552f, +0.16681f,0.967622f,0.189425f, +0.219885f,0.966852f,0.1298f, +0.0444925f,0.994595f,-0.093817f, +-0.0559771f,0.948894f,-0.31059f, +0.229668f,0.93439f,-0.272337f, +0.391338f,0.907289f,-0.153889f, +0.215699f,0.975228f,0.0490428f, +-0.1202f,0.992098f,0.0359644f, +0.0568932f,0.997098f,0.0505773f, +0.369571f,0.928802f,0.0272646f, +0.435039f,0.898005f,-0.0657877f, +0.45866f,0.886154f,-0.0660444f, +0.484136f,0.874975f,0.00559808f, +0.464546f,0.884206f,0.0487577f, +0.311084f,0.947795f,0.0700806f, +0.215922f,0.975139f,0.0498078f, +0.229266f,0.973122f,-0.0216826f, +0.269391f,0.956816f,-0.109228f, +0.297276f,0.941247f,-0.160256f, +0.352506f,0.931874f,-0.0857318f, +0.363875f,0.92958f,-0.0589632f, +0.421372f,0.901903f,0.094954f, +0.220959f,0.972251f,-0.0768509f, +0.0552433f,0.994093f,-0.0934223f, +-0.134577f,0.980922f,-0.140288f, +-0.247593f,0.953903f,-0.169607f, +-0.238891f,0.96987f,-0.0477791f, +-0.130123f,0.990325f,-0.0482061f, +0.00814361f,0.986901f,-0.161119f, +-0.0740374f,0.970051f,-0.231345f, +-0.135238f,0.990526f,-0.0238593f, +-0.204897f,0.978574f,0.0202582f, +-0.205889f,0.977122f,-0.0533174f, +-0.236999f,0.963982f,-0.120711f, +0.399314f,0.905653f,0.142621f, +0.334882f,0.936094f,0.107618f, +0.310789f,0.943606f,0.114093f, +0.298988f,0.952609f,0.0560503f, +0.00373107f,0.999894f,-0.0140921f, +-0.127729f,0.983543f,0.12778f, +0.134365f,0.969696f,0.204046f, +0.250753f,0.938877f,0.235867f, +0.172971f,0.901933f,0.395725f, +-0.0661635f,0.938085f,0.340027f, +-0.190026f,0.944561f,0.267758f, +-0.246469f,0.952194f,0.180498f, +-0.199636f,0.962622f,0.183041f, +-0.204824f,0.924659f,0.321019f, +-0.345906f,0.869848f,0.351729f, +-0.272906f,0.86539f,0.420265f, +-0.23738f,0.86577f,0.44056f, +-0.476597f,0.838274f,0.264863f, +-0.549692f,0.815624f,0.180542f, +-0.521659f,0.837826f,0.160993f, +-0.461012f,0.874551f,0.150426f, +-0.498406f,0.858536f,0.120447f, +-0.538861f,0.837113f,0.0941878f, +-0.51696f,0.855065f,0.0401927f, +-0.464195f,0.882878f,0.0710582f, +-0.339798f,0.923706f,0.176929f, +-0.307071f,0.929998f,0.202016f, +-0.435636f,0.887155f,0.152245f, +-0.50925f,0.856289f,0.0862179f, +-0.352613f,0.935762f,-0.00363908f, +-0.24432f,0.969666f,0.0074465f, +-0.223693f,0.974193f,-0.0301471f, +0.0924619f,0.993171f,0.071143f, +0.248444f,0.955155f,0.161104f, +0.25541f,0.957577f,0.133462f, +0.152224f,0.983188f,-0.100846f, +0.175485f,0.954332f,-0.241774f, +0.229817f,0.96697f,-0.110245f, +0.104087f,0.990176f,0.0933667f, +-0.0251916f,0.99085f,0.132593f, +0.0299952f,0.999356f,-0.0197015f, +0.374506f,0.927216f,-0.00387803f, +0.523769f,0.851516f,-0.0242066f, +0.412003f,0.903869f,-0.115217f, +0.44751f,0.89427f,-0.00401492f, +0.502351f,0.864643f,-0.0060566f, +0.261187f,0.953407f,-0.150988f, +0.201827f,0.974066f,-0.102283f, +0.328474f,0.941424f,-0.0763319f, +0.327281f,0.932573f,-0.152297f, +0.312159f,0.927432f,-0.205977f, +0.304739f,0.922289f,-0.237734f, +0.291399f,0.941708f,-0.168142f, +0.325323f,0.94222f,-0.0799213f, +0.270502f,0.962573f,-0.0167793f, +-0.00135827f,0.998382f,0.0568385f, +-0.0464612f,0.993882f,0.100202f, +-0.163616f,0.983349f,-0.0790802f, +-0.219372f,0.956704f,-0.191292f, +-0.0798083f,0.976764f,-0.198904f, +-0.0362508f,0.993161f,-0.11098f, +-0.194493f,0.976824f,0.0893684f, +-0.303508f,0.929002f,0.211751f, +-0.120982f,0.967912f,0.220249f, +-0.126864f,0.979558f,0.156117f, +-0.190168f,0.969475f,0.154773f, +0.442277f,0.894635f,0.0633978f, +0.351901f,0.932017f,0.0866602f, +0.271089f,0.951246f,0.147111f, +0.263373f,0.940704f,0.2138f, +0.0780789f,0.961317f,0.264145f, +-0.165165f,0.972713f,0.162944f, +0.054241f,0.96435f,0.259011f, +0.119009f,0.928226f,0.352467f, +0.062551f,0.905107f,0.420558f, +-0.0376962f,0.903166f,0.427633f, +-0.119235f,0.864868f,0.487634f, +-0.107099f,0.89512f,0.43277f, +-0.228241f,0.933808f,0.275515f, +-0.34367f,0.891778f,0.294319f, +-0.360994f,0.863066f,0.353271f, +-0.329935f,0.870805f,0.364474f, +-0.225803f,0.873787f,0.430708f, +-0.324138f,0.85889f,0.396537f, +-0.511071f,0.812187f,0.281352f, +-0.475013f,0.824987f,0.306202f, +-0.392033f,0.887928f,0.240612f, +-0.45534f,0.876633f,0.155499f, +-0.547025f,0.829694f,0.111226f, +-0.496064f,0.862275f,0.101992f, +-0.479515f,0.87606f,0.0508306f, +-0.424535f,0.90465f,0.0371277f, +-0.362147f,0.919497f,0.152886f, +-0.412742f,0.878092f,0.24207f, +-0.402299f,0.893898f,0.197745f, +-0.26297f,0.963672f,0.0467231f, +-0.219075f,0.975598f,-0.0146319f, +-0.186267f,0.980099f,-0.0686323f, +-0.0357984f,0.992879f,-0.113625f, +0.180598f,0.983509f,0.00973344f, +0.28459f,0.957748f,0.0415635f, +0.350884f,0.934731f,0.0561944f, +0.201029f,0.975728f,-0.0868401f, +0.10163f,0.994331f,-0.0312587f, +-0.0498772f,0.998294f,0.0303674f, +0.0144565f,0.996475f,0.082632f, +0.17671f,0.984206f,0.0105968f, +0.384098f,0.921983f,-0.049144f, +0.526508f,0.848767f,-0.048829f, +0.451141f,0.890087f,-0.0649363f, +0.349978f,0.927792f,-0.129298f, +0.525028f,0.849511f,-0.051734f, +0.403316f,0.902994f,-0.148114f, +0.146493f,0.950082f,-0.275472f, +0.257494f,0.953663f,-0.155639f, +0.363336f,0.930153f,-0.0529431f, +0.407301f,0.911128f,-0.0628641f, +0.309341f,0.935596f,-0.170201f, +0.234661f,0.952473f,-0.194238f, +0.248922f,0.950735f,-0.18477f, +0.176271f,0.982701f,-0.0568089f, +-0.0817466f,0.996475f,0.0188703f, +-0.0390696f,0.99855f,0.0370285f, +0.0392849f,0.997614f,0.0567754f, +-0.165147f,0.985538f,-0.0379532f, +-0.216905f,0.97598f,0.020392f, +-0.25871f,0.942954f,0.209538f, +-0.318314f,0.87576f,0.362933f, +-0.238112f,0.92993f,0.280235f, +-0.11178f,0.963059f,0.244995f, +-0.156033f,0.939968f,0.303502f, +-0.219558f,0.904757f,0.364977f, +0.29059f,0.953077f,-0.0848643f, +0.282679f,0.959209f,-0.00326087f, +0.165956f,0.986031f,0.0141778f, +0.145774f,0.971701f,0.185869f, +0.0971539f,0.92606f,0.364656f, +-0.126893f,0.938591f,0.320851f, +-0.158756f,0.918948f,0.361014f, +0.0576791f,0.877286f,0.47649f, +0.151465f,0.884095f,0.442079f, +-0.0842052f,0.912347f,0.400665f, +-0.236928f,0.870703f,0.430978f, +-0.0173538f,0.858153f,0.513101f, +-0.0453547f,0.868839f,0.493013f, +-0.308698f,0.88215f,0.355692f, +-0.391959f,0.868398f,0.303732f, +-0.360504f,0.877037f,0.317558f, +-0.289644f,0.88703f,0.359561f, +-0.323579f,0.85156f,0.412484f, +-0.483914f,0.781191f,0.39442f, +-0.428744f,0.813324f,0.393297f, +-0.337017f,0.871068f,0.357294f, +-0.382215f,0.837599f,0.390306f, +-0.472752f,0.816976f,0.330237f, +-0.454132f,0.848356f,0.272131f, +-0.386129f,0.879637f,0.277745f, +-0.408175f,0.895196f,0.178931f, +-0.461039f,0.873474f,0.15648f, +-0.444429f,0.876284f,0.186035f, +-0.324725f,0.941951f,0.085336f, +-0.200261f,0.979518f,0.0209972f, +-0.146655f,0.98862f,0.0335086f, +-0.105669f,0.986512f,-0.125016f, +-0.0113758f,0.977088f,-0.21253f, +0.125756f,0.969156f,-0.211948f, +0.231535f,0.947003f,-0.222657f, +0.267937f,0.954488f,-0.131005f, +0.231299f,0.971277f,0.055871f, +0.0809071f,0.991774f,0.0991925f, +0.000207679f,0.999953f,0.00973996f, +0.0247831f,0.993578f,-0.110402f, +0.181304f,0.979201f,-0.0910725f, +0.390907f,0.919373f,-0.0441033f, +0.523664f,0.849877f,-0.0590321f, +0.487061f,0.873094f,-0.0218679f, +0.442794f,0.892691f,-0.0838822f, +0.486459f,0.850567f,-0.199735f, +0.449595f,0.886474f,-0.10967f, +0.172841f,0.979158f,-0.106661f, +0.134151f,0.987388f,-0.084069f, +0.292984f,0.955775f,-0.0255695f, +0.391346f,0.920229f,-0.00512785f, +0.418943f,0.907957f,0.00999318f, +0.324262f,0.936698f,-0.1321f, +0.190686f,0.957473f,-0.216527f, +0.0619887f,0.993289f,-0.097645f, +-0.0829846f,0.99633f,-0.0209901f, +-0.0646754f,0.997763f,-0.0169202f, +-0.0614217f,0.996217f,0.0614677f, +-0.189778f,0.963623f,0.188191f, +-0.363861f,0.896503f,0.25276f, +-0.348308f,0.859996f,0.372945f, +-0.264506f,0.906439f,0.329249f, +-0.140762f,0.939057f,0.31362f, +-0.154941f,0.944783f,0.288752f, +-0.237481f,0.904164f,0.355093f, +-0.314839f,0.867723f,0.38462f, +0.199283f,0.97456f,-0.102566f, +0.290362f,0.956152f,-0.0382605f, +0.163603f,0.98144f,-0.10005f, +-0.0845537f,0.992536f,-0.0878854f, +-0.0995819f,0.988025f,0.117859f, +-0.128698f,0.94862f,0.289062f, +-0.181988f,0.934999f,0.304396f, +0.0121717f,0.953274f,0.301863f, +0.15771f,0.909532f,0.384551f, +-0.030083f,0.904525f,0.425359f, +-0.262213f,0.918561f,0.295788f, +-0.150427f,0.932893f,0.327234f, +-0.0433771f,0.888915f,0.456013f, +-0.194904f,0.882492f,0.428042f, +-0.359771f,0.865678f,0.348089f, +-0.358104f,0.856009f,0.37284f, +-0.334766f,0.853069f,0.400257f, +-0.382047f,0.809514f,0.445788f, +-0.440041f,0.772384f,0.458024f, +-0.392897f,0.847233f,0.357532f, +-0.352962f,0.862399f,0.362885f, +-0.432462f,0.797784f,0.42014f, +-0.40741f,0.807767f,0.426063f, +-0.417686f,0.831448f,0.366378f, +-0.406533f,0.835025f,0.370761f, +-0.302917f,0.831265f,0.466089f, +-0.354465f,0.85583f,0.376708f, +-0.320875f,0.930472f,0.17681f, +-0.210666f,0.977556f,0.00208309f, +-0.202152f,0.976764f,-0.0711849f, +-0.0734606f,0.993473f,-0.0872598f, +0.0104554f,0.979699f,-0.2002f, +0.0812548f,0.981491f,-0.173417f, +0.133484f,0.953074f,-0.271721f, +0.239226f,0.941558f,-0.23715f, +0.0986638f,0.979162f,-0.177504f, +0.0167662f,0.999807f,0.0102821f, +0.0608252f,0.989728f,0.129377f, +0.193478f,0.976369f,0.0962839f, +0.105893f,0.986391f,-0.125774f, +0.159018f,0.972139f,-0.17222f, +0.348199f,0.916375f,-0.197521f, +0.506641f,0.853561f,-0.121441f, +0.438954f,0.895697f,-0.0710352f, +0.508211f,0.861156f,-0.0114456f, +0.538629f,0.837641f,-0.0907543f, +0.350973f,0.934296f,-0.0625226f, +0.130826f,0.991364f,0.00901604f, +0.142249f,0.989581f,0.0222434f, +0.314713f,0.948656f,-0.0317428f, +0.413134f,0.902882f,-0.118849f, +0.421178f,0.889709f,-0.176143f, +0.40304f,0.897538f,-0.178843f, +0.190553f,0.961133f,-0.199782f, +-0.0704956f,0.989551f,-0.125772f, +-0.145721f,0.988685f,0.035603f, +-0.158165f,0.979549f,0.124366f, +-0.141884f,0.945197f,0.294061f, +-0.282634f,0.89813f,0.336869f, +-0.398539f,0.847577f,0.350398f, +-0.326007f,0.891199f,0.31541f, +-0.257935f,0.930645f,0.259558f, +-0.189362f,0.933131f,0.305628f, +-0.181998f,0.908713f,0.375656f, +-0.284451f,0.857477f,0.428743f, +-0.324962f,0.834267f,0.445419f, +0.162722f,0.967013f,-0.19598f, +0.196801f,0.96943f,-0.146541f, +0.171798f,0.98444f,0.0369126f, +-0.0614366f,0.993745f,0.0932502f, +-0.263807f,0.962515f,0.063023f, +-0.262644f,0.943232f,0.203304f, +-0.183229f,0.945939f,0.267632f, +-0.0512022f,0.955564f,0.290302f, +0.0500709f,0.932925f,0.356571f, +-0.017607f,0.930336f,0.366286f, +-0.141345f,0.917863f,0.370876f, +-0.196664f,0.921785f,0.334121f, +-0.123639f,0.931227f,0.342826f, +-0.166673f,0.929929f,0.327799f, +-0.365314f,0.882118f,0.297345f, +-0.422119f,0.842584f,0.334465f, +-0.378137f,0.838603f,0.392119f, +-0.433991f,0.800503f,0.413336f, +-0.373446f,0.819157f,0.435339f, +-0.321191f,0.877582f,0.35593f, +-0.410179f,0.839146f,0.357194f, +-0.450466f,0.792998f,0.410164f, +-0.383405f,0.853385f,0.353178f, +-0.361072f,0.88078f,0.306355f, +-0.471517f,0.844691f,0.253315f, +-0.399349f,0.852332f,0.337713f, +-0.193735f,0.889811f,0.413163f, +-0.0964184f,0.953204f,0.28654f, +-0.0731968f,0.993583f,0.0862245f, +-0.107213f,0.990087f,-0.0907379f, +-0.0139207f,0.976637f,-0.214443f, +-0.00517032f,0.976967f,-0.213328f, +0.032564f,0.990278f,-0.135238f, +0.193406f,0.974103f,-0.117123f, +0.137302f,0.989014f,-0.0547632f, +0.0149454f,0.997504f,0.06901f, +-0.0673257f,0.995987f,0.0589639f, +0.00671915f,0.997834f,0.0654375f, +0.236496f,0.961793f,0.137925f, +0.296243f,0.953456f,0.0562338f, +0.227931f,0.966806f,-0.11547f, +0.392626f,0.909868f,-0.134105f, +0.455312f,0.880641f,-0.131003f, +0.402519f,0.906647f,-0.126375f, +0.459051f,0.879656f,-0.124406f, +0.531911f,0.846049f,-0.0356662f, +0.366681f,0.930218f,0.0155094f, +0.101768f,0.992829f,-0.0627213f, +0.169781f,0.984995f,-0.0309622f, +0.383193f,0.921183f,-0.0677109f, +0.483652f,0.86784f,-0.113728f, +0.481548f,0.864447f,-0.144373f, +0.322376f,0.925659f,-0.198063f, +0.121084f,0.992307f,-0.0257868f, +-0.189201f,0.97803f,0.0875253f, +-0.272481f,0.941614f,0.197779f, +-0.28107f,0.929157f,0.240138f, +-0.316277f,0.890261f,0.327726f, +-0.284096f,0.875896f,0.389994f, +-0.304764f,0.879665f,0.365114f, +-0.295018f,0.913863f,0.278959f, +-0.233864f,0.913909f,0.331779f, +-0.25276f,0.886942f,0.386584f, +-0.254968f,0.846261f,0.467797f, +-0.324913f,0.811645f,0.485452f, +-0.330966f,0.801562f,0.497956f, +0.166281f,0.984047f,-0.0632562f, +0.102172f,0.992786f,-0.0627485f, +-0.0446214f,0.999004f,-0.000325965f, +-0.137659f,0.980871f,0.13763f, +-0.270041f,0.94552f,0.18185f, +-0.300503f,0.932348f,0.201063f, +-0.224552f,0.960314f,0.165452f, +-0.109331f,0.978965f,0.17226f, +0.0684226f,0.972288f,0.223551f, +-0.0281009f,0.965962f,0.257154f, +-0.203983f,0.927334f,0.313757f, +-0.170837f,0.935943f,0.307937f, +-0.0844776f,0.951083f,0.29716f, +-0.140439f,0.935294f,0.32481f, +-0.360713f,0.879742f,0.309743f, +-0.466354f,0.845167f,0.261162f, +-0.425659f,0.859392f,0.283303f, +-0.470194f,0.836884f,0.280256f, +-0.410878f,0.856359f,0.312777f, +-0.293557f,0.864483f,0.408036f, +-0.429097f,0.81157f,0.396523f, +-0.438172f,0.837036f,0.327683f, +-0.303084f,0.911643f,0.277574f, +-0.346895f,0.902405f,0.255594f, +-0.444307f,0.857916f,0.258015f, +-0.440123f,0.885255f,0.150386f, +-0.246442f,0.965625f,0.0826743f, +-0.0242341f,0.995753f,0.0888192f, +0.128537f,0.987977f,0.085905f, +0.10291f,0.993755f,-0.0431449f, +0.0280177f,0.986869f,-0.159076f, +-0.0318503f,0.988236f,-0.149584f, +0.00777626f,0.97932f,-0.202168f, +0.111085f,0.970769f,-0.212762f, +-0.00220326f,0.997417f,-0.0718009f, +-0.0152092f,0.997571f,0.0679693f, +0.0100591f,0.998816f,0.0476033f, +-0.00783919f,0.999851f,-0.0153546f, +0.1632f,0.986482f,-0.0148045f, +0.356551f,0.93118f,0.0760001f, +0.33409f,0.940767f,0.0578066f, +0.378555f,0.924836f,-0.0370621f, +0.481573f,0.874509f,-0.0576253f, +0.443664f,0.890369f,-0.102011f, +0.449245f,0.88434f,-0.126968f, +0.449063f,0.892098f,-0.05003f, +0.400085f,0.916232f,0.0212355f, +0.189459f,0.975149f,-0.114846f, +0.154225f,0.96178f,-0.226258f, +0.36559f,0.902984f,-0.225751f, +0.443305f,0.891814f,-0.0902669f, +0.481296f,0.876165f,0.0262584f, +0.274557f,0.96003f,0.0544047f, +-0.0951468f,0.983236f,0.155547f, +-0.272231f,0.920302f,0.280953f, +-0.309095f,0.909629f,0.277553f, +-0.260629f,0.904898f,0.336501f, +-0.319906f,0.899874f,0.296456f, +-0.309019f,0.910231f,0.275658f, +-0.301457f,0.909911f,0.284931f, +-0.289244f,0.908198f,0.302514f, +-0.349317f,0.867088f,0.355157f, +-0.355035f,0.811266f,0.46454f, +-0.291879f,0.804435f,0.517388f, +-0.292737f,0.815956f,0.498519f, +-0.341117f,0.83204f,0.437434f, +0.012939f,0.999781f,0.0164623f, +0.101117f,0.986501f,0.12881f, +-0.0315137f,0.991787f,0.123953f, +-0.202813f,0.972667f,0.113078f, +-0.267039f,0.954882f,0.129964f, +-0.329248f,0.943109f,0.0462825f, +-0.158801f,0.981787f,0.104294f, +-0.0896983f,0.994441f,0.0551561f, +-0.03797f,0.996172f,0.0787436f, +-0.124773f,0.970658f,0.205561f, +-0.242396f,0.92942f,0.278248f, +-0.1236f,0.936757f,0.327428f, +-0.115597f,0.950099f,0.289742f, +-0.242269f,0.924532f,0.294187f, +-0.335063f,0.873272f,0.353736f, +-0.402827f,0.872268f,0.27727f, +-0.433494f,0.882428f,0.182769f, +-0.472347f,0.860126f,0.192541f, +-0.516304f,0.829671f,0.212311f, +-0.401557f,0.840095f,0.364681f, +-0.365647f,0.853697f,0.370816f, +-0.342203f,0.911984f,0.226234f, +-0.319568f,0.928553f,0.188855f, +-0.368607f,0.886665f,0.279203f, +-0.401013f,0.885839f,0.233406f, +-0.263462f,0.961384f,0.0795548f, +-0.119336f,0.983737f,-0.134243f, +-0.028348f,0.969034f,-0.245295f, +0.0404463f,0.983879f,-0.174201f, +0.11875f,0.992593f,0.0256534f, +0.0602272f,0.997166f,0.0450923f, +0.0340291f,0.999414f,-0.00366965f, +0.0708792f,0.992684f,-0.097743f, +0.0958935f,0.99395f,-0.0535485f, +-0.0943801f,0.993296f,-0.0667466f, +-0.119267f,0.988594f,-0.0919588f, +0.000759128f,0.999891f,-0.0147216f, +0.0724665f,0.997368f,-0.00256206f, +0.170906f,0.979948f,-0.10244f, +0.214916f,0.97339f,-0.079521f, +0.347938f,0.935698f,0.0583811f, +0.479062f,0.877734f,-0.00909944f, +0.517939f,0.850313f,-0.0933121f, +0.446396f,0.884197f,-0.137574f, +0.389313f,0.918353f,-0.0711587f, +0.410982f,0.908412f,0.0766878f, +0.41147f,0.910096f,0.0491837f, +0.356411f,0.933637f,-0.0359751f, +0.291892f,0.941315f,-0.169483f, +0.292525f,0.936947f,-0.191205f, +0.303478f,0.950202f,-0.0708325f, +0.350076f,0.936333f,0.0269695f, +0.186651f,0.94527f,0.26763f, +-0.145022f,0.9031f,0.404201f, +-0.257588f,0.88179f,0.395088f, +-0.316433f,0.892435f,0.321607f, +-0.301856f,0.895088f,0.328177f, +-0.311714f,0.888624f,0.336427f, +-0.275146f,0.879635f,0.387991f, +-0.320358f,0.874704f,0.363681f, +-0.312957f,0.856468f,0.410514f, +-0.417707f,0.826376f,0.377656f, +-0.402058f,0.821773f,0.403779f, +-0.299174f,0.86271f,0.407708f, +-0.252864f,0.886408f,0.387737f, +-0.266831f,0.899401f,0.346235f, +-0.121912f,0.980245f,-0.155747f, +-0.0467045f,0.996241f,-0.0729522f, +-0.0560423f,0.996609f,0.0602479f, +-0.253613f,0.959854f,0.119832f, +-0.17852f,0.958289f,0.223189f, +-0.25091f,0.965294f,0.0724672f, +-0.244405f,0.968888f,0.0390022f, +-0.111828f,0.978686f,0.172245f, +-0.104286f,0.963728f,0.245667f, +-0.172657f,0.941673f,0.288863f, +-0.302965f,0.917419f,0.257981f, +-0.21274f,0.929075f,0.302592f, +-0.0577232f,0.923128f,0.380136f, +-0.183983f,0.930078f,0.31797f, +-0.384056f,0.900387f,0.204463f, +-0.327378f,0.913703f,0.240771f, +-0.374063f,0.905896f,0.198566f, +-0.504219f,0.846296f,0.17189f, +-0.555467f,0.810974f,0.183786f, +-0.456478f,0.86757f,0.197356f, +-0.300554f,0.935674f,0.184881f, +-0.295051f,0.948068f,0.118792f, +-0.362387f,0.917821f,0.162113f, +-0.440667f,0.875232f,0.199453f, +-0.248631f,0.939944f,0.233854f, +-0.0966352f,0.995188f,0.0161918f, +0.0243217f,0.996259f,-0.0829196f, +0.0213875f,0.994057f,-0.106741f, +-0.13683f,0.98707f,-0.0834831f, +-0.0593385f,0.994125f,0.0905282f, +0.0836318f,0.990077f,0.112932f, +0.079675f,0.993049f,0.0866394f, +0.0726138f,0.990126f,0.119908f, +0.0468689f,0.990824f,0.126776f, +0.00048966f,0.99587f,0.0907856f, +-0.0299455f,0.998898f,-0.0361395f, +-0.0528047f,0.988171f,-0.143981f, +0.0771474f,0.992034f,-0.0995875f, +0.233f,0.968973f,-0.0824758f, +0.215078f,0.967265f,-0.134683f, +0.299646f,0.93128f,-0.207193f, +0.500666f,0.844143f,-0.191721f, +0.5316f,0.838001f,-0.123112f, +0.45137f,0.888237f,-0.0854371f, +0.26295f,0.958984f,-0.105862f, +0.297072f,0.954855f,-0.000735176f, +0.467586f,0.880091f,0.0824758f, +0.451683f,0.892137f,0.00862833f, +0.280097f,0.955995f,-0.0872873f, +0.27353f,0.961001f,0.0407195f, +0.263182f,0.963734f,0.044184f, +0.22357f,0.970136f,0.0940863f, +-0.055048f,0.955137f,0.291002f, +-0.267739f,0.863744f,0.426921f, +-0.199104f,0.857693f,0.474046f, +-0.21681f,0.879018f,0.424642f, +-0.270209f,0.885026f,0.379098f, +-0.341336f,0.865644f,0.366267f, +-0.32372f,0.861174f,0.391898f, +-0.34092f,0.838889f,0.42431f, +-0.295898f,0.818794f,0.491956f, +-0.331f,0.829823f,0.449258f, +-0.389842f,0.853312f,0.34624f, +-0.281201f,0.9123f,0.297716f, +-0.234572f,0.935622f,0.263795f, +-0.225355f,0.942001f,0.248696f, +-0.0486057f,0.996635f,-0.0660014f, +-0.101682f,0.988174f,-0.114771f, +-0.162649f,0.983215f,-0.0826606f, +-0.318288f,0.946728f,-0.048975f, +-0.258454f,0.965864f,-0.0175802f, +-0.136613f,0.987862f,0.0739351f, +-0.281595f,0.958211f,0.0503573f, +-0.28706f,0.943479f,0.165663f, +-0.148179f,0.930819f,0.334095f, +-0.182832f,0.931383f,0.314798f, +-0.242578f,0.923022f,0.298642f, +-0.204404f,0.955935f,0.21073f, +-0.142784f,0.976536f,0.161212f, +-0.136962f,0.950722f,0.278153f, +-0.274249f,0.920019f,0.279915f, +-0.389723f,0.904453f,0.173436f, +-0.370261f,0.901011f,0.226022f, +-0.50377f,0.847021f,0.169619f, +-0.52553f,0.835875f,0.158529f, +-0.435894f,0.894864f,0.0959897f, +-0.279872f,0.956869f,0.07793f, +-0.331658f,0.940229f,0.0772765f, +-0.372127f,0.91403f,0.161461f, +-0.456876f,0.888328f,0.0462339f, +-0.204408f,0.978272f,0.0346564f, +0.0554954f,0.998458f,-0.00157713f, +-0.0102256f,0.999947f,0.00149442f, +-0.0507499f,0.985345f,0.162848f, +-0.124313f,0.970082f,0.208536f, +-0.111836f,0.992788f,0.0431796f, +0.135986f,0.987999f,0.0732526f, +0.00980425f,0.997155f,0.0747439f, +0.00734776f,0.982792f,0.184568f, +0.0872171f,0.965097f,0.246944f, +0.0795152f,0.966423f,0.244345f, +0.106439f,0.984803f,0.137237f, +0.0584187f,0.998092f,-0.0199996f, +0.0370568f,0.991888f,-0.121591f, +0.199554f,0.972297f,-0.121727f, +0.308311f,0.945569f,-0.104131f, +0.399439f,0.904394f,-0.150064f, +0.468199f,0.870932f,-0.149223f, +0.412212f,0.907025f,-0.0859413f, +0.425915f,0.903304f,0.0513667f, +0.351639f,0.936099f,-0.00832492f, +0.20857f,0.966693f,-0.148333f, +0.395551f,0.918183f,0.0219088f, +0.538432f,0.838724f,0.0814483f, +0.24402f,0.966591f,-0.0784634f, +0.178953f,0.981938f,0.0614245f, +0.258979f,0.960241f,0.104243f, +0.0759782f,0.986383f,0.145865f, +-0.19655f,0.929601f,0.311786f, +-0.328358f,0.883678f,0.333607f, +-0.21216f,0.920721f,0.327507f, +-0.208125f,0.923292f,0.322823f, +-0.300181f,0.87973f,0.368737f, +-0.312111f,0.847974f,0.428401f, +-0.324858f,0.873038f,0.363693f, +-0.410275f,0.846963f,0.338124f, +-0.346514f,0.853308f,0.389607f, +-0.303825f,0.86928f,0.389926f, +-0.270707f,0.881074f,0.387848f, +-0.213937f,0.928705f,0.302885f, +-0.20202f,0.939889f,0.275312f, +-0.214102f,0.943299f,0.253667f, +-0.0402111f,0.999126f,0.011392f, +-0.0458289f,0.99894f,0.00442323f, +-0.170695f,0.984267f,-0.0456311f, +-0.29333f,0.955986f,-0.00691228f, +-0.274679f,0.961535f,-0.00118788f, +-0.240876f,0.970372f,-0.0188751f, +-0.335158f,0.942005f,0.0172014f, +-0.387782f,0.921031f,0.0364391f, +-0.254694f,0.964339f,0.0719752f, +-0.156383f,0.970864f,0.181569f, +-0.223749f,0.957301f,0.183063f, +-0.122594f,0.972034f,0.200303f, +-0.0910709f,0.976799f,0.193828f, +-0.28429f,0.950625f,0.124466f, +-0.315477f,0.924742f,0.212902f, +-0.305454f,0.925312f,0.224713f, +-0.365063f,0.920836f,0.137077f, +-0.474911f,0.873286f,0.108772f, +-0.523018f,0.843362f,0.123259f, +-0.405348f,0.903149f,0.141474f, +-0.272593f,0.953587f,0.127925f, +-0.342778f,0.935924f,0.0809316f, +-0.402631f,0.912044f,0.0778773f, +-0.324862f,0.935409f,0.139553f, +-0.213356f,0.97623f,0.0381383f, +0.0301299f,0.998064f,0.0544045f, +-0.104927f,0.992798f,0.0578138f, +-0.261101f,0.959724f,0.103713f, +-0.0217785f,0.964552f,0.262994f, +0.0803134f,0.988499f,0.128142f, +0.028164f,0.998669f,0.043203f, +-0.0183001f,0.984341f,0.175323f, +-0.0612635f,0.982917f,0.173556f, +-0.0331225f,0.977326f,0.209135f, +0.0728156f,0.957515f,0.279039f, +0.245559f,0.942697f,0.225881f, +0.183786f,0.974714f,0.127102f, +0.141547f,0.988409f,0.0548866f, +0.245636f,0.968932f,-0.0288843f, +0.304552f,0.94926f,-0.0784495f, +0.340339f,0.936344f,-0.0861948f, +0.460805f,0.886321f,0.0457651f, +0.380493f,0.924294f,0.030084f, +0.352595f,0.93478f,0.0431689f, +0.472573f,0.87479f,0.106851f, +0.264087f,0.962772f,-0.057695f, +0.234368f,0.968348f,-0.0858683f, +0.503248f,0.863251f,0.0392276f, +0.302957f,0.950423f,0.0700943f, +0.0199528f,0.999731f,0.0118377f, +0.239816f,0.960125f,0.143695f, +-0.0259597f,0.9852f,0.16943f, +-0.288371f,0.907451f,0.305574f, +-0.301113f,0.913287f,0.274296f, +-0.184882f,0.952263f,0.242927f, +-0.251998f,0.931999f,0.260528f, +-0.398011f,0.856633f,0.32828f, +-0.335641f,0.851294f,0.403292f, +-0.239383f,0.893387f,0.380205f, +-0.388171f,0.875539f,0.287671f, +-0.364652f,0.897686f,0.247364f, +-0.31107f,0.908317f,0.279636f, +-0.277708f,0.915298f,0.291733f, +-0.164862f,0.947448f,0.274159f, +-0.18884f,0.953184f,0.236178f, +-0.183001f,0.960107f,0.211435f, +-0.0382166f,0.998778f,0.0313295f, +-0.025601f,0.999566f,0.0145695f, +-0.151993f,0.98817f,-0.0204673f, +-0.361566f,0.932093f,-0.021731f, +-0.304279f,0.951825f,0.0379804f, +-0.164708f,0.984119f,0.0661845f, +-0.289794f,0.954555f,-0.0695987f, +-0.339732f,0.933497f,-0.114741f, +-0.304944f,0.945342f,-0.115492f, +-0.266385f,0.963249f,-0.0345067f, +-0.261205f,0.96511f,0.0183122f, +-0.220073f,0.973176f,0.06706f, +-0.108437f,0.981443f,0.158152f, +-0.188668f,0.971426f,0.143996f, +-0.373149f,0.923277f,0.0912126f, +-0.308957f,0.927563f,0.210174f, +-0.302984f,0.922237f,0.240167f, +-0.457665f,0.867903f,0.193102f, +-0.548023f,0.825328f,0.136032f, +-0.407198f,0.903776f,0.131829f, +-0.253292f,0.959077f,0.126545f, +-0.271541f,0.948088f,0.165511f, +-0.43428f,0.889355f,0.142997f, +-0.382973f,0.89965f,0.20967f, +-0.169509f,0.965022f,0.199998f, +0.00160887f,0.982078f,0.188467f, +-0.0137168f,0.977172f,0.212005f, +-0.230009f,0.971053f,0.0644371f, +-0.165502f,0.985539f,0.036359f, +0.129892f,0.967237f,0.218131f, +0.0422409f,0.973374f,0.225299f, +-0.105762f,0.968925f,0.223604f, +-0.0226547f,0.965849f,0.258115f, +0.0138374f,0.990856f,0.134211f, +0.0309349f,0.998739f,0.0395399f, +0.294589f,0.940971f,0.166706f, +0.248856f,0.959421f,0.132596f, +0.181153f,0.982002f,0.053445f, +0.283788f,0.958737f,0.0169453f, +0.366617f,0.930251f,-0.0149969f, +0.332578f,0.93839f,-0.0938972f, +0.358957f,0.931691f,-0.0557027f, +0.429022f,0.901938f,0.0494683f, +0.332897f,0.942781f,-0.0185381f, +0.429131f,0.903242f,-0.000810457f, +0.405301f,0.91403f,-0.0167607f, +0.256936f,0.958211f,-0.12576f, +0.354456f,0.935063f,-0.00433271f, +0.385431f,0.888673f,0.248403f, +0.0742527f,0.992531f,0.0967874f, +0.121836f,0.985927f,0.11447f, +-0.100545f,0.965192f,0.241444f, +-0.337975f,0.881899f,0.328674f, +-0.242866f,0.922974f,0.298555f, +-0.185171f,0.940279f,0.285633f, +-0.313033f,0.906226f,0.28419f, +-0.448562f,0.843983f,0.294082f, +-0.356046f,0.888609f,0.289144f, +-0.196811f,0.931399f,0.306206f, +-0.298585f,0.916744f,0.265384f, +-0.410663f,0.894937f,0.17448f, +-0.325435f,0.90586f,0.271126f, +-0.301755f,0.928362f,0.216998f, +-0.109278f,0.952007f,0.285903f, +-0.14523f,0.965578f,0.215795f, +-0.139372f,0.971047f,0.194018f, +0.00163448f,0.997617f,0.0689798f, +0.026224f,0.998835f,0.04051f, +-0.128032f,0.991559f,-0.0204567f, +-0.309968f,0.948873f,-0.0596736f, +-0.340105f,0.924291f,-0.173245f, +-0.190965f,0.977348f,-0.0912302f, +-0.146645f,0.988782f,-0.028384f, +-0.31072f,0.935549f,-0.167929f, +-0.380234f,0.90209f,-0.204096f, +-0.300275f,0.945729f,-0.124224f, +-0.302914f,0.945705f,-0.117837f, +-0.237161f,0.970049f,-0.0525309f, +-0.165718f,0.984724f,-0.0534418f, +-0.190643f,0.98063f,0.0449474f, +-0.411915f,0.909141f,0.0615588f, +-0.453396f,0.88136f,0.1328f, +-0.362905f,0.886473f,0.287169f, +-0.380477f,0.872742f,0.305874f, +-0.476636f,0.866585f,0.147809f, +-0.366115f,0.923073f,0.117878f, +-0.278065f,0.952821f,0.121709f, +-0.370509f,0.910147f,0.18535f, +-0.442894f,0.857435f,0.26201f, +-0.347292f,0.915122f,0.204794f, +-0.111317f,0.983727f,0.141034f, +-0.00583658f,0.989977f,0.14111f, +0.00293304f,0.989031f,0.147679f, +-0.0932614f,0.992658f,0.0770272f, +-0.209442f,0.977765f,-0.0104574f, +-0.0521744f,0.996134f,0.0706788f, +0.0111918f,0.977173f,0.21215f, +-0.0985288f,0.958328f,0.268141f, +0.0097532f,0.972945f,0.23083f, +0.214151f,0.960047f,0.180136f, +0.0316331f,0.999392f,0.014672f, +0.114623f,0.990459f,0.0765015f, +0.302992f,0.926463f,0.223298f, +0.283203f,0.948444f,0.142303f, +0.315435f,0.948621f,0.0248881f, +0.37741f,0.92565f,0.0270755f, +0.401819f,0.915069f,0.0345122f, +0.321768f,0.943567f,-0.0784028f, +0.371664f,0.926589f,-0.0574381f, +0.394659f,0.917373f,-0.0516908f, +0.434962f,0.894125f,-0.106531f, +0.447382f,0.892016f,-0.0644733f, +0.241542f,0.966428f,-0.0876093f, +0.127706f,0.991493f,-0.0251536f, +0.250404f,0.953051f,0.170269f, +0.250954f,0.937023f,0.242919f, +-0.000559693f,0.986358f,0.164614f, +-0.211006f,0.922632f,0.32284f, +-0.34675f,0.881023f,0.321811f, +-0.216454f,0.925604f,0.310492f, +-0.177379f,0.942447f,0.283426f, +-0.307121f,0.917748f,0.251824f, +-0.427987f,0.86998f,0.244872f, +-0.348579f,0.908707f,0.229659f, +-0.214211f,0.945769f,0.244201f, +-0.272299f,0.924949f,0.265184f, +-0.413173f,0.878684f,0.239168f, +-0.359354f,0.883418f,0.300728f, +-0.292273f,0.892332f,0.343978f, +-0.146355f,0.897543f,0.415929f, +-0.0984727f,0.903088f,0.418013f, +-0.114958f,0.888054f,0.445134f, +0.0486539f,0.997583f,-0.0496084f, +0.0486095f,0.995772f,-0.0779487f, +-0.0727955f,0.994312f,-0.0777426f, +-0.222675f,0.967501f,-0.119823f, +-0.286744f,0.93984f,-0.185682f, +-0.296641f,0.937378f,-0.182555f, +-0.219022f,0.967026f,-0.12996f, +-0.147314f,0.984117f,-0.0990538f, +-0.3428f,0.902622f,-0.26031f, +-0.347893f,0.908635f,-0.230983f, +-0.327008f,0.925901f,-0.189136f, +-0.254527f,0.952486f,-0.167289f, +-0.228332f,0.958887f,-0.168522f, +-0.287734f,0.955666f,-0.0625468f, +-0.451431f,0.892304f,0.00185963f, +-0.510909f,0.851571f,0.11747f, +-0.434919f,0.884052f,0.171166f, +-0.355658f,0.920763f,0.16032f, +-0.392075f,0.91242f,0.117331f, +-0.40418f,0.912194f,0.0673793f, +-0.347001f,0.925636f,0.15096f, +-0.406528f,0.883834f,0.231457f, +-0.406378f,0.897555f,0.171031f, +-0.271349f,0.960134f,0.0671726f, +-0.0926357f,0.994526f,0.0483373f, +-0.0156467f,0.998994f,0.0420269f, +0.00801384f,0.999533f,0.0295044f, +-0.0412004f,0.995482f,0.0855485f, +-0.171347f,0.982792f,0.068987f, +-0.142796f,0.988044f,0.0581328f, +-0.101871f,0.981247f,0.163632f, +-0.103189f,0.979569f,0.172615f, +0.0761964f,0.994828f,0.0671726f, +0.210538f,0.977574f,0.00485915f, +0.123577f,0.988892f,0.0825912f, +0.0553491f,0.995759f,0.0734865f, +0.223203f,0.966768f,0.124662f, +0.344575f,0.927512f,0.144881f, +0.388873f,0.91351f,0.119485f, +0.324349f,0.942843f,0.0764535f, +0.411999f,0.8978f,0.155603f, +0.440079f,0.892774f,0.0963553f, +0.378616f,0.925121f,-0.0283174f, +0.428515f,0.90345f,-0.0123871f, +0.429626f,0.902172f,-0.0388249f, +0.396609f,0.917987f,-0.000717735f, +0.233551f,0.972137f,-0.020091f, +0.111169f,0.993801f,0.000982701f, +0.115357f,0.993291f,0.00809163f, +0.164275f,0.973308f,0.160266f, +-0.0349159f,0.947849f,0.316803f, +-0.267423f,0.890391f,0.368361f, +-0.327503f,0.90805f,0.261125f, +-0.196107f,0.942247f,0.271499f, +-0.118776f,0.949723f,0.289686f, +-0.296931f,0.925681f,0.234405f, +-0.445051f,0.862967f,0.239201f, +-0.335704f,0.917243f,0.2144f, +-0.25181f,0.948438f,0.1925f, +-0.329983f,0.903347f,0.274f, +-0.391867f,0.838521f,0.378579f, +-0.417038f,0.817641f,0.396917f, +-0.341558f,0.812981f,0.471594f, +-0.188106f,0.834488f,0.517925f, +-0.137025f,0.804598f,0.577794f, +-0.18711f,0.76127f,0.620852f, +0.138194f,0.960364f,-0.242082f, +0.0401358f,0.96162f,-0.271434f, +-0.076195f,0.979732f,-0.185256f, +-0.203103f,0.960439f,-0.190543f, +-0.267864f,0.941416f,-0.2049f, +-0.261748f,0.936741f,-0.232388f, +-0.231434f,0.930091f,-0.285254f, +-0.126583f,0.962607f,-0.239509f, +-0.258776f,0.934905f,-0.242872f, +-0.430322f,0.876496f,-0.215819f, +-0.353956f,0.929119f,-0.107016f, +-0.27861f,0.956787f,-0.0832819f, +-0.250796f,0.967007f,-0.0447179f, +-0.348257f,0.937394f,-0.0030026f, +-0.497787f,0.866258f,0.0424905f, +-0.584411f,0.803193f,0.115522f, +-0.394257f,0.905213f,0.158588f, +-0.343138f,0.935038f,0.0892179f, +-0.380878f,0.917442f,0.115034f, +-0.389256f,0.914513f,0.11021f, +-0.431967f,0.895633f,0.10605f, +-0.414636f,0.893675f,0.171528f, +-0.300214f,0.948969f,0.0965901f, +-0.20281f,0.978452f,-0.0387339f, +-0.123855f,0.987388f,-0.098611f, +-0.0140563f,0.999899f,0.0019046f, +-0.052066f,0.991601f,0.118388f, +-0.0936165f,0.973604f,0.208163f, +-0.149626f,0.978491f,0.142013f, +-0.198198f,0.970011f,0.140699f, +-0.130637f,0.968649f,0.211313f, +0.013631f,0.991214f,0.131563f, +0.20118f,0.979295f,0.0225449f, +0.231889f,0.971935f,-0.0396138f, +0.0131145f,0.999014f,-0.0424166f, +0.0264969f,0.999403f,0.0221517f, +0.210411f,0.977103f,0.0315571f, +0.327081f,0.943965f,0.0441437f, +0.381166f,0.920813f,0.0825546f, +0.346088f,0.933621f,0.0925967f, +0.356105f,0.932513f,0.0600724f, +0.479238f,0.87232f,0.0968908f, +0.446186f,0.89276f,0.062428f, +0.391504f,0.920172f,-0.00287489f, +0.426134f,0.9041f,0.0318405f, +0.417296f,0.907685f,0.0444148f, +0.286592f,0.957965f,0.012947f, +0.07628f,0.996621f,-0.030475f, +0.0820652f,0.99629f,0.0259114f, +-0.0280556f,0.994071f,0.105053f, +-0.213977f,0.933546f,0.287585f, +-0.245374f,0.890565f,0.382995f, +-0.189692f,0.923736f,0.332759f, +-0.238316f,0.94737f,0.213765f, +-0.176209f,0.945132f,0.275092f, +-0.265622f,0.907592f,0.32515f, +-0.420635f,0.873046f,0.246691f, +-0.275407f,0.930254f,0.242441f, +-0.273955f,0.921146f,0.276474f, +-0.415501f,0.828882f,0.374585f, +-0.488833f,0.76092f,0.426664f, +-0.43149f,0.76785f,0.473522f, +-0.33634f,0.787599f,0.516297f, +-0.228347f,0.790629f,0.568123f, +-0.231089f,0.763668f,0.602835f, +-0.28515f,0.752352f,0.593849f, +0.109283f,0.926796f,-0.359314f, +-0.0105223f,0.944186f,-0.329244f, +-0.147017f,0.945286f,-0.29124f, +-0.202823f,0.935685f,-0.288714f, +-0.214861f,0.941374f,-0.260095f, +-0.2356f,0.926477f,-0.293483f, +-0.224333f,0.941495f,-0.251519f, +-0.230404f,0.948768f,-0.216226f, +-0.277442f,0.956386f,-0.0913908f, +-0.472179f,0.876647f,-0.0923929f, +-0.428177f,0.898465f,-0.0970806f, +-0.3387f,0.938243f,-0.0705803f, +-0.291725f,0.956079f,0.0284457f, +-0.399526f,0.915525f,0.0468393f, +-0.527082f,0.845186f,0.0885769f, +-0.577694f,0.815576f,0.0332458f, +-0.408723f,0.912647f,0.00457497f, +-0.331162f,0.938989f,0.0929031f, +-0.4185f,0.893481f,0.162938f, +-0.372755f,0.902119f,0.217335f, +-0.419905f,0.891761f,0.168648f, +-0.426162f,0.889671f,0.163929f, +-0.238048f,0.949403f,0.20486f, +-0.0631417f,0.981494f,0.180781f, +-0.0934621f,0.991987f,0.0850084f, +-0.209815f,0.971464f,0.110612f, +-0.239382f,0.928806f,0.282871f, +-0.0385152f,0.924665f,0.378829f, +-0.0229585f,0.976683f,0.213458f, +-0.204415f,0.977814f,0.0457583f, +-0.131276f,0.991302f,0.00937849f, +0.100844f,0.99484f,0.0110965f, +0.227419f,0.973508f,-0.0237273f, +0.22975f,0.97307f,0.0187244f, +0.0718328f,0.997222f,0.0197173f, +0.0214849f,0.994143f,-0.105917f, +0.174121f,0.982096f,-0.0718949f, +0.303053f,0.952921f,0.010044f, +0.38012f,0.924935f,0.00218727f, +0.364895f,0.929903f,-0.0461611f, +0.383009f,0.921386f,-0.0659776f, +0.441676f,0.895702f,-0.0513817f, +0.484548f,0.87476f,0.00284626f, +0.413676f,0.910113f,-0.0237944f, +0.449057f,0.893501f,-0.00212143f, +0.360983f,0.928147f,-0.090746f, +0.274993f,0.958661f,0.0731286f, +0.0881261f,0.984394f,0.15232f, +0.00584658f,0.984704f,0.174138f, +-0.113749f,0.971528f,0.207834f, +-0.320112f,0.923512f,0.211313f, +-0.308899f,0.921582f,0.23509f, +-0.147069f,0.956187f,0.253135f, +-0.14137f,0.959806f,0.242461f, +-0.277438f,0.935166f,0.220209f, +-0.254545f,0.906523f,0.336782f, +-0.385464f,0.89189f,0.236535f, +-0.346902f,0.887297f,0.303913f, +-0.404152f,0.809818f,0.425271f, +-0.45263f,0.705418f,0.545446f, +-0.436346f,0.733679f,0.520882f, +-0.40606f,0.758487f,0.509719f, +-0.399991f,0.76519f,0.504471f, +-0.29927f,0.789873f,0.535292f, +-0.216265f,0.823324f,0.524754f, +-0.25441f,0.854784f,0.452349f, +-0.0876585f,0.974972f,-0.204317f, +-0.064531f,0.993199f,-0.096908f, +-0.142906f,0.98657f,-0.0790982f, +-0.190225f,0.979959f,-0.0591132f, +-0.245075f,0.966633f,-0.0745641f, +-0.286525f,0.954682f,-0.0805399f, +-0.302328f,0.953201f,0.00253574f, +-0.315251f,0.947498f,0.0535207f, +-0.363913f,0.92013f,0.144666f, +-0.433014f,0.884677f,0.172759f, +-0.39903f,0.904384f,0.151207f, +-0.340877f,0.927749f,0.15194f, +-0.34367f,0.933336f,0.103799f, +-0.371228f,0.927804f,0.0370044f, +-0.540653f,0.838686f,-0.0655789f, +-0.541683f,0.840171f,-0.0263209f, +-0.443789f,0.895468f,-0.0344719f, +-0.446175f,0.894923f,0.00646964f, +-0.489716f,0.870366f,0.0513954f, +-0.393228f,0.91623f,0.0767741f, +-0.386844f,0.914535f,0.118231f, +-0.456614f,0.881467f,0.1205f, +-0.291641f,0.939064f,0.181947f, +-0.0983466f,0.949337f,0.298474f, +-0.0663966f,0.917799f,0.391455f, +-0.225097f,0.912905f,0.340494f, +-0.270333f,0.917625f,0.291349f, +-0.0378823f,0.963845f,0.263756f, +0.203246f,0.94956f,0.238803f, +-0.00658121f,0.998329f,0.057403f, +-0.104339f,0.991332f,-0.0798442f, +0.0714998f,0.99184f,-0.105548f, +0.229254f,0.968801f,-0.0941692f, +0.162963f,0.980447f,-0.110304f, +0.144794f,0.987619f,-0.0603599f, +0.1028f,0.982727f,-0.153883f, +0.103742f,0.981824f,-0.158931f, +0.242509f,0.962807f,-0.119129f, +0.409757f,0.908112f,-0.0862081f, +0.420763f,0.899369f,-0.118717f, +0.356993f,0.920491f,-0.158908f, +0.417923f,0.902816f,-0.101306f, +0.45294f,0.886743f,-0.0923743f, +0.388277f,0.919595f,-0.0598771f, +0.442705f,0.896663f,-0.00260706f, +0.330753f,0.943188f,0.0316099f, +0.0976556f,0.983098f,0.154858f, +-0.0408134f,0.964902f,0.259421f, +-0.0353778f,0.920067f,0.39016f, +-0.0336634f,0.909873f,0.413518f, +-0.27131f,0.928078f,0.255075f, +-0.276299f,0.942343f,0.188808f, +-0.178846f,0.97249f,0.149254f, +-0.173925f,0.95192f,0.252185f, +-0.312455f,0.905292f,0.287781f, +-0.299358f,0.905887f,0.299588f, +-0.361522f,0.88183f,0.302783f, +-0.474485f,0.805519f,0.35497f, +-0.514467f,0.728892f,0.451708f, +-0.495653f,0.729457f,0.471404f, +-0.395267f,0.75904f,0.517322f, +-0.414244f,0.765988f,0.491594f, +-0.375453f,0.800102f,0.467837f, +-0.23686f,0.857078f,0.457509f, +-0.153599f,0.897001f,0.414483f, +-0.139778f,0.900978f,0.410733f, +-0.246424f,0.968956f,-0.0200009f, +-0.187575f,0.975459f,0.115309f, +-0.169324f,0.958565f,0.229092f, +-0.227196f,0.942917f,0.243495f, +-0.216356f,0.935609f,0.278972f, +-0.279085f,0.916546f,0.286453f, +-0.337088f,0.885038f,0.32106f, +-0.317388f,0.891504f,0.323242f, +-0.400555f,0.875243f,0.271117f, +-0.420396f,0.865286f,0.273034f, +-0.438864f,0.863369f,0.248983f, +-0.296161f,0.903481f,0.309855f, +-0.22181f,0.945018f,0.240296f, +-0.217483f,0.959525f,0.178924f, +-0.432196f,0.899705f,0.0611361f, +-0.592514f,0.805005f,-0.029893f, +-0.445437f,0.89528f,0.00770123f, +-0.444106f,0.895735f,-0.0207082f, +-0.441178f,0.89658f,-0.0387967f, +-0.433316f,0.896401f,-0.0932815f, +-0.448061f,0.893999f,-0.00273746f, +-0.479681f,0.876222f,0.046264f, +-0.38049f,0.918735f,0.105607f, +-0.274091f,0.928692f,0.249812f, +-0.115693f,0.919238f,0.37632f, +-0.109076f,0.943601f,0.312601f, +-0.183297f,0.969532f,0.162513f, +-0.0200265f,0.998099f,0.0582807f, +0.217564f,0.969248f,0.114995f, +0.107422f,0.986137f,0.126469f, +-0.0101958f,0.999802f,0.0170616f, +0.0917708f,0.993871f,-0.0616322f, +0.259886f,0.964354f,-0.049807f, +0.22181f,0.965636f,-0.135454f, +0.11068f,0.965795f,-0.234499f, +0.156396f,0.962982f,-0.219561f, +0.0996902f,0.954613f,-0.28067f, +0.240821f,0.930419f,-0.276271f, +0.362585f,0.892287f,-0.268992f, +0.39828f,0.905306f,-0.147629f, +0.377219f,0.92249f,-0.0819651f, +0.379471f,0.918832f,-0.108391f, +0.428571f,0.902988f,-0.0306522f, +0.390587f,0.920304f,0.0219829f, +0.365451f,0.930816f,-0.00527733f, +0.226127f,0.963781f,0.141399f, +-0.014879f,0.969939f,0.242893f, +-0.0990439f,0.938525f,0.330697f, +-0.160986f,0.911469f,0.37856f, +-0.0311141f,0.900531f,0.433676f, +-0.0818559f,0.904519f,0.418503f, +-0.202897f,0.939947f,0.274469f, +-0.199596f,0.951915f,0.232421f, +-0.290928f,0.922977f,0.251942f, +-0.30301f,0.91121f,0.279072f, +-0.315746f,0.908229f,0.274635f, +-0.386173f,0.858884f,0.336435f, +-0.56045f,0.768828f,0.307894f, +-0.529456f,0.742805f,0.409776f, +-0.545227f,0.770059f,0.331265f, +-0.460487f,0.804404f,0.375346f, +-0.384041f,0.835484f,0.393038f, +-0.366328f,0.856374f,0.363907f, +-0.227066f,0.886912f,0.40228f, +-0.162423f,0.896635f,0.411903f, +-0.18398f,0.877261f,0.443356f, +-0.33059f,0.941987f,0.0580528f, +-0.349053f,0.930827f,0.108275f, +-0.250298f,0.937413f,0.242089f, +-0.231173f,0.921233f,0.312871f, +-0.267366f,0.883285f,0.385127f, +-0.300638f,0.858727f,0.414975f, +-0.348846f,0.869854f,0.348799f, +-0.262698f,0.902187f,0.342122f, +-0.319043f,0.887638f,0.33213f, +-0.407631f,0.874264f,0.263628f, +-0.391131f,0.891388f,0.229006f, +-0.306387f,0.939971f,0.150271f, +-0.172289f,0.969062f,0.176734f, +-0.280735f,0.939942f,0.194158f, +-0.35822f,0.876748f,0.320922f, +-0.540223f,0.822439f,0.178196f, +-0.415201f,0.897062f,0.151285f, +-0.398489f,0.913332f,0.0838552f, +-0.47388f,0.879024f,0.052479f, +-0.430994f,0.889287f,0.153011f, +-0.501585f,0.850518f,0.158213f, +-0.493115f,0.843586f,0.212601f, +-0.437044f,0.869936f,0.228482f, +-0.335665f,0.928238f,0.160321f, +-0.135997f,0.987913f,0.0743886f, +0.0115105f,0.995614f,0.0928467f, +-0.0367985f,0.999249f,0.0121783f, +0.0254956f,0.996874f,-0.0747791f, +0.107382f,0.991622f,-0.0717932f, +0.144184f,0.989518f,0.00810907f, +0.0943487f,0.994079f,-0.0539027f, +0.124876f,0.987862f,-0.0923827f, +0.25534f,0.960035f,-0.114602f, +0.339105f,0.927956f,-0.154613f, +0.200588f,0.937015f,-0.285951f, +0.184172f,0.917658f,-0.352115f, +0.137125f,0.909076f,-0.393417f, +0.231522f,0.90798f,-0.349242f, +0.299652f,0.902049f,-0.310671f, +0.23061f,0.944613f,-0.233507f, +0.336481f,0.938772f,-0.0740748f, +0.38792f,0.918977f,-0.070704f, +0.337723f,0.938393f,-0.073227f, +0.392706f,0.919584f,-0.012147f, +0.294051f,0.954956f,-0.0399037f, +0.173344f,0.964432f,0.199555f, +-0.108669f,0.967119f,0.22994f, +-0.18728f,0.925976f,0.327863f, +-0.156223f,0.937505f,0.310931f, +-0.0961609f,0.948752f,0.301037f, +-0.051031f,0.914222f,0.401987f, +-0.116652f,0.921592f,0.370216f, +-0.16747f,0.919727f,0.355044f, +-0.233888f,0.917713f,0.321092f, +-0.296558f,0.924646f,0.23892f, +-0.384099f,0.898594f,0.212122f, +-0.451252f,0.843433f,0.291535f, +-0.561019f,0.766309f,0.313095f, +-0.56702f,0.761029f,0.315156f, +-0.502958f,0.815049f,0.287624f, +-0.46769f,0.845823f,0.256612f, +-0.438846f,0.860082f,0.260142f, +-0.380472f,0.841841f,0.382812f, +-0.286801f,0.84573f,0.449984f, +-0.166497f,0.837941f,0.519744f, +-0.237954f,0.844014f,0.480644f, +-0.400938f,0.907575f,0.124721f, +-0.36178f,0.91645f,0.170983f, +-0.326178f,0.936068f,0.131852f, +-0.348093f,0.925471f,0.149445f, +-0.380521f,0.903785f,0.195901f, +-0.261965f,0.932138f,0.249988f, +-0.229009f,0.957451f,0.175621f, +-0.296226f,0.953377f,0.0576446f, +-0.385007f,0.916429f,0.109216f, +-0.396898f,0.895963f,0.199304f, +-0.30002f,0.927264f,0.223985f, +-0.290512f,0.953204f,0.083697f, +-0.240862f,0.959505f,0.146069f, +-0.368638f,0.900621f,0.230189f, +-0.437205f,0.833732f,0.337256f, +-0.435531f,0.825298f,0.359438f, +-0.382764f,0.869714f,0.311593f, +-0.302351f,0.902083f,0.307944f, +-0.504704f,0.84016f,0.198507f, +-0.44412f,0.839306f,0.313565f, +-0.494888f,0.841296f,0.217503f, +-0.530329f,0.827106f,0.186138f, +-0.314084f,0.933199f,0.174614f, +-0.124034f,0.990967f,0.050983f, +-0.0452003f,0.995178f,-0.0870557f, +-0.00182424f,0.990385f,-0.138326f, +-0.0388611f,0.986686f,-0.157927f, +0.0684221f,0.991564f,-0.11009f, +0.102533f,0.981475f,-0.161848f, +0.149983f,0.975213f,-0.162681f, +0.108711f,0.963953f,-0.24285f, +0.134579f,0.963238f,-0.232511f, +0.280754f,0.932346f,-0.227832f, +0.370391f,0.907723f,-0.197103f, +0.290987f,0.936165f,-0.197286f, +0.244643f,0.947659f,-0.205165f, +0.12819f,0.972148f,-0.196204f, +0.159014f,0.967422f,-0.197002f, +0.312607f,0.930748f,-0.189697f, +0.153027f,0.941997f,-0.298704f, +0.218578f,0.950985f,-0.218748f, +0.390534f,0.915543f,-0.0962525f, +0.350134f,0.933592f,-0.0762398f, +0.369694f,0.928637f,-0.030973f, +0.182224f,0.981373f,0.0608345f, +-0.0452136f,0.980467f,0.191416f, +-0.152401f,0.95767f,0.244216f, +-0.205784f,0.951891f,0.22706f, +-0.112228f,0.971017f,0.211022f, +-0.130106f,0.967854f,0.215247f, +-0.151633f,0.958079f,0.243087f, +-0.104162f,0.953804f,0.281796f, +-0.17561f,0.947845f,0.265989f, +-0.209606f,0.941523f,0.263816f, +-0.251275f,0.930745f,0.265659f, +-0.361f,0.884718f,0.294879f, +-0.50281f,0.813876f,0.291185f, +-0.583247f,0.763934f,0.276094f, +-0.556622f,0.802134f,0.216224f, +-0.473532f,0.851987f,0.223352f, +-0.473757f,0.85285f,0.219548f, +-0.491496f,0.823107f,0.284477f, +-0.477559f,0.793154f,0.377946f, +-0.368868f,0.830921f,0.416542f, +-0.202419f,0.861608f,0.465466f, +-0.095407f,0.855544f,0.508864f, +-0.40239f,0.909528f,0.104118f, +-0.357524f,0.930915f,0.0746555f, +-0.280797f,0.959558f,0.0200349f, +-0.296463f,0.954936f,-0.0143765f, +-0.381172f,0.918388f,-0.106166f, +-0.308734f,0.946435f,-0.094572f, +-0.184864f,0.981918f,-0.0407667f, +-0.211096f,0.97426f,-0.0790985f, +-0.431269f,0.892976f,-0.128847f, +-0.508723f,0.860224f,-0.0348507f, +-0.315588f,0.942693f,0.108326f, +-0.229963f,0.954167f,0.191527f, +-0.338476f,0.90391f,0.261495f, +-0.399866f,0.843393f,0.358882f, +-0.508212f,0.817205f,0.271838f, +-0.45663f,0.829465f,0.321678f, +-0.343829f,0.869846f,0.353765f, +-0.25214f,0.908629f,0.332893f, +-0.465924f,0.864347f,0.189262f, +-0.451321f,0.885092f,0.11367f, +-0.398038f,0.913426f,0.0849568f, +-0.473433f,0.880353f,-0.0289816f, +-0.282123f,0.951018f,-0.126376f, +-0.111297f,0.983512f,-0.142537f, +-0.0203568f,0.995748f,-0.089847f, +0.0177076f,0.998505f,-0.0517153f, +-0.0210973f,0.999746f,0.00787929f, +0.0422415f,0.999104f,-0.00245387f, +0.162083f,0.986673f,-0.0143034f, +0.184873f,0.978111f,-0.0954998f, +0.225836f,0.960454f,-0.162869f, +0.105652f,0.960265f,-0.25832f, +0.22096f,0.965567f,-0.137321f, +0.306187f,0.951906f,0.0111556f, +0.252563f,0.963728f,0.0862585f, +0.185211f,0.975091f,0.122044f, +0.141716f,0.976503f,0.162355f, +0.200688f,0.976886f,0.0736112f, +0.398894f,0.916482f,0.0307355f, +0.27456f,0.96012f,-0.0527967f, +0.152825f,0.971043f,-0.183632f, +0.271211f,0.950001f,-0.154736f, +0.286301f,0.958137f,0.00244849f, +0.246502f,0.96458f,0.0939299f, +0.102065f,0.977178f,0.186298f, +-0.0761105f,0.976837f,0.19999f, +-0.0810786f,0.974651f,0.208524f, +-0.174214f,0.975155f,0.136831f, +-0.127689f,0.983595f,0.127422f, +-0.123239f,0.988203f,0.0909257f, +-0.173027f,0.984333f,0.033919f, +-0.13019f,0.985916f,0.104975f, +-0.151236f,0.977557f,0.146665f, +-0.212082f,0.972216f,0.0990861f, +-0.346196f,0.93167f,0.110181f, +-0.461867f,0.845088f,0.269268f, +-0.491314f,0.790968f,0.364663f, +-0.499721f,0.798886f,0.334753f, +-0.533877f,0.823302f,0.192741f, +-0.489959f,0.855912f,0.165393f, +-0.540105f,0.823669f,0.172786f, +-0.55174f,0.789596f,0.268553f, +-0.518837f,0.818462f,0.246838f, +-0.35793f,0.879679f,0.31313f, +-0.226645f,0.914368f,0.335505f, +-0.174062f,0.93173f,0.31872f, +-0.352372f,0.928926f,-0.113715f, +-0.283164f,0.949292f,-0.13661f, +-0.253833f,0.949289f,-0.185523f, +-0.258433f,0.953837f,-0.152994f, +-0.329686f,0.925665f,-0.185613f, +-0.360482f,0.913899f,-0.186657f, +-0.246398f,0.964945f,-0.0903879f, +-0.197613f,0.98019f,0.013309f, +-0.409684f,0.910684f,0.0530475f, +-0.545574f,0.83677f,0.0465257f, +-0.477964f,0.876264f,0.060934f, +-0.386247f,0.882258f,0.269135f, +-0.437443f,0.816448f,0.376904f, +-0.381546f,0.830459f,0.405906f, +-0.378931f,0.857772f,0.347329f, +-0.484349f,0.854204f,0.189053f, +-0.391934f,0.899277f,0.194136f, +-0.180618f,0.947297f,0.264585f, +-0.285059f,0.943094f,0.171219f, +-0.41449f,0.905591f,-0.0900102f, +-0.367364f,0.916679f,-0.157298f, +-0.4046f,0.892318f,-0.200168f, +-0.265207f,0.933534f,-0.241204f, +-0.171437f,0.970625f,-0.168809f, +-0.091648f,0.995789f,0.00231266f, +-0.0988725f,0.989781f,0.102747f, +-0.0749525f,0.978356f,0.192877f, +0.0618361f,0.988236f,0.139875f, +0.222758f,0.971067f,0.0860673f, +0.260459f,0.965435f,-0.00983276f, +0.296216f,0.954928f,-0.0191894f, +0.108089f,0.992937f,-0.0489145f, +0.0559635f,0.998425f,-0.00391097f, +0.182072f,0.980129f,0.0787236f, +0.189029f,0.972269f,0.137697f, +0.20292f,0.962368f,0.180751f, +0.162611f,0.977583f,0.133749f, +0.283117f,0.944546f,0.166365f, +0.362781f,0.917623f,0.162352f, +0.322808f,0.912852f,0.249991f, +0.306817f,0.930382f,0.200629f, +0.265368f,0.963264f,0.0412725f, +0.150516f,0.988588f,0.00624705f, +0.192187f,0.980013f,0.0513622f, +0.111093f,0.98864f,0.101236f, +-0.0652663f,0.990994f,0.116922f, +-0.0960853f,0.989279f,0.109972f, +-0.171018f,0.980514f,0.0966674f, +-0.118023f,0.981194f,0.152737f, +-0.0297124f,0.980668f,0.19341f, +-0.130364f,0.983461f,0.125733f, +-0.228583f,0.970632f,0.0749913f, +-0.187681f,0.973906f,0.127608f, +-0.18184f,0.968481f,0.170233f, +-0.382626f,0.904754f,0.187128f, +-0.565004f,0.795638f,0.218473f, +-0.54964f,0.808473f,0.210397f, +-0.494188f,0.848001f,0.191501f, +-0.42417f,0.88632f,0.185785f, +-0.490729f,0.864039f,0.112346f, +-0.547278f,0.819965f,0.167765f, +-0.555649f,0.823683f,0.113141f, +-0.525063f,0.850181f,0.0387426f, +-0.465555f,0.881687f,0.0767294f, +-0.25104f,0.948586f,0.19278f, +-0.134177f,0.968986f,0.207515f, +-0.358148f,0.879839f,-0.31243f, +-0.281248f,0.911984f,-0.298639f, +-0.261128f,0.923339f,-0.281526f, +-0.281121f,0.935581f,-0.213678f, +-0.316696f,0.928992f,-0.191515f, +-0.378661f,0.908066f,-0.178974f, +-0.357733f,0.923356f,-0.139433f, +-0.295419f,0.953886f,0.0531873f, +-0.456379f,0.869265f,0.18999f, +-0.492836f,0.836159f,0.240731f, +-0.533039f,0.832034f,0.153586f, +-0.471339f,0.822176f,0.319166f, +-0.417097f,0.817012f,0.398149f, +-0.397475f,0.860419f,0.318894f, +-0.295585f,0.889222f,0.349162f, +-0.397825f,0.896297f,0.195927f, +-0.426121f,0.903442f,0.0470364f, +-0.225108f,0.967792f,0.11272f, +-0.180332f,0.969123f,0.168172f, +-0.283694f,0.958436f,-0.0303046f, +-0.31011f,0.929142f,-0.201316f, +-0.379988f,0.880118f,-0.284609f, +-0.280631f,0.91033f,-0.304213f, +-0.299273f,0.919298f,-0.255591f, +-0.271669f,0.962178f,0.0202533f, +-0.127278f,0.946024f,0.298058f, +-0.0668081f,0.957542f,0.280447f, +0.156177f,0.962373f,0.222366f, +0.269377f,0.960799f,0.0655824f, +0.307217f,0.951527f,-0.0146071f, +0.247019f,0.968029f,-0.0436127f, +0.117286f,0.99106f,0.0635867f, +0.0498813f,0.996011f,0.0739844f, +0.194956f,0.980335f,0.0305971f, +0.139483f,0.989424f,-0.0398183f, +0.235447f,0.970519f,0.0515568f, +0.132445f,0.989845f,-0.05162f, +0.206421f,0.976844f,0.0562743f, +0.330371f,0.919083f,0.214804f, +0.266375f,0.922982f,0.277756f, +0.331232f,0.885792f,0.325049f, +0.36267f,0.895106f,0.259337f, +0.240431f,0.963714f,0.115964f, +0.171746f,0.982113f,-0.0771883f, +0.0351621f,0.99889f,-0.0313443f, +-0.0882653f,0.987488f,0.130674f, +-0.0658856f,0.986287f,0.151318f, +-0.167193f,0.982329f,0.0841182f, +-0.21476f,0.97234f,0.0918338f, +-0.104496f,0.958461f,0.265392f, +-0.0605561f,0.923444f,0.378926f, +-0.152497f,0.949101f,0.275594f, +-0.216118f,0.964594f,0.151167f, +-0.26219f,0.945639f,0.192413f, +-0.408309f,0.854572f,0.320922f, +-0.530012f,0.797788f,0.28744f, +-0.48417f,0.855541f,0.183383f, +-0.504616f,0.863257f,0.012294f, +-0.421367f,0.905956f,0.0411587f, +-0.517653f,0.855189f,0.0262018f, +-0.533316f,0.826853f,0.178574f, +-0.514944f,0.854185f,0.0721125f, +-0.506113f,0.861889f,-0.0315744f, +-0.499639f,0.865958f,-0.0218358f, +-0.302149f,0.952465f,0.038937f, +-0.129933f,0.988738f,0.0742583f, +}; + +btScalar Landscape02Tex[] = { +0.0f,0.273438f, +0.0f,0.265625f, +0.0078125f,0.273438f, +0.0078125f,0.265625f, +0.015625f,0.273438f, +0.015625f,0.265625f, +0.0234375f,0.273438f, +0.0234375f,0.265625f, +0.03125f,0.273438f, +0.03125f,0.265625f, +0.0390625f,0.273438f, +0.0390625f,0.265625f, +0.046875f,0.273438f, +0.046875f,0.265625f, +0.0546875f,0.273438f, +0.0546875f,0.265625f, +0.0625f,0.273438f, +0.0625f,0.265625f, +0.0703125f,0.273438f, +0.0703125f,0.265625f, +0.078125f,0.273438f, +0.078125f,0.265625f, +0.0859375f,0.273438f, +0.0859375f,0.265625f, +0.09375f,0.273438f, +0.09375f,0.265625f, +0.101563f,0.273438f, +0.101563f,0.265625f, +0.109375f,0.273438f, +0.109375f,0.265625f, +0.117188f,0.273438f, +0.117188f,0.265625f, +0.125f,0.273438f, +0.125f,0.265625f, +0.132813f,0.273438f, +0.132813f,0.265625f, +0.140625f,0.273438f, +0.140625f,0.265625f, +0.148438f,0.273438f, +0.148438f,0.265625f, +0.15625f,0.273438f, +0.15625f,0.265625f, +0.164063f,0.273438f, +0.164063f,0.265625f, +0.171875f,0.273438f, +0.171875f,0.265625f, +0.179688f,0.273438f, +0.179688f,0.265625f, +0.1875f,0.273438f, +0.1875f,0.265625f, +0.195313f,0.273438f, +0.195313f,0.265625f, +0.203125f,0.273438f, +0.203125f,0.265625f, +0.210938f,0.273438f, +0.210938f,0.265625f, +0.21875f,0.273438f, +0.21875f,0.265625f, +0.226563f,0.273438f, +0.226563f,0.265625f, +0.234375f,0.273438f, +0.234375f,0.265625f, +0.242188f,0.273438f, +0.242188f,0.265625f, +0.25f,0.273438f, +0.25f,0.265625f, +0.257813f,0.273438f, +0.257813f,0.265625f, +0.265625f,0.273438f, +0.265625f,0.265625f, +0.273438f,0.273438f, +0.273438f,0.265625f, +0.28125f,0.273438f, +0.28125f,0.265625f, +0.289063f,0.273438f, +0.289063f,0.265625f, +0.296875f,0.273438f, +0.296875f,0.265625f, +0.304688f,0.273438f, +0.304688f,0.265625f, +0.3125f,0.273438f, +0.3125f,0.265625f, +0.320313f,0.273438f, +0.320313f,0.265625f, +0.328125f,0.273438f, +0.328125f,0.265625f, +0.335938f,0.273438f, +0.335938f,0.265625f, +0.34375f,0.273438f, +0.34375f,0.265625f, +0.351563f,0.273438f, +0.351563f,0.265625f, +0.359375f,0.273438f, +0.359375f,0.265625f, +0.367188f,0.273438f, +0.367188f,0.265625f, +0.375f,0.273438f, +0.375f,0.265625f, +0.382813f,0.273438f, +0.382813f,0.265625f, +0.390625f,0.273438f, +0.390625f,0.265625f, +0.398438f,0.273438f, +0.398438f,0.265625f, +0.40625f,0.273438f, +0.40625f,0.265625f, +0.414063f,0.273438f, +0.414063f,0.265625f, +0.421875f,0.273438f, +0.421875f,0.265625f, +0.429688f,0.273438f, +0.429688f,0.265625f, +0.4375f,0.273438f, +0.4375f,0.265625f, +0.445313f,0.273438f, +0.445313f,0.265625f, +0.453125f,0.273438f, +0.453125f,0.265625f, +0.460938f,0.273438f, +0.460938f,0.265625f, +0.46875f,0.273438f, +0.46875f,0.265625f, +0.476563f,0.273438f, +0.476563f,0.265625f, +0.484375f,0.273438f, +0.484375f,0.265625f, +0.492188f,0.273438f, +0.492188f,0.265625f, +0.5f,0.273438f, +0.5f,0.265625f, +0.507813f,0.273438f, +0.507813f,0.265625f, +0.0f,0.28125f, +0.0078125f,0.28125f, +0.015625f,0.28125f, +0.0234375f,0.28125f, +0.03125f,0.28125f, +0.0390625f,0.28125f, +0.046875f,0.28125f, +0.0546875f,0.28125f, +0.0625f,0.28125f, +0.0703125f,0.28125f, +0.078125f,0.28125f, +0.0859375f,0.28125f, +0.09375f,0.28125f, +0.101563f,0.28125f, +0.109375f,0.28125f, +0.117188f,0.28125f, +0.125f,0.28125f, +0.132813f,0.28125f, +0.140625f,0.28125f, +0.148438f,0.28125f, +0.15625f,0.28125f, +0.164063f,0.28125f, +0.171875f,0.28125f, +0.179688f,0.28125f, +0.1875f,0.28125f, +0.195313f,0.28125f, +0.203125f,0.28125f, +0.210938f,0.28125f, +0.21875f,0.28125f, +0.226563f,0.28125f, +0.234375f,0.28125f, +0.242188f,0.28125f, +0.25f,0.28125f, +0.257813f,0.28125f, +0.265625f,0.28125f, +0.273438f,0.28125f, +0.28125f,0.28125f, +0.289063f,0.28125f, +0.296875f,0.28125f, +0.304688f,0.28125f, +0.3125f,0.28125f, +0.320313f,0.28125f, +0.328125f,0.28125f, +0.335938f,0.28125f, +0.34375f,0.28125f, +0.351563f,0.28125f, +0.359375f,0.28125f, +0.367188f,0.28125f, +0.375f,0.28125f, +0.382813f,0.28125f, +0.390625f,0.28125f, +0.398438f,0.28125f, +0.40625f,0.28125f, +0.414063f,0.28125f, +0.421875f,0.28125f, +0.429688f,0.28125f, +0.4375f,0.28125f, +0.445313f,0.28125f, +0.453125f,0.28125f, +0.460938f,0.28125f, +0.46875f,0.28125f, +0.476563f,0.28125f, +0.484375f,0.28125f, +0.492188f,0.28125f, +0.5f,0.28125f, +0.507813f,0.28125f, +0.0f,0.289063f, +0.0078125f,0.289063f, +0.015625f,0.289063f, +0.0234375f,0.289063f, +0.03125f,0.289063f, +0.0390625f,0.289063f, +0.046875f,0.289063f, +0.0546875f,0.289063f, +0.0625f,0.289063f, +0.0703125f,0.289063f, +0.078125f,0.289063f, +0.0859375f,0.289063f, +0.09375f,0.289063f, +0.101563f,0.289063f, +0.109375f,0.289063f, +0.117188f,0.289063f, +0.125f,0.289063f, +0.132813f,0.289063f, +0.140625f,0.289063f, +0.148438f,0.289063f, +0.15625f,0.289063f, +0.164063f,0.289063f, +0.171875f,0.289063f, +0.179688f,0.289063f, +0.1875f,0.289063f, +0.195313f,0.289063f, +0.203125f,0.289063f, +0.210938f,0.289063f, +0.21875f,0.289063f, +0.226563f,0.289063f, +0.234375f,0.289063f, +0.242188f,0.289063f, +0.25f,0.289063f, +0.257813f,0.289063f, +0.265625f,0.289063f, +0.273438f,0.289063f, +0.28125f,0.289063f, +0.289063f,0.289063f, +0.296875f,0.289063f, +0.304688f,0.289063f, +0.3125f,0.289063f, +0.320313f,0.289063f, +0.328125f,0.289063f, +0.335938f,0.289063f, +0.34375f,0.289063f, +0.351563f,0.289063f, +0.359375f,0.289063f, +0.367188f,0.289063f, +0.375f,0.289063f, +0.382813f,0.289063f, +0.390625f,0.289063f, +0.398438f,0.289063f, +0.40625f,0.289063f, +0.414063f,0.289063f, +0.421875f,0.289063f, +0.429688f,0.289063f, +0.4375f,0.289063f, +0.445313f,0.289063f, +0.453125f,0.289063f, +0.460938f,0.289063f, +0.46875f,0.289063f, +0.476563f,0.289063f, +0.484375f,0.289063f, +0.492188f,0.289063f, +0.5f,0.289063f, +0.507813f,0.289063f, +0.0f,0.296875f, +0.0078125f,0.296875f, +0.015625f,0.296875f, +0.0234375f,0.296875f, +0.03125f,0.296875f, +0.0390625f,0.296875f, +0.046875f,0.296875f, +0.0546875f,0.296875f, +0.0625f,0.296875f, +0.0703125f,0.296875f, +0.078125f,0.296875f, +0.0859375f,0.296875f, +0.09375f,0.296875f, +0.101563f,0.296875f, +0.109375f,0.296875f, +0.117188f,0.296875f, +0.125f,0.296875f, +0.132813f,0.296875f, +0.140625f,0.296875f, +0.148438f,0.296875f, +0.15625f,0.296875f, +0.164063f,0.296875f, +0.171875f,0.296875f, +0.179688f,0.296875f, +0.1875f,0.296875f, +0.195313f,0.296875f, +0.203125f,0.296875f, +0.210938f,0.296875f, +0.21875f,0.296875f, +0.226563f,0.296875f, +0.234375f,0.296875f, +0.242188f,0.296875f, +0.25f,0.296875f, +0.257813f,0.296875f, +0.265625f,0.296875f, +0.273438f,0.296875f, +0.28125f,0.296875f, +0.289063f,0.296875f, +0.296875f,0.296875f, +0.304688f,0.296875f, +0.3125f,0.296875f, +0.320313f,0.296875f, +0.328125f,0.296875f, +0.335938f,0.296875f, +0.34375f,0.296875f, +0.351563f,0.296875f, +0.359375f,0.296875f, +0.367188f,0.296875f, +0.375f,0.296875f, +0.382813f,0.296875f, +0.390625f,0.296875f, +0.398438f,0.296875f, +0.40625f,0.296875f, +0.414063f,0.296875f, +0.421875f,0.296875f, +0.429688f,0.296875f, +0.4375f,0.296875f, +0.445313f,0.296875f, +0.453125f,0.296875f, +0.460938f,0.296875f, +0.46875f,0.296875f, +0.476563f,0.296875f, +0.484375f,0.296875f, +0.492188f,0.296875f, +0.5f,0.296875f, +0.507813f,0.296875f, +0.0f,0.304688f, +0.0078125f,0.304688f, +0.015625f,0.304688f, +0.0234375f,0.304688f, +0.03125f,0.304688f, +0.0390625f,0.304688f, +0.046875f,0.304688f, +0.0546875f,0.304688f, +0.0625f,0.304688f, +0.0703125f,0.304688f, +0.078125f,0.304688f, +0.0859375f,0.304688f, +0.09375f,0.304688f, +0.101563f,0.304688f, +0.109375f,0.304688f, +0.117188f,0.304688f, +0.125f,0.304688f, +0.132813f,0.304688f, +0.140625f,0.304688f, +0.148438f,0.304688f, +0.15625f,0.304688f, +0.164063f,0.304688f, +0.171875f,0.304688f, +0.179688f,0.304688f, +0.1875f,0.304688f, +0.195313f,0.304688f, +0.203125f,0.304688f, +0.210938f,0.304688f, +0.21875f,0.304688f, +0.226563f,0.304688f, +0.234375f,0.304688f, +0.242188f,0.304688f, +0.25f,0.304688f, +0.257813f,0.304688f, +0.265625f,0.304688f, +0.273438f,0.304688f, +0.28125f,0.304688f, +0.289063f,0.304688f, +0.296875f,0.304688f, +0.304688f,0.304688f, +0.3125f,0.304688f, +0.320313f,0.304688f, +0.328125f,0.304688f, +0.335938f,0.304688f, +0.34375f,0.304688f, +0.351563f,0.304688f, +0.359375f,0.304688f, +0.367188f,0.304688f, +0.375f,0.304688f, +0.382813f,0.304688f, +0.390625f,0.304688f, +0.398438f,0.304688f, +0.40625f,0.304688f, +0.414063f,0.304688f, +0.421875f,0.304688f, +0.429688f,0.304688f, +0.4375f,0.304688f, +0.445313f,0.304688f, +0.453125f,0.304688f, +0.460938f,0.304688f, +0.46875f,0.304688f, +0.476563f,0.304688f, +0.484375f,0.304688f, +0.492188f,0.304688f, +0.5f,0.304688f, +0.507813f,0.304688f, +0.0f,0.3125f, +0.0078125f,0.3125f, +0.015625f,0.3125f, +0.0234375f,0.3125f, +0.03125f,0.3125f, +0.0390625f,0.3125f, +0.046875f,0.3125f, +0.0546875f,0.3125f, +0.0625f,0.3125f, +0.0703125f,0.3125f, +0.078125f,0.3125f, +0.0859375f,0.3125f, +0.09375f,0.3125f, +0.101563f,0.3125f, +0.109375f,0.3125f, +0.117188f,0.3125f, +0.125f,0.3125f, +0.132813f,0.3125f, +0.140625f,0.3125f, +0.148438f,0.3125f, +0.15625f,0.3125f, +0.164063f,0.3125f, +0.171875f,0.3125f, +0.179688f,0.3125f, +0.1875f,0.3125f, +0.195313f,0.3125f, +0.203125f,0.3125f, +0.210938f,0.3125f, +0.21875f,0.3125f, +0.226563f,0.3125f, +0.234375f,0.3125f, +0.242188f,0.3125f, +0.25f,0.3125f, +0.257813f,0.3125f, +0.265625f,0.3125f, +0.273438f,0.3125f, +0.28125f,0.3125f, +0.289063f,0.3125f, +0.296875f,0.3125f, +0.304688f,0.3125f, +0.3125f,0.3125f, +0.320313f,0.3125f, +0.328125f,0.3125f, +0.335938f,0.3125f, +0.34375f,0.3125f, +0.351563f,0.3125f, +0.359375f,0.3125f, +0.367188f,0.3125f, +0.375f,0.3125f, +0.382813f,0.3125f, +0.390625f,0.3125f, +0.398438f,0.3125f, +0.40625f,0.3125f, +0.414063f,0.3125f, +0.421875f,0.3125f, +0.429688f,0.3125f, +0.4375f,0.3125f, +0.445313f,0.3125f, +0.453125f,0.3125f, +0.460938f,0.3125f, +0.46875f,0.3125f, +0.476563f,0.3125f, +0.484375f,0.3125f, +0.492188f,0.3125f, +0.5f,0.3125f, +0.507813f,0.3125f, +0.0f,0.320313f, +0.0078125f,0.320313f, +0.015625f,0.320313f, +0.0234375f,0.320313f, +0.03125f,0.320313f, +0.0390625f,0.320313f, +0.046875f,0.320313f, +0.0546875f,0.320313f, +0.0625f,0.320313f, +0.0703125f,0.320313f, +0.078125f,0.320313f, +0.0859375f,0.320313f, +0.09375f,0.320313f, +0.101563f,0.320313f, +0.109375f,0.320313f, +0.117188f,0.320313f, +0.125f,0.320313f, +0.132813f,0.320313f, +0.140625f,0.320313f, +0.148438f,0.320313f, +0.15625f,0.320313f, +0.164063f,0.320313f, +0.171875f,0.320313f, +0.179688f,0.320313f, +0.1875f,0.320313f, +0.195313f,0.320313f, +0.203125f,0.320313f, +0.210938f,0.320313f, +0.21875f,0.320313f, +0.226563f,0.320313f, +0.234375f,0.320313f, +0.242188f,0.320313f, +0.25f,0.320313f, +0.257813f,0.320313f, +0.265625f,0.320313f, +0.273438f,0.320313f, +0.28125f,0.320313f, +0.289063f,0.320313f, +0.296875f,0.320313f, +0.304688f,0.320313f, +0.3125f,0.320313f, +0.320313f,0.320313f, +0.328125f,0.320313f, +0.335938f,0.320313f, +0.34375f,0.320313f, +0.351563f,0.320313f, +0.359375f,0.320313f, +0.367188f,0.320313f, +0.375f,0.320313f, +0.382813f,0.320313f, +0.390625f,0.320313f, +0.398438f,0.320313f, +0.40625f,0.320313f, +0.414063f,0.320313f, +0.421875f,0.320313f, +0.429688f,0.320313f, +0.4375f,0.320313f, +0.445313f,0.320313f, +0.453125f,0.320313f, +0.460938f,0.320313f, +0.46875f,0.320313f, +0.476563f,0.320313f, +0.484375f,0.320313f, +0.492188f,0.320313f, +0.5f,0.320313f, +0.507813f,0.320313f, +0.0f,0.328125f, +0.0078125f,0.328125f, +0.015625f,0.328125f, +0.0234375f,0.328125f, +0.03125f,0.328125f, +0.0390625f,0.328125f, +0.046875f,0.328125f, +0.0546875f,0.328125f, +0.0625f,0.328125f, +0.0703125f,0.328125f, +0.078125f,0.328125f, +0.0859375f,0.328125f, +0.09375f,0.328125f, +0.101563f,0.328125f, +0.109375f,0.328125f, +0.117188f,0.328125f, +0.125f,0.328125f, +0.132813f,0.328125f, +0.140625f,0.328125f, +0.148438f,0.328125f, +0.15625f,0.328125f, +0.164063f,0.328125f, +0.171875f,0.328125f, +0.179688f,0.328125f, +0.1875f,0.328125f, +0.195313f,0.328125f, +0.203125f,0.328125f, +0.210938f,0.328125f, +0.21875f,0.328125f, +0.226563f,0.328125f, +0.234375f,0.328125f, +0.242188f,0.328125f, +0.25f,0.328125f, +0.257813f,0.328125f, +0.265625f,0.328125f, +0.273438f,0.328125f, +0.28125f,0.328125f, +0.289063f,0.328125f, +0.296875f,0.328125f, +0.304688f,0.328125f, +0.3125f,0.328125f, +0.320313f,0.328125f, +0.328125f,0.328125f, +0.335938f,0.328125f, +0.34375f,0.328125f, +0.351563f,0.328125f, +0.359375f,0.328125f, +0.367188f,0.328125f, +0.375f,0.328125f, +0.382813f,0.328125f, +0.390625f,0.328125f, +0.398438f,0.328125f, +0.40625f,0.328125f, +0.414063f,0.328125f, +0.421875f,0.328125f, +0.429688f,0.328125f, +0.4375f,0.328125f, +0.445313f,0.328125f, +0.453125f,0.328125f, +0.460938f,0.328125f, +0.46875f,0.328125f, +0.476563f,0.328125f, +0.484375f,0.328125f, +0.492188f,0.328125f, +0.5f,0.328125f, +0.507813f,0.328125f, +0.0f,0.335938f, +0.0078125f,0.335938f, +0.015625f,0.335938f, +0.0234375f,0.335938f, +0.03125f,0.335938f, +0.0390625f,0.335938f, +0.046875f,0.335938f, +0.0546875f,0.335938f, +0.0625f,0.335938f, +0.0703125f,0.335938f, +0.078125f,0.335938f, +0.0859375f,0.335938f, +0.09375f,0.335938f, +0.101563f,0.335938f, +0.109375f,0.335938f, +0.117188f,0.335938f, +0.125f,0.335938f, +0.132813f,0.335938f, +0.140625f,0.335938f, +0.148438f,0.335938f, +0.15625f,0.335938f, +0.164063f,0.335938f, +0.171875f,0.335938f, +0.179688f,0.335938f, +0.1875f,0.335938f, +0.195313f,0.335938f, +0.203125f,0.335938f, +0.210938f,0.335938f, +0.21875f,0.335938f, +0.226563f,0.335938f, +0.234375f,0.335938f, +0.242188f,0.335938f, +0.25f,0.335938f, +0.257813f,0.335938f, +0.265625f,0.335938f, +0.273438f,0.335938f, +0.28125f,0.335938f, +0.289063f,0.335938f, +0.296875f,0.335938f, +0.304688f,0.335938f, +0.3125f,0.335938f, +0.320313f,0.335938f, +0.328125f,0.335938f, +0.335938f,0.335938f, +0.34375f,0.335938f, +0.351563f,0.335938f, +0.359375f,0.335938f, +0.367188f,0.335938f, +0.375f,0.335938f, +0.382813f,0.335938f, +0.390625f,0.335938f, +0.398438f,0.335938f, +0.40625f,0.335938f, +0.414063f,0.335938f, +0.421875f,0.335938f, +0.429688f,0.335938f, +0.4375f,0.335938f, +0.445313f,0.335938f, +0.453125f,0.335938f, +0.460938f,0.335938f, +0.46875f,0.335938f, +0.476563f,0.335938f, +0.484375f,0.335938f, +0.492188f,0.335938f, +0.5f,0.335938f, +0.507813f,0.335938f, +0.0f,0.34375f, +0.0078125f,0.34375f, +0.015625f,0.34375f, +0.0234375f,0.34375f, +0.03125f,0.34375f, +0.0390625f,0.34375f, +0.046875f,0.34375f, +0.0546875f,0.34375f, +0.0625f,0.34375f, +0.0703125f,0.34375f, +0.078125f,0.34375f, +0.0859375f,0.34375f, +0.09375f,0.34375f, +0.101563f,0.34375f, +0.109375f,0.34375f, +0.117188f,0.34375f, +0.125f,0.34375f, +0.132813f,0.34375f, +0.140625f,0.34375f, +0.148438f,0.34375f, +0.15625f,0.34375f, +0.164063f,0.34375f, +0.171875f,0.34375f, +0.179688f,0.34375f, +0.1875f,0.34375f, +0.195313f,0.34375f, +0.203125f,0.34375f, +0.210938f,0.34375f, +0.21875f,0.34375f, +0.226563f,0.34375f, +0.234375f,0.34375f, +0.242188f,0.34375f, +0.25f,0.34375f, +0.257813f,0.34375f, +0.265625f,0.34375f, +0.273438f,0.34375f, +0.28125f,0.34375f, +0.289063f,0.34375f, +0.296875f,0.34375f, +0.304688f,0.34375f, +0.3125f,0.34375f, +0.320313f,0.34375f, +0.328125f,0.34375f, +0.335938f,0.34375f, +0.34375f,0.34375f, +0.351563f,0.34375f, +0.359375f,0.34375f, +0.367188f,0.34375f, +0.375f,0.34375f, +0.382813f,0.34375f, +0.390625f,0.34375f, +0.398438f,0.34375f, +0.40625f,0.34375f, +0.414063f,0.34375f, +0.421875f,0.34375f, +0.429688f,0.34375f, +0.4375f,0.34375f, +0.445313f,0.34375f, +0.453125f,0.34375f, +0.460938f,0.34375f, +0.46875f,0.34375f, +0.476563f,0.34375f, +0.484375f,0.34375f, +0.492188f,0.34375f, +0.5f,0.34375f, +0.507813f,0.34375f, +0.0f,0.351563f, +0.0078125f,0.351563f, +0.015625f,0.351563f, +0.0234375f,0.351563f, +0.03125f,0.351563f, +0.0390625f,0.351563f, +0.046875f,0.351563f, +0.0546875f,0.351563f, +0.0625f,0.351563f, +0.0703125f,0.351563f, +0.078125f,0.351563f, +0.0859375f,0.351563f, +0.09375f,0.351563f, +0.101563f,0.351563f, +0.109375f,0.351563f, +0.117188f,0.351563f, +0.125f,0.351563f, +0.132813f,0.351563f, +0.140625f,0.351563f, +0.148438f,0.351563f, +0.15625f,0.351563f, +0.164063f,0.351563f, +0.171875f,0.351563f, +0.179688f,0.351563f, +0.1875f,0.351563f, +0.195313f,0.351563f, +0.203125f,0.351563f, +0.210938f,0.351563f, +0.21875f,0.351563f, +0.226563f,0.351563f, +0.234375f,0.351563f, +0.242188f,0.351563f, +0.25f,0.351563f, +0.257813f,0.351563f, +0.265625f,0.351563f, +0.273438f,0.351563f, +0.28125f,0.351563f, +0.289063f,0.351563f, +0.296875f,0.351563f, +0.304688f,0.351563f, +0.3125f,0.351563f, +0.320313f,0.351563f, +0.328125f,0.351563f, +0.335938f,0.351563f, +0.34375f,0.351563f, +0.351563f,0.351563f, +0.359375f,0.351563f, +0.367188f,0.351563f, +0.375f,0.351563f, +0.382813f,0.351563f, +0.390625f,0.351563f, +0.398438f,0.351563f, +0.40625f,0.351563f, +0.414063f,0.351563f, +0.421875f,0.351563f, +0.429688f,0.351563f, +0.4375f,0.351563f, +0.445313f,0.351563f, +0.453125f,0.351563f, +0.460938f,0.351563f, +0.46875f,0.351563f, +0.476563f,0.351563f, +0.484375f,0.351563f, +0.492188f,0.351563f, +0.5f,0.351563f, +0.507813f,0.351563f, +0.0f,0.359375f, +0.0078125f,0.359375f, +0.015625f,0.359375f, +0.0234375f,0.359375f, +0.03125f,0.359375f, +0.0390625f,0.359375f, +0.046875f,0.359375f, +0.0546875f,0.359375f, +0.0625f,0.359375f, +0.0703125f,0.359375f, +0.078125f,0.359375f, +0.0859375f,0.359375f, +0.09375f,0.359375f, +0.101563f,0.359375f, +0.109375f,0.359375f, +0.117188f,0.359375f, +0.125f,0.359375f, +0.132813f,0.359375f, +0.140625f,0.359375f, +0.148438f,0.359375f, +0.15625f,0.359375f, +0.164063f,0.359375f, +0.171875f,0.359375f, +0.179688f,0.359375f, +0.1875f,0.359375f, +0.195313f,0.359375f, +0.203125f,0.359375f, +0.210938f,0.359375f, +0.21875f,0.359375f, +0.226563f,0.359375f, +0.234375f,0.359375f, +0.242188f,0.359375f, +0.25f,0.359375f, +0.257813f,0.359375f, +0.265625f,0.359375f, +0.273438f,0.359375f, +0.28125f,0.359375f, +0.289063f,0.359375f, +0.296875f,0.359375f, +0.304688f,0.359375f, +0.3125f,0.359375f, +0.320313f,0.359375f, +0.328125f,0.359375f, +0.335938f,0.359375f, +0.34375f,0.359375f, +0.351563f,0.359375f, +0.359375f,0.359375f, +0.367188f,0.359375f, +0.375f,0.359375f, +0.382813f,0.359375f, +0.390625f,0.359375f, +0.398438f,0.359375f, +0.40625f,0.359375f, +0.414063f,0.359375f, +0.421875f,0.359375f, +0.429688f,0.359375f, +0.4375f,0.359375f, +0.445313f,0.359375f, +0.453125f,0.359375f, +0.460938f,0.359375f, +0.46875f,0.359375f, +0.476563f,0.359375f, +0.484375f,0.359375f, +0.492188f,0.359375f, +0.5f,0.359375f, +0.507813f,0.359375f, +0.0f,0.367188f, +0.0078125f,0.367188f, +0.015625f,0.367188f, +0.0234375f,0.367188f, +0.03125f,0.367188f, +0.0390625f,0.367188f, +0.046875f,0.367188f, +0.0546875f,0.367188f, +0.0625f,0.367188f, +0.0703125f,0.367188f, +0.078125f,0.367188f, +0.0859375f,0.367188f, +0.09375f,0.367188f, +0.101563f,0.367188f, +0.109375f,0.367188f, +0.117188f,0.367188f, +0.125f,0.367188f, +0.132813f,0.367188f, +0.140625f,0.367188f, +0.148438f,0.367188f, +0.15625f,0.367188f, +0.164063f,0.367188f, +0.171875f,0.367188f, +0.179688f,0.367188f, +0.1875f,0.367188f, +0.195313f,0.367188f, +0.203125f,0.367188f, +0.210938f,0.367188f, +0.21875f,0.367188f, +0.226563f,0.367188f, +0.234375f,0.367188f, +0.242188f,0.367188f, +0.25f,0.367188f, +0.257813f,0.367188f, +0.265625f,0.367188f, +0.273438f,0.367188f, +0.28125f,0.367188f, +0.289063f,0.367188f, +0.296875f,0.367188f, +0.304688f,0.367188f, +0.3125f,0.367188f, +0.320313f,0.367188f, +0.328125f,0.367188f, +0.335938f,0.367188f, +0.34375f,0.367188f, +0.351563f,0.367188f, +0.359375f,0.367188f, +0.367188f,0.367188f, +0.375f,0.367188f, +0.382813f,0.367188f, +0.390625f,0.367188f, +0.398438f,0.367188f, +0.40625f,0.367188f, +0.414063f,0.367188f, +0.421875f,0.367188f, +0.429688f,0.367188f, +0.4375f,0.367188f, +0.445313f,0.367188f, +0.453125f,0.367188f, +0.460938f,0.367188f, +0.46875f,0.367188f, +0.476563f,0.367188f, +0.484375f,0.367188f, +0.492188f,0.367188f, +0.5f,0.367188f, +0.507813f,0.367188f, +0.0f,0.375f, +0.0078125f,0.375f, +0.015625f,0.375f, +0.0234375f,0.375f, +0.03125f,0.375f, +0.0390625f,0.375f, +0.046875f,0.375f, +0.0546875f,0.375f, +0.0625f,0.375f, +0.0703125f,0.375f, +0.078125f,0.375f, +0.0859375f,0.375f, +0.09375f,0.375f, +0.101563f,0.375f, +0.109375f,0.375f, +0.117188f,0.375f, +0.125f,0.375f, +0.132813f,0.375f, +0.140625f,0.375f, +0.148438f,0.375f, +0.15625f,0.375f, +0.164063f,0.375f, +0.171875f,0.375f, +0.179688f,0.375f, +0.1875f,0.375f, +0.195313f,0.375f, +0.203125f,0.375f, +0.210938f,0.375f, +0.21875f,0.375f, +0.226563f,0.375f, +0.234375f,0.375f, +0.242188f,0.375f, +0.25f,0.375f, +0.257813f,0.375f, +0.265625f,0.375f, +0.273438f,0.375f, +0.28125f,0.375f, +0.289063f,0.375f, +0.296875f,0.375f, +0.304688f,0.375f, +0.3125f,0.375f, +0.320313f,0.375f, +0.328125f,0.375f, +0.335938f,0.375f, +0.34375f,0.375f, +0.351563f,0.375f, +0.359375f,0.375f, +0.367188f,0.375f, +0.375f,0.375f, +0.382813f,0.375f, +0.390625f,0.375f, +0.398438f,0.375f, +0.40625f,0.375f, +0.414063f,0.375f, +0.421875f,0.375f, +0.429688f,0.375f, +0.4375f,0.375f, +0.445313f,0.375f, +0.453125f,0.375f, +0.460938f,0.375f, +0.46875f,0.375f, +0.476563f,0.375f, +0.484375f,0.375f, +0.492188f,0.375f, +0.5f,0.375f, +0.507813f,0.375f, +0.0f,0.382813f, +0.0078125f,0.382813f, +0.015625f,0.382813f, +0.0234375f,0.382813f, +0.03125f,0.382813f, +0.0390625f,0.382813f, +0.046875f,0.382813f, +0.0546875f,0.382813f, +0.0625f,0.382813f, +0.0703125f,0.382813f, +0.078125f,0.382813f, +0.0859375f,0.382813f, +0.09375f,0.382813f, +0.101563f,0.382813f, +0.109375f,0.382813f, +0.117188f,0.382813f, +0.125f,0.382813f, +0.132813f,0.382813f, +0.140625f,0.382813f, +0.148438f,0.382813f, +0.15625f,0.382813f, +0.164063f,0.382813f, +0.171875f,0.382813f, +0.179688f,0.382813f, +0.1875f,0.382813f, +0.195313f,0.382813f, +0.203125f,0.382813f, +0.210938f,0.382813f, +0.21875f,0.382813f, +0.226563f,0.382813f, +0.234375f,0.382813f, +0.242188f,0.382813f, +0.25f,0.382813f, +0.257813f,0.382813f, +0.265625f,0.382813f, +0.273438f,0.382813f, +0.28125f,0.382813f, +0.289063f,0.382813f, +0.296875f,0.382813f, +0.304688f,0.382813f, +0.3125f,0.382813f, +0.320313f,0.382813f, +0.328125f,0.382813f, +0.335938f,0.382813f, +0.34375f,0.382813f, +0.351563f,0.382813f, +0.359375f,0.382813f, +0.367188f,0.382813f, +0.375f,0.382813f, +0.382813f,0.382813f, +0.390625f,0.382813f, +0.398438f,0.382813f, +0.40625f,0.382813f, +0.414063f,0.382813f, +0.421875f,0.382813f, +0.429688f,0.382813f, +0.4375f,0.382813f, +0.445313f,0.382813f, +0.453125f,0.382813f, +0.460938f,0.382813f, +0.46875f,0.382813f, +0.476563f,0.382813f, +0.484375f,0.382813f, +0.492188f,0.382813f, +0.5f,0.382813f, +0.507813f,0.382813f, +0.0f,0.390625f, +0.0078125f,0.390625f, +0.015625f,0.390625f, +0.0234375f,0.390625f, +0.03125f,0.390625f, +0.0390625f,0.390625f, +0.046875f,0.390625f, +0.0546875f,0.390625f, +0.0625f,0.390625f, +0.0703125f,0.390625f, +0.078125f,0.390625f, +0.0859375f,0.390625f, +0.09375f,0.390625f, +0.101563f,0.390625f, +0.109375f,0.390625f, +0.117188f,0.390625f, +0.125f,0.390625f, +0.132813f,0.390625f, +0.140625f,0.390625f, +0.148438f,0.390625f, +0.15625f,0.390625f, +0.164063f,0.390625f, +0.171875f,0.390625f, +0.179688f,0.390625f, +0.1875f,0.390625f, +0.195313f,0.390625f, +0.203125f,0.390625f, +0.210938f,0.390625f, +0.21875f,0.390625f, +0.226563f,0.390625f, +0.234375f,0.390625f, +0.242188f,0.390625f, +0.25f,0.390625f, +0.257813f,0.390625f, +0.265625f,0.390625f, +0.273438f,0.390625f, +0.28125f,0.390625f, +0.289063f,0.390625f, +0.296875f,0.390625f, +0.304688f,0.390625f, +0.3125f,0.390625f, +0.320313f,0.390625f, +0.328125f,0.390625f, +0.335938f,0.390625f, +0.34375f,0.390625f, +0.351563f,0.390625f, +0.359375f,0.390625f, +0.367188f,0.390625f, +0.375f,0.390625f, +0.382813f,0.390625f, +0.390625f,0.390625f, +0.398438f,0.390625f, +0.40625f,0.390625f, +0.414063f,0.390625f, +0.421875f,0.390625f, +0.429688f,0.390625f, +0.4375f,0.390625f, +0.445313f,0.390625f, +0.453125f,0.390625f, +0.460938f,0.390625f, +0.46875f,0.390625f, +0.476563f,0.390625f, +0.484375f,0.390625f, +0.492188f,0.390625f, +0.5f,0.390625f, +0.507813f,0.390625f, +0.0f,0.398438f, +0.0078125f,0.398438f, +0.015625f,0.398438f, +0.0234375f,0.398438f, +0.03125f,0.398438f, +0.0390625f,0.398438f, +0.046875f,0.398438f, +0.0546875f,0.398438f, +0.0625f,0.398438f, +0.0703125f,0.398438f, +0.078125f,0.398438f, +0.0859375f,0.398438f, +0.09375f,0.398438f, +0.101563f,0.398438f, +0.109375f,0.398438f, +0.117188f,0.398438f, +0.125f,0.398438f, +0.132813f,0.398438f, +0.140625f,0.398438f, +0.148438f,0.398438f, +0.15625f,0.398438f, +0.164063f,0.398438f, +0.171875f,0.398438f, +0.179688f,0.398438f, +0.1875f,0.398438f, +0.195313f,0.398438f, +0.203125f,0.398438f, +0.210938f,0.398438f, +0.21875f,0.398438f, +0.226563f,0.398438f, +0.234375f,0.398438f, +0.242188f,0.398438f, +0.25f,0.398438f, +0.257813f,0.398438f, +0.265625f,0.398438f, +0.273438f,0.398438f, +0.28125f,0.398438f, +0.289063f,0.398438f, +0.296875f,0.398438f, +0.304688f,0.398438f, +0.3125f,0.398438f, +0.320313f,0.398438f, +0.328125f,0.398438f, +0.335938f,0.398438f, +0.34375f,0.398438f, +0.351563f,0.398438f, +0.359375f,0.398438f, +0.367188f,0.398438f, +0.375f,0.398438f, +0.382813f,0.398438f, +0.390625f,0.398438f, +0.398438f,0.398438f, +0.40625f,0.398438f, +0.414063f,0.398438f, +0.421875f,0.398438f, +0.429688f,0.398438f, +0.4375f,0.398438f, +0.445313f,0.398438f, +0.453125f,0.398438f, +0.460938f,0.398438f, +0.46875f,0.398438f, +0.476563f,0.398438f, +0.484375f,0.398438f, +0.492188f,0.398438f, +0.5f,0.398438f, +0.507813f,0.398438f, +0.0f,0.40625f, +0.0078125f,0.40625f, +0.015625f,0.40625f, +0.0234375f,0.40625f, +0.03125f,0.40625f, +0.0390625f,0.40625f, +0.046875f,0.40625f, +0.0546875f,0.40625f, +0.0625f,0.40625f, +0.0703125f,0.40625f, +0.078125f,0.40625f, +0.0859375f,0.40625f, +0.09375f,0.40625f, +0.101563f,0.40625f, +0.109375f,0.40625f, +0.117188f,0.40625f, +0.125f,0.40625f, +0.132813f,0.40625f, +0.140625f,0.40625f, +0.148438f,0.40625f, +0.15625f,0.40625f, +0.164063f,0.40625f, +0.171875f,0.40625f, +0.179688f,0.40625f, +0.1875f,0.40625f, +0.195313f,0.40625f, +0.203125f,0.40625f, +0.210938f,0.40625f, +0.21875f,0.40625f, +0.226563f,0.40625f, +0.234375f,0.40625f, +0.242188f,0.40625f, +0.25f,0.40625f, +0.257813f,0.40625f, +0.265625f,0.40625f, +0.273438f,0.40625f, +0.28125f,0.40625f, +0.289063f,0.40625f, +0.296875f,0.40625f, +0.304688f,0.40625f, +0.3125f,0.40625f, +0.320313f,0.40625f, +0.328125f,0.40625f, +0.335938f,0.40625f, +0.34375f,0.40625f, +0.351563f,0.40625f, +0.359375f,0.40625f, +0.367188f,0.40625f, +0.375f,0.40625f, +0.382813f,0.40625f, +0.390625f,0.40625f, +0.398438f,0.40625f, +0.40625f,0.40625f, +0.414063f,0.40625f, +0.421875f,0.40625f, +0.429688f,0.40625f, +0.4375f,0.40625f, +0.445313f,0.40625f, +0.453125f,0.40625f, +0.460938f,0.40625f, +0.46875f,0.40625f, +0.476563f,0.40625f, +0.484375f,0.40625f, +0.492188f,0.40625f, +0.5f,0.40625f, +0.507813f,0.40625f, +0.0f,0.414063f, +0.0078125f,0.414063f, +0.015625f,0.414063f, +0.0234375f,0.414063f, +0.03125f,0.414063f, +0.0390625f,0.414063f, +0.046875f,0.414063f, +0.0546875f,0.414063f, +0.0625f,0.414063f, +0.0703125f,0.414063f, +0.078125f,0.414063f, +0.0859375f,0.414063f, +0.09375f,0.414063f, +0.101563f,0.414063f, +0.109375f,0.414063f, +0.117188f,0.414063f, +0.125f,0.414063f, +0.132813f,0.414063f, +0.140625f,0.414063f, +0.148438f,0.414063f, +0.15625f,0.414063f, +0.164063f,0.414063f, +0.171875f,0.414063f, +0.179688f,0.414063f, +0.1875f,0.414063f, +0.195313f,0.414063f, +0.203125f,0.414063f, +0.210938f,0.414063f, +0.21875f,0.414063f, +0.226563f,0.414063f, +0.234375f,0.414063f, +0.242188f,0.414063f, +0.25f,0.414063f, +0.257813f,0.414063f, +0.265625f,0.414063f, +0.273438f,0.414063f, +0.28125f,0.414063f, +0.289063f,0.414063f, +0.296875f,0.414063f, +0.304688f,0.414063f, +0.3125f,0.414063f, +0.320313f,0.414063f, +0.328125f,0.414063f, +0.335938f,0.414063f, +0.34375f,0.414063f, +0.351563f,0.414063f, +0.359375f,0.414063f, +0.367188f,0.414063f, +0.375f,0.414063f, +0.382813f,0.414063f, +0.390625f,0.414063f, +0.398438f,0.414063f, +0.40625f,0.414063f, +0.414063f,0.414063f, +0.421875f,0.414063f, +0.429688f,0.414063f, +0.4375f,0.414063f, +0.445313f,0.414063f, +0.453125f,0.414063f, +0.460938f,0.414063f, +0.46875f,0.414063f, +0.476563f,0.414063f, +0.484375f,0.414063f, +0.492188f,0.414063f, +0.5f,0.414063f, +0.507813f,0.414063f, +0.0f,0.421875f, +0.0078125f,0.421875f, +0.015625f,0.421875f, +0.0234375f,0.421875f, +0.03125f,0.421875f, +0.0390625f,0.421875f, +0.046875f,0.421875f, +0.0546875f,0.421875f, +0.0625f,0.421875f, +0.0703125f,0.421875f, +0.078125f,0.421875f, +0.0859375f,0.421875f, +0.09375f,0.421875f, +0.101563f,0.421875f, +0.109375f,0.421875f, +0.117188f,0.421875f, +0.125f,0.421875f, +0.132813f,0.421875f, +0.140625f,0.421875f, +0.148438f,0.421875f, +0.15625f,0.421875f, +0.164063f,0.421875f, +0.171875f,0.421875f, +0.179688f,0.421875f, +0.1875f,0.421875f, +0.195313f,0.421875f, +0.203125f,0.421875f, +0.210938f,0.421875f, +0.21875f,0.421875f, +0.226563f,0.421875f, +0.234375f,0.421875f, +0.242188f,0.421875f, +0.25f,0.421875f, +0.257813f,0.421875f, +0.265625f,0.421875f, +0.273438f,0.421875f, +0.28125f,0.421875f, +0.289063f,0.421875f, +0.296875f,0.421875f, +0.304688f,0.421875f, +0.3125f,0.421875f, +0.320313f,0.421875f, +0.328125f,0.421875f, +0.335938f,0.421875f, +0.34375f,0.421875f, +0.351563f,0.421875f, +0.359375f,0.421875f, +0.367188f,0.421875f, +0.375f,0.421875f, +0.382813f,0.421875f, +0.390625f,0.421875f, +0.398438f,0.421875f, +0.40625f,0.421875f, +0.414063f,0.421875f, +0.421875f,0.421875f, +0.429688f,0.421875f, +0.4375f,0.421875f, +0.445313f,0.421875f, +0.453125f,0.421875f, +0.460938f,0.421875f, +0.46875f,0.421875f, +0.476563f,0.421875f, +0.484375f,0.421875f, +0.492188f,0.421875f, +0.5f,0.421875f, +0.507813f,0.421875f, +0.0f,0.429688f, +0.0078125f,0.429688f, +0.015625f,0.429688f, +0.0234375f,0.429688f, +0.03125f,0.429688f, +0.0390625f,0.429688f, +0.046875f,0.429688f, +0.0546875f,0.429688f, +0.0625f,0.429688f, +0.0703125f,0.429688f, +0.078125f,0.429688f, +0.0859375f,0.429688f, +0.09375f,0.429688f, +0.101563f,0.429688f, +0.109375f,0.429688f, +0.117188f,0.429688f, +0.125f,0.429688f, +0.132813f,0.429688f, +0.140625f,0.429688f, +0.148438f,0.429688f, +0.15625f,0.429688f, +0.164063f,0.429688f, +0.171875f,0.429688f, +0.179688f,0.429688f, +0.1875f,0.429688f, +0.195313f,0.429688f, +0.203125f,0.429688f, +0.210938f,0.429688f, +0.21875f,0.429688f, +0.226563f,0.429688f, +0.234375f,0.429688f, +0.242188f,0.429688f, +0.25f,0.429688f, +0.257813f,0.429688f, +0.265625f,0.429688f, +0.273438f,0.429688f, +0.28125f,0.429688f, +0.289063f,0.429688f, +0.296875f,0.429688f, +0.304688f,0.429688f, +0.3125f,0.429688f, +0.320313f,0.429688f, +0.328125f,0.429688f, +0.335938f,0.429688f, +0.34375f,0.429688f, +0.351563f,0.429688f, +0.359375f,0.429688f, +0.367188f,0.429688f, +0.375f,0.429688f, +0.382813f,0.429688f, +0.390625f,0.429688f, +0.398438f,0.429688f, +0.40625f,0.429688f, +0.414063f,0.429688f, +0.421875f,0.429688f, +0.429688f,0.429688f, +0.4375f,0.429688f, +0.445313f,0.429688f, +0.453125f,0.429688f, +0.460938f,0.429688f, +0.46875f,0.429688f, +0.476563f,0.429688f, +0.484375f,0.429688f, +0.492188f,0.429688f, +0.5f,0.429688f, +0.507813f,0.429688f, +0.0f,0.4375f, +0.0078125f,0.4375f, +0.015625f,0.4375f, +0.0234375f,0.4375f, +0.03125f,0.4375f, +0.0390625f,0.4375f, +0.046875f,0.4375f, +0.0546875f,0.4375f, +0.0625f,0.4375f, +0.0703125f,0.4375f, +0.078125f,0.4375f, +0.0859375f,0.4375f, +0.09375f,0.4375f, +0.101563f,0.4375f, +0.109375f,0.4375f, +0.117188f,0.4375f, +0.125f,0.4375f, +0.132813f,0.4375f, +0.140625f,0.4375f, +0.148438f,0.4375f, +0.15625f,0.4375f, +0.164063f,0.4375f, +0.171875f,0.4375f, +0.179688f,0.4375f, +0.1875f,0.4375f, +0.195313f,0.4375f, +0.203125f,0.4375f, +0.210938f,0.4375f, +0.21875f,0.4375f, +0.226563f,0.4375f, +0.234375f,0.4375f, +0.242188f,0.4375f, +0.25f,0.4375f, +0.257813f,0.4375f, +0.265625f,0.4375f, +0.273438f,0.4375f, +0.28125f,0.4375f, +0.289063f,0.4375f, +0.296875f,0.4375f, +0.304688f,0.4375f, +0.3125f,0.4375f, +0.320313f,0.4375f, +0.328125f,0.4375f, +0.335938f,0.4375f, +0.34375f,0.4375f, +0.351563f,0.4375f, +0.359375f,0.4375f, +0.367188f,0.4375f, +0.375f,0.4375f, +0.382813f,0.4375f, +0.390625f,0.4375f, +0.398438f,0.4375f, +0.40625f,0.4375f, +0.414063f,0.4375f, +0.421875f,0.4375f, +0.429688f,0.4375f, +0.4375f,0.4375f, +0.445313f,0.4375f, +0.453125f,0.4375f, +0.460938f,0.4375f, +0.46875f,0.4375f, +0.476563f,0.4375f, +0.484375f,0.4375f, +0.492188f,0.4375f, +0.5f,0.4375f, +0.507813f,0.4375f, +0.0f,0.445313f, +0.0078125f,0.445313f, +0.015625f,0.445313f, +0.0234375f,0.445313f, +0.03125f,0.445313f, +0.0390625f,0.445313f, +0.046875f,0.445313f, +0.0546875f,0.445313f, +0.0625f,0.445313f, +0.0703125f,0.445313f, +0.078125f,0.445313f, +0.0859375f,0.445313f, +0.09375f,0.445313f, +0.101563f,0.445313f, +0.109375f,0.445313f, +0.117188f,0.445313f, +0.125f,0.445313f, +0.132813f,0.445313f, +0.140625f,0.445313f, +0.148438f,0.445313f, +0.15625f,0.445313f, +0.164063f,0.445313f, +0.171875f,0.445313f, +0.179688f,0.445313f, +0.1875f,0.445313f, +0.195313f,0.445313f, +0.203125f,0.445313f, +0.210938f,0.445313f, +0.21875f,0.445313f, +0.226563f,0.445313f, +0.234375f,0.445313f, +0.242188f,0.445313f, +0.25f,0.445313f, +0.257813f,0.445313f, +0.265625f,0.445313f, +0.273438f,0.445313f, +0.28125f,0.445313f, +0.289063f,0.445313f, +0.296875f,0.445313f, +0.304688f,0.445313f, +0.3125f,0.445313f, +0.320313f,0.445313f, +0.328125f,0.445313f, +0.335938f,0.445313f, +0.34375f,0.445313f, +0.351563f,0.445313f, +0.359375f,0.445313f, +0.367188f,0.445313f, +0.375f,0.445313f, +0.382813f,0.445313f, +0.390625f,0.445313f, +0.398438f,0.445313f, +0.40625f,0.445313f, +0.414063f,0.445313f, +0.421875f,0.445313f, +0.429688f,0.445313f, +0.4375f,0.445313f, +0.445313f,0.445313f, +0.453125f,0.445313f, +0.460938f,0.445313f, +0.46875f,0.445313f, +0.476563f,0.445313f, +0.484375f,0.445313f, +0.492188f,0.445313f, +0.5f,0.445313f, +0.507813f,0.445313f, +0.0f,0.453125f, +0.0078125f,0.453125f, +0.015625f,0.453125f, +0.0234375f,0.453125f, +0.03125f,0.453125f, +0.0390625f,0.453125f, +0.046875f,0.453125f, +0.0546875f,0.453125f, +0.0625f,0.453125f, +0.0703125f,0.453125f, +0.078125f,0.453125f, +0.0859375f,0.453125f, +0.09375f,0.453125f, +0.101563f,0.453125f, +0.109375f,0.453125f, +0.117188f,0.453125f, +0.125f,0.453125f, +0.132813f,0.453125f, +0.140625f,0.453125f, +0.148438f,0.453125f, +0.15625f,0.453125f, +0.164063f,0.453125f, +0.171875f,0.453125f, +0.179688f,0.453125f, +0.1875f,0.453125f, +0.195313f,0.453125f, +0.203125f,0.453125f, +0.210938f,0.453125f, +0.21875f,0.453125f, +0.226563f,0.453125f, +0.234375f,0.453125f, +0.242188f,0.453125f, +0.25f,0.453125f, +0.257813f,0.453125f, +0.265625f,0.453125f, +0.273438f,0.453125f, +0.28125f,0.453125f, +0.289063f,0.453125f, +0.296875f,0.453125f, +0.304688f,0.453125f, +0.3125f,0.453125f, +0.320313f,0.453125f, +0.328125f,0.453125f, +0.335938f,0.453125f, +0.34375f,0.453125f, +0.351563f,0.453125f, +0.359375f,0.453125f, +0.367188f,0.453125f, +0.375f,0.453125f, +0.382813f,0.453125f, +0.390625f,0.453125f, +0.398438f,0.453125f, +0.40625f,0.453125f, +0.414063f,0.453125f, +0.421875f,0.453125f, +0.429688f,0.453125f, +0.4375f,0.453125f, +0.445313f,0.453125f, +0.453125f,0.453125f, +0.460938f,0.453125f, +0.46875f,0.453125f, +0.476563f,0.453125f, +0.484375f,0.453125f, +0.492188f,0.453125f, +0.5f,0.453125f, +0.507813f,0.453125f, +0.0f,0.460938f, +0.0078125f,0.460938f, +0.015625f,0.460938f, +0.0234375f,0.460938f, +0.03125f,0.460938f, +0.0390625f,0.460938f, +0.046875f,0.460938f, +0.0546875f,0.460938f, +0.0625f,0.460938f, +0.0703125f,0.460938f, +0.078125f,0.460938f, +0.0859375f,0.460938f, +0.09375f,0.460938f, +0.101563f,0.460938f, +0.109375f,0.460938f, +0.117188f,0.460938f, +0.125f,0.460938f, +0.132813f,0.460938f, +0.140625f,0.460938f, +0.148438f,0.460938f, +0.15625f,0.460938f, +0.164063f,0.460938f, +0.171875f,0.460938f, +0.179688f,0.460938f, +0.1875f,0.460938f, +0.195313f,0.460938f, +0.203125f,0.460938f, +0.210938f,0.460938f, +0.21875f,0.460938f, +0.226563f,0.460938f, +0.234375f,0.460938f, +0.242188f,0.460938f, +0.25f,0.460938f, +0.257813f,0.460938f, +0.265625f,0.460938f, +0.273438f,0.460938f, +0.28125f,0.460938f, +0.289063f,0.460938f, +0.296875f,0.460938f, +0.304688f,0.460938f, +0.3125f,0.460938f, +0.320313f,0.460938f, +0.328125f,0.460938f, +0.335938f,0.460938f, +0.34375f,0.460938f, +0.351563f,0.460938f, +0.359375f,0.460938f, +0.367188f,0.460938f, +0.375f,0.460938f, +0.382813f,0.460938f, +0.390625f,0.460938f, +0.398438f,0.460938f, +0.40625f,0.460938f, +0.414063f,0.460938f, +0.421875f,0.460938f, +0.429688f,0.460938f, +0.4375f,0.460938f, +0.445313f,0.460938f, +0.453125f,0.460938f, +0.460938f,0.460938f, +0.46875f,0.460938f, +0.476563f,0.460938f, +0.484375f,0.460938f, +0.492188f,0.460938f, +0.5f,0.460938f, +0.507813f,0.460938f, +0.0f,0.46875f, +0.0078125f,0.46875f, +0.015625f,0.46875f, +0.0234375f,0.46875f, +0.03125f,0.46875f, +0.0390625f,0.46875f, +0.046875f,0.46875f, +0.0546875f,0.46875f, +0.0625f,0.46875f, +0.0703125f,0.46875f, +0.078125f,0.46875f, +0.0859375f,0.46875f, +0.09375f,0.46875f, +0.101563f,0.46875f, +0.109375f,0.46875f, +0.117188f,0.46875f, +0.125f,0.46875f, +0.132813f,0.46875f, +0.140625f,0.46875f, +0.148438f,0.46875f, +0.15625f,0.46875f, +0.164063f,0.46875f, +0.171875f,0.46875f, +0.179688f,0.46875f, +0.1875f,0.46875f, +0.195313f,0.46875f, +0.203125f,0.46875f, +0.210938f,0.46875f, +0.21875f,0.46875f, +0.226563f,0.46875f, +0.234375f,0.46875f, +0.242188f,0.46875f, +0.25f,0.46875f, +0.257813f,0.46875f, +0.265625f,0.46875f, +0.273438f,0.46875f, +0.28125f,0.46875f, +0.289063f,0.46875f, +0.296875f,0.46875f, +0.304688f,0.46875f, +0.3125f,0.46875f, +0.320313f,0.46875f, +0.328125f,0.46875f, +0.335938f,0.46875f, +0.34375f,0.46875f, +0.351563f,0.46875f, +0.359375f,0.46875f, +0.367188f,0.46875f, +0.375f,0.46875f, +0.382813f,0.46875f, +0.390625f,0.46875f, +0.398438f,0.46875f, +0.40625f,0.46875f, +0.414063f,0.46875f, +0.421875f,0.46875f, +0.429688f,0.46875f, +0.4375f,0.46875f, +0.445313f,0.46875f, +0.453125f,0.46875f, +0.460938f,0.46875f, +0.46875f,0.46875f, +0.476563f,0.46875f, +0.484375f,0.46875f, +0.492188f,0.46875f, +0.5f,0.46875f, +0.507813f,0.46875f, +0.0f,0.476563f, +0.0078125f,0.476563f, +0.015625f,0.476563f, +0.0234375f,0.476563f, +0.03125f,0.476563f, +0.0390625f,0.476563f, +0.046875f,0.476563f, +0.0546875f,0.476563f, +0.0625f,0.476563f, +0.0703125f,0.476563f, +0.078125f,0.476563f, +0.0859375f,0.476563f, +0.09375f,0.476563f, +0.101563f,0.476563f, +0.109375f,0.476563f, +0.117188f,0.476563f, +0.125f,0.476563f, +0.132813f,0.476563f, +0.140625f,0.476563f, +0.148438f,0.476563f, +0.15625f,0.476563f, +0.164063f,0.476563f, +0.171875f,0.476563f, +0.179688f,0.476563f, +0.1875f,0.476563f, +0.195313f,0.476563f, +0.203125f,0.476563f, +0.210938f,0.476563f, +0.21875f,0.476563f, +0.226563f,0.476563f, +0.234375f,0.476563f, +0.242188f,0.476563f, +0.25f,0.476563f, +0.257813f,0.476563f, +0.265625f,0.476563f, +0.273438f,0.476563f, +0.28125f,0.476563f, +0.289063f,0.476563f, +0.296875f,0.476563f, +0.304688f,0.476563f, +0.3125f,0.476563f, +0.320313f,0.476563f, +0.328125f,0.476563f, +0.335938f,0.476563f, +0.34375f,0.476563f, +0.351563f,0.476563f, +0.359375f,0.476563f, +0.367188f,0.476563f, +0.375f,0.476563f, +0.382813f,0.476563f, +0.390625f,0.476563f, +0.398438f,0.476563f, +0.40625f,0.476563f, +0.414063f,0.476563f, +0.421875f,0.476563f, +0.429688f,0.476563f, +0.4375f,0.476563f, +0.445313f,0.476563f, +0.453125f,0.476563f, +0.460938f,0.476563f, +0.46875f,0.476563f, +0.476563f,0.476563f, +0.484375f,0.476563f, +0.492188f,0.476563f, +0.5f,0.476563f, +0.507813f,0.476563f, +0.0f,0.484375f, +0.0078125f,0.484375f, +0.015625f,0.484375f, +0.0234375f,0.484375f, +0.03125f,0.484375f, +0.0390625f,0.484375f, +0.046875f,0.484375f, +0.0546875f,0.484375f, +0.0625f,0.484375f, +0.0703125f,0.484375f, +0.078125f,0.484375f, +0.0859375f,0.484375f, +0.09375f,0.484375f, +0.101563f,0.484375f, +0.109375f,0.484375f, +0.117188f,0.484375f, +0.125f,0.484375f, +0.132813f,0.484375f, +0.140625f,0.484375f, +0.148438f,0.484375f, +0.15625f,0.484375f, +0.164063f,0.484375f, +0.171875f,0.484375f, +0.179688f,0.484375f, +0.1875f,0.484375f, +0.195313f,0.484375f, +0.203125f,0.484375f, +0.210938f,0.484375f, +0.21875f,0.484375f, +0.226563f,0.484375f, +0.234375f,0.484375f, +0.242188f,0.484375f, +0.25f,0.484375f, +0.257813f,0.484375f, +0.265625f,0.484375f, +0.273438f,0.484375f, +0.28125f,0.484375f, +0.289063f,0.484375f, +0.296875f,0.484375f, +0.304688f,0.484375f, +0.3125f,0.484375f, +0.320313f,0.484375f, +0.328125f,0.484375f, +0.335938f,0.484375f, +0.34375f,0.484375f, +0.351563f,0.484375f, +0.359375f,0.484375f, +0.367188f,0.484375f, +0.375f,0.484375f, +0.382813f,0.484375f, +0.390625f,0.484375f, +0.398438f,0.484375f, +0.40625f,0.484375f, +0.414063f,0.484375f, +0.421875f,0.484375f, +0.429688f,0.484375f, +0.4375f,0.484375f, +0.445313f,0.484375f, +0.453125f,0.484375f, +0.460938f,0.484375f, +0.46875f,0.484375f, +0.476563f,0.484375f, +0.484375f,0.484375f, +0.492188f,0.484375f, +0.5f,0.484375f, +0.507813f,0.484375f, +0.0f,0.492188f, +0.0078125f,0.492188f, +0.015625f,0.492188f, +0.0234375f,0.492188f, +0.03125f,0.492188f, +0.0390625f,0.492188f, +0.046875f,0.492188f, +0.0546875f,0.492188f, +0.0625f,0.492188f, +0.0703125f,0.492188f, +0.078125f,0.492188f, +0.0859375f,0.492188f, +0.09375f,0.492188f, +0.101563f,0.492188f, +0.109375f,0.492188f, +0.117188f,0.492188f, +0.125f,0.492188f, +0.132813f,0.492188f, +0.140625f,0.492188f, +0.148438f,0.492188f, +0.15625f,0.492188f, +0.164063f,0.492188f, +0.171875f,0.492188f, +0.179688f,0.492188f, +0.1875f,0.492188f, +0.195313f,0.492188f, +0.203125f,0.492188f, +0.210938f,0.492188f, +0.21875f,0.492188f, +0.226563f,0.492188f, +0.234375f,0.492188f, +0.242188f,0.492188f, +0.25f,0.492188f, +0.257813f,0.492188f, +0.265625f,0.492188f, +0.273438f,0.492188f, +0.28125f,0.492188f, +0.289063f,0.492188f, +0.296875f,0.492188f, +0.304688f,0.492188f, +0.3125f,0.492188f, +0.320313f,0.492188f, +0.328125f,0.492188f, +0.335938f,0.492188f, +0.34375f,0.492188f, +0.351563f,0.492188f, +0.359375f,0.492188f, +0.367188f,0.492188f, +0.375f,0.492188f, +0.382813f,0.492188f, +0.390625f,0.492188f, +0.398438f,0.492188f, +0.40625f,0.492188f, +0.414063f,0.492188f, +0.421875f,0.492188f, +0.429688f,0.492188f, +0.4375f,0.492188f, +0.445313f,0.492188f, +0.453125f,0.492188f, +0.460938f,0.492188f, +0.46875f,0.492188f, +0.476563f,0.492188f, +0.484375f,0.492188f, +0.492188f,0.492188f, +0.5f,0.492188f, +0.507813f,0.492188f, +}; + +unsigned short Landscape02Idx[] = { +0,1,2, +3,2,1, +2,3,4, +5,4,3, +4,5,6, +7,6,5, +6,7,8, +9,8,7, +8,9,10, +11,10,9, +10,11,12, +13,12,11, +12,13,14, +15,14,13, +14,15,16, +17,16,15, +16,17,18, +19,18,17, +18,19,20, +21,20,19, +20,21,22, +23,22,21, +22,23,24, +25,24,23, +24,25,26, +27,26,25, +26,27,28, +29,28,27, +28,29,30, +31,30,29, +30,31,32, +33,32,31, +32,33,34, +35,34,33, +34,35,36, +37,36,35, +36,37,38, +39,38,37, +38,39,40, +41,40,39, +40,41,42, +43,42,41, +42,43,44, +45,44,43, +44,45,46, +47,46,45, +46,47,48, +49,48,47, +48,49,50, +51,50,49, +50,51,52, +53,52,51, +52,53,54, +55,54,53, +54,55,56, +57,56,55, +56,57,58, +59,58,57, +58,59,60, +61,60,59, +60,61,62, +63,62,61, +62,63,64, +65,64,63, +64,65,66, +67,66,65, +66,67,68, +69,68,67, +68,69,70, +71,70,69, +70,71,72, +73,72,71, +72,73,74, +75,74,73, +74,75,76, +77,76,75, +76,77,78, +79,78,77, +78,79,80, +81,80,79, +80,81,82, +83,82,81, +82,83,84, +85,84,83, +84,85,86, +87,86,85, +86,87,88, +89,88,87, +88,89,90, +91,90,89, +90,91,92, +93,92,91, +92,93,94, +95,94,93, +94,95,96, +97,96,95, +96,97,98, +99,98,97, +98,99,100, +101,100,99, +100,101,102, +103,102,101, +102,103,104, +105,104,103, +104,105,106, +107,106,105, +106,107,108, +109,108,107, +108,109,110, +111,110,109, +110,111,112, +113,112,111, +112,113,114, +115,114,113, +114,115,116, +117,116,115, +116,117,118, +119,118,117, +118,119,120, +121,120,119, +120,121,122, +123,122,121, +122,123,124, +125,124,123, +124,125,126, +127,126,125, +126,127,128, +129,128,127, +128,129,130, +131,130,129, +132,0,133, +2,133,0, +133,2,134, +4,134,2, +134,4,135, +6,135,4, +135,6,136, +8,136,6, +136,8,137, +10,137,8, +137,10,138, +12,138,10, +138,12,139, +14,139,12, +139,14,140, +16,140,14, +140,16,141, +18,141,16, +141,18,142, +20,142,18, +142,20,143, +22,143,20, +143,22,144, +24,144,22, +144,24,145, +26,145,24, +145,26,146, +28,146,26, +146,28,147, +30,147,28, +147,30,148, +32,148,30, +148,32,149, +34,149,32, +149,34,150, +36,150,34, +150,36,151, +38,151,36, +151,38,152, +40,152,38, +152,40,153, +42,153,40, +153,42,154, +44,154,42, +154,44,155, +46,155,44, +155,46,156, +48,156,46, +156,48,157, +50,157,48, +157,50,158, +52,158,50, +158,52,159, +54,159,52, +159,54,160, +56,160,54, +160,56,161, +58,161,56, +161,58,162, +60,162,58, +162,60,163, +62,163,60, +163,62,164, +64,164,62, +164,64,165, +66,165,64, +165,66,166, +68,166,66, +166,68,167, +70,167,68, +167,70,168, +72,168,70, +168,72,169, +74,169,72, +169,74,170, +76,170,74, +170,76,171, +78,171,76, +171,78,172, +80,172,78, +172,80,173, +82,173,80, +173,82,174, +84,174,82, +174,84,175, +86,175,84, +175,86,176, +88,176,86, +176,88,177, +90,177,88, +177,90,178, +92,178,90, +178,92,179, +94,179,92, +179,94,180, +96,180,94, +180,96,181, +98,181,96, +181,98,182, +100,182,98, +182,100,183, +102,183,100, +183,102,184, +104,184,102, +184,104,185, +106,185,104, +185,106,186, +108,186,106, +186,108,187, +110,187,108, +187,110,188, +112,188,110, +188,112,189, +114,189,112, +189,114,190, +116,190,114, +190,116,191, +118,191,116, +191,118,192, +120,192,118, +192,120,193, +122,193,120, +193,122,194, +124,194,122, +194,124,195, +126,195,124, +195,126,196, +128,196,126, +196,128,197, +130,197,128, +198,132,199, +133,199,132, +199,133,200, +134,200,133, +200,134,201, +135,201,134, +201,135,202, +136,202,135, +202,136,203, +137,203,136, +203,137,204, +138,204,137, +204,138,205, +139,205,138, +205,139,206, +140,206,139, +206,140,207, +141,207,140, +207,141,208, +142,208,141, +208,142,209, +143,209,142, +209,143,210, +144,210,143, +210,144,211, +145,211,144, +211,145,212, +146,212,145, +212,146,213, +147,213,146, +213,147,214, +148,214,147, +214,148,215, +149,215,148, +215,149,216, +150,216,149, +216,150,217, +151,217,150, +217,151,218, +152,218,151, +218,152,219, +153,219,152, +219,153,220, +154,220,153, +220,154,221, +155,221,154, +221,155,222, +156,222,155, +222,156,223, +157,223,156, +223,157,224, +158,224,157, +224,158,225, +159,225,158, +225,159,226, +160,226,159, +226,160,227, +161,227,160, +227,161,228, +162,228,161, +228,162,229, +163,229,162, +229,163,230, +164,230,163, +230,164,231, +165,231,164, +231,165,232, +166,232,165, +232,166,233, +167,233,166, +233,167,234, +168,234,167, +234,168,235, +169,235,168, +235,169,236, +170,236,169, +236,170,237, +171,237,170, +237,171,238, +172,238,171, +238,172,239, +173,239,172, +239,173,240, +174,240,173, +240,174,241, +175,241,174, +241,175,242, +176,242,175, +242,176,243, +177,243,176, +243,177,244, +178,244,177, +244,178,245, +179,245,178, +245,179,246, +180,246,179, +246,180,247, +181,247,180, +247,181,248, +182,248,181, +248,182,249, +183,249,182, +249,183,250, +184,250,183, +250,184,251, +185,251,184, +251,185,252, +186,252,185, +252,186,253, +187,253,186, +253,187,254, +188,254,187, +254,188,255, +189,255,188, +255,189,256, +190,256,189, +256,190,257, +191,257,190, +257,191,258, +192,258,191, +258,192,259, +193,259,192, +259,193,260, +194,260,193, +260,194,261, +195,261,194, +261,195,262, +196,262,195, +262,196,263, +197,263,196, +264,198,265, +199,265,198, +265,199,266, +200,266,199, +266,200,267, +201,267,200, +267,201,268, +202,268,201, +268,202,269, +203,269,202, +269,203,270, +204,270,203, +270,204,271, +205,271,204, +271,205,272, +206,272,205, +272,206,273, +207,273,206, +273,207,274, +208,274,207, +274,208,275, +209,275,208, +275,209,276, +210,276,209, +276,210,277, +211,277,210, +277,211,278, +212,278,211, +278,212,279, +213,279,212, +279,213,280, +214,280,213, +280,214,281, +215,281,214, +281,215,282, +216,282,215, +282,216,283, +217,283,216, +283,217,284, +218,284,217, +284,218,285, +219,285,218, +285,219,286, +220,286,219, +286,220,287, +221,287,220, +287,221,288, +222,288,221, +288,222,289, +223,289,222, +289,223,290, +224,290,223, +290,224,291, +225,291,224, +291,225,292, +226,292,225, +292,226,293, +227,293,226, +293,227,294, +228,294,227, +294,228,295, +229,295,228, +295,229,296, +230,296,229, +296,230,297, +231,297,230, +297,231,298, +232,298,231, +298,232,299, +233,299,232, +299,233,300, +234,300,233, +300,234,301, +235,301,234, +301,235,302, +236,302,235, +302,236,303, +237,303,236, +303,237,304, +238,304,237, +304,238,305, +239,305,238, +305,239,306, +240,306,239, +306,240,307, +241,307,240, +307,241,308, +242,308,241, +308,242,309, +243,309,242, +309,243,310, +244,310,243, +310,244,311, +245,311,244, +311,245,312, +246,312,245, +312,246,313, +247,313,246, +313,247,314, +248,314,247, +314,248,315, +249,315,248, +315,249,316, +250,316,249, +316,250,317, +251,317,250, +317,251,318, +252,318,251, +318,252,319, +253,319,252, +319,253,320, +254,320,253, +320,254,321, +255,321,254, +321,255,322, +256,322,255, +322,256,323, +257,323,256, +323,257,324, +258,324,257, +324,258,325, +259,325,258, +325,259,326, +260,326,259, +326,260,327, +261,327,260, +327,261,328, +262,328,261, +328,262,329, +263,329,262, +330,264,331, +265,331,264, +331,265,332, +266,332,265, +332,266,333, +267,333,266, +333,267,334, +268,334,267, +334,268,335, +269,335,268, +335,269,336, +270,336,269, +336,270,337, +271,337,270, +337,271,338, +272,338,271, +338,272,339, +273,339,272, +339,273,340, +274,340,273, +340,274,341, +275,341,274, +341,275,342, +276,342,275, +342,276,343, +277,343,276, +343,277,344, +278,344,277, +344,278,345, +279,345,278, +345,279,346, +280,346,279, +346,280,347, +281,347,280, +347,281,348, +282,348,281, +348,282,349, +283,349,282, +349,283,350, +284,350,283, +350,284,351, +285,351,284, +351,285,352, +286,352,285, +352,286,353, +287,353,286, +353,287,354, +288,354,287, +354,288,355, +289,355,288, +355,289,356, +290,356,289, +356,290,357, +291,357,290, +357,291,358, +292,358,291, +358,292,359, +293,359,292, +359,293,360, +294,360,293, +360,294,361, +295,361,294, +361,295,362, +296,362,295, +362,296,363, +297,363,296, +363,297,364, +298,364,297, +364,298,365, +299,365,298, +365,299,366, +300,366,299, +366,300,367, +301,367,300, +367,301,368, +302,368,301, +368,302,369, +303,369,302, +369,303,370, +304,370,303, +370,304,371, +305,371,304, +371,305,372, +306,372,305, +372,306,373, +307,373,306, +373,307,374, +308,374,307, +374,308,375, +309,375,308, +375,309,376, +310,376,309, +376,310,377, +311,377,310, +377,311,378, +312,378,311, +378,312,379, +313,379,312, +379,313,380, +314,380,313, +380,314,381, +315,381,314, +381,315,382, +316,382,315, +382,316,383, +317,383,316, +383,317,384, +318,384,317, +384,318,385, +319,385,318, +385,319,386, +320,386,319, +386,320,387, +321,387,320, +387,321,388, +322,388,321, +388,322,389, +323,389,322, +389,323,390, +324,390,323, +390,324,391, +325,391,324, +391,325,392, +326,392,325, +392,326,393, +327,393,326, +393,327,394, +328,394,327, +394,328,395, +329,395,328, +396,330,397, +331,397,330, +397,331,398, +332,398,331, +398,332,399, +333,399,332, +399,333,400, +334,400,333, +400,334,401, +335,401,334, +401,335,402, +336,402,335, +402,336,403, +337,403,336, +403,337,404, +338,404,337, +404,338,405, +339,405,338, +405,339,406, +340,406,339, +406,340,407, +341,407,340, +407,341,408, +342,408,341, +408,342,409, +343,409,342, +409,343,410, +344,410,343, +410,344,411, +345,411,344, +411,345,412, +346,412,345, +412,346,413, +347,413,346, +413,347,414, +348,414,347, +414,348,415, +349,415,348, +415,349,416, +350,416,349, +416,350,417, +351,417,350, +417,351,418, +352,418,351, +418,352,419, +353,419,352, +419,353,420, +354,420,353, +420,354,421, +355,421,354, +421,355,422, +356,422,355, +422,356,423, +357,423,356, +423,357,424, +358,424,357, +424,358,425, +359,425,358, +425,359,426, +360,426,359, +426,360,427, +361,427,360, +427,361,428, +362,428,361, +428,362,429, +363,429,362, +429,363,430, +364,430,363, +430,364,431, +365,431,364, +431,365,432, +366,432,365, +432,366,433, +367,433,366, +433,367,434, +368,434,367, +434,368,435, +369,435,368, +435,369,436, +370,436,369, +436,370,437, +371,437,370, +437,371,438, +372,438,371, +438,372,439, +373,439,372, +439,373,440, +374,440,373, +440,374,441, +375,441,374, +441,375,442, +376,442,375, +442,376,443, +377,443,376, +443,377,444, +378,444,377, +444,378,445, +379,445,378, +445,379,446, +380,446,379, +446,380,447, +381,447,380, +447,381,448, +382,448,381, +448,382,449, +383,449,382, +449,383,450, +384,450,383, +450,384,451, +385,451,384, +451,385,452, +386,452,385, +452,386,453, +387,453,386, +453,387,454, +388,454,387, +454,388,455, +389,455,388, +455,389,456, +390,456,389, +456,390,457, +391,457,390, +457,391,458, +392,458,391, +458,392,459, +393,459,392, +459,393,460, +394,460,393, +460,394,461, +395,461,394, +462,396,463, +397,463,396, +463,397,464, +398,464,397, +464,398,465, +399,465,398, +465,399,466, +400,466,399, +466,400,467, +401,467,400, +467,401,468, +402,468,401, +468,402,469, +403,469,402, +469,403,470, +404,470,403, +470,404,471, +405,471,404, +471,405,472, +406,472,405, +472,406,473, +407,473,406, +473,407,474, +408,474,407, +474,408,475, +409,475,408, +475,409,476, +410,476,409, +476,410,477, +411,477,410, +477,411,478, +412,478,411, +478,412,479, +413,479,412, +479,413,480, +414,480,413, +480,414,481, +415,481,414, +481,415,482, +416,482,415, +482,416,483, +417,483,416, +483,417,484, +418,484,417, +484,418,485, +419,485,418, +485,419,486, +420,486,419, +486,420,487, +421,487,420, +487,421,488, +422,488,421, +488,422,489, +423,489,422, +489,423,490, +424,490,423, +490,424,491, +425,491,424, +491,425,492, +426,492,425, +492,426,493, +427,493,426, +493,427,494, +428,494,427, +494,428,495, +429,495,428, +495,429,496, +430,496,429, +496,430,497, +431,497,430, +497,431,498, +432,498,431, +498,432,499, +433,499,432, +499,433,500, +434,500,433, +500,434,501, +435,501,434, +501,435,502, +436,502,435, +502,436,503, +437,503,436, +503,437,504, +438,504,437, +504,438,505, +439,505,438, +505,439,506, +440,506,439, +506,440,507, +441,507,440, +507,441,508, +442,508,441, +508,442,509, +443,509,442, +509,443,510, +444,510,443, +510,444,511, +445,511,444, +511,445,512, +446,512,445, +512,446,513, +447,513,446, +513,447,514, +448,514,447, +514,448,515, +449,515,448, +515,449,516, +450,516,449, +516,450,517, +451,517,450, +517,451,518, +452,518,451, +518,452,519, +453,519,452, +519,453,520, +454,520,453, +520,454,521, +455,521,454, +521,455,522, +456,522,455, +522,456,523, +457,523,456, +523,457,524, +458,524,457, +524,458,525, +459,525,458, +525,459,526, +460,526,459, +526,460,527, +461,527,460, +528,462,529, +463,529,462, +529,463,530, +464,530,463, +530,464,531, +465,531,464, +531,465,532, +466,532,465, +532,466,533, +467,533,466, +533,467,534, +468,534,467, +534,468,535, +469,535,468, +535,469,536, +470,536,469, +536,470,537, +471,537,470, +537,471,538, +472,538,471, +538,472,539, +473,539,472, +539,473,540, +474,540,473, +540,474,541, +475,541,474, +541,475,542, +476,542,475, +542,476,543, +477,543,476, +543,477,544, +478,544,477, +544,478,545, +479,545,478, +545,479,546, +480,546,479, +546,480,547, +481,547,480, +547,481,548, +482,548,481, +548,482,549, +483,549,482, +549,483,550, +484,550,483, +550,484,551, +485,551,484, +551,485,552, +486,552,485, +552,486,553, +487,553,486, +553,487,554, +488,554,487, +554,488,555, +489,555,488, +555,489,556, +490,556,489, +556,490,557, +491,557,490, +557,491,558, +492,558,491, +558,492,559, +493,559,492, +559,493,560, +494,560,493, +560,494,561, +495,561,494, +561,495,562, +496,562,495, +562,496,563, +497,563,496, +563,497,564, +498,564,497, +564,498,565, +499,565,498, +565,499,566, +500,566,499, +566,500,567, +501,567,500, +567,501,568, +502,568,501, +568,502,569, +503,569,502, +569,503,570, +504,570,503, +570,504,571, +505,571,504, +571,505,572, +506,572,505, +572,506,573, +507,573,506, +573,507,574, +508,574,507, +574,508,575, +509,575,508, +575,509,576, +510,576,509, +576,510,577, +511,577,510, +577,511,578, +512,578,511, +578,512,579, +513,579,512, +579,513,580, +514,580,513, +580,514,581, +515,581,514, +581,515,582, +516,582,515, +582,516,583, +517,583,516, +583,517,584, +518,584,517, +584,518,585, +519,585,518, +585,519,586, +520,586,519, +586,520,587, +521,587,520, +587,521,588, +522,588,521, +588,522,589, +523,589,522, +589,523,590, +524,590,523, +590,524,591, +525,591,524, +591,525,592, +526,592,525, +592,526,593, +527,593,526, +594,528,595, +529,595,528, +595,529,596, +530,596,529, +596,530,597, +531,597,530, +597,531,598, +532,598,531, +598,532,599, +533,599,532, +599,533,600, +534,600,533, +600,534,601, +535,601,534, +601,535,602, +536,602,535, +602,536,603, +537,603,536, +603,537,604, +538,604,537, +604,538,605, +539,605,538, +605,539,606, +540,606,539, +606,540,607, +541,607,540, +607,541,608, +542,608,541, +608,542,609, +543,609,542, +609,543,610, +544,610,543, +610,544,611, +545,611,544, +611,545,612, +546,612,545, +612,546,613, +547,613,546, +613,547,614, +548,614,547, +614,548,615, +549,615,548, +615,549,616, +550,616,549, +616,550,617, +551,617,550, +617,551,618, +552,618,551, +618,552,619, +553,619,552, +619,553,620, +554,620,553, +620,554,621, +555,621,554, +621,555,622, +556,622,555, +622,556,623, +557,623,556, +623,557,624, +558,624,557, +624,558,625, +559,625,558, +625,559,626, +560,626,559, +626,560,627, +561,627,560, +627,561,628, +562,628,561, +628,562,629, +563,629,562, +629,563,630, +564,630,563, +630,564,631, +565,631,564, +631,565,632, +566,632,565, +632,566,633, +567,633,566, +633,567,634, +568,634,567, +634,568,635, +569,635,568, +635,569,636, +570,636,569, +636,570,637, +571,637,570, +637,571,638, +572,638,571, +638,572,639, +573,639,572, +639,573,640, +574,640,573, +640,574,641, +575,641,574, +641,575,642, +576,642,575, +642,576,643, +577,643,576, +643,577,644, +578,644,577, +644,578,645, +579,645,578, +645,579,646, +580,646,579, +646,580,647, +581,647,580, +647,581,648, +582,648,581, +648,582,649, +583,649,582, +649,583,650, +584,650,583, +650,584,651, +585,651,584, +651,585,652, +586,652,585, +652,586,653, +587,653,586, +653,587,654, +588,654,587, +654,588,655, +589,655,588, +655,589,656, +590,656,589, +656,590,657, +591,657,590, +657,591,658, +592,658,591, +658,592,659, +593,659,592, +660,594,661, +595,661,594, +661,595,662, +596,662,595, +662,596,663, +597,663,596, +663,597,664, +598,664,597, +664,598,665, +599,665,598, +665,599,666, +600,666,599, +666,600,667, +601,667,600, +667,601,668, +602,668,601, +668,602,669, +603,669,602, +669,603,670, +604,670,603, +670,604,671, +605,671,604, +671,605,672, +606,672,605, +672,606,673, +607,673,606, +673,607,674, +608,674,607, +674,608,675, +609,675,608, +675,609,676, +610,676,609, +676,610,677, +611,677,610, +677,611,678, +612,678,611, +678,612,679, +613,679,612, +679,613,680, +614,680,613, +680,614,681, +615,681,614, +681,615,682, +616,682,615, +682,616,683, +617,683,616, +683,617,684, +618,684,617, +684,618,685, +619,685,618, +685,619,686, +620,686,619, +686,620,687, +621,687,620, +687,621,688, +622,688,621, +688,622,689, +623,689,622, +689,623,690, +624,690,623, +690,624,691, +625,691,624, +691,625,692, +626,692,625, +692,626,693, +627,693,626, +693,627,694, +628,694,627, +694,628,695, +629,695,628, +695,629,696, +630,696,629, +696,630,697, +631,697,630, +697,631,698, +632,698,631, +698,632,699, +633,699,632, +699,633,700, +634,700,633, +700,634,701, +635,701,634, +701,635,702, +636,702,635, +702,636,703, +637,703,636, +703,637,704, +638,704,637, +704,638,705, +639,705,638, +705,639,706, +640,706,639, +706,640,707, +641,707,640, +707,641,708, +642,708,641, +708,642,709, +643,709,642, +709,643,710, +644,710,643, +710,644,711, +645,711,644, +711,645,712, +646,712,645, +712,646,713, +647,713,646, +713,647,714, +648,714,647, +714,648,715, +649,715,648, +715,649,716, +650,716,649, +716,650,717, +651,717,650, +717,651,718, +652,718,651, +718,652,719, +653,719,652, +719,653,720, +654,720,653, +720,654,721, +655,721,654, +721,655,722, +656,722,655, +722,656,723, +657,723,656, +723,657,724, +658,724,657, +724,658,725, +659,725,658, +726,660,727, +661,727,660, +727,661,728, +662,728,661, +728,662,729, +663,729,662, +729,663,730, +664,730,663, +730,664,731, +665,731,664, +731,665,732, +666,732,665, +732,666,733, +667,733,666, +733,667,734, +668,734,667, +734,668,735, +669,735,668, +735,669,736, +670,736,669, +736,670,737, +671,737,670, +737,671,738, +672,738,671, +738,672,739, +673,739,672, +739,673,740, +674,740,673, +740,674,741, +675,741,674, +741,675,742, +676,742,675, +742,676,743, +677,743,676, +743,677,744, +678,744,677, +744,678,745, +679,745,678, +745,679,746, +680,746,679, +746,680,747, +681,747,680, +747,681,748, +682,748,681, +748,682,749, +683,749,682, +749,683,750, +684,750,683, +750,684,751, +685,751,684, +751,685,752, +686,752,685, +752,686,753, +687,753,686, +753,687,754, +688,754,687, +754,688,755, +689,755,688, +755,689,756, +690,756,689, +756,690,757, +691,757,690, +757,691,758, +692,758,691, +758,692,759, +693,759,692, +759,693,760, +694,760,693, +760,694,761, +695,761,694, +761,695,762, +696,762,695, +762,696,763, +697,763,696, +763,697,764, +698,764,697, +764,698,765, +699,765,698, +765,699,766, +700,766,699, +766,700,767, +701,767,700, +767,701,768, +702,768,701, +768,702,769, +703,769,702, +769,703,770, +704,770,703, +770,704,771, +705,771,704, +771,705,772, +706,772,705, +772,706,773, +707,773,706, +773,707,774, +708,774,707, +774,708,775, +709,775,708, +775,709,776, +710,776,709, +776,710,777, +711,777,710, +777,711,778, +712,778,711, +778,712,779, +713,779,712, +779,713,780, +714,780,713, +780,714,781, +715,781,714, +781,715,782, +716,782,715, +782,716,783, +717,783,716, +783,717,784, +718,784,717, +784,718,785, +719,785,718, +785,719,786, +720,786,719, +786,720,787, +721,787,720, +787,721,788, +722,788,721, +788,722,789, +723,789,722, +789,723,790, +724,790,723, +790,724,791, +725,791,724, +792,726,793, +727,793,726, +793,727,794, +728,794,727, +794,728,795, +729,795,728, +795,729,796, +730,796,729, +796,730,797, +731,797,730, +797,731,798, +732,798,731, +798,732,799, +733,799,732, +799,733,800, +734,800,733, +800,734,801, +735,801,734, +801,735,802, +736,802,735, +802,736,803, +737,803,736, +803,737,804, +738,804,737, +804,738,805, +739,805,738, +805,739,806, +740,806,739, +806,740,807, +741,807,740, +807,741,808, +742,808,741, +808,742,809, +743,809,742, +809,743,810, +744,810,743, +810,744,811, +745,811,744, +811,745,812, +746,812,745, +812,746,813, +747,813,746, +813,747,814, +748,814,747, +814,748,815, +749,815,748, +815,749,816, +750,816,749, +816,750,817, +751,817,750, +817,751,818, +752,818,751, +818,752,819, +753,819,752, +819,753,820, +754,820,753, +820,754,821, +755,821,754, +821,755,822, +756,822,755, +822,756,823, +757,823,756, +823,757,824, +758,824,757, +824,758,825, +759,825,758, +825,759,826, +760,826,759, +826,760,827, +761,827,760, +827,761,828, +762,828,761, +828,762,829, +763,829,762, +829,763,830, +764,830,763, +830,764,831, +765,831,764, +831,765,832, +766,832,765, +832,766,833, +767,833,766, +833,767,834, +768,834,767, +834,768,835, +769,835,768, +835,769,836, +770,836,769, +836,770,837, +771,837,770, +837,771,838, +772,838,771, +838,772,839, +773,839,772, +839,773,840, +774,840,773, +840,774,841, +775,841,774, +841,775,842, +776,842,775, +842,776,843, +777,843,776, +843,777,844, +778,844,777, +844,778,845, +779,845,778, +845,779,846, +780,846,779, +846,780,847, +781,847,780, +847,781,848, +782,848,781, +848,782,849, +783,849,782, +849,783,850, +784,850,783, +850,784,851, +785,851,784, +851,785,852, +786,852,785, +852,786,853, +787,853,786, +853,787,854, +788,854,787, +854,788,855, +789,855,788, +855,789,856, +790,856,789, +856,790,857, +791,857,790, +858,792,859, +793,859,792, +859,793,860, +794,860,793, +860,794,861, +795,861,794, +861,795,862, +796,862,795, +862,796,863, +797,863,796, +863,797,864, +798,864,797, +864,798,865, +799,865,798, +865,799,866, +800,866,799, +866,800,867, +801,867,800, +867,801,868, +802,868,801, +868,802,869, +803,869,802, +869,803,870, +804,870,803, +870,804,871, +805,871,804, +871,805,872, +806,872,805, +872,806,873, +807,873,806, +873,807,874, +808,874,807, +874,808,875, +809,875,808, +875,809,876, +810,876,809, +876,810,877, +811,877,810, +877,811,878, +812,878,811, +878,812,879, +813,879,812, +879,813,880, +814,880,813, +880,814,881, +815,881,814, +881,815,882, +816,882,815, +882,816,883, +817,883,816, +883,817,884, +818,884,817, +884,818,885, +819,885,818, +885,819,886, +820,886,819, +886,820,887, +821,887,820, +887,821,888, +822,888,821, +888,822,889, +823,889,822, +889,823,890, +824,890,823, +890,824,891, +825,891,824, +891,825,892, +826,892,825, +892,826,893, +827,893,826, +893,827,894, +828,894,827, +894,828,895, +829,895,828, +895,829,896, +830,896,829, +896,830,897, +831,897,830, +897,831,898, +832,898,831, +898,832,899, +833,899,832, +899,833,900, +834,900,833, +900,834,901, +835,901,834, +901,835,902, +836,902,835, +902,836,903, +837,903,836, +903,837,904, +838,904,837, +904,838,905, +839,905,838, +905,839,906, +840,906,839, +906,840,907, +841,907,840, +907,841,908, +842,908,841, +908,842,909, +843,909,842, +909,843,910, +844,910,843, +910,844,911, +845,911,844, +911,845,912, +846,912,845, +912,846,913, +847,913,846, +913,847,914, +848,914,847, +914,848,915, +849,915,848, +915,849,916, +850,916,849, +916,850,917, +851,917,850, +917,851,918, +852,918,851, +918,852,919, +853,919,852, +919,853,920, +854,920,853, +920,854,921, +855,921,854, +921,855,922, +856,922,855, +922,856,923, +857,923,856, +924,858,925, +859,925,858, +925,859,926, +860,926,859, +926,860,927, +861,927,860, +927,861,928, +862,928,861, +928,862,929, +863,929,862, +929,863,930, +864,930,863, +930,864,931, +865,931,864, +931,865,932, +866,932,865, +932,866,933, +867,933,866, +933,867,934, +868,934,867, +934,868,935, +869,935,868, +935,869,936, +870,936,869, +936,870,937, +871,937,870, +937,871,938, +872,938,871, +938,872,939, +873,939,872, +939,873,940, +874,940,873, +940,874,941, +875,941,874, +941,875,942, +876,942,875, +942,876,943, +877,943,876, +943,877,944, +878,944,877, +944,878,945, +879,945,878, +945,879,946, +880,946,879, +946,880,947, +881,947,880, +947,881,948, +882,948,881, +948,882,949, +883,949,882, +949,883,950, +884,950,883, +950,884,951, +885,951,884, +951,885,952, +886,952,885, +952,886,953, +887,953,886, +953,887,954, +888,954,887, +954,888,955, +889,955,888, +955,889,956, +890,956,889, +956,890,957, +891,957,890, +957,891,958, +892,958,891, +958,892,959, +893,959,892, +959,893,960, +894,960,893, +960,894,961, +895,961,894, +961,895,962, +896,962,895, +962,896,963, +897,963,896, +963,897,964, +898,964,897, +964,898,965, +899,965,898, +965,899,966, +900,966,899, +966,900,967, +901,967,900, +967,901,968, +902,968,901, +968,902,969, +903,969,902, +969,903,970, +904,970,903, +970,904,971, +905,971,904, +971,905,972, +906,972,905, +972,906,973, +907,973,906, +973,907,974, +908,974,907, +974,908,975, +909,975,908, +975,909,976, +910,976,909, +976,910,977, +911,977,910, +977,911,978, +912,978,911, +978,912,979, +913,979,912, +979,913,980, +914,980,913, +980,914,981, +915,981,914, +981,915,982, +916,982,915, +982,916,983, +917,983,916, +983,917,984, +918,984,917, +984,918,985, +919,985,918, +985,919,986, +920,986,919, +986,920,987, +921,987,920, +987,921,988, +922,988,921, +988,922,989, +923,989,922, +990,924,991, +925,991,924, +991,925,992, +926,992,925, +992,926,993, +927,993,926, +993,927,994, +928,994,927, +994,928,995, +929,995,928, +995,929,996, +930,996,929, +996,930,997, +931,997,930, +997,931,998, +932,998,931, +998,932,999, +933,999,932, +999,933,1000, +934,1000,933, +1000,934,1001, +935,1001,934, +1001,935,1002, +936,1002,935, +1002,936,1003, +937,1003,936, +1003,937,1004, +938,1004,937, +1004,938,1005, +939,1005,938, +1005,939,1006, +940,1006,939, +1006,940,1007, +941,1007,940, +1007,941,1008, +942,1008,941, +1008,942,1009, +943,1009,942, +1009,943,1010, +944,1010,943, +1010,944,1011, +945,1011,944, +1011,945,1012, +946,1012,945, +1012,946,1013, +947,1013,946, +1013,947,1014, +948,1014,947, +1014,948,1015, +949,1015,948, +1015,949,1016, +950,1016,949, +1016,950,1017, +951,1017,950, +1017,951,1018, +952,1018,951, +1018,952,1019, +953,1019,952, +1019,953,1020, +954,1020,953, +1020,954,1021, +955,1021,954, +1021,955,1022, +956,1022,955, +1022,956,1023, +957,1023,956, +1023,957,1024, +958,1024,957, +1024,958,1025, +959,1025,958, +1025,959,1026, +960,1026,959, +1026,960,1027, +961,1027,960, +1027,961,1028, +962,1028,961, +1028,962,1029, +963,1029,962, +1029,963,1030, +964,1030,963, +1030,964,1031, +965,1031,964, +1031,965,1032, +966,1032,965, +1032,966,1033, +967,1033,966, +1033,967,1034, +968,1034,967, +1034,968,1035, +969,1035,968, +1035,969,1036, +970,1036,969, +1036,970,1037, +971,1037,970, +1037,971,1038, +972,1038,971, +1038,972,1039, +973,1039,972, +1039,973,1040, +974,1040,973, +1040,974,1041, +975,1041,974, +1041,975,1042, +976,1042,975, +1042,976,1043, +977,1043,976, +1043,977,1044, +978,1044,977, +1044,978,1045, +979,1045,978, +1045,979,1046, +980,1046,979, +1046,980,1047, +981,1047,980, +1047,981,1048, +982,1048,981, +1048,982,1049, +983,1049,982, +1049,983,1050, +984,1050,983, +1050,984,1051, +985,1051,984, +1051,985,1052, +986,1052,985, +1052,986,1053, +987,1053,986, +1053,987,1054, +988,1054,987, +1054,988,1055, +989,1055,988, +1056,990,1057, +991,1057,990, +1057,991,1058, +992,1058,991, +1058,992,1059, +993,1059,992, +1059,993,1060, +994,1060,993, +1060,994,1061, +995,1061,994, +1061,995,1062, +996,1062,995, +1062,996,1063, +997,1063,996, +1063,997,1064, +998,1064,997, +1064,998,1065, +999,1065,998, +1065,999,1066, +1000,1066,999, +1066,1000,1067, +1001,1067,1000, +1067,1001,1068, +1002,1068,1001, +1068,1002,1069, +1003,1069,1002, +1069,1003,1070, +1004,1070,1003, +1070,1004,1071, +1005,1071,1004, +1071,1005,1072, +1006,1072,1005, +1072,1006,1073, +1007,1073,1006, +1073,1007,1074, +1008,1074,1007, +1074,1008,1075, +1009,1075,1008, +1075,1009,1076, +1010,1076,1009, +1076,1010,1077, +1011,1077,1010, +1077,1011,1078, +1012,1078,1011, +1078,1012,1079, +1013,1079,1012, +1079,1013,1080, +1014,1080,1013, +1080,1014,1081, +1015,1081,1014, +1081,1015,1082, +1016,1082,1015, +1082,1016,1083, +1017,1083,1016, +1083,1017,1084, +1018,1084,1017, +1084,1018,1085, +1019,1085,1018, +1085,1019,1086, +1020,1086,1019, +1086,1020,1087, +1021,1087,1020, +1087,1021,1088, +1022,1088,1021, +1088,1022,1089, +1023,1089,1022, +1089,1023,1090, +1024,1090,1023, +1090,1024,1091, +1025,1091,1024, +1091,1025,1092, +1026,1092,1025, +1092,1026,1093, +1027,1093,1026, +1093,1027,1094, +1028,1094,1027, +1094,1028,1095, +1029,1095,1028, +1095,1029,1096, +1030,1096,1029, +1096,1030,1097, +1031,1097,1030, +1097,1031,1098, +1032,1098,1031, +1098,1032,1099, +1033,1099,1032, +1099,1033,1100, +1034,1100,1033, +1100,1034,1101, +1035,1101,1034, +1101,1035,1102, +1036,1102,1035, +1102,1036,1103, +1037,1103,1036, +1103,1037,1104, +1038,1104,1037, +1104,1038,1105, +1039,1105,1038, +1105,1039,1106, +1040,1106,1039, +1106,1040,1107, +1041,1107,1040, +1107,1041,1108, +1042,1108,1041, +1108,1042,1109, +1043,1109,1042, +1109,1043,1110, +1044,1110,1043, +1110,1044,1111, +1045,1111,1044, +1111,1045,1112, +1046,1112,1045, +1112,1046,1113, +1047,1113,1046, +1113,1047,1114, +1048,1114,1047, +1114,1048,1115, +1049,1115,1048, +1115,1049,1116, +1050,1116,1049, +1116,1050,1117, +1051,1117,1050, +1117,1051,1118, +1052,1118,1051, +1118,1052,1119, +1053,1119,1052, +1119,1053,1120, +1054,1120,1053, +1120,1054,1121, +1055,1121,1054, +1122,1056,1123, +1057,1123,1056, +1123,1057,1124, +1058,1124,1057, +1124,1058,1125, +1059,1125,1058, +1125,1059,1126, +1060,1126,1059, +1126,1060,1127, +1061,1127,1060, +1127,1061,1128, +1062,1128,1061, +1128,1062,1129, +1063,1129,1062, +1129,1063,1130, +1064,1130,1063, +1130,1064,1131, +1065,1131,1064, +1131,1065,1132, +1066,1132,1065, +1132,1066,1133, +1067,1133,1066, +1133,1067,1134, +1068,1134,1067, +1134,1068,1135, +1069,1135,1068, +1135,1069,1136, +1070,1136,1069, +1136,1070,1137, +1071,1137,1070, +1137,1071,1138, +1072,1138,1071, +1138,1072,1139, +1073,1139,1072, +1139,1073,1140, +1074,1140,1073, +1140,1074,1141, +1075,1141,1074, +1141,1075,1142, +1076,1142,1075, +1142,1076,1143, +1077,1143,1076, +1143,1077,1144, +1078,1144,1077, +1144,1078,1145, +1079,1145,1078, +1145,1079,1146, +1080,1146,1079, +1146,1080,1147, +1081,1147,1080, +1147,1081,1148, +1082,1148,1081, +1148,1082,1149, +1083,1149,1082, +1149,1083,1150, +1084,1150,1083, +1150,1084,1151, +1085,1151,1084, +1151,1085,1152, +1086,1152,1085, +1152,1086,1153, +1087,1153,1086, +1153,1087,1154, +1088,1154,1087, +1154,1088,1155, +1089,1155,1088, +1155,1089,1156, +1090,1156,1089, +1156,1090,1157, +1091,1157,1090, +1157,1091,1158, +1092,1158,1091, +1158,1092,1159, +1093,1159,1092, +1159,1093,1160, +1094,1160,1093, +1160,1094,1161, +1095,1161,1094, +1161,1095,1162, +1096,1162,1095, +1162,1096,1163, +1097,1163,1096, +1163,1097,1164, +1098,1164,1097, +1164,1098,1165, +1099,1165,1098, +1165,1099,1166, +1100,1166,1099, +1166,1100,1167, +1101,1167,1100, +1167,1101,1168, +1102,1168,1101, +1168,1102,1169, +1103,1169,1102, +1169,1103,1170, +1104,1170,1103, +1170,1104,1171, +1105,1171,1104, +1171,1105,1172, +1106,1172,1105, +1172,1106,1173, +1107,1173,1106, +1173,1107,1174, +1108,1174,1107, +1174,1108,1175, +1109,1175,1108, +1175,1109,1176, +1110,1176,1109, +1176,1110,1177, +1111,1177,1110, +1177,1111,1178, +1112,1178,1111, +1178,1112,1179, +1113,1179,1112, +1179,1113,1180, +1114,1180,1113, +1180,1114,1181, +1115,1181,1114, +1181,1115,1182, +1116,1182,1115, +1182,1116,1183, +1117,1183,1116, +1183,1117,1184, +1118,1184,1117, +1184,1118,1185, +1119,1185,1118, +1185,1119,1186, +1120,1186,1119, +1186,1120,1187, +1121,1187,1120, +1188,1122,1189, +1123,1189,1122, +1189,1123,1190, +1124,1190,1123, +1190,1124,1191, +1125,1191,1124, +1191,1125,1192, +1126,1192,1125, +1192,1126,1193, +1127,1193,1126, +1193,1127,1194, +1128,1194,1127, +1194,1128,1195, +1129,1195,1128, +1195,1129,1196, +1130,1196,1129, +1196,1130,1197, +1131,1197,1130, +1197,1131,1198, +1132,1198,1131, +1198,1132,1199, +1133,1199,1132, +1199,1133,1200, +1134,1200,1133, +1200,1134,1201, +1135,1201,1134, +1201,1135,1202, +1136,1202,1135, +1202,1136,1203, +1137,1203,1136, +1203,1137,1204, +1138,1204,1137, +1204,1138,1205, +1139,1205,1138, +1205,1139,1206, +1140,1206,1139, +1206,1140,1207, +1141,1207,1140, +1207,1141,1208, +1142,1208,1141, +1208,1142,1209, +1143,1209,1142, +1209,1143,1210, +1144,1210,1143, +1210,1144,1211, +1145,1211,1144, +1211,1145,1212, +1146,1212,1145, +1212,1146,1213, +1147,1213,1146, +1213,1147,1214, +1148,1214,1147, +1214,1148,1215, +1149,1215,1148, +1215,1149,1216, +1150,1216,1149, +1216,1150,1217, +1151,1217,1150, +1217,1151,1218, +1152,1218,1151, +1218,1152,1219, +1153,1219,1152, +1219,1153,1220, +1154,1220,1153, +1220,1154,1221, +1155,1221,1154, +1221,1155,1222, +1156,1222,1155, +1222,1156,1223, +1157,1223,1156, +1223,1157,1224, +1158,1224,1157, +1224,1158,1225, +1159,1225,1158, +1225,1159,1226, +1160,1226,1159, +1226,1160,1227, +1161,1227,1160, +1227,1161,1228, +1162,1228,1161, +1228,1162,1229, +1163,1229,1162, +1229,1163,1230, +1164,1230,1163, +1230,1164,1231, +1165,1231,1164, +1231,1165,1232, +1166,1232,1165, +1232,1166,1233, +1167,1233,1166, +1233,1167,1234, +1168,1234,1167, +1234,1168,1235, +1169,1235,1168, +1235,1169,1236, +1170,1236,1169, +1236,1170,1237, +1171,1237,1170, +1237,1171,1238, +1172,1238,1171, +1238,1172,1239, +1173,1239,1172, +1239,1173,1240, +1174,1240,1173, +1240,1174,1241, +1175,1241,1174, +1241,1175,1242, +1176,1242,1175, +1242,1176,1243, +1177,1243,1176, +1243,1177,1244, +1178,1244,1177, +1244,1178,1245, +1179,1245,1178, +1245,1179,1246, +1180,1246,1179, +1246,1180,1247, +1181,1247,1180, +1247,1181,1248, +1182,1248,1181, +1248,1182,1249, +1183,1249,1182, +1249,1183,1250, +1184,1250,1183, +1250,1184,1251, +1185,1251,1184, +1251,1185,1252, +1186,1252,1185, +1252,1186,1253, +1187,1253,1186, +1254,1188,1255, +1189,1255,1188, +1255,1189,1256, +1190,1256,1189, +1256,1190,1257, +1191,1257,1190, +1257,1191,1258, +1192,1258,1191, +1258,1192,1259, +1193,1259,1192, +1259,1193,1260, +1194,1260,1193, +1260,1194,1261, +1195,1261,1194, +1261,1195,1262, +1196,1262,1195, +1262,1196,1263, +1197,1263,1196, +1263,1197,1264, +1198,1264,1197, +1264,1198,1265, +1199,1265,1198, +1265,1199,1266, +1200,1266,1199, +1266,1200,1267, +1201,1267,1200, +1267,1201,1268, +1202,1268,1201, +1268,1202,1269, +1203,1269,1202, +1269,1203,1270, +1204,1270,1203, +1270,1204,1271, +1205,1271,1204, +1271,1205,1272, +1206,1272,1205, +1272,1206,1273, +1207,1273,1206, +1273,1207,1274, +1208,1274,1207, +1274,1208,1275, +1209,1275,1208, +1275,1209,1276, +1210,1276,1209, +1276,1210,1277, +1211,1277,1210, +1277,1211,1278, +1212,1278,1211, +1278,1212,1279, +1213,1279,1212, +1279,1213,1280, +1214,1280,1213, +1280,1214,1281, +1215,1281,1214, +1281,1215,1282, +1216,1282,1215, +1282,1216,1283, +1217,1283,1216, +1283,1217,1284, +1218,1284,1217, +1284,1218,1285, +1219,1285,1218, +1285,1219,1286, +1220,1286,1219, +1286,1220,1287, +1221,1287,1220, +1287,1221,1288, +1222,1288,1221, +1288,1222,1289, +1223,1289,1222, +1289,1223,1290, +1224,1290,1223, +1290,1224,1291, +1225,1291,1224, +1291,1225,1292, +1226,1292,1225, +1292,1226,1293, +1227,1293,1226, +1293,1227,1294, +1228,1294,1227, +1294,1228,1295, +1229,1295,1228, +1295,1229,1296, +1230,1296,1229, +1296,1230,1297, +1231,1297,1230, +1297,1231,1298, +1232,1298,1231, +1298,1232,1299, +1233,1299,1232, +1299,1233,1300, +1234,1300,1233, +1300,1234,1301, +1235,1301,1234, +1301,1235,1302, +1236,1302,1235, +1302,1236,1303, +1237,1303,1236, +1303,1237,1304, +1238,1304,1237, +1304,1238,1305, +1239,1305,1238, +1305,1239,1306, +1240,1306,1239, +1306,1240,1307, +1241,1307,1240, +1307,1241,1308, +1242,1308,1241, +1308,1242,1309, +1243,1309,1242, +1309,1243,1310, +1244,1310,1243, +1310,1244,1311, +1245,1311,1244, +1311,1245,1312, +1246,1312,1245, +1312,1246,1313, +1247,1313,1246, +1313,1247,1314, +1248,1314,1247, +1314,1248,1315, +1249,1315,1248, +1315,1249,1316, +1250,1316,1249, +1316,1250,1317, +1251,1317,1250, +1317,1251,1318, +1252,1318,1251, +1318,1252,1319, +1253,1319,1252, +1320,1254,1321, +1255,1321,1254, +1321,1255,1322, +1256,1322,1255, +1322,1256,1323, +1257,1323,1256, +1323,1257,1324, +1258,1324,1257, +1324,1258,1325, +1259,1325,1258, +1325,1259,1326, +1260,1326,1259, +1326,1260,1327, +1261,1327,1260, +1327,1261,1328, +1262,1328,1261, +1328,1262,1329, +1263,1329,1262, +1329,1263,1330, +1264,1330,1263, +1330,1264,1331, +1265,1331,1264, +1331,1265,1332, +1266,1332,1265, +1332,1266,1333, +1267,1333,1266, +1333,1267,1334, +1268,1334,1267, +1334,1268,1335, +1269,1335,1268, +1335,1269,1336, +1270,1336,1269, +1336,1270,1337, +1271,1337,1270, +1337,1271,1338, +1272,1338,1271, +1338,1272,1339, +1273,1339,1272, +1339,1273,1340, +1274,1340,1273, +1340,1274,1341, +1275,1341,1274, +1341,1275,1342, +1276,1342,1275, +1342,1276,1343, +1277,1343,1276, +1343,1277,1344, +1278,1344,1277, +1344,1278,1345, +1279,1345,1278, +1345,1279,1346, +1280,1346,1279, +1346,1280,1347, +1281,1347,1280, +1347,1281,1348, +1282,1348,1281, +1348,1282,1349, +1283,1349,1282, +1349,1283,1350, +1284,1350,1283, +1350,1284,1351, +1285,1351,1284, +1351,1285,1352, +1286,1352,1285, +1352,1286,1353, +1287,1353,1286, +1353,1287,1354, +1288,1354,1287, +1354,1288,1355, +1289,1355,1288, +1355,1289,1356, +1290,1356,1289, +1356,1290,1357, +1291,1357,1290, +1357,1291,1358, +1292,1358,1291, +1358,1292,1359, +1293,1359,1292, +1359,1293,1360, +1294,1360,1293, +1360,1294,1361, +1295,1361,1294, +1361,1295,1362, +1296,1362,1295, +1362,1296,1363, +1297,1363,1296, +1363,1297,1364, +1298,1364,1297, +1364,1298,1365, +1299,1365,1298, +1365,1299,1366, +1300,1366,1299, +1366,1300,1367, +1301,1367,1300, +1367,1301,1368, +1302,1368,1301, +1368,1302,1369, +1303,1369,1302, +1369,1303,1370, +1304,1370,1303, +1370,1304,1371, +1305,1371,1304, +1371,1305,1372, +1306,1372,1305, +1372,1306,1373, +1307,1373,1306, +1373,1307,1374, +1308,1374,1307, +1374,1308,1375, +1309,1375,1308, +1375,1309,1376, +1310,1376,1309, +1376,1310,1377, +1311,1377,1310, +1377,1311,1378, +1312,1378,1311, +1378,1312,1379, +1313,1379,1312, +1379,1313,1380, +1314,1380,1313, +1380,1314,1381, +1315,1381,1314, +1381,1315,1382, +1316,1382,1315, +1382,1316,1383, +1317,1383,1316, +1383,1317,1384, +1318,1384,1317, +1384,1318,1385, +1319,1385,1318, +1386,1320,1387, +1321,1387,1320, +1387,1321,1388, +1322,1388,1321, +1388,1322,1389, +1323,1389,1322, +1389,1323,1390, +1324,1390,1323, +1390,1324,1391, +1325,1391,1324, +1391,1325,1392, +1326,1392,1325, +1392,1326,1393, +1327,1393,1326, +1393,1327,1394, +1328,1394,1327, +1394,1328,1395, +1329,1395,1328, +1395,1329,1396, +1330,1396,1329, +1396,1330,1397, +1331,1397,1330, +1397,1331,1398, +1332,1398,1331, +1398,1332,1399, +1333,1399,1332, +1399,1333,1400, +1334,1400,1333, +1400,1334,1401, +1335,1401,1334, +1401,1335,1402, +1336,1402,1335, +1402,1336,1403, +1337,1403,1336, +1403,1337,1404, +1338,1404,1337, +1404,1338,1405, +1339,1405,1338, +1405,1339,1406, +1340,1406,1339, +1406,1340,1407, +1341,1407,1340, +1407,1341,1408, +1342,1408,1341, +1408,1342,1409, +1343,1409,1342, +1409,1343,1410, +1344,1410,1343, +1410,1344,1411, +1345,1411,1344, +1411,1345,1412, +1346,1412,1345, +1412,1346,1413, +1347,1413,1346, +1413,1347,1414, +1348,1414,1347, +1414,1348,1415, +1349,1415,1348, +1415,1349,1416, +1350,1416,1349, +1416,1350,1417, +1351,1417,1350, +1417,1351,1418, +1352,1418,1351, +1418,1352,1419, +1353,1419,1352, +1419,1353,1420, +1354,1420,1353, +1420,1354,1421, +1355,1421,1354, +1421,1355,1422, +1356,1422,1355, +1422,1356,1423, +1357,1423,1356, +1423,1357,1424, +1358,1424,1357, +1424,1358,1425, +1359,1425,1358, +1425,1359,1426, +1360,1426,1359, +1426,1360,1427, +1361,1427,1360, +1427,1361,1428, +1362,1428,1361, +1428,1362,1429, +1363,1429,1362, +1429,1363,1430, +1364,1430,1363, +1430,1364,1431, +1365,1431,1364, +1431,1365,1432, +1366,1432,1365, +1432,1366,1433, +1367,1433,1366, +1433,1367,1434, +1368,1434,1367, +1434,1368,1435, +1369,1435,1368, +1435,1369,1436, +1370,1436,1369, +1436,1370,1437, +1371,1437,1370, +1437,1371,1438, +1372,1438,1371, +1438,1372,1439, +1373,1439,1372, +1439,1373,1440, +1374,1440,1373, +1440,1374,1441, +1375,1441,1374, +1441,1375,1442, +1376,1442,1375, +1442,1376,1443, +1377,1443,1376, +1443,1377,1444, +1378,1444,1377, +1444,1378,1445, +1379,1445,1378, +1445,1379,1446, +1380,1446,1379, +1446,1380,1447, +1381,1447,1380, +1447,1381,1448, +1382,1448,1381, +1448,1382,1449, +1383,1449,1382, +1449,1383,1450, +1384,1450,1383, +1450,1384,1451, +1385,1451,1384, +1452,1386,1453, +1387,1453,1386, +1453,1387,1454, +1388,1454,1387, +1454,1388,1455, +1389,1455,1388, +1455,1389,1456, +1390,1456,1389, +1456,1390,1457, +1391,1457,1390, +1457,1391,1458, +1392,1458,1391, +1458,1392,1459, +1393,1459,1392, +1459,1393,1460, +1394,1460,1393, +1460,1394,1461, +1395,1461,1394, +1461,1395,1462, +1396,1462,1395, +1462,1396,1463, +1397,1463,1396, +1463,1397,1464, +1398,1464,1397, +1464,1398,1465, +1399,1465,1398, +1465,1399,1466, +1400,1466,1399, +1466,1400,1467, +1401,1467,1400, +1467,1401,1468, +1402,1468,1401, +1468,1402,1469, +1403,1469,1402, +1469,1403,1470, +1404,1470,1403, +1470,1404,1471, +1405,1471,1404, +1471,1405,1472, +1406,1472,1405, +1472,1406,1473, +1407,1473,1406, +1473,1407,1474, +1408,1474,1407, +1474,1408,1475, +1409,1475,1408, +1475,1409,1476, +1410,1476,1409, +1476,1410,1477, +1411,1477,1410, +1477,1411,1478, +1412,1478,1411, +1478,1412,1479, +1413,1479,1412, +1479,1413,1480, +1414,1480,1413, +1480,1414,1481, +1415,1481,1414, +1481,1415,1482, +1416,1482,1415, +1482,1416,1483, +1417,1483,1416, +1483,1417,1484, +1418,1484,1417, +1484,1418,1485, +1419,1485,1418, +1485,1419,1486, +1420,1486,1419, +1486,1420,1487, +1421,1487,1420, +1487,1421,1488, +1422,1488,1421, +1488,1422,1489, +1423,1489,1422, +1489,1423,1490, +1424,1490,1423, +1490,1424,1491, +1425,1491,1424, +1491,1425,1492, +1426,1492,1425, +1492,1426,1493, +1427,1493,1426, +1493,1427,1494, +1428,1494,1427, +1494,1428,1495, +1429,1495,1428, +1495,1429,1496, +1430,1496,1429, +1496,1430,1497, +1431,1497,1430, +1497,1431,1498, +1432,1498,1431, +1498,1432,1499, +1433,1499,1432, +1499,1433,1500, +1434,1500,1433, +1500,1434,1501, +1435,1501,1434, +1501,1435,1502, +1436,1502,1435, +1502,1436,1503, +1437,1503,1436, +1503,1437,1504, +1438,1504,1437, +1504,1438,1505, +1439,1505,1438, +1505,1439,1506, +1440,1506,1439, +1506,1440,1507, +1441,1507,1440, +1507,1441,1508, +1442,1508,1441, +1508,1442,1509, +1443,1509,1442, +1509,1443,1510, +1444,1510,1443, +1510,1444,1511, +1445,1511,1444, +1511,1445,1512, +1446,1512,1445, +1512,1446,1513, +1447,1513,1446, +1513,1447,1514, +1448,1514,1447, +1514,1448,1515, +1449,1515,1448, +1515,1449,1516, +1450,1516,1449, +1516,1450,1517, +1451,1517,1450, +1518,1452,1519, +1453,1519,1452, +1519,1453,1520, +1454,1520,1453, +1520,1454,1521, +1455,1521,1454, +1521,1455,1522, +1456,1522,1455, +1522,1456,1523, +1457,1523,1456, +1523,1457,1524, +1458,1524,1457, +1524,1458,1525, +1459,1525,1458, +1525,1459,1526, +1460,1526,1459, +1526,1460,1527, +1461,1527,1460, +1527,1461,1528, +1462,1528,1461, +1528,1462,1529, +1463,1529,1462, +1529,1463,1530, +1464,1530,1463, +1530,1464,1531, +1465,1531,1464, +1531,1465,1532, +1466,1532,1465, +1532,1466,1533, +1467,1533,1466, +1533,1467,1534, +1468,1534,1467, +1534,1468,1535, +1469,1535,1468, +1535,1469,1536, +1470,1536,1469, +1536,1470,1537, +1471,1537,1470, +1537,1471,1538, +1472,1538,1471, +1538,1472,1539, +1473,1539,1472, +1539,1473,1540, +1474,1540,1473, +1540,1474,1541, +1475,1541,1474, +1541,1475,1542, +1476,1542,1475, +1542,1476,1543, +1477,1543,1476, +1543,1477,1544, +1478,1544,1477, +1544,1478,1545, +1479,1545,1478, +1545,1479,1546, +1480,1546,1479, +1546,1480,1547, +1481,1547,1480, +1547,1481,1548, +1482,1548,1481, +1548,1482,1549, +1483,1549,1482, +1549,1483,1550, +1484,1550,1483, +1550,1484,1551, +1485,1551,1484, +1551,1485,1552, +1486,1552,1485, +1552,1486,1553, +1487,1553,1486, +1553,1487,1554, +1488,1554,1487, +1554,1488,1555, +1489,1555,1488, +1555,1489,1556, +1490,1556,1489, +1556,1490,1557, +1491,1557,1490, +1557,1491,1558, +1492,1558,1491, +1558,1492,1559, +1493,1559,1492, +1559,1493,1560, +1494,1560,1493, +1560,1494,1561, +1495,1561,1494, +1561,1495,1562, +1496,1562,1495, +1562,1496,1563, +1497,1563,1496, +1563,1497,1564, +1498,1564,1497, +1564,1498,1565, +1499,1565,1498, +1565,1499,1566, +1500,1566,1499, +1566,1500,1567, +1501,1567,1500, +1567,1501,1568, +1502,1568,1501, +1568,1502,1569, +1503,1569,1502, +1569,1503,1570, +1504,1570,1503, +1570,1504,1571, +1505,1571,1504, +1571,1505,1572, +1506,1572,1505, +1572,1506,1573, +1507,1573,1506, +1573,1507,1574, +1508,1574,1507, +1574,1508,1575, +1509,1575,1508, +1575,1509,1576, +1510,1576,1509, +1576,1510,1577, +1511,1577,1510, +1577,1511,1578, +1512,1578,1511, +1578,1512,1579, +1513,1579,1512, +1579,1513,1580, +1514,1580,1513, +1580,1514,1581, +1515,1581,1514, +1581,1515,1582, +1516,1582,1515, +1582,1516,1583, +1517,1583,1516, +1584,1518,1585, +1519,1585,1518, +1585,1519,1586, +1520,1586,1519, +1586,1520,1587, +1521,1587,1520, +1587,1521,1588, +1522,1588,1521, +1588,1522,1589, +1523,1589,1522, +1589,1523,1590, +1524,1590,1523, +1590,1524,1591, +1525,1591,1524, +1591,1525,1592, +1526,1592,1525, +1592,1526,1593, +1527,1593,1526, +1593,1527,1594, +1528,1594,1527, +1594,1528,1595, +1529,1595,1528, +1595,1529,1596, +1530,1596,1529, +1596,1530,1597, +1531,1597,1530, +1597,1531,1598, +1532,1598,1531, +1598,1532,1599, +1533,1599,1532, +1599,1533,1600, +1534,1600,1533, +1600,1534,1601, +1535,1601,1534, +1601,1535,1602, +1536,1602,1535, +1602,1536,1603, +1537,1603,1536, +1603,1537,1604, +1538,1604,1537, +1604,1538,1605, +1539,1605,1538, +1605,1539,1606, +1540,1606,1539, +1606,1540,1607, +1541,1607,1540, +1607,1541,1608, +1542,1608,1541, +1608,1542,1609, +1543,1609,1542, +1609,1543,1610, +1544,1610,1543, +1610,1544,1611, +1545,1611,1544, +1611,1545,1612, +1546,1612,1545, +1612,1546,1613, +1547,1613,1546, +1613,1547,1614, +1548,1614,1547, +1614,1548,1615, +1549,1615,1548, +1615,1549,1616, +1550,1616,1549, +1616,1550,1617, +1551,1617,1550, +1617,1551,1618, +1552,1618,1551, +1618,1552,1619, +1553,1619,1552, +1619,1553,1620, +1554,1620,1553, +1620,1554,1621, +1555,1621,1554, +1621,1555,1622, +1556,1622,1555, +1622,1556,1623, +1557,1623,1556, +1623,1557,1624, +1558,1624,1557, +1624,1558,1625, +1559,1625,1558, +1625,1559,1626, +1560,1626,1559, +1626,1560,1627, +1561,1627,1560, +1627,1561,1628, +1562,1628,1561, +1628,1562,1629, +1563,1629,1562, +1629,1563,1630, +1564,1630,1563, +1630,1564,1631, +1565,1631,1564, +1631,1565,1632, +1566,1632,1565, +1632,1566,1633, +1567,1633,1566, +1633,1567,1634, +1568,1634,1567, +1634,1568,1635, +1569,1635,1568, +1635,1569,1636, +1570,1636,1569, +1636,1570,1637, +1571,1637,1570, +1637,1571,1638, +1572,1638,1571, +1638,1572,1639, +1573,1639,1572, +1639,1573,1640, +1574,1640,1573, +1640,1574,1641, +1575,1641,1574, +1641,1575,1642, +1576,1642,1575, +1642,1576,1643, +1577,1643,1576, +1643,1577,1644, +1578,1644,1577, +1644,1578,1645, +1579,1645,1578, +1645,1579,1646, +1580,1646,1579, +1646,1580,1647, +1581,1647,1580, +1647,1581,1648, +1582,1648,1581, +1648,1582,1649, +1583,1649,1582, +1650,1584,1651, +1585,1651,1584, +1651,1585,1652, +1586,1652,1585, +1652,1586,1653, +1587,1653,1586, +1653,1587,1654, +1588,1654,1587, +1654,1588,1655, +1589,1655,1588, +1655,1589,1656, +1590,1656,1589, +1656,1590,1657, +1591,1657,1590, +1657,1591,1658, +1592,1658,1591, +1658,1592,1659, +1593,1659,1592, +1659,1593,1660, +1594,1660,1593, +1660,1594,1661, +1595,1661,1594, +1661,1595,1662, +1596,1662,1595, +1662,1596,1663, +1597,1663,1596, +1663,1597,1664, +1598,1664,1597, +1664,1598,1665, +1599,1665,1598, +1665,1599,1666, +1600,1666,1599, +1666,1600,1667, +1601,1667,1600, +1667,1601,1668, +1602,1668,1601, +1668,1602,1669, +1603,1669,1602, +1669,1603,1670, +1604,1670,1603, +1670,1604,1671, +1605,1671,1604, +1671,1605,1672, +1606,1672,1605, +1672,1606,1673, +1607,1673,1606, +1673,1607,1674, +1608,1674,1607, +1674,1608,1675, +1609,1675,1608, +1675,1609,1676, +1610,1676,1609, +1676,1610,1677, +1611,1677,1610, +1677,1611,1678, +1612,1678,1611, +1678,1612,1679, +1613,1679,1612, +1679,1613,1680, +1614,1680,1613, +1680,1614,1681, +1615,1681,1614, +1681,1615,1682, +1616,1682,1615, +1682,1616,1683, +1617,1683,1616, +1683,1617,1684, +1618,1684,1617, +1684,1618,1685, +1619,1685,1618, +1685,1619,1686, +1620,1686,1619, +1686,1620,1687, +1621,1687,1620, +1687,1621,1688, +1622,1688,1621, +1688,1622,1689, +1623,1689,1622, +1689,1623,1690, +1624,1690,1623, +1690,1624,1691, +1625,1691,1624, +1691,1625,1692, +1626,1692,1625, +1692,1626,1693, +1627,1693,1626, +1693,1627,1694, +1628,1694,1627, +1694,1628,1695, +1629,1695,1628, +1695,1629,1696, +1630,1696,1629, +1696,1630,1697, +1631,1697,1630, +1697,1631,1698, +1632,1698,1631, +1698,1632,1699, +1633,1699,1632, +1699,1633,1700, +1634,1700,1633, +1700,1634,1701, +1635,1701,1634, +1701,1635,1702, +1636,1702,1635, +1702,1636,1703, +1637,1703,1636, +1703,1637,1704, +1638,1704,1637, +1704,1638,1705, +1639,1705,1638, +1705,1639,1706, +1640,1706,1639, +1706,1640,1707, +1641,1707,1640, +1707,1641,1708, +1642,1708,1641, +1708,1642,1709, +1643,1709,1642, +1709,1643,1710, +1644,1710,1643, +1710,1644,1711, +1645,1711,1644, +1711,1645,1712, +1646,1712,1645, +1712,1646,1713, +1647,1713,1646, +1713,1647,1714, +1648,1714,1647, +1714,1648,1715, +1649,1715,1648, +1716,1650,1717, +1651,1717,1650, +1717,1651,1718, +1652,1718,1651, +1718,1652,1719, +1653,1719,1652, +1719,1653,1720, +1654,1720,1653, +1720,1654,1721, +1655,1721,1654, +1721,1655,1722, +1656,1722,1655, +1722,1656,1723, +1657,1723,1656, +1723,1657,1724, +1658,1724,1657, +1724,1658,1725, +1659,1725,1658, +1725,1659,1726, +1660,1726,1659, +1726,1660,1727, +1661,1727,1660, +1727,1661,1728, +1662,1728,1661, +1728,1662,1729, +1663,1729,1662, +1729,1663,1730, +1664,1730,1663, +1730,1664,1731, +1665,1731,1664, +1731,1665,1732, +1666,1732,1665, +1732,1666,1733, +1667,1733,1666, +1733,1667,1734, +1668,1734,1667, +1734,1668,1735, +1669,1735,1668, +1735,1669,1736, +1670,1736,1669, +1736,1670,1737, +1671,1737,1670, +1737,1671,1738, +1672,1738,1671, +1738,1672,1739, +1673,1739,1672, +1739,1673,1740, +1674,1740,1673, +1740,1674,1741, +1675,1741,1674, +1741,1675,1742, +1676,1742,1675, +1742,1676,1743, +1677,1743,1676, +1743,1677,1744, +1678,1744,1677, +1744,1678,1745, +1679,1745,1678, +1745,1679,1746, +1680,1746,1679, +1746,1680,1747, +1681,1747,1680, +1747,1681,1748, +1682,1748,1681, +1748,1682,1749, +1683,1749,1682, +1749,1683,1750, +1684,1750,1683, +1750,1684,1751, +1685,1751,1684, +1751,1685,1752, +1686,1752,1685, +1752,1686,1753, +1687,1753,1686, +1753,1687,1754, +1688,1754,1687, +1754,1688,1755, +1689,1755,1688, +1755,1689,1756, +1690,1756,1689, +1756,1690,1757, +1691,1757,1690, +1757,1691,1758, +1692,1758,1691, +1758,1692,1759, +1693,1759,1692, +1759,1693,1760, +1694,1760,1693, +1760,1694,1761, +1695,1761,1694, +1761,1695,1762, +1696,1762,1695, +1762,1696,1763, +1697,1763,1696, +1763,1697,1764, +1698,1764,1697, +1764,1698,1765, +1699,1765,1698, +1765,1699,1766, +1700,1766,1699, +1766,1700,1767, +1701,1767,1700, +1767,1701,1768, +1702,1768,1701, +1768,1702,1769, +1703,1769,1702, +1769,1703,1770, +1704,1770,1703, +1770,1704,1771, +1705,1771,1704, +1771,1705,1772, +1706,1772,1705, +1772,1706,1773, +1707,1773,1706, +1773,1707,1774, +1708,1774,1707, +1774,1708,1775, +1709,1775,1708, +1775,1709,1776, +1710,1776,1709, +1776,1710,1777, +1711,1777,1710, +1777,1711,1778, +1712,1778,1711, +1778,1712,1779, +1713,1779,1712, +1779,1713,1780, +1714,1780,1713, +1780,1714,1781, +1715,1781,1714, +1782,1716,1783, +1717,1783,1716, +1783,1717,1784, +1718,1784,1717, +1784,1718,1785, +1719,1785,1718, +1785,1719,1786, +1720,1786,1719, +1786,1720,1787, +1721,1787,1720, +1787,1721,1788, +1722,1788,1721, +1788,1722,1789, +1723,1789,1722, +1789,1723,1790, +1724,1790,1723, +1790,1724,1791, +1725,1791,1724, +1791,1725,1792, +1726,1792,1725, +1792,1726,1793, +1727,1793,1726, +1793,1727,1794, +1728,1794,1727, +1794,1728,1795, +1729,1795,1728, +1795,1729,1796, +1730,1796,1729, +1796,1730,1797, +1731,1797,1730, +1797,1731,1798, +1732,1798,1731, +1798,1732,1799, +1733,1799,1732, +1799,1733,1800, +1734,1800,1733, +1800,1734,1801, +1735,1801,1734, +1801,1735,1802, +1736,1802,1735, +1802,1736,1803, +1737,1803,1736, +1803,1737,1804, +1738,1804,1737, +1804,1738,1805, +1739,1805,1738, +1805,1739,1806, +1740,1806,1739, +1806,1740,1807, +1741,1807,1740, +1807,1741,1808, +1742,1808,1741, +1808,1742,1809, +1743,1809,1742, +1809,1743,1810, +1744,1810,1743, +1810,1744,1811, +1745,1811,1744, +1811,1745,1812, +1746,1812,1745, +1812,1746,1813, +1747,1813,1746, +1813,1747,1814, +1748,1814,1747, +1814,1748,1815, +1749,1815,1748, +1815,1749,1816, +1750,1816,1749, +1816,1750,1817, +1751,1817,1750, +1817,1751,1818, +1752,1818,1751, +1818,1752,1819, +1753,1819,1752, +1819,1753,1820, +1754,1820,1753, +1820,1754,1821, +1755,1821,1754, +1821,1755,1822, +1756,1822,1755, +1822,1756,1823, +1757,1823,1756, +1823,1757,1824, +1758,1824,1757, +1824,1758,1825, +1759,1825,1758, +1825,1759,1826, +1760,1826,1759, +1826,1760,1827, +1761,1827,1760, +1827,1761,1828, +1762,1828,1761, +1828,1762,1829, +1763,1829,1762, +1829,1763,1830, +1764,1830,1763, +1830,1764,1831, +1765,1831,1764, +1831,1765,1832, +1766,1832,1765, +1832,1766,1833, +1767,1833,1766, +1833,1767,1834, +1768,1834,1767, +1834,1768,1835, +1769,1835,1768, +1835,1769,1836, +1770,1836,1769, +1836,1770,1837, +1771,1837,1770, +1837,1771,1838, +1772,1838,1771, +1838,1772,1839, +1773,1839,1772, +1839,1773,1840, +1774,1840,1773, +1840,1774,1841, +1775,1841,1774, +1841,1775,1842, +1776,1842,1775, +1842,1776,1843, +1777,1843,1776, +1843,1777,1844, +1778,1844,1777, +1844,1778,1845, +1779,1845,1778, +1845,1779,1846, +1780,1846,1779, +1846,1780,1847, +1781,1847,1780, +1848,1782,1849, +1783,1849,1782, +1849,1783,1850, +1784,1850,1783, +1850,1784,1851, +1785,1851,1784, +1851,1785,1852, +1786,1852,1785, +1852,1786,1853, +1787,1853,1786, +1853,1787,1854, +1788,1854,1787, +1854,1788,1855, +1789,1855,1788, +1855,1789,1856, +1790,1856,1789, +1856,1790,1857, +1791,1857,1790, +1857,1791,1858, +1792,1858,1791, +1858,1792,1859, +1793,1859,1792, +1859,1793,1860, +1794,1860,1793, +1860,1794,1861, +1795,1861,1794, +1861,1795,1862, +1796,1862,1795, +1862,1796,1863, +1797,1863,1796, +1863,1797,1864, +1798,1864,1797, +1864,1798,1865, +1799,1865,1798, +1865,1799,1866, +1800,1866,1799, +1866,1800,1867, +1801,1867,1800, +1867,1801,1868, +1802,1868,1801, +1868,1802,1869, +1803,1869,1802, +1869,1803,1870, +1804,1870,1803, +1870,1804,1871, +1805,1871,1804, +1871,1805,1872, +1806,1872,1805, +1872,1806,1873, +1807,1873,1806, +1873,1807,1874, +1808,1874,1807, +1874,1808,1875, +1809,1875,1808, +1875,1809,1876, +1810,1876,1809, +1876,1810,1877, +1811,1877,1810, +1877,1811,1878, +1812,1878,1811, +1878,1812,1879, +1813,1879,1812, +1879,1813,1880, +1814,1880,1813, +1880,1814,1881, +1815,1881,1814, +1881,1815,1882, +1816,1882,1815, +1882,1816,1883, +1817,1883,1816, +1883,1817,1884, +1818,1884,1817, +1884,1818,1885, +1819,1885,1818, +1885,1819,1886, +1820,1886,1819, +1886,1820,1887, +1821,1887,1820, +1887,1821,1888, +1822,1888,1821, +1888,1822,1889, +1823,1889,1822, +1889,1823,1890, +1824,1890,1823, +1890,1824,1891, +1825,1891,1824, +1891,1825,1892, +1826,1892,1825, +1892,1826,1893, +1827,1893,1826, +1893,1827,1894, +1828,1894,1827, +1894,1828,1895, +1829,1895,1828, +1895,1829,1896, +1830,1896,1829, +1896,1830,1897, +1831,1897,1830, +1897,1831,1898, +1832,1898,1831, +1898,1832,1899, +1833,1899,1832, +1899,1833,1900, +1834,1900,1833, +1900,1834,1901, +1835,1901,1834, +1901,1835,1902, +1836,1902,1835, +1902,1836,1903, +1837,1903,1836, +1903,1837,1904, +1838,1904,1837, +1904,1838,1905, +1839,1905,1838, +1905,1839,1906, +1840,1906,1839, +1906,1840,1907, +1841,1907,1840, +1907,1841,1908, +1842,1908,1841, +1908,1842,1909, +1843,1909,1842, +1909,1843,1910, +1844,1910,1843, +1910,1844,1911, +1845,1911,1844, +1911,1845,1912, +1846,1912,1845, +1912,1846,1913, +1847,1913,1846, +1914,1848,1915, +1849,1915,1848, +1915,1849,1916, +1850,1916,1849, +1916,1850,1917, +1851,1917,1850, +1917,1851,1918, +1852,1918,1851, +1918,1852,1919, +1853,1919,1852, +1919,1853,1920, +1854,1920,1853, +1920,1854,1921, +1855,1921,1854, +1921,1855,1922, +1856,1922,1855, +1922,1856,1923, +1857,1923,1856, +1923,1857,1924, +1858,1924,1857, +1924,1858,1925, +1859,1925,1858, +1925,1859,1926, +1860,1926,1859, +1926,1860,1927, +1861,1927,1860, +1927,1861,1928, +1862,1928,1861, +1928,1862,1929, +1863,1929,1862, +1929,1863,1930, +1864,1930,1863, +1930,1864,1931, +1865,1931,1864, +1931,1865,1932, +1866,1932,1865, +1932,1866,1933, +1867,1933,1866, +1933,1867,1934, +1868,1934,1867, +1934,1868,1935, +1869,1935,1868, +1935,1869,1936, +1870,1936,1869, +1936,1870,1937, +1871,1937,1870, +1937,1871,1938, +1872,1938,1871, +1938,1872,1939, +1873,1939,1872, +1939,1873,1940, +1874,1940,1873, +1940,1874,1941, +1875,1941,1874, +1941,1875,1942, +1876,1942,1875, +1942,1876,1943, +1877,1943,1876, +1943,1877,1944, +1878,1944,1877, +1944,1878,1945, +1879,1945,1878, +1945,1879,1946, +1880,1946,1879, +1946,1880,1947, +1881,1947,1880, +1947,1881,1948, +1882,1948,1881, +1948,1882,1949, +1883,1949,1882, +1949,1883,1950, +1884,1950,1883, +1950,1884,1951, +1885,1951,1884, +1951,1885,1952, +1886,1952,1885, +1952,1886,1953, +1887,1953,1886, +1953,1887,1954, +1888,1954,1887, +1954,1888,1955, +1889,1955,1888, +1955,1889,1956, +1890,1956,1889, +1956,1890,1957, +1891,1957,1890, +1957,1891,1958, +1892,1958,1891, +1958,1892,1959, +1893,1959,1892, +1959,1893,1960, +1894,1960,1893, +1960,1894,1961, +1895,1961,1894, +1961,1895,1962, +1896,1962,1895, +1962,1896,1963, +1897,1963,1896, +1963,1897,1964, +1898,1964,1897, +1964,1898,1965, +1899,1965,1898, +1965,1899,1966, +1900,1966,1899, +1966,1900,1967, +1901,1967,1900, +1967,1901,1968, +1902,1968,1901, +1968,1902,1969, +1903,1969,1902, +1969,1903,1970, +1904,1970,1903, +1970,1904,1971, +1905,1971,1904, +1971,1905,1972, +1906,1972,1905, +1972,1906,1973, +1907,1973,1906, +1973,1907,1974, +1908,1974,1907, +1974,1908,1975, +1909,1975,1908, +1975,1909,1976, +1910,1976,1909, +1976,1910,1977, +1911,1977,1910, +1977,1911,1978, +1912,1978,1911, +1978,1912,1979, +1913,1979,1912, +}; + +#define Landscape03VtxCount 2048 +#define Landscape03IdxCount 11718 + +btScalar Landscape03Vtx[] = { +3.90625f,50.3865f,-2.20246e-006f, +3.90625f,52.6186f,3.90625f, +7.8125f,50.3905f,-2.20264e-006f, +7.8125f,51.8648f,3.90625f, +11.7188f,49.8171f,-2.17758e-006f, +11.7188f,51.1949f,3.90625f, +15.625f,50.595f,-2.21158e-006f, +15.625f,50.2102f,3.90625f, +19.5313f,50.405f,-2.20327e-006f, +19.5313f,50.6058f,3.90625f, +23.4375f,50.9679f,-2.22788e-006f, +23.4375f,50.7008f,3.90625f, +27.3438f,52.4635f,-2.29325e-006f, +27.3438f,51.2163f,3.90625f, +31.25f,53.1505f,-2.32328e-006f, +31.25f,51.4263f,3.90625f, +35.1563f,53.061f,-2.31937e-006f, +35.1563f,52.1968f,3.90625f, +39.0625f,53.6772f,-2.34631e-006f, +39.0625f,53.9783f,3.90625f, +42.9688f,54.3062f,-2.3738e-006f, +42.9688f,53.8927f,3.90625f, +46.875f,54.6795f,-2.39012e-006f, +46.875f,53.3266f,3.90625f, +50.7813f,55.3188f,-2.41806e-006f, +50.7813f,53.5901f,3.90625f, +54.6875f,56.913f,-2.48775e-006f, +54.6875f,55.5679f,3.90625f, +58.5938f,57.4575f,-2.51155e-006f, +58.5938f,55.1819f,3.90625f, +62.5f,56.5398f,-2.47143e-006f, +62.5f,53.6891f,3.90625f, +66.4063f,55.8786f,-2.44253e-006f, +66.4063f,53.0541f,3.90625f, +70.3125f,53.6497f,-2.3451e-006f, +70.3125f,51.6665f,3.90625f, +74.2188f,51.6447f,-2.25746e-006f, +74.2188f,51.4469f,3.90625f, +78.125f,51.8145f,-2.26488e-006f, +78.125f,51.9591f,3.90625f, +82.0313f,51.335f,-2.24392e-006f, +82.0313f,51.0418f,3.90625f, +85.9375f,50.1836f,-2.1936e-006f, +85.9375f,49.7513f,3.90625f, +89.8438f,49.0536f,-2.1442e-006f, +89.8438f,48.7329f,3.90625f, +93.75f,47.3968f,-2.07178e-006f, +93.75f,46.8713f,3.90625f, +97.6563f,45.8014f,-2.00204e-006f, +97.6563f,46.3905f,3.90625f, +101.563f,45.2347f,-1.97727e-006f, +101.563f,45.4241f,3.90625f, +105.469f,44.6501f,-1.95172e-006f, +105.469f,45.6811f,3.90625f, +109.375f,44.3569f,-1.9389e-006f, +109.375f,45.3238f,3.90625f, +113.281f,44.1147f,-1.92831e-006f, +113.281f,43.6112f,3.90625f, +117.188f,43.4037f,-1.89723e-006f, +117.188f,42.1291f,3.90625f, +121.094f,41.1606f,-1.79919e-006f, +121.094f,40.4747f,3.90625f, +125.0f,40.195f,-1.75698e-006f, +125.0f,39.3351f,3.90625f, +128.906f,39.5659f,-1.72948e-006f, +128.906f,38.0742f,3.90625f, +132.813f,38.2592f,-1.67236e-006f, +132.813f,36.7758f,3.90625f, +136.719f,36.4337f,-1.59257e-006f, +136.719f,34.9213f,3.90625f, +140.625f,34.1507f,-1.49277e-006f, +140.625f,32.3643f,3.90625f, +144.531f,31.5531f,-1.37923e-006f, +144.531f,31.7157f,3.90625f, +148.438f,29.9056f,-1.30722e-006f, +148.438f,30.6005f,3.90625f, +152.344f,30.5219f,-1.33416e-006f, +152.344f,31.6034f,3.90625f, +156.25f,31.1254f,-1.36053e-006f, +156.25f,32.6503f,3.90625f, +160.156f,31.8976f,-1.39429e-006f, +160.156f,33.3131f,3.90625f, +164.063f,31.5364f,-1.3785e-006f, +164.063f,32.5745f,3.90625f, +167.969f,30.5585f,-1.33575e-006f, +167.969f,31.5017f,3.90625f, +171.875f,30.0528f,-1.31365e-006f, +171.875f,30.6842f,3.90625f, +175.781f,29.2833f,-1.28002e-006f, +175.781f,29.8734f,3.90625f, +179.688f,28.3316f,-1.23841e-006f, +179.688f,28.6537f,3.90625f, +183.594f,27.0177f,-1.18098e-006f, +183.594f,27.2073f,3.90625f, +187.5f,24.7626f,-1.08241e-006f, +187.5f,25.4367f,3.90625f, +191.406f,22.7371f,-9.9387e-007f, +191.406f,24.1609f,3.90625f, +195.313f,21.6497f,-9.46338e-007f, +195.313f,23.9724f,3.90625f, +199.219f,21.3313f,-9.32422e-007f, +199.219f,23.7702f,3.90625f, +203.125f,20.9148f,-9.14215e-007f, +203.125f,22.4031f,3.90625f, +207.031f,19.4875f,-8.51826e-007f, +207.031f,22.1587f,3.90625f, +210.938f,19.0037f,-8.30679e-007f, +210.938f,21.6154f,3.90625f, +214.844f,18.408f,-8.0464e-007f, +214.844f,21.8202f,3.90625f, +218.75f,18.7855f,-8.2114e-007f, +218.75f,21.017f,3.90625f, +222.656f,18.1497f,-7.9335e-007f, +222.656f,19.3736f,3.90625f, +226.563f,17.6889f,-7.73205e-007f, +226.563f,18.2127f,3.90625f, +230.469f,16.8429f,-7.36228e-007f, +230.469f,17.2263f,3.90625f, +234.375f,16.3712f,-7.15609e-007f, +234.375f,16.2938f,3.90625f, +238.281f,14.3259f,-6.26204e-007f, +238.281f,14.4518f,3.90625f, +242.188f,12.4394f,-5.43742e-007f, +242.188f,13.6398f,3.90625f, +246.094f,12.3876f,-5.41479e-007f, +246.094f,13.2404f,3.90625f, +250.0f,11.9236f,-5.21196e-007f, +250.0f,12.7102f,3.90625f, +3.90625f,48.8559f,-3.90625f, +7.8125f,49.3575f,-3.90625f, +11.7188f,49.963f,-3.90625f, +15.625f,50.1126f,-3.90625f, +19.5313f,51.6247f,-3.90625f, +23.4375f,52.1716f,-3.90625f, +27.3438f,52.8679f,-3.90625f, +31.25f,53.978f,-3.90625f, +35.1563f,53.8948f,-3.90625f, +39.0625f,54.8492f,-3.90625f, +42.9688f,56.1714f,-3.90625f, +46.875f,56.4915f,-3.90625f, +50.7813f,56.5729f,-3.90625f, +54.6875f,57.9767f,-3.90625f, +58.5938f,58.6125f,-3.90625f, +62.5f,58.0023f,-3.90625f, +66.4063f,57.5742f,-3.90625f, +70.3125f,55.4949f,-3.90625f, +74.2188f,53.7219f,-3.90625f, +78.125f,53.233f,-3.90625f, +82.0313f,52.5499f,-3.90625f, +85.9375f,51.1842f,-3.90625f, +89.8438f,49.6534f,-3.90625f, +93.75f,47.6829f,-3.90625f, +97.6563f,45.813f,-3.90625f, +101.563f,44.7099f,-3.90625f, +105.469f,45.0932f,-3.90625f, +109.375f,44.8326f,-3.90625f, +113.281f,44.5197f,-3.90625f, +117.188f,43.7399f,-3.90625f, +121.094f,42.3088f,-3.90625f, +125.0f,40.4224f,-3.90625f, +128.906f,39.437f,-3.90625f, +132.813f,39.825f,-3.90625f, +136.719f,38.2979f,-3.90625f, +140.625f,35.2095f,-3.90625f, +144.531f,32.0692f,-3.90625f, +148.438f,31.1765f,-3.90625f, +152.344f,32.2065f,-3.90625f, +156.25f,31.4774f,-3.90625f, +160.156f,31.7166f,-3.90625f, +164.063f,31.7667f,-3.90625f, +167.969f,31.1742f,-3.90625f, +171.875f,29.6515f,-3.90625f, +175.781f,28.7845f,-3.90625f, +179.688f,28.3154f,-3.90625f, +183.594f,26.6187f,-3.90625f, +187.5f,24.7363f,-3.90625f, +191.406f,22.9162f,-3.90625f, +195.313f,21.5211f,-3.90625f, +199.219f,19.7693f,-3.90625f, +203.125f,18.9792f,-3.90625f, +207.031f,18.8399f,-3.90625f, +210.938f,18.8797f,-3.90625f, +214.844f,18.8123f,-3.90625f, +218.75f,18.5136f,-3.90625f, +222.656f,18.5607f,-3.90625f, +226.563f,17.5053f,-3.90625f, +230.469f,17.4838f,-3.90625f, +234.375f,16.6728f,-3.90625f, +238.281f,14.8594f,-3.90625f, +242.188f,12.9613f,-3.90625f, +246.094f,12.8624f,-3.90625f, +250.0f,11.5894f,-3.90625f, +3.90625f,48.7225f,-7.8125f, +7.8125f,49.1281f,-7.8125f, +11.7188f,50.0005f,-7.8125f, +15.625f,50.5896f,-7.8125f, +19.5313f,51.5499f,-7.8125f, +23.4375f,52.9511f,-7.8125f, +27.3438f,53.117f,-7.8125f, +31.25f,54.0682f,-7.8125f, +35.1563f,55.2353f,-7.8125f, +39.0625f,57.2741f,-7.8125f, +42.9688f,57.4338f,-7.8125f, +46.875f,57.766f,-7.8125f, +50.7813f,57.2724f,-7.8125f, +54.6875f,58.0147f,-7.8125f, +58.5938f,58.764f,-7.8125f, +62.5f,58.6375f,-7.8125f, +66.4063f,57.2699f,-7.8125f, +70.3125f,55.9883f,-7.8125f, +74.2188f,54.8767f,-7.8125f, +78.125f,54.5266f,-7.8125f, +82.0313f,53.7148f,-7.8125f, +85.9375f,52.3735f,-7.8125f, +89.8438f,50.9637f,-7.8125f, +93.75f,48.4983f,-7.8125f, +97.6563f,45.9034f,-7.8125f, +101.563f,45.0863f,-7.8125f, +105.469f,44.2432f,-7.8125f, +109.375f,43.9561f,-7.8125f, +113.281f,43.3015f,-7.8125f, +117.188f,43.254f,-7.8125f, +121.094f,42.7388f,-7.8125f, +125.0f,41.1851f,-7.8125f, +128.906f,39.7522f,-7.8125f, +132.813f,39.8116f,-7.8125f, +136.719f,38.7148f,-7.8125f, +140.625f,36.0845f,-7.8125f, +144.531f,34.0308f,-7.8125f, +148.438f,33.0368f,-7.8125f, +152.344f,32.5867f,-7.8125f, +156.25f,32.8758f,-7.8125f, +160.156f,32.65f,-7.8125f, +164.063f,32.6826f,-7.8125f, +167.969f,31.5243f,-7.8125f, +171.875f,30.4061f,-7.8125f, +175.781f,29.2721f,-7.8125f, +179.688f,28.0417f,-7.8125f, +183.594f,26.2041f,-7.8125f, +187.5f,24.2168f,-7.8125f, +191.406f,22.7847f,-7.8125f, +195.313f,20.5069f,-7.8125f, +199.219f,18.6189f,-7.8125f, +203.125f,17.5296f,-7.8125f, +207.031f,18.0846f,-7.8125f, +210.938f,18.4802f,-7.8125f, +214.844f,18.5436f,-7.8125f, +218.75f,18.3296f,-7.8125f, +222.656f,17.9158f,-7.8125f, +226.563f,17.0318f,-7.8125f, +230.469f,16.2818f,-7.8125f, +234.375f,15.4949f,-7.8125f, +238.281f,13.4891f,-7.8125f, +242.188f,13.3349f,-7.8125f, +246.094f,12.2716f,-7.8125f, +250.0f,10.9901f,-7.8125f, +3.90625f,49.6298f,-11.7188f, +7.8125f,50.0683f,-11.7188f, +11.7188f,50.6295f,-11.7188f, +15.625f,51.0495f,-11.7188f, +19.5313f,52.4884f,-11.7188f, +23.4375f,53.3147f,-11.7188f, +27.3438f,54.4311f,-11.7188f, +31.25f,55.2874f,-11.7188f, +35.1563f,56.5549f,-11.7188f, +39.0625f,57.9376f,-11.7188f, +42.9688f,58.2302f,-11.7188f, +46.875f,59.1419f,-11.7188f, +50.7813f,58.8724f,-11.7188f, +54.6875f,58.5393f,-11.7188f, +58.5938f,58.6416f,-11.7188f, +62.5f,58.1973f,-11.7188f, +66.4063f,57.9168f,-11.7188f, +70.3125f,56.4347f,-11.7188f, +74.2188f,55.7911f,-11.7188f, +78.125f,55.946f,-11.7188f, +82.0313f,54.9033f,-11.7188f, +85.9375f,53.0954f,-11.7188f, +89.8438f,51.7428f,-11.7188f, +93.75f,49.2198f,-11.7188f, +97.6563f,46.1127f,-11.7188f, +101.563f,43.9953f,-11.7188f, +105.469f,43.5777f,-11.7188f, +109.375f,43.3284f,-11.7188f, +113.281f,43.5152f,-11.7188f, +117.188f,43.6687f,-11.7188f, +121.094f,42.5477f,-11.7188f, +125.0f,41.4079f,-11.7188f, +128.906f,39.4512f,-11.7188f, +132.813f,39.5183f,-11.7188f, +136.719f,37.8068f,-11.7188f, +140.625f,36.5652f,-11.7188f, +144.531f,34.8202f,-11.7188f, +148.438f,34.0166f,-11.7188f, +152.344f,33.5311f,-11.7188f, +156.25f,34.1672f,-11.7188f, +160.156f,33.8602f,-11.7188f, +164.063f,33.8717f,-11.7188f, +167.969f,33.1703f,-11.7188f, +171.875f,31.0241f,-11.7188f, +175.781f,30.2798f,-11.7188f, +179.688f,28.3241f,-11.7188f, +183.594f,26.4432f,-11.7188f, +187.5f,24.9758f,-11.7188f, +191.406f,22.2834f,-11.7188f, +195.313f,19.3875f,-11.7188f, +199.219f,18.4079f,-11.7188f, +203.125f,16.6498f,-11.7188f, +207.031f,16.1235f,-11.7188f, +210.938f,16.9462f,-11.7188f, +214.844f,17.2638f,-11.7188f, +218.75f,17.0386f,-11.7188f, +222.656f,16.7666f,-11.7188f, +226.563f,15.3591f,-11.7188f, +230.469f,14.4048f,-11.7188f, +234.375f,13.3079f,-11.7188f, +238.281f,13.0895f,-11.7188f, +242.188f,12.8462f,-11.7188f, +246.094f,12.6287f,-11.7188f, +250.0f,11.4682f,-11.7188f, +3.90625f,50.6915f,-15.625f, +7.8125f,51.2382f,-15.625f, +11.7188f,52.3659f,-15.625f, +15.625f,52.3873f,-15.625f, +19.5313f,53.1083f,-15.625f, +23.4375f,54.652f,-15.625f, +27.3438f,56.0359f,-15.625f, +31.25f,56.4398f,-15.625f, +35.1563f,57.3156f,-15.625f, +39.0625f,58.2355f,-15.625f, +42.9688f,59.4547f,-15.625f, +46.875f,59.9176f,-15.625f, +50.7813f,60.0789f,-15.625f, +54.6875f,59.004f,-15.625f, +58.5938f,59.3361f,-15.625f, +62.5f,59.2681f,-15.625f, +66.4063f,58.5571f,-15.625f, +70.3125f,57.1801f,-15.625f, +74.2188f,56.2048f,-15.625f, +78.125f,56.9427f,-15.625f, +82.0313f,55.401f,-15.625f, +85.9375f,53.0457f,-15.625f, +89.8438f,51.6378f,-15.625f, +93.75f,49.1297f,-15.625f, +97.6563f,46.6267f,-15.625f, +101.563f,44.7255f,-15.625f, +105.469f,43.3819f,-15.625f, +109.375f,42.8703f,-15.625f, +113.281f,42.7636f,-15.625f, +117.188f,42.1897f,-15.625f, +121.094f,41.9269f,-15.625f, +125.0f,41.5365f,-15.625f, +128.906f,39.5408f,-15.625f, +132.813f,38.9178f,-15.625f, +136.719f,38.1447f,-15.625f, +140.625f,36.5145f,-15.625f, +144.531f,34.8696f,-15.625f, +148.438f,34.8203f,-15.625f, +152.344f,34.409f,-15.625f, +156.25f,35.1394f,-15.625f, +160.156f,35.619f,-15.625f, +164.063f,34.7784f,-15.625f, +167.969f,33.6548f,-15.625f, +171.875f,32.1822f,-15.625f, +175.781f,31.1666f,-15.625f, +179.688f,28.9574f,-15.625f, +183.594f,27.3989f,-15.625f, +187.5f,24.7201f,-15.625f, +191.406f,21.7859f,-15.625f, +195.313f,19.2508f,-15.625f, +199.219f,18.0209f,-15.625f, +203.125f,16.8441f,-15.625f, +207.031f,15.8846f,-15.625f, +210.938f,15.6902f,-15.625f, +214.844f,15.3143f,-15.625f, +218.75f,15.3862f,-15.625f, +222.656f,14.2743f,-15.625f, +226.563f,13.5791f,-15.625f, +230.469f,13.4953f,-15.625f, +234.375f,13.3484f,-15.625f, +238.281f,13.2722f,-15.625f, +242.188f,13.4455f,-15.625f, +246.094f,13.0725f,-15.625f, +250.0f,11.5558f,-15.625f, +3.90625f,52.1028f,-19.5313f, +7.8125f,52.877f,-19.5313f, +11.7188f,54.5397f,-19.5313f, +15.625f,54.8941f,-19.5313f, +19.5313f,54.9009f,-19.5313f, +23.4375f,56.1681f,-19.5313f, +27.3438f,56.5579f,-19.5313f, +31.25f,57.7962f,-19.5313f, +35.1563f,58.728f,-19.5313f, +39.0625f,59.4794f,-19.5313f, +42.9688f,60.2636f,-19.5313f, +46.875f,61.2139f,-19.5313f, +50.7813f,60.4636f,-19.5313f, +54.6875f,59.681f,-19.5313f, +58.5938f,60.2068f,-19.5313f, +62.5f,59.1055f,-19.5313f, +66.4063f,57.6126f,-19.5313f, +70.3125f,56.6416f,-19.5313f, +74.2188f,56.4864f,-19.5313f, +78.125f,56.1784f,-19.5313f, +82.0313f,54.8451f,-19.5313f, +85.9375f,53.4094f,-19.5313f, +89.8438f,51.7161f,-19.5313f, +93.75f,48.9933f,-19.5313f, +97.6563f,47.5116f,-19.5313f, +101.563f,45.7701f,-19.5313f, +105.469f,44.0377f,-19.5313f, +109.375f,43.0918f,-19.5313f, +113.281f,42.3992f,-19.5313f, +117.188f,42.0928f,-19.5313f, +121.094f,42.0543f,-19.5313f, +125.0f,41.793f,-19.5313f, +128.906f,39.3232f,-19.5313f, +132.813f,39.1149f,-19.5313f, +136.719f,38.2381f,-19.5313f, +140.625f,36.1019f,-19.5313f, +144.531f,36.4503f,-19.5313f, +148.438f,35.6809f,-19.5313f, +152.344f,35.8022f,-19.5313f, +156.25f,36.4955f,-19.5313f, +160.156f,36.3187f,-19.5313f, +164.063f,35.0268f,-19.5313f, +167.969f,34.0134f,-19.5313f, +171.875f,33.6455f,-19.5313f, +175.781f,31.5932f,-19.5313f, +179.688f,30.0326f,-19.5313f, +183.594f,28.3453f,-19.5313f, +187.5f,25.3719f,-19.5313f, +191.406f,22.0833f,-19.5313f, +195.313f,18.7475f,-19.5313f, +199.219f,17.5517f,-19.5313f, +203.125f,16.1528f,-19.5313f, +207.031f,15.6144f,-19.5313f, +210.938f,14.9281f,-19.5313f, +214.844f,14.5711f,-19.5313f, +218.75f,13.8446f,-19.5313f, +222.656f,13.6892f,-19.5313f, +226.563f,13.1595f,-19.5313f, +230.469f,13.2872f,-19.5313f, +234.375f,13.6153f,-19.5313f, +238.281f,12.8725f,-19.5313f, +242.188f,12.7128f,-19.5313f, +246.094f,13.0658f,-19.5313f, +250.0f,11.5414f,-19.5313f, +3.90625f,54.332f,-23.4375f, +7.8125f,55.636f,-23.4375f, +11.7188f,56.3899f,-23.4375f, +15.625f,56.3763f,-23.4375f, +19.5313f,56.9523f,-23.4375f, +23.4375f,57.5593f,-23.4375f, +27.3438f,57.8056f,-23.4375f, +31.25f,58.5489f,-23.4375f, +35.1563f,59.2321f,-23.4375f, +39.0625f,60.5971f,-23.4375f, +42.9688f,60.1728f,-23.4375f, +46.875f,60.9341f,-23.4375f, +50.7813f,59.5118f,-23.4375f, +54.6875f,59.7552f,-23.4375f, +58.5938f,59.9126f,-23.4375f, +62.5f,58.501f,-23.4375f, +66.4063f,57.8539f,-23.4375f, +70.3125f,56.8693f,-23.4375f, +74.2188f,56.0687f,-23.4375f, +78.125f,55.4392f,-23.4375f, +82.0313f,53.7167f,-23.4375f, +85.9375f,52.1078f,-23.4375f, +89.8438f,50.8869f,-23.4375f, +93.75f,49.9812f,-23.4375f, +97.6563f,47.9233f,-23.4375f, +101.563f,46.1166f,-23.4375f, +105.469f,44.4826f,-23.4375f, +109.375f,42.8924f,-23.4375f, +113.281f,41.9991f,-23.4375f, +117.188f,41.1759f,-23.4375f, +121.094f,41.1189f,-23.4375f, +125.0f,39.9128f,-23.4375f, +128.906f,39.8641f,-23.4375f, +132.813f,39.8777f,-23.4375f, +136.719f,38.3567f,-23.4375f, +140.625f,37.4926f,-23.4375f, +144.531f,37.0275f,-23.4375f, +148.438f,36.7211f,-23.4375f, +152.344f,36.9355f,-23.4375f, +156.25f,37.7455f,-23.4375f, +160.156f,37.3585f,-23.4375f, +164.063f,36.1837f,-23.4375f, +167.969f,34.768f,-23.4375f, +171.875f,33.2179f,-23.4375f, +175.781f,31.6883f,-23.4375f, +179.688f,30.1136f,-23.4375f, +183.594f,28.1155f,-23.4375f, +187.5f,25.4881f,-23.4375f, +191.406f,22.8498f,-23.4375f, +195.313f,19.4425f,-23.4375f, +199.219f,17.1253f,-23.4375f, +203.125f,14.8354f,-23.4375f, +207.031f,14.1771f,-23.4375f, +210.938f,13.9227f,-23.4375f, +214.844f,13.3404f,-23.4375f, +218.75f,13.0525f,-23.4375f, +222.656f,13.0744f,-23.4375f, +226.563f,13.0432f,-23.4375f, +230.469f,13.3341f,-23.4375f, +234.375f,13.6022f,-23.4375f, +238.281f,13.3878f,-23.4375f, +242.188f,12.5812f,-23.4375f, +246.094f,11.8699f,-23.4375f, +250.0f,11.3395f,-23.4375f, +3.90625f,57.5273f,-27.3438f, +7.8125f,57.8217f,-27.3438f, +11.7188f,57.5626f,-27.3438f, +15.625f,57.7794f,-27.3438f, +19.5313f,58.7949f,-27.3438f, +23.4375f,59.3547f,-27.3438f, +27.3438f,59.2359f,-27.3438f, +31.25f,58.8772f,-27.3438f, +35.1563f,58.7149f,-27.3438f, +39.0625f,59.7221f,-27.3438f, +42.9688f,60.0457f,-27.3438f, +46.875f,59.6559f,-27.3438f, +50.7813f,59.9346f,-27.3438f, +54.6875f,60.4095f,-27.3438f, +58.5938f,59.3107f,-27.3438f, +62.5f,57.9086f,-27.3438f, +66.4063f,57.3034f,-27.3438f, +70.3125f,55.5758f,-27.3438f, +74.2188f,54.7167f,-27.3438f, +78.125f,54.405f,-27.3438f, +82.0313f,53.0644f,-27.3438f, +85.9375f,50.9689f,-27.3438f, +89.8438f,49.5959f,-27.3438f, +93.75f,49.2817f,-27.3438f, +97.6563f,48.9188f,-27.3438f, +101.563f,47.0066f,-27.3438f, +105.469f,44.4266f,-27.3438f, +109.375f,42.4539f,-27.3438f, +113.281f,41.5486f,-27.3438f, +117.188f,41.4419f,-27.3438f, +121.094f,41.2039f,-27.3438f, +125.0f,40.188f,-27.3438f, +128.906f,40.4744f,-27.3438f, +132.813f,40.1187f,-27.3438f, +136.719f,38.8055f,-27.3438f, +140.625f,38.024f,-27.3438f, +144.531f,37.5255f,-27.3438f, +148.438f,36.8676f,-27.3438f, +152.344f,37.8967f,-27.3438f, +156.25f,38.4708f,-27.3438f, +160.156f,37.8284f,-27.3438f, +164.063f,36.6094f,-27.3438f, +167.969f,34.4523f,-27.3438f, +171.875f,32.2936f,-27.3438f, +175.781f,31.7467f,-27.3438f, +179.688f,29.9455f,-27.3438f, +183.594f,27.7546f,-27.3438f, +187.5f,25.1902f,-27.3438f, +191.406f,22.537f,-27.3438f, +195.313f,19.5657f,-27.3438f, +199.219f,17.4406f,-27.3438f, +203.125f,15.5459f,-27.3438f, +207.031f,14.92f,-27.3438f, +210.938f,13.472f,-27.3438f, +214.844f,12.9933f,-27.3438f, +218.75f,13.2849f,-27.3438f, +222.656f,12.3375f,-27.3438f, +226.563f,12.0553f,-27.3438f, +230.469f,12.4756f,-27.3438f, +234.375f,12.0857f,-27.3438f, +238.281f,12.1988f,-27.3438f, +242.188f,11.9091f,-27.3438f, +246.094f,10.7301f,-27.3438f, +250.0f,10.1068f,-27.3438f, +3.90625f,59.4204f,-31.25f, +7.8125f,59.5424f,-31.25f, +11.7188f,58.7785f,-31.25f, +15.625f,59.7851f,-31.25f, +19.5313f,60.4897f,-31.25f, +23.4375f,60.6095f,-31.25f, +27.3438f,60.3384f,-31.25f, +31.25f,59.5445f,-31.25f, +35.1563f,58.6838f,-31.25f, +39.0625f,58.847f,-31.25f, +42.9688f,59.3885f,-31.25f, +46.875f,59.447f,-31.25f, +50.7813f,59.5998f,-31.25f, +54.6875f,58.9947f,-31.25f, +58.5938f,58.7482f,-31.25f, +62.5f,56.5947f,-31.25f, +66.4063f,56.2941f,-31.25f, +70.3125f,54.6423f,-31.25f, +74.2188f,53.7392f,-31.25f, +78.125f,53.2955f,-31.25f, +82.0313f,52.8233f,-31.25f, +85.9375f,52.1194f,-31.25f, +89.8438f,51.3335f,-31.25f, +93.75f,49.9201f,-31.25f, +97.6563f,49.1642f,-31.25f, +101.563f,47.4466f,-31.25f, +105.469f,44.6086f,-31.25f, +109.375f,42.885f,-31.25f, +113.281f,42.947f,-31.25f, +117.188f,42.2436f,-31.25f, +121.094f,41.6479f,-31.25f, +125.0f,41.6151f,-31.25f, +128.906f,41.2079f,-31.25f, +132.813f,40.7975f,-31.25f, +136.719f,39.8341f,-31.25f, +140.625f,38.7649f,-31.25f, +144.531f,37.7387f,-31.25f, +148.438f,37.2112f,-31.25f, +152.344f,38.3278f,-31.25f, +156.25f,38.7659f,-31.25f, +160.156f,37.5608f,-31.25f, +164.063f,35.9966f,-31.25f, +167.969f,33.737f,-31.25f, +171.875f,32.0109f,-31.25f, +175.781f,31.1169f,-31.25f, +179.688f,30.0211f,-31.25f, +183.594f,27.5633f,-31.25f, +187.5f,25.0292f,-31.25f, +191.406f,22.8265f,-31.25f, +195.313f,19.8972f,-31.25f, +199.219f,17.6714f,-31.25f, +203.125f,16.2679f,-31.25f, +207.031f,15.0546f,-31.25f, +210.938f,14.037f,-31.25f, +214.844f,12.5501f,-31.25f, +218.75f,12.1528f,-31.25f, +222.656f,12.0576f,-31.25f, +226.563f,11.2847f,-31.25f, +230.469f,11.5946f,-31.25f, +234.375f,10.9216f,-31.25f, +238.281f,10.9182f,-31.25f, +242.188f,11.2826f,-31.25f, +246.094f,11.5781f,-31.25f, +250.0f,11.536f,-31.25f, +3.90625f,60.2212f,-35.1563f, +7.8125f,59.3731f,-35.1563f, +11.7188f,58.5327f,-35.1563f, +15.625f,59.5785f,-35.1563f, +19.5313f,60.1491f,-35.1563f, +23.4375f,60.5297f,-35.1563f, +27.3438f,60.5336f,-35.1563f, +31.25f,60.162f,-35.1563f, +35.1563f,58.5927f,-35.1563f, +39.0625f,57.9369f,-35.1563f, +42.9688f,58.4405f,-35.1563f, +46.875f,58.7374f,-35.1563f, +50.7813f,57.6198f,-35.1563f, +54.6875f,57.3277f,-35.1563f, +58.5938f,56.6423f,-35.1563f, +62.5f,56.2444f,-35.1563f, +66.4063f,56.132f,-35.1563f, +70.3125f,54.6673f,-35.1563f, +74.2188f,53.2924f,-35.1563f, +78.125f,53.2569f,-35.1563f, +82.0313f,52.0828f,-35.1563f, +85.9375f,51.9661f,-35.1563f, +89.8438f,50.9045f,-35.1563f, +93.75f,49.4997f,-35.1563f, +97.6563f,48.0748f,-35.1563f, +101.563f,46.3182f,-35.1563f, +105.469f,44.0878f,-35.1563f, +109.375f,42.863f,-35.1563f, +113.281f,42.8044f,-35.1563f, +117.188f,42.9648f,-35.1563f, +121.094f,42.3221f,-35.1563f, +125.0f,41.6576f,-35.1563f, +128.906f,41.1606f,-35.1563f, +132.813f,39.59f,-35.1563f, +136.719f,38.5602f,-35.1563f, +140.625f,37.9389f,-35.1563f, +144.531f,37.2602f,-35.1563f, +148.438f,37.3784f,-35.1563f, +152.344f,37.8906f,-35.1563f, +156.25f,37.8221f,-35.1563f, +160.156f,36.3088f,-35.1563f, +164.063f,35.1881f,-35.1563f, +167.969f,33.2601f,-35.1563f, +171.875f,31.8157f,-35.1563f, +175.781f,31.3416f,-35.1563f, +179.688f,30.0265f,-35.1563f, +183.594f,27.3943f,-35.1563f, +187.5f,24.641f,-35.1563f, +191.406f,22.2525f,-35.1563f, +195.313f,20.2011f,-35.1563f, +199.219f,18.7104f,-35.1563f, +203.125f,17.3459f,-35.1563f, +207.031f,15.2838f,-35.1563f, +210.938f,13.6157f,-35.1563f, +214.844f,13.3893f,-35.1563f, +218.75f,12.9319f,-35.1563f, +222.656f,11.5191f,-35.1563f, +226.563f,10.4878f,-35.1563f, +230.469f,9.83031f,-35.1563f, +234.375f,9.91945f,-35.1563f, +238.281f,10.9647f,-35.1563f, +242.188f,11.5866f,-35.1563f, +246.094f,11.8313f,-35.1563f, +250.0f,11.9419f,-35.1563f, +3.90625f,59.9094f,-39.0625f, +7.8125f,58.6207f,-39.0625f, +11.7188f,57.735f,-39.0625f, +15.625f,58.9909f,-39.0625f, +19.5313f,60.0678f,-39.0625f, +23.4375f,60.5419f,-39.0625f, +27.3438f,60.4672f,-39.0625f, +31.25f,59.5824f,-39.0625f, +35.1563f,58.4068f,-39.0625f, +39.0625f,57.5098f,-39.0625f, +42.9688f,57.6631f,-39.0625f, +46.875f,57.8211f,-39.0625f, +50.7813f,57.1897f,-39.0625f, +54.6875f,55.6789f,-39.0625f, +58.5938f,55.3212f,-39.0625f, +62.5f,55.2941f,-39.0625f, +66.4063f,55.8101f,-39.0625f, +70.3125f,54.309f,-39.0625f, +74.2188f,53.6313f,-39.0625f, +78.125f,52.7246f,-39.0625f, +82.0313f,51.5473f,-39.0625f, +85.9375f,51.5315f,-39.0625f, +89.8438f,50.6121f,-39.0625f, +93.75f,50.3734f,-39.0625f, +97.6563f,48.8877f,-39.0625f, +101.563f,47.0081f,-39.0625f, +105.469f,44.4827f,-39.0625f, +109.375f,43.5851f,-39.0625f, +113.281f,43.2668f,-39.0625f, +117.188f,43.4016f,-39.0625f, +121.094f,41.962f,-39.0625f, +125.0f,41.4641f,-39.0625f, +128.906f,40.2221f,-39.0625f, +132.813f,38.9234f,-39.0625f, +136.719f,37.7062f,-39.0625f, +140.625f,37.6455f,-39.0625f, +144.531f,37.8691f,-39.0625f, +148.438f,37.4139f,-39.0625f, +152.344f,37.204f,-39.0625f, +156.25f,36.7774f,-39.0625f, +160.156f,35.8962f,-39.0625f, +164.063f,34.5247f,-39.0625f, +167.969f,32.7322f,-39.0625f, +171.875f,32.1044f,-39.0625f, +175.781f,31.321f,-39.0625f, +179.688f,29.7775f,-39.0625f, +183.594f,26.7381f,-39.0625f, +187.5f,24.0216f,-39.0625f, +191.406f,22.277f,-39.0625f, +195.313f,21.2497f,-39.0625f, +199.219f,19.9529f,-39.0625f, +203.125f,18.3349f,-39.0625f, +207.031f,16.7961f,-39.0625f, +210.938f,15.071f,-39.0625f, +214.844f,13.5616f,-39.0625f, +218.75f,13.1679f,-39.0625f, +222.656f,11.2729f,-39.0625f, +226.563f,10.5025f,-39.0625f, +230.469f,9.72086f,-39.0625f, +234.375f,9.90489f,-39.0625f, +238.281f,10.7231f,-39.0625f, +242.188f,11.2573f,-39.0625f, +246.094f,12.0761f,-39.0625f, +250.0f,11.902f,-39.0625f, +3.90625f,59.5207f,-42.9688f, +7.8125f,58.2483f,-42.9688f, +11.7188f,58.069f,-42.9688f, +15.625f,59.4248f,-42.9688f, +19.5313f,60.5261f,-42.9688f, +23.4375f,60.668f,-42.9688f, +27.3438f,60.0252f,-42.9688f, +31.25f,58.0523f,-42.9688f, +35.1563f,56.7426f,-42.9688f, +39.0625f,57.2045f,-42.9688f, +42.9688f,57.166f,-42.9688f, +46.875f,56.9465f,-42.9688f, +50.7813f,55.7381f,-42.9688f, +54.6875f,55.2924f,-42.9688f, +58.5938f,54.6074f,-42.9688f, +62.5f,54.1882f,-42.9688f, +66.4063f,53.672f,-42.9688f, +70.3125f,53.3122f,-42.9688f, +74.2188f,53.0852f,-42.9688f, +78.125f,52.6173f,-42.9688f, +82.0313f,51.616f,-42.9688f, +85.9375f,50.148f,-42.9688f, +89.8438f,49.4823f,-42.9688f, +93.75f,50.0221f,-42.9688f, +97.6563f,48.9931f,-42.9688f, +101.563f,47.1045f,-42.9688f, +105.469f,44.442f,-42.9688f, +109.375f,44.5071f,-42.9688f, +113.281f,44.1005f,-42.9688f, +117.188f,42.8414f,-42.9688f, +121.094f,42.5419f,-42.9688f, +125.0f,41.5451f,-42.9688f, +128.906f,39.4272f,-42.9688f, +132.813f,39.8815f,-42.9688f, +136.719f,39.1366f,-42.9688f, +140.625f,38.7457f,-42.9688f, +144.531f,38.4257f,-42.9688f, +148.438f,37.9899f,-42.9688f, +152.344f,37.1716f,-42.9688f, +156.25f,36.0431f,-42.9688f, +160.156f,35.0784f,-42.9688f, +164.063f,33.3564f,-42.9688f, +167.969f,32.1522f,-42.9688f, +171.875f,30.9698f,-42.9688f, +175.781f,29.7186f,-42.9688f, +179.688f,28.0509f,-42.9688f, +183.594f,25.8254f,-42.9688f, +187.5f,24.8502f,-42.9688f, +191.406f,22.9031f,-42.9688f, +195.313f,20.8135f,-42.9688f, +199.219f,19.6651f,-42.9688f, +203.125f,18.4753f,-42.9688f, +207.031f,17.2259f,-42.9688f, +210.938f,15.6171f,-42.9688f, +214.844f,13.2953f,-42.9688f, +218.75f,13.1679f,-42.9688f, +222.656f,10.7772f,-42.9688f, +226.563f,9.62294f,-42.9688f, +230.469f,9.27609f,-42.9688f, +234.375f,9.47241f,-42.9688f, +238.281f,10.2411f,-42.9688f, +242.188f,11.3745f,-42.9688f, +246.094f,10.981f,-42.9688f, +250.0f,9.93179f,-42.9688f, +3.90625f,58.9086f,-46.875f, +7.8125f,58.895f,-46.875f, +11.7188f,59.1807f,-46.875f, +15.625f,60.2442f,-46.875f, +19.5313f,60.6114f,-46.875f, +23.4375f,59.9439f,-46.875f, +27.3438f,58.704f,-46.875f, +31.25f,58.3729f,-46.875f, +35.1563f,57.0256f,-46.875f, +39.0625f,57.069f,-46.875f, +42.9688f,57.0536f,-46.875f, +46.875f,55.7912f,-46.875f, +50.7813f,54.8674f,-46.875f, +54.6875f,53.8265f,-46.875f, +58.5938f,53.563f,-46.875f, +62.5f,52.5979f,-46.875f, +66.4063f,52.3986f,-46.875f, +70.3125f,52.1891f,-46.875f, +74.2188f,52.2468f,-46.875f, +78.125f,52.3398f,-46.875f, +82.0313f,50.9875f,-46.875f, +85.9375f,49.4072f,-46.875f, +89.8438f,48.3295f,-46.875f, +93.75f,48.9009f,-46.875f, +97.6563f,47.6633f,-46.875f, +101.563f,44.4101f,-46.875f, +105.469f,44.0249f,-46.875f, +109.375f,43.7395f,-46.875f, +113.281f,44.0967f,-46.875f, +117.188f,43.3593f,-46.875f, +121.094f,42.11f,-46.875f, +125.0f,40.8903f,-46.875f, +128.906f,40.3861f,-46.875f, +132.813f,40.075f,-46.875f, +136.719f,39.6347f,-46.875f, +140.625f,38.7369f,-46.875f, +144.531f,37.9042f,-46.875f, +148.438f,36.8546f,-46.875f, +152.344f,36.4012f,-46.875f, +156.25f,35.3977f,-46.875f, +160.156f,34.0947f,-46.875f, +164.063f,32.2545f,-46.875f, +167.969f,30.0086f,-46.875f, +171.875f,29.202f,-46.875f, +175.781f,28.0362f,-46.875f, +179.688f,26.7114f,-46.875f, +183.594f,25.9577f,-46.875f, +187.5f,25.3242f,-46.875f, +191.406f,23.8586f,-46.875f, +195.313f,20.6056f,-46.875f, +199.219f,19.3835f,-46.875f, +203.125f,17.4503f,-46.875f, +207.031f,16.5736f,-46.875f, +210.938f,14.945f,-46.875f, +214.844f,12.5914f,-46.875f, +218.75f,11.835f,-46.875f, +222.656f,10.1636f,-46.875f, +226.563f,9.71281f,-46.875f, +230.469f,9.27988f,-46.875f, +234.375f,8.50394f,-46.875f, +238.281f,9.20978f,-46.875f, +242.188f,9.21707f,-46.875f, +246.094f,9.40089f,-46.875f, +250.0f,8.55411f,-46.875f, +3.90625f,59.8509f,-50.7813f, +7.8125f,59.6141f,-50.7813f, +11.7188f,59.7453f,-50.7813f, +15.625f,60.4259f,-50.7813f, +19.5313f,59.4314f,-50.7813f, +23.4375f,59.033f,-50.7813f, +27.3438f,57.561f,-50.7813f, +31.25f,57.9511f,-50.7813f, +35.1563f,57.0088f,-50.7813f, +39.0625f,56.2469f,-50.7813f, +42.9688f,55.8604f,-50.7813f, +46.875f,55.2326f,-50.7813f, +50.7813f,54.8965f,-50.7813f, +54.6875f,53.1713f,-50.7813f, +58.5938f,52.6122f,-50.7813f, +62.5f,50.9097f,-50.7813f, +66.4063f,50.8144f,-50.7813f, +70.3125f,50.2702f,-50.7813f, +74.2188f,51.4962f,-50.7813f, +78.125f,50.7879f,-50.7813f, +82.0313f,49.5502f,-50.7813f, +85.9375f,48.3386f,-50.7813f, +89.8438f,48.0143f,-50.7813f, +93.75f,46.7527f,-50.7813f, +97.6563f,45.5374f,-50.7813f, +101.563f,44.3542f,-50.7813f, +105.469f,44.8366f,-50.7813f, +109.375f,45.0192f,-50.7813f, +113.281f,44.4763f,-50.7813f, +117.188f,43.4751f,-50.7813f, +121.094f,42.029f,-50.7813f, +125.0f,40.9708f,-50.7813f, +128.906f,40.3658f,-50.7813f, +132.813f,40.0768f,-50.7813f, +136.719f,40.0333f,-50.7813f, +140.625f,38.2667f,-50.7813f, +144.531f,36.5326f,-50.7813f, +148.438f,35.8183f,-50.7813f, +152.344f,35.3934f,-50.7813f, +156.25f,34.9787f,-50.7813f, +160.156f,33.4969f,-50.7813f, +164.063f,31.7517f,-50.7813f, +167.969f,29.499f,-50.7813f, +171.875f,27.1729f,-50.7813f, +175.781f,25.4931f,-50.7813f, +179.688f,25.2745f,-50.7813f, +183.594f,25.2315f,-50.7813f, +187.5f,24.531f,-50.7813f, +191.406f,23.4387f,-50.7813f, +195.313f,21.3665f,-50.7813f, +199.219f,19.2834f,-50.7813f, +203.125f,17.7694f,-50.7813f, +207.031f,16.0247f,-50.7813f, +210.938f,13.9451f,-50.7813f, +214.844f,12.3369f,-50.7813f, +218.75f,10.9033f,-50.7813f, +222.656f,10.0734f,-50.7813f, +226.563f,9.08212f,-50.7813f, +230.469f,9.04527f,-50.7813f, +234.375f,8.83458f,-50.7813f, +238.281f,9.03578f,-50.7813f, +242.188f,9.06782f,-50.7813f, +246.094f,9.03068f,-50.7813f, +250.0f,9.66685f,-50.7813f, +3.90625f,60.3928f,-54.6875f, +7.8125f,60.9235f,-54.6875f, +11.7188f,60.8946f,-54.6875f, +15.625f,60.5131f,-54.6875f, +19.5313f,58.455f,-54.6875f, +23.4375f,57.9712f,-54.6875f, +27.3438f,57.0716f,-54.6875f, +31.25f,56.9372f,-54.6875f, +35.1563f,57.5607f,-54.6875f, +39.0625f,56.6778f,-54.6875f, +42.9688f,56.24f,-54.6875f, +46.875f,55.0661f,-54.6875f, +50.7813f,54.3546f,-54.6875f, +54.6875f,52.1641f,-54.6875f, +58.5938f,51.2643f,-54.6875f, +62.5f,49.4484f,-54.6875f, +66.4063f,48.4401f,-54.6875f, +70.3125f,48.0181f,-54.6875f, +74.2188f,48.8036f,-54.6875f, +78.125f,48.2106f,-54.6875f, +82.0313f,47.8181f,-54.6875f, +85.9375f,47.3982f,-54.6875f, +89.8438f,46.4776f,-54.6875f, +93.75f,45.3848f,-54.6875f, +97.6563f,44.5336f,-54.6875f, +101.563f,45.1445f,-54.6875f, +105.469f,45.5775f,-54.6875f, +109.375f,45.4274f,-54.6875f, +113.281f,44.4184f,-54.6875f, +117.188f,43.6208f,-54.6875f, +121.094f,43.0133f,-54.6875f, +125.0f,41.2193f,-54.6875f, +128.906f,40.0465f,-54.6875f, +132.813f,40.3451f,-54.6875f, +136.719f,39.4272f,-54.6875f, +140.625f,37.2935f,-54.6875f, +144.531f,35.9597f,-54.6875f, +148.438f,34.766f,-54.6875f, +152.344f,33.3503f,-54.6875f, +156.25f,33.6732f,-54.6875f, +160.156f,32.5764f,-54.6875f, +164.063f,30.6942f,-54.6875f, +167.969f,28.8727f,-54.6875f, +171.875f,26.8203f,-54.6875f, +175.781f,24.7162f,-54.6875f, +179.688f,23.5533f,-54.6875f, +183.594f,23.5154f,-54.6875f, +187.5f,23.3554f,-54.6875f, +191.406f,22.7735f,-54.6875f, +195.313f,22.2741f,-54.6875f, +199.219f,20.9717f,-54.6875f, +203.125f,18.5469f,-54.6875f, +207.031f,16.0531f,-54.6875f, +210.938f,13.6058f,-54.6875f, +214.844f,11.0674f,-54.6875f, +218.75f,9.89862f,-54.6875f, +222.656f,9.6172f,-54.6875f, +226.563f,8.63026f,-54.6875f, +230.469f,8.95799f,-54.6875f, +234.375f,8.84522f,-54.6875f, +238.281f,8.9176f,-54.6875f, +242.188f,9.19248f,-54.6875f, +246.094f,9.16691f,-54.6875f, +250.0f,9.42022f,-54.6875f, +3.90625f,61.5747f,-58.5938f, +7.8125f,61.244f,-58.5938f, +11.7188f,60.3982f,-58.5938f, +15.625f,59.4267f,-58.5938f, +19.5313f,58.5294f,-58.5938f, +23.4375f,56.6412f,-58.5938f, +27.3438f,56.0648f,-58.5938f, +31.25f,56.4883f,-58.5938f, +35.1563f,56.5562f,-58.5938f, +39.0625f,56.745f,-58.5938f, +42.9688f,55.6505f,-58.5938f, +46.875f,54.6622f,-58.5938f, +50.7813f,53.7206f,-58.5938f, +54.6875f,51.9309f,-58.5938f, +58.5938f,50.4214f,-58.5938f, +62.5f,48.4353f,-58.5938f, +66.4063f,47.1373f,-58.5938f, +70.3125f,46.0037f,-58.5938f, +74.2188f,45.9795f,-58.5938f, +78.125f,45.2396f,-58.5938f, +82.0313f,45.264f,-58.5938f, +85.9375f,45.2603f,-58.5938f, +89.8438f,45.3076f,-58.5938f, +93.75f,44.8744f,-58.5938f, +97.6563f,44.3646f,-58.5938f, +101.563f,45.1043f,-58.5938f, +105.469f,45.6336f,-58.5938f, +109.375f,44.6129f,-58.5938f, +113.281f,44.3333f,-58.5938f, +117.188f,44.3267f,-58.5938f, +121.094f,42.9064f,-58.5938f, +125.0f,40.63f,-58.5938f, +128.906f,41.2828f,-58.5938f, +132.813f,40.2801f,-58.5938f, +136.719f,39.4089f,-58.5938f, +140.625f,37.0919f,-58.5938f, +144.531f,34.889f,-58.5938f, +148.438f,32.5161f,-58.5938f, +152.344f,31.9597f,-58.5938f, +156.25f,31.5986f,-58.5938f, +160.156f,31.1966f,-58.5938f, +164.063f,30.4149f,-58.5938f, +167.969f,29.0304f,-58.5938f, +171.875f,27.2929f,-58.5938f, +175.781f,26.0835f,-58.5938f, +179.688f,24.7373f,-58.5938f, +183.594f,23.6409f,-58.5938f, +187.5f,23.3059f,-58.5938f, +191.406f,22.8781f,-58.5938f, +195.313f,22.319f,-58.5938f, +199.219f,21.2986f,-58.5938f, +203.125f,19.8613f,-58.5938f, +207.031f,16.8941f,-58.5938f, +210.938f,13.7519f,-58.5938f, +214.844f,11.895f,-58.5938f, +218.75f,9.64673f,-58.5938f, +222.656f,9.27102f,-58.5938f, +226.563f,9.40316f,-58.5938f, +230.469f,8.90628f,-58.5938f, +234.375f,8.63691f,-58.5938f, +238.281f,9.10736f,-58.5938f, +242.188f,9.6506f,-58.5938f, +246.094f,9.20945f,-58.5938f, +250.0f,10.1973f,-58.5938f, +3.90625f,62.1111f,-62.5f, +7.8125f,60.6401f,-62.5f, +11.7188f,59.5734f,-62.5f, +15.625f,59.219f,-62.5f, +19.5313f,57.489f,-62.5f, +23.4375f,55.7813f,-62.5f, +27.3438f,55.9775f,-62.5f, +31.25f,55.9857f,-62.5f, +35.1563f,55.7053f,-62.5f, +39.0625f,55.9712f,-62.5f, +42.9688f,54.6904f,-62.5f, +46.875f,53.8065f,-62.5f, +50.7813f,52.4182f,-62.5f, +54.6875f,50.8531f,-62.5f, +58.5938f,49.1994f,-62.5f, +62.5f,47.7017f,-62.5f, +66.4063f,45.469f,-62.5f, +70.3125f,44.3384f,-62.5f, +74.2188f,43.2272f,-62.5f, +78.125f,43.8591f,-62.5f, +82.0313f,44.3452f,-62.5f, +85.9375f,44.3048f,-62.5f, +89.8438f,44.2242f,-62.5f, +93.75f,44.0587f,-62.5f, +97.6563f,43.7317f,-62.5f, +101.563f,44.5392f,-62.5f, +105.469f,44.5257f,-62.5f, +109.375f,43.5595f,-62.5f, +113.281f,44.5114f,-62.5f, +117.188f,43.2895f,-62.5f, +121.094f,41.6188f,-62.5f, +125.0f,39.9989f,-62.5f, +128.906f,40.9613f,-62.5f, +132.813f,39.8454f,-62.5f, +136.719f,38.9499f,-62.5f, +140.625f,36.7405f,-62.5f, +144.531f,34.8983f,-62.5f, +148.438f,33.5172f,-62.5f, +152.344f,31.5497f,-62.5f, +156.25f,31.3001f,-62.5f, +160.156f,30.8035f,-62.5f, +164.063f,30.3361f,-62.5f, +167.969f,29.7129f,-62.5f, +171.875f,28.9356f,-62.5f, +175.781f,27.3605f,-62.5f, +179.688f,26.5354f,-62.5f, +183.594f,25.1923f,-62.5f, +187.5f,23.8745f,-62.5f, +191.406f,22.6444f,-62.5f, +195.313f,22.0412f,-62.5f, +199.219f,20.9675f,-62.5f, +203.125f,18.5243f,-62.5f, +207.031f,15.5154f,-62.5f, +210.938f,13.2419f,-62.5f, +214.844f,11.0082f,-62.5f, +218.75f,9.92645f,-62.5f, +222.656f,9.66787f,-62.5f, +226.563f,10.141f,-62.5f, +230.469f,9.5559f,-62.5f, +234.375f,8.93799f,-62.5f, +238.281f,9.36179f,-62.5f, +242.188f,9.32325f,-62.5f, +246.094f,9.89448f,-62.5f, +250.0f,11.3062f,-62.5f, +3.90625f,60.8569f,-66.4063f, +7.8125f,59.3087f,-66.4063f, +11.7188f,58.6192f,-66.4063f, +15.625f,57.567f,-66.4063f, +19.5313f,54.6351f,-66.4063f, +23.4375f,53.6183f,-66.4063f, +27.3438f,54.0844f,-66.4063f, +31.25f,54.4962f,-66.4063f, +35.1563f,53.9539f,-66.4063f, +39.0625f,53.4324f,-66.4063f, +42.9688f,52.6655f,-66.4063f, +46.875f,51.9681f,-66.4063f, +50.7813f,51.1623f,-66.4063f, +54.6875f,50.0114f,-66.4063f, +58.5938f,47.9598f,-66.4063f, +62.5f,46.2999f,-66.4063f, +66.4063f,44.4466f,-66.4063f, +70.3125f,42.2001f,-66.4063f, +74.2188f,41.2192f,-66.4063f, +78.125f,41.7209f,-66.4063f, +82.0313f,42.7363f,-66.4063f, +85.9375f,42.9552f,-66.4063f, +89.8438f,43.0346f,-66.4063f, +93.75f,43.4604f,-66.4063f, +97.6563f,42.6437f,-66.4063f, +101.563f,42.6894f,-66.4063f, +105.469f,43.1054f,-66.4063f, +109.375f,42.7138f,-66.4063f, +113.281f,42.4744f,-66.4063f, +117.188f,42.2299f,-66.4063f, +121.094f,41.2421f,-66.4063f, +125.0f,40.3737f,-66.4063f, +128.906f,40.1758f,-66.4063f, +132.813f,39.5421f,-66.4063f, +136.719f,39.0437f,-66.4063f, +140.625f,37.1531f,-66.4063f, +144.531f,34.9841f,-66.4063f, +148.438f,33.2713f,-66.4063f, +152.344f,32.4185f,-66.4063f, +156.25f,31.779f,-66.4063f, +160.156f,30.7377f,-66.4063f, +164.063f,30.5524f,-66.4063f, +167.969f,29.5693f,-66.4063f, +171.875f,28.9756f,-66.4063f, +175.781f,27.4499f,-66.4063f, +179.688f,26.7907f,-66.4063f, +183.594f,25.5886f,-66.4063f, +187.5f,24.2807f,-66.4063f, +191.406f,22.1754f,-66.4063f, +195.313f,20.7766f,-66.4063f, +199.219f,19.914f,-66.4063f, +203.125f,17.149f,-66.4063f, +207.031f,14.0043f,-66.4063f, +210.938f,11.404f,-66.4063f, +214.844f,10.0012f,-66.4063f, +218.75f,8.65109f,-66.4063f, +222.656f,9.38897f,-66.4063f, +226.563f,9.4612f,-66.4063f, +230.469f,8.86613f,-66.4063f, +234.375f,8.68429f,-66.4063f, +238.281f,9.75985f,-66.4063f, +242.188f,10.3807f,-66.4063f, +246.094f,10.966f,-66.4063f, +250.0f,11.4354f,-66.4063f, +3.90625f,59.1482f,-70.3125f, +7.8125f,57.7892f,-70.3125f, +11.7188f,55.5839f,-70.3125f, +15.625f,54.3451f,-70.3125f, +19.5313f,52.0576f,-70.3125f, +23.4375f,50.5935f,-70.3125f, +27.3438f,50.8648f,-70.3125f, +31.25f,51.3182f,-70.3125f, +35.1563f,51.6726f,-70.3125f, +39.0625f,51.1264f,-70.3125f, +42.9688f,51.6239f,-70.3125f, +46.875f,49.728f,-70.3125f, +50.7813f,48.7924f,-70.3125f, +54.6875f,47.3884f,-70.3125f, +58.5938f,46.4477f,-70.3125f, +62.5f,45.2447f,-70.3125f, +66.4063f,42.8677f,-70.3125f, +70.3125f,40.9023f,-70.3125f, +74.2188f,39.5284f,-70.3125f, +78.125f,39.6524f,-70.3125f, +82.0313f,40.5173f,-70.3125f, +85.9375f,41.0204f,-70.3125f, +89.8438f,41.9366f,-70.3125f, +93.75f,42.1341f,-70.3125f, +97.6563f,41.4699f,-70.3125f, +101.563f,40.6754f,-70.3125f, +105.469f,41.2206f,-70.3125f, +109.375f,40.9668f,-70.3125f, +113.281f,41.1079f,-70.3125f, +117.188f,40.7056f,-70.3125f, +121.094f,39.8305f,-70.3125f, +125.0f,40.959f,-70.3125f, +128.906f,41.7481f,-70.3125f, +132.813f,41.1255f,-70.3125f, +136.719f,39.8634f,-70.3125f, +140.625f,37.8454f,-70.3125f, +144.531f,35.3914f,-70.3125f, +148.438f,33.8462f,-70.3125f, +152.344f,33.0994f,-70.3125f, +156.25f,32.4757f,-70.3125f, +160.156f,31.4779f,-70.3125f, +164.063f,29.4211f,-70.3125f, +167.969f,28.0779f,-70.3125f, +171.875f,27.802f,-70.3125f, +175.781f,26.7406f,-70.3125f, +179.688f,25.4777f,-70.3125f, +183.594f,24.7569f,-70.3125f, +187.5f,22.9331f,-70.3125f, +191.406f,21.2419f,-70.3125f, +195.313f,19.5082f,-70.3125f, +199.219f,17.6022f,-70.3125f, +203.125f,15.316f,-70.3125f, +207.031f,12.7546f,-70.3125f, +210.938f,10.3646f,-70.3125f, +214.844f,8.2502f,-70.3125f, +218.75f,8.14317f,-70.3125f, +222.656f,8.65089f,-70.3125f, +226.563f,8.60005f,-70.3125f, +230.469f,8.58165f,-70.3125f, +234.375f,9.40162f,-70.3125f, +238.281f,9.96281f,-70.3125f, +242.188f,9.81934f,-70.3125f, +246.094f,10.3078f,-70.3125f, +250.0f,10.4404f,-70.3125f, +3.90625f,56.5167f,-74.2188f, +7.8125f,55.7237f,-74.2188f, +11.7188f,53.4039f,-74.2188f, +15.625f,51.0313f,-74.2188f, +19.5313f,49.1141f,-74.2188f, +23.4375f,47.8398f,-74.2188f, +27.3438f,47.778f,-74.2188f, +31.25f,48.3917f,-74.2188f, +35.1563f,48.2503f,-74.2188f, +39.0625f,49.1497f,-74.2188f, +42.9688f,48.8224f,-74.2188f, +46.875f,47.4358f,-74.2188f, +50.7813f,47.051f,-74.2188f, +54.6875f,45.4218f,-74.2188f, +58.5938f,44.3385f,-74.2188f, +62.5f,42.9758f,-74.2188f, +66.4063f,41.4743f,-74.2188f, +70.3125f,39.4251f,-74.2188f, +74.2188f,37.5972f,-74.2188f, +78.125f,37.8246f,-74.2188f, +82.0313f,38.9578f,-74.2188f, +85.9375f,40.148f,-74.2188f, +89.8438f,41.1035f,-74.2188f, +93.75f,40.631f,-74.2188f, +97.6563f,40.0863f,-74.2188f, +101.563f,40.3273f,-74.2188f, +105.469f,40.0413f,-74.2188f, +109.375f,40.0514f,-74.2188f, +113.281f,39.4849f,-74.2188f, +117.188f,39.5903f,-74.2188f, +121.094f,40.1543f,-74.2188f, +125.0f,40.3424f,-74.2188f, +128.906f,41.779f,-74.2188f, +132.813f,41.4976f,-74.2188f, +136.719f,41.1475f,-74.2188f, +140.625f,38.8105f,-74.2188f, +144.531f,35.834f,-74.2188f, +148.438f,34.6385f,-74.2188f, +152.344f,33.7088f,-74.2188f, +156.25f,32.7137f,-74.2188f, +160.156f,30.7745f,-74.2188f, +164.063f,28.172f,-74.2188f, +167.969f,27.1433f,-74.2188f, +171.875f,26.7248f,-74.2188f, +175.781f,25.7807f,-74.2188f, +179.688f,24.8758f,-74.2188f, +183.594f,23.4994f,-74.2188f, +187.5f,23.3209f,-74.2188f, +191.406f,22.3523f,-74.2188f, +195.313f,20.3275f,-74.2188f, +199.219f,17.2927f,-74.2188f, +203.125f,15.0486f,-74.2188f, +207.031f,12.2721f,-74.2188f, +210.938f,9.60109f,-74.2188f, +214.844f,7.36411f,-74.2188f, +218.75f,7.27514f,-74.2188f, +222.656f,8.35951f,-74.2188f, +226.563f,8.18334f,-74.2188f, +230.469f,8.98708f,-74.2188f, +234.375f,8.98011f,-74.2188f, +238.281f,9.03329f,-74.2188f, +242.188f,8.88664f,-74.2188f, +246.094f,8.62938f,-74.2188f, +250.0f,9.6823f,-74.2188f, +3.90625f,54.4402f,-78.125f, +7.8125f,53.0525f,-78.125f, +11.7188f,51.2204f,-78.125f, +15.625f,48.7251f,-78.125f, +19.5313f,45.9841f,-78.125f, +23.4375f,45.0227f,-78.125f, +27.3438f,45.3099f,-78.125f, +31.25f,45.9225f,-78.125f, +35.1563f,46.8025f,-78.125f, +39.0625f,46.8434f,-78.125f, +42.9688f,46.0024f,-78.125f, +46.875f,45.6669f,-78.125f, +50.7813f,45.4624f,-78.125f, +54.6875f,43.4573f,-78.125f, +58.5938f,42.1273f,-78.125f, +62.5f,41.0088f,-78.125f, +66.4063f,38.8967f,-78.125f, +70.3125f,38.002f,-78.125f, +74.2188f,36.5282f,-78.125f, +78.125f,37.0499f,-78.125f, +82.0313f,37.3419f,-78.125f, +85.9375f,38.6056f,-78.125f, +89.8438f,39.7527f,-78.125f, +93.75f,40.3513f,-78.125f, +97.6563f,40.6919f,-78.125f, +101.563f,40.7736f,-78.125f, +105.469f,40.3007f,-78.125f, +109.375f,39.3023f,-78.125f, +113.281f,39.1369f,-78.125f, +117.188f,39.884f,-78.125f, +121.094f,40.5674f,-78.125f, +125.0f,40.8192f,-78.125f, +128.906f,41.893f,-78.125f, +132.813f,42.3647f,-78.125f, +136.719f,41.2455f,-78.125f, +140.625f,38.7064f,-78.125f, +144.531f,36.9679f,-78.125f, +148.438f,36.03f,-78.125f, +152.344f,33.9946f,-78.125f, +156.25f,32.2274f,-78.125f, +160.156f,30.474f,-78.125f, +164.063f,28.4739f,-78.125f, +167.969f,27.222f,-78.125f, +171.875f,26.6935f,-78.125f, +175.781f,25.0624f,-78.125f, +179.688f,24.162f,-78.125f, +183.594f,24.0176f,-78.125f, +187.5f,24.0379f,-78.125f, +191.406f,22.4301f,-78.125f, +195.313f,19.7078f,-78.125f, +199.219f,17.0911f,-78.125f, +203.125f,14.784f,-78.125f, +207.031f,11.8835f,-78.125f, +210.938f,9.34715f,-78.125f, +214.844f,7.23075f,-78.125f, +218.75f,7.91637f,-78.125f, +222.656f,8.69702f,-78.125f, +226.563f,8.56112f,-78.125f, +230.469f,9.86446f,-78.125f, +234.375f,9.26431f,-78.125f, +238.281f,8.47473f,-78.125f, +242.188f,7.8386f,-78.125f, +246.094f,7.82236f,-78.125f, +250.0f,8.68625f,-78.125f, +3.90625f,51.949f,-82.0313f, +7.8125f,50.1159f,-82.0313f, +11.7188f,48.9067f,-82.0313f, +15.625f,46.6417f,-82.0313f, +19.5313f,44.5725f,-82.0313f, +23.4375f,43.435f,-82.0313f, +27.3438f,43.6749f,-82.0313f, +31.25f,44.8399f,-82.0313f, +35.1563f,45.0253f,-82.0313f, +39.0625f,44.7335f,-82.0313f, +42.9688f,44.4485f,-82.0313f, +46.875f,44.8284f,-82.0313f, +50.7813f,43.5547f,-82.0313f, +54.6875f,41.2266f,-82.0313f, +58.5938f,40.4716f,-82.0313f, +62.5f,38.4361f,-82.0313f, +66.4063f,36.3554f,-82.0313f, +70.3125f,35.5722f,-82.0313f, +74.2188f,35.0069f,-82.0313f, +78.125f,35.8289f,-82.0313f, +82.0313f,37.0933f,-82.0313f, +85.9375f,38.1008f,-82.0313f, +89.8438f,38.9582f,-82.0313f, +93.75f,40.0751f,-82.0313f, +97.6563f,40.3989f,-82.0313f, +101.563f,40.2487f,-82.0313f, +105.469f,39.9234f,-82.0313f, +109.375f,40.0277f,-82.0313f, +113.281f,40.6647f,-82.0313f, +117.188f,40.69f,-82.0313f, +121.094f,40.7857f,-82.0313f, +125.0f,41.5688f,-82.0313f, +128.906f,41.836f,-82.0313f, +132.813f,41.6054f,-82.0313f, +136.719f,39.6237f,-82.0313f, +140.625f,38.6765f,-82.0313f, +144.531f,36.9959f,-82.0313f, +148.438f,35.8215f,-82.0313f, +152.344f,34.799f,-82.0313f, +156.25f,33.2398f,-82.0313f, +160.156f,30.7864f,-82.0313f, +164.063f,28.6776f,-82.0313f, +167.969f,26.6558f,-82.0313f, +171.875f,25.8282f,-82.0313f, +175.781f,24.7932f,-82.0313f, +179.688f,22.3283f,-82.0313f, +183.594f,23.1666f,-82.0313f, +187.5f,23.1721f,-82.0313f, +191.406f,21.3358f,-82.0313f, +195.313f,18.8226f,-82.0313f, +199.219f,16.5471f,-82.0313f, +203.125f,14.4667f,-82.0313f, +207.031f,11.1533f,-82.0313f, +210.938f,8.28389f,-82.0313f, +214.844f,8.02411f,-82.0313f, +218.75f,8.03784f,-82.0313f, +222.656f,8.27638f,-82.0313f, +226.563f,8.14824f,-82.0313f, +230.469f,8.45286f,-82.0313f, +234.375f,8.21959f,-82.0313f, +238.281f,8.25224f,-82.0313f, +242.188f,7.67129f,-82.0313f, +246.094f,8.04143f,-82.0313f, +250.0f,8.6199f,-82.0313f, +3.90625f,50.007f,-85.9375f, +7.8125f,48.4593f,-85.9375f, +11.7188f,46.0233f,-85.9375f, +15.625f,44.0556f,-85.9375f, +19.5313f,42.3324f,-85.9375f, +23.4375f,41.8982f,-85.9375f, +27.3438f,42.3931f,-85.9375f, +31.25f,43.1153f,-85.9375f, +35.1563f,43.1285f,-85.9375f, +39.0625f,43.422f,-85.9375f, +42.9688f,43.5417f,-85.9375f, +46.875f,42.2294f,-85.9375f, +50.7813f,40.9068f,-85.9375f, +54.6875f,39.4177f,-85.9375f, +58.5938f,37.2575f,-85.9375f, +62.5f,35.2254f,-85.9375f, +66.4063f,33.8821f,-85.9375f, +70.3125f,33.1531f,-85.9375f, +74.2188f,34.2747f,-85.9375f, +78.125f,35.599f,-85.9375f, +82.0313f,37.007f,-85.9375f, +85.9375f,37.5018f,-85.9375f, +89.8438f,38.1376f,-85.9375f, +93.75f,38.9449f,-85.9375f, +97.6563f,38.9221f,-85.9375f, +101.563f,38.8555f,-85.9375f, +105.469f,39.5572f,-85.9375f, +109.375f,40.1231f,-85.9375f, +113.281f,40.7416f,-85.9375f, +117.188f,40.3888f,-85.9375f, +121.094f,40.6715f,-85.9375f, +125.0f,40.7246f,-85.9375f, +128.906f,40.6124f,-85.9375f, +132.813f,39.685f,-85.9375f, +136.719f,39.2043f,-85.9375f, +140.625f,38.1816f,-85.9375f, +144.531f,36.598f,-85.9375f, +148.438f,36.2907f,-85.9375f, +152.344f,34.8832f,-85.9375f, +156.25f,33.4024f,-85.9375f, +160.156f,31.2463f,-85.9375f, +164.063f,29.1669f,-85.9375f, +167.969f,26.7298f,-85.9375f, +171.875f,24.3407f,-85.9375f, +175.781f,23.4854f,-85.9375f, +179.688f,21.3474f,-85.9375f, +183.594f,21.2953f,-85.9375f, +187.5f,21.7398f,-85.9375f, +191.406f,20.4218f,-85.9375f, +195.313f,17.9433f,-85.9375f, +199.219f,15.3133f,-85.9375f, +203.125f,13.0586f,-85.9375f, +207.031f,9.24996f,-85.9375f, +210.938f,7.18408f,-85.9375f, +214.844f,7.59758f,-85.9375f, +218.75f,8.04641f,-85.9375f, +222.656f,8.01634f,-85.9375f, +226.563f,7.95015f,-85.9375f, +230.469f,7.86343f,-85.9375f, +234.375f,6.21751f,-85.9375f, +238.281f,7.40112f,-85.9375f, +242.188f,7.60481f,-85.9375f, +246.094f,6.77129f,-85.9375f, +250.0f,7.87753f,-85.9375f, +3.90625f,47.6596f,-89.8438f, +7.8125f,45.9136f,-89.8438f, +11.7188f,44.0495f,-89.8438f, +15.625f,42.5127f,-89.8438f, +19.5313f,41.5996f,-89.8438f, +23.4375f,41.2638f,-89.8438f, +27.3438f,41.2672f,-89.8438f, +31.25f,41.5402f,-89.8438f, +35.1563f,42.558f,-89.8438f, +39.0625f,42.49f,-89.8438f, +42.9688f,42.2839f,-89.8438f, +46.875f,40.9401f,-89.8438f, +50.7813f,38.7346f,-89.8438f, +54.6875f,36.624f,-89.8438f, +58.5938f,35.1978f,-89.8438f, +62.5f,34.9272f,-89.8438f, +66.4063f,32.893f,-89.8438f, +70.3125f,32.4101f,-89.8438f, +74.2188f,33.9814f,-89.8438f, +78.125f,35.8825f,-89.8438f, +82.0313f,37.1245f,-89.8438f, +85.9375f,37.3954f,-89.8438f, +89.8438f,38.0118f,-89.8438f, +93.75f,37.5426f,-89.8438f, +97.6563f,38.0776f,-89.8438f, +101.563f,37.9785f,-89.8438f, +105.469f,38.6389f,-89.8438f, +109.375f,39.284f,-89.8438f, +113.281f,40.0027f,-89.8438f, +117.188f,41.2412f,-89.8438f, +121.094f,41.2301f,-89.8438f, +125.0f,40.7611f,-89.8438f, +128.906f,39.7426f,-89.8438f, +132.813f,39.1387f,-89.8438f, +136.719f,38.499f,-89.8438f, +140.625f,37.714f,-89.8438f, +144.531f,36.6379f,-89.8438f, +148.438f,36.1196f,-89.8438f, +152.344f,35.7001f,-89.8438f, +156.25f,33.9038f,-89.8438f, +160.156f,32.0706f,-89.8438f, +164.063f,29.746f,-89.8438f, +167.969f,26.4482f,-89.8438f, +171.875f,23.8046f,-89.8438f, +175.781f,21.9675f,-89.8438f, +179.688f,20.7011f,-89.8438f, +183.594f,20.6699f,-89.8438f, +187.5f,20.1508f,-89.8438f, +191.406f,17.8245f,-89.8438f, +195.313f,16.2785f,-89.8438f, +199.219f,13.4596f,-89.8438f, +203.125f,9.54647f,-89.8438f, +207.031f,6.02727f,-89.8438f, +210.938f,5.88903f,-89.8438f, +214.844f,6.47568f,-89.8438f, +218.75f,6.20004f,-89.8438f, +222.656f,6.0849f,-89.8438f, +226.563f,6.84648f,-89.8438f, +230.469f,6.3424f,-89.8438f, +234.375f,5.81853f,-89.8438f, +238.281f,5.89205f,-89.8438f, +242.188f,6.84078f,-89.8438f, +246.094f,6.32426f,-89.8438f, +250.0f,6.29368f,-89.8438f, +3.90625f,45.4182f,-93.75f, +7.8125f,44.5664f,-93.75f, +11.7188f,44.0207f,-93.75f, +15.625f,42.2553f,-93.75f, +19.5313f,40.8951f,-93.75f, +23.4375f,40.7665f,-93.75f, +27.3438f,40.5756f,-93.75f, +31.25f,41.2988f,-93.75f, +35.1563f,40.6862f,-93.75f, +39.0625f,40.6007f,-93.75f, +42.9688f,39.5329f,-93.75f, +46.875f,38.2364f,-93.75f, +50.7813f,36.1442f,-93.75f, +54.6875f,34.7353f,-93.75f, +58.5938f,34.4214f,-93.75f, +62.5f,33.9528f,-93.75f, +66.4063f,32.4931f,-93.75f, +70.3125f,32.5145f,-93.75f, +74.2188f,33.393f,-93.75f, +78.125f,34.9658f,-93.75f, +82.0313f,36.3611f,-93.75f, +85.9375f,37.568f,-93.75f, +89.8438f,37.012f,-93.75f, +93.75f,37.6392f,-93.75f, +97.6563f,38.4371f,-93.75f, +101.563f,38.3719f,-93.75f, +105.469f,39.1179f,-93.75f, +109.375f,38.5168f,-93.75f, +113.281f,40.0403f,-93.75f, +117.188f,40.2277f,-93.75f, +121.094f,40.8985f,-93.75f, +125.0f,40.189f,-93.75f, +128.906f,39.9435f,-93.75f, +132.813f,39.6824f,-93.75f, +136.719f,38.844f,-93.75f, +140.625f,37.4579f,-93.75f, +144.531f,36.8375f,-93.75f, +148.438f,36.2601f,-93.75f, +152.344f,35.6484f,-93.75f, +156.25f,34.179f,-93.75f, +160.156f,32.0651f,-93.75f, +164.063f,28.6431f,-93.75f, +167.969f,25.1239f,-93.75f, +171.875f,22.4459f,-93.75f, +175.781f,19.5301f,-93.75f, +179.688f,18.4371f,-93.75f, +183.594f,18.6076f,-93.75f, +187.5f,17.488f,-93.75f, +191.406f,15.1604f,-93.75f, +195.313f,13.0197f,-93.75f, +199.219f,9.4702f,-93.75f, +203.125f,5.597f,-93.75f, +207.031f,3.59409f,-93.75f, +210.938f,4.28966f,-93.75f, +214.844f,4.21811f,-93.75f, +218.75f,4.11546f,-93.75f, +222.656f,5.40815f,-93.75f, +226.563f,5.56249f,-93.75f, +230.469f,5.35075f,-93.75f, +234.375f,5.24306f,-93.75f, +238.281f,4.85548f,-93.75f, +242.188f,5.02825f,-93.75f, +246.094f,5.32318f,-93.75f, +250.0f,5.59512f,-93.75f, +3.90625f,44.9637f,-97.6563f, +7.8125f,44.7813f,-97.6563f, +11.7188f,43.457f,-97.6563f, +15.625f,42.5329f,-97.6563f, +19.5313f,40.506f,-97.6563f, +23.4375f,39.8146f,-97.6563f, +27.3438f,40.2245f,-97.6563f, +31.25f,39.497f,-97.6563f, +35.1563f,38.8152f,-97.6563f, +39.0625f,38.3406f,-97.6563f, +42.9688f,37.57f,-97.6563f, +46.875f,36.3128f,-97.6563f, +50.7813f,34.2277f,-97.6563f, +54.6875f,33.3395f,-97.6563f, +58.5938f,32.972f,-97.6563f, +62.5f,32.6315f,-97.6563f, +66.4063f,32.4796f,-97.6563f, +70.3125f,31.6472f,-97.6563f, +74.2188f,32.2256f,-97.6563f, +78.125f,33.8073f,-97.6563f, +82.0313f,35.7591f,-97.6563f, +85.9375f,36.5001f,-97.6563f, +89.8438f,36.9113f,-97.6563f, +93.75f,37.6902f,-97.6563f, +97.6563f,37.9643f,-97.6563f, +101.563f,38.9556f,-97.6563f, +105.469f,39.6823f,-97.6563f, +109.375f,38.9917f,-97.6563f, +113.281f,40.0872f,-97.6563f, +117.188f,40.44f,-97.6563f, +121.094f,39.6877f,-97.6563f, +125.0f,39.0011f,-97.6563f, +128.906f,39.8735f,-97.6563f, +132.813f,39.5503f,-97.6563f, +136.719f,37.743f,-97.6563f, +140.625f,36.4691f,-97.6563f, +144.531f,36.1765f,-97.6563f, +148.438f,35.9476f,-97.6563f, +152.344f,35.1141f,-97.6563f, +156.25f,33.2516f,-97.6563f, +160.156f,30.654f,-97.6563f, +164.063f,27.2318f,-97.6563f, +167.969f,23.3975f,-97.6563f, +171.875f,20.6722f,-97.6563f, +175.781f,18.394f,-97.6563f, +179.688f,17.6475f,-97.6563f, +183.594f,16.1037f,-97.6563f, +187.5f,14.761f,-97.6563f, +191.406f,12.2456f,-97.6563f, +195.313f,9.43327f,-97.6563f, +199.219f,6.9118f,-97.6563f, +203.125f,4.26334f,-97.6563f, +207.031f,3.47413f,-97.6563f, +210.938f,3.74872f,-97.6563f, +214.844f,3.7631f,-97.6563f, +218.75f,3.80513f,-97.6563f, +222.656f,4.23443f,-97.6563f, +226.563f,3.71016f,-97.6563f, +230.469f,3.772f,-97.6563f, +234.375f,3.80374f,-97.6563f, +238.281f,3.70762f,-97.6563f, +242.188f,4.23931f,-97.6563f, +246.094f,4.40519f,-97.6563f, +250.0f,4.5119f,-97.6563f, +3.90625f,44.5311f,-101.563f, +7.8125f,44.4181f,-101.563f, +11.7188f,43.4864f,-101.563f, +15.625f,42.259f,-101.563f, +19.5313f,41.0558f,-101.563f, +23.4375f,39.9996f,-101.563f, +27.3438f,39.3917f,-101.563f, +31.25f,39.5691f,-101.563f, +35.1563f,37.0889f,-101.563f, +39.0625f,36.4296f,-101.563f, +42.9688f,36.543f,-101.563f, +46.875f,35.4365f,-101.563f, +50.7813f,33.3641f,-101.563f, +54.6875f,32.0629f,-101.563f, +58.5938f,32.175f,-101.563f, +62.5f,32.775f,-101.563f, +66.4063f,31.6335f,-101.563f, +70.3125f,32.1001f,-101.563f, +74.2188f,32.5906f,-101.563f, +78.125f,33.1502f,-101.563f, +82.0313f,35.1972f,-101.563f, +85.9375f,36.0132f,-101.563f, +89.8438f,37.3442f,-101.563f, +93.75f,37.6109f,-101.563f, +97.6563f,38.1601f,-101.563f, +101.563f,39.77f,-101.563f, +105.469f,39.6862f,-101.563f, +109.375f,39.4829f,-101.563f, +113.281f,40.1383f,-101.563f, +117.188f,40.8908f,-101.563f, +121.094f,39.3517f,-101.563f, +125.0f,38.9321f,-101.563f, +128.906f,39.2537f,-101.563f, +132.813f,38.4876f,-101.563f, +136.719f,36.6755f,-101.563f, +140.625f,35.2803f,-101.563f, +144.531f,35.8754f,-101.563f, +148.438f,36.2761f,-101.563f, +152.344f,34.7815f,-101.563f, +156.25f,32.2662f,-101.563f, +160.156f,29.8191f,-101.563f, +164.063f,25.8929f,-101.563f, +167.969f,22.552f,-101.563f, +171.875f,20.3186f,-101.563f, +175.781f,17.2917f,-101.563f, +179.688f,16.8305f,-101.563f, +183.594f,14.7168f,-101.563f, +187.5f,12.0609f,-101.563f, +191.406f,9.91022f,-101.563f, +195.313f,7.22029f,-101.563f, +199.219f,5.48379f,-101.563f, +203.125f,3.03759f,-101.563f, +207.031f,3.02148f,-101.563f, +210.938f,2.88667f,-101.563f, +214.844f,3.08795f,-101.563f, +218.75f,3.43814f,-101.563f, +222.656f,3.58591f,-101.563f, +226.563f,3.17855f,-101.563f, +230.469f,2.48711f,-101.563f, +234.375f,2.66471f,-101.563f, +238.281f,2.06432f,-101.563f, +242.188f,2.49704f,-101.563f, +246.094f,3.05219f,-101.563f, +250.0f,3.69155f,-101.563f, +3.90625f,44.8466f,-105.469f, +7.8125f,44.3102f,-105.469f, +11.7188f,43.8936f,-105.469f, +15.625f,43.2285f,-105.469f, +19.5313f,42.7384f,-105.469f, +23.4375f,41.2954f,-105.469f, +27.3438f,39.4813f,-105.469f, +31.25f,38.4483f,-105.469f, +35.1563f,35.8264f,-105.469f, +39.0625f,35.0991f,-105.469f, +42.9688f,35.1929f,-105.469f, +46.875f,34.3044f,-105.469f, +50.7813f,31.4169f,-105.469f, +54.6875f,30.8206f,-105.469f, +58.5938f,31.2902f,-105.469f, +62.5f,32.2869f,-105.469f, +66.4063f,32.5121f,-105.469f, +70.3125f,32.772f,-105.469f, +74.2188f,32.5422f,-105.469f, +78.125f,34.0506f,-105.469f, +82.0313f,35.4894f,-105.469f, +85.9375f,36.753f,-105.469f, +89.8438f,37.6901f,-105.469f, +93.75f,37.848f,-105.469f, +97.6563f,38.9724f,-105.469f, +101.563f,40.0724f,-105.469f, +105.469f,39.7381f,-105.469f, +109.375f,39.3905f,-105.469f, +113.281f,39.8577f,-105.469f, +117.188f,40.4957f,-105.469f, +121.094f,39.554f,-105.469f, +125.0f,39.0384f,-105.469f, +128.906f,38.2112f,-105.469f, +132.813f,36.7141f,-105.469f, +136.719f,34.736f,-105.469f, +140.625f,34.2236f,-105.469f, +144.531f,35.4181f,-105.469f, +148.438f,35.4456f,-105.469f, +152.344f,33.4389f,-105.469f, +156.25f,29.9708f,-105.469f, +160.156f,27.2392f,-105.469f, +164.063f,24.3409f,-105.469f, +167.969f,22.4438f,-105.469f, +171.875f,19.5326f,-105.469f, +175.781f,16.9951f,-105.469f, +179.688f,14.77f,-105.469f, +183.594f,13.1816f,-105.469f, +187.5f,10.3711f,-105.469f, +191.406f,7.10511f,-105.469f, +195.313f,5.43711f,-105.469f, +199.219f,3.35463f,-105.469f, +203.125f,2.41276f,-105.469f, +207.031f,2.35357f,-105.469f, +210.938f,2.28627f,-105.469f, +214.844f,1.61561f,-105.469f, +218.75f,2.61087f,-105.469f, +222.656f,2.34638f,-105.469f, +226.563f,1.47074f,-105.469f, +230.469f,0.63025f,-105.469f, +234.375f,0.847991f,-105.469f, +238.281f,1.35199f,-105.469f, +242.188f,2.21032f,-105.469f, +246.094f,3.01323f,-105.469f, +250.0f,3.12713f,-105.469f, +3.90625f,45.3987f,-109.375f, +7.8125f,44.6273f,-109.375f, +11.7188f,44.5674f,-109.375f, +15.625f,44.2998f,-109.375f, +19.5313f,43.5383f,-109.375f, +23.4375f,42.0306f,-109.375f, +27.3438f,40.7068f,-109.375f, +31.25f,39.6497f,-109.375f, +35.1563f,36.2161f,-109.375f, +39.0625f,34.8769f,-109.375f, +42.9688f,35.1989f,-109.375f, +46.875f,33.9714f,-109.375f, +50.7813f,30.9979f,-109.375f, +54.6875f,31.9366f,-109.375f, +58.5938f,31.5755f,-109.375f, +62.5f,31.572f,-109.375f, +66.4063f,33.0668f,-109.375f, +70.3125f,33.6444f,-109.375f, +74.2188f,32.5467f,-109.375f, +78.125f,34.2686f,-109.375f, +82.0313f,36.0633f,-109.375f, +85.9375f,37.5569f,-109.375f, +89.8438f,38.5599f,-109.375f, +93.75f,38.6708f,-109.375f, +97.6563f,39.2558f,-109.375f, +101.563f,39.9111f,-109.375f, +105.469f,39.9236f,-109.375f, +109.375f,39.5666f,-109.375f, +113.281f,40.1532f,-109.375f, +117.188f,40.8773f,-109.375f, +121.094f,40.133f,-109.375f, +125.0f,38.348f,-109.375f, +128.906f,36.9174f,-109.375f, +132.813f,34.8975f,-109.375f, +136.719f,32.9097f,-109.375f, +140.625f,32.6666f,-109.375f, +144.531f,33.1207f,-109.375f, +148.438f,32.6024f,-109.375f, +152.344f,31.1149f,-109.375f, +156.25f,27.7885f,-109.375f, +160.156f,24.9665f,-109.375f, +164.063f,22.789f,-109.375f, +167.969f,20.4907f,-109.375f, +171.875f,18.2402f,-109.375f, +175.781f,15.9409f,-109.375f, +179.688f,12.7122f,-109.375f, +183.594f,10.9582f,-109.375f, +187.5f,7.47226f,-109.375f, +191.406f,4.87747f,-109.375f, +195.313f,2.78589f,-109.375f, +199.219f,1.53429f,-109.375f, +203.125f,1.61775f,-109.375f, +207.031f,1.772f,-109.375f, +210.938f,1.15444f,-109.375f, +214.844f,0.342505f,-109.375f, +218.75f,0.510183f,-109.375f, +222.656f,0.254977f,-109.375f, +226.563f,-0.22727f,-109.375f, +230.469f,-0.840625f,-109.375f, +234.375f,-0.282154f,-109.375f, +238.281f,0.424945f,-109.375f, +242.188f,1.73577f,-109.375f, +246.094f,1.80217f,-109.375f, +250.0f,1.60105f,-109.375f, +3.90625f,47.4869f,-113.281f, +7.8125f,46.3185f,-113.281f, +11.7188f,46.4911f,-113.281f, +15.625f,45.2506f,-113.281f, +19.5313f,43.7939f,-113.281f, +23.4375f,42.6062f,-113.281f, +27.3438f,41.6674f,-113.281f, +31.25f,39.5196f,-113.281f, +35.1563f,36.6784f,-113.281f, +39.0625f,35.8546f,-113.281f, +42.9688f,35.2647f,-113.281f, +46.875f,33.0882f,-113.281f, +50.7813f,31.1331f,-113.281f, +54.6875f,31.9095f,-113.281f, +58.5938f,31.5715f,-113.281f, +62.5f,32.3642f,-113.281f, +66.4063f,33.2578f,-113.281f, +70.3125f,33.1847f,-113.281f, +74.2188f,33.6624f,-113.281f, +78.125f,35.6582f,-113.281f, +82.0313f,36.7989f,-113.281f, +85.9375f,37.9951f,-113.281f, +89.8438f,38.7063f,-113.281f, +93.75f,39.9727f,-113.281f, +97.6563f,39.641f,-113.281f, +101.563f,40.1318f,-113.281f, +105.469f,40.117f,-113.281f, +109.375f,40.0678f,-113.281f, +113.281f,40.1534f,-113.281f, +117.188f,40.7841f,-113.281f, +121.094f,39.3312f,-113.281f, +125.0f,38.1823f,-113.281f, +128.906f,37.0921f,-113.281f, +132.813f,34.9687f,-113.281f, +136.719f,32.6631f,-113.281f, +140.625f,30.9601f,-113.281f, +144.531f,31.0644f,-113.281f, +148.438f,29.6495f,-113.281f, +152.344f,27.5095f,-113.281f, +156.25f,24.9361f,-113.281f, +160.156f,22.6206f,-113.281f, +164.063f,20.1136f,-113.281f, +167.969f,17.9862f,-113.281f, +171.875f,16.1252f,-113.281f, +175.781f,14.2991f,-113.281f, +179.688f,11.4262f,-113.281f, +183.594f,8.55749f,-113.281f, +187.5f,6.02067f,-113.281f, +191.406f,3.1883f,-113.281f, +195.313f,1.54808f,-113.281f, +199.219f,0.0223479f,-113.281f, +203.125f,-0.0807506f,-113.281f, +207.031f,-0.420855f,-113.281f, +210.938f,-0.531322f,-113.281f, +214.844f,-1.34393f,-113.281f, +218.75f,-2.28346f,-113.281f, +222.656f,-2.245f,-113.281f, +226.563f,-2.22932f,-113.281f, +230.469f,-1.47268f,-113.281f, +234.375f,-0.543695f,-113.281f, +238.281f,-0.391948f,-113.281f, +242.188f,-0.270077f,-113.281f, +246.094f,-0.650629f,-113.281f, +250.0f,0.111517f,-113.281f, +3.90625f,48.3887f,-117.188f, +7.8125f,48.004f,-117.188f, +11.7188f,46.8723f,-117.188f, +15.625f,45.5005f,-117.188f, +19.5313f,43.3644f,-117.188f, +23.4375f,42.3352f,-117.188f, +27.3438f,41.1562f,-117.188f, +31.25f,39.1736f,-117.188f, +35.1563f,38.0627f,-117.188f, +39.0625f,36.4728f,-117.188f, +42.9688f,34.8001f,-117.188f, +46.875f,32.5103f,-117.188f, +50.7813f,31.6328f,-117.188f, +54.6875f,31.6106f,-117.188f, +58.5938f,32.3004f,-117.188f, +62.5f,32.696f,-117.188f, +66.4063f,33.3795f,-117.188f, +70.3125f,33.9696f,-117.188f, +74.2188f,34.9211f,-117.188f, +78.125f,36.7686f,-117.188f, +82.0313f,37.7676f,-117.188f, +85.9375f,37.8174f,-117.188f, +89.8438f,38.2878f,-117.188f, +93.75f,39.6151f,-117.188f, +97.6563f,39.7422f,-117.188f, +101.563f,40.9611f,-117.188f, +105.469f,40.8932f,-117.188f, +109.375f,40.6603f,-117.188f, +113.281f,40.2935f,-117.188f, +117.188f,39.8681f,-117.188f, +121.094f,39.0965f,-117.188f, +125.0f,37.1333f,-117.188f, +128.906f,35.5222f,-117.188f, +132.813f,33.9068f,-117.188f, +136.719f,32.2618f,-117.188f, +140.625f,29.8657f,-117.188f, +144.531f,28.1704f,-117.188f, +148.438f,27.1495f,-117.188f, +152.344f,24.5217f,-117.188f, +156.25f,22.0419f,-117.188f, +160.156f,19.9238f,-117.188f, +164.063f,17.6875f,-117.188f, +167.969f,15.5636f,-117.188f, +171.875f,13.5497f,-117.188f, +175.781f,11.2761f,-117.188f, +179.688f,8.95864f,-117.188f, +183.594f,7.04623f,-117.188f, +187.5f,4.83635f,-117.188f, +191.406f,2.76046f,-117.188f, +195.313f,0.190119f,-117.188f, +199.219f,-0.558379f,-117.188f, +203.125f,-1.03303f,-117.188f, +207.031f,-2.17563f,-117.188f, +210.938f,-1.91155f,-117.188f, +214.844f,-3.00018f,-117.188f, +218.75f,-4.26691f,-117.188f, +222.656f,-5.15855f,-117.188f, +226.563f,-3.46348f,-117.188f, +230.469f,-2.16077f,-117.188f, +234.375f,-1.47785f,-117.188f, +238.281f,-1.78424f,-117.188f, +242.188f,-1.00317f,-117.188f, +246.094f,-1.97981f,-117.188f, +250.0f,-2.29372f,-117.188f, +}; + +btScalar Landscape03Nml[] = { +-0.0301669f,0.913898f,-0.404822f, +0.0925944f,0.901922f,-0.421856f, +0.0550338f,0.955133f,-0.291019f, +0.163554f,0.924847f,-0.343379f, +-0.00160556f,0.985516f,-0.169577f, +0.0975687f,0.967908f,-0.23159f, +-0.0718641f,0.997324f,-0.0134097f, +0.108884f,0.992259f,0.0597208f, +-0.0649193f,0.987727f,0.142057f, +-0.0923076f,0.995503f,-0.0212622f, +-0.212176f,0.966905f,0.141687f, +-0.135924f,0.982555f,0.126925f, +-0.248136f,0.950917f,0.184892f, +-0.114969f,0.937595f,0.328173f, +-0.0596382f,0.954355f,0.292661f, +-0.0673134f,0.931098f,0.358506f, +-0.100514f,0.963905f,0.246544f, +-0.237357f,0.960335f,0.146353f, +-0.210275f,0.964506f,0.159726f, +-0.243879f,0.969407f,-0.027797f, +-0.0995316f,0.963559f,0.248291f, +0.0232774f,0.986211f,0.163848f, +-0.0780955f,0.939808f,0.33266f, +0.0143543f,0.937354f,0.348083f, +-0.242603f,0.911487f,0.332166f, +-0.217791f,0.899583f,0.378572f, +-0.259297f,0.919695f,0.294833f, +-0.235372f,0.900382f,0.365939f, +0.0548314f,0.924698f,0.376733f, +0.17577f,0.83537f,0.520828f, +0.183628f,0.8685f,0.460423f, +0.206319f,0.791195f,0.57571f, +0.291585f,0.831097f,0.473557f, +0.258977f,0.806104f,0.532097f, +0.406441f,0.807616f,0.427274f, +0.279416f,0.89888f,0.337552f, +0.161449f,0.944511f,0.286064f, +-0.0153595f,0.999467f,0.0288015f, +0.0344442f,0.986316f,0.16123f, +0.0228147f,0.999694f,-0.00950936f, +0.221267f,0.961345f,0.163882f, +0.262982f,0.961437f,0.0804904f, +0.292545f,0.943495f,0.155677f, +0.287728f,0.952627f,0.0985627f, +0.338791f,0.935036f,0.104535f, +0.332042f,0.939101f,0.0885263f, +0.395865f,0.914692f,0.0814219f, +0.342439f,0.937891f,0.0556409f, +0.24643f,0.967531f,-0.0561722f, +0.155524f,0.980084f,-0.12348f, +0.12756f,0.989194f,-0.0722747f, +0.141529f,0.984734f,-0.10133f, +0.0842668f,0.99539f,-0.0458028f, +0.00840046f,0.967846f,-0.251403f, +0.0723924f,0.995277f,-0.0646756f, +0.161395f,0.974624f,-0.155111f, +0.168526f,0.983485f,0.0660013f, +0.32936f,0.929371f,0.166709f, +0.334018f,0.924548f,0.18342f, +0.39263f,0.883836f,0.254313f, +0.373683f,0.906029f,0.198675f, +0.318503f,0.931732f,0.174444f, +0.214891f,0.969497f,0.117891f, +0.248914f,0.936934f,0.245348f, +0.199074f,0.96113f,0.19131f, +0.293417f,0.893252f,0.340597f, +0.339667f,0.873015f,0.349959f, +0.354613f,0.873548f,0.333412f, +0.457963f,0.824157f,0.333219f, +0.455319f,0.825254f,0.334127f, +0.52695f,0.805593f,0.270821f, +0.439193f,0.858556f,0.264557f, +0.401282f,0.908751f,0.114652f, +0.249111f,0.965853f,-0.0712114f, +0.0897089f,0.991664f,0.0924929f, +0.0376765f,0.979393f,-0.19842f, +-0.126991f,0.990951f,0.0434627f, +-0.217753f,0.933113f,-0.286154f, +-0.167574f,0.97576f,-0.140749f, +-0.203937f,0.914317f,-0.349907f, +-0.0608955f,0.980207f,-0.188379f, +-0.0120075f,0.947447f,-0.319686f, +0.167601f,0.980952f,-0.0982003f, +0.212052f,0.945824f,-0.245868f, +0.218606f,0.972968f,-0.0744646f, +0.212851f,0.953898f,-0.211596f, +0.171647f,0.974969f,-0.141323f, +0.199197f,0.967793f,-0.153938f, +0.200412f,0.972091f,-0.121957f, +0.23265f,0.963849f,-0.129883f, +0.296235f,0.953212f,-0.060261f, +0.314311f,0.946698f,-0.0705058f, +0.404868f,0.912189f,-0.0631982f, +0.403087f,0.912504f,-0.0696997f, +0.463227f,0.884095f,-0.0616207f, +0.39479f,0.897802f,-0.195171f, +0.35121f,0.926619f,-0.13427f, +0.220773f,0.898508f,-0.379398f, +0.189824f,0.93595f,-0.296589f, +0.0483901f,0.855509f,-0.515522f, +0.0904515f,0.884685f,-0.457329f, +0.120283f,0.865017f,-0.487112f, +0.203986f,0.900002f,-0.385209f, +0.248454f,0.881227f,-0.402131f, +0.178575f,0.929214f,-0.323532f, +0.0792679f,0.824417f,-0.560404f, +0.115378f,0.950213f,-0.289454f, +0.0725597f,0.807744f,-0.585051f, +0.0327706f,0.953791f,-0.298679f, +0.0099385f,0.78612f,-0.617994f, +0.0403637f,0.952173f,-0.302881f, +0.215114f,0.87002f,-0.443611f, +0.182967f,0.972742f,-0.142465f, +0.292542f,0.923312f,-0.248827f, +0.159782f,0.983577f,-0.0839386f, +0.255356f,0.959339f,-0.120256f, +0.180088f,0.983508f,0.0167535f, +0.210595f,0.975243f,-0.0674566f, +0.305089f,0.951559f,0.0381592f, +0.342154f,0.939613f,0.00764387f, +0.44387f,0.894627f,0.0512048f, +0.377004f,0.921573f,-0.0925792f, +0.197535f,0.978807f,-0.0540106f, +0.128094f,0.953819f,-0.271702f, +0.10228f,0.991256f,-0.0833686f, +0.111348f,0.971755f,-0.208074f, +0.120727f,0.982203f,-0.143886f, +0.131919f,0.971754f,-0.195681f, +-0.118481f,0.971727f,-0.204228f, +-0.131824f,0.977685f,-0.163569f, +-0.0725384f,0.997366f,-0.000133281f, +-0.204047f,0.978951f,0.00446862f, +-0.227431f,0.966677f,0.117515f, +-0.137601f,0.963906f,0.227929f, +-0.242399f,0.965055f,0.0995586f, +-0.153062f,0.97808f,0.141178f, +-0.129415f,0.948353f,0.289617f, +-0.22442f,0.902886f,0.366649f, +-0.173979f,0.92147f,0.34731f, +-0.0318649f,0.93595f,0.350687f, +-0.176397f,0.955508f,0.236408f, +-0.254551f,0.956811f,0.140418f, +-0.0162894f,0.984782f,0.173032f, +0.167302f,0.961803f,0.216667f, +0.267797f,0.948626f,0.168505f, +0.412955f,0.869957f,0.269525f, +0.258065f,0.893814f,0.366742f, +0.124905f,0.932115f,0.339941f, +0.234805f,0.927845f,0.289777f, +0.325979f,0.90761f,0.264542f, +0.401458f,0.890435f,0.214374f, +0.44845f,0.886659f,0.112823f, +0.337292f,0.940965f,0.0286028f, +0.110729f,0.992952f,-0.0422648f, +0.0165495f,0.996512f,-0.0817925f, +0.0843804f,0.994583f,-0.0606957f, +0.1131f,0.990749f,-0.0749933f, +0.241223f,0.970417f,0.0100747f, +0.396578f,0.902933f,0.165644f, +0.324808f,0.936808f,0.129963f, +0.0728626f,0.997053f,0.0240034f, +0.167633f,0.975741f,0.140815f, +0.474631f,0.846984f,0.239465f, +0.567824f,0.786908f,0.24156f, +0.402496f,0.873451f,0.274008f, +0.0459982f,0.950641f,0.306865f, +-0.0582337f,0.962437f,0.265188f, +0.030037f,0.970181f,0.240514f, +-0.0533502f,0.992438f,0.110548f, +0.0995416f,0.988544f,0.11346f, +0.255626f,0.959556f,0.11793f, +0.26735f,0.961569f,0.0625254f, +0.18836f,0.981833f,-0.0228855f, +0.278864f,0.958778f,-0.0545789f, +0.407529f,0.909061f,-0.086769f, +0.427129f,0.902011f,-0.0627458f, +0.408272f,0.912551f,-0.0237565f, +0.36375f,0.922794f,-0.127037f, +0.266363f,0.919721f,-0.28838f, +0.0788795f,0.927162f,-0.366263f, +0.0391177f,0.978258f,-0.20367f, +0.0160429f,0.996725f,-0.0792609f, +0.0608773f,0.998141f,0.00292939f, +0.025245f,0.998361f,-0.0513526f, +0.140845f,0.988959f,-0.046063f, +0.138979f,0.986427f,-0.0874468f, +0.128983f,0.987322f,-0.0925141f, +0.303074f,0.948227f,-0.0949297f, +0.392011f,0.918105f,-0.0584085f, +0.26566f,0.960779f,0.0795528f, +0.166068f,0.98603f,-0.0129125f, +0.262845f,0.962536f,-0.0666132f, +-0.104783f,0.989703f,0.0975085f, +-0.153604f,0.984769f,0.0814646f, +-0.17021f,0.98292f,0.0699758f, +-0.192965f,0.974203f,0.117018f, +-0.286836f,0.952199f,0.105086f, +-0.195248f,0.969752f,0.146488f, +-0.150662f,0.967412f,0.203504f, +-0.264752f,0.950334f,0.163619f, +-0.315905f,0.913283f,0.257134f, +-0.224744f,0.91965f,0.322078f, +-0.108929f,0.947464f,0.300743f, +0.0128823f,0.944776f,0.327463f, +-0.0190359f,0.964202f,0.264485f, +-0.187346f,0.97974f,0.0707926f, +-0.0647113f,0.997854f,-0.0100069f, +0.163923f,0.98566f,0.0400324f, +0.299244f,0.952147f,0.0622031f, +0.300231f,0.948028f,0.105378f, +0.182306f,0.951449f,0.248009f, +0.15023f,0.937487f,0.313924f, +0.264855f,0.926023f,0.268948f, +0.322593f,0.919374f,0.225135f, +0.43093f,0.873406f,0.22685f, +0.536094f,0.828094f,0.163899f, +0.40435f,0.914491f,0.0144028f, +0.203744f,0.975451f,-0.0835749f, +0.102706f,0.983162f,-0.151145f, +0.0912494f,0.98262f,-0.161654f, +0.0714052f,0.991795f,-0.106042f, +0.113839f,0.992199f,-0.0508211f, +0.266818f,0.963676f,0.0116937f, +0.379059f,0.920849f,0.091386f, +0.155245f,0.98775f,0.0158058f, +0.135484f,0.989724f,-0.0457313f, +0.394833f,0.917954f,-0.0383045f, +0.510875f,0.847518f,0.143943f, +0.369724f,0.884704f,0.283906f, +0.16927f,0.926331f,0.336538f, +-0.0368298f,0.974452f,0.221557f, +0.0247064f,0.955492f,0.293981f, +0.0101397f,0.960739f,0.27727f, +0.120365f,0.954563f,0.272621f, +0.285189f,0.933274f,0.218327f, +0.27356f,0.947401f,0.16612f, +0.298803f,0.939862f,0.165455f, +0.344494f,0.938521f,0.0223999f, +0.423232f,0.90602f,-0.00171397f, +0.428479f,0.903517f,-0.00795118f, +0.445837f,0.889867f,-0.0967762f, +0.420806f,0.885752f,-0.195872f, +0.361482f,0.916002f,-0.173987f, +0.0888846f,0.94798f,-0.305668f, +-0.104291f,0.938663f,-0.328687f, +-0.0525896f,0.969771f,-0.238281f, +0.0233793f,0.980465f,-0.1953f, +0.0772242f,0.980658f,-0.179852f, +0.158397f,0.962723f,-0.219259f, +0.207852f,0.94171f,-0.264536f, +0.167471f,0.922973f,-0.346518f, +0.273321f,0.900673f,-0.337764f, +0.244245f,0.947327f,-0.207161f, +0.179974f,0.982676f,-0.0442354f, +0.256056f,0.966655f,0.00369743f, +0.311224f,0.950239f,-0.0136096f, +-0.114346f,0.96184f,0.248574f, +-0.136601f,0.952445f,0.272377f, +-0.118024f,0.9521f,0.282091f, +-0.208962f,0.956737f,0.20246f, +-0.278994f,0.940284f,0.195009f, +-0.257672f,0.939434f,0.225986f, +-0.195307f,0.931658f,0.306381f, +-0.244185f,0.930201f,0.274044f, +-0.297894f,0.926606f,0.229479f, +-0.247712f,0.954952f,0.163421f, +-0.130651f,0.964187f,0.230812f, +-0.0752954f,0.962878f,0.259223f, +0.102408f,0.945859f,0.308f, +-0.0116154f,0.986031f,0.166158f, +0.0110135f,0.994405f,0.105056f, +0.0951503f,0.992756f,0.0733669f, +0.243797f,0.961487f,0.12691f, +0.260872f,0.955085f,0.140567f, +0.0581113f,0.983556f,0.170998f, +0.136043f,0.955475f,0.261839f, +0.341254f,0.920705f,0.189336f, +0.362462f,0.927476f,0.0917096f, +0.434756f,0.897441f,0.0747436f, +0.56712f,0.819757f,0.0798336f, +0.532941f,0.840799f,0.0950342f, +0.285812f,0.957415f,-0.0408404f, +0.105292f,0.985973f,-0.129498f, +0.0183827f,0.988838f,-0.147857f, +0.00614806f,0.993133f,-0.116825f, +0.099955f,0.989102f,-0.108098f, +0.238003f,0.969438f,-0.0595305f, +0.37769f,0.925502f,0.0282058f, +0.22782f,0.973089f,-0.0345812f, +0.169707f,0.981804f,-0.085208f, +0.345833f,0.936168f,-0.0631539f, +0.390375f,0.920563f,0.0130624f, +0.292594f,0.949139f,0.116291f, +0.162356f,0.962761f,0.216174f, +-0.0222207f,0.972687f,0.231055f, +-0.0543181f,0.955402f,0.290271f, +0.0573363f,0.941579f,0.331875f, +0.0971816f,0.964596f,0.245172f, +0.31345f,0.917083f,0.246388f, +0.307384f,0.923753f,0.228463f, +0.331585f,0.921188f,0.203628f, +0.40966f,0.902178f,0.135106f, +0.421265f,0.901117f,0.102585f, +0.477285f,0.878068f,0.0345826f, +0.547818f,0.833857f,-0.0676607f, +0.41388f,0.899953f,-0.13707f, +0.336726f,0.938017f,-0.0820957f, +0.267129f,0.960427f,-0.0788775f, +-0.0301028f,0.966021f,-0.256704f, +-0.102361f,0.925067f,-0.36575f, +-0.0109209f,0.925593f,-0.378364f, +0.0802595f,0.925005f,-0.371381f, +0.178475f,0.901809f,-0.393558f, +0.234643f,0.9031f,-0.359657f, +0.21073f,0.932522f,-0.29325f, +0.145492f,0.962309f,-0.22977f, +0.0986234f,0.992893f,-0.0666048f, +0.0609779f,0.998071f,0.0116837f, +0.208222f,0.976086f,0.0624398f, +0.291247f,0.954621f,0.0622453f, +-0.144182f,0.940028f,0.309126f, +-0.205006f,0.91833f,0.33859f, +-0.12423f,0.88968f,0.43936f, +-0.080186f,0.900963f,0.426423f, +-0.276852f,0.915664f,0.291398f, +-0.294009f,0.912157f,0.285532f, +-0.229314f,0.935643f,0.268306f, +-0.167187f,0.934278f,0.314918f, +-0.22242f,0.937858f,0.266367f, +-0.260643f,0.947201f,0.186748f, +-0.191964f,0.952786f,0.235261f, +-0.0626162f,0.968356f,0.24159f, +0.113658f,0.975135f,0.190246f, +0.0609991f,0.983083f,0.172707f, +0.00661942f,0.987494f,0.157516f, +0.132957f,0.988179f,0.0763221f, +0.229975f,0.973129f,-0.011475f, +0.267568f,0.962445f,0.0458956f, +0.0512446f,0.996521f,0.0657221f, +0.10251f,0.994623f,0.0147167f, +0.405413f,0.913613f,0.0308412f, +0.422693f,0.905322f,0.0415123f, +0.446493f,0.894763f,-0.00665318f, +0.517619f,0.855611f,0.00103599f, +0.493254f,0.857934f,0.143698f, +0.391227f,0.901201f,0.186488f, +0.212519f,0.97466f,0.0698119f, +0.0889638f,0.99521f,-0.0405254f, +0.0684633f,0.989971f,-0.123576f, +0.0764325f,0.983592f,-0.163418f, +0.104882f,0.990961f,-0.0836475f, +0.31755f,0.948184f,0.0104726f, +0.297752f,0.954642f,-0.00148102f, +0.157954f,0.986909f,-0.0325777f, +0.331713f,0.943333f,0.00940707f, +0.320973f,0.946975f,0.014661f, +0.220471f,0.961455f,0.164306f, +0.0647366f,0.977455f,0.200976f, +-0.0349474f,0.961311f,0.273238f, +-0.125874f,0.956852f,0.261896f, +0.0785055f,0.963364f,0.256449f, +0.211427f,0.962249f,0.171395f, +0.267083f,0.952021f,0.149409f, +0.340455f,0.905998f,0.251512f, +0.343062f,0.921876f,0.180149f, +0.420249f,0.886024f,0.195835f, +0.477229f,0.85754f,0.192034f, +0.564804f,0.822942f,0.0613434f, +0.583206f,0.811559f,-0.0352364f, +0.433319f,0.897576f,-0.0811897f, +0.291913f,0.950865f,-0.103166f, +0.268144f,0.961121f,-0.065914f, +0.14681f,0.986926f,-0.0665068f, +0.0393351f,0.975019f,-0.218612f, +0.042722f,0.945279f,-0.323454f, +0.104892f,0.926937f,-0.360257f, +0.188153f,0.928382f,-0.320477f, +0.104479f,0.956869f,-0.271082f, +0.039684f,0.98773f,-0.151046f, +0.0798596f,0.996734f,-0.0120106f, +0.0027229f,0.999081f,-0.0427778f, +0.0156228f,0.999853f,-0.00700924f, +0.224664f,0.97266f,0.058815f, +0.342188f,0.939164f,0.029646f, +-0.199093f,0.881081f,0.429019f, +-0.240385f,0.861587f,0.447083f, +-0.200309f,0.881599f,0.427386f, +-0.0492643f,0.888913f,0.455419f, +-0.146605f,0.886582f,0.438724f, +-0.194932f,0.91844f,0.344193f, +-0.212452f,0.949737f,0.229922f, +-0.231229f,0.946978f,0.223083f, +-0.22018f,0.943947f,0.245937f, +-0.155384f,0.954263f,0.255419f, +-0.222552f,0.970336f,0.0944332f, +0.0103498f,0.996133f,0.0872447f, +0.133012f,0.991064f,-0.00997971f, +0.0530236f,0.995787f,0.0748093f, +0.0840279f,0.994917f,0.0554967f, +0.25995f,0.964887f,-0.0376792f, +0.277109f,0.958722f,-0.0637373f, +0.172083f,0.982525f,-0.0709421f, +0.0951551f,0.994032f,-0.0533466f, +0.177084f,0.970483f,-0.163718f, +0.336303f,0.91861f,-0.207499f, +0.381503f,0.916211f,-0.122527f, +0.437128f,0.898759f,-0.0339342f, +0.471093f,0.8784f,0.0805223f, +0.407138f,0.905658f,0.118413f, +0.402844f,0.901612f,0.157519f, +0.327464f,0.936685f,0.124046f, +0.19809f,0.980129f,0.0103207f, +0.123868f,0.987803f,-0.0943524f, +0.0527864f,0.989238f,-0.136459f, +0.072462f,0.988213f,-0.134849f, +0.248671f,0.959688f,-0.131005f, +0.280617f,0.958078f,0.0577984f, +0.169552f,0.981657f,0.0871871f, +0.315169f,0.946806f,0.0650122f, +0.205308f,0.973708f,0.0986977f, +0.0950386f,0.972165f,0.214158f, +0.053629f,0.964124f,0.259978f, +-0.0859535f,0.951705f,0.294738f, +-0.0564482f,0.948883f,0.31054f, +0.154105f,0.958817f,0.238582f, +0.276457f,0.946116f,0.168629f, +0.211552f,0.972531f,0.0971047f, +0.294402f,0.951062f,0.0938527f, +0.390766f,0.916003f,0.0907783f, +0.406836f,0.907458f,0.104904f, +0.487803f,0.868421f,0.0888414f, +0.60401f,0.790886f,0.0983406f, +0.637938f,0.762279f,0.109387f, +0.4874f,0.873178f,0.00117935f, +0.336067f,0.93258f,-0.131735f, +0.229766f,0.943375f,-0.239272f, +0.152224f,0.966237f,-0.207882f, +0.121199f,0.969969f,-0.210883f, +0.121425f,0.965511f,-0.230314f, +0.0800447f,0.963578f,-0.255166f, +0.0996944f,0.981315f,-0.164563f, +0.0506382f,0.996401f,-0.0679735f, +-0.049503f,0.998346f,-0.0292297f, +0.050214f,0.998168f,0.0337586f, +0.113307f,0.993459f,0.014176f, +-0.000723347f,0.991208f,-0.132313f, +0.134265f,0.980729f,-0.141929f, +0.363008f,0.931437f,-0.0254801f, +-0.23486f,0.827656f,0.509732f, +-0.18483f,0.851106f,0.491383f, +-0.113579f,0.917253f,0.381767f, +-0.0885467f,0.926234f,0.366401f, +-0.119506f,0.895756f,0.428181f, +-0.107176f,0.917761f,0.382398f, +-0.0925542f,0.950614f,0.296253f, +-0.166069f,0.978511f,0.12222f, +-0.250375f,0.968134f,-0.00545859f, +-0.116612f,0.99254f,0.0355817f, +-0.0441586f,0.99869f,-0.0258397f, +0.0237183f,0.990591f,-0.134786f, +0.114156f,0.992737f,-0.0379611f, +0.0216237f,0.999568f,0.0199155f, +0.13918f,0.98521f,-0.0999564f, +0.240654f,0.960885f,-0.137059f, +0.249305f,0.964708f,-0.0847689f, +0.222546f,0.966381f,-0.128771f, +0.148234f,0.971026f,-0.187443f, +0.258813f,0.946284f,-0.193812f, +0.386195f,0.898799f,-0.207397f, +0.325896f,0.902531f,-0.281478f, +0.250321f,0.93543f,-0.249621f, +0.351402f,0.936022f,0.01949f, +0.42413f,0.889134f,0.171914f, +0.422963f,0.898638f,0.116411f, +0.393976f,0.918547f,0.0324739f, +0.283361f,0.957155f,-0.0596804f, +0.186222f,0.979389f,-0.0782236f, +0.100294f,0.99243f,-0.0708823f, +0.151138f,0.983442f,-0.0999959f, +0.115742f,0.982035f,-0.149033f, +0.0920961f,0.993962f,0.0596489f, +0.180728f,0.97583f,0.122852f, +0.267575f,0.959234f,0.0909572f, +0.204025f,0.959594f,0.193785f, +0.0830398f,0.98516f,0.150214f, +0.000808908f,0.987078f,0.160239f, +-0.115905f,0.961815f,0.247948f, +-0.0397732f,0.972025f,0.231484f, +0.185186f,0.964166f,0.189976f, +0.333936f,0.928543f,0.162155f, +0.358439f,0.932281f,0.0487095f, +0.30639f,0.946624f,-0.100142f, +0.389119f,0.921183f,-0.00273847f, +0.418957f,0.907889f,-0.0145855f, +0.498018f,0.86538f,-0.05563f, +0.565975f,0.823958f,-0.0276542f, +0.61235f,0.789736f,0.0366549f, +0.580326f,0.809292f,0.0909313f, +0.472624f,0.880866f,0.0264734f, +0.31167f,0.948991f,-0.0477351f, +0.149242f,0.981946f,-0.116226f, +0.114121f,0.974963f,-0.190851f, +0.0836789f,0.981905f,-0.169884f, +0.0779767f,0.990421f,-0.113957f, +0.0144442f,0.982901f,-0.183565f, +-0.021091f,0.988398f,-0.150415f, +-0.0454971f,0.990828f,-0.127242f, +-0.0180398f,0.984723f,-0.173189f, +0.129331f,0.988095f,-0.0833159f, +0.183553f,0.978578f,-0.0932403f, +0.123107f,0.958699f,-0.256402f, +0.189949f,0.953063f,-0.235775f, +-0.0544616f,0.84489f,0.53216f, +-0.0113297f,0.890886f,0.454085f, +-0.0462225f,0.938549f,0.342038f, +-0.128436f,0.915911f,0.380277f, +-0.159132f,0.90887f,0.385529f, +-0.0486608f,0.932565f,0.357708f, +0.0612592f,0.9505f,0.304627f, +0.0533898f,0.988914f,0.138559f, +-0.104607f,0.992177f,-0.0681298f, +-0.180998f,0.963403f,-0.197725f, +0.0184775f,0.993878f,-0.108929f, +-0.0166014f,0.988229f,-0.152078f, +-0.0077365f,0.996975f,-0.0773314f, +0.0579939f,0.995726f,-0.071872f, +0.284878f,0.950639f,-0.123003f, +0.233331f,0.946766f,-0.221789f, +0.274724f,0.943287f,-0.186374f, +0.284827f,0.926731f,-0.245036f, +0.143673f,0.947988f,-0.284037f, +0.183874f,0.951741f,-0.245725f, +0.373811f,0.924384f,-0.0760214f, +0.370847f,0.928183f,0.0307872f, +0.230777f,0.972874f,0.0160428f, +0.116854f,0.992434f,-0.0376857f, +0.311514f,0.945104f,0.0986779f, +0.493623f,0.85792f,0.14251f, +0.47336f,0.879733f,0.0447334f, +0.299829f,0.953139f,0.0403417f, +0.142324f,0.985386f,0.0935816f, +0.0780161f,0.991843f,0.100799f, +0.120483f,0.987279f,0.10375f, +0.113666f,0.977351f,0.178507f, +0.020827f,0.987302f,0.157484f, +0.18308f,0.973453f,0.137371f, +0.268344f,0.949436f,0.162981f, +0.178652f,0.97403f,0.139099f, +0.140521f,0.985536f,0.0947243f, +-0.0588959f,0.995353f,0.0761881f, +-0.17043f,0.974748f,0.144293f, +0.0194468f,0.992819f,0.118038f, +0.23167f,0.972512f,0.0234243f, +0.390625f,0.920274f,-0.0225152f, +0.45457f,0.886543f,-0.086066f, +0.307368f,0.941264f,-0.13981f, +0.289942f,0.953608f,-0.0810322f, +0.455218f,0.890309f,-0.0112281f, +0.513837f,0.856124f,-0.0549855f, +0.546925f,0.836241f,-0.0396788f, +0.583367f,0.812208f,-0.00110721f, +0.552934f,0.832422f,0.0365798f, +0.448406f,0.891004f,0.0710176f, +0.325547f,0.934833f,0.141795f, +0.239603f,0.963586f,0.118709f, +0.230453f,0.97295f,0.0160981f, +0.0486317f,0.9909f,-0.125509f, +0.0743177f,0.991871f,-0.103291f, +0.139517f,0.9837f,-0.11344f, +-0.0210587f,0.976395f,-0.214963f, +0.00854959f,0.97326f,-0.229548f, +0.0184659f,0.95097f,-0.308733f, +0.0120962f,0.95636f,-0.291939f, +0.153044f,0.979201f,-0.1332f, +0.190748f,0.981634f,-0.00308124f, +0.151842f,0.988041f,0.0268087f, +0.0319983f,0.964154f,0.263409f, +0.0761375f,0.979983f,0.183946f, +-0.0471561f,0.98918f,0.13892f, +-0.184804f,0.965808f,0.181831f, +-0.118202f,0.977652f,0.173852f, +-0.00263192f,0.986244f,0.165277f, +0.113935f,0.977488f,0.177586f, +0.213178f,0.965311f,0.150764f, +0.0917926f,0.995582f,-0.0197448f, +-0.112968f,0.973922f,-0.196759f, +-0.0750323f,0.977001f,-0.199598f, +0.0257774f,0.985322f,-0.168747f, +0.042721f,0.964979f,-0.258825f, +0.0821835f,0.934135f,-0.34733f, +0.254423f,0.923351f,-0.287563f, +0.255965f,0.951062f,-0.173101f, +0.240055f,0.959513f,-0.147338f, +0.319995f,0.939284f,-0.123892f, +0.15271f,0.974885f,-0.162111f, +0.132954f,0.978157f,-0.159787f, +0.156062f,0.978958f,-0.131476f, +0.237325f,0.969005f,0.0685979f, +0.280555f,0.951122f,0.129056f, +0.254605f,0.966124f,0.0421956f, +0.282663f,0.955227f,-0.087427f, +0.484968f,0.871846f,-0.0684877f, +0.483506f,0.87515f,-0.0182894f, +0.210764f,0.97671f,0.0402119f, +0.0804806f,0.985666f,0.148275f, +0.143859f,0.967897f,0.206108f, +0.0874346f,0.987357f,0.132215f, +0.0878227f,0.985433f,0.145635f, +0.118466f,0.990277f,0.0729134f, +0.170426f,0.983396f,-0.0623508f, +0.249461f,0.967984f,-0.0278496f, +0.240586f,0.970589f,0.00866192f, +0.158755f,0.987312f,0.00339798f, +-0.0496588f,0.997869f,0.0423253f, +-0.174436f,0.984473f,-0.0196346f, +0.0953847f,0.991998f,-0.0827112f, +0.301757f,0.941321f,-0.151184f, +0.416386f,0.897492f,-0.145363f, +0.439988f,0.889223f,-0.125274f, +0.313047f,0.948071f,-0.0562344f, +0.243151f,0.96888f,-0.0463665f, +0.428373f,0.903467f,-0.0156432f, +0.536849f,0.842847f,-0.0374461f, +0.521753f,0.850621f,-0.0649361f, +0.537565f,0.842885f,-0.02384f, +0.530522f,0.843125f,0.087673f, +0.408082f,0.90082f,0.148295f, +0.350282f,0.920762f,0.171756f, +0.275878f,0.960222f,0.0431791f, +0.279727f,0.959242f,0.0400889f, +0.199403f,0.977085f,0.0744484f, +0.0837631f,0.994427f,-0.0640234f, +0.142714f,0.98022f,-0.137117f, +0.0724844f,0.974795f,-0.211f, +0.0199047f,0.956284f,-0.29176f, +0.0419923f,0.973015f,-0.226887f, +-0.0571486f,0.988577f,-0.139464f, +-0.0620153f,0.996095f,-0.0628396f, +0.00941635f,0.995205f,0.097359f, +0.0452536f,0.980521f,0.191132f, +0.238692f,0.970551f,0.032497f, +0.18188f,0.979621f,-0.0852148f, +-0.0338772f,0.991689f,-0.124115f, +-0.215207f,0.972977f,-0.0836781f, +-0.127875f,0.990711f,-0.0462653f, +-0.0382254f,0.999079f,-0.0194842f, +0.0717625f,0.997386f,-0.00848587f, +0.235337f,0.971913f,0.00129577f, +0.258073f,0.965901f,-0.0208375f, +0.00563659f,0.988134f,-0.153488f, +-0.0963466f,0.971245f,-0.217715f, +0.0933449f,0.976181f,-0.19585f, +0.172697f,0.943118f,-0.284084f, +0.114064f,0.91464f,-0.387844f, +0.105309f,0.920749f,-0.375675f, +0.0952503f,0.976152f,-0.195075f, +0.198665f,0.977736f,-0.0675672f, +0.327274f,0.944589f,-0.0253815f, +0.185125f,0.982311f,-0.0281882f, +0.161734f,0.983206f,-0.0845435f, +0.135269f,0.981463f,-0.135765f, +0.160555f,0.98307f,-0.0882893f, +0.258909f,0.96483f,-0.0454967f, +0.342126f,0.938267f,0.0510447f, +0.36458f,0.930989f,-0.0184394f, +0.461971f,0.885156f,-0.0555142f, +0.401049f,0.915892f,-0.0173601f, +0.179695f,0.981649f,0.0638365f, +-0.0160491f,0.998918f,0.0436388f, +0.112643f,0.989219f,0.093583f, +0.158223f,0.986353f,0.0455405f, +0.150051f,0.988439f,-0.0217303f, +0.238384f,0.964999f,-0.10932f, +0.283357f,0.938433f,-0.197616f, +0.1814f,0.953903f,-0.239086f, +0.147672f,0.981223f,-0.124073f, +0.0988803f,0.99502f,-0.0125399f, +-0.0367309f,0.999167f,-0.0177995f, +-0.0641669f,0.988893f,-0.134067f, +0.155868f,0.964972f,-0.211032f, +0.311449f,0.929937f,-0.195488f, +0.363438f,0.913854f,-0.181064f, +0.379108f,0.919625f,-0.102794f, +0.251516f,0.967833f,-0.00624272f, +0.239964f,0.970767f,0.0053561f, +0.444229f,0.895407f,-0.0301255f, +0.561208f,0.823627f,-0.0817525f, +0.529532f,0.843694f,-0.0881851f, +0.463417f,0.885698f,-0.0280076f, +0.42264f,0.895689f,0.138263f, +0.360725f,0.902736f,0.234403f, +0.374064f,0.893088f,0.249939f, +0.398158f,0.891769f,0.214982f, +0.241834f,0.965676f,0.0947983f, +0.124224f,0.988267f,0.0888664f, +0.239364f,0.964398f,0.112437f, +0.252174f,0.966402f,-0.0497516f, +0.205848f,0.974166f,-0.0928869f, +0.0402048f,0.980488f,-0.192421f, +-0.109787f,0.981783f,-0.155076f, +-0.172809f,0.983136f,-0.0598348f, +-0.119927f,0.992756f,0.00723519f, +-0.0378691f,0.997707f,0.0560999f, +-0.018583f,0.999146f,0.0369096f, +0.311296f,0.946614f,-0.0837655f, +0.23235f,0.967065f,-0.103921f, +-0.0472012f,0.997512f,-0.0523709f, +-0.280913f,0.95942f,-0.0245033f, +-0.168558f,0.985462f,0.0212842f, +-0.0297654f,0.999551f,-0.00345095f, +0.14783f,0.984722f,-0.0920209f, +0.234818f,0.942556f,-0.23759f, +0.226f,0.954601f,-0.194065f, +0.0915505f,0.991576f,-0.0916283f, +-0.0384295f,0.986109f,-0.161594f, +0.0699749f,0.969463f,-0.235043f, +0.242042f,0.947128f,-0.210628f, +0.200696f,0.954776f,-0.21937f, +0.0684629f,0.960296f,-0.270452f, +-0.0178037f,0.955193f,-0.295449f, +0.106419f,0.956511f,-0.271592f, +0.250177f,0.956337f,-0.151101f, +0.206468f,0.977841f,-0.0346042f, +0.226301f,0.972897f,-0.047521f, +0.19172f,0.975927f,-0.103973f, +0.110286f,0.969903f,-0.217085f, +0.124805f,0.979571f,-0.157684f, +0.230362f,0.972377f,0.0376307f, +0.390327f,0.9143f,0.108165f, +0.486088f,0.869528f,0.0874049f, +0.355552f,0.931184f,0.0804947f, +0.162837f,0.968115f,0.190362f, +0.0587916f,0.990094f,0.127507f, +0.122084f,0.99234f,0.0189101f, +0.227899f,0.973107f,0.0335246f, +0.245712f,0.968327f,-0.0443735f, +0.235392f,0.962107f,-0.137626f, +0.299512f,0.953154f,0.0423112f, +0.158421f,0.985528f,0.0603087f, +0.0139537f,0.99778f,0.0651181f, +0.05695f,0.991196f,0.119526f, +0.0853993f,0.993434f,0.0761332f, +0.0800124f,0.992698f,-0.0902652f, +0.152744f,0.965412f,-0.211303f, +0.298303f,0.938225f,-0.175354f, +0.346617f,0.918158f,-0.191946f, +0.306791f,0.939305f,-0.153575f, +0.213668f,0.966817f,-0.140039f, +0.269123f,0.94608f,-0.180294f, +0.462084f,0.866259f,-0.189928f, +0.547323f,0.828917f,-0.11547f, +0.492713f,0.870051f,0.0156307f, +0.377637f,0.925543f,0.0275792f, +0.309374f,0.94993f,0.0438272f, +0.339128f,0.933648f,0.115296f, +0.355844f,0.92275f,0.148012f, +0.387104f,0.898496f,0.207015f, +0.394935f,0.895155f,0.206698f, +0.187014f,0.981688f,0.0362499f, +0.286474f,0.957988f,0.0138101f, +0.315633f,0.944806f,-0.0878444f, +0.189054f,0.976628f,-0.102261f, +0.071001f,0.995263f,-0.066411f, +-0.121993f,0.990638f,-0.0612738f, +-0.195423f,0.978588f,-0.0646113f, +-0.134933f,0.988908f,-0.0620808f, +-0.0362027f,0.9885f,-0.146822f, +0.0247852f,0.975168f,-0.220074f, +0.236634f,0.970435f,-0.0475491f, +0.163622f,0.985347f,0.0481553f, +-0.110204f,0.98299f,0.146921f, +-0.274076f,0.953125f,0.128197f, +-0.127913f,0.990913f,0.0415925f, +0.0693505f,0.994264f,-0.081428f, +0.246728f,0.957329f,-0.15049f, +0.356012f,0.927656f,-0.112735f, +0.108926f,0.979602f,-0.168863f, +-0.0117435f,0.995074f,-0.0984399f, +0.0591802f,0.992813f,-0.104017f, +0.152983f,0.961405f,-0.228683f, +0.199436f,0.939216f,-0.279462f, +0.158919f,0.956661f,-0.244017f, +0.142246f,0.964436f,-0.222776f, +0.0928224f,0.948092f,-0.304146f, +0.072096f,0.927878f,-0.365849f, +0.0949024f,0.954182f,-0.28378f, +0.0839904f,0.981792f,-0.17038f, +0.207123f,0.975655f,-0.0720922f, +0.306863f,0.948734f,-0.075756f, +0.227677f,0.946857f,-0.22721f, +0.0209281f,0.957849f,-0.28651f, +0.0889558f,0.973432f,-0.210993f, +0.377519f,0.908654f,-0.178401f, +0.444767f,0.867771f,-0.22171f, +0.296477f,0.952876f,-0.0642486f, +0.049587f,0.998699f,0.0118749f, +0.185088f,0.975344f,0.120192f, +0.179316f,0.983776f,0.00553586f, +0.203508f,0.978758f,-0.0248474f, +0.30632f,0.951877f,-0.00993344f, +0.182507f,0.983075f,0.0159703f, +0.0804506f,0.991985f,0.0974322f, +0.170994f,0.963788f,0.204629f, +0.0962731f,0.986887f,0.12956f, +0.097797f,0.995201f,0.00337759f, +0.147003f,0.987459f,-0.0575677f, +0.218112f,0.972969f,-0.0758899f, +0.244949f,0.956598f,-0.157862f, +0.315584f,0.924587f,-0.213415f, +0.352441f,0.893692f,-0.277668f, +0.28482f,0.905458f,-0.31468f, +0.265138f,0.910445f,-0.317477f, +0.308383f,0.884493f,-0.350102f, +0.390084f,0.870652f,-0.299665f, +0.373263f,0.922794f,-0.0955261f, +0.378781f,0.918384f,0.114439f, +0.476669f,0.866105f,0.150494f, +0.353048f,0.93424f,-0.0505168f, +0.309942f,0.946077f,-0.0942048f, +0.298518f,0.948219f,-0.108479f, +0.350416f,0.935917f,-0.0356219f, +0.447907f,0.893892f,-0.0183155f, +0.280155f,0.95286f,-0.116492f, +0.270748f,0.951225f,-0.147871f, +0.374052f,0.922269f,-0.0974917f, +0.176754f,0.980223f,-0.0889943f, +0.0634799f,0.992926f,-0.100339f, +-0.11806f,0.977045f,-0.177329f, +-0.199746f,0.955239f,-0.218219f, +-0.0812223f,0.969857f,-0.229739f, +0.130179f,0.951543f,-0.278602f, +0.200559f,0.919086f,-0.339202f, +0.0174361f,0.999489f,0.0268061f, +0.0105554f,0.991703f,0.128113f, +-0.141198f,0.973013f,0.182506f, +-0.142313f,0.985833f,0.0887713f, +0.00597934f,0.99465f,-0.103131f, +0.213448f,0.959986f,-0.181295f, +0.150446f,0.953754f,-0.260228f, +0.244008f,0.968351f,-0.0525036f, +0.184758f,0.982743f,0.00893989f, +-0.00567918f,0.992902f,-0.118797f, +0.138037f,0.98016f,-0.142241f, +0.21929f,0.962205f,-0.16147f, +0.269703f,0.95408f,-0.13035f, +0.150911f,0.956731f,-0.24878f, +0.180021f,0.944452f,-0.27496f, +0.119147f,0.92214f,-0.368051f, +0.0669033f,0.930661f,-0.359714f, +-0.0113587f,0.942765f,-0.333265f, +0.0142182f,0.972628f,-0.231934f, +0.163413f,0.959027f,-0.231437f, +0.324001f,0.919871f,-0.221046f, +0.291919f,0.93701f,-0.19182f, +0.107512f,0.968299f,-0.225473f, +0.0749887f,0.923898f,-0.375218f, +0.415609f,0.849812f,-0.324172f, +0.314994f,0.92041f,-0.231569f, +0.136459f,0.990645f,0.000905767f, +0.00734966f,0.998995f,0.0442195f, +0.0805668f,0.996634f,0.0151596f, +0.266119f,0.962333f,0.0556322f, +0.269187f,0.962624f,-0.0298845f, +0.209195f,0.975524f,-0.0677535f, +0.153299f,0.985902f,0.0670637f, +0.0587395f,0.996349f,0.0619523f, +0.20348f,0.97612f,0.0760684f, +0.225978f,0.971688f,-0.0689656f, +0.204562f,0.957442f,-0.203617f, +0.164418f,0.955123f,-0.246386f, +0.1725f,0.961839f,-0.212392f, +0.288653f,0.947463f,-0.137816f, +0.355829f,0.918236f,-0.173863f, +0.453757f,0.873536f,-0.176182f, +0.355645f,0.881401f,-0.310884f, +0.238917f,0.864251f,-0.442706f, +0.251593f,0.863453f,-0.437206f, +0.231383f,0.92049f,-0.314896f, +0.219172f,0.968344f,-0.119471f, +0.254773f,0.966196f,-0.0394394f, +0.482542f,0.873342f,0.0665443f, +0.470019f,0.880685f,0.0589576f, +0.359563f,0.932576f,-0.0318683f, +0.336062f,0.937393f,-0.0914179f, +0.320744f,0.932455f,-0.166285f, +0.428106f,0.887361f,-0.171217f, +0.372336f,0.918652f,-0.132074f, +0.247289f,0.941171f,-0.230314f, +0.287477f,0.950239f,-0.120008f, +0.121799f,0.989487f,-0.0779795f, +0.132326f,0.991166f,-0.00888466f, +-0.00459516f,0.997934f,-0.0640824f, +-0.0924696f,0.984613f,-0.148277f, +-0.0479758f,0.968834f,-0.243019f, +0.052427f,0.976364f,-0.209677f, +0.223214f,0.97397f,-0.0394671f, +0.0112214f,0.972418f,0.232975f, +0.0106355f,0.967748f,0.251694f, +-0.0743183f,0.979789f,0.185717f, +0.0581795f,0.9982f,0.01459f, +0.133434f,0.964693f,-0.227076f, +0.215981f,0.948544f,-0.231554f, +0.137408f,0.968029f,-0.209856f, +0.0442022f,0.987042f,-0.154256f, +0.228305f,0.972284f,0.0504f, +0.121617f,0.992241f,-0.0258404f, +0.134527f,0.985242f,-0.105833f, +0.151618f,0.980953f,-0.121423f, +0.275183f,0.956894f,-0.092891f, +0.263324f,0.945384f,-0.192117f, +0.25647f,0.929449f,-0.26523f, +0.21073f,0.904026f,-0.371926f, +0.0728135f,0.89169f,-0.446751f, +-0.0691284f,0.877831f,-0.473955f, +-0.019884f,0.913569f,-0.406197f, +0.178205f,0.891525f,-0.416444f, +0.263993f,0.900279f,-0.34613f, +0.210305f,0.939702f,-0.269689f, +0.208408f,0.948624f,-0.238074f, +0.229275f,0.910156f,-0.345036f, +0.227512f,0.924458f,-0.305966f, +0.142229f,0.989234f,0.0344507f, +-0.0464441f,0.986357f,0.157934f, +0.073391f,0.981122f,0.178921f, +0.158555f,0.984472f,0.0753311f, +0.265489f,0.961878f,0.0656237f, +0.318063f,0.94383f,0.0895592f, +0.229589f,0.973115f,0.0183382f, +0.0918017f,0.995548f,-0.0213497f, +0.0710209f,0.997458f,0.00582691f, +0.234172f,0.971044f,-0.0473045f, +0.373198f,0.918081f,-0.133603f, +0.27855f,0.93462f,-0.221124f, +0.174681f,0.94082f,-0.290421f, +0.0816739f,0.936818f,-0.34015f, +0.233666f,0.948403f,-0.214319f, +0.373882f,0.91082f,-0.174984f, +0.44036f,0.88198f,-0.16791f, +0.496092f,0.86017f,-0.118324f, +0.420226f,0.875748f,-0.237645f, +0.228936f,0.896528f,-0.379243f, +0.0594423f,0.913794f,-0.401806f, +0.0971839f,0.949435f,-0.298544f, +0.201575f,0.953775f,-0.222894f, +0.339139f,0.935667f,-0.0975326f, +0.471026f,0.864094f,0.177416f, +0.409402f,0.896788f,0.167814f, +0.414181f,0.90532f,0.0940739f, +0.426161f,0.903473f,-0.0460849f, +0.431652f,0.886771f,-0.165266f, +0.36903f,0.909898f,-0.189479f, +0.237762f,0.950577f,-0.199683f, +0.250405f,0.963718f,-0.0924377f, +0.100123f,0.989034f,-0.108572f, +0.0410755f,0.997876f,-0.0505615f, +0.0233843f,0.999496f,0.0214792f, +-0.0536722f,0.998467f,-0.0135057f, +0.00107433f,0.999993f,-0.00356525f, +-0.0705196f,0.996911f,-0.0345704f, +-0.0688919f,0.997514f,0.0148223f, +-0.0812179f,0.983535f,0.161436f, +-0.0138011f,0.988231f,0.152344f, +0.0655184f,0.995642f,0.0663652f, +0.220598f,0.973784f,-0.0554998f, +0.309629f,0.942731f,-0.124049f, +0.155774f,0.947975f,-0.27763f, +0.127196f,0.974249f,-0.186174f, +-0.058769f,0.981296f,-0.183314f, +0.0497615f,0.99612f,-0.0725919f, +0.182926f,0.98205f,0.0460018f, +0.19209f,0.981195f,-0.0189005f, +0.224403f,0.972569f,-0.0612647f, +0.315645f,0.941316f,-0.119552f, +0.360736f,0.920207f,-0.151949f, +0.310465f,0.916626f,-0.251809f, +0.327403f,0.899549f,-0.28917f, +0.161725f,0.896729f,-0.411973f, +-0.0141039f,0.865769f,-0.500245f, +-0.0292484f,0.82172f,-0.56914f, +0.0961328f,0.815723f,-0.570398f, +0.101793f,0.868026f,-0.485972f, +0.156302f,0.922247f,-0.353597f, +0.205267f,0.935719f,-0.286871f, +0.229076f,0.948515f,-0.218729f, +0.0347356f,0.987904f,-0.151126f, +-0.079026f,0.996018f,0.0412683f, +-0.00943989f,0.997185f,0.0743796f, +0.111542f,0.993598f,-0.0179121f, +0.186771f,0.982172f,0.0213291f, +0.207496f,0.975443f,0.0738717f, +0.321818f,0.944637f,0.0639911f, +0.281397f,0.958917f,0.0359716f, +0.126766f,0.988281f,0.0850327f, +0.0940702f,0.995531f,0.0082479f, +0.338235f,0.93955f,-0.0533163f, +0.410978f,0.899199f,-0.150126f, +0.338008f,0.912085f,-0.232059f, +0.265939f,0.902685f,-0.338284f, +0.120839f,0.912428f,-0.39099f, +0.0943411f,0.91428f,-0.393944f, +0.326367f,0.911608f,-0.24991f, +0.410002f,0.90171f,-0.137175f, +0.446036f,0.89335f,-0.054576f, +0.453415f,0.890674f,0.0333893f, +0.369882f,0.926554f,0.0684487f, +0.15305f,0.985829f,-0.0686756f, +0.0307343f,0.980172f,-0.195752f, +0.104404f,0.981192f,-0.162361f, +0.153412f,0.984343f,-0.086793f, +0.259868f,0.962798f,0.0740869f, +0.405239f,0.886729f,0.222469f, +0.507863f,0.829218f,0.233395f, +0.530784f,0.842353f,0.0933228f, +0.515092f,0.857118f,0.0053912f, +0.421652f,0.904509f,-0.0638277f, +0.186762f,0.968676f,-0.16367f, +0.141357f,0.986443f,-0.0833539f, +0.10637f,0.994244f,0.0127965f, +-0.010764f,0.999348f,-0.0344492f, +-0.00443345f,0.999867f,-0.0156939f, +-0.0569297f,0.998142f,0.0217125f, +-0.0108274f,0.998516f,0.0533776f, +-0.0518054f,0.997615f,0.0456197f, +-0.08879f,0.991878f,0.0910736f, +0.15627f,0.9777f,0.14029f, +0.127078f,0.991794f,-0.0140045f, +0.182153f,0.975854f,-0.12054f, +0.236919f,0.957374f,-0.165238f, +0.354425f,0.924081f,-0.143031f, +0.22947f,0.95204f,-0.202395f, +0.0414456f,0.986576f,-0.157956f, +-0.0334694f,0.988237f,-0.149222f, +-0.0516418f,0.976013f,-0.2115f, +0.149794f,0.980531f,-0.126967f, +0.232135f,0.958309f,-0.166606f, +0.253821f,0.951991f,-0.171138f, +0.306434f,0.927336f,-0.214818f, +0.397399f,0.902704f,-0.164923f, +0.371523f,0.904625f,-0.208864f, +0.394746f,0.892045f,-0.220071f, +0.272791f,0.90211f,-0.334339f, +0.143123f,0.890975f,-0.430905f, +0.0302622f,0.843122f,-0.53687f, +0.0628652f,0.888185f,-0.455165f, +0.00848379f,0.914478f,-0.404546f, +0.009201f,0.926788f,-0.375473f, +0.0671766f,0.952807f,-0.296052f, +0.132209f,0.974746f,-0.179973f, +-0.0203291f,0.99362f,-0.110936f, +-0.138553f,0.985569f,-0.0972441f, +0.0605753f,0.989699f,-0.129717f, +0.0968295f,0.980926f,-0.168548f, +0.0979519f,0.993956f,-0.0495753f, +0.201443f,0.976928f,-0.0709446f, +0.381986f,0.916436f,-0.119294f, +0.157625f,0.97891f,-0.12996f, +0.10065f,0.993729f,0.0486956f, +0.194299f,0.980695f,-0.0220253f, +0.364962f,0.929379f,-0.0552881f, +0.487949f,0.871552f,-0.0479875f, +0.462417f,0.883871f,-0.0702998f, +0.341292f,0.927621f,-0.151788f, +0.13195f,0.962323f,-0.237746f, +0.0784249f,0.961522f,-0.263298f, +0.155522f,0.961843f,-0.225101f, +0.275269f,0.959916f,-0.0528088f, +0.354301f,0.927858f,0.116403f, +0.359914f,0.906647f,0.22012f, +0.307706f,0.904557f,0.295117f, +0.281691f,0.897787f,0.338569f, +0.169122f,0.964903f,0.200898f, +0.116857f,0.992098f,0.045666f, +0.131422f,0.991068f,-0.0226175f, +0.19688f,0.980005f,-0.0287978f, +0.332698f,0.942383f,-0.0350149f, +0.49437f,0.868541f,-0.0351363f, +0.591151f,0.806162f,-0.0253575f, +0.528595f,0.848271f,-0.0319893f, +0.452945f,0.891538f,3.96151e-005f, +0.269718f,0.962267f,0.0359679f, +0.0172075f,0.99965f,0.0201157f, +0.0836306f,0.98488f,0.151715f, +0.0817519f,0.992549f,0.0903531f, +-0.0289252f,0.999464f,0.015311f, +-0.0977995f,0.99488f,0.0254794f, +-0.0368101f,0.998502f,0.0404932f, +-0.0917396f,0.988968f,0.116306f, +-0.19824f,0.961924f,0.188156f, +0.355147f,0.931267f,-0.0813196f, +0.261709f,0.946669f,-0.187953f, +0.187089f,0.954576f,-0.23191f, +0.281523f,0.925027f,-0.255086f, +0.340665f,0.862289f,-0.374707f, +0.168991f,0.920317f,-0.352786f, +-0.0114217f,0.969014f,-0.246743f, +0.0275027f,0.971061f,-0.237244f, +0.0127748f,0.945787f,-0.324537f, +0.106685f,0.927276f,-0.358857f, +0.242554f,0.910981f,-0.333589f, +0.254201f,0.919334f,-0.300346f, +0.319051f,0.907348f,-0.273727f, +0.384836f,0.892504f,-0.235241f, +0.359386f,0.889916f,-0.280877f, +0.418755f,0.87516f,-0.242361f, +0.378513f,0.873068f,-0.307377f, +0.247447f,0.872868f,-0.420561f, +0.0334574f,0.868028f,-0.495387f, +-0.104393f,0.897693f,-0.428077f, +-0.0466408f,0.949283f,-0.310944f, +0.00907853f,0.960916f,-0.276691f, +0.00868667f,0.966036f,-0.258261f, +0.0845957f,0.976098f,-0.200192f, +-0.0296926f,0.969375f,-0.243785f, +-0.104852f,0.955765f,-0.274807f, +0.0855702f,0.957819f,-0.274336f, +0.0411396f,0.961225f,-0.272681f, +0.0481708f,0.973933f,-0.221661f, +0.28909f,0.93695f,-0.196346f, +0.356766f,0.919532f,-0.164859f, +0.126757f,0.9882f,-0.0859897f, +0.0144124f,0.990867f,-0.134068f, +0.233251f,0.969449f,-0.075909f, +0.354937f,0.93426f,-0.034317f, +0.469402f,0.882971f,-0.00493066f, +0.398385f,0.917184f,-0.00790304f, +0.386606f,0.918227f,0.0859925f, +0.228789f,0.970147f,0.0804364f, +0.115903f,0.993259f,0.0019484f, +0.110471f,0.992802f,-0.0462595f, +0.159257f,0.98723f,-0.00373461f, +0.193831f,0.979844f,0.0483161f, +0.304703f,0.938233f,0.163935f, +0.27363f,0.944953f,0.179417f, +0.268196f,0.936861f,0.224416f, +0.306571f,0.922686f,0.233806f, +0.304362f,0.944561f,0.123164f, +0.226364f,0.97021f,-0.0863264f, +0.198019f,0.963611f,-0.179562f, +0.39862f,0.902547f,-0.162819f, +0.534677f,0.804719f,-0.257967f, +0.537872f,0.788638f,-0.297899f, +0.486148f,0.837034f,-0.251066f, +0.374822f,0.901369f,-0.216893f, +0.171725f,0.976903f,-0.127168f, +-0.0108013f,0.999941f,-0.00151679f, +0.0247265f,0.999687f,-0.00377037f, +0.135958f,0.990654f,0.0109791f, +-0.00717425f,0.999252f,0.0379956f, +-0.0710711f,0.991911f,0.105175f, +-0.0859239f,0.990395f,0.108328f, +-0.18335f,0.97033f,0.157612f, +-0.315275f,0.941315f,0.120535f, +0.340669f,0.883831f,-0.320605f, +0.289176f,0.886429f,-0.361416f, +0.20883f,0.874721f,-0.437325f, +0.364068f,0.812937f,-0.454519f, +0.367133f,0.769647f,-0.522357f, +0.0748495f,0.818621f,-0.569436f, +-0.0872921f,0.835085f,-0.543151f, +0.00846427f,0.872897f,-0.48783f, +0.114223f,0.886407f,-0.448593f, +0.0920189f,0.872463f,-0.479939f, +0.2125f,0.893929f,-0.394633f, +0.175058f,0.869572f,-0.461735f, +0.23988f,0.874417f,-0.421725f, +0.3397f,0.869601f,-0.358326f, +0.392151f,0.874231f,-0.286248f, +0.401032f,0.871377f,-0.282622f, +0.447169f,0.847971f,-0.28458f, +0.337548f,0.868339f,-0.363386f, +0.0674983f,0.896564f,-0.437742f, +-0.167145f,0.867884f,-0.467804f, +-0.130341f,0.888597f,-0.43978f, +-0.0513088f,0.927515f,-0.370248f, +-0.0499693f,0.955154f,-0.291861f, +0.0619562f,0.966501f,-0.249073f, +0.104114f,0.952328f,-0.28676f, +-0.0782617f,0.904542f,-0.419141f, +0.00654125f,0.918336f,-0.395747f, +0.0825819f,0.944757f,-0.317199f, +0.028702f,0.9283f,-0.370722f, +0.170752f,0.927761f,-0.331819f, +0.188742f,0.965638f,-0.178664f, +0.126613f,0.983535f,0.12895f, +0.0677004f,0.989289f,0.129321f, +0.179931f,0.977134f,0.113286f, +0.301628f,0.94869f,0.0949132f, +0.473083f,0.874439f,0.107469f, +0.430087f,0.900068f,0.0700241f, +0.294529f,0.954232f,0.0519033f, +0.218538f,0.963065f,0.157309f, +0.194139f,0.967934f,0.159416f, +0.193754f,0.980213f,0.0405318f, +0.162395f,0.97825f,-0.129057f, +0.175319f,0.968352f,-0.177646f, +0.248014f,0.960103f,-0.129196f, +0.28568f,0.95369f,-0.0941428f, +0.21993f,0.968315f,-0.118312f, +0.322085f,0.944206f,-0.068818f, +0.382868f,0.918715f,-0.0968289f, +0.390317f,0.908769f,-0.147618f, +0.269935f,0.914207f,-0.30226f, +0.374262f,0.856519f,-0.355391f, +0.561588f,0.771614f,-0.298716f, +0.563679f,0.781086f,-0.268646f, +0.435393f,0.841674f,-0.319402f, +0.305805f,0.901875f,-0.305133f, +0.0714141f,0.973517f,-0.217175f, +-0.0655193f,0.984454f,-0.162963f, +0.0352485f,0.985949f,-0.163286f, +0.0657594f,0.9937f,-0.0907542f, +-0.080707f,0.996331f,0.0284757f, +-0.168129f,0.985261f,0.0315202f, +-0.129479f,0.990858f,0.0378905f, +-0.12231f,0.991737f,0.0387141f, +-0.178343f,0.98279f,-0.0481504f, +0.273318f,0.858026f,-0.434843f, +0.385091f,0.836836f,-0.389114f, +0.340339f,0.786413f,-0.515483f, +0.318221f,0.733035f,-0.601161f, +0.367621f,0.755443f,-0.542366f, +0.119455f,0.799665f,-0.588444f, +-0.0802011f,0.78091f,-0.619473f, +-0.0688818f,0.778398f,-0.623981f, +0.0140135f,0.818686f,-0.574071f, +0.0274992f,0.866697f,-0.498077f, +0.177071f,0.88196f,-0.436797f, +0.265217f,0.852958f,-0.449581f, +0.257768f,0.854407f,-0.45116f, +0.248846f,0.837431f,-0.486605f, +0.267639f,0.861569f,-0.431356f, +0.378672f,0.856274f,-0.351288f, +0.453357f,0.836299f,-0.308337f, +0.386424f,0.863215f,-0.324865f, +0.128686f,0.904609f,-0.406352f, +-0.130252f,0.895612f,-0.425338f, +-0.18148f,0.896143f,-0.40496f, +-0.161324f,0.928509f,-0.334435f, +-0.0897102f,0.95467f,-0.283825f, +0.0454642f,0.942898f,-0.329963f, +0.150896f,0.947175f,-0.283f, +0.0358472f,0.960013f,-0.277651f, +-0.0385071f,0.932002f,-0.360402f, +0.0386813f,0.938718f,-0.342507f, +0.0283698f,0.934985f,-0.353551f, +0.108122f,0.956069f,-0.272473f, +0.00374271f,0.987226f,-0.159284f, +-0.196358f,0.979545f,-0.0439957f, +-0.00408304f,0.984849f,0.173364f, +0.19648f,0.945984f,0.257896f, +0.360526f,0.896905f,0.256092f, +0.497904f,0.850304f,0.170515f, +0.432778f,0.894142f,0.114953f, +0.285493f,0.945844f,0.154508f, +0.185631f,0.971794f,0.145459f, +0.230083f,0.969236f,0.0874248f, +0.368311f,0.929659f,-0.00905859f, +0.334163f,0.916764f,-0.218814f, +0.186339f,0.940464f,-0.284262f, +0.166871f,0.945707f,-0.278912f, +0.282007f,0.937612f,-0.20336f, +0.24104f,0.942322f,-0.232226f, +0.269154f,0.937876f,-0.218962f, +0.376707f,0.923358f,-0.0741695f, +0.419282f,0.907855f,0.00132882f, +0.443207f,0.893334f,-0.0743096f, +0.437794f,0.862232f,-0.254741f, +0.526311f,0.818963f,-0.228685f, +0.539618f,0.818293f,-0.198015f, +0.495179f,0.844909f,-0.202303f, +0.231134f,0.928947f,-0.289195f, +-0.0315579f,0.980647f,-0.193222f, +-0.0610949f,0.990009f,-0.12708f, +-0.0213691f,0.991115f,-0.131279f, +-0.0564833f,0.997988f,-0.0288065f, +-0.126885f,0.991868f,-0.0099403f, +-0.0683923f,0.994887f,-0.0743097f, +-0.0443491f,0.981445f,-0.186542f, +-0.106156f,0.962217f,-0.250737f, +-0.0540242f,0.978674f,-0.198191f, +0.194886f,0.824241f,-0.531645f, +0.320074f,0.809438f,-0.492303f, +0.464438f,0.773143f,-0.431911f, +0.405677f,0.746051f,-0.528047f, +0.305674f,0.751501f,-0.584645f, +0.130892f,0.809782f,-0.571944f, +-0.0644176f,0.819769f,-0.56906f, +-0.0714323f,0.833301f,-0.548185f, +-0.0643631f,0.853923f,-0.516404f, +-0.0107306f,0.851684f,-0.523946f, +0.13746f,0.827954f,-0.543688f, +0.198685f,0.868523f,-0.454084f, +0.246871f,0.881894f,-0.401644f, +0.296117f,0.852853f,-0.430066f, +0.256816f,0.850031f,-0.459883f, +0.314177f,0.830121f,-0.460643f, +0.37334f,0.830673f,-0.413038f, +0.413553f,0.857071f,-0.30725f, +0.158679f,0.931259f,-0.327989f, +-0.130088f,0.933779f,-0.333368f, +-0.259668f,0.892475f,-0.368866f, +-0.237565f,0.924215f,-0.298981f, +-0.0871208f,0.968004f,-0.235327f, +0.0797031f,0.982117f,-0.17057f, +0.0461708f,0.99392f,-0.0999594f, +0.0445161f,0.998669f,-0.0260401f, +0.0420509f,0.9919f,-0.119856f, +0.0652827f,0.976809f,-0.203917f, +0.0163117f,0.980129f,-0.197692f, +-0.0727832f,0.991022f,-0.112154f, +-0.0519999f,0.997388f,0.0501216f, +-0.215497f,0.976498f,0.00360735f, +-0.144793f,0.989191f,0.023161f, +0.11495f,0.986032f,0.120527f, +0.332155f,0.934954f,0.124633f, +0.520936f,0.843883f,0.128405f, +0.426058f,0.883139f,0.196317f, +0.297882f,0.930389f,0.213643f, +0.255462f,0.962333f,0.0930293f, +0.330201f,0.94382f,-0.0130553f, +0.464814f,0.88236f,-0.0734001f, +0.396624f,0.912293f,-0.10203f, +0.190826f,0.974675f,-0.116592f, +0.186045f,0.970537f,-0.153119f, +0.228366f,0.951236f,-0.207361f, +0.252282f,0.958154f,-0.135261f, +0.163352f,0.984522f,-0.0635096f, +0.214627f,0.974395f,0.066997f, +0.385854f,0.917468f,0.096793f, +0.519216f,0.853803f,0.0378886f, +0.535665f,0.843867f,-0.0308472f, +0.541689f,0.838373f,-0.060851f, +0.563197f,0.822059f,-0.0838289f, +0.51966f,0.848391f,-0.100928f, +0.236369f,0.967062f,-0.0944536f, +-0.111969f,0.993037f,-0.0366171f, +-0.0968965f,0.995233f,-0.011032f, +-0.0970566f,0.995182f,0.013894f, +-0.0559363f,0.991458f,0.117821f, +-0.00538008f,0.999824f,-0.0179674f, +0.0108998f,0.982438f,-0.186268f, +0.0427996f,0.970253f,-0.238279f, +-0.10823f,0.95386f,-0.280066f, +-0.196538f,0.942983f,-0.26862f, +0.307908f,0.814842f,-0.491147f, +0.299308f,0.78907f,-0.536455f, +0.435133f,0.777699f,-0.453699f, +0.495126f,0.764316f,-0.413124f, +0.362871f,0.81835f,-0.445676f, +0.0803271f,0.871076f,-0.484534f, +-0.110099f,0.885293f,-0.451812f, +-0.149245f,0.895891f,-0.418456f, +-0.0670569f,0.907151f,-0.415428f, +0.0527044f,0.88691f,-0.458926f, +0.100471f,0.888224f,-0.448291f, +0.121208f,0.922825f,-0.365653f, +0.249787f,0.879883f,-0.404243f, +0.334334f,0.839973f,-0.427396f, +0.283757f,0.852792f,-0.438437f, +0.337422f,0.812854f,-0.474778f, +0.291967f,0.807546f,-0.512469f, +0.269633f,0.862064f,-0.429119f, +0.108203f,0.943068f,-0.314506f, +-0.121343f,0.966872f,-0.224575f, +-0.202731f,0.95836f,-0.201115f, +-0.275106f,0.928104f,-0.25088f, +-0.220959f,0.943196f,-0.248108f, +-0.0845259f,0.990859f,-0.105139f, +-0.0183112f,0.999824f,0.00404228f, +0.0398541f,0.999205f,-0.000234289f, +0.144105f,0.989245f,0.0250549f, +0.0887732f,0.994681f,0.052239f, +-0.0385311f,0.993554f,0.106613f, +-0.141743f,0.984863f,0.099766f, +-0.130913f,0.987043f,0.0927824f, +-0.138468f,0.982136f,0.12742f, +-0.181593f,0.983362f,-0.00473479f, +0.124018f,0.991703f,-0.0338209f, +0.350394f,0.929846f,-0.112294f, +0.471172f,0.881999f,-0.00866642f, +0.362692f,0.927143f,0.0941279f, +0.321547f,0.934446f,0.153031f, +0.39706f,0.903274f,0.162601f, +0.408629f,0.910814f,0.0586596f, +0.440544f,0.897708f,-0.00641084f, +0.417743f,0.90832f,0.0210971f, +0.223429f,0.972702f,-0.0626924f, +0.239878f,0.966667f,-0.0895152f, +0.326998f,0.934073f,-0.143454f, +0.0984577f,0.955256f,-0.278913f, +0.055814f,0.995135f,-0.081185f, +0.198837f,0.979583f,-0.0296926f, +0.452343f,0.887429f,-0.0886289f, +0.538988f,0.831253f,-0.136052f, +0.534759f,0.840783f,-0.084361f, +0.557911f,0.827063f,-0.0685738f, +0.570718f,0.812258f,-0.120488f, +0.469437f,0.877038f,-0.102147f, +0.179725f,0.982175f,0.0550563f, +-0.143773f,0.988083f,0.054972f, +-0.0900032f,0.995941f,-0.00107895f, +-0.112639f,0.992937f,-0.0372634f, +-0.0770822f,0.995012f,-0.0633234f, +0.131283f,0.990073f,-0.0501953f, +0.151552f,0.985928f,-0.0705498f, +0.0547644f,0.990744f,-0.124209f, +-0.0889999f,0.992043f,-0.0890439f, +-0.225525f,0.966809f,-0.120075f, +0.367815f,0.812209f,-0.4528f, +0.333749f,0.806687f,-0.487716f, +0.350467f,0.776679f,-0.523395f, +0.428661f,0.776887f,-0.461189f, +0.344028f,0.851962f,-0.394722f, +0.0917588f,0.929121f,-0.35821f, +-0.151193f,0.922445f,-0.355297f, +-0.135334f,0.926245f,-0.351788f, +-0.0236046f,0.919658f,-0.39201f, +0.0475929f,0.924342f,-0.378586f, +0.0534474f,0.931533f,-0.359707f, +0.122967f,0.908442f,-0.399514f, +0.333531f,0.836829f,-0.434137f, +0.345062f,0.821786f,-0.45343f, +0.298405f,0.81077f,-0.503594f, +0.369796f,0.765054f,-0.527202f, +0.289381f,0.806079f,-0.516232f, +0.106326f,0.866117f,-0.488402f, +-0.0247184f,0.959589f,-0.280318f, +-0.247885f,0.952117f,-0.178958f, +-0.233969f,0.968302f,-0.0874651f, +-0.230973f,0.963517f,-0.135224f, +-0.23946f,0.950685f,-0.197121f, +-0.148981f,0.968772f,-0.198205f, +-0.0244446f,0.976892f,-0.212332f, +0.0214143f,0.979888f,-0.198397f, +0.0179015f,0.996249f,-0.084666f, +-0.0584671f,0.995927f,0.0686411f, +-0.0472317f,0.986168f,0.158874f, +-0.0434315f,0.994906f,0.0909663f, +-0.106857f,0.994237f,0.00858694f, +-0.103595f,0.993848f,-0.0391609f, +-0.0110181f,0.988269f,-0.152323f, +0.194953f,0.947451f,-0.253632f, +0.318956f,0.92262f,-0.216885f, +0.355303f,0.928796f,-0.105349f, +0.319482f,0.947371f,-0.0204796f, +0.274811f,0.961125f,0.0267891f, +0.33758f,0.938163f,0.0767414f, +0.445225f,0.885597f,0.132261f, +0.483843f,0.868855f,0.104815f, +0.473616f,0.877987f,0.069475f, +0.358094f,0.929841f,-0.0846442f, +0.209896f,0.940516f,-0.267156f, +0.398687f,0.89746f,-0.188715f, +0.164362f,0.933368f,-0.319075f, +-0.0806345f,0.937721f,-0.337901f, +0.19678f,0.945117f,-0.26083f, +0.467829f,0.857531f,-0.213953f, +0.522616f,0.828828f,-0.199792f, +0.48751f,0.848849f,-0.204424f, +0.559553f,0.806974f,-0.18893f, +0.585339f,0.775984f,-0.235006f, +0.309037f,0.923705f,-0.22642f, +0.0763335f,0.997082f,0.00115348f, +-0.0450053f,0.998556f,0.0293498f, +-0.0333568f,0.997154f,-0.0676115f, +-0.00964185f,0.995848f,-0.0905243f, +0.000956175f,0.96601f,-0.258503f, +0.00169255f,0.940578f,-0.339574f, +0.0710047f,0.988076f,-0.136617f, +0.0666563f,0.995318f,-0.0699874f, +-0.123764f,0.98454f,-0.123946f, +-0.163961f,0.983022f,-0.0823738f, +0.335205f,0.824436f,-0.456008f, +0.40434f,0.809075f,-0.426506f, +0.410475f,0.791681f,-0.452494f, +0.374361f,0.829194f,-0.41508f, +0.245781f,0.909811f,-0.33442f, +0.0263815f,0.954919f,-0.295693f, +-0.125325f,0.941665f,-0.312348f, +-0.129375f,0.929134f,-0.346369f, +-0.0304152f,0.953686f,-0.299263f, +-0.0235504f,0.953092f,-0.301762f, +0.153775f,0.94901f,-0.275197f, +0.274986f,0.871191f,-0.406705f, +0.301999f,0.805469f,-0.509919f, +0.376419f,0.798039f,-0.470576f, +0.361388f,0.809968f,-0.461899f, +0.38255f,0.848875f,-0.364783f, +0.240129f,0.889938f,-0.387747f, +-0.0576931f,0.937865f,-0.342172f, +-0.263371f,0.95113f,-0.161204f, +-0.310954f,0.950327f,-0.0136276f, +-0.223147f,0.974756f,-0.00746382f, +-0.15809f,0.984734f,-0.0728478f, +-0.146587f,0.977645f,-0.150739f, +-0.120405f,0.952352f,-0.280228f, +0.00186508f,0.961595f,-0.274467f, +-0.0732237f,0.95724f,-0.279876f, +-0.12777f,0.973556f,-0.189377f, +-0.137722f,0.985013f,-0.103834f, +-0.0840689f,0.995964f,-0.0314252f, +0.00572333f,0.997438f,0.0713008f, +-0.0203309f,0.999218f,0.033924f, +0.0131655f,0.994107f,-0.107599f, +0.106442f,0.965608f,-0.237214f, +0.156613f,0.948157f,-0.276534f, +0.221784f,0.959186f,-0.175425f, +0.297839f,0.94933f,-0.100322f, +0.237415f,0.96993f,-0.0535752f, +0.206724f,0.977649f,0.0383141f, +0.342833f,0.933108f,0.108513f, +0.413098f,0.906827f,0.0837554f, +0.485601f,0.86482f,0.127586f, +0.517433f,0.850444f,0.0949105f, +0.521609f,0.853001f,-0.0177076f, +0.35462f,0.907818f,-0.223854f, +0.320255f,0.896065f,-0.307417f, +0.254422f,0.945666f,-0.202447f, +-0.0420832f,0.95285f,-0.300511f, +0.132146f,0.911038f,-0.390572f, +0.397135f,0.84337f,-0.361954f, +0.530962f,0.805014f,-0.264634f, +0.518015f,0.788476f,-0.331612f, +0.536794f,0.726368f,-0.429234f, +0.499189f,0.748129f,-0.437165f, +0.193048f,0.933972f,-0.300713f, +-0.0642143f,0.969885f,-0.234947f, +-0.0349143f,0.97216f,-0.231701f, +-0.020308f,0.973327f,-0.22852f, +0.0335645f,0.983758f,-0.176336f, +0.162495f,0.963807f,-0.211356f, +0.0549435f,0.960153f,-0.274021f, +-0.150243f,0.943756f,-0.294538f, +0.093877f,0.988384f,-0.119518f, +-0.0288967f,0.977445f,-0.209205f, +-0.228292f,0.925763f,-0.301406f, +0.329933f,0.832357f,-0.445339f, +0.354113f,0.855807f,-0.377092f, +0.402588f,0.885182f,-0.233185f, +0.310305f,0.922327f,-0.23027f, +0.169674f,0.966179f,-0.194188f, +0.0510686f,0.987038f,-0.152145f, +-0.0638218f,0.978386f,-0.196689f, +-0.116946f,0.960297f,-0.253286f, +-0.0788814f,0.945056f,-0.317249f, +0.0429532f,0.937478f,-0.345383f, +0.160798f,0.890341f,-0.425953f, +0.370061f,0.833359f,-0.410569f, +0.405144f,0.796477f,-0.448867f, +0.330775f,0.831238f,-0.446802f, +0.214187f,0.914592f,-0.342995f, +0.302956f,0.933789f,-0.190409f, +0.260411f,0.956162f,-0.13394f, +-0.0987797f,0.989363f,-0.106786f, +-0.381946f,0.915584f,-0.125788f, +-0.356892f,0.930397f,-0.0835967f, +-0.219462f,0.974624f,-0.0441002f, +-0.0826206f,0.996346f,-0.0216629f, +-0.0522166f,0.993096f,-0.10504f, +-0.0544454f,0.992373f,-0.110596f, +-0.0392289f,0.996233f,-0.0773398f, +-0.0738534f,0.995703f,-0.0558676f, +-0.126249f,0.987782f,-0.0913672f, +-0.191576f,0.965578f,-0.17595f, +-0.204819f,0.971278f,-0.121116f, +-0.121301f,0.991656f,-0.0436452f, +0.0591737f,0.997785f,0.0303762f, +0.146031f,0.988908f,-0.0271181f, +0.164489f,0.985353f,-0.0449734f, +0.1732f,0.984753f,-0.0162076f, +0.192999f,0.97944f,-0.0587201f, +0.224284f,0.970976f,-0.0830781f, +0.215597f,0.976395f,0.0130766f, +0.11857f,0.99294f,-0.00337615f, +0.283009f,0.956652f,0.0687283f, +0.418445f,0.903636f,0.0913547f, +0.498249f,0.865176f,0.0567366f, +0.572218f,0.818628f,-0.0491444f, +0.584595f,0.798602f,-0.143119f, +0.499999f,0.838004f,-0.218521f, +0.312173f,0.860973f,-0.401589f, +0.169015f,0.918853f,-0.356571f, +0.0805256f,0.94115f,-0.328258f, +0.268694f,0.864193f,-0.42541f, +0.373719f,0.773399f,-0.512044f, +0.442856f,0.749728f,-0.491717f, +0.564815f,0.671761f,-0.479293f, +0.549235f,0.627986f,-0.551338f, +0.305274f,0.788247f,-0.534298f, +0.0146963f,0.910216f,-0.413874f, +-0.0347141f,0.920746f,-0.388614f, +-0.0142092f,0.918584f,-0.394971f, +-0.0593092f,0.944757f,-0.32236f, +-0.0129026f,0.951456f,-0.307515f, +0.101136f,0.954598f,-0.280203f, +0.103786f,0.979836f,-0.170731f, +-0.130724f,0.946294f,-0.2957f, +-0.0475497f,0.951312f,-0.30454f, +0.068843f,0.980898f,-0.181933f, +-0.0601749f,0.975587f,-0.21121f, +0.164088f,0.946673f,-0.277283f, +0.219167f,0.958752f,-0.180996f, +0.292116f,0.952214f,-0.0892046f, +0.382294f,0.923975f,-0.0110254f, +0.185963f,0.972429f,-0.140709f, +0.0282036f,0.98507f,-0.16983f, +-0.0260978f,0.984942f,-0.170904f, +0.00347731f,0.966818f,-0.255444f, +0.046523f,0.915606f,-0.399376f, +0.121249f,0.881024f,-0.457269f, +0.234655f,0.843553f,-0.483069f, +0.349259f,0.806387f,-0.47724f, +0.352024f,0.817545f,-0.455741f, +0.21f,0.895765f,-0.391796f, +0.123731f,0.946466f,-0.298149f, +0.189246f,0.953263f,-0.235533f, +0.21574f,0.971887f,-0.0943018f, +-0.0878709f,0.988681f,-0.12161f, +-0.31365f,0.930831f,-0.187554f, +-0.370884f,0.90378f,-0.213602f, +-0.292833f,0.938489f,-0.182993f, +-0.076513f,0.991298f,-0.107116f, +-0.0492348f,0.994225f,-0.0953508f, +-0.128831f,0.991129f,-0.0326479f, +-0.117178f,0.99304f,0.0118732f, +-0.0834857f,0.989043f,0.12175f, +-0.0124631f,0.991817f,0.127061f, +-0.133134f,0.991073f,-0.00703918f, +-0.190067f,0.981738f,-0.00811131f, +-0.0950662f,0.989352f,-0.110206f, +0.0262188f,0.977376f,-0.209877f, +0.0774906f,0.981033f,-0.177679f, +0.0911686f,0.995787f,-0.00982619f, +0.177517f,0.984043f,0.0121696f, +0.260966f,0.962001f,-0.0803208f, +0.219093f,0.96759f,-0.12557f, +0.15488f,0.986019f,-0.06147f, +0.155325f,0.987507f,-0.0265508f, +0.257438f,0.9633f,-0.0760109f, +0.429699f,0.898131f,-0.0933795f, +0.553938f,0.821258f,-0.136702f, +0.635333f,0.740056f,-0.220611f, +0.590775f,0.752696f,-0.290577f, +0.544721f,0.782975f,-0.300381f, +0.386007f,0.854199f,-0.348343f, +0.159868f,0.903698f,-0.397205f, +0.111475f,0.854344f,-0.507613f, +0.32886f,0.783243f,-0.527619f, +0.428722f,0.729381f,-0.533105f, +0.463071f,0.680849f,-0.567459f, +0.578683f,0.643078f,-0.501575f, +0.498776f,0.750313f,-0.433881f, +0.172367f,0.935224f,-0.309265f, +-0.0549105f,0.957697f,-0.282492f, +-0.000989137f,0.955961f,-0.293491f, +-0.105185f,0.947134f,-0.303107f, +-0.108598f,0.951252f,-0.288662f, +-0.0192021f,0.937992f,-0.346125f, +0.0434621f,0.947915f,-0.315545f, +0.0658084f,0.965866f,-0.250542f, +0.00168367f,0.969468f,-0.245211f, +-0.0752902f,0.953259f,-0.292624f, +-0.0406571f,0.962797f,-0.267151f, +-0.0486067f,0.969651f,-0.239615f, +0.0419974f,0.993223f,-0.108371f, +0.194169f,0.980548f,-0.0286949f, +0.261981f,0.963651f,-0.0523696f, +0.349136f,0.937066f,-0.00343362f, +0.31121f,0.950026f,0.0244779f, +0.0510089f,0.992585f,-0.110335f, +0.0314098f,0.989653f,-0.140003f, +0.185979f,0.958236f,-0.217244f, +0.136104f,0.898638f,-0.417044f, +0.108771f,0.892335f,-0.438072f, +0.238757f,0.906785f,-0.34747f, +0.373646f,0.87379f,-0.311256f, +0.340425f,0.883999f,-0.320402f, +0.14853f,0.93597f,-0.319217f, +0.0564088f,0.968057f,-0.244304f, +0.0971116f,0.979187f,-0.17822f, +0.12449f,0.986246f,-0.108724f, +0.00791995f,0.999591f,-0.0274806f, +-0.236925f,0.964883f,-0.113439f, +-0.404549f,0.891486f,-0.203944f, +-0.302952f,0.940514f,-0.153798f, +-0.187243f,0.970939f,-0.149055f, +-0.103813f,0.994585f,-0.00480558f, +-0.136945f,0.990579f,0.00047278f, +-0.192386f,0.981319f,0.000301484f, +-0.157118f,0.980577f,0.117404f, +-0.0205849f,0.995936f,0.0876826f, +-0.0389376f,0.992928f,0.112147f, +-0.205589f,0.977918f,0.0375515f, +0.0799477f,0.995293f,0.0547661f, +0.128711f,0.981689f,-0.140426f, +-0.00377139f,0.985264f,-0.170999f, +-0.0186288f,0.990563f,-0.135788f, +0.247861f,0.95847f,-0.141069f, +0.335397f,0.913398f,-0.230679f, +0.164127f,0.956335f,-0.241837f, +0.0560549f,0.992155f,-0.111746f, +0.165621f,0.985752f,-0.0293729f, +0.329655f,0.93718f,-0.114108f, +0.47188f,0.859421f,-0.196784f, +0.593068f,0.774119f,-0.22138f, +0.65363f,0.716422f,-0.24394f, +0.606788f,0.760352f,-0.231675f, +0.536399f,0.810894f,-0.23394f, +0.343135f,0.901586f,-0.263439f, +0.295862f,0.930397f,-0.216396f, +0.307346f,0.85762f,-0.412342f, +0.36437f,0.770675f,-0.522776f, +0.48977f,0.726784f,-0.481571f, +0.467664f,0.727396f,-0.50218f, +0.516451f,0.759976f,-0.394608f, +0.369408f,0.883578f,-0.287798f, +0.11272f,0.986131f,-0.121821f, +-0.0556185f,0.985996f,-0.157218f, +-0.0141506f,0.99059f,-0.13613f, +-0.0462718f,0.993931f,-0.099801f, +-0.0190733f,0.9801f,-0.197584f, +0.0617351f,0.955747f,-0.287639f, +-0.00791345f,0.937814f,-0.347049f, +0.0263533f,0.943249f,-0.331038f, +-0.0408223f,0.937006f,-0.34692f, +-0.0840519f,0.9495f,-0.302299f, +-0.0536227f,0.964498f,-0.25859f, +-0.0366453f,0.973297f,-0.226607f, +0.0559372f,0.997556f,-0.0418806f, +0.117658f,0.99199f,-0.0459629f, +0.260816f,0.963552f,0.059517f, +0.265721f,0.95723f,0.114473f, +0.305022f,0.92568f,0.223781f, +0.229311f,0.961539f,0.151192f, +0.0614828f,0.993074f,-0.10012f, +0.279787f,0.947394f,-0.15545f, +0.307005f,0.902601f,-0.301762f, +0.0599313f,0.924785f,-0.375741f, +0.138459f,0.941623f,-0.306881f, +0.380474f,0.890209f,-0.250536f, +0.362157f,0.883362f,-0.297512f, +0.118666f,0.951617f,-0.283449f, +-0.0864913f,0.973386f,-0.212226f, +0.0535968f,0.99807f,-0.0313783f, +0.0571748f,0.998014f,0.026449f, +-0.0576417f,0.995225f,0.0787756f, +-0.164671f,0.983729f,0.0718444f, +-0.317398f,0.947117f,0.0472105f, +-0.350813f,0.936189f,-0.0219157f, +-0.249283f,0.968275f,0.0173648f, +-0.166219f,0.983818f,0.0668861f, +-0.137263f,0.989074f,0.0537794f, +-0.237615f,0.966132f,0.100634f, +-0.156805f,0.98112f,0.113207f, +0.0155394f,0.999476f,0.0283817f, +-0.0358194f,0.998926f,0.0293752f, +-0.187269f,0.982125f,-0.01898f, +0.0856923f,0.996255f,0.0114998f, +0.21812f,0.975918f,0.00295422f, +0.0575266f,0.997525f,-0.0404377f, +0.0557844f,0.976324f,-0.208997f, +0.282723f,0.906166f,-0.314533f, +0.34017f,0.885713f,-0.315906f, +0.0703654f,0.964786f,-0.253451f, +-0.0857039f,0.987005f,-0.135924f, +0.161068f,0.982423f,-0.0943491f, +0.439921f,0.879468f,-0.181673f, +0.499341f,0.805071f,-0.320185f, +0.581376f,0.752639f,-0.309089f, +0.634744f,0.735927f,-0.235609f, +0.590228f,0.797974f,-0.121932f, +0.552123f,0.824777f,-0.122079f, +0.403254f,0.893687f,-0.196749f, +0.282279f,0.904426f,-0.319896f, +0.487441f,0.821419f,-0.296095f, +0.471414f,0.771013f,-0.428146f, +0.452383f,0.750947f,-0.48107f, +0.453351f,0.789814f,-0.413117f, +0.426317f,0.829282f,-0.361311f, +0.274227f,0.935292f,-0.223671f, +0.0409647f,0.985686f,-0.16354f, +0.00611451f,0.980211f,-0.19786f, +-0.0818346f,0.965065f,-0.248905f, +-0.0402149f,0.984168f,-0.172615f, +0.0358772f,0.970818f,-0.237119f, +0.140843f,0.951316f,-0.274156f, +0.0386407f,0.935491f,-0.351232f, +0.02521f,0.945244f,-0.325388f, +-0.00704123f,0.966541f,-0.256414f, +-0.132543f,0.963814f,-0.231288f, +-0.120001f,0.972985f,-0.197233f, +-0.125856f,0.970406f,-0.20609f, +0.150068f,0.984139f,0.0946078f, +0.0962514f,0.994035f,0.0512922f, +0.139768f,0.98134f,0.132051f, +0.167943f,0.959948f,0.224265f, +0.248876f,0.931236f,0.266197f, +0.347088f,0.901338f,0.259075f, +0.298327f,0.935934f,0.187161f, +0.410224f,0.911771f,0.0197232f, +0.382392f,0.916875f,-0.11453f, +0.0687189f,0.981224f,-0.180215f, +0.109108f,0.978331f,-0.175964f, +0.423091f,0.889035f,-0.17496f, +0.308023f,0.9305f,-0.198221f, +0.0610242f,0.996399f,-0.0588678f, +-0.139679f,0.983461f,-0.1153f, +-0.178862f,0.976278f,-0.122024f, +-0.0279755f,0.98865f,0.147609f, +0.0175582f,0.984678f,0.173494f, +-0.182965f,0.982824f,0.0240987f, +-0.334982f,0.934918f,0.117109f, +-0.346361f,0.929574f,0.126201f, +-0.256073f,0.950373f,0.176686f, +-0.14622f,0.975847f,0.162306f, +-0.145894f,0.982033f,0.119692f, +-0.243091f,0.96438f,0.104295f, +-0.119399f,0.991881f,0.0437603f, +0.0792305f,0.996134f,0.0379462f, +-0.0234512f,0.999544f,0.0190445f, +-0.148416f,0.988869f,0.0105176f, +0.0279419f,0.999576f,0.00824062f, +0.239276f,0.970159f,0.0392311f, +0.182184f,0.979477f,-0.086222f, +0.251919f,0.933495f,-0.255194f, +0.359782f,0.855042f,-0.373444f, +0.260041f,0.87469f,-0.409017f, +-0.0332083f,0.931159f,-0.363099f, +-0.108678f,0.933514f,-0.341673f, +0.191287f,0.909011f,-0.370282f, +0.516055f,0.783319f,-0.346553f, +0.557568f,0.726461f,-0.401711f, +0.511814f,0.738467f,-0.438991f, +0.509794f,0.789775f,-0.341125f, +0.522098f,0.819729f,-0.235496f, +0.54438f,0.815602f,-0.196071f, +0.540927f,0.823066f,-0.173089f, +0.36892f,0.838043f,-0.401972f, +0.461826f,0.790802f,-0.401684f, +0.549439f,0.728653f,-0.408878f, +0.455853f,0.753497f,-0.473751f, +0.389397f,0.799772f,-0.456875f, +0.293181f,0.868874f,-0.398878f, +0.155589f,0.965139f,-0.210473f, +0.031565f,0.984349f,-0.173382f, +0.0970165f,0.970686f,-0.219901f, +-0.0352366f,0.943342f,-0.329946f, +-0.0636858f,0.931929f,-0.357006f, +0.111555f,0.924517f,-0.364451f, +0.180963f,0.908751f,-0.376064f, +0.0582409f,0.924666f,-0.376299f, +-0.091325f,0.934476f,-0.344113f, +-0.148498f,0.963415f,-0.223113f, +-0.170646f,0.976481f,-0.131776f, +-0.0961794f,0.980781f,-0.169761f, +-0.06221f,0.973089f,-0.221874f, +0.206636f,0.934831f,0.288777f, +0.0869406f,0.963592f,0.252847f, +0.0799701f,0.959241f,0.271038f, +0.160525f,0.963414f,0.21463f, +0.255681f,0.955661f,0.146082f, +0.323027f,0.93103f,0.169812f, +0.330118f,0.920313f,0.209873f, +0.447578f,0.884885f,0.12904f, +0.467368f,0.874534f,0.129448f, +0.130174f,0.988207f,0.0806387f, +0.145402f,0.989036f,-0.0258009f, +0.425216f,0.898822f,-0.106345f, +0.205136f,0.977985f,-0.0382811f, +-0.0258123f,0.995757f,0.0883314f, +-0.00518813f,0.996132f,0.0877124f, +-0.192412f,0.980974f,0.0258233f, +-0.196114f,0.979963f,0.0348015f, +0.0217983f,0.995754f,0.0894399f, +-0.10216f,0.980256f,0.169296f, +-0.384424f,0.908881f,0.161723f, +-0.367551f,0.91996f,0.136309f, +-0.285788f,0.948719f,0.135118f, +-0.171256f,0.972185f,0.159771f, +-0.0605854f,0.969905f,0.235826f, +-0.167372f,0.981266f,0.0954134f, +-0.0977838f,0.994994f,0.0206294f, +0.0451608f,0.997867f,0.0471292f, +-0.0136124f,0.997411f,0.0706177f, +-0.158818f,0.986831f,0.0306748f, +0.0267005f,0.99957f,0.0121357f, +0.289361f,0.957076f,-0.0166175f, +0.336393f,0.939976f,-0.0573177f, +0.390118f,0.913466f,-0.115702f, +0.445853f,0.875576f,-0.185959f, +0.293335f,0.914816f,-0.277609f, +-0.00739937f,0.915657f,-0.401893f, +0.00533725f,0.872492f,-0.488599f, +0.197734f,0.788261f,-0.582705f, +0.43334f,0.722538f,-0.53866f, +0.548408f,0.706281f,-0.447678f, +0.484095f,0.751007f,-0.449045f, +0.458828f,0.77804f,-0.429103f, +0.441245f,0.787203f,-0.430829f, +0.474553f,0.805707f,-0.354451f, +0.550933f,0.789486f,-0.270526f, +0.502032f,0.792798f,-0.345594f, +0.478273f,0.764634f,-0.43196f, +0.556872f,0.730832f,-0.394687f, +0.471855f,0.788619f,-0.394251f, +0.354943f,0.841801f,-0.406677f, +0.154029f,0.899791f,-0.40823f, +0.0155123f,0.938951f,-0.343701f, +0.0497714f,0.948037f,-0.314243f, +0.154285f,0.935402f,-0.31815f, +0.101927f,0.920411f,-0.377432f, +-0.0203862f,0.864666f,-0.501933f, +0.070179f,0.866621f,-0.494007f, +0.100294f,0.910674f,-0.400766f, +0.000402101f,0.968295f,-0.249809f, +-0.128961f,0.971456f,-0.199105f, +-0.199723f,0.946207f,-0.254564f, +-0.134113f,0.940975f,-0.310772f, +-0.0316747f,0.927512f,-0.372449f, +0.0302907f,0.938917f,-0.342807f, +0.218976f,0.899032f,0.379198f, +0.139079f,0.919337f,0.368072f, +0.135024f,0.957047f,0.256573f, +0.313512f,0.936875f,0.154838f, +0.29644f,0.95504f,0.00476296f, +0.279277f,0.959996f,0.0202722f, +0.3625f,0.931007f,0.0426625f, +0.472022f,0.881367f,0.0196857f, +0.429567f,0.887347f,0.167594f, +0.224991f,0.963227f,0.146879f, +0.296133f,0.954919f,-0.0208476f, +0.415966f,0.902166f,-0.114319f, +0.183129f,0.982743f,0.0260829f, +-0.0925135f,0.995706f,-0.00325499f, +-0.0437431f,0.995986f,0.0780946f, +-0.179713f,0.977607f,0.109486f, +-0.141385f,0.986823f,0.0786845f, +-0.085949f,0.993479f,0.0749198f, +-0.233157f,0.944593f,0.231044f, +-0.345216f,0.897121f,0.275681f, +-0.266518f,0.944857f,0.190296f, +-0.236509f,0.971079f,0.032684f, +-0.255527f,0.96653f,-0.0229239f, +-0.0941044f,0.991025f,0.0949427f, +-0.0715158f,0.990946f,0.113625f, +-0.0636481f,0.988651f,0.136079f, +0.0130078f,0.992968f,0.11767f, +0.0194535f,0.99321f,0.114698f, +-0.0733749f,0.997304f,0.000320173f, +0.0745089f,0.991949f,-0.102398f, +0.316045f,0.940065f,-0.128038f, +0.302503f,0.936628f,-0.176692f, +0.365578f,0.917629f,-0.155918f, +0.474055f,0.875706f,-0.091714f, +0.462666f,0.882661f,-0.0827679f, +0.197672f,0.918824f,-0.341598f, +0.1211f,0.851979f,-0.509379f, +0.340562f,0.776445f,-0.530237f, +0.411588f,0.704014f,-0.578756f, +0.454493f,0.713166f,-0.533695f, +0.463114f,0.742631f,-0.483761f, +0.44079f,0.754688f,-0.485953f, +0.400302f,0.772025f,-0.493696f, +0.38659f,0.783016f,-0.487272f, +0.457033f,0.766931f,-0.450487f, +0.547084f,0.759757f,-0.351382f, +0.508566f,0.782012f,-0.360303f, +0.54699f,0.792915f,-0.268492f, +0.489855f,0.837224f,-0.243102f, +0.350988f,0.891534f,-0.286312f, +0.195385f,0.947495f,-0.253137f, +0.0709694f,0.939176f,-0.336023f, +0.0288377f,0.903143f,-0.42837f, +0.128806f,0.91498f,-0.382389f, +0.209123f,0.895775f,-0.392243f, +0.0981301f,0.852621f,-0.513233f, +-0.0414306f,0.841347f,-0.538906f, +-0.0951984f,0.922571f,-0.373899f, +-0.157973f,0.963972f,-0.214014f, +-0.107909f,0.978829f,-0.173926f, +-0.0713291f,0.969594f,-0.234092f, +0.0141898f,0.950434f,-0.310602f, +-0.0202439f,0.895649f,-0.4443f, +-0.114151f,0.867225f,-0.484655f, +0.0955354f,0.969912f,0.223927f, +0.218114f,0.913651f,0.343028f, +0.223104f,0.958808f,0.175816f, +0.39761f,0.915149f,0.0663907f, +0.332649f,0.940641f,-0.0673772f, +0.280455f,0.956871f,-0.0757854f, +0.359446f,0.926985f,-0.107225f, +0.369482f,0.924827f,-0.0904272f, +0.410746f,0.887001f,0.210991f, +0.335823f,0.922126f,0.192112f, +0.395669f,0.917218f,-0.0464346f, +0.353697f,0.926083f,-0.131407f, +0.179534f,0.981887f,0.0605388f, +-0.13479f,0.99057f,-0.0245515f, +-0.0725996f,0.990136f,0.119831f, +-0.160567f,0.981095f,0.108036f, +-0.173547f,0.983858f,0.0436428f, +-0.151709f,0.976244f,0.154697f, +-0.302597f,0.914896f,0.267208f, +-0.328732f,0.906446f,0.265123f, +-0.132663f,0.960039f,0.246424f, +-0.138673f,0.989957f,0.0274833f, +-0.234284f,0.968151f,-0.0882923f, +-0.176173f,0.979923f,-0.0933525f, +-0.138089f,0.990412f,-0.00402308f, +-0.0957719f,0.981754f,0.164279f, +0.0343111f,0.979592f,0.198047f, +0.0638942f,0.984862f,0.161133f, +0.0719687f,0.995312f,0.0646062f, +0.0847007f,0.982914f,-0.163422f, +0.363247f,0.926697f,-0.0963506f, +0.36667f,0.908341f,-0.201173f, +0.337169f,0.882657f,-0.327465f, +0.394509f,0.879929f,-0.264742f, +0.48646f,0.864989f,-0.123088f, +0.417344f,0.883151f,-0.21417f, +0.20086f,0.830272f,-0.519907f, +0.38892f,0.767179f,-0.510077f, +0.449414f,0.718324f,-0.531072f, +0.423477f,0.726204f,-0.541567f, +0.422958f,0.74196f,-0.520194f, +0.433204f,0.760712f,-0.483374f, +0.409051f,0.775415f,-0.481049f, +0.416047f,0.762178f,-0.495973f, +0.412818f,0.728929f,-0.546117f, +0.422596f,0.756339f,-0.499363f, +0.473538f,0.806572f,-0.353841f, +0.474731f,0.838081f,-0.268794f, +0.539079f,0.832631f,-0.126962f, +0.311124f,0.910644f,-0.271898f, +0.195648f,0.962321f,-0.18884f, +0.177086f,0.961235f,-0.211349f, +0.0559264f,0.927874f,-0.368677f, +0.121016f,0.928529f,-0.350982f, +0.256538f,0.895264f,-0.364269f, +0.222607f,0.876269f,-0.427317f, +-0.106542f,0.82471f,-0.55543f, +-0.245122f,0.890501f,-0.383305f, +-0.209725f,0.956698f,-0.201855f, +-0.0624605f,0.97406f,-0.2175f, +-0.0812465f,0.947824f,-0.308266f, +0.0649824f,0.972455f,-0.223851f, +0.119957f,0.950206f,-0.287609f, +-0.0414767f,0.905483f,-0.422351f, +}; + +btScalar Landscape03Tex[] = { +0.507813f,0.5f, +0.507813f,0.492188f, +0.515625f,0.5f, +0.515625f,0.492188f, +0.523438f,0.5f, +0.523438f,0.492188f, +0.53125f,0.5f, +0.53125f,0.492188f, +0.539063f,0.5f, +0.539063f,0.492188f, +0.546875f,0.5f, +0.546875f,0.492188f, +0.554688f,0.5f, +0.554688f,0.492188f, +0.5625f,0.5f, +0.5625f,0.492188f, +0.570313f,0.5f, +0.570313f,0.492188f, +0.578125f,0.5f, +0.578125f,0.492188f, +0.585938f,0.5f, +0.585938f,0.492188f, +0.59375f,0.5f, +0.59375f,0.492188f, +0.601563f,0.5f, +0.601563f,0.492188f, +0.609375f,0.5f, +0.609375f,0.492188f, +0.617188f,0.5f, +0.617188f,0.492188f, +0.625f,0.5f, +0.625f,0.492188f, +0.632813f,0.5f, +0.632813f,0.492188f, +0.640625f,0.5f, +0.640625f,0.492188f, +0.648438f,0.5f, +0.648438f,0.492188f, +0.65625f,0.5f, +0.65625f,0.492188f, +0.664063f,0.5f, +0.664063f,0.492188f, +0.671875f,0.5f, +0.671875f,0.492188f, +0.679688f,0.5f, +0.679688f,0.492188f, +0.6875f,0.5f, +0.6875f,0.492188f, +0.695313f,0.5f, +0.695313f,0.492188f, +0.703125f,0.5f, +0.703125f,0.492188f, +0.710938f,0.5f, +0.710938f,0.492188f, +0.71875f,0.5f, +0.71875f,0.492188f, +0.726563f,0.5f, +0.726563f,0.492188f, +0.734375f,0.5f, +0.734375f,0.492188f, +0.742188f,0.5f, +0.742188f,0.492188f, +0.75f,0.5f, +0.75f,0.492188f, +0.757813f,0.5f, +0.757813f,0.492188f, +0.765625f,0.5f, +0.765625f,0.492188f, +0.773438f,0.5f, +0.773438f,0.492188f, +0.78125f,0.5f, +0.78125f,0.492188f, +0.789063f,0.5f, +0.789063f,0.492188f, +0.796875f,0.5f, +0.796875f,0.492188f, +0.804688f,0.5f, +0.804688f,0.492188f, +0.8125f,0.5f, +0.8125f,0.492188f, +0.820313f,0.5f, +0.820313f,0.492188f, +0.828125f,0.5f, +0.828125f,0.492188f, +0.835938f,0.5f, +0.835938f,0.492188f, +0.84375f,0.5f, +0.84375f,0.492188f, +0.851563f,0.5f, +0.851563f,0.492188f, +0.859375f,0.5f, +0.859375f,0.492188f, +0.867188f,0.5f, +0.867188f,0.492188f, +0.875f,0.5f, +0.875f,0.492188f, +0.882813f,0.5f, +0.882813f,0.492188f, +0.890625f,0.5f, +0.890625f,0.492188f, +0.898438f,0.5f, +0.898438f,0.492188f, +0.90625f,0.5f, +0.90625f,0.492188f, +0.914063f,0.5f, +0.914063f,0.492188f, +0.921875f,0.5f, +0.921875f,0.492188f, +0.929688f,0.5f, +0.929688f,0.492188f, +0.9375f,0.5f, +0.9375f,0.492188f, +0.945313f,0.5f, +0.945313f,0.492188f, +0.953125f,0.5f, +0.953125f,0.492188f, +0.960938f,0.5f, +0.960938f,0.492188f, +0.96875f,0.5f, +0.96875f,0.492188f, +0.976563f,0.5f, +0.976563f,0.492188f, +0.984375f,0.5f, +0.984375f,0.492188f, +0.992188f,0.5f, +0.992188f,0.492188f, +1.0f,0.5f, +1.0f,0.492188f, +0.507813f,0.507813f, +0.515625f,0.507813f, +0.523438f,0.507813f, +0.53125f,0.507813f, +0.539063f,0.507813f, +0.546875f,0.507813f, +0.554688f,0.507813f, +0.5625f,0.507813f, +0.570313f,0.507813f, +0.578125f,0.507813f, +0.585938f,0.507813f, +0.59375f,0.507813f, +0.601563f,0.507813f, +0.609375f,0.507813f, +0.617188f,0.507813f, +0.625f,0.507813f, +0.632813f,0.507813f, +0.640625f,0.507813f, +0.648438f,0.507813f, +0.65625f,0.507813f, +0.664063f,0.507813f, +0.671875f,0.507813f, +0.679688f,0.507813f, +0.6875f,0.507813f, +0.695313f,0.507813f, +0.703125f,0.507813f, +0.710938f,0.507813f, +0.71875f,0.507813f, +0.726563f,0.507813f, +0.734375f,0.507813f, +0.742188f,0.507813f, +0.75f,0.507813f, +0.757813f,0.507813f, +0.765625f,0.507813f, +0.773438f,0.507813f, +0.78125f,0.507813f, +0.789063f,0.507813f, +0.796875f,0.507813f, +0.804688f,0.507813f, +0.8125f,0.507813f, +0.820313f,0.507813f, +0.828125f,0.507813f, +0.835938f,0.507813f, +0.84375f,0.507813f, +0.851563f,0.507813f, +0.859375f,0.507813f, +0.867188f,0.507813f, +0.875f,0.507813f, +0.882813f,0.507813f, +0.890625f,0.507813f, +0.898438f,0.507813f, +0.90625f,0.507813f, +0.914063f,0.507813f, +0.921875f,0.507813f, +0.929688f,0.507813f, +0.9375f,0.507813f, +0.945313f,0.507813f, +0.953125f,0.507813f, +0.960938f,0.507813f, +0.96875f,0.507813f, +0.976563f,0.507813f, +0.984375f,0.507813f, +0.992188f,0.507813f, +1.0f,0.507813f, +0.507813f,0.515625f, +0.515625f,0.515625f, +0.523438f,0.515625f, +0.53125f,0.515625f, +0.539063f,0.515625f, +0.546875f,0.515625f, +0.554688f,0.515625f, +0.5625f,0.515625f, +0.570313f,0.515625f, +0.578125f,0.515625f, +0.585938f,0.515625f, +0.59375f,0.515625f, +0.601563f,0.515625f, +0.609375f,0.515625f, +0.617188f,0.515625f, +0.625f,0.515625f, +0.632813f,0.515625f, +0.640625f,0.515625f, +0.648438f,0.515625f, +0.65625f,0.515625f, +0.664063f,0.515625f, +0.671875f,0.515625f, +0.679688f,0.515625f, +0.6875f,0.515625f, +0.695313f,0.515625f, +0.703125f,0.515625f, +0.710938f,0.515625f, +0.71875f,0.515625f, +0.726563f,0.515625f, +0.734375f,0.515625f, +0.742188f,0.515625f, +0.75f,0.515625f, +0.757813f,0.515625f, +0.765625f,0.515625f, +0.773438f,0.515625f, +0.78125f,0.515625f, +0.789063f,0.515625f, +0.796875f,0.515625f, +0.804688f,0.515625f, +0.8125f,0.515625f, +0.820313f,0.515625f, +0.828125f,0.515625f, +0.835938f,0.515625f, +0.84375f,0.515625f, +0.851563f,0.515625f, +0.859375f,0.515625f, +0.867188f,0.515625f, +0.875f,0.515625f, +0.882813f,0.515625f, +0.890625f,0.515625f, +0.898438f,0.515625f, +0.90625f,0.515625f, +0.914063f,0.515625f, +0.921875f,0.515625f, +0.929688f,0.515625f, +0.9375f,0.515625f, +0.945313f,0.515625f, +0.953125f,0.515625f, +0.960938f,0.515625f, +0.96875f,0.515625f, +0.976563f,0.515625f, +0.984375f,0.515625f, +0.992188f,0.515625f, +1.0f,0.515625f, +0.507813f,0.523438f, +0.515625f,0.523438f, +0.523438f,0.523438f, +0.53125f,0.523438f, +0.539063f,0.523438f, +0.546875f,0.523438f, +0.554688f,0.523438f, +0.5625f,0.523438f, +0.570313f,0.523438f, +0.578125f,0.523438f, +0.585938f,0.523438f, +0.59375f,0.523438f, +0.601563f,0.523438f, +0.609375f,0.523438f, +0.617188f,0.523438f, +0.625f,0.523438f, +0.632813f,0.523438f, +0.640625f,0.523438f, +0.648438f,0.523438f, +0.65625f,0.523438f, +0.664063f,0.523438f, +0.671875f,0.523438f, +0.679688f,0.523438f, +0.6875f,0.523438f, +0.695313f,0.523438f, +0.703125f,0.523438f, +0.710938f,0.523438f, +0.71875f,0.523438f, +0.726563f,0.523438f, +0.734375f,0.523438f, +0.742188f,0.523438f, +0.75f,0.523438f, +0.757813f,0.523438f, +0.765625f,0.523438f, +0.773438f,0.523438f, +0.78125f,0.523438f, +0.789063f,0.523438f, +0.796875f,0.523438f, +0.804688f,0.523438f, +0.8125f,0.523438f, +0.820313f,0.523438f, +0.828125f,0.523438f, +0.835938f,0.523438f, +0.84375f,0.523438f, +0.851563f,0.523438f, +0.859375f,0.523438f, +0.867188f,0.523438f, +0.875f,0.523438f, +0.882813f,0.523438f, +0.890625f,0.523438f, +0.898438f,0.523438f, +0.90625f,0.523438f, +0.914063f,0.523438f, +0.921875f,0.523438f, +0.929688f,0.523438f, +0.9375f,0.523438f, +0.945313f,0.523438f, +0.953125f,0.523438f, +0.960938f,0.523438f, +0.96875f,0.523438f, +0.976563f,0.523438f, +0.984375f,0.523438f, +0.992188f,0.523438f, +1.0f,0.523438f, +0.507813f,0.53125f, +0.515625f,0.53125f, +0.523438f,0.53125f, +0.53125f,0.53125f, +0.539063f,0.53125f, +0.546875f,0.53125f, +0.554688f,0.53125f, +0.5625f,0.53125f, +0.570313f,0.53125f, +0.578125f,0.53125f, +0.585938f,0.53125f, +0.59375f,0.53125f, +0.601563f,0.53125f, +0.609375f,0.53125f, +0.617188f,0.53125f, +0.625f,0.53125f, +0.632813f,0.53125f, +0.640625f,0.53125f, +0.648438f,0.53125f, +0.65625f,0.53125f, +0.664063f,0.53125f, +0.671875f,0.53125f, +0.679688f,0.53125f, +0.6875f,0.53125f, +0.695313f,0.53125f, +0.703125f,0.53125f, +0.710938f,0.53125f, +0.71875f,0.53125f, +0.726563f,0.53125f, +0.734375f,0.53125f, +0.742188f,0.53125f, +0.75f,0.53125f, +0.757813f,0.53125f, +0.765625f,0.53125f, +0.773438f,0.53125f, +0.78125f,0.53125f, +0.789063f,0.53125f, +0.796875f,0.53125f, +0.804688f,0.53125f, +0.8125f,0.53125f, +0.820313f,0.53125f, +0.828125f,0.53125f, +0.835938f,0.53125f, +0.84375f,0.53125f, +0.851563f,0.53125f, +0.859375f,0.53125f, +0.867188f,0.53125f, +0.875f,0.53125f, +0.882813f,0.53125f, +0.890625f,0.53125f, +0.898438f,0.53125f, +0.90625f,0.53125f, +0.914063f,0.53125f, +0.921875f,0.53125f, +0.929688f,0.53125f, +0.9375f,0.53125f, +0.945313f,0.53125f, +0.953125f,0.53125f, +0.960938f,0.53125f, +0.96875f,0.53125f, +0.976563f,0.53125f, +0.984375f,0.53125f, +0.992188f,0.53125f, +1.0f,0.53125f, +0.507813f,0.539063f, +0.515625f,0.539063f, +0.523438f,0.539063f, +0.53125f,0.539063f, +0.539063f,0.539063f, +0.546875f,0.539063f, +0.554688f,0.539063f, +0.5625f,0.539063f, +0.570313f,0.539063f, +0.578125f,0.539063f, +0.585938f,0.539063f, +0.59375f,0.539063f, +0.601563f,0.539063f, +0.609375f,0.539063f, +0.617188f,0.539063f, +0.625f,0.539063f, +0.632813f,0.539063f, +0.640625f,0.539063f, +0.648438f,0.539063f, +0.65625f,0.539063f, +0.664063f,0.539063f, +0.671875f,0.539063f, +0.679688f,0.539063f, +0.6875f,0.539063f, +0.695313f,0.539063f, +0.703125f,0.539063f, +0.710938f,0.539063f, +0.71875f,0.539063f, +0.726563f,0.539063f, +0.734375f,0.539063f, +0.742188f,0.539063f, +0.75f,0.539063f, +0.757813f,0.539063f, +0.765625f,0.539063f, +0.773438f,0.539063f, +0.78125f,0.539063f, +0.789063f,0.539063f, +0.796875f,0.539063f, +0.804688f,0.539063f, +0.8125f,0.539063f, +0.820313f,0.539063f, +0.828125f,0.539063f, +0.835938f,0.539063f, +0.84375f,0.539063f, +0.851563f,0.539063f, +0.859375f,0.539063f, +0.867188f,0.539063f, +0.875f,0.539063f, +0.882813f,0.539063f, +0.890625f,0.539063f, +0.898438f,0.539063f, +0.90625f,0.539063f, +0.914063f,0.539063f, +0.921875f,0.539063f, +0.929688f,0.539063f, +0.9375f,0.539063f, +0.945313f,0.539063f, +0.953125f,0.539063f, +0.960938f,0.539063f, +0.96875f,0.539063f, +0.976563f,0.539063f, +0.984375f,0.539063f, +0.992188f,0.539063f, +1.0f,0.539063f, +0.507813f,0.546875f, +0.515625f,0.546875f, +0.523438f,0.546875f, +0.53125f,0.546875f, +0.539063f,0.546875f, +0.546875f,0.546875f, +0.554688f,0.546875f, +0.5625f,0.546875f, +0.570313f,0.546875f, +0.578125f,0.546875f, +0.585938f,0.546875f, +0.59375f,0.546875f, +0.601563f,0.546875f, +0.609375f,0.546875f, +0.617188f,0.546875f, +0.625f,0.546875f, +0.632813f,0.546875f, +0.640625f,0.546875f, +0.648438f,0.546875f, +0.65625f,0.546875f, +0.664063f,0.546875f, +0.671875f,0.546875f, +0.679688f,0.546875f, +0.6875f,0.546875f, +0.695313f,0.546875f, +0.703125f,0.546875f, +0.710938f,0.546875f, +0.71875f,0.546875f, +0.726563f,0.546875f, +0.734375f,0.546875f, +0.742188f,0.546875f, +0.75f,0.546875f, +0.757813f,0.546875f, +0.765625f,0.546875f, +0.773438f,0.546875f, +0.78125f,0.546875f, +0.789063f,0.546875f, +0.796875f,0.546875f, +0.804688f,0.546875f, +0.8125f,0.546875f, +0.820313f,0.546875f, +0.828125f,0.546875f, +0.835938f,0.546875f, +0.84375f,0.546875f, +0.851563f,0.546875f, +0.859375f,0.546875f, +0.867188f,0.546875f, +0.875f,0.546875f, +0.882813f,0.546875f, +0.890625f,0.546875f, +0.898438f,0.546875f, +0.90625f,0.546875f, +0.914063f,0.546875f, +0.921875f,0.546875f, +0.929688f,0.546875f, +0.9375f,0.546875f, +0.945313f,0.546875f, +0.953125f,0.546875f, +0.960938f,0.546875f, +0.96875f,0.546875f, +0.976563f,0.546875f, +0.984375f,0.546875f, +0.992188f,0.546875f, +1.0f,0.546875f, +0.507813f,0.554688f, +0.515625f,0.554688f, +0.523438f,0.554688f, +0.53125f,0.554688f, +0.539063f,0.554688f, +0.546875f,0.554688f, +0.554688f,0.554688f, +0.5625f,0.554688f, +0.570313f,0.554688f, +0.578125f,0.554688f, +0.585938f,0.554688f, +0.59375f,0.554688f, +0.601563f,0.554688f, +0.609375f,0.554688f, +0.617188f,0.554688f, +0.625f,0.554688f, +0.632813f,0.554688f, +0.640625f,0.554688f, +0.648438f,0.554688f, +0.65625f,0.554688f, +0.664063f,0.554688f, +0.671875f,0.554688f, +0.679688f,0.554688f, +0.6875f,0.554688f, +0.695313f,0.554688f, +0.703125f,0.554688f, +0.710938f,0.554688f, +0.71875f,0.554688f, +0.726563f,0.554688f, +0.734375f,0.554688f, +0.742188f,0.554688f, +0.75f,0.554688f, +0.757813f,0.554688f, +0.765625f,0.554688f, +0.773438f,0.554688f, +0.78125f,0.554688f, +0.789063f,0.554688f, +0.796875f,0.554688f, +0.804688f,0.554688f, +0.8125f,0.554688f, +0.820313f,0.554688f, +0.828125f,0.554688f, +0.835938f,0.554688f, +0.84375f,0.554688f, +0.851563f,0.554688f, +0.859375f,0.554688f, +0.867188f,0.554688f, +0.875f,0.554688f, +0.882813f,0.554688f, +0.890625f,0.554688f, +0.898438f,0.554688f, +0.90625f,0.554688f, +0.914063f,0.554688f, +0.921875f,0.554688f, +0.929688f,0.554688f, +0.9375f,0.554688f, +0.945313f,0.554688f, +0.953125f,0.554688f, +0.960938f,0.554688f, +0.96875f,0.554688f, +0.976563f,0.554688f, +0.984375f,0.554688f, +0.992188f,0.554688f, +1.0f,0.554688f, +0.507813f,0.5625f, +0.515625f,0.5625f, +0.523438f,0.5625f, +0.53125f,0.5625f, +0.539063f,0.5625f, +0.546875f,0.5625f, +0.554688f,0.5625f, +0.5625f,0.5625f, +0.570313f,0.5625f, +0.578125f,0.5625f, +0.585938f,0.5625f, +0.59375f,0.5625f, +0.601563f,0.5625f, +0.609375f,0.5625f, +0.617188f,0.5625f, +0.625f,0.5625f, +0.632813f,0.5625f, +0.640625f,0.5625f, +0.648438f,0.5625f, +0.65625f,0.5625f, +0.664063f,0.5625f, +0.671875f,0.5625f, +0.679688f,0.5625f, +0.6875f,0.5625f, +0.695313f,0.5625f, +0.703125f,0.5625f, +0.710938f,0.5625f, +0.71875f,0.5625f, +0.726563f,0.5625f, +0.734375f,0.5625f, +0.742188f,0.5625f, +0.75f,0.5625f, +0.757813f,0.5625f, +0.765625f,0.5625f, +0.773438f,0.5625f, +0.78125f,0.5625f, +0.789063f,0.5625f, +0.796875f,0.5625f, +0.804688f,0.5625f, +0.8125f,0.5625f, +0.820313f,0.5625f, +0.828125f,0.5625f, +0.835938f,0.5625f, +0.84375f,0.5625f, +0.851563f,0.5625f, +0.859375f,0.5625f, +0.867188f,0.5625f, +0.875f,0.5625f, +0.882813f,0.5625f, +0.890625f,0.5625f, +0.898438f,0.5625f, +0.90625f,0.5625f, +0.914063f,0.5625f, +0.921875f,0.5625f, +0.929688f,0.5625f, +0.9375f,0.5625f, +0.945313f,0.5625f, +0.953125f,0.5625f, +0.960938f,0.5625f, +0.96875f,0.5625f, +0.976563f,0.5625f, +0.984375f,0.5625f, +0.992188f,0.5625f, +1.0f,0.5625f, +0.507813f,0.570313f, +0.515625f,0.570313f, +0.523438f,0.570313f, +0.53125f,0.570313f, +0.539063f,0.570313f, +0.546875f,0.570313f, +0.554688f,0.570313f, +0.5625f,0.570313f, +0.570313f,0.570313f, +0.578125f,0.570313f, +0.585938f,0.570313f, +0.59375f,0.570313f, +0.601563f,0.570313f, +0.609375f,0.570313f, +0.617188f,0.570313f, +0.625f,0.570313f, +0.632813f,0.570313f, +0.640625f,0.570313f, +0.648438f,0.570313f, +0.65625f,0.570313f, +0.664063f,0.570313f, +0.671875f,0.570313f, +0.679688f,0.570313f, +0.6875f,0.570313f, +0.695313f,0.570313f, +0.703125f,0.570313f, +0.710938f,0.570313f, +0.71875f,0.570313f, +0.726563f,0.570313f, +0.734375f,0.570313f, +0.742188f,0.570313f, +0.75f,0.570313f, +0.757813f,0.570313f, +0.765625f,0.570313f, +0.773438f,0.570313f, +0.78125f,0.570313f, +0.789063f,0.570313f, +0.796875f,0.570313f, +0.804688f,0.570313f, +0.8125f,0.570313f, +0.820313f,0.570313f, +0.828125f,0.570313f, +0.835938f,0.570313f, +0.84375f,0.570313f, +0.851563f,0.570313f, +0.859375f,0.570313f, +0.867188f,0.570313f, +0.875f,0.570313f, +0.882813f,0.570313f, +0.890625f,0.570313f, +0.898438f,0.570313f, +0.90625f,0.570313f, +0.914063f,0.570313f, +0.921875f,0.570313f, +0.929688f,0.570313f, +0.9375f,0.570313f, +0.945313f,0.570313f, +0.953125f,0.570313f, +0.960938f,0.570313f, +0.96875f,0.570313f, +0.976563f,0.570313f, +0.984375f,0.570313f, +0.992188f,0.570313f, +1.0f,0.570313f, +0.507813f,0.578125f, +0.515625f,0.578125f, +0.523438f,0.578125f, +0.53125f,0.578125f, +0.539063f,0.578125f, +0.546875f,0.578125f, +0.554688f,0.578125f, +0.5625f,0.578125f, +0.570313f,0.578125f, +0.578125f,0.578125f, +0.585938f,0.578125f, +0.59375f,0.578125f, +0.601563f,0.578125f, +0.609375f,0.578125f, +0.617188f,0.578125f, +0.625f,0.578125f, +0.632813f,0.578125f, +0.640625f,0.578125f, +0.648438f,0.578125f, +0.65625f,0.578125f, +0.664063f,0.578125f, +0.671875f,0.578125f, +0.679688f,0.578125f, +0.6875f,0.578125f, +0.695313f,0.578125f, +0.703125f,0.578125f, +0.710938f,0.578125f, +0.71875f,0.578125f, +0.726563f,0.578125f, +0.734375f,0.578125f, +0.742188f,0.578125f, +0.75f,0.578125f, +0.757813f,0.578125f, +0.765625f,0.578125f, +0.773438f,0.578125f, +0.78125f,0.578125f, +0.789063f,0.578125f, +0.796875f,0.578125f, +0.804688f,0.578125f, +0.8125f,0.578125f, +0.820313f,0.578125f, +0.828125f,0.578125f, +0.835938f,0.578125f, +0.84375f,0.578125f, +0.851563f,0.578125f, +0.859375f,0.578125f, +0.867188f,0.578125f, +0.875f,0.578125f, +0.882813f,0.578125f, +0.890625f,0.578125f, +0.898438f,0.578125f, +0.90625f,0.578125f, +0.914063f,0.578125f, +0.921875f,0.578125f, +0.929688f,0.578125f, +0.9375f,0.578125f, +0.945313f,0.578125f, +0.953125f,0.578125f, +0.960938f,0.578125f, +0.96875f,0.578125f, +0.976563f,0.578125f, +0.984375f,0.578125f, +0.992188f,0.578125f, +1.0f,0.578125f, +0.507813f,0.585938f, +0.515625f,0.585938f, +0.523438f,0.585938f, +0.53125f,0.585938f, +0.539063f,0.585938f, +0.546875f,0.585938f, +0.554688f,0.585938f, +0.5625f,0.585938f, +0.570313f,0.585938f, +0.578125f,0.585938f, +0.585938f,0.585938f, +0.59375f,0.585938f, +0.601563f,0.585938f, +0.609375f,0.585938f, +0.617188f,0.585938f, +0.625f,0.585938f, +0.632813f,0.585938f, +0.640625f,0.585938f, +0.648438f,0.585938f, +0.65625f,0.585938f, +0.664063f,0.585938f, +0.671875f,0.585938f, +0.679688f,0.585938f, +0.6875f,0.585938f, +0.695313f,0.585938f, +0.703125f,0.585938f, +0.710938f,0.585938f, +0.71875f,0.585938f, +0.726563f,0.585938f, +0.734375f,0.585938f, +0.742188f,0.585938f, +0.75f,0.585938f, +0.757813f,0.585938f, +0.765625f,0.585938f, +0.773438f,0.585938f, +0.78125f,0.585938f, +0.789063f,0.585938f, +0.796875f,0.585938f, +0.804688f,0.585938f, +0.8125f,0.585938f, +0.820313f,0.585938f, +0.828125f,0.585938f, +0.835938f,0.585938f, +0.84375f,0.585938f, +0.851563f,0.585938f, +0.859375f,0.585938f, +0.867188f,0.585938f, +0.875f,0.585938f, +0.882813f,0.585938f, +0.890625f,0.585938f, +0.898438f,0.585938f, +0.90625f,0.585938f, +0.914063f,0.585938f, +0.921875f,0.585938f, +0.929688f,0.585938f, +0.9375f,0.585938f, +0.945313f,0.585938f, +0.953125f,0.585938f, +0.960938f,0.585938f, +0.96875f,0.585938f, +0.976563f,0.585938f, +0.984375f,0.585938f, +0.992188f,0.585938f, +1.0f,0.585938f, +0.507813f,0.59375f, +0.515625f,0.59375f, +0.523438f,0.59375f, +0.53125f,0.59375f, +0.539063f,0.59375f, +0.546875f,0.59375f, +0.554688f,0.59375f, +0.5625f,0.59375f, +0.570313f,0.59375f, +0.578125f,0.59375f, +0.585938f,0.59375f, +0.59375f,0.59375f, +0.601563f,0.59375f, +0.609375f,0.59375f, +0.617188f,0.59375f, +0.625f,0.59375f, +0.632813f,0.59375f, +0.640625f,0.59375f, +0.648438f,0.59375f, +0.65625f,0.59375f, +0.664063f,0.59375f, +0.671875f,0.59375f, +0.679688f,0.59375f, +0.6875f,0.59375f, +0.695313f,0.59375f, +0.703125f,0.59375f, +0.710938f,0.59375f, +0.71875f,0.59375f, +0.726563f,0.59375f, +0.734375f,0.59375f, +0.742188f,0.59375f, +0.75f,0.59375f, +0.757813f,0.59375f, +0.765625f,0.59375f, +0.773438f,0.59375f, +0.78125f,0.59375f, +0.789063f,0.59375f, +0.796875f,0.59375f, +0.804688f,0.59375f, +0.8125f,0.59375f, +0.820313f,0.59375f, +0.828125f,0.59375f, +0.835938f,0.59375f, +0.84375f,0.59375f, +0.851563f,0.59375f, +0.859375f,0.59375f, +0.867188f,0.59375f, +0.875f,0.59375f, +0.882813f,0.59375f, +0.890625f,0.59375f, +0.898438f,0.59375f, +0.90625f,0.59375f, +0.914063f,0.59375f, +0.921875f,0.59375f, +0.929688f,0.59375f, +0.9375f,0.59375f, +0.945313f,0.59375f, +0.953125f,0.59375f, +0.960938f,0.59375f, +0.96875f,0.59375f, +0.976563f,0.59375f, +0.984375f,0.59375f, +0.992188f,0.59375f, +1.0f,0.59375f, +0.507813f,0.601563f, +0.515625f,0.601563f, +0.523438f,0.601563f, +0.53125f,0.601563f, +0.539063f,0.601563f, +0.546875f,0.601563f, +0.554688f,0.601563f, +0.5625f,0.601563f, +0.570313f,0.601563f, +0.578125f,0.601563f, +0.585938f,0.601563f, +0.59375f,0.601563f, +0.601563f,0.601563f, +0.609375f,0.601563f, +0.617188f,0.601563f, +0.625f,0.601563f, +0.632813f,0.601563f, +0.640625f,0.601563f, +0.648438f,0.601563f, +0.65625f,0.601563f, +0.664063f,0.601563f, +0.671875f,0.601563f, +0.679688f,0.601563f, +0.6875f,0.601563f, +0.695313f,0.601563f, +0.703125f,0.601563f, +0.710938f,0.601563f, +0.71875f,0.601563f, +0.726563f,0.601563f, +0.734375f,0.601563f, +0.742188f,0.601563f, +0.75f,0.601563f, +0.757813f,0.601563f, +0.765625f,0.601563f, +0.773438f,0.601563f, +0.78125f,0.601563f, +0.789063f,0.601563f, +0.796875f,0.601563f, +0.804688f,0.601563f, +0.8125f,0.601563f, +0.820313f,0.601563f, +0.828125f,0.601563f, +0.835938f,0.601563f, +0.84375f,0.601563f, +0.851563f,0.601563f, +0.859375f,0.601563f, +0.867188f,0.601563f, +0.875f,0.601563f, +0.882813f,0.601563f, +0.890625f,0.601563f, +0.898438f,0.601563f, +0.90625f,0.601563f, +0.914063f,0.601563f, +0.921875f,0.601563f, +0.929688f,0.601563f, +0.9375f,0.601563f, +0.945313f,0.601563f, +0.953125f,0.601563f, +0.960938f,0.601563f, +0.96875f,0.601563f, +0.976563f,0.601563f, +0.984375f,0.601563f, +0.992188f,0.601563f, +1.0f,0.601563f, +0.507813f,0.609375f, +0.515625f,0.609375f, +0.523438f,0.609375f, +0.53125f,0.609375f, +0.539063f,0.609375f, +0.546875f,0.609375f, +0.554688f,0.609375f, +0.5625f,0.609375f, +0.570313f,0.609375f, +0.578125f,0.609375f, +0.585938f,0.609375f, +0.59375f,0.609375f, +0.601563f,0.609375f, +0.609375f,0.609375f, +0.617188f,0.609375f, +0.625f,0.609375f, +0.632813f,0.609375f, +0.640625f,0.609375f, +0.648438f,0.609375f, +0.65625f,0.609375f, +0.664063f,0.609375f, +0.671875f,0.609375f, +0.679688f,0.609375f, +0.6875f,0.609375f, +0.695313f,0.609375f, +0.703125f,0.609375f, +0.710938f,0.609375f, +0.71875f,0.609375f, +0.726563f,0.609375f, +0.734375f,0.609375f, +0.742188f,0.609375f, +0.75f,0.609375f, +0.757813f,0.609375f, +0.765625f,0.609375f, +0.773438f,0.609375f, +0.78125f,0.609375f, +0.789063f,0.609375f, +0.796875f,0.609375f, +0.804688f,0.609375f, +0.8125f,0.609375f, +0.820313f,0.609375f, +0.828125f,0.609375f, +0.835938f,0.609375f, +0.84375f,0.609375f, +0.851563f,0.609375f, +0.859375f,0.609375f, +0.867188f,0.609375f, +0.875f,0.609375f, +0.882813f,0.609375f, +0.890625f,0.609375f, +0.898438f,0.609375f, +0.90625f,0.609375f, +0.914063f,0.609375f, +0.921875f,0.609375f, +0.929688f,0.609375f, +0.9375f,0.609375f, +0.945313f,0.609375f, +0.953125f,0.609375f, +0.960938f,0.609375f, +0.96875f,0.609375f, +0.976563f,0.609375f, +0.984375f,0.609375f, +0.992188f,0.609375f, +1.0f,0.609375f, +0.507813f,0.617188f, +0.515625f,0.617188f, +0.523438f,0.617188f, +0.53125f,0.617188f, +0.539063f,0.617188f, +0.546875f,0.617188f, +0.554688f,0.617188f, +0.5625f,0.617188f, +0.570313f,0.617188f, +0.578125f,0.617188f, +0.585938f,0.617188f, +0.59375f,0.617188f, +0.601563f,0.617188f, +0.609375f,0.617188f, +0.617188f,0.617188f, +0.625f,0.617188f, +0.632813f,0.617188f, +0.640625f,0.617188f, +0.648438f,0.617188f, +0.65625f,0.617188f, +0.664063f,0.617188f, +0.671875f,0.617188f, +0.679688f,0.617188f, +0.6875f,0.617188f, +0.695313f,0.617188f, +0.703125f,0.617188f, +0.710938f,0.617188f, +0.71875f,0.617188f, +0.726563f,0.617188f, +0.734375f,0.617188f, +0.742188f,0.617188f, +0.75f,0.617188f, +0.757813f,0.617188f, +0.765625f,0.617188f, +0.773438f,0.617188f, +0.78125f,0.617188f, +0.789063f,0.617188f, +0.796875f,0.617188f, +0.804688f,0.617188f, +0.8125f,0.617188f, +0.820313f,0.617188f, +0.828125f,0.617188f, +0.835938f,0.617188f, +0.84375f,0.617188f, +0.851563f,0.617188f, +0.859375f,0.617188f, +0.867188f,0.617188f, +0.875f,0.617188f, +0.882813f,0.617188f, +0.890625f,0.617188f, +0.898438f,0.617188f, +0.90625f,0.617188f, +0.914063f,0.617188f, +0.921875f,0.617188f, +0.929688f,0.617188f, +0.9375f,0.617188f, +0.945313f,0.617188f, +0.953125f,0.617188f, +0.960938f,0.617188f, +0.96875f,0.617188f, +0.976563f,0.617188f, +0.984375f,0.617188f, +0.992188f,0.617188f, +1.0f,0.617188f, +0.507813f,0.625f, +0.515625f,0.625f, +0.523438f,0.625f, +0.53125f,0.625f, +0.539063f,0.625f, +0.546875f,0.625f, +0.554688f,0.625f, +0.5625f,0.625f, +0.570313f,0.625f, +0.578125f,0.625f, +0.585938f,0.625f, +0.59375f,0.625f, +0.601563f,0.625f, +0.609375f,0.625f, +0.617188f,0.625f, +0.625f,0.625f, +0.632813f,0.625f, +0.640625f,0.625f, +0.648438f,0.625f, +0.65625f,0.625f, +0.664063f,0.625f, +0.671875f,0.625f, +0.679688f,0.625f, +0.6875f,0.625f, +0.695313f,0.625f, +0.703125f,0.625f, +0.710938f,0.625f, +0.71875f,0.625f, +0.726563f,0.625f, +0.734375f,0.625f, +0.742188f,0.625f, +0.75f,0.625f, +0.757813f,0.625f, +0.765625f,0.625f, +0.773438f,0.625f, +0.78125f,0.625f, +0.789063f,0.625f, +0.796875f,0.625f, +0.804688f,0.625f, +0.8125f,0.625f, +0.820313f,0.625f, +0.828125f,0.625f, +0.835938f,0.625f, +0.84375f,0.625f, +0.851563f,0.625f, +0.859375f,0.625f, +0.867188f,0.625f, +0.875f,0.625f, +0.882813f,0.625f, +0.890625f,0.625f, +0.898438f,0.625f, +0.90625f,0.625f, +0.914063f,0.625f, +0.921875f,0.625f, +0.929688f,0.625f, +0.9375f,0.625f, +0.945313f,0.625f, +0.953125f,0.625f, +0.960938f,0.625f, +0.96875f,0.625f, +0.976563f,0.625f, +0.984375f,0.625f, +0.992188f,0.625f, +1.0f,0.625f, +0.507813f,0.632813f, +0.515625f,0.632813f, +0.523438f,0.632813f, +0.53125f,0.632813f, +0.539063f,0.632813f, +0.546875f,0.632813f, +0.554688f,0.632813f, +0.5625f,0.632813f, +0.570313f,0.632813f, +0.578125f,0.632813f, +0.585938f,0.632813f, +0.59375f,0.632813f, +0.601563f,0.632813f, +0.609375f,0.632813f, +0.617188f,0.632813f, +0.625f,0.632813f, +0.632813f,0.632813f, +0.640625f,0.632813f, +0.648438f,0.632813f, +0.65625f,0.632813f, +0.664063f,0.632813f, +0.671875f,0.632813f, +0.679688f,0.632813f, +0.6875f,0.632813f, +0.695313f,0.632813f, +0.703125f,0.632813f, +0.710938f,0.632813f, +0.71875f,0.632813f, +0.726563f,0.632813f, +0.734375f,0.632813f, +0.742188f,0.632813f, +0.75f,0.632813f, +0.757813f,0.632813f, +0.765625f,0.632813f, +0.773438f,0.632813f, +0.78125f,0.632813f, +0.789063f,0.632813f, +0.796875f,0.632813f, +0.804688f,0.632813f, +0.8125f,0.632813f, +0.820313f,0.632813f, +0.828125f,0.632813f, +0.835938f,0.632813f, +0.84375f,0.632813f, +0.851563f,0.632813f, +0.859375f,0.632813f, +0.867188f,0.632813f, +0.875f,0.632813f, +0.882813f,0.632813f, +0.890625f,0.632813f, +0.898438f,0.632813f, +0.90625f,0.632813f, +0.914063f,0.632813f, +0.921875f,0.632813f, +0.929688f,0.632813f, +0.9375f,0.632813f, +0.945313f,0.632813f, +0.953125f,0.632813f, +0.960938f,0.632813f, +0.96875f,0.632813f, +0.976563f,0.632813f, +0.984375f,0.632813f, +0.992188f,0.632813f, +1.0f,0.632813f, +0.507813f,0.640625f, +0.515625f,0.640625f, +0.523438f,0.640625f, +0.53125f,0.640625f, +0.539063f,0.640625f, +0.546875f,0.640625f, +0.554688f,0.640625f, +0.5625f,0.640625f, +0.570313f,0.640625f, +0.578125f,0.640625f, +0.585938f,0.640625f, +0.59375f,0.640625f, +0.601563f,0.640625f, +0.609375f,0.640625f, +0.617188f,0.640625f, +0.625f,0.640625f, +0.632813f,0.640625f, +0.640625f,0.640625f, +0.648438f,0.640625f, +0.65625f,0.640625f, +0.664063f,0.640625f, +0.671875f,0.640625f, +0.679688f,0.640625f, +0.6875f,0.640625f, +0.695313f,0.640625f, +0.703125f,0.640625f, +0.710938f,0.640625f, +0.71875f,0.640625f, +0.726563f,0.640625f, +0.734375f,0.640625f, +0.742188f,0.640625f, +0.75f,0.640625f, +0.757813f,0.640625f, +0.765625f,0.640625f, +0.773438f,0.640625f, +0.78125f,0.640625f, +0.789063f,0.640625f, +0.796875f,0.640625f, +0.804688f,0.640625f, +0.8125f,0.640625f, +0.820313f,0.640625f, +0.828125f,0.640625f, +0.835938f,0.640625f, +0.84375f,0.640625f, +0.851563f,0.640625f, +0.859375f,0.640625f, +0.867188f,0.640625f, +0.875f,0.640625f, +0.882813f,0.640625f, +0.890625f,0.640625f, +0.898438f,0.640625f, +0.90625f,0.640625f, +0.914063f,0.640625f, +0.921875f,0.640625f, +0.929688f,0.640625f, +0.9375f,0.640625f, +0.945313f,0.640625f, +0.953125f,0.640625f, +0.960938f,0.640625f, +0.96875f,0.640625f, +0.976563f,0.640625f, +0.984375f,0.640625f, +0.992188f,0.640625f, +1.0f,0.640625f, +0.507813f,0.648438f, +0.515625f,0.648438f, +0.523438f,0.648438f, +0.53125f,0.648438f, +0.539063f,0.648438f, +0.546875f,0.648438f, +0.554688f,0.648438f, +0.5625f,0.648438f, +0.570313f,0.648438f, +0.578125f,0.648438f, +0.585938f,0.648438f, +0.59375f,0.648438f, +0.601563f,0.648438f, +0.609375f,0.648438f, +0.617188f,0.648438f, +0.625f,0.648438f, +0.632813f,0.648438f, +0.640625f,0.648438f, +0.648438f,0.648438f, +0.65625f,0.648438f, +0.664063f,0.648438f, +0.671875f,0.648438f, +0.679688f,0.648438f, +0.6875f,0.648438f, +0.695313f,0.648438f, +0.703125f,0.648438f, +0.710938f,0.648438f, +0.71875f,0.648438f, +0.726563f,0.648438f, +0.734375f,0.648438f, +0.742188f,0.648438f, +0.75f,0.648438f, +0.757813f,0.648438f, +0.765625f,0.648438f, +0.773438f,0.648438f, +0.78125f,0.648438f, +0.789063f,0.648438f, +0.796875f,0.648438f, +0.804688f,0.648438f, +0.8125f,0.648438f, +0.820313f,0.648438f, +0.828125f,0.648438f, +0.835938f,0.648438f, +0.84375f,0.648438f, +0.851563f,0.648438f, +0.859375f,0.648438f, +0.867188f,0.648438f, +0.875f,0.648438f, +0.882813f,0.648438f, +0.890625f,0.648438f, +0.898438f,0.648438f, +0.90625f,0.648438f, +0.914063f,0.648438f, +0.921875f,0.648438f, +0.929688f,0.648438f, +0.9375f,0.648438f, +0.945313f,0.648438f, +0.953125f,0.648438f, +0.960938f,0.648438f, +0.96875f,0.648438f, +0.976563f,0.648438f, +0.984375f,0.648438f, +0.992188f,0.648438f, +1.0f,0.648438f, +0.507813f,0.65625f, +0.515625f,0.65625f, +0.523438f,0.65625f, +0.53125f,0.65625f, +0.539063f,0.65625f, +0.546875f,0.65625f, +0.554688f,0.65625f, +0.5625f,0.65625f, +0.570313f,0.65625f, +0.578125f,0.65625f, +0.585938f,0.65625f, +0.59375f,0.65625f, +0.601563f,0.65625f, +0.609375f,0.65625f, +0.617188f,0.65625f, +0.625f,0.65625f, +0.632813f,0.65625f, +0.640625f,0.65625f, +0.648438f,0.65625f, +0.65625f,0.65625f, +0.664063f,0.65625f, +0.671875f,0.65625f, +0.679688f,0.65625f, +0.6875f,0.65625f, +0.695313f,0.65625f, +0.703125f,0.65625f, +0.710938f,0.65625f, +0.71875f,0.65625f, +0.726563f,0.65625f, +0.734375f,0.65625f, +0.742188f,0.65625f, +0.75f,0.65625f, +0.757813f,0.65625f, +0.765625f,0.65625f, +0.773438f,0.65625f, +0.78125f,0.65625f, +0.789063f,0.65625f, +0.796875f,0.65625f, +0.804688f,0.65625f, +0.8125f,0.65625f, +0.820313f,0.65625f, +0.828125f,0.65625f, +0.835938f,0.65625f, +0.84375f,0.65625f, +0.851563f,0.65625f, +0.859375f,0.65625f, +0.867188f,0.65625f, +0.875f,0.65625f, +0.882813f,0.65625f, +0.890625f,0.65625f, +0.898438f,0.65625f, +0.90625f,0.65625f, +0.914063f,0.65625f, +0.921875f,0.65625f, +0.929688f,0.65625f, +0.9375f,0.65625f, +0.945313f,0.65625f, +0.953125f,0.65625f, +0.960938f,0.65625f, +0.96875f,0.65625f, +0.976563f,0.65625f, +0.984375f,0.65625f, +0.992188f,0.65625f, +1.0f,0.65625f, +0.507813f,0.664063f, +0.515625f,0.664063f, +0.523438f,0.664063f, +0.53125f,0.664063f, +0.539063f,0.664063f, +0.546875f,0.664063f, +0.554688f,0.664063f, +0.5625f,0.664063f, +0.570313f,0.664063f, +0.578125f,0.664063f, +0.585938f,0.664063f, +0.59375f,0.664063f, +0.601563f,0.664063f, +0.609375f,0.664063f, +0.617188f,0.664063f, +0.625f,0.664063f, +0.632813f,0.664063f, +0.640625f,0.664063f, +0.648438f,0.664063f, +0.65625f,0.664063f, +0.664063f,0.664063f, +0.671875f,0.664063f, +0.679688f,0.664063f, +0.6875f,0.664063f, +0.695313f,0.664063f, +0.703125f,0.664063f, +0.710938f,0.664063f, +0.71875f,0.664063f, +0.726563f,0.664063f, +0.734375f,0.664063f, +0.742188f,0.664063f, +0.75f,0.664063f, +0.757813f,0.664063f, +0.765625f,0.664063f, +0.773438f,0.664063f, +0.78125f,0.664063f, +0.789063f,0.664063f, +0.796875f,0.664063f, +0.804688f,0.664063f, +0.8125f,0.664063f, +0.820313f,0.664063f, +0.828125f,0.664063f, +0.835938f,0.664063f, +0.84375f,0.664063f, +0.851563f,0.664063f, +0.859375f,0.664063f, +0.867188f,0.664063f, +0.875f,0.664063f, +0.882813f,0.664063f, +0.890625f,0.664063f, +0.898438f,0.664063f, +0.90625f,0.664063f, +0.914063f,0.664063f, +0.921875f,0.664063f, +0.929688f,0.664063f, +0.9375f,0.664063f, +0.945313f,0.664063f, +0.953125f,0.664063f, +0.960938f,0.664063f, +0.96875f,0.664063f, +0.976563f,0.664063f, +0.984375f,0.664063f, +0.992188f,0.664063f, +1.0f,0.664063f, +0.507813f,0.671875f, +0.515625f,0.671875f, +0.523438f,0.671875f, +0.53125f,0.671875f, +0.539063f,0.671875f, +0.546875f,0.671875f, +0.554688f,0.671875f, +0.5625f,0.671875f, +0.570313f,0.671875f, +0.578125f,0.671875f, +0.585938f,0.671875f, +0.59375f,0.671875f, +0.601563f,0.671875f, +0.609375f,0.671875f, +0.617188f,0.671875f, +0.625f,0.671875f, +0.632813f,0.671875f, +0.640625f,0.671875f, +0.648438f,0.671875f, +0.65625f,0.671875f, +0.664063f,0.671875f, +0.671875f,0.671875f, +0.679688f,0.671875f, +0.6875f,0.671875f, +0.695313f,0.671875f, +0.703125f,0.671875f, +0.710938f,0.671875f, +0.71875f,0.671875f, +0.726563f,0.671875f, +0.734375f,0.671875f, +0.742188f,0.671875f, +0.75f,0.671875f, +0.757813f,0.671875f, +0.765625f,0.671875f, +0.773438f,0.671875f, +0.78125f,0.671875f, +0.789063f,0.671875f, +0.796875f,0.671875f, +0.804688f,0.671875f, +0.8125f,0.671875f, +0.820313f,0.671875f, +0.828125f,0.671875f, +0.835938f,0.671875f, +0.84375f,0.671875f, +0.851563f,0.671875f, +0.859375f,0.671875f, +0.867188f,0.671875f, +0.875f,0.671875f, +0.882813f,0.671875f, +0.890625f,0.671875f, +0.898438f,0.671875f, +0.90625f,0.671875f, +0.914063f,0.671875f, +0.921875f,0.671875f, +0.929688f,0.671875f, +0.9375f,0.671875f, +0.945313f,0.671875f, +0.953125f,0.671875f, +0.960938f,0.671875f, +0.96875f,0.671875f, +0.976563f,0.671875f, +0.984375f,0.671875f, +0.992188f,0.671875f, +1.0f,0.671875f, +0.507813f,0.679688f, +0.515625f,0.679688f, +0.523438f,0.679688f, +0.53125f,0.679688f, +0.539063f,0.679688f, +0.546875f,0.679688f, +0.554688f,0.679688f, +0.5625f,0.679688f, +0.570313f,0.679688f, +0.578125f,0.679688f, +0.585938f,0.679688f, +0.59375f,0.679688f, +0.601563f,0.679688f, +0.609375f,0.679688f, +0.617188f,0.679688f, +0.625f,0.679688f, +0.632813f,0.679688f, +0.640625f,0.679688f, +0.648438f,0.679688f, +0.65625f,0.679688f, +0.664063f,0.679688f, +0.671875f,0.679688f, +0.679688f,0.679688f, +0.6875f,0.679688f, +0.695313f,0.679688f, +0.703125f,0.679688f, +0.710938f,0.679688f, +0.71875f,0.679688f, +0.726563f,0.679688f, +0.734375f,0.679688f, +0.742188f,0.679688f, +0.75f,0.679688f, +0.757813f,0.679688f, +0.765625f,0.679688f, +0.773438f,0.679688f, +0.78125f,0.679688f, +0.789063f,0.679688f, +0.796875f,0.679688f, +0.804688f,0.679688f, +0.8125f,0.679688f, +0.820313f,0.679688f, +0.828125f,0.679688f, +0.835938f,0.679688f, +0.84375f,0.679688f, +0.851563f,0.679688f, +0.859375f,0.679688f, +0.867188f,0.679688f, +0.875f,0.679688f, +0.882813f,0.679688f, +0.890625f,0.679688f, +0.898438f,0.679688f, +0.90625f,0.679688f, +0.914063f,0.679688f, +0.921875f,0.679688f, +0.929688f,0.679688f, +0.9375f,0.679688f, +0.945313f,0.679688f, +0.953125f,0.679688f, +0.960938f,0.679688f, +0.96875f,0.679688f, +0.976563f,0.679688f, +0.984375f,0.679688f, +0.992188f,0.679688f, +1.0f,0.679688f, +0.507813f,0.6875f, +0.515625f,0.6875f, +0.523438f,0.6875f, +0.53125f,0.6875f, +0.539063f,0.6875f, +0.546875f,0.6875f, +0.554688f,0.6875f, +0.5625f,0.6875f, +0.570313f,0.6875f, +0.578125f,0.6875f, +0.585938f,0.6875f, +0.59375f,0.6875f, +0.601563f,0.6875f, +0.609375f,0.6875f, +0.617188f,0.6875f, +0.625f,0.6875f, +0.632813f,0.6875f, +0.640625f,0.6875f, +0.648438f,0.6875f, +0.65625f,0.6875f, +0.664063f,0.6875f, +0.671875f,0.6875f, +0.679688f,0.6875f, +0.6875f,0.6875f, +0.695313f,0.6875f, +0.703125f,0.6875f, +0.710938f,0.6875f, +0.71875f,0.6875f, +0.726563f,0.6875f, +0.734375f,0.6875f, +0.742188f,0.6875f, +0.75f,0.6875f, +0.757813f,0.6875f, +0.765625f,0.6875f, +0.773438f,0.6875f, +0.78125f,0.6875f, +0.789063f,0.6875f, +0.796875f,0.6875f, +0.804688f,0.6875f, +0.8125f,0.6875f, +0.820313f,0.6875f, +0.828125f,0.6875f, +0.835938f,0.6875f, +0.84375f,0.6875f, +0.851563f,0.6875f, +0.859375f,0.6875f, +0.867188f,0.6875f, +0.875f,0.6875f, +0.882813f,0.6875f, +0.890625f,0.6875f, +0.898438f,0.6875f, +0.90625f,0.6875f, +0.914063f,0.6875f, +0.921875f,0.6875f, +0.929688f,0.6875f, +0.9375f,0.6875f, +0.945313f,0.6875f, +0.953125f,0.6875f, +0.960938f,0.6875f, +0.96875f,0.6875f, +0.976563f,0.6875f, +0.984375f,0.6875f, +0.992188f,0.6875f, +1.0f,0.6875f, +0.507813f,0.695313f, +0.515625f,0.695313f, +0.523438f,0.695313f, +0.53125f,0.695313f, +0.539063f,0.695313f, +0.546875f,0.695313f, +0.554688f,0.695313f, +0.5625f,0.695313f, +0.570313f,0.695313f, +0.578125f,0.695313f, +0.585938f,0.695313f, +0.59375f,0.695313f, +0.601563f,0.695313f, +0.609375f,0.695313f, +0.617188f,0.695313f, +0.625f,0.695313f, +0.632813f,0.695313f, +0.640625f,0.695313f, +0.648438f,0.695313f, +0.65625f,0.695313f, +0.664063f,0.695313f, +0.671875f,0.695313f, +0.679688f,0.695313f, +0.6875f,0.695313f, +0.695313f,0.695313f, +0.703125f,0.695313f, +0.710938f,0.695313f, +0.71875f,0.695313f, +0.726563f,0.695313f, +0.734375f,0.695313f, +0.742188f,0.695313f, +0.75f,0.695313f, +0.757813f,0.695313f, +0.765625f,0.695313f, +0.773438f,0.695313f, +0.78125f,0.695313f, +0.789063f,0.695313f, +0.796875f,0.695313f, +0.804688f,0.695313f, +0.8125f,0.695313f, +0.820313f,0.695313f, +0.828125f,0.695313f, +0.835938f,0.695313f, +0.84375f,0.695313f, +0.851563f,0.695313f, +0.859375f,0.695313f, +0.867188f,0.695313f, +0.875f,0.695313f, +0.882813f,0.695313f, +0.890625f,0.695313f, +0.898438f,0.695313f, +0.90625f,0.695313f, +0.914063f,0.695313f, +0.921875f,0.695313f, +0.929688f,0.695313f, +0.9375f,0.695313f, +0.945313f,0.695313f, +0.953125f,0.695313f, +0.960938f,0.695313f, +0.96875f,0.695313f, +0.976563f,0.695313f, +0.984375f,0.695313f, +0.992188f,0.695313f, +1.0f,0.695313f, +0.507813f,0.703125f, +0.515625f,0.703125f, +0.523438f,0.703125f, +0.53125f,0.703125f, +0.539063f,0.703125f, +0.546875f,0.703125f, +0.554688f,0.703125f, +0.5625f,0.703125f, +0.570313f,0.703125f, +0.578125f,0.703125f, +0.585938f,0.703125f, +0.59375f,0.703125f, +0.601563f,0.703125f, +0.609375f,0.703125f, +0.617188f,0.703125f, +0.625f,0.703125f, +0.632813f,0.703125f, +0.640625f,0.703125f, +0.648438f,0.703125f, +0.65625f,0.703125f, +0.664063f,0.703125f, +0.671875f,0.703125f, +0.679688f,0.703125f, +0.6875f,0.703125f, +0.695313f,0.703125f, +0.703125f,0.703125f, +0.710938f,0.703125f, +0.71875f,0.703125f, +0.726563f,0.703125f, +0.734375f,0.703125f, +0.742188f,0.703125f, +0.75f,0.703125f, +0.757813f,0.703125f, +0.765625f,0.703125f, +0.773438f,0.703125f, +0.78125f,0.703125f, +0.789063f,0.703125f, +0.796875f,0.703125f, +0.804688f,0.703125f, +0.8125f,0.703125f, +0.820313f,0.703125f, +0.828125f,0.703125f, +0.835938f,0.703125f, +0.84375f,0.703125f, +0.851563f,0.703125f, +0.859375f,0.703125f, +0.867188f,0.703125f, +0.875f,0.703125f, +0.882813f,0.703125f, +0.890625f,0.703125f, +0.898438f,0.703125f, +0.90625f,0.703125f, +0.914063f,0.703125f, +0.921875f,0.703125f, +0.929688f,0.703125f, +0.9375f,0.703125f, +0.945313f,0.703125f, +0.953125f,0.703125f, +0.960938f,0.703125f, +0.96875f,0.703125f, +0.976563f,0.703125f, +0.984375f,0.703125f, +0.992188f,0.703125f, +1.0f,0.703125f, +0.507813f,0.710938f, +0.515625f,0.710938f, +0.523438f,0.710938f, +0.53125f,0.710938f, +0.539063f,0.710938f, +0.546875f,0.710938f, +0.554688f,0.710938f, +0.5625f,0.710938f, +0.570313f,0.710938f, +0.578125f,0.710938f, +0.585938f,0.710938f, +0.59375f,0.710938f, +0.601563f,0.710938f, +0.609375f,0.710938f, +0.617188f,0.710938f, +0.625f,0.710938f, +0.632813f,0.710938f, +0.640625f,0.710938f, +0.648438f,0.710938f, +0.65625f,0.710938f, +0.664063f,0.710938f, +0.671875f,0.710938f, +0.679688f,0.710938f, +0.6875f,0.710938f, +0.695313f,0.710938f, +0.703125f,0.710938f, +0.710938f,0.710938f, +0.71875f,0.710938f, +0.726563f,0.710938f, +0.734375f,0.710938f, +0.742188f,0.710938f, +0.75f,0.710938f, +0.757813f,0.710938f, +0.765625f,0.710938f, +0.773438f,0.710938f, +0.78125f,0.710938f, +0.789063f,0.710938f, +0.796875f,0.710938f, +0.804688f,0.710938f, +0.8125f,0.710938f, +0.820313f,0.710938f, +0.828125f,0.710938f, +0.835938f,0.710938f, +0.84375f,0.710938f, +0.851563f,0.710938f, +0.859375f,0.710938f, +0.867188f,0.710938f, +0.875f,0.710938f, +0.882813f,0.710938f, +0.890625f,0.710938f, +0.898438f,0.710938f, +0.90625f,0.710938f, +0.914063f,0.710938f, +0.921875f,0.710938f, +0.929688f,0.710938f, +0.9375f,0.710938f, +0.945313f,0.710938f, +0.953125f,0.710938f, +0.960938f,0.710938f, +0.96875f,0.710938f, +0.976563f,0.710938f, +0.984375f,0.710938f, +0.992188f,0.710938f, +1.0f,0.710938f, +0.507813f,0.71875f, +0.515625f,0.71875f, +0.523438f,0.71875f, +0.53125f,0.71875f, +0.539063f,0.71875f, +0.546875f,0.71875f, +0.554688f,0.71875f, +0.5625f,0.71875f, +0.570313f,0.71875f, +0.578125f,0.71875f, +0.585938f,0.71875f, +0.59375f,0.71875f, +0.601563f,0.71875f, +0.609375f,0.71875f, +0.617188f,0.71875f, +0.625f,0.71875f, +0.632813f,0.71875f, +0.640625f,0.71875f, +0.648438f,0.71875f, +0.65625f,0.71875f, +0.664063f,0.71875f, +0.671875f,0.71875f, +0.679688f,0.71875f, +0.6875f,0.71875f, +0.695313f,0.71875f, +0.703125f,0.71875f, +0.710938f,0.71875f, +0.71875f,0.71875f, +0.726563f,0.71875f, +0.734375f,0.71875f, +0.742188f,0.71875f, +0.75f,0.71875f, +0.757813f,0.71875f, +0.765625f,0.71875f, +0.773438f,0.71875f, +0.78125f,0.71875f, +0.789063f,0.71875f, +0.796875f,0.71875f, +0.804688f,0.71875f, +0.8125f,0.71875f, +0.820313f,0.71875f, +0.828125f,0.71875f, +0.835938f,0.71875f, +0.84375f,0.71875f, +0.851563f,0.71875f, +0.859375f,0.71875f, +0.867188f,0.71875f, +0.875f,0.71875f, +0.882813f,0.71875f, +0.890625f,0.71875f, +0.898438f,0.71875f, +0.90625f,0.71875f, +0.914063f,0.71875f, +0.921875f,0.71875f, +0.929688f,0.71875f, +0.9375f,0.71875f, +0.945313f,0.71875f, +0.953125f,0.71875f, +0.960938f,0.71875f, +0.96875f,0.71875f, +0.976563f,0.71875f, +0.984375f,0.71875f, +0.992188f,0.71875f, +1.0f,0.71875f, +0.507813f,0.726563f, +0.515625f,0.726563f, +0.523438f,0.726563f, +0.53125f,0.726563f, +0.539063f,0.726563f, +0.546875f,0.726563f, +0.554688f,0.726563f, +0.5625f,0.726563f, +0.570313f,0.726563f, +0.578125f,0.726563f, +0.585938f,0.726563f, +0.59375f,0.726563f, +0.601563f,0.726563f, +0.609375f,0.726563f, +0.617188f,0.726563f, +0.625f,0.726563f, +0.632813f,0.726563f, +0.640625f,0.726563f, +0.648438f,0.726563f, +0.65625f,0.726563f, +0.664063f,0.726563f, +0.671875f,0.726563f, +0.679688f,0.726563f, +0.6875f,0.726563f, +0.695313f,0.726563f, +0.703125f,0.726563f, +0.710938f,0.726563f, +0.71875f,0.726563f, +0.726563f,0.726563f, +0.734375f,0.726563f, +0.742188f,0.726563f, +0.75f,0.726563f, +0.757813f,0.726563f, +0.765625f,0.726563f, +0.773438f,0.726563f, +0.78125f,0.726563f, +0.789063f,0.726563f, +0.796875f,0.726563f, +0.804688f,0.726563f, +0.8125f,0.726563f, +0.820313f,0.726563f, +0.828125f,0.726563f, +0.835938f,0.726563f, +0.84375f,0.726563f, +0.851563f,0.726563f, +0.859375f,0.726563f, +0.867188f,0.726563f, +0.875f,0.726563f, +0.882813f,0.726563f, +0.890625f,0.726563f, +0.898438f,0.726563f, +0.90625f,0.726563f, +0.914063f,0.726563f, +0.921875f,0.726563f, +0.929688f,0.726563f, +0.9375f,0.726563f, +0.945313f,0.726563f, +0.953125f,0.726563f, +0.960938f,0.726563f, +0.96875f,0.726563f, +0.976563f,0.726563f, +0.984375f,0.726563f, +0.992188f,0.726563f, +1.0f,0.726563f, +0.507813f,0.734375f, +0.515625f,0.734375f, +0.523438f,0.734375f, +0.53125f,0.734375f, +0.539063f,0.734375f, +0.546875f,0.734375f, +0.554688f,0.734375f, +0.5625f,0.734375f, +0.570313f,0.734375f, +0.578125f,0.734375f, +0.585938f,0.734375f, +0.59375f,0.734375f, +0.601563f,0.734375f, +0.609375f,0.734375f, +0.617188f,0.734375f, +0.625f,0.734375f, +0.632813f,0.734375f, +0.640625f,0.734375f, +0.648438f,0.734375f, +0.65625f,0.734375f, +0.664063f,0.734375f, +0.671875f,0.734375f, +0.679688f,0.734375f, +0.6875f,0.734375f, +0.695313f,0.734375f, +0.703125f,0.734375f, +0.710938f,0.734375f, +0.71875f,0.734375f, +0.726563f,0.734375f, +0.734375f,0.734375f, +0.742188f,0.734375f, +0.75f,0.734375f, +0.757813f,0.734375f, +0.765625f,0.734375f, +0.773438f,0.734375f, +0.78125f,0.734375f, +0.789063f,0.734375f, +0.796875f,0.734375f, +0.804688f,0.734375f, +0.8125f,0.734375f, +0.820313f,0.734375f, +0.828125f,0.734375f, +0.835938f,0.734375f, +0.84375f,0.734375f, +0.851563f,0.734375f, +0.859375f,0.734375f, +0.867188f,0.734375f, +0.875f,0.734375f, +0.882813f,0.734375f, +0.890625f,0.734375f, +0.898438f,0.734375f, +0.90625f,0.734375f, +0.914063f,0.734375f, +0.921875f,0.734375f, +0.929688f,0.734375f, +0.9375f,0.734375f, +0.945313f,0.734375f, +0.953125f,0.734375f, +0.960938f,0.734375f, +0.96875f,0.734375f, +0.976563f,0.734375f, +0.984375f,0.734375f, +0.992188f,0.734375f, +1.0f,0.734375f, +}; + +unsigned short Landscape03Idx[] = { +0,1,2, +3,2,1, +2,3,4, +5,4,3, +4,5,6, +7,6,5, +6,7,8, +9,8,7, +8,9,10, +11,10,9, +10,11,12, +13,12,11, +12,13,14, +15,14,13, +14,15,16, +17,16,15, +16,17,18, +19,18,17, +18,19,20, +21,20,19, +20,21,22, +23,22,21, +22,23,24, +25,24,23, +24,25,26, +27,26,25, +26,27,28, +29,28,27, +28,29,30, +31,30,29, +30,31,32, +33,32,31, +32,33,34, +35,34,33, +34,35,36, +37,36,35, +36,37,38, +39,38,37, +38,39,40, +41,40,39, +40,41,42, +43,42,41, +42,43,44, +45,44,43, +44,45,46, +47,46,45, +46,47,48, +49,48,47, +48,49,50, +51,50,49, +50,51,52, +53,52,51, +52,53,54, +55,54,53, +54,55,56, +57,56,55, +56,57,58, +59,58,57, +58,59,60, +61,60,59, +60,61,62, +63,62,61, +62,63,64, +65,64,63, +64,65,66, +67,66,65, +66,67,68, +69,68,67, +68,69,70, +71,70,69, +70,71,72, +73,72,71, +72,73,74, +75,74,73, +74,75,76, +77,76,75, +76,77,78, +79,78,77, +78,79,80, +81,80,79, +80,81,82, +83,82,81, +82,83,84, +85,84,83, +84,85,86, +87,86,85, +86,87,88, +89,88,87, +88,89,90, +91,90,89, +90,91,92, +93,92,91, +92,93,94, +95,94,93, +94,95,96, +97,96,95, +96,97,98, +99,98,97, +98,99,100, +101,100,99, +100,101,102, +103,102,101, +102,103,104, +105,104,103, +104,105,106, +107,106,105, +106,107,108, +109,108,107, +108,109,110, +111,110,109, +110,111,112, +113,112,111, +112,113,114, +115,114,113, +114,115,116, +117,116,115, +116,117,118, +119,118,117, +118,119,120, +121,120,119, +120,121,122, +123,122,121, +122,123,124, +125,124,123, +124,125,126, +127,126,125, +128,0,129, +2,129,0, +129,2,130, +4,130,2, +130,4,131, +6,131,4, +131,6,132, +8,132,6, +132,8,133, +10,133,8, +133,10,134, +12,134,10, +134,12,135, +14,135,12, +135,14,136, +16,136,14, +136,16,137, +18,137,16, +137,18,138, +20,138,18, +138,20,139, +22,139,20, +139,22,140, +24,140,22, +140,24,141, +26,141,24, +141,26,142, +28,142,26, +142,28,143, +30,143,28, +143,30,144, +32,144,30, +144,32,145, +34,145,32, +145,34,146, +36,146,34, +146,36,147, +38,147,36, +147,38,148, +40,148,38, +148,40,149, +42,149,40, +149,42,150, +44,150,42, +150,44,151, +46,151,44, +151,46,152, +48,152,46, +152,48,153, +50,153,48, +153,50,154, +52,154,50, +154,52,155, +54,155,52, +155,54,156, +56,156,54, +156,56,157, +58,157,56, +157,58,158, +60,158,58, +158,60,159, +62,159,60, +159,62,160, +64,160,62, +160,64,161, +66,161,64, +161,66,162, +68,162,66, +162,68,163, +70,163,68, +163,70,164, +72,164,70, +164,72,165, +74,165,72, +165,74,166, +76,166,74, +166,76,167, +78,167,76, +167,78,168, +80,168,78, +168,80,169, +82,169,80, +169,82,170, +84,170,82, +170,84,171, +86,171,84, +171,86,172, +88,172,86, +172,88,173, +90,173,88, +173,90,174, +92,174,90, +174,92,175, +94,175,92, +175,94,176, +96,176,94, +176,96,177, +98,177,96, +177,98,178, +100,178,98, +178,100,179, +102,179,100, +179,102,180, +104,180,102, +180,104,181, +106,181,104, +181,106,182, +108,182,106, +182,108,183, +110,183,108, +183,110,184, +112,184,110, +184,112,185, +114,185,112, +185,114,186, +116,186,114, +186,116,187, +118,187,116, +187,118,188, +120,188,118, +188,120,189, +122,189,120, +189,122,190, +124,190,122, +190,124,191, +126,191,124, +192,128,193, +129,193,128, +193,129,194, +130,194,129, +194,130,195, +131,195,130, +195,131,196, +132,196,131, +196,132,197, +133,197,132, +197,133,198, +134,198,133, +198,134,199, +135,199,134, +199,135,200, +136,200,135, +200,136,201, +137,201,136, +201,137,202, +138,202,137, +202,138,203, +139,203,138, +203,139,204, +140,204,139, +204,140,205, +141,205,140, +205,141,206, +142,206,141, +206,142,207, +143,207,142, +207,143,208, +144,208,143, +208,144,209, +145,209,144, +209,145,210, +146,210,145, +210,146,211, +147,211,146, +211,147,212, +148,212,147, +212,148,213, +149,213,148, +213,149,214, +150,214,149, +214,150,215, +151,215,150, +215,151,216, +152,216,151, +216,152,217, +153,217,152, +217,153,218, +154,218,153, +218,154,219, +155,219,154, +219,155,220, +156,220,155, +220,156,221, +157,221,156, +221,157,222, +158,222,157, +222,158,223, +159,223,158, +223,159,224, +160,224,159, +224,160,225, +161,225,160, +225,161,226, +162,226,161, +226,162,227, +163,227,162, +227,163,228, +164,228,163, +228,164,229, +165,229,164, +229,165,230, +166,230,165, +230,166,231, +167,231,166, +231,167,232, +168,232,167, +232,168,233, +169,233,168, +233,169,234, +170,234,169, +234,170,235, +171,235,170, +235,171,236, +172,236,171, +236,172,237, +173,237,172, +237,173,238, +174,238,173, +238,174,239, +175,239,174, +239,175,240, +176,240,175, +240,176,241, +177,241,176, +241,177,242, +178,242,177, +242,178,243, +179,243,178, +243,179,244, +180,244,179, +244,180,245, +181,245,180, +245,181,246, +182,246,181, +246,182,247, +183,247,182, +247,183,248, +184,248,183, +248,184,249, +185,249,184, +249,185,250, +186,250,185, +250,186,251, +187,251,186, +251,187,252, +188,252,187, +252,188,253, +189,253,188, +253,189,254, +190,254,189, +254,190,255, +191,255,190, +256,192,257, +193,257,192, +257,193,258, +194,258,193, +258,194,259, +195,259,194, +259,195,260, +196,260,195, +260,196,261, +197,261,196, +261,197,262, +198,262,197, +262,198,263, +199,263,198, +263,199,264, +200,264,199, +264,200,265, +201,265,200, +265,201,266, +202,266,201, +266,202,267, +203,267,202, +267,203,268, +204,268,203, +268,204,269, +205,269,204, +269,205,270, +206,270,205, +270,206,271, +207,271,206, +271,207,272, +208,272,207, +272,208,273, +209,273,208, +273,209,274, +210,274,209, +274,210,275, +211,275,210, +275,211,276, +212,276,211, +276,212,277, +213,277,212, +277,213,278, +214,278,213, +278,214,279, +215,279,214, +279,215,280, +216,280,215, +280,216,281, +217,281,216, +281,217,282, +218,282,217, +282,218,283, +219,283,218, +283,219,284, +220,284,219, +284,220,285, +221,285,220, +285,221,286, +222,286,221, +286,222,287, +223,287,222, +287,223,288, +224,288,223, +288,224,289, +225,289,224, +289,225,290, +226,290,225, +290,226,291, +227,291,226, +291,227,292, +228,292,227, +292,228,293, +229,293,228, +293,229,294, +230,294,229, +294,230,295, +231,295,230, +295,231,296, +232,296,231, +296,232,297, +233,297,232, +297,233,298, +234,298,233, +298,234,299, +235,299,234, +299,235,300, +236,300,235, +300,236,301, +237,301,236, +301,237,302, +238,302,237, +302,238,303, +239,303,238, +303,239,304, +240,304,239, +304,240,305, +241,305,240, +305,241,306, +242,306,241, +306,242,307, +243,307,242, +307,243,308, +244,308,243, +308,244,309, +245,309,244, +309,245,310, +246,310,245, +310,246,311, +247,311,246, +311,247,312, +248,312,247, +312,248,313, +249,313,248, +313,249,314, +250,314,249, +314,250,315, +251,315,250, +315,251,316, +252,316,251, +316,252,317, +253,317,252, +317,253,318, +254,318,253, +318,254,319, +255,319,254, +320,256,321, +257,321,256, +321,257,322, +258,322,257, +322,258,323, +259,323,258, +323,259,324, +260,324,259, +324,260,325, +261,325,260, +325,261,326, +262,326,261, +326,262,327, +263,327,262, +327,263,328, +264,328,263, +328,264,329, +265,329,264, +329,265,330, +266,330,265, +330,266,331, +267,331,266, +331,267,332, +268,332,267, +332,268,333, +269,333,268, +333,269,334, +270,334,269, +334,270,335, +271,335,270, +335,271,336, +272,336,271, +336,272,337, +273,337,272, +337,273,338, +274,338,273, +338,274,339, +275,339,274, +339,275,340, +276,340,275, +340,276,341, +277,341,276, +341,277,342, +278,342,277, +342,278,343, +279,343,278, +343,279,344, +280,344,279, +344,280,345, +281,345,280, +345,281,346, +282,346,281, +346,282,347, +283,347,282, +347,283,348, +284,348,283, +348,284,349, +285,349,284, +349,285,350, +286,350,285, +350,286,351, +287,351,286, +351,287,352, +288,352,287, +352,288,353, +289,353,288, +353,289,354, +290,354,289, +354,290,355, +291,355,290, +355,291,356, +292,356,291, +356,292,357, +293,357,292, +357,293,358, +294,358,293, +358,294,359, +295,359,294, +359,295,360, +296,360,295, +360,296,361, +297,361,296, +361,297,362, +298,362,297, +362,298,363, +299,363,298, +363,299,364, +300,364,299, +364,300,365, +301,365,300, +365,301,366, +302,366,301, +366,302,367, +303,367,302, +367,303,368, +304,368,303, +368,304,369, +305,369,304, +369,305,370, +306,370,305, +370,306,371, +307,371,306, +371,307,372, +308,372,307, +372,308,373, +309,373,308, +373,309,374, +310,374,309, +374,310,375, +311,375,310, +375,311,376, +312,376,311, +376,312,377, +313,377,312, +377,313,378, +314,378,313, +378,314,379, +315,379,314, +379,315,380, +316,380,315, +380,316,381, +317,381,316, +381,317,382, +318,382,317, +382,318,383, +319,383,318, +384,320,385, +321,385,320, +385,321,386, +322,386,321, +386,322,387, +323,387,322, +387,323,388, +324,388,323, +388,324,389, +325,389,324, +389,325,390, +326,390,325, +390,326,391, +327,391,326, +391,327,392, +328,392,327, +392,328,393, +329,393,328, +393,329,394, +330,394,329, +394,330,395, +331,395,330, +395,331,396, +332,396,331, +396,332,397, +333,397,332, +397,333,398, +334,398,333, +398,334,399, +335,399,334, +399,335,400, +336,400,335, +400,336,401, +337,401,336, +401,337,402, +338,402,337, +402,338,403, +339,403,338, +403,339,404, +340,404,339, +404,340,405, +341,405,340, +405,341,406, +342,406,341, +406,342,407, +343,407,342, +407,343,408, +344,408,343, +408,344,409, +345,409,344, +409,345,410, +346,410,345, +410,346,411, +347,411,346, +411,347,412, +348,412,347, +412,348,413, +349,413,348, +413,349,414, +350,414,349, +414,350,415, +351,415,350, +415,351,416, +352,416,351, +416,352,417, +353,417,352, +417,353,418, +354,418,353, +418,354,419, +355,419,354, +419,355,420, +356,420,355, +420,356,421, +357,421,356, +421,357,422, +358,422,357, +422,358,423, +359,423,358, +423,359,424, +360,424,359, +424,360,425, +361,425,360, +425,361,426, +362,426,361, +426,362,427, +363,427,362, +427,363,428, +364,428,363, +428,364,429, +365,429,364, +429,365,430, +366,430,365, +430,366,431, +367,431,366, +431,367,432, +368,432,367, +432,368,433, +369,433,368, +433,369,434, +370,434,369, +434,370,435, +371,435,370, +435,371,436, +372,436,371, +436,372,437, +373,437,372, +437,373,438, +374,438,373, +438,374,439, +375,439,374, +439,375,440, +376,440,375, +440,376,441, +377,441,376, +441,377,442, +378,442,377, +442,378,443, +379,443,378, +443,379,444, +380,444,379, +444,380,445, +381,445,380, +445,381,446, +382,446,381, +446,382,447, +383,447,382, +448,384,449, +385,449,384, +449,385,450, +386,450,385, +450,386,451, +387,451,386, +451,387,452, +388,452,387, +452,388,453, +389,453,388, +453,389,454, +390,454,389, +454,390,455, +391,455,390, +455,391,456, +392,456,391, +456,392,457, +393,457,392, +457,393,458, +394,458,393, +458,394,459, +395,459,394, +459,395,460, +396,460,395, +460,396,461, +397,461,396, +461,397,462, +398,462,397, +462,398,463, +399,463,398, +463,399,464, +400,464,399, +464,400,465, +401,465,400, +465,401,466, +402,466,401, +466,402,467, +403,467,402, +467,403,468, +404,468,403, +468,404,469, +405,469,404, +469,405,470, +406,470,405, +470,406,471, +407,471,406, +471,407,472, +408,472,407, +472,408,473, +409,473,408, +473,409,474, +410,474,409, +474,410,475, +411,475,410, +475,411,476, +412,476,411, +476,412,477, +413,477,412, +477,413,478, +414,478,413, +478,414,479, +415,479,414, +479,415,480, +416,480,415, +480,416,481, +417,481,416, +481,417,482, +418,482,417, +482,418,483, +419,483,418, +483,419,484, +420,484,419, +484,420,485, +421,485,420, +485,421,486, +422,486,421, +486,422,487, +423,487,422, +487,423,488, +424,488,423, +488,424,489, +425,489,424, +489,425,490, +426,490,425, +490,426,491, +427,491,426, +491,427,492, +428,492,427, +492,428,493, +429,493,428, +493,429,494, +430,494,429, +494,430,495, +431,495,430, +495,431,496, +432,496,431, +496,432,497, +433,497,432, +497,433,498, +434,498,433, +498,434,499, +435,499,434, +499,435,500, +436,500,435, +500,436,501, +437,501,436, +501,437,502, +438,502,437, +502,438,503, +439,503,438, +503,439,504, +440,504,439, +504,440,505, +441,505,440, +505,441,506, +442,506,441, +506,442,507, +443,507,442, +507,443,508, +444,508,443, +508,444,509, +445,509,444, +509,445,510, +446,510,445, +510,446,511, +447,511,446, +512,448,513, +449,513,448, +513,449,514, +450,514,449, +514,450,515, +451,515,450, +515,451,516, +452,516,451, +516,452,517, +453,517,452, +517,453,518, +454,518,453, +518,454,519, +455,519,454, +519,455,520, +456,520,455, +520,456,521, +457,521,456, +521,457,522, +458,522,457, +522,458,523, +459,523,458, +523,459,524, +460,524,459, +524,460,525, +461,525,460, +525,461,526, +462,526,461, +526,462,527, +463,527,462, +527,463,528, +464,528,463, +528,464,529, +465,529,464, +529,465,530, +466,530,465, +530,466,531, +467,531,466, +531,467,532, +468,532,467, +532,468,533, +469,533,468, +533,469,534, +470,534,469, +534,470,535, +471,535,470, +535,471,536, +472,536,471, +536,472,537, +473,537,472, +537,473,538, +474,538,473, +538,474,539, +475,539,474, +539,475,540, +476,540,475, +540,476,541, +477,541,476, +541,477,542, +478,542,477, +542,478,543, +479,543,478, +543,479,544, +480,544,479, +544,480,545, +481,545,480, +545,481,546, +482,546,481, +546,482,547, +483,547,482, +547,483,548, +484,548,483, +548,484,549, +485,549,484, +549,485,550, +486,550,485, +550,486,551, +487,551,486, +551,487,552, +488,552,487, +552,488,553, +489,553,488, +553,489,554, +490,554,489, +554,490,555, +491,555,490, +555,491,556, +492,556,491, +556,492,557, +493,557,492, +557,493,558, +494,558,493, +558,494,559, +495,559,494, +559,495,560, +496,560,495, +560,496,561, +497,561,496, +561,497,562, +498,562,497, +562,498,563, +499,563,498, +563,499,564, +500,564,499, +564,500,565, +501,565,500, +565,501,566, +502,566,501, +566,502,567, +503,567,502, +567,503,568, +504,568,503, +568,504,569, +505,569,504, +569,505,570, +506,570,505, +570,506,571, +507,571,506, +571,507,572, +508,572,507, +572,508,573, +509,573,508, +573,509,574, +510,574,509, +574,510,575, +511,575,510, +576,512,577, +513,577,512, +577,513,578, +514,578,513, +578,514,579, +515,579,514, +579,515,580, +516,580,515, +580,516,581, +517,581,516, +581,517,582, +518,582,517, +582,518,583, +519,583,518, +583,519,584, +520,584,519, +584,520,585, +521,585,520, +585,521,586, +522,586,521, +586,522,587, +523,587,522, +587,523,588, +524,588,523, +588,524,589, +525,589,524, +589,525,590, +526,590,525, +590,526,591, +527,591,526, +591,527,592, +528,592,527, +592,528,593, +529,593,528, +593,529,594, +530,594,529, +594,530,595, +531,595,530, +595,531,596, +532,596,531, +596,532,597, +533,597,532, +597,533,598, +534,598,533, +598,534,599, +535,599,534, +599,535,600, +536,600,535, +600,536,601, +537,601,536, +601,537,602, +538,602,537, +602,538,603, +539,603,538, +603,539,604, +540,604,539, +604,540,605, +541,605,540, +605,541,606, +542,606,541, +606,542,607, +543,607,542, +607,543,608, +544,608,543, +608,544,609, +545,609,544, +609,545,610, +546,610,545, +610,546,611, +547,611,546, +611,547,612, +548,612,547, +612,548,613, +549,613,548, +613,549,614, +550,614,549, +614,550,615, +551,615,550, +615,551,616, +552,616,551, +616,552,617, +553,617,552, +617,553,618, +554,618,553, +618,554,619, +555,619,554, +619,555,620, +556,620,555, +620,556,621, +557,621,556, +621,557,622, +558,622,557, +622,558,623, +559,623,558, +623,559,624, +560,624,559, +624,560,625, +561,625,560, +625,561,626, +562,626,561, +626,562,627, +563,627,562, +627,563,628, +564,628,563, +628,564,629, +565,629,564, +629,565,630, +566,630,565, +630,566,631, +567,631,566, +631,567,632, +568,632,567, +632,568,633, +569,633,568, +633,569,634, +570,634,569, +634,570,635, +571,635,570, +635,571,636, +572,636,571, +636,572,637, +573,637,572, +637,573,638, +574,638,573, +638,574,639, +575,639,574, +640,576,641, +577,641,576, +641,577,642, +578,642,577, +642,578,643, +579,643,578, +643,579,644, +580,644,579, +644,580,645, +581,645,580, +645,581,646, +582,646,581, +646,582,647, +583,647,582, +647,583,648, +584,648,583, +648,584,649, +585,649,584, +649,585,650, +586,650,585, +650,586,651, +587,651,586, +651,587,652, +588,652,587, +652,588,653, +589,653,588, +653,589,654, +590,654,589, +654,590,655, +591,655,590, +655,591,656, +592,656,591, +656,592,657, +593,657,592, +657,593,658, +594,658,593, +658,594,659, +595,659,594, +659,595,660, +596,660,595, +660,596,661, +597,661,596, +661,597,662, +598,662,597, +662,598,663, +599,663,598, +663,599,664, +600,664,599, +664,600,665, +601,665,600, +665,601,666, +602,666,601, +666,602,667, +603,667,602, +667,603,668, +604,668,603, +668,604,669, +605,669,604, +669,605,670, +606,670,605, +670,606,671, +607,671,606, +671,607,672, +608,672,607, +672,608,673, +609,673,608, +673,609,674, +610,674,609, +674,610,675, +611,675,610, +675,611,676, +612,676,611, +676,612,677, +613,677,612, +677,613,678, +614,678,613, +678,614,679, +615,679,614, +679,615,680, +616,680,615, +680,616,681, +617,681,616, +681,617,682, +618,682,617, +682,618,683, +619,683,618, +683,619,684, +620,684,619, +684,620,685, +621,685,620, +685,621,686, +622,686,621, +686,622,687, +623,687,622, +687,623,688, +624,688,623, +688,624,689, +625,689,624, +689,625,690, +626,690,625, +690,626,691, +627,691,626, +691,627,692, +628,692,627, +692,628,693, +629,693,628, +693,629,694, +630,694,629, +694,630,695, +631,695,630, +695,631,696, +632,696,631, +696,632,697, +633,697,632, +697,633,698, +634,698,633, +698,634,699, +635,699,634, +699,635,700, +636,700,635, +700,636,701, +637,701,636, +701,637,702, +638,702,637, +702,638,703, +639,703,638, +704,640,705, +641,705,640, +705,641,706, +642,706,641, +706,642,707, +643,707,642, +707,643,708, +644,708,643, +708,644,709, +645,709,644, +709,645,710, +646,710,645, +710,646,711, +647,711,646, +711,647,712, +648,712,647, +712,648,713, +649,713,648, +713,649,714, +650,714,649, +714,650,715, +651,715,650, +715,651,716, +652,716,651, +716,652,717, +653,717,652, +717,653,718, +654,718,653, +718,654,719, +655,719,654, +719,655,720, +656,720,655, +720,656,721, +657,721,656, +721,657,722, +658,722,657, +722,658,723, +659,723,658, +723,659,724, +660,724,659, +724,660,725, +661,725,660, +725,661,726, +662,726,661, +726,662,727, +663,727,662, +727,663,728, +664,728,663, +728,664,729, +665,729,664, +729,665,730, +666,730,665, +730,666,731, +667,731,666, +731,667,732, +668,732,667, +732,668,733, +669,733,668, +733,669,734, +670,734,669, +734,670,735, +671,735,670, +735,671,736, +672,736,671, +736,672,737, +673,737,672, +737,673,738, +674,738,673, +738,674,739, +675,739,674, +739,675,740, +676,740,675, +740,676,741, +677,741,676, +741,677,742, +678,742,677, +742,678,743, +679,743,678, +743,679,744, +680,744,679, +744,680,745, +681,745,680, +745,681,746, +682,746,681, +746,682,747, +683,747,682, +747,683,748, +684,748,683, +748,684,749, +685,749,684, +749,685,750, +686,750,685, +750,686,751, +687,751,686, +751,687,752, +688,752,687, +752,688,753, +689,753,688, +753,689,754, +690,754,689, +754,690,755, +691,755,690, +755,691,756, +692,756,691, +756,692,757, +693,757,692, +757,693,758, +694,758,693, +758,694,759, +695,759,694, +759,695,760, +696,760,695, +760,696,761, +697,761,696, +761,697,762, +698,762,697, +762,698,763, +699,763,698, +763,699,764, +700,764,699, +764,700,765, +701,765,700, +765,701,766, +702,766,701, +766,702,767, +703,767,702, +768,704,769, +705,769,704, +769,705,770, +706,770,705, +770,706,771, +707,771,706, +771,707,772, +708,772,707, +772,708,773, +709,773,708, +773,709,774, +710,774,709, +774,710,775, +711,775,710, +775,711,776, +712,776,711, +776,712,777, +713,777,712, +777,713,778, +714,778,713, +778,714,779, +715,779,714, +779,715,780, +716,780,715, +780,716,781, +717,781,716, +781,717,782, +718,782,717, +782,718,783, +719,783,718, +783,719,784, +720,784,719, +784,720,785, +721,785,720, +785,721,786, +722,786,721, +786,722,787, +723,787,722, +787,723,788, +724,788,723, +788,724,789, +725,789,724, +789,725,790, +726,790,725, +790,726,791, +727,791,726, +791,727,792, +728,792,727, +792,728,793, +729,793,728, +793,729,794, +730,794,729, +794,730,795, +731,795,730, +795,731,796, +732,796,731, +796,732,797, +733,797,732, +797,733,798, +734,798,733, +798,734,799, +735,799,734, +799,735,800, +736,800,735, +800,736,801, +737,801,736, +801,737,802, +738,802,737, +802,738,803, +739,803,738, +803,739,804, +740,804,739, +804,740,805, +741,805,740, +805,741,806, +742,806,741, +806,742,807, +743,807,742, +807,743,808, +744,808,743, +808,744,809, +745,809,744, +809,745,810, +746,810,745, +810,746,811, +747,811,746, +811,747,812, +748,812,747, +812,748,813, +749,813,748, +813,749,814, +750,814,749, +814,750,815, +751,815,750, +815,751,816, +752,816,751, +816,752,817, +753,817,752, +817,753,818, +754,818,753, +818,754,819, +755,819,754, +819,755,820, +756,820,755, +820,756,821, +757,821,756, +821,757,822, +758,822,757, +822,758,823, +759,823,758, +823,759,824, +760,824,759, +824,760,825, +761,825,760, +825,761,826, +762,826,761, +826,762,827, +763,827,762, +827,763,828, +764,828,763, +828,764,829, +765,829,764, +829,765,830, +766,830,765, +830,766,831, +767,831,766, +832,768,833, +769,833,768, +833,769,834, +770,834,769, +834,770,835, +771,835,770, +835,771,836, +772,836,771, +836,772,837, +773,837,772, +837,773,838, +774,838,773, +838,774,839, +775,839,774, +839,775,840, +776,840,775, +840,776,841, +777,841,776, +841,777,842, +778,842,777, +842,778,843, +779,843,778, +843,779,844, +780,844,779, +844,780,845, +781,845,780, +845,781,846, +782,846,781, +846,782,847, +783,847,782, +847,783,848, +784,848,783, +848,784,849, +785,849,784, +849,785,850, +786,850,785, +850,786,851, +787,851,786, +851,787,852, +788,852,787, +852,788,853, +789,853,788, +853,789,854, +790,854,789, +854,790,855, +791,855,790, +855,791,856, +792,856,791, +856,792,857, +793,857,792, +857,793,858, +794,858,793, +858,794,859, +795,859,794, +859,795,860, +796,860,795, +860,796,861, +797,861,796, +861,797,862, +798,862,797, +862,798,863, +799,863,798, +863,799,864, +800,864,799, +864,800,865, +801,865,800, +865,801,866, +802,866,801, +866,802,867, +803,867,802, +867,803,868, +804,868,803, +868,804,869, +805,869,804, +869,805,870, +806,870,805, +870,806,871, +807,871,806, +871,807,872, +808,872,807, +872,808,873, +809,873,808, +873,809,874, +810,874,809, +874,810,875, +811,875,810, +875,811,876, +812,876,811, +876,812,877, +813,877,812, +877,813,878, +814,878,813, +878,814,879, +815,879,814, +879,815,880, +816,880,815, +880,816,881, +817,881,816, +881,817,882, +818,882,817, +882,818,883, +819,883,818, +883,819,884, +820,884,819, +884,820,885, +821,885,820, +885,821,886, +822,886,821, +886,822,887, +823,887,822, +887,823,888, +824,888,823, +888,824,889, +825,889,824, +889,825,890, +826,890,825, +890,826,891, +827,891,826, +891,827,892, +828,892,827, +892,828,893, +829,893,828, +893,829,894, +830,894,829, +894,830,895, +831,895,830, +896,832,897, +833,897,832, +897,833,898, +834,898,833, +898,834,899, +835,899,834, +899,835,900, +836,900,835, +900,836,901, +837,901,836, +901,837,902, +838,902,837, +902,838,903, +839,903,838, +903,839,904, +840,904,839, +904,840,905, +841,905,840, +905,841,906, +842,906,841, +906,842,907, +843,907,842, +907,843,908, +844,908,843, +908,844,909, +845,909,844, +909,845,910, +846,910,845, +910,846,911, +847,911,846, +911,847,912, +848,912,847, +912,848,913, +849,913,848, +913,849,914, +850,914,849, +914,850,915, +851,915,850, +915,851,916, +852,916,851, +916,852,917, +853,917,852, +917,853,918, +854,918,853, +918,854,919, +855,919,854, +919,855,920, +856,920,855, +920,856,921, +857,921,856, +921,857,922, +858,922,857, +922,858,923, +859,923,858, +923,859,924, +860,924,859, +924,860,925, +861,925,860, +925,861,926, +862,926,861, +926,862,927, +863,927,862, +927,863,928, +864,928,863, +928,864,929, +865,929,864, +929,865,930, +866,930,865, +930,866,931, +867,931,866, +931,867,932, +868,932,867, +932,868,933, +869,933,868, +933,869,934, +870,934,869, +934,870,935, +871,935,870, +935,871,936, +872,936,871, +936,872,937, +873,937,872, +937,873,938, +874,938,873, +938,874,939, +875,939,874, +939,875,940, +876,940,875, +940,876,941, +877,941,876, +941,877,942, +878,942,877, +942,878,943, +879,943,878, +943,879,944, +880,944,879, +944,880,945, +881,945,880, +945,881,946, +882,946,881, +946,882,947, +883,947,882, +947,883,948, +884,948,883, +948,884,949, +885,949,884, +949,885,950, +886,950,885, +950,886,951, +887,951,886, +951,887,952, +888,952,887, +952,888,953, +889,953,888, +953,889,954, +890,954,889, +954,890,955, +891,955,890, +955,891,956, +892,956,891, +956,892,957, +893,957,892, +957,893,958, +894,958,893, +958,894,959, +895,959,894, +960,896,961, +897,961,896, +961,897,962, +898,962,897, +962,898,963, +899,963,898, +963,899,964, +900,964,899, +964,900,965, +901,965,900, +965,901,966, +902,966,901, +966,902,967, +903,967,902, +967,903,968, +904,968,903, +968,904,969, +905,969,904, +969,905,970, +906,970,905, +970,906,971, +907,971,906, +971,907,972, +908,972,907, +972,908,973, +909,973,908, +973,909,974, +910,974,909, +974,910,975, +911,975,910, +975,911,976, +912,976,911, +976,912,977, +913,977,912, +977,913,978, +914,978,913, +978,914,979, +915,979,914, +979,915,980, +916,980,915, +980,916,981, +917,981,916, +981,917,982, +918,982,917, +982,918,983, +919,983,918, +983,919,984, +920,984,919, +984,920,985, +921,985,920, +985,921,986, +922,986,921, +986,922,987, +923,987,922, +987,923,988, +924,988,923, +988,924,989, +925,989,924, +989,925,990, +926,990,925, +990,926,991, +927,991,926, +991,927,992, +928,992,927, +992,928,993, +929,993,928, +993,929,994, +930,994,929, +994,930,995, +931,995,930, +995,931,996, +932,996,931, +996,932,997, +933,997,932, +997,933,998, +934,998,933, +998,934,999, +935,999,934, +999,935,1000, +936,1000,935, +1000,936,1001, +937,1001,936, +1001,937,1002, +938,1002,937, +1002,938,1003, +939,1003,938, +1003,939,1004, +940,1004,939, +1004,940,1005, +941,1005,940, +1005,941,1006, +942,1006,941, +1006,942,1007, +943,1007,942, +1007,943,1008, +944,1008,943, +1008,944,1009, +945,1009,944, +1009,945,1010, +946,1010,945, +1010,946,1011, +947,1011,946, +1011,947,1012, +948,1012,947, +1012,948,1013, +949,1013,948, +1013,949,1014, +950,1014,949, +1014,950,1015, +951,1015,950, +1015,951,1016, +952,1016,951, +1016,952,1017, +953,1017,952, +1017,953,1018, +954,1018,953, +1018,954,1019, +955,1019,954, +1019,955,1020, +956,1020,955, +1020,956,1021, +957,1021,956, +1021,957,1022, +958,1022,957, +1022,958,1023, +959,1023,958, +1024,960,1025, +961,1025,960, +1025,961,1026, +962,1026,961, +1026,962,1027, +963,1027,962, +1027,963,1028, +964,1028,963, +1028,964,1029, +965,1029,964, +1029,965,1030, +966,1030,965, +1030,966,1031, +967,1031,966, +1031,967,1032, +968,1032,967, +1032,968,1033, +969,1033,968, +1033,969,1034, +970,1034,969, +1034,970,1035, +971,1035,970, +1035,971,1036, +972,1036,971, +1036,972,1037, +973,1037,972, +1037,973,1038, +974,1038,973, +1038,974,1039, +975,1039,974, +1039,975,1040, +976,1040,975, +1040,976,1041, +977,1041,976, +1041,977,1042, +978,1042,977, +1042,978,1043, +979,1043,978, +1043,979,1044, +980,1044,979, +1044,980,1045, +981,1045,980, +1045,981,1046, +982,1046,981, +1046,982,1047, +983,1047,982, +1047,983,1048, +984,1048,983, +1048,984,1049, +985,1049,984, +1049,985,1050, +986,1050,985, +1050,986,1051, +987,1051,986, +1051,987,1052, +988,1052,987, +1052,988,1053, +989,1053,988, +1053,989,1054, +990,1054,989, +1054,990,1055, +991,1055,990, +1055,991,1056, +992,1056,991, +1056,992,1057, +993,1057,992, +1057,993,1058, +994,1058,993, +1058,994,1059, +995,1059,994, +1059,995,1060, +996,1060,995, +1060,996,1061, +997,1061,996, +1061,997,1062, +998,1062,997, +1062,998,1063, +999,1063,998, +1063,999,1064, +1000,1064,999, +1064,1000,1065, +1001,1065,1000, +1065,1001,1066, +1002,1066,1001, +1066,1002,1067, +1003,1067,1002, +1067,1003,1068, +1004,1068,1003, +1068,1004,1069, +1005,1069,1004, +1069,1005,1070, +1006,1070,1005, +1070,1006,1071, +1007,1071,1006, +1071,1007,1072, +1008,1072,1007, +1072,1008,1073, +1009,1073,1008, +1073,1009,1074, +1010,1074,1009, +1074,1010,1075, +1011,1075,1010, +1075,1011,1076, +1012,1076,1011, +1076,1012,1077, +1013,1077,1012, +1077,1013,1078, +1014,1078,1013, +1078,1014,1079, +1015,1079,1014, +1079,1015,1080, +1016,1080,1015, +1080,1016,1081, +1017,1081,1016, +1081,1017,1082, +1018,1082,1017, +1082,1018,1083, +1019,1083,1018, +1083,1019,1084, +1020,1084,1019, +1084,1020,1085, +1021,1085,1020, +1085,1021,1086, +1022,1086,1021, +1086,1022,1087, +1023,1087,1022, +1088,1024,1089, +1025,1089,1024, +1089,1025,1090, +1026,1090,1025, +1090,1026,1091, +1027,1091,1026, +1091,1027,1092, +1028,1092,1027, +1092,1028,1093, +1029,1093,1028, +1093,1029,1094, +1030,1094,1029, +1094,1030,1095, +1031,1095,1030, +1095,1031,1096, +1032,1096,1031, +1096,1032,1097, +1033,1097,1032, +1097,1033,1098, +1034,1098,1033, +1098,1034,1099, +1035,1099,1034, +1099,1035,1100, +1036,1100,1035, +1100,1036,1101, +1037,1101,1036, +1101,1037,1102, +1038,1102,1037, +1102,1038,1103, +1039,1103,1038, +1103,1039,1104, +1040,1104,1039, +1104,1040,1105, +1041,1105,1040, +1105,1041,1106, +1042,1106,1041, +1106,1042,1107, +1043,1107,1042, +1107,1043,1108, +1044,1108,1043, +1108,1044,1109, +1045,1109,1044, +1109,1045,1110, +1046,1110,1045, +1110,1046,1111, +1047,1111,1046, +1111,1047,1112, +1048,1112,1047, +1112,1048,1113, +1049,1113,1048, +1113,1049,1114, +1050,1114,1049, +1114,1050,1115, +1051,1115,1050, +1115,1051,1116, +1052,1116,1051, +1116,1052,1117, +1053,1117,1052, +1117,1053,1118, +1054,1118,1053, +1118,1054,1119, +1055,1119,1054, +1119,1055,1120, +1056,1120,1055, +1120,1056,1121, +1057,1121,1056, +1121,1057,1122, +1058,1122,1057, +1122,1058,1123, +1059,1123,1058, +1123,1059,1124, +1060,1124,1059, +1124,1060,1125, +1061,1125,1060, +1125,1061,1126, +1062,1126,1061, +1126,1062,1127, +1063,1127,1062, +1127,1063,1128, +1064,1128,1063, +1128,1064,1129, +1065,1129,1064, +1129,1065,1130, +1066,1130,1065, +1130,1066,1131, +1067,1131,1066, +1131,1067,1132, +1068,1132,1067, +1132,1068,1133, +1069,1133,1068, +1133,1069,1134, +1070,1134,1069, +1134,1070,1135, +1071,1135,1070, +1135,1071,1136, +1072,1136,1071, +1136,1072,1137, +1073,1137,1072, +1137,1073,1138, +1074,1138,1073, +1138,1074,1139, +1075,1139,1074, +1139,1075,1140, +1076,1140,1075, +1140,1076,1141, +1077,1141,1076, +1141,1077,1142, +1078,1142,1077, +1142,1078,1143, +1079,1143,1078, +1143,1079,1144, +1080,1144,1079, +1144,1080,1145, +1081,1145,1080, +1145,1081,1146, +1082,1146,1081, +1146,1082,1147, +1083,1147,1082, +1147,1083,1148, +1084,1148,1083, +1148,1084,1149, +1085,1149,1084, +1149,1085,1150, +1086,1150,1085, +1150,1086,1151, +1087,1151,1086, +1152,1088,1153, +1089,1153,1088, +1153,1089,1154, +1090,1154,1089, +1154,1090,1155, +1091,1155,1090, +1155,1091,1156, +1092,1156,1091, +1156,1092,1157, +1093,1157,1092, +1157,1093,1158, +1094,1158,1093, +1158,1094,1159, +1095,1159,1094, +1159,1095,1160, +1096,1160,1095, +1160,1096,1161, +1097,1161,1096, +1161,1097,1162, +1098,1162,1097, +1162,1098,1163, +1099,1163,1098, +1163,1099,1164, +1100,1164,1099, +1164,1100,1165, +1101,1165,1100, +1165,1101,1166, +1102,1166,1101, +1166,1102,1167, +1103,1167,1102, +1167,1103,1168, +1104,1168,1103, +1168,1104,1169, +1105,1169,1104, +1169,1105,1170, +1106,1170,1105, +1170,1106,1171, +1107,1171,1106, +1171,1107,1172, +1108,1172,1107, +1172,1108,1173, +1109,1173,1108, +1173,1109,1174, +1110,1174,1109, +1174,1110,1175, +1111,1175,1110, +1175,1111,1176, +1112,1176,1111, +1176,1112,1177, +1113,1177,1112, +1177,1113,1178, +1114,1178,1113, +1178,1114,1179, +1115,1179,1114, +1179,1115,1180, +1116,1180,1115, +1180,1116,1181, +1117,1181,1116, +1181,1117,1182, +1118,1182,1117, +1182,1118,1183, +1119,1183,1118, +1183,1119,1184, +1120,1184,1119, +1184,1120,1185, +1121,1185,1120, +1185,1121,1186, +1122,1186,1121, +1186,1122,1187, +1123,1187,1122, +1187,1123,1188, +1124,1188,1123, +1188,1124,1189, +1125,1189,1124, +1189,1125,1190, +1126,1190,1125, +1190,1126,1191, +1127,1191,1126, +1191,1127,1192, +1128,1192,1127, +1192,1128,1193, +1129,1193,1128, +1193,1129,1194, +1130,1194,1129, +1194,1130,1195, +1131,1195,1130, +1195,1131,1196, +1132,1196,1131, +1196,1132,1197, +1133,1197,1132, +1197,1133,1198, +1134,1198,1133, +1198,1134,1199, +1135,1199,1134, +1199,1135,1200, +1136,1200,1135, +1200,1136,1201, +1137,1201,1136, +1201,1137,1202, +1138,1202,1137, +1202,1138,1203, +1139,1203,1138, +1203,1139,1204, +1140,1204,1139, +1204,1140,1205, +1141,1205,1140, +1205,1141,1206, +1142,1206,1141, +1206,1142,1207, +1143,1207,1142, +1207,1143,1208, +1144,1208,1143, +1208,1144,1209, +1145,1209,1144, +1209,1145,1210, +1146,1210,1145, +1210,1146,1211, +1147,1211,1146, +1211,1147,1212, +1148,1212,1147, +1212,1148,1213, +1149,1213,1148, +1213,1149,1214, +1150,1214,1149, +1214,1150,1215, +1151,1215,1150, +1216,1152,1217, +1153,1217,1152, +1217,1153,1218, +1154,1218,1153, +1218,1154,1219, +1155,1219,1154, +1219,1155,1220, +1156,1220,1155, +1220,1156,1221, +1157,1221,1156, +1221,1157,1222, +1158,1222,1157, +1222,1158,1223, +1159,1223,1158, +1223,1159,1224, +1160,1224,1159, +1224,1160,1225, +1161,1225,1160, +1225,1161,1226, +1162,1226,1161, +1226,1162,1227, +1163,1227,1162, +1227,1163,1228, +1164,1228,1163, +1228,1164,1229, +1165,1229,1164, +1229,1165,1230, +1166,1230,1165, +1230,1166,1231, +1167,1231,1166, +1231,1167,1232, +1168,1232,1167, +1232,1168,1233, +1169,1233,1168, +1233,1169,1234, +1170,1234,1169, +1234,1170,1235, +1171,1235,1170, +1235,1171,1236, +1172,1236,1171, +1236,1172,1237, +1173,1237,1172, +1237,1173,1238, +1174,1238,1173, +1238,1174,1239, +1175,1239,1174, +1239,1175,1240, +1176,1240,1175, +1240,1176,1241, +1177,1241,1176, +1241,1177,1242, +1178,1242,1177, +1242,1178,1243, +1179,1243,1178, +1243,1179,1244, +1180,1244,1179, +1244,1180,1245, +1181,1245,1180, +1245,1181,1246, +1182,1246,1181, +1246,1182,1247, +1183,1247,1182, +1247,1183,1248, +1184,1248,1183, +1248,1184,1249, +1185,1249,1184, +1249,1185,1250, +1186,1250,1185, +1250,1186,1251, +1187,1251,1186, +1251,1187,1252, +1188,1252,1187, +1252,1188,1253, +1189,1253,1188, +1253,1189,1254, +1190,1254,1189, +1254,1190,1255, +1191,1255,1190, +1255,1191,1256, +1192,1256,1191, +1256,1192,1257, +1193,1257,1192, +1257,1193,1258, +1194,1258,1193, +1258,1194,1259, +1195,1259,1194, +1259,1195,1260, +1196,1260,1195, +1260,1196,1261, +1197,1261,1196, +1261,1197,1262, +1198,1262,1197, +1262,1198,1263, +1199,1263,1198, +1263,1199,1264, +1200,1264,1199, +1264,1200,1265, +1201,1265,1200, +1265,1201,1266, +1202,1266,1201, +1266,1202,1267, +1203,1267,1202, +1267,1203,1268, +1204,1268,1203, +1268,1204,1269, +1205,1269,1204, +1269,1205,1270, +1206,1270,1205, +1270,1206,1271, +1207,1271,1206, +1271,1207,1272, +1208,1272,1207, +1272,1208,1273, +1209,1273,1208, +1273,1209,1274, +1210,1274,1209, +1274,1210,1275, +1211,1275,1210, +1275,1211,1276, +1212,1276,1211, +1276,1212,1277, +1213,1277,1212, +1277,1213,1278, +1214,1278,1213, +1278,1214,1279, +1215,1279,1214, +1280,1216,1281, +1217,1281,1216, +1281,1217,1282, +1218,1282,1217, +1282,1218,1283, +1219,1283,1218, +1283,1219,1284, +1220,1284,1219, +1284,1220,1285, +1221,1285,1220, +1285,1221,1286, +1222,1286,1221, +1286,1222,1287, +1223,1287,1222, +1287,1223,1288, +1224,1288,1223, +1288,1224,1289, +1225,1289,1224, +1289,1225,1290, +1226,1290,1225, +1290,1226,1291, +1227,1291,1226, +1291,1227,1292, +1228,1292,1227, +1292,1228,1293, +1229,1293,1228, +1293,1229,1294, +1230,1294,1229, +1294,1230,1295, +1231,1295,1230, +1295,1231,1296, +1232,1296,1231, +1296,1232,1297, +1233,1297,1232, +1297,1233,1298, +1234,1298,1233, +1298,1234,1299, +1235,1299,1234, +1299,1235,1300, +1236,1300,1235, +1300,1236,1301, +1237,1301,1236, +1301,1237,1302, +1238,1302,1237, +1302,1238,1303, +1239,1303,1238, +1303,1239,1304, +1240,1304,1239, +1304,1240,1305, +1241,1305,1240, +1305,1241,1306, +1242,1306,1241, +1306,1242,1307, +1243,1307,1242, +1307,1243,1308, +1244,1308,1243, +1308,1244,1309, +1245,1309,1244, +1309,1245,1310, +1246,1310,1245, +1310,1246,1311, +1247,1311,1246, +1311,1247,1312, +1248,1312,1247, +1312,1248,1313, +1249,1313,1248, +1313,1249,1314, +1250,1314,1249, +1314,1250,1315, +1251,1315,1250, +1315,1251,1316, +1252,1316,1251, +1316,1252,1317, +1253,1317,1252, +1317,1253,1318, +1254,1318,1253, +1318,1254,1319, +1255,1319,1254, +1319,1255,1320, +1256,1320,1255, +1320,1256,1321, +1257,1321,1256, +1321,1257,1322, +1258,1322,1257, +1322,1258,1323, +1259,1323,1258, +1323,1259,1324, +1260,1324,1259, +1324,1260,1325, +1261,1325,1260, +1325,1261,1326, +1262,1326,1261, +1326,1262,1327, +1263,1327,1262, +1327,1263,1328, +1264,1328,1263, +1328,1264,1329, +1265,1329,1264, +1329,1265,1330, +1266,1330,1265, +1330,1266,1331, +1267,1331,1266, +1331,1267,1332, +1268,1332,1267, +1332,1268,1333, +1269,1333,1268, +1333,1269,1334, +1270,1334,1269, +1334,1270,1335, +1271,1335,1270, +1335,1271,1336, +1272,1336,1271, +1336,1272,1337, +1273,1337,1272, +1337,1273,1338, +1274,1338,1273, +1338,1274,1339, +1275,1339,1274, +1339,1275,1340, +1276,1340,1275, +1340,1276,1341, +1277,1341,1276, +1341,1277,1342, +1278,1342,1277, +1342,1278,1343, +1279,1343,1278, +1344,1280,1345, +1281,1345,1280, +1345,1281,1346, +1282,1346,1281, +1346,1282,1347, +1283,1347,1282, +1347,1283,1348, +1284,1348,1283, +1348,1284,1349, +1285,1349,1284, +1349,1285,1350, +1286,1350,1285, +1350,1286,1351, +1287,1351,1286, +1351,1287,1352, +1288,1352,1287, +1352,1288,1353, +1289,1353,1288, +1353,1289,1354, +1290,1354,1289, +1354,1290,1355, +1291,1355,1290, +1355,1291,1356, +1292,1356,1291, +1356,1292,1357, +1293,1357,1292, +1357,1293,1358, +1294,1358,1293, +1358,1294,1359, +1295,1359,1294, +1359,1295,1360, +1296,1360,1295, +1360,1296,1361, +1297,1361,1296, +1361,1297,1362, +1298,1362,1297, +1362,1298,1363, +1299,1363,1298, +1363,1299,1364, +1300,1364,1299, +1364,1300,1365, +1301,1365,1300, +1365,1301,1366, +1302,1366,1301, +1366,1302,1367, +1303,1367,1302, +1367,1303,1368, +1304,1368,1303, +1368,1304,1369, +1305,1369,1304, +1369,1305,1370, +1306,1370,1305, +1370,1306,1371, +1307,1371,1306, +1371,1307,1372, +1308,1372,1307, +1372,1308,1373, +1309,1373,1308, +1373,1309,1374, +1310,1374,1309, +1374,1310,1375, +1311,1375,1310, +1375,1311,1376, +1312,1376,1311, +1376,1312,1377, +1313,1377,1312, +1377,1313,1378, +1314,1378,1313, +1378,1314,1379, +1315,1379,1314, +1379,1315,1380, +1316,1380,1315, +1380,1316,1381, +1317,1381,1316, +1381,1317,1382, +1318,1382,1317, +1382,1318,1383, +1319,1383,1318, +1383,1319,1384, +1320,1384,1319, +1384,1320,1385, +1321,1385,1320, +1385,1321,1386, +1322,1386,1321, +1386,1322,1387, +1323,1387,1322, +1387,1323,1388, +1324,1388,1323, +1388,1324,1389, +1325,1389,1324, +1389,1325,1390, +1326,1390,1325, +1390,1326,1391, +1327,1391,1326, +1391,1327,1392, +1328,1392,1327, +1392,1328,1393, +1329,1393,1328, +1393,1329,1394, +1330,1394,1329, +1394,1330,1395, +1331,1395,1330, +1395,1331,1396, +1332,1396,1331, +1396,1332,1397, +1333,1397,1332, +1397,1333,1398, +1334,1398,1333, +1398,1334,1399, +1335,1399,1334, +1399,1335,1400, +1336,1400,1335, +1400,1336,1401, +1337,1401,1336, +1401,1337,1402, +1338,1402,1337, +1402,1338,1403, +1339,1403,1338, +1403,1339,1404, +1340,1404,1339, +1404,1340,1405, +1341,1405,1340, +1405,1341,1406, +1342,1406,1341, +1406,1342,1407, +1343,1407,1342, +1408,1344,1409, +1345,1409,1344, +1409,1345,1410, +1346,1410,1345, +1410,1346,1411, +1347,1411,1346, +1411,1347,1412, +1348,1412,1347, +1412,1348,1413, +1349,1413,1348, +1413,1349,1414, +1350,1414,1349, +1414,1350,1415, +1351,1415,1350, +1415,1351,1416, +1352,1416,1351, +1416,1352,1417, +1353,1417,1352, +1417,1353,1418, +1354,1418,1353, +1418,1354,1419, +1355,1419,1354, +1419,1355,1420, +1356,1420,1355, +1420,1356,1421, +1357,1421,1356, +1421,1357,1422, +1358,1422,1357, +1422,1358,1423, +1359,1423,1358, +1423,1359,1424, +1360,1424,1359, +1424,1360,1425, +1361,1425,1360, +1425,1361,1426, +1362,1426,1361, +1426,1362,1427, +1363,1427,1362, +1427,1363,1428, +1364,1428,1363, +1428,1364,1429, +1365,1429,1364, +1429,1365,1430, +1366,1430,1365, +1430,1366,1431, +1367,1431,1366, +1431,1367,1432, +1368,1432,1367, +1432,1368,1433, +1369,1433,1368, +1433,1369,1434, +1370,1434,1369, +1434,1370,1435, +1371,1435,1370, +1435,1371,1436, +1372,1436,1371, +1436,1372,1437, +1373,1437,1372, +1437,1373,1438, +1374,1438,1373, +1438,1374,1439, +1375,1439,1374, +1439,1375,1440, +1376,1440,1375, +1440,1376,1441, +1377,1441,1376, +1441,1377,1442, +1378,1442,1377, +1442,1378,1443, +1379,1443,1378, +1443,1379,1444, +1380,1444,1379, +1444,1380,1445, +1381,1445,1380, +1445,1381,1446, +1382,1446,1381, +1446,1382,1447, +1383,1447,1382, +1447,1383,1448, +1384,1448,1383, +1448,1384,1449, +1385,1449,1384, +1449,1385,1450, +1386,1450,1385, +1450,1386,1451, +1387,1451,1386, +1451,1387,1452, +1388,1452,1387, +1452,1388,1453, +1389,1453,1388, +1453,1389,1454, +1390,1454,1389, +1454,1390,1455, +1391,1455,1390, +1455,1391,1456, +1392,1456,1391, +1456,1392,1457, +1393,1457,1392, +1457,1393,1458, +1394,1458,1393, +1458,1394,1459, +1395,1459,1394, +1459,1395,1460, +1396,1460,1395, +1460,1396,1461, +1397,1461,1396, +1461,1397,1462, +1398,1462,1397, +1462,1398,1463, +1399,1463,1398, +1463,1399,1464, +1400,1464,1399, +1464,1400,1465, +1401,1465,1400, +1465,1401,1466, +1402,1466,1401, +1466,1402,1467, +1403,1467,1402, +1467,1403,1468, +1404,1468,1403, +1468,1404,1469, +1405,1469,1404, +1469,1405,1470, +1406,1470,1405, +1470,1406,1471, +1407,1471,1406, +1472,1408,1473, +1409,1473,1408, +1473,1409,1474, +1410,1474,1409, +1474,1410,1475, +1411,1475,1410, +1475,1411,1476, +1412,1476,1411, +1476,1412,1477, +1413,1477,1412, +1477,1413,1478, +1414,1478,1413, +1478,1414,1479, +1415,1479,1414, +1479,1415,1480, +1416,1480,1415, +1480,1416,1481, +1417,1481,1416, +1481,1417,1482, +1418,1482,1417, +1482,1418,1483, +1419,1483,1418, +1483,1419,1484, +1420,1484,1419, +1484,1420,1485, +1421,1485,1420, +1485,1421,1486, +1422,1486,1421, +1486,1422,1487, +1423,1487,1422, +1487,1423,1488, +1424,1488,1423, +1488,1424,1489, +1425,1489,1424, +1489,1425,1490, +1426,1490,1425, +1490,1426,1491, +1427,1491,1426, +1491,1427,1492, +1428,1492,1427, +1492,1428,1493, +1429,1493,1428, +1493,1429,1494, +1430,1494,1429, +1494,1430,1495, +1431,1495,1430, +1495,1431,1496, +1432,1496,1431, +1496,1432,1497, +1433,1497,1432, +1497,1433,1498, +1434,1498,1433, +1498,1434,1499, +1435,1499,1434, +1499,1435,1500, +1436,1500,1435, +1500,1436,1501, +1437,1501,1436, +1501,1437,1502, +1438,1502,1437, +1502,1438,1503, +1439,1503,1438, +1503,1439,1504, +1440,1504,1439, +1504,1440,1505, +1441,1505,1440, +1505,1441,1506, +1442,1506,1441, +1506,1442,1507, +1443,1507,1442, +1507,1443,1508, +1444,1508,1443, +1508,1444,1509, +1445,1509,1444, +1509,1445,1510, +1446,1510,1445, +1510,1446,1511, +1447,1511,1446, +1511,1447,1512, +1448,1512,1447, +1512,1448,1513, +1449,1513,1448, +1513,1449,1514, +1450,1514,1449, +1514,1450,1515, +1451,1515,1450, +1515,1451,1516, +1452,1516,1451, +1516,1452,1517, +1453,1517,1452, +1517,1453,1518, +1454,1518,1453, +1518,1454,1519, +1455,1519,1454, +1519,1455,1520, +1456,1520,1455, +1520,1456,1521, +1457,1521,1456, +1521,1457,1522, +1458,1522,1457, +1522,1458,1523, +1459,1523,1458, +1523,1459,1524, +1460,1524,1459, +1524,1460,1525, +1461,1525,1460, +1525,1461,1526, +1462,1526,1461, +1526,1462,1527, +1463,1527,1462, +1527,1463,1528, +1464,1528,1463, +1528,1464,1529, +1465,1529,1464, +1529,1465,1530, +1466,1530,1465, +1530,1466,1531, +1467,1531,1466, +1531,1467,1532, +1468,1532,1467, +1532,1468,1533, +1469,1533,1468, +1533,1469,1534, +1470,1534,1469, +1534,1470,1535, +1471,1535,1470, +1536,1472,1537, +1473,1537,1472, +1537,1473,1538, +1474,1538,1473, +1538,1474,1539, +1475,1539,1474, +1539,1475,1540, +1476,1540,1475, +1540,1476,1541, +1477,1541,1476, +1541,1477,1542, +1478,1542,1477, +1542,1478,1543, +1479,1543,1478, +1543,1479,1544, +1480,1544,1479, +1544,1480,1545, +1481,1545,1480, +1545,1481,1546, +1482,1546,1481, +1546,1482,1547, +1483,1547,1482, +1547,1483,1548, +1484,1548,1483, +1548,1484,1549, +1485,1549,1484, +1549,1485,1550, +1486,1550,1485, +1550,1486,1551, +1487,1551,1486, +1551,1487,1552, +1488,1552,1487, +1552,1488,1553, +1489,1553,1488, +1553,1489,1554, +1490,1554,1489, +1554,1490,1555, +1491,1555,1490, +1555,1491,1556, +1492,1556,1491, +1556,1492,1557, +1493,1557,1492, +1557,1493,1558, +1494,1558,1493, +1558,1494,1559, +1495,1559,1494, +1559,1495,1560, +1496,1560,1495, +1560,1496,1561, +1497,1561,1496, +1561,1497,1562, +1498,1562,1497, +1562,1498,1563, +1499,1563,1498, +1563,1499,1564, +1500,1564,1499, +1564,1500,1565, +1501,1565,1500, +1565,1501,1566, +1502,1566,1501, +1566,1502,1567, +1503,1567,1502, +1567,1503,1568, +1504,1568,1503, +1568,1504,1569, +1505,1569,1504, +1569,1505,1570, +1506,1570,1505, +1570,1506,1571, +1507,1571,1506, +1571,1507,1572, +1508,1572,1507, +1572,1508,1573, +1509,1573,1508, +1573,1509,1574, +1510,1574,1509, +1574,1510,1575, +1511,1575,1510, +1575,1511,1576, +1512,1576,1511, +1576,1512,1577, +1513,1577,1512, +1577,1513,1578, +1514,1578,1513, +1578,1514,1579, +1515,1579,1514, +1579,1515,1580, +1516,1580,1515, +1580,1516,1581, +1517,1581,1516, +1581,1517,1582, +1518,1582,1517, +1582,1518,1583, +1519,1583,1518, +1583,1519,1584, +1520,1584,1519, +1584,1520,1585, +1521,1585,1520, +1585,1521,1586, +1522,1586,1521, +1586,1522,1587, +1523,1587,1522, +1587,1523,1588, +1524,1588,1523, +1588,1524,1589, +1525,1589,1524, +1589,1525,1590, +1526,1590,1525, +1590,1526,1591, +1527,1591,1526, +1591,1527,1592, +1528,1592,1527, +1592,1528,1593, +1529,1593,1528, +1593,1529,1594, +1530,1594,1529, +1594,1530,1595, +1531,1595,1530, +1595,1531,1596, +1532,1596,1531, +1596,1532,1597, +1533,1597,1532, +1597,1533,1598, +1534,1598,1533, +1598,1534,1599, +1535,1599,1534, +1600,1536,1601, +1537,1601,1536, +1601,1537,1602, +1538,1602,1537, +1602,1538,1603, +1539,1603,1538, +1603,1539,1604, +1540,1604,1539, +1604,1540,1605, +1541,1605,1540, +1605,1541,1606, +1542,1606,1541, +1606,1542,1607, +1543,1607,1542, +1607,1543,1608, +1544,1608,1543, +1608,1544,1609, +1545,1609,1544, +1609,1545,1610, +1546,1610,1545, +1610,1546,1611, +1547,1611,1546, +1611,1547,1612, +1548,1612,1547, +1612,1548,1613, +1549,1613,1548, +1613,1549,1614, +1550,1614,1549, +1614,1550,1615, +1551,1615,1550, +1615,1551,1616, +1552,1616,1551, +1616,1552,1617, +1553,1617,1552, +1617,1553,1618, +1554,1618,1553, +1618,1554,1619, +1555,1619,1554, +1619,1555,1620, +1556,1620,1555, +1620,1556,1621, +1557,1621,1556, +1621,1557,1622, +1558,1622,1557, +1622,1558,1623, +1559,1623,1558, +1623,1559,1624, +1560,1624,1559, +1624,1560,1625, +1561,1625,1560, +1625,1561,1626, +1562,1626,1561, +1626,1562,1627, +1563,1627,1562, +1627,1563,1628, +1564,1628,1563, +1628,1564,1629, +1565,1629,1564, +1629,1565,1630, +1566,1630,1565, +1630,1566,1631, +1567,1631,1566, +1631,1567,1632, +1568,1632,1567, +1632,1568,1633, +1569,1633,1568, +1633,1569,1634, +1570,1634,1569, +1634,1570,1635, +1571,1635,1570, +1635,1571,1636, +1572,1636,1571, +1636,1572,1637, +1573,1637,1572, +1637,1573,1638, +1574,1638,1573, +1638,1574,1639, +1575,1639,1574, +1639,1575,1640, +1576,1640,1575, +1640,1576,1641, +1577,1641,1576, +1641,1577,1642, +1578,1642,1577, +1642,1578,1643, +1579,1643,1578, +1643,1579,1644, +1580,1644,1579, +1644,1580,1645, +1581,1645,1580, +1645,1581,1646, +1582,1646,1581, +1646,1582,1647, +1583,1647,1582, +1647,1583,1648, +1584,1648,1583, +1648,1584,1649, +1585,1649,1584, +1649,1585,1650, +1586,1650,1585, +1650,1586,1651, +1587,1651,1586, +1651,1587,1652, +1588,1652,1587, +1652,1588,1653, +1589,1653,1588, +1653,1589,1654, +1590,1654,1589, +1654,1590,1655, +1591,1655,1590, +1655,1591,1656, +1592,1656,1591, +1656,1592,1657, +1593,1657,1592, +1657,1593,1658, +1594,1658,1593, +1658,1594,1659, +1595,1659,1594, +1659,1595,1660, +1596,1660,1595, +1660,1596,1661, +1597,1661,1596, +1661,1597,1662, +1598,1662,1597, +1662,1598,1663, +1599,1663,1598, +1664,1600,1665, +1601,1665,1600, +1665,1601,1666, +1602,1666,1601, +1666,1602,1667, +1603,1667,1602, +1667,1603,1668, +1604,1668,1603, +1668,1604,1669, +1605,1669,1604, +1669,1605,1670, +1606,1670,1605, +1670,1606,1671, +1607,1671,1606, +1671,1607,1672, +1608,1672,1607, +1672,1608,1673, +1609,1673,1608, +1673,1609,1674, +1610,1674,1609, +1674,1610,1675, +1611,1675,1610, +1675,1611,1676, +1612,1676,1611, +1676,1612,1677, +1613,1677,1612, +1677,1613,1678, +1614,1678,1613, +1678,1614,1679, +1615,1679,1614, +1679,1615,1680, +1616,1680,1615, +1680,1616,1681, +1617,1681,1616, +1681,1617,1682, +1618,1682,1617, +1682,1618,1683, +1619,1683,1618, +1683,1619,1684, +1620,1684,1619, +1684,1620,1685, +1621,1685,1620, +1685,1621,1686, +1622,1686,1621, +1686,1622,1687, +1623,1687,1622, +1687,1623,1688, +1624,1688,1623, +1688,1624,1689, +1625,1689,1624, +1689,1625,1690, +1626,1690,1625, +1690,1626,1691, +1627,1691,1626, +1691,1627,1692, +1628,1692,1627, +1692,1628,1693, +1629,1693,1628, +1693,1629,1694, +1630,1694,1629, +1694,1630,1695, +1631,1695,1630, +1695,1631,1696, +1632,1696,1631, +1696,1632,1697, +1633,1697,1632, +1697,1633,1698, +1634,1698,1633, +1698,1634,1699, +1635,1699,1634, +1699,1635,1700, +1636,1700,1635, +1700,1636,1701, +1637,1701,1636, +1701,1637,1702, +1638,1702,1637, +1702,1638,1703, +1639,1703,1638, +1703,1639,1704, +1640,1704,1639, +1704,1640,1705, +1641,1705,1640, +1705,1641,1706, +1642,1706,1641, +1706,1642,1707, +1643,1707,1642, +1707,1643,1708, +1644,1708,1643, +1708,1644,1709, +1645,1709,1644, +1709,1645,1710, +1646,1710,1645, +1710,1646,1711, +1647,1711,1646, +1711,1647,1712, +1648,1712,1647, +1712,1648,1713, +1649,1713,1648, +1713,1649,1714, +1650,1714,1649, +1714,1650,1715, +1651,1715,1650, +1715,1651,1716, +1652,1716,1651, +1716,1652,1717, +1653,1717,1652, +1717,1653,1718, +1654,1718,1653, +1718,1654,1719, +1655,1719,1654, +1719,1655,1720, +1656,1720,1655, +1720,1656,1721, +1657,1721,1656, +1721,1657,1722, +1658,1722,1657, +1722,1658,1723, +1659,1723,1658, +1723,1659,1724, +1660,1724,1659, +1724,1660,1725, +1661,1725,1660, +1725,1661,1726, +1662,1726,1661, +1726,1662,1727, +1663,1727,1662, +1728,1664,1729, +1665,1729,1664, +1729,1665,1730, +1666,1730,1665, +1730,1666,1731, +1667,1731,1666, +1731,1667,1732, +1668,1732,1667, +1732,1668,1733, +1669,1733,1668, +1733,1669,1734, +1670,1734,1669, +1734,1670,1735, +1671,1735,1670, +1735,1671,1736, +1672,1736,1671, +1736,1672,1737, +1673,1737,1672, +1737,1673,1738, +1674,1738,1673, +1738,1674,1739, +1675,1739,1674, +1739,1675,1740, +1676,1740,1675, +1740,1676,1741, +1677,1741,1676, +1741,1677,1742, +1678,1742,1677, +1742,1678,1743, +1679,1743,1678, +1743,1679,1744, +1680,1744,1679, +1744,1680,1745, +1681,1745,1680, +1745,1681,1746, +1682,1746,1681, +1746,1682,1747, +1683,1747,1682, +1747,1683,1748, +1684,1748,1683, +1748,1684,1749, +1685,1749,1684, +1749,1685,1750, +1686,1750,1685, +1750,1686,1751, +1687,1751,1686, +1751,1687,1752, +1688,1752,1687, +1752,1688,1753, +1689,1753,1688, +1753,1689,1754, +1690,1754,1689, +1754,1690,1755, +1691,1755,1690, +1755,1691,1756, +1692,1756,1691, +1756,1692,1757, +1693,1757,1692, +1757,1693,1758, +1694,1758,1693, +1758,1694,1759, +1695,1759,1694, +1759,1695,1760, +1696,1760,1695, +1760,1696,1761, +1697,1761,1696, +1761,1697,1762, +1698,1762,1697, +1762,1698,1763, +1699,1763,1698, +1763,1699,1764, +1700,1764,1699, +1764,1700,1765, +1701,1765,1700, +1765,1701,1766, +1702,1766,1701, +1766,1702,1767, +1703,1767,1702, +1767,1703,1768, +1704,1768,1703, +1768,1704,1769, +1705,1769,1704, +1769,1705,1770, +1706,1770,1705, +1770,1706,1771, +1707,1771,1706, +1771,1707,1772, +1708,1772,1707, +1772,1708,1773, +1709,1773,1708, +1773,1709,1774, +1710,1774,1709, +1774,1710,1775, +1711,1775,1710, +1775,1711,1776, +1712,1776,1711, +1776,1712,1777, +1713,1777,1712, +1777,1713,1778, +1714,1778,1713, +1778,1714,1779, +1715,1779,1714, +1779,1715,1780, +1716,1780,1715, +1780,1716,1781, +1717,1781,1716, +1781,1717,1782, +1718,1782,1717, +1782,1718,1783, +1719,1783,1718, +1783,1719,1784, +1720,1784,1719, +1784,1720,1785, +1721,1785,1720, +1785,1721,1786, +1722,1786,1721, +1786,1722,1787, +1723,1787,1722, +1787,1723,1788, +1724,1788,1723, +1788,1724,1789, +1725,1789,1724, +1789,1725,1790, +1726,1790,1725, +1790,1726,1791, +1727,1791,1726, +1792,1728,1793, +1729,1793,1728, +1793,1729,1794, +1730,1794,1729, +1794,1730,1795, +1731,1795,1730, +1795,1731,1796, +1732,1796,1731, +1796,1732,1797, +1733,1797,1732, +1797,1733,1798, +1734,1798,1733, +1798,1734,1799, +1735,1799,1734, +1799,1735,1800, +1736,1800,1735, +1800,1736,1801, +1737,1801,1736, +1801,1737,1802, +1738,1802,1737, +1802,1738,1803, +1739,1803,1738, +1803,1739,1804, +1740,1804,1739, +1804,1740,1805, +1741,1805,1740, +1805,1741,1806, +1742,1806,1741, +1806,1742,1807, +1743,1807,1742, +1807,1743,1808, +1744,1808,1743, +1808,1744,1809, +1745,1809,1744, +1809,1745,1810, +1746,1810,1745, +1810,1746,1811, +1747,1811,1746, +1811,1747,1812, +1748,1812,1747, +1812,1748,1813, +1749,1813,1748, +1813,1749,1814, +1750,1814,1749, +1814,1750,1815, +1751,1815,1750, +1815,1751,1816, +1752,1816,1751, +1816,1752,1817, +1753,1817,1752, +1817,1753,1818, +1754,1818,1753, +1818,1754,1819, +1755,1819,1754, +1819,1755,1820, +1756,1820,1755, +1820,1756,1821, +1757,1821,1756, +1821,1757,1822, +1758,1822,1757, +1822,1758,1823, +1759,1823,1758, +1823,1759,1824, +1760,1824,1759, +1824,1760,1825, +1761,1825,1760, +1825,1761,1826, +1762,1826,1761, +1826,1762,1827, +1763,1827,1762, +1827,1763,1828, +1764,1828,1763, +1828,1764,1829, +1765,1829,1764, +1829,1765,1830, +1766,1830,1765, +1830,1766,1831, +1767,1831,1766, +1831,1767,1832, +1768,1832,1767, +1832,1768,1833, +1769,1833,1768, +1833,1769,1834, +1770,1834,1769, +1834,1770,1835, +1771,1835,1770, +1835,1771,1836, +1772,1836,1771, +1836,1772,1837, +1773,1837,1772, +1837,1773,1838, +1774,1838,1773, +1838,1774,1839, +1775,1839,1774, +1839,1775,1840, +1776,1840,1775, +1840,1776,1841, +1777,1841,1776, +1841,1777,1842, +1778,1842,1777, +1842,1778,1843, +1779,1843,1778, +1843,1779,1844, +1780,1844,1779, +1844,1780,1845, +1781,1845,1780, +1845,1781,1846, +1782,1846,1781, +1846,1782,1847, +1783,1847,1782, +1847,1783,1848, +1784,1848,1783, +1848,1784,1849, +1785,1849,1784, +1849,1785,1850, +1786,1850,1785, +1850,1786,1851, +1787,1851,1786, +1851,1787,1852, +1788,1852,1787, +1852,1788,1853, +1789,1853,1788, +1853,1789,1854, +1790,1854,1789, +1854,1790,1855, +1791,1855,1790, +1856,1792,1857, +1793,1857,1792, +1857,1793,1858, +1794,1858,1793, +1858,1794,1859, +1795,1859,1794, +1859,1795,1860, +1796,1860,1795, +1860,1796,1861, +1797,1861,1796, +1861,1797,1862, +1798,1862,1797, +1862,1798,1863, +1799,1863,1798, +1863,1799,1864, +1800,1864,1799, +1864,1800,1865, +1801,1865,1800, +1865,1801,1866, +1802,1866,1801, +1866,1802,1867, +1803,1867,1802, +1867,1803,1868, +1804,1868,1803, +1868,1804,1869, +1805,1869,1804, +1869,1805,1870, +1806,1870,1805, +1870,1806,1871, +1807,1871,1806, +1871,1807,1872, +1808,1872,1807, +1872,1808,1873, +1809,1873,1808, +1873,1809,1874, +1810,1874,1809, +1874,1810,1875, +1811,1875,1810, +1875,1811,1876, +1812,1876,1811, +1876,1812,1877, +1813,1877,1812, +1877,1813,1878, +1814,1878,1813, +1878,1814,1879, +1815,1879,1814, +1879,1815,1880, +1816,1880,1815, +1880,1816,1881, +1817,1881,1816, +1881,1817,1882, +1818,1882,1817, +1882,1818,1883, +1819,1883,1818, +1883,1819,1884, +1820,1884,1819, +1884,1820,1885, +1821,1885,1820, +1885,1821,1886, +1822,1886,1821, +1886,1822,1887, +1823,1887,1822, +1887,1823,1888, +1824,1888,1823, +1888,1824,1889, +1825,1889,1824, +1889,1825,1890, +1826,1890,1825, +1890,1826,1891, +1827,1891,1826, +1891,1827,1892, +1828,1892,1827, +1892,1828,1893, +1829,1893,1828, +1893,1829,1894, +1830,1894,1829, +1894,1830,1895, +1831,1895,1830, +1895,1831,1896, +1832,1896,1831, +1896,1832,1897, +1833,1897,1832, +1897,1833,1898, +1834,1898,1833, +1898,1834,1899, +1835,1899,1834, +1899,1835,1900, +1836,1900,1835, +1900,1836,1901, +1837,1901,1836, +1901,1837,1902, +1838,1902,1837, +1902,1838,1903, +1839,1903,1838, +1903,1839,1904, +1840,1904,1839, +1904,1840,1905, +1841,1905,1840, +1905,1841,1906, +1842,1906,1841, +1906,1842,1907, +1843,1907,1842, +1907,1843,1908, +1844,1908,1843, +1908,1844,1909, +1845,1909,1844, +1909,1845,1910, +1846,1910,1845, +1910,1846,1911, +1847,1911,1846, +1911,1847,1912, +1848,1912,1847, +1912,1848,1913, +1849,1913,1848, +1913,1849,1914, +1850,1914,1849, +1914,1850,1915, +1851,1915,1850, +1915,1851,1916, +1852,1916,1851, +1916,1852,1917, +1853,1917,1852, +1917,1853,1918, +1854,1918,1853, +1918,1854,1919, +1855,1919,1854, +1920,1856,1921, +1857,1921,1856, +1921,1857,1922, +1858,1922,1857, +1922,1858,1923, +1859,1923,1858, +1923,1859,1924, +1860,1924,1859, +1924,1860,1925, +1861,1925,1860, +1925,1861,1926, +1862,1926,1861, +1926,1862,1927, +1863,1927,1862, +1927,1863,1928, +1864,1928,1863, +1928,1864,1929, +1865,1929,1864, +1929,1865,1930, +1866,1930,1865, +1930,1866,1931, +1867,1931,1866, +1931,1867,1932, +1868,1932,1867, +1932,1868,1933, +1869,1933,1868, +1933,1869,1934, +1870,1934,1869, +1934,1870,1935, +1871,1935,1870, +1935,1871,1936, +1872,1936,1871, +1936,1872,1937, +1873,1937,1872, +1937,1873,1938, +1874,1938,1873, +1938,1874,1939, +1875,1939,1874, +1939,1875,1940, +1876,1940,1875, +1940,1876,1941, +1877,1941,1876, +1941,1877,1942, +1878,1942,1877, +1942,1878,1943, +1879,1943,1878, +1943,1879,1944, +1880,1944,1879, +1944,1880,1945, +1881,1945,1880, +1945,1881,1946, +1882,1946,1881, +1946,1882,1947, +1883,1947,1882, +1947,1883,1948, +1884,1948,1883, +1948,1884,1949, +1885,1949,1884, +1949,1885,1950, +1886,1950,1885, +1950,1886,1951, +1887,1951,1886, +1951,1887,1952, +1888,1952,1887, +1952,1888,1953, +1889,1953,1888, +1953,1889,1954, +1890,1954,1889, +1954,1890,1955, +1891,1955,1890, +1955,1891,1956, +1892,1956,1891, +1956,1892,1957, +1893,1957,1892, +1957,1893,1958, +1894,1958,1893, +1958,1894,1959, +1895,1959,1894, +1959,1895,1960, +1896,1960,1895, +1960,1896,1961, +1897,1961,1896, +1961,1897,1962, +1898,1962,1897, +1962,1898,1963, +1899,1963,1898, +1963,1899,1964, +1900,1964,1899, +1964,1900,1965, +1901,1965,1900, +1965,1901,1966, +1902,1966,1901, +1966,1902,1967, +1903,1967,1902, +1967,1903,1968, +1904,1968,1903, +1968,1904,1969, +1905,1969,1904, +1969,1905,1970, +1906,1970,1905, +1970,1906,1971, +1907,1971,1906, +1971,1907,1972, +1908,1972,1907, +1972,1908,1973, +1909,1973,1908, +1973,1909,1974, +1910,1974,1909, +1974,1910,1975, +1911,1975,1910, +1975,1911,1976, +1912,1976,1911, +1976,1912,1977, +1913,1977,1912, +1977,1913,1978, +1914,1978,1913, +1978,1914,1979, +1915,1979,1914, +1979,1915,1980, +1916,1980,1915, +1980,1916,1981, +1917,1981,1916, +1981,1917,1982, +1918,1982,1917, +1982,1918,1983, +1919,1983,1918, +1984,1920,1985, +1921,1985,1920, +1985,1921,1986, +1922,1986,1921, +1986,1922,1987, +1923,1987,1922, +1987,1923,1988, +1924,1988,1923, +1988,1924,1989, +1925,1989,1924, +1989,1925,1990, +1926,1990,1925, +1990,1926,1991, +1927,1991,1926, +1991,1927,1992, +1928,1992,1927, +1992,1928,1993, +1929,1993,1928, +1993,1929,1994, +1930,1994,1929, +1994,1930,1995, +1931,1995,1930, +1995,1931,1996, +1932,1996,1931, +1996,1932,1997, +1933,1997,1932, +1997,1933,1998, +1934,1998,1933, +1998,1934,1999, +1935,1999,1934, +1999,1935,2000, +1936,2000,1935, +2000,1936,2001, +1937,2001,1936, +2001,1937,2002, +1938,2002,1937, +2002,1938,2003, +1939,2003,1938, +2003,1939,2004, +1940,2004,1939, +2004,1940,2005, +1941,2005,1940, +2005,1941,2006, +1942,2006,1941, +2006,1942,2007, +1943,2007,1942, +2007,1943,2008, +1944,2008,1943, +2008,1944,2009, +1945,2009,1944, +2009,1945,2010, +1946,2010,1945, +2010,1946,2011, +1947,2011,1946, +2011,1947,2012, +1948,2012,1947, +2012,1948,2013, +1949,2013,1948, +2013,1949,2014, +1950,2014,1949, +2014,1950,2015, +1951,2015,1950, +2015,1951,2016, +1952,2016,1951, +2016,1952,2017, +1953,2017,1952, +2017,1953,2018, +1954,2018,1953, +2018,1954,2019, +1955,2019,1954, +2019,1955,2020, +1956,2020,1955, +2020,1956,2021, +1957,2021,1956, +2021,1957,2022, +1958,2022,1957, +2022,1958,2023, +1959,2023,1958, +2023,1959,2024, +1960,2024,1959, +2024,1960,2025, +1961,2025,1960, +2025,1961,2026, +1962,2026,1961, +2026,1962,2027, +1963,2027,1962, +2027,1963,2028, +1964,2028,1963, +2028,1964,2029, +1965,2029,1964, +2029,1965,2030, +1966,2030,1965, +2030,1966,2031, +1967,2031,1966, +2031,1967,2032, +1968,2032,1967, +2032,1968,2033, +1969,2033,1968, +2033,1969,2034, +1970,2034,1969, +2034,1970,2035, +1971,2035,1970, +2035,1971,2036, +1972,2036,1971, +2036,1972,2037, +1973,2037,1972, +2037,1973,2038, +1974,2038,1973, +2038,1974,2039, +1975,2039,1974, +2039,1975,2040, +1976,2040,1975, +2040,1976,2041, +1977,2041,1976, +2041,1977,2042, +1978,2042,1977, +2042,1978,2043, +1979,2043,1978, +2043,1979,2044, +1980,2044,1979, +2044,1980,2045, +1981,2045,1980, +2045,1981,2046, +1982,2046,1981, +2046,1982,2047, +1983,2047,1982, +}; + +#define Landscape04VtxCount 2112 +#define Landscape04IdxCount 12096 + +btScalar Landscape04Vtx[] = { +3.90625f,18.9654f,125.0f, +3.90625f,20.0876f,128.906f, +7.8125f,20.5764f,125.0f, +7.8125f,21.0764f,128.906f, +11.7188f,21.5489f,125.0f, +11.7188f,21.4076f,128.906f, +15.625f,22.4963f,125.0f, +15.625f,22.6299f,128.906f, +19.5313f,22.3264f,125.0f, +19.5313f,22.1174f,128.906f, +23.4375f,20.3987f,125.0f, +23.4375f,20.3977f,128.906f, +27.3438f,18.6622f,125.0f, +27.3438f,18.7343f,128.906f, +31.25f,17.4724f,125.0f, +31.25f,17.9144f,128.906f, +35.1563f,16.4832f,125.0f, +35.1563f,17.2941f,128.906f, +39.0625f,15.2653f,125.0f, +39.0625f,16.5386f,128.906f, +42.9688f,14.379f,125.0f, +42.9688f,15.6892f,128.906f, +46.875f,13.9872f,125.0f, +46.875f,14.6414f,128.906f, +50.7813f,14.7002f,125.0f, +50.7813f,14.3505f,128.906f, +54.6875f,15.1119f,125.0f, +54.6875f,14.1604f,128.906f, +58.5938f,14.6638f,125.0f, +58.5938f,14.517f,128.906f, +62.5f,14.668f,125.0f, +62.5f,15.1057f,128.906f, +66.4063f,14.9792f,125.0f, +66.4063f,16.0684f,128.906f, +70.3125f,15.4776f,125.0f, +70.3125f,16.6251f,128.906f, +74.2188f,15.0939f,125.0f, +74.2188f,15.9689f,128.906f, +78.125f,15.5318f,125.0f, +78.125f,16.0234f,128.906f, +82.0313f,16.0777f,125.0f, +82.0313f,16.205f,128.906f, +85.9375f,17.8753f,125.0f, +85.9375f,18.8167f,128.906f, +89.8438f,18.8786f,125.0f, +89.8438f,19.6433f,128.906f, +93.75f,19.8208f,125.0f, +93.75f,20.2916f,128.906f, +97.6563f,23.2578f,125.0f, +97.6563f,23.2308f,128.906f, +101.563f,25.3117f,125.0f, +101.563f,25.882f,128.906f, +105.469f,26.8718f,125.0f, +105.469f,27.5736f,128.906f, +109.375f,28.7414f,125.0f, +109.375f,28.9662f,128.906f, +113.281f,29.9339f,125.0f, +113.281f,30.5702f,128.906f, +117.188f,30.6849f,125.0f, +117.188f,31.8627f,128.906f, +121.094f,32.4202f,125.0f, +121.094f,32.5216f,128.906f, +125.0f,34.7495f,125.0f, +125.0f,34.1918f,128.906f, +128.906f,37.137f,125.0f, +128.906f,37.0161f,128.906f, +132.813f,38.4113f,125.0f, +132.813f,38.5084f,128.906f, +136.719f,38.1788f,125.0f, +136.719f,39.1631f,128.906f, +140.625f,38.7652f,125.0f, +140.625f,39.0529f,128.906f, +144.531f,37.9353f,125.0f, +144.531f,38.9229f,128.906f, +148.438f,38.5681f,125.0f, +148.438f,38.4312f,128.906f, +152.344f,38.6243f,125.0f, +152.344f,39.1086f,128.906f, +156.25f,39.6341f,125.0f, +156.25f,39.7022f,128.906f, +160.156f,39.762f,125.0f, +160.156f,39.3007f,128.906f, +164.063f,38.5385f,125.0f, +164.063f,38.2318f,128.906f, +167.969f,36.3551f,125.0f, +167.969f,36.7493f,128.906f, +171.875f,36.1936f,125.0f, +171.875f,35.9781f,128.906f, +175.781f,35.5636f,125.0f, +175.781f,35.7712f,128.906f, +179.688f,34.6544f,125.0f, +179.688f,35.6247f,128.906f, +183.594f,34.1597f,125.0f, +183.594f,35.4808f,128.906f, +187.5f,33.5567f,125.0f, +187.5f,35.6102f,128.906f, +191.406f,33.0138f,125.0f, +191.406f,34.0305f,128.906f, +195.313f,31.2722f,125.0f, +195.313f,32.0227f,128.906f, +199.219f,29.2529f,125.0f, +199.219f,29.7666f,128.906f, +203.125f,26.9435f,125.0f, +203.125f,27.3968f,128.906f, +207.031f,25.0844f,125.0f, +207.031f,25.1642f,128.906f, +210.938f,23.6605f,125.0f, +210.938f,24.279f,128.906f, +214.844f,22.0745f,125.0f, +214.844f,22.4357f,128.906f, +218.75f,20.3206f,125.0f, +218.75f,21.7754f,128.906f, +222.656f,20.0402f,125.0f, +222.656f,19.6381f,128.906f, +226.563f,20.1162f,125.0f, +226.563f,19.78f,128.906f, +230.469f,20.2399f,125.0f, +230.469f,20.0349f,128.906f, +234.375f,19.6142f,125.0f, +234.375f,19.1534f,128.906f, +238.281f,18.6118f,125.0f, +238.281f,17.863f,128.906f, +242.188f,17.3711f,125.0f, +242.188f,17.658f,128.906f, +246.094f,17.675f,125.0f, +246.094f,16.951f,128.906f, +250.0f,17.3999f,125.0f, +250.0f,16.2961f,128.906f, +3.90625f,18.5327f,121.094f, +7.8125f,19.7267f,121.094f, +11.7188f,20.9891f,121.094f, +15.625f,22.237f,121.094f, +19.5313f,22.3238f,121.094f, +23.4375f,20.1525f,121.094f, +27.3438f,17.9536f,121.094f, +31.25f,17.647f,121.094f, +35.1563f,16.241f,121.094f, +39.0625f,14.6821f,121.094f, +42.9688f,14.4948f,121.094f, +46.875f,15.0351f,121.094f, +50.7813f,15.3893f,121.094f, +54.6875f,15.1531f,121.094f, +58.5938f,14.9284f,121.094f, +62.5f,15.1197f,121.094f, +66.4063f,15.1561f,121.094f, +70.3125f,15.1593f,121.094f, +74.2188f,15.0707f,121.094f, +78.125f,16.0455f,121.094f, +82.0313f,16.6186f,121.094f, +85.9375f,17.4149f,121.094f, +89.8438f,18.746f,121.094f, +93.75f,18.8475f,121.094f, +97.6563f,21.6899f,121.094f, +101.563f,24.567f,121.094f, +105.469f,25.7581f,121.094f, +109.375f,27.437f,121.094f, +113.281f,29.1226f,121.094f, +117.188f,30.137f,121.094f, +121.094f,32.1062f,121.094f, +125.0f,34.674f,121.094f, +128.906f,37.1044f,121.094f, +132.813f,37.8111f,121.094f, +136.719f,37.7901f,121.094f, +140.625f,37.5727f,121.094f, +144.531f,37.1561f,121.094f, +148.438f,38.1976f,121.094f, +152.344f,38.9227f,121.094f, +156.25f,40.3124f,121.094f, +160.156f,40.6867f,121.094f, +164.063f,39.5374f,121.094f, +167.969f,38.019f,121.094f, +171.875f,36.4573f,121.094f, +175.781f,35.2509f,121.094f, +179.688f,34.6709f,121.094f, +183.594f,33.5584f,121.094f, +187.5f,33.2411f,121.094f, +191.406f,31.7588f,121.094f, +195.313f,30.3558f,121.094f, +199.219f,28.879f,121.094f, +203.125f,26.7589f,121.094f, +207.031f,25.0535f,121.094f, +210.938f,23.0477f,121.094f, +214.844f,20.6897f,121.094f, +218.75f,19.3676f,121.094f, +222.656f,19.2985f,121.094f, +226.563f,20.2312f,121.094f, +230.469f,20.317f,121.094f, +234.375f,20.2468f,121.094f, +238.281f,20.3734f,121.094f, +242.188f,18.3676f,121.094f, +246.094f,16.642f,121.094f, +250.0f,17.5995f,121.094f, +3.90625f,18.919f,117.188f, +7.8125f,19.2124f,117.188f, +11.7188f,20.7659f,117.188f, +15.625f,20.5809f,117.188f, +19.5313f,20.3134f,117.188f, +23.4375f,18.6669f,117.188f, +27.3438f,17.5145f,117.188f, +31.25f,17.0813f,117.188f, +35.1563f,15.6789f,117.188f, +39.0625f,14.7581f,117.188f, +42.9688f,14.4424f,117.188f, +46.875f,14.7991f,117.188f, +50.7813f,15.0726f,117.188f, +54.6875f,14.8056f,117.188f, +58.5938f,15.756f,117.188f, +62.5f,16.3024f,117.188f, +66.4063f,16.0449f,117.188f, +70.3125f,15.9115f,117.188f, +74.2188f,16.1633f,117.188f, +78.125f,17.3323f,117.188f, +82.0313f,17.2659f,117.188f, +85.9375f,17.987f,117.188f, +89.8438f,18.3044f,117.188f, +93.75f,18.2665f,117.188f, +97.6563f,19.5364f,117.188f, +101.563f,21.7536f,117.188f, +105.469f,23.6545f,117.188f, +109.375f,25.5212f,117.188f, +113.281f,28.1179f,117.188f, +117.188f,29.5931f,117.188f, +121.094f,31.8126f,117.188f, +125.0f,34.0227f,117.188f, +128.906f,36.3895f,117.188f, +132.813f,37.0423f,117.188f, +136.719f,36.8278f,117.188f, +140.625f,36.2349f,117.188f, +144.531f,36.8825f,117.188f, +148.438f,39.6492f,117.188f, +152.344f,41.6626f,117.188f, +156.25f,42.5091f,117.188f, +160.156f,43.0711f,117.188f, +164.063f,41.7733f,117.188f, +167.969f,40.5985f,117.188f, +171.875f,38.1852f,117.188f, +175.781f,37.023f,117.188f, +179.688f,35.8533f,117.188f, +183.594f,34.5754f,117.188f, +187.5f,33.6585f,117.188f, +191.406f,32.534f,117.188f, +195.313f,31.0632f,117.188f, +199.219f,29.0243f,117.188f, +203.125f,27.0248f,117.188f, +207.031f,25.1597f,117.188f, +210.938f,22.6282f,117.188f, +214.844f,20.6205f,117.188f, +218.75f,19.2556f,117.188f, +222.656f,18.8259f,117.188f, +226.563f,19.2235f,117.188f, +230.469f,20.4441f,117.188f, +234.375f,20.5373f,117.188f, +238.281f,20.3082f,117.188f, +242.188f,19.4397f,117.188f, +246.094f,17.9806f,117.188f, +250.0f,17.3395f,117.188f, +3.90625f,18.3498f,113.281f, +7.8125f,18.7009f,113.281f, +11.7188f,19.3704f,113.281f, +15.625f,19.5203f,113.281f, +19.5313f,18.5704f,113.281f, +23.4375f,17.6697f,113.281f, +27.3438f,16.8001f,113.281f, +31.25f,16.54f,113.281f, +35.1563f,15.8558f,113.281f, +39.0625f,15.1296f,113.281f, +42.9688f,15.8599f,113.281f, +46.875f,16.437f,113.281f, +50.7813f,16.2977f,113.281f, +54.6875f,16.7076f,113.281f, +58.5938f,16.8187f,113.281f, +62.5f,17.1513f,113.281f, +66.4063f,16.5296f,113.281f, +70.3125f,15.8782f,113.281f, +74.2188f,16.614f,113.281f, +78.125f,17.0474f,113.281f, +82.0313f,17.3371f,113.281f, +85.9375f,17.9565f,113.281f, +89.8438f,18.3918f,113.281f, +93.75f,19.0258f,113.281f, +97.6563f,19.2791f,113.281f, +101.563f,20.1533f,113.281f, +105.469f,22.2922f,113.281f, +109.375f,24.6835f,113.281f, +113.281f,25.7755f,113.281f, +117.188f,28.8805f,113.281f, +121.094f,31.2119f,113.281f, +125.0f,33.4657f,113.281f, +128.906f,35.1055f,113.281f, +132.813f,36.4197f,113.281f, +136.719f,37.3017f,113.281f, +140.625f,37.1796f,113.281f, +144.531f,38.2037f,113.281f, +148.438f,41.4383f,113.281f, +152.344f,43.9714f,113.281f, +156.25f,45.0067f,113.281f, +160.156f,45.1491f,113.281f, +164.063f,43.8042f,113.281f, +167.969f,42.5165f,113.281f, +171.875f,40.361f,113.281f, +175.781f,38.3494f,113.281f, +179.688f,37.4529f,113.281f, +183.594f,35.5766f,113.281f, +187.5f,34.2438f,113.281f, +191.406f,32.0218f,113.281f, +195.313f,30.2021f,113.281f, +199.219f,28.8256f,113.281f, +203.125f,27.2081f,113.281f, +207.031f,24.992f,113.281f, +210.938f,22.5332f,113.281f, +214.844f,19.7765f,113.281f, +218.75f,18.5573f,113.281f, +222.656f,18.1469f,113.281f, +226.563f,17.9659f,113.281f, +230.469f,19.2f,113.281f, +234.375f,20.0741f,113.281f, +238.281f,20.1159f,113.281f, +242.188f,19.0382f,113.281f, +246.094f,18.3417f,113.281f, +250.0f,18.7603f,113.281f, +3.90625f,18.0017f,109.375f, +7.8125f,18.1552f,109.375f, +11.7188f,18.2026f,109.375f, +15.625f,18.2042f,109.375f, +19.5313f,17.7806f,109.375f, +23.4375f,17.5378f,109.375f, +27.3438f,16.8627f,109.375f, +31.25f,15.9329f,109.375f, +35.1563f,15.192f,109.375f, +39.0625f,16.0796f,109.375f, +42.9688f,16.1895f,109.375f, +46.875f,15.9774f,109.375f, +50.7813f,16.9529f,109.375f, +54.6875f,17.0901f,109.375f, +58.5938f,17.3722f,109.375f, +62.5f,16.5809f,109.375f, +66.4063f,16.8111f,109.375f, +70.3125f,16.9238f,109.375f, +74.2188f,16.8422f,109.375f, +78.125f,17.0401f,109.375f, +82.0313f,16.8637f,109.375f, +85.9375f,17.4071f,109.375f, +89.8438f,17.944f,109.375f, +93.75f,18.5255f,109.375f, +97.6563f,18.2829f,109.375f, +101.563f,19.0975f,109.375f, +105.469f,20.4292f,109.375f, +109.375f,22.163f,109.375f, +113.281f,25.6773f,109.375f, +117.188f,27.8617f,109.375f, +121.094f,30.6543f,109.375f, +125.0f,33.4226f,109.375f, +128.906f,34.4263f,109.375f, +132.813f,36.8747f,109.375f, +136.719f,37.4551f,109.375f, +140.625f,37.4975f,109.375f, +144.531f,40.0751f,109.375f, +148.438f,42.7524f,109.375f, +152.344f,44.7756f,109.375f, +156.25f,46.1787f,109.375f, +160.156f,46.3753f,109.375f, +164.063f,45.2089f,109.375f, +167.969f,43.7487f,109.375f, +171.875f,41.6365f,109.375f, +175.781f,39.7459f,109.375f, +179.688f,36.9804f,109.375f, +183.594f,35.6688f,109.375f, +187.5f,35.0212f,109.375f, +191.406f,32.4383f,109.375f, +195.313f,29.6046f,109.375f, +199.219f,28.1822f,109.375f, +203.125f,26.2444f,109.375f, +207.031f,24.1442f,109.375f, +210.938f,22.1072f,109.375f, +214.844f,20.0401f,109.375f, +218.75f,18.0663f,109.375f, +222.656f,16.866f,109.375f, +226.563f,16.9372f,109.375f, +230.469f,16.9853f,109.375f, +234.375f,17.6761f,109.375f, +238.281f,18.3669f,109.375f, +242.188f,18.4156f,109.375f, +246.094f,18.2171f,109.375f, +250.0f,18.5941f,109.375f, +3.90625f,17.9608f,105.469f, +7.8125f,18.4369f,105.469f, +11.7188f,18.4406f,105.469f, +15.625f,17.8685f,105.469f, +19.5313f,17.7519f,105.469f, +23.4375f,17.5734f,105.469f, +27.3438f,16.3397f,105.469f, +31.25f,15.8618f,105.469f, +35.1563f,16.1194f,105.469f, +39.0625f,16.889f,105.469f, +42.9688f,16.2804f,105.469f, +46.875f,15.8474f,105.469f, +50.7813f,16.2892f,105.469f, +54.6875f,16.2854f,105.469f, +58.5938f,16.7368f,105.469f, +62.5f,17.4055f,105.469f, +66.4063f,16.8808f,105.469f, +70.3125f,17.3183f,105.469f, +74.2188f,17.7166f,105.469f, +78.125f,17.0657f,105.469f, +82.0313f,16.7305f,105.469f, +85.9375f,16.3929f,105.469f, +89.8438f,16.6475f,105.469f, +93.75f,17.7645f,105.469f, +97.6563f,18.4212f,105.469f, +101.563f,18.4107f,105.469f, +105.469f,19.3751f,105.469f, +109.375f,21.843f,105.469f, +113.281f,25.0143f,105.469f, +117.188f,26.9168f,105.469f, +121.094f,29.8403f,105.469f, +125.0f,32.4937f,105.469f, +128.906f,34.4076f,105.469f, +132.813f,35.2497f,105.469f, +136.719f,36.4785f,105.469f, +140.625f,37.7983f,105.469f, +144.531f,40.5712f,105.469f, +148.438f,43.3698f,105.469f, +152.344f,45.784f,105.469f, +156.25f,46.9835f,105.469f, +160.156f,47.2774f,105.469f, +164.063f,46.7695f,105.469f, +167.969f,45.0199f,105.469f, +171.875f,42.588f,105.469f, +175.781f,39.988f,105.469f, +179.688f,38.0653f,105.469f, +183.594f,37.5754f,105.469f, +187.5f,35.6316f,105.469f, +191.406f,32.4143f,105.469f, +195.313f,29.5342f,105.469f, +199.219f,27.2795f,105.469f, +203.125f,26.065f,105.469f, +207.031f,24.8633f,105.469f, +210.938f,23.0216f,105.469f, +214.844f,21.1684f,105.469f, +218.75f,18.9315f,105.469f, +222.656f,17.7013f,105.469f, +226.563f,16.9466f,105.469f, +230.469f,17.1437f,105.469f, +234.375f,17.6691f,105.469f, +238.281f,17.9243f,105.469f, +242.188f,18.0005f,105.469f, +246.094f,18.6179f,105.469f, +250.0f,19.2165f,105.469f, +3.90625f,17.7074f,101.563f, +7.8125f,18.411f,101.563f, +11.7188f,17.9916f,101.563f, +15.625f,18.5349f,101.563f, +19.5313f,18.6607f,101.563f, +23.4375f,17.406f,101.563f, +27.3438f,17.2356f,101.563f, +31.25f,17.0395f,101.563f, +35.1563f,17.9903f,101.563f, +39.0625f,18.2603f,101.563f, +42.9688f,17.9037f,101.563f, +46.875f,17.2358f,101.563f, +50.7813f,16.1089f,101.563f, +54.6875f,16.6043f,101.563f, +58.5938f,16.5656f,101.563f, +62.5f,16.8655f,101.563f, +66.4063f,17.0123f,101.563f, +70.3125f,17.4985f,101.563f, +74.2188f,18.0195f,101.563f, +78.125f,17.3417f,101.563f, +82.0313f,16.8477f,101.563f, +85.9375f,15.4602f,101.563f, +89.8438f,15.6001f,101.563f, +93.75f,16.8889f,101.563f, +97.6563f,17.2944f,101.563f, +101.563f,17.3431f,101.563f, +105.469f,18.2306f,101.563f, +109.375f,20.5556f,101.563f, +113.281f,22.5598f,101.563f, +117.188f,25.0997f,101.563f, +121.094f,28.2048f,101.563f, +125.0f,30.46f,101.563f, +128.906f,32.5729f,101.563f, +132.813f,34.5568f,101.563f, +136.719f,36.463f,101.563f, +140.625f,37.8259f,101.563f, +144.531f,40.4357f,101.563f, +148.438f,43.6544f,101.563f, +152.344f,46.204f,101.563f, +156.25f,47.3874f,101.563f, +160.156f,47.5222f,101.563f, +164.063f,46.8312f,101.563f, +167.969f,44.5065f,101.563f, +171.875f,43.7648f,101.563f, +175.781f,41.9789f,101.563f, +179.688f,40.785f,101.563f, +183.594f,38.7639f,101.563f, +187.5f,36.1589f,101.563f, +191.406f,33.4197f,101.563f, +195.313f,29.7568f,101.563f, +199.219f,27.2343f,101.563f, +203.125f,26.3845f,101.563f, +207.031f,25.3149f,101.563f, +210.938f,23.4896f,101.563f, +214.844f,22.229f,101.563f, +218.75f,20.0014f,101.563f, +222.656f,19.0955f,101.563f, +226.563f,17.971f,101.563f, +230.469f,16.9303f,101.563f, +234.375f,17.3619f,101.563f, +238.281f,17.0337f,101.563f, +242.188f,17.1424f,101.563f, +246.094f,18.334f,101.563f, +250.0f,19.2744f,101.563f, +3.90625f,18.0176f,97.6563f, +7.8125f,18.1916f,97.6563f, +11.7188f,17.72f,97.6563f, +15.625f,18.3444f,97.6563f, +19.5313f,18.7102f,97.6563f, +23.4375f,17.4143f,97.6563f, +27.3438f,18.0085f,97.6563f, +31.25f,18.4924f,97.6563f, +35.1563f,19.4324f,97.6563f, +39.0625f,19.7998f,97.6563f, +42.9688f,19.5444f,97.6563f, +46.875f,19.5513f,97.6563f, +50.7813f,17.9397f,97.6563f, +54.6875f,16.6383f,97.6563f, +58.5938f,16.0619f,97.6563f, +62.5f,16.7402f,97.6563f, +66.4063f,16.955f,97.6563f, +70.3125f,17.5912f,97.6563f, +74.2188f,17.1181f,97.6563f, +78.125f,16.9063f,97.6563f, +82.0313f,16.3988f,97.6563f, +85.9375f,15.935f,97.6563f, +89.8438f,16.0664f,97.6563f, +93.75f,16.1926f,97.6563f, +97.6563f,16.5004f,97.6563f, +101.563f,17.1185f,97.6563f, +105.469f,17.2859f,97.6563f, +109.375f,19.0026f,97.6563f, +113.281f,21.0018f,97.6563f, +117.188f,23.6336f,97.6563f, +121.094f,26.4831f,97.6563f, +125.0f,29.3075f,97.6563f, +128.906f,32.5702f,97.6563f, +132.813f,34.5711f,97.6563f, +136.719f,36.1666f,97.6563f, +140.625f,37.5909f,97.6563f, +144.531f,40.3232f,97.6563f, +148.438f,42.661f,97.6563f, +152.344f,45.5604f,97.6563f, +156.25f,47.6984f,97.6563f, +160.156f,47.4129f,97.6563f, +164.063f,47.1564f,97.6563f, +167.969f,45.3058f,97.6563f, +171.875f,44.8069f,97.6563f, +175.781f,43.6847f,97.6563f, +179.688f,41.6831f,97.6563f, +183.594f,39.4072f,97.6563f, +187.5f,36.6118f,97.6563f, +191.406f,33.396f,97.6563f, +195.313f,29.9372f,97.6563f, +199.219f,28.0616f,97.6563f, +203.125f,27.3957f,97.6563f, +207.031f,25.6934f,97.6563f, +210.938f,24.4412f,97.6563f, +214.844f,23.2356f,97.6563f, +218.75f,21.445f,97.6563f, +222.656f,19.5412f,97.6563f, +226.563f,18.4898f,97.6563f, +230.469f,17.727f,97.6563f, +234.375f,16.5139f,97.6563f, +238.281f,16.2579f,97.6563f, +242.188f,16.1539f,97.6563f, +246.094f,17.0856f,97.6563f, +250.0f,18.5151f,97.6563f, +3.90625f,17.1671f,93.75f, +7.8125f,16.817f,93.75f, +11.7188f,17.5293f,93.75f, +15.625f,18.7701f,93.75f, +19.5313f,18.3362f,93.75f, +23.4375f,19.0869f,93.75f, +27.3438f,19.7557f,93.75f, +31.25f,20.0113f,93.75f, +35.1563f,20.3441f,93.75f, +39.0625f,21.4434f,93.75f, +42.9688f,21.6008f,93.75f, +46.875f,21.5423f,93.75f, +50.7813f,20.7592f,93.75f, +54.6875f,18.9207f,93.75f, +58.5938f,17.6772f,93.75f, +62.5f,17.5409f,93.75f, +66.4063f,17.599f,93.75f, +70.3125f,18.2626f,93.75f, +74.2188f,18.4046f,93.75f, +78.125f,18.215f,93.75f, +82.0313f,18.4743f,93.75f, +85.9375f,17.6579f,93.75f, +89.8438f,17.732f,93.75f, +93.75f,18.4172f,93.75f, +97.6563f,19.0439f,93.75f, +101.563f,19.7437f,93.75f, +105.469f,19.8588f,93.75f, +109.375f,19.7414f,93.75f, +113.281f,21.4756f,93.75f, +117.188f,24.1862f,93.75f, +121.094f,26.8351f,93.75f, +125.0f,29.9621f,93.75f, +128.906f,32.8267f,93.75f, +132.813f,34.6779f,93.75f, +136.719f,36.0083f,93.75f, +140.625f,36.9812f,93.75f, +144.531f,39.6087f,93.75f, +148.438f,42.2269f,93.75f, +152.344f,44.492f,93.75f, +156.25f,47.1767f,93.75f, +160.156f,47.5667f,93.75f, +164.063f,46.9625f,93.75f, +167.969f,45.6865f,93.75f, +171.875f,45.7668f,93.75f, +175.781f,44.8303f,93.75f, +179.688f,42.5904f,93.75f, +183.594f,40.3536f,93.75f, +187.5f,37.9498f,93.75f, +191.406f,35.1415f,93.75f, +195.313f,31.5011f,93.75f, +199.219f,29.695f,93.75f, +203.125f,27.7988f,93.75f, +207.031f,26.3522f,93.75f, +210.938f,25.8544f,93.75f, +214.844f,24.7269f,93.75f, +218.75f,23.7697f,93.75f, +222.656f,20.9249f,93.75f, +226.563f,19.1368f,93.75f, +230.469f,18.5704f,93.75f, +234.375f,17.554f,93.75f, +238.281f,14.9004f,93.75f, +242.188f,16.3253f,93.75f, +246.094f,16.0037f,93.75f, +250.0f,15.9921f,93.75f, +3.90625f,15.6427f,89.8438f, +7.8125f,16.2722f,89.8438f, +11.7188f,17.6471f,89.8438f, +15.625f,18.8565f,89.8438f, +19.5313f,19.651f,89.8438f, +23.4375f,20.9243f,89.8438f, +27.3438f,20.8045f,89.8438f, +31.25f,20.2274f,89.8438f, +35.1563f,21.5768f,89.8438f, +39.0625f,22.566f,89.8438f, +42.9688f,23.4111f,89.8438f, +46.875f,23.5063f,89.8438f, +50.7813f,22.9631f,89.8438f, +54.6875f,21.5642f,89.8438f, +58.5938f,20.3649f,89.8438f, +62.5f,19.6177f,89.8438f, +66.4063f,18.6758f,89.8438f, +70.3125f,18.6837f,89.8438f, +74.2188f,19.7593f,89.8438f, +78.125f,20.4356f,89.8438f, +82.0313f,20.1806f,89.8438f, +85.9375f,19.4513f,89.8438f, +89.8438f,19.2942f,89.8438f, +93.75f,19.9864f,89.8438f, +97.6563f,20.6569f,89.8438f, +101.563f,20.8985f,89.8438f, +105.469f,20.8027f,89.8438f, +109.375f,21.5099f,89.8438f, +113.281f,22.7491f,89.8438f, +117.188f,24.1938f,89.8438f, +121.094f,27.3472f,89.8438f, +125.0f,29.9546f,89.8438f, +128.906f,32.3821f,89.8438f, +132.813f,34.2078f,89.8438f, +136.719f,35.7419f,89.8438f, +140.625f,36.6408f,89.8438f, +144.531f,39.1756f,89.8438f, +148.438f,42.1721f,89.8438f, +152.344f,43.7891f,89.8438f, +156.25f,45.9566f,89.8438f, +160.156f,47.5521f,89.8438f, +164.063f,47.0165f,89.8438f, +167.969f,46.0084f,89.8438f, +171.875f,46.0374f,89.8438f, +175.781f,45.9301f,89.8438f, +179.688f,43.5326f,89.8438f, +183.594f,40.5203f,89.8438f, +187.5f,38.133f,89.8438f, +191.406f,35.8688f,89.8438f, +195.313f,33.0648f,89.8438f, +199.219f,31.0451f,89.8438f, +203.125f,27.691f,89.8438f, +207.031f,26.7927f,89.8438f, +210.938f,26.334f,89.8438f, +214.844f,25.0669f,89.8438f, +218.75f,23.4149f,89.8438f, +222.656f,20.9786f,89.8438f, +226.563f,18.963f,89.8438f, +230.469f,18.7894f,89.8438f, +234.375f,17.2683f,89.8438f, +238.281f,14.98f,89.8438f, +242.188f,15.4163f,89.8438f, +246.094f,15.4238f,89.8438f, +250.0f,15.9208f,89.8438f, +3.90625f,15.5916f,85.9375f, +7.8125f,16.3916f,85.9375f, +11.7188f,18.2047f,85.9375f, +15.625f,19.1861f,85.9375f, +19.5313f,20.7525f,85.9375f, +23.4375f,21.6364f,85.9375f, +27.3438f,21.9262f,85.9375f, +31.25f,21.6225f,85.9375f, +35.1563f,22.4806f,85.9375f, +39.0625f,23.7973f,85.9375f, +42.9688f,24.6135f,85.9375f, +46.875f,24.8421f,85.9375f, +50.7813f,24.5451f,85.9375f, +54.6875f,23.688f,85.9375f, +58.5938f,22.221f,85.9375f, +62.5f,21.5009f,85.9375f, +66.4063f,21.2241f,85.9375f, +70.3125f,20.2058f,85.9375f, +74.2188f,20.3437f,85.9375f, +78.125f,21.8786f,85.9375f, +82.0313f,21.9425f,85.9375f, +85.9375f,20.6496f,85.9375f, +89.8438f,20.6855f,85.9375f, +93.75f,20.6495f,85.9375f, +97.6563f,21.0738f,85.9375f, +101.563f,21.7991f,85.9375f, +105.469f,22.3795f,85.9375f, +109.375f,22.4292f,85.9375f, +113.281f,23.6451f,85.9375f, +117.188f,24.8457f,85.9375f, +121.094f,26.7121f,85.9375f, +125.0f,29.2236f,85.9375f, +128.906f,31.5942f,85.9375f, +132.813f,33.8517f,85.9375f, +136.719f,35.7145f,85.9375f, +140.625f,36.6808f,85.9375f, +144.531f,38.8926f,85.9375f, +148.438f,41.6484f,85.9375f, +152.344f,44.2035f,85.9375f, +156.25f,45.1997f,85.9375f, +160.156f,46.1921f,85.9375f, +164.063f,47.2097f,85.9375f, +167.969f,47.0691f,85.9375f, +171.875f,45.5257f,85.9375f, +175.781f,44.6746f,85.9375f, +179.688f,43.6223f,85.9375f, +183.594f,40.2395f,85.9375f, +187.5f,38.445f,85.9375f, +191.406f,36.5002f,85.9375f, +195.313f,33.7977f,85.9375f, +199.219f,31.5943f,85.9375f, +203.125f,28.8305f,85.9375f, +207.031f,27.4922f,85.9375f, +210.938f,26.0386f,85.9375f, +214.844f,24.1792f,85.9375f, +218.75f,22.1567f,85.9375f, +222.656f,20.1169f,85.9375f, +226.563f,19.3603f,85.9375f, +230.469f,17.7703f,85.9375f, +234.375f,16.3147f,85.9375f, +238.281f,15.0886f,85.9375f, +242.188f,15.1332f,85.9375f, +246.094f,14.7802f,85.9375f, +250.0f,15.2259f,85.9375f, +3.90625f,16.9644f,82.0313f, +7.8125f,17.8f,82.0313f, +11.7188f,19.2943f,82.0313f, +15.625f,21.0269f,82.0313f, +19.5313f,22.3312f,82.0313f, +23.4375f,23.0871f,82.0313f, +27.3438f,23.1115f,82.0313f, +31.25f,23.5304f,82.0313f, +35.1563f,24.1493f,82.0313f, +39.0625f,25.0848f,82.0313f, +42.9688f,26.0789f,82.0313f, +46.875f,26.3399f,82.0313f, +50.7813f,25.4397f,82.0313f, +54.6875f,24.894f,82.0313f, +58.5938f,24.1026f,82.0313f, +62.5f,24.0749f,82.0313f, +66.4063f,23.5256f,82.0313f, +70.3125f,21.9612f,82.0313f, +74.2188f,21.932f,82.0313f, +78.125f,22.6241f,82.0313f, +82.0313f,22.672f,82.0313f, +85.9375f,21.4303f,82.0313f, +89.8438f,21.6964f,82.0313f, +93.75f,21.7198f,82.0313f, +97.6563f,22.4953f,82.0313f, +101.563f,23.0451f,82.0313f, +105.469f,23.0285f,82.0313f, +109.375f,23.24f,82.0313f, +113.281f,23.6861f,82.0313f, +117.188f,24.7685f,82.0313f, +121.094f,26.4466f,82.0313f, +125.0f,28.8315f,82.0313f, +128.906f,30.9624f,82.0313f, +132.813f,33.7991f,82.0313f, +136.719f,35.8079f,82.0313f, +140.625f,37.0254f,82.0313f, +144.531f,38.7479f,82.0313f, +148.438f,42.0473f,82.0313f, +152.344f,43.7879f,82.0313f, +156.25f,45.1826f,82.0313f, +160.156f,46.2454f,82.0313f, +164.063f,47.0196f,82.0313f, +167.969f,47.2872f,82.0313f, +171.875f,46.2496f,82.0313f, +175.781f,44.3338f,82.0313f, +179.688f,43.1095f,82.0313f, +183.594f,40.7857f,82.0313f, +187.5f,39.646f,82.0313f, +191.406f,37.5425f,82.0313f, +195.313f,35.2951f,82.0313f, +199.219f,33.6324f,82.0313f, +203.125f,30.8911f,82.0313f, +207.031f,27.2798f,82.0313f, +210.938f,25.4308f,82.0313f, +214.844f,23.8814f,82.0313f, +218.75f,22.4441f,82.0313f, +222.656f,20.3771f,82.0313f, +226.563f,19.2073f,82.0313f, +230.469f,19.0082f,82.0313f, +234.375f,17.769f,82.0313f, +238.281f,15.8302f,82.0313f, +242.188f,14.2967f,82.0313f, +246.094f,15.1365f,82.0313f, +250.0f,14.9159f,82.0313f, +3.90625f,18.8244f,78.125f, +7.8125f,19.5283f,78.125f, +11.7188f,20.9466f,78.125f, +15.625f,22.0951f,78.125f, +19.5313f,23.2483f,78.125f, +23.4375f,23.8238f,78.125f, +27.3438f,24.6236f,78.125f, +31.25f,24.0856f,78.125f, +35.1563f,25.6129f,78.125f, +39.0625f,26.8525f,78.125f, +42.9688f,26.9859f,78.125f, +46.875f,26.6403f,78.125f, +50.7813f,26.6419f,78.125f, +54.6875f,27.4236f,78.125f, +58.5938f,26.5989f,78.125f, +62.5f,26.137f,78.125f, +66.4063f,24.8717f,78.125f, +70.3125f,23.8694f,78.125f, +74.2188f,23.2668f,78.125f, +78.125f,23.1081f,78.125f, +82.0313f,23.3134f,78.125f, +85.9375f,23.0903f,78.125f, +89.8438f,23.2822f,78.125f, +93.75f,24.291f,78.125f, +97.6563f,24.5546f,78.125f, +101.563f,24.4216f,78.125f, +105.469f,24.6379f,78.125f, +109.375f,24.5235f,78.125f, +113.281f,24.88f,78.125f, +117.188f,25.6988f,78.125f, +121.094f,26.9155f,78.125f, +125.0f,29.7499f,78.125f, +128.906f,31.361f,78.125f, +132.813f,33.9367f,78.125f, +136.719f,35.4066f,78.125f, +140.625f,36.6153f,78.125f, +144.531f,38.6091f,78.125f, +148.438f,41.2276f,78.125f, +152.344f,43.2187f,78.125f, +156.25f,45.2494f,78.125f, +160.156f,46.5334f,78.125f, +164.063f,47.1659f,78.125f, +167.969f,47.5409f,78.125f, +171.875f,46.3778f,78.125f, +175.781f,44.8935f,78.125f, +179.688f,43.7429f,78.125f, +183.594f,42.4748f,78.125f, +187.5f,40.5234f,78.125f, +191.406f,38.2806f,78.125f, +195.313f,36.297f,78.125f, +199.219f,35.0641f,78.125f, +203.125f,32.4145f,78.125f, +207.031f,29.4539f,78.125f, +210.938f,25.7399f,78.125f, +214.844f,23.157f,78.125f, +218.75f,20.9425f,78.125f, +222.656f,19.2349f,78.125f, +226.563f,18.5576f,78.125f, +230.469f,18.8407f,78.125f, +234.375f,17.6562f,78.125f, +238.281f,15.7207f,78.125f, +242.188f,14.3385f,78.125f, +246.094f,13.9958f,78.125f, +250.0f,14.6888f,78.125f, +3.90625f,20.6829f,74.2188f, +7.8125f,22.7393f,74.2188f, +11.7188f,22.9007f,74.2188f, +15.625f,23.3717f,74.2188f, +19.5313f,23.7991f,74.2188f, +23.4375f,24.5576f,74.2188f, +27.3438f,25.3464f,74.2188f, +31.25f,25.8349f,74.2188f, +35.1563f,26.2326f,74.2188f, +39.0625f,27.8003f,74.2188f, +42.9688f,28.502f,74.2188f, +46.875f,28.7947f,74.2188f, +50.7813f,29.109f,74.2188f, +54.6875f,29.4315f,74.2188f, +58.5938f,29.1948f,74.2188f, +62.5f,28.241f,74.2188f, +66.4063f,26.6727f,74.2188f, +70.3125f,25.5496f,74.2188f, +74.2188f,24.2265f,74.2188f, +78.125f,24.8641f,74.2188f, +82.0313f,24.8692f,74.2188f, +85.9375f,23.8066f,74.2188f, +89.8438f,24.5827f,74.2188f, +93.75f,25.5885f,74.2188f, +97.6563f,25.005f,74.2188f, +101.563f,25.4768f,74.2188f, +105.469f,25.8326f,74.2188f, +109.375f,25.8587f,74.2188f, +113.281f,26.8029f,74.2188f, +117.188f,27.8764f,74.2188f, +121.094f,28.8835f,74.2188f, +125.0f,30.0077f,74.2188f, +128.906f,31.9776f,74.2188f, +132.813f,34.2008f,74.2188f, +136.719f,35.4023f,74.2188f, +140.625f,36.3754f,74.2188f, +144.531f,38.9991f,74.2188f, +148.438f,41.295f,74.2188f, +152.344f,44.1131f,74.2188f, +156.25f,46.2221f,74.2188f, +160.156f,46.7797f,74.2188f, +164.063f,47.446f,74.2188f, +167.969f,47.1396f,74.2188f, +171.875f,45.9937f,74.2188f, +175.781f,45.4284f,74.2188f, +179.688f,45.018f,74.2188f, +183.594f,43.1233f,74.2188f, +187.5f,41.2272f,74.2188f, +191.406f,37.8072f,74.2188f, +195.313f,36.5304f,74.2188f, +199.219f,35.1638f,74.2188f, +203.125f,33.1538f,74.2188f, +207.031f,30.2207f,74.2188f, +210.938f,26.1665f,74.2188f, +214.844f,22.1619f,74.2188f, +218.75f,18.452f,74.2188f, +222.656f,17.0925f,74.2188f, +226.563f,17.3468f,74.2188f, +230.469f,16.447f,74.2188f, +234.375f,15.7197f,74.2188f, +238.281f,14.7889f,74.2188f, +242.188f,13.641f,74.2188f, +246.094f,12.7728f,74.2188f, +250.0f,13.3875f,74.2188f, +3.90625f,22.948f,70.3125f, +7.8125f,24.3431f,70.3125f, +11.7188f,24.6307f,70.3125f, +15.625f,24.9963f,70.3125f, +19.5313f,25.2034f,70.3125f, +23.4375f,25.2791f,70.3125f, +27.3438f,25.8257f,70.3125f, +31.25f,27.1123f,70.3125f, +35.1563f,27.8795f,70.3125f, +39.0625f,28.8437f,70.3125f, +42.9688f,29.8883f,70.3125f, +46.875f,30.6548f,70.3125f, +50.7813f,31.0396f,70.3125f, +54.6875f,31.6324f,70.3125f, +58.5938f,31.5222f,70.3125f, +62.5f,30.4696f,70.3125f, +66.4063f,28.7208f,70.3125f, +70.3125f,26.8611f,70.3125f, +74.2188f,25.6776f,70.3125f, +78.125f,26.1193f,70.3125f, +82.0313f,25.1971f,70.3125f, +85.9375f,24.4814f,70.3125f, +89.8438f,25.1213f,70.3125f, +93.75f,26.1411f,70.3125f, +97.6563f,26.4276f,70.3125f, +101.563f,26.0728f,70.3125f, +105.469f,26.113f,70.3125f, +109.375f,27.5702f,70.3125f, +113.281f,28.6199f,70.3125f, +117.188f,30.054f,70.3125f, +121.094f,30.255f,70.3125f, +125.0f,30.9839f,70.3125f, +128.906f,32.4045f,70.3125f, +132.813f,33.9858f,70.3125f, +136.719f,35.8568f,70.3125f, +140.625f,37.5803f,70.3125f, +144.531f,40.2984f,70.3125f, +148.438f,41.9326f,70.3125f, +152.344f,44.1607f,70.3125f, +156.25f,45.6454f,70.3125f, +160.156f,47.3567f,70.3125f, +164.063f,48.1147f,70.3125f, +167.969f,47.7671f,70.3125f, +171.875f,46.1009f,70.3125f, +175.781f,45.3829f,70.3125f, +179.688f,44.3458f,70.3125f, +183.594f,42.818f,70.3125f, +187.5f,40.5253f,70.3125f, +191.406f,37.6731f,70.3125f, +195.313f,36.7234f,70.3125f, +199.219f,35.0848f,70.3125f, +203.125f,33.0857f,70.3125f, +207.031f,30.0508f,70.3125f, +210.938f,26.741f,70.3125f, +214.844f,22.7613f,70.3125f, +218.75f,18.5375f,70.3125f, +222.656f,15.6052f,70.3125f, +226.563f,14.6945f,70.3125f, +230.469f,15.0013f,70.3125f, +234.375f,13.9965f,70.3125f, +238.281f,12.4404f,70.3125f, +242.188f,12.4448f,70.3125f, +246.094f,11.7446f,70.3125f, +250.0f,11.7886f,70.3125f, +3.90625f,25.5564f,66.4063f, +7.8125f,26.1216f,66.4063f, +11.7188f,26.234f,66.4063f, +15.625f,26.4553f,66.4063f, +19.5313f,26.9827f,66.4063f, +23.4375f,27.0173f,66.4063f, +27.3438f,27.3577f,66.4063f, +31.25f,28.895f,66.4063f, +35.1563f,30.1057f,66.4063f, +39.0625f,30.249f,66.4063f, +42.9688f,31.1394f,66.4063f, +46.875f,31.7197f,66.4063f, +50.7813f,33.2905f,66.4063f, +54.6875f,33.6208f,66.4063f, +58.5938f,33.5152f,66.4063f, +62.5f,31.5128f,66.4063f, +66.4063f,30.1049f,66.4063f, +70.3125f,28.9139f,66.4063f, +74.2188f,27.093f,66.4063f, +78.125f,26.8272f,66.4063f, +82.0313f,25.8777f,66.4063f, +85.9375f,25.2597f,66.4063f, +89.8438f,25.8742f,66.4063f, +93.75f,27.4783f,66.4063f, +97.6563f,27.1897f,66.4063f, +101.563f,26.8406f,66.4063f, +105.469f,27.2889f,66.4063f, +109.375f,28.6616f,66.4063f, +113.281f,29.2852f,66.4063f, +117.188f,30.3362f,66.4063f, +121.094f,32.0648f,66.4063f, +125.0f,32.6693f,66.4063f, +128.906f,33.7239f,66.4063f, +132.813f,34.8193f,66.4063f, +136.719f,36.6878f,66.4063f, +140.625f,38.5422f,66.4063f, +144.531f,40.5193f,66.4063f, +148.438f,42.0434f,66.4063f, +152.344f,43.692f,66.4063f, +156.25f,46.2f,66.4063f, +160.156f,47.7247f,66.4063f, +164.063f,48.3486f,66.4063f, +167.969f,48.4057f,66.4063f, +171.875f,47.4141f,66.4063f, +175.781f,45.925f,66.4063f, +179.688f,44.0772f,66.4063f, +183.594f,42.0866f,66.4063f, +187.5f,40.2687f,66.4063f, +191.406f,38.0236f,66.4063f, +195.313f,36.9223f,66.4063f, +199.219f,35.6323f,66.4063f, +203.125f,33.0001f,66.4063f, +207.031f,30.1425f,66.4063f, +210.938f,26.4551f,66.4063f, +214.844f,22.4224f,66.4063f, +218.75f,18.5557f,66.4063f, +222.656f,16.1428f,66.4063f, +226.563f,14.9942f,66.4063f, +230.469f,14.9221f,66.4063f, +234.375f,13.3816f,66.4063f, +238.281f,10.9914f,66.4063f, +242.188f,10.6094f,66.4063f, +246.094f,9.77905f,66.4063f, +250.0f,9.99853f,66.4063f, +3.90625f,27.1929f,62.5f, +7.8125f,28.1411f,62.5f, +11.7188f,27.9312f,62.5f, +15.625f,27.692f,62.5f, +19.5313f,27.8511f,62.5f, +23.4375f,28.2162f,62.5f, +27.3438f,29.5518f,62.5f, +31.25f,30.2367f,62.5f, +35.1563f,31.1075f,62.5f, +39.0625f,31.6239f,62.5f, +42.9688f,32.8498f,62.5f, +46.875f,33.1521f,62.5f, +50.7813f,34.6411f,62.5f, +54.6875f,35.0063f,62.5f, +58.5938f,33.8006f,62.5f, +62.5f,33.1029f,62.5f, +66.4063f,32.1466f,62.5f, +70.3125f,30.2614f,62.5f, +74.2188f,28.2978f,62.5f, +78.125f,28.0764f,62.5f, +82.0313f,27.2473f,62.5f, +85.9375f,26.2769f,62.5f, +89.8438f,26.2922f,62.5f, +93.75f,27.1235f,62.5f, +97.6563f,27.498f,62.5f, +101.563f,27.2257f,62.5f, +105.469f,28.2897f,62.5f, +109.375f,28.8921f,62.5f, +113.281f,30.563f,62.5f, +117.188f,32.1298f,62.5f, +121.094f,32.8639f,62.5f, +125.0f,34.6537f,62.5f, +128.906f,35.4867f,62.5f, +132.813f,36.6181f,62.5f, +136.719f,37.6418f,62.5f, +140.625f,39.2228f,62.5f, +144.531f,40.5105f,62.5f, +148.438f,42.215f,62.5f, +152.344f,43.5394f,62.5f, +156.25f,45.1171f,62.5f, +160.156f,46.6711f,62.5f, +164.063f,47.4274f,62.5f, +167.969f,47.6821f,62.5f, +171.875f,48.0762f,62.5f, +175.781f,46.4607f,62.5f, +179.688f,44.7623f,62.5f, +183.594f,42.6372f,62.5f, +187.5f,40.3231f,62.5f, +191.406f,38.4371f,62.5f, +195.313f,36.1978f,62.5f, +199.219f,35.38f,62.5f, +203.125f,32.0325f,62.5f, +207.031f,29.2047f,62.5f, +210.938f,27.481f,62.5f, +214.844f,24.0627f,62.5f, +218.75f,20.6235f,62.5f, +222.656f,18.5468f,62.5f, +226.563f,17.2736f,62.5f, +230.469f,15.4125f,62.5f, +234.375f,13.6775f,62.5f, +238.281f,11.4407f,62.5f, +242.188f,9.73154f,62.5f, +246.094f,8.55197f,62.5f, +250.0f,8.43693f,62.5f, +3.90625f,28.3495f,58.5938f, +7.8125f,28.8832f,58.5938f, +11.7188f,28.5512f,58.5938f, +15.625f,28.8533f,58.5938f, +19.5313f,29.0576f,58.5938f, +23.4375f,30.3079f,58.5938f, +27.3438f,31.3861f,58.5938f, +31.25f,33.0252f,58.5938f, +35.1563f,33.4087f,58.5938f, +39.0625f,34.3736f,58.5938f, +42.9688f,34.6944f,58.5938f, +46.875f,34.1156f,58.5938f, +50.7813f,34.7246f,58.5938f, +54.6875f,35.3934f,58.5938f, +58.5938f,34.9508f,58.5938f, +62.5f,34.469f,58.5938f, +66.4063f,33.1584f,58.5938f, +70.3125f,30.5913f,58.5938f, +74.2188f,30.4147f,58.5938f, +78.125f,30.821f,58.5938f, +82.0313f,29.9244f,58.5938f, +85.9375f,28.365f,58.5938f, +89.8438f,27.8694f,58.5938f, +93.75f,27.7517f,58.5938f, +97.6563f,27.9188f,58.5938f, +101.563f,27.7605f,58.5938f, +105.469f,28.252f,58.5938f, +109.375f,29.4592f,58.5938f, +113.281f,31.2608f,58.5938f, +117.188f,33.5373f,58.5938f, +121.094f,34.4995f,58.5938f, +125.0f,35.1593f,58.5938f, +128.906f,36.6148f,58.5938f, +132.813f,37.1425f,58.5938f, +136.719f,38.2148f,58.5938f, +140.625f,38.9964f,58.5938f, +144.531f,40.3196f,58.5938f, +148.438f,42.4959f,58.5938f, +152.344f,43.37f,58.5938f, +156.25f,44.3488f,58.5938f, +160.156f,45.6441f,58.5937f, +164.063f,45.6597f,58.5937f, +167.969f,46.9631f,58.5938f, +171.875f,47.0933f,58.5938f, +175.781f,45.839f,58.5937f, +179.688f,44.0491f,58.5937f, +183.594f,41.6462f,58.5938f, +187.5f,39.9012f,58.5938f, +191.406f,37.8373f,58.5938f, +195.313f,35.0871f,58.5938f, +199.219f,34.6045f,58.5938f, +203.125f,32.4469f,58.5938f, +207.031f,30.5103f,58.5938f, +210.938f,28.7194f,58.5938f, +214.844f,26.3358f,58.5938f, +218.75f,24.3668f,58.5938f, +222.656f,22.1719f,58.5938f, +226.563f,20.1708f,58.5938f, +230.469f,18.1384f,58.5938f, +234.375f,15.6994f,58.5938f, +238.281f,12.6124f,58.5938f, +242.188f,11.2279f,58.5938f, +246.094f,10.4938f,58.5938f, +250.0f,9.45058f,58.5938f, +3.90625f,29.2057f,54.6875f, +7.8125f,29.4161f,54.6875f, +11.7188f,29.6274f,54.6875f, +15.625f,29.8747f,54.6875f, +19.5313f,31.3353f,54.6875f, +23.4375f,32.5261f,54.6875f, +27.3438f,34.3893f,54.6875f, +31.25f,34.9525f,54.6875f, +35.1563f,35.8992f,54.6875f, +39.0625f,36.2066f,54.6875f, +42.9688f,36.4212f,54.6875f, +46.875f,36.1377f,54.6875f, +50.7813f,35.4213f,54.6875f, +54.6875f,35.5045f,54.6875f, +58.5938f,36.0891f,54.6875f, +62.5f,36.0244f,54.6875f, +66.4063f,34.9086f,54.6875f, +70.3125f,32.8671f,54.6875f, +74.2188f,33.5578f,54.6875f, +78.125f,33.8468f,54.6875f, +82.0313f,32.868f,54.6875f, +85.9375f,31.2245f,54.6875f, +89.8438f,29.442f,54.6875f, +93.75f,28.9144f,54.6875f, +97.6563f,27.6797f,54.6875f, +101.563f,27.9585f,54.6875f, +105.469f,28.5492f,54.6875f, +109.375f,29.119f,54.6875f, +113.281f,30.7234f,54.6875f, +117.188f,32.402f,54.6875f, +121.094f,34.3605f,54.6875f, +125.0f,35.6614f,54.6875f, +128.906f,37.1814f,54.6875f, +132.813f,37.8509f,54.6875f, +136.719f,38.3282f,54.6875f, +140.625f,39.021f,54.6875f, +144.531f,39.8455f,54.6875f, +148.438f,41.3547f,54.6875f, +152.344f,42.0848f,54.6875f, +156.25f,42.4546f,54.6875f, +160.156f,43.3035f,54.6875f, +164.063f,44.2757f,54.6875f, +167.969f,45.0917f,54.6875f, +171.875f,44.9479f,54.6875f, +175.781f,44.386f,54.6875f, +179.688f,43.1031f,54.6875f, +183.594f,41.5243f,54.6875f, +187.5f,39.9976f,54.6875f, +191.406f,37.1931f,54.6875f, +195.313f,35.2297f,54.6875f, +199.219f,34.439f,54.6875f, +203.125f,32.7399f,54.6875f, +207.031f,31.4766f,54.6875f, +210.938f,29.9402f,54.6875f, +214.844f,28.6752f,54.6875f, +218.75f,27.0387f,54.6875f, +222.656f,24.4777f,54.6875f, +226.563f,21.7169f,54.6875f, +230.469f,20.0299f,54.6875f, +234.375f,17.3103f,54.6875f, +238.281f,14.1891f,54.6875f, +242.188f,12.1605f,54.6875f, +246.094f,10.9065f,54.6875f, +250.0f,10.6619f,54.6875f, +3.90625f,30.4306f,50.7813f, +7.8125f,30.9679f,50.7813f, +11.7188f,31.3065f,50.7813f, +15.625f,32.0527f,50.7813f, +19.5313f,33.9185f,50.7813f, +23.4375f,34.6834f,50.7813f, +27.3438f,35.8025f,50.7813f, +31.25f,36.824f,50.7813f, +35.1563f,37.9949f,50.7813f, +39.0625f,38.2428f,50.7813f, +42.9688f,37.3912f,50.7813f, +46.875f,37.2849f,50.7813f, +50.7813f,36.4441f,50.7813f, +54.6875f,36.5986f,50.7813f, +58.5938f,36.7371f,50.7813f, +62.5f,36.6154f,50.7813f, +66.4063f,35.9475f,50.7813f, +70.3125f,35.1832f,50.7813f, +74.2188f,35.7876f,50.7813f, +78.125f,35.9086f,50.7813f, +82.0313f,35.0048f,50.7813f, +85.9375f,33.7202f,50.7813f, +89.8438f,32.6473f,50.7813f, +93.75f,30.9552f,50.7813f, +97.6563f,28.7453f,50.7813f, +101.563f,29.1526f,50.7813f, +105.469f,29.9957f,50.7813f, +109.375f,30.5544f,50.7813f, +113.281f,31.6947f,50.7813f, +117.188f,32.7584f,50.7813f, +121.094f,34.2518f,50.7813f, +125.0f,36.3694f,50.7813f, +128.906f,36.9477f,50.7813f, +132.813f,37.2918f,50.7813f, +136.719f,37.8325f,50.7813f, +140.625f,38.0845f,50.7813f, +144.531f,40.0088f,50.7813f, +148.438f,40.8219f,50.7813f, +152.344f,42.4039f,50.7813f, +156.25f,42.6086f,50.7813f, +160.156f,43.5487f,50.7813f, +164.063f,43.5328f,50.7813f, +167.969f,44.212f,50.7812f, +171.875f,43.6744f,50.7813f, +175.781f,43.198f,50.7813f, +179.688f,42.957f,50.7813f, +183.594f,41.4993f,50.7813f, +187.5f,39.5101f,50.7813f, +191.406f,38.1729f,50.7813f, +195.313f,35.4881f,50.7813f, +199.219f,34.6384f,50.7813f, +203.125f,34.1873f,50.7813f, +207.031f,32.1155f,50.7813f, +210.938f,30.912f,50.7813f, +214.844f,30.3391f,50.7813f, +218.75f,28.1256f,50.7813f, +222.656f,24.902f,50.7813f, +226.563f,22.2443f,50.7813f, +230.469f,20.9172f,50.7813f, +234.375f,18.8508f,50.7813f, +238.281f,15.9912f,50.7813f, +242.188f,12.7716f,50.7813f, +246.094f,11.6189f,50.7813f, +250.0f,12.2688f,50.7813f, +3.90625f,30.8772f,46.875f, +7.8125f,32.4754f,46.875f, +11.7188f,33.6983f,46.875f, +15.625f,35.14f,46.875f, +19.5313f,37.0369f,46.875f, +23.4375f,38.369f,46.875f, +27.3438f,38.6134f,46.875f, +31.25f,38.9784f,46.875f, +35.1563f,39.9891f,46.875f, +39.0625f,40.3197f,46.875f, +42.9688f,39.9692f,46.875f, +46.875f,39.6994f,46.875f, +50.7813f,39.4183f,46.875f, +54.6875f,38.2948f,46.875f, +58.5938f,38.32f,46.875f, +62.5f,38.621f,46.875f, +66.4063f,38.2134f,46.875f, +70.3125f,36.9577f,46.875f, +74.2188f,37.2936f,46.875f, +78.125f,37.8653f,46.875f, +82.0313f,36.9058f,46.875f, +85.9375f,36.1841f,46.875f, +89.8438f,34.8143f,46.875f, +93.75f,33.0783f,46.875f, +97.6563f,30.9854f,46.875f, +101.563f,30.934f,46.875f, +105.469f,32.108f,46.875f, +109.375f,33.0462f,46.875f, +113.281f,32.9253f,46.875f, +117.188f,33.3377f,46.875f, +121.094f,34.2153f,46.875f, +125.0f,35.0739f,46.875f, +128.906f,36.8239f,46.875f, +132.813f,37.1463f,46.875f, +136.719f,37.5409f,46.875f, +140.625f,38.8265f,46.875f, +144.531f,40.7241f,46.875f, +148.438f,40.9349f,46.875f, +152.344f,42.4491f,46.875f, +156.25f,43.9695f,46.875f, +160.156f,44.2191f,46.875f, +164.063f,44.9265f,46.875f, +167.969f,43.9423f,46.875f, +171.875f,43.273f,46.875f, +175.781f,43.2543f,46.875f, +179.688f,42.5328f,46.875f, +183.594f,41.1777f,46.875f, +187.5f,39.3553f,46.875f, +191.406f,37.8242f,46.875f, +195.313f,36.4649f,46.875f, +199.219f,35.6955f,46.875f, +203.125f,35.1878f,46.875f, +207.031f,32.9438f,46.875f, +210.938f,31.3677f,46.875f, +214.844f,30.7282f,46.875f, +218.75f,28.3328f,46.875f, +222.656f,25.0599f,46.875f, +226.563f,24.1932f,46.875f, +230.469f,22.3853f,46.875f, +234.375f,19.4896f,46.875f, +238.281f,16.8753f,46.875f, +242.188f,13.9469f,46.875f, +246.094f,13.2975f,46.875f, +250.0f,13.2524f,46.875f, +3.90625f,31.8945f,42.9688f, +7.8125f,34.0117f,42.9688f, +11.7188f,36.2441f,42.9688f, +15.625f,37.3622f,42.9688f, +19.5313f,39.5877f,42.9688f, +23.4375f,41.0994f,42.9688f, +27.3438f,42.0864f,42.9688f, +31.25f,42.0849f,42.9688f, +35.1563f,42.2038f,42.9688f, +39.0625f,43.473f,42.9688f, +42.9688f,42.7754f,42.9688f, +46.875f,42.3177f,42.9688f, +50.7813f,42.209f,42.9688f, +54.6875f,41.3095f,42.9688f, +58.5938f,40.8629f,42.9688f, +62.5f,40.4776f,42.9688f, +66.4063f,40.1396f,42.9688f, +70.3125f,39.1169f,42.9688f, +74.2188f,39.1382f,42.9688f, +78.125f,39.1421f,42.9688f, +82.0313f,38.9022f,42.9688f, +85.9375f,37.5711f,42.9688f, +89.8438f,36.7924f,42.9688f, +93.75f,34.7734f,42.9688f, +97.6563f,33.167f,42.9688f, +101.563f,32.4173f,42.9688f, +105.469f,33.0466f,42.9688f, +109.375f,33.3882f,42.9688f, +113.281f,33.7538f,42.9688f, +117.188f,33.5661f,42.9688f, +121.094f,33.9051f,42.9688f, +125.0f,34.9181f,42.9688f, +128.906f,35.2925f,42.9688f, +132.813f,37.1741f,42.9688f, +136.719f,38.0993f,42.9688f, +140.625f,38.7621f,42.9688f, +144.531f,39.712f,42.9688f, +148.438f,40.7257f,42.9688f, +152.344f,42.2465f,42.9688f, +156.25f,43.5331f,42.9688f, +160.156f,44.6745f,42.9687f, +164.063f,44.564f,42.9688f, +167.969f,44.6075f,42.9688f, +171.875f,43.2227f,42.9688f, +175.781f,42.5688f,42.9688f, +179.688f,41.9742f,42.9688f, +183.594f,40.3484f,42.9688f, +187.5f,38.9109f,42.9688f, +191.406f,37.7273f,42.9688f, +195.313f,36.5287f,42.9688f, +199.219f,35.9361f,42.9688f, +203.125f,35.1638f,42.9688f, +207.031f,33.6615f,42.9688f, +210.938f,31.2785f,42.9688f, +214.844f,30.1259f,42.9688f, +218.75f,28.6143f,42.9688f, +222.656f,26.1162f,42.9688f, +226.563f,24.2882f,42.9688f, +230.469f,22.5195f,42.9688f, +234.375f,20.1462f,42.9688f, +238.281f,17.4811f,42.9688f, +242.188f,15.2736f,42.9688f, +246.094f,13.788f,42.9688f, +250.0f,13.1723f,42.9688f, +3.90625f,34.9171f,39.0625f, +7.8125f,36.7711f,39.0625f, +11.7188f,38.5677f,39.0625f, +15.625f,40.0524f,39.0625f, +19.5313f,42.2392f,39.0625f, +23.4375f,43.2332f,39.0625f, +27.3438f,44.8254f,39.0625f, +31.25f,45.1808f,39.0625f, +35.1563f,44.9684f,39.0625f, +39.0625f,45.0647f,39.0625f, +42.9688f,45.0888f,39.0625f, +46.875f,45.5266f,39.0625f, +50.7813f,45.2542f,39.0625f, +54.6875f,44.1797f,39.0625f, +58.5938f,43.2658f,39.0625f, +62.5f,42.7568f,39.0625f, +66.4063f,42.4159f,39.0625f, +70.3125f,41.3883f,39.0625f, +74.2188f,41.1975f,39.0625f, +78.125f,41.3073f,39.0625f, +82.0313f,41.0587f,39.0625f, +85.9375f,40.0611f,39.0625f, +89.8438f,38.7299f,39.0625f, +93.75f,37.2923f,39.0625f, +97.6563f,35.7971f,39.0625f, +101.563f,35.1982f,39.0625f, +105.469f,33.6408f,39.0625f, +109.375f,33.2619f,39.0625f, +113.281f,33.8387f,39.0625f, +117.188f,34.7554f,39.0625f, +121.094f,33.8569f,39.0625f, +125.0f,34.7741f,39.0625f, +128.906f,35.7319f,39.0625f, +132.813f,36.6023f,39.0625f, +136.719f,37.7084f,39.0625f, +140.625f,38.2513f,39.0625f, +144.531f,39.1992f,39.0625f, +148.438f,40.2336f,39.0625f, +152.344f,41.0883f,39.0625f, +156.25f,42.4004f,39.0625f, +160.156f,42.8753f,39.0625f, +164.063f,43.1631f,39.0625f, +167.969f,43.6378f,39.0625f, +171.875f,43.2113f,39.0625f, +175.781f,42.5474f,39.0625f, +179.688f,41.3413f,39.0625f, +183.594f,39.4383f,39.0625f, +187.5f,38.9723f,39.0625f, +191.406f,37.3549f,39.0625f, +195.313f,35.8615f,39.0625f, +199.219f,34.9243f,39.0625f, +203.125f,34.598f,39.0625f, +207.031f,33.6592f,39.0625f, +210.938f,32.2347f,39.0625f, +214.844f,30.4117f,39.0625f, +218.75f,28.4787f,39.0625f, +222.656f,26.6538f,39.0625f, +226.563f,24.4892f,39.0625f, +230.469f,22.9637f,39.0625f, +234.375f,20.6363f,39.0625f, +238.281f,18.4584f,39.0625f, +242.188f,16.293f,39.0625f, +246.094f,13.7473f,39.0625f, +250.0f,13.2449f,39.0625f, +3.90625f,38.5427f,35.1563f, +7.8125f,39.2771f,35.1563f, +11.7188f,40.4801f,35.1563f, +15.625f,42.2714f,35.1563f, +19.5313f,44.0743f,35.1562f, +23.4375f,45.9071f,35.1562f, +27.3438f,47.4425f,35.1563f, +31.25f,47.765f,35.1563f, +35.1563f,46.8453f,35.1562f, +39.0625f,47.1161f,35.1562f, +42.9688f,46.591f,35.1563f, +46.875f,47.4064f,35.1563f, +50.7813f,47.2001f,35.1562f, +54.6875f,47.2372f,35.1562f, +58.5938f,46.9666f,35.1563f, +62.5f,45.3322f,35.1563f, +66.4063f,44.4351f,35.1562f, +70.3125f,43.869f,35.1562f, +74.2188f,43.7604f,35.1563f, +78.125f,43.6414f,35.1563f, +82.0313f,43.6044f,35.1563f, +85.9375f,41.9765f,35.1563f, +89.8438f,40.597f,35.1563f, +93.75f,38.8088f,35.1563f, +97.6563f,37.4254f,35.1563f, +101.563f,36.4869f,35.1563f, +105.469f,34.7975f,35.1563f, +109.375f,32.6051f,35.1563f, +113.281f,32.3929f,35.1563f, +117.188f,33.3906f,35.1563f, +121.094f,33.728f,35.1563f, +125.0f,33.8089f,35.1563f, +128.906f,35.2443f,35.1563f, +132.813f,35.9877f,35.1563f, +136.719f,36.3747f,35.1563f, +140.625f,37.6045f,35.1563f, +144.531f,38.3698f,35.1563f, +148.438f,39.393f,35.1563f, +152.344f,40.0115f,35.1563f, +156.25f,40.8722f,35.1563f, +160.156f,40.7302f,35.1563f, +164.063f,41.6767f,35.1563f, +167.969f,42.1719f,35.1563f, +171.875f,41.924f,35.1563f, +175.781f,40.9628f,35.1563f, +179.688f,39.3209f,35.1563f, +183.594f,37.9615f,35.1563f, +187.5f,37.2902f,35.1563f, +191.406f,36.1521f,35.1563f, +195.313f,35.5697f,35.1563f, +199.219f,35.0547f,35.1563f, +203.125f,33.8422f,35.1563f, +207.031f,33.1699f,35.1563f, +210.938f,32.4197f,35.1563f, +214.844f,31.0723f,35.1563f, +218.75f,29.1069f,35.1563f, +222.656f,26.4015f,35.1563f, +226.563f,23.6862f,35.1563f, +230.469f,22.3142f,35.1563f, +234.375f,20.9225f,35.1563f, +238.281f,18.6533f,35.1563f, +242.188f,16.5438f,35.1563f, +246.094f,14.5457f,35.1563f, +250.0f,13.5112f,35.1563f, +3.90625f,41.4381f,31.25f, +7.8125f,41.4661f,31.25f, +11.7188f,42.5211f,31.25f, +15.625f,44.1517f,31.25f, +19.5313f,45.8301f,31.25f, +23.4375f,47.3213f,31.25f, +27.3438f,49.1504f,31.25f, +31.25f,49.1313f,31.25f, +35.1563f,48.4621f,31.25f, +39.0625f,48.0866f,31.25f, +42.9688f,47.5259f,31.25f, +46.875f,48.2042f,31.25f, +50.7813f,48.2678f,31.25f, +54.6875f,48.6796f,31.25f, +58.5938f,49.1508f,31.25f, +62.5f,48.5261f,31.25f, +66.4063f,47.2699f,31.25f, +70.3125f,46.3239f,31.25f, +74.2188f,45.9053f,31.25f, +78.125f,45.2948f,31.25f, +82.0313f,45.1222f,31.25f, +85.9375f,44.1773f,31.25f, +89.8438f,42.0751f,31.25f, +93.75f,39.8181f,31.25f, +97.6563f,38.1904f,31.25f, +101.563f,36.9029f,31.25f, +105.469f,35.9897f,31.25f, +109.375f,34.1082f,31.25f, +113.281f,33.9882f,31.25f, +117.188f,33.4544f,31.25f, +121.094f,32.7435f,31.25f, +125.0f,32.2982f,31.25f, +128.906f,33.2893f,31.25f, +132.813f,34.4302f,31.25f, +136.719f,35.501f,31.25f, +140.625f,36.4162f,31.25f, +144.531f,38.0795f,31.25f, +148.438f,38.4184f,31.25f, +152.344f,38.1695f,31.25f, +156.25f,39.1334f,31.25f, +160.156f,39.8018f,31.25f, +164.063f,40.4009f,31.25f, +167.969f,40.6662f,31.25f, +171.875f,40.6389f,31.25f, +175.781f,40.0005f,31.25f, +179.688f,38.1437f,31.25f, +183.594f,36.1677f,31.25f, +187.5f,35.7553f,31.25f, +191.406f,35.2539f,31.25f, +195.313f,34.5258f,31.25f, +199.219f,33.9511f,31.25f, +203.125f,33.8209f,31.25f, +207.031f,32.5194f,31.25f, +210.938f,31.6797f,31.25f, +214.844f,30.494f,31.25f, +218.75f,28.9089f,31.25f, +222.656f,27.096f,31.25f, +226.563f,23.5752f,31.25f, +230.469f,22.5423f,31.25f, +234.375f,20.8438f,31.25f, +238.281f,18.7938f,31.25f, +242.188f,16.7022f,31.25f, +246.094f,14.6115f,31.25f, +250.0f,12.7758f,31.25f, +3.90625f,42.7334f,27.3437f, +7.8125f,43.3658f,27.3438f, +11.7188f,44.93f,27.3437f, +15.625f,46.7113f,27.3438f, +19.5313f,48.1031f,27.3437f, +23.4375f,48.7173f,27.3438f, +27.3438f,49.0875f,27.3437f, +31.25f,50.1272f,27.3438f, +35.1563f,49.1784f,27.3437f, +39.0625f,50.4569f,27.3438f, +42.9688f,49.7216f,27.3437f, +46.875f,49.0563f,27.3438f, +50.7813f,48.7494f,27.3437f, +54.6875f,49.0519f,27.3438f, +58.5938f,49.8264f,27.3437f, +62.5f,49.8194f,27.3438f, +66.4063f,48.9033f,27.3437f, +70.3125f,47.5002f,27.3438f, +74.2188f,46.7308f,27.3437f, +78.125f,45.8132f,27.3438f, +82.0313f,45.4303f,27.3437f, +85.9375f,44.4837f,27.3438f, +89.8438f,42.6706f,27.3437f, +93.75f,40.5108f,27.3438f, +97.6563f,38.4748f,27.3437f, +101.563f,38.2458f,27.3438f, +105.469f,37.8191f,27.3437f, +109.375f,37.5503f,27.3438f, +113.281f,36.4883f,27.3437f, +117.188f,35.7025f,27.3438f, +121.094f,34.3569f,27.3437f, +125.0f,34.052f,27.3438f, +128.906f,34.3166f,27.3437f, +132.813f,33.9873f,27.3438f, +136.719f,33.8326f,27.3437f, +140.625f,35.5138f,27.3438f, +144.531f,35.9847f,27.3437f, +148.438f,36.3159f,27.3438f, +152.344f,38.1026f,27.3437f, +156.25f,39.0191f,27.3438f, +160.156f,39.0705f,27.3437f, +164.063f,38.9644f,27.3438f, +167.969f,38.0972f,27.3437f, +171.875f,38.277f,27.3438f, +175.781f,37.5686f,27.3437f, +179.688f,35.9897f,27.3438f, +183.594f,34.1554f,27.3437f, +187.5f,33.9646f,27.3438f, +191.406f,33.9556f,27.3437f, +195.313f,33.7374f,27.3438f, +199.219f,33.3736f,27.3437f, +203.125f,32.1967f,27.3438f, +207.031f,32.2131f,27.3437f, +210.938f,30.4757f,27.3438f, +214.844f,29.0495f,27.3437f, +218.75f,27.539f,27.3438f, +222.656f,25.7435f,27.3437f, +226.563f,23.5358f,27.3438f, +230.469f,22.5305f,27.3437f, +234.375f,20.3466f,27.3438f, +238.281f,18.5956f,27.3438f, +242.188f,16.6554f,27.3438f, +246.094f,14.7633f,27.3438f, +250.0f,12.979f,27.3438f, +3.90625f,44.6783f,23.4375f, +7.8125f,46.1279f,23.4375f, +11.7188f,47.9921f,23.4375f, +15.625f,48.593f,23.4375f, +19.5313f,49.826f,23.4375f, +23.4375f,50.0111f,23.4375f, +27.3438f,49.773f,23.4375f, +31.25f,50.6443f,23.4375f, +35.1563f,50.242f,23.4375f, +39.0625f,51.5289f,23.4375f, +42.9688f,51.3905f,23.4375f, +46.875f,50.5543f,23.4375f, +50.7813f,49.96f,23.4375f, +54.6875f,51.029f,23.4375f, +58.5938f,50.4996f,23.4375f, +62.5f,50.0508f,23.4375f, +66.4063f,49.4463f,23.4375f, +70.3125f,48.7613f,23.4375f, +74.2188f,48.0188f,23.4375f, +78.125f,48.0992f,23.4375f, +82.0313f,47.1947f,23.4375f, +85.9375f,45.1889f,23.4375f, +89.8438f,43.9247f,23.4375f, +93.75f,41.7965f,23.4375f, +97.6563f,40.363f,23.4375f, +101.563f,40.3201f,23.4375f, +105.469f,39.2422f,23.4375f, +109.375f,38.6318f,23.4375f, +113.281f,37.9263f,23.4375f, +117.188f,37.113f,23.4375f, +121.094f,35.4884f,23.4375f, +125.0f,35.8385f,23.4375f, +128.906f,35.4941f,23.4375f, +132.813f,34.1911f,23.4375f, +136.719f,33.6791f,23.4375f, +140.625f,33.4506f,23.4375f, +144.531f,35.4822f,23.4375f, +148.438f,36.0187f,23.4375f, +152.344f,38.231f,23.4375f, +156.25f,39.1197f,23.4375f, +160.156f,38.9095f,23.4375f, +164.063f,38.1737f,23.4375f, +167.969f,36.7498f,23.4375f, +171.875f,36.6113f,23.4375f, +175.781f,35.5895f,23.4375f, +179.688f,34.7415f,23.4375f, +183.594f,32.6574f,23.4375f, +187.5f,32.5837f,23.4375f, +191.406f,32.5272f,23.4375f, +195.313f,32.3611f,23.4375f, +199.219f,31.4784f,23.4375f, +203.125f,30.8078f,23.4375f, +207.031f,29.9524f,23.4375f, +210.938f,29.9998f,23.4375f, +214.844f,28.4828f,23.4375f, +218.75f,26.6709f,23.4375f, +222.656f,24.9874f,23.4375f, +226.563f,23.0213f,23.4375f, +230.469f,21.3587f,23.4375f, +234.375f,19.0527f,23.4375f, +238.281f,18.1056f,23.4375f, +242.188f,16.7916f,23.4375f, +246.094f,14.9561f,23.4375f, +250.0f,13.0063f,23.4375f, +3.90625f,46.9055f,19.5312f, +7.8125f,48.3769f,19.5312f, +11.7188f,50.0613f,19.5312f, +15.625f,50.9962f,19.5312f, +19.5313f,51.161f,19.5312f, +23.4375f,51.7721f,19.5312f, +27.3438f,51.5823f,19.5312f, +31.25f,51.5274f,19.5312f, +35.1563f,51.5913f,19.5312f, +39.0625f,52.4399f,19.5312f, +42.9688f,52.5999f,19.5312f, +46.875f,51.9309f,19.5312f, +50.7813f,51.6062f,19.5312f, +54.6875f,50.86f,19.5312f, +58.5938f,51.1496f,19.5312f, +62.5f,50.1957f,19.5312f, +66.4063f,49.8047f,19.5312f, +70.3125f,49.1838f,19.5312f, +74.2188f,48.7276f,19.5312f, +78.125f,48.4967f,19.5312f, +82.0313f,47.4515f,19.5312f, +85.9375f,46.2594f,19.5312f, +89.8438f,44.6756f,19.5312f, +93.75f,43.0377f,19.5312f, +97.6563f,41.3508f,19.5312f, +101.563f,40.8261f,19.5312f, +105.469f,40.5524f,19.5312f, +109.375f,39.7289f,19.5312f, +113.281f,38.9437f,19.5312f, +117.188f,38.3781f,19.5312f, +121.094f,36.9618f,19.5312f, +125.0f,35.9735f,19.5312f, +128.906f,35.3887f,19.5312f, +132.813f,34.5133f,19.5312f, +136.719f,34.7253f,19.5312f, +140.625f,33.9228f,19.5312f, +144.531f,34.2826f,19.5312f, +148.438f,35.5643f,19.5312f, +152.344f,37.7492f,19.5312f, +156.25f,38.7871f,19.5312f, +160.156f,38.6036f,19.5312f, +164.063f,38.2702f,19.5312f, +167.969f,35.931f,19.5312f, +171.875f,34.8252f,19.5312f, +175.781f,33.99f,19.5312f, +179.688f,33.664f,19.5312f, +183.594f,31.6973f,19.5312f, +187.5f,31.3559f,19.5312f, +191.406f,31.3589f,19.5312f, +195.313f,30.7614f,19.5312f, +199.219f,29.2596f,19.5312f, +203.125f,28.7711f,19.5312f, +207.031f,27.9455f,19.5312f, +210.938f,28.3339f,19.5312f, +214.844f,28.3863f,19.5312f, +218.75f,27.4513f,19.5312f, +222.656f,25.0652f,19.5312f, +226.563f,23.2291f,19.5312f, +230.469f,20.8477f,19.5313f, +234.375f,19.424f,19.5313f, +238.281f,17.7051f,19.5313f, +242.188f,16.5977f,19.5313f, +246.094f,14.7851f,19.5313f, +250.0f,12.8344f,19.5313f, +3.90625f,49.2295f,15.625f, +7.8125f,50.0754f,15.625f, +11.7188f,51.5873f,15.625f, +15.625f,52.0525f,15.625f, +19.5313f,51.4269f,15.625f, +23.4375f,51.8405f,15.625f, +27.3438f,52.3327f,15.625f, +31.25f,53.011f,15.625f, +35.1563f,52.7359f,15.625f, +39.0625f,53.2852f,15.625f, +42.9688f,53.6617f,15.625f, +46.875f,52.4883f,15.625f, +50.7813f,51.9362f,15.625f, +54.6875f,50.8372f,15.625f, +58.5938f,50.1782f,15.625f, +62.5f,49.0401f,15.625f, +66.4063f,49.1011f,15.625f, +70.3125f,48.7903f,15.625f, +74.2188f,48.6124f,15.625f, +78.125f,48.1259f,15.625f, +82.0313f,47.7267f,15.625f, +85.9375f,46.9214f,15.625f, +89.8438f,45.0939f,15.625f, +93.75f,43.6563f,15.625f, +97.6563f,42.5709f,15.625f, +101.563f,41.9572f,15.625f, +105.469f,40.973f,15.625f, +109.375f,40.7682f,15.625f, +113.281f,39.3641f,15.625f, +117.188f,39.2768f,15.625f, +121.094f,37.5977f,15.625f, +125.0f,36.0608f,15.625f, +128.906f,36.045f,15.625f, +132.813f,35.1379f,15.625f, +136.719f,34.9875f,15.625f, +140.625f,34.0482f,15.625f, +144.531f,33.8104f,15.625f, +148.438f,34.9994f,15.625f, +152.344f,36.2664f,15.625f, +156.25f,37.7694f,15.625f, +160.156f,37.6584f,15.625f, +164.063f,36.9226f,15.625f, +167.969f,34.7519f,15.625f, +171.875f,33.2827f,15.625f, +175.781f,32.8949f,15.625f, +179.688f,32.1339f,15.625f, +183.594f,30.407f,15.625f, +187.5f,28.996f,15.625f, +191.406f,29.3357f,15.625f, +195.313f,29.1098f,15.625f, +199.219f,27.8354f,15.625f, +203.125f,26.4739f,15.625f, +207.031f,26.1829f,15.625f, +210.938f,27.387f,15.625f, +214.844f,27.4944f,15.625f, +218.75f,26.4893f,15.625f, +222.656f,24.7764f,15.625f, +226.563f,22.9689f,15.625f, +230.469f,20.4237f,15.625f, +234.375f,18.8049f,15.625f, +238.281f,17.4547f,15.625f, +242.188f,16.2758f,15.625f, +246.094f,14.2192f,15.625f, +250.0f,11.8103f,15.625f, +3.90625f,51.1233f,11.7187f, +7.8125f,51.8127f,11.7187f, +11.7188f,52.0971f,11.7187f, +15.625f,51.8317f,11.7187f, +19.5313f,52.1213f,11.7187f, +23.4375f,51.7889f,11.7187f, +27.3438f,52.2065f,11.7187f, +31.25f,52.438f,11.7187f, +35.1563f,52.6021f,11.7187f, +39.0625f,53.2864f,11.7187f, +42.9688f,52.8882f,11.7187f, +46.875f,52.6009f,11.7187f, +50.7813f,52.8442f,11.7187f, +54.6875f,52.6512f,11.7187f, +58.5938f,51.6436f,11.7187f, +62.5f,50.4271f,11.7187f, +66.4063f,49.3264f,11.7187f, +70.3125f,48.6522f,11.7187f, +74.2188f,49.5854f,11.7187f, +78.125f,50.3492f,11.7187f, +82.0313f,49.035f,11.7187f, +85.9375f,47.6474f,11.7187f, +89.8438f,46.0472f,11.7187f, +93.75f,44.7337f,11.7187f, +97.6563f,44.3349f,11.7187f, +101.563f,43.475f,11.7187f, +105.469f,42.9461f,11.7187f, +109.375f,41.7731f,11.7187f, +113.281f,40.717f,11.7187f, +117.188f,39.399f,11.7187f, +121.094f,38.1327f,11.7187f, +125.0f,36.3286f,11.7187f, +128.906f,36.2512f,11.7187f, +132.813f,35.1997f,11.7187f, +136.719f,33.9406f,11.7187f, +140.625f,33.3109f,11.7187f, +144.531f,33.8153f,11.7187f, +148.438f,33.6823f,11.7187f, +152.344f,34.7077f,11.7187f, +156.25f,35.4472f,11.7187f, +160.156f,35.6332f,11.7187f, +164.063f,34.3651f,11.7187f, +167.969f,32.9876f,11.7187f, +171.875f,32.2858f,11.7187f, +175.781f,32.1374f,11.7187f, +179.688f,30.9575f,11.7187f, +183.594f,29.1111f,11.7187f, +187.5f,28.149f,11.7187f, +191.406f,27.4443f,11.7187f, +195.313f,27.3781f,11.7187f, +199.219f,26.4413f,11.7187f, +203.125f,24.9734f,11.7187f, +207.031f,25.0959f,11.7187f, +210.938f,26.2472f,11.7187f, +214.844f,26.1569f,11.7187f, +218.75f,24.8556f,11.7187f, +222.656f,22.8797f,11.7187f, +226.563f,21.8102f,11.7187f, +230.469f,19.294f,11.7187f, +234.375f,17.5291f,11.7187f, +238.281f,16.242f,11.7187f, +242.188f,15.2738f,11.7187f, +246.094f,13.8715f,11.7187f, +250.0f,12.3043f,11.7187f, +3.90625f,52.2527f,7.8125f, +7.8125f,52.7759f,7.8125f, +11.7188f,52.1635f,7.8125f, +15.625f,52.2016f,7.8125f, +19.5313f,51.9832f,7.8125f, +23.4375f,51.4669f,7.8125f, +27.3438f,51.0033f,7.8125f, +31.25f,50.7124f,7.8125f, +35.1563f,51.6427f,7.8125f, +39.0625f,52.5008f,7.8125f, +42.9688f,53.2834f,7.8125f, +46.875f,52.5339f,7.8125f, +50.7813f,52.627f,7.8125f, +54.6875f,52.9017f,7.8125f, +58.5938f,52.8616f,7.8125f, +62.5f,51.7566f,7.8125f, +66.4063f,51.3268f,7.8125f, +70.3125f,50.6108f,7.8125f, +74.2188f,50.9277f,7.8125f, +78.125f,51.701f,7.8125f, +82.0313f,50.5549f,7.8125f, +85.9375f,48.4345f,7.8125f, +89.8438f,47.3592f,7.8125f, +93.75f,45.7216f,7.8125f, +97.6563f,45.75f,7.8125f, +101.563f,44.4249f,7.8125f, +105.469f,44.7192f,7.8125f, +109.375f,44.4938f,7.8125f, +113.281f,43.252f,7.8125f, +117.188f,41.3735f,7.8125f, +121.094f,39.8664f,7.8125f, +125.0f,37.025f,7.8125f, +128.906f,36.5094f,7.8125f, +132.813f,35.3554f,7.8125f, +136.719f,33.9389f,7.8125f, +140.625f,32.7715f,7.8125f, +144.531f,32.8295f,7.8125f, +148.438f,32.4513f,7.8125f, +152.344f,33.4598f,7.8125f, +156.25f,34.3434f,7.8125f, +160.156f,34.8633f,7.8125f, +164.063f,33.7043f,7.8125f, +167.969f,32.5629f,7.8125f, +171.875f,31.5117f,7.8125f, +175.781f,30.9816f,7.8125f, +179.688f,30.2039f,7.8125f, +183.594f,28.5054f,7.8125f, +187.5f,26.8519f,7.8125f, +191.406f,25.6078f,7.8125f, +195.313f,26.0906f,7.8125f, +199.219f,25.313f,7.8125f, +203.125f,24.0014f,7.8125f, +207.031f,24.066f,7.8125f, +210.938f,24.4935f,7.8125f, +214.844f,24.3803f,7.8125f, +218.75f,23.0075f,7.8125f, +222.656f,21.1023f,7.8125f, +226.563f,19.0418f,7.8125f, +230.469f,17.9588f,7.8125f, +234.375f,16.5211f,7.8125f, +238.281f,15.4949f,7.8125f, +242.188f,14.0938f,7.8125f, +246.094f,13.3141f,7.8125f, +250.0f,12.9595f,7.8125f, +3.90625f,52.6186f,3.90625f, +7.8125f,51.8648f,3.90625f, +11.7188f,51.1949f,3.90625f, +15.625f,50.2102f,3.90625f, +19.5313f,50.6058f,3.90625f, +23.4375f,50.7008f,3.90625f, +27.3438f,51.2163f,3.90625f, +31.25f,51.4263f,3.90625f, +35.1563f,52.1968f,3.90625f, +39.0625f,53.9783f,3.90625f, +42.9688f,53.8927f,3.90625f, +46.875f,53.3266f,3.90625f, +50.7813f,53.5901f,3.90625f, +54.6875f,55.5679f,3.90625f, +58.5938f,55.1819f,3.90625f, +62.5f,53.6891f,3.90625f, +66.4063f,53.0541f,3.90625f, +70.3125f,51.6665f,3.90625f, +74.2188f,51.4469f,3.90625f, +78.125f,51.9591f,3.90625f, +82.0313f,51.0418f,3.90625f, +85.9375f,49.7513f,3.90625f, +89.8438f,48.7329f,3.90625f, +93.75f,46.8713f,3.90625f, +97.6563f,46.3905f,3.90625f, +101.563f,45.4241f,3.90625f, +105.469f,45.6811f,3.90625f, +109.375f,45.3238f,3.90625f, +113.281f,43.6112f,3.90625f, +117.188f,42.1291f,3.90625f, +121.094f,40.4747f,3.90625f, +125.0f,39.3351f,3.90625f, +128.906f,38.0742f,3.90625f, +132.813f,36.7758f,3.90625f, +136.719f,34.9213f,3.90625f, +140.625f,32.3643f,3.90625f, +144.531f,31.7157f,3.90625f, +148.438f,30.6005f,3.90625f, +152.344f,31.6034f,3.90625f, +156.25f,32.6503f,3.90625f, +160.156f,33.3131f,3.90625f, +164.063f,32.5745f,3.90625f, +167.969f,31.5017f,3.90625f, +171.875f,30.6842f,3.90625f, +175.781f,29.8734f,3.90625f, +179.688f,28.6537f,3.90625f, +183.594f,27.2073f,3.90625f, +187.5f,25.4367f,3.90625f, +191.406f,24.1609f,3.90625f, +195.313f,23.9724f,3.90625f, +199.219f,23.7702f,3.90625f, +203.125f,22.4031f,3.90625f, +207.031f,22.1587f,3.90625f, +210.938f,21.6154f,3.90625f, +214.844f,21.8202f,3.90625f, +218.75f,21.017f,3.90625f, +222.656f,19.3736f,3.90625f, +226.563f,18.2127f,3.90625f, +230.469f,17.2263f,3.90625f, +234.375f,16.2938f,3.90625f, +238.281f,14.4518f,3.90625f, +242.188f,13.6398f,3.90625f, +246.094f,13.2404f,3.90625f, +250.0f,12.7102f,3.90625f, +}; + +btScalar Landscape04Nml[] = { +-0.350125f,0.914758f,-0.201568f, +-0.310159f,0.930741f,-0.193707f, +-0.297809f,0.93918f,-0.171025f, +-0.203808f,0.975413f,-0.083855f, +-0.227869f,0.971729f,-0.0617958f, +-0.175976f,0.984209f,0.0190985f, +-0.113434f,0.992992f,-0.0331636f, +-0.10748f,0.994138f,-0.0117748f, +0.264437f,0.964372f,0.00769155f, +0.281666f,0.958691f,0.0397075f, +0.430486f,0.901936f,-0.0345351f, +0.401178f,0.915992f,-0.00383073f, +0.323069f,0.944057f,-0.0662002f, +0.321744f,0.945983f,-0.039967f, +0.269775f,0.962292f,-0.0348534f, +0.20193f,0.970428f,-0.132266f, +0.268889f,0.954681f,-0.127604f, +0.194635f,0.954618f,-0.225435f, +0.221506f,0.956393f,-0.190387f, +0.193103f,0.932235f,-0.306022f, +0.127904f,0.985279f,-0.113427f, +0.190082f,0.941797f,-0.277285f, +-0.00897869f,0.999816f,0.0169309f, +0.104995f,0.98929f,-0.101393f, +-0.0904331f,0.992726f,0.0794834f, +0.0230108f,0.991613f,0.127174f, +0.0155488f,0.993572f,0.11213f, +0.0288983f,0.981821f,0.187597f, +0.0247864f,0.996149f,0.0840949f, +-0.0831472f,0.996537f,0.000391199f, +-0.0501709f,0.99867f,0.0118531f, +-0.153f,0.976743f,-0.15021f, +-0.106591f,0.988499f,-0.107277f, +-0.178503f,0.946807f,-0.267757f, +-0.0254657f,0.984638f,-0.172739f, +-0.00387521f,0.963955f,-0.266035f, +-0.0158619f,0.994497f,-0.103554f, +0.0516719f,0.979433f,-0.195043f, +-0.113536f,0.993496f,-0.00869834f, +-0.0532458f,0.993386f,-0.101726f, +-0.240923f,0.970479f,0.0112676f, +-0.272825f,0.959264f,-0.0733371f, +-0.364171f,0.921854f,-0.132533f, +-0.38043f,0.901643f,-0.205699f, +-0.208475f,0.967633f,-0.142215f, +-0.200209f,0.964847f,-0.170257f, +-0.436593f,0.880066f,-0.186734f, +-0.420663f,0.90307f,-0.0866427f, +-0.564169f,0.813693f,-0.140058f, +-0.556718f,0.83037f,-0.0234562f, +-0.419122f,0.896066f,-0.146295f, +-0.466908f,0.873897f,-0.135282f, +-0.39151f,0.89596f,-0.209704f, +-0.388383f,0.911455f,-0.135677f, +-0.356022f,0.918213f,-0.173589f, +-0.334437f,0.939184f,-0.0780065f, +-0.257665f,0.953587f,-0.155824f, +-0.309301f,0.93272f,-0.185382f, +-0.315034f,0.931862f,-0.179961f, +-0.295926f,0.931298f,-0.212393f, +-0.436779f,0.896592f,-0.0731173f, +-0.317368f,0.948237f,0.0111289f, +-0.503169f,0.863334f,0.0383931f, +-0.468116f,0.877337f,0.105583f, +-0.41232f,0.911034f,0.00307775f, +-0.465256f,0.885053f,0.0147642f, +-0.139311f,0.987488f,-0.0738976f, +-0.20689f,0.974976f,-0.0813499f, +-0.0453849f,0.98457f,-0.169006f, +-0.109269f,0.973649f,-0.20017f, +0.0405907f,0.980595f,-0.191794f, +0.0742781f,0.990348f,-0.117022f, +-0.00934593f,0.982385f,-0.186633f, +0.00811898f,0.984163f,-0.177079f, +-0.0726933f,0.996391f,-0.043832f, +0.0160265f,0.999861f,-0.00453309f, +-0.163053f,0.986585f,0.00801872f, +-0.185529f,0.978031f,-0.0950467f, +-0.137829f,0.987875f,0.0714611f, +-0.0578854f,0.998186f,0.0165557f, +0.148249f,0.976119f,0.158788f, +0.193139f,0.975453f,0.10578f, +0.369772f,0.912299f,0.176006f, +0.348645f,0.936628f,0.0342667f, +0.282769f,0.952501f,0.113063f, +0.239504f,0.96906f,-0.059674f, +0.137712f,0.990197f,0.0233582f, +0.149987f,0.988306f,0.0274647f, +0.169834f,0.984573f,-0.0420991f, +0.0927723f,0.990592f,-0.100603f, +0.171676f,0.97845f,-0.114732f, +0.0567364f,0.963622f,-0.261179f, +0.117062f,0.969073f,-0.217242f, +0.0434058f,0.931949f,-0.359981f, +0.148347f,0.946865f,-0.285375f, +0.103327f,0.903437f,-0.416082f, +0.28421f,0.914779f,-0.287061f, +0.391793f,0.893555f,-0.21922f, +0.419866f,0.888994f,-0.182764f, +0.461528f,0.873246f,-0.156313f, +0.483081f,0.869853f,-0.099941f, +0.503438f,0.857022f,-0.109831f, +0.46584f,0.882166f,-0.0691099f, +0.489623f,0.868073f,-0.0819641f, +0.410796f,0.910896f,-0.0389227f, +0.393119f,0.918063f,-0.0511611f, +0.359627f,0.921042f,-0.1495f, +0.306646f,0.942147f,-0.135377f, +0.381773f,0.903228f,-0.196033f, +0.360002f,0.920948f,-0.149176f, +0.203221f,0.945872f,-0.253037f, +0.218471f,0.943498f,-0.249162f, +0.0567054f,0.995659f,-0.0738017f, +0.229305f,0.968679f,0.0952866f, +-0.0263963f,0.99794f,0.0584726f, +-0.0422212f,0.996107f,0.0773806f, +0.0415928f,0.997459f,0.0578396f, +0.0625406f,0.995706f,0.0682456f, +0.174866f,0.970931f,0.163448f, +0.248971f,0.959664f,0.13061f, +0.296526f,0.91909f,0.259511f, +0.244457f,0.962524f,0.117427f, +0.144028f,0.988219f,0.0517682f, +0.0516566f,0.998622f,-0.00921711f, +-0.0100473f,0.999479f,-0.0306849f, +0.144821f,0.968281f,0.203614f, +0.0927686f,0.985877f,0.139429f, +0.159268f,0.950036f,0.268448f, +-0.238265f,0.969366f,-0.0596594f, +-0.317162f,0.937667f,-0.14209f, +-0.252226f,0.956124f,-0.149026f, +-0.139275f,0.959516f,-0.244809f, +0.225678f,0.948782f,-0.221092f, +0.454598f,0.876109f,-0.160545f, +0.280777f,0.950726f,-0.131467f, +0.235562f,0.968875f,-0.076101f, +0.32523f,0.943278f,-0.0667146f, +0.204883f,0.977104f,-0.0573623f, +-0.016814f,0.999658f,-0.0200258f, +-0.0821474f,0.994185f,0.0696248f, +-0.0248008f,0.998098f,0.0564331f, +0.000698274f,0.999817f,0.0191283f, +0.0007523f,0.989994f,0.141106f, +-0.0137951f,0.98192f,0.188792f, +-0.00956379f,0.990301f,0.138609f, +-0.0156365f,0.996604f,0.0808513f, +-0.104293f,0.986463f,0.126542f, +-0.156424f,0.969975f,0.186228f, +-0.167617f,0.975111f,0.145129f, +-0.261339f,0.965118f,0.0157997f, +-0.160877f,0.9832f,-0.0862302f, +-0.296054f,0.934306f,-0.198555f, +-0.550185f,0.752769f,-0.361436f, +-0.408582f,0.840233f,-0.356467f, +-0.339245f,0.876729f,-0.340968f, +-0.402741f,0.85772f,-0.319556f, +-0.316164f,0.924069f,-0.214795f, +-0.348907f,0.927941f,-0.131109f, +-0.48502f,0.870548f,-0.0830789f, +-0.53006f,0.843646f,-0.085433f, +-0.352226f,0.931519f,-0.0906107f, +-0.0975811f,0.982258f,-0.160146f, +0.0477418f,0.981235f,-0.186812f, +0.0219054f,0.966987f,-0.253882f, +-0.115057f,0.988784f,-0.0952266f, +-0.238673f,0.960258f,0.144707f, +-0.213447f,0.931011f,0.296071f, +-0.201955f,0.923284f,0.326742f, +0.101325f,0.921693f,0.374453f, +0.294403f,0.882174f,0.367555f, +0.373397f,0.835094f,0.403971f, +0.278351f,0.921647f,0.270347f, +0.215461f,0.962466f,0.16503f, +0.225302f,0.965479f,0.13073f, +0.175997f,0.983214f,0.0481225f, +0.220124f,0.97536f,0.0147531f, +0.32343f,0.94566f,-0.0334783f, +0.369971f,0.927728f,-0.0494253f, +0.427777f,0.903113f,-0.037328f, +0.446874f,0.894597f,9.72625e-005f, +0.445338f,0.895316f,-0.00910111f, +0.463955f,0.88101f,-0.0925573f, +0.398143f,0.905258f,-0.148289f, +0.190091f,0.969836f,-0.152589f, +-0.0830374f,0.980972f,-0.175495f, +-0.1343f,0.985908f,-0.0997463f, +-0.00843053f,0.999434f,0.0325608f, +0.021819f,0.995847f,0.0883913f, +0.206682f,0.96009f,0.188439f, +0.388829f,0.882727f,0.263827f, +0.0707915f,0.996578f,0.0426701f, +-0.161491f,0.983232f,-0.0847068f, +-0.0785342f,0.996721f,-0.0194704f, +-0.224473f,0.966422f,-0.125062f, +-0.159666f,0.968511f,-0.191032f, +0.0318558f,0.951557f,-0.305817f, +0.187349f,0.896729f,-0.400972f, +0.324927f,0.900628f,-0.288602f, +0.217775f,0.961772f,-0.16604f, +0.20019f,0.973241f,-0.112807f, +0.277242f,0.959937f,-0.0407145f, +0.14204f,0.987332f,0.0707153f, +-0.0153938f,0.984428f,0.175114f, +-0.0735255f,0.984081f,0.161796f, +-0.0237909f,0.990594f,0.134749f, +-0.0614906f,0.985818f,0.156146f, +-0.143236f,0.970943f,0.191711f, +-0.0137498f,0.973243f,0.229369f, +0.0567477f,0.984597f,0.165372f, +-0.0347212f,0.993259f,0.110594f, +-0.143386f,0.976741f,0.159429f, +-0.139502f,0.982211f,0.125705f, +-0.0993842f,0.989216f,0.107588f, +-0.136731f,0.987843f,0.0739654f, +-0.0893069f,0.995969f,0.00840628f, +-0.123862f,0.992294f,-0.00315825f, +-0.391175f,0.886683f,-0.246529f, +-0.44403f,0.793263f,-0.41662f, +-0.399761f,0.83626f,-0.375315f, +-0.422675f,0.841058f,-0.33759f, +-0.445112f,0.835127f,-0.323168f, +-0.410733f,0.898417f,-0.155389f, +-0.485628f,0.867891f,-0.104549f, +-0.491383f,0.859111f,-0.143077f, +-0.358033f,0.910383f,-0.207399f, +-0.0910122f,0.986127f,-0.138818f, +0.0820594f,0.995842f,-0.039567f, +-0.0287013f,0.999312f,-0.0234726f, +-0.346268f,0.933835f,0.0897299f, +-0.471073f,0.825151f,0.311795f, +-0.27505f,0.819541f,0.502693f, +-0.154238f,0.84574f,0.510818f, +0.0836929f,0.869512f,0.48677f, +0.266688f,0.84547f,0.462663f, +0.365749f,0.809921f,0.458537f, +0.371864f,0.832105f,0.411483f, +0.260242f,0.895369f,0.361371f, +0.283389f,0.903576f,0.321311f, +0.269874f,0.934168f,0.233448f, +0.265321f,0.957928f,0.10945f, +0.333071f,0.942841f,0.0106961f, +0.387903f,0.9217f,0.000193271f, +0.435792f,0.899834f,0.0195967f, +0.454676f,0.88982f,0.0386129f, +0.482276f,0.876019f,-0.000723308f, +0.505259f,0.860654f,-0.0631586f, +0.398328f,0.910448f,-0.111444f, +0.21929f,0.970647f,-0.0987756f, +0.0111053f,0.988208f,-0.152714f, +-0.210805f,0.943357f,-0.256201f, +-0.146846f,0.978658f,-0.143755f, +0.0139602f,0.999731f,-0.0184963f, +0.133096f,0.990721f,-0.0275154f, +0.2933f,0.953875f,0.0640122f, +0.228393f,0.945969f,0.230173f, +0.0546169f,0.969859f,0.237467f, +-0.0762534f,0.988779f,-0.128459f, +-0.106647f,0.982213f,-0.154543f, +-0.122396f,0.949634f,-0.28847f, +0.0920652f,0.954226f,-0.284566f, +0.185259f,0.946785f,-0.263206f, +0.232314f,0.960849f,-0.150996f, +0.169992f,0.979263f,-0.110207f, +0.125326f,0.980516f,-0.151267f, +0.149673f,0.98818f,-0.0331477f, +0.0238199f,0.989878f,0.139909f, +-0.107594f,0.981438f,0.158754f, +-0.0846643f,0.982313f,0.167013f, +-0.0375415f,0.970751f,0.237134f, +-0.0510768f,0.964816f,0.257917f, +-0.0443365f,0.980593f,0.190977f, +0.00242513f,0.997744f,0.0670872f, +0.124335f,0.983389f,0.132238f, +-0.00301992f,0.993206f,0.116332f, +-0.125192f,0.990103f,0.0634287f, +-0.100487f,0.994519f,-0.0288746f, +-0.101663f,0.992712f,-0.0647098f, +-0.139647f,0.987963f,-0.0665471f, +-0.130136f,0.990189f,-0.0508981f, +-0.0756901f,0.997123f,-0.00415316f, +-0.171558f,0.977059f,-0.126185f, +-0.351855f,0.892529f,-0.282117f, +-0.447333f,0.817645f,-0.362422f, +-0.423851f,0.857249f,-0.29236f, +-0.448058f,0.866215f,-0.221171f, +-0.531086f,0.820738f,-0.210565f, +-0.511898f,0.851158f,-0.116153f, +-0.425868f,0.900461f,-0.0883553f, +-0.399025f,0.900598f,-0.172345f, +-0.24223f,0.968919f,-0.0502012f, +-0.0663613f,0.996507f,0.0506899f, +-0.138021f,0.972657f,0.186782f, +-0.4139f,0.851097f,0.322987f, +-0.550512f,0.782849f,0.289973f, +-0.380287f,0.863038f,0.332486f, +-0.131533f,0.903571f,0.407748f, +0.119586f,0.9109f,0.394918f, +0.299052f,0.87558f,0.379379f, +0.370047f,0.8611f,0.348671f, +0.442832f,0.822723f,0.356408f, +0.35885f,0.890772f,0.278839f, +0.314791f,0.940053f,0.131179f, +0.339464f,0.925728f,0.166711f, +0.403599f,0.900778f,0.160334f, +0.45653f,0.889636f,-0.0113152f, +0.365242f,0.916509f,-0.163124f, +0.379822f,0.91652f,-0.125407f, +0.442125f,0.891797f,-0.096041f, +0.493888f,0.864551f,-0.0928755f, +0.541781f,0.83947f,-0.041994f, +0.441424f,0.894377f,-0.0723577f, +0.226514f,0.958331f,-0.174048f, +0.0664964f,0.969681f,-0.235153f, +-0.103823f,0.949537f,-0.295973f, +-0.233692f,0.889012f,-0.39376f, +-0.0987171f,0.939339f,-0.328477f, +0.103986f,0.972613f,-0.207871f, +0.198802f,0.974287f,-0.106033f, +0.0601774f,0.998175f,0.00500958f, +-0.0421158f,0.995212f,0.0882012f, +-0.0598721f,0.997785f,-0.0289851f, +-0.030607f,0.999125f,-0.0285146f, +-0.00697633f,0.993471f,-0.113875f, +0.0388611f,0.980882f,-0.190686f, +0.0977483f,0.98843f,-0.115983f, +0.15403f,0.986798f,-0.0500538f, +0.193054f,0.979913f,-0.0500083f, +0.157678f,0.98694f,-0.0329733f, +-0.0158549f,0.999428f,0.0298765f, +-0.0525571f,0.987534f,0.14837f, +0.000720533f,0.997813f,0.0660913f, +-0.102677f,0.99254f,-0.0657426f, +-0.099341f,0.994285f,-0.0391091f, +-0.0676495f,0.996952f,-0.0388727f, +0.0225146f,0.999293f,0.0301014f, +0.0577235f,0.997453f,0.0418936f, +-0.0269869f,0.999243f,0.0280361f, +0.00446401f,0.985157f,0.171599f, +-0.0141502f,0.990326f,0.138035f, +-0.00518586f,0.999975f,0.00477817f, +-0.0328139f,0.995381f,-0.09022f, +-0.128063f,0.971338f,-0.200254f, +-0.151852f,0.967914f,-0.200209f, +-0.0720493f,0.989055f,-0.128759f, +-0.0591129f,0.991504f,-0.115868f, +-0.248059f,0.943661f,-0.219024f, +-0.389946f,0.877483f,-0.279225f, +-0.523332f,0.810744f,-0.262332f, +-0.51839f,0.842544f,-0.146256f, +-0.550368f,0.815716f,-0.178051f, +-0.560732f,0.813038f,-0.156683f, +-0.427123f,0.899415f,-0.0928351f, +-0.366593f,0.924495f,-0.104494f, +-0.322547f,0.93696f,-0.134426f, +-0.128035f,0.99042f,-0.0517317f, +-0.291376f,0.953688f,0.0746902f, +-0.520094f,0.826135f,0.216802f, +-0.516864f,0.826474f,0.22314f, +-0.396988f,0.892552f,0.213897f, +-0.184148f,0.954818f,0.233263f, +0.0957205f,0.95579f,0.278034f, +0.314018f,0.892294f,0.32435f, +0.401668f,0.873128f,0.276243f, +0.463054f,0.857596f,0.223851f, +0.480022f,0.855973f,0.192066f, +0.375927f,0.916106f,0.13939f, +0.288789f,0.941864f,0.171735f, +0.396643f,0.909563f,0.123974f, +0.561623f,0.825897f,0.0497286f, +0.465605f,0.881752f,-0.0756653f, +0.370044f,0.915005f,-0.160728f, +0.427822f,0.898624f,-0.0971747f, +0.465206f,0.885137f,-0.0107503f, +0.468824f,0.88183f,0.0507874f, +0.478143f,0.868746f,0.12907f, +0.351411f,0.934208f,0.0613665f, +0.140442f,0.98844f,-0.0571117f, +-0.0122878f,0.991421f,-0.130131f, +-0.117862f,0.972142f,-0.202603f, +-0.15815f,0.947613f,-0.27752f, +-0.0729629f,0.95654f,-0.282325f, +0.0272484f,0.989771f,-0.14004f, +-0.0137333f,0.999563f,0.0261849f, +-0.0985129f,0.993299f,0.0604412f, +-0.135233f,0.990548f,-0.0229695f, +-0.0373153f,0.999264f,0.00888433f, +0.0352261f,0.99933f,0.00994916f, +0.061219f,0.99588f,0.0668911f, +0.0815695f,0.99444f,0.0665983f, +0.144386f,0.989424f,0.0139045f, +0.184662f,0.980318f,0.0698361f, +0.0224217f,0.989677f,0.14155f, +-0.0794321f,0.954058f,0.288901f, +-0.0304562f,0.959461f,0.280192f, +0.112423f,0.968918f,0.220359f, +0.0390938f,0.993037f,0.111126f, +-0.0885962f,0.9933f,-0.0741985f, +-0.0453085f,0.996418f,-0.0714089f, +-0.123875f,0.985221f,-0.118298f, +0.00670832f,0.999925f,0.010273f, +-0.0146906f,0.998569f,0.0514303f, +-0.0998092f,0.992773f,0.0666264f, +0.0466126f,0.990197f,0.131669f, +0.103009f,0.992862f,0.0601126f, +0.113553f,0.993084f,-0.0298385f, +-0.0128779f,0.975704f,-0.218713f, +-0.177855f,0.94662f,-0.268846f, +-0.191482f,0.955424f,-0.224722f, +-0.0532043f,0.987628f,-0.147512f, +-0.140744f,0.970833f,-0.194099f, +-0.387395f,0.889373f,-0.242778f, +-0.531553f,0.818908f,-0.216427f, +-0.531571f,0.799354f,-0.280115f, +-0.51407f,0.81292f,-0.273666f, +-0.549112f,0.793924f,-0.261078f, +-0.484709f,0.822384f,-0.297895f, +-0.322663f,0.926066f,-0.195678f, +-0.315438f,0.927311f,-0.201479f, +-0.289702f,0.947148f,-0.13778f, +-0.417457f,0.908684f,-0.00477603f, +-0.584599f,0.810188f,0.0428868f, +-0.55194f,0.828316f,0.0962071f, +-0.397599f,0.904432f,0.154656f, +-0.183216f,0.971572f,0.149931f, +0.0355131f,0.990243f,0.134751f, +0.298837f,0.942288f,0.150964f, +0.413659f,0.900634f,0.133206f, +0.498073f,0.828388f,0.256313f, +0.444018f,0.853405f,0.273035f, +0.327561f,0.881897f,0.339061f, +0.313826f,0.898686f,0.306392f, +0.495157f,0.851292f,0.173556f, +0.614747f,0.78345f,0.0910662f, +0.55187f,0.833866f,0.0103585f, +0.367713f,0.926545f,-0.0793776f, +0.311567f,0.950223f,0.00108255f, +0.382947f,0.917094f,0.110859f, +0.410945f,0.895808f,0.169272f, +0.455231f,0.858878f,0.234721f, +0.373673f,0.896264f,0.238911f, +0.246571f,0.935158f,0.254328f, +0.0808975f,0.990111f,0.114608f, +-0.0843211f,0.99633f,-0.0147289f, +-0.0859474f,0.994869f,-0.0533687f, +-0.0567528f,0.986639f,-0.152718f, +-0.104487f,0.984189f,-0.143019f, +-0.139027f,0.990289f,8.5057e-005f, +-0.137547f,0.987918f,0.0714029f, +-0.144256f,0.989201f,-0.0259182f, +-0.026694f,0.998838f,-0.0401331f, +-0.0313342f,0.99664f,-0.0756769f, +-0.0574884f,0.99781f,0.0327011f, +0.145005f,0.983413f,0.108961f, +0.119257f,0.992151f,0.0376122f, +0.0587452f,0.978725f,0.196585f, +-0.0803833f,0.947865f,0.308369f, +-0.127827f,0.919581f,0.371526f, +-0.00616421f,0.930831f,0.365399f, +0.107639f,0.912609f,0.394409f, +0.210572f,0.88729f,0.410336f, +0.0740329f,0.980065f,0.184368f, +-0.0250926f,0.999613f,0.0120275f, +-0.0610433f,0.996433f,-0.05826f, +-0.0708404f,0.994984f,-0.0706271f, +-0.0640037f,0.997923f,-0.00726403f, +-0.0949547f,0.99548f,0.00148231f, +0.00929451f,0.997943f,-0.0634315f, +0.147986f,0.988795f,-0.0195964f, +0.19874f,0.98001f,-0.00909425f, +0.119683f,0.99247f,-0.0260466f, +-0.140841f,0.984951f,-0.10018f, +-0.197496f,0.959342f,-0.201637f, +-0.0821482f,0.973605f,-0.212945f, +-0.090387f,0.978841f,-0.18358f, +-0.34459f,0.903344f,-0.255395f, +-0.465169f,0.833236f,-0.29889f, +-0.493353f,0.789348f,-0.365421f, +-0.529455f,0.773394f,-0.348624f, +-0.541108f,0.776645f,-0.322528f, +-0.503238f,0.814279f,-0.289312f, +-0.451111f,0.869282f,-0.202106f, +-0.405307f,0.906179f,-0.120689f, +-0.367499f,0.92846f,-0.0539062f, +-0.448648f,0.893437f,-0.0220131f, +-0.582415f,0.811815f,-0.0418214f, +-0.587857f,0.805915f,-0.0701802f, +-0.440963f,0.897524f,0.00144435f, +-0.150082f,0.985674f,0.0769547f, +0.0512849f,0.998035f,0.0359923f, +0.331471f,0.9412f,0.0653422f, +0.327057f,0.943418f,0.0547333f, +0.325027f,0.917755f,0.228216f, +0.374201f,0.856118f,0.35642f, +0.374565f,0.858588f,0.350039f, +0.460817f,0.854058f,0.241312f, +0.556465f,0.823608f,0.109619f, +0.63153f,0.770458f,0.0869767f, +0.587056f,0.806123f,0.074369f, +0.365958f,0.924908f,0.10305f, +0.26636f,0.954918f,0.131089f, +0.330741f,0.937061f,0.111923f, +0.358992f,0.918233f,0.167249f, +0.397317f,0.888574f,0.229294f, +0.378918f,0.890078f,0.253343f, +0.252398f,0.944302f,0.211161f, +0.242388f,0.947895f,0.206744f, +0.0865865f,0.99456f,0.0579091f, +-0.0181168f,0.990006f,-0.139854f, +0.0162661f,0.98021f,-0.197289f, +-0.148111f,0.960303f,-0.236394f, +-0.255052f,0.949006f,-0.185302f, +-0.211751f,0.971559f,-0.105997f, +-0.0120621f,0.994912f,-0.100021f, +-0.015173f,0.98959f,-0.143115f, +-0.0401151f,0.99847f,-0.0380528f, +-0.0979763f,0.995187f,0.00194195f, +0.0571375f,0.998251f,0.0151643f, +0.0776787f,0.976915f,0.199006f, +-0.101892f,0.95655f,0.273185f, +-0.133768f,0.938598f,0.318024f, +-0.177801f,0.93623f,0.303084f, +-0.022321f,0.922329f,0.385761f, +0.0333931f,0.905943f,0.422081f, +0.163361f,0.862964f,0.478127f, +0.305267f,0.821497f,0.481617f, +0.18106f,0.939243f,0.291615f, +-0.00700511f,0.992472f,0.122275f, +-0.0966012f,0.992994f,0.068052f, +-0.106034f,0.991731f,0.0722919f, +-0.0353039f,0.993084f,0.11197f, +0.0541772f,0.995603f,0.0764134f, +0.08347f,0.989853f,0.114994f, +0.130868f,0.975887f,0.174696f, +0.0723356f,0.969665f,0.23349f, +-0.0470347f,0.960948f,0.272703f, +-0.10077f,0.971805f,0.213169f, +-0.119566f,0.974584f,0.189448f, +-0.0774738f,0.965859f,0.247214f, +-0.198029f,0.968836f,0.1488f, +-0.435505f,0.897132f,-0.0740912f, +-0.502708f,0.857298f,-0.111019f, +-0.564282f,0.819749f,-0.0979722f, +-0.594236f,0.795147f,-0.120937f, +-0.591492f,0.803058f,-0.0723546f, +-0.526826f,0.849968f,-0.0029614f, +-0.410127f,0.912007f,0.00617969f, +-0.355675f,0.932755f,-0.0588432f, +-0.457125f,0.883759f,-0.100032f, +-0.544765f,0.834451f,-0.0832032f, +-0.554858f,0.819866f,-0.141253f, +-0.535218f,0.826621f,-0.173894f, +-0.203549f,0.978635f,-0.0289948f, +0.0668755f,0.997729f,0.00799418f, +0.247034f,0.968844f,0.017759f, +0.275407f,0.949712f,0.148988f, +0.19759f,0.950103f,0.241375f, +0.374575f,0.880138f,0.291635f, +0.446827f,0.865948f,0.224675f, +0.519968f,0.833624f,0.186291f, +0.587008f,0.786117f,0.193499f, +0.636373f,0.75334f,0.165857f, +0.540728f,0.822377f,0.176944f, +0.345338f,0.910903f,0.225828f, +0.278322f,0.945193f,0.170723f, +0.30876f,0.936535f,0.166043f, +0.303863f,0.916063f,0.261719f, +0.319419f,0.895614f,0.309591f, +0.43277f,0.828092f,0.356332f, +0.333077f,0.917687f,0.216587f, +0.219655f,0.964319f,0.147787f, +0.242228f,0.95005f,0.196802f, +0.204875f,0.978767f,-0.00640881f, +-0.000192716f,0.97566f,-0.219288f, +-0.0681124f,0.988809f,-0.132732f, +-0.241144f,0.919453f,-0.310573f, +-0.290276f,0.882193f,-0.370776f, +0.0292627f,0.97223f,-0.232189f, +-0.0803803f,0.976804f,-0.198478f, +-0.203999f,0.977793f,-0.0480039f, +-0.118856f,0.989202f,0.0857425f, +-0.0783112f,0.985397f,0.151198f, +-0.0878718f,0.938803f,0.333059f, +-0.083435f,0.948159f,0.30665f, +-0.110585f,0.962509f,0.247682f, +-0.186686f,0.943514f,0.273733f, +-0.149516f,0.932553f,0.32862f, +-0.00475332f,0.899494f,0.436906f, +0.0862131f,0.885009f,0.457522f, +0.277459f,0.815555f,0.507825f, +0.298118f,0.799955f,0.520766f, +0.14455f,0.869997f,0.471392f, +0.0121492f,0.942115f,0.335071f, +-0.0752209f,0.977077f,0.199154f, +-0.128636f,0.97789f,0.164878f, +-0.000660482f,0.945164f,0.326595f, +0.00550592f,0.919316f,0.393482f, +0.0803772f,0.905979f,0.415621f, +0.0810259f,0.907487f,0.412192f, +-0.090779f,0.919652f,0.382099f, +-0.137864f,0.897436f,0.419048f, +-0.130404f,0.886486f,0.444001f, +-0.0852724f,0.906321f,0.413897f, +-0.0259127f,0.906615f,0.421163f, +-0.225351f,0.915922f,0.332119f, +-0.462548f,0.869686f,0.172323f, +-0.572668f,0.816922f,0.0684804f, +-0.585929f,0.806118f,0.0828267f, +-0.593406f,0.803366f,0.0497268f, +-0.516762f,0.856027f,-0.0132014f, +-0.38427f,0.922646f,-0.0325731f, +-0.287245f,0.956724f,-0.0465863f, +-0.413146f,0.905396f,-0.097823f, +-0.564236f,0.818421f,-0.108744f, +-0.507227f,0.858315f,-0.0775611f, +-0.527754f,0.82927f,-0.183811f, +-0.354765f,0.918321f,-0.175582f, +0.0463007f,0.998926f,-0.00175561f, +0.214268f,0.976774f,0.00151756f, +0.165544f,0.983729f,0.0698077f, +0.096445f,0.982342f,0.16032f, +0.366991f,0.896711f,0.24744f, +0.500788f,0.845195f,0.186699f, +0.507012f,0.85355f,0.119965f, +0.542994f,0.824496f,0.159261f, +0.605757f,0.757486f,0.243463f, +0.532123f,0.786802f,0.312711f, +0.44869f,0.847812f,0.282652f, +0.34333f,0.935092f,0.0879082f, +0.24319f,0.961353f,0.129073f, +0.223708f,0.954136f,0.198946f, +0.276144f,0.94134f,0.193965f, +0.41277f,0.892522f,0.181731f, +0.485836f,0.856185f,0.175815f, +0.251109f,0.963495f,0.0928509f, +0.217377f,0.969921f,0.109544f, +0.402023f,0.911537f,0.0864706f, +0.0930878f,0.988366f,-0.120284f, +-0.0926141f,0.987658f,-0.126311f, +-0.0129498f,0.988134f,-0.153049f, +-0.0752509f,0.973537f,-0.215783f, +-0.167591f,0.970187f,-0.175075f, +-0.227938f,0.971032f,-0.0717025f, +-0.288377f,0.95589f,0.0557925f, +-0.2706f,0.959797f,0.0746015f, +-0.201821f,0.948409f,0.244517f, +-0.135104f,0.944724f,0.298737f, +0.0536332f,0.953012f,0.298147f, +-0.104499f,0.972769f,0.206883f, +-0.26012f,0.936243f,0.236192f, +-0.221301f,0.933098f,0.283468f, +-0.0976008f,0.934678f,0.341835f, +0.0488135f,0.920165f,0.388475f, +0.20566f,0.878417f,0.431379f, +0.294052f,0.82595f,0.480979f, +0.211093f,0.846234f,0.489211f, +0.1526f,0.86506f,0.477897f, +0.100541f,0.907805f,0.407163f, +-0.126416f,0.965258f,0.228683f, +-0.211306f,0.949302f,0.232755f, +-0.037039f,0.912463f,0.40748f, +0.117233f,0.908378f,0.401379f, +0.101997f,0.928038f,0.35825f, +-0.0502775f,0.939056f,0.340069f, +-0.158243f,0.952358f,0.260718f, +-0.125329f,0.958222f,0.257106f, +-0.051336f,0.956723f,0.286436f, +-0.0625203f,0.954305f,0.29222f, +-0.207996f,0.932703f,0.294623f, +-0.319481f,0.91161f,0.258649f, +-0.495077f,0.865137f,0.0802322f, +-0.579132f,0.814857f,-0.0247929f, +-0.549115f,0.83292f,-0.0686783f, +-0.493373f,0.86244f,-0.113053f, +-0.402759f,0.911225f,-0.0863345f, +-0.292096f,0.955556f,-0.0399004f, +-0.382523f,0.923047f,-0.0407488f, +-0.572187f,0.816414f,-0.0779103f, +-0.512485f,0.857517f,-0.0449819f, +-0.420369f,0.906318f,-0.0433336f, +-0.419207f,0.879291f,-0.22608f, +-0.129012f,0.980121f,-0.150729f, +0.168538f,0.98409f,0.056222f, +0.177285f,0.97778f,0.111881f, +0.0313595f,0.998166f,-0.0517722f, +0.266622f,0.963684f,-0.0150476f, +0.566513f,0.817464f,0.103999f, +0.539244f,0.841888f,0.0209898f, +0.503392f,0.861782f,0.0626771f, +0.548011f,0.825978f,0.132075f, +0.53464f,0.817691f,0.213407f, +0.52656f,0.822061f,0.21668f, +0.418461f,0.898681f,0.131391f, +0.217077f,0.97168f,0.0933593f, +0.230073f,0.97316f,0.00512693f, +0.352039f,0.933499f,-0.0681773f, +0.427612f,0.891089f,-0.152014f, +0.47402f,0.877861f,-0.0682997f, +0.292505f,0.956178f,-0.0128375f, +0.212998f,0.971167f,-0.107084f, +0.394409f,0.913171f,-0.102761f, +0.229015f,0.973422f,0.000912976f, +-0.0760893f,0.988509f,-0.130618f, +-0.0515625f,0.984716f,-0.166362f, +-0.0928406f,0.987408f,-0.128086f, +-0.200115f,0.967117f,0.156969f, +-0.29324f,0.941681f,0.165066f, +-0.336305f,0.919935f,0.201539f, +-0.298108f,0.921775f,0.247915f, +-0.262609f,0.920325f,0.289892f, +-0.146209f,0.952657f,0.266586f, +-0.00778438f,0.956339f,0.292158f, +-0.050022f,0.92665f,0.372583f, +-0.258705f,0.916977f,0.303687f, +-0.247478f,0.923305f,0.293706f, +-0.126717f,0.938107f,0.322331f, +0.0303988f,0.946862f,0.320201f, +0.135735f,0.944675f,0.298606f, +0.25669f,0.889672f,0.377616f, +0.215508f,0.868916f,0.44558f, +0.117717f,0.868155f,0.482129f, +0.172493f,0.853951f,0.490931f, +0.0744588f,0.909987f,0.407897f, +-0.203499f,0.942765f,0.264163f, +-0.165852f,0.956441f,0.240237f, +0.150303f,0.946565f,0.285349f, +0.126121f,0.955231f,0.267632f, +0.00383767f,0.957166f,0.289515f, +-0.0803601f,0.965694f,0.246937f, +-0.14415f,0.963474f,0.225698f, +-0.128772f,0.964294f,0.231421f, +-0.0634991f,0.964707f,0.255554f, +-0.15178f,0.96554f,0.211412f, +-0.290877f,0.950446f,0.109737f, +-0.365587f,0.928197f,0.069257f, +-0.512709f,0.855901f,-0.0675528f, +-0.522587f,0.843414f,-0.12472f, +-0.519355f,0.843468f,-0.13723f, +-0.458617f,0.886978f,-0.054221f, +-0.335795f,0.941914f,0.00633015f, +-0.354719f,0.934449f,0.0312872f, +-0.552854f,0.83289f,-0.025441f, +-0.550469f,0.834453f,-0.0259307f, +-0.388185f,0.921529f,-0.00983026f, +-0.282899f,0.957493f,-0.056358f, +-0.256814f,0.955751f,-0.143483f, +-0.0731312f,0.996697f,-0.0353254f, +0.211397f,0.967055f,0.141832f, +0.27554f,0.960583f,0.0368595f, +0.217196f,0.959783f,-0.177882f, +0.479261f,0.875236f,-0.0653524f, +0.513664f,0.856169f,0.0558883f, +0.446145f,0.882397f,0.149434f, +0.498219f,0.84712f,0.184837f, +0.503236f,0.827823f,0.247916f, +0.51285f,0.815024f,0.269666f, +0.506381f,0.824734f,0.251778f, +0.333663f,0.940706f,0.0611746f, +0.353215f,0.932965f,-0.069389f, +0.414309f,0.904024f,-0.105298f, +0.451897f,0.886486f,-0.0996557f, +0.345824f,0.933767f,-0.0921138f, +0.280994f,0.95917f,0.0321915f, +0.317081f,0.945948f,0.0681282f, +0.344866f,0.938141f,0.0309596f, +0.224406f,0.974203f,0.0238892f, +-0.0108486f,0.995761f,-0.0913323f, +-0.00158176f,0.998953f,-0.0457292f, +-0.115676f,0.985559f,-0.123663f, +-0.188171f,0.911466f,0.365816f, +-0.262724f,0.896783f,0.356029f, +-0.358149f,0.883197f,0.302807f, +-0.323424f,0.894918f,0.307438f, +-0.242922f,0.924564f,0.293548f, +-0.121147f,0.94907f,0.290844f, +-0.0341414f,0.951299f,0.306374f, +-0.132493f,0.945016f,0.298983f, +-0.194216f,0.905093f,0.378268f, +-0.212944f,0.914784f,0.343257f, +-0.127802f,0.956235f,0.263215f, +0.0483659f,0.968777f,0.243172f, +0.117573f,0.942608f,0.312517f, +0.164225f,0.89741f,0.409494f, +0.122313f,0.88201f,0.455081f, +0.101965f,0.875392f,0.472537f, +0.209339f,0.879095f,0.428217f, +0.174899f,0.892224f,0.416349f, +-0.060088f,0.941634f,0.331231f, +-0.120508f,0.975773f,0.182606f, +0.112168f,0.972734f,0.202994f, +0.117253f,0.950933f,0.286318f, +-0.0544328f,0.941394f,0.332887f, +-0.0790068f,0.915303f,0.394942f, +-0.127609f,0.917525f,0.376648f, +-0.0756868f,0.941409f,0.328666f, +-0.0332439f,0.958716f,0.282415f, +-0.0735168f,0.965505f,0.249792f, +-0.203882f,0.964791f,0.166163f, +-0.320453f,0.94269f,0.0929826f, +-0.471247f,0.881185f,0.0379224f, +-0.492278f,0.869051f,0.0491152f, +-0.532259f,0.846256f,-0.0234739f, +-0.499446f,0.866138f,-0.0189645f, +-0.373407f,0.92679f,-0.0403466f, +-0.352534f,0.935772f,-0.00715155f, +-0.527726f,0.848793f,-0.0324855f, +-0.520812f,0.852354f,-0.0474108f, +-0.409147f,0.909436f,-0.0743255f, +-0.294722f,0.955583f,0.000817458f, +-0.222255f,0.974321f,0.0360744f, +-0.14278f,0.989739f,0.00545783f, +0.112175f,0.992761f,0.0429195f, +0.349968f,0.931754f,0.0967357f, +0.338116f,0.939385f,0.056869f, +0.379594f,0.923814f,0.0497667f, +0.434257f,0.879279f,0.195674f, +0.391146f,0.89525f,0.213383f, +0.465582f,0.860371f,0.207352f, +0.429826f,0.860017f,0.274991f, +0.465148f,0.815034f,0.34548f, +0.575943f,0.73808f,0.351465f, +0.535537f,0.824709f,0.181813f, +0.414278f,0.908562f,-0.0537569f, +0.380258f,0.913027f,-0.147599f, +0.408447f,0.90132f,-0.144197f, +0.367806f,0.925659f,-0.0887431f, +0.142987f,0.986995f,-0.073455f, +0.215691f,0.972786f,0.0846483f, +0.373384f,0.916381f,0.144331f, +0.381582f,0.918997f,0.0991966f, +0.0727073f,0.993287f,-0.0899678f, +-0.0658262f,0.992454f,-0.103446f, +0.0138596f,0.999564f,-0.0260736f, +-0.215981f,0.852322f,0.47634f, +-0.206677f,0.845053f,0.493123f, +-0.272991f,0.879681f,0.389406f, +-0.267376f,0.924267f,0.272471f, +-0.22026f,0.956955f,0.189003f, +-0.175208f,0.966589f,0.187106f, +-0.043064f,0.959071f,0.279872f, +-0.116589f,0.955061f,0.272519f, +-0.310776f,0.922421f,0.229257f, +-0.169995f,0.929299f,0.32788f, +-0.0175005f,0.941141f,0.337561f, +0.0138751f,0.95035f,0.310874f, +-0.0519487f,0.924056f,0.37871f, +0.0171204f,0.875115f,0.483613f, +0.148666f,0.835016f,0.529761f, +0.187668f,0.864969f,0.465412f, +0.241037f,0.89408f,0.377521f, +0.22255f,0.900707f,0.373093f, +0.0517034f,0.945752f,0.320749f, +-0.0271248f,0.957046f,0.288665f, +0.0325916f,0.970401f,0.239289f, +0.0171507f,0.960836f,0.276588f, +-0.143534f,0.9275f,0.345169f, +-0.0983366f,0.916766f,0.38713f, +-0.0476997f,0.944806f,0.32414f, +-0.0337303f,0.946895f,0.319767f, +-0.0100366f,0.942379f,0.334396f, +-0.0544901f,0.938102f,0.342046f, +-0.14598f,0.916868f,0.371541f, +-0.23743f,0.904478f,0.354324f, +-0.411826f,0.87795f,0.244136f, +-0.481531f,0.866693f,0.130273f, +-0.469337f,0.874903f,0.119446f, +-0.452816f,0.890509f,0.0441746f, +-0.332275f,0.942324f,-0.0402274f, +-0.391441f,0.91825f,-0.0599172f, +-0.492183f,0.870395f,0.0129854f, +-0.540952f,0.839903f,-0.0439814f, +-0.452633f,0.891182f,0.0302916f, +-0.353037f,0.931758f,0.0848037f, +-0.230998f,0.971043f,0.0609518f, +-0.110559f,0.993184f,0.0368984f, +0.0985994f,0.994896f,-0.0214387f, +0.290703f,0.956813f,-0.000841556f, +0.306742f,0.941069f,0.142471f, +0.309512f,0.928678f,0.20435f, +0.393276f,0.890035f,0.23059f, +0.472781f,0.864565f,0.170309f, +0.455511f,0.888755f,0.0512287f, +0.387199f,0.912459f,0.13227f, +0.420125f,0.891345f,0.170293f, +0.568557f,0.791084f,0.225676f, +0.642678f,0.725845f,0.245181f, +0.61301f,0.785525f,0.0846683f, +0.519083f,0.833826f,-0.187849f, +0.390386f,0.832025f,-0.394123f, +0.254733f,0.897839f,-0.359161f, +0.0968538f,0.955535f,-0.278518f, +0.110338f,0.951183f,-0.288231f, +0.337547f,0.917961f,-0.20835f, +0.382401f,0.916771f,-0.115327f, +0.232755f,0.967238f,-0.101374f, +-0.075544f,0.963631f,-0.256338f, +-0.111861f,0.963998f,-0.241238f, +-0.403631f,0.823611f,0.398431f, +-0.211285f,0.853176f,0.476917f, +-0.0996818f,0.887327f,0.450237f, +-0.119017f,0.926423f,0.357178f, +-0.147962f,0.959424f,0.240027f, +-0.17904f,0.969453f,0.167646f, +-0.182698f,0.967757f,0.173402f, +-0.0875162f,0.935774f,0.341566f, +-0.247354f,0.926662f,0.283043f, +-0.269706f,0.932828f,0.238937f, +-0.116046f,0.932011f,0.34335f, +-0.054572f,0.895119f,0.442474f, +-0.0702883f,0.870311f,0.487462f, +-0.0238769f,0.872685f,0.4877f, +0.145141f,0.847062f,0.511292f, +0.26226f,0.839585f,0.475728f, +0.307436f,0.859155f,0.409067f, +0.272452f,0.896089f,0.35042f, +0.0602872f,0.949936f,0.306572f, +-0.0269541f,0.950357f,0.309992f, +0.110161f,0.964193f,0.241239f, +0.0112822f,0.980274f,0.19732f, +-0.201697f,0.957263f,0.207282f, +-0.0780713f,0.964435f,0.252529f, +0.00973745f,0.973101f,0.230172f, +-0.0755968f,0.981149f,0.177855f, +-0.0876613f,0.97114f,0.221817f, +-0.111729f,0.927016f,0.357991f, +-0.221124f,0.882386f,0.41533f, +-0.204491f,0.867297f,0.45385f, +-0.238609f,0.89578f,0.375026f, +-0.38933f,0.904206f,0.175592f, +-0.447525f,0.889442f,0.0928077f, +-0.421271f,0.9063f,0.0339399f, +-0.295839f,0.951557f,0.0837779f, +-0.40469f,0.90695f,0.116906f, +-0.500893f,0.852054f,0.152018f, +-0.539765f,0.838827f,0.0708671f, +-0.497421f,0.864837f,0.068037f, +-0.338953f,0.937284f,0.0813017f, +-0.178116f,0.975677f,0.127782f, +-0.0428295f,0.992057f,0.118272f, +0.176596f,0.983706f,0.0336999f, +0.217356f,0.975284f,-0.0397137f, +0.172156f,0.984981f,0.0131952f, +0.279801f,0.958586f,0.0531518f, +0.429228f,0.901897f,0.0484305f, +0.537427f,0.843269f,0.00840869f, +0.461159f,0.886671f,-0.0338697f, +0.347666f,0.937337f,0.022966f, +0.390524f,0.920568f,0.00669632f, +0.544615f,0.837115f,0.0513162f, +0.64737f,0.75903f,0.0691749f, +0.709483f,0.698136f,0.0961199f, +0.69002f,0.723355f,-0.0250988f, +0.510759f,0.819636f,-0.259464f, +0.161066f,0.87948f,-0.447854f, +0.0742832f,0.901252f,-0.426881f, +0.164688f,0.896506f,-0.411284f, +0.211827f,0.873436f,-0.43845f, +0.238498f,0.898773f,-0.367868f, +0.244991f,0.941894f,-0.229815f, +0.0339169f,0.959887f,-0.278328f, +-0.150927f,0.928909f,-0.338156f, +-0.262269f,0.839002f,0.47675f, +-0.199453f,0.89484f,0.39935f, +-0.0695117f,0.920513f,0.384478f, +-0.0794509f,0.922822f,0.376943f, +-0.0384813f,0.923599f,0.381424f, +-0.0906334f,0.946866f,0.308593f, +-0.231342f,0.940055f,0.250554f, +-0.228342f,0.910605f,0.344468f, +-0.168052f,0.897027f,0.408779f, +-0.249241f,0.920512f,0.300892f, +-0.201125f,0.932701f,0.29936f, +-0.156169f,0.918655f,0.362882f, +-0.101964f,0.881359f,0.461314f, +-0.0479674f,0.88379f,0.465418f, +0.160937f,0.878499f,0.449821f, +0.298148f,0.878819f,0.372539f, +0.363972f,0.843945f,0.394059f, +0.330687f,0.867316f,0.372033f, +0.109951f,0.941418f,0.318814f, +0.0530775f,0.967978f,0.245361f, +0.171035f,0.972595f,0.157499f, +0.0211384f,0.985036f,0.171048f, +-0.223743f,0.958122f,0.178723f, +-0.143003f,0.966115f,0.214875f, +0.0335442f,0.969798f,0.24159f, +0.00108957f,0.977785f,0.209606f, +-0.185748f,0.96522f,0.183978f, +-0.245345f,0.928456f,0.278881f, +-0.278935f,0.920412f,0.273928f, +-0.227379f,0.922009f,0.313367f, +-0.127558f,0.911679f,0.390603f, +-0.252363f,0.916101f,0.311563f, +-0.353299f,0.912723f,0.205222f, +-0.418007f,0.90407f,0.089031f, +-0.400603f,0.906481f,0.133452f, +-0.448512f,0.870078f,0.204452f, +-0.467166f,0.869433f,0.160757f, +-0.442544f,0.892618f,0.0859534f, +-0.465336f,0.885122f,-0.00451183f, +-0.389888f,0.920791f,0.0114409f, +-0.26105f,0.96208f,0.079086f, +-0.0611649f,0.990413f,0.123862f, +0.218817f,0.959555f,0.177126f, +0.289447f,0.944291f,0.156638f, +0.238555f,0.970242f,0.0415028f, +0.303951f,0.946528f,-0.108164f, +0.431424f,0.894504f,-0.117199f, +0.527248f,0.845956f,-0.0797999f, +0.433918f,0.900916f,0.0081213f, +0.311993f,0.948885f,0.0477355f, +0.430547f,0.901487f,0.0441572f, +0.533619f,0.845624f,-0.013065f, +0.634808f,0.772557f,-0.013228f, +0.691864f,0.721963f,0.00965866f, +0.719067f,0.694383f,0.0278453f, +0.653183f,0.756562f,0.0310991f, +0.386363f,0.918778f,-0.0810638f, +0.0570874f,0.970389f,-0.234704f, +0.136394f,0.961794f,-0.237379f, +0.31236f,0.906525f,-0.283977f, +0.169471f,0.890916f,-0.421365f, +0.117142f,0.913195f,-0.390323f, +0.0777866f,0.931625f,-0.354998f, +-0.0437682f,0.92941f,-0.366443f, +-0.144429f,0.859889f,0.489623f, +-0.0880742f,0.890372f,0.446633f, +-0.0314378f,0.923882f,0.381384f, +-0.0838814f,0.944139f,0.318693f, +-0.0693885f,0.945887f,0.316991f, +-0.0723769f,0.923178f,0.377496f, +-0.19706f,0.892458f,0.405815f, +-0.297386f,0.892332f,0.339566f, +-0.156962f,0.91638f,0.368254f, +-0.15276f,0.919794f,0.361447f, +-0.17017f,0.922781f,0.345714f, +-0.253151f,0.920843f,0.296586f, +-0.189094f,0.905109f,0.380816f, +0.00126887f,0.929197f,0.369582f, +0.193396f,0.936415f,0.292787f, +0.338227f,0.878943f,0.336247f, +0.32269f,0.878938f,0.351198f, +0.355444f,0.867037f,0.34915f, +0.217316f,0.918786f,0.329554f, +0.123007f,0.956146f,0.265807f, +0.19987f,0.950731f,0.236986f, +0.0209731f,0.979076f,0.202411f, +-0.247784f,0.961065f,0.122302f, +-0.158935f,0.979718f,0.122036f, +0.0602949f,0.986043f,0.155188f, +-0.0308065f,0.985867f,0.164674f, +-0.185866f,0.954971f,0.231267f, +-0.272851f,0.942767f,0.191682f, +-0.226832f,0.938998f,0.258516f, +-0.311155f,0.923351f,0.224958f, +-0.264965f,0.917378f,0.297004f, +-0.186536f,0.890461f,0.41507f, +-0.257136f,0.895376f,0.363569f, +-0.330368f,0.897563f,0.291955f, +-0.415623f,0.888172f,0.19598f, +-0.414839f,0.89462f,0.166025f, +-0.429244f,0.901932f,0.0476213f, +-0.370358f,0.92848f,0.0275516f, +-0.456696f,0.886215f,-0.0777874f, +-0.424934f,0.901633f,-0.0805556f, +-0.26755f,0.960865f,-0.0718042f, +-0.0958709f,0.992595f,-0.0745981f, +0.0853594f,0.996177f,0.0185983f, +0.317006f,0.925486f,0.207323f, +0.362438f,0.919121f,0.154455f, +0.423147f,0.903697f,0.0654098f, +0.439077f,0.898135f,-0.0237805f, +0.463592f,0.885685f,-0.0253961f, +0.432904f,0.900567f,0.0396714f, +0.274262f,0.960561f,-0.0458644f, +0.460874f,0.887433f,0.00757752f, +0.557878f,0.824691f,-0.0930446f, +0.608392f,0.791916f,-0.0522232f, +0.68605f,0.722282f,0.0874302f, +0.697187f,0.705867f,0.125228f, +0.597474f,0.77589f,0.202532f, +0.400677f,0.868028f,0.293233f, +0.18602f,0.951589f,0.244694f, +0.190924f,0.979879f,0.0581851f, +0.431268f,0.902043f,-0.01807f, +0.329374f,0.934061f,-0.137997f, +0.144406f,0.935772f,-0.321679f, +0.0779514f,0.92222f,-0.378727f, +-0.0417532f,0.914206f,-0.403093f, +-0.201619f,0.929423f,0.309066f, +-0.0738258f,0.948242f,0.308847f, +0.0288118f,0.952024f,0.304665f, +-0.00526808f,0.951397f,0.307922f, +-0.0992485f,0.952014f,0.289515f, +-0.179425f,0.914994f,0.361376f, +-0.223397f,0.866943f,0.445538f, +-0.185005f,0.868122f,0.460584f, +-0.180405f,0.90051f,0.395646f, +-0.165976f,0.891215f,0.422122f, +-0.142635f,0.91411f,0.37955f, +-0.196593f,0.942079f,0.271733f, +-0.231892f,0.955708f,0.181242f, +0.0754625f,0.968764f,0.236224f, +0.189929f,0.95814f,0.214232f, +0.245783f,0.922809f,0.29667f, +0.350212f,0.885135f,0.30641f, +0.361791f,0.894635f,0.262174f, +0.218601f,0.892888f,0.393656f, +0.122578f,0.888731f,0.441737f, +0.221602f,0.877963f,0.42435f, +0.113111f,0.927784f,0.355561f, +-0.0962286f,0.967788f,0.232652f, +-0.169743f,0.984124f,0.0518298f, +0.00440837f,0.997134f,0.0755295f, +-0.0780505f,0.992255f,0.096638f, +-0.206915f,0.971074f,0.119173f, +-0.298261f,0.946469f,0.123437f, +-0.365054f,0.904843f,0.219077f, +-0.255666f,0.897337f,0.35975f, +-0.290965f,0.914197f,0.282104f, +-0.292271f,0.916518f,0.27308f, +-0.219619f,0.919339f,0.326472f, +-0.256286f,0.928086f,0.270137f, +-0.310598f,0.93305f,0.18151f, +-0.350728f,0.934452f,0.0615507f, +-0.388138f,0.92156f,0.00876308f, +-0.343471f,0.93847f,0.0360903f, +-0.339947f,0.939272f,-0.0469463f, +-0.382902f,0.903055f,-0.19462f, +-0.249239f,0.929446f,-0.272047f, +-0.147764f,0.944907f,-0.29209f, +-0.0668186f,0.978447f,-0.19539f, +0.17553f,0.981686f,-0.0740426f, +0.388973f,0.921211f,-0.00833323f, +0.44678f,0.894539f,-0.0136777f, +0.47739f,0.878112f,-0.0318964f, +0.465567f,0.884409f,-0.0326842f, +0.484387f,0.873859f,-0.0417148f, +0.315003f,0.932104f,-0.178762f, +0.426472f,0.898104f,-0.107381f, +0.587094f,0.80929f,-0.0192587f, +0.491946f,0.869904f,0.0354452f, +0.550379f,0.808299f,0.209131f, +0.597166f,0.706874f,0.379107f, +0.503286f,0.706664f,0.497322f, +0.349603f,0.761935f,0.545191f, +0.317931f,0.791281f,0.522298f, +0.357034f,0.859818f,0.365021f, +0.457671f,0.859336f,0.22821f, +0.436038f,0.880267f,0.187085f, +0.291237f,0.949467f,0.117016f, +0.172846f,0.983353f,0.0560389f, +0.00924155f,0.999014f,-0.043417f, +-0.112379f,0.966854f,0.22927f, +-0.0543436f,0.980353f,0.189616f, +0.0014105f,0.977032f,0.213089f, +-0.0810261f,0.954455f,0.287143f, +-0.162384f,0.905883f,0.391161f, +-0.248623f,0.850337f,0.463803f, +-0.272281f,0.829594f,0.48748f, +-0.210534f,0.842738f,0.495447f, +-0.142516f,0.845822f,0.514076f, +-0.128959f,0.864859f,0.485168f, +-0.000520612f,0.895905f,0.444245f, +0.00320439f,0.940529f,0.339698f, +-0.169376f,0.979765f,0.106637f, +-0.0517963f,0.994886f,0.0867084f, +0.124214f,0.955178f,0.268711f, +0.208945f,0.916166f,0.342027f, +0.39407f,0.858275f,0.328745f, +0.248342f,0.913565f,0.322063f, +0.031165f,0.861455f,0.506877f, +0.0654094f,0.812115f,0.57982f, +0.246891f,0.786687f,0.565834f, +0.230643f,0.834381f,0.500612f, +0.069509f,0.924157f,0.375637f, +0.0080049f,0.977951f,0.208681f, +-0.0216545f,0.998818f,0.043521f, +-0.0416834f,0.994806f,0.0928633f, +-0.209164f,0.977378f,0.0313447f, +-0.33727f,0.941399f,0.00405643f, +-0.445763f,0.895148f,-0.00236945f, +-0.379089f,0.924127f,0.0477591f, +-0.212534f,0.958583f,0.189598f, +-0.289703f,0.944216f,0.156615f, +-0.225857f,0.954875f,0.19288f, +-0.19812f,0.968114f,0.153308f, +-0.225491f,0.970896f,0.0807165f, +-0.268028f,0.963292f,-0.0151842f, +-0.386115f,0.917249f,-0.0978197f, +-0.332792f,0.935954f,-0.115065f, +-0.223332f,0.957817f,-0.180856f, +-0.272615f,0.913397f,-0.302304f, +-0.182015f,0.92061f,-0.345468f, +-0.156497f,0.91949f,-0.36062f, +-0.125465f,0.931751f,-0.340733f, +0.1054f,0.935905f,-0.336114f, +0.348771f,0.906917f,-0.236346f, +0.444797f,0.880373f,-0.164617f, +0.451025f,0.885434f,-0.112171f, +0.467976f,0.880983f,-0.0697667f, +0.499335f,0.858868f,-0.114062f, +0.349601f,0.930335f,-0.110707f, +0.307802f,0.944888f,-0.11156f, +0.473394f,0.878106f,0.0694821f, +0.43441f,0.869457f,0.23523f, +0.41901f,0.855868f,0.303184f, +0.452664f,0.775597f,0.439937f, +0.432369f,0.72522f,0.535829f, +0.415514f,0.737038f,0.533032f, +0.381011f,0.793693f,0.474217f, +0.445314f,0.773558f,0.450892f, +0.520117f,0.767192f,0.375359f, +0.457464f,0.838846f,0.295064f, +0.276432f,0.924946f,0.260884f, +0.199394f,0.937964f,0.283664f, +0.190897f,0.927436f,0.32159f, +-0.0705492f,0.959049f,0.274315f, +-0.0655623f,0.961527f,0.266772f, +-0.0518964f,0.943387f,0.32761f, +-0.202287f,0.906319f,0.371032f, +-0.245861f,0.842829f,0.478739f, +-0.310342f,0.836362f,0.451869f, +-0.256381f,0.850522f,0.459219f, +-0.198762f,0.867072f,0.456815f, +-0.12379f,0.863897f,0.48822f, +-0.0469651f,0.900623f,0.432056f, +-8.11553e-005f,0.943721f,0.330744f, +0.129628f,0.925055f,0.357028f, +0.0340614f,0.966037f,0.256151f, +-0.0890995f,0.983963f,0.154524f, +-0.0322587f,0.981394f,0.189278f, +0.138447f,0.956229f,0.257794f, +0.317932f,0.883665f,0.343592f, +0.154174f,0.859961f,0.486516f, +-0.0823702f,0.837125f,0.540774f, +0.067942f,0.838652f,0.540413f, +0.256779f,0.806501f,0.532561f, +0.317316f,0.771073f,0.552047f, +0.228943f,0.837474f,0.496208f, +0.221417f,0.908583f,0.354192f, +0.0661321f,0.986936f,0.146917f, +-0.101631f,0.981129f,0.164493f, +-0.140334f,0.967949f,0.20828f, +-0.26644f,0.954208f,0.136f, +-0.376833f,0.92539f,0.0406146f, +-0.423125f,0.902479f,-0.0805992f, +-0.378547f,0.924929f,-0.0347556f, +-0.294214f,0.950388f,0.101004f, +-0.253707f,0.966868f,0.0282789f, +-0.1425f,0.989661f,0.0162607f, +-0.152778f,0.987285f,-0.0438961f, +-0.226417f,0.971142f,-0.0749508f, +-0.278106f,0.959626f,-0.0421373f, +-0.315252f,0.936348f,-0.154492f, +-0.13807f,0.983353f,-0.118124f, +-0.169891f,0.968928f,-0.179762f, +-0.200272f,0.947942f,-0.247583f, +-0.182846f,0.93983f,-0.288594f, +-0.0836086f,0.941177f,-0.327408f, +0.0732417f,0.918516f,-0.388542f, +0.208177f,0.929929f,-0.303139f, +0.350352f,0.926406f,-0.137933f, +0.401951f,0.914196f,-0.0517823f, +0.448456f,0.893661f,-0.0160636f, +0.515556f,0.856358f,0.0291996f, +0.347689f,0.937245f,0.0261378f, +0.255909f,0.965329f,0.0514824f, +0.382053f,0.909938f,0.161395f, +0.340926f,0.922929f,0.178808f, +0.312845f,0.910786f,0.269439f, +0.364196f,0.849776f,0.381106f, +0.45928f,0.814969f,0.353394f, +0.52951f,0.800019f,0.282116f, +0.449914f,0.855375f,0.256731f, +0.454599f,0.838858f,0.299428f, +0.555327f,0.766362f,0.322957f, +0.54417f,0.781393f,0.305455f, +0.357615f,0.911759f,0.202005f, +0.139813f,0.972952f,0.183891f, +0.109083f,0.950848f,0.289808f, +-0.192892f,0.944314f,0.266579f, +-0.117537f,0.919218f,0.375796f, +-0.132138f,0.875254f,0.465263f, +-0.253971f,0.812679f,0.524453f, +-0.263136f,0.777105f,0.571723f, +-0.18663f,0.797568f,0.573633f, +-0.239071f,0.855961f,0.458449f, +-0.228946f,0.872463f,0.431732f, +-0.154745f,0.876861f,0.455159f, +0.0511929f,0.876307f,0.479025f, +0.079622f,0.902874f,0.422468f, +0.0999946f,0.903351f,0.417083f, +0.103272f,0.908778f,0.404299f, +-0.0300958f,0.943633f,0.329622f, +-0.0276233f,0.954592f,0.296632f, +0.0865379f,0.944508f,0.316884f, +0.19572f,0.915809f,0.350694f, +0.0629871f,0.902785f,0.425456f, +-0.0973105f,0.893058f,0.439293f, +0.0850344f,0.884912f,0.45793f, +0.226219f,0.859273f,0.458775f, +0.265876f,0.822998f,0.50198f, +0.299522f,0.800365f,0.519329f, +0.365936f,0.804413f,0.467986f, +0.167843f,0.908094f,0.383659f, +-0.151292f,0.923022f,0.353753f, +-0.16349f,0.897488f,0.409618f, +-0.164454f,0.89713f,0.410016f, +-0.256833f,0.931773f,0.256583f, +-0.308509f,0.944441f,0.11337f, +-0.397192f,0.916896f,-0.0392391f, +-0.321804f,0.945652f,-0.046751f, +-0.145617f,0.989197f,-0.0168656f, +-0.117605f,0.989571f,-0.083174f, +-0.131213f,0.988938f,-0.0691672f, +-0.264465f,0.964357f,-0.00857016f, +-0.279285f,0.95849f,0.0574115f, +-0.308064f,0.950873f,-0.0306128f, +-0.232189f,0.97071f,0.0617333f, +-0.126956f,0.977263f,0.169823f, +-0.134913f,0.981643f,0.134817f, +-0.0643092f,0.996192f,0.0588766f, +-0.0179518f,0.989177f,-0.145623f, +0.100718f,0.978365f,-0.180716f, +0.107842f,0.981772f,-0.156502f, +0.235537f,0.96668f,-0.100264f, +0.400696f,0.915349f,-0.0397433f, +0.382123f,0.921514f,-0.0692327f, +0.451191f,0.890657f,0.0561954f, +0.368356f,0.915308f,0.162865f, +0.16123f,0.974745f,0.154523f, +0.326647f,0.914341f,0.239337f, +0.365189f,0.91282f,0.182749f, +0.230086f,0.959458f,0.162792f, +0.336546f,0.918886f,0.205876f, +0.545838f,0.824177f,0.150977f, +0.544526f,0.829407f,0.124801f, +0.442013f,0.862414f,0.24671f, +0.417167f,0.87901f,0.230894f, +0.525918f,0.823184f,0.213956f, +0.591278f,0.763502f,0.259719f, +0.412761f,0.877728f,0.243355f, +0.079495f,0.961838f,0.261818f, +-0.108191f,0.959339f,0.260698f, +-0.395968f,0.898347f,0.190215f, +-0.315805f,0.885393f,0.341095f, +-0.255081f,0.831656f,0.493236f, +-0.32798f,0.786298f,0.523607f, +-0.31899f,0.766541f,0.557369f, +-0.160414f,0.763167f,0.625974f, +-0.0711111f,0.771377f,0.632393f, +-0.143173f,0.825852f,0.545409f, +-0.172278f,0.854223f,0.490534f, +0.0123154f,0.838365f,0.544971f, +0.0830743f,0.830631f,0.550592f, +0.0507686f,0.835031f,0.547855f, +0.149519f,0.800804f,0.579962f, +0.0893025f,0.847618f,0.523038f, +-0.0238205f,0.893087f,0.449253f, +0.0209713f,0.900623f,0.434095f, +0.182588f,0.867377f,0.462945f, +0.0933756f,0.88802f,0.450223f, +-0.0988317f,0.917919f,0.384262f, +0.0323919f,0.922001f,0.38583f, +0.205498f,0.882674f,0.422678f, +0.228981f,0.875897f,0.424702f, +0.330967f,0.833446f,0.442526f, +0.386545f,0.82285f,0.416534f, +0.244254f,0.85459f,0.458275f, +-0.128515f,0.915454f,0.381351f, +-0.221592f,0.919582f,0.324447f, +-0.103305f,0.941351f,0.321226f, +-0.0534104f,0.960954f,0.271504f, +-0.164863f,0.980806f,0.104112f, +-0.239884f,0.970598f,-0.0198681f, +-0.303213f,0.937604f,-0.170178f, +-0.252015f,0.951441f,-0.176773f, +-0.108694f,0.994072f,0.00232095f, +-0.192935f,0.981013f,0.0197642f, +-0.322908f,0.946132f,0.0237552f, +-0.269028f,0.963107f,-0.00704542f, +-0.230013f,0.973161f,0.00722315f, +-0.357365f,0.933662f,-0.0237822f, +-0.204315f,0.973479f,0.102922f, +-0.115797f,0.983778f,0.137007f, +0.0200406f,0.991033f,0.132107f, +0.176509f,0.981212f,0.0778953f, +0.102914f,0.991977f,-0.0734239f, +0.103634f,0.990563f,-0.0896973f, +0.246302f,0.962545f,-0.113327f, +0.365449f,0.921945f,-0.12831f, +0.388572f,0.919102f,-0.0652967f, +0.33675f,0.940592f,-0.0434361f, +0.294334f,0.951251f,0.0921318f, +0.170376f,0.973956f,0.149605f, +0.291052f,0.946977f,0.136102f, +0.448607f,0.879963f,0.156258f, +0.275208f,0.960522f,0.0407201f, +0.320727f,0.94717f,-0.00171267f, +0.563867f,0.822582f,0.0735748f, +0.458264f,0.882692f,0.104155f, +0.35932f,0.917336f,0.171414f, +0.473577f,0.85831f,0.197555f, +0.552768f,0.818756f,0.155195f, +0.56022f,0.811568f,0.165865f, +0.410483f,0.877955f,0.246373f, +0.119318f,0.965792f,0.230239f, +-0.0302464f,0.98755f,0.15437f, +-0.434902f,0.821345f,0.369123f, +-0.425801f,0.804682f,0.41374f, +-0.330648f,0.807018f,0.489278f, +-0.341863f,0.793213f,0.503928f, +-0.356504f,0.786512f,0.504286f, +-0.269874f,0.813284f,0.515498f, +-0.0937663f,0.786137f,0.610898f, +-0.0122488f,0.782782f,0.622176f, +-0.145176f,0.838097f,0.525849f, +-0.0659853f,0.863648f,0.499758f, +0.0911511f,0.81559f,0.571406f, +0.0567409f,0.801208f,0.59569f, +0.110855f,0.801019f,0.588286f, +0.153854f,0.799367f,0.580811f, +0.0810561f,0.837494f,0.540401f, +0.0627084f,0.873537f,0.482702f, +0.153028f,0.87118f,0.466506f, +0.121758f,0.869515f,0.478663f, +-0.0139367f,0.889364f,0.456987f, +0.0116753f,0.909652f,0.415206f, +0.182976f,0.873078f,0.451946f, +0.230254f,0.874104f,0.427698f, +0.299542f,0.853577f,0.42624f, +0.365816f,0.815944f,0.447677f, +0.258135f,0.828321f,0.497243f, +0.0438733f,0.899999f,0.433678f, +-0.113551f,0.976415f,0.183628f, +-0.115165f,0.991964f,0.0523877f, +-0.0427249f,0.989973f,0.134639f, +-0.000526251f,0.987641f,0.156735f, +-0.182878f,0.982656f,-0.0306907f, +-0.187196f,0.982029f,-0.0240342f, +-0.272847f,0.956238f,-0.105656f, +-0.292658f,0.95046f,-0.104775f, +-0.178909f,0.983865f,0.00116467f, +-0.22078f,0.973898f,-0.0527095f, +-0.269354f,0.950491f,-0.154966f, +-0.262457f,0.956005f,-0.131038f, +-0.333574f,0.929233f,-0.158915f, +-0.27846f,0.93913f,-0.201231f, +-0.105722f,0.98028f,-0.166954f, +-0.03086f,0.983393f,-0.178845f, +0.166296f,0.985117f,-0.0434662f, +0.22991f,0.973119f,0.0134671f, +0.156605f,0.983722f,-0.0881293f, +0.276714f,0.94824f,-0.155787f, +0.32696f,0.929339f,-0.171541f, +0.339039f,0.938238f,-0.0690071f, +0.308789f,0.948131f,-0.0754727f, +0.23717f,0.967343f,-0.0894326f, +0.163558f,0.982662f,-0.0873214f, +0.252735f,0.966333f,-0.0482272f, +0.434287f,0.896865f,0.0838305f, +0.398093f,0.912104f,0.0979158f, +0.320154f,0.94669f,-0.0357668f, +0.45783f,0.889003f,0.00810452f, +0.504235f,0.85135f,0.144742f, +0.385352f,0.920157f,0.0693918f, +0.466232f,0.882239f,0.0654287f, +0.538345f,0.833943f,0.121343f, +0.517827f,0.838051f,0.171829f, +0.46128f,0.862173f,0.209471f, +0.229103f,0.969676f,0.085091f, +0.119821f,0.992172f,0.0351865f, +-0.316654f,0.75101f,0.579409f, +-0.356062f,0.779142f,0.515904f, +-0.357471f,0.814286f,0.457331f, +-0.357809f,0.798452f,0.484198f, +-0.344344f,0.806376f,0.480818f, +-0.279175f,0.813317f,0.510467f, +-0.188283f,0.817533f,0.544233f, +0.0108927f,0.825394f,0.564451f, +0.000505664f,0.854739f,0.519058f, +-0.0291193f,0.899152f,0.436667f, +-0.043893f,0.902469f,0.428513f, +-0.00142614f,0.854428f,0.519568f, +0.10644f,0.82426f,0.556117f, +0.17821f,0.772022f,0.610101f, +0.155558f,0.792656f,0.58949f, +0.103298f,0.851042f,0.514837f, +0.136998f,0.86222f,0.487656f, +0.128814f,0.846529f,0.516522f, +0.0086465f,0.861582f,0.507544f, +0.0126115f,0.865086f,0.501464f, +0.152876f,0.854998f,0.495588f, +0.261992f,0.846686f,0.463122f, +0.298132f,0.855648f,0.423065f, +0.330245f,0.846388f,0.417811f, +0.241868f,0.85891f,0.451412f, +0.243399f,0.870337f,0.428102f, +0.218863f,0.950296f,0.221442f, +-0.0230145f,0.994562f,-0.101567f, +-0.18143f,0.968994f,-0.167732f, +-0.00536077f,0.999859f,-0.0158957f, +-0.0149312f,0.999841f,-0.00972481f, +-0.248945f,0.961384f,-0.11733f, +-0.206226f,0.978121f,-0.0273758f, +-0.251569f,0.958037f,-0.137399f, +-0.215501f,0.957565f,-0.191386f, +-0.183194f,0.972176f,-0.145991f, +-0.242363f,0.956164f,-0.164351f, +-0.223675f,0.959477f,-0.171387f, +-0.263678f,0.929229f,-0.25886f, +-0.190809f,0.923444f,-0.332932f, +-0.125476f,0.902264f,-0.412524f, +-0.0800599f,0.931052f,-0.355994f, +0.00289679f,0.952892f,-0.303297f, +0.173027f,0.965415f,-0.195025f, +0.23552f,0.951626f,-0.197328f, +0.324166f,0.90746f,-0.26727f, +0.272213f,0.920502f,-0.280314f, +0.263103f,0.942676f,-0.205278f, +0.331376f,0.931643f,-0.1491f, +0.273621f,0.957062f,-0.0957296f, +0.174678f,0.976512f,-0.126141f, +0.162465f,0.97193f,-0.170168f, +0.285207f,0.956722f,-0.0577913f, +0.392887f,0.912166f,0.116586f, +0.413213f,0.901715f,0.127138f, +0.444428f,0.894805f,0.0425078f, +0.482399f,0.875952f,0.000225918f, +0.414394f,0.908379f,-0.0559034f, +0.421361f,0.906852f,-0.00856344f, +0.501069f,0.86151f,0.0820434f, +0.492896f,0.86226f,0.116453f, +0.497628f,0.854344f,0.149874f, +0.327901f,0.939568f,0.0984569f, +0.134608f,0.990256f,0.0356963f, +-0.115732f,0.781457f,0.613132f, +-0.224646f,0.82464f,0.519137f, +-0.330602f,0.837584f,0.434919f, +-0.37055f,0.826801f,0.423193f, +-0.389755f,0.836631f,0.38489f, +-0.35019f,0.83732f,0.419835f, +-0.192063f,0.866433f,0.460875f, +0.0577661f,0.893053f,0.446228f, +0.0715028f,0.909685f,0.409097f, +0.0355467f,0.937027f,0.347443f, +-0.0473295f,0.949618f,0.309815f, +-0.0714543f,0.946618f,0.31434f, +0.0109848f,0.930588f,0.365903f, +0.0306039f,0.876434f,0.480548f, +0.171338f,0.790427f,0.588106f, +0.228263f,0.773415f,0.591376f, +0.15062f,0.839076f,0.522748f, +0.0933237f,0.852392f,0.514508f, +0.0403687f,0.864191f,0.501542f, +0.0159293f,0.89067f,0.454371f, +0.162582f,0.873944f,0.458028f, +0.324998f,0.838057f,0.438219f, +0.361417f,0.861814f,0.355886f, +0.357364f,0.88789f,0.289727f, +0.288052f,0.920034f,0.265637f, +0.274707f,0.932706f,0.233657f, +0.415911f,0.867317f,0.273456f, +0.214502f,0.965967f,0.144559f, +-0.0739208f,0.997262f,-0.00212715f, +-0.130316f,0.972201f,-0.194533f, +0.00262571f,0.981048f,-0.193747f, +-0.190851f,0.93935f,-0.284951f, +-0.250649f,0.92646f,-0.280798f, +-0.16238f,0.957944f,-0.236595f, +-0.204897f,0.9457f,-0.252327f, +-0.246487f,0.945291f,-0.213705f, +-0.204741f,0.966747f,-0.153234f, +-0.173965f,0.952924f,-0.248341f, +-0.185492f,0.924696f,-0.332461f, +-0.120486f,0.929748f,-0.347926f, +-0.0981061f,0.932335f,-0.348033f, +-0.143961f,0.923839f,-0.354678f, +-0.0348514f,0.936175f,-0.349804f, +0.141193f,0.941481f,-0.306069f, +0.298926f,0.908144f,-0.293117f, +0.339558f,0.869399f,-0.35895f, +0.236934f,0.893673f,-0.381064f, +0.188986f,0.916304f,-0.353088f, +0.222126f,0.937284f,-0.268624f, +0.165461f,0.966952f,-0.193976f, +0.194618f,0.975642f,-0.101229f, +0.225585f,0.970105f,-0.0894815f, +0.18757f,0.970367f,-0.152331f, +0.271776f,0.9587f,-0.0838549f, +0.390134f,0.920749f,0.00399703f, +0.487191f,0.870564f,0.0690114f, +0.567845f,0.821826f,0.0464111f, +0.430596f,0.898843f,-0.0816633f, +0.345462f,0.936301f,-0.063213f, +0.439054f,0.898457f,0.0025505f, +0.485886f,0.873093f,0.040301f, +0.468523f,0.882438f,0.0422951f, +0.395695f,0.916215f,0.0630502f, +0.224264f,0.974198f,-0.0253916f, +-0.04074f,0.869731f,0.491842f, +-0.147521f,0.861626f,0.485632f, +-0.290306f,0.828918f,0.47814f, +-0.344291f,0.81826f,0.460342f, +-0.325822f,0.848235f,0.417537f, +-0.347006f,0.892025f,0.289618f, +-0.23289f,0.9484f,0.215175f, +0.0826503f,0.953848f,0.288692f, +0.0849803f,0.942357f,0.323639f, +0.0946367f,0.912864f,0.397143f, +0.0188563f,0.944615f,0.327637f, +-0.0844647f,0.976435f,0.198596f, +-0.0480441f,0.982086f,0.182207f, +-0.108246f,0.969423f,0.220233f, +0.0163534f,0.944153f,0.329102f, +0.218936f,0.864112f,0.453186f, +0.243602f,0.846524f,0.473344f, +0.157715f,0.898021f,0.410713f, +0.124101f,0.930824f,0.343753f, +0.0887369f,0.958556f,0.270731f, +0.13199f,0.965856f,0.222935f, +0.34996f,0.900513f,0.258077f, +0.45204f,0.856515f,0.249081f, +0.434574f,0.879659f,0.19325f, +0.307812f,0.936972f,0.165332f, +0.238408f,0.942387f,0.234669f, +0.292411f,0.883524f,0.365897f, +0.235944f,0.851222f,0.468777f, +0.0834983f,0.888208f,0.45179f, +0.120252f,0.948234f,0.293925f, +0.107426f,0.988487f,0.106553f, +-0.0604958f,0.997925f,0.0220282f, +-0.22861f,0.965114f,-0.127644f, +-0.213845f,0.934088f,-0.285919f, +-0.236679f,0.925441f,-0.295876f, +-0.274282f,0.922231f,-0.272506f, +-0.200442f,0.934584f,-0.293896f, +-0.0905439f,0.955043f,-0.282301f, +-0.107977f,0.974204f,-0.198159f, +-0.176859f,0.954188f,-0.241343f, +-0.109412f,0.961464f,-0.252221f, +-0.0832631f,0.934053f,-0.347292f, +-0.0389646f,0.894623f,-0.44512f, +0.0844722f,0.90285f,-0.421576f, +0.278944f,0.884527f,-0.373902f, +0.405411f,0.845478f,-0.347577f, +0.241979f,0.880406f,-0.407837f, +0.10107f,0.917999f,-0.383487f, +0.153454f,0.950374f,-0.270631f, +0.150056f,0.964994f,-0.215103f, +0.116981f,0.964373f,-0.237277f, +0.171185f,0.966068f,-0.19341f, +0.269303f,0.954896f,-0.1251f, +0.246577f,0.939836f,-0.236448f, +0.325998f,0.915178f,-0.237011f, +0.400262f,0.89707f,-0.18723f, +0.540095f,0.838463f,-0.0726465f, +0.4591f,0.888384f,0.000734802f, +0.350121f,0.936701f,0.00262749f, +0.415959f,0.907987f,-0.0503785f, +0.469999f,0.882626f,-0.00849165f, +0.46759f,0.883776f,0.0172864f, +0.444948f,0.895095f,0.0287648f, +0.38429f,0.923043f,-0.0176926f, +-0.184131f,0.893945f,0.408605f, +-0.22256f,0.84592f,0.484651f, +-0.306803f,0.799127f,0.516979f, +-0.327467f,0.825975f,0.458836f, +-0.215523f,0.873324f,0.43687f, +-0.122358f,0.93676f,0.327886f, +-0.214245f,0.969738f,0.117081f, +0.00165628f,0.984816f,0.173596f, +-0.0471807f,0.97232f,0.228838f, +-0.042786f,0.929182f,0.367137f, +0.159108f,0.885534f,0.43648f, +0.0848362f,0.945025f,0.315803f, +-0.0323525f,0.969808f,0.241716f, +-0.0998895f,0.964402f,0.244849f, +-0.0727123f,0.986494f,0.146772f, +0.121392f,0.97688f,0.175982f, +0.260802f,0.928486f,0.264378f, +0.24004f,0.922405f,0.302572f, +0.162896f,0.94112f,0.296239f, +0.158069f,0.936377f,0.313389f, +0.18876f,0.956613f,0.221947f, +0.312407f,0.939867f,0.138025f, +0.450948f,0.870255f,0.198248f, +0.44762f,0.863366f,0.232885f, +0.235953f,0.935784f,0.261983f, +0.128819f,0.928252f,0.348933f, +0.106701f,0.927182f,0.359094f, +0.172918f,0.882203f,0.437968f, +0.183128f,0.868984f,0.459707f, +0.240959f,0.881259f,0.406597f, +0.154256f,0.918617f,0.363797f, +0.0253035f,0.919137f,0.393124f, +0.0182377f,0.964511f,0.263413f, +0.0263571f,0.99964f,0.00499089f, +-0.149002f,0.961331f,-0.231604f, +-0.264821f,0.912849f,-0.310769f, +-0.139498f,0.954507f,-0.263548f, +-0.253683f,0.93262f,-0.25664f, +-0.265231f,0.9626f,-0.0552561f, +-0.114883f,0.993341f,-0.00868247f, +0.0072742f,0.99351f,-0.113513f, +0.112563f,0.957036f,-0.26723f, +0.0621414f,0.905176f,-0.420469f, +0.0722297f,0.880288f,-0.468909f, +0.230329f,0.856327f,-0.462225f, +0.381575f,0.843927f,-0.377079f, +0.221134f,0.891315f,-0.395799f, +0.0308171f,0.923698f,-0.381879f, +0.0400222f,0.939112f,-0.341272f, +0.100477f,0.950816f,-0.293006f, +0.177047f,0.942783f,-0.282515f, +0.133298f,0.926135f,-0.352852f, +0.196525f,0.937661f,-0.286653f, +0.349249f,0.920399f,-0.17576f, +0.344233f,0.909171f,-0.234334f, +0.376056f,0.891226f,-0.25357f, +0.439076f,0.869021f,-0.228069f, +0.419906f,0.900431f,-0.113589f, +0.367672f,0.919513f,-0.13897f, +0.413581f,0.894358f,-0.170514f, +0.417856f,0.905717f,-0.0712231f, +0.442627f,0.896671f,0.00788109f, +0.434719f,0.900071f,0.0298519f, +0.417993f,0.908131f,0.0240916f, +-0.312333f,0.839022f,0.445522f, +-0.320499f,0.80841f,0.493714f, +-0.254519f,0.811123f,0.526593f, +-0.204612f,0.85744f,0.472156f, +-0.178862f,0.910868f,0.371925f, +-0.00702334f,0.926328f,0.376653f, +-0.0708828f,0.954444f,0.289847f, +-0.0771525f,0.977635f,0.195648f, +-0.0751036f,0.961343f,0.264914f, +-0.145577f,0.95681f,0.25164f, +0.127391f,0.9356f,0.329278f, +0.155803f,0.922417f,0.353372f, +-0.0158909f,0.953782f,0.300078f, +-0.071615f,0.974742f,0.211541f, +0.0985463f,0.976728f,0.190504f, +0.112633f,0.991267f,0.0685771f, +0.169574f,0.979892f,0.105153f, +0.189025f,0.96308f,0.191696f, +0.0919285f,0.967342f,0.236218f, +0.12853f,0.953507f,0.272588f, +0.291986f,0.918653f,0.266123f, +0.353363f,0.907675f,0.226407f, +0.385555f,0.89484f,0.224962f, +0.404454f,0.872627f,0.273752f, +0.205311f,0.929054f,0.307743f, +0.110161f,0.942272f,0.316208f, +0.185964f,0.923078f,0.336668f, +0.152054f,0.949861f,0.273212f, +0.185461f,0.938647f,0.290768f, +0.273329f,0.907935f,0.317718f, +0.1744f,0.944567f,0.278169f, +0.0252708f,0.979111f,0.20175f, +0.168508f,0.972599f,0.160178f, +0.171022f,0.978059f,0.118964f, +0.0998107f,0.989636f,0.103241f, +-0.201522f,0.966723f,-0.157591f, +-0.270475f,0.936595f,-0.222784f, +-0.312657f,0.944755f,-0.0984088f, +-0.352005f,0.934773f,-0.0478632f, +-0.0861214f,0.995901f,-0.0276381f, +0.0987576f,0.994369f,-0.0384345f, +0.271502f,0.95802f,-0.0921061f, +0.198786f,0.941001f,-0.273863f, +0.12025f,0.91375f,-0.388073f, +0.19318f,0.901312f,-0.38771f, +0.347672f,0.893681f,-0.283653f, +0.243349f,0.925421f,-0.290477f, +0.0173943f,0.947888f,-0.318129f, +0.037959f,0.944705f,-0.325718f, +0.138906f,0.919468f,-0.36781f, +0.157447f,0.882137f,-0.443897f, +0.187757f,0.895179f,-0.404229f, +0.0607904f,0.891083f,-0.44975f, +0.186006f,0.945946f,-0.265685f, +0.365887f,0.929282f,-0.0506235f, +0.41897f,0.907686f,-0.0238758f, +0.421784f,0.903427f,-0.0769231f, +0.443234f,0.894342f,-0.0608035f, +0.410975f,0.898831f,-0.152323f, +0.386797f,0.913648f,-0.125039f, +0.291947f,0.94823f,-0.125004f, +0.388472f,0.921139f,-0.0243475f, +0.43729f,0.89932f,0.000909095f, +0.438439f,0.898727f,-0.00777216f, +-0.28789f,0.841477f,0.457204f, +-0.335895f,0.843138f,0.419871f, +-0.2812f,0.876582f,0.390553f, +-0.0955224f,0.927302f,0.361922f, +-0.12003f,0.968207f,0.219473f, +-0.0624603f,0.972133f,0.225956f, +0.00876105f,0.944888f,0.327276f, +-0.0188296f,0.951986f,0.305562f, +-0.0880524f,0.955492f,0.28157f, +-0.14211f,0.96142f,0.235533f, +0.0867118f,0.963277f,0.254122f, +0.135173f,0.965034f,0.224584f, +0.150393f,0.96446f,0.217252f, +0.0301773f,0.99954f,0.00289386f, +0.112215f,0.991225f,-0.0698593f, +0.139936f,0.985559f,-0.0953439f, +0.125274f,0.991296f,-0.0404889f, +0.130003f,0.991461f,0.0102436f, +0.104702f,0.992835f,0.0575904f, +0.129192f,0.991077f,0.0328109f, +0.258743f,0.962487f,0.0816753f, +0.358319f,0.917773f,0.171175f, +0.362543f,0.919373f,0.152698f, +0.379026f,0.899795f,0.216122f, +0.252574f,0.930076f,0.266767f, +0.106065f,0.974915f,0.195683f, +0.13953f,0.968709f,0.205267f, +0.207814f,0.946678f,0.246198f, +0.149976f,0.969192f,0.195383f, +0.250422f,0.937237f,0.242644f, +0.308573f,0.924236f,0.224878f, +0.137327f,0.986571f,0.0884273f, +0.176869f,0.981357f,0.0752039f, +0.106914f,0.989761f,0.0945676f, +0.0990876f,0.985862f,0.135123f, +0.0562231f,0.995571f,0.0753513f, +-0.246892f,0.957072f,-0.15185f, +-0.351837f,0.92065f,-0.169157f, +-0.377614f,0.902561f,-0.206862f, +-0.10132f,0.980362f,-0.169188f, +0.0776454f,0.98254f,-0.169077f, +0.306304f,0.93954f,-0.153108f, +0.377181f,0.900422f,-0.216738f, +0.189257f,0.917577f,-0.349621f, +0.154953f,0.928643f,-0.337063f, +0.267717f,0.911458f,-0.312367f, +0.294676f,0.908518f,-0.296244f, +0.0231864f,0.917435f,-0.39721f, +0.0626224f,0.928776f,-0.365314f, +0.222796f,0.906686f,-0.358165f, +0.23143f,0.87959f,-0.415646f, +0.13808f,0.870415f,-0.472559f, +0.025291f,0.910796f,-0.412081f, +-0.0453254f,0.945277f,-0.323104f, +0.159501f,0.971914f,-0.17304f, +0.38445f,0.922508f,-0.0343154f, +0.457445f,0.889226f,-0.00452937f, +0.479545f,0.877417f,-0.0132742f, +0.420093f,0.902443f,-0.0954967f, +0.386091f,0.921349f,-0.0452663f, +0.319162f,0.945851f,-0.059174f, +0.358596f,0.930564f,-0.0738904f, +0.442653f,0.891593f,-0.0955061f, +0.442432f,0.88607f,-0.138327f, +-0.180108f,0.868506f,0.461799f, +-0.252344f,0.891893f,0.375298f, +-0.214515f,0.951228f,0.221693f, +-0.0232238f,0.989215f,0.144618f, +0.0240637f,0.992144f,0.122761f, +-0.119024f,0.992873f,0.00598183f, +-0.113037f,0.992656f,0.0430988f, +-0.0429691f,0.994091f,0.0996822f, +-0.0494378f,0.98881f,0.140751f, +-0.101045f,0.990831f,0.0896877f, +0.0748729f,0.995782f,0.0530223f, +0.173588f,0.976877f,0.124814f, +0.168744f,0.967443f,0.188628f, +0.211654f,0.955224f,0.206761f, +0.198232f,0.976689f,0.0823528f, +0.160641f,0.986993f,-0.00630407f, +0.0575905f,0.994633f,-0.0859521f, +0.0365841f,0.998447f,-0.0420043f, +0.0556411f,0.989086f,0.136432f, +0.127974f,0.973486f,0.1896f, +0.188609f,0.96964f,0.155643f, +0.316079f,0.935031f,0.16066f, +0.368833f,0.913789f,0.170151f, +0.28567f,0.933317f,0.217512f, +0.224877f,0.919424f,0.322631f, +0.173372f,0.927466f,0.331284f, +0.14641f,0.951279f,0.271352f, +0.199618f,0.950197f,0.239328f, +0.194716f,0.961761f,0.192616f, +0.211001f,0.970026f,0.12053f, +0.377145f,0.915922f,0.137289f, +0.173279f,0.983115f,0.0588147f, +0.137169f,0.986854f,0.085457f, +0.167124f,0.984519f,0.0528309f, +0.114693f,0.990538f,-0.0753596f, +0.120988f,0.991416f,-0.0495523f, +-0.0934722f,0.99234f,-0.0807704f, +-0.28812f,0.930265f,-0.227141f, +-0.319246f,0.884516f,-0.340167f, +-0.147049f,0.912977f,-0.380591f, +0.113837f,0.925954f,-0.360071f, +0.286328f,0.873071f,-0.394668f, +0.386305f,0.86841f,-0.310857f, +0.201568f,0.937185f,-0.284702f, +0.165365f,0.953527f,-0.251875f, +0.277218f,0.910704f,-0.306215f, +0.350715f,0.890932f,-0.288511f, +0.130261f,0.920935f,-0.367302f, +-0.00793534f,0.891743f,-0.452472f, +0.173424f,0.90309f,-0.392878f, +0.309572f,0.891597f,-0.330484f, +0.155483f,0.904383f,-0.397387f, +-0.0901615f,0.931774f,-0.351664f, +-0.12522f,0.950283f,-0.285102f, +0.116309f,0.952999f,-0.279758f, +0.314059f,0.900664f,-0.300285f, +0.399484f,0.884115f,-0.242388f, +0.476487f,0.865346f,-0.155359f, +0.461331f,0.87037f,-0.172132f, +0.340659f,0.915541f,-0.213858f, +0.307988f,0.934535f,-0.178292f, +0.356904f,0.924065f,-0.136833f, +0.470016f,0.879468f,-0.0749671f, +0.505067f,0.862447f,-0.0330571f, +-0.15355f,0.924768f,0.348175f, +-0.09321f,0.949622f,0.299215f, +-0.0484808f,0.991662f,0.1194f, +-0.0103305f,0.999605f,0.0261285f, +0.0401188f,0.998578f,0.0351042f, +-0.00661539f,0.998628f,-0.0519471f, +-0.0683745f,0.981776f,-0.177318f, +-0.0856989f,0.966825f,-0.240633f, +-0.0983519f,0.984458f,-0.145499f, +-0.0680709f,0.995572f,-0.0648268f, +0.0777629f,0.996246f,-0.0380386f, +0.0383267f,0.998901f,-0.0269619f, +0.00333347f,0.997094f,0.0761077f, +0.139217f,0.959624f,0.244419f, +0.245721f,0.912381f,0.327386f, +0.246821f,0.907772f,0.339159f, +0.175417f,0.940931f,0.289617f, +-0.027159f,0.9789f,0.202525f, +-0.173424f,0.953226f,0.247557f, +0.0844967f,0.921276f,0.37962f, +0.304261f,0.89366f,0.329845f, +0.31812f,0.923926f,0.21251f, +0.353311f,0.902952f,0.244642f, +0.195957f,0.945525f,0.25997f, +0.182247f,0.923305f,0.338075f, +0.134205f,0.934918f,0.328507f, +0.176553f,0.881734f,0.437463f, +0.22427f,0.87574f,0.42753f, +0.29074f,0.869795f,0.398657f, +0.272684f,0.924539f,0.266215f, +0.39631f,0.892935f,0.213556f, +0.227086f,0.96746f,0.111597f, +0.14196f,0.988195f,0.0576051f, +0.283679f,0.958555f,0.0264133f, +0.216474f,0.969698f,-0.113251f, +0.0386649f,0.982201f,-0.183812f, +-0.0151491f,0.988164f,-0.152652f, +-0.145516f,0.952277f,-0.268316f, +-0.219857f,0.921944f,-0.318875f, +-0.140821f,0.920717f,-0.363936f, +0.13255f,0.932146f,-0.33695f, +0.285156f,0.898104f,-0.334807f, +0.270867f,0.921389f,-0.278701f, +0.136545f,0.958362f,-0.250793f, +0.156889f,0.960437f,-0.230103f, +0.337521f,0.917391f,-0.210889f, +0.340375f,0.909959f,-0.236896f, +0.226521f,0.931852f,-0.283443f, +0.0467156f,0.919678f,-0.389885f, +0.11829f,0.926104f,-0.358244f, +0.284734f,0.910765f,-0.299055f, +0.155007f,0.943096f,-0.294183f, +-0.117772f,0.948884f,-0.29283f, +-0.124268f,0.932168f,-0.340029f, +0.155477f,0.92011f,-0.359477f, +0.348711f,0.859859f,-0.372885f, +0.344156f,0.842199f,-0.415039f, +0.367487f,0.839547f,-0.400142f, +0.45537f,0.851179f,-0.261021f, +0.340771f,0.905445f,-0.25307f, +0.281592f,0.927438f,-0.246101f, +0.270207f,0.930215f,-0.248371f, +0.337751f,0.936799f,-0.0912801f, +0.415821f,0.905383f,0.085868f, +-0.0508816f,0.992949f,0.107064f, +0.00772943f,0.999926f,0.0093874f, +0.0748585f,0.990585f,-0.114623f, +0.0155266f,0.983672f,-0.179298f, +0.0579395f,0.986738f,-0.15163f, +0.0876255f,0.991018f,-0.10102f, +0.0527296f,0.995461f,-0.0792264f, +-0.086898f,0.99085f,-0.103274f, +-0.226618f,0.972789f,-0.0482267f, +-0.175193f,0.983195f,0.0513344f, +0.0267808f,0.994997f,0.0962477f, +0.0618698f,0.991981f,0.110211f, +-0.098328f,0.984739f,0.143601f, +-0.00458312f,0.952299f,0.305132f, +0.173153f,0.913691f,0.367678f, +0.186464f,0.911194f,0.367365f, +0.171431f,0.905309f,0.388622f, +0.0620384f,0.93682f,0.344266f, +-0.143644f,0.960893f,0.23675f, +0.0362541f,0.97893f,0.200951f, +0.349667f,0.904284f,0.244957f, +0.338175f,0.903327f,0.26389f, +0.333852f,0.898218f,0.285914f, +0.192181f,0.948404f,0.252183f, +0.15408f,0.957234f,0.244873f, +0.108314f,0.961372f,0.253046f, +0.0186373f,0.953687f,0.300223f, +0.205839f,0.914416f,0.34853f, +0.331275f,0.886521f,0.323015f, +0.368345f,0.875165f,0.313702f, +0.405591f,0.862022f,0.303997f, +0.335644f,0.884308f,0.324566f, +0.194457f,0.953987f,0.228245f, +0.317589f,0.932139f,0.173936f, +0.34707f,0.93458f,0.0781131f, +0.1429f,0.981779f,-0.125256f, +0.0457434f,0.962864f,-0.266085f, +-0.0800896f,0.929514f,-0.359987f, +-0.224976f,0.908098f,-0.353191f, +-0.16594f,0.929111f,-0.330481f, +0.0749763f,0.957672f,-0.277928f, +0.277052f,0.936424f,-0.215295f, +0.266206f,0.947023f,-0.17967f, +0.192217f,0.96172f,-0.195315f, +0.159333f,0.947925f,-0.275775f, +0.291985f,0.916673f,-0.272864f, +0.390644f,0.893072f,-0.223205f, +0.316013f,0.901654f,-0.295223f, +0.0938304f,0.916417f,-0.38907f, +0.0371906f,0.918056f,-0.394702f, +0.249356f,0.914822f,-0.317682f, +0.159281f,0.933374f,-0.321625f, +-0.034507f,0.927426f,-0.372412f, +-0.0639276f,0.876921f,-0.476365f, +0.150154f,0.87361f,-0.462881f, +0.34577f,0.845394f,-0.407127f, +0.406017f,0.841234f,-0.357037f, +0.322181f,0.876026f,-0.358855f, +0.315882f,0.91236f,-0.260417f, +0.325378f,0.928704f,-0.177873f, +0.281437f,0.937288f,-0.205633f, +0.23991f,0.955112f,-0.173792f, +0.165717f,0.980838f,-0.102443f, +0.16591f,0.98582f,-0.0251575f, +0.188672f,0.97776f,0.0915829f, +0.0994257f,0.983812f,-0.14909f, +0.199087f,0.95198f,-0.232593f, +0.0121878f,0.914874f,-0.403556f, +-0.0234414f,0.930265f,-0.36614f, +-0.038124f,0.972539f,-0.229595f, +-0.0300917f,0.999515f,-0.00796094f, +-0.092201f,0.984658f,0.148144f, +-0.315366f,0.938181f,0.142688f, +-0.138968f,0.942311f,0.304528f, +0.0277459f,0.977812f,0.207641f, +0.0496201f,0.98101f,0.187502f, +-0.256039f,0.940975f,0.22138f, +-0.0796386f,0.864833f,0.495703f, +0.172206f,0.836979f,0.519434f, +0.218401f,0.8652f,0.451365f, +0.211231f,0.888948f,0.406391f, +0.153922f,0.942863f,0.295494f, +-0.0705923f,0.983817f,0.164685f, +0.0334153f,0.99603f,0.0825054f, +0.282635f,0.9535f,0.104667f, +0.322121f,0.91103f,0.257413f, +0.32296f,0.89395f,0.310726f, +0.263681f,0.921808f,0.284152f, +0.145976f,0.970498f,0.191897f, +0.110214f,0.967993f,0.225482f, +0.0100073f,0.970397f,0.241307f, +0.231259f,0.94984f,0.210532f, +0.350804f,0.929639f,0.112731f, +0.388908f,0.908557f,0.152559f, +0.325259f,0.933029f,0.153831f, +0.358244f,0.845843f,0.395235f, +0.245479f,0.88292f,0.400241f, +0.340078f,0.880829f,0.329372f, +0.448713f,0.860203f,0.242295f, +0.291253f,0.956268f,-0.0268833f, +0.174446f,0.957532f,-0.229565f, +-0.0246181f,0.920367f,-0.390281f, +-0.230596f,0.878986f,-0.417383f, +-0.188847f,0.897269f,-0.399054f, +0.0175328f,0.926292f,-0.376398f, +0.23985f,0.925856f,-0.291997f, +0.22945f,0.938275f,-0.258829f, +0.212396f,0.953082f,-0.21569f, +0.229329f,0.940641f,-0.250204f, +0.284501f,0.899212f,-0.33238f, +0.376241f,0.875275f,-0.30387f, +0.33476f,0.887829f,-0.315744f, +0.163808f,0.925647f,-0.341094f, +0.00890663f,0.895805f,-0.444357f, +0.214972f,0.896442f,-0.38753f, +0.17587f,0.912162f,-0.370177f, +0.075136f,0.903308f,-0.422362f, +-0.00910936f,0.832148f,-0.55448f, +0.080579f,0.825188f,-0.559082f, +0.296201f,0.838595f,-0.457191f, +0.316267f,0.8627f,-0.39462f, +0.301959f,0.9215f,-0.24425f, +0.239667f,0.953185f,-0.184387f, +0.359606f,0.929321f,-0.0839473f, +0.264487f,0.941897f,-0.207066f, +0.184815f,0.971569f,-0.147976f, +0.141833f,0.988976f,-0.0425335f, +0.112364f,0.992816f,-0.0411276f, +}; + +btScalar Landscape04Tex[] = { +0.507813f,0.25f, +0.507813f,0.242188f, +0.515625f,0.25f, +0.515625f,0.242188f, +0.523438f,0.25f, +0.523438f,0.242188f, +0.53125f,0.25f, +0.53125f,0.242188f, +0.539063f,0.25f, +0.539063f,0.242188f, +0.546875f,0.25f, +0.546875f,0.242188f, +0.554688f,0.25f, +0.554688f,0.242188f, +0.5625f,0.25f, +0.5625f,0.242188f, +0.570313f,0.25f, +0.570313f,0.242188f, +0.578125f,0.25f, +0.578125f,0.242188f, +0.585938f,0.25f, +0.585938f,0.242188f, +0.59375f,0.25f, +0.59375f,0.242188f, +0.601563f,0.25f, +0.601563f,0.242188f, +0.609375f,0.25f, +0.609375f,0.242188f, +0.617188f,0.25f, +0.617188f,0.242188f, +0.625f,0.25f, +0.625f,0.242188f, +0.632813f,0.25f, +0.632813f,0.242188f, +0.640625f,0.25f, +0.640625f,0.242188f, +0.648438f,0.25f, +0.648438f,0.242188f, +0.65625f,0.25f, +0.65625f,0.242188f, +0.664063f,0.25f, +0.664063f,0.242188f, +0.671875f,0.25f, +0.671875f,0.242188f, +0.679688f,0.25f, +0.679688f,0.242188f, +0.6875f,0.25f, +0.6875f,0.242188f, +0.695313f,0.25f, +0.695313f,0.242188f, +0.703125f,0.25f, +0.703125f,0.242188f, +0.710938f,0.25f, +0.710938f,0.242188f, +0.71875f,0.25f, +0.71875f,0.242188f, +0.726563f,0.25f, +0.726563f,0.242188f, +0.734375f,0.25f, +0.734375f,0.242188f, +0.742188f,0.25f, +0.742188f,0.242188f, +0.75f,0.25f, +0.75f,0.242188f, +0.757813f,0.25f, +0.757813f,0.242188f, +0.765625f,0.25f, +0.765625f,0.242188f, +0.773438f,0.25f, +0.773438f,0.242188f, +0.78125f,0.25f, +0.78125f,0.242188f, +0.789063f,0.25f, +0.789063f,0.242188f, +0.796875f,0.25f, +0.796875f,0.242188f, +0.804688f,0.25f, +0.804688f,0.242188f, +0.8125f,0.25f, +0.8125f,0.242188f, +0.820313f,0.25f, +0.820313f,0.242188f, +0.828125f,0.25f, +0.828125f,0.242188f, +0.835938f,0.25f, +0.835938f,0.242188f, +0.84375f,0.25f, +0.84375f,0.242188f, +0.851563f,0.25f, +0.851563f,0.242188f, +0.859375f,0.25f, +0.859375f,0.242188f, +0.867188f,0.25f, +0.867188f,0.242188f, +0.875f,0.25f, +0.875f,0.242188f, +0.882813f,0.25f, +0.882813f,0.242188f, +0.890625f,0.25f, +0.890625f,0.242188f, +0.898438f,0.25f, +0.898438f,0.242188f, +0.90625f,0.25f, +0.90625f,0.242188f, +0.914063f,0.25f, +0.914063f,0.242188f, +0.921875f,0.25f, +0.921875f,0.242188f, +0.929688f,0.25f, +0.929688f,0.242188f, +0.9375f,0.25f, +0.9375f,0.242188f, +0.945313f,0.25f, +0.945313f,0.242188f, +0.953125f,0.25f, +0.953125f,0.242188f, +0.960938f,0.25f, +0.960938f,0.242188f, +0.96875f,0.25f, +0.96875f,0.242188f, +0.976563f,0.25f, +0.976563f,0.242188f, +0.984375f,0.25f, +0.984375f,0.242188f, +0.992188f,0.25f, +0.992188f,0.242188f, +1.0f,0.25f, +1.0f,0.242188f, +0.507813f,0.257813f, +0.515625f,0.257813f, +0.523438f,0.257813f, +0.53125f,0.257813f, +0.539063f,0.257813f, +0.546875f,0.257813f, +0.554688f,0.257813f, +0.5625f,0.257813f, +0.570313f,0.257813f, +0.578125f,0.257813f, +0.585938f,0.257813f, +0.59375f,0.257813f, +0.601563f,0.257813f, +0.609375f,0.257813f, +0.617188f,0.257813f, +0.625f,0.257813f, +0.632813f,0.257813f, +0.640625f,0.257813f, +0.648438f,0.257813f, +0.65625f,0.257813f, +0.664063f,0.257813f, +0.671875f,0.257813f, +0.679688f,0.257813f, +0.6875f,0.257813f, +0.695313f,0.257813f, +0.703125f,0.257813f, +0.710938f,0.257813f, +0.71875f,0.257813f, +0.726563f,0.257813f, +0.734375f,0.257813f, +0.742188f,0.257813f, +0.75f,0.257813f, +0.757813f,0.257813f, +0.765625f,0.257813f, +0.773438f,0.257813f, +0.78125f,0.257813f, +0.789063f,0.257813f, +0.796875f,0.257813f, +0.804688f,0.257813f, +0.8125f,0.257813f, +0.820313f,0.257813f, +0.828125f,0.257813f, +0.835938f,0.257813f, +0.84375f,0.257813f, +0.851563f,0.257813f, +0.859375f,0.257813f, +0.867188f,0.257813f, +0.875f,0.257813f, +0.882813f,0.257813f, +0.890625f,0.257813f, +0.898438f,0.257813f, +0.90625f,0.257813f, +0.914063f,0.257813f, +0.921875f,0.257813f, +0.929688f,0.257813f, +0.9375f,0.257813f, +0.945313f,0.257813f, +0.953125f,0.257813f, +0.960938f,0.257813f, +0.96875f,0.257813f, +0.976563f,0.257813f, +0.984375f,0.257813f, +0.992188f,0.257813f, +1.0f,0.257813f, +0.507813f,0.265625f, +0.515625f,0.265625f, +0.523438f,0.265625f, +0.53125f,0.265625f, +0.539063f,0.265625f, +0.546875f,0.265625f, +0.554688f,0.265625f, +0.5625f,0.265625f, +0.570313f,0.265625f, +0.578125f,0.265625f, +0.585938f,0.265625f, +0.59375f,0.265625f, +0.601563f,0.265625f, +0.609375f,0.265625f, +0.617188f,0.265625f, +0.625f,0.265625f, +0.632813f,0.265625f, +0.640625f,0.265625f, +0.648438f,0.265625f, +0.65625f,0.265625f, +0.664063f,0.265625f, +0.671875f,0.265625f, +0.679688f,0.265625f, +0.6875f,0.265625f, +0.695313f,0.265625f, +0.703125f,0.265625f, +0.710938f,0.265625f, +0.71875f,0.265625f, +0.726563f,0.265625f, +0.734375f,0.265625f, +0.742188f,0.265625f, +0.75f,0.265625f, +0.757813f,0.265625f, +0.765625f,0.265625f, +0.773438f,0.265625f, +0.78125f,0.265625f, +0.789063f,0.265625f, +0.796875f,0.265625f, +0.804688f,0.265625f, +0.8125f,0.265625f, +0.820313f,0.265625f, +0.828125f,0.265625f, +0.835938f,0.265625f, +0.84375f,0.265625f, +0.851563f,0.265625f, +0.859375f,0.265625f, +0.867188f,0.265625f, +0.875f,0.265625f, +0.882813f,0.265625f, +0.890625f,0.265625f, +0.898438f,0.265625f, +0.90625f,0.265625f, +0.914063f,0.265625f, +0.921875f,0.265625f, +0.929688f,0.265625f, +0.9375f,0.265625f, +0.945313f,0.265625f, +0.953125f,0.265625f, +0.960938f,0.265625f, +0.96875f,0.265625f, +0.976563f,0.265625f, +0.984375f,0.265625f, +0.992188f,0.265625f, +1.0f,0.265625f, +0.507813f,0.273438f, +0.515625f,0.273438f, +0.523438f,0.273438f, +0.53125f,0.273438f, +0.539063f,0.273438f, +0.546875f,0.273438f, +0.554688f,0.273438f, +0.5625f,0.273438f, +0.570313f,0.273438f, +0.578125f,0.273438f, +0.585938f,0.273438f, +0.59375f,0.273438f, +0.601563f,0.273438f, +0.609375f,0.273438f, +0.617188f,0.273438f, +0.625f,0.273438f, +0.632813f,0.273438f, +0.640625f,0.273438f, +0.648438f,0.273438f, +0.65625f,0.273438f, +0.664063f,0.273438f, +0.671875f,0.273438f, +0.679688f,0.273438f, +0.6875f,0.273438f, +0.695313f,0.273438f, +0.703125f,0.273438f, +0.710938f,0.273438f, +0.71875f,0.273438f, +0.726563f,0.273438f, +0.734375f,0.273438f, +0.742188f,0.273438f, +0.75f,0.273438f, +0.757813f,0.273438f, +0.765625f,0.273438f, +0.773438f,0.273438f, +0.78125f,0.273438f, +0.789063f,0.273438f, +0.796875f,0.273438f, +0.804688f,0.273438f, +0.8125f,0.273438f, +0.820313f,0.273438f, +0.828125f,0.273438f, +0.835938f,0.273438f, +0.84375f,0.273438f, +0.851563f,0.273438f, +0.859375f,0.273438f, +0.867188f,0.273438f, +0.875f,0.273438f, +0.882813f,0.273438f, +0.890625f,0.273438f, +0.898438f,0.273438f, +0.90625f,0.273438f, +0.914063f,0.273438f, +0.921875f,0.273438f, +0.929688f,0.273438f, +0.9375f,0.273438f, +0.945313f,0.273438f, +0.953125f,0.273438f, +0.960938f,0.273438f, +0.96875f,0.273438f, +0.976563f,0.273438f, +0.984375f,0.273438f, +0.992188f,0.273438f, +1.0f,0.273438f, +0.507813f,0.28125f, +0.515625f,0.28125f, +0.523438f,0.28125f, +0.53125f,0.28125f, +0.539063f,0.28125f, +0.546875f,0.28125f, +0.554688f,0.28125f, +0.5625f,0.28125f, +0.570313f,0.28125f, +0.578125f,0.28125f, +0.585938f,0.28125f, +0.59375f,0.28125f, +0.601563f,0.28125f, +0.609375f,0.28125f, +0.617188f,0.28125f, +0.625f,0.28125f, +0.632813f,0.28125f, +0.640625f,0.28125f, +0.648438f,0.28125f, +0.65625f,0.28125f, +0.664063f,0.28125f, +0.671875f,0.28125f, +0.679688f,0.28125f, +0.6875f,0.28125f, +0.695313f,0.28125f, +0.703125f,0.28125f, +0.710938f,0.28125f, +0.71875f,0.28125f, +0.726563f,0.28125f, +0.734375f,0.28125f, +0.742188f,0.28125f, +0.75f,0.28125f, +0.757813f,0.28125f, +0.765625f,0.28125f, +0.773438f,0.28125f, +0.78125f,0.28125f, +0.789063f,0.28125f, +0.796875f,0.28125f, +0.804688f,0.28125f, +0.8125f,0.28125f, +0.820313f,0.28125f, +0.828125f,0.28125f, +0.835938f,0.28125f, +0.84375f,0.28125f, +0.851563f,0.28125f, +0.859375f,0.28125f, +0.867188f,0.28125f, +0.875f,0.28125f, +0.882813f,0.28125f, +0.890625f,0.28125f, +0.898438f,0.28125f, +0.90625f,0.28125f, +0.914063f,0.28125f, +0.921875f,0.28125f, +0.929688f,0.28125f, +0.9375f,0.28125f, +0.945313f,0.28125f, +0.953125f,0.28125f, +0.960938f,0.28125f, +0.96875f,0.28125f, +0.976563f,0.28125f, +0.984375f,0.28125f, +0.992188f,0.28125f, +1.0f,0.28125f, +0.507813f,0.289063f, +0.515625f,0.289063f, +0.523438f,0.289063f, +0.53125f,0.289063f, +0.539063f,0.289063f, +0.546875f,0.289063f, +0.554688f,0.289063f, +0.5625f,0.289063f, +0.570313f,0.289063f, +0.578125f,0.289063f, +0.585938f,0.289063f, +0.59375f,0.289063f, +0.601563f,0.289063f, +0.609375f,0.289063f, +0.617188f,0.289063f, +0.625f,0.289063f, +0.632813f,0.289063f, +0.640625f,0.289063f, +0.648438f,0.289063f, +0.65625f,0.289063f, +0.664063f,0.289063f, +0.671875f,0.289063f, +0.679688f,0.289063f, +0.6875f,0.289063f, +0.695313f,0.289063f, +0.703125f,0.289063f, +0.710938f,0.289063f, +0.71875f,0.289063f, +0.726563f,0.289063f, +0.734375f,0.289063f, +0.742188f,0.289063f, +0.75f,0.289063f, +0.757813f,0.289063f, +0.765625f,0.289063f, +0.773438f,0.289063f, +0.78125f,0.289063f, +0.789063f,0.289063f, +0.796875f,0.289063f, +0.804688f,0.289063f, +0.8125f,0.289063f, +0.820313f,0.289063f, +0.828125f,0.289063f, +0.835938f,0.289063f, +0.84375f,0.289063f, +0.851563f,0.289063f, +0.859375f,0.289063f, +0.867188f,0.289063f, +0.875f,0.289063f, +0.882813f,0.289063f, +0.890625f,0.289063f, +0.898438f,0.289063f, +0.90625f,0.289063f, +0.914063f,0.289063f, +0.921875f,0.289063f, +0.929688f,0.289063f, +0.9375f,0.289063f, +0.945313f,0.289063f, +0.953125f,0.289063f, +0.960938f,0.289063f, +0.96875f,0.289063f, +0.976563f,0.289063f, +0.984375f,0.289063f, +0.992188f,0.289063f, +1.0f,0.289063f, +0.507813f,0.296875f, +0.515625f,0.296875f, +0.523438f,0.296875f, +0.53125f,0.296875f, +0.539063f,0.296875f, +0.546875f,0.296875f, +0.554688f,0.296875f, +0.5625f,0.296875f, +0.570313f,0.296875f, +0.578125f,0.296875f, +0.585938f,0.296875f, +0.59375f,0.296875f, +0.601563f,0.296875f, +0.609375f,0.296875f, +0.617188f,0.296875f, +0.625f,0.296875f, +0.632813f,0.296875f, +0.640625f,0.296875f, +0.648438f,0.296875f, +0.65625f,0.296875f, +0.664063f,0.296875f, +0.671875f,0.296875f, +0.679688f,0.296875f, +0.6875f,0.296875f, +0.695313f,0.296875f, +0.703125f,0.296875f, +0.710938f,0.296875f, +0.71875f,0.296875f, +0.726563f,0.296875f, +0.734375f,0.296875f, +0.742188f,0.296875f, +0.75f,0.296875f, +0.757813f,0.296875f, +0.765625f,0.296875f, +0.773438f,0.296875f, +0.78125f,0.296875f, +0.789063f,0.296875f, +0.796875f,0.296875f, +0.804688f,0.296875f, +0.8125f,0.296875f, +0.820313f,0.296875f, +0.828125f,0.296875f, +0.835938f,0.296875f, +0.84375f,0.296875f, +0.851563f,0.296875f, +0.859375f,0.296875f, +0.867188f,0.296875f, +0.875f,0.296875f, +0.882813f,0.296875f, +0.890625f,0.296875f, +0.898438f,0.296875f, +0.90625f,0.296875f, +0.914063f,0.296875f, +0.921875f,0.296875f, +0.929688f,0.296875f, +0.9375f,0.296875f, +0.945313f,0.296875f, +0.953125f,0.296875f, +0.960938f,0.296875f, +0.96875f,0.296875f, +0.976563f,0.296875f, +0.984375f,0.296875f, +0.992188f,0.296875f, +1.0f,0.296875f, +0.507813f,0.304688f, +0.515625f,0.304688f, +0.523438f,0.304688f, +0.53125f,0.304688f, +0.539063f,0.304688f, +0.546875f,0.304688f, +0.554688f,0.304688f, +0.5625f,0.304688f, +0.570313f,0.304688f, +0.578125f,0.304688f, +0.585938f,0.304688f, +0.59375f,0.304688f, +0.601563f,0.304688f, +0.609375f,0.304688f, +0.617188f,0.304688f, +0.625f,0.304688f, +0.632813f,0.304688f, +0.640625f,0.304688f, +0.648438f,0.304688f, +0.65625f,0.304688f, +0.664063f,0.304688f, +0.671875f,0.304688f, +0.679688f,0.304688f, +0.6875f,0.304688f, +0.695313f,0.304688f, +0.703125f,0.304688f, +0.710938f,0.304688f, +0.71875f,0.304688f, +0.726563f,0.304688f, +0.734375f,0.304688f, +0.742188f,0.304688f, +0.75f,0.304688f, +0.757813f,0.304688f, +0.765625f,0.304688f, +0.773438f,0.304688f, +0.78125f,0.304688f, +0.789063f,0.304688f, +0.796875f,0.304688f, +0.804688f,0.304688f, +0.8125f,0.304688f, +0.820313f,0.304688f, +0.828125f,0.304688f, +0.835938f,0.304688f, +0.84375f,0.304688f, +0.851563f,0.304688f, +0.859375f,0.304688f, +0.867188f,0.304688f, +0.875f,0.304688f, +0.882813f,0.304688f, +0.890625f,0.304688f, +0.898438f,0.304688f, +0.90625f,0.304688f, +0.914063f,0.304688f, +0.921875f,0.304688f, +0.929688f,0.304688f, +0.9375f,0.304688f, +0.945313f,0.304688f, +0.953125f,0.304688f, +0.960938f,0.304688f, +0.96875f,0.304688f, +0.976563f,0.304688f, +0.984375f,0.304688f, +0.992188f,0.304688f, +1.0f,0.304688f, +0.507813f,0.3125f, +0.515625f,0.3125f, +0.523438f,0.3125f, +0.53125f,0.3125f, +0.539063f,0.3125f, +0.546875f,0.3125f, +0.554688f,0.3125f, +0.5625f,0.3125f, +0.570313f,0.3125f, +0.578125f,0.3125f, +0.585938f,0.3125f, +0.59375f,0.3125f, +0.601563f,0.3125f, +0.609375f,0.3125f, +0.617188f,0.3125f, +0.625f,0.3125f, +0.632813f,0.3125f, +0.640625f,0.3125f, +0.648438f,0.3125f, +0.65625f,0.3125f, +0.664063f,0.3125f, +0.671875f,0.3125f, +0.679688f,0.3125f, +0.6875f,0.3125f, +0.695313f,0.3125f, +0.703125f,0.3125f, +0.710938f,0.3125f, +0.71875f,0.3125f, +0.726563f,0.3125f, +0.734375f,0.3125f, +0.742188f,0.3125f, +0.75f,0.3125f, +0.757813f,0.3125f, +0.765625f,0.3125f, +0.773438f,0.3125f, +0.78125f,0.3125f, +0.789063f,0.3125f, +0.796875f,0.3125f, +0.804688f,0.3125f, +0.8125f,0.3125f, +0.820313f,0.3125f, +0.828125f,0.3125f, +0.835938f,0.3125f, +0.84375f,0.3125f, +0.851563f,0.3125f, +0.859375f,0.3125f, +0.867188f,0.3125f, +0.875f,0.3125f, +0.882813f,0.3125f, +0.890625f,0.3125f, +0.898438f,0.3125f, +0.90625f,0.3125f, +0.914063f,0.3125f, +0.921875f,0.3125f, +0.929688f,0.3125f, +0.9375f,0.3125f, +0.945313f,0.3125f, +0.953125f,0.3125f, +0.960938f,0.3125f, +0.96875f,0.3125f, +0.976563f,0.3125f, +0.984375f,0.3125f, +0.992188f,0.3125f, +1.0f,0.3125f, +0.507813f,0.320313f, +0.515625f,0.320313f, +0.523438f,0.320313f, +0.53125f,0.320313f, +0.539063f,0.320313f, +0.546875f,0.320313f, +0.554688f,0.320313f, +0.5625f,0.320313f, +0.570313f,0.320313f, +0.578125f,0.320313f, +0.585938f,0.320313f, +0.59375f,0.320313f, +0.601563f,0.320313f, +0.609375f,0.320313f, +0.617188f,0.320313f, +0.625f,0.320313f, +0.632813f,0.320313f, +0.640625f,0.320313f, +0.648438f,0.320313f, +0.65625f,0.320313f, +0.664063f,0.320313f, +0.671875f,0.320313f, +0.679688f,0.320313f, +0.6875f,0.320313f, +0.695313f,0.320313f, +0.703125f,0.320313f, +0.710938f,0.320313f, +0.71875f,0.320313f, +0.726563f,0.320313f, +0.734375f,0.320313f, +0.742188f,0.320313f, +0.75f,0.320313f, +0.757813f,0.320313f, +0.765625f,0.320313f, +0.773438f,0.320313f, +0.78125f,0.320313f, +0.789063f,0.320313f, +0.796875f,0.320313f, +0.804688f,0.320313f, +0.8125f,0.320313f, +0.820313f,0.320313f, +0.828125f,0.320313f, +0.835938f,0.320313f, +0.84375f,0.320313f, +0.851563f,0.320313f, +0.859375f,0.320313f, +0.867188f,0.320313f, +0.875f,0.320313f, +0.882813f,0.320313f, +0.890625f,0.320313f, +0.898438f,0.320313f, +0.90625f,0.320313f, +0.914063f,0.320313f, +0.921875f,0.320313f, +0.929688f,0.320313f, +0.9375f,0.320313f, +0.945313f,0.320313f, +0.953125f,0.320313f, +0.960938f,0.320313f, +0.96875f,0.320313f, +0.976563f,0.320313f, +0.984375f,0.320313f, +0.992188f,0.320313f, +1.0f,0.320313f, +0.507813f,0.328125f, +0.515625f,0.328125f, +0.523438f,0.328125f, +0.53125f,0.328125f, +0.539063f,0.328125f, +0.546875f,0.328125f, +0.554688f,0.328125f, +0.5625f,0.328125f, +0.570313f,0.328125f, +0.578125f,0.328125f, +0.585938f,0.328125f, +0.59375f,0.328125f, +0.601563f,0.328125f, +0.609375f,0.328125f, +0.617188f,0.328125f, +0.625f,0.328125f, +0.632813f,0.328125f, +0.640625f,0.328125f, +0.648438f,0.328125f, +0.65625f,0.328125f, +0.664063f,0.328125f, +0.671875f,0.328125f, +0.679688f,0.328125f, +0.6875f,0.328125f, +0.695313f,0.328125f, +0.703125f,0.328125f, +0.710938f,0.328125f, +0.71875f,0.328125f, +0.726563f,0.328125f, +0.734375f,0.328125f, +0.742188f,0.328125f, +0.75f,0.328125f, +0.757813f,0.328125f, +0.765625f,0.328125f, +0.773438f,0.328125f, +0.78125f,0.328125f, +0.789063f,0.328125f, +0.796875f,0.328125f, +0.804688f,0.328125f, +0.8125f,0.328125f, +0.820313f,0.328125f, +0.828125f,0.328125f, +0.835938f,0.328125f, +0.84375f,0.328125f, +0.851563f,0.328125f, +0.859375f,0.328125f, +0.867188f,0.328125f, +0.875f,0.328125f, +0.882813f,0.328125f, +0.890625f,0.328125f, +0.898438f,0.328125f, +0.90625f,0.328125f, +0.914063f,0.328125f, +0.921875f,0.328125f, +0.929688f,0.328125f, +0.9375f,0.328125f, +0.945313f,0.328125f, +0.953125f,0.328125f, +0.960938f,0.328125f, +0.96875f,0.328125f, +0.976563f,0.328125f, +0.984375f,0.328125f, +0.992188f,0.328125f, +1.0f,0.328125f, +0.507813f,0.335938f, +0.515625f,0.335938f, +0.523438f,0.335938f, +0.53125f,0.335938f, +0.539063f,0.335938f, +0.546875f,0.335938f, +0.554688f,0.335938f, +0.5625f,0.335938f, +0.570313f,0.335938f, +0.578125f,0.335938f, +0.585938f,0.335938f, +0.59375f,0.335938f, +0.601563f,0.335938f, +0.609375f,0.335938f, +0.617188f,0.335938f, +0.625f,0.335938f, +0.632813f,0.335938f, +0.640625f,0.335938f, +0.648438f,0.335938f, +0.65625f,0.335938f, +0.664063f,0.335938f, +0.671875f,0.335938f, +0.679688f,0.335938f, +0.6875f,0.335938f, +0.695313f,0.335938f, +0.703125f,0.335938f, +0.710938f,0.335938f, +0.71875f,0.335938f, +0.726563f,0.335938f, +0.734375f,0.335938f, +0.742188f,0.335938f, +0.75f,0.335938f, +0.757813f,0.335938f, +0.765625f,0.335938f, +0.773438f,0.335938f, +0.78125f,0.335938f, +0.789063f,0.335938f, +0.796875f,0.335938f, +0.804688f,0.335938f, +0.8125f,0.335938f, +0.820313f,0.335938f, +0.828125f,0.335938f, +0.835938f,0.335938f, +0.84375f,0.335938f, +0.851563f,0.335938f, +0.859375f,0.335938f, +0.867188f,0.335938f, +0.875f,0.335938f, +0.882813f,0.335938f, +0.890625f,0.335938f, +0.898438f,0.335938f, +0.90625f,0.335938f, +0.914063f,0.335938f, +0.921875f,0.335938f, +0.929688f,0.335938f, +0.9375f,0.335938f, +0.945313f,0.335938f, +0.953125f,0.335938f, +0.960938f,0.335938f, +0.96875f,0.335938f, +0.976563f,0.335938f, +0.984375f,0.335938f, +0.992188f,0.335938f, +1.0f,0.335938f, +0.507813f,0.34375f, +0.515625f,0.34375f, +0.523438f,0.34375f, +0.53125f,0.34375f, +0.539063f,0.34375f, +0.546875f,0.34375f, +0.554688f,0.34375f, +0.5625f,0.34375f, +0.570313f,0.34375f, +0.578125f,0.34375f, +0.585938f,0.34375f, +0.59375f,0.34375f, +0.601563f,0.34375f, +0.609375f,0.34375f, +0.617188f,0.34375f, +0.625f,0.34375f, +0.632813f,0.34375f, +0.640625f,0.34375f, +0.648438f,0.34375f, +0.65625f,0.34375f, +0.664063f,0.34375f, +0.671875f,0.34375f, +0.679688f,0.34375f, +0.6875f,0.34375f, +0.695313f,0.34375f, +0.703125f,0.34375f, +0.710938f,0.34375f, +0.71875f,0.34375f, +0.726563f,0.34375f, +0.734375f,0.34375f, +0.742188f,0.34375f, +0.75f,0.34375f, +0.757813f,0.34375f, +0.765625f,0.34375f, +0.773438f,0.34375f, +0.78125f,0.34375f, +0.789063f,0.34375f, +0.796875f,0.34375f, +0.804688f,0.34375f, +0.8125f,0.34375f, +0.820313f,0.34375f, +0.828125f,0.34375f, +0.835938f,0.34375f, +0.84375f,0.34375f, +0.851563f,0.34375f, +0.859375f,0.34375f, +0.867188f,0.34375f, +0.875f,0.34375f, +0.882813f,0.34375f, +0.890625f,0.34375f, +0.898438f,0.34375f, +0.90625f,0.34375f, +0.914063f,0.34375f, +0.921875f,0.34375f, +0.929688f,0.34375f, +0.9375f,0.34375f, +0.945313f,0.34375f, +0.953125f,0.34375f, +0.960938f,0.34375f, +0.96875f,0.34375f, +0.976563f,0.34375f, +0.984375f,0.34375f, +0.992188f,0.34375f, +1.0f,0.34375f, +0.507813f,0.351563f, +0.515625f,0.351563f, +0.523438f,0.351563f, +0.53125f,0.351563f, +0.539063f,0.351563f, +0.546875f,0.351563f, +0.554688f,0.351563f, +0.5625f,0.351563f, +0.570313f,0.351563f, +0.578125f,0.351563f, +0.585938f,0.351563f, +0.59375f,0.351563f, +0.601563f,0.351563f, +0.609375f,0.351563f, +0.617188f,0.351563f, +0.625f,0.351563f, +0.632813f,0.351563f, +0.640625f,0.351563f, +0.648438f,0.351563f, +0.65625f,0.351563f, +0.664063f,0.351563f, +0.671875f,0.351563f, +0.679688f,0.351563f, +0.6875f,0.351563f, +0.695313f,0.351563f, +0.703125f,0.351563f, +0.710938f,0.351563f, +0.71875f,0.351563f, +0.726563f,0.351563f, +0.734375f,0.351563f, +0.742188f,0.351563f, +0.75f,0.351563f, +0.757813f,0.351563f, +0.765625f,0.351563f, +0.773438f,0.351563f, +0.78125f,0.351563f, +0.789063f,0.351563f, +0.796875f,0.351563f, +0.804688f,0.351563f, +0.8125f,0.351563f, +0.820313f,0.351563f, +0.828125f,0.351563f, +0.835938f,0.351563f, +0.84375f,0.351563f, +0.851563f,0.351563f, +0.859375f,0.351563f, +0.867188f,0.351563f, +0.875f,0.351563f, +0.882813f,0.351563f, +0.890625f,0.351563f, +0.898438f,0.351563f, +0.90625f,0.351563f, +0.914063f,0.351563f, +0.921875f,0.351563f, +0.929688f,0.351563f, +0.9375f,0.351563f, +0.945313f,0.351563f, +0.953125f,0.351563f, +0.960938f,0.351563f, +0.96875f,0.351563f, +0.976563f,0.351563f, +0.984375f,0.351563f, +0.992188f,0.351563f, +1.0f,0.351563f, +0.507813f,0.359375f, +0.515625f,0.359375f, +0.523438f,0.359375f, +0.53125f,0.359375f, +0.539063f,0.359375f, +0.546875f,0.359375f, +0.554688f,0.359375f, +0.5625f,0.359375f, +0.570313f,0.359375f, +0.578125f,0.359375f, +0.585938f,0.359375f, +0.59375f,0.359375f, +0.601563f,0.359375f, +0.609375f,0.359375f, +0.617188f,0.359375f, +0.625f,0.359375f, +0.632813f,0.359375f, +0.640625f,0.359375f, +0.648438f,0.359375f, +0.65625f,0.359375f, +0.664063f,0.359375f, +0.671875f,0.359375f, +0.679688f,0.359375f, +0.6875f,0.359375f, +0.695313f,0.359375f, +0.703125f,0.359375f, +0.710938f,0.359375f, +0.71875f,0.359375f, +0.726563f,0.359375f, +0.734375f,0.359375f, +0.742188f,0.359375f, +0.75f,0.359375f, +0.757813f,0.359375f, +0.765625f,0.359375f, +0.773438f,0.359375f, +0.78125f,0.359375f, +0.789063f,0.359375f, +0.796875f,0.359375f, +0.804688f,0.359375f, +0.8125f,0.359375f, +0.820313f,0.359375f, +0.828125f,0.359375f, +0.835938f,0.359375f, +0.84375f,0.359375f, +0.851563f,0.359375f, +0.859375f,0.359375f, +0.867188f,0.359375f, +0.875f,0.359375f, +0.882813f,0.359375f, +0.890625f,0.359375f, +0.898438f,0.359375f, +0.90625f,0.359375f, +0.914063f,0.359375f, +0.921875f,0.359375f, +0.929688f,0.359375f, +0.9375f,0.359375f, +0.945313f,0.359375f, +0.953125f,0.359375f, +0.960938f,0.359375f, +0.96875f,0.359375f, +0.976563f,0.359375f, +0.984375f,0.359375f, +0.992188f,0.359375f, +1.0f,0.359375f, +0.507813f,0.367188f, +0.515625f,0.367188f, +0.523438f,0.367188f, +0.53125f,0.367188f, +0.539063f,0.367188f, +0.546875f,0.367188f, +0.554688f,0.367188f, +0.5625f,0.367188f, +0.570313f,0.367188f, +0.578125f,0.367188f, +0.585938f,0.367188f, +0.59375f,0.367188f, +0.601563f,0.367188f, +0.609375f,0.367188f, +0.617188f,0.367188f, +0.625f,0.367188f, +0.632813f,0.367188f, +0.640625f,0.367188f, +0.648438f,0.367188f, +0.65625f,0.367188f, +0.664063f,0.367188f, +0.671875f,0.367188f, +0.679688f,0.367188f, +0.6875f,0.367188f, +0.695313f,0.367188f, +0.703125f,0.367188f, +0.710938f,0.367188f, +0.71875f,0.367188f, +0.726563f,0.367188f, +0.734375f,0.367188f, +0.742188f,0.367188f, +0.75f,0.367188f, +0.757813f,0.367188f, +0.765625f,0.367188f, +0.773438f,0.367188f, +0.78125f,0.367188f, +0.789063f,0.367188f, +0.796875f,0.367188f, +0.804688f,0.367188f, +0.8125f,0.367188f, +0.820313f,0.367188f, +0.828125f,0.367188f, +0.835938f,0.367188f, +0.84375f,0.367188f, +0.851563f,0.367188f, +0.859375f,0.367188f, +0.867188f,0.367188f, +0.875f,0.367188f, +0.882813f,0.367188f, +0.890625f,0.367188f, +0.898438f,0.367188f, +0.90625f,0.367188f, +0.914063f,0.367188f, +0.921875f,0.367188f, +0.929688f,0.367188f, +0.9375f,0.367188f, +0.945313f,0.367188f, +0.953125f,0.367188f, +0.960938f,0.367188f, +0.96875f,0.367188f, +0.976563f,0.367188f, +0.984375f,0.367188f, +0.992188f,0.367188f, +1.0f,0.367188f, +0.507813f,0.375f, +0.515625f,0.375f, +0.523438f,0.375f, +0.53125f,0.375f, +0.539063f,0.375f, +0.546875f,0.375f, +0.554688f,0.375f, +0.5625f,0.375f, +0.570313f,0.375f, +0.578125f,0.375f, +0.585938f,0.375f, +0.59375f,0.375f, +0.601563f,0.375f, +0.609375f,0.375f, +0.617188f,0.375f, +0.625f,0.375f, +0.632813f,0.375f, +0.640625f,0.375f, +0.648438f,0.375f, +0.65625f,0.375f, +0.664063f,0.375f, +0.671875f,0.375f, +0.679688f,0.375f, +0.6875f,0.375f, +0.695313f,0.375f, +0.703125f,0.375f, +0.710938f,0.375f, +0.71875f,0.375f, +0.726563f,0.375f, +0.734375f,0.375f, +0.742188f,0.375f, +0.75f,0.375f, +0.757813f,0.375f, +0.765625f,0.375f, +0.773438f,0.375f, +0.78125f,0.375f, +0.789063f,0.375f, +0.796875f,0.375f, +0.804688f,0.375f, +0.8125f,0.375f, +0.820313f,0.375f, +0.828125f,0.375f, +0.835938f,0.375f, +0.84375f,0.375f, +0.851563f,0.375f, +0.859375f,0.375f, +0.867188f,0.375f, +0.875f,0.375f, +0.882813f,0.375f, +0.890625f,0.375f, +0.898438f,0.375f, +0.90625f,0.375f, +0.914063f,0.375f, +0.921875f,0.375f, +0.929688f,0.375f, +0.9375f,0.375f, +0.945313f,0.375f, +0.953125f,0.375f, +0.960938f,0.375f, +0.96875f,0.375f, +0.976563f,0.375f, +0.984375f,0.375f, +0.992188f,0.375f, +1.0f,0.375f, +0.507813f,0.382813f, +0.515625f,0.382813f, +0.523438f,0.382813f, +0.53125f,0.382813f, +0.539063f,0.382813f, +0.546875f,0.382813f, +0.554688f,0.382813f, +0.5625f,0.382813f, +0.570313f,0.382813f, +0.578125f,0.382813f, +0.585938f,0.382813f, +0.59375f,0.382813f, +0.601563f,0.382813f, +0.609375f,0.382813f, +0.617188f,0.382813f, +0.625f,0.382813f, +0.632813f,0.382813f, +0.640625f,0.382813f, +0.648438f,0.382813f, +0.65625f,0.382813f, +0.664063f,0.382813f, +0.671875f,0.382813f, +0.679688f,0.382813f, +0.6875f,0.382813f, +0.695313f,0.382813f, +0.703125f,0.382813f, +0.710938f,0.382813f, +0.71875f,0.382813f, +0.726563f,0.382813f, +0.734375f,0.382813f, +0.742188f,0.382813f, +0.75f,0.382813f, +0.757813f,0.382813f, +0.765625f,0.382813f, +0.773438f,0.382813f, +0.78125f,0.382813f, +0.789063f,0.382813f, +0.796875f,0.382813f, +0.804688f,0.382813f, +0.8125f,0.382813f, +0.820313f,0.382813f, +0.828125f,0.382813f, +0.835938f,0.382813f, +0.84375f,0.382813f, +0.851563f,0.382813f, +0.859375f,0.382813f, +0.867188f,0.382813f, +0.875f,0.382813f, +0.882813f,0.382813f, +0.890625f,0.382813f, +0.898438f,0.382813f, +0.90625f,0.382813f, +0.914063f,0.382813f, +0.921875f,0.382813f, +0.929688f,0.382813f, +0.9375f,0.382813f, +0.945313f,0.382813f, +0.953125f,0.382813f, +0.960938f,0.382813f, +0.96875f,0.382813f, +0.976563f,0.382813f, +0.984375f,0.382813f, +0.992188f,0.382813f, +1.0f,0.382813f, +0.507813f,0.390625f, +0.515625f,0.390625f, +0.523438f,0.390625f, +0.53125f,0.390625f, +0.539063f,0.390625f, +0.546875f,0.390625f, +0.554688f,0.390625f, +0.5625f,0.390625f, +0.570313f,0.390625f, +0.578125f,0.390625f, +0.585938f,0.390625f, +0.59375f,0.390625f, +0.601563f,0.390625f, +0.609375f,0.390625f, +0.617188f,0.390625f, +0.625f,0.390625f, +0.632813f,0.390625f, +0.640625f,0.390625f, +0.648438f,0.390625f, +0.65625f,0.390625f, +0.664063f,0.390625f, +0.671875f,0.390625f, +0.679688f,0.390625f, +0.6875f,0.390625f, +0.695313f,0.390625f, +0.703125f,0.390625f, +0.710938f,0.390625f, +0.71875f,0.390625f, +0.726563f,0.390625f, +0.734375f,0.390625f, +0.742188f,0.390625f, +0.75f,0.390625f, +0.757813f,0.390625f, +0.765625f,0.390625f, +0.773438f,0.390625f, +0.78125f,0.390625f, +0.789063f,0.390625f, +0.796875f,0.390625f, +0.804688f,0.390625f, +0.8125f,0.390625f, +0.820313f,0.390625f, +0.828125f,0.390625f, +0.835938f,0.390625f, +0.84375f,0.390625f, +0.851563f,0.390625f, +0.859375f,0.390625f, +0.867188f,0.390625f, +0.875f,0.390625f, +0.882813f,0.390625f, +0.890625f,0.390625f, +0.898438f,0.390625f, +0.90625f,0.390625f, +0.914063f,0.390625f, +0.921875f,0.390625f, +0.929688f,0.390625f, +0.9375f,0.390625f, +0.945313f,0.390625f, +0.953125f,0.390625f, +0.960938f,0.390625f, +0.96875f,0.390625f, +0.976563f,0.390625f, +0.984375f,0.390625f, +0.992188f,0.390625f, +1.0f,0.390625f, +0.507813f,0.398438f, +0.515625f,0.398438f, +0.523438f,0.398438f, +0.53125f,0.398438f, +0.539063f,0.398438f, +0.546875f,0.398438f, +0.554688f,0.398438f, +0.5625f,0.398438f, +0.570313f,0.398438f, +0.578125f,0.398438f, +0.585938f,0.398438f, +0.59375f,0.398438f, +0.601563f,0.398438f, +0.609375f,0.398438f, +0.617188f,0.398438f, +0.625f,0.398438f, +0.632813f,0.398438f, +0.640625f,0.398438f, +0.648438f,0.398438f, +0.65625f,0.398438f, +0.664063f,0.398438f, +0.671875f,0.398438f, +0.679688f,0.398438f, +0.6875f,0.398438f, +0.695313f,0.398438f, +0.703125f,0.398438f, +0.710938f,0.398438f, +0.71875f,0.398438f, +0.726563f,0.398438f, +0.734375f,0.398438f, +0.742188f,0.398438f, +0.75f,0.398438f, +0.757813f,0.398438f, +0.765625f,0.398438f, +0.773438f,0.398438f, +0.78125f,0.398438f, +0.789063f,0.398438f, +0.796875f,0.398438f, +0.804688f,0.398438f, +0.8125f,0.398438f, +0.820313f,0.398438f, +0.828125f,0.398438f, +0.835938f,0.398438f, +0.84375f,0.398438f, +0.851563f,0.398438f, +0.859375f,0.398438f, +0.867188f,0.398438f, +0.875f,0.398438f, +0.882813f,0.398438f, +0.890625f,0.398438f, +0.898438f,0.398438f, +0.90625f,0.398438f, +0.914063f,0.398438f, +0.921875f,0.398438f, +0.929688f,0.398438f, +0.9375f,0.398438f, +0.945313f,0.398438f, +0.953125f,0.398438f, +0.960938f,0.398438f, +0.96875f,0.398438f, +0.976563f,0.398438f, +0.984375f,0.398438f, +0.992188f,0.398438f, +1.0f,0.398438f, +0.507813f,0.40625f, +0.515625f,0.40625f, +0.523438f,0.40625f, +0.53125f,0.40625f, +0.539063f,0.40625f, +0.546875f,0.40625f, +0.554688f,0.40625f, +0.5625f,0.40625f, +0.570313f,0.40625f, +0.578125f,0.40625f, +0.585938f,0.40625f, +0.59375f,0.40625f, +0.601563f,0.40625f, +0.609375f,0.40625f, +0.617188f,0.40625f, +0.625f,0.40625f, +0.632813f,0.40625f, +0.640625f,0.40625f, +0.648438f,0.40625f, +0.65625f,0.40625f, +0.664063f,0.40625f, +0.671875f,0.40625f, +0.679688f,0.40625f, +0.6875f,0.40625f, +0.695313f,0.40625f, +0.703125f,0.40625f, +0.710938f,0.40625f, +0.71875f,0.40625f, +0.726563f,0.40625f, +0.734375f,0.40625f, +0.742188f,0.40625f, +0.75f,0.40625f, +0.757813f,0.40625f, +0.765625f,0.40625f, +0.773438f,0.40625f, +0.78125f,0.40625f, +0.789063f,0.40625f, +0.796875f,0.40625f, +0.804688f,0.40625f, +0.8125f,0.40625f, +0.820313f,0.40625f, +0.828125f,0.40625f, +0.835938f,0.40625f, +0.84375f,0.40625f, +0.851563f,0.40625f, +0.859375f,0.40625f, +0.867188f,0.40625f, +0.875f,0.40625f, +0.882813f,0.40625f, +0.890625f,0.40625f, +0.898438f,0.40625f, +0.90625f,0.40625f, +0.914063f,0.40625f, +0.921875f,0.40625f, +0.929688f,0.40625f, +0.9375f,0.40625f, +0.945313f,0.40625f, +0.953125f,0.40625f, +0.960938f,0.40625f, +0.96875f,0.40625f, +0.976563f,0.40625f, +0.984375f,0.40625f, +0.992188f,0.40625f, +1.0f,0.40625f, +0.507813f,0.414063f, +0.515625f,0.414063f, +0.523438f,0.414063f, +0.53125f,0.414063f, +0.539063f,0.414063f, +0.546875f,0.414063f, +0.554688f,0.414063f, +0.5625f,0.414063f, +0.570313f,0.414063f, +0.578125f,0.414063f, +0.585938f,0.414063f, +0.59375f,0.414063f, +0.601563f,0.414063f, +0.609375f,0.414063f, +0.617188f,0.414063f, +0.625f,0.414063f, +0.632813f,0.414063f, +0.640625f,0.414063f, +0.648438f,0.414063f, +0.65625f,0.414063f, +0.664063f,0.414063f, +0.671875f,0.414063f, +0.679688f,0.414063f, +0.6875f,0.414063f, +0.695313f,0.414063f, +0.703125f,0.414063f, +0.710938f,0.414063f, +0.71875f,0.414063f, +0.726563f,0.414063f, +0.734375f,0.414063f, +0.742188f,0.414063f, +0.75f,0.414063f, +0.757813f,0.414063f, +0.765625f,0.414063f, +0.773438f,0.414063f, +0.78125f,0.414063f, +0.789063f,0.414063f, +0.796875f,0.414063f, +0.804688f,0.414063f, +0.8125f,0.414063f, +0.820313f,0.414063f, +0.828125f,0.414063f, +0.835938f,0.414063f, +0.84375f,0.414063f, +0.851563f,0.414063f, +0.859375f,0.414063f, +0.867188f,0.414063f, +0.875f,0.414063f, +0.882813f,0.414063f, +0.890625f,0.414063f, +0.898438f,0.414063f, +0.90625f,0.414063f, +0.914063f,0.414063f, +0.921875f,0.414063f, +0.929688f,0.414063f, +0.9375f,0.414063f, +0.945313f,0.414063f, +0.953125f,0.414063f, +0.960938f,0.414063f, +0.96875f,0.414063f, +0.976563f,0.414063f, +0.984375f,0.414063f, +0.992188f,0.414063f, +1.0f,0.414063f, +0.507813f,0.421875f, +0.515625f,0.421875f, +0.523438f,0.421875f, +0.53125f,0.421875f, +0.539063f,0.421875f, +0.546875f,0.421875f, +0.554688f,0.421875f, +0.5625f,0.421875f, +0.570313f,0.421875f, +0.578125f,0.421875f, +0.585938f,0.421875f, +0.59375f,0.421875f, +0.601563f,0.421875f, +0.609375f,0.421875f, +0.617188f,0.421875f, +0.625f,0.421875f, +0.632813f,0.421875f, +0.640625f,0.421875f, +0.648438f,0.421875f, +0.65625f,0.421875f, +0.664063f,0.421875f, +0.671875f,0.421875f, +0.679688f,0.421875f, +0.6875f,0.421875f, +0.695313f,0.421875f, +0.703125f,0.421875f, +0.710938f,0.421875f, +0.71875f,0.421875f, +0.726563f,0.421875f, +0.734375f,0.421875f, +0.742188f,0.421875f, +0.75f,0.421875f, +0.757813f,0.421875f, +0.765625f,0.421875f, +0.773438f,0.421875f, +0.78125f,0.421875f, +0.789063f,0.421875f, +0.796875f,0.421875f, +0.804688f,0.421875f, +0.8125f,0.421875f, +0.820313f,0.421875f, +0.828125f,0.421875f, +0.835938f,0.421875f, +0.84375f,0.421875f, +0.851563f,0.421875f, +0.859375f,0.421875f, +0.867188f,0.421875f, +0.875f,0.421875f, +0.882813f,0.421875f, +0.890625f,0.421875f, +0.898438f,0.421875f, +0.90625f,0.421875f, +0.914063f,0.421875f, +0.921875f,0.421875f, +0.929688f,0.421875f, +0.9375f,0.421875f, +0.945313f,0.421875f, +0.953125f,0.421875f, +0.960938f,0.421875f, +0.96875f,0.421875f, +0.976563f,0.421875f, +0.984375f,0.421875f, +0.992188f,0.421875f, +1.0f,0.421875f, +0.507813f,0.429688f, +0.515625f,0.429688f, +0.523438f,0.429688f, +0.53125f,0.429688f, +0.539063f,0.429688f, +0.546875f,0.429688f, +0.554688f,0.429688f, +0.5625f,0.429688f, +0.570313f,0.429688f, +0.578125f,0.429688f, +0.585938f,0.429688f, +0.59375f,0.429688f, +0.601563f,0.429688f, +0.609375f,0.429688f, +0.617188f,0.429688f, +0.625f,0.429688f, +0.632813f,0.429688f, +0.640625f,0.429688f, +0.648438f,0.429688f, +0.65625f,0.429688f, +0.664063f,0.429688f, +0.671875f,0.429688f, +0.679688f,0.429688f, +0.6875f,0.429688f, +0.695313f,0.429688f, +0.703125f,0.429688f, +0.710938f,0.429688f, +0.71875f,0.429688f, +0.726563f,0.429688f, +0.734375f,0.429688f, +0.742188f,0.429688f, +0.75f,0.429688f, +0.757813f,0.429688f, +0.765625f,0.429688f, +0.773438f,0.429688f, +0.78125f,0.429688f, +0.789063f,0.429688f, +0.796875f,0.429688f, +0.804688f,0.429688f, +0.8125f,0.429688f, +0.820313f,0.429688f, +0.828125f,0.429688f, +0.835938f,0.429688f, +0.84375f,0.429688f, +0.851563f,0.429688f, +0.859375f,0.429688f, +0.867188f,0.429688f, +0.875f,0.429688f, +0.882813f,0.429688f, +0.890625f,0.429688f, +0.898438f,0.429688f, +0.90625f,0.429688f, +0.914063f,0.429688f, +0.921875f,0.429688f, +0.929688f,0.429688f, +0.9375f,0.429688f, +0.945313f,0.429688f, +0.953125f,0.429688f, +0.960938f,0.429688f, +0.96875f,0.429688f, +0.976563f,0.429688f, +0.984375f,0.429688f, +0.992188f,0.429688f, +1.0f,0.429688f, +0.507813f,0.4375f, +0.515625f,0.4375f, +0.523438f,0.4375f, +0.53125f,0.4375f, +0.539063f,0.4375f, +0.546875f,0.4375f, +0.554688f,0.4375f, +0.5625f,0.4375f, +0.570313f,0.4375f, +0.578125f,0.4375f, +0.585938f,0.4375f, +0.59375f,0.4375f, +0.601563f,0.4375f, +0.609375f,0.4375f, +0.617188f,0.4375f, +0.625f,0.4375f, +0.632813f,0.4375f, +0.640625f,0.4375f, +0.648438f,0.4375f, +0.65625f,0.4375f, +0.664063f,0.4375f, +0.671875f,0.4375f, +0.679688f,0.4375f, +0.6875f,0.4375f, +0.695313f,0.4375f, +0.703125f,0.4375f, +0.710938f,0.4375f, +0.71875f,0.4375f, +0.726563f,0.4375f, +0.734375f,0.4375f, +0.742188f,0.4375f, +0.75f,0.4375f, +0.757813f,0.4375f, +0.765625f,0.4375f, +0.773438f,0.4375f, +0.78125f,0.4375f, +0.789063f,0.4375f, +0.796875f,0.4375f, +0.804688f,0.4375f, +0.8125f,0.4375f, +0.820313f,0.4375f, +0.828125f,0.4375f, +0.835938f,0.4375f, +0.84375f,0.4375f, +0.851563f,0.4375f, +0.859375f,0.4375f, +0.867188f,0.4375f, +0.875f,0.4375f, +0.882813f,0.4375f, +0.890625f,0.4375f, +0.898438f,0.4375f, +0.90625f,0.4375f, +0.914063f,0.4375f, +0.921875f,0.4375f, +0.929688f,0.4375f, +0.9375f,0.4375f, +0.945313f,0.4375f, +0.953125f,0.4375f, +0.960938f,0.4375f, +0.96875f,0.4375f, +0.976563f,0.4375f, +0.984375f,0.4375f, +0.992188f,0.4375f, +1.0f,0.4375f, +0.507813f,0.445313f, +0.515625f,0.445313f, +0.523438f,0.445313f, +0.53125f,0.445313f, +0.539063f,0.445313f, +0.546875f,0.445313f, +0.554688f,0.445313f, +0.5625f,0.445313f, +0.570313f,0.445313f, +0.578125f,0.445313f, +0.585938f,0.445313f, +0.59375f,0.445313f, +0.601563f,0.445313f, +0.609375f,0.445313f, +0.617188f,0.445313f, +0.625f,0.445313f, +0.632813f,0.445313f, +0.640625f,0.445313f, +0.648438f,0.445313f, +0.65625f,0.445313f, +0.664063f,0.445313f, +0.671875f,0.445313f, +0.679688f,0.445313f, +0.6875f,0.445313f, +0.695313f,0.445313f, +0.703125f,0.445313f, +0.710938f,0.445313f, +0.71875f,0.445313f, +0.726563f,0.445313f, +0.734375f,0.445313f, +0.742188f,0.445313f, +0.75f,0.445313f, +0.757813f,0.445313f, +0.765625f,0.445313f, +0.773438f,0.445313f, +0.78125f,0.445313f, +0.789063f,0.445313f, +0.796875f,0.445313f, +0.804688f,0.445313f, +0.8125f,0.445313f, +0.820313f,0.445313f, +0.828125f,0.445313f, +0.835938f,0.445313f, +0.84375f,0.445313f, +0.851563f,0.445313f, +0.859375f,0.445313f, +0.867188f,0.445313f, +0.875f,0.445313f, +0.882813f,0.445313f, +0.890625f,0.445313f, +0.898438f,0.445313f, +0.90625f,0.445313f, +0.914063f,0.445313f, +0.921875f,0.445313f, +0.929688f,0.445313f, +0.9375f,0.445313f, +0.945313f,0.445313f, +0.953125f,0.445313f, +0.960938f,0.445313f, +0.96875f,0.445313f, +0.976563f,0.445313f, +0.984375f,0.445313f, +0.992188f,0.445313f, +1.0f,0.445313f, +0.507813f,0.453125f, +0.515625f,0.453125f, +0.523438f,0.453125f, +0.53125f,0.453125f, +0.539063f,0.453125f, +0.546875f,0.453125f, +0.554688f,0.453125f, +0.5625f,0.453125f, +0.570313f,0.453125f, +0.578125f,0.453125f, +0.585938f,0.453125f, +0.59375f,0.453125f, +0.601563f,0.453125f, +0.609375f,0.453125f, +0.617188f,0.453125f, +0.625f,0.453125f, +0.632813f,0.453125f, +0.640625f,0.453125f, +0.648438f,0.453125f, +0.65625f,0.453125f, +0.664063f,0.453125f, +0.671875f,0.453125f, +0.679688f,0.453125f, +0.6875f,0.453125f, +0.695313f,0.453125f, +0.703125f,0.453125f, +0.710938f,0.453125f, +0.71875f,0.453125f, +0.726563f,0.453125f, +0.734375f,0.453125f, +0.742188f,0.453125f, +0.75f,0.453125f, +0.757813f,0.453125f, +0.765625f,0.453125f, +0.773438f,0.453125f, +0.78125f,0.453125f, +0.789063f,0.453125f, +0.796875f,0.453125f, +0.804688f,0.453125f, +0.8125f,0.453125f, +0.820313f,0.453125f, +0.828125f,0.453125f, +0.835938f,0.453125f, +0.84375f,0.453125f, +0.851563f,0.453125f, +0.859375f,0.453125f, +0.867188f,0.453125f, +0.875f,0.453125f, +0.882813f,0.453125f, +0.890625f,0.453125f, +0.898438f,0.453125f, +0.90625f,0.453125f, +0.914063f,0.453125f, +0.921875f,0.453125f, +0.929688f,0.453125f, +0.9375f,0.453125f, +0.945313f,0.453125f, +0.953125f,0.453125f, +0.960938f,0.453125f, +0.96875f,0.453125f, +0.976563f,0.453125f, +0.984375f,0.453125f, +0.992188f,0.453125f, +1.0f,0.453125f, +0.507813f,0.460938f, +0.515625f,0.460938f, +0.523438f,0.460938f, +0.53125f,0.460938f, +0.539063f,0.460938f, +0.546875f,0.460938f, +0.554688f,0.460938f, +0.5625f,0.460938f, +0.570313f,0.460938f, +0.578125f,0.460938f, +0.585938f,0.460938f, +0.59375f,0.460938f, +0.601563f,0.460938f, +0.609375f,0.460938f, +0.617188f,0.460938f, +0.625f,0.460938f, +0.632813f,0.460938f, +0.640625f,0.460938f, +0.648438f,0.460938f, +0.65625f,0.460938f, +0.664063f,0.460938f, +0.671875f,0.460938f, +0.679688f,0.460938f, +0.6875f,0.460938f, +0.695313f,0.460938f, +0.703125f,0.460938f, +0.710938f,0.460938f, +0.71875f,0.460938f, +0.726563f,0.460938f, +0.734375f,0.460938f, +0.742188f,0.460938f, +0.75f,0.460938f, +0.757813f,0.460938f, +0.765625f,0.460938f, +0.773438f,0.460938f, +0.78125f,0.460938f, +0.789063f,0.460938f, +0.796875f,0.460938f, +0.804688f,0.460938f, +0.8125f,0.460938f, +0.820313f,0.460938f, +0.828125f,0.460938f, +0.835938f,0.460938f, +0.84375f,0.460938f, +0.851563f,0.460938f, +0.859375f,0.460938f, +0.867188f,0.460938f, +0.875f,0.460938f, +0.882813f,0.460938f, +0.890625f,0.460938f, +0.898438f,0.460938f, +0.90625f,0.460938f, +0.914063f,0.460938f, +0.921875f,0.460938f, +0.929688f,0.460938f, +0.9375f,0.460938f, +0.945313f,0.460938f, +0.953125f,0.460938f, +0.960938f,0.460938f, +0.96875f,0.460938f, +0.976563f,0.460938f, +0.984375f,0.460938f, +0.992188f,0.460938f, +1.0f,0.460938f, +0.507813f,0.46875f, +0.515625f,0.46875f, +0.523438f,0.46875f, +0.53125f,0.46875f, +0.539063f,0.46875f, +0.546875f,0.46875f, +0.554688f,0.46875f, +0.5625f,0.46875f, +0.570313f,0.46875f, +0.578125f,0.46875f, +0.585938f,0.46875f, +0.59375f,0.46875f, +0.601563f,0.46875f, +0.609375f,0.46875f, +0.617188f,0.46875f, +0.625f,0.46875f, +0.632813f,0.46875f, +0.640625f,0.46875f, +0.648438f,0.46875f, +0.65625f,0.46875f, +0.664063f,0.46875f, +0.671875f,0.46875f, +0.679688f,0.46875f, +0.6875f,0.46875f, +0.695313f,0.46875f, +0.703125f,0.46875f, +0.710938f,0.46875f, +0.71875f,0.46875f, +0.726563f,0.46875f, +0.734375f,0.46875f, +0.742188f,0.46875f, +0.75f,0.46875f, +0.757813f,0.46875f, +0.765625f,0.46875f, +0.773438f,0.46875f, +0.78125f,0.46875f, +0.789063f,0.46875f, +0.796875f,0.46875f, +0.804688f,0.46875f, +0.8125f,0.46875f, +0.820313f,0.46875f, +0.828125f,0.46875f, +0.835938f,0.46875f, +0.84375f,0.46875f, +0.851563f,0.46875f, +0.859375f,0.46875f, +0.867188f,0.46875f, +0.875f,0.46875f, +0.882813f,0.46875f, +0.890625f,0.46875f, +0.898438f,0.46875f, +0.90625f,0.46875f, +0.914063f,0.46875f, +0.921875f,0.46875f, +0.929688f,0.46875f, +0.9375f,0.46875f, +0.945313f,0.46875f, +0.953125f,0.46875f, +0.960938f,0.46875f, +0.96875f,0.46875f, +0.976563f,0.46875f, +0.984375f,0.46875f, +0.992188f,0.46875f, +1.0f,0.46875f, +0.507813f,0.476563f, +0.515625f,0.476563f, +0.523438f,0.476563f, +0.53125f,0.476563f, +0.539063f,0.476563f, +0.546875f,0.476563f, +0.554688f,0.476563f, +0.5625f,0.476563f, +0.570313f,0.476563f, +0.578125f,0.476563f, +0.585938f,0.476563f, +0.59375f,0.476563f, +0.601563f,0.476563f, +0.609375f,0.476563f, +0.617188f,0.476563f, +0.625f,0.476563f, +0.632813f,0.476563f, +0.640625f,0.476563f, +0.648438f,0.476563f, +0.65625f,0.476563f, +0.664063f,0.476563f, +0.671875f,0.476563f, +0.679688f,0.476563f, +0.6875f,0.476563f, +0.695313f,0.476563f, +0.703125f,0.476563f, +0.710938f,0.476563f, +0.71875f,0.476563f, +0.726563f,0.476563f, +0.734375f,0.476563f, +0.742188f,0.476563f, +0.75f,0.476563f, +0.757813f,0.476563f, +0.765625f,0.476563f, +0.773438f,0.476563f, +0.78125f,0.476563f, +0.789063f,0.476563f, +0.796875f,0.476563f, +0.804688f,0.476563f, +0.8125f,0.476563f, +0.820313f,0.476563f, +0.828125f,0.476563f, +0.835938f,0.476563f, +0.84375f,0.476563f, +0.851563f,0.476563f, +0.859375f,0.476563f, +0.867188f,0.476563f, +0.875f,0.476563f, +0.882813f,0.476563f, +0.890625f,0.476563f, +0.898438f,0.476563f, +0.90625f,0.476563f, +0.914063f,0.476563f, +0.921875f,0.476563f, +0.929688f,0.476563f, +0.9375f,0.476563f, +0.945313f,0.476563f, +0.953125f,0.476563f, +0.960938f,0.476563f, +0.96875f,0.476563f, +0.976563f,0.476563f, +0.984375f,0.476563f, +0.992188f,0.476563f, +1.0f,0.476563f, +0.507813f,0.484375f, +0.515625f,0.484375f, +0.523438f,0.484375f, +0.53125f,0.484375f, +0.539063f,0.484375f, +0.546875f,0.484375f, +0.554688f,0.484375f, +0.5625f,0.484375f, +0.570313f,0.484375f, +0.578125f,0.484375f, +0.585938f,0.484375f, +0.59375f,0.484375f, +0.601563f,0.484375f, +0.609375f,0.484375f, +0.617188f,0.484375f, +0.625f,0.484375f, +0.632813f,0.484375f, +0.640625f,0.484375f, +0.648438f,0.484375f, +0.65625f,0.484375f, +0.664063f,0.484375f, +0.671875f,0.484375f, +0.679688f,0.484375f, +0.6875f,0.484375f, +0.695313f,0.484375f, +0.703125f,0.484375f, +0.710938f,0.484375f, +0.71875f,0.484375f, +0.726563f,0.484375f, +0.734375f,0.484375f, +0.742188f,0.484375f, +0.75f,0.484375f, +0.757813f,0.484375f, +0.765625f,0.484375f, +0.773438f,0.484375f, +0.78125f,0.484375f, +0.789063f,0.484375f, +0.796875f,0.484375f, +0.804688f,0.484375f, +0.8125f,0.484375f, +0.820313f,0.484375f, +0.828125f,0.484375f, +0.835938f,0.484375f, +0.84375f,0.484375f, +0.851563f,0.484375f, +0.859375f,0.484375f, +0.867188f,0.484375f, +0.875f,0.484375f, +0.882813f,0.484375f, +0.890625f,0.484375f, +0.898438f,0.484375f, +0.90625f,0.484375f, +0.914063f,0.484375f, +0.921875f,0.484375f, +0.929688f,0.484375f, +0.9375f,0.484375f, +0.945313f,0.484375f, +0.953125f,0.484375f, +0.960938f,0.484375f, +0.96875f,0.484375f, +0.976563f,0.484375f, +0.984375f,0.484375f, +0.992188f,0.484375f, +1.0f,0.484375f, +0.507813f,0.492188f, +0.515625f,0.492188f, +0.523438f,0.492188f, +0.53125f,0.492188f, +0.539063f,0.492188f, +0.546875f,0.492188f, +0.554688f,0.492188f, +0.5625f,0.492188f, +0.570313f,0.492188f, +0.578125f,0.492188f, +0.585938f,0.492188f, +0.59375f,0.492188f, +0.601563f,0.492188f, +0.609375f,0.492188f, +0.617188f,0.492188f, +0.625f,0.492188f, +0.632813f,0.492188f, +0.640625f,0.492188f, +0.648438f,0.492188f, +0.65625f,0.492188f, +0.664063f,0.492188f, +0.671875f,0.492188f, +0.679688f,0.492188f, +0.6875f,0.492188f, +0.695313f,0.492188f, +0.703125f,0.492188f, +0.710938f,0.492188f, +0.71875f,0.492188f, +0.726563f,0.492188f, +0.734375f,0.492188f, +0.742188f,0.492188f, +0.75f,0.492188f, +0.757813f,0.492188f, +0.765625f,0.492188f, +0.773438f,0.492188f, +0.78125f,0.492188f, +0.789063f,0.492188f, +0.796875f,0.492188f, +0.804688f,0.492188f, +0.8125f,0.492188f, +0.820313f,0.492188f, +0.828125f,0.492188f, +0.835938f,0.492188f, +0.84375f,0.492188f, +0.851563f,0.492188f, +0.859375f,0.492188f, +0.867188f,0.492188f, +0.875f,0.492188f, +0.882813f,0.492188f, +0.890625f,0.492188f, +0.898438f,0.492188f, +0.90625f,0.492188f, +0.914063f,0.492188f, +0.921875f,0.492188f, +0.929688f,0.492188f, +0.9375f,0.492188f, +0.945313f,0.492188f, +0.953125f,0.492188f, +0.960938f,0.492188f, +0.96875f,0.492188f, +0.976563f,0.492188f, +0.984375f,0.492188f, +0.992188f,0.492188f, +1.0f,0.492188f, +}; + +unsigned short Landscape04Idx[] = { +0,1,2, +3,2,1, +2,3,4, +5,4,3, +4,5,6, +7,6,5, +6,7,8, +9,8,7, +8,9,10, +11,10,9, +10,11,12, +13,12,11, +12,13,14, +15,14,13, +14,15,16, +17,16,15, +16,17,18, +19,18,17, +18,19,20, +21,20,19, +20,21,22, +23,22,21, +22,23,24, +25,24,23, +24,25,26, +27,26,25, +26,27,28, +29,28,27, +28,29,30, +31,30,29, +30,31,32, +33,32,31, +32,33,34, +35,34,33, +34,35,36, +37,36,35, +36,37,38, +39,38,37, +38,39,40, +41,40,39, +40,41,42, +43,42,41, +42,43,44, +45,44,43, +44,45,46, +47,46,45, +46,47,48, +49,48,47, +48,49,50, +51,50,49, +50,51,52, +53,52,51, +52,53,54, +55,54,53, +54,55,56, +57,56,55, +56,57,58, +59,58,57, +58,59,60, +61,60,59, +60,61,62, +63,62,61, +62,63,64, +65,64,63, +64,65,66, +67,66,65, +66,67,68, +69,68,67, +68,69,70, +71,70,69, +70,71,72, +73,72,71, +72,73,74, +75,74,73, +74,75,76, +77,76,75, +76,77,78, +79,78,77, +78,79,80, +81,80,79, +80,81,82, +83,82,81, +82,83,84, +85,84,83, +84,85,86, +87,86,85, +86,87,88, +89,88,87, +88,89,90, +91,90,89, +90,91,92, +93,92,91, +92,93,94, +95,94,93, +94,95,96, +97,96,95, +96,97,98, +99,98,97, +98,99,100, +101,100,99, +100,101,102, +103,102,101, +102,103,104, +105,104,103, +104,105,106, +107,106,105, +106,107,108, +109,108,107, +108,109,110, +111,110,109, +110,111,112, +113,112,111, +112,113,114, +115,114,113, +114,115,116, +117,116,115, +116,117,118, +119,118,117, +118,119,120, +121,120,119, +120,121,122, +123,122,121, +122,123,124, +125,124,123, +124,125,126, +127,126,125, +128,0,129, +2,129,0, +129,2,130, +4,130,2, +130,4,131, +6,131,4, +131,6,132, +8,132,6, +132,8,133, +10,133,8, +133,10,134, +12,134,10, +134,12,135, +14,135,12, +135,14,136, +16,136,14, +136,16,137, +18,137,16, +137,18,138, +20,138,18, +138,20,139, +22,139,20, +139,22,140, +24,140,22, +140,24,141, +26,141,24, +141,26,142, +28,142,26, +142,28,143, +30,143,28, +143,30,144, +32,144,30, +144,32,145, +34,145,32, +145,34,146, +36,146,34, +146,36,147, +38,147,36, +147,38,148, +40,148,38, +148,40,149, +42,149,40, +149,42,150, +44,150,42, +150,44,151, +46,151,44, +151,46,152, +48,152,46, +152,48,153, +50,153,48, +153,50,154, +52,154,50, +154,52,155, +54,155,52, +155,54,156, +56,156,54, +156,56,157, +58,157,56, +157,58,158, +60,158,58, +158,60,159, +62,159,60, +159,62,160, +64,160,62, +160,64,161, +66,161,64, +161,66,162, +68,162,66, +162,68,163, +70,163,68, +163,70,164, +72,164,70, +164,72,165, +74,165,72, +165,74,166, +76,166,74, +166,76,167, +78,167,76, +167,78,168, +80,168,78, +168,80,169, +82,169,80, +169,82,170, +84,170,82, +170,84,171, +86,171,84, +171,86,172, +88,172,86, +172,88,173, +90,173,88, +173,90,174, +92,174,90, +174,92,175, +94,175,92, +175,94,176, +96,176,94, +176,96,177, +98,177,96, +177,98,178, +100,178,98, +178,100,179, +102,179,100, +179,102,180, +104,180,102, +180,104,181, +106,181,104, +181,106,182, +108,182,106, +182,108,183, +110,183,108, +183,110,184, +112,184,110, +184,112,185, +114,185,112, +185,114,186, +116,186,114, +186,116,187, +118,187,116, +187,118,188, +120,188,118, +188,120,189, +122,189,120, +189,122,190, +124,190,122, +190,124,191, +126,191,124, +192,128,193, +129,193,128, +193,129,194, +130,194,129, +194,130,195, +131,195,130, +195,131,196, +132,196,131, +196,132,197, +133,197,132, +197,133,198, +134,198,133, +198,134,199, +135,199,134, +199,135,200, +136,200,135, +200,136,201, +137,201,136, +201,137,202, +138,202,137, +202,138,203, +139,203,138, +203,139,204, +140,204,139, +204,140,205, +141,205,140, +205,141,206, +142,206,141, +206,142,207, +143,207,142, +207,143,208, +144,208,143, +208,144,209, +145,209,144, +209,145,210, +146,210,145, +210,146,211, +147,211,146, +211,147,212, +148,212,147, +212,148,213, +149,213,148, +213,149,214, +150,214,149, +214,150,215, +151,215,150, +215,151,216, +152,216,151, +216,152,217, +153,217,152, +217,153,218, +154,218,153, +218,154,219, +155,219,154, +219,155,220, +156,220,155, +220,156,221, +157,221,156, +221,157,222, +158,222,157, +222,158,223, +159,223,158, +223,159,224, +160,224,159, +224,160,225, +161,225,160, +225,161,226, +162,226,161, +226,162,227, +163,227,162, +227,163,228, +164,228,163, +228,164,229, +165,229,164, +229,165,230, +166,230,165, +230,166,231, +167,231,166, +231,167,232, +168,232,167, +232,168,233, +169,233,168, +233,169,234, +170,234,169, +234,170,235, +171,235,170, +235,171,236, +172,236,171, +236,172,237, +173,237,172, +237,173,238, +174,238,173, +238,174,239, +175,239,174, +239,175,240, +176,240,175, +240,176,241, +177,241,176, +241,177,242, +178,242,177, +242,178,243, +179,243,178, +243,179,244, +180,244,179, +244,180,245, +181,245,180, +245,181,246, +182,246,181, +246,182,247, +183,247,182, +247,183,248, +184,248,183, +248,184,249, +185,249,184, +249,185,250, +186,250,185, +250,186,251, +187,251,186, +251,187,252, +188,252,187, +252,188,253, +189,253,188, +253,189,254, +190,254,189, +254,190,255, +191,255,190, +256,192,257, +193,257,192, +257,193,258, +194,258,193, +258,194,259, +195,259,194, +259,195,260, +196,260,195, +260,196,261, +197,261,196, +261,197,262, +198,262,197, +262,198,263, +199,263,198, +263,199,264, +200,264,199, +264,200,265, +201,265,200, +265,201,266, +202,266,201, +266,202,267, +203,267,202, +267,203,268, +204,268,203, +268,204,269, +205,269,204, +269,205,270, +206,270,205, +270,206,271, +207,271,206, +271,207,272, +208,272,207, +272,208,273, +209,273,208, +273,209,274, +210,274,209, +274,210,275, +211,275,210, +275,211,276, +212,276,211, +276,212,277, +213,277,212, +277,213,278, +214,278,213, +278,214,279, +215,279,214, +279,215,280, +216,280,215, +280,216,281, +217,281,216, +281,217,282, +218,282,217, +282,218,283, +219,283,218, +283,219,284, +220,284,219, +284,220,285, +221,285,220, +285,221,286, +222,286,221, +286,222,287, +223,287,222, +287,223,288, +224,288,223, +288,224,289, +225,289,224, +289,225,290, +226,290,225, +290,226,291, +227,291,226, +291,227,292, +228,292,227, +292,228,293, +229,293,228, +293,229,294, +230,294,229, +294,230,295, +231,295,230, +295,231,296, +232,296,231, +296,232,297, +233,297,232, +297,233,298, +234,298,233, +298,234,299, +235,299,234, +299,235,300, +236,300,235, +300,236,301, +237,301,236, +301,237,302, +238,302,237, +302,238,303, +239,303,238, +303,239,304, +240,304,239, +304,240,305, +241,305,240, +305,241,306, +242,306,241, +306,242,307, +243,307,242, +307,243,308, +244,308,243, +308,244,309, +245,309,244, +309,245,310, +246,310,245, +310,246,311, +247,311,246, +311,247,312, +248,312,247, +312,248,313, +249,313,248, +313,249,314, +250,314,249, +314,250,315, +251,315,250, +315,251,316, +252,316,251, +316,252,317, +253,317,252, +317,253,318, +254,318,253, +318,254,319, +255,319,254, +320,256,321, +257,321,256, +321,257,322, +258,322,257, +322,258,323, +259,323,258, +323,259,324, +260,324,259, +324,260,325, +261,325,260, +325,261,326, +262,326,261, +326,262,327, +263,327,262, +327,263,328, +264,328,263, +328,264,329, +265,329,264, +329,265,330, +266,330,265, +330,266,331, +267,331,266, +331,267,332, +268,332,267, +332,268,333, +269,333,268, +333,269,334, +270,334,269, +334,270,335, +271,335,270, +335,271,336, +272,336,271, +336,272,337, +273,337,272, +337,273,338, +274,338,273, +338,274,339, +275,339,274, +339,275,340, +276,340,275, +340,276,341, +277,341,276, +341,277,342, +278,342,277, +342,278,343, +279,343,278, +343,279,344, +280,344,279, +344,280,345, +281,345,280, +345,281,346, +282,346,281, +346,282,347, +283,347,282, +347,283,348, +284,348,283, +348,284,349, +285,349,284, +349,285,350, +286,350,285, +350,286,351, +287,351,286, +351,287,352, +288,352,287, +352,288,353, +289,353,288, +353,289,354, +290,354,289, +354,290,355, +291,355,290, +355,291,356, +292,356,291, +356,292,357, +293,357,292, +357,293,358, +294,358,293, +358,294,359, +295,359,294, +359,295,360, +296,360,295, +360,296,361, +297,361,296, +361,297,362, +298,362,297, +362,298,363, +299,363,298, +363,299,364, +300,364,299, +364,300,365, +301,365,300, +365,301,366, +302,366,301, +366,302,367, +303,367,302, +367,303,368, +304,368,303, +368,304,369, +305,369,304, +369,305,370, +306,370,305, +370,306,371, +307,371,306, +371,307,372, +308,372,307, +372,308,373, +309,373,308, +373,309,374, +310,374,309, +374,310,375, +311,375,310, +375,311,376, +312,376,311, +376,312,377, +313,377,312, +377,313,378, +314,378,313, +378,314,379, +315,379,314, +379,315,380, +316,380,315, +380,316,381, +317,381,316, +381,317,382, +318,382,317, +382,318,383, +319,383,318, +384,320,385, +321,385,320, +385,321,386, +322,386,321, +386,322,387, +323,387,322, +387,323,388, +324,388,323, +388,324,389, +325,389,324, +389,325,390, +326,390,325, +390,326,391, +327,391,326, +391,327,392, +328,392,327, +392,328,393, +329,393,328, +393,329,394, +330,394,329, +394,330,395, +331,395,330, +395,331,396, +332,396,331, +396,332,397, +333,397,332, +397,333,398, +334,398,333, +398,334,399, +335,399,334, +399,335,400, +336,400,335, +400,336,401, +337,401,336, +401,337,402, +338,402,337, +402,338,403, +339,403,338, +403,339,404, +340,404,339, +404,340,405, +341,405,340, +405,341,406, +342,406,341, +406,342,407, +343,407,342, +407,343,408, +344,408,343, +408,344,409, +345,409,344, +409,345,410, +346,410,345, +410,346,411, +347,411,346, +411,347,412, +348,412,347, +412,348,413, +349,413,348, +413,349,414, +350,414,349, +414,350,415, +351,415,350, +415,351,416, +352,416,351, +416,352,417, +353,417,352, +417,353,418, +354,418,353, +418,354,419, +355,419,354, +419,355,420, +356,420,355, +420,356,421, +357,421,356, +421,357,422, +358,422,357, +422,358,423, +359,423,358, +423,359,424, +360,424,359, +424,360,425, +361,425,360, +425,361,426, +362,426,361, +426,362,427, +363,427,362, +427,363,428, +364,428,363, +428,364,429, +365,429,364, +429,365,430, +366,430,365, +430,366,431, +367,431,366, +431,367,432, +368,432,367, +432,368,433, +369,433,368, +433,369,434, +370,434,369, +434,370,435, +371,435,370, +435,371,436, +372,436,371, +436,372,437, +373,437,372, +437,373,438, +374,438,373, +438,374,439, +375,439,374, +439,375,440, +376,440,375, +440,376,441, +377,441,376, +441,377,442, +378,442,377, +442,378,443, +379,443,378, +443,379,444, +380,444,379, +444,380,445, +381,445,380, +445,381,446, +382,446,381, +446,382,447, +383,447,382, +448,384,449, +385,449,384, +449,385,450, +386,450,385, +450,386,451, +387,451,386, +451,387,452, +388,452,387, +452,388,453, +389,453,388, +453,389,454, +390,454,389, +454,390,455, +391,455,390, +455,391,456, +392,456,391, +456,392,457, +393,457,392, +457,393,458, +394,458,393, +458,394,459, +395,459,394, +459,395,460, +396,460,395, +460,396,461, +397,461,396, +461,397,462, +398,462,397, +462,398,463, +399,463,398, +463,399,464, +400,464,399, +464,400,465, +401,465,400, +465,401,466, +402,466,401, +466,402,467, +403,467,402, +467,403,468, +404,468,403, +468,404,469, +405,469,404, +469,405,470, +406,470,405, +470,406,471, +407,471,406, +471,407,472, +408,472,407, +472,408,473, +409,473,408, +473,409,474, +410,474,409, +474,410,475, +411,475,410, +475,411,476, +412,476,411, +476,412,477, +413,477,412, +477,413,478, +414,478,413, +478,414,479, +415,479,414, +479,415,480, +416,480,415, +480,416,481, +417,481,416, +481,417,482, +418,482,417, +482,418,483, +419,483,418, +483,419,484, +420,484,419, +484,420,485, +421,485,420, +485,421,486, +422,486,421, +486,422,487, +423,487,422, +487,423,488, +424,488,423, +488,424,489, +425,489,424, +489,425,490, +426,490,425, +490,426,491, +427,491,426, +491,427,492, +428,492,427, +492,428,493, +429,493,428, +493,429,494, +430,494,429, +494,430,495, +431,495,430, +495,431,496, +432,496,431, +496,432,497, +433,497,432, +497,433,498, +434,498,433, +498,434,499, +435,499,434, +499,435,500, +436,500,435, +500,436,501, +437,501,436, +501,437,502, +438,502,437, +502,438,503, +439,503,438, +503,439,504, +440,504,439, +504,440,505, +441,505,440, +505,441,506, +442,506,441, +506,442,507, +443,507,442, +507,443,508, +444,508,443, +508,444,509, +445,509,444, +509,445,510, +446,510,445, +510,446,511, +447,511,446, +512,448,513, +449,513,448, +513,449,514, +450,514,449, +514,450,515, +451,515,450, +515,451,516, +452,516,451, +516,452,517, +453,517,452, +517,453,518, +454,518,453, +518,454,519, +455,519,454, +519,455,520, +456,520,455, +520,456,521, +457,521,456, +521,457,522, +458,522,457, +522,458,523, +459,523,458, +523,459,524, +460,524,459, +524,460,525, +461,525,460, +525,461,526, +462,526,461, +526,462,527, +463,527,462, +527,463,528, +464,528,463, +528,464,529, +465,529,464, +529,465,530, +466,530,465, +530,466,531, +467,531,466, +531,467,532, +468,532,467, +532,468,533, +469,533,468, +533,469,534, +470,534,469, +534,470,535, +471,535,470, +535,471,536, +472,536,471, +536,472,537, +473,537,472, +537,473,538, +474,538,473, +538,474,539, +475,539,474, +539,475,540, +476,540,475, +540,476,541, +477,541,476, +541,477,542, +478,542,477, +542,478,543, +479,543,478, +543,479,544, +480,544,479, +544,480,545, +481,545,480, +545,481,546, +482,546,481, +546,482,547, +483,547,482, +547,483,548, +484,548,483, +548,484,549, +485,549,484, +549,485,550, +486,550,485, +550,486,551, +487,551,486, +551,487,552, +488,552,487, +552,488,553, +489,553,488, +553,489,554, +490,554,489, +554,490,555, +491,555,490, +555,491,556, +492,556,491, +556,492,557, +493,557,492, +557,493,558, +494,558,493, +558,494,559, +495,559,494, +559,495,560, +496,560,495, +560,496,561, +497,561,496, +561,497,562, +498,562,497, +562,498,563, +499,563,498, +563,499,564, +500,564,499, +564,500,565, +501,565,500, +565,501,566, +502,566,501, +566,502,567, +503,567,502, +567,503,568, +504,568,503, +568,504,569, +505,569,504, +569,505,570, +506,570,505, +570,506,571, +507,571,506, +571,507,572, +508,572,507, +572,508,573, +509,573,508, +573,509,574, +510,574,509, +574,510,575, +511,575,510, +576,512,577, +513,577,512, +577,513,578, +514,578,513, +578,514,579, +515,579,514, +579,515,580, +516,580,515, +580,516,581, +517,581,516, +581,517,582, +518,582,517, +582,518,583, +519,583,518, +583,519,584, +520,584,519, +584,520,585, +521,585,520, +585,521,586, +522,586,521, +586,522,587, +523,587,522, +587,523,588, +524,588,523, +588,524,589, +525,589,524, +589,525,590, +526,590,525, +590,526,591, +527,591,526, +591,527,592, +528,592,527, +592,528,593, +529,593,528, +593,529,594, +530,594,529, +594,530,595, +531,595,530, +595,531,596, +532,596,531, +596,532,597, +533,597,532, +597,533,598, +534,598,533, +598,534,599, +535,599,534, +599,535,600, +536,600,535, +600,536,601, +537,601,536, +601,537,602, +538,602,537, +602,538,603, +539,603,538, +603,539,604, +540,604,539, +604,540,605, +541,605,540, +605,541,606, +542,606,541, +606,542,607, +543,607,542, +607,543,608, +544,608,543, +608,544,609, +545,609,544, +609,545,610, +546,610,545, +610,546,611, +547,611,546, +611,547,612, +548,612,547, +612,548,613, +549,613,548, +613,549,614, +550,614,549, +614,550,615, +551,615,550, +615,551,616, +552,616,551, +616,552,617, +553,617,552, +617,553,618, +554,618,553, +618,554,619, +555,619,554, +619,555,620, +556,620,555, +620,556,621, +557,621,556, +621,557,622, +558,622,557, +622,558,623, +559,623,558, +623,559,624, +560,624,559, +624,560,625, +561,625,560, +625,561,626, +562,626,561, +626,562,627, +563,627,562, +627,563,628, +564,628,563, +628,564,629, +565,629,564, +629,565,630, +566,630,565, +630,566,631, +567,631,566, +631,567,632, +568,632,567, +632,568,633, +569,633,568, +633,569,634, +570,634,569, +634,570,635, +571,635,570, +635,571,636, +572,636,571, +636,572,637, +573,637,572, +637,573,638, +574,638,573, +638,574,639, +575,639,574, +640,576,641, +577,641,576, +641,577,642, +578,642,577, +642,578,643, +579,643,578, +643,579,644, +580,644,579, +644,580,645, +581,645,580, +645,581,646, +582,646,581, +646,582,647, +583,647,582, +647,583,648, +584,648,583, +648,584,649, +585,649,584, +649,585,650, +586,650,585, +650,586,651, +587,651,586, +651,587,652, +588,652,587, +652,588,653, +589,653,588, +653,589,654, +590,654,589, +654,590,655, +591,655,590, +655,591,656, +592,656,591, +656,592,657, +593,657,592, +657,593,658, +594,658,593, +658,594,659, +595,659,594, +659,595,660, +596,660,595, +660,596,661, +597,661,596, +661,597,662, +598,662,597, +662,598,663, +599,663,598, +663,599,664, +600,664,599, +664,600,665, +601,665,600, +665,601,666, +602,666,601, +666,602,667, +603,667,602, +667,603,668, +604,668,603, +668,604,669, +605,669,604, +669,605,670, +606,670,605, +670,606,671, +607,671,606, +671,607,672, +608,672,607, +672,608,673, +609,673,608, +673,609,674, +610,674,609, +674,610,675, +611,675,610, +675,611,676, +612,676,611, +676,612,677, +613,677,612, +677,613,678, +614,678,613, +678,614,679, +615,679,614, +679,615,680, +616,680,615, +680,616,681, +617,681,616, +681,617,682, +618,682,617, +682,618,683, +619,683,618, +683,619,684, +620,684,619, +684,620,685, +621,685,620, +685,621,686, +622,686,621, +686,622,687, +623,687,622, +687,623,688, +624,688,623, +688,624,689, +625,689,624, +689,625,690, +626,690,625, +690,626,691, +627,691,626, +691,627,692, +628,692,627, +692,628,693, +629,693,628, +693,629,694, +630,694,629, +694,630,695, +631,695,630, +695,631,696, +632,696,631, +696,632,697, +633,697,632, +697,633,698, +634,698,633, +698,634,699, +635,699,634, +699,635,700, +636,700,635, +700,636,701, +637,701,636, +701,637,702, +638,702,637, +702,638,703, +639,703,638, +704,640,705, +641,705,640, +705,641,706, +642,706,641, +706,642,707, +643,707,642, +707,643,708, +644,708,643, +708,644,709, +645,709,644, +709,645,710, +646,710,645, +710,646,711, +647,711,646, +711,647,712, +648,712,647, +712,648,713, +649,713,648, +713,649,714, +650,714,649, +714,650,715, +651,715,650, +715,651,716, +652,716,651, +716,652,717, +653,717,652, +717,653,718, +654,718,653, +718,654,719, +655,719,654, +719,655,720, +656,720,655, +720,656,721, +657,721,656, +721,657,722, +658,722,657, +722,658,723, +659,723,658, +723,659,724, +660,724,659, +724,660,725, +661,725,660, +725,661,726, +662,726,661, +726,662,727, +663,727,662, +727,663,728, +664,728,663, +728,664,729, +665,729,664, +729,665,730, +666,730,665, +730,666,731, +667,731,666, +731,667,732, +668,732,667, +732,668,733, +669,733,668, +733,669,734, +670,734,669, +734,670,735, +671,735,670, +735,671,736, +672,736,671, +736,672,737, +673,737,672, +737,673,738, +674,738,673, +738,674,739, +675,739,674, +739,675,740, +676,740,675, +740,676,741, +677,741,676, +741,677,742, +678,742,677, +742,678,743, +679,743,678, +743,679,744, +680,744,679, +744,680,745, +681,745,680, +745,681,746, +682,746,681, +746,682,747, +683,747,682, +747,683,748, +684,748,683, +748,684,749, +685,749,684, +749,685,750, +686,750,685, +750,686,751, +687,751,686, +751,687,752, +688,752,687, +752,688,753, +689,753,688, +753,689,754, +690,754,689, +754,690,755, +691,755,690, +755,691,756, +692,756,691, +756,692,757, +693,757,692, +757,693,758, +694,758,693, +758,694,759, +695,759,694, +759,695,760, +696,760,695, +760,696,761, +697,761,696, +761,697,762, +698,762,697, +762,698,763, +699,763,698, +763,699,764, +700,764,699, +764,700,765, +701,765,700, +765,701,766, +702,766,701, +766,702,767, +703,767,702, +768,704,769, +705,769,704, +769,705,770, +706,770,705, +770,706,771, +707,771,706, +771,707,772, +708,772,707, +772,708,773, +709,773,708, +773,709,774, +710,774,709, +774,710,775, +711,775,710, +775,711,776, +712,776,711, +776,712,777, +713,777,712, +777,713,778, +714,778,713, +778,714,779, +715,779,714, +779,715,780, +716,780,715, +780,716,781, +717,781,716, +781,717,782, +718,782,717, +782,718,783, +719,783,718, +783,719,784, +720,784,719, +784,720,785, +721,785,720, +785,721,786, +722,786,721, +786,722,787, +723,787,722, +787,723,788, +724,788,723, +788,724,789, +725,789,724, +789,725,790, +726,790,725, +790,726,791, +727,791,726, +791,727,792, +728,792,727, +792,728,793, +729,793,728, +793,729,794, +730,794,729, +794,730,795, +731,795,730, +795,731,796, +732,796,731, +796,732,797, +733,797,732, +797,733,798, +734,798,733, +798,734,799, +735,799,734, +799,735,800, +736,800,735, +800,736,801, +737,801,736, +801,737,802, +738,802,737, +802,738,803, +739,803,738, +803,739,804, +740,804,739, +804,740,805, +741,805,740, +805,741,806, +742,806,741, +806,742,807, +743,807,742, +807,743,808, +744,808,743, +808,744,809, +745,809,744, +809,745,810, +746,810,745, +810,746,811, +747,811,746, +811,747,812, +748,812,747, +812,748,813, +749,813,748, +813,749,814, +750,814,749, +814,750,815, +751,815,750, +815,751,816, +752,816,751, +816,752,817, +753,817,752, +817,753,818, +754,818,753, +818,754,819, +755,819,754, +819,755,820, +756,820,755, +820,756,821, +757,821,756, +821,757,822, +758,822,757, +822,758,823, +759,823,758, +823,759,824, +760,824,759, +824,760,825, +761,825,760, +825,761,826, +762,826,761, +826,762,827, +763,827,762, +827,763,828, +764,828,763, +828,764,829, +765,829,764, +829,765,830, +766,830,765, +830,766,831, +767,831,766, +832,768,833, +769,833,768, +833,769,834, +770,834,769, +834,770,835, +771,835,770, +835,771,836, +772,836,771, +836,772,837, +773,837,772, +837,773,838, +774,838,773, +838,774,839, +775,839,774, +839,775,840, +776,840,775, +840,776,841, +777,841,776, +841,777,842, +778,842,777, +842,778,843, +779,843,778, +843,779,844, +780,844,779, +844,780,845, +781,845,780, +845,781,846, +782,846,781, +846,782,847, +783,847,782, +847,783,848, +784,848,783, +848,784,849, +785,849,784, +849,785,850, +786,850,785, +850,786,851, +787,851,786, +851,787,852, +788,852,787, +852,788,853, +789,853,788, +853,789,854, +790,854,789, +854,790,855, +791,855,790, +855,791,856, +792,856,791, +856,792,857, +793,857,792, +857,793,858, +794,858,793, +858,794,859, +795,859,794, +859,795,860, +796,860,795, +860,796,861, +797,861,796, +861,797,862, +798,862,797, +862,798,863, +799,863,798, +863,799,864, +800,864,799, +864,800,865, +801,865,800, +865,801,866, +802,866,801, +866,802,867, +803,867,802, +867,803,868, +804,868,803, +868,804,869, +805,869,804, +869,805,870, +806,870,805, +870,806,871, +807,871,806, +871,807,872, +808,872,807, +872,808,873, +809,873,808, +873,809,874, +810,874,809, +874,810,875, +811,875,810, +875,811,876, +812,876,811, +876,812,877, +813,877,812, +877,813,878, +814,878,813, +878,814,879, +815,879,814, +879,815,880, +816,880,815, +880,816,881, +817,881,816, +881,817,882, +818,882,817, +882,818,883, +819,883,818, +883,819,884, +820,884,819, +884,820,885, +821,885,820, +885,821,886, +822,886,821, +886,822,887, +823,887,822, +887,823,888, +824,888,823, +888,824,889, +825,889,824, +889,825,890, +826,890,825, +890,826,891, +827,891,826, +891,827,892, +828,892,827, +892,828,893, +829,893,828, +893,829,894, +830,894,829, +894,830,895, +831,895,830, +896,832,897, +833,897,832, +897,833,898, +834,898,833, +898,834,899, +835,899,834, +899,835,900, +836,900,835, +900,836,901, +837,901,836, +901,837,902, +838,902,837, +902,838,903, +839,903,838, +903,839,904, +840,904,839, +904,840,905, +841,905,840, +905,841,906, +842,906,841, +906,842,907, +843,907,842, +907,843,908, +844,908,843, +908,844,909, +845,909,844, +909,845,910, +846,910,845, +910,846,911, +847,911,846, +911,847,912, +848,912,847, +912,848,913, +849,913,848, +913,849,914, +850,914,849, +914,850,915, +851,915,850, +915,851,916, +852,916,851, +916,852,917, +853,917,852, +917,853,918, +854,918,853, +918,854,919, +855,919,854, +919,855,920, +856,920,855, +920,856,921, +857,921,856, +921,857,922, +858,922,857, +922,858,923, +859,923,858, +923,859,924, +860,924,859, +924,860,925, +861,925,860, +925,861,926, +862,926,861, +926,862,927, +863,927,862, +927,863,928, +864,928,863, +928,864,929, +865,929,864, +929,865,930, +866,930,865, +930,866,931, +867,931,866, +931,867,932, +868,932,867, +932,868,933, +869,933,868, +933,869,934, +870,934,869, +934,870,935, +871,935,870, +935,871,936, +872,936,871, +936,872,937, +873,937,872, +937,873,938, +874,938,873, +938,874,939, +875,939,874, +939,875,940, +876,940,875, +940,876,941, +877,941,876, +941,877,942, +878,942,877, +942,878,943, +879,943,878, +943,879,944, +880,944,879, +944,880,945, +881,945,880, +945,881,946, +882,946,881, +946,882,947, +883,947,882, +947,883,948, +884,948,883, +948,884,949, +885,949,884, +949,885,950, +886,950,885, +950,886,951, +887,951,886, +951,887,952, +888,952,887, +952,888,953, +889,953,888, +953,889,954, +890,954,889, +954,890,955, +891,955,890, +955,891,956, +892,956,891, +956,892,957, +893,957,892, +957,893,958, +894,958,893, +958,894,959, +895,959,894, +960,896,961, +897,961,896, +961,897,962, +898,962,897, +962,898,963, +899,963,898, +963,899,964, +900,964,899, +964,900,965, +901,965,900, +965,901,966, +902,966,901, +966,902,967, +903,967,902, +967,903,968, +904,968,903, +968,904,969, +905,969,904, +969,905,970, +906,970,905, +970,906,971, +907,971,906, +971,907,972, +908,972,907, +972,908,973, +909,973,908, +973,909,974, +910,974,909, +974,910,975, +911,975,910, +975,911,976, +912,976,911, +976,912,977, +913,977,912, +977,913,978, +914,978,913, +978,914,979, +915,979,914, +979,915,980, +916,980,915, +980,916,981, +917,981,916, +981,917,982, +918,982,917, +982,918,983, +919,983,918, +983,919,984, +920,984,919, +984,920,985, +921,985,920, +985,921,986, +922,986,921, +986,922,987, +923,987,922, +987,923,988, +924,988,923, +988,924,989, +925,989,924, +989,925,990, +926,990,925, +990,926,991, +927,991,926, +991,927,992, +928,992,927, +992,928,993, +929,993,928, +993,929,994, +930,994,929, +994,930,995, +931,995,930, +995,931,996, +932,996,931, +996,932,997, +933,997,932, +997,933,998, +934,998,933, +998,934,999, +935,999,934, +999,935,1000, +936,1000,935, +1000,936,1001, +937,1001,936, +1001,937,1002, +938,1002,937, +1002,938,1003, +939,1003,938, +1003,939,1004, +940,1004,939, +1004,940,1005, +941,1005,940, +1005,941,1006, +942,1006,941, +1006,942,1007, +943,1007,942, +1007,943,1008, +944,1008,943, +1008,944,1009, +945,1009,944, +1009,945,1010, +946,1010,945, +1010,946,1011, +947,1011,946, +1011,947,1012, +948,1012,947, +1012,948,1013, +949,1013,948, +1013,949,1014, +950,1014,949, +1014,950,1015, +951,1015,950, +1015,951,1016, +952,1016,951, +1016,952,1017, +953,1017,952, +1017,953,1018, +954,1018,953, +1018,954,1019, +955,1019,954, +1019,955,1020, +956,1020,955, +1020,956,1021, +957,1021,956, +1021,957,1022, +958,1022,957, +1022,958,1023, +959,1023,958, +1024,960,1025, +961,1025,960, +1025,961,1026, +962,1026,961, +1026,962,1027, +963,1027,962, +1027,963,1028, +964,1028,963, +1028,964,1029, +965,1029,964, +1029,965,1030, +966,1030,965, +1030,966,1031, +967,1031,966, +1031,967,1032, +968,1032,967, +1032,968,1033, +969,1033,968, +1033,969,1034, +970,1034,969, +1034,970,1035, +971,1035,970, +1035,971,1036, +972,1036,971, +1036,972,1037, +973,1037,972, +1037,973,1038, +974,1038,973, +1038,974,1039, +975,1039,974, +1039,975,1040, +976,1040,975, +1040,976,1041, +977,1041,976, +1041,977,1042, +978,1042,977, +1042,978,1043, +979,1043,978, +1043,979,1044, +980,1044,979, +1044,980,1045, +981,1045,980, +1045,981,1046, +982,1046,981, +1046,982,1047, +983,1047,982, +1047,983,1048, +984,1048,983, +1048,984,1049, +985,1049,984, +1049,985,1050, +986,1050,985, +1050,986,1051, +987,1051,986, +1051,987,1052, +988,1052,987, +1052,988,1053, +989,1053,988, +1053,989,1054, +990,1054,989, +1054,990,1055, +991,1055,990, +1055,991,1056, +992,1056,991, +1056,992,1057, +993,1057,992, +1057,993,1058, +994,1058,993, +1058,994,1059, +995,1059,994, +1059,995,1060, +996,1060,995, +1060,996,1061, +997,1061,996, +1061,997,1062, +998,1062,997, +1062,998,1063, +999,1063,998, +1063,999,1064, +1000,1064,999, +1064,1000,1065, +1001,1065,1000, +1065,1001,1066, +1002,1066,1001, +1066,1002,1067, +1003,1067,1002, +1067,1003,1068, +1004,1068,1003, +1068,1004,1069, +1005,1069,1004, +1069,1005,1070, +1006,1070,1005, +1070,1006,1071, +1007,1071,1006, +1071,1007,1072, +1008,1072,1007, +1072,1008,1073, +1009,1073,1008, +1073,1009,1074, +1010,1074,1009, +1074,1010,1075, +1011,1075,1010, +1075,1011,1076, +1012,1076,1011, +1076,1012,1077, +1013,1077,1012, +1077,1013,1078, +1014,1078,1013, +1078,1014,1079, +1015,1079,1014, +1079,1015,1080, +1016,1080,1015, +1080,1016,1081, +1017,1081,1016, +1081,1017,1082, +1018,1082,1017, +1082,1018,1083, +1019,1083,1018, +1083,1019,1084, +1020,1084,1019, +1084,1020,1085, +1021,1085,1020, +1085,1021,1086, +1022,1086,1021, +1086,1022,1087, +1023,1087,1022, +1088,1024,1089, +1025,1089,1024, +1089,1025,1090, +1026,1090,1025, +1090,1026,1091, +1027,1091,1026, +1091,1027,1092, +1028,1092,1027, +1092,1028,1093, +1029,1093,1028, +1093,1029,1094, +1030,1094,1029, +1094,1030,1095, +1031,1095,1030, +1095,1031,1096, +1032,1096,1031, +1096,1032,1097, +1033,1097,1032, +1097,1033,1098, +1034,1098,1033, +1098,1034,1099, +1035,1099,1034, +1099,1035,1100, +1036,1100,1035, +1100,1036,1101, +1037,1101,1036, +1101,1037,1102, +1038,1102,1037, +1102,1038,1103, +1039,1103,1038, +1103,1039,1104, +1040,1104,1039, +1104,1040,1105, +1041,1105,1040, +1105,1041,1106, +1042,1106,1041, +1106,1042,1107, +1043,1107,1042, +1107,1043,1108, +1044,1108,1043, +1108,1044,1109, +1045,1109,1044, +1109,1045,1110, +1046,1110,1045, +1110,1046,1111, +1047,1111,1046, +1111,1047,1112, +1048,1112,1047, +1112,1048,1113, +1049,1113,1048, +1113,1049,1114, +1050,1114,1049, +1114,1050,1115, +1051,1115,1050, +1115,1051,1116, +1052,1116,1051, +1116,1052,1117, +1053,1117,1052, +1117,1053,1118, +1054,1118,1053, +1118,1054,1119, +1055,1119,1054, +1119,1055,1120, +1056,1120,1055, +1120,1056,1121, +1057,1121,1056, +1121,1057,1122, +1058,1122,1057, +1122,1058,1123, +1059,1123,1058, +1123,1059,1124, +1060,1124,1059, +1124,1060,1125, +1061,1125,1060, +1125,1061,1126, +1062,1126,1061, +1126,1062,1127, +1063,1127,1062, +1127,1063,1128, +1064,1128,1063, +1128,1064,1129, +1065,1129,1064, +1129,1065,1130, +1066,1130,1065, +1130,1066,1131, +1067,1131,1066, +1131,1067,1132, +1068,1132,1067, +1132,1068,1133, +1069,1133,1068, +1133,1069,1134, +1070,1134,1069, +1134,1070,1135, +1071,1135,1070, +1135,1071,1136, +1072,1136,1071, +1136,1072,1137, +1073,1137,1072, +1137,1073,1138, +1074,1138,1073, +1138,1074,1139, +1075,1139,1074, +1139,1075,1140, +1076,1140,1075, +1140,1076,1141, +1077,1141,1076, +1141,1077,1142, +1078,1142,1077, +1142,1078,1143, +1079,1143,1078, +1143,1079,1144, +1080,1144,1079, +1144,1080,1145, +1081,1145,1080, +1145,1081,1146, +1082,1146,1081, +1146,1082,1147, +1083,1147,1082, +1147,1083,1148, +1084,1148,1083, +1148,1084,1149, +1085,1149,1084, +1149,1085,1150, +1086,1150,1085, +1150,1086,1151, +1087,1151,1086, +1152,1088,1153, +1089,1153,1088, +1153,1089,1154, +1090,1154,1089, +1154,1090,1155, +1091,1155,1090, +1155,1091,1156, +1092,1156,1091, +1156,1092,1157, +1093,1157,1092, +1157,1093,1158, +1094,1158,1093, +1158,1094,1159, +1095,1159,1094, +1159,1095,1160, +1096,1160,1095, +1160,1096,1161, +1097,1161,1096, +1161,1097,1162, +1098,1162,1097, +1162,1098,1163, +1099,1163,1098, +1163,1099,1164, +1100,1164,1099, +1164,1100,1165, +1101,1165,1100, +1165,1101,1166, +1102,1166,1101, +1166,1102,1167, +1103,1167,1102, +1167,1103,1168, +1104,1168,1103, +1168,1104,1169, +1105,1169,1104, +1169,1105,1170, +1106,1170,1105, +1170,1106,1171, +1107,1171,1106, +1171,1107,1172, +1108,1172,1107, +1172,1108,1173, +1109,1173,1108, +1173,1109,1174, +1110,1174,1109, +1174,1110,1175, +1111,1175,1110, +1175,1111,1176, +1112,1176,1111, +1176,1112,1177, +1113,1177,1112, +1177,1113,1178, +1114,1178,1113, +1178,1114,1179, +1115,1179,1114, +1179,1115,1180, +1116,1180,1115, +1180,1116,1181, +1117,1181,1116, +1181,1117,1182, +1118,1182,1117, +1182,1118,1183, +1119,1183,1118, +1183,1119,1184, +1120,1184,1119, +1184,1120,1185, +1121,1185,1120, +1185,1121,1186, +1122,1186,1121, +1186,1122,1187, +1123,1187,1122, +1187,1123,1188, +1124,1188,1123, +1188,1124,1189, +1125,1189,1124, +1189,1125,1190, +1126,1190,1125, +1190,1126,1191, +1127,1191,1126, +1191,1127,1192, +1128,1192,1127, +1192,1128,1193, +1129,1193,1128, +1193,1129,1194, +1130,1194,1129, +1194,1130,1195, +1131,1195,1130, +1195,1131,1196, +1132,1196,1131, +1196,1132,1197, +1133,1197,1132, +1197,1133,1198, +1134,1198,1133, +1198,1134,1199, +1135,1199,1134, +1199,1135,1200, +1136,1200,1135, +1200,1136,1201, +1137,1201,1136, +1201,1137,1202, +1138,1202,1137, +1202,1138,1203, +1139,1203,1138, +1203,1139,1204, +1140,1204,1139, +1204,1140,1205, +1141,1205,1140, +1205,1141,1206, +1142,1206,1141, +1206,1142,1207, +1143,1207,1142, +1207,1143,1208, +1144,1208,1143, +1208,1144,1209, +1145,1209,1144, +1209,1145,1210, +1146,1210,1145, +1210,1146,1211, +1147,1211,1146, +1211,1147,1212, +1148,1212,1147, +1212,1148,1213, +1149,1213,1148, +1213,1149,1214, +1150,1214,1149, +1214,1150,1215, +1151,1215,1150, +1216,1152,1217, +1153,1217,1152, +1217,1153,1218, +1154,1218,1153, +1218,1154,1219, +1155,1219,1154, +1219,1155,1220, +1156,1220,1155, +1220,1156,1221, +1157,1221,1156, +1221,1157,1222, +1158,1222,1157, +1222,1158,1223, +1159,1223,1158, +1223,1159,1224, +1160,1224,1159, +1224,1160,1225, +1161,1225,1160, +1225,1161,1226, +1162,1226,1161, +1226,1162,1227, +1163,1227,1162, +1227,1163,1228, +1164,1228,1163, +1228,1164,1229, +1165,1229,1164, +1229,1165,1230, +1166,1230,1165, +1230,1166,1231, +1167,1231,1166, +1231,1167,1232, +1168,1232,1167, +1232,1168,1233, +1169,1233,1168, +1233,1169,1234, +1170,1234,1169, +1234,1170,1235, +1171,1235,1170, +1235,1171,1236, +1172,1236,1171, +1236,1172,1237, +1173,1237,1172, +1237,1173,1238, +1174,1238,1173, +1238,1174,1239, +1175,1239,1174, +1239,1175,1240, +1176,1240,1175, +1240,1176,1241, +1177,1241,1176, +1241,1177,1242, +1178,1242,1177, +1242,1178,1243, +1179,1243,1178, +1243,1179,1244, +1180,1244,1179, +1244,1180,1245, +1181,1245,1180, +1245,1181,1246, +1182,1246,1181, +1246,1182,1247, +1183,1247,1182, +1247,1183,1248, +1184,1248,1183, +1248,1184,1249, +1185,1249,1184, +1249,1185,1250, +1186,1250,1185, +1250,1186,1251, +1187,1251,1186, +1251,1187,1252, +1188,1252,1187, +1252,1188,1253, +1189,1253,1188, +1253,1189,1254, +1190,1254,1189, +1254,1190,1255, +1191,1255,1190, +1255,1191,1256, +1192,1256,1191, +1256,1192,1257, +1193,1257,1192, +1257,1193,1258, +1194,1258,1193, +1258,1194,1259, +1195,1259,1194, +1259,1195,1260, +1196,1260,1195, +1260,1196,1261, +1197,1261,1196, +1261,1197,1262, +1198,1262,1197, +1262,1198,1263, +1199,1263,1198, +1263,1199,1264, +1200,1264,1199, +1264,1200,1265, +1201,1265,1200, +1265,1201,1266, +1202,1266,1201, +1266,1202,1267, +1203,1267,1202, +1267,1203,1268, +1204,1268,1203, +1268,1204,1269, +1205,1269,1204, +1269,1205,1270, +1206,1270,1205, +1270,1206,1271, +1207,1271,1206, +1271,1207,1272, +1208,1272,1207, +1272,1208,1273, +1209,1273,1208, +1273,1209,1274, +1210,1274,1209, +1274,1210,1275, +1211,1275,1210, +1275,1211,1276, +1212,1276,1211, +1276,1212,1277, +1213,1277,1212, +1277,1213,1278, +1214,1278,1213, +1278,1214,1279, +1215,1279,1214, +1280,1216,1281, +1217,1281,1216, +1281,1217,1282, +1218,1282,1217, +1282,1218,1283, +1219,1283,1218, +1283,1219,1284, +1220,1284,1219, +1284,1220,1285, +1221,1285,1220, +1285,1221,1286, +1222,1286,1221, +1286,1222,1287, +1223,1287,1222, +1287,1223,1288, +1224,1288,1223, +1288,1224,1289, +1225,1289,1224, +1289,1225,1290, +1226,1290,1225, +1290,1226,1291, +1227,1291,1226, +1291,1227,1292, +1228,1292,1227, +1292,1228,1293, +1229,1293,1228, +1293,1229,1294, +1230,1294,1229, +1294,1230,1295, +1231,1295,1230, +1295,1231,1296, +1232,1296,1231, +1296,1232,1297, +1233,1297,1232, +1297,1233,1298, +1234,1298,1233, +1298,1234,1299, +1235,1299,1234, +1299,1235,1300, +1236,1300,1235, +1300,1236,1301, +1237,1301,1236, +1301,1237,1302, +1238,1302,1237, +1302,1238,1303, +1239,1303,1238, +1303,1239,1304, +1240,1304,1239, +1304,1240,1305, +1241,1305,1240, +1305,1241,1306, +1242,1306,1241, +1306,1242,1307, +1243,1307,1242, +1307,1243,1308, +1244,1308,1243, +1308,1244,1309, +1245,1309,1244, +1309,1245,1310, +1246,1310,1245, +1310,1246,1311, +1247,1311,1246, +1311,1247,1312, +1248,1312,1247, +1312,1248,1313, +1249,1313,1248, +1313,1249,1314, +1250,1314,1249, +1314,1250,1315, +1251,1315,1250, +1315,1251,1316, +1252,1316,1251, +1316,1252,1317, +1253,1317,1252, +1317,1253,1318, +1254,1318,1253, +1318,1254,1319, +1255,1319,1254, +1319,1255,1320, +1256,1320,1255, +1320,1256,1321, +1257,1321,1256, +1321,1257,1322, +1258,1322,1257, +1322,1258,1323, +1259,1323,1258, +1323,1259,1324, +1260,1324,1259, +1324,1260,1325, +1261,1325,1260, +1325,1261,1326, +1262,1326,1261, +1326,1262,1327, +1263,1327,1262, +1327,1263,1328, +1264,1328,1263, +1328,1264,1329, +1265,1329,1264, +1329,1265,1330, +1266,1330,1265, +1330,1266,1331, +1267,1331,1266, +1331,1267,1332, +1268,1332,1267, +1332,1268,1333, +1269,1333,1268, +1333,1269,1334, +1270,1334,1269, +1334,1270,1335, +1271,1335,1270, +1335,1271,1336, +1272,1336,1271, +1336,1272,1337, +1273,1337,1272, +1337,1273,1338, +1274,1338,1273, +1338,1274,1339, +1275,1339,1274, +1339,1275,1340, +1276,1340,1275, +1340,1276,1341, +1277,1341,1276, +1341,1277,1342, +1278,1342,1277, +1342,1278,1343, +1279,1343,1278, +1344,1280,1345, +1281,1345,1280, +1345,1281,1346, +1282,1346,1281, +1346,1282,1347, +1283,1347,1282, +1347,1283,1348, +1284,1348,1283, +1348,1284,1349, +1285,1349,1284, +1349,1285,1350, +1286,1350,1285, +1350,1286,1351, +1287,1351,1286, +1351,1287,1352, +1288,1352,1287, +1352,1288,1353, +1289,1353,1288, +1353,1289,1354, +1290,1354,1289, +1354,1290,1355, +1291,1355,1290, +1355,1291,1356, +1292,1356,1291, +1356,1292,1357, +1293,1357,1292, +1357,1293,1358, +1294,1358,1293, +1358,1294,1359, +1295,1359,1294, +1359,1295,1360, +1296,1360,1295, +1360,1296,1361, +1297,1361,1296, +1361,1297,1362, +1298,1362,1297, +1362,1298,1363, +1299,1363,1298, +1363,1299,1364, +1300,1364,1299, +1364,1300,1365, +1301,1365,1300, +1365,1301,1366, +1302,1366,1301, +1366,1302,1367, +1303,1367,1302, +1367,1303,1368, +1304,1368,1303, +1368,1304,1369, +1305,1369,1304, +1369,1305,1370, +1306,1370,1305, +1370,1306,1371, +1307,1371,1306, +1371,1307,1372, +1308,1372,1307, +1372,1308,1373, +1309,1373,1308, +1373,1309,1374, +1310,1374,1309, +1374,1310,1375, +1311,1375,1310, +1375,1311,1376, +1312,1376,1311, +1376,1312,1377, +1313,1377,1312, +1377,1313,1378, +1314,1378,1313, +1378,1314,1379, +1315,1379,1314, +1379,1315,1380, +1316,1380,1315, +1380,1316,1381, +1317,1381,1316, +1381,1317,1382, +1318,1382,1317, +1382,1318,1383, +1319,1383,1318, +1383,1319,1384, +1320,1384,1319, +1384,1320,1385, +1321,1385,1320, +1385,1321,1386, +1322,1386,1321, +1386,1322,1387, +1323,1387,1322, +1387,1323,1388, +1324,1388,1323, +1388,1324,1389, +1325,1389,1324, +1389,1325,1390, +1326,1390,1325, +1390,1326,1391, +1327,1391,1326, +1391,1327,1392, +1328,1392,1327, +1392,1328,1393, +1329,1393,1328, +1393,1329,1394, +1330,1394,1329, +1394,1330,1395, +1331,1395,1330, +1395,1331,1396, +1332,1396,1331, +1396,1332,1397, +1333,1397,1332, +1397,1333,1398, +1334,1398,1333, +1398,1334,1399, +1335,1399,1334, +1399,1335,1400, +1336,1400,1335, +1400,1336,1401, +1337,1401,1336, +1401,1337,1402, +1338,1402,1337, +1402,1338,1403, +1339,1403,1338, +1403,1339,1404, +1340,1404,1339, +1404,1340,1405, +1341,1405,1340, +1405,1341,1406, +1342,1406,1341, +1406,1342,1407, +1343,1407,1342, +1408,1344,1409, +1345,1409,1344, +1409,1345,1410, +1346,1410,1345, +1410,1346,1411, +1347,1411,1346, +1411,1347,1412, +1348,1412,1347, +1412,1348,1413, +1349,1413,1348, +1413,1349,1414, +1350,1414,1349, +1414,1350,1415, +1351,1415,1350, +1415,1351,1416, +1352,1416,1351, +1416,1352,1417, +1353,1417,1352, +1417,1353,1418, +1354,1418,1353, +1418,1354,1419, +1355,1419,1354, +1419,1355,1420, +1356,1420,1355, +1420,1356,1421, +1357,1421,1356, +1421,1357,1422, +1358,1422,1357, +1422,1358,1423, +1359,1423,1358, +1423,1359,1424, +1360,1424,1359, +1424,1360,1425, +1361,1425,1360, +1425,1361,1426, +1362,1426,1361, +1426,1362,1427, +1363,1427,1362, +1427,1363,1428, +1364,1428,1363, +1428,1364,1429, +1365,1429,1364, +1429,1365,1430, +1366,1430,1365, +1430,1366,1431, +1367,1431,1366, +1431,1367,1432, +1368,1432,1367, +1432,1368,1433, +1369,1433,1368, +1433,1369,1434, +1370,1434,1369, +1434,1370,1435, +1371,1435,1370, +1435,1371,1436, +1372,1436,1371, +1436,1372,1437, +1373,1437,1372, +1437,1373,1438, +1374,1438,1373, +1438,1374,1439, +1375,1439,1374, +1439,1375,1440, +1376,1440,1375, +1440,1376,1441, +1377,1441,1376, +1441,1377,1442, +1378,1442,1377, +1442,1378,1443, +1379,1443,1378, +1443,1379,1444, +1380,1444,1379, +1444,1380,1445, +1381,1445,1380, +1445,1381,1446, +1382,1446,1381, +1446,1382,1447, +1383,1447,1382, +1447,1383,1448, +1384,1448,1383, +1448,1384,1449, +1385,1449,1384, +1449,1385,1450, +1386,1450,1385, +1450,1386,1451, +1387,1451,1386, +1451,1387,1452, +1388,1452,1387, +1452,1388,1453, +1389,1453,1388, +1453,1389,1454, +1390,1454,1389, +1454,1390,1455, +1391,1455,1390, +1455,1391,1456, +1392,1456,1391, +1456,1392,1457, +1393,1457,1392, +1457,1393,1458, +1394,1458,1393, +1458,1394,1459, +1395,1459,1394, +1459,1395,1460, +1396,1460,1395, +1460,1396,1461, +1397,1461,1396, +1461,1397,1462, +1398,1462,1397, +1462,1398,1463, +1399,1463,1398, +1463,1399,1464, +1400,1464,1399, +1464,1400,1465, +1401,1465,1400, +1465,1401,1466, +1402,1466,1401, +1466,1402,1467, +1403,1467,1402, +1467,1403,1468, +1404,1468,1403, +1468,1404,1469, +1405,1469,1404, +1469,1405,1470, +1406,1470,1405, +1470,1406,1471, +1407,1471,1406, +1472,1408,1473, +1409,1473,1408, +1473,1409,1474, +1410,1474,1409, +1474,1410,1475, +1411,1475,1410, +1475,1411,1476, +1412,1476,1411, +1476,1412,1477, +1413,1477,1412, +1477,1413,1478, +1414,1478,1413, +1478,1414,1479, +1415,1479,1414, +1479,1415,1480, +1416,1480,1415, +1480,1416,1481, +1417,1481,1416, +1481,1417,1482, +1418,1482,1417, +1482,1418,1483, +1419,1483,1418, +1483,1419,1484, +1420,1484,1419, +1484,1420,1485, +1421,1485,1420, +1485,1421,1486, +1422,1486,1421, +1486,1422,1487, +1423,1487,1422, +1487,1423,1488, +1424,1488,1423, +1488,1424,1489, +1425,1489,1424, +1489,1425,1490, +1426,1490,1425, +1490,1426,1491, +1427,1491,1426, +1491,1427,1492, +1428,1492,1427, +1492,1428,1493, +1429,1493,1428, +1493,1429,1494, +1430,1494,1429, +1494,1430,1495, +1431,1495,1430, +1495,1431,1496, +1432,1496,1431, +1496,1432,1497, +1433,1497,1432, +1497,1433,1498, +1434,1498,1433, +1498,1434,1499, +1435,1499,1434, +1499,1435,1500, +1436,1500,1435, +1500,1436,1501, +1437,1501,1436, +1501,1437,1502, +1438,1502,1437, +1502,1438,1503, +1439,1503,1438, +1503,1439,1504, +1440,1504,1439, +1504,1440,1505, +1441,1505,1440, +1505,1441,1506, +1442,1506,1441, +1506,1442,1507, +1443,1507,1442, +1507,1443,1508, +1444,1508,1443, +1508,1444,1509, +1445,1509,1444, +1509,1445,1510, +1446,1510,1445, +1510,1446,1511, +1447,1511,1446, +1511,1447,1512, +1448,1512,1447, +1512,1448,1513, +1449,1513,1448, +1513,1449,1514, +1450,1514,1449, +1514,1450,1515, +1451,1515,1450, +1515,1451,1516, +1452,1516,1451, +1516,1452,1517, +1453,1517,1452, +1517,1453,1518, +1454,1518,1453, +1518,1454,1519, +1455,1519,1454, +1519,1455,1520, +1456,1520,1455, +1520,1456,1521, +1457,1521,1456, +1521,1457,1522, +1458,1522,1457, +1522,1458,1523, +1459,1523,1458, +1523,1459,1524, +1460,1524,1459, +1524,1460,1525, +1461,1525,1460, +1525,1461,1526, +1462,1526,1461, +1526,1462,1527, +1463,1527,1462, +1527,1463,1528, +1464,1528,1463, +1528,1464,1529, +1465,1529,1464, +1529,1465,1530, +1466,1530,1465, +1530,1466,1531, +1467,1531,1466, +1531,1467,1532, +1468,1532,1467, +1532,1468,1533, +1469,1533,1468, +1533,1469,1534, +1470,1534,1469, +1534,1470,1535, +1471,1535,1470, +1536,1472,1537, +1473,1537,1472, +1537,1473,1538, +1474,1538,1473, +1538,1474,1539, +1475,1539,1474, +1539,1475,1540, +1476,1540,1475, +1540,1476,1541, +1477,1541,1476, +1541,1477,1542, +1478,1542,1477, +1542,1478,1543, +1479,1543,1478, +1543,1479,1544, +1480,1544,1479, +1544,1480,1545, +1481,1545,1480, +1545,1481,1546, +1482,1546,1481, +1546,1482,1547, +1483,1547,1482, +1547,1483,1548, +1484,1548,1483, +1548,1484,1549, +1485,1549,1484, +1549,1485,1550, +1486,1550,1485, +1550,1486,1551, +1487,1551,1486, +1551,1487,1552, +1488,1552,1487, +1552,1488,1553, +1489,1553,1488, +1553,1489,1554, +1490,1554,1489, +1554,1490,1555, +1491,1555,1490, +1555,1491,1556, +1492,1556,1491, +1556,1492,1557, +1493,1557,1492, +1557,1493,1558, +1494,1558,1493, +1558,1494,1559, +1495,1559,1494, +1559,1495,1560, +1496,1560,1495, +1560,1496,1561, +1497,1561,1496, +1561,1497,1562, +1498,1562,1497, +1562,1498,1563, +1499,1563,1498, +1563,1499,1564, +1500,1564,1499, +1564,1500,1565, +1501,1565,1500, +1565,1501,1566, +1502,1566,1501, +1566,1502,1567, +1503,1567,1502, +1567,1503,1568, +1504,1568,1503, +1568,1504,1569, +1505,1569,1504, +1569,1505,1570, +1506,1570,1505, +1570,1506,1571, +1507,1571,1506, +1571,1507,1572, +1508,1572,1507, +1572,1508,1573, +1509,1573,1508, +1573,1509,1574, +1510,1574,1509, +1574,1510,1575, +1511,1575,1510, +1575,1511,1576, +1512,1576,1511, +1576,1512,1577, +1513,1577,1512, +1577,1513,1578, +1514,1578,1513, +1578,1514,1579, +1515,1579,1514, +1579,1515,1580, +1516,1580,1515, +1580,1516,1581, +1517,1581,1516, +1581,1517,1582, +1518,1582,1517, +1582,1518,1583, +1519,1583,1518, +1583,1519,1584, +1520,1584,1519, +1584,1520,1585, +1521,1585,1520, +1585,1521,1586, +1522,1586,1521, +1586,1522,1587, +1523,1587,1522, +1587,1523,1588, +1524,1588,1523, +1588,1524,1589, +1525,1589,1524, +1589,1525,1590, +1526,1590,1525, +1590,1526,1591, +1527,1591,1526, +1591,1527,1592, +1528,1592,1527, +1592,1528,1593, +1529,1593,1528, +1593,1529,1594, +1530,1594,1529, +1594,1530,1595, +1531,1595,1530, +1595,1531,1596, +1532,1596,1531, +1596,1532,1597, +1533,1597,1532, +1597,1533,1598, +1534,1598,1533, +1598,1534,1599, +1535,1599,1534, +1600,1536,1601, +1537,1601,1536, +1601,1537,1602, +1538,1602,1537, +1602,1538,1603, +1539,1603,1538, +1603,1539,1604, +1540,1604,1539, +1604,1540,1605, +1541,1605,1540, +1605,1541,1606, +1542,1606,1541, +1606,1542,1607, +1543,1607,1542, +1607,1543,1608, +1544,1608,1543, +1608,1544,1609, +1545,1609,1544, +1609,1545,1610, +1546,1610,1545, +1610,1546,1611, +1547,1611,1546, +1611,1547,1612, +1548,1612,1547, +1612,1548,1613, +1549,1613,1548, +1613,1549,1614, +1550,1614,1549, +1614,1550,1615, +1551,1615,1550, +1615,1551,1616, +1552,1616,1551, +1616,1552,1617, +1553,1617,1552, +1617,1553,1618, +1554,1618,1553, +1618,1554,1619, +1555,1619,1554, +1619,1555,1620, +1556,1620,1555, +1620,1556,1621, +1557,1621,1556, +1621,1557,1622, +1558,1622,1557, +1622,1558,1623, +1559,1623,1558, +1623,1559,1624, +1560,1624,1559, +1624,1560,1625, +1561,1625,1560, +1625,1561,1626, +1562,1626,1561, +1626,1562,1627, +1563,1627,1562, +1627,1563,1628, +1564,1628,1563, +1628,1564,1629, +1565,1629,1564, +1629,1565,1630, +1566,1630,1565, +1630,1566,1631, +1567,1631,1566, +1631,1567,1632, +1568,1632,1567, +1632,1568,1633, +1569,1633,1568, +1633,1569,1634, +1570,1634,1569, +1634,1570,1635, +1571,1635,1570, +1635,1571,1636, +1572,1636,1571, +1636,1572,1637, +1573,1637,1572, +1637,1573,1638, +1574,1638,1573, +1638,1574,1639, +1575,1639,1574, +1639,1575,1640, +1576,1640,1575, +1640,1576,1641, +1577,1641,1576, +1641,1577,1642, +1578,1642,1577, +1642,1578,1643, +1579,1643,1578, +1643,1579,1644, +1580,1644,1579, +1644,1580,1645, +1581,1645,1580, +1645,1581,1646, +1582,1646,1581, +1646,1582,1647, +1583,1647,1582, +1647,1583,1648, +1584,1648,1583, +1648,1584,1649, +1585,1649,1584, +1649,1585,1650, +1586,1650,1585, +1650,1586,1651, +1587,1651,1586, +1651,1587,1652, +1588,1652,1587, +1652,1588,1653, +1589,1653,1588, +1653,1589,1654, +1590,1654,1589, +1654,1590,1655, +1591,1655,1590, +1655,1591,1656, +1592,1656,1591, +1656,1592,1657, +1593,1657,1592, +1657,1593,1658, +1594,1658,1593, +1658,1594,1659, +1595,1659,1594, +1659,1595,1660, +1596,1660,1595, +1660,1596,1661, +1597,1661,1596, +1661,1597,1662, +1598,1662,1597, +1662,1598,1663, +1599,1663,1598, +1664,1600,1665, +1601,1665,1600, +1665,1601,1666, +1602,1666,1601, +1666,1602,1667, +1603,1667,1602, +1667,1603,1668, +1604,1668,1603, +1668,1604,1669, +1605,1669,1604, +1669,1605,1670, +1606,1670,1605, +1670,1606,1671, +1607,1671,1606, +1671,1607,1672, +1608,1672,1607, +1672,1608,1673, +1609,1673,1608, +1673,1609,1674, +1610,1674,1609, +1674,1610,1675, +1611,1675,1610, +1675,1611,1676, +1612,1676,1611, +1676,1612,1677, +1613,1677,1612, +1677,1613,1678, +1614,1678,1613, +1678,1614,1679, +1615,1679,1614, +1679,1615,1680, +1616,1680,1615, +1680,1616,1681, +1617,1681,1616, +1681,1617,1682, +1618,1682,1617, +1682,1618,1683, +1619,1683,1618, +1683,1619,1684, +1620,1684,1619, +1684,1620,1685, +1621,1685,1620, +1685,1621,1686, +1622,1686,1621, +1686,1622,1687, +1623,1687,1622, +1687,1623,1688, +1624,1688,1623, +1688,1624,1689, +1625,1689,1624, +1689,1625,1690, +1626,1690,1625, +1690,1626,1691, +1627,1691,1626, +1691,1627,1692, +1628,1692,1627, +1692,1628,1693, +1629,1693,1628, +1693,1629,1694, +1630,1694,1629, +1694,1630,1695, +1631,1695,1630, +1695,1631,1696, +1632,1696,1631, +1696,1632,1697, +1633,1697,1632, +1697,1633,1698, +1634,1698,1633, +1698,1634,1699, +1635,1699,1634, +1699,1635,1700, +1636,1700,1635, +1700,1636,1701, +1637,1701,1636, +1701,1637,1702, +1638,1702,1637, +1702,1638,1703, +1639,1703,1638, +1703,1639,1704, +1640,1704,1639, +1704,1640,1705, +1641,1705,1640, +1705,1641,1706, +1642,1706,1641, +1706,1642,1707, +1643,1707,1642, +1707,1643,1708, +1644,1708,1643, +1708,1644,1709, +1645,1709,1644, +1709,1645,1710, +1646,1710,1645, +1710,1646,1711, +1647,1711,1646, +1711,1647,1712, +1648,1712,1647, +1712,1648,1713, +1649,1713,1648, +1713,1649,1714, +1650,1714,1649, +1714,1650,1715, +1651,1715,1650, +1715,1651,1716, +1652,1716,1651, +1716,1652,1717, +1653,1717,1652, +1717,1653,1718, +1654,1718,1653, +1718,1654,1719, +1655,1719,1654, +1719,1655,1720, +1656,1720,1655, +1720,1656,1721, +1657,1721,1656, +1721,1657,1722, +1658,1722,1657, +1722,1658,1723, +1659,1723,1658, +1723,1659,1724, +1660,1724,1659, +1724,1660,1725, +1661,1725,1660, +1725,1661,1726, +1662,1726,1661, +1726,1662,1727, +1663,1727,1662, +1728,1664,1729, +1665,1729,1664, +1729,1665,1730, +1666,1730,1665, +1730,1666,1731, +1667,1731,1666, +1731,1667,1732, +1668,1732,1667, +1732,1668,1733, +1669,1733,1668, +1733,1669,1734, +1670,1734,1669, +1734,1670,1735, +1671,1735,1670, +1735,1671,1736, +1672,1736,1671, +1736,1672,1737, +1673,1737,1672, +1737,1673,1738, +1674,1738,1673, +1738,1674,1739, +1675,1739,1674, +1739,1675,1740, +1676,1740,1675, +1740,1676,1741, +1677,1741,1676, +1741,1677,1742, +1678,1742,1677, +1742,1678,1743, +1679,1743,1678, +1743,1679,1744, +1680,1744,1679, +1744,1680,1745, +1681,1745,1680, +1745,1681,1746, +1682,1746,1681, +1746,1682,1747, +1683,1747,1682, +1747,1683,1748, +1684,1748,1683, +1748,1684,1749, +1685,1749,1684, +1749,1685,1750, +1686,1750,1685, +1750,1686,1751, +1687,1751,1686, +1751,1687,1752, +1688,1752,1687, +1752,1688,1753, +1689,1753,1688, +1753,1689,1754, +1690,1754,1689, +1754,1690,1755, +1691,1755,1690, +1755,1691,1756, +1692,1756,1691, +1756,1692,1757, +1693,1757,1692, +1757,1693,1758, +1694,1758,1693, +1758,1694,1759, +1695,1759,1694, +1759,1695,1760, +1696,1760,1695, +1760,1696,1761, +1697,1761,1696, +1761,1697,1762, +1698,1762,1697, +1762,1698,1763, +1699,1763,1698, +1763,1699,1764, +1700,1764,1699, +1764,1700,1765, +1701,1765,1700, +1765,1701,1766, +1702,1766,1701, +1766,1702,1767, +1703,1767,1702, +1767,1703,1768, +1704,1768,1703, +1768,1704,1769, +1705,1769,1704, +1769,1705,1770, +1706,1770,1705, +1770,1706,1771, +1707,1771,1706, +1771,1707,1772, +1708,1772,1707, +1772,1708,1773, +1709,1773,1708, +1773,1709,1774, +1710,1774,1709, +1774,1710,1775, +1711,1775,1710, +1775,1711,1776, +1712,1776,1711, +1776,1712,1777, +1713,1777,1712, +1777,1713,1778, +1714,1778,1713, +1778,1714,1779, +1715,1779,1714, +1779,1715,1780, +1716,1780,1715, +1780,1716,1781, +1717,1781,1716, +1781,1717,1782, +1718,1782,1717, +1782,1718,1783, +1719,1783,1718, +1783,1719,1784, +1720,1784,1719, +1784,1720,1785, +1721,1785,1720, +1785,1721,1786, +1722,1786,1721, +1786,1722,1787, +1723,1787,1722, +1787,1723,1788, +1724,1788,1723, +1788,1724,1789, +1725,1789,1724, +1789,1725,1790, +1726,1790,1725, +1790,1726,1791, +1727,1791,1726, +1792,1728,1793, +1729,1793,1728, +1793,1729,1794, +1730,1794,1729, +1794,1730,1795, +1731,1795,1730, +1795,1731,1796, +1732,1796,1731, +1796,1732,1797, +1733,1797,1732, +1797,1733,1798, +1734,1798,1733, +1798,1734,1799, +1735,1799,1734, +1799,1735,1800, +1736,1800,1735, +1800,1736,1801, +1737,1801,1736, +1801,1737,1802, +1738,1802,1737, +1802,1738,1803, +1739,1803,1738, +1803,1739,1804, +1740,1804,1739, +1804,1740,1805, +1741,1805,1740, +1805,1741,1806, +1742,1806,1741, +1806,1742,1807, +1743,1807,1742, +1807,1743,1808, +1744,1808,1743, +1808,1744,1809, +1745,1809,1744, +1809,1745,1810, +1746,1810,1745, +1810,1746,1811, +1747,1811,1746, +1811,1747,1812, +1748,1812,1747, +1812,1748,1813, +1749,1813,1748, +1813,1749,1814, +1750,1814,1749, +1814,1750,1815, +1751,1815,1750, +1815,1751,1816, +1752,1816,1751, +1816,1752,1817, +1753,1817,1752, +1817,1753,1818, +1754,1818,1753, +1818,1754,1819, +1755,1819,1754, +1819,1755,1820, +1756,1820,1755, +1820,1756,1821, +1757,1821,1756, +1821,1757,1822, +1758,1822,1757, +1822,1758,1823, +1759,1823,1758, +1823,1759,1824, +1760,1824,1759, +1824,1760,1825, +1761,1825,1760, +1825,1761,1826, +1762,1826,1761, +1826,1762,1827, +1763,1827,1762, +1827,1763,1828, +1764,1828,1763, +1828,1764,1829, +1765,1829,1764, +1829,1765,1830, +1766,1830,1765, +1830,1766,1831, +1767,1831,1766, +1831,1767,1832, +1768,1832,1767, +1832,1768,1833, +1769,1833,1768, +1833,1769,1834, +1770,1834,1769, +1834,1770,1835, +1771,1835,1770, +1835,1771,1836, +1772,1836,1771, +1836,1772,1837, +1773,1837,1772, +1837,1773,1838, +1774,1838,1773, +1838,1774,1839, +1775,1839,1774, +1839,1775,1840, +1776,1840,1775, +1840,1776,1841, +1777,1841,1776, +1841,1777,1842, +1778,1842,1777, +1842,1778,1843, +1779,1843,1778, +1843,1779,1844, +1780,1844,1779, +1844,1780,1845, +1781,1845,1780, +1845,1781,1846, +1782,1846,1781, +1846,1782,1847, +1783,1847,1782, +1847,1783,1848, +1784,1848,1783, +1848,1784,1849, +1785,1849,1784, +1849,1785,1850, +1786,1850,1785, +1850,1786,1851, +1787,1851,1786, +1851,1787,1852, +1788,1852,1787, +1852,1788,1853, +1789,1853,1788, +1853,1789,1854, +1790,1854,1789, +1854,1790,1855, +1791,1855,1790, +1856,1792,1857, +1793,1857,1792, +1857,1793,1858, +1794,1858,1793, +1858,1794,1859, +1795,1859,1794, +1859,1795,1860, +1796,1860,1795, +1860,1796,1861, +1797,1861,1796, +1861,1797,1862, +1798,1862,1797, +1862,1798,1863, +1799,1863,1798, +1863,1799,1864, +1800,1864,1799, +1864,1800,1865, +1801,1865,1800, +1865,1801,1866, +1802,1866,1801, +1866,1802,1867, +1803,1867,1802, +1867,1803,1868, +1804,1868,1803, +1868,1804,1869, +1805,1869,1804, +1869,1805,1870, +1806,1870,1805, +1870,1806,1871, +1807,1871,1806, +1871,1807,1872, +1808,1872,1807, +1872,1808,1873, +1809,1873,1808, +1873,1809,1874, +1810,1874,1809, +1874,1810,1875, +1811,1875,1810, +1875,1811,1876, +1812,1876,1811, +1876,1812,1877, +1813,1877,1812, +1877,1813,1878, +1814,1878,1813, +1878,1814,1879, +1815,1879,1814, +1879,1815,1880, +1816,1880,1815, +1880,1816,1881, +1817,1881,1816, +1881,1817,1882, +1818,1882,1817, +1882,1818,1883, +1819,1883,1818, +1883,1819,1884, +1820,1884,1819, +1884,1820,1885, +1821,1885,1820, +1885,1821,1886, +1822,1886,1821, +1886,1822,1887, +1823,1887,1822, +1887,1823,1888, +1824,1888,1823, +1888,1824,1889, +1825,1889,1824, +1889,1825,1890, +1826,1890,1825, +1890,1826,1891, +1827,1891,1826, +1891,1827,1892, +1828,1892,1827, +1892,1828,1893, +1829,1893,1828, +1893,1829,1894, +1830,1894,1829, +1894,1830,1895, +1831,1895,1830, +1895,1831,1896, +1832,1896,1831, +1896,1832,1897, +1833,1897,1832, +1897,1833,1898, +1834,1898,1833, +1898,1834,1899, +1835,1899,1834, +1899,1835,1900, +1836,1900,1835, +1900,1836,1901, +1837,1901,1836, +1901,1837,1902, +1838,1902,1837, +1902,1838,1903, +1839,1903,1838, +1903,1839,1904, +1840,1904,1839, +1904,1840,1905, +1841,1905,1840, +1905,1841,1906, +1842,1906,1841, +1906,1842,1907, +1843,1907,1842, +1907,1843,1908, +1844,1908,1843, +1908,1844,1909, +1845,1909,1844, +1909,1845,1910, +1846,1910,1845, +1910,1846,1911, +1847,1911,1846, +1911,1847,1912, +1848,1912,1847, +1912,1848,1913, +1849,1913,1848, +1913,1849,1914, +1850,1914,1849, +1914,1850,1915, +1851,1915,1850, +1915,1851,1916, +1852,1916,1851, +1916,1852,1917, +1853,1917,1852, +1917,1853,1918, +1854,1918,1853, +1918,1854,1919, +1855,1919,1854, +1920,1856,1921, +1857,1921,1856, +1921,1857,1922, +1858,1922,1857, +1922,1858,1923, +1859,1923,1858, +1923,1859,1924, +1860,1924,1859, +1924,1860,1925, +1861,1925,1860, +1925,1861,1926, +1862,1926,1861, +1926,1862,1927, +1863,1927,1862, +1927,1863,1928, +1864,1928,1863, +1928,1864,1929, +1865,1929,1864, +1929,1865,1930, +1866,1930,1865, +1930,1866,1931, +1867,1931,1866, +1931,1867,1932, +1868,1932,1867, +1932,1868,1933, +1869,1933,1868, +1933,1869,1934, +1870,1934,1869, +1934,1870,1935, +1871,1935,1870, +1935,1871,1936, +1872,1936,1871, +1936,1872,1937, +1873,1937,1872, +1937,1873,1938, +1874,1938,1873, +1938,1874,1939, +1875,1939,1874, +1939,1875,1940, +1876,1940,1875, +1940,1876,1941, +1877,1941,1876, +1941,1877,1942, +1878,1942,1877, +1942,1878,1943, +1879,1943,1878, +1943,1879,1944, +1880,1944,1879, +1944,1880,1945, +1881,1945,1880, +1945,1881,1946, +1882,1946,1881, +1946,1882,1947, +1883,1947,1882, +1947,1883,1948, +1884,1948,1883, +1948,1884,1949, +1885,1949,1884, +1949,1885,1950, +1886,1950,1885, +1950,1886,1951, +1887,1951,1886, +1951,1887,1952, +1888,1952,1887, +1952,1888,1953, +1889,1953,1888, +1953,1889,1954, +1890,1954,1889, +1954,1890,1955, +1891,1955,1890, +1955,1891,1956, +1892,1956,1891, +1956,1892,1957, +1893,1957,1892, +1957,1893,1958, +1894,1958,1893, +1958,1894,1959, +1895,1959,1894, +1959,1895,1960, +1896,1960,1895, +1960,1896,1961, +1897,1961,1896, +1961,1897,1962, +1898,1962,1897, +1962,1898,1963, +1899,1963,1898, +1963,1899,1964, +1900,1964,1899, +1964,1900,1965, +1901,1965,1900, +1965,1901,1966, +1902,1966,1901, +1966,1902,1967, +1903,1967,1902, +1967,1903,1968, +1904,1968,1903, +1968,1904,1969, +1905,1969,1904, +1969,1905,1970, +1906,1970,1905, +1970,1906,1971, +1907,1971,1906, +1971,1907,1972, +1908,1972,1907, +1972,1908,1973, +1909,1973,1908, +1973,1909,1974, +1910,1974,1909, +1974,1910,1975, +1911,1975,1910, +1975,1911,1976, +1912,1976,1911, +1976,1912,1977, +1913,1977,1912, +1977,1913,1978, +1914,1978,1913, +1978,1914,1979, +1915,1979,1914, +1979,1915,1980, +1916,1980,1915, +1980,1916,1981, +1917,1981,1916, +1981,1917,1982, +1918,1982,1917, +1982,1918,1983, +1919,1983,1918, +1984,1920,1985, +1921,1985,1920, +1985,1921,1986, +1922,1986,1921, +1986,1922,1987, +1923,1987,1922, +1987,1923,1988, +1924,1988,1923, +1988,1924,1989, +1925,1989,1924, +1989,1925,1990, +1926,1990,1925, +1990,1926,1991, +1927,1991,1926, +1991,1927,1992, +1928,1992,1927, +1992,1928,1993, +1929,1993,1928, +1993,1929,1994, +1930,1994,1929, +1994,1930,1995, +1931,1995,1930, +1995,1931,1996, +1932,1996,1931, +1996,1932,1997, +1933,1997,1932, +1997,1933,1998, +1934,1998,1933, +1998,1934,1999, +1935,1999,1934, +1999,1935,2000, +1936,2000,1935, +2000,1936,2001, +1937,2001,1936, +2001,1937,2002, +1938,2002,1937, +2002,1938,2003, +1939,2003,1938, +2003,1939,2004, +1940,2004,1939, +2004,1940,2005, +1941,2005,1940, +2005,1941,2006, +1942,2006,1941, +2006,1942,2007, +1943,2007,1942, +2007,1943,2008, +1944,2008,1943, +2008,1944,2009, +1945,2009,1944, +2009,1945,2010, +1946,2010,1945, +2010,1946,2011, +1947,2011,1946, +2011,1947,2012, +1948,2012,1947, +2012,1948,2013, +1949,2013,1948, +2013,1949,2014, +1950,2014,1949, +2014,1950,2015, +1951,2015,1950, +2015,1951,2016, +1952,2016,1951, +2016,1952,2017, +1953,2017,1952, +2017,1953,2018, +1954,2018,1953, +2018,1954,2019, +1955,2019,1954, +2019,1955,2020, +1956,2020,1955, +2020,1956,2021, +1957,2021,1956, +2021,1957,2022, +1958,2022,1957, +2022,1958,2023, +1959,2023,1958, +2023,1959,2024, +1960,2024,1959, +2024,1960,2025, +1961,2025,1960, +2025,1961,2026, +1962,2026,1961, +2026,1962,2027, +1963,2027,1962, +2027,1963,2028, +1964,2028,1963, +2028,1964,2029, +1965,2029,1964, +2029,1965,2030, +1966,2030,1965, +2030,1966,2031, +1967,2031,1966, +2031,1967,2032, +1968,2032,1967, +2032,1968,2033, +1969,2033,1968, +2033,1969,2034, +1970,2034,1969, +2034,1970,2035, +1971,2035,1970, +2035,1971,2036, +1972,2036,1971, +2036,1972,2037, +1973,2037,1972, +2037,1973,2038, +1974,2038,1973, +2038,1974,2039, +1975,2039,1974, +2039,1975,2040, +1976,2040,1975, +2040,1976,2041, +1977,2041,1976, +2041,1977,2042, +1978,2042,1977, +2042,1978,2043, +1979,2043,1978, +2043,1979,2044, +1980,2044,1979, +2044,1980,2045, +1981,2045,1980, +2045,1981,2046, +1982,2046,1981, +2046,1982,2047, +1983,2047,1982, +2048,1984,2049, +1985,2049,1984, +2049,1985,2050, +1986,2050,1985, +2050,1986,2051, +1987,2051,1986, +2051,1987,2052, +1988,2052,1987, +2052,1988,2053, +1989,2053,1988, +2053,1989,2054, +1990,2054,1989, +2054,1990,2055, +1991,2055,1990, +2055,1991,2056, +1992,2056,1991, +2056,1992,2057, +1993,2057,1992, +2057,1993,2058, +1994,2058,1993, +2058,1994,2059, +1995,2059,1994, +2059,1995,2060, +1996,2060,1995, +2060,1996,2061, +1997,2061,1996, +2061,1997,2062, +1998,2062,1997, +2062,1998,2063, +1999,2063,1998, +2063,1999,2064, +2000,2064,1999, +2064,2000,2065, +2001,2065,2000, +2065,2001,2066, +2002,2066,2001, +2066,2002,2067, +2003,2067,2002, +2067,2003,2068, +2004,2068,2003, +2068,2004,2069, +2005,2069,2004, +2069,2005,2070, +2006,2070,2005, +2070,2006,2071, +2007,2071,2006, +2071,2007,2072, +2008,2072,2007, +2072,2008,2073, +2009,2073,2008, +2073,2009,2074, +2010,2074,2009, +2074,2010,2075, +2011,2075,2010, +2075,2011,2076, +2012,2076,2011, +2076,2012,2077, +2013,2077,2012, +2077,2013,2078, +2014,2078,2013, +2078,2014,2079, +2015,2079,2014, +2079,2015,2080, +2016,2080,2015, +2080,2016,2081, +2017,2081,2016, +2081,2017,2082, +2018,2082,2017, +2082,2018,2083, +2019,2083,2018, +2083,2019,2084, +2020,2084,2019, +2084,2020,2085, +2021,2085,2020, +2085,2021,2086, +2022,2086,2021, +2086,2022,2087, +2023,2087,2022, +2087,2023,2088, +2024,2088,2023, +2088,2024,2089, +2025,2089,2024, +2089,2025,2090, +2026,2090,2025, +2090,2026,2091, +2027,2091,2026, +2091,2027,2092, +2028,2092,2027, +2092,2028,2093, +2029,2093,2028, +2093,2029,2094, +2030,2094,2029, +2094,2030,2095, +2031,2095,2030, +2095,2031,2096, +2032,2096,2031, +2096,2032,2097, +2033,2097,2032, +2097,2033,2098, +2034,2098,2033, +2098,2034,2099, +2035,2099,2034, +2099,2035,2100, +2036,2100,2035, +2100,2036,2101, +2037,2101,2036, +2101,2037,2102, +2038,2102,2037, +2102,2038,2103, +2039,2103,2038, +2103,2039,2104, +2040,2104,2039, +2104,2040,2105, +2041,2105,2040, +2105,2041,2106, +2042,2106,2041, +2106,2042,2107, +2043,2107,2042, +2107,2043,2108, +2044,2108,2043, +2108,2044,2109, +2045,2109,2044, +2109,2045,2110, +2046,2110,2045, +2110,2046,2111, +2047,2111,2046, +}; + +#define Landscape05VtxCount 2244 +#define Landscape05IdxCount 12870 + +btScalar Landscape05Vtx[] = { +-250.0f,-0.990273f,0.0f, +-250.0f,0.139875f,3.90625f, +-246.094f,0.671004f,0.0f, +-246.094f,1.72995f,3.90625f, +-242.188f,1.84097f,0.0f, +-242.188f,2.60122f,3.90625f, +-238.281f,3.67319f,-1.6056e-007f, +-238.281f,4.01346f,3.90625f, +-234.375f,4.96849f,-2.1718e-007f, +-234.375f,5.13654f,3.90625f, +-230.469f,6.56215f,-2.86841e-007f, +-230.469f,6.69665f,3.90625f, +-226.563f,8.30102f,-3.62849e-007f, +-226.563f,8.43203f,3.90625f, +-222.656f,9.94385f,-4.3466e-007f, +-222.656f,9.83442f,3.90625f, +-218.75f,11.5986f,-5.06992e-007f, +-218.75f,11.3645f,3.90625f, +-214.844f,14.3141f,-6.2569e-007f, +-214.844f,14.222f,3.90625f, +-210.938f,16.5538f,-7.2359e-007f, +-210.938f,16.1758f,3.90625f, +-207.031f,18.852f,-8.24046e-007f, +-207.031f,18.9127f,3.90625f, +-203.125f,21.5344f,-9.41301e-007f, +-203.125f,21.2478f,3.90625f, +-199.219f,22.7337f,-9.93723e-007f, +-199.219f,23.0589f,3.90625f, +-195.313f,24.4712f,-1.06967e-006f, +-195.313f,24.6025f,3.90625f, +-191.406f,26.1169f,-1.14161e-006f, +-191.406f,25.8143f,3.90625f, +-187.5f,26.9988f,-1.18015e-006f, +-187.5f,27.5696f,3.90625f, +-183.594f,28.3854f,-1.24077e-006f, +-183.594f,29.2176f,3.90625f, +-179.688f,29.0457f,-1.26963e-006f, +-179.688f,29.6835f,3.90625f, +-175.781f,29.802f,-1.30269e-006f, +-175.781f,30.7416f,3.90625f, +-171.875f,30.1559f,-1.31816e-006f, +-171.875f,31.4405f,3.90625f, +-167.969f,32.3708f,-1.41497e-006f, +-167.969f,33.0831f,3.90625f, +-164.063f,34.9705f,-1.52861e-006f, +-164.063f,34.6225f,3.90625f, +-160.156f,36.396f,-1.59092e-006f, +-160.156f,35.4992f,3.90625f, +-156.25f,37.2947f,-1.6302e-006f, +-156.25f,37.4126f,3.90625f, +-152.344f,38.248f,-1.67187e-006f, +-152.344f,38.453f,3.90625f, +-148.438f,38.3176f,-1.67491e-006f, +-148.438f,38.9974f,3.90625f, +-144.531f,38.1589f,-1.66798e-006f, +-144.531f,38.7871f,3.90625f, +-140.625f,36.5895f,-1.59938e-006f, +-140.625f,37.6021f,3.90625f, +-136.719f,35.718f,-1.56128e-006f, +-136.719f,36.1797f,3.90625f, +-132.813f,33.7519f,-1.47534e-006f, +-132.813f,34.9906f,3.90625f, +-128.906f,33.2853f,-1.45495e-006f, +-128.906f,34.1304f,3.90625f, +-125.0f,33.4003f,-1.45997e-006f, +-125.0f,34.3517f,3.90625f, +-121.094f,33.1132f,-1.44742e-006f, +-121.094f,33.6612f,3.90625f, +-117.188f,32.7861f,-1.43313e-006f, +-117.188f,32.7047f,3.90625f, +-113.281f,33.0037f,-1.44264e-006f, +-113.281f,32.3958f,3.90625f, +-109.375f,32.508f,-1.42097e-006f, +-109.375f,31.0818f,3.90625f, +-105.469f,31.8384f,-1.3917e-006f, +-105.469f,30.9536f,3.90625f, +-101.563f,31.1858f,-1.36317e-006f, +-101.563f,29.8205f,3.90625f, +-97.6563f,29.6739f,-1.29709e-006f, +-97.6563f,28.4796f,3.90625f, +-93.75f,27.8258f,-1.2163e-006f, +-93.75f,27.6494f,3.90625f, +-89.8438f,25.9046f,-1.13232e-006f, +-89.8438f,25.5721f,3.90625f, +-85.9375f,23.4229f,-1.02385e-006f, +-85.9375f,24.227f,3.90625f, +-82.0313f,23.3671f,-1.02141e-006f, +-82.0313f,23.2611f,3.90625f, +-78.125f,23.0585f,-1.00792e-006f, +-78.125f,22.4589f,3.90625f, +-74.2188f,23.9226f,-1.04569e-006f, +-74.2188f,23.2261f,3.90625f, +-70.3125f,23.6449f,-1.03355e-006f, +-70.3125f,23.5025f,3.90625f, +-66.4063f,23.2789f,-1.01755e-006f, +-66.4063f,23.6913f,3.90625f, +-62.5f,24.5841f,-1.07461e-006f, +-62.5f,24.6785f,3.90625f, +-58.5938f,25.71f,-1.12382e-006f, +-58.5938f,25.4946f,3.90625f, +-54.6875f,26.9872f,-1.17965e-006f, +-54.6875f,25.9722f,3.90625f, +-50.7813f,27.8632f,-1.21794e-006f, +-50.7813f,26.1977f,3.90625f, +-46.875f,28.0326f,-1.22534e-006f, +-46.875f,26.8539f,3.90625f, +-42.9688f,28.0866f,-1.2277e-006f, +-42.9688f,27.7268f,3.90625f, +-39.0625f,30.1482f,-1.31782e-006f, +-39.0625f,29.2046f,3.90625f, +-35.1563f,32.4049f,-1.41646e-006f, +-35.1563f,31.79f,3.90625f, +-31.25f,34.4714f,-1.50679e-006f, +-31.25f,34.2658f,3.90625f, +-27.3438f,37.2668f,-1.62898e-006f, +-27.3438f,35.9914f,3.90625f, +-23.4375f,38.7934f,-1.69571e-006f, +-23.4375f,38.3776f,3.90625f, +-19.5313f,40.4024f,-1.76605e-006f, +-19.5313f,39.8852f,3.90625f, +-15.625f,42.8177f,-1.87162e-006f, +-15.625f,43.1455f,3.90625f, +-11.7188f,45.0198f,-1.96788e-006f, +-11.7188f,45.5059f,3.90625f, +-7.8125f,46.7349f,-2.04285e-006f, +-7.8125f,47.4257f,3.90625f, +-3.90625f,48.376f,-2.11458e-006f, +-3.90625f,49.9032f,3.90625f, +0.0f,49.9016f,-2.18127e-006f, +0.0f,52.0322f,3.90625f, +3.90625f,50.3865f,-2.20246e-006f, +3.90625f,52.6186f,3.90625f, +-250.0f,-0.818988f,-3.90625f, +-246.094f,0.671433f,-3.90625f, +-242.188f,2.83415f,-3.90625f, +-238.281f,4.19978f,-3.90625f, +-234.375f,5.59158f,-3.90625f, +-230.469f,6.94041f,-3.90625f, +-226.563f,8.34599f,-3.90625f, +-222.656f,9.85416f,-3.90625f, +-218.75f,10.8989f,-3.90625f, +-214.844f,13.6339f,-3.90625f, +-210.938f,16.5116f,-3.90625f, +-207.031f,17.7111f,-3.90625f, +-203.125f,20.7442f,-3.90625f, +-199.219f,22.5356f,-3.90625f, +-195.313f,24.3988f,-3.90625f, +-191.406f,25.8062f,-3.90625f, +-187.5f,26.9714f,-3.90625f, +-183.594f,27.7397f,-3.90625f, +-179.688f,28.8632f,-3.90625f, +-175.781f,29.9688f,-3.90625f, +-171.875f,32.154f,-3.90625f, +-167.969f,33.3799f,-3.90625f, +-164.063f,35.3882f,-3.90625f, +-160.156f,35.9765f,-3.90625f, +-156.25f,36.5306f,-3.90625f, +-152.344f,37.3214f,-3.90625f, +-148.438f,36.8126f,-3.90625f, +-144.531f,36.5407f,-3.90625f, +-140.625f,35.696f,-3.90625f, +-136.719f,35.1152f,-3.90625f, +-132.813f,34.1963f,-3.90625f, +-128.906f,34.0796f,-3.90625f, +-125.0f,34.2398f,-3.90625f, +-121.094f,34.1503f,-3.90625f, +-117.188f,33.7958f,-3.90625f, +-113.281f,33.856f,-3.90625f, +-109.375f,33.2705f,-3.90625f, +-105.469f,32.5804f,-3.90625f, +-101.563f,31.911f,-3.90625f, +-97.6563f,30.3705f,-3.90625f, +-93.75f,29.0627f,-3.90625f, +-89.8438f,26.6822f,-3.90625f, +-85.9375f,24.8309f,-3.90625f, +-82.0313f,23.8581f,-3.90625f, +-78.125f,23.3764f,-3.90625f, +-74.2188f,23.9582f,-3.90625f, +-70.3125f,24.13f,-3.90625f, +-66.4063f,24.4426f,-3.90625f, +-62.5f,25.5839f,-3.90625f, +-58.5938f,26.6899f,-3.90625f, +-54.6875f,27.9086f,-3.90625f, +-50.7813f,28.5131f,-3.90625f, +-46.875f,29.2612f,-3.90625f, +-42.9688f,29.4581f,-3.90625f, +-39.0625f,30.8972f,-3.90625f, +-35.1563f,32.9085f,-3.90625f, +-31.25f,34.9204f,-3.90625f, +-27.3438f,37.7223f,-3.90625f, +-23.4375f,38.921f,-3.90625f, +-19.5313f,40.2983f,-3.90625f, +-15.625f,41.7689f,-3.90625f, +-11.7188f,43.8388f,-3.90625f, +-7.8125f,44.7599f,-3.90625f, +-3.90625f,46.53f,-3.90625f, +0.0f,48.2498f,-3.90625f, +3.90625f,48.8559f,-3.90625f, +-250.0f,0.432867f,-7.8125f, +-246.094f,1.93096f,-7.8125f, +-242.188f,3.28774f,-7.8125f, +-238.281f,4.53112f,-7.8125f, +-234.375f,5.67699f,-7.8125f, +-230.469f,7.34068f,-7.8125f, +-226.563f,8.48553f,-7.8125f, +-222.656f,10.127f,-7.8125f, +-218.75f,11.3267f,-7.8125f, +-214.844f,13.3914f,-7.8125f, +-210.938f,15.5197f,-7.8125f, +-207.031f,17.9403f,-7.8125f, +-203.125f,20.5644f,-7.8125f, +-199.219f,22.8796f,-7.8125f, +-195.313f,23.715f,-7.8125f, +-191.406f,26.1312f,-7.8125f, +-187.5f,28.0754f,-7.8125f, +-183.594f,29.1199f,-7.8125f, +-179.688f,29.5774f,-7.8125f, +-175.781f,30.2676f,-7.8125f, +-171.875f,31.8275f,-7.8125f, +-167.969f,33.4969f,-7.8125f, +-164.063f,34.4445f,-7.8125f, +-160.156f,35.3881f,-7.8125f, +-156.25f,36.0267f,-7.8125f, +-152.344f,36.1221f,-7.8125f, +-148.438f,36.7707f,-7.8125f, +-144.531f,36.3067f,-7.8125f, +-140.625f,36.2295f,-7.8125f, +-136.719f,35.6858f,-7.8125f, +-132.813f,34.6232f,-7.8125f, +-128.906f,34.1675f,-7.8125f, +-125.0f,34.1756f,-7.8125f, +-121.094f,33.6453f,-7.8125f, +-117.188f,34.2516f,-7.8125f, +-113.281f,34.228f,-7.8125f, +-109.375f,34.253f,-7.8125f, +-105.469f,33.1798f,-7.8125f, +-101.563f,32.238f,-7.8125f, +-97.6563f,31.0377f,-7.8125f, +-93.75f,29.6795f,-7.8125f, +-89.8438f,27.5934f,-7.8125f, +-85.9375f,25.7426f,-7.8125f, +-82.0313f,24.4001f,-7.8125f, +-78.125f,24.4095f,-7.8125f, +-74.2188f,25.1494f,-7.8125f, +-70.3125f,25.0193f,-7.8125f, +-66.4063f,25.3902f,-7.8125f, +-62.5f,25.8612f,-7.8125f, +-58.5938f,26.8169f,-7.8125f, +-54.6875f,28.0698f,-7.8125f, +-50.7813f,28.978f,-7.8125f, +-46.875f,29.1063f,-7.8125f, +-42.9688f,30.6071f,-7.8125f, +-39.0625f,31.7015f,-7.8125f, +-35.1563f,32.6112f,-7.8125f, +-31.25f,34.6006f,-7.8125f, +-27.3438f,36.3005f,-7.8125f, +-23.4375f,38.4757f,-7.8125f, +-19.5313f,39.7014f,-7.8125f, +-15.625f,40.7762f,-7.8125f, +-11.7188f,42.6458f,-7.8125f, +-7.8125f,45.0307f,-7.8125f, +-3.90625f,47.2861f,-7.8125f, +0.0f,48.5591f,-7.8125f, +3.90625f,48.7225f,-7.8125f, +-250.0f,0.568294f,-11.7188f, +-246.094f,1.83097f,-11.7188f, +-242.188f,3.32037f,-11.7188f, +-238.281f,4.29184f,-11.7188f, +-234.375f,6.04113f,-11.7188f, +-230.469f,7.01872f,-11.7188f, +-226.563f,8.96731f,-11.7188f, +-222.656f,10.3749f,-11.7188f, +-218.75f,11.568f,-11.7188f, +-214.844f,13.9092f,-11.7188f, +-210.938f,15.6547f,-11.7188f, +-207.031f,18.2156f,-11.7188f, +-203.125f,20.0116f,-11.7188f, +-199.219f,21.5443f,-11.7188f, +-195.313f,23.4553f,-11.7188f, +-191.406f,26.2778f,-11.7188f, +-187.5f,28.0543f,-11.7188f, +-183.594f,29.2657f,-11.7188f, +-179.688f,29.6454f,-11.7188f, +-175.781f,30.699f,-11.7188f, +-171.875f,30.8229f,-11.7188f, +-167.969f,32.9874f,-11.7188f, +-164.063f,33.581f,-11.7188f, +-160.156f,34.6365f,-11.7188f, +-156.25f,35.6153f,-11.7188f, +-152.344f,36.2491f,-11.7188f, +-148.438f,36.2996f,-11.7188f, +-144.531f,36.5456f,-11.7188f, +-140.625f,36.3803f,-11.7188f, +-136.719f,35.2403f,-11.7188f, +-132.813f,34.0595f,-11.7188f, +-128.906f,34.1384f,-11.7188f, +-125.0f,33.59f,-11.7188f, +-121.094f,33.7745f,-11.7188f, +-117.188f,33.7284f,-11.7188f, +-113.281f,33.7013f,-11.7188f, +-109.375f,33.6335f,-11.7188f, +-105.469f,33.2451f,-11.7188f, +-101.563f,32.8691f,-11.7188f, +-97.6563f,31.1343f,-11.7188f, +-93.75f,29.5843f,-11.7188f, +-89.8438f,27.5891f,-11.7188f, +-85.9375f,25.75f,-11.7188f, +-82.0313f,25.4336f,-11.7188f, +-78.125f,25.6207f,-11.7188f, +-74.2188f,25.1627f,-11.7188f, +-70.3125f,25.542f,-11.7188f, +-66.4063f,25.5384f,-11.7188f, +-62.5f,25.9238f,-11.7188f, +-58.5938f,26.0718f,-11.7188f, +-54.6875f,27.4395f,-11.7188f, +-50.7813f,28.8032f,-11.7188f, +-46.875f,29.9667f,-11.7188f, +-42.9688f,31.7598f,-11.7188f, +-39.0625f,32.2636f,-11.7188f, +-35.1563f,32.5734f,-11.7188f, +-31.25f,33.543f,-11.7188f, +-27.3438f,35.1143f,-11.7188f, +-23.4375f,37.3147f,-11.7188f, +-19.5313f,39.2413f,-11.7188f, +-15.625f,41.8344f,-11.7188f, +-11.7188f,43.9992f,-11.7188f, +-7.8125f,46.8581f,-11.7188f, +-3.90625f,48.5977f,-11.7188f, +0.0f,48.7029f,-11.7188f, +3.90625f,49.6298f,-11.7188f, +-250.0f,1.50235f,-15.625f, +-246.094f,1.79115f,-15.625f, +-242.188f,2.52523f,-15.625f, +-238.281f,4.09278f,-15.625f, +-234.375f,6.21068f,-15.625f, +-230.469f,7.49819f,-15.625f, +-226.563f,8.56548f,-15.625f, +-222.656f,9.98954f,-15.625f, +-218.75f,12.3263f,-15.625f, +-214.844f,14.495f,-15.625f, +-210.938f,15.3551f,-15.625f, +-207.031f,17.6989f,-15.625f, +-203.125f,19.2847f,-15.625f, +-199.219f,21.1027f,-15.625f, +-195.313f,23.3408f,-15.625f, +-191.406f,25.3739f,-15.625f, +-187.5f,27.368f,-15.625f, +-183.594f,28.3731f,-15.625f, +-179.688f,29.5532f,-15.625f, +-175.781f,30.0011f,-15.625f, +-171.875f,31.0216f,-15.625f, +-167.969f,32.5546f,-15.625f, +-164.063f,32.6717f,-15.625f, +-160.156f,33.8465f,-15.625f, +-156.25f,35.1272f,-15.625f, +-152.344f,35.5572f,-15.625f, +-148.438f,36.643f,-15.625f, +-144.531f,36.4283f,-15.625f, +-140.625f,35.6122f,-15.625f, +-136.719f,35.358f,-15.625f, +-132.813f,34.1938f,-15.625f, +-128.906f,34.3913f,-15.625f, +-125.0f,33.2147f,-15.625f, +-121.094f,32.799f,-15.625f, +-117.188f,33.1385f,-15.625f, +-113.281f,33.1487f,-15.625f, +-109.375f,33.6564f,-15.625f, +-105.469f,33.2315f,-15.625f, +-101.563f,32.6066f,-15.625f, +-97.6563f,30.6926f,-15.625f, +-93.75f,28.534f,-15.625f, +-89.8438f,27.6738f,-15.625f, +-85.9375f,27.4216f,-15.625f, +-82.0313f,26.0324f,-15.625f, +-78.125f,25.775f,-15.625f, +-74.2188f,25.909f,-15.625f, +-70.3125f,25.0198f,-15.625f, +-66.4063f,25.9376f,-15.625f, +-62.5f,26.0382f,-15.625f, +-58.5938f,25.856f,-15.625f, +-54.6875f,27.3648f,-15.625f, +-50.7813f,28.9059f,-15.625f, +-46.875f,30.6601f,-15.625f, +-42.9688f,32.6996f,-15.625f, +-39.0625f,32.6909f,-15.625f, +-35.1563f,33.1697f,-15.625f, +-31.25f,34.6947f,-15.625f, +-27.3438f,35.6982f,-15.625f, +-23.4375f,38.2946f,-15.625f, +-19.5313f,40.6765f,-15.625f, +-15.625f,43.5894f,-15.625f, +-11.7188f,46.3071f,-15.625f, +-7.8125f,48.6578f,-15.625f, +-3.90625f,49.0003f,-15.625f, +0.0f,50.5123f,-15.625f, +3.90625f,50.6915f,-15.625f, +-250.0f,1.44302f,-19.5313f, +-246.094f,1.65093f,-19.5313f, +-242.188f,2.94233f,-19.5313f, +-238.281f,4.72065f,-19.5313f, +-234.375f,6.57861f,-19.5313f, +-230.469f,7.31849f,-19.5313f, +-226.563f,7.90567f,-19.5313f, +-222.656f,9.84414f,-19.5313f, +-218.75f,12.1574f,-19.5313f, +-214.844f,13.2825f,-19.5313f, +-210.938f,15.2284f,-19.5313f, +-207.031f,17.2765f,-19.5313f, +-203.125f,19.1565f,-19.5313f, +-199.219f,20.3098f,-19.5313f, +-195.313f,21.9346f,-19.5313f, +-191.406f,23.8549f,-19.5313f, +-187.5f,26.133f,-19.5313f, +-183.594f,27.5858f,-19.5313f, +-179.688f,28.557f,-19.5313f, +-175.781f,28.9754f,-19.5313f, +-171.875f,29.9709f,-19.5313f, +-167.969f,31.2632f,-19.5313f, +-164.063f,31.4957f,-19.5313f, +-160.156f,33.6753f,-19.5313f, +-156.25f,35.1342f,-19.5313f, +-152.344f,35.0617f,-19.5313f, +-148.438f,34.9467f,-19.5313f, +-144.531f,35.1042f,-19.5313f, +-140.625f,35.0842f,-19.5313f, +-136.719f,34.7766f,-19.5313f, +-132.813f,33.8305f,-19.5313f, +-128.906f,33.3013f,-19.5313f, +-125.0f,32.5726f,-19.5313f, +-121.094f,31.5139f,-19.5313f, +-117.188f,31.4576f,-19.5313f, +-113.281f,31.6546f,-19.5313f, +-109.375f,32.4663f,-19.5313f, +-105.469f,32.6148f,-19.5313f, +-101.563f,31.253f,-19.5313f, +-97.6563f,29.5875f,-19.5313f, +-93.75f,28.4866f,-19.5313f, +-89.8438f,29.106f,-19.5313f, +-85.9375f,28.7092f,-19.5313f, +-82.0313f,27.4567f,-19.5313f, +-78.125f,26.5225f,-19.5313f, +-74.2188f,26.7534f,-19.5313f, +-70.3125f,26.278f,-19.5313f, +-66.4063f,25.6949f,-19.5313f, +-62.5f,25.7385f,-19.5313f, +-58.5938f,25.8791f,-19.5313f, +-54.6875f,27.42f,-19.5313f, +-50.7813f,29.0777f,-19.5313f, +-46.875f,31.016f,-19.5313f, +-42.9688f,32.5331f,-19.5313f, +-39.0625f,33.213f,-19.5313f, +-35.1563f,33.9437f,-19.5313f, +-31.25f,35.6737f,-19.5313f, +-27.3438f,37.8841f,-19.5313f, +-23.4375f,40.5289f,-19.5313f, +-19.5313f,43.6786f,-19.5313f, +-15.625f,47.2945f,-19.5313f, +-11.7188f,49.7082f,-19.5313f, +-7.8125f,51.1285f,-19.5313f, +-3.90625f,51.5532f,-19.5313f, +0.0f,52.3342f,-19.5313f, +3.90625f,52.1028f,-19.5313f, +-250.0f,1.05337f,-23.4375f, +-246.094f,1.28315f,-23.4375f, +-242.188f,3.38102f,-23.4375f, +-238.281f,4.51357f,-23.4375f, +-234.375f,5.63288f,-23.4375f, +-230.469f,6.49498f,-23.4375f, +-226.563f,7.71248f,-23.4375f, +-222.656f,8.83716f,-23.4375f, +-218.75f,10.4002f,-23.4375f, +-214.844f,11.8049f,-23.4375f, +-210.938f,13.7948f,-23.4375f, +-207.031f,16.5066f,-23.4375f, +-203.125f,18.598f,-23.4375f, +-199.219f,20.3069f,-23.4375f, +-195.313f,21.6868f,-23.4375f, +-191.406f,22.5781f,-23.4375f, +-187.5f,25.0292f,-23.4375f, +-183.594f,26.5386f,-23.4375f, +-179.688f,27.1952f,-23.4375f, +-175.781f,28.4023f,-23.4375f, +-171.875f,29.0264f,-23.4375f, +-167.969f,29.9302f,-23.4375f, +-164.063f,31.7992f,-23.4375f, +-160.156f,33.4902f,-23.4375f, +-156.25f,34.4307f,-23.4375f, +-152.344f,34.1463f,-23.4375f, +-148.438f,33.5881f,-23.4375f, +-144.531f,34.0515f,-23.4375f, +-140.625f,33.7128f,-23.4375f, +-136.719f,33.2076f,-23.4375f, +-132.813f,32.0419f,-23.4375f, +-128.906f,31.3464f,-23.4375f, +-125.0f,31.3552f,-23.4375f, +-121.094f,30.6713f,-23.4375f, +-117.188f,30.1403f,-23.4375f, +-113.281f,30.1753f,-23.4375f, +-109.375f,30.6182f,-23.4375f, +-105.469f,31.2785f,-23.4375f, +-101.563f,30.4839f,-23.4375f, +-97.6563f,28.9907f,-23.4375f, +-93.75f,29.3427f,-23.4375f, +-89.8438f,29.5539f,-23.4375f, +-85.9375f,29.4313f,-23.4375f, +-82.0313f,28.0148f,-23.4375f, +-78.125f,27.3569f,-23.4375f, +-74.2188f,26.8569f,-23.4375f, +-70.3125f,25.6193f,-23.4375f, +-66.4063f,25.8188f,-23.4375f, +-62.5f,25.458f,-23.4375f, +-58.5938f,26.5128f,-23.4375f, +-54.6875f,27.2598f,-23.4375f, +-50.7813f,28.4912f,-23.4375f, +-46.875f,31.0376f,-23.4375f, +-42.9688f,33.0941f,-23.4375f, +-39.0625f,34.4933f,-23.4375f, +-35.1563f,37.1957f,-23.4375f, +-31.25f,39.4612f,-23.4375f, +-27.3438f,41.4598f,-23.4375f, +-23.4375f,43.5893f,-23.4375f, +-19.5313f,46.8054f,-23.4375f, +-15.625f,49.4177f,-23.4375f, +-11.7188f,51.7957f,-23.4375f, +-7.8125f,53.1306f,-23.4375f, +-3.90625f,53.4872f,-23.4375f, +0.0f,53.6348f,-23.4375f, +3.90625f,54.332f,-23.4375f, +-250.0f,1.05459f,-27.3438f, +-246.094f,2.15725f,-27.3438f, +-242.188f,3.16747f,-27.3438f, +-238.281f,4.17562f,-27.3438f, +-234.375f,5.17097f,-27.3438f, +-230.469f,6.61997f,-27.3438f, +-226.563f,7.25727f,-27.3438f, +-222.656f,9.26302f,-27.3438f, +-218.75f,10.7606f,-27.3438f, +-214.844f,11.6966f,-27.3438f, +-210.938f,13.0425f,-27.3438f, +-207.031f,15.0672f,-27.3438f, +-203.125f,17.5971f,-27.3438f, +-199.219f,19.3182f,-27.3438f, +-195.313f,20.4505f,-27.3438f, +-191.406f,20.7017f,-27.3438f, +-187.5f,22.8054f,-27.3438f, +-183.594f,24.7406f,-27.3438f, +-179.688f,25.7957f,-27.3438f, +-175.781f,28.4608f,-27.3438f, +-171.875f,29.5031f,-27.3438f, +-167.969f,29.8812f,-27.3438f, +-164.063f,31.4954f,-27.3438f, +-160.156f,32.6053f,-27.3438f, +-156.25f,32.9274f,-27.3438f, +-152.344f,32.6481f,-27.3438f, +-148.438f,32.4456f,-27.3438f, +-144.531f,32.0065f,-27.3438f, +-140.625f,31.7655f,-27.3438f, +-136.719f,31.6836f,-27.3438f, +-132.813f,30.9994f,-27.3438f, +-128.906f,30.4065f,-27.3438f, +-125.0f,29.7478f,-27.3438f, +-121.094f,29.3871f,-27.3438f, +-117.188f,28.6628f,-27.3438f, +-113.281f,28.88f,-27.3438f, +-109.375f,29.3757f,-27.3438f, +-105.469f,29.7372f,-27.3438f, +-101.563f,28.9035f,-27.3438f, +-97.6563f,29.0842f,-27.3438f, +-93.75f,28.969f,-27.3438f, +-89.8438f,29.282f,-27.3438f, +-85.9375f,29.4429f,-27.3438f, +-82.0313f,29.2385f,-27.3438f, +-78.125f,28.2845f,-27.3438f, +-74.2188f,26.9413f,-27.3438f, +-70.3125f,26.3888f,-27.3438f, +-66.4063f,26.4127f,-27.3438f, +-62.5f,27.4297f,-27.3438f, +-58.5938f,28.0301f,-27.3438f, +-54.6875f,28.3682f,-27.3438f, +-50.7813f,30.4624f,-27.3438f, +-46.875f,32.6469f,-27.3438f, +-42.9688f,34.7681f,-27.3438f, +-39.0625f,37.3677f,-27.3438f, +-35.1563f,40.0943f,-27.3438f, +-31.25f,42.4424f,-27.3438f, +-27.3438f,44.5954f,-27.3438f, +-23.4375f,48.1538f,-27.3438f, +-19.5313f,50.5809f,-27.3438f, +-15.625f,52.7959f,-27.3438f, +-11.7188f,53.9779f,-27.3438f, +-7.8125f,55.2657f,-27.3438f, +-3.90625f,55.7427f,-27.3438f, +0.0f,56.6047f,-27.3438f, +3.90625f,57.5273f,-27.3438f, +-250.0f,1.91243f,-31.25f, +-246.094f,1.77508f,-31.25f, +-242.188f,2.89721f,-31.25f, +-238.281f,4.82177f,-31.25f, +-234.375f,5.57483f,-31.25f, +-230.469f,6.15697f,-31.25f, +-226.563f,7.43219f,-31.25f, +-222.656f,9.10752f,-31.25f, +-218.75f,10.7345f,-31.25f, +-214.844f,11.7298f,-31.25f, +-210.938f,13.0008f,-31.25f, +-207.031f,14.4465f,-31.25f, +-203.125f,16.7635f,-31.25f, +-199.219f,18.7095f,-31.25f, +-195.313f,19.057f,-31.25f, +-191.406f,19.522f,-31.25f, +-187.5f,21.0252f,-31.25f, +-183.594f,22.477f,-31.25f, +-179.688f,24.9456f,-31.25f, +-175.781f,27.5579f,-31.25f, +-171.875f,28.9367f,-31.25f, +-167.969f,29.5938f,-31.25f, +-164.063f,29.9491f,-31.25f, +-160.156f,31.1043f,-31.25f, +-156.25f,31.898f,-31.25f, +-152.344f,32.025f,-31.25f, +-148.438f,32.2848f,-31.25f, +-144.531f,31.4433f,-31.25f, +-140.625f,29.9423f,-31.25f, +-136.719f,30.2535f,-31.25f, +-132.813f,30.4668f,-31.25f, +-128.906f,30.1261f,-31.25f, +-125.0f,29.2612f,-31.25f, +-121.094f,27.5496f,-31.25f, +-117.188f,27.0659f,-31.25f, +-113.281f,27.3359f,-31.25f, +-109.375f,27.8418f,-31.25f, +-105.469f,28.9814f,-31.25f, +-101.563f,28.4429f,-31.25f, +-97.6563f,28.5833f,-31.25f, +-93.75f,28.9986f,-31.25f, +-89.8438f,30.3273f,-31.25f, +-85.9375f,30.5898f,-31.25f, +-82.0313f,29.8768f,-31.25f, +-78.125f,28.7278f,-31.25f, +-74.2188f,28.2599f,-31.25f, +-70.3125f,27.5942f,-31.25f, +-66.4063f,28.2721f,-31.25f, +-62.5f,28.9526f,-31.25f, +-58.5938f,29.4527f,-31.25f, +-54.6875f,30.1605f,-31.25f, +-50.7813f,32.6242f,-31.25f, +-46.875f,35.2708f,-31.25f, +-42.9688f,37.6696f,-31.25f, +-39.0625f,40.1477f,-31.25f, +-35.1563f,42.5127f,-31.25f, +-31.25f,45.655f,-31.25f, +-27.3438f,48.5747f,-31.25f, +-23.4375f,51.2069f,-31.25f, +-19.5313f,53.5599f,-31.25f, +-15.625f,55.3726f,-31.25f, +-11.7188f,56.4687f,-31.25f, +-7.8125f,56.313f,-31.25f, +-3.90625f,58.0363f,-31.25f, +0.0f,59.422f,-31.25f, +3.90625f,59.4204f,-31.25f, +-250.0f,1.80637f,-35.1563f, +-246.094f,1.14243f,-35.1563f, +-242.188f,2.08309f,-35.1563f, +-238.281f,3.66548f,-35.1563f, +-234.375f,4.49251f,-35.1563f, +-230.469f,5.63985f,-35.1563f, +-226.563f,7.33778f,-35.1563f, +-222.656f,9.15183f,-35.1563f, +-218.75f,10.0463f,-35.1563f, +-214.844f,11.7521f,-35.1563f, +-210.938f,12.6919f,-35.1563f, +-207.031f,14.0216f,-35.1563f, +-203.125f,14.9825f,-35.1563f, +-199.219f,16.2286f,-35.1563f, +-195.313f,17.2153f,-35.1563f, +-191.406f,18.0692f,-35.1563f, +-187.5f,19.858f,-35.1563f, +-183.594f,22.2715f,-35.1563f, +-179.688f,25.6457f,-35.1563f, +-175.781f,27.6627f,-35.1563f, +-171.875f,28.6491f,-35.1563f, +-167.969f,29.5869f,-35.1563f, +-164.063f,29.5582f,-35.1563f, +-160.156f,30.7619f,-35.1563f, +-156.25f,31.372f,-35.1563f, +-152.344f,31.4423f,-35.1563f, +-148.438f,31.7578f,-35.1563f, +-144.531f,31.1339f,-35.1563f, +-140.625f,29.3454f,-35.1563f, +-136.719f,28.0675f,-35.1563f, +-132.813f,28.1828f,-35.1563f, +-128.906f,28.2649f,-35.1563f, +-125.0f,27.2326f,-35.1563f, +-121.094f,26.2567f,-35.1563f, +-117.188f,25.4914f,-35.1563f, +-113.281f,25.5444f,-35.1563f, +-109.375f,25.8703f,-35.1563f, +-105.469f,27.9373f,-35.1563f, +-101.563f,27.9306f,-35.1563f, +-97.6563f,27.9282f,-35.1563f, +-93.75f,28.9199f,-35.1563f, +-89.8438f,30.142f,-35.1563f, +-85.9375f,30.3479f,-35.1563f, +-82.0313f,29.749f,-35.1563f, +-78.125f,29.2656f,-35.1563f, +-74.2188f,28.8561f,-35.1563f, +-70.3125f,28.7144f,-35.1563f, +-66.4063f,29.3204f,-35.1563f, +-62.5f,29.6751f,-35.1563f, +-58.5938f,31.0647f,-35.1563f, +-54.6875f,32.3243f,-35.1563f, +-50.7813f,34.476f,-35.1563f, +-46.875f,37.0984f,-35.1563f, +-42.9688f,40.1281f,-35.1563f, +-39.0625f,42.4472f,-35.1563f, +-35.1563f,45.6772f,-35.1563f, +-31.25f,49.5655f,-35.1563f, +-27.3438f,51.5783f,-35.1563f, +-23.4375f,53.3f,-35.1563f, +-19.5313f,55.4127f,-35.1563f, +-15.625f,56.8152f,-35.1563f, +-11.7188f,56.8985f,-35.1563f, +-7.8125f,57.5886f,-35.1563f, +-3.90625f,58.9321f,-35.1563f, +0.0f,60.2297f,-35.1563f, +3.90625f,60.2212f,-35.1563f, +-250.0f,2.59935f,-39.0625f, +-246.094f,1.55278f,-39.0625f, +-242.188f,1.42243f,-39.0625f, +-238.281f,2.78238f,-39.0625f, +-234.375f,3.85918f,-39.0625f, +-230.469f,5.01321f,-39.0625f, +-226.563f,6.56707f,-39.0625f, +-222.656f,7.99762f,-39.0625f, +-218.75f,9.72642f,-39.0625f, +-214.844f,11.975f,-39.0625f, +-210.938f,12.8008f,-39.0625f, +-207.031f,13.6902f,-39.0625f, +-203.125f,14.2017f,-39.0625f, +-199.219f,14.8784f,-39.0625f, +-195.313f,16.6265f,-39.0625f, +-191.406f,17.066f,-39.0625f, +-187.5f,19.3153f,-39.0625f, +-183.594f,23.4017f,-39.0625f, +-179.688f,26.2073f,-39.0625f, +-175.781f,27.92f,-39.0625f, +-171.875f,29.0435f,-39.0625f, +-167.969f,28.8537f,-39.0625f, +-164.063f,29.6445f,-39.0625f, +-160.156f,30.2119f,-39.0625f, +-156.25f,30.4693f,-39.0625f, +-152.344f,30.6063f,-39.0625f, +-148.438f,30.8716f,-39.0625f, +-144.531f,30.3253f,-39.0625f, +-140.625f,29.3941f,-39.0625f, +-136.719f,27.7606f,-39.0625f, +-132.813f,26.806f,-39.0625f, +-128.906f,26.6501f,-39.0625f, +-125.0f,25.6992f,-39.0625f, +-121.094f,24.4674f,-39.0625f, +-117.188f,24.1124f,-39.0625f, +-113.281f,24.9142f,-39.0625f, +-109.375f,25.5696f,-39.0625f, +-105.469f,25.4691f,-39.0625f, +-101.563f,26.7147f,-39.0625f, +-97.6563f,26.7558f,-39.0625f, +-93.75f,27.9278f,-39.0625f, +-89.8438f,29.0149f,-39.0625f, +-85.9375f,29.3557f,-39.0625f, +-82.0313f,29.6134f,-39.0625f, +-78.125f,29.4742f,-39.0625f, +-74.2188f,29.3377f,-39.0625f, +-70.3125f,29.6082f,-39.0625f, +-66.4063f,29.4634f,-39.0625f, +-62.5f,31.1775f,-39.0625f, +-58.5938f,32.7227f,-39.0625f, +-54.6875f,34.2233f,-39.0625f, +-50.7813f,36.1862f,-39.0625f, +-46.875f,38.7123f,-39.0625f, +-42.9688f,41.2396f,-39.0625f, +-39.0625f,44.5857f,-39.0625f, +-35.1563f,47.0183f,-39.0625f, +-31.25f,50.9933f,-39.0625f, +-27.3438f,53.2967f,-39.0625f, +-23.4375f,55.2026f,-39.0625f, +-19.5313f,56.3858f,-39.0625f, +-15.625f,57.8615f,-39.0625f, +-11.7188f,57.7515f,-39.0625f, +-7.8125f,58.8071f,-39.0625f, +-3.90625f,59.73f,-39.0625f, +0.0f,59.8999f,-39.0625f, +3.90625f,59.9094f,-39.0625f, +-250.0f,2.73015f,-42.9688f, +-246.094f,1.9296f,-42.9688f, +-242.188f,2.00835f,-42.9688f, +-238.281f,3.16245f,-42.9688f, +-234.375f,3.35198f,-42.9688f, +-230.469f,4.50732f,-42.9688f, +-226.563f,6.28971f,-42.9688f, +-222.656f,7.89723f,-42.9688f, +-218.75f,9.28447f,-42.9688f, +-214.844f,11.4302f,-42.9688f, +-210.938f,12.7156f,-42.9688f, +-207.031f,13.6281f,-42.9688f, +-203.125f,14.5932f,-42.9688f, +-199.219f,14.8129f,-42.9688f, +-195.313f,15.7965f,-42.9688f, +-191.406f,16.3571f,-42.9688f, +-187.5f,20.257f,-42.9688f, +-183.594f,23.2993f,-42.9688f, +-179.688f,25.4583f,-42.9688f, +-175.781f,27.2887f,-42.9688f, +-171.875f,27.9862f,-42.9688f, +-167.969f,28.274f,-42.9688f, +-164.063f,28.9264f,-42.9688f, +-160.156f,29.1855f,-42.9688f, +-156.25f,29.8898f,-42.9688f, +-152.344f,29.4922f,-42.9688f, +-148.438f,29.257f,-42.9688f, +-144.531f,28.9137f,-42.9688f, +-140.625f,27.618f,-42.9688f, +-136.719f,26.8539f,-42.9688f, +-132.813f,26.2806f,-42.9688f, +-128.906f,25.1378f,-42.9688f, +-125.0f,24.508f,-42.9688f, +-121.094f,23.8458f,-42.9688f, +-117.188f,23.501f,-42.9688f, +-113.281f,24.0593f,-42.9688f, +-109.375f,24.1366f,-42.9688f, +-105.469f,24.075f,-42.9688f, +-101.563f,24.5025f,-42.9688f, +-97.6563f,24.8457f,-42.9688f, +-93.75f,26.5028f,-42.9688f, +-89.8438f,26.9842f,-42.9688f, +-85.9375f,28.5672f,-42.9688f, +-82.0313f,28.9848f,-42.9688f, +-78.125f,29.1484f,-42.9688f, +-74.2188f,28.8735f,-42.9688f, +-70.3125f,29.9085f,-42.9688f, +-66.4063f,31.647f,-42.9688f, +-62.5f,32.8553f,-42.9688f, +-58.5938f,34.4488f,-42.9688f, +-54.6875f,35.7724f,-42.9688f, +-50.7813f,38.5181f,-42.9688f, +-46.875f,40.619f,-42.9688f, +-42.9688f,42.6158f,-42.9688f, +-39.0625f,45.9557f,-42.9688f, +-35.1563f,48.8071f,-42.9688f, +-31.25f,51.5425f,-42.9688f, +-27.3438f,54.1461f,-42.9688f, +-23.4375f,56.6935f,-42.9688f, +-19.5313f,57.353f,-42.9688f, +-15.625f,58.289f,-42.9688f, +-11.7188f,58.4633f,-42.9688f, +-7.8125f,59.0033f,-42.9688f, +-3.90625f,59.61f,-42.9688f, +0.0f,59.6115f,-42.9688f, +3.90625f,59.5207f,-42.9688f, +-250.0f,2.05499f,-46.875f, +-246.094f,1.44228f,-46.875f, +-242.188f,1.95946f,-46.875f, +-238.281f,2.50642f,-46.875f, +-234.375f,3.23732f,-46.875f, +-230.469f,4.46051f,-46.875f, +-226.563f,6.17815f,-46.875f, +-222.656f,7.58101f,-46.875f, +-218.75f,9.4063f,-46.875f, +-214.844f,11.394f,-46.875f, +-210.938f,12.4493f,-46.875f, +-207.031f,13.1281f,-46.875f, +-203.125f,13.8316f,-46.875f, +-199.219f,14.1574f,-46.875f, +-195.313f,15.0289f,-46.875f, +-191.406f,17.2095f,-46.875f, +-187.5f,20.3326f,-46.875f, +-183.594f,22.5046f,-46.875f, +-179.688f,24.7998f,-46.875f, +-175.781f,26.3728f,-46.875f, +-171.875f,27.3394f,-46.875f, +-167.969f,27.2989f,-46.875f, +-164.063f,27.5191f,-46.875f, +-160.156f,28.1581f,-46.875f, +-156.25f,28.357f,-46.875f, +-152.344f,27.2465f,-46.875f, +-148.438f,27.6591f,-46.875f, +-144.531f,26.7196f,-46.875f, +-140.625f,25.3776f,-46.875f, +-136.719f,25.1174f,-46.875f, +-132.813f,24.6913f,-46.875f, +-128.906f,23.828f,-46.875f, +-125.0f,22.7885f,-46.875f, +-121.094f,23.6316f,-46.875f, +-117.188f,23.288f,-46.875f, +-113.281f,22.8849f,-46.875f, +-109.375f,22.6367f,-46.875f, +-105.469f,22.2282f,-46.875f, +-101.563f,22.7539f,-46.875f, +-97.6563f,23.4319f,-46.875f, +-93.75f,25.0494f,-46.875f, +-89.8438f,25.7759f,-46.875f, +-85.9375f,27.2287f,-46.875f, +-82.0313f,28.1554f,-46.875f, +-78.125f,28.6794f,-46.875f, +-74.2188f,30.4763f,-46.875f, +-70.3125f,32.23f,-46.875f, +-66.4063f,33.6868f,-46.875f, +-62.5f,34.7841f,-46.875f, +-58.5938f,36.2585f,-46.875f, +-54.6875f,38.2534f,-46.875f, +-50.7813f,39.5261f,-46.875f, +-46.875f,41.7676f,-46.875f, +-42.9688f,44.8849f,-46.875f, +-39.0625f,47.6394f,-46.875f, +-35.1563f,49.5783f,-46.875f, +-31.25f,52.3871f,-46.875f, +-27.3438f,54.9333f,-46.875f, +-23.4375f,56.6705f,-46.875f, +-19.5313f,56.898f,-46.875f, +-15.625f,58.678f,-46.875f, +-11.7188f,59.6595f,-46.875f, +-7.8125f,59.0163f,-46.875f, +-3.90625f,59.3587f,-46.875f, +0.0f,58.5405f,-46.875f, +3.90625f,58.9086f,-46.875f, +-250.0f,2.57742f,-50.7813f, +-246.094f,2.06275f,-50.7813f, +-242.188f,2.26453f,-50.7813f, +-238.281f,2.43527f,-50.7813f, +-234.375f,2.63858f,-50.7813f, +-230.469f,4.44964f,-50.7813f, +-226.563f,6.50192f,-50.7813f, +-222.656f,8.11006f,-50.7813f, +-218.75f,10.1023f,-50.7813f, +-214.844f,11.3708f,-50.7813f, +-210.938f,12.7395f,-50.7813f, +-207.031f,13.6541f,-50.7813f, +-203.125f,13.6317f,-50.7813f, +-199.219f,13.4823f,-50.7813f, +-195.313f,15.3032f,-50.7813f, +-191.406f,17.5085f,-50.7813f, +-187.5f,19.5731f,-50.7813f, +-183.594f,22.0894f,-50.7813f, +-179.688f,23.8927f,-50.7813f, +-175.781f,24.9335f,-50.7813f, +-171.875f,26.1125f,-50.7813f, +-167.969f,25.9034f,-50.7813f, +-164.063f,26.9549f,-50.7813f, +-160.156f,26.7939f,-50.7813f, +-156.25f,26.3447f,-50.7813f, +-152.344f,25.6085f,-50.7813f, +-148.438f,25.2823f,-50.7813f, +-144.531f,25.4854f,-50.7813f, +-140.625f,23.906f,-50.7813f, +-136.719f,23.7094f,-50.7813f, +-132.813f,22.9599f,-50.7813f, +-128.906f,22.3089f,-50.7813f, +-125.0f,22.302f,-50.7813f, +-121.094f,23.3289f,-50.7813f, +-117.188f,23.1804f,-50.7813f, +-113.281f,22.6693f,-50.7813f, +-109.375f,21.2587f,-50.7813f, +-105.469f,20.4638f,-50.7813f, +-101.563f,21.4819f,-50.7813f, +-97.6563f,22.0137f,-50.7813f, +-93.75f,23.4763f,-50.7813f, +-89.8438f,25.2125f,-50.7813f, +-85.9375f,26.446f,-50.7813f, +-82.0313f,27.5614f,-50.7813f, +-78.125f,29.5641f,-50.7813f, +-74.2188f,31.1552f,-50.7813f, +-70.3125f,33.5337f,-50.7813f, +-66.4063f,35.653f,-50.7813f, +-62.5f,36.2419f,-50.7813f, +-58.5938f,37.4297f,-50.7813f, +-54.6875f,39.7492f,-50.7813f, +-50.7813f,41.494f,-50.7813f, +-46.875f,44.5449f,-50.7813f, +-42.9688f,47.2689f,-50.7813f, +-39.0625f,49.6705f,-50.7813f, +-35.1563f,51.8942f,-50.7813f, +-31.25f,53.9483f,-50.7813f, +-27.3438f,55.2444f,-50.7813f, +-23.4375f,56.5482f,-50.7813f, +-19.5313f,58.5545f,-50.7813f, +-15.625f,59.5559f,-50.7813f, +-11.7188f,58.8699f,-50.7813f, +-7.8125f,59.0373f,-50.7813f, +-3.90625f,59.5884f,-50.7813f, +0.0f,59.6491f,-50.7813f, +3.90625f,59.8509f,-50.7813f, +-250.0f,2.04136f,-54.6875f, +-246.094f,2.5492f,-54.6875f, +-242.188f,2.70952f,-54.6875f, +-238.281f,3.00758f,-54.6875f, +-234.375f,3.54707f,-54.6875f, +-230.469f,5.09851f,-54.6875f, +-226.563f,7.09409f,-54.6875f, +-222.656f,8.40975f,-54.6875f, +-218.75f,10.0555f,-54.6875f, +-214.844f,11.4962f,-54.6875f, +-210.938f,12.1806f,-54.6875f, +-207.031f,12.7217f,-54.6875f, +-203.125f,12.6935f,-54.6875f, +-199.219f,14.0259f,-54.6875f, +-195.313f,16.1147f,-54.6875f, +-191.406f,18.3888f,-54.6875f, +-187.5f,19.3549f,-54.6875f, +-183.594f,21.6563f,-54.6875f, +-179.688f,22.9906f,-54.6875f, +-175.781f,23.7728f,-54.6875f, +-171.875f,25.2286f,-54.6875f, +-167.969f,26.0764f,-54.6875f, +-164.063f,26.746f,-54.6875f, +-160.156f,26.3029f,-54.6875f, +-156.25f,25.6172f,-54.6875f, +-152.344f,24.537f,-54.6875f, +-148.438f,23.8458f,-54.6875f, +-144.531f,23.3726f,-54.6875f, +-140.625f,22.8694f,-54.6875f, +-136.719f,22.5247f,-54.6875f, +-132.813f,21.436f,-54.6875f, +-128.906f,21.4712f,-54.6875f, +-125.0f,22.1621f,-54.6875f, +-121.094f,22.4599f,-54.6875f, +-117.188f,21.4148f,-54.6875f, +-113.281f,20.8237f,-54.6875f, +-109.375f,19.6257f,-54.6875f, +-105.469f,20.1462f,-54.6875f, +-101.563f,21.5895f,-54.6875f, +-97.6563f,22.2376f,-54.6875f, +-93.75f,23.679f,-54.6875f, +-89.8438f,24.9403f,-54.6875f, +-85.9375f,26.4205f,-54.6875f, +-82.0313f,27.9125f,-54.6875f, +-78.125f,30.0689f,-54.6875f, +-74.2188f,32.7388f,-54.6875f, +-70.3125f,34.3502f,-54.6875f, +-66.4063f,35.6763f,-54.6875f, +-62.5f,37.4625f,-54.6875f, +-58.5938f,38.3448f,-54.6875f, +-54.6875f,40.6027f,-54.6875f, +-50.7813f,44.4532f,-54.6875f, +-46.875f,47.6182f,-54.6875f, +-42.9688f,49.7683f,-54.6875f, +-39.0625f,52.1875f,-54.6875f, +-35.1563f,54.4951f,-54.6875f, +-31.25f,55.9437f,-54.6875f, +-27.3438f,57.1353f,-54.6875f, +-23.4375f,58.016f,-54.6875f, +-19.5313f,59.6013f,-54.6875f, +-15.625f,59.9872f,-54.6875f, +-11.7188f,59.8299f,-54.6875f, +-7.8125f,60.1035f,-54.6875f, +-3.90625f,60.8558f,-54.6875f, +0.0f,60.5619f,-54.6875f, +3.90625f,60.3928f,-54.6875f, +-250.0f,4.01167f,-58.5938f, +-246.094f,3.0694f,-58.5938f, +-242.188f,3.37661f,-58.5938f, +-238.281f,3.71931f,-58.5938f, +-234.375f,4.08816f,-58.5938f, +-230.469f,5.56386f,-58.5938f, +-226.563f,7.3314f,-58.5938f, +-222.656f,8.61323f,-58.5938f, +-218.75f,9.77849f,-58.5938f, +-214.844f,11.9744f,-58.5938f, +-210.938f,12.9366f,-58.5938f, +-207.031f,13.5175f,-58.5938f, +-203.125f,13.948f,-58.5938f, +-199.219f,14.4053f,-58.5938f, +-195.313f,16.1496f,-58.5938f, +-191.406f,17.8653f,-58.5938f, +-187.5f,18.9853f,-58.5938f, +-183.594f,21.2985f,-58.5938f, +-179.688f,23.4932f,-58.5938f, +-175.781f,25.3544f,-58.5938f, +-171.875f,26.1087f,-58.5938f, +-167.969f,26.5864f,-58.5938f, +-164.063f,25.8729f,-58.5938f, +-160.156f,25.0068f,-58.5938f, +-156.25f,25.2867f,-58.5938f, +-152.344f,23.9482f,-58.5938f, +-148.438f,23.23f,-58.5938f, +-144.531f,22.6171f,-58.5938f, +-140.625f,21.4991f,-58.5938f, +-136.719f,21.0822f,-58.5938f, +-132.813f,21.0037f,-58.5938f, +-128.906f,21.8362f,-58.5938f, +-125.0f,21.5985f,-58.5938f, +-121.094f,20.951f,-58.5938f, +-117.188f,21.2066f,-58.5938f, +-113.281f,19.7479f,-58.5938f, +-109.375f,18.5787f,-58.5938f, +-105.469f,20.3984f,-58.5938f, +-101.563f,22.257f,-58.5938f, +-97.6563f,23.3411f,-58.5938f, +-93.75f,24.362f,-58.5938f, +-89.8438f,25.7544f,-58.5938f, +-85.9375f,27.7522f,-58.5938f, +-82.0313f,28.9204f,-58.5938f, +-78.125f,30.8124f,-58.5938f, +-74.2188f,32.9097f,-58.5938f, +-70.3125f,34.8737f,-58.5938f, +-66.4063f,36.0518f,-58.5938f, +-62.5f,38.506f,-58.5938f, +-58.5938f,41.2951f,-58.5938f, +-54.6875f,43.3387f,-58.5938f, +-50.7813f,46.5457f,-58.5938f, +-46.875f,49.2409f,-58.5938f, +-42.9688f,51.3946f,-58.5938f, +-39.0625f,54.0957f,-58.5938f, +-35.1563f,55.8205f,-58.5938f, +-31.25f,57.094f,-58.5938f, +-27.3438f,58.0636f,-58.5938f, +-23.4375f,58.8159f,-58.5938f, +-19.5313f,59.9761f,-58.5938f, +-15.625f,60.2094f,-58.5938f, +-11.7188f,60.0275f,-58.5938f, +-7.8125f,61.0991f,-58.5938f, +-3.90625f,61.4786f,-58.5938f, +0.0f,61.4895f,-58.5938f, +3.90625f,61.5747f,-58.5938f, +-250.0f,5.54938f,-62.5f, +-246.094f,4.18374f,-62.5f, +-242.188f,3.90057f,-62.5f, +-238.281f,4.25951f,-62.5f, +-234.375f,4.82365f,-62.5f, +-230.469f,6.03197f,-62.5f, +-226.563f,7.69909f,-62.5f, +-222.656f,8.80826f,-62.5f, +-218.75f,10.8241f,-62.5f, +-214.844f,13.5771f,-62.5f, +-210.938f,14.456f,-62.5f, +-207.031f,15.0395f,-62.5f, +-203.125f,14.5505f,-62.5f, +-199.219f,16.1706f,-62.5f, +-195.313f,16.9508f,-62.5f, +-191.406f,18.2016f,-62.5f, +-187.5f,19.8694f,-62.5f, +-183.594f,22.6167f,-62.5f, +-179.688f,24.5727f,-62.5f, +-175.781f,26.0063f,-62.5f, +-171.875f,26.0399f,-62.5f, +-167.969f,26.6416f,-62.5f, +-164.063f,25.6476f,-62.5f, +-160.156f,24.4615f,-62.5f, +-156.25f,23.5295f,-62.5f, +-152.344f,23.7879f,-62.5f, +-148.438f,22.8826f,-62.5f, +-144.531f,21.6558f,-62.5f, +-140.625f,20.6405f,-62.5f, +-136.719f,20.1695f,-62.5f, +-132.813f,20.7715f,-62.5f, +-128.906f,20.5918f,-62.5f, +-125.0f,20.4476f,-62.5f, +-121.094f,19.9068f,-62.5f, +-117.188f,19.4838f,-62.5f, +-113.281f,17.843f,-62.5f, +-109.375f,18.5661f,-62.5f, +-105.469f,20.1106f,-62.5f, +-101.563f,21.3182f,-62.5f, +-97.6563f,23.2851f,-62.5f, +-93.75f,24.3601f,-62.5f, +-89.8438f,26.3742f,-62.5f, +-85.9375f,27.7409f,-62.5f, +-82.0313f,29.533f,-62.5f, +-78.125f,31.5622f,-62.5f, +-74.2188f,33.2773f,-62.5f, +-70.3125f,35.6025f,-62.5f, +-66.4063f,38.4255f,-62.5f, +-62.5f,40.916f,-62.5f, +-58.5938f,43.9378f,-62.5f, +-54.6875f,45.9116f,-62.5f, +-50.7813f,48.3177f,-62.5f, +-46.875f,50.1977f,-62.5f, +-42.9688f,52.4552f,-62.5f, +-39.0625f,54.6779f,-62.5f, +-35.1563f,56.1564f,-62.5f, +-31.25f,57.5665f,-62.5f, +-27.3438f,58.7762f,-62.5f, +-23.4375f,59.115f,-62.5f, +-19.5313f,58.5535f,-62.5f, +-15.625f,58.2117f,-62.5f, +-11.7188f,59.0863f,-62.5f, +-7.8125f,60.3775f,-62.5f, +-3.90625f,61.0192f,-62.5f, +0.0f,61.864f,-62.5f, +3.90625f,62.1111f,-62.5f, +-250.0f,6.08003f,-66.4063f, +-246.094f,5.13458f,-66.4063f, +-242.188f,5.0967f,-66.4063f, +-238.281f,5.36926f,-66.4063f, +-234.375f,5.21926f,-66.4063f, +-230.469f,6.37997f,-66.4063f, +-226.563f,7.85032f,-66.4063f, +-222.656f,9.36117f,-66.4063f, +-218.75f,11.896f,-66.4063f, +-214.844f,13.9549f,-66.4063f, +-210.938f,15.4673f,-66.4063f, +-207.031f,15.9885f,-66.4063f, +-203.125f,16.4425f,-66.4063f, +-199.219f,17.4253f,-66.4063f, +-195.313f,18.1385f,-66.4063f, +-191.406f,18.8676f,-66.4063f, +-187.5f,20.1316f,-66.4063f, +-183.594f,22.8534f,-66.4063f, +-179.688f,24.5364f,-66.4063f, +-175.781f,25.6234f,-66.4063f, +-171.875f,25.9362f,-66.4063f, +-167.969f,25.7735f,-66.4063f, +-164.063f,25.1524f,-66.4063f, +-160.156f,24.4245f,-66.4063f, +-156.25f,22.8769f,-66.4063f, +-152.344f,22.8762f,-66.4063f, +-148.438f,21.9008f,-66.4063f, +-144.531f,20.9242f,-66.4063f, +-140.625f,20.1022f,-66.4063f, +-136.719f,19.5823f,-66.4063f, +-132.813f,19.4415f,-66.4063f, +-128.906f,18.9513f,-66.4063f, +-125.0f,18.9264f,-66.4063f, +-121.094f,18.6878f,-66.4063f, +-117.188f,17.8998f,-66.4063f, +-113.281f,17.9815f,-66.4063f, +-109.375f,18.2652f,-66.4063f, +-105.469f,19.533f,-66.4063f, +-101.563f,21.0045f,-66.4063f, +-97.6563f,22.2461f,-66.4063f, +-93.75f,23.7189f,-66.4063f, +-89.8438f,25.574f,-66.4063f, +-85.9375f,27.55f,-66.4063f, +-82.0313f,29.733f,-66.4063f, +-78.125f,31.0763f,-66.4063f, +-74.2188f,33.9607f,-66.4063f, +-70.3125f,37.3595f,-66.4063f, +-66.4063f,41.019f,-66.4063f, +-62.5f,43.7286f,-66.4063f, +-58.5938f,46.5077f,-66.4063f, +-54.6875f,47.985f,-66.4063f, +-50.7813f,49.2623f,-66.4063f, +-46.875f,50.9465f,-66.4063f, +-42.9688f,52.912f,-66.4063f, +-39.0625f,55.0349f,-66.4063f, +-35.1563f,56.428f,-66.4063f, +-31.25f,57.3951f,-66.4063f, +-27.3438f,58.5332f,-66.4063f, +-23.4375f,58.3328f,-66.4063f, +-19.5313f,56.9549f,-66.4063f, +-15.625f,56.9387f,-66.4063f, +-11.7188f,58.3656f,-66.4063f, +-7.8125f,59.6577f,-66.4063f, +-3.90625f,59.8566f,-66.4063f, +0.0f,60.693f,-66.4063f, +3.90625f,60.8569f,-66.4063f, +-250.0f,6.38861f,-70.3125f, +-246.094f,6.37976f,-70.3125f, +-242.188f,6.52455f,-70.3125f, +-238.281f,6.93657f,-70.3125f, +-234.375f,6.77321f,-70.3125f, +-230.469f,7.26034f,-70.3125f, +-226.563f,8.99316f,-70.3125f, +-222.656f,10.5015f,-70.3125f, +-218.75f,11.631f,-70.3125f, +-214.844f,14.0548f,-70.3125f, +-210.938f,15.9163f,-70.3125f, +-207.031f,16.6824f,-70.3125f, +-203.125f,17.1063f,-70.3125f, +-199.219f,18.066f,-70.3125f, +-195.313f,18.5539f,-70.3125f, +-191.406f,18.8425f,-70.3125f, +-187.5f,20.7731f,-70.3125f, +-183.594f,22.8929f,-70.3125f, +-179.688f,24.2011f,-70.3125f, +-175.781f,24.5512f,-70.3125f, +-171.875f,24.651f,-70.3125f, +-167.969f,23.9906f,-70.3125f, +-164.063f,23.6279f,-70.3125f, +-160.156f,23.6162f,-70.3125f, +-156.25f,22.3196f,-70.3125f, +-152.344f,22.173f,-70.3125f, +-148.438f,20.6833f,-70.3125f, +-144.531f,19.6848f,-70.3125f, +-140.625f,18.4633f,-70.3125f, +-136.719f,18.2692f,-70.3125f, +-132.813f,18.0595f,-70.3125f, +-128.906f,17.2062f,-70.3125f, +-125.0f,17.0103f,-70.3125f, +-121.094f,17.1584f,-70.3125f, +-117.188f,17.5441f,-70.3125f, +-113.281f,17.5669f,-70.3125f, +-109.375f,17.7536f,-70.3125f, +-105.469f,18.3913f,-70.3125f, +-101.563f,19.7264f,-70.3125f, +-97.6563f,20.8943f,-70.3125f, +-93.75f,22.7517f,-70.3125f, +-89.8438f,25.1479f,-70.3125f, +-85.9375f,27.3953f,-70.3125f, +-82.0313f,29.5127f,-70.3125f, +-78.125f,31.2816f,-70.3125f, +-74.2188f,34.6589f,-70.3125f, +-70.3125f,38.2161f,-70.3125f, +-66.4063f,42.3872f,-70.3125f, +-62.5f,45.4363f,-70.3125f, +-58.5938f,47.0181f,-70.3125f, +-54.6875f,48.7348f,-70.3125f, +-50.7813f,49.8739f,-70.3125f, +-46.875f,51.2434f,-70.3125f, +-42.9688f,52.9444f,-70.3125f, +-39.0625f,54.8413f,-70.3125f, +-35.1563f,55.8776f,-70.3125f, +-31.25f,56.9088f,-70.3125f, +-27.3438f,56.8827f,-70.3125f, +-23.4375f,56.1649f,-70.3125f, +-19.5313f,54.9828f,-70.3125f, +-15.625f,56.5543f,-70.3125f, +-11.7188f,58.0071f,-70.3125f, +-7.8125f,58.1204f,-70.3125f, +-3.90625f,58.8019f,-70.3125f, +0.0f,59.3765f,-70.3125f, +3.90625f,59.1482f,-70.3125f, +-250.0f,7.29753f,-74.2188f, +-246.094f,6.9318f,-74.2188f, +-242.188f,7.9493f,-74.2188f, +-238.281f,7.61482f,-74.2188f, +-234.375f,8.38948f,-74.2188f, +-230.469f,8.85034f,-74.2188f, +-226.563f,10.783f,-74.2188f, +-222.656f,12.203f,-74.2188f, +-218.75f,12.7122f,-74.2188f, +-214.844f,14.2813f,-74.2188f, +-210.938f,16.1159f,-74.2188f, +-207.031f,16.8501f,-74.2188f, +-203.125f,17.728f,-74.2188f, +-199.219f,18.6948f,-74.2188f, +-195.313f,19.0254f,-74.2188f, +-191.406f,18.9874f,-74.2188f, +-187.5f,20.7575f,-74.2188f, +-183.594f,22.4682f,-74.2188f, +-179.688f,23.785f,-74.2188f, +-175.781f,23.136f,-74.2188f, +-171.875f,22.2872f,-74.2188f, +-167.969f,21.9381f,-74.2188f, +-164.063f,22.818f,-74.2188f, +-160.156f,21.8019f,-74.2188f, +-156.25f,21.3496f,-74.2188f, +-152.344f,19.9092f,-74.2188f, +-148.438f,19.5338f,-74.2188f, +-144.531f,19.2227f,-74.2188f, +-140.625f,17.2583f,-74.2188f, +-136.719f,15.7727f,-74.2188f, +-132.813f,15.2069f,-74.2188f, +-128.906f,15.0929f,-74.2188f, +-125.0f,15.3066f,-74.2188f, +-121.094f,15.1161f,-74.2188f, +-117.188f,16.1171f,-74.2188f, +-113.281f,17.2851f,-74.2188f, +-109.375f,16.8359f,-74.2188f, +-105.469f,17.6612f,-74.2188f, +-101.563f,18.1651f,-74.2188f, +-97.6563f,18.9354f,-74.2188f, +-93.75f,21.1152f,-74.2188f, +-89.8438f,23.9267f,-74.2188f, +-85.9375f,26.5361f,-74.2188f, +-82.0313f,29.6007f,-74.2188f, +-78.125f,31.8355f,-74.2188f, +-74.2188f,34.5711f,-74.2188f, +-70.3125f,37.6211f,-74.2188f, +-66.4063f,41.978f,-74.2188f, +-62.5f,44.757f,-74.2188f, +-58.5938f,47.2561f,-74.2188f, +-54.6875f,48.796f,-74.2188f, +-50.7813f,50.085f,-74.2188f, +-46.875f,51.427f,-74.2188f, +-42.9688f,52.9103f,-74.2188f, +-39.0625f,53.6345f,-74.2188f, +-35.1563f,55.5589f,-74.2188f, +-31.25f,56.4557f,-74.2188f, +-27.3438f,55.8259f,-74.2188f, +-23.4375f,55.2472f,-74.2188f, +-19.5313f,54.9161f,-74.2188f, +-15.625f,56.2403f,-74.2188f, +-11.7188f,57.7266f,-74.2188f, +-7.8125f,57.6855f,-74.2188f, +-3.90625f,57.4796f,-74.2188f, +0.0f,56.3955f,-74.2188f, +3.90625f,56.5167f,-74.2188f, +-250.0f,8.88618f,-78.125f, +-246.094f,8.31776f,-78.125f, +-242.188f,8.67289f,-78.125f, +-238.281f,9.52219f,-78.125f, +-234.375f,9.78196f,-78.125f, +-230.469f,11.3032f,-78.125f, +-226.563f,13.1558f,-78.125f, +-222.656f,14.4361f,-78.125f, +-218.75f,15.5721f,-78.125f, +-214.844f,14.3491f,-78.125f, +-210.938f,15.6393f,-78.125f, +-207.031f,16.9133f,-78.125f, +-203.125f,18.1402f,-78.125f, +-199.219f,19.179f,-78.125f, +-195.313f,18.9448f,-78.125f, +-191.406f,19.5289f,-78.125f, +-187.5f,20.8547f,-78.125f, +-183.594f,22.7611f,-78.125f, +-179.688f,22.8314f,-78.125f, +-175.781f,21.815f,-78.125f, +-171.875f,22.2112f,-78.125f, +-167.969f,21.9322f,-78.125f, +-164.063f,21.3024f,-78.125f, +-160.156f,20.354f,-78.125f, +-156.25f,19.8588f,-78.125f, +-152.344f,17.8458f,-78.125f, +-148.438f,18.0613f,-78.125f, +-144.531f,17.0664f,-78.125f, +-140.625f,16.2256f,-78.125f, +-136.719f,14.3082f,-78.125f, +-132.813f,13.3463f,-78.125f, +-128.906f,14.3881f,-78.125f, +-125.0f,14.6865f,-78.125f, +-121.094f,14.2011f,-78.125f, +-117.188f,15.4562f,-78.125f, +-113.281f,16.6171f,-78.125f, +-109.375f,16.2869f,-78.125f, +-105.469f,15.9406f,-78.125f, +-101.563f,17.5579f,-78.125f, +-97.6563f,19.157f,-78.125f, +-93.75f,21.0678f,-78.125f, +-89.8438f,23.1633f,-78.125f, +-85.9375f,25.2991f,-78.125f, +-82.0313f,28.9462f,-78.125f, +-78.125f,31.8594f,-78.125f, +-74.2188f,35.2294f,-78.125f, +-70.3125f,36.9557f,-78.125f, +-66.4063f,40.692f,-78.125f, +-62.5f,44.5904f,-78.125f, +-58.5938f,46.9805f,-78.125f, +-54.6875f,48.3073f,-78.125f, +-50.7813f,49.8001f,-78.125f, +-46.875f,51.4881f,-78.125f, +-42.9688f,52.7488f,-78.125f, +-39.0625f,53.0994f,-78.125f, +-35.1563f,54.6505f,-78.125f, +-31.25f,55.3393f,-78.125f, +-27.3438f,55.3608f,-78.125f, +-23.4375f,54.3833f,-78.125f, +-19.5313f,53.9595f,-78.125f, +-15.625f,55.0695f,-78.125f, +-11.7188f,56.423f,-78.125f, +-7.8125f,56.1568f,-78.125f, +-3.90625f,56.2841f,-78.125f, +0.0f,54.7508f,-78.125f, +3.90625f,54.4402f,-78.125f, +-250.0f,10.7839f,-82.0313f, +-246.094f,10.1255f,-82.0313f, +-242.188f,10.6621f,-82.0313f, +-238.281f,11.4172f,-82.0313f, +-234.375f,12.3063f,-82.0313f, +-230.469f,13.4915f,-82.0313f, +-226.563f,14.9113f,-82.0313f, +-222.656f,16.5463f,-82.0313f, +-218.75f,17.3752f,-82.0313f, +-214.844f,16.6701f,-82.0313f, +-210.938f,15.5847f,-82.0313f, +-207.031f,16.6988f,-82.0313f, +-203.125f,17.6449f,-82.0313f, +-199.219f,18.4976f,-82.0313f, +-195.313f,18.033f,-82.0313f, +-191.406f,19.1758f,-82.0313f, +-187.5f,20.7116f,-82.0313f, +-183.594f,21.5492f,-82.0313f, +-179.688f,20.7908f,-82.0313f, +-175.781f,20.6891f,-82.0313f, +-171.875f,21.6368f,-82.0313f, +-167.969f,21.6862f,-82.0313f, +-164.063f,20.4236f,-82.0313f, +-160.156f,19.4449f,-82.0313f, +-156.25f,17.8718f,-82.0313f, +-152.344f,16.0984f,-82.0313f, +-148.438f,16.1225f,-82.0313f, +-144.531f,15.3001f,-82.0313f, +-140.625f,14.0113f,-82.0313f, +-136.719f,12.7128f,-82.0313f, +-132.813f,13.1695f,-82.0313f, +-128.906f,14.1608f,-82.0313f, +-125.0f,14.006f,-82.0313f, +-121.094f,13.5671f,-82.0313f, +-117.188f,14.799f,-82.0313f, +-113.281f,15.6819f,-82.0313f, +-109.375f,15.1047f,-82.0313f, +-105.469f,15.4826f,-82.0313f, +-101.563f,17.2178f,-82.0313f, +-97.6563f,19.1794f,-82.0313f, +-93.75f,21.3021f,-82.0313f, +-89.8438f,21.9981f,-82.0313f, +-85.9375f,24.4031f,-82.0313f, +-82.0313f,28.8062f,-82.0313f, +-78.125f,31.7576f,-82.0313f, +-74.2188f,34.6198f,-82.0313f, +-70.3125f,37.0145f,-82.0313f, +-66.4063f,39.5952f,-82.0313f, +-62.5f,43.4294f,-82.0313f, +-58.5938f,45.9611f,-82.0313f, +-54.6875f,47.398f,-82.0313f, +-50.7813f,49.5672f,-82.0313f, +-46.875f,51.4863f,-82.0313f, +-42.9688f,52.3277f,-82.0313f, +-39.0625f,52.6736f,-82.0313f, +-35.1563f,53.5554f,-82.0313f, +-31.25f,54.4611f,-82.0313f, +-27.3438f,53.3151f,-82.0313f, +-23.4375f,52.9631f,-82.0313f, +-19.5313f,52.3147f,-82.0313f, +-15.625f,53.7891f,-82.0313f, +-11.7188f,54.3962f,-82.0313f, +-7.8125f,54.2326f,-82.0313f, +-3.90625f,53.6717f,-82.0313f, +0.0f,52.8681f,-82.0313f, +3.90625f,51.949f,-82.0313f, +-250.0f,12.2756f,-85.9375f, +-246.094f,11.9011f,-85.9375f, +-242.188f,13.4495f,-85.9375f, +-238.281f,14.3858f,-85.9375f, +-234.375f,14.855f,-85.9375f, +-230.469f,15.3384f,-85.9375f, +-226.563f,17.3357f,-85.9375f, +-222.656f,18.7108f,-85.9375f, +-218.75f,18.0095f,-85.9375f, +-214.844f,17.4308f,-85.9375f, +-210.938f,17.0565f,-85.9375f, +-207.031f,16.4039f,-85.9375f, +-203.125f,17.3449f,-85.9375f, +-199.219f,17.5816f,-85.9375f, +-195.313f,17.7511f,-85.9375f, +-191.406f,18.792f,-85.9375f, +-187.5f,19.7983f,-85.9375f, +-183.594f,19.6069f,-85.9375f, +-179.688f,19.1396f,-85.9375f, +-175.781f,19.0184f,-85.9375f, +-171.875f,19.7492f,-85.9375f, +-167.969f,19.6428f,-85.9375f, +-164.063f,18.6091f,-85.9375f, +-160.156f,18.1998f,-85.9375f, +-156.25f,16.6809f,-85.9375f, +-152.344f,15.0269f,-85.9375f, +-148.438f,13.3773f,-85.9375f, +-144.531f,12.7371f,-85.9375f, +-140.625f,12.2537f,-85.9375f, +-136.719f,12.6536f,-85.9375f, +-132.813f,12.7798f,-85.9375f, +-128.906f,13.2089f,-85.9375f, +-125.0f,12.8356f,-85.9375f, +-121.094f,12.5484f,-85.9375f, +-117.188f,13.5275f,-85.9375f, +-113.281f,13.5387f,-85.9375f, +-109.375f,13.6111f,-85.9375f, +-105.469f,14.7023f,-85.9375f, +-101.563f,16.6526f,-85.9375f, +-97.6563f,17.9729f,-85.9375f, +-93.75f,19.8258f,-85.9375f, +-89.8438f,21.7903f,-85.9375f, +-85.9375f,23.4003f,-85.9375f, +-82.0313f,27.4381f,-85.9375f, +-78.125f,30.1644f,-85.9375f, +-74.2188f,33.7682f,-85.9375f, +-70.3125f,36.1779f,-85.9375f, +-66.4063f,38.1368f,-85.9375f, +-62.5f,41.5768f,-85.9375f, +-58.5938f,43.7832f,-85.9375f, +-54.6875f,45.866f,-85.9375f, +-50.7813f,48.5751f,-85.9375f, +-46.875f,50.4188f,-85.9375f, +-42.9688f,51.0239f,-85.9375f, +-39.0625f,51.2389f,-85.9375f, +-35.1563f,51.8865f,-85.9375f, +-31.25f,52.9036f,-85.9375f, +-27.3438f,52.5405f,-85.9375f, +-23.4375f,52.3296f,-85.9375f, +-19.5313f,52.5889f,-85.9375f, +-15.625f,52.3033f,-85.9375f, +-11.7188f,52.1239f,-85.9375f, +-7.8125f,52.0608f,-85.9375f, +-3.90625f,51.0213f,-85.9375f, +0.0f,50.5601f,-85.9375f, +3.90625f,50.007f,-85.9375f, +-250.0f,13.6424f,-89.8438f, +-246.094f,14.2919f,-89.8438f, +-242.188f,15.9647f,-89.8438f, +-238.281f,17.1274f,-89.8438f, +-234.375f,17.9206f,-89.8438f, +-230.469f,17.9917f,-89.8438f, +-226.563f,19.3423f,-89.8438f, +-222.656f,20.1401f,-89.8438f, +-218.75f,19.295f,-89.8438f, +-214.844f,18.1101f,-89.8438f, +-210.938f,17.3485f,-89.8438f, +-207.031f,17.1077f,-89.8438f, +-203.125f,17.7413f,-89.8438f, +-199.219f,17.2325f,-89.8438f, +-195.313f,17.6696f,-89.8438f, +-191.406f,18.8437f,-89.8438f, +-187.5f,19.1808f,-89.8438f, +-183.594f,18.6366f,-89.8438f, +-179.688f,17.3251f,-89.8438f, +-175.781f,17.5752f,-89.8438f, +-171.875f,18.1005f,-89.8438f, +-167.969f,18.0907f,-89.8438f, +-164.063f,16.519f,-89.8438f, +-160.156f,15.5225f,-89.8438f, +-156.25f,14.3937f,-89.8438f, +-152.344f,13.4199f,-89.8438f, +-148.438f,12.8584f,-89.8438f, +-144.531f,12.8604f,-89.8438f, +-140.625f,12.2817f,-89.8438f, +-136.719f,12.4113f,-89.8438f, +-132.813f,12.9949f,-89.8438f, +-128.906f,11.9716f,-89.8438f, +-125.0f,11.8348f,-89.8438f, +-121.094f,12.2532f,-89.8438f, +-117.188f,12.5983f,-89.8438f, +-113.281f,13.2095f,-89.8438f, +-109.375f,13.7209f,-89.8438f, +-105.469f,13.8655f,-89.8438f, +-101.563f,14.8679f,-89.8438f, +-97.6563f,16.1039f,-89.8438f, +-93.75f,17.9997f,-89.8438f, +-89.8438f,20.0247f,-89.8438f, +-85.9375f,22.8012f,-89.8438f, +-82.0313f,25.8255f,-89.8438f, +-78.125f,29.0288f,-89.8438f, +-74.2188f,31.8325f,-89.8438f, +-70.3125f,34.2688f,-89.8438f, +-66.4063f,37.2576f,-89.8438f, +-62.5f,40.8036f,-89.8438f, +-58.5938f,43.0354f,-89.8438f, +-54.6875f,44.5176f,-89.8438f, +-50.7813f,47.4827f,-89.8438f, +-46.875f,48.9307f,-89.8438f, +-42.9688f,48.82f,-89.8438f, +-39.0625f,48.8887f,-89.8438f, +-35.1563f,50.05f,-89.8438f, +-31.25f,50.9253f,-89.8438f, +-27.3438f,52.3859f,-89.8438f, +-23.4375f,52.2702f,-89.8438f, +-19.5313f,52.0708f,-89.8438f, +-15.625f,51.2832f,-89.8438f, +-11.7188f,50.0989f,-89.8438f, +-7.8125f,49.6111f,-89.8438f, +-3.90625f,48.7785f,-89.8438f, +0.0f,48.7183f,-89.8438f, +3.90625f,47.6596f,-89.8438f, +-250.0f,15.247f,-93.75f, +-246.094f,17.6018f,-93.75f, +-242.188f,19.2494f,-93.75f, +-238.281f,20.8362f,-93.75f, +-234.375f,20.4345f,-93.75f, +-230.469f,21.1572f,-93.75f, +-226.563f,21.3131f,-93.75f, +-222.656f,20.8797f,-93.75f, +-218.75f,20.5347f,-93.75f, +-214.844f,19.3559f,-93.75f, +-210.938f,18.2443f,-93.75f, +-207.031f,17.5994f,-93.75f, +-203.125f,18.0336f,-93.75f, +-199.219f,18.0561f,-93.75f, +-195.313f,17.673f,-93.75f, +-191.406f,18.7132f,-93.75f, +-187.5f,18.4272f,-93.75f, +-183.594f,18.078f,-93.75f, +-179.688f,16.7984f,-93.75f, +-175.781f,16.1827f,-93.75f, +-171.875f,16.5937f,-93.75f, +-167.969f,16.0698f,-93.75f, +-164.063f,14.9813f,-93.75f, +-160.156f,13.1718f,-93.75f, +-156.25f,12.1738f,-93.75f, +-152.344f,12.229f,-93.75f, +-148.438f,12.2803f,-93.75f, +-144.531f,12.526f,-93.75f, +-140.625f,11.9028f,-93.75f, +-136.719f,12.3491f,-93.75f, +-132.813f,11.7412f,-93.75f, +-128.906f,11.5455f,-93.75f, +-125.0f,11.6285f,-93.75f, +-121.094f,11.478f,-93.75f, +-117.188f,11.536f,-93.75f, +-113.281f,11.8722f,-93.75f, +-109.375f,12.61f,-93.75f, +-105.469f,12.6899f,-93.75f, +-101.563f,13.1659f,-93.75f, +-97.6563f,14.5994f,-93.75f, +-93.75f,16.6015f,-93.75f, +-89.8438f,19.9429f,-93.75f, +-85.9375f,22.8876f,-93.75f, +-82.0313f,26.3209f,-93.75f, +-78.125f,28.8526f,-93.75f, +-74.2188f,30.2969f,-93.75f, +-70.3125f,33.1597f,-93.75f, +-66.4063f,36.2648f,-93.75f, +-62.5f,39.1918f,-93.75f, +-58.5938f,41.4171f,-93.75f, +-54.6875f,43.4299f,-93.75f, +-50.7813f,45.5438f,-93.75f, +-46.875f,46.6281f,-93.75f, +-42.9688f,46.784f,-93.75f, +-39.0625f,47.3415f,-93.75f, +-35.1563f,48.5539f,-93.75f, +-31.25f,50.5714f,-93.75f, +-27.3438f,51.0532f,-93.75f, +-23.4375f,51.7685f,-93.75f, +-19.5313f,51.3638f,-93.75f, +-15.625f,49.6289f,-93.75f, +-11.7188f,50.0322f,-93.75f, +-7.8125f,48.6289f,-93.75f, +-3.90625f,46.7733f,-93.75f, +0.0f,45.5993f,-93.75f, +3.90625f,45.4182f,-93.75f, +-250.0f,18.5038f,-97.6563f, +-246.094f,20.1199f,-97.6563f, +-242.188f,22.7365f,-97.6563f, +-238.281f,24.311f,-97.6563f, +-234.375f,24.2572f,-97.6563f, +-230.469f,24.3322f,-97.6563f, +-226.563f,24.3501f,-97.6563f, +-222.656f,23.3494f,-97.6563f, +-218.75f,21.7677f,-97.6563f, +-214.844f,20.6573f,-97.6563f, +-210.938f,18.8509f,-97.6563f, +-207.031f,18.1355f,-97.6563f, +-203.125f,18.5785f,-97.6563f, +-199.219f,18.2049f,-97.6563f, +-195.313f,17.4136f,-97.6563f, +-191.406f,18.6105f,-97.6563f, +-187.5f,18.0859f,-97.6563f, +-183.594f,17.3286f,-97.6563f, +-179.688f,16.66f,-97.6563f, +-175.781f,15.1619f,-97.6563f, +-171.875f,14.271f,-97.6563f, +-167.969f,13.4801f,-97.6563f, +-164.063f,12.6373f,-97.6563f, +-160.156f,11.4464f,-97.6563f, +-156.25f,11.5423f,-97.6563f, +-152.344f,11.795f,-97.6563f, +-148.438f,10.9108f,-97.6563f, +-144.531f,11.2217f,-97.6563f, +-140.625f,11.0533f,-97.6563f, +-136.719f,11.5512f,-97.6563f, +-132.813f,11.6628f,-97.6563f, +-128.906f,10.9589f,-97.6563f, +-125.0f,10.3779f,-97.6563f, +-121.094f,9.96294f,-97.6563f, +-117.188f,10.6728f,-97.6563f, +-113.281f,11.2587f,-97.6563f, +-109.375f,11.2512f,-97.6563f, +-105.469f,12.1215f,-97.6563f, +-101.563f,12.0908f,-97.6563f, +-97.6563f,13.5835f,-97.6563f, +-93.75f,16.6536f,-97.6563f, +-89.8438f,19.7104f,-97.6563f, +-85.9375f,22.8325f,-97.6563f, +-82.0313f,26.7422f,-97.6563f, +-78.125f,29.4762f,-97.6563f, +-74.2188f,30.148f,-97.6563f, +-70.3125f,33.5961f,-97.6563f, +-66.4063f,36.1685f,-97.6563f, +-62.5f,37.3648f,-97.6563f, +-58.5938f,39.4445f,-97.6563f, +-54.6875f,40.3698f,-97.6563f, +-50.7813f,43.2595f,-97.6563f, +-46.875f,43.8006f,-97.6563f, +-42.9688f,44.8371f,-97.6563f, +-39.0625f,46.8993f,-97.6563f, +-35.1563f,48.8152f,-97.6563f, +-31.25f,50.2801f,-97.6563f, +-27.3438f,49.7242f,-97.6563f, +-23.4375f,49.8502f,-97.6563f, +-19.5313f,49.8568f,-97.6563f, +-15.625f,48.3267f,-97.6563f, +-11.7188f,47.8521f,-97.6563f, +-7.8125f,47.3364f,-97.6563f, +-3.90625f,46.156f,-97.6563f, +0.0f,44.8966f,-97.6563f, +3.90625f,44.9637f,-97.6563f, +-250.0f,21.0334f,-101.563f, +-246.094f,23.093f,-101.563f, +-242.188f,25.4189f,-101.563f, +-238.281f,27.31f,-101.563f, +-234.375f,26.8223f,-101.563f, +-230.469f,26.375f,-101.563f, +-226.563f,26.7718f,-101.563f, +-222.656f,25.3642f,-101.563f, +-218.75f,23.7619f,-101.563f, +-214.844f,21.4458f,-101.563f, +-210.938f,19.7809f,-101.563f, +-207.031f,19.054f,-101.563f, +-203.125f,19.6087f,-101.563f, +-199.219f,19.2503f,-101.563f, +-195.313f,18.0809f,-101.563f, +-191.406f,17.75f,-101.563f, +-187.5f,17.1292f,-101.563f, +-183.594f,16.2151f,-101.563f, +-179.688f,15.8928f,-101.563f, +-175.781f,14.4866f,-101.563f, +-171.875f,13.9039f,-101.563f, +-167.969f,12.278f,-101.563f, +-164.063f,11.5804f,-101.563f, +-160.156f,12.0152f,-101.563f, +-156.25f,11.7113f,-101.563f, +-152.344f,10.7496f,-101.563f, +-148.438f,9.67121f,-101.563f, +-144.531f,9.72628f,-101.563f, +-140.625f,9.99849f,-101.563f, +-136.719f,10.504f,-101.563f, +-132.813f,11.0917f,-101.563f, +-128.906f,10.4997f,-101.563f, +-125.0f,9.12306f,-101.563f, +-121.094f,8.34841f,-101.563f, +-117.188f,8.92074f,-101.563f, +-113.281f,9.44857f,-101.563f, +-109.375f,10.5456f,-101.563f, +-105.469f,10.7435f,-101.563f, +-101.563f,11.6413f,-101.563f, +-97.6563f,14.2233f,-101.563f, +-93.75f,17.0641f,-101.563f, +-89.8438f,20.5963f,-101.563f, +-85.9375f,22.9601f,-101.563f, +-82.0313f,26.0881f,-101.563f, +-78.125f,28.3451f,-101.563f, +-74.2188f,30.4473f,-101.563f, +-70.3125f,33.7644f,-101.563f, +-66.4063f,36.3074f,-101.563f, +-62.5f,38.0683f,-101.563f, +-58.5938f,39.1597f,-101.563f, +-54.6875f,40.3396f,-101.563f, +-50.7813f,41.4946f,-101.563f, +-46.875f,43.0029f,-101.563f, +-42.9688f,44.8434f,-101.563f, +-39.0625f,47.2094f,-101.563f, +-35.1563f,47.3449f,-101.563f, +-31.25f,49.1989f,-101.563f, +-27.3438f,48.845f,-101.563f, +-23.4375f,47.635f,-101.563f, +-19.5313f,47.9355f,-101.563f, +-15.625f,47.1439f,-101.563f, +-11.7188f,45.929f,-101.563f, +-7.8125f,46.9058f,-101.563f, +-3.90625f,46.1235f,-101.563f, +0.0f,45.2655f,-101.563f, +3.90625f,44.5311f,-101.563f, +-250.0f,24.0006f,-105.469f, +-246.094f,26.733f,-105.469f, +-242.188f,28.4305f,-105.469f, +-238.281f,29.0431f,-105.469f, +-234.375f,28.1582f,-105.469f, +-230.469f,28.0178f,-105.469f, +-226.563f,27.4417f,-105.469f, +-222.656f,27.0081f,-105.469f, +-218.75f,24.9646f,-105.469f, +-214.844f,22.8713f,-105.469f, +-210.938f,21.4507f,-105.469f, +-207.031f,21.2058f,-105.469f, +-203.125f,20.8114f,-105.469f, +-199.219f,20.7281f,-105.469f, +-195.313f,19.7358f,-105.469f, +-191.406f,18.4733f,-105.469f, +-187.5f,17.1875f,-105.469f, +-183.594f,15.4383f,-105.469f, +-179.688f,14.151f,-105.469f, +-175.781f,13.882f,-105.469f, +-171.875f,12.9008f,-105.469f, +-167.969f,11.246f,-105.469f, +-164.063f,11.1287f,-105.469f, +-160.156f,10.748f,-105.469f, +-156.25f,11.5003f,-105.469f, +-152.344f,10.3683f,-105.469f, +-148.438f,9.87346f,-105.469f, +-144.531f,9.6524f,-105.469f, +-140.625f,8.36957f,-105.469f, +-136.719f,9.12242f,-105.469f, +-132.813f,9.41585f,-105.469f, +-128.906f,8.97735f,-105.469f, +-125.0f,7.89593f,-105.469f, +-121.094f,7.20155f,-105.469f, +-117.188f,6.63681f,-105.469f, +-113.281f,8.27572f,-105.469f, +-109.375f,8.39126f,-105.469f, +-105.469f,9.69363f,-105.469f, +-101.563f,12.2269f,-105.469f, +-97.6563f,15.3785f,-105.469f, +-93.75f,18.1643f,-105.469f, +-89.8438f,20.8715f,-105.469f, +-85.9375f,23.5096f,-105.469f, +-82.0313f,25.2072f,-105.469f, +-78.125f,27.8536f,-105.469f, +-74.2188f,30.8436f,-105.469f, +-70.3125f,33.8966f,-105.469f, +-66.4063f,36.3107f,-105.469f, +-62.5f,37.9291f,-105.469f, +-58.5938f,39.7963f,-105.469f, +-54.6875f,40.5554f,-105.469f, +-50.7813f,42.1374f,-105.469f, +-46.875f,42.7622f,-105.469f, +-42.9688f,44.5703f,-105.469f, +-39.0625f,46.4665f,-105.469f, +-35.1563f,46.6101f,-105.469f, +-31.25f,47.1188f,-105.469f, +-27.3438f,48.052f,-105.469f, +-23.4375f,47.7845f,-105.469f, +-19.5313f,47.8159f,-105.469f, +-15.625f,46.7772f,-105.469f, +-11.7188f,46.0033f,-105.469f, +-7.8125f,47.2861f,-105.469f, +-3.90625f,46.9832f,-105.469f, +0.0f,45.6472f,-105.469f, +3.90625f,44.8466f,-105.469f, +-250.0f,27.0053f,-109.375f, +-246.094f,28.4873f,-109.375f, +-242.188f,29.8219f,-109.375f, +-238.281f,30.0561f,-109.375f, +-234.375f,29.2892f,-109.375f, +-230.469f,29.5933f,-109.375f, +-226.563f,28.8697f,-109.375f, +-222.656f,27.4881f,-109.375f, +-218.75f,25.7165f,-109.375f, +-214.844f,23.9985f,-109.375f, +-210.938f,23.3958f,-109.375f, +-207.031f,23.3567f,-109.375f, +-203.125f,23.3311f,-109.375f, +-199.219f,22.2114f,-109.375f, +-195.313f,21.0452f,-109.375f, +-191.406f,20.2153f,-109.375f, +-187.5f,18.8202f,-109.375f, +-183.594f,16.7998f,-109.375f, +-179.688f,15.8942f,-109.375f, +-175.781f,14.8638f,-109.375f, +-171.875f,13.1475f,-109.375f, +-167.969f,12.7375f,-109.375f, +-164.063f,10.7456f,-109.375f, +-160.156f,10.2908f,-109.375f, +-156.25f,9.65347f,-109.375f, +-152.344f,10.1273f,-109.375f, +-148.438f,9.91826f,-109.375f, +-144.531f,8.92229f,-109.375f, +-140.625f,8.34112f,-109.375f, +-136.719f,7.82043f,-109.375f, +-132.813f,7.17703f,-109.375f, +-128.906f,7.28288f,-109.375f, +-125.0f,6.94364f,-109.375f, +-121.094f,6.57742f,-109.375f, +-117.188f,5.68794f,-109.375f, +-113.281f,5.66654f,-109.375f, +-109.375f,6.9457f,-109.375f, +-105.469f,9.81036f,-109.375f, +-101.563f,12.6651f,-109.375f, +-97.6563f,15.2246f,-109.375f, +-93.75f,18.3914f,-109.375f, +-89.8438f,21.0454f,-109.375f, +-85.9375f,23.3579f,-109.375f, +-82.0313f,25.0292f,-109.375f, +-78.125f,28.9637f,-109.375f, +-74.2188f,31.9858f,-109.375f, +-70.3125f,34.5815f,-109.375f, +-66.4063f,37.1495f,-109.375f, +-62.5f,38.5371f,-109.375f, +-58.5938f,39.6993f,-109.375f, +-54.6875f,41.3314f,-109.375f, +-50.7813f,42.3279f,-109.375f, +-46.875f,43.399f,-109.375f, +-42.9688f,44.8971f,-109.375f, +-39.0625f,46.4515f,-109.375f, +-35.1563f,46.6684f,-109.375f, +-31.25f,47.2696f,-109.375f, +-27.3438f,48.2082f,-109.375f, +-23.4375f,47.2707f,-109.375f, +-19.5313f,47.952f,-109.375f, +-15.625f,47.4088f,-109.375f, +-11.7188f,47.3981f,-109.375f, +-7.8125f,48.0766f,-109.375f, +-3.90625f,47.4974f,-109.375f, +0.0f,46.1817f,-109.375f, +3.90625f,45.3987f,-109.375f, +-250.0f,28.5243f,-113.281f, +-246.094f,30.3032f,-113.281f, +-242.188f,31.2443f,-113.281f, +-238.281f,30.733f,-113.281f, +-234.375f,31.2433f,-113.281f, +-230.469f,31.5829f,-113.281f, +-226.563f,30.3008f,-113.281f, +-222.656f,28.2348f,-113.281f, +-218.75f,25.8116f,-113.281f, +-214.844f,25.3702f,-113.281f, +-210.938f,24.8435f,-113.281f, +-207.031f,25.7524f,-113.281f, +-203.125f,26.0021f,-113.281f, +-199.219f,24.9024f,-113.281f, +-195.313f,23.7348f,-113.281f, +-191.406f,21.9608f,-113.281f, +-187.5f,20.2108f,-113.281f, +-183.594f,18.963f,-113.281f, +-179.688f,17.7929f,-113.281f, +-175.781f,16.3625f,-113.281f, +-171.875f,14.6525f,-113.281f, +-167.969f,13.4453f,-113.281f, +-164.063f,11.5352f,-113.281f, +-160.156f,10.457f,-113.281f, +-156.25f,9.86849f,-113.281f, +-152.344f,9.76379f,-113.281f, +-148.438f,9.40799f,-113.281f, +-144.531f,8.38098f,-113.281f, +-140.625f,8.03078f,-113.281f, +-136.719f,7.4536f,-113.281f, +-132.813f,6.32375f,-113.281f, +-128.906f,5.90846f,-113.281f, +-125.0f,5.44126f,-113.281f, +-121.094f,5.53385f,-113.281f, +-117.188f,5.35081f,-113.281f, +-113.281f,6.14244f,-113.281f, +-109.375f,7.72509f,-113.281f, +-105.469f,9.98969f,-113.281f, +-101.563f,12.8924f,-113.281f, +-97.6563f,15.6605f,-113.281f, +-93.75f,18.4427f,-113.281f, +-89.8438f,20.4633f,-113.281f, +-85.9375f,22.3484f,-113.281f, +-82.0313f,25.7434f,-113.281f, +-78.125f,29.5649f,-113.281f, +-74.2188f,32.7377f,-113.281f, +-70.3125f,34.4529f,-113.281f, +-66.4063f,37.0096f,-113.281f, +-62.5f,38.2565f,-113.281f, +-58.5938f,39.8951f,-113.281f, +-54.6875f,41.291f,-113.281f, +-50.7813f,42.6018f,-113.281f, +-46.875f,43.3624f,-113.281f, +-42.9688f,44.3449f,-113.281f, +-39.0625f,45.4446f,-113.281f, +-35.1563f,46.0157f,-113.281f, +-31.25f,47.6632f,-113.281f, +-27.3438f,47.6934f,-113.281f, +-23.4375f,46.4824f,-113.281f, +-19.5313f,48.2708f,-113.281f, +-15.625f,48.5036f,-113.281f, +-11.7188f,47.6795f,-113.281f, +-7.8125f,48.4742f,-113.281f, +-3.90625f,48.509f,-113.281f, +0.0f,47.4037f,-113.281f, +3.90625f,47.4869f,-113.281f, +-250.0f,30.7007f,-117.188f, +-246.094f,31.6625f,-117.188f, +-242.188f,31.8246f,-117.188f, +-238.281f,32.4951f,-117.188f, +-234.375f,33.3552f,-117.188f, +-230.469f,32.7471f,-117.188f, +-226.563f,30.8092f,-117.188f, +-222.656f,28.3135f,-117.188f, +-218.75f,27.0912f,-117.188f, +-214.844f,27.0184f,-117.188f, +-210.938f,27.5702f,-117.188f, +-207.031f,27.9311f,-117.188f, +-203.125f,28.0909f,-117.188f, +-199.219f,26.6916f,-117.188f, +-195.313f,25.6983f,-117.188f, +-191.406f,24.0617f,-117.188f, +-187.5f,22.1476f,-117.188f, +-183.594f,20.964f,-117.188f, +-179.688f,19.1417f,-117.188f, +-175.781f,18.0941f,-117.188f, +-171.875f,16.3483f,-117.188f, +-167.969f,13.8969f,-117.188f, +-164.063f,12.2065f,-117.188f, +-160.156f,10.4346f,-117.188f, +-156.25f,9.28283f,-117.188f, +-152.344f,8.20933f,-117.188f, +-148.438f,7.69157f,-117.188f, +-144.531f,7.05251f,-117.188f, +-140.625f,6.38685f,-117.188f, +-136.719f,5.88862f,-117.188f, +-132.813f,4.48007f,-117.188f, +-128.906f,4.03049f,-117.188f, +-125.0f,4.96603f,-117.188f, +-121.094f,6.08105f,-117.188f, +-117.188f,6.76315f,-117.188f, +-113.281f,7.41087f,-117.188f, +-109.375f,7.5353f,-117.188f, +-105.469f,9.88018f,-117.188f, +-101.563f,11.8887f,-117.188f, +-97.6563f,14.4702f,-117.188f, +-93.75f,17.2187f,-117.188f, +-89.8438f,20.2241f,-117.188f, +-85.9375f,22.2766f,-117.188f, +-82.0313f,25.968f,-117.188f, +-78.125f,29.2923f,-117.188f, +-74.2188f,31.9825f,-117.188f, +-70.3125f,34.0756f,-117.188f, +-66.4063f,35.9202f,-117.188f, +-62.5f,37.9131f,-117.188f, +-58.5938f,39.2288f,-117.188f, +-54.6875f,40.591f,-117.188f, +-50.7813f,42.5191f,-117.188f, +-46.875f,42.7237f,-117.188f, +-42.9688f,43.8388f,-117.188f, +-39.0625f,45.2151f,-117.188f, +-35.1563f,45.096f,-117.188f, +-31.25f,45.9904f,-117.188f, +-27.3438f,45.2594f,-117.188f, +-23.4375f,45.7333f,-117.188f, +-19.5313f,47.4248f,-117.188f, +-15.625f,48.122f,-117.188f, +-11.7188f,48.0312f,-117.188f, +-7.8125f,49.0431f,-117.188f, +-3.90625f,49.2804f,-117.188f, +0.0f,48.803f,-117.188f, +3.90625f,48.3887f,-117.188f, +-250.0f,31.7497f,-121.094f, +-246.094f,31.3973f,-121.094f, +-242.188f,32.0742f,-121.094f, +-238.281f,33.1521f,-121.094f, +-234.375f,33.6068f,-121.094f, +-230.469f,31.9815f,-121.094f, +-226.563f,30.2957f,-121.094f, +-222.656f,28.5699f,-121.094f, +-218.75f,28.3353f,-121.094f, +-214.844f,28.8422f,-121.094f, +-210.938f,29.4292f,-121.094f, +-207.031f,29.2833f,-121.094f, +-203.125f,28.4123f,-121.094f, +-199.219f,27.4455f,-121.094f, +-195.313f,26.9053f,-121.094f, +-191.406f,24.8164f,-121.094f, +-187.5f,22.4409f,-121.094f, +-183.594f,21.5447f,-121.094f, +-179.688f,20.6668f,-121.094f, +-175.781f,18.9757f,-121.094f, +-171.875f,16.8092f,-121.094f, +-167.969f,14.4997f,-121.094f, +-164.063f,13.0122f,-121.094f, +-160.156f,11.2904f,-121.094f, +-156.25f,9.63825f,-121.094f, +-152.344f,8.62771f,-121.094f, +-148.438f,7.36842f,-121.094f, +-144.531f,6.44275f,-121.094f, +-140.625f,5.50805f,-121.094f, +-136.719f,6.00349f,-121.094f, +-132.813f,4.67796f,-121.094f, +-128.906f,3.93081f,-121.094f, +-125.0f,5.39329f,-121.094f, +-121.094f,6.95361f,-121.094f, +-117.188f,8.00676f,-121.094f, +-113.281f,7.76936f,-121.094f, +-109.375f,8.598f,-121.094f, +-105.469f,9.71941f,-121.094f, +-101.563f,11.4789f,-121.094f, +-97.6563f,13.572f,-121.094f, +-93.75f,16.0296f,-121.094f, +-89.8438f,18.5079f,-121.094f, +-85.9375f,22.5232f,-121.094f, +-82.0313f,25.7298f,-121.094f, +-78.125f,29.0421f,-121.094f, +-74.2188f,31.8936f,-121.094f, +-70.3125f,33.6857f,-121.094f, +-66.4063f,35.8951f,-121.094f, +-62.5f,37.4244f,-121.094f, +-58.5938f,39.1337f,-121.094f, +-54.6875f,40.6842f,-121.094f, +-50.7813f,41.8829f,-121.094f, +-46.875f,42.9851f,-121.094f, +-42.9688f,42.3613f,-121.094f, +-39.0625f,44.0627f,-121.094f, +-35.1563f,43.3741f,-121.094f, +-31.25f,43.2393f,-121.094f, +-27.3438f,44.1982f,-121.094f, +-23.4375f,45.2747f,-121.094f, +-19.5313f,46.6461f,-121.094f, +-15.625f,47.338f,-121.094f, +-11.7188f,48.1318f,-121.094f, +-7.8125f,49.3601f,-121.094f, +-3.90625f,49.6752f,-121.094f, +0.0f,49.3611f,-121.094f, +3.90625f,49.6769f,-121.094f, +-250.0f,31.4025f,-125.0f, +-246.094f,31.4165f,-125.0f, +-242.188f,32.314f,-125.0f, +-238.281f,32.9822f,-125.0f, +-234.375f,32.6962f,-125.0f, +-230.469f,31.3632f,-125.0f, +-226.563f,29.4391f,-125.0f, +-222.656f,29.519f,-125.0f, +-218.75f,29.4481f,-125.0f, +-214.844f,29.8481f,-125.0f, +-210.938f,30.408f,-125.0f, +-207.031f,30.291f,-125.0f, +-203.125f,28.7473f,-125.0f, +-199.219f,28.1816f,-125.0f, +-195.313f,27.2839f,-125.0f, +-191.406f,25.7018f,-125.0f, +-187.5f,23.2882f,-125.0f, +-183.594f,22.1614f,-125.0f, +-179.688f,20.658f,-125.0f, +-175.781f,18.8433f,-125.0f, +-171.875f,16.364f,-125.0f, +-167.969f,14.7298f,-125.0f, +-164.063f,12.9859f,-125.0f, +-160.156f,11.3306f,-125.0f, +-156.25f,10.1916f,-125.0f, +-152.344f,8.3967f,-125.0f, +-148.438f,6.23292f,-125.0f, +-144.531f,5.48985f,-125.0f, +-140.625f,5.18276f,-125.0f, +-136.719f,5.56059f,-125.0f, +-132.813f,5.75157f,-125.0f, +-128.906f,5.32154f,-125.0f, +-125.0f,6.15672f,-125.0f, +-121.094f,7.53373f,-125.0f, +-117.188f,8.38676f,-125.0f, +-113.281f,8.64274f,-125.0f, +-109.375f,8.49941f,-125.0f, +-105.469f,9.24481f,-125.0f, +-101.563f,11.5178f,-125.0f, +-97.6563f,13.4113f,-125.0f, +-93.75f,15.4997f,-125.0f, +-89.8438f,17.3502f,-125.0f, +-85.9375f,20.8168f,-125.0f, +-82.0313f,24.9405f,-125.0f, +-78.125f,27.8681f,-125.0f, +-74.2188f,30.1495f,-125.0f, +-70.3125f,32.4402f,-125.0f, +-66.4063f,34.2537f,-125.0f, +-62.5f,36.5623f,-125.0f, +-58.5938f,38.9027f,-125.0f, +-54.6875f,40.1192f,-125.0f, +-50.7813f,41.9393f,-125.0f, +-46.875f,41.8765f,-125.0f, +-42.9688f,41.6371f,-125.0f, +-39.0625f,41.6432f,-125.0f, +-35.1563f,41.2852f,-125.0f, +-31.25f,41.5629f,-125.0f, +-27.3438f,42.2956f,-125.0f, +-23.4375f,43.9719f,-125.0f, +-19.5313f,46.2232f,-125.0f, +-15.625f,47.3104f,-125.0f, +-11.7188f,47.5943f,-125.0f, +-7.8125f,49.1192f,-125.0f, +-3.90625f,49.6341f,-125.0f, +0.0f,50.3481f,-125.0f, +3.90625f,50.3021f,-125.0f, +}; + +btScalar Landscape05Nml[] = { +-0.379368f,0.918093f,-0.114827f, +-0.372144f,0.893697f,-0.250627f, +-0.36483f,0.925769f,-0.0992527f, +-0.303739f,0.924201f,-0.231506f, +-0.333317f,0.942796f,0.0059764f, +-0.301915f,0.940094f,-0.158338f, +-0.363026f,0.931698f,0.0122604f, +-0.316966f,0.945703f,-0.0719588f, +-0.334188f,0.941548f,0.0424963f, +-0.326039f,0.944563f,-0.0387196f, +-0.382515f,0.923758f,0.0188291f, +-0.388659f,0.920843f,-0.0315106f, +-0.393577f,0.919186f,-0.013971f, +-0.384968f,0.922772f,-0.0170923f, +-0.36589f,0.930393f,-0.0222354f, +-0.357745f,0.933231f,0.0331438f, +-0.482959f,0.873942f,-0.0545559f, +-0.473203f,0.879732f,0.0463645f, +-0.550088f,0.834035f,-0.0423024f, +-0.534007f,0.844766f,0.0347315f, +-0.469703f,0.882824f,0.000376011f, +-0.490919f,0.868868f,0.0637728f, +-0.552202f,0.826862f,-0.106641f, +-0.558464f,0.829519f,0.00395409f, +-0.437742f,0.897949f,-0.0454837f, +-0.437659f,0.898576f,0.0318733f, +-0.370538f,0.927929f,-0.0406078f, +-0.403245f,0.912789f,-0.064878f, +-0.385648f,0.921933f,-0.0362754f, +-0.356223f,0.934382f,-0.00604283f, +-0.30076f,0.953691f,-0.00400305f, +-0.305622f,0.951852f,0.0239231f, +-0.284526f,0.956527f,-0.0640436f, +-0.380428f,0.91278f,-0.148684f, +-0.270228f,0.949845f,-0.157392f, +-0.258662f,0.947281f,-0.189085f, +-0.182234f,0.978377f,-0.0978241f, +-0.170558f,0.969333f,-0.176927f, +-0.205282f,0.978149f,-0.0329196f, +-0.190223f,0.949267f,-0.250415f, +-0.274135f,0.959498f,0.0649128f, +-0.310884f,0.912161f,-0.267046f, +-0.496348f,0.868119f,0.00275513f, +-0.43081f,0.896388f,-0.104358f, +-0.405094f,0.913485f,0.0380057f, +-0.324068f,0.9389f,0.115955f, +-0.25697f,0.965908f,0.0314342f, +-0.271227f,0.948776f,0.162051f, +-0.254963f,0.963309f,-0.0838379f, +-0.344475f,0.938191f,-0.03368f, +-0.111765f,0.981495f,-0.15549f, +-0.167507f,0.982459f,-0.0819529f, +-0.0010222f,0.966945f,-0.254984f, +-0.0444844f,0.98477f,-0.168075f, +0.186055f,0.950323f,-0.249537f, +0.1896f,0.965697f,-0.177427f, +0.271688f,0.939248f,-0.209761f, +0.279232f,0.936599f,-0.211687f, +0.322549f,0.939459f,-0.115666f, +0.354799f,0.922502f,-0.152013f, +0.252542f,0.965579f,-0.0622893f, +0.223889f,0.935481f,-0.273404f, +0.054661f,0.998373f,-0.0162575f, +0.0861707f,0.972348f,-0.217056f, +0.0124775f,0.999913f,-0.00421609f, +0.0330599f,0.976575f,-0.212621f, +0.0918366f,0.994675f,0.046771f, +0.166973f,0.980978f,-0.0990035f, +0.0387017f,0.993028f,0.111346f, +0.125297f,0.990619f,0.054541f, +0.0541059f,0.984899f,0.164456f, +0.149711f,0.968151f,0.200673f, +0.168008f,0.956272f,0.239411f, +0.195367f,0.93223f,0.304595f, +0.147118f,0.96491f,0.217497f, +0.125818f,0.960755f,0.247225f, +0.270517f,0.934497f,0.23138f, +0.29818f,0.904256f,0.305629f, +0.363841f,0.900609f,0.237745f, +0.316827f,0.923009f,0.218347f, +0.413166f,0.893779f,0.17451f, +0.334815f,0.940911f,0.0508378f, +0.474676f,0.869519f,0.136452f, +0.456974f,0.889396f,0.0122055f, +0.272216f,0.960219f,0.0622813f, +0.228855f,0.962963f,-0.142573f, +0.0810211f,0.995842f,0.0416494f, +0.189938f,0.980101f,0.0576713f, +-0.0449078f,0.994712f,0.0923629f, +-0.00155869f,0.98749f,0.157671f, +-0.0840704f,0.991095f,0.103263f, +-0.0968834f,0.985327f,0.140515f, +0.0427121f,0.991995f,0.118832f, +-0.0240058f,0.999711f,0.000939081f, +-0.124569f,0.986858f,0.10293f, +-0.167243f,0.982306f,-0.0842863f, +-0.286295f,0.953093f,0.0982316f, +-0.243406f,0.969914f,-0.00444377f, +-0.280466f,0.950626f,0.132851f, +-0.21091f,0.972115f,0.102516f, +-0.230061f,0.951476f,0.204368f, +-0.123921f,0.950092f,0.286301f, +-0.126792f,0.952499f,0.276893f, +-0.0764868f,0.927481f,0.365962f, +-0.0452811f,0.949055f,0.31184f, +-0.138647f,0.960819f,0.240008f, +-0.25036f,0.943892f,0.215377f, +-0.314158f,0.941939f,0.118561f, +-0.458647f,0.872527f,0.168342f, +-0.427047f,0.882261f,0.198106f, +-0.485467f,0.864542f,0.129958f, +-0.523912f,0.844181f,0.113461f, +-0.532843f,0.842328f,0.081008f, +-0.518838f,0.84918f,0.0984888f, +-0.439028f,0.883929f,0.16101f, +-0.409166f,0.878784f,0.245606f, +-0.386543f,0.918859f,0.0792661f, +-0.447749f,0.88853f,0.100178f, +-0.431191f,0.90206f,0.0190184f, +-0.467639f,0.880276f,0.0801789f, +-0.518882f,0.844495f,-0.132623f, +-0.570181f,0.817923f,-0.076789f, +-0.420368f,0.883342f,-0.207357f, +-0.464447f,0.877342f,-0.120667f, +-0.386958f,0.877414f,-0.283564f, +-0.442101f,0.874511f,-0.199442f, +-0.380012f,0.859996f,-0.340584f, +-0.442865f,0.822467f,-0.356959f, +-0.24551f,0.880879f,-0.404695f, +-0.263304f,0.844058f,-0.467159f, +-0.116714f,0.897206f,-0.425909f, +-0.129252f,0.860962f,-0.491974f, +-0.352237f,0.922053f,0.160457f, +-0.402553f,0.906198f,0.129446f, +-0.377478f,0.915341f,0.140219f, +-0.336315f,0.935519f,0.10815f, +-0.335675f,0.937548f,0.0912505f, +-0.330532f,0.939201f,0.0930086f, +-0.361761f,0.931606f,0.035208f, +-0.318172f,0.947538f,0.0306247f, +-0.418525f,0.907834f,-0.0259689f, +-0.56364f,0.818048f,-0.114485f, +-0.461029f,0.882661f,-0.0914388f, +-0.472492f,0.87835f,-0.0724725f, +-0.523319f,0.846244f,-0.100037f, +-0.381187f,0.924062f,-0.0283799f, +-0.407557f,0.911105f,-0.0615298f, +-0.340677f,0.939702f,0.0299913f, +-0.237849f,0.962659f,0.129291f, +-0.233755f,0.968303f,0.0880164f, +-0.248597f,0.967837f,0.0386268f, +-0.357032f,0.933656f,0.0285478f, +-0.359392f,0.919937f,0.156695f, +-0.375075f,0.918577f,0.12464f, +-0.326685f,0.944457f,-0.0357437f, +-0.172605f,0.980131f,-0.0977257f, +-0.156177f,0.9732f,-0.168789f, +-0.0732432f,0.97238f,-0.221612f, +0.0871915f,0.980367f,-0.176858f, +0.1118f,0.973873f,-0.197667f, +0.197176f,0.978426f,-0.0616824f, +0.202039f,0.979229f,-0.0170475f, +0.172249f,0.982761f,0.0671591f, +0.0103709f,0.995351f,0.095751f, +0.00657151f,0.996617f,0.0819183f, +0.0314022f,0.995508f,0.0893156f, +0.0387801f,0.982532f,0.182011f, +0.0412148f,0.983254f,0.177521f, +0.166642f,0.964252f,0.20603f, +0.177047f,0.971307f,0.1588f, +0.255603f,0.956785f,0.138671f, +0.338465f,0.927074f,0.161166f, +0.418264f,0.886168f,0.199401f, +0.454161f,0.868211f,0.199869f, +0.355471f,0.903694f,0.2387f, +0.136408f,0.975339f,0.173515f, +-0.0223692f,0.983821f,0.177753f, +-0.0947578f,0.983833f,0.151964f, +-0.0484831f,0.985895f,0.16019f, +-0.137652f,0.965784f,0.219802f, +-0.273035f,0.949633f,0.153782f, +-0.284296f,0.949219f,0.134753f, +-0.233616f,0.961781f,0.142834f, +-0.158293f,0.979011f,0.128376f, +-0.142079f,0.977628f,0.155106f, +-0.179667f,0.940095f,0.289726f, +-0.385363f,0.907468f,0.167324f, +-0.462662f,0.886082f,0.0283396f, +-0.500483f,0.865637f,-0.0137244f, +-0.459387f,0.885328f,-0.0718224f, +-0.318003f,0.947491f,-0.0336944f, +-0.336522f,0.937427f,-0.0893505f, +-0.421711f,0.882359f,-0.208814f, +-0.386976f,0.894588f,-0.223522f, +-0.348564f,0.925302f,-0.149395f, +-0.389936f,0.911457f,-0.131135f, +-0.262418f,0.94867f,-0.17653f, +-0.142966f,0.967048f,-0.210661f, +-0.341303f,0.927435f,0.152892f, +-0.342877f,0.929169f,0.138133f, +-0.327958f,0.941991f,0.0713955f, +-0.312837f,0.949244f,0.0326933f, +-0.32505f,0.944749f,0.0423311f, +-0.35038f,0.936272f,0.0250833f, +-0.334661f,0.939274f,0.0759313f, +-0.336592f,0.939816f,0.0587454f, +-0.383743f,0.919849f,0.0813597f, +-0.479391f,0.876726f,0.0391772f, +-0.521184f,0.850742f,-0.0678625f, +-0.496942f,0.867777f,0.00353465f, +-0.521763f,0.848113f,-0.0920201f, +-0.373289f,0.923494f,-0.0883984f, +-0.40896f,0.910065f,-0.067337f, +-0.458758f,0.888254f,0.0233657f, +-0.335137f,0.935384f,0.112868f, +-0.174079f,0.969266f,0.173839f, +-0.174994f,0.976179f,0.128265f, +-0.244694f,0.967717f,0.0603988f, +-0.409093f,0.90433f,-0.121779f, +-0.290803f,0.954139f,-0.0710763f, +-0.266076f,0.946406f,-0.183082f, +-0.19492f,0.966664f,-0.166031f, +-0.107014f,0.989078f,-0.101359f, +-0.0950037f,0.987234f,-0.127838f, +-0.0081899f,0.996807f,-0.0794301f, +0.0655685f,0.997841f,0.0038314f, +0.121704f,0.991617f,0.0433953f, +0.204125f,0.978885f,0.010797f, +0.169834f,0.985465f,0.00398161f, +0.0639966f,0.99795f,0.000581677f, +0.0389498f,0.997722f,-0.0550831f, +-0.00230315f,0.998522f,-0.0543072f, +-0.0428959f,0.99833f,-0.0386874f, +8.35518e-005f,0.999804f,-0.0198162f, +0.12638f,0.991004f,0.0440296f, +0.219728f,0.969155f,0.111616f, +0.270292f,0.956521f,0.109589f, +0.325159f,0.942616f,0.0758083f, +0.394886f,0.91647f,0.0644013f, +0.455483f,0.885289f,0.0937962f, +0.346134f,0.927862f,0.13879f, +0.142703f,0.967217f,0.210065f, +-0.0417806f,0.973195f,0.226154f, +-0.0873343f,0.983405f,0.159022f, +-0.027932f,0.984118f,0.175304f, +-0.101812f,0.985941f,0.132496f, +-0.174734f,0.983884f,0.037939f, +-0.279511f,0.957793f,-0.0671252f, +-0.277834f,0.959638f,-0.04362f, +-0.153076f,0.986374f,0.0602763f, +-0.221825f,0.968529f,0.112897f, +-0.256381f,0.940693f,0.222182f, +-0.236646f,0.958592f,0.158432f, +-0.345917f,0.937587f,-0.0356594f, +-0.417749f,0.894423f,-0.159665f, +-0.456832f,0.853011f,-0.252341f, +-0.379407f,0.905637f,-0.189399f, +-0.328991f,0.940983f,-0.0794707f, +-0.363362f,0.931271f,0.0264943f, +-0.48653f,0.873119f,0.0308429f, +-0.459174f,0.871133f,0.174033f, +-0.359639f,0.91236f,0.1956f, +-0.2127f,0.972657f,0.0932592f, +-0.0697188f,0.989689f,0.12512f, +-0.251887f,0.965064f,0.0721469f, +-0.317161f,0.947815f,-0.0324826f, +-0.311043f,0.947329f,-0.076288f, +-0.343705f,0.938452f,-0.0342691f, +-0.318958f,0.946045f,0.0571365f, +-0.341405f,0.939767f,0.0167816f, +-0.371963f,0.928183f,-0.0109617f, +-0.353511f,0.935132f,0.0236193f, +-0.398287f,0.910412f,0.111881f, +-0.43162f,0.897024f,0.0951448f, +-0.485116f,0.874338f,-0.0140269f, +-0.473699f,0.879939f,-0.03627f, +-0.417805f,0.900966f,-0.117046f, +-0.424936f,0.889519f,-0.167884f, +-0.467852f,0.878936f,-0.0926624f, +-0.493825f,0.865439f,-0.0845782f, +-0.351989f,0.932075f,-0.0856709f, +-0.214961f,0.974111f,-0.0700008f, +-0.163285f,0.986387f,-0.0194449f, +-0.162841f,0.986548f,-0.0143588f, +-0.285987f,0.956112f,-0.0637334f, +-0.292441f,0.94548f,-0.143341f, +-0.215932f,0.955314f,-0.201864f, +-0.253415f,0.950159f,-0.181603f, +-0.183417f,0.974504f,-0.129231f, +-0.101906f,0.993299f,-0.0545242f, +-0.042238f,0.99904f,-0.0116303f, +0.0329811f,0.99907f,-0.0277622f, +0.132201f,0.990073f,-0.0477429f, +0.267032f,0.963432f,-0.0221792f, +0.1278f,0.990718f,-0.0463084f, +0.0964891f,0.995299f,-0.00830296f, +0.0476853f,0.991211f,-0.123396f, +-0.00640997f,0.993203f,-0.116222f, +-0.0126443f,0.992773f,-0.119338f, +-0.00631822f,0.992917f,-0.118638f, +0.0563885f,0.995667f,-0.073943f, +0.12664f,0.991687f,-0.022778f, +0.273262f,0.961705f,0.021246f, +0.388375f,0.920615f,-0.0403992f, +0.37695f,0.920931f,-0.0989673f, +0.400211f,0.914808f,0.0543818f, +0.279689f,0.947142f,0.15715f, +0.0626591f,0.985325f,0.158772f, +0.0197159f,0.983213f,0.181391f, +0.0112307f,0.995546f,0.0936022f, +-0.0611233f,0.998037f,0.013638f, +-0.0515369f,0.996025f,0.0726543f, +-0.060221f,0.998076f,0.0147593f, +-0.21333f,0.972986f,-0.0882534f, +-0.330599f,0.94012f,-0.0829391f, +-0.311254f,0.950309f,-0.00575056f, +-0.324983f,0.931955f,0.160768f, +-0.245964f,0.942146f,0.227736f, +-0.125195f,0.981121f,0.147403f, +-0.193437f,0.975595f,0.103908f, +-0.319958f,0.946961f,0.029845f, +-0.440983f,0.895915f,-0.0535662f, +-0.477838f,0.878381f,-0.0108058f, +-0.480471f,0.872693f,0.0869201f, +-0.478968f,0.83494f,0.271043f, +-0.490257f,0.796981f,0.352803f, +-0.434277f,0.834185f,0.339909f, +-0.265882f,0.929328f,0.256236f, +-0.142385f,0.958793f,0.245852f, +-0.182126f,0.963412f,0.196642f, +-0.0681643f,0.992157f,0.104781f, +-0.176883f,0.983918f,0.024857f, +-0.305513f,0.952069f,-0.0150524f, +-0.401485f,0.91552f,0.0251517f, +-0.372509f,0.927256f,0.0378572f, +-0.265017f,0.964159f,0.0127972f, +-0.342134f,0.935688f,-0.0862078f, +-0.427338f,0.901948f,-0.062226f, +-0.447549f,0.894216f,0.00877894f, +-0.382185f,0.923573f,-0.0307708f, +-0.386509f,0.921774f,-0.0307138f, +-0.457766f,0.884255f,-0.0924303f, +-0.384262f,0.916404f,-0.11201f, +-0.431623f,0.886784f,-0.165273f, +-0.460575f,0.869789f,-0.177024f, +-0.471547f,0.850265f,-0.233865f, +-0.351048f,0.911491f,-0.214361f, +-0.263539f,0.9431f,-0.202755f, +-0.173283f,0.972074f,-0.158258f, +-0.19847f,0.960809f,-0.193536f, +-0.275034f,0.951707f,-0.136422f, +-0.217032f,0.958372f,-0.185526f, +-0.201987f,0.95666f,-0.209771f, +-0.299318f,0.94727f,-0.114406f, +-0.187056f,0.978613f,-0.0855959f, +-0.155621f,0.97153f,-0.178637f, +-0.0810385f,0.981009f,-0.176221f, +0.0905036f,0.986207f,-0.138581f, +0.115825f,0.982705f,-0.14448f, +0.19636f,0.97731f,-0.0794224f, +0.143519f,0.988245f,-0.0526749f, +0.109744f,0.989619f,-0.0927937f, +0.197571f,0.972036f,-0.12693f, +0.00332495f,0.962309f,-0.271939f, +-0.0356976f,0.959351f,-0.279948f, +-0.0721767f,0.96735f,-0.242948f, +-0.00843005f,0.989549f,-0.143952f, +0.152572f,0.983317f,-0.0990425f, +0.281378f,0.943362f,-0.175768f, +0.428891f,0.891683f,-0.144753f, +0.290445f,0.954517f,-0.0673633f, +0.176401f,0.973557f,0.145155f, +0.232983f,0.924473f,0.301776f, +0.181127f,0.950255f,0.253393f, +-0.00165339f,0.991402f,0.130837f, +0.0981935f,0.976268f,0.193027f, +0.000170743f,0.996657f,0.0816968f, +-0.0970384f,0.995225f,-0.0105345f, +-0.00895717f,0.999951f,-0.00426387f, +-0.170944f,0.985202f,-0.0124686f, +-0.362907f,0.93182f,-0.00317037f, +-0.388121f,0.921046f,0.0322033f, +-0.407598f,0.90852f,0.0919578f, +-0.247403f,0.962759f,0.109032f, +-0.0829823f,0.986114f,0.143848f, +-0.240859f,0.956011f,0.167424f, +-0.312142f,0.912012f,0.266086f, +-0.398269f,0.862926f,0.311032f, +-0.511957f,0.795091f,0.325161f, +-0.506846f,0.755093f,0.415864f, +-0.506747f,0.718735f,0.476054f, +-0.45002f,0.736589f,0.504895f, +-0.287855f,0.833759f,0.471153f, +-0.237765f,0.90713f,0.34725f, +-0.146865f,0.915961f,0.373425f, +-0.0859218f,0.935714f,0.342136f, +-0.054455f,0.996952f,-0.0558782f, +-0.211499f,0.976662f,-0.0374149f, +-0.331452f,0.940975f,0.0686022f, +-0.397421f,0.917381f,0.0216451f, +-0.316207f,0.946964f,-0.0572054f, +-0.202804f,0.975284f,-0.0877067f, +-0.28846f,0.951091f,-0.110532f, +-0.440756f,0.882415f,-0.164552f, +-0.391159f,0.897816f,-0.202288f, +-0.37945f,0.884355f,-0.27191f, +-0.436492f,0.880924f,-0.182888f, +-0.458204f,0.880643f,-0.12049f, +-0.365575f,0.927969f,-0.0723085f, +-0.344164f,0.93545f,-0.0805227f, +-0.392565f,0.898448f,-0.196683f, +-0.458844f,0.839155f,-0.292028f, +-0.406986f,0.873305f,-0.267769f, +-0.264536f,0.933458f,-0.242234f, +-0.197907f,0.946975f,-0.253123f, +-0.162416f,0.964761f,-0.207018f, +-0.261287f,0.932524f,-0.249254f, +-0.237723f,0.937266f,-0.25499f, +-0.255938f,0.959549f,-0.117312f, +-0.378394f,0.921703f,-0.0853291f, +-0.154569f,0.983106f,-0.098032f, +0.020864f,0.98441f,-0.174648f, +-0.0493076f,0.945704f,-0.321268f, +0.00354211f,0.950539f,-0.310586f, +0.0705741f,0.962405f,-0.262289f, +0.155003f,0.952815f,-0.260992f, +0.190084f,0.945182f,-0.265518f, +0.109466f,0.94166f,-0.318268f, +0.219465f,0.948713f,-0.227551f, +0.131592f,0.95776f,-0.255694f, +-0.023132f,0.936016f,-0.351196f, +-0.102398f,0.923738f,-0.369083f, +-0.11778f,0.928743f,-0.351518f, +0.14699f,0.959781f,-0.239196f, +0.329451f,0.917295f,-0.223678f, +0.290403f,0.942778f,-0.163815f, +0.10086f,0.993272f,0.056896f, +0.00690717f,0.980954f,0.194116f, +0.198478f,0.949829f,0.241726f, +0.257584f,0.935998f,0.239913f, +0.0870031f,0.976807f,0.195647f, +0.0578083f,0.994066f,0.0921449f, +0.121554f,0.989161f,0.0823711f, +0.0335983f,0.999242f,0.0196737f, +-0.0544848f,0.997579f,-0.0432265f, +-0.170331f,0.98419f,0.0485619f, +-0.366378f,0.930108f,-0.0258115f, +-0.430564f,0.901925f,-0.0338598f, +-0.412156f,0.909498f,0.0542308f, +-0.303685f,0.949097f,0.0836093f, +-0.198153f,0.949404f,0.243656f, +-0.267445f,0.871756f,0.410506f, +-0.393769f,0.805932f,0.442062f, +-0.427473f,0.750775f,0.50359f, +-0.522691f,0.707231f,0.476044f, +-0.550081f,0.670741f,0.497511f, +-0.518356f,0.695815f,0.49714f, +-0.372017f,0.764162f,0.526934f, +-0.210863f,0.841692f,0.497082f, +-0.116051f,0.87101f,0.477362f, +-0.106872f,0.906726f,0.407954f, +0.0295506f,0.897687f,0.439643f, +-0.11391f,0.993475f,0.00559176f, +-0.238885f,0.970513f,0.0322297f, +-0.352278f,0.935893f,0.00201985f, +-0.29155f,0.955165f,-0.0515582f, +-0.283012f,0.950207f,-0.130422f, +-0.233718f,0.966509f,-0.105997f, +-0.293314f,0.953293f,-0.0721f, +-0.344057f,0.937935f,-0.0436188f, +-0.359338f,0.921856f,-0.145114f, +-0.361988f,0.90939f,-0.204876f, +-0.478777f,0.840974f,-0.252063f, +-0.501126f,0.832032f,-0.237897f, +-0.42396f,0.887247f,-0.1818f, +-0.340692f,0.929815f,-0.13919f, +-0.261328f,0.946412f,-0.189766f, +-0.383135f,0.863856f,-0.327048f, +-0.4248f,0.838392f,-0.341533f, +-0.258907f,0.912327f,-0.317216f, +-0.273875f,0.922352f,-0.272505f, +-0.216284f,0.973372f,-0.0759435f, +-0.186061f,0.980681f,-0.0603919f, +-0.327344f,0.93227f,-0.15401f, +-0.354135f,0.933013f,-0.0638423f, +-0.30838f,0.94174f,-0.13427f, +-0.0952482f,0.963393f,-0.250602f, +0.0864929f,0.957116f,-0.276491f, +0.0265645f,0.947809f,-0.31773f, +-0.00743162f,0.929747f,-0.368124f, +0.0794584f,0.926075f,-0.368877f, +0.177698f,0.921503f,-0.345334f, +0.210118f,0.923104f,-0.322071f, +0.0972314f,0.929984f,-0.354507f, +0.0931107f,0.932401f,-0.349226f, +0.163846f,0.947557f,-0.274392f, +0.04099f,0.947023f,-0.318539f, +-0.0637185f,0.942657f,-0.327625f, +-0.131539f,0.923216f,-0.361068f, +0.0323928f,0.932437f,-0.359877f, +0.242794f,0.937436f,-0.249528f, +0.154647f,0.984538f,-0.0822692f, +-0.0290139f,0.999421f,0.0177744f, +-0.0330797f,0.998482f,0.0440283f, +0.157195f,0.980432f,0.118503f, +0.251646f,0.94505f,0.208697f, +0.178529f,0.966849f,0.182568f, +0.171641f,0.982807f,0.0680498f, +0.107902f,0.993714f,0.0298233f, +0.00302695f,0.994036f,0.109006f, +-0.0844358f,0.977656f,0.19251f, +-0.18119f,0.958323f,0.220878f, +-0.285317f,0.945377f,0.157659f, +-0.419121f,0.895183f,0.151606f, +-0.490039f,0.857134f,0.158693f, +-0.402244f,0.878123f,0.259038f, +-0.398659f,0.825161f,0.400226f, +-0.427626f,0.728675f,0.534948f, +-0.378859f,0.704334f,0.600316f, +-0.386613f,0.684959f,0.617545f, +-0.440363f,0.648556f,0.62085f, +-0.484249f,0.659981f,0.574394f, +-0.462576f,0.728741f,0.504936f, +-0.380875f,0.811463f,0.443241f, +-0.190303f,0.865049f,0.464193f, +-0.0749094f,0.86956f,0.488113f, +-0.11614f,0.868815f,0.481323f, +-0.102623f,0.843113f,0.527854f, +-0.198362f,0.979655f,0.0304707f, +-0.238942f,0.970277f,0.0383318f, +-0.308109f,0.951351f,-0.000213496f, +-0.245044f,0.968893f,0.0346459f, +-0.275786f,0.960816f,-0.0278198f, +-0.256726f,0.965729f,-0.0381932f, +-0.318964f,0.947473f,-0.0236049f, +-0.388409f,0.921405f,0.0123096f, +-0.298771f,0.953298f,0.0442638f, +-0.291187f,0.956662f,0.00282226f, +-0.39367f,0.915026f,-0.0880448f, +-0.501897f,0.840236f,-0.20519f, +-0.460271f,0.863055f,-0.208055f, +-0.311786f,0.925724f,-0.214066f, +-0.177876f,0.937081f,-0.300397f, +-0.256831f,0.902901f,-0.344683f, +-0.413909f,0.808626f,-0.418096f, +-0.347694f,0.845102f,-0.406092f, +-0.390269f,0.881564f,-0.265585f, +-0.38258f,0.915768f,-0.122479f, +-0.172737f,0.984864f,-0.0142896f, +-0.221138f,0.97315f,-0.0638528f, +-0.32806f,0.922266f,-0.204454f, +-0.20334f,0.945769f,-0.253326f, +-0.0362109f,0.959773f,-0.278433f, +0.0451082f,0.968522f,-0.244806f, +0.103574f,0.977375f,-0.184421f, +0.095607f,0.942862f,-0.319172f, +0.028855f,0.903939f,-0.426688f, +0.0781753f,0.937277f,-0.339707f, +0.163597f,0.966118f,-0.199631f, +0.165445f,0.973063f,-0.160553f, +0.145787f,0.95097f,-0.272767f, +0.130591f,0.92029f,-0.368799f, +0.0531207f,0.931628f,-0.35951f, +-0.0802666f,0.935074f,-0.345244f, +-0.124987f,0.942063f,-0.311281f, +0.0397165f,0.963525f,-0.264653f, +0.0790619f,0.96623f,-0.245254f, +0.0277086f,0.995754f,-0.0877838f, +-0.0718135f,0.997414f,0.00271225f, +-0.0601764f,0.993596f,0.0956336f, +0.0305316f,0.992338f,0.119724f, +0.184993f,0.96549f,0.183324f, +0.240982f,0.949316f,0.20181f, +0.205406f,0.960305f,0.188739f, +0.0685231f,0.967991f,0.241448f, +-0.121139f,0.95072f,0.285408f, +-0.150135f,0.918283f,0.366355f, +-0.132611f,0.919499f,0.370048f, +-0.285199f,0.893271f,0.34746f, +-0.428415f,0.803512f,0.413316f, +-0.445474f,0.783214f,0.433738f, +-0.459983f,0.771026f,0.44038f, +-0.467611f,0.730475f,0.497741f, +-0.48066f,0.718458f,0.502777f, +-0.417628f,0.706128f,0.571814f, +-0.464585f,0.665035f,0.584713f, +-0.472738f,0.646587f,0.598702f, +-0.412146f,0.689264f,0.595861f, +-0.326825f,0.752406f,0.5719f, +-0.254151f,0.834713f,0.48853f, +-0.235109f,0.888903f,0.39316f, +-0.153581f,0.849492f,0.504753f, +-0.150095f,0.815518f,0.558929f, +-0.18873f,0.837012f,0.513607f, +0.0689174f,0.995773f,0.0607139f, +-0.155258f,0.983404f,-0.0938683f, +-0.345692f,0.927547f,-0.141961f, +-0.289881f,0.953783f,-0.079168f, +-0.192407f,0.979661f,-0.0569578f, +-0.267677f,0.960104f,-0.0809323f, +-0.338627f,0.940905f,-0.0054102f, +-0.378143f,0.925406f,-0.0251327f, +-0.331689f,0.941021f,-0.0667991f, +-0.266964f,0.963694f,-0.00485284f, +-0.326986f,0.944023f,-0.0435962f, +-0.406544f,0.902607f,-0.141498f, +-0.445264f,0.84532f,-0.295253f, +-0.261882f,0.90946f,-0.322956f, +-0.131634f,0.928868f,-0.346231f, +-0.231876f,0.922232f,-0.30939f, +-0.381112f,0.87967f,-0.284489f, +-0.459513f,0.85999f,-0.22196f, +-0.498013f,0.864257f,-0.0710131f, +-0.440544f,0.89211f,-0.100303f, +-0.247938f,0.96287f,-0.106806f, +-0.10732f,0.992504f,-0.0584663f, +-0.221465f,0.956592f,-0.189431f, +-0.229248f,0.946541f,-0.22695f, +-0.0978243f,0.972744f,-0.210239f, +-0.0379465f,0.985853f,-0.163259f, +0.0806013f,0.992194f,-0.0951546f, +0.280296f,0.95443f,-0.102456f, +0.155799f,0.941292f,-0.299494f, +-0.0466248f,0.90184f,-0.429548f, +0.0333539f,0.93989f,-0.339845f, +0.15766f,0.95203f,-0.262264f, +0.275219f,0.92494f,-0.262186f, +0.226492f,0.914035f,-0.336513f, +0.0375497f,0.921004f,-0.387739f, +-0.0841489f,0.913809f,-0.39733f, +-0.216548f,0.901013f,-0.375874f, +-0.0617755f,0.971104f,-0.230524f, +0.0635289f,0.988552f,-0.136856f, +-0.0898172f,0.987883f,-0.126568f, +-0.195744f,0.9803f,-0.0263689f, +-0.163398f,0.98375f,0.0744142f, +0.0549941f,0.99236f,0.110438f, +0.19398f,0.975972f,0.0992507f, +0.191759f,0.972804f,0.129928f, +0.149866f,0.963222f,0.223034f, +-0.00306242f,0.957956f,0.286898f, +-0.13576f,0.938575f,0.317249f, +-0.176601f,0.936485f,0.303f, +-0.158083f,0.914215f,0.373122f, +-0.316693f,0.854194f,0.412381f, +-0.498069f,0.774619f,0.389733f, +-0.492142f,0.755365f,0.432688f, +-0.453311f,0.739293f,0.49795f, +-0.471661f,0.730931f,0.49323f, +-0.504596f,0.695479f,0.511558f, +-0.486075f,0.660592f,0.572145f, +-0.455536f,0.681017f,0.573326f, +-0.475459f,0.732851f,0.486691f, +-0.40679f,0.784517f,0.468032f, +-0.294511f,0.862991f,0.410499f, +-0.137096f,0.926626f,0.350098f, +-0.212171f,0.92693f,0.30949f, +-0.320702f,0.890591f,0.322488f, +-0.144781f,0.913051f,0.381284f, +-0.0467088f,0.929255f,0.366475f, +0.190524f,0.979715f,0.0621193f, +-0.0159571f,0.99888f,-0.0445494f, +-0.299493f,0.937414f,-0.177647f, +-0.30245f,0.926474f,-0.223986f, +-0.236991f,0.948637f,-0.209579f, +-0.316653f,0.935173f,-0.15869f, +-0.385652f,0.9143f,-0.123807f, +-0.33937f,0.934637f,-0.106213f, +-0.347064f,0.934195f,-0.0826249f, +-0.295744f,0.955249f,0.00583919f, +-0.275005f,0.961059f,-0.0271544f, +-0.269439f,0.957464f,-0.103275f, +-0.282112f,0.919833f,-0.272616f, +-0.294141f,0.877255f,-0.379347f, +-0.188084f,0.929949f,-0.315942f, +-0.305781f,0.908958f,-0.283361f, +-0.494244f,0.854771f,-0.158396f, +-0.556326f,0.828917f,0.0582992f, +-0.534005f,0.83843f,0.108964f, +-0.372194f,0.92607f,0.0621723f, +-0.216902f,0.97615f,-0.00922891f, +-0.129625f,0.988755f,-0.0745716f, +-0.137022f,0.98954f,-0.0451077f, +-0.210914f,0.969697f,-0.123297f, +-0.0927848f,0.980946f,-0.170691f, +-0.0487293f,0.98279f,-0.178186f, +0.0377154f,0.983594f,-0.176409f, +0.270827f,0.95519f,-0.119436f, +0.365037f,0.928517f,-0.0678507f, +0.131842f,0.951604f,-0.277612f, +-0.0185121f,0.905238f,-0.424502f, +0.118166f,0.903064f,-0.412931f, +0.230045f,0.8849f,-0.405008f, +0.2101f,0.906634f,-0.365886f, +0.0544702f,0.94453f,-0.323878f, +-0.0630069f,0.9598f,-0.273522f, +-0.203027f,0.928033f,-0.312304f, +-0.22235f,0.90002f,-0.374866f, +0.0164141f,0.973192f,-0.229407f, +-0.131299f,0.967472f,-0.216237f, +-0.248586f,0.95668f,-0.151553f, +-0.180678f,0.971697f,-0.152182f, +0.021506f,0.991774f,-0.126182f, +0.129882f,0.991187f,-0.0260519f, +0.125479f,0.988703f,0.0819803f, +0.0585413f,0.987325f,0.14752f, +-0.0186301f,0.977162f,0.211676f, +-0.162972f,0.968132f,0.19016f, +-0.218545f,0.935778f,0.276691f, +-0.284144f,0.890895f,0.354356f, +-0.345593f,0.839997f,0.418295f, +-0.488331f,0.792258f,0.36587f, +-0.545891f,0.770241f,0.329746f, +-0.533891f,0.766492f,0.357002f, +-0.51665f,0.749346f,0.414189f, +-0.616561f,0.690345f,0.37852f, +-0.519109f,0.719346f,0.461593f, +-0.392236f,0.782177f,0.484097f, +-0.398436f,0.817816f,0.415241f, +-0.392025f,0.864189f,0.315428f, +-0.176475f,0.937288f,0.300577f, +-0.137444f,0.969881f,0.201097f, +-0.206545f,0.942409f,0.263066f, +-0.293185f,0.938992f,0.179823f, +-0.159029f,0.985376f,0.0611911f, +0.00174953f,0.998094f,0.0616789f, +0.241821f,0.962041f,0.126492f, +0.127737f,0.984773f,0.117921f, +-0.17559f,0.984255f,0.0202494f, +-0.277772f,0.957333f,-0.0797282f, +-0.264237f,0.953214f,-0.146839f, +-0.330132f,0.935063f,-0.129113f, +-0.363469f,0.924563f,-0.114338f, +-0.371034f,0.917638f,-0.142388f, +-0.425424f,0.897691f,-0.114736f, +-0.353654f,0.934652f,-0.0368062f, +-0.218582f,0.975792f,0.007136f, +-0.203676f,0.978799f,-0.0216238f, +-0.149661f,0.987587f,-0.0476727f, +-0.278943f,0.945373f,-0.1687f, +-0.239375f,0.951961f,-0.190969f, +-0.360119f,0.921099f,-0.147955f, +-0.584157f,0.811569f,0.0107674f, +-0.61484f,0.786528f,0.0578414f, +-0.504089f,0.86363f,-0.00605437f, +-0.333455f,0.94143f,-0.0501755f, +-0.123418f,0.989972f,-0.0687344f, +-0.105519f,0.985418f,-0.133478f, +-0.134701f,0.9843f,-0.114061f, +-0.137014f,0.977235f,-0.161985f, +-0.0439551f,0.980481f,-0.191638f, +-0.0327274f,0.96544f,-0.258561f, +0.0268923f,0.955378f,-0.294159f, +0.189265f,0.941783f,-0.277892f, +0.306008f,0.930356f,-0.201982f, +0.2909f,0.948465f,-0.12566f, +0.135694f,0.963424f,-0.231086f, +0.114996f,0.92781f,-0.354886f, +0.243157f,0.920361f,-0.306286f, +0.181493f,0.943785f,-0.27628f, +-0.0348676f,0.964621f,-0.261325f, +-0.138397f,0.964431f,-0.225208f, +-0.0584572f,0.973863f,-0.219483f, +-0.160488f,0.904663f,-0.394751f, +-0.113572f,0.901558f,-0.417487f, +-0.155065f,0.923521f,-0.350803f, +-0.242307f,0.919914f,-0.308295f, +-0.206106f,0.923371f,-0.323891f, +-0.0753677f,0.972428f,-0.220691f, +0.00286078f,0.993423f,-0.114469f, +0.0506503f,0.998257f,-0.0302924f, +-0.0328546f,0.999299f,0.017926f, +-0.060813f,0.979003f,0.194565f, +-0.19049f,0.94338f,0.271567f, +-0.332962f,0.885593f,0.323821f, +-0.330466f,0.869145f,0.367938f, +-0.383415f,0.840587f,0.382632f, +-0.450848f,0.795155f,0.405542f, +-0.50223f,0.7918f,0.347589f, +-0.586371f,0.768822f,0.255112f, +-0.550176f,0.765625f,0.333355f, +-0.594581f,0.747662f,0.295761f, +-0.604774f,0.771025f,0.199423f, +-0.461798f,0.840354f,0.283809f, +-0.323989f,0.875237f,0.359155f, +-0.321766f,0.916629f,0.23719f, +-0.168943f,0.967667f,0.187293f, +-0.107108f,0.976625f,0.186366f, +-0.222921f,0.963011f,0.151379f, +-0.142187f,0.985732f,0.0900906f, +-0.0555822f,0.997373f,-0.0464466f, +-0.00128055f,0.995901f,-0.0904418f, +0.189226f,0.980362f,-0.0555288f, +0.085267f,0.996327f,-0.00782177f, +-0.128918f,0.990746f,0.042464f, +-0.188312f,0.982054f,-0.0104463f, +-0.196136f,0.979449f,-0.0470074f, +-0.346836f,0.935484f,-0.0676365f, +-0.385817f,0.920741f,-0.0581445f, +-0.364523f,0.930255f,-0.0418259f, +-0.413227f,0.910109f,-0.0307546f, +-0.395357f,0.915702f,-0.071985f, +-0.249105f,0.966325f,-0.0645241f, +-0.224404f,0.97132f,-0.0786097f, +-0.136636f,0.989057f,-0.0556425f, +-0.161967f,0.98357f,-0.0797312f, +-0.264069f,0.956689f,-0.122532f, +-0.415862f,0.909427f,-0.00117779f, +-0.618635f,0.784039f,0.0507281f, +-0.569525f,0.818988f,-0.0700017f, +-0.458442f,0.876243f,-0.148424f, +-0.301532f,0.936403f,-0.179521f, +-0.125352f,0.969963f,-0.208469f, +-0.0885456f,0.971015f,-0.222014f, +-0.127345f,0.96169f,-0.242765f, +-0.111865f,0.95953f,-0.258434f, +-0.00408963f,0.957803f,-0.287396f, +0.0423217f,0.932535f,-0.358592f, +0.0695614f,0.921939f,-0.381037f, +0.190852f,0.890613f,-0.412775f, +0.209386f,0.879353f,-0.427663f, +0.178912f,0.925963f,-0.332541f, +0.21012f,0.943847f,-0.254954f, +0.194248f,0.92787f,-0.318316f, +0.12116f,0.941808f,-0.313556f, +0.143074f,0.982238f,-0.121399f, +0.00445755f,0.990826f,-0.135068f, +-0.0763662f,0.964673f,-0.252139f, +-0.00960064f,0.938734f,-0.34451f, +-0.0448775f,0.923487f,-0.380997f, +-0.121038f,0.899958f,-0.418839f, +-0.214432f,0.896136f,-0.388536f, +-0.236628f,0.909444f,-0.341933f, +-0.245801f,0.902665f,-0.353239f, +-0.210816f,0.938091f,-0.274848f, +-0.0790665f,0.981118f,-0.17651f, +-0.0418777f,0.998086f,-0.0455073f, +-0.112513f,0.981903f,0.152339f, +-0.289647f,0.921573f,0.258473f, +-0.276284f,0.866929f,0.414851f, +-0.316808f,0.857367f,0.405653f, +-0.333206f,0.853137f,0.401412f, +-0.396081f,0.828088f,0.396725f, +-0.485909f,0.809843f,0.328705f, +-0.463328f,0.813789f,0.350819f, +-0.520203f,0.774122f,0.360725f, +-0.581754f,0.763678f,0.279925f, +-0.55781f,0.791203f,0.250691f, +-0.576356f,0.800103f,0.166282f, +-0.522214f,0.839566f,0.149738f, +-0.327667f,0.934488f,0.139166f, +-0.239893f,0.965369f,0.102537f, +-0.178401f,0.973537f,0.142826f, +-0.0446164f,0.980327f,0.192274f, +-0.152707f,0.98769f,0.0338934f, +-0.061376f,0.996098f,-0.0634113f, +-0.00816896f,0.988579f,-0.150483f, +0.0167009f,0.992551f,-0.120678f, +0.148875f,0.988771f,-0.0129578f, +0.0273451f,0.999626f,0.000950796f, +-0.109359f,0.99398f,0.00672756f, +-0.162948f,0.982686f,-0.0881845f, +-0.242271f,0.966262f,-0.0874275f, +-0.357996f,0.933723f,0.000140943f, +-0.377863f,0.925289f,0.0325572f, +-0.389424f,0.920391f,0.0350616f, +-0.408888f,0.910343f,0.0639282f, +-0.371945f,0.928232f,0.00649489f, +-0.230632f,0.97289f,0.0171594f, +-0.159091f,0.987197f,-0.0114848f, +-0.122759f,0.984183f,-0.127724f, +-0.175251f,0.974473f,-0.14032f, +-0.35571f,0.933079f,-0.0532364f, +-0.501387f,0.863164f,0.0596562f, +-0.575441f,0.816492f,-0.0470046f, +-0.501056f,0.856673f,-0.122698f, +-0.414992f,0.888139f,-0.19746f, +-0.309585f,0.914677f,-0.259854f, +-0.0986663f,0.965073f,-0.242693f, +-0.0576728f,0.965088f,-0.255499f, +-0.0928316f,0.963296f,-0.251879f, +-0.0710107f,0.944633f,-0.320352f, +0.0799711f,0.918771f,-0.386606f, +0.0834923f,0.89273f,-0.442789f, +0.0521243f,0.897343f,-0.438246f, +0.251171f,0.890827f,-0.378604f, +0.176541f,0.892631f,-0.414781f, +0.102505f,0.91423f,-0.392015f, +0.148543f,0.910792f,-0.385219f, +0.204336f,0.92739f,-0.313361f, +0.00672261f,0.969577f,-0.244696f, +-0.0203828f,0.994006f,-0.10741f, +0.0984818f,0.994155f,-0.0442492f, +0.0884297f,0.979853f,-0.179077f, +0.079756f,0.934869f,-0.345919f, +-0.0373135f,0.916973f,-0.3972f, +-0.13475f,0.922044f,-0.362873f, +-0.248554f,0.90561f,-0.343645f, +-0.298871f,0.900649f,-0.315447f, +-0.245556f,0.942684f,-0.225941f, +-0.29156f,0.92569f,-0.241018f, +-0.210251f,0.966564f,-0.146796f, +-0.258034f,0.965595f,0.0323199f, +-0.368176f,0.902709f,0.22263f, +-0.350064f,0.851117f,0.391223f, +-0.273287f,0.858969f,0.432996f, +-0.285306f,0.881397f,0.376483f, +-0.391023f,0.856564f,0.336748f, +-0.346592f,0.838969f,0.419529f, +-0.422742f,0.829366f,0.365295f, +-0.513303f,0.775065f,0.368504f, +-0.526999f,0.742246f,0.413935f, +-0.485934f,0.782442f,0.389426f, +-0.494091f,0.808005f,0.32094f, +-0.527377f,0.820007f,0.222402f, +-0.463863f,0.878834f,0.111725f, +-0.310302f,0.94881f,0.0589178f, +-0.228025f,0.964645f,0.132153f, +-0.25901f,0.96255f,0.080067f, +-0.0424596f,0.997867f,0.0495831f, +-0.00646979f,0.998786f,0.048831f, +0.0235108f,0.999153f,0.033786f, +0.0350773f,0.999112f,0.0233587f, +-0.06489f,0.99782f,0.0120079f, +0.0653571f,0.99589f,0.0626978f, +0.0437681f,0.989758f,0.13588f, +-0.0612591f,0.992124f,0.109253f, +-0.0700659f,0.993846f,0.085792f, +-0.245254f,0.968292f,0.0475526f, +-0.425333f,0.903383f,0.0546907f, +-0.406557f,0.90921f,0.0897132f, +-0.40303f,0.911526f,0.0817765f, +-0.380881f,0.92142f,0.0769048f, +-0.320213f,0.947262f,0.0126033f, +-0.2583f,0.964583f,-0.0534921f, +-0.102892f,0.993091f,-0.0564197f, +-0.0482689f,0.996133f,-0.0734163f, +-0.214829f,0.976629f,0.00662477f, +-0.431775f,0.896672f,0.0977224f, +-0.451215f,0.886255f,0.104672f, +-0.522087f,0.848838f,-0.0830587f, +-0.458286f,0.880944f,-0.117949f, +-0.338524f,0.917937f,-0.206865f, +-0.285281f,0.916752f,-0.279607f, +-0.142352f,0.962006f,-0.232982f, +-0.0943041f,0.983891f,-0.151875f, +-0.0753867f,0.988192f,-0.133394f, +0.0592214f,0.975378f,-0.212437f, +0.135178f,0.93923f,-0.315553f, +0.146098f,0.928461f,-0.34149f, +0.0154593f,0.901088f,-0.433361f, +0.163565f,0.906515f,-0.389201f, +0.204593f,0.933049f,-0.295907f, +0.124274f,0.938076f,-0.323371f, +0.137407f,0.92485f,-0.354642f, +0.063168f,0.960879f,-0.269671f, +-0.0720239f,0.98835f,-0.134077f, +-0.0757271f,0.981006f,-0.178587f, +0.0897227f,0.968994f,-0.23022f, +0.219073f,0.948381f,-0.229303f, +0.192275f,0.938149f,-0.287936f, +-0.0492263f,0.973953f,-0.221343f, +-0.181885f,0.971294f,-0.153316f, +-0.242476f,0.960686f,-0.135229f, +-0.363624f,0.917475f,-0.161301f, +-0.330978f,0.935565f,-0.12317f, +-0.30439f,0.949195f,-0.0798413f, +-0.362853f,0.931339f,-0.0307322f, +-0.401675f,0.903644f,0.148607f, +-0.425736f,0.872787f,0.238731f, +-0.458216f,0.866256f,0.199096f, +-0.325646f,0.913769f,0.242862f, +-0.214745f,0.922085f,0.321938f, +-0.398463f,0.884492f,0.242694f, +-0.475038f,0.830832f,0.289927f, +-0.448294f,0.764081f,0.463909f, +-0.497042f,0.7065f,0.503792f, +-0.489906f,0.735868f,0.467431f, +-0.460921f,0.76339f,0.452535f, +-0.40897f,0.781052f,0.471913f, +-0.371818f,0.839399f,0.396435f, +-0.326758f,0.904742f,0.27326f, +-0.383198f,0.91056f,0.155045f, +-0.284609f,0.924825f,0.252383f, +-0.0749114f,0.976737f,0.200932f, +0.00799324f,0.997093f,0.0757729f, +-0.0700844f,0.990942f,0.114551f, +-0.0596966f,0.983848f,0.168758f, +0.00586433f,0.977052f,0.212922f, +-0.0605914f,0.978841f,0.195443f, +-0.0438257f,0.995801f,0.0803703f, +-0.0570689f,0.993344f,0.100052f, +-0.0606116f,0.987839f,0.143177f, +-0.0960986f,0.983658f,0.152253f, +-0.240218f,0.956553f,0.16523f, +-0.410215f,0.902731f,0.129617f, +-0.38596f,0.917352f,0.0974681f, +-0.348531f,0.935694f,0.0547901f, +-0.396424f,0.918039f,-0.00721866f, +-0.26358f,0.961512f,0.0775866f, +-0.177577f,0.982975f,0.0471779f, +-0.0921077f,0.995708f,0.00907831f, +-0.131805f,0.991186f,0.0133294f, +-0.348565f,0.935587f,0.0563885f, +-0.467549f,0.880933f,0.0731775f, +-0.372581f,0.926945f,0.0442312f, +-0.408929f,0.911847f,-0.0362219f, +-0.445009f,0.893478f,-0.0605312f, +-0.306432f,0.951885f,-0.00384437f, +-0.259351f,0.965029f,0.0381644f, +-0.265204f,0.963994f,-0.0195798f, +-0.114808f,0.993343f,0.00942441f, +-0.0279481f,0.990324f,-0.135929f, +0.103339f,0.977655f,-0.18306f, +0.218767f,0.966894f,-0.131368f, +0.207579f,0.958824f,-0.193824f, +0.136905f,0.960239f,-0.243308f, +0.117272f,0.934734f,-0.335438f, +0.133403f,0.937193f,-0.322294f, +0.140113f,0.948531f,-0.284001f, +0.0924439f,0.975124f,-0.201463f, +-0.0405443f,0.993271f,-0.108481f, +-0.0729426f,0.987394f,-0.140474f, +0.0307633f,0.972795f,-0.229615f, +0.200951f,0.951021f,-0.2349f, +0.206873f,0.91785f,-0.338755f, +0.0409109f,0.957201f,-0.286518f, +-0.211311f,0.976629f,-0.0392802f, +-0.256735f,0.961768f,0.0953371f, +-0.237528f,0.960421f,0.145504f, +-0.329105f,0.937835f,0.110248f, +-0.355083f,0.930437f,0.0905737f, +-0.33751f,0.931415f,0.13621f, +-0.400013f,0.905919f,0.138928f, +-0.505595f,0.854442f,0.119596f, +-0.452675f,0.873473f,0.179247f, +-0.360085f,0.917004f,0.17159f, +-0.404496f,0.910531f,0.0855373f, +-0.324231f,0.903855f,0.279141f, +-0.336075f,0.852068f,0.40129f, +-0.562491f,0.75864f,0.328737f, +-0.580482f,0.703244f,0.410473f, +-0.499356f,0.747889f,0.437385f, +-0.47057f,0.77436f,0.423001f, +-0.457721f,0.780273f,0.426221f, +-0.387043f,0.830428f,0.400733f, +-0.304454f,0.882516f,0.358431f, +-0.240482f,0.915056f,0.323791f, +-0.289179f,0.919765f,0.265345f, +-0.239541f,0.954664f,0.176742f, +-0.0468358f,0.993768f,0.10115f, +-0.0227943f,0.987776f,0.154204f, +-0.112093f,0.964309f,0.239881f, +-0.0599845f,0.969963f,0.235741f, +0.0387578f,0.968143f,0.24738f, +0.0187191f,0.971458f,0.236471f, +0.242021f,0.896343f,0.371478f, +0.0480335f,0.972296f,0.228765f, +-0.0779729f,0.986176f,0.146206f, +-0.0941394f,0.982277f,0.16208f, +-0.22083f,0.962927f,0.154936f, +-0.380194f,0.918443f,0.109152f, +-0.362825f,0.928988f,0.0730715f, +-0.322334f,0.943799f,0.0731113f, +-0.408658f,0.905696f,0.112752f, +-0.342623f,0.91378f,0.218209f, +-0.178962f,0.947287f,0.265744f, +-0.0963031f,0.962264f,0.254507f, +-0.129686f,0.959928f,0.248434f, +-0.25861f,0.932715f,0.251325f, +-0.400538f,0.911394f,0.0944958f, +-0.371118f,0.928542f,0.00899351f, +-0.395096f,0.916517f,0.0624194f, +-0.492959f,0.864551f,0.097688f, +-0.425957f,0.892844f,0.146255f, +-0.256791f,0.9425f,0.213898f, +-0.177422f,0.976398f,0.123157f, +0.0269208f,0.996881f,0.0741829f, +0.164645f,0.980831f,-0.104223f, +0.0973784f,0.963273f,-0.250244f, +0.114359f,0.965463f,-0.234102f, +0.250084f,0.96398f,-0.0905583f, +0.183861f,0.973241f,-0.137829f, +0.203921f,0.957737f,-0.202868f, +0.170155f,0.95208f,-0.254149f, +0.0373443f,0.963666f,-0.264487f, +-0.0311132f,0.98854f,-0.147717f, +-0.0500681f,0.990616f,-0.127173f, +0.0774781f,0.980584f,-0.180143f, +0.0416659f,0.952342f,-0.302174f, +0.183971f,0.945491f,-0.268702f, +0.234504f,0.932825f,-0.27358f, +-0.0611848f,0.988685f,-0.13696f, +-0.37387f,0.925543f,-0.059925f, +-0.361069f,0.932447f,-0.0130774f, +-0.247932f,0.961796f,0.1161f, +-0.321909f,0.940217f,0.111206f, +-0.373794f,0.915694f,0.147587f, +-0.370927f,0.915202f,0.157537f, +-0.367344f,0.908177f,0.20068f, +-0.445687f,0.879826f,0.165134f, +-0.480845f,0.872838f,0.0833169f, +-0.396228f,0.900984f,0.176722f, +-0.39533f,0.870559f,0.292987f, +-0.514705f,0.791717f,0.329034f, +-0.426478f,0.754312f,0.49913f, +-0.476928f,0.731476f,0.487321f, +-0.555203f,0.748777f,0.362053f, +-0.513793f,0.811828f,0.277402f, +-0.498737f,0.823176f,0.271372f, +-0.459197f,0.851815f,0.252089f, +-0.364638f,0.907849f,0.207f, +-0.280535f,0.937686f,0.205051f, +-0.204645f,0.959273f,0.194721f, +-0.188424f,0.978285f,0.0863425f, +-0.16576f,0.97773f,-0.128717f, +-0.0413953f,0.984504f,-0.170405f, +-0.119175f,0.989154f,-0.0858603f, +-0.164393f,0.986215f,0.018821f, +-0.0876541f,0.994439f,0.0583851f, +-0.00781607f,0.987179f,0.159428f, +-0.00608226f,0.980142f,0.198203f, +0.294056f,0.919888f,0.259494f, +0.176099f,0.946212f,0.271426f, +-0.0256669f,0.973237f,0.228366f, +-0.0934761f,0.978631f,0.183149f, +-0.211202f,0.968374f,0.132837f, +-0.345036f,0.933287f,0.0996237f, +-0.346043f,0.935088f,0.0765773f, +-0.381385f,0.918419f,0.105127f, +-0.476923f,0.857096f,0.19476f, +-0.397907f,0.88874f,0.227622f, +-0.175271f,0.936954f,0.30232f, +-0.040477f,0.944541f,0.325889f, +-0.142418f,0.942444f,0.302518f, +-0.246569f,0.91514f,0.318938f, +-0.255277f,0.933873f,0.25043f, +-0.348488f,0.92941f,0.121466f, +-0.472178f,0.874219f,0.113089f, +-0.490306f,0.858256f,0.151645f, +-0.38804f,0.914553f,0.114097f, +-0.196584f,0.979051f,0.0530513f, +-0.0793551f,0.996572f,-0.0234008f, +0.0406197f,0.994776f,-0.0936505f, +0.24653f,0.966821f,-0.0669378f, +0.269235f,0.959692f,-0.0806517f, +0.0569112f,0.963296f,-0.26234f, +0.131503f,0.973945f,-0.184764f, +0.24729f,0.957434f,-0.148892f, +0.248779f,0.951221f,-0.18245f, +0.18718f,0.966303f,-0.176696f, +0.00607471f,0.977895f,-0.20901f, +-0.0210706f,0.975074f,-0.220878f, +0.00501251f,0.949574f,-0.313502f, +0.0771251f,0.945518f,-0.316304f, +0.130553f,0.948445f,-0.288805f, +0.175519f,0.929764f,-0.323623f, +0.111769f,0.971665f,-0.208266f, +-0.210844f,0.971563f,-0.107753f, +-0.345299f,0.9344f,-0.087551f, +-0.367127f,0.918607f,-0.146212f, +-0.340753f,0.929779f,-0.139279f, +-0.358585f,0.929839f,-0.0825605f, +-0.393886f,0.919008f,-0.0166963f, +-0.401193f,0.915983f,0.00451588f, +-0.406108f,0.91192f,0.0589777f, +-0.45609f,0.887954f,0.0593294f, +-0.481921f,0.86351f,0.148669f, +-0.533578f,0.80576f,0.256994f, +-0.480795f,0.753832f,0.447854f, +-0.502576f,0.721353f,0.476516f, +-0.457582f,0.746697f,0.482766f, +-0.419108f,0.791496f,0.44484f, +-0.465376f,0.834036f,0.296325f, +-0.468919f,0.860429f,0.199442f, +-0.486627f,0.858618f,0.161151f, +-0.430227f,0.89524f,0.115972f, +-0.34028f,0.937953f,0.066739f, +-0.311486f,0.949765f,0.0303886f, +-0.166884f,0.985403f,0.0336267f, +0.0381647f,0.996782f,-0.0704869f, +0.0486826f,0.951753f,-0.302979f, +-0.0940893f,0.932244f,-0.349383f, +-0.229015f,0.944857f,-0.234089f, +-0.214421f,0.956596f,-0.19735f, +-0.17466f,0.962579f,-0.207209f, +-0.106663f,0.986513f,-0.124157f, +-0.0523564f,0.993983f,-0.0962102f, +0.1751f,0.970986f,0.162867f, +0.126838f,0.957099f,0.260524f, +-0.0248407f,0.948904f,0.314587f, +-0.0169284f,0.94527f,0.325849f, +-0.126002f,0.963121f,0.237743f, +-0.322368f,0.933961f,0.154262f, +-0.357267f,0.920847f,0.156206f, +-0.40825f,0.900639f,0.148934f, +-0.500408f,0.86145f,0.0865774f, +-0.437173f,0.895731f,0.0809122f, +-0.234862f,0.957423f,0.167871f, +-0.122112f,0.971133f,0.204913f, +-0.146988f,0.949325f,0.277805f, +-0.214866f,0.947227f,0.237893f, +-0.166781f,0.968529f,0.184757f, +-0.279132f,0.953637f,0.112522f, +-0.438908f,0.892826f,0.101101f, +-0.476448f,0.878957f,0.0207741f, +-0.317496f,0.946313f,-0.0607282f, +-0.175675f,0.968847f,-0.174568f, +0.00443594f,0.981128f,-0.193308f, +0.0639918f,0.955901f,-0.286634f, +0.156615f,0.959233f,-0.235253f, +0.281138f,0.953388f,-0.109604f, +0.173642f,0.975105f,-0.137905f, +0.125725f,0.970112f,-0.207546f, +0.23259f,0.936622f,-0.261996f, +0.234534f,0.938208f,-0.25448f, +0.160485f,0.952598f,-0.258459f, +0.0824642f,0.968528f,-0.234849f, +0.0634583f,0.946763f,-0.315614f, +0.0567562f,0.917557f,-0.393532f, +0.0240187f,0.918352f,-0.395035f, +0.0995244f,0.946786f,-0.30609f, +0.0782245f,0.971194f,-0.225085f, +0.0104903f,0.995647f,-0.0926114f, +-0.185802f,0.976721f,-0.107212f, +-0.328502f,0.923412f,-0.198486f, +-0.311331f,0.92975f,-0.196566f, +-0.349149f,0.904891f,-0.24345f, +-0.388436f,0.90322f,-0.182515f, +-0.447323f,0.88531f,-0.126995f, +-0.452109f,0.890067f,-0.0581177f, +-0.409043f,0.912515f,0.000312055f, +-0.489105f,0.872225f,-0.000401423f, +-0.602394f,0.789815f,0.115381f, +-0.644891f,0.727938f,0.232857f, +-0.581256f,0.729671f,0.360168f, +-0.503025f,0.763549f,0.404917f, +-0.449741f,0.833702f,0.320428f, +-0.320295f,0.891402f,0.320645f, +-0.365897f,0.908793f,0.200535f, +-0.418513f,0.900509f,0.118029f, +-0.464312f,0.883882f,0.0562756f, +-0.399182f,0.916811f,0.0105308f, +-0.291715f,0.956056f,-0.0293054f, +-0.237447f,0.965751f,-0.104617f, +-0.100041f,0.966568f,-0.236091f, +0.160871f,0.934989f,-0.316096f, +0.093049f,0.931221f,-0.352375f, +-0.15859f,0.964926f,-0.209204f, +-0.273524f,0.944194f,-0.183526f, +-0.190425f,0.948278f,-0.253984f, +-0.130985f,0.95529f,-0.265074f, +-0.109109f,0.943759f,-0.312112f, +-0.0442587f,0.936376f,-0.348197f, +0.0244075f,0.991066f,0.131121f, +-0.0145509f,0.975134f,0.221137f, +-0.0404534f,0.947565f,0.316994f, +-0.0554847f,0.953641f,0.295787f, +-0.0378486f,0.926136f,0.375287f, +-0.276884f,0.909741f,0.309364f, +-0.35531f,0.878584f,0.319132f, +-0.28855f,0.905318f,0.311668f, +-0.418654f,0.900829f,0.115051f, +-0.470621f,0.881923f,0.0269622f, +-0.302456f,0.950707f,0.0683814f, +-0.155931f,0.981097f,0.114601f, +-0.172528f,0.971746f,0.161072f, +-0.175279f,0.972437f,0.153763f, +-0.0948884f,0.989506f,0.108971f, +-0.271832f,0.96203f,0.0246161f, +-0.434113f,0.899816f,0.0433328f, +-0.41192f,0.910729f,-0.0299284f, +-0.184465f,0.976107f,-0.114836f, +-0.0519711f,0.950434f,-0.306552f, +0.0510061f,0.914254f,-0.401918f, +0.0714878f,0.915457f,-0.396015f, +0.0823148f,0.944294f,-0.318643f, +0.154376f,0.938672f,-0.308322f, +0.218285f,0.948145f,-0.231024f, +0.158935f,0.938404f,-0.306818f, +0.261223f,0.9329f,-0.247912f, +0.285998f,0.932056f,-0.222434f, +0.190198f,0.913869f,-0.358703f, +0.0636773f,0.892218f,-0.447094f, +0.10205f,0.889697f,-0.445f, +0.100031f,0.900986f,-0.422159f, +0.0104969f,0.905423f,-0.424381f, +-0.0688464f,0.910262f,-0.408268f, +-0.0482237f,0.974352f,-0.219802f, +-0.0083558f,0.994225f,-0.106992f, +-0.112134f,0.979056f,-0.169927f, +-0.229912f,0.945374f,-0.231102f, +-0.280533f,0.899591f,-0.334719f, +-0.346884f,0.867971f,-0.355384f, +-0.459064f,0.843199f,-0.279779f, +-0.497889f,0.848119f,-0.181111f, +-0.501207f,0.860371f,-0.0924901f, +-0.458162f,0.888868f,-0.00122281f, +-0.514613f,0.855463f,0.0579275f, +-0.647763f,0.760835f,0.0391491f, +-0.704753f,0.709026f,0.0246046f, +-0.656653f,0.750377f,0.0757771f, +-0.504188f,0.854115f,0.127601f, +-0.41033f,0.905141f,0.111126f, +-0.337511f,0.936543f,0.0947305f, +-0.307169f,0.946112f,0.10256f, +-0.367429f,0.928128f,0.0597776f, +-0.393986f,0.91872f,-0.0269814f, +-0.373766f,0.918684f,-0.127743f, +-0.26114f,0.960116f,-0.0999132f, +-0.103927f,0.984722f,-0.139723f, +0.0511518f,0.955672f,-0.289956f, +0.187205f,0.928701f,-0.320109f, +-0.0295799f,0.970029f,-0.241182f, +-0.314429f,0.940081f,-0.13184f, +-0.185337f,0.978913f,-0.0859053f, +-0.104364f,0.967564f,-0.230061f, +-0.0895833f,0.932754f,-0.349206f, +-0.054587f,0.891296f,-0.450124f, +0.0297567f,0.885691f,-0.463321f, +0.100841f,0.951386f,0.291024f, +-0.0719364f,0.970866f,0.22857f, +-0.0950354f,0.957535f,0.272204f, +-0.063148f,0.9475f,0.313457f, +-0.147905f,0.922206f,0.357295f, +-0.255052f,0.862392f,0.437296f, +-0.348295f,0.831026f,0.433689f, +-0.228735f,0.861593f,0.453141f, +-0.189137f,0.904176f,0.383004f, +-0.40614f,0.912877f,0.041313f, +-0.322035f,0.946605f,-0.0152552f, +-0.213289f,0.976152f,0.0404333f, +-0.216957f,0.96919f,0.116619f, +-0.143471f,0.982181f,0.121395f, +-0.0619809f,0.995307f,0.0743149f, +-0.20303f,0.975599f,0.0835793f, +-0.415979f,0.909172f,0.0191678f, +-0.336954f,0.94062f,-0.0411873f, +-0.0679584f,0.981162f,-0.180839f, +0.116786f,0.956914f,-0.265849f, +0.119526f,0.96094f,-0.249616f, +-0.00488697f,0.95735f,-0.288889f, +0.0539017f,0.947486f,-0.315223f, +0.147321f,0.922615f,-0.35648f, +0.255572f,0.910786f,-0.324272f, +0.156463f,0.885962f,-0.436566f, +0.1301f,0.92297f,-0.362215f, +0.25276f,0.923086f,-0.289871f, +0.383737f,0.889757f,-0.247141f, +0.211205f,0.883014f,-0.419141f, +0.0342331f,0.879599f,-0.474482f, +0.00319575f,0.938694f,-0.344735f, +0.0177214f,0.953292f,-0.301529f, +-0.111253f,0.93857f,-0.326663f, +-0.240335f,0.933381f,-0.26653f, +-0.0538188f,0.987001f,-0.151433f, +-0.0274864f,0.979377f,-0.200162f, +-0.187631f,0.946384f,-0.262966f, +-0.206926f,0.955659f,-0.209519f, +-0.334901f,0.924406f,-0.182523f, +-0.500035f,0.842333f,-0.201099f, +-0.536058f,0.812568f,-0.228857f, +-0.57838f,0.789021f,-0.207176f, +-0.551453f,0.831854f,-0.0625953f, +-0.537806f,0.840551f,0.0651045f, +-0.581123f,0.812541f,0.0455343f, +-0.677773f,0.725811f,-0.117567f, +-0.674512f,0.726391f,-0.131871f, +-0.561194f,0.823313f,-0.0849523f, +-0.426155f,0.904036f,-0.0333265f, +-0.350057f,0.935877f,-0.0399208f, +-0.324764f,0.94579f,-0.0029281f, +-0.334572f,0.942069f,0.0238272f, +-0.264187f,0.96401f,-0.0298196f, +-0.331302f,0.926674f,-0.177522f, +-0.297768f,0.937944f,-0.177749f, +-0.0551409f,0.983889f,-0.170067f, +0.144484f,0.972505f,-0.182644f, +0.119335f,0.96645f,-0.227451f, +-0.0885992f,0.982619f,-0.163126f, +-0.33707f,0.92576f,-0.171324f, +-0.162854f,0.966557f,-0.198108f, +0.0162126f,0.974218f,-0.225026f, +0.138436f,0.947057f,-0.289688f, +0.0835536f,0.876982f,-0.473204f, +-0.010237f,0.848096f,-0.529743f, +0.136921f,0.906371f,0.399681f, +0.0140824f,0.922185f,0.386492f, +-0.160268f,0.929321f,0.33268f, +-0.112451f,0.900092f,0.420938f, +-0.203296f,0.876433f,0.436504f, +-0.322996f,0.829667f,0.455332f, +-0.340765f,0.827757f,0.445755f, +-0.257344f,0.84669f,0.465715f, +0.00366351f,0.865541f,0.500825f, +-0.0425812f,0.956742f,0.287804f, +-0.322344f,0.945159f,-0.052618f, +-0.280797f,0.958795f,-0.0431994f, +-0.262333f,0.964629f,-0.0259446f, +-0.0891831f,0.995449f,-0.0335709f, +-0.0801038f,0.992742f,-0.0896982f, +-0.224206f,0.974484f,0.0105758f, +-0.364477f,0.9309f,-0.0241328f, +-0.198506f,0.970273f,-0.138443f, +0.0492304f,0.955815f,-0.289816f, +0.0465241f,0.961334f,-0.271428f, +0.0147498f,0.993644f,-0.111598f, +0.136409f,0.989222f,-0.0532271f, +0.148553f,0.957532f,-0.247113f, +0.203722f,0.927854f,-0.312384f, +0.268253f,0.883803f,-0.383317f, +0.18614f,0.887058f,-0.422469f, +0.10218f,0.907566f,-0.407286f, +0.200645f,0.878358f,-0.433854f, +0.320433f,0.870875f,-0.372692f, +0.278243f,0.911383f,-0.303252f, +-0.0169368f,0.97379f,-0.226818f, +-0.116502f,0.978925f,-0.16773f, +0.0246686f,0.985931f,-0.165321f, +-0.099417f,0.977857f,-0.184152f, +-0.275352f,0.945128f,-0.175824f, +-0.0928967f,0.974055f,-0.206368f, +0.0664566f,0.97817f,-0.196893f, +-0.180659f,0.959555f,-0.21591f, +-0.356529f,0.924348f,-0.135896f, +-0.392702f,0.919607f,0.0104344f, +-0.427591f,0.903919f,-0.00980201f, +-0.491673f,0.851131f,-0.183941f, +-0.597871f,0.779934f,-0.185076f, +-0.630214f,0.771159f,-0.0902474f, +-0.603795f,0.796392f,-0.0345128f, +-0.532942f,0.846043f,0.013577f, +-0.560658f,0.826581f,-0.049261f, +-0.693149f,0.692482f,-0.200033f, +-0.591049f,0.792583f,-0.14991f, +-0.423413f,0.894971f,-0.14053f, +-0.360923f,0.922234f,-0.138633f, +-0.376728f,0.924323f,-0.0608465f, +-0.330964f,0.94352f,-0.0152562f, +-0.205049f,0.976512f,-0.0661789f, +-0.221147f,0.966952f,-0.126878f, +-0.282753f,0.933366f,-0.221083f, +-0.0599842f,0.959615f,-0.274846f, +0.119046f,0.947951f,-0.295324f, +0.164559f,0.948383f,-0.27109f, +-0.0951076f,0.948417f,-0.302424f, +-0.271887f,0.913351f,-0.303098f, +-0.128933f,0.917201f,-0.376985f, +0.0280066f,0.909443f,-0.414885f, +0.150608f,0.898143f,-0.413106f, +0.212115f,0.88838f,-0.407172f, +0.0467869f,0.87371f,-0.484191f, +0.135605f,0.903203f,0.407228f, +-0.01172f,0.896648f,0.44259f, +-0.138887f,0.847422f,0.512432f, +-0.170991f,0.843044f,0.50994f, +-0.191878f,0.839246f,0.508772f, +-0.300268f,0.838171f,0.455311f, +-0.32966f,0.831286f,0.447535f, +-0.223175f,0.877254f,0.424992f, +-0.0256774f,0.953915f,0.298977f, +0.199545f,0.913698f,0.354031f, +-0.0319727f,0.980881f,0.191963f, +-0.258985f,0.964126f,-0.0582107f, +-0.212788f,0.970943f,-0.109502f, +-0.0721792f,0.982085f,-0.174064f, +-0.0849627f,0.985898f,-0.144175f, +-0.290021f,0.949136f,-0.122591f, +-0.248272f,0.954348f,-0.166075f, +-0.0507313f,0.942327f,-0.330828f, +0.0792104f,0.910775f,-0.405234f, +-0.0679775f,0.927432f,-0.367762f, +-0.0963141f,0.945938f,-0.309718f, +0.147422f,0.952479f,-0.266555f, +0.232988f,0.930423f,-0.282895f, +0.296671f,0.921407f,-0.250989f, +0.346023f,0.880014f,-0.325337f, +0.246011f,0.893818f,-0.374924f, +0.0779935f,0.862828f,-0.499444f, +0.218748f,0.861753f,-0.457746f, +0.236169f,0.890523f,-0.388836f, +0.122215f,0.968128f,-0.218613f, +-0.119249f,0.983741f,-0.134288f, +-0.0975043f,0.983669f,-0.151287f, +0.0551556f,0.975975f,-0.210786f, +-0.0858442f,0.972611f,-0.216008f, +-0.228301f,0.939116f,-0.256789f, +-0.0600278f,0.94195f,-0.330342f, +-0.00498162f,0.954835f,-0.297095f, +-0.236752f,0.956732f,-0.169151f, +-0.404481f,0.905728f,-0.126698f, +-0.442956f,0.884106f,-0.148815f, +-0.353117f,0.929811f,-0.103732f, +-0.367684f,0.920274f,-0.133808f, +-0.620195f,0.758926f,-0.19847f, +-0.650875f,0.742352f,-0.158981f, +-0.60395f,0.783223f,-0.147668f, +-0.562027f,0.815077f,-0.140626f, +-0.504739f,0.855197f,-0.117796f, +-0.629314f,0.743816f,-0.22517f, +-0.590837f,0.750634f,-0.295736f, +-0.432954f,0.842346f,-0.320942f, +-0.414184f,0.8722f,-0.260227f, +-0.438355f,0.884876f,-0.157606f, +-0.309198f,0.940747f,-0.13925f, +-0.155389f,0.967122f,-0.20132f, +-0.14424f,0.961525f,-0.233805f, +-0.235758f,0.924f,-0.301067f, +0.0151186f,0.960375f,-0.278299f, +0.144315f,0.944571f,-0.294888f, +0.112415f,0.964242f,-0.239999f, +-0.0426025f,0.977992f,-0.204249f, +-0.206795f,0.910666f,-0.357663f, +-0.0742651f,0.885367f,-0.458922f, +0.0946583f,0.875247f,-0.474324f, +0.121834f,0.836586f,-0.534117f, +0.198513f,0.859849f,-0.470374f, +0.17646f,0.872184f,-0.456242f, +0.0304109f,0.916616f,0.39861f, +-0.119037f,0.881644f,0.456655f, +-0.241587f,0.81204f,0.53125f, +-0.146676f,0.796898f,0.586037f, +-0.0991089f,0.808485f,0.580111f, +-0.265015f,0.835696f,0.481019f, +-0.330941f,0.833473f,0.442495f, +-0.0736129f,0.908742f,0.410816f, +0.128357f,0.956244f,0.26291f, +0.135386f,0.977167f,0.163754f, +0.135126f,0.969499f,0.204482f, +-0.0826833f,0.991706f,0.0984031f, +-0.125203f,0.992066f,-0.0113628f, +-0.0793175f,0.988189f,-0.131112f, +-0.135148f,0.988869f,-0.0622353f, +-0.236045f,0.96998f,-0.0584937f, +-0.106098f,0.976702f,-0.186536f, +0.0734477f,0.937214f,-0.340932f, +0.0657813f,0.913127f,-0.402333f, +-0.0656411f,0.925185f,-0.373797f, +-0.0812155f,0.911514f,-0.403169f, +0.138018f,0.895606f,-0.422895f, +0.180346f,0.87052f,-0.457898f, +0.220345f,0.874256f,-0.43258f, +0.337626f,0.867122f,-0.366208f, +0.351448f,0.893332f,-0.280076f, +0.206919f,0.931373f,-0.299548f, +0.143612f,0.950749f,-0.274684f, +0.0388897f,0.972032f,-0.231606f, +-0.0281782f,0.996586f,-0.077599f, +-0.0348963f,0.997716f,-0.0578427f, +-0.0315338f,0.968969f,-0.245163f, +0.0536322f,0.969299f,-0.239965f, +-0.0592746f,0.980608f,-0.186802f, +-0.146447f,0.958871f,-0.243144f, +-0.0489008f,0.966653f,-0.251379f, +-0.0921771f,0.973026f,-0.211482f, +-0.303489f,0.921788f,-0.24125f, +-0.360359f,0.892722f,-0.270533f, +-0.374413f,0.86994f,-0.320965f, +-0.420297f,0.839321f,-0.344805f, +-0.400389f,0.890168f,-0.217463f, +-0.5519f,0.817694f,-0.163655f, +-0.641175f,0.723209f,-0.25664f, +-0.591295f,0.757829f,-0.275801f, +-0.562781f,0.775127f,-0.287152f, +-0.492934f,0.830818f,-0.258375f, +-0.559738f,0.799568f,-0.21768f, +-0.572862f,0.78051f,-0.250266f, +-0.449965f,0.836305f,-0.31325f, +-0.485973f,0.815927f,-0.313197f, +-0.461831f,0.850292f,-0.252418f, +-0.261301f,0.911823f,-0.316702f, +-0.0988633f,0.911184f,-0.399961f, +-0.117544f,0.902602f,-0.414118f, +-0.193385f,0.896249f,-0.399173f, +-0.121448f,0.924471f,-0.361392f, +0.0924319f,0.986306f,-0.136592f, +0.0129691f,0.994218f,-0.106593f, +0.0478938f,0.996018f,-0.0752017f, +0.0322924f,0.95892f,-0.281832f, +0.0176709f,0.880909f,-0.472956f, +0.117774f,0.85642f,-0.502666f, +0.141956f,0.850649f,-0.506206f, +0.133057f,0.865588f,-0.482757f, +0.139695f,0.858438f,-0.493528f, +-0.227309f,0.878161f,0.420907f, +-0.208802f,0.809453f,0.548805f, +-0.283627f,0.767885f,0.574377f, +-0.166581f,0.77975f,0.603523f, +-0.0979994f,0.806409f,0.583181f, +-0.132228f,0.805326f,0.577898f, +-0.219374f,0.878043f,0.425342f, +-0.024745f,0.955845f,0.292828f, +0.235018f,0.923494f,0.303193f, +0.225806f,0.944421f,0.238915f, +0.125193f,0.981151f,0.147203f, +-0.0300197f,0.990754f,0.132305f, +-0.0418198f,0.992604f,0.113964f, +0.010498f,0.998335f,0.0567192f, +-0.187859f,0.981941f,-0.0223995f, +-0.164152f,0.985849f,-0.0340039f, +-0.00148231f,0.989313f,-0.145799f, +0.214865f,0.96059f,-0.176353f, +0.130927f,0.950976f,-0.280185f, +-0.0784848f,0.932131f,-0.353513f, +-0.05291f,0.922588f,-0.382142f, +0.16861f,0.90111f,-0.399463f, +0.291627f,0.864919f,-0.408495f, +0.209787f,0.830907f,-0.515347f, +0.211969f,0.855025f,-0.473287f, +0.179371f,0.927145f,-0.328982f, +0.0938016f,0.98223f,-0.162562f, +0.0948278f,0.994302f,-0.0487031f, +0.0439203f,0.998532f,-0.0316906f, +-0.0612398f,0.9958f,-0.0680553f, +0.0442323f,0.992295f,-0.115732f, +0.0938163f,0.983362f,-0.155559f, +-0.00984882f,0.984434f,-0.175479f, +-0.064778f,0.984002f,-0.165961f, +-0.129271f,0.96358f,-0.234101f, +-0.126642f,0.968315f,-0.215238f, +-0.066296f,0.988071f,-0.138997f, +-0.153283f,0.960153f,-0.233691f, +-0.288259f,0.887225f,-0.360193f, +-0.349196f,0.862768f,-0.365641f, +-0.457337f,0.833523f,-0.309971f, +-0.510223f,0.838902f,-0.189514f, +-0.576482f,0.813491f,-0.0768136f, +-0.627022f,0.773599f,-0.0915885f, +-0.562811f,0.806938f,-0.179152f, +-0.554556f,0.77173f,-0.31129f, +-0.544029f,0.784112f,-0.298665f, +-0.593089f,0.773019f,-0.225135f, +-0.565758f,0.788678f,-0.240633f, +-0.424914f,0.871459f,-0.244963f, +-0.461935f,0.845882f,-0.266647f, +-0.437432f,0.833935f,-0.336461f, +-0.166572f,0.89804f,-0.407159f, +-0.027465f,0.893903f,-0.447419f, +-0.142495f,0.890824f,-0.431426f, +-0.254187f,0.896659f,-0.36248f, +-0.245781f,0.925153f,-0.289282f, +-0.124728f,0.970098f,-0.208211f, +0.0496061f,0.995502f,-0.0807218f, +0.134453f,0.977049f,-0.165221f, +0.178593f,0.948688f,-0.260952f, +0.203783f,0.948389f,-0.242962f, +0.169172f,0.89845f,-0.405178f, +0.129822f,0.855112f,-0.501925f, +0.114157f,0.849198f,-0.515587f, +0.207913f,0.855521f,-0.47419f, +-0.447508f,0.787815f,0.423184f, +-0.372189f,0.752087f,0.543911f, +-0.298757f,0.721076f,0.625135f, +-0.109779f,0.732409f,0.671956f, +-0.05023f,0.773443f,0.631872f, +-0.0721375f,0.784971f,0.615319f, +0.0161123f,0.834678f,0.550503f, +0.0881584f,0.925537f,0.368252f, +0.194291f,0.939133f,0.283338f, +0.290284f,0.915951f,0.277072f, +0.206501f,0.959193f,0.193147f, +0.0129994f,0.989588f,0.143339f, +-0.0515539f,0.993638f,0.100126f, +0.0752528f,0.992857f,0.0925807f, +-0.11243f,0.993659f,-0.00132253f, +-0.0900456f,0.995381f,-0.0332891f, +0.0735618f,0.988585f,-0.131483f, +0.187914f,0.97058f,-0.150539f, +0.259537f,0.959521f,-0.109363f, +0.039582f,0.950958f,-0.306778f, +0.0151247f,0.899216f,-0.437243f, +0.157602f,0.861329f,-0.482984f, +0.313265f,0.852495f,-0.41847f, +0.26241f,0.877515f,-0.401384f, +0.106606f,0.940488f,-0.322671f, +0.0451106f,0.964729f,-0.259351f, +-0.0198008f,0.966294f,-0.256677f, +0.0415355f,0.979836f,-0.195439f, +0.019077f,0.98811f,-0.15256f, +0.00843283f,0.995377f,-0.095676f, +0.0813095f,0.98616f,-0.14449f, +0.0601215f,0.98288f,-0.174159f, +0.0231889f,0.98066f,-0.194342f, +-0.0257967f,0.969536f,-0.243588f, +-0.0655874f,0.972755f,-0.222364f, +-0.116074f,0.960607f,-0.252509f, +-0.11539f,0.952331f,-0.282402f, +-0.0547002f,0.971779f,-0.229464f, +-0.238443f,0.921749f,-0.305817f, +-0.409013f,0.87493f,-0.259242f, +-0.537403f,0.830349f,-0.147369f, +-0.604026f,0.794872f,-0.0577237f, +-0.636334f,0.771366f,0.00856593f, +-0.598176f,0.796287f,0.0900769f, +-0.445184f,0.894265f,0.0458439f, +-0.510078f,0.851049f,-0.124644f, +-0.584904f,0.80616f,-0.0894032f, +-0.566358f,0.809139f,-0.156631f, +-0.526778f,0.78194f,-0.333278f, +-0.411595f,0.815587f,-0.406703f, +-0.430581f,0.806825f,-0.404517f, +-0.346574f,0.828739f,-0.439406f, +-0.163187f,0.84355f,-0.511658f, +-0.120565f,0.900123f,-0.41862f, +-0.22033f,0.94784f,-0.230335f, +-0.354954f,0.922144f,-0.15381f, +-0.229701f,0.962171f,-0.146509f, +-0.156358f,0.938689f,-0.30727f, +-0.0202846f,0.954287f,-0.298202f, +0.237025f,0.938874f,-0.24967f, +0.153523f,0.923965f,-0.350312f, +0.146234f,0.948682f,-0.280389f, +0.334575f,0.915861f,-0.221942f, +0.32488f,0.905199f,-0.273985f, +0.124349f,0.918374f,-0.375668f, +0.0853809f,0.932635f,-0.350575f, +-0.326098f,0.745953f,0.580702f, +-0.408924f,0.742079f,0.53113f, +-0.380928f,0.732802f,0.563822f, +-0.135265f,0.771831f,0.621274f, +0.0172939f,0.791015f,0.611552f, +-0.0321407f,0.821651f,0.569084f, +0.110827f,0.821493f,0.559345f, +0.260047f,0.831043f,0.491674f, +0.30077f,0.882298f,0.362061f, +0.33436f,0.910333f,0.243922f, +0.27591f,0.939307f,0.203903f, +0.0278945f,0.981912f,0.18727f, +-0.00885636f,0.980185f,0.197887f, +0.145141f,0.978135f,0.148949f, +-0.0144219f,0.999761f,0.0164012f, +-0.0725846f,0.989236f,-0.127057f, +0.156537f,0.975005f,-0.157677f, +0.153594f,0.966224f,-0.206929f, +0.277291f,0.95249f,-0.125986f, +0.254121f,0.951784f,-0.171844f, +0.192884f,0.934802f,-0.298229f, +0.176671f,0.893747f,-0.412315f, +0.195208f,0.917965f,-0.345303f, +0.157451f,0.974963f,-0.157023f, +0.0279983f,0.991052f,-0.13051f, +0.088609f,0.976865f,-0.194637f, +0.0507072f,0.953301f,-0.297735f, +-0.0277167f,0.944799f,-0.326477f, +-0.027462f,0.967827f,-0.250115f, +-0.0885824f,0.972427f,-0.215728f, +0.0938124f,0.990405f,-0.101477f, +0.168783f,0.975825f,-0.138845f, +0.111665f,0.949064f,-0.294633f, +-0.0373777f,0.928827f,-0.368623f, +-0.132876f,0.934016f,-0.3316f, +-0.0938993f,0.959978f,-0.263865f, +-0.105226f,0.962669f,-0.249392f, +-0.104341f,0.966883f,-0.232916f, +-0.220802f,0.965347f,-0.13911f, +-0.478375f,0.876928f,-0.0464122f, +-0.604444f,0.796064f,0.0305022f, +-0.611643f,0.789038f,0.0575453f, +-0.651561f,0.758511f,-0.0113831f, +-0.622019f,0.781788f,-0.0435906f, +-0.406862f,0.913403f,-0.012587f, +-0.447294f,0.893518f,0.0394196f, +-0.595605f,0.801728f,0.049859f, +-0.453119f,0.890822f,0.0334497f, +-0.397535f,0.913376f,-0.0878049f, +-0.358743f,0.901381f,-0.242521f, +-0.368468f,0.876571f,-0.309604f, +-0.3524f,0.834147f,-0.42428f, +-0.221095f,0.907887f,-0.356171f, +-0.336012f,0.912731f,-0.232418f, +-0.365521f,0.924164f,-0.110978f, +-0.381997f,0.913352f,-0.140951f, +-0.128103f,0.980976f,-0.145863f, +0.0620369f,0.958271f,-0.279048f, +-0.0393717f,0.894694f,-0.44494f, +0.166576f,0.906235f,-0.388576f, +0.257306f,0.912784f,-0.317204f, +0.0500832f,0.912737f,-0.405466f, +0.219062f,0.950498f,-0.220374f, +0.303476f,0.949102f,-0.0843104f, +0.167756f,0.983709f,-0.0646101f, +-0.00137806f,0.991718f,-0.128423f, +-0.411803f,0.737245f,0.535619f, +-0.383529f,0.716567f,0.582612f, +-0.385829f,0.756694f,0.527779f, +-0.125894f,0.866623f,0.482821f, +0.0864817f,0.885592f,0.456341f, +0.0185611f,0.909875f,0.414467f, +0.0890012f,0.92755f,0.362947f, +0.3312f,0.85507f,0.39895f, +0.411118f,0.842585f,0.347898f, +0.395768f,0.87253f,0.286458f, +0.265631f,0.912624f,0.310738f, +0.0432866f,0.942781f,0.330591f, +-0.0291247f,0.959608f,0.279829f, +0.17674f,0.935093f,0.307187f, +0.194038f,0.946511f,0.25781f, +0.0938941f,0.995535f,0.00965941f, +0.2133f,0.967919f,-0.132802f, +0.174202f,0.951285f,-0.254382f, +0.185706f,0.942688f,-0.277223f, +0.254853f,0.951817f,-0.170569f, +0.272452f,0.946195f,-0.174599f, +0.236374f,0.944357f,-0.228728f, +0.0622104f,0.974295f,-0.216517f, +0.00421412f,0.994674f,-0.102989f, +0.150974f,0.988535f,0.00252771f, +0.198367f,0.972494f,-0.122094f, +0.128147f,0.983415f,-0.128347f, +0.00128047f,0.972843f,-0.231463f, +-0.0877992f,0.94046f,-0.328368f, +-0.123322f,0.945018f,-0.302876f, +0.0120775f,0.960206f,-0.279033f, +0.230563f,0.945381f,-0.230424f, +0.231597f,0.934072f,-0.271795f, +0.0492688f,0.934225f,-0.353265f, +-0.160672f,0.892999f,-0.4204f, +-0.160391f,0.913064f,-0.374951f, +-0.146451f,0.932705f,-0.329565f, +-0.203905f,0.952995f,-0.224107f, +-0.374034f,0.927408f,-0.00361175f, +-0.538909f,0.826945f,0.160435f, +-0.614792f,0.776175f,0.139939f, +-0.589081f,0.79961f,0.116649f, +-0.558852f,0.827241f,0.0579274f, +-0.582196f,0.802416f,-0.131063f, +-0.51435f,0.846005f,-0.140428f, +-0.52517f,0.850476f,0.0297862f, +-0.596917f,0.80173f,0.0303285f, +-0.476386f,0.879145f,0.0126877f, +-0.346071f,0.935165f,0.0755073f, +-0.29506f,0.953573f,0.0603189f, +-0.290873f,0.956376f,0.0271545f, +-0.342792f,0.934849f,-0.0924672f, +-0.36131f,0.919889f,-0.152511f, +-0.440677f,0.895263f,-0.0656364f, +-0.27224f,0.960453f,-0.0584458f, +-0.239345f,0.939791f,-0.243941f, +-0.184322f,0.924268f,-0.334296f, +0.170265f,0.967851f,-0.185131f, +0.0831722f,0.975078f,-0.205681f, +0.0764752f,0.962386f,-0.2607f, +0.25092f,0.948574f,-0.192995f, +-0.000511184f,0.983325f,-0.181855f, +0.00805518f,0.99922f,-0.0386666f, +0.231558f,0.969957f,0.0745867f, +0.213284f,0.97378f,0.0791335f, +0.134707f,0.990255f,0.0353415f, +-0.461887f,0.727903f,0.506772f, +-0.409704f,0.769768f,0.48949f, +-0.245031f,0.85373f,0.459461f, +-0.000652498f,0.933053f,0.359739f, +0.0977619f,0.940993f,0.323999f, +0.0976539f,0.925223f,0.366641f, +0.122528f,0.958779f,0.256377f, +0.300256f,0.92807f,0.220301f, +0.434057f,0.868364f,0.239872f, +0.373936f,0.875783f,0.305249f, +0.188752f,0.892291f,0.41011f, +0.0749298f,0.875078f,0.478146f, +0.0539526f,0.905587f,0.420716f, +0.139771f,0.930537f,0.338475f, +0.252071f,0.902374f,0.349544f, +0.271241f,0.91149f,0.309214f, +0.343876f,0.91657f,0.204082f, +0.324141f,0.940857f,0.098591f, +0.18373f,0.982977f,-0.000581414f, +0.215424f,0.976468f,-0.0101277f, +0.272942f,0.961141f,-0.0413737f, +0.263192f,0.964688f,-0.010384f, +0.0834313f,0.988492f,-0.126183f, +-0.0244777f,0.972824f,-0.230248f, +0.037395f,0.972598f,-0.229465f, +0.188221f,0.98005f,-0.0638298f, +0.133895f,0.99093f,-0.0113778f, +0.15553f,0.985289f,-0.0708293f, +0.062154f,0.97927f,-0.19279f, +-0.0906565f,0.929896f,-0.356476f, +-0.00537849f,0.905315f,-0.424706f, +0.162604f,0.918237f,-0.361109f, +0.211297f,0.942163f,-0.260159f, +0.166674f,0.959094f,-0.22882f, +-0.0900843f,0.919646f,-0.382278f, +-0.185542f,0.891522f,-0.413234f, +-0.236454f,0.911319f,-0.337026f, +-0.404129f,0.904849f,-0.133894f, +-0.540771f,0.839361f,0.0551279f, +-0.598434f,0.794978f,0.0994372f, +-0.56944f,0.810652f,0.136315f, +-0.572323f,0.818089f,0.0563579f, +-0.472334f,0.880613f,0.0376913f, +-0.539685f,0.840552f,-0.0470301f, +-0.574258f,0.816988f,0.0525225f, +-0.582793f,0.802613f,0.127141f, +-0.577964f,0.810669f,0.0936681f, +-0.453297f,0.886551f,0.0924669f, +-0.392456f,0.918879f,0.0405067f, +-0.316387f,0.94595f,0.0712573f, +-0.278453f,0.953269f,0.117224f, +-0.268053f,0.957793f,0.103824f, +-0.307148f,0.94927f,0.0674248f, +-0.42059f,0.907249f,-0.00173726f, +-0.259446f,0.962613f,-0.0778756f, +-0.0851837f,0.992966f,-0.082236f, +-0.215247f,0.960313f,-0.177393f, +-0.0219544f,0.989556f,-0.14247f, +0.0391647f,0.99769f,-0.0555004f, +0.102045f,0.994433f,0.0262785f, +0.194292f,0.978837f,0.0642512f, +-0.0292693f,0.988875f,0.145839f, +-0.101853f,0.986247f,0.130166f, +0.212882f,0.964861f,0.15403f, +0.245798f,0.960888f,0.127587f, +0.195444f,0.974318f,0.111832f, +-0.321858f,0.809731f,0.490656f, +-0.324834f,0.8531f,0.408293f, +-0.169338f,0.931652f,0.321478f, +0.0137661f,0.965459f,0.260189f, +0.0568655f,0.931751f,0.358619f, +0.0773718f,0.91837f,0.388084f, +0.261047f,0.911575f,0.317625f, +0.360487f,0.919759f,0.155217f, +0.377368f,0.917164f,0.128078f, +0.276887f,0.917903f,0.284232f, +0.0739314f,0.913495f,0.400076f, +0.00592871f,0.863726f,0.503926f, +0.12818f,0.830694f,0.541773f, +0.218813f,0.849726f,0.479673f, +0.242686f,0.877276f,0.414115f, +0.274843f,0.886896f,0.371318f, +0.349234f,0.864992f,0.360313f, +0.316807f,0.866747f,0.385206f, +0.243026f,0.8884f,0.389467f, +0.293176f,0.904042f,0.311057f, +0.24905f,0.947495f,0.200568f, +0.307601f,0.926121f,0.21836f, +0.250581f,0.964737f,0.0805682f, +0.134636f,0.99035f,-0.0328548f, +0.000251354f,0.985828f,-0.167762f, +0.0218107f,0.990992f,-0.132131f, +0.159951f,0.984761f,-0.068279f, +0.165852f,0.977778f,-0.128229f, +0.162621f,0.98447f,-0.06613f, +0.121502f,0.975682f,-0.182435f, +0.0565286f,0.935574f,-0.348576f, +0.0461029f,0.9227f,-0.382752f, +0.0939341f,0.947555f,-0.305477f, +0.144515f,0.970016f,-0.195409f, +0.0775217f,0.989125f,-0.124991f, +-0.200827f,0.965332f,-0.16674f, +-0.401609f,0.907839f,-0.120577f, +-0.559375f,0.828885f,-0.00699655f, +-0.565805f,0.821746f,0.0678162f, +-0.593147f,0.804311f,0.0354918f, +-0.576294f,0.817225f,0.00543077f, +-0.525544f,0.848999f,-0.0548173f, +-0.499547f,0.863338f,-0.0714126f, +-0.553806f,0.830814f,0.0551944f, +-0.639015f,0.755184f,0.146141f, +-0.555848f,0.812796f,0.174341f, +-0.558245f,0.826947f,0.0672363f, +-0.433561f,0.898303f,0.0712505f, +-0.328723f,0.942541f,0.0596481f, +-0.348698f,0.936876f,0.0259581f, +-0.301092f,0.95068f,0.0745005f, +-0.263015f,0.962594f,0.0650869f, +-0.284818f,0.957539f,0.0446894f, +-0.359379f,0.932627f,-0.032449f, +-0.231945f,0.967322f,-0.102417f, +-0.134462f,0.989922f,-0.0444264f, +-0.162306f,0.986023f,0.0376183f, +0.00794699f,0.998548f,-0.0532871f, +-0.0239448f,0.993657f,-0.109874f, +-0.0216422f,0.99782f,0.0623378f, +0.109723f,0.978713f,0.173443f, +-0.0637399f,0.980084f,0.188075f, +-0.0488189f,0.981371f,0.185814f, +0.215314f,0.95546f,0.201833f, +0.226954f,0.944659f,0.236876f, +0.18874f,0.93582f,0.297688f, +-0.35388f,0.863488f,0.359384f, +-0.279389f,0.900607f,0.332938f, +-0.0980507f,0.952584f,0.288043f, +-0.0324622f,0.946395f,0.321377f, +-0.0380375f,0.913004f,0.406173f, +0.128955f,0.929408f,0.345792f, +0.375928f,0.898621f,0.226181f, +0.446257f,0.883274f,0.143813f, +0.289683f,0.938589f,0.187442f, +0.125289f,0.928145f,0.350499f, +-0.0288389f,0.895239f,0.444652f, +-0.103894f,0.871209f,0.479793f, +0.105997f,0.859294f,0.500378f, +0.239743f,0.842088f,0.483127f, +0.302444f,0.818919f,0.48775f, +0.351983f,0.830309f,0.432082f, +0.318807f,0.868172f,0.380315f, +0.306771f,0.857612f,0.412787f, +0.273726f,0.881543f,0.384651f, +0.337032f,0.866043f,0.369295f, +0.363605f,0.874829f,0.320103f, +0.334634f,0.927168f,0.168463f, +0.372292f,0.916204f,0.148217f, +0.206342f,0.978274f,0.0200943f, +0.119354f,0.989819f,-0.077546f, +0.042858f,0.974765f,-0.21908f, +0.15227f,0.956258f,-0.24977f, +0.17642f,0.955622f,-0.235928f, +0.119264f,0.963567f,-0.239406f, +0.210452f,0.949288f,-0.233584f, +0.171674f,0.93622f,-0.306626f, +0.0511268f,0.942128f,-0.331333f, +0.00960037f,0.978635f,-0.205381f, +-0.00181509f,0.99884f,-0.048118f, +-0.0483779f,0.993619f,0.101885f, +-0.221067f,0.964285f,0.145887f, +-0.435375f,0.898142f,0.0615596f, +-0.544434f,0.838804f,-0.00062539f, +-0.579913f,0.810216f,-0.0851529f, +-0.5726f,0.815766f,-0.0815813f, +-0.546649f,0.832873f,-0.0865884f, +-0.465735f,0.88205f,-0.071268f, +-0.55864f,0.824018f,-0.0944285f, +-0.642115f,0.765228f,0.0459774f, +-0.656804f,0.753752f,0.0216163f, +-0.520592f,0.853762f,0.00863503f, +-0.481258f,0.875004f,-0.0525228f, +-0.443379f,0.889071f,-0.113874f, +-0.339817f,0.937077f,-0.0800719f, +-0.346478f,0.935462f,-0.0697409f, +-0.350474f,0.934462f,-0.0628307f, +-0.228751f,0.97348f,-0.00313391f, +-0.230759f,0.970493f,-0.0699589f, +-0.279469f,0.954379f,-0.105155f, +-0.198889f,0.96686f,-0.16008f, +-0.230529f,0.946681f,-0.225058f, +-0.14204f,0.970201f,-0.196301f, +0.0687794f,0.962113f,-0.263834f, +-0.0677159f,0.979986f,-0.187196f, +-0.220027f,0.972288f,-0.0790245f, +0.07326f,0.993712f,0.0846721f, +-0.0289367f,0.993146f,0.113239f, +-0.106822f,0.986395f,0.124957f, +0.128381f,0.967004f,0.22005f, +0.141757f,0.945235f,0.293998f, +0.0274083f,0.95189f,0.30521f, +-0.150915f,0.940582f,0.304189f, +-0.174369f,0.970549f,0.166222f, +-0.140821f,0.979995f,0.140639f, +-0.141606f,0.959082f,0.245171f, +0.011894f,0.972798f,0.23135f, +0.262326f,0.961504f,0.0818187f, +0.456393f,0.889018f,0.036791f, +0.382632f,0.920315f,0.0813253f, +0.174752f,0.942069f,0.286301f, +-0.045852f,0.917014f,0.396211f, +-0.0633233f,0.882412f,0.466197f, +-0.0422981f,0.919143f,0.391647f, +0.126089f,0.949054f,0.288786f, +0.256733f,0.912921f,0.317275f, +0.315104f,0.887032f,0.337468f, +0.409846f,0.864148f,0.292018f, +0.343944f,0.901166f,0.263823f, +0.312798f,0.897029f,0.312244f, +0.323227f,0.888441f,0.325879f, +0.342446f,0.89904f,0.272869f, +0.451059f,0.860524f,0.236736f, +0.423682f,0.891569f,0.159992f, +0.404089f,0.899665f,0.165275f, +0.34072f,0.934631f,0.101855f, +0.255675f,0.966712f,-0.00994645f, +0.192495f,0.972523f,-0.130939f, +0.146493f,0.95759f,-0.248115f, +0.177747f,0.950895f,-0.253387f, +0.10258f,0.958737f,-0.265144f, +0.233714f,0.956929f,-0.172236f, +0.223818f,0.95591f,-0.190111f, +-0.0753718f,0.974181f,-0.212814f, +-0.223858f,0.97386f,-0.0385406f, +-0.201603f,0.967155f,0.154817f, +-0.110966f,0.95618f,0.270934f, +-0.121146f,0.966863f,0.224722f, +-0.291476f,0.94891f,0.120877f, +-0.477923f,0.877529f,-0.0391374f, +-0.509066f,0.849204f,-0.140369f, +-0.547573f,0.807834f,-0.218101f, +-0.563212f,0.785973f,-0.255028f, +-0.550783f,0.817799f,-0.166865f, +-0.567941f,0.823056f,0.00472398f, +-0.662541f,0.748994f,-0.00687841f, +-0.61971f,0.78387f,-0.03883f, +-0.523314f,0.847679f,-0.0870804f, +-0.447797f,0.889814f,-0.0877948f, +-0.443749f,0.888577f,-0.116264f, +-0.376466f,0.920201f,-0.107257f, +-0.337652f,0.938208f,-0.0758775f, +-0.365552f,0.926461f,-0.0896778f, +-0.259904f,0.962681f,-0.0754604f, +-0.126151f,0.988548f,-0.0828222f, +-0.30144f,0.926166f,-0.226606f, +-0.124801f,0.973148f,-0.193411f, +-0.0842547f,0.941418f,-0.326548f, +-0.0799027f,0.902475f,-0.423267f, +-0.00736616f,0.932864f,-0.360152f, +-0.199402f,0.957181f,-0.209865f, +-0.285967f,0.938676f,-0.192641f, +-0.0884894f,0.987166f,-0.132941f, +-0.0982017f,0.994337f,0.0406204f, +-0.151395f,0.982648f,0.107153f, +0.0310104f,0.988838f,0.14573f, +0.106405f,0.964191f,0.242925f, +0.070474f,0.952157f,0.297374f, +0.0656706f,0.9919f,0.108725f, +-0.0894851f,0.995828f,0.0178395f, +-0.190523f,0.981135f,0.0327999f, +-0.155304f,0.987556f,0.0247798f, +0.115224f,0.991572f,-0.0592235f, +0.36579f,0.920032f,-0.140496f, +0.356271f,0.926984f,-0.117348f, +0.248335f,0.959842f,0.130508f, +0.000801886f,0.966476f,0.256755f, +-0.114974f,0.940419f,0.319989f, +-0.0524682f,0.940494f,0.335734f, +0.129742f,0.951002f,0.280646f, +0.183656f,0.974747f,0.127042f, +0.210533f,0.964529f,0.159247f, +0.299776f,0.935816f,0.185429f, +0.476652f,0.857927f,0.191739f, +0.365421f,0.920615f,0.137608f, +0.247354f,0.961561f,0.119232f, +0.333488f,0.932256f,0.140299f, +0.428629f,0.898219f,0.0973634f, +0.470887f,0.881687f,0.0298847f, +0.443595f,0.892268f,0.0841461f, +0.38152f,0.920309f,0.0864469f, +0.381462f,0.916941f,0.117074f, +0.327497f,0.93955f,0.099957f, +0.304803f,0.952409f,-0.00357992f, +0.239937f,0.959204f,-0.149528f, +0.202117f,0.965308f,-0.165315f, +0.0495866f,0.988011f,-0.146203f, +0.0854477f,0.995976f,-0.027023f, +0.244078f,0.956317f,0.160886f, +-0.0753613f,0.986424f,0.145905f, +-0.339089f,0.932874f,0.12151f, +-0.294837f,0.942606f,0.15673f, +-0.104304f,0.973462f,0.203698f, +-0.0723227f,0.985619f,0.152724f, +-0.210009f,0.973927f,0.0858055f, +-0.391811f,0.919671f,-0.0262484f, +-0.442429f,0.895892f,-0.0404195f, +-0.501975f,0.857758f,-0.11078f, +-0.516547f,0.834688f,-0.190982f, +-0.606461f,0.747704f,-0.270451f, +-0.650373f,0.745527f,-0.145618f, +-0.638901f,0.762805f,-0.0996673f, +-0.598555f,0.785548f,-0.156994f, +-0.501024f,0.846694f,-0.179123f, +-0.446137f,0.875545f,-0.185426f, +-0.431282f,0.886668f,-0.16678f, +-0.409115f,0.903871f,-0.125073f, +-0.364534f,0.929271f,-0.0597475f, +-0.342967f,0.93838f,-0.0426101f, +-0.26831f,0.95962f,-0.0844963f, +-0.0393852f,0.992201f,-0.118264f, +-0.116204f,0.958118f,-0.261737f, +-0.10396f,0.911216f,-0.398596f, +0.0690263f,0.90803f,-0.41318f, +-0.107766f,0.879323f,-0.463872f, +-0.204112f,0.904181f,-0.375227f, +-0.300499f,0.93243f,-0.200683f, +-0.27347f,0.953749f,-0.124807f, +-0.169754f,0.978593f,-0.116359f, +-0.231778f,0.970053f,-0.072634f, +-0.190395f,0.98166f,0.00964305f, +-0.0305984f,0.996687f,0.0753532f, +0.015862f,0.984083f,0.177002f, +-0.0353434f,0.980638f,0.192612f, +-0.00358253f,0.996067f,-0.0885361f, +-0.091201f,0.995656f,-0.0187243f, +-0.182622f,0.982071f,0.0467509f, +-0.0739202f,0.997106f,-0.017751f, +0.154438f,0.971547f,-0.179571f, +0.395535f,0.904532f,-0.159291f, +0.194508f,0.960754f,-0.197781f, +0.113269f,0.98581f,0.123894f, +-0.030891f,0.963944f,0.264306f, +-0.124571f,0.959262f,0.253572f, +-0.0553429f,0.968125f,0.244277f, +0.192328f,0.950681f,0.243343f, +0.217769f,0.968216f,0.123025f, +0.205296f,0.966103f,0.156522f, +0.276023f,0.954237f,0.11508f, +0.467224f,0.868183f,0.167212f, +0.402263f,0.894308f,0.195955f, +0.299601f,0.940084f,0.162733f, +0.355906f,0.933872f,0.0348486f, +0.474044f,0.880198f,-0.0230946f, +0.444725f,0.891474f,-0.0865651f, +0.431452f,0.901988f,0.0163334f, +0.385491f,0.922676f,0.00810292f, +0.339313f,0.940655f,0.00595024f, +0.37483f,0.92173f,0.099581f, +0.41171f,0.911266f,-0.00949356f, +0.281208f,0.933096f,-0.224175f, +0.138066f,0.959634f,-0.245031f, +0.0299217f,0.992057f,-0.122182f, +-0.0797424f,0.99128f,-0.104905f, +0.124146f,0.977522f,0.170405f, +-0.0302976f,0.947743f,0.317594f, +-0.301142f,0.928457f,0.21744f, +-0.278579f,0.94845f,0.151119f, +-0.150217f,0.982764f,0.107745f, +0.0163995f,0.982022f,0.188052f, +-0.137431f,0.989816f,0.0370977f, +-0.36652f,0.926186f,-0.0885568f, +-0.445397f,0.895157f,-0.0177851f, +-0.463397f,0.885777f,-0.0257252f, +-0.466469f,0.878885f,-0.099842f, +-0.557948f,0.804805f,-0.202443f, +-0.681509f,0.679149f,-0.272587f, +-0.629296f,0.753928f,-0.188625f, +-0.5596f,0.798482f,-0.221976f, +-0.503025f,0.800303f,-0.326313f, +-0.422254f,0.855253f,-0.300408f, +-0.454716f,0.829192f,-0.325075f, +-0.46025f,0.856807f,-0.232488f, +-0.37729f,0.921922f,-0.0878209f, +-0.375084f,0.920087f,-0.112928f, +-0.173161f,0.984659f,-0.0214944f, +-0.0348229f,0.978528f,-0.20315f, +0.0523603f,0.977312f,-0.205229f, +-0.0533357f,0.893335f,-0.446215f, +0.0246713f,0.873256f,-0.486637f, +-0.0923807f,0.905308f,-0.414587f, +-0.269958f,0.871402f,-0.409612f, +-0.388686f,0.862358f,-0.324442f, +-0.340148f,0.928537f,-0.148722f, +-0.147166f,0.988619f,-0.0312327f, +-0.248059f,0.963625f,-0.099463f, +-0.232297f,0.969578f,-0.0771772f, +-0.142695f,0.989498f,-0.02308f, +-0.0198137f,0.98287f,0.18323f, +-0.0333475f,0.978727f,0.202438f, +}; + +btScalar Landscape05Tex[] = { +0.0f,0.5f, +0.0f,0.492188f, +0.0078125f,0.5f, +0.0078125f,0.492188f, +0.015625f,0.5f, +0.015625f,0.492188f, +0.0234375f,0.5f, +0.0234375f,0.492188f, +0.03125f,0.5f, +0.03125f,0.492188f, +0.0390625f,0.5f, +0.0390625f,0.492188f, +0.046875f,0.5f, +0.046875f,0.492188f, +0.0546875f,0.5f, +0.0546875f,0.492188f, +0.0625f,0.5f, +0.0625f,0.492188f, +0.0703125f,0.5f, +0.0703125f,0.492188f, +0.078125f,0.5f, +0.078125f,0.492188f, +0.0859375f,0.5f, +0.0859375f,0.492188f, +0.09375f,0.5f, +0.09375f,0.492188f, +0.101563f,0.5f, +0.101563f,0.492188f, +0.109375f,0.5f, +0.109375f,0.492188f, +0.117188f,0.5f, +0.117188f,0.492188f, +0.125f,0.5f, +0.125f,0.492188f, +0.132813f,0.5f, +0.132813f,0.492188f, +0.140625f,0.5f, +0.140625f,0.492188f, +0.148438f,0.5f, +0.148438f,0.492188f, +0.15625f,0.5f, +0.15625f,0.492188f, +0.164063f,0.5f, +0.164063f,0.492188f, +0.171875f,0.5f, +0.171875f,0.492188f, +0.179688f,0.5f, +0.179688f,0.492188f, +0.1875f,0.5f, +0.1875f,0.492188f, +0.195313f,0.5f, +0.195313f,0.492188f, +0.203125f,0.5f, +0.203125f,0.492188f, +0.210938f,0.5f, +0.210938f,0.492188f, +0.21875f,0.5f, +0.21875f,0.492188f, +0.226563f,0.5f, +0.226563f,0.492188f, +0.234375f,0.5f, +0.234375f,0.492188f, +0.242188f,0.5f, +0.242188f,0.492188f, +0.25f,0.5f, +0.25f,0.492188f, +0.257813f,0.5f, +0.257813f,0.492188f, +0.265625f,0.5f, +0.265625f,0.492188f, +0.273438f,0.5f, +0.273438f,0.492188f, +0.28125f,0.5f, +0.28125f,0.492188f, +0.289063f,0.5f, +0.289063f,0.492188f, +0.296875f,0.5f, +0.296875f,0.492188f, +0.304688f,0.5f, +0.304688f,0.492188f, +0.3125f,0.5f, +0.3125f,0.492188f, +0.320313f,0.5f, +0.320313f,0.492188f, +0.328125f,0.5f, +0.328125f,0.492188f, +0.335938f,0.5f, +0.335938f,0.492188f, +0.34375f,0.5f, +0.34375f,0.492188f, +0.351563f,0.5f, +0.351563f,0.492188f, +0.359375f,0.5f, +0.359375f,0.492188f, +0.367188f,0.5f, +0.367188f,0.492188f, +0.375f,0.5f, +0.375f,0.492188f, +0.382813f,0.5f, +0.382813f,0.492188f, +0.390625f,0.5f, +0.390625f,0.492188f, +0.398438f,0.5f, +0.398438f,0.492188f, +0.40625f,0.5f, +0.40625f,0.492188f, +0.414063f,0.5f, +0.414063f,0.492188f, +0.421875f,0.5f, +0.421875f,0.492188f, +0.429688f,0.5f, +0.429688f,0.492188f, +0.4375f,0.5f, +0.4375f,0.492188f, +0.445313f,0.5f, +0.445313f,0.492188f, +0.453125f,0.5f, +0.453125f,0.492188f, +0.460938f,0.5f, +0.460938f,0.492188f, +0.46875f,0.5f, +0.46875f,0.492188f, +0.476563f,0.5f, +0.476563f,0.492188f, +0.484375f,0.5f, +0.484375f,0.492188f, +0.492188f,0.5f, +0.492188f,0.492188f, +0.5f,0.5f, +0.5f,0.492188f, +0.507813f,0.5f, +0.507813f,0.492188f, +0.0f,0.507813f, +0.0078125f,0.507813f, +0.015625f,0.507813f, +0.0234375f,0.507813f, +0.03125f,0.507813f, +0.0390625f,0.507813f, +0.046875f,0.507813f, +0.0546875f,0.507813f, +0.0625f,0.507813f, +0.0703125f,0.507813f, +0.078125f,0.507813f, +0.0859375f,0.507813f, +0.09375f,0.507813f, +0.101563f,0.507813f, +0.109375f,0.507813f, +0.117188f,0.507813f, +0.125f,0.507813f, +0.132813f,0.507813f, +0.140625f,0.507813f, +0.148438f,0.507813f, +0.15625f,0.507813f, +0.164063f,0.507813f, +0.171875f,0.507813f, +0.179688f,0.507813f, +0.1875f,0.507813f, +0.195313f,0.507813f, +0.203125f,0.507813f, +0.210938f,0.507813f, +0.21875f,0.507813f, +0.226563f,0.507813f, +0.234375f,0.507813f, +0.242188f,0.507813f, +0.25f,0.507813f, +0.257813f,0.507813f, +0.265625f,0.507813f, +0.273438f,0.507813f, +0.28125f,0.507813f, +0.289063f,0.507813f, +0.296875f,0.507813f, +0.304688f,0.507813f, +0.3125f,0.507813f, +0.320313f,0.507813f, +0.328125f,0.507813f, +0.335938f,0.507813f, +0.34375f,0.507813f, +0.351563f,0.507813f, +0.359375f,0.507813f, +0.367188f,0.507813f, +0.375f,0.507813f, +0.382813f,0.507813f, +0.390625f,0.507813f, +0.398438f,0.507813f, +0.40625f,0.507813f, +0.414063f,0.507813f, +0.421875f,0.507813f, +0.429688f,0.507813f, +0.4375f,0.507813f, +0.445313f,0.507813f, +0.453125f,0.507813f, +0.460938f,0.507813f, +0.46875f,0.507813f, +0.476563f,0.507813f, +0.484375f,0.507813f, +0.492188f,0.507813f, +0.5f,0.507813f, +0.507813f,0.507813f, +0.0f,0.515625f, +0.0078125f,0.515625f, +0.015625f,0.515625f, +0.0234375f,0.515625f, +0.03125f,0.515625f, +0.0390625f,0.515625f, +0.046875f,0.515625f, +0.0546875f,0.515625f, +0.0625f,0.515625f, +0.0703125f,0.515625f, +0.078125f,0.515625f, +0.0859375f,0.515625f, +0.09375f,0.515625f, +0.101563f,0.515625f, +0.109375f,0.515625f, +0.117188f,0.515625f, +0.125f,0.515625f, +0.132813f,0.515625f, +0.140625f,0.515625f, +0.148438f,0.515625f, +0.15625f,0.515625f, +0.164063f,0.515625f, +0.171875f,0.515625f, +0.179688f,0.515625f, +0.1875f,0.515625f, +0.195313f,0.515625f, +0.203125f,0.515625f, +0.210938f,0.515625f, +0.21875f,0.515625f, +0.226563f,0.515625f, +0.234375f,0.515625f, +0.242188f,0.515625f, +0.25f,0.515625f, +0.257813f,0.515625f, +0.265625f,0.515625f, +0.273438f,0.515625f, +0.28125f,0.515625f, +0.289063f,0.515625f, +0.296875f,0.515625f, +0.304688f,0.515625f, +0.3125f,0.515625f, +0.320313f,0.515625f, +0.328125f,0.515625f, +0.335938f,0.515625f, +0.34375f,0.515625f, +0.351563f,0.515625f, +0.359375f,0.515625f, +0.367188f,0.515625f, +0.375f,0.515625f, +0.382813f,0.515625f, +0.390625f,0.515625f, +0.398438f,0.515625f, +0.40625f,0.515625f, +0.414063f,0.515625f, +0.421875f,0.515625f, +0.429688f,0.515625f, +0.4375f,0.515625f, +0.445313f,0.515625f, +0.453125f,0.515625f, +0.460938f,0.515625f, +0.46875f,0.515625f, +0.476563f,0.515625f, +0.484375f,0.515625f, +0.492188f,0.515625f, +0.5f,0.515625f, +0.507813f,0.515625f, +0.0f,0.523438f, +0.0078125f,0.523438f, +0.015625f,0.523438f, +0.0234375f,0.523438f, +0.03125f,0.523438f, +0.0390625f,0.523438f, +0.046875f,0.523438f, +0.0546875f,0.523438f, +0.0625f,0.523438f, +0.0703125f,0.523438f, +0.078125f,0.523438f, +0.0859375f,0.523438f, +0.09375f,0.523438f, +0.101563f,0.523438f, +0.109375f,0.523438f, +0.117188f,0.523438f, +0.125f,0.523438f, +0.132813f,0.523438f, +0.140625f,0.523438f, +0.148438f,0.523438f, +0.15625f,0.523438f, +0.164063f,0.523438f, +0.171875f,0.523438f, +0.179688f,0.523438f, +0.1875f,0.523438f, +0.195313f,0.523438f, +0.203125f,0.523438f, +0.210938f,0.523438f, +0.21875f,0.523438f, +0.226563f,0.523438f, +0.234375f,0.523438f, +0.242188f,0.523438f, +0.25f,0.523438f, +0.257813f,0.523438f, +0.265625f,0.523438f, +0.273438f,0.523438f, +0.28125f,0.523438f, +0.289063f,0.523438f, +0.296875f,0.523438f, +0.304688f,0.523438f, +0.3125f,0.523438f, +0.320313f,0.523438f, +0.328125f,0.523438f, +0.335938f,0.523438f, +0.34375f,0.523438f, +0.351563f,0.523438f, +0.359375f,0.523438f, +0.367188f,0.523438f, +0.375f,0.523438f, +0.382813f,0.523438f, +0.390625f,0.523438f, +0.398438f,0.523438f, +0.40625f,0.523438f, +0.414063f,0.523438f, +0.421875f,0.523438f, +0.429688f,0.523438f, +0.4375f,0.523438f, +0.445313f,0.523438f, +0.453125f,0.523438f, +0.460938f,0.523438f, +0.46875f,0.523438f, +0.476563f,0.523438f, +0.484375f,0.523438f, +0.492188f,0.523438f, +0.5f,0.523438f, +0.507813f,0.523438f, +0.0f,0.53125f, +0.0078125f,0.53125f, +0.015625f,0.53125f, +0.0234375f,0.53125f, +0.03125f,0.53125f, +0.0390625f,0.53125f, +0.046875f,0.53125f, +0.0546875f,0.53125f, +0.0625f,0.53125f, +0.0703125f,0.53125f, +0.078125f,0.53125f, +0.0859375f,0.53125f, +0.09375f,0.53125f, +0.101563f,0.53125f, +0.109375f,0.53125f, +0.117188f,0.53125f, +0.125f,0.53125f, +0.132813f,0.53125f, +0.140625f,0.53125f, +0.148438f,0.53125f, +0.15625f,0.53125f, +0.164063f,0.53125f, +0.171875f,0.53125f, +0.179688f,0.53125f, +0.1875f,0.53125f, +0.195313f,0.53125f, +0.203125f,0.53125f, +0.210938f,0.53125f, +0.21875f,0.53125f, +0.226563f,0.53125f, +0.234375f,0.53125f, +0.242188f,0.53125f, +0.25f,0.53125f, +0.257813f,0.53125f, +0.265625f,0.53125f, +0.273438f,0.53125f, +0.28125f,0.53125f, +0.289063f,0.53125f, +0.296875f,0.53125f, +0.304688f,0.53125f, +0.3125f,0.53125f, +0.320313f,0.53125f, +0.328125f,0.53125f, +0.335938f,0.53125f, +0.34375f,0.53125f, +0.351563f,0.53125f, +0.359375f,0.53125f, +0.367188f,0.53125f, +0.375f,0.53125f, +0.382813f,0.53125f, +0.390625f,0.53125f, +0.398438f,0.53125f, +0.40625f,0.53125f, +0.414063f,0.53125f, +0.421875f,0.53125f, +0.429688f,0.53125f, +0.4375f,0.53125f, +0.445313f,0.53125f, +0.453125f,0.53125f, +0.460938f,0.53125f, +0.46875f,0.53125f, +0.476563f,0.53125f, +0.484375f,0.53125f, +0.492188f,0.53125f, +0.5f,0.53125f, +0.507813f,0.53125f, +0.0f,0.539063f, +0.0078125f,0.539063f, +0.015625f,0.539063f, +0.0234375f,0.539063f, +0.03125f,0.539063f, +0.0390625f,0.539063f, +0.046875f,0.539063f, +0.0546875f,0.539063f, +0.0625f,0.539063f, +0.0703125f,0.539063f, +0.078125f,0.539063f, +0.0859375f,0.539063f, +0.09375f,0.539063f, +0.101563f,0.539063f, +0.109375f,0.539063f, +0.117188f,0.539063f, +0.125f,0.539063f, +0.132813f,0.539063f, +0.140625f,0.539063f, +0.148438f,0.539063f, +0.15625f,0.539063f, +0.164063f,0.539063f, +0.171875f,0.539063f, +0.179688f,0.539063f, +0.1875f,0.539063f, +0.195313f,0.539063f, +0.203125f,0.539063f, +0.210938f,0.539063f, +0.21875f,0.539063f, +0.226563f,0.539063f, +0.234375f,0.539063f, +0.242188f,0.539063f, +0.25f,0.539063f, +0.257813f,0.539063f, +0.265625f,0.539063f, +0.273438f,0.539063f, +0.28125f,0.539063f, +0.289063f,0.539063f, +0.296875f,0.539063f, +0.304688f,0.539063f, +0.3125f,0.539063f, +0.320313f,0.539063f, +0.328125f,0.539063f, +0.335938f,0.539063f, +0.34375f,0.539063f, +0.351563f,0.539063f, +0.359375f,0.539063f, +0.367188f,0.539063f, +0.375f,0.539063f, +0.382813f,0.539063f, +0.390625f,0.539063f, +0.398438f,0.539063f, +0.40625f,0.539063f, +0.414063f,0.539063f, +0.421875f,0.539063f, +0.429688f,0.539063f, +0.4375f,0.539063f, +0.445313f,0.539063f, +0.453125f,0.539063f, +0.460938f,0.539063f, +0.46875f,0.539063f, +0.476563f,0.539063f, +0.484375f,0.539063f, +0.492188f,0.539063f, +0.5f,0.539063f, +0.507813f,0.539063f, +0.0f,0.546875f, +0.0078125f,0.546875f, +0.015625f,0.546875f, +0.0234375f,0.546875f, +0.03125f,0.546875f, +0.0390625f,0.546875f, +0.046875f,0.546875f, +0.0546875f,0.546875f, +0.0625f,0.546875f, +0.0703125f,0.546875f, +0.078125f,0.546875f, +0.0859375f,0.546875f, +0.09375f,0.546875f, +0.101563f,0.546875f, +0.109375f,0.546875f, +0.117188f,0.546875f, +0.125f,0.546875f, +0.132813f,0.546875f, +0.140625f,0.546875f, +0.148438f,0.546875f, +0.15625f,0.546875f, +0.164063f,0.546875f, +0.171875f,0.546875f, +0.179688f,0.546875f, +0.1875f,0.546875f, +0.195313f,0.546875f, +0.203125f,0.546875f, +0.210938f,0.546875f, +0.21875f,0.546875f, +0.226563f,0.546875f, +0.234375f,0.546875f, +0.242188f,0.546875f, +0.25f,0.546875f, +0.257813f,0.546875f, +0.265625f,0.546875f, +0.273438f,0.546875f, +0.28125f,0.546875f, +0.289063f,0.546875f, +0.296875f,0.546875f, +0.304688f,0.546875f, +0.3125f,0.546875f, +0.320313f,0.546875f, +0.328125f,0.546875f, +0.335938f,0.546875f, +0.34375f,0.546875f, +0.351563f,0.546875f, +0.359375f,0.546875f, +0.367188f,0.546875f, +0.375f,0.546875f, +0.382813f,0.546875f, +0.390625f,0.546875f, +0.398438f,0.546875f, +0.40625f,0.546875f, +0.414063f,0.546875f, +0.421875f,0.546875f, +0.429688f,0.546875f, +0.4375f,0.546875f, +0.445313f,0.546875f, +0.453125f,0.546875f, +0.460938f,0.546875f, +0.46875f,0.546875f, +0.476563f,0.546875f, +0.484375f,0.546875f, +0.492188f,0.546875f, +0.5f,0.546875f, +0.507813f,0.546875f, +0.0f,0.554688f, +0.0078125f,0.554688f, +0.015625f,0.554688f, +0.0234375f,0.554688f, +0.03125f,0.554688f, +0.0390625f,0.554688f, +0.046875f,0.554688f, +0.0546875f,0.554688f, +0.0625f,0.554688f, +0.0703125f,0.554688f, +0.078125f,0.554688f, +0.0859375f,0.554688f, +0.09375f,0.554688f, +0.101563f,0.554688f, +0.109375f,0.554688f, +0.117188f,0.554688f, +0.125f,0.554688f, +0.132813f,0.554688f, +0.140625f,0.554688f, +0.148438f,0.554688f, +0.15625f,0.554688f, +0.164063f,0.554688f, +0.171875f,0.554688f, +0.179688f,0.554688f, +0.1875f,0.554688f, +0.195313f,0.554688f, +0.203125f,0.554688f, +0.210938f,0.554688f, +0.21875f,0.554688f, +0.226563f,0.554688f, +0.234375f,0.554688f, +0.242188f,0.554688f, +0.25f,0.554688f, +0.257813f,0.554688f, +0.265625f,0.554688f, +0.273438f,0.554688f, +0.28125f,0.554688f, +0.289063f,0.554688f, +0.296875f,0.554688f, +0.304688f,0.554688f, +0.3125f,0.554688f, +0.320313f,0.554688f, +0.328125f,0.554688f, +0.335938f,0.554688f, +0.34375f,0.554688f, +0.351563f,0.554688f, +0.359375f,0.554688f, +0.367188f,0.554688f, +0.375f,0.554688f, +0.382813f,0.554688f, +0.390625f,0.554688f, +0.398438f,0.554688f, +0.40625f,0.554688f, +0.414063f,0.554688f, +0.421875f,0.554688f, +0.429688f,0.554688f, +0.4375f,0.554688f, +0.445313f,0.554688f, +0.453125f,0.554688f, +0.460938f,0.554688f, +0.46875f,0.554688f, +0.476563f,0.554688f, +0.484375f,0.554688f, +0.492188f,0.554688f, +0.5f,0.554688f, +0.507813f,0.554688f, +0.0f,0.5625f, +0.0078125f,0.5625f, +0.015625f,0.5625f, +0.0234375f,0.5625f, +0.03125f,0.5625f, +0.0390625f,0.5625f, +0.046875f,0.5625f, +0.0546875f,0.5625f, +0.0625f,0.5625f, +0.0703125f,0.5625f, +0.078125f,0.5625f, +0.0859375f,0.5625f, +0.09375f,0.5625f, +0.101563f,0.5625f, +0.109375f,0.5625f, +0.117188f,0.5625f, +0.125f,0.5625f, +0.132813f,0.5625f, +0.140625f,0.5625f, +0.148438f,0.5625f, +0.15625f,0.5625f, +0.164063f,0.5625f, +0.171875f,0.5625f, +0.179688f,0.5625f, +0.1875f,0.5625f, +0.195313f,0.5625f, +0.203125f,0.5625f, +0.210938f,0.5625f, +0.21875f,0.5625f, +0.226563f,0.5625f, +0.234375f,0.5625f, +0.242188f,0.5625f, +0.25f,0.5625f, +0.257813f,0.5625f, +0.265625f,0.5625f, +0.273438f,0.5625f, +0.28125f,0.5625f, +0.289063f,0.5625f, +0.296875f,0.5625f, +0.304688f,0.5625f, +0.3125f,0.5625f, +0.320313f,0.5625f, +0.328125f,0.5625f, +0.335938f,0.5625f, +0.34375f,0.5625f, +0.351563f,0.5625f, +0.359375f,0.5625f, +0.367188f,0.5625f, +0.375f,0.5625f, +0.382813f,0.5625f, +0.390625f,0.5625f, +0.398438f,0.5625f, +0.40625f,0.5625f, +0.414063f,0.5625f, +0.421875f,0.5625f, +0.429688f,0.5625f, +0.4375f,0.5625f, +0.445313f,0.5625f, +0.453125f,0.5625f, +0.460938f,0.5625f, +0.46875f,0.5625f, +0.476563f,0.5625f, +0.484375f,0.5625f, +0.492188f,0.5625f, +0.5f,0.5625f, +0.507813f,0.5625f, +0.0f,0.570313f, +0.0078125f,0.570313f, +0.015625f,0.570313f, +0.0234375f,0.570313f, +0.03125f,0.570313f, +0.0390625f,0.570313f, +0.046875f,0.570313f, +0.0546875f,0.570313f, +0.0625f,0.570313f, +0.0703125f,0.570313f, +0.078125f,0.570313f, +0.0859375f,0.570313f, +0.09375f,0.570313f, +0.101563f,0.570313f, +0.109375f,0.570313f, +0.117188f,0.570313f, +0.125f,0.570313f, +0.132813f,0.570313f, +0.140625f,0.570313f, +0.148438f,0.570313f, +0.15625f,0.570313f, +0.164063f,0.570313f, +0.171875f,0.570313f, +0.179688f,0.570313f, +0.1875f,0.570313f, +0.195313f,0.570313f, +0.203125f,0.570313f, +0.210938f,0.570313f, +0.21875f,0.570313f, +0.226563f,0.570313f, +0.234375f,0.570313f, +0.242188f,0.570313f, +0.25f,0.570313f, +0.257813f,0.570313f, +0.265625f,0.570313f, +0.273438f,0.570313f, +0.28125f,0.570313f, +0.289063f,0.570313f, +0.296875f,0.570313f, +0.304688f,0.570313f, +0.3125f,0.570313f, +0.320313f,0.570313f, +0.328125f,0.570313f, +0.335938f,0.570313f, +0.34375f,0.570313f, +0.351563f,0.570313f, +0.359375f,0.570313f, +0.367188f,0.570313f, +0.375f,0.570313f, +0.382813f,0.570313f, +0.390625f,0.570313f, +0.398438f,0.570313f, +0.40625f,0.570313f, +0.414063f,0.570313f, +0.421875f,0.570313f, +0.429688f,0.570313f, +0.4375f,0.570313f, +0.445313f,0.570313f, +0.453125f,0.570313f, +0.460938f,0.570313f, +0.46875f,0.570313f, +0.476563f,0.570313f, +0.484375f,0.570313f, +0.492188f,0.570313f, +0.5f,0.570313f, +0.507813f,0.570313f, +0.0f,0.578125f, +0.0078125f,0.578125f, +0.015625f,0.578125f, +0.0234375f,0.578125f, +0.03125f,0.578125f, +0.0390625f,0.578125f, +0.046875f,0.578125f, +0.0546875f,0.578125f, +0.0625f,0.578125f, +0.0703125f,0.578125f, +0.078125f,0.578125f, +0.0859375f,0.578125f, +0.09375f,0.578125f, +0.101563f,0.578125f, +0.109375f,0.578125f, +0.117188f,0.578125f, +0.125f,0.578125f, +0.132813f,0.578125f, +0.140625f,0.578125f, +0.148438f,0.578125f, +0.15625f,0.578125f, +0.164063f,0.578125f, +0.171875f,0.578125f, +0.179688f,0.578125f, +0.1875f,0.578125f, +0.195313f,0.578125f, +0.203125f,0.578125f, +0.210938f,0.578125f, +0.21875f,0.578125f, +0.226563f,0.578125f, +0.234375f,0.578125f, +0.242188f,0.578125f, +0.25f,0.578125f, +0.257813f,0.578125f, +0.265625f,0.578125f, +0.273438f,0.578125f, +0.28125f,0.578125f, +0.289063f,0.578125f, +0.296875f,0.578125f, +0.304688f,0.578125f, +0.3125f,0.578125f, +0.320313f,0.578125f, +0.328125f,0.578125f, +0.335938f,0.578125f, +0.34375f,0.578125f, +0.351563f,0.578125f, +0.359375f,0.578125f, +0.367188f,0.578125f, +0.375f,0.578125f, +0.382813f,0.578125f, +0.390625f,0.578125f, +0.398438f,0.578125f, +0.40625f,0.578125f, +0.414063f,0.578125f, +0.421875f,0.578125f, +0.429688f,0.578125f, +0.4375f,0.578125f, +0.445313f,0.578125f, +0.453125f,0.578125f, +0.460938f,0.578125f, +0.46875f,0.578125f, +0.476563f,0.578125f, +0.484375f,0.578125f, +0.492188f,0.578125f, +0.5f,0.578125f, +0.507813f,0.578125f, +0.0f,0.585938f, +0.0078125f,0.585938f, +0.015625f,0.585938f, +0.0234375f,0.585938f, +0.03125f,0.585938f, +0.0390625f,0.585938f, +0.046875f,0.585938f, +0.0546875f,0.585938f, +0.0625f,0.585938f, +0.0703125f,0.585938f, +0.078125f,0.585938f, +0.0859375f,0.585938f, +0.09375f,0.585938f, +0.101563f,0.585938f, +0.109375f,0.585938f, +0.117188f,0.585938f, +0.125f,0.585938f, +0.132813f,0.585938f, +0.140625f,0.585938f, +0.148438f,0.585938f, +0.15625f,0.585938f, +0.164063f,0.585938f, +0.171875f,0.585938f, +0.179688f,0.585938f, +0.1875f,0.585938f, +0.195313f,0.585938f, +0.203125f,0.585938f, +0.210938f,0.585938f, +0.21875f,0.585938f, +0.226563f,0.585938f, +0.234375f,0.585938f, +0.242188f,0.585938f, +0.25f,0.585938f, +0.257813f,0.585938f, +0.265625f,0.585938f, +0.273438f,0.585938f, +0.28125f,0.585938f, +0.289063f,0.585938f, +0.296875f,0.585938f, +0.304688f,0.585938f, +0.3125f,0.585938f, +0.320313f,0.585938f, +0.328125f,0.585938f, +0.335938f,0.585938f, +0.34375f,0.585938f, +0.351563f,0.585938f, +0.359375f,0.585938f, +0.367188f,0.585938f, +0.375f,0.585938f, +0.382813f,0.585938f, +0.390625f,0.585938f, +0.398438f,0.585938f, +0.40625f,0.585938f, +0.414063f,0.585938f, +0.421875f,0.585938f, +0.429688f,0.585938f, +0.4375f,0.585938f, +0.445313f,0.585938f, +0.453125f,0.585938f, +0.460938f,0.585938f, +0.46875f,0.585938f, +0.476563f,0.585938f, +0.484375f,0.585938f, +0.492188f,0.585938f, +0.5f,0.585938f, +0.507813f,0.585938f, +0.0f,0.59375f, +0.0078125f,0.59375f, +0.015625f,0.59375f, +0.0234375f,0.59375f, +0.03125f,0.59375f, +0.0390625f,0.59375f, +0.046875f,0.59375f, +0.0546875f,0.59375f, +0.0625f,0.59375f, +0.0703125f,0.59375f, +0.078125f,0.59375f, +0.0859375f,0.59375f, +0.09375f,0.59375f, +0.101563f,0.59375f, +0.109375f,0.59375f, +0.117188f,0.59375f, +0.125f,0.59375f, +0.132813f,0.59375f, +0.140625f,0.59375f, +0.148438f,0.59375f, +0.15625f,0.59375f, +0.164063f,0.59375f, +0.171875f,0.59375f, +0.179688f,0.59375f, +0.1875f,0.59375f, +0.195313f,0.59375f, +0.203125f,0.59375f, +0.210938f,0.59375f, +0.21875f,0.59375f, +0.226563f,0.59375f, +0.234375f,0.59375f, +0.242188f,0.59375f, +0.25f,0.59375f, +0.257813f,0.59375f, +0.265625f,0.59375f, +0.273438f,0.59375f, +0.28125f,0.59375f, +0.289063f,0.59375f, +0.296875f,0.59375f, +0.304688f,0.59375f, +0.3125f,0.59375f, +0.320313f,0.59375f, +0.328125f,0.59375f, +0.335938f,0.59375f, +0.34375f,0.59375f, +0.351563f,0.59375f, +0.359375f,0.59375f, +0.367188f,0.59375f, +0.375f,0.59375f, +0.382813f,0.59375f, +0.390625f,0.59375f, +0.398438f,0.59375f, +0.40625f,0.59375f, +0.414063f,0.59375f, +0.421875f,0.59375f, +0.429688f,0.59375f, +0.4375f,0.59375f, +0.445313f,0.59375f, +0.453125f,0.59375f, +0.460938f,0.59375f, +0.46875f,0.59375f, +0.476563f,0.59375f, +0.484375f,0.59375f, +0.492188f,0.59375f, +0.5f,0.59375f, +0.507813f,0.59375f, +0.0f,0.601563f, +0.0078125f,0.601563f, +0.015625f,0.601563f, +0.0234375f,0.601563f, +0.03125f,0.601563f, +0.0390625f,0.601563f, +0.046875f,0.601563f, +0.0546875f,0.601563f, +0.0625f,0.601563f, +0.0703125f,0.601563f, +0.078125f,0.601563f, +0.0859375f,0.601563f, +0.09375f,0.601563f, +0.101563f,0.601563f, +0.109375f,0.601563f, +0.117188f,0.601563f, +0.125f,0.601563f, +0.132813f,0.601563f, +0.140625f,0.601563f, +0.148438f,0.601563f, +0.15625f,0.601563f, +0.164063f,0.601563f, +0.171875f,0.601563f, +0.179688f,0.601563f, +0.1875f,0.601563f, +0.195313f,0.601563f, +0.203125f,0.601563f, +0.210938f,0.601563f, +0.21875f,0.601563f, +0.226563f,0.601563f, +0.234375f,0.601563f, +0.242188f,0.601563f, +0.25f,0.601563f, +0.257813f,0.601563f, +0.265625f,0.601563f, +0.273438f,0.601563f, +0.28125f,0.601563f, +0.289063f,0.601563f, +0.296875f,0.601563f, +0.304688f,0.601563f, +0.3125f,0.601563f, +0.320313f,0.601563f, +0.328125f,0.601563f, +0.335938f,0.601563f, +0.34375f,0.601563f, +0.351563f,0.601563f, +0.359375f,0.601563f, +0.367188f,0.601563f, +0.375f,0.601563f, +0.382813f,0.601563f, +0.390625f,0.601563f, +0.398438f,0.601563f, +0.40625f,0.601563f, +0.414063f,0.601563f, +0.421875f,0.601563f, +0.429688f,0.601563f, +0.4375f,0.601563f, +0.445313f,0.601563f, +0.453125f,0.601563f, +0.460938f,0.601563f, +0.46875f,0.601563f, +0.476563f,0.601563f, +0.484375f,0.601563f, +0.492188f,0.601563f, +0.5f,0.601563f, +0.507813f,0.601563f, +0.0f,0.609375f, +0.0078125f,0.609375f, +0.015625f,0.609375f, +0.0234375f,0.609375f, +0.03125f,0.609375f, +0.0390625f,0.609375f, +0.046875f,0.609375f, +0.0546875f,0.609375f, +0.0625f,0.609375f, +0.0703125f,0.609375f, +0.078125f,0.609375f, +0.0859375f,0.609375f, +0.09375f,0.609375f, +0.101563f,0.609375f, +0.109375f,0.609375f, +0.117188f,0.609375f, +0.125f,0.609375f, +0.132813f,0.609375f, +0.140625f,0.609375f, +0.148438f,0.609375f, +0.15625f,0.609375f, +0.164063f,0.609375f, +0.171875f,0.609375f, +0.179688f,0.609375f, +0.1875f,0.609375f, +0.195313f,0.609375f, +0.203125f,0.609375f, +0.210938f,0.609375f, +0.21875f,0.609375f, +0.226563f,0.609375f, +0.234375f,0.609375f, +0.242188f,0.609375f, +0.25f,0.609375f, +0.257813f,0.609375f, +0.265625f,0.609375f, +0.273438f,0.609375f, +0.28125f,0.609375f, +0.289063f,0.609375f, +0.296875f,0.609375f, +0.304688f,0.609375f, +0.3125f,0.609375f, +0.320313f,0.609375f, +0.328125f,0.609375f, +0.335938f,0.609375f, +0.34375f,0.609375f, +0.351563f,0.609375f, +0.359375f,0.609375f, +0.367188f,0.609375f, +0.375f,0.609375f, +0.382813f,0.609375f, +0.390625f,0.609375f, +0.398438f,0.609375f, +0.40625f,0.609375f, +0.414063f,0.609375f, +0.421875f,0.609375f, +0.429688f,0.609375f, +0.4375f,0.609375f, +0.445313f,0.609375f, +0.453125f,0.609375f, +0.460938f,0.609375f, +0.46875f,0.609375f, +0.476563f,0.609375f, +0.484375f,0.609375f, +0.492188f,0.609375f, +0.5f,0.609375f, +0.507813f,0.609375f, +0.0f,0.617188f, +0.0078125f,0.617188f, +0.015625f,0.617188f, +0.0234375f,0.617188f, +0.03125f,0.617188f, +0.0390625f,0.617188f, +0.046875f,0.617188f, +0.0546875f,0.617188f, +0.0625f,0.617188f, +0.0703125f,0.617188f, +0.078125f,0.617188f, +0.0859375f,0.617188f, +0.09375f,0.617188f, +0.101563f,0.617188f, +0.109375f,0.617188f, +0.117188f,0.617188f, +0.125f,0.617188f, +0.132813f,0.617188f, +0.140625f,0.617188f, +0.148438f,0.617188f, +0.15625f,0.617188f, +0.164063f,0.617188f, +0.171875f,0.617188f, +0.179688f,0.617188f, +0.1875f,0.617188f, +0.195313f,0.617188f, +0.203125f,0.617188f, +0.210938f,0.617188f, +0.21875f,0.617188f, +0.226563f,0.617188f, +0.234375f,0.617188f, +0.242188f,0.617188f, +0.25f,0.617188f, +0.257813f,0.617188f, +0.265625f,0.617188f, +0.273438f,0.617188f, +0.28125f,0.617188f, +0.289063f,0.617188f, +0.296875f,0.617188f, +0.304688f,0.617188f, +0.3125f,0.617188f, +0.320313f,0.617188f, +0.328125f,0.617188f, +0.335938f,0.617188f, +0.34375f,0.617188f, +0.351563f,0.617188f, +0.359375f,0.617188f, +0.367188f,0.617188f, +0.375f,0.617188f, +0.382813f,0.617188f, +0.390625f,0.617188f, +0.398438f,0.617188f, +0.40625f,0.617188f, +0.414063f,0.617188f, +0.421875f,0.617188f, +0.429688f,0.617188f, +0.4375f,0.617188f, +0.445313f,0.617188f, +0.453125f,0.617188f, +0.460938f,0.617188f, +0.46875f,0.617188f, +0.476563f,0.617188f, +0.484375f,0.617188f, +0.492188f,0.617188f, +0.5f,0.617188f, +0.507813f,0.617188f, +0.0f,0.625f, +0.0078125f,0.625f, +0.015625f,0.625f, +0.0234375f,0.625f, +0.03125f,0.625f, +0.0390625f,0.625f, +0.046875f,0.625f, +0.0546875f,0.625f, +0.0625f,0.625f, +0.0703125f,0.625f, +0.078125f,0.625f, +0.0859375f,0.625f, +0.09375f,0.625f, +0.101563f,0.625f, +0.109375f,0.625f, +0.117188f,0.625f, +0.125f,0.625f, +0.132813f,0.625f, +0.140625f,0.625f, +0.148438f,0.625f, +0.15625f,0.625f, +0.164063f,0.625f, +0.171875f,0.625f, +0.179688f,0.625f, +0.1875f,0.625f, +0.195313f,0.625f, +0.203125f,0.625f, +0.210938f,0.625f, +0.21875f,0.625f, +0.226563f,0.625f, +0.234375f,0.625f, +0.242188f,0.625f, +0.25f,0.625f, +0.257813f,0.625f, +0.265625f,0.625f, +0.273438f,0.625f, +0.28125f,0.625f, +0.289063f,0.625f, +0.296875f,0.625f, +0.304688f,0.625f, +0.3125f,0.625f, +0.320313f,0.625f, +0.328125f,0.625f, +0.335938f,0.625f, +0.34375f,0.625f, +0.351563f,0.625f, +0.359375f,0.625f, +0.367188f,0.625f, +0.375f,0.625f, +0.382813f,0.625f, +0.390625f,0.625f, +0.398438f,0.625f, +0.40625f,0.625f, +0.414063f,0.625f, +0.421875f,0.625f, +0.429688f,0.625f, +0.4375f,0.625f, +0.445313f,0.625f, +0.453125f,0.625f, +0.460938f,0.625f, +0.46875f,0.625f, +0.476563f,0.625f, +0.484375f,0.625f, +0.492188f,0.625f, +0.5f,0.625f, +0.507813f,0.625f, +0.0f,0.632813f, +0.0078125f,0.632813f, +0.015625f,0.632813f, +0.0234375f,0.632813f, +0.03125f,0.632813f, +0.0390625f,0.632813f, +0.046875f,0.632813f, +0.0546875f,0.632813f, +0.0625f,0.632813f, +0.0703125f,0.632813f, +0.078125f,0.632813f, +0.0859375f,0.632813f, +0.09375f,0.632813f, +0.101563f,0.632813f, +0.109375f,0.632813f, +0.117188f,0.632813f, +0.125f,0.632813f, +0.132813f,0.632813f, +0.140625f,0.632813f, +0.148438f,0.632813f, +0.15625f,0.632813f, +0.164063f,0.632813f, +0.171875f,0.632813f, +0.179688f,0.632813f, +0.1875f,0.632813f, +0.195313f,0.632813f, +0.203125f,0.632813f, +0.210938f,0.632813f, +0.21875f,0.632813f, +0.226563f,0.632813f, +0.234375f,0.632813f, +0.242188f,0.632813f, +0.25f,0.632813f, +0.257813f,0.632813f, +0.265625f,0.632813f, +0.273438f,0.632813f, +0.28125f,0.632813f, +0.289063f,0.632813f, +0.296875f,0.632813f, +0.304688f,0.632813f, +0.3125f,0.632813f, +0.320313f,0.632813f, +0.328125f,0.632813f, +0.335938f,0.632813f, +0.34375f,0.632813f, +0.351563f,0.632813f, +0.359375f,0.632813f, +0.367188f,0.632813f, +0.375f,0.632813f, +0.382813f,0.632813f, +0.390625f,0.632813f, +0.398438f,0.632813f, +0.40625f,0.632813f, +0.414063f,0.632813f, +0.421875f,0.632813f, +0.429688f,0.632813f, +0.4375f,0.632813f, +0.445313f,0.632813f, +0.453125f,0.632813f, +0.460938f,0.632813f, +0.46875f,0.632813f, +0.476563f,0.632813f, +0.484375f,0.632813f, +0.492188f,0.632813f, +0.5f,0.632813f, +0.507813f,0.632813f, +0.0f,0.640625f, +0.0078125f,0.640625f, +0.015625f,0.640625f, +0.0234375f,0.640625f, +0.03125f,0.640625f, +0.0390625f,0.640625f, +0.046875f,0.640625f, +0.0546875f,0.640625f, +0.0625f,0.640625f, +0.0703125f,0.640625f, +0.078125f,0.640625f, +0.0859375f,0.640625f, +0.09375f,0.640625f, +0.101563f,0.640625f, +0.109375f,0.640625f, +0.117188f,0.640625f, +0.125f,0.640625f, +0.132813f,0.640625f, +0.140625f,0.640625f, +0.148438f,0.640625f, +0.15625f,0.640625f, +0.164063f,0.640625f, +0.171875f,0.640625f, +0.179688f,0.640625f, +0.1875f,0.640625f, +0.195313f,0.640625f, +0.203125f,0.640625f, +0.210938f,0.640625f, +0.21875f,0.640625f, +0.226563f,0.640625f, +0.234375f,0.640625f, +0.242188f,0.640625f, +0.25f,0.640625f, +0.257813f,0.640625f, +0.265625f,0.640625f, +0.273438f,0.640625f, +0.28125f,0.640625f, +0.289063f,0.640625f, +0.296875f,0.640625f, +0.304688f,0.640625f, +0.3125f,0.640625f, +0.320313f,0.640625f, +0.328125f,0.640625f, +0.335938f,0.640625f, +0.34375f,0.640625f, +0.351563f,0.640625f, +0.359375f,0.640625f, +0.367188f,0.640625f, +0.375f,0.640625f, +0.382813f,0.640625f, +0.390625f,0.640625f, +0.398438f,0.640625f, +0.40625f,0.640625f, +0.414063f,0.640625f, +0.421875f,0.640625f, +0.429688f,0.640625f, +0.4375f,0.640625f, +0.445313f,0.640625f, +0.453125f,0.640625f, +0.460938f,0.640625f, +0.46875f,0.640625f, +0.476563f,0.640625f, +0.484375f,0.640625f, +0.492188f,0.640625f, +0.5f,0.640625f, +0.507813f,0.640625f, +0.0f,0.648438f, +0.0078125f,0.648438f, +0.015625f,0.648438f, +0.0234375f,0.648438f, +0.03125f,0.648438f, +0.0390625f,0.648438f, +0.046875f,0.648438f, +0.0546875f,0.648438f, +0.0625f,0.648438f, +0.0703125f,0.648438f, +0.078125f,0.648438f, +0.0859375f,0.648438f, +0.09375f,0.648438f, +0.101563f,0.648438f, +0.109375f,0.648438f, +0.117188f,0.648438f, +0.125f,0.648438f, +0.132813f,0.648438f, +0.140625f,0.648438f, +0.148438f,0.648438f, +0.15625f,0.648438f, +0.164063f,0.648438f, +0.171875f,0.648438f, +0.179688f,0.648438f, +0.1875f,0.648438f, +0.195313f,0.648438f, +0.203125f,0.648438f, +0.210938f,0.648438f, +0.21875f,0.648438f, +0.226563f,0.648438f, +0.234375f,0.648438f, +0.242188f,0.648438f, +0.25f,0.648438f, +0.257813f,0.648438f, +0.265625f,0.648438f, +0.273438f,0.648438f, +0.28125f,0.648438f, +0.289063f,0.648438f, +0.296875f,0.648438f, +0.304688f,0.648438f, +0.3125f,0.648438f, +0.320313f,0.648438f, +0.328125f,0.648438f, +0.335938f,0.648438f, +0.34375f,0.648438f, +0.351563f,0.648438f, +0.359375f,0.648438f, +0.367188f,0.648438f, +0.375f,0.648438f, +0.382813f,0.648438f, +0.390625f,0.648438f, +0.398438f,0.648438f, +0.40625f,0.648438f, +0.414063f,0.648438f, +0.421875f,0.648438f, +0.429688f,0.648438f, +0.4375f,0.648438f, +0.445313f,0.648438f, +0.453125f,0.648438f, +0.460938f,0.648438f, +0.46875f,0.648438f, +0.476563f,0.648438f, +0.484375f,0.648438f, +0.492188f,0.648438f, +0.5f,0.648438f, +0.507813f,0.648438f, +0.0f,0.65625f, +0.0078125f,0.65625f, +0.015625f,0.65625f, +0.0234375f,0.65625f, +0.03125f,0.65625f, +0.0390625f,0.65625f, +0.046875f,0.65625f, +0.0546875f,0.65625f, +0.0625f,0.65625f, +0.0703125f,0.65625f, +0.078125f,0.65625f, +0.0859375f,0.65625f, +0.09375f,0.65625f, +0.101563f,0.65625f, +0.109375f,0.65625f, +0.117188f,0.65625f, +0.125f,0.65625f, +0.132813f,0.65625f, +0.140625f,0.65625f, +0.148438f,0.65625f, +0.15625f,0.65625f, +0.164063f,0.65625f, +0.171875f,0.65625f, +0.179688f,0.65625f, +0.1875f,0.65625f, +0.195313f,0.65625f, +0.203125f,0.65625f, +0.210938f,0.65625f, +0.21875f,0.65625f, +0.226563f,0.65625f, +0.234375f,0.65625f, +0.242188f,0.65625f, +0.25f,0.65625f, +0.257813f,0.65625f, +0.265625f,0.65625f, +0.273438f,0.65625f, +0.28125f,0.65625f, +0.289063f,0.65625f, +0.296875f,0.65625f, +0.304688f,0.65625f, +0.3125f,0.65625f, +0.320313f,0.65625f, +0.328125f,0.65625f, +0.335938f,0.65625f, +0.34375f,0.65625f, +0.351563f,0.65625f, +0.359375f,0.65625f, +0.367188f,0.65625f, +0.375f,0.65625f, +0.382813f,0.65625f, +0.390625f,0.65625f, +0.398438f,0.65625f, +0.40625f,0.65625f, +0.414063f,0.65625f, +0.421875f,0.65625f, +0.429688f,0.65625f, +0.4375f,0.65625f, +0.445313f,0.65625f, +0.453125f,0.65625f, +0.460938f,0.65625f, +0.46875f,0.65625f, +0.476563f,0.65625f, +0.484375f,0.65625f, +0.492188f,0.65625f, +0.5f,0.65625f, +0.507813f,0.65625f, +0.0f,0.664063f, +0.0078125f,0.664063f, +0.015625f,0.664063f, +0.0234375f,0.664063f, +0.03125f,0.664063f, +0.0390625f,0.664063f, +0.046875f,0.664063f, +0.0546875f,0.664063f, +0.0625f,0.664063f, +0.0703125f,0.664063f, +0.078125f,0.664063f, +0.0859375f,0.664063f, +0.09375f,0.664063f, +0.101563f,0.664063f, +0.109375f,0.664063f, +0.117188f,0.664063f, +0.125f,0.664063f, +0.132813f,0.664063f, +0.140625f,0.664063f, +0.148438f,0.664063f, +0.15625f,0.664063f, +0.164063f,0.664063f, +0.171875f,0.664063f, +0.179688f,0.664063f, +0.1875f,0.664063f, +0.195313f,0.664063f, +0.203125f,0.664063f, +0.210938f,0.664063f, +0.21875f,0.664063f, +0.226563f,0.664063f, +0.234375f,0.664063f, +0.242188f,0.664063f, +0.25f,0.664063f, +0.257813f,0.664063f, +0.265625f,0.664063f, +0.273438f,0.664063f, +0.28125f,0.664063f, +0.289063f,0.664063f, +0.296875f,0.664063f, +0.304688f,0.664063f, +0.3125f,0.664063f, +0.320313f,0.664063f, +0.328125f,0.664063f, +0.335938f,0.664063f, +0.34375f,0.664063f, +0.351563f,0.664063f, +0.359375f,0.664063f, +0.367188f,0.664063f, +0.375f,0.664063f, +0.382813f,0.664063f, +0.390625f,0.664063f, +0.398438f,0.664063f, +0.40625f,0.664063f, +0.414063f,0.664063f, +0.421875f,0.664063f, +0.429688f,0.664063f, +0.4375f,0.664063f, +0.445313f,0.664063f, +0.453125f,0.664063f, +0.460938f,0.664063f, +0.46875f,0.664063f, +0.476563f,0.664063f, +0.484375f,0.664063f, +0.492188f,0.664063f, +0.5f,0.664063f, +0.507813f,0.664063f, +0.0f,0.671875f, +0.0078125f,0.671875f, +0.015625f,0.671875f, +0.0234375f,0.671875f, +0.03125f,0.671875f, +0.0390625f,0.671875f, +0.046875f,0.671875f, +0.0546875f,0.671875f, +0.0625f,0.671875f, +0.0703125f,0.671875f, +0.078125f,0.671875f, +0.0859375f,0.671875f, +0.09375f,0.671875f, +0.101563f,0.671875f, +0.109375f,0.671875f, +0.117188f,0.671875f, +0.125f,0.671875f, +0.132813f,0.671875f, +0.140625f,0.671875f, +0.148438f,0.671875f, +0.15625f,0.671875f, +0.164063f,0.671875f, +0.171875f,0.671875f, +0.179688f,0.671875f, +0.1875f,0.671875f, +0.195313f,0.671875f, +0.203125f,0.671875f, +0.210938f,0.671875f, +0.21875f,0.671875f, +0.226563f,0.671875f, +0.234375f,0.671875f, +0.242188f,0.671875f, +0.25f,0.671875f, +0.257813f,0.671875f, +0.265625f,0.671875f, +0.273438f,0.671875f, +0.28125f,0.671875f, +0.289063f,0.671875f, +0.296875f,0.671875f, +0.304688f,0.671875f, +0.3125f,0.671875f, +0.320313f,0.671875f, +0.328125f,0.671875f, +0.335938f,0.671875f, +0.34375f,0.671875f, +0.351563f,0.671875f, +0.359375f,0.671875f, +0.367188f,0.671875f, +0.375f,0.671875f, +0.382813f,0.671875f, +0.390625f,0.671875f, +0.398438f,0.671875f, +0.40625f,0.671875f, +0.414063f,0.671875f, +0.421875f,0.671875f, +0.429688f,0.671875f, +0.4375f,0.671875f, +0.445313f,0.671875f, +0.453125f,0.671875f, +0.460938f,0.671875f, +0.46875f,0.671875f, +0.476563f,0.671875f, +0.484375f,0.671875f, +0.492188f,0.671875f, +0.5f,0.671875f, +0.507813f,0.671875f, +0.0f,0.679688f, +0.0078125f,0.679688f, +0.015625f,0.679688f, +0.0234375f,0.679688f, +0.03125f,0.679688f, +0.0390625f,0.679688f, +0.046875f,0.679688f, +0.0546875f,0.679688f, +0.0625f,0.679688f, +0.0703125f,0.679688f, +0.078125f,0.679688f, +0.0859375f,0.679688f, +0.09375f,0.679688f, +0.101563f,0.679688f, +0.109375f,0.679688f, +0.117188f,0.679688f, +0.125f,0.679688f, +0.132813f,0.679688f, +0.140625f,0.679688f, +0.148438f,0.679688f, +0.15625f,0.679688f, +0.164063f,0.679688f, +0.171875f,0.679688f, +0.179688f,0.679688f, +0.1875f,0.679688f, +0.195313f,0.679688f, +0.203125f,0.679688f, +0.210938f,0.679688f, +0.21875f,0.679688f, +0.226563f,0.679688f, +0.234375f,0.679688f, +0.242188f,0.679688f, +0.25f,0.679688f, +0.257813f,0.679688f, +0.265625f,0.679688f, +0.273438f,0.679688f, +0.28125f,0.679688f, +0.289063f,0.679688f, +0.296875f,0.679688f, +0.304688f,0.679688f, +0.3125f,0.679688f, +0.320313f,0.679688f, +0.328125f,0.679688f, +0.335938f,0.679688f, +0.34375f,0.679688f, +0.351563f,0.679688f, +0.359375f,0.679688f, +0.367188f,0.679688f, +0.375f,0.679688f, +0.382813f,0.679688f, +0.390625f,0.679688f, +0.398438f,0.679688f, +0.40625f,0.679688f, +0.414063f,0.679688f, +0.421875f,0.679688f, +0.429688f,0.679688f, +0.4375f,0.679688f, +0.445313f,0.679688f, +0.453125f,0.679688f, +0.460938f,0.679688f, +0.46875f,0.679688f, +0.476563f,0.679688f, +0.484375f,0.679688f, +0.492188f,0.679688f, +0.5f,0.679688f, +0.507813f,0.679688f, +0.0f,0.6875f, +0.0078125f,0.6875f, +0.015625f,0.6875f, +0.0234375f,0.6875f, +0.03125f,0.6875f, +0.0390625f,0.6875f, +0.046875f,0.6875f, +0.0546875f,0.6875f, +0.0625f,0.6875f, +0.0703125f,0.6875f, +0.078125f,0.6875f, +0.0859375f,0.6875f, +0.09375f,0.6875f, +0.101563f,0.6875f, +0.109375f,0.6875f, +0.117188f,0.6875f, +0.125f,0.6875f, +0.132813f,0.6875f, +0.140625f,0.6875f, +0.148438f,0.6875f, +0.15625f,0.6875f, +0.164063f,0.6875f, +0.171875f,0.6875f, +0.179688f,0.6875f, +0.1875f,0.6875f, +0.195313f,0.6875f, +0.203125f,0.6875f, +0.210938f,0.6875f, +0.21875f,0.6875f, +0.226563f,0.6875f, +0.234375f,0.6875f, +0.242188f,0.6875f, +0.25f,0.6875f, +0.257813f,0.6875f, +0.265625f,0.6875f, +0.273438f,0.6875f, +0.28125f,0.6875f, +0.289063f,0.6875f, +0.296875f,0.6875f, +0.304688f,0.6875f, +0.3125f,0.6875f, +0.320313f,0.6875f, +0.328125f,0.6875f, +0.335938f,0.6875f, +0.34375f,0.6875f, +0.351563f,0.6875f, +0.359375f,0.6875f, +0.367188f,0.6875f, +0.375f,0.6875f, +0.382813f,0.6875f, +0.390625f,0.6875f, +0.398438f,0.6875f, +0.40625f,0.6875f, +0.414063f,0.6875f, +0.421875f,0.6875f, +0.429688f,0.6875f, +0.4375f,0.6875f, +0.445313f,0.6875f, +0.453125f,0.6875f, +0.460938f,0.6875f, +0.46875f,0.6875f, +0.476563f,0.6875f, +0.484375f,0.6875f, +0.492188f,0.6875f, +0.5f,0.6875f, +0.507813f,0.6875f, +0.0f,0.695313f, +0.0078125f,0.695313f, +0.015625f,0.695313f, +0.0234375f,0.695313f, +0.03125f,0.695313f, +0.0390625f,0.695313f, +0.046875f,0.695313f, +0.0546875f,0.695313f, +0.0625f,0.695313f, +0.0703125f,0.695313f, +0.078125f,0.695313f, +0.0859375f,0.695313f, +0.09375f,0.695313f, +0.101563f,0.695313f, +0.109375f,0.695313f, +0.117188f,0.695313f, +0.125f,0.695313f, +0.132813f,0.695313f, +0.140625f,0.695313f, +0.148438f,0.695313f, +0.15625f,0.695313f, +0.164063f,0.695313f, +0.171875f,0.695313f, +0.179688f,0.695313f, +0.1875f,0.695313f, +0.195313f,0.695313f, +0.203125f,0.695313f, +0.210938f,0.695313f, +0.21875f,0.695313f, +0.226563f,0.695313f, +0.234375f,0.695313f, +0.242188f,0.695313f, +0.25f,0.695313f, +0.257813f,0.695313f, +0.265625f,0.695313f, +0.273438f,0.695313f, +0.28125f,0.695313f, +0.289063f,0.695313f, +0.296875f,0.695313f, +0.304688f,0.695313f, +0.3125f,0.695313f, +0.320313f,0.695313f, +0.328125f,0.695313f, +0.335938f,0.695313f, +0.34375f,0.695313f, +0.351563f,0.695313f, +0.359375f,0.695313f, +0.367188f,0.695313f, +0.375f,0.695313f, +0.382813f,0.695313f, +0.390625f,0.695313f, +0.398438f,0.695313f, +0.40625f,0.695313f, +0.414063f,0.695313f, +0.421875f,0.695313f, +0.429688f,0.695313f, +0.4375f,0.695313f, +0.445313f,0.695313f, +0.453125f,0.695313f, +0.460938f,0.695313f, +0.46875f,0.695313f, +0.476563f,0.695313f, +0.484375f,0.695313f, +0.492188f,0.695313f, +0.5f,0.695313f, +0.507813f,0.695313f, +0.0f,0.703125f, +0.0078125f,0.703125f, +0.015625f,0.703125f, +0.0234375f,0.703125f, +0.03125f,0.703125f, +0.0390625f,0.703125f, +0.046875f,0.703125f, +0.0546875f,0.703125f, +0.0625f,0.703125f, +0.0703125f,0.703125f, +0.078125f,0.703125f, +0.0859375f,0.703125f, +0.09375f,0.703125f, +0.101563f,0.703125f, +0.109375f,0.703125f, +0.117188f,0.703125f, +0.125f,0.703125f, +0.132813f,0.703125f, +0.140625f,0.703125f, +0.148438f,0.703125f, +0.15625f,0.703125f, +0.164063f,0.703125f, +0.171875f,0.703125f, +0.179688f,0.703125f, +0.1875f,0.703125f, +0.195313f,0.703125f, +0.203125f,0.703125f, +0.210938f,0.703125f, +0.21875f,0.703125f, +0.226563f,0.703125f, +0.234375f,0.703125f, +0.242188f,0.703125f, +0.25f,0.703125f, +0.257813f,0.703125f, +0.265625f,0.703125f, +0.273438f,0.703125f, +0.28125f,0.703125f, +0.289063f,0.703125f, +0.296875f,0.703125f, +0.304688f,0.703125f, +0.3125f,0.703125f, +0.320313f,0.703125f, +0.328125f,0.703125f, +0.335938f,0.703125f, +0.34375f,0.703125f, +0.351563f,0.703125f, +0.359375f,0.703125f, +0.367188f,0.703125f, +0.375f,0.703125f, +0.382813f,0.703125f, +0.390625f,0.703125f, +0.398438f,0.703125f, +0.40625f,0.703125f, +0.414063f,0.703125f, +0.421875f,0.703125f, +0.429688f,0.703125f, +0.4375f,0.703125f, +0.445313f,0.703125f, +0.453125f,0.703125f, +0.460938f,0.703125f, +0.46875f,0.703125f, +0.476563f,0.703125f, +0.484375f,0.703125f, +0.492188f,0.703125f, +0.5f,0.703125f, +0.507813f,0.703125f, +0.0f,0.710938f, +0.0078125f,0.710938f, +0.015625f,0.710938f, +0.0234375f,0.710938f, +0.03125f,0.710938f, +0.0390625f,0.710938f, +0.046875f,0.710938f, +0.0546875f,0.710938f, +0.0625f,0.710938f, +0.0703125f,0.710938f, +0.078125f,0.710938f, +0.0859375f,0.710938f, +0.09375f,0.710938f, +0.101563f,0.710938f, +0.109375f,0.710938f, +0.117188f,0.710938f, +0.125f,0.710938f, +0.132813f,0.710938f, +0.140625f,0.710938f, +0.148438f,0.710938f, +0.15625f,0.710938f, +0.164063f,0.710938f, +0.171875f,0.710938f, +0.179688f,0.710938f, +0.1875f,0.710938f, +0.195313f,0.710938f, +0.203125f,0.710938f, +0.210938f,0.710938f, +0.21875f,0.710938f, +0.226563f,0.710938f, +0.234375f,0.710938f, +0.242188f,0.710938f, +0.25f,0.710938f, +0.257813f,0.710938f, +0.265625f,0.710938f, +0.273438f,0.710938f, +0.28125f,0.710938f, +0.289063f,0.710938f, +0.296875f,0.710938f, +0.304688f,0.710938f, +0.3125f,0.710938f, +0.320313f,0.710938f, +0.328125f,0.710938f, +0.335938f,0.710938f, +0.34375f,0.710938f, +0.351563f,0.710938f, +0.359375f,0.710938f, +0.367188f,0.710938f, +0.375f,0.710938f, +0.382813f,0.710938f, +0.390625f,0.710938f, +0.398438f,0.710938f, +0.40625f,0.710938f, +0.414063f,0.710938f, +0.421875f,0.710938f, +0.429688f,0.710938f, +0.4375f,0.710938f, +0.445313f,0.710938f, +0.453125f,0.710938f, +0.460938f,0.710938f, +0.46875f,0.710938f, +0.476563f,0.710938f, +0.484375f,0.710938f, +0.492188f,0.710938f, +0.5f,0.710938f, +0.507813f,0.710938f, +0.0f,0.71875f, +0.0078125f,0.71875f, +0.015625f,0.71875f, +0.0234375f,0.71875f, +0.03125f,0.71875f, +0.0390625f,0.71875f, +0.046875f,0.71875f, +0.0546875f,0.71875f, +0.0625f,0.71875f, +0.0703125f,0.71875f, +0.078125f,0.71875f, +0.0859375f,0.71875f, +0.09375f,0.71875f, +0.101563f,0.71875f, +0.109375f,0.71875f, +0.117188f,0.71875f, +0.125f,0.71875f, +0.132813f,0.71875f, +0.140625f,0.71875f, +0.148438f,0.71875f, +0.15625f,0.71875f, +0.164063f,0.71875f, +0.171875f,0.71875f, +0.179688f,0.71875f, +0.1875f,0.71875f, +0.195313f,0.71875f, +0.203125f,0.71875f, +0.210938f,0.71875f, +0.21875f,0.71875f, +0.226563f,0.71875f, +0.234375f,0.71875f, +0.242188f,0.71875f, +0.25f,0.71875f, +0.257813f,0.71875f, +0.265625f,0.71875f, +0.273438f,0.71875f, +0.28125f,0.71875f, +0.289063f,0.71875f, +0.296875f,0.71875f, +0.304688f,0.71875f, +0.3125f,0.71875f, +0.320313f,0.71875f, +0.328125f,0.71875f, +0.335938f,0.71875f, +0.34375f,0.71875f, +0.351563f,0.71875f, +0.359375f,0.71875f, +0.367188f,0.71875f, +0.375f,0.71875f, +0.382813f,0.71875f, +0.390625f,0.71875f, +0.398438f,0.71875f, +0.40625f,0.71875f, +0.414063f,0.71875f, +0.421875f,0.71875f, +0.429688f,0.71875f, +0.4375f,0.71875f, +0.445313f,0.71875f, +0.453125f,0.71875f, +0.460938f,0.71875f, +0.46875f,0.71875f, +0.476563f,0.71875f, +0.484375f,0.71875f, +0.492188f,0.71875f, +0.5f,0.71875f, +0.507813f,0.71875f, +0.0f,0.726563f, +0.0078125f,0.726563f, +0.015625f,0.726563f, +0.0234375f,0.726563f, +0.03125f,0.726563f, +0.0390625f,0.726563f, +0.046875f,0.726563f, +0.0546875f,0.726563f, +0.0625f,0.726563f, +0.0703125f,0.726563f, +0.078125f,0.726563f, +0.0859375f,0.726563f, +0.09375f,0.726563f, +0.101563f,0.726563f, +0.109375f,0.726563f, +0.117188f,0.726563f, +0.125f,0.726563f, +0.132813f,0.726563f, +0.140625f,0.726563f, +0.148438f,0.726563f, +0.15625f,0.726563f, +0.164063f,0.726563f, +0.171875f,0.726563f, +0.179688f,0.726563f, +0.1875f,0.726563f, +0.195313f,0.726563f, +0.203125f,0.726563f, +0.210938f,0.726563f, +0.21875f,0.726563f, +0.226563f,0.726563f, +0.234375f,0.726563f, +0.242188f,0.726563f, +0.25f,0.726563f, +0.257813f,0.726563f, +0.265625f,0.726563f, +0.273438f,0.726563f, +0.28125f,0.726563f, +0.289063f,0.726563f, +0.296875f,0.726563f, +0.304688f,0.726563f, +0.3125f,0.726563f, +0.320313f,0.726563f, +0.328125f,0.726563f, +0.335938f,0.726563f, +0.34375f,0.726563f, +0.351563f,0.726563f, +0.359375f,0.726563f, +0.367188f,0.726563f, +0.375f,0.726563f, +0.382813f,0.726563f, +0.390625f,0.726563f, +0.398438f,0.726563f, +0.40625f,0.726563f, +0.414063f,0.726563f, +0.421875f,0.726563f, +0.429688f,0.726563f, +0.4375f,0.726563f, +0.445313f,0.726563f, +0.453125f,0.726563f, +0.460938f,0.726563f, +0.46875f,0.726563f, +0.476563f,0.726563f, +0.484375f,0.726563f, +0.492188f,0.726563f, +0.5f,0.726563f, +0.507813f,0.726563f, +0.0f,0.734375f, +0.0078125f,0.734375f, +0.015625f,0.734375f, +0.0234375f,0.734375f, +0.03125f,0.734375f, +0.0390625f,0.734375f, +0.046875f,0.734375f, +0.0546875f,0.734375f, +0.0625f,0.734375f, +0.0703125f,0.734375f, +0.078125f,0.734375f, +0.0859375f,0.734375f, +0.09375f,0.734375f, +0.101563f,0.734375f, +0.109375f,0.734375f, +0.117188f,0.734375f, +0.125f,0.734375f, +0.132813f,0.734375f, +0.140625f,0.734375f, +0.148438f,0.734375f, +0.15625f,0.734375f, +0.164063f,0.734375f, +0.171875f,0.734375f, +0.179688f,0.734375f, +0.1875f,0.734375f, +0.195313f,0.734375f, +0.203125f,0.734375f, +0.210938f,0.734375f, +0.21875f,0.734375f, +0.226563f,0.734375f, +0.234375f,0.734375f, +0.242188f,0.734375f, +0.25f,0.734375f, +0.257813f,0.734375f, +0.265625f,0.734375f, +0.273438f,0.734375f, +0.28125f,0.734375f, +0.289063f,0.734375f, +0.296875f,0.734375f, +0.304688f,0.734375f, +0.3125f,0.734375f, +0.320313f,0.734375f, +0.328125f,0.734375f, +0.335938f,0.734375f, +0.34375f,0.734375f, +0.351563f,0.734375f, +0.359375f,0.734375f, +0.367188f,0.734375f, +0.375f,0.734375f, +0.382813f,0.734375f, +0.390625f,0.734375f, +0.398438f,0.734375f, +0.40625f,0.734375f, +0.414063f,0.734375f, +0.421875f,0.734375f, +0.429688f,0.734375f, +0.4375f,0.734375f, +0.445313f,0.734375f, +0.453125f,0.734375f, +0.460938f,0.734375f, +0.46875f,0.734375f, +0.476563f,0.734375f, +0.484375f,0.734375f, +0.492188f,0.734375f, +0.5f,0.734375f, +0.507813f,0.734375f, +0.0f,0.742188f, +0.0078125f,0.742188f, +0.015625f,0.742188f, +0.0234375f,0.742188f, +0.03125f,0.742188f, +0.0390625f,0.742188f, +0.046875f,0.742188f, +0.0546875f,0.742188f, +0.0625f,0.742188f, +0.0703125f,0.742188f, +0.078125f,0.742188f, +0.0859375f,0.742188f, +0.09375f,0.742188f, +0.101563f,0.742188f, +0.109375f,0.742188f, +0.117188f,0.742188f, +0.125f,0.742188f, +0.132813f,0.742188f, +0.140625f,0.742188f, +0.148438f,0.742188f, +0.15625f,0.742188f, +0.164063f,0.742188f, +0.171875f,0.742188f, +0.179688f,0.742188f, +0.1875f,0.742188f, +0.195313f,0.742188f, +0.203125f,0.742188f, +0.210938f,0.742188f, +0.21875f,0.742188f, +0.226563f,0.742188f, +0.234375f,0.742188f, +0.242188f,0.742188f, +0.25f,0.742188f, +0.257813f,0.742188f, +0.265625f,0.742188f, +0.273438f,0.742188f, +0.28125f,0.742188f, +0.289063f,0.742188f, +0.296875f,0.742188f, +0.304688f,0.742188f, +0.3125f,0.742188f, +0.320313f,0.742188f, +0.328125f,0.742188f, +0.335938f,0.742188f, +0.34375f,0.742188f, +0.351563f,0.742188f, +0.359375f,0.742188f, +0.367188f,0.742188f, +0.375f,0.742188f, +0.382813f,0.742188f, +0.390625f,0.742188f, +0.398438f,0.742188f, +0.40625f,0.742188f, +0.414063f,0.742188f, +0.421875f,0.742188f, +0.429688f,0.742188f, +0.4375f,0.742188f, +0.445313f,0.742188f, +0.453125f,0.742188f, +0.460938f,0.742188f, +0.46875f,0.742188f, +0.476563f,0.742188f, +0.484375f,0.742188f, +0.492188f,0.742188f, +0.5f,0.742188f, +0.507813f,0.742188f, +0.0f,0.75f, +0.0078125f,0.75f, +0.015625f,0.75f, +0.0234375f,0.75f, +0.03125f,0.75f, +0.0390625f,0.75f, +0.046875f,0.75f, +0.0546875f,0.75f, +0.0625f,0.75f, +0.0703125f,0.75f, +0.078125f,0.75f, +0.0859375f,0.75f, +0.09375f,0.75f, +0.101563f,0.75f, +0.109375f,0.75f, +0.117188f,0.75f, +0.125f,0.75f, +0.132813f,0.75f, +0.140625f,0.75f, +0.148438f,0.75f, +0.15625f,0.75f, +0.164063f,0.75f, +0.171875f,0.75f, +0.179688f,0.75f, +0.1875f,0.75f, +0.195313f,0.75f, +0.203125f,0.75f, +0.210938f,0.75f, +0.21875f,0.75f, +0.226563f,0.75f, +0.234375f,0.75f, +0.242188f,0.75f, +0.25f,0.75f, +0.257813f,0.75f, +0.265625f,0.75f, +0.273438f,0.75f, +0.28125f,0.75f, +0.289063f,0.75f, +0.296875f,0.75f, +0.304688f,0.75f, +0.3125f,0.75f, +0.320313f,0.75f, +0.328125f,0.75f, +0.335938f,0.75f, +0.34375f,0.75f, +0.351563f,0.75f, +0.359375f,0.75f, +0.367188f,0.75f, +0.375f,0.75f, +0.382813f,0.75f, +0.390625f,0.75f, +0.398438f,0.75f, +0.40625f,0.75f, +0.414063f,0.75f, +0.421875f,0.75f, +0.429688f,0.75f, +0.4375f,0.75f, +0.445313f,0.75f, +0.453125f,0.75f, +0.460938f,0.75f, +0.46875f,0.75f, +0.476563f,0.75f, +0.484375f,0.75f, +0.492188f,0.75f, +0.5f,0.75f, +0.507813f,0.75f, +}; + +unsigned short Landscape05Idx[] = { +0,1,2, +3,2,1, +2,3,4, +5,4,3, +4,5,6, +7,6,5, +6,7,8, +9,8,7, +8,9,10, +11,10,9, +10,11,12, +13,12,11, +12,13,14, +15,14,13, +14,15,16, +17,16,15, +16,17,18, +19,18,17, +18,19,20, +21,20,19, +20,21,22, +23,22,21, +22,23,24, +25,24,23, +24,25,26, +27,26,25, +26,27,28, +29,28,27, +28,29,30, +31,30,29, +30,31,32, +33,32,31, +32,33,34, +35,34,33, +34,35,36, +37,36,35, +36,37,38, +39,38,37, +38,39,40, +41,40,39, +40,41,42, +43,42,41, +42,43,44, +45,44,43, +44,45,46, +47,46,45, +46,47,48, +49,48,47, +48,49,50, +51,50,49, +50,51,52, +53,52,51, +52,53,54, +55,54,53, +54,55,56, +57,56,55, +56,57,58, +59,58,57, +58,59,60, +61,60,59, +60,61,62, +63,62,61, +62,63,64, +65,64,63, +64,65,66, +67,66,65, +66,67,68, +69,68,67, +68,69,70, +71,70,69, +70,71,72, +73,72,71, +72,73,74, +75,74,73, +74,75,76, +77,76,75, +76,77,78, +79,78,77, +78,79,80, +81,80,79, +80,81,82, +83,82,81, +82,83,84, +85,84,83, +84,85,86, +87,86,85, +86,87,88, +89,88,87, +88,89,90, +91,90,89, +90,91,92, +93,92,91, +92,93,94, +95,94,93, +94,95,96, +97,96,95, +96,97,98, +99,98,97, +98,99,100, +101,100,99, +100,101,102, +103,102,101, +102,103,104, +105,104,103, +104,105,106, +107,106,105, +106,107,108, +109,108,107, +108,109,110, +111,110,109, +110,111,112, +113,112,111, +112,113,114, +115,114,113, +114,115,116, +117,116,115, +116,117,118, +119,118,117, +118,119,120, +121,120,119, +120,121,122, +123,122,121, +122,123,124, +125,124,123, +124,125,126, +127,126,125, +126,127,128, +129,128,127, +128,129,130, +131,130,129, +132,0,133, +2,133,0, +133,2,134, +4,134,2, +134,4,135, +6,135,4, +135,6,136, +8,136,6, +136,8,137, +10,137,8, +137,10,138, +12,138,10, +138,12,139, +14,139,12, +139,14,140, +16,140,14, +140,16,141, +18,141,16, +141,18,142, +20,142,18, +142,20,143, +22,143,20, +143,22,144, +24,144,22, +144,24,145, +26,145,24, +145,26,146, +28,146,26, +146,28,147, +30,147,28, +147,30,148, +32,148,30, +148,32,149, +34,149,32, +149,34,150, +36,150,34, +150,36,151, +38,151,36, +151,38,152, +40,152,38, +152,40,153, +42,153,40, +153,42,154, +44,154,42, +154,44,155, +46,155,44, +155,46,156, +48,156,46, +156,48,157, +50,157,48, +157,50,158, +52,158,50, +158,52,159, +54,159,52, +159,54,160, +56,160,54, +160,56,161, +58,161,56, +161,58,162, +60,162,58, +162,60,163, +62,163,60, +163,62,164, +64,164,62, +164,64,165, +66,165,64, +165,66,166, +68,166,66, +166,68,167, +70,167,68, +167,70,168, +72,168,70, +168,72,169, +74,169,72, +169,74,170, +76,170,74, +170,76,171, +78,171,76, +171,78,172, +80,172,78, +172,80,173, +82,173,80, +173,82,174, +84,174,82, +174,84,175, +86,175,84, +175,86,176, +88,176,86, +176,88,177, +90,177,88, +177,90,178, +92,178,90, +178,92,179, +94,179,92, +179,94,180, +96,180,94, +180,96,181, +98,181,96, +181,98,182, +100,182,98, +182,100,183, +102,183,100, +183,102,184, +104,184,102, +184,104,185, +106,185,104, +185,106,186, +108,186,106, +186,108,187, +110,187,108, +187,110,188, +112,188,110, +188,112,189, +114,189,112, +189,114,190, +116,190,114, +190,116,191, +118,191,116, +191,118,192, +120,192,118, +192,120,193, +122,193,120, +193,122,194, +124,194,122, +194,124,195, +126,195,124, +195,126,196, +128,196,126, +196,128,197, +130,197,128, +198,132,199, +133,199,132, +199,133,200, +134,200,133, +200,134,201, +135,201,134, +201,135,202, +136,202,135, +202,136,203, +137,203,136, +203,137,204, +138,204,137, +204,138,205, +139,205,138, +205,139,206, +140,206,139, +206,140,207, +141,207,140, +207,141,208, +142,208,141, +208,142,209, +143,209,142, +209,143,210, +144,210,143, +210,144,211, +145,211,144, +211,145,212, +146,212,145, +212,146,213, +147,213,146, +213,147,214, +148,214,147, +214,148,215, +149,215,148, +215,149,216, +150,216,149, +216,150,217, +151,217,150, +217,151,218, +152,218,151, +218,152,219, +153,219,152, +219,153,220, +154,220,153, +220,154,221, +155,221,154, +221,155,222, +156,222,155, +222,156,223, +157,223,156, +223,157,224, +158,224,157, +224,158,225, +159,225,158, +225,159,226, +160,226,159, +226,160,227, +161,227,160, +227,161,228, +162,228,161, +228,162,229, +163,229,162, +229,163,230, +164,230,163, +230,164,231, +165,231,164, +231,165,232, +166,232,165, +232,166,233, +167,233,166, +233,167,234, +168,234,167, +234,168,235, +169,235,168, +235,169,236, +170,236,169, +236,170,237, +171,237,170, +237,171,238, +172,238,171, +238,172,239, +173,239,172, +239,173,240, +174,240,173, +240,174,241, +175,241,174, +241,175,242, +176,242,175, +242,176,243, +177,243,176, +243,177,244, +178,244,177, +244,178,245, +179,245,178, +245,179,246, +180,246,179, +246,180,247, +181,247,180, +247,181,248, +182,248,181, +248,182,249, +183,249,182, +249,183,250, +184,250,183, +250,184,251, +185,251,184, +251,185,252, +186,252,185, +252,186,253, +187,253,186, +253,187,254, +188,254,187, +254,188,255, +189,255,188, +255,189,256, +190,256,189, +256,190,257, +191,257,190, +257,191,258, +192,258,191, +258,192,259, +193,259,192, +259,193,260, +194,260,193, +260,194,261, +195,261,194, +261,195,262, +196,262,195, +262,196,263, +197,263,196, +264,198,265, +199,265,198, +265,199,266, +200,266,199, +266,200,267, +201,267,200, +267,201,268, +202,268,201, +268,202,269, +203,269,202, +269,203,270, +204,270,203, +270,204,271, +205,271,204, +271,205,272, +206,272,205, +272,206,273, +207,273,206, +273,207,274, +208,274,207, +274,208,275, +209,275,208, +275,209,276, +210,276,209, +276,210,277, +211,277,210, +277,211,278, +212,278,211, +278,212,279, +213,279,212, +279,213,280, +214,280,213, +280,214,281, +215,281,214, +281,215,282, +216,282,215, +282,216,283, +217,283,216, +283,217,284, +218,284,217, +284,218,285, +219,285,218, +285,219,286, +220,286,219, +286,220,287, +221,287,220, +287,221,288, +222,288,221, +288,222,289, +223,289,222, +289,223,290, +224,290,223, +290,224,291, +225,291,224, +291,225,292, +226,292,225, +292,226,293, +227,293,226, +293,227,294, +228,294,227, +294,228,295, +229,295,228, +295,229,296, +230,296,229, +296,230,297, +231,297,230, +297,231,298, +232,298,231, +298,232,299, +233,299,232, +299,233,300, +234,300,233, +300,234,301, +235,301,234, +301,235,302, +236,302,235, +302,236,303, +237,303,236, +303,237,304, +238,304,237, +304,238,305, +239,305,238, +305,239,306, +240,306,239, +306,240,307, +241,307,240, +307,241,308, +242,308,241, +308,242,309, +243,309,242, +309,243,310, +244,310,243, +310,244,311, +245,311,244, +311,245,312, +246,312,245, +312,246,313, +247,313,246, +313,247,314, +248,314,247, +314,248,315, +249,315,248, +315,249,316, +250,316,249, +316,250,317, +251,317,250, +317,251,318, +252,318,251, +318,252,319, +253,319,252, +319,253,320, +254,320,253, +320,254,321, +255,321,254, +321,255,322, +256,322,255, +322,256,323, +257,323,256, +323,257,324, +258,324,257, +324,258,325, +259,325,258, +325,259,326, +260,326,259, +326,260,327, +261,327,260, +327,261,328, +262,328,261, +328,262,329, +263,329,262, +330,264,331, +265,331,264, +331,265,332, +266,332,265, +332,266,333, +267,333,266, +333,267,334, +268,334,267, +334,268,335, +269,335,268, +335,269,336, +270,336,269, +336,270,337, +271,337,270, +337,271,338, +272,338,271, +338,272,339, +273,339,272, +339,273,340, +274,340,273, +340,274,341, +275,341,274, +341,275,342, +276,342,275, +342,276,343, +277,343,276, +343,277,344, +278,344,277, +344,278,345, +279,345,278, +345,279,346, +280,346,279, +346,280,347, +281,347,280, +347,281,348, +282,348,281, +348,282,349, +283,349,282, +349,283,350, +284,350,283, +350,284,351, +285,351,284, +351,285,352, +286,352,285, +352,286,353, +287,353,286, +353,287,354, +288,354,287, +354,288,355, +289,355,288, +355,289,356, +290,356,289, +356,290,357, +291,357,290, +357,291,358, +292,358,291, +358,292,359, +293,359,292, +359,293,360, +294,360,293, +360,294,361, +295,361,294, +361,295,362, +296,362,295, +362,296,363, +297,363,296, +363,297,364, +298,364,297, +364,298,365, +299,365,298, +365,299,366, +300,366,299, +366,300,367, +301,367,300, +367,301,368, +302,368,301, +368,302,369, +303,369,302, +369,303,370, +304,370,303, +370,304,371, +305,371,304, +371,305,372, +306,372,305, +372,306,373, +307,373,306, +373,307,374, +308,374,307, +374,308,375, +309,375,308, +375,309,376, +310,376,309, +376,310,377, +311,377,310, +377,311,378, +312,378,311, +378,312,379, +313,379,312, +379,313,380, +314,380,313, +380,314,381, +315,381,314, +381,315,382, +316,382,315, +382,316,383, +317,383,316, +383,317,384, +318,384,317, +384,318,385, +319,385,318, +385,319,386, +320,386,319, +386,320,387, +321,387,320, +387,321,388, +322,388,321, +388,322,389, +323,389,322, +389,323,390, +324,390,323, +390,324,391, +325,391,324, +391,325,392, +326,392,325, +392,326,393, +327,393,326, +393,327,394, +328,394,327, +394,328,395, +329,395,328, +396,330,397, +331,397,330, +397,331,398, +332,398,331, +398,332,399, +333,399,332, +399,333,400, +334,400,333, +400,334,401, +335,401,334, +401,335,402, +336,402,335, +402,336,403, +337,403,336, +403,337,404, +338,404,337, +404,338,405, +339,405,338, +405,339,406, +340,406,339, +406,340,407, +341,407,340, +407,341,408, +342,408,341, +408,342,409, +343,409,342, +409,343,410, +344,410,343, +410,344,411, +345,411,344, +411,345,412, +346,412,345, +412,346,413, +347,413,346, +413,347,414, +348,414,347, +414,348,415, +349,415,348, +415,349,416, +350,416,349, +416,350,417, +351,417,350, +417,351,418, +352,418,351, +418,352,419, +353,419,352, +419,353,420, +354,420,353, +420,354,421, +355,421,354, +421,355,422, +356,422,355, +422,356,423, +357,423,356, +423,357,424, +358,424,357, +424,358,425, +359,425,358, +425,359,426, +360,426,359, +426,360,427, +361,427,360, +427,361,428, +362,428,361, +428,362,429, +363,429,362, +429,363,430, +364,430,363, +430,364,431, +365,431,364, +431,365,432, +366,432,365, +432,366,433, +367,433,366, +433,367,434, +368,434,367, +434,368,435, +369,435,368, +435,369,436, +370,436,369, +436,370,437, +371,437,370, +437,371,438, +372,438,371, +438,372,439, +373,439,372, +439,373,440, +374,440,373, +440,374,441, +375,441,374, +441,375,442, +376,442,375, +442,376,443, +377,443,376, +443,377,444, +378,444,377, +444,378,445, +379,445,378, +445,379,446, +380,446,379, +446,380,447, +381,447,380, +447,381,448, +382,448,381, +448,382,449, +383,449,382, +449,383,450, +384,450,383, +450,384,451, +385,451,384, +451,385,452, +386,452,385, +452,386,453, +387,453,386, +453,387,454, +388,454,387, +454,388,455, +389,455,388, +455,389,456, +390,456,389, +456,390,457, +391,457,390, +457,391,458, +392,458,391, +458,392,459, +393,459,392, +459,393,460, +394,460,393, +460,394,461, +395,461,394, +462,396,463, +397,463,396, +463,397,464, +398,464,397, +464,398,465, +399,465,398, +465,399,466, +400,466,399, +466,400,467, +401,467,400, +467,401,468, +402,468,401, +468,402,469, +403,469,402, +469,403,470, +404,470,403, +470,404,471, +405,471,404, +471,405,472, +406,472,405, +472,406,473, +407,473,406, +473,407,474, +408,474,407, +474,408,475, +409,475,408, +475,409,476, +410,476,409, +476,410,477, +411,477,410, +477,411,478, +412,478,411, +478,412,479, +413,479,412, +479,413,480, +414,480,413, +480,414,481, +415,481,414, +481,415,482, +416,482,415, +482,416,483, +417,483,416, +483,417,484, +418,484,417, +484,418,485, +419,485,418, +485,419,486, +420,486,419, +486,420,487, +421,487,420, +487,421,488, +422,488,421, +488,422,489, +423,489,422, +489,423,490, +424,490,423, +490,424,491, +425,491,424, +491,425,492, +426,492,425, +492,426,493, +427,493,426, +493,427,494, +428,494,427, +494,428,495, +429,495,428, +495,429,496, +430,496,429, +496,430,497, +431,497,430, +497,431,498, +432,498,431, +498,432,499, +433,499,432, +499,433,500, +434,500,433, +500,434,501, +435,501,434, +501,435,502, +436,502,435, +502,436,503, +437,503,436, +503,437,504, +438,504,437, +504,438,505, +439,505,438, +505,439,506, +440,506,439, +506,440,507, +441,507,440, +507,441,508, +442,508,441, +508,442,509, +443,509,442, +509,443,510, +444,510,443, +510,444,511, +445,511,444, +511,445,512, +446,512,445, +512,446,513, +447,513,446, +513,447,514, +448,514,447, +514,448,515, +449,515,448, +515,449,516, +450,516,449, +516,450,517, +451,517,450, +517,451,518, +452,518,451, +518,452,519, +453,519,452, +519,453,520, +454,520,453, +520,454,521, +455,521,454, +521,455,522, +456,522,455, +522,456,523, +457,523,456, +523,457,524, +458,524,457, +524,458,525, +459,525,458, +525,459,526, +460,526,459, +526,460,527, +461,527,460, +528,462,529, +463,529,462, +529,463,530, +464,530,463, +530,464,531, +465,531,464, +531,465,532, +466,532,465, +532,466,533, +467,533,466, +533,467,534, +468,534,467, +534,468,535, +469,535,468, +535,469,536, +470,536,469, +536,470,537, +471,537,470, +537,471,538, +472,538,471, +538,472,539, +473,539,472, +539,473,540, +474,540,473, +540,474,541, +475,541,474, +541,475,542, +476,542,475, +542,476,543, +477,543,476, +543,477,544, +478,544,477, +544,478,545, +479,545,478, +545,479,546, +480,546,479, +546,480,547, +481,547,480, +547,481,548, +482,548,481, +548,482,549, +483,549,482, +549,483,550, +484,550,483, +550,484,551, +485,551,484, +551,485,552, +486,552,485, +552,486,553, +487,553,486, +553,487,554, +488,554,487, +554,488,555, +489,555,488, +555,489,556, +490,556,489, +556,490,557, +491,557,490, +557,491,558, +492,558,491, +558,492,559, +493,559,492, +559,493,560, +494,560,493, +560,494,561, +495,561,494, +561,495,562, +496,562,495, +562,496,563, +497,563,496, +563,497,564, +498,564,497, +564,498,565, +499,565,498, +565,499,566, +500,566,499, +566,500,567, +501,567,500, +567,501,568, +502,568,501, +568,502,569, +503,569,502, +569,503,570, +504,570,503, +570,504,571, +505,571,504, +571,505,572, +506,572,505, +572,506,573, +507,573,506, +573,507,574, +508,574,507, +574,508,575, +509,575,508, +575,509,576, +510,576,509, +576,510,577, +511,577,510, +577,511,578, +512,578,511, +578,512,579, +513,579,512, +579,513,580, +514,580,513, +580,514,581, +515,581,514, +581,515,582, +516,582,515, +582,516,583, +517,583,516, +583,517,584, +518,584,517, +584,518,585, +519,585,518, +585,519,586, +520,586,519, +586,520,587, +521,587,520, +587,521,588, +522,588,521, +588,522,589, +523,589,522, +589,523,590, +524,590,523, +590,524,591, +525,591,524, +591,525,592, +526,592,525, +592,526,593, +527,593,526, +594,528,595, +529,595,528, +595,529,596, +530,596,529, +596,530,597, +531,597,530, +597,531,598, +532,598,531, +598,532,599, +533,599,532, +599,533,600, +534,600,533, +600,534,601, +535,601,534, +601,535,602, +536,602,535, +602,536,603, +537,603,536, +603,537,604, +538,604,537, +604,538,605, +539,605,538, +605,539,606, +540,606,539, +606,540,607, +541,607,540, +607,541,608, +542,608,541, +608,542,609, +543,609,542, +609,543,610, +544,610,543, +610,544,611, +545,611,544, +611,545,612, +546,612,545, +612,546,613, +547,613,546, +613,547,614, +548,614,547, +614,548,615, +549,615,548, +615,549,616, +550,616,549, +616,550,617, +551,617,550, +617,551,618, +552,618,551, +618,552,619, +553,619,552, +619,553,620, +554,620,553, +620,554,621, +555,621,554, +621,555,622, +556,622,555, +622,556,623, +557,623,556, +623,557,624, +558,624,557, +624,558,625, +559,625,558, +625,559,626, +560,626,559, +626,560,627, +561,627,560, +627,561,628, +562,628,561, +628,562,629, +563,629,562, +629,563,630, +564,630,563, +630,564,631, +565,631,564, +631,565,632, +566,632,565, +632,566,633, +567,633,566, +633,567,634, +568,634,567, +634,568,635, +569,635,568, +635,569,636, +570,636,569, +636,570,637, +571,637,570, +637,571,638, +572,638,571, +638,572,639, +573,639,572, +639,573,640, +574,640,573, +640,574,641, +575,641,574, +641,575,642, +576,642,575, +642,576,643, +577,643,576, +643,577,644, +578,644,577, +644,578,645, +579,645,578, +645,579,646, +580,646,579, +646,580,647, +581,647,580, +647,581,648, +582,648,581, +648,582,649, +583,649,582, +649,583,650, +584,650,583, +650,584,651, +585,651,584, +651,585,652, +586,652,585, +652,586,653, +587,653,586, +653,587,654, +588,654,587, +654,588,655, +589,655,588, +655,589,656, +590,656,589, +656,590,657, +591,657,590, +657,591,658, +592,658,591, +658,592,659, +593,659,592, +660,594,661, +595,661,594, +661,595,662, +596,662,595, +662,596,663, +597,663,596, +663,597,664, +598,664,597, +664,598,665, +599,665,598, +665,599,666, +600,666,599, +666,600,667, +601,667,600, +667,601,668, +602,668,601, +668,602,669, +603,669,602, +669,603,670, +604,670,603, +670,604,671, +605,671,604, +671,605,672, +606,672,605, +672,606,673, +607,673,606, +673,607,674, +608,674,607, +674,608,675, +609,675,608, +675,609,676, +610,676,609, +676,610,677, +611,677,610, +677,611,678, +612,678,611, +678,612,679, +613,679,612, +679,613,680, +614,680,613, +680,614,681, +615,681,614, +681,615,682, +616,682,615, +682,616,683, +617,683,616, +683,617,684, +618,684,617, +684,618,685, +619,685,618, +685,619,686, +620,686,619, +686,620,687, +621,687,620, +687,621,688, +622,688,621, +688,622,689, +623,689,622, +689,623,690, +624,690,623, +690,624,691, +625,691,624, +691,625,692, +626,692,625, +692,626,693, +627,693,626, +693,627,694, +628,694,627, +694,628,695, +629,695,628, +695,629,696, +630,696,629, +696,630,697, +631,697,630, +697,631,698, +632,698,631, +698,632,699, +633,699,632, +699,633,700, +634,700,633, +700,634,701, +635,701,634, +701,635,702, +636,702,635, +702,636,703, +637,703,636, +703,637,704, +638,704,637, +704,638,705, +639,705,638, +705,639,706, +640,706,639, +706,640,707, +641,707,640, +707,641,708, +642,708,641, +708,642,709, +643,709,642, +709,643,710, +644,710,643, +710,644,711, +645,711,644, +711,645,712, +646,712,645, +712,646,713, +647,713,646, +713,647,714, +648,714,647, +714,648,715, +649,715,648, +715,649,716, +650,716,649, +716,650,717, +651,717,650, +717,651,718, +652,718,651, +718,652,719, +653,719,652, +719,653,720, +654,720,653, +720,654,721, +655,721,654, +721,655,722, +656,722,655, +722,656,723, +657,723,656, +723,657,724, +658,724,657, +724,658,725, +659,725,658, +726,660,727, +661,727,660, +727,661,728, +662,728,661, +728,662,729, +663,729,662, +729,663,730, +664,730,663, +730,664,731, +665,731,664, +731,665,732, +666,732,665, +732,666,733, +667,733,666, +733,667,734, +668,734,667, +734,668,735, +669,735,668, +735,669,736, +670,736,669, +736,670,737, +671,737,670, +737,671,738, +672,738,671, +738,672,739, +673,739,672, +739,673,740, +674,740,673, +740,674,741, +675,741,674, +741,675,742, +676,742,675, +742,676,743, +677,743,676, +743,677,744, +678,744,677, +744,678,745, +679,745,678, +745,679,746, +680,746,679, +746,680,747, +681,747,680, +747,681,748, +682,748,681, +748,682,749, +683,749,682, +749,683,750, +684,750,683, +750,684,751, +685,751,684, +751,685,752, +686,752,685, +752,686,753, +687,753,686, +753,687,754, +688,754,687, +754,688,755, +689,755,688, +755,689,756, +690,756,689, +756,690,757, +691,757,690, +757,691,758, +692,758,691, +758,692,759, +693,759,692, +759,693,760, +694,760,693, +760,694,761, +695,761,694, +761,695,762, +696,762,695, +762,696,763, +697,763,696, +763,697,764, +698,764,697, +764,698,765, +699,765,698, +765,699,766, +700,766,699, +766,700,767, +701,767,700, +767,701,768, +702,768,701, +768,702,769, +703,769,702, +769,703,770, +704,770,703, +770,704,771, +705,771,704, +771,705,772, +706,772,705, +772,706,773, +707,773,706, +773,707,774, +708,774,707, +774,708,775, +709,775,708, +775,709,776, +710,776,709, +776,710,777, +711,777,710, +777,711,778, +712,778,711, +778,712,779, +713,779,712, +779,713,780, +714,780,713, +780,714,781, +715,781,714, +781,715,782, +716,782,715, +782,716,783, +717,783,716, +783,717,784, +718,784,717, +784,718,785, +719,785,718, +785,719,786, +720,786,719, +786,720,787, +721,787,720, +787,721,788, +722,788,721, +788,722,789, +723,789,722, +789,723,790, +724,790,723, +790,724,791, +725,791,724, +792,726,793, +727,793,726, +793,727,794, +728,794,727, +794,728,795, +729,795,728, +795,729,796, +730,796,729, +796,730,797, +731,797,730, +797,731,798, +732,798,731, +798,732,799, +733,799,732, +799,733,800, +734,800,733, +800,734,801, +735,801,734, +801,735,802, +736,802,735, +802,736,803, +737,803,736, +803,737,804, +738,804,737, +804,738,805, +739,805,738, +805,739,806, +740,806,739, +806,740,807, +741,807,740, +807,741,808, +742,808,741, +808,742,809, +743,809,742, +809,743,810, +744,810,743, +810,744,811, +745,811,744, +811,745,812, +746,812,745, +812,746,813, +747,813,746, +813,747,814, +748,814,747, +814,748,815, +749,815,748, +815,749,816, +750,816,749, +816,750,817, +751,817,750, +817,751,818, +752,818,751, +818,752,819, +753,819,752, +819,753,820, +754,820,753, +820,754,821, +755,821,754, +821,755,822, +756,822,755, +822,756,823, +757,823,756, +823,757,824, +758,824,757, +824,758,825, +759,825,758, +825,759,826, +760,826,759, +826,760,827, +761,827,760, +827,761,828, +762,828,761, +828,762,829, +763,829,762, +829,763,830, +764,830,763, +830,764,831, +765,831,764, +831,765,832, +766,832,765, +832,766,833, +767,833,766, +833,767,834, +768,834,767, +834,768,835, +769,835,768, +835,769,836, +770,836,769, +836,770,837, +771,837,770, +837,771,838, +772,838,771, +838,772,839, +773,839,772, +839,773,840, +774,840,773, +840,774,841, +775,841,774, +841,775,842, +776,842,775, +842,776,843, +777,843,776, +843,777,844, +778,844,777, +844,778,845, +779,845,778, +845,779,846, +780,846,779, +846,780,847, +781,847,780, +847,781,848, +782,848,781, +848,782,849, +783,849,782, +849,783,850, +784,850,783, +850,784,851, +785,851,784, +851,785,852, +786,852,785, +852,786,853, +787,853,786, +853,787,854, +788,854,787, +854,788,855, +789,855,788, +855,789,856, +790,856,789, +856,790,857, +791,857,790, +858,792,859, +793,859,792, +859,793,860, +794,860,793, +860,794,861, +795,861,794, +861,795,862, +796,862,795, +862,796,863, +797,863,796, +863,797,864, +798,864,797, +864,798,865, +799,865,798, +865,799,866, +800,866,799, +866,800,867, +801,867,800, +867,801,868, +802,868,801, +868,802,869, +803,869,802, +869,803,870, +804,870,803, +870,804,871, +805,871,804, +871,805,872, +806,872,805, +872,806,873, +807,873,806, +873,807,874, +808,874,807, +874,808,875, +809,875,808, +875,809,876, +810,876,809, +876,810,877, +811,877,810, +877,811,878, +812,878,811, +878,812,879, +813,879,812, +879,813,880, +814,880,813, +880,814,881, +815,881,814, +881,815,882, +816,882,815, +882,816,883, +817,883,816, +883,817,884, +818,884,817, +884,818,885, +819,885,818, +885,819,886, +820,886,819, +886,820,887, +821,887,820, +887,821,888, +822,888,821, +888,822,889, +823,889,822, +889,823,890, +824,890,823, +890,824,891, +825,891,824, +891,825,892, +826,892,825, +892,826,893, +827,893,826, +893,827,894, +828,894,827, +894,828,895, +829,895,828, +895,829,896, +830,896,829, +896,830,897, +831,897,830, +897,831,898, +832,898,831, +898,832,899, +833,899,832, +899,833,900, +834,900,833, +900,834,901, +835,901,834, +901,835,902, +836,902,835, +902,836,903, +837,903,836, +903,837,904, +838,904,837, +904,838,905, +839,905,838, +905,839,906, +840,906,839, +906,840,907, +841,907,840, +907,841,908, +842,908,841, +908,842,909, +843,909,842, +909,843,910, +844,910,843, +910,844,911, +845,911,844, +911,845,912, +846,912,845, +912,846,913, +847,913,846, +913,847,914, +848,914,847, +914,848,915, +849,915,848, +915,849,916, +850,916,849, +916,850,917, +851,917,850, +917,851,918, +852,918,851, +918,852,919, +853,919,852, +919,853,920, +854,920,853, +920,854,921, +855,921,854, +921,855,922, +856,922,855, +922,856,923, +857,923,856, +924,858,925, +859,925,858, +925,859,926, +860,926,859, +926,860,927, +861,927,860, +927,861,928, +862,928,861, +928,862,929, +863,929,862, +929,863,930, +864,930,863, +930,864,931, +865,931,864, +931,865,932, +866,932,865, +932,866,933, +867,933,866, +933,867,934, +868,934,867, +934,868,935, +869,935,868, +935,869,936, +870,936,869, +936,870,937, +871,937,870, +937,871,938, +872,938,871, +938,872,939, +873,939,872, +939,873,940, +874,940,873, +940,874,941, +875,941,874, +941,875,942, +876,942,875, +942,876,943, +877,943,876, +943,877,944, +878,944,877, +944,878,945, +879,945,878, +945,879,946, +880,946,879, +946,880,947, +881,947,880, +947,881,948, +882,948,881, +948,882,949, +883,949,882, +949,883,950, +884,950,883, +950,884,951, +885,951,884, +951,885,952, +886,952,885, +952,886,953, +887,953,886, +953,887,954, +888,954,887, +954,888,955, +889,955,888, +955,889,956, +890,956,889, +956,890,957, +891,957,890, +957,891,958, +892,958,891, +958,892,959, +893,959,892, +959,893,960, +894,960,893, +960,894,961, +895,961,894, +961,895,962, +896,962,895, +962,896,963, +897,963,896, +963,897,964, +898,964,897, +964,898,965, +899,965,898, +965,899,966, +900,966,899, +966,900,967, +901,967,900, +967,901,968, +902,968,901, +968,902,969, +903,969,902, +969,903,970, +904,970,903, +970,904,971, +905,971,904, +971,905,972, +906,972,905, +972,906,973, +907,973,906, +973,907,974, +908,974,907, +974,908,975, +909,975,908, +975,909,976, +910,976,909, +976,910,977, +911,977,910, +977,911,978, +912,978,911, +978,912,979, +913,979,912, +979,913,980, +914,980,913, +980,914,981, +915,981,914, +981,915,982, +916,982,915, +982,916,983, +917,983,916, +983,917,984, +918,984,917, +984,918,985, +919,985,918, +985,919,986, +920,986,919, +986,920,987, +921,987,920, +987,921,988, +922,988,921, +988,922,989, +923,989,922, +990,924,991, +925,991,924, +991,925,992, +926,992,925, +992,926,993, +927,993,926, +993,927,994, +928,994,927, +994,928,995, +929,995,928, +995,929,996, +930,996,929, +996,930,997, +931,997,930, +997,931,998, +932,998,931, +998,932,999, +933,999,932, +999,933,1000, +934,1000,933, +1000,934,1001, +935,1001,934, +1001,935,1002, +936,1002,935, +1002,936,1003, +937,1003,936, +1003,937,1004, +938,1004,937, +1004,938,1005, +939,1005,938, +1005,939,1006, +940,1006,939, +1006,940,1007, +941,1007,940, +1007,941,1008, +942,1008,941, +1008,942,1009, +943,1009,942, +1009,943,1010, +944,1010,943, +1010,944,1011, +945,1011,944, +1011,945,1012, +946,1012,945, +1012,946,1013, +947,1013,946, +1013,947,1014, +948,1014,947, +1014,948,1015, +949,1015,948, +1015,949,1016, +950,1016,949, +1016,950,1017, +951,1017,950, +1017,951,1018, +952,1018,951, +1018,952,1019, +953,1019,952, +1019,953,1020, +954,1020,953, +1020,954,1021, +955,1021,954, +1021,955,1022, +956,1022,955, +1022,956,1023, +957,1023,956, +1023,957,1024, +958,1024,957, +1024,958,1025, +959,1025,958, +1025,959,1026, +960,1026,959, +1026,960,1027, +961,1027,960, +1027,961,1028, +962,1028,961, +1028,962,1029, +963,1029,962, +1029,963,1030, +964,1030,963, +1030,964,1031, +965,1031,964, +1031,965,1032, +966,1032,965, +1032,966,1033, +967,1033,966, +1033,967,1034, +968,1034,967, +1034,968,1035, +969,1035,968, +1035,969,1036, +970,1036,969, +1036,970,1037, +971,1037,970, +1037,971,1038, +972,1038,971, +1038,972,1039, +973,1039,972, +1039,973,1040, +974,1040,973, +1040,974,1041, +975,1041,974, +1041,975,1042, +976,1042,975, +1042,976,1043, +977,1043,976, +1043,977,1044, +978,1044,977, +1044,978,1045, +979,1045,978, +1045,979,1046, +980,1046,979, +1046,980,1047, +981,1047,980, +1047,981,1048, +982,1048,981, +1048,982,1049, +983,1049,982, +1049,983,1050, +984,1050,983, +1050,984,1051, +985,1051,984, +1051,985,1052, +986,1052,985, +1052,986,1053, +987,1053,986, +1053,987,1054, +988,1054,987, +1054,988,1055, +989,1055,988, +1056,990,1057, +991,1057,990, +1057,991,1058, +992,1058,991, +1058,992,1059, +993,1059,992, +1059,993,1060, +994,1060,993, +1060,994,1061, +995,1061,994, +1061,995,1062, +996,1062,995, +1062,996,1063, +997,1063,996, +1063,997,1064, +998,1064,997, +1064,998,1065, +999,1065,998, +1065,999,1066, +1000,1066,999, +1066,1000,1067, +1001,1067,1000, +1067,1001,1068, +1002,1068,1001, +1068,1002,1069, +1003,1069,1002, +1069,1003,1070, +1004,1070,1003, +1070,1004,1071, +1005,1071,1004, +1071,1005,1072, +1006,1072,1005, +1072,1006,1073, +1007,1073,1006, +1073,1007,1074, +1008,1074,1007, +1074,1008,1075, +1009,1075,1008, +1075,1009,1076, +1010,1076,1009, +1076,1010,1077, +1011,1077,1010, +1077,1011,1078, +1012,1078,1011, +1078,1012,1079, +1013,1079,1012, +1079,1013,1080, +1014,1080,1013, +1080,1014,1081, +1015,1081,1014, +1081,1015,1082, +1016,1082,1015, +1082,1016,1083, +1017,1083,1016, +1083,1017,1084, +1018,1084,1017, +1084,1018,1085, +1019,1085,1018, +1085,1019,1086, +1020,1086,1019, +1086,1020,1087, +1021,1087,1020, +1087,1021,1088, +1022,1088,1021, +1088,1022,1089, +1023,1089,1022, +1089,1023,1090, +1024,1090,1023, +1090,1024,1091, +1025,1091,1024, +1091,1025,1092, +1026,1092,1025, +1092,1026,1093, +1027,1093,1026, +1093,1027,1094, +1028,1094,1027, +1094,1028,1095, +1029,1095,1028, +1095,1029,1096, +1030,1096,1029, +1096,1030,1097, +1031,1097,1030, +1097,1031,1098, +1032,1098,1031, +1098,1032,1099, +1033,1099,1032, +1099,1033,1100, +1034,1100,1033, +1100,1034,1101, +1035,1101,1034, +1101,1035,1102, +1036,1102,1035, +1102,1036,1103, +1037,1103,1036, +1103,1037,1104, +1038,1104,1037, +1104,1038,1105, +1039,1105,1038, +1105,1039,1106, +1040,1106,1039, +1106,1040,1107, +1041,1107,1040, +1107,1041,1108, +1042,1108,1041, +1108,1042,1109, +1043,1109,1042, +1109,1043,1110, +1044,1110,1043, +1110,1044,1111, +1045,1111,1044, +1111,1045,1112, +1046,1112,1045, +1112,1046,1113, +1047,1113,1046, +1113,1047,1114, +1048,1114,1047, +1114,1048,1115, +1049,1115,1048, +1115,1049,1116, +1050,1116,1049, +1116,1050,1117, +1051,1117,1050, +1117,1051,1118, +1052,1118,1051, +1118,1052,1119, +1053,1119,1052, +1119,1053,1120, +1054,1120,1053, +1120,1054,1121, +1055,1121,1054, +1122,1056,1123, +1057,1123,1056, +1123,1057,1124, +1058,1124,1057, +1124,1058,1125, +1059,1125,1058, +1125,1059,1126, +1060,1126,1059, +1126,1060,1127, +1061,1127,1060, +1127,1061,1128, +1062,1128,1061, +1128,1062,1129, +1063,1129,1062, +1129,1063,1130, +1064,1130,1063, +1130,1064,1131, +1065,1131,1064, +1131,1065,1132, +1066,1132,1065, +1132,1066,1133, +1067,1133,1066, +1133,1067,1134, +1068,1134,1067, +1134,1068,1135, +1069,1135,1068, +1135,1069,1136, +1070,1136,1069, +1136,1070,1137, +1071,1137,1070, +1137,1071,1138, +1072,1138,1071, +1138,1072,1139, +1073,1139,1072, +1139,1073,1140, +1074,1140,1073, +1140,1074,1141, +1075,1141,1074, +1141,1075,1142, +1076,1142,1075, +1142,1076,1143, +1077,1143,1076, +1143,1077,1144, +1078,1144,1077, +1144,1078,1145, +1079,1145,1078, +1145,1079,1146, +1080,1146,1079, +1146,1080,1147, +1081,1147,1080, +1147,1081,1148, +1082,1148,1081, +1148,1082,1149, +1083,1149,1082, +1149,1083,1150, +1084,1150,1083, +1150,1084,1151, +1085,1151,1084, +1151,1085,1152, +1086,1152,1085, +1152,1086,1153, +1087,1153,1086, +1153,1087,1154, +1088,1154,1087, +1154,1088,1155, +1089,1155,1088, +1155,1089,1156, +1090,1156,1089, +1156,1090,1157, +1091,1157,1090, +1157,1091,1158, +1092,1158,1091, +1158,1092,1159, +1093,1159,1092, +1159,1093,1160, +1094,1160,1093, +1160,1094,1161, +1095,1161,1094, +1161,1095,1162, +1096,1162,1095, +1162,1096,1163, +1097,1163,1096, +1163,1097,1164, +1098,1164,1097, +1164,1098,1165, +1099,1165,1098, +1165,1099,1166, +1100,1166,1099, +1166,1100,1167, +1101,1167,1100, +1167,1101,1168, +1102,1168,1101, +1168,1102,1169, +1103,1169,1102, +1169,1103,1170, +1104,1170,1103, +1170,1104,1171, +1105,1171,1104, +1171,1105,1172, +1106,1172,1105, +1172,1106,1173, +1107,1173,1106, +1173,1107,1174, +1108,1174,1107, +1174,1108,1175, +1109,1175,1108, +1175,1109,1176, +1110,1176,1109, +1176,1110,1177, +1111,1177,1110, +1177,1111,1178, +1112,1178,1111, +1178,1112,1179, +1113,1179,1112, +1179,1113,1180, +1114,1180,1113, +1180,1114,1181, +1115,1181,1114, +1181,1115,1182, +1116,1182,1115, +1182,1116,1183, +1117,1183,1116, +1183,1117,1184, +1118,1184,1117, +1184,1118,1185, +1119,1185,1118, +1185,1119,1186, +1120,1186,1119, +1186,1120,1187, +1121,1187,1120, +1188,1122,1189, +1123,1189,1122, +1189,1123,1190, +1124,1190,1123, +1190,1124,1191, +1125,1191,1124, +1191,1125,1192, +1126,1192,1125, +1192,1126,1193, +1127,1193,1126, +1193,1127,1194, +1128,1194,1127, +1194,1128,1195, +1129,1195,1128, +1195,1129,1196, +1130,1196,1129, +1196,1130,1197, +1131,1197,1130, +1197,1131,1198, +1132,1198,1131, +1198,1132,1199, +1133,1199,1132, +1199,1133,1200, +1134,1200,1133, +1200,1134,1201, +1135,1201,1134, +1201,1135,1202, +1136,1202,1135, +1202,1136,1203, +1137,1203,1136, +1203,1137,1204, +1138,1204,1137, +1204,1138,1205, +1139,1205,1138, +1205,1139,1206, +1140,1206,1139, +1206,1140,1207, +1141,1207,1140, +1207,1141,1208, +1142,1208,1141, +1208,1142,1209, +1143,1209,1142, +1209,1143,1210, +1144,1210,1143, +1210,1144,1211, +1145,1211,1144, +1211,1145,1212, +1146,1212,1145, +1212,1146,1213, +1147,1213,1146, +1213,1147,1214, +1148,1214,1147, +1214,1148,1215, +1149,1215,1148, +1215,1149,1216, +1150,1216,1149, +1216,1150,1217, +1151,1217,1150, +1217,1151,1218, +1152,1218,1151, +1218,1152,1219, +1153,1219,1152, +1219,1153,1220, +1154,1220,1153, +1220,1154,1221, +1155,1221,1154, +1221,1155,1222, +1156,1222,1155, +1222,1156,1223, +1157,1223,1156, +1223,1157,1224, +1158,1224,1157, +1224,1158,1225, +1159,1225,1158, +1225,1159,1226, +1160,1226,1159, +1226,1160,1227, +1161,1227,1160, +1227,1161,1228, +1162,1228,1161, +1228,1162,1229, +1163,1229,1162, +1229,1163,1230, +1164,1230,1163, +1230,1164,1231, +1165,1231,1164, +1231,1165,1232, +1166,1232,1165, +1232,1166,1233, +1167,1233,1166, +1233,1167,1234, +1168,1234,1167, +1234,1168,1235, +1169,1235,1168, +1235,1169,1236, +1170,1236,1169, +1236,1170,1237, +1171,1237,1170, +1237,1171,1238, +1172,1238,1171, +1238,1172,1239, +1173,1239,1172, +1239,1173,1240, +1174,1240,1173, +1240,1174,1241, +1175,1241,1174, +1241,1175,1242, +1176,1242,1175, +1242,1176,1243, +1177,1243,1176, +1243,1177,1244, +1178,1244,1177, +1244,1178,1245, +1179,1245,1178, +1245,1179,1246, +1180,1246,1179, +1246,1180,1247, +1181,1247,1180, +1247,1181,1248, +1182,1248,1181, +1248,1182,1249, +1183,1249,1182, +1249,1183,1250, +1184,1250,1183, +1250,1184,1251, +1185,1251,1184, +1251,1185,1252, +1186,1252,1185, +1252,1186,1253, +1187,1253,1186, +1254,1188,1255, +1189,1255,1188, +1255,1189,1256, +1190,1256,1189, +1256,1190,1257, +1191,1257,1190, +1257,1191,1258, +1192,1258,1191, +1258,1192,1259, +1193,1259,1192, +1259,1193,1260, +1194,1260,1193, +1260,1194,1261, +1195,1261,1194, +1261,1195,1262, +1196,1262,1195, +1262,1196,1263, +1197,1263,1196, +1263,1197,1264, +1198,1264,1197, +1264,1198,1265, +1199,1265,1198, +1265,1199,1266, +1200,1266,1199, +1266,1200,1267, +1201,1267,1200, +1267,1201,1268, +1202,1268,1201, +1268,1202,1269, +1203,1269,1202, +1269,1203,1270, +1204,1270,1203, +1270,1204,1271, +1205,1271,1204, +1271,1205,1272, +1206,1272,1205, +1272,1206,1273, +1207,1273,1206, +1273,1207,1274, +1208,1274,1207, +1274,1208,1275, +1209,1275,1208, +1275,1209,1276, +1210,1276,1209, +1276,1210,1277, +1211,1277,1210, +1277,1211,1278, +1212,1278,1211, +1278,1212,1279, +1213,1279,1212, +1279,1213,1280, +1214,1280,1213, +1280,1214,1281, +1215,1281,1214, +1281,1215,1282, +1216,1282,1215, +1282,1216,1283, +1217,1283,1216, +1283,1217,1284, +1218,1284,1217, +1284,1218,1285, +1219,1285,1218, +1285,1219,1286, +1220,1286,1219, +1286,1220,1287, +1221,1287,1220, +1287,1221,1288, +1222,1288,1221, +1288,1222,1289, +1223,1289,1222, +1289,1223,1290, +1224,1290,1223, +1290,1224,1291, +1225,1291,1224, +1291,1225,1292, +1226,1292,1225, +1292,1226,1293, +1227,1293,1226, +1293,1227,1294, +1228,1294,1227, +1294,1228,1295, +1229,1295,1228, +1295,1229,1296, +1230,1296,1229, +1296,1230,1297, +1231,1297,1230, +1297,1231,1298, +1232,1298,1231, +1298,1232,1299, +1233,1299,1232, +1299,1233,1300, +1234,1300,1233, +1300,1234,1301, +1235,1301,1234, +1301,1235,1302, +1236,1302,1235, +1302,1236,1303, +1237,1303,1236, +1303,1237,1304, +1238,1304,1237, +1304,1238,1305, +1239,1305,1238, +1305,1239,1306, +1240,1306,1239, +1306,1240,1307, +1241,1307,1240, +1307,1241,1308, +1242,1308,1241, +1308,1242,1309, +1243,1309,1242, +1309,1243,1310, +1244,1310,1243, +1310,1244,1311, +1245,1311,1244, +1311,1245,1312, +1246,1312,1245, +1312,1246,1313, +1247,1313,1246, +1313,1247,1314, +1248,1314,1247, +1314,1248,1315, +1249,1315,1248, +1315,1249,1316, +1250,1316,1249, +1316,1250,1317, +1251,1317,1250, +1317,1251,1318, +1252,1318,1251, +1318,1252,1319, +1253,1319,1252, +1320,1254,1321, +1255,1321,1254, +1321,1255,1322, +1256,1322,1255, +1322,1256,1323, +1257,1323,1256, +1323,1257,1324, +1258,1324,1257, +1324,1258,1325, +1259,1325,1258, +1325,1259,1326, +1260,1326,1259, +1326,1260,1327, +1261,1327,1260, +1327,1261,1328, +1262,1328,1261, +1328,1262,1329, +1263,1329,1262, +1329,1263,1330, +1264,1330,1263, +1330,1264,1331, +1265,1331,1264, +1331,1265,1332, +1266,1332,1265, +1332,1266,1333, +1267,1333,1266, +1333,1267,1334, +1268,1334,1267, +1334,1268,1335, +1269,1335,1268, +1335,1269,1336, +1270,1336,1269, +1336,1270,1337, +1271,1337,1270, +1337,1271,1338, +1272,1338,1271, +1338,1272,1339, +1273,1339,1272, +1339,1273,1340, +1274,1340,1273, +1340,1274,1341, +1275,1341,1274, +1341,1275,1342, +1276,1342,1275, +1342,1276,1343, +1277,1343,1276, +1343,1277,1344, +1278,1344,1277, +1344,1278,1345, +1279,1345,1278, +1345,1279,1346, +1280,1346,1279, +1346,1280,1347, +1281,1347,1280, +1347,1281,1348, +1282,1348,1281, +1348,1282,1349, +1283,1349,1282, +1349,1283,1350, +1284,1350,1283, +1350,1284,1351, +1285,1351,1284, +1351,1285,1352, +1286,1352,1285, +1352,1286,1353, +1287,1353,1286, +1353,1287,1354, +1288,1354,1287, +1354,1288,1355, +1289,1355,1288, +1355,1289,1356, +1290,1356,1289, +1356,1290,1357, +1291,1357,1290, +1357,1291,1358, +1292,1358,1291, +1358,1292,1359, +1293,1359,1292, +1359,1293,1360, +1294,1360,1293, +1360,1294,1361, +1295,1361,1294, +1361,1295,1362, +1296,1362,1295, +1362,1296,1363, +1297,1363,1296, +1363,1297,1364, +1298,1364,1297, +1364,1298,1365, +1299,1365,1298, +1365,1299,1366, +1300,1366,1299, +1366,1300,1367, +1301,1367,1300, +1367,1301,1368, +1302,1368,1301, +1368,1302,1369, +1303,1369,1302, +1369,1303,1370, +1304,1370,1303, +1370,1304,1371, +1305,1371,1304, +1371,1305,1372, +1306,1372,1305, +1372,1306,1373, +1307,1373,1306, +1373,1307,1374, +1308,1374,1307, +1374,1308,1375, +1309,1375,1308, +1375,1309,1376, +1310,1376,1309, +1376,1310,1377, +1311,1377,1310, +1377,1311,1378, +1312,1378,1311, +1378,1312,1379, +1313,1379,1312, +1379,1313,1380, +1314,1380,1313, +1380,1314,1381, +1315,1381,1314, +1381,1315,1382, +1316,1382,1315, +1382,1316,1383, +1317,1383,1316, +1383,1317,1384, +1318,1384,1317, +1384,1318,1385, +1319,1385,1318, +1386,1320,1387, +1321,1387,1320, +1387,1321,1388, +1322,1388,1321, +1388,1322,1389, +1323,1389,1322, +1389,1323,1390, +1324,1390,1323, +1390,1324,1391, +1325,1391,1324, +1391,1325,1392, +1326,1392,1325, +1392,1326,1393, +1327,1393,1326, +1393,1327,1394, +1328,1394,1327, +1394,1328,1395, +1329,1395,1328, +1395,1329,1396, +1330,1396,1329, +1396,1330,1397, +1331,1397,1330, +1397,1331,1398, +1332,1398,1331, +1398,1332,1399, +1333,1399,1332, +1399,1333,1400, +1334,1400,1333, +1400,1334,1401, +1335,1401,1334, +1401,1335,1402, +1336,1402,1335, +1402,1336,1403, +1337,1403,1336, +1403,1337,1404, +1338,1404,1337, +1404,1338,1405, +1339,1405,1338, +1405,1339,1406, +1340,1406,1339, +1406,1340,1407, +1341,1407,1340, +1407,1341,1408, +1342,1408,1341, +1408,1342,1409, +1343,1409,1342, +1409,1343,1410, +1344,1410,1343, +1410,1344,1411, +1345,1411,1344, +1411,1345,1412, +1346,1412,1345, +1412,1346,1413, +1347,1413,1346, +1413,1347,1414, +1348,1414,1347, +1414,1348,1415, +1349,1415,1348, +1415,1349,1416, +1350,1416,1349, +1416,1350,1417, +1351,1417,1350, +1417,1351,1418, +1352,1418,1351, +1418,1352,1419, +1353,1419,1352, +1419,1353,1420, +1354,1420,1353, +1420,1354,1421, +1355,1421,1354, +1421,1355,1422, +1356,1422,1355, +1422,1356,1423, +1357,1423,1356, +1423,1357,1424, +1358,1424,1357, +1424,1358,1425, +1359,1425,1358, +1425,1359,1426, +1360,1426,1359, +1426,1360,1427, +1361,1427,1360, +1427,1361,1428, +1362,1428,1361, +1428,1362,1429, +1363,1429,1362, +1429,1363,1430, +1364,1430,1363, +1430,1364,1431, +1365,1431,1364, +1431,1365,1432, +1366,1432,1365, +1432,1366,1433, +1367,1433,1366, +1433,1367,1434, +1368,1434,1367, +1434,1368,1435, +1369,1435,1368, +1435,1369,1436, +1370,1436,1369, +1436,1370,1437, +1371,1437,1370, +1437,1371,1438, +1372,1438,1371, +1438,1372,1439, +1373,1439,1372, +1439,1373,1440, +1374,1440,1373, +1440,1374,1441, +1375,1441,1374, +1441,1375,1442, +1376,1442,1375, +1442,1376,1443, +1377,1443,1376, +1443,1377,1444, +1378,1444,1377, +1444,1378,1445, +1379,1445,1378, +1445,1379,1446, +1380,1446,1379, +1446,1380,1447, +1381,1447,1380, +1447,1381,1448, +1382,1448,1381, +1448,1382,1449, +1383,1449,1382, +1449,1383,1450, +1384,1450,1383, +1450,1384,1451, +1385,1451,1384, +1452,1386,1453, +1387,1453,1386, +1453,1387,1454, +1388,1454,1387, +1454,1388,1455, +1389,1455,1388, +1455,1389,1456, +1390,1456,1389, +1456,1390,1457, +1391,1457,1390, +1457,1391,1458, +1392,1458,1391, +1458,1392,1459, +1393,1459,1392, +1459,1393,1460, +1394,1460,1393, +1460,1394,1461, +1395,1461,1394, +1461,1395,1462, +1396,1462,1395, +1462,1396,1463, +1397,1463,1396, +1463,1397,1464, +1398,1464,1397, +1464,1398,1465, +1399,1465,1398, +1465,1399,1466, +1400,1466,1399, +1466,1400,1467, +1401,1467,1400, +1467,1401,1468, +1402,1468,1401, +1468,1402,1469, +1403,1469,1402, +1469,1403,1470, +1404,1470,1403, +1470,1404,1471, +1405,1471,1404, +1471,1405,1472, +1406,1472,1405, +1472,1406,1473, +1407,1473,1406, +1473,1407,1474, +1408,1474,1407, +1474,1408,1475, +1409,1475,1408, +1475,1409,1476, +1410,1476,1409, +1476,1410,1477, +1411,1477,1410, +1477,1411,1478, +1412,1478,1411, +1478,1412,1479, +1413,1479,1412, +1479,1413,1480, +1414,1480,1413, +1480,1414,1481, +1415,1481,1414, +1481,1415,1482, +1416,1482,1415, +1482,1416,1483, +1417,1483,1416, +1483,1417,1484, +1418,1484,1417, +1484,1418,1485, +1419,1485,1418, +1485,1419,1486, +1420,1486,1419, +1486,1420,1487, +1421,1487,1420, +1487,1421,1488, +1422,1488,1421, +1488,1422,1489, +1423,1489,1422, +1489,1423,1490, +1424,1490,1423, +1490,1424,1491, +1425,1491,1424, +1491,1425,1492, +1426,1492,1425, +1492,1426,1493, +1427,1493,1426, +1493,1427,1494, +1428,1494,1427, +1494,1428,1495, +1429,1495,1428, +1495,1429,1496, +1430,1496,1429, +1496,1430,1497, +1431,1497,1430, +1497,1431,1498, +1432,1498,1431, +1498,1432,1499, +1433,1499,1432, +1499,1433,1500, +1434,1500,1433, +1500,1434,1501, +1435,1501,1434, +1501,1435,1502, +1436,1502,1435, +1502,1436,1503, +1437,1503,1436, +1503,1437,1504, +1438,1504,1437, +1504,1438,1505, +1439,1505,1438, +1505,1439,1506, +1440,1506,1439, +1506,1440,1507, +1441,1507,1440, +1507,1441,1508, +1442,1508,1441, +1508,1442,1509, +1443,1509,1442, +1509,1443,1510, +1444,1510,1443, +1510,1444,1511, +1445,1511,1444, +1511,1445,1512, +1446,1512,1445, +1512,1446,1513, +1447,1513,1446, +1513,1447,1514, +1448,1514,1447, +1514,1448,1515, +1449,1515,1448, +1515,1449,1516, +1450,1516,1449, +1516,1450,1517, +1451,1517,1450, +1518,1452,1519, +1453,1519,1452, +1519,1453,1520, +1454,1520,1453, +1520,1454,1521, +1455,1521,1454, +1521,1455,1522, +1456,1522,1455, +1522,1456,1523, +1457,1523,1456, +1523,1457,1524, +1458,1524,1457, +1524,1458,1525, +1459,1525,1458, +1525,1459,1526, +1460,1526,1459, +1526,1460,1527, +1461,1527,1460, +1527,1461,1528, +1462,1528,1461, +1528,1462,1529, +1463,1529,1462, +1529,1463,1530, +1464,1530,1463, +1530,1464,1531, +1465,1531,1464, +1531,1465,1532, +1466,1532,1465, +1532,1466,1533, +1467,1533,1466, +1533,1467,1534, +1468,1534,1467, +1534,1468,1535, +1469,1535,1468, +1535,1469,1536, +1470,1536,1469, +1536,1470,1537, +1471,1537,1470, +1537,1471,1538, +1472,1538,1471, +1538,1472,1539, +1473,1539,1472, +1539,1473,1540, +1474,1540,1473, +1540,1474,1541, +1475,1541,1474, +1541,1475,1542, +1476,1542,1475, +1542,1476,1543, +1477,1543,1476, +1543,1477,1544, +1478,1544,1477, +1544,1478,1545, +1479,1545,1478, +1545,1479,1546, +1480,1546,1479, +1546,1480,1547, +1481,1547,1480, +1547,1481,1548, +1482,1548,1481, +1548,1482,1549, +1483,1549,1482, +1549,1483,1550, +1484,1550,1483, +1550,1484,1551, +1485,1551,1484, +1551,1485,1552, +1486,1552,1485, +1552,1486,1553, +1487,1553,1486, +1553,1487,1554, +1488,1554,1487, +1554,1488,1555, +1489,1555,1488, +1555,1489,1556, +1490,1556,1489, +1556,1490,1557, +1491,1557,1490, +1557,1491,1558, +1492,1558,1491, +1558,1492,1559, +1493,1559,1492, +1559,1493,1560, +1494,1560,1493, +1560,1494,1561, +1495,1561,1494, +1561,1495,1562, +1496,1562,1495, +1562,1496,1563, +1497,1563,1496, +1563,1497,1564, +1498,1564,1497, +1564,1498,1565, +1499,1565,1498, +1565,1499,1566, +1500,1566,1499, +1566,1500,1567, +1501,1567,1500, +1567,1501,1568, +1502,1568,1501, +1568,1502,1569, +1503,1569,1502, +1569,1503,1570, +1504,1570,1503, +1570,1504,1571, +1505,1571,1504, +1571,1505,1572, +1506,1572,1505, +1572,1506,1573, +1507,1573,1506, +1573,1507,1574, +1508,1574,1507, +1574,1508,1575, +1509,1575,1508, +1575,1509,1576, +1510,1576,1509, +1576,1510,1577, +1511,1577,1510, +1577,1511,1578, +1512,1578,1511, +1578,1512,1579, +1513,1579,1512, +1579,1513,1580, +1514,1580,1513, +1580,1514,1581, +1515,1581,1514, +1581,1515,1582, +1516,1582,1515, +1582,1516,1583, +1517,1583,1516, +1584,1518,1585, +1519,1585,1518, +1585,1519,1586, +1520,1586,1519, +1586,1520,1587, +1521,1587,1520, +1587,1521,1588, +1522,1588,1521, +1588,1522,1589, +1523,1589,1522, +1589,1523,1590, +1524,1590,1523, +1590,1524,1591, +1525,1591,1524, +1591,1525,1592, +1526,1592,1525, +1592,1526,1593, +1527,1593,1526, +1593,1527,1594, +1528,1594,1527, +1594,1528,1595, +1529,1595,1528, +1595,1529,1596, +1530,1596,1529, +1596,1530,1597, +1531,1597,1530, +1597,1531,1598, +1532,1598,1531, +1598,1532,1599, +1533,1599,1532, +1599,1533,1600, +1534,1600,1533, +1600,1534,1601, +1535,1601,1534, +1601,1535,1602, +1536,1602,1535, +1602,1536,1603, +1537,1603,1536, +1603,1537,1604, +1538,1604,1537, +1604,1538,1605, +1539,1605,1538, +1605,1539,1606, +1540,1606,1539, +1606,1540,1607, +1541,1607,1540, +1607,1541,1608, +1542,1608,1541, +1608,1542,1609, +1543,1609,1542, +1609,1543,1610, +1544,1610,1543, +1610,1544,1611, +1545,1611,1544, +1611,1545,1612, +1546,1612,1545, +1612,1546,1613, +1547,1613,1546, +1613,1547,1614, +1548,1614,1547, +1614,1548,1615, +1549,1615,1548, +1615,1549,1616, +1550,1616,1549, +1616,1550,1617, +1551,1617,1550, +1617,1551,1618, +1552,1618,1551, +1618,1552,1619, +1553,1619,1552, +1619,1553,1620, +1554,1620,1553, +1620,1554,1621, +1555,1621,1554, +1621,1555,1622, +1556,1622,1555, +1622,1556,1623, +1557,1623,1556, +1623,1557,1624, +1558,1624,1557, +1624,1558,1625, +1559,1625,1558, +1625,1559,1626, +1560,1626,1559, +1626,1560,1627, +1561,1627,1560, +1627,1561,1628, +1562,1628,1561, +1628,1562,1629, +1563,1629,1562, +1629,1563,1630, +1564,1630,1563, +1630,1564,1631, +1565,1631,1564, +1631,1565,1632, +1566,1632,1565, +1632,1566,1633, +1567,1633,1566, +1633,1567,1634, +1568,1634,1567, +1634,1568,1635, +1569,1635,1568, +1635,1569,1636, +1570,1636,1569, +1636,1570,1637, +1571,1637,1570, +1637,1571,1638, +1572,1638,1571, +1638,1572,1639, +1573,1639,1572, +1639,1573,1640, +1574,1640,1573, +1640,1574,1641, +1575,1641,1574, +1641,1575,1642, +1576,1642,1575, +1642,1576,1643, +1577,1643,1576, +1643,1577,1644, +1578,1644,1577, +1644,1578,1645, +1579,1645,1578, +1645,1579,1646, +1580,1646,1579, +1646,1580,1647, +1581,1647,1580, +1647,1581,1648, +1582,1648,1581, +1648,1582,1649, +1583,1649,1582, +1650,1584,1651, +1585,1651,1584, +1651,1585,1652, +1586,1652,1585, +1652,1586,1653, +1587,1653,1586, +1653,1587,1654, +1588,1654,1587, +1654,1588,1655, +1589,1655,1588, +1655,1589,1656, +1590,1656,1589, +1656,1590,1657, +1591,1657,1590, +1657,1591,1658, +1592,1658,1591, +1658,1592,1659, +1593,1659,1592, +1659,1593,1660, +1594,1660,1593, +1660,1594,1661, +1595,1661,1594, +1661,1595,1662, +1596,1662,1595, +1662,1596,1663, +1597,1663,1596, +1663,1597,1664, +1598,1664,1597, +1664,1598,1665, +1599,1665,1598, +1665,1599,1666, +1600,1666,1599, +1666,1600,1667, +1601,1667,1600, +1667,1601,1668, +1602,1668,1601, +1668,1602,1669, +1603,1669,1602, +1669,1603,1670, +1604,1670,1603, +1670,1604,1671, +1605,1671,1604, +1671,1605,1672, +1606,1672,1605, +1672,1606,1673, +1607,1673,1606, +1673,1607,1674, +1608,1674,1607, +1674,1608,1675, +1609,1675,1608, +1675,1609,1676, +1610,1676,1609, +1676,1610,1677, +1611,1677,1610, +1677,1611,1678, +1612,1678,1611, +1678,1612,1679, +1613,1679,1612, +1679,1613,1680, +1614,1680,1613, +1680,1614,1681, +1615,1681,1614, +1681,1615,1682, +1616,1682,1615, +1682,1616,1683, +1617,1683,1616, +1683,1617,1684, +1618,1684,1617, +1684,1618,1685, +1619,1685,1618, +1685,1619,1686, +1620,1686,1619, +1686,1620,1687, +1621,1687,1620, +1687,1621,1688, +1622,1688,1621, +1688,1622,1689, +1623,1689,1622, +1689,1623,1690, +1624,1690,1623, +1690,1624,1691, +1625,1691,1624, +1691,1625,1692, +1626,1692,1625, +1692,1626,1693, +1627,1693,1626, +1693,1627,1694, +1628,1694,1627, +1694,1628,1695, +1629,1695,1628, +1695,1629,1696, +1630,1696,1629, +1696,1630,1697, +1631,1697,1630, +1697,1631,1698, +1632,1698,1631, +1698,1632,1699, +1633,1699,1632, +1699,1633,1700, +1634,1700,1633, +1700,1634,1701, +1635,1701,1634, +1701,1635,1702, +1636,1702,1635, +1702,1636,1703, +1637,1703,1636, +1703,1637,1704, +1638,1704,1637, +1704,1638,1705, +1639,1705,1638, +1705,1639,1706, +1640,1706,1639, +1706,1640,1707, +1641,1707,1640, +1707,1641,1708, +1642,1708,1641, +1708,1642,1709, +1643,1709,1642, +1709,1643,1710, +1644,1710,1643, +1710,1644,1711, +1645,1711,1644, +1711,1645,1712, +1646,1712,1645, +1712,1646,1713, +1647,1713,1646, +1713,1647,1714, +1648,1714,1647, +1714,1648,1715, +1649,1715,1648, +1716,1650,1717, +1651,1717,1650, +1717,1651,1718, +1652,1718,1651, +1718,1652,1719, +1653,1719,1652, +1719,1653,1720, +1654,1720,1653, +1720,1654,1721, +1655,1721,1654, +1721,1655,1722, +1656,1722,1655, +1722,1656,1723, +1657,1723,1656, +1723,1657,1724, +1658,1724,1657, +1724,1658,1725, +1659,1725,1658, +1725,1659,1726, +1660,1726,1659, +1726,1660,1727, +1661,1727,1660, +1727,1661,1728, +1662,1728,1661, +1728,1662,1729, +1663,1729,1662, +1729,1663,1730, +1664,1730,1663, +1730,1664,1731, +1665,1731,1664, +1731,1665,1732, +1666,1732,1665, +1732,1666,1733, +1667,1733,1666, +1733,1667,1734, +1668,1734,1667, +1734,1668,1735, +1669,1735,1668, +1735,1669,1736, +1670,1736,1669, +1736,1670,1737, +1671,1737,1670, +1737,1671,1738, +1672,1738,1671, +1738,1672,1739, +1673,1739,1672, +1739,1673,1740, +1674,1740,1673, +1740,1674,1741, +1675,1741,1674, +1741,1675,1742, +1676,1742,1675, +1742,1676,1743, +1677,1743,1676, +1743,1677,1744, +1678,1744,1677, +1744,1678,1745, +1679,1745,1678, +1745,1679,1746, +1680,1746,1679, +1746,1680,1747, +1681,1747,1680, +1747,1681,1748, +1682,1748,1681, +1748,1682,1749, +1683,1749,1682, +1749,1683,1750, +1684,1750,1683, +1750,1684,1751, +1685,1751,1684, +1751,1685,1752, +1686,1752,1685, +1752,1686,1753, +1687,1753,1686, +1753,1687,1754, +1688,1754,1687, +1754,1688,1755, +1689,1755,1688, +1755,1689,1756, +1690,1756,1689, +1756,1690,1757, +1691,1757,1690, +1757,1691,1758, +1692,1758,1691, +1758,1692,1759, +1693,1759,1692, +1759,1693,1760, +1694,1760,1693, +1760,1694,1761, +1695,1761,1694, +1761,1695,1762, +1696,1762,1695, +1762,1696,1763, +1697,1763,1696, +1763,1697,1764, +1698,1764,1697, +1764,1698,1765, +1699,1765,1698, +1765,1699,1766, +1700,1766,1699, +1766,1700,1767, +1701,1767,1700, +1767,1701,1768, +1702,1768,1701, +1768,1702,1769, +1703,1769,1702, +1769,1703,1770, +1704,1770,1703, +1770,1704,1771, +1705,1771,1704, +1771,1705,1772, +1706,1772,1705, +1772,1706,1773, +1707,1773,1706, +1773,1707,1774, +1708,1774,1707, +1774,1708,1775, +1709,1775,1708, +1775,1709,1776, +1710,1776,1709, +1776,1710,1777, +1711,1777,1710, +1777,1711,1778, +1712,1778,1711, +1778,1712,1779, +1713,1779,1712, +1779,1713,1780, +1714,1780,1713, +1780,1714,1781, +1715,1781,1714, +1782,1716,1783, +1717,1783,1716, +1783,1717,1784, +1718,1784,1717, +1784,1718,1785, +1719,1785,1718, +1785,1719,1786, +1720,1786,1719, +1786,1720,1787, +1721,1787,1720, +1787,1721,1788, +1722,1788,1721, +1788,1722,1789, +1723,1789,1722, +1789,1723,1790, +1724,1790,1723, +1790,1724,1791, +1725,1791,1724, +1791,1725,1792, +1726,1792,1725, +1792,1726,1793, +1727,1793,1726, +1793,1727,1794, +1728,1794,1727, +1794,1728,1795, +1729,1795,1728, +1795,1729,1796, +1730,1796,1729, +1796,1730,1797, +1731,1797,1730, +1797,1731,1798, +1732,1798,1731, +1798,1732,1799, +1733,1799,1732, +1799,1733,1800, +1734,1800,1733, +1800,1734,1801, +1735,1801,1734, +1801,1735,1802, +1736,1802,1735, +1802,1736,1803, +1737,1803,1736, +1803,1737,1804, +1738,1804,1737, +1804,1738,1805, +1739,1805,1738, +1805,1739,1806, +1740,1806,1739, +1806,1740,1807, +1741,1807,1740, +1807,1741,1808, +1742,1808,1741, +1808,1742,1809, +1743,1809,1742, +1809,1743,1810, +1744,1810,1743, +1810,1744,1811, +1745,1811,1744, +1811,1745,1812, +1746,1812,1745, +1812,1746,1813, +1747,1813,1746, +1813,1747,1814, +1748,1814,1747, +1814,1748,1815, +1749,1815,1748, +1815,1749,1816, +1750,1816,1749, +1816,1750,1817, +1751,1817,1750, +1817,1751,1818, +1752,1818,1751, +1818,1752,1819, +1753,1819,1752, +1819,1753,1820, +1754,1820,1753, +1820,1754,1821, +1755,1821,1754, +1821,1755,1822, +1756,1822,1755, +1822,1756,1823, +1757,1823,1756, +1823,1757,1824, +1758,1824,1757, +1824,1758,1825, +1759,1825,1758, +1825,1759,1826, +1760,1826,1759, +1826,1760,1827, +1761,1827,1760, +1827,1761,1828, +1762,1828,1761, +1828,1762,1829, +1763,1829,1762, +1829,1763,1830, +1764,1830,1763, +1830,1764,1831, +1765,1831,1764, +1831,1765,1832, +1766,1832,1765, +1832,1766,1833, +1767,1833,1766, +1833,1767,1834, +1768,1834,1767, +1834,1768,1835, +1769,1835,1768, +1835,1769,1836, +1770,1836,1769, +1836,1770,1837, +1771,1837,1770, +1837,1771,1838, +1772,1838,1771, +1838,1772,1839, +1773,1839,1772, +1839,1773,1840, +1774,1840,1773, +1840,1774,1841, +1775,1841,1774, +1841,1775,1842, +1776,1842,1775, +1842,1776,1843, +1777,1843,1776, +1843,1777,1844, +1778,1844,1777, +1844,1778,1845, +1779,1845,1778, +1845,1779,1846, +1780,1846,1779, +1846,1780,1847, +1781,1847,1780, +1848,1782,1849, +1783,1849,1782, +1849,1783,1850, +1784,1850,1783, +1850,1784,1851, +1785,1851,1784, +1851,1785,1852, +1786,1852,1785, +1852,1786,1853, +1787,1853,1786, +1853,1787,1854, +1788,1854,1787, +1854,1788,1855, +1789,1855,1788, +1855,1789,1856, +1790,1856,1789, +1856,1790,1857, +1791,1857,1790, +1857,1791,1858, +1792,1858,1791, +1858,1792,1859, +1793,1859,1792, +1859,1793,1860, +1794,1860,1793, +1860,1794,1861, +1795,1861,1794, +1861,1795,1862, +1796,1862,1795, +1862,1796,1863, +1797,1863,1796, +1863,1797,1864, +1798,1864,1797, +1864,1798,1865, +1799,1865,1798, +1865,1799,1866, +1800,1866,1799, +1866,1800,1867, +1801,1867,1800, +1867,1801,1868, +1802,1868,1801, +1868,1802,1869, +1803,1869,1802, +1869,1803,1870, +1804,1870,1803, +1870,1804,1871, +1805,1871,1804, +1871,1805,1872, +1806,1872,1805, +1872,1806,1873, +1807,1873,1806, +1873,1807,1874, +1808,1874,1807, +1874,1808,1875, +1809,1875,1808, +1875,1809,1876, +1810,1876,1809, +1876,1810,1877, +1811,1877,1810, +1877,1811,1878, +1812,1878,1811, +1878,1812,1879, +1813,1879,1812, +1879,1813,1880, +1814,1880,1813, +1880,1814,1881, +1815,1881,1814, +1881,1815,1882, +1816,1882,1815, +1882,1816,1883, +1817,1883,1816, +1883,1817,1884, +1818,1884,1817, +1884,1818,1885, +1819,1885,1818, +1885,1819,1886, +1820,1886,1819, +1886,1820,1887, +1821,1887,1820, +1887,1821,1888, +1822,1888,1821, +1888,1822,1889, +1823,1889,1822, +1889,1823,1890, +1824,1890,1823, +1890,1824,1891, +1825,1891,1824, +1891,1825,1892, +1826,1892,1825, +1892,1826,1893, +1827,1893,1826, +1893,1827,1894, +1828,1894,1827, +1894,1828,1895, +1829,1895,1828, +1895,1829,1896, +1830,1896,1829, +1896,1830,1897, +1831,1897,1830, +1897,1831,1898, +1832,1898,1831, +1898,1832,1899, +1833,1899,1832, +1899,1833,1900, +1834,1900,1833, +1900,1834,1901, +1835,1901,1834, +1901,1835,1902, +1836,1902,1835, +1902,1836,1903, +1837,1903,1836, +1903,1837,1904, +1838,1904,1837, +1904,1838,1905, +1839,1905,1838, +1905,1839,1906, +1840,1906,1839, +1906,1840,1907, +1841,1907,1840, +1907,1841,1908, +1842,1908,1841, +1908,1842,1909, +1843,1909,1842, +1909,1843,1910, +1844,1910,1843, +1910,1844,1911, +1845,1911,1844, +1911,1845,1912, +1846,1912,1845, +1912,1846,1913, +1847,1913,1846, +1914,1848,1915, +1849,1915,1848, +1915,1849,1916, +1850,1916,1849, +1916,1850,1917, +1851,1917,1850, +1917,1851,1918, +1852,1918,1851, +1918,1852,1919, +1853,1919,1852, +1919,1853,1920, +1854,1920,1853, +1920,1854,1921, +1855,1921,1854, +1921,1855,1922, +1856,1922,1855, +1922,1856,1923, +1857,1923,1856, +1923,1857,1924, +1858,1924,1857, +1924,1858,1925, +1859,1925,1858, +1925,1859,1926, +1860,1926,1859, +1926,1860,1927, +1861,1927,1860, +1927,1861,1928, +1862,1928,1861, +1928,1862,1929, +1863,1929,1862, +1929,1863,1930, +1864,1930,1863, +1930,1864,1931, +1865,1931,1864, +1931,1865,1932, +1866,1932,1865, +1932,1866,1933, +1867,1933,1866, +1933,1867,1934, +1868,1934,1867, +1934,1868,1935, +1869,1935,1868, +1935,1869,1936, +1870,1936,1869, +1936,1870,1937, +1871,1937,1870, +1937,1871,1938, +1872,1938,1871, +1938,1872,1939, +1873,1939,1872, +1939,1873,1940, +1874,1940,1873, +1940,1874,1941, +1875,1941,1874, +1941,1875,1942, +1876,1942,1875, +1942,1876,1943, +1877,1943,1876, +1943,1877,1944, +1878,1944,1877, +1944,1878,1945, +1879,1945,1878, +1945,1879,1946, +1880,1946,1879, +1946,1880,1947, +1881,1947,1880, +1947,1881,1948, +1882,1948,1881, +1948,1882,1949, +1883,1949,1882, +1949,1883,1950, +1884,1950,1883, +1950,1884,1951, +1885,1951,1884, +1951,1885,1952, +1886,1952,1885, +1952,1886,1953, +1887,1953,1886, +1953,1887,1954, +1888,1954,1887, +1954,1888,1955, +1889,1955,1888, +1955,1889,1956, +1890,1956,1889, +1956,1890,1957, +1891,1957,1890, +1957,1891,1958, +1892,1958,1891, +1958,1892,1959, +1893,1959,1892, +1959,1893,1960, +1894,1960,1893, +1960,1894,1961, +1895,1961,1894, +1961,1895,1962, +1896,1962,1895, +1962,1896,1963, +1897,1963,1896, +1963,1897,1964, +1898,1964,1897, +1964,1898,1965, +1899,1965,1898, +1965,1899,1966, +1900,1966,1899, +1966,1900,1967, +1901,1967,1900, +1967,1901,1968, +1902,1968,1901, +1968,1902,1969, +1903,1969,1902, +1969,1903,1970, +1904,1970,1903, +1970,1904,1971, +1905,1971,1904, +1971,1905,1972, +1906,1972,1905, +1972,1906,1973, +1907,1973,1906, +1973,1907,1974, +1908,1974,1907, +1974,1908,1975, +1909,1975,1908, +1975,1909,1976, +1910,1976,1909, +1976,1910,1977, +1911,1977,1910, +1977,1911,1978, +1912,1978,1911, +1978,1912,1979, +1913,1979,1912, +1980,1914,1981, +1915,1981,1914, +1981,1915,1982, +1916,1982,1915, +1982,1916,1983, +1917,1983,1916, +1983,1917,1984, +1918,1984,1917, +1984,1918,1985, +1919,1985,1918, +1985,1919,1986, +1920,1986,1919, +1986,1920,1987, +1921,1987,1920, +1987,1921,1988, +1922,1988,1921, +1988,1922,1989, +1923,1989,1922, +1989,1923,1990, +1924,1990,1923, +1990,1924,1991, +1925,1991,1924, +1991,1925,1992, +1926,1992,1925, +1992,1926,1993, +1927,1993,1926, +1993,1927,1994, +1928,1994,1927, +1994,1928,1995, +1929,1995,1928, +1995,1929,1996, +1930,1996,1929, +1996,1930,1997, +1931,1997,1930, +1997,1931,1998, +1932,1998,1931, +1998,1932,1999, +1933,1999,1932, +1999,1933,2000, +1934,2000,1933, +2000,1934,2001, +1935,2001,1934, +2001,1935,2002, +1936,2002,1935, +2002,1936,2003, +1937,2003,1936, +2003,1937,2004, +1938,2004,1937, +2004,1938,2005, +1939,2005,1938, +2005,1939,2006, +1940,2006,1939, +2006,1940,2007, +1941,2007,1940, +2007,1941,2008, +1942,2008,1941, +2008,1942,2009, +1943,2009,1942, +2009,1943,2010, +1944,2010,1943, +2010,1944,2011, +1945,2011,1944, +2011,1945,2012, +1946,2012,1945, +2012,1946,2013, +1947,2013,1946, +2013,1947,2014, +1948,2014,1947, +2014,1948,2015, +1949,2015,1948, +2015,1949,2016, +1950,2016,1949, +2016,1950,2017, +1951,2017,1950, +2017,1951,2018, +1952,2018,1951, +2018,1952,2019, +1953,2019,1952, +2019,1953,2020, +1954,2020,1953, +2020,1954,2021, +1955,2021,1954, +2021,1955,2022, +1956,2022,1955, +2022,1956,2023, +1957,2023,1956, +2023,1957,2024, +1958,2024,1957, +2024,1958,2025, +1959,2025,1958, +2025,1959,2026, +1960,2026,1959, +2026,1960,2027, +1961,2027,1960, +2027,1961,2028, +1962,2028,1961, +2028,1962,2029, +1963,2029,1962, +2029,1963,2030, +1964,2030,1963, +2030,1964,2031, +1965,2031,1964, +2031,1965,2032, +1966,2032,1965, +2032,1966,2033, +1967,2033,1966, +2033,1967,2034, +1968,2034,1967, +2034,1968,2035, +1969,2035,1968, +2035,1969,2036, +1970,2036,1969, +2036,1970,2037, +1971,2037,1970, +2037,1971,2038, +1972,2038,1971, +2038,1972,2039, +1973,2039,1972, +2039,1973,2040, +1974,2040,1973, +2040,1974,2041, +1975,2041,1974, +2041,1975,2042, +1976,2042,1975, +2042,1976,2043, +1977,2043,1976, +2043,1977,2044, +1978,2044,1977, +2044,1978,2045, +1979,2045,1978, +2046,1980,2047, +1981,2047,1980, +2047,1981,2048, +1982,2048,1981, +2048,1982,2049, +1983,2049,1982, +2049,1983,2050, +1984,2050,1983, +2050,1984,2051, +1985,2051,1984, +2051,1985,2052, +1986,2052,1985, +2052,1986,2053, +1987,2053,1986, +2053,1987,2054, +1988,2054,1987, +2054,1988,2055, +1989,2055,1988, +2055,1989,2056, +1990,2056,1989, +2056,1990,2057, +1991,2057,1990, +2057,1991,2058, +1992,2058,1991, +2058,1992,2059, +1993,2059,1992, +2059,1993,2060, +1994,2060,1993, +2060,1994,2061, +1995,2061,1994, +2061,1995,2062, +1996,2062,1995, +2062,1996,2063, +1997,2063,1996, +2063,1997,2064, +1998,2064,1997, +2064,1998,2065, +1999,2065,1998, +2065,1999,2066, +2000,2066,1999, +2066,2000,2067, +2001,2067,2000, +2067,2001,2068, +2002,2068,2001, +2068,2002,2069, +2003,2069,2002, +2069,2003,2070, +2004,2070,2003, +2070,2004,2071, +2005,2071,2004, +2071,2005,2072, +2006,2072,2005, +2072,2006,2073, +2007,2073,2006, +2073,2007,2074, +2008,2074,2007, +2074,2008,2075, +2009,2075,2008, +2075,2009,2076, +2010,2076,2009, +2076,2010,2077, +2011,2077,2010, +2077,2011,2078, +2012,2078,2011, +2078,2012,2079, +2013,2079,2012, +2079,2013,2080, +2014,2080,2013, +2080,2014,2081, +2015,2081,2014, +2081,2015,2082, +2016,2082,2015, +2082,2016,2083, +2017,2083,2016, +2083,2017,2084, +2018,2084,2017, +2084,2018,2085, +2019,2085,2018, +2085,2019,2086, +2020,2086,2019, +2086,2020,2087, +2021,2087,2020, +2087,2021,2088, +2022,2088,2021, +2088,2022,2089, +2023,2089,2022, +2089,2023,2090, +2024,2090,2023, +2090,2024,2091, +2025,2091,2024, +2091,2025,2092, +2026,2092,2025, +2092,2026,2093, +2027,2093,2026, +2093,2027,2094, +2028,2094,2027, +2094,2028,2095, +2029,2095,2028, +2095,2029,2096, +2030,2096,2029, +2096,2030,2097, +2031,2097,2030, +2097,2031,2098, +2032,2098,2031, +2098,2032,2099, +2033,2099,2032, +2099,2033,2100, +2034,2100,2033, +2100,2034,2101, +2035,2101,2034, +2101,2035,2102, +2036,2102,2035, +2102,2036,2103, +2037,2103,2036, +2103,2037,2104, +2038,2104,2037, +2104,2038,2105, +2039,2105,2038, +2105,2039,2106, +2040,2106,2039, +2106,2040,2107, +2041,2107,2040, +2107,2041,2108, +2042,2108,2041, +2108,2042,2109, +2043,2109,2042, +2109,2043,2110, +2044,2110,2043, +2110,2044,2111, +2045,2111,2044, +2112,2046,2113, +2047,2113,2046, +2113,2047,2114, +2048,2114,2047, +2114,2048,2115, +2049,2115,2048, +2115,2049,2116, +2050,2116,2049, +2116,2050,2117, +2051,2117,2050, +2117,2051,2118, +2052,2118,2051, +2118,2052,2119, +2053,2119,2052, +2119,2053,2120, +2054,2120,2053, +2120,2054,2121, +2055,2121,2054, +2121,2055,2122, +2056,2122,2055, +2122,2056,2123, +2057,2123,2056, +2123,2057,2124, +2058,2124,2057, +2124,2058,2125, +2059,2125,2058, +2125,2059,2126, +2060,2126,2059, +2126,2060,2127, +2061,2127,2060, +2127,2061,2128, +2062,2128,2061, +2128,2062,2129, +2063,2129,2062, +2129,2063,2130, +2064,2130,2063, +2130,2064,2131, +2065,2131,2064, +2131,2065,2132, +2066,2132,2065, +2132,2066,2133, +2067,2133,2066, +2133,2067,2134, +2068,2134,2067, +2134,2068,2135, +2069,2135,2068, +2135,2069,2136, +2070,2136,2069, +2136,2070,2137, +2071,2137,2070, +2137,2071,2138, +2072,2138,2071, +2138,2072,2139, +2073,2139,2072, +2139,2073,2140, +2074,2140,2073, +2140,2074,2141, +2075,2141,2074, +2141,2075,2142, +2076,2142,2075, +2142,2076,2143, +2077,2143,2076, +2143,2077,2144, +2078,2144,2077, +2144,2078,2145, +2079,2145,2078, +2145,2079,2146, +2080,2146,2079, +2146,2080,2147, +2081,2147,2080, +2147,2081,2148, +2082,2148,2081, +2148,2082,2149, +2083,2149,2082, +2149,2083,2150, +2084,2150,2083, +2150,2084,2151, +2085,2151,2084, +2151,2085,2152, +2086,2152,2085, +2152,2086,2153, +2087,2153,2086, +2153,2087,2154, +2088,2154,2087, +2154,2088,2155, +2089,2155,2088, +2155,2089,2156, +2090,2156,2089, +2156,2090,2157, +2091,2157,2090, +2157,2091,2158, +2092,2158,2091, +2158,2092,2159, +2093,2159,2092, +2159,2093,2160, +2094,2160,2093, +2160,2094,2161, +2095,2161,2094, +2161,2095,2162, +2096,2162,2095, +2162,2096,2163, +2097,2163,2096, +2163,2097,2164, +2098,2164,2097, +2164,2098,2165, +2099,2165,2098, +2165,2099,2166, +2100,2166,2099, +2166,2100,2167, +2101,2167,2100, +2167,2101,2168, +2102,2168,2101, +2168,2102,2169, +2103,2169,2102, +2169,2103,2170, +2104,2170,2103, +2170,2104,2171, +2105,2171,2104, +2171,2105,2172, +2106,2172,2105, +2172,2106,2173, +2107,2173,2106, +2173,2107,2174, +2108,2174,2107, +2174,2108,2175, +2109,2175,2108, +2175,2109,2176, +2110,2176,2109, +2176,2110,2177, +2111,2177,2110, +2178,2112,2179, +2113,2179,2112, +2179,2113,2180, +2114,2180,2113, +2180,2114,2181, +2115,2181,2114, +2181,2115,2182, +2116,2182,2115, +2182,2116,2183, +2117,2183,2116, +2183,2117,2184, +2118,2184,2117, +2184,2118,2185, +2119,2185,2118, +2185,2119,2186, +2120,2186,2119, +2186,2120,2187, +2121,2187,2120, +2187,2121,2188, +2122,2188,2121, +2188,2122,2189, +2123,2189,2122, +2189,2123,2190, +2124,2190,2123, +2190,2124,2191, +2125,2191,2124, +2191,2125,2192, +2126,2192,2125, +2192,2126,2193, +2127,2193,2126, +2193,2127,2194, +2128,2194,2127, +2194,2128,2195, +2129,2195,2128, +2195,2129,2196, +2130,2196,2129, +2196,2130,2197, +2131,2197,2130, +2197,2131,2198, +2132,2198,2131, +2198,2132,2199, +2133,2199,2132, +2199,2133,2200, +2134,2200,2133, +2200,2134,2201, +2135,2201,2134, +2201,2135,2202, +2136,2202,2135, +2202,2136,2203, +2137,2203,2136, +2203,2137,2204, +2138,2204,2137, +2204,2138,2205, +2139,2205,2138, +2205,2139,2206, +2140,2206,2139, +2206,2140,2207, +2141,2207,2140, +2207,2141,2208, +2142,2208,2141, +2208,2142,2209, +2143,2209,2142, +2209,2143,2210, +2144,2210,2143, +2210,2144,2211, +2145,2211,2144, +2211,2145,2212, +2146,2212,2145, +2212,2146,2213, +2147,2213,2146, +2213,2147,2214, +2148,2214,2147, +2214,2148,2215, +2149,2215,2148, +2215,2149,2216, +2150,2216,2149, +2216,2150,2217, +2151,2217,2150, +2217,2151,2218, +2152,2218,2151, +2218,2152,2219, +2153,2219,2152, +2219,2153,2220, +2154,2220,2153, +2220,2154,2221, +2155,2221,2154, +2221,2155,2222, +2156,2222,2155, +2222,2156,2223, +2157,2223,2156, +2223,2157,2224, +2158,2224,2157, +2224,2158,2225, +2159,2225,2158, +2225,2159,2226, +2160,2226,2159, +2226,2160,2227, +2161,2227,2160, +2227,2161,2228, +2162,2228,2161, +2228,2162,2229, +2163,2229,2162, +2229,2163,2230, +2164,2230,2163, +2230,2164,2231, +2165,2231,2164, +2231,2165,2232, +2166,2232,2165, +2232,2166,2233, +2167,2233,2166, +2233,2167,2234, +2168,2234,2167, +2234,2168,2235, +2169,2235,2168, +2235,2169,2236, +2170,2236,2169, +2236,2170,2237, +2171,2237,2170, +2237,2171,2238, +2172,2238,2171, +2238,2172,2239, +2173,2239,2172, +2239,2173,2240, +2174,2240,2173, +2240,2174,2241, +2175,2241,2174, +2241,2175,2242, +2176,2242,2175, +2242,2176,2243, +2177,2243,2176, +}; + +#define Landscape06VtxCount 2310 +#define Landscape06IdxCount 13260 + +btScalar Landscape06Vtx[] = { +-250.0f,5.63631f,246.094f, +-250.0f,8.1152f,250.0f, +-246.094f,7.06461f,246.094f, +-246.094f,9.72778f,250.0f, +-242.188f,9.8471f,246.094f, +-242.188f,11.659f,250.0f, +-238.281f,12.8404f,246.094f, +-238.281f,12.5619f,250.0f, +-234.375f,13.9879f,246.094f, +-234.375f,12.9518f,250.0f, +-230.469f,15.7239f,246.094f, +-230.469f,15.1373f,250.0f, +-226.563f,17.5095f,246.094f, +-226.563f,17.0421f,250.0f, +-222.656f,18.4322f,246.094f, +-222.656f,17.9919f,250.0f, +-218.75f,19.0755f,246.094f, +-218.75f,18.7918f,250.0f, +-214.844f,19.9271f,246.094f, +-214.844f,19.5719f,250.0f, +-210.938f,19.7244f,246.094f, +-210.938f,20.0866f,250.0f, +-207.031f,18.9716f,246.094f, +-207.031f,19.7869f,250.0f, +-203.125f,19.1922f,246.094f, +-203.125f,20.0264f,250.0f, +-199.219f,17.8506f,246.094f, +-199.219f,19.3207f,250.0f, +-195.313f,15.238f,246.094f, +-195.313f,18.0244f,250.0f, +-191.406f,14.6904f,246.094f, +-191.406f,16.2939f,250.0f, +-187.5f,12.9803f,246.094f, +-187.5f,14.9619f,250.0f, +-183.594f,11.6545f,246.094f, +-183.594f,12.6676f,250.0f, +-179.688f,12.4631f,246.094f, +-179.688f,13.6712f,250.0f, +-175.781f,13.1206f,246.094f, +-175.781f,14.5417f,250.0f, +-171.875f,13.3105f,246.094f, +-171.875f,15.8974f,250.0f, +-167.969f,13.4543f,246.094f, +-167.969f,15.9641f,250.0f, +-164.063f,13.4505f,246.094f, +-164.063f,15.4826f,250.0f, +-160.156f,14.6873f,246.094f, +-160.156f,15.1093f,250.0f, +-156.25f,14.1623f,246.094f, +-156.25f,14.8119f,250.0f, +-152.344f,14.0111f,246.094f, +-152.344f,14.4017f,250.0f, +-148.438f,13.2014f,246.094f, +-148.438f,14.2916f,250.0f, +-144.531f,12.8662f,246.094f, +-144.531f,13.5685f,250.0f, +-140.625f,13.1721f,246.094f, +-140.625f,14.2972f,250.0f, +-136.719f,12.9479f,246.094f, +-136.719f,15.0727f,250.0f, +-132.813f,13.4221f,246.094f, +-132.813f,14.5344f,250.0f, +-128.906f,14.0862f,246.094f, +-128.906f,15.7145f,250.0f, +-125.0f,13.481f,246.094f, +-125.0f,15.4608f,250.0f, +-121.094f,12.6228f,246.094f, +-121.094f,15.1857f,250.0f, +-117.188f,12.0584f,246.094f, +-117.188f,15.444f,250.0f, +-113.281f,12.7173f,246.094f, +-113.281f,15.8882f,250.0f, +-109.375f,12.3498f,246.094f, +-109.375f,15.2023f,250.0f, +-105.469f,13.0125f,246.094f, +-105.469f,15.1747f,250.0f, +-101.563f,13.7023f,246.094f, +-101.563f,14.7499f,250.0f, +-97.6563f,14.0674f,246.094f, +-97.6563f,15.0991f,250.0f, +-93.75f,13.8437f,246.094f, +-93.75f,14.6676f,250.0f, +-89.8438f,14.6327f,246.094f, +-89.8438f,14.1527f,250.0f, +-85.9375f,13.2966f,246.094f, +-85.9375f,14.0388f,250.0f, +-82.0313f,12.8094f,246.094f, +-82.0313f,13.7786f,250.0f, +-78.125f,11.8006f,246.094f, +-78.125f,13.0685f,250.0f, +-74.2188f,11.6837f,246.094f, +-74.2188f,12.8361f,250.0f, +-70.3125f,11.0326f,246.094f, +-70.3125f,12.3629f,250.0f, +-66.4063f,11.893f,246.094f, +-66.4063f,11.1909f,250.0f, +-62.5f,10.6469f,246.094f, +-62.5f,9.92966f,250.0f, +-58.5938f,8.55287f,246.094f, +-58.5938f,8.8871f,250.0f, +-54.6875f,7.1029f,246.094f, +-54.6875f,7.4963f,250.0f, +-50.7813f,6.9758f,246.094f, +-50.7813f,6.23897f,250.0f, +-46.875f,7.98262f,246.094f, +-46.875f,6.88918f,250.0f, +-42.9688f,9.11554f,246.094f, +-42.9688f,7.29319f,250.0f, +-39.0625f,8.74373f,246.094f, +-39.0625f,6.89167f,250.0f, +-35.1563f,7.46275f,246.094f, +-35.1563f,6.659f,250.0f, +-31.25f,7.67626f,246.094f, +-31.25f,6.75404f,250.0f, +-27.3438f,7.00511f,246.094f, +-27.3438f,6.15573f,250.0f, +-23.4375f,5.63813f,246.094f, +-23.4375f,5.72737f,250.0f, +-19.5313f,5.11885f,246.094f, +-19.5313f,4.00822f,250.0f, +-15.625f,3.60038f,246.094f, +-15.625f,3.50471f,250.0f, +-11.7188f,3.05357f,246.094f, +-11.7188f,3.0992f,250.0f, +-7.8125f,2.48195f,246.094f, +-7.8125f,2.46052f,250.0f, +-3.90625f,1.69136f,246.094f, +-3.90625f,2.5505f,250.0f, +0.0f,1.14548f,246.094f, +0.0f,2.18079f,250.0f, +3.90625f,0.45291f,246.094f, +3.90625f,1.52302f,250.0f, +-250.0f,5.2159f,242.188f, +-246.094f,7.35218f,242.188f, +-242.188f,10.2284f,242.188f, +-238.281f,12.7552f,242.188f, +-234.375f,14.3317f,242.188f, +-230.469f,16.3594f,242.188f, +-226.563f,17.8216f,242.188f, +-222.656f,18.5321f,242.188f, +-218.75f,18.7578f,242.188f, +-214.844f,19.504f,242.188f, +-210.938f,18.9422f,242.188f, +-207.031f,17.9771f,242.188f, +-203.125f,17.2798f,242.188f, +-199.219f,15.2252f,242.188f, +-195.313f,13.8769f,242.188f, +-191.406f,12.8727f,242.188f, +-187.5f,11.7858f,242.188f, +-183.594f,12.4886f,242.188f, +-179.688f,12.9814f,242.188f, +-175.781f,13.5265f,242.188f, +-171.875f,13.8082f,242.188f, +-167.969f,13.8407f,242.188f, +-164.063f,13.5872f,242.188f, +-160.156f,13.8287f,242.188f, +-156.25f,13.5778f,242.188f, +-152.344f,13.0026f,242.188f, +-148.438f,12.6259f,242.188f, +-144.531f,12.4666f,242.188f, +-140.625f,12.634f,242.188f, +-136.719f,12.1746f,242.188f, +-132.813f,11.7885f,242.188f, +-128.906f,11.4539f,242.188f, +-125.0f,11.0084f,242.188f, +-121.094f,10.1521f,242.188f, +-117.188f,10.6008f,242.188f, +-113.281f,10.2088f,242.188f, +-109.375f,11.0344f,242.188f, +-105.469f,11.1441f,242.188f, +-101.563f,12.3959f,242.188f, +-97.6563f,13.3587f,242.188f, +-93.75f,14.2415f,242.188f, +-89.8438f,13.9809f,242.188f, +-85.9375f,13.3276f,242.188f, +-82.0313f,11.9639f,242.188f, +-78.125f,11.5863f,242.188f, +-74.2188f,11.7327f,242.188f, +-70.3125f,11.5527f,242.188f, +-66.4063f,12.3699f,242.188f, +-62.5f,11.1959f,242.188f, +-58.5938f,9.59967f,242.188f, +-54.6875f,8.38887f,242.188f, +-50.7813f,7.42613f,242.188f, +-46.875f,8.34697f,242.188f, +-42.9688f,9.7013f,242.188f, +-39.0625f,9.10668f,242.188f, +-35.1563f,8.24657f,242.188f, +-31.25f,8.06656f,242.188f, +-27.3438f,6.98555f,242.188f, +-23.4375f,6.88836f,242.188f, +-19.5313f,5.88079f,242.188f, +-15.625f,4.43148f,242.188f, +-11.7188f,3.65843f,242.188f, +-7.8125f,2.85687f,242.188f, +-3.90625f,1.8332f,242.188f, +0.0f,2.03971f,242.188f, +3.90625f,2.21488f,242.188f, +-250.0f,5.44463f,238.281f, +-246.094f,7.90885f,238.281f, +-242.188f,10.3908f,238.281f, +-238.281f,12.875f,238.281f, +-234.375f,14.8255f,238.281f, +-230.469f,16.5404f,238.281f, +-226.563f,17.8109f,238.281f, +-222.656f,19.0205f,238.281f, +-218.75f,18.7565f,238.281f, +-214.844f,18.9852f,238.281f, +-210.938f,18.3753f,238.281f, +-207.031f,16.6829f,238.281f, +-203.125f,15.8099f,238.281f, +-199.219f,13.2915f,238.281f, +-195.313f,13.447f,238.281f, +-191.406f,13.5971f,238.281f, +-187.5f,12.1473f,238.281f, +-183.594f,13.3531f,238.281f, +-179.688f,14.4732f,238.281f, +-175.781f,15.0267f,238.281f, +-171.875f,14.7852f,238.281f, +-167.969f,15.5706f,238.281f, +-164.063f,14.267f,238.281f, +-160.156f,14.0772f,238.281f, +-156.25f,12.4965f,238.281f, +-152.344f,12.1473f,238.281f, +-148.438f,11.8693f,238.281f, +-144.531f,11.2795f,238.281f, +-140.625f,10.8173f,238.281f, +-136.719f,10.792f,238.281f, +-132.813f,10.8481f,238.281f, +-128.906f,9.95928f,238.281f, +-125.0f,10.0976f,238.281f, +-121.094f,8.74444f,238.281f, +-117.188f,9.1761f,238.281f, +-113.281f,10.2354f,238.281f, +-109.375f,10.7023f,238.281f, +-105.469f,11.6386f,238.281f, +-101.563f,12.7789f,238.281f, +-97.6563f,13.956f,238.281f, +-93.75f,14.1101f,238.281f, +-89.8438f,13.2653f,238.281f, +-85.9375f,12.1604f,238.281f, +-82.0313f,11.6914f,238.281f, +-78.125f,11.3706f,238.281f, +-74.2188f,12.1449f,238.281f, +-70.3125f,12.4512f,238.281f, +-66.4063f,12.6436f,238.281f, +-62.5f,11.6692f,238.281f, +-58.5938f,10.8304f,238.281f, +-54.6875f,8.88158f,238.281f, +-50.7813f,7.94904f,238.281f, +-46.875f,8.47525f,238.281f, +-42.9688f,9.08763f,238.281f, +-39.0625f,9.21095f,238.281f, +-35.1563f,9.12926f,238.281f, +-31.25f,8.5517f,238.281f, +-27.3438f,7.86146f,238.281f, +-23.4375f,7.33662f,238.281f, +-19.5313f,6.37551f,238.281f, +-15.625f,5.59324f,238.281f, +-11.7188f,4.81831f,238.281f, +-7.8125f,4.35695f,238.281f, +-3.90625f,3.64159f,238.281f, +0.0f,3.70314f,238.281f, +3.90625f,3.04396f,238.281f, +-250.0f,5.92848f,234.375f, +-246.094f,8.10446f,234.375f, +-242.188f,10.3516f,234.375f, +-238.281f,12.4984f,234.375f, +-234.375f,15.0991f,234.375f, +-230.469f,16.0002f,234.375f, +-226.563f,17.2585f,234.375f, +-222.656f,18.1852f,234.375f, +-218.75f,18.7811f,234.375f, +-214.844f,18.4638f,234.375f, +-210.938f,18.3171f,234.375f, +-207.031f,16.1085f,234.375f, +-203.125f,15.1926f,234.375f, +-199.219f,14.1792f,234.375f, +-195.313f,13.5589f,234.375f, +-191.406f,13.9362f,234.375f, +-187.5f,13.303f,234.375f, +-183.594f,13.6602f,234.375f, +-179.688f,15.1086f,234.375f, +-175.781f,15.5943f,234.375f, +-171.875f,15.3663f,234.375f, +-167.969f,14.9609f,234.375f, +-164.063f,14.4285f,234.375f, +-160.156f,14.1532f,234.375f, +-156.25f,13.0139f,234.375f, +-152.344f,11.6503f,234.375f, +-148.438f,11.6112f,234.375f, +-144.531f,11.1097f,234.375f, +-140.625f,10.8763f,234.375f, +-136.719f,10.2321f,234.375f, +-132.813f,9.71321f,234.375f, +-128.906f,9.04388f,234.375f, +-125.0f,9.53542f,234.375f, +-121.094f,8.10006f,234.375f, +-117.188f,9.16948f,234.375f, +-113.281f,9.67824f,234.375f, +-109.375f,10.2679f,234.375f, +-105.469f,10.9669f,234.375f, +-101.563f,12.2942f,234.375f, +-97.6563f,13.2952f,234.375f, +-93.75f,13.0932f,234.375f, +-89.8438f,12.4514f,234.375f, +-85.9375f,12.2395f,234.375f, +-82.0313f,11.7622f,234.375f, +-78.125f,11.9666f,234.375f, +-74.2188f,12.2346f,234.375f, +-70.3125f,13.1648f,234.375f, +-66.4063f,13.506f,234.375f, +-62.5f,13.1773f,234.375f, +-58.5938f,11.9168f,234.375f, +-54.6875f,10.0208f,234.375f, +-50.7813f,9.08267f,234.375f, +-46.875f,8.4406f,234.375f, +-42.9688f,9.27515f,234.375f, +-39.0625f,10.2228f,234.375f, +-35.1563f,9.77624f,234.375f, +-31.25f,9.17943f,234.375f, +-27.3438f,8.83272f,234.375f, +-23.4375f,8.00355f,234.375f, +-19.5313f,7.37167f,234.375f, +-15.625f,6.87424f,234.375f, +-11.7188f,6.23994f,234.375f, +-7.8125f,5.50641f,234.375f, +-3.90625f,5.06839f,234.375f, +0.0f,5.06846f,234.375f, +3.90625f,5.19166f,234.375f, +-250.0f,4.98265f,230.469f, +-246.094f,7.878f,230.469f, +-242.188f,10.9188f,230.469f, +-238.281f,12.8549f,230.469f, +-234.375f,14.5578f,230.469f, +-230.469f,16.067f,230.469f, +-226.563f,17.9938f,230.469f, +-222.656f,18.3449f,230.469f, +-218.75f,18.4423f,230.469f, +-214.844f,18.9411f,230.469f, +-210.938f,17.3131f,230.469f, +-207.031f,15.3292f,230.469f, +-203.125f,15.5278f,230.469f, +-199.219f,14.9451f,230.469f, +-195.313f,13.8026f,230.469f, +-191.406f,13.1586f,230.469f, +-187.5f,13.4388f,230.469f, +-183.594f,14.2213f,230.469f, +-179.688f,14.907f,230.469f, +-175.781f,15.2295f,230.469f, +-171.875f,14.8701f,230.469f, +-167.969f,14.1393f,230.469f, +-164.063f,13.7829f,230.469f, +-160.156f,13.0614f,230.469f, +-156.25f,12.3416f,230.469f, +-152.344f,11.5366f,230.469f, +-148.438f,11.5201f,230.469f, +-144.531f,11.0918f,230.469f, +-140.625f,11.139f,230.469f, +-136.719f,10.0387f,230.469f, +-132.813f,8.59099f,230.469f, +-128.906f,7.71771f,230.469f, +-125.0f,7.44273f,230.469f, +-121.094f,8.17087f,230.469f, +-117.188f,8.34002f,230.469f, +-113.281f,9.22169f,230.469f, +-109.375f,10.2195f,230.469f, +-105.469f,11.523f,230.469f, +-101.563f,12.7411f,230.469f, +-97.6563f,12.7429f,230.469f, +-93.75f,12.3959f,230.469f, +-89.8438f,11.7559f,230.469f, +-85.9375f,10.3669f,230.469f, +-82.0313f,10.0825f,230.469f, +-78.125f,11.4451f,230.469f, +-74.2188f,12.235f,230.469f, +-70.3125f,13.6016f,230.469f, +-66.4063f,14.377f,230.469f, +-62.5f,13.967f,230.469f, +-58.5938f,12.862f,230.469f, +-54.6875f,11.4719f,230.469f, +-50.7813f,9.99381f,230.469f, +-46.875f,8.68857f,230.469f, +-42.9688f,9.43448f,230.469f, +-39.0625f,10.4708f,230.469f, +-35.1563f,11.0521f,230.469f, +-31.25f,10.5864f,230.469f, +-27.3438f,10.8331f,230.469f, +-23.4375f,9.96112f,230.469f, +-19.5313f,8.61029f,230.469f, +-15.625f,7.42407f,230.469f, +-11.7188f,6.43202f,230.469f, +-7.8125f,6.36726f,230.469f, +-3.90625f,6.52581f,230.469f, +0.0f,6.18686f,230.469f, +3.90625f,5.885f,230.469f, +-250.0f,4.92227f,226.563f, +-246.094f,8.66811f,226.563f, +-242.188f,11.7599f,226.563f, +-238.281f,13.6581f,226.563f, +-234.375f,15.6409f,226.563f, +-230.469f,16.7907f,226.563f, +-226.563f,17.4606f,226.563f, +-222.656f,18.4841f,226.563f, +-218.75f,18.4506f,226.563f, +-214.844f,17.5936f,226.563f, +-210.938f,16.5941f,226.563f, +-207.031f,14.8805f,226.563f, +-203.125f,15.3743f,226.563f, +-199.219f,15.4493f,226.563f, +-195.313f,14.5184f,226.563f, +-191.406f,12.9285f,226.563f, +-187.5f,13.3898f,226.563f, +-183.594f,14.0358f,226.563f, +-179.688f,15.2884f,226.563f, +-175.781f,14.972f,226.563f, +-171.875f,14.2355f,226.563f, +-167.969f,13.6786f,226.563f, +-164.063f,13.0771f,226.563f, +-160.156f,12.7879f,226.563f, +-156.25f,12.4767f,226.563f, +-152.344f,11.5156f,226.563f, +-148.438f,11.1725f,226.563f, +-144.531f,10.8869f,226.563f, +-140.625f,9.77232f,226.563f, +-136.719f,8.75728f,226.563f, +-132.813f,6.77705f,226.563f, +-128.906f,6.35083f,226.563f, +-125.0f,6.59888f,226.563f, +-121.094f,7.81295f,226.563f, +-117.188f,8.10078f,226.563f, +-113.281f,9.07634f,226.563f, +-109.375f,10.2289f,226.563f, +-105.469f,11.5342f,226.563f, +-101.563f,12.9142f,226.563f, +-97.6563f,12.8729f,226.563f, +-93.75f,12.8149f,226.563f, +-89.8438f,10.9671f,226.563f, +-85.9375f,10.0649f,226.563f, +-82.0313f,9.28012f,226.563f, +-78.125f,10.1324f,226.563f, +-74.2188f,11.8638f,226.563f, +-70.3125f,12.6141f,226.563f, +-66.4063f,13.6851f,226.563f, +-62.5f,13.9389f,226.563f, +-58.5938f,13.5413f,226.563f, +-54.6875f,12.4869f,226.563f, +-50.7813f,11.2774f,226.563f, +-46.875f,10.6009f,226.563f, +-42.9688f,11.4839f,226.563f, +-39.0625f,12.5408f,226.563f, +-35.1563f,12.8694f,226.563f, +-31.25f,12.5253f,226.563f, +-27.3438f,12.1887f,226.563f, +-23.4375f,11.5356f,226.563f, +-19.5313f,9.53151f,226.563f, +-15.625f,8.29811f,226.563f, +-11.7188f,7.38375f,226.563f, +-7.8125f,7.57607f,226.563f, +-3.90625f,7.41156f,226.563f, +0.0f,6.9836f,226.563f, +3.90625f,6.89682f,226.563f, +-250.0f,4.66781f,222.656f, +-246.094f,7.89882f,222.656f, +-242.188f,10.8629f,222.656f, +-238.281f,14.1235f,222.656f, +-234.375f,15.6001f,222.656f, +-230.469f,17.0347f,222.656f, +-226.563f,17.4872f,222.656f, +-222.656f,17.6157f,222.656f, +-218.75f,16.8213f,222.656f, +-214.844f,16.4076f,222.656f, +-210.938f,15.0745f,222.656f, +-207.031f,14.2914f,222.656f, +-203.125f,14.6094f,222.656f, +-199.219f,14.4637f,222.656f, +-195.313f,14.0807f,222.656f, +-191.406f,12.4559f,222.656f, +-187.5f,13.0367f,222.656f, +-183.594f,13.975f,222.656f, +-179.688f,14.802f,222.656f, +-175.781f,14.6145f,222.656f, +-171.875f,13.4733f,222.656f, +-167.969f,13.3385f,222.656f, +-164.063f,13.721f,222.656f, +-160.156f,12.5775f,222.656f, +-156.25f,11.962f,222.656f, +-152.344f,11.2422f,222.656f, +-148.438f,10.827f,222.656f, +-144.531f,10.2848f,222.656f, +-140.625f,8.45922f,222.656f, +-136.719f,7.72182f,222.656f, +-132.813f,6.23545f,222.656f, +-128.906f,5.69752f,222.656f, +-125.0f,6.29925f,222.656f, +-121.094f,7.1991f,222.656f, +-117.188f,7.56788f,222.656f, +-113.281f,8.87895f,222.656f, +-109.375f,9.92302f,222.656f, +-105.469f,10.2628f,222.656f, +-101.563f,11.427f,222.656f, +-97.6563f,12.2929f,222.656f, +-93.75f,11.6083f,222.656f, +-89.8438f,11.594f,222.656f, +-85.9375f,10.1683f,222.656f, +-82.0313f,10.4152f,222.656f, +-78.125f,10.765f,222.656f, +-74.2188f,11.5311f,222.656f, +-70.3125f,12.8761f,222.656f, +-66.4063f,14.8794f,222.656f, +-62.5f,15.7341f,222.656f, +-58.5938f,15.0851f,222.656f, +-54.6875f,14.4719f,222.656f, +-50.7813f,13.6899f,222.656f, +-46.875f,13.0842f,222.656f, +-42.9688f,13.1059f,222.656f, +-39.0625f,13.9942f,222.656f, +-35.1563f,13.8877f,222.656f, +-31.25f,14.1293f,222.656f, +-27.3438f,13.6276f,222.656f, +-23.4375f,12.2206f,222.656f, +-19.5313f,10.8481f,222.656f, +-15.625f,9.71168f,222.656f, +-11.7188f,8.51834f,222.656f, +-7.8125f,9.04274f,222.656f, +-3.90625f,8.46981f,222.656f, +0.0f,8.26045f,222.656f, +3.90625f,6.81349f,222.656f, +-250.0f,5.16984f,218.75f, +-246.094f,6.64731f,218.75f, +-242.188f,9.50207f,218.75f, +-238.281f,12.5115f,218.75f, +-234.375f,15.8009f,218.75f, +-230.469f,17.6139f,218.75f, +-226.563f,18.128f,218.75f, +-222.656f,17.3111f,218.75f, +-218.75f,16.3962f,218.75f, +-214.844f,16.0245f,218.75f, +-210.938f,14.5344f,218.75f, +-207.031f,13.4459f,218.75f, +-203.125f,13.3987f,218.75f, +-199.219f,13.5444f,218.75f, +-195.313f,12.1973f,218.75f, +-191.406f,11.8337f,218.75f, +-187.5f,13.3027f,218.75f, +-183.594f,13.2862f,218.75f, +-179.688f,14.577f,218.75f, +-175.781f,14.4312f,218.75f, +-171.875f,13.3065f,218.75f, +-167.969f,14.2726f,218.75f, +-164.063f,14.5522f,218.75f, +-160.156f,13.8269f,218.75f, +-156.25f,12.4234f,218.75f, +-152.344f,10.5035f,218.75f, +-148.438f,9.65297f,218.75f, +-144.531f,8.3692f,218.75f, +-140.625f,7.39811f,218.75f, +-136.719f,6.29024f,218.75f, +-132.813f,5.37103f,218.75f, +-128.906f,5.29069f,218.75f, +-125.0f,5.59696f,218.75f, +-121.094f,6.15404f,218.75f, +-117.188f,7.15855f,218.75f, +-113.281f,8.08243f,218.75f, +-109.375f,8.97937f,218.75f, +-105.469f,9.67177f,218.75f, +-101.563f,10.7738f,218.75f, +-97.6563f,11.4256f,218.75f, +-93.75f,11.6906f,218.75f, +-89.8438f,11.4527f,218.75f, +-85.9375f,11.5445f,218.75f, +-82.0313f,11.9384f,218.75f, +-78.125f,12.452f,218.75f, +-74.2188f,13.3202f,218.75f, +-70.3125f,14.2351f,218.75f, +-66.4063f,15.021f,218.75f, +-62.5f,16.1053f,218.75f, +-58.5938f,16.0633f,218.75f, +-54.6875f,15.6154f,218.75f, +-50.7813f,15.3347f,218.75f, +-46.875f,14.8984f,218.75f, +-42.9688f,14.1541f,218.75f, +-39.0625f,14.8343f,218.75f, +-35.1563f,14.8393f,218.75f, +-31.25f,14.865f,218.75f, +-27.3438f,13.9913f,218.75f, +-23.4375f,13.7749f,218.75f, +-19.5313f,12.6247f,218.75f, +-15.625f,11.3466f,218.75f, +-11.7188f,10.5048f,218.75f, +-7.8125f,9.94742f,218.75f, +-3.90625f,8.79577f,218.75f, +0.0f,8.31646f,218.75f, +3.90625f,8.02546f,218.75f, +-250.0f,4.42455f,214.844f, +-246.094f,6.15686f,214.844f, +-242.188f,8.4919f,214.844f, +-238.281f,12.2627f,214.844f, +-234.375f,15.9215f,214.844f, +-230.469f,17.6896f,214.844f, +-226.563f,18.1835f,214.844f, +-222.656f,17.9341f,214.844f, +-218.75f,16.9803f,214.844f, +-214.844f,15.6617f,214.844f, +-210.938f,14.3989f,214.844f, +-207.031f,12.7777f,214.844f, +-203.125f,12.7635f,214.844f, +-199.219f,12.8533f,214.844f, +-195.313f,12.1672f,214.844f, +-191.406f,12.2357f,214.844f, +-187.5f,12.5806f,214.844f, +-183.594f,12.5597f,214.844f, +-179.688f,13.6296f,214.844f, +-175.781f,13.8382f,214.844f, +-171.875f,14.4001f,214.844f, +-167.969f,14.3002f,214.844f, +-164.063f,14.3353f,214.844f, +-160.156f,14.0346f,214.844f, +-156.25f,12.9823f,214.844f, +-152.344f,10.8141f,214.844f, +-148.438f,9.57028f,214.844f, +-144.531f,8.18427f,214.844f, +-140.625f,6.89938f,214.844f, +-136.719f,5.79227f,214.844f, +-132.813f,4.60172f,214.844f, +-128.906f,4.59969f,214.844f, +-125.0f,5.20294f,214.844f, +-121.094f,6.17542f,214.844f, +-117.188f,7.13347f,214.844f, +-113.281f,8.1045f,214.844f, +-109.375f,8.73005f,214.844f, +-105.469f,9.96489f,214.844f, +-101.563f,11.1039f,214.844f, +-97.6563f,11.6791f,214.844f, +-93.75f,11.9246f,214.844f, +-89.8438f,12.0071f,214.844f, +-85.9375f,12.8099f,214.844f, +-82.0313f,13.3672f,214.844f, +-78.125f,13.5811f,214.844f, +-74.2188f,14.7559f,214.844f, +-70.3125f,15.4274f,214.844f, +-66.4063f,15.487f,214.844f, +-62.5f,16.3346f,214.844f, +-58.5938f,16.424f,214.844f, +-54.6875f,17.1014f,214.844f, +-50.7813f,17.634f,214.844f, +-46.875f,16.5132f,214.844f, +-42.9688f,15.1728f,214.844f, +-39.0625f,15.4699f,214.844f, +-35.1563f,16.154f,214.844f, +-31.25f,15.8527f,214.844f, +-27.3438f,15.4057f,214.844f, +-23.4375f,14.6476f,214.844f, +-19.5313f,13.1705f,214.844f, +-15.625f,11.9754f,214.844f, +-11.7188f,11.7453f,214.844f, +-7.8125f,10.8384f,214.844f, +-3.90625f,10.1259f,214.844f, +0.0f,9.49925f,214.844f, +3.90625f,9.25513f,214.844f, +-250.0f,3.60269f,210.938f, +-246.094f,5.37638f,210.938f, +-242.188f,7.66914f,210.938f, +-238.281f,11.9863f,210.938f, +-234.375f,14.9525f,210.938f, +-230.469f,16.5034f,210.938f, +-226.563f,17.8663f,210.938f, +-222.656f,17.1002f,210.938f, +-218.75f,16.0413f,210.938f, +-214.844f,14.8516f,210.938f, +-210.938f,13.8904f,210.938f, +-207.031f,11.9929f,210.938f, +-203.125f,11.8171f,210.938f, +-199.219f,11.6849f,210.938f, +-195.313f,11.056f,210.938f, +-191.406f,11.6318f,210.938f, +-187.5f,11.9333f,210.938f, +-183.594f,12.599f,210.938f, +-179.688f,14.0437f,210.938f, +-175.781f,14.7937f,210.938f, +-171.875f,14.8844f,210.938f, +-167.969f,14.3312f,210.938f, +-164.063f,13.2879f,210.938f, +-160.156f,12.3423f,210.938f, +-156.25f,11.4768f,210.938f, +-152.344f,9.94481f,210.938f, +-148.438f,7.76655f,210.938f, +-144.531f,6.59218f,210.938f, +-140.625f,6.49848f,210.938f, +-136.719f,5.2458f,210.938f, +-132.813f,4.27164f,210.938f, +-128.906f,4.68484f,210.938f, +-125.0f,5.2746f,210.938f, +-121.094f,6.12822f,210.938f, +-117.188f,8.02215f,210.938f, +-113.281f,8.95036f,210.938f, +-109.375f,9.92538f,210.938f, +-105.469f,10.4058f,210.938f, +-101.563f,11.2862f,210.938f, +-97.6563f,11.7274f,210.938f, +-93.75f,12.3175f,210.938f, +-89.8438f,12.6423f,210.938f, +-85.9375f,13.2212f,210.938f, +-82.0313f,13.9379f,210.938f, +-78.125f,15.3332f,210.938f, +-74.2188f,16.2893f,210.938f, +-70.3125f,16.1032f,210.938f, +-66.4063f,16.7786f,210.938f, +-62.5f,16.8038f,210.938f, +-58.5938f,16.1537f,210.938f, +-54.6875f,17.4306f,210.938f, +-50.7813f,17.313f,210.938f, +-46.875f,16.2568f,210.938f, +-42.9688f,16.0266f,210.938f, +-39.0625f,16.9569f,210.938f, +-35.1563f,18.0733f,210.938f, +-31.25f,17.4779f,210.938f, +-27.3438f,17.2939f,210.938f, +-23.4375f,16.1477f,210.938f, +-19.5313f,15.409f,210.938f, +-15.625f,14.0019f,210.938f, +-11.7188f,13.3531f,210.938f, +-7.8125f,12.4823f,210.938f, +-3.90625f,11.7842f,210.938f, +0.0f,11.0776f,210.938f, +3.90625f,10.5728f,210.938f, +-250.0f,3.49901f,207.031f, +-246.094f,4.00092f,207.031f, +-242.188f,7.06194f,207.031f, +-238.281f,10.1502f,207.031f, +-234.375f,13.0262f,207.031f, +-230.469f,15.541f,207.031f, +-226.563f,16.4029f,207.031f, +-222.656f,16.0741f,207.031f, +-218.75f,15.3706f,207.031f, +-214.844f,14.3529f,207.031f, +-210.938f,13.1351f,207.031f, +-207.031f,11.2939f,207.031f, +-203.125f,11.4337f,207.031f, +-199.219f,11.43f,207.031f, +-195.313f,10.6048f,207.031f, +-191.406f,10.859f,207.031f, +-187.5f,11.8447f,207.031f, +-183.594f,12.8305f,207.031f, +-179.688f,14.9116f,207.031f, +-175.781f,15.0225f,207.031f, +-171.875f,14.847f,207.031f, +-167.969f,13.7464f,207.031f, +-164.063f,12.6716f,207.031f, +-160.156f,10.4028f,207.031f, +-156.25f,9.61156f,207.031f, +-152.344f,9.08545f,207.031f, +-148.438f,6.96088f,207.031f, +-144.531f,6.6794f,207.031f, +-140.625f,6.08012f,207.031f, +-136.719f,5.02964f,207.031f, +-132.813f,4.93996f,207.031f, +-128.906f,4.955f,207.031f, +-125.0f,5.23446f,207.031f, +-121.094f,7.14164f,207.031f, +-117.188f,9.21655f,207.031f, +-113.281f,10.8802f,207.031f, +-109.375f,11.0518f,207.031f, +-105.469f,11.5707f,207.031f, +-101.563f,12.2834f,207.031f, +-97.6563f,12.7498f,207.031f, +-93.75f,12.6608f,207.031f, +-89.8438f,12.3649f,207.031f, +-85.9375f,13.1678f,207.031f, +-82.0313f,13.541f,207.031f, +-78.125f,14.3448f,207.031f, +-74.2188f,15.6006f,207.031f, +-70.3125f,17.0141f,207.031f, +-66.4063f,17.4107f,207.031f, +-62.5f,18.0045f,207.031f, +-58.5938f,17.6582f,207.031f, +-54.6875f,17.0297f,207.031f, +-50.7813f,16.6619f,207.031f, +-46.875f,17.1267f,207.031f, +-42.9688f,18.0618f,207.031f, +-39.0625f,18.7698f,207.031f, +-35.1563f,19.3034f,207.031f, +-31.25f,19.1566f,207.031f, +-27.3438f,19.1107f,207.031f, +-23.4375f,17.3298f,207.031f, +-19.5313f,15.7204f,207.031f, +-15.625f,14.7827f,207.031f, +-11.7188f,14.2027f,207.031f, +-7.8125f,13.5758f,207.031f, +-3.90625f,13.1935f,207.031f, +0.0f,11.8526f,207.031f, +3.90625f,10.4539f,207.031f, +-250.0f,3.85941f,203.125f, +-246.094f,3.80391f,203.125f, +-242.188f,6.8342f,203.125f, +-238.281f,10.0313f,203.125f, +-234.375f,12.9894f,203.125f, +-230.469f,15.1588f,203.125f, +-226.563f,15.6234f,203.125f, +-222.656f,15.112f,203.125f, +-218.75f,14.5577f,203.125f, +-214.844f,14.0703f,203.125f, +-210.938f,13.3523f,203.125f, +-207.031f,12.1264f,203.125f, +-203.125f,11.037f,203.125f, +-199.219f,10.3379f,203.125f, +-195.313f,11.3f,203.125f, +-191.406f,10.6845f,203.125f, +-187.5f,11.7023f,203.125f, +-183.594f,13.2057f,203.125f, +-179.688f,13.976f,203.125f, +-175.781f,14.994f,203.125f, +-171.875f,14.6465f,203.125f, +-167.969f,13.4879f,203.125f, +-164.063f,12.0617f,203.125f, +-160.156f,10.6454f,203.125f, +-156.25f,10.2693f,203.125f, +-152.344f,8.33279f,203.125f, +-148.438f,7.60557f,203.125f, +-144.531f,6.19774f,203.125f, +-140.625f,5.7751f,203.125f, +-136.719f,5.28903f,203.125f, +-132.813f,5.10696f,203.125f, +-128.906f,5.61944f,203.125f, +-125.0f,7.32929f,203.125f, +-121.094f,9.09158f,203.125f, +-117.188f,10.6952f,203.125f, +-113.281f,11.555f,203.125f, +-109.375f,12.5837f,203.125f, +-105.469f,13.4444f,203.125f, +-101.563f,14.3191f,203.125f, +-97.6563f,14.5546f,203.125f, +-93.75f,13.9216f,203.125f, +-89.8438f,13.07f,203.125f, +-85.9375f,13.0497f,203.125f, +-82.0313f,13.8884f,203.125f, +-78.125f,14.2048f,203.125f, +-74.2188f,16.2809f,203.125f, +-70.3125f,17.1518f,203.125f, +-66.4063f,18.4883f,203.125f, +-62.5f,19.2231f,203.125f, +-58.5938f,19.0199f,203.125f, +-54.6875f,18.4606f,203.125f, +-50.7813f,17.3076f,203.125f, +-46.875f,17.0012f,203.125f, +-42.9688f,18.4311f,203.125f, +-39.0625f,19.9758f,203.125f, +-35.1563f,20.1252f,203.125f, +-31.25f,20.126f,203.125f, +-27.3438f,18.9276f,203.125f, +-23.4375f,18.3938f,203.125f, +-19.5313f,16.6811f,203.125f, +-15.625f,15.7398f,203.125f, +-11.7188f,14.6978f,203.125f, +-7.8125f,14.7567f,203.125f, +-3.90625f,14.377f,203.125f, +0.0f,13.0029f,203.125f, +3.90625f,11.4706f,203.125f, +-250.0f,4.68355f,199.219f, +-246.094f,4.65569f,199.219f, +-242.188f,6.34925f,199.219f, +-238.281f,9.03665f,199.219f, +-234.375f,11.4587f,199.219f, +-230.469f,13.9932f,199.219f, +-226.563f,14.8268f,199.219f, +-222.656f,14.0552f,199.219f, +-218.75f,14.4455f,199.219f, +-214.844f,14.3053f,199.219f, +-210.938f,12.5781f,199.219f, +-207.031f,11.5778f,199.219f, +-203.125f,9.91652f,199.219f, +-199.219f,9.20832f,199.219f, +-195.313f,10.1078f,199.219f, +-191.406f,10.5638f,199.219f, +-187.5f,11.6649f,199.219f, +-183.594f,13.3758f,199.219f, +-179.688f,15.2035f,199.219f, +-175.781f,14.6909f,199.219f, +-171.875f,14.0312f,199.219f, +-167.969f,12.6808f,199.219f, +-164.063f,12.649f,199.219f, +-160.156f,11.6333f,199.219f, +-156.25f,10.8896f,199.219f, +-152.344f,8.72848f,199.219f, +-148.438f,7.55753f,199.219f, +-144.531f,6.70035f,199.219f, +-140.625f,5.28209f,199.219f, +-136.719f,5.47347f,199.219f, +-132.813f,7.25678f,199.219f, +-128.906f,9.06223f,199.219f, +-125.0f,9.91604f,199.219f, +-121.094f,10.882f,199.219f, +-117.188f,11.8314f,199.219f, +-113.281f,12.9729f,199.219f, +-109.375f,14.1144f,199.219f, +-105.469f,15.0374f,199.219f, +-101.563f,15.4321f,199.219f, +-97.6563f,15.9823f,199.219f, +-93.75f,15.4663f,199.219f, +-89.8438f,14.4094f,199.219f, +-85.9375f,14.1599f,199.219f, +-82.0313f,14.4239f,199.219f, +-78.125f,14.7717f,199.219f, +-74.2188f,15.3979f,199.219f, +-70.3125f,16.4014f,199.219f, +-66.4063f,17.9486f,199.219f, +-62.5f,19.3767f,199.219f, +-58.5938f,19.7322f,199.219f, +-54.6875f,19.0648f,199.219f, +-50.7813f,18.2481f,199.219f, +-46.875f,17.1507f,199.219f, +-42.9688f,18.6306f,199.219f, +-39.0625f,19.2486f,199.219f, +-35.1563f,20.3158f,199.219f, +-31.25f,19.6441f,199.219f, +-27.3438f,18.7294f,199.219f, +-23.4375f,17.9051f,199.219f, +-19.5313f,17.278f,199.219f, +-15.625f,16.1912f,199.219f, +-11.7188f,15.3685f,199.219f, +-7.8125f,14.8376f,199.219f, +-3.90625f,13.8988f,199.219f, +0.0f,12.5645f,199.219f, +3.90625f,12.1184f,199.219f, +-250.0f,5.71048f,195.313f, +-246.094f,4.68298f,195.313f, +-242.188f,5.30012f,195.313f, +-238.281f,7.72299f,195.313f, +-234.375f,10.9797f,195.313f, +-230.469f,12.6343f,195.313f, +-226.563f,13.8962f,195.313f, +-222.656f,13.2189f,195.313f, +-218.75f,14.0254f,195.313f, +-214.844f,14.5903f,195.313f, +-210.938f,12.6794f,195.313f, +-207.031f,9.8479f,195.313f, +-203.125f,8.05763f,195.313f, +-199.219f,7.68254f,195.313f, +-195.313f,9.0324f,195.313f, +-191.406f,10.7973f,195.313f, +-187.5f,12.1516f,195.313f, +-183.594f,13.1888f,195.313f, +-179.688f,14.2559f,195.313f, +-175.781f,14.0455f,195.313f, +-171.875f,13.2785f,195.313f, +-167.969f,12.7724f,195.313f, +-164.063f,12.56f,195.313f, +-160.156f,11.4647f,195.313f, +-156.25f,10.6463f,195.313f, +-152.344f,9.36927f,195.313f, +-148.438f,7.87862f,195.313f, +-144.531f,6.78168f,195.313f, +-140.625f,5.32688f,195.313f, +-136.719f,6.62928f,195.313f, +-132.813f,8.97871f,195.313f, +-128.906f,10.3174f,195.313f, +-125.0f,11.2136f,195.313f, +-121.094f,12.2822f,195.313f, +-117.188f,13.7351f,195.313f, +-113.281f,14.0196f,195.313f, +-109.375f,15.5457f,195.313f, +-105.469f,16.1402f,195.313f, +-101.563f,16.6719f,195.313f, +-97.6563f,16.2658f,195.313f, +-93.75f,16.5379f,195.313f, +-89.8438f,15.1289f,195.313f, +-85.9375f,14.7687f,195.313f, +-82.0313f,15.4638f,195.313f, +-78.125f,15.3391f,195.313f, +-74.2188f,14.8602f,195.313f, +-70.3125f,16.2701f,195.313f, +-66.4063f,17.9511f,195.313f, +-62.5f,19.108f,195.313f, +-58.5938f,19.5253f,195.313f, +-54.6875f,19.1648f,195.313f, +-50.7813f,18.0624f,195.313f, +-46.875f,17.2201f,195.313f, +-42.9688f,19.4165f,195.313f, +-39.0625f,20.3781f,195.313f, +-35.1563f,19.796f,195.313f, +-31.25f,18.9841f,195.313f, +-27.3438f,18.3143f,195.313f, +-23.4375f,18.1973f,195.313f, +-19.5313f,17.5121f,195.313f, +-15.625f,16.5969f,195.313f, +-11.7188f,15.3539f,195.313f, +-7.8125f,14.4654f,195.313f, +-3.90625f,13.8161f,195.313f, +0.0f,12.4727f,195.313f, +3.90625f,13.8013f,195.313f, +-250.0f,6.07831f,191.406f, +-246.094f,5.46721f,191.406f, +-242.188f,4.48351f,191.406f, +-238.281f,6.74031f,191.406f, +-234.375f,9.75661f,191.406f, +-230.469f,11.5382f,191.406f, +-226.563f,12.9559f,191.406f, +-222.656f,12.6196f,191.406f, +-218.75f,12.4516f,191.406f, +-214.844f,13.5738f,191.406f, +-210.938f,12.2334f,191.406f, +-207.031f,9.36284f,191.406f, +-203.125f,7.56119f,191.406f, +-199.219f,8.2975f,191.406f, +-195.313f,10.0432f,191.406f, +-191.406f,11.528f,191.406f, +-187.5f,12.9338f,191.406f, +-183.594f,13.9397f,191.406f, +-179.688f,14.1423f,191.406f, +-175.781f,13.7637f,191.406f, +-171.875f,12.7983f,191.406f, +-167.969f,12.6132f,191.406f, +-164.063f,12.07f,191.406f, +-160.156f,11.7037f,191.406f, +-156.25f,10.3692f,191.406f, +-152.344f,9.29784f,191.406f, +-148.438f,7.91508f,191.406f, +-144.531f,6.85636f,191.406f, +-140.625f,8.06021f,191.406f, +-136.719f,8.86078f,191.406f, +-132.813f,11.0565f,191.406f, +-128.906f,12.4031f,191.406f, +-125.0f,13.4308f,191.406f, +-121.094f,13.8732f,191.406f, +-117.188f,15.0555f,191.406f, +-113.281f,16.0219f,191.406f, +-109.375f,16.8646f,191.406f, +-105.469f,16.9156f,191.406f, +-101.563f,16.9811f,191.406f, +-97.6563f,17.1773f,191.406f, +-93.75f,16.9233f,191.406f, +-89.8438f,15.3563f,191.406f, +-85.9375f,14.4936f,191.406f, +-82.0313f,15.6108f,191.406f, +-78.125f,15.9615f,191.406f, +-74.2188f,14.6365f,191.406f, +-70.3125f,15.5344f,191.406f, +-66.4063f,17.4295f,191.406f, +-62.5f,18.2646f,191.406f, +-58.5938f,19.0205f,191.406f, +-54.6875f,19.0503f,191.406f, +-50.7813f,17.6912f,191.406f, +-46.875f,17.6816f,191.406f, +-42.9688f,18.8066f,191.406f, +-39.0625f,19.8444f,191.406f, +-35.1563f,18.7929f,191.406f, +-31.25f,18.6865f,191.406f, +-27.3438f,19.0671f,191.406f, +-23.4375f,18.6708f,191.406f, +-19.5313f,17.7215f,191.406f, +-15.625f,16.4711f,191.406f, +-11.7188f,15.4735f,191.406f, +-7.8125f,14.6316f,191.406f, +-3.90625f,13.8779f,191.406f, +0.0f,13.7777f,191.406f, +3.90625f,14.3936f,191.406f, +-250.0f,6.25219f,187.5f, +-246.094f,5.98752f,187.5f, +-242.188f,5.50108f,187.5f, +-238.281f,5.52049f,187.5f, +-234.375f,7.87236f,187.5f, +-230.469f,10.0244f,187.5f, +-226.563f,10.9579f,187.5f, +-222.656f,11.4176f,187.5f, +-218.75f,11.1583f,187.5f, +-214.844f,12.0797f,187.5f, +-210.938f,10.8226f,187.5f, +-207.031f,8.91363f,187.5f, +-203.125f,7.71952f,187.5f, +-199.219f,8.97116f,187.5f, +-195.313f,10.8813f,187.5f, +-191.406f,12.5874f,187.5f, +-187.5f,13.3418f,187.5f, +-183.594f,13.6407f,187.5f, +-179.688f,13.8787f,187.5f, +-175.781f,13.7918f,187.5f, +-171.875f,12.965f,187.5f, +-167.969f,12.2732f,187.5f, +-164.063f,11.6063f,187.5f, +-160.156f,10.9159f,187.5f, +-156.25f,10.2447f,187.5f, +-152.344f,9.32757f,187.5f, +-148.438f,9.17721f,187.5f, +-144.531f,9.53961f,187.5f, +-140.625f,10.4339f,187.5f, +-136.719f,11.8144f,187.5f, +-132.813f,13.3081f,187.5f, +-128.906f,13.571f,187.5f, +-125.0f,13.9242f,187.5f, +-121.094f,15.4069f,187.5f, +-117.188f,16.9689f,187.5f, +-113.281f,17.987f,187.5f, +-109.375f,18.7838f,187.5f, +-105.469f,18.7737f,187.5f, +-101.563f,18.6666f,187.5f, +-97.6563f,18.4809f,187.5f, +-93.75f,18.3562f,187.5f, +-89.8438f,16.3715f,187.5f, +-85.9375f,14.5483f,187.5f, +-82.0313f,14.9648f,187.5f, +-78.125f,16.1061f,187.5f, +-74.2188f,14.4715f,187.5f, +-70.3125f,14.8322f,187.5f, +-66.4063f,16.3093f,187.5f, +-62.5f,17.3305f,187.5f, +-58.5938f,18.3312f,187.5f, +-54.6875f,18.2865f,187.5f, +-50.7813f,17.4373f,187.5f, +-46.875f,17.9803f,187.5f, +-42.9688f,18.679f,187.5f, +-39.0625f,19.2363f,187.5f, +-35.1563f,19.9926f,187.5f, +-31.25f,19.8827f,187.5f, +-27.3438f,19.283f,187.5f, +-23.4375f,19.0081f,187.5f, +-19.5313f,17.5129f,187.5f, +-15.625f,16.6754f,187.5f, +-11.7188f,15.6685f,187.5f, +-7.8125f,14.6133f,187.5f, +-3.90625f,13.9468f,187.5f, +0.0f,14.2206f,187.5f, +3.90625f,14.1738f,187.5f, +-250.0f,7.10023f,183.594f, +-246.094f,6.39376f,183.594f, +-242.188f,5.78017f,183.594f, +-238.281f,5.07235f,183.594f, +-234.375f,5.98564f,183.594f, +-230.469f,7.6542f,183.594f, +-226.563f,8.75539f,183.594f, +-222.656f,9.90845f,183.594f, +-218.75f,10.2067f,183.594f, +-214.844f,10.2019f,183.594f, +-210.938f,9.2327f,183.594f, +-207.031f,7.67088f,183.594f, +-203.125f,8.15546f,183.594f, +-199.219f,9.42269f,183.594f, +-195.313f,10.8046f,183.594f, +-191.406f,13.3042f,183.594f, +-187.5f,13.9971f,183.594f, +-183.594f,13.621f,183.594f, +-179.688f,13.5612f,183.594f, +-175.781f,13.5357f,183.594f, +-171.875f,12.8778f,183.594f, +-167.969f,12.0385f,183.594f, +-164.063f,11.4391f,183.594f, +-160.156f,10.4255f,183.594f, +-156.25f,10.5692f,183.594f, +-152.344f,10.5452f,183.594f, +-148.438f,11.506f,183.594f, +-144.531f,12.1591f,183.594f, +-140.625f,12.6212f,183.594f, +-136.719f,13.5025f,183.594f, +-132.813f,14.3363f,183.594f, +-128.906f,14.5206f,183.594f, +-125.0f,15.4902f,183.594f, +-121.094f,17.4029f,183.594f, +-117.188f,17.9537f,183.594f, +-113.281f,18.5532f,183.594f, +-109.375f,19.2939f,183.594f, +-105.469f,19.2503f,183.594f, +-101.563f,19.8772f,183.594f, +-97.6563f,19.6753f,183.594f, +-93.75f,18.6744f,183.594f, +-89.8438f,17.7905f,183.594f, +-85.9375f,16.1613f,183.594f, +-82.0313f,15.7839f,183.594f, +-78.125f,15.657f,183.594f, +-74.2188f,14.4171f,183.594f, +-70.3125f,14.6083f,183.594f, +-66.4063f,15.5594f,183.594f, +-62.5f,16.1338f,183.594f, +-58.5938f,17.1134f,183.594f, +-54.6875f,16.8192f,183.594f, +-50.7813f,17.6885f,183.594f, +-46.875f,18.5331f,183.594f, +-42.9688f,19.7359f,183.594f, +-39.0625f,20.7966f,183.594f, +-35.1563f,20.414f,183.594f, +-31.25f,20.1587f,183.594f, +-27.3438f,19.9385f,183.594f, +-23.4375f,18.4694f,183.594f, +-19.5313f,16.9742f,183.594f, +-15.625f,16.0698f,183.594f, +-11.7188f,15.4466f,183.594f, +-7.8125f,15.0614f,183.594f, +-3.90625f,15.2165f,183.594f, +0.0f,14.2632f,183.594f, +3.90625f,13.9878f,183.594f, +-250.0f,8.16978f,179.688f, +-246.094f,7.02044f,179.688f, +-242.188f,6.49336f,179.688f, +-238.281f,6.17674f,179.688f, +-234.375f,4.65977f,179.688f, +-230.469f,5.28977f,179.688f, +-226.563f,7.10711f,179.688f, +-222.656f,8.03062f,179.688f, +-218.75f,9.32719f,179.688f, +-214.844f,9.22926f,179.688f, +-210.938f,8.64588f,179.688f, +-207.031f,7.76534f,179.688f, +-203.125f,8.37552f,179.688f, +-199.219f,8.61402f,179.688f, +-195.313f,10.7567f,179.688f, +-191.406f,12.1961f,179.688f, +-187.5f,13.5076f,179.688f, +-183.594f,13.5739f,179.688f, +-179.688f,13.6032f,179.688f, +-175.781f,13.5388f,179.688f, +-171.875f,13.0425f,179.688f, +-167.969f,13.5885f,179.688f, +-164.063f,13.2666f,179.688f, +-160.156f,11.7827f,179.688f, +-156.25f,12.3517f,179.688f, +-152.344f,13.1307f,179.688f, +-148.438f,13.6688f,179.688f, +-144.531f,13.758f,179.688f, +-140.625f,14.023f,179.688f, +-136.719f,15.1514f,179.688f, +-132.813f,16.004f,179.688f, +-128.906f,16.8991f,179.688f, +-125.0f,17.3616f,179.688f, +-121.094f,18.6059f,179.688f, +-117.188f,19.3263f,179.688f, +-113.281f,19.1956f,179.688f, +-109.375f,19.7991f,179.688f, +-105.469f,20.6907f,179.688f, +-101.563f,21.7059f,179.688f, +-97.6563f,21.5595f,179.688f, +-93.75f,20.4072f,179.688f, +-89.8438f,19.1786f,179.688f, +-85.9375f,18.2895f,179.688f, +-82.0313f,17.1568f,179.688f, +-78.125f,15.2991f,179.688f, +-74.2188f,14.0951f,179.688f, +-70.3125f,14.2935f,179.688f, +-66.4063f,15.0579f,179.688f, +-62.5f,15.3497f,179.688f, +-58.5938f,15.4148f,179.688f, +-54.6875f,17.2528f,179.688f, +-50.7813f,18.38f,179.688f, +-46.875f,19.343f,179.688f, +-42.9688f,20.2151f,179.688f, +-39.0625f,21.1482f,179.688f, +-35.1563f,20.8113f,179.688f, +-31.25f,19.3685f,179.688f, +-27.3438f,18.4966f,179.688f, +-23.4375f,17.1162f,179.688f, +-19.5313f,16.1739f,179.688f, +-15.625f,15.1081f,179.688f, +-11.7188f,15.5766f,179.688f, +-7.8125f,16.3649f,179.688f, +-3.90625f,16.3198f,179.688f, +0.0f,15.6844f,179.688f, +3.90625f,14.6785f,179.688f, +-250.0f,9.32456f,175.781f, +-246.094f,8.37571f,175.781f, +-242.188f,7.57502f,175.781f, +-238.281f,7.01497f,175.781f, +-234.375f,5.67261f,175.781f, +-230.469f,4.32895f,175.781f, +-226.563f,5.20027f,175.781f, +-222.656f,6.31061f,175.781f, +-218.75f,7.56464f,175.781f, +-214.844f,8.35874f,175.781f, +-210.938f,8.24556f,175.781f, +-207.031f,7.58905f,175.781f, +-203.125f,8.23662f,175.781f, +-199.219f,8.64236f,175.781f, +-195.313f,10.4842f,175.781f, +-191.406f,11.8296f,175.781f, +-187.5f,13.5307f,175.781f, +-183.594f,14.3422f,175.781f, +-179.688f,14.0725f,175.781f, +-175.781f,14.6f,175.781f, +-171.875f,13.9877f,175.781f, +-167.969f,13.7556f,175.781f, +-164.063f,13.4564f,175.781f, +-160.156f,13.6823f,175.781f, +-156.25f,14.2643f,175.781f, +-152.344f,14.5034f,175.781f, +-148.438f,14.905f,175.781f, +-144.531f,15.0207f,175.781f, +-140.625f,15.2745f,175.781f, +-136.719f,16.7553f,175.781f, +-132.813f,17.9777f,175.781f, +-128.906f,18.5468f,175.781f, +-125.0f,19.2067f,175.781f, +-121.094f,19.2384f,175.781f, +-117.188f,19.4993f,175.781f, +-113.281f,20.2276f,175.781f, +-109.375f,21.3946f,175.781f, +-105.469f,22.0598f,175.781f, +-101.563f,23.2713f,175.781f, +-97.6563f,22.6691f,175.781f, +-93.75f,21.3119f,175.781f, +-89.8438f,20.6083f,175.781f, +-85.9375f,19.4937f,175.781f, +-82.0313f,18.1998f,175.781f, +-78.125f,15.7716f,175.781f, +-74.2188f,14.2438f,175.781f, +-70.3125f,14.4105f,175.781f, +-66.4063f,15.1879f,175.781f, +-62.5f,15.7946f,175.781f, +-58.5938f,16.2302f,175.781f, +-54.6875f,17.1058f,175.781f, +-50.7813f,18.9688f,175.781f, +-46.875f,19.3102f,175.781f, +-42.9688f,19.3902f,175.781f, +-39.0625f,19.6545f,175.781f, +-35.1563f,19.2909f,175.781f, +-31.25f,18.5385f,175.781f, +-27.3438f,16.4388f,175.781f, +-23.4375f,15.5576f,175.781f, +-19.5313f,15.7726f,175.781f, +-15.625f,16.3756f,175.781f, +-11.7188f,16.9626f,175.781f, +-7.8125f,17.219f,175.781f, +-3.90625f,17.063f,175.781f, +0.0f,16.3609f,175.781f, +3.90625f,15.2963f,175.781f, +-250.0f,10.0329f,171.875f, +-246.094f,8.57258f,171.875f, +-242.188f,7.81755f,171.875f, +-238.281f,6.9951f,171.875f, +-234.375f,5.59199f,171.875f, +-230.469f,4.81205f,171.875f, +-226.563f,4.7432f,171.875f, +-222.656f,5.42683f,171.875f, +-218.75f,6.16332f,171.875f, +-214.844f,6.63573f,171.875f, +-210.938f,6.97578f,171.875f, +-207.031f,7.49804f,171.875f, +-203.125f,8.51155f,171.875f, +-199.219f,7.94356f,171.875f, +-195.313f,9.50881f,171.875f, +-191.406f,10.9726f,171.875f, +-187.5f,13.1622f,171.875f, +-183.594f,13.8249f,171.875f, +-179.688f,15.1925f,171.875f, +-175.781f,14.9284f,171.875f, +-171.875f,13.915f,171.875f, +-167.969f,14.2258f,171.875f, +-164.063f,13.435f,171.875f, +-160.156f,13.9359f,171.875f, +-156.25f,14.8963f,171.875f, +-152.344f,15.2933f,171.875f, +-148.438f,15.0124f,171.875f, +-144.531f,15.0787f,171.875f, +-140.625f,15.1958f,171.875f, +-136.719f,17.151f,171.875f, +-132.813f,18.8799f,171.875f, +-128.906f,19.5273f,171.875f, +-125.0f,19.6894f,171.875f, +-121.094f,19.6466f,171.875f, +-117.188f,20.5941f,171.875f, +-113.281f,21.5237f,171.875f, +-109.375f,22.5435f,171.875f, +-105.469f,23.0706f,171.875f, +-101.563f,23.614f,171.875f, +-97.6563f,22.4198f,171.875f, +-93.75f,21.9598f,171.875f, +-89.8438f,22.3051f,171.875f, +-85.9375f,21.7459f,171.875f, +-82.0313f,20.1308f,171.875f, +-78.125f,17.6018f,171.875f, +-74.2188f,15.106f,171.875f, +-70.3125f,16.0838f,171.875f, +-66.4063f,16.4153f,171.875f, +-62.5f,16.9093f,171.875f, +-58.5938f,16.7439f,171.875f, +-54.6875f,16.4659f,171.875f, +-50.7813f,18.0893f,171.875f, +-46.875f,18.8298f,171.875f, +-42.9688f,18.459f,171.875f, +-39.0625f,18.0953f,171.875f, +-35.1563f,18.2461f,171.875f, +-31.25f,17.0625f,171.875f, +-27.3438f,15.3181f,171.875f, +-23.4375f,15.1837f,171.875f, +-19.5313f,17.2025f,171.875f, +-15.625f,18.3144f,171.875f, +-11.7188f,18.4161f,171.875f, +-7.8125f,18.3279f,171.875f, +-3.90625f,17.5657f,171.875f, +0.0f,16.2057f,171.875f, +3.90625f,16.0791f,171.875f, +-250.0f,9.46368f,167.969f, +-246.094f,8.91851f,167.969f, +-242.188f,7.83383f,167.969f, +-238.281f,7.4147f,167.969f, +-234.375f,6.33692f,167.969f, +-230.469f,5.44334f,167.969f, +-226.563f,4.39369f,167.969f, +-222.656f,3.44146f,167.969f, +-218.75f,4.44651f,167.969f, +-214.844f,5.36701f,167.969f, +-210.938f,6.2915f,167.969f, +-207.031f,6.3588f,167.969f, +-203.125f,7.36203f,167.969f, +-199.219f,7.7957f,167.969f, +-195.313f,9.3926f,167.969f, +-191.406f,11.2699f,167.969f, +-187.5f,12.3727f,167.969f, +-183.594f,14.7022f,167.969f, +-179.688f,15.4324f,167.969f, +-175.781f,15.226f,167.969f, +-171.875f,13.6658f,167.969f, +-167.969f,14.0361f,167.969f, +-164.063f,13.5871f,167.969f, +-160.156f,14.725f,167.969f, +-156.25f,15.5452f,167.969f, +-152.344f,16.3685f,167.969f, +-148.438f,17.0213f,167.969f, +-144.531f,16.2228f,167.969f, +-140.625f,15.1123f,167.969f, +-136.719f,16.9339f,167.969f, +-132.813f,18.4025f,167.969f, +-128.906f,19.9945f,167.969f, +-125.0f,20.4069f,167.969f, +-121.094f,21.447f,167.969f, +-117.188f,22.384f,167.969f, +-113.281f,22.4822f,167.969f, +-109.375f,22.9018f,167.969f, +-105.469f,23.4936f,167.969f, +-101.563f,23.0085f,167.969f, +-97.6563f,22.8398f,167.969f, +-93.75f,23.2939f,167.969f, +-89.8438f,23.3336f,167.969f, +-85.9375f,22.6883f,167.969f, +-82.0313f,21.8752f,167.969f, +-78.125f,18.7456f,167.969f, +-74.2188f,16.5685f,167.969f, +-70.3125f,17.179f,167.969f, +-66.4063f,18.1074f,167.969f, +-62.5f,18.9865f,167.969f, +-58.5938f,17.4851f,167.969f, +-54.6875f,17.2795f,167.969f, +-50.7813f,16.9142f,167.969f, +-46.875f,17.1532f,167.969f, +-42.9688f,17.796f,167.969f, +-39.0625f,17.6868f,167.969f, +-35.1563f,16.7998f,167.969f, +-31.25f,16.0556f,167.969f, +-27.3438f,14.7864f,167.969f, +-23.4375f,16.8386f,167.969f, +-19.5313f,17.9676f,167.969f, +-15.625f,18.4144f,167.969f, +-11.7188f,18.9248f,167.969f, +-7.8125f,18.4614f,167.969f, +-3.90625f,17.2197f,167.969f, +0.0f,16.7097f,167.969f, +3.90625f,17.1455f,167.969f, +-250.0f,9.27861f,164.063f, +-246.094f,8.67875f,164.063f, +-242.188f,8.39269f,164.063f, +-238.281f,7.54041f,164.063f, +-234.375f,6.37361f,164.063f, +-230.469f,5.0066f,164.063f, +-226.563f,3.63142f,164.063f, +-222.656f,2.77898f,164.063f, +-218.75f,2.89032f,164.063f, +-214.844f,4.01591f,164.063f, +-210.938f,4.52151f,164.063f, +-207.031f,4.85596f,164.063f, +-203.125f,6.21759f,164.063f, +-199.219f,8.25574f,164.063f, +-195.313f,10.3856f,164.063f, +-191.406f,11.6593f,164.063f, +-187.5f,12.5334f,164.063f, +-183.594f,14.1044f,164.063f, +-179.688f,14.8149f,164.063f, +-175.781f,14.9916f,164.063f, +-171.875f,14.6218f,164.063f, +-167.969f,14.5374f,164.063f, +-164.063f,13.7748f,164.063f, +-160.156f,15.1069f,164.063f, +-156.25f,16.5225f,164.063f, +-152.344f,17.8264f,164.063f, +-148.438f,18.5076f,164.063f, +-144.531f,17.6099f,164.063f, +-140.625f,16.4656f,164.063f, +-136.719f,16.7761f,164.063f, +-132.813f,19.1652f,164.063f, +-128.906f,20.565f,164.063f, +-125.0f,21.7781f,164.063f, +-121.094f,22.7613f,164.063f, +-117.188f,23.5743f,164.063f, +-113.281f,23.3567f,164.063f, +-109.375f,24.4075f,164.063f, +-105.469f,24.4502f,164.063f, +-101.563f,24.044f,164.063f, +-97.6563f,24.669f,164.063f, +-93.75f,24.7946f,164.063f, +-89.8438f,23.9722f,164.063f, +-85.9375f,23.2481f,164.063f, +-82.0313f,22.4202f,164.063f, +-78.125f,19.4816f,164.063f, +-74.2188f,18.3571f,164.063f, +-70.3125f,19.3195f,164.063f, +-66.4063f,19.6276f,164.063f, +-62.5f,19.775f,164.063f, +-58.5938f,18.4049f,164.063f, +-54.6875f,17.6998f,164.063f, +-50.7813f,16.7989f,164.063f, +-46.875f,16.5351f,164.063f, +-42.9688f,16.0836f,164.063f, +-39.0625f,16.4446f,164.063f, +-35.1563f,15.0322f,164.063f, +-31.25f,14.1679f,164.063f, +-27.3438f,16.0461f,164.063f, +-23.4375f,16.985f,164.063f, +-19.5313f,17.3286f,164.063f, +-15.625f,18.477f,164.063f, +-11.7188f,17.8736f,164.063f, +-7.8125f,17.8059f,164.063f, +-3.90625f,17.2079f,164.063f, +0.0f,16.7726f,164.063f, +3.90625f,16.4621f,164.063f, +-250.0f,8.56359f,160.156f, +-246.094f,8.04536f,160.156f, +-242.188f,7.71795f,160.156f, +-238.281f,7.20369f,160.156f, +-234.375f,5.51432f,160.156f, +-230.469f,5.00541f,160.156f, +-226.563f,4.36899f,160.156f, +-222.656f,3.03865f,160.156f, +-218.75f,2.92915f,160.156f, +-214.844f,2.63693f,160.156f, +-210.938f,2.69254f,160.156f, +-207.031f,3.5578f,160.156f, +-203.125f,5.61634f,160.156f, +-199.219f,7.61065f,160.156f, +-195.313f,9.64763f,160.156f, +-191.406f,11.2848f,160.156f, +-187.5f,12.7624f,160.156f, +-183.594f,13.2875f,160.156f, +-179.688f,15.2776f,160.156f, +-175.781f,15.3268f,160.156f, +-171.875f,15.211f,160.156f, +-167.969f,14.343f,160.156f, +-164.063f,14.8683f,160.156f, +-160.156f,16.1659f,160.156f, +-156.25f,16.4538f,160.156f, +-152.344f,18.5601f,160.156f, +-148.438f,19.2615f,160.156f, +-144.531f,18.8155f,160.156f, +-140.625f,17.4377f,160.156f, +-136.719f,17.6478f,160.156f, +-132.813f,19.7168f,160.156f, +-128.906f,21.4745f,160.156f, +-125.0f,23.0596f,160.156f, +-121.094f,24.6069f,160.156f, +-117.188f,25.9676f,160.156f, +-113.281f,26.2865f,160.156f, +-109.375f,27.1441f,160.156f, +-105.469f,27.0334f,160.156f, +-101.563f,26.0567f,160.156f, +-97.6563f,26.2584f,160.156f, +-93.75f,26.2751f,160.156f, +-89.8438f,25.6929f,160.156f, +-85.9375f,24.0275f,160.156f, +-82.0313f,22.2346f,160.156f, +-78.125f,20.4728f,160.156f, +-74.2188f,19.6229f,160.156f, +-70.3125f,20.0997f,160.156f, +-66.4063f,21.118f,160.156f, +-62.5f,20.4515f,160.156f, +-58.5938f,19.4599f,160.156f, +-54.6875f,18.2081f,160.156f, +-50.7813f,16.8263f,160.156f, +-46.875f,16.3719f,160.156f, +-42.9688f,15.1416f,160.156f, +-39.0625f,14.5969f,160.156f, +-35.1563f,14.7039f,160.156f, +-31.25f,14.8314f,160.156f, +-27.3438f,16.4129f,160.156f, +-23.4375f,16.144f,160.156f, +-19.5313f,17.5764f,160.156f, +-15.625f,17.9247f,160.156f, +-11.7188f,17.0582f,160.156f, +-7.8125f,17.1554f,160.156f, +-3.90625f,16.8369f,160.156f, +0.0f,16.4316f,160.156f, +3.90625f,16.628f,160.156f, +-250.0f,7.51933f,156.25f, +-246.094f,7.63381f,156.25f, +-242.188f,7.57378f,156.25f, +-238.281f,6.94606f,156.25f, +-234.375f,4.79198f,156.25f, +-230.469f,4.43262f,156.25f, +-226.563f,4.13314f,156.25f, +-222.656f,2.75517f,156.25f, +-218.75f,2.67631f,156.25f, +-214.844f,3.321f,156.25f, +-210.938f,3.33063f,156.25f, +-207.031f,3.60719f,156.25f, +-203.125f,4.44636f,156.25f, +-199.219f,6.02108f,156.25f, +-195.313f,8.25702f,156.25f, +-191.406f,10.5762f,156.25f, +-187.5f,11.4514f,156.25f, +-183.594f,12.7361f,156.25f, +-179.688f,15.4206f,156.25f, +-175.781f,16.1997f,156.25f, +-171.875f,14.8996f,156.25f, +-167.969f,14.1118f,156.25f, +-164.063f,16.0576f,156.25f, +-160.156f,17.6078f,156.25f, +-156.25f,17.7518f,156.25f, +-152.344f,18.4278f,156.25f, +-148.438f,19.5827f,156.25f, +-144.531f,19.2756f,156.25f, +-140.625f,18.2888f,156.25f, +-136.719f,18.7157f,156.25f, +-132.813f,20.4669f,156.25f, +-128.906f,22.5748f,156.25f, +-125.0f,24.648f,156.25f, +-121.094f,27.1223f,156.25f, +-117.188f,28.0709f,156.25f, +-113.281f,28.4982f,156.25f, +-109.375f,29.0927f,156.25f, +-105.469f,29.2755f,156.25f, +-101.563f,28.9208f,156.25f, +-97.6563f,28.3829f,156.25f, +-93.75f,26.8508f,156.25f, +-89.8438f,25.9621f,156.25f, +-85.9375f,24.2707f,156.25f, +-82.0313f,22.6235f,156.25f, +-78.125f,21.9368f,156.25f, +-74.2188f,21.0831f,156.25f, +-70.3125f,21.368f,156.25f, +-66.4063f,21.3333f,156.25f, +-62.5f,20.5296f,156.25f, +-58.5938f,19.98f,156.25f, +-54.6875f,18.5818f,156.25f, +-50.7813f,17.2025f,156.25f, +-46.875f,16.1859f,156.25f, +-42.9688f,14.4559f,156.25f, +-39.0625f,13.7597f,156.25f, +-35.1563f,14.6354f,156.25f, +-31.25f,15.6213f,156.25f, +-27.3438f,15.683f,156.25f, +-23.4375f,16.5331f,156.25f, +-19.5313f,16.8272f,156.25f, +-15.625f,16.551f,156.25f, +-11.7188f,16.34f,156.25f, +-7.8125f,16.4067f,156.25f, +-3.90625f,15.8725f,156.25f, +0.0f,16.3451f,156.25f, +3.90625f,16.9346f,156.25f, +-250.0f,6.48899f,152.344f, +-246.094f,6.4047f,152.344f, +-242.188f,6.57203f,152.344f, +-238.281f,5.4628f,152.344f, +-234.375f,4.20753f,152.344f, +-230.469f,2.81156f,152.344f, +-226.563f,1.88132f,152.344f, +-222.656f,1.57153f,152.344f, +-218.75f,2.48106f,152.344f, +-214.844f,2.88884f,152.344f, +-210.938f,2.63578f,152.344f, +-207.031f,2.9717f,152.344f, +-203.125f,3.6084f,152.344f, +-199.219f,3.99032f,152.344f, +-195.313f,7.36858f,152.344f, +-191.406f,9.54951f,152.344f, +-187.5f,10.6254f,152.344f, +-183.594f,12.3317f,152.344f, +-179.688f,14.015f,152.344f, +-175.781f,14.8857f,152.344f, +-171.875f,14.9944f,152.344f, +-167.969f,14.7547f,152.344f, +-164.063f,16.7748f,152.344f, +-160.156f,18.5461f,152.344f, +-156.25f,19.5932f,152.344f, +-152.344f,19.1033f,152.344f, +-148.438f,19.012f,152.344f, +-144.531f,19.4428f,152.344f, +-140.625f,19.3453f,152.344f, +-136.719f,20.6611f,152.344f, +-132.813f,22.2914f,152.344f, +-128.906f,24.3802f,152.344f, +-125.0f,26.4048f,152.344f, +-121.094f,28.3525f,152.344f, +-117.188f,30.0561f,152.344f, +-113.281f,30.1155f,152.344f, +-109.375f,30.9005f,152.344f, +-105.469f,30.8767f,152.344f, +-101.563f,30.9056f,152.344f, +-97.6563f,30.3635f,152.344f, +-93.75f,28.3996f,152.344f, +-89.8438f,25.8081f,152.344f, +-85.9375f,24.3731f,152.344f, +-82.0313f,22.7783f,152.344f, +-78.125f,22.5973f,152.344f, +-74.2188f,21.8359f,152.344f, +-70.3125f,21.4903f,152.344f, +-66.4063f,21.0461f,152.344f, +-62.5f,19.9934f,152.344f, +-58.5938f,19.4729f,152.344f, +-54.6875f,18.1265f,152.344f, +-50.7813f,16.4684f,152.344f, +-46.875f,15.0104f,152.344f, +-42.9688f,13.8642f,152.344f, +-39.0625f,14.8875f,152.344f, +-35.1563f,15.117f,152.344f, +-31.25f,15.0707f,152.344f, +-27.3438f,15.3829f,152.344f, +-23.4375f,15.5218f,152.344f, +-19.5313f,15.215f,152.344f, +-15.625f,15.2099f,152.344f, +-11.7188f,15.5383f,152.344f, +-7.8125f,15.6462f,152.344f, +-3.90625f,15.3096f,152.344f, +0.0f,16.3854f,152.344f, +3.90625f,17.6952f,152.344f, +-250.0f,5.17712f,148.438f, +-246.094f,4.67214f,148.438f, +-242.188f,4.31659f,148.438f, +-238.281f,3.2191f,148.438f, +-234.375f,2.13365f,148.438f, +-230.469f,1.19555f,148.438f, +-226.563f,0.110638f,148.438f, +-222.656f,0.945025f,148.438f, +-218.75f,1.43378f,148.438f, +-214.844f,2.06915f,148.438f, +-210.938f,2.27715f,148.438f, +-207.031f,2.23051f,148.438f, +-203.125f,2.64045f,148.438f, +-199.219f,2.99575f,148.438f, +-195.313f,5.40402f,148.438f, +-191.406f,8.03643f,148.438f, +-187.5f,10.0212f,148.438f, +-183.594f,12.2205f,148.438f, +-179.688f,14.1884f,148.438f, +-175.781f,14.5505f,148.438f, +-171.875f,15.188f,148.438f, +-167.969f,15.2222f,148.438f, +-164.063f,17.4791f,148.438f, +-160.156f,19.6158f,148.438f, +-156.25f,20.2107f,148.438f, +-152.344f,20.552f,148.438f, +-148.438f,20.2463f,148.438f, +-144.531f,20.4526f,148.438f, +-140.625f,20.9426f,148.438f, +-136.719f,22.6331f,148.438f, +-132.813f,25.1345f,148.438f, +-128.906f,27.0299f,148.438f, +-125.0f,29.381f,148.438f, +-121.094f,31.0494f,148.438f, +-117.188f,31.7246f,148.438f, +-113.281f,31.9331f,148.438f, +-109.375f,31.9517f,148.438f, +-105.469f,32.217f,148.438f, +-101.563f,31.9001f,148.438f, +-97.6563f,30.471f,148.438f, +-93.75f,28.6143f,148.438f, +-89.8438f,26.5696f,148.438f, +-85.9375f,24.7785f,148.438f, +-82.0313f,23.3248f,148.438f, +-78.125f,22.2737f,148.438f, +-74.2188f,22.0395f,148.438f, +-70.3125f,21.4879f,148.438f, +-66.4063f,20.5539f,148.438f, +-62.5f,19.3981f,148.438f, +-58.5938f,18.0902f,148.438f, +-54.6875f,16.6154f,148.438f, +-50.7813f,15.8338f,148.438f, +-46.875f,14.0809f,148.438f, +-42.9688f,12.8188f,148.438f, +-39.0625f,14.0819f,148.438f, +-35.1563f,14.3673f,148.438f, +-31.25f,14.2973f,148.438f, +-27.3438f,15.1616f,148.438f, +-23.4375f,13.9458f,148.438f, +-19.5313f,14.9412f,148.438f, +-15.625f,15.4488f,148.438f, +-11.7188f,15.3397f,148.438f, +-7.8125f,15.0356f,148.438f, +-3.90625f,15.6431f,148.438f, +0.0f,16.6218f,148.438f, +3.90625f,18.4109f,148.438f, +-250.0f,5.38918f,144.531f, +-246.094f,4.29322f,144.531f, +-242.188f,2.99843f,144.531f, +-238.281f,2.80561f,144.531f, +-234.375f,1.65282f,144.531f, +-230.469f,-0.268879f,144.531f, +-226.563f,-0.474469f,144.531f, +-222.656f,-0.0607398f,144.531f, +-218.75f,0.859532f,144.531f, +-214.844f,1.28455f,144.531f, +-210.938f,1.69755f,144.531f, +-207.031f,2.1277f,144.531f, +-203.125f,2.92014f,144.531f, +-199.219f,3.85473f,144.531f, +-195.313f,4.38999f,144.531f, +-191.406f,6.72101f,144.531f, +-187.5f,9.24433f,144.531f, +-183.594f,11.6027f,144.531f, +-179.688f,13.2042f,144.531f, +-175.781f,14.6647f,144.531f, +-171.875f,14.7252f,144.531f, +-167.969f,16.1425f,144.531f, +-164.063f,18.1823f,144.531f, +-160.156f,19.9802f,144.531f, +-156.25f,22.2009f,144.531f, +-152.344f,21.9313f,144.531f, +-148.438f,22.3421f,144.531f, +-144.531f,21.6393f,144.531f, +-140.625f,23.0621f,144.531f, +-136.719f,24.695f,144.531f, +-132.813f,26.6159f,144.531f, +-128.906f,29.9912f,144.531f, +-125.0f,31.6471f,144.531f, +-121.094f,32.4919f,144.531f, +-117.188f,32.9775f,144.531f, +-113.281f,33.1587f,144.531f, +-109.375f,33.0247f,144.531f, +-105.469f,32.4654f,144.531f, +-101.563f,31.5009f,144.531f, +-97.6563f,30.2211f,144.531f, +-93.75f,28.3655f,144.531f, +-89.8438f,26.6696f,144.531f, +-85.9375f,25.6101f,144.531f, +-82.0313f,23.5563f,144.531f, +-78.125f,21.8779f,144.531f, +-74.2188f,21.4789f,144.531f, +-70.3125f,21.2134f,144.531f, +-66.4063f,20.0494f,144.531f, +-62.5f,19.4674f,144.531f, +-58.5938f,17.3288f,144.531f, +-54.6875f,16.7337f,144.531f, +-50.7813f,15.9259f,144.531f, +-46.875f,14.3007f,144.531f, +-42.9688f,13.3631f,144.531f, +-39.0625f,12.7904f,144.531f, +-35.1563f,13.6627f,144.531f, +-31.25f,13.6872f,144.531f, +-27.3438f,14.0818f,144.531f, +-23.4375f,13.953f,144.531f, +-19.5313f,14.0386f,144.531f, +-15.625f,14.1249f,144.531f, +-11.7188f,14.1069f,144.531f, +-7.8125f,14.4968f,144.531f, +-3.90625f,15.4283f,144.531f, +0.0f,16.5593f,144.531f, +3.90625f,17.8758f,144.531f, +-250.0f,5.32443f,140.625f, +-246.094f,4.53202f,140.625f, +-242.188f,2.85351f,140.625f, +-238.281f,1.48443f,140.625f, +-234.375f,0.193579f,140.625f, +-230.469f,-0.0240196f,140.625f, +-226.563f,-0.195521f,140.625f, +-222.656f,-0.525286f,140.625f, +-218.75f,0.255241f,140.625f, +-214.844f,0.505993f,140.625f, +-210.938f,1.2501f,140.625f, +-207.031f,2.77282f,140.625f, +-203.125f,3.23678f,140.625f, +-199.219f,3.81665f,140.625f, +-195.313f,4.45749f,140.625f, +-191.406f,6.57237f,140.625f, +-187.5f,8.78049f,140.625f, +-183.594f,10.653f,140.625f, +-179.688f,12.1762f,140.625f, +-175.781f,13.836f,140.625f, +-171.875f,14.4421f,140.625f, +-167.969f,16.2272f,140.625f, +-164.063f,17.8194f,140.625f, +-160.156f,20.3268f,140.625f, +-156.25f,21.6942f,140.625f, +-152.344f,21.8506f,140.625f, +-148.438f,22.857f,140.625f, +-144.531f,23.0189f,140.625f, +-140.625f,24.7041f,140.625f, +-136.719f,26.468f,140.625f, +-132.813f,28.6459f,140.625f, +-128.906f,30.9708f,140.625f, +-125.0f,33.2917f,140.625f, +-121.094f,34.9879f,140.625f, +-117.188f,34.5936f,140.625f, +-113.281f,34.2431f,140.625f, +-109.375f,33.7219f,140.625f, +-105.469f,32.9679f,140.625f, +-101.563f,31.3296f,140.625f, +-97.6563f,30.0001f,140.625f, +-93.75f,28.0182f,140.625f, +-89.8438f,26.2542f,140.625f, +-85.9375f,24.9632f,140.625f, +-82.0313f,23.5598f,140.625f, +-78.125f,21.3613f,140.625f, +-74.2188f,20.8425f,140.625f, +-70.3125f,20.6976f,140.625f, +-66.4063f,19.4459f,140.625f, +-62.5f,17.9969f,140.625f, +-58.5938f,17.2754f,140.625f, +-54.6875f,16.763f,140.625f, +-50.7813f,15.8668f,140.625f, +-46.875f,15.2278f,140.625f, +-42.9688f,14.0988f,140.625f, +-39.0625f,13.4132f,140.625f, +-35.1563f,12.9004f,140.625f, +-31.25f,12.6267f,140.625f, +-27.3438f,12.7032f,140.625f, +-23.4375f,12.0508f,140.625f, +-19.5313f,12.8332f,140.625f, +-15.625f,12.2269f,140.625f, +-11.7188f,12.2256f,140.625f, +-7.8125f,13.9086f,140.625f, +-3.90625f,15.559f,140.625f, +0.0f,16.8086f,140.625f, +3.90625f,18.5798f,140.625f, +-250.0f,4.69677f,136.719f, +-246.094f,3.45683f,136.719f, +-242.188f,1.81964f,136.719f, +-238.281f,1.13059f,136.719f, +-234.375f,0.535221f,136.719f, +-230.469f,0.868904f,136.719f, +-226.563f,0.574251f,136.719f, +-222.656f,0.279368f,136.719f, +-218.75f,-1.1876f,136.719f, +-214.844f,-0.688708f,136.719f, +-210.938f,0.470686f,136.719f, +-207.031f,2.00488f,136.719f, +-203.125f,3.42644f,136.719f, +-199.219f,4.20503f,136.719f, +-195.313f,5.23588f,136.719f, +-191.406f,6.02424f,136.719f, +-187.5f,7.96541f,136.719f, +-183.594f,10.5299f,136.719f, +-179.688f,12.0941f,136.719f, +-175.781f,13.5058f,136.719f, +-171.875f,14.8816f,136.719f, +-167.969f,16.551f,136.719f, +-164.063f,17.712f,136.719f, +-160.156f,19.6536f,136.719f, +-156.25f,21.4322f,136.719f, +-152.344f,22.672f,136.719f, +-148.438f,23.3463f,136.719f, +-144.531f,24.5334f,136.719f, +-140.625f,26.061f,136.719f, +-136.719f,27.7423f,136.719f, +-132.813f,30.1692f,136.719f, +-128.906f,33.3739f,136.719f, +-125.0f,34.9742f,136.719f, +-121.094f,35.9387f,136.719f, +-117.188f,36.0925f,136.719f, +-113.281f,35.6549f,136.719f, +-109.375f,34.5646f,136.719f, +-105.469f,34.6062f,136.719f, +-101.563f,32.8375f,136.719f, +-97.6563f,30.2678f,136.719f, +-93.75f,27.2213f,136.719f, +-89.8438f,26.1126f,136.719f, +-85.9375f,24.9965f,136.719f, +-82.0313f,22.5841f,136.719f, +-78.125f,21.7213f,136.719f, +-74.2188f,21.534f,136.719f, +-70.3125f,20.5652f,136.719f, +-66.4063f,19.032f,136.719f, +-62.5f,17.4252f,136.719f, +-58.5938f,16.7783f,136.719f, +-54.6875f,15.9619f,136.719f, +-50.7813f,14.8707f,136.719f, +-46.875f,14.3143f,136.719f, +-42.9688f,13.8793f,136.719f, +-39.0625f,12.6352f,136.719f, +-35.1563f,12.0433f,136.719f, +-31.25f,11.8551f,136.719f, +-27.3438f,12.0193f,136.719f, +-23.4375f,11.2795f,136.719f, +-19.5313f,11.6002f,136.719f, +-15.625f,10.9143f,136.719f, +-11.7188f,12.1473f,136.719f, +-7.8125f,14.3093f,136.719f, +-3.90625f,16.245f,136.719f, +0.0f,17.3141f,136.719f, +3.90625f,19.7224f,136.719f, +-250.0f,3.94613f,132.813f, +-246.094f,2.33247f,132.813f, +-242.188f,1.96569f,132.813f, +-238.281f,1.1741f,132.813f, +-234.375f,0.606142f,132.813f, +-230.469f,0.00901447f,132.813f, +-226.563f,0.143339f,132.813f, +-222.656f,-0.356031f,132.813f, +-218.75f,-1.55439f,132.813f, +-214.844f,-1.22801f,132.813f, +-210.938f,-0.390443f,132.813f, +-207.031f,1.15349f,132.813f, +-203.125f,2.6275f,132.813f, +-199.219f,3.55895f,132.813f, +-195.313f,4.99281f,132.813f, +-191.406f,4.99673f,132.813f, +-187.5f,6.96468f,132.813f, +-183.594f,10.0691f,132.813f, +-179.688f,12.3783f,132.813f, +-175.781f,13.2459f,132.813f, +-171.875f,14.3637f,132.813f, +-167.969f,16.3222f,132.813f, +-164.063f,17.6984f,132.813f, +-160.156f,19.3295f,132.813f, +-156.25f,20.9768f,132.813f, +-152.344f,23.1452f,132.813f, +-148.438f,23.885f,132.813f, +-144.531f,24.7169f,132.813f, +-140.625f,27.1655f,132.813f, +-136.719f,29.0232f,132.813f, +-132.813f,30.2573f,132.813f, +-128.906f,33.5563f,132.813f, +-125.0f,35.1858f,132.813f, +-121.094f,36.4332f,132.813f, +-117.188f,36.6359f,132.813f, +-113.281f,36.0253f,132.813f, +-109.375f,34.7127f,132.813f, +-105.469f,34.6833f,132.813f, +-101.563f,33.7208f,132.813f, +-97.6563f,30.9809f,132.813f, +-93.75f,27.9091f,132.813f, +-89.8438f,25.709f,132.813f, +-85.9375f,24.452f,132.813f, +-82.0313f,22.4897f,132.813f, +-78.125f,22.0485f,132.813f, +-74.2188f,22.1517f,132.813f, +-70.3125f,20.4874f,132.813f, +-66.4063f,19.0482f,132.813f, +-62.5f,17.1019f,132.813f, +-58.5938f,16.7815f,132.813f, +-54.6875f,15.1253f,132.813f, +-50.7813f,14.5074f,132.813f, +-46.875f,12.7631f,132.813f, +-42.9688f,12.6595f,132.813f, +-39.0625f,11.9406f,132.813f, +-35.1563f,11.7459f,132.813f, +-31.25f,10.8406f,132.813f, +-27.3438f,11.0393f,132.813f, +-23.4375f,10.4798f,132.813f, +-19.5313f,10.8165f,132.813f, +-15.625f,12.4368f,132.813f, +-11.7188f,13.2405f,132.813f, +-7.8125f,14.9282f,132.813f, +-3.90625f,16.4449f,132.813f, +0.0f,17.8238f,132.813f, +3.90625f,19.9574f,132.813f, +-250.0f,2.5744f,128.906f, +-246.094f,2.12474f,128.906f, +-242.188f,0.674823f,128.906f, +-238.281f,-0.305135f,128.906f, +-234.375f,-0.948647f,128.906f, +-230.469f,-0.982836f,128.906f, +-226.563f,-1.17369f,128.906f, +-222.656f,-1.48697f,128.906f, +-218.75f,-2.23137f,128.906f, +-214.844f,-2.13825f,128.906f, +-210.938f,-1.06826f,128.906f, +-207.031f,0.0666403f,128.906f, +-203.125f,1.15717f,128.906f, +-199.219f,3.14762f,128.906f, +-195.313f,4.08858f,128.906f, +-191.406f,5.07728f,128.906f, +-187.5f,8.06699f,128.906f, +-183.594f,10.7473f,128.906f, +-179.688f,12.0801f,128.906f, +-175.781f,13.1617f,128.906f, +-171.875f,14.5283f,128.906f, +-167.969f,15.8148f,128.906f, +-164.063f,16.9067f,128.906f, +-160.156f,18.6293f,128.906f, +-156.25f,20.8869f,128.906f, +-152.344f,22.6168f,128.906f, +-148.438f,23.9359f,128.906f, +-144.531f,26.521f,128.906f, +-140.625f,27.4381f,128.906f, +-136.719f,29.5698f,128.906f, +-132.813f,30.681f,128.906f, +-128.906f,33.28f,128.906f, +-125.0f,35.3433f,128.906f, +-121.094f,36.3509f,128.906f, +-117.188f,36.2098f,128.906f, +-113.281f,35.157f,128.906f, +-109.375f,35.3884f,128.906f, +-105.469f,35.7158f,128.906f, +-101.563f,34.3449f,128.906f, +-97.6563f,32.5198f,128.906f, +-93.75f,29.0611f,128.906f, +-89.8438f,25.9945f,128.906f, +-85.9375f,24.2624f,128.906f, +-82.0313f,23.0248f,128.906f, +-78.125f,21.6012f,128.906f, +-74.2188f,21.0399f,128.906f, +-70.3125f,20.1719f,128.906f, +-66.4063f,18.6862f,128.906f, +-62.5f,17.3287f,128.906f, +-58.5938f,16.0916f,128.906f, +-54.6875f,14.1153f,128.906f, +-50.7813f,12.6292f,128.906f, +-46.875f,12.0431f,128.906f, +-42.9688f,11.4785f,128.906f, +-39.0625f,11.911f,128.906f, +-35.1563f,11.6609f,128.906f, +-31.25f,10.4332f,128.906f, +-27.3438f,9.68026f,128.906f, +-23.4375f,9.84506f,128.906f, +-19.5313f,11.6097f,128.906f, +-15.625f,13.2944f,128.906f, +-11.7188f,14.0518f,128.906f, +-7.8125f,15.2998f,128.906f, +-3.90625f,16.8731f,128.906f, +0.0f,18.0594f,128.906f, +3.90625f,20.0876f,128.906f, +-250.0f,2.47782f,125.0f, +-246.094f,1.27263f,125.0f, +-242.188f,-0.535855f,125.0f, +-238.281f,-1.33089f,125.0f, +-234.375f,-1.63273f,125.0f, +-230.469f,-2.30607f,125.0f, +-226.563f,-2.13647f,125.0f, +-222.656f,-2.95807f,125.0f, +-218.75f,-2.92133f,125.0f, +-214.844f,-3.33811f,125.0f, +-210.938f,-2.29807f,125.0f, +-207.031f,-0.860766f,125.0f, +-203.125f,0.507027f,125.0f, +-199.219f,1.54044f,125.0f, +-195.313f,3.32139f,125.0f, +-191.406f,5.76593f,125.0f, +-187.5f,8.17548f,125.0f, +-183.594f,10.5223f,125.0f, +-179.688f,11.4741f,125.0f, +-175.781f,12.3545f,125.0f, +-171.875f,13.5542f,125.0f, +-167.969f,14.4358f,125.0f, +-164.063f,16.6197f,125.0f, +-160.156f,18.7561f,125.0f, +-156.25f,21.2618f,125.0f, +-152.344f,22.9541f,125.0f, +-148.438f,24.7574f,125.0f, +-144.531f,26.8375f,125.0f, +-140.625f,28.3307f,125.0f, +-136.719f,29.2598f,125.0f, +-132.813f,31.2334f,125.0f, +-128.906f,32.9236f,125.0f, +-125.0f,34.4853f,125.0f, +-121.094f,35.1589f,125.0f, +-117.188f,34.4655f,125.0f, +-113.281f,35.7692f,125.0f, +-109.375f,35.9985f,125.0f, +-105.469f,35.7974f,125.0f, +-101.563f,34.6099f,125.0f, +-97.6563f,32.4066f,125.0f, +-93.75f,28.8398f,125.0f, +-89.8438f,26.014f,125.0f, +-85.9375f,25.0319f,125.0f, +-82.0313f,23.7685f,125.0f, +-78.125f,22.4099f,125.0f, +-74.2188f,20.9166f,125.0f, +-70.3125f,19.1502f,125.0f, +-66.4063f,17.8355f,125.0f, +-62.5f,16.5146f,125.0f, +-58.5938f,14.9189f,125.0f, +-54.6875f,13.2423f,125.0f, +-50.7813f,12.2568f,125.0f, +-46.875f,11.4853f,125.0f, +-42.9688f,10.7795f,125.0f, +-39.0625f,10.3251f,125.0f, +-35.1563f,10.4077f,125.0f, +-31.25f,9.96202f,125.0f, +-27.3438f,9.77658f,125.0f, +-23.4375f,10.6703f,125.0f, +-19.5313f,12.2058f,125.0f, +-15.625f,13.8385f,125.0f, +-11.7188f,15.1556f,125.0f, +-7.8125f,15.7626f,125.0f, +-3.90625f,16.911f,125.0f, +0.0f,18.0803f,125.0f, +3.90625f,18.9654f,125.0f, +-250.0f,1.97449f,121.094f, +-246.094f,1.28169f,121.094f, +-242.188f,0.0699786f,121.094f, +-238.281f,-1.31551f,121.094f, +-234.375f,-2.33115f,121.094f, +-230.469f,-3.19445f,121.094f, +-226.563f,-3.91693f,121.094f, +-222.656f,-4.0298f,121.094f, +-218.75f,-4.334f,121.094f, +-214.844f,-3.5405f,121.094f, +-210.938f,-2.70043f,121.094f, +-207.031f,-2.86125f,121.094f, +-203.125f,-1.24727f,121.094f, +-199.219f,0.20797f,121.094f, +-195.313f,2.52573f,121.094f, +-191.406f,4.8544f,121.094f, +-187.5f,7.37504f,121.094f, +-183.594f,9.40828f,121.094f, +-179.688f,11.0747f,121.094f, +-175.781f,11.9892f,121.094f, +-171.875f,12.3358f,121.094f, +-167.969f,13.2084f,121.094f, +-164.063f,15.8626f,121.094f, +-160.156f,18.1098f,121.094f, +-156.25f,20.2905f,121.094f, +-152.344f,22.8183f,121.094f, +-148.438f,25.3439f,121.094f, +-144.531f,26.7908f,121.094f, +-140.625f,29.0959f,121.094f, +-136.719f,29.9478f,121.094f, +-132.813f,30.8054f,121.094f, +-128.906f,31.9545f,121.094f, +-125.0f,33.8025f,121.094f, +-121.094f,35.2826f,121.094f, +-117.188f,36.2373f,121.094f, +-113.281f,36.7861f,121.094f, +-109.375f,36.509f,121.094f, +-105.469f,35.7461f,121.094f, +-101.563f,33.7802f,121.094f, +-97.6563f,30.788f,121.094f, +-93.75f,28.1422f,121.094f, +-89.8438f,26.6316f,121.094f, +-85.9375f,26.0349f,121.094f, +-82.0313f,24.8022f,121.094f, +-78.125f,23.5217f,121.094f, +-74.2188f,21.74f,121.094f, +-70.3125f,20.0101f,121.094f, +-66.4063f,17.8705f,121.094f, +-62.5f,15.6785f,121.094f, +-58.5938f,13.74f,121.094f, +-54.6875f,12.3387f,121.094f, +-50.7813f,11.9457f,121.094f, +-46.875f,12.0102f,121.094f, +-42.9688f,11.0065f,121.094f, +-39.0625f,9.84571f,121.094f, +-35.1563f,10.0894f,121.094f, +-31.25f,10.5366f,121.094f, +-27.3438f,9.94957f,121.094f, +-23.4375f,11.0038f,121.094f, +-19.5313f,12.8084f,121.094f, +-15.625f,13.8969f,121.094f, +-11.7188f,14.9146f,121.094f, +-7.8125f,15.4187f,121.094f, +-3.90625f,16.094f,121.094f, +0.0f,17.0612f,121.094f, +3.90625f,18.5327f,121.094f, +-250.0f,2.18397f,117.188f, +-246.094f,1.51628f,117.188f, +-242.188f,0.628327f,117.188f, +-238.281f,-0.567933f,117.188f, +-234.375f,-2.01568f,117.188f, +-230.469f,-3.41089f,117.188f, +-226.563f,-3.82758f,117.188f, +-222.656f,-5.01586f,117.188f, +-218.75f,-4.74822f,117.188f, +-214.844f,-3.30853f,117.188f, +-210.938f,-2.32499f,117.188f, +-207.031f,-1.71509f,117.188f, +-203.125f,-1.19203f,117.188f, +-199.219f,0.219498f,117.188f, +-195.313f,1.66304f,117.188f, +-191.406f,4.35105f,117.188f, +-187.5f,6.33228f,117.188f, +-183.594f,8.00972f,117.188f, +-179.688f,9.71486f,117.188f, +-175.781f,10.7727f,117.188f, +-171.875f,11.358f,117.188f, +-167.969f,12.5239f,117.188f, +-164.063f,14.6278f,117.188f, +-160.156f,17.2069f,117.188f, +-156.25f,19.9779f,117.188f, +-152.344f,23.4607f,117.188f, +-148.438f,26.6108f,117.188f, +-144.531f,28.4635f,117.188f, +-140.625f,29.7705f,117.188f, +-136.719f,31.0684f,117.188f, +-132.813f,31.8395f,117.188f, +-128.906f,32.1658f,117.188f, +-125.0f,34.7478f,117.188f, +-121.094f,36.0624f,117.188f, +-117.188f,37.2702f,117.188f, +-113.281f,37.3474f,117.188f, +-109.375f,37.242f,117.188f, +-105.469f,36.1544f,117.188f, +-101.563f,33.403f,117.188f, +-97.6563f,31.294f,117.188f, +-93.75f,29.4961f,117.188f, +-89.8438f,29.0556f,117.188f, +-85.9375f,28.2757f,117.188f, +-82.0313f,26.6322f,117.188f, +-78.125f,24.8286f,117.188f, +-74.2188f,22.7019f,117.188f, +-70.3125f,20.4725f,117.188f, +-66.4063f,17.984f,117.188f, +-62.5f,16.3033f,117.188f, +-58.5938f,14.2087f,117.188f, +-54.6875f,12.8086f,117.188f, +-50.7813f,12.5463f,117.188f, +-46.875f,12.1781f,117.188f, +-42.9688f,11.1391f,117.188f, +-39.0625f,10.4623f,117.188f, +-35.1563f,11.0528f,117.188f, +-31.25f,11.454f,117.188f, +-27.3438f,10.5577f,117.188f, +-23.4375f,10.6328f,117.188f, +-19.5313f,12.5569f,117.188f, +-15.625f,13.5389f,117.188f, +-11.7188f,14.3792f,117.188f, +-7.8125f,15.4809f,117.188f, +-3.90625f,16.1008f,117.188f, +0.0f,17.3675f,117.188f, +3.90625f,18.919f,117.188f, +}; + +btScalar Landscape06Nml[] = { +-0.373915f,0.891474f,-0.255855f, +-0.31015f,0.793525f,-0.52357f, +-0.450332f,0.86393f,-0.225447f, +-0.404472f,0.777981f,-0.480778f, +-0.557629f,0.811458f,-0.174885f, +-0.428564f,0.86234f,-0.269633f, +-0.414608f,0.909847f,-0.0166634f, +-0.208047f,0.971233f,0.115854f, +-0.328757f,0.932331f,0.150588f, +-0.263029f,0.937991f,0.225808f, +-0.409412f,0.900937f,0.143853f, +-0.455309f,0.881347f,0.126178f, +-0.31951f,0.943247f,0.0905511f, +-0.33825f,0.934582f,0.1102f, +-0.183669f,0.981438f,0.0551769f, +-0.208308f,0.97293f,0.100072f, +-0.189578f,0.981862f,-0.00282566f, +-0.201983f,0.97649f,0.0752952f, +-0.0672914f,0.99749f,-0.0220572f, +-0.118523f,0.991949f,0.0446084f, +0.102757f,0.986595f,-0.126773f, +0.00122687f,0.992675f,-0.120808f, +0.0798054f,0.967751f,-0.238933f, +0.00875196f,0.978629f,-0.205448f, +0.141554f,0.932155f,-0.333242f, +0.0918343f,0.965319f,-0.244387f, +0.372959f,0.842559f,-0.388582f, +0.280191f,0.875069f,-0.394647f, +0.314921f,0.849656f,-0.422977f, +0.258676f,0.813335f,-0.521127f, +0.266443f,0.876708f,-0.400489f, +0.358307f,0.856764f,-0.370907f, +0.280512f,0.913716f,-0.293999f, +0.337561f,0.857178f,-0.388971f, +0.0927666f,0.994197f,-0.0544758f, +0.155544f,0.953116f,-0.259567f, +-0.18671f,0.979157f,-0.0799463f, +-0.20939f,0.930283f,-0.301212f, +-0.117108f,0.986639f,-0.113269f, +-0.190516f,0.897405f,-0.397956f, +-0.0703231f,0.977433f,-0.199199f, +-0.142735f,0.82748f,-0.54305f, +-0.00706444f,0.969596f,-0.244609f, +0.0216131f,0.85384f,-0.520087f, +-0.100606f,0.961424f,-0.256011f, +0.00977565f,0.925054f,-0.379709f, +-0.0412166f,0.978641f,-0.201403f, +0.099113f,0.987693f,-0.12099f, +0.0911178f,0.982669f,-0.16143f, +0.0730708f,0.986329f,-0.147703f, +0.114859f,0.978874f,-0.169152f, +0.109302f,0.983788f,-0.142175f, +0.116167f,0.976713f,-0.180378f, +0.0784892f,0.966143f,-0.24578f, +0.0196949f,0.987682f,-0.155232f, +0.0258077f,0.978923f,-0.202593f, +-0.0161862f,0.979217f,-0.202168f, +-0.120896f,0.935381f,-0.332336f, +-0.0291128f,0.941335f,-0.336215f, +-0.0776893f,0.901631f,-0.425472f, +-0.0768763f,0.919716f,-0.384983f, +-0.0462705f,0.951989f,-0.302615f, +-0.0260847f,0.891121f,-0.453016f, +-0.0818404f,0.911776f,-0.40245f, +0.152271f,0.86407f,-0.479789f, +0.0880729f,0.874485f,-0.476991f, +0.11644f,0.855496f,-0.504548f, +0.0395982f,0.813262f,-0.580548f, +0.00631598f,0.857568f,-0.514332f, +-0.0780909f,0.759651f,-0.645626f, +-0.0538158f,0.822232f,-0.566603f, +0.0102932f,0.785194f,-0.619165f, +-0.00905015f,0.879608f,-0.475613f, +0.0439442f,0.825793f,-0.562259f, +-0.15058f,0.877556f,-0.455216f, +-0.0080088f,0.902753f,-0.430085f, +-0.112334f,0.946952f,-0.301104f, +0.00843129f,0.966084f,-0.258092f, +-0.0520095f,0.981628f,-0.183579f, +-0.0023169f,0.970009f,-0.243057f, +-0.0302799f,0.995335f,-0.0916051f, +0.0376961f,0.991328f,-0.125888f, +0.0852061f,0.995425f,-0.0432221f, +0.156966f,0.986644f,0.0435404f, +0.21491f,0.973384f,-0.079613f, +0.060548f,0.977921f,-0.200013f, +0.158822f,0.967125f,-0.198606f, +0.134591f,0.957423f,-0.255396f, +0.121293f,0.978974f,-0.164008f, +0.108432f,0.947609f,-0.300465f, +0.0857608f,0.988377f,-0.125519f, +0.0956294f,0.951748f,-0.291599f, +-0.0286686f,0.995404f,-0.0913747f, +0.0793846f,0.975448f,-0.205424f, +0.106071f,0.990697f,0.085251f, +0.292453f,0.941038f,0.170056f, +0.371746f,0.914213f,0.161306f, +0.341006f,0.933768f,0.108596f, +0.372402f,0.920827f,0.115737f, +0.298439f,0.950662f,-0.0847083f, +0.211549f,0.974139f,0.0793788f, +0.255698f,0.96634f,-0.0283838f, +-0.0706076f,0.991212f,0.111867f, +0.0490836f,0.977096f,0.207063f, +-0.256838f,0.950876f,0.172827f, +-0.168627f,0.937168f,0.30542f, +-0.0642391f,0.963856f,0.258562f, +-0.00196823f,0.905532f,0.424274f, +0.182795f,0.945782f,0.268481f, +0.13515f,0.919671f,0.368699f, +0.107184f,0.970151f,0.217528f, +0.00985613f,0.977921f,0.208742f, +0.0734564f,0.98632f,0.147572f, +0.067487f,0.972043f,0.224896f, +0.20672f,0.968081f,0.141727f, +0.186648f,0.970679f,0.151478f, +0.213561f,0.965286f,0.150383f, +0.189498f,0.980689f,0.0483704f, +0.277013f,0.94213f,0.188824f, +0.316429f,0.927757f,0.197839f, +0.225121f,0.964838f,0.135677f, +0.124434f,0.992109f,0.0153398f, +0.14416f,0.987262f,0.0673169f, +0.128154f,0.991727f,-0.0073791f, +0.1809f,0.982671f,0.0404037f, +0.125271f,0.99083f,-0.0506329f, +0.117639f,0.992303f,-0.0386759f, +0.0449726f,0.973305f,-0.225068f, +0.124809f,0.992058f,0.0156083f, +0.127135f,0.958258f,-0.256082f, +0.171896f,0.982167f,0.0761593f, +0.160304f,0.951991f,-0.260798f, +-0.494953f,0.868907f,-0.00477061f, +-0.512017f,0.856533f,0.0647248f, +-0.564588f,0.823588f,0.0542513f, +-0.480746f,0.876502f,0.0250513f, +-0.397786f,0.91419f,0.0776024f, +-0.3922f,0.916181f,0.0824136f, +-0.288362f,0.955571f,0.0610852f, +-0.109541f,0.991807f,0.0657195f, +-0.119597f,0.99188f,-0.0432477f, +-0.0246849f,0.992746f,-0.117673f, +0.197846f,0.964215f,-0.176481f, +0.198977f,0.940868f,-0.274182f, +0.288209f,0.884317f,-0.367314f, +0.309487f,0.847917f,-0.430411f, +0.274335f,0.939851f,-0.20352f, +0.256503f,0.958634f,-0.123399f, +0.0454718f,0.993939f,-0.100084f, +-0.104233f,0.980418f,0.167081f, +-0.137204f,0.957647f,0.253153f, +-0.0909923f,0.97094f,0.221352f, +-0.0588081f,0.977218f,0.203928f, +0.0555628f,0.971956f,0.228506f, +0.00693538f,0.995197f,0.0976442f, +0.0112691f,0.996103f,-0.0874744f, +0.104487f,0.972486f,-0.208215f, +0.102504f,0.971128f,-0.215412f, +0.0933319f,0.976682f,-0.193342f, +0.023135f,0.974909f,-0.221399f, +0.0195254f,0.964185f,-0.264511f, +0.0843961f,0.966003f,-0.244368f, +0.0791804f,0.94997f,-0.30214f, +0.048562f,0.904645f,-0.423391f, +0.168302f,0.901104f,-0.399607f, +0.0460994f,0.899241f,-0.435018f, +-0.0201301f,0.942734f,-0.332937f, +-0.0651933f,0.964794f,-0.254799f, +-0.107417f,0.971064f,-0.213298f, +-0.17484f,0.97454f,-0.140369f, +-0.26177f,0.957564f,-0.120611f, +-0.18964f,0.980348f,-0.0543506f, +-0.0244255f,0.999511f,-0.0195208f, +0.0943164f,0.983888f,-0.151887f, +0.241216f,0.961222f,-0.133665f, +0.186016f,0.976207f,-0.111437f, +0.0288865f,0.998091f,-0.0545842f, +-0.00269516f,0.997826f,0.0658428f, +-0.0454406f,0.988515f,0.144131f, +0.0349744f,0.994103f,0.102646f, +0.310638f,0.939659f,0.143339f, +0.362637f,0.904005f,0.226428f, +0.268459f,0.940968f,0.206177f, +-0.0101438f,0.990408f,0.137803f, +-0.259956f,0.964753f,0.0409231f, +-0.105214f,0.99436f,0.0133734f, +0.151003f,0.984401f,0.0902917f, +0.153972f,0.971331f,0.181133f, +0.131893f,0.982033f,0.134962f, +0.145326f,0.983866f,0.104346f, +0.172165f,0.970545f,0.16853f, +0.260168f,0.947172f,0.18756f, +0.265906f,0.934787f,0.235514f, +0.175251f,0.956563f,0.232968f, +0.205308f,0.948623f,0.240753f, +0.093567f,0.968565f,0.230493f, +0.000708259f,0.964766f,0.263107f, +0.00657781f,0.964909f,0.262504f, +-0.520396f,0.851586f,0.063156f, +-0.521936f,0.850242f,0.0683468f, +-0.537166f,0.843365f,0.0137284f, +-0.507784f,0.86143f,-0.00972442f, +-0.393238f,0.917684f,0.0567504f, +-0.362634f,0.931285f,-0.0347048f, +-0.298916f,0.951591f,-0.0715749f, +-0.125797f,0.991634f,-0.0289454f, +0.00629701f,0.999979f,0.00117199f, +0.0170902f,0.994718f,-0.101214f, +0.290594f,0.952688f,-0.0891078f, +0.285259f,0.936469f,-0.20409f, +0.342737f,0.918097f,-0.199071f, +0.262981f,0.956466f,-0.126547f, +-0.000199178f,0.996828f,-0.0795833f, +0.16652f,0.978742f,0.119733f, +0.0382843f,0.984413f,0.171653f, +-0.277981f,0.950703f,0.137441f, +-0.18354f,0.954113f,0.236605f, +-0.0382213f,0.967232f,0.251001f, +-0.0471282f,0.983482f,0.174763f, +0.05509f,0.990469f,0.126237f, +0.154415f,0.97865f,0.135647f, +0.187824f,0.979878f,0.0675348f, +0.226039f,0.971999f,-0.0642243f, +0.0780765f,0.982532f,-0.168921f, +0.109774f,0.985685f,-0.127961f, +0.112009f,0.982676f,-0.147653f, +0.0632751f,0.975786f,-0.209375f, +0.0264674f,0.962968f,-0.268312f, +0.10845f,0.959018f,-0.261771f, +0.0643921f,0.961817f,-0.266009f, +0.166593f,0.964859f,-0.203209f, +0.0747121f,0.973608f,-0.215653f, +-0.165051f,0.968419f,-0.186874f, +-0.148108f,0.983106f,-0.10755f, +-0.179372f,0.979451f,-0.0922022f, +-0.237948f,0.970437f,-0.0404116f, +-0.2824f,0.959184f,-0.014723f, +-0.146028f,0.988959f,-0.0252228f, +0.05616f,0.991975f,-0.113275f, +0.196359f,0.969761f,-0.144935f, +0.181455f,0.976082f,-0.119739f, +0.110973f,0.993178f,-0.035804f, +-0.0390828f,0.998775f,0.0303582f, +-0.136356f,0.988616f,0.0636122f, +-0.0521843f,0.980102f,0.191512f, +0.0572854f,0.981374f,0.183367f, +0.238568f,0.946616f,0.216801f, +0.340107f,0.907515f,0.246464f, +0.312043f,0.926088f,0.212108f, +0.0846085f,0.98223f,0.167527f, +-0.163231f,0.986101f,0.0309937f, +-0.143013f,0.98971f,-0.00457425f, +0.0291614f,0.993948f,0.105909f, +0.107232f,0.980268f,0.16606f, +0.13514f,0.977368f,0.162754f, +0.171582f,0.963454f,0.205708f, +0.160805f,0.97344f,0.162963f, +0.206565f,0.959827f,0.189905f, +0.203733f,0.939018f,0.277016f, +0.156541f,0.940477f,0.30166f, +0.14264f,0.938158f,0.315457f, +0.0877292f,0.924317f,0.371405f, +0.0427952f,0.921735f,0.385453f, +0.102307f,0.915297f,0.389569f, +-0.518725f,0.854828f,-0.0138881f, +-0.516652f,0.85588f,0.023226f, +-0.490153f,0.869598f,0.0595683f, +-0.505693f,0.862598f,-0.0140982f, +-0.393758f,0.918824f,-0.0267811f, +-0.308114f,0.951253f,-0.0135724f, +-0.25353f,0.967309f,0.00592796f, +-0.183935f,0.978787f,-0.0902442f, +-0.0335384f,0.998587f,-0.0412272f, +0.0888831f,0.995408f,-0.0355216f, +0.275528f,0.951614f,-0.136073f, +0.317879f,0.941106f,-0.115209f, +0.22556f,0.974028f,-0.0197739f, +0.262726f,0.954534f,0.140851f, +0.0383338f,0.998565f,0.0373963f, +0.0108706f,0.999386f,-0.0333096f, +0.0472758f,0.987524f,0.150202f, +-0.22401f,0.968166f,0.111686f, +-0.221122f,0.974472f,0.0388438f, +-0.0303833f,0.999266f,0.0233175f, +0.0911048f,0.995841f,0.000284795f, +0.0750561f,0.987717f,-0.137044f, +0.140099f,0.985231f,-0.098447f, +0.159287f,0.981153f,-0.10939f, +0.301657f,0.953265f,-0.0169985f, +0.140836f,0.988971f,-0.0458453f, +0.074059f,0.996008f,-0.0498236f, +0.0873182f,0.996023f,-0.0176849f, +0.132872f,0.990946f,0.019257f, +0.15553f,0.982355f,-0.103875f, +0.133638f,0.955183f,-0.264135f, +0.0505536f,0.951293f,-0.304114f, +0.0663471f,0.962897f,-0.261588f, +0.0679148f,0.992885f,-0.0978063f, +-0.186921f,0.976146f,-0.110452f, +-0.16844f,0.980926f,-0.0970201f, +-0.17716f,0.9831f,-0.0461376f, +-0.252028f,0.967676f,-0.00920485f, +-0.25063f,0.967236f,-0.0404965f, +-0.0995772f,0.983353f,-0.151991f, +0.0940064f,0.974734f,-0.202626f, +0.146102f,0.962693f,-0.227766f, +0.10874f,0.966405f,-0.232891f, +-0.0013416f,0.987029f,-0.160533f, +-0.0603915f,0.998129f,0.00954783f, +-0.17946f,0.98293f,0.040526f, +-0.153066f,0.978461f,0.138509f, +0.00546813f,0.977756f,0.209673f, +0.202775f,0.944505f,0.258443f, +0.334531f,0.904949f,0.262976f, +0.339399f,0.898505f,0.278385f, +0.212792f,0.950144f,0.227917f, +-0.0583572f,0.996371f,0.0619671f, +-0.218128f,0.975136f,0.0391184f, +-0.0703437f,0.983861f,0.16453f, +0.113041f,0.961301f,0.25124f, +0.0979771f,0.959037f,0.265798f, +0.151767f,0.929082f,0.337302f, +0.185905f,0.937423f,0.294409f, +0.169611f,0.955662f,0.240713f, +0.159864f,0.96582f,0.204047f, +0.151538f,0.965571f,0.211446f, +0.11661f,0.954852f,0.273241f, +0.0708035f,0.941966f,0.328158f, +-0.00402057f,0.956357f,0.292174f, +0.0123647f,0.956622f,0.291069f, +-0.626234f,0.777268f,-0.0607036f, +-0.590408f,0.806122f,0.0398278f, +-0.512253f,0.84829f,0.134171f, +-0.429387f,0.891471f,0.144588f, +-0.394702f,0.915407f,0.0789917f, +-0.352114f,0.935018f,0.0419128f, +-0.269358f,0.962596f,0.0292454f, +-0.0709514f,0.996127f,0.0519312f, +-0.0485279f,0.996417f,-0.069268f, +0.139101f,0.983953f,-0.111751f, +0.369972f,0.916386f,-0.152833f, +0.200502f,0.96864f,-0.146752f, +0.063154f,0.997971f,0.00814434f, +0.218613f,0.964332f,0.149236f, +0.233367f,0.966768f,0.104401f, +0.00832713f,0.995958f,-0.0894382f, +-0.101235f,0.994608f,-0.0224841f, +-0.188929f,0.980627f,0.051742f, +-0.131276f,0.990999f,0.026226f, +0.0111642f,0.996226f,-0.0860703f, +0.127344f,0.982944f,-0.132683f, +0.133649f,0.978353f,-0.157998f, +0.127047f,0.978674f,-0.161419f, +0.154013f,0.97768f,-0.142902f, +0.207952f,0.974577f,-0.0833996f, +0.130584f,0.99044f,-0.0444555f, +0.0527996f,0.997244f,-0.0521173f, +0.0873033f,0.993919f,-0.0671111f, +0.134372f,0.9813f,-0.137819f, +0.302979f,0.937443f,-0.171475f, +0.235087f,0.922651f,-0.305694f, +0.116878f,0.945593f,-0.303632f, +-0.0892912f,0.947762f,-0.306226f, +-0.0487728f,0.993685f,-0.101049f, +-0.161853f,0.9816f,-0.101314f, +-0.226351f,0.97061f,-0.0817454f, +-0.270044f,0.962691f,-0.0173905f, +-0.294262f,0.954053f,0.0565031f, +-0.151555f,0.985239f,0.0795882f, +0.00297078f,0.999916f,-0.0126498f, +0.158118f,0.985077f,-0.067991f, +0.232676f,0.957923f,-0.168067f, +0.184787f,0.953241f,-0.239135f, +-0.102652f,0.943763f,-0.314284f, +-0.249925f,0.941897f,-0.224429f, +-0.230538f,0.969668f,-0.0812203f, +-0.256878f,0.964046f,-0.0680376f, +-0.0528332f,0.99816f,0.0297627f, +0.16253f,0.979605f,0.118148f, +0.292443f,0.935246f,0.199479f, +0.337448f,0.899957f,0.276054f, +0.288581f,0.911989f,0.291541f, +0.0381605f,0.961598f,0.271797f, +-0.217082f,0.942133f,0.25546f, +-0.187341f,0.947099f,0.26059f, +0.0122725f,0.939216f,0.343107f, +0.0450967f,0.927047f,0.372224f, +0.0805118f,0.921403f,0.380178f, +0.269621f,0.884781f,0.380089f, +0.278457f,0.920235f,0.275007f, +0.240432f,0.950543f,0.19662f, +0.110916f,0.980787f,0.160482f, +0.0190768f,0.974013f,0.225685f, +0.0421661f,0.96323f,0.26535f, +0.0623149f,0.965243f,0.253816f, +0.0484827f,0.970002f,0.238214f, +-0.675447f,0.735679f,-0.050474f, +-0.639324f,0.768795f,-0.0148056f, +-0.556082f,0.830482f,0.0327513f, +-0.42972f,0.893254f,0.132053f, +-0.365389f,0.922739f,0.122653f, +-0.226979f,0.966229f,0.121993f, +-0.221717f,0.973751f,-0.051483f, +-0.0779728f,0.987923f,-0.133899f, +0.0930073f,0.979917f,-0.176386f, +0.192144f,0.942491f,-0.27348f, +0.309496f,0.916222f,-0.254459f, +0.155051f,0.977443f,-0.143405f, +-0.0554135f,0.989739f,-0.131708f, +0.110672f,0.991805f,-0.0638304f, +0.310319f,0.950296f,0.0252996f, +0.103349f,0.993006f,-0.0570824f, +-0.143599f,0.988502f,-0.0473533f, +-0.226116f,0.973312f,-0.0391734f, +-0.100068f,0.994649f,-0.0257001f, +0.124656f,0.989757f,-0.0695779f, +0.137305f,0.97907f,-0.150231f, +0.12072f,0.989818f,-0.075415f, +0.132256f,0.990827f,-0.0277589f, +0.0994133f,0.991446f,-0.0845708f, +0.16457f,0.984921f,-0.0533595f, +0.161357f,0.986289f,-0.034624f, +0.0776395f,0.993281f,-0.0858198f, +0.196429f,0.972629f,-0.124127f, +0.213597f,0.93634f,-0.278645f, +0.333587f,0.906552f,-0.258619f, +0.264447f,0.928271f,-0.261499f, +0.0224352f,0.968338f,-0.248633f, +-0.153007f,0.973949f,-0.167368f, +-0.171971f,0.976037f,-0.133332f, +-0.164739f,0.982172f,-0.0905542f, +-0.256427f,0.965345f,-0.0485236f, +-0.266685f,0.961164f,-0.0710119f, +-0.315314f,0.936338f,-0.154429f, +-0.180509f,0.974939f,-0.130043f, +0.0306802f,0.996715f,-0.0749509f, +0.181216f,0.981966f,-0.0538862f, +0.308423f,0.951239f,-0.0044789f, +0.193412f,0.981099f,-0.00609358f, +-0.00883535f,0.999181f,0.039479f, +-0.293629f,0.95203f,-0.0861418f, +-0.288511f,0.952707f,-0.0954526f, +-0.270635f,0.961763f,-0.0420598f, +-0.176015f,0.982039f,0.0679556f, +0.0472003f,0.981703f,0.184478f, +0.185293f,0.947852f,0.259313f, +0.26012f,0.901797f,0.345109f, +0.219376f,0.887657f,0.404894f, +0.015248f,0.892187f,0.451408f, +-0.212632f,0.887876f,0.407999f, +-0.145904f,0.908525f,0.391529f, +-0.0226457f,0.932703f,0.359933f, +0.0874951f,0.910834f,0.403393f, +0.125007f,0.935932f,0.329249f, +0.288568f,0.918223f,0.271284f, +0.34457f,0.896771f,0.277619f, +0.261558f,0.928634f,0.263108f, +0.0802026f,0.961218f,0.26387f, +0.0163948f,0.952196f,0.305047f, +0.0566148f,0.964684f,0.257253f, +0.102872f,0.970943f,0.216073f, +0.0353576f,0.994079f,0.102749f, +-0.569322f,0.820332f,-0.0541097f, +-0.616679f,0.764093f,-0.18939f, +-0.605157f,0.764062f,-0.223597f, +-0.50856f,0.856476f,-0.0884048f, +-0.372491f,0.927008f,0.0436669f, +-0.225048f,0.969626f,0.0958063f, +-0.0508165f,0.996801f,0.0616925f, +0.0586358f,0.990558f,-0.123919f, +0.126111f,0.966195f,-0.224862f, +0.229194f,0.950926f,-0.207869f, +0.252375f,0.936474f,-0.243564f, +0.0944308f,0.971404f,-0.217846f, +-0.0355117f,0.972557f,-0.229939f, +0.0856503f,0.962722f,-0.256575f, +0.220711f,0.941477f,-0.254769f, +0.0934053f,0.989629f,-0.109133f, +-0.156897f,0.986627f,-0.0441527f, +-0.224564f,0.970579f,-0.0868729f, +-0.0948813f,0.992594f,-0.0758608f, +0.168753f,0.983045f,-0.0717275f, +0.110894f,0.991432f,-0.0690319f, +-0.0147158f,0.998265f,0.0570193f, +0.10964f,0.979883f,0.16676f, +0.213201f,0.96906f,0.124368f, +0.195873f,0.980015f,-0.0346975f, +0.162476f,0.975738f,-0.146751f, +0.136902f,0.9692f,-0.204718f, +0.244929f,0.933568f,-0.26165f, +0.288988f,0.918188f,-0.270954f, +0.254175f,0.924529f,-0.283974f, +0.243695f,0.954587f,-0.171397f, +-0.00175415f,0.99017f,-0.13986f, +-0.165264f,0.975245f,-0.146916f, +-0.185767f,0.967008f,-0.174319f, +-0.191354f,0.972667f,-0.131541f, +-0.271241f,0.952999f,-0.134987f, +-0.1847f,0.972855f,-0.139424f, +-0.209304f,0.957842f,-0.1968f, +-0.243194f,0.936f,-0.254482f, +-0.0210884f,0.983365f,-0.18041f, +0.0761402f,0.989042f,-0.126486f, +0.185372f,0.981538f,0.047127f, +0.117606f,0.973445f,0.196404f, +-0.0453061f,0.954332f,0.295292f, +-0.152267f,0.943756f,0.293495f, +-0.272105f,0.944288f,0.185149f, +-0.341417f,0.929337f,0.140592f, +-0.316477f,0.938022f,0.141266f, +-0.0291064f,0.965694f,0.258045f, +0.139271f,0.938861f,0.31487f, +0.16066f,0.916793f,0.36562f, +0.163005f,0.879828f,0.446466f, +0.088987f,0.884248f,0.458461f, +-0.126118f,0.932849f,0.337472f, +-0.101381f,0.953175f,0.284919f, +-0.0233764f,0.967738f,0.250872f, +0.0600962f,0.965273f,0.254236f, +0.184472f,0.94915f,0.255117f, +0.293565f,0.911429f,0.288301f, +0.309916f,0.89217f,0.328611f, +0.260108f,0.896879f,0.357704f, +0.0945809f,0.935133f,0.341439f, +0.0335311f,0.964748f,0.261032f, +0.0942492f,0.979731f,0.176762f, +0.167685f,0.967918f,0.187127f, +0.258869f,0.942682f,0.210564f, +-0.367443f,0.929937f,-0.0142236f, +-0.499723f,0.853143f,-0.149749f, +-0.60287f,0.768676f,-0.213739f, +-0.628893f,0.759885f,-0.164524f, +-0.498958f,0.866588f,-0.00814533f, +-0.266358f,0.961387f,0.0691948f, +0.0209306f,0.994406f,0.103533f, +0.18825f,0.979809f,0.0673512f, +0.186929f,0.982347f,-0.00722501f, +0.221871f,0.971137f,-0.0875532f, +0.321849f,0.94224f,-0.0927163f, +0.129468f,0.975377f,-0.178544f, +-0.0214597f,0.975387f,-0.219454f, +0.135606f,0.972282f,-0.19047f, +0.166947f,0.968719f,-0.18361f, +-0.0604962f,0.993281f,-0.0986602f, +-0.147333f,0.985679f,-0.0820398f, +-0.177745f,0.972235f,-0.152201f, +-0.13389f,0.979994f,-0.147259f, +0.107621f,0.993068f,-0.0472599f, +0.0496354f,0.9956f,0.0794756f, +-0.114638f,0.990271f,0.0788811f, +0.0386746f,0.994961f,0.0924988f, +0.257639f,0.951075f,0.170521f, +0.371556f,0.918219f,0.137186f, +0.306734f,0.951256f,-0.0320228f, +0.251981f,0.957147f,-0.142743f, +0.259956f,0.937158f,-0.232721f, +0.273432f,0.938847f,-0.209289f, +0.242378f,0.942977f,-0.228139f, +0.135357f,0.967026f,-0.21573f, +-0.0237633f,0.989278f,-0.144096f, +-0.131198f,0.984621f,-0.11536f, +-0.202181f,0.972555f,-0.115152f, +-0.221308f,0.9725f,-0.0725642f, +-0.229514f,0.969023f,-0.0912046f, +-0.218972f,0.967608f,-0.125639f, +-0.212632f,0.976006f,-0.0469096f, +-0.218674f,0.974967f,-0.0402565f, +-0.122558f,0.989962f,-0.0703905f, +0.0166378f,0.999654f,0.0203946f, +-0.0104674f,0.996634f,0.0813074f, +-0.0169459f,0.959611f,0.28082f, +-0.0960206f,0.935549f,0.339894f, +-0.167668f,0.926307f,0.337405f, +-0.198261f,0.909687f,0.364915f, +-0.193335f,0.935754f,0.294935f, +-0.259424f,0.960196f,0.103554f, +-0.126539f,0.989254f,0.073239f, +0.0445245f,0.981975f,0.183692f, +0.070195f,0.9396f,0.334999f, +0.116045f,0.901991f,0.415867f, +0.160437f,0.912696f,0.375828f, +-0.00552585f,0.963507f,0.267627f, +-0.111729f,0.971129f,0.210774f, +0.00935468f,0.964114f,0.265323f, +0.084172f,0.968508f,0.234323f, +0.13752f,0.967988f,0.209968f, +0.208575f,0.947382f,0.242826f, +0.289545f,0.920265f,0.263203f, +0.228797f,0.929214f,0.290195f, +0.185013f,0.916649f,0.354295f, +0.160823f,0.950358f,0.266374f, +0.183734f,0.959776f,0.212302f, +0.0865279f,0.982909f,0.162492f, +0.143782f,0.963199f,0.227098f, +-0.40108f,0.898526f,-0.178287f, +-0.447805f,0.881163f,-0.15173f, +-0.619629f,0.769135f,-0.156501f, +-0.663764f,0.743697f,-0.0795752f, +-0.534645f,0.83883f,-0.102567f, +-0.293541f,0.950588f,-0.101077f, +-0.0154638f,0.998684f,-0.048892f, +0.170364f,0.984269f,-0.0468065f, +0.272586f,0.961403f,-0.0374194f, +0.276742f,0.955139f,-0.105472f, +0.3572f,0.929651f,-0.0903144f, +0.185848f,0.967712f,-0.170277f, +-0.00167559f,0.978573f,-0.205892f, +0.0698456f,0.971595f,-0.226108f, +0.0821889f,0.985623f,-0.147624f, +-0.0376538f,0.998466f,-0.0405822f, +-0.0983702f,0.988409f,-0.115634f, +-0.140633f,0.987279f,-0.0741791f, +-0.185061f,0.981813f,-0.0423742f, +-0.0718387f,0.997236f,0.0189748f, +0.00846681f,0.991398f,0.130611f, +0.00870324f,0.999937f,0.00714861f, +0.043927f,0.984772f,-0.168207f, +0.173423f,0.967972f,-0.181535f, +0.363952f,0.925731f,-0.10277f, +0.415083f,0.906279f,-0.0797799f, +0.295656f,0.934439f,-0.198525f, +0.285411f,0.94244f,-0.174208f, +0.286359f,0.952372f,-0.104818f, +0.274f,0.954057f,-0.121243f, +0.125082f,0.985323f,-0.116157f, +-0.0728358f,0.994219f,-0.0788892f, +-0.183935f,0.981488f,-0.0533801f, +-0.254614f,0.966975f,0.0114848f, +-0.238556f,0.965368f,0.105624f, +-0.207746f,0.971319f,0.115674f, +-0.215469f,0.971204f,0.101667f, +-0.267107f,0.96138f,0.0663435f, +-0.207576f,0.97646f,0.0586408f, +-0.117358f,0.991748f,0.0516096f, +-0.0500459f,0.994852f,0.0881198f, +-0.093813f,0.986665f,0.133006f, +-0.152698f,0.969858f,0.18989f, +-0.1251f,0.953778f,0.273236f, +-0.165614f,0.925222f,0.341373f, +-0.185498f,0.929562f,0.3186f, +-0.115032f,0.960173f,0.254626f, +-0.110794f,0.97049f,0.214181f, +-0.10146f,0.992209f,0.072301f, +-0.111958f,0.99337f,0.026117f, +-0.0975457f,0.980844f,0.168611f, +0.086247f,0.976994f,0.195051f, +0.241113f,0.947591f,0.20961f, +0.0868755f,0.959222f,0.268972f, +-0.141994f,0.949853f,0.278599f, +-0.0178282f,0.934163f,0.356401f, +0.0726972f,0.940594f,0.331659f, +0.165529f,0.917627f,0.361333f, +0.223743f,0.920886f,0.319231f, +0.302189f,0.900958f,0.311378f, +0.181249f,0.939198f,0.291642f, +0.15269f,0.934294f,0.32215f, +0.181639f,0.932767f,0.311371f, +0.174351f,0.925291f,0.336805f, +0.107261f,0.938861f,0.327163f, +0.0621733f,0.949825f,0.306542f, +-0.336425f,0.924181f,-0.180852f, +-0.467727f,0.856958f,-0.216458f, +-0.602238f,0.781026f,-0.165251f, +-0.647361f,0.734151f,-0.204809f, +-0.50962f,0.821617f,-0.255407f, +-0.329682f,0.908003f,-0.258533f, +-0.0514578f,0.97257f,-0.226846f, +0.197411f,0.959315f,-0.201849f, +0.264136f,0.946231f,-0.186758f, +0.271989f,0.947232f,-0.169627f, +0.342182f,0.926412f,-0.157076f, +0.226068f,0.960114f,-0.164544f, +0.0298714f,0.986995f,-0.157954f, +0.0947848f,0.979734f,-0.176458f, +0.0184686f,0.978597f,-0.204958f, +-0.115417f,0.979217f,-0.166771f, +-0.133289f,0.987752f,-0.0811202f, +-0.254272f,0.966705f,0.0287551f, +-0.238007f,0.962858f,0.127508f, +-0.0805244f,0.989118f,0.123135f, +0.0609568f,0.996652f,0.0544921f, +0.185345f,0.981121f,-0.0552078f, +0.246025f,0.947034f,-0.206392f, +0.188933f,0.898455f,-0.396338f, +0.253355f,0.896162f,-0.364288f, +0.431339f,0.877591f,-0.209237f, +0.33179f,0.90994f,-0.248847f, +0.173449f,0.964884f,-0.197267f, +0.195848f,0.971573f,-0.133f, +0.242458f,0.968164f,-0.0622215f, +0.0872514f,0.995924f,0.0228468f, +-0.104392f,0.994289f,0.0221861f, +-0.212909f,0.976423f,0.0355982f, +-0.329497f,0.936369f,0.121017f, +-0.322708f,0.91595f,0.238528f, +-0.206447f,0.929806f,0.304697f, +-0.167225f,0.947523f,0.272462f, +-0.184928f,0.959175f,0.213976f, +-0.173343f,0.972643f,0.154651f, +-0.113658f,0.986612f,0.116951f, +-0.0855668f,0.994338f,0.0630098f, +-0.114452f,0.992427f,0.0446133f, +-0.159653f,0.986324f,0.0409453f, +-0.238644f,0.971105f,-0.00174015f, +-0.263001f,0.962569f,0.0655076f, +-0.150786f,0.97653f,0.153794f, +-0.0789227f,0.973225f,0.21588f, +-0.0862836f,0.967962f,0.235807f, +0.0429765f,0.969236f,0.242351f, +-0.0440941f,0.992467f,0.114305f, +-0.115348f,0.992717f,-0.0347649f, +0.0790257f,0.995351f,-0.0550642f, +0.126473f,0.98592f,0.109395f, +-0.0409487f,0.953557f,0.298417f, +-0.206016f,0.913735f,0.350208f, +-0.0633912f,0.92675f,0.370293f, +0.0785739f,0.913264f,0.399719f, +0.177609f,0.899902f,0.398285f, +0.238034f,0.923241f,0.301604f, +0.255943f,0.926508f,0.27582f, +0.232022f,0.914012f,0.332787f, +0.162081f,0.936068f,0.312259f, +0.177513f,0.926269f,0.332437f, +0.185532f,0.921601f,0.340924f, +0.173632f,0.950356f,0.258214f, +0.111166f,0.980225f,0.163712f, +-0.0923042f,0.995727f,-0.00270435f, +-0.408896f,0.902709f,-0.133863f, +-0.602302f,0.79183f,-0.10118f, +-0.624884f,0.765307f,-0.154352f, +-0.552184f,0.809036f,-0.201379f, +-0.343811f,0.917937f,-0.197956f, +-0.0748905f,0.960991f,-0.266248f, +0.134998f,0.958099f,-0.252631f, +0.206547f,0.962195f,-0.177534f, +0.264489f,0.960553f,-0.0859237f, +0.340814f,0.939333f,-0.0387315f, +0.235136f,0.971602f,-0.0264814f, +0.0144037f,0.991275f,-0.131023f, +0.053242f,0.991683f,-0.117173f, +0.0920982f,0.995717f,0.00816044f, +-0.164789f,0.980567f,-0.106454f, +-0.239234f,0.97035f,-0.0344802f, +-0.316227f,0.948287f,0.0274269f, +-0.260328f,0.965493f,0.00728909f, +-0.00635978f,0.999169f,0.0402508f, +0.152101f,0.988094f,-0.023159f, +0.261272f,0.960304f,-0.0977355f, +0.363311f,0.923635f,-0.122082f, +0.303719f,0.94151f,-0.145994f, +0.209258f,0.960639f,-0.182713f, +0.299827f,0.935978f,-0.184526f, +0.310225f,0.948937f,-0.0572597f, +0.134013f,0.988326f,-0.0724722f, +0.173294f,0.983169f,-0.0578515f, +0.150596f,0.988589f,-0.00352276f, +0.0218728f,0.99535f,0.093809f, +-0.090936f,0.980927f,0.171796f, +-0.253868f,0.938693f,0.233251f, +-0.400767f,0.870372f,0.286074f, +-0.392418f,0.877786f,0.274773f, +-0.219224f,0.925755f,0.308089f, +-0.114269f,0.92983f,0.349798f, +-0.147993f,0.921652f,0.358685f, +-0.138523f,0.925121f,0.353501f, +-0.0290531f,0.945854f,0.32329f, +0.0440242f,0.978167f,0.203106f, +-0.0576599f,0.997178f,0.0480716f, +-0.156038f,0.987653f,-0.0139414f, +-0.143901f,0.989541f,-0.0100722f, +-0.293059f,0.951458f,-0.0940478f, +-0.298958f,0.953936f,-0.0251005f, +-0.203233f,0.972711f,0.111937f, +-0.134891f,0.965356f,0.223367f, +-0.0182075f,0.958686f,0.283884f, +0.123188f,0.934113f,0.33505f, +0.0872404f,0.983488f,0.15856f, +0.00440122f,0.999845f,-0.0170726f, +-0.143813f,0.987727f,0.0609306f, +-0.192356f,0.942318f,0.273927f, +-0.141157f,0.926207f,0.349593f, +-0.0674076f,0.959831f,0.272363f, +0.0730938f,0.959591f,0.27174f, +0.173541f,0.961002f,0.215311f, +0.369237f,0.888798f,0.271483f, +0.277281f,0.944196f,0.177789f, +0.215184f,0.95909f,0.183961f, +0.13088f,0.973624f,0.186887f, +0.130607f,0.953976f,0.269946f, +0.212637f,0.930888f,0.297042f, +0.306976f,0.920481f,0.241829f, +0.280289f,0.947029f,0.156763f, +0.0123331f,0.988431f,0.151171f, +-0.297868f,0.952288f,0.0664969f, +-0.612229f,0.786332f,-0.0828155f, +-0.600387f,0.789438f,-0.127758f, +-0.542733f,0.826042f,-0.151972f, +-0.320126f,0.93364f,-0.160733f, +0.000589343f,0.981171f,-0.193142f, +0.0980808f,0.971507f,-0.215763f, +0.124748f,0.986178f,-0.109047f, +0.199191f,0.978521f,-0.0531043f, +0.247764f,0.965734f,-0.0772702f, +0.318214f,0.948019f,-0.000766246f, +0.183917f,0.97162f,-0.148756f, +-0.0488566f,0.965709f,-0.25499f, +-0.0165518f,0.99654f,-0.0814512f, +-0.0793375f,0.996823f,-0.00696945f, +-0.310737f,0.950344f,-0.0169863f, +-0.292329f,0.952706f,0.0830406f, +-0.217409f,0.975529f,0.0328f, +-0.044323f,0.995765f,-0.0805443f, +0.185778f,0.977354f,-0.101323f, +0.271832f,0.958328f,-0.0878372f, +0.32088f,0.946924f,0.019279f, +0.252443f,0.960909f,0.113697f, +0.290552f,0.947257f,0.135217f, +0.289238f,0.957058f,-0.0195476f, +0.286171f,0.957114f,0.0451517f, +0.220997f,0.975269f,0.00320969f, +0.0994052f,0.991378f,-0.0853655f, +0.0429034f,0.994069f,0.099932f, +-0.0709962f,0.952332f,0.296687f, +-0.214284f,0.897012f,0.38659f, +-0.318505f,0.838002f,0.443066f, +-0.352211f,0.849573f,0.392649f, +-0.30013f,0.898851f,0.319356f, +-0.250783f,0.928599f,0.273517f, +-0.200191f,0.919896f,0.337217f, +-0.179596f,0.907951f,0.378643f, +-0.135043f,0.919145f,0.370049f, +0.0368434f,0.920312f,0.389447f, +0.16581f,0.924682f,0.34274f, +0.0946402f,0.961136f,0.259346f, +-0.111217f,0.985094f,0.131228f, +-0.13188f,0.98641f,0.0979915f, +-0.254562f,0.966634f,0.028585f, +-0.324299f,0.94515f,-0.0390035f, +-0.293729f,0.954471f,-0.0520494f, +-0.247862f,0.966889f,0.0607495f, +-0.0794894f,0.980131f,0.181727f, +0.101373f,0.964007f,0.245794f, +0.197084f,0.947574f,0.251517f, +0.177833f,0.964662f,0.194431f, +-0.161149f,0.986485f,0.0296539f, +-0.316387f,0.94824f,0.02721f, +-0.207789f,0.976057f,0.0643106f, +-0.00905536f,0.99298f,0.117933f, +0.141544f,0.987983f,0.062088f, +0.189336f,0.98168f,-0.0213574f, +0.273454f,0.960225f,0.0564811f, +0.315806f,0.930776f,0.184181f, +0.235283f,0.955417f,0.17838f, +0.124851f,0.982004f,0.141708f, +0.0792257f,0.989953f,0.117114f, +0.210835f,0.9739f,0.0840678f, +0.31429f,0.942479f,0.113817f, +0.350241f,0.914076f,0.20444f, +0.0694749f,0.983151f,0.169077f, +-0.169784f,0.982476f,0.076909f, +-0.507716f,0.850133f,-0.139637f, +-0.564212f,0.800379f,-0.202629f, +-0.514428f,0.829332f,-0.218112f, +-0.369417f,0.885582f,-0.28156f, +0.00180169f,0.974596f,-0.223965f, +0.0258344f,0.976386f,-0.214484f, +-0.024f,0.996868f,-0.0753534f, +0.239975f,0.969587f,0.0481022f, +0.34797f,0.931588f,-0.105173f, +0.316295f,0.909782f,-0.268803f, +0.250422f,0.912989f,-0.322087f, +-0.0369252f,0.950156f,-0.30958f, +-0.207502f,0.950188f,-0.232562f, +-0.167975f,0.985706f,-0.0129903f, +-0.315712f,0.948273f,0.0332206f, +-0.386969f,0.921609f,-0.0298463f, +-0.12805f,0.991662f,0.0144567f, +0.102711f,0.991948f,-0.0740863f, +0.21217f,0.967879f,-0.134884f, +0.167738f,0.98185f,-0.0885116f, +0.176293f,0.984226f,0.0148055f, +0.233609f,0.968608f,0.0850021f, +0.30166f,0.950058f,0.0799509f, +0.387591f,0.914349f,0.117215f, +0.244561f,0.968825f,0.0395933f, +0.294792f,0.954101f,0.0528114f, +0.0843374f,0.996399f,0.00873819f, +-0.221704f,0.963341f,0.151067f, +-0.335663f,0.86809f,0.365719f, +-0.262618f,0.850841f,0.455085f, +-0.222709f,0.867235f,0.445313f, +-0.24917f,0.884312f,0.39485f, +-0.238336f,0.907466f,0.345978f, +-0.270997f,0.917236f,0.291956f, +-0.229194f,0.914337f,0.333853f, +-0.15897f,0.933059f,0.322692f, +-0.100911f,0.956766f,0.272794f, +-0.0211523f,0.974532f,0.223248f, +0.201297f,0.933635f,0.29632f, +0.155914f,0.954519f,0.254134f, +-0.0218294f,0.971898f,0.234389f, +-0.079809f,0.976613f,0.199646f, +-0.0874479f,0.990326f,0.10774f, +-0.258167f,0.959037f,-0.116608f, +-0.306401f,0.945943f,-0.106352f, +-0.341562f,0.936596f,-0.0782577f, +-0.199458f,0.979359f,-0.0327519f, +0.0464294f,0.997405f,0.0550308f, +0.191208f,0.978076f,0.0825056f, +0.238583f,0.96711f,0.0881811f, +-0.0888379f,0.993271f,0.0743033f, +-0.264236f,0.955782f,0.129075f, +-0.188913f,0.981529f,0.0302016f, +-0.0145673f,0.997134f,-0.0742444f, +0.169633f,0.978852f,-0.114338f, +0.20381f,0.976959f,-0.0633407f, +0.175314f,0.984354f,-0.0176521f, +0.240514f,0.967819f,0.0740208f, +0.244396f,0.964775f,0.0973589f, +0.18832f,0.980026f,0.0639107f, +0.156937f,0.987568f,-0.00896143f, +0.262584f,0.963481f,-0.0524761f, +0.165405f,0.986171f,-0.0103631f, +0.180443f,0.960877f,0.210132f, +0.22428f,0.955199f,0.193116f, +0.0674282f,0.994387f,0.0815297f, +-0.367623f,0.911009f,-0.186858f, +-0.569756f,0.78903f,-0.229805f, +-0.492917f,0.847419f,-0.197265f, +-0.366141f,0.895981f,-0.251313f, +-0.0646011f,0.969824f,-0.235091f, +0.018291f,0.976889f,-0.212961f, +-0.170757f,0.95698f,-0.234588f, +0.158661f,0.98264f,-0.0961541f, +0.509439f,0.859861f,-0.0333235f, +0.45757f,0.865797f,-0.202548f, +0.211042f,0.949174f,-0.233516f, +-0.116125f,0.987892f,-0.102876f, +-0.347298f,0.937329f,-0.028262f, +-0.3353f,0.938887f,0.0778782f, +-0.281604f,0.948411f,0.145656f, +-0.254278f,0.964997f,0.0642133f, +-0.124948f,0.985399f,-0.115656f, +0.137997f,0.981596f,-0.132006f, +0.145883f,0.979226f,-0.140833f, +0.128056f,0.990732f,-0.0452937f, +0.135002f,0.989818f,-0.0451192f, +0.250583f,0.968082f,-0.00493589f, +0.249752f,0.966686f,-0.056052f, +0.354812f,0.933896f,0.0441336f, +0.303438f,0.951308f,0.0542095f, +0.224177f,0.96836f,0.10965f, +0.0241424f,0.959753f,0.279804f, +-0.360787f,0.871516f,0.332105f, +-0.379082f,0.837086f,0.394442f, +-0.267154f,0.880877f,0.390749f, +-0.209592f,0.899886f,0.382462f, +-0.280017f,0.899934f,0.33423f, +-0.205094f,0.90311f,0.377265f, +-0.215487f,0.908768f,0.35736f, +-0.222303f,0.927919f,0.299247f, +-0.133955f,0.964793f,0.226343f, +-0.0310722f,0.978213f,0.205265f, +0.00222901f,0.986522f,0.163613f, +0.163026f,0.975343f,0.148754f, +0.222032f,0.968535f,0.112436f, +-0.0591592f,0.996482f,0.0593585f, +-0.0736093f,0.986012f,0.149538f, +0.0883465f,0.986402f,0.138585f, +-0.129755f,0.988677f,-0.0753772f, +-0.360418f,0.926521f,-0.10797f, +-0.325602f,0.942448f,-0.0759939f, +-0.212184f,0.970083f,-0.117968f, +-0.0173686f,0.99664f,-0.0800487f, +0.199307f,0.979749f,-0.0191744f, +0.207601f,0.977585f,-0.0350739f, +-0.111673f,0.993337f,0.0284751f, +-0.348081f,0.937445f,0.00599776f, +-0.0214784f,0.998661f,0.0470579f, +0.101424f,0.987937f,-0.11702f, +0.14864f,0.985437f,-0.0825872f, +0.115279f,0.993006f,0.0255073f, +0.132171f,0.98902f,0.0661133f, +0.208651f,0.976857f,0.0470664f, +0.263292f,0.96404f,0.0361305f, +0.248825f,0.968171f,0.0270552f, +0.185161f,0.982538f,-0.018271f, +0.217415f,0.97571f,0.0268649f, +0.0197241f,0.992022f,0.124516f, +-0.222642f,0.960275f,0.168234f, +0.132211f,0.987109f,0.0902005f, +0.194249f,0.96722f,0.163561f, +-0.121192f,0.992517f,0.0149198f, +-0.530811f,0.812343f,-0.241533f, +-0.504434f,0.808747f,-0.302447f, +-0.34313f,0.885425f,-0.313504f, +-0.137778f,0.93664f,-0.322061f, +0.0757018f,0.968813f,-0.235947f, +-0.132891f,0.938587f,-0.318425f, +0.0404124f,0.947798f,-0.316301f, +0.44786f,0.871235f,-0.200923f, +0.490699f,0.867082f,-0.0859319f, +0.104719f,0.99418f,-0.0252995f, +-0.266739f,0.955461f,0.126271f, +-0.36926f,0.905342f,0.209771f, +-0.330235f,0.922316f,0.200695f, +-0.269586f,0.955277f,0.121531f, +-0.151874f,0.986716f,0.0576671f, +-0.0142621f,0.999832f,-0.0115305f, +0.159425f,0.986955f,-0.0224599f, +0.153623f,0.986882f,-0.0496328f, +0.106278f,0.991325f,-0.0773283f, +0.114508f,0.986134f,-0.120113f, +0.21169f,0.974687f,-0.0719165f, +0.274634f,0.961096f,-0.0295159f, +0.269382f,0.962666f,0.0266079f, +0.255851f,0.94689f,0.19478f, +-0.00861224f,0.958716f,0.284234f, +-0.164949f,0.853283f,0.494671f, +-0.299895f,0.797641f,0.523289f, +-0.348319f,0.830543f,0.434595f, +-0.252787f,0.902204f,0.349467f, +-0.200686f,0.920719f,0.334665f, +-0.211731f,0.897332f,0.387253f, +-0.253565f,0.89104f,0.376502f, +-0.186105f,0.884245f,0.42834f, +-0.119153f,0.910802f,0.395274f, +-0.0259565f,0.945107f,0.325728f, +-0.0365208f,0.969055f,0.244127f, +0.0217438f,0.965814f,0.258322f, +0.21499f,0.950394f,0.224789f, +0.314831f,0.941255f,0.12215f, +-0.024099f,0.99913f,-0.0340298f, +-0.193558f,0.979871f,-0.0488714f, +0.141024f,0.987427f,0.0714227f, +0.042141f,0.998281f,-0.0407328f, +-0.330902f,0.928766f,-0.167024f, +-0.316891f,0.928564f,-0.193256f, +-0.212611f,0.956496f,-0.199781f, +-0.0848317f,0.98296f,-0.163073f, +0.159095f,0.98144f,-0.107074f, +0.142493f,0.988352f,-0.0534431f, +-0.0993206f,0.99343f,0.0568515f, +-0.282995f,0.956355f,-0.0727984f, +-0.0511781f,0.994657f,-0.0896605f, +0.128118f,0.991123f,0.0355009f, +0.0178584f,0.998165f,0.057865f, +0.0308308f,0.995199f,0.0928875f, +0.176093f,0.979878f,0.0939732f, +0.250441f,0.967914f,0.0205173f, +0.266597f,0.963616f,0.0192599f, +0.242746f,0.969766f,0.0250589f, +0.198829f,0.979834f,0.0197961f, +0.092758f,0.995177f,0.031931f, +-0.00514037f,0.987257f,0.15905f, +-0.197401f,0.976423f,0.0873538f, +0.0947848f,0.990346f,0.101148f, +0.11003f,0.98867f,0.102099f, +0.0979659f,0.987432f,0.124019f, +-0.288467f,0.943192f,-0.16485f, +-0.465875f,0.798355f,-0.381562f, +-0.320527f,0.848593f,-0.420894f, +-0.189264f,0.880141f,-0.435352f, +-0.0157309f,0.942454f,-0.333965f, +-0.0523924f,0.9528f,-0.299042f, +0.0243535f,0.924362f,-0.38074f, +0.347438f,0.877508f,-0.330555f, +0.339023f,0.92439f,-0.174834f, +0.0111821f,0.998297f,0.0572478f, +-0.344224f,0.932997f,0.105009f, +-0.433099f,0.895278f,0.104414f, +-0.282796f,0.937116f,0.204547f, +-0.130039f,0.982692f,0.131936f, +-0.0814764f,0.996291f,-0.027691f, +-0.0200688f,0.997106f,-0.0733289f, +0.118984f,0.992345f,-0.0330638f, +0.199561f,0.979885f,0.00110984f, +0.153394f,0.986654f,-0.0546216f, +0.176634f,0.980572f,-0.0853107f, +0.13548f,0.982889f,-0.124795f, +0.191838f,0.980855f,0.0334985f, +0.104996f,0.978045f,0.180009f, +0.00782433f,0.923816f,0.382758f, +-0.0895214f,0.848914f,0.520894f, +-0.239967f,0.84054f,0.485703f, +-0.280756f,0.842357f,0.460011f, +-0.207606f,0.901917f,0.378742f, +-0.122486f,0.94404f,0.306245f, +-0.244402f,0.93107f,0.270881f, +-0.292773f,0.891472f,0.345777f, +-0.276286f,0.909624f,0.310243f, +-0.213016f,0.932947f,0.290231f, +-0.0942691f,0.953854f,0.28509f, +-0.0105057f,0.953135f,0.302364f, +0.0307865f,0.936068f,0.35047f, +0.0538732f,0.955717f,0.289315f, +0.209391f,0.949668f,0.232994f, +0.403861f,0.868428f,0.287628f, +0.149382f,0.968969f,0.196936f, +-0.176548f,0.984269f,0.00674917f, +0.0687777f,0.996274f,-0.0520396f, +0.147821f,0.988716f,-0.0242998f, +-0.223164f,0.968308f,-0.112148f, +-0.295488f,0.928787f,-0.2237f, +-0.23574f,0.935973f,-0.261496f, +-0.100501f,0.963432f,-0.248392f, +0.0576299f,0.973773f,-0.220102f, +0.0436147f,0.999029f,-0.00621142f, +-0.153496f,0.982634f,0.104254f, +-0.184805f,0.972589f,0.141133f, +-0.14696f,0.984535f,0.0953571f, +-0.0211774f,0.989717f,0.141466f, +0.0758245f,0.9782f,0.193326f, +0.117048f,0.987762f,0.103083f, +0.217731f,0.97559f,-0.0285914f, +0.270726f,0.959521f,-0.0776314f, +0.230415f,0.971747f,-0.0511441f, +0.234903f,0.971865f,0.0172727f, +0.182122f,0.97948f,0.0863184f, +0.0884364f,0.988499f,0.122674f, +-0.00977715f,0.999042f,0.0426606f, +-0.0304096f,0.999492f,-0.00954367f, +0.200711f,0.957383f,0.207686f, +0.148405f,0.978101f,0.145929f, +0.14921f,0.978785f,0.140417f, +0.0273685f,0.999287f,0.0260052f, +-0.3017f,0.88706f,-0.349431f, +-0.32483f,0.824834f,-0.462746f, +-0.238736f,0.866733f,-0.437926f, +-0.174101f,0.907603f,-0.382029f, +-0.0165261f,0.968715f,-0.247625f, +0.078914f,0.949167f,-0.30472f, +0.287731f,0.926482f,-0.242571f, +0.12793f,0.981688f,-0.141147f, +-0.134026f,0.990975f,-0.00233563f, +-0.342476f,0.939327f,-0.0193419f, +-0.427311f,0.903697f,-0.027138f, +-0.353742f,0.934457f,-0.0407041f, +-0.055135f,0.997815f,0.0363915f, +0.0312575f,0.999385f,0.0158812f, +0.00264454f,0.999634f,-0.0269175f, +0.0835808f,0.996075f,-0.0291308f, +0.150499f,0.987413f,0.0486412f, +0.165157f,0.971811f,0.168246f, +0.215634f,0.960222f,0.177413f, +0.0835282f,0.988765f,0.123967f, +-0.00975779f,0.968408f,0.249181f, +-0.06977f,0.918125f,0.3901f, +-0.139283f,0.878718f,0.456569f, +-0.11373f,0.882765f,0.455842f, +-0.169944f,0.889011f,0.42518f, +-0.209287f,0.894084f,0.395996f, +-0.156853f,0.920873f,0.356917f, +-0.124966f,0.921391f,0.367997f, +-0.29021f,0.888579f,0.355255f, +-0.269725f,0.894676f,0.356094f, +-0.146199f,0.945073f,0.292342f, +-0.175209f,0.971632f,0.15885f, +-0.117718f,0.980316f,0.158504f, +-0.0825429f,0.966227f,0.244116f, +-0.0312586f,0.938703f,0.343308f, +0.145253f,0.922109f,0.358632f, +0.209296f,0.943478f,0.256992f, +0.299421f,0.901575f,0.312265f, +0.248395f,0.88619f,0.39111f, +0.0914055f,0.966416f,0.240179f, +0.127765f,0.989974f,-0.0602251f, +0.140331f,0.988333f,-0.0592086f, +-0.14269f,0.987394f,-0.0685058f, +-0.196659f,0.96924f,-0.147981f, +-0.173702f,0.951221f,-0.254961f, +-0.143754f,0.948468f,-0.282389f, +-0.0849965f,0.99069f,-0.106347f, +-0.164159f,0.984178f,0.0666661f, +-0.232036f,0.961292f,0.148586f, +-0.256871f,0.951713f,0.168109f, +-0.0692891f,0.973705f,0.217018f, +0.083167f,0.991239f,0.102607f, +0.0755656f,0.994003f,-0.07904f, +0.210733f,0.972404f,-0.100116f, +0.30249f,0.937213f,-0.173582f, +0.293071f,0.941554f,-0.166086f, +0.154342f,0.975072f,-0.159414f, +0.102764f,0.994605f,0.0141294f, +0.056079f,0.980415f,0.188792f, +0.109909f,0.955557f,0.273554f, +0.133139f,0.972499f,0.191102f, +0.0554464f,0.995429f,0.0777578f, +0.259868f,0.925249f,0.276374f, +0.196037f,0.949951f,0.243232f, +0.114869f,0.970528f,0.21185f, +0.223665f,0.947755f,0.227452f, +0.0930818f,0.995219f,-0.0295687f, +-0.269847f,0.892223f,-0.362106f, +-0.284642f,0.866853f,-0.409321f, +-0.255009f,0.880625f,-0.399336f, +-0.131932f,0.93993f,-0.314842f, +0.0677192f,0.974824f,-0.212442f, +0.187299f,0.973952f,-0.127815f, +0.0529524f,0.998138f,-0.0302806f, +-0.109006f,0.993972f,0.0117426f, +-0.296161f,0.95278f,-0.067077f, +-0.391399f,0.918205f,-0.0608803f, +-0.369652f,0.920023f,-0.130056f, +-0.175066f,0.983052f,-0.0544101f, +0.0114037f,0.997649f,0.0675687f, +-0.0112147f,0.996664f,0.0808418f, +0.0734363f,0.988721f,0.130533f, +0.0224625f,0.993745f,0.109391f, +0.0118323f,0.985875f,0.167063f, +0.164185f,0.947186f,0.275466f, +0.0854603f,0.916044f,0.391867f, +-0.130673f,0.906994f,0.400358f, +-0.128332f,0.898319f,0.420183f, +-0.0833752f,0.911617f,0.402496f, +-0.0573327f,0.932174f,0.357442f, +-0.17852f,0.926686f,0.330734f, +-0.230606f,0.897072f,0.376939f, +-0.191094f,0.893503f,0.406369f, +-0.142227f,0.886795f,0.439733f, +-0.17679f,0.896492f,0.40626f, +-0.238548f,0.945234f,0.222772f, +-0.0952672f,0.973092f,0.209801f, +-0.096256f,0.964628f,0.245412f, +-0.179685f,0.951666f,0.249087f, +-0.204503f,0.928081f,0.311197f, +-0.0772696f,0.924068f,0.374336f, +0.158946f,0.926358f,0.341463f, +0.256333f,0.910209f,0.325291f, +0.24298f,0.91134f,0.332296f, +0.258464f,0.899993f,0.351011f, +0.335956f,0.897826f,0.28468f, +0.32299f,0.94494f,0.0525965f, +0.125001f,0.99187f,-0.0238687f, +-0.121525f,0.992278f,-0.0248174f, +-0.149564f,0.988264f,-0.0310731f, +-0.0664528f,0.99755f,-0.021853f, +-0.216702f,0.971886f,-0.0920818f, +-0.313688f,0.949511f,-0.0053432f, +-0.230579f,0.964148f,0.131349f, +-0.200205f,0.977444f,0.06724f, +-0.214561f,0.975215f,-0.0540219f, +-0.0751922f,0.988525f,-0.131015f, +0.196994f,0.973692f,-0.114533f, +0.277294f,0.941009f,-0.193932f, +0.227557f,0.901482f,-0.368168f, +0.240964f,0.919471f,-0.31066f, +0.212207f,0.970864f,-0.111317f, +0.0629816f,0.997092f,0.0428958f, +-0.106678f,0.985091f,0.134967f, +-0.0538645f,0.972292f,0.227481f, +0.0800601f,0.969345f,0.232295f, +0.209708f,0.947853f,0.239995f, +0.200719f,0.957631f,0.206531f, +0.262538f,0.945755f,0.191366f, +0.219609f,0.958448f,0.182068f, +0.16942f,0.971857f,0.163679f, +0.226298f,0.968297f,0.105781f, +0.311569f,0.942438f,0.12139f, +0.0252626f,0.999298f,-0.0276703f, +-0.250271f,0.93337f,-0.257262f, +-0.253906f,0.911858f,-0.322563f, +-0.227242f,0.899531f,-0.373102f, +-0.0651757f,0.944171f,-0.322945f, +0.0757455f,0.97969f,-0.185662f, +-0.00346825f,0.999555f,-0.0296364f, +-0.101674f,0.994706f,-0.0148914f, +-0.257112f,0.961591f,-0.0961018f, +-0.383381f,0.91395f,-0.133094f, +-0.376104f,0.917884f,-0.12663f, +-0.286338f,0.956389f,-0.0577212f, +-0.0969792f,0.993405f,0.061176f, +-0.0181638f,0.982944f,0.183006f, +0.0407231f,0.989025f,0.142023f, +0.0858284f,0.987795f,0.129982f, +0.0586048f,0.994197f,0.0902062f, +0.00131743f,0.999561f,0.0296072f, +-0.0615813f,0.973472f,0.220363f, +-0.103673f,0.946783f,0.304719f, +-0.0728984f,0.963065f,0.259214f, +-0.0671535f,0.98356f,0.16763f, +-0.0415144f,0.986558f,0.158053f, +-0.226194f,0.961315f,0.157196f, +-0.322442f,0.916637f,0.236235f, +-0.20303f,0.923357f,0.32587f, +-0.141662f,0.940817f,0.307889f, +-0.0764267f,0.960304f,0.268283f, +-0.0942789f,0.977491f,0.188741f, +-0.142883f,0.973984f,0.175899f, +-0.198273f,0.947542f,0.250702f, +-0.198314f,0.931193f,0.305861f, +-0.212116f,0.938506f,0.272421f, +-0.0469422f,0.977819f,0.204126f, +0.196637f,0.969918f,0.1435f, +0.210661f,0.950426f,0.228718f, +0.210629f,0.90739f,0.363701f, +0.274296f,0.882172f,0.382799f, +0.402024f,0.855402f,0.326595f, +0.442462f,0.866019f,0.232889f, +0.128104f,0.97894f,0.158954f, +-0.10509f,0.973708f,0.202109f, +-0.168744f,0.972176f,0.162479f, +-0.102712f,0.980722f,0.166234f, +-0.117365f,0.985855f,0.119644f, +-0.348177f,0.934585f,-0.0729569f, +-0.249993f,0.967414f,-0.040164f, +-0.059218f,0.996444f,-0.0599467f, +-0.0488698f,0.975685f,-0.21366f, +-0.0228314f,0.943327f,-0.331077f, +0.144917f,0.936565f,-0.319132f, +0.332603f,0.901794f,-0.275938f, +0.285592f,0.906866f,-0.309889f, +0.0349917f,0.981145f,-0.190079f, +-0.0795345f,0.991829f,0.0997459f, +-0.0793233f,0.9451f,0.317009f, +-0.0879959f,0.940679f,0.327688f, +-0.00912821f,0.970457f,0.241099f, +0.124716f,0.982357f,0.13936f, +0.187981f,0.977561f,0.0950669f, +0.255482f,0.951122f,0.173483f, +0.297001f,0.952441f,0.0681659f, +0.265042f,0.961574f,0.0716068f, +0.186715f,0.981446f,0.0436002f, +0.255349f,0.964505f,0.0672885f, +0.267248f,0.96042f,0.078566f, +0.154901f,0.983709f,0.0912232f, +-0.0558054f,0.990723f,-0.123913f, +-0.190326f,0.930089f,-0.314182f, +-0.171804f,0.925365f,-0.337911f, +-0.124574f,0.93618f,-0.328706f, +-0.0782933f,0.960403f,-0.267387f, +-0.15298f,0.970001f,-0.188931f, +-0.0717491f,0.993745f,-0.0855706f, +-0.147047f,0.986451f,-0.0727437f, +-0.378361f,0.919377f,-0.107652f, +-0.386168f,0.917464f,-0.0955771f, +-0.364818f,0.925918f,-0.097894f, +-0.234461f,0.971639f,0.0307667f, +-0.0876095f,0.988677f,0.121826f, +0.151616f,0.984538f,0.0877402f, +0.0730881f,0.996968f,-0.0267174f, +0.0661066f,0.997404f,0.0285557f, +0.00089126f,0.998637f,0.052186f, +-0.169004f,0.978667f,0.116824f, +-0.169994f,0.972188f,0.161096f, +-0.0375438f,0.966292f,0.254695f, +0.0282607f,0.96926f,0.244409f, +0.0134123f,0.993493f,0.113096f, +-0.245106f,0.969303f,-0.0193377f, +-0.4073f,0.913294f,0.000911808f, +-0.297873f,0.952205f,0.0676567f, +-0.106293f,0.976869f,0.185552f, +-0.0629676f,0.97793f,0.199217f, +-0.110366f,0.958688f,0.262177f, +-0.181956f,0.936769f,0.298926f, +-0.212233f,0.945122f,0.248398f, +-0.195256f,0.962306f,0.189318f, +-0.105775f,0.982974f,0.150248f, +0.0268617f,0.999457f,0.0191026f, +0.158413f,0.985011f,0.068261f, +0.0517671f,0.977028f,0.206729f, +0.0576574f,0.95413f,0.293788f, +0.234396f,0.901434f,0.363971f, +0.437391f,0.816127f,0.377659f, +0.504071f,0.803908f,0.315666f, +0.133347f,0.946928f,0.292483f, +-0.151412f,0.933905f,0.323877f, +-0.120106f,0.92207f,0.367915f, +-0.00325057f,0.939171f,0.343435f, +0.0348166f,0.983178f,0.179299f, +-0.135523f,0.990774f,0.00106677f, +-0.269937f,0.929173f,-0.252528f, +-0.0598233f,0.968739f,-0.240761f, +0.0705133f,0.981516f,-0.177915f, +0.0411605f,0.966746f,-0.252403f, +0.126252f,0.944488f,-0.30332f, +0.315542f,0.911296f,-0.264523f, +0.160596f,0.976989f,-0.140362f, +-0.167382f,0.98071f,0.100946f, +-0.298691f,0.934743f,0.192454f, +-0.145935f,0.9608f,0.235724f, +-0.00307512f,0.970287f,0.241936f, +0.110563f,0.982642f,0.148964f, +0.216043f,0.97432f,0.0634533f, +0.143964f,0.986263f,0.0809867f, +0.0914437f,0.980957f,0.17135f, +0.140934f,0.985084f,-0.0987321f, +0.206841f,0.978337f,0.00859891f, +0.190086f,0.979435f,0.0676362f, +0.201515f,0.978077f,0.0525072f, +0.267937f,0.960786f,0.0714189f, +0.246755f,0.968907f,0.0182169f, +0.214715f,0.971106f,-0.104168f, +-0.0180649f,0.956568f,-0.290949f, +-0.219959f,0.899081f,-0.378512f, +-0.191729f,0.921961f,-0.336494f, +-0.106738f,0.947718f,-0.300729f, +-0.152636f,0.943663f,-0.293602f, +-0.224106f,0.947646f,-0.227472f, +-0.228203f,0.973419f,0.019469f, +-0.388401f,0.917519f,0.0854554f, +-0.336148f,0.939599f,0.0644837f, +-0.402605f,0.913568f,-0.0574625f, +-0.305232f,0.952235f,-0.00907982f, +-0.096739f,0.995183f,-0.0159156f, +0.180076f,0.982792f,0.0411394f, +0.136148f,0.986894f,0.0866302f, +0.0219341f,0.999371f,0.0278606f, +-0.0791566f,0.996134f,0.0381004f, +-0.239326f,0.960376f,0.142833f, +-0.218166f,0.951783f,0.215666f, +-0.166214f,0.94168f,0.292596f, +0.0428911f,0.92465f,0.378394f, +0.200943f,0.923885f,0.325667f, +-0.0783125f,0.985711f,0.149132f, +-0.415101f,0.909654f,-0.0148509f, +-0.366356f,0.929766f,0.0363078f, +-0.239727f,0.962799f,0.124698f, +-0.166496f,0.955565f,0.243259f, +-0.200219f,0.921854f,0.331809f, +-0.112297f,0.932828f,0.342375f, +-0.106223f,0.957221f,0.269154f, +-0.127872f,0.96503f,0.228835f, +-0.0138049f,0.984551f,0.174552f, +0.0256733f,0.993774f,0.108417f, +0.00728748f,0.973829f,0.227164f, +-0.00741294f,0.956693f,0.291004f, +0.0683597f,0.974464f,0.213887f, +0.177941f,0.966015f,0.187489f, +0.424978f,0.876377f,0.226619f, +0.505816f,0.827485f,0.243758f, +0.166361f,0.911198f,0.376885f, +-0.17476f,0.913668f,0.366973f, +-0.176728f,0.923512f,0.340431f, +0.0722139f,0.943797f,0.322541f, +0.177366f,0.957288f,0.228344f, +0.0913959f,0.986484f,0.136004f, +-0.0297265f,0.993047f,-0.113903f, +-0.0869422f,0.951911f,-0.293781f, +-0.0450316f,0.952406f,-0.301489f, +0.143119f,0.964298f,-0.222813f, +0.165675f,0.921893f,-0.350237f, +0.164354f,0.949667f,-0.266682f, +-0.039757f,0.998354f,0.0413462f, +-0.291683f,0.947651f,0.12992f, +-0.239728f,0.968947f,0.0605947f, +-0.107127f,0.994229f,0.00574708f, +-0.00468879f,0.997776f,-0.0664969f, +0.179786f,0.983119f,-0.033983f, +0.200209f,0.979349f,-0.0281487f, +0.0601426f,0.997956f,0.0216006f, +-0.0759803f,0.997037f,0.0120005f, +0.14599f,0.98347f,-0.107112f, +0.111543f,0.987674f,-0.109808f, +0.157618f,0.987042f,-0.0300797f, +0.250909f,0.967637f,-0.026879f, +0.281043f,0.956928f,-0.0728269f, +0.296885f,0.954758f,-0.0172396f, +0.276747f,0.960894f,-0.00969537f, +0.102049f,0.992961f,-0.0601211f, +-0.130111f,0.972079f,-0.195279f, +-0.17254f,0.923261f,-0.343248f, +-0.125309f,0.912244f,-0.390012f, +-0.211743f,0.924189f,-0.317868f, +-0.376287f,0.901788f,-0.212569f, +-0.427638f,0.901509f,-0.0663888f, +-0.389415f,0.920624f,0.0283935f, +-0.297925f,0.953877f,0.0368632f, +-0.273734f,0.961504f,0.0240644f, +-0.334113f,0.936286f,-0.108341f, +-0.109536f,0.993721f,-0.0228029f, +0.0288145f,0.999546f,0.00876748f, +0.119784f,0.984043f,0.131571f, +0.0511538f,0.994284f,0.0937163f, +-0.0752276f,0.983313f,0.165639f, +-0.293078f,0.946365f,0.136011f, +-0.332793f,0.935954f,0.115063f, +-0.225106f,0.941939f,0.249154f, +0.0114661f,0.958888f,0.283552f, +0.24485f,0.921506f,0.301455f, +0.100987f,0.953885f,0.282675f, +-0.340266f,0.932035f,0.124616f, +-0.415762f,0.898895f,0.138312f, +-0.325966f,0.925955f,0.190664f, +-0.250966f,0.918836f,0.304559f, +-0.221816f,0.898675f,0.378392f, +-0.0852583f,0.899614f,0.428282f, +-0.0998073f,0.904564f,0.41449f, +-0.102816f,0.885513f,0.453096f, +0.0414724f,0.91382f,0.403996f, +-0.0128006f,0.939036f,0.343581f, +-0.0641104f,0.924175f,0.376551f, +0.0655361f,0.926269f,0.37112f, +0.187467f,0.942186f,0.277743f, +0.21985f,0.965692f,0.138218f, +0.3812f,0.921864f,0.0696633f, +0.433954f,0.878909f,0.197998f, +0.0643484f,0.944154f,0.32316f, +-0.162002f,0.923385f,0.348016f, +-0.0466746f,0.93461f,0.352597f, +0.113297f,0.96975f,0.216212f, +0.268791f,0.938715f,0.215791f, +0.199257f,0.972974f,0.116695f, +0.13591f,0.990721f,-0.000598755f, +0.098836f,0.989317f,-0.107165f, +0.00840194f,0.94937f,-0.314049f, +0.0977197f,0.93606f,-0.337997f, +0.228369f,0.952655f,-0.20074f, +-0.102319f,0.98537f,-0.136295f, +-0.210478f,0.975126f,0.0694824f, +-0.226245f,0.97389f,-0.0187694f, +-0.184535f,0.981701f,-0.0470082f, +-0.0356904f,0.995184f,-0.0912977f, +0.0448449f,0.980059f,-0.193583f, +0.0871766f,0.981936f,-0.167935f, +0.149691f,0.986438f,-0.0673319f, +0.081336f,0.996451f,-0.021693f, +0.0320348f,0.999323f,-0.0181162f, +0.0913657f,0.979354f,-0.180329f, +0.100696f,0.986931f,-0.125808f, +0.108832f,0.988438f,-0.105573f, +0.287509f,0.953f,-0.0955498f, +0.243655f,0.954139f,-0.173927f, +0.160509f,0.983073f,-0.0883436f, +0.264497f,0.963724f,0.0357424f, +0.162998f,0.986545f,0.0127154f, +0.0143391f,0.999851f,0.00965394f, +-0.0125406f,0.999093f,-0.0406807f, +-0.106874f,0.984584f,-0.138462f, +-0.285824f,0.938351f,-0.194429f, +-0.419998f,0.877928f,-0.22988f, +-0.451562f,0.860313f,-0.236545f, +-0.434075f,0.875052f,-0.214154f, +-0.338822f,0.927615f,-0.157258f, +-0.245036f,0.962096f,-0.119701f, +-0.344114f,0.932339f,-0.111035f, +-0.226404f,0.972006f,0.0628119f, +0.0419787f,0.991974f,0.119273f, +0.128473f,0.991295f,0.0288037f, +-0.0257017f,0.999564f,0.0145347f, +-0.185301f,0.952066f,0.243378f, +-0.184541f,0.936895f,0.29694f, +-0.273419f,0.950852f,0.145334f, +-0.319783f,0.945196f,0.0659039f, +-0.035432f,0.98966f,0.138987f, +0.220222f,0.955124f,0.19809f, +0.125192f,0.96286f,0.239224f, +-0.256002f,0.939458f,0.227776f, +-0.448892f,0.878586f,0.163043f, +-0.385115f,0.893165f,0.232256f, +-0.361248f,0.871706f,0.331103f, +-0.291851f,0.846516f,0.445235f, +-0.17348f,0.85884f,0.481973f, +-0.107775f,0.841326f,0.529675f, +-0.0921307f,0.850827f,0.517306f, +0.0950699f,0.836893f,0.539048f, +0.0822562f,0.850572f,0.519385f, +0.00749303f,0.916802f,0.399272f, +0.0761143f,0.966912f,0.243491f, +0.269493f,0.937399f,0.220582f, +0.37073f,0.916186f,0.152194f, +0.358083f,0.929944f,0.083549f, +0.335187f,0.907961f,0.251509f, +0.0578141f,0.947361f,0.314904f, +-0.166707f,0.957873f,0.233855f, +-0.0184246f,0.983369f,0.180682f, +0.167068f,0.976917f,0.13312f, +0.286534f,0.942354f,0.172822f, +0.301062f,0.945554f,0.123648f, +0.228175f,0.972518f,0.0463188f, +0.216797f,0.97484f,-0.0518194f, +0.199106f,0.962895f,-0.18218f, +0.00394531f,0.962307f,-0.271937f, +-0.0105699f,0.99745f,-0.0705888f, +-0.131705f,0.985651f,0.105578f, +-0.19725f,0.980353f,0.00065076f, +-0.141436f,0.988723f,-0.0492296f, +-0.163841f,0.979948f,-0.113394f, +0.0189882f,0.981225f,-0.191928f, +0.0882705f,0.978772f,-0.18497f, +0.0393937f,0.981447f,-0.187645f, +0.0729287f,0.986122f,-0.149146f, +0.0148824f,0.998969f,-0.0428982f, +-0.0177962f,0.999449f,0.0279995f, +-0.0162323f,0.963189f,-0.268333f, +0.00641467f,0.976357f,-0.216067f, +0.107749f,0.98057f,-0.16393f, +0.293413f,0.939289f,-0.177892f, +0.308304f,0.934826f,-0.17621f, +0.101903f,0.952869f,-0.285755f, +0.182917f,0.946528f,-0.265755f, +0.146405f,0.977668f,-0.15077f, +-0.0629734f,0.995858f,-0.0655825f, +-0.0448201f,0.998977f,-0.00597126f, +-0.0400505f,0.999191f,-0.00375744f, +-0.153158f,0.98627f,-0.0617534f, +-0.285484f,0.92871f,-0.236637f, +-0.448842f,0.826713f,-0.339243f, +-0.479202f,0.840256f,-0.253646f, +-0.347296f,0.912974f,-0.214157f, +-0.288381f,0.931416f,-0.222037f, +-0.393139f,0.905395f,-0.160316f, +-0.362299f,0.919254f,-0.153982f, +0.042344f,0.998556f,-0.0330675f, +0.205011f,0.978411f,0.0261187f, +-0.127573f,0.99058f,0.0497635f, +-0.371574f,0.908811f,0.189723f, +-0.216831f,0.928294f,0.302084f, +-0.0703165f,0.93644f,0.343708f, +-0.232099f,0.969924f,0.0733245f, +-0.112472f,0.99344f,-0.0206566f, +0.137846f,0.985164f,0.102232f, +0.0558694f,0.966778f,0.249437f, +-0.236804f,0.911959f,0.335045f, +-0.429918f,0.856338f,0.286105f, +-0.441526f,0.844766f,0.302366f, +-0.455345f,0.82665f,0.330622f, +-0.361376f,0.843549f,0.397281f, +-0.152799f,0.875871f,0.457714f, +-0.118894f,0.891156f,0.437842f, +-0.0896442f,0.897342f,0.432135f, +0.0157836f,0.897193f,0.441356f, +0.112602f,0.854856f,0.5065f, +0.219938f,0.859901f,0.460648f, +0.288065f,0.92641f,0.242451f, +0.293811f,0.955367f,0.0308066f, +0.390529f,0.919592f,0.0428713f, +0.271277f,0.959279f,0.0786938f, +0.217133f,0.949907f,0.22479f, +0.0884504f,0.963513f,0.252624f, +-0.0236259f,0.986232f,0.163669f, +0.0800779f,0.996646f,0.0168362f, +0.165418f,0.984838f,-0.0522657f, +0.249596f,0.968284f,-0.0113122f, +0.338274f,0.940962f,-0.0126639f, +0.305431f,0.950632f,-0.0548703f, +0.294152f,0.946987f,-0.12919f, +0.225417f,0.970184f,-0.0890507f, +-0.00713906f,0.99978f,0.0197001f, +-0.176932f,0.984214f,-0.00420403f, +-0.111846f,0.993652f,0.0120569f, +-0.1391f,0.984895f,-0.103119f, +-0.088794f,0.987668f,-0.128949f, +-0.0465185f,0.96883f,-0.243321f, +0.0250763f,0.955082f,-0.295277f, +0.0363238f,0.977208f,-0.209152f, +0.0515148f,0.981849f,-0.182534f, +-0.0181f,0.986039f,-0.165529f, +-0.1292f,0.991547f,-0.0118974f, +-0.123925f,0.986172f,0.110035f, +0.0445182f,0.949745f,-0.309843f, +-0.00147152f,0.93224f,-0.361838f, +0.114309f,0.919114f,-0.377045f, +0.249456f,0.882365f,-0.399004f, +0.318339f,0.895336f,-0.311503f, +0.245085f,0.904168f,-0.349877f, +0.0939131f,0.907167f,-0.410156f, +-0.0302879f,0.963667f,-0.265383f, +-0.13844f,0.974516f,-0.176503f, +-0.0411687f,0.989896f,-0.135687f, +-0.00628724f,0.990542f,-0.137063f, +-0.112489f,0.976976f,-0.181283f, +-0.1315f,0.967086f,-0.217836f, +-0.376506f,0.872387f,-0.311743f, +-0.531305f,0.793042f,-0.297992f, +-0.39351f,0.883689f,-0.253462f, +-0.336847f,0.927504f,-0.162083f, +-0.393317f,0.917094f,-0.0651222f, +-0.321501f,0.93797f,-0.129808f, +-0.135804f,0.972419f,-0.189625f, +0.0526632f,0.998612f,0.00112608f, +-0.194024f,0.972777f,0.126724f, +-0.436845f,0.883669f,0.168215f, +-0.311688f,0.924669f,0.218719f, +-0.0696464f,0.953993f,0.291628f, +0.0409792f,0.956788f,0.287884f, +-0.0764775f,0.990645f,0.113025f, +-0.0364568f,0.989186f,0.142066f, +-0.121833f,0.946798f,0.297877f, +-0.315082f,0.850341f,0.421476f, +-0.377714f,0.797842f,0.469873f, +-0.420842f,0.786479f,0.452043f, +-0.397492f,0.78965f,0.467389f, +-0.380055f,0.83336f,0.401334f, +-0.183142f,0.896787f,0.402781f, +-0.0888282f,0.916137f,0.3909f, +-0.0940934f,0.935116f,0.34162f, +0.00386799f,0.937503f,0.347956f, +0.10018f,0.944394f,0.313183f, +0.280679f,0.93056f,0.235113f, +0.465087f,0.85876f,0.215002f, +0.41466f,0.904302f,0.101461f, +0.364139f,0.929581f,0.0572809f, +0.242065f,0.968602f,0.0566915f, +0.117842f,0.992149f,0.0418746f, +0.148716f,0.982681f,0.110551f, +0.0959266f,0.995185f,0.0201233f, +0.176327f,0.980433f,-0.0875236f, +0.210189f,0.965141f,-0.155959f, +0.226725f,0.946611f,-0.229181f, +0.330781f,0.920607f,-0.207526f, +0.365923f,0.916599f,-0.161081f, +0.298516f,0.923753f,-0.239936f, +0.0221976f,0.976238f,-0.215559f, +-0.104515f,0.994469f,-0.0104162f, +-0.0427336f,0.998984f,-0.0143091f, +-0.0839971f,0.989572f,-0.117013f, +-0.00725244f,0.993108f,-0.116977f, +-0.0399839f,0.966361f,-0.254064f, +0.00504893f,0.980798f,-0.194961f, +-0.018473f,0.987693f,-0.155309f, +-0.0253738f,0.987423f,-0.15605f, +0.000452807f,0.989468f,-0.144748f, +-0.0811148f,0.995994f,-0.0376225f, +-0.286969f,0.957515f,0.0285449f, +-0.27524f,0.951495f,0.137481f, +0.163018f,0.971572f,-0.171676f, +0.122581f,0.955248f,-0.269212f, +0.130974f,0.917919f,-0.374527f, +0.258812f,0.917892f,-0.300816f, +0.268244f,0.908354f,-0.320839f, +0.223034f,0.911459f,-0.345686f, +0.0389184f,0.957275f,-0.28655f, +-0.140597f,0.964524f,-0.223439f, +-0.145862f,0.970122f,-0.193875f, +-0.104111f,0.974098f,-0.200733f, +-0.0208986f,0.992723f,-0.118595f, +-0.0701237f,0.994147f,-0.08218f, +-0.122604f,0.99062f,-0.0603304f, +-0.259222f,0.963912f,-0.0606481f, +-0.533518f,0.797325f,-0.282189f, +-0.48726f,0.821939f,-0.294948f, +-0.445665f,0.877532f,-0.176975f, +-0.446224f,0.888631f,-0.105925f, +-0.296073f,0.952805f,-0.0671049f, +-0.124475f,0.991773f,-0.0298685f, +-0.112069f,0.99368f,-0.00632266f, +-0.24484f,0.957295f,0.15375f, +-0.472578f,0.869701f,0.142444f, +-0.348902f,0.914252f,0.205937f, +-0.110311f,0.945787f,0.30548f, +-0.00134709f,0.941519f,0.336957f, +0.0293716f,0.928574f,0.369983f, +-0.116225f,0.946895f,0.299803f, +-0.223618f,0.889099f,0.399372f, +-0.413824f,0.817577f,0.400396f, +-0.452277f,0.775981f,0.439658f, +-0.398113f,0.749968f,0.528257f, +-0.374899f,0.784234f,0.494397f, +-0.25264f,0.860337f,0.442712f, +-0.127446f,0.920564f,0.369215f, +-0.018556f,0.935495f,0.352851f, +-0.0323754f,0.965116f,0.259814f, +0.0357851f,0.98547f,0.166039f, +0.195904f,0.976812f,0.0863732f, +0.361612f,0.932271f,0.0103395f, +0.440593f,0.897705f,0.00204446f, +0.433278f,0.895277f,0.103679f, +0.385805f,0.912456f,0.136304f, +0.326244f,0.9426f,0.0712044f, +0.139247f,0.987833f,-0.0692571f, +0.107504f,0.992792f,-0.0529845f, +0.186477f,0.981836f,-0.0349818f, +0.2261f,0.969793f,-0.0915407f, +0.319918f,0.94368f,-0.0843796f, +0.284455f,0.935881f,-0.207877f, +0.26738f,0.950319f,-0.159379f, +0.326413f,0.941309f,-0.085975f, +0.340028f,0.93811f,-0.0657985f, +0.0548427f,0.991972f,-0.113944f, +-0.195067f,0.950504f,-0.241849f, +-0.0282147f,0.982936f,-0.181769f, +-0.0838232f,0.97875f,-0.187144f, +0.0287357f,0.988886f,-0.145871f, +0.0192345f,0.984318f,-0.175351f, +-0.131262f,0.971109f,-0.199292f, +-0.0357158f,0.988874f,-0.144408f, +0.0171216f,0.989641f,-0.142542f, +-0.0610371f,0.990627f,-0.122202f, +-0.174272f,0.984646f,-0.0100664f, +-0.321779f,0.946758f,0.0104107f, +-0.391721f,0.920071f,-0.0049163f, +0.251962f,0.967049f,0.0364793f, +0.286588f,0.95799f,-0.0110494f, +0.190653f,0.96361f,-0.187371f, +0.192921f,0.95146f,-0.239803f, +0.313234f,0.932132f,-0.181696f, +0.220402f,0.968379f,-0.116899f, +0.0241557f,0.995754f,-0.0888337f, +-0.173138f,0.969731f,-0.172177f, +-0.148056f,0.974915f,-0.166191f, +-0.121802f,0.976444f,-0.178104f, +-0.134617f,0.985638f,-0.10196f, +-0.12881f,0.990748f,0.0427476f, +-0.193234f,0.979772f,0.0520324f, +-0.169584f,0.981577f,0.0880205f, +-0.37404f,0.925821f,-0.0543154f, +-0.520547f,0.83989f,-0.153672f, +-0.499517f,0.851003f,-0.162103f, +-0.4353f,0.881523f,-0.182841f, +-0.371568f,0.902946f,-0.21593f, +-0.165948f,0.980792f,-0.10251f, +-0.208618f,0.975931f,-0.0635357f, +-0.355123f,0.932394f,0.0673039f, +-0.461506f,0.884901f,0.0629418f, +-0.443442f,0.893747f,0.0676439f, +-0.18907f,0.971969f,0.139742f, +-0.0546977f,0.978989f,0.19644f, +0.0244551f,0.950588f,0.309492f, +-0.115369f,0.932748f,0.341572f, +-0.31704f,0.862788f,0.393805f, +-0.382907f,0.826411f,0.412829f, +-0.514077f,0.784716f,0.346333f, +-0.482563f,0.790781f,0.37656f, +-0.301253f,0.838125f,0.454745f, +-0.149029f,0.885064f,0.440966f, +-0.0699981f,0.93986f,0.33431f, +0.00541731f,0.96209f,0.272677f, +0.0875381f,0.972016f,0.217994f, +0.185287f,0.977612f,0.0997159f, +0.257792f,0.964794f,-0.0521163f, +0.377486f,0.923846f,-0.0633437f, +0.414459f,0.907288f,-0.071082f, +0.347034f,0.936287f,-0.0541691f, +0.366281f,0.930406f,0.0134975f, +0.42839f,0.903092f,0.0301138f, +0.236883f,0.966501f,-0.0988031f, +0.0750179f,0.986987f,-0.142226f, +0.187793f,0.976018f,-0.110108f, +0.233114f,0.960011f,-0.155038f, +0.295131f,0.944107f,-0.146833f, +0.293935f,0.952937f,-0.0742579f, +0.206131f,0.978459f,-0.0112805f, +0.26541f,0.963541f,0.0338617f, +0.315062f,0.940538f,0.126983f, +0.200639f,0.96888f,0.144968f, +-0.0482349f,0.996749f,-0.0645292f, +-0.0829471f,0.973987f,-0.210875f, +-0.0395681f,0.974449f,-0.221097f, +-0.0327152f,0.953444f,-0.299791f, +0.0198675f,0.970814f,-0.23901f, +-0.0300308f,0.967142f,-0.252456f, +-0.0212823f,0.929856f,-0.367308f, +-0.0806959f,0.938686f,-0.335198f, +-0.165388f,0.976093f,-0.141032f, +-0.248602f,0.968455f,-0.0171025f, +-0.306518f,0.951371f,0.0306604f, +-0.345042f,0.93733f,0.04856f, +0.223548f,0.968386f,-0.110699f, +0.301936f,0.947319f,-0.106873f, +0.333496f,0.936283f,-0.110248f, +0.267715f,0.952143f,-0.147486f, +0.160925f,0.980864f,-0.109589f, +0.106924f,0.990465f,0.086874f, +0.0634847f,0.989163f,0.132389f, +-0.00868593f,0.99995f,-0.00503069f, +-0.137697f,0.961899f,-0.236198f, +-0.140914f,0.964191f,-0.224676f, +-0.263955f,0.951239f,-0.159597f, +-0.23775f,0.971227f,-0.0138849f, +-0.148246f,0.985689f,0.0802536f, +-0.176705f,0.981995f,0.0667941f, +-0.283636f,0.956796f,0.0639697f, +-0.481368f,0.872896f,-0.0796102f, +-0.48359f,0.86775f,-0.114673f, +-0.410361f,0.90546f,-0.10838f, +-0.368916f,0.919839f,-0.133408f, +-0.290849f,0.948818f,-0.123086f, +-0.265473f,0.964116f,-0.001833f, +-0.375668f,0.926391f,0.025952f, +-0.457607f,0.88747f,-0.0547004f, +-0.428989f,0.902388f,-0.0407983f, +-0.246051f,0.968578f,-0.0362744f, +-0.121016f,0.990282f,0.0685327f, +-0.158606f,0.977484f,0.139173f, +-0.181659f,0.932387f,0.312498f, +-0.374645f,0.868516f,0.324533f, +-0.427131f,0.84162f,0.330508f, +-0.473189f,0.797198f,0.374923f, +-0.486417f,0.800363f,0.350452f, +-0.401778f,0.85438f,0.329557f, +-0.142919f,0.913903f,0.379941f, +0.0660554f,0.918312f,0.390308f, +0.107243f,0.947465f,0.301346f, +0.120927f,0.966132f,0.227959f, +0.280478f,0.92581f,0.253394f, +0.365712f,0.921405f,0.131406f, +0.413772f,0.910147f,-0.0206163f, +0.410674f,0.90493f,-0.111572f, +0.355567f,0.932765f,-0.0593443f, +0.345425f,0.933621f,-0.0950402f, +0.397628f,0.912297f,-0.0980078f, +0.290063f,0.956994f,0.00506036f, +0.106586f,0.994174f,-0.016042f, +0.184529f,0.978373f,-0.093465f, +0.32595f,0.937225f,-0.12396f, +0.234333f,0.947332f,-0.218287f, +0.205568f,0.971289f,-0.119751f, +0.183661f,0.977533f,-0.103434f, +0.18646f,0.974485f,-0.124944f, +0.228632f,0.97345f,-0.0111031f, +0.2372f,0.970015f,0.0529807f, +0.150741f,0.988413f,-0.0177775f, +0.0529111f,0.986113f,-0.15742f, +0.0129012f,0.976239f,-0.216311f, +0.0638914f,0.966774f,-0.247521f, +-0.013106f,0.949224f,-0.314329f, +0.00301657f,0.947335f,-0.320229f, +0.0158116f,0.945699f,-0.32466f, +-0.206362f,0.955554f,-0.21055f, +-0.363868f,0.929813f,-0.0551994f, +-0.322459f,0.943841f,0.0720059f, +-0.369143f,0.923823f,0.101411f, +-0.383217f,0.903675f,0.191093f, +0.316947f,0.930379f,-0.184227f, +0.292606f,0.932053f,-0.213681f, +0.281637f,0.95325f,-0.109518f, +0.181192f,0.981727f,-0.0581435f, +0.0846872f,0.996407f,0.000962506f, +-0.00109762f,0.999999f,0.000234158f, +0.0777708f,0.996176f,0.0398008f, +0.205791f,0.978243f,0.0262708f, +0.0568816f,0.985436f,-0.160253f, +-0.183235f,0.956309f,-0.227811f, +-0.306851f,0.928821f,-0.207686f, +-0.348537f,0.918038f,-0.189017f, +-0.243342f,0.965099f,-0.0967916f, +-0.232072f,0.972378f,-0.0249578f, +-0.190489f,0.981246f,0.0294989f, +-0.361119f,0.921084f,-0.145596f, +-0.509056f,0.842731f,-0.175118f, +-0.463553f,0.883903f,-0.0619248f, +-0.339892f,0.940435f,0.00741701f, +-0.334839f,0.939566f,-0.0714062f, +-0.350156f,0.936419f,-0.0225887f, +-0.347741f,0.937357f,0.020947f, +-0.370099f,0.928938f,-0.0100614f, +-0.438593f,0.892875f,-0.102033f, +-0.372504f,0.925425f,-0.0694955f, +-0.205666f,0.969919f,0.130228f, +-0.228734f,0.96522f,0.126612f, +-0.319826f,0.92691f,0.196338f, +-0.371568f,0.883063f,0.286595f, +-0.42486f,0.867995f,0.257059f, +-0.575514f,0.802019f,0.159839f, +-0.477155f,0.843037f,0.248216f, +-0.322215f,0.91617f,0.238347f, +-0.15776f,0.967147f,0.199344f, +0.0563134f,0.972277f,0.226949f, +0.189774f,0.959109f,0.209989f, +0.114773f,0.983426f,0.140357f, +0.195319f,0.960799f,0.196765f, +0.466014f,0.846607f,0.257076f, +0.551779f,0.823036f,0.13473f, +0.451922f,0.891695f,-0.0254353f, +0.295217f,0.951228f,-0.0895088f, +0.39575f,0.916754f,-0.0542532f, +0.335629f,0.937827f,-0.0885088f, +0.163272f,0.984979f,0.0561951f, +0.175225f,0.975709f,0.131485f, +0.276736f,0.960943f,0.00255915f, +0.374077f,0.92611f,-0.0488528f, +0.257806f,0.961501f,-0.0951409f, +0.210674f,0.973483f,-0.0891523f, +0.210996f,0.9611f,-0.178234f, +0.230566f,0.953272f,-0.195223f, +0.113631f,0.949966f,-0.290949f, +0.210906f,0.960561f,-0.181223f, +0.197018f,0.968285f,-0.153646f, +0.117662f,0.979392f,-0.164157f, +0.00452083f,0.974487f,-0.224398f, +0.0685234f,0.976453f,-0.20456f, +0.0486196f,0.979817f,-0.193895f, +-0.041249f,0.985341f,-0.165533f, +-0.0536621f,0.998462f,0.0138937f, +-0.34438f,0.936413f,0.0673216f, +-0.441342f,0.892502f,0.0930463f, +-0.35428f,0.929013f,0.106864f, +-0.394607f,0.91136f,0.117083f, +-0.495153f,0.861045f,0.115868f, +0.317163f,0.930357f,-0.183965f, +0.258032f,0.948579f,-0.183348f, +0.18786f,0.965135f,-0.182274f, +0.168177f,0.970722f,-0.171508f, +0.130487f,0.977884f,-0.163448f, +0.0391868f,0.976408f,-0.212349f, +0.0535243f,0.973465f,-0.222489f, +0.187797f,0.962281f,-0.196843f, +0.12136f,0.981658f,-0.147035f, +-0.157459f,0.973185f,-0.167681f, +-0.281843f,0.941023f,-0.18719f, +-0.339259f,0.910185f,-0.237625f, +-0.312535f,0.920718f,-0.233666f, +-0.266508f,0.952365f,-0.148237f, +-0.190534f,0.974186f,-0.121073f, +-0.276015f,0.959165f,-0.0617859f, +-0.523368f,0.852103f,0.00254573f, +-0.538f,0.84284f,-0.0133122f, +-0.352764f,0.935613f,-0.0136594f, +-0.269435f,0.962844f,-0.0183539f, +-0.350798f,0.93502f,-0.0517468f, +-0.373067f,0.922044f,-0.103225f, +-0.354323f,0.929911f,-0.0985928f, +-0.409705f,0.907488f,-0.0927797f, +-0.42852f,0.900791f,-0.070324f, +-0.329659f,0.944032f,-0.0113329f, +-0.243515f,0.962301f,0.121152f, +-0.341781f,0.918017f,0.201073f, +-0.462572f,0.875527f,0.139571f, +-0.350168f,0.914262f,0.203733f, +-0.49611f,0.864935f,0.0759072f, +-0.527565f,0.849514f,0.000485091f, +-0.337106f,0.940759f,0.0364912f, +-0.159402f,0.986691f,0.0321325f, +0.0661572f,0.997809f,-0.000201698f, +0.185343f,0.982618f,-0.0104608f, +0.145499f,0.981994f,0.120491f, +0.134704f,0.982549f,0.128264f, +0.406275f,0.89759f,0.17109f, +0.586902f,0.779785f,0.217901f, +0.565709f,0.807524f,0.166967f, +0.384632f,0.92307f,-3.36604e-005f, +0.35623f,0.932256f,-0.0632309f, +0.323525f,0.94617f,0.00968274f, +0.0775419f,0.995759f,-0.0495083f, +0.170196f,0.984289f,-0.0470022f, +0.351353f,0.935822f,-0.0280704f, +0.38341f,0.923157f,-0.0278874f, +0.285688f,0.957776f,-0.0323514f, +0.254076f,0.961785f,-0.102057f, +0.271137f,0.936424f,-0.222698f, +0.261266f,0.933845f,-0.24428f, +0.199017f,0.946563f,-0.253793f, +0.0763778f,0.960008f,-0.269355f, +0.131471f,0.985485f,-0.107402f, +0.160318f,0.984539f,-0.0705758f, +0.0961684f,0.977977f,-0.185235f, +0.0245162f,0.963631f,-0.26611f, +-0.0125968f,0.989853f,-0.141538f, +-0.234149f,0.972198f,0.00219358f, +-0.224015f,0.949544f,0.219506f, +-0.294091f,0.928539f,0.226551f, +-0.388903f,0.912184f,0.129128f, +-0.352208f,0.9324f,0.0811158f, +-0.3962f,0.915032f,0.0757807f, +-0.491066f,0.869445f,0.0540404f, +0.157697f,0.961233f,-0.226193f, +0.272083f,0.946677f,-0.172551f, +0.25297f,0.931319f,-0.262015f, +0.179666f,0.941632f,-0.284691f, +0.0998509f,0.952676f,-0.287122f, +0.0337305f,0.95661f,-0.289412f, +0.0669213f,0.956372f,-0.284383f, +0.111493f,0.948222f,-0.297395f, +0.109434f,0.973643f,-0.200107f, +-0.146896f,0.95648f,-0.252126f, +-0.266533f,0.937028f,-0.225695f, +-0.287184f,0.932451f,-0.219226f, +-0.333493f,0.906758f,-0.258015f, +-0.32756f,0.915563f,-0.233343f, +-0.294553f,0.94475f,-0.143827f, +-0.391872f,0.91893f,0.0447686f, +-0.558682f,0.823628f,0.0975275f, +-0.441987f,0.895769f,0.0473795f, +-0.31507f,0.944961f,-0.0882052f, +-0.286026f,0.950757f,-0.119373f, +-0.300544f,0.946699f,-0.115905f, +-0.336723f,0.926445f,-0.168278f, +-0.353572f,0.929204f,-0.107543f, +-0.453641f,0.88906f,-0.0615028f, +-0.438343f,0.898681f,0.0151213f, +-0.388424f,0.921475f,0.00321393f, +-0.409039f,0.909757f,0.0709235f, +-0.363684f,0.905932f,0.216843f, +-0.363969f,0.919331f,0.149522f, +-0.393196f,0.918247f,0.0470974f, +-0.399628f,0.911703f,0.0953624f, +-0.51262f,0.855967f,-0.0673815f, +-0.335242f,0.936382f,-0.103929f, +-0.0973696f,0.981557f,-0.164516f, +0.067792f,0.980923f,-0.182192f, +0.0872383f,0.996018f,-0.0183907f, +-0.00523703f,0.995218f,0.0975357f, +0.128581f,0.983098f,0.130327f, +0.373617f,0.921384f,0.107058f, +0.560261f,0.820373f,0.114439f, +0.627317f,0.771722f,0.104494f, +0.477878f,0.875076f,0.0766505f, +0.339671f,0.937101f,0.080413f, +0.338185f,0.931593f,0.133286f, +0.241006f,0.969638f,0.0414564f, +0.184566f,0.96984f,-0.159206f, +0.299844f,0.937156f,-0.178416f, +0.33645f,0.93097f,-0.14176f, +0.33978f,0.935566f,-0.0962638f, +0.338458f,0.922961f,-0.183273f, +0.376116f,0.905613f,-0.195964f, +0.229101f,0.942068f,-0.244989f, +0.179681f,0.964126f,-0.195387f, +0.0309568f,0.968834f,-0.245768f, +0.00573259f,0.975463f,-0.220088f, +0.156849f,0.977783f,-0.139061f, +0.21782f,0.972525f,-0.0821593f, +0.0218621f,0.99451f,-0.102332f, +-0.198564f,0.980065f,-0.00663249f, +-0.36267f,0.923836f,0.122463f, +-0.30382f,0.935102f,0.182419f, +-0.225949f,0.949998f,0.215522f, +-0.338005f,0.935768f,0.100459f, +-0.329518f,0.942604f,0.0540005f, +-0.353044f,0.9356f,0.00366832f, +-0.46383f,0.880375f,-0.0990046f, +0.265153f,0.963251f,-0.0429098f, +0.322279f,0.944597f,-0.0622248f, +0.315505f,0.945542f,-0.0800488f, +0.163962f,0.974749f,-0.151597f, +0.137337f,0.972433f,-0.188448f, +0.0704319f,0.957822f,-0.278599f, +0.0704671f,0.945462f,-0.318019f, +0.0908986f,0.948607f,-0.303121f, +0.035224f,0.968727f,-0.245614f, +-0.0832465f,0.983302f,-0.161824f, +-0.246429f,0.938519f,-0.241773f, +-0.316726f,0.889326f,-0.329823f, +-0.284897f,0.918994f,-0.272549f, +-0.362325f,0.886545f,-0.287677f, +-0.440048f,0.874713f,-0.203063f, +-0.497142f,0.865956f,-0.0544999f, +-0.523445f,0.849121f,-0.0707108f, +-0.401725f,0.907593f,-0.122034f, +-0.239401f,0.964528f,-0.111235f, +-0.233733f,0.958501f,-0.163231f, +-0.252964f,0.932836f,-0.256566f, +-0.367645f,0.889692f,-0.270713f, +-0.454692f,0.878935f,-0.143978f, +-0.492544f,0.866924f,-0.0764391f, +-0.481959f,0.875013f,-0.0454739f, +-0.427088f,0.903155f,0.0436767f, +-0.414523f,0.900313f,0.132691f, +-0.445145f,0.893064f,0.0654368f, +-0.272596f,0.94477f,0.181937f, +-0.346295f,0.936658f,0.0524542f, +-0.387211f,0.921676f,-0.0241059f, +-0.412405f,0.90305f,-0.120098f, +-0.307707f,0.940243f,-0.145806f, +-0.0608418f,0.995582f,-0.0715164f, +-0.0645131f,0.997917f,-0.000435129f, +-0.102008f,0.988043f,0.115607f, +0.0143588f,0.992143f,0.12428f, +0.177967f,0.984035f,-0.00139713f, +0.41001f,0.908001f,-0.0861781f, +0.552955f,0.819416f,-0.150989f, +0.604866f,0.793986f,-0.061019f, +0.412532f,0.907382f,0.080473f, +0.292095f,0.937176f,0.190737f, +0.30791f,0.927063f,0.213882f, +0.344775f,0.913992f,0.21389f, +0.356481f,0.927786f,0.110156f, +0.364153f,0.931072f,-0.0223179f, +0.345291f,0.930006f,-0.125944f, +0.351321f,0.913987f,-0.20298f, +0.3587f,0.898336f,-0.253627f, +0.30452f,0.930923f,-0.201617f, +0.2074f,0.975489f,-0.0735288f, +0.18932f,0.981882f,-0.00809888f, +0.163933f,0.983471f,-0.0768774f, +0.0155138f,0.975385f,-0.219964f, +0.0271837f,0.983796f,-0.177221f, +0.116676f,0.992898f,-0.0232359f, +-0.0753728f,0.996934f,0.0209924f, +-0.279745f,0.951672f,0.12674f, +-0.364174f,0.921867f,0.132433f, +-0.344523f,0.936581f,0.0641857f, +-0.216332f,0.972578f,0.0853902f, +-0.223892f,0.974436f,0.0186366f, +-0.28965f,0.953049f,-0.0883156f, +-0.269918f,0.95756f,-0.101108f, +-0.286201f,0.950564f,-0.120491f, +0.172976f,0.984286f,-0.0355076f, +0.24194f,0.969981f,0.0245291f, +0.324379f,0.937283f,0.127591f, +0.286811f,0.953171f,0.0959428f, +0.228455f,0.972614f,-0.0427886f, +0.182359f,0.97568f,-0.121631f, +0.113036f,0.971479f,-0.208452f, +0.0547152f,0.964701f,-0.257601f, +-0.089806f,0.977237f,-0.192205f, +-0.171631f,0.984685f,-0.0306458f, +-0.116586f,0.992809f,0.0271681f, +-0.181607f,0.981068f,-0.0672723f, +-0.351307f,0.914748f,-0.199546f, +-0.388005f,0.90325f,-0.183278f, +-0.498044f,0.847159f,-0.185132f, +-0.510366f,0.84434f,-0.163145f, +-0.479522f,0.851128f,-0.213636f, +-0.42037f,0.86671f,-0.268518f, +-0.285469f,0.932257f,-0.22227f, +-0.161107f,0.969121f,-0.186679f, +-0.183754f,0.955302f,-0.231585f, +-0.370817f,0.89935f,-0.231654f, +-0.514998f,0.83014f,-0.213645f, +-0.498206f,0.85286f,-0.156273f, +-0.539513f,0.835182f,-0.106757f, +-0.535773f,0.843208f,0.0441435f, +-0.434698f,0.878206f,0.19948f, +-0.415775f,0.89222f,0.176277f, +-0.35414f,0.920981f,0.162413f, +-0.208366f,0.953013f,0.219884f, +-0.257177f,0.962661f,0.0845243f, +-0.386488f,0.920792f,-0.0526133f, +-0.381213f,0.924327f,0.0172227f, +-0.280093f,0.955497f,0.0925905f, +-0.1219f,0.953555f,0.275451f, +-0.0595691f,0.973079f,0.222641f, +0.124431f,0.978938f,0.161854f, +0.328706f,0.943592f,0.0398269f, +0.495224f,0.863825f,-0.0925162f, +0.549494f,0.832161f,-0.0745945f, +0.445758f,0.890738f,0.0887957f, +0.286029f,0.911685f,0.294987f, +0.236342f,0.90766f,0.346837f, +0.306156f,0.900003f,0.310262f, +0.362522f,0.893707f,0.264322f, +0.407318f,0.891604f,0.197826f, +0.447705f,0.883296f,0.139101f, +0.451832f,0.890524f,0.0530504f, +0.450032f,0.892977f,-0.00796524f, +0.380264f,0.922022f,-0.0726326f, +0.220431f,0.973877f,-0.0545382f, +0.073814f,0.997262f,0.00436123f, +0.143916f,0.987825f,0.059083f, +0.242994f,0.967605f,0.068523f, +0.0793826f,0.995647f,0.0488496f, +-0.0810126f,0.994023f,0.0731786f, +0.0550609f,0.987118f,0.150223f, +-0.0403249f,0.995863f,0.0814341f, +-0.341404f,0.939899f,-0.00574405f, +-0.333197f,0.942331f,0.0315063f, +-0.270492f,0.962353f,-0.0266656f, +-0.217149f,0.973729f,-0.0685481f, +-0.150518f,0.988024f,-0.0339529f, +-0.227799f,0.970772f,-0.0755549f, +-0.30247f,0.950166f,-0.0754703f, +-0.319718f,0.946617f,-0.0411916f, +0.16825f,0.98433f,0.0527868f, +0.196178f,0.978898f,0.0572086f, +0.274186f,0.954613f,0.116347f, +0.32563f,0.930709f,0.166568f, +0.315871f,0.943308f,0.101959f, +0.191037f,0.981318f,-0.0227958f, +0.218135f,0.975914f,0.0029357f, +0.0466483f,0.982299f,-0.18142f, +-0.170175f,0.975305f,-0.140788f, +-0.258133f,0.965917f,0.0192531f, +-0.189679f,0.978131f,0.0853348f, +-0.0936377f,0.967266f,0.235858f, +-0.301926f,0.950003f,0.0795937f, +-0.345647f,0.93835f,0.00528925f, +-0.494118f,0.858314f,-0.138363f, +-0.492927f,0.860507f,-0.128646f, +-0.443878f,0.87267f,-0.203517f, +-0.398442f,0.869961f,-0.290537f, +-0.31747f,0.894846f,-0.313789f, +-0.189431f,0.934926f,-0.300049f, +-0.194231f,0.947861f,-0.252654f, +-0.355627f,0.917296f,-0.179159f, +-0.521351f,0.821848f,-0.229692f, +-0.537173f,0.817848f,-0.206322f, +-0.595314f,0.798098f,-0.0929575f, +-0.612312f,0.785394f,0.0907203f, +-0.484809f,0.839064f,0.246843f, +-0.327417f,0.875762f,0.354737f, +-0.358949f,0.909479f,0.20977f, +-0.221142f,0.943893f,0.245282f, +-0.137619f,0.956208f,0.258316f, +-0.37682f,0.920718f,0.101416f, +-0.393482f,0.900899f,0.183174f, +-0.309483f,0.930699f,0.194988f, +-0.137506f,0.96116f,0.2393f, +-0.0256175f,0.984881f,0.171327f, +0.155024f,0.972933f,0.171372f, +0.40312f,0.907825f,0.115531f, +0.491485f,0.869632f,-0.0467184f, +0.488586f,0.869843f,0.0682392f, +0.313615f,0.910806f,0.268473f, +0.190736f,0.863506f,0.466881f, +0.238952f,0.837112f,0.492083f, +0.344695f,0.840122f,0.418784f, +0.396648f,0.860615f,0.319393f, +0.456384f,0.85928f,0.230981f, +0.487857f,0.863295f,0.129295f, +0.451906f,0.891012f,0.043332f, +0.456211f,0.882737f,0.112455f, +0.397431f,0.910062f,0.117622f, +0.204941f,0.971778f,0.116821f, +0.0877111f,0.985798f,0.143208f, +0.14813f,0.986469f,0.0702648f, +0.212033f,0.976625f,0.035296f, +0.0413914f,0.99116f,0.126047f, +-0.10186f,0.970634f,0.217932f, +0.0558102f,0.971334f,0.231076f, +0.0834757f,0.981533f,0.172117f, +-0.293392f,0.955612f,-0.0269471f, +-0.339064f,0.938377f,-0.0669636f, +-0.232942f,0.969004f,-0.0822698f, +-0.249298f,0.960887f,-0.120613f, +-0.178309f,0.98375f,-0.0210319f, +-0.23671f,0.971566f,0.00516088f, +-0.322203f,0.944986f,0.0564443f, +-0.359276f,0.929551f,0.0827968f, +}; + +btScalar Landscape06Tex[] = { +0.0f,0.0078125f, +0.0f,0.0f, +0.0078125f,0.0078125f, +0.0078125f,0.0f, +0.015625f,0.0078125f, +0.015625f,0.0f, +0.0234375f,0.0078125f, +0.0234375f,0.0f, +0.03125f,0.0078125f, +0.03125f,0.0f, +0.0390625f,0.0078125f, +0.0390625f,0.0f, +0.046875f,0.0078125f, +0.046875f,0.0f, +0.0546875f,0.0078125f, +0.0546875f,0.0f, +0.0625f,0.0078125f, +0.0625f,0.0f, +0.0703125f,0.0078125f, +0.0703125f,0.0f, +0.078125f,0.0078125f, +0.078125f,0.0f, +0.0859375f,0.0078125f, +0.0859375f,0.0f, +0.09375f,0.0078125f, +0.09375f,0.0f, +0.101563f,0.0078125f, +0.101563f,0.0f, +0.109375f,0.0078125f, +0.109375f,0.0f, +0.117188f,0.0078125f, +0.117188f,0.0f, +0.125f,0.0078125f, +0.125f,0.0f, +0.132813f,0.0078125f, +0.132813f,0.0f, +0.140625f,0.0078125f, +0.140625f,0.0f, +0.148438f,0.0078125f, +0.148438f,0.0f, +0.15625f,0.0078125f, +0.15625f,0.0f, +0.164063f,0.0078125f, +0.164063f,0.0f, +0.171875f,0.0078125f, +0.171875f,0.0f, +0.179688f,0.0078125f, +0.179688f,0.0f, +0.1875f,0.0078125f, +0.1875f,0.0f, +0.195313f,0.0078125f, +0.195313f,0.0f, +0.203125f,0.0078125f, +0.203125f,0.0f, +0.210938f,0.0078125f, +0.210938f,0.0f, +0.21875f,0.0078125f, +0.21875f,0.0f, +0.226563f,0.0078125f, +0.226563f,0.0f, +0.234375f,0.0078125f, +0.234375f,0.0f, +0.242188f,0.0078125f, +0.242188f,0.0f, +0.25f,0.0078125f, +0.25f,0.0f, +0.257813f,0.0078125f, +0.257813f,0.0f, +0.265625f,0.0078125f, +0.265625f,0.0f, +0.273438f,0.0078125f, +0.273438f,0.0f, +0.28125f,0.0078125f, +0.28125f,0.0f, +0.289063f,0.0078125f, +0.289063f,0.0f, +0.296875f,0.0078125f, +0.296875f,0.0f, +0.304688f,0.0078125f, +0.304688f,0.0f, +0.3125f,0.0078125f, +0.3125f,0.0f, +0.320313f,0.0078125f, +0.320313f,0.0f, +0.328125f,0.0078125f, +0.328125f,0.0f, +0.335938f,0.0078125f, +0.335938f,0.0f, +0.34375f,0.0078125f, +0.34375f,0.0f, +0.351563f,0.0078125f, +0.351563f,0.0f, +0.359375f,0.0078125f, +0.359375f,0.0f, +0.367188f,0.0078125f, +0.367188f,0.0f, +0.375f,0.0078125f, +0.375f,0.0f, +0.382813f,0.0078125f, +0.382813f,0.0f, +0.390625f,0.0078125f, +0.390625f,0.0f, +0.398438f,0.0078125f, +0.398438f,0.0f, +0.40625f,0.0078125f, +0.40625f,0.0f, +0.414063f,0.0078125f, +0.414063f,0.0f, +0.421875f,0.0078125f, +0.421875f,0.0f, +0.429688f,0.0078125f, +0.429688f,0.0f, +0.4375f,0.0078125f, +0.4375f,0.0f, +0.445313f,0.0078125f, +0.445313f,0.0f, +0.453125f,0.0078125f, +0.453125f,0.0f, +0.460938f,0.0078125f, +0.460938f,0.0f, +0.46875f,0.0078125f, +0.46875f,0.0f, +0.476563f,0.0078125f, +0.476563f,0.0f, +0.484375f,0.0078125f, +0.484375f,0.0f, +0.492188f,0.0078125f, +0.492188f,0.0f, +0.5f,0.0078125f, +0.5f,0.0f, +0.507813f,0.0078125f, +0.507813f,0.0f, +0.0f,0.015625f, +0.0078125f,0.015625f, +0.015625f,0.015625f, +0.0234375f,0.015625f, +0.03125f,0.015625f, +0.0390625f,0.015625f, +0.046875f,0.015625f, +0.0546875f,0.015625f, +0.0625f,0.015625f, +0.0703125f,0.015625f, +0.078125f,0.015625f, +0.0859375f,0.015625f, +0.09375f,0.015625f, +0.101563f,0.015625f, +0.109375f,0.015625f, +0.117188f,0.015625f, +0.125f,0.015625f, +0.132813f,0.015625f, +0.140625f,0.015625f, +0.148438f,0.015625f, +0.15625f,0.015625f, +0.164063f,0.015625f, +0.171875f,0.015625f, +0.179688f,0.015625f, +0.1875f,0.015625f, +0.195313f,0.015625f, +0.203125f,0.015625f, +0.210938f,0.015625f, +0.21875f,0.015625f, +0.226563f,0.015625f, +0.234375f,0.015625f, +0.242188f,0.015625f, +0.25f,0.015625f, +0.257813f,0.015625f, +0.265625f,0.015625f, +0.273438f,0.015625f, +0.28125f,0.015625f, +0.289063f,0.015625f, +0.296875f,0.015625f, +0.304688f,0.015625f, +0.3125f,0.015625f, +0.320313f,0.015625f, +0.328125f,0.015625f, +0.335938f,0.015625f, +0.34375f,0.015625f, +0.351563f,0.015625f, +0.359375f,0.015625f, +0.367188f,0.015625f, +0.375f,0.015625f, +0.382813f,0.015625f, +0.390625f,0.015625f, +0.398438f,0.015625f, +0.40625f,0.015625f, +0.414063f,0.015625f, +0.421875f,0.015625f, +0.429688f,0.015625f, +0.4375f,0.015625f, +0.445313f,0.015625f, +0.453125f,0.015625f, +0.460938f,0.015625f, +0.46875f,0.015625f, +0.476563f,0.015625f, +0.484375f,0.015625f, +0.492188f,0.015625f, +0.5f,0.015625f, +0.507813f,0.015625f, +0.0f,0.0234375f, +0.0078125f,0.0234375f, +0.015625f,0.0234375f, +0.0234375f,0.0234375f, +0.03125f,0.0234375f, +0.0390625f,0.0234375f, +0.046875f,0.0234375f, +0.0546875f,0.0234375f, +0.0625f,0.0234375f, +0.0703125f,0.0234375f, +0.078125f,0.0234375f, +0.0859375f,0.0234375f, +0.09375f,0.0234375f, +0.101563f,0.0234375f, +0.109375f,0.0234375f, +0.117188f,0.0234375f, +0.125f,0.0234375f, +0.132813f,0.0234375f, +0.140625f,0.0234375f, +0.148438f,0.0234375f, +0.15625f,0.0234375f, +0.164063f,0.0234375f, +0.171875f,0.0234375f, +0.179688f,0.0234375f, +0.1875f,0.0234375f, +0.195313f,0.0234375f, +0.203125f,0.0234375f, +0.210938f,0.0234375f, +0.21875f,0.0234375f, +0.226563f,0.0234375f, +0.234375f,0.0234375f, +0.242188f,0.0234375f, +0.25f,0.0234375f, +0.257813f,0.0234375f, +0.265625f,0.0234375f, +0.273438f,0.0234375f, +0.28125f,0.0234375f, +0.289063f,0.0234375f, +0.296875f,0.0234375f, +0.304688f,0.0234375f, +0.3125f,0.0234375f, +0.320313f,0.0234375f, +0.328125f,0.0234375f, +0.335938f,0.0234375f, +0.34375f,0.0234375f, +0.351563f,0.0234375f, +0.359375f,0.0234375f, +0.367188f,0.0234375f, +0.375f,0.0234375f, +0.382813f,0.0234375f, +0.390625f,0.0234375f, +0.398438f,0.0234375f, +0.40625f,0.0234375f, +0.414063f,0.0234375f, +0.421875f,0.0234375f, +0.429688f,0.0234375f, +0.4375f,0.0234375f, +0.445313f,0.0234375f, +0.453125f,0.0234375f, +0.460938f,0.0234375f, +0.46875f,0.0234375f, +0.476563f,0.0234375f, +0.484375f,0.0234375f, +0.492188f,0.0234375f, +0.5f,0.0234375f, +0.507813f,0.0234375f, +0.0f,0.03125f, +0.0078125f,0.03125f, +0.015625f,0.03125f, +0.0234375f,0.03125f, +0.03125f,0.03125f, +0.0390625f,0.03125f, +0.046875f,0.03125f, +0.0546875f,0.03125f, +0.0625f,0.03125f, +0.0703125f,0.03125f, +0.078125f,0.03125f, +0.0859375f,0.03125f, +0.09375f,0.03125f, +0.101563f,0.03125f, +0.109375f,0.03125f, +0.117188f,0.03125f, +0.125f,0.03125f, +0.132813f,0.03125f, +0.140625f,0.03125f, +0.148438f,0.03125f, +0.15625f,0.03125f, +0.164063f,0.03125f, +0.171875f,0.03125f, +0.179688f,0.03125f, +0.1875f,0.03125f, +0.195313f,0.03125f, +0.203125f,0.03125f, +0.210938f,0.03125f, +0.21875f,0.03125f, +0.226563f,0.03125f, +0.234375f,0.03125f, +0.242188f,0.03125f, +0.25f,0.03125f, +0.257813f,0.03125f, +0.265625f,0.03125f, +0.273438f,0.03125f, +0.28125f,0.03125f, +0.289063f,0.03125f, +0.296875f,0.03125f, +0.304688f,0.03125f, +0.3125f,0.03125f, +0.320313f,0.03125f, +0.328125f,0.03125f, +0.335938f,0.03125f, +0.34375f,0.03125f, +0.351563f,0.03125f, +0.359375f,0.03125f, +0.367188f,0.03125f, +0.375f,0.03125f, +0.382813f,0.03125f, +0.390625f,0.03125f, +0.398438f,0.03125f, +0.40625f,0.03125f, +0.414063f,0.03125f, +0.421875f,0.03125f, +0.429688f,0.03125f, +0.4375f,0.03125f, +0.445313f,0.03125f, +0.453125f,0.03125f, +0.460938f,0.03125f, +0.46875f,0.03125f, +0.476563f,0.03125f, +0.484375f,0.03125f, +0.492188f,0.03125f, +0.5f,0.03125f, +0.507813f,0.03125f, +0.0f,0.0390625f, +0.0078125f,0.0390625f, +0.015625f,0.0390625f, +0.0234375f,0.0390625f, +0.03125f,0.0390625f, +0.0390625f,0.0390625f, +0.046875f,0.0390625f, +0.0546875f,0.0390625f, +0.0625f,0.0390625f, +0.0703125f,0.0390625f, +0.078125f,0.0390625f, +0.0859375f,0.0390625f, +0.09375f,0.0390625f, +0.101563f,0.0390625f, +0.109375f,0.0390625f, +0.117188f,0.0390625f, +0.125f,0.0390625f, +0.132813f,0.0390625f, +0.140625f,0.0390625f, +0.148438f,0.0390625f, +0.15625f,0.0390625f, +0.164063f,0.0390625f, +0.171875f,0.0390625f, +0.179688f,0.0390625f, +0.1875f,0.0390625f, +0.195313f,0.0390625f, +0.203125f,0.0390625f, +0.210938f,0.0390625f, +0.21875f,0.0390625f, +0.226563f,0.0390625f, +0.234375f,0.0390625f, +0.242188f,0.0390625f, +0.25f,0.0390625f, +0.257813f,0.0390625f, +0.265625f,0.0390625f, +0.273438f,0.0390625f, +0.28125f,0.0390625f, +0.289063f,0.0390625f, +0.296875f,0.0390625f, +0.304688f,0.0390625f, +0.3125f,0.0390625f, +0.320313f,0.0390625f, +0.328125f,0.0390625f, +0.335938f,0.0390625f, +0.34375f,0.0390625f, +0.351563f,0.0390625f, +0.359375f,0.0390625f, +0.367188f,0.0390625f, +0.375f,0.0390625f, +0.382813f,0.0390625f, +0.390625f,0.0390625f, +0.398438f,0.0390625f, +0.40625f,0.0390625f, +0.414063f,0.0390625f, +0.421875f,0.0390625f, +0.429688f,0.0390625f, +0.4375f,0.0390625f, +0.445313f,0.0390625f, +0.453125f,0.0390625f, +0.460938f,0.0390625f, +0.46875f,0.0390625f, +0.476563f,0.0390625f, +0.484375f,0.0390625f, +0.492188f,0.0390625f, +0.5f,0.0390625f, +0.507813f,0.0390625f, +0.0f,0.046875f, +0.0078125f,0.046875f, +0.015625f,0.046875f, +0.0234375f,0.046875f, +0.03125f,0.046875f, +0.0390625f,0.046875f, +0.046875f,0.046875f, +0.0546875f,0.046875f, +0.0625f,0.046875f, +0.0703125f,0.046875f, +0.078125f,0.046875f, +0.0859375f,0.046875f, +0.09375f,0.046875f, +0.101563f,0.046875f, +0.109375f,0.046875f, +0.117188f,0.046875f, +0.125f,0.046875f, +0.132813f,0.046875f, +0.140625f,0.046875f, +0.148438f,0.046875f, +0.15625f,0.046875f, +0.164063f,0.046875f, +0.171875f,0.046875f, +0.179688f,0.046875f, +0.1875f,0.046875f, +0.195313f,0.046875f, +0.203125f,0.046875f, +0.210938f,0.046875f, +0.21875f,0.046875f, +0.226563f,0.046875f, +0.234375f,0.046875f, +0.242188f,0.046875f, +0.25f,0.046875f, +0.257813f,0.046875f, +0.265625f,0.046875f, +0.273438f,0.046875f, +0.28125f,0.046875f, +0.289063f,0.046875f, +0.296875f,0.046875f, +0.304688f,0.046875f, +0.3125f,0.046875f, +0.320313f,0.046875f, +0.328125f,0.046875f, +0.335938f,0.046875f, +0.34375f,0.046875f, +0.351563f,0.046875f, +0.359375f,0.046875f, +0.367188f,0.046875f, +0.375f,0.046875f, +0.382813f,0.046875f, +0.390625f,0.046875f, +0.398438f,0.046875f, +0.40625f,0.046875f, +0.414063f,0.046875f, +0.421875f,0.046875f, +0.429688f,0.046875f, +0.4375f,0.046875f, +0.445313f,0.046875f, +0.453125f,0.046875f, +0.460938f,0.046875f, +0.46875f,0.046875f, +0.476563f,0.046875f, +0.484375f,0.046875f, +0.492188f,0.046875f, +0.5f,0.046875f, +0.507813f,0.046875f, +0.0f,0.0546875f, +0.0078125f,0.0546875f, +0.015625f,0.0546875f, +0.0234375f,0.0546875f, +0.03125f,0.0546875f, +0.0390625f,0.0546875f, +0.046875f,0.0546875f, +0.0546875f,0.0546875f, +0.0625f,0.0546875f, +0.0703125f,0.0546875f, +0.078125f,0.0546875f, +0.0859375f,0.0546875f, +0.09375f,0.0546875f, +0.101563f,0.0546875f, +0.109375f,0.0546875f, +0.117188f,0.0546875f, +0.125f,0.0546875f, +0.132813f,0.0546875f, +0.140625f,0.0546875f, +0.148438f,0.0546875f, +0.15625f,0.0546875f, +0.164063f,0.0546875f, +0.171875f,0.0546875f, +0.179688f,0.0546875f, +0.1875f,0.0546875f, +0.195313f,0.0546875f, +0.203125f,0.0546875f, +0.210938f,0.0546875f, +0.21875f,0.0546875f, +0.226563f,0.0546875f, +0.234375f,0.0546875f, +0.242188f,0.0546875f, +0.25f,0.0546875f, +0.257813f,0.0546875f, +0.265625f,0.0546875f, +0.273438f,0.0546875f, +0.28125f,0.0546875f, +0.289063f,0.0546875f, +0.296875f,0.0546875f, +0.304688f,0.0546875f, +0.3125f,0.0546875f, +0.320313f,0.0546875f, +0.328125f,0.0546875f, +0.335938f,0.0546875f, +0.34375f,0.0546875f, +0.351563f,0.0546875f, +0.359375f,0.0546875f, +0.367188f,0.0546875f, +0.375f,0.0546875f, +0.382813f,0.0546875f, +0.390625f,0.0546875f, +0.398438f,0.0546875f, +0.40625f,0.0546875f, +0.414063f,0.0546875f, +0.421875f,0.0546875f, +0.429688f,0.0546875f, +0.4375f,0.0546875f, +0.445313f,0.0546875f, +0.453125f,0.0546875f, +0.460938f,0.0546875f, +0.46875f,0.0546875f, +0.476563f,0.0546875f, +0.484375f,0.0546875f, +0.492188f,0.0546875f, +0.5f,0.0546875f, +0.507813f,0.0546875f, +0.0f,0.0625f, +0.0078125f,0.0625f, +0.015625f,0.0625f, +0.0234375f,0.0625f, +0.03125f,0.0625f, +0.0390625f,0.0625f, +0.046875f,0.0625f, +0.0546875f,0.0625f, +0.0625f,0.0625f, +0.0703125f,0.0625f, +0.078125f,0.0625f, +0.0859375f,0.0625f, +0.09375f,0.0625f, +0.101563f,0.0625f, +0.109375f,0.0625f, +0.117188f,0.0625f, +0.125f,0.0625f, +0.132813f,0.0625f, +0.140625f,0.0625f, +0.148438f,0.0625f, +0.15625f,0.0625f, +0.164063f,0.0625f, +0.171875f,0.0625f, +0.179688f,0.0625f, +0.1875f,0.0625f, +0.195313f,0.0625f, +0.203125f,0.0625f, +0.210938f,0.0625f, +0.21875f,0.0625f, +0.226563f,0.0625f, +0.234375f,0.0625f, +0.242188f,0.0625f, +0.25f,0.0625f, +0.257813f,0.0625f, +0.265625f,0.0625f, +0.273438f,0.0625f, +0.28125f,0.0625f, +0.289063f,0.0625f, +0.296875f,0.0625f, +0.304688f,0.0625f, +0.3125f,0.0625f, +0.320313f,0.0625f, +0.328125f,0.0625f, +0.335938f,0.0625f, +0.34375f,0.0625f, +0.351563f,0.0625f, +0.359375f,0.0625f, +0.367188f,0.0625f, +0.375f,0.0625f, +0.382813f,0.0625f, +0.390625f,0.0625f, +0.398438f,0.0625f, +0.40625f,0.0625f, +0.414063f,0.0625f, +0.421875f,0.0625f, +0.429688f,0.0625f, +0.4375f,0.0625f, +0.445313f,0.0625f, +0.453125f,0.0625f, +0.460938f,0.0625f, +0.46875f,0.0625f, +0.476563f,0.0625f, +0.484375f,0.0625f, +0.492188f,0.0625f, +0.5f,0.0625f, +0.507813f,0.0625f, +0.0f,0.0703125f, +0.0078125f,0.0703125f, +0.015625f,0.0703125f, +0.0234375f,0.0703125f, +0.03125f,0.0703125f, +0.0390625f,0.0703125f, +0.046875f,0.0703125f, +0.0546875f,0.0703125f, +0.0625f,0.0703125f, +0.0703125f,0.0703125f, +0.078125f,0.0703125f, +0.0859375f,0.0703125f, +0.09375f,0.0703125f, +0.101563f,0.0703125f, +0.109375f,0.0703125f, +0.117188f,0.0703125f, +0.125f,0.0703125f, +0.132813f,0.0703125f, +0.140625f,0.0703125f, +0.148438f,0.0703125f, +0.15625f,0.0703125f, +0.164063f,0.0703125f, +0.171875f,0.0703125f, +0.179688f,0.0703125f, +0.1875f,0.0703125f, +0.195313f,0.0703125f, +0.203125f,0.0703125f, +0.210938f,0.0703125f, +0.21875f,0.0703125f, +0.226563f,0.0703125f, +0.234375f,0.0703125f, +0.242188f,0.0703125f, +0.25f,0.0703125f, +0.257813f,0.0703125f, +0.265625f,0.0703125f, +0.273438f,0.0703125f, +0.28125f,0.0703125f, +0.289063f,0.0703125f, +0.296875f,0.0703125f, +0.304688f,0.0703125f, +0.3125f,0.0703125f, +0.320313f,0.0703125f, +0.328125f,0.0703125f, +0.335938f,0.0703125f, +0.34375f,0.0703125f, +0.351563f,0.0703125f, +0.359375f,0.0703125f, +0.367188f,0.0703125f, +0.375f,0.0703125f, +0.382813f,0.0703125f, +0.390625f,0.0703125f, +0.398438f,0.0703125f, +0.40625f,0.0703125f, +0.414063f,0.0703125f, +0.421875f,0.0703125f, +0.429688f,0.0703125f, +0.4375f,0.0703125f, +0.445313f,0.0703125f, +0.453125f,0.0703125f, +0.460938f,0.0703125f, +0.46875f,0.0703125f, +0.476563f,0.0703125f, +0.484375f,0.0703125f, +0.492188f,0.0703125f, +0.5f,0.0703125f, +0.507813f,0.0703125f, +0.0f,0.078125f, +0.0078125f,0.078125f, +0.015625f,0.078125f, +0.0234375f,0.078125f, +0.03125f,0.078125f, +0.0390625f,0.078125f, +0.046875f,0.078125f, +0.0546875f,0.078125f, +0.0625f,0.078125f, +0.0703125f,0.078125f, +0.078125f,0.078125f, +0.0859375f,0.078125f, +0.09375f,0.078125f, +0.101563f,0.078125f, +0.109375f,0.078125f, +0.117188f,0.078125f, +0.125f,0.078125f, +0.132813f,0.078125f, +0.140625f,0.078125f, +0.148438f,0.078125f, +0.15625f,0.078125f, +0.164063f,0.078125f, +0.171875f,0.078125f, +0.179688f,0.078125f, +0.1875f,0.078125f, +0.195313f,0.078125f, +0.203125f,0.078125f, +0.210938f,0.078125f, +0.21875f,0.078125f, +0.226563f,0.078125f, +0.234375f,0.078125f, +0.242188f,0.078125f, +0.25f,0.078125f, +0.257813f,0.078125f, +0.265625f,0.078125f, +0.273438f,0.078125f, +0.28125f,0.078125f, +0.289063f,0.078125f, +0.296875f,0.078125f, +0.304688f,0.078125f, +0.3125f,0.078125f, +0.320313f,0.078125f, +0.328125f,0.078125f, +0.335938f,0.078125f, +0.34375f,0.078125f, +0.351563f,0.078125f, +0.359375f,0.078125f, +0.367188f,0.078125f, +0.375f,0.078125f, +0.382813f,0.078125f, +0.390625f,0.078125f, +0.398438f,0.078125f, +0.40625f,0.078125f, +0.414063f,0.078125f, +0.421875f,0.078125f, +0.429688f,0.078125f, +0.4375f,0.078125f, +0.445313f,0.078125f, +0.453125f,0.078125f, +0.460938f,0.078125f, +0.46875f,0.078125f, +0.476563f,0.078125f, +0.484375f,0.078125f, +0.492188f,0.078125f, +0.5f,0.078125f, +0.507813f,0.078125f, +0.0f,0.0859375f, +0.0078125f,0.0859375f, +0.015625f,0.0859375f, +0.0234375f,0.0859375f, +0.03125f,0.0859375f, +0.0390625f,0.0859375f, +0.046875f,0.0859375f, +0.0546875f,0.0859375f, +0.0625f,0.0859375f, +0.0703125f,0.0859375f, +0.078125f,0.0859375f, +0.0859375f,0.0859375f, +0.09375f,0.0859375f, +0.101563f,0.0859375f, +0.109375f,0.0859375f, +0.117188f,0.0859375f, +0.125f,0.0859375f, +0.132813f,0.0859375f, +0.140625f,0.0859375f, +0.148438f,0.0859375f, +0.15625f,0.0859375f, +0.164063f,0.0859375f, +0.171875f,0.0859375f, +0.179688f,0.0859375f, +0.1875f,0.0859375f, +0.195313f,0.0859375f, +0.203125f,0.0859375f, +0.210938f,0.0859375f, +0.21875f,0.0859375f, +0.226563f,0.0859375f, +0.234375f,0.0859375f, +0.242188f,0.0859375f, +0.25f,0.0859375f, +0.257813f,0.0859375f, +0.265625f,0.0859375f, +0.273438f,0.0859375f, +0.28125f,0.0859375f, +0.289063f,0.0859375f, +0.296875f,0.0859375f, +0.304688f,0.0859375f, +0.3125f,0.0859375f, +0.320313f,0.0859375f, +0.328125f,0.0859375f, +0.335938f,0.0859375f, +0.34375f,0.0859375f, +0.351563f,0.0859375f, +0.359375f,0.0859375f, +0.367188f,0.0859375f, +0.375f,0.0859375f, +0.382813f,0.0859375f, +0.390625f,0.0859375f, +0.398438f,0.0859375f, +0.40625f,0.0859375f, +0.414063f,0.0859375f, +0.421875f,0.0859375f, +0.429688f,0.0859375f, +0.4375f,0.0859375f, +0.445313f,0.0859375f, +0.453125f,0.0859375f, +0.460938f,0.0859375f, +0.46875f,0.0859375f, +0.476563f,0.0859375f, +0.484375f,0.0859375f, +0.492188f,0.0859375f, +0.5f,0.0859375f, +0.507813f,0.0859375f, +0.0f,0.09375f, +0.0078125f,0.09375f, +0.015625f,0.09375f, +0.0234375f,0.09375f, +0.03125f,0.09375f, +0.0390625f,0.09375f, +0.046875f,0.09375f, +0.0546875f,0.09375f, +0.0625f,0.09375f, +0.0703125f,0.09375f, +0.078125f,0.09375f, +0.0859375f,0.09375f, +0.09375f,0.09375f, +0.101563f,0.09375f, +0.109375f,0.09375f, +0.117188f,0.09375f, +0.125f,0.09375f, +0.132813f,0.09375f, +0.140625f,0.09375f, +0.148438f,0.09375f, +0.15625f,0.09375f, +0.164063f,0.09375f, +0.171875f,0.09375f, +0.179688f,0.09375f, +0.1875f,0.09375f, +0.195313f,0.09375f, +0.203125f,0.09375f, +0.210938f,0.09375f, +0.21875f,0.09375f, +0.226563f,0.09375f, +0.234375f,0.09375f, +0.242188f,0.09375f, +0.25f,0.09375f, +0.257813f,0.09375f, +0.265625f,0.09375f, +0.273438f,0.09375f, +0.28125f,0.09375f, +0.289063f,0.09375f, +0.296875f,0.09375f, +0.304688f,0.09375f, +0.3125f,0.09375f, +0.320313f,0.09375f, +0.328125f,0.09375f, +0.335938f,0.09375f, +0.34375f,0.09375f, +0.351563f,0.09375f, +0.359375f,0.09375f, +0.367188f,0.09375f, +0.375f,0.09375f, +0.382813f,0.09375f, +0.390625f,0.09375f, +0.398438f,0.09375f, +0.40625f,0.09375f, +0.414063f,0.09375f, +0.421875f,0.09375f, +0.429688f,0.09375f, +0.4375f,0.09375f, +0.445313f,0.09375f, +0.453125f,0.09375f, +0.460938f,0.09375f, +0.46875f,0.09375f, +0.476563f,0.09375f, +0.484375f,0.09375f, +0.492188f,0.09375f, +0.5f,0.09375f, +0.507813f,0.09375f, +0.0f,0.101563f, +0.0078125f,0.101563f, +0.015625f,0.101563f, +0.0234375f,0.101563f, +0.03125f,0.101563f, +0.0390625f,0.101563f, +0.046875f,0.101563f, +0.0546875f,0.101563f, +0.0625f,0.101563f, +0.0703125f,0.101563f, +0.078125f,0.101563f, +0.0859375f,0.101563f, +0.09375f,0.101563f, +0.101563f,0.101563f, +0.109375f,0.101563f, +0.117188f,0.101563f, +0.125f,0.101563f, +0.132813f,0.101563f, +0.140625f,0.101563f, +0.148438f,0.101563f, +0.15625f,0.101563f, +0.164063f,0.101563f, +0.171875f,0.101563f, +0.179688f,0.101563f, +0.1875f,0.101563f, +0.195313f,0.101563f, +0.203125f,0.101563f, +0.210938f,0.101563f, +0.21875f,0.101563f, +0.226563f,0.101563f, +0.234375f,0.101563f, +0.242188f,0.101563f, +0.25f,0.101563f, +0.257813f,0.101563f, +0.265625f,0.101563f, +0.273438f,0.101563f, +0.28125f,0.101563f, +0.289063f,0.101563f, +0.296875f,0.101563f, +0.304688f,0.101563f, +0.3125f,0.101563f, +0.320313f,0.101563f, +0.328125f,0.101563f, +0.335938f,0.101563f, +0.34375f,0.101563f, +0.351563f,0.101563f, +0.359375f,0.101563f, +0.367188f,0.101563f, +0.375f,0.101563f, +0.382813f,0.101563f, +0.390625f,0.101563f, +0.398438f,0.101563f, +0.40625f,0.101563f, +0.414063f,0.101563f, +0.421875f,0.101563f, +0.429688f,0.101563f, +0.4375f,0.101563f, +0.445313f,0.101563f, +0.453125f,0.101563f, +0.460938f,0.101563f, +0.46875f,0.101563f, +0.476563f,0.101563f, +0.484375f,0.101563f, +0.492188f,0.101563f, +0.5f,0.101563f, +0.507813f,0.101563f, +0.0f,0.109375f, +0.0078125f,0.109375f, +0.015625f,0.109375f, +0.0234375f,0.109375f, +0.03125f,0.109375f, +0.0390625f,0.109375f, +0.046875f,0.109375f, +0.0546875f,0.109375f, +0.0625f,0.109375f, +0.0703125f,0.109375f, +0.078125f,0.109375f, +0.0859375f,0.109375f, +0.09375f,0.109375f, +0.101563f,0.109375f, +0.109375f,0.109375f, +0.117188f,0.109375f, +0.125f,0.109375f, +0.132813f,0.109375f, +0.140625f,0.109375f, +0.148438f,0.109375f, +0.15625f,0.109375f, +0.164063f,0.109375f, +0.171875f,0.109375f, +0.179688f,0.109375f, +0.1875f,0.109375f, +0.195313f,0.109375f, +0.203125f,0.109375f, +0.210938f,0.109375f, +0.21875f,0.109375f, +0.226563f,0.109375f, +0.234375f,0.109375f, +0.242188f,0.109375f, +0.25f,0.109375f, +0.257813f,0.109375f, +0.265625f,0.109375f, +0.273438f,0.109375f, +0.28125f,0.109375f, +0.289063f,0.109375f, +0.296875f,0.109375f, +0.304688f,0.109375f, +0.3125f,0.109375f, +0.320313f,0.109375f, +0.328125f,0.109375f, +0.335938f,0.109375f, +0.34375f,0.109375f, +0.351563f,0.109375f, +0.359375f,0.109375f, +0.367188f,0.109375f, +0.375f,0.109375f, +0.382813f,0.109375f, +0.390625f,0.109375f, +0.398438f,0.109375f, +0.40625f,0.109375f, +0.414063f,0.109375f, +0.421875f,0.109375f, +0.429688f,0.109375f, +0.4375f,0.109375f, +0.445313f,0.109375f, +0.453125f,0.109375f, +0.460938f,0.109375f, +0.46875f,0.109375f, +0.476563f,0.109375f, +0.484375f,0.109375f, +0.492188f,0.109375f, +0.5f,0.109375f, +0.507813f,0.109375f, +0.0f,0.117188f, +0.0078125f,0.117188f, +0.015625f,0.117188f, +0.0234375f,0.117188f, +0.03125f,0.117188f, +0.0390625f,0.117188f, +0.046875f,0.117188f, +0.0546875f,0.117188f, +0.0625f,0.117188f, +0.0703125f,0.117188f, +0.078125f,0.117188f, +0.0859375f,0.117188f, +0.09375f,0.117188f, +0.101563f,0.117188f, +0.109375f,0.117188f, +0.117188f,0.117188f, +0.125f,0.117188f, +0.132813f,0.117188f, +0.140625f,0.117188f, +0.148438f,0.117188f, +0.15625f,0.117188f, +0.164063f,0.117188f, +0.171875f,0.117188f, +0.179688f,0.117188f, +0.1875f,0.117188f, +0.195313f,0.117188f, +0.203125f,0.117188f, +0.210938f,0.117188f, +0.21875f,0.117188f, +0.226563f,0.117188f, +0.234375f,0.117188f, +0.242188f,0.117188f, +0.25f,0.117188f, +0.257813f,0.117188f, +0.265625f,0.117188f, +0.273438f,0.117188f, +0.28125f,0.117188f, +0.289063f,0.117188f, +0.296875f,0.117188f, +0.304688f,0.117188f, +0.3125f,0.117188f, +0.320313f,0.117188f, +0.328125f,0.117188f, +0.335938f,0.117188f, +0.34375f,0.117188f, +0.351563f,0.117188f, +0.359375f,0.117188f, +0.367188f,0.117188f, +0.375f,0.117188f, +0.382813f,0.117188f, +0.390625f,0.117188f, +0.398438f,0.117188f, +0.40625f,0.117188f, +0.414063f,0.117188f, +0.421875f,0.117188f, +0.429688f,0.117188f, +0.4375f,0.117188f, +0.445313f,0.117188f, +0.453125f,0.117188f, +0.460938f,0.117188f, +0.46875f,0.117188f, +0.476563f,0.117188f, +0.484375f,0.117188f, +0.492188f,0.117188f, +0.5f,0.117188f, +0.507813f,0.117188f, +0.0f,0.125f, +0.0078125f,0.125f, +0.015625f,0.125f, +0.0234375f,0.125f, +0.03125f,0.125f, +0.0390625f,0.125f, +0.046875f,0.125f, +0.0546875f,0.125f, +0.0625f,0.125f, +0.0703125f,0.125f, +0.078125f,0.125f, +0.0859375f,0.125f, +0.09375f,0.125f, +0.101563f,0.125f, +0.109375f,0.125f, +0.117188f,0.125f, +0.125f,0.125f, +0.132813f,0.125f, +0.140625f,0.125f, +0.148438f,0.125f, +0.15625f,0.125f, +0.164063f,0.125f, +0.171875f,0.125f, +0.179688f,0.125f, +0.1875f,0.125f, +0.195313f,0.125f, +0.203125f,0.125f, +0.210938f,0.125f, +0.21875f,0.125f, +0.226563f,0.125f, +0.234375f,0.125f, +0.242188f,0.125f, +0.25f,0.125f, +0.257813f,0.125f, +0.265625f,0.125f, +0.273438f,0.125f, +0.28125f,0.125f, +0.289063f,0.125f, +0.296875f,0.125f, +0.304688f,0.125f, +0.3125f,0.125f, +0.320313f,0.125f, +0.328125f,0.125f, +0.335938f,0.125f, +0.34375f,0.125f, +0.351563f,0.125f, +0.359375f,0.125f, +0.367188f,0.125f, +0.375f,0.125f, +0.382813f,0.125f, +0.390625f,0.125f, +0.398438f,0.125f, +0.40625f,0.125f, +0.414063f,0.125f, +0.421875f,0.125f, +0.429688f,0.125f, +0.4375f,0.125f, +0.445313f,0.125f, +0.453125f,0.125f, +0.460938f,0.125f, +0.46875f,0.125f, +0.476563f,0.125f, +0.484375f,0.125f, +0.492188f,0.125f, +0.5f,0.125f, +0.507813f,0.125f, +0.0f,0.132813f, +0.0078125f,0.132813f, +0.015625f,0.132813f, +0.0234375f,0.132813f, +0.03125f,0.132813f, +0.0390625f,0.132813f, +0.046875f,0.132813f, +0.0546875f,0.132813f, +0.0625f,0.132813f, +0.0703125f,0.132813f, +0.078125f,0.132813f, +0.0859375f,0.132813f, +0.09375f,0.132813f, +0.101563f,0.132813f, +0.109375f,0.132813f, +0.117188f,0.132813f, +0.125f,0.132813f, +0.132813f,0.132813f, +0.140625f,0.132813f, +0.148438f,0.132813f, +0.15625f,0.132813f, +0.164063f,0.132813f, +0.171875f,0.132813f, +0.179688f,0.132813f, +0.1875f,0.132813f, +0.195313f,0.132813f, +0.203125f,0.132813f, +0.210938f,0.132813f, +0.21875f,0.132813f, +0.226563f,0.132813f, +0.234375f,0.132813f, +0.242188f,0.132813f, +0.25f,0.132813f, +0.257813f,0.132813f, +0.265625f,0.132813f, +0.273438f,0.132813f, +0.28125f,0.132813f, +0.289063f,0.132813f, +0.296875f,0.132813f, +0.304688f,0.132813f, +0.3125f,0.132813f, +0.320313f,0.132813f, +0.328125f,0.132813f, +0.335938f,0.132813f, +0.34375f,0.132813f, +0.351563f,0.132813f, +0.359375f,0.132813f, +0.367188f,0.132813f, +0.375f,0.132813f, +0.382813f,0.132813f, +0.390625f,0.132813f, +0.398438f,0.132813f, +0.40625f,0.132813f, +0.414063f,0.132813f, +0.421875f,0.132813f, +0.429688f,0.132813f, +0.4375f,0.132813f, +0.445313f,0.132813f, +0.453125f,0.132813f, +0.460938f,0.132813f, +0.46875f,0.132813f, +0.476563f,0.132813f, +0.484375f,0.132813f, +0.492188f,0.132813f, +0.5f,0.132813f, +0.507813f,0.132813f, +0.0f,0.140625f, +0.0078125f,0.140625f, +0.015625f,0.140625f, +0.0234375f,0.140625f, +0.03125f,0.140625f, +0.0390625f,0.140625f, +0.046875f,0.140625f, +0.0546875f,0.140625f, +0.0625f,0.140625f, +0.0703125f,0.140625f, +0.078125f,0.140625f, +0.0859375f,0.140625f, +0.09375f,0.140625f, +0.101563f,0.140625f, +0.109375f,0.140625f, +0.117188f,0.140625f, +0.125f,0.140625f, +0.132813f,0.140625f, +0.140625f,0.140625f, +0.148438f,0.140625f, +0.15625f,0.140625f, +0.164063f,0.140625f, +0.171875f,0.140625f, +0.179688f,0.140625f, +0.1875f,0.140625f, +0.195313f,0.140625f, +0.203125f,0.140625f, +0.210938f,0.140625f, +0.21875f,0.140625f, +0.226563f,0.140625f, +0.234375f,0.140625f, +0.242188f,0.140625f, +0.25f,0.140625f, +0.257813f,0.140625f, +0.265625f,0.140625f, +0.273438f,0.140625f, +0.28125f,0.140625f, +0.289063f,0.140625f, +0.296875f,0.140625f, +0.304688f,0.140625f, +0.3125f,0.140625f, +0.320313f,0.140625f, +0.328125f,0.140625f, +0.335938f,0.140625f, +0.34375f,0.140625f, +0.351563f,0.140625f, +0.359375f,0.140625f, +0.367188f,0.140625f, +0.375f,0.140625f, +0.382813f,0.140625f, +0.390625f,0.140625f, +0.398438f,0.140625f, +0.40625f,0.140625f, +0.414063f,0.140625f, +0.421875f,0.140625f, +0.429688f,0.140625f, +0.4375f,0.140625f, +0.445313f,0.140625f, +0.453125f,0.140625f, +0.460938f,0.140625f, +0.46875f,0.140625f, +0.476563f,0.140625f, +0.484375f,0.140625f, +0.492188f,0.140625f, +0.5f,0.140625f, +0.507813f,0.140625f, +0.0f,0.148438f, +0.0078125f,0.148438f, +0.015625f,0.148438f, +0.0234375f,0.148438f, +0.03125f,0.148438f, +0.0390625f,0.148438f, +0.046875f,0.148438f, +0.0546875f,0.148438f, +0.0625f,0.148438f, +0.0703125f,0.148438f, +0.078125f,0.148438f, +0.0859375f,0.148438f, +0.09375f,0.148438f, +0.101563f,0.148438f, +0.109375f,0.148438f, +0.117188f,0.148438f, +0.125f,0.148438f, +0.132813f,0.148438f, +0.140625f,0.148438f, +0.148438f,0.148438f, +0.15625f,0.148438f, +0.164063f,0.148438f, +0.171875f,0.148438f, +0.179688f,0.148438f, +0.1875f,0.148438f, +0.195313f,0.148438f, +0.203125f,0.148438f, +0.210938f,0.148438f, +0.21875f,0.148438f, +0.226563f,0.148438f, +0.234375f,0.148438f, +0.242188f,0.148438f, +0.25f,0.148438f, +0.257813f,0.148438f, +0.265625f,0.148438f, +0.273438f,0.148438f, +0.28125f,0.148438f, +0.289063f,0.148438f, +0.296875f,0.148438f, +0.304688f,0.148438f, +0.3125f,0.148438f, +0.320313f,0.148438f, +0.328125f,0.148438f, +0.335938f,0.148438f, +0.34375f,0.148438f, +0.351563f,0.148438f, +0.359375f,0.148438f, +0.367188f,0.148438f, +0.375f,0.148438f, +0.382813f,0.148438f, +0.390625f,0.148438f, +0.398438f,0.148438f, +0.40625f,0.148438f, +0.414063f,0.148438f, +0.421875f,0.148438f, +0.429688f,0.148438f, +0.4375f,0.148438f, +0.445313f,0.148438f, +0.453125f,0.148438f, +0.460938f,0.148438f, +0.46875f,0.148438f, +0.476563f,0.148438f, +0.484375f,0.148438f, +0.492188f,0.148438f, +0.5f,0.148438f, +0.507813f,0.148438f, +0.0f,0.15625f, +0.0078125f,0.15625f, +0.015625f,0.15625f, +0.0234375f,0.15625f, +0.03125f,0.15625f, +0.0390625f,0.15625f, +0.046875f,0.15625f, +0.0546875f,0.15625f, +0.0625f,0.15625f, +0.0703125f,0.15625f, +0.078125f,0.15625f, +0.0859375f,0.15625f, +0.09375f,0.15625f, +0.101563f,0.15625f, +0.109375f,0.15625f, +0.117188f,0.15625f, +0.125f,0.15625f, +0.132813f,0.15625f, +0.140625f,0.15625f, +0.148438f,0.15625f, +0.15625f,0.15625f, +0.164063f,0.15625f, +0.171875f,0.15625f, +0.179688f,0.15625f, +0.1875f,0.15625f, +0.195313f,0.15625f, +0.203125f,0.15625f, +0.210938f,0.15625f, +0.21875f,0.15625f, +0.226563f,0.15625f, +0.234375f,0.15625f, +0.242188f,0.15625f, +0.25f,0.15625f, +0.257813f,0.15625f, +0.265625f,0.15625f, +0.273438f,0.15625f, +0.28125f,0.15625f, +0.289063f,0.15625f, +0.296875f,0.15625f, +0.304688f,0.15625f, +0.3125f,0.15625f, +0.320313f,0.15625f, +0.328125f,0.15625f, +0.335938f,0.15625f, +0.34375f,0.15625f, +0.351563f,0.15625f, +0.359375f,0.15625f, +0.367188f,0.15625f, +0.375f,0.15625f, +0.382813f,0.15625f, +0.390625f,0.15625f, +0.398438f,0.15625f, +0.40625f,0.15625f, +0.414063f,0.15625f, +0.421875f,0.15625f, +0.429688f,0.15625f, +0.4375f,0.15625f, +0.445313f,0.15625f, +0.453125f,0.15625f, +0.460938f,0.15625f, +0.46875f,0.15625f, +0.476563f,0.15625f, +0.484375f,0.15625f, +0.492188f,0.15625f, +0.5f,0.15625f, +0.507813f,0.15625f, +0.0f,0.164063f, +0.0078125f,0.164063f, +0.015625f,0.164063f, +0.0234375f,0.164063f, +0.03125f,0.164063f, +0.0390625f,0.164063f, +0.046875f,0.164063f, +0.0546875f,0.164063f, +0.0625f,0.164063f, +0.0703125f,0.164063f, +0.078125f,0.164063f, +0.0859375f,0.164063f, +0.09375f,0.164063f, +0.101563f,0.164063f, +0.109375f,0.164063f, +0.117188f,0.164063f, +0.125f,0.164063f, +0.132813f,0.164063f, +0.140625f,0.164063f, +0.148438f,0.164063f, +0.15625f,0.164063f, +0.164063f,0.164063f, +0.171875f,0.164063f, +0.179688f,0.164063f, +0.1875f,0.164063f, +0.195313f,0.164063f, +0.203125f,0.164063f, +0.210938f,0.164063f, +0.21875f,0.164063f, +0.226563f,0.164063f, +0.234375f,0.164063f, +0.242188f,0.164063f, +0.25f,0.164063f, +0.257813f,0.164063f, +0.265625f,0.164063f, +0.273438f,0.164063f, +0.28125f,0.164063f, +0.289063f,0.164063f, +0.296875f,0.164063f, +0.304688f,0.164063f, +0.3125f,0.164063f, +0.320313f,0.164063f, +0.328125f,0.164063f, +0.335938f,0.164063f, +0.34375f,0.164063f, +0.351563f,0.164063f, +0.359375f,0.164063f, +0.367188f,0.164063f, +0.375f,0.164063f, +0.382813f,0.164063f, +0.390625f,0.164063f, +0.398438f,0.164063f, +0.40625f,0.164063f, +0.414063f,0.164063f, +0.421875f,0.164063f, +0.429688f,0.164063f, +0.4375f,0.164063f, +0.445313f,0.164063f, +0.453125f,0.164063f, +0.460938f,0.164063f, +0.46875f,0.164063f, +0.476563f,0.164063f, +0.484375f,0.164063f, +0.492188f,0.164063f, +0.5f,0.164063f, +0.507813f,0.164063f, +0.0f,0.171875f, +0.0078125f,0.171875f, +0.015625f,0.171875f, +0.0234375f,0.171875f, +0.03125f,0.171875f, +0.0390625f,0.171875f, +0.046875f,0.171875f, +0.0546875f,0.171875f, +0.0625f,0.171875f, +0.0703125f,0.171875f, +0.078125f,0.171875f, +0.0859375f,0.171875f, +0.09375f,0.171875f, +0.101563f,0.171875f, +0.109375f,0.171875f, +0.117188f,0.171875f, +0.125f,0.171875f, +0.132813f,0.171875f, +0.140625f,0.171875f, +0.148438f,0.171875f, +0.15625f,0.171875f, +0.164063f,0.171875f, +0.171875f,0.171875f, +0.179688f,0.171875f, +0.1875f,0.171875f, +0.195313f,0.171875f, +0.203125f,0.171875f, +0.210938f,0.171875f, +0.21875f,0.171875f, +0.226563f,0.171875f, +0.234375f,0.171875f, +0.242188f,0.171875f, +0.25f,0.171875f, +0.257813f,0.171875f, +0.265625f,0.171875f, +0.273438f,0.171875f, +0.28125f,0.171875f, +0.289063f,0.171875f, +0.296875f,0.171875f, +0.304688f,0.171875f, +0.3125f,0.171875f, +0.320313f,0.171875f, +0.328125f,0.171875f, +0.335938f,0.171875f, +0.34375f,0.171875f, +0.351563f,0.171875f, +0.359375f,0.171875f, +0.367188f,0.171875f, +0.375f,0.171875f, +0.382813f,0.171875f, +0.390625f,0.171875f, +0.398438f,0.171875f, +0.40625f,0.171875f, +0.414063f,0.171875f, +0.421875f,0.171875f, +0.429688f,0.171875f, +0.4375f,0.171875f, +0.445313f,0.171875f, +0.453125f,0.171875f, +0.460938f,0.171875f, +0.46875f,0.171875f, +0.476563f,0.171875f, +0.484375f,0.171875f, +0.492188f,0.171875f, +0.5f,0.171875f, +0.507813f,0.171875f, +0.0f,0.179688f, +0.0078125f,0.179688f, +0.015625f,0.179688f, +0.0234375f,0.179688f, +0.03125f,0.179688f, +0.0390625f,0.179688f, +0.046875f,0.179688f, +0.0546875f,0.179688f, +0.0625f,0.179688f, +0.0703125f,0.179688f, +0.078125f,0.179688f, +0.0859375f,0.179688f, +0.09375f,0.179688f, +0.101563f,0.179688f, +0.109375f,0.179688f, +0.117188f,0.179688f, +0.125f,0.179688f, +0.132813f,0.179688f, +0.140625f,0.179688f, +0.148438f,0.179688f, +0.15625f,0.179688f, +0.164063f,0.179688f, +0.171875f,0.179688f, +0.179688f,0.179688f, +0.1875f,0.179688f, +0.195313f,0.179688f, +0.203125f,0.179688f, +0.210938f,0.179688f, +0.21875f,0.179688f, +0.226563f,0.179688f, +0.234375f,0.179688f, +0.242188f,0.179688f, +0.25f,0.179688f, +0.257813f,0.179688f, +0.265625f,0.179688f, +0.273438f,0.179688f, +0.28125f,0.179688f, +0.289063f,0.179688f, +0.296875f,0.179688f, +0.304688f,0.179688f, +0.3125f,0.179688f, +0.320313f,0.179688f, +0.328125f,0.179688f, +0.335938f,0.179688f, +0.34375f,0.179688f, +0.351563f,0.179688f, +0.359375f,0.179688f, +0.367188f,0.179688f, +0.375f,0.179688f, +0.382813f,0.179688f, +0.390625f,0.179688f, +0.398438f,0.179688f, +0.40625f,0.179688f, +0.414063f,0.179688f, +0.421875f,0.179688f, +0.429688f,0.179688f, +0.4375f,0.179688f, +0.445313f,0.179688f, +0.453125f,0.179688f, +0.460938f,0.179688f, +0.46875f,0.179688f, +0.476563f,0.179688f, +0.484375f,0.179688f, +0.492188f,0.179688f, +0.5f,0.179688f, +0.507813f,0.179688f, +0.0f,0.1875f, +0.0078125f,0.1875f, +0.015625f,0.1875f, +0.0234375f,0.1875f, +0.03125f,0.1875f, +0.0390625f,0.1875f, +0.046875f,0.1875f, +0.0546875f,0.1875f, +0.0625f,0.1875f, +0.0703125f,0.1875f, +0.078125f,0.1875f, +0.0859375f,0.1875f, +0.09375f,0.1875f, +0.101563f,0.1875f, +0.109375f,0.1875f, +0.117188f,0.1875f, +0.125f,0.1875f, +0.132813f,0.1875f, +0.140625f,0.1875f, +0.148438f,0.1875f, +0.15625f,0.1875f, +0.164063f,0.1875f, +0.171875f,0.1875f, +0.179688f,0.1875f, +0.1875f,0.1875f, +0.195313f,0.1875f, +0.203125f,0.1875f, +0.210938f,0.1875f, +0.21875f,0.1875f, +0.226563f,0.1875f, +0.234375f,0.1875f, +0.242188f,0.1875f, +0.25f,0.1875f, +0.257813f,0.1875f, +0.265625f,0.1875f, +0.273438f,0.1875f, +0.28125f,0.1875f, +0.289063f,0.1875f, +0.296875f,0.1875f, +0.304688f,0.1875f, +0.3125f,0.1875f, +0.320313f,0.1875f, +0.328125f,0.1875f, +0.335938f,0.1875f, +0.34375f,0.1875f, +0.351563f,0.1875f, +0.359375f,0.1875f, +0.367188f,0.1875f, +0.375f,0.1875f, +0.382813f,0.1875f, +0.390625f,0.1875f, +0.398438f,0.1875f, +0.40625f,0.1875f, +0.414063f,0.1875f, +0.421875f,0.1875f, +0.429688f,0.1875f, +0.4375f,0.1875f, +0.445313f,0.1875f, +0.453125f,0.1875f, +0.460938f,0.1875f, +0.46875f,0.1875f, +0.476563f,0.1875f, +0.484375f,0.1875f, +0.492188f,0.1875f, +0.5f,0.1875f, +0.507813f,0.1875f, +0.0f,0.195313f, +0.0078125f,0.195313f, +0.015625f,0.195313f, +0.0234375f,0.195313f, +0.03125f,0.195313f, +0.0390625f,0.195313f, +0.046875f,0.195313f, +0.0546875f,0.195313f, +0.0625f,0.195313f, +0.0703125f,0.195313f, +0.078125f,0.195313f, +0.0859375f,0.195313f, +0.09375f,0.195313f, +0.101563f,0.195313f, +0.109375f,0.195313f, +0.117188f,0.195313f, +0.125f,0.195313f, +0.132813f,0.195313f, +0.140625f,0.195313f, +0.148438f,0.195313f, +0.15625f,0.195313f, +0.164063f,0.195313f, +0.171875f,0.195313f, +0.179688f,0.195313f, +0.1875f,0.195313f, +0.195313f,0.195313f, +0.203125f,0.195313f, +0.210938f,0.195313f, +0.21875f,0.195313f, +0.226563f,0.195313f, +0.234375f,0.195313f, +0.242188f,0.195313f, +0.25f,0.195313f, +0.257813f,0.195313f, +0.265625f,0.195313f, +0.273438f,0.195313f, +0.28125f,0.195313f, +0.289063f,0.195313f, +0.296875f,0.195313f, +0.304688f,0.195313f, +0.3125f,0.195313f, +0.320313f,0.195313f, +0.328125f,0.195313f, +0.335938f,0.195313f, +0.34375f,0.195313f, +0.351563f,0.195313f, +0.359375f,0.195313f, +0.367188f,0.195313f, +0.375f,0.195313f, +0.382813f,0.195313f, +0.390625f,0.195313f, +0.398438f,0.195313f, +0.40625f,0.195313f, +0.414063f,0.195313f, +0.421875f,0.195313f, +0.429688f,0.195313f, +0.4375f,0.195313f, +0.445313f,0.195313f, +0.453125f,0.195313f, +0.460938f,0.195313f, +0.46875f,0.195313f, +0.476563f,0.195313f, +0.484375f,0.195313f, +0.492188f,0.195313f, +0.5f,0.195313f, +0.507813f,0.195313f, +0.0f,0.203125f, +0.0078125f,0.203125f, +0.015625f,0.203125f, +0.0234375f,0.203125f, +0.03125f,0.203125f, +0.0390625f,0.203125f, +0.046875f,0.203125f, +0.0546875f,0.203125f, +0.0625f,0.203125f, +0.0703125f,0.203125f, +0.078125f,0.203125f, +0.0859375f,0.203125f, +0.09375f,0.203125f, +0.101563f,0.203125f, +0.109375f,0.203125f, +0.117188f,0.203125f, +0.125f,0.203125f, +0.132813f,0.203125f, +0.140625f,0.203125f, +0.148438f,0.203125f, +0.15625f,0.203125f, +0.164063f,0.203125f, +0.171875f,0.203125f, +0.179688f,0.203125f, +0.1875f,0.203125f, +0.195313f,0.203125f, +0.203125f,0.203125f, +0.210938f,0.203125f, +0.21875f,0.203125f, +0.226563f,0.203125f, +0.234375f,0.203125f, +0.242188f,0.203125f, +0.25f,0.203125f, +0.257813f,0.203125f, +0.265625f,0.203125f, +0.273438f,0.203125f, +0.28125f,0.203125f, +0.289063f,0.203125f, +0.296875f,0.203125f, +0.304688f,0.203125f, +0.3125f,0.203125f, +0.320313f,0.203125f, +0.328125f,0.203125f, +0.335938f,0.203125f, +0.34375f,0.203125f, +0.351563f,0.203125f, +0.359375f,0.203125f, +0.367188f,0.203125f, +0.375f,0.203125f, +0.382813f,0.203125f, +0.390625f,0.203125f, +0.398438f,0.203125f, +0.40625f,0.203125f, +0.414063f,0.203125f, +0.421875f,0.203125f, +0.429688f,0.203125f, +0.4375f,0.203125f, +0.445313f,0.203125f, +0.453125f,0.203125f, +0.460938f,0.203125f, +0.46875f,0.203125f, +0.476563f,0.203125f, +0.484375f,0.203125f, +0.492188f,0.203125f, +0.5f,0.203125f, +0.507813f,0.203125f, +0.0f,0.210938f, +0.0078125f,0.210938f, +0.015625f,0.210938f, +0.0234375f,0.210938f, +0.03125f,0.210938f, +0.0390625f,0.210938f, +0.046875f,0.210938f, +0.0546875f,0.210938f, +0.0625f,0.210938f, +0.0703125f,0.210938f, +0.078125f,0.210938f, +0.0859375f,0.210938f, +0.09375f,0.210938f, +0.101563f,0.210938f, +0.109375f,0.210938f, +0.117188f,0.210938f, +0.125f,0.210938f, +0.132813f,0.210938f, +0.140625f,0.210938f, +0.148438f,0.210938f, +0.15625f,0.210938f, +0.164063f,0.210938f, +0.171875f,0.210938f, +0.179688f,0.210938f, +0.1875f,0.210938f, +0.195313f,0.210938f, +0.203125f,0.210938f, +0.210938f,0.210938f, +0.21875f,0.210938f, +0.226563f,0.210938f, +0.234375f,0.210938f, +0.242188f,0.210938f, +0.25f,0.210938f, +0.257813f,0.210938f, +0.265625f,0.210938f, +0.273438f,0.210938f, +0.28125f,0.210938f, +0.289063f,0.210938f, +0.296875f,0.210938f, +0.304688f,0.210938f, +0.3125f,0.210938f, +0.320313f,0.210938f, +0.328125f,0.210938f, +0.335938f,0.210938f, +0.34375f,0.210938f, +0.351563f,0.210938f, +0.359375f,0.210938f, +0.367188f,0.210938f, +0.375f,0.210938f, +0.382813f,0.210938f, +0.390625f,0.210938f, +0.398438f,0.210938f, +0.40625f,0.210938f, +0.414063f,0.210938f, +0.421875f,0.210938f, +0.429688f,0.210938f, +0.4375f,0.210938f, +0.445313f,0.210938f, +0.453125f,0.210938f, +0.460938f,0.210938f, +0.46875f,0.210938f, +0.476563f,0.210938f, +0.484375f,0.210938f, +0.492188f,0.210938f, +0.5f,0.210938f, +0.507813f,0.210938f, +0.0f,0.21875f, +0.0078125f,0.21875f, +0.015625f,0.21875f, +0.0234375f,0.21875f, +0.03125f,0.21875f, +0.0390625f,0.21875f, +0.046875f,0.21875f, +0.0546875f,0.21875f, +0.0625f,0.21875f, +0.0703125f,0.21875f, +0.078125f,0.21875f, +0.0859375f,0.21875f, +0.09375f,0.21875f, +0.101563f,0.21875f, +0.109375f,0.21875f, +0.117188f,0.21875f, +0.125f,0.21875f, +0.132813f,0.21875f, +0.140625f,0.21875f, +0.148438f,0.21875f, +0.15625f,0.21875f, +0.164063f,0.21875f, +0.171875f,0.21875f, +0.179688f,0.21875f, +0.1875f,0.21875f, +0.195313f,0.21875f, +0.203125f,0.21875f, +0.210938f,0.21875f, +0.21875f,0.21875f, +0.226563f,0.21875f, +0.234375f,0.21875f, +0.242188f,0.21875f, +0.25f,0.21875f, +0.257813f,0.21875f, +0.265625f,0.21875f, +0.273438f,0.21875f, +0.28125f,0.21875f, +0.289063f,0.21875f, +0.296875f,0.21875f, +0.304688f,0.21875f, +0.3125f,0.21875f, +0.320313f,0.21875f, +0.328125f,0.21875f, +0.335938f,0.21875f, +0.34375f,0.21875f, +0.351563f,0.21875f, +0.359375f,0.21875f, +0.367188f,0.21875f, +0.375f,0.21875f, +0.382813f,0.21875f, +0.390625f,0.21875f, +0.398438f,0.21875f, +0.40625f,0.21875f, +0.414063f,0.21875f, +0.421875f,0.21875f, +0.429688f,0.21875f, +0.4375f,0.21875f, +0.445313f,0.21875f, +0.453125f,0.21875f, +0.460938f,0.21875f, +0.46875f,0.21875f, +0.476563f,0.21875f, +0.484375f,0.21875f, +0.492188f,0.21875f, +0.5f,0.21875f, +0.507813f,0.21875f, +0.0f,0.226563f, +0.0078125f,0.226563f, +0.015625f,0.226563f, +0.0234375f,0.226563f, +0.03125f,0.226563f, +0.0390625f,0.226563f, +0.046875f,0.226563f, +0.0546875f,0.226563f, +0.0625f,0.226563f, +0.0703125f,0.226563f, +0.078125f,0.226563f, +0.0859375f,0.226563f, +0.09375f,0.226563f, +0.101563f,0.226563f, +0.109375f,0.226563f, +0.117188f,0.226563f, +0.125f,0.226563f, +0.132813f,0.226563f, +0.140625f,0.226563f, +0.148438f,0.226563f, +0.15625f,0.226563f, +0.164063f,0.226563f, +0.171875f,0.226563f, +0.179688f,0.226563f, +0.1875f,0.226563f, +0.195313f,0.226563f, +0.203125f,0.226563f, +0.210938f,0.226563f, +0.21875f,0.226563f, +0.226563f,0.226563f, +0.234375f,0.226563f, +0.242188f,0.226563f, +0.25f,0.226563f, +0.257813f,0.226563f, +0.265625f,0.226563f, +0.273438f,0.226563f, +0.28125f,0.226563f, +0.289063f,0.226563f, +0.296875f,0.226563f, +0.304688f,0.226563f, +0.3125f,0.226563f, +0.320313f,0.226563f, +0.328125f,0.226563f, +0.335938f,0.226563f, +0.34375f,0.226563f, +0.351563f,0.226563f, +0.359375f,0.226563f, +0.367188f,0.226563f, +0.375f,0.226563f, +0.382813f,0.226563f, +0.390625f,0.226563f, +0.398438f,0.226563f, +0.40625f,0.226563f, +0.414063f,0.226563f, +0.421875f,0.226563f, +0.429688f,0.226563f, +0.4375f,0.226563f, +0.445313f,0.226563f, +0.453125f,0.226563f, +0.460938f,0.226563f, +0.46875f,0.226563f, +0.476563f,0.226563f, +0.484375f,0.226563f, +0.492188f,0.226563f, +0.5f,0.226563f, +0.507813f,0.226563f, +0.0f,0.234375f, +0.0078125f,0.234375f, +0.015625f,0.234375f, +0.0234375f,0.234375f, +0.03125f,0.234375f, +0.0390625f,0.234375f, +0.046875f,0.234375f, +0.0546875f,0.234375f, +0.0625f,0.234375f, +0.0703125f,0.234375f, +0.078125f,0.234375f, +0.0859375f,0.234375f, +0.09375f,0.234375f, +0.101563f,0.234375f, +0.109375f,0.234375f, +0.117188f,0.234375f, +0.125f,0.234375f, +0.132813f,0.234375f, +0.140625f,0.234375f, +0.148438f,0.234375f, +0.15625f,0.234375f, +0.164063f,0.234375f, +0.171875f,0.234375f, +0.179688f,0.234375f, +0.1875f,0.234375f, +0.195313f,0.234375f, +0.203125f,0.234375f, +0.210938f,0.234375f, +0.21875f,0.234375f, +0.226563f,0.234375f, +0.234375f,0.234375f, +0.242188f,0.234375f, +0.25f,0.234375f, +0.257813f,0.234375f, +0.265625f,0.234375f, +0.273438f,0.234375f, +0.28125f,0.234375f, +0.289063f,0.234375f, +0.296875f,0.234375f, +0.304688f,0.234375f, +0.3125f,0.234375f, +0.320313f,0.234375f, +0.328125f,0.234375f, +0.335938f,0.234375f, +0.34375f,0.234375f, +0.351563f,0.234375f, +0.359375f,0.234375f, +0.367188f,0.234375f, +0.375f,0.234375f, +0.382813f,0.234375f, +0.390625f,0.234375f, +0.398438f,0.234375f, +0.40625f,0.234375f, +0.414063f,0.234375f, +0.421875f,0.234375f, +0.429688f,0.234375f, +0.4375f,0.234375f, +0.445313f,0.234375f, +0.453125f,0.234375f, +0.460938f,0.234375f, +0.46875f,0.234375f, +0.476563f,0.234375f, +0.484375f,0.234375f, +0.492188f,0.234375f, +0.5f,0.234375f, +0.507813f,0.234375f, +0.0f,0.242188f, +0.0078125f,0.242188f, +0.015625f,0.242188f, +0.0234375f,0.242188f, +0.03125f,0.242188f, +0.0390625f,0.242188f, +0.046875f,0.242188f, +0.0546875f,0.242188f, +0.0625f,0.242188f, +0.0703125f,0.242188f, +0.078125f,0.242188f, +0.0859375f,0.242188f, +0.09375f,0.242188f, +0.101563f,0.242188f, +0.109375f,0.242188f, +0.117188f,0.242188f, +0.125f,0.242188f, +0.132813f,0.242188f, +0.140625f,0.242188f, +0.148438f,0.242188f, +0.15625f,0.242188f, +0.164063f,0.242188f, +0.171875f,0.242188f, +0.179688f,0.242188f, +0.1875f,0.242188f, +0.195313f,0.242188f, +0.203125f,0.242188f, +0.210938f,0.242188f, +0.21875f,0.242188f, +0.226563f,0.242188f, +0.234375f,0.242188f, +0.242188f,0.242188f, +0.25f,0.242188f, +0.257813f,0.242188f, +0.265625f,0.242188f, +0.273438f,0.242188f, +0.28125f,0.242188f, +0.289063f,0.242188f, +0.296875f,0.242188f, +0.304688f,0.242188f, +0.3125f,0.242188f, +0.320313f,0.242188f, +0.328125f,0.242188f, +0.335938f,0.242188f, +0.34375f,0.242188f, +0.351563f,0.242188f, +0.359375f,0.242188f, +0.367188f,0.242188f, +0.375f,0.242188f, +0.382813f,0.242188f, +0.390625f,0.242188f, +0.398438f,0.242188f, +0.40625f,0.242188f, +0.414063f,0.242188f, +0.421875f,0.242188f, +0.429688f,0.242188f, +0.4375f,0.242188f, +0.445313f,0.242188f, +0.453125f,0.242188f, +0.460938f,0.242188f, +0.46875f,0.242188f, +0.476563f,0.242188f, +0.484375f,0.242188f, +0.492188f,0.242188f, +0.5f,0.242188f, +0.507813f,0.242188f, +0.0f,0.25f, +0.0078125f,0.25f, +0.015625f,0.25f, +0.0234375f,0.25f, +0.03125f,0.25f, +0.0390625f,0.25f, +0.046875f,0.25f, +0.0546875f,0.25f, +0.0625f,0.25f, +0.0703125f,0.25f, +0.078125f,0.25f, +0.0859375f,0.25f, +0.09375f,0.25f, +0.101563f,0.25f, +0.109375f,0.25f, +0.117188f,0.25f, +0.125f,0.25f, +0.132813f,0.25f, +0.140625f,0.25f, +0.148438f,0.25f, +0.15625f,0.25f, +0.164063f,0.25f, +0.171875f,0.25f, +0.179688f,0.25f, +0.1875f,0.25f, +0.195313f,0.25f, +0.203125f,0.25f, +0.210938f,0.25f, +0.21875f,0.25f, +0.226563f,0.25f, +0.234375f,0.25f, +0.242188f,0.25f, +0.25f,0.25f, +0.257813f,0.25f, +0.265625f,0.25f, +0.273438f,0.25f, +0.28125f,0.25f, +0.289063f,0.25f, +0.296875f,0.25f, +0.304688f,0.25f, +0.3125f,0.25f, +0.320313f,0.25f, +0.328125f,0.25f, +0.335938f,0.25f, +0.34375f,0.25f, +0.351563f,0.25f, +0.359375f,0.25f, +0.367188f,0.25f, +0.375f,0.25f, +0.382813f,0.25f, +0.390625f,0.25f, +0.398438f,0.25f, +0.40625f,0.25f, +0.414063f,0.25f, +0.421875f,0.25f, +0.429688f,0.25f, +0.4375f,0.25f, +0.445313f,0.25f, +0.453125f,0.25f, +0.460938f,0.25f, +0.46875f,0.25f, +0.476563f,0.25f, +0.484375f,0.25f, +0.492188f,0.25f, +0.5f,0.25f, +0.507813f,0.25f, +0.0f,0.257813f, +0.0078125f,0.257813f, +0.015625f,0.257813f, +0.0234375f,0.257813f, +0.03125f,0.257813f, +0.0390625f,0.257813f, +0.046875f,0.257813f, +0.0546875f,0.257813f, +0.0625f,0.257813f, +0.0703125f,0.257813f, +0.078125f,0.257813f, +0.0859375f,0.257813f, +0.09375f,0.257813f, +0.101563f,0.257813f, +0.109375f,0.257813f, +0.117188f,0.257813f, +0.125f,0.257813f, +0.132813f,0.257813f, +0.140625f,0.257813f, +0.148438f,0.257813f, +0.15625f,0.257813f, +0.164063f,0.257813f, +0.171875f,0.257813f, +0.179688f,0.257813f, +0.1875f,0.257813f, +0.195313f,0.257813f, +0.203125f,0.257813f, +0.210938f,0.257813f, +0.21875f,0.257813f, +0.226563f,0.257813f, +0.234375f,0.257813f, +0.242188f,0.257813f, +0.25f,0.257813f, +0.257813f,0.257813f, +0.265625f,0.257813f, +0.273438f,0.257813f, +0.28125f,0.257813f, +0.289063f,0.257813f, +0.296875f,0.257813f, +0.304688f,0.257813f, +0.3125f,0.257813f, +0.320313f,0.257813f, +0.328125f,0.257813f, +0.335938f,0.257813f, +0.34375f,0.257813f, +0.351563f,0.257813f, +0.359375f,0.257813f, +0.367188f,0.257813f, +0.375f,0.257813f, +0.382813f,0.257813f, +0.390625f,0.257813f, +0.398438f,0.257813f, +0.40625f,0.257813f, +0.414063f,0.257813f, +0.421875f,0.257813f, +0.429688f,0.257813f, +0.4375f,0.257813f, +0.445313f,0.257813f, +0.453125f,0.257813f, +0.460938f,0.257813f, +0.46875f,0.257813f, +0.476563f,0.257813f, +0.484375f,0.257813f, +0.492188f,0.257813f, +0.5f,0.257813f, +0.507813f,0.257813f, +0.0f,0.265625f, +0.0078125f,0.265625f, +0.015625f,0.265625f, +0.0234375f,0.265625f, +0.03125f,0.265625f, +0.0390625f,0.265625f, +0.046875f,0.265625f, +0.0546875f,0.265625f, +0.0625f,0.265625f, +0.0703125f,0.265625f, +0.078125f,0.265625f, +0.0859375f,0.265625f, +0.09375f,0.265625f, +0.101563f,0.265625f, +0.109375f,0.265625f, +0.117188f,0.265625f, +0.125f,0.265625f, +0.132813f,0.265625f, +0.140625f,0.265625f, +0.148438f,0.265625f, +0.15625f,0.265625f, +0.164063f,0.265625f, +0.171875f,0.265625f, +0.179688f,0.265625f, +0.1875f,0.265625f, +0.195313f,0.265625f, +0.203125f,0.265625f, +0.210938f,0.265625f, +0.21875f,0.265625f, +0.226563f,0.265625f, +0.234375f,0.265625f, +0.242188f,0.265625f, +0.25f,0.265625f, +0.257813f,0.265625f, +0.265625f,0.265625f, +0.273438f,0.265625f, +0.28125f,0.265625f, +0.289063f,0.265625f, +0.296875f,0.265625f, +0.304688f,0.265625f, +0.3125f,0.265625f, +0.320313f,0.265625f, +0.328125f,0.265625f, +0.335938f,0.265625f, +0.34375f,0.265625f, +0.351563f,0.265625f, +0.359375f,0.265625f, +0.367188f,0.265625f, +0.375f,0.265625f, +0.382813f,0.265625f, +0.390625f,0.265625f, +0.398438f,0.265625f, +0.40625f,0.265625f, +0.414063f,0.265625f, +0.421875f,0.265625f, +0.429688f,0.265625f, +0.4375f,0.265625f, +0.445313f,0.265625f, +0.453125f,0.265625f, +0.460938f,0.265625f, +0.46875f,0.265625f, +0.476563f,0.265625f, +0.484375f,0.265625f, +0.492188f,0.265625f, +0.5f,0.265625f, +0.507813f,0.265625f, +}; + +unsigned short Landscape06Idx[] = { +0,1,2, +3,2,1, +2,3,4, +5,4,3, +4,5,6, +7,6,5, +6,7,8, +9,8,7, +8,9,10, +11,10,9, +10,11,12, +13,12,11, +12,13,14, +15,14,13, +14,15,16, +17,16,15, +16,17,18, +19,18,17, +18,19,20, +21,20,19, +20,21,22, +23,22,21, +22,23,24, +25,24,23, +24,25,26, +27,26,25, +26,27,28, +29,28,27, +28,29,30, +31,30,29, +30,31,32, +33,32,31, +32,33,34, +35,34,33, +34,35,36, +37,36,35, +36,37,38, +39,38,37, +38,39,40, +41,40,39, +40,41,42, +43,42,41, +42,43,44, +45,44,43, +44,45,46, +47,46,45, +46,47,48, +49,48,47, +48,49,50, +51,50,49, +50,51,52, +53,52,51, +52,53,54, +55,54,53, +54,55,56, +57,56,55, +56,57,58, +59,58,57, +58,59,60, +61,60,59, +60,61,62, +63,62,61, +62,63,64, +65,64,63, +64,65,66, +67,66,65, +66,67,68, +69,68,67, +68,69,70, +71,70,69, +70,71,72, +73,72,71, +72,73,74, +75,74,73, +74,75,76, +77,76,75, +76,77,78, +79,78,77, +78,79,80, +81,80,79, +80,81,82, +83,82,81, +82,83,84, +85,84,83, +84,85,86, +87,86,85, +86,87,88, +89,88,87, +88,89,90, +91,90,89, +90,91,92, +93,92,91, +92,93,94, +95,94,93, +94,95,96, +97,96,95, +96,97,98, +99,98,97, +98,99,100, +101,100,99, +100,101,102, +103,102,101, +102,103,104, +105,104,103, +104,105,106, +107,106,105, +106,107,108, +109,108,107, +108,109,110, +111,110,109, +110,111,112, +113,112,111, +112,113,114, +115,114,113, +114,115,116, +117,116,115, +116,117,118, +119,118,117, +118,119,120, +121,120,119, +120,121,122, +123,122,121, +122,123,124, +125,124,123, +124,125,126, +127,126,125, +126,127,128, +129,128,127, +128,129,130, +131,130,129, +132,0,133, +2,133,0, +133,2,134, +4,134,2, +134,4,135, +6,135,4, +135,6,136, +8,136,6, +136,8,137, +10,137,8, +137,10,138, +12,138,10, +138,12,139, +14,139,12, +139,14,140, +16,140,14, +140,16,141, +18,141,16, +141,18,142, +20,142,18, +142,20,143, +22,143,20, +143,22,144, +24,144,22, +144,24,145, +26,145,24, +145,26,146, +28,146,26, +146,28,147, +30,147,28, +147,30,148, +32,148,30, +148,32,149, +34,149,32, +149,34,150, +36,150,34, +150,36,151, +38,151,36, +151,38,152, +40,152,38, +152,40,153, +42,153,40, +153,42,154, +44,154,42, +154,44,155, +46,155,44, +155,46,156, +48,156,46, +156,48,157, +50,157,48, +157,50,158, +52,158,50, +158,52,159, +54,159,52, +159,54,160, +56,160,54, +160,56,161, +58,161,56, +161,58,162, +60,162,58, +162,60,163, +62,163,60, +163,62,164, +64,164,62, +164,64,165, +66,165,64, +165,66,166, +68,166,66, +166,68,167, +70,167,68, +167,70,168, +72,168,70, +168,72,169, +74,169,72, +169,74,170, +76,170,74, +170,76,171, +78,171,76, +171,78,172, +80,172,78, +172,80,173, +82,173,80, +173,82,174, +84,174,82, +174,84,175, +86,175,84, +175,86,176, +88,176,86, +176,88,177, +90,177,88, +177,90,178, +92,178,90, +178,92,179, +94,179,92, +179,94,180, +96,180,94, +180,96,181, +98,181,96, +181,98,182, +100,182,98, +182,100,183, +102,183,100, +183,102,184, +104,184,102, +184,104,185, +106,185,104, +185,106,186, +108,186,106, +186,108,187, +110,187,108, +187,110,188, +112,188,110, +188,112,189, +114,189,112, +189,114,190, +116,190,114, +190,116,191, +118,191,116, +191,118,192, +120,192,118, +192,120,193, +122,193,120, +193,122,194, +124,194,122, +194,124,195, +126,195,124, +195,126,196, +128,196,126, +196,128,197, +130,197,128, +198,132,199, +133,199,132, +199,133,200, +134,200,133, +200,134,201, +135,201,134, +201,135,202, +136,202,135, +202,136,203, +137,203,136, +203,137,204, +138,204,137, +204,138,205, +139,205,138, +205,139,206, +140,206,139, +206,140,207, +141,207,140, +207,141,208, +142,208,141, +208,142,209, +143,209,142, +209,143,210, +144,210,143, +210,144,211, +145,211,144, +211,145,212, +146,212,145, +212,146,213, +147,213,146, +213,147,214, +148,214,147, +214,148,215, +149,215,148, +215,149,216, +150,216,149, +216,150,217, +151,217,150, +217,151,218, +152,218,151, +218,152,219, +153,219,152, +219,153,220, +154,220,153, +220,154,221, +155,221,154, +221,155,222, +156,222,155, +222,156,223, +157,223,156, +223,157,224, +158,224,157, +224,158,225, +159,225,158, +225,159,226, +160,226,159, +226,160,227, +161,227,160, +227,161,228, +162,228,161, +228,162,229, +163,229,162, +229,163,230, +164,230,163, +230,164,231, +165,231,164, +231,165,232, +166,232,165, +232,166,233, +167,233,166, +233,167,234, +168,234,167, +234,168,235, +169,235,168, +235,169,236, +170,236,169, +236,170,237, +171,237,170, +237,171,238, +172,238,171, +238,172,239, +173,239,172, +239,173,240, +174,240,173, +240,174,241, +175,241,174, +241,175,242, +176,242,175, +242,176,243, +177,243,176, +243,177,244, +178,244,177, +244,178,245, +179,245,178, +245,179,246, +180,246,179, +246,180,247, +181,247,180, +247,181,248, +182,248,181, +248,182,249, +183,249,182, +249,183,250, +184,250,183, +250,184,251, +185,251,184, +251,185,252, +186,252,185, +252,186,253, +187,253,186, +253,187,254, +188,254,187, +254,188,255, +189,255,188, +255,189,256, +190,256,189, +256,190,257, +191,257,190, +257,191,258, +192,258,191, +258,192,259, +193,259,192, +259,193,260, +194,260,193, +260,194,261, +195,261,194, +261,195,262, +196,262,195, +262,196,263, +197,263,196, +264,198,265, +199,265,198, +265,199,266, +200,266,199, +266,200,267, +201,267,200, +267,201,268, +202,268,201, +268,202,269, +203,269,202, +269,203,270, +204,270,203, +270,204,271, +205,271,204, +271,205,272, +206,272,205, +272,206,273, +207,273,206, +273,207,274, +208,274,207, +274,208,275, +209,275,208, +275,209,276, +210,276,209, +276,210,277, +211,277,210, +277,211,278, +212,278,211, +278,212,279, +213,279,212, +279,213,280, +214,280,213, +280,214,281, +215,281,214, +281,215,282, +216,282,215, +282,216,283, +217,283,216, +283,217,284, +218,284,217, +284,218,285, +219,285,218, +285,219,286, +220,286,219, +286,220,287, +221,287,220, +287,221,288, +222,288,221, +288,222,289, +223,289,222, +289,223,290, +224,290,223, +290,224,291, +225,291,224, +291,225,292, +226,292,225, +292,226,293, +227,293,226, +293,227,294, +228,294,227, +294,228,295, +229,295,228, +295,229,296, +230,296,229, +296,230,297, +231,297,230, +297,231,298, +232,298,231, +298,232,299, +233,299,232, +299,233,300, +234,300,233, +300,234,301, +235,301,234, +301,235,302, +236,302,235, +302,236,303, +237,303,236, +303,237,304, +238,304,237, +304,238,305, +239,305,238, +305,239,306, +240,306,239, +306,240,307, +241,307,240, +307,241,308, +242,308,241, +308,242,309, +243,309,242, +309,243,310, +244,310,243, +310,244,311, +245,311,244, +311,245,312, +246,312,245, +312,246,313, +247,313,246, +313,247,314, +248,314,247, +314,248,315, +249,315,248, +315,249,316, +250,316,249, +316,250,317, +251,317,250, +317,251,318, +252,318,251, +318,252,319, +253,319,252, +319,253,320, +254,320,253, +320,254,321, +255,321,254, +321,255,322, +256,322,255, +322,256,323, +257,323,256, +323,257,324, +258,324,257, +324,258,325, +259,325,258, +325,259,326, +260,326,259, +326,260,327, +261,327,260, +327,261,328, +262,328,261, +328,262,329, +263,329,262, +330,264,331, +265,331,264, +331,265,332, +266,332,265, +332,266,333, +267,333,266, +333,267,334, +268,334,267, +334,268,335, +269,335,268, +335,269,336, +270,336,269, +336,270,337, +271,337,270, +337,271,338, +272,338,271, +338,272,339, +273,339,272, +339,273,340, +274,340,273, +340,274,341, +275,341,274, +341,275,342, +276,342,275, +342,276,343, +277,343,276, +343,277,344, +278,344,277, +344,278,345, +279,345,278, +345,279,346, +280,346,279, +346,280,347, +281,347,280, +347,281,348, +282,348,281, +348,282,349, +283,349,282, +349,283,350, +284,350,283, +350,284,351, +285,351,284, +351,285,352, +286,352,285, +352,286,353, +287,353,286, +353,287,354, +288,354,287, +354,288,355, +289,355,288, +355,289,356, +290,356,289, +356,290,357, +291,357,290, +357,291,358, +292,358,291, +358,292,359, +293,359,292, +359,293,360, +294,360,293, +360,294,361, +295,361,294, +361,295,362, +296,362,295, +362,296,363, +297,363,296, +363,297,364, +298,364,297, +364,298,365, +299,365,298, +365,299,366, +300,366,299, +366,300,367, +301,367,300, +367,301,368, +302,368,301, +368,302,369, +303,369,302, +369,303,370, +304,370,303, +370,304,371, +305,371,304, +371,305,372, +306,372,305, +372,306,373, +307,373,306, +373,307,374, +308,374,307, +374,308,375, +309,375,308, +375,309,376, +310,376,309, +376,310,377, +311,377,310, +377,311,378, +312,378,311, +378,312,379, +313,379,312, +379,313,380, +314,380,313, +380,314,381, +315,381,314, +381,315,382, +316,382,315, +382,316,383, +317,383,316, +383,317,384, +318,384,317, +384,318,385, +319,385,318, +385,319,386, +320,386,319, +386,320,387, +321,387,320, +387,321,388, +322,388,321, +388,322,389, +323,389,322, +389,323,390, +324,390,323, +390,324,391, +325,391,324, +391,325,392, +326,392,325, +392,326,393, +327,393,326, +393,327,394, +328,394,327, +394,328,395, +329,395,328, +396,330,397, +331,397,330, +397,331,398, +332,398,331, +398,332,399, +333,399,332, +399,333,400, +334,400,333, +400,334,401, +335,401,334, +401,335,402, +336,402,335, +402,336,403, +337,403,336, +403,337,404, +338,404,337, +404,338,405, +339,405,338, +405,339,406, +340,406,339, +406,340,407, +341,407,340, +407,341,408, +342,408,341, +408,342,409, +343,409,342, +409,343,410, +344,410,343, +410,344,411, +345,411,344, +411,345,412, +346,412,345, +412,346,413, +347,413,346, +413,347,414, +348,414,347, +414,348,415, +349,415,348, +415,349,416, +350,416,349, +416,350,417, +351,417,350, +417,351,418, +352,418,351, +418,352,419, +353,419,352, +419,353,420, +354,420,353, +420,354,421, +355,421,354, +421,355,422, +356,422,355, +422,356,423, +357,423,356, +423,357,424, +358,424,357, +424,358,425, +359,425,358, +425,359,426, +360,426,359, +426,360,427, +361,427,360, +427,361,428, +362,428,361, +428,362,429, +363,429,362, +429,363,430, +364,430,363, +430,364,431, +365,431,364, +431,365,432, +366,432,365, +432,366,433, +367,433,366, +433,367,434, +368,434,367, +434,368,435, +369,435,368, +435,369,436, +370,436,369, +436,370,437, +371,437,370, +437,371,438, +372,438,371, +438,372,439, +373,439,372, +439,373,440, +374,440,373, +440,374,441, +375,441,374, +441,375,442, +376,442,375, +442,376,443, +377,443,376, +443,377,444, +378,444,377, +444,378,445, +379,445,378, +445,379,446, +380,446,379, +446,380,447, +381,447,380, +447,381,448, +382,448,381, +448,382,449, +383,449,382, +449,383,450, +384,450,383, +450,384,451, +385,451,384, +451,385,452, +386,452,385, +452,386,453, +387,453,386, +453,387,454, +388,454,387, +454,388,455, +389,455,388, +455,389,456, +390,456,389, +456,390,457, +391,457,390, +457,391,458, +392,458,391, +458,392,459, +393,459,392, +459,393,460, +394,460,393, +460,394,461, +395,461,394, +462,396,463, +397,463,396, +463,397,464, +398,464,397, +464,398,465, +399,465,398, +465,399,466, +400,466,399, +466,400,467, +401,467,400, +467,401,468, +402,468,401, +468,402,469, +403,469,402, +469,403,470, +404,470,403, +470,404,471, +405,471,404, +471,405,472, +406,472,405, +472,406,473, +407,473,406, +473,407,474, +408,474,407, +474,408,475, +409,475,408, +475,409,476, +410,476,409, +476,410,477, +411,477,410, +477,411,478, +412,478,411, +478,412,479, +413,479,412, +479,413,480, +414,480,413, +480,414,481, +415,481,414, +481,415,482, +416,482,415, +482,416,483, +417,483,416, +483,417,484, +418,484,417, +484,418,485, +419,485,418, +485,419,486, +420,486,419, +486,420,487, +421,487,420, +487,421,488, +422,488,421, +488,422,489, +423,489,422, +489,423,490, +424,490,423, +490,424,491, +425,491,424, +491,425,492, +426,492,425, +492,426,493, +427,493,426, +493,427,494, +428,494,427, +494,428,495, +429,495,428, +495,429,496, +430,496,429, +496,430,497, +431,497,430, +497,431,498, +432,498,431, +498,432,499, +433,499,432, +499,433,500, +434,500,433, +500,434,501, +435,501,434, +501,435,502, +436,502,435, +502,436,503, +437,503,436, +503,437,504, +438,504,437, +504,438,505, +439,505,438, +505,439,506, +440,506,439, +506,440,507, +441,507,440, +507,441,508, +442,508,441, +508,442,509, +443,509,442, +509,443,510, +444,510,443, +510,444,511, +445,511,444, +511,445,512, +446,512,445, +512,446,513, +447,513,446, +513,447,514, +448,514,447, +514,448,515, +449,515,448, +515,449,516, +450,516,449, +516,450,517, +451,517,450, +517,451,518, +452,518,451, +518,452,519, +453,519,452, +519,453,520, +454,520,453, +520,454,521, +455,521,454, +521,455,522, +456,522,455, +522,456,523, +457,523,456, +523,457,524, +458,524,457, +524,458,525, +459,525,458, +525,459,526, +460,526,459, +526,460,527, +461,527,460, +528,462,529, +463,529,462, +529,463,530, +464,530,463, +530,464,531, +465,531,464, +531,465,532, +466,532,465, +532,466,533, +467,533,466, +533,467,534, +468,534,467, +534,468,535, +469,535,468, +535,469,536, +470,536,469, +536,470,537, +471,537,470, +537,471,538, +472,538,471, +538,472,539, +473,539,472, +539,473,540, +474,540,473, +540,474,541, +475,541,474, +541,475,542, +476,542,475, +542,476,543, +477,543,476, +543,477,544, +478,544,477, +544,478,545, +479,545,478, +545,479,546, +480,546,479, +546,480,547, +481,547,480, +547,481,548, +482,548,481, +548,482,549, +483,549,482, +549,483,550, +484,550,483, +550,484,551, +485,551,484, +551,485,552, +486,552,485, +552,486,553, +487,553,486, +553,487,554, +488,554,487, +554,488,555, +489,555,488, +555,489,556, +490,556,489, +556,490,557, +491,557,490, +557,491,558, +492,558,491, +558,492,559, +493,559,492, +559,493,560, +494,560,493, +560,494,561, +495,561,494, +561,495,562, +496,562,495, +562,496,563, +497,563,496, +563,497,564, +498,564,497, +564,498,565, +499,565,498, +565,499,566, +500,566,499, +566,500,567, +501,567,500, +567,501,568, +502,568,501, +568,502,569, +503,569,502, +569,503,570, +504,570,503, +570,504,571, +505,571,504, +571,505,572, +506,572,505, +572,506,573, +507,573,506, +573,507,574, +508,574,507, +574,508,575, +509,575,508, +575,509,576, +510,576,509, +576,510,577, +511,577,510, +577,511,578, +512,578,511, +578,512,579, +513,579,512, +579,513,580, +514,580,513, +580,514,581, +515,581,514, +581,515,582, +516,582,515, +582,516,583, +517,583,516, +583,517,584, +518,584,517, +584,518,585, +519,585,518, +585,519,586, +520,586,519, +586,520,587, +521,587,520, +587,521,588, +522,588,521, +588,522,589, +523,589,522, +589,523,590, +524,590,523, +590,524,591, +525,591,524, +591,525,592, +526,592,525, +592,526,593, +527,593,526, +594,528,595, +529,595,528, +595,529,596, +530,596,529, +596,530,597, +531,597,530, +597,531,598, +532,598,531, +598,532,599, +533,599,532, +599,533,600, +534,600,533, +600,534,601, +535,601,534, +601,535,602, +536,602,535, +602,536,603, +537,603,536, +603,537,604, +538,604,537, +604,538,605, +539,605,538, +605,539,606, +540,606,539, +606,540,607, +541,607,540, +607,541,608, +542,608,541, +608,542,609, +543,609,542, +609,543,610, +544,610,543, +610,544,611, +545,611,544, +611,545,612, +546,612,545, +612,546,613, +547,613,546, +613,547,614, +548,614,547, +614,548,615, +549,615,548, +615,549,616, +550,616,549, +616,550,617, +551,617,550, +617,551,618, +552,618,551, +618,552,619, +553,619,552, +619,553,620, +554,620,553, +620,554,621, +555,621,554, +621,555,622, +556,622,555, +622,556,623, +557,623,556, +623,557,624, +558,624,557, +624,558,625, +559,625,558, +625,559,626, +560,626,559, +626,560,627, +561,627,560, +627,561,628, +562,628,561, +628,562,629, +563,629,562, +629,563,630, +564,630,563, +630,564,631, +565,631,564, +631,565,632, +566,632,565, +632,566,633, +567,633,566, +633,567,634, +568,634,567, +634,568,635, +569,635,568, +635,569,636, +570,636,569, +636,570,637, +571,637,570, +637,571,638, +572,638,571, +638,572,639, +573,639,572, +639,573,640, +574,640,573, +640,574,641, +575,641,574, +641,575,642, +576,642,575, +642,576,643, +577,643,576, +643,577,644, +578,644,577, +644,578,645, +579,645,578, +645,579,646, +580,646,579, +646,580,647, +581,647,580, +647,581,648, +582,648,581, +648,582,649, +583,649,582, +649,583,650, +584,650,583, +650,584,651, +585,651,584, +651,585,652, +586,652,585, +652,586,653, +587,653,586, +653,587,654, +588,654,587, +654,588,655, +589,655,588, +655,589,656, +590,656,589, +656,590,657, +591,657,590, +657,591,658, +592,658,591, +658,592,659, +593,659,592, +660,594,661, +595,661,594, +661,595,662, +596,662,595, +662,596,663, +597,663,596, +663,597,664, +598,664,597, +664,598,665, +599,665,598, +665,599,666, +600,666,599, +666,600,667, +601,667,600, +667,601,668, +602,668,601, +668,602,669, +603,669,602, +669,603,670, +604,670,603, +670,604,671, +605,671,604, +671,605,672, +606,672,605, +672,606,673, +607,673,606, +673,607,674, +608,674,607, +674,608,675, +609,675,608, +675,609,676, +610,676,609, +676,610,677, +611,677,610, +677,611,678, +612,678,611, +678,612,679, +613,679,612, +679,613,680, +614,680,613, +680,614,681, +615,681,614, +681,615,682, +616,682,615, +682,616,683, +617,683,616, +683,617,684, +618,684,617, +684,618,685, +619,685,618, +685,619,686, +620,686,619, +686,620,687, +621,687,620, +687,621,688, +622,688,621, +688,622,689, +623,689,622, +689,623,690, +624,690,623, +690,624,691, +625,691,624, +691,625,692, +626,692,625, +692,626,693, +627,693,626, +693,627,694, +628,694,627, +694,628,695, +629,695,628, +695,629,696, +630,696,629, +696,630,697, +631,697,630, +697,631,698, +632,698,631, +698,632,699, +633,699,632, +699,633,700, +634,700,633, +700,634,701, +635,701,634, +701,635,702, +636,702,635, +702,636,703, +637,703,636, +703,637,704, +638,704,637, +704,638,705, +639,705,638, +705,639,706, +640,706,639, +706,640,707, +641,707,640, +707,641,708, +642,708,641, +708,642,709, +643,709,642, +709,643,710, +644,710,643, +710,644,711, +645,711,644, +711,645,712, +646,712,645, +712,646,713, +647,713,646, +713,647,714, +648,714,647, +714,648,715, +649,715,648, +715,649,716, +650,716,649, +716,650,717, +651,717,650, +717,651,718, +652,718,651, +718,652,719, +653,719,652, +719,653,720, +654,720,653, +720,654,721, +655,721,654, +721,655,722, +656,722,655, +722,656,723, +657,723,656, +723,657,724, +658,724,657, +724,658,725, +659,725,658, +726,660,727, +661,727,660, +727,661,728, +662,728,661, +728,662,729, +663,729,662, +729,663,730, +664,730,663, +730,664,731, +665,731,664, +731,665,732, +666,732,665, +732,666,733, +667,733,666, +733,667,734, +668,734,667, +734,668,735, +669,735,668, +735,669,736, +670,736,669, +736,670,737, +671,737,670, +737,671,738, +672,738,671, +738,672,739, +673,739,672, +739,673,740, +674,740,673, +740,674,741, +675,741,674, +741,675,742, +676,742,675, +742,676,743, +677,743,676, +743,677,744, +678,744,677, +744,678,745, +679,745,678, +745,679,746, +680,746,679, +746,680,747, +681,747,680, +747,681,748, +682,748,681, +748,682,749, +683,749,682, +749,683,750, +684,750,683, +750,684,751, +685,751,684, +751,685,752, +686,752,685, +752,686,753, +687,753,686, +753,687,754, +688,754,687, +754,688,755, +689,755,688, +755,689,756, +690,756,689, +756,690,757, +691,757,690, +757,691,758, +692,758,691, +758,692,759, +693,759,692, +759,693,760, +694,760,693, +760,694,761, +695,761,694, +761,695,762, +696,762,695, +762,696,763, +697,763,696, +763,697,764, +698,764,697, +764,698,765, +699,765,698, +765,699,766, +700,766,699, +766,700,767, +701,767,700, +767,701,768, +702,768,701, +768,702,769, +703,769,702, +769,703,770, +704,770,703, +770,704,771, +705,771,704, +771,705,772, +706,772,705, +772,706,773, +707,773,706, +773,707,774, +708,774,707, +774,708,775, +709,775,708, +775,709,776, +710,776,709, +776,710,777, +711,777,710, +777,711,778, +712,778,711, +778,712,779, +713,779,712, +779,713,780, +714,780,713, +780,714,781, +715,781,714, +781,715,782, +716,782,715, +782,716,783, +717,783,716, +783,717,784, +718,784,717, +784,718,785, +719,785,718, +785,719,786, +720,786,719, +786,720,787, +721,787,720, +787,721,788, +722,788,721, +788,722,789, +723,789,722, +789,723,790, +724,790,723, +790,724,791, +725,791,724, +792,726,793, +727,793,726, +793,727,794, +728,794,727, +794,728,795, +729,795,728, +795,729,796, +730,796,729, +796,730,797, +731,797,730, +797,731,798, +732,798,731, +798,732,799, +733,799,732, +799,733,800, +734,800,733, +800,734,801, +735,801,734, +801,735,802, +736,802,735, +802,736,803, +737,803,736, +803,737,804, +738,804,737, +804,738,805, +739,805,738, +805,739,806, +740,806,739, +806,740,807, +741,807,740, +807,741,808, +742,808,741, +808,742,809, +743,809,742, +809,743,810, +744,810,743, +810,744,811, +745,811,744, +811,745,812, +746,812,745, +812,746,813, +747,813,746, +813,747,814, +748,814,747, +814,748,815, +749,815,748, +815,749,816, +750,816,749, +816,750,817, +751,817,750, +817,751,818, +752,818,751, +818,752,819, +753,819,752, +819,753,820, +754,820,753, +820,754,821, +755,821,754, +821,755,822, +756,822,755, +822,756,823, +757,823,756, +823,757,824, +758,824,757, +824,758,825, +759,825,758, +825,759,826, +760,826,759, +826,760,827, +761,827,760, +827,761,828, +762,828,761, +828,762,829, +763,829,762, +829,763,830, +764,830,763, +830,764,831, +765,831,764, +831,765,832, +766,832,765, +832,766,833, +767,833,766, +833,767,834, +768,834,767, +834,768,835, +769,835,768, +835,769,836, +770,836,769, +836,770,837, +771,837,770, +837,771,838, +772,838,771, +838,772,839, +773,839,772, +839,773,840, +774,840,773, +840,774,841, +775,841,774, +841,775,842, +776,842,775, +842,776,843, +777,843,776, +843,777,844, +778,844,777, +844,778,845, +779,845,778, +845,779,846, +780,846,779, +846,780,847, +781,847,780, +847,781,848, +782,848,781, +848,782,849, +783,849,782, +849,783,850, +784,850,783, +850,784,851, +785,851,784, +851,785,852, +786,852,785, +852,786,853, +787,853,786, +853,787,854, +788,854,787, +854,788,855, +789,855,788, +855,789,856, +790,856,789, +856,790,857, +791,857,790, +858,792,859, +793,859,792, +859,793,860, +794,860,793, +860,794,861, +795,861,794, +861,795,862, +796,862,795, +862,796,863, +797,863,796, +863,797,864, +798,864,797, +864,798,865, +799,865,798, +865,799,866, +800,866,799, +866,800,867, +801,867,800, +867,801,868, +802,868,801, +868,802,869, +803,869,802, +869,803,870, +804,870,803, +870,804,871, +805,871,804, +871,805,872, +806,872,805, +872,806,873, +807,873,806, +873,807,874, +808,874,807, +874,808,875, +809,875,808, +875,809,876, +810,876,809, +876,810,877, +811,877,810, +877,811,878, +812,878,811, +878,812,879, +813,879,812, +879,813,880, +814,880,813, +880,814,881, +815,881,814, +881,815,882, +816,882,815, +882,816,883, +817,883,816, +883,817,884, +818,884,817, +884,818,885, +819,885,818, +885,819,886, +820,886,819, +886,820,887, +821,887,820, +887,821,888, +822,888,821, +888,822,889, +823,889,822, +889,823,890, +824,890,823, +890,824,891, +825,891,824, +891,825,892, +826,892,825, +892,826,893, +827,893,826, +893,827,894, +828,894,827, +894,828,895, +829,895,828, +895,829,896, +830,896,829, +896,830,897, +831,897,830, +897,831,898, +832,898,831, +898,832,899, +833,899,832, +899,833,900, +834,900,833, +900,834,901, +835,901,834, +901,835,902, +836,902,835, +902,836,903, +837,903,836, +903,837,904, +838,904,837, +904,838,905, +839,905,838, +905,839,906, +840,906,839, +906,840,907, +841,907,840, +907,841,908, +842,908,841, +908,842,909, +843,909,842, +909,843,910, +844,910,843, +910,844,911, +845,911,844, +911,845,912, +846,912,845, +912,846,913, +847,913,846, +913,847,914, +848,914,847, +914,848,915, +849,915,848, +915,849,916, +850,916,849, +916,850,917, +851,917,850, +917,851,918, +852,918,851, +918,852,919, +853,919,852, +919,853,920, +854,920,853, +920,854,921, +855,921,854, +921,855,922, +856,922,855, +922,856,923, +857,923,856, +924,858,925, +859,925,858, +925,859,926, +860,926,859, +926,860,927, +861,927,860, +927,861,928, +862,928,861, +928,862,929, +863,929,862, +929,863,930, +864,930,863, +930,864,931, +865,931,864, +931,865,932, +866,932,865, +932,866,933, +867,933,866, +933,867,934, +868,934,867, +934,868,935, +869,935,868, +935,869,936, +870,936,869, +936,870,937, +871,937,870, +937,871,938, +872,938,871, +938,872,939, +873,939,872, +939,873,940, +874,940,873, +940,874,941, +875,941,874, +941,875,942, +876,942,875, +942,876,943, +877,943,876, +943,877,944, +878,944,877, +944,878,945, +879,945,878, +945,879,946, +880,946,879, +946,880,947, +881,947,880, +947,881,948, +882,948,881, +948,882,949, +883,949,882, +949,883,950, +884,950,883, +950,884,951, +885,951,884, +951,885,952, +886,952,885, +952,886,953, +887,953,886, +953,887,954, +888,954,887, +954,888,955, +889,955,888, +955,889,956, +890,956,889, +956,890,957, +891,957,890, +957,891,958, +892,958,891, +958,892,959, +893,959,892, +959,893,960, +894,960,893, +960,894,961, +895,961,894, +961,895,962, +896,962,895, +962,896,963, +897,963,896, +963,897,964, +898,964,897, +964,898,965, +899,965,898, +965,899,966, +900,966,899, +966,900,967, +901,967,900, +967,901,968, +902,968,901, +968,902,969, +903,969,902, +969,903,970, +904,970,903, +970,904,971, +905,971,904, +971,905,972, +906,972,905, +972,906,973, +907,973,906, +973,907,974, +908,974,907, +974,908,975, +909,975,908, +975,909,976, +910,976,909, +976,910,977, +911,977,910, +977,911,978, +912,978,911, +978,912,979, +913,979,912, +979,913,980, +914,980,913, +980,914,981, +915,981,914, +981,915,982, +916,982,915, +982,916,983, +917,983,916, +983,917,984, +918,984,917, +984,918,985, +919,985,918, +985,919,986, +920,986,919, +986,920,987, +921,987,920, +987,921,988, +922,988,921, +988,922,989, +923,989,922, +990,924,991, +925,991,924, +991,925,992, +926,992,925, +992,926,993, +927,993,926, +993,927,994, +928,994,927, +994,928,995, +929,995,928, +995,929,996, +930,996,929, +996,930,997, +931,997,930, +997,931,998, +932,998,931, +998,932,999, +933,999,932, +999,933,1000, +934,1000,933, +1000,934,1001, +935,1001,934, +1001,935,1002, +936,1002,935, +1002,936,1003, +937,1003,936, +1003,937,1004, +938,1004,937, +1004,938,1005, +939,1005,938, +1005,939,1006, +940,1006,939, +1006,940,1007, +941,1007,940, +1007,941,1008, +942,1008,941, +1008,942,1009, +943,1009,942, +1009,943,1010, +944,1010,943, +1010,944,1011, +945,1011,944, +1011,945,1012, +946,1012,945, +1012,946,1013, +947,1013,946, +1013,947,1014, +948,1014,947, +1014,948,1015, +949,1015,948, +1015,949,1016, +950,1016,949, +1016,950,1017, +951,1017,950, +1017,951,1018, +952,1018,951, +1018,952,1019, +953,1019,952, +1019,953,1020, +954,1020,953, +1020,954,1021, +955,1021,954, +1021,955,1022, +956,1022,955, +1022,956,1023, +957,1023,956, +1023,957,1024, +958,1024,957, +1024,958,1025, +959,1025,958, +1025,959,1026, +960,1026,959, +1026,960,1027, +961,1027,960, +1027,961,1028, +962,1028,961, +1028,962,1029, +963,1029,962, +1029,963,1030, +964,1030,963, +1030,964,1031, +965,1031,964, +1031,965,1032, +966,1032,965, +1032,966,1033, +967,1033,966, +1033,967,1034, +968,1034,967, +1034,968,1035, +969,1035,968, +1035,969,1036, +970,1036,969, +1036,970,1037, +971,1037,970, +1037,971,1038, +972,1038,971, +1038,972,1039, +973,1039,972, +1039,973,1040, +974,1040,973, +1040,974,1041, +975,1041,974, +1041,975,1042, +976,1042,975, +1042,976,1043, +977,1043,976, +1043,977,1044, +978,1044,977, +1044,978,1045, +979,1045,978, +1045,979,1046, +980,1046,979, +1046,980,1047, +981,1047,980, +1047,981,1048, +982,1048,981, +1048,982,1049, +983,1049,982, +1049,983,1050, +984,1050,983, +1050,984,1051, +985,1051,984, +1051,985,1052, +986,1052,985, +1052,986,1053, +987,1053,986, +1053,987,1054, +988,1054,987, +1054,988,1055, +989,1055,988, +1056,990,1057, +991,1057,990, +1057,991,1058, +992,1058,991, +1058,992,1059, +993,1059,992, +1059,993,1060, +994,1060,993, +1060,994,1061, +995,1061,994, +1061,995,1062, +996,1062,995, +1062,996,1063, +997,1063,996, +1063,997,1064, +998,1064,997, +1064,998,1065, +999,1065,998, +1065,999,1066, +1000,1066,999, +1066,1000,1067, +1001,1067,1000, +1067,1001,1068, +1002,1068,1001, +1068,1002,1069, +1003,1069,1002, +1069,1003,1070, +1004,1070,1003, +1070,1004,1071, +1005,1071,1004, +1071,1005,1072, +1006,1072,1005, +1072,1006,1073, +1007,1073,1006, +1073,1007,1074, +1008,1074,1007, +1074,1008,1075, +1009,1075,1008, +1075,1009,1076, +1010,1076,1009, +1076,1010,1077, +1011,1077,1010, +1077,1011,1078, +1012,1078,1011, +1078,1012,1079, +1013,1079,1012, +1079,1013,1080, +1014,1080,1013, +1080,1014,1081, +1015,1081,1014, +1081,1015,1082, +1016,1082,1015, +1082,1016,1083, +1017,1083,1016, +1083,1017,1084, +1018,1084,1017, +1084,1018,1085, +1019,1085,1018, +1085,1019,1086, +1020,1086,1019, +1086,1020,1087, +1021,1087,1020, +1087,1021,1088, +1022,1088,1021, +1088,1022,1089, +1023,1089,1022, +1089,1023,1090, +1024,1090,1023, +1090,1024,1091, +1025,1091,1024, +1091,1025,1092, +1026,1092,1025, +1092,1026,1093, +1027,1093,1026, +1093,1027,1094, +1028,1094,1027, +1094,1028,1095, +1029,1095,1028, +1095,1029,1096, +1030,1096,1029, +1096,1030,1097, +1031,1097,1030, +1097,1031,1098, +1032,1098,1031, +1098,1032,1099, +1033,1099,1032, +1099,1033,1100, +1034,1100,1033, +1100,1034,1101, +1035,1101,1034, +1101,1035,1102, +1036,1102,1035, +1102,1036,1103, +1037,1103,1036, +1103,1037,1104, +1038,1104,1037, +1104,1038,1105, +1039,1105,1038, +1105,1039,1106, +1040,1106,1039, +1106,1040,1107, +1041,1107,1040, +1107,1041,1108, +1042,1108,1041, +1108,1042,1109, +1043,1109,1042, +1109,1043,1110, +1044,1110,1043, +1110,1044,1111, +1045,1111,1044, +1111,1045,1112, +1046,1112,1045, +1112,1046,1113, +1047,1113,1046, +1113,1047,1114, +1048,1114,1047, +1114,1048,1115, +1049,1115,1048, +1115,1049,1116, +1050,1116,1049, +1116,1050,1117, +1051,1117,1050, +1117,1051,1118, +1052,1118,1051, +1118,1052,1119, +1053,1119,1052, +1119,1053,1120, +1054,1120,1053, +1120,1054,1121, +1055,1121,1054, +1122,1056,1123, +1057,1123,1056, +1123,1057,1124, +1058,1124,1057, +1124,1058,1125, +1059,1125,1058, +1125,1059,1126, +1060,1126,1059, +1126,1060,1127, +1061,1127,1060, +1127,1061,1128, +1062,1128,1061, +1128,1062,1129, +1063,1129,1062, +1129,1063,1130, +1064,1130,1063, +1130,1064,1131, +1065,1131,1064, +1131,1065,1132, +1066,1132,1065, +1132,1066,1133, +1067,1133,1066, +1133,1067,1134, +1068,1134,1067, +1134,1068,1135, +1069,1135,1068, +1135,1069,1136, +1070,1136,1069, +1136,1070,1137, +1071,1137,1070, +1137,1071,1138, +1072,1138,1071, +1138,1072,1139, +1073,1139,1072, +1139,1073,1140, +1074,1140,1073, +1140,1074,1141, +1075,1141,1074, +1141,1075,1142, +1076,1142,1075, +1142,1076,1143, +1077,1143,1076, +1143,1077,1144, +1078,1144,1077, +1144,1078,1145, +1079,1145,1078, +1145,1079,1146, +1080,1146,1079, +1146,1080,1147, +1081,1147,1080, +1147,1081,1148, +1082,1148,1081, +1148,1082,1149, +1083,1149,1082, +1149,1083,1150, +1084,1150,1083, +1150,1084,1151, +1085,1151,1084, +1151,1085,1152, +1086,1152,1085, +1152,1086,1153, +1087,1153,1086, +1153,1087,1154, +1088,1154,1087, +1154,1088,1155, +1089,1155,1088, +1155,1089,1156, +1090,1156,1089, +1156,1090,1157, +1091,1157,1090, +1157,1091,1158, +1092,1158,1091, +1158,1092,1159, +1093,1159,1092, +1159,1093,1160, +1094,1160,1093, +1160,1094,1161, +1095,1161,1094, +1161,1095,1162, +1096,1162,1095, +1162,1096,1163, +1097,1163,1096, +1163,1097,1164, +1098,1164,1097, +1164,1098,1165, +1099,1165,1098, +1165,1099,1166, +1100,1166,1099, +1166,1100,1167, +1101,1167,1100, +1167,1101,1168, +1102,1168,1101, +1168,1102,1169, +1103,1169,1102, +1169,1103,1170, +1104,1170,1103, +1170,1104,1171, +1105,1171,1104, +1171,1105,1172, +1106,1172,1105, +1172,1106,1173, +1107,1173,1106, +1173,1107,1174, +1108,1174,1107, +1174,1108,1175, +1109,1175,1108, +1175,1109,1176, +1110,1176,1109, +1176,1110,1177, +1111,1177,1110, +1177,1111,1178, +1112,1178,1111, +1178,1112,1179, +1113,1179,1112, +1179,1113,1180, +1114,1180,1113, +1180,1114,1181, +1115,1181,1114, +1181,1115,1182, +1116,1182,1115, +1182,1116,1183, +1117,1183,1116, +1183,1117,1184, +1118,1184,1117, +1184,1118,1185, +1119,1185,1118, +1185,1119,1186, +1120,1186,1119, +1186,1120,1187, +1121,1187,1120, +1188,1122,1189, +1123,1189,1122, +1189,1123,1190, +1124,1190,1123, +1190,1124,1191, +1125,1191,1124, +1191,1125,1192, +1126,1192,1125, +1192,1126,1193, +1127,1193,1126, +1193,1127,1194, +1128,1194,1127, +1194,1128,1195, +1129,1195,1128, +1195,1129,1196, +1130,1196,1129, +1196,1130,1197, +1131,1197,1130, +1197,1131,1198, +1132,1198,1131, +1198,1132,1199, +1133,1199,1132, +1199,1133,1200, +1134,1200,1133, +1200,1134,1201, +1135,1201,1134, +1201,1135,1202, +1136,1202,1135, +1202,1136,1203, +1137,1203,1136, +1203,1137,1204, +1138,1204,1137, +1204,1138,1205, +1139,1205,1138, +1205,1139,1206, +1140,1206,1139, +1206,1140,1207, +1141,1207,1140, +1207,1141,1208, +1142,1208,1141, +1208,1142,1209, +1143,1209,1142, +1209,1143,1210, +1144,1210,1143, +1210,1144,1211, +1145,1211,1144, +1211,1145,1212, +1146,1212,1145, +1212,1146,1213, +1147,1213,1146, +1213,1147,1214, +1148,1214,1147, +1214,1148,1215, +1149,1215,1148, +1215,1149,1216, +1150,1216,1149, +1216,1150,1217, +1151,1217,1150, +1217,1151,1218, +1152,1218,1151, +1218,1152,1219, +1153,1219,1152, +1219,1153,1220, +1154,1220,1153, +1220,1154,1221, +1155,1221,1154, +1221,1155,1222, +1156,1222,1155, +1222,1156,1223, +1157,1223,1156, +1223,1157,1224, +1158,1224,1157, +1224,1158,1225, +1159,1225,1158, +1225,1159,1226, +1160,1226,1159, +1226,1160,1227, +1161,1227,1160, +1227,1161,1228, +1162,1228,1161, +1228,1162,1229, +1163,1229,1162, +1229,1163,1230, +1164,1230,1163, +1230,1164,1231, +1165,1231,1164, +1231,1165,1232, +1166,1232,1165, +1232,1166,1233, +1167,1233,1166, +1233,1167,1234, +1168,1234,1167, +1234,1168,1235, +1169,1235,1168, +1235,1169,1236, +1170,1236,1169, +1236,1170,1237, +1171,1237,1170, +1237,1171,1238, +1172,1238,1171, +1238,1172,1239, +1173,1239,1172, +1239,1173,1240, +1174,1240,1173, +1240,1174,1241, +1175,1241,1174, +1241,1175,1242, +1176,1242,1175, +1242,1176,1243, +1177,1243,1176, +1243,1177,1244, +1178,1244,1177, +1244,1178,1245, +1179,1245,1178, +1245,1179,1246, +1180,1246,1179, +1246,1180,1247, +1181,1247,1180, +1247,1181,1248, +1182,1248,1181, +1248,1182,1249, +1183,1249,1182, +1249,1183,1250, +1184,1250,1183, +1250,1184,1251, +1185,1251,1184, +1251,1185,1252, +1186,1252,1185, +1252,1186,1253, +1187,1253,1186, +1254,1188,1255, +1189,1255,1188, +1255,1189,1256, +1190,1256,1189, +1256,1190,1257, +1191,1257,1190, +1257,1191,1258, +1192,1258,1191, +1258,1192,1259, +1193,1259,1192, +1259,1193,1260, +1194,1260,1193, +1260,1194,1261, +1195,1261,1194, +1261,1195,1262, +1196,1262,1195, +1262,1196,1263, +1197,1263,1196, +1263,1197,1264, +1198,1264,1197, +1264,1198,1265, +1199,1265,1198, +1265,1199,1266, +1200,1266,1199, +1266,1200,1267, +1201,1267,1200, +1267,1201,1268, +1202,1268,1201, +1268,1202,1269, +1203,1269,1202, +1269,1203,1270, +1204,1270,1203, +1270,1204,1271, +1205,1271,1204, +1271,1205,1272, +1206,1272,1205, +1272,1206,1273, +1207,1273,1206, +1273,1207,1274, +1208,1274,1207, +1274,1208,1275, +1209,1275,1208, +1275,1209,1276, +1210,1276,1209, +1276,1210,1277, +1211,1277,1210, +1277,1211,1278, +1212,1278,1211, +1278,1212,1279, +1213,1279,1212, +1279,1213,1280, +1214,1280,1213, +1280,1214,1281, +1215,1281,1214, +1281,1215,1282, +1216,1282,1215, +1282,1216,1283, +1217,1283,1216, +1283,1217,1284, +1218,1284,1217, +1284,1218,1285, +1219,1285,1218, +1285,1219,1286, +1220,1286,1219, +1286,1220,1287, +1221,1287,1220, +1287,1221,1288, +1222,1288,1221, +1288,1222,1289, +1223,1289,1222, +1289,1223,1290, +1224,1290,1223, +1290,1224,1291, +1225,1291,1224, +1291,1225,1292, +1226,1292,1225, +1292,1226,1293, +1227,1293,1226, +1293,1227,1294, +1228,1294,1227, +1294,1228,1295, +1229,1295,1228, +1295,1229,1296, +1230,1296,1229, +1296,1230,1297, +1231,1297,1230, +1297,1231,1298, +1232,1298,1231, +1298,1232,1299, +1233,1299,1232, +1299,1233,1300, +1234,1300,1233, +1300,1234,1301, +1235,1301,1234, +1301,1235,1302, +1236,1302,1235, +1302,1236,1303, +1237,1303,1236, +1303,1237,1304, +1238,1304,1237, +1304,1238,1305, +1239,1305,1238, +1305,1239,1306, +1240,1306,1239, +1306,1240,1307, +1241,1307,1240, +1307,1241,1308, +1242,1308,1241, +1308,1242,1309, +1243,1309,1242, +1309,1243,1310, +1244,1310,1243, +1310,1244,1311, +1245,1311,1244, +1311,1245,1312, +1246,1312,1245, +1312,1246,1313, +1247,1313,1246, +1313,1247,1314, +1248,1314,1247, +1314,1248,1315, +1249,1315,1248, +1315,1249,1316, +1250,1316,1249, +1316,1250,1317, +1251,1317,1250, +1317,1251,1318, +1252,1318,1251, +1318,1252,1319, +1253,1319,1252, +1320,1254,1321, +1255,1321,1254, +1321,1255,1322, +1256,1322,1255, +1322,1256,1323, +1257,1323,1256, +1323,1257,1324, +1258,1324,1257, +1324,1258,1325, +1259,1325,1258, +1325,1259,1326, +1260,1326,1259, +1326,1260,1327, +1261,1327,1260, +1327,1261,1328, +1262,1328,1261, +1328,1262,1329, +1263,1329,1262, +1329,1263,1330, +1264,1330,1263, +1330,1264,1331, +1265,1331,1264, +1331,1265,1332, +1266,1332,1265, +1332,1266,1333, +1267,1333,1266, +1333,1267,1334, +1268,1334,1267, +1334,1268,1335, +1269,1335,1268, +1335,1269,1336, +1270,1336,1269, +1336,1270,1337, +1271,1337,1270, +1337,1271,1338, +1272,1338,1271, +1338,1272,1339, +1273,1339,1272, +1339,1273,1340, +1274,1340,1273, +1340,1274,1341, +1275,1341,1274, +1341,1275,1342, +1276,1342,1275, +1342,1276,1343, +1277,1343,1276, +1343,1277,1344, +1278,1344,1277, +1344,1278,1345, +1279,1345,1278, +1345,1279,1346, +1280,1346,1279, +1346,1280,1347, +1281,1347,1280, +1347,1281,1348, +1282,1348,1281, +1348,1282,1349, +1283,1349,1282, +1349,1283,1350, +1284,1350,1283, +1350,1284,1351, +1285,1351,1284, +1351,1285,1352, +1286,1352,1285, +1352,1286,1353, +1287,1353,1286, +1353,1287,1354, +1288,1354,1287, +1354,1288,1355, +1289,1355,1288, +1355,1289,1356, +1290,1356,1289, +1356,1290,1357, +1291,1357,1290, +1357,1291,1358, +1292,1358,1291, +1358,1292,1359, +1293,1359,1292, +1359,1293,1360, +1294,1360,1293, +1360,1294,1361, +1295,1361,1294, +1361,1295,1362, +1296,1362,1295, +1362,1296,1363, +1297,1363,1296, +1363,1297,1364, +1298,1364,1297, +1364,1298,1365, +1299,1365,1298, +1365,1299,1366, +1300,1366,1299, +1366,1300,1367, +1301,1367,1300, +1367,1301,1368, +1302,1368,1301, +1368,1302,1369, +1303,1369,1302, +1369,1303,1370, +1304,1370,1303, +1370,1304,1371, +1305,1371,1304, +1371,1305,1372, +1306,1372,1305, +1372,1306,1373, +1307,1373,1306, +1373,1307,1374, +1308,1374,1307, +1374,1308,1375, +1309,1375,1308, +1375,1309,1376, +1310,1376,1309, +1376,1310,1377, +1311,1377,1310, +1377,1311,1378, +1312,1378,1311, +1378,1312,1379, +1313,1379,1312, +1379,1313,1380, +1314,1380,1313, +1380,1314,1381, +1315,1381,1314, +1381,1315,1382, +1316,1382,1315, +1382,1316,1383, +1317,1383,1316, +1383,1317,1384, +1318,1384,1317, +1384,1318,1385, +1319,1385,1318, +1386,1320,1387, +1321,1387,1320, +1387,1321,1388, +1322,1388,1321, +1388,1322,1389, +1323,1389,1322, +1389,1323,1390, +1324,1390,1323, +1390,1324,1391, +1325,1391,1324, +1391,1325,1392, +1326,1392,1325, +1392,1326,1393, +1327,1393,1326, +1393,1327,1394, +1328,1394,1327, +1394,1328,1395, +1329,1395,1328, +1395,1329,1396, +1330,1396,1329, +1396,1330,1397, +1331,1397,1330, +1397,1331,1398, +1332,1398,1331, +1398,1332,1399, +1333,1399,1332, +1399,1333,1400, +1334,1400,1333, +1400,1334,1401, +1335,1401,1334, +1401,1335,1402, +1336,1402,1335, +1402,1336,1403, +1337,1403,1336, +1403,1337,1404, +1338,1404,1337, +1404,1338,1405, +1339,1405,1338, +1405,1339,1406, +1340,1406,1339, +1406,1340,1407, +1341,1407,1340, +1407,1341,1408, +1342,1408,1341, +1408,1342,1409, +1343,1409,1342, +1409,1343,1410, +1344,1410,1343, +1410,1344,1411, +1345,1411,1344, +1411,1345,1412, +1346,1412,1345, +1412,1346,1413, +1347,1413,1346, +1413,1347,1414, +1348,1414,1347, +1414,1348,1415, +1349,1415,1348, +1415,1349,1416, +1350,1416,1349, +1416,1350,1417, +1351,1417,1350, +1417,1351,1418, +1352,1418,1351, +1418,1352,1419, +1353,1419,1352, +1419,1353,1420, +1354,1420,1353, +1420,1354,1421, +1355,1421,1354, +1421,1355,1422, +1356,1422,1355, +1422,1356,1423, +1357,1423,1356, +1423,1357,1424, +1358,1424,1357, +1424,1358,1425, +1359,1425,1358, +1425,1359,1426, +1360,1426,1359, +1426,1360,1427, +1361,1427,1360, +1427,1361,1428, +1362,1428,1361, +1428,1362,1429, +1363,1429,1362, +1429,1363,1430, +1364,1430,1363, +1430,1364,1431, +1365,1431,1364, +1431,1365,1432, +1366,1432,1365, +1432,1366,1433, +1367,1433,1366, +1433,1367,1434, +1368,1434,1367, +1434,1368,1435, +1369,1435,1368, +1435,1369,1436, +1370,1436,1369, +1436,1370,1437, +1371,1437,1370, +1437,1371,1438, +1372,1438,1371, +1438,1372,1439, +1373,1439,1372, +1439,1373,1440, +1374,1440,1373, +1440,1374,1441, +1375,1441,1374, +1441,1375,1442, +1376,1442,1375, +1442,1376,1443, +1377,1443,1376, +1443,1377,1444, +1378,1444,1377, +1444,1378,1445, +1379,1445,1378, +1445,1379,1446, +1380,1446,1379, +1446,1380,1447, +1381,1447,1380, +1447,1381,1448, +1382,1448,1381, +1448,1382,1449, +1383,1449,1382, +1449,1383,1450, +1384,1450,1383, +1450,1384,1451, +1385,1451,1384, +1452,1386,1453, +1387,1453,1386, +1453,1387,1454, +1388,1454,1387, +1454,1388,1455, +1389,1455,1388, +1455,1389,1456, +1390,1456,1389, +1456,1390,1457, +1391,1457,1390, +1457,1391,1458, +1392,1458,1391, +1458,1392,1459, +1393,1459,1392, +1459,1393,1460, +1394,1460,1393, +1460,1394,1461, +1395,1461,1394, +1461,1395,1462, +1396,1462,1395, +1462,1396,1463, +1397,1463,1396, +1463,1397,1464, +1398,1464,1397, +1464,1398,1465, +1399,1465,1398, +1465,1399,1466, +1400,1466,1399, +1466,1400,1467, +1401,1467,1400, +1467,1401,1468, +1402,1468,1401, +1468,1402,1469, +1403,1469,1402, +1469,1403,1470, +1404,1470,1403, +1470,1404,1471, +1405,1471,1404, +1471,1405,1472, +1406,1472,1405, +1472,1406,1473, +1407,1473,1406, +1473,1407,1474, +1408,1474,1407, +1474,1408,1475, +1409,1475,1408, +1475,1409,1476, +1410,1476,1409, +1476,1410,1477, +1411,1477,1410, +1477,1411,1478, +1412,1478,1411, +1478,1412,1479, +1413,1479,1412, +1479,1413,1480, +1414,1480,1413, +1480,1414,1481, +1415,1481,1414, +1481,1415,1482, +1416,1482,1415, +1482,1416,1483, +1417,1483,1416, +1483,1417,1484, +1418,1484,1417, +1484,1418,1485, +1419,1485,1418, +1485,1419,1486, +1420,1486,1419, +1486,1420,1487, +1421,1487,1420, +1487,1421,1488, +1422,1488,1421, +1488,1422,1489, +1423,1489,1422, +1489,1423,1490, +1424,1490,1423, +1490,1424,1491, +1425,1491,1424, +1491,1425,1492, +1426,1492,1425, +1492,1426,1493, +1427,1493,1426, +1493,1427,1494, +1428,1494,1427, +1494,1428,1495, +1429,1495,1428, +1495,1429,1496, +1430,1496,1429, +1496,1430,1497, +1431,1497,1430, +1497,1431,1498, +1432,1498,1431, +1498,1432,1499, +1433,1499,1432, +1499,1433,1500, +1434,1500,1433, +1500,1434,1501, +1435,1501,1434, +1501,1435,1502, +1436,1502,1435, +1502,1436,1503, +1437,1503,1436, +1503,1437,1504, +1438,1504,1437, +1504,1438,1505, +1439,1505,1438, +1505,1439,1506, +1440,1506,1439, +1506,1440,1507, +1441,1507,1440, +1507,1441,1508, +1442,1508,1441, +1508,1442,1509, +1443,1509,1442, +1509,1443,1510, +1444,1510,1443, +1510,1444,1511, +1445,1511,1444, +1511,1445,1512, +1446,1512,1445, +1512,1446,1513, +1447,1513,1446, +1513,1447,1514, +1448,1514,1447, +1514,1448,1515, +1449,1515,1448, +1515,1449,1516, +1450,1516,1449, +1516,1450,1517, +1451,1517,1450, +1518,1452,1519, +1453,1519,1452, +1519,1453,1520, +1454,1520,1453, +1520,1454,1521, +1455,1521,1454, +1521,1455,1522, +1456,1522,1455, +1522,1456,1523, +1457,1523,1456, +1523,1457,1524, +1458,1524,1457, +1524,1458,1525, +1459,1525,1458, +1525,1459,1526, +1460,1526,1459, +1526,1460,1527, +1461,1527,1460, +1527,1461,1528, +1462,1528,1461, +1528,1462,1529, +1463,1529,1462, +1529,1463,1530, +1464,1530,1463, +1530,1464,1531, +1465,1531,1464, +1531,1465,1532, +1466,1532,1465, +1532,1466,1533, +1467,1533,1466, +1533,1467,1534, +1468,1534,1467, +1534,1468,1535, +1469,1535,1468, +1535,1469,1536, +1470,1536,1469, +1536,1470,1537, +1471,1537,1470, +1537,1471,1538, +1472,1538,1471, +1538,1472,1539, +1473,1539,1472, +1539,1473,1540, +1474,1540,1473, +1540,1474,1541, +1475,1541,1474, +1541,1475,1542, +1476,1542,1475, +1542,1476,1543, +1477,1543,1476, +1543,1477,1544, +1478,1544,1477, +1544,1478,1545, +1479,1545,1478, +1545,1479,1546, +1480,1546,1479, +1546,1480,1547, +1481,1547,1480, +1547,1481,1548, +1482,1548,1481, +1548,1482,1549, +1483,1549,1482, +1549,1483,1550, +1484,1550,1483, +1550,1484,1551, +1485,1551,1484, +1551,1485,1552, +1486,1552,1485, +1552,1486,1553, +1487,1553,1486, +1553,1487,1554, +1488,1554,1487, +1554,1488,1555, +1489,1555,1488, +1555,1489,1556, +1490,1556,1489, +1556,1490,1557, +1491,1557,1490, +1557,1491,1558, +1492,1558,1491, +1558,1492,1559, +1493,1559,1492, +1559,1493,1560, +1494,1560,1493, +1560,1494,1561, +1495,1561,1494, +1561,1495,1562, +1496,1562,1495, +1562,1496,1563, +1497,1563,1496, +1563,1497,1564, +1498,1564,1497, +1564,1498,1565, +1499,1565,1498, +1565,1499,1566, +1500,1566,1499, +1566,1500,1567, +1501,1567,1500, +1567,1501,1568, +1502,1568,1501, +1568,1502,1569, +1503,1569,1502, +1569,1503,1570, +1504,1570,1503, +1570,1504,1571, +1505,1571,1504, +1571,1505,1572, +1506,1572,1505, +1572,1506,1573, +1507,1573,1506, +1573,1507,1574, +1508,1574,1507, +1574,1508,1575, +1509,1575,1508, +1575,1509,1576, +1510,1576,1509, +1576,1510,1577, +1511,1577,1510, +1577,1511,1578, +1512,1578,1511, +1578,1512,1579, +1513,1579,1512, +1579,1513,1580, +1514,1580,1513, +1580,1514,1581, +1515,1581,1514, +1581,1515,1582, +1516,1582,1515, +1582,1516,1583, +1517,1583,1516, +1584,1518,1585, +1519,1585,1518, +1585,1519,1586, +1520,1586,1519, +1586,1520,1587, +1521,1587,1520, +1587,1521,1588, +1522,1588,1521, +1588,1522,1589, +1523,1589,1522, +1589,1523,1590, +1524,1590,1523, +1590,1524,1591, +1525,1591,1524, +1591,1525,1592, +1526,1592,1525, +1592,1526,1593, +1527,1593,1526, +1593,1527,1594, +1528,1594,1527, +1594,1528,1595, +1529,1595,1528, +1595,1529,1596, +1530,1596,1529, +1596,1530,1597, +1531,1597,1530, +1597,1531,1598, +1532,1598,1531, +1598,1532,1599, +1533,1599,1532, +1599,1533,1600, +1534,1600,1533, +1600,1534,1601, +1535,1601,1534, +1601,1535,1602, +1536,1602,1535, +1602,1536,1603, +1537,1603,1536, +1603,1537,1604, +1538,1604,1537, +1604,1538,1605, +1539,1605,1538, +1605,1539,1606, +1540,1606,1539, +1606,1540,1607, +1541,1607,1540, +1607,1541,1608, +1542,1608,1541, +1608,1542,1609, +1543,1609,1542, +1609,1543,1610, +1544,1610,1543, +1610,1544,1611, +1545,1611,1544, +1611,1545,1612, +1546,1612,1545, +1612,1546,1613, +1547,1613,1546, +1613,1547,1614, +1548,1614,1547, +1614,1548,1615, +1549,1615,1548, +1615,1549,1616, +1550,1616,1549, +1616,1550,1617, +1551,1617,1550, +1617,1551,1618, +1552,1618,1551, +1618,1552,1619, +1553,1619,1552, +1619,1553,1620, +1554,1620,1553, +1620,1554,1621, +1555,1621,1554, +1621,1555,1622, +1556,1622,1555, +1622,1556,1623, +1557,1623,1556, +1623,1557,1624, +1558,1624,1557, +1624,1558,1625, +1559,1625,1558, +1625,1559,1626, +1560,1626,1559, +1626,1560,1627, +1561,1627,1560, +1627,1561,1628, +1562,1628,1561, +1628,1562,1629, +1563,1629,1562, +1629,1563,1630, +1564,1630,1563, +1630,1564,1631, +1565,1631,1564, +1631,1565,1632, +1566,1632,1565, +1632,1566,1633, +1567,1633,1566, +1633,1567,1634, +1568,1634,1567, +1634,1568,1635, +1569,1635,1568, +1635,1569,1636, +1570,1636,1569, +1636,1570,1637, +1571,1637,1570, +1637,1571,1638, +1572,1638,1571, +1638,1572,1639, +1573,1639,1572, +1639,1573,1640, +1574,1640,1573, +1640,1574,1641, +1575,1641,1574, +1641,1575,1642, +1576,1642,1575, +1642,1576,1643, +1577,1643,1576, +1643,1577,1644, +1578,1644,1577, +1644,1578,1645, +1579,1645,1578, +1645,1579,1646, +1580,1646,1579, +1646,1580,1647, +1581,1647,1580, +1647,1581,1648, +1582,1648,1581, +1648,1582,1649, +1583,1649,1582, +1650,1584,1651, +1585,1651,1584, +1651,1585,1652, +1586,1652,1585, +1652,1586,1653, +1587,1653,1586, +1653,1587,1654, +1588,1654,1587, +1654,1588,1655, +1589,1655,1588, +1655,1589,1656, +1590,1656,1589, +1656,1590,1657, +1591,1657,1590, +1657,1591,1658, +1592,1658,1591, +1658,1592,1659, +1593,1659,1592, +1659,1593,1660, +1594,1660,1593, +1660,1594,1661, +1595,1661,1594, +1661,1595,1662, +1596,1662,1595, +1662,1596,1663, +1597,1663,1596, +1663,1597,1664, +1598,1664,1597, +1664,1598,1665, +1599,1665,1598, +1665,1599,1666, +1600,1666,1599, +1666,1600,1667, +1601,1667,1600, +1667,1601,1668, +1602,1668,1601, +1668,1602,1669, +1603,1669,1602, +1669,1603,1670, +1604,1670,1603, +1670,1604,1671, +1605,1671,1604, +1671,1605,1672, +1606,1672,1605, +1672,1606,1673, +1607,1673,1606, +1673,1607,1674, +1608,1674,1607, +1674,1608,1675, +1609,1675,1608, +1675,1609,1676, +1610,1676,1609, +1676,1610,1677, +1611,1677,1610, +1677,1611,1678, +1612,1678,1611, +1678,1612,1679, +1613,1679,1612, +1679,1613,1680, +1614,1680,1613, +1680,1614,1681, +1615,1681,1614, +1681,1615,1682, +1616,1682,1615, +1682,1616,1683, +1617,1683,1616, +1683,1617,1684, +1618,1684,1617, +1684,1618,1685, +1619,1685,1618, +1685,1619,1686, +1620,1686,1619, +1686,1620,1687, +1621,1687,1620, +1687,1621,1688, +1622,1688,1621, +1688,1622,1689, +1623,1689,1622, +1689,1623,1690, +1624,1690,1623, +1690,1624,1691, +1625,1691,1624, +1691,1625,1692, +1626,1692,1625, +1692,1626,1693, +1627,1693,1626, +1693,1627,1694, +1628,1694,1627, +1694,1628,1695, +1629,1695,1628, +1695,1629,1696, +1630,1696,1629, +1696,1630,1697, +1631,1697,1630, +1697,1631,1698, +1632,1698,1631, +1698,1632,1699, +1633,1699,1632, +1699,1633,1700, +1634,1700,1633, +1700,1634,1701, +1635,1701,1634, +1701,1635,1702, +1636,1702,1635, +1702,1636,1703, +1637,1703,1636, +1703,1637,1704, +1638,1704,1637, +1704,1638,1705, +1639,1705,1638, +1705,1639,1706, +1640,1706,1639, +1706,1640,1707, +1641,1707,1640, +1707,1641,1708, +1642,1708,1641, +1708,1642,1709, +1643,1709,1642, +1709,1643,1710, +1644,1710,1643, +1710,1644,1711, +1645,1711,1644, +1711,1645,1712, +1646,1712,1645, +1712,1646,1713, +1647,1713,1646, +1713,1647,1714, +1648,1714,1647, +1714,1648,1715, +1649,1715,1648, +1716,1650,1717, +1651,1717,1650, +1717,1651,1718, +1652,1718,1651, +1718,1652,1719, +1653,1719,1652, +1719,1653,1720, +1654,1720,1653, +1720,1654,1721, +1655,1721,1654, +1721,1655,1722, +1656,1722,1655, +1722,1656,1723, +1657,1723,1656, +1723,1657,1724, +1658,1724,1657, +1724,1658,1725, +1659,1725,1658, +1725,1659,1726, +1660,1726,1659, +1726,1660,1727, +1661,1727,1660, +1727,1661,1728, +1662,1728,1661, +1728,1662,1729, +1663,1729,1662, +1729,1663,1730, +1664,1730,1663, +1730,1664,1731, +1665,1731,1664, +1731,1665,1732, +1666,1732,1665, +1732,1666,1733, +1667,1733,1666, +1733,1667,1734, +1668,1734,1667, +1734,1668,1735, +1669,1735,1668, +1735,1669,1736, +1670,1736,1669, +1736,1670,1737, +1671,1737,1670, +1737,1671,1738, +1672,1738,1671, +1738,1672,1739, +1673,1739,1672, +1739,1673,1740, +1674,1740,1673, +1740,1674,1741, +1675,1741,1674, +1741,1675,1742, +1676,1742,1675, +1742,1676,1743, +1677,1743,1676, +1743,1677,1744, +1678,1744,1677, +1744,1678,1745, +1679,1745,1678, +1745,1679,1746, +1680,1746,1679, +1746,1680,1747, +1681,1747,1680, +1747,1681,1748, +1682,1748,1681, +1748,1682,1749, +1683,1749,1682, +1749,1683,1750, +1684,1750,1683, +1750,1684,1751, +1685,1751,1684, +1751,1685,1752, +1686,1752,1685, +1752,1686,1753, +1687,1753,1686, +1753,1687,1754, +1688,1754,1687, +1754,1688,1755, +1689,1755,1688, +1755,1689,1756, +1690,1756,1689, +1756,1690,1757, +1691,1757,1690, +1757,1691,1758, +1692,1758,1691, +1758,1692,1759, +1693,1759,1692, +1759,1693,1760, +1694,1760,1693, +1760,1694,1761, +1695,1761,1694, +1761,1695,1762, +1696,1762,1695, +1762,1696,1763, +1697,1763,1696, +1763,1697,1764, +1698,1764,1697, +1764,1698,1765, +1699,1765,1698, +1765,1699,1766, +1700,1766,1699, +1766,1700,1767, +1701,1767,1700, +1767,1701,1768, +1702,1768,1701, +1768,1702,1769, +1703,1769,1702, +1769,1703,1770, +1704,1770,1703, +1770,1704,1771, +1705,1771,1704, +1771,1705,1772, +1706,1772,1705, +1772,1706,1773, +1707,1773,1706, +1773,1707,1774, +1708,1774,1707, +1774,1708,1775, +1709,1775,1708, +1775,1709,1776, +1710,1776,1709, +1776,1710,1777, +1711,1777,1710, +1777,1711,1778, +1712,1778,1711, +1778,1712,1779, +1713,1779,1712, +1779,1713,1780, +1714,1780,1713, +1780,1714,1781, +1715,1781,1714, +1782,1716,1783, +1717,1783,1716, +1783,1717,1784, +1718,1784,1717, +1784,1718,1785, +1719,1785,1718, +1785,1719,1786, +1720,1786,1719, +1786,1720,1787, +1721,1787,1720, +1787,1721,1788, +1722,1788,1721, +1788,1722,1789, +1723,1789,1722, +1789,1723,1790, +1724,1790,1723, +1790,1724,1791, +1725,1791,1724, +1791,1725,1792, +1726,1792,1725, +1792,1726,1793, +1727,1793,1726, +1793,1727,1794, +1728,1794,1727, +1794,1728,1795, +1729,1795,1728, +1795,1729,1796, +1730,1796,1729, +1796,1730,1797, +1731,1797,1730, +1797,1731,1798, +1732,1798,1731, +1798,1732,1799, +1733,1799,1732, +1799,1733,1800, +1734,1800,1733, +1800,1734,1801, +1735,1801,1734, +1801,1735,1802, +1736,1802,1735, +1802,1736,1803, +1737,1803,1736, +1803,1737,1804, +1738,1804,1737, +1804,1738,1805, +1739,1805,1738, +1805,1739,1806, +1740,1806,1739, +1806,1740,1807, +1741,1807,1740, +1807,1741,1808, +1742,1808,1741, +1808,1742,1809, +1743,1809,1742, +1809,1743,1810, +1744,1810,1743, +1810,1744,1811, +1745,1811,1744, +1811,1745,1812, +1746,1812,1745, +1812,1746,1813, +1747,1813,1746, +1813,1747,1814, +1748,1814,1747, +1814,1748,1815, +1749,1815,1748, +1815,1749,1816, +1750,1816,1749, +1816,1750,1817, +1751,1817,1750, +1817,1751,1818, +1752,1818,1751, +1818,1752,1819, +1753,1819,1752, +1819,1753,1820, +1754,1820,1753, +1820,1754,1821, +1755,1821,1754, +1821,1755,1822, +1756,1822,1755, +1822,1756,1823, +1757,1823,1756, +1823,1757,1824, +1758,1824,1757, +1824,1758,1825, +1759,1825,1758, +1825,1759,1826, +1760,1826,1759, +1826,1760,1827, +1761,1827,1760, +1827,1761,1828, +1762,1828,1761, +1828,1762,1829, +1763,1829,1762, +1829,1763,1830, +1764,1830,1763, +1830,1764,1831, +1765,1831,1764, +1831,1765,1832, +1766,1832,1765, +1832,1766,1833, +1767,1833,1766, +1833,1767,1834, +1768,1834,1767, +1834,1768,1835, +1769,1835,1768, +1835,1769,1836, +1770,1836,1769, +1836,1770,1837, +1771,1837,1770, +1837,1771,1838, +1772,1838,1771, +1838,1772,1839, +1773,1839,1772, +1839,1773,1840, +1774,1840,1773, +1840,1774,1841, +1775,1841,1774, +1841,1775,1842, +1776,1842,1775, +1842,1776,1843, +1777,1843,1776, +1843,1777,1844, +1778,1844,1777, +1844,1778,1845, +1779,1845,1778, +1845,1779,1846, +1780,1846,1779, +1846,1780,1847, +1781,1847,1780, +1848,1782,1849, +1783,1849,1782, +1849,1783,1850, +1784,1850,1783, +1850,1784,1851, +1785,1851,1784, +1851,1785,1852, +1786,1852,1785, +1852,1786,1853, +1787,1853,1786, +1853,1787,1854, +1788,1854,1787, +1854,1788,1855, +1789,1855,1788, +1855,1789,1856, +1790,1856,1789, +1856,1790,1857, +1791,1857,1790, +1857,1791,1858, +1792,1858,1791, +1858,1792,1859, +1793,1859,1792, +1859,1793,1860, +1794,1860,1793, +1860,1794,1861, +1795,1861,1794, +1861,1795,1862, +1796,1862,1795, +1862,1796,1863, +1797,1863,1796, +1863,1797,1864, +1798,1864,1797, +1864,1798,1865, +1799,1865,1798, +1865,1799,1866, +1800,1866,1799, +1866,1800,1867, +1801,1867,1800, +1867,1801,1868, +1802,1868,1801, +1868,1802,1869, +1803,1869,1802, +1869,1803,1870, +1804,1870,1803, +1870,1804,1871, +1805,1871,1804, +1871,1805,1872, +1806,1872,1805, +1872,1806,1873, +1807,1873,1806, +1873,1807,1874, +1808,1874,1807, +1874,1808,1875, +1809,1875,1808, +1875,1809,1876, +1810,1876,1809, +1876,1810,1877, +1811,1877,1810, +1877,1811,1878, +1812,1878,1811, +1878,1812,1879, +1813,1879,1812, +1879,1813,1880, +1814,1880,1813, +1880,1814,1881, +1815,1881,1814, +1881,1815,1882, +1816,1882,1815, +1882,1816,1883, +1817,1883,1816, +1883,1817,1884, +1818,1884,1817, +1884,1818,1885, +1819,1885,1818, +1885,1819,1886, +1820,1886,1819, +1886,1820,1887, +1821,1887,1820, +1887,1821,1888, +1822,1888,1821, +1888,1822,1889, +1823,1889,1822, +1889,1823,1890, +1824,1890,1823, +1890,1824,1891, +1825,1891,1824, +1891,1825,1892, +1826,1892,1825, +1892,1826,1893, +1827,1893,1826, +1893,1827,1894, +1828,1894,1827, +1894,1828,1895, +1829,1895,1828, +1895,1829,1896, +1830,1896,1829, +1896,1830,1897, +1831,1897,1830, +1897,1831,1898, +1832,1898,1831, +1898,1832,1899, +1833,1899,1832, +1899,1833,1900, +1834,1900,1833, +1900,1834,1901, +1835,1901,1834, +1901,1835,1902, +1836,1902,1835, +1902,1836,1903, +1837,1903,1836, +1903,1837,1904, +1838,1904,1837, +1904,1838,1905, +1839,1905,1838, +1905,1839,1906, +1840,1906,1839, +1906,1840,1907, +1841,1907,1840, +1907,1841,1908, +1842,1908,1841, +1908,1842,1909, +1843,1909,1842, +1909,1843,1910, +1844,1910,1843, +1910,1844,1911, +1845,1911,1844, +1911,1845,1912, +1846,1912,1845, +1912,1846,1913, +1847,1913,1846, +1914,1848,1915, +1849,1915,1848, +1915,1849,1916, +1850,1916,1849, +1916,1850,1917, +1851,1917,1850, +1917,1851,1918, +1852,1918,1851, +1918,1852,1919, +1853,1919,1852, +1919,1853,1920, +1854,1920,1853, +1920,1854,1921, +1855,1921,1854, +1921,1855,1922, +1856,1922,1855, +1922,1856,1923, +1857,1923,1856, +1923,1857,1924, +1858,1924,1857, +1924,1858,1925, +1859,1925,1858, +1925,1859,1926, +1860,1926,1859, +1926,1860,1927, +1861,1927,1860, +1927,1861,1928, +1862,1928,1861, +1928,1862,1929, +1863,1929,1862, +1929,1863,1930, +1864,1930,1863, +1930,1864,1931, +1865,1931,1864, +1931,1865,1932, +1866,1932,1865, +1932,1866,1933, +1867,1933,1866, +1933,1867,1934, +1868,1934,1867, +1934,1868,1935, +1869,1935,1868, +1935,1869,1936, +1870,1936,1869, +1936,1870,1937, +1871,1937,1870, +1937,1871,1938, +1872,1938,1871, +1938,1872,1939, +1873,1939,1872, +1939,1873,1940, +1874,1940,1873, +1940,1874,1941, +1875,1941,1874, +1941,1875,1942, +1876,1942,1875, +1942,1876,1943, +1877,1943,1876, +1943,1877,1944, +1878,1944,1877, +1944,1878,1945, +1879,1945,1878, +1945,1879,1946, +1880,1946,1879, +1946,1880,1947, +1881,1947,1880, +1947,1881,1948, +1882,1948,1881, +1948,1882,1949, +1883,1949,1882, +1949,1883,1950, +1884,1950,1883, +1950,1884,1951, +1885,1951,1884, +1951,1885,1952, +1886,1952,1885, +1952,1886,1953, +1887,1953,1886, +1953,1887,1954, +1888,1954,1887, +1954,1888,1955, +1889,1955,1888, +1955,1889,1956, +1890,1956,1889, +1956,1890,1957, +1891,1957,1890, +1957,1891,1958, +1892,1958,1891, +1958,1892,1959, +1893,1959,1892, +1959,1893,1960, +1894,1960,1893, +1960,1894,1961, +1895,1961,1894, +1961,1895,1962, +1896,1962,1895, +1962,1896,1963, +1897,1963,1896, +1963,1897,1964, +1898,1964,1897, +1964,1898,1965, +1899,1965,1898, +1965,1899,1966, +1900,1966,1899, +1966,1900,1967, +1901,1967,1900, +1967,1901,1968, +1902,1968,1901, +1968,1902,1969, +1903,1969,1902, +1969,1903,1970, +1904,1970,1903, +1970,1904,1971, +1905,1971,1904, +1971,1905,1972, +1906,1972,1905, +1972,1906,1973, +1907,1973,1906, +1973,1907,1974, +1908,1974,1907, +1974,1908,1975, +1909,1975,1908, +1975,1909,1976, +1910,1976,1909, +1976,1910,1977, +1911,1977,1910, +1977,1911,1978, +1912,1978,1911, +1978,1912,1979, +1913,1979,1912, +1980,1914,1981, +1915,1981,1914, +1981,1915,1982, +1916,1982,1915, +1982,1916,1983, +1917,1983,1916, +1983,1917,1984, +1918,1984,1917, +1984,1918,1985, +1919,1985,1918, +1985,1919,1986, +1920,1986,1919, +1986,1920,1987, +1921,1987,1920, +1987,1921,1988, +1922,1988,1921, +1988,1922,1989, +1923,1989,1922, +1989,1923,1990, +1924,1990,1923, +1990,1924,1991, +1925,1991,1924, +1991,1925,1992, +1926,1992,1925, +1992,1926,1993, +1927,1993,1926, +1993,1927,1994, +1928,1994,1927, +1994,1928,1995, +1929,1995,1928, +1995,1929,1996, +1930,1996,1929, +1996,1930,1997, +1931,1997,1930, +1997,1931,1998, +1932,1998,1931, +1998,1932,1999, +1933,1999,1932, +1999,1933,2000, +1934,2000,1933, +2000,1934,2001, +1935,2001,1934, +2001,1935,2002, +1936,2002,1935, +2002,1936,2003, +1937,2003,1936, +2003,1937,2004, +1938,2004,1937, +2004,1938,2005, +1939,2005,1938, +2005,1939,2006, +1940,2006,1939, +2006,1940,2007, +1941,2007,1940, +2007,1941,2008, +1942,2008,1941, +2008,1942,2009, +1943,2009,1942, +2009,1943,2010, +1944,2010,1943, +2010,1944,2011, +1945,2011,1944, +2011,1945,2012, +1946,2012,1945, +2012,1946,2013, +1947,2013,1946, +2013,1947,2014, +1948,2014,1947, +2014,1948,2015, +1949,2015,1948, +2015,1949,2016, +1950,2016,1949, +2016,1950,2017, +1951,2017,1950, +2017,1951,2018, +1952,2018,1951, +2018,1952,2019, +1953,2019,1952, +2019,1953,2020, +1954,2020,1953, +2020,1954,2021, +1955,2021,1954, +2021,1955,2022, +1956,2022,1955, +2022,1956,2023, +1957,2023,1956, +2023,1957,2024, +1958,2024,1957, +2024,1958,2025, +1959,2025,1958, +2025,1959,2026, +1960,2026,1959, +2026,1960,2027, +1961,2027,1960, +2027,1961,2028, +1962,2028,1961, +2028,1962,2029, +1963,2029,1962, +2029,1963,2030, +1964,2030,1963, +2030,1964,2031, +1965,2031,1964, +2031,1965,2032, +1966,2032,1965, +2032,1966,2033, +1967,2033,1966, +2033,1967,2034, +1968,2034,1967, +2034,1968,2035, +1969,2035,1968, +2035,1969,2036, +1970,2036,1969, +2036,1970,2037, +1971,2037,1970, +2037,1971,2038, +1972,2038,1971, +2038,1972,2039, +1973,2039,1972, +2039,1973,2040, +1974,2040,1973, +2040,1974,2041, +1975,2041,1974, +2041,1975,2042, +1976,2042,1975, +2042,1976,2043, +1977,2043,1976, +2043,1977,2044, +1978,2044,1977, +2044,1978,2045, +1979,2045,1978, +2046,1980,2047, +1981,2047,1980, +2047,1981,2048, +1982,2048,1981, +2048,1982,2049, +1983,2049,1982, +2049,1983,2050, +1984,2050,1983, +2050,1984,2051, +1985,2051,1984, +2051,1985,2052, +1986,2052,1985, +2052,1986,2053, +1987,2053,1986, +2053,1987,2054, +1988,2054,1987, +2054,1988,2055, +1989,2055,1988, +2055,1989,2056, +1990,2056,1989, +2056,1990,2057, +1991,2057,1990, +2057,1991,2058, +1992,2058,1991, +2058,1992,2059, +1993,2059,1992, +2059,1993,2060, +1994,2060,1993, +2060,1994,2061, +1995,2061,1994, +2061,1995,2062, +1996,2062,1995, +2062,1996,2063, +1997,2063,1996, +2063,1997,2064, +1998,2064,1997, +2064,1998,2065, +1999,2065,1998, +2065,1999,2066, +2000,2066,1999, +2066,2000,2067, +2001,2067,2000, +2067,2001,2068, +2002,2068,2001, +2068,2002,2069, +2003,2069,2002, +2069,2003,2070, +2004,2070,2003, +2070,2004,2071, +2005,2071,2004, +2071,2005,2072, +2006,2072,2005, +2072,2006,2073, +2007,2073,2006, +2073,2007,2074, +2008,2074,2007, +2074,2008,2075, +2009,2075,2008, +2075,2009,2076, +2010,2076,2009, +2076,2010,2077, +2011,2077,2010, +2077,2011,2078, +2012,2078,2011, +2078,2012,2079, +2013,2079,2012, +2079,2013,2080, +2014,2080,2013, +2080,2014,2081, +2015,2081,2014, +2081,2015,2082, +2016,2082,2015, +2082,2016,2083, +2017,2083,2016, +2083,2017,2084, +2018,2084,2017, +2084,2018,2085, +2019,2085,2018, +2085,2019,2086, +2020,2086,2019, +2086,2020,2087, +2021,2087,2020, +2087,2021,2088, +2022,2088,2021, +2088,2022,2089, +2023,2089,2022, +2089,2023,2090, +2024,2090,2023, +2090,2024,2091, +2025,2091,2024, +2091,2025,2092, +2026,2092,2025, +2092,2026,2093, +2027,2093,2026, +2093,2027,2094, +2028,2094,2027, +2094,2028,2095, +2029,2095,2028, +2095,2029,2096, +2030,2096,2029, +2096,2030,2097, +2031,2097,2030, +2097,2031,2098, +2032,2098,2031, +2098,2032,2099, +2033,2099,2032, +2099,2033,2100, +2034,2100,2033, +2100,2034,2101, +2035,2101,2034, +2101,2035,2102, +2036,2102,2035, +2102,2036,2103, +2037,2103,2036, +2103,2037,2104, +2038,2104,2037, +2104,2038,2105, +2039,2105,2038, +2105,2039,2106, +2040,2106,2039, +2106,2040,2107, +2041,2107,2040, +2107,2041,2108, +2042,2108,2041, +2108,2042,2109, +2043,2109,2042, +2109,2043,2110, +2044,2110,2043, +2110,2044,2111, +2045,2111,2044, +2112,2046,2113, +2047,2113,2046, +2113,2047,2114, +2048,2114,2047, +2114,2048,2115, +2049,2115,2048, +2115,2049,2116, +2050,2116,2049, +2116,2050,2117, +2051,2117,2050, +2117,2051,2118, +2052,2118,2051, +2118,2052,2119, +2053,2119,2052, +2119,2053,2120, +2054,2120,2053, +2120,2054,2121, +2055,2121,2054, +2121,2055,2122, +2056,2122,2055, +2122,2056,2123, +2057,2123,2056, +2123,2057,2124, +2058,2124,2057, +2124,2058,2125, +2059,2125,2058, +2125,2059,2126, +2060,2126,2059, +2126,2060,2127, +2061,2127,2060, +2127,2061,2128, +2062,2128,2061, +2128,2062,2129, +2063,2129,2062, +2129,2063,2130, +2064,2130,2063, +2130,2064,2131, +2065,2131,2064, +2131,2065,2132, +2066,2132,2065, +2132,2066,2133, +2067,2133,2066, +2133,2067,2134, +2068,2134,2067, +2134,2068,2135, +2069,2135,2068, +2135,2069,2136, +2070,2136,2069, +2136,2070,2137, +2071,2137,2070, +2137,2071,2138, +2072,2138,2071, +2138,2072,2139, +2073,2139,2072, +2139,2073,2140, +2074,2140,2073, +2140,2074,2141, +2075,2141,2074, +2141,2075,2142, +2076,2142,2075, +2142,2076,2143, +2077,2143,2076, +2143,2077,2144, +2078,2144,2077, +2144,2078,2145, +2079,2145,2078, +2145,2079,2146, +2080,2146,2079, +2146,2080,2147, +2081,2147,2080, +2147,2081,2148, +2082,2148,2081, +2148,2082,2149, +2083,2149,2082, +2149,2083,2150, +2084,2150,2083, +2150,2084,2151, +2085,2151,2084, +2151,2085,2152, +2086,2152,2085, +2152,2086,2153, +2087,2153,2086, +2153,2087,2154, +2088,2154,2087, +2154,2088,2155, +2089,2155,2088, +2155,2089,2156, +2090,2156,2089, +2156,2090,2157, +2091,2157,2090, +2157,2091,2158, +2092,2158,2091, +2158,2092,2159, +2093,2159,2092, +2159,2093,2160, +2094,2160,2093, +2160,2094,2161, +2095,2161,2094, +2161,2095,2162, +2096,2162,2095, +2162,2096,2163, +2097,2163,2096, +2163,2097,2164, +2098,2164,2097, +2164,2098,2165, +2099,2165,2098, +2165,2099,2166, +2100,2166,2099, +2166,2100,2167, +2101,2167,2100, +2167,2101,2168, +2102,2168,2101, +2168,2102,2169, +2103,2169,2102, +2169,2103,2170, +2104,2170,2103, +2170,2104,2171, +2105,2171,2104, +2171,2105,2172, +2106,2172,2105, +2172,2106,2173, +2107,2173,2106, +2173,2107,2174, +2108,2174,2107, +2174,2108,2175, +2109,2175,2108, +2175,2109,2176, +2110,2176,2109, +2176,2110,2177, +2111,2177,2110, +2178,2112,2179, +2113,2179,2112, +2179,2113,2180, +2114,2180,2113, +2180,2114,2181, +2115,2181,2114, +2181,2115,2182, +2116,2182,2115, +2182,2116,2183, +2117,2183,2116, +2183,2117,2184, +2118,2184,2117, +2184,2118,2185, +2119,2185,2118, +2185,2119,2186, +2120,2186,2119, +2186,2120,2187, +2121,2187,2120, +2187,2121,2188, +2122,2188,2121, +2188,2122,2189, +2123,2189,2122, +2189,2123,2190, +2124,2190,2123, +2190,2124,2191, +2125,2191,2124, +2191,2125,2192, +2126,2192,2125, +2192,2126,2193, +2127,2193,2126, +2193,2127,2194, +2128,2194,2127, +2194,2128,2195, +2129,2195,2128, +2195,2129,2196, +2130,2196,2129, +2196,2130,2197, +2131,2197,2130, +2197,2131,2198, +2132,2198,2131, +2198,2132,2199, +2133,2199,2132, +2199,2133,2200, +2134,2200,2133, +2200,2134,2201, +2135,2201,2134, +2201,2135,2202, +2136,2202,2135, +2202,2136,2203, +2137,2203,2136, +2203,2137,2204, +2138,2204,2137, +2204,2138,2205, +2139,2205,2138, +2205,2139,2206, +2140,2206,2139, +2206,2140,2207, +2141,2207,2140, +2207,2141,2208, +2142,2208,2141, +2208,2142,2209, +2143,2209,2142, +2209,2143,2210, +2144,2210,2143, +2210,2144,2211, +2145,2211,2144, +2211,2145,2212, +2146,2212,2145, +2212,2146,2213, +2147,2213,2146, +2213,2147,2214, +2148,2214,2147, +2214,2148,2215, +2149,2215,2148, +2215,2149,2216, +2150,2216,2149, +2216,2150,2217, +2151,2217,2150, +2217,2151,2218, +2152,2218,2151, +2218,2152,2219, +2153,2219,2152, +2219,2153,2220, +2154,2220,2153, +2220,2154,2221, +2155,2221,2154, +2221,2155,2222, +2156,2222,2155, +2222,2156,2223, +2157,2223,2156, +2223,2157,2224, +2158,2224,2157, +2224,2158,2225, +2159,2225,2158, +2225,2159,2226, +2160,2226,2159, +2226,2160,2227, +2161,2227,2160, +2227,2161,2228, +2162,2228,2161, +2228,2162,2229, +2163,2229,2162, +2229,2163,2230, +2164,2230,2163, +2230,2164,2231, +2165,2231,2164, +2231,2165,2232, +2166,2232,2165, +2232,2166,2233, +2167,2233,2166, +2233,2167,2234, +2168,2234,2167, +2234,2168,2235, +2169,2235,2168, +2235,2169,2236, +2170,2236,2169, +2236,2170,2237, +2171,2237,2170, +2237,2171,2238, +2172,2238,2171, +2238,2172,2239, +2173,2239,2172, +2239,2173,2240, +2174,2240,2173, +2240,2174,2241, +2175,2241,2174, +2241,2175,2242, +2176,2242,2175, +2242,2176,2243, +2177,2243,2176, +2244,2178,2245, +2179,2245,2178, +2245,2179,2246, +2180,2246,2179, +2246,2180,2247, +2181,2247,2180, +2247,2181,2248, +2182,2248,2181, +2248,2182,2249, +2183,2249,2182, +2249,2183,2250, +2184,2250,2183, +2250,2184,2251, +2185,2251,2184, +2251,2185,2252, +2186,2252,2185, +2252,2186,2253, +2187,2253,2186, +2253,2187,2254, +2188,2254,2187, +2254,2188,2255, +2189,2255,2188, +2255,2189,2256, +2190,2256,2189, +2256,2190,2257, +2191,2257,2190, +2257,2191,2258, +2192,2258,2191, +2258,2192,2259, +2193,2259,2192, +2259,2193,2260, +2194,2260,2193, +2260,2194,2261, +2195,2261,2194, +2261,2195,2262, +2196,2262,2195, +2262,2196,2263, +2197,2263,2196, +2263,2197,2264, +2198,2264,2197, +2264,2198,2265, +2199,2265,2198, +2265,2199,2266, +2200,2266,2199, +2266,2200,2267, +2201,2267,2200, +2267,2201,2268, +2202,2268,2201, +2268,2202,2269, +2203,2269,2202, +2269,2203,2270, +2204,2270,2203, +2270,2204,2271, +2205,2271,2204, +2271,2205,2272, +2206,2272,2205, +2272,2206,2273, +2207,2273,2206, +2273,2207,2274, +2208,2274,2207, +2274,2208,2275, +2209,2275,2208, +2275,2209,2276, +2210,2276,2209, +2276,2210,2277, +2211,2277,2210, +2277,2211,2278, +2212,2278,2211, +2278,2212,2279, +2213,2279,2212, +2279,2213,2280, +2214,2280,2213, +2280,2214,2281, +2215,2281,2214, +2281,2215,2282, +2216,2282,2215, +2282,2216,2283, +2217,2283,2216, +2283,2217,2284, +2218,2284,2217, +2284,2218,2285, +2219,2285,2218, +2285,2219,2286, +2220,2286,2219, +2286,2220,2287, +2221,2287,2220, +2287,2221,2288, +2222,2288,2221, +2288,2222,2289, +2223,2289,2222, +2289,2223,2290, +2224,2290,2223, +2290,2224,2291, +2225,2291,2224, +2291,2225,2292, +2226,2292,2225, +2292,2226,2293, +2227,2293,2226, +2293,2227,2294, +2228,2294,2227, +2294,2228,2295, +2229,2295,2228, +2295,2229,2296, +2230,2296,2229, +2296,2230,2297, +2231,2297,2230, +2297,2231,2298, +2232,2298,2231, +2298,2232,2299, +2233,2299,2232, +2299,2233,2300, +2234,2300,2233, +2300,2234,2301, +2235,2301,2234, +2301,2235,2302, +2236,2302,2235, +2302,2236,2303, +2237,2303,2236, +2303,2237,2304, +2238,2304,2237, +2304,2238,2305, +2239,2305,2238, +2305,2239,2306, +2240,2306,2239, +2306,2240,2307, +2241,2307,2240, +2307,2241,2308, +2242,2308,2241, +2308,2242,2309, +2243,2309,2242, +}; + +#define Landscape07VtxCount 2240 +#define Landscape07IdxCount 12852 + +btScalar Landscape07Vtx[] = { +3.90625f,49.6769f,-121.094f, +3.90625f,48.3887f,-117.188f, +7.8125f,48.8687f,-121.094f, +7.8125f,48.004f,-117.188f, +11.7188f,47.3453f,-121.094f, +11.7188f,46.8723f,-117.188f, +15.625f,44.9132f,-121.094f, +15.625f,45.5005f,-117.188f, +19.5313f,43.1526f,-121.094f, +19.5313f,43.3644f,-117.188f, +23.4375f,41.3946f,-121.094f, +23.4375f,42.3352f,-117.188f, +27.3438f,40.1349f,-121.094f, +27.3438f,41.1562f,-117.188f, +31.25f,39.2733f,-121.094f, +31.25f,39.1736f,-117.188f, +35.1563f,38.3718f,-121.094f, +35.1563f,38.0627f,-117.188f, +39.0625f,37.16f,-121.094f, +39.0625f,36.4728f,-117.188f, +42.9688f,35.2678f,-121.094f, +42.9688f,34.8001f,-117.188f, +46.875f,32.8529f,-121.094f, +46.875f,32.5103f,-117.188f, +50.7813f,32.0924f,-121.094f, +50.7813f,31.6328f,-117.188f, +54.6875f,33.2013f,-121.094f, +54.6875f,31.6106f,-117.188f, +58.5938f,34.1499f,-121.094f, +58.5938f,32.3004f,-117.188f, +62.5f,33.7675f,-121.094f, +62.5f,32.696f,-117.188f, +66.4063f,34.4892f,-121.094f, +66.4063f,33.3795f,-117.188f, +70.3125f,34.7441f,-121.094f, +70.3125f,33.9696f,-117.188f, +74.2188f,35.4435f,-121.094f, +74.2188f,34.9211f,-117.188f, +78.125f,36.6876f,-121.094f, +78.125f,36.7686f,-117.188f, +82.0313f,37.8831f,-121.094f, +82.0313f,37.7676f,-117.188f, +85.9375f,37.8533f,-121.094f, +85.9375f,37.8174f,-117.188f, +89.8438f,38.2467f,-121.094f, +89.8438f,38.2878f,-117.188f, +93.75f,39.5884f,-121.094f, +93.75f,39.6151f,-117.188f, +97.6563f,39.7164f,-121.094f, +97.6563f,39.7422f,-117.188f, +101.563f,40.296f,-121.094f, +101.563f,40.9611f,-117.188f, +105.469f,40.7222f,-121.094f, +105.469f,40.8932f,-117.188f, +109.375f,40.1304f,-121.094f, +109.375f,40.6603f,-117.188f, +113.281f,39.4566f,-121.094f, +113.281f,40.2935f,-117.188f, +117.188f,39.003f,-121.094f, +117.188f,39.8681f,-117.188f, +121.094f,38.091f,-121.094f, +121.094f,39.0965f,-117.188f, +125.0f,37.216f,-121.094f, +125.0f,37.1333f,-117.188f, +128.906f,35.4631f,-121.094f, +128.906f,35.5222f,-117.188f, +132.813f,33.4698f,-121.094f, +132.813f,33.9068f,-117.188f, +136.719f,31.5516f,-121.094f, +136.719f,32.2618f,-117.188f, +140.625f,28.6676f,-121.094f, +140.625f,29.8657f,-117.188f, +144.531f,26.5656f,-121.094f, +144.531f,28.1704f,-117.188f, +148.438f,24.1962f,-121.094f, +148.438f,27.1495f,-117.188f, +152.344f,22.2193f,-121.094f, +152.344f,24.5217f,-117.188f, +156.25f,20.1818f,-121.094f, +156.25f,22.0419f,-117.188f, +160.156f,17.6116f,-121.094f, +160.156f,19.9238f,-117.188f, +164.063f,15.5398f,-121.094f, +164.063f,17.6875f,-117.188f, +167.969f,13.7972f,-121.094f, +167.969f,15.5636f,-117.188f, +171.875f,11.7291f,-121.094f, +171.875f,13.5497f,-117.188f, +175.781f,9.31738f,-121.094f, +175.781f,11.2761f,-117.188f, +179.688f,6.60425f,-121.094f, +179.688f,8.95864f,-117.188f, +183.594f,4.50127f,-121.094f, +183.594f,7.04623f,-117.188f, +187.5f,2.77579f,-121.094f, +187.5f,4.83635f,-117.188f, +191.406f,1.39292f,-121.094f, +191.406f,2.76046f,-117.188f, +195.313f,-1.41093f,-121.094f, +195.313f,0.190119f,-117.188f, +199.219f,-2.1383f,-121.094f, +199.219f,-0.558379f,-117.188f, +203.125f,-2.43203f,-121.094f, +203.125f,-1.03303f,-117.188f, +207.031f,-3.74398f,-121.094f, +207.031f,-2.17563f,-117.188f, +210.938f,-4.31531f,-121.094f, +210.938f,-1.91155f,-117.188f, +214.844f,-5.42965f,-121.094f, +214.844f,-3.00018f,-117.188f, +218.75f,-6.70056f,-121.094f, +218.75f,-4.26691f,-117.188f, +222.656f,-6.19564f,-121.094f, +222.656f,-5.15855f,-117.188f, +226.563f,-4.68254f,-121.094f, +226.563f,-3.46348f,-117.188f, +230.469f,-3.31858f,-121.094f, +230.469f,-2.16077f,-117.188f, +234.375f,-3.88428f,-121.094f, +234.375f,-1.47785f,-117.188f, +238.281f,-3.80321f,-121.094f, +238.281f,-1.78424f,-117.188f, +242.188f,-3.43571f,-121.094f, +242.188f,-1.00317f,-117.188f, +246.094f,-3.77556f,-121.094f, +246.094f,-1.97981f,-117.188f, +250.0f,-3.83169f,-121.094f, +250.0f,-2.29372f,-117.188f, +3.90625f,50.3021f,-125.0f, +7.8125f,50.0186f,-125.0f, +11.7188f,47.8026f,-125.0f, +15.625f,45.4122f,-125.0f, +19.5313f,42.7204f,-125.0f, +23.4375f,42.1093f,-125.0f, +27.3438f,41.0672f,-125.0f, +31.25f,40.3016f,-125.0f, +35.1563f,38.401f,-125.0f, +39.0625f,36.5811f,-125.0f, +42.9688f,35.0771f,-125.0f, +46.875f,32.9255f,-125.0f, +50.7813f,31.2736f,-125.0f, +54.6875f,33.4622f,-125.0f, +58.5938f,34.314f,-125.0f, +62.5f,34.4185f,-125.0f, +66.4063f,34.621f,-125.0f, +70.3125f,34.9532f,-125.0f, +74.2188f,35.7305f,-125.0f, +78.125f,37.4446f,-125.0f, +82.0313f,37.6824f,-125.0f, +85.9375f,37.9835f,-125.0f, +89.8438f,38.5713f,-125.0f, +93.75f,39.56f,-125.0f, +97.6563f,40.0645f,-125.0f, +101.563f,39.9237f,-125.0f, +105.469f,39.8912f,-125.0f, +109.375f,39.9678f,-125.0f, +113.281f,39.7665f,-125.0f, +117.188f,38.758f,-125.0f, +121.094f,37.6738f,-125.0f, +125.0f,36.834f,-125.0f, +128.906f,34.7637f,-125.0f, +132.813f,31.9691f,-125.0f, +136.719f,30.7311f,-125.0f, +140.625f,27.9768f,-125.0f, +144.531f,25.22f,-125.0f, +148.438f,22.2616f,-125.0f, +152.344f,20.6399f,-125.0f, +156.25f,18.9363f,-125.0f, +160.156f,16.8778f,-125.0f, +164.063f,14.7425f,-125.0f, +167.969f,12.4299f,-125.0f, +171.875f,10.1017f,-125.0f, +175.781f,7.82169f,-125.0f, +179.688f,5.46502f,-125.0f, +183.594f,2.71076f,-125.0f, +187.5f,1.07736f,-125.0f, +191.406f,-0.592638f,-125.0f, +195.313f,-2.99173f,-125.0f, +199.219f,-4.30517f,-125.0f, +203.125f,-4.79591f,-125.0f, +207.031f,-6.32671f,-125.0f, +210.938f,-6.6914f,-125.0f, +214.844f,-8.34188f,-125.0f, +218.75f,-8.94371f,-125.0f, +222.656f,-7.16417f,-125.0f, +226.563f,-5.53904f,-125.0f, +230.469f,-5.10207f,-125.0f, +234.375f,-5.77507f,-125.0f, +238.281f,-5.5948f,-125.0f, +242.188f,-5.81224f,-125.0f, +246.094f,-5.48291f,-125.0f, +250.0f,-5.3221f,-125.0f, +3.90625f,50.4716f,-128.906f, +7.8125f,50.3922f,-128.906f, +11.7188f,48.0997f,-128.906f, +15.625f,44.9895f,-128.906f, +19.5313f,43.3038f,-128.906f, +23.4375f,42.8795f,-128.906f, +27.3438f,42.0905f,-128.906f, +31.25f,40.0566f,-128.906f, +35.1563f,37.7024f,-128.906f, +39.0625f,35.7533f,-128.906f, +42.9688f,32.9949f,-128.906f, +46.875f,31.7476f,-128.906f, +50.7813f,30.9413f,-128.906f, +54.6875f,31.9364f,-128.906f, +58.5938f,33.2028f,-128.906f, +62.5f,34.0103f,-128.906f, +66.4063f,34.3126f,-128.906f, +70.3125f,34.6096f,-128.906f, +74.2188f,35.8861f,-128.906f, +78.125f,36.5754f,-128.906f, +82.0313f,36.9009f,-128.906f, +85.9375f,37.369f,-128.906f, +89.8438f,38.2734f,-128.906f, +93.75f,38.7518f,-128.906f, +97.6563f,39.7576f,-128.906f, +101.563f,39.3413f,-128.906f, +105.469f,40.4224f,-128.906f, +109.375f,40.506f,-128.906f, +113.281f,39.7509f,-128.906f, +117.188f,38.6208f,-128.906f, +121.094f,37.1513f,-128.906f, +125.0f,36.003f,-128.906f, +128.906f,34.1307f,-128.906f, +132.813f,31.5523f,-128.906f, +136.719f,29.2003f,-128.906f, +140.625f,26.3718f,-128.906f, +144.531f,24.0851f,-128.906f, +148.438f,21.0492f,-128.906f, +152.344f,18.9709f,-128.906f, +156.25f,16.5536f,-128.906f, +160.156f,14.5588f,-128.906f, +164.063f,12.8386f,-128.906f, +167.969f,11.3092f,-128.906f, +171.875f,9.19396f,-128.906f, +175.781f,6.84617f,-128.906f, +179.688f,3.80062f,-128.906f, +183.594f,0.734751f,-128.906f, +187.5f,0.121523f,-128.906f, +191.406f,-1.9203f,-128.906f, +195.313f,-5.35291f,-128.906f, +199.219f,-7.06575f,-128.906f, +203.125f,-8.27325f,-128.906f, +207.031f,-8.82541f,-128.906f, +210.938f,-9.36185f,-128.906f, +214.844f,-10.8597f,-128.906f, +218.75f,-10.695f,-128.906f, +222.656f,-8.91012f,-128.906f, +226.563f,-8.24825f,-128.906f, +230.469f,-7.79624f,-128.906f, +234.375f,-6.74578f,-128.906f, +238.281f,-7.41285f,-128.906f, +242.188f,-7.01421f,-128.906f, +246.094f,-6.91669f,-128.906f, +250.0f,-6.09876f,-128.906f, +3.90625f,49.1054f,-132.813f, +7.8125f,48.771f,-132.813f, +11.7188f,46.9765f,-132.813f, +15.625f,44.4736f,-132.813f, +19.5313f,43.2026f,-132.813f, +23.4375f,42.2898f,-132.813f, +27.3438f,41.7492f,-132.813f, +31.25f,39.5792f,-132.813f, +35.1563f,36.5653f,-132.813f, +39.0625f,33.5612f,-132.813f, +42.9688f,31.9604f,-132.813f, +46.875f,30.953f,-132.813f, +50.7813f,30.5912f,-132.813f, +54.6875f,31.76f,-132.813f, +58.5938f,33.0843f,-132.813f, +62.5f,33.4323f,-132.813f, +66.4063f,33.9264f,-132.813f, +70.3125f,33.9268f,-132.813f, +74.2188f,33.8122f,-132.813f, +78.125f,34.9456f,-132.813f, +82.0313f,35.6308f,-132.813f, +85.9375f,35.8317f,-132.813f, +89.8438f,36.8255f,-132.813f, +93.75f,37.5781f,-132.813f, +97.6563f,39.0469f,-132.813f, +101.563f,38.905f,-132.813f, +105.469f,39.3656f,-132.813f, +109.375f,39.9706f,-132.813f, +113.281f,38.8077f,-132.813f, +117.188f,37.8378f,-132.813f, +121.094f,36.8368f,-132.813f, +125.0f,35.8474f,-132.813f, +128.906f,33.8502f,-132.813f, +132.813f,31.6251f,-132.813f, +136.719f,28.2781f,-132.813f, +140.625f,24.9841f,-132.813f, +144.531f,22.2281f,-132.813f, +148.438f,19.2974f,-132.813f, +152.344f,17.1516f,-132.813f, +156.25f,14.7654f,-132.813f, +160.156f,13.1833f,-132.813f, +164.063f,11.0184f,-132.813f, +167.969f,9.1589f,-132.813f, +171.875f,6.82631f,-132.813f, +175.781f,4.30633f,-132.813f, +179.688f,2.04751f,-132.813f, +183.594f,-0.74554f,-132.813f, +187.5f,-1.24688f,-132.813f, +191.406f,-3.70884f,-132.813f, +195.313f,-7.20423f,-132.813f, +199.219f,-9.63057f,-132.813f, +203.125f,-10.6411f,-132.813f, +207.031f,-11.1561f,-132.813f, +210.938f,-11.9998f,-132.813f, +214.844f,-13.1369f,-132.813f, +218.75f,-12.4543f,-132.813f, +222.656f,-11.5031f,-132.813f, +226.563f,-11.4632f,-132.813f, +230.469f,-10.5609f,-132.813f, +234.375f,-9.96017f,-132.813f, +238.281f,-9.64047f,-132.813f, +242.188f,-8.79112f,-132.813f, +246.094f,-8.33514f,-132.813f, +250.0f,-6.32649f,-132.813f, +3.90625f,47.9f,-136.719f, +7.8125f,47.0423f,-136.719f, +11.7188f,46.1087f,-136.719f, +15.625f,42.8209f,-136.719f, +19.5313f,41.8846f,-136.719f, +23.4375f,41.4071f,-136.719f, +27.3438f,39.6798f,-136.719f, +31.25f,38.1881f,-136.719f, +35.1563f,35.3952f,-136.719f, +39.0625f,31.8297f,-136.719f, +42.9688f,31.014f,-136.719f, +46.875f,29.29f,-136.719f, +50.7813f,29.4455f,-136.719f, +54.6875f,30.368f,-136.719f, +58.5938f,31.6261f,-136.719f, +62.5f,31.8803f,-136.719f, +66.4063f,32.8102f,-136.719f, +70.3125f,33.4331f,-136.719f, +74.2188f,33.19f,-136.719f, +78.125f,33.74f,-136.719f, +82.0313f,35.1047f,-136.719f, +85.9375f,36.2436f,-136.719f, +89.8438f,36.4928f,-136.719f, +93.75f,36.192f,-136.719f, +97.6563f,37.547f,-136.719f, +101.563f,38.0632f,-136.719f, +105.469f,38.6551f,-136.719f, +109.375f,38.4484f,-136.719f, +113.281f,37.8421f,-136.719f, +117.188f,37.5588f,-136.719f, +121.094f,37.278f,-136.719f, +125.0f,35.3541f,-136.719f, +128.906f,33.0939f,-136.719f, +132.813f,30.522f,-136.719f, +136.719f,27.5957f,-136.719f, +140.625f,24.4595f,-136.719f, +144.531f,21.0335f,-136.719f, +148.438f,18.0163f,-136.719f, +152.344f,15.3659f,-136.719f, +156.25f,13.4036f,-136.719f, +160.156f,11.6819f,-136.719f, +164.063f,9.68686f,-136.719f, +167.969f,7.56782f,-136.719f, +171.875f,4.49435f,-136.719f, +175.781f,1.55284f,-136.719f, +179.688f,0.275057f,-136.719f, +183.594f,-2.20168f,-136.719f, +187.5f,-3.16842f,-136.719f, +191.406f,-5.74212f,-136.719f, +195.313f,-8.33918f,-136.719f, +199.219f,-11.9926f,-136.719f, +203.125f,-13.7382f,-136.719f, +207.031f,-14.2163f,-136.719f, +210.938f,-14.76f,-136.719f, +214.844f,-14.7917f,-136.719f, +218.75f,-15.4594f,-136.719f, +222.656f,-14.7722f,-136.719f, +226.563f,-14.7687f,-136.719f, +230.469f,-13.0502f,-136.719f, +234.375f,-12.7522f,-136.719f, +238.281f,-12.1277f,-136.719f, +242.188f,-11.9805f,-136.719f, +246.094f,-9.26664f,-136.719f, +250.0f,-6.42671f,-136.719f, +3.90625f,47.2681f,-140.625f, +7.8125f,46.3513f,-140.625f, +11.7188f,45.1181f,-140.625f, +15.625f,42.9593f,-140.625f, +19.5313f,40.04f,-140.625f, +23.4375f,38.1657f,-140.625f, +27.3438f,37.2537f,-140.625f, +31.25f,35.6767f,-140.625f, +35.1563f,33.3413f,-140.625f, +39.0625f,30.7556f,-140.625f, +42.9688f,29.0258f,-140.625f, +46.875f,27.8122f,-140.625f, +50.7813f,27.4512f,-140.625f, +54.6875f,28.1912f,-140.625f, +58.5938f,29.8142f,-140.625f, +62.5f,30.1394f,-140.625f, +66.4063f,30.7105f,-140.625f, +70.3125f,31.9295f,-140.625f, +74.2188f,32.6689f,-140.625f, +78.125f,32.9232f,-140.625f, +82.0313f,35.5221f,-140.625f, +85.9375f,36.1785f,-140.625f, +89.8438f,35.864f,-140.625f, +93.75f,35.2473f,-140.625f, +97.6563f,35.6334f,-140.625f, +101.563f,36.5759f,-140.625f, +105.469f,37.2506f,-140.625f, +109.375f,36.7249f,-140.625f, +113.281f,36.4287f,-140.625f, +117.188f,36.6819f,-140.625f, +121.094f,36.4294f,-140.625f, +125.0f,35.2358f,-140.625f, +128.906f,32.9869f,-140.625f, +132.813f,30.156f,-140.625f, +136.719f,27.0471f,-140.625f, +140.625f,23.8554f,-140.625f, +144.531f,20.3993f,-140.625f, +148.438f,16.6224f,-140.625f, +152.344f,13.058f,-140.625f, +156.25f,11.1345f,-140.625f, +160.156f,9.35133f,-140.625f, +164.063f,7.36194f,-140.625f, +167.969f,5.31819f,-140.625f, +171.875f,2.78652f,-140.625f, +175.781f,0.868982f,-140.625f, +179.688f,-1.31465f,-140.625f, +183.594f,-3.64199f,-140.625f, +187.5f,-5.38333f,-140.625f, +191.406f,-8.08251f,-140.625f, +195.313f,-10.9184f,-140.625f, +199.219f,-14.2737f,-140.625f, +203.125f,-16.1495f,-140.625f, +207.031f,-16.9134f,-140.625f, +210.938f,-16.9575f,-140.625f, +214.844f,-17.6023f,-140.625f, +218.75f,-17.6633f,-140.625f, +222.656f,-17.159f,-140.625f, +226.563f,-16.2062f,-140.625f, +230.469f,-15.7685f,-140.625f, +234.375f,-15.0547f,-140.625f, +238.281f,-14.7858f,-140.625f, +242.188f,-12.8534f,-140.625f, +246.094f,-9.20599f,-140.625f, +250.0f,-5.60644f,-140.625f, +3.90625f,45.2398f,-144.531f, +7.8125f,45.0428f,-144.531f, +11.7188f,44.1179f,-144.531f, +15.625f,42.444f,-144.531f, +19.5313f,39.732f,-144.531f, +23.4375f,37.0479f,-144.531f, +27.3438f,34.3624f,-144.531f, +31.25f,33.2513f,-144.531f, +35.1563f,31.1146f,-144.531f, +39.0625f,29.2726f,-144.531f, +42.9688f,27.3159f,-144.531f, +46.875f,27.1241f,-144.531f, +50.7813f,26.6524f,-144.531f, +54.6875f,26.3337f,-144.531f, +58.5938f,27.8201f,-144.531f, +62.5f,27.8456f,-144.531f, +66.4063f,27.8306f,-144.531f, +70.3125f,29.8911f,-144.531f, +74.2188f,31.0667f,-144.531f, +78.125f,32.5778f,-144.531f, +82.0313f,34.5337f,-144.531f, +85.9375f,35.1457f,-144.531f, +89.8438f,34.7649f,-144.531f, +93.75f,34.0929f,-144.531f, +97.6563f,34.2934f,-144.531f, +101.563f,34.8046f,-144.531f, +105.469f,36.2496f,-144.531f, +109.375f,35.8351f,-144.531f, +113.281f,35.8228f,-144.531f, +117.188f,35.7495f,-144.531f, +121.094f,34.832f,-144.531f, +125.0f,34.3351f,-144.531f, +128.906f,32.4744f,-144.531f, +132.813f,29.6967f,-144.531f, +136.719f,26.263f,-144.531f, +140.625f,23.3556f,-144.531f, +144.531f,19.3517f,-144.531f, +148.438f,14.458f,-144.531f, +152.344f,11.2423f,-144.531f, +156.25f,9.75514f,-144.531f, +160.156f,7.96146f,-144.531f, +164.063f,5.67024f,-144.531f, +167.969f,4.08006f,-144.531f, +171.875f,1.71102f,-144.531f, +175.781f,-0.915369f,-144.531f, +179.688f,-2.66343f,-144.531f, +183.594f,-5.5816f,-144.531f, +187.5f,-7.79353f,-144.531f, +191.406f,-10.1772f,-144.531f, +195.313f,-13.5463f,-144.531f, +199.219f,-16.0692f,-144.531f, +203.125f,-17.2505f,-144.531f, +207.031f,-18.7241f,-144.531f, +210.938f,-18.7295f,-144.531f, +214.844f,-19.3f,-144.531f, +218.75f,-20.3181f,-144.531f, +222.656f,-19.4871f,-144.531f, +226.563f,-18.5465f,-144.531f, +230.469f,-17.525f,-144.531f, +234.375f,-16.5076f,-144.531f, +238.281f,-15.0993f,-144.531f, +242.188f,-13.0716f,-144.531f, +246.094f,-9.99063f,-144.531f, +250.0f,-5.64288f,-144.531f, +3.90625f,43.4167f,-148.438f, +7.8125f,43.0193f,-148.438f, +11.7188f,42.6242f,-148.438f, +15.625f,40.8831f,-148.438f, +19.5313f,38.6824f,-148.438f, +23.4375f,36.0177f,-148.438f, +27.3438f,32.9654f,-148.438f, +31.25f,31.3995f,-148.438f, +35.1563f,29.5101f,-148.438f, +39.0625f,27.4588f,-148.438f, +42.9688f,25.129f,-148.438f, +46.875f,25.4533f,-148.438f, +50.7813f,25.7106f,-148.438f, +54.6875f,25.737f,-148.438f, +58.5938f,26.1608f,-148.438f, +62.5f,27.2373f,-148.438f, +66.4063f,27.3635f,-148.438f, +70.3125f,27.7787f,-148.438f, +74.2188f,29.0906f,-148.438f, +78.125f,31.3992f,-148.438f, +82.0313f,32.9373f,-148.438f, +85.9375f,33.743f,-148.438f, +89.8438f,34.4265f,-148.438f, +93.75f,33.525f,-148.438f, +97.6563f,33.8231f,-148.438f, +101.563f,34.6826f,-148.438f, +105.469f,35.0275f,-148.438f, +109.375f,34.4667f,-148.438f, +113.281f,34.7266f,-148.438f, +117.188f,34.0788f,-148.438f, +121.094f,33.2521f,-148.438f, +125.0f,32.1914f,-148.438f, +128.906f,30.7782f,-148.438f, +132.813f,28.8615f,-148.438f, +136.719f,25.3691f,-148.438f, +140.625f,21.5786f,-148.438f, +144.531f,17.2969f,-148.438f, +148.438f,13.1925f,-148.438f, +152.344f,10.0632f,-148.438f, +156.25f,8.32421f,-148.438f, +160.156f,6.57856f,-148.438f, +164.063f,4.18522f,-148.438f, +167.969f,2.25091f,-148.438f, +171.875f,0.445952f,-148.438f, +175.781f,-1.73703f,-148.438f, +179.688f,-3.44886f,-148.438f, +183.594f,-6.77108f,-148.438f, +187.5f,-9.26031f,-148.438f, +191.406f,-12.38f,-148.438f, +195.313f,-14.6453f,-148.438f, +199.219f,-15.8435f,-148.438f, +203.125f,-17.3242f,-148.438f, +207.031f,-19.3932f,-148.438f, +210.938f,-19.7735f,-148.438f, +214.844f,-20.1293f,-148.438f, +218.75f,-20.5777f,-148.438f, +222.656f,-20.7145f,-148.438f, +226.563f,-20.64f,-148.438f, +230.469f,-19.6971f,-148.438f, +234.375f,-17.5016f,-148.438f, +238.281f,-14.644f,-148.438f, +242.188f,-12.3094f,-148.438f, +246.094f,-10.1634f,-148.438f, +250.0f,-6.79503f,-148.438f, +3.90625f,42.7212f,-152.344f, +7.8125f,41.7463f,-152.344f, +11.7188f,40.5249f,-152.344f, +15.625f,39.5225f,-152.344f, +19.5313f,36.6967f,-152.344f, +23.4375f,34.0075f,-152.344f, +27.3438f,31.2054f,-152.344f, +31.25f,28.8502f,-152.344f, +35.1563f,27.2625f,-152.344f, +39.0625f,24.9496f,-152.344f, +42.9688f,23.5897f,-152.344f, +46.875f,23.4709f,-152.344f, +50.7813f,24.179f,-152.344f, +54.6875f,25.021f,-152.344f, +58.5938f,25.6664f,-152.344f, +62.5f,25.7063f,-152.344f, +66.4063f,26.6928f,-152.344f, +70.3125f,26.8261f,-152.344f, +74.2188f,28.2549f,-152.344f, +78.125f,30.3373f,-152.344f, +82.0313f,31.6194f,-152.344f, +85.9375f,32.9189f,-152.344f, +89.8438f,32.7162f,-152.344f, +93.75f,33.0001f,-152.344f, +97.6563f,34.4407f,-152.344f, +101.563f,35.0813f,-152.344f, +105.469f,34.4143f,-152.344f, +109.375f,33.5195f,-152.344f, +113.281f,32.927f,-152.344f, +117.188f,32.6509f,-152.344f, +121.094f,32.6775f,-152.344f, +125.0f,30.887f,-152.344f, +128.906f,28.4296f,-152.344f, +132.813f,26.5539f,-152.344f, +136.719f,24.0803f,-152.344f, +140.625f,20.196f,-152.344f, +144.531f,16.4293f,-152.344f, +148.438f,12.8243f,-152.344f, +152.344f,9.76479f,-152.344f, +156.25f,7.14206f,-152.344f, +160.156f,4.74684f,-152.344f, +164.063f,2.30008f,-152.344f, +167.969f,1.49801f,-152.344f, +171.875f,-0.62719f,-152.344f, +175.781f,-1.99004f,-152.344f, +179.688f,-4.80775f,-152.344f, +183.594f,-8.00986f,-152.344f, +187.5f,-11.4771f,-152.344f, +191.406f,-12.8743f,-152.344f, +195.313f,-13.8733f,-152.344f, +199.219f,-15.0749f,-152.344f, +203.125f,-16.9234f,-152.344f, +207.031f,-18.3258f,-152.344f, +210.938f,-19.6583f,-152.344f, +214.844f,-20.9396f,-152.344f, +218.75f,-21.8071f,-152.344f, +222.656f,-21.4908f,-152.344f, +226.563f,-21.4698f,-152.344f, +230.469f,-19.3773f,-152.344f, +234.375f,-17.0448f,-152.344f, +238.281f,-14.0123f,-152.344f, +242.188f,-11.2372f,-152.344f, +246.094f,-9.11286f,-152.344f, +250.0f,-6.76792f,-152.344f, +3.90625f,41.7368f,-156.25f, +7.8125f,40.8494f,-156.25f, +11.7188f,39.2286f,-156.25f, +15.625f,37.4784f,-156.25f, +19.5313f,36.0345f,-156.25f, +23.4375f,33.9716f,-156.25f, +27.3438f,31.3041f,-156.25f, +31.25f,28.9777f,-156.25f, +35.1563f,26.0934f,-156.25f, +39.0625f,23.7421f,-156.25f, +42.9688f,22.4401f,-156.25f, +46.875f,22.1238f,-156.25f, +50.7813f,22.6669f,-156.25f, +54.6875f,23.7702f,-156.25f, +58.5938f,24.63f,-156.25f, +62.5f,25.2145f,-156.25f, +66.4063f,26.6101f,-156.25f, +70.3125f,27.3664f,-156.25f, +74.2188f,28.121f,-156.25f, +78.125f,29.5305f,-156.25f, +82.0313f,30.4367f,-156.25f, +85.9375f,30.627f,-156.25f, +89.8438f,30.4079f,-156.25f, +93.75f,32.2186f,-156.25f, +97.6563f,33.2916f,-156.25f, +101.563f,33.8066f,-156.25f, +105.469f,32.5269f,-156.25f, +109.375f,32.0751f,-156.25f, +113.281f,31.0298f,-156.25f, +117.188f,30.9869f,-156.25f, +121.094f,30.9826f,-156.25f, +125.0f,29.0676f,-156.25f, +128.906f,26.8988f,-156.25f, +132.813f,24.0771f,-156.25f, +136.719f,21.8087f,-156.25f, +140.625f,18.8179f,-156.25f, +144.531f,14.2483f,-156.25f, +148.438f,10.9236f,-156.25f, +152.344f,9.05948f,-156.25f, +156.25f,6.86087f,-156.25f, +160.156f,3.50699f,-156.25f, +164.063f,1.14903f,-156.25f, +167.969f,-0.639847f,-156.25f, +171.875f,-2.73828f,-156.25f, +175.781f,-4.02372f,-156.25f, +179.688f,-6.15141f,-156.25f, +183.594f,-8.81231f,-156.25f, +187.5f,-10.3417f,-156.25f, +191.406f,-11.1895f,-156.25f, +195.313f,-13.1464f,-156.25f, +199.219f,-14.5401f,-156.25f, +203.125f,-15.9427f,-156.25f, +207.031f,-17.492f,-156.25f, +210.938f,-19.0599f,-156.25f, +214.844f,-21.1101f,-156.25f, +218.75f,-21.3872f,-156.25f, +222.656f,-21.1481f,-156.25f, +226.563f,-20.2836f,-156.25f, +230.469f,-18.1679f,-156.25f, +234.375f,-15.72f,-156.25f, +238.281f,-13.4579f,-156.25f, +242.188f,-10.1453f,-156.25f, +246.094f,-8.09411f,-156.25f, +250.0f,-5.46467f,-156.25f, +3.90625f,40.4755f,-160.156f, +7.8125f,39.299f,-160.156f, +11.7188f,37.3972f,-160.156f, +15.625f,36.1894f,-160.156f, +19.5313f,34.3138f,-160.156f, +23.4375f,32.893f,-160.156f, +27.3438f,30.4515f,-160.156f, +31.25f,28.5808f,-160.156f, +35.1563f,25.8839f,-160.156f, +39.0625f,23.8505f,-160.156f, +42.9688f,22.3057f,-160.156f, +46.875f,21.4418f,-160.156f, +50.7813f,21.9709f,-160.156f, +54.6875f,23.0083f,-160.156f, +58.5938f,24.899f,-160.156f, +62.5f,25.213f,-160.156f, +66.4063f,26.1428f,-160.156f, +70.3125f,27.2675f,-160.156f, +74.2188f,28.0843f,-160.156f, +78.125f,28.9474f,-160.156f, +82.0313f,29.5078f,-160.156f, +85.9375f,29.7468f,-160.156f, +89.8438f,30.8621f,-160.156f, +93.75f,31.5001f,-160.156f, +97.6563f,32.1184f,-160.156f, +101.563f,31.2692f,-160.156f, +105.469f,30.4985f,-160.156f, +109.375f,29.4368f,-160.156f, +113.281f,30.6889f,-160.156f, +117.188f,29.6238f,-160.156f, +121.094f,28.6487f,-160.156f, +125.0f,26.3174f,-160.156f, +128.906f,24.6125f,-160.156f, +132.813f,22.1993f,-160.156f, +136.719f,19.3934f,-160.156f, +140.625f,16.5457f,-160.156f, +144.531f,13.4024f,-160.156f, +148.438f,9.69887f,-160.156f, +152.344f,8.13305f,-160.156f, +156.25f,6.48921f,-160.156f, +160.156f,2.56153f,-160.156f, +164.063f,0.0733139f,-160.156f, +167.969f,-1.11414f,-160.156f, +171.875f,-3.04708f,-160.156f, +175.781f,-6.18654f,-160.156f, +179.688f,-7.4188f,-160.156f, +183.594f,-9.1718f,-160.156f, +187.5f,-9.78027f,-160.156f, +191.406f,-10.5496f,-160.156f, +195.313f,-12.7259f,-160.156f, +199.219f,-13.9068f,-160.156f, +203.125f,-15.4772f,-160.156f, +207.031f,-17.6287f,-160.156f, +210.938f,-19.2502f,-160.156f, +214.844f,-19.5824f,-160.156f, +218.75f,-19.3114f,-160.156f, +222.656f,-19.5266f,-160.156f, +226.563f,-17.8446f,-160.156f, +230.469f,-16.3027f,-160.156f, +234.375f,-14.5015f,-160.156f, +238.281f,-11.9891f,-160.156f, +242.188f,-9.40017f,-160.156f, +246.094f,-6.63794f,-160.156f, +250.0f,-3.71573f,-160.156f, +3.90625f,38.8633f,-164.063f, +7.8125f,37.4382f,-164.063f, +11.7188f,35.7214f,-164.063f, +15.625f,34.0614f,-164.063f, +19.5313f,33.0957f,-164.063f, +23.4375f,32.0369f,-164.063f, +27.3438f,29.7096f,-164.063f, +31.25f,27.3216f,-164.063f, +35.1563f,25.2446f,-164.063f, +39.0625f,23.6071f,-164.063f, +42.9688f,22.2443f,-164.063f, +46.875f,21.2807f,-164.063f, +50.7813f,21.0358f,-164.063f, +54.6875f,22.8177f,-164.063f, +58.5938f,24.4434f,-164.063f, +62.5f,25.1375f,-164.063f, +66.4063f,25.3266f,-164.063f, +70.3125f,26.6102f,-164.063f, +74.2188f,27.6569f,-164.063f, +78.125f,27.8248f,-164.063f, +82.0313f,28.0421f,-164.063f, +85.9375f,29.1719f,-164.063f, +89.8438f,29.9529f,-164.063f, +93.75f,30.947f,-164.063f, +97.6563f,30.6189f,-164.063f, +101.563f,29.7913f,-164.063f, +105.469f,27.6858f,-164.063f, +109.375f,27.3234f,-164.063f, +113.281f,27.8148f,-164.063f, +117.188f,27.3571f,-164.063f, +121.094f,26.1572f,-164.063f, +125.0f,23.8557f,-164.063f, +128.906f,21.6383f,-164.063f, +132.813f,19.0681f,-164.063f, +136.719f,16.7352f,-164.063f, +140.625f,14.4004f,-164.063f, +144.531f,11.082f,-164.063f, +148.438f,8.38754f,-164.063f, +152.344f,7.0054f,-164.063f, +156.25f,4.95122f,-164.063f, +160.156f,2.47298f,-164.063f, +164.063f,0.777691f,-164.063f, +167.969f,-1.44055f,-164.063f, +171.875f,-3.57218f,-164.063f, +175.781f,-6.3396f,-164.063f, +179.688f,-7.49937f,-164.063f, +183.594f,-9.17485f,-164.063f, +187.5f,-9.92705f,-164.063f, +191.406f,-11.0737f,-164.063f, +195.313f,-12.8264f,-164.063f, +199.219f,-14.9306f,-164.063f, +203.125f,-15.9553f,-164.063f, +207.031f,-17.0898f,-164.063f, +210.938f,-18.5283f,-164.063f, +214.844f,-18.545f,-164.063f, +218.75f,-18.553f,-164.063f, +222.656f,-17.5725f,-164.063f, +226.563f,-15.6444f,-164.063f, +230.469f,-14.565f,-164.063f, +234.375f,-12.5578f,-164.063f, +238.281f,-10.6498f,-164.063f, +242.188f,-8.28284f,-164.063f, +246.094f,-5.87682f,-164.063f, +250.0f,-2.5339f,-164.063f, +3.90625f,37.2199f,-167.969f, +7.8125f,36.6782f,-167.969f, +11.7188f,36.2393f,-167.969f, +15.625f,33.4745f,-167.969f, +19.5313f,32.0928f,-167.969f, +23.4375f,30.5662f,-167.969f, +27.3438f,28.5968f,-167.969f, +31.25f,26.4298f,-167.969f, +35.1563f,23.9469f,-167.969f, +39.0625f,22.5415f,-167.969f, +42.9688f,21.8267f,-167.969f, +46.875f,21.2097f,-167.969f, +50.7813f,21.0841f,-167.969f, +54.6875f,21.7877f,-167.969f, +58.5938f,22.9351f,-167.969f, +62.5f,24.0641f,-167.969f, +66.4063f,24.42f,-167.969f, +70.3125f,24.8355f,-167.969f, +74.2188f,25.2701f,-167.969f, +78.125f,26.0252f,-167.969f, +82.0313f,26.8612f,-167.969f, +85.9375f,27.4256f,-167.969f, +89.8438f,28.994f,-167.969f, +93.75f,29.1766f,-167.969f, +97.6563f,27.8964f,-167.969f, +101.563f,26.6384f,-167.969f, +105.469f,24.9844f,-167.969f, +109.375f,25.0669f,-167.969f, +113.281f,24.572f,-167.969f, +117.188f,23.7817f,-167.969f, +121.094f,22.2089f,-167.969f, +125.0f,19.7633f,-167.969f, +128.906f,17.7618f,-167.969f, +132.813f,15.7339f,-167.969f, +136.719f,13.4975f,-167.969f, +140.625f,11.7364f,-167.969f, +144.531f,9.85351f,-167.969f, +148.438f,8.05282f,-167.969f, +152.344f,6.97463f,-167.969f, +156.25f,5.11511f,-167.969f, +160.156f,3.12954f,-167.969f, +164.063f,1.56555f,-167.969f, +167.969f,-1.77415f,-167.969f, +171.875f,-4.16322f,-167.969f, +175.781f,-5.85214f,-167.969f, +179.688f,-7.97892f,-167.969f, +183.594f,-9.87953f,-167.969f, +187.5f,-10.2762f,-167.969f, +191.406f,-11.5319f,-167.969f, +195.313f,-13.3612f,-167.969f, +199.219f,-15.3709f,-167.969f, +203.125f,-16.5674f,-167.969f, +207.031f,-17.6903f,-167.969f, +210.938f,-17.6736f,-167.969f, +214.844f,-16.8207f,-167.969f, +218.75f,-17.0254f,-167.969f, +222.656f,-16.3676f,-167.969f, +226.563f,-14.2816f,-167.969f, +230.469f,-13.3488f,-167.969f, +234.375f,-12.0136f,-167.969f, +238.281f,-9.90116f,-167.969f, +242.188f,-7.92295f,-167.969f, +246.094f,-5.41594f,-167.969f, +250.0f,-1.87299f,-167.969f, +3.90625f,35.3898f,-171.875f, +7.8125f,35.2527f,-171.875f, +11.7188f,34.3178f,-171.875f, +15.625f,33.0736f,-171.875f, +19.5313f,31.4013f,-171.875f, +23.4375f,28.9174f,-171.875f, +27.3438f,26.607f,-171.875f, +31.25f,24.7766f,-171.875f, +35.1563f,23.21f,-171.875f, +39.0625f,21.903f,-171.875f, +42.9688f,20.775f,-171.875f, +46.875f,20.114f,-171.875f, +50.7813f,19.6974f,-171.875f, +54.6875f,20.6726f,-171.875f, +58.5938f,22.241f,-171.875f, +62.5f,22.075f,-171.875f, +66.4063f,22.6771f,-171.875f, +70.3125f,22.4456f,-171.875f, +74.2188f,22.8643f,-171.875f, +78.125f,24.7268f,-171.875f, +82.0313f,25.7019f,-171.875f, +85.9375f,26.1196f,-171.875f, +89.8438f,25.6156f,-171.875f, +93.75f,24.7881f,-171.875f, +97.6563f,24.0074f,-171.875f, +101.563f,23.4739f,-171.875f, +105.469f,23.362f,-171.875f, +109.375f,22.2604f,-171.875f, +113.281f,21.2772f,-171.875f, +117.188f,19.7815f,-171.875f, +121.094f,17.9686f,-171.875f, +125.0f,16.3211f,-171.875f, +128.906f,14.2631f,-171.875f, +132.813f,12.4914f,-171.875f, +136.719f,10.3941f,-171.875f, +140.625f,8.91613f,-171.875f, +144.531f,9.17409f,-171.875f, +148.438f,7.34154f,-171.875f, +152.344f,6.13056f,-171.875f, +156.25f,4.58272f,-171.875f, +160.156f,2.77083f,-171.875f, +164.063f,1.11181f,-171.875f, +167.969f,-2.00034f,-171.875f, +171.875f,-3.64525f,-171.875f, +175.781f,-5.12602f,-171.875f, +179.688f,-8.3325f,-171.875f, +183.594f,-10.0807f,-171.875f, +187.5f,-10.8974f,-171.875f, +191.406f,-11.9623f,-171.875f, +195.313f,-14.5041f,-171.875f, +199.219f,-15.8629f,-171.875f, +203.125f,-17.2342f,-171.875f, +207.031f,-18.2786f,-171.875f, +210.938f,-16.9405f,-171.875f, +214.844f,-16.1592f,-171.875f, +218.75f,-15.9928f,-171.875f, +222.656f,-14.9179f,-171.875f, +226.563f,-13.6308f,-171.875f, +230.469f,-12.822f,-171.875f, +234.375f,-11.0168f,-171.875f, +238.281f,-8.54191f,-171.875f, +242.188f,-6.16464f,-171.875f, +246.094f,-4.35579f,-171.875f, +250.0f,-1.83408f,-171.875f, +3.90625f,34.823f,-175.781f, +7.8125f,33.9621f,-175.781f, +11.7188f,33.7226f,-175.781f, +15.625f,31.9821f,-175.781f, +19.5313f,29.6933f,-175.781f, +23.4375f,27.247f,-175.781f, +27.3438f,25.1394f,-175.781f, +31.25f,23.3125f,-175.781f, +35.1563f,21.288f,-175.781f, +39.0625f,21.2432f,-175.781f, +42.9688f,19.7041f,-175.781f, +46.875f,19.3043f,-175.781f, +50.7813f,18.5669f,-175.781f, +54.6875f,19.5408f,-175.781f, +58.5938f,20.3028f,-175.781f, +62.5f,20.573f,-175.781f, +66.4063f,20.7874f,-175.781f, +70.3125f,21.4507f,-175.781f, +74.2188f,22.9166f,-175.781f, +78.125f,23.6886f,-175.781f, +82.0313f,24.4139f,-175.781f, +85.9375f,25.1097f,-175.781f, +89.8438f,24.1395f,-175.781f, +93.75f,23.5282f,-175.781f, +97.6563f,22.7881f,-175.781f, +101.563f,21.2087f,-175.781f, +105.469f,20.6461f,-175.781f, +109.375f,19.7212f,-175.781f, +113.281f,17.9239f,-175.781f, +117.188f,16.9142f,-175.781f, +121.094f,16.1581f,-175.781f, +125.0f,15.1171f,-175.781f, +128.906f,13.1305f,-175.781f, +132.813f,10.3035f,-175.781f, +136.719f,7.95438f,-175.781f, +140.625f,7.49768f,-175.781f, +144.531f,7.76486f,-175.781f, +148.438f,6.84318f,-175.781f, +152.344f,6.0204f,-175.781f, +156.25f,4.83875f,-175.781f, +160.156f,2.59906f,-175.781f, +164.063f,1.35973f,-175.781f, +167.969f,-1.40345f,-175.781f, +171.875f,-3.6985f,-175.781f, +175.781f,-5.60686f,-175.781f, +179.688f,-8.15914f,-175.781f, +183.594f,-9.0389f,-175.781f, +187.5f,-11.2771f,-175.781f, +191.406f,-13.1363f,-175.781f, +195.313f,-14.845f,-175.781f, +199.219f,-15.885f,-175.781f, +203.125f,-17.6421f,-175.781f, +207.031f,-18.1972f,-175.781f, +210.938f,-16.4052f,-175.781f, +214.844f,-16.4522f,-175.781f, +218.75f,-15.8261f,-175.781f, +222.656f,-13.6816f,-175.781f, +226.563f,-12.8394f,-175.781f, +230.469f,-11.638f,-175.781f, +234.375f,-8.87545f,-175.781f, +238.281f,-6.82071f,-175.781f, +242.188f,-3.82988f,-175.781f, +246.094f,-2.34543f,-175.781f, +250.0f,-0.72787f,-175.781f, +3.90625f,32.9461f,-179.688f, +7.8125f,32.0951f,-179.688f, +11.7188f,31.1161f,-179.688f, +15.625f,29.4f,-179.688f, +19.5313f,27.5196f,-179.688f, +23.4375f,26.3351f,-179.688f, +27.3438f,24.0706f,-179.688f, +31.25f,21.9677f,-179.688f, +35.1563f,20.1582f,-179.688f, +39.0625f,19.3604f,-179.688f, +42.9688f,18.5912f,-179.688f, +46.875f,18.0845f,-179.688f, +50.7813f,18.0311f,-179.688f, +54.6875f,17.5412f,-179.688f, +58.5938f,17.724f,-179.688f, +62.5f,18.1752f,-179.688f, +66.4063f,18.8435f,-179.688f, +70.3125f,20.8887f,-179.688f, +74.2188f,21.9179f,-179.688f, +78.125f,22.3044f,-179.688f, +82.0313f,22.1491f,-179.688f, +85.9375f,23.261f,-179.688f, +89.8438f,22.4285f,-179.688f, +93.75f,21.5354f,-179.688f, +97.6563f,19.6399f,-179.688f, +101.563f,18.1312f,-179.688f, +105.469f,17.0655f,-179.688f, +109.375f,16.1471f,-179.688f, +113.281f,15.8256f,-179.688f, +117.188f,14.9609f,-179.688f, +121.094f,15.4508f,-179.688f, +125.0f,14.9122f,-179.688f, +128.906f,12.3324f,-179.688f, +132.813f,9.95184f,-179.688f, +136.719f,7.31755f,-179.688f, +140.625f,6.91109f,-179.688f, +144.531f,7.29489f,-179.688f, +148.438f,6.73968f,-179.688f, +152.344f,6.0555f,-179.688f, +156.25f,5.42266f,-179.688f, +160.156f,3.84651f,-179.688f, +164.063f,2.44552f,-179.688f, +167.969f,-0.187962f,-179.688f, +171.875f,-3.00626f,-179.688f, +175.781f,-5.38527f,-179.688f, +179.688f,-6.48806f,-179.688f, +183.594f,-9.24275f,-179.688f, +187.5f,-11.5122f,-179.688f, +191.406f,-12.6735f,-179.688f, +195.313f,-14.1843f,-179.688f, +199.219f,-15.4787f,-179.688f, +203.125f,-16.6061f,-179.688f, +207.031f,-17.1175f,-179.688f, +210.938f,-16.022f,-179.688f, +214.844f,-15.9349f,-179.688f, +218.75f,-14.6169f,-179.688f, +222.656f,-13.0146f,-179.688f, +226.563f,-12.2f,-179.688f, +230.469f,-9.81169f,-179.688f, +234.375f,-6.72224f,-179.688f, +238.281f,-4.11664f,-179.688f, +242.188f,-2.18066f,-179.688f, +246.094f,-0.510192f,-179.688f, +250.0f,1.48603f,-179.688f, +3.90625f,30.0027f,-183.594f, +7.8125f,29.6114f,-183.594f, +11.7188f,28.342f,-183.594f, +15.625f,26.9383f,-183.594f, +19.5313f,26.0219f,-183.594f, +23.4375f,25.017f,-183.594f, +27.3438f,22.7851f,-183.594f, +31.25f,20.6488f,-183.594f, +35.1563f,18.7107f,-183.594f, +39.0625f,17.0893f,-183.594f, +42.9688f,17.4316f,-183.594f, +46.875f,17.3211f,-183.594f, +50.7813f,16.5318f,-183.594f, +54.6875f,16.2012f,-183.594f, +58.5938f,17.0855f,-183.594f, +62.5f,17.2472f,-183.594f, +66.4063f,18.0123f,-183.594f, +70.3125f,18.684f,-183.594f, +74.2188f,19.625f,-183.594f, +78.125f,19.9442f,-183.594f, +82.0313f,19.9236f,-183.594f, +85.9375f,19.2286f,-183.594f, +89.8438f,19.5358f,-183.594f, +93.75f,18.429f,-183.594f, +97.6563f,16.1318f,-183.594f, +101.563f,14.371f,-183.594f, +105.469f,13.894f,-183.594f, +109.375f,13.5457f,-183.594f, +113.281f,13.7348f,-183.594f, +117.188f,14.0078f,-183.594f, +121.094f,14.2652f,-183.594f, +125.0f,13.5964f,-183.594f, +128.906f,11.3529f,-183.594f, +132.813f,8.43645f,-183.594f, +136.719f,6.95213f,-183.594f, +140.625f,7.16061f,-183.594f, +144.531f,6.71961f,-183.594f, +148.438f,5.35597f,-183.594f, +152.344f,5.22708f,-183.594f, +156.25f,5.07045f,-183.594f, +160.156f,3.44698f,-183.594f, +164.063f,2.33212f,-183.594f, +167.969f,0.462143f,-183.594f, +171.875f,-2.31458f,-183.594f, +175.781f,-4.89712f,-183.594f, +179.688f,-6.66797f,-183.594f, +183.594f,-9.25909f,-183.594f, +187.5f,-9.93472f,-183.594f, +191.406f,-12.0357f,-183.594f, +195.313f,-13.4286f,-183.594f, +199.219f,-14.4671f,-183.594f, +203.125f,-15.0102f,-183.594f, +207.031f,-14.8104f,-183.594f, +210.938f,-13.4733f,-183.594f, +214.844f,-14.0715f,-183.594f, +218.75f,-14.2416f,-183.594f, +222.656f,-12.2774f,-183.594f, +226.563f,-11.1048f,-183.594f, +230.469f,-8.72548f,-183.594f, +234.375f,-5.50563f,-183.594f, +238.281f,-2.81853f,-183.594f, +242.188f,-0.555239f,-183.594f, +246.094f,1.07177f,-183.594f, +250.0f,3.1022f,-183.594f, +3.90625f,27.6405f,-187.5f, +7.8125f,27.1266f,-187.5f, +11.7188f,26.0941f,-187.5f, +15.625f,25.1443f,-187.5f, +19.5313f,24.6236f,-187.5f, +23.4375f,23.7274f,-187.5f, +27.3438f,22.5792f,-187.5f, +31.25f,19.7482f,-187.5f, +35.1563f,17.6829f,-187.5f, +39.0625f,16.5577f,-187.5f, +42.9688f,15.8636f,-187.5f, +46.875f,16.0968f,-187.5f, +50.7813f,15.5614f,-187.5f, +54.6875f,15.4655f,-187.5f, +58.5938f,16.304f,-187.5f, +62.5f,16.7706f,-187.5f, +66.4063f,16.3947f,-187.5f, +70.3125f,16.6761f,-187.5f, +74.2188f,16.7627f,-187.5f, +78.125f,17.2579f,-187.5f, +82.0313f,16.7208f,-187.5f, +85.9375f,16.5278f,-187.5f, +89.8438f,16.2251f,-187.5f, +93.75f,15.0741f,-187.5f, +97.6563f,14.2628f,-187.5f, +101.563f,12.432f,-187.5f, +105.469f,10.8877f,-187.5f, +109.375f,11.903f,-187.5f, +113.281f,12.5606f,-187.5f, +117.188f,13.2652f,-187.5f, +121.094f,13.6914f,-187.5f, +125.0f,12.7849f,-187.5f, +128.906f,10.4802f,-187.5f, +132.813f,8.75276f,-187.5f, +136.719f,6.90392f,-187.5f, +140.625f,6.91636f,-187.5f, +144.531f,6.78271f,-187.5f, +148.438f,5.25436f,-187.5f, +152.344f,4.14458f,-187.5f, +156.25f,3.58445f,-187.5f, +160.156f,3.67538f,-187.5f, +164.063f,1.88171f,-187.5f, +167.969f,1.16358f,-187.5f, +171.875f,-0.909335f,-187.5f, +175.781f,-4.00056f,-187.5f, +179.688f,-6.532f,-187.5f, +183.594f,-8.29174f,-187.5f, +187.5f,-9.0196f,-187.5f, +191.406f,-10.1189f,-187.5f, +195.313f,-11.1349f,-187.5f, +199.219f,-12.4853f,-187.5f, +203.125f,-12.7324f,-187.5f, +207.031f,-12.949f,-187.5f, +210.938f,-11.8708f,-187.5f, +214.844f,-12.2515f,-187.5f, +218.75f,-12.8455f,-187.5f, +222.656f,-10.7923f,-187.5f, +226.563f,-8.82819f,-187.5f, +230.469f,-7.36721f,-187.5f, +234.375f,-5.23714f,-187.5f, +238.281f,-2.63334f,-187.5f, +242.188f,0.485313f,-187.5f, +246.094f,2.78278f,-187.5f, +250.0f,3.96313f,-187.5f, +3.90625f,25.3652f,-191.406f, +7.8125f,24.7195f,-191.406f, +11.7188f,25.004f,-191.406f, +15.625f,24.1773f,-191.406f, +19.5313f,22.7395f,-191.406f, +23.4375f,21.4739f,-191.406f, +27.3438f,21.0405f,-191.406f, +31.25f,18.3321f,-191.406f, +35.1563f,16.9491f,-191.406f, +39.0625f,15.1898f,-191.406f, +42.9688f,14.5842f,-191.406f, +46.875f,14.234f,-191.406f, +50.7813f,14.0689f,-191.406f, +54.6875f,15.4103f,-191.406f, +58.5938f,15.0749f,-191.406f, +62.5f,14.6893f,-191.406f, +66.4063f,14.8987f,-191.406f, +70.3125f,14.4416f,-191.406f, +74.2188f,14.3436f,-191.406f, +78.125f,13.5844f,-191.406f, +82.0313f,13.3989f,-191.406f, +85.9375f,14.3892f,-191.406f, +89.8438f,13.3595f,-191.406f, +93.75f,13.3004f,-191.406f, +97.6563f,11.8557f,-191.406f, +101.563f,9.50387f,-191.406f, +105.469f,9.09049f,-191.406f, +109.375f,10.2607f,-191.406f, +113.281f,11.3275f,-191.406f, +117.188f,11.8898f,-191.406f, +121.094f,11.9585f,-191.406f, +125.0f,11.0034f,-191.406f, +128.906f,10.0704f,-191.406f, +132.813f,8.84472f,-191.406f, +136.719f,7.56972f,-191.406f, +140.625f,6.66467f,-191.406f, +144.531f,5.57509f,-191.406f, +148.438f,4.43943f,-191.406f, +152.344f,3.51469f,-191.406f, +156.25f,2.91572f,-191.406f, +160.156f,3.43161f,-191.406f, +164.063f,1.97664f,-191.406f, +167.969f,1.37279f,-191.406f, +171.875f,-0.545961f,-191.406f, +175.781f,-3.78517f,-191.406f, +179.688f,-6.09483f,-191.406f, +183.594f,-6.45627f,-191.406f, +187.5f,-7.27376f,-191.406f, +191.406f,-8.99215f,-191.406f, +195.313f,-9.89915f,-191.406f, +199.219f,-10.9608f,-191.406f, +203.125f,-10.8387f,-191.406f, +207.031f,-10.5261f,-191.406f, +210.938f,-10.1365f,-191.406f, +214.844f,-10.631f,-191.406f, +218.75f,-10.8413f,-191.406f, +222.656f,-9.03823f,-191.406f, +226.563f,-7.39571f,-191.406f, +230.469f,-4.8409f,-191.406f, +234.375f,-3.47756f,-191.406f, +238.281f,-1.63291f,-191.406f, +242.188f,1.44814f,-191.406f, +246.094f,2.93141f,-191.406f, +250.0f,4.03991f,-191.406f, +3.90625f,23.0993f,-195.313f, +7.8125f,23.2309f,-195.313f, +11.7188f,23.4293f,-195.313f, +15.625f,22.4425f,-195.313f, +19.5313f,21.4905f,-195.313f, +23.4375f,19.6567f,-195.313f, +27.3438f,18.1324f,-195.313f, +31.25f,17.3872f,-195.313f, +35.1563f,16.265f,-195.313f, +39.0625f,13.8338f,-195.313f, +42.9688f,12.7629f,-195.313f, +46.875f,13.1006f,-195.313f, +50.7813f,13.3481f,-195.313f, +54.6875f,13.8039f,-195.313f, +58.5938f,13.0621f,-195.313f, +62.5f,12.4363f,-195.313f, +66.4063f,12.748f,-195.313f, +70.3125f,12.2979f,-195.313f, +74.2188f,11.3997f,-195.313f, +78.125f,12.1637f,-195.313f, +82.0313f,12.2143f,-195.313f, +85.9375f,12.0963f,-195.313f, +89.8438f,11.3468f,-195.313f, +93.75f,11.1939f,-195.313f, +97.6563f,9.31577f,-195.313f, +101.563f,9.0203f,-195.313f, +105.469f,8.39154f,-195.313f, +109.375f,8.72501f,-195.313f, +113.281f,9.3763f,-195.313f, +117.188f,9.56963f,-195.313f, +121.094f,9.54203f,-195.313f, +125.0f,9.30859f,-195.313f, +128.906f,9.02325f,-195.313f, +132.813f,8.54457f,-195.313f, +136.719f,7.91487f,-195.313f, +140.625f,5.8935f,-195.313f, +144.531f,4.77605f,-195.313f, +148.438f,3.03324f,-195.313f, +152.344f,2.63999f,-195.313f, +156.25f,1.85254f,-195.313f, +160.156f,2.58504f,-195.313f, +164.063f,1.86646f,-195.313f, +167.969f,0.472293f,-195.313f, +171.875f,-0.819486f,-195.313f, +175.781f,-3.28005f,-195.313f, +179.688f,-4.07223f,-195.313f, +183.594f,-5.23099f,-195.313f, +187.5f,-5.93446f,-195.313f, +191.406f,-7.40083f,-195.313f, +195.313f,-9.52595f,-195.313f, +199.219f,-9.06593f,-195.313f, +203.125f,-8.64632f,-195.313f, +207.031f,-8.71126f,-195.313f, +210.938f,-7.66946f,-195.313f, +214.844f,-8.22025f,-195.313f, +218.75f,-8.77434f,-195.313f, +222.656f,-7.8003f,-195.313f, +226.563f,-5.29317f,-195.313f, +230.469f,-3.13421f,-195.313f, +234.375f,-1.47978f,-195.313f, +238.281f,0.0436352f,-195.313f, +242.188f,1.56763f,-195.313f, +246.094f,3.2707f,-195.313f, +250.0f,5.38332f,-195.313f, +3.90625f,21.5827f,-199.219f, +7.8125f,21.5884f,-199.219f, +11.7188f,22.0551f,-199.219f, +15.625f,21.1895f,-199.219f, +19.5313f,19.9629f,-199.219f, +23.4375f,18.1891f,-199.219f, +27.3438f,17.3914f,-199.219f, +31.25f,15.7832f,-199.219f, +35.1563f,13.9537f,-199.219f, +39.0625f,11.7784f,-199.219f, +42.9688f,12.6473f,-199.219f, +46.875f,12.1685f,-199.219f, +50.7813f,12.2586f,-199.219f, +54.6875f,12.032f,-199.219f, +58.5938f,12.5025f,-199.219f, +62.5f,12.2207f,-199.219f, +66.4063f,10.4332f,-199.219f, +70.3125f,10.2093f,-199.219f, +74.2188f,9.56536f,-199.219f, +78.125f,10.5041f,-199.219f, +82.0313f,10.9136f,-199.219f, +85.9375f,10.6303f,-199.219f, +89.8438f,11.148f,-199.219f, +93.75f,10.2169f,-199.219f, +97.6563f,8.56966f,-199.219f, +101.563f,8.81808f,-199.219f, +105.469f,7.92638f,-199.219f, +109.375f,7.988f,-199.219f, +113.281f,8.07342f,-199.219f, +117.188f,8.41463f,-199.219f, +121.094f,8.44317f,-199.219f, +125.0f,8.93315f,-199.219f, +128.906f,8.02242f,-199.219f, +132.813f,7.78977f,-199.219f, +136.719f,7.24422f,-199.219f, +140.625f,6.65469f,-199.219f, +144.531f,5.63698f,-199.219f, +148.438f,3.71906f,-199.219f, +152.344f,1.94989f,-199.219f, +156.25f,1.5781f,-199.219f, +160.156f,2.54367f,-199.219f, +164.063f,2.24455f,-199.219f, +167.969f,0.172967f,-199.219f, +171.875f,-1.24076f,-199.219f, +175.781f,-2.09517f,-199.219f, +179.688f,-2.60068f,-199.219f, +183.594f,-3.35838f,-199.219f, +187.5f,-5.02796f,-199.219f, +191.406f,-6.75939f,-199.219f, +195.313f,-7.86176f,-199.219f, +199.219f,-7.60703f,-199.219f, +203.125f,-7.1176f,-199.219f, +207.031f,-7.21926f,-199.219f, +210.938f,-6.354f,-199.219f, +214.844f,-6.26146f,-199.219f, +218.75f,-7.39202f,-199.219f, +222.656f,-6.10132f,-199.219f, +226.563f,-4.15677f,-199.219f, +230.469f,-1.72339f,-199.219f, +234.375f,0.220408f,-199.219f, +238.281f,1.71501f,-199.219f, +242.188f,2.32136f,-199.219f, +246.094f,3.9302f,-199.219f, +250.0f,6.99831f,-199.219f, +3.90625f,20.3179f,-203.125f, +7.8125f,19.0038f,-203.125f, +11.7188f,19.8795f,-203.125f, +15.625f,18.863f,-203.125f, +19.5313f,17.2513f,-203.125f, +23.4375f,16.7786f,-203.125f, +27.3438f,16.4605f,-203.125f, +31.25f,14.0944f,-203.125f, +35.1563f,12.6715f,-203.125f, +39.0625f,12.2869f,-203.125f, +42.9688f,12.0256f,-203.125f, +46.875f,11.4308f,-203.125f, +50.7813f,11.5543f,-203.125f, +54.6875f,10.8247f,-203.125f, +58.5938f,12.5385f,-203.125f, +62.5f,12.1754f,-203.125f, +66.4063f,10.0857f,-203.125f, +70.3125f,8.73654f,-203.125f, +74.2188f,8.35323f,-203.125f, +78.125f,8.75049f,-203.125f, +82.0313f,9.69714f,-203.125f, +85.9375f,9.93848f,-203.125f, +89.8438f,9.99533f,-203.125f, +93.75f,9.28937f,-203.125f, +97.6563f,8.19048f,-203.125f, +101.563f,7.82659f,-203.125f, +105.469f,6.70152f,-203.125f, +109.375f,6.35245f,-203.125f, +113.281f,6.80811f,-203.125f, +117.188f,7.88474f,-203.125f, +121.094f,8.76964f,-203.125f, +125.0f,9.33913f,-203.125f, +128.906f,9.12843f,-203.125f, +132.813f,7.62144f,-203.125f, +136.719f,6.32841f,-203.125f, +140.625f,6.30299f,-203.125f, +144.531f,5.78467f,-203.125f, +148.438f,4.2404f,-203.125f, +152.344f,2.7611f,-203.125f, +156.25f,1.95904f,-203.125f, +160.156f,2.27166f,-203.125f, +164.063f,2.22405f,-203.125f, +167.969f,1.12279f,-203.125f, +171.875f,-0.169061f,-203.125f, +175.781f,-0.887647f,-203.125f, +179.688f,-0.896535f,-203.125f, +183.594f,-2.41604f,-203.125f, +187.5f,-3.63423f,-203.125f, +191.406f,-6.00826f,-203.125f, +195.313f,-5.87316f,-203.125f, +199.219f,-5.18767f,-203.125f, +203.125f,-4.23762f,-203.125f, +207.031f,-4.7338f,-203.125f, +210.938f,-4.88225f,-203.125f, +214.844f,-4.82274f,-203.125f, +218.75f,-5.06338f,-203.125f, +222.656f,-5.13737f,-203.125f, +226.563f,-2.74217f,-203.125f, +230.469f,0.0831564f,-203.125f, +234.375f,2.00986f,-203.125f, +238.281f,2.89937f,-203.125f, +242.188f,3.79442f,-203.125f, +246.094f,5.43821f,-203.125f, +250.0f,8.47222f,-203.125f, +3.90625f,18.3149f,-207.031f, +7.8125f,16.9318f,-207.031f, +11.7188f,16.7123f,-207.031f, +15.625f,16.066f,-207.031f, +19.5313f,15.8401f,-207.031f, +23.4375f,14.9793f,-207.031f, +27.3438f,13.5136f,-207.031f, +31.25f,12.316f,-207.031f, +35.1563f,12.4286f,-207.031f, +39.0625f,12.5926f,-207.031f, +42.9688f,12.419f,-207.031f, +46.875f,11.7087f,-207.031f, +50.7813f,10.9033f,-207.031f, +54.6875f,10.2175f,-207.031f, +58.5938f,10.7307f,-207.031f, +62.5f,9.9283f,-207.031f, +66.4063f,9.11458f,-207.031f, +70.3125f,6.81804f,-207.031f, +74.2188f,6.85559f,-207.031f, +78.125f,6.98146f,-207.031f, +82.0313f,8.41059f,-207.031f, +85.9375f,8.81018f,-207.031f, +89.8438f,9.25882f,-207.031f, +93.75f,8.4973f,-207.031f, +97.6563f,7.11312f,-207.031f, +101.563f,6.11367f,-207.031f, +105.469f,4.54171f,-207.031f, +109.375f,3.984f,-207.031f, +113.281f,6.23536f,-207.031f, +117.188f,7.41972f,-207.031f, +121.094f,8.40005f,-207.031f, +125.0f,9.21009f,-207.031f, +128.906f,9.10113f,-207.031f, +132.813f,8.69785f,-207.031f, +136.719f,7.08314f,-207.031f, +140.625f,6.14113f,-207.031f, +144.531f,4.85123f,-207.031f, +148.438f,4.53013f,-207.031f, +152.344f,4.73052f,-207.031f, +156.25f,3.50435f,-207.031f, +160.156f,3.02093f,-207.031f, +164.063f,2.65317f,-207.031f, +167.969f,1.91936f,-207.031f, +171.875f,1.31638f,-207.031f, +175.781f,0.631767f,-207.031f, +179.688f,-0.185018f,-207.031f, +183.594f,-1.04617f,-207.031f, +187.5f,-2.59594f,-207.031f, +191.406f,-3.62219f,-207.031f, +195.313f,-3.17366f,-207.031f, +199.219f,-3.0812f,-207.031f, +203.125f,-2.21365f,-207.031f, +207.031f,-3.02851f,-207.031f, +210.938f,-4.12823f,-207.031f, +214.844f,-3.42208f,-207.031f, +218.75f,-3.83284f,-207.031f, +222.656f,-3.83483f,-207.031f, +226.563f,-1.81388f,-207.031f, +230.469f,1.06182f,-207.031f, +234.375f,3.0063f,-207.031f, +238.281f,3.97581f,-207.031f, +242.188f,5.25584f,-207.031f, +246.094f,6.1092f,-207.031f, +250.0f,9.89458f,-207.031f, +3.90625f,16.2147f,-210.938f, +7.8125f,15.8155f,-210.938f, +11.7188f,14.9704f,-210.938f, +15.625f,14.6853f,-210.938f, +19.5313f,14.3326f,-210.938f, +23.4375f,14.0488f,-210.938f, +27.3438f,12.2057f,-210.938f, +31.25f,12.7526f,-210.938f, +35.1563f,13.1468f,-210.938f, +39.0625f,12.959f,-210.938f, +42.9688f,12.3931f,-210.938f, +46.875f,11.9578f,-210.938f, +50.7813f,10.5381f,-210.938f, +54.6875f,9.28222f,-210.938f, +58.5938f,9.20117f,-210.938f, +62.5f,8.74359f,-210.938f, +66.4063f,7.58308f,-210.938f, +70.3125f,5.98903f,-210.938f, +74.2188f,5.92315f,-210.938f, +78.125f,6.30208f,-210.938f, +82.0313f,7.35787f,-210.938f, +85.9375f,7.64729f,-210.938f, +89.8438f,7.89394f,-210.938f, +93.75f,7.64523f,-210.938f, +97.6563f,5.66526f,-210.938f, +101.563f,4.1348f,-210.938f, +105.469f,2.65548f,-210.938f, +109.375f,4.20615f,-210.938f, +113.281f,5.82801f,-210.938f, +117.188f,6.92681f,-210.938f, +121.094f,8.52107f,-210.938f, +125.0f,9.29929f,-210.938f, +128.906f,10.1454f,-210.938f, +132.813f,9.39782f,-210.938f, +136.719f,8.72704f,-210.938f, +140.625f,7.91058f,-210.938f, +144.531f,5.32835f,-210.938f, +148.438f,5.30143f,-210.938f, +152.344f,4.98294f,-210.938f, +156.25f,5.27331f,-210.938f, +160.156f,4.054f,-210.938f, +164.063f,4.25352f,-210.938f, +167.969f,3.60791f,-210.938f, +171.875f,2.94898f,-210.938f, +175.781f,1.97064f,-210.938f, +179.688f,1.21275f,-210.938f, +183.594f,-0.419751f,-210.938f, +187.5f,-1.77221f,-210.938f, +191.406f,-1.94763f,-210.938f, +195.313f,-1.32172f,-210.938f, +199.219f,-1.74453f,-210.938f, +203.125f,-0.694964f,-210.938f, +207.031f,-1.77277f,-210.938f, +210.938f,-2.39571f,-210.938f, +214.844f,-2.61021f,-210.938f, +218.75f,-3.16f,-210.938f, +222.656f,-2.46606f,-210.938f, +226.563f,-0.862086f,-210.938f, +230.469f,1.4487f,-210.938f, +234.375f,3.44239f,-210.938f, +238.281f,5.41949f,-210.938f, +242.188f,6.28416f,-210.938f, +246.094f,7.24993f,-210.938f, +250.0f,10.7227f,-210.938f, +3.90625f,14.284f,-214.844f, +7.8125f,14.031f,-214.844f, +11.7188f,12.8153f,-214.844f, +15.625f,12.2914f,-214.844f, +19.5313f,12.0657f,-214.844f, +23.4375f,12.4452f,-214.844f, +27.3438f,12.703f,-214.844f, +31.25f,12.3401f,-214.844f, +35.1563f,13.2219f,-214.844f, +39.0625f,12.9074f,-214.844f, +42.9688f,12.5934f,-214.844f, +46.875f,11.4717f,-214.844f, +50.7813f,10.548f,-214.844f, +54.6875f,9.43614f,-214.844f, +58.5938f,10.0982f,-214.844f, +62.5f,9.36536f,-214.844f, +66.4063f,8.07196f,-214.844f, +70.3125f,6.4483f,-214.844f, +74.2188f,5.80499f,-214.844f, +78.125f,5.60605f,-214.844f, +82.0313f,6.64906f,-214.844f, +85.9375f,7.64402f,-214.844f, +89.8438f,8.31151f,-214.844f, +93.75f,7.97344f,-214.844f, +97.6563f,5.39549f,-214.844f, +101.563f,3.66809f,-214.844f, +105.469f,3.2001f,-214.844f, +109.375f,5.91373f,-214.844f, +113.281f,7.40339f,-214.844f, +117.188f,8.30807f,-214.844f, +121.094f,9.75774f,-214.844f, +125.0f,10.2383f,-214.844f, +128.906f,10.3408f,-214.844f, +132.813f,10.6262f,-214.844f, +136.719f,10.8818f,-214.844f, +140.625f,9.09087f,-214.844f, +144.531f,6.48291f,-214.844f, +148.438f,5.02116f,-214.844f, +152.344f,5.97543f,-214.844f, +156.25f,6.33053f,-214.844f, +160.156f,5.91049f,-214.844f, +164.063f,5.03025f,-214.844f, +167.969f,5.01201f,-214.844f, +171.875f,4.36222f,-214.844f, +175.781f,3.69208f,-214.844f, +179.688f,2.96539f,-214.844f, +183.594f,1.43789f,-214.844f, +187.5f,-0.374301f,-214.844f, +191.406f,-0.955695f,-214.844f, +195.313f,-0.123769f,-214.844f, +199.219f,-0.113436f,-214.844f, +203.125f,-0.0171993f,-214.844f, +207.031f,-1.0984f,-214.844f, +210.938f,-1.10949f,-214.844f, +214.844f,-1.92471f,-214.844f, +218.75f,-2.26183f,-214.844f, +222.656f,-1.32064f,-214.844f, +226.563f,0.209158f,-214.844f, +230.469f,2.41199f,-214.844f, +234.375f,4.66871f,-214.844f, +238.281f,6.29773f,-214.844f, +242.188f,7.20184f,-214.844f, +246.094f,8.08018f,-214.844f, +250.0f,10.3057f,-214.844f, +3.90625f,13.272f,-218.75f, +7.8125f,12.8218f,-218.75f, +11.7188f,11.8102f,-218.75f, +15.625f,11.7105f,-218.75f, +19.5313f,11.5191f,-218.75f, +23.4375f,12.1253f,-218.75f, +27.3438f,12.0266f,-218.75f, +31.25f,12.3549f,-218.75f, +35.1563f,12.3822f,-218.75f, +39.0625f,12.268f,-218.75f, +42.9688f,12.5022f,-218.75f, +46.875f,11.2878f,-218.75f, +50.7813f,10.1823f,-218.75f, +54.6875f,10.4244f,-218.75f, +58.5938f,10.0047f,-218.75f, +62.5f,9.96061f,-218.75f, +66.4063f,8.64873f,-218.75f, +70.3125f,6.45636f,-218.75f, +74.2188f,5.30254f,-218.75f, +78.125f,5.2915f,-218.75f, +82.0313f,7.2575f,-218.75f, +85.9375f,8.1568f,-218.75f, +89.8438f,8.97514f,-218.75f, +93.75f,7.72908f,-218.75f, +97.6563f,5.41501f,-218.75f, +101.563f,4.24025f,-218.75f, +105.469f,5.39134f,-218.75f, +109.375f,7.69518f,-218.75f, +113.281f,8.87616f,-218.75f, +117.188f,9.44758f,-218.75f, +121.094f,9.21473f,-218.75f, +125.0f,10.1366f,-218.75f, +128.906f,11.6088f,-218.75f, +132.813f,12.0083f,-218.75f, +136.719f,12.3184f,-218.75f, +140.625f,10.8438f,-218.75f, +144.531f,7.65837f,-218.75f, +148.438f,6.07316f,-218.75f, +152.344f,6.4613f,-218.75f, +156.25f,7.01972f,-218.75f, +160.156f,7.25454f,-218.75f, +164.063f,6.31416f,-218.75f, +167.969f,6.48096f,-218.75f, +171.875f,5.89274f,-218.75f, +175.781f,5.71289f,-218.75f, +179.688f,4.3046f,-218.75f, +183.594f,2.49719f,-218.75f, +187.5f,1.16956f,-218.75f, +191.406f,1.21673f,-218.75f, +195.313f,1.19652f,-218.75f, +199.219f,1.27819f,-218.75f, +203.125f,1.06325f,-218.75f, +207.031f,0.133118f,-218.75f, +210.938f,-0.283675f,-218.75f, +214.844f,-0.471323f,-218.75f, +218.75f,-0.941533f,-218.75f, +222.656f,-0.953851f,-218.75f, +226.563f,0.751216f,-218.75f, +230.469f,2.54245f,-218.75f, +234.375f,5.17863f,-218.75f, +238.281f,7.22669f,-218.75f, +242.188f,8.44723f,-218.75f, +246.094f,8.59229f,-218.75f, +250.0f,10.4333f,-218.75f, +3.90625f,13.0199f,-222.656f, +7.8125f,13.1789f,-222.656f, +11.7188f,12.4614f,-222.656f, +15.625f,10.8521f,-222.656f, +19.5313f,11.2552f,-222.656f, +23.4375f,12.1618f,-222.656f, +27.3438f,12.6207f,-222.656f, +31.25f,12.7195f,-222.656f, +35.1563f,12.6379f,-222.656f, +39.0625f,12.5247f,-222.656f, +42.9688f,11.5493f,-222.656f, +46.875f,11.1218f,-222.656f, +50.7813f,11.1036f,-222.656f, +54.6875f,11.2909f,-222.656f, +58.5938f,9.99718f,-222.656f, +62.5f,9.07075f,-222.656f, +66.4063f,7.85904f,-222.656f, +70.3125f,6.00034f,-222.656f, +74.2188f,6.20222f,-222.656f, +78.125f,6.90091f,-222.656f, +82.0313f,8.15724f,-222.656f, +85.9375f,8.92624f,-222.656f, +89.8438f,9.54135f,-222.656f, +93.75f,8.05473f,-222.656f, +97.6563f,5.80654f,-222.656f, +101.563f,5.02178f,-222.656f, +105.469f,7.15584f,-222.656f, +109.375f,8.94755f,-222.656f, +113.281f,9.86631f,-222.656f, +117.188f,10.6421f,-222.656f, +121.094f,10.7891f,-222.656f, +125.0f,11.0716f,-222.656f, +128.906f,12.6376f,-222.656f, +132.813f,12.4373f,-222.656f, +136.719f,12.1143f,-222.656f, +140.625f,11.4028f,-222.656f, +144.531f,8.95242f,-222.656f, +148.438f,6.83012f,-222.656f, +152.344f,7.65217f,-222.656f, +156.25f,8.26579f,-222.656f, +160.156f,7.9665f,-222.656f, +164.063f,7.5217f,-222.656f, +167.969f,7.17758f,-222.656f, +171.875f,5.9966f,-222.656f, +175.781f,5.77514f,-222.656f, +179.688f,4.77675f,-222.656f, +183.594f,3.39545f,-222.656f, +187.5f,2.95911f,-222.656f, +191.406f,1.85368f,-222.656f, +195.313f,1.31365f,-222.656f, +199.219f,1.12622f,-222.656f, +203.125f,1.47676f,-222.656f, +207.031f,1.89446f,-222.656f, +210.938f,0.63056f,-222.656f, +214.844f,0.297565f,-222.656f, +218.75f,-0.0109998f,-222.656f, +222.656f,-0.225082f,-222.656f, +226.563f,0.63258f,-222.656f, +230.469f,2.89831f,-222.656f, +234.375f,5.64839f,-222.656f, +238.281f,7.22414f,-222.656f, +242.188f,7.89951f,-222.656f, +246.094f,8.80151f,-222.656f, +250.0f,10.9602f,-222.656f, +3.90625f,11.9733f,-226.563f, +7.8125f,12.8862f,-226.563f, +11.7188f,12.1283f,-226.563f, +15.625f,10.7234f,-226.563f, +19.5313f,11.6866f,-226.563f, +23.4375f,12.6552f,-226.563f, +27.3438f,12.7353f,-226.563f, +31.25f,11.7992f,-226.563f, +35.1563f,11.2006f,-226.563f, +39.0625f,10.9699f,-226.563f, +42.9688f,10.7653f,-226.563f, +46.875f,10.9947f,-226.563f, +50.7813f,11.2791f,-226.563f, +54.6875f,11.0716f,-226.563f, +58.5938f,10.7092f,-226.563f, +62.5f,9.16355f,-226.563f, +66.4063f,7.59431f,-226.563f, +70.3125f,6.68502f,-226.563f, +74.2188f,6.98133f,-226.563f, +78.125f,7.72239f,-226.563f, +82.0313f,9.00293f,-226.563f, +85.9375f,9.47866f,-226.563f, +89.8438f,8.94458f,-226.563f, +93.75f,7.79648f,-226.563f, +97.6563f,6.07787f,-226.563f, +101.563f,6.60546f,-226.563f, +105.469f,8.5652f,-226.563f, +109.375f,10.2869f,-226.563f, +113.281f,11.4751f,-226.563f, +117.188f,11.6224f,-226.563f, +121.094f,12.0803f,-226.563f, +125.0f,12.5335f,-226.563f, +128.906f,13.5918f,-226.563f, +132.813f,12.9198f,-226.563f, +136.719f,11.521f,-226.563f, +140.625f,10.6418f,-226.563f, +144.531f,8.8393f,-226.563f, +148.438f,8.79941f,-226.563f, +152.344f,9.4929f,-226.563f, +156.25f,9.96206f,-226.563f, +160.156f,8.75524f,-226.563f, +164.063f,7.64157f,-226.563f, +167.969f,7.1963f,-226.563f, +171.875f,6.83929f,-226.563f, +175.781f,6.10665f,-226.563f, +179.688f,4.70473f,-226.563f, +183.594f,4.54758f,-226.563f, +187.5f,3.58616f,-226.563f, +191.406f,2.97998f,-226.563f, +195.313f,1.49179f,-226.563f, +199.219f,1.85834f,-226.563f, +203.125f,1.49089f,-226.563f, +207.031f,1.39949f,-226.563f, +210.938f,0.863002f,-226.563f, +214.844f,1.15546f,-226.563f, +218.75f,0.609373f,-226.563f, +222.656f,1.04332f,-226.563f, +226.563f,1.58038f,-226.563f, +230.469f,4.11549f,-226.563f, +234.375f,5.64696f,-226.563f, +238.281f,6.61687f,-226.563f, +242.188f,7.3113f,-226.563f, +246.094f,8.56955f,-226.563f, +250.0f,10.7891f,-226.563f, +3.90625f,10.4619f,-230.469f, +7.8125f,11.4179f,-230.469f, +11.7188f,10.7841f,-230.469f, +15.625f,10.597f,-230.469f, +19.5313f,10.9999f,-230.469f, +23.4375f,11.5972f,-230.469f, +27.3438f,11.4553f,-230.469f, +31.25f,10.1015f,-230.469f, +35.1563f,10.412f,-230.469f, +39.0625f,9.72694f,-230.469f, +42.9688f,9.71973f,-230.469f, +46.875f,10.7767f,-230.469f, +50.7813f,10.8775f,-230.469f, +54.6875f,10.3186f,-230.469f, +58.5938f,10.4188f,-230.469f, +62.5f,8.94879f,-230.469f, +66.4063f,7.92103f,-230.469f, +70.3125f,8.48295f,-230.469f, +74.2188f,8.74782f,-230.469f, +78.125f,8.87976f,-230.469f, +82.0313f,9.68632f,-230.469f, +85.9375f,9.54993f,-230.469f, +89.8438f,9.04624f,-230.469f, +93.75f,8.49407f,-230.469f, +97.6563f,7.90008f,-230.469f, +101.563f,9.20657f,-230.469f, +105.469f,10.5114f,-230.469f, +109.375f,11.5284f,-230.469f, +113.281f,12.0378f,-230.469f, +117.188f,12.9398f,-230.469f, +121.094f,13.1489f,-230.469f, +125.0f,13.8974f,-230.469f, +128.906f,14.5048f,-230.469f, +132.813f,13.1823f,-230.469f, +136.719f,11.6226f,-230.469f, +140.625f,11.1108f,-230.469f, +144.531f,10.0418f,-230.469f, +148.438f,10.2026f,-230.469f, +152.344f,10.9585f,-230.469f, +156.25f,11.0258f,-230.469f, +160.156f,9.88552f,-230.469f, +164.063f,8.92538f,-230.469f, +167.969f,7.90306f,-230.469f, +171.875f,7.23733f,-230.469f, +175.781f,6.09503f,-230.469f, +179.688f,5.15065f,-230.469f, +183.594f,4.73006f,-230.469f, +187.5f,4.05091f,-230.469f, +191.406f,3.01834f,-230.469f, +195.313f,1.83317f,-230.469f, +199.219f,2.77945f,-230.469f, +203.125f,3.05633f,-230.469f, +207.031f,2.07007f,-230.469f, +210.938f,2.01993f,-230.469f, +214.844f,2.13491f,-230.469f, +218.75f,1.65812f,-230.469f, +222.656f,1.8404f,-230.469f, +226.563f,2.78297f,-230.469f, +230.469f,3.94561f,-230.469f, +234.375f,5.83019f,-230.469f, +238.281f,6.9093f,-230.469f, +242.188f,7.96229f,-230.469f, +246.094f,7.63052f,-230.469f, +250.0f,10.2449f,-230.469f, +3.90625f,8.85224f,-234.375f, +7.8125f,9.40139f,-234.375f, +11.7188f,9.62814f,-234.375f, +15.625f,9.97075f,-234.375f, +19.5313f,9.96073f,-234.375f, +23.4375f,9.70541f,-234.375f, +27.3438f,10.0435f,-234.375f, +31.25f,9.85879f,-234.375f, +35.1563f,9.52681f,-234.375f, +39.0625f,8.75341f,-234.375f, +42.9688f,8.99686f,-234.375f, +46.875f,9.56309f,-234.375f, +50.7813f,9.54486f,-234.375f, +54.6875f,10.0225f,-234.375f, +58.5938f,9.56394f,-234.375f, +62.5f,9.18474f,-234.375f, +66.4063f,9.29208f,-234.375f, +70.3125f,10.4881f,-234.375f, +74.2188f,10.8865f,-234.375f, +78.125f,11.0201f,-234.375f, +82.0313f,11.7722f,-234.375f, +85.9375f,11.1624f,-234.375f, +89.8438f,10.602f,-234.375f, +93.75f,9.93284f,-234.375f, +97.6563f,10.2532f,-234.375f, +101.563f,11.0848f,-234.375f, +105.469f,12.6576f,-234.375f, +109.375f,13.4783f,-234.375f, +113.281f,14.7992f,-234.375f, +117.188f,15.3803f,-234.375f, +121.094f,15.9985f,-234.375f, +125.0f,14.9035f,-234.375f, +128.906f,14.2715f,-234.375f, +132.813f,14.0098f,-234.375f, +136.719f,13.1141f,-234.375f, +140.625f,12.5809f,-234.375f, +144.531f,11.8546f,-234.375f, +148.438f,11.5219f,-234.375f, +152.344f,11.8842f,-234.375f, +156.25f,11.6581f,-234.375f, +160.156f,10.8307f,-234.375f, +164.063f,10.2712f,-234.375f, +167.969f,8.58443f,-234.375f, +171.875f,7.00592f,-234.375f, +175.781f,5.65553f,-234.375f, +179.688f,5.07429f,-234.375f, +183.594f,4.41004f,-234.375f, +187.5f,3.95516f,-234.375f, +191.406f,3.42243f,-234.375f, +195.313f,2.54334f,-234.375f, +199.219f,3.95931f,-234.375f, +203.125f,3.9139f,-234.375f, +207.031f,2.90644f,-234.375f, +210.938f,3.11525f,-234.375f, +214.844f,3.33135f,-234.375f, +218.75f,2.64229f,-234.375f, +222.656f,2.64397f,-234.375f, +226.563f,3.186f,-234.375f, +230.469f,4.46201f,-234.375f, +234.375f,5.92783f,-234.375f, +238.281f,6.79968f,-234.375f, +242.188f,8.7067f,-234.375f, +246.094f,8.47322f,-234.375f, +250.0f,10.3839f,-234.375f, +3.90625f,7.99527f,-238.281f, +7.8125f,8.62199f,-238.281f, +11.7188f,9.06695f,-238.281f, +15.625f,9.12589f,-238.281f, +19.5313f,8.97926f,-238.281f, +23.4375f,9.75152f,-238.281f, +27.3438f,9.58038f,-238.281f, +31.25f,9.30169f,-238.281f, +35.1563f,8.63599f,-238.281f, +39.0625f,8.72973f,-238.281f, +42.9688f,8.49513f,-238.281f, +46.875f,8.78362f,-238.281f, +50.7813f,8.75045f,-238.281f, +54.6875f,8.96186f,-238.281f, +58.5938f,10.0611f,-238.281f, +62.5f,11.1275f,-238.281f, +66.4063f,10.8209f,-238.281f, +70.3125f,12.0108f,-238.281f, +74.2188f,13.2126f,-238.281f, +78.125f,14.1323f,-238.281f, +82.0313f,14.3575f,-238.281f, +85.9375f,13.2781f,-238.281f, +89.8438f,12.8024f,-238.281f, +93.75f,12.0484f,-238.281f, +97.6563f,12.7657f,-238.281f, +101.563f,14.0307f,-238.281f, +105.469f,15.9567f,-238.281f, +109.375f,17.7803f,-238.281f, +113.281f,19.0777f,-238.281f, +117.188f,18.7555f,-238.281f, +121.094f,18.8129f,-238.281f, +125.0f,17.4807f,-238.281f, +128.906f,16.4022f,-238.281f, +132.813f,16.01f,-238.281f, +136.719f,15.1852f,-238.281f, +140.625f,13.9301f,-238.281f, +144.531f,12.8841f,-238.281f, +148.438f,11.7108f,-238.281f, +152.344f,11.414f,-238.281f, +156.25f,11.056f,-238.281f, +160.156f,10.8688f,-238.281f, +164.063f,10.5672f,-238.281f, +167.969f,10.0938f,-238.281f, +171.875f,7.73603f,-238.281f, +175.781f,5.94931f,-238.281f, +179.688f,5.51512f,-238.281f, +183.594f,5.27449f,-238.281f, +187.5f,4.94763f,-238.281f, +191.406f,4.13161f,-238.281f, +195.313f,3.59426f,-238.281f, +199.219f,4.03163f,-238.281f, +203.125f,4.38188f,-238.281f, +207.031f,3.09959f,-238.281f, +210.938f,3.1766f,-238.281f, +214.844f,3.05715f,-238.281f, +218.75f,3.20329f,-238.281f, +222.656f,2.53565f,-238.281f, +226.563f,3.1275f,-238.281f, +230.469f,4.54736f,-238.281f, +234.375f,5.9361f,-238.281f, +238.281f,6.99977f,-238.281f, +242.188f,8.20813f,-238.281f, +246.094f,9.56614f,-238.281f, +250.0f,11.4751f,-238.281f, +3.90625f,6.40337f,-242.188f, +7.8125f,7.88741f,-242.188f, +11.7188f,8.60661f,-242.188f, +15.625f,8.56923f,-242.188f, +19.5313f,8.60588f,-242.188f, +23.4375f,8.63232f,-242.188f, +27.3438f,8.3446f,-242.188f, +31.25f,7.50857f,-242.188f, +35.1563f,7.64026f,-242.188f, +39.0625f,7.75851f,-242.188f, +42.9688f,7.56672f,-242.188f, +46.875f,7.98994f,-242.188f, +50.7813f,9.62391f,-242.188f, +54.6875f,9.28711f,-242.188f, +58.5938f,10.3792f,-242.188f, +62.5f,11.2793f,-242.188f, +66.4063f,12.3048f,-242.188f, +70.3125f,13.5272f,-242.188f, +74.2188f,14.5101f,-242.188f, +78.125f,15.2091f,-242.188f, +82.0313f,15.9007f,-242.188f, +85.9375f,15.4601f,-242.188f, +89.8438f,14.5171f,-242.188f, +93.75f,14.2266f,-242.188f, +97.6563f,13.9558f,-242.188f, +101.563f,15.8234f,-242.188f, +105.469f,18.6741f,-242.188f, +109.375f,20.7296f,-242.188f, +113.281f,21.5353f,-242.188f, +117.188f,20.9821f,-242.188f, +121.094f,20.2232f,-242.188f, +125.0f,18.5423f,-242.188f, +128.906f,17.8591f,-242.188f, +132.813f,17.6716f,-242.188f, +136.719f,16.8982f,-242.188f, +140.625f,14.8574f,-242.188f, +144.531f,13.0736f,-242.188f, +148.438f,12.4847f,-242.188f, +152.344f,11.8101f,-242.188f, +156.25f,11.7863f,-242.188f, +160.156f,11.4288f,-242.188f, +164.063f,10.8653f,-242.188f, +167.969f,9.75951f,-242.188f, +171.875f,8.13212f,-242.188f, +175.781f,6.91851f,-242.188f, +179.688f,5.93418f,-242.188f, +183.594f,5.79732f,-242.188f, +187.5f,5.8082f,-242.188f, +191.406f,4.85116f,-242.188f, +195.313f,4.2744f,-242.188f, +199.219f,4.23009f,-242.188f, +203.125f,3.99841f,-242.188f, +207.031f,3.48205f,-242.188f, +210.938f,3.71102f,-242.188f, +214.844f,3.52803f,-242.188f, +218.75f,3.41263f,-242.188f, +222.656f,2.40768f,-242.188f, +226.563f,3.40111f,-242.188f, +230.469f,4.51594f,-242.188f, +234.375f,5.96131f,-242.188f, +238.281f,7.68646f,-242.188f, +242.188f,8.54536f,-242.188f, +246.094f,9.49379f,-242.188f, +250.0f,12.0532f,-242.188f, +3.90625f,6.09425f,-246.094f, +7.8125f,7.62532f,-246.094f, +11.7188f,8.33141f,-246.094f, +15.625f,8.6172f,-246.094f, +19.5313f,8.7607f,-246.094f, +23.4375f,7.89699f,-246.094f, +27.3438f,7.77868f,-246.094f, +31.25f,7.41037f,-246.094f, +35.1563f,6.57203f,-246.094f, +39.0625f,6.31554f,-246.094f, +42.9688f,7.72481f,-246.094f, +46.875f,8.88325f,-246.094f, +50.7813f,10.0433f,-246.094f, +54.6875f,10.7945f,-246.094f, +58.5938f,11.7506f,-246.094f, +62.5f,13.1397f,-246.094f, +66.4063f,13.1294f,-246.094f, +70.3125f,14.8885f,-246.094f, +74.2188f,15.5444f,-246.094f, +78.125f,16.4867f,-246.094f, +82.0313f,17.0601f,-246.094f, +85.9375f,17.2351f,-246.094f, +89.8438f,16.4292f,-246.094f, +93.75f,16.32f,-246.094f, +97.6563f,17.0323f,-246.094f, +101.563f,17.5524f,-246.094f, +105.469f,20.0544f,-246.094f, +109.375f,21.7596f,-246.094f, +113.281f,22.3401f,-246.094f, +117.188f,22.7891f,-246.094f, +121.094f,21.705f,-246.094f, +125.0f,20.4875f,-246.094f, +128.906f,19.3013f,-246.094f, +132.813f,18.5254f,-246.094f, +136.719f,17.4179f,-246.094f, +140.625f,14.7663f,-246.094f, +144.531f,13.8915f,-246.094f, +148.438f,12.0594f,-246.094f, +152.344f,11.8343f,-246.094f, +156.25f,12.3176f,-246.094f, +160.156f,12.7287f,-246.094f, +164.063f,10.9779f,-246.094f, +167.969f,10.1928f,-246.094f, +171.875f,8.20833f,-246.094f, +175.781f,7.71383f,-246.094f, +179.688f,7.59678f,-246.094f, +183.594f,6.98083f,-246.094f, +187.5f,6.81055f,-246.094f, +191.406f,6.13881f,-246.094f, +195.313f,4.42472f,-246.094f, +199.219f,3.97044f,-246.094f, +203.125f,4.06157f,-246.094f, +207.031f,3.73524f,-246.094f, +210.938f,4.45121f,-246.094f, +214.844f,3.42347f,-246.094f, +218.75f,2.70444f,-246.094f, +222.656f,3.88027f,-246.094f, +226.563f,4.53456f,-246.094f, +230.469f,5.69259f,-246.094f, +234.375f,6.23366f,-246.094f, +238.281f,7.38965f,-246.094f, +242.188f,8.96481f,-246.094f, +246.094f,10.9805f,-246.094f, +250.0f,13.0168f,-246.094f, +3.90625f,6.31953f,-250.0f, +7.8125f,6.89279f,-250.0f, +11.7188f,8.63362f,-250.0f, +15.625f,9.28278f,-250.0f, +19.5313f,9.05374f,-250.0f, +23.4375f,8.51295f,-250.0f, +27.3438f,8.2676f,-250.0f, +31.25f,7.86717f,-250.0f, +35.1563f,6.56073f,-250.0f, +39.0625f,6.77605f,-250.0f, +42.9688f,8.67577f,-250.0f, +46.875f,10.2384f,-250.0f, +50.7813f,11.5086f,-250.0f, +54.6875f,12.7259f,-250.0f, +58.5938f,14.4625f,-250.0f, +62.5f,15.7352f,-250.0f, +66.4063f,15.1953f,-250.0f, +70.3125f,16.1585f,-250.0f, +74.2188f,17.1058f,-250.0f, +78.125f,17.3014f,-250.0f, +82.0313f,18.6932f,-250.0f, +85.9375f,18.6138f,-250.0f, +89.8438f,18.0431f,-250.0f, +93.75f,18.293f,-250.0f, +97.6563f,18.5338f,-250.0f, +101.563f,18.8033f,-250.0f, +105.469f,22.2037f,-250.0f, +109.375f,24.04f,-250.0f, +113.281f,24.711f,-250.0f, +117.188f,24.2801f,-250.0f, +121.094f,23.1052f,-250.0f, +125.0f,21.9886f,-250.0f, +128.906f,21.2657f,-250.0f, +132.813f,19.5364f,-250.0f, +136.719f,18.5278f,-250.0f, +140.625f,15.9806f,-250.0f, +144.531f,14.8577f,-250.0f, +148.438f,13.3645f,-250.0f, +152.344f,12.8082f,-250.0f, +156.25f,13.3689f,-250.0f, +160.156f,12.7449f,-250.0f, +164.063f,11.1108f,-250.0f, +167.969f,9.59991f,-250.0f, +171.875f,8.88472f,-250.0f, +175.781f,8.39035f,-250.0f, +179.688f,7.9163f,-250.0f, +183.594f,7.4118f,-250.0f, +187.5f,6.98082f,-250.0f, +191.406f,7.20793f,-250.0f, +195.313f,6.19875f,-250.0f, +199.219f,4.05745f,-250.0f, +203.125f,4.65884f,-250.0f, +207.031f,3.75824f,-250.0f, +210.938f,4.17504f,-250.0f, +214.844f,4.37516f,-250.0f, +218.75f,4.69345f,-250.0f, +222.656f,5.87678f,-250.0f, +226.563f,6.28295f,-250.0f, +230.469f,7.2125f,-250.0f, +234.375f,7.55925f,-250.0f, +238.281f,7.93922f,-250.0f, +242.188f,9.87332f,-250.0f, +246.094f,11.5957f,-250.0f, +250.0f,13.3418f,-250.0f, +}; + +btScalar Landscape07Nml[] = { +0.163295f,0.951018f,0.262487f, +0.144468f,0.954269f,0.261724f, +0.284339f,0.929979f,0.233003f, +0.211332f,0.959058f,0.188537f, +0.433374f,0.893306f,0.11913f, +0.363648f,0.930033f,0.052906f, +0.467682f,0.883824f,-0.0113249f, +0.383618f,0.915858f,-0.118494f, +0.389479f,0.919494f,-0.0532637f, +0.409514f,0.907723f,-0.0913076f, +0.332107f,0.943241f,-0.00112667f, +0.268223f,0.935541f,-0.229827f, +0.254548f,0.967046f,-0.0051751f, +0.306606f,0.933957f,-0.183623f, +0.282468f,0.956486f,0.073117f, +0.352033f,0.935268f,0.0366899f, +0.28404f,0.958651f,0.0175868f, +0.303901f,0.947745f,0.0970751f, +0.36555f,0.930735f,0.0102418f, +0.393208f,0.907605f,0.147107f, +0.468517f,0.882377f,0.0436299f, +0.45621f,0.884295f,0.0994741f, +0.387946f,0.921329f,0.0254982f, +0.35572f,0.93034f,0.0890492f, +-0.0727074f,0.997226f,-0.0159048f, +0.0416391f,0.981376f,0.187527f, +-0.216733f,0.958137f,0.187084f, +-0.0894435f,0.917028f,0.388664f, +-0.0768893f,0.966885f,0.243356f, +-0.0850782f,0.918088f,0.387139f, +-0.0500426f,0.973558f,0.222893f, +-0.133165f,0.955198f,0.264319f, +-0.123001f,0.980349f,0.154228f, +-0.136539f,0.958129f,0.251685f, +-0.132627f,0.981796f,0.135965f, +-0.174651f,0.968606f,0.176918f, +-0.259357f,0.958248f,0.120395f, +-0.298496f,0.949786f,0.0938444f, +-0.287382f,0.955091f,0.0721996f, +-0.350088f,0.936687f,-0.00747904f, +-0.148232f,0.988935f,-0.00587251f, +-0.126386f,0.991686f,0.0242043f, +-0.0549856f,0.99804f,0.0298927f, +-0.061356f,0.998107f,0.00430538f, +-0.205447f,0.97828f,0.0275574f, +-0.222811f,0.974816f,-0.00939735f, +-0.192208f,0.981343f,0.00477232f, +-0.179009f,0.983825f,-0.00666687f, +-0.0670729f,0.997581f,0.0182672f, +-0.127994f,0.990724f,-0.0456448f, +-0.132352f,0.983294f,-0.124961f, +-0.16906f,0.976471f,-0.133875f, +0.0163433f,0.992538f,-0.120836f, +0.061026f,0.995929f,-0.0663405f, +0.133906f,0.98909f,-0.0613958f, +0.0943148f,0.983776f,-0.152607f, +0.150352f,0.985874f,-0.0738065f, +0.100217f,0.972528f,-0.210109f, +0.174622f,0.974275f,-0.142462f, +0.154561f,0.962801f,-0.221644f, +0.214773f,0.96191f,-0.169122f, +0.258606f,0.948184f,-0.184582f, +0.352689f,0.932616f,-0.0764078f, +0.422646f,0.906225f,0.0112396f, +0.443105f,0.890896f,-0.0998108f, +0.401063f,0.915401f,-0.0344995f, +0.415945f,0.889086f,-0.19109f, +0.396075f,0.910803f,-0.116459f, +0.504361f,0.849207f,-0.15642f, +0.465554f,0.866637f,-0.179442f, +0.527872f,0.824305f,-0.204628f, +0.465951f,0.840148f,-0.277561f, +0.474007f,0.822715f,-0.31378f, +0.361245f,0.837173f,-0.410663f, +0.405138f,0.793126f,-0.454769f, +0.304965f,0.772294f,-0.557277f, +0.421648f,0.811214f,-0.405148f, +0.482203f,0.762506f,-0.431353f, +0.478963f,0.817038f,-0.321005f, +0.485062f,0.781955f,-0.391486f, +0.478205f,0.82345f,-0.305368f, +0.426707f,0.781297f,-0.455518f, +0.428677f,0.841565f,-0.32864f, +0.430024f,0.798188f,-0.421871f, +0.423016f,0.835924f,-0.349699f, +0.437416f,0.818455f,-0.372557f, +0.461522f,0.813116f,-0.354739f, +0.446182f,0.808887f,-0.382915f, +0.507869f,0.791896f,-0.339072f, +0.474665f,0.780232f,-0.407346f, +0.494125f,0.792543f,-0.357373f, +0.430265f,0.769469f,-0.472006f, +0.389469f,0.809375f,-0.439574f, +0.38782f,0.781711f,-0.488389f, +0.349938f,0.837293f,-0.4201f, +0.417236f,0.816738f,-0.398564f, +0.440298f,0.822173f,-0.360789f, +0.490994f,0.819158f,-0.296487f, +0.379279f,0.852728f,-0.359169f, +0.3675f,0.860963f,-0.351692f, +0.122152f,0.892865f,-0.433442f, +0.135293f,0.922235f,-0.362185f, +0.188083f,0.883941f,-0.428104f, +0.194653f,0.9204f,-0.339078f, +0.200053f,0.870677f,-0.449332f, +0.149584f,0.899445f,-0.410639f, +0.170948f,0.845446f,-0.505962f, +0.0834541f,0.848059f,-0.523289f, +0.233208f,0.811352f,-0.536024f, +0.246347f,0.822898f,-0.512008f, +0.0429626f,0.875995f,-0.480403f, +0.171623f,0.870482f,-0.461311f, +-0.202408f,0.938053f,-0.281226f, +-0.0831604f,0.960463f,-0.265698f, +-0.312635f,0.912112f,-0.265162f, +-0.344362f,0.89728f,-0.276231f, +-0.0852182f,0.932714f,-0.350403f, +-0.156991f,0.922287f,-0.353185f, +0.0213728f,0.893503f,-0.448548f, +-0.0577934f,0.860578f,-0.506029f, +-0.0250381f,0.886654f,-0.461755f, +-0.0319956f,0.87749f,-0.478526f, +-0.0302913f,0.865602f,-0.499816f, +-0.00892741f,0.865625f,-0.500613f, +0.0556557f,0.906734f,-0.418015f, +0.137632f,0.905698f,-0.400959f, +0.0276894f,0.926625f,-0.374965f, +0.074566f,0.927887f,-0.365329f, +0.0588963f,0.991806f,0.113367f, +0.300045f,0.940314f,0.160571f, +0.505162f,0.858812f,0.0851652f, +0.523651f,0.851407f,0.0299276f, +0.336751f,0.940492f,0.0455315f, +0.231254f,0.960478f,0.15493f, +0.265257f,0.945144f,0.190637f, +0.327138f,0.941822f,0.0771526f, +0.406507f,0.912216f,-0.0511354f, +0.398687f,0.900126f,-0.17556f, +0.399875f,0.884983f,-0.238547f, +0.421808f,0.899838f,-0.11122f, +-0.041369f,0.987502f,-0.152078f, +-0.327111f,0.932019f,-0.156008f, +-0.143307f,0.985559f,-0.0902006f, +-0.0270205f,0.999466f,0.0183744f, +-0.0836031f,0.996473f,-0.00727851f, +-0.153499f,0.988141f,-0.00380883f, +-0.269657f,0.962702f,0.0221269f, +-0.220011f,0.975241f,-0.0223422f, +-0.104184f,0.990611f,-0.0885198f, +-0.112376f,0.99176f,-0.0615135f, +-0.176142f,0.984186f,-0.0187604f, +-0.211815f,0.974306f,-0.076572f, +-0.0254097f,0.999559f,-0.0153608f, +-0.0364109f,0.99734f,-0.0631393f, +-0.0203648f,0.999538f,-0.0225481f, +0.0549873f,0.998448f,0.00884961f, +0.169599f,0.985346f,0.0181241f, +0.253148f,0.96653f,-0.0416731f, +0.241207f,0.963047f,-0.119834f, +0.334221f,0.932038f,-0.140004f, +0.510774f,0.849501f,-0.132124f, +0.446103f,0.866333f,-0.224633f, +0.443332f,0.853241f,-0.274658f, +0.556199f,0.799442f,-0.227011f, +0.56349f,0.790862f,-0.238781f, +0.469847f,0.819465f,-0.32821f, +0.384148f,0.843359f,-0.375735f, +0.405196f,0.828658f,-0.386189f, +0.451519f,0.832227f,-0.321758f, +0.460293f,0.845627f,-0.27027f, +0.479361f,0.841341f,-0.249716f, +0.486527f,0.832565f,-0.264815f, +0.505678f,0.817374f,-0.276024f, +0.532701f,0.792427f,-0.297134f, +0.419998f,0.832504f,-0.361301f, +0.381252f,0.872209f,-0.306428f, +0.441269f,0.820876f,-0.362552f, +0.40003f,0.811169f,-0.426593f, +0.192925f,0.829083f,-0.524786f, +0.183969f,0.805942f,-0.562684f, +0.196671f,0.822252f,-0.534063f, +0.210296f,0.820946f,-0.530871f, +0.203797f,0.82129f,-0.532869f, +-0.110131f,0.879911f,-0.462199f, +-0.313522f,0.874849f,-0.369247f, +-0.225349f,0.894153f,-0.386922f, +-0.0425073f,0.90311f,-0.4273f, +0.0811921f,0.929959f,-0.358587f, +-0.0097083f,0.913772f,-0.406111f, +-0.0203212f,0.916094f,-0.400448f, +-0.0594319f,0.92652f,-0.371521f, +-0.0269889f,0.956838f,-0.289365f, +0.0349749f,0.98646f,-0.160231f, +0.256968f,0.956769f,-0.13624f, +0.548943f,0.832681f,-0.0728256f, +0.489119f,0.868806f,-0.0770563f, +0.299363f,0.954014f,0.0154449f, +0.150669f,0.988307f,0.0233966f, +0.338483f,0.938561f,0.0673226f, +0.470525f,0.880363f,-0.0597344f, +0.482272f,0.850276f,-0.210818f, +0.467725f,0.834993f,-0.289861f, +0.394888f,0.866151f,-0.306343f, +0.253937f,0.935832f,-0.244407f, +-0.00400266f,0.994244f,-0.107062f, +-0.309146f,0.937501f,-0.15975f, +-0.226806f,0.957844f,-0.176334f, +-0.122632f,0.982531f,-0.139981f, +-0.0635605f,0.992861f,-0.10093f, +-0.151586f,0.973622f,-0.170534f, +-0.231525f,0.948656f,-0.215516f, +-0.166237f,0.951792f,-0.257795f, +-0.0869197f,0.960928f,-0.262798f, +-0.164573f,0.950876f,-0.262203f, +-0.167249f,0.963013f,-0.211268f, +-0.211402f,0.954271f,-0.211366f, +-0.0642089f,0.988782f,-0.134861f, +-0.0696806f,0.987799f,-0.139279f, +-0.124243f,0.98904f,-0.0797755f, +0.0962393f,0.995288f,-0.0118021f, +0.210783f,0.972894f,-0.0951158f, +0.297355f,0.950074f,-0.0945467f, +0.301001f,0.949737f,-0.0860135f, +0.352321f,0.929179f,-0.111785f, +0.488103f,0.867307f,-0.0976422f, +0.556803f,0.828121f,-0.0646904f, +0.522997f,0.817722f,-0.240427f, +0.526158f,0.791225f,-0.311642f, +0.539548f,0.783883f,-0.30727f, +0.519736f,0.798926f,-0.302643f, +0.456854f,0.816569f,-0.352845f, +0.429557f,0.807438f,-0.404381f, +0.403588f,0.823842f,-0.397997f, +0.363835f,0.833866f,-0.415079f, +0.411515f,0.83345f,-0.368804f, +0.472303f,0.812756f,-0.341113f, +0.520866f,0.78709f,-0.330436f, +0.571303f,0.758641f,-0.313172f, +0.364947f,0.85616f,-0.365791f, +0.334117f,0.892356f,-0.303424f, +0.531373f,0.790182f,-0.305376f, +0.490437f,0.768139f,-0.411624f, +0.28549f,0.798709f,-0.529679f, +0.166173f,0.802828f,-0.572585f, +0.142862f,0.826392f,-0.544671f, +0.199443f,0.816751f,-0.541424f, +0.128075f,0.851947f,-0.507724f, +-0.168704f,0.879688f,-0.444621f, +-0.244755f,0.842741f,-0.479461f, +-0.150804f,0.809643f,-0.567218f, +-0.142654f,0.804501f,-0.576565f, +-0.00468689f,0.885234f,-0.465123f, +-0.00403137f,0.903548f,-0.428468f, +-0.0506207f,0.931001f,-0.361489f, +-0.153442f,0.941817f,-0.299058f, +-0.162811f,0.972443f,-0.166875f, +0.109587f,0.934225f,-0.339431f, +0.212963f,0.908729f,-0.358967f, +0.490721f,0.837065f,-0.2419f, +0.423339f,0.87185f,-0.246298f, +0.265687f,0.948953f,-0.169996f, +0.19754f,0.959782f,-0.199488f, +0.295591f,0.918793f,-0.261622f, +0.531499f,0.826018f,-0.187622f, +0.59212f,0.773761f,-0.225139f, +0.430882f,0.823206f,-0.369692f, +0.346812f,0.896722f,-0.274977f, +0.157001f,0.944818f,-0.287523f, +-0.0770972f,0.974843f,-0.209133f, +-0.291803f,0.93708f,-0.191656f, +-0.196019f,0.961744f,-0.191378f, +-0.131765f,0.96396f,-0.231124f, +-0.0745388f,0.982069f,-0.173159f, +0.00914064f,0.98959f,-0.143621f, +-0.138284f,0.94748f,-0.288373f, +-0.221669f,0.91917f,-0.325561f, +-0.129149f,0.970549f,-0.203358f, +-0.130482f,0.980721f,-0.145466f, +-0.176902f,0.951987f,-0.249854f, +-0.247465f,0.916992f,-0.31287f, +-0.158128f,0.953184f,-0.25775f, +-0.0356987f,0.985511f,-0.165812f, +-0.125849f,0.96636f,-0.224301f, +0.0681695f,0.96619f,-0.248655f, +0.227225f,0.953018f,-0.200315f, +0.225952f,0.967572f,-0.112919f, +0.287704f,0.957355f,-0.0264129f, +0.36102f,0.928385f,-0.0881278f, +0.475672f,0.87145f,-0.119627f, +0.569214f,0.81507f,-0.107964f, +0.623663f,0.769908f,-0.13523f, +0.603105f,0.773542f,-0.19467f, +0.556766f,0.776509f,-0.295034f, +0.523993f,0.789717f,-0.319025f, +0.458736f,0.810878f,-0.36337f, +0.42608f,0.838013f,-0.340867f, +0.413816f,0.852215f,-0.320134f, +0.428047f,0.839676f,-0.334247f, +0.440545f,0.806668f,-0.393963f, +0.471664f,0.754066f,-0.457075f, +0.438131f,0.75533f,-0.487358f, +0.513035f,0.778713f,-0.361111f, +0.362236f,0.865985f,-0.344753f, +0.319311f,0.872794f,-0.36915f, +0.546544f,0.761872f,-0.347621f, +0.587841f,0.74763f,-0.309017f, +0.346001f,0.792234f,-0.502642f, +0.160837f,0.807416f,-0.567637f, +0.137348f,0.82025f,-0.555271f, +0.177955f,0.827144f,-0.533071f, +0.0951091f,0.870125f,-0.483567f, +-0.154432f,0.835911f,-0.526691f, +-0.124368f,0.808763f,-0.574834f, +-0.126819f,0.782715f,-0.609323f, +-0.137751f,0.811099f,-0.568456f, +-0.111652f,0.799108f,-0.590729f, +-0.083265f,0.829705f,-0.551957f, +-0.187386f,0.858237f,-0.477825f, +-0.293723f,0.918982f,-0.263055f, +-0.393626f,0.913021f,-0.107009f, +0.212209f,0.950224f,-0.228125f, +0.209499f,0.936607f,-0.280851f, +0.442676f,0.872148f,-0.208317f, +0.471617f,0.857429f,-0.205893f, +0.203873f,0.890799f,-0.406094f, +0.238352f,0.874506f,-0.422408f, +0.316589f,0.834877f,-0.45028f, +0.439788f,0.802413f,-0.403384f, +0.591147f,0.75018f,-0.29627f, +0.446858f,0.837414f,-0.314732f, +0.297014f,0.892204f,-0.340228f, +0.174626f,0.914769f,-0.364286f, +-0.105816f,0.915255f,-0.388731f, +-0.264967f,0.884964f,-0.382925f, +-0.17731f,0.909999f,-0.374785f, +-0.129483f,0.910653f,-0.39236f, +-0.183919f,0.912509f,-0.365379f, +-0.0547605f,0.971103f,-0.232295f, +-0.0329197f,0.988161f,-0.149845f, +-0.283679f,0.94023f,-0.188398f, +-0.271484f,0.961222f,-0.0484715f, +-0.126156f,0.992006f,-0.00297784f, +-0.0077445f,0.99412f,-0.10801f, +-0.122479f,0.952558f,-0.278626f, +-0.22816f,0.898995f,-0.373834f, +-0.116624f,0.94701f,-0.299285f, +-0.0338322f,0.962019f,-0.270876f, +0.0643125f,0.93366f,-0.352339f, +0.108033f,0.951056f,-0.28952f, +0.0914872f,0.981979f,-0.165373f, +0.260441f,0.963994f,-0.0537291f, +0.448443f,0.892711f,-0.0443492f, +0.523825f,0.846692f,-0.0933822f, +0.566469f,0.810587f,-0.148532f, +0.615421f,0.777098f,-0.131818f, +0.641634f,0.7586f,-0.11328f, +0.626845f,0.758026f,-0.180172f, +0.575952f,0.768546f,-0.278596f, +0.455289f,0.793648f,-0.403527f, +0.401888f,0.827012f,-0.393113f, +0.390072f,0.829628f,-0.399451f, +0.432707f,0.817098f,-0.380939f, +0.498394f,0.785084f,-0.367759f, +0.54453f,0.759415f,-0.356056f, +0.443321f,0.820621f,-0.360621f, +0.413861f,0.828476f,-0.377289f, +0.394054f,0.852433f,-0.343626f, +0.354186f,0.831754f,-0.427477f, +0.501406f,0.754246f,-0.423916f, +0.58911f,0.726277f,-0.354219f, +0.489087f,0.757568f,-0.432301f, +0.219144f,0.803913f,-0.552901f, +0.0950257f,0.808184f,-0.581213f, +0.0824554f,0.830823f,-0.550395f, +0.0933748f,0.860985f,-0.499987f, +-0.0248456f,0.850125f,-0.525994f, +-0.102917f,0.824622f,-0.556243f, +-0.137975f,0.843048f,-0.519839f, +-0.191841f,0.811585f,-0.551839f, +-0.0960986f,0.833755f,-0.543707f, +-0.122745f,0.850064f,-0.512177f, +-0.326981f,0.870361f,-0.368177f, +-0.538824f,0.830097f,-0.143558f, +-0.554748f,0.831168f,0.0375988f, +0.183636f,0.945911f,-0.267453f, +0.248003f,0.941284f,-0.229083f, +0.367193f,0.90606f,-0.210295f, +0.559963f,0.826078f,-0.0635307f, +0.486301f,0.848236f,-0.209779f, +0.313552f,0.830527f,-0.460336f, +0.26103f,0.794184f,-0.548758f, +0.384376f,0.78311f,-0.488869f, +0.479781f,0.77201f,-0.416905f, +0.481011f,0.825397f,-0.295547f, +0.281884f,0.886831f,-0.366158f, +0.202383f,0.940438f,-0.273162f, +-0.0238314f,0.938511f,-0.344426f, +-0.257973f,0.859678f,-0.440913f, +-0.194719f,0.873936f,-0.445332f, +-0.0838372f,0.877697f,-0.471825f, +-0.223876f,0.839024f,-0.495901f, +-0.216019f,0.888182f,-0.405548f, +-0.127765f,0.960438f,-0.247457f, +-0.306436f,0.940762f,-0.145138f, +-0.327317f,0.939981f,-0.096429f, +-0.0557083f,0.990847f,-0.122959f, +0.0995056f,0.975129f,-0.198043f, +0.0247654f,0.966343f,-0.256062f, +-0.1694f,0.916546f,-0.362281f, +-0.197841f,0.908709f,-0.367568f, +-0.0185126f,0.95561f,-0.294052f, +0.0824185f,0.951583f,-0.296138f, +0.0241627f,0.96387f,-0.265277f, +0.0355962f,0.964767f,-0.260688f, +0.155357f,0.948871f,-0.274788f, +0.403654f,0.905713f,-0.129414f, +0.540931f,0.838513f,-0.0654957f, +0.603296f,0.79305f,-0.0842943f, +0.615316f,0.778563f,-0.123395f, +0.650635f,0.750663f,-0.114799f, +0.681129f,0.712532f,-0.16841f, +0.640077f,0.706799f,-0.301225f, +0.501905f,0.776085f,-0.381816f, +0.395956f,0.833034f,-0.386359f, +0.40448f,0.824611f,-0.39549f, +0.410354f,0.816219f,-0.406689f, +0.470853f,0.807605f,-0.355065f, +0.489936f,0.812779f,-0.315203f, +0.459069f,0.843316f,-0.279417f, +0.469145f,0.829489f,-0.303069f, +0.440235f,0.819159f,-0.367657f, +0.420347f,0.792019f,-0.442734f, +0.528602f,0.735131f,-0.424456f, +0.540602f,0.708419f,-0.453752f, +0.493287f,0.777492f,-0.390095f, +0.304413f,0.86604f,-0.396619f, +0.0820709f,0.870144f,-0.485916f, +0.0884612f,0.883073f,-0.460823f, +0.0898563f,0.860973f,-0.500651f, +-0.0421635f,0.844727f,-0.533535f, +-0.161922f,0.847271f,-0.505878f, +-0.14449f,0.888235f,-0.436074f, +-0.171293f,0.877903f,-0.447153f, +-0.137238f,0.90321f,-0.406666f, +-0.254069f,0.918554f,-0.302831f, +-0.505168f,0.843216f,-0.183829f, +-0.675277f,0.734237f,-0.069976f, +-0.653992f,0.755215f,0.0440947f, +0.0555085f,0.890635f,-0.451319f, +0.137334f,0.909799f,-0.39167f, +0.308301f,0.903589f,-0.297451f, +0.471952f,0.852104f,-0.226231f, +0.566013f,0.811602f,-0.144679f, +0.544915f,0.811135f,-0.212433f, +0.36963f,0.829124f,-0.419437f, +0.344038f,0.821377f,-0.454948f, +0.421617f,0.811326f,-0.404955f, +0.42674f,0.823996f,-0.372724f, +0.214619f,0.881696f,-0.42018f, +0.0910032f,0.951585f,-0.293606f, +0.0846967f,0.975495f,-0.203065f, +-0.12731f,0.949549f,-0.286616f, +-0.203708f,0.900619f,-0.383912f, +-0.0136138f,0.94578f,-0.324521f, +-0.1774f,0.907831f,-0.379963f, +-0.319591f,0.828051f,-0.460644f, +-0.309551f,0.868477f,-0.387202f, +-0.350068f,0.908991f,-0.226245f, +-0.314996f,0.908797f,-0.273615f, +-0.0601423f,0.962735f,-0.263674f, +0.136393f,0.973573f,-0.183175f, +0.0532739f,0.976623f,-0.208255f, +-0.105007f,0.973025f,-0.205419f, +-0.20872f,0.948662f,-0.237649f, +-0.0905915f,0.950284f,-0.297915f, +0.0475864f,0.961005f,-0.272405f, +0.0362517f,0.97079f,-0.237174f, +0.105725f,0.948531f,-0.298516f, +0.162566f,0.915122f,-0.368949f, +0.273546f,0.895769f,-0.350385f, +0.484941f,0.844255f,-0.228179f, +0.616479f,0.776457f,-0.130645f, +0.628311f,0.758456f,-0.173119f, +0.646758f,0.730427f,-0.2195f, +0.713832f,0.657703f,-0.240564f, +0.670883f,0.685042f,-0.283959f, +0.484582f,0.813502f,-0.32155f, +0.374759f,0.869215f,-0.322522f, +0.442437f,0.844514f,-0.301738f, +0.417442f,0.841211f,-0.343666f, +0.423405f,0.844004f,-0.329219f, +0.51768f,0.821209f,-0.240049f, +0.452859f,0.851327f,-0.264878f, +0.509187f,0.825405f,-0.243796f, +0.514747f,0.798114f,-0.313129f, +0.470791f,0.788824f,-0.395111f, +0.531455f,0.747848f,-0.397843f, +0.533283f,0.783064f,-0.32003f, +0.426956f,0.884256f,-0.18921f, +0.350467f,0.920762f,-0.171379f, +0.166727f,0.944055f,-0.284537f, +0.0641204f,0.940994f,-0.332292f, +0.176576f,0.941646f,-0.286573f, +0.033479f,0.945913f,-0.322688f, +-0.166217f,0.885456f,-0.433982f, +-0.211415f,0.849321f,-0.483692f, +-0.245686f,0.873508f,-0.420264f, +-0.318583f,0.913339f,-0.253606f, +-0.37482f,0.927017f,-0.0122188f, +-0.519112f,0.853899f,0.0371293f, +-0.674751f,0.732141f,-0.0931649f, +-0.717847f,0.685588f,-0.121095f, +0.129526f,0.933398f,-0.33465f, +0.109756f,0.909727f,-0.400439f, +0.235187f,0.88528f,-0.401206f, +0.43527f,0.839228f,-0.32594f, +0.509145f,0.799028f,-0.319883f, +0.559944f,0.774395f,-0.294577f, +0.481154f,0.808934f,-0.337812f, +0.346903f,0.826321f,-0.443681f, +0.419785f,0.810323f,-0.408849f, +0.424579f,0.803602f,-0.417081f, +0.213763f,0.882039f,-0.419896f, +-0.065439f,0.903315f,-0.423958f, +-0.0365788f,0.953894f,-0.297908f, +-0.052968f,0.984136f,-0.169324f, +-0.178873f,0.950393f,-0.254476f, +-0.13588f,0.955299f,-0.262566f, +-0.0549577f,0.986053f,-0.157096f, +-0.250853f,0.921347f,-0.296972f, +-0.383387f,0.86801f,-0.31555f, +-0.39517f,0.874494f,-0.281248f, +-0.297344f,0.903399f,-0.308961f, +-0.146671f,0.942034f,-0.301762f, +0.0292749f,0.969498f,-0.243343f, +0.0315554f,0.994938f,-0.0954108f, +-0.135353f,0.99076f,0.00864549f, +-0.109362f,0.993969f,-0.00807889f, +0.00178341f,0.978683f,-0.205368f, +0.0583577f,0.951175f,-0.303086f, +0.0448944f,0.938747f,-0.341671f, +0.135893f,0.935013f,-0.327543f, +0.248098f,0.92828f,-0.277025f, +0.287291f,0.872499f,-0.395234f, +0.360517f,0.825037f,-0.435134f, +0.531263f,0.786524f,-0.314864f, +0.667801f,0.716872f,-0.200342f, +0.67932f,0.687853f,-0.2557f, +0.702261f,0.671608f,-0.236161f, +0.672702f,0.722764f,-0.15838f, +0.529805f,0.828764f,-0.180158f, +0.396956f,0.86756f,-0.29961f, +0.439447f,0.830334f,-0.342683f, +0.431898f,0.838796f,-0.33149f, +0.414335f,0.865026f,-0.282941f, +0.433505f,0.865399f,-0.251314f, +0.473777f,0.866492f,-0.157252f, +0.513796f,0.828002f,-0.224559f, +0.584841f,0.771201f,-0.251417f, +0.518412f,0.788719f,-0.330412f, +0.507007f,0.831445f,-0.227253f, +0.414775f,0.908203f,-0.0559478f, +0.370241f,0.92627f,0.07033f, +0.386742f,0.919823f,0.0659988f, +0.294152f,0.955333f,0.0285335f, +0.1108f,0.9849f,-0.133022f, +0.118551f,0.967697f,-0.222506f, +0.0772752f,0.978981f,-0.188747f, +-0.0200413f,0.97522f,-0.220327f, +-0.18076f,0.942791f,-0.280125f, +-0.356914f,0.914544f,-0.190318f, +-0.511643f,0.854464f,-0.0900754f, +-0.529301f,0.843485f,0.0915077f, +-0.481356f,0.855106f,0.192586f, +-0.566596f,0.818312f,0.0966086f, +-0.682392f,0.727753f,-0.0686784f, +0.232504f,0.952167f,-0.198291f, +0.256414f,0.932781f,-0.253323f, +0.252094f,0.888895f,-0.38251f, +0.391259f,0.847753f,-0.358095f, +0.537533f,0.80784f,-0.241771f, +0.561137f,0.803605f,-0.198354f, +0.542606f,0.822395f,-0.171013f, +0.447025f,0.853524f,-0.267703f, +0.421457f,0.829331f,-0.366857f, +0.381949f,0.841011f,-0.383165f, +0.196905f,0.918187f,-0.343745f, +-0.0750719f,0.92165f,-0.380691f, +-0.176435f,0.915143f,-0.362469f, +-0.162121f,0.952528f,-0.257698f, +-0.094717f,0.979068f,-0.180149f, +-0.167752f,0.965606f,-0.198655f, +-0.133367f,0.985758f,-0.102438f, +-0.176519f,0.982527f,-0.0590077f, +-0.382392f,0.914243f,-0.133925f, +-0.379354f,0.898635f,-0.220329f, +-0.2745f,0.907747f,-0.317246f, +-0.107475f,0.924008f,-0.366959f, +-0.0783766f,0.915897f,-0.393688f, +-0.161723f,0.964079f,-0.210708f, +-0.213776f,0.971922f,-0.0983248f, +0.0126393f,0.993361f,-0.114343f, +0.146279f,0.956353f,-0.252963f, +0.181548f,0.939791f,-0.289541f, +0.0719106f,0.91394f,-0.399427f, +0.0405362f,0.92481f,-0.378262f, +0.227996f,0.9289f,-0.291825f, +0.430007f,0.847434f,-0.311368f, +0.444003f,0.803436f,-0.396676f, +0.425815f,0.77314f,-0.470039f, +0.591393f,0.731624f,-0.339089f, +0.68448f,0.684033f,-0.252165f, +0.663878f,0.696032f,-0.273504f, +0.62681f,0.752096f,-0.203619f, +0.578478f,0.810023f,-0.0960529f, +0.535256f,0.829774f,-0.158038f, +0.488949f,0.817442f,-0.304496f, +0.370902f,0.857519f,-0.356501f, +0.349699f,0.870975f,-0.345126f, +0.374514f,0.863134f,-0.338731f, +0.45144f,0.856074f,-0.251673f, +0.565254f,0.789722f,-0.238384f, +0.610208f,0.775791f,-0.160605f, +0.460354f,0.88479f,-0.0722568f, +0.360414f,0.930663f,0.0629891f, +0.310809f,0.940565f,0.136874f, +0.344153f,0.923997f,0.166701f, +0.371378f,0.913473f,0.166271f, +0.349168f,0.916329f,0.196019f, +0.310264f,0.946182f,0.0920588f, +0.219218f,0.972739f,-0.075642f, +0.0579784f,0.994476f,-0.087501f, +-0.0556996f,0.997544f,-0.0424565f, +-0.239345f,0.970003f,0.0425244f, +-0.461388f,0.876311f,0.138566f, +-0.538726f,0.825514f,0.168229f, +-0.597717f,0.791468f,0.127721f, +-0.507215f,0.833365f,0.219627f, +-0.488959f,0.84151f,0.229738f, +-0.545304f,0.815937f,0.192066f, +0.227692f,0.931856f,-0.282489f, +0.297935f,0.90904f,-0.291343f, +0.353719f,0.876832f,-0.325652f, +0.346915f,0.865884f,-0.36041f, +0.409305f,0.867351f,-0.283145f, +0.519851f,0.844165f,-0.130922f, +0.531147f,0.844051f,-0.0738934f, +0.549452f,0.835136f,-0.0255055f, +0.519598f,0.847001f,-0.112281f, +0.416821f,0.899711f,-0.12954f, +0.213877f,0.961324f,-0.173531f, +-0.0327967f,0.969436f,-0.243141f, +-0.200151f,0.944585f,-0.26019f, +-0.261086f,0.940261f,-0.218503f, +-0.16617f,0.980036f,-0.109163f, +-0.211362f,0.973049f,-0.0922088f, +-0.262019f,0.96267f,-0.0679153f, +-0.172722f,0.984229f,0.0382049f, +-0.269464f,0.962867f,-0.0166155f, +-0.289017f,0.944015f,-0.159073f, +-0.146887f,0.958128f,-0.245795f, +-0.0700562f,0.951312f,-0.300164f, +-0.140619f,0.963564f,-0.227533f, +-0.278995f,0.930049f,-0.239105f, +-0.16269f,0.936868f,-0.309531f, +0.070144f,0.909561f,-0.409607f, +0.193776f,0.876857f,-0.43997f, +0.127038f,0.902686f,-0.411121f, +0.150617f,0.947884f,-0.280767f, +0.0386496f,0.919015f,-0.392324f, +0.208973f,0.868713f,-0.449075f, +0.403894f,0.796876f,-0.449287f, +0.495348f,0.781817f,-0.378673f, +0.489779f,0.764879f,-0.418421f, +0.499102f,0.742417f,-0.446893f, +0.648968f,0.690613f,-0.319208f, +0.677239f,0.687846f,-0.26118f, +0.512369f,0.799495f,-0.313506f, +0.465181f,0.863456f,-0.195064f, +0.589095f,0.803266f,-0.0879238f, +0.56026f,0.801619f,-0.208601f, +0.442292f,0.866151f,-0.232723f, +0.407485f,0.876049f,-0.257867f, +0.41887f,0.854839f,-0.306264f, +0.344336f,0.834896f,-0.429397f, +0.497957f,0.824163f,-0.269804f, +0.448098f,0.886678f,-0.114058f, +0.337837f,0.929162f,0.150081f, +0.341034f,0.908641f,0.240972f, +0.356163f,0.918925f,0.169481f, +0.332963f,0.932465f,0.140159f, +0.378366f,0.915215f,0.13864f, +0.366597f,0.926522f,0.0846395f, +0.364364f,0.925578f,0.102688f, +0.226565f,0.954799f,0.192424f, +0.0359845f,0.964557f,0.261408f, +-0.155471f,0.954274f,0.255321f, +-0.290268f,0.886689f,0.359898f, +-0.467017f,0.828082f,0.31012f, +-0.499403f,0.82291f,0.270953f, +-0.565258f,0.797609f,0.210482f, +-0.553063f,0.809532f,0.196925f, +-0.499446f,0.823964f,0.267652f, +-0.522286f,0.796771f,0.30393f, +0.282895f,0.896955f,-0.339766f, +0.328074f,0.870604f,-0.366628f, +0.343521f,0.854938f,-0.388683f, +0.333693f,0.867418f,-0.369101f, +0.350459f,0.883644f,-0.310405f, +0.440013f,0.868347f,-0.228826f, +0.488334f,0.85139f,-0.191483f, +0.49066f,0.852892f,-0.178404f, +0.509846f,0.855822f,-0.0873222f, +0.418823f,0.907869f,-0.0190138f, +0.288806f,0.957176f,-0.0201137f, +0.0497186f,0.992214f,-0.114191f, +-0.215841f,0.960205f,-0.177253f, +-0.338759f,0.933444f,-0.118004f, +-0.242696f,0.969321f,-0.0389388f, +-0.141909f,0.989578f,-0.0244358f, +-0.270493f,0.952883f,-0.137288f, +-0.235245f,0.967095f,-0.0968818f, +-0.186427f,0.979041f,-0.0819931f, +-0.181825f,0.962183f,-0.20284f, +-0.135402f,0.958028f,-0.252681f, +-0.153581f,0.96935f,-0.191767f, +-0.186528f,0.978878f,-0.0837011f, +-0.164286f,0.974581f,-0.152324f, +0.0119477f,0.951315f,-0.307988f, +0.181241f,0.876938f,-0.44512f, +0.193514f,0.837326f,-0.51131f, +-0.00806995f,0.853668f,-0.520756f, +0.0461085f,0.918292f,-0.393209f, +0.210027f,0.898011f,-0.386606f, +0.313179f,0.820953f,-0.477447f, +0.395672f,0.762863f,-0.511355f, +0.407119f,0.752829f,-0.517206f, +0.491283f,0.735772f,-0.466133f, +0.508563f,0.731088f,-0.454835f, +0.557969f,0.720001f,-0.412637f, +0.635268f,0.712821f,-0.297187f, +0.514275f,0.818992f,-0.254505f, +0.384017f,0.888427f,-0.251454f, +0.535431f,0.823023f,-0.189597f, +0.597396f,0.79853f,-0.0739445f, +0.435766f,0.897283f,-0.0706489f, +0.387025f,0.91478f,-0.115713f, +0.532369f,0.842082f,-0.0864959f, +0.42055f,0.882636f,-0.209979f, +0.370951f,0.912219f,-0.173928f, +0.309089f,0.948381f,-0.0709704f, +0.21321f,0.976943f,0.0111471f, +0.331446f,0.943237f,0.0211533f, +0.410945f,0.911483f,0.0179772f, +0.321726f,0.946051f,-0.0384626f, +0.397145f,0.917286f,0.0293659f, +0.411757f,0.908804f,0.0673213f, +0.22276f,0.971882f,0.0763077f, +0.069501f,0.964908f,0.253224f, +-0.028986f,0.93542f,0.352349f, +-0.1774f,0.888082f,0.424074f, +-0.313309f,0.830284f,0.460941f, +-0.375142f,0.83463f,0.403313f, +-0.455516f,0.824707f,0.335207f, +-0.516585f,0.80896f,0.280577f, +-0.560057f,0.80406f,0.199559f, +-0.56953f,0.792393f,0.218515f, +-0.567769f,0.776958f,0.271984f, +0.281384f,0.90217f,-0.326974f, +0.32181f,0.911348f,-0.256676f, +0.424167f,0.891125f,-0.16118f, +0.302129f,0.903121f,-0.305108f, +0.274213f,0.914554f,-0.297318f, +0.377666f,0.887315f,-0.264651f, +0.50458f,0.840574f,-0.197063f, +0.48044f,0.846134f,-0.230726f, +0.426379f,0.87586f,-0.225987f, +0.348305f,0.925694f,-0.147563f, +0.27972f,0.958581f,-0.053649f, +0.144728f,0.989215f,-0.0225097f, +-0.168728f,0.979072f,-0.113791f, +-0.360157f,0.915919f,-0.177143f, +-0.292774f,0.933287f,-0.207987f, +-0.10309f,0.983541f,-0.148387f, +-0.174215f,0.960869f,-0.215359f, +-0.250891f,0.918965f,-0.304233f, +-0.150246f,0.940005f,-0.306294f, +-0.0860686f,0.946791f,-0.310127f, +-0.15131f,0.934427f,-0.322415f, +-0.22276f,0.935306f,-0.27492f, +-0.201088f,0.949203f,-0.242028f, +-0.0437143f,0.949864f,-0.309592f, +0.109977f,0.887847f,-0.446802f, +0.297781f,0.833674f,-0.465096f, +0.214775f,0.818536f,-0.532795f, +0.0269455f,0.850361f,-0.52551f, +-0.017632f,0.796129f,-0.60487f, +0.185146f,0.781388f,-0.595948f, +0.323386f,0.740218f,-0.589491f, +0.406653f,0.707179f,-0.578387f, +0.409551f,0.698057f,-0.587354f, +0.432954f,0.696782f,-0.57188f, +0.429959f,0.722053f,-0.54201f, +0.513634f,0.737641f,-0.438254f, +0.557438f,0.766448f,-0.319093f, +0.451237f,0.872287f,-0.188415f, +0.398866f,0.907449f,-0.132071f, +0.479702f,0.868398f,-0.125579f, +0.492136f,0.869715f,0.0373829f, +0.490052f,0.864036f,0.115287f, +0.467195f,0.882543f,-0.0533554f, +0.500676f,0.860686f,-0.092427f, +0.467521f,0.883982f,0.000254135f, +0.346172f,0.935182f,-0.0748316f, +0.285844f,0.955101f,-0.0779434f, +0.233788f,0.970423f,-0.0601792f, +0.33578f,0.93567f,-0.108509f, +0.44843f,0.890103f,-0.0814045f, +0.344049f,0.926181f,-0.154332f, +0.278254f,0.949058f,-0.147866f, +0.299653f,0.954043f,0.00333978f, +0.154533f,0.964067f,0.21609f, +0.0182142f,0.948347f,0.316711f, +-0.116946f,0.954294f,0.275039f, +-0.30019f,0.894483f,0.33134f, +-0.320232f,0.867471f,0.380717f, +-0.340655f,0.881399f,0.327246f, +-0.432069f,0.860755f,0.269105f, +-0.470649f,0.851696f,0.23044f, +-0.520568f,0.837827f,0.164485f, +-0.594362f,0.792684f,0.135598f, +-0.629645f,0.760492f,0.15874f, +0.105475f,0.917668f,-0.383094f, +0.157333f,0.940076f,-0.302494f, +0.34936f,0.922619f,-0.163471f, +0.441147f,0.892415f,-0.0947875f, +0.353266f,0.911437f,-0.210916f, +0.379048f,0.861228f,-0.33854f, +0.442622f,0.833751f,-0.330068f, +0.481137f,0.838111f,-0.257053f, +0.418048f,0.882249f,-0.216499f, +0.270753f,0.936711f,-0.221958f, +0.184979f,0.961951f,-0.201082f, +0.112903f,0.979904f,-0.164442f, +-0.0774318f,0.983977f,-0.160602f, +-0.269214f,0.939575f,-0.211477f, +-0.244405f,0.926884f,-0.284872f, +-0.16522f,0.91825f,-0.359887f, +-0.0697709f,0.937892f,-0.339838f, +-0.121807f,0.888033f,-0.443351f, +-0.178259f,0.862094f,-0.474361f, +-0.173573f,0.911189f,-0.373641f, +-0.145335f,0.940854f,-0.30606f, +-0.196672f,0.897435f,-0.394881f, +-0.142648f,0.86312f,-0.484434f, +0.079713f,0.828378f,-0.554469f, +0.216417f,0.76965f,-0.600668f, +0.249468f,0.776353f,-0.578828f, +0.204058f,0.841867f,-0.499621f, +0.0644049f,0.826788f,-0.558814f, +0.116412f,0.767322f,-0.630607f, +0.208898f,0.705315f,-0.677416f, +0.323537f,0.664792f,-0.673332f, +0.378749f,0.668133f,-0.640428f, +0.350681f,0.681998f,-0.641795f, +0.388988f,0.701053f,-0.597673f, +0.366172f,0.724838f,-0.583548f, +0.331191f,0.791609f,-0.513486f, +0.441902f,0.864123f,-0.240861f, +0.365381f,0.918735f,-0.149742f, +0.346761f,0.932102f,-0.104611f, +0.441617f,0.896164f,-0.0431763f, +0.429069f,0.903098f,0.0177174f, +0.509493f,0.859732f,0.035759f, +0.550737f,0.834518f,-0.0163997f, +0.446836f,0.894607f,0.00385291f, +0.489488f,0.868437f,0.0788584f, +0.430014f,0.900385f,-0.0662903f, +0.277285f,0.953602f,-0.117285f, +0.208284f,0.969937f,-0.12586f, +0.377184f,0.918436f,-0.119197f, +0.417651f,0.892053f,-0.172653f, +0.381197f,0.917074f,-0.116891f, +0.274507f,0.95009f,-0.148238f, +0.0946799f,0.989623f,-0.108088f, +-0.059654f,0.986641f,0.151597f, +-0.0667871f,0.959734f,0.272857f, +-0.0714815f,0.942101f,0.327622f, +-0.300084f,0.906469f,0.297092f, +-0.336918f,0.914203f,0.225209f, +-0.288002f,0.930996f,0.224278f, +-0.416386f,0.886687f,0.201018f, +-0.454428f,0.859405f,0.234346f, +-0.478891f,0.849426f,0.221671f, +-0.583336f,0.801078f,0.13414f, +-0.664795f,0.744846f,0.0570272f, +0.0774054f,0.9409f,-0.329722f, +0.120466f,0.940242f,-0.318486f, +0.258377f,0.92069f,-0.292526f, +0.391172f,0.892344f,-0.225179f, +0.441921f,0.861239f,-0.250944f, +0.474164f,0.819484f,-0.321892f, +0.430001f,0.828794f,-0.358051f, +0.388327f,0.849227f,-0.357794f, +0.321794f,0.900086f,-0.293759f, +0.306798f,0.936469f,-0.170002f, +0.197413f,0.950888f,-0.238412f, +0.140677f,0.959941f,-0.242328f, +-0.0738732f,0.952166f,-0.296516f, +-0.264161f,0.917561f,-0.297155f, +-0.156821f,0.939785f,-0.303665f, +-0.074827f,0.921443f,-0.381239f, +-0.0597443f,0.912887f,-0.403816f, +-0.0722702f,0.937805f,-0.339556f, +-0.223343f,0.933173f,-0.281613f, +-0.284993f,0.906137f,-0.31256f, +-0.17102f,0.941557f,-0.290212f, +0.0188228f,0.955829f,-0.29332f, +0.0949729f,0.880183f,-0.465036f, +0.154174f,0.836833f,-0.525301f, +0.175395f,0.823625f,-0.539331f, +0.0906162f,0.806123f,-0.584769f, +0.167569f,0.848038f,-0.502744f, +0.206981f,0.812951f,-0.544306f, +0.220466f,0.75453f,-0.618126f, +0.281661f,0.74367f,-0.606318f, +0.323085f,0.773947f,-0.544631f, +0.389827f,0.796004f,-0.463047f, +0.409468f,0.784217f,-0.466197f, +0.383754f,0.755374f,-0.531172f, +0.333252f,0.782449f,-0.526039f, +0.13472f,0.877229f,-0.460782f, +0.220453f,0.931705f,-0.288664f, +0.346271f,0.928921f,-0.131156f, +0.317872f,0.942854f,-0.0999207f, +0.41364f,0.908959f,-0.0519229f, +0.398453f,0.915561f,-0.0546188f, +0.505703f,0.862625f,-0.0119489f, +0.526627f,0.849939f,0.0163649f, +0.402553f,0.915142f,0.0215902f, +0.486926f,0.872826f,0.0328415f, +0.480317f,0.876602f,0.0293992f, +0.350224f,0.935385f,0.0489656f, +0.241613f,0.961192f,-0.13317f, +0.388714f,0.905381f,-0.170843f, +0.410083f,0.900693f,-0.14347f, +0.356005f,0.930194f,-0.0894385f, +0.273996f,0.955273f,-0.111267f, +-0.044831f,0.997624f,-0.0523075f, +-0.196423f,0.976135f,0.0926162f, +-0.135564f,0.988784f,0.0626771f, +-0.172489f,0.970476f,0.168594f, +-0.254529f,0.9218f,0.292405f, +-0.284378f,0.936305f,0.206065f, +-0.327372f,0.917976f,0.223935f, +-0.435353f,0.844597f,0.311647f, +-0.503149f,0.802852f,0.319796f, +-0.41775f,0.811758f,0.408086f, +-0.454925f,0.830308f,0.321918f, +-0.572823f,0.802298f,0.167904f, +0.20617f,0.937765f,-0.279448f, +0.12824f,0.920264f,-0.369687f, +0.239724f,0.89965f,-0.364914f, +0.406692f,0.839091f,-0.361286f, +0.450018f,0.81612f,-0.362535f, +0.486709f,0.828644f,-0.276522f, +0.440087f,0.85086f,-0.286985f, +0.416932f,0.85696f,-0.302962f, +0.239451f,0.901982f,-0.359293f, +0.202502f,0.927776f,-0.313409f, +0.221835f,0.941111f,-0.255147f, +0.127859f,0.963075f,-0.236935f, +0.0102396f,0.970361f,-0.241441f, +-0.185811f,0.907396f,-0.376969f, +-0.143f,0.87175f,-0.468618f, +-0.054802f,0.895065f,-0.442557f, +-0.153942f,0.908075f,-0.389489f, +-0.214862f,0.949277f,-0.22958f, +-0.226443f,0.961303f,-0.156909f, +-0.189142f,0.939849f,-0.284446f, +-0.183498f,0.904381f,-0.385258f, +0.0372666f,0.939229f,-0.341264f, +0.17942f,0.912891f,-0.366659f, +0.186987f,0.89504f,-0.404894f, +0.249987f,0.855827f,-0.452843f, +0.209164f,0.815071f,-0.540287f, +0.137636f,0.780743f,-0.609506f, +0.248264f,0.780183f,-0.574177f, +0.268876f,0.805155f,-0.528613f, +0.166884f,0.854291f,-0.492277f, +0.223895f,0.925944f,-0.304136f, +0.382591f,0.903499f,-0.193167f, +0.505015f,0.839819f,-0.199159f, +0.522375f,0.816711f,-0.245169f, +0.295143f,0.898426f,-0.32515f, +0.045309f,0.962545f,-0.26731f, +0.0698554f,0.972543f,-0.221991f, +0.23803f,0.966556f,-0.0954522f, +0.24345f,0.969904f,-0.00421011f, +0.387893f,0.915554f,0.106303f, +0.388608f,0.912695f,0.126382f, +0.452964f,0.880246f,0.141388f, +0.553021f,0.816379f,0.166411f, +0.46714f,0.881043f,0.0744546f, +0.450683f,0.892414f,0.0219511f, +0.444978f,0.886482f,0.127064f, +0.382178f,0.921652f,0.0670691f, +0.411319f,0.911388f,-0.0137033f, +0.389838f,0.919191f,-0.0558004f, +0.35617f,0.934375f,0.0092699f, +0.326889f,0.943423f,0.0556465f, +0.261297f,0.961477f,0.0853544f, +-0.107365f,0.988428f,0.107158f, +-0.198313f,0.974378f,0.106114f, +-0.119767f,0.989964f,0.0750203f, +-0.291683f,0.947022f,0.134427f, +-0.31644f,0.92799f,0.196723f, +-0.289311f,0.932636f,0.215615f, +-0.411791f,0.85345f,0.319455f, +-0.469106f,0.777331f,0.419161f, +-0.481552f,0.76826f,0.421765f, +-0.441444f,0.803246f,0.399904f, +-0.347505f,0.834501f,0.427607f, +-0.388172f,0.828163f,0.404313f, +0.166663f,0.855647f,-0.489991f, +0.206118f,0.852788f,-0.479863f, +0.253643f,0.809648f,-0.529278f, +0.34663f,0.798296f,-0.492515f, +0.334799f,0.852879f,-0.400633f, +0.411503f,0.867459f,-0.279608f, +0.469719f,0.846111f,-0.251912f, +0.425418f,0.857617f,-0.288986f, +0.321984f,0.890401f,-0.321733f, +0.13105f,0.897315f,-0.421487f, +0.163065f,0.944711f,-0.284482f, +0.0880681f,0.960841f,-0.262734f, +0.0835185f,0.96106f,-0.263417f, +-0.0250069f,0.943064f,-0.33167f, +-0.080502f,0.931121f,-0.355714f, +-0.129429f,0.916002f,-0.379721f, +-0.246145f,0.898013f,-0.36467f, +-0.295885f,0.891242f,-0.343715f, +-0.176282f,0.915144f,-0.362541f, +-0.0418985f,0.91018f,-0.412089f, +-0.0774111f,0.852502f,-0.51696f, +-0.0321668f,0.826692f,-0.561735f, +0.194406f,0.844754f,-0.498595f, +0.282885f,0.80862f,-0.515859f, +0.302949f,0.736294f,-0.605056f, +0.233445f,0.738314f,-0.632768f, +0.172128f,0.759349f,-0.627504f, +0.112225f,0.79134f,-0.600988f, +0.137255f,0.870359f,-0.472902f, +0.0541041f,0.935131f,-0.350147f, +0.048453f,0.960354f,-0.274541f, +0.350102f,0.918679f,-0.182913f, +0.524752f,0.830609f,-0.186344f, +0.518158f,0.835225f,-0.184147f, +0.313736f,0.944893f,-0.0935296f, +0.0308812f,0.997052f,-0.070238f, +0.048477f,0.985949f,-0.159858f, +0.14972f,0.972865f,-0.1764f, +0.155626f,0.983809f,-0.0888849f, +0.284416f,0.958659f,0.0089454f, +0.3659f,0.926807f,0.0845335f, +0.421454f,0.897257f,0.131556f, +0.563402f,0.804293f,0.188919f, +0.539736f,0.827553f,0.154408f, +0.404327f,0.91158f,0.0744378f, +0.452914f,0.883943f,0.116249f, +0.458215f,0.8862f,0.0684684f, +0.412404f,0.90336f,0.117745f, +0.337667f,0.93426f,0.114626f, +0.331072f,0.928113f,0.170285f, +0.265924f,0.943818f,0.196193f, +0.193837f,0.929607f,0.313462f, +-0.0688814f,0.919176f,0.387776f, +-0.142537f,0.930406f,0.33768f, +-0.12463f,0.963373f,0.237444f, +-0.336333f,0.924835f,0.17765f, +-0.311125f,0.930755f,0.192081f, +-0.359893f,0.911001f,0.201382f, +-0.532454f,0.800855f,0.274086f, +-0.552598f,0.767696f,0.324466f, +-0.457025f,0.795874f,0.39713f, +-0.406778f,0.834647f,0.371344f, +-0.39211f,0.844207f,0.365466f, +-0.407171f,0.83024f,0.380675f, +0.088004f,0.820624f,-0.564651f, +0.180508f,0.82686f,-0.532654f, +0.264125f,0.820464f,-0.507027f, +0.247967f,0.854234f,-0.456943f, +0.24322f,0.902001f,-0.356704f, +0.342999f,0.897422f,-0.277462f, +0.495739f,0.849894f,-0.178668f, +0.449958f,0.858561f,-0.245787f, +0.384562f,0.884942f,-0.262659f, +0.158931f,0.931299f,-0.327755f, +-0.00482349f,0.936712f,-0.350067f, +0.115045f,0.961792f,-0.248435f, +0.108639f,0.956333f,-0.271339f, +-0.0605962f,0.963938f,-0.259135f, +-0.116693f,0.974935f,-0.189434f, +-0.0876965f,0.975552f,-0.201512f, +-0.158272f,0.938607f,-0.30654f, +-0.195709f,0.870225f,-0.452113f, +-0.139804f,0.831767f,-0.537233f, +-0.0224753f,0.834621f,-0.550366f, +0.0691358f,0.82738f,-0.557371f, +0.021368f,0.778901f,-0.626782f, +0.103745f,0.763834f,-0.637021f, +0.295282f,0.754578f,-0.586021f, +0.391718f,0.767187f,-0.507919f, +0.243831f,0.78308f,-0.57213f, +0.0624167f,0.795727f,-0.60243f, +0.0157622f,0.882125f,-0.470752f, +-0.0549233f,0.922741f,-0.381487f, +-0.0376875f,0.97f,-0.240167f, +0.0506221f,0.974297f,-0.219507f, +0.328414f,0.911788f,-0.246548f, +0.524714f,0.832523f,-0.177709f, +0.470173f,0.873047f,-0.12933f, +0.188699f,0.978079f,-0.0880599f, +0.0393835f,0.999181f,-0.00932192f, +0.202516f,0.978334f,-0.0430044f, +0.188361f,0.964087f,-0.187232f, +0.0636833f,0.962187f,-0.264841f, +0.180234f,0.965248f,-0.18924f, +0.346543f,0.937198f,-0.0395955f, +0.331037f,0.942573f,-0.0443968f, +0.504726f,0.851052f,0.144785f, +0.565376f,0.80039f,0.199312f, +0.492317f,0.859822f,0.135391f, +0.448961f,0.892857f,0.0352157f, +0.367625f,0.92412f,0.104186f, +0.329385f,0.906428f,0.264373f, +0.348699f,0.881448f,0.318526f, +0.290794f,0.899496f,0.326107f, +0.185082f,0.919339f,0.347219f, +0.0676347f,0.907778f,0.413962f, +-0.145808f,0.884054f,0.444059f, +-0.0815232f,0.884669f,0.459037f, +0.0810938f,0.898461f,0.431499f, +-0.248842f,0.934053f,0.256168f, +-0.367995f,0.892045f,0.262364f, +-0.356163f,0.871443f,0.337246f, +-0.546503f,0.805165f,0.230312f, +-0.590616f,0.793807f,0.145063f, +-0.541291f,0.82267f,0.173836f, +-0.431572f,0.851071f,0.299038f, +-0.381298f,0.858781f,0.342208f, +-0.443875f,0.85724f,0.260987f, +0.118157f,0.850415f,-0.512673f, +0.134653f,0.857894f,-0.49587f, +0.229214f,0.896945f,-0.378087f, +0.208074f,0.910502f,-0.35734f, +0.182505f,0.899208f,-0.397639f, +0.219865f,0.895989f,-0.385828f, +0.451196f,0.865461f,-0.217713f, +0.490084f,0.844039f,-0.217752f, +0.378309f,0.899823f,-0.217259f, +0.231483f,0.942802f,-0.239876f, +0.0439163f,0.94313f,-0.329511f, +0.0365981f,0.93055f,-0.364332f, +0.0406622f,0.963235f,-0.265566f, +-0.0474005f,0.988537f,-0.143342f, +-0.135564f,0.953464f,-0.269312f, +-0.0159099f,0.95648f,-0.291363f, +6.71815e-006f,0.933398f,-0.358843f, +-0.0477574f,0.880875f,-0.470933f, +-0.0515582f,0.822668f,-0.56618f, +0.00280332f,0.78244f,-0.62272f, +0.0365076f,0.790824f,-0.610954f, +0.0809221f,0.832084f,-0.548715f, +0.112086f,0.801748f,-0.587057f, +0.219407f,0.814817f,-0.536594f, +0.31647f,0.811557f,-0.491143f, +0.326532f,0.816359f,-0.476376f, +0.0311646f,0.874097f,-0.484751f, +-0.166146f,0.898216f,-0.406943f, +-0.145486f,0.939877f,-0.308975f, +-0.113562f,0.952885f,-0.281273f, +0.0633693f,0.957888f,-0.280063f, +0.322061f,0.911056f,-0.257398f, +0.438519f,0.889327f,-0.12961f, +0.430695f,0.901938f,0.0317863f, +0.232727f,0.970972f,0.0552405f, +0.0388751f,0.995464f,-0.0868351f, +0.197289f,0.970749f,-0.136837f, +0.308804f,0.945817f,-0.100347f, +0.177873f,0.966831f,-0.183299f, +0.0327621f,0.970738f,-0.237896f, +0.244781f,0.968393f,-0.0479323f, +0.27827f,0.960269f,-0.0211936f, +0.355239f,0.931705f,0.0757045f, +0.555707f,0.816071f,0.158801f, +0.563884f,0.814994f,0.133487f, +0.420142f,0.89843f,0.127685f, +0.31027f,0.90429f,0.293243f, +0.233723f,0.926208f,0.295826f, +0.272016f,0.906457f,0.323021f, +0.267428f,0.881549f,0.389042f, +0.161017f,0.891985f,0.422417f, +0.0459966f,0.878435f,0.475642f, +-0.0917474f,0.877231f,0.47122f, +-0.0819927f,0.91503f,0.394964f, +0.108269f,0.907964f,0.40482f, +-0.16221f,0.904236f,0.395026f, +-0.422279f,0.840786f,0.338761f, +-0.374364f,0.835182f,0.402893f, +-0.384829f,0.826017f,0.411828f, +-0.512379f,0.829197f,0.223383f, +-0.585197f,0.801652f,0.122056f, +-0.526709f,0.831787f,0.175237f, +-0.374079f,0.907515f,0.191003f, +-0.329797f,0.931547f,0.153144f, +0.105779f,0.878895f,-0.465138f, +0.0405535f,0.897741f,-0.438654f, +0.106545f,0.927041f,-0.359504f, +0.255352f,0.917446f,-0.305103f, +0.298997f,0.88918f,-0.346352f, +0.205215f,0.859845f,-0.467497f, +0.304244f,0.842016f,-0.445471f, +0.435228f,0.863678f,-0.254238f, +0.39753f,0.896082f,-0.197502f, +0.268558f,0.910516f,-0.314385f, +0.0970216f,0.931439f,-0.350727f, +0.0336528f,0.944013f,-0.328188f, +-0.0988412f,0.948055f,-0.302362f, +-0.0597673f,0.966409f,-0.249964f, +0.0558923f,0.934228f,-0.352269f, +-0.00489276f,0.88655f,-0.462606f, +0.0451038f,0.899627f,-0.434323f, +0.0627933f,0.870215f,-0.488654f, +0.0536848f,0.846805f,-0.529187f, +0.0729181f,0.867797f,-0.491539f, +-0.0450251f,0.86132f,-0.506063f, +0.0321391f,0.857039f,-0.514249f, +0.105366f,0.853869f,-0.509711f, +0.20021f,0.860626f,-0.468229f, +0.336826f,0.823703f,-0.456137f, +0.291163f,0.890761f,-0.348954f, +-0.0337704f,0.937324f,-0.34682f, +-0.238938f,0.893089f,-0.381184f, +-0.1654f,0.905926f,-0.389797f, +-0.0746684f,0.904792f,-0.419256f, +0.0731105f,0.895556f,-0.438901f, +0.199233f,0.902713f,-0.381334f, +0.277877f,0.941082f,-0.192742f, +0.300522f,0.95354f,-0.0211427f, +0.316945f,0.945681f,0.0723468f, +0.218722f,0.970853f,-0.0980014f, +0.256356f,0.93882f,-0.229999f, +0.242436f,0.93442f,-0.26093f, +0.1983f,0.960329f,-0.196077f, +0.00223103f,0.977894f,-0.209089f, +0.104164f,0.98625f,-0.128296f, +0.285507f,0.957716f,-0.0355725f, +0.283907f,0.956269f,-0.0703361f, +0.529334f,0.848145f,0.0213636f, +0.533064f,0.836918f,0.124145f, +0.319483f,0.916151f,0.242069f, +0.17728f,0.930248f,0.321263f, +0.27524f,0.891192f,0.360581f, +0.317681f,0.901882f,0.292724f, +0.194688f,0.951543f,0.23804f, +0.108971f,0.911619f,0.396329f, +-0.0300123f,0.895185f,0.444683f, +-0.0818392f,0.875146f,0.476887f, +-0.0034355f,0.872809f,0.48805f, +0.0854438f,0.889906f,0.448069f, +-0.143928f,0.891079f,0.430422f, +-0.400827f,0.846578f,0.350204f, +-0.436121f,0.820693f,0.369135f, +-0.389169f,0.817738f,0.42409f, +-0.354493f,0.838309f,0.414212f, +-0.495629f,0.825913f,0.268736f, +-0.491187f,0.862049f,0.124928f, +-0.360891f,0.926358f,0.107794f, +-0.272797f,0.945677f,0.17685f, +-0.0230447f,0.8982f,-0.438983f, +-0.0253824f,0.922509f,-0.38514f, +0.0868314f,0.93389f,-0.346856f, +0.228815f,0.908408f,-0.349913f, +0.325232f,0.887343f,-0.326875f, +0.342601f,0.877959f,-0.334385f, +0.256841f,0.884237f,-0.390073f, +0.281416f,0.889548f,-0.359874f, +0.383834f,0.865745f,-0.321181f, +0.3194f,0.893039f,-0.316962f, +0.102059f,0.965529f,-0.239452f, +-0.0466698f,0.958891f,-0.279912f, +-0.0536344f,0.964707f,-0.257804f, +-0.0261637f,0.940106f,-0.339875f, +0.144391f,0.948897f,-0.280616f, +0.0981473f,0.936323f,-0.337144f, +0.012852f,0.869861f,-0.493129f, +0.144402f,0.872896f,-0.466049f, +-0.00636809f,0.871363f,-0.490597f, +-0.0613187f,0.915967f,-0.396541f, +0.0199429f,0.949099f,-0.314346f, +0.0355652f,0.92816f,-0.370479f, +0.140076f,0.947915f,-0.286071f, +0.222188f,0.910114f,-0.349749f, +0.215543f,0.917499f,-0.33427f, +0.183013f,0.971215f,-0.152469f, +0.0390344f,0.988083f,-0.14889f, +-0.127226f,0.955382f,-0.266569f, +-0.116102f,0.92344f,-0.365757f, +-0.0309649f,0.920225f,-0.390164f, +0.00625843f,0.924708f,-0.380627f, +0.101949f,0.952725f,-0.286221f, +0.10526f,0.958946f,-0.263332f, +0.1589f,0.975537f,-0.151918f, +0.291601f,0.956292f,-0.0217678f, +0.33385f,0.942155f,0.0297851f, +0.349208f,0.937042f,0.00260008f, +0.278057f,0.953965f,-0.112407f, +0.149531f,0.968881f,-0.197256f, +-0.00612536f,0.988275f,-0.152563f, +-0.00797921f,0.994274f,-0.106558f, +0.301027f,0.953574f,-0.00894642f, +0.304582f,0.944145f,-0.125778f, +0.403446f,0.913254f,-0.0565483f, +0.37426f,0.908704f,0.184893f, +0.255667f,0.895707f,0.363791f, +0.219787f,0.909558f,0.352701f, +0.267099f,0.929513f,0.254289f, +0.378434f,0.885367f,0.270025f, +0.147409f,0.95291f,0.265015f, +-0.0634097f,0.932842f,0.354663f, +-0.0326192f,0.907501f,0.418782f, +-0.118713f,0.911859f,0.392963f, +-0.0609125f,0.902157f,0.427087f, +0.138333f,0.871993f,0.469567f, +-0.0649916f,0.904886f,0.420664f, +-0.383734f,0.861279f,0.333085f, +-0.474942f,0.817835f,0.324924f, +-0.422908f,0.836367f,0.348768f, +-0.339416f,0.853379f,0.395651f, +-0.324702f,0.875389f,0.358137f, +-0.41353f,0.899847f,0.138815f, +-0.448451f,0.884614f,0.12787f, +-0.414049f,0.866279f,0.279505f, +0.070634f,0.912028f,-0.404001f, +-0.0676482f,0.885638f,-0.459422f, +0.0565435f,0.906984f,-0.417353f, +0.246119f,0.879096f,-0.408185f, +0.292529f,0.859337f,-0.419485f, +0.280896f,0.904751f,-0.320192f, +0.320721f,0.917291f,-0.23604f, +0.350916f,0.874365f,-0.335178f, +0.376904f,0.866371f,-0.327636f, +0.17512f,0.962866f,-0.205478f, +0.0176642f,0.987314f,-0.157793f, +0.0227212f,0.982851f,-0.182998f, +0.0272561f,0.971904f,-0.233795f, +-0.0877209f,0.950392f,-0.298429f, +0.0166276f,0.994097f,-0.107211f, +0.266845f,0.962366f,-0.0514236f, +0.216132f,0.934464f,-0.282956f, +0.0993362f,0.906446f,-0.410472f, +-0.0104212f,0.924877f,-0.380123f, +-0.166185f,0.907878f,-0.384889f, +-0.0197905f,0.953108f,-0.301983f, +-0.0183125f,0.962192f,-0.271757f, +0.0845408f,0.976284f,-0.199307f, +0.269635f,0.943751f,-0.191394f, +0.189274f,0.968047f,-0.164501f, +0.102539f,0.979864f,-0.171327f, +0.106979f,0.970988f,-0.213865f, +-0.0373949f,0.962501f,-0.268688f, +-0.0919497f,0.957563f,-0.273163f, +-0.0692205f,0.979823f,-0.187497f, +-0.0661107f,0.993399f,-0.093741f, +0.0537161f,0.998551f,0.00311785f, +0.163558f,0.98647f,-0.0111964f, +0.128373f,0.980868f,-0.146347f, +0.126964f,0.974881f,-0.182993f, +0.228868f,0.973261f,0.0195364f, +0.336464f,0.933228f,0.126005f, +0.409696f,0.899435f,0.152205f, +0.227221f,0.973118f,0.0375761f, +-0.0400449f,0.999001f,-0.0198394f, +-0.0832424f,0.995769f,-0.0389306f, +0.262425f,0.963268f,0.0569854f, +0.380638f,0.919787f,0.0954299f, +0.267185f,0.959941f,0.0844166f, +0.200067f,0.945675f,0.256267f, +0.180437f,0.922348f,0.341639f, +0.274022f,0.906356f,0.321607f, +0.375587f,0.88639f,0.270641f, +0.289567f,0.933145f,0.213051f, +0.118001f,0.9078f,0.402461f, +-0.100351f,0.886215f,0.452275f, +-0.0321373f,0.879207f,0.475355f, +-0.064732f,0.903306f,0.424085f, +-0.117284f,0.933968f,0.337563f, +0.107835f,0.909874f,0.400625f, +-0.00684675f,0.915037f,0.403311f, +-0.3665f,0.879987f,0.302161f, +-0.484488f,0.825175f,0.290444f, +-0.455029f,0.825809f,0.33315f, +-0.355514f,0.861697f,0.362061f, +-0.249905f,0.90704f,0.338859f, +-0.283441f,0.915216f,0.286426f, +-0.489082f,0.840765f,0.232193f, +-0.566036f,0.779585f,0.26805f, +0.300059f,0.882066f,-0.363212f, +0.0511478f,0.860745f,-0.506461f, +0.0202137f,0.82997f,-0.557442f, +0.244641f,0.828925f,-0.503024f, +0.229733f,0.86489f,-0.446306f, +0.151553f,0.888421f,-0.433289f, +0.276054f,0.875076f,-0.397538f, +0.35746f,0.874812f,-0.326997f, +0.20869f,0.962246f,-0.174729f, +0.135202f,0.98952f,0.050694f, +0.0768682f,0.997036f,0.00329808f, +0.0854955f,0.992826f,-0.08359f, +0.0751533f,0.982531f,-0.170249f, +-0.0858423f,0.966447f,-0.242097f, +-0.101218f,0.962967f,-0.2499f, +0.245897f,0.943422f,-0.222463f, +0.411229f,0.896277f,-0.166064f, +0.160383f,0.921177f,-0.354556f, +0.0135902f,0.93936f,-0.342662f, +-0.185366f,0.907574f,-0.37676f, +-0.130182f,0.940725f,-0.313191f, +-0.0326676f,0.972591f,-0.230215f, +0.0675199f,0.972602f,-0.222457f, +0.233107f,0.94649f,-0.2232f, +0.212831f,0.95378f,-0.212148f, +0.167019f,0.9356f,-0.311059f, +0.16946f,0.90555f,-0.388925f, +-0.0763448f,0.914067f,-0.398312f, +-0.178349f,0.9565f,-0.230865f, +-0.221816f,0.964561f,-0.142896f, +-0.163528f,0.986246f,-0.0240246f, +-0.0459992f,0.998297f,0.0358721f, +0.192503f,0.971257f,0.140008f, +0.306262f,0.942491f,0.133843f, +0.166989f,0.985549f,-0.0284312f, +0.110164f,0.988175f,-0.106645f, +0.230491f,0.969982f,-0.0775155f, +0.320779f,0.937031f,0.138109f, +0.2844f,0.912116f,0.295231f, +0.0676957f,0.97278f,0.221621f, +-0.0445371f,0.996486f,0.0709375f, +0.140086f,0.988598f,0.0552233f, +0.294951f,0.934183f,0.200765f, +0.239076f,0.923996f,0.298453f, +0.115077f,0.947116f,0.299546f, +0.169084f,0.942486f,0.288323f, +0.304609f,0.90997f,0.281369f, +0.369662f,0.880322f,0.297294f, +0.206677f,0.906857f,0.36728f, +-0.0427609f,0.882729f,0.467933f, +-0.167345f,0.859324f,0.483279f, +-0.0302574f,0.860894f,0.507884f, +0.0910322f,0.886636f,0.453421f, +-0.0366606f,0.947171f,0.318627f, +0.025939f,0.94095f,0.337552f, +0.0591946f,0.91956f,0.388466f, +-0.284221f,0.911546f,0.297158f, +-0.532586f,0.813173f,0.234739f, +-0.487487f,0.825499f,0.284445f, +-0.31853f,0.893358f,0.316938f, +-0.238637f,0.92505f,0.295524f, +-0.265409f,0.911937f,0.312937f, +-0.505062f,0.827653f,0.244749f, +-0.589625f,0.757122f,0.281262f, +0.260545f,0.875981f,-0.405923f, +0.198469f,0.90372f,-0.379342f, +0.0608985f,0.867502f,-0.493691f, +0.108599f,0.877043f,-0.467977f, +0.149016f,0.918586f,-0.366053f, +0.269933f,0.909568f,-0.315946f, +0.225091f,0.894351f,-0.386613f, +0.14483f,0.975181f,-0.16747f, +0.0237141f,0.999718f,0.00125985f, +0.0312597f,0.997955f,0.0557504f, +0.105656f,0.993029f,0.0522575f, +0.205288f,0.977382f,0.0508146f, +0.175007f,0.977751f,-0.115656f, +0.0411408f,0.976103f,-0.213378f, +-0.0123853f,0.935985f,-0.351821f, +0.185506f,0.902134f,-0.38954f, +0.361594f,0.882471f,-0.300824f, +0.229178f,0.926898f,-0.297216f, +-0.016076f,0.953923f,-0.299621f, +-0.176229f,0.940869f,-0.289326f, +-0.197595f,0.933757f,-0.298419f, +-0.0925101f,0.952321f,-0.290735f, +0.0363018f,0.966473f,-0.254189f, +0.27059f,0.939141f,-0.211649f, +0.283887f,0.910685f,-0.300101f, +0.267987f,0.87929f,-0.39374f, +0.167837f,0.906306f,-0.387866f, +-0.162045f,0.958045f,-0.236411f, +-0.34242f,0.923851f,-0.171018f, +-0.280408f,0.954479f,-0.101693f, +-0.219474f,0.974995f,-0.0348799f, +-0.111179f,0.993643f,0.0176973f, +0.0791225f,0.990452f,0.112896f, +0.243665f,0.947394f,0.207537f, +0.282223f,0.914505f,0.289882f, +0.280685f,0.943977f,0.173563f, +0.165641f,0.985889f,-0.0242044f, +0.0702016f,0.994363f,0.0794649f, +0.118053f,0.960325f,0.252664f, +0.204772f,0.904931f,0.373051f, +0.0632983f,0.962848f,0.262521f, +0.122554f,0.958346f,0.257978f, +0.174517f,0.943136f,0.28291f, +0.181765f,0.923678f,0.337315f, +0.176745f,0.924152f,0.338681f, +0.201711f,0.945597f,0.255262f, +0.29766f,0.929054f,0.219676f, +0.268359f,0.928086f,0.258147f, +0.100906f,0.896734f,0.430912f, +-0.0388415f,0.876619f,0.479615f, +-0.130193f,0.899332f,0.417434f, +0.000668505f,0.914851f,0.403791f, +0.198601f,0.908384f,0.367961f, +0.0382447f,0.953766f,0.298106f, +-0.0134843f,0.968824f,0.247384f, +0.0247843f,0.964757f,0.261972f, +-0.214942f,0.928034f,0.304224f, +-0.51491f,0.834181f,0.197508f, +-0.514132f,0.845f,0.147116f, +-0.364403f,0.910649f,0.194754f, +-0.252308f,0.925047f,0.283953f, +-0.245043f,0.926077f,0.286941f, +-0.475784f,0.852889f,0.214964f, +-0.66621f,0.724577f,0.176499f, +0.0831836f,0.888999f,-0.45029f, +0.181271f,0.909397f,-0.374349f, +0.118635f,0.893305f,-0.433511f, +0.0803087f,0.896743f,-0.435204f, +0.0532614f,0.909245f,-0.41284f, +0.209897f,0.941844f,-0.262435f, +0.164344f,0.979747f,-0.114402f, +-0.0796744f,0.996148f,-0.0366233f, +-0.0133458f,0.996096f,0.0872637f, +0.0764545f,0.99532f,0.0590999f, +0.136206f,0.990597f,0.0128964f, +0.22076f,0.975032f,-0.0240476f, +0.302428f,0.952936f,-0.021205f, +0.123508f,0.990766f,-0.0559322f, +0.0598433f,0.996046f,-0.06566f, +0.217088f,0.972764f,-0.0812636f, +0.324106f,0.93941f,-0.111642f, +0.231973f,0.969426f,-0.0800149f, +-0.0239272f,0.988929f,-0.146448f, +-0.168479f,0.969286f,-0.179165f, +-0.198758f,0.9628f,-0.183064f, +-0.0847832f,0.988177f,-0.12774f, +-0.00304443f,0.993662f,-0.112364f, +0.297886f,0.949812f,-0.0955022f, +0.392699f,0.900627f,-0.186169f, +0.309254f,0.921444f,-0.235165f, +-0.0368216f,0.992281f,-0.118418f, +-0.30784f,0.939111f,0.152661f, +-0.339391f,0.929078f,0.147065f, +-0.31987f,0.942094f,0.100706f, +-0.261939f,0.955297f,0.137099f, +-0.18149f,0.977639f,0.106224f, +-0.0176854f,0.987381f,0.157371f, +0.134774f,0.952305f,0.273773f, +0.227558f,0.898637f,0.375058f, +0.367312f,0.872839f,0.3213f, +0.289472f,0.940027f,0.180432f, +0.0121921f,0.995617f,0.0927227f, +-0.0151053f,0.984704f,0.173582f, +0.12465f,0.941586f,0.312855f, +0.123765f,0.936041f,0.329407f, +0.0496474f,0.956015f,0.289087f, +0.155803f,0.919433f,0.361065f, +0.180039f,0.912678f,0.366885f, +0.192318f,0.910529f,0.365993f, +0.269572f,0.892548f,0.361509f, +0.331198f,0.898525f,0.288029f, +0.198758f,0.948186f,0.247866f, +-0.0345441f,0.951973f,0.304226f, +-0.0327497f,0.929484f,0.367404f, +-0.0643392f,0.937143f,0.342962f, +0.00774044f,0.965859f,0.258952f, +0.179174f,0.948429f,0.261495f, +0.132443f,0.935778f,0.32677f, +0.0607758f,0.973146f,0.222018f, +-0.0289622f,0.977742f,0.2078f, +-0.247283f,0.928769f,0.276114f, +-0.440694f,0.866976f,0.232681f, +-0.493254f,0.853754f,0.166745f, +-0.437376f,0.881741f,0.176734f, +-0.303558f,0.920161f,0.247297f, +-0.230002f,0.942128f,0.243914f, +-0.435382f,0.879414f,0.192544f, +-0.672886f,0.738322f,0.045878f, +0.0719528f,0.93004f,-0.360345f, +0.170321f,0.920666f,-0.351232f, +0.181011f,0.922477f,-0.340985f, +0.0828362f,0.939404f,-0.332654f, +-0.0227994f,0.947238f,-0.31972f, +-0.0485785f,0.963562f,-0.263036f, +0.0586424f,0.995988f,-0.0676002f, +-0.0660447f,0.996659f,-0.0480482f, +-0.0602898f,0.992772f,-0.103773f, +0.058767f,0.996066f,-0.0663303f, +0.189158f,0.981943f,0.00282556f, +0.237805f,0.968932f,-0.0679702f, +0.226076f,0.973949f,-0.0176966f, +0.0903031f,0.990597f,0.102775f, +0.00876316f,0.995102f,0.0984623f, +0.239141f,0.958139f,0.157419f, +0.358816f,0.926379f,0.11434f, +0.290281f,0.955997f,0.0425008f, +0.0827916f,0.995067f,-0.054651f, +-0.14974f,0.985436f,-0.0805802f, +-0.250148f,0.9681f,-0.0144092f, +-0.190918f,0.980525f,0.0460446f, +0.000678111f,0.99542f,0.0955933f, +0.316233f,0.948486f,0.019255f, +0.451155f,0.892443f,0.00187563f, +0.20864f,0.975493f,0.0698802f, +-0.187263f,0.946264f,0.263661f, +-0.412354f,0.843904f,0.343207f, +-0.267988f,0.899756f,0.344414f, +-0.237384f,0.936767f,0.25713f, +-0.24929f,0.96341f,0.0984657f, +-0.12508f,0.979898f,0.155419f, +-0.075281f,0.975532f,0.206567f, +-0.0362475f,0.956877f,0.288223f, +0.179598f,0.903623f,0.388856f, +0.452503f,0.830262f,0.325433f, +0.44384f,0.859576f,0.253251f, +0.0283124f,0.992393f,0.119807f, +-0.131018f,0.979645f,0.152082f, +-0.0108162f,0.971878f,0.235238f, +0.177243f,0.920605f,0.347953f, +0.0690998f,0.954542f,0.289956f, +0.0964158f,0.939858f,0.327675f, +0.141817f,0.921257f,0.362178f, +0.189018f,0.897606f,0.398216f, +0.266469f,0.899974f,0.345024f, +0.359545f,0.871551f,0.333357f, +0.237931f,0.897592f,0.371104f, +-0.0217966f,0.934365f,0.355651f, +-0.0978092f,0.948287f,0.30197f, +0.00875447f,0.940305f,0.340221f, +0.0870369f,0.963741f,0.252246f, +0.143744f,0.964801f,0.220218f, +0.0987042f,0.960888f,0.25875f, +0.124661f,0.953903f,0.273f, +-0.0397023f,0.970451f,0.238011f, +-0.294392f,0.938787f,0.17892f, +-0.415783f,0.892445f,0.175119f, +-0.502145f,0.854833f,0.130809f, +-0.438287f,0.876552f,0.198899f, +-0.315043f,0.920499f,0.231147f, +-0.194294f,0.951114f,0.240065f, +-0.351808f,0.923717f,0.151587f, +-0.54821f,0.835857f,0.0284484f, +0.0750917f,0.989867f,-0.120519f, +0.16891f,0.981624f,-0.0887941f, +0.190217f,0.976992f,-0.0964579f, +0.031324f,0.983953f,-0.175657f, +-0.0605958f,0.993695f,-0.0943344f, +-0.0750681f,0.99685f,-0.025582f, +-0.0331924f,0.999431f,-0.00606515f, +-0.0198899f,0.99954f,0.0228873f, +-0.0160511f,0.998799f,-0.0462827f, +0.0298246f,0.995221f,-0.092978f, +0.113995f,0.985706f,-0.124048f, +0.249662f,0.968309f,-0.00683024f, +0.100872f,0.992347f,0.0712218f, +0.0920036f,0.982533f,0.161755f, +0.0527146f,0.998589f,-0.00636128f, +0.182827f,0.9816f,-0.0550969f, +0.393766f,0.919069f,-0.0161334f, +0.337394f,0.941358f,0.00313128f, +0.105574f,0.990777f,0.0849468f, +-0.199161f,0.971911f,0.125398f, +-0.309481f,0.93868f,0.151989f, +-0.20903f,0.965522f,0.15516f, +0.0624223f,0.987754f,0.142987f, +0.384312f,0.922399f,0.0385395f, +0.395292f,0.916973f,0.0539f, +-0.00445825f,0.983693f,0.179798f, +-0.32103f,0.866957f,0.381215f, +-0.378167f,0.863609f,0.33342f, +-0.220175f,0.926633f,0.304752f, +-0.0614943f,0.950074f,0.305906f, +-0.12116f,0.98024f,0.156364f, +-0.278268f,0.956461f,0.0880323f, +-0.168756f,0.960122f,0.222908f, +-0.0650574f,0.977781f,0.199281f, +0.11325f,0.979757f,0.165078f, +0.469769f,0.846474f,0.250598f, +0.492575f,0.830428f,0.260305f, +0.123756f,0.962501f,0.241404f, +-0.13585f,0.964887f,0.224807f, +-0.0763658f,0.97309f,0.217403f, +0.0878568f,0.965257f,0.246088f, +0.105594f,0.951417f,0.289233f, +0.0757959f,0.967864f,0.239781f, +0.0993833f,0.975608f,0.195732f, +0.186309f,0.954458f,0.23302f, +0.338273f,0.909543f,0.241458f, +0.326788f,0.907649f,0.263405f, +0.193788f,0.920444f,0.339454f, +0.0304147f,0.954662f,0.296135f, +-0.0232537f,0.980981f,0.192706f, +0.000389577f,0.986091f,0.166207f, +0.0882095f,0.967853f,0.235542f, +0.188357f,0.927906f,0.321731f, +0.0670292f,0.972109f,0.224745f, +0.0943312f,0.961869f,0.256728f, +0.0613113f,0.959756f,0.274061f, +-0.207348f,0.967924f,0.141881f, +-0.415608f,0.907723f,0.0575284f, +-0.500123f,0.863342f,0.0672098f, +-0.492039f,0.866172f,0.0874256f, +-0.354073f,0.931677f,0.0813054f, +-0.181316f,0.978479f,0.0985071f, +-0.266622f,0.956284f,0.120138f, +-0.442863f,0.891447f,0.0958846f, +-0.0871303f,0.98944f,-0.115829f, +0.0906659f,0.9958f,-0.0127409f, +0.283182f,0.958456f,0.0342056f, +0.0813038f,0.994836f,-0.0607581f, +-0.14732f,0.989082f,0.00362058f, +-0.15085f,0.987502f,0.0456442f, +-0.0204288f,0.99901f,0.039516f, +0.00607957f,0.996993f,-0.0772516f, +0.0245166f,0.989435f,-0.142892f, +0.112542f,0.984768f,-0.132539f, +0.117701f,0.980135f,-0.159633f, +0.0712861f,0.996099f,-0.0520052f, +0.0255235f,0.995475f,0.0915291f, +0.102558f,0.988742f,0.10895f, +0.263691f,0.960156f,0.0925667f, +0.248163f,0.965214f,-0.0823197f, +0.340591f,0.934756f,-0.101139f, +0.19652f,0.980248f,0.0222232f, +-0.0707824f,0.98306f,0.169067f, +-0.214629f,0.938414f,0.270766f, +-0.253216f,0.94197f,0.220395f, +-0.140751f,0.981088f,0.132876f, +0.0855474f,0.99626f,0.0121329f, +0.407822f,0.912623f,0.0283097f, +0.314806f,0.941456f,0.120654f, +-0.127318f,0.956166f,0.263699f, +-0.403379f,0.856412f,0.322248f, +-0.326125f,0.89105f,0.315709f, +-0.192548f,0.934549f,0.29924f, +-0.115959f,0.956033f,0.26936f, +-0.0455884f,0.940005f,0.3381f, +-0.221624f,0.931041f,0.289905f, +-0.142796f,0.963558f,0.226198f, +0.0818112f,0.991531f,0.100865f, +0.115133f,0.989689f,-0.0852087f, +0.362891f,0.931224f,-0.0336289f, +0.464909f,0.869676f,0.1659f, +0.12135f,0.938462f,0.323362f, +-0.154102f,0.92745f,0.340718f, +-0.00840056f,0.94535f,0.325948f, +0.0978542f,0.97811f,0.183647f, +0.11792f,0.982347f,0.145222f, +0.146369f,0.980631f,0.130149f, +0.169334f,0.978423f,0.118383f, +0.164013f,0.985699f,0.0386944f, +0.265906f,0.961228f,0.0730397f, +0.245913f,0.944548f,0.217615f, +0.193695f,0.94265f,0.271832f, +0.193351f,0.95598f,0.22072f, +0.0582845f,0.995708f,0.0718875f, +-0.00685416f,0.998237f,0.0589609f, +-0.0637908f,0.997757f,0.0202719f, +0.11477f,0.985697f,0.123411f, +0.150647f,0.970382f,0.188848f, +0.0830539f,0.976206f,0.200309f, +0.0503424f,0.976583f,0.20917f, +-0.0756986f,0.967299f,0.242081f, +-0.38538f,0.913963f,0.127097f, +-0.499709f,0.856093f,0.131896f, +-0.457912f,0.888414f,0.0322019f, +-0.285439f,0.956482f,-0.0605596f, +-0.224005f,0.968049f,-0.112706f, +-0.33892f,0.940492f,-0.0246551f, +-0.468811f,0.882994f,0.0231736f, +-0.219323f,0.927554f,-0.302556f, +0.0032435f,0.972826f,-0.231515f, +0.227016f,0.959392f,-0.167423f, +0.0751831f,0.995555f,-0.0567285f, +-0.21163f,0.975526f,-0.0596754f, +-0.120787f,0.989714f,-0.0766664f, +0.103292f,0.984862f,-0.139202f, +0.130327f,0.957045f,-0.258998f, +0.100597f,0.957666f,-0.269734f, +0.0434385f,0.943793f,-0.327671f, +-0.00659457f,0.974177f,-0.225689f, +-0.0387678f,0.996731f,-0.0708824f, +0.0108947f,0.998722f,-0.049343f, +0.045379f,0.994354f,-0.0959194f, +0.256328f,0.966322f,0.0227405f, +0.338426f,0.940797f,0.0191927f, +0.245639f,0.967185f,0.0649251f, +0.104201f,0.958601f,0.265004f, +-0.106481f,0.952706f,0.284628f, +-0.229215f,0.947098f,0.224647f, +-0.194403f,0.966329f,0.168569f, +-0.00252669f,0.996043f,0.0888332f, +0.156392f,0.987666f,-0.00755935f, +0.321695f,0.943636f,0.0778705f, +0.130492f,0.960095f,0.247363f, +-0.218806f,0.887212f,0.406175f, +-0.387978f,0.851763f,0.352097f, +-0.317465f,0.905687f,0.280974f, +-0.175202f,0.945708f,0.273753f, +-0.0852507f,0.952748f,0.291554f, +-0.110501f,0.951599f,0.28679f, +-0.162568f,0.933525f,0.319534f, +-0.0379096f,0.973407f,0.225923f, +0.243134f,0.964593f,0.102203f, +0.236277f,0.971524f,-0.017745f, +0.298887f,0.954255f,-0.00800205f, +0.225509f,0.966982f,0.118704f, +-0.0160588f,0.939828f,0.341271f, +-0.127862f,0.916925f,0.378021f, +0.078893f,0.93958f,0.333116f, +0.244086f,0.933689f,0.262004f, +0.186692f,0.967385f,0.17121f, +0.108188f,0.990525f,0.0845894f, +0.174941f,0.977766f,0.115627f, +0.231991f,0.970242f,0.0693606f, +0.186114f,0.981267f,0.0497696f, +0.166608f,0.977012f,0.133002f, +0.191728f,0.971565f,0.138929f, +0.25765f,0.957218f,0.131718f, +0.087274f,0.989729f,0.113225f, +-0.00280678f,0.977756f,0.209725f, +0.0607703f,0.980671f,0.185986f, +0.0485237f,0.997381f,0.053629f, +0.0587736f,0.987863f,0.14378f, +0.0482407f,0.976088f,0.211956f, +0.0134663f,0.978159f,0.20742f, +-0.112292f,0.962623f,0.246469f, +-0.319272f,0.919627f,0.228803f, +-0.453582f,0.883075f,0.120176f, +-0.338159f,0.939324f,0.0576029f, +-0.23768f,0.971299f,-0.0092623f, +-0.191895f,0.980604f,-0.0399f, +-0.401044f,0.906011f,-0.135303f, +-0.489506f,0.868205f,-0.081269f, +-0.196977f,0.901169f,-0.386128f, +-0.0562291f,0.922285f,-0.382399f, +0.0867548f,0.952728f,-0.291176f, +0.0232316f,0.988917f,-0.146644f, +-0.11605f,0.968007f,-0.222475f, +-0.0789033f,0.942785f,-0.323929f, +0.139529f,0.948189f,-0.285427f, +0.132434f,0.962288f,-0.23762f, +0.0765905f,0.96807f,-0.238692f, +0.0641003f,0.96574f,-0.251472f, +-0.105766f,0.965216f,-0.239106f, +-0.110895f,0.972771f,-0.203515f, +0.0206339f,0.984024f,-0.176838f, +0.0647147f,0.988173f,-0.139018f, +0.148599f,0.980872f,-0.125734f, +0.271512f,0.961735f,0.0367049f, +0.0561912f,0.976773f,0.206777f, +-0.0583132f,0.913697f,0.402191f, +-0.0462589f,0.893353f,0.446968f, +-0.125152f,0.910112f,0.39501f, +-0.0803843f,0.940756f,0.329418f, +0.0619859f,0.973174f,0.221562f, +0.135828f,0.971328f,0.195124f, +0.132962f,0.954202f,0.267992f, +-0.0325488f,0.903596f,0.427147f, +-0.270164f,0.841605f,0.467668f, +-0.262238f,0.850223f,0.456456f, +-0.212116f,0.889937f,0.403757f, +-0.177521f,0.909486f,0.375929f, +-0.116828f,0.901627f,0.416436f, +-0.0747169f,0.915103f,0.396238f, +-0.119776f,0.962629f,0.242896f, +0.0380452f,0.99097f,0.128572f, +0.304108f,0.937317f,0.17016f, +0.240764f,0.951762f,0.190215f, +0.194326f,0.952804f,0.233243f, +0.142453f,0.936947f,0.31912f, +-0.0935081f,0.945618f,0.31155f, +-0.0887705f,0.956167f,0.27904f, +0.107828f,0.967058f,0.230592f, +0.241042f,0.935322f,0.258984f, +0.259409f,0.922717f,0.285133f, +0.218487f,0.962504f,0.160778f, +0.220571f,0.975062f,0.0245473f, +0.235132f,0.971421f,-0.0324531f, +0.193322f,0.980828f,0.0245576f, +0.123827f,0.992302f,-0.00201728f, +0.206505f,0.97706f,0.0520531f, +0.250594f,0.965023f,0.0770254f, +0.0246334f,0.99033f,0.136524f, +-0.123437f,0.964871f,0.231923f, +0.10276f,0.956911f,0.271591f, +0.090829f,0.970486f,0.223397f, +0.00393218f,0.964068f,0.265627f, +0.045739f,0.962581f,0.267105f, +0.0438394f,0.968724f,0.244235f, +-0.1348f,0.971521f,0.194876f, +-0.247965f,0.950768f,0.185883f, +-0.385563f,0.920067f,0.0694089f, +-0.33646f,0.941527f,0.0179056f, +-0.284408f,0.957673f,0.0444463f, +-0.0809611f,0.98246f,0.167982f, +-0.272195f,0.961849f,0.0275091f, +-0.538305f,0.840251f,-0.0648443f, +-0.138085f,0.947265f,-0.289173f, +-0.112292f,0.943405f,-0.312055f, +-0.0366032f,0.968339f,-0.246942f, +-0.0207584f,0.978499f,-0.205204f, +-0.0114432f,0.978269f,-0.207024f, +-0.017206f,0.978017f,-0.207814f, +-0.00196221f,0.968739f,-0.248075f, +0.111459f,0.982805f,-0.147209f, +0.0917515f,0.980196f,-0.175495f, +0.0783409f,0.987595f,-0.136083f, +-0.0849004f,0.981698f,-0.170473f, +-0.0826208f,0.969176f,-0.232103f, +-0.0513296f,0.962825f,-0.265205f, +-0.0169212f,0.988046f,-0.153227f, +0.0442536f,0.99886f,0.017891f, +0.0803284f,0.974024f,0.211719f, +-0.118041f,0.942704f,0.312052f, +-0.187621f,0.893485f,0.408023f, +-0.0735772f,0.857937f,0.508459f, +-0.0838693f,0.837024f,0.5407f, +-0.00356882f,0.863268f,0.504733f, +0.117551f,0.889838f,0.440874f, +0.141271f,0.893306f,0.426669f, +0.0270129f,0.906148f,0.422097f, +-0.109486f,0.851548f,0.512717f, +-0.266831f,0.814637f,0.514944f, +-0.253628f,0.788787f,0.559899f, +-0.216685f,0.776961f,0.591083f, +-0.15137f,0.760068f,0.631968f, +-0.119157f,0.801398f,0.586143f, +0.0626697f,0.817134f,0.573031f, +0.150716f,0.886392f,0.437714f, +0.0719955f,0.965525f,0.250157f, +0.170594f,0.93758f,0.303054f, +0.205981f,0.906978f,0.367374f, +0.159242f,0.93166f,0.326575f, +0.163686f,0.939188f,0.301881f, +0.00255834f,0.983457f,0.181126f, +-0.0246414f,0.997684f,0.063397f, +0.103068f,0.994148f,0.0323463f, +0.175261f,0.977189f,0.119941f, +0.238397f,0.946614f,0.216998f, +0.376211f,0.893689f,0.244508f, +0.336321f,0.93903f,0.0714918f, +0.22632f,0.974025f,-0.00733613f, +0.155366f,0.98668f,0.0481989f, +0.129371f,0.988467f,0.0787169f, +0.140766f,0.985457f,0.095182f, +0.181141f,0.974304f,0.133867f, +-0.0259321f,0.983166f,0.180868f, +-0.16382f,0.974748f,0.151756f, +0.12842f,0.977623f,0.166619f, +0.102805f,0.986615f,0.12658f, +-0.0352231f,0.991461f,0.125559f, +0.0344472f,0.990276f,0.134782f, +0.100258f,0.97877f,0.178768f, +-0.0763414f,0.992566f,0.0947915f, +-0.24142f,0.968616f,0.059149f, +-0.325267f,0.943242f,0.06705f, +-0.302069f,0.9528f,0.0304413f, +-0.317187f,0.948361f,-0.0017587f, +-0.219267f,0.973832f,0.059775f, +-0.187608f,0.954493f,0.231832f, +-0.46452f,0.867868f,0.176143f, +-0.203418f,0.948131f,-0.244273f, +-0.139664f,0.973265f,-0.182342f, +-0.0536959f,0.988785f,-0.139361f, +-0.00355604f,0.986781f,-0.162022f, +-0.0572809f,0.980561f,-0.187669f, +-0.0374007f,0.985205f,-0.167247f, +0.0555765f,0.976159f,-0.209822f, +0.0908927f,0.962348f,-0.256173f, +0.0600715f,0.972748f,-0.223946f, +0.0442581f,0.987652f,-0.150282f, +-0.0260568f,0.986636f,-0.160841f, +-0.0937884f,0.986183f,-0.136552f, +-0.00585357f,0.999959f,-0.00691373f, +-0.168872f,0.982349f,-0.0804476f, +-0.215485f,0.975309f,0.0483622f, +-0.0961691f,0.964354f,0.246521f, +-0.114487f,0.922048f,0.369757f, +-0.269656f,0.899414f,0.344007f, +-0.21772f,0.897789f,0.382849f, +-0.126818f,0.886934f,0.444145f, +0.0624514f,0.872607f,0.484415f, +0.170504f,0.863439f,0.474764f, +0.127681f,0.882519f,0.452612f, +0.0249418f,0.887332f,0.460457f, +-0.228952f,0.87943f,0.417354f, +-0.336679f,0.801754f,0.493799f, +-0.354676f,0.742594f,0.568119f, +-0.265358f,0.728648f,0.631393f, +-0.0874663f,0.774696f,0.626255f, +0.0313715f,0.816845f,0.576004f, +0.138491f,0.877406f,0.459325f, +0.251487f,0.873743f,0.416325f, +0.149012f,0.891076f,0.428695f, +0.134082f,0.895567f,0.424244f, +0.259356f,0.879751f,0.398462f, +0.273738f,0.923515f,0.268677f, +0.242075f,0.954352f,0.174962f, +0.166067f,0.977105f,0.132992f, +0.0519593f,0.998404f,0.022142f, +0.0706628f,0.997395f,0.0145074f, +0.0910476f,0.994722f,0.0473141f, +0.126598f,0.990827f,0.0472679f, +0.33108f,0.937289f,0.108974f, +0.427456f,0.888646f,0.166103f, +0.265492f,0.95292f,0.14648f, +0.0868945f,0.990384f,0.10765f, +0.0739344f,0.98242f,0.171417f, +0.14882f,0.964095f,0.219937f, +0.160065f,0.969614f,0.185009f, +0.0379065f,0.980794f,0.191328f, +-0.111879f,0.992654f,0.0460448f, +0.101571f,0.994616f,0.0205655f, +0.134276f,0.987226f,0.0857599f, +0.00322228f,0.996946f,0.0780295f, +-0.00585508f,0.99961f,0.0273218f, +0.102527f,0.992913f,0.0601057f, +-0.0243337f,0.999696f,0.00385478f, +-0.236106f,0.971591f,0.0163038f, +-0.335881f,0.941896f,0.00400261f, +-0.319925f,0.947097f,0.0255887f, +-0.262465f,0.960477f,0.0927118f, +-0.320184f,0.947305f,-0.00973767f, +-0.358146f,0.929034f,0.0928862f, +-0.431591f,0.882961f,0.184686f, +-0.350194f,0.913588f,-0.20669f, +-0.241714f,0.958821f,-0.149118f, +-0.0874799f,0.991928f,-0.0917931f, +-0.00637736f,0.998289f,-0.0581162f, +0.0261719f,0.997729f,-0.0620574f, +0.00430678f,0.979141f,-0.203135f, +0.121705f,0.971178f,-0.20494f, +0.10219f,0.965909f,-0.237861f, +0.00407698f,0.957171f,-0.289495f, +-0.0386862f,0.968014f,-0.247897f, +-0.0509849f,0.995926f,-0.0743816f, +-0.228245f,0.973592f,-0.00474817f, +-0.140696f,0.979081f,0.146984f, +-0.104046f,0.966867f,0.233113f, +-0.254332f,0.94315f,0.213969f, +-0.211685f,0.953746f,0.213442f, +-0.245201f,0.93619f,0.251844f, +-0.247199f,0.912647f,0.325527f, +-0.213426f,0.932543f,0.291228f, +-0.170741f,0.942588f,0.28701f, +-0.0363946f,0.943193f,0.330245f, +0.169433f,0.88607f,0.431478f, +0.12169f,0.89261f,0.434096f, +0.0508642f,0.869951f,0.490509f, +-0.175065f,0.875657f,0.450086f, +-0.464211f,0.815419f,0.345833f, +-0.467728f,0.796275f,0.383635f, +-0.295863f,0.865688f,0.403795f, +-0.0706376f,0.91172f,0.404693f, +0.151265f,0.880258f,0.449738f, +0.239887f,0.896678f,0.372052f, +0.270966f,0.902061f,0.335952f, +0.133682f,0.938928f,0.317085f, +0.132181f,0.949509f,0.284538f, +0.337234f,0.911457f,0.235624f, +0.391568f,0.908725f,0.144547f, +0.297707f,0.949115f,0.10272f, +0.163642f,0.985787f,0.038011f, +0.0603665f,0.994817f,0.0818182f, +0.0342529f,0.984393f,0.172617f, +0.146f,0.969394f,0.197379f, +0.189586f,0.979398f,0.0695505f, +0.32179f,0.946595f,0.0202369f, +0.339913f,0.938655f,0.0581868f, +0.255631f,0.940824f,0.222493f, +0.130905f,0.959362f,0.249975f, +0.0245005f,0.97884f,0.203155f, +0.116898f,0.96642f,0.228839f, +0.217161f,0.952887f,0.211771f, +0.0905814f,0.991503f,0.0933592f, +0.00963547f,0.999795f,0.0178162f, +0.0707892f,0.997359f,-0.0162393f, +0.0454623f,0.996335f,0.0724521f, +0.025845f,0.99119f,0.129903f, +0.0553395f,0.998031f,0.0295398f, +0.0632528f,0.997901f,0.0138837f, +-0.000723073f,0.987186f,0.159572f, +-0.246121f,0.956173f,0.158611f, +-0.292993f,0.948379f,0.121377f, +-0.358856f,0.933219f,0.0180357f, +-0.312153f,0.948631f,0.0515794f, +-0.263061f,0.955548f,0.133141f, +-0.387996f,0.907685f,0.159898f, +-0.516559f,0.845117f,0.137638f, +-0.310178f,0.948377f,-0.0661154f, +-0.300026f,0.949757f,-0.0891454f, +-0.137668f,0.990363f,0.0151269f, +-0.0326899f,0.997118f,0.0684562f, +0.0835016f,0.994462f,0.0638203f, +0.0992766f,0.995028f,0.00796582f, +0.068628f,0.997514f,-0.0159775f, +0.181484f,0.983266f,0.0158879f, +0.0929905f,0.991619f,-0.0896955f, +-0.159863f,0.9831f,-0.0892104f, +-0.274969f,0.956779f,0.094689f, +-0.2578f,0.933703f,0.248472f, +-0.255563f,0.934109f,0.249254f, +-0.183445f,0.905456f,0.382751f, +-0.258353f,0.860148f,0.439771f, +-0.12588f,0.873686f,0.469923f, +-0.210169f,0.916013f,0.341684f, +-0.272883f,0.91339f,0.302083f, +-0.180317f,0.937251f,0.298406f, +-0.199625f,0.942232f,0.268977f, +-0.0859427f,0.9396f,0.33131f, +0.0831524f,0.928739f,0.361288f, +0.0997333f,0.904186f,0.415333f, +-0.0517762f,0.893569f,0.445931f, +-0.109718f,0.87826f,0.465426f, +-0.369685f,0.848108f,0.379534f, +-0.446603f,0.811841f,0.376112f, +-0.267849f,0.883969f,0.383218f, +-0.10672f,0.930725f,0.349801f, +0.10205f,0.92892f,0.355941f, +0.253281f,0.903219f,0.346475f, +0.270898f,0.880967f,0.387957f, +0.236849f,0.896348f,0.374784f, +0.206634f,0.946539f,0.247723f, +0.405577f,0.89206f,0.199342f, +0.379351f,0.915673f,0.1328f, +0.334598f,0.922412f,0.192872f, +0.211991f,0.969195f,0.125385f, +-0.0201216f,0.993487f,0.112152f, +-0.0648495f,0.986484f,0.150479f, +0.170924f,0.975936f,0.135405f, +0.29249f,0.9553f,0.0430209f, +0.300918f,0.953641f,0.00421578f, +0.280252f,0.954656f,0.100457f, +0.110799f,0.982326f,0.150862f, +0.111953f,0.970209f,0.214852f, +0.0917898f,0.974074f,0.206772f, +0.0706157f,0.981239f,0.179398f, +0.263217f,0.920389f,0.289137f, +0.266708f,0.942871f,0.199653f, +0.0169344f,0.99983f,0.00724636f, +0.0586405f,0.99674f,0.0554216f, +-0.0335948f,0.99924f,0.0197934f, +0.0130139f,0.996641f,0.0808552f, +0.158081f,0.974057f,0.161934f, +-0.0718701f,0.984912f,0.157428f, +-0.146615f,0.930223f,0.336437f, +-0.215441f,0.915614f,0.339465f, +-0.194576f,0.929319f,0.313857f, +-0.21244f,0.956751f,0.198736f, +-0.353032f,0.933914f,0.0563254f, +-0.387138f,0.913346f,0.126188f, +-0.421226f,0.884098f,0.202334f, +-0.478159f,0.863227f,0.161871f, +-0.144962f,0.987796f,0.0569687f, +-0.329752f,0.937067f,-0.114758f, +-0.228627f,0.973393f,0.0153452f, +-0.0297707f,0.988896f,0.1456f, +0.0737235f,0.992418f,0.0983429f, +0.119683f,0.983634f,0.134687f, +0.0735029f,0.988539f,0.131863f, +0.205816f,0.971725f,0.115713f, +0.105316f,0.994111f,0.0255379f, +-0.224655f,0.970814f,0.0839657f, +-0.371877f,0.9075f,0.195325f, +-0.304303f,0.906448f,0.292833f, +-0.280483f,0.900657f,0.331883f, +-0.306628f,0.862929f,0.401664f, +-0.272078f,0.807801f,0.522907f, +-0.0728986f,0.827771f,0.55631f, +-0.0766844f,0.868115f,0.490404f, +-0.262952f,0.903979f,0.337163f, +-0.116268f,0.92805f,0.353844f, +-0.236581f,0.941122f,0.241494f, +-0.103825f,0.933685f,0.342713f, +0.0620174f,0.936003f,0.346485f, +0.0525461f,0.928042f,0.368751f, +-0.037371f,0.900626f,0.432986f, +-0.0859425f,0.920181f,0.381944f, +-0.402084f,0.867474f,0.292945f, +-0.458834f,0.792013f,0.402725f, +-0.247545f,0.839465f,0.483756f, +-0.0206347f,0.857039f,0.514838f, +0.131938f,0.906082f,0.402004f, +0.260907f,0.906936f,0.330749f, +0.222736f,0.912076f,0.344246f, +0.286017f,0.867948f,0.406029f, +0.265664f,0.918021f,0.29438f, +0.386646f,0.888781f,0.246116f, +0.416594f,0.869611f,0.265003f, +0.291338f,0.924889f,0.244341f, +0.264598f,0.920497f,0.287528f, +-0.0209737f,0.965015f,0.261353f, +0.011928f,0.966786f,0.255307f, +0.209759f,0.975171f,0.0710066f, +0.379568f,0.924828f,0.0249204f, +0.227757f,0.968062f,-0.104795f, +0.230276f,0.968937f,0.0901831f, +0.121279f,0.97806f,0.169381f, +0.101139f,0.989453f,0.103701f, +0.125341f,0.986876f,0.101809f, +0.00931107f,0.998148f,0.0601183f, +0.147262f,0.96746f,0.205755f, +0.372526f,0.861294f,0.34554f, +0.0770606f,0.989688f,0.120749f, +0.0673416f,0.990666f,0.11852f, +0.0242126f,0.998823f,0.0420167f, +-0.0975945f,0.993903f,-0.0513095f, +0.0117629f,0.986762f,0.16175f, +-0.119035f,0.908985f,0.399472f, +-0.171696f,0.877378f,0.448027f, +-0.168225f,0.894295f,0.414653f, +-0.158105f,0.915758f,0.369311f, +-0.0984338f,0.938718f,0.330333f, +-0.319812f,0.930617f,0.177966f, +-0.398204f,0.897351f,0.190248f, +-0.414882f,0.896338f,0.156369f, +-0.434877f,0.894265f,0.105701f, +}; + +btScalar Landscape07Tex[] = { +0.507813f,0.742188f, +0.507813f,0.734375f, +0.515625f,0.742188f, +0.515625f,0.734375f, +0.523438f,0.742188f, +0.523438f,0.734375f, +0.53125f,0.742188f, +0.53125f,0.734375f, +0.539063f,0.742188f, +0.539063f,0.734375f, +0.546875f,0.742188f, +0.546875f,0.734375f, +0.554688f,0.742188f, +0.554688f,0.734375f, +0.5625f,0.742188f, +0.5625f,0.734375f, +0.570313f,0.742188f, +0.570313f,0.734375f, +0.578125f,0.742188f, +0.578125f,0.734375f, +0.585938f,0.742188f, +0.585938f,0.734375f, +0.59375f,0.742188f, +0.59375f,0.734375f, +0.601563f,0.742188f, +0.601563f,0.734375f, +0.609375f,0.742188f, +0.609375f,0.734375f, +0.617188f,0.742188f, +0.617188f,0.734375f, +0.625f,0.742188f, +0.625f,0.734375f, +0.632813f,0.742188f, +0.632813f,0.734375f, +0.640625f,0.742188f, +0.640625f,0.734375f, +0.648438f,0.742188f, +0.648438f,0.734375f, +0.65625f,0.742188f, +0.65625f,0.734375f, +0.664063f,0.742188f, +0.664063f,0.734375f, +0.671875f,0.742188f, +0.671875f,0.734375f, +0.679688f,0.742188f, +0.679688f,0.734375f, +0.6875f,0.742188f, +0.6875f,0.734375f, +0.695313f,0.742188f, +0.695313f,0.734375f, +0.703125f,0.742188f, +0.703125f,0.734375f, +0.710938f,0.742188f, +0.710938f,0.734375f, +0.71875f,0.742188f, +0.71875f,0.734375f, +0.726563f,0.742188f, +0.726563f,0.734375f, +0.734375f,0.742188f, +0.734375f,0.734375f, +0.742188f,0.742188f, +0.742188f,0.734375f, +0.75f,0.742188f, +0.75f,0.734375f, +0.757813f,0.742188f, +0.757813f,0.734375f, +0.765625f,0.742188f, +0.765625f,0.734375f, +0.773438f,0.742188f, +0.773438f,0.734375f, +0.78125f,0.742188f, +0.78125f,0.734375f, +0.789063f,0.742188f, +0.789063f,0.734375f, +0.796875f,0.742188f, +0.796875f,0.734375f, +0.804688f,0.742188f, +0.804688f,0.734375f, +0.8125f,0.742188f, +0.8125f,0.734375f, +0.820313f,0.742188f, +0.820313f,0.734375f, +0.828125f,0.742188f, +0.828125f,0.734375f, +0.835938f,0.742188f, +0.835938f,0.734375f, +0.84375f,0.742188f, +0.84375f,0.734375f, +0.851563f,0.742188f, +0.851563f,0.734375f, +0.859375f,0.742188f, +0.859375f,0.734375f, +0.867188f,0.742188f, +0.867188f,0.734375f, +0.875f,0.742188f, +0.875f,0.734375f, +0.882813f,0.742188f, +0.882813f,0.734375f, +0.890625f,0.742188f, +0.890625f,0.734375f, +0.898438f,0.742188f, +0.898438f,0.734375f, +0.90625f,0.742188f, +0.90625f,0.734375f, +0.914063f,0.742188f, +0.914063f,0.734375f, +0.921875f,0.742188f, +0.921875f,0.734375f, +0.929688f,0.742188f, +0.929688f,0.734375f, +0.9375f,0.742188f, +0.9375f,0.734375f, +0.945313f,0.742188f, +0.945313f,0.734375f, +0.953125f,0.742188f, +0.953125f,0.734375f, +0.960938f,0.742188f, +0.960938f,0.734375f, +0.96875f,0.742188f, +0.96875f,0.734375f, +0.976563f,0.742188f, +0.976563f,0.734375f, +0.984375f,0.742188f, +0.984375f,0.734375f, +0.992188f,0.742188f, +0.992188f,0.734375f, +1.0f,0.742188f, +1.0f,0.734375f, +0.507813f,0.75f, +0.515625f,0.75f, +0.523438f,0.75f, +0.53125f,0.75f, +0.539063f,0.75f, +0.546875f,0.75f, +0.554688f,0.75f, +0.5625f,0.75f, +0.570313f,0.75f, +0.578125f,0.75f, +0.585938f,0.75f, +0.59375f,0.75f, +0.601563f,0.75f, +0.609375f,0.75f, +0.617188f,0.75f, +0.625f,0.75f, +0.632813f,0.75f, +0.640625f,0.75f, +0.648438f,0.75f, +0.65625f,0.75f, +0.664063f,0.75f, +0.671875f,0.75f, +0.679688f,0.75f, +0.6875f,0.75f, +0.695313f,0.75f, +0.703125f,0.75f, +0.710938f,0.75f, +0.71875f,0.75f, +0.726563f,0.75f, +0.734375f,0.75f, +0.742188f,0.75f, +0.75f,0.75f, +0.757813f,0.75f, +0.765625f,0.75f, +0.773438f,0.75f, +0.78125f,0.75f, +0.789063f,0.75f, +0.796875f,0.75f, +0.804688f,0.75f, +0.8125f,0.75f, +0.820313f,0.75f, +0.828125f,0.75f, +0.835938f,0.75f, +0.84375f,0.75f, +0.851563f,0.75f, +0.859375f,0.75f, +0.867188f,0.75f, +0.875f,0.75f, +0.882813f,0.75f, +0.890625f,0.75f, +0.898438f,0.75f, +0.90625f,0.75f, +0.914063f,0.75f, +0.921875f,0.75f, +0.929688f,0.75f, +0.9375f,0.75f, +0.945313f,0.75f, +0.953125f,0.75f, +0.960938f,0.75f, +0.96875f,0.75f, +0.976563f,0.75f, +0.984375f,0.75f, +0.992188f,0.75f, +1.0f,0.75f, +0.507813f,0.757813f, +0.515625f,0.757813f, +0.523438f,0.757813f, +0.53125f,0.757813f, +0.539063f,0.757813f, +0.546875f,0.757813f, +0.554688f,0.757813f, +0.5625f,0.757813f, +0.570313f,0.757813f, +0.578125f,0.757813f, +0.585938f,0.757813f, +0.59375f,0.757813f, +0.601563f,0.757813f, +0.609375f,0.757813f, +0.617188f,0.757813f, +0.625f,0.757813f, +0.632813f,0.757813f, +0.640625f,0.757813f, +0.648438f,0.757813f, +0.65625f,0.757813f, +0.664063f,0.757813f, +0.671875f,0.757813f, +0.679688f,0.757813f, +0.6875f,0.757813f, +0.695313f,0.757813f, +0.703125f,0.757813f, +0.710938f,0.757813f, +0.71875f,0.757813f, +0.726563f,0.757813f, +0.734375f,0.757813f, +0.742188f,0.757813f, +0.75f,0.757813f, +0.757813f,0.757813f, +0.765625f,0.757813f, +0.773438f,0.757813f, +0.78125f,0.757813f, +0.789063f,0.757813f, +0.796875f,0.757813f, +0.804688f,0.757813f, +0.8125f,0.757813f, +0.820313f,0.757813f, +0.828125f,0.757813f, +0.835938f,0.757813f, +0.84375f,0.757813f, +0.851563f,0.757813f, +0.859375f,0.757813f, +0.867188f,0.757813f, +0.875f,0.757813f, +0.882813f,0.757813f, +0.890625f,0.757813f, +0.898438f,0.757813f, +0.90625f,0.757813f, +0.914063f,0.757813f, +0.921875f,0.757813f, +0.929688f,0.757813f, +0.9375f,0.757813f, +0.945313f,0.757813f, +0.953125f,0.757813f, +0.960938f,0.757813f, +0.96875f,0.757813f, +0.976563f,0.757813f, +0.984375f,0.757813f, +0.992188f,0.757813f, +1.0f,0.757813f, +0.507813f,0.765625f, +0.515625f,0.765625f, +0.523438f,0.765625f, +0.53125f,0.765625f, +0.539063f,0.765625f, +0.546875f,0.765625f, +0.554688f,0.765625f, +0.5625f,0.765625f, +0.570313f,0.765625f, +0.578125f,0.765625f, +0.585938f,0.765625f, +0.59375f,0.765625f, +0.601563f,0.765625f, +0.609375f,0.765625f, +0.617188f,0.765625f, +0.625f,0.765625f, +0.632813f,0.765625f, +0.640625f,0.765625f, +0.648438f,0.765625f, +0.65625f,0.765625f, +0.664063f,0.765625f, +0.671875f,0.765625f, +0.679688f,0.765625f, +0.6875f,0.765625f, +0.695313f,0.765625f, +0.703125f,0.765625f, +0.710938f,0.765625f, +0.71875f,0.765625f, +0.726563f,0.765625f, +0.734375f,0.765625f, +0.742188f,0.765625f, +0.75f,0.765625f, +0.757813f,0.765625f, +0.765625f,0.765625f, +0.773438f,0.765625f, +0.78125f,0.765625f, +0.789063f,0.765625f, +0.796875f,0.765625f, +0.804688f,0.765625f, +0.8125f,0.765625f, +0.820313f,0.765625f, +0.828125f,0.765625f, +0.835938f,0.765625f, +0.84375f,0.765625f, +0.851563f,0.765625f, +0.859375f,0.765625f, +0.867188f,0.765625f, +0.875f,0.765625f, +0.882813f,0.765625f, +0.890625f,0.765625f, +0.898438f,0.765625f, +0.90625f,0.765625f, +0.914063f,0.765625f, +0.921875f,0.765625f, +0.929688f,0.765625f, +0.9375f,0.765625f, +0.945313f,0.765625f, +0.953125f,0.765625f, +0.960938f,0.765625f, +0.96875f,0.765625f, +0.976563f,0.765625f, +0.984375f,0.765625f, +0.992188f,0.765625f, +1.0f,0.765625f, +0.507813f,0.773438f, +0.515625f,0.773438f, +0.523438f,0.773438f, +0.53125f,0.773438f, +0.539063f,0.773438f, +0.546875f,0.773438f, +0.554688f,0.773438f, +0.5625f,0.773438f, +0.570313f,0.773438f, +0.578125f,0.773438f, +0.585938f,0.773438f, +0.59375f,0.773438f, +0.601563f,0.773438f, +0.609375f,0.773438f, +0.617188f,0.773438f, +0.625f,0.773438f, +0.632813f,0.773438f, +0.640625f,0.773438f, +0.648438f,0.773438f, +0.65625f,0.773438f, +0.664063f,0.773438f, +0.671875f,0.773438f, +0.679688f,0.773438f, +0.6875f,0.773438f, +0.695313f,0.773438f, +0.703125f,0.773438f, +0.710938f,0.773438f, +0.71875f,0.773438f, +0.726563f,0.773438f, +0.734375f,0.773438f, +0.742188f,0.773438f, +0.75f,0.773438f, +0.757813f,0.773438f, +0.765625f,0.773438f, +0.773438f,0.773438f, +0.78125f,0.773438f, +0.789063f,0.773438f, +0.796875f,0.773438f, +0.804688f,0.773438f, +0.8125f,0.773438f, +0.820313f,0.773438f, +0.828125f,0.773438f, +0.835938f,0.773438f, +0.84375f,0.773438f, +0.851563f,0.773438f, +0.859375f,0.773438f, +0.867188f,0.773438f, +0.875f,0.773438f, +0.882813f,0.773438f, +0.890625f,0.773438f, +0.898438f,0.773438f, +0.90625f,0.773438f, +0.914063f,0.773438f, +0.921875f,0.773438f, +0.929688f,0.773438f, +0.9375f,0.773438f, +0.945313f,0.773438f, +0.953125f,0.773438f, +0.960938f,0.773438f, +0.96875f,0.773438f, +0.976563f,0.773438f, +0.984375f,0.773438f, +0.992188f,0.773438f, +1.0f,0.773438f, +0.507813f,0.78125f, +0.515625f,0.78125f, +0.523438f,0.78125f, +0.53125f,0.78125f, +0.539063f,0.78125f, +0.546875f,0.78125f, +0.554688f,0.78125f, +0.5625f,0.78125f, +0.570313f,0.78125f, +0.578125f,0.78125f, +0.585938f,0.78125f, +0.59375f,0.78125f, +0.601563f,0.78125f, +0.609375f,0.78125f, +0.617188f,0.78125f, +0.625f,0.78125f, +0.632813f,0.78125f, +0.640625f,0.78125f, +0.648438f,0.78125f, +0.65625f,0.78125f, +0.664063f,0.78125f, +0.671875f,0.78125f, +0.679688f,0.78125f, +0.6875f,0.78125f, +0.695313f,0.78125f, +0.703125f,0.78125f, +0.710938f,0.78125f, +0.71875f,0.78125f, +0.726563f,0.78125f, +0.734375f,0.78125f, +0.742188f,0.78125f, +0.75f,0.78125f, +0.757813f,0.78125f, +0.765625f,0.78125f, +0.773438f,0.78125f, +0.78125f,0.78125f, +0.789063f,0.78125f, +0.796875f,0.78125f, +0.804688f,0.78125f, +0.8125f,0.78125f, +0.820313f,0.78125f, +0.828125f,0.78125f, +0.835938f,0.78125f, +0.84375f,0.78125f, +0.851563f,0.78125f, +0.859375f,0.78125f, +0.867188f,0.78125f, +0.875f,0.78125f, +0.882813f,0.78125f, +0.890625f,0.78125f, +0.898438f,0.78125f, +0.90625f,0.78125f, +0.914063f,0.78125f, +0.921875f,0.78125f, +0.929688f,0.78125f, +0.9375f,0.78125f, +0.945313f,0.78125f, +0.953125f,0.78125f, +0.960938f,0.78125f, +0.96875f,0.78125f, +0.976563f,0.78125f, +0.984375f,0.78125f, +0.992188f,0.78125f, +1.0f,0.78125f, +0.507813f,0.789063f, +0.515625f,0.789063f, +0.523438f,0.789063f, +0.53125f,0.789063f, +0.539063f,0.789063f, +0.546875f,0.789063f, +0.554688f,0.789063f, +0.5625f,0.789063f, +0.570313f,0.789063f, +0.578125f,0.789063f, +0.585938f,0.789063f, +0.59375f,0.789063f, +0.601563f,0.789063f, +0.609375f,0.789063f, +0.617188f,0.789063f, +0.625f,0.789063f, +0.632813f,0.789063f, +0.640625f,0.789063f, +0.648438f,0.789063f, +0.65625f,0.789063f, +0.664063f,0.789063f, +0.671875f,0.789063f, +0.679688f,0.789063f, +0.6875f,0.789063f, +0.695313f,0.789063f, +0.703125f,0.789063f, +0.710938f,0.789063f, +0.71875f,0.789063f, +0.726563f,0.789063f, +0.734375f,0.789063f, +0.742188f,0.789063f, +0.75f,0.789063f, +0.757813f,0.789063f, +0.765625f,0.789063f, +0.773438f,0.789063f, +0.78125f,0.789063f, +0.789063f,0.789063f, +0.796875f,0.789063f, +0.804688f,0.789063f, +0.8125f,0.789063f, +0.820313f,0.789063f, +0.828125f,0.789063f, +0.835938f,0.789063f, +0.84375f,0.789063f, +0.851563f,0.789063f, +0.859375f,0.789063f, +0.867188f,0.789063f, +0.875f,0.789063f, +0.882813f,0.789063f, +0.890625f,0.789063f, +0.898438f,0.789063f, +0.90625f,0.789063f, +0.914063f,0.789063f, +0.921875f,0.789063f, +0.929688f,0.789063f, +0.9375f,0.789063f, +0.945313f,0.789063f, +0.953125f,0.789063f, +0.960938f,0.789063f, +0.96875f,0.789063f, +0.976563f,0.789063f, +0.984375f,0.789063f, +0.992188f,0.789063f, +1.0f,0.789063f, +0.507813f,0.796875f, +0.515625f,0.796875f, +0.523438f,0.796875f, +0.53125f,0.796875f, +0.539063f,0.796875f, +0.546875f,0.796875f, +0.554688f,0.796875f, +0.5625f,0.796875f, +0.570313f,0.796875f, +0.578125f,0.796875f, +0.585938f,0.796875f, +0.59375f,0.796875f, +0.601563f,0.796875f, +0.609375f,0.796875f, +0.617188f,0.796875f, +0.625f,0.796875f, +0.632813f,0.796875f, +0.640625f,0.796875f, +0.648438f,0.796875f, +0.65625f,0.796875f, +0.664063f,0.796875f, +0.671875f,0.796875f, +0.679688f,0.796875f, +0.6875f,0.796875f, +0.695313f,0.796875f, +0.703125f,0.796875f, +0.710938f,0.796875f, +0.71875f,0.796875f, +0.726563f,0.796875f, +0.734375f,0.796875f, +0.742188f,0.796875f, +0.75f,0.796875f, +0.757813f,0.796875f, +0.765625f,0.796875f, +0.773438f,0.796875f, +0.78125f,0.796875f, +0.789063f,0.796875f, +0.796875f,0.796875f, +0.804688f,0.796875f, +0.8125f,0.796875f, +0.820313f,0.796875f, +0.828125f,0.796875f, +0.835938f,0.796875f, +0.84375f,0.796875f, +0.851563f,0.796875f, +0.859375f,0.796875f, +0.867188f,0.796875f, +0.875f,0.796875f, +0.882813f,0.796875f, +0.890625f,0.796875f, +0.898438f,0.796875f, +0.90625f,0.796875f, +0.914063f,0.796875f, +0.921875f,0.796875f, +0.929688f,0.796875f, +0.9375f,0.796875f, +0.945313f,0.796875f, +0.953125f,0.796875f, +0.960938f,0.796875f, +0.96875f,0.796875f, +0.976563f,0.796875f, +0.984375f,0.796875f, +0.992188f,0.796875f, +1.0f,0.796875f, +0.507813f,0.804688f, +0.515625f,0.804688f, +0.523438f,0.804688f, +0.53125f,0.804688f, +0.539063f,0.804688f, +0.546875f,0.804688f, +0.554688f,0.804688f, +0.5625f,0.804688f, +0.570313f,0.804688f, +0.578125f,0.804688f, +0.585938f,0.804688f, +0.59375f,0.804688f, +0.601563f,0.804688f, +0.609375f,0.804688f, +0.617188f,0.804688f, +0.625f,0.804688f, +0.632813f,0.804688f, +0.640625f,0.804688f, +0.648438f,0.804688f, +0.65625f,0.804688f, +0.664063f,0.804688f, +0.671875f,0.804688f, +0.679688f,0.804688f, +0.6875f,0.804688f, +0.695313f,0.804688f, +0.703125f,0.804688f, +0.710938f,0.804688f, +0.71875f,0.804688f, +0.726563f,0.804688f, +0.734375f,0.804688f, +0.742188f,0.804688f, +0.75f,0.804688f, +0.757813f,0.804688f, +0.765625f,0.804688f, +0.773438f,0.804688f, +0.78125f,0.804688f, +0.789063f,0.804688f, +0.796875f,0.804688f, +0.804688f,0.804688f, +0.8125f,0.804688f, +0.820313f,0.804688f, +0.828125f,0.804688f, +0.835938f,0.804688f, +0.84375f,0.804688f, +0.851563f,0.804688f, +0.859375f,0.804688f, +0.867188f,0.804688f, +0.875f,0.804688f, +0.882813f,0.804688f, +0.890625f,0.804688f, +0.898438f,0.804688f, +0.90625f,0.804688f, +0.914063f,0.804688f, +0.921875f,0.804688f, +0.929688f,0.804688f, +0.9375f,0.804688f, +0.945313f,0.804688f, +0.953125f,0.804688f, +0.960938f,0.804688f, +0.96875f,0.804688f, +0.976563f,0.804688f, +0.984375f,0.804688f, +0.992188f,0.804688f, +1.0f,0.804688f, +0.507813f,0.8125f, +0.515625f,0.8125f, +0.523438f,0.8125f, +0.53125f,0.8125f, +0.539063f,0.8125f, +0.546875f,0.8125f, +0.554688f,0.8125f, +0.5625f,0.8125f, +0.570313f,0.8125f, +0.578125f,0.8125f, +0.585938f,0.8125f, +0.59375f,0.8125f, +0.601563f,0.8125f, +0.609375f,0.8125f, +0.617188f,0.8125f, +0.625f,0.8125f, +0.632813f,0.8125f, +0.640625f,0.8125f, +0.648438f,0.8125f, +0.65625f,0.8125f, +0.664063f,0.8125f, +0.671875f,0.8125f, +0.679688f,0.8125f, +0.6875f,0.8125f, +0.695313f,0.8125f, +0.703125f,0.8125f, +0.710938f,0.8125f, +0.71875f,0.8125f, +0.726563f,0.8125f, +0.734375f,0.8125f, +0.742188f,0.8125f, +0.75f,0.8125f, +0.757813f,0.8125f, +0.765625f,0.8125f, +0.773438f,0.8125f, +0.78125f,0.8125f, +0.789063f,0.8125f, +0.796875f,0.8125f, +0.804688f,0.8125f, +0.8125f,0.8125f, +0.820313f,0.8125f, +0.828125f,0.8125f, +0.835938f,0.8125f, +0.84375f,0.8125f, +0.851563f,0.8125f, +0.859375f,0.8125f, +0.867188f,0.8125f, +0.875f,0.8125f, +0.882813f,0.8125f, +0.890625f,0.8125f, +0.898438f,0.8125f, +0.90625f,0.8125f, +0.914063f,0.8125f, +0.921875f,0.8125f, +0.929688f,0.8125f, +0.9375f,0.8125f, +0.945313f,0.8125f, +0.953125f,0.8125f, +0.960938f,0.8125f, +0.96875f,0.8125f, +0.976563f,0.8125f, +0.984375f,0.8125f, +0.992188f,0.8125f, +1.0f,0.8125f, +0.507813f,0.820313f, +0.515625f,0.820313f, +0.523438f,0.820313f, +0.53125f,0.820313f, +0.539063f,0.820313f, +0.546875f,0.820313f, +0.554688f,0.820313f, +0.5625f,0.820313f, +0.570313f,0.820313f, +0.578125f,0.820313f, +0.585938f,0.820313f, +0.59375f,0.820313f, +0.601563f,0.820313f, +0.609375f,0.820313f, +0.617188f,0.820313f, +0.625f,0.820313f, +0.632813f,0.820313f, +0.640625f,0.820313f, +0.648438f,0.820313f, +0.65625f,0.820313f, +0.664063f,0.820313f, +0.671875f,0.820313f, +0.679688f,0.820313f, +0.6875f,0.820313f, +0.695313f,0.820313f, +0.703125f,0.820313f, +0.710938f,0.820313f, +0.71875f,0.820313f, +0.726563f,0.820313f, +0.734375f,0.820313f, +0.742188f,0.820313f, +0.75f,0.820313f, +0.757813f,0.820313f, +0.765625f,0.820313f, +0.773438f,0.820313f, +0.78125f,0.820313f, +0.789063f,0.820313f, +0.796875f,0.820313f, +0.804688f,0.820313f, +0.8125f,0.820313f, +0.820313f,0.820313f, +0.828125f,0.820313f, +0.835938f,0.820313f, +0.84375f,0.820313f, +0.851563f,0.820313f, +0.859375f,0.820313f, +0.867188f,0.820313f, +0.875f,0.820313f, +0.882813f,0.820313f, +0.890625f,0.820313f, +0.898438f,0.820313f, +0.90625f,0.820313f, +0.914063f,0.820313f, +0.921875f,0.820313f, +0.929688f,0.820313f, +0.9375f,0.820313f, +0.945313f,0.820313f, +0.953125f,0.820313f, +0.960938f,0.820313f, +0.96875f,0.820313f, +0.976563f,0.820313f, +0.984375f,0.820313f, +0.992188f,0.820313f, +1.0f,0.820313f, +0.507813f,0.828125f, +0.515625f,0.828125f, +0.523438f,0.828125f, +0.53125f,0.828125f, +0.539063f,0.828125f, +0.546875f,0.828125f, +0.554688f,0.828125f, +0.5625f,0.828125f, +0.570313f,0.828125f, +0.578125f,0.828125f, +0.585938f,0.828125f, +0.59375f,0.828125f, +0.601563f,0.828125f, +0.609375f,0.828125f, +0.617188f,0.828125f, +0.625f,0.828125f, +0.632813f,0.828125f, +0.640625f,0.828125f, +0.648438f,0.828125f, +0.65625f,0.828125f, +0.664063f,0.828125f, +0.671875f,0.828125f, +0.679688f,0.828125f, +0.6875f,0.828125f, +0.695313f,0.828125f, +0.703125f,0.828125f, +0.710938f,0.828125f, +0.71875f,0.828125f, +0.726563f,0.828125f, +0.734375f,0.828125f, +0.742188f,0.828125f, +0.75f,0.828125f, +0.757813f,0.828125f, +0.765625f,0.828125f, +0.773438f,0.828125f, +0.78125f,0.828125f, +0.789063f,0.828125f, +0.796875f,0.828125f, +0.804688f,0.828125f, +0.8125f,0.828125f, +0.820313f,0.828125f, +0.828125f,0.828125f, +0.835938f,0.828125f, +0.84375f,0.828125f, +0.851563f,0.828125f, +0.859375f,0.828125f, +0.867188f,0.828125f, +0.875f,0.828125f, +0.882813f,0.828125f, +0.890625f,0.828125f, +0.898438f,0.828125f, +0.90625f,0.828125f, +0.914063f,0.828125f, +0.921875f,0.828125f, +0.929688f,0.828125f, +0.9375f,0.828125f, +0.945313f,0.828125f, +0.953125f,0.828125f, +0.960938f,0.828125f, +0.96875f,0.828125f, +0.976563f,0.828125f, +0.984375f,0.828125f, +0.992188f,0.828125f, +1.0f,0.828125f, +0.507813f,0.835938f, +0.515625f,0.835938f, +0.523438f,0.835938f, +0.53125f,0.835938f, +0.539063f,0.835938f, +0.546875f,0.835938f, +0.554688f,0.835938f, +0.5625f,0.835938f, +0.570313f,0.835938f, +0.578125f,0.835938f, +0.585938f,0.835938f, +0.59375f,0.835938f, +0.601563f,0.835938f, +0.609375f,0.835938f, +0.617188f,0.835938f, +0.625f,0.835938f, +0.632813f,0.835938f, +0.640625f,0.835938f, +0.648438f,0.835938f, +0.65625f,0.835938f, +0.664063f,0.835938f, +0.671875f,0.835938f, +0.679688f,0.835938f, +0.6875f,0.835938f, +0.695313f,0.835938f, +0.703125f,0.835938f, +0.710938f,0.835938f, +0.71875f,0.835938f, +0.726563f,0.835938f, +0.734375f,0.835938f, +0.742188f,0.835938f, +0.75f,0.835938f, +0.757813f,0.835938f, +0.765625f,0.835938f, +0.773438f,0.835938f, +0.78125f,0.835938f, +0.789063f,0.835938f, +0.796875f,0.835938f, +0.804688f,0.835938f, +0.8125f,0.835938f, +0.820313f,0.835938f, +0.828125f,0.835938f, +0.835938f,0.835938f, +0.84375f,0.835938f, +0.851563f,0.835938f, +0.859375f,0.835938f, +0.867188f,0.835938f, +0.875f,0.835938f, +0.882813f,0.835938f, +0.890625f,0.835938f, +0.898438f,0.835938f, +0.90625f,0.835938f, +0.914063f,0.835938f, +0.921875f,0.835938f, +0.929688f,0.835938f, +0.9375f,0.835938f, +0.945313f,0.835938f, +0.953125f,0.835938f, +0.960938f,0.835938f, +0.96875f,0.835938f, +0.976563f,0.835938f, +0.984375f,0.835938f, +0.992188f,0.835938f, +1.0f,0.835938f, +0.507813f,0.84375f, +0.515625f,0.84375f, +0.523438f,0.84375f, +0.53125f,0.84375f, +0.539063f,0.84375f, +0.546875f,0.84375f, +0.554688f,0.84375f, +0.5625f,0.84375f, +0.570313f,0.84375f, +0.578125f,0.84375f, +0.585938f,0.84375f, +0.59375f,0.84375f, +0.601563f,0.84375f, +0.609375f,0.84375f, +0.617188f,0.84375f, +0.625f,0.84375f, +0.632813f,0.84375f, +0.640625f,0.84375f, +0.648438f,0.84375f, +0.65625f,0.84375f, +0.664063f,0.84375f, +0.671875f,0.84375f, +0.679688f,0.84375f, +0.6875f,0.84375f, +0.695313f,0.84375f, +0.703125f,0.84375f, +0.710938f,0.84375f, +0.71875f,0.84375f, +0.726563f,0.84375f, +0.734375f,0.84375f, +0.742188f,0.84375f, +0.75f,0.84375f, +0.757813f,0.84375f, +0.765625f,0.84375f, +0.773438f,0.84375f, +0.78125f,0.84375f, +0.789063f,0.84375f, +0.796875f,0.84375f, +0.804688f,0.84375f, +0.8125f,0.84375f, +0.820313f,0.84375f, +0.828125f,0.84375f, +0.835938f,0.84375f, +0.84375f,0.84375f, +0.851563f,0.84375f, +0.859375f,0.84375f, +0.867188f,0.84375f, +0.875f,0.84375f, +0.882813f,0.84375f, +0.890625f,0.84375f, +0.898438f,0.84375f, +0.90625f,0.84375f, +0.914063f,0.84375f, +0.921875f,0.84375f, +0.929688f,0.84375f, +0.9375f,0.84375f, +0.945313f,0.84375f, +0.953125f,0.84375f, +0.960938f,0.84375f, +0.96875f,0.84375f, +0.976563f,0.84375f, +0.984375f,0.84375f, +0.992188f,0.84375f, +1.0f,0.84375f, +0.507813f,0.851563f, +0.515625f,0.851563f, +0.523438f,0.851563f, +0.53125f,0.851563f, +0.539063f,0.851563f, +0.546875f,0.851563f, +0.554688f,0.851563f, +0.5625f,0.851563f, +0.570313f,0.851563f, +0.578125f,0.851563f, +0.585938f,0.851563f, +0.59375f,0.851563f, +0.601563f,0.851563f, +0.609375f,0.851563f, +0.617188f,0.851563f, +0.625f,0.851563f, +0.632813f,0.851563f, +0.640625f,0.851563f, +0.648438f,0.851563f, +0.65625f,0.851563f, +0.664063f,0.851563f, +0.671875f,0.851563f, +0.679688f,0.851563f, +0.6875f,0.851563f, +0.695313f,0.851563f, +0.703125f,0.851563f, +0.710938f,0.851563f, +0.71875f,0.851563f, +0.726563f,0.851563f, +0.734375f,0.851563f, +0.742188f,0.851563f, +0.75f,0.851563f, +0.757813f,0.851563f, +0.765625f,0.851563f, +0.773438f,0.851563f, +0.78125f,0.851563f, +0.789063f,0.851563f, +0.796875f,0.851563f, +0.804688f,0.851563f, +0.8125f,0.851563f, +0.820313f,0.851563f, +0.828125f,0.851563f, +0.835938f,0.851563f, +0.84375f,0.851563f, +0.851563f,0.851563f, +0.859375f,0.851563f, +0.867188f,0.851563f, +0.875f,0.851563f, +0.882813f,0.851563f, +0.890625f,0.851563f, +0.898438f,0.851563f, +0.90625f,0.851563f, +0.914063f,0.851563f, +0.921875f,0.851563f, +0.929688f,0.851563f, +0.9375f,0.851563f, +0.945313f,0.851563f, +0.953125f,0.851563f, +0.960938f,0.851563f, +0.96875f,0.851563f, +0.976563f,0.851563f, +0.984375f,0.851563f, +0.992188f,0.851563f, +1.0f,0.851563f, +0.507813f,0.859375f, +0.515625f,0.859375f, +0.523438f,0.859375f, +0.53125f,0.859375f, +0.539063f,0.859375f, +0.546875f,0.859375f, +0.554688f,0.859375f, +0.5625f,0.859375f, +0.570313f,0.859375f, +0.578125f,0.859375f, +0.585938f,0.859375f, +0.59375f,0.859375f, +0.601563f,0.859375f, +0.609375f,0.859375f, +0.617188f,0.859375f, +0.625f,0.859375f, +0.632813f,0.859375f, +0.640625f,0.859375f, +0.648438f,0.859375f, +0.65625f,0.859375f, +0.664063f,0.859375f, +0.671875f,0.859375f, +0.679688f,0.859375f, +0.6875f,0.859375f, +0.695313f,0.859375f, +0.703125f,0.859375f, +0.710938f,0.859375f, +0.71875f,0.859375f, +0.726563f,0.859375f, +0.734375f,0.859375f, +0.742188f,0.859375f, +0.75f,0.859375f, +0.757813f,0.859375f, +0.765625f,0.859375f, +0.773438f,0.859375f, +0.78125f,0.859375f, +0.789063f,0.859375f, +0.796875f,0.859375f, +0.804688f,0.859375f, +0.8125f,0.859375f, +0.820313f,0.859375f, +0.828125f,0.859375f, +0.835938f,0.859375f, +0.84375f,0.859375f, +0.851563f,0.859375f, +0.859375f,0.859375f, +0.867188f,0.859375f, +0.875f,0.859375f, +0.882813f,0.859375f, +0.890625f,0.859375f, +0.898438f,0.859375f, +0.90625f,0.859375f, +0.914063f,0.859375f, +0.921875f,0.859375f, +0.929688f,0.859375f, +0.9375f,0.859375f, +0.945313f,0.859375f, +0.953125f,0.859375f, +0.960938f,0.859375f, +0.96875f,0.859375f, +0.976563f,0.859375f, +0.984375f,0.859375f, +0.992188f,0.859375f, +1.0f,0.859375f, +0.507813f,0.867188f, +0.515625f,0.867188f, +0.523438f,0.867188f, +0.53125f,0.867188f, +0.539063f,0.867188f, +0.546875f,0.867188f, +0.554688f,0.867188f, +0.5625f,0.867188f, +0.570313f,0.867188f, +0.578125f,0.867188f, +0.585938f,0.867188f, +0.59375f,0.867188f, +0.601563f,0.867188f, +0.609375f,0.867188f, +0.617188f,0.867188f, +0.625f,0.867188f, +0.632813f,0.867188f, +0.640625f,0.867188f, +0.648438f,0.867188f, +0.65625f,0.867188f, +0.664063f,0.867188f, +0.671875f,0.867188f, +0.679688f,0.867188f, +0.6875f,0.867188f, +0.695313f,0.867188f, +0.703125f,0.867188f, +0.710938f,0.867188f, +0.71875f,0.867188f, +0.726563f,0.867188f, +0.734375f,0.867188f, +0.742188f,0.867188f, +0.75f,0.867188f, +0.757813f,0.867188f, +0.765625f,0.867188f, +0.773438f,0.867188f, +0.78125f,0.867188f, +0.789063f,0.867188f, +0.796875f,0.867188f, +0.804688f,0.867188f, +0.8125f,0.867188f, +0.820313f,0.867188f, +0.828125f,0.867188f, +0.835938f,0.867188f, +0.84375f,0.867188f, +0.851563f,0.867188f, +0.859375f,0.867188f, +0.867188f,0.867188f, +0.875f,0.867188f, +0.882813f,0.867188f, +0.890625f,0.867188f, +0.898438f,0.867188f, +0.90625f,0.867188f, +0.914063f,0.867188f, +0.921875f,0.867188f, +0.929688f,0.867188f, +0.9375f,0.867188f, +0.945313f,0.867188f, +0.953125f,0.867188f, +0.960938f,0.867188f, +0.96875f,0.867188f, +0.976563f,0.867188f, +0.984375f,0.867188f, +0.992188f,0.867188f, +1.0f,0.867188f, +0.507813f,0.875f, +0.515625f,0.875f, +0.523438f,0.875f, +0.53125f,0.875f, +0.539063f,0.875f, +0.546875f,0.875f, +0.554688f,0.875f, +0.5625f,0.875f, +0.570313f,0.875f, +0.578125f,0.875f, +0.585938f,0.875f, +0.59375f,0.875f, +0.601563f,0.875f, +0.609375f,0.875f, +0.617188f,0.875f, +0.625f,0.875f, +0.632813f,0.875f, +0.640625f,0.875f, +0.648438f,0.875f, +0.65625f,0.875f, +0.664063f,0.875f, +0.671875f,0.875f, +0.679688f,0.875f, +0.6875f,0.875f, +0.695313f,0.875f, +0.703125f,0.875f, +0.710938f,0.875f, +0.71875f,0.875f, +0.726563f,0.875f, +0.734375f,0.875f, +0.742188f,0.875f, +0.75f,0.875f, +0.757813f,0.875f, +0.765625f,0.875f, +0.773438f,0.875f, +0.78125f,0.875f, +0.789063f,0.875f, +0.796875f,0.875f, +0.804688f,0.875f, +0.8125f,0.875f, +0.820313f,0.875f, +0.828125f,0.875f, +0.835938f,0.875f, +0.84375f,0.875f, +0.851563f,0.875f, +0.859375f,0.875f, +0.867188f,0.875f, +0.875f,0.875f, +0.882813f,0.875f, +0.890625f,0.875f, +0.898438f,0.875f, +0.90625f,0.875f, +0.914063f,0.875f, +0.921875f,0.875f, +0.929688f,0.875f, +0.9375f,0.875f, +0.945313f,0.875f, +0.953125f,0.875f, +0.960938f,0.875f, +0.96875f,0.875f, +0.976563f,0.875f, +0.984375f,0.875f, +0.992188f,0.875f, +1.0f,0.875f, +0.507813f,0.882813f, +0.515625f,0.882813f, +0.523438f,0.882813f, +0.53125f,0.882813f, +0.539063f,0.882813f, +0.546875f,0.882813f, +0.554688f,0.882813f, +0.5625f,0.882813f, +0.570313f,0.882813f, +0.578125f,0.882813f, +0.585938f,0.882813f, +0.59375f,0.882813f, +0.601563f,0.882813f, +0.609375f,0.882813f, +0.617188f,0.882813f, +0.625f,0.882813f, +0.632813f,0.882813f, +0.640625f,0.882813f, +0.648438f,0.882813f, +0.65625f,0.882813f, +0.664063f,0.882813f, +0.671875f,0.882813f, +0.679688f,0.882813f, +0.6875f,0.882813f, +0.695313f,0.882813f, +0.703125f,0.882813f, +0.710938f,0.882813f, +0.71875f,0.882813f, +0.726563f,0.882813f, +0.734375f,0.882813f, +0.742188f,0.882813f, +0.75f,0.882813f, +0.757813f,0.882813f, +0.765625f,0.882813f, +0.773438f,0.882813f, +0.78125f,0.882813f, +0.789063f,0.882813f, +0.796875f,0.882813f, +0.804688f,0.882813f, +0.8125f,0.882813f, +0.820313f,0.882813f, +0.828125f,0.882813f, +0.835938f,0.882813f, +0.84375f,0.882813f, +0.851563f,0.882813f, +0.859375f,0.882813f, +0.867188f,0.882813f, +0.875f,0.882813f, +0.882813f,0.882813f, +0.890625f,0.882813f, +0.898438f,0.882813f, +0.90625f,0.882813f, +0.914063f,0.882813f, +0.921875f,0.882813f, +0.929688f,0.882813f, +0.9375f,0.882813f, +0.945313f,0.882813f, +0.953125f,0.882813f, +0.960938f,0.882813f, +0.96875f,0.882813f, +0.976563f,0.882813f, +0.984375f,0.882813f, +0.992188f,0.882813f, +1.0f,0.882813f, +0.507813f,0.890625f, +0.515625f,0.890625f, +0.523438f,0.890625f, +0.53125f,0.890625f, +0.539063f,0.890625f, +0.546875f,0.890625f, +0.554688f,0.890625f, +0.5625f,0.890625f, +0.570313f,0.890625f, +0.578125f,0.890625f, +0.585938f,0.890625f, +0.59375f,0.890625f, +0.601563f,0.890625f, +0.609375f,0.890625f, +0.617188f,0.890625f, +0.625f,0.890625f, +0.632813f,0.890625f, +0.640625f,0.890625f, +0.648438f,0.890625f, +0.65625f,0.890625f, +0.664063f,0.890625f, +0.671875f,0.890625f, +0.679688f,0.890625f, +0.6875f,0.890625f, +0.695313f,0.890625f, +0.703125f,0.890625f, +0.710938f,0.890625f, +0.71875f,0.890625f, +0.726563f,0.890625f, +0.734375f,0.890625f, +0.742188f,0.890625f, +0.75f,0.890625f, +0.757813f,0.890625f, +0.765625f,0.890625f, +0.773438f,0.890625f, +0.78125f,0.890625f, +0.789063f,0.890625f, +0.796875f,0.890625f, +0.804688f,0.890625f, +0.8125f,0.890625f, +0.820313f,0.890625f, +0.828125f,0.890625f, +0.835938f,0.890625f, +0.84375f,0.890625f, +0.851563f,0.890625f, +0.859375f,0.890625f, +0.867188f,0.890625f, +0.875f,0.890625f, +0.882813f,0.890625f, +0.890625f,0.890625f, +0.898438f,0.890625f, +0.90625f,0.890625f, +0.914063f,0.890625f, +0.921875f,0.890625f, +0.929688f,0.890625f, +0.9375f,0.890625f, +0.945313f,0.890625f, +0.953125f,0.890625f, +0.960938f,0.890625f, +0.96875f,0.890625f, +0.976563f,0.890625f, +0.984375f,0.890625f, +0.992188f,0.890625f, +1.0f,0.890625f, +0.507813f,0.898438f, +0.515625f,0.898438f, +0.523438f,0.898438f, +0.53125f,0.898438f, +0.539063f,0.898438f, +0.546875f,0.898438f, +0.554688f,0.898438f, +0.5625f,0.898438f, +0.570313f,0.898438f, +0.578125f,0.898438f, +0.585938f,0.898438f, +0.59375f,0.898438f, +0.601563f,0.898438f, +0.609375f,0.898438f, +0.617188f,0.898438f, +0.625f,0.898438f, +0.632813f,0.898438f, +0.640625f,0.898438f, +0.648438f,0.898438f, +0.65625f,0.898438f, +0.664063f,0.898438f, +0.671875f,0.898438f, +0.679688f,0.898438f, +0.6875f,0.898438f, +0.695313f,0.898438f, +0.703125f,0.898438f, +0.710938f,0.898438f, +0.71875f,0.898438f, +0.726563f,0.898438f, +0.734375f,0.898438f, +0.742188f,0.898438f, +0.75f,0.898438f, +0.757813f,0.898438f, +0.765625f,0.898438f, +0.773438f,0.898438f, +0.78125f,0.898438f, +0.789063f,0.898438f, +0.796875f,0.898438f, +0.804688f,0.898438f, +0.8125f,0.898438f, +0.820313f,0.898438f, +0.828125f,0.898438f, +0.835938f,0.898438f, +0.84375f,0.898438f, +0.851563f,0.898438f, +0.859375f,0.898438f, +0.867188f,0.898438f, +0.875f,0.898438f, +0.882813f,0.898438f, +0.890625f,0.898438f, +0.898438f,0.898438f, +0.90625f,0.898438f, +0.914063f,0.898438f, +0.921875f,0.898438f, +0.929688f,0.898438f, +0.9375f,0.898438f, +0.945313f,0.898438f, +0.953125f,0.898438f, +0.960938f,0.898438f, +0.96875f,0.898438f, +0.976563f,0.898438f, +0.984375f,0.898438f, +0.992188f,0.898438f, +1.0f,0.898438f, +0.507813f,0.90625f, +0.515625f,0.90625f, +0.523438f,0.90625f, +0.53125f,0.90625f, +0.539063f,0.90625f, +0.546875f,0.90625f, +0.554688f,0.90625f, +0.5625f,0.90625f, +0.570313f,0.90625f, +0.578125f,0.90625f, +0.585938f,0.90625f, +0.59375f,0.90625f, +0.601563f,0.90625f, +0.609375f,0.90625f, +0.617188f,0.90625f, +0.625f,0.90625f, +0.632813f,0.90625f, +0.640625f,0.90625f, +0.648438f,0.90625f, +0.65625f,0.90625f, +0.664063f,0.90625f, +0.671875f,0.90625f, +0.679688f,0.90625f, +0.6875f,0.90625f, +0.695313f,0.90625f, +0.703125f,0.90625f, +0.710938f,0.90625f, +0.71875f,0.90625f, +0.726563f,0.90625f, +0.734375f,0.90625f, +0.742188f,0.90625f, +0.75f,0.90625f, +0.757813f,0.90625f, +0.765625f,0.90625f, +0.773438f,0.90625f, +0.78125f,0.90625f, +0.789063f,0.90625f, +0.796875f,0.90625f, +0.804688f,0.90625f, +0.8125f,0.90625f, +0.820313f,0.90625f, +0.828125f,0.90625f, +0.835938f,0.90625f, +0.84375f,0.90625f, +0.851563f,0.90625f, +0.859375f,0.90625f, +0.867188f,0.90625f, +0.875f,0.90625f, +0.882813f,0.90625f, +0.890625f,0.90625f, +0.898438f,0.90625f, +0.90625f,0.90625f, +0.914063f,0.90625f, +0.921875f,0.90625f, +0.929688f,0.90625f, +0.9375f,0.90625f, +0.945313f,0.90625f, +0.953125f,0.90625f, +0.960938f,0.90625f, +0.96875f,0.90625f, +0.976563f,0.90625f, +0.984375f,0.90625f, +0.992188f,0.90625f, +1.0f,0.90625f, +0.507813f,0.914063f, +0.515625f,0.914063f, +0.523438f,0.914063f, +0.53125f,0.914063f, +0.539063f,0.914063f, +0.546875f,0.914063f, +0.554688f,0.914063f, +0.5625f,0.914063f, +0.570313f,0.914063f, +0.578125f,0.914063f, +0.585938f,0.914063f, +0.59375f,0.914063f, +0.601563f,0.914063f, +0.609375f,0.914063f, +0.617188f,0.914063f, +0.625f,0.914063f, +0.632813f,0.914063f, +0.640625f,0.914063f, +0.648438f,0.914063f, +0.65625f,0.914063f, +0.664063f,0.914063f, +0.671875f,0.914063f, +0.679688f,0.914063f, +0.6875f,0.914063f, +0.695313f,0.914063f, +0.703125f,0.914063f, +0.710938f,0.914063f, +0.71875f,0.914063f, +0.726563f,0.914063f, +0.734375f,0.914063f, +0.742188f,0.914063f, +0.75f,0.914063f, +0.757813f,0.914063f, +0.765625f,0.914063f, +0.773438f,0.914063f, +0.78125f,0.914063f, +0.789063f,0.914063f, +0.796875f,0.914063f, +0.804688f,0.914063f, +0.8125f,0.914063f, +0.820313f,0.914063f, +0.828125f,0.914063f, +0.835938f,0.914063f, +0.84375f,0.914063f, +0.851563f,0.914063f, +0.859375f,0.914063f, +0.867188f,0.914063f, +0.875f,0.914063f, +0.882813f,0.914063f, +0.890625f,0.914063f, +0.898438f,0.914063f, +0.90625f,0.914063f, +0.914063f,0.914063f, +0.921875f,0.914063f, +0.929688f,0.914063f, +0.9375f,0.914063f, +0.945313f,0.914063f, +0.953125f,0.914063f, +0.960938f,0.914063f, +0.96875f,0.914063f, +0.976563f,0.914063f, +0.984375f,0.914063f, +0.992188f,0.914063f, +1.0f,0.914063f, +0.507813f,0.921875f, +0.515625f,0.921875f, +0.523438f,0.921875f, +0.53125f,0.921875f, +0.539063f,0.921875f, +0.546875f,0.921875f, +0.554688f,0.921875f, +0.5625f,0.921875f, +0.570313f,0.921875f, +0.578125f,0.921875f, +0.585938f,0.921875f, +0.59375f,0.921875f, +0.601563f,0.921875f, +0.609375f,0.921875f, +0.617188f,0.921875f, +0.625f,0.921875f, +0.632813f,0.921875f, +0.640625f,0.921875f, +0.648438f,0.921875f, +0.65625f,0.921875f, +0.664063f,0.921875f, +0.671875f,0.921875f, +0.679688f,0.921875f, +0.6875f,0.921875f, +0.695313f,0.921875f, +0.703125f,0.921875f, +0.710938f,0.921875f, +0.71875f,0.921875f, +0.726563f,0.921875f, +0.734375f,0.921875f, +0.742188f,0.921875f, +0.75f,0.921875f, +0.757813f,0.921875f, +0.765625f,0.921875f, +0.773438f,0.921875f, +0.78125f,0.921875f, +0.789063f,0.921875f, +0.796875f,0.921875f, +0.804688f,0.921875f, +0.8125f,0.921875f, +0.820313f,0.921875f, +0.828125f,0.921875f, +0.835938f,0.921875f, +0.84375f,0.921875f, +0.851563f,0.921875f, +0.859375f,0.921875f, +0.867188f,0.921875f, +0.875f,0.921875f, +0.882813f,0.921875f, +0.890625f,0.921875f, +0.898438f,0.921875f, +0.90625f,0.921875f, +0.914063f,0.921875f, +0.921875f,0.921875f, +0.929688f,0.921875f, +0.9375f,0.921875f, +0.945313f,0.921875f, +0.953125f,0.921875f, +0.960938f,0.921875f, +0.96875f,0.921875f, +0.976563f,0.921875f, +0.984375f,0.921875f, +0.992188f,0.921875f, +1.0f,0.921875f, +0.507813f,0.929688f, +0.515625f,0.929688f, +0.523438f,0.929688f, +0.53125f,0.929688f, +0.539063f,0.929688f, +0.546875f,0.929688f, +0.554688f,0.929688f, +0.5625f,0.929688f, +0.570313f,0.929688f, +0.578125f,0.929688f, +0.585938f,0.929688f, +0.59375f,0.929688f, +0.601563f,0.929688f, +0.609375f,0.929688f, +0.617188f,0.929688f, +0.625f,0.929688f, +0.632813f,0.929688f, +0.640625f,0.929688f, +0.648438f,0.929688f, +0.65625f,0.929688f, +0.664063f,0.929688f, +0.671875f,0.929688f, +0.679688f,0.929688f, +0.6875f,0.929688f, +0.695313f,0.929688f, +0.703125f,0.929688f, +0.710938f,0.929688f, +0.71875f,0.929688f, +0.726563f,0.929688f, +0.734375f,0.929688f, +0.742188f,0.929688f, +0.75f,0.929688f, +0.757813f,0.929688f, +0.765625f,0.929688f, +0.773438f,0.929688f, +0.78125f,0.929688f, +0.789063f,0.929688f, +0.796875f,0.929688f, +0.804688f,0.929688f, +0.8125f,0.929688f, +0.820313f,0.929688f, +0.828125f,0.929688f, +0.835938f,0.929688f, +0.84375f,0.929688f, +0.851563f,0.929688f, +0.859375f,0.929688f, +0.867188f,0.929688f, +0.875f,0.929688f, +0.882813f,0.929688f, +0.890625f,0.929688f, +0.898438f,0.929688f, +0.90625f,0.929688f, +0.914063f,0.929688f, +0.921875f,0.929688f, +0.929688f,0.929688f, +0.9375f,0.929688f, +0.945313f,0.929688f, +0.953125f,0.929688f, +0.960938f,0.929688f, +0.96875f,0.929688f, +0.976563f,0.929688f, +0.984375f,0.929688f, +0.992188f,0.929688f, +1.0f,0.929688f, +0.507813f,0.9375f, +0.515625f,0.9375f, +0.523438f,0.9375f, +0.53125f,0.9375f, +0.539063f,0.9375f, +0.546875f,0.9375f, +0.554688f,0.9375f, +0.5625f,0.9375f, +0.570313f,0.9375f, +0.578125f,0.9375f, +0.585938f,0.9375f, +0.59375f,0.9375f, +0.601563f,0.9375f, +0.609375f,0.9375f, +0.617188f,0.9375f, +0.625f,0.9375f, +0.632813f,0.9375f, +0.640625f,0.9375f, +0.648438f,0.9375f, +0.65625f,0.9375f, +0.664063f,0.9375f, +0.671875f,0.9375f, +0.679688f,0.9375f, +0.6875f,0.9375f, +0.695313f,0.9375f, +0.703125f,0.9375f, +0.710938f,0.9375f, +0.71875f,0.9375f, +0.726563f,0.9375f, +0.734375f,0.9375f, +0.742188f,0.9375f, +0.75f,0.9375f, +0.757813f,0.9375f, +0.765625f,0.9375f, +0.773438f,0.9375f, +0.78125f,0.9375f, +0.789063f,0.9375f, +0.796875f,0.9375f, +0.804688f,0.9375f, +0.8125f,0.9375f, +0.820313f,0.9375f, +0.828125f,0.9375f, +0.835938f,0.9375f, +0.84375f,0.9375f, +0.851563f,0.9375f, +0.859375f,0.9375f, +0.867188f,0.9375f, +0.875f,0.9375f, +0.882813f,0.9375f, +0.890625f,0.9375f, +0.898438f,0.9375f, +0.90625f,0.9375f, +0.914063f,0.9375f, +0.921875f,0.9375f, +0.929688f,0.9375f, +0.9375f,0.9375f, +0.945313f,0.9375f, +0.953125f,0.9375f, +0.960938f,0.9375f, +0.96875f,0.9375f, +0.976563f,0.9375f, +0.984375f,0.9375f, +0.992188f,0.9375f, +1.0f,0.9375f, +0.507813f,0.945313f, +0.515625f,0.945313f, +0.523438f,0.945313f, +0.53125f,0.945313f, +0.539063f,0.945313f, +0.546875f,0.945313f, +0.554688f,0.945313f, +0.5625f,0.945313f, +0.570313f,0.945313f, +0.578125f,0.945313f, +0.585938f,0.945313f, +0.59375f,0.945313f, +0.601563f,0.945313f, +0.609375f,0.945313f, +0.617188f,0.945313f, +0.625f,0.945313f, +0.632813f,0.945313f, +0.640625f,0.945313f, +0.648438f,0.945313f, +0.65625f,0.945313f, +0.664063f,0.945313f, +0.671875f,0.945313f, +0.679688f,0.945313f, +0.6875f,0.945313f, +0.695313f,0.945313f, +0.703125f,0.945313f, +0.710938f,0.945313f, +0.71875f,0.945313f, +0.726563f,0.945313f, +0.734375f,0.945313f, +0.742188f,0.945313f, +0.75f,0.945313f, +0.757813f,0.945313f, +0.765625f,0.945313f, +0.773438f,0.945313f, +0.78125f,0.945313f, +0.789063f,0.945313f, +0.796875f,0.945313f, +0.804688f,0.945313f, +0.8125f,0.945313f, +0.820313f,0.945313f, +0.828125f,0.945313f, +0.835938f,0.945313f, +0.84375f,0.945313f, +0.851563f,0.945313f, +0.859375f,0.945313f, +0.867188f,0.945313f, +0.875f,0.945313f, +0.882813f,0.945313f, +0.890625f,0.945313f, +0.898438f,0.945313f, +0.90625f,0.945313f, +0.914063f,0.945313f, +0.921875f,0.945313f, +0.929688f,0.945313f, +0.9375f,0.945313f, +0.945313f,0.945313f, +0.953125f,0.945313f, +0.960938f,0.945313f, +0.96875f,0.945313f, +0.976563f,0.945313f, +0.984375f,0.945313f, +0.992188f,0.945313f, +1.0f,0.945313f, +0.507813f,0.953125f, +0.515625f,0.953125f, +0.523438f,0.953125f, +0.53125f,0.953125f, +0.539063f,0.953125f, +0.546875f,0.953125f, +0.554688f,0.953125f, +0.5625f,0.953125f, +0.570313f,0.953125f, +0.578125f,0.953125f, +0.585938f,0.953125f, +0.59375f,0.953125f, +0.601563f,0.953125f, +0.609375f,0.953125f, +0.617188f,0.953125f, +0.625f,0.953125f, +0.632813f,0.953125f, +0.640625f,0.953125f, +0.648438f,0.953125f, +0.65625f,0.953125f, +0.664063f,0.953125f, +0.671875f,0.953125f, +0.679688f,0.953125f, +0.6875f,0.953125f, +0.695313f,0.953125f, +0.703125f,0.953125f, +0.710938f,0.953125f, +0.71875f,0.953125f, +0.726563f,0.953125f, +0.734375f,0.953125f, +0.742188f,0.953125f, +0.75f,0.953125f, +0.757813f,0.953125f, +0.765625f,0.953125f, +0.773438f,0.953125f, +0.78125f,0.953125f, +0.789063f,0.953125f, +0.796875f,0.953125f, +0.804688f,0.953125f, +0.8125f,0.953125f, +0.820313f,0.953125f, +0.828125f,0.953125f, +0.835938f,0.953125f, +0.84375f,0.953125f, +0.851563f,0.953125f, +0.859375f,0.953125f, +0.867188f,0.953125f, +0.875f,0.953125f, +0.882813f,0.953125f, +0.890625f,0.953125f, +0.898438f,0.953125f, +0.90625f,0.953125f, +0.914063f,0.953125f, +0.921875f,0.953125f, +0.929688f,0.953125f, +0.9375f,0.953125f, +0.945313f,0.953125f, +0.953125f,0.953125f, +0.960938f,0.953125f, +0.96875f,0.953125f, +0.976563f,0.953125f, +0.984375f,0.953125f, +0.992188f,0.953125f, +1.0f,0.953125f, +0.507813f,0.960938f, +0.515625f,0.960938f, +0.523438f,0.960938f, +0.53125f,0.960938f, +0.539063f,0.960938f, +0.546875f,0.960938f, +0.554688f,0.960938f, +0.5625f,0.960938f, +0.570313f,0.960938f, +0.578125f,0.960938f, +0.585938f,0.960938f, +0.59375f,0.960938f, +0.601563f,0.960938f, +0.609375f,0.960938f, +0.617188f,0.960938f, +0.625f,0.960938f, +0.632813f,0.960938f, +0.640625f,0.960938f, +0.648438f,0.960938f, +0.65625f,0.960938f, +0.664063f,0.960938f, +0.671875f,0.960938f, +0.679688f,0.960938f, +0.6875f,0.960938f, +0.695313f,0.960938f, +0.703125f,0.960938f, +0.710938f,0.960938f, +0.71875f,0.960938f, +0.726563f,0.960938f, +0.734375f,0.960938f, +0.742188f,0.960938f, +0.75f,0.960938f, +0.757813f,0.960938f, +0.765625f,0.960938f, +0.773438f,0.960938f, +0.78125f,0.960938f, +0.789063f,0.960938f, +0.796875f,0.960938f, +0.804688f,0.960938f, +0.8125f,0.960938f, +0.820313f,0.960938f, +0.828125f,0.960938f, +0.835938f,0.960938f, +0.84375f,0.960938f, +0.851563f,0.960938f, +0.859375f,0.960938f, +0.867188f,0.960938f, +0.875f,0.960938f, +0.882813f,0.960938f, +0.890625f,0.960938f, +0.898438f,0.960938f, +0.90625f,0.960938f, +0.914063f,0.960938f, +0.921875f,0.960938f, +0.929688f,0.960938f, +0.9375f,0.960938f, +0.945313f,0.960938f, +0.953125f,0.960938f, +0.960938f,0.960938f, +0.96875f,0.960938f, +0.976563f,0.960938f, +0.984375f,0.960938f, +0.992188f,0.960938f, +1.0f,0.960938f, +0.507813f,0.96875f, +0.515625f,0.96875f, +0.523438f,0.96875f, +0.53125f,0.96875f, +0.539063f,0.96875f, +0.546875f,0.96875f, +0.554688f,0.96875f, +0.5625f,0.96875f, +0.570313f,0.96875f, +0.578125f,0.96875f, +0.585938f,0.96875f, +0.59375f,0.96875f, +0.601563f,0.96875f, +0.609375f,0.96875f, +0.617188f,0.96875f, +0.625f,0.96875f, +0.632813f,0.96875f, +0.640625f,0.96875f, +0.648438f,0.96875f, +0.65625f,0.96875f, +0.664063f,0.96875f, +0.671875f,0.96875f, +0.679688f,0.96875f, +0.6875f,0.96875f, +0.695313f,0.96875f, +0.703125f,0.96875f, +0.710938f,0.96875f, +0.71875f,0.96875f, +0.726563f,0.96875f, +0.734375f,0.96875f, +0.742188f,0.96875f, +0.75f,0.96875f, +0.757813f,0.96875f, +0.765625f,0.96875f, +0.773438f,0.96875f, +0.78125f,0.96875f, +0.789063f,0.96875f, +0.796875f,0.96875f, +0.804688f,0.96875f, +0.8125f,0.96875f, +0.820313f,0.96875f, +0.828125f,0.96875f, +0.835938f,0.96875f, +0.84375f,0.96875f, +0.851563f,0.96875f, +0.859375f,0.96875f, +0.867188f,0.96875f, +0.875f,0.96875f, +0.882813f,0.96875f, +0.890625f,0.96875f, +0.898438f,0.96875f, +0.90625f,0.96875f, +0.914063f,0.96875f, +0.921875f,0.96875f, +0.929688f,0.96875f, +0.9375f,0.96875f, +0.945313f,0.96875f, +0.953125f,0.96875f, +0.960938f,0.96875f, +0.96875f,0.96875f, +0.976563f,0.96875f, +0.984375f,0.96875f, +0.992188f,0.96875f, +1.0f,0.96875f, +0.507813f,0.976563f, +0.515625f,0.976563f, +0.523438f,0.976563f, +0.53125f,0.976563f, +0.539063f,0.976563f, +0.546875f,0.976563f, +0.554688f,0.976563f, +0.5625f,0.976563f, +0.570313f,0.976563f, +0.578125f,0.976563f, +0.585938f,0.976563f, +0.59375f,0.976563f, +0.601563f,0.976563f, +0.609375f,0.976563f, +0.617188f,0.976563f, +0.625f,0.976563f, +0.632813f,0.976563f, +0.640625f,0.976563f, +0.648438f,0.976563f, +0.65625f,0.976563f, +0.664063f,0.976563f, +0.671875f,0.976563f, +0.679688f,0.976563f, +0.6875f,0.976563f, +0.695313f,0.976563f, +0.703125f,0.976563f, +0.710938f,0.976563f, +0.71875f,0.976563f, +0.726563f,0.976563f, +0.734375f,0.976563f, +0.742188f,0.976563f, +0.75f,0.976563f, +0.757813f,0.976563f, +0.765625f,0.976563f, +0.773438f,0.976563f, +0.78125f,0.976563f, +0.789063f,0.976563f, +0.796875f,0.976563f, +0.804688f,0.976563f, +0.8125f,0.976563f, +0.820313f,0.976563f, +0.828125f,0.976563f, +0.835938f,0.976563f, +0.84375f,0.976563f, +0.851563f,0.976563f, +0.859375f,0.976563f, +0.867188f,0.976563f, +0.875f,0.976563f, +0.882813f,0.976563f, +0.890625f,0.976563f, +0.898438f,0.976563f, +0.90625f,0.976563f, +0.914063f,0.976563f, +0.921875f,0.976563f, +0.929688f,0.976563f, +0.9375f,0.976563f, +0.945313f,0.976563f, +0.953125f,0.976563f, +0.960938f,0.976563f, +0.96875f,0.976563f, +0.976563f,0.976563f, +0.984375f,0.976563f, +0.992188f,0.976563f, +1.0f,0.976563f, +0.507813f,0.984375f, +0.515625f,0.984375f, +0.523438f,0.984375f, +0.53125f,0.984375f, +0.539063f,0.984375f, +0.546875f,0.984375f, +0.554688f,0.984375f, +0.5625f,0.984375f, +0.570313f,0.984375f, +0.578125f,0.984375f, +0.585938f,0.984375f, +0.59375f,0.984375f, +0.601563f,0.984375f, +0.609375f,0.984375f, +0.617188f,0.984375f, +0.625f,0.984375f, +0.632813f,0.984375f, +0.640625f,0.984375f, +0.648438f,0.984375f, +0.65625f,0.984375f, +0.664063f,0.984375f, +0.671875f,0.984375f, +0.679688f,0.984375f, +0.6875f,0.984375f, +0.695313f,0.984375f, +0.703125f,0.984375f, +0.710938f,0.984375f, +0.71875f,0.984375f, +0.726563f,0.984375f, +0.734375f,0.984375f, +0.742188f,0.984375f, +0.75f,0.984375f, +0.757813f,0.984375f, +0.765625f,0.984375f, +0.773438f,0.984375f, +0.78125f,0.984375f, +0.789063f,0.984375f, +0.796875f,0.984375f, +0.804688f,0.984375f, +0.8125f,0.984375f, +0.820313f,0.984375f, +0.828125f,0.984375f, +0.835938f,0.984375f, +0.84375f,0.984375f, +0.851563f,0.984375f, +0.859375f,0.984375f, +0.867188f,0.984375f, +0.875f,0.984375f, +0.882813f,0.984375f, +0.890625f,0.984375f, +0.898438f,0.984375f, +0.90625f,0.984375f, +0.914063f,0.984375f, +0.921875f,0.984375f, +0.929688f,0.984375f, +0.9375f,0.984375f, +0.945313f,0.984375f, +0.953125f,0.984375f, +0.960938f,0.984375f, +0.96875f,0.984375f, +0.976563f,0.984375f, +0.984375f,0.984375f, +0.992188f,0.984375f, +1.0f,0.984375f, +0.507813f,0.992188f, +0.515625f,0.992188f, +0.523438f,0.992188f, +0.53125f,0.992188f, +0.539063f,0.992188f, +0.546875f,0.992188f, +0.554688f,0.992188f, +0.5625f,0.992188f, +0.570313f,0.992188f, +0.578125f,0.992188f, +0.585938f,0.992188f, +0.59375f,0.992188f, +0.601563f,0.992188f, +0.609375f,0.992188f, +0.617188f,0.992188f, +0.625f,0.992188f, +0.632813f,0.992188f, +0.640625f,0.992188f, +0.648438f,0.992188f, +0.65625f,0.992188f, +0.664063f,0.992188f, +0.671875f,0.992188f, +0.679688f,0.992188f, +0.6875f,0.992188f, +0.695313f,0.992188f, +0.703125f,0.992188f, +0.710938f,0.992188f, +0.71875f,0.992188f, +0.726563f,0.992188f, +0.734375f,0.992188f, +0.742188f,0.992188f, +0.75f,0.992188f, +0.757813f,0.992188f, +0.765625f,0.992188f, +0.773438f,0.992188f, +0.78125f,0.992188f, +0.789063f,0.992188f, +0.796875f,0.992188f, +0.804688f,0.992188f, +0.8125f,0.992188f, +0.820313f,0.992188f, +0.828125f,0.992188f, +0.835938f,0.992188f, +0.84375f,0.992188f, +0.851563f,0.992188f, +0.859375f,0.992188f, +0.867188f,0.992188f, +0.875f,0.992188f, +0.882813f,0.992188f, +0.890625f,0.992188f, +0.898438f,0.992188f, +0.90625f,0.992188f, +0.914063f,0.992188f, +0.921875f,0.992188f, +0.929688f,0.992188f, +0.9375f,0.992188f, +0.945313f,0.992188f, +0.953125f,0.992188f, +0.960938f,0.992188f, +0.96875f,0.992188f, +0.976563f,0.992188f, +0.984375f,0.992188f, +0.992188f,0.992188f, +1.0f,0.992188f, +0.507813f,1.0f, +0.515625f,1.0f, +0.523438f,1.0f, +0.53125f,1.0f, +0.539063f,1.0f, +0.546875f,1.0f, +0.554688f,1.0f, +0.5625f,1.0f, +0.570313f,1.0f, +0.578125f,1.0f, +0.585938f,1.0f, +0.59375f,1.0f, +0.601563f,1.0f, +0.609375f,1.0f, +0.617188f,1.0f, +0.625f,1.0f, +0.632813f,1.0f, +0.640625f,1.0f, +0.648438f,1.0f, +0.65625f,1.0f, +0.664063f,1.0f, +0.671875f,1.0f, +0.679688f,1.0f, +0.6875f,1.0f, +0.695313f,1.0f, +0.703125f,1.0f, +0.710938f,1.0f, +0.71875f,1.0f, +0.726563f,1.0f, +0.734375f,1.0f, +0.742188f,1.0f, +0.75f,1.0f, +0.757813f,1.0f, +0.765625f,1.0f, +0.773438f,1.0f, +0.78125f,1.0f, +0.789063f,1.0f, +0.796875f,1.0f, +0.804688f,1.0f, +0.8125f,1.0f, +0.820313f,1.0f, +0.828125f,1.0f, +0.835938f,1.0f, +0.84375f,1.0f, +0.851563f,1.0f, +0.859375f,1.0f, +0.867188f,1.0f, +0.875f,1.0f, +0.882813f,1.0f, +0.890625f,1.0f, +0.898438f,1.0f, +0.90625f,1.0f, +0.914063f,1.0f, +0.921875f,1.0f, +0.929688f,1.0f, +0.9375f,1.0f, +0.945313f,1.0f, +0.953125f,1.0f, +0.960938f,1.0f, +0.96875f,1.0f, +0.976563f,1.0f, +0.984375f,1.0f, +0.992188f,1.0f, +1.0f,1.0f, +}; + +unsigned short Landscape07Idx[] = { +0,1,2, +3,2,1, +2,3,4, +5,4,3, +4,5,6, +7,6,5, +6,7,8, +9,8,7, +8,9,10, +11,10,9, +10,11,12, +13,12,11, +12,13,14, +15,14,13, +14,15,16, +17,16,15, +16,17,18, +19,18,17, +18,19,20, +21,20,19, +20,21,22, +23,22,21, +22,23,24, +25,24,23, +24,25,26, +27,26,25, +26,27,28, +29,28,27, +28,29,30, +31,30,29, +30,31,32, +33,32,31, +32,33,34, +35,34,33, +34,35,36, +37,36,35, +36,37,38, +39,38,37, +38,39,40, +41,40,39, +40,41,42, +43,42,41, +42,43,44, +45,44,43, +44,45,46, +47,46,45, +46,47,48, +49,48,47, +48,49,50, +51,50,49, +50,51,52, +53,52,51, +52,53,54, +55,54,53, +54,55,56, +57,56,55, +56,57,58, +59,58,57, +58,59,60, +61,60,59, +60,61,62, +63,62,61, +62,63,64, +65,64,63, +64,65,66, +67,66,65, +66,67,68, +69,68,67, +68,69,70, +71,70,69, +70,71,72, +73,72,71, +72,73,74, +75,74,73, +74,75,76, +77,76,75, +76,77,78, +79,78,77, +78,79,80, +81,80,79, +80,81,82, +83,82,81, +82,83,84, +85,84,83, +84,85,86, +87,86,85, +86,87,88, +89,88,87, +88,89,90, +91,90,89, +90,91,92, +93,92,91, +92,93,94, +95,94,93, +94,95,96, +97,96,95, +96,97,98, +99,98,97, +98,99,100, +101,100,99, +100,101,102, +103,102,101, +102,103,104, +105,104,103, +104,105,106, +107,106,105, +106,107,108, +109,108,107, +108,109,110, +111,110,109, +110,111,112, +113,112,111, +112,113,114, +115,114,113, +114,115,116, +117,116,115, +116,117,118, +119,118,117, +118,119,120, +121,120,119, +120,121,122, +123,122,121, +122,123,124, +125,124,123, +124,125,126, +127,126,125, +128,0,129, +2,129,0, +129,2,130, +4,130,2, +130,4,131, +6,131,4, +131,6,132, +8,132,6, +132,8,133, +10,133,8, +133,10,134, +12,134,10, +134,12,135, +14,135,12, +135,14,136, +16,136,14, +136,16,137, +18,137,16, +137,18,138, +20,138,18, +138,20,139, +22,139,20, +139,22,140, +24,140,22, +140,24,141, +26,141,24, +141,26,142, +28,142,26, +142,28,143, +30,143,28, +143,30,144, +32,144,30, +144,32,145, +34,145,32, +145,34,146, +36,146,34, +146,36,147, +38,147,36, +147,38,148, +40,148,38, +148,40,149, +42,149,40, +149,42,150, +44,150,42, +150,44,151, +46,151,44, +151,46,152, +48,152,46, +152,48,153, +50,153,48, +153,50,154, +52,154,50, +154,52,155, +54,155,52, +155,54,156, +56,156,54, +156,56,157, +58,157,56, +157,58,158, +60,158,58, +158,60,159, +62,159,60, +159,62,160, +64,160,62, +160,64,161, +66,161,64, +161,66,162, +68,162,66, +162,68,163, +70,163,68, +163,70,164, +72,164,70, +164,72,165, +74,165,72, +165,74,166, +76,166,74, +166,76,167, +78,167,76, +167,78,168, +80,168,78, +168,80,169, +82,169,80, +169,82,170, +84,170,82, +170,84,171, +86,171,84, +171,86,172, +88,172,86, +172,88,173, +90,173,88, +173,90,174, +92,174,90, +174,92,175, +94,175,92, +175,94,176, +96,176,94, +176,96,177, +98,177,96, +177,98,178, +100,178,98, +178,100,179, +102,179,100, +179,102,180, +104,180,102, +180,104,181, +106,181,104, +181,106,182, +108,182,106, +182,108,183, +110,183,108, +183,110,184, +112,184,110, +184,112,185, +114,185,112, +185,114,186, +116,186,114, +186,116,187, +118,187,116, +187,118,188, +120,188,118, +188,120,189, +122,189,120, +189,122,190, +124,190,122, +190,124,191, +126,191,124, +192,128,193, +129,193,128, +193,129,194, +130,194,129, +194,130,195, +131,195,130, +195,131,196, +132,196,131, +196,132,197, +133,197,132, +197,133,198, +134,198,133, +198,134,199, +135,199,134, +199,135,200, +136,200,135, +200,136,201, +137,201,136, +201,137,202, +138,202,137, +202,138,203, +139,203,138, +203,139,204, +140,204,139, +204,140,205, +141,205,140, +205,141,206, +142,206,141, +206,142,207, +143,207,142, +207,143,208, +144,208,143, +208,144,209, +145,209,144, +209,145,210, +146,210,145, +210,146,211, +147,211,146, +211,147,212, +148,212,147, +212,148,213, +149,213,148, +213,149,214, +150,214,149, +214,150,215, +151,215,150, +215,151,216, +152,216,151, +216,152,217, +153,217,152, +217,153,218, +154,218,153, +218,154,219, +155,219,154, +219,155,220, +156,220,155, +220,156,221, +157,221,156, +221,157,222, +158,222,157, +222,158,223, +159,223,158, +223,159,224, +160,224,159, +224,160,225, +161,225,160, +225,161,226, +162,226,161, +226,162,227, +163,227,162, +227,163,228, +164,228,163, +228,164,229, +165,229,164, +229,165,230, +166,230,165, +230,166,231, +167,231,166, +231,167,232, +168,232,167, +232,168,233, +169,233,168, +233,169,234, +170,234,169, +234,170,235, +171,235,170, +235,171,236, +172,236,171, +236,172,237, +173,237,172, +237,173,238, +174,238,173, +238,174,239, +175,239,174, +239,175,240, +176,240,175, +240,176,241, +177,241,176, +241,177,242, +178,242,177, +242,178,243, +179,243,178, +243,179,244, +180,244,179, +244,180,245, +181,245,180, +245,181,246, +182,246,181, +246,182,247, +183,247,182, +247,183,248, +184,248,183, +248,184,249, +185,249,184, +249,185,250, +186,250,185, +250,186,251, +187,251,186, +251,187,252, +188,252,187, +252,188,253, +189,253,188, +253,189,254, +190,254,189, +254,190,255, +191,255,190, +256,192,257, +193,257,192, +257,193,258, +194,258,193, +258,194,259, +195,259,194, +259,195,260, +196,260,195, +260,196,261, +197,261,196, +261,197,262, +198,262,197, +262,198,263, +199,263,198, +263,199,264, +200,264,199, +264,200,265, +201,265,200, +265,201,266, +202,266,201, +266,202,267, +203,267,202, +267,203,268, +204,268,203, +268,204,269, +205,269,204, +269,205,270, +206,270,205, +270,206,271, +207,271,206, +271,207,272, +208,272,207, +272,208,273, +209,273,208, +273,209,274, +210,274,209, +274,210,275, +211,275,210, +275,211,276, +212,276,211, +276,212,277, +213,277,212, +277,213,278, +214,278,213, +278,214,279, +215,279,214, +279,215,280, +216,280,215, +280,216,281, +217,281,216, +281,217,282, +218,282,217, +282,218,283, +219,283,218, +283,219,284, +220,284,219, +284,220,285, +221,285,220, +285,221,286, +222,286,221, +286,222,287, +223,287,222, +287,223,288, +224,288,223, +288,224,289, +225,289,224, +289,225,290, +226,290,225, +290,226,291, +227,291,226, +291,227,292, +228,292,227, +292,228,293, +229,293,228, +293,229,294, +230,294,229, +294,230,295, +231,295,230, +295,231,296, +232,296,231, +296,232,297, +233,297,232, +297,233,298, +234,298,233, +298,234,299, +235,299,234, +299,235,300, +236,300,235, +300,236,301, +237,301,236, +301,237,302, +238,302,237, +302,238,303, +239,303,238, +303,239,304, +240,304,239, +304,240,305, +241,305,240, +305,241,306, +242,306,241, +306,242,307, +243,307,242, +307,243,308, +244,308,243, +308,244,309, +245,309,244, +309,245,310, +246,310,245, +310,246,311, +247,311,246, +311,247,312, +248,312,247, +312,248,313, +249,313,248, +313,249,314, +250,314,249, +314,250,315, +251,315,250, +315,251,316, +252,316,251, +316,252,317, +253,317,252, +317,253,318, +254,318,253, +318,254,319, +255,319,254, +320,256,321, +257,321,256, +321,257,322, +258,322,257, +322,258,323, +259,323,258, +323,259,324, +260,324,259, +324,260,325, +261,325,260, +325,261,326, +262,326,261, +326,262,327, +263,327,262, +327,263,328, +264,328,263, +328,264,329, +265,329,264, +329,265,330, +266,330,265, +330,266,331, +267,331,266, +331,267,332, +268,332,267, +332,268,333, +269,333,268, +333,269,334, +270,334,269, +334,270,335, +271,335,270, +335,271,336, +272,336,271, +336,272,337, +273,337,272, +337,273,338, +274,338,273, +338,274,339, +275,339,274, +339,275,340, +276,340,275, +340,276,341, +277,341,276, +341,277,342, +278,342,277, +342,278,343, +279,343,278, +343,279,344, +280,344,279, +344,280,345, +281,345,280, +345,281,346, +282,346,281, +346,282,347, +283,347,282, +347,283,348, +284,348,283, +348,284,349, +285,349,284, +349,285,350, +286,350,285, +350,286,351, +287,351,286, +351,287,352, +288,352,287, +352,288,353, +289,353,288, +353,289,354, +290,354,289, +354,290,355, +291,355,290, +355,291,356, +292,356,291, +356,292,357, +293,357,292, +357,293,358, +294,358,293, +358,294,359, +295,359,294, +359,295,360, +296,360,295, +360,296,361, +297,361,296, +361,297,362, +298,362,297, +362,298,363, +299,363,298, +363,299,364, +300,364,299, +364,300,365, +301,365,300, +365,301,366, +302,366,301, +366,302,367, +303,367,302, +367,303,368, +304,368,303, +368,304,369, +305,369,304, +369,305,370, +306,370,305, +370,306,371, +307,371,306, +371,307,372, +308,372,307, +372,308,373, +309,373,308, +373,309,374, +310,374,309, +374,310,375, +311,375,310, +375,311,376, +312,376,311, +376,312,377, +313,377,312, +377,313,378, +314,378,313, +378,314,379, +315,379,314, +379,315,380, +316,380,315, +380,316,381, +317,381,316, +381,317,382, +318,382,317, +382,318,383, +319,383,318, +384,320,385, +321,385,320, +385,321,386, +322,386,321, +386,322,387, +323,387,322, +387,323,388, +324,388,323, +388,324,389, +325,389,324, +389,325,390, +326,390,325, +390,326,391, +327,391,326, +391,327,392, +328,392,327, +392,328,393, +329,393,328, +393,329,394, +330,394,329, +394,330,395, +331,395,330, +395,331,396, +332,396,331, +396,332,397, +333,397,332, +397,333,398, +334,398,333, +398,334,399, +335,399,334, +399,335,400, +336,400,335, +400,336,401, +337,401,336, +401,337,402, +338,402,337, +402,338,403, +339,403,338, +403,339,404, +340,404,339, +404,340,405, +341,405,340, +405,341,406, +342,406,341, +406,342,407, +343,407,342, +407,343,408, +344,408,343, +408,344,409, +345,409,344, +409,345,410, +346,410,345, +410,346,411, +347,411,346, +411,347,412, +348,412,347, +412,348,413, +349,413,348, +413,349,414, +350,414,349, +414,350,415, +351,415,350, +415,351,416, +352,416,351, +416,352,417, +353,417,352, +417,353,418, +354,418,353, +418,354,419, +355,419,354, +419,355,420, +356,420,355, +420,356,421, +357,421,356, +421,357,422, +358,422,357, +422,358,423, +359,423,358, +423,359,424, +360,424,359, +424,360,425, +361,425,360, +425,361,426, +362,426,361, +426,362,427, +363,427,362, +427,363,428, +364,428,363, +428,364,429, +365,429,364, +429,365,430, +366,430,365, +430,366,431, +367,431,366, +431,367,432, +368,432,367, +432,368,433, +369,433,368, +433,369,434, +370,434,369, +434,370,435, +371,435,370, +435,371,436, +372,436,371, +436,372,437, +373,437,372, +437,373,438, +374,438,373, +438,374,439, +375,439,374, +439,375,440, +376,440,375, +440,376,441, +377,441,376, +441,377,442, +378,442,377, +442,378,443, +379,443,378, +443,379,444, +380,444,379, +444,380,445, +381,445,380, +445,381,446, +382,446,381, +446,382,447, +383,447,382, +448,384,449, +385,449,384, +449,385,450, +386,450,385, +450,386,451, +387,451,386, +451,387,452, +388,452,387, +452,388,453, +389,453,388, +453,389,454, +390,454,389, +454,390,455, +391,455,390, +455,391,456, +392,456,391, +456,392,457, +393,457,392, +457,393,458, +394,458,393, +458,394,459, +395,459,394, +459,395,460, +396,460,395, +460,396,461, +397,461,396, +461,397,462, +398,462,397, +462,398,463, +399,463,398, +463,399,464, +400,464,399, +464,400,465, +401,465,400, +465,401,466, +402,466,401, +466,402,467, +403,467,402, +467,403,468, +404,468,403, +468,404,469, +405,469,404, +469,405,470, +406,470,405, +470,406,471, +407,471,406, +471,407,472, +408,472,407, +472,408,473, +409,473,408, +473,409,474, +410,474,409, +474,410,475, +411,475,410, +475,411,476, +412,476,411, +476,412,477, +413,477,412, +477,413,478, +414,478,413, +478,414,479, +415,479,414, +479,415,480, +416,480,415, +480,416,481, +417,481,416, +481,417,482, +418,482,417, +482,418,483, +419,483,418, +483,419,484, +420,484,419, +484,420,485, +421,485,420, +485,421,486, +422,486,421, +486,422,487, +423,487,422, +487,423,488, +424,488,423, +488,424,489, +425,489,424, +489,425,490, +426,490,425, +490,426,491, +427,491,426, +491,427,492, +428,492,427, +492,428,493, +429,493,428, +493,429,494, +430,494,429, +494,430,495, +431,495,430, +495,431,496, +432,496,431, +496,432,497, +433,497,432, +497,433,498, +434,498,433, +498,434,499, +435,499,434, +499,435,500, +436,500,435, +500,436,501, +437,501,436, +501,437,502, +438,502,437, +502,438,503, +439,503,438, +503,439,504, +440,504,439, +504,440,505, +441,505,440, +505,441,506, +442,506,441, +506,442,507, +443,507,442, +507,443,508, +444,508,443, +508,444,509, +445,509,444, +509,445,510, +446,510,445, +510,446,511, +447,511,446, +512,448,513, +449,513,448, +513,449,514, +450,514,449, +514,450,515, +451,515,450, +515,451,516, +452,516,451, +516,452,517, +453,517,452, +517,453,518, +454,518,453, +518,454,519, +455,519,454, +519,455,520, +456,520,455, +520,456,521, +457,521,456, +521,457,522, +458,522,457, +522,458,523, +459,523,458, +523,459,524, +460,524,459, +524,460,525, +461,525,460, +525,461,526, +462,526,461, +526,462,527, +463,527,462, +527,463,528, +464,528,463, +528,464,529, +465,529,464, +529,465,530, +466,530,465, +530,466,531, +467,531,466, +531,467,532, +468,532,467, +532,468,533, +469,533,468, +533,469,534, +470,534,469, +534,470,535, +471,535,470, +535,471,536, +472,536,471, +536,472,537, +473,537,472, +537,473,538, +474,538,473, +538,474,539, +475,539,474, +539,475,540, +476,540,475, +540,476,541, +477,541,476, +541,477,542, +478,542,477, +542,478,543, +479,543,478, +543,479,544, +480,544,479, +544,480,545, +481,545,480, +545,481,546, +482,546,481, +546,482,547, +483,547,482, +547,483,548, +484,548,483, +548,484,549, +485,549,484, +549,485,550, +486,550,485, +550,486,551, +487,551,486, +551,487,552, +488,552,487, +552,488,553, +489,553,488, +553,489,554, +490,554,489, +554,490,555, +491,555,490, +555,491,556, +492,556,491, +556,492,557, +493,557,492, +557,493,558, +494,558,493, +558,494,559, +495,559,494, +559,495,560, +496,560,495, +560,496,561, +497,561,496, +561,497,562, +498,562,497, +562,498,563, +499,563,498, +563,499,564, +500,564,499, +564,500,565, +501,565,500, +565,501,566, +502,566,501, +566,502,567, +503,567,502, +567,503,568, +504,568,503, +568,504,569, +505,569,504, +569,505,570, +506,570,505, +570,506,571, +507,571,506, +571,507,572, +508,572,507, +572,508,573, +509,573,508, +573,509,574, +510,574,509, +574,510,575, +511,575,510, +576,512,577, +513,577,512, +577,513,578, +514,578,513, +578,514,579, +515,579,514, +579,515,580, +516,580,515, +580,516,581, +517,581,516, +581,517,582, +518,582,517, +582,518,583, +519,583,518, +583,519,584, +520,584,519, +584,520,585, +521,585,520, +585,521,586, +522,586,521, +586,522,587, +523,587,522, +587,523,588, +524,588,523, +588,524,589, +525,589,524, +589,525,590, +526,590,525, +590,526,591, +527,591,526, +591,527,592, +528,592,527, +592,528,593, +529,593,528, +593,529,594, +530,594,529, +594,530,595, +531,595,530, +595,531,596, +532,596,531, +596,532,597, +533,597,532, +597,533,598, +534,598,533, +598,534,599, +535,599,534, +599,535,600, +536,600,535, +600,536,601, +537,601,536, +601,537,602, +538,602,537, +602,538,603, +539,603,538, +603,539,604, +540,604,539, +604,540,605, +541,605,540, +605,541,606, +542,606,541, +606,542,607, +543,607,542, +607,543,608, +544,608,543, +608,544,609, +545,609,544, +609,545,610, +546,610,545, +610,546,611, +547,611,546, +611,547,612, +548,612,547, +612,548,613, +549,613,548, +613,549,614, +550,614,549, +614,550,615, +551,615,550, +615,551,616, +552,616,551, +616,552,617, +553,617,552, +617,553,618, +554,618,553, +618,554,619, +555,619,554, +619,555,620, +556,620,555, +620,556,621, +557,621,556, +621,557,622, +558,622,557, +622,558,623, +559,623,558, +623,559,624, +560,624,559, +624,560,625, +561,625,560, +625,561,626, +562,626,561, +626,562,627, +563,627,562, +627,563,628, +564,628,563, +628,564,629, +565,629,564, +629,565,630, +566,630,565, +630,566,631, +567,631,566, +631,567,632, +568,632,567, +632,568,633, +569,633,568, +633,569,634, +570,634,569, +634,570,635, +571,635,570, +635,571,636, +572,636,571, +636,572,637, +573,637,572, +637,573,638, +574,638,573, +638,574,639, +575,639,574, +640,576,641, +577,641,576, +641,577,642, +578,642,577, +642,578,643, +579,643,578, +643,579,644, +580,644,579, +644,580,645, +581,645,580, +645,581,646, +582,646,581, +646,582,647, +583,647,582, +647,583,648, +584,648,583, +648,584,649, +585,649,584, +649,585,650, +586,650,585, +650,586,651, +587,651,586, +651,587,652, +588,652,587, +652,588,653, +589,653,588, +653,589,654, +590,654,589, +654,590,655, +591,655,590, +655,591,656, +592,656,591, +656,592,657, +593,657,592, +657,593,658, +594,658,593, +658,594,659, +595,659,594, +659,595,660, +596,660,595, +660,596,661, +597,661,596, +661,597,662, +598,662,597, +662,598,663, +599,663,598, +663,599,664, +600,664,599, +664,600,665, +601,665,600, +665,601,666, +602,666,601, +666,602,667, +603,667,602, +667,603,668, +604,668,603, +668,604,669, +605,669,604, +669,605,670, +606,670,605, +670,606,671, +607,671,606, +671,607,672, +608,672,607, +672,608,673, +609,673,608, +673,609,674, +610,674,609, +674,610,675, +611,675,610, +675,611,676, +612,676,611, +676,612,677, +613,677,612, +677,613,678, +614,678,613, +678,614,679, +615,679,614, +679,615,680, +616,680,615, +680,616,681, +617,681,616, +681,617,682, +618,682,617, +682,618,683, +619,683,618, +683,619,684, +620,684,619, +684,620,685, +621,685,620, +685,621,686, +622,686,621, +686,622,687, +623,687,622, +687,623,688, +624,688,623, +688,624,689, +625,689,624, +689,625,690, +626,690,625, +690,626,691, +627,691,626, +691,627,692, +628,692,627, +692,628,693, +629,693,628, +693,629,694, +630,694,629, +694,630,695, +631,695,630, +695,631,696, +632,696,631, +696,632,697, +633,697,632, +697,633,698, +634,698,633, +698,634,699, +635,699,634, +699,635,700, +636,700,635, +700,636,701, +637,701,636, +701,637,702, +638,702,637, +702,638,703, +639,703,638, +704,640,705, +641,705,640, +705,641,706, +642,706,641, +706,642,707, +643,707,642, +707,643,708, +644,708,643, +708,644,709, +645,709,644, +709,645,710, +646,710,645, +710,646,711, +647,711,646, +711,647,712, +648,712,647, +712,648,713, +649,713,648, +713,649,714, +650,714,649, +714,650,715, +651,715,650, +715,651,716, +652,716,651, +716,652,717, +653,717,652, +717,653,718, +654,718,653, +718,654,719, +655,719,654, +719,655,720, +656,720,655, +720,656,721, +657,721,656, +721,657,722, +658,722,657, +722,658,723, +659,723,658, +723,659,724, +660,724,659, +724,660,725, +661,725,660, +725,661,726, +662,726,661, +726,662,727, +663,727,662, +727,663,728, +664,728,663, +728,664,729, +665,729,664, +729,665,730, +666,730,665, +730,666,731, +667,731,666, +731,667,732, +668,732,667, +732,668,733, +669,733,668, +733,669,734, +670,734,669, +734,670,735, +671,735,670, +735,671,736, +672,736,671, +736,672,737, +673,737,672, +737,673,738, +674,738,673, +738,674,739, +675,739,674, +739,675,740, +676,740,675, +740,676,741, +677,741,676, +741,677,742, +678,742,677, +742,678,743, +679,743,678, +743,679,744, +680,744,679, +744,680,745, +681,745,680, +745,681,746, +682,746,681, +746,682,747, +683,747,682, +747,683,748, +684,748,683, +748,684,749, +685,749,684, +749,685,750, +686,750,685, +750,686,751, +687,751,686, +751,687,752, +688,752,687, +752,688,753, +689,753,688, +753,689,754, +690,754,689, +754,690,755, +691,755,690, +755,691,756, +692,756,691, +756,692,757, +693,757,692, +757,693,758, +694,758,693, +758,694,759, +695,759,694, +759,695,760, +696,760,695, +760,696,761, +697,761,696, +761,697,762, +698,762,697, +762,698,763, +699,763,698, +763,699,764, +700,764,699, +764,700,765, +701,765,700, +765,701,766, +702,766,701, +766,702,767, +703,767,702, +768,704,769, +705,769,704, +769,705,770, +706,770,705, +770,706,771, +707,771,706, +771,707,772, +708,772,707, +772,708,773, +709,773,708, +773,709,774, +710,774,709, +774,710,775, +711,775,710, +775,711,776, +712,776,711, +776,712,777, +713,777,712, +777,713,778, +714,778,713, +778,714,779, +715,779,714, +779,715,780, +716,780,715, +780,716,781, +717,781,716, +781,717,782, +718,782,717, +782,718,783, +719,783,718, +783,719,784, +720,784,719, +784,720,785, +721,785,720, +785,721,786, +722,786,721, +786,722,787, +723,787,722, +787,723,788, +724,788,723, +788,724,789, +725,789,724, +789,725,790, +726,790,725, +790,726,791, +727,791,726, +791,727,792, +728,792,727, +792,728,793, +729,793,728, +793,729,794, +730,794,729, +794,730,795, +731,795,730, +795,731,796, +732,796,731, +796,732,797, +733,797,732, +797,733,798, +734,798,733, +798,734,799, +735,799,734, +799,735,800, +736,800,735, +800,736,801, +737,801,736, +801,737,802, +738,802,737, +802,738,803, +739,803,738, +803,739,804, +740,804,739, +804,740,805, +741,805,740, +805,741,806, +742,806,741, +806,742,807, +743,807,742, +807,743,808, +744,808,743, +808,744,809, +745,809,744, +809,745,810, +746,810,745, +810,746,811, +747,811,746, +811,747,812, +748,812,747, +812,748,813, +749,813,748, +813,749,814, +750,814,749, +814,750,815, +751,815,750, +815,751,816, +752,816,751, +816,752,817, +753,817,752, +817,753,818, +754,818,753, +818,754,819, +755,819,754, +819,755,820, +756,820,755, +820,756,821, +757,821,756, +821,757,822, +758,822,757, +822,758,823, +759,823,758, +823,759,824, +760,824,759, +824,760,825, +761,825,760, +825,761,826, +762,826,761, +826,762,827, +763,827,762, +827,763,828, +764,828,763, +828,764,829, +765,829,764, +829,765,830, +766,830,765, +830,766,831, +767,831,766, +832,768,833, +769,833,768, +833,769,834, +770,834,769, +834,770,835, +771,835,770, +835,771,836, +772,836,771, +836,772,837, +773,837,772, +837,773,838, +774,838,773, +838,774,839, +775,839,774, +839,775,840, +776,840,775, +840,776,841, +777,841,776, +841,777,842, +778,842,777, +842,778,843, +779,843,778, +843,779,844, +780,844,779, +844,780,845, +781,845,780, +845,781,846, +782,846,781, +846,782,847, +783,847,782, +847,783,848, +784,848,783, +848,784,849, +785,849,784, +849,785,850, +786,850,785, +850,786,851, +787,851,786, +851,787,852, +788,852,787, +852,788,853, +789,853,788, +853,789,854, +790,854,789, +854,790,855, +791,855,790, +855,791,856, +792,856,791, +856,792,857, +793,857,792, +857,793,858, +794,858,793, +858,794,859, +795,859,794, +859,795,860, +796,860,795, +860,796,861, +797,861,796, +861,797,862, +798,862,797, +862,798,863, +799,863,798, +863,799,864, +800,864,799, +864,800,865, +801,865,800, +865,801,866, +802,866,801, +866,802,867, +803,867,802, +867,803,868, +804,868,803, +868,804,869, +805,869,804, +869,805,870, +806,870,805, +870,806,871, +807,871,806, +871,807,872, +808,872,807, +872,808,873, +809,873,808, +873,809,874, +810,874,809, +874,810,875, +811,875,810, +875,811,876, +812,876,811, +876,812,877, +813,877,812, +877,813,878, +814,878,813, +878,814,879, +815,879,814, +879,815,880, +816,880,815, +880,816,881, +817,881,816, +881,817,882, +818,882,817, +882,818,883, +819,883,818, +883,819,884, +820,884,819, +884,820,885, +821,885,820, +885,821,886, +822,886,821, +886,822,887, +823,887,822, +887,823,888, +824,888,823, +888,824,889, +825,889,824, +889,825,890, +826,890,825, +890,826,891, +827,891,826, +891,827,892, +828,892,827, +892,828,893, +829,893,828, +893,829,894, +830,894,829, +894,830,895, +831,895,830, +896,832,897, +833,897,832, +897,833,898, +834,898,833, +898,834,899, +835,899,834, +899,835,900, +836,900,835, +900,836,901, +837,901,836, +901,837,902, +838,902,837, +902,838,903, +839,903,838, +903,839,904, +840,904,839, +904,840,905, +841,905,840, +905,841,906, +842,906,841, +906,842,907, +843,907,842, +907,843,908, +844,908,843, +908,844,909, +845,909,844, +909,845,910, +846,910,845, +910,846,911, +847,911,846, +911,847,912, +848,912,847, +912,848,913, +849,913,848, +913,849,914, +850,914,849, +914,850,915, +851,915,850, +915,851,916, +852,916,851, +916,852,917, +853,917,852, +917,853,918, +854,918,853, +918,854,919, +855,919,854, +919,855,920, +856,920,855, +920,856,921, +857,921,856, +921,857,922, +858,922,857, +922,858,923, +859,923,858, +923,859,924, +860,924,859, +924,860,925, +861,925,860, +925,861,926, +862,926,861, +926,862,927, +863,927,862, +927,863,928, +864,928,863, +928,864,929, +865,929,864, +929,865,930, +866,930,865, +930,866,931, +867,931,866, +931,867,932, +868,932,867, +932,868,933, +869,933,868, +933,869,934, +870,934,869, +934,870,935, +871,935,870, +935,871,936, +872,936,871, +936,872,937, +873,937,872, +937,873,938, +874,938,873, +938,874,939, +875,939,874, +939,875,940, +876,940,875, +940,876,941, +877,941,876, +941,877,942, +878,942,877, +942,878,943, +879,943,878, +943,879,944, +880,944,879, +944,880,945, +881,945,880, +945,881,946, +882,946,881, +946,882,947, +883,947,882, +947,883,948, +884,948,883, +948,884,949, +885,949,884, +949,885,950, +886,950,885, +950,886,951, +887,951,886, +951,887,952, +888,952,887, +952,888,953, +889,953,888, +953,889,954, +890,954,889, +954,890,955, +891,955,890, +955,891,956, +892,956,891, +956,892,957, +893,957,892, +957,893,958, +894,958,893, +958,894,959, +895,959,894, +960,896,961, +897,961,896, +961,897,962, +898,962,897, +962,898,963, +899,963,898, +963,899,964, +900,964,899, +964,900,965, +901,965,900, +965,901,966, +902,966,901, +966,902,967, +903,967,902, +967,903,968, +904,968,903, +968,904,969, +905,969,904, +969,905,970, +906,970,905, +970,906,971, +907,971,906, +971,907,972, +908,972,907, +972,908,973, +909,973,908, +973,909,974, +910,974,909, +974,910,975, +911,975,910, +975,911,976, +912,976,911, +976,912,977, +913,977,912, +977,913,978, +914,978,913, +978,914,979, +915,979,914, +979,915,980, +916,980,915, +980,916,981, +917,981,916, +981,917,982, +918,982,917, +982,918,983, +919,983,918, +983,919,984, +920,984,919, +984,920,985, +921,985,920, +985,921,986, +922,986,921, +986,922,987, +923,987,922, +987,923,988, +924,988,923, +988,924,989, +925,989,924, +989,925,990, +926,990,925, +990,926,991, +927,991,926, +991,927,992, +928,992,927, +992,928,993, +929,993,928, +993,929,994, +930,994,929, +994,930,995, +931,995,930, +995,931,996, +932,996,931, +996,932,997, +933,997,932, +997,933,998, +934,998,933, +998,934,999, +935,999,934, +999,935,1000, +936,1000,935, +1000,936,1001, +937,1001,936, +1001,937,1002, +938,1002,937, +1002,938,1003, +939,1003,938, +1003,939,1004, +940,1004,939, +1004,940,1005, +941,1005,940, +1005,941,1006, +942,1006,941, +1006,942,1007, +943,1007,942, +1007,943,1008, +944,1008,943, +1008,944,1009, +945,1009,944, +1009,945,1010, +946,1010,945, +1010,946,1011, +947,1011,946, +1011,947,1012, +948,1012,947, +1012,948,1013, +949,1013,948, +1013,949,1014, +950,1014,949, +1014,950,1015, +951,1015,950, +1015,951,1016, +952,1016,951, +1016,952,1017, +953,1017,952, +1017,953,1018, +954,1018,953, +1018,954,1019, +955,1019,954, +1019,955,1020, +956,1020,955, +1020,956,1021, +957,1021,956, +1021,957,1022, +958,1022,957, +1022,958,1023, +959,1023,958, +1024,960,1025, +961,1025,960, +1025,961,1026, +962,1026,961, +1026,962,1027, +963,1027,962, +1027,963,1028, +964,1028,963, +1028,964,1029, +965,1029,964, +1029,965,1030, +966,1030,965, +1030,966,1031, +967,1031,966, +1031,967,1032, +968,1032,967, +1032,968,1033, +969,1033,968, +1033,969,1034, +970,1034,969, +1034,970,1035, +971,1035,970, +1035,971,1036, +972,1036,971, +1036,972,1037, +973,1037,972, +1037,973,1038, +974,1038,973, +1038,974,1039, +975,1039,974, +1039,975,1040, +976,1040,975, +1040,976,1041, +977,1041,976, +1041,977,1042, +978,1042,977, +1042,978,1043, +979,1043,978, +1043,979,1044, +980,1044,979, +1044,980,1045, +981,1045,980, +1045,981,1046, +982,1046,981, +1046,982,1047, +983,1047,982, +1047,983,1048, +984,1048,983, +1048,984,1049, +985,1049,984, +1049,985,1050, +986,1050,985, +1050,986,1051, +987,1051,986, +1051,987,1052, +988,1052,987, +1052,988,1053, +989,1053,988, +1053,989,1054, +990,1054,989, +1054,990,1055, +991,1055,990, +1055,991,1056, +992,1056,991, +1056,992,1057, +993,1057,992, +1057,993,1058, +994,1058,993, +1058,994,1059, +995,1059,994, +1059,995,1060, +996,1060,995, +1060,996,1061, +997,1061,996, +1061,997,1062, +998,1062,997, +1062,998,1063, +999,1063,998, +1063,999,1064, +1000,1064,999, +1064,1000,1065, +1001,1065,1000, +1065,1001,1066, +1002,1066,1001, +1066,1002,1067, +1003,1067,1002, +1067,1003,1068, +1004,1068,1003, +1068,1004,1069, +1005,1069,1004, +1069,1005,1070, +1006,1070,1005, +1070,1006,1071, +1007,1071,1006, +1071,1007,1072, +1008,1072,1007, +1072,1008,1073, +1009,1073,1008, +1073,1009,1074, +1010,1074,1009, +1074,1010,1075, +1011,1075,1010, +1075,1011,1076, +1012,1076,1011, +1076,1012,1077, +1013,1077,1012, +1077,1013,1078, +1014,1078,1013, +1078,1014,1079, +1015,1079,1014, +1079,1015,1080, +1016,1080,1015, +1080,1016,1081, +1017,1081,1016, +1081,1017,1082, +1018,1082,1017, +1082,1018,1083, +1019,1083,1018, +1083,1019,1084, +1020,1084,1019, +1084,1020,1085, +1021,1085,1020, +1085,1021,1086, +1022,1086,1021, +1086,1022,1087, +1023,1087,1022, +1088,1024,1089, +1025,1089,1024, +1089,1025,1090, +1026,1090,1025, +1090,1026,1091, +1027,1091,1026, +1091,1027,1092, +1028,1092,1027, +1092,1028,1093, +1029,1093,1028, +1093,1029,1094, +1030,1094,1029, +1094,1030,1095, +1031,1095,1030, +1095,1031,1096, +1032,1096,1031, +1096,1032,1097, +1033,1097,1032, +1097,1033,1098, +1034,1098,1033, +1098,1034,1099, +1035,1099,1034, +1099,1035,1100, +1036,1100,1035, +1100,1036,1101, +1037,1101,1036, +1101,1037,1102, +1038,1102,1037, +1102,1038,1103, +1039,1103,1038, +1103,1039,1104, +1040,1104,1039, +1104,1040,1105, +1041,1105,1040, +1105,1041,1106, +1042,1106,1041, +1106,1042,1107, +1043,1107,1042, +1107,1043,1108, +1044,1108,1043, +1108,1044,1109, +1045,1109,1044, +1109,1045,1110, +1046,1110,1045, +1110,1046,1111, +1047,1111,1046, +1111,1047,1112, +1048,1112,1047, +1112,1048,1113, +1049,1113,1048, +1113,1049,1114, +1050,1114,1049, +1114,1050,1115, +1051,1115,1050, +1115,1051,1116, +1052,1116,1051, +1116,1052,1117, +1053,1117,1052, +1117,1053,1118, +1054,1118,1053, +1118,1054,1119, +1055,1119,1054, +1119,1055,1120, +1056,1120,1055, +1120,1056,1121, +1057,1121,1056, +1121,1057,1122, +1058,1122,1057, +1122,1058,1123, +1059,1123,1058, +1123,1059,1124, +1060,1124,1059, +1124,1060,1125, +1061,1125,1060, +1125,1061,1126, +1062,1126,1061, +1126,1062,1127, +1063,1127,1062, +1127,1063,1128, +1064,1128,1063, +1128,1064,1129, +1065,1129,1064, +1129,1065,1130, +1066,1130,1065, +1130,1066,1131, +1067,1131,1066, +1131,1067,1132, +1068,1132,1067, +1132,1068,1133, +1069,1133,1068, +1133,1069,1134, +1070,1134,1069, +1134,1070,1135, +1071,1135,1070, +1135,1071,1136, +1072,1136,1071, +1136,1072,1137, +1073,1137,1072, +1137,1073,1138, +1074,1138,1073, +1138,1074,1139, +1075,1139,1074, +1139,1075,1140, +1076,1140,1075, +1140,1076,1141, +1077,1141,1076, +1141,1077,1142, +1078,1142,1077, +1142,1078,1143, +1079,1143,1078, +1143,1079,1144, +1080,1144,1079, +1144,1080,1145, +1081,1145,1080, +1145,1081,1146, +1082,1146,1081, +1146,1082,1147, +1083,1147,1082, +1147,1083,1148, +1084,1148,1083, +1148,1084,1149, +1085,1149,1084, +1149,1085,1150, +1086,1150,1085, +1150,1086,1151, +1087,1151,1086, +1152,1088,1153, +1089,1153,1088, +1153,1089,1154, +1090,1154,1089, +1154,1090,1155, +1091,1155,1090, +1155,1091,1156, +1092,1156,1091, +1156,1092,1157, +1093,1157,1092, +1157,1093,1158, +1094,1158,1093, +1158,1094,1159, +1095,1159,1094, +1159,1095,1160, +1096,1160,1095, +1160,1096,1161, +1097,1161,1096, +1161,1097,1162, +1098,1162,1097, +1162,1098,1163, +1099,1163,1098, +1163,1099,1164, +1100,1164,1099, +1164,1100,1165, +1101,1165,1100, +1165,1101,1166, +1102,1166,1101, +1166,1102,1167, +1103,1167,1102, +1167,1103,1168, +1104,1168,1103, +1168,1104,1169, +1105,1169,1104, +1169,1105,1170, +1106,1170,1105, +1170,1106,1171, +1107,1171,1106, +1171,1107,1172, +1108,1172,1107, +1172,1108,1173, +1109,1173,1108, +1173,1109,1174, +1110,1174,1109, +1174,1110,1175, +1111,1175,1110, +1175,1111,1176, +1112,1176,1111, +1176,1112,1177, +1113,1177,1112, +1177,1113,1178, +1114,1178,1113, +1178,1114,1179, +1115,1179,1114, +1179,1115,1180, +1116,1180,1115, +1180,1116,1181, +1117,1181,1116, +1181,1117,1182, +1118,1182,1117, +1182,1118,1183, +1119,1183,1118, +1183,1119,1184, +1120,1184,1119, +1184,1120,1185, +1121,1185,1120, +1185,1121,1186, +1122,1186,1121, +1186,1122,1187, +1123,1187,1122, +1187,1123,1188, +1124,1188,1123, +1188,1124,1189, +1125,1189,1124, +1189,1125,1190, +1126,1190,1125, +1190,1126,1191, +1127,1191,1126, +1191,1127,1192, +1128,1192,1127, +1192,1128,1193, +1129,1193,1128, +1193,1129,1194, +1130,1194,1129, +1194,1130,1195, +1131,1195,1130, +1195,1131,1196, +1132,1196,1131, +1196,1132,1197, +1133,1197,1132, +1197,1133,1198, +1134,1198,1133, +1198,1134,1199, +1135,1199,1134, +1199,1135,1200, +1136,1200,1135, +1200,1136,1201, +1137,1201,1136, +1201,1137,1202, +1138,1202,1137, +1202,1138,1203, +1139,1203,1138, +1203,1139,1204, +1140,1204,1139, +1204,1140,1205, +1141,1205,1140, +1205,1141,1206, +1142,1206,1141, +1206,1142,1207, +1143,1207,1142, +1207,1143,1208, +1144,1208,1143, +1208,1144,1209, +1145,1209,1144, +1209,1145,1210, +1146,1210,1145, +1210,1146,1211, +1147,1211,1146, +1211,1147,1212, +1148,1212,1147, +1212,1148,1213, +1149,1213,1148, +1213,1149,1214, +1150,1214,1149, +1214,1150,1215, +1151,1215,1150, +1216,1152,1217, +1153,1217,1152, +1217,1153,1218, +1154,1218,1153, +1218,1154,1219, +1155,1219,1154, +1219,1155,1220, +1156,1220,1155, +1220,1156,1221, +1157,1221,1156, +1221,1157,1222, +1158,1222,1157, +1222,1158,1223, +1159,1223,1158, +1223,1159,1224, +1160,1224,1159, +1224,1160,1225, +1161,1225,1160, +1225,1161,1226, +1162,1226,1161, +1226,1162,1227, +1163,1227,1162, +1227,1163,1228, +1164,1228,1163, +1228,1164,1229, +1165,1229,1164, +1229,1165,1230, +1166,1230,1165, +1230,1166,1231, +1167,1231,1166, +1231,1167,1232, +1168,1232,1167, +1232,1168,1233, +1169,1233,1168, +1233,1169,1234, +1170,1234,1169, +1234,1170,1235, +1171,1235,1170, +1235,1171,1236, +1172,1236,1171, +1236,1172,1237, +1173,1237,1172, +1237,1173,1238, +1174,1238,1173, +1238,1174,1239, +1175,1239,1174, +1239,1175,1240, +1176,1240,1175, +1240,1176,1241, +1177,1241,1176, +1241,1177,1242, +1178,1242,1177, +1242,1178,1243, +1179,1243,1178, +1243,1179,1244, +1180,1244,1179, +1244,1180,1245, +1181,1245,1180, +1245,1181,1246, +1182,1246,1181, +1246,1182,1247, +1183,1247,1182, +1247,1183,1248, +1184,1248,1183, +1248,1184,1249, +1185,1249,1184, +1249,1185,1250, +1186,1250,1185, +1250,1186,1251, +1187,1251,1186, +1251,1187,1252, +1188,1252,1187, +1252,1188,1253, +1189,1253,1188, +1253,1189,1254, +1190,1254,1189, +1254,1190,1255, +1191,1255,1190, +1255,1191,1256, +1192,1256,1191, +1256,1192,1257, +1193,1257,1192, +1257,1193,1258, +1194,1258,1193, +1258,1194,1259, +1195,1259,1194, +1259,1195,1260, +1196,1260,1195, +1260,1196,1261, +1197,1261,1196, +1261,1197,1262, +1198,1262,1197, +1262,1198,1263, +1199,1263,1198, +1263,1199,1264, +1200,1264,1199, +1264,1200,1265, +1201,1265,1200, +1265,1201,1266, +1202,1266,1201, +1266,1202,1267, +1203,1267,1202, +1267,1203,1268, +1204,1268,1203, +1268,1204,1269, +1205,1269,1204, +1269,1205,1270, +1206,1270,1205, +1270,1206,1271, +1207,1271,1206, +1271,1207,1272, +1208,1272,1207, +1272,1208,1273, +1209,1273,1208, +1273,1209,1274, +1210,1274,1209, +1274,1210,1275, +1211,1275,1210, +1275,1211,1276, +1212,1276,1211, +1276,1212,1277, +1213,1277,1212, +1277,1213,1278, +1214,1278,1213, +1278,1214,1279, +1215,1279,1214, +1280,1216,1281, +1217,1281,1216, +1281,1217,1282, +1218,1282,1217, +1282,1218,1283, +1219,1283,1218, +1283,1219,1284, +1220,1284,1219, +1284,1220,1285, +1221,1285,1220, +1285,1221,1286, +1222,1286,1221, +1286,1222,1287, +1223,1287,1222, +1287,1223,1288, +1224,1288,1223, +1288,1224,1289, +1225,1289,1224, +1289,1225,1290, +1226,1290,1225, +1290,1226,1291, +1227,1291,1226, +1291,1227,1292, +1228,1292,1227, +1292,1228,1293, +1229,1293,1228, +1293,1229,1294, +1230,1294,1229, +1294,1230,1295, +1231,1295,1230, +1295,1231,1296, +1232,1296,1231, +1296,1232,1297, +1233,1297,1232, +1297,1233,1298, +1234,1298,1233, +1298,1234,1299, +1235,1299,1234, +1299,1235,1300, +1236,1300,1235, +1300,1236,1301, +1237,1301,1236, +1301,1237,1302, +1238,1302,1237, +1302,1238,1303, +1239,1303,1238, +1303,1239,1304, +1240,1304,1239, +1304,1240,1305, +1241,1305,1240, +1305,1241,1306, +1242,1306,1241, +1306,1242,1307, +1243,1307,1242, +1307,1243,1308, +1244,1308,1243, +1308,1244,1309, +1245,1309,1244, +1309,1245,1310, +1246,1310,1245, +1310,1246,1311, +1247,1311,1246, +1311,1247,1312, +1248,1312,1247, +1312,1248,1313, +1249,1313,1248, +1313,1249,1314, +1250,1314,1249, +1314,1250,1315, +1251,1315,1250, +1315,1251,1316, +1252,1316,1251, +1316,1252,1317, +1253,1317,1252, +1317,1253,1318, +1254,1318,1253, +1318,1254,1319, +1255,1319,1254, +1319,1255,1320, +1256,1320,1255, +1320,1256,1321, +1257,1321,1256, +1321,1257,1322, +1258,1322,1257, +1322,1258,1323, +1259,1323,1258, +1323,1259,1324, +1260,1324,1259, +1324,1260,1325, +1261,1325,1260, +1325,1261,1326, +1262,1326,1261, +1326,1262,1327, +1263,1327,1262, +1327,1263,1328, +1264,1328,1263, +1328,1264,1329, +1265,1329,1264, +1329,1265,1330, +1266,1330,1265, +1330,1266,1331, +1267,1331,1266, +1331,1267,1332, +1268,1332,1267, +1332,1268,1333, +1269,1333,1268, +1333,1269,1334, +1270,1334,1269, +1334,1270,1335, +1271,1335,1270, +1335,1271,1336, +1272,1336,1271, +1336,1272,1337, +1273,1337,1272, +1337,1273,1338, +1274,1338,1273, +1338,1274,1339, +1275,1339,1274, +1339,1275,1340, +1276,1340,1275, +1340,1276,1341, +1277,1341,1276, +1341,1277,1342, +1278,1342,1277, +1342,1278,1343, +1279,1343,1278, +1344,1280,1345, +1281,1345,1280, +1345,1281,1346, +1282,1346,1281, +1346,1282,1347, +1283,1347,1282, +1347,1283,1348, +1284,1348,1283, +1348,1284,1349, +1285,1349,1284, +1349,1285,1350, +1286,1350,1285, +1350,1286,1351, +1287,1351,1286, +1351,1287,1352, +1288,1352,1287, +1352,1288,1353, +1289,1353,1288, +1353,1289,1354, +1290,1354,1289, +1354,1290,1355, +1291,1355,1290, +1355,1291,1356, +1292,1356,1291, +1356,1292,1357, +1293,1357,1292, +1357,1293,1358, +1294,1358,1293, +1358,1294,1359, +1295,1359,1294, +1359,1295,1360, +1296,1360,1295, +1360,1296,1361, +1297,1361,1296, +1361,1297,1362, +1298,1362,1297, +1362,1298,1363, +1299,1363,1298, +1363,1299,1364, +1300,1364,1299, +1364,1300,1365, +1301,1365,1300, +1365,1301,1366, +1302,1366,1301, +1366,1302,1367, +1303,1367,1302, +1367,1303,1368, +1304,1368,1303, +1368,1304,1369, +1305,1369,1304, +1369,1305,1370, +1306,1370,1305, +1370,1306,1371, +1307,1371,1306, +1371,1307,1372, +1308,1372,1307, +1372,1308,1373, +1309,1373,1308, +1373,1309,1374, +1310,1374,1309, +1374,1310,1375, +1311,1375,1310, +1375,1311,1376, +1312,1376,1311, +1376,1312,1377, +1313,1377,1312, +1377,1313,1378, +1314,1378,1313, +1378,1314,1379, +1315,1379,1314, +1379,1315,1380, +1316,1380,1315, +1380,1316,1381, +1317,1381,1316, +1381,1317,1382, +1318,1382,1317, +1382,1318,1383, +1319,1383,1318, +1383,1319,1384, +1320,1384,1319, +1384,1320,1385, +1321,1385,1320, +1385,1321,1386, +1322,1386,1321, +1386,1322,1387, +1323,1387,1322, +1387,1323,1388, +1324,1388,1323, +1388,1324,1389, +1325,1389,1324, +1389,1325,1390, +1326,1390,1325, +1390,1326,1391, +1327,1391,1326, +1391,1327,1392, +1328,1392,1327, +1392,1328,1393, +1329,1393,1328, +1393,1329,1394, +1330,1394,1329, +1394,1330,1395, +1331,1395,1330, +1395,1331,1396, +1332,1396,1331, +1396,1332,1397, +1333,1397,1332, +1397,1333,1398, +1334,1398,1333, +1398,1334,1399, +1335,1399,1334, +1399,1335,1400, +1336,1400,1335, +1400,1336,1401, +1337,1401,1336, +1401,1337,1402, +1338,1402,1337, +1402,1338,1403, +1339,1403,1338, +1403,1339,1404, +1340,1404,1339, +1404,1340,1405, +1341,1405,1340, +1405,1341,1406, +1342,1406,1341, +1406,1342,1407, +1343,1407,1342, +1408,1344,1409, +1345,1409,1344, +1409,1345,1410, +1346,1410,1345, +1410,1346,1411, +1347,1411,1346, +1411,1347,1412, +1348,1412,1347, +1412,1348,1413, +1349,1413,1348, +1413,1349,1414, +1350,1414,1349, +1414,1350,1415, +1351,1415,1350, +1415,1351,1416, +1352,1416,1351, +1416,1352,1417, +1353,1417,1352, +1417,1353,1418, +1354,1418,1353, +1418,1354,1419, +1355,1419,1354, +1419,1355,1420, +1356,1420,1355, +1420,1356,1421, +1357,1421,1356, +1421,1357,1422, +1358,1422,1357, +1422,1358,1423, +1359,1423,1358, +1423,1359,1424, +1360,1424,1359, +1424,1360,1425, +1361,1425,1360, +1425,1361,1426, +1362,1426,1361, +1426,1362,1427, +1363,1427,1362, +1427,1363,1428, +1364,1428,1363, +1428,1364,1429, +1365,1429,1364, +1429,1365,1430, +1366,1430,1365, +1430,1366,1431, +1367,1431,1366, +1431,1367,1432, +1368,1432,1367, +1432,1368,1433, +1369,1433,1368, +1433,1369,1434, +1370,1434,1369, +1434,1370,1435, +1371,1435,1370, +1435,1371,1436, +1372,1436,1371, +1436,1372,1437, +1373,1437,1372, +1437,1373,1438, +1374,1438,1373, +1438,1374,1439, +1375,1439,1374, +1439,1375,1440, +1376,1440,1375, +1440,1376,1441, +1377,1441,1376, +1441,1377,1442, +1378,1442,1377, +1442,1378,1443, +1379,1443,1378, +1443,1379,1444, +1380,1444,1379, +1444,1380,1445, +1381,1445,1380, +1445,1381,1446, +1382,1446,1381, +1446,1382,1447, +1383,1447,1382, +1447,1383,1448, +1384,1448,1383, +1448,1384,1449, +1385,1449,1384, +1449,1385,1450, +1386,1450,1385, +1450,1386,1451, +1387,1451,1386, +1451,1387,1452, +1388,1452,1387, +1452,1388,1453, +1389,1453,1388, +1453,1389,1454, +1390,1454,1389, +1454,1390,1455, +1391,1455,1390, +1455,1391,1456, +1392,1456,1391, +1456,1392,1457, +1393,1457,1392, +1457,1393,1458, +1394,1458,1393, +1458,1394,1459, +1395,1459,1394, +1459,1395,1460, +1396,1460,1395, +1460,1396,1461, +1397,1461,1396, +1461,1397,1462, +1398,1462,1397, +1462,1398,1463, +1399,1463,1398, +1463,1399,1464, +1400,1464,1399, +1464,1400,1465, +1401,1465,1400, +1465,1401,1466, +1402,1466,1401, +1466,1402,1467, +1403,1467,1402, +1467,1403,1468, +1404,1468,1403, +1468,1404,1469, +1405,1469,1404, +1469,1405,1470, +1406,1470,1405, +1470,1406,1471, +1407,1471,1406, +1472,1408,1473, +1409,1473,1408, +1473,1409,1474, +1410,1474,1409, +1474,1410,1475, +1411,1475,1410, +1475,1411,1476, +1412,1476,1411, +1476,1412,1477, +1413,1477,1412, +1477,1413,1478, +1414,1478,1413, +1478,1414,1479, +1415,1479,1414, +1479,1415,1480, +1416,1480,1415, +1480,1416,1481, +1417,1481,1416, +1481,1417,1482, +1418,1482,1417, +1482,1418,1483, +1419,1483,1418, +1483,1419,1484, +1420,1484,1419, +1484,1420,1485, +1421,1485,1420, +1485,1421,1486, +1422,1486,1421, +1486,1422,1487, +1423,1487,1422, +1487,1423,1488, +1424,1488,1423, +1488,1424,1489, +1425,1489,1424, +1489,1425,1490, +1426,1490,1425, +1490,1426,1491, +1427,1491,1426, +1491,1427,1492, +1428,1492,1427, +1492,1428,1493, +1429,1493,1428, +1493,1429,1494, +1430,1494,1429, +1494,1430,1495, +1431,1495,1430, +1495,1431,1496, +1432,1496,1431, +1496,1432,1497, +1433,1497,1432, +1497,1433,1498, +1434,1498,1433, +1498,1434,1499, +1435,1499,1434, +1499,1435,1500, +1436,1500,1435, +1500,1436,1501, +1437,1501,1436, +1501,1437,1502, +1438,1502,1437, +1502,1438,1503, +1439,1503,1438, +1503,1439,1504, +1440,1504,1439, +1504,1440,1505, +1441,1505,1440, +1505,1441,1506, +1442,1506,1441, +1506,1442,1507, +1443,1507,1442, +1507,1443,1508, +1444,1508,1443, +1508,1444,1509, +1445,1509,1444, +1509,1445,1510, +1446,1510,1445, +1510,1446,1511, +1447,1511,1446, +1511,1447,1512, +1448,1512,1447, +1512,1448,1513, +1449,1513,1448, +1513,1449,1514, +1450,1514,1449, +1514,1450,1515, +1451,1515,1450, +1515,1451,1516, +1452,1516,1451, +1516,1452,1517, +1453,1517,1452, +1517,1453,1518, +1454,1518,1453, +1518,1454,1519, +1455,1519,1454, +1519,1455,1520, +1456,1520,1455, +1520,1456,1521, +1457,1521,1456, +1521,1457,1522, +1458,1522,1457, +1522,1458,1523, +1459,1523,1458, +1523,1459,1524, +1460,1524,1459, +1524,1460,1525, +1461,1525,1460, +1525,1461,1526, +1462,1526,1461, +1526,1462,1527, +1463,1527,1462, +1527,1463,1528, +1464,1528,1463, +1528,1464,1529, +1465,1529,1464, +1529,1465,1530, +1466,1530,1465, +1530,1466,1531, +1467,1531,1466, +1531,1467,1532, +1468,1532,1467, +1532,1468,1533, +1469,1533,1468, +1533,1469,1534, +1470,1534,1469, +1534,1470,1535, +1471,1535,1470, +1536,1472,1537, +1473,1537,1472, +1537,1473,1538, +1474,1538,1473, +1538,1474,1539, +1475,1539,1474, +1539,1475,1540, +1476,1540,1475, +1540,1476,1541, +1477,1541,1476, +1541,1477,1542, +1478,1542,1477, +1542,1478,1543, +1479,1543,1478, +1543,1479,1544, +1480,1544,1479, +1544,1480,1545, +1481,1545,1480, +1545,1481,1546, +1482,1546,1481, +1546,1482,1547, +1483,1547,1482, +1547,1483,1548, +1484,1548,1483, +1548,1484,1549, +1485,1549,1484, +1549,1485,1550, +1486,1550,1485, +1550,1486,1551, +1487,1551,1486, +1551,1487,1552, +1488,1552,1487, +1552,1488,1553, +1489,1553,1488, +1553,1489,1554, +1490,1554,1489, +1554,1490,1555, +1491,1555,1490, +1555,1491,1556, +1492,1556,1491, +1556,1492,1557, +1493,1557,1492, +1557,1493,1558, +1494,1558,1493, +1558,1494,1559, +1495,1559,1494, +1559,1495,1560, +1496,1560,1495, +1560,1496,1561, +1497,1561,1496, +1561,1497,1562, +1498,1562,1497, +1562,1498,1563, +1499,1563,1498, +1563,1499,1564, +1500,1564,1499, +1564,1500,1565, +1501,1565,1500, +1565,1501,1566, +1502,1566,1501, +1566,1502,1567, +1503,1567,1502, +1567,1503,1568, +1504,1568,1503, +1568,1504,1569, +1505,1569,1504, +1569,1505,1570, +1506,1570,1505, +1570,1506,1571, +1507,1571,1506, +1571,1507,1572, +1508,1572,1507, +1572,1508,1573, +1509,1573,1508, +1573,1509,1574, +1510,1574,1509, +1574,1510,1575, +1511,1575,1510, +1575,1511,1576, +1512,1576,1511, +1576,1512,1577, +1513,1577,1512, +1577,1513,1578, +1514,1578,1513, +1578,1514,1579, +1515,1579,1514, +1579,1515,1580, +1516,1580,1515, +1580,1516,1581, +1517,1581,1516, +1581,1517,1582, +1518,1582,1517, +1582,1518,1583, +1519,1583,1518, +1583,1519,1584, +1520,1584,1519, +1584,1520,1585, +1521,1585,1520, +1585,1521,1586, +1522,1586,1521, +1586,1522,1587, +1523,1587,1522, +1587,1523,1588, +1524,1588,1523, +1588,1524,1589, +1525,1589,1524, +1589,1525,1590, +1526,1590,1525, +1590,1526,1591, +1527,1591,1526, +1591,1527,1592, +1528,1592,1527, +1592,1528,1593, +1529,1593,1528, +1593,1529,1594, +1530,1594,1529, +1594,1530,1595, +1531,1595,1530, +1595,1531,1596, +1532,1596,1531, +1596,1532,1597, +1533,1597,1532, +1597,1533,1598, +1534,1598,1533, +1598,1534,1599, +1535,1599,1534, +1600,1536,1601, +1537,1601,1536, +1601,1537,1602, +1538,1602,1537, +1602,1538,1603, +1539,1603,1538, +1603,1539,1604, +1540,1604,1539, +1604,1540,1605, +1541,1605,1540, +1605,1541,1606, +1542,1606,1541, +1606,1542,1607, +1543,1607,1542, +1607,1543,1608, +1544,1608,1543, +1608,1544,1609, +1545,1609,1544, +1609,1545,1610, +1546,1610,1545, +1610,1546,1611, +1547,1611,1546, +1611,1547,1612, +1548,1612,1547, +1612,1548,1613, +1549,1613,1548, +1613,1549,1614, +1550,1614,1549, +1614,1550,1615, +1551,1615,1550, +1615,1551,1616, +1552,1616,1551, +1616,1552,1617, +1553,1617,1552, +1617,1553,1618, +1554,1618,1553, +1618,1554,1619, +1555,1619,1554, +1619,1555,1620, +1556,1620,1555, +1620,1556,1621, +1557,1621,1556, +1621,1557,1622, +1558,1622,1557, +1622,1558,1623, +1559,1623,1558, +1623,1559,1624, +1560,1624,1559, +1624,1560,1625, +1561,1625,1560, +1625,1561,1626, +1562,1626,1561, +1626,1562,1627, +1563,1627,1562, +1627,1563,1628, +1564,1628,1563, +1628,1564,1629, +1565,1629,1564, +1629,1565,1630, +1566,1630,1565, +1630,1566,1631, +1567,1631,1566, +1631,1567,1632, +1568,1632,1567, +1632,1568,1633, +1569,1633,1568, +1633,1569,1634, +1570,1634,1569, +1634,1570,1635, +1571,1635,1570, +1635,1571,1636, +1572,1636,1571, +1636,1572,1637, +1573,1637,1572, +1637,1573,1638, +1574,1638,1573, +1638,1574,1639, +1575,1639,1574, +1639,1575,1640, +1576,1640,1575, +1640,1576,1641, +1577,1641,1576, +1641,1577,1642, +1578,1642,1577, +1642,1578,1643, +1579,1643,1578, +1643,1579,1644, +1580,1644,1579, +1644,1580,1645, +1581,1645,1580, +1645,1581,1646, +1582,1646,1581, +1646,1582,1647, +1583,1647,1582, +1647,1583,1648, +1584,1648,1583, +1648,1584,1649, +1585,1649,1584, +1649,1585,1650, +1586,1650,1585, +1650,1586,1651, +1587,1651,1586, +1651,1587,1652, +1588,1652,1587, +1652,1588,1653, +1589,1653,1588, +1653,1589,1654, +1590,1654,1589, +1654,1590,1655, +1591,1655,1590, +1655,1591,1656, +1592,1656,1591, +1656,1592,1657, +1593,1657,1592, +1657,1593,1658, +1594,1658,1593, +1658,1594,1659, +1595,1659,1594, +1659,1595,1660, +1596,1660,1595, +1660,1596,1661, +1597,1661,1596, +1661,1597,1662, +1598,1662,1597, +1662,1598,1663, +1599,1663,1598, +1664,1600,1665, +1601,1665,1600, +1665,1601,1666, +1602,1666,1601, +1666,1602,1667, +1603,1667,1602, +1667,1603,1668, +1604,1668,1603, +1668,1604,1669, +1605,1669,1604, +1669,1605,1670, +1606,1670,1605, +1670,1606,1671, +1607,1671,1606, +1671,1607,1672, +1608,1672,1607, +1672,1608,1673, +1609,1673,1608, +1673,1609,1674, +1610,1674,1609, +1674,1610,1675, +1611,1675,1610, +1675,1611,1676, +1612,1676,1611, +1676,1612,1677, +1613,1677,1612, +1677,1613,1678, +1614,1678,1613, +1678,1614,1679, +1615,1679,1614, +1679,1615,1680, +1616,1680,1615, +1680,1616,1681, +1617,1681,1616, +1681,1617,1682, +1618,1682,1617, +1682,1618,1683, +1619,1683,1618, +1683,1619,1684, +1620,1684,1619, +1684,1620,1685, +1621,1685,1620, +1685,1621,1686, +1622,1686,1621, +1686,1622,1687, +1623,1687,1622, +1687,1623,1688, +1624,1688,1623, +1688,1624,1689, +1625,1689,1624, +1689,1625,1690, +1626,1690,1625, +1690,1626,1691, +1627,1691,1626, +1691,1627,1692, +1628,1692,1627, +1692,1628,1693, +1629,1693,1628, +1693,1629,1694, +1630,1694,1629, +1694,1630,1695, +1631,1695,1630, +1695,1631,1696, +1632,1696,1631, +1696,1632,1697, +1633,1697,1632, +1697,1633,1698, +1634,1698,1633, +1698,1634,1699, +1635,1699,1634, +1699,1635,1700, +1636,1700,1635, +1700,1636,1701, +1637,1701,1636, +1701,1637,1702, +1638,1702,1637, +1702,1638,1703, +1639,1703,1638, +1703,1639,1704, +1640,1704,1639, +1704,1640,1705, +1641,1705,1640, +1705,1641,1706, +1642,1706,1641, +1706,1642,1707, +1643,1707,1642, +1707,1643,1708, +1644,1708,1643, +1708,1644,1709, +1645,1709,1644, +1709,1645,1710, +1646,1710,1645, +1710,1646,1711, +1647,1711,1646, +1711,1647,1712, +1648,1712,1647, +1712,1648,1713, +1649,1713,1648, +1713,1649,1714, +1650,1714,1649, +1714,1650,1715, +1651,1715,1650, +1715,1651,1716, +1652,1716,1651, +1716,1652,1717, +1653,1717,1652, +1717,1653,1718, +1654,1718,1653, +1718,1654,1719, +1655,1719,1654, +1719,1655,1720, +1656,1720,1655, +1720,1656,1721, +1657,1721,1656, +1721,1657,1722, +1658,1722,1657, +1722,1658,1723, +1659,1723,1658, +1723,1659,1724, +1660,1724,1659, +1724,1660,1725, +1661,1725,1660, +1725,1661,1726, +1662,1726,1661, +1726,1662,1727, +1663,1727,1662, +1728,1664,1729, +1665,1729,1664, +1729,1665,1730, +1666,1730,1665, +1730,1666,1731, +1667,1731,1666, +1731,1667,1732, +1668,1732,1667, +1732,1668,1733, +1669,1733,1668, +1733,1669,1734, +1670,1734,1669, +1734,1670,1735, +1671,1735,1670, +1735,1671,1736, +1672,1736,1671, +1736,1672,1737, +1673,1737,1672, +1737,1673,1738, +1674,1738,1673, +1738,1674,1739, +1675,1739,1674, +1739,1675,1740, +1676,1740,1675, +1740,1676,1741, +1677,1741,1676, +1741,1677,1742, +1678,1742,1677, +1742,1678,1743, +1679,1743,1678, +1743,1679,1744, +1680,1744,1679, +1744,1680,1745, +1681,1745,1680, +1745,1681,1746, +1682,1746,1681, +1746,1682,1747, +1683,1747,1682, +1747,1683,1748, +1684,1748,1683, +1748,1684,1749, +1685,1749,1684, +1749,1685,1750, +1686,1750,1685, +1750,1686,1751, +1687,1751,1686, +1751,1687,1752, +1688,1752,1687, +1752,1688,1753, +1689,1753,1688, +1753,1689,1754, +1690,1754,1689, +1754,1690,1755, +1691,1755,1690, +1755,1691,1756, +1692,1756,1691, +1756,1692,1757, +1693,1757,1692, +1757,1693,1758, +1694,1758,1693, +1758,1694,1759, +1695,1759,1694, +1759,1695,1760, +1696,1760,1695, +1760,1696,1761, +1697,1761,1696, +1761,1697,1762, +1698,1762,1697, +1762,1698,1763, +1699,1763,1698, +1763,1699,1764, +1700,1764,1699, +1764,1700,1765, +1701,1765,1700, +1765,1701,1766, +1702,1766,1701, +1766,1702,1767, +1703,1767,1702, +1767,1703,1768, +1704,1768,1703, +1768,1704,1769, +1705,1769,1704, +1769,1705,1770, +1706,1770,1705, +1770,1706,1771, +1707,1771,1706, +1771,1707,1772, +1708,1772,1707, +1772,1708,1773, +1709,1773,1708, +1773,1709,1774, +1710,1774,1709, +1774,1710,1775, +1711,1775,1710, +1775,1711,1776, +1712,1776,1711, +1776,1712,1777, +1713,1777,1712, +1777,1713,1778, +1714,1778,1713, +1778,1714,1779, +1715,1779,1714, +1779,1715,1780, +1716,1780,1715, +1780,1716,1781, +1717,1781,1716, +1781,1717,1782, +1718,1782,1717, +1782,1718,1783, +1719,1783,1718, +1783,1719,1784, +1720,1784,1719, +1784,1720,1785, +1721,1785,1720, +1785,1721,1786, +1722,1786,1721, +1786,1722,1787, +1723,1787,1722, +1787,1723,1788, +1724,1788,1723, +1788,1724,1789, +1725,1789,1724, +1789,1725,1790, +1726,1790,1725, +1790,1726,1791, +1727,1791,1726, +1792,1728,1793, +1729,1793,1728, +1793,1729,1794, +1730,1794,1729, +1794,1730,1795, +1731,1795,1730, +1795,1731,1796, +1732,1796,1731, +1796,1732,1797, +1733,1797,1732, +1797,1733,1798, +1734,1798,1733, +1798,1734,1799, +1735,1799,1734, +1799,1735,1800, +1736,1800,1735, +1800,1736,1801, +1737,1801,1736, +1801,1737,1802, +1738,1802,1737, +1802,1738,1803, +1739,1803,1738, +1803,1739,1804, +1740,1804,1739, +1804,1740,1805, +1741,1805,1740, +1805,1741,1806, +1742,1806,1741, +1806,1742,1807, +1743,1807,1742, +1807,1743,1808, +1744,1808,1743, +1808,1744,1809, +1745,1809,1744, +1809,1745,1810, +1746,1810,1745, +1810,1746,1811, +1747,1811,1746, +1811,1747,1812, +1748,1812,1747, +1812,1748,1813, +1749,1813,1748, +1813,1749,1814, +1750,1814,1749, +1814,1750,1815, +1751,1815,1750, +1815,1751,1816, +1752,1816,1751, +1816,1752,1817, +1753,1817,1752, +1817,1753,1818, +1754,1818,1753, +1818,1754,1819, +1755,1819,1754, +1819,1755,1820, +1756,1820,1755, +1820,1756,1821, +1757,1821,1756, +1821,1757,1822, +1758,1822,1757, +1822,1758,1823, +1759,1823,1758, +1823,1759,1824, +1760,1824,1759, +1824,1760,1825, +1761,1825,1760, +1825,1761,1826, +1762,1826,1761, +1826,1762,1827, +1763,1827,1762, +1827,1763,1828, +1764,1828,1763, +1828,1764,1829, +1765,1829,1764, +1829,1765,1830, +1766,1830,1765, +1830,1766,1831, +1767,1831,1766, +1831,1767,1832, +1768,1832,1767, +1832,1768,1833, +1769,1833,1768, +1833,1769,1834, +1770,1834,1769, +1834,1770,1835, +1771,1835,1770, +1835,1771,1836, +1772,1836,1771, +1836,1772,1837, +1773,1837,1772, +1837,1773,1838, +1774,1838,1773, +1838,1774,1839, +1775,1839,1774, +1839,1775,1840, +1776,1840,1775, +1840,1776,1841, +1777,1841,1776, +1841,1777,1842, +1778,1842,1777, +1842,1778,1843, +1779,1843,1778, +1843,1779,1844, +1780,1844,1779, +1844,1780,1845, +1781,1845,1780, +1845,1781,1846, +1782,1846,1781, +1846,1782,1847, +1783,1847,1782, +1847,1783,1848, +1784,1848,1783, +1848,1784,1849, +1785,1849,1784, +1849,1785,1850, +1786,1850,1785, +1850,1786,1851, +1787,1851,1786, +1851,1787,1852, +1788,1852,1787, +1852,1788,1853, +1789,1853,1788, +1853,1789,1854, +1790,1854,1789, +1854,1790,1855, +1791,1855,1790, +1856,1792,1857, +1793,1857,1792, +1857,1793,1858, +1794,1858,1793, +1858,1794,1859, +1795,1859,1794, +1859,1795,1860, +1796,1860,1795, +1860,1796,1861, +1797,1861,1796, +1861,1797,1862, +1798,1862,1797, +1862,1798,1863, +1799,1863,1798, +1863,1799,1864, +1800,1864,1799, +1864,1800,1865, +1801,1865,1800, +1865,1801,1866, +1802,1866,1801, +1866,1802,1867, +1803,1867,1802, +1867,1803,1868, +1804,1868,1803, +1868,1804,1869, +1805,1869,1804, +1869,1805,1870, +1806,1870,1805, +1870,1806,1871, +1807,1871,1806, +1871,1807,1872, +1808,1872,1807, +1872,1808,1873, +1809,1873,1808, +1873,1809,1874, +1810,1874,1809, +1874,1810,1875, +1811,1875,1810, +1875,1811,1876, +1812,1876,1811, +1876,1812,1877, +1813,1877,1812, +1877,1813,1878, +1814,1878,1813, +1878,1814,1879, +1815,1879,1814, +1879,1815,1880, +1816,1880,1815, +1880,1816,1881, +1817,1881,1816, +1881,1817,1882, +1818,1882,1817, +1882,1818,1883, +1819,1883,1818, +1883,1819,1884, +1820,1884,1819, +1884,1820,1885, +1821,1885,1820, +1885,1821,1886, +1822,1886,1821, +1886,1822,1887, +1823,1887,1822, +1887,1823,1888, +1824,1888,1823, +1888,1824,1889, +1825,1889,1824, +1889,1825,1890, +1826,1890,1825, +1890,1826,1891, +1827,1891,1826, +1891,1827,1892, +1828,1892,1827, +1892,1828,1893, +1829,1893,1828, +1893,1829,1894, +1830,1894,1829, +1894,1830,1895, +1831,1895,1830, +1895,1831,1896, +1832,1896,1831, +1896,1832,1897, +1833,1897,1832, +1897,1833,1898, +1834,1898,1833, +1898,1834,1899, +1835,1899,1834, +1899,1835,1900, +1836,1900,1835, +1900,1836,1901, +1837,1901,1836, +1901,1837,1902, +1838,1902,1837, +1902,1838,1903, +1839,1903,1838, +1903,1839,1904, +1840,1904,1839, +1904,1840,1905, +1841,1905,1840, +1905,1841,1906, +1842,1906,1841, +1906,1842,1907, +1843,1907,1842, +1907,1843,1908, +1844,1908,1843, +1908,1844,1909, +1845,1909,1844, +1909,1845,1910, +1846,1910,1845, +1910,1846,1911, +1847,1911,1846, +1911,1847,1912, +1848,1912,1847, +1912,1848,1913, +1849,1913,1848, +1913,1849,1914, +1850,1914,1849, +1914,1850,1915, +1851,1915,1850, +1915,1851,1916, +1852,1916,1851, +1916,1852,1917, +1853,1917,1852, +1917,1853,1918, +1854,1918,1853, +1918,1854,1919, +1855,1919,1854, +1920,1856,1921, +1857,1921,1856, +1921,1857,1922, +1858,1922,1857, +1922,1858,1923, +1859,1923,1858, +1923,1859,1924, +1860,1924,1859, +1924,1860,1925, +1861,1925,1860, +1925,1861,1926, +1862,1926,1861, +1926,1862,1927, +1863,1927,1862, +1927,1863,1928, +1864,1928,1863, +1928,1864,1929, +1865,1929,1864, +1929,1865,1930, +1866,1930,1865, +1930,1866,1931, +1867,1931,1866, +1931,1867,1932, +1868,1932,1867, +1932,1868,1933, +1869,1933,1868, +1933,1869,1934, +1870,1934,1869, +1934,1870,1935, +1871,1935,1870, +1935,1871,1936, +1872,1936,1871, +1936,1872,1937, +1873,1937,1872, +1937,1873,1938, +1874,1938,1873, +1938,1874,1939, +1875,1939,1874, +1939,1875,1940, +1876,1940,1875, +1940,1876,1941, +1877,1941,1876, +1941,1877,1942, +1878,1942,1877, +1942,1878,1943, +1879,1943,1878, +1943,1879,1944, +1880,1944,1879, +1944,1880,1945, +1881,1945,1880, +1945,1881,1946, +1882,1946,1881, +1946,1882,1947, +1883,1947,1882, +1947,1883,1948, +1884,1948,1883, +1948,1884,1949, +1885,1949,1884, +1949,1885,1950, +1886,1950,1885, +1950,1886,1951, +1887,1951,1886, +1951,1887,1952, +1888,1952,1887, +1952,1888,1953, +1889,1953,1888, +1953,1889,1954, +1890,1954,1889, +1954,1890,1955, +1891,1955,1890, +1955,1891,1956, +1892,1956,1891, +1956,1892,1957, +1893,1957,1892, +1957,1893,1958, +1894,1958,1893, +1958,1894,1959, +1895,1959,1894, +1959,1895,1960, +1896,1960,1895, +1960,1896,1961, +1897,1961,1896, +1961,1897,1962, +1898,1962,1897, +1962,1898,1963, +1899,1963,1898, +1963,1899,1964, +1900,1964,1899, +1964,1900,1965, +1901,1965,1900, +1965,1901,1966, +1902,1966,1901, +1966,1902,1967, +1903,1967,1902, +1967,1903,1968, +1904,1968,1903, +1968,1904,1969, +1905,1969,1904, +1969,1905,1970, +1906,1970,1905, +1970,1906,1971, +1907,1971,1906, +1971,1907,1972, +1908,1972,1907, +1972,1908,1973, +1909,1973,1908, +1973,1909,1974, +1910,1974,1909, +1974,1910,1975, +1911,1975,1910, +1975,1911,1976, +1912,1976,1911, +1976,1912,1977, +1913,1977,1912, +1977,1913,1978, +1914,1978,1913, +1978,1914,1979, +1915,1979,1914, +1979,1915,1980, +1916,1980,1915, +1980,1916,1981, +1917,1981,1916, +1981,1917,1982, +1918,1982,1917, +1982,1918,1983, +1919,1983,1918, +1984,1920,1985, +1921,1985,1920, +1985,1921,1986, +1922,1986,1921, +1986,1922,1987, +1923,1987,1922, +1987,1923,1988, +1924,1988,1923, +1988,1924,1989, +1925,1989,1924, +1989,1925,1990, +1926,1990,1925, +1990,1926,1991, +1927,1991,1926, +1991,1927,1992, +1928,1992,1927, +1992,1928,1993, +1929,1993,1928, +1993,1929,1994, +1930,1994,1929, +1994,1930,1995, +1931,1995,1930, +1995,1931,1996, +1932,1996,1931, +1996,1932,1997, +1933,1997,1932, +1997,1933,1998, +1934,1998,1933, +1998,1934,1999, +1935,1999,1934, +1999,1935,2000, +1936,2000,1935, +2000,1936,2001, +1937,2001,1936, +2001,1937,2002, +1938,2002,1937, +2002,1938,2003, +1939,2003,1938, +2003,1939,2004, +1940,2004,1939, +2004,1940,2005, +1941,2005,1940, +2005,1941,2006, +1942,2006,1941, +2006,1942,2007, +1943,2007,1942, +2007,1943,2008, +1944,2008,1943, +2008,1944,2009, +1945,2009,1944, +2009,1945,2010, +1946,2010,1945, +2010,1946,2011, +1947,2011,1946, +2011,1947,2012, +1948,2012,1947, +2012,1948,2013, +1949,2013,1948, +2013,1949,2014, +1950,2014,1949, +2014,1950,2015, +1951,2015,1950, +2015,1951,2016, +1952,2016,1951, +2016,1952,2017, +1953,2017,1952, +2017,1953,2018, +1954,2018,1953, +2018,1954,2019, +1955,2019,1954, +2019,1955,2020, +1956,2020,1955, +2020,1956,2021, +1957,2021,1956, +2021,1957,2022, +1958,2022,1957, +2022,1958,2023, +1959,2023,1958, +2023,1959,2024, +1960,2024,1959, +2024,1960,2025, +1961,2025,1960, +2025,1961,2026, +1962,2026,1961, +2026,1962,2027, +1963,2027,1962, +2027,1963,2028, +1964,2028,1963, +2028,1964,2029, +1965,2029,1964, +2029,1965,2030, +1966,2030,1965, +2030,1966,2031, +1967,2031,1966, +2031,1967,2032, +1968,2032,1967, +2032,1968,2033, +1969,2033,1968, +2033,1969,2034, +1970,2034,1969, +2034,1970,2035, +1971,2035,1970, +2035,1971,2036, +1972,2036,1971, +2036,1972,2037, +1973,2037,1972, +2037,1973,2038, +1974,2038,1973, +2038,1974,2039, +1975,2039,1974, +2039,1975,2040, +1976,2040,1975, +2040,1976,2041, +1977,2041,1976, +2041,1977,2042, +1978,2042,1977, +2042,1978,2043, +1979,2043,1978, +2043,1979,2044, +1980,2044,1979, +2044,1980,2045, +1981,2045,1980, +2045,1981,2046, +1982,2046,1981, +2046,1982,2047, +1983,2047,1982, +2048,1984,2049, +1985,2049,1984, +2049,1985,2050, +1986,2050,1985, +2050,1986,2051, +1987,2051,1986, +2051,1987,2052, +1988,2052,1987, +2052,1988,2053, +1989,2053,1988, +2053,1989,2054, +1990,2054,1989, +2054,1990,2055, +1991,2055,1990, +2055,1991,2056, +1992,2056,1991, +2056,1992,2057, +1993,2057,1992, +2057,1993,2058, +1994,2058,1993, +2058,1994,2059, +1995,2059,1994, +2059,1995,2060, +1996,2060,1995, +2060,1996,2061, +1997,2061,1996, +2061,1997,2062, +1998,2062,1997, +2062,1998,2063, +1999,2063,1998, +2063,1999,2064, +2000,2064,1999, +2064,2000,2065, +2001,2065,2000, +2065,2001,2066, +2002,2066,2001, +2066,2002,2067, +2003,2067,2002, +2067,2003,2068, +2004,2068,2003, +2068,2004,2069, +2005,2069,2004, +2069,2005,2070, +2006,2070,2005, +2070,2006,2071, +2007,2071,2006, +2071,2007,2072, +2008,2072,2007, +2072,2008,2073, +2009,2073,2008, +2073,2009,2074, +2010,2074,2009, +2074,2010,2075, +2011,2075,2010, +2075,2011,2076, +2012,2076,2011, +2076,2012,2077, +2013,2077,2012, +2077,2013,2078, +2014,2078,2013, +2078,2014,2079, +2015,2079,2014, +2079,2015,2080, +2016,2080,2015, +2080,2016,2081, +2017,2081,2016, +2081,2017,2082, +2018,2082,2017, +2082,2018,2083, +2019,2083,2018, +2083,2019,2084, +2020,2084,2019, +2084,2020,2085, +2021,2085,2020, +2085,2021,2086, +2022,2086,2021, +2086,2022,2087, +2023,2087,2022, +2087,2023,2088, +2024,2088,2023, +2088,2024,2089, +2025,2089,2024, +2089,2025,2090, +2026,2090,2025, +2090,2026,2091, +2027,2091,2026, +2091,2027,2092, +2028,2092,2027, +2092,2028,2093, +2029,2093,2028, +2093,2029,2094, +2030,2094,2029, +2094,2030,2095, +2031,2095,2030, +2095,2031,2096, +2032,2096,2031, +2096,2032,2097, +2033,2097,2032, +2097,2033,2098, +2034,2098,2033, +2098,2034,2099, +2035,2099,2034, +2099,2035,2100, +2036,2100,2035, +2100,2036,2101, +2037,2101,2036, +2101,2037,2102, +2038,2102,2037, +2102,2038,2103, +2039,2103,2038, +2103,2039,2104, +2040,2104,2039, +2104,2040,2105, +2041,2105,2040, +2105,2041,2106, +2042,2106,2041, +2106,2042,2107, +2043,2107,2042, +2107,2043,2108, +2044,2108,2043, +2108,2044,2109, +2045,2109,2044, +2109,2045,2110, +2046,2110,2045, +2110,2046,2111, +2047,2111,2046, +2112,2048,2113, +2049,2113,2048, +2113,2049,2114, +2050,2114,2049, +2114,2050,2115, +2051,2115,2050, +2115,2051,2116, +2052,2116,2051, +2116,2052,2117, +2053,2117,2052, +2117,2053,2118, +2054,2118,2053, +2118,2054,2119, +2055,2119,2054, +2119,2055,2120, +2056,2120,2055, +2120,2056,2121, +2057,2121,2056, +2121,2057,2122, +2058,2122,2057, +2122,2058,2123, +2059,2123,2058, +2123,2059,2124, +2060,2124,2059, +2124,2060,2125, +2061,2125,2060, +2125,2061,2126, +2062,2126,2061, +2126,2062,2127, +2063,2127,2062, +2127,2063,2128, +2064,2128,2063, +2128,2064,2129, +2065,2129,2064, +2129,2065,2130, +2066,2130,2065, +2130,2066,2131, +2067,2131,2066, +2131,2067,2132, +2068,2132,2067, +2132,2068,2133, +2069,2133,2068, +2133,2069,2134, +2070,2134,2069, +2134,2070,2135, +2071,2135,2070, +2135,2071,2136, +2072,2136,2071, +2136,2072,2137, +2073,2137,2072, +2137,2073,2138, +2074,2138,2073, +2138,2074,2139, +2075,2139,2074, +2139,2075,2140, +2076,2140,2075, +2140,2076,2141, +2077,2141,2076, +2141,2077,2142, +2078,2142,2077, +2142,2078,2143, +2079,2143,2078, +2143,2079,2144, +2080,2144,2079, +2144,2080,2145, +2081,2145,2080, +2145,2081,2146, +2082,2146,2081, +2146,2082,2147, +2083,2147,2082, +2147,2083,2148, +2084,2148,2083, +2148,2084,2149, +2085,2149,2084, +2149,2085,2150, +2086,2150,2085, +2150,2086,2151, +2087,2151,2086, +2151,2087,2152, +2088,2152,2087, +2152,2088,2153, +2089,2153,2088, +2153,2089,2154, +2090,2154,2089, +2154,2090,2155, +2091,2155,2090, +2155,2091,2156, +2092,2156,2091, +2156,2092,2157, +2093,2157,2092, +2157,2093,2158, +2094,2158,2093, +2158,2094,2159, +2095,2159,2094, +2159,2095,2160, +2096,2160,2095, +2160,2096,2161, +2097,2161,2096, +2161,2097,2162, +2098,2162,2097, +2162,2098,2163, +2099,2163,2098, +2163,2099,2164, +2100,2164,2099, +2164,2100,2165, +2101,2165,2100, +2165,2101,2166, +2102,2166,2101, +2166,2102,2167, +2103,2167,2102, +2167,2103,2168, +2104,2168,2103, +2168,2104,2169, +2105,2169,2104, +2169,2105,2170, +2106,2170,2105, +2170,2106,2171, +2107,2171,2106, +2171,2107,2172, +2108,2172,2107, +2172,2108,2173, +2109,2173,2108, +2173,2109,2174, +2110,2174,2109, +2174,2110,2175, +2111,2175,2110, +2176,2112,2177, +2113,2177,2112, +2177,2113,2178, +2114,2178,2113, +2178,2114,2179, +2115,2179,2114, +2179,2115,2180, +2116,2180,2115, +2180,2116,2181, +2117,2181,2116, +2181,2117,2182, +2118,2182,2117, +2182,2118,2183, +2119,2183,2118, +2183,2119,2184, +2120,2184,2119, +2184,2120,2185, +2121,2185,2120, +2185,2121,2186, +2122,2186,2121, +2186,2122,2187, +2123,2187,2122, +2187,2123,2188, +2124,2188,2123, +2188,2124,2189, +2125,2189,2124, +2189,2125,2190, +2126,2190,2125, +2190,2126,2191, +2127,2191,2126, +2191,2127,2192, +2128,2192,2127, +2192,2128,2193, +2129,2193,2128, +2193,2129,2194, +2130,2194,2129, +2194,2130,2195, +2131,2195,2130, +2195,2131,2196, +2132,2196,2131, +2196,2132,2197, +2133,2197,2132, +2197,2133,2198, +2134,2198,2133, +2198,2134,2199, +2135,2199,2134, +2199,2135,2200, +2136,2200,2135, +2200,2136,2201, +2137,2201,2136, +2201,2137,2202, +2138,2202,2137, +2202,2138,2203, +2139,2203,2138, +2203,2139,2204, +2140,2204,2139, +2204,2140,2205, +2141,2205,2140, +2205,2141,2206, +2142,2206,2141, +2206,2142,2207, +2143,2207,2142, +2207,2143,2208, +2144,2208,2143, +2208,2144,2209, +2145,2209,2144, +2209,2145,2210, +2146,2210,2145, +2210,2146,2211, +2147,2211,2146, +2211,2147,2212, +2148,2212,2147, +2212,2148,2213, +2149,2213,2148, +2213,2149,2214, +2150,2214,2149, +2214,2150,2215, +2151,2215,2150, +2215,2151,2216, +2152,2216,2151, +2216,2152,2217, +2153,2217,2152, +2217,2153,2218, +2154,2218,2153, +2218,2154,2219, +2155,2219,2154, +2219,2155,2220, +2156,2220,2155, +2220,2156,2221, +2157,2221,2156, +2221,2157,2222, +2158,2222,2157, +2222,2158,2223, +2159,2223,2158, +2223,2159,2224, +2160,2224,2159, +2224,2160,2225, +2161,2225,2160, +2225,2161,2226, +2162,2226,2161, +2226,2162,2227, +2163,2227,2162, +2227,2163,2228, +2164,2228,2163, +2228,2164,2229, +2165,2229,2164, +2229,2165,2230, +2166,2230,2165, +2230,2166,2231, +2167,2231,2166, +2231,2167,2232, +2168,2232,2167, +2232,2168,2233, +2169,2233,2168, +2233,2169,2234, +2170,2234,2169, +2234,2170,2235, +2171,2235,2170, +2235,2171,2236, +2172,2236,2171, +2236,2172,2237, +2173,2237,2172, +2237,2173,2238, +2174,2238,2173, +2238,2174,2239, +2175,2239,2174, +}; + +#define Landscape08VtxCount 2178 +#define Landscape08IdxCount 12480 + +btScalar Landscape08Vtx[] = { +-250.0f,30.98f,-128.906f, +-250.0f,31.4025f,-125.0f, +-246.094f,31.7629f,-128.906f, +-246.094f,31.4165f,-125.0f, +-242.188f,32.5689f,-128.906f, +-242.188f,32.314f,-125.0f, +-238.281f,32.9125f,-128.906f, +-238.281f,32.9822f,-125.0f, +-234.375f,32.5915f,-128.906f, +-234.375f,32.6962f,-125.0f, +-230.469f,31.2708f,-128.906f, +-230.469f,31.3632f,-125.0f, +-226.563f,30.5212f,-128.906f, +-226.563f,29.4391f,-125.0f, +-222.656f,30.2031f,-128.906f, +-222.656f,29.519f,-125.0f, +-218.75f,30.4582f,-128.906f, +-218.75f,29.4481f,-125.0f, +-214.844f,30.6941f,-128.906f, +-214.844f,29.8481f,-125.0f, +-210.938f,30.5035f,-128.906f, +-210.938f,30.408f,-125.0f, +-207.031f,30.2726f,-128.906f, +-207.031f,30.291f,-125.0f, +-203.125f,29.38f,-128.906f, +-203.125f,28.7473f,-125.0f, +-199.219f,28.6973f,-128.906f, +-199.219f,28.1816f,-125.0f, +-195.313f,27.9768f,-128.906f, +-195.313f,27.2839f,-125.0f, +-191.406f,26.1169f,-128.906f, +-191.406f,25.7018f,-125.0f, +-187.5f,23.8648f,-128.906f, +-187.5f,23.2882f,-125.0f, +-183.594f,21.95f,-128.906f, +-183.594f,22.1614f,-125.0f, +-179.688f,19.6798f,-128.906f, +-179.688f,20.658f,-125.0f, +-175.781f,17.3507f,-128.906f, +-175.781f,18.8433f,-125.0f, +-171.875f,15.7914f,-128.906f, +-171.875f,16.364f,-125.0f, +-167.969f,14.3745f,-128.906f, +-167.969f,14.7298f,-125.0f, +-164.063f,12.4911f,-128.906f, +-164.063f,12.9859f,-125.0f, +-160.156f,11.0533f,-128.906f, +-160.156f,11.3306f,-125.0f, +-156.25f,9.15062f,-128.906f, +-156.25f,10.1916f,-125.0f, +-152.344f,6.68059f,-128.906f, +-152.344f,8.3967f,-125.0f, +-148.438f,5.57112f,-128.906f, +-148.438f,6.23292f,-125.0f, +-144.531f,5.2271f,-128.906f, +-144.531f,5.48985f,-125.0f, +-140.625f,5.87576f,-128.906f, +-140.625f,5.18276f,-125.0f, +-136.719f,6.85614f,-128.906f, +-136.719f,5.56059f,-125.0f, +-132.813f,6.86087f,-128.906f, +-132.813f,5.75157f,-125.0f, +-128.906f,7.10341f,-128.906f, +-128.906f,5.32154f,-125.0f, +-125.0f,7.54727f,-128.906f, +-125.0f,6.15672f,-125.0f, +-121.094f,8.02225f,-128.906f, +-121.094f,7.53373f,-125.0f, +-117.188f,8.70065f,-128.906f, +-117.188f,8.38676f,-125.0f, +-113.281f,9.39689f,-128.906f, +-113.281f,8.64274f,-125.0f, +-109.375f,8.80449f,-128.906f, +-109.375f,8.49941f,-125.0f, +-105.469f,9.43366f,-128.906f, +-105.469f,9.24481f,-125.0f, +-101.563f,10.868f,-128.906f, +-101.563f,11.5178f,-125.0f, +-97.6563f,12.8404f,-128.906f, +-97.6563f,13.4113f,-125.0f, +-93.75f,14.8214f,-128.906f, +-93.75f,15.4997f,-125.0f, +-89.8438f,16.618f,-128.906f, +-89.8438f,17.3502f,-125.0f, +-85.9375f,20.2496f,-128.906f, +-85.9375f,20.8168f,-125.0f, +-82.0313f,23.697f,-128.906f, +-82.0313f,24.9405f,-125.0f, +-78.125f,26.4451f,-128.906f, +-78.125f,27.8681f,-125.0f, +-74.2188f,28.7901f,-128.906f, +-74.2188f,30.1495f,-125.0f, +-70.3125f,31.4052f,-128.906f, +-70.3125f,32.4402f,-125.0f, +-66.4063f,33.3106f,-128.906f, +-66.4063f,34.2537f,-125.0f, +-62.5f,35.8538f,-128.906f, +-62.5f,36.5623f,-125.0f, +-58.5938f,37.9798f,-128.906f, +-58.5938f,38.9027f,-125.0f, +-54.6875f,39.4006f,-128.906f, +-54.6875f,40.1192f,-125.0f, +-50.7813f,40.6584f,-128.906f, +-50.7813f,41.9393f,-125.0f, +-46.875f,40.8896f,-128.906f, +-46.875f,41.8765f,-125.0f, +-42.9688f,39.9544f,-128.906f, +-42.9688f,41.6371f,-125.0f, +-39.0625f,40.0893f,-128.906f, +-39.0625f,41.6432f,-125.0f, +-35.1563f,39.3183f,-128.906f, +-35.1563f,41.2852f,-125.0f, +-31.25f,39.8575f,-128.906f, +-31.25f,41.5629f,-125.0f, +-27.3438f,41.5378f,-128.906f, +-27.3438f,42.2956f,-125.0f, +-23.4375f,44.0561f,-128.906f, +-23.4375f,43.9719f,-125.0f, +-19.5313f,45.4298f,-128.906f, +-19.5313f,46.2232f,-125.0f, +-15.625f,47.4474f,-128.906f, +-15.625f,47.3104f,-125.0f, +-11.7188f,48.0018f,-128.906f, +-11.7188f,47.5943f,-125.0f, +-7.8125f,48.0717f,-128.906f, +-7.8125f,49.1192f,-125.0f, +-3.90625f,48.7253f,-128.906f, +-3.90625f,49.6341f,-125.0f, +0.0f,49.8f,-128.906f, +0.0f,50.3481f,-125.0f, +3.90625f,50.4716f,-128.906f, +3.90625f,50.3021f,-125.0f, +-250.0f,31.1145f,-132.813f, +-246.094f,31.857f,-132.813f, +-242.188f,32.7446f,-132.813f, +-238.281f,33.1734f,-132.813f, +-234.375f,32.1952f,-132.813f, +-230.469f,31.8959f,-132.813f, +-226.563f,32.1326f,-132.813f, +-222.656f,32.1631f,-132.813f, +-218.75f,31.3795f,-132.813f, +-214.844f,30.9888f,-132.813f, +-210.938f,30.5577f,-132.813f, +-207.031f,30.1392f,-132.813f, +-203.125f,29.8482f,-132.813f, +-199.219f,28.5903f,-132.813f, +-195.313f,27.4671f,-132.813f, +-191.406f,25.5032f,-132.813f, +-187.5f,23.2799f,-132.813f, +-183.594f,21.2846f,-132.813f, +-179.688f,19.3954f,-132.813f, +-175.781f,18.1112f,-132.813f, +-171.875f,16.3831f,-132.813f, +-167.969f,14.5038f,-132.813f, +-164.063f,12.8109f,-132.813f, +-160.156f,10.386f,-132.813f, +-156.25f,7.93486f,-132.813f, +-152.344f,7.25449f,-132.813f, +-148.438f,6.19974f,-132.813f, +-144.531f,5.89578f,-132.813f, +-140.625f,6.61884f,-132.813f, +-136.719f,7.53382f,-132.813f, +-132.813f,8.21024f,-132.813f, +-128.906f,8.74115f,-132.813f, +-125.0f,8.97047f,-132.813f, +-121.094f,9.41307f,-132.813f, +-117.188f,10.0468f,-132.813f, +-113.281f,9.47404f,-132.813f, +-109.375f,9.418f,-132.813f, +-105.469f,10.3176f,-132.813f, +-101.563f,11.3001f,-132.813f, +-97.6563f,12.5318f,-132.813f, +-93.75f,14.6986f,-132.813f, +-89.8438f,16.6495f,-132.813f, +-85.9375f,19.1906f,-132.813f, +-82.0313f,23.4349f,-132.813f, +-78.125f,26.1629f,-132.813f, +-74.2188f,28.739f,-132.813f, +-70.3125f,31.1271f,-132.813f, +-66.4063f,32.2452f,-132.813f, +-62.5f,34.0303f,-132.813f, +-58.5938f,36.1234f,-132.813f, +-54.6875f,38.3054f,-132.813f, +-50.7813f,38.7936f,-132.813f, +-46.875f,39.1319f,-132.813f, +-42.9688f,39.1462f,-132.813f, +-39.0625f,38.4732f,-132.813f, +-35.1563f,38.3061f,-132.813f, +-31.25f,39.4999f,-132.813f, +-27.3438f,41.8953f,-132.813f, +-23.4375f,43.2645f,-132.813f, +-19.5313f,44.7736f,-132.813f, +-15.625f,46.2491f,-132.813f, +-11.7188f,47.4527f,-132.813f, +-7.8125f,47.1407f,-132.813f, +-3.90625f,48.0628f,-132.813f, +0.0f,48.5651f,-132.813f, +3.90625f,49.1054f,-132.813f, +-250.0f,30.7461f,-136.719f, +-246.094f,30.8483f,-136.719f, +-242.188f,32.188f,-136.719f, +-238.281f,33.149f,-136.719f, +-234.375f,32.3165f,-136.719f, +-230.469f,32.613f,-136.719f, +-226.563f,33.3246f,-136.719f, +-222.656f,32.6429f,-136.719f, +-218.75f,31.8882f,-136.719f, +-214.844f,31.5125f,-136.719f, +-210.938f,30.2065f,-136.719f, +-207.031f,30.0024f,-136.719f, +-203.125f,29.5699f,-136.719f, +-199.219f,28.1245f,-136.719f, +-195.313f,26.764f,-136.719f, +-191.406f,24.8025f,-136.719f, +-187.5f,22.7863f,-136.719f, +-183.594f,21.0979f,-136.719f, +-179.688f,19.5742f,-136.719f, +-175.781f,17.9263f,-136.719f, +-171.875f,16.0908f,-136.719f, +-167.969f,14.6542f,-136.719f, +-164.063f,12.4534f,-136.719f, +-160.156f,9.93763f,-136.719f, +-156.25f,7.87486f,-136.719f, +-152.344f,7.06627f,-136.719f, +-148.438f,6.22453f,-136.719f, +-144.531f,6.39864f,-136.719f, +-140.625f,7.02103f,-136.719f, +-136.719f,7.85488f,-136.719f, +-132.813f,9.33235f,-136.719f, +-128.906f,10.546f,-136.719f, +-125.0f,10.1958f,-136.719f, +-121.094f,9.85385f,-136.719f, +-117.188f,10.2437f,-136.719f, +-113.281f,9.95341f,-136.719f, +-109.375f,9.05387f,-136.719f, +-105.469f,10.3384f,-136.719f, +-101.563f,11.2859f,-136.719f, +-97.6563f,12.3544f,-136.719f, +-93.75f,14.0582f,-136.719f, +-89.8438f,15.9772f,-136.719f, +-85.9375f,18.8673f,-136.719f, +-82.0313f,22.2278f,-136.719f, +-78.125f,25.0468f,-136.719f, +-74.2188f,27.6452f,-136.719f, +-70.3125f,29.155f,-136.719f, +-66.4063f,30.7457f,-136.719f, +-62.5f,32.6722f,-136.719f, +-58.5938f,34.5222f,-136.719f, +-54.6875f,36.3904f,-136.719f, +-50.7813f,36.1946f,-136.719f, +-46.875f,36.5194f,-136.719f, +-42.9688f,36.2715f,-136.719f, +-39.0625f,36.4185f,-136.719f, +-35.1563f,37.1668f,-136.719f, +-31.25f,38.3933f,-136.719f, +-27.3438f,40.8416f,-136.719f, +-23.4375f,42.7243f,-136.719f, +-19.5313f,43.7567f,-136.719f, +-15.625f,44.7705f,-136.719f, +-11.7188f,45.3267f,-136.719f, +-7.8125f,46.433f,-136.719f, +-3.90625f,47.3134f,-136.719f, +0.0f,48.4146f,-136.719f, +3.90625f,47.9f,-136.719f, +-250.0f,29.1575f,-140.625f, +-246.094f,30.5173f,-140.625f, +-242.188f,31.576f,-140.625f, +-238.281f,31.6992f,-140.625f, +-234.375f,32.9063f,-140.625f, +-230.469f,33.2752f,-140.625f, +-226.563f,32.8003f,-140.625f, +-222.656f,33.133f,-140.625f, +-218.75f,32.0543f,-140.625f, +-214.844f,31.2672f,-140.625f, +-210.938f,30.2378f,-140.625f, +-207.031f,29.601f,-140.625f, +-203.125f,28.4643f,-140.625f, +-199.219f,26.8711f,-140.625f, +-195.313f,24.936f,-140.625f, +-191.406f,22.9115f,-140.625f, +-187.5f,21.8507f,-140.625f, +-183.594f,20.4435f,-140.625f, +-179.688f,18.4455f,-140.625f, +-175.781f,17.1667f,-140.625f, +-171.875f,15.2077f,-140.625f, +-167.969f,13.4799f,-140.625f, +-164.063f,11.7723f,-140.625f, +-160.156f,9.26955f,-140.625f, +-156.25f,7.56528f,-140.625f, +-152.344f,6.4244f,-140.625f, +-148.438f,6.60539f,-140.625f, +-144.531f,6.44163f,-140.625f, +-140.625f,6.55017f,-140.625f, +-136.719f,7.62805f,-140.625f, +-132.813f,9.20726f,-140.625f, +-128.906f,10.5063f,-140.625f, +-125.0f,10.6867f,-140.625f, +-121.094f,9.3702f,-140.625f, +-117.188f,9.53484f,-140.625f, +-113.281f,8.855f,-140.625f, +-109.375f,9.3082f,-140.625f, +-105.469f,9.67718f,-140.625f, +-101.563f,10.5233f,-140.625f, +-97.6563f,11.8026f,-140.625f, +-93.75f,13.1675f,-140.625f, +-89.8438f,15.253f,-140.625f, +-85.9375f,18.1074f,-140.625f, +-82.0313f,20.8004f,-140.625f, +-78.125f,23.7651f,-140.625f, +-74.2188f,25.7067f,-140.625f, +-70.3125f,27.5126f,-140.625f, +-66.4063f,29.8191f,-140.625f, +-62.5f,31.7367f,-140.625f, +-58.5938f,32.8891f,-140.625f, +-54.6875f,34.0989f,-140.625f, +-50.7813f,34.6645f,-140.625f, +-46.875f,34.0325f,-140.625f, +-42.9688f,33.7773f,-140.625f, +-39.0625f,34.1723f,-140.625f, +-35.1563f,36.0861f,-140.625f, +-31.25f,38.8562f,-140.625f, +-27.3438f,40.5684f,-140.625f, +-23.4375f,42.6832f,-140.625f, +-19.5313f,43.505f,-140.625f, +-15.625f,43.7197f,-140.625f, +-11.7188f,43.8656f,-140.625f, +-7.8125f,45.6272f,-140.625f, +-3.90625f,46.7713f,-140.625f, +0.0f,47.1255f,-140.625f, +3.90625f,47.2681f,-140.625f, +-250.0f,28.3388f,-144.531f, +-246.094f,29.5689f,-144.531f, +-242.188f,30.0422f,-144.531f, +-238.281f,30.6319f,-144.531f, +-234.375f,32.5914f,-144.531f, +-230.469f,33.306f,-144.531f, +-226.563f,32.9265f,-144.531f, +-222.656f,32.5363f,-144.531f, +-218.75f,31.8845f,-144.531f, +-214.844f,31.7429f,-144.531f, +-210.938f,29.6521f,-144.531f, +-207.031f,28.3301f,-144.531f, +-203.125f,26.8166f,-144.531f, +-199.219f,25.0756f,-144.531f, +-195.313f,23.0988f,-144.531f, +-191.406f,21.2037f,-144.531f, +-187.5f,20.271f,-144.531f, +-183.594f,18.4189f,-144.531f, +-179.688f,16.2352f,-144.531f, +-175.781f,14.734f,-144.531f, +-171.875f,13.9522f,-144.531f, +-167.969f,12.543f,-144.531f, +-164.063f,10.6335f,-144.531f, +-160.156f,8.53885f,-144.531f, +-156.25f,7.32299f,-144.531f, +-152.344f,6.69849f,-144.531f, +-148.438f,5.37792f,-144.531f, +-144.531f,5.52557f,-144.531f, +-140.625f,5.94721f,-144.531f, +-136.719f,7.15949f,-144.531f, +-132.813f,8.5533f,-144.531f, +-128.906f,9.68048f,-144.531f, +-125.0f,9.80421f,-144.531f, +-121.094f,9.67052f,-144.531f, +-117.188f,9.82889f,-144.531f, +-113.281f,9.40895f,-144.531f, +-109.375f,9.53728f,-144.531f, +-105.469f,9.89567f,-144.531f, +-101.563f,10.4472f,-144.531f, +-97.6563f,11.3813f,-144.531f, +-93.75f,13.6687f,-144.531f, +-89.8438f,15.6897f,-144.531f, +-85.9375f,17.6694f,-144.531f, +-82.0313f,20.0542f,-144.531f, +-78.125f,22.2881f,-144.531f, +-74.2188f,24.021f,-144.531f, +-70.3125f,26.6221f,-144.531f, +-66.4063f,28.7647f,-144.531f, +-62.5f,31.0025f,-144.531f, +-58.5938f,31.9212f,-144.531f, +-54.6875f,32.1124f,-144.531f, +-50.7813f,33.4656f,-144.531f, +-46.875f,33.5412f,-144.531f, +-42.9688f,33.5562f,-144.531f, +-39.0625f,34.3563f,-144.531f, +-35.1563f,36.2482f,-144.531f, +-31.25f,37.99f,-144.531f, +-27.3438f,40.3527f,-144.531f, +-23.4375f,42.4204f,-144.531f, +-19.5313f,44.0f,-144.531f, +-15.625f,44.183f,-144.531f, +-11.7188f,44.0185f,-144.531f, +-7.8125f,45.08f,-144.531f, +-3.90625f,45.5784f,-144.531f, +0.0f,44.8122f,-144.531f, +3.90625f,45.2398f,-144.531f, +-250.0f,27.5165f,-148.438f, +-246.094f,28.4707f,-148.438f, +-242.188f,28.8693f,-148.438f, +-238.281f,29.8936f,-148.438f, +-234.375f,30.9982f,-148.438f, +-230.469f,31.9158f,-148.438f, +-226.563f,33.0887f,-148.438f, +-222.656f,32.141f,-148.438f, +-218.75f,31.0388f,-148.438f, +-214.844f,30.5599f,-148.438f, +-210.938f,29.1269f,-148.438f, +-207.031f,26.6179f,-148.438f, +-203.125f,25.2859f,-148.438f, +-199.219f,23.1182f,-148.438f, +-195.313f,21.139f,-148.438f, +-191.406f,19.7044f,-148.438f, +-187.5f,18.4387f,-148.438f, +-183.594f,17.6363f,-148.438f, +-179.688f,15.8724f,-148.438f, +-175.781f,14.454f,-148.438f, +-171.875f,13.2052f,-148.438f, +-167.969f,11.7702f,-148.438f, +-164.063f,10.4965f,-148.438f, +-160.156f,8.29165f,-148.438f, +-156.25f,7.24803f,-148.438f, +-152.344f,6.79621f,-148.438f, +-148.438f,5.48372f,-148.438f, +-144.531f,4.11362f,-148.438f, +-140.625f,4.6586f,-148.438f, +-136.719f,6.20081f,-148.438f, +-132.813f,7.67687f,-148.438f, +-128.906f,9.0742f,-148.438f, +-125.0f,8.8028f,-148.438f, +-121.094f,9.309f,-148.438f, +-117.188f,9.26616f,-148.438f, +-113.281f,9.88711f,-148.438f, +-109.375f,9.19023f,-148.438f, +-105.469f,9.46828f,-148.438f, +-101.563f,10.1584f,-148.438f, +-97.6563f,11.2649f,-148.438f, +-93.75f,13.476f,-148.438f, +-89.8438f,15.8318f,-148.438f, +-85.9375f,17.6136f,-148.438f, +-82.0313f,18.7495f,-148.438f, +-78.125f,20.5385f,-148.438f, +-74.2188f,23.5666f,-148.438f, +-70.3125f,26.2836f,-148.438f, +-66.4063f,28.729f,-148.438f, +-62.5f,30.3854f,-148.438f, +-58.5938f,30.9909f,-148.438f, +-54.6875f,31.4288f,-148.438f, +-50.7813f,31.916f,-148.438f, +-46.875f,32.4745f,-148.438f, +-42.9688f,32.0881f,-148.438f, +-39.0625f,34.0231f,-148.438f, +-35.1563f,35.6432f,-148.438f, +-31.25f,37.6278f,-148.438f, +-27.3438f,39.652f,-148.438f, +-23.4375f,42.3336f,-148.438f, +-19.5313f,43.3336f,-148.438f, +-15.625f,43.9329f,-148.438f, +-11.7188f,43.8742f,-148.438f, +-7.8125f,44.336f,-148.438f, +-3.90625f,44.2738f,-148.438f, +0.0f,42.6429f,-148.438f, +3.90625f,43.4167f,-148.438f, +-250.0f,27.7654f,-152.344f, +-246.094f,28.2588f,-152.344f, +-242.188f,28.0365f,-152.344f, +-238.281f,29.4531f,-152.344f, +-234.375f,31.8507f,-152.344f, +-230.469f,31.9987f,-152.344f, +-226.563f,32.2635f,-152.344f, +-222.656f,32.4573f,-152.344f, +-218.75f,30.3791f,-152.344f, +-214.844f,29.1133f,-152.344f, +-210.938f,27.6466f,-152.344f, +-207.031f,25.5524f,-152.344f, +-203.125f,23.857f,-152.344f, +-199.219f,21.724f,-152.344f, +-195.313f,19.9592f,-152.344f, +-191.406f,18.6648f,-152.344f, +-187.5f,17.3913f,-152.344f, +-183.594f,17.3113f,-152.344f, +-179.688f,15.8776f,-152.344f, +-175.781f,13.7968f,-152.344f, +-171.875f,11.9961f,-152.344f, +-167.969f,10.9315f,-152.344f, +-164.063f,9.24337f,-152.344f, +-160.156f,7.95749f,-152.344f, +-156.25f,6.95525f,-152.344f, +-152.344f,6.523f,-152.344f, +-148.438f,5.62313f,-152.344f, +-144.531f,4.31939f,-152.344f, +-140.625f,3.1203f,-152.344f, +-136.719f,4.98713f,-152.344f, +-132.813f,6.64544f,-152.344f, +-128.906f,7.48658f,-152.344f, +-125.0f,8.08424f,-152.344f, +-121.094f,8.96562f,-152.344f, +-117.188f,9.10159f,-152.344f, +-113.281f,9.38004f,-152.344f, +-109.375f,8.97581f,-152.344f, +-105.469f,8.78511f,-152.344f, +-101.563f,9.76846f,-152.344f, +-97.6563f,10.4299f,-152.344f, +-93.75f,13.6059f,-152.344f, +-89.8438f,16.3193f,-152.344f, +-85.9375f,17.6959f,-152.344f, +-82.0313f,18.5545f,-152.344f, +-78.125f,20.1179f,-152.344f, +-74.2188f,22.929f,-152.344f, +-70.3125f,25.8413f,-152.344f, +-66.4063f,28.4214f,-152.344f, +-62.5f,30.0187f,-152.344f, +-58.5938f,30.4285f,-152.344f, +-54.6875f,30.9236f,-152.344f, +-50.7813f,31.3519f,-152.344f, +-46.875f,31.0939f,-152.344f, +-42.9688f,30.2517f,-152.344f, +-39.0625f,32.8953f,-152.344f, +-35.1563f,34.6998f,-152.344f, +-31.25f,36.8107f,-152.344f, +-27.3438f,38.8491f,-152.344f, +-23.4375f,41.3749f,-152.344f, +-19.5313f,42.0838f,-152.344f, +-15.625f,42.3106f,-152.344f, +-11.7188f,43.9654f,-152.344f, +-7.8125f,44.3642f,-152.344f, +-3.90625f,43.1787f,-152.344f, +0.0f,41.875f,-152.344f, +3.90625f,42.7212f,-152.344f, +-250.0f,27.3076f,-156.25f, +-246.094f,27.8739f,-156.25f, +-242.188f,27.7337f,-156.25f, +-238.281f,28.4499f,-156.25f, +-234.375f,30.5068f,-156.25f, +-230.469f,31.1326f,-156.25f, +-226.563f,32.3149f,-156.25f, +-222.656f,31.2724f,-156.25f, +-218.75f,29.5487f,-156.25f, +-214.844f,26.8408f,-156.25f, +-210.938f,25.2503f,-156.25f, +-207.031f,24.2811f,-156.25f, +-203.125f,23.8635f,-156.25f, +-199.219f,22.2573f,-156.25f, +-195.313f,20.6368f,-156.25f, +-191.406f,19.4922f,-156.25f, +-187.5f,18.0281f,-156.25f, +-183.594f,15.4098f,-156.25f, +-179.688f,13.9176f,-156.25f, +-175.781f,11.8192f,-156.25f, +-171.875f,9.31112f,-156.25f, +-167.969f,8.81167f,-156.25f, +-164.063f,8.04908f,-156.25f, +-160.156f,6.4764f,-156.25f, +-156.25f,5.83656f,-156.25f, +-152.344f,5.70173f,-156.25f, +-148.438f,6.05686f,-156.25f, +-144.531f,3.98364f,-156.25f, +-140.625f,2.80636f,-156.25f, +-136.719f,3.53326f,-156.25f, +-132.813f,4.97177f,-156.25f, +-128.906f,6.71319f,-156.25f, +-125.0f,8.26478f,-156.25f, +-121.094f,9.00909f,-156.25f, +-117.188f,8.8849f,-156.25f, +-113.281f,9.50654f,-156.25f, +-109.375f,9.16878f,-156.25f, +-105.469f,8.84796f,-156.25f, +-101.563f,9.78015f,-156.25f, +-97.6563f,11.1536f,-156.25f, +-93.75f,13.416f,-156.25f, +-89.8438f,15.8674f,-156.25f, +-85.9375f,17.2814f,-156.25f, +-82.0313f,18.1958f,-156.25f, +-78.125f,19.5037f,-156.25f, +-74.2188f,22.0147f,-156.25f, +-70.3125f,24.3288f,-156.25f, +-66.4063f,26.5193f,-156.25f, +-62.5f,27.9571f,-156.25f, +-58.5938f,28.8524f,-156.25f, +-54.6875f,30.6249f,-156.25f, +-50.7813f,30.9824f,-156.25f, +-46.875f,31.0372f,-156.25f, +-42.9688f,30.2189f,-156.25f, +-39.0625f,32.0632f,-156.25f, +-35.1563f,34.0061f,-156.25f, +-31.25f,35.3975f,-156.25f, +-27.3438f,37.8006f,-156.25f, +-23.4375f,40.1384f,-156.25f, +-19.5313f,40.5455f,-156.25f, +-15.625f,41.6044f,-156.25f, +-11.7188f,43.1078f,-156.25f, +-7.8125f,43.5927f,-156.25f, +-3.90625f,43.0245f,-156.25f, +0.0f,41.3824f,-156.25f, +3.90625f,41.7368f,-156.25f, +-250.0f,27.1128f,-160.156f, +-246.094f,26.9845f,-160.156f, +-242.188f,26.7433f,-160.156f, +-238.281f,27.3777f,-160.156f, +-234.375f,29.1743f,-160.156f, +-230.469f,31.0712f,-160.156f, +-226.563f,31.3707f,-160.156f, +-222.656f,30.2327f,-160.156f, +-218.75f,27.897f,-160.156f, +-214.844f,26.4218f,-160.156f, +-210.938f,24.0007f,-160.156f, +-207.031f,23.6445f,-160.156f, +-203.125f,23.6467f,-160.156f, +-199.219f,22.8576f,-160.156f, +-195.313f,20.6778f,-160.156f, +-191.406f,19.3331f,-160.156f, +-187.5f,17.8893f,-160.156f, +-183.594f,14.3376f,-160.156f, +-179.688f,11.9084f,-160.156f, +-175.781f,9.60285f,-160.156f, +-171.875f,7.78231f,-160.156f, +-167.969f,8.15369f,-160.156f, +-164.063f,7.46984f,-160.156f, +-160.156f,6.48522f,-160.156f, +-156.25f,5.27847f,-160.156f, +-152.344f,4.69473f,-160.156f, +-148.438f,5.14018f,-160.156f, +-144.531f,3.26777f,-160.156f, +-140.625f,3.33507f,-160.156f, +-136.719f,2.47156f,-160.156f, +-132.813f,4.15824f,-160.156f, +-128.906f,6.45432f,-160.156f, +-125.0f,7.99373f,-160.156f, +-121.094f,8.38925f,-160.156f, +-117.188f,8.59802f,-160.156f, +-113.281f,9.4891f,-160.156f, +-109.375f,9.20323f,-160.156f, +-105.469f,8.27038f,-160.156f, +-101.563f,9.71848f,-160.156f, +-97.6563f,11.8577f,-160.156f, +-93.75f,14.596f,-160.156f, +-89.8438f,16.1058f,-160.156f, +-85.9375f,17.6531f,-160.156f, +-82.0313f,18.2123f,-160.156f, +-78.125f,18.7175f,-160.156f, +-74.2188f,20.7283f,-160.156f, +-70.3125f,23.5217f,-160.156f, +-66.4063f,26.4239f,-160.156f, +-62.5f,27.757f,-160.156f, +-58.5938f,28.1862f,-160.156f, +-54.6875f,28.9075f,-160.156f, +-50.7813f,29.5287f,-160.156f, +-46.875f,29.3972f,-160.156f, +-42.9688f,29.568f,-160.156f, +-39.0625f,30.605f,-160.156f, +-35.1563f,33.0369f,-160.156f, +-31.25f,34.749f,-160.156f, +-27.3438f,37.4864f,-160.156f, +-23.4375f,39.2291f,-160.156f, +-19.5313f,39.6275f,-160.156f, +-15.625f,39.865f,-160.156f, +-11.7188f,41.1833f,-160.156f, +-7.8125f,41.7789f,-160.156f, +-3.90625f,41.6972f,-160.156f, +0.0f,40.379f,-160.156f, +3.90625f,40.4755f,-160.156f, +-250.0f,26.3982f,-164.063f, +-246.094f,26.3606f,-164.063f, +-242.188f,26.6508f,-164.063f, +-238.281f,27.2228f,-164.063f, +-234.375f,29.1682f,-164.063f, +-230.469f,30.116f,-164.063f, +-226.563f,30.3591f,-164.063f, +-222.656f,28.8713f,-164.063f, +-218.75f,26.8459f,-164.063f, +-214.844f,24.9771f,-164.063f, +-210.938f,24.4581f,-164.063f, +-207.031f,23.6584f,-164.063f, +-203.125f,22.7316f,-164.063f, +-199.219f,21.1836f,-164.063f, +-195.313f,19.6131f,-164.063f, +-191.406f,18.5182f,-164.063f, +-187.5f,16.824f,-164.063f, +-183.594f,13.8772f,-164.063f, +-179.688f,10.3923f,-164.063f, +-175.781f,7.50643f,-164.063f, +-171.875f,6.58466f,-164.063f, +-167.969f,6.81413f,-164.063f, +-164.063f,6.88249f,-164.063f, +-160.156f,6.78655f,-164.063f, +-156.25f,5.18348f,-164.063f, +-152.344f,4.44173f,-164.063f, +-148.438f,4.56392f,-164.063f, +-144.531f,3.00722f,-164.063f, +-140.625f,2.88808f,-164.063f, +-136.719f,2.58477f,-164.063f, +-132.813f,3.20911f,-164.063f, +-128.906f,5.33043f,-164.063f, +-125.0f,6.73698f,-164.063f, +-121.094f,7.71971f,-164.063f, +-117.188f,8.44689f,-164.063f, +-113.281f,9.05366f,-164.063f, +-109.375f,8.81111f,-164.063f, +-105.469f,7.75706f,-164.063f, +-101.563f,11.1131f,-164.063f, +-97.6563f,12.8283f,-164.063f, +-93.75f,14.7771f,-164.063f, +-89.8438f,16.181f,-164.063f, +-85.9375f,17.4228f,-164.063f, +-82.0313f,18.5185f,-164.063f, +-78.125f,19.3122f,-164.063f, +-74.2188f,20.1572f,-164.063f, +-70.3125f,22.741f,-164.063f, +-66.4063f,24.5911f,-164.063f, +-62.5f,26.3846f,-164.063f, +-58.5938f,26.7315f,-164.063f, +-54.6875f,27.0842f,-164.063f, +-50.7813f,28.7654f,-164.063f, +-46.875f,28.7233f,-164.063f, +-42.9688f,29.2872f,-164.063f, +-39.0625f,29.4838f,-164.063f, +-35.1563f,32.7848f,-164.063f, +-31.25f,34.771f,-164.063f, +-27.3438f,36.568f,-164.063f, +-23.4375f,37.5518f,-164.063f, +-19.5313f,38.4106f,-164.063f, +-15.625f,39.2979f,-164.063f, +-11.7188f,39.3573f,-164.063f, +-7.8125f,40.0034f,-164.063f, +-3.90625f,39.5971f,-164.063f, +0.0f,38.8676f,-164.063f, +3.90625f,38.8633f,-164.063f, +-250.0f,25.2893f,-167.969f, +-246.094f,25.108f,-167.969f, +-242.188f,25.5028f,-167.969f, +-238.281f,26.6095f,-167.969f, +-234.375f,28.3221f,-167.969f, +-230.469f,28.5453f,-167.969f, +-226.563f,28.2595f,-167.969f, +-222.656f,26.8423f,-167.969f, +-218.75f,25.0092f,-167.969f, +-214.844f,24.2925f,-167.969f, +-210.938f,23.8404f,-167.969f, +-207.031f,22.7515f,-167.969f, +-203.125f,22.5332f,-167.969f, +-199.219f,20.3284f,-167.969f, +-195.313f,18.8238f,-167.969f, +-191.406f,17.0096f,-167.969f, +-187.5f,14.7741f,-167.969f, +-183.594f,12.4233f,-167.969f, +-179.688f,9.35872f,-167.969f, +-175.781f,6.39156f,-167.969f, +-171.875f,4.97533f,-167.969f, +-167.969f,4.85484f,-167.969f, +-164.063f,5.54727f,-167.969f, +-160.156f,5.08595f,-167.969f, +-156.25f,3.82379f,-167.969f, +-152.344f,3.95751f,-167.969f, +-148.438f,4.60866f,-167.969f, +-144.531f,3.48771f,-167.969f, +-140.625f,3.26748f,-167.969f, +-136.719f,1.87672f,-167.969f, +-132.813f,2.70232f,-167.969f, +-128.906f,4.51339f,-167.969f, +-125.0f,6.0309f,-167.969f, +-121.094f,7.41076f,-167.969f, +-117.188f,7.44121f,-167.969f, +-113.281f,7.50774f,-167.969f, +-109.375f,6.89121f,-167.969f, +-105.469f,8.13035f,-167.969f, +-101.563f,11.7503f,-167.969f, +-97.6563f,14.1358f,-167.969f, +-93.75f,15.4553f,-167.969f, +-89.8438f,16.6233f,-167.969f, +-85.9375f,16.9002f,-167.969f, +-82.0313f,18.4951f,-167.969f, +-78.125f,19.0947f,-167.969f, +-74.2188f,20.0506f,-167.969f, +-70.3125f,20.9426f,-167.969f, +-66.4063f,22.9738f,-167.969f, +-62.5f,24.6229f,-167.969f, +-58.5938f,26.446f,-167.969f, +-54.6875f,26.6448f,-167.969f, +-50.7813f,26.7349f,-167.969f, +-46.875f,28.1266f,-167.969f, +-42.9688f,29.6034f,-167.969f, +-39.0625f,30.3572f,-167.969f, +-35.1563f,31.5467f,-167.969f, +-31.25f,33.6878f,-167.969f, +-27.3438f,35.587f,-167.969f, +-23.4375f,36.0939f,-167.969f, +-19.5313f,37.5008f,-167.969f, +-15.625f,38.2137f,-167.969f, +-11.7188f,38.0843f,-167.969f, +-7.8125f,38.5726f,-167.969f, +-3.90625f,38.3565f,-167.969f, +0.0f,37.8848f,-167.969f, +3.90625f,37.2199f,-167.969f, +-250.0f,24.1398f,-171.875f, +-246.094f,23.8227f,-171.875f, +-242.188f,24.7818f,-171.875f, +-238.281f,26.1053f,-171.875f, +-234.375f,26.9542f,-171.875f, +-230.469f,26.4956f,-171.875f, +-226.563f,25.4866f,-171.875f, +-222.656f,24.7397f,-171.875f, +-218.75f,23.4337f,-171.875f, +-214.844f,23.2342f,-171.875f, +-210.938f,22.1055f,-171.875f, +-207.031f,20.7279f,-171.875f, +-203.125f,20.7273f,-171.875f, +-199.219f,19.1302f,-171.875f, +-195.313f,16.3679f,-171.875f, +-191.406f,14.4548f,-171.875f, +-187.5f,12.5085f,-171.875f, +-183.594f,10.0081f,-171.875f, +-179.688f,7.8572f,-171.875f, +-175.781f,4.38151f,-171.875f, +-171.875f,3.2342f,-171.875f, +-167.969f,3.37553f,-171.875f, +-164.063f,3.90509f,-171.875f, +-160.156f,3.26335f,-171.875f, +-156.25f,2.88438f,-171.875f, +-152.344f,4.22045f,-171.875f, +-148.438f,3.83297f,-171.875f, +-144.531f,2.98648f,-171.875f, +-140.625f,2.83916f,-171.875f, +-136.719f,1.97368f,-171.875f, +-132.813f,1.85909f,-171.875f, +-128.906f,3.2051f,-171.875f, +-125.0f,5.12684f,-171.875f, +-121.094f,5.86909f,-171.875f, +-117.188f,6.45429f,-171.875f, +-113.281f,6.28889f,-171.875f, +-109.375f,7.53536f,-171.875f, +-105.469f,9.44844f,-171.875f, +-101.563f,11.4162f,-171.875f, +-97.6563f,13.7412f,-171.875f, +-93.75f,14.8315f,-171.875f, +-89.8438f,15.4968f,-171.875f, +-85.9375f,16.3468f,-171.875f, +-82.0313f,18.2605f,-171.875f, +-78.125f,18.0829f,-171.875f, +-74.2188f,18.1489f,-171.875f, +-70.3125f,20.6678f,-171.875f, +-66.4063f,23.1234f,-171.875f, +-62.5f,24.4247f,-171.875f, +-58.5938f,26.5223f,-171.875f, +-54.6875f,26.4286f,-171.875f, +-50.7813f,26.7163f,-171.875f, +-46.875f,28.0436f,-171.875f, +-42.9688f,29.6821f,-171.875f, +-39.0625f,30.721f,-171.875f, +-35.1563f,31.1869f,-171.875f, +-31.25f,32.2507f,-171.875f, +-27.3438f,33.3898f,-171.875f, +-23.4375f,33.9008f,-171.875f, +-19.5313f,34.8028f,-171.875f, +-15.625f,35.7178f,-171.875f, +-11.7188f,35.7796f,-171.875f, +-7.8125f,35.6384f,-171.875f, +-3.90625f,35.5122f,-171.875f, +0.0f,35.5973f,-171.875f, +3.90625f,35.3898f,-171.875f, +-250.0f,23.4472f,-175.781f, +-246.094f,24.0295f,-175.781f, +-242.188f,25.0451f,-175.781f, +-238.281f,25.8985f,-175.781f, +-234.375f,26.561f,-175.781f, +-230.469f,25.8342f,-175.781f, +-226.563f,24.8466f,-175.781f, +-222.656f,24.9204f,-175.781f, +-218.75f,23.1933f,-175.781f, +-214.844f,22.3916f,-175.781f, +-210.938f,20.9595f,-175.781f, +-207.031f,19.4013f,-175.781f, +-203.125f,18.3359f,-175.781f, +-199.219f,16.2135f,-175.781f, +-195.313f,14.3022f,-175.781f, +-191.406f,12.4792f,-175.781f, +-187.5f,10.1621f,-175.781f, +-183.594f,7.8368f,-175.781f, +-179.688f,5.59407f,-175.781f, +-175.781f,3.47332f,-175.781f, +-171.875f,2.4167f,-175.781f, +-167.969f,2.13794f,-175.781f, +-164.063f,2.36632f,-175.781f, +-160.156f,2.44955f,-175.781f, +-156.25f,2.40042f,-175.781f, +-152.344f,3.0142f,-175.781f, +-148.438f,2.58304f,-175.781f, +-144.531f,3.06221f,-175.781f, +-140.625f,2.8937f,-175.781f, +-136.719f,2.59115f,-175.781f, +-132.813f,2.27806f,-175.781f, +-128.906f,3.67695f,-175.781f, +-125.0f,5.23254f,-175.781f, +-121.094f,6.12339f,-175.781f, +-117.188f,6.24689f,-175.781f, +-113.281f,6.79282f,-175.781f, +-109.375f,7.83542f,-175.781f, +-105.469f,9.33972f,-175.781f, +-101.563f,11.2701f,-175.781f, +-97.6563f,13.0689f,-175.781f, +-93.75f,13.927f,-175.781f, +-89.8438f,14.9788f,-175.781f, +-85.9375f,15.6647f,-175.781f, +-82.0313f,16.3833f,-175.781f, +-78.125f,16.1061f,-175.781f, +-74.2188f,17.7393f,-175.781f, +-70.3125f,19.8808f,-175.781f, +-66.4063f,22.2751f,-175.781f, +-62.5f,23.8491f,-175.781f, +-58.5938f,25.3344f,-175.781f, +-54.6875f,26.6818f,-175.781f, +-50.7813f,27.9151f,-175.781f, +-46.875f,28.5054f,-175.781f, +-42.9688f,29.7057f,-175.781f, +-39.0625f,30.623f,-175.781f, +-35.1563f,31.5341f,-175.781f, +-31.25f,31.663f,-175.781f, +-27.3438f,31.1886f,-175.781f, +-23.4375f,31.5377f,-175.781f, +-19.5313f,31.9508f,-175.781f, +-15.625f,32.9549f,-175.781f, +-11.7188f,33.7731f,-175.781f, +-7.8125f,33.8023f,-175.781f, +-3.90625f,34.5283f,-175.781f, +0.0f,34.7929f,-175.781f, +3.90625f,34.823f,-175.781f, +-250.0f,22.2698f,-179.688f, +-246.094f,23.7669f,-179.688f, +-242.188f,24.59f,-179.688f, +-238.281f,26.1637f,-179.688f, +-234.375f,25.5266f,-179.688f, +-230.469f,24.4911f,-179.688f, +-226.563f,24.894f,-179.688f, +-222.656f,23.7469f,-179.688f, +-218.75f,22.9663f,-179.688f, +-214.844f,20.6574f,-179.688f, +-210.938f,19.2502f,-179.688f, +-207.031f,17.3967f,-179.688f, +-203.125f,15.9684f,-179.688f, +-199.219f,13.2948f,-179.688f, +-195.313f,11.9318f,-179.688f, +-191.406f,9.64213f,-179.688f, +-187.5f,7.9435f,-179.688f, +-183.594f,6.1917f,-179.688f, +-179.688f,4.0394f,-179.688f, +-175.781f,1.9267f,-179.688f, +-171.875f,1.73477f,-179.688f, +-167.969f,0.994442f,-179.688f, +-164.063f,0.99617f,-179.688f, +-160.156f,1.00048f,-179.688f, +-156.25f,1.54446f,-179.688f, +-152.344f,0.849521f,-179.688f, +-148.438f,1.3046f,-179.688f, +-144.531f,1.38519f,-179.688f, +-140.625f,0.916628f,-179.688f, +-136.719f,1.39685f,-179.688f, +-132.813f,2.17945f,-179.688f, +-128.906f,4.01973f,-179.688f, +-125.0f,5.72989f,-179.688f, +-121.094f,7.24268f,-179.688f, +-117.188f,7.06199f,-179.688f, +-113.281f,7.91292f,-179.688f, +-109.375f,7.8138f,-179.688f, +-105.469f,10.102f,-179.688f, +-101.563f,11.8106f,-179.688f, +-97.6563f,12.9642f,-179.688f, +-93.75f,13.5879f,-179.688f, +-89.8438f,13.4552f,-179.688f, +-85.9375f,14.1844f,-179.688f, +-82.0313f,14.3802f,-179.688f, +-78.125f,15.3847f,-179.688f, +-74.2188f,17.2288f,-179.688f, +-70.3125f,18.9285f,-179.688f, +-66.4063f,20.0035f,-179.688f, +-62.5f,22.2672f,-179.688f, +-58.5938f,25.1262f,-179.688f, +-54.6875f,27.2745f,-179.688f, +-50.7813f,28.2648f,-179.688f, +-46.875f,29.3825f,-179.688f, +-42.9688f,30.2137f,-179.688f, +-39.0625f,31.3826f,-179.688f, +-35.1563f,31.25f,-179.688f, +-31.25f,31.0392f,-179.688f, +-27.3438f,30.3369f,-179.688f, +-23.4375f,30.5503f,-179.688f, +-19.5313f,30.9715f,-179.688f, +-15.625f,31.8287f,-179.688f, +-11.7188f,32.1393f,-179.688f, +-7.8125f,32.0725f,-179.688f, +-3.90625f,32.6574f,-179.688f, +0.0f,32.8889f,-179.688f, +3.90625f,32.9461f,-179.688f, +-250.0f,22.3874f,-183.594f, +-246.094f,22.8072f,-183.594f, +-242.188f,23.1353f,-183.594f, +-238.281f,24.0949f,-183.594f, +-234.375f,24.0026f,-183.594f, +-230.469f,23.458f,-183.594f, +-226.563f,23.872f,-183.594f, +-222.656f,22.969f,-183.594f, +-218.75f,21.8375f,-183.594f, +-214.844f,19.9316f,-183.594f, +-210.938f,16.812f,-183.594f, +-207.031f,15.1789f,-183.594f, +-203.125f,13.7876f,-183.594f, +-199.219f,11.6818f,-183.594f, +-195.313f,9.75291f,-183.594f, +-191.406f,7.08878f,-183.594f, +-187.5f,6.43001f,-183.594f, +-183.594f,5.15238f,-183.594f, +-179.688f,3.77653f,-183.594f, +-175.781f,3.01737f,-183.594f, +-171.875f,1.46355f,-183.594f, +-167.969f,0.767798f,-183.594f, +-164.063f,1.98474f,-183.594f, +-160.156f,1.09473f,-183.594f, +-156.25f,1.29857f,-183.594f, +-152.344f,-0.203491f,-183.594f, +-148.438f,-0.506199f,-183.594f, +-144.531f,-0.678603f,-183.594f, +-140.625f,0.165814f,-183.594f, +-136.719f,1.44759f,-183.594f, +-132.813f,1.43337f,-183.594f, +-128.906f,3.23614f,-183.594f, +-125.0f,4.8541f,-183.594f, +-121.094f,6.64038f,-183.594f, +-117.188f,7.96432f,-183.594f, +-113.281f,8.52594f,-183.594f, +-109.375f,7.78399f,-183.594f, +-105.469f,9.45422f,-183.594f, +-101.563f,11.3198f,-183.594f, +-97.6563f,12.2369f,-183.594f, +-93.75f,12.7733f,-183.594f, +-89.8438f,12.9184f,-183.594f, +-85.9375f,12.958f,-183.594f, +-82.0313f,13.3326f,-183.594f, +-78.125f,14.3984f,-183.594f, +-74.2188f,16.2737f,-183.594f, +-70.3125f,17.9981f,-183.594f, +-66.4063f,19.5314f,-183.594f, +-62.5f,21.4039f,-183.594f, +-58.5938f,24.8945f,-183.594f, +-54.6875f,26.9904f,-183.594f, +-50.7813f,28.6222f,-183.594f, +-46.875f,30.2128f,-183.594f, +-42.9688f,30.5142f,-183.594f, +-39.0625f,30.7026f,-183.594f, +-35.1563f,30.6413f,-183.594f, +-31.25f,29.7659f,-183.594f, +-27.3438f,30.2613f,-183.594f, +-23.4375f,31.0694f,-183.594f, +-19.5313f,31.0437f,-183.594f, +-15.625f,30.9824f,-183.594f, +-11.7188f,30.4648f,-183.594f, +-7.8125f,30.0916f,-183.594f, +-3.90625f,30.0801f,-183.594f, +0.0f,29.9992f,-183.594f, +3.90625f,30.0027f,-183.594f, +-250.0f,22.2829f,-187.5f, +-246.094f,23.1567f,-187.5f, +-242.188f,23.2229f,-187.5f, +-238.281f,23.6644f,-187.5f, +-234.375f,23.5148f,-187.5f, +-230.469f,22.8756f,-187.5f, +-226.563f,22.2471f,-187.5f, +-222.656f,21.4292f,-187.5f, +-218.75f,20.4108f,-187.5f, +-214.844f,18.2601f,-187.5f, +-210.938f,16.3575f,-187.5f, +-207.031f,13.0762f,-187.5f, +-203.125f,11.5916f,-187.5f, +-199.219f,9.81885f,-187.5f, +-195.313f,8.57193f,-187.5f, +-191.406f,5.93865f,-187.5f, +-187.5f,5.15801f,-187.5f, +-183.594f,3.89597f,-187.5f, +-179.688f,4.52236f,-187.5f, +-175.781f,4.21162f,-187.5f, +-171.875f,2.62521f,-187.5f, +-167.969f,1.85733f,-187.5f, +-164.063f,2.14119f,-187.5f, +-160.156f,2.60992f,-187.5f, +-156.25f,1.99742f,-187.5f, +-152.344f,0.836315f,-187.5f, +-148.438f,-0.122141f,-187.5f, +-144.531f,-1.21041f,-187.5f, +-140.625f,0.620409f,-187.5f, +-136.719f,2.20372f,-187.5f, +-132.813f,2.55457f,-187.5f, +-128.906f,3.09944f,-187.5f, +-125.0f,4.76219f,-187.5f, +-121.094f,6.5939f,-187.5f, +-117.188f,7.40657f,-187.5f, +-113.281f,8.17096f,-187.5f, +-109.375f,8.8965f,-187.5f, +-105.469f,9.54116f,-187.5f, +-101.563f,10.8183f,-187.5f, +-97.6563f,12.2345f,-187.5f, +-93.75f,11.945f,-187.5f, +-89.8438f,12.3063f,-187.5f, +-85.9375f,12.7736f,-187.5f, +-82.0313f,13.2581f,-187.5f, +-78.125f,14.2241f,-187.5f, +-74.2188f,15.1957f,-187.5f, +-70.3125f,17.7241f,-187.5f, +-66.4063f,21.0931f,-187.5f, +-62.5f,23.7741f,-187.5f, +-58.5938f,24.8775f,-187.5f, +-54.6875f,26.5924f,-187.5f, +-50.7813f,28.0699f,-187.5f, +-46.875f,30.1552f,-187.5f, +-42.9688f,30.8508f,-187.5f, +-39.0625f,30.7935f,-187.5f, +-35.1563f,30.3224f,-187.5f, +-31.25f,28.8455f,-187.5f, +-27.3438f,30.2059f,-187.5f, +-23.4375f,31.5456f,-187.5f, +-19.5313f,31.0657f,-187.5f, +-15.625f,30.5686f,-187.5f, +-11.7188f,29.9754f,-187.5f, +-7.8125f,28.7754f,-187.5f, +-3.90625f,28.2457f,-187.5f, +0.0f,27.4045f,-187.5f, +3.90625f,27.6405f,-187.5f, +-250.0f,21.5096f,-191.406f, +-246.094f,22.1931f,-191.406f, +-242.188f,22.416f,-191.406f, +-238.281f,22.619f,-191.406f, +-234.375f,22.9242f,-191.406f, +-230.469f,22.6042f,-191.406f, +-226.563f,21.5344f,-191.406f, +-222.656f,20.226f,-191.406f, +-218.75f,19.6198f,-191.406f, +-214.844f,18.0849f,-191.406f, +-210.938f,15.9896f,-191.406f, +-207.031f,12.7402f,-191.406f, +-203.125f,9.98899f,-191.406f, +-199.219f,7.38602f,-191.406f, +-195.313f,6.23078f,-191.406f, +-191.406f,4.8714f,-191.406f, +-187.5f,4.87792f,-191.406f, +-183.594f,4.53381f,-191.406f, +-179.688f,5.23517f,-191.406f, +-175.781f,4.22349f,-191.406f, +-171.875f,3.46214f,-191.406f, +-167.969f,3.62202f,-191.406f, +-164.063f,3.07142f,-191.406f, +-160.156f,3.69893f,-191.406f, +-156.25f,4.20827f,-191.406f, +-152.344f,2.23654f,-191.406f, +-148.438f,0.582121f,-191.406f, +-144.531f,0.44941f,-191.406f, +-140.625f,2.42446f,-191.406f, +-136.719f,3.54807f,-191.406f, +-132.813f,3.58143f,-191.406f, +-128.906f,4.42162f,-191.406f, +-125.0f,5.24153f,-191.406f, +-121.094f,6.55792f,-191.406f, +-117.188f,6.93471f,-191.406f, +-113.281f,7.73309f,-191.406f, +-109.375f,8.04468f,-191.406f, +-105.469f,9.15528f,-191.406f, +-101.563f,10.9583f,-191.406f, +-97.6563f,12.1897f,-191.406f, +-93.75f,11.6481f,-191.406f, +-89.8438f,11.6514f,-191.406f, +-85.9375f,12.4326f,-191.406f, +-82.0313f,13.3808f,-191.406f, +-78.125f,14.386f,-191.406f, +-74.2188f,16.182f,-191.406f, +-70.3125f,18.9931f,-191.406f, +-66.4063f,22.8308f,-191.406f, +-62.5f,25.3868f,-191.406f, +-58.5938f,26.1484f,-191.406f, +-54.6875f,25.6258f,-191.406f, +-50.7813f,26.9464f,-191.406f, +-46.875f,29.0075f,-191.406f, +-42.9688f,29.8523f,-191.406f, +-39.0625f,30.1236f,-191.406f, +-35.1563f,29.7557f,-191.406f, +-31.25f,28.4913f,-191.406f, +-27.3438f,29.5389f,-191.406f, +-23.4375f,30.4685f,-191.406f, +-19.5313f,30.3743f,-191.406f, +-15.625f,30.3762f,-191.406f, +-11.7188f,29.0099f,-191.406f, +-7.8125f,28.1952f,-191.406f, +-3.90625f,26.135f,-191.406f, +0.0f,25.2418f,-191.406f, +3.90625f,25.3652f,-191.406f, +-250.0f,20.78f,-195.313f, +-246.094f,20.8279f,-195.313f, +-242.188f,21.2199f,-195.313f, +-238.281f,22.0652f,-195.313f, +-234.375f,22.2095f,-195.313f, +-230.469f,22.1372f,-195.313f, +-226.563f,21.0165f,-195.313f, +-222.656f,19.4174f,-195.313f, +-218.75f,17.7927f,-195.313f, +-214.844f,16.6172f,-195.313f, +-210.938f,14.7065f,-195.313f, +-207.031f,11.8095f,-195.313f, +-203.125f,9.63824f,-195.313f, +-199.219f,6.4991f,-195.313f, +-195.313f,6.23707f,-195.313f, +-191.406f,6.60374f,-195.313f, +-187.5f,6.22557f,-195.313f, +-183.594f,5.47951f,-195.313f, +-179.688f,5.16851f,-195.313f, +-175.781f,4.83538f,-195.313f, +-171.875f,4.16992f,-195.313f, +-167.969f,5.40533f,-195.313f, +-164.063f,5.01562f,-195.313f, +-160.156f,4.58978f,-195.313f, +-156.25f,4.73252f,-195.313f, +-152.344f,3.14586f,-195.313f, +-148.438f,1.16894f,-195.313f, +-144.531f,2.4916f,-195.313f, +-140.625f,3.98933f,-195.313f, +-136.719f,5.16861f,-195.313f, +-132.813f,5.68931f,-195.313f, +-128.906f,5.45815f,-195.313f, +-125.0f,5.15506f,-195.313f, +-121.094f,6.46153f,-195.313f, +-117.188f,7.36577f,-195.313f, +-113.281f,8.13491f,-195.313f, +-109.375f,7.50896f,-195.313f, +-105.469f,8.93662f,-195.313f, +-101.563f,10.6513f,-195.313f, +-97.6563f,10.6255f,-195.313f, +-93.75f,10.5332f,-195.313f, +-89.8438f,11.5758f,-195.313f, +-85.9375f,11.568f,-195.313f, +-82.0313f,14.2419f,-195.313f, +-78.125f,16.1272f,-195.313f, +-74.2188f,17.0994f,-195.313f, +-70.3125f,20.4651f,-195.313f, +-66.4063f,23.534f,-195.313f, +-62.5f,25.1181f,-195.313f, +-58.5938f,25.9427f,-195.313f, +-54.6875f,25.5166f,-195.313f, +-50.7813f,25.1027f,-195.313f, +-46.875f,27.2281f,-195.313f, +-42.9688f,28.7319f,-195.313f, +-39.0625f,28.8984f,-195.313f, +-35.1563f,28.3307f,-195.313f, +-31.25f,27.4754f,-195.313f, +-27.3438f,27.8763f,-195.313f, +-23.4375f,28.1023f,-195.313f, +-19.5313f,28.9815f,-195.313f, +-15.625f,28.5849f,-195.313f, +-11.7188f,27.2687f,-195.313f, +-7.8125f,26.8112f,-195.313f, +-3.90625f,25.3636f,-195.313f, +0.0f,23.2134f,-195.313f, +3.90625f,23.0993f,-195.313f, +-250.0f,20.2026f,-199.219f, +-246.094f,19.5895f,-199.219f, +-242.188f,20.3489f,-199.219f, +-238.281f,21.0293f,-199.219f, +-234.375f,21.5343f,-199.219f, +-230.469f,20.6859f,-199.219f, +-226.563f,19.9279f,-199.219f, +-222.656f,18.7217f,-199.219f, +-218.75f,17.4818f,-199.219f, +-214.844f,15.0438f,-199.219f, +-210.938f,13.4082f,-199.219f, +-207.031f,10.7188f,-199.219f, +-203.125f,8.32176f,-199.219f, +-199.219f,7.30407f,-199.219f, +-195.313f,7.02569f,-199.219f, +-191.406f,7.38826f,-199.219f, +-187.5f,6.94954f,-199.219f, +-183.594f,6.62067f,-199.219f, +-179.688f,6.55308f,-199.219f, +-175.781f,6.3403f,-199.219f, +-171.875f,5.0001f,-199.219f, +-167.969f,6.51564f,-199.219f, +-164.063f,6.69774f,-199.219f, +-160.156f,5.67189f,-199.219f, +-156.25f,4.8973f,-199.219f, +-152.344f,3.43798f,-199.219f, +-148.438f,2.08531f,-199.219f, +-144.531f,3.86643f,-199.219f, +-140.625f,6.0862f,-199.219f, +-136.719f,6.99995f,-199.219f, +-132.813f,8.32808f,-199.219f, +-128.906f,8.55809f,-199.219f, +-125.0f,8.26904f,-199.219f, +-121.094f,8.63733f,-199.219f, +-117.188f,9.11106f,-199.219f, +-113.281f,9.73154f,-199.219f, +-109.375f,9.14108f,-199.219f, +-105.469f,9.3525f,-199.219f, +-101.563f,9.56281f,-199.219f, +-97.6563f,9.74866f,-199.219f, +-93.75f,10.9852f,-199.219f, +-89.8438f,12.3926f,-199.219f, +-85.9375f,13.6407f,-199.219f, +-82.0313f,15.9886f,-199.219f, +-78.125f,17.7913f,-199.219f, +-74.2188f,18.8352f,-199.219f, +-70.3125f,20.2718f,-199.219f, +-66.4063f,23.501f,-199.219f, +-62.5f,24.6073f,-199.219f, +-58.5938f,25.3028f,-199.219f, +-54.6875f,25.2244f,-199.219f, +-50.7813f,23.9922f,-199.219f, +-46.875f,24.6425f,-199.219f, +-42.9688f,26.6199f,-199.219f, +-39.0625f,27.5474f,-199.219f, +-35.1563f,27.4672f,-199.219f, +-31.25f,27.2906f,-199.219f, +-27.3438f,26.489f,-199.219f, +-23.4375f,26.3554f,-199.219f, +-19.5313f,26.1787f,-199.219f, +-15.625f,26.2538f,-199.219f, +-11.7188f,25.7694f,-199.219f, +-7.8125f,25.2691f,-199.219f, +-3.90625f,23.3867f,-199.219f, +0.0f,22.5717f,-199.219f, +3.90625f,21.5827f,-199.219f, +-250.0f,19.3526f,-203.125f, +-246.094f,19.2964f,-203.125f, +-242.188f,19.226f,-203.125f, +-238.281f,19.4274f,-203.125f, +-234.375f,19.4317f,-203.125f, +-230.469f,19.3079f,-203.125f, +-226.563f,18.212f,-203.125f, +-222.656f,17.8371f,-203.125f, +-218.75f,16.8642f,-203.125f, +-214.844f,14.8539f,-203.125f, +-210.938f,12.425f,-203.125f, +-207.031f,10.0369f,-203.125f, +-203.125f,9.00151f,-203.125f, +-199.219f,8.61334f,-203.125f, +-195.313f,8.09586f,-203.125f, +-191.406f,8.18143f,-203.125f, +-187.5f,7.75345f,-203.125f, +-183.594f,7.72772f,-203.125f, +-179.688f,7.71649f,-203.125f, +-175.781f,7.72935f,-203.125f, +-171.875f,6.70116f,-203.125f, +-167.969f,6.58828f,-203.125f, +-164.063f,6.47975f,-203.125f, +-160.156f,5.96451f,-203.125f, +-156.25f,5.85253f,-203.125f, +-152.344f,5.14982f,-203.125f, +-148.438f,4.60646f,-203.125f, +-144.531f,6.3659f,-203.125f, +-140.625f,7.66587f,-203.125f, +-136.719f,8.68095f,-203.125f, +-132.813f,9.86922f,-203.125f, +-128.906f,9.93481f,-203.125f, +-125.0f,10.9585f,-203.125f, +-121.094f,10.9271f,-203.125f, +-117.188f,11.4348f,-203.125f, +-113.281f,11.0548f,-203.125f, +-109.375f,11.2501f,-203.125f, +-105.469f,11.7673f,-203.125f, +-101.563f,10.8899f,-203.125f, +-97.6563f,11.3791f,-203.125f, +-93.75f,12.168f,-203.125f, +-89.8438f,12.7667f,-203.125f, +-85.9375f,15.2415f,-203.125f, +-82.0313f,17.9783f,-203.125f, +-78.125f,19.6193f,-203.125f, +-74.2188f,19.6343f,-203.125f, +-70.3125f,19.7814f,-203.125f, +-66.4063f,21.45f,-203.125f, +-62.5f,24.1224f,-203.125f, +-58.5938f,24.9145f,-203.125f, +-54.6875f,24.2614f,-203.125f, +-50.7813f,24.025f,-203.125f, +-46.875f,23.1092f,-203.125f, +-42.9688f,24.0294f,-203.125f, +-39.0625f,25.4744f,-203.125f, +-35.1563f,25.9477f,-203.125f, +-31.25f,25.5895f,-203.125f, +-27.3438f,25.0752f,-203.125f, +-23.4375f,24.6537f,-203.125f, +-19.5313f,25.0025f,-203.125f, +-15.625f,25.211f,-203.125f, +-11.7188f,24.2103f,-203.125f, +-7.8125f,23.1363f,-203.125f, +-3.90625f,21.4314f,-203.125f, +0.0f,20.8784f,-203.125f, +3.90625f,20.3179f,-203.125f, +-250.0f,18.4857f,-207.031f, +-246.094f,18.9103f,-207.031f, +-242.188f,17.7666f,-207.031f, +-238.281f,18.3803f,-207.031f, +-234.375f,17.7746f,-207.031f, +-230.469f,18.1956f,-207.031f, +-226.563f,17.4596f,-207.031f, +-222.656f,16.5346f,-207.031f, +-218.75f,15.3933f,-207.031f, +-214.844f,14.0342f,-207.031f, +-210.938f,11.5492f,-207.031f, +-207.031f,10.8526f,-207.031f, +-203.125f,10.5164f,-207.031f, +-199.219f,10.4957f,-207.031f, +-195.313f,9.57889f,-207.031f, +-191.406f,9.42031f,-207.031f, +-187.5f,9.08544f,-207.031f, +-183.594f,8.10082f,-207.031f, +-179.688f,8.5632f,-207.031f, +-175.781f,8.74392f,-207.031f, +-171.875f,8.56175f,-207.031f, +-167.969f,7.13665f,-207.031f, +-164.063f,6.99003f,-207.031f, +-160.156f,7.1192f,-207.031f, +-156.25f,6.173f,-207.031f, +-152.344f,6.44193f,-207.031f, +-148.438f,7.15583f,-207.031f, +-144.531f,7.74526f,-207.031f, +-140.625f,9.38846f,-207.031f, +-136.719f,10.1943f,-207.031f, +-132.813f,10.5195f,-207.031f, +-128.906f,11.4457f,-207.031f, +-125.0f,12.4233f,-207.031f, +-121.094f,12.8633f,-207.031f, +-117.188f,13.4045f,-207.031f, +-113.281f,12.9134f,-207.031f, +-109.375f,12.9203f,-207.031f, +-105.469f,13.2173f,-207.031f, +-101.563f,12.9065f,-207.031f, +-97.6563f,12.9327f,-207.031f, +-93.75f,13.5926f,-207.031f, +-89.8438f,14.5472f,-207.031f, +-85.9375f,16.41f,-207.031f, +-82.0313f,19.1484f,-207.031f, +-78.125f,20.5688f,-207.031f, +-74.2188f,20.1464f,-207.031f, +-70.3125f,19.9352f,-207.031f, +-66.4063f,20.4543f,-207.031f, +-62.5f,22.0083f,-207.031f, +-58.5938f,23.2866f,-207.031f, +-54.6875f,23.3242f,-207.031f, +-50.7813f,23.0127f,-207.031f, +-46.875f,23.4455f,-207.031f, +-42.9688f,23.4808f,-207.031f, +-39.0625f,24.4622f,-207.031f, +-35.1563f,25.1122f,-207.031f, +-31.25f,25.3818f,-207.031f, +-27.3438f,24.0051f,-207.031f, +-23.4375f,22.3971f,-207.031f, +-19.5313f,23.4811f,-207.031f, +-15.625f,23.8447f,-207.031f, +-11.7188f,22.3912f,-207.031f, +-7.8125f,21.7286f,-207.031f, +-3.90625f,20.1632f,-207.031f, +0.0f,18.6587f,-207.031f, +3.90625f,18.3149f,-207.031f, +-250.0f,17.6517f,-210.938f, +-246.094f,17.8132f,-210.938f, +-242.188f,17.4894f,-210.938f, +-238.281f,16.7087f,-210.938f, +-234.375f,15.9111f,-210.938f, +-230.469f,16.6733f,-210.938f, +-226.563f,16.6911f,-210.938f, +-222.656f,14.6177f,-210.938f, +-218.75f,13.6959f,-210.938f, +-214.844f,12.227f,-210.938f, +-210.938f,11.5376f,-210.938f, +-207.031f,11.7259f,-210.938f, +-203.125f,11.4804f,-210.938f, +-199.219f,11.8728f,-210.938f, +-195.313f,11.7357f,-210.938f, +-191.406f,10.6319f,-210.938f, +-187.5f,10.7016f,-210.938f, +-183.594f,9.53811f,-210.938f, +-179.688f,9.65149f,-210.938f, +-175.781f,9.45993f,-210.938f, +-171.875f,9.4427f,-210.938f, +-167.969f,8.02525f,-210.938f, +-164.063f,6.71089f,-210.938f, +-160.156f,7.22567f,-210.938f, +-156.25f,7.52391f,-210.938f, +-152.344f,8.46765f,-210.938f, +-148.438f,8.60801f,-210.938f, +-144.531f,9.89046f,-210.938f, +-140.625f,10.9163f,-210.938f, +-136.719f,11.445f,-210.938f, +-132.813f,12.6949f,-210.938f, +-128.906f,13.3645f,-210.938f, +-125.0f,14.5389f,-210.938f, +-121.094f,14.7689f,-210.938f, +-117.188f,15.8285f,-210.938f, +-113.281f,15.5058f,-210.938f, +-109.375f,14.3542f,-210.938f, +-105.469f,14.9928f,-210.938f, +-101.563f,14.9601f,-210.938f, +-97.6563f,15.1602f,-210.938f, +-93.75f,15.1589f,-210.938f, +-89.8438f,16.5401f,-210.938f, +-85.9375f,18.2407f,-210.938f, +-82.0313f,19.8006f,-210.938f, +-78.125f,20.9223f,-210.938f, +-74.2188f,20.5615f,-210.938f, +-70.3125f,21.0505f,-210.938f, +-66.4063f,21.024f,-210.938f, +-62.5f,21.7216f,-210.938f, +-58.5938f,22.8737f,-210.938f, +-54.6875f,23.631f,-210.938f, +-50.7813f,23.6265f,-210.938f, +-46.875f,23.5636f,-210.938f, +-42.9688f,24.1299f,-210.938f, +-39.0625f,24.6395f,-210.938f, +-35.1563f,25.3237f,-210.938f, +-31.25f,24.7459f,-210.938f, +-27.3438f,22.2327f,-210.938f, +-23.4375f,21.6309f,-210.938f, +-19.5313f,22.3059f,-210.938f, +-15.625f,22.1894f,-210.938f, +-11.7188f,21.2088f,-210.938f, +-7.8125f,20.3383f,-210.938f, +-3.90625f,18.4799f,-210.938f, +0.0f,17.18f,-210.938f, +3.90625f,16.2147f,-210.938f, +-250.0f,17.6547f,-214.844f, +-246.094f,17.1845f,-214.844f, +-242.188f,17.6913f,-214.844f, +-238.281f,16.8842f,-214.844f, +-234.375f,14.7169f,-214.844f, +-230.469f,15.4287f,-214.844f, +-226.563f,14.5659f,-214.844f, +-222.656f,13.1756f,-214.844f, +-218.75f,12.021f,-214.844f, +-214.844f,11.9663f,-214.844f, +-210.938f,12.535f,-214.844f, +-207.031f,12.5802f,-214.844f, +-203.125f,12.7437f,-214.844f, +-199.219f,12.9859f,-214.844f, +-195.313f,12.7714f,-214.844f, +-191.406f,11.9783f,-214.844f, +-187.5f,11.9282f,-214.844f, +-183.594f,10.7633f,-214.844f, +-179.688f,10.3463f,-214.844f, +-175.781f,10.1867f,-214.844f, +-171.875f,10.378f,-214.844f, +-167.969f,8.81572f,-214.844f, +-164.063f,7.29133f,-214.844f, +-160.156f,8.45242f,-214.844f, +-156.25f,9.77224f,-214.844f, +-152.344f,10.4567f,-214.844f, +-148.438f,11.0484f,-214.844f, +-144.531f,12.1985f,-214.844f, +-140.625f,13.766f,-214.844f, +-136.719f,14.9123f,-214.844f, +-132.813f,15.4577f,-214.844f, +-128.906f,16.3401f,-214.844f, +-125.0f,16.5963f,-214.844f, +-121.094f,16.9605f,-214.844f, +-117.188f,16.548f,-214.844f, +-113.281f,16.701f,-214.844f, +-109.375f,16.6987f,-214.844f, +-105.469f,16.1393f,-214.844f, +-101.563f,15.4379f,-214.844f, +-97.6563f,15.9931f,-214.844f, +-93.75f,16.7962f,-214.844f, +-89.8438f,18.5464f,-214.844f, +-85.9375f,20.2834f,-214.844f, +-82.0313f,20.8463f,-214.844f, +-78.125f,21.263f,-214.844f, +-74.2188f,22.137f,-214.844f, +-70.3125f,22.1614f,-214.844f, +-66.4063f,21.7706f,-214.844f, +-62.5f,23.0496f,-214.844f, +-58.5938f,23.0762f,-214.844f, +-54.6875f,24.2163f,-214.844f, +-50.7813f,23.9415f,-214.844f, +-46.875f,23.115f,-214.844f, +-42.9688f,24.4371f,-214.844f, +-39.0625f,25.7433f,-214.844f, +-35.1563f,24.6385f,-214.844f, +-31.25f,23.2822f,-214.844f, +-27.3438f,21.8583f,-214.844f, +-23.4375f,21.2352f,-214.844f, +-19.5313f,21.3084f,-214.844f, +-15.625f,20.7264f,-214.844f, +-11.7188f,19.67f,-214.844f, +-7.8125f,18.8192f,-214.844f, +-3.90625f,16.6504f,-214.844f, +0.0f,14.8779f,-214.844f, +3.90625f,14.284f,-214.844f, +-250.0f,17.1549f,-218.75f, +-246.094f,16.6295f,-218.75f, +-242.188f,17.7459f,-218.75f, +-238.281f,17.3894f,-218.75f, +-234.375f,15.2738f,-218.75f, +-230.469f,13.3984f,-218.75f, +-226.563f,12.8639f,-218.75f, +-222.656f,12.3225f,-218.75f, +-218.75f,12.1914f,-218.75f, +-214.844f,12.4104f,-218.75f, +-210.938f,12.9278f,-218.75f, +-207.031f,13.387f,-218.75f, +-203.125f,13.4342f,-218.75f, +-199.219f,12.7445f,-218.75f, +-195.313f,12.543f,-218.75f, +-191.406f,12.1437f,-218.75f, +-187.5f,12.3491f,-218.75f, +-183.594f,11.2334f,-218.75f, +-179.688f,11.4016f,-218.75f, +-175.781f,11.2455f,-218.75f, +-171.875f,10.3681f,-218.75f, +-167.969f,9.23056f,-218.75f, +-164.063f,8.35869f,-218.75f, +-160.156f,10.3612f,-218.75f, +-156.25f,11.8429f,-218.75f, +-152.344f,13.2154f,-218.75f, +-148.438f,13.6238f,-218.75f, +-144.531f,14.8343f,-218.75f, +-140.625f,15.5549f,-218.75f, +-136.719f,16.9496f,-218.75f, +-132.813f,17.9187f,-218.75f, +-128.906f,17.7467f,-218.75f, +-125.0f,17.8229f,-218.75f, +-121.094f,17.4408f,-218.75f, +-117.188f,17.3929f,-218.75f, +-113.281f,17.9861f,-218.75f, +-109.375f,18.0206f,-218.75f, +-105.469f,17.6787f,-218.75f, +-101.563f,17.3769f,-218.75f, +-97.6563f,17.5683f,-218.75f, +-93.75f,18.0067f,-218.75f, +-89.8438f,18.9639f,-218.75f, +-85.9375f,20.8377f,-218.75f, +-82.0313f,22.207f,-218.75f, +-78.125f,23.1239f,-218.75f, +-74.2188f,22.384f,-218.75f, +-70.3125f,22.2939f,-218.75f, +-66.4063f,21.8208f,-218.75f, +-62.5f,22.9458f,-218.75f, +-58.5938f,24.2547f,-218.75f, +-54.6875f,24.5855f,-218.75f, +-50.7813f,23.9529f,-218.75f, +-46.875f,22.9226f,-218.75f, +-42.9688f,25.1015f,-218.75f, +-39.0625f,25.1591f,-218.75f, +-35.1563f,23.6146f,-218.75f, +-31.25f,21.7924f,-218.75f, +-27.3438f,20.3147f,-218.75f, +-23.4375f,19.9227f,-218.75f, +-19.5313f,20.3267f,-218.75f, +-15.625f,19.1903f,-218.75f, +-11.7188f,17.3132f,-218.75f, +-7.8125f,16.5145f,-218.75f, +-3.90625f,15.5991f,-218.75f, +0.0f,13.7865f,-218.75f, +3.90625f,13.272f,-218.75f, +-250.0f,16.7536f,-222.656f, +-246.094f,16.7692f,-222.656f, +-242.188f,17.6216f,-222.656f, +-238.281f,17.7524f,-222.656f, +-234.375f,15.7102f,-222.656f, +-230.469f,13.9934f,-222.656f, +-226.563f,13.1311f,-222.656f, +-222.656f,13.6218f,-222.656f, +-218.75f,13.8812f,-222.656f, +-214.844f,13.6928f,-222.656f, +-210.938f,13.2498f,-222.656f, +-207.031f,13.9199f,-222.656f, +-203.125f,14.8224f,-222.656f, +-199.219f,14.7821f,-222.656f, +-195.313f,14.4118f,-222.656f, +-191.406f,13.2421f,-222.656f, +-187.5f,13.1953f,-222.656f, +-183.594f,11.9441f,-222.656f, +-179.688f,11.8006f,-222.656f, +-175.781f,11.2509f,-222.656f, +-171.875f,9.7863f,-222.656f, +-167.969f,8.85086f,-222.656f, +-164.063f,10.6896f,-222.656f, +-160.156f,12.9132f,-222.656f, +-156.25f,13.602f,-222.656f, +-152.344f,15.3711f,-222.656f, +-148.438f,16.1768f,-222.656f, +-144.531f,16.9203f,-222.656f, +-140.625f,17.0404f,-222.656f, +-136.719f,18.4968f,-222.656f, +-132.813f,18.8222f,-222.656f, +-128.906f,19.2736f,-222.656f, +-125.0f,19.1956f,-222.656f, +-121.094f,18.5998f,-222.656f, +-117.188f,18.5054f,-222.656f, +-113.281f,19.68f,-222.656f, +-109.375f,19.5038f,-222.656f, +-105.469f,19.4749f,-222.656f, +-101.563f,18.7504f,-222.656f, +-97.6563f,18.6121f,-222.656f, +-93.75f,19.1119f,-222.656f, +-89.8438f,20.5347f,-222.656f, +-85.9375f,21.4412f,-222.656f, +-82.0313f,22.187f,-222.656f, +-78.125f,22.9384f,-222.656f, +-74.2188f,22.5226f,-222.656f, +-70.3125f,22.7323f,-222.656f, +-66.4063f,23.4931f,-222.656f, +-62.5f,24.6895f,-222.656f, +-58.5938f,24.9745f,-222.656f, +-54.6875f,24.801f,-222.656f, +-50.7813f,23.2235f,-222.656f, +-46.875f,22.4973f,-222.656f, +-42.9688f,23.9826f,-222.656f, +-39.0625f,23.4458f,-222.656f, +-35.1563f,22.66f,-222.656f, +-31.25f,20.8011f,-222.656f, +-27.3438f,18.877f,-222.656f, +-23.4375f,17.9999f,-222.656f, +-19.5313f,18.2206f,-222.656f, +-15.625f,17.8501f,-222.656f, +-11.7188f,16.2125f,-222.656f, +-7.8125f,15.4897f,-222.656f, +-3.90625f,14.2048f,-222.656f, +0.0f,13.1443f,-222.656f, +3.90625f,13.0199f,-222.656f, +-250.0f,15.9959f,-226.563f, +-246.094f,16.3902f,-226.563f, +-242.188f,17.2433f,-226.563f, +-238.281f,16.8903f,-226.563f, +-234.375f,16.2616f,-226.563f, +-230.469f,16.3335f,-226.563f, +-226.563f,15.3662f,-226.563f, +-222.656f,14.6429f,-226.563f, +-218.75f,15.2987f,-226.563f, +-214.844f,15.1249f,-226.563f, +-210.938f,14.6321f,-226.563f, +-207.031f,15.402f,-226.563f, +-203.125f,15.5803f,-226.563f, +-199.219f,15.8024f,-226.563f, +-195.313f,14.9564f,-226.563f, +-191.406f,14.7272f,-226.563f, +-187.5f,14.0749f,-226.563f, +-183.594f,12.2838f,-226.563f, +-179.688f,12.0268f,-226.563f, +-175.781f,10.904f,-226.563f, +-171.875f,10.0049f,-226.563f, +-167.969f,9.85558f,-226.563f, +-164.063f,11.873f,-226.563f, +-160.156f,14.0684f,-226.563f, +-156.25f,15.4765f,-226.563f, +-152.344f,16.7458f,-226.563f, +-148.438f,17.9359f,-226.563f, +-144.531f,18.4507f,-226.563f, +-140.625f,18.3457f,-226.563f, +-136.719f,20.0059f,-226.563f, +-132.813f,20.3125f,-226.563f, +-128.906f,19.751f,-226.563f, +-125.0f,19.8084f,-226.563f, +-121.094f,19.9091f,-226.563f, +-117.188f,20.3401f,-226.563f, +-113.281f,20.8121f,-226.563f, +-109.375f,20.5705f,-226.563f, +-105.469f,20.9909f,-226.563f, +-101.563f,20.4171f,-226.563f, +-97.6563f,19.834f,-226.563f, +-93.75f,19.9289f,-226.563f, +-89.8438f,20.4305f,-226.563f, +-85.9375f,21.4097f,-226.563f, +-82.0313f,21.9666f,-226.563f, +-78.125f,22.5232f,-226.563f, +-74.2188f,22.2049f,-226.563f, +-70.3125f,22.7045f,-226.563f, +-66.4063f,23.7933f,-226.563f, +-62.5f,24.5938f,-226.563f, +-58.5938f,24.6161f,-226.563f, +-54.6875f,23.6008f,-226.563f, +-50.7813f,21.9411f,-226.563f, +-46.875f,21.6164f,-226.563f, +-42.9688f,22.5551f,-226.563f, +-39.0625f,22.5032f,-226.563f, +-35.1563f,21.5165f,-226.563f, +-31.25f,19.8362f,-226.563f, +-27.3438f,17.5967f,-226.563f, +-23.4375f,15.6932f,-226.563f, +-19.5313f,15.7774f,-226.563f, +-15.625f,15.6405f,-226.563f, +-11.7188f,14.7549f,-226.563f, +-7.8125f,14.3205f,-226.563f, +-3.90625f,13.2947f,-226.563f, +0.0f,11.9266f,-226.563f, +3.90625f,11.9733f,-226.563f, +-250.0f,15.2423f,-230.469f, +-246.094f,16.2143f,-230.469f, +-242.188f,17.2462f,-230.469f, +-238.281f,17.7941f,-230.469f, +-234.375f,18.4029f,-230.469f, +-230.469f,18.5726f,-230.469f, +-226.563f,17.4729f,-230.469f, +-222.656f,15.9467f,-230.469f, +-218.75f,15.5021f,-230.469f, +-214.844f,15.7096f,-230.469f, +-210.938f,15.6276f,-230.469f, +-207.031f,15.7025f,-230.469f, +-203.125f,14.8851f,-230.469f, +-199.219f,14.87f,-230.469f, +-195.313f,14.3971f,-230.469f, +-191.406f,14.5771f,-230.469f, +-187.5f,13.8163f,-230.469f, +-183.594f,12.7605f,-230.469f, +-179.688f,12.587f,-230.469f, +-175.781f,11.0727f,-230.469f, +-171.875f,10.0166f,-230.469f, +-167.969f,12.5787f,-230.469f, +-164.063f,13.3613f,-230.469f, +-160.156f,14.7537f,-230.469f, +-156.25f,15.9879f,-230.469f, +-152.344f,17.6792f,-230.469f, +-148.438f,18.5224f,-230.469f, +-144.531f,18.5026f,-230.469f, +-140.625f,19.4852f,-230.469f, +-136.719f,20.3222f,-230.469f, +-132.813f,20.2809f,-230.469f, +-128.906f,21.0408f,-230.469f, +-125.0f,20.4729f,-230.469f, +-121.094f,20.8829f,-230.469f, +-117.188f,21.532f,-230.469f, +-113.281f,21.3373f,-230.469f, +-109.375f,22.0014f,-230.469f, +-105.469f,22.1484f,-230.469f, +-101.563f,21.7053f,-230.469f, +-97.6563f,20.5255f,-230.469f, +-93.75f,19.6269f,-230.469f, +-89.8438f,20.0012f,-230.469f, +-85.9375f,21.0697f,-230.469f, +-82.0313f,21.8192f,-230.469f, +-78.125f,22.7525f,-230.469f, +-74.2188f,22.3932f,-230.469f, +-70.3125f,22.0383f,-230.469f, +-66.4063f,22.5989f,-230.469f, +-62.5f,23.0428f,-230.469f, +-58.5938f,22.4512f,-230.469f, +-54.6875f,21.5848f,-230.469f, +-50.7813f,20.085f,-230.469f, +-46.875f,19.9106f,-230.469f, +-42.9688f,20.5256f,-230.469f, +-39.0625f,20.2072f,-230.469f, +-35.1563f,18.9414f,-230.469f, +-31.25f,17.9342f,-230.469f, +-27.3438f,15.3472f,-230.469f, +-23.4375f,13.2173f,-230.469f, +-19.5313f,13.1448f,-230.469f, +-15.625f,13.7506f,-230.469f, +-11.7188f,12.7439f,-230.469f, +-7.8125f,12.5338f,-230.469f, +-3.90625f,12.0435f,-230.469f, +0.0f,11.0483f,-230.469f, +3.90625f,10.4619f,-230.469f, +-250.0f,15.6879f,-234.375f, +-246.094f,17.6667f,-234.375f, +-242.188f,18.8427f,-234.375f, +-238.281f,19.6527f,-234.375f, +-234.375f,19.7979f,-234.375f, +-230.469f,19.8698f,-234.375f, +-226.563f,19.1736f,-234.375f, +-222.656f,16.9995f,-234.375f, +-218.75f,15.4573f,-234.375f, +-214.844f,15.6294f,-234.375f, +-210.938f,15.4315f,-234.375f, +-207.031f,15.1239f,-234.375f, +-203.125f,14.669f,-234.375f, +-199.219f,14.4586f,-234.375f, +-195.313f,14.1329f,-234.375f, +-191.406f,14.0558f,-234.375f, +-187.5f,13.3746f,-234.375f, +-183.594f,13.2348f,-234.375f, +-179.688f,13.3354f,-234.375f, +-175.781f,12.1532f,-234.375f, +-171.875f,11.4785f,-234.375f, +-167.969f,12.7174f,-234.375f, +-164.063f,14.0617f,-234.375f, +-160.156f,15.3367f,-234.375f, +-156.25f,16.6196f,-234.375f, +-152.344f,17.6677f,-234.375f, +-148.438f,18.475f,-234.375f, +-144.531f,19.8205f,-234.375f, +-140.625f,19.6973f,-234.375f, +-136.719f,20.5952f,-234.375f, +-132.813f,20.3507f,-234.375f, +-128.906f,20.8729f,-234.375f, +-125.0f,21.9377f,-234.375f, +-121.094f,21.8916f,-234.375f, +-117.188f,21.9614f,-234.375f, +-113.281f,22.1752f,-234.375f, +-109.375f,22.2881f,-234.375f, +-105.469f,23.1063f,-234.375f, +-101.563f,23.4826f,-234.375f, +-97.6563f,22.5968f,-234.375f, +-93.75f,21.3142f,-234.375f, +-89.8438f,19.9609f,-234.375f, +-85.9375f,21.4353f,-234.375f, +-82.0313f,21.9716f,-234.375f, +-78.125f,22.6918f,-234.375f, +-74.2188f,21.9561f,-234.375f, +-70.3125f,21.3085f,-234.375f, +-66.4063f,21.4104f,-234.375f, +-62.5f,21.4904f,-234.375f, +-58.5938f,20.2467f,-234.375f, +-54.6875f,19.1535f,-234.375f, +-50.7813f,17.9598f,-234.375f, +-46.875f,18.0449f,-234.375f, +-42.9688f,18.3612f,-234.375f, +-39.0625f,17.5008f,-234.375f, +-35.1563f,16.7819f,-234.375f, +-31.25f,15.4328f,-234.375f, +-27.3438f,13.9747f,-234.375f, +-23.4375f,12.1868f,-234.375f, +-19.5313f,12.0847f,-234.375f, +-15.625f,11.926f,-234.375f, +-11.7188f,11.3058f,-234.375f, +-7.8125f,11.0187f,-234.375f, +-3.90625f,10.1275f,-234.375f, +0.0f,9.73133f,-234.375f, +3.90625f,8.85224f,-234.375f, +-250.0f,16.6463f,-238.281f, +-246.094f,18.8582f,-238.281f, +-242.188f,19.6269f,-238.281f, +-238.281f,20.3222f,-238.281f, +-234.375f,20.8316f,-238.281f, +-230.469f,20.6072f,-238.281f, +-226.563f,19.2331f,-238.281f, +-222.656f,18.0021f,-238.281f, +-218.75f,16.4891f,-238.281f, +-214.844f,15.7845f,-238.281f, +-210.938f,15.4622f,-238.281f, +-207.031f,14.3459f,-238.281f, +-203.125f,14.6544f,-238.281f, +-199.219f,13.7779f,-238.281f, +-195.313f,13.4199f,-238.281f, +-191.406f,13.2089f,-238.281f, +-187.5f,12.5036f,-238.281f, +-183.594f,12.6398f,-238.281f, +-179.688f,13.015f,-238.281f, +-175.781f,12.659f,-238.281f, +-171.875f,13.2801f,-238.281f, +-167.969f,13.9547f,-238.281f, +-164.063f,14.8792f,-238.281f, +-160.156f,16.4144f,-238.281f, +-156.25f,17.1062f,-238.281f, +-152.344f,17.9028f,-238.281f, +-148.438f,19.1823f,-238.281f, +-144.531f,20.6903f,-238.281f, +-140.625f,19.9053f,-238.281f, +-136.719f,20.8795f,-238.281f, +-132.813f,21.7034f,-238.281f, +-128.906f,21.8373f,-238.281f, +-125.0f,22.5134f,-238.281f, +-121.094f,22.7918f,-238.281f, +-117.188f,23.1126f,-238.281f, +-113.281f,23.0308f,-238.281f, +-109.375f,23.7212f,-238.281f, +-105.469f,24.6127f,-238.281f, +-101.563f,24.5942f,-238.281f, +-97.6563f,24.0315f,-238.281f, +-93.75f,23.2191f,-238.281f, +-89.8438f,21.3372f,-238.281f, +-85.9375f,20.6395f,-238.281f, +-82.0313f,22.2808f,-238.281f, +-78.125f,22.2977f,-238.281f, +-74.2188f,21.5802f,-238.281f, +-70.3125f,20.5131f,-238.281f, +-66.4063f,20.0882f,-238.281f, +-62.5f,19.9865f,-238.281f, +-58.5938f,19.1423f,-238.281f, +-54.6875f,16.917f,-238.281f, +-50.7813f,16.0256f,-238.281f, +-46.875f,15.4122f,-238.281f, +-42.9688f,15.0531f,-238.281f, +-39.0625f,15.8819f,-238.281f, +-35.1563f,14.3724f,-238.281f, +-31.25f,12.993f,-238.281f, +-27.3438f,11.8948f,-238.281f, +-23.4375f,10.1339f,-238.281f, +-19.5313f,10.4205f,-238.281f, +-15.625f,10.7339f,-238.281f, +-11.7188f,9.86852f,-238.281f, +-7.8125f,8.89818f,-238.281f, +-3.90625f,8.20848f,-238.281f, +0.0f,7.89095f,-238.281f, +3.90625f,7.99527f,-238.281f, +-250.0f,16.461f,-242.188f, +-246.094f,18.8623f,-242.188f, +-242.188f,19.6097f,-242.188f, +-238.281f,20.8167f,-242.188f, +-234.375f,21.0667f,-242.188f, +-230.469f,20.3337f,-242.188f, +-226.563f,18.9993f,-242.188f, +-222.656f,17.8141f,-242.188f, +-218.75f,17.3651f,-242.188f, +-214.844f,16.1703f,-242.188f, +-210.938f,15.3612f,-242.188f, +-207.031f,14.5062f,-242.188f, +-203.125f,14.0333f,-242.188f, +-199.219f,13.0731f,-242.188f, +-195.313f,13.0716f,-242.188f, +-191.406f,12.2773f,-242.188f, +-187.5f,12.1599f,-242.188f, +-183.594f,12.0841f,-242.188f, +-179.688f,11.1979f,-242.188f, +-175.781f,11.7767f,-242.188f, +-171.875f,13.5192f,-242.188f, +-167.969f,13.6117f,-242.188f, +-164.063f,14.5377f,-242.188f, +-160.156f,16.1128f,-242.188f, +-156.25f,17.0591f,-242.188f, +-152.344f,18.0547f,-242.188f, +-148.438f,19.9927f,-242.188f, +-144.531f,20.5592f,-242.188f, +-140.625f,20.5602f,-242.188f, +-136.719f,20.6585f,-242.188f, +-132.813f,22.6924f,-242.188f, +-128.906f,23.4786f,-242.188f, +-125.0f,23.9921f,-242.188f, +-121.094f,24.3221f,-242.188f, +-117.188f,24.7845f,-242.188f, +-113.281f,24.0995f,-242.188f, +-109.375f,25.5836f,-242.188f, +-105.469f,25.1932f,-242.188f, +-101.563f,25.0022f,-242.188f, +-97.6563f,24.569f,-242.188f, +-93.75f,24.5749f,-242.188f, +-89.8438f,22.6678f,-242.188f, +-85.9375f,20.6652f,-242.188f, +-82.0313f,21.1719f,-242.188f, +-78.125f,21.9102f,-242.188f, +-74.2188f,20.9512f,-242.188f, +-70.3125f,19.1099f,-242.188f, +-66.4063f,18.2366f,-242.188f, +-62.5f,16.9751f,-242.188f, +-58.5938f,16.938f,-242.188f, +-54.6875f,16.3692f,-242.188f, +-50.7813f,14.5702f,-242.188f, +-46.875f,13.5527f,-242.188f, +-42.9688f,13.0169f,-242.188f, +-39.0625f,11.9599f,-242.188f, +-35.1563f,11.4675f,-242.188f, +-31.25f,10.1264f,-242.188f, +-27.3438f,9.05124f,-242.188f, +-23.4375f,8.17722f,-242.188f, +-19.5313f,8.42066f,-242.188f, +-15.625f,8.13199f,-242.188f, +-11.7188f,7.70744f,-242.188f, +-7.8125f,7.06448f,-242.188f, +-3.90625f,6.2428f,-242.188f, +0.0f,6.35893f,-242.188f, +3.90625f,6.40337f,-242.188f, +-250.0f,16.6546f,-246.094f, +-246.094f,17.6689f,-246.094f, +-242.188f,18.7575f,-246.094f, +-238.281f,20.3967f,-246.094f, +-234.375f,20.3065f,-246.094f, +-230.469f,20.2082f,-246.094f, +-226.563f,19.5383f,-246.094f, +-222.656f,17.7409f,-246.094f, +-218.75f,16.6708f,-246.094f, +-214.844f,15.9584f,-246.094f, +-210.938f,14.8412f,-246.094f, +-207.031f,14.5591f,-246.094f, +-203.125f,13.9049f,-246.094f, +-199.219f,12.4723f,-246.094f, +-195.313f,11.7361f,-246.094f, +-191.406f,11.5463f,-246.094f, +-187.5f,10.9687f,-246.094f, +-183.594f,10.6795f,-246.094f, +-179.688f,10.6856f,-246.094f, +-175.781f,10.6342f,-246.094f, +-171.875f,12.061f,-246.094f, +-167.969f,12.3131f,-246.094f, +-164.063f,13.8453f,-246.094f, +-160.156f,15.3522f,-246.094f, +-156.25f,16.575f,-246.094f, +-152.344f,17.953f,-246.094f, +-148.438f,18.9271f,-246.094f, +-144.531f,19.6463f,-246.094f, +-140.625f,20.0348f,-246.094f, +-136.719f,20.8966f,-246.094f, +-132.813f,22.7081f,-246.094f, +-128.906f,24.2289f,-246.094f, +-125.0f,24.3296f,-246.094f, +-121.094f,25.513f,-246.094f, +-117.188f,26.0616f,-246.094f, +-113.281f,25.9026f,-246.094f, +-109.375f,25.3793f,-246.094f, +-105.469f,26.0086f,-246.094f, +-101.563f,25.9668f,-246.094f, +-97.6563f,25.4377f,-246.094f, +-93.75f,24.6398f,-246.094f, +-89.8438f,22.6277f,-246.094f, +-85.9375f,20.9377f,-246.094f, +-82.0313f,20.5815f,-246.094f, +-78.125f,20.2521f,-246.094f, +-74.2188f,19.1439f,-246.094f, +-70.3125f,17.8492f,-246.094f, +-66.4063f,16.6347f,-246.094f, +-62.5f,15.9154f,-246.094f, +-58.5938f,14.2098f,-246.094f, +-54.6875f,13.5957f,-246.094f, +-50.7813f,12.5676f,-246.094f, +-46.875f,11.2422f,-246.094f, +-42.9688f,10.426f,-246.094f, +-39.0625f,10.1665f,-246.094f, +-35.1563f,9.19605f,-246.094f, +-31.25f,7.36042f,-246.094f, +-27.3438f,5.74959f,-246.094f, +-23.4375f,5.41512f,-246.094f, +-19.5313f,6.03312f,-246.094f, +-15.625f,5.93285f,-246.094f, +-11.7188f,5.3331f,-246.094f, +-7.8125f,5.48059f,-246.094f, +-3.90625f,4.92566f,-246.094f, +0.0f,5.05645f,-246.094f, +3.90625f,6.09425f,-246.094f, +-250.0f,17.2418f,-250.0f, +-246.094f,17.9679f,-250.0f, +-242.188f,19.359f,-250.0f, +-238.281f,19.3277f,-250.0f, +-234.375f,20.1575f,-250.0f, +-230.469f,19.8999f,-250.0f, +-226.563f,18.9681f,-250.0f, +-222.656f,17.7696f,-250.0f, +-218.75f,15.6199f,-250.0f, +-214.844f,14.6555f,-250.0f, +-210.938f,13.0514f,-250.0f, +-207.031f,13.6029f,-250.0f, +-203.125f,13.1455f,-250.0f, +-199.219f,12.0056f,-250.0f, +-195.313f,11.1773f,-250.0f, +-191.406f,10.7263f,-250.0f, +-187.5f,10.2543f,-250.0f, +-183.594f,9.76389f,-250.0f, +-179.688f,9.00623f,-250.0f, +-175.781f,9.47424f,-250.0f, +-171.875f,10.8011f,-250.0f, +-167.969f,12.4395f,-250.0f, +-164.063f,13.7736f,-250.0f, +-160.156f,14.0938f,-250.0f, +-156.25f,15.8447f,-250.0f, +-152.344f,17.1975f,-250.0f, +-148.438f,17.963f,-250.0f, +-144.531f,19.3662f,-250.0f, +-140.625f,20.309f,-250.0f, +-136.719f,21.9063f,-250.0f, +-132.813f,22.8363f,-250.0f, +-128.906f,24.0073f,-250.0f, +-125.0f,25.2989f,-250.0f, +-121.094f,26.2944f,-250.0f, +-117.188f,27.4482f,-250.0f, +-113.281f,27.4823f,-250.0f, +-109.375f,27.2835f,-250.0f, +-105.469f,27.4754f,-250.0f, +-101.563f,27.7731f,-250.0f, +-97.6563f,26.6981f,-250.0f, +-93.75f,24.4699f,-250.0f, +-89.8438f,22.81f,-250.0f, +-85.9375f,21.6739f,-250.0f, +-82.0313f,19.8713f,-250.0f, +-78.125f,18.5848f,-250.0f, +-74.2188f,17.7134f,-250.0f, +-70.3125f,15.5276f,-250.0f, +-66.4063f,14.6805f,-250.0f, +-62.5f,14.0332f,-250.0f, +-58.5938f,12.1429f,-250.0f, +-54.6875f,10.3027f,-250.0f, +-50.7813f,9.68001f,-250.0f, +-46.875f,8.12561f,-250.0f, +-42.9688f,8.26581f,-250.0f, +-39.0625f,7.98056f,-250.0f, +-35.1563f,7.43215f,-250.0f, +-31.25f,6.33038f,-250.0f, +-27.3438f,4.62549f,-250.0f, +-23.4375f,3.83616f,-250.0f, +-19.5313f,4.24597f,-250.0f, +-15.625f,3.79997f,-250.0f, +-11.7188f,3.74461f,-250.0f, +-7.8125f,3.79853f,-250.0f, +-3.90625f,3.95418f,-250.0f, +0.0f,5.70623f,-250.0f, +3.90625f,6.31953f,-250.0f, +}; + +btScalar Landscape08Nml[] = { +-0.193879f,0.980285f,-0.0381128f, +-0.101407f,0.994799f,-0.00961843f, +-0.17812f,0.983422f,0.0339701f, +-0.107869f,0.990758f,0.0822321f, +-0.150224f,0.986838f,0.0598614f, +-0.176421f,0.983338f,0.0438458f, +0.00771709f,0.999873f,0.0139132f, +-0.0458501f,0.998747f,-0.0200731f, +0.170866f,0.984802f,-0.0311488f, +0.198428f,0.979783f,-0.0255296f, +0.223966f,0.969797f,0.0966125f, +0.319719f,0.946459f,0.0446654f, +0.155788f,0.942148f,0.296794f, +0.226142f,0.945324f,0.234996f, +0.0234229f,0.954977f,0.295752f, +-0.0213542f,0.981077f,0.192434f, +-0.0320299f,0.976907f,0.211248f, +-0.0305686f,0.97015f,0.240572f, +-0.00290395f,0.990031f,0.14082f, +-0.0740282f,0.98339f,0.165723f, +0.0359831f,0.998663f,0.0371117f, +-0.048977f,0.998654f,0.0171003f, +0.119085f,0.992879f,0.00312204f, +0.163687f,0.985928f,0.0339365f, +0.233927f,0.967265f,0.0983717f, +0.258555f,0.954734f,0.147076f, +0.185228f,0.98177f,0.0426319f, +0.171781f,0.975163f,0.139813f, +0.312497f,0.949826f,0.0132586f, +0.315278f,0.937034f,0.150223f, +0.455936f,0.889912f,-0.0133666f, +0.444363f,0.88993f,0.102789f, +0.477095f,0.878821f,-0.00729384f, +0.442265f,0.892911f,0.0843273f, +0.441901f,0.89445f,-0.0684218f, +0.356563f,0.929766f,-0.091634f, +0.46452f,0.88048f,-0.0947459f, +0.399286f,0.883106f,-0.246362f, +0.430625f,0.899506f,-0.073831f, +0.418125f,0.862027f,-0.286498f, +0.390492f,0.919986f,-0.0337736f, +0.451928f,0.884249f,-0.117748f, +0.389473f,0.920638f,-0.0271218f, +0.401911f,0.911214f,-0.0903147f, +0.411594f,0.910246f,-0.0451926f, +0.385985f,0.916603f,-0.104187f, +0.406515f,0.904587f,-0.128329f, +0.375686f,0.920382f,-0.108425f, +0.421893f,0.886378f,-0.190632f, +0.362475f,0.891842f,-0.270609f, +0.382406f,0.917607f,-0.108459f, +0.380095f,0.864773f,-0.32817f, +0.206545f,0.977978f,-0.0299668f, +0.319336f,0.938074f,-0.134321f, +-0.0276167f,0.998803f,0.0403598f, +0.0724517f,0.997355f,-0.00577643f, +-0.170399f,0.974366f,0.146884f, +-0.0444923f,0.976538f,0.210699f, +-0.123713f,0.961736f,0.244457f, +-0.0585476f,0.950932f,0.303809f, +-0.0436638f,0.948824f,0.312774f, +-0.0108452f,0.950133f,0.311655f, +-0.0562151f,0.924389f,0.377285f, +-0.024656f,0.918307f,0.3951f, +-0.11936f,0.930674f,0.345831f, +-0.21058f,0.936144f,0.281584f, +-0.166672f,0.952976f,0.253095f, +-0.262868f,0.958623f,0.109278f, +-0.138859f,0.97532f,0.171667f, +-0.166823f,0.980233f,0.106364f, +-0.016911f,0.994026f,0.107828f, +0.014088f,0.986713f,0.161858f, +-0.0269312f,0.989998f,0.138489f, +-0.0681193f,0.995186f,0.0704648f, +-0.241507f,0.962694f,0.122045f, +-0.306148f,0.951983f,0.00131283f, +-0.400562f,0.916076f,-0.0188573f, +-0.46755f,0.872686f,-0.140772f, +-0.451983f,0.886731f,-0.0970551f, +-0.445163f,0.885181f,-0.135217f, +-0.440559f,0.893764f,-0.0842181f, +-0.44058f,0.883958f,-0.156548f, +-0.530573f,0.842324f,-0.094771f, +-0.559377f,0.815929f,-0.14614f, +-0.675146f,0.724837f,-0.137074f, +-0.671227f,0.729467f,-0.131655f, +-0.627673f,0.767191f,-0.132076f, +-0.630683f,0.736819f,-0.243592f, +-0.548071f,0.819689f,-0.166518f, +-0.526895f,0.799727f,-0.287781f, +-0.521779f,0.83885f,-0.155167f, +-0.501504f,0.822365f,-0.268719f, +-0.465479f,0.867433f,-0.175756f, +-0.453816f,0.862676f,-0.223251f, +-0.458424f,0.854844f,-0.243083f, +-0.470698f,0.860374f,-0.195446f, +-0.485669f,0.830839f,-0.27172f, +-0.494445f,0.85319f,-0.166102f, +-0.418394f,0.865747f,-0.274642f, +-0.405345f,0.892443f,-0.198093f, +-0.287108f,0.926134f,-0.244631f, +-0.325256f,0.923685f,-0.202519f, +-0.192384f,0.91848f,-0.345518f, +-0.208186f,0.935081f,-0.28685f, +0.0681073f,0.948251f,-0.310131f, +0.077158f,0.955715f,-0.283998f, +0.102278f,0.947499f,-0.302962f, +0.02043f,0.921087f,-0.388821f, +0.0627177f,0.929646f,-0.363077f, +0.0629047f,0.918578f,-0.390202f, +-0.00415691f,0.947597f,-0.31944f, +-0.00512929f,0.899538f,-0.436812f, +-0.271944f,0.935195f,-0.226842f, +-0.177509f,0.92231f,-0.343271f, +-0.413186f,0.904845f,-0.102632f, +-0.338265f,0.931446f,-0.13411f, +-0.418276f,0.90315f,-0.0967731f, +-0.404177f,0.914278f,-0.0271442f, +-0.400569f,0.902696f,-0.157112f, +-0.429625f,0.894308f,-0.125039f, +-0.29004f,0.948484f,-0.127491f, +-0.188203f,0.980777f,0.0515283f, +-0.0585039f,0.997556f,-0.0381961f, +-0.133431f,0.99094f,0.0152943f, +-0.143343f,0.971126f,-0.1907f, +-0.24516f,0.938627f,-0.242644f, +-0.188833f,0.958258f,-0.214673f, +-0.174705f,0.963776f,-0.201528f, +-0.196517f,0.95296f,-0.230756f, +-0.128653f,0.987396f,-0.0921772f, +-0.120365f,0.975049f,-0.186527f, +0.0117596f,0.998991f,0.0433545f, +-0.146882f,0.98666f,-0.0701983f, +-0.218442f,0.971087f,-0.0962923f, +-0.179096f,0.983284f,-0.0328244f, +0.0658277f,0.997324f,0.0318063f, +0.120963f,0.992647f,0.00454206f, +0.0263542f,0.988052f,0.151849f, +0.0179305f,0.957276f,0.288619f, +0.0987151f,0.955923f,0.276526f, +0.113577f,0.970939f,0.210662f, +0.111989f,0.989066f,0.0959572f, +0.0937332f,0.995324f,-0.0233266f, +0.0889156f,0.995493f,-0.0329669f, +0.214527f,0.976717f,-0.0013568f, +0.281036f,0.957864f,-0.0592866f, +0.349427f,0.927689f,-0.131507f, +0.460507f,0.876585f,-0.139754f, +0.465208f,0.877856f,-0.1138f, +0.432422f,0.897621f,-0.0853653f, +0.392928f,0.918987f,-0.032723f, +0.389134f,0.920603f,0.0326418f, +0.40247f,0.914003f,0.0511488f, +0.41651f,0.90858f,0.031652f, +0.468908f,0.883168f,-0.0118055f, +0.497957f,0.862594f,-0.0892785f, +0.342146f,0.929254f,-0.139366f, +0.262957f,0.964807f,-0.00115352f, +0.156573f,0.98302f,0.095691f, +-0.0479214f,0.988417f,0.143995f, +-0.198695f,0.970386f,0.13737f, +-0.222539f,0.963461f,0.14906f, +-0.145574f,0.943362f,0.298121f, +-0.065459f,0.922659f,0.380021f, +-0.0644219f,0.950539f,0.303852f, +-0.126762f,0.967843f,0.217283f, +-0.017815f,0.980142f,0.197496f, +0.0660407f,0.994277f,0.0839804f, +-0.101583f,0.994471f,0.0266049f, +-0.224345f,0.969139f,0.102176f, +-0.280297f,0.958092f,0.0591033f, +-0.402555f,0.91416f,-0.047541f, +-0.458467f,0.883974f,-0.0916445f, +-0.50134f,0.862765f,-0.0655406f, +-0.644808f,0.754744f,-0.12077f, +-0.636358f,0.756299f,-0.151855f, +-0.556238f,0.818404f,-0.144268f, +-0.504016f,0.849904f,-0.153725f, +-0.404172f,0.887071f,-0.223046f, +-0.360363f,0.894242f,-0.265463f, +-0.432057f,0.840836f,-0.326069f, +-0.4393f,0.818603f,-0.370006f, +-0.249988f,0.890718f,-0.379642f, +-0.114697f,0.874572f,-0.471135f, +-0.0301956f,0.870113f,-0.491927f, +0.0871874f,0.907337f,-0.411263f, +0.0509325f,0.923392f,-0.380464f, +-0.106299f,0.953821f,-0.280938f, +-0.389809f,0.901657f,-0.187255f, +-0.420279f,0.904001f,-0.0784108f, +-0.360569f,0.922439f,-0.138186f, +-0.332116f,0.91853f,-0.214478f, +-0.305854f,0.899541f,-0.311896f, +-0.11957f,0.95083f,-0.285701f, +-0.0843961f,0.977455f,-0.193542f, +-0.186555f,0.968589f,-0.164414f, +-0.1142f,0.975963f,-0.185618f, +-0.138309f,0.943055f,-0.30252f, +-0.101226f,0.981339f,-0.163482f, +-0.184633f,0.97099f,-0.151951f, +-0.239394f,0.95355f,-0.182845f, +-0.0575173f,0.989733f,-0.130847f, +0.0688205f,0.993792f,0.0874178f, +-0.0714424f,0.990397f,0.118361f, +-0.0225247f,0.994972f,0.0975878f, +0.167362f,0.976776f,0.133786f, +0.156506f,0.98511f,0.0711603f, +0.198564f,0.979194f,0.0418473f, +0.173408f,0.984455f,-0.0278778f, +0.108869f,0.989375f,-0.0963545f, +0.224679f,0.96015f,-0.166226f, +0.339104f,0.91731f,-0.208688f, +0.367935f,0.88797f,-0.275922f, +0.418707f,0.869398f,-0.262357f, +0.420889f,0.892687f,-0.161129f, +0.397172f,0.910077f,-0.118378f, +0.374326f,0.920598f,-0.11126f, +0.397932f,0.911721f,-0.102056f, +0.386888f,0.911258f,-0.141166f, +0.41482f,0.902273f,-0.117593f, +0.501715f,0.859192f,-0.100356f, +0.491949f,0.863362f,-0.112214f, +0.357466f,0.931719f,-0.0641779f, +0.171333f,0.982821f,-0.068616f, +0.100623f,0.994346f,0.0339287f, +-0.0698557f,0.996834f,0.0379692f, +-0.194026f,0.980994f,0.00220452f, +-0.288205f,0.957419f,0.0169548f, +-0.304635f,0.947239f,0.0996808f, +-0.10216f,0.973655f,0.20386f, +0.100532f,0.974742f,0.199427f, +-0.0238908f,0.99964f,0.0121747f, +-0.00850096f,0.997624f,-0.0683673f, +0.116859f,0.992157f,-0.044359f, +-0.0433286f,0.998946f,-0.0151181f, +-0.258294f,0.961617f,-0.0926162f, +-0.256378f,0.96262f,-0.0873673f, +-0.327211f,0.940376f,-0.0928767f, +-0.431734f,0.888327f,-0.15646f, +-0.514253f,0.844258f,-0.150905f, +-0.599748f,0.789083f,-0.132858f, +-0.620824f,0.749219f,-0.230756f, +-0.533018f,0.803035f,-0.266508f, +-0.441513f,0.840682f,-0.313561f, +-0.38701f,0.854241f,-0.347124f, +-0.380219f,0.879441f,-0.286385f, +-0.39628f,0.874175f,-0.280679f, +-0.390488f,0.846052f,-0.362926f, +-0.205032f,0.876667f,-0.435221f, +-0.00372872f,0.883142f,-0.46909f, +-0.0083869f,0.837348f,-0.546606f, +-0.00127167f,0.831923f,-0.55489f, +-0.11424f,0.875282f,-0.469926f, +-0.256213f,0.933918f,-0.249305f, +-0.393049f,0.915109f,-0.0899313f, +-0.484342f,0.863396f,-0.141282f, +-0.32612f,0.940905f,-0.0913441f, +-0.240051f,0.956808f,-0.163992f, +-0.189326f,0.934609f,-0.301099f, +-0.228613f,0.900757f,-0.369288f, +-0.206601f,0.953154f,-0.220936f, +-0.220523f,0.958575f,-0.180285f, +-0.0691943f,0.98249f,-0.172992f, +0.0652464f,0.984331f,-0.163816f, +-0.308082f,0.909128f,-0.280306f, +-0.234588f,0.948864f,-0.211249f, +-0.164432f,0.95809f,-0.234578f, +-0.206026f,0.945244f,-0.253116f, +-0.143287f,0.989535f,-0.0170174f, +0.0124441f,0.996035f,0.0880878f, +0.00356068f,0.999352f,-0.0358152f, +0.110457f,0.993318f,-0.0334531f, +0.202646f,0.978802f,0.0296789f, +0.245502f,0.969355f,0.00893075f, +0.235742f,0.966989f,-0.096741f, +0.211469f,0.957228f,-0.197474f, +0.297424f,0.906479f,-0.299724f, +0.384843f,0.8614f,-0.331489f, +0.405425f,0.833969f,-0.374335f, +0.330388f,0.8594f,-0.390224f, +0.318232f,0.891429f,-0.32262f, +0.388106f,0.870631f,-0.302284f, +0.354731f,0.863719f,-0.357989f, +0.344798f,0.878386f,-0.330988f, +0.405293f,0.884611f,-0.230654f, +0.388923f,0.889959f,-0.23814f, +0.464087f,0.861962f,-0.20407f, +0.454884f,0.878774f,-0.144348f, +0.334448f,0.940492f,-0.0601651f, +0.155367f,0.984248f,-0.0843604f, +0.0216917f,0.991768f,-0.126198f, +-0.0136477f,0.995915f,-0.089255f, +-0.167328f,0.979282f,-0.114052f, +-0.307453f,0.946588f,-0.0971837f, +-0.335506f,0.9366f,-0.101072f, +-0.175739f,0.978185f,-0.110768f, +0.119064f,0.992411f,-0.0307238f, +0.11077f,0.993829f,0.00590121f, +0.0501349f,0.998052f,-0.0371321f, +0.0267572f,0.997581f,-0.0641572f, +-0.0614311f,0.997945f,0.0181992f, +-0.171984f,0.984492f,-0.0345973f, +-0.25243f,0.961435f,-0.109187f, +-0.338599f,0.935923f,-0.0969507f, +-0.406007f,0.913202f,-0.0349361f, +-0.506218f,0.860674f,-0.0546185f, +-0.568342f,0.8123f,-0.130983f, +-0.570141f,0.791669f,-0.219544f, +-0.495272f,0.816181f,-0.297581f, +-0.441753f,0.829099f,-0.342707f, +-0.433015f,0.854206f,-0.287802f, +-0.452692f,0.8617f,-0.229223f, +-0.349843f,0.914647f,-0.202562f, +-0.26556f,0.912134f,-0.312233f, +-0.238012f,0.870367f,-0.431058f, +0.0104117f,0.943359f,-0.331612f, +0.0744935f,0.949145f,-0.305899f, +-0.0305186f,0.956187f,-0.291161f, +-0.253914f,0.939488f,-0.229978f, +-0.449831f,0.878563f,-0.160557f, +-0.46937f,0.880955f,-0.0600792f, +-0.456075f,0.88917f,-0.0370459f, +-0.35963f,0.932902f,-0.0189682f, +-0.136797f,0.989932f,0.0363352f, +-0.0613131f,0.996495f,-0.0569106f, +-0.21207f,0.964351f,-0.158282f, +-0.303853f,0.931291f,-0.200924f, +-0.14101f,0.957182f,-0.252823f, +-0.0888984f,0.919027f,-0.384041f, +0.0067746f,0.936029f,-0.351857f, +-0.277531f,0.936633f,-0.213766f, +-0.206375f,0.947006f,-0.246148f, +-0.159145f,0.94264f,-0.293433f, +-0.254895f,0.932893f,-0.254437f, +-0.289527f,0.928279f,-0.233391f, +-0.0765713f,0.988951f,-0.126934f, +0.118605f,0.992812f,0.0160497f, +0.122094f,0.985714f,-0.116021f, +0.123131f,0.980876f,-0.150734f, +0.257926f,0.962137f,-0.0881221f, +0.397575f,0.90803f,-0.131971f, +0.301628f,0.898949f,-0.317666f, +0.360055f,0.863992f,-0.351962f, +0.391486f,0.830925f,-0.39535f, +0.399022f,0.829333f,-0.391136f, +0.323505f,0.871183f,-0.369302f, +0.290418f,0.885393f,-0.362955f, +0.422788f,0.860776f,-0.283398f, +0.400499f,0.876008f,-0.26872f, +0.272367f,0.912425f,-0.305444f, +0.289824f,0.919053f,-0.267101f, +0.375469f,0.907173f,-0.189898f, +0.450189f,0.881784f,-0.140667f, +0.386895f,0.914552f,-0.117932f, +0.236065f,0.970562f,-0.0477698f, +0.25497f,0.966484f,0.0299776f, +0.147152f,0.978905f,-0.141747f, +-0.0638684f,0.954892f,-0.290005f, +-0.198781f,0.952653f,-0.230082f, +-0.310279f,0.934977f,-0.171888f, +-0.315284f,0.933842f,-0.168923f, +-0.14676f,0.971582f,-0.185715f, +-0.0201641f,0.976785f,-0.213271f, +0.0408109f,0.997823f,-0.0518006f, +-0.000100141f,1.0f,-0.000656924f, +0.0713875f,0.992775f,0.096444f, +-0.0699693f,0.997522f,-0.0073179f, +-0.120441f,0.992484f,-0.0216487f, +-0.200799f,0.979135f,-0.0312183f, +-0.379156f,0.923729f,-0.0544518f, +-0.468756f,0.883079f,0.0209709f, +-0.451556f,0.890079f,0.0621062f, +-0.476504f,0.87674f,-0.0653536f, +-0.492274f,0.840855f,-0.22501f, +-0.481358f,0.828756f,-0.285409f, +-0.474733f,0.852404f,-0.219173f, +-0.502016f,0.852123f,-0.147874f, +-0.474734f,0.870513f,-0.12975f, +-0.344408f,0.92173f,-0.178317f, +-0.150823f,0.963991f,-0.21903f, +-0.180013f,0.935609f,-0.303696f, +-0.154788f,0.929555f,-0.334617f, +0.0226749f,0.973389f,-0.228036f, +-0.128469f,0.975007f,-0.181264f, +-0.302747f,0.952293f,-0.0385077f, +-0.427741f,0.902872f,-0.0431169f, +-0.47673f,0.871329f,-0.116249f, +-0.489254f,0.866227f,-0.101399f, +-0.407231f,0.911582f,-0.0564075f, +-0.202058f,0.978968f,-0.0281862f, +-0.00674228f,0.999486f,0.0313481f, +-0.103136f,0.994637f,-0.00773474f, +-0.196734f,0.967877f,-0.156554f, +0.0323675f,0.951182f,-0.306928f, +0.00132526f,0.886111f,-0.463472f, +-0.0819618f,0.88666f,-0.4551f, +-0.207835f,0.973361f,-0.0968142f, +-0.157163f,0.972283f,-0.173105f, +-0.187284f,0.955049f,-0.229797f, +-0.285445f,0.950862f,-0.119931f, +-0.25293f,0.964263f,-0.078892f, +-0.219599f,0.957265f,-0.188204f, +-0.0108412f,0.995374f,-0.0954668f, +0.265678f,0.963807f,-0.0221529f, +0.203794f,0.959343f,-0.195266f, +0.214345f,0.928921f,-0.301932f, +0.439386f,0.868442f,-0.22967f, +0.401404f,0.868685f,-0.290278f, +0.386804f,0.861005f,-0.330232f, +0.428054f,0.836263f,-0.342686f, +0.371108f,0.864198f,-0.339765f, +0.321515f,0.897421f,-0.302098f, +0.213518f,0.927633f,-0.306443f, +0.325579f,0.933219f,-0.151988f, +0.403183f,0.912352f,-0.0711129f, +0.337076f,0.932606f,-0.128942f, +0.295377f,0.932293f,-0.208765f, +0.330751f,0.922115f,-0.200767f, +0.392168f,0.906602f,-0.155808f, +0.373592f,0.925323f,-0.0648487f, +0.191498f,0.98018f,-0.0507507f, +0.210624f,0.977447f,-0.015309f, +0.322948f,0.945895f,0.0314047f, +0.111956f,0.981203f,-0.157186f, +-0.247376f,0.91284f,-0.32485f, +-0.344293f,0.903462f,-0.255381f, +-0.317143f,0.916625f,-0.243348f, +-0.146502f,0.958945f,-0.242819f, +-0.0529375f,0.980235f,-0.19062f, +-0.0439655f,0.993569f,-0.104344f, +-0.0681441f,0.993007f,-0.0964036f, +0.0333119f,0.999062f,-0.0276811f, +0.0418264f,0.997289f,-0.0605344f, +-0.133447f,0.982771f,-0.127878f, +-0.204776f,0.9734f,-0.102754f, +-0.405337f,0.909688f,-0.0903804f, +-0.513852f,0.857872f,0.00340788f, +-0.448907f,0.892038f,0.0524446f, +-0.345596f,0.938383f,0.000245611f, +-0.371875f,0.917654f,-0.14007f, +-0.507047f,0.834221f,-0.216744f, +-0.563482f,0.814021f,-0.140919f, +-0.549501f,0.831415f,-0.0824446f, +-0.452205f,0.89061f,-0.0482179f, +-0.283377f,0.952701f,-0.109812f, +-0.141817f,0.97445f,-0.174169f, +-0.1066f,0.981505f,-0.159008f, +-0.128743f,0.958435f,-0.254611f, +0.00656601f,0.946015f,-0.324056f, +-0.2018f,0.913066f,-0.354384f, +-0.37997f,0.904414f,-0.19406f, +-0.423353f,0.890783f,-0.165163f, +-0.446411f,0.883929f,-0.139235f, +-0.512365f,0.844229f,-0.157352f, +-0.38243f,0.91272f,-0.143839f, +-0.20154f,0.953013f,-0.226157f, +-0.104673f,0.977037f,-0.185586f, +-0.0458745f,0.998873f,-0.0121567f, +-0.0345945f,0.993617f,-0.107371f, +0.172752f,0.948616f,-0.265111f, +0.0733608f,0.946968f,-0.312842f, +-0.16546f,0.93251f,-0.321012f, +-0.129843f,0.991294f,-0.0218587f, +-0.0514732f,0.996939f,-0.0588533f, +-0.139666f,0.979954f,-0.142066f, +-0.409538f,0.893138f,-0.185964f, +-0.25948f,0.963277f,-0.0690542f, +-0.106228f,0.993322f,-0.0450175f, +-0.047863f,0.993002f,-0.107966f, +0.238746f,0.962198f,-0.131057f, +0.395076f,0.900486f,-0.181771f, +0.285693f,0.874669f,-0.391577f, +0.358513f,0.848133f,-0.39005f, +0.400938f,0.884343f,-0.239137f, +0.415724f,0.899223f,-0.136277f, +0.438653f,0.894164f,-0.0897495f, +0.361082f,0.930821f,-0.0565009f, +0.321158f,0.946416f,-0.0339725f, +0.242073f,0.961641f,-0.129024f, +0.199607f,0.93926f,-0.279192f, +0.404284f,0.887623f,-0.220636f, +0.424881f,0.860893f,-0.279892f, +0.291182f,0.870529f,-0.396727f, +0.302468f,0.897545f,-0.320822f, +0.33835f,0.898885f,-0.278433f, +0.289098f,0.929341f,-0.229667f, +0.170367f,0.971163f,-0.166783f, +0.129237f,0.986609f,-0.0995005f, +0.305057f,0.951694f,0.0349234f, +0.306439f,0.951736f,-0.0171507f, +-0.0808802f,0.976235f,-0.201056f, +-0.37625f,0.871862f,-0.313516f, +-0.307717f,0.906797f,-0.28815f, +-0.221648f,0.946026f,-0.236446f, +-0.153972f,0.983161f,-0.0984244f, +-0.108206f,0.992418f,-0.0582996f, +-0.0581427f,0.997361f,-0.0434687f, +0.00296039f,0.999365f,-0.0355116f, +0.0891034f,0.995894f,-0.0160169f, +-0.110645f,0.991801f,-0.0639364f, +-0.218461f,0.975223f,-0.0348525f, +-0.395365f,0.918398f,-0.0152307f, +-0.576836f,0.816159f,-0.0338453f, +-0.444941f,0.895556f,-0.00249309f, +-0.286239f,0.957764f,-0.0274641f, +-0.294715f,0.953259f,-0.0666355f, +-0.477956f,0.87064f,-0.116377f, +-0.574643f,0.800737f,-0.169131f, +-0.54804f,0.808388f,-0.214852f, +-0.442187f,0.863382f,-0.242986f, +-0.246722f,0.934143f,-0.257887f, +-0.157124f,0.964153f,-0.213827f, +-0.112706f,0.987993f,-0.10568f, +-0.0332674f,0.993709f,-0.106936f, +0.112688f,0.981964f,-0.151814f, +-0.167f,0.962022f,-0.215928f, +-0.466198f,0.854366f,-0.229606f, +-0.414399f,0.885329f,-0.210869f, +-0.461383f,0.855213f,-0.236084f, +-0.488245f,0.847976f,-0.206287f, +-0.351309f,0.900136f,-0.257559f, +-0.14601f,0.942734f,-0.29989f, +-0.222931f,0.937875f,-0.265879f, +-0.195469f,0.970505f,-0.141106f, +0.07525f,0.994532f,-0.0724173f, +0.279727f,0.951429f,-0.128592f, +0.077712f,0.980159f,-0.182341f, +-0.20264f,0.956685f,-0.209022f, +-0.0986596f,0.987061f,-0.126403f, +-0.0477559f,0.985147f,-0.164941f, +-0.0669351f,0.983547f,-0.167793f, +-0.331517f,0.915331f,-0.228616f, +-0.350669f,0.900109f,-0.258526f, +-0.179805f,0.971282f,-0.155824f, +0.0156578f,0.989915f,-0.140797f, +0.301547f,0.9226f,-0.240579f, +0.457383f,0.852861f,-0.25185f, +0.449776f,0.84917f,-0.276789f, +0.26609f,0.885033f,-0.381984f, +0.182331f,0.952085f,-0.245538f, +0.260541f,0.964562f,-0.0416928f, +0.408684f,0.907067f,0.101033f, +0.342263f,0.936545f,0.0757594f, +0.318298f,0.944991f,0.0753604f, +0.467785f,0.882822f,0.0424513f, +0.409568f,0.864687f,-0.290809f, +0.379738f,0.82358f,-0.421325f, +0.451329f,0.792384f,-0.410402f, +0.275091f,0.868881f,-0.411547f, +0.161796f,0.92881f,-0.333367f, +0.286521f,0.932696f,-0.219053f, +0.272475f,0.944744f,-0.182252f, +0.119383f,0.965719f,-0.230508f, +-0.0212448f,0.971989f,-0.234063f, +0.226311f,0.969491f,-0.094178f, +0.326176f,0.942844f,-0.068215f, +0.104404f,0.994209f,-0.0254499f, +-0.295807f,0.921372f,-0.252133f, +-0.383855f,0.886842f,-0.257228f, +-0.359597f,0.921141f,-0.148961f, +-0.240318f,0.969399f,-0.0501282f, +-0.0922578f,0.994071f,-0.0575481f, +-0.0797027f,0.995693f,-0.047355f, +-0.026569f,0.999636f,0.00472767f, +0.105393f,0.994402f,0.00758912f, +-0.0968377f,0.99427f,-0.0452707f, +-0.304918f,0.952227f,0.0169656f, +-0.404524f,0.901318f,0.154875f, +-0.513873f,0.850873f,0.109318f, +-0.450348f,0.892744f,-0.0139455f, +-0.274075f,0.961559f,-0.0169546f, +-0.246789f,0.966677f,-0.068048f, +-0.421796f,0.89143f,-0.165651f, +-0.530762f,0.820949f,-0.210556f, +-0.518596f,0.828643f,-0.210734f, +-0.419929f,0.882924f,-0.210013f, +-0.267086f,0.925885f,-0.26721f, +-0.260528f,0.916111f,-0.304739f, +-0.212437f,0.941505f,-0.261606f, +-0.048105f,0.973033f,-0.225594f, +0.0765563f,0.979806f,-0.184712f, +-0.093108f,0.98921f,-0.113109f, +-0.45825f,0.862094f,-0.216335f, +-0.388948f,0.902314f,-0.185873f, +-0.448149f,0.871913f,-0.197307f, +-0.488741f,0.854988f,-0.173574f, +-0.313337f,0.916762f,-0.247724f, +-0.157546f,0.938004f,-0.308753f, +-0.267357f,0.911027f,-0.313926f, +-0.236818f,0.920159f,-0.311809f, +0.000164176f,0.954985f,-0.296656f, +0.271822f,0.944232f,-0.185848f, +0.151331f,0.970946f,-0.185371f, +-0.118147f,0.962507f,-0.244174f, +0.026977f,0.993643f,-0.109301f, +0.00824696f,0.988318f,-0.152184f, +-0.049843f,0.98983f,-0.133236f, +-0.292853f,0.946012f,-0.138915f, +-0.402779f,0.899681f,-0.168355f, +-0.216565f,0.962959f,-0.160656f, +0.0811851f,0.971223f,-0.223909f, +0.376654f,0.888442f,-0.262304f, +0.412611f,0.862287f,-0.293621f, +0.420494f,0.885689f,-0.196825f, +0.303261f,0.948914f,-0.0871512f, +0.0927021f,0.987654f,-0.12628f, +0.131263f,0.975894f,-0.174359f, +0.34789f,0.928255f,-0.131586f, +0.388684f,0.916314f,-0.0964015f, +0.334363f,0.935247f,-0.116251f, +0.500896f,0.857152f,-0.119971f, +0.598542f,0.784881f,-0.160341f, +0.47847f,0.803478f,-0.354245f, +0.40143f,0.813052f,-0.421663f, +0.177917f,0.923323f,-0.340324f, +0.0444056f,0.967329f,-0.249605f, +0.182957f,0.975679f,-0.12074f, +0.298547f,0.954355f,0.00877178f, +0.20958f,0.975318f,-0.0695111f, +0.014388f,0.988042f,-0.153512f, +0.159715f,0.970499f,-0.180618f, +0.22067f,0.966546f,-0.130745f, +0.121564f,0.992499f,-0.0129668f, +-0.106928f,0.989668f,-0.0955226f, +-0.432009f,0.877086f,-0.209972f, +-0.412195f,0.894243f,-0.174429f, +-0.247992f,0.954923f,-0.163162f, +-0.103668f,0.985418f,-0.134925f, +-0.118626f,0.990103f,-0.0749928f, +-0.0679366f,0.995617f,-0.0642786f, +0.157737f,0.986207f,-0.0501565f, +-0.132086f,0.989105f,-0.064997f, +-0.385668f,0.914108f,0.125169f, +-0.489653f,0.859555f,0.146305f, +-0.451033f,0.881762f,0.138074f, +-0.379544f,0.923663f,0.0528468f, +-0.267976f,0.962936f,0.0307148f, +-0.154653f,0.986101f,0.0607174f, +-0.285519f,0.958009f,-0.0264139f, +-0.517333f,0.83498f,-0.187551f, +-0.544673f,0.81339f,-0.204273f, +-0.443255f,0.872475f,-0.205697f, +-0.212541f,0.959106f,-0.18693f, +-0.144834f,0.956217f,-0.254307f, +-0.219765f,0.912031f,-0.346271f, +-0.054698f,0.959311f,-0.277002f, +-0.0226538f,0.964658f,-0.262528f, +-0.09277f,0.980401f,-0.173803f, +-0.427129f,0.87184f,-0.2397f, +-0.458168f,0.877303f,-0.142906f, +-0.456008f,0.884075f,-0.102317f, +-0.457836f,0.873049f,-0.167843f, +-0.276231f,0.922652f,-0.269091f, +-0.0986428f,0.965162f,-0.242345f, +-0.166497f,0.944239f,-0.284061f, +-0.221568f,0.881867f,-0.416194f, +-0.047486f,0.902488f,-0.428089f, +0.159799f,0.906084f,-0.391761f, +0.154437f,0.936571f,-0.314616f, +-0.0388024f,0.943344f,-0.329539f, +0.0179311f,0.971802f,-0.235116f, +-0.0317957f,0.972144f,-0.232219f, +-0.108238f,0.982139f,-0.153906f, +-0.294778f,0.950488f,-0.098378f, +-0.31352f,0.940894f,-0.128155f, +-0.158161f,0.944104f,-0.289226f, +0.136392f,0.925587f,-0.353108f, +0.369725f,0.858345f,-0.355736f, +0.408427f,0.863142f,-0.296941f, +0.264495f,0.934318f,-0.238939f, +0.231394f,0.968992f,-0.0866717f, +0.180537f,0.980662f,-0.0755592f, +0.289728f,0.94884f,-0.125539f, +0.338081f,0.901985f,-0.268559f, +0.344111f,0.905129f,-0.249658f, +0.337921f,0.897299f,-0.284014f, +0.46242f,0.831252f,-0.308526f, +0.625979f,0.756355f,-0.18994f, +0.59942f,0.766009f,-0.232218f, +0.396651f,0.850096f,-0.346416f, +0.113051f,0.922761f,-0.368417f, +-0.0568672f,0.928859f,-0.366041f, +0.0370994f,0.962262f,-0.269583f, +0.21844f,0.959083f,-0.180121f, +0.248457f,0.958661f,-0.138705f, +0.0562715f,0.995806f,-0.072134f, +0.151796f,0.987439f,-0.0438309f, +0.213126f,0.976907f,0.0151789f, +0.0825188f,0.995896f,-0.0371849f, +-0.0293603f,0.995761f,-0.0871655f, +-0.339382f,0.929166f,-0.146528f, +-0.407976f,0.887929f,-0.212458f, +-0.300706f,0.928797f,-0.216592f, +-0.171876f,0.971688f,-0.162117f, +-0.133134f,0.975354f,-0.175954f, +-0.0436112f,0.969589f,-0.240823f, +0.0955252f,0.97277f,-0.211171f, +-0.222971f,0.974797f,-0.00733171f, +-0.502187f,0.842082f,0.19674f, +-0.406382f,0.878535f,0.251057f, +-0.403841f,0.907763f,0.113486f, +-0.295941f,0.954472f,0.0374491f, +-0.309098f,0.948653f,-0.0672074f, +-0.212726f,0.977025f,0.0130525f, +-0.199979f,0.978912f,0.0417118f, +-0.374584f,0.922961f,-0.0884893f, +-0.481248f,0.836641f,-0.261597f, +-0.419239f,0.839768f,-0.345005f, +-0.269419f,0.905569f,-0.327654f, +-0.084614f,0.973021f,-0.214643f, +-0.193736f,0.935164f,-0.296537f, +-0.190273f,0.932167f,-0.307995f, +-0.0917672f,0.986648f,-0.134552f, +-0.101923f,0.994749f,0.009248f, +-0.329353f,0.943234f,-0.0428565f, +-0.527408f,0.832391f,-0.170191f, +-0.427451f,0.895563f,-0.123505f, +-0.337252f,0.917187f,-0.212202f, +-0.254472f,0.911026f,-0.324462f, +-0.191138f,0.941948f,-0.276043f, +-0.0895186f,0.969134f,-0.229708f, +-0.115141f,0.935532f,-0.33395f, +-0.0316994f,0.925937f,-0.376346f, +0.117945f,0.920189f,-0.373285f, +0.121803f,0.934924f,-0.333287f, +-0.0046923f,0.925271f,-0.379279f, +0.0524128f,0.95708f,-0.285046f, +-0.0476851f,0.956392f,-0.288167f, +-0.185718f,0.956668f,-0.224263f, +-0.292875f,0.939689f,-0.176661f, +-0.212138f,0.937073f,-0.277295f, +0.00215598f,0.9095f,-0.415698f, +0.155074f,0.855231f,-0.494501f, +0.3372f,0.836708f,-0.431528f, +0.272726f,0.886233f,-0.374449f, +0.193484f,0.944931f,-0.263949f, +0.192169f,0.938969f,-0.285322f, +0.141281f,0.932743f,-0.331708f, +0.278032f,0.931044f,-0.236339f, +0.426985f,0.871432f,-0.241434f, +0.368362f,0.861689f,-0.349f, +0.400587f,0.825418f,-0.397762f, +0.451323f,0.785144f,-0.424095f, +0.523643f,0.765884f,-0.373121f, +0.603289f,0.753586f,-0.261056f, +0.44978f,0.832328f,-0.323928f, +0.156509f,0.915232f,-0.371289f, +-0.0704135f,0.915939f,-0.395092f, +-0.00319557f,0.926331f,-0.376696f, +0.166676f,0.911893f,-0.37506f, +0.102989f,0.962696f,-0.250219f, +-0.0387958f,0.995347f,-0.0881961f, +0.0653507f,0.992864f,-0.0997527f, +0.179449f,0.98367f,-0.0138117f, +0.177828f,0.983985f,0.012264f, +0.0645076f,0.995168f,-0.0740203f, +-0.292502f,0.938695f,-0.182468f, +-0.400433f,0.889464f,-0.220243f, +-0.318802f,0.923541f,-0.213161f, +-0.169897f,0.961934f,-0.214052f, +-0.0267051f,0.972116f,-0.232975f, +-0.00536052f,0.964395f,-0.264412f, +-0.100769f,0.988596f,-0.111905f, +-0.404303f,0.910751f,0.0840968f, +-0.594207f,0.803932f,0.0247338f, +-0.396136f,0.914658f,0.0804795f, +-0.304433f,0.952514f,0.00620435f, +-0.201276f,0.977901f,-0.0565476f, +-0.264949f,0.959844f,-0.0922019f, +-0.227773f,0.971084f,-0.0715179f, +-0.172114f,0.969698f,-0.173387f, +-0.26936f,0.945102f,-0.185006f, +-0.392685f,0.904465f,-0.166556f, +-0.407044f,0.896103f,-0.176958f, +-0.40747f,0.889993f,-0.204647f, +-0.189782f,0.978511f,-0.0806113f, +-0.0480587f,0.996223f,-0.0723184f, +-0.217275f,0.958525f,-0.184451f, +-0.306094f,0.944116f,-0.122276f, +-0.254593f,0.966558f,0.0308049f, +-0.20196f,0.972664f,0.114613f, +-0.409794f,0.899925f,-0.14901f, +-0.415034f,0.857771f,-0.303274f, +-0.263165f,0.89665f,-0.356039f, +-0.215387f,0.884962f,-0.412857f, +-0.225079f,0.887943f,-0.401119f, +-0.0773061f,0.916142f,-0.393328f, +-0.0308036f,0.905486f,-0.423257f, +-0.0371917f,0.883129f,-0.467653f, +0.0716369f,0.893813f,-0.442681f, +0.12997f,0.919319f,-0.371429f, +0.119867f,0.921216f,-0.370126f, +0.0228827f,0.984493f,-0.173923f, +-0.0834452f,0.988816f,-0.123614f, +-0.247718f,0.964917f,-0.0870125f, +-0.254118f,0.961997f,-0.0999321f, +-0.0671834f,0.977202f,-0.201403f, +0.157483f,0.940773f,-0.300243f, +0.164503f,0.92764f,-0.335294f, +0.27582f,0.929794f,-0.243733f, +0.209142f,0.946949f,-0.244024f, +0.183638f,0.949161f,-0.255677f, +0.277174f,0.906106f,-0.319605f, +0.178788f,0.896597f,-0.405153f, +0.185529f,0.860132f,-0.475134f, +0.438868f,0.800307f,-0.408538f, +0.441024f,0.788796f,-0.428135f, +0.397261f,0.791714f,-0.464083f, +0.440809f,0.77176f,-0.458338f, +0.455755f,0.768172f,-0.449666f, +0.535299f,0.762932f,-0.362477f, +0.450448f,0.842352f,-0.295872f, +0.136515f,0.937333f,-0.320579f, +-0.0637901f,0.937145f,-0.343061f, +-0.0112309f,0.935306f,-0.353662f, +0.108413f,0.948157f,-0.298738f, +-0.0660356f,0.972239f,-0.224477f, +-0.07256f,0.985988f,-0.150208f, +0.0814078f,0.980504f,-0.178842f, +0.133209f,0.989139f,-0.0621265f, +0.112681f,0.993117f,-0.0319677f, +0.144875f,0.987157f,0.0673239f, +-0.178705f,0.983714f,-0.0192655f, +-0.383305f,0.919432f,-0.0878717f, +-0.311703f,0.944518f,-0.103569f, +-0.170547f,0.974222f,-0.147663f, +-0.0584686f,0.987712f,-0.144938f, +-0.130239f,0.988008f,-0.0829397f, +-0.30957f,0.949755f,0.0461837f, +-0.426068f,0.896859f,0.118784f, +-0.505712f,0.862298f,-0.0263905f, +-0.384432f,0.913927f,-0.130189f, +-0.233817f,0.957708f,-0.167708f, +-0.196686f,0.961804f,-0.190386f, +-0.272431f,0.94059f,-0.202662f, +-0.180772f,0.950727f,-0.251872f, +-0.0565853f,0.956064f,-0.287647f, +-0.288561f,0.926858f,-0.240141f, +-0.491099f,0.856076f,-0.161104f, +-0.419638f,0.904096f,-0.0807095f, +-0.388583f,0.916169f,-0.0981701f, +-0.261262f,0.961028f,-0.0903754f, +-0.0632456f,0.997064f,0.0431658f, +-0.169715f,0.97859f,0.116442f, +-0.344027f,0.938297f,0.0352825f, +-0.314669f,0.949192f,0.00417096f, +-0.192981f,0.980434f,0.0388389f, +-0.184602f,0.98279f,-0.00683269f, +-0.246496f,0.934378f,-0.25725f, +-0.19921f,0.861846f,-0.466409f, +-0.140436f,0.848535f,-0.510163f, +-0.20288f,0.807079f,-0.554493f, +-0.11519f,0.832336f,-0.542169f, +0.00924053f,0.875455f,-0.483211f, +-0.00888073f,0.876341f,-0.48161f, +0.00107193f,0.907613f,-0.419807f, +0.021101f,0.930448f,-0.365817f, +0.0745313f,0.948396f,-0.308205f, +-0.200438f,0.964136f,-0.17397f, +-0.166231f,0.985214f,-0.0414839f, +-0.252324f,0.967639f,-0.00281073f, +-0.16447f,0.986195f,-0.0192238f, +0.0101706f,0.983613f,-0.180006f, +0.16229f,0.966979f,-0.196502f, +0.152128f,0.981833f,-0.113406f, +0.194455f,0.973444f,-0.120809f, +0.334057f,0.938492f,-0.0874058f, +0.243016f,0.928299f,-0.281434f, +0.337071f,0.885295f,-0.320369f, +0.298461f,0.876938f,-0.376698f, +0.311828f,0.819683f,-0.480502f, +0.369257f,0.755567f,-0.54108f, +0.401798f,0.784012f,-0.473163f, +0.404891f,0.784738f,-0.469309f, +0.444437f,0.782155f,-0.436702f, +0.466084f,0.794919f,-0.388419f, +0.447341f,0.805216f,-0.389247f, +0.362297f,0.887389f,-0.285098f, +0.179937f,0.962799f,-0.201595f, +0.000795301f,0.958246f,-0.285946f, +-0.0439986f,0.938528f,-0.342389f, +0.000314903f,0.959745f,-0.280871f, +-0.0200826f,0.975564f,-0.218794f, +-0.0669112f,0.936012f,-0.345551f, +0.0051897f,0.948012f,-0.318192f, +0.0134178f,0.970832f,-0.239387f, +0.036317f,0.978504f,-0.203005f, +0.0625457f,0.996542f,-0.0547064f, +-0.151505f,0.986626f,0.0601296f, +-0.354535f,0.929709f,0.0997293f, +-0.323458f,0.940866f,0.100727f, +-0.112965f,0.981029f,0.157548f, +-0.108156f,0.989168f,0.0992381f, +-0.141093f,0.979303f,0.145114f, +-0.335564f,0.940028f,0.061184f, +-0.404784f,0.910739f,0.081883f, +-0.415621f,0.909054f,0.0296628f, +-0.326024f,0.941449f,-0.0859172f, +-0.204455f,0.961807f,-0.182004f, +-0.198427f,0.946732f,-0.253624f, +-0.160629f,0.949f,-0.27129f, +-0.122223f,0.918206f,-0.376775f, +-0.161284f,0.939678f,-0.301651f, +-0.374966f,0.911783f,-0.167489f, +-0.467696f,0.856498f,-0.218336f, +-0.443475f,0.843003f,-0.304427f, +-0.385194f,0.898165f,-0.211955f, +-0.377418f,0.917998f,-0.121804f, +-0.264639f,0.962925f,0.0523651f, +-0.211739f,0.961017f,0.177801f, +-0.229995f,0.957255f,0.175401f, +-0.280377f,0.956102f,0.0851875f, +-0.20016f,0.97825f,0.0544282f, +-0.10573f,0.994257f,-0.0165441f, +0.0203896f,0.991211f,-0.130708f, +-0.0236073f,0.94884f,-0.314873f, +-0.0941765f,0.92043f,-0.379394f, +-0.167941f,0.897458f,-0.407879f, +-0.187085f,0.877031f,-0.442511f, +-0.0729267f,0.89358f,-0.44294f, +-0.0781669f,0.903365f,-0.421688f, +-0.0898224f,0.927661f,-0.362461f, +-0.0306254f,0.944826f,-0.326139f, +0.00767666f,0.952077f,-0.305762f, +-0.288656f,0.939633f,-0.183761f, +-0.235623f,0.952993f,-0.190489f, +-0.273085f,0.931861f,-0.238874f, +-0.0949222f,0.974332f,-0.204123f, +0.149266f,0.955245f,-0.255397f, +0.0666117f,0.957576f,-0.280376f, +0.127398f,0.979355f,-0.156952f, +0.209457f,0.954497f,-0.21228f, +0.367092f,0.913409f,-0.175864f, +0.415953f,0.865553f,-0.278928f, +0.34245f,0.832959f,-0.434635f, +0.340781f,0.830404f,-0.440793f, +0.395293f,0.802521f,-0.446882f, +0.405952f,0.792834f,-0.454552f, +0.385024f,0.788348f,-0.479858f, +0.365166f,0.783008f,-0.503539f, +0.371074f,0.838688f,-0.39863f, +0.42233f,0.859897f,-0.286732f, +0.440629f,0.882917f,-0.162183f, +0.299827f,0.949298f,-0.0945333f, +0.141695f,0.979344f,-0.144247f, +0.039666f,0.992248f,-0.117771f, +0.021245f,0.997585f,-0.0661304f, +-0.0594041f,0.983411f,-0.17139f, +0.0611812f,0.981318f,-0.182404f, +0.0186916f,0.932529f,-0.360611f, +-0.0300853f,0.91754f,-0.396504f, +-0.00135599f,0.922081f,-0.386995f, +-0.0351954f,0.956784f,-0.28866f, +-0.108108f,0.976189f,-0.188065f, +-0.279221f,0.950183f,-0.13852f, +-0.398641f,0.914814f,-0.0648175f, +-0.383626f,0.922668f,-0.0389249f, +-0.188191f,0.977628f,0.0939533f, +-0.083441f,0.973103f,0.21473f, +-0.0631642f,0.980575f,0.185698f, +-0.269017f,0.963031f,0.0141438f, +-0.4376f,0.89917f,-0.000301879f, +-0.339736f,0.940513f,0.00384959f, +-0.235638f,0.967987f,-0.0864624f, +-0.0773761f,0.988655f,-0.128744f, +-0.0852549f,0.968269f,-0.234917f, +-0.114948f,0.939941f,-0.3214f, +-0.156571f,0.928217f,-0.337488f, +-0.29563f,0.924155f,-0.241951f, +-0.401682f,0.899225f,-0.173337f, +-0.351799f,0.915761f,-0.193956f, +-0.391021f,0.882077f,-0.262761f, +-0.525453f,0.810665f,-0.258305f, +-0.504092f,0.859496f,-0.0846014f, +-0.362403f,0.931317f,0.0362275f, +-0.27912f,0.954258f,0.107159f, +-0.207619f,0.961802f,0.178414f, +-0.228638f,0.970139f,0.0809669f, +-0.12077f,0.992669f,0.00484841f, +0.0304882f,0.99448f,-0.100401f, +0.0674392f,0.979801f,-0.18826f, +0.0351304f,0.9953f,-0.090241f, +-0.0704736f,0.995263f,-0.0669708f, +-0.129706f,0.981562f,-0.1404f, +-0.122442f,0.956888f,-0.263387f, +-0.0356665f,0.922731f,-0.38379f, +-0.0454106f,0.896226f,-0.441267f, +-0.0870705f,0.865568f,-0.493164f, +-0.0312927f,0.854755f,-0.518087f, +-0.0110302f,0.85359f,-0.520829f, +-0.135251f,0.990349f,0.0302781f, +-0.120846f,0.991438f,-0.049458f, +-0.156404f,0.974115f,-0.163209f, +-0.121903f,0.951948f,-0.280952f, +0.0966131f,0.959924f,-0.263082f, +0.0624341f,0.96714f,-0.24646f, +0.0557469f,0.94749f,-0.31489f, +0.245712f,0.928812f,-0.27737f, +0.339947f,0.895451f,-0.28741f, +0.505833f,0.828917f,-0.238808f, +0.492153f,0.815708f,-0.303985f, +0.325713f,0.824266f,-0.463138f, +0.357884f,0.8174f,-0.451416f, +0.423911f,0.828952f,-0.364879f, +0.465983f,0.818349f,-0.3364f, +0.340136f,0.856815f,-0.387524f, +0.250037f,0.902839f,-0.349804f, +0.270063f,0.93551f,-0.227788f, +0.268197f,0.961943f,0.0523086f, +0.314452f,0.921737f,0.226982f, +0.230483f,0.962611f,0.142328f, +-0.0337231f,0.996519f,0.0762456f, +-0.0478467f,0.987694f,0.1489f, +0.0777224f,0.977564f,0.195776f, +0.137813f,0.987309f,0.0789204f, +0.213773f,0.976881f,-0.00209812f, +0.0678985f,0.982243f,-0.174896f, +-0.118448f,0.956882f,-0.26523f, +-0.229961f,0.9707f,-0.0697049f, +-0.144208f,0.98561f,0.0881926f, +-0.198479f,0.979386f,0.0375393f, +-0.401292f,0.909987f,-0.104347f, +-0.400254f,0.91005f,-0.107726f, +-0.346067f,0.932825f,-0.100374f, +-0.193125f,0.981161f,0.00517742f, +-0.0334943f,0.995589f,0.0876359f, +-0.09901f,0.987334f,0.12397f, +-0.411919f,0.909058f,-0.0627387f, +-0.33988f,0.934279f,-0.107727f, +-0.163445f,0.980417f,-0.109859f, +-0.094399f,0.976137f,-0.195566f, +-0.0281723f,0.98965f,-0.140708f, +-0.0765865f,0.985816f,-0.149338f, +-0.168645f,0.974838f,-0.145776f, +-0.316363f,0.934327f,-0.164156f, +-0.429172f,0.879196f,-0.206943f, +-0.428946f,0.898522f,-0.0930795f, +-0.397223f,0.909843f,0.12f, +-0.511164f,0.850782f,0.12199f, +-0.553545f,0.831305f,-0.0501975f, +-0.425265f,0.901367f,-0.0817687f, +-0.377377f,0.925701f,-0.0257517f, +-0.226427f,0.969468f,0.0941363f, +-0.0709665f,0.993431f,0.0897693f, +-0.0343935f,0.997803f,-0.0566276f, +0.136725f,0.981098f,-0.136942f, +-0.000388307f,0.974615f,-0.223888f, +-0.143125f,0.988947f,-0.0387096f, +-0.0654844f,0.993475f,0.0933713f, +0.0107967f,0.999865f,0.0124207f, +0.0463655f,0.990074f,-0.132676f, +0.111072f,0.958636f,-0.262069f, +0.052211f,0.918497f,-0.391967f, +0.014765f,0.869476f,-0.493754f, +-0.00446669f,0.826302f,-0.56321f, +-0.00312167f,0.829643f,-0.558286f, +-0.205328f,0.971118f,-0.121531f, +-0.107279f,0.990692f,-0.0837913f, +-0.0655817f,0.993795f,-0.089834f, +-0.0669083f,0.985851f,-0.15369f, +0.0877486f,0.98832f,-0.124596f, +0.169572f,0.978484f,-0.117533f, +0.160152f,0.950603f,-0.265903f, +0.208233f,0.926f,-0.314903f, +0.349792f,0.904675f,-0.243329f, +0.449891f,0.870303f,-0.200426f, +0.566229f,0.816333f,-0.113956f, +0.48817f,0.833849f,-0.257655f, +0.363235f,0.831342f,-0.420631f, +0.324206f,0.826771f,-0.459718f, +0.3997f,0.840833f,-0.365021f, +0.353025f,0.906211f,-0.232714f, +0.219616f,0.962891f,-0.156874f, +0.0720827f,0.994934f,-0.0700696f, +0.045678f,0.994046f,0.0989266f, +0.213575f,0.964796f,0.153475f, +0.24905f,0.930442f,0.268798f, +0.0777133f,0.945053f,0.317546f, +-0.128028f,0.977296f,0.168824f, +0.0217263f,0.951068f,0.308215f, +0.207313f,0.918764f,0.335998f, +0.282654f,0.924456f,0.255906f, +0.201157f,0.96204f,0.184429f, +-0.110233f,0.981395f,0.157205f, +-0.355659f,0.909169f,0.216606f, +-0.21295f,0.947904f,0.236917f, +-0.107393f,0.959263f,0.261306f, +-0.278087f,0.947596f,0.157257f, +-0.393558f,0.918794f,0.0304824f, +-0.302068f,0.952957f,-0.0250724f, +-0.213276f,0.970666f,-0.110997f, +-0.166999f,0.978773f,-0.118807f, +-0.142246f,0.989828f,0.00258048f, +-0.283745f,0.958854f,0.0093455f, +-0.336957f,0.941016f,-0.0308147f, +-0.113565f,0.9931f,-0.02925f, +-0.0231129f,0.991621f,-0.127093f, +-0.107284f,0.981887f,-0.156166f, +-0.121783f,0.990389f,-0.0655664f, +-0.179469f,0.983757f,0.00373427f, +-0.267261f,0.963295f,0.0251965f, +-0.419417f,0.907445f,0.0251735f, +-0.582729f,0.80835f,0.0836507f, +-0.554692f,0.78035f,0.288741f, +-0.368624f,0.840437f,0.397218f, +-0.336016f,0.929619f,0.151335f, +-0.379048f,0.912637f,-0.153022f, +-0.410461f,0.89244f,-0.187275f, +-0.310698f,0.938768f,-0.148932f, +-0.0772428f,0.993562f,-0.0828798f, +0.0559112f,0.996518f,-0.0618564f, +0.218481f,0.971621f,-0.090653f, +0.0070055f,0.988587f,-0.150488f, +-0.287385f,0.949521f,-0.125778f, +-0.0963797f,0.992515f,-0.0749989f, +0.0940601f,0.994076f,-0.0544632f, +0.147534f,0.985277f,-0.0863886f, +0.20617f,0.964455f,-0.165287f, +0.228919f,0.941159f,-0.248628f, +0.142687f,0.889558f,-0.433967f, +0.0525074f,0.86193f,-0.5043f, +-0.0400559f,0.852931f,-0.520485f, +-0.12929f,0.965503f,-0.226025f, +-0.12119f,0.954637f,-0.271994f, +-0.0677494f,0.970158f,-0.232815f, +-0.0658176f,0.978188f,-0.197017f, +0.00868199f,0.985201f,-0.171183f, +0.183883f,0.977449f,-0.103828f, +0.283397f,0.948052f,-0.144513f, +0.244002f,0.935244f,-0.256481f, +0.251457f,0.918413f,-0.305429f, +0.421894f,0.885288f,-0.195626f, +0.539016f,0.82675f,-0.161076f, +0.595125f,0.795068f,-0.117014f, +0.542945f,0.81823f,-0.188971f, +0.36087f,0.878337f,-0.313523f, +0.249934f,0.94591f,-0.206849f, +0.203095f,0.978645f,0.0317209f, +0.0808087f,0.992314f,0.0937131f, +0.015528f,0.990219f,0.138653f, +0.01799f,0.994881f,0.09944f, +0.195411f,0.975412f,0.101915f, +0.0694818f,0.977162f,0.200816f, +0.0667035f,0.917371f,0.392404f, +-0.00815505f,0.942331f,0.334582f, +-0.124548f,0.965608f,0.228228f, +0.172601f,0.943034f,0.284421f, +0.392995f,0.877789f,0.273937f, +0.148864f,0.962548f,0.226586f, +-0.160978f,0.90924f,0.383887f, +-0.338041f,0.865118f,0.370538f, +-0.158685f,0.913484f,0.374654f, +-0.085827f,0.934088f,0.346573f, +-0.160284f,0.956319f,0.244467f, +-0.286424f,0.955431f,0.0715057f, +-0.239888f,0.970684f,0.0150701f, +-0.160609f,0.986985f,0.00807186f, +-0.109896f,0.993313f,-0.0353894f, +-0.197211f,0.969041f,-0.148551f, +-0.329877f,0.939761f,-0.0896172f, +-0.308832f,0.948199f,-0.0744408f, +-0.098416f,0.980296f,-0.171271f, +0.0274733f,0.990192f,-0.136989f, +-0.0841565f,0.99088f,-0.105235f, +-0.256459f,0.960709f,-0.106143f, +-0.249667f,0.95978f,0.128406f, +-0.305999f,0.931391f,0.197168f, +-0.484241f,0.852569f,0.196565f, +-0.610379f,0.753144f,0.245383f, +-0.585787f,0.783089f,0.208867f, +-0.367515f,0.91758f,0.151588f, +-0.0411995f,0.989239f,0.140389f, +-0.109078f,0.987353f,-0.115051f, +-0.380949f,0.866858f,-0.321615f, +-0.342318f,0.88779f,-0.307647f, +-0.12792f,0.955198f,-0.266896f, +0.0278952f,0.967981f,-0.249469f, +0.188442f,0.9544f,-0.231539f, +0.052008f,0.978364f,-0.200246f, +-0.225418f,0.931417f,-0.285742f, +-0.134566f,0.926089f,-0.352493f, +0.0345745f,0.959769f,-0.278653f, +0.174695f,0.953806f,-0.24441f, +0.227273f,0.930386f,-0.287627f, +0.325716f,0.918321f,-0.224934f, +0.329407f,0.888239f,-0.32019f, +0.0905336f,0.875389f,-0.474867f, +-0.0331275f,0.86706f,-0.497102f, +0.0288126f,0.978255f,-0.205394f, +-0.0838329f,0.954569f,-0.285956f, +-0.140323f,0.954698f,-0.262415f, +-0.112432f,0.972197f,-0.205408f, +0.0092799f,0.981035f,-0.193608f, +0.142017f,0.962963f,-0.229203f, +0.310781f,0.933484f,-0.17895f, +0.359578f,0.919553f,-0.158514f, +0.334745f,0.907674f,-0.253129f, +0.345814f,0.873436f,-0.342815f, +0.500723f,0.821828f,-0.271799f, +0.538977f,0.812424f,-0.22242f, +0.523422f,0.839245f,-0.147303f, +0.340441f,0.940266f,0.000412888f, +0.0152874f,0.997305f,0.0717554f, +0.0533145f,0.966764f,0.250049f, +0.112464f,0.954457f,0.276338f, +0.109039f,0.955163f,0.275271f, +0.0445431f,0.979533f,0.196291f, +0.165433f,0.962373f,0.21557f, +-0.0715535f,0.977821f,0.196841f, +-0.0891149f,0.939351f,0.331178f, +0.117094f,0.910023f,0.397676f, +0.030807f,0.968216f,0.248212f, +0.157233f,0.982334f,0.101481f, +0.403254f,0.903723f,0.143774f, +0.0482774f,0.97679f,0.208689f, +-0.297552f,0.88274f,0.363639f, +-0.30014f,0.861944f,0.408619f, +-0.211374f,0.886111f,0.412466f, +-0.03076f,0.854928f,0.517834f, +0.0282722f,0.878122f,0.477601f, +-0.13332f,0.93673f,0.32367f, +-0.256519f,0.940042f,0.224764f, +-0.183801f,0.953616f,0.238397f, +-0.0194462f,0.968434f,0.24851f, +-0.0907191f,0.988269f,0.122863f, +-0.322189f,0.946234f,-0.028899f, +-0.20601f,0.965456f,-0.159543f, +-0.0654489f,0.973414f,-0.219504f, +-0.113732f,0.990052f,-0.0828341f, +-0.135223f,0.986029f,0.0972711f, +-0.295266f,0.944373f,0.144834f, +-0.450404f,0.860579f,0.237781f, +-0.30004f,0.881766f,0.363958f, +-0.429075f,0.860577f,0.274411f, +-0.624789f,0.771784f,0.118272f, +-0.497638f,0.864372f,0.0722275f, +-0.313601f,0.946808f,-0.0721819f, +-0.057809f,0.993544f,-0.0976184f, +0.13458f,0.987765f,-0.078798f, +-0.184662f,0.92514f,-0.331688f, +-0.385787f,0.812528f,-0.436996f, +-0.187957f,0.911737f,-0.36525f, +0.0316981f,0.954599f,-0.296202f, +0.147926f,0.956328f,-0.252101f, +0.104858f,0.974711f,-0.197342f, +-0.0836115f,0.931387f,-0.354298f, +-0.111379f,0.87594f,-0.469386f, +-0.0328315f,0.880204f,-0.473458f, +0.162025f,0.887756f,-0.430856f, +0.205253f,0.903446f,-0.376373f, +0.237481f,0.902569f,-0.359125f, +0.385116f,0.876359f,-0.289276f, +0.249914f,0.920198f,-0.301294f, +0.0143883f,0.906805f,-0.421304f, +0.1198f,0.98226f,-0.14427f, +-0.009516f,0.980934f,-0.194106f, +-0.149357f,0.951394f,-0.269335f, +-0.133007f,0.936454f,-0.324597f, +0.034566f,0.948692f,-0.314306f, +0.178184f,0.929444f,-0.323086f, +0.219637f,0.922638f,-0.317015f, +0.296463f,0.935411f,-0.192652f, +0.416664f,0.902617f,-0.108048f, +0.442812f,0.876638f,-0.188209f, +0.465688f,0.849444f,-0.248152f, +0.511879f,0.84424f,-0.158868f, +0.360617f,0.931627f,-0.0450278f, +0.228988f,0.955033f,0.188354f, +-0.00280316f,0.974776f,0.223168f, +0.00899431f,0.980078f,0.198407f, +0.0845579f,0.975657f,0.202347f, +0.0600237f,0.962271f,0.265389f, +0.0344627f,0.950379f,0.309181f, +0.173636f,0.921696f,0.346881f, +-0.00190385f,0.960894f,0.276909f, +-0.186383f,0.97431f,0.126416f, +0.101162f,0.98048f,0.168596f, +0.181976f,0.961147f,0.207559f, +0.220019f,0.957024f,0.188939f, +0.310192f,0.917199f,0.250053f, +-0.02225f,0.932984f,0.359229f, +-0.395015f,0.837639f,0.377259f, +-0.325443f,0.861588f,0.389554f, +-0.255559f,0.880464f,0.39934f, +-0.151471f,0.886274f,0.437693f, +-0.0211154f,0.863177f,0.50446f, +0.00094362f,0.808505f,0.588488f, +-0.114242f,0.850647f,0.513176f, +-0.11027f,0.888828f,0.444776f, +-0.0310984f,0.926772f,0.374335f, +0.036991f,0.899416f,0.435525f, +-0.0593828f,0.941327f,0.33223f, +-0.108182f,0.990534f,0.0844942f, +-0.153469f,0.985899f,0.066708f, +-0.257292f,0.956946f,0.134368f, +-0.339432f,0.926138f,0.164482f, +-0.361227f,0.853531f,0.3755f, +-0.433268f,0.811828f,0.391425f, +-0.292152f,0.883075f,0.367186f, +-0.254971f,0.931997f,0.257627f, +-0.51111f,0.857028f,-0.0653379f, +-0.482419f,0.859823f,-0.167263f, +-0.240122f,0.964988f,-0.105544f, +-0.0637549f,0.987476f,-0.144314f, +0.14266f,0.980144f,-0.137714f, +0.096896f,0.982614f,-0.158371f, +-0.287298f,0.856944f,-0.42791f, +-0.299829f,0.819408f,-0.488542f, +-0.0881013f,0.911449f,-0.40187f, +0.0509938f,0.949808f,-0.308649f, +0.13334f,0.962273f,-0.237174f, +0.0865622f,0.946427f,-0.311099f, +0.0118172f,0.924665f,-0.380599f, +-0.0178448f,0.910652f,-0.412789f, +0.073892f,0.906856f,-0.414913f, +0.15114f,0.90612f,-0.395099f, +0.255577f,0.878518f,-0.403593f, +0.278013f,0.865146f,-0.417411f, +0.239832f,0.923443f,-0.299555f, +0.188412f,0.940744f,-0.281961f, +-0.0158305f,0.982567f,-0.185231f, +0.0666038f,0.988337f,-0.136945f, +-0.0538402f,0.959334f,-0.277092f, +-0.0212127f,0.945816f,-0.324009f, +-0.0150833f,0.913689f,-0.406133f, +0.15601f,0.93774f,-0.310331f, +0.182702f,0.936618f,-0.298942f, +0.189924f,0.93758f,-0.29133f, +0.333869f,0.91329f,-0.233307f, +0.499532f,0.857573f,-0.122619f, +0.46551f,0.873216f,-0.144201f, +0.373694f,0.926999f,0.0320189f, +0.203779f,0.950539f,0.234414f, +0.13831f,0.928366f,0.344974f, +0.0515931f,0.949665f,0.30899f, +0.0310079f,0.96445f,0.262439f, +0.0853119f,0.968829f,0.232577f, +-0.00103764f,0.981733f,0.190261f, +-0.00365072f,0.967667f,0.252206f, +0.10066f,0.945677f,0.309134f, +0.178572f,0.914026f,0.364237f, +-0.0213985f,0.991455f,0.128684f, +0.0498313f,0.996519f,0.0668339f, +0.120586f,0.983203f,0.137006f, +0.0910496f,0.981472f,0.16859f, +0.13401f,0.919805f,0.368783f, +-0.0801133f,0.861028f,0.502208f, +-0.337717f,0.841946f,0.420801f, +-0.27627f,0.878916f,0.388821f, +-0.2301f,0.91025f,0.344237f, +-0.177792f,0.940411f,0.289857f, +-0.131507f,0.928729f,0.346652f, +-0.0961971f,0.892019f,0.441642f, +-0.0639687f,0.872394f,0.4846f, +-0.0102449f,0.879124f,0.476482f, +-0.00257342f,0.917704f,0.397258f, +-0.0554909f,0.910659f,0.409416f, +0.0291401f,0.896118f,0.442858f, +0.0220451f,0.91331f,0.406668f, +-0.138595f,0.921526f,0.362741f, +-0.186305f,0.924786f,0.331755f, +-0.347011f,0.903153f,0.25278f, +-0.513046f,0.817508f,0.261656f, +-0.445268f,0.835978f,0.320745f, +-0.177443f,0.933005f,0.313074f, +-0.0397144f,0.982015f,0.184579f, +-0.223543f,0.974128f,-0.0332155f, +-0.4666f,0.831165f,-0.302406f, +-0.335541f,0.890675f,-0.306773f, +-0.0318096f,0.973987f,-0.224358f, +0.0953506f,0.970682f,-0.220646f, +0.134482f,0.984534f,-0.112281f, +-0.0162953f,0.992479f,-0.121323f, +-0.284204f,0.902721f,-0.322992f, +-0.211997f,0.906314f,-0.365585f, +-0.016875f,0.958349f,-0.285101f, +0.129044f,0.959618f,-0.24996f, +0.151996f,0.928771f,-0.338057f, +-0.0199776f,0.904327f,-0.426372f, +-0.0559071f,0.940256f,-0.335846f, +0.108952f,0.945546f,-0.306712f, +0.215589f,0.905767f,-0.364838f, +0.293281f,0.878158f,-0.377921f, +0.279356f,0.877367f,-0.390112f, +0.127912f,0.886694f,-0.444312f, +0.153161f,0.902051f,-0.403541f, +-0.0890667f,0.969622f,-0.227816f, +0.0791521f,0.98141f,-0.174841f, +0.0791423f,0.971591f,-0.22304f, +0.0168825f,0.939671f,-0.341662f, +-0.00465273f,0.922224f,-0.386629f, +0.0341103f,0.949158f,-0.312946f, +0.243022f,0.94331f,-0.226069f, +0.218985f,0.910646f,-0.350386f, +0.282576f,0.88974f,-0.358487f, +0.398347f,0.877162f,-0.268155f, +0.330147f,0.941044f,-0.073754f, +0.178397f,0.970659f,0.16123f, +0.0525065f,0.954596f,0.293241f, +0.0945297f,0.914894f,0.392472f, +0.13661f,0.905749f,0.401193f, +0.0406243f,0.947359f,0.317587f, +0.163762f,0.925717f,0.340926f, +0.040504f,0.970394f,0.238108f, +-0.0543453f,0.975142f,0.214812f, +2.68223e-005f,0.976435f,0.215812f, +0.209407f,0.932778f,0.293383f, +0.184464f,0.966229f,0.179928f, +-0.0113387f,0.999016f,0.0428878f, +0.079177f,0.981677f,0.173323f, +0.0362262f,0.968187f,0.24759f, +-0.0723427f,0.93572f,0.345245f, +-0.135834f,0.890086f,0.435082f, +-0.264248f,0.873681f,0.408479f, +-0.262216f,0.89706f,0.355706f, +-0.164052f,0.919196f,0.358002f, +-0.167176f,0.924403f,0.342829f, +-0.200682f,0.904947f,0.375229f, +-0.158624f,0.899685f,0.406701f, +-0.112022f,0.891533f,0.438886f, +-0.00921475f,0.869473f,0.493894f, +0.0802624f,0.881225f,0.465833f, +-0.0504548f,0.922517f,0.382645f, +-0.0121989f,0.918687f,0.394797f, +0.0440736f,0.891185f,0.451494f, +-0.0756766f,0.900734f,0.427728f, +-0.202037f,0.909488f,0.363335f, +-0.295423f,0.866009f,0.403428f, +-0.471319f,0.827048f,0.30635f, +-0.443758f,0.874939f,0.193806f, +-0.125026f,0.977756f,0.168412f, +0.0442668f,0.987172f,0.153403f, +-0.0338798f,0.987768f,0.152205f, +-0.259589f,0.965039f,-0.0362462f, +-0.35784f,0.903258f,-0.236805f, +-0.167942f,0.956248f,-0.239554f, +0.0460995f,0.994911f,-0.0895878f, +-0.00166787f,0.99811f,-0.0614342f, +-0.0336402f,0.998923f,0.0319432f, +-0.139942f,0.989786f,0.0271849f, +-0.21913f,0.971861f,-0.0864193f, +-0.083914f,0.990307f,-0.110685f, +0.180721f,0.971397f,-0.154041f, +0.29639f,0.913592f,-0.278393f, +0.0452233f,0.94418f,-0.326312f, +-0.13463f,0.924181f,-0.357441f, +0.11753f,0.929423f,-0.349798f, +0.238754f,0.909243f,-0.340989f, +0.272577f,0.899491f,-0.341494f, +0.343945f,0.879082f,-0.330025f, +0.202726f,0.889055f,-0.410468f, +0.0880936f,0.876474f,-0.473321f, +-0.000386659f,0.989518f,-0.144407f, +-0.0138532f,0.983228f,-0.181856f, +0.165824f,0.98552f,-0.0353913f, +0.196669f,0.963831f,-0.179867f, +0.00115533f,0.93443f,-0.356144f, +-0.0579019f,0.928374f,-0.36711f, +0.234096f,0.913194f,-0.333581f, +0.311749f,0.881031f,-0.355805f, +0.243154f,0.902483f,-0.355529f, +0.214274f,0.956658f,-0.197209f, +0.120355f,0.990537f,0.0659672f, +0.0219689f,0.979298f,0.201227f, +-0.0108785f,0.963809f,0.266373f, +-0.016985f,0.957116f,0.289205f, +0.15437f,0.922679f,0.353316f, +0.0959731f,0.93811f,0.332776f, +0.138832f,0.935317f,0.325434f, +0.133758f,0.941295f,0.309956f, +-0.00148525f,0.972503f,0.232885f, +0.00817406f,0.979885f,0.199396f, +0.180862f,0.960033f,0.213602f, +0.330054f,0.924212f,0.192085f, +0.039978f,0.994865f,0.0929833f, +-0.118088f,0.976595f,0.179768f, +-0.100092f,0.923425f,0.370498f, +-0.117559f,0.88568f,0.449166f, +-0.170937f,0.879572f,0.443997f, +-0.244838f,0.844603f,0.47613f, +-0.196312f,0.844324f,0.498577f, +-0.188529f,0.85759f,0.478535f, +-0.188501f,0.839785f,0.509145f, +-0.185899f,0.842964f,0.50483f, +-0.154293f,0.872091f,0.464382f, +-0.115474f,0.894542f,0.431811f, +-0.0887035f,0.930393f,0.35567f, +0.133188f,0.884773f,0.446583f, +0.0484666f,0.90226f,0.42846f, +-0.0427135f,0.946807f,0.318954f, +-0.0239721f,0.952831f,0.302554f, +-0.0435714f,0.926502f,0.373759f, +-0.182333f,0.899048f,0.398079f, +-0.323546f,0.846433f,0.422929f, +-0.334412f,0.852971f,0.40076f, +-0.325744f,0.921829f,0.210052f, +-0.140593f,0.980752f,0.135497f, +-0.000911154f,0.974293f,0.225285f, +-0.0250989f,0.969759f,0.242771f, +-0.116671f,0.973198f,0.198177f, +-0.222025f,0.967605f,0.12019f, +-0.252573f,0.967519f,-0.0106675f, +-0.0639595f,0.99456f,0.0822198f, +0.0427289f,0.995551f,0.0839736f, +-0.103724f,0.994603f,-0.00239601f, +-0.143088f,0.981404f,0.127957f, +-0.10974f,0.986771f,0.119333f, +0.0104156f,0.996494f,-0.083017f, +0.293943f,0.936018f,-0.193565f, +0.319276f,0.921897f,-0.219472f, +0.0381885f,0.98033f,-0.193638f, +-0.0675527f,0.960756f,-0.269042f, +0.11652f,0.926645f,-0.357425f, +0.2292f,0.915276f,-0.331265f, +0.30797f,0.891339f,-0.33267f, +0.348546f,0.853103f,-0.38824f, +0.249601f,0.874176f,-0.416553f, +0.18778f,0.887174f,-0.421499f, +0.122671f,0.990262f,-0.0658213f, +-0.0435566f,0.992887f,-0.11081f, +0.0494387f,0.998572f,0.0202637f, +0.34574f,0.93458f,0.0838063f, +0.205482f,0.970541f,-0.125808f, +0.00807532f,0.928646f,-0.370879f, +0.212354f,0.896105f,-0.389746f, +0.285287f,0.924061f,-0.254407f, +0.130923f,0.978283f,-0.160691f, +-0.0198715f,0.999555f,-0.0222427f, +-0.0516664f,0.987583f,0.148362f, +-0.0269196f,0.97761f,0.208697f, +-0.00903021f,0.979554f,0.200976f, +-0.00834551f,0.993685f,0.111894f, +0.110842f,0.987362f,0.113269f, +0.106874f,0.976878f,0.185167f, +0.141547f,0.968321f,0.205716f, +0.174972f,0.958256f,0.22612f, +0.054828f,0.97071f,0.233913f, +0.0299952f,0.981566f,0.188753f, +0.154988f,0.980787f,0.118472f, +0.340268f,0.925521f,0.166219f, +0.0136729f,0.972695f,0.231683f, +-0.270301f,0.899629f,0.342937f, +-0.212226f,0.859098f,0.465736f, +-0.140535f,0.846284f,0.513861f, +-0.175101f,0.833937f,0.523345f, +-0.270288f,0.821688f,0.501769f, +-0.282918f,0.830124f,0.48047f, +-0.174774f,0.812594f,0.556008f, +-0.140913f,0.828898f,0.541361f, +-0.117146f,0.878471f,0.463211f, +-0.0728003f,0.920501f,0.383899f, +-0.00293246f,0.948861f,0.315679f, +-0.025836f,0.967046f,0.253289f, +-0.00528251f,0.957042f,0.289901f, +0.088837f,0.914901f,0.393781f, +0.103014f,0.924276f,0.367561f, +0.00437406f,0.95596f,0.293464f, +-0.1442f,0.952275f,0.269032f, +-0.25396f,0.922416f,0.290951f, +-0.3894f,0.883133f,0.261618f, +-0.283615f,0.906122f,0.313857f, +-0.158058f,0.930594f,0.330171f, +-0.134893f,0.961854f,0.237993f, +-0.0720522f,0.980808f,0.181173f, +0.0349752f,0.985618f,0.16533f, +-0.115886f,0.987377f,0.107965f, +-0.182211f,0.968171f,0.171592f, +-0.154769f,0.971197f,0.181169f, +-0.0833304f,0.991727f,0.0976435f, +0.136344f,0.989699f,0.0436644f, +-0.106946f,0.993768f,-0.0314277f, +-0.261215f,0.963441f,0.0595659f, +0.0120329f,0.999596f,0.0257635f, +0.254582f,0.953185f,-0.163178f, +0.299581f,0.899014f,-0.319413f, +0.266729f,0.9307f,-0.250307f, +0.0579078f,0.977779f,-0.201483f, +0.0590491f,0.968354f,-0.242494f, +0.196887f,0.912909f,-0.357536f, +0.211047f,0.877381f,-0.430885f, +0.301745f,0.869054f,-0.39204f, +0.422629f,0.852977f,-0.306291f, +0.252055f,0.896241f,-0.364994f, +0.158615f,0.91987f,-0.35872f, +0.099088f,0.991841f,-0.0802016f, +-0.0649468f,0.996188f,-0.0582405f, +-0.09006f,0.995865f,-0.0119566f, +0.299186f,0.949686f,0.0926523f, +0.448961f,0.886032f,0.115674f, +0.225408f,0.968479f,-0.106019f, +0.110364f,0.983262f,-0.144965f, +0.0982296f,0.994337f,0.0405443f, +0.03386f,0.98307f,0.180072f, +-0.0548904f,0.982813f,0.176255f, +-0.131535f,0.986412f,0.0984329f, +-0.0772354f,0.9803f,0.181787f, +0.0556449f,0.958844f,0.278429f, +0.08308f,0.969903f,0.228882f, +0.0990101f,0.980512f,0.169685f, +0.044494f,0.989611f,0.136713f, +0.124145f,0.981303f,0.14708f, +0.126925f,0.98249f,0.136391f, +0.0289993f,0.988064f,0.151292f, +0.146433f,0.982737f,0.113073f, +0.210582f,0.977005f,-0.0334257f, +0.179552f,0.980748f,0.0767724f, +-0.0986728f,0.925956f,0.364513f, +-0.333893f,0.835984f,0.435484f, +-0.316161f,0.849609f,0.422146f, +-0.184942f,0.836066f,0.516517f, +-0.165011f,0.827696f,0.536368f, +-0.1919f,0.849729f,0.491054f, +-0.260791f,0.881445f,0.393754f, +-0.244518f,0.891442f,0.3815f, +-0.101674f,0.91665f,0.386543f, +-0.0135975f,0.926806f,0.375295f, +0.0383624f,0.948469f,0.31454f, +0.0311937f,0.973858f,0.225008f, +-0.0712105f,0.966505f,0.24657f, +-0.0567001f,0.939446f,0.337973f, +0.028793f,0.937988f,0.345471f, +0.0944493f,0.922855f,0.373388f, +0.0339618f,0.928396f,0.370037f, +-0.0877384f,0.940895f,0.327137f, +-0.18953f,0.934542f,0.301182f, +-0.32638f,0.91712f,0.22884f, +-0.359606f,0.925931f,0.115484f, +-0.250341f,0.958991f,0.132911f, +-0.0188851f,0.981881f,0.188556f, +0.0444017f,0.992958f,0.109832f, +0.0292244f,0.992914f,0.115188f, +-0.0809364f,0.975181f,0.206087f, +-0.271318f,0.947628f,0.168488f, +-0.147667f,0.972329f,0.181027f, +0.0428511f,0.996597f,0.0704105f, +0.186761f,0.979997f,-0.0687482f, +-0.111624f,0.989428f,-0.0925828f, +-0.210799f,0.973161f,-0.0923101f, +0.115063f,0.969975f,-0.214262f, +0.376036f,0.900817f,-0.217086f, +0.373114f,0.884398f,-0.280403f, +0.226074f,0.905778f,-0.358407f, +0.0100432f,0.919347f,-0.393319f, +0.0770135f,0.93428f,-0.348124f, +0.321395f,0.895396f,-0.308175f, +0.278274f,0.88968f,-0.361984f, +0.208857f,0.897848f,-0.387619f, +0.325776f,0.898072f,-0.295527f, +0.259741f,0.94586f,-0.194637f, +0.133572f,0.977992f,-0.160282f, +-0.0277257f,0.992037f,-0.122857f, +-0.0924217f,0.994571f,-0.0478129f, +-0.116438f,0.990661f,-0.0709396f, +0.19557f,0.979919f,-0.0388625f, +0.381806f,0.908869f,0.167871f, +0.299282f,0.900933f,0.314247f, +0.0638964f,0.963274f,0.260808f, +-0.0731879f,0.961388f,0.265284f, +0.00180295f,0.933351f,0.35896f, +0.0655899f,0.939022f,0.337544f, +-0.0612046f,0.96894f,0.239602f, +-0.166052f,0.961913f,0.217141f, +-0.0893118f,0.965245f,0.245614f, +0.0820047f,0.941494f,0.326902f, +0.146932f,0.937808f,0.314527f, +0.136588f,0.939539f,0.314023f, +0.166222f,0.964584f,0.204811f, +0.17109f,0.976368f,0.132039f, +0.0961069f,0.992806f,0.0714098f, +0.21778f,0.975905f,-0.013487f, +0.251597f,0.967828f,-0.00281592f, +-0.0966896f,0.992674f,0.0724564f, +-0.377842f,0.87018f,0.316262f, +-0.323773f,0.853386f,0.408537f, +-0.278729f,0.867238f,0.412564f, +-0.286188f,0.874143f,0.392391f, +-0.157911f,0.873337f,0.46081f, +-0.102832f,0.901917f,0.419488f, +-0.202979f,0.914239f,0.350665f, +-0.202531f,0.912766f,0.354739f, +-0.0843061f,0.956165f,0.28043f, +-0.032801f,0.972626f,0.23005f, +0.0558474f,0.961664f,0.268485f, +0.0617913f,0.944956f,0.321309f, +-0.110343f,0.937288f,0.330629f, +-0.100375f,0.942449f,0.318927f, +0.00551388f,0.94452f,0.328408f, +0.0918462f,0.918926f,0.383587f, +0.101653f,0.927592f,0.3595f, +-0.0426308f,0.960188f,0.276083f, +-0.204594f,0.956809f,0.206539f, +-0.269971f,0.94929f,0.161132f, +-0.226691f,0.969699f,0.0910768f, +-0.201053f,0.979426f,-0.0173973f, +-0.0500104f,0.996428f,-0.0680439f, +0.0272717f,0.999341f,-0.0239459f, +-0.123434f,0.99095f,0.0527561f, +-0.192945f,0.962627f,0.190054f, +-0.168165f,0.969015f,0.180916f, +-0.018086f,0.998622f,0.0492547f, +0.193647f,0.975713f,-0.102395f, +0.238523f,0.949336f,-0.204618f, +-0.0631885f,0.979427f,-0.191649f, +-0.143153f,0.951631f,-0.271858f, +0.148284f,0.940281f,-0.306403f, +0.321113f,0.91022f,-0.261508f, +0.430557f,0.873923f,-0.225566f, +0.33081f,0.885978f,-0.324974f, +0.0651303f,0.881392f,-0.467874f, +0.0061581f,0.870221f,-0.492623f, +0.228459f,0.886891f,-0.401535f, +0.271547f,0.915184f,-0.297827f, +0.234822f,0.937165f,-0.258033f, +0.27549f,0.92259f,-0.270061f, +0.15924f,0.956523f,-0.244348f, +0.0559303f,0.980799f,-0.186831f, +-0.135424f,0.978967f,-0.152593f, +-0.15029f,0.985676f,-0.0765294f, +-0.0914165f,0.995631f,-0.0190383f, +0.0718608f,0.995714f,0.0582141f, +0.110439f,0.955564f,0.273313f, +0.150494f,0.878589f,0.453246f, +0.206788f,0.864483f,0.458157f, +0.00161058f,0.957582f,0.288156f, +-0.0606597f,0.978401f,0.197616f, +0.0692656f,0.9636f,0.25822f, +-0.0150286f,0.961837f,0.273212f, +-0.0821089f,0.979895f,0.181835f, +-0.0658015f,0.997594f,0.0218166f, +0.0735253f,0.997209f,0.0129617f, +0.108564f,0.993746f,0.0261473f, +0.141903f,0.981669f,0.127241f, +0.25029f,0.961471f,0.113707f, +0.225135f,0.967003f,0.119246f, +0.180078f,0.979492f,0.0903737f, +0.237995f,0.971216f,-0.00990333f, +0.0690008f,0.993039f,0.0954582f, +-0.15301f,0.921345f,0.357369f, +-0.436898f,0.858127f,0.2697f, +-0.402318f,0.892319f,0.204714f, +-0.306797f,0.913547f,0.267033f, +-0.291188f,0.917032f,0.272509f, +-0.177835f,0.951614f,0.250608f, +-0.0915363f,0.968867f,0.230039f, +-0.166531f,0.945303f,0.280483f, +-0.214524f,0.956179f,0.199251f, +-0.012479f,0.976094f,0.216991f, +0.0485598f,0.972045f,0.22972f, +-0.0252191f,0.985709f,0.166561f, +-0.0505751f,0.962642f,0.266012f, +-0.0744793f,0.942362f,0.3262f, +-0.0759606f,0.964725f,0.252062f, +-0.0161104f,0.954528f,0.297687f, +0.0264811f,0.949176f,0.313631f, +0.160628f,0.931063f,0.327597f, +0.0783265f,0.972396f,0.219798f, +-0.0844827f,0.993769f,0.0727062f, +-0.216702f,0.975588f,-0.035603f, +-0.195742f,0.979732f,-0.0425419f, +-0.158684f,0.986912f,-0.0287187f, +-0.0351752f,0.999203f,-0.0188605f, +0.0075235f,0.998877f,-0.0467686f, +-0.172586f,0.978556f,-0.112436f, +-0.211691f,0.968971f,-0.127601f, +-0.0966389f,0.974492f,-0.202552f, +0.105494f,0.955113f,-0.276822f, +0.276059f,0.900517f,-0.335947f, +0.219894f,0.907239f,-0.358557f, +-0.0517693f,0.940977f,-0.334489f, +-0.112634f,0.913693f,-0.390485f, +0.139923f,0.91136f,-0.387097f, +0.277005f,0.880398f,-0.384926f, +0.432717f,0.843875f,-0.317222f, +0.433921f,0.823502f,-0.365455f, +0.17364f,0.848637f,-0.499665f, +-0.015678f,0.850557f,-0.525649f, +0.122709f,0.874405f,-0.469423f, +0.164019f,0.896294f,-0.412014f, +0.166557f,0.925047f,-0.34139f, +0.280426f,0.925939f,-0.25298f, +0.167623f,0.949542f,-0.265088f, +-0.00102675f,0.947405f,-0.320035f, +-0.299103f,0.954018f,0.0196808f, +-0.231787f,0.963234f,0.135851f, +-0.196753f,0.961454f,0.192081f, +-0.100151f,0.951932f,0.289472f, +-0.0563981f,0.925245f,0.375154f, +0.0944709f,0.906549f,0.411394f, +0.305132f,0.862547f,0.403618f, +0.241596f,0.931691f,0.271261f, +-0.00370494f,0.998524f,0.0541932f, +-0.000261525f,0.998839f,0.0481646f, +0.0260826f,0.996855f,0.0748309f, +0.0599122f,0.998202f,-0.00179631f, +0.0800977f,0.992669f,-0.0905174f, +0.0495455f,0.986325f,-0.157186f, +0.0563113f,0.99071f,-0.123787f, +0.0832843f,0.991933f,-0.095561f, +0.195142f,0.979158f,-0.0563024f, +0.166634f,0.980307f,0.105976f, +0.195862f,0.965878f,0.169461f, +0.284001f,0.943304f,0.171815f, +-0.127388f,0.981047f,0.146008f, +-0.325222f,0.907949f,0.264311f, +-0.283635f,0.916157f,0.28321f, +-0.335047f,0.926228f,0.17276f, +-0.335005f,0.934046f,0.123816f, +-0.290471f,0.951826f,0.098256f, +-0.155538f,0.980437f,0.120632f, +-0.103955f,0.982905f,0.151957f, +-0.195165f,0.971298f,0.135979f, +-0.117017f,0.988828f,0.0923353f, +-0.0942839f,0.995508f,0.00860997f, +-0.0378307f,0.988218f,0.148301f, +0.011735f,0.964206f,0.264893f, +-0.104568f,0.970188f,0.218634f, +-0.0628876f,0.976435f,0.206445f, +-0.0629747f,0.98253f,0.175127f, +-0.0956593f,0.974263f,0.204109f, +0.00313264f,0.95614f,0.292895f, +0.184054f,0.913334f,0.363241f, +0.234886f,0.917194f,0.321843f, +0.0818984f,0.986888f,0.139086f, +-0.195667f,0.979747f,-0.0425424f, +-0.217661f,0.976006f,-0.00606019f, +-0.197993f,0.980131f,-0.011927f, +-0.0476541f,0.998861f,-0.00224411f, +0.0987461f,0.994341f,-0.039179f, +-0.0376594f,0.985822f,-0.163515f, +-0.127665f,0.950129f,-0.284528f, +0.022229f,0.926621f,-0.37534f, +0.1509f,0.867911f,-0.473243f, +0.251356f,0.84329f,-0.475061f, +0.180391f,0.877498f,-0.44436f, +-0.0381311f,0.903323f,-0.427263f, +-0.0302687f,0.878817f,-0.476199f, +0.151045f,0.843437f,-0.515557f, +0.243043f,0.829132f,-0.503459f, +0.361214f,0.815934f,-0.451416f, +0.469501f,0.80804f,-0.355866f, +0.232058f,0.89573f,-0.379233f, +-0.0406313f,0.902008f,-0.429803f, +0.0570971f,0.896722f,-0.438895f, +0.139199f,0.907425f,-0.396488f, +0.0981956f,0.909915f,-0.403003f, +0.173099f,0.913856f,-0.367293f, +0.208242f,0.936494f,-0.28216f, +0.104323f,0.936228f,-0.335549f, +-0.455877f,0.874672f,0.164697f, +-0.324643f,0.906811f,0.268889f, +-0.22917f,0.934048f,0.273927f, +-0.11917f,0.945648f,0.302569f, +-0.0303449f,0.953424f,0.300104f, +0.0953211f,0.968161f,0.231468f, +0.307551f,0.928088f,0.209914f, +0.396906f,0.882705f,0.251588f, +0.154339f,0.98019f,0.124127f, +0.00614755f,0.999958f,0.00674104f, +0.0862143f,0.995356f,-0.0428297f, +0.0605751f,0.988948f,-0.135323f, +0.116851f,0.991236f,-0.0616197f, +0.0626175f,0.989161f,-0.132815f, +0.0598334f,0.989391f,-0.132381f, +0.0870904f,0.982628f,-0.163882f, +0.0967617f,0.982554f,-0.15882f, +0.0255981f,0.999032f,-0.0357718f, +0.114826f,0.99101f,0.0686587f, +0.196799f,0.954402f,0.22447f, +-0.0385546f,0.932725f,0.358521f, +-0.332784f,0.924223f,0.18726f, +-0.304588f,0.936692f,0.172726f, +-0.293315f,0.937819f,0.185638f, +-0.274742f,0.953043f,0.127381f, +-0.263119f,0.962853f,0.0606766f, +-0.268024f,0.959606f,0.0855591f, +-0.0879001f,0.973995f,0.208824f, +-0.133948f,0.986848f,0.0904876f, +-0.113332f,0.988235f,0.102703f, +-0.0299834f,0.985262f,0.168402f, +-0.19277f,0.976736f,0.0939502f, +-0.0881002f,0.973369f,0.211639f, +-0.024161f,0.965814f,0.258109f, +-0.0447814f,0.977625f,0.205534f, +-0.0454862f,0.975256f,0.216349f, +-0.133105f,0.964838f,0.22665f, +-0.114579f,0.956534f,0.268169f, +0.0712671f,0.941693f,0.328841f, +0.238728f,0.884921f,0.399904f, +0.297664f,0.869038f,0.395183f, +-0.00961778f,0.988677f,0.149748f, +-0.265709f,0.963666f,-0.0273077f, +-0.143358f,0.988736f,0.0430136f, +-0.00534208f,0.998711f,-0.0504723f, +0.174549f,0.979244f,-0.103024f, +0.0753759f,0.97722f,-0.198391f, +-0.0309169f,0.954209f,-0.297538f, +0.114484f,0.932628f,-0.342197f, +0.277629f,0.881086f,-0.382896f, +0.233881f,0.840787f,-0.488238f, +0.145974f,0.866169f,-0.477957f, +-0.0214889f,0.855591f,-0.517207f, +0.015747f,0.850281f,-0.526094f, +0.181736f,0.859322f,-0.478056f, +0.233268f,0.832868f,-0.501913f, +0.278912f,0.819449f,-0.500711f, +0.37496f,0.838284f,-0.395834f, +0.211098f,0.909912f,-0.357069f, +0.0173895f,0.949305f,-0.313875f, +0.0778513f,0.935569f,-0.344455f, +0.13573f,0.919161f,-0.369756f, +0.128317f,0.903382f,-0.40919f, +0.134873f,0.894846f,-0.425512f, +0.140765f,0.922098f,-0.360446f, +0.195779f,0.941368f,-0.274766f, +-0.498792f,0.861228f,0.0974355f, +-0.334273f,0.933116f,0.132498f, +-0.209899f,0.97009f,0.121936f, +-0.146122f,0.979163f,0.141027f, +-0.00844043f,0.991347f,0.130997f, +0.183871f,0.98064f,0.0673491f, +0.295623f,0.955305f,0.000649681f, +0.325261f,0.940591f,0.0974362f, +0.279972f,0.936209f,0.212435f, +0.117319f,0.989809f,0.0807136f, +0.167452f,0.985876f,0.00303625f, +0.0997326f,0.991951f,-0.0780129f, +0.0970545f,0.989541f,-0.106723f, +0.122983f,0.982138f,-0.14241f, +0.0889416f,0.984545f,-0.150867f, +0.0922265f,0.975522f,-0.199627f, +0.0767647f,0.98447f,-0.15788f, +-0.0166949f,0.981051f,-0.193027f, +-0.0192651f,0.97159f,-0.235885f, +-0.0430007f,0.99834f,-0.038322f, +-0.1057f,0.976121f,0.189775f, +-0.21501f,0.968939f,0.122177f, +-0.312622f,0.947332f,0.0695023f, +-0.268759f,0.958656f,0.0935212f, +-0.210053f,0.974561f,0.0781578f, +-0.280996f,0.956877f,0.0736733f, +-0.29425f,0.945004f,0.142776f, +-0.103752f,0.988352f,0.111339f, +-0.0179991f,0.994529f,0.102897f, +-0.257355f,0.965403f,0.0420096f, +-0.105403f,0.956057f,0.273578f, +-0.10459f,0.942017f,0.318851f, +-0.129983f,0.956026f,0.262903f, +-0.0671262f,0.95499f,0.288944f, +-0.00387184f,0.948915f,0.315508f, +-0.104327f,0.957897f,0.267486f, +-0.136557f,0.931775f,0.336375f, +-0.0981417f,0.964639f,0.24462f, +0.0564237f,0.977306f,0.204178f, +0.151449f,0.955346f,0.253725f, +0.313069f,0.882901f,0.349962f, +0.317375f,0.903515f,0.287983f, +-0.14146f,0.988238f,-0.0580959f, +-0.183704f,0.977531f,-0.10337f, +0.0729777f,0.993775f,-0.0841813f, +0.241185f,0.959561f,-0.145165f, +0.180872f,0.946861f,-0.26597f, +0.0759246f,0.918564f,-0.387911f, +0.0834031f,0.881426f,-0.4649f, +0.312989f,0.886301f,-0.341334f, +0.345782f,0.8869f,-0.306339f, +0.190174f,0.893803f,-0.40614f, +0.0967003f,0.870562f,-0.482463f, +-0.011292f,0.813313f,-0.581716f, +0.104307f,0.818569f,-0.564858f, +0.278742f,0.804599f,-0.524332f, +0.252871f,0.80123f,-0.542298f, +0.288393f,0.816691f,-0.499846f, +0.158986f,0.877853f,-0.451771f, +-0.0422089f,0.892803f,-0.448466f, +0.0676213f,0.902423f,-0.425511f, +0.196008f,0.897779f,-0.394428f, +0.174291f,0.88488f,-0.431984f, +0.107973f,0.893114f,-0.43668f, +0.0286973f,0.916566f,-0.398853f, +0.0334026f,0.935074f,-0.352875f, +-0.456752f,0.886621f,-0.0726759f, +-0.35821f,0.92461f,-0.129546f, +-0.255187f,0.962466f,-0.0924034f, +-0.153659f,0.987984f,-0.0166497f, +0.0326193f,0.998752f,-0.0378261f, +0.219848f,0.975435f,-0.0138776f, +0.325192f,0.945498f,0.0168406f, +0.223054f,0.973348f,-0.0532875f, +0.221049f,0.975263f,0.000679153f, +0.242907f,0.969656f,0.0276409f, +0.175892f,0.983375f,-0.0451076f, +0.180873f,0.98342f,0.0130764f, +0.169259f,0.981997f,-0.0838673f, +0.138819f,0.973225f,-0.183198f, +0.0923263f,0.975478f,-0.199795f, +0.109785f,0.97291f,-0.203452f, +0.048887f,0.975403f,-0.214938f, +0.0862303f,0.974446f,-0.207409f, +0.0239822f,0.965181f,-0.260482f, +-0.234299f,0.93066f,-0.281028f, +-0.183154f,0.968628f,-0.167974f, +-0.163946f,0.9725f,-0.165423f, +-0.29935f,0.945623f,-0.127226f, +-0.309491f,0.943295f,-0.120043f, +-0.244588f,0.967669f,-0.0615978f, +-0.316375f,0.948228f,-0.0277512f, +-0.278706f,0.959538f,-0.0401272f, +-0.112855f,0.98959f,-0.0893067f, +-0.0120823f,0.999804f,0.015665f, +-0.269265f,0.962743f,0.0249422f, +-0.319779f,0.940968f,0.110998f, +-0.127925f,0.957822f,0.257316f, +-0.134411f,0.958853f,0.250069f, +-0.0963489f,0.939739f,0.328035f, +0.013379f,0.931979f,0.362265f, +-0.059723f,0.950577f,0.304692f, +-0.140375f,0.96932f,0.201776f, +0.0285405f,0.975242f,0.219289f, +0.0759984f,0.981739f,0.174395f, +0.082912f,0.985645f,0.14707f, +0.244118f,0.959921f,0.137686f, +0.433469f,0.888297f,0.151764f, +0.159753f,0.986026f,0.0472448f, +-0.155828f,0.965805f,-0.207217f, +0.0529598f,0.961817f,-0.268522f, +0.302231f,0.91749f,-0.258588f, +0.300969f,0.905771f,-0.298324f, +0.219954f,0.902269f,-0.370851f, +0.168125f,0.874674f,-0.45462f, +0.0852064f,0.832228f,-0.547846f, +0.293285f,0.876411f,-0.381953f, +0.299707f,0.878674f,-0.371628f, +0.169625f,0.87124f,-0.460618f, +0.152784f,0.862886f,-0.481751f, +0.140952f,0.826781f,-0.544578f, +0.216806f,0.796193f,-0.564865f, +0.252088f,0.778347f,-0.575003f, +0.184028f,0.779276f,-0.599052f, +0.07662f,0.847353f,-0.525474f, +-0.000576164f,0.875581f,-0.483072f, +0.0676453f,0.855821f,-0.51283f, +0.10935f,0.864233f,-0.491064f, +0.170357f,0.902391f,-0.395814f, +0.0783522f,0.922085f,-0.378973f, +-0.0376769f,0.945309f,-0.323992f, +-0.0145087f,0.973617f,-0.227725f, +-0.23379f,0.969091f,0.0787691f, +-0.308611f,0.949667f,-0.0537712f, +-0.26795f,0.959457f,-0.087437f, +-0.196118f,0.96672f,-0.16429f, +0.0184009f,0.993828f,-0.109391f, +0.124962f,0.988681f,-0.0830367f, +0.297057f,0.954812f,-0.00955538f, +0.355506f,0.934478f,-0.0191401f, +0.206845f,0.957298f,-0.201981f, +0.24827f,0.946264f,-0.207234f, +0.137685f,0.959548f,-0.245584f, +0.129837f,0.983718f,-0.124261f, +0.240211f,0.966075f,-0.0948542f, +0.253383f,0.959847f,-0.120381f, +0.101386f,0.970431f,-0.219056f, +0.110568f,0.971775f,-0.208395f, +0.09998f,0.968593f,-0.227667f, +0.051279f,0.9528f,-0.299236f, +0.0182953f,0.960636f,-0.277207f, +-0.177379f,0.948528f,-0.262356f, +-0.248744f,0.930203f,-0.269905f, +-0.201336f,0.9681f,-0.14915f, +-0.308378f,0.940105f,-0.145279f, +-0.337871f,0.915739f,-0.217407f, +-0.303349f,0.940151f,-0.155226f, +-0.267648f,0.955794f,-0.121746f, +-0.256838f,0.946595f,-0.194914f, +-0.151848f,0.978969f,-0.136244f, +-0.166527f,0.98578f,-0.0225025f, +-0.271416f,0.956933f,0.103014f, +-0.388293f,0.921445f,0.0129329f, +-0.211649f,0.973838f,0.0827345f, +-0.164151f,0.971899f,0.168719f, +-0.20343f,0.950968f,0.232971f, +-0.0501604f,0.944198f,0.325535f, +0.0851988f,0.916779f,0.390203f, +-0.0675238f,0.966737f,0.246698f, +-0.050967f,0.964665f,0.258503f, +0.0897532f,0.945965f,0.311599f, +0.203817f,0.954291f,0.218604f, +0.298323f,0.9542f,0.0224806f, +0.409994f,0.911395f,0.0355409f, +0.297451f,0.952362f,0.0673044f, +0.087158f,0.982486f,-0.164695f, +0.130693f,0.926163f,-0.353753f, +0.287973f,0.877932f,-0.3825f, +0.285473f,0.870692f,-0.400501f, +0.210236f,0.894171f,-0.395297f, +0.291478f,0.889926f,-0.350816f, +0.238796f,0.833f,-0.499086f, +0.156519f,0.786723f,-0.597134f, +0.265294f,0.807831f,-0.526334f, +0.196683f,0.821511f,-0.535197f, +0.111545f,0.852981f,-0.509883f, +0.148451f,0.876975f,-0.457031f, +0.27925f,0.865803f,-0.415216f, +0.364812f,0.845771f,-0.389337f, +0.213362f,0.862896f,-0.458135f, +-0.014091f,0.870788f,-0.491456f, +-0.0389733f,0.872117f,-0.487742f, +0.0697073f,0.876793f,-0.475789f, +0.0500075f,0.893805f,-0.445659f, +0.0507492f,0.920605f,-0.387184f, +0.00717016f,0.971083f,-0.238636f, +-0.12982f,0.987525f,-0.0891113f, +-0.196671f,0.977747f,-0.0730188f, +-0.180786f,0.972597f,0.146192f, +-0.276836f,0.956623f,0.0907445f, +-0.145247f,0.980389f,0.133193f, +-0.201228f,0.967008f,-0.156214f, +-0.0137179f,0.995281f,-0.0960578f, +0.139707f,0.987867f,-0.0678349f, +0.246306f,0.96116f,-0.124516f, +0.421865f,0.906227f,-0.0279788f, +0.299255f,0.934152f,-0.194439f, +0.288356f,0.912569f,-0.289945f, +0.0853497f,0.915952f,-0.392106f, +0.039019f,0.957394f,-0.286136f, +0.208597f,0.95771f,-0.198188f, +0.25753f,0.95731f,-0.131287f, +0.153643f,0.978938f,-0.134439f, +0.0994252f,0.976974f,-0.188775f, +0.12654f,0.974603f,-0.184759f, +0.142684f,0.966335f,-0.214099f, +-0.00843645f,0.93512f,-0.354231f, +-0.17704f,0.933769f,-0.311017f, +-0.343277f,0.895674f,-0.282717f, +-0.276715f,0.959562f,-0.0516624f, +-0.215753f,0.976427f,-0.00633257f, +-0.305134f,0.926522f,-0.220112f, +-0.33388f,0.920497f,-0.203001f, +-0.259644f,0.948413f,-0.181927f, +-0.268974f,0.938104f,-0.218205f, +-0.245938f,0.962991f,-0.110289f, +-0.275564f,0.96071f,0.0331654f, +-0.258271f,0.944524f,0.202903f, +-0.309053f,0.947461f,0.0824847f, +-0.320335f,0.94673f,-0.0329778f, +-0.208609f,0.963472f,0.167941f, +-0.270763f,0.941796f,0.199269f, +-0.104692f,0.947993f,0.30058f, +0.0304241f,0.930802f,0.364255f, +0.0189457f,0.906511f,0.421757f, +-0.0823065f,0.924037f,0.373337f, +0.102263f,0.911082f,0.39934f, +0.325851f,0.888801f,0.322263f, +0.371159f,0.927767f,0.0385981f, +0.355076f,0.934525f,0.0241533f, +0.375158f,0.916478f,0.139015f, +0.286108f,0.953917f,-0.0904664f, +0.199009f,0.919897f,-0.337913f, +0.358636f,0.872243f,-0.332523f, +0.268543f,0.846175f,-0.460296f, +0.182977f,0.871041f,-0.455858f, +0.289295f,0.860781f,-0.418765f, +0.382576f,0.820168f,-0.425393f, +0.183794f,0.780369f,-0.597699f, +0.239111f,0.770893f,-0.590381f, +0.11759f,0.781853f,-0.612273f, +0.0625615f,0.849006f,-0.524666f, +0.09237f,0.869569f,-0.485096f, +0.210947f,0.881757f,-0.421908f, +0.36331f,0.890409f,-0.274185f, +0.280816f,0.923638f,-0.260836f, +0.0186632f,0.936387f,-0.350473f, +-0.00764646f,0.914133f,-0.405343f, +0.0383964f,0.885647f,-0.462769f, +0.0296537f,0.913944f,-0.404755f, +-0.02984f,0.920171f,-0.390377f, +-0.172982f,0.943792f,-0.281663f, +-0.19032f,0.979403f,0.0674393f, +-0.205961f,0.972526f,0.108505f, +}; + +btScalar Landscape08Tex[] = { +0.0f,0.757813f, +0.0f,0.75f, +0.0078125f,0.757813f, +0.0078125f,0.75f, +0.015625f,0.757813f, +0.015625f,0.75f, +0.0234375f,0.757813f, +0.0234375f,0.75f, +0.03125f,0.757813f, +0.03125f,0.75f, +0.0390625f,0.757813f, +0.0390625f,0.75f, +0.046875f,0.757813f, +0.046875f,0.75f, +0.0546875f,0.757813f, +0.0546875f,0.75f, +0.0625f,0.757813f, +0.0625f,0.75f, +0.0703125f,0.757813f, +0.0703125f,0.75f, +0.078125f,0.757813f, +0.078125f,0.75f, +0.0859375f,0.757813f, +0.0859375f,0.75f, +0.09375f,0.757813f, +0.09375f,0.75f, +0.101563f,0.757813f, +0.101563f,0.75f, +0.109375f,0.757813f, +0.109375f,0.75f, +0.117188f,0.757813f, +0.117188f,0.75f, +0.125f,0.757813f, +0.125f,0.75f, +0.132813f,0.757813f, +0.132813f,0.75f, +0.140625f,0.757813f, +0.140625f,0.75f, +0.148438f,0.757813f, +0.148438f,0.75f, +0.15625f,0.757813f, +0.15625f,0.75f, +0.164063f,0.757813f, +0.164063f,0.75f, +0.171875f,0.757813f, +0.171875f,0.75f, +0.179688f,0.757813f, +0.179688f,0.75f, +0.1875f,0.757813f, +0.1875f,0.75f, +0.195313f,0.757813f, +0.195313f,0.75f, +0.203125f,0.757813f, +0.203125f,0.75f, +0.210938f,0.757813f, +0.210938f,0.75f, +0.21875f,0.757813f, +0.21875f,0.75f, +0.226563f,0.757813f, +0.226563f,0.75f, +0.234375f,0.757813f, +0.234375f,0.75f, +0.242188f,0.757813f, +0.242188f,0.75f, +0.25f,0.757813f, +0.25f,0.75f, +0.257813f,0.757813f, +0.257813f,0.75f, +0.265625f,0.757813f, +0.265625f,0.75f, +0.273438f,0.757813f, +0.273438f,0.75f, +0.28125f,0.757813f, +0.28125f,0.75f, +0.289063f,0.757813f, +0.289063f,0.75f, +0.296875f,0.757813f, +0.296875f,0.75f, +0.304688f,0.757813f, +0.304688f,0.75f, +0.3125f,0.757813f, +0.3125f,0.75f, +0.320313f,0.757813f, +0.320313f,0.75f, +0.328125f,0.757813f, +0.328125f,0.75f, +0.335938f,0.757813f, +0.335938f,0.75f, +0.34375f,0.757813f, +0.34375f,0.75f, +0.351563f,0.757813f, +0.351563f,0.75f, +0.359375f,0.757813f, +0.359375f,0.75f, +0.367188f,0.757813f, +0.367188f,0.75f, +0.375f,0.757813f, +0.375f,0.75f, +0.382813f,0.757813f, +0.382813f,0.75f, +0.390625f,0.757813f, +0.390625f,0.75f, +0.398438f,0.757813f, +0.398438f,0.75f, +0.40625f,0.757813f, +0.40625f,0.75f, +0.414063f,0.757813f, +0.414063f,0.75f, +0.421875f,0.757813f, +0.421875f,0.75f, +0.429688f,0.757813f, +0.429688f,0.75f, +0.4375f,0.757813f, +0.4375f,0.75f, +0.445313f,0.757813f, +0.445313f,0.75f, +0.453125f,0.757813f, +0.453125f,0.75f, +0.460938f,0.757813f, +0.460938f,0.75f, +0.46875f,0.757813f, +0.46875f,0.75f, +0.476563f,0.757813f, +0.476563f,0.75f, +0.484375f,0.757813f, +0.484375f,0.75f, +0.492188f,0.757813f, +0.492188f,0.75f, +0.5f,0.757813f, +0.5f,0.75f, +0.507813f,0.757813f, +0.507813f,0.75f, +0.0f,0.765625f, +0.0078125f,0.765625f, +0.015625f,0.765625f, +0.0234375f,0.765625f, +0.03125f,0.765625f, +0.0390625f,0.765625f, +0.046875f,0.765625f, +0.0546875f,0.765625f, +0.0625f,0.765625f, +0.0703125f,0.765625f, +0.078125f,0.765625f, +0.0859375f,0.765625f, +0.09375f,0.765625f, +0.101563f,0.765625f, +0.109375f,0.765625f, +0.117188f,0.765625f, +0.125f,0.765625f, +0.132813f,0.765625f, +0.140625f,0.765625f, +0.148438f,0.765625f, +0.15625f,0.765625f, +0.164063f,0.765625f, +0.171875f,0.765625f, +0.179688f,0.765625f, +0.1875f,0.765625f, +0.195313f,0.765625f, +0.203125f,0.765625f, +0.210938f,0.765625f, +0.21875f,0.765625f, +0.226563f,0.765625f, +0.234375f,0.765625f, +0.242188f,0.765625f, +0.25f,0.765625f, +0.257813f,0.765625f, +0.265625f,0.765625f, +0.273438f,0.765625f, +0.28125f,0.765625f, +0.289063f,0.765625f, +0.296875f,0.765625f, +0.304688f,0.765625f, +0.3125f,0.765625f, +0.320313f,0.765625f, +0.328125f,0.765625f, +0.335938f,0.765625f, +0.34375f,0.765625f, +0.351563f,0.765625f, +0.359375f,0.765625f, +0.367188f,0.765625f, +0.375f,0.765625f, +0.382813f,0.765625f, +0.390625f,0.765625f, +0.398438f,0.765625f, +0.40625f,0.765625f, +0.414063f,0.765625f, +0.421875f,0.765625f, +0.429688f,0.765625f, +0.4375f,0.765625f, +0.445313f,0.765625f, +0.453125f,0.765625f, +0.460938f,0.765625f, +0.46875f,0.765625f, +0.476563f,0.765625f, +0.484375f,0.765625f, +0.492188f,0.765625f, +0.5f,0.765625f, +0.507813f,0.765625f, +0.0f,0.773438f, +0.0078125f,0.773438f, +0.015625f,0.773438f, +0.0234375f,0.773438f, +0.03125f,0.773438f, +0.0390625f,0.773438f, +0.046875f,0.773438f, +0.0546875f,0.773438f, +0.0625f,0.773438f, +0.0703125f,0.773438f, +0.078125f,0.773438f, +0.0859375f,0.773438f, +0.09375f,0.773438f, +0.101563f,0.773438f, +0.109375f,0.773438f, +0.117188f,0.773438f, +0.125f,0.773438f, +0.132813f,0.773438f, +0.140625f,0.773438f, +0.148438f,0.773438f, +0.15625f,0.773438f, +0.164063f,0.773438f, +0.171875f,0.773438f, +0.179688f,0.773438f, +0.1875f,0.773438f, +0.195313f,0.773438f, +0.203125f,0.773438f, +0.210938f,0.773438f, +0.21875f,0.773438f, +0.226563f,0.773438f, +0.234375f,0.773438f, +0.242188f,0.773438f, +0.25f,0.773438f, +0.257813f,0.773438f, +0.265625f,0.773438f, +0.273438f,0.773438f, +0.28125f,0.773438f, +0.289063f,0.773438f, +0.296875f,0.773438f, +0.304688f,0.773438f, +0.3125f,0.773438f, +0.320313f,0.773438f, +0.328125f,0.773438f, +0.335938f,0.773438f, +0.34375f,0.773438f, +0.351563f,0.773438f, +0.359375f,0.773438f, +0.367188f,0.773438f, +0.375f,0.773438f, +0.382813f,0.773438f, +0.390625f,0.773438f, +0.398438f,0.773438f, +0.40625f,0.773438f, +0.414063f,0.773438f, +0.421875f,0.773438f, +0.429688f,0.773438f, +0.4375f,0.773438f, +0.445313f,0.773438f, +0.453125f,0.773438f, +0.460938f,0.773438f, +0.46875f,0.773438f, +0.476563f,0.773438f, +0.484375f,0.773438f, +0.492188f,0.773438f, +0.5f,0.773438f, +0.507813f,0.773438f, +0.0f,0.78125f, +0.0078125f,0.78125f, +0.015625f,0.78125f, +0.0234375f,0.78125f, +0.03125f,0.78125f, +0.0390625f,0.78125f, +0.046875f,0.78125f, +0.0546875f,0.78125f, +0.0625f,0.78125f, +0.0703125f,0.78125f, +0.078125f,0.78125f, +0.0859375f,0.78125f, +0.09375f,0.78125f, +0.101563f,0.78125f, +0.109375f,0.78125f, +0.117188f,0.78125f, +0.125f,0.78125f, +0.132813f,0.78125f, +0.140625f,0.78125f, +0.148438f,0.78125f, +0.15625f,0.78125f, +0.164063f,0.78125f, +0.171875f,0.78125f, +0.179688f,0.78125f, +0.1875f,0.78125f, +0.195313f,0.78125f, +0.203125f,0.78125f, +0.210938f,0.78125f, +0.21875f,0.78125f, +0.226563f,0.78125f, +0.234375f,0.78125f, +0.242188f,0.78125f, +0.25f,0.78125f, +0.257813f,0.78125f, +0.265625f,0.78125f, +0.273438f,0.78125f, +0.28125f,0.78125f, +0.289063f,0.78125f, +0.296875f,0.78125f, +0.304688f,0.78125f, +0.3125f,0.78125f, +0.320313f,0.78125f, +0.328125f,0.78125f, +0.335938f,0.78125f, +0.34375f,0.78125f, +0.351563f,0.78125f, +0.359375f,0.78125f, +0.367188f,0.78125f, +0.375f,0.78125f, +0.382813f,0.78125f, +0.390625f,0.78125f, +0.398438f,0.78125f, +0.40625f,0.78125f, +0.414063f,0.78125f, +0.421875f,0.78125f, +0.429688f,0.78125f, +0.4375f,0.78125f, +0.445313f,0.78125f, +0.453125f,0.78125f, +0.460938f,0.78125f, +0.46875f,0.78125f, +0.476563f,0.78125f, +0.484375f,0.78125f, +0.492188f,0.78125f, +0.5f,0.78125f, +0.507813f,0.78125f, +0.0f,0.789063f, +0.0078125f,0.789063f, +0.015625f,0.789063f, +0.0234375f,0.789063f, +0.03125f,0.789063f, +0.0390625f,0.789063f, +0.046875f,0.789063f, +0.0546875f,0.789063f, +0.0625f,0.789063f, +0.0703125f,0.789063f, +0.078125f,0.789063f, +0.0859375f,0.789063f, +0.09375f,0.789063f, +0.101563f,0.789063f, +0.109375f,0.789063f, +0.117188f,0.789063f, +0.125f,0.789063f, +0.132813f,0.789063f, +0.140625f,0.789063f, +0.148438f,0.789063f, +0.15625f,0.789063f, +0.164063f,0.789063f, +0.171875f,0.789063f, +0.179688f,0.789063f, +0.1875f,0.789063f, +0.195313f,0.789063f, +0.203125f,0.789063f, +0.210938f,0.789063f, +0.21875f,0.789063f, +0.226563f,0.789063f, +0.234375f,0.789063f, +0.242188f,0.789063f, +0.25f,0.789063f, +0.257813f,0.789063f, +0.265625f,0.789063f, +0.273438f,0.789063f, +0.28125f,0.789063f, +0.289063f,0.789063f, +0.296875f,0.789063f, +0.304688f,0.789063f, +0.3125f,0.789063f, +0.320313f,0.789063f, +0.328125f,0.789063f, +0.335938f,0.789063f, +0.34375f,0.789063f, +0.351563f,0.789063f, +0.359375f,0.789063f, +0.367188f,0.789063f, +0.375f,0.789063f, +0.382813f,0.789063f, +0.390625f,0.789063f, +0.398438f,0.789063f, +0.40625f,0.789063f, +0.414063f,0.789063f, +0.421875f,0.789063f, +0.429688f,0.789063f, +0.4375f,0.789063f, +0.445313f,0.789063f, +0.453125f,0.789063f, +0.460938f,0.789063f, +0.46875f,0.789063f, +0.476563f,0.789063f, +0.484375f,0.789063f, +0.492188f,0.789063f, +0.5f,0.789063f, +0.507813f,0.789063f, +0.0f,0.796875f, +0.0078125f,0.796875f, +0.015625f,0.796875f, +0.0234375f,0.796875f, +0.03125f,0.796875f, +0.0390625f,0.796875f, +0.046875f,0.796875f, +0.0546875f,0.796875f, +0.0625f,0.796875f, +0.0703125f,0.796875f, +0.078125f,0.796875f, +0.0859375f,0.796875f, +0.09375f,0.796875f, +0.101563f,0.796875f, +0.109375f,0.796875f, +0.117188f,0.796875f, +0.125f,0.796875f, +0.132813f,0.796875f, +0.140625f,0.796875f, +0.148438f,0.796875f, +0.15625f,0.796875f, +0.164063f,0.796875f, +0.171875f,0.796875f, +0.179688f,0.796875f, +0.1875f,0.796875f, +0.195313f,0.796875f, +0.203125f,0.796875f, +0.210938f,0.796875f, +0.21875f,0.796875f, +0.226563f,0.796875f, +0.234375f,0.796875f, +0.242188f,0.796875f, +0.25f,0.796875f, +0.257813f,0.796875f, +0.265625f,0.796875f, +0.273438f,0.796875f, +0.28125f,0.796875f, +0.289063f,0.796875f, +0.296875f,0.796875f, +0.304688f,0.796875f, +0.3125f,0.796875f, +0.320313f,0.796875f, +0.328125f,0.796875f, +0.335938f,0.796875f, +0.34375f,0.796875f, +0.351563f,0.796875f, +0.359375f,0.796875f, +0.367188f,0.796875f, +0.375f,0.796875f, +0.382813f,0.796875f, +0.390625f,0.796875f, +0.398438f,0.796875f, +0.40625f,0.796875f, +0.414063f,0.796875f, +0.421875f,0.796875f, +0.429688f,0.796875f, +0.4375f,0.796875f, +0.445313f,0.796875f, +0.453125f,0.796875f, +0.460938f,0.796875f, +0.46875f,0.796875f, +0.476563f,0.796875f, +0.484375f,0.796875f, +0.492188f,0.796875f, +0.5f,0.796875f, +0.507813f,0.796875f, +0.0f,0.804688f, +0.0078125f,0.804688f, +0.015625f,0.804688f, +0.0234375f,0.804688f, +0.03125f,0.804688f, +0.0390625f,0.804688f, +0.046875f,0.804688f, +0.0546875f,0.804688f, +0.0625f,0.804688f, +0.0703125f,0.804688f, +0.078125f,0.804688f, +0.0859375f,0.804688f, +0.09375f,0.804688f, +0.101563f,0.804688f, +0.109375f,0.804688f, +0.117188f,0.804688f, +0.125f,0.804688f, +0.132813f,0.804688f, +0.140625f,0.804688f, +0.148438f,0.804688f, +0.15625f,0.804688f, +0.164063f,0.804688f, +0.171875f,0.804688f, +0.179688f,0.804688f, +0.1875f,0.804688f, +0.195313f,0.804688f, +0.203125f,0.804688f, +0.210938f,0.804688f, +0.21875f,0.804688f, +0.226563f,0.804688f, +0.234375f,0.804688f, +0.242188f,0.804688f, +0.25f,0.804688f, +0.257813f,0.804688f, +0.265625f,0.804688f, +0.273438f,0.804688f, +0.28125f,0.804688f, +0.289063f,0.804688f, +0.296875f,0.804688f, +0.304688f,0.804688f, +0.3125f,0.804688f, +0.320313f,0.804688f, +0.328125f,0.804688f, +0.335938f,0.804688f, +0.34375f,0.804688f, +0.351563f,0.804688f, +0.359375f,0.804688f, +0.367188f,0.804688f, +0.375f,0.804688f, +0.382813f,0.804688f, +0.390625f,0.804688f, +0.398438f,0.804688f, +0.40625f,0.804688f, +0.414063f,0.804688f, +0.421875f,0.804688f, +0.429688f,0.804688f, +0.4375f,0.804688f, +0.445313f,0.804688f, +0.453125f,0.804688f, +0.460938f,0.804688f, +0.46875f,0.804688f, +0.476563f,0.804688f, +0.484375f,0.804688f, +0.492188f,0.804688f, +0.5f,0.804688f, +0.507813f,0.804688f, +0.0f,0.8125f, +0.0078125f,0.8125f, +0.015625f,0.8125f, +0.0234375f,0.8125f, +0.03125f,0.8125f, +0.0390625f,0.8125f, +0.046875f,0.8125f, +0.0546875f,0.8125f, +0.0625f,0.8125f, +0.0703125f,0.8125f, +0.078125f,0.8125f, +0.0859375f,0.8125f, +0.09375f,0.8125f, +0.101563f,0.8125f, +0.109375f,0.8125f, +0.117188f,0.8125f, +0.125f,0.8125f, +0.132813f,0.8125f, +0.140625f,0.8125f, +0.148438f,0.8125f, +0.15625f,0.8125f, +0.164063f,0.8125f, +0.171875f,0.8125f, +0.179688f,0.8125f, +0.1875f,0.8125f, +0.195313f,0.8125f, +0.203125f,0.8125f, +0.210938f,0.8125f, +0.21875f,0.8125f, +0.226563f,0.8125f, +0.234375f,0.8125f, +0.242188f,0.8125f, +0.25f,0.8125f, +0.257813f,0.8125f, +0.265625f,0.8125f, +0.273438f,0.8125f, +0.28125f,0.8125f, +0.289063f,0.8125f, +0.296875f,0.8125f, +0.304688f,0.8125f, +0.3125f,0.8125f, +0.320313f,0.8125f, +0.328125f,0.8125f, +0.335938f,0.8125f, +0.34375f,0.8125f, +0.351563f,0.8125f, +0.359375f,0.8125f, +0.367188f,0.8125f, +0.375f,0.8125f, +0.382813f,0.8125f, +0.390625f,0.8125f, +0.398438f,0.8125f, +0.40625f,0.8125f, +0.414063f,0.8125f, +0.421875f,0.8125f, +0.429688f,0.8125f, +0.4375f,0.8125f, +0.445313f,0.8125f, +0.453125f,0.8125f, +0.460938f,0.8125f, +0.46875f,0.8125f, +0.476563f,0.8125f, +0.484375f,0.8125f, +0.492188f,0.8125f, +0.5f,0.8125f, +0.507813f,0.8125f, +0.0f,0.820313f, +0.0078125f,0.820313f, +0.015625f,0.820313f, +0.0234375f,0.820313f, +0.03125f,0.820313f, +0.0390625f,0.820313f, +0.046875f,0.820313f, +0.0546875f,0.820313f, +0.0625f,0.820313f, +0.0703125f,0.820313f, +0.078125f,0.820313f, +0.0859375f,0.820313f, +0.09375f,0.820313f, +0.101563f,0.820313f, +0.109375f,0.820313f, +0.117188f,0.820313f, +0.125f,0.820313f, +0.132813f,0.820313f, +0.140625f,0.820313f, +0.148438f,0.820313f, +0.15625f,0.820313f, +0.164063f,0.820313f, +0.171875f,0.820313f, +0.179688f,0.820313f, +0.1875f,0.820313f, +0.195313f,0.820313f, +0.203125f,0.820313f, +0.210938f,0.820313f, +0.21875f,0.820313f, +0.226563f,0.820313f, +0.234375f,0.820313f, +0.242188f,0.820313f, +0.25f,0.820313f, +0.257813f,0.820313f, +0.265625f,0.820313f, +0.273438f,0.820313f, +0.28125f,0.820313f, +0.289063f,0.820313f, +0.296875f,0.820313f, +0.304688f,0.820313f, +0.3125f,0.820313f, +0.320313f,0.820313f, +0.328125f,0.820313f, +0.335938f,0.820313f, +0.34375f,0.820313f, +0.351563f,0.820313f, +0.359375f,0.820313f, +0.367188f,0.820313f, +0.375f,0.820313f, +0.382813f,0.820313f, +0.390625f,0.820313f, +0.398438f,0.820313f, +0.40625f,0.820313f, +0.414063f,0.820313f, +0.421875f,0.820313f, +0.429688f,0.820313f, +0.4375f,0.820313f, +0.445313f,0.820313f, +0.453125f,0.820313f, +0.460938f,0.820313f, +0.46875f,0.820313f, +0.476563f,0.820313f, +0.484375f,0.820313f, +0.492188f,0.820313f, +0.5f,0.820313f, +0.507813f,0.820313f, +0.0f,0.828125f, +0.0078125f,0.828125f, +0.015625f,0.828125f, +0.0234375f,0.828125f, +0.03125f,0.828125f, +0.0390625f,0.828125f, +0.046875f,0.828125f, +0.0546875f,0.828125f, +0.0625f,0.828125f, +0.0703125f,0.828125f, +0.078125f,0.828125f, +0.0859375f,0.828125f, +0.09375f,0.828125f, +0.101563f,0.828125f, +0.109375f,0.828125f, +0.117188f,0.828125f, +0.125f,0.828125f, +0.132813f,0.828125f, +0.140625f,0.828125f, +0.148438f,0.828125f, +0.15625f,0.828125f, +0.164063f,0.828125f, +0.171875f,0.828125f, +0.179688f,0.828125f, +0.1875f,0.828125f, +0.195313f,0.828125f, +0.203125f,0.828125f, +0.210938f,0.828125f, +0.21875f,0.828125f, +0.226563f,0.828125f, +0.234375f,0.828125f, +0.242188f,0.828125f, +0.25f,0.828125f, +0.257813f,0.828125f, +0.265625f,0.828125f, +0.273438f,0.828125f, +0.28125f,0.828125f, +0.289063f,0.828125f, +0.296875f,0.828125f, +0.304688f,0.828125f, +0.3125f,0.828125f, +0.320313f,0.828125f, +0.328125f,0.828125f, +0.335938f,0.828125f, +0.34375f,0.828125f, +0.351563f,0.828125f, +0.359375f,0.828125f, +0.367188f,0.828125f, +0.375f,0.828125f, +0.382813f,0.828125f, +0.390625f,0.828125f, +0.398438f,0.828125f, +0.40625f,0.828125f, +0.414063f,0.828125f, +0.421875f,0.828125f, +0.429688f,0.828125f, +0.4375f,0.828125f, +0.445313f,0.828125f, +0.453125f,0.828125f, +0.460938f,0.828125f, +0.46875f,0.828125f, +0.476563f,0.828125f, +0.484375f,0.828125f, +0.492188f,0.828125f, +0.5f,0.828125f, +0.507813f,0.828125f, +0.0f,0.835938f, +0.0078125f,0.835938f, +0.015625f,0.835938f, +0.0234375f,0.835938f, +0.03125f,0.835938f, +0.0390625f,0.835938f, +0.046875f,0.835938f, +0.0546875f,0.835938f, +0.0625f,0.835938f, +0.0703125f,0.835938f, +0.078125f,0.835938f, +0.0859375f,0.835938f, +0.09375f,0.835938f, +0.101563f,0.835938f, +0.109375f,0.835938f, +0.117188f,0.835938f, +0.125f,0.835938f, +0.132813f,0.835938f, +0.140625f,0.835938f, +0.148438f,0.835938f, +0.15625f,0.835938f, +0.164063f,0.835938f, +0.171875f,0.835938f, +0.179688f,0.835938f, +0.1875f,0.835938f, +0.195313f,0.835938f, +0.203125f,0.835938f, +0.210938f,0.835938f, +0.21875f,0.835938f, +0.226563f,0.835938f, +0.234375f,0.835938f, +0.242188f,0.835938f, +0.25f,0.835938f, +0.257813f,0.835938f, +0.265625f,0.835938f, +0.273438f,0.835938f, +0.28125f,0.835938f, +0.289063f,0.835938f, +0.296875f,0.835938f, +0.304688f,0.835938f, +0.3125f,0.835938f, +0.320313f,0.835938f, +0.328125f,0.835938f, +0.335938f,0.835938f, +0.34375f,0.835938f, +0.351563f,0.835938f, +0.359375f,0.835938f, +0.367188f,0.835938f, +0.375f,0.835938f, +0.382813f,0.835938f, +0.390625f,0.835938f, +0.398438f,0.835938f, +0.40625f,0.835938f, +0.414063f,0.835938f, +0.421875f,0.835938f, +0.429688f,0.835938f, +0.4375f,0.835938f, +0.445313f,0.835938f, +0.453125f,0.835938f, +0.460938f,0.835938f, +0.46875f,0.835938f, +0.476563f,0.835938f, +0.484375f,0.835938f, +0.492188f,0.835938f, +0.5f,0.835938f, +0.507813f,0.835938f, +0.0f,0.84375f, +0.0078125f,0.84375f, +0.015625f,0.84375f, +0.0234375f,0.84375f, +0.03125f,0.84375f, +0.0390625f,0.84375f, +0.046875f,0.84375f, +0.0546875f,0.84375f, +0.0625f,0.84375f, +0.0703125f,0.84375f, +0.078125f,0.84375f, +0.0859375f,0.84375f, +0.09375f,0.84375f, +0.101563f,0.84375f, +0.109375f,0.84375f, +0.117188f,0.84375f, +0.125f,0.84375f, +0.132813f,0.84375f, +0.140625f,0.84375f, +0.148438f,0.84375f, +0.15625f,0.84375f, +0.164063f,0.84375f, +0.171875f,0.84375f, +0.179688f,0.84375f, +0.1875f,0.84375f, +0.195313f,0.84375f, +0.203125f,0.84375f, +0.210938f,0.84375f, +0.21875f,0.84375f, +0.226563f,0.84375f, +0.234375f,0.84375f, +0.242188f,0.84375f, +0.25f,0.84375f, +0.257813f,0.84375f, +0.265625f,0.84375f, +0.273438f,0.84375f, +0.28125f,0.84375f, +0.289063f,0.84375f, +0.296875f,0.84375f, +0.304688f,0.84375f, +0.3125f,0.84375f, +0.320313f,0.84375f, +0.328125f,0.84375f, +0.335938f,0.84375f, +0.34375f,0.84375f, +0.351563f,0.84375f, +0.359375f,0.84375f, +0.367188f,0.84375f, +0.375f,0.84375f, +0.382813f,0.84375f, +0.390625f,0.84375f, +0.398438f,0.84375f, +0.40625f,0.84375f, +0.414063f,0.84375f, +0.421875f,0.84375f, +0.429688f,0.84375f, +0.4375f,0.84375f, +0.445313f,0.84375f, +0.453125f,0.84375f, +0.460938f,0.84375f, +0.46875f,0.84375f, +0.476563f,0.84375f, +0.484375f,0.84375f, +0.492188f,0.84375f, +0.5f,0.84375f, +0.507813f,0.84375f, +0.0f,0.851563f, +0.0078125f,0.851563f, +0.015625f,0.851563f, +0.0234375f,0.851563f, +0.03125f,0.851563f, +0.0390625f,0.851563f, +0.046875f,0.851563f, +0.0546875f,0.851563f, +0.0625f,0.851563f, +0.0703125f,0.851563f, +0.078125f,0.851563f, +0.0859375f,0.851563f, +0.09375f,0.851563f, +0.101563f,0.851563f, +0.109375f,0.851563f, +0.117188f,0.851563f, +0.125f,0.851563f, +0.132813f,0.851563f, +0.140625f,0.851563f, +0.148438f,0.851563f, +0.15625f,0.851563f, +0.164063f,0.851563f, +0.171875f,0.851563f, +0.179688f,0.851563f, +0.1875f,0.851563f, +0.195313f,0.851563f, +0.203125f,0.851563f, +0.210938f,0.851563f, +0.21875f,0.851563f, +0.226563f,0.851563f, +0.234375f,0.851563f, +0.242188f,0.851563f, +0.25f,0.851563f, +0.257813f,0.851563f, +0.265625f,0.851563f, +0.273438f,0.851563f, +0.28125f,0.851563f, +0.289063f,0.851563f, +0.296875f,0.851563f, +0.304688f,0.851563f, +0.3125f,0.851563f, +0.320313f,0.851563f, +0.328125f,0.851563f, +0.335938f,0.851563f, +0.34375f,0.851563f, +0.351563f,0.851563f, +0.359375f,0.851563f, +0.367188f,0.851563f, +0.375f,0.851563f, +0.382813f,0.851563f, +0.390625f,0.851563f, +0.398438f,0.851563f, +0.40625f,0.851563f, +0.414063f,0.851563f, +0.421875f,0.851563f, +0.429688f,0.851563f, +0.4375f,0.851563f, +0.445313f,0.851563f, +0.453125f,0.851563f, +0.460938f,0.851563f, +0.46875f,0.851563f, +0.476563f,0.851563f, +0.484375f,0.851563f, +0.492188f,0.851563f, +0.5f,0.851563f, +0.507813f,0.851563f, +0.0f,0.859375f, +0.0078125f,0.859375f, +0.015625f,0.859375f, +0.0234375f,0.859375f, +0.03125f,0.859375f, +0.0390625f,0.859375f, +0.046875f,0.859375f, +0.0546875f,0.859375f, +0.0625f,0.859375f, +0.0703125f,0.859375f, +0.078125f,0.859375f, +0.0859375f,0.859375f, +0.09375f,0.859375f, +0.101563f,0.859375f, +0.109375f,0.859375f, +0.117188f,0.859375f, +0.125f,0.859375f, +0.132813f,0.859375f, +0.140625f,0.859375f, +0.148438f,0.859375f, +0.15625f,0.859375f, +0.164063f,0.859375f, +0.171875f,0.859375f, +0.179688f,0.859375f, +0.1875f,0.859375f, +0.195313f,0.859375f, +0.203125f,0.859375f, +0.210938f,0.859375f, +0.21875f,0.859375f, +0.226563f,0.859375f, +0.234375f,0.859375f, +0.242188f,0.859375f, +0.25f,0.859375f, +0.257813f,0.859375f, +0.265625f,0.859375f, +0.273438f,0.859375f, +0.28125f,0.859375f, +0.289063f,0.859375f, +0.296875f,0.859375f, +0.304688f,0.859375f, +0.3125f,0.859375f, +0.320313f,0.859375f, +0.328125f,0.859375f, +0.335938f,0.859375f, +0.34375f,0.859375f, +0.351563f,0.859375f, +0.359375f,0.859375f, +0.367188f,0.859375f, +0.375f,0.859375f, +0.382813f,0.859375f, +0.390625f,0.859375f, +0.398438f,0.859375f, +0.40625f,0.859375f, +0.414063f,0.859375f, +0.421875f,0.859375f, +0.429688f,0.859375f, +0.4375f,0.859375f, +0.445313f,0.859375f, +0.453125f,0.859375f, +0.460938f,0.859375f, +0.46875f,0.859375f, +0.476563f,0.859375f, +0.484375f,0.859375f, +0.492188f,0.859375f, +0.5f,0.859375f, +0.507813f,0.859375f, +0.0f,0.867188f, +0.0078125f,0.867188f, +0.015625f,0.867188f, +0.0234375f,0.867188f, +0.03125f,0.867188f, +0.0390625f,0.867188f, +0.046875f,0.867188f, +0.0546875f,0.867188f, +0.0625f,0.867188f, +0.0703125f,0.867188f, +0.078125f,0.867188f, +0.0859375f,0.867188f, +0.09375f,0.867188f, +0.101563f,0.867188f, +0.109375f,0.867188f, +0.117188f,0.867188f, +0.125f,0.867188f, +0.132813f,0.867188f, +0.140625f,0.867188f, +0.148438f,0.867188f, +0.15625f,0.867188f, +0.164063f,0.867188f, +0.171875f,0.867188f, +0.179688f,0.867188f, +0.1875f,0.867188f, +0.195313f,0.867188f, +0.203125f,0.867188f, +0.210938f,0.867188f, +0.21875f,0.867188f, +0.226563f,0.867188f, +0.234375f,0.867188f, +0.242188f,0.867188f, +0.25f,0.867188f, +0.257813f,0.867188f, +0.265625f,0.867188f, +0.273438f,0.867188f, +0.28125f,0.867188f, +0.289063f,0.867188f, +0.296875f,0.867188f, +0.304688f,0.867188f, +0.3125f,0.867188f, +0.320313f,0.867188f, +0.328125f,0.867188f, +0.335938f,0.867188f, +0.34375f,0.867188f, +0.351563f,0.867188f, +0.359375f,0.867188f, +0.367188f,0.867188f, +0.375f,0.867188f, +0.382813f,0.867188f, +0.390625f,0.867188f, +0.398438f,0.867188f, +0.40625f,0.867188f, +0.414063f,0.867188f, +0.421875f,0.867188f, +0.429688f,0.867188f, +0.4375f,0.867188f, +0.445313f,0.867188f, +0.453125f,0.867188f, +0.460938f,0.867188f, +0.46875f,0.867188f, +0.476563f,0.867188f, +0.484375f,0.867188f, +0.492188f,0.867188f, +0.5f,0.867188f, +0.507813f,0.867188f, +0.0f,0.875f, +0.0078125f,0.875f, +0.015625f,0.875f, +0.0234375f,0.875f, +0.03125f,0.875f, +0.0390625f,0.875f, +0.046875f,0.875f, +0.0546875f,0.875f, +0.0625f,0.875f, +0.0703125f,0.875f, +0.078125f,0.875f, +0.0859375f,0.875f, +0.09375f,0.875f, +0.101563f,0.875f, +0.109375f,0.875f, +0.117188f,0.875f, +0.125f,0.875f, +0.132813f,0.875f, +0.140625f,0.875f, +0.148438f,0.875f, +0.15625f,0.875f, +0.164063f,0.875f, +0.171875f,0.875f, +0.179688f,0.875f, +0.1875f,0.875f, +0.195313f,0.875f, +0.203125f,0.875f, +0.210938f,0.875f, +0.21875f,0.875f, +0.226563f,0.875f, +0.234375f,0.875f, +0.242188f,0.875f, +0.25f,0.875f, +0.257813f,0.875f, +0.265625f,0.875f, +0.273438f,0.875f, +0.28125f,0.875f, +0.289063f,0.875f, +0.296875f,0.875f, +0.304688f,0.875f, +0.3125f,0.875f, +0.320313f,0.875f, +0.328125f,0.875f, +0.335938f,0.875f, +0.34375f,0.875f, +0.351563f,0.875f, +0.359375f,0.875f, +0.367188f,0.875f, +0.375f,0.875f, +0.382813f,0.875f, +0.390625f,0.875f, +0.398438f,0.875f, +0.40625f,0.875f, +0.414063f,0.875f, +0.421875f,0.875f, +0.429688f,0.875f, +0.4375f,0.875f, +0.445313f,0.875f, +0.453125f,0.875f, +0.460938f,0.875f, +0.46875f,0.875f, +0.476563f,0.875f, +0.484375f,0.875f, +0.492188f,0.875f, +0.5f,0.875f, +0.507813f,0.875f, +0.0f,0.882813f, +0.0078125f,0.882813f, +0.015625f,0.882813f, +0.0234375f,0.882813f, +0.03125f,0.882813f, +0.0390625f,0.882813f, +0.046875f,0.882813f, +0.0546875f,0.882813f, +0.0625f,0.882813f, +0.0703125f,0.882813f, +0.078125f,0.882813f, +0.0859375f,0.882813f, +0.09375f,0.882813f, +0.101563f,0.882813f, +0.109375f,0.882813f, +0.117188f,0.882813f, +0.125f,0.882813f, +0.132813f,0.882813f, +0.140625f,0.882813f, +0.148438f,0.882813f, +0.15625f,0.882813f, +0.164063f,0.882813f, +0.171875f,0.882813f, +0.179688f,0.882813f, +0.1875f,0.882813f, +0.195313f,0.882813f, +0.203125f,0.882813f, +0.210938f,0.882813f, +0.21875f,0.882813f, +0.226563f,0.882813f, +0.234375f,0.882813f, +0.242188f,0.882813f, +0.25f,0.882813f, +0.257813f,0.882813f, +0.265625f,0.882813f, +0.273438f,0.882813f, +0.28125f,0.882813f, +0.289063f,0.882813f, +0.296875f,0.882813f, +0.304688f,0.882813f, +0.3125f,0.882813f, +0.320313f,0.882813f, +0.328125f,0.882813f, +0.335938f,0.882813f, +0.34375f,0.882813f, +0.351563f,0.882813f, +0.359375f,0.882813f, +0.367188f,0.882813f, +0.375f,0.882813f, +0.382813f,0.882813f, +0.390625f,0.882813f, +0.398438f,0.882813f, +0.40625f,0.882813f, +0.414063f,0.882813f, +0.421875f,0.882813f, +0.429688f,0.882813f, +0.4375f,0.882813f, +0.445313f,0.882813f, +0.453125f,0.882813f, +0.460938f,0.882813f, +0.46875f,0.882813f, +0.476563f,0.882813f, +0.484375f,0.882813f, +0.492188f,0.882813f, +0.5f,0.882813f, +0.507813f,0.882813f, +0.0f,0.890625f, +0.0078125f,0.890625f, +0.015625f,0.890625f, +0.0234375f,0.890625f, +0.03125f,0.890625f, +0.0390625f,0.890625f, +0.046875f,0.890625f, +0.0546875f,0.890625f, +0.0625f,0.890625f, +0.0703125f,0.890625f, +0.078125f,0.890625f, +0.0859375f,0.890625f, +0.09375f,0.890625f, +0.101563f,0.890625f, +0.109375f,0.890625f, +0.117188f,0.890625f, +0.125f,0.890625f, +0.132813f,0.890625f, +0.140625f,0.890625f, +0.148438f,0.890625f, +0.15625f,0.890625f, +0.164063f,0.890625f, +0.171875f,0.890625f, +0.179688f,0.890625f, +0.1875f,0.890625f, +0.195313f,0.890625f, +0.203125f,0.890625f, +0.210938f,0.890625f, +0.21875f,0.890625f, +0.226563f,0.890625f, +0.234375f,0.890625f, +0.242188f,0.890625f, +0.25f,0.890625f, +0.257813f,0.890625f, +0.265625f,0.890625f, +0.273438f,0.890625f, +0.28125f,0.890625f, +0.289063f,0.890625f, +0.296875f,0.890625f, +0.304688f,0.890625f, +0.3125f,0.890625f, +0.320313f,0.890625f, +0.328125f,0.890625f, +0.335938f,0.890625f, +0.34375f,0.890625f, +0.351563f,0.890625f, +0.359375f,0.890625f, +0.367188f,0.890625f, +0.375f,0.890625f, +0.382813f,0.890625f, +0.390625f,0.890625f, +0.398438f,0.890625f, +0.40625f,0.890625f, +0.414063f,0.890625f, +0.421875f,0.890625f, +0.429688f,0.890625f, +0.4375f,0.890625f, +0.445313f,0.890625f, +0.453125f,0.890625f, +0.460938f,0.890625f, +0.46875f,0.890625f, +0.476563f,0.890625f, +0.484375f,0.890625f, +0.492188f,0.890625f, +0.5f,0.890625f, +0.507813f,0.890625f, +0.0f,0.898438f, +0.0078125f,0.898438f, +0.015625f,0.898438f, +0.0234375f,0.898438f, +0.03125f,0.898438f, +0.0390625f,0.898438f, +0.046875f,0.898438f, +0.0546875f,0.898438f, +0.0625f,0.898438f, +0.0703125f,0.898438f, +0.078125f,0.898438f, +0.0859375f,0.898438f, +0.09375f,0.898438f, +0.101563f,0.898438f, +0.109375f,0.898438f, +0.117188f,0.898438f, +0.125f,0.898438f, +0.132813f,0.898438f, +0.140625f,0.898438f, +0.148438f,0.898438f, +0.15625f,0.898438f, +0.164063f,0.898438f, +0.171875f,0.898438f, +0.179688f,0.898438f, +0.1875f,0.898438f, +0.195313f,0.898438f, +0.203125f,0.898438f, +0.210938f,0.898438f, +0.21875f,0.898438f, +0.226563f,0.898438f, +0.234375f,0.898438f, +0.242188f,0.898438f, +0.25f,0.898438f, +0.257813f,0.898438f, +0.265625f,0.898438f, +0.273438f,0.898438f, +0.28125f,0.898438f, +0.289063f,0.898438f, +0.296875f,0.898438f, +0.304688f,0.898438f, +0.3125f,0.898438f, +0.320313f,0.898438f, +0.328125f,0.898438f, +0.335938f,0.898438f, +0.34375f,0.898438f, +0.351563f,0.898438f, +0.359375f,0.898438f, +0.367188f,0.898438f, +0.375f,0.898438f, +0.382813f,0.898438f, +0.390625f,0.898438f, +0.398438f,0.898438f, +0.40625f,0.898438f, +0.414063f,0.898438f, +0.421875f,0.898438f, +0.429688f,0.898438f, +0.4375f,0.898438f, +0.445313f,0.898438f, +0.453125f,0.898438f, +0.460938f,0.898438f, +0.46875f,0.898438f, +0.476563f,0.898438f, +0.484375f,0.898438f, +0.492188f,0.898438f, +0.5f,0.898438f, +0.507813f,0.898438f, +0.0f,0.90625f, +0.0078125f,0.90625f, +0.015625f,0.90625f, +0.0234375f,0.90625f, +0.03125f,0.90625f, +0.0390625f,0.90625f, +0.046875f,0.90625f, +0.0546875f,0.90625f, +0.0625f,0.90625f, +0.0703125f,0.90625f, +0.078125f,0.90625f, +0.0859375f,0.90625f, +0.09375f,0.90625f, +0.101563f,0.90625f, +0.109375f,0.90625f, +0.117188f,0.90625f, +0.125f,0.90625f, +0.132813f,0.90625f, +0.140625f,0.90625f, +0.148438f,0.90625f, +0.15625f,0.90625f, +0.164063f,0.90625f, +0.171875f,0.90625f, +0.179688f,0.90625f, +0.1875f,0.90625f, +0.195313f,0.90625f, +0.203125f,0.90625f, +0.210938f,0.90625f, +0.21875f,0.90625f, +0.226563f,0.90625f, +0.234375f,0.90625f, +0.242188f,0.90625f, +0.25f,0.90625f, +0.257813f,0.90625f, +0.265625f,0.90625f, +0.273438f,0.90625f, +0.28125f,0.90625f, +0.289063f,0.90625f, +0.296875f,0.90625f, +0.304688f,0.90625f, +0.3125f,0.90625f, +0.320313f,0.90625f, +0.328125f,0.90625f, +0.335938f,0.90625f, +0.34375f,0.90625f, +0.351563f,0.90625f, +0.359375f,0.90625f, +0.367188f,0.90625f, +0.375f,0.90625f, +0.382813f,0.90625f, +0.390625f,0.90625f, +0.398438f,0.90625f, +0.40625f,0.90625f, +0.414063f,0.90625f, +0.421875f,0.90625f, +0.429688f,0.90625f, +0.4375f,0.90625f, +0.445313f,0.90625f, +0.453125f,0.90625f, +0.460938f,0.90625f, +0.46875f,0.90625f, +0.476563f,0.90625f, +0.484375f,0.90625f, +0.492188f,0.90625f, +0.5f,0.90625f, +0.507813f,0.90625f, +0.0f,0.914063f, +0.0078125f,0.914063f, +0.015625f,0.914063f, +0.0234375f,0.914063f, +0.03125f,0.914063f, +0.0390625f,0.914063f, +0.046875f,0.914063f, +0.0546875f,0.914063f, +0.0625f,0.914063f, +0.0703125f,0.914063f, +0.078125f,0.914063f, +0.0859375f,0.914063f, +0.09375f,0.914063f, +0.101563f,0.914063f, +0.109375f,0.914063f, +0.117188f,0.914063f, +0.125f,0.914063f, +0.132813f,0.914063f, +0.140625f,0.914063f, +0.148438f,0.914063f, +0.15625f,0.914063f, +0.164063f,0.914063f, +0.171875f,0.914063f, +0.179688f,0.914063f, +0.1875f,0.914063f, +0.195313f,0.914063f, +0.203125f,0.914063f, +0.210938f,0.914063f, +0.21875f,0.914063f, +0.226563f,0.914063f, +0.234375f,0.914063f, +0.242188f,0.914063f, +0.25f,0.914063f, +0.257813f,0.914063f, +0.265625f,0.914063f, +0.273438f,0.914063f, +0.28125f,0.914063f, +0.289063f,0.914063f, +0.296875f,0.914063f, +0.304688f,0.914063f, +0.3125f,0.914063f, +0.320313f,0.914063f, +0.328125f,0.914063f, +0.335938f,0.914063f, +0.34375f,0.914063f, +0.351563f,0.914063f, +0.359375f,0.914063f, +0.367188f,0.914063f, +0.375f,0.914063f, +0.382813f,0.914063f, +0.390625f,0.914063f, +0.398438f,0.914063f, +0.40625f,0.914063f, +0.414063f,0.914063f, +0.421875f,0.914063f, +0.429688f,0.914063f, +0.4375f,0.914063f, +0.445313f,0.914063f, +0.453125f,0.914063f, +0.460938f,0.914063f, +0.46875f,0.914063f, +0.476563f,0.914063f, +0.484375f,0.914063f, +0.492188f,0.914063f, +0.5f,0.914063f, +0.507813f,0.914063f, +0.0f,0.921875f, +0.0078125f,0.921875f, +0.015625f,0.921875f, +0.0234375f,0.921875f, +0.03125f,0.921875f, +0.0390625f,0.921875f, +0.046875f,0.921875f, +0.0546875f,0.921875f, +0.0625f,0.921875f, +0.0703125f,0.921875f, +0.078125f,0.921875f, +0.0859375f,0.921875f, +0.09375f,0.921875f, +0.101563f,0.921875f, +0.109375f,0.921875f, +0.117188f,0.921875f, +0.125f,0.921875f, +0.132813f,0.921875f, +0.140625f,0.921875f, +0.148438f,0.921875f, +0.15625f,0.921875f, +0.164063f,0.921875f, +0.171875f,0.921875f, +0.179688f,0.921875f, +0.1875f,0.921875f, +0.195313f,0.921875f, +0.203125f,0.921875f, +0.210938f,0.921875f, +0.21875f,0.921875f, +0.226563f,0.921875f, +0.234375f,0.921875f, +0.242188f,0.921875f, +0.25f,0.921875f, +0.257813f,0.921875f, +0.265625f,0.921875f, +0.273438f,0.921875f, +0.28125f,0.921875f, +0.289063f,0.921875f, +0.296875f,0.921875f, +0.304688f,0.921875f, +0.3125f,0.921875f, +0.320313f,0.921875f, +0.328125f,0.921875f, +0.335938f,0.921875f, +0.34375f,0.921875f, +0.351563f,0.921875f, +0.359375f,0.921875f, +0.367188f,0.921875f, +0.375f,0.921875f, +0.382813f,0.921875f, +0.390625f,0.921875f, +0.398438f,0.921875f, +0.40625f,0.921875f, +0.414063f,0.921875f, +0.421875f,0.921875f, +0.429688f,0.921875f, +0.4375f,0.921875f, +0.445313f,0.921875f, +0.453125f,0.921875f, +0.460938f,0.921875f, +0.46875f,0.921875f, +0.476563f,0.921875f, +0.484375f,0.921875f, +0.492188f,0.921875f, +0.5f,0.921875f, +0.507813f,0.921875f, +0.0f,0.929688f, +0.0078125f,0.929688f, +0.015625f,0.929688f, +0.0234375f,0.929688f, +0.03125f,0.929688f, +0.0390625f,0.929688f, +0.046875f,0.929688f, +0.0546875f,0.929688f, +0.0625f,0.929688f, +0.0703125f,0.929688f, +0.078125f,0.929688f, +0.0859375f,0.929688f, +0.09375f,0.929688f, +0.101563f,0.929688f, +0.109375f,0.929688f, +0.117188f,0.929688f, +0.125f,0.929688f, +0.132813f,0.929688f, +0.140625f,0.929688f, +0.148438f,0.929688f, +0.15625f,0.929688f, +0.164063f,0.929688f, +0.171875f,0.929688f, +0.179688f,0.929688f, +0.1875f,0.929688f, +0.195313f,0.929688f, +0.203125f,0.929688f, +0.210938f,0.929688f, +0.21875f,0.929688f, +0.226563f,0.929688f, +0.234375f,0.929688f, +0.242188f,0.929688f, +0.25f,0.929688f, +0.257813f,0.929688f, +0.265625f,0.929688f, +0.273438f,0.929688f, +0.28125f,0.929688f, +0.289063f,0.929688f, +0.296875f,0.929688f, +0.304688f,0.929688f, +0.3125f,0.929688f, +0.320313f,0.929688f, +0.328125f,0.929688f, +0.335938f,0.929688f, +0.34375f,0.929688f, +0.351563f,0.929688f, +0.359375f,0.929688f, +0.367188f,0.929688f, +0.375f,0.929688f, +0.382813f,0.929688f, +0.390625f,0.929688f, +0.398438f,0.929688f, +0.40625f,0.929688f, +0.414063f,0.929688f, +0.421875f,0.929688f, +0.429688f,0.929688f, +0.4375f,0.929688f, +0.445313f,0.929688f, +0.453125f,0.929688f, +0.460938f,0.929688f, +0.46875f,0.929688f, +0.476563f,0.929688f, +0.484375f,0.929688f, +0.492188f,0.929688f, +0.5f,0.929688f, +0.507813f,0.929688f, +0.0f,0.9375f, +0.0078125f,0.9375f, +0.015625f,0.9375f, +0.0234375f,0.9375f, +0.03125f,0.9375f, +0.0390625f,0.9375f, +0.046875f,0.9375f, +0.0546875f,0.9375f, +0.0625f,0.9375f, +0.0703125f,0.9375f, +0.078125f,0.9375f, +0.0859375f,0.9375f, +0.09375f,0.9375f, +0.101563f,0.9375f, +0.109375f,0.9375f, +0.117188f,0.9375f, +0.125f,0.9375f, +0.132813f,0.9375f, +0.140625f,0.9375f, +0.148438f,0.9375f, +0.15625f,0.9375f, +0.164063f,0.9375f, +0.171875f,0.9375f, +0.179688f,0.9375f, +0.1875f,0.9375f, +0.195313f,0.9375f, +0.203125f,0.9375f, +0.210938f,0.9375f, +0.21875f,0.9375f, +0.226563f,0.9375f, +0.234375f,0.9375f, +0.242188f,0.9375f, +0.25f,0.9375f, +0.257813f,0.9375f, +0.265625f,0.9375f, +0.273438f,0.9375f, +0.28125f,0.9375f, +0.289063f,0.9375f, +0.296875f,0.9375f, +0.304688f,0.9375f, +0.3125f,0.9375f, +0.320313f,0.9375f, +0.328125f,0.9375f, +0.335938f,0.9375f, +0.34375f,0.9375f, +0.351563f,0.9375f, +0.359375f,0.9375f, +0.367188f,0.9375f, +0.375f,0.9375f, +0.382813f,0.9375f, +0.390625f,0.9375f, +0.398438f,0.9375f, +0.40625f,0.9375f, +0.414063f,0.9375f, +0.421875f,0.9375f, +0.429688f,0.9375f, +0.4375f,0.9375f, +0.445313f,0.9375f, +0.453125f,0.9375f, +0.460938f,0.9375f, +0.46875f,0.9375f, +0.476563f,0.9375f, +0.484375f,0.9375f, +0.492188f,0.9375f, +0.5f,0.9375f, +0.507813f,0.9375f, +0.0f,0.945313f, +0.0078125f,0.945313f, +0.015625f,0.945313f, +0.0234375f,0.945313f, +0.03125f,0.945313f, +0.0390625f,0.945313f, +0.046875f,0.945313f, +0.0546875f,0.945313f, +0.0625f,0.945313f, +0.0703125f,0.945313f, +0.078125f,0.945313f, +0.0859375f,0.945313f, +0.09375f,0.945313f, +0.101563f,0.945313f, +0.109375f,0.945313f, +0.117188f,0.945313f, +0.125f,0.945313f, +0.132813f,0.945313f, +0.140625f,0.945313f, +0.148438f,0.945313f, +0.15625f,0.945313f, +0.164063f,0.945313f, +0.171875f,0.945313f, +0.179688f,0.945313f, +0.1875f,0.945313f, +0.195313f,0.945313f, +0.203125f,0.945313f, +0.210938f,0.945313f, +0.21875f,0.945313f, +0.226563f,0.945313f, +0.234375f,0.945313f, +0.242188f,0.945313f, +0.25f,0.945313f, +0.257813f,0.945313f, +0.265625f,0.945313f, +0.273438f,0.945313f, +0.28125f,0.945313f, +0.289063f,0.945313f, +0.296875f,0.945313f, +0.304688f,0.945313f, +0.3125f,0.945313f, +0.320313f,0.945313f, +0.328125f,0.945313f, +0.335938f,0.945313f, +0.34375f,0.945313f, +0.351563f,0.945313f, +0.359375f,0.945313f, +0.367188f,0.945313f, +0.375f,0.945313f, +0.382813f,0.945313f, +0.390625f,0.945313f, +0.398438f,0.945313f, +0.40625f,0.945313f, +0.414063f,0.945313f, +0.421875f,0.945313f, +0.429688f,0.945313f, +0.4375f,0.945313f, +0.445313f,0.945313f, +0.453125f,0.945313f, +0.460938f,0.945313f, +0.46875f,0.945313f, +0.476563f,0.945313f, +0.484375f,0.945313f, +0.492188f,0.945313f, +0.5f,0.945313f, +0.507813f,0.945313f, +0.0f,0.953125f, +0.0078125f,0.953125f, +0.015625f,0.953125f, +0.0234375f,0.953125f, +0.03125f,0.953125f, +0.0390625f,0.953125f, +0.046875f,0.953125f, +0.0546875f,0.953125f, +0.0625f,0.953125f, +0.0703125f,0.953125f, +0.078125f,0.953125f, +0.0859375f,0.953125f, +0.09375f,0.953125f, +0.101563f,0.953125f, +0.109375f,0.953125f, +0.117188f,0.953125f, +0.125f,0.953125f, +0.132813f,0.953125f, +0.140625f,0.953125f, +0.148438f,0.953125f, +0.15625f,0.953125f, +0.164063f,0.953125f, +0.171875f,0.953125f, +0.179688f,0.953125f, +0.1875f,0.953125f, +0.195313f,0.953125f, +0.203125f,0.953125f, +0.210938f,0.953125f, +0.21875f,0.953125f, +0.226563f,0.953125f, +0.234375f,0.953125f, +0.242188f,0.953125f, +0.25f,0.953125f, +0.257813f,0.953125f, +0.265625f,0.953125f, +0.273438f,0.953125f, +0.28125f,0.953125f, +0.289063f,0.953125f, +0.296875f,0.953125f, +0.304688f,0.953125f, +0.3125f,0.953125f, +0.320313f,0.953125f, +0.328125f,0.953125f, +0.335938f,0.953125f, +0.34375f,0.953125f, +0.351563f,0.953125f, +0.359375f,0.953125f, +0.367188f,0.953125f, +0.375f,0.953125f, +0.382813f,0.953125f, +0.390625f,0.953125f, +0.398438f,0.953125f, +0.40625f,0.953125f, +0.414063f,0.953125f, +0.421875f,0.953125f, +0.429688f,0.953125f, +0.4375f,0.953125f, +0.445313f,0.953125f, +0.453125f,0.953125f, +0.460938f,0.953125f, +0.46875f,0.953125f, +0.476563f,0.953125f, +0.484375f,0.953125f, +0.492188f,0.953125f, +0.5f,0.953125f, +0.507813f,0.953125f, +0.0f,0.960938f, +0.0078125f,0.960938f, +0.015625f,0.960938f, +0.0234375f,0.960938f, +0.03125f,0.960938f, +0.0390625f,0.960938f, +0.046875f,0.960938f, +0.0546875f,0.960938f, +0.0625f,0.960938f, +0.0703125f,0.960938f, +0.078125f,0.960938f, +0.0859375f,0.960938f, +0.09375f,0.960938f, +0.101563f,0.960938f, +0.109375f,0.960938f, +0.117188f,0.960938f, +0.125f,0.960938f, +0.132813f,0.960938f, +0.140625f,0.960938f, +0.148438f,0.960938f, +0.15625f,0.960938f, +0.164063f,0.960938f, +0.171875f,0.960938f, +0.179688f,0.960938f, +0.1875f,0.960938f, +0.195313f,0.960938f, +0.203125f,0.960938f, +0.210938f,0.960938f, +0.21875f,0.960938f, +0.226563f,0.960938f, +0.234375f,0.960938f, +0.242188f,0.960938f, +0.25f,0.960938f, +0.257813f,0.960938f, +0.265625f,0.960938f, +0.273438f,0.960938f, +0.28125f,0.960938f, +0.289063f,0.960938f, +0.296875f,0.960938f, +0.304688f,0.960938f, +0.3125f,0.960938f, +0.320313f,0.960938f, +0.328125f,0.960938f, +0.335938f,0.960938f, +0.34375f,0.960938f, +0.351563f,0.960938f, +0.359375f,0.960938f, +0.367188f,0.960938f, +0.375f,0.960938f, +0.382813f,0.960938f, +0.390625f,0.960938f, +0.398438f,0.960938f, +0.40625f,0.960938f, +0.414063f,0.960938f, +0.421875f,0.960938f, +0.429688f,0.960938f, +0.4375f,0.960938f, +0.445313f,0.960938f, +0.453125f,0.960938f, +0.460938f,0.960938f, +0.46875f,0.960938f, +0.476563f,0.960938f, +0.484375f,0.960938f, +0.492188f,0.960938f, +0.5f,0.960938f, +0.507813f,0.960938f, +0.0f,0.96875f, +0.0078125f,0.96875f, +0.015625f,0.96875f, +0.0234375f,0.96875f, +0.03125f,0.96875f, +0.0390625f,0.96875f, +0.046875f,0.96875f, +0.0546875f,0.96875f, +0.0625f,0.96875f, +0.0703125f,0.96875f, +0.078125f,0.96875f, +0.0859375f,0.96875f, +0.09375f,0.96875f, +0.101563f,0.96875f, +0.109375f,0.96875f, +0.117188f,0.96875f, +0.125f,0.96875f, +0.132813f,0.96875f, +0.140625f,0.96875f, +0.148438f,0.96875f, +0.15625f,0.96875f, +0.164063f,0.96875f, +0.171875f,0.96875f, +0.179688f,0.96875f, +0.1875f,0.96875f, +0.195313f,0.96875f, +0.203125f,0.96875f, +0.210938f,0.96875f, +0.21875f,0.96875f, +0.226563f,0.96875f, +0.234375f,0.96875f, +0.242188f,0.96875f, +0.25f,0.96875f, +0.257813f,0.96875f, +0.265625f,0.96875f, +0.273438f,0.96875f, +0.28125f,0.96875f, +0.289063f,0.96875f, +0.296875f,0.96875f, +0.304688f,0.96875f, +0.3125f,0.96875f, +0.320313f,0.96875f, +0.328125f,0.96875f, +0.335938f,0.96875f, +0.34375f,0.96875f, +0.351563f,0.96875f, +0.359375f,0.96875f, +0.367188f,0.96875f, +0.375f,0.96875f, +0.382813f,0.96875f, +0.390625f,0.96875f, +0.398438f,0.96875f, +0.40625f,0.96875f, +0.414063f,0.96875f, +0.421875f,0.96875f, +0.429688f,0.96875f, +0.4375f,0.96875f, +0.445313f,0.96875f, +0.453125f,0.96875f, +0.460938f,0.96875f, +0.46875f,0.96875f, +0.476563f,0.96875f, +0.484375f,0.96875f, +0.492188f,0.96875f, +0.5f,0.96875f, +0.507813f,0.96875f, +0.0f,0.976563f, +0.0078125f,0.976563f, +0.015625f,0.976563f, +0.0234375f,0.976563f, +0.03125f,0.976563f, +0.0390625f,0.976563f, +0.046875f,0.976563f, +0.0546875f,0.976563f, +0.0625f,0.976563f, +0.0703125f,0.976563f, +0.078125f,0.976563f, +0.0859375f,0.976563f, +0.09375f,0.976563f, +0.101563f,0.976563f, +0.109375f,0.976563f, +0.117188f,0.976563f, +0.125f,0.976563f, +0.132813f,0.976563f, +0.140625f,0.976563f, +0.148438f,0.976563f, +0.15625f,0.976563f, +0.164063f,0.976563f, +0.171875f,0.976563f, +0.179688f,0.976563f, +0.1875f,0.976563f, +0.195313f,0.976563f, +0.203125f,0.976563f, +0.210938f,0.976563f, +0.21875f,0.976563f, +0.226563f,0.976563f, +0.234375f,0.976563f, +0.242188f,0.976563f, +0.25f,0.976563f, +0.257813f,0.976563f, +0.265625f,0.976563f, +0.273438f,0.976563f, +0.28125f,0.976563f, +0.289063f,0.976563f, +0.296875f,0.976563f, +0.304688f,0.976563f, +0.3125f,0.976563f, +0.320313f,0.976563f, +0.328125f,0.976563f, +0.335938f,0.976563f, +0.34375f,0.976563f, +0.351563f,0.976563f, +0.359375f,0.976563f, +0.367188f,0.976563f, +0.375f,0.976563f, +0.382813f,0.976563f, +0.390625f,0.976563f, +0.398438f,0.976563f, +0.40625f,0.976563f, +0.414063f,0.976563f, +0.421875f,0.976563f, +0.429688f,0.976563f, +0.4375f,0.976563f, +0.445313f,0.976563f, +0.453125f,0.976563f, +0.460938f,0.976563f, +0.46875f,0.976563f, +0.476563f,0.976563f, +0.484375f,0.976563f, +0.492188f,0.976563f, +0.5f,0.976563f, +0.507813f,0.976563f, +0.0f,0.984375f, +0.0078125f,0.984375f, +0.015625f,0.984375f, +0.0234375f,0.984375f, +0.03125f,0.984375f, +0.0390625f,0.984375f, +0.046875f,0.984375f, +0.0546875f,0.984375f, +0.0625f,0.984375f, +0.0703125f,0.984375f, +0.078125f,0.984375f, +0.0859375f,0.984375f, +0.09375f,0.984375f, +0.101563f,0.984375f, +0.109375f,0.984375f, +0.117188f,0.984375f, +0.125f,0.984375f, +0.132813f,0.984375f, +0.140625f,0.984375f, +0.148438f,0.984375f, +0.15625f,0.984375f, +0.164063f,0.984375f, +0.171875f,0.984375f, +0.179688f,0.984375f, +0.1875f,0.984375f, +0.195313f,0.984375f, +0.203125f,0.984375f, +0.210938f,0.984375f, +0.21875f,0.984375f, +0.226563f,0.984375f, +0.234375f,0.984375f, +0.242188f,0.984375f, +0.25f,0.984375f, +0.257813f,0.984375f, +0.265625f,0.984375f, +0.273438f,0.984375f, +0.28125f,0.984375f, +0.289063f,0.984375f, +0.296875f,0.984375f, +0.304688f,0.984375f, +0.3125f,0.984375f, +0.320313f,0.984375f, +0.328125f,0.984375f, +0.335938f,0.984375f, +0.34375f,0.984375f, +0.351563f,0.984375f, +0.359375f,0.984375f, +0.367188f,0.984375f, +0.375f,0.984375f, +0.382813f,0.984375f, +0.390625f,0.984375f, +0.398438f,0.984375f, +0.40625f,0.984375f, +0.414063f,0.984375f, +0.421875f,0.984375f, +0.429688f,0.984375f, +0.4375f,0.984375f, +0.445313f,0.984375f, +0.453125f,0.984375f, +0.460938f,0.984375f, +0.46875f,0.984375f, +0.476563f,0.984375f, +0.484375f,0.984375f, +0.492188f,0.984375f, +0.5f,0.984375f, +0.507813f,0.984375f, +0.0f,0.992188f, +0.0078125f,0.992188f, +0.015625f,0.992188f, +0.0234375f,0.992188f, +0.03125f,0.992188f, +0.0390625f,0.992188f, +0.046875f,0.992188f, +0.0546875f,0.992188f, +0.0625f,0.992188f, +0.0703125f,0.992188f, +0.078125f,0.992188f, +0.0859375f,0.992188f, +0.09375f,0.992188f, +0.101563f,0.992188f, +0.109375f,0.992188f, +0.117188f,0.992188f, +0.125f,0.992188f, +0.132813f,0.992188f, +0.140625f,0.992188f, +0.148438f,0.992188f, +0.15625f,0.992188f, +0.164063f,0.992188f, +0.171875f,0.992188f, +0.179688f,0.992188f, +0.1875f,0.992188f, +0.195313f,0.992188f, +0.203125f,0.992188f, +0.210938f,0.992188f, +0.21875f,0.992188f, +0.226563f,0.992188f, +0.234375f,0.992188f, +0.242188f,0.992188f, +0.25f,0.992188f, +0.257813f,0.992188f, +0.265625f,0.992188f, +0.273438f,0.992188f, +0.28125f,0.992188f, +0.289063f,0.992188f, +0.296875f,0.992188f, +0.304688f,0.992188f, +0.3125f,0.992188f, +0.320313f,0.992188f, +0.328125f,0.992188f, +0.335938f,0.992188f, +0.34375f,0.992188f, +0.351563f,0.992188f, +0.359375f,0.992188f, +0.367188f,0.992188f, +0.375f,0.992188f, +0.382813f,0.992188f, +0.390625f,0.992188f, +0.398438f,0.992188f, +0.40625f,0.992188f, +0.414063f,0.992188f, +0.421875f,0.992188f, +0.429688f,0.992188f, +0.4375f,0.992188f, +0.445313f,0.992188f, +0.453125f,0.992188f, +0.460938f,0.992188f, +0.46875f,0.992188f, +0.476563f,0.992188f, +0.484375f,0.992188f, +0.492188f,0.992188f, +0.5f,0.992188f, +0.507813f,0.992188f, +0.0f,1.0f, +0.0078125f,1.0f, +0.015625f,1.0f, +0.0234375f,1.0f, +0.03125f,1.0f, +0.0390625f,1.0f, +0.046875f,1.0f, +0.0546875f,1.0f, +0.0625f,1.0f, +0.0703125f,1.0f, +0.078125f,1.0f, +0.0859375f,1.0f, +0.09375f,1.0f, +0.101563f,1.0f, +0.109375f,1.0f, +0.117188f,1.0f, +0.125f,1.0f, +0.132813f,1.0f, +0.140625f,1.0f, +0.148438f,1.0f, +0.15625f,1.0f, +0.164063f,1.0f, +0.171875f,1.0f, +0.179688f,1.0f, +0.1875f,1.0f, +0.195313f,1.0f, +0.203125f,1.0f, +0.210938f,1.0f, +0.21875f,1.0f, +0.226563f,1.0f, +0.234375f,1.0f, +0.242188f,1.0f, +0.25f,1.0f, +0.257813f,1.0f, +0.265625f,1.0f, +0.273438f,1.0f, +0.28125f,1.0f, +0.289063f,1.0f, +0.296875f,1.0f, +0.304688f,1.0f, +0.3125f,1.0f, +0.320313f,1.0f, +0.328125f,1.0f, +0.335938f,1.0f, +0.34375f,1.0f, +0.351563f,1.0f, +0.359375f,1.0f, +0.367188f,1.0f, +0.375f,1.0f, +0.382813f,1.0f, +0.390625f,1.0f, +0.398438f,1.0f, +0.40625f,1.0f, +0.414063f,1.0f, +0.421875f,1.0f, +0.429688f,1.0f, +0.4375f,1.0f, +0.445313f,1.0f, +0.453125f,1.0f, +0.460938f,1.0f, +0.46875f,1.0f, +0.476563f,1.0f, +0.484375f,1.0f, +0.492188f,1.0f, +0.5f,1.0f, +0.507813f,1.0f, +}; + +unsigned short Landscape08Idx[] = { +0,1,2, +3,2,1, +2,3,4, +5,4,3, +4,5,6, +7,6,5, +6,7,8, +9,8,7, +8,9,10, +11,10,9, +10,11,12, +13,12,11, +12,13,14, +15,14,13, +14,15,16, +17,16,15, +16,17,18, +19,18,17, +18,19,20, +21,20,19, +20,21,22, +23,22,21, +22,23,24, +25,24,23, +24,25,26, +27,26,25, +26,27,28, +29,28,27, +28,29,30, +31,30,29, +30,31,32, +33,32,31, +32,33,34, +35,34,33, +34,35,36, +37,36,35, +36,37,38, +39,38,37, +38,39,40, +41,40,39, +40,41,42, +43,42,41, +42,43,44, +45,44,43, +44,45,46, +47,46,45, +46,47,48, +49,48,47, +48,49,50, +51,50,49, +50,51,52, +53,52,51, +52,53,54, +55,54,53, +54,55,56, +57,56,55, +56,57,58, +59,58,57, +58,59,60, +61,60,59, +60,61,62, +63,62,61, +62,63,64, +65,64,63, +64,65,66, +67,66,65, +66,67,68, +69,68,67, +68,69,70, +71,70,69, +70,71,72, +73,72,71, +72,73,74, +75,74,73, +74,75,76, +77,76,75, +76,77,78, +79,78,77, +78,79,80, +81,80,79, +80,81,82, +83,82,81, +82,83,84, +85,84,83, +84,85,86, +87,86,85, +86,87,88, +89,88,87, +88,89,90, +91,90,89, +90,91,92, +93,92,91, +92,93,94, +95,94,93, +94,95,96, +97,96,95, +96,97,98, +99,98,97, +98,99,100, +101,100,99, +100,101,102, +103,102,101, +102,103,104, +105,104,103, +104,105,106, +107,106,105, +106,107,108, +109,108,107, +108,109,110, +111,110,109, +110,111,112, +113,112,111, +112,113,114, +115,114,113, +114,115,116, +117,116,115, +116,117,118, +119,118,117, +118,119,120, +121,120,119, +120,121,122, +123,122,121, +122,123,124, +125,124,123, +124,125,126, +127,126,125, +126,127,128, +129,128,127, +128,129,130, +131,130,129, +132,0,133, +2,133,0, +133,2,134, +4,134,2, +134,4,135, +6,135,4, +135,6,136, +8,136,6, +136,8,137, +10,137,8, +137,10,138, +12,138,10, +138,12,139, +14,139,12, +139,14,140, +16,140,14, +140,16,141, +18,141,16, +141,18,142, +20,142,18, +142,20,143, +22,143,20, +143,22,144, +24,144,22, +144,24,145, +26,145,24, +145,26,146, +28,146,26, +146,28,147, +30,147,28, +147,30,148, +32,148,30, +148,32,149, +34,149,32, +149,34,150, +36,150,34, +150,36,151, +38,151,36, +151,38,152, +40,152,38, +152,40,153, +42,153,40, +153,42,154, +44,154,42, +154,44,155, +46,155,44, +155,46,156, +48,156,46, +156,48,157, +50,157,48, +157,50,158, +52,158,50, +158,52,159, +54,159,52, +159,54,160, +56,160,54, +160,56,161, +58,161,56, +161,58,162, +60,162,58, +162,60,163, +62,163,60, +163,62,164, +64,164,62, +164,64,165, +66,165,64, +165,66,166, +68,166,66, +166,68,167, +70,167,68, +167,70,168, +72,168,70, +168,72,169, +74,169,72, +169,74,170, +76,170,74, +170,76,171, +78,171,76, +171,78,172, +80,172,78, +172,80,173, +82,173,80, +173,82,174, +84,174,82, +174,84,175, +86,175,84, +175,86,176, +88,176,86, +176,88,177, +90,177,88, +177,90,178, +92,178,90, +178,92,179, +94,179,92, +179,94,180, +96,180,94, +180,96,181, +98,181,96, +181,98,182, +100,182,98, +182,100,183, +102,183,100, +183,102,184, +104,184,102, +184,104,185, +106,185,104, +185,106,186, +108,186,106, +186,108,187, +110,187,108, +187,110,188, +112,188,110, +188,112,189, +114,189,112, +189,114,190, +116,190,114, +190,116,191, +118,191,116, +191,118,192, +120,192,118, +192,120,193, +122,193,120, +193,122,194, +124,194,122, +194,124,195, +126,195,124, +195,126,196, +128,196,126, +196,128,197, +130,197,128, +198,132,199, +133,199,132, +199,133,200, +134,200,133, +200,134,201, +135,201,134, +201,135,202, +136,202,135, +202,136,203, +137,203,136, +203,137,204, +138,204,137, +204,138,205, +139,205,138, +205,139,206, +140,206,139, +206,140,207, +141,207,140, +207,141,208, +142,208,141, +208,142,209, +143,209,142, +209,143,210, +144,210,143, +210,144,211, +145,211,144, +211,145,212, +146,212,145, +212,146,213, +147,213,146, +213,147,214, +148,214,147, +214,148,215, +149,215,148, +215,149,216, +150,216,149, +216,150,217, +151,217,150, +217,151,218, +152,218,151, +218,152,219, +153,219,152, +219,153,220, +154,220,153, +220,154,221, +155,221,154, +221,155,222, +156,222,155, +222,156,223, +157,223,156, +223,157,224, +158,224,157, +224,158,225, +159,225,158, +225,159,226, +160,226,159, +226,160,227, +161,227,160, +227,161,228, +162,228,161, +228,162,229, +163,229,162, +229,163,230, +164,230,163, +230,164,231, +165,231,164, +231,165,232, +166,232,165, +232,166,233, +167,233,166, +233,167,234, +168,234,167, +234,168,235, +169,235,168, +235,169,236, +170,236,169, +236,170,237, +171,237,170, +237,171,238, +172,238,171, +238,172,239, +173,239,172, +239,173,240, +174,240,173, +240,174,241, +175,241,174, +241,175,242, +176,242,175, +242,176,243, +177,243,176, +243,177,244, +178,244,177, +244,178,245, +179,245,178, +245,179,246, +180,246,179, +246,180,247, +181,247,180, +247,181,248, +182,248,181, +248,182,249, +183,249,182, +249,183,250, +184,250,183, +250,184,251, +185,251,184, +251,185,252, +186,252,185, +252,186,253, +187,253,186, +253,187,254, +188,254,187, +254,188,255, +189,255,188, +255,189,256, +190,256,189, +256,190,257, +191,257,190, +257,191,258, +192,258,191, +258,192,259, +193,259,192, +259,193,260, +194,260,193, +260,194,261, +195,261,194, +261,195,262, +196,262,195, +262,196,263, +197,263,196, +264,198,265, +199,265,198, +265,199,266, +200,266,199, +266,200,267, +201,267,200, +267,201,268, +202,268,201, +268,202,269, +203,269,202, +269,203,270, +204,270,203, +270,204,271, +205,271,204, +271,205,272, +206,272,205, +272,206,273, +207,273,206, +273,207,274, +208,274,207, +274,208,275, +209,275,208, +275,209,276, +210,276,209, +276,210,277, +211,277,210, +277,211,278, +212,278,211, +278,212,279, +213,279,212, +279,213,280, +214,280,213, +280,214,281, +215,281,214, +281,215,282, +216,282,215, +282,216,283, +217,283,216, +283,217,284, +218,284,217, +284,218,285, +219,285,218, +285,219,286, +220,286,219, +286,220,287, +221,287,220, +287,221,288, +222,288,221, +288,222,289, +223,289,222, +289,223,290, +224,290,223, +290,224,291, +225,291,224, +291,225,292, +226,292,225, +292,226,293, +227,293,226, +293,227,294, +228,294,227, +294,228,295, +229,295,228, +295,229,296, +230,296,229, +296,230,297, +231,297,230, +297,231,298, +232,298,231, +298,232,299, +233,299,232, +299,233,300, +234,300,233, +300,234,301, +235,301,234, +301,235,302, +236,302,235, +302,236,303, +237,303,236, +303,237,304, +238,304,237, +304,238,305, +239,305,238, +305,239,306, +240,306,239, +306,240,307, +241,307,240, +307,241,308, +242,308,241, +308,242,309, +243,309,242, +309,243,310, +244,310,243, +310,244,311, +245,311,244, +311,245,312, +246,312,245, +312,246,313, +247,313,246, +313,247,314, +248,314,247, +314,248,315, +249,315,248, +315,249,316, +250,316,249, +316,250,317, +251,317,250, +317,251,318, +252,318,251, +318,252,319, +253,319,252, +319,253,320, +254,320,253, +320,254,321, +255,321,254, +321,255,322, +256,322,255, +322,256,323, +257,323,256, +323,257,324, +258,324,257, +324,258,325, +259,325,258, +325,259,326, +260,326,259, +326,260,327, +261,327,260, +327,261,328, +262,328,261, +328,262,329, +263,329,262, +330,264,331, +265,331,264, +331,265,332, +266,332,265, +332,266,333, +267,333,266, +333,267,334, +268,334,267, +334,268,335, +269,335,268, +335,269,336, +270,336,269, +336,270,337, +271,337,270, +337,271,338, +272,338,271, +338,272,339, +273,339,272, +339,273,340, +274,340,273, +340,274,341, +275,341,274, +341,275,342, +276,342,275, +342,276,343, +277,343,276, +343,277,344, +278,344,277, +344,278,345, +279,345,278, +345,279,346, +280,346,279, +346,280,347, +281,347,280, +347,281,348, +282,348,281, +348,282,349, +283,349,282, +349,283,350, +284,350,283, +350,284,351, +285,351,284, +351,285,352, +286,352,285, +352,286,353, +287,353,286, +353,287,354, +288,354,287, +354,288,355, +289,355,288, +355,289,356, +290,356,289, +356,290,357, +291,357,290, +357,291,358, +292,358,291, +358,292,359, +293,359,292, +359,293,360, +294,360,293, +360,294,361, +295,361,294, +361,295,362, +296,362,295, +362,296,363, +297,363,296, +363,297,364, +298,364,297, +364,298,365, +299,365,298, +365,299,366, +300,366,299, +366,300,367, +301,367,300, +367,301,368, +302,368,301, +368,302,369, +303,369,302, +369,303,370, +304,370,303, +370,304,371, +305,371,304, +371,305,372, +306,372,305, +372,306,373, +307,373,306, +373,307,374, +308,374,307, +374,308,375, +309,375,308, +375,309,376, +310,376,309, +376,310,377, +311,377,310, +377,311,378, +312,378,311, +378,312,379, +313,379,312, +379,313,380, +314,380,313, +380,314,381, +315,381,314, +381,315,382, +316,382,315, +382,316,383, +317,383,316, +383,317,384, +318,384,317, +384,318,385, +319,385,318, +385,319,386, +320,386,319, +386,320,387, +321,387,320, +387,321,388, +322,388,321, +388,322,389, +323,389,322, +389,323,390, +324,390,323, +390,324,391, +325,391,324, +391,325,392, +326,392,325, +392,326,393, +327,393,326, +393,327,394, +328,394,327, +394,328,395, +329,395,328, +396,330,397, +331,397,330, +397,331,398, +332,398,331, +398,332,399, +333,399,332, +399,333,400, +334,400,333, +400,334,401, +335,401,334, +401,335,402, +336,402,335, +402,336,403, +337,403,336, +403,337,404, +338,404,337, +404,338,405, +339,405,338, +405,339,406, +340,406,339, +406,340,407, +341,407,340, +407,341,408, +342,408,341, +408,342,409, +343,409,342, +409,343,410, +344,410,343, +410,344,411, +345,411,344, +411,345,412, +346,412,345, +412,346,413, +347,413,346, +413,347,414, +348,414,347, +414,348,415, +349,415,348, +415,349,416, +350,416,349, +416,350,417, +351,417,350, +417,351,418, +352,418,351, +418,352,419, +353,419,352, +419,353,420, +354,420,353, +420,354,421, +355,421,354, +421,355,422, +356,422,355, +422,356,423, +357,423,356, +423,357,424, +358,424,357, +424,358,425, +359,425,358, +425,359,426, +360,426,359, +426,360,427, +361,427,360, +427,361,428, +362,428,361, +428,362,429, +363,429,362, +429,363,430, +364,430,363, +430,364,431, +365,431,364, +431,365,432, +366,432,365, +432,366,433, +367,433,366, +433,367,434, +368,434,367, +434,368,435, +369,435,368, +435,369,436, +370,436,369, +436,370,437, +371,437,370, +437,371,438, +372,438,371, +438,372,439, +373,439,372, +439,373,440, +374,440,373, +440,374,441, +375,441,374, +441,375,442, +376,442,375, +442,376,443, +377,443,376, +443,377,444, +378,444,377, +444,378,445, +379,445,378, +445,379,446, +380,446,379, +446,380,447, +381,447,380, +447,381,448, +382,448,381, +448,382,449, +383,449,382, +449,383,450, +384,450,383, +450,384,451, +385,451,384, +451,385,452, +386,452,385, +452,386,453, +387,453,386, +453,387,454, +388,454,387, +454,388,455, +389,455,388, +455,389,456, +390,456,389, +456,390,457, +391,457,390, +457,391,458, +392,458,391, +458,392,459, +393,459,392, +459,393,460, +394,460,393, +460,394,461, +395,461,394, +462,396,463, +397,463,396, +463,397,464, +398,464,397, +464,398,465, +399,465,398, +465,399,466, +400,466,399, +466,400,467, +401,467,400, +467,401,468, +402,468,401, +468,402,469, +403,469,402, +469,403,470, +404,470,403, +470,404,471, +405,471,404, +471,405,472, +406,472,405, +472,406,473, +407,473,406, +473,407,474, +408,474,407, +474,408,475, +409,475,408, +475,409,476, +410,476,409, +476,410,477, +411,477,410, +477,411,478, +412,478,411, +478,412,479, +413,479,412, +479,413,480, +414,480,413, +480,414,481, +415,481,414, +481,415,482, +416,482,415, +482,416,483, +417,483,416, +483,417,484, +418,484,417, +484,418,485, +419,485,418, +485,419,486, +420,486,419, +486,420,487, +421,487,420, +487,421,488, +422,488,421, +488,422,489, +423,489,422, +489,423,490, +424,490,423, +490,424,491, +425,491,424, +491,425,492, +426,492,425, +492,426,493, +427,493,426, +493,427,494, +428,494,427, +494,428,495, +429,495,428, +495,429,496, +430,496,429, +496,430,497, +431,497,430, +497,431,498, +432,498,431, +498,432,499, +433,499,432, +499,433,500, +434,500,433, +500,434,501, +435,501,434, +501,435,502, +436,502,435, +502,436,503, +437,503,436, +503,437,504, +438,504,437, +504,438,505, +439,505,438, +505,439,506, +440,506,439, +506,440,507, +441,507,440, +507,441,508, +442,508,441, +508,442,509, +443,509,442, +509,443,510, +444,510,443, +510,444,511, +445,511,444, +511,445,512, +446,512,445, +512,446,513, +447,513,446, +513,447,514, +448,514,447, +514,448,515, +449,515,448, +515,449,516, +450,516,449, +516,450,517, +451,517,450, +517,451,518, +452,518,451, +518,452,519, +453,519,452, +519,453,520, +454,520,453, +520,454,521, +455,521,454, +521,455,522, +456,522,455, +522,456,523, +457,523,456, +523,457,524, +458,524,457, +524,458,525, +459,525,458, +525,459,526, +460,526,459, +526,460,527, +461,527,460, +528,462,529, +463,529,462, +529,463,530, +464,530,463, +530,464,531, +465,531,464, +531,465,532, +466,532,465, +532,466,533, +467,533,466, +533,467,534, +468,534,467, +534,468,535, +469,535,468, +535,469,536, +470,536,469, +536,470,537, +471,537,470, +537,471,538, +472,538,471, +538,472,539, +473,539,472, +539,473,540, +474,540,473, +540,474,541, +475,541,474, +541,475,542, +476,542,475, +542,476,543, +477,543,476, +543,477,544, +478,544,477, +544,478,545, +479,545,478, +545,479,546, +480,546,479, +546,480,547, +481,547,480, +547,481,548, +482,548,481, +548,482,549, +483,549,482, +549,483,550, +484,550,483, +550,484,551, +485,551,484, +551,485,552, +486,552,485, +552,486,553, +487,553,486, +553,487,554, +488,554,487, +554,488,555, +489,555,488, +555,489,556, +490,556,489, +556,490,557, +491,557,490, +557,491,558, +492,558,491, +558,492,559, +493,559,492, +559,493,560, +494,560,493, +560,494,561, +495,561,494, +561,495,562, +496,562,495, +562,496,563, +497,563,496, +563,497,564, +498,564,497, +564,498,565, +499,565,498, +565,499,566, +500,566,499, +566,500,567, +501,567,500, +567,501,568, +502,568,501, +568,502,569, +503,569,502, +569,503,570, +504,570,503, +570,504,571, +505,571,504, +571,505,572, +506,572,505, +572,506,573, +507,573,506, +573,507,574, +508,574,507, +574,508,575, +509,575,508, +575,509,576, +510,576,509, +576,510,577, +511,577,510, +577,511,578, +512,578,511, +578,512,579, +513,579,512, +579,513,580, +514,580,513, +580,514,581, +515,581,514, +581,515,582, +516,582,515, +582,516,583, +517,583,516, +583,517,584, +518,584,517, +584,518,585, +519,585,518, +585,519,586, +520,586,519, +586,520,587, +521,587,520, +587,521,588, +522,588,521, +588,522,589, +523,589,522, +589,523,590, +524,590,523, +590,524,591, +525,591,524, +591,525,592, +526,592,525, +592,526,593, +527,593,526, +594,528,595, +529,595,528, +595,529,596, +530,596,529, +596,530,597, +531,597,530, +597,531,598, +532,598,531, +598,532,599, +533,599,532, +599,533,600, +534,600,533, +600,534,601, +535,601,534, +601,535,602, +536,602,535, +602,536,603, +537,603,536, +603,537,604, +538,604,537, +604,538,605, +539,605,538, +605,539,606, +540,606,539, +606,540,607, +541,607,540, +607,541,608, +542,608,541, +608,542,609, +543,609,542, +609,543,610, +544,610,543, +610,544,611, +545,611,544, +611,545,612, +546,612,545, +612,546,613, +547,613,546, +613,547,614, +548,614,547, +614,548,615, +549,615,548, +615,549,616, +550,616,549, +616,550,617, +551,617,550, +617,551,618, +552,618,551, +618,552,619, +553,619,552, +619,553,620, +554,620,553, +620,554,621, +555,621,554, +621,555,622, +556,622,555, +622,556,623, +557,623,556, +623,557,624, +558,624,557, +624,558,625, +559,625,558, +625,559,626, +560,626,559, +626,560,627, +561,627,560, +627,561,628, +562,628,561, +628,562,629, +563,629,562, +629,563,630, +564,630,563, +630,564,631, +565,631,564, +631,565,632, +566,632,565, +632,566,633, +567,633,566, +633,567,634, +568,634,567, +634,568,635, +569,635,568, +635,569,636, +570,636,569, +636,570,637, +571,637,570, +637,571,638, +572,638,571, +638,572,639, +573,639,572, +639,573,640, +574,640,573, +640,574,641, +575,641,574, +641,575,642, +576,642,575, +642,576,643, +577,643,576, +643,577,644, +578,644,577, +644,578,645, +579,645,578, +645,579,646, +580,646,579, +646,580,647, +581,647,580, +647,581,648, +582,648,581, +648,582,649, +583,649,582, +649,583,650, +584,650,583, +650,584,651, +585,651,584, +651,585,652, +586,652,585, +652,586,653, +587,653,586, +653,587,654, +588,654,587, +654,588,655, +589,655,588, +655,589,656, +590,656,589, +656,590,657, +591,657,590, +657,591,658, +592,658,591, +658,592,659, +593,659,592, +660,594,661, +595,661,594, +661,595,662, +596,662,595, +662,596,663, +597,663,596, +663,597,664, +598,664,597, +664,598,665, +599,665,598, +665,599,666, +600,666,599, +666,600,667, +601,667,600, +667,601,668, +602,668,601, +668,602,669, +603,669,602, +669,603,670, +604,670,603, +670,604,671, +605,671,604, +671,605,672, +606,672,605, +672,606,673, +607,673,606, +673,607,674, +608,674,607, +674,608,675, +609,675,608, +675,609,676, +610,676,609, +676,610,677, +611,677,610, +677,611,678, +612,678,611, +678,612,679, +613,679,612, +679,613,680, +614,680,613, +680,614,681, +615,681,614, +681,615,682, +616,682,615, +682,616,683, +617,683,616, +683,617,684, +618,684,617, +684,618,685, +619,685,618, +685,619,686, +620,686,619, +686,620,687, +621,687,620, +687,621,688, +622,688,621, +688,622,689, +623,689,622, +689,623,690, +624,690,623, +690,624,691, +625,691,624, +691,625,692, +626,692,625, +692,626,693, +627,693,626, +693,627,694, +628,694,627, +694,628,695, +629,695,628, +695,629,696, +630,696,629, +696,630,697, +631,697,630, +697,631,698, +632,698,631, +698,632,699, +633,699,632, +699,633,700, +634,700,633, +700,634,701, +635,701,634, +701,635,702, +636,702,635, +702,636,703, +637,703,636, +703,637,704, +638,704,637, +704,638,705, +639,705,638, +705,639,706, +640,706,639, +706,640,707, +641,707,640, +707,641,708, +642,708,641, +708,642,709, +643,709,642, +709,643,710, +644,710,643, +710,644,711, +645,711,644, +711,645,712, +646,712,645, +712,646,713, +647,713,646, +713,647,714, +648,714,647, +714,648,715, +649,715,648, +715,649,716, +650,716,649, +716,650,717, +651,717,650, +717,651,718, +652,718,651, +718,652,719, +653,719,652, +719,653,720, +654,720,653, +720,654,721, +655,721,654, +721,655,722, +656,722,655, +722,656,723, +657,723,656, +723,657,724, +658,724,657, +724,658,725, +659,725,658, +726,660,727, +661,727,660, +727,661,728, +662,728,661, +728,662,729, +663,729,662, +729,663,730, +664,730,663, +730,664,731, +665,731,664, +731,665,732, +666,732,665, +732,666,733, +667,733,666, +733,667,734, +668,734,667, +734,668,735, +669,735,668, +735,669,736, +670,736,669, +736,670,737, +671,737,670, +737,671,738, +672,738,671, +738,672,739, +673,739,672, +739,673,740, +674,740,673, +740,674,741, +675,741,674, +741,675,742, +676,742,675, +742,676,743, +677,743,676, +743,677,744, +678,744,677, +744,678,745, +679,745,678, +745,679,746, +680,746,679, +746,680,747, +681,747,680, +747,681,748, +682,748,681, +748,682,749, +683,749,682, +749,683,750, +684,750,683, +750,684,751, +685,751,684, +751,685,752, +686,752,685, +752,686,753, +687,753,686, +753,687,754, +688,754,687, +754,688,755, +689,755,688, +755,689,756, +690,756,689, +756,690,757, +691,757,690, +757,691,758, +692,758,691, +758,692,759, +693,759,692, +759,693,760, +694,760,693, +760,694,761, +695,761,694, +761,695,762, +696,762,695, +762,696,763, +697,763,696, +763,697,764, +698,764,697, +764,698,765, +699,765,698, +765,699,766, +700,766,699, +766,700,767, +701,767,700, +767,701,768, +702,768,701, +768,702,769, +703,769,702, +769,703,770, +704,770,703, +770,704,771, +705,771,704, +771,705,772, +706,772,705, +772,706,773, +707,773,706, +773,707,774, +708,774,707, +774,708,775, +709,775,708, +775,709,776, +710,776,709, +776,710,777, +711,777,710, +777,711,778, +712,778,711, +778,712,779, +713,779,712, +779,713,780, +714,780,713, +780,714,781, +715,781,714, +781,715,782, +716,782,715, +782,716,783, +717,783,716, +783,717,784, +718,784,717, +784,718,785, +719,785,718, +785,719,786, +720,786,719, +786,720,787, +721,787,720, +787,721,788, +722,788,721, +788,722,789, +723,789,722, +789,723,790, +724,790,723, +790,724,791, +725,791,724, +792,726,793, +727,793,726, +793,727,794, +728,794,727, +794,728,795, +729,795,728, +795,729,796, +730,796,729, +796,730,797, +731,797,730, +797,731,798, +732,798,731, +798,732,799, +733,799,732, +799,733,800, +734,800,733, +800,734,801, +735,801,734, +801,735,802, +736,802,735, +802,736,803, +737,803,736, +803,737,804, +738,804,737, +804,738,805, +739,805,738, +805,739,806, +740,806,739, +806,740,807, +741,807,740, +807,741,808, +742,808,741, +808,742,809, +743,809,742, +809,743,810, +744,810,743, +810,744,811, +745,811,744, +811,745,812, +746,812,745, +812,746,813, +747,813,746, +813,747,814, +748,814,747, +814,748,815, +749,815,748, +815,749,816, +750,816,749, +816,750,817, +751,817,750, +817,751,818, +752,818,751, +818,752,819, +753,819,752, +819,753,820, +754,820,753, +820,754,821, +755,821,754, +821,755,822, +756,822,755, +822,756,823, +757,823,756, +823,757,824, +758,824,757, +824,758,825, +759,825,758, +825,759,826, +760,826,759, +826,760,827, +761,827,760, +827,761,828, +762,828,761, +828,762,829, +763,829,762, +829,763,830, +764,830,763, +830,764,831, +765,831,764, +831,765,832, +766,832,765, +832,766,833, +767,833,766, +833,767,834, +768,834,767, +834,768,835, +769,835,768, +835,769,836, +770,836,769, +836,770,837, +771,837,770, +837,771,838, +772,838,771, +838,772,839, +773,839,772, +839,773,840, +774,840,773, +840,774,841, +775,841,774, +841,775,842, +776,842,775, +842,776,843, +777,843,776, +843,777,844, +778,844,777, +844,778,845, +779,845,778, +845,779,846, +780,846,779, +846,780,847, +781,847,780, +847,781,848, +782,848,781, +848,782,849, +783,849,782, +849,783,850, +784,850,783, +850,784,851, +785,851,784, +851,785,852, +786,852,785, +852,786,853, +787,853,786, +853,787,854, +788,854,787, +854,788,855, +789,855,788, +855,789,856, +790,856,789, +856,790,857, +791,857,790, +858,792,859, +793,859,792, +859,793,860, +794,860,793, +860,794,861, +795,861,794, +861,795,862, +796,862,795, +862,796,863, +797,863,796, +863,797,864, +798,864,797, +864,798,865, +799,865,798, +865,799,866, +800,866,799, +866,800,867, +801,867,800, +867,801,868, +802,868,801, +868,802,869, +803,869,802, +869,803,870, +804,870,803, +870,804,871, +805,871,804, +871,805,872, +806,872,805, +872,806,873, +807,873,806, +873,807,874, +808,874,807, +874,808,875, +809,875,808, +875,809,876, +810,876,809, +876,810,877, +811,877,810, +877,811,878, +812,878,811, +878,812,879, +813,879,812, +879,813,880, +814,880,813, +880,814,881, +815,881,814, +881,815,882, +816,882,815, +882,816,883, +817,883,816, +883,817,884, +818,884,817, +884,818,885, +819,885,818, +885,819,886, +820,886,819, +886,820,887, +821,887,820, +887,821,888, +822,888,821, +888,822,889, +823,889,822, +889,823,890, +824,890,823, +890,824,891, +825,891,824, +891,825,892, +826,892,825, +892,826,893, +827,893,826, +893,827,894, +828,894,827, +894,828,895, +829,895,828, +895,829,896, +830,896,829, +896,830,897, +831,897,830, +897,831,898, +832,898,831, +898,832,899, +833,899,832, +899,833,900, +834,900,833, +900,834,901, +835,901,834, +901,835,902, +836,902,835, +902,836,903, +837,903,836, +903,837,904, +838,904,837, +904,838,905, +839,905,838, +905,839,906, +840,906,839, +906,840,907, +841,907,840, +907,841,908, +842,908,841, +908,842,909, +843,909,842, +909,843,910, +844,910,843, +910,844,911, +845,911,844, +911,845,912, +846,912,845, +912,846,913, +847,913,846, +913,847,914, +848,914,847, +914,848,915, +849,915,848, +915,849,916, +850,916,849, +916,850,917, +851,917,850, +917,851,918, +852,918,851, +918,852,919, +853,919,852, +919,853,920, +854,920,853, +920,854,921, +855,921,854, +921,855,922, +856,922,855, +922,856,923, +857,923,856, +924,858,925, +859,925,858, +925,859,926, +860,926,859, +926,860,927, +861,927,860, +927,861,928, +862,928,861, +928,862,929, +863,929,862, +929,863,930, +864,930,863, +930,864,931, +865,931,864, +931,865,932, +866,932,865, +932,866,933, +867,933,866, +933,867,934, +868,934,867, +934,868,935, +869,935,868, +935,869,936, +870,936,869, +936,870,937, +871,937,870, +937,871,938, +872,938,871, +938,872,939, +873,939,872, +939,873,940, +874,940,873, +940,874,941, +875,941,874, +941,875,942, +876,942,875, +942,876,943, +877,943,876, +943,877,944, +878,944,877, +944,878,945, +879,945,878, +945,879,946, +880,946,879, +946,880,947, +881,947,880, +947,881,948, +882,948,881, +948,882,949, +883,949,882, +949,883,950, +884,950,883, +950,884,951, +885,951,884, +951,885,952, +886,952,885, +952,886,953, +887,953,886, +953,887,954, +888,954,887, +954,888,955, +889,955,888, +955,889,956, +890,956,889, +956,890,957, +891,957,890, +957,891,958, +892,958,891, +958,892,959, +893,959,892, +959,893,960, +894,960,893, +960,894,961, +895,961,894, +961,895,962, +896,962,895, +962,896,963, +897,963,896, +963,897,964, +898,964,897, +964,898,965, +899,965,898, +965,899,966, +900,966,899, +966,900,967, +901,967,900, +967,901,968, +902,968,901, +968,902,969, +903,969,902, +969,903,970, +904,970,903, +970,904,971, +905,971,904, +971,905,972, +906,972,905, +972,906,973, +907,973,906, +973,907,974, +908,974,907, +974,908,975, +909,975,908, +975,909,976, +910,976,909, +976,910,977, +911,977,910, +977,911,978, +912,978,911, +978,912,979, +913,979,912, +979,913,980, +914,980,913, +980,914,981, +915,981,914, +981,915,982, +916,982,915, +982,916,983, +917,983,916, +983,917,984, +918,984,917, +984,918,985, +919,985,918, +985,919,986, +920,986,919, +986,920,987, +921,987,920, +987,921,988, +922,988,921, +988,922,989, +923,989,922, +990,924,991, +925,991,924, +991,925,992, +926,992,925, +992,926,993, +927,993,926, +993,927,994, +928,994,927, +994,928,995, +929,995,928, +995,929,996, +930,996,929, +996,930,997, +931,997,930, +997,931,998, +932,998,931, +998,932,999, +933,999,932, +999,933,1000, +934,1000,933, +1000,934,1001, +935,1001,934, +1001,935,1002, +936,1002,935, +1002,936,1003, +937,1003,936, +1003,937,1004, +938,1004,937, +1004,938,1005, +939,1005,938, +1005,939,1006, +940,1006,939, +1006,940,1007, +941,1007,940, +1007,941,1008, +942,1008,941, +1008,942,1009, +943,1009,942, +1009,943,1010, +944,1010,943, +1010,944,1011, +945,1011,944, +1011,945,1012, +946,1012,945, +1012,946,1013, +947,1013,946, +1013,947,1014, +948,1014,947, +1014,948,1015, +949,1015,948, +1015,949,1016, +950,1016,949, +1016,950,1017, +951,1017,950, +1017,951,1018, +952,1018,951, +1018,952,1019, +953,1019,952, +1019,953,1020, +954,1020,953, +1020,954,1021, +955,1021,954, +1021,955,1022, +956,1022,955, +1022,956,1023, +957,1023,956, +1023,957,1024, +958,1024,957, +1024,958,1025, +959,1025,958, +1025,959,1026, +960,1026,959, +1026,960,1027, +961,1027,960, +1027,961,1028, +962,1028,961, +1028,962,1029, +963,1029,962, +1029,963,1030, +964,1030,963, +1030,964,1031, +965,1031,964, +1031,965,1032, +966,1032,965, +1032,966,1033, +967,1033,966, +1033,967,1034, +968,1034,967, +1034,968,1035, +969,1035,968, +1035,969,1036, +970,1036,969, +1036,970,1037, +971,1037,970, +1037,971,1038, +972,1038,971, +1038,972,1039, +973,1039,972, +1039,973,1040, +974,1040,973, +1040,974,1041, +975,1041,974, +1041,975,1042, +976,1042,975, +1042,976,1043, +977,1043,976, +1043,977,1044, +978,1044,977, +1044,978,1045, +979,1045,978, +1045,979,1046, +980,1046,979, +1046,980,1047, +981,1047,980, +1047,981,1048, +982,1048,981, +1048,982,1049, +983,1049,982, +1049,983,1050, +984,1050,983, +1050,984,1051, +985,1051,984, +1051,985,1052, +986,1052,985, +1052,986,1053, +987,1053,986, +1053,987,1054, +988,1054,987, +1054,988,1055, +989,1055,988, +1056,990,1057, +991,1057,990, +1057,991,1058, +992,1058,991, +1058,992,1059, +993,1059,992, +1059,993,1060, +994,1060,993, +1060,994,1061, +995,1061,994, +1061,995,1062, +996,1062,995, +1062,996,1063, +997,1063,996, +1063,997,1064, +998,1064,997, +1064,998,1065, +999,1065,998, +1065,999,1066, +1000,1066,999, +1066,1000,1067, +1001,1067,1000, +1067,1001,1068, +1002,1068,1001, +1068,1002,1069, +1003,1069,1002, +1069,1003,1070, +1004,1070,1003, +1070,1004,1071, +1005,1071,1004, +1071,1005,1072, +1006,1072,1005, +1072,1006,1073, +1007,1073,1006, +1073,1007,1074, +1008,1074,1007, +1074,1008,1075, +1009,1075,1008, +1075,1009,1076, +1010,1076,1009, +1076,1010,1077, +1011,1077,1010, +1077,1011,1078, +1012,1078,1011, +1078,1012,1079, +1013,1079,1012, +1079,1013,1080, +1014,1080,1013, +1080,1014,1081, +1015,1081,1014, +1081,1015,1082, +1016,1082,1015, +1082,1016,1083, +1017,1083,1016, +1083,1017,1084, +1018,1084,1017, +1084,1018,1085, +1019,1085,1018, +1085,1019,1086, +1020,1086,1019, +1086,1020,1087, +1021,1087,1020, +1087,1021,1088, +1022,1088,1021, +1088,1022,1089, +1023,1089,1022, +1089,1023,1090, +1024,1090,1023, +1090,1024,1091, +1025,1091,1024, +1091,1025,1092, +1026,1092,1025, +1092,1026,1093, +1027,1093,1026, +1093,1027,1094, +1028,1094,1027, +1094,1028,1095, +1029,1095,1028, +1095,1029,1096, +1030,1096,1029, +1096,1030,1097, +1031,1097,1030, +1097,1031,1098, +1032,1098,1031, +1098,1032,1099, +1033,1099,1032, +1099,1033,1100, +1034,1100,1033, +1100,1034,1101, +1035,1101,1034, +1101,1035,1102, +1036,1102,1035, +1102,1036,1103, +1037,1103,1036, +1103,1037,1104, +1038,1104,1037, +1104,1038,1105, +1039,1105,1038, +1105,1039,1106, +1040,1106,1039, +1106,1040,1107, +1041,1107,1040, +1107,1041,1108, +1042,1108,1041, +1108,1042,1109, +1043,1109,1042, +1109,1043,1110, +1044,1110,1043, +1110,1044,1111, +1045,1111,1044, +1111,1045,1112, +1046,1112,1045, +1112,1046,1113, +1047,1113,1046, +1113,1047,1114, +1048,1114,1047, +1114,1048,1115, +1049,1115,1048, +1115,1049,1116, +1050,1116,1049, +1116,1050,1117, +1051,1117,1050, +1117,1051,1118, +1052,1118,1051, +1118,1052,1119, +1053,1119,1052, +1119,1053,1120, +1054,1120,1053, +1120,1054,1121, +1055,1121,1054, +1122,1056,1123, +1057,1123,1056, +1123,1057,1124, +1058,1124,1057, +1124,1058,1125, +1059,1125,1058, +1125,1059,1126, +1060,1126,1059, +1126,1060,1127, +1061,1127,1060, +1127,1061,1128, +1062,1128,1061, +1128,1062,1129, +1063,1129,1062, +1129,1063,1130, +1064,1130,1063, +1130,1064,1131, +1065,1131,1064, +1131,1065,1132, +1066,1132,1065, +1132,1066,1133, +1067,1133,1066, +1133,1067,1134, +1068,1134,1067, +1134,1068,1135, +1069,1135,1068, +1135,1069,1136, +1070,1136,1069, +1136,1070,1137, +1071,1137,1070, +1137,1071,1138, +1072,1138,1071, +1138,1072,1139, +1073,1139,1072, +1139,1073,1140, +1074,1140,1073, +1140,1074,1141, +1075,1141,1074, +1141,1075,1142, +1076,1142,1075, +1142,1076,1143, +1077,1143,1076, +1143,1077,1144, +1078,1144,1077, +1144,1078,1145, +1079,1145,1078, +1145,1079,1146, +1080,1146,1079, +1146,1080,1147, +1081,1147,1080, +1147,1081,1148, +1082,1148,1081, +1148,1082,1149, +1083,1149,1082, +1149,1083,1150, +1084,1150,1083, +1150,1084,1151, +1085,1151,1084, +1151,1085,1152, +1086,1152,1085, +1152,1086,1153, +1087,1153,1086, +1153,1087,1154, +1088,1154,1087, +1154,1088,1155, +1089,1155,1088, +1155,1089,1156, +1090,1156,1089, +1156,1090,1157, +1091,1157,1090, +1157,1091,1158, +1092,1158,1091, +1158,1092,1159, +1093,1159,1092, +1159,1093,1160, +1094,1160,1093, +1160,1094,1161, +1095,1161,1094, +1161,1095,1162, +1096,1162,1095, +1162,1096,1163, +1097,1163,1096, +1163,1097,1164, +1098,1164,1097, +1164,1098,1165, +1099,1165,1098, +1165,1099,1166, +1100,1166,1099, +1166,1100,1167, +1101,1167,1100, +1167,1101,1168, +1102,1168,1101, +1168,1102,1169, +1103,1169,1102, +1169,1103,1170, +1104,1170,1103, +1170,1104,1171, +1105,1171,1104, +1171,1105,1172, +1106,1172,1105, +1172,1106,1173, +1107,1173,1106, +1173,1107,1174, +1108,1174,1107, +1174,1108,1175, +1109,1175,1108, +1175,1109,1176, +1110,1176,1109, +1176,1110,1177, +1111,1177,1110, +1177,1111,1178, +1112,1178,1111, +1178,1112,1179, +1113,1179,1112, +1179,1113,1180, +1114,1180,1113, +1180,1114,1181, +1115,1181,1114, +1181,1115,1182, +1116,1182,1115, +1182,1116,1183, +1117,1183,1116, +1183,1117,1184, +1118,1184,1117, +1184,1118,1185, +1119,1185,1118, +1185,1119,1186, +1120,1186,1119, +1186,1120,1187, +1121,1187,1120, +1188,1122,1189, +1123,1189,1122, +1189,1123,1190, +1124,1190,1123, +1190,1124,1191, +1125,1191,1124, +1191,1125,1192, +1126,1192,1125, +1192,1126,1193, +1127,1193,1126, +1193,1127,1194, +1128,1194,1127, +1194,1128,1195, +1129,1195,1128, +1195,1129,1196, +1130,1196,1129, +1196,1130,1197, +1131,1197,1130, +1197,1131,1198, +1132,1198,1131, +1198,1132,1199, +1133,1199,1132, +1199,1133,1200, +1134,1200,1133, +1200,1134,1201, +1135,1201,1134, +1201,1135,1202, +1136,1202,1135, +1202,1136,1203, +1137,1203,1136, +1203,1137,1204, +1138,1204,1137, +1204,1138,1205, +1139,1205,1138, +1205,1139,1206, +1140,1206,1139, +1206,1140,1207, +1141,1207,1140, +1207,1141,1208, +1142,1208,1141, +1208,1142,1209, +1143,1209,1142, +1209,1143,1210, +1144,1210,1143, +1210,1144,1211, +1145,1211,1144, +1211,1145,1212, +1146,1212,1145, +1212,1146,1213, +1147,1213,1146, +1213,1147,1214, +1148,1214,1147, +1214,1148,1215, +1149,1215,1148, +1215,1149,1216, +1150,1216,1149, +1216,1150,1217, +1151,1217,1150, +1217,1151,1218, +1152,1218,1151, +1218,1152,1219, +1153,1219,1152, +1219,1153,1220, +1154,1220,1153, +1220,1154,1221, +1155,1221,1154, +1221,1155,1222, +1156,1222,1155, +1222,1156,1223, +1157,1223,1156, +1223,1157,1224, +1158,1224,1157, +1224,1158,1225, +1159,1225,1158, +1225,1159,1226, +1160,1226,1159, +1226,1160,1227, +1161,1227,1160, +1227,1161,1228, +1162,1228,1161, +1228,1162,1229, +1163,1229,1162, +1229,1163,1230, +1164,1230,1163, +1230,1164,1231, +1165,1231,1164, +1231,1165,1232, +1166,1232,1165, +1232,1166,1233, +1167,1233,1166, +1233,1167,1234, +1168,1234,1167, +1234,1168,1235, +1169,1235,1168, +1235,1169,1236, +1170,1236,1169, +1236,1170,1237, +1171,1237,1170, +1237,1171,1238, +1172,1238,1171, +1238,1172,1239, +1173,1239,1172, +1239,1173,1240, +1174,1240,1173, +1240,1174,1241, +1175,1241,1174, +1241,1175,1242, +1176,1242,1175, +1242,1176,1243, +1177,1243,1176, +1243,1177,1244, +1178,1244,1177, +1244,1178,1245, +1179,1245,1178, +1245,1179,1246, +1180,1246,1179, +1246,1180,1247, +1181,1247,1180, +1247,1181,1248, +1182,1248,1181, +1248,1182,1249, +1183,1249,1182, +1249,1183,1250, +1184,1250,1183, +1250,1184,1251, +1185,1251,1184, +1251,1185,1252, +1186,1252,1185, +1252,1186,1253, +1187,1253,1186, +1254,1188,1255, +1189,1255,1188, +1255,1189,1256, +1190,1256,1189, +1256,1190,1257, +1191,1257,1190, +1257,1191,1258, +1192,1258,1191, +1258,1192,1259, +1193,1259,1192, +1259,1193,1260, +1194,1260,1193, +1260,1194,1261, +1195,1261,1194, +1261,1195,1262, +1196,1262,1195, +1262,1196,1263, +1197,1263,1196, +1263,1197,1264, +1198,1264,1197, +1264,1198,1265, +1199,1265,1198, +1265,1199,1266, +1200,1266,1199, +1266,1200,1267, +1201,1267,1200, +1267,1201,1268, +1202,1268,1201, +1268,1202,1269, +1203,1269,1202, +1269,1203,1270, +1204,1270,1203, +1270,1204,1271, +1205,1271,1204, +1271,1205,1272, +1206,1272,1205, +1272,1206,1273, +1207,1273,1206, +1273,1207,1274, +1208,1274,1207, +1274,1208,1275, +1209,1275,1208, +1275,1209,1276, +1210,1276,1209, +1276,1210,1277, +1211,1277,1210, +1277,1211,1278, +1212,1278,1211, +1278,1212,1279, +1213,1279,1212, +1279,1213,1280, +1214,1280,1213, +1280,1214,1281, +1215,1281,1214, +1281,1215,1282, +1216,1282,1215, +1282,1216,1283, +1217,1283,1216, +1283,1217,1284, +1218,1284,1217, +1284,1218,1285, +1219,1285,1218, +1285,1219,1286, +1220,1286,1219, +1286,1220,1287, +1221,1287,1220, +1287,1221,1288, +1222,1288,1221, +1288,1222,1289, +1223,1289,1222, +1289,1223,1290, +1224,1290,1223, +1290,1224,1291, +1225,1291,1224, +1291,1225,1292, +1226,1292,1225, +1292,1226,1293, +1227,1293,1226, +1293,1227,1294, +1228,1294,1227, +1294,1228,1295, +1229,1295,1228, +1295,1229,1296, +1230,1296,1229, +1296,1230,1297, +1231,1297,1230, +1297,1231,1298, +1232,1298,1231, +1298,1232,1299, +1233,1299,1232, +1299,1233,1300, +1234,1300,1233, +1300,1234,1301, +1235,1301,1234, +1301,1235,1302, +1236,1302,1235, +1302,1236,1303, +1237,1303,1236, +1303,1237,1304, +1238,1304,1237, +1304,1238,1305, +1239,1305,1238, +1305,1239,1306, +1240,1306,1239, +1306,1240,1307, +1241,1307,1240, +1307,1241,1308, +1242,1308,1241, +1308,1242,1309, +1243,1309,1242, +1309,1243,1310, +1244,1310,1243, +1310,1244,1311, +1245,1311,1244, +1311,1245,1312, +1246,1312,1245, +1312,1246,1313, +1247,1313,1246, +1313,1247,1314, +1248,1314,1247, +1314,1248,1315, +1249,1315,1248, +1315,1249,1316, +1250,1316,1249, +1316,1250,1317, +1251,1317,1250, +1317,1251,1318, +1252,1318,1251, +1318,1252,1319, +1253,1319,1252, +1320,1254,1321, +1255,1321,1254, +1321,1255,1322, +1256,1322,1255, +1322,1256,1323, +1257,1323,1256, +1323,1257,1324, +1258,1324,1257, +1324,1258,1325, +1259,1325,1258, +1325,1259,1326, +1260,1326,1259, +1326,1260,1327, +1261,1327,1260, +1327,1261,1328, +1262,1328,1261, +1328,1262,1329, +1263,1329,1262, +1329,1263,1330, +1264,1330,1263, +1330,1264,1331, +1265,1331,1264, +1331,1265,1332, +1266,1332,1265, +1332,1266,1333, +1267,1333,1266, +1333,1267,1334, +1268,1334,1267, +1334,1268,1335, +1269,1335,1268, +1335,1269,1336, +1270,1336,1269, +1336,1270,1337, +1271,1337,1270, +1337,1271,1338, +1272,1338,1271, +1338,1272,1339, +1273,1339,1272, +1339,1273,1340, +1274,1340,1273, +1340,1274,1341, +1275,1341,1274, +1341,1275,1342, +1276,1342,1275, +1342,1276,1343, +1277,1343,1276, +1343,1277,1344, +1278,1344,1277, +1344,1278,1345, +1279,1345,1278, +1345,1279,1346, +1280,1346,1279, +1346,1280,1347, +1281,1347,1280, +1347,1281,1348, +1282,1348,1281, +1348,1282,1349, +1283,1349,1282, +1349,1283,1350, +1284,1350,1283, +1350,1284,1351, +1285,1351,1284, +1351,1285,1352, +1286,1352,1285, +1352,1286,1353, +1287,1353,1286, +1353,1287,1354, +1288,1354,1287, +1354,1288,1355, +1289,1355,1288, +1355,1289,1356, +1290,1356,1289, +1356,1290,1357, +1291,1357,1290, +1357,1291,1358, +1292,1358,1291, +1358,1292,1359, +1293,1359,1292, +1359,1293,1360, +1294,1360,1293, +1360,1294,1361, +1295,1361,1294, +1361,1295,1362, +1296,1362,1295, +1362,1296,1363, +1297,1363,1296, +1363,1297,1364, +1298,1364,1297, +1364,1298,1365, +1299,1365,1298, +1365,1299,1366, +1300,1366,1299, +1366,1300,1367, +1301,1367,1300, +1367,1301,1368, +1302,1368,1301, +1368,1302,1369, +1303,1369,1302, +1369,1303,1370, +1304,1370,1303, +1370,1304,1371, +1305,1371,1304, +1371,1305,1372, +1306,1372,1305, +1372,1306,1373, +1307,1373,1306, +1373,1307,1374, +1308,1374,1307, +1374,1308,1375, +1309,1375,1308, +1375,1309,1376, +1310,1376,1309, +1376,1310,1377, +1311,1377,1310, +1377,1311,1378, +1312,1378,1311, +1378,1312,1379, +1313,1379,1312, +1379,1313,1380, +1314,1380,1313, +1380,1314,1381, +1315,1381,1314, +1381,1315,1382, +1316,1382,1315, +1382,1316,1383, +1317,1383,1316, +1383,1317,1384, +1318,1384,1317, +1384,1318,1385, +1319,1385,1318, +1386,1320,1387, +1321,1387,1320, +1387,1321,1388, +1322,1388,1321, +1388,1322,1389, +1323,1389,1322, +1389,1323,1390, +1324,1390,1323, +1390,1324,1391, +1325,1391,1324, +1391,1325,1392, +1326,1392,1325, +1392,1326,1393, +1327,1393,1326, +1393,1327,1394, +1328,1394,1327, +1394,1328,1395, +1329,1395,1328, +1395,1329,1396, +1330,1396,1329, +1396,1330,1397, +1331,1397,1330, +1397,1331,1398, +1332,1398,1331, +1398,1332,1399, +1333,1399,1332, +1399,1333,1400, +1334,1400,1333, +1400,1334,1401, +1335,1401,1334, +1401,1335,1402, +1336,1402,1335, +1402,1336,1403, +1337,1403,1336, +1403,1337,1404, +1338,1404,1337, +1404,1338,1405, +1339,1405,1338, +1405,1339,1406, +1340,1406,1339, +1406,1340,1407, +1341,1407,1340, +1407,1341,1408, +1342,1408,1341, +1408,1342,1409, +1343,1409,1342, +1409,1343,1410, +1344,1410,1343, +1410,1344,1411, +1345,1411,1344, +1411,1345,1412, +1346,1412,1345, +1412,1346,1413, +1347,1413,1346, +1413,1347,1414, +1348,1414,1347, +1414,1348,1415, +1349,1415,1348, +1415,1349,1416, +1350,1416,1349, +1416,1350,1417, +1351,1417,1350, +1417,1351,1418, +1352,1418,1351, +1418,1352,1419, +1353,1419,1352, +1419,1353,1420, +1354,1420,1353, +1420,1354,1421, +1355,1421,1354, +1421,1355,1422, +1356,1422,1355, +1422,1356,1423, +1357,1423,1356, +1423,1357,1424, +1358,1424,1357, +1424,1358,1425, +1359,1425,1358, +1425,1359,1426, +1360,1426,1359, +1426,1360,1427, +1361,1427,1360, +1427,1361,1428, +1362,1428,1361, +1428,1362,1429, +1363,1429,1362, +1429,1363,1430, +1364,1430,1363, +1430,1364,1431, +1365,1431,1364, +1431,1365,1432, +1366,1432,1365, +1432,1366,1433, +1367,1433,1366, +1433,1367,1434, +1368,1434,1367, +1434,1368,1435, +1369,1435,1368, +1435,1369,1436, +1370,1436,1369, +1436,1370,1437, +1371,1437,1370, +1437,1371,1438, +1372,1438,1371, +1438,1372,1439, +1373,1439,1372, +1439,1373,1440, +1374,1440,1373, +1440,1374,1441, +1375,1441,1374, +1441,1375,1442, +1376,1442,1375, +1442,1376,1443, +1377,1443,1376, +1443,1377,1444, +1378,1444,1377, +1444,1378,1445, +1379,1445,1378, +1445,1379,1446, +1380,1446,1379, +1446,1380,1447, +1381,1447,1380, +1447,1381,1448, +1382,1448,1381, +1448,1382,1449, +1383,1449,1382, +1449,1383,1450, +1384,1450,1383, +1450,1384,1451, +1385,1451,1384, +1452,1386,1453, +1387,1453,1386, +1453,1387,1454, +1388,1454,1387, +1454,1388,1455, +1389,1455,1388, +1455,1389,1456, +1390,1456,1389, +1456,1390,1457, +1391,1457,1390, +1457,1391,1458, +1392,1458,1391, +1458,1392,1459, +1393,1459,1392, +1459,1393,1460, +1394,1460,1393, +1460,1394,1461, +1395,1461,1394, +1461,1395,1462, +1396,1462,1395, +1462,1396,1463, +1397,1463,1396, +1463,1397,1464, +1398,1464,1397, +1464,1398,1465, +1399,1465,1398, +1465,1399,1466, +1400,1466,1399, +1466,1400,1467, +1401,1467,1400, +1467,1401,1468, +1402,1468,1401, +1468,1402,1469, +1403,1469,1402, +1469,1403,1470, +1404,1470,1403, +1470,1404,1471, +1405,1471,1404, +1471,1405,1472, +1406,1472,1405, +1472,1406,1473, +1407,1473,1406, +1473,1407,1474, +1408,1474,1407, +1474,1408,1475, +1409,1475,1408, +1475,1409,1476, +1410,1476,1409, +1476,1410,1477, +1411,1477,1410, +1477,1411,1478, +1412,1478,1411, +1478,1412,1479, +1413,1479,1412, +1479,1413,1480, +1414,1480,1413, +1480,1414,1481, +1415,1481,1414, +1481,1415,1482, +1416,1482,1415, +1482,1416,1483, +1417,1483,1416, +1483,1417,1484, +1418,1484,1417, +1484,1418,1485, +1419,1485,1418, +1485,1419,1486, +1420,1486,1419, +1486,1420,1487, +1421,1487,1420, +1487,1421,1488, +1422,1488,1421, +1488,1422,1489, +1423,1489,1422, +1489,1423,1490, +1424,1490,1423, +1490,1424,1491, +1425,1491,1424, +1491,1425,1492, +1426,1492,1425, +1492,1426,1493, +1427,1493,1426, +1493,1427,1494, +1428,1494,1427, +1494,1428,1495, +1429,1495,1428, +1495,1429,1496, +1430,1496,1429, +1496,1430,1497, +1431,1497,1430, +1497,1431,1498, +1432,1498,1431, +1498,1432,1499, +1433,1499,1432, +1499,1433,1500, +1434,1500,1433, +1500,1434,1501, +1435,1501,1434, +1501,1435,1502, +1436,1502,1435, +1502,1436,1503, +1437,1503,1436, +1503,1437,1504, +1438,1504,1437, +1504,1438,1505, +1439,1505,1438, +1505,1439,1506, +1440,1506,1439, +1506,1440,1507, +1441,1507,1440, +1507,1441,1508, +1442,1508,1441, +1508,1442,1509, +1443,1509,1442, +1509,1443,1510, +1444,1510,1443, +1510,1444,1511, +1445,1511,1444, +1511,1445,1512, +1446,1512,1445, +1512,1446,1513, +1447,1513,1446, +1513,1447,1514, +1448,1514,1447, +1514,1448,1515, +1449,1515,1448, +1515,1449,1516, +1450,1516,1449, +1516,1450,1517, +1451,1517,1450, +1518,1452,1519, +1453,1519,1452, +1519,1453,1520, +1454,1520,1453, +1520,1454,1521, +1455,1521,1454, +1521,1455,1522, +1456,1522,1455, +1522,1456,1523, +1457,1523,1456, +1523,1457,1524, +1458,1524,1457, +1524,1458,1525, +1459,1525,1458, +1525,1459,1526, +1460,1526,1459, +1526,1460,1527, +1461,1527,1460, +1527,1461,1528, +1462,1528,1461, +1528,1462,1529, +1463,1529,1462, +1529,1463,1530, +1464,1530,1463, +1530,1464,1531, +1465,1531,1464, +1531,1465,1532, +1466,1532,1465, +1532,1466,1533, +1467,1533,1466, +1533,1467,1534, +1468,1534,1467, +1534,1468,1535, +1469,1535,1468, +1535,1469,1536, +1470,1536,1469, +1536,1470,1537, +1471,1537,1470, +1537,1471,1538, +1472,1538,1471, +1538,1472,1539, +1473,1539,1472, +1539,1473,1540, +1474,1540,1473, +1540,1474,1541, +1475,1541,1474, +1541,1475,1542, +1476,1542,1475, +1542,1476,1543, +1477,1543,1476, +1543,1477,1544, +1478,1544,1477, +1544,1478,1545, +1479,1545,1478, +1545,1479,1546, +1480,1546,1479, +1546,1480,1547, +1481,1547,1480, +1547,1481,1548, +1482,1548,1481, +1548,1482,1549, +1483,1549,1482, +1549,1483,1550, +1484,1550,1483, +1550,1484,1551, +1485,1551,1484, +1551,1485,1552, +1486,1552,1485, +1552,1486,1553, +1487,1553,1486, +1553,1487,1554, +1488,1554,1487, +1554,1488,1555, +1489,1555,1488, +1555,1489,1556, +1490,1556,1489, +1556,1490,1557, +1491,1557,1490, +1557,1491,1558, +1492,1558,1491, +1558,1492,1559, +1493,1559,1492, +1559,1493,1560, +1494,1560,1493, +1560,1494,1561, +1495,1561,1494, +1561,1495,1562, +1496,1562,1495, +1562,1496,1563, +1497,1563,1496, +1563,1497,1564, +1498,1564,1497, +1564,1498,1565, +1499,1565,1498, +1565,1499,1566, +1500,1566,1499, +1566,1500,1567, +1501,1567,1500, +1567,1501,1568, +1502,1568,1501, +1568,1502,1569, +1503,1569,1502, +1569,1503,1570, +1504,1570,1503, +1570,1504,1571, +1505,1571,1504, +1571,1505,1572, +1506,1572,1505, +1572,1506,1573, +1507,1573,1506, +1573,1507,1574, +1508,1574,1507, +1574,1508,1575, +1509,1575,1508, +1575,1509,1576, +1510,1576,1509, +1576,1510,1577, +1511,1577,1510, +1577,1511,1578, +1512,1578,1511, +1578,1512,1579, +1513,1579,1512, +1579,1513,1580, +1514,1580,1513, +1580,1514,1581, +1515,1581,1514, +1581,1515,1582, +1516,1582,1515, +1582,1516,1583, +1517,1583,1516, +1584,1518,1585, +1519,1585,1518, +1585,1519,1586, +1520,1586,1519, +1586,1520,1587, +1521,1587,1520, +1587,1521,1588, +1522,1588,1521, +1588,1522,1589, +1523,1589,1522, +1589,1523,1590, +1524,1590,1523, +1590,1524,1591, +1525,1591,1524, +1591,1525,1592, +1526,1592,1525, +1592,1526,1593, +1527,1593,1526, +1593,1527,1594, +1528,1594,1527, +1594,1528,1595, +1529,1595,1528, +1595,1529,1596, +1530,1596,1529, +1596,1530,1597, +1531,1597,1530, +1597,1531,1598, +1532,1598,1531, +1598,1532,1599, +1533,1599,1532, +1599,1533,1600, +1534,1600,1533, +1600,1534,1601, +1535,1601,1534, +1601,1535,1602, +1536,1602,1535, +1602,1536,1603, +1537,1603,1536, +1603,1537,1604, +1538,1604,1537, +1604,1538,1605, +1539,1605,1538, +1605,1539,1606, +1540,1606,1539, +1606,1540,1607, +1541,1607,1540, +1607,1541,1608, +1542,1608,1541, +1608,1542,1609, +1543,1609,1542, +1609,1543,1610, +1544,1610,1543, +1610,1544,1611, +1545,1611,1544, +1611,1545,1612, +1546,1612,1545, +1612,1546,1613, +1547,1613,1546, +1613,1547,1614, +1548,1614,1547, +1614,1548,1615, +1549,1615,1548, +1615,1549,1616, +1550,1616,1549, +1616,1550,1617, +1551,1617,1550, +1617,1551,1618, +1552,1618,1551, +1618,1552,1619, +1553,1619,1552, +1619,1553,1620, +1554,1620,1553, +1620,1554,1621, +1555,1621,1554, +1621,1555,1622, +1556,1622,1555, +1622,1556,1623, +1557,1623,1556, +1623,1557,1624, +1558,1624,1557, +1624,1558,1625, +1559,1625,1558, +1625,1559,1626, +1560,1626,1559, +1626,1560,1627, +1561,1627,1560, +1627,1561,1628, +1562,1628,1561, +1628,1562,1629, +1563,1629,1562, +1629,1563,1630, +1564,1630,1563, +1630,1564,1631, +1565,1631,1564, +1631,1565,1632, +1566,1632,1565, +1632,1566,1633, +1567,1633,1566, +1633,1567,1634, +1568,1634,1567, +1634,1568,1635, +1569,1635,1568, +1635,1569,1636, +1570,1636,1569, +1636,1570,1637, +1571,1637,1570, +1637,1571,1638, +1572,1638,1571, +1638,1572,1639, +1573,1639,1572, +1639,1573,1640, +1574,1640,1573, +1640,1574,1641, +1575,1641,1574, +1641,1575,1642, +1576,1642,1575, +1642,1576,1643, +1577,1643,1576, +1643,1577,1644, +1578,1644,1577, +1644,1578,1645, +1579,1645,1578, +1645,1579,1646, +1580,1646,1579, +1646,1580,1647, +1581,1647,1580, +1647,1581,1648, +1582,1648,1581, +1648,1582,1649, +1583,1649,1582, +1650,1584,1651, +1585,1651,1584, +1651,1585,1652, +1586,1652,1585, +1652,1586,1653, +1587,1653,1586, +1653,1587,1654, +1588,1654,1587, +1654,1588,1655, +1589,1655,1588, +1655,1589,1656, +1590,1656,1589, +1656,1590,1657, +1591,1657,1590, +1657,1591,1658, +1592,1658,1591, +1658,1592,1659, +1593,1659,1592, +1659,1593,1660, +1594,1660,1593, +1660,1594,1661, +1595,1661,1594, +1661,1595,1662, +1596,1662,1595, +1662,1596,1663, +1597,1663,1596, +1663,1597,1664, +1598,1664,1597, +1664,1598,1665, +1599,1665,1598, +1665,1599,1666, +1600,1666,1599, +1666,1600,1667, +1601,1667,1600, +1667,1601,1668, +1602,1668,1601, +1668,1602,1669, +1603,1669,1602, +1669,1603,1670, +1604,1670,1603, +1670,1604,1671, +1605,1671,1604, +1671,1605,1672, +1606,1672,1605, +1672,1606,1673, +1607,1673,1606, +1673,1607,1674, +1608,1674,1607, +1674,1608,1675, +1609,1675,1608, +1675,1609,1676, +1610,1676,1609, +1676,1610,1677, +1611,1677,1610, +1677,1611,1678, +1612,1678,1611, +1678,1612,1679, +1613,1679,1612, +1679,1613,1680, +1614,1680,1613, +1680,1614,1681, +1615,1681,1614, +1681,1615,1682, +1616,1682,1615, +1682,1616,1683, +1617,1683,1616, +1683,1617,1684, +1618,1684,1617, +1684,1618,1685, +1619,1685,1618, +1685,1619,1686, +1620,1686,1619, +1686,1620,1687, +1621,1687,1620, +1687,1621,1688, +1622,1688,1621, +1688,1622,1689, +1623,1689,1622, +1689,1623,1690, +1624,1690,1623, +1690,1624,1691, +1625,1691,1624, +1691,1625,1692, +1626,1692,1625, +1692,1626,1693, +1627,1693,1626, +1693,1627,1694, +1628,1694,1627, +1694,1628,1695, +1629,1695,1628, +1695,1629,1696, +1630,1696,1629, +1696,1630,1697, +1631,1697,1630, +1697,1631,1698, +1632,1698,1631, +1698,1632,1699, +1633,1699,1632, +1699,1633,1700, +1634,1700,1633, +1700,1634,1701, +1635,1701,1634, +1701,1635,1702, +1636,1702,1635, +1702,1636,1703, +1637,1703,1636, +1703,1637,1704, +1638,1704,1637, +1704,1638,1705, +1639,1705,1638, +1705,1639,1706, +1640,1706,1639, +1706,1640,1707, +1641,1707,1640, +1707,1641,1708, +1642,1708,1641, +1708,1642,1709, +1643,1709,1642, +1709,1643,1710, +1644,1710,1643, +1710,1644,1711, +1645,1711,1644, +1711,1645,1712, +1646,1712,1645, +1712,1646,1713, +1647,1713,1646, +1713,1647,1714, +1648,1714,1647, +1714,1648,1715, +1649,1715,1648, +1716,1650,1717, +1651,1717,1650, +1717,1651,1718, +1652,1718,1651, +1718,1652,1719, +1653,1719,1652, +1719,1653,1720, +1654,1720,1653, +1720,1654,1721, +1655,1721,1654, +1721,1655,1722, +1656,1722,1655, +1722,1656,1723, +1657,1723,1656, +1723,1657,1724, +1658,1724,1657, +1724,1658,1725, +1659,1725,1658, +1725,1659,1726, +1660,1726,1659, +1726,1660,1727, +1661,1727,1660, +1727,1661,1728, +1662,1728,1661, +1728,1662,1729, +1663,1729,1662, +1729,1663,1730, +1664,1730,1663, +1730,1664,1731, +1665,1731,1664, +1731,1665,1732, +1666,1732,1665, +1732,1666,1733, +1667,1733,1666, +1733,1667,1734, +1668,1734,1667, +1734,1668,1735, +1669,1735,1668, +1735,1669,1736, +1670,1736,1669, +1736,1670,1737, +1671,1737,1670, +1737,1671,1738, +1672,1738,1671, +1738,1672,1739, +1673,1739,1672, +1739,1673,1740, +1674,1740,1673, +1740,1674,1741, +1675,1741,1674, +1741,1675,1742, +1676,1742,1675, +1742,1676,1743, +1677,1743,1676, +1743,1677,1744, +1678,1744,1677, +1744,1678,1745, +1679,1745,1678, +1745,1679,1746, +1680,1746,1679, +1746,1680,1747, +1681,1747,1680, +1747,1681,1748, +1682,1748,1681, +1748,1682,1749, +1683,1749,1682, +1749,1683,1750, +1684,1750,1683, +1750,1684,1751, +1685,1751,1684, +1751,1685,1752, +1686,1752,1685, +1752,1686,1753, +1687,1753,1686, +1753,1687,1754, +1688,1754,1687, +1754,1688,1755, +1689,1755,1688, +1755,1689,1756, +1690,1756,1689, +1756,1690,1757, +1691,1757,1690, +1757,1691,1758, +1692,1758,1691, +1758,1692,1759, +1693,1759,1692, +1759,1693,1760, +1694,1760,1693, +1760,1694,1761, +1695,1761,1694, +1761,1695,1762, +1696,1762,1695, +1762,1696,1763, +1697,1763,1696, +1763,1697,1764, +1698,1764,1697, +1764,1698,1765, +1699,1765,1698, +1765,1699,1766, +1700,1766,1699, +1766,1700,1767, +1701,1767,1700, +1767,1701,1768, +1702,1768,1701, +1768,1702,1769, +1703,1769,1702, +1769,1703,1770, +1704,1770,1703, +1770,1704,1771, +1705,1771,1704, +1771,1705,1772, +1706,1772,1705, +1772,1706,1773, +1707,1773,1706, +1773,1707,1774, +1708,1774,1707, +1774,1708,1775, +1709,1775,1708, +1775,1709,1776, +1710,1776,1709, +1776,1710,1777, +1711,1777,1710, +1777,1711,1778, +1712,1778,1711, +1778,1712,1779, +1713,1779,1712, +1779,1713,1780, +1714,1780,1713, +1780,1714,1781, +1715,1781,1714, +1782,1716,1783, +1717,1783,1716, +1783,1717,1784, +1718,1784,1717, +1784,1718,1785, +1719,1785,1718, +1785,1719,1786, +1720,1786,1719, +1786,1720,1787, +1721,1787,1720, +1787,1721,1788, +1722,1788,1721, +1788,1722,1789, +1723,1789,1722, +1789,1723,1790, +1724,1790,1723, +1790,1724,1791, +1725,1791,1724, +1791,1725,1792, +1726,1792,1725, +1792,1726,1793, +1727,1793,1726, +1793,1727,1794, +1728,1794,1727, +1794,1728,1795, +1729,1795,1728, +1795,1729,1796, +1730,1796,1729, +1796,1730,1797, +1731,1797,1730, +1797,1731,1798, +1732,1798,1731, +1798,1732,1799, +1733,1799,1732, +1799,1733,1800, +1734,1800,1733, +1800,1734,1801, +1735,1801,1734, +1801,1735,1802, +1736,1802,1735, +1802,1736,1803, +1737,1803,1736, +1803,1737,1804, +1738,1804,1737, +1804,1738,1805, +1739,1805,1738, +1805,1739,1806, +1740,1806,1739, +1806,1740,1807, +1741,1807,1740, +1807,1741,1808, +1742,1808,1741, +1808,1742,1809, +1743,1809,1742, +1809,1743,1810, +1744,1810,1743, +1810,1744,1811, +1745,1811,1744, +1811,1745,1812, +1746,1812,1745, +1812,1746,1813, +1747,1813,1746, +1813,1747,1814, +1748,1814,1747, +1814,1748,1815, +1749,1815,1748, +1815,1749,1816, +1750,1816,1749, +1816,1750,1817, +1751,1817,1750, +1817,1751,1818, +1752,1818,1751, +1818,1752,1819, +1753,1819,1752, +1819,1753,1820, +1754,1820,1753, +1820,1754,1821, +1755,1821,1754, +1821,1755,1822, +1756,1822,1755, +1822,1756,1823, +1757,1823,1756, +1823,1757,1824, +1758,1824,1757, +1824,1758,1825, +1759,1825,1758, +1825,1759,1826, +1760,1826,1759, +1826,1760,1827, +1761,1827,1760, +1827,1761,1828, +1762,1828,1761, +1828,1762,1829, +1763,1829,1762, +1829,1763,1830, +1764,1830,1763, +1830,1764,1831, +1765,1831,1764, +1831,1765,1832, +1766,1832,1765, +1832,1766,1833, +1767,1833,1766, +1833,1767,1834, +1768,1834,1767, +1834,1768,1835, +1769,1835,1768, +1835,1769,1836, +1770,1836,1769, +1836,1770,1837, +1771,1837,1770, +1837,1771,1838, +1772,1838,1771, +1838,1772,1839, +1773,1839,1772, +1839,1773,1840, +1774,1840,1773, +1840,1774,1841, +1775,1841,1774, +1841,1775,1842, +1776,1842,1775, +1842,1776,1843, +1777,1843,1776, +1843,1777,1844, +1778,1844,1777, +1844,1778,1845, +1779,1845,1778, +1845,1779,1846, +1780,1846,1779, +1846,1780,1847, +1781,1847,1780, +1848,1782,1849, +1783,1849,1782, +1849,1783,1850, +1784,1850,1783, +1850,1784,1851, +1785,1851,1784, +1851,1785,1852, +1786,1852,1785, +1852,1786,1853, +1787,1853,1786, +1853,1787,1854, +1788,1854,1787, +1854,1788,1855, +1789,1855,1788, +1855,1789,1856, +1790,1856,1789, +1856,1790,1857, +1791,1857,1790, +1857,1791,1858, +1792,1858,1791, +1858,1792,1859, +1793,1859,1792, +1859,1793,1860, +1794,1860,1793, +1860,1794,1861, +1795,1861,1794, +1861,1795,1862, +1796,1862,1795, +1862,1796,1863, +1797,1863,1796, +1863,1797,1864, +1798,1864,1797, +1864,1798,1865, +1799,1865,1798, +1865,1799,1866, +1800,1866,1799, +1866,1800,1867, +1801,1867,1800, +1867,1801,1868, +1802,1868,1801, +1868,1802,1869, +1803,1869,1802, +1869,1803,1870, +1804,1870,1803, +1870,1804,1871, +1805,1871,1804, +1871,1805,1872, +1806,1872,1805, +1872,1806,1873, +1807,1873,1806, +1873,1807,1874, +1808,1874,1807, +1874,1808,1875, +1809,1875,1808, +1875,1809,1876, +1810,1876,1809, +1876,1810,1877, +1811,1877,1810, +1877,1811,1878, +1812,1878,1811, +1878,1812,1879, +1813,1879,1812, +1879,1813,1880, +1814,1880,1813, +1880,1814,1881, +1815,1881,1814, +1881,1815,1882, +1816,1882,1815, +1882,1816,1883, +1817,1883,1816, +1883,1817,1884, +1818,1884,1817, +1884,1818,1885, +1819,1885,1818, +1885,1819,1886, +1820,1886,1819, +1886,1820,1887, +1821,1887,1820, +1887,1821,1888, +1822,1888,1821, +1888,1822,1889, +1823,1889,1822, +1889,1823,1890, +1824,1890,1823, +1890,1824,1891, +1825,1891,1824, +1891,1825,1892, +1826,1892,1825, +1892,1826,1893, +1827,1893,1826, +1893,1827,1894, +1828,1894,1827, +1894,1828,1895, +1829,1895,1828, +1895,1829,1896, +1830,1896,1829, +1896,1830,1897, +1831,1897,1830, +1897,1831,1898, +1832,1898,1831, +1898,1832,1899, +1833,1899,1832, +1899,1833,1900, +1834,1900,1833, +1900,1834,1901, +1835,1901,1834, +1901,1835,1902, +1836,1902,1835, +1902,1836,1903, +1837,1903,1836, +1903,1837,1904, +1838,1904,1837, +1904,1838,1905, +1839,1905,1838, +1905,1839,1906, +1840,1906,1839, +1906,1840,1907, +1841,1907,1840, +1907,1841,1908, +1842,1908,1841, +1908,1842,1909, +1843,1909,1842, +1909,1843,1910, +1844,1910,1843, +1910,1844,1911, +1845,1911,1844, +1911,1845,1912, +1846,1912,1845, +1912,1846,1913, +1847,1913,1846, +1914,1848,1915, +1849,1915,1848, +1915,1849,1916, +1850,1916,1849, +1916,1850,1917, +1851,1917,1850, +1917,1851,1918, +1852,1918,1851, +1918,1852,1919, +1853,1919,1852, +1919,1853,1920, +1854,1920,1853, +1920,1854,1921, +1855,1921,1854, +1921,1855,1922, +1856,1922,1855, +1922,1856,1923, +1857,1923,1856, +1923,1857,1924, +1858,1924,1857, +1924,1858,1925, +1859,1925,1858, +1925,1859,1926, +1860,1926,1859, +1926,1860,1927, +1861,1927,1860, +1927,1861,1928, +1862,1928,1861, +1928,1862,1929, +1863,1929,1862, +1929,1863,1930, +1864,1930,1863, +1930,1864,1931, +1865,1931,1864, +1931,1865,1932, +1866,1932,1865, +1932,1866,1933, +1867,1933,1866, +1933,1867,1934, +1868,1934,1867, +1934,1868,1935, +1869,1935,1868, +1935,1869,1936, +1870,1936,1869, +1936,1870,1937, +1871,1937,1870, +1937,1871,1938, +1872,1938,1871, +1938,1872,1939, +1873,1939,1872, +1939,1873,1940, +1874,1940,1873, +1940,1874,1941, +1875,1941,1874, +1941,1875,1942, +1876,1942,1875, +1942,1876,1943, +1877,1943,1876, +1943,1877,1944, +1878,1944,1877, +1944,1878,1945, +1879,1945,1878, +1945,1879,1946, +1880,1946,1879, +1946,1880,1947, +1881,1947,1880, +1947,1881,1948, +1882,1948,1881, +1948,1882,1949, +1883,1949,1882, +1949,1883,1950, +1884,1950,1883, +1950,1884,1951, +1885,1951,1884, +1951,1885,1952, +1886,1952,1885, +1952,1886,1953, +1887,1953,1886, +1953,1887,1954, +1888,1954,1887, +1954,1888,1955, +1889,1955,1888, +1955,1889,1956, +1890,1956,1889, +1956,1890,1957, +1891,1957,1890, +1957,1891,1958, +1892,1958,1891, +1958,1892,1959, +1893,1959,1892, +1959,1893,1960, +1894,1960,1893, +1960,1894,1961, +1895,1961,1894, +1961,1895,1962, +1896,1962,1895, +1962,1896,1963, +1897,1963,1896, +1963,1897,1964, +1898,1964,1897, +1964,1898,1965, +1899,1965,1898, +1965,1899,1966, +1900,1966,1899, +1966,1900,1967, +1901,1967,1900, +1967,1901,1968, +1902,1968,1901, +1968,1902,1969, +1903,1969,1902, +1969,1903,1970, +1904,1970,1903, +1970,1904,1971, +1905,1971,1904, +1971,1905,1972, +1906,1972,1905, +1972,1906,1973, +1907,1973,1906, +1973,1907,1974, +1908,1974,1907, +1974,1908,1975, +1909,1975,1908, +1975,1909,1976, +1910,1976,1909, +1976,1910,1977, +1911,1977,1910, +1977,1911,1978, +1912,1978,1911, +1978,1912,1979, +1913,1979,1912, +1980,1914,1981, +1915,1981,1914, +1981,1915,1982, +1916,1982,1915, +1982,1916,1983, +1917,1983,1916, +1983,1917,1984, +1918,1984,1917, +1984,1918,1985, +1919,1985,1918, +1985,1919,1986, +1920,1986,1919, +1986,1920,1987, +1921,1987,1920, +1987,1921,1988, +1922,1988,1921, +1988,1922,1989, +1923,1989,1922, +1989,1923,1990, +1924,1990,1923, +1990,1924,1991, +1925,1991,1924, +1991,1925,1992, +1926,1992,1925, +1992,1926,1993, +1927,1993,1926, +1993,1927,1994, +1928,1994,1927, +1994,1928,1995, +1929,1995,1928, +1995,1929,1996, +1930,1996,1929, +1996,1930,1997, +1931,1997,1930, +1997,1931,1998, +1932,1998,1931, +1998,1932,1999, +1933,1999,1932, +1999,1933,2000, +1934,2000,1933, +2000,1934,2001, +1935,2001,1934, +2001,1935,2002, +1936,2002,1935, +2002,1936,2003, +1937,2003,1936, +2003,1937,2004, +1938,2004,1937, +2004,1938,2005, +1939,2005,1938, +2005,1939,2006, +1940,2006,1939, +2006,1940,2007, +1941,2007,1940, +2007,1941,2008, +1942,2008,1941, +2008,1942,2009, +1943,2009,1942, +2009,1943,2010, +1944,2010,1943, +2010,1944,2011, +1945,2011,1944, +2011,1945,2012, +1946,2012,1945, +2012,1946,2013, +1947,2013,1946, +2013,1947,2014, +1948,2014,1947, +2014,1948,2015, +1949,2015,1948, +2015,1949,2016, +1950,2016,1949, +2016,1950,2017, +1951,2017,1950, +2017,1951,2018, +1952,2018,1951, +2018,1952,2019, +1953,2019,1952, +2019,1953,2020, +1954,2020,1953, +2020,1954,2021, +1955,2021,1954, +2021,1955,2022, +1956,2022,1955, +2022,1956,2023, +1957,2023,1956, +2023,1957,2024, +1958,2024,1957, +2024,1958,2025, +1959,2025,1958, +2025,1959,2026, +1960,2026,1959, +2026,1960,2027, +1961,2027,1960, +2027,1961,2028, +1962,2028,1961, +2028,1962,2029, +1963,2029,1962, +2029,1963,2030, +1964,2030,1963, +2030,1964,2031, +1965,2031,1964, +2031,1965,2032, +1966,2032,1965, +2032,1966,2033, +1967,2033,1966, +2033,1967,2034, +1968,2034,1967, +2034,1968,2035, +1969,2035,1968, +2035,1969,2036, +1970,2036,1969, +2036,1970,2037, +1971,2037,1970, +2037,1971,2038, +1972,2038,1971, +2038,1972,2039, +1973,2039,1972, +2039,1973,2040, +1974,2040,1973, +2040,1974,2041, +1975,2041,1974, +2041,1975,2042, +1976,2042,1975, +2042,1976,2043, +1977,2043,1976, +2043,1977,2044, +1978,2044,1977, +2044,1978,2045, +1979,2045,1978, +2046,1980,2047, +1981,2047,1980, +2047,1981,2048, +1982,2048,1981, +2048,1982,2049, +1983,2049,1982, +2049,1983,2050, +1984,2050,1983, +2050,1984,2051, +1985,2051,1984, +2051,1985,2052, +1986,2052,1985, +2052,1986,2053, +1987,2053,1986, +2053,1987,2054, +1988,2054,1987, +2054,1988,2055, +1989,2055,1988, +2055,1989,2056, +1990,2056,1989, +2056,1990,2057, +1991,2057,1990, +2057,1991,2058, +1992,2058,1991, +2058,1992,2059, +1993,2059,1992, +2059,1993,2060, +1994,2060,1993, +2060,1994,2061, +1995,2061,1994, +2061,1995,2062, +1996,2062,1995, +2062,1996,2063, +1997,2063,1996, +2063,1997,2064, +1998,2064,1997, +2064,1998,2065, +1999,2065,1998, +2065,1999,2066, +2000,2066,1999, +2066,2000,2067, +2001,2067,2000, +2067,2001,2068, +2002,2068,2001, +2068,2002,2069, +2003,2069,2002, +2069,2003,2070, +2004,2070,2003, +2070,2004,2071, +2005,2071,2004, +2071,2005,2072, +2006,2072,2005, +2072,2006,2073, +2007,2073,2006, +2073,2007,2074, +2008,2074,2007, +2074,2008,2075, +2009,2075,2008, +2075,2009,2076, +2010,2076,2009, +2076,2010,2077, +2011,2077,2010, +2077,2011,2078, +2012,2078,2011, +2078,2012,2079, +2013,2079,2012, +2079,2013,2080, +2014,2080,2013, +2080,2014,2081, +2015,2081,2014, +2081,2015,2082, +2016,2082,2015, +2082,2016,2083, +2017,2083,2016, +2083,2017,2084, +2018,2084,2017, +2084,2018,2085, +2019,2085,2018, +2085,2019,2086, +2020,2086,2019, +2086,2020,2087, +2021,2087,2020, +2087,2021,2088, +2022,2088,2021, +2088,2022,2089, +2023,2089,2022, +2089,2023,2090, +2024,2090,2023, +2090,2024,2091, +2025,2091,2024, +2091,2025,2092, +2026,2092,2025, +2092,2026,2093, +2027,2093,2026, +2093,2027,2094, +2028,2094,2027, +2094,2028,2095, +2029,2095,2028, +2095,2029,2096, +2030,2096,2029, +2096,2030,2097, +2031,2097,2030, +2097,2031,2098, +2032,2098,2031, +2098,2032,2099, +2033,2099,2032, +2099,2033,2100, +2034,2100,2033, +2100,2034,2101, +2035,2101,2034, +2101,2035,2102, +2036,2102,2035, +2102,2036,2103, +2037,2103,2036, +2103,2037,2104, +2038,2104,2037, +2104,2038,2105, +2039,2105,2038, +2105,2039,2106, +2040,2106,2039, +2106,2040,2107, +2041,2107,2040, +2107,2041,2108, +2042,2108,2041, +2108,2042,2109, +2043,2109,2042, +2109,2043,2110, +2044,2110,2043, +2110,2044,2111, +2045,2111,2044, +2112,2046,2113, +2047,2113,2046, +2113,2047,2114, +2048,2114,2047, +2114,2048,2115, +2049,2115,2048, +2115,2049,2116, +2050,2116,2049, +2116,2050,2117, +2051,2117,2050, +2117,2051,2118, +2052,2118,2051, +2118,2052,2119, +2053,2119,2052, +2119,2053,2120, +2054,2120,2053, +2120,2054,2121, +2055,2121,2054, +2121,2055,2122, +2056,2122,2055, +2122,2056,2123, +2057,2123,2056, +2123,2057,2124, +2058,2124,2057, +2124,2058,2125, +2059,2125,2058, +2125,2059,2126, +2060,2126,2059, +2126,2060,2127, +2061,2127,2060, +2127,2061,2128, +2062,2128,2061, +2128,2062,2129, +2063,2129,2062, +2129,2063,2130, +2064,2130,2063, +2130,2064,2131, +2065,2131,2064, +2131,2065,2132, +2066,2132,2065, +2132,2066,2133, +2067,2133,2066, +2133,2067,2134, +2068,2134,2067, +2134,2068,2135, +2069,2135,2068, +2135,2069,2136, +2070,2136,2069, +2136,2070,2137, +2071,2137,2070, +2137,2071,2138, +2072,2138,2071, +2138,2072,2139, +2073,2139,2072, +2139,2073,2140, +2074,2140,2073, +2140,2074,2141, +2075,2141,2074, +2141,2075,2142, +2076,2142,2075, +2142,2076,2143, +2077,2143,2076, +2143,2077,2144, +2078,2144,2077, +2144,2078,2145, +2079,2145,2078, +2145,2079,2146, +2080,2146,2079, +2146,2080,2147, +2081,2147,2080, +2147,2081,2148, +2082,2148,2081, +2148,2082,2149, +2083,2149,2082, +2149,2083,2150, +2084,2150,2083, +2150,2084,2151, +2085,2151,2084, +2151,2085,2152, +2086,2152,2085, +2152,2086,2153, +2087,2153,2086, +2153,2087,2154, +2088,2154,2087, +2154,2088,2155, +2089,2155,2088, +2155,2089,2156, +2090,2156,2089, +2156,2090,2157, +2091,2157,2090, +2157,2091,2158, +2092,2158,2091, +2158,2092,2159, +2093,2159,2092, +2159,2093,2160, +2094,2160,2093, +2160,2094,2161, +2095,2161,2094, +2161,2095,2162, +2096,2162,2095, +2162,2096,2163, +2097,2163,2096, +2163,2097,2164, +2098,2164,2097, +2164,2098,2165, +2099,2165,2098, +2165,2099,2166, +2100,2166,2099, +2166,2100,2167, +2101,2167,2100, +2167,2101,2168, +2102,2168,2101, +2168,2102,2169, +2103,2169,2102, +2169,2103,2170, +2104,2170,2103, +2170,2104,2171, +2105,2171,2104, +2171,2105,2172, +2106,2172,2105, +2172,2106,2173, +2107,2173,2106, +2173,2107,2174, +2108,2174,2107, +2174,2108,2175, +2109,2175,2108, +2175,2109,2176, +2110,2176,2109, +2176,2110,2177, +2111,2177,2110, +}; + +#define Landscape01VtxCount 2048 +#define Landscape01IdxCount 11718 + +btScalar Landscape01Vtx[] = { +3.90626f,0.452911f,246.094f, +3.90626f,1.52302f,250.0f, +7.8125f,1.18238f,246.094f, +7.81251f,1.7549f,250.0f, +11.7188f,2.12911f,246.094f, +11.7188f,2.62454f,250.0f, +15.625f,3.01456f,246.094f, +15.625f,3.22814f,250.0f, +19.5313f,3.97431f,246.094f, +19.5313f,3.63231f,250.0f, +23.4375f,4.08741f,246.094f, +23.4375f,4.24097f,250.0f, +27.3438f,5.8163f,246.094f, +27.3438f,5.93409f,250.0f, +31.25f,6.86809f,246.094f, +31.25f,7.34105f,250.0f, +35.1563f,8.25405f,246.094f, +35.1563f,8.62507f,250.0f, +39.0625f,8.38601f,246.094f, +39.0625f,8.68483f,250.0f, +42.9688f,6.94797f,246.094f, +42.9688f,7.71847f,250.0f, +46.875f,4.60698f,246.094f, +46.875f,6.12159f,250.0f, +50.7813f,3.6429f,246.094f, +50.7813f,5.13002f,250.0f, +54.6875f,4.01945f,246.094f, +54.6875f,5.50476f,250.0f, +58.5938f,4.05996f,246.094f, +58.5938f,5.31917f,250.0f, +62.5f,3.98995f,246.094f, +62.5f,5.51823f,250.0f, +66.4063f,5.44402f,246.094f, +66.4063f,6.80029f,250.0f, +70.3125f,6.03873f,246.094f, +70.3125f,7.41783f,250.0f, +74.2188f,6.37187f,246.094f, +74.2188f,8.16051f,250.0f, +78.125f,6.74414f,246.094f, +78.125f,8.72099f,250.0f, +82.0313f,7.37958f,246.094f, +82.0313f,10.1125f,250.0f, +85.9375f,8.97782f,246.094f, +85.9375f,10.4624f,250.0f, +89.8438f,11.0829f,246.094f, +89.8438f,11.6403f,250.0f, +93.75f,12.3286f,246.094f, +93.75f,13.1378f,250.0f, +97.6563f,13.5966f,246.094f, +97.6563f,14.2949f,250.0f, +101.563f,15.5602f,246.094f, +101.563f,16.9487f,250.0f, +105.469f,16.9944f,246.094f, +105.469f,18.1946f,250.0f, +109.375f,17.886f,246.094f, +109.375f,19.5101f,250.0f, +113.281f,18.9289f,246.094f, +113.281f,20.9286f,250.0f, +117.188f,18.9873f,246.094f, +117.188f,20.0636f,250.0f, +121.094f,18.4954f,246.094f, +121.094f,20.5657f,250.0f, +125.0f,20.1484f,246.094f, +125.0f,21.1466f,250.0f, +128.906f,20.5032f,246.094f, +128.906f,22.3026f,250.0f, +132.813f,21.212f,246.094f, +132.813f,22.9139f,250.0f, +136.719f,22.289f,246.094f, +136.719f,24.4671f,250.0f, +140.625f,23.2441f,246.094f, +140.625f,24.3276f,250.0f, +144.531f,22.4971f,246.094f, +144.531f,24.3128f,250.0f, +148.438f,22.6347f,246.094f, +148.438f,23.8291f,250.0f, +152.344f,23.5767f,246.094f, +152.344f,24.1369f,250.0f, +156.25f,25.193f,246.094f, +156.25f,24.9132f,250.0f, +160.156f,25.2521f,246.094f, +160.156f,24.7251f,250.0f, +164.063f,25.7424f,246.094f, +164.063f,24.1169f,250.0f, +167.969f,24.3269f,246.094f, +167.969f,24.6092f,250.0f, +171.875f,25.0479f,246.094f, +171.875f,24.967f,250.0f, +175.781f,25.0107f,246.094f, +175.781f,24.7879f,250.0f, +179.688f,23.583f,246.094f, +179.688f,22.6841f,250.0f, +183.594f,20.958f,246.094f, +183.594f,20.6584f,250.0f, +187.5f,19.7535f,246.094f, +187.5f,20.0313f,250.0f, +191.406f,20.4707f,246.094f, +191.406f,20.3896f,250.0f, +195.313f,19.7551f,246.094f, +195.313f,21.5643f,250.0f, +199.219f,19.698f,246.094f, +199.219f,21.5733f,250.0f, +203.125f,20.0732f,246.094f, +203.125f,20.38f,250.0f, +207.031f,19.8667f,246.094f, +207.031f,19.3779f,250.0f, +210.938f,19.4501f,246.094f, +210.938f,19.5994f,250.0f, +214.844f,19.2918f,246.094f, +214.844f,19.0966f,250.0f, +218.75f,18.7652f,246.094f, +218.75f,19.9256f,250.0f, +222.656f,18.8129f,246.094f, +222.656f,19.8704f,250.0f, +226.563f,18.3547f,246.094f, +226.563f,18.8671f,250.0f, +230.469f,16.9801f,246.094f, +230.469f,17.4931f,250.0f, +234.375f,15.6173f,246.094f, +234.375f,16.1699f,250.0f, +238.281f,15.549f,246.094f, +238.281f,15.3704f,250.0f, +242.188f,15.2468f,246.094f, +242.188f,15.0306f,250.0f, +246.094f,14.1325f,246.094f, +246.094f,14.2622f,250.0f, +250.0f,14.4063f,246.094f, +250.0f,14.3657f,250.0f, +3.90626f,2.21488f,242.188f, +7.81252f,2.28606f,242.188f, +11.7188f,3.88428f,242.188f, +15.625f,3.39117f,242.188f, +19.5313f,3.64824f,242.188f, +23.4375f,4.14072f,242.188f, +27.3438f,5.74104f,242.188f, +31.25f,6.66142f,242.188f, +35.1563f,7.31371f,242.188f, +39.0625f,7.68371f,242.188f, +42.9688f,6.99041f,242.188f, +46.875f,4.89778f,242.188f, +50.7813f,2.64913f,242.188f, +54.6875f,2.76175f,242.188f, +58.5938f,3.10499f,242.188f, +62.5f,4.61915f,242.188f, +66.4063f,5.36769f,242.188f, +70.3125f,5.41759f,242.188f, +74.2188f,5.42279f,242.188f, +78.125f,5.53934f,242.188f, +82.0313f,5.38421f,242.188f, +85.9375f,7.77227f,242.188f, +89.8438f,9.40622f,242.188f, +93.75f,11.2904f,242.188f, +97.6563f,12.0748f,242.188f, +101.563f,14.1058f,242.188f, +105.469f,15.1513f,242.188f, +109.375f,15.9477f,242.188f, +113.281f,16.843f,242.188f, +117.188f,17.2117f,242.188f, +121.094f,18.2641f,242.188f, +125.0f,18.8672f,242.188f, +128.906f,19.3239f,242.188f, +132.813f,20.1067f,242.188f, +136.719f,20.8307f,242.188f, +140.625f,21.3646f,242.188f, +144.531f,21.6047f,242.188f, +148.438f,22.2456f,242.188f, +152.344f,23.5103f,242.188f, +156.25f,24.8533f,242.188f, +160.156f,25.4504f,242.188f, +164.063f,25.9357f,242.188f, +167.969f,24.8535f,242.188f, +171.875f,25.3099f,242.188f, +175.781f,25.3494f,242.188f, +179.688f,24.2229f,242.188f, +183.594f,21.0829f,242.188f, +187.5f,19.574f,242.188f, +191.406f,19.9835f,242.188f, +195.313f,19.6061f,242.188f, +199.219f,18.9509f,242.188f, +203.125f,20.1818f,242.188f, +207.031f,19.2962f,242.188f, +210.938f,18.8908f,242.188f, +214.844f,18.7996f,242.188f, +218.75f,18.7982f,242.188f, +222.656f,18.3283f,242.188f, +226.563f,17.7287f,242.188f, +230.469f,15.6882f,242.188f, +234.375f,15.2468f,242.188f, +238.281f,15.2703f,242.188f, +242.188f,14.4812f,242.188f, +246.094f,14.5597f,242.188f, +250.0f,14.178f,242.188f, +3.90626f,3.04396f,238.281f, +7.81252f,3.88428f,238.281f, +11.7188f,4.51367f,238.281f, +15.625f,4.1993f,238.281f, +19.5313f,4.48585f,238.281f, +23.4375f,5.11452f,238.281f, +27.3438f,4.98441f,238.281f, +31.25f,5.77536f,238.281f, +35.1563f,5.42743f,238.281f, +39.0625f,6.4581f,238.281f, +42.9688f,5.55272f,238.281f, +46.875f,3.69555f,238.281f, +50.7813f,3.08321f,238.281f, +54.6875f,2.96664f,238.281f, +58.5938f,3.94595f,238.281f, +62.5f,4.71605f,238.281f, +66.4063f,5.07906f,238.281f, +70.3125f,5.39291f,238.281f, +74.2188f,4.29289f,238.281f, +78.125f,4.20855f,238.281f, +82.0313f,5.10829f,238.281f, +85.9375f,5.48654f,238.281f, +89.8438f,7.06082f,238.281f, +93.75f,8.6827f,238.281f, +97.6563f,9.99779f,238.281f, +101.563f,11.9757f,238.281f, +105.469f,12.9031f,238.281f, +109.375f,13.7947f,238.281f, +113.281f,13.6154f,238.281f, +117.188f,15.9897f,238.281f, +121.094f,18.0884f,238.281f, +125.0f,18.714f,238.281f, +128.906f,19.1457f,238.281f, +132.813f,20.0791f,238.281f, +136.719f,20.3929f,238.281f, +140.625f,20.8277f,238.281f, +144.531f,21.2111f,238.281f, +148.438f,22.5091f,238.281f, +152.344f,23.9188f,238.281f, +156.25f,25.0278f,238.281f, +160.156f,25.8335f,238.281f, +164.063f,25.6558f,238.281f, +167.969f,24.3663f,238.281f, +171.875f,30.6775f,238.281f, +175.781f,30.89f,238.281f, +179.688f,29.2543f,238.281f, +183.594f,26.6241f,238.281f, +187.5f,24.7124f,238.281f, +191.406f,23.7048f,238.281f, +195.313f,23.3839f,238.281f, +199.219f,23.312f,238.281f, +203.125f,17.5221f,238.281f, +207.031f,17.418f,238.281f, +210.938f,17.5259f,238.281f, +214.844f,18.2392f,238.281f, +218.75f,18.6793f,238.281f, +222.656f,18.3701f,238.281f, +226.563f,17.2487f,238.281f, +230.469f,16.4f,238.281f, +234.375f,15.4998f,238.281f, +238.281f,14.6207f,238.281f, +242.188f,14.3055f,238.281f, +246.094f,14.2255f,238.281f, +250.0f,14.1326f,238.281f, +3.90626f,5.19166f,234.375f, +7.81252f,4.93292f,234.375f, +11.7188f,4.03413f,234.375f, +15.625f,3.70957f,234.375f, +19.5313f,4.44484f,234.375f, +23.4375f,5.12277f,234.375f, +27.3438f,4.60029f,234.375f, +31.25f,4.55048f,234.375f, +35.1563f,4.78512f,234.375f, +39.0625f,4.94627f,234.375f, +42.9688f,5.03351f,234.375f, +46.875f,3.08166f,234.375f, +50.7813f,2.57752f,234.375f, +54.6875f,3.08533f,234.375f, +58.5938f,4.0254f,234.375f, +62.5f,4.57575f,234.375f, +66.4063f,4.67125f,234.375f, +70.3125f,4.5612f,234.375f, +74.2188f,4.232f,234.375f, +78.125f,4.1571f,234.375f, +82.0313f,4.20157f,234.375f, +85.9375f,4.29102f,234.375f, +89.8438f,5.54826f,234.375f, +93.75f,7.06094f,234.375f, +97.6563f,8.27366f,234.375f, +101.563f,9.83852f,234.375f, +105.469f,10.9262f,234.375f, +109.375f,11.7812f,234.375f, +113.281f,13.8453f,234.375f, +117.188f,15.5538f,234.375f, +121.094f,16.8977f,234.375f, +125.0f,18.2996f,234.375f, +128.906f,19.6512f,234.375f, +132.813f,19.411f,234.375f, +136.719f,19.3317f,234.375f, +140.625f,20.656f,234.375f, +144.531f,21.6048f,234.375f, +148.438f,22.2246f,234.375f, +152.344f,23.6649f,234.375f, +156.25f,24.8772f,234.375f, +160.156f,27.6423f,234.375f, +164.063f,29.4442f,234.375f, +167.969f,29.6691f,234.375f, +171.875f,30.0772f,234.375f, +175.781f,30.3189f,234.375f, +179.688f,28.7319f,234.375f, +183.594f,26.6952f,234.375f, +187.5f,25.3375f,234.375f, +191.406f,24.1666f,234.375f, +195.313f,22.5458f,234.375f, +199.219f,22.2182f,234.375f, +203.125f,22.2413f,234.375f, +207.031f,21.8533f,234.375f, +210.938f,17.4596f,234.375f, +214.844f,17.2677f,234.375f, +218.75f,16.9584f,234.375f, +222.656f,16.6188f,234.375f, +226.563f,17.4388f,234.375f, +230.469f,16.936f,234.375f, +234.375f,15.6181f,234.375f, +238.281f,15.8373f,234.375f, +242.188f,15.0881f,234.375f, +246.094f,14.2247f,234.375f, +250.0f,14.111f,234.375f, +3.90626f,5.885f,230.469f, +7.81251f,5.4786f,230.469f, +11.7188f,5.0584f,230.469f, +15.625f,4.10283f,230.469f, +19.5313f,4.10569f,230.469f, +23.4375f,4.42202f,230.469f, +27.3438f,4.27849f,230.469f, +31.25f,4.25612f,230.469f, +35.1563f,3.83542f,230.469f, +39.0625f,3.37515f,230.469f, +42.9688f,4.16288f,230.469f, +46.875f,2.84197f,230.469f, +50.7813f,2.83467f,230.469f, +54.6875f,3.07874f,230.469f, +58.5938f,3.37745f,230.469f, +62.5f,4.09612f,230.469f, +66.4063f,4.65777f,230.469f, +70.3125f,4.45712f,230.469f, +74.2188f,3.89296f,230.469f, +78.125f,3.87471f,230.469f, +82.0313f,4.64568f,230.469f, +85.9375f,5.82987f,230.469f, +89.8438f,6.40084f,230.469f, +93.75f,7.65914f,230.469f, +97.6563f,8.07052f,230.469f, +101.563f,9.86632f,230.469f, +105.469f,11.8636f,230.469f, +109.375f,12.9547f,230.469f, +113.281f,14.2745f,230.469f, +117.188f,15.6876f,230.469f, +121.094f,17.2089f,230.469f, +125.0f,18.1267f,230.469f, +128.906f,19.379f,230.469f, +132.813f,19.2097f,230.469f, +136.719f,18.9335f,230.469f, +140.625f,19.9763f,230.469f, +144.531f,21.5401f,230.469f, +148.438f,21.7302f,230.469f, +152.344f,23.0108f,230.469f, +156.25f,28.7387f,230.469f, +160.156f,28.4179f,230.469f, +164.063f,28.6483f,230.469f, +167.969f,29.5567f,230.469f, +171.875f,29.589f,230.469f, +175.781f,29.7943f,230.469f, +179.688f,28.0587f,230.469f, +183.594f,27.6387f,230.469f, +187.5f,26.92f,230.469f, +191.406f,25.7995f,230.469f, +195.313f,23.8573f,230.469f, +199.219f,22.1543f,230.469f, +203.125f,21.8606f,230.469f, +207.031f,21.7644f,230.469f, +210.938f,22.284f,230.469f, +214.844f,22.465f,230.469f, +218.75f,16.4018f,230.469f, +222.656f,16.1053f,230.469f, +226.563f,16.9553f,230.469f, +230.469f,16.9851f,230.469f, +234.375f,16.0967f,230.469f, +238.281f,15.9758f,230.469f, +242.188f,15.3258f,230.469f, +246.094f,15.2909f,230.469f, +250.0f,14.7208f,230.469f, +3.90626f,6.89682f,226.563f, +7.81251f,6.58742f,226.563f, +11.7188f,6.03516f,226.563f, +15.625f,4.72243f,226.563f, +19.5313f,3.6445f,226.563f, +23.4375f,4.35761f,226.563f, +27.3438f,4.11714f,226.563f, +31.25f,4.31125f,226.563f, +35.1563f,3.42415f,226.563f, +39.0625f,2.29216f,226.563f, +42.9688f,2.47915f,226.563f, +46.875f,2.26767f,226.563f, +50.7813f,1.11914f,226.563f, +54.6875f,2.43266f,226.563f, +58.5938f,3.88718f,226.563f, +62.5f,3.9963f,226.563f, +66.4063f,4.30547f,226.563f, +70.3125f,4.43739f,226.563f, +74.2188f,3.89069f,226.563f, +78.125f,4.12082f,226.563f, +82.0313f,5.53252f,226.563f, +85.9375f,6.38493f,226.563f, +89.8438f,6.79959f,226.563f, +93.75f,8.29598f,226.563f, +97.6563f,8.48723f,226.563f, +101.563f,9.93554f,226.563f, +105.469f,11.5657f,226.563f, +109.375f,13.0486f,226.563f, +113.281f,13.8621f,226.563f, +117.188f,14.9688f,226.563f, +121.094f,16.3799f,226.563f, +125.0f,17.1973f,226.563f, +128.906f,17.376f,226.563f, +132.813f,18.1073f,226.563f, +136.719f,18.6844f,226.563f, +140.625f,18.5161f,226.563f, +144.531f,20.7617f,226.563f, +148.438f,21.0578f,226.563f, +152.344f,26.44f,226.563f, +156.25f,27.1807f,226.563f, +160.156f,27.2962f,226.563f, +164.063f,28.0507f,226.563f, +167.969f,28.6572f,226.563f, +171.875f,28.3487f,226.563f, +175.781f,23.7294f,226.563f, +179.688f,23.1113f,226.563f, +183.594f,22.5708f,226.563f, +187.5f,22.6165f,226.563f, +191.406f,21.8697f,226.563f, +195.313f,19.9841f,226.563f, +199.219f,22.9835f,226.563f, +203.125f,22.0743f,226.563f, +207.031f,22.4886f,226.563f, +210.938f,22.2516f,226.563f, +214.844f,22.3739f,226.563f, +218.75f,22.7815f,226.563f, +222.656f,17.0366f,226.563f, +226.563f,16.1334f,226.563f, +230.469f,16.9265f,226.563f, +234.375f,17.1793f,226.563f, +238.281f,17.3365f,226.563f, +242.188f,16.1971f,226.563f, +246.094f,15.2775f,226.563f, +250.0f,15.1313f,226.563f, +3.90626f,6.81349f,222.656f, +7.81251f,7.23848f,222.656f, +11.7188f,6.09864f,222.656f, +15.625f,4.9545f,222.656f, +19.5313f,3.88133f,222.656f, +23.4375f,4.06964f,222.656f, +27.3438f,3.90589f,222.656f, +31.25f,4.08304f,222.656f, +35.1563f,3.26204f,222.656f, +39.0625f,1.53457f,222.656f, +42.9688f,1.90835f,222.656f, +46.875f,1.98509f,222.656f, +50.7813f,2.14652f,222.656f, +54.6875f,2.7418f,222.656f, +58.5938f,3.74695f,222.656f, +62.5f,4.00354f,222.656f, +66.4063f,4.38792f,222.656f, +70.3125f,3.93121f,222.656f, +74.2188f,3.42647f,222.656f, +78.125f,5.0562f,222.656f, +82.0313f,5.98572f,222.656f, +85.9375f,6.52919f,222.656f, +89.8438f,6.83394f,222.656f, +93.75f,7.48974f,222.656f, +97.6563f,8.19267f,222.656f, +101.563f,9.33438f,222.656f, +105.469f,11.8423f,222.656f, +109.375f,13.1158f,222.656f, +113.281f,13.8944f,222.656f, +117.188f,14.8014f,222.656f, +121.094f,15.4129f,222.656f, +125.0f,15.6942f,222.656f, +128.906f,16.2049f,222.656f, +132.813f,17.0318f,222.656f, +136.719f,18.5423f,222.656f, +140.625f,18.8685f,222.656f, +144.531f,19.4529f,222.656f, +148.438f,25.9153f,222.656f, +152.344f,25.6773f,222.656f, +156.25f,26.0432f,222.656f, +160.156f,26.3016f,222.656f, +164.063f,27.084f,222.656f, +167.969f,27.1073f,222.656f, +171.875f,22.7536f,222.656f, +175.781f,23.3785f,222.656f, +179.688f,23.0862f,222.656f, +183.594f,22.5993f,222.656f, +187.5f,22.0197f,222.656f, +191.406f,21.8352f,222.656f, +195.313f,20.0501f,222.656f, +199.219f,18.5797f,222.656f, +203.125f,18.2905f,222.656f, +207.031f,22.7876f,222.656f, +210.938f,21.9787f,222.656f, +214.844f,21.4782f,222.656f, +218.75f,21.5786f,222.656f, +222.656f,21.6231f,222.656f, +226.563f,17.8058f,222.656f, +230.469f,17.6169f,222.656f, +234.375f,18.3242f,222.656f, +238.281f,18.4847f,222.656f, +242.188f,17.3189f,222.656f, +246.094f,16.7726f,222.656f, +250.0f,16.587f,222.656f, +3.90627f,8.02546f,218.75f, +7.81251f,8.24803f,218.75f, +11.7188f,6.92174f,218.75f, +15.625f,5.86085f,218.75f, +19.5313f,4.56603f,218.75f, +23.4375f,3.6909f,218.75f, +27.3438f,4.26522f,218.75f, +31.25f,3.37783f,218.75f, +35.1563f,1.72339f,218.75f, +39.0625f,2.22205f,218.75f, +42.9688f,2.71848f,218.75f, +46.875f,3.1467f,218.75f, +50.7813f,3.05327f,218.75f, +54.6875f,3.19537f,218.75f, +58.5938f,3.68243f,218.75f, +62.5f,3.35279f,218.75f, +66.4063f,4.00402f,218.75f, +70.3125f,2.9244f,218.75f, +74.2188f,4.39027f,218.75f, +78.125f,5.55878f,218.75f, +82.0313f,6.38772f,218.75f, +85.9375f,6.34964f,218.75f, +89.8438f,6.80441f,218.75f, +93.75f,6.5829f,218.75f, +97.6563f,7.27657f,218.75f, +101.563f,9.67388f,218.75f, +105.469f,10.833f,218.75f, +109.375f,12.1666f,218.75f, +113.281f,13.2095f,218.75f, +117.188f,14.2491f,218.75f, +121.094f,14.6953f,218.75f, +125.0f,14.2707f,218.75f, +128.906f,15.9556f,218.75f, +132.813f,16.7068f,218.75f, +136.719f,17.6679f,218.75f, +140.625f,18.8257f,218.75f, +144.531f,24.2255f,218.75f, +148.438f,25.0749f,218.75f, +152.344f,25.9271f,218.75f, +156.25f,26.2032f,218.75f, +160.156f,24.5168f,218.75f, +164.063f,26.2403f,218.75f, +167.969f,26.6223f,218.75f, +171.875f,22.4271f,218.75f, +175.781f,23.7925f,218.75f, +179.688f,23.3478f,218.75f, +183.594f,22.2279f,218.75f, +187.5f,22.2148f,218.75f, +191.406f,20.7538f,218.75f, +195.313f,19.5131f,218.75f, +199.219f,19.4834f,218.75f, +203.125f,18.3756f,218.75f, +207.031f,18.1034f,218.75f, +210.938f,20.0003f,218.75f, +214.844f,22.2111f,218.75f, +218.75f,21.6123f,218.75f, +222.656f,22.5943f,218.75f, +226.563f,24.3115f,218.75f, +230.469f,19.0536f,218.75f, +234.375f,18.6613f,218.75f, +238.281f,18.7675f,218.75f, +242.188f,18.3163f,218.75f, +246.094f,16.7013f,218.75f, +250.0f,17.0786f,218.75f, +3.90627f,9.25513f,214.844f, +7.81251f,9.67426f,214.844f, +11.7188f,8.92139f,214.844f, +15.625f,6.90738f,214.844f, +19.5313f,6.12616f,214.844f, +23.4375f,4.98302f,214.844f, +27.3438f,3.63786f,214.844f, +31.25f,2.52097f,214.844f, +35.1563f,3.30816f,214.844f, +39.0625f,4.04406f,214.844f, +42.9688f,4.48446f,214.844f, +46.875f,4.40695f,214.844f, +50.7813f,3.7693f,214.844f, +54.6875f,2.85523f,214.844f, +58.5938f,2.56849f,214.844f, +62.5f,2.56561f,214.844f, +66.4063f,2.82937f,214.844f, +70.3125f,2.75221f,214.844f, +74.2188f,5.02974f,214.844f, +78.125f,5.7988f,214.844f, +82.0313f,6.03219f,214.844f, +85.9375f,6.27423f,214.844f, +89.8438f,6.1671f,214.844f, +93.75f,6.86893f,214.844f, +97.6563f,7.94747f,214.844f, +101.563f,9.13548f,214.844f, +105.469f,9.63636f,214.844f, +109.375f,10.3351f,214.844f, +113.281f,12.4028f,214.844f, +117.188f,13.0321f,214.844f, +121.094f,13.6284f,214.844f, +125.0f,14.3167f,214.844f, +128.906f,15.0573f,214.844f, +132.813f,16.2022f,214.844f, +136.719f,17.7526f,214.844f, +140.625f,23.7093f,214.844f, +144.531f,24.3603f,214.844f, +148.438f,24.9195f,214.844f, +152.344f,25.198f,214.844f, +156.25f,20.8225f,214.844f, +160.156f,24.5918f,214.844f, +164.063f,25.1404f,214.844f, +167.969f,26.0659f,214.844f, +171.875f,22.1485f,214.844f, +175.781f,27.7236f,214.844f, +179.688f,27.4914f,214.844f, +183.594f,26.6606f,214.844f, +187.5f,26.623f,214.844f, +191.406f,26.3244f,214.844f, +195.313f,24.8535f,214.844f, +199.219f,23.6373f,214.844f, +203.125f,21.1881f,214.844f, +207.031f,19.7509f,214.844f, +210.938f,22.3046f,214.844f, +214.844f,22.5297f,214.844f, +218.75f,22.9498f,214.844f, +222.656f,23.2271f,214.844f, +226.563f,24.89f,214.844f, +230.469f,23.5226f,214.844f, +234.375f,19.0463f,214.844f, +238.281f,17.96f,214.844f, +242.188f,18.8106f,214.844f, +246.094f,17.3168f,214.844f, +250.0f,16.7955f,214.844f, +3.90627f,10.5728f,210.938f, +7.81251f,9.81018f,210.938f, +11.7188f,9.69715f,210.938f, +15.625f,8.42137f,210.938f, +19.5313f,7.09174f,210.938f, +23.4375f,6.45357f,210.938f, +27.3438f,4.58257f,210.938f, +31.25f,4.31044f,210.938f, +35.1563f,4.23584f,210.938f, +39.0625f,4.77527f,210.938f, +42.9688f,5.51217f,210.938f, +46.875f,5.48962f,210.938f, +50.7813f,4.50211f,210.938f, +54.6875f,4.06287f,210.938f, +58.5938f,3.43161f,210.938f, +62.5f,3.43195f,210.938f, +66.4063f,3.64204f,210.938f, +70.3125f,5.16151f,210.938f, +74.2188f,6.72853f,210.938f, +78.125f,7.43878f,210.938f, +82.0313f,7.30716f,210.938f, +85.9375f,6.54327f,210.938f, +89.8438f,5.96003f,210.938f, +93.75f,6.45099f,210.938f, +97.6563f,8.32748f,210.938f, +101.563f,8.85186f,210.938f, +105.469f,9.64058f,210.938f, +109.375f,10.4181f,210.938f, +113.281f,11.6911f,210.938f, +117.188f,12.0508f,210.938f, +121.094f,13.1004f,210.938f, +125.0f,14.4899f,210.938f, +128.906f,15.1295f,210.938f, +132.813f,15.6195f,210.938f, +136.719f,16.9219f,210.938f, +140.625f,23.4614f,210.938f, +144.531f,24.6763f,210.938f, +148.438f,26.12f,210.938f, +152.344f,21.7533f,210.938f, +156.25f,20.7448f,210.938f, +160.156f,24.1481f,210.938f, +164.063f,26.0464f,210.938f, +167.969f,25.1633f,210.938f, +171.875f,20.8056f,210.938f, +175.781f,26.3651f,210.938f, +179.688f,25.5322f,210.938f, +183.594f,26.3828f,210.938f, +187.5f,26.3586f,210.938f, +191.406f,26.1714f,210.938f, +195.313f,25.9695f,210.938f, +199.219f,24.3505f,210.938f, +203.125f,23.872f,210.938f, +207.031f,23.0401f,210.938f, +210.938f,22.3904f,210.938f, +214.844f,22.7647f,210.938f, +218.75f,23.266f,210.938f, +222.656f,23.8563f,210.938f, +226.563f,24.6635f,210.938f, +230.469f,24.3846f,210.938f, +234.375f,18.3213f,210.938f, +238.281f,17.6531f,210.938f, +242.188f,17.8854f,210.938f, +246.094f,17.1692f,210.938f, +250.0f,16.127f,210.938f, +3.90626f,10.4539f,207.031f, +7.81251f,10.0241f,207.031f, +11.7188f,10.3861f,207.031f, +15.625f,8.84417f,207.031f, +19.5313f,8.35477f,207.031f, +23.4375f,6.48112f,207.031f, +27.3438f,6.10753f,207.031f, +31.25f,6.13796f,207.031f, +35.1563f,6.51045f,207.031f, +39.0625f,6.65278f,207.031f, +42.9688f,6.27698f,207.031f, +46.875f,5.80577f,207.031f, +50.7813f,5.90354f,207.031f, +54.6875f,5.66137f,207.031f, +58.5938f,4.67472f,207.031f, +62.5f,4.81103f,207.031f, +66.4063f,6.06764f,207.031f, +70.3125f,7.61387f,207.031f, +74.2188f,8.72682f,207.031f, +78.125f,9.33231f,207.031f, +82.0313f,8.49751f,207.031f, +85.9375f,7.85293f,207.031f, +89.8438f,7.37573f,207.031f, +93.75f,7.4561f,207.031f, +97.6563f,7.76623f,207.031f, +101.563f,8.68264f,207.031f, +105.469f,10.4373f,207.031f, +109.375f,10.4722f,207.031f, +113.281f,11.4418f,207.031f, +117.188f,12.3081f,207.031f, +121.094f,12.9224f,207.031f, +125.0f,14.3204f,207.031f, +128.906f,15.1746f,207.031f, +132.813f,14.4847f,207.031f, +136.719f,20.974f,207.031f, +140.625f,23.4669f,207.031f, +144.531f,24.9918f,207.031f, +148.438f,25.7345f,207.031f, +152.344f,21.4943f,207.031f, +156.25f,22.169f,207.031f, +160.156f,24.9739f,207.031f, +164.063f,26.4423f,207.031f, +167.969f,25.8928f,207.031f, +171.875f,20.5408f,207.031f, +175.781f,24.2294f,207.031f, +179.688f,24.4008f,207.031f, +183.594f,25.2809f,207.031f, +187.5f,25.8589f,207.031f, +191.406f,26.3716f,207.031f, +195.313f,26.0525f,207.031f, +199.219f,24.6109f,207.031f, +203.125f,24.1128f,207.031f, +207.031f,23.4731f,207.031f, +210.938f,22.6487f,207.031f, +214.844f,22.7977f,207.031f, +218.75f,18.4754f,207.031f, +222.656f,23.1848f,207.031f, +226.563f,23.1818f,207.031f, +230.469f,22.9194f,207.031f, +234.375f,19.8052f,207.031f, +238.281f,16.8602f,207.031f, +242.188f,17.1047f,207.031f, +246.094f,16.1145f,207.031f, +250.0f,15.0049f,207.031f, +3.90626f,11.4706f,203.125f, +7.81251f,11.0922f,203.125f, +11.7188f,11.454f,203.125f, +15.625f,10.399f,203.125f, +19.5313f,8.89365f,203.125f, +23.4375f,7.52605f,203.125f, +27.3438f,7.07779f,203.125f, +31.25f,7.98082f,203.125f, +35.1563f,8.78342f,203.125f, +39.0625f,8.87165f,203.125f, +42.9688f,8.39122f,203.125f, +46.875f,7.48032f,203.125f, +50.7813f,6.77944f,203.125f, +54.6875f,7.14862f,203.125f, +58.5938f,6.46173f,203.125f, +62.5f,6.73824f,203.125f, +66.4063f,7.64505f,203.125f, +70.3125f,9.22763f,203.125f, +74.2188f,9.87781f,203.125f, +78.125f,10.1574f,203.125f, +82.0313f,9.81606f,203.125f, +85.9375f,9.8669f,203.125f, +89.8438f,10.0032f,203.125f, +93.75f,9.76597f,203.125f, +97.6563f,9.2129f,203.125f, +101.563f,8.89917f,203.125f, +105.469f,9.85112f,203.125f, +109.375f,11.4827f,203.125f, +113.281f,11.8911f,203.125f, +117.188f,12.3305f,203.125f, +121.094f,13.6098f,203.125f, +125.0f,14.1477f,203.125f, +128.906f,14.7928f,203.125f, +132.813f,16.3422f,203.125f, +136.719f,22.7583f,203.125f, +140.625f,24.5881f,203.125f, +144.531f,25.3565f,203.125f, +148.438f,21.7799f,203.125f, +152.344f,24.1222f,203.125f, +156.25f,26.6774f,203.125f, +160.156f,25.7031f,203.125f, +164.063f,26.9766f,203.125f, +167.969f,25.936f,203.125f, +171.875f,19.7727f,203.125f, +175.781f,19.3015f,203.125f, +179.688f,19.2421f,203.125f, +183.594f,24.8014f,203.125f, +187.5f,25.3041f,203.125f, +191.406f,25.3226f,203.125f, +195.313f,20.0369f,203.125f, +199.219f,19.4927f,203.125f, +203.125f,23.4349f,203.125f, +207.031f,22.748f,203.125f, +210.938f,22.4583f,203.125f, +214.844f,18.8936f,203.125f, +218.75f,17.4565f,203.125f, +222.656f,18.8235f,203.125f, +226.563f,21.4749f,203.125f, +230.469f,21.7691f,203.125f, +234.375f,21.1398f,203.125f, +238.281f,15.9012f,203.125f, +242.188f,15.9735f,203.125f, +246.094f,15.2287f,203.125f, +250.0f,13.5655f,203.125f, +3.90626f,12.1184f,199.219f, +7.81251f,12.3652f,199.219f, +11.7188f,12.1177f,199.219f, +15.625f,11.107f,199.219f, +19.5313f,9.91183f,199.219f, +23.4375f,8.6581f,199.219f, +27.3438f,7.98212f,199.219f, +31.25f,9.14995f,199.219f, +35.1563f,10.2879f,199.219f, +39.0625f,10.2569f,199.219f, +42.9688f,9.58908f,199.219f, +46.875f,8.1296f,199.219f, +50.7813f,7.81944f,199.219f, +54.6875f,8.54521f,199.219f, +58.5938f,8.14627f,199.219f, +62.5f,8.60974f,199.219f, +66.4063f,9.63518f,199.219f, +70.3125f,10.5321f,199.219f, +74.2188f,10.3348f,199.219f, +78.125f,11.2806f,199.219f, +82.0313f,11.3874f,199.219f, +85.9375f,11.6949f,199.219f, +89.8438f,12.3833f,199.219f, +93.75f,12.4654f,199.219f, +97.6563f,11.369f,199.219f, +101.563f,10.2737f,199.219f, +105.469f,10.4291f,199.219f, +109.375f,11.0962f,199.219f, +113.281f,12.1388f,199.219f, +117.188f,12.5535f,199.219f, +121.094f,13.2826f,199.219f, +125.0f,15.1899f,199.219f, +128.906f,16.3486f,199.219f, +132.813f,17.6147f,199.219f, +136.719f,23.878f,199.219f, +140.625f,24.5901f,199.219f, +144.531f,26.2181f,199.219f, +148.438f,21.847f,199.219f, +152.344f,26.5018f,199.219f, +156.25f,26.2772f,199.219f, +160.156f,26.4621f,199.219f, +164.063f,26.1902f,199.219f, +167.969f,26.1086f,199.219f, +171.875f,20.7414f,199.219f, +175.781f,20.393f,199.219f, +179.688f,19.7885f,199.219f, +183.594f,20.9687f,199.219f, +187.5f,23.8625f,199.219f, +191.406f,24.0825f,199.219f, +195.313f,19.4921f,199.219f, +199.219f,20.8763f,199.219f, +203.125f,21.987f,199.219f, +207.031f,21.9212f,199.219f, +210.938f,20.0341f,199.219f, +214.844f,15.7998f,199.219f, +218.75f,15.7759f,199.219f, +222.656f,15.8963f,199.219f, +226.563f,19.8168f,199.219f, +230.469f,19.9894f,199.219f, +234.375f,19.4382f,199.219f, +238.281f,14.2335f,199.219f, +242.188f,14.9225f,199.219f, +246.094f,13.5857f,199.219f, +250.0f,11.7225f,199.219f, +3.90626f,13.8013f,195.313f, +7.81251f,13.8046f,195.313f, +11.7188f,13.1462f,195.313f, +15.625f,12.2626f,195.313f, +19.5313f,10.67f,195.313f, +23.4375f,10.0372f,195.313f, +27.3438f,9.3255f,195.313f, +31.25f,10.5057f,195.313f, +35.1563f,11.0615f,195.313f, +39.0625f,11.2421f,195.313f, +42.9688f,10.4767f,195.313f, +46.875f,9.03042f,195.313f, +50.7813f,9.47397f,195.313f, +54.6875f,9.65703f,195.313f, +58.5938f,9.6345f,195.313f, +62.5f,9.9552f,195.313f, +66.4063f,10.8427f,195.313f, +70.3125f,11.7912f,195.313f, +74.2188f,11.5822f,195.313f, +78.125f,13.07f,195.313f, +82.0313f,13.803f,195.313f, +85.9375f,12.9764f,195.313f, +89.8438f,14.639f,195.313f, +93.75f,14.6139f,195.313f, +97.6563f,13.3162f,195.313f, +101.563f,12.7402f,195.313f, +105.469f,12.8061f,195.313f, +109.375f,12.1167f,195.313f, +113.281f,12.705f,195.313f, +117.188f,12.4568f,195.313f, +121.094f,13.5698f,195.313f, +125.0f,15.1843f,195.313f, +128.906f,16.7529f,195.313f, +132.813f,19.1744f,195.313f, +136.719f,23.9261f,195.313f, +140.625f,25.9824f,195.313f, +144.531f,26.1631f,195.313f, +148.438f,21.4735f,195.313f, +152.344f,25.5313f,195.313f, +156.25f,27.0098f,195.313f, +160.156f,27.5776f,195.313f, +164.063f,27.0858f,195.313f, +167.969f,26.3007f,195.313f, +171.875f,23.4599f,195.313f, +175.781f,26.4252f,195.313f, +179.688f,21.1453f,195.313f, +183.594f,21.1021f,195.313f, +187.5f,25.1644f,195.313f, +191.406f,24.8681f,195.313f, +195.313f,24.1757f,195.313f, +199.219f,20.0013f,195.313f, +203.125f,23.6085f,195.313f, +207.031f,22.7043f,195.313f, +210.938f,17.4097f,195.313f, +214.844f,16.8216f,195.313f, +218.75f,16.2595f,195.313f, +222.656f,15.547f,195.313f, +226.563f,20.5074f,195.313f, +230.469f,20.0296f,195.313f, +234.375f,19.4594f,195.313f, +238.281f,14.3376f,195.313f, +242.188f,13.8667f,195.313f, +246.094f,12.7786f,195.313f, +250.0f,12.669f,195.313f, +3.90626f,14.3936f,191.406f, +7.81251f,14.3324f,191.406f, +11.7188f,13.5165f,191.406f, +15.625f,12.3486f,191.406f, +19.5313f,10.8996f,191.406f, +23.4375f,10.767f,191.406f, +27.3438f,12.0663f,191.406f, +31.25f,12.0032f,191.406f, +35.1563f,12.6763f,191.406f, +39.0625f,12.4746f,191.406f, +42.9688f,10.9305f,191.406f, +46.875f,11.0794f,191.406f, +50.7813f,11.2588f,191.406f, +54.6875f,11.0855f,191.406f, +58.5938f,10.1448f,191.406f, +62.5f,11.1184f,191.406f, +66.4063f,12.2266f,191.406f, +70.3125f,12.3132f,191.406f, +74.2188f,13.6918f,191.406f, +78.125f,14.4314f,191.406f, +82.0313f,14.6924f,191.406f, +85.9375f,15.6669f,191.406f, +89.8438f,16.085f,191.406f, +93.75f,16.2697f,191.406f, +97.6563f,16.3584f,191.406f, +101.563f,15.6226f,191.406f, +105.469f,14.7096f,191.406f, +109.375f,14.172f,191.406f, +113.281f,13.6538f,191.406f, +117.188f,14.6791f,191.406f, +121.094f,15.1835f,191.406f, +125.0f,16.4947f,191.406f, +128.906f,17.5173f,191.406f, +132.813f,22.4657f,191.406f, +136.719f,25.2206f,191.406f, +140.625f,26.6814f,191.406f, +144.531f,27.4657f,191.406f, +148.438f,22.8092f,191.406f, +152.344f,22.336f,191.406f, +156.25f,29.0833f,191.406f, +160.156f,29.5204f,191.406f, +164.063f,29.4008f,191.406f, +167.969f,28.5038f,191.406f, +171.875f,27.7213f,191.406f, +175.781f,27.6884f,191.406f, +179.688f,25.8434f,191.406f, +183.594f,23.3048f,191.406f, +187.5f,27.635f,191.406f, +191.406f,26.1341f,191.406f, +195.313f,26.6792f,191.406f, +199.219f,22.747f,191.406f, +203.125f,22.8472f,191.406f, +207.031f,21.8628f,191.406f, +210.938f,20.5896f,191.406f, +214.844f,20.683f,191.406f, +218.75f,15.9904f,191.406f, +222.656f,16.3766f,191.406f, +226.563f,21.611f,191.406f, +230.469f,20.8727f,191.406f, +234.375f,20.2044f,191.406f, +238.281f,15.3358f,191.406f, +242.188f,14.7065f,191.406f, +246.094f,14.4372f,191.406f, +250.0f,14.1124f,191.406f, +3.90626f,14.1738f,187.5f, +7.81252f,14.5502f,187.5f, +11.7188f,13.6083f,187.5f, +15.625f,12.2654f,187.5f, +19.5313f,11.7405f,187.5f, +23.4375f,12.3756f,187.5f, +27.3438f,14.0775f,187.5f, +31.25f,13.9675f,187.5f, +35.1563f,14.3286f,187.5f, +39.0625f,13.1055f,187.5f, +42.9688f,13.0413f,187.5f, +46.875f,13.318f,187.5f, +50.7813f,12.9383f,187.5f, +54.6875f,12.9366f,187.5f, +58.5938f,12.1308f,187.5f, +62.5f,12.8501f,187.5f, +66.4063f,13.0312f,187.5f, +70.3125f,13.1657f,187.5f, +74.2188f,14.6177f,187.5f, +78.125f,16.1865f,187.5f, +82.0313f,16.3194f,187.5f, +85.9375f,16.9023f,187.5f, +89.8438f,17.5469f,187.5f, +93.75f,18.1166f,187.5f, +97.6563f,18.7398f,187.5f, +101.563f,18.2643f,187.5f, +105.469f,17.5115f,187.5f, +109.375f,16.8559f,187.5f, +113.281f,15.8332f,187.5f, +117.188f,16.4429f,187.5f, +121.094f,17.0698f,187.5f, +125.0f,18.0389f,187.5f, +128.906f,19.8697f,187.5f, +132.813f,24.8511f,187.5f, +136.719f,26.6838f,187.5f, +140.625f,28.5323f,187.5f, +144.531f,28.756f,187.5f, +148.438f,25.5762f,187.5f, +152.344f,25.8993f,187.5f, +156.25f,29.0469f,187.5f, +160.156f,32.1254f,187.5f, +164.063f,32.1318f,187.5f, +167.969f,31.7887f,187.5f, +171.875f,30.3727f,187.5f, +175.781f,30.1222f,187.5f, +179.688f,30.3556f,187.5f, +183.594f,30.49f,187.5f, +187.5f,29.3956f,187.5f, +191.406f,30.6569f,187.5f, +195.313f,30.8632f,187.5f, +199.219f,26.1118f,187.5f, +203.125f,25.5008f,187.5f, +207.031f,24.7878f,187.5f, +210.938f,27.5453f,187.5f, +214.844f,25.5271f,187.5f, +218.75f,20.2295f,187.5f, +222.656f,17.2785f,187.5f, +226.563f,22.0337f,187.5f, +230.469f,22.1938f,187.5f, +234.375f,21.6646f,187.5f, +238.281f,16.8654f,187.5f, +242.188f,15.704f,187.5f, +246.094f,15.9973f,187.5f, +250.0f,15.209f,187.5f, +3.90626f,13.9878f,183.594f, +7.81252f,14.3413f,183.594f, +11.7188f,13.1779f,183.594f, +15.625f,12.8538f,183.594f, +19.5313f,13.9436f,183.594f, +23.4375f,14.716f,183.594f, +27.3438f,14.991f,183.594f, +31.25f,15.4235f,183.594f, +35.1563f,15.3865f,183.594f, +39.0625f,14.2459f,183.594f, +42.9688f,15.2992f,183.594f, +46.875f,16.0599f,183.594f, +50.7813f,14.8603f,183.594f, +54.6875f,14.9726f,183.594f, +58.5938f,13.6053f,183.594f, +62.5f,13.057f,183.594f, +66.4063f,13.4201f,183.594f, +70.3125f,14.0782f,183.594f, +74.2188f,15.3178f,183.594f, +78.125f,16.3995f,183.594f, +82.0313f,17.4379f,183.594f, +85.9375f,17.9502f,183.594f, +89.8438f,18.4811f,183.594f, +93.75f,19.4227f,183.594f, +97.6563f,20.1694f,183.594f, +101.563f,20.1609f,183.594f, +105.469f,19.5537f,183.594f, +109.375f,19.039f,183.594f, +113.281f,18.2247f,183.594f, +117.188f,18.6643f,183.594f, +121.094f,19.2334f,183.594f, +125.0f,20.4158f,183.594f, +128.906f,21.1136f,183.594f, +132.813f,25.6638f,183.594f, +136.719f,27.4642f,183.594f, +140.625f,29.0749f,183.594f, +144.531f,30.6966f,183.594f, +148.438f,26.933f,183.594f, +152.344f,27.9984f,183.594f, +156.25f,28.4094f,183.594f, +160.156f,33.857f,183.594f, +164.063f,34.6528f,183.594f, +167.969f,33.405f,183.594f, +171.875f,31.8412f,183.594f, +175.781f,31.8788f,183.594f, +179.688f,32.395f,183.594f, +183.594f,32.8498f,183.594f, +187.5f,28.7385f,183.594f, +191.406f,33.6253f,183.594f, +195.313f,32.9673f,183.594f, +199.219f,31.8413f,183.594f, +203.125f,26.491f,183.594f, +207.031f,29.4589f,183.594f, +210.938f,28.7843f,183.594f, +214.844f,26.577f,183.594f, +218.75f,25.0304f,183.594f, +222.656f,18.7948f,183.594f, +226.563f,23.1467f,183.594f, +230.469f,22.3329f,183.594f, +234.375f,21.6877f,183.594f, +238.281f,16.4114f,183.594f, +242.188f,16.4672f,183.594f, +246.094f,16.3324f,183.594f, +250.0f,16.0497f,183.594f, +3.90626f,14.6785f,179.688f, +7.81252f,14.4582f,179.688f, +11.7188f,13.7379f,179.688f, +15.625f,13.9816f,179.688f, +19.5313f,14.9647f,179.688f, +23.4375f,15.3633f,179.688f, +27.3438f,16.1346f,179.688f, +31.25f,16.4088f,179.688f, +35.1563f,16.195f,179.688f, +39.0625f,16.1785f,179.688f, +42.9688f,17.2534f,179.688f, +46.875f,17.329f,179.688f, +50.7813f,16.0096f,179.688f, +54.6875f,15.4766f,179.688f, +58.5938f,14.0828f,179.688f, +62.5f,12.8927f,179.688f, +66.4063f,14.1195f,179.688f, +70.3125f,14.9421f,179.688f, +74.2188f,15.9015f,179.688f, +78.125f,17.3756f,179.688f, +82.0313f,18.6339f,179.688f, +85.9375f,19.7602f,179.688f, +89.8438f,19.8522f,179.688f, +93.75f,20.5838f,179.688f, +97.6563f,21.2938f,179.688f, +101.563f,21.1808f,179.688f, +105.469f,21.4575f,179.688f, +109.375f,21.1629f,179.688f, +113.281f,20.4789f,179.688f, +117.188f,20.5729f,179.688f, +121.094f,20.3917f,179.688f, +125.0f,21.8501f,179.688f, +128.906f,22.6846f,179.688f, +132.813f,23.4145f,179.688f, +136.719f,28.3033f,179.688f, +140.625f,30.5638f,179.688f, +144.531f,32.761f,179.688f, +148.438f,29.4434f,179.688f, +152.344f,30.346f,179.688f, +156.25f,31.7037f,179.688f, +160.156f,36.287f,179.688f, +164.063f,36.7423f,179.688f, +167.969f,35.7482f,179.688f, +171.875f,30.0008f,179.688f, +175.781f,29.6748f,179.688f, +179.688f,34.5316f,179.688f, +183.594f,34.4476f,179.688f, +187.5f,34.3489f,179.688f, +191.406f,33.4208f,179.688f, +195.313f,29.5511f,179.688f, +199.219f,28.9653f,179.688f, +203.125f,28.1749f,179.688f, +207.031f,30.5574f,179.688f, +210.938f,28.6513f,179.688f, +214.844f,27.1867f,179.688f, +218.75f,20.8455f,179.688f, +222.656f,20.3256f,179.688f, +226.563f,24.3717f,179.688f, +230.469f,23.2197f,179.688f, +234.375f,21.6566f,179.688f, +238.281f,16.2487f,179.688f, +242.188f,16.7759f,179.688f, +246.094f,16.5259f,179.688f, +250.0f,15.8782f,179.688f, +3.90626f,15.2963f,175.781f, +7.81252f,15.075f,175.781f, +11.7188f,14.8069f,175.781f, +15.625f,14.4469f,175.781f, +19.5313f,15.8073f,175.781f, +23.4375f,16.5419f,175.781f, +27.3438f,16.7791f,175.781f, +31.25f,17.1945f,175.781f, +35.1563f,16.9974f,175.781f, +39.0625f,16.9655f,175.781f, +42.9688f,17.7583f,175.781f, +46.875f,18.115f,175.781f, +50.7813f,16.6524f,175.781f, +54.6875f,15.897f,175.781f, +58.5938f,15.4613f,175.781f, +62.5f,14.3684f,175.781f, +66.4063f,15.0403f,175.781f, +70.3125f,15.9604f,175.781f, +74.2188f,16.9477f,175.781f, +78.125f,18.0563f,175.781f, +82.0313f,18.8971f,175.781f, +85.9375f,20.1037f,175.781f, +89.8438f,20.3627f,175.781f, +93.75f,20.0215f,175.781f, +97.6563f,20.8917f,175.781f, +101.563f,21.8702f,175.781f, +105.469f,22.7304f,175.781f, +109.375f,22.6873f,175.781f, +113.281f,21.4896f,175.781f, +117.188f,21.3864f,175.781f, +121.094f,22.4194f,175.781f, +125.0f,23.5751f,175.781f, +128.906f,23.9616f,175.781f, +132.813f,24.6066f,175.781f, +136.719f,30.8792f,175.781f, +140.625f,31.6572f,175.781f, +144.531f,34.2264f,175.781f, +148.438f,30.9611f,175.781f, +152.344f,35.8851f,175.781f, +156.25f,38.6379f,175.781f, +160.156f,39.1098f,175.781f, +164.063f,39.046f,175.781f, +167.969f,38.0327f,175.781f, +171.875f,36.6611f,175.781f, +175.781f,36.0664f,175.781f, +179.688f,36.1227f,175.781f, +183.594f,36.0705f,175.781f, +187.5f,35.9099f,175.781f, +191.406f,30.4106f,175.781f, +195.313f,30.0475f,175.781f, +199.219f,28.9213f,175.781f, +203.125f,32.8995f,175.781f, +207.031f,31.2376f,175.781f, +210.938f,30.0194f,175.781f, +214.844f,23.402f,175.781f, +218.75f,21.7271f,175.781f, +222.656f,20.0594f,175.781f, +226.563f,25.2266f,175.781f, +230.469f,24.1549f,175.781f, +234.375f,22.0418f,175.781f, +238.281f,15.6301f,175.781f, +242.188f,15.4767f,175.781f, +246.094f,15.8876f,175.781f, +250.0f,15.1339f,175.781f, +3.90626f,16.0791f,171.875f, +7.81251f,16.012f,171.875f, +11.7188f,15.027f,171.875f, +15.625f,15.1362f,171.875f, +19.5313f,16.3622f,171.875f, +23.4375f,16.7304f,171.875f, +27.3438f,17.228f,171.875f, +31.25f,16.4882f,171.875f, +35.1563f,16.5399f,171.875f, +39.0625f,17.5505f,171.875f, +42.9688f,17.6944f,171.875f, +46.875f,17.7481f,171.875f, +50.7813f,17.4568f,171.875f, +54.6875f,16.5655f,171.875f, +58.5938f,15.4313f,171.875f, +62.5f,14.962f,171.875f, +66.4063f,15.2516f,171.875f, +70.3125f,16.3088f,171.875f, +74.2188f,17.5354f,171.875f, +78.125f,18.5759f,171.875f, +82.0313f,19.1666f,171.875f, +85.9375f,19.8244f,171.875f, +89.8438f,20.6303f,171.875f, +93.75f,20.5635f,171.875f, +97.6563f,20.5768f,171.875f, +101.563f,21.542f,171.875f, +105.469f,22.5605f,171.875f, +109.375f,23.0118f,171.875f, +113.281f,22.6086f,171.875f, +117.188f,22.8502f,171.875f, +121.094f,23.2278f,171.875f, +125.0f,24.368f,171.875f, +128.906f,25.5759f,171.875f, +132.813f,27.7217f,171.875f, +136.719f,33.4581f,171.875f, +140.625f,33.4128f,171.875f, +144.531f,34.9465f,171.875f, +148.438f,31.4923f,171.875f, +152.344f,38.6707f,171.875f, +156.25f,40.2713f,171.875f, +160.156f,40.4155f,171.875f, +164.063f,41.0232f,171.875f, +167.969f,39.781f,171.875f, +171.875f,37.8376f,171.875f, +175.781f,38.0559f,171.875f, +179.688f,32.0147f,171.875f, +183.594f,35.2298f,171.875f, +187.5f,34.7221f,171.875f, +191.406f,31.5516f,171.875f, +195.313f,28.9984f,171.875f, +199.219f,29.8767f,171.875f, +203.125f,32.6404f,171.875f, +207.031f,31.3413f,171.875f, +210.938f,28.4132f,171.875f, +214.844f,22.9909f,171.875f, +218.75f,21.3955f,171.875f, +222.656f,25.3135f,171.875f, +226.563f,25.1463f,171.875f, +230.469f,23.4716f,171.875f, +234.375f,22.494f,171.875f, +238.281f,15.9351f,171.875f, +242.188f,15.2882f,171.875f, +246.094f,14.8463f,171.875f, +250.0f,14.5269f,171.875f, +3.90626f,17.1455f,167.969f, +7.81251f,16.6981f,167.969f, +11.7188f,16.5681f,167.969f, +15.625f,16.1667f,167.969f, +19.5313f,16.3523f,167.969f, +23.4375f,16.5389f,167.969f, +27.3438f,16.8075f,167.969f, +31.25f,17.1987f,167.969f, +35.1563f,17.86f,167.969f, +39.0625f,18.5438f,167.969f, +42.9688f,18.6718f,167.969f, +46.875f,17.9387f,167.969f, +50.7813f,17.5403f,167.969f, +54.6875f,17.4895f,167.969f, +58.5938f,16.9679f,167.969f, +62.5f,16.2192f,167.969f, +66.4063f,15.5699f,167.969f, +70.3125f,17.0017f,167.969f, +74.2188f,18.0147f,167.969f, +78.125f,18.9836f,167.969f, +82.0313f,19.8197f,167.969f, +85.9375f,19.8969f,167.969f, +89.8438f,20.6411f,167.969f, +93.75f,20.9768f,167.969f, +97.6563f,21.1498f,167.969f, +101.563f,21.3269f,167.969f, +105.469f,22.1153f,167.969f, +109.375f,22.208f,167.969f, +113.281f,23.2278f,167.969f, +117.188f,24.5722f,167.969f, +121.094f,25.3921f,167.969f, +125.0f,26.2683f,167.969f, +128.906f,28.138f,167.969f, +132.813f,29.9483f,167.969f, +136.719f,34.7607f,167.969f, +140.625f,35.3745f,167.969f, +144.531f,36.1401f,167.969f, +148.438f,38.0587f,167.969f, +152.344f,40.0092f,167.969f, +156.25f,40.9205f,167.969f, +160.156f,41.4664f,167.969f, +164.063f,41.8834f,167.969f, +167.969f,40.2863f,167.969f, +171.875f,38.4111f,167.969f, +175.781f,37.4971f,167.969f, +179.688f,32.0995f,167.969f, +183.594f,36.4852f,167.969f, +187.5f,34.5523f,167.969f, +191.406f,34.4101f,167.969f, +195.313f,29.577f,167.969f, +199.219f,33.7462f,167.969f, +203.125f,33.0191f,167.969f, +207.031f,31.6651f,167.969f, +210.938f,24.6623f,167.969f, +214.844f,22.6532f,167.969f, +218.75f,21.898f,167.969f, +222.656f,26.1764f,167.969f, +226.563f,24.7619f,167.969f, +230.469f,22.6772f,167.969f, +234.375f,17.6202f,167.969f, +238.281f,16.1581f,167.969f, +242.188f,14.7308f,167.969f, +246.094f,14.294f,167.969f, +250.0f,13.1169f,167.969f, +3.90627f,16.4621f,164.063f, +7.81251f,17.581f,164.063f, +11.7188f,17.7296f,164.063f, +15.625f,17.126f,164.063f, +19.5313f,17.3484f,164.063f, +23.4375f,17.9863f,164.063f, +27.3438f,18.6623f,164.063f, +31.25f,18.7934f,164.063f, +35.1563f,18.8245f,164.063f, +39.0625f,18.9554f,164.063f, +42.9688f,19.3152f,164.063f, +46.875f,18.5996f,164.063f, +50.7813f,18.0094f,164.063f, +54.6875f,17.5702f,164.063f, +58.5938f,17.5846f,164.063f, +62.5f,17.3718f,164.063f, +66.4063f,17.7189f,164.063f, +70.3125f,17.9805f,164.063f, +74.2188f,18.2986f,164.063f, +78.125f,18.9566f,164.063f, +82.0313f,20.4142f,164.063f, +85.9375f,20.5066f,164.063f, +89.8438f,20.7654f,164.063f, +93.75f,20.9457f,164.063f, +97.6563f,21.1078f,164.063f, +101.563f,20.7505f,164.063f, +105.469f,21.4615f,164.063f, +109.375f,22.8061f,164.063f, +113.281f,24.2655f,164.063f, +117.188f,24.815f,164.063f, +121.094f,26.3141f,164.063f, +125.0f,28.393f,164.063f, +128.906f,30.0565f,164.063f, +132.813f,31.4858f,164.063f, +136.719f,31.6549f,164.063f, +140.625f,37.0597f,164.063f, +144.531f,37.7613f,164.063f, +148.438f,38.9888f,164.063f, +152.344f,39.1482f,164.063f, +156.25f,36.6367f,164.063f, +160.156f,41.2606f,164.063f, +164.063f,42.2366f,164.063f, +167.969f,40.9757f,164.063f, +171.875f,33.9016f,164.063f, +175.781f,34.1798f,164.063f, +179.688f,33.0682f,164.063f, +183.594f,35.2269f,164.063f, +187.5f,35.1129f,164.063f, +191.406f,34.7006f,164.063f, +195.313f,30.1221f,164.063f, +199.219f,34.6592f,164.063f, +203.125f,33.6195f,164.063f, +207.031f,30.0546f,164.063f, +210.938f,24.8295f,164.063f, +214.844f,23.0298f,164.063f, +218.75f,26.5636f,164.063f, +222.656f,25.7973f,164.063f, +226.563f,23.7612f,164.063f, +230.469f,22.3646f,164.063f, +234.375f,16.1956f,164.063f, +238.281f,14.863f,164.063f, +242.188f,13.95f,164.063f, +246.094f,14.1968f,164.063f, +250.0f,13.2951f,164.063f, +3.90627f,16.628f,160.156f, +7.81251f,17.4268f,160.156f, +11.7188f,18.0363f,160.156f, +15.625f,18.1287f,160.156f, +19.5313f,18.6222f,160.156f, +23.4375f,18.2801f,160.156f, +27.3438f,18.5912f,160.156f, +31.25f,18.8635f,160.156f, +35.1563f,19.2193f,160.156f, +39.0625f,18.8821f,160.156f, +42.9688f,19.0078f,160.156f, +46.875f,19.3506f,160.156f, +50.7813f,17.8504f,160.156f, +54.6875f,18.5322f,160.156f, +58.5938f,18.2223f,160.156f, +62.5f,18.032f,160.156f, +66.4063f,18.574f,160.156f, +70.3125f,18.3835f,160.156f, +74.2188f,18.0842f,160.156f, +78.125f,19.8632f,160.156f, +82.0313f,20.9487f,160.156f, +85.9375f,20.6197f,160.156f, +89.8438f,20.5117f,160.156f, +93.75f,20.4182f,160.156f, +97.6563f,19.8654f,160.156f, +101.563f,20.1971f,160.156f, +105.469f,22.0419f,160.156f, +109.375f,23.4698f,160.156f, +113.281f,24.6461f,160.156f, +117.188f,26.2207f,160.156f, +121.094f,28.1249f,160.156f, +125.0f,29.8102f,160.156f, +128.906f,31.7349f,160.156f, +132.813f,32.4376f,160.156f, +136.719f,33.2795f,160.156f, +140.625f,37.4588f,160.156f, +144.531f,38.8195f,160.156f, +148.438f,39.9622f,160.156f, +152.344f,41.6752f,160.156f, +156.25f,37.6576f,160.156f, +160.156f,41.4722f,160.156f, +164.063f,41.8372f,160.156f, +167.969f,40.7289f,160.156f, +171.875f,35.5243f,160.156f, +175.781f,34.1726f,160.156f, +179.688f,33.9628f,160.156f, +183.594f,33.3012f,160.156f, +187.5f,37.6064f,160.156f, +191.406f,36.2987f,160.156f, +195.313f,32.9836f,160.156f, +199.219f,34.2771f,160.156f, +203.125f,33.5607f,160.156f, +207.031f,26.9351f,160.156f, +210.938f,24.3584f,160.156f, +214.844f,25.5428f,160.156f, +218.75f,26.0054f,160.156f, +222.656f,24.092f,160.156f, +226.563f,22.8948f,160.156f, +230.469f,17.1899f,160.156f, +234.375f,15.0552f,160.156f, +238.281f,14.2468f,160.156f, +242.188f,13.7862f,160.156f, +246.094f,14.5132f,160.156f, +250.0f,14.3684f,160.156f, +3.90627f,16.9346f,156.25f, +7.81251f,18.2437f,156.25f, +11.7188f,18.3869f,156.25f, +15.625f,18.1055f,156.25f, +19.5313f,18.7445f,156.25f, +23.4375f,18.9235f,156.25f, +27.3438f,18.455f,156.25f, +31.25f,18.6644f,156.25f, +35.1563f,18.9448f,156.25f, +39.0625f,18.9971f,156.25f, +42.9688f,18.8628f,156.25f, +46.875f,18.6886f,156.25f, +50.7813f,18.8494f,156.25f, +54.6875f,19.4408f,156.25f, +58.5938f,18.7384f,156.25f, +62.5f,17.473f,156.25f, +66.4063f,18.5906f,156.25f, +70.3125f,18.7252f,156.25f, +74.2188f,19.5013f,156.25f, +78.125f,19.8221f,156.25f, +82.0313f,19.8648f,156.25f, +85.9375f,19.8955f,156.25f, +89.8438f,19.4401f,156.25f, +93.75f,18.7973f,156.25f, +97.6563f,18.8923f,156.25f, +101.563f,20.6151f,156.25f, +105.469f,22.9824f,156.25f, +109.375f,25.2251f,156.25f, +113.281f,26.7829f,156.25f, +117.188f,27.8131f,156.25f, +121.094f,29.6707f,156.25f, +125.0f,31.4614f,156.25f, +128.906f,32.8387f,156.25f, +132.813f,33.7834f,156.25f, +136.719f,34.3986f,156.25f, +140.625f,35.1609f,156.25f, +144.531f,40.0963f,156.25f, +148.438f,41.0412f,156.25f, +152.344f,42.0325f,156.25f, +156.25f,42.1696f,156.25f, +160.156f,41.9265f,156.25f, +164.063f,43.279f,156.25f, +167.969f,42.5995f,156.25f, +171.875f,36.6937f,156.25f, +175.781f,34.8393f,156.25f, +179.688f,34.7157f,156.25f, +183.594f,34.0579f,156.25f, +187.5f,33.7647f,156.25f, +191.406f,33.2242f,156.25f, +195.313f,32.1053f,156.25f, +199.219f,30.6563f,156.25f, +203.125f,33.623f,156.25f, +207.031f,28.0199f,156.25f, +210.938f,30.5092f,156.25f, +214.844f,29.3828f,156.25f, +218.75f,27.3486f,156.25f, +222.656f,25.8671f,156.25f, +226.563f,24.1209f,156.25f, +230.469f,17.9979f,156.25f, +234.375f,16.1304f,156.25f, +238.281f,14.8281f,156.25f, +242.188f,13.097f,156.25f, +246.094f,13.3642f,156.25f, +250.0f,13.6085f,156.25f, +3.90627f,17.6952f,152.344f, +7.81251f,19.1063f,152.344f, +11.7188f,19.6398f,152.344f, +15.625f,19.8626f,152.344f, +19.5313f,19.1453f,152.344f, +23.4375f,19.4932f,152.344f, +27.3438f,19.3908f,152.344f, +31.25f,18.6492f,152.344f, +35.1563f,18.3861f,152.344f, +39.0625f,18.198f,152.344f, +42.9688f,18.4497f,152.344f, +46.875f,17.8083f,152.344f, +50.7813f,18.5296f,152.344f, +54.6875f,19.8096f,152.344f, +58.5938f,19.3324f,152.344f, +62.5f,18.1507f,152.344f, +66.4063f,17.7998f,152.344f, +70.3125f,17.9266f,152.344f, +74.2188f,18.569f,152.344f, +78.125f,19.5043f,152.344f, +82.0313f,20.0768f,152.344f, +85.9375f,19.5187f,152.344f, +89.8438f,20.2592f,152.344f, +93.75f,19.2159f,152.344f, +97.6563f,20.1174f,152.344f, +101.563f,21.9257f,152.344f, +105.469f,23.9219f,152.344f, +109.375f,25.8476f,152.344f, +113.281f,27.9183f,152.344f, +117.188f,29.2798f,152.344f, +121.094f,30.2289f,152.344f, +125.0f,31.7495f,152.344f, +128.906f,33.1684f,152.344f, +132.813f,34.4626f,152.344f, +136.719f,35.9981f,152.344f, +140.625f,36.5168f,152.344f, +144.531f,35.9325f,152.344f, +148.438f,41.231f,152.344f, +152.344f,42.7257f,152.344f, +156.25f,43.5162f,152.344f, +160.156f,44.357f,152.344f, +164.063f,44.2347f,152.344f, +167.969f,40.2679f,152.344f, +171.875f,36.2109f,152.344f, +175.781f,36.3906f,152.344f, +179.688f,35.227f,152.344f, +183.594f,34.7006f,152.344f, +187.5f,34.7763f,152.344f, +191.406f,34.0912f,152.344f, +195.313f,32.201f,152.344f, +199.219f,30.6601f,152.344f, +203.125f,28.7526f,152.344f, +207.031f,33.0587f,152.344f, +210.938f,31.7955f,152.344f, +214.844f,29.893f,152.344f, +218.75f,27.5989f,152.344f, +222.656f,26.1347f,152.344f, +226.563f,19.6378f,152.344f, +230.469f,18.6596f,152.344f, +234.375f,17.3965f,152.344f, +238.281f,15.5807f,152.344f, +242.188f,13.4071f,152.344f, +246.094f,12.7989f,152.344f, +250.0f,12.5897f,152.344f, +3.90626f,18.4109f,148.438f, +7.81251f,18.8163f,148.438f, +11.7188f,20.7396f,148.438f, +15.625f,21.7833f,148.438f, +19.5313f,20.6586f,148.438f, +23.4375f,19.8597f,148.438f, +27.3438f,20.0951f,148.438f, +31.25f,18.7811f,148.438f, +35.1563f,18.123f,148.438f, +39.0625f,17.773f,148.438f, +42.9688f,18.0095f,148.438f, +46.875f,17.694f,148.438f, +50.7813f,17.1666f,148.438f, +54.6875f,18.3484f,148.438f, +58.5938f,18.5612f,148.438f, +62.5f,18.1324f,148.438f, +66.4063f,17.4119f,148.438f, +70.3125f,17.2873f,148.438f, +74.2188f,17.6855f,148.438f, +78.125f,18.6618f,148.438f, +82.0313f,19.6447f,148.438f, +85.9375f,19.4743f,148.438f, +89.8438f,20.2887f,148.438f, +93.75f,20.2469f,148.438f, +97.6563f,21.1802f,148.438f, +101.563f,23.2002f,148.438f, +105.469f,24.8874f,148.438f, +109.375f,26.5433f,148.438f, +113.281f,28.653f,148.438f, +117.188f,30.2347f,148.438f, +121.094f,31.6949f,148.438f, +125.0f,33.2452f,148.438f, +128.906f,34.3964f,148.438f, +132.813f,35.2835f,148.438f, +136.719f,36.7099f,148.438f, +140.625f,37.1893f,148.438f, +144.531f,36.5212f,148.438f, +148.438f,36.7413f,148.438f, +152.344f,43.9965f,148.438f, +156.25f,44.9543f,148.438f, +160.156f,44.8078f,148.438f, +164.063f,45.09f,148.438f, +167.969f,43.0871f,148.438f, +171.875f,42.2067f,148.438f, +175.781f,40.5399f,148.438f, +179.688f,35.9902f,148.438f, +183.594f,34.4093f,148.438f, +187.5f,35.1087f,148.438f, +191.406f,34.3372f,148.438f, +195.313f,35.6724f,148.438f, +199.219f,34.961f,148.438f, +203.125f,34.4106f,148.438f, +207.031f,32.0028f,148.438f, +210.938f,31.3925f,148.438f, +214.844f,29.3539f,148.438f, +218.75f,27.6213f,148.438f, +222.656f,21.6694f,148.438f, +226.563f,20.356f,148.438f, +230.469f,19.6202f,148.438f, +234.375f,17.6247f,148.438f, +238.281f,16.5152f,148.438f, +242.188f,14.901f,148.438f, +246.094f,12.7994f,148.438f, +250.0f,12.2743f,148.438f, +3.90626f,17.8758f,144.531f, +7.81251f,19.3177f,144.531f, +11.7188f,20.9214f,144.531f, +15.625f,21.8589f,144.531f, +19.5313f,21.2904f,144.531f, +23.4375f,19.9784f,144.531f, +27.3438f,19.6359f,144.531f, +31.25f,19.4398f,144.531f, +35.1563f,18.6596f,144.531f, +39.0625f,17.1967f,144.531f, +42.9688f,16.797f,144.531f, +46.875f,16.4099f,144.531f, +50.7813f,16.54f,144.531f, +54.6875f,16.811f,144.531f, +58.5938f,17.31f,144.531f, +62.5f,17.5358f,144.531f, +66.4063f,16.8495f,144.531f, +70.3125f,17.2148f,144.531f, +74.2188f,16.6285f,144.531f, +78.125f,17.7911f,144.531f, +82.0313f,18.6054f,144.531f, +85.9375f,18.787f,144.531f, +89.8438f,20.4804f,144.531f, +93.75f,21.0544f,144.531f, +97.6563f,20.9487f,144.531f, +101.563f,23.1098f,144.531f, +105.469f,25.2196f,144.531f, +109.375f,27.0389f,144.531f, +113.281f,29.4971f,144.531f, +117.188f,31.0049f,144.531f, +121.094f,33.086f,144.531f, +125.0f,34.6611f,144.531f, +128.906f,35.8626f,144.531f, +132.813f,36.8672f,144.531f, +136.719f,37.5515f,144.531f, +140.625f,37.6433f,144.531f, +144.531f,37.8923f,144.531f, +148.438f,37.1277f,144.531f, +152.344f,40.0287f,144.531f, +156.25f,44.9863f,144.531f, +160.156f,45.0845f,144.531f, +164.063f,44.7823f,144.531f, +167.969f,42.5338f,144.531f, +171.875f,41.7912f,144.531f, +175.781f,41.5762f,144.531f, +179.688f,41.3242f,144.531f, +183.594f,39.6796f,144.531f, +187.5f,39.4704f,144.531f, +191.406f,38.5401f,144.531f, +195.313f,37.3853f,144.531f, +199.219f,35.4345f,144.531f, +203.125f,34.2437f,144.531f, +207.031f,31.8218f,144.531f, +210.938f,30.6041f,144.531f, +214.844f,26.9001f,144.531f, +218.75f,22.3094f,144.531f, +222.656f,21.4446f,144.531f, +226.563f,20.6643f,144.531f, +230.469f,20.3246f,144.531f, +234.375f,18.0382f,144.531f, +238.281f,15.7854f,144.531f, +242.188f,14.3314f,144.531f, +246.094f,12.4723f,144.531f, +250.0f,12.5491f,144.531f, +3.90626f,18.5798f,140.625f, +7.81251f,19.7271f,140.625f, +11.7188f,20.8566f,140.625f, +15.625f,21.6914f,140.625f, +19.5313f,20.9288f,140.625f, +23.4375f,20.0531f,140.625f, +27.3438f,19.1655f,140.625f, +31.25f,18.7947f,140.625f, +35.1563f,18.2984f,140.625f, +39.0625f,17.3295f,140.625f, +42.9688f,16.5557f,140.625f, +46.875f,16.1679f,140.625f, +50.7813f,16.0262f,140.625f, +54.6875f,16.1659f,140.625f, +58.5938f,16.459f,140.625f, +62.5f,17.0307f,140.625f, +66.4063f,17.6303f,140.625f, +70.3125f,16.7576f,140.625f, +74.2188f,16.9614f,140.625f, +78.125f,17.3439f,140.625f, +82.0313f,17.7742f,140.625f, +85.9375f,19.0774f,140.625f, +89.8438f,20.0724f,140.625f, +93.75f,21.5734f,140.625f, +97.6563f,21.4923f,140.625f, +101.563f,24.2474f,140.625f, +105.469f,25.9666f,140.625f, +109.375f,27.8803f,140.625f, +113.281f,29.6397f,140.625f, +117.188f,32.0374f,140.625f, +121.094f,34.014f,140.625f, +125.0f,35.1589f,140.625f, +128.906f,36.2526f,140.625f, +132.813f,37.5386f,140.625f, +136.719f,38.1647f,140.625f, +140.625f,37.9014f,140.625f, +144.531f,39.0558f,140.625f, +148.438f,38.1493f,140.625f, +152.344f,39.5967f,140.625f, +156.25f,40.3409f,140.625f, +160.156f,39.4778f,140.625f, +164.063f,43.7911f,140.625f, +167.969f,42.7467f,140.625f, +171.875f,41.4394f,140.625f, +175.781f,41.222f,140.625f, +179.688f,40.9501f,140.625f, +183.594f,40.2741f,140.625f, +187.5f,40.5011f,140.625f, +191.406f,39.8634f,140.625f, +195.313f,37.8944f,140.625f, +199.219f,35.6917f,140.625f, +203.125f,33.0921f,140.625f, +207.031f,30.7497f,140.625f, +210.938f,24.355f,140.625f, +214.844f,23.6102f,140.625f, +218.75f,23.2298f,140.625f, +222.656f,21.8035f,140.625f, +226.563f,21.0813f,140.625f, +230.469f,20.4423f,140.625f, +234.375f,19.372f,140.625f, +238.281f,16.9074f,140.625f, +242.188f,15.6931f,140.625f, +246.094f,14.0046f,140.625f, +250.0f,12.7719f,140.625f, +3.90626f,19.7224f,136.719f, +7.81251f,20.3645f,136.719f, +11.7188f,20.1938f,136.719f, +15.625f,20.0122f,136.719f, +19.5313f,20.9204f,136.719f, +23.4375f,20.2208f,136.719f, +27.3438f,19.3419f,136.719f, +31.25f,18.2059f,136.719f, +35.1563f,17.6089f,136.719f, +39.0625f,17.131f,136.719f, +42.9688f,16.8349f,136.719f, +46.875f,16.3462f,136.719f, +50.7813f,15.4488f,136.719f, +54.6875f,15.7887f,136.719f, +58.5938f,16.431f,136.719f, +62.5f,16.3378f,136.719f, +66.4063f,17.4585f,136.719f, +70.3125f,17.5113f,136.719f, +74.2188f,17.6407f,136.719f, +78.125f,17.0887f,136.719f, +82.0313f,17.2555f,136.719f, +85.9375f,18.6283f,136.719f, +89.8438f,19.6874f,136.719f, +93.75f,21.0963f,136.719f, +97.6563f,21.5582f,136.719f, +101.563f,24.9129f,136.719f, +105.469f,27.5761f,136.719f, +109.375f,28.7426f,136.719f, +113.281f,31.0958f,136.719f, +117.188f,33.7564f,136.719f, +121.094f,34.6927f,136.719f, +125.0f,35.0503f,136.719f, +128.906f,36.0657f,136.719f, +132.813f,37.2001f,136.719f, +136.719f,38.5625f,136.719f, +140.625f,38.8809f,136.719f, +144.531f,39.3646f,136.719f, +148.438f,38.919f,136.719f, +152.344f,39.5251f,136.719f, +156.25f,39.5392f,136.719f, +160.156f,39.7011f,136.719f, +164.063f,38.4043f,136.719f, +167.969f,37.7232f,136.719f, +171.875f,37.8418f,136.719f, +175.781f,41.0576f,136.719f, +179.688f,40.6804f,136.719f, +183.594f,40.6431f,136.719f, +187.5f,41.2286f,136.719f, +191.406f,40.221f,136.719f, +195.313f,37.9197f,136.719f, +199.219f,30.9591f,136.719f, +203.125f,28.2027f,136.719f, +207.031f,25.2338f,136.719f, +210.938f,24.1525f,136.719f, +214.844f,23.6344f,136.719f, +218.75f,22.6246f,136.719f, +222.656f,21.3675f,136.719f, +226.563f,21.0207f,136.719f, +230.469f,20.2558f,136.719f, +234.375f,18.3661f,136.719f, +238.281f,16.7584f,136.719f, +242.188f,16.2723f,136.719f, +246.094f,14.7268f,136.719f, +250.0f,13.5973f,136.719f, +3.90626f,19.9574f,132.813f, +7.8125f,21.126f,132.813f, +11.7188f,20.9977f,132.813f, +15.625f,21.2478f,132.813f, +19.5313f,21.5981f,132.813f, +23.4375f,20.0536f,132.813f, +27.3438f,18.6025f,132.813f, +31.25f,18.166f,132.813f, +35.1563f,17.207f,132.813f, +39.0625f,17.3703f,132.813f, +42.9688f,16.3317f,132.813f, +46.875f,15.4769f,132.813f, +50.7813f,14.7771f,132.813f, +54.6875f,14.8038f,132.813f, +58.5938f,15.7291f,132.813f, +62.5f,16.2292f,132.813f, +66.4063f,17.1488f,132.813f, +70.3125f,17.5027f,132.813f, +74.2188f,16.9736f,132.813f, +78.125f,16.4014f,132.813f, +82.0313f,16.7581f,132.813f, +85.9375f,18.1894f,132.813f, +89.8438f,20.0178f,132.813f, +93.75f,20.5813f,132.813f, +97.6563f,22.5893f,132.813f, +101.563f,25.6741f,132.813f, +105.469f,28.0908f,132.813f, +109.375f,29.1124f,132.813f, +113.281f,31.4752f,132.813f, +117.188f,33.2328f,132.813f, +121.094f,34.3747f,132.813f, +125.0f,34.8849f,132.813f, +128.906f,36.3771f,132.813f, +132.813f,37.3154f,132.813f, +136.719f,38.6196f,132.813f, +140.625f,39.1474f,132.813f, +144.531f,39.5395f,132.813f, +148.438f,38.9241f,132.813f, +152.344f,39.6801f,132.813f, +156.25f,39.7675f,132.813f, +160.156f,39.4464f,132.813f, +164.063f,38.2967f,132.813f, +167.969f,37.3679f,132.813f, +171.875f,36.5147f,132.813f, +175.781f,35.9217f,132.813f, +179.688f,35.6874f,132.813f, +183.594f,36.0348f,132.813f, +187.5f,36.167f,132.813f, +191.406f,34.7462f,132.813f, +195.313f,32.5911f,132.813f, +199.219f,30.8509f,132.813f, +203.125f,27.889f,132.813f, +207.031f,25.0869f,132.813f, +210.938f,23.713f,132.813f, +214.844f,23.4714f,132.813f, +218.75f,22.2633f,132.813f, +222.656f,21.1409f,132.813f, +226.563f,20.2725f,132.813f, +230.469f,19.4678f,132.813f, +234.375f,18.4511f,132.813f, +238.281f,18.0306f,132.813f, +242.188f,17.5677f,132.813f, +246.094f,16.403f,132.813f, +250.0f,14.7316f,132.813f, +3.90626f,20.0876f,128.906f, +7.81252f,21.0764f,128.906f, +11.7188f,21.4076f,128.906f, +15.625f,22.6299f,128.906f, +19.5313f,22.1174f,128.906f, +23.4375f,20.3977f,128.906f, +27.3438f,18.7343f,128.906f, +31.25f,17.9144f,128.906f, +35.1563f,17.2941f,128.906f, +39.0625f,16.5386f,128.906f, +42.9688f,15.6892f,128.906f, +46.875f,14.6414f,128.906f, +50.7813f,14.3505f,128.906f, +54.6875f,14.1604f,128.906f, +58.5938f,14.517f,128.906f, +62.5f,15.1057f,128.906f, +66.4063f,16.0684f,128.906f, +70.3125f,16.6251f,128.906f, +74.2188f,15.9689f,128.906f, +78.125f,16.0234f,128.906f, +82.0313f,16.205f,128.906f, +85.9375f,18.8167f,128.906f, +89.8438f,19.6433f,128.906f, +93.75f,20.2916f,128.906f, +97.6563f,23.2308f,128.906f, +101.563f,25.882f,128.906f, +105.469f,27.5736f,128.906f, +109.375f,28.9662f,128.906f, +113.281f,30.5702f,128.906f, +117.188f,31.8627f,128.906f, +121.094f,32.5216f,128.906f, +125.0f,34.1918f,128.906f, +128.906f,37.0161f,128.906f, +132.813f,38.5084f,128.906f, +136.719f,39.1631f,128.906f, +140.625f,39.0529f,128.906f, +144.531f,38.9229f,128.906f, +148.438f,38.4312f,128.906f, +152.344f,39.1086f,128.906f, +156.25f,39.7022f,128.906f, +160.156f,39.3007f,128.906f, +164.063f,38.2318f,128.906f, +167.969f,36.7493f,128.906f, +171.875f,35.9781f,128.906f, +175.781f,35.7712f,128.906f, +179.688f,35.6247f,128.906f, +183.594f,35.4808f,128.906f, +187.5f,35.6102f,128.906f, +191.406f,34.0305f,128.906f, +195.313f,32.0227f,128.906f, +199.219f,29.7666f,128.906f, +203.125f,27.3968f,128.906f, +207.031f,25.1642f,128.906f, +210.938f,24.279f,128.906f, +214.844f,22.4357f,128.906f, +218.75f,21.7754f,128.906f, +222.656f,19.6381f,128.906f, +226.563f,19.78f,128.906f, +230.469f,20.0349f,128.906f, +234.375f,19.1534f,128.906f, +238.281f,17.863f,128.906f, +242.188f,17.658f,128.906f, +246.094f,16.951f,128.906f, +250.0f,16.2961f,128.906f, +}; + +btScalar Landscape01Nml[] = { +-0.145347f,0.988603f,0.0392193f, +-0.118578f,0.971903f,-0.203332f, +-0.210348f,0.975548f,0.0637181f, +-0.143154f,0.979915f,-0.138828f, +-0.186466f,0.976661f,0.106602f, +-0.200996f,0.973874f,-0.105691f, +-0.200019f,0.979742f,-0.00987837f, +-0.162567f,0.986516f,-0.0189093f, +-0.128872f,0.991658f,-0.00262187f, +-0.0972065f,0.993702f,0.0557464f, +-0.232168f,0.972676f,8.39761e-005f, +-0.280715f,0.959127f,-0.0356947f, +-0.328537f,0.944066f,-0.0283446f, +-0.348021f,0.936189f,-0.0493126f, +-0.28502f,0.953899f,-0.0940249f, +-0.329197f,0.938125f,-0.107479f, +-0.186873f,0.969867f,-0.15632f, +-0.168074f,0.98179f,-0.088542f, +0.138723f,0.984643f,-0.105994f, +0.139713f,0.984758f,-0.103594f, +0.415149f,0.907443f,-0.0647914f, +0.335594f,0.916204f,-0.218967f, +0.391251f,0.906316f,-0.159731f, +0.297117f,0.890775f,-0.343864f, +0.0782406f,0.948307f,-0.307558f, +0.0742546f,0.932023f,-0.354711f, +-0.0593029f,0.94484f,-0.322118f, +-0.035102f,0.9388f,-0.342668f, +-0.0398386f,0.972105f,-0.231139f, +0.0142535f,0.946652f,-0.321942f, +-0.149407f,0.982239f,-0.113505f, +-0.186817f,0.918353f,-0.348895f, +-0.227035f,0.95418f,-0.194923f, +-0.217455f,0.921613f,-0.32147f, +-0.104683f,0.961425f,-0.254368f, +-0.137473f,0.92562f,-0.352602f, +-0.0889131f,0.942391f,-0.322479f, +-0.137942f,0.895959f,-0.422173f, +-0.0994313f,0.915873f,-0.38896f, +-0.177412f,0.858967f,-0.480312f, +-0.28046f,0.843765f,-0.457605f, +-0.23875f,0.832625f,-0.499733f, +-0.35769f,0.865922f,-0.349624f, +-0.239679f,0.924761f,-0.295585f, +-0.367472f,0.894137f,-0.255898f, +-0.306721f,0.940051f,-0.149083f, +-0.29191f,0.929123f,-0.226977f, +-0.3205f,0.928892f,-0.185579f, +-0.367832f,0.894452f,-0.254274f, +-0.393375f,0.898238f,-0.196023f, +-0.386104f,0.869165f,-0.308993f, +-0.416765f,0.860247f,-0.293737f, +-0.257238f,0.898443f,-0.355849f, +-0.273377f,0.911812f,-0.306372f, +-0.228654f,0.889208f,-0.396265f, +-0.28545f,0.876522f,-0.387592f, +-0.142316f,0.885962f,-0.441381f, +-0.101084f,0.908701f,-0.405025f, +0.035618f,0.945519f,-0.323614f, +0.103277f,0.941647f,-0.320368f, +-0.120589f,0.957422f,-0.262302f, +-0.186114f,0.894712f,-0.40602f, +-0.202962f,0.931974f,-0.300385f, +-0.162074f,0.943023f,-0.290584f, +-0.152017f,0.933176f,-0.325688f, +-0.202811f,0.891764f,-0.404505f, +-0.195614f,0.919053f,-0.342165f, +-0.221332f,0.883262f,-0.413352f, +-0.230949f,0.883479f,-0.407587f, +-0.202664f,0.884798f,-0.419595f, +-0.013827f,0.935183f,-0.353894f, +0.0613953f,0.949306f,-0.308299f, +0.0379666f,0.956996f,-0.287605f, +0.0239474f,0.920688f,-0.389564f, +-0.124568f,0.971246f,-0.20289f, +-0.0173673f,0.966674f,-0.255421f, +-0.280608f,0.954174f,-0.103981f, +-0.188825f,0.978003f,-0.0886339f, +-0.193278f,0.981044f,-0.0139968f, +-0.089832f,0.992161f,0.0868734f, +-0.0617809f,0.994525f,0.0842802f, +0.0316335f,0.979002f,0.20138f, +0.126601f,0.973442f,0.190743f, +0.126356f,0.954056f,0.271683f, +0.0296197f,0.996225f,0.0816031f, +-0.130879f,0.990212f,-0.0484936f, +-0.0775613f,0.996382f,0.0347567f, +-0.0318445f,0.999049f,0.0297665f, +0.174213f,0.981835f,0.0751658f, +0.230898f,0.968544f,0.0927823f, +0.477724f,0.867555f,0.138304f, +0.489512f,0.856269f,0.164868f, +0.425011f,0.903484f,0.0555235f, +0.345126f,0.937885f,0.0355011f, +0.051136f,0.997417f,-0.0504465f, +0.0111243f,0.99878f,-0.0481145f, +0.00085351f,0.998643f,-0.0520782f, +-0.0736129f,0.992491f,-0.0976874f, +0.0605446f,0.978416f,-0.197578f, +-0.1248f,0.898669f,-0.420499f, +-0.068151f,0.956411f,-0.28396f, +0.0502596f,0.934397f,-0.35267f, +0.0492358f,0.99416f,-0.096025f, +0.22311f,0.97441f,-0.0273246f, +0.104257f,0.993921f,-0.0353788f, +0.135731f,0.987345f,0.0820234f, +0.0508084f,0.996415f,-0.0676404f, +0.013783f,0.999772f,-0.0162859f, +0.0814861f,0.996154f,-0.0322044f, +0.0451487f,0.998313f,-0.0365194f, +0.035547f,0.992801f,-0.114375f, +-0.0977551f,0.955799f,-0.277294f, +0.0588118f,0.977967f,-0.200303f, +0.0956551f,0.968682f,-0.229142f, +0.255494f,0.951171f,-0.173197f, +0.287347f,0.949686f,-0.124613f, +0.300983f,0.934694f,-0.189092f, +0.326044f,0.937015f,-0.125296f, +0.170234f,0.979103f,-0.111255f, +0.217643f,0.971688f,-0.0919459f, +0.0857423f,0.995f,-0.0512173f, +0.141055f,0.988855f,0.0476293f, +0.141065f,0.98942f,-0.0338874f, +0.161562f,0.986303f,0.0332183f, +0.113059f,0.993231f,0.0266602f, +0.073071f,0.997081f,-0.0221543f, +-0.0590251f,0.997651f,-0.034775f, +-0.0264959f,0.999595f,0.0103962f, +-0.0628475f,0.932757f,0.354985f, +-0.188464f,0.930547f,0.31395f, +-0.11595f,0.95582f,0.270118f, +-0.0150745f,0.981122f,0.192801f, +-0.121292f,0.98854f,0.0898753f, +-0.191875f,0.979293f,0.0645635f, +-0.302211f,0.947932f,-0.100469f, +-0.168835f,0.972187f,-0.162321f, +-0.165107f,0.942083f,-0.291925f, +0.0524842f,0.966783f,-0.250151f, +0.334898f,0.925425f,-0.177288f, +0.453352f,0.888614f,-0.0695481f, +0.212879f,0.976177f,-0.0419751f, +-0.0859137f,0.991174f,-0.100958f, +-0.19247f,0.980365f,-0.0428897f, +-0.217979f,0.975456f,0.0311624f, +-0.130678f,0.991292f,-0.0162531f, +0.0105625f,0.994964f,-0.0996785f, +-0.0191557f,0.967247f,-0.253114f, +-0.034833f,0.962122f,-0.270385f, +-0.195874f,0.937997f,-0.285996f, +-0.397161f,0.831379f,-0.388681f, +-0.379064f,0.825916f,-0.417342f, +-0.284483f,0.874083f,-0.393762f, +-0.320157f,0.86551f,-0.385217f, +-0.327447f,0.85814f,-0.395442f, +-0.219114f,0.871062f,-0.439592f, +-0.161876f,0.861769f,-0.480781f, +-0.18946f,0.845726f,-0.498852f, +-0.191307f,0.924603f,-0.32941f, +-0.159365f,0.982225f,-0.0991764f, +-0.164558f,0.975832f,-0.143777f, +-0.155521f,0.974006f,-0.164699f, +-0.172244f,0.972979f,-0.153766f, +-0.162541f,0.961346f,-0.222247f, +-0.11171f,0.955927f,-0.271523f, +-0.101714f,0.980079f,-0.170586f, +-0.223397f,0.974336f,-0.0276274f, +-0.300622f,0.953413f,0.0251167f, +-0.254202f,0.967133f,-0.00586307f, +-0.0994566f,0.994394f,0.0359007f, +0.078652f,0.996758f,-0.0169243f, +-0.0552979f,0.987555f,0.147234f, +-0.0666628f,0.864508f,0.498179f, +0.131082f,0.854494f,0.502651f, +0.414695f,0.764646f,0.4933f, +0.432926f,0.790826f,0.432632f, +0.126593f,0.91514f,0.382744f, +-0.0157552f,0.943082f,0.332186f, +0.122694f,0.924647f,0.36052f, +0.0975822f,0.984244f,0.147447f, +-0.026294f,0.960938f,-0.275512f, +0.1231f,0.958251f,-0.258072f, +0.037902f,0.976085f,-0.214059f, +-0.000148888f,0.992562f,-0.121742f, +0.0716429f,0.997173f,-0.0226693f, +0.135484f,0.989193f,-0.0560393f, +0.275603f,0.956281f,-0.0978236f, +0.283097f,0.956822f,-0.0659346f, +0.109624f,0.991403f,-0.0714361f, +0.084436f,0.990816f,-0.105609f, +0.0791881f,0.990931f,-0.108558f, +0.0674956f,0.997569f,-0.0173508f, +0.0556006f,0.998429f,0.00688119f, +-0.144974f,0.947519f,0.28494f, +-0.110826f,0.961365f,0.251981f, +-0.0669451f,0.996693f,0.0460586f, +-0.00516145f,0.998802f,0.0486696f, +-0.116537f,0.988089f,0.100498f, +-0.0456605f,0.993379f,0.105422f, +-0.110131f,0.987256f,-0.114879f, +-0.0746162f,0.968429f,-0.237861f, +-0.0785155f,0.952358f,-0.294703f, +-0.0192369f,0.946876f,-0.321024f, +0.320056f,0.920022f,-0.226108f, +0.288692f,0.932613f,-0.216541f, +0.123147f,0.991593f,-0.0397145f, +-0.113817f,0.992375f,0.0473138f, +-0.192042f,0.9774f,0.0883642f, +-0.156949f,0.987573f,0.00819321f, +-0.0848586f,0.992344f,-0.0897344f, +0.0818673f,0.992357f,-0.0923282f, +0.113464f,0.986976f,-0.114035f, +-0.0777263f,0.979155f,-0.187653f, +-0.11587f,0.975173f,-0.188711f, +-0.26618f,0.902421f,-0.338799f, +-0.343104f,0.842974f,-0.414336f, +-0.318919f,0.837107f,-0.444457f, +-0.324821f,0.839352f,-0.435867f, +-0.312979f,0.836318f,-0.45013f, +-0.203015f,0.862499f,-0.463553f, +-0.14187f,0.900483f,-0.411101f, +-0.22968f,0.933243f,-0.276233f, +-0.413973f,0.871187f,-0.263932f, +-0.305656f,0.93798f,-0.163607f, +-0.161875f,0.985861f,-0.0433003f, +-0.135788f,0.990721f,0.00582442f, +-0.138617f,0.984876f,-0.103942f, +-0.135024f,0.980056f,-0.145806f, +-0.124871f,0.989793f,-0.068687f, +-0.182018f,0.982992f,-0.024403f, +-0.309743f,0.950592f,-0.0208625f, +-0.30492f,0.95221f,0.0178823f, +-0.299424f,0.951826f,0.066125f, +-0.120448f,0.944431f,0.305848f, +0.118213f,0.907792f,0.402418f, +-0.261318f,0.917154f,0.300902f, +-0.411401f,0.860866f,0.299431f, +0.15139f,0.91772f,0.367249f, +0.409879f,0.832051f,0.373752f, +0.446772f,0.77668f,0.44403f, +0.301572f,0.80653f,0.508491f, +0.168293f,0.89172f,0.420135f, +0.0587854f,0.961406f,0.26878f, +0.30067f,0.896979f,0.324077f, +0.282217f,0.935284f,0.213535f, +0.148185f,0.986837f,0.0647602f, +-0.0572401f,0.974528f,-0.216838f, +-0.0945497f,0.96665f,-0.238009f, +-0.000668496f,0.9725f,-0.232902f, +0.125989f,0.980136f,-0.15317f, +0.218059f,0.975888f,-0.00959987f, +0.265461f,0.958501f,0.103951f, +0.173443f,0.98019f,0.0956349f, +0.133691f,0.987754f,0.0804258f, +0.0900836f,0.995272f,0.0363034f, +0.0177237f,0.999106f,-0.0383914f, +0.042211f,0.998744f,-0.0269875f, +0.0720539f,0.94434f,0.320982f, +0.0948772f,0.964987f,0.244537f, +0.123635f,0.987961f,0.0929884f, +-0.0283728f,0.998997f,-0.0346279f, +-0.152337f,0.985597f,-0.0734363f, +-0.0291778f,0.996634f,-0.0766092f, +0.0594392f,0.995285f,-0.0766423f, +-0.027888f,0.982723f,-0.182971f, +-0.0125244f,0.971758f,-0.235647f, +-0.0767296f,0.943557f,-0.322201f, +0.2299f,0.955601f,-0.184318f, +0.271645f,0.9586f,-0.0854157f, +0.0112173f,0.999015f,-0.0429278f, +-0.142475f,0.989464f,-0.02574f, +-0.192441f,0.979224f,-0.0639254f, +-0.103523f,0.99301f,-0.0567016f, +-0.00378459f,0.998834f,-0.0481324f, +0.0499927f,0.992415f,-0.112309f, +0.0737699f,0.994576f,-0.0733206f, +-0.0190206f,0.999623f,-0.0197948f, +-0.0783652f,0.99692f,0.00307073f, +-0.152226f,0.987897f,0.0297819f, +-0.333638f,0.940154f,-0.069252f, +-0.307736f,0.941909f,-0.134557f, +-0.334924f,0.918699f,-0.209327f, +-0.35357f,0.914459f,-0.19686f, +-0.243406f,0.963329f,-0.112917f, +-0.31479f,0.943784f,-0.100892f, +-0.368184f,0.929745f,0.00391099f, +-0.386308f,0.922293f,-0.0119138f, +-0.337617f,0.936762f,-0.0921568f, +-0.305867f,0.947033f,-0.0978487f, +-0.109063f,0.994026f,0.00418869f, +0.00976093f,0.996792f,-0.0794369f, +-0.152053f,0.972765f,-0.17495f, +-0.268682f,0.956747f,-0.111559f, +-0.16583f,0.986099f,0.0104333f, +-0.26795f,0.960138f,-0.0796053f, +-0.428361f,0.903607f,0.000904858f, +-0.364896f,0.884093f,0.291943f, +-0.411739f,0.889329f,0.19891f, +-0.213918f,0.942658f,0.256194f, +-0.0353818f,0.912316f,0.407955f, +-0.234679f,0.972031f,0.0090071f, +0.164799f,0.976041f,-0.142074f, +0.378329f,0.920537f,-0.0973577f, +0.389048f,0.913009f,0.122701f, +0.312785f,0.918579f,0.241617f, +0.331426f,0.913352f,0.236529f, +0.235473f,0.970893f,0.043811f, +0.0409183f,0.988429f,-0.14606f, +0.183882f,0.951979f,0.244794f, +0.256685f,0.844334f,0.470333f, +0.243297f,0.84406f,0.47788f, +0.178194f,0.957255f,0.227835f, +0.0574376f,0.965885f,-0.252523f, +-0.0590426f,0.961892f,-0.266977f, +0.0063288f,0.996614f,-0.081983f, +0.221194f,0.97242f,0.0739783f, +0.131016f,0.988415f,0.0766141f, +0.0953963f,0.986256f,0.134901f, +0.160579f,0.972927f,0.166216f, +0.109946f,0.983906f,0.14086f, +0.027673f,0.996741f,0.0757784f, +0.095102f,0.971229f,0.218334f, +0.102357f,0.973251f,0.205684f, +0.193741f,0.956416f,0.218477f, +0.132416f,0.984788f,0.112512f, +-0.0766537f,0.99488f,-0.0658589f, +-0.0304197f,0.995587f,-0.0887742f, +0.0261631f,0.997431f,-0.0666789f, +0.0720508f,0.996334f,-0.0461268f, +0.110802f,0.979106f,-0.170512f, +-0.036534f,0.946972f,-0.319234f, +0.0562543f,0.953438f,-0.296297f, +0.21433f,0.964539f,-0.154036f, +-0.0463138f,0.986383f,-0.157808f, +-0.114222f,0.99275f,-0.0374399f, +-0.129535f,0.99146f,-0.0150624f, +-0.148036f,0.985214f,-0.0862475f, +-0.0412316f,0.997863f,-0.050697f, +0.0938182f,0.995513f,-0.0123356f, +0.0585542f,0.997889f,-0.0281043f, +-0.11195f,0.993633f,0.0126653f, +-0.208443f,0.969116f,0.131782f, +-0.178284f,0.959747f,0.217024f, +-0.249524f,0.951637f,0.179236f, +-0.204568f,0.966799f,0.153139f, +-0.277831f,0.959694f,0.042405f, +-0.421523f,0.906804f,-0.00501147f, +-0.349246f,0.93481f,0.0644755f, +-0.271825f,0.953501f,0.130185f, +-0.341243f,0.939899f,0.0119564f, +-0.356048f,0.93224f,-0.0644791f, +-0.286188f,0.955628f,-0.0697892f, +-0.248084f,0.956522f,-0.153364f, +-0.154022f,0.960443f,-0.232007f, +0.032406f,0.989794f,-0.138774f, +-0.0622078f,0.991529f,-0.114016f, +-0.335467f,0.915845f,-0.220659f, +-0.194821f,0.973732f,-0.117857f, +-0.29903f,0.953799f,-0.0291431f, +-0.514277f,0.834668f,0.197101f, +-0.344769f,0.927072f,0.147212f, +-0.0936834f,0.993837f,0.0592615f, +-0.181141f,0.974379f,-0.133321f, +-0.0841805f,0.983933f,-0.157447f, +0.0661375f,0.94785f,-0.31178f, +0.143104f,0.856028f,-0.496726f, +0.226417f,0.827547f,-0.513714f, +0.178899f,0.912784f,-0.367179f, +0.234616f,0.943911f,-0.232351f, +0.346693f,0.91935f,-0.186008f, +0.307074f,0.943627f,-0.123586f, +0.214863f,0.970065f,0.113171f, +0.0234555f,0.999712f,0.00506759f, +-0.0206358f,0.99868f,0.047041f, +0.0320247f,0.946177f,0.322062f, +0.23638f,0.837444f,0.492759f, +0.410368f,0.848265f,0.33473f, +-0.0124285f,0.999913f,-0.00451951f, +-0.13197f,0.981357f,-0.139724f, +0.0888915f,0.995883f,0.0177605f, +0.12955f,0.973581f,0.188033f, +0.100974f,0.97841f,0.18033f, +0.116628f,0.987352f,0.107396f, +0.0879041f,0.989191f,0.117361f, +0.114472f,0.980893f,0.157306f, +0.0306685f,0.986407f,0.161431f, +0.128704f,0.972047f,0.196366f, +0.21783f,0.966546f,0.135421f, +0.280184f,0.953049f,0.114866f, +0.0272615f,0.999564f,-0.0113551f, +-0.0491486f,0.997279f,-0.0549472f, +0.00337261f,0.998977f,-0.0450999f, +0.0913253f,0.995457f,-0.0269266f, +0.252481f,0.964775f,-0.0739122f, +0.0897947f,0.975122f,-0.202665f, +-0.0238258f,0.968534f,-0.247739f, +0.162662f,0.981573f,-0.10028f, +-0.0276113f,0.997652f,-0.0626774f, +-0.289082f,0.95335f,-0.0869268f, +-0.160594f,0.986876f,0.0169191f, +-0.0752137f,0.997117f,0.00999502f, +-0.0455931f,0.997939f,-0.0451647f, +0.0616976f,0.995202f,-0.0759372f, +-0.00353073f,0.999867f,-0.0159004f, +-0.177748f,0.976224f,0.124065f, +-0.247702f,0.959217f,0.136188f, +-0.164797f,0.981869f,0.0936766f, +-0.214718f,0.976098f,0.0335935f, +-0.211552f,0.977318f,-0.00980662f, +-0.200169f,0.979677f,0.0128577f, +-0.39928f,0.916411f,-0.027687f, +-0.374531f,0.927212f,0.0022105f, +-0.268102f,0.963363f,0.00736207f, +-0.247283f,0.968232f,-0.0371081f, +-0.289483f,0.949449f,-0.121432f, +-0.253482f,0.93971f,-0.229547f, +-0.132892f,0.950758f,-0.279997f, +-0.140676f,0.931036f,-0.336723f, +-0.161496f,0.9509f,-0.264023f, +-0.0403886f,0.9973f,-0.0613364f, +-0.215095f,0.96767f,-0.131717f, +-0.434628f,0.895597f,-0.0948964f, +-0.381939f,0.886142f,0.262442f, +-0.43994f,0.880276f,0.177672f, +-0.252792f,0.948954f,-0.188633f, +-0.0941535f,0.957693f,-0.271953f, +-0.13352f,0.964535f,-0.227692f, +0.0341173f,0.927935f,-0.371176f, +0.348577f,0.799586f,-0.489036f, +0.387188f,0.819484f,-0.42253f, +0.14352f,0.883544f,-0.445815f, +0.0762879f,0.891752f,-0.446047f, +0.0742711f,0.875908f,-0.476728f, +0.300515f,0.871535f,-0.38745f, +0.0625809f,0.886656f,-0.458175f, +-0.0365474f,0.9191f,-0.392325f, +-0.0762363f,0.966891f,-0.243538f, +0.0117284f,0.995382f,0.0952715f, +0.0102532f,0.999347f,-0.0346391f, +-0.059511f,0.989492f,-0.131776f, +0.349383f,0.904972f,0.24281f, +0.425179f,0.763732f,0.485732f, +-0.0166138f,0.992406f,0.121875f, +-0.122272f,0.990094f,0.0690156f, +-0.015652f,0.970579f,0.240273f, +0.124649f,0.94771f,0.293785f, +0.220282f,0.938434f,0.266116f, +0.102745f,0.973801f,0.202865f, +0.0640356f,0.977435f,0.201297f, +-0.0952943f,0.987515f,0.125435f, +0.114947f,0.977151f,0.178783f, +0.258472f,0.957495f,0.128042f, +0.282157f,0.951094f,0.125728f, +0.142066f,0.986542f,0.0809464f, +-0.0434313f,0.998053f,-0.0447576f, +0.0347776f,0.999239f,-0.0176595f, +0.102204f,0.984881f,-0.139871f, +0.245582f,0.958619f,-0.144014f, +0.135608f,0.990697f,0.0113886f, +-0.0626335f,0.997441f,0.0344788f, +-0.0132478f,0.995736f,0.0912912f, +-0.039638f,0.981575f,0.186922f, +-0.205229f,0.973473f,0.10115f, +-0.153245f,0.987696f,-0.0311751f, +-0.0852914f,0.993336f,-0.0775215f, +0.0304281f,0.997751f,-0.0597208f, +0.0412582f,0.993049f,-0.110237f, +-0.115798f,0.992196f,0.0462328f, +-0.265664f,0.954942f,0.132323f, +-0.179634f,0.978355f,0.102729f, +-0.122093f,0.992469f,0.00988423f, +-0.0976525f,0.994936f,-0.0237989f, +-0.19391f,0.963376f,-0.185219f, +-0.249328f,0.960076f,-0.126845f, +-0.386054f,0.920896f,-0.0539736f, +-0.40236f,0.909842f,-0.101455f, +-0.264839f,0.959901f,-0.091928f, +-0.215529f,0.973573f,-0.0755211f, +-0.190591f,0.977631f,-0.0889496f, +-0.114636f,0.971653f,-0.20676f, +-0.147698f,0.942871f,-0.29863f, +-0.153003f,0.970479f,-0.186443f, +-0.259911f,0.94737f,-0.186912f, +-0.218176f,0.967871f,-0.124997f, +-0.218418f,0.965394f,0.142507f, +-0.497944f,0.825767f,0.264878f, +-0.394522f,0.874216f,0.283017f, +-0.174161f,0.980284f,0.0933364f, +-0.0291225f,0.984908f,-0.170609f, +-0.149188f,0.939649f,-0.307902f, +-0.109448f,0.970586f,-0.214438f, +0.391051f,0.895182f,-0.213842f, +0.237246f,0.888641f,-0.392468f, +0.104812f,0.984981f,-0.137213f, +0.1294f,0.991592f,-0.000205693f, +0.119158f,0.992497f,-0.0274125f, +0.117487f,0.990494f,-0.071548f, +0.234708f,0.962187f,-0.138234f, +0.347721f,0.937443f,-0.017023f, +0.135989f,0.962379f,-0.235229f, +-0.193384f,0.875532f,-0.442772f, +-0.209357f,0.905544f,-0.368998f, +0.0641865f,0.982942f,-0.172352f, +0.0534516f,0.998302f,-0.023133f, +-0.0579793f,0.992675f,-0.105989f, +0.299444f,0.827258f,0.475371f, +0.320901f,0.752799f,0.574731f, +-0.0625162f,0.964286f,0.257381f, +-0.0931157f,0.981324f,0.168322f, +0.0981691f,0.975509f,0.19684f, +0.238911f,0.944952f,0.223577f, +0.0852945f,0.980047f,0.179533f, +0.0437708f,0.96942f,0.241474f, +-0.0654565f,0.948925f,0.308637f, +0.105877f,0.941798f,0.319071f, +0.298409f,0.90697f,0.29725f, +0.267454f,0.931587f,0.246198f, +0.257873f,0.930012f,0.261877f, +0.0608152f,0.99476f,0.0821851f, +0.0682325f,0.995644f,-0.0635329f, +0.204976f,0.974836f,-0.0876375f, +0.100643f,0.994422f,0.031559f, +-0.0498971f,0.971595f,0.231328f, +-0.0948982f,0.951903f,0.291332f, +-0.0140779f,0.962693f,0.270229f, +0.0194699f,0.983768f,0.178386f, +-0.0700516f,0.997536f,0.00373294f, +-0.0458738f,0.991776f,-0.119485f, +-0.0457685f,0.983541f,-0.17479f, +0.031836f,0.984739f,-0.171101f, +-0.0846163f,0.991107f,-0.102703f, +-0.250146f,0.959975f,0.125993f, +-0.240823f,0.966766f,0.0858408f, +-0.110771f,0.993685f,0.0178603f, +-0.0536647f,0.99805f,-0.0318645f, +-0.0537905f,0.996775f,-0.0595505f, +-0.0979926f,0.994498f,-0.0370296f, +-0.317761f,0.946482f,-0.0565711f, +-0.353331f,0.932392f,-0.0761719f, +-0.315921f,0.918114f,-0.23929f, +-0.304095f,0.907663f,-0.289264f, +-0.232301f,0.951296f,-0.202665f, +-0.181242f,0.959764f,-0.214488f, +-0.0415921f,0.982269f,-0.182804f, +-0.134113f,0.976644f,-0.16787f, +-0.266673f,0.950383f,-0.160182f, +-0.233335f,0.968889f,-0.0825141f, +-0.383896f,0.923094f,0.0228394f, +-0.46523f,0.826401f,0.317211f, +-0.448022f,0.824389f,0.345917f, +-0.335673f,0.941977f,-0.00160348f, +0.00939714f,0.9768f,-0.213948f, +0.0525806f,0.945774f,-0.320541f, +-0.0139338f,0.984205f,-0.176483f, +-0.233879f,0.941098f,-0.244203f, +0.35813f,0.924476f,-0.13072f, +0.148621f,0.988076f,0.040214f, +-0.0873945f,0.896884f,0.433546f, +0.16715f,0.882598f,0.43941f, +0.105867f,0.92276f,0.370549f, +0.162793f,0.877156f,0.451769f, +0.26606f,0.895485f,0.356818f, +0.178343f,0.923603f,0.339339f, +0.205659f,0.876785f,0.434686f, +0.164046f,0.939287f,0.301379f, +-0.304778f,0.94913f,-0.0791393f, +-0.351721f,0.931897f,-0.088655f, +-0.137155f,0.986834f,0.0857151f, +-0.0493791f,0.984585f,0.167793f, +-0.29261f,0.942092f,0.163834f, +0.175576f,0.863797f,0.472257f, +0.388427f,0.769345f,0.507181f, +0.0396361f,0.995255f,0.0888612f, +0.000897162f,0.999738f,-0.022857f, +0.263974f,0.951061f,0.160623f, +0.140984f,0.987533f,0.0700142f, +-0.0604349f,0.998129f,-0.00925637f, +-0.0323604f,0.969904f,0.241328f, +0.0249905f,0.978924f,0.202689f, +0.301944f,0.900385f,0.313268f, +0.302439f,0.903212f,0.304531f, +0.227241f,0.927301f,0.297445f, +0.295557f,0.903047f,0.311692f, +0.215996f,0.968849f,0.121149f, +0.0543993f,0.994951f,0.0843384f, +-0.108272f,0.967731f,0.227539f, +-0.144218f,0.941468f,0.304694f, +-0.0465574f,0.94074f,0.335917f, +0.0834793f,0.95338f,0.289996f, +0.159412f,0.96437f,0.211135f, +0.125672f,0.984055f,0.125864f, +0.0125305f,0.999902f,-0.00630946f, +-0.0213081f,0.999771f,-0.00209364f, +-0.0845682f,0.99631f,0.014661f, +-0.191644f,0.962461f,0.192203f, +-0.326186f,0.912172f,0.248084f, +-0.125723f,0.965189f,0.229357f, +-0.0487346f,0.993706f,0.100859f, +0.0069351f,0.999976f,0.00057427f, +-0.0853775f,0.991791f,-0.0951918f, +-0.217561f,0.97582f,-0.0210368f, +-0.247132f,0.964013f,0.0979986f, +-0.253847f,0.965546f,-0.0573009f, +-0.17269f,0.977352f,-0.122318f, +-0.308873f,0.930936f,-0.19482f, +-0.274273f,0.935966f,-0.220775f, +-0.176582f,0.954344f,-0.240926f, +-0.17678f,0.967725f,-0.179601f, +-0.142126f,0.989789f,-0.0108556f, +-0.241082f,0.966299f,-0.0902532f, +-0.303483f,0.94088f,-0.150476f, +-0.634535f,0.768468f,-0.082594f, +-0.47113f,0.814002f,0.339761f, +-0.289984f,0.937003f,0.194769f, +0.025067f,0.999685f,-0.000862102f, +0.289006f,0.893747f,-0.343064f, +0.00615404f,0.935866f,-0.352301f, +-0.338901f,0.929111f,-0.147984f, +-0.164518f,0.985591f,-0.0393034f, +0.290961f,0.935697f,-0.199533f, +-0.0876053f,0.971539f,-0.220083f, +-0.32548f,0.935239f,0.139248f, +0.0766933f,0.974848f,0.20926f, +0.108828f,0.917507f,0.382541f, +0.0350786f,0.924503f,0.379557f, +0.162845f,0.883516f,0.439183f, +0.280718f,0.786151f,0.550603f, +0.282161f,0.80649f,0.519575f, +0.319525f,0.746566f,0.583561f, +-0.0912168f,0.872752f,0.479567f, +-0.288082f,0.924626f,0.249148f, +-0.142667f,0.981082f,0.130856f, +-0.066753f,0.9808f,0.183236f, +-0.230244f,0.961075f,0.152718f, +-0.067082f,0.99457f,0.0795691f, +0.611911f,0.730537f,0.303119f, +0.451199f,0.889041f,0.077617f, +0.0130284f,0.992329f,-0.12294f, +0.0930856f,0.993052f,-0.0719959f, +0.26722f,0.962884f,0.0380388f, +0.075301f,0.995117f,-0.0638176f, +0.167918f,0.972374f,0.162147f, +0.0578882f,0.993576f,0.0972437f, +0.196869f,0.968468f,0.152684f, +0.304163f,0.924874f,0.228237f, +0.255006f,0.935584f,0.244244f, +0.260728f,0.944471f,0.199987f, +0.218361f,0.924111f,0.313587f, +0.0535174f,0.911234f,0.408398f, +-0.0710624f,0.921034f,0.382946f, +-0.130246f,0.949543f,0.285314f, +-0.0655027f,0.977569f,0.200169f, +0.0903252f,0.974724f,0.204338f, +0.155207f,0.949154f,0.273892f, +0.153701f,0.938218f,0.310037f, +0.0621551f,0.960028f,0.272917f, +-0.0534301f,0.951765f,0.30214f, +-0.196733f,0.911558f,0.361052f, +-0.281614f,0.838193f,0.46704f, +-0.263195f,0.866235f,0.424694f, +-0.0481024f,0.917426f,0.394989f, +0.0935627f,0.945047f,0.31326f, +0.130693f,0.965135f,0.226792f, +0.00742185f,0.989033f,0.14751f, +-0.243053f,0.969364f,0.0354789f, +-0.273599f,0.961363f,-0.0304179f, +-0.215123f,0.976563f,-0.00682047f, +-0.164989f,0.983922f,0.068385f, +-0.241802f,0.97031f,0.00552545f, +-0.241315f,0.967202f,-0.0792945f, +-0.169018f,0.981272f,-0.0923975f, +-0.282714f,0.953981f,-0.0999632f, +-0.234963f,0.971912f,-0.0134244f, +-0.109087f,0.993838f,-0.0196489f, +-0.369236f,0.9273f,-0.0614783f, +-0.551241f,0.800465f,0.235349f, +-0.62344f,0.781571f,-0.0216512f, +-0.285923f,0.957424f,0.0398505f, +0.246101f,0.967083f,0.064696f, +0.379822f,0.894837f,-0.234526f, +-0.124179f,0.991035f,0.0492959f, +-0.55499f,0.830986f,0.0380685f, +-0.0883601f,0.986961f,0.13454f, +0.492332f,0.870217f,0.0182045f, +-0.0249785f,0.975709f,-0.217643f, +-0.368665f,0.864796f,-0.340902f, +-0.0172444f,0.938433f,-0.345031f, +-0.0663306f,0.97669f,-0.204147f, +0.00514992f,0.997132f,-0.0755029f, +0.0570337f,0.998371f,-0.00125828f, +0.249285f,0.962439f,0.107557f, +0.242481f,0.961206f,0.131476f, +0.205153f,0.940815f,0.269776f, +0.193253f,0.908579f,0.370322f, +-0.0564604f,0.989265f,0.134783f, +0.0286103f,0.993761f,-0.107795f, +-0.22802f,0.927614f,-0.29587f, +-0.141654f,0.989087f,-0.0405023f, +-0.0918591f,0.979413f,-0.179757f, +0.474817f,0.877478f,-0.067685f, +0.562064f,0.827022f,0.0108876f, +0.0667731f,0.98619f,-0.151561f, +0.0478258f,0.978171f,-0.202223f, +0.240461f,0.955483f,-0.170967f, +0.22331f,0.956303f,-0.188725f, +0.105513f,0.987685f,0.115519f, +0.0191904f,0.988704f,0.148645f, +0.138326f,0.966121f,0.217888f, +0.261136f,0.942738f,0.207491f, +0.283954f,0.937656f,0.20043f, +0.227821f,0.960294f,0.161036f, +0.0632997f,0.956465f,0.284901f, +-0.0487147f,0.902832f,0.427225f, +-0.0448066f,0.869805f,0.491357f, +0.0191513f,0.881775f,0.471282f, +0.0794772f,0.93047f,0.357644f, +0.0542875f,0.971817f,0.2294f, +0.0315472f,0.963796f,0.264769f, +0.140004f,0.919916f,0.36627f, +0.0838185f,0.924915f,0.370818f, +-0.147814f,0.916849f,0.370861f, +-0.285354f,0.864307f,0.414182f, +-0.277978f,0.859855f,0.428226f, +-0.199243f,0.910371f,0.362666f, +0.00801534f,0.941586f,0.336678f, +0.134574f,0.9298f,0.342582f, +0.118153f,0.909557f,0.398429f, +0.0557977f,0.896269f,0.439987f, +-0.0363608f,0.927402f,0.372294f, +-0.166377f,0.978738f,0.119962f, +-0.285966f,0.957794f,-0.0292047f, +-0.233552f,0.97096f,0.0518564f, +-0.131443f,0.981568f,0.138735f, +-0.225195f,0.974079f,0.0213645f, +-0.190643f,0.980844f,0.0400016f, +-0.234677f,0.970688f,0.051878f, +-0.269033f,0.961888f,-0.0489107f, +-0.0845976f,0.996159f,0.0225919f, +-0.404645f,0.907558f,0.112255f, +-0.609864f,0.674076f,0.416758f, +-0.498816f,0.848126f,0.178504f, +-0.144072f,0.987953f,-0.0565038f, +0.166758f,0.948601f,-0.268974f, +0.264567f,0.924612f,0.274038f, +-0.242512f,0.859891f,0.449195f, +-0.469649f,0.864648f,0.178364f, +-0.10506f,0.987899f,0.114094f, +0.522959f,0.850167f,0.0610757f, +0.207342f,0.943984f,-0.256717f, +-0.370985f,0.736513f,-0.565613f, +-0.196204f,0.840957f,-0.504277f, +-0.176697f,0.964208f,-0.197689f, +-0.102305f,0.980589f,-0.167266f, +0.103476f,0.966902f,-0.233225f, +0.176136f,0.882185f,-0.436721f, +0.1356f,0.926363f,-0.351374f, +0.144454f,0.987968f,-0.0552396f, +0.173673f,0.98445f,-0.0263929f, +0.186245f,0.978364f,-0.0900963f, +0.313839f,0.899877f,-0.302865f, +0.0432774f,0.865555f,-0.498941f, +-0.311487f,0.833772f,-0.45585f, +-0.00804547f,0.940342f,-0.340136f, +0.304128f,0.919914f,-0.247515f, +0.693924f,0.703662f,0.152743f, +0.239861f,0.957303f,-0.161363f, +0.0838446f,0.969769f,-0.229169f, +0.258925f,0.935636f,-0.239881f, +0.257223f,0.918931f,-0.299002f, +0.0548176f,0.967903f,0.245271f, +0.0212885f,0.963347f,0.267412f, +0.0818858f,0.973102f,0.215332f, +0.303912f,0.917546f,0.25641f, +0.304793f,0.927062f,0.218307f, +0.238677f,0.941098f,0.239517f, +-0.064428f,0.967965f,0.242677f, +-0.187169f,0.922119f,0.338622f, +-0.088608f,0.904799f,0.416518f, +0.0498324f,0.910793f,0.409846f, +0.176362f,0.913248f,0.367253f, +0.168717f,0.938419f,0.301504f, +0.00502329f,0.962305f,0.271928f, +0.0457173f,0.940418f,0.336934f, +0.0516487f,0.913931f,0.402569f, +-0.133343f,0.891616f,0.432713f, +-0.271457f,0.878825f,0.392399f, +-0.232052f,0.920355f,0.3148f, +-0.147635f,0.961854f,0.230305f, +-0.0156622f,0.96416f,0.264858f, +0.0430262f,0.93984f,0.338894f, +-0.0165403f,0.899263f,0.437095f, +0.0174547f,0.845985f,0.53292f, +0.0913065f,0.841589f,0.532345f, +0.0967863f,0.903784f,0.416901f, +-0.0948439f,0.973273f,0.209153f, +-0.30724f,0.95163f,-0.00197291f, +-0.219507f,0.974242f,0.051671f, +-0.123616f,0.986822f,0.104414f, +-0.209302f,0.977457f,0.0277521f, +-0.245642f,0.966973f,0.0679884f, +-0.189013f,0.970874f,0.147233f, +-0.260969f,0.955926f,0.134541f, +-0.586593f,0.772947f,0.241789f, +-0.622505f,0.744412f,0.241534f, +-0.343069f,0.923585f,0.171158f, +0.270136f,0.949637f,0.158794f, +-0.0270125f,0.976583f,-0.213437f, +-0.293688f,0.905533f,0.306199f, +-0.165876f,0.923469f,0.345963f, +-0.101353f,0.963266f,0.248689f, +-0.0607966f,0.998139f,0.00473307f, +0.571806f,0.81892f,0.04908f, +0.496821f,0.86721f,0.0334054f, +-0.0103979f,0.971297f,-0.237642f, +-0.296903f,0.868994f,-0.395851f, +-0.405401f,0.821757f,-0.400457f, +-0.0724266f,0.96927f,-0.235097f, +0.416989f,0.879556f,-0.229132f, +0.361436f,0.845922f,-0.392148f, +-0.194841f,0.930819f,-0.309213f, +-0.180426f,0.920987f,-0.345297f, +0.16396f,0.957989f,-0.235318f, +0.390246f,0.873397f,-0.291351f, +0.368832f,0.745912f,-0.554597f, +0.0989123f,0.900328f,-0.423823f, +-0.474178f,0.712544f,-0.517143f, +-0.225662f,0.862106f,-0.453707f, +0.0544551f,0.930953f,-0.361055f, +0.547706f,0.827837f,-0.121263f, +0.394416f,0.886974f,-0.240235f, +0.0920684f,0.955894f,-0.278909f, +0.287609f,0.908713f,-0.302524f, +0.34308f,0.875033f,-0.341487f, +-0.0471282f,0.962572f,0.266897f, +0.0309198f,0.953932f,0.298424f, +0.131633f,0.963671f,0.232402f, +0.278528f,0.937297f,0.209515f, +0.282669f,0.933258f,0.221646f, +0.232384f,0.927485f,0.292863f, +-0.0647083f,0.957687f,0.280443f, +-0.249973f,0.928177f,0.275683f, +-0.129841f,0.953629f,0.271538f, +0.0843284f,0.953748f,0.288536f, +0.245794f,0.935145f,0.255127f, +0.172562f,0.957759f,0.230042f, +-0.0230052f,0.954645f,0.296857f, +-0.041189f,0.951248f,0.305663f, +0.00483043f,0.930995f,0.364999f, +-0.165245f,0.915404f,0.367054f, +-0.220878f,0.904299f,0.365316f, +-0.0993279f,0.939818f,0.326919f, +-0.130653f,0.959943f,0.247869f, +-0.122986f,0.930904f,0.343936f, +-0.00592517f,0.911134f,0.412068f, +-0.1345f,0.9137f,0.383488f, +-0.0693903f,0.866333f,0.494623f, +0.121472f,0.852483f,0.508447f, +0.210048f,0.85163f,0.480215f, +0.0819942f,0.889969f,0.448588f, +-0.0885916f,0.940837f,0.327072f, +-0.228328f,0.96901f,0.0942702f, +-0.142437f,0.987843f,0.0622738f, +-0.157298f,0.987135f,0.0286638f, +-0.320718f,0.947161f,0.00499032f, +-0.336449f,0.936473f,0.0990975f, +-0.304779f,0.919932f,0.246646f, +-0.589969f,0.761912f,0.267259f, +-0.577652f,0.799842f,0.163009f, +-0.2738f,0.948238f,0.160868f, +0.240449f,0.968762f,0.0607085f, +-0.0196269f,0.999224f,-0.0341484f, +-0.384279f,0.908117f,0.166292f, +-0.0937293f,0.985711f,0.139963f, +0.0542133f,0.980144f,0.190731f, +0.0177665f,0.999043f,0.039964f, +0.448192f,0.892243f,0.0550135f, +0.417622f,0.800327f,0.430197f, +0.199972f,0.838529f,0.506833f, +-0.0526069f,0.975321f,0.214434f, +-0.547935f,0.818163f,-0.174291f, +-0.280437f,0.954205f,-0.10415f, +0.341739f,0.938698f,0.0453871f, +0.346269f,0.925369f,0.15424f, +-0.319444f,0.944119f,0.0812127f, +-0.192857f,0.977783f,0.0821343f, +0.335818f,0.935599f,-0.108997f, +0.474712f,0.785031f,-0.397964f, +0.373974f,0.907089f,-0.193218f, +0.0523306f,0.977738f,-0.203201f, +-0.41385f,0.870502f,-0.266372f, +-0.377073f,0.911356f,-0.165066f, +0.0445989f,0.977381f,-0.206731f, +0.525837f,0.831576f,-0.178819f, +0.378975f,0.901633f,-0.208411f, +0.088353f,0.958416f,-0.271353f, +0.309469f,0.925076f,-0.220144f, +0.420279f,0.904173f,-0.0763995f, +0.00329705f,0.962532f,0.271149f, +0.0784063f,0.967252f,0.241403f, +0.186812f,0.966508f,0.175965f, +0.294591f,0.944303f,0.146656f, +0.242144f,0.958708f,0.149151f, +0.122249f,0.946777f,0.297772f, +-0.0273117f,0.906407f,0.421521f, +-0.206066f,0.9181f,0.338568f, +-0.0954796f,0.950658f,0.295183f, +0.102184f,0.964671f,0.242834f, +0.213961f,0.952875f,0.215059f, +0.119187f,0.935673f,0.33213f, +-0.0431159f,0.926594f,0.373584f, +-0.0072858f,0.954565f,0.297913f, +-0.0455381f,0.966183f,0.253806f, +-0.154593f,0.937454f,0.311898f, +-0.199077f,0.936411f,0.288969f, +-0.136466f,0.95497f,0.263457f, +-0.127877f,0.920831f,0.3684f, +-0.229636f,0.912787f,0.337767f, +-0.0324452f,0.91205f,0.408794f, +-0.100812f,0.892675f,0.439282f, +-0.166782f,0.900555f,0.401477f, +0.102011f,0.876619f,0.470247f, +0.195025f,0.830402f,0.521918f, +0.0914158f,0.843587f,0.529154f, +0.0626366f,0.873316f,0.48311f, +-0.00226622f,0.929744f,0.3682f, +-0.0934177f,0.966149f,0.240479f, +-0.109555f,0.963702f,0.243468f, +-0.302241f,0.931855f,0.200739f, +-0.368178f,0.918352f,0.145171f, +-0.476623f,0.864028f,0.162128f, +-0.569304f,0.726984f,0.383911f, +-0.64096f,0.755201f,0.137264f, +-0.241026f,0.942011f,0.233501f, +0.376487f,0.905115f,0.197547f, +0.13011f,0.991259f,-0.0218225f, +-0.643013f,0.733979f,-0.218653f, +-0.19089f,0.942227f,0.275264f, +-0.00867818f,0.931663f,0.363219f, +0.146287f,0.916711f,0.371809f, +0.32054f,0.88208f,0.345239f, +0.0976689f,0.827123f,0.55347f, +0.0475977f,0.818583f,0.572413f, +0.312042f,0.775215f,0.549246f, +-0.398647f,0.872033f,0.283969f, +-0.297551f,0.880657f,0.368657f, +0.0684096f,0.950263f,0.303844f, +0.473417f,0.718991f,0.50885f, +-0.0712795f,0.964076f,0.255885f, +-0.187608f,0.981414f,0.0403824f, +0.441688f,0.892595f,0.090477f, +0.402228f,0.910874f,0.0923076f, +0.356001f,0.889285f,0.287114f, +0.109119f,0.990916f,0.0786044f, +-0.366364f,0.926283f,0.0881909f, +-0.361407f,0.913864f,0.185034f, +0.114451f,0.98516f,0.127909f, +0.511212f,0.854805f,0.0892759f, +0.488262f,0.865451f,0.112231f, +0.135362f,0.990178f,0.0350016f, +0.158924f,0.983832f,0.0825671f, +0.139428f,0.973099f,0.183407f, +-0.0124598f,0.997106f,0.0750005f, +0.111778f,0.989445f,0.0922193f, +0.245419f,0.967744f,0.0569325f, +0.2823f,0.95863f,0.0365395f, +0.172017f,0.973333f,0.151766f, +-0.129296f,0.953534f,0.27213f, +-0.0899396f,0.877846f,0.470422f, +-0.0963581f,0.899855f,0.425413f, +-0.0212856f,0.934761f,0.354638f, +0.147549f,0.94824f,0.281195f, +0.129526f,0.93959f,0.316849f, +0.0223606f,0.903767f,0.427441f, +-0.0124316f,0.909175f,0.41623f, +0.115235f,0.910193f,0.397831f, +-0.0283739f,0.950232f,0.310248f, +-0.203804f,0.932573f,0.297946f, +-0.13899f,0.955458f,0.260347f, +-0.204301f,0.958838f,0.197208f, +-0.229868f,0.915186f,0.331053f, +-0.132513f,0.91447f,0.38234f, +-0.151493f,0.940711f,0.3035f, +-0.124022f,0.907796f,0.400656f, +-0.112999f,0.914934f,0.387462f, +-0.039891f,0.908327f,0.416355f, +0.0930682f,0.835427f,0.541664f, +0.161351f,0.801381f,0.575981f, +0.131487f,0.83942f,0.527339f, +0.132693f,0.857332f,0.497367f, +-0.0832448f,0.920852f,0.380923f, +-0.145993f,0.894645f,0.422252f, +-0.213236f,0.888697f,0.405893f, +-0.293641f,0.888131f,0.353551f, +-0.525155f,0.788991f,0.318912f, +-0.588027f,0.679363f,0.438964f, +-0.478637f,0.812929f,0.331743f, +-0.264049f,0.917426f,0.297671f, +0.302963f,0.900818f,0.31103f, +0.420369f,0.80167f,0.424988f, +-0.470879f,0.867699f,0.159284f, +-0.530406f,0.817263f,0.225279f, +-0.0411983f,0.860627f,0.507566f, +0.103255f,0.833118f,0.543372f, +0.186539f,0.814428f,0.549463f, +0.132619f,0.779192f,0.612594f, +0.0761138f,0.83531f,0.544485f, +0.378863f,0.611781f,0.694397f, +-0.172003f,0.719417f,0.672944f, +-0.295852f,0.804769f,0.514605f, +0.0593285f,0.827842f,0.557814f, +0.323809f,0.743921f,0.584575f, +0.339913f,0.758357f,0.556197f, +-0.00694706f,0.946602f,0.322331f, +0.188872f,0.934445f,0.301895f, +0.251044f,0.713229f,0.654432f, +0.351195f,0.638214f,0.685087f, +0.295602f,0.899369f,0.322109f, +-0.450583f,0.880167f,0.14927f, +-0.375985f,0.904392f,0.201769f, +0.158376f,0.94847f,0.274448f, +0.500024f,0.831884f,0.240719f, +0.503159f,0.8293f,0.243089f, +0.0889199f,0.964326f,0.249335f, +0.108789f,0.932871f,0.34339f, +0.066105f,0.944864f,0.320722f, +-0.09433f,0.994124f,-0.0530892f, +0.0903529f,0.995715f,-0.0196726f, +0.246451f,0.969124f,-0.00783612f, +0.17532f,0.977334f,0.118663f, +0.0145033f,0.945036f,0.326645f, +-0.208385f,0.89773f,0.388145f, +-0.186403f,0.920929f,0.342264f, +-0.0196042f,0.920127f,0.391129f, +0.088861f,0.938743f,0.332966f, +0.0904885f,0.955513f,0.280725f, +0.00776342f,0.887041f,0.461625f, +0.0357997f,0.855618f,0.516368f, +0.0251977f,0.899984f,0.435195f, +0.113155f,0.898436f,0.424273f, +0.0488401f,0.928538f,0.36801f, +-0.122117f,0.962671f,0.241562f, +-0.0832756f,0.977563f,0.193483f, +-0.182752f,0.960599f,0.209407f, +-0.340533f,0.923546f,0.176353f, +-0.207225f,0.949201f,0.236801f, +-0.0875863f,0.939463f,0.331268f, +-0.156293f,0.945917f,0.284277f, +-0.15128f,0.944026f,0.293135f, +-0.133917f,0.921967f,0.363377f, +-0.0187779f,0.901995f,0.431337f, +0.137151f,0.859664f,0.492105f, +0.151864f,0.841546f,0.518398f, +0.169983f,0.832825f,0.526791f, +0.0329472f,0.8585f,0.511754f, +-0.148058f,0.877168f,0.456787f, +-0.179554f,0.872912f,0.453636f, +-0.29061f,0.863835f,0.411502f, +-0.582219f,0.748049f,0.318501f, +-0.586418f,0.753548f,0.297117f, +-0.423744f,0.867437f,0.260755f, +-0.266814f,0.914007f,0.305617f, +0.297036f,0.879751f,0.371224f, +0.301464f,0.846429f,0.438951f, +-0.267915f,0.8201f,0.505626f, +-0.708126f,0.705156f,0.0362171f, +-0.280503f,0.856013f,0.434234f, +0.0634361f,0.843315f,0.533662f, +0.203328f,0.848496f,0.488581f, +0.157757f,0.86266f,0.480552f, +-0.0108627f,0.875364f,0.483343f, +-0.00732908f,0.804113f,0.594431f, +0.217513f,0.756413f,0.616869f, +-0.242879f,0.903897f,0.352108f, +-0.0770731f,0.775477f,0.626654f, +0.238061f,0.731126f,0.639361f, +0.459013f,0.658034f,0.596908f, +0.0332364f,0.855326f,0.517022f, +-0.132848f,0.766918f,0.627844f, +-0.0252308f,0.840734f,0.54086f, +0.442735f,0.688282f,0.574677f, +0.624206f,0.545029f,0.559742f, +-0.216833f,0.89857f,0.381516f, +-0.428783f,0.890698f,0.151005f, +0.076598f,0.986116f,0.147334f, +0.479671f,0.865386f,0.144994f, +0.542246f,0.827427f,0.146065f, +0.100899f,0.969794f,0.222079f, +0.0591096f,0.972132f,0.226859f, +0.163564f,0.950136f,0.265495f, +-0.0539816f,0.998166f,0.0273959f, +0.085626f,0.996323f,0.00278248f, +0.159482f,0.986364f,0.0406345f, +-0.0565903f,0.982572f,0.177057f, +-0.167853f,0.932231f,0.320579f, +-0.135579f,0.92648f,0.351075f, +-0.12175f,0.950039f,0.287407f, +-0.0275f,0.960651f,0.276393f, +0.0945575f,0.956567f,0.27575f, +0.0118837f,0.934274f,0.356358f, +-0.160104f,0.889888f,0.42716f, +0.0609856f,0.903744f,0.423707f, +0.121664f,0.922268f,0.366906f, +0.148425f,0.946235f,0.287418f, +0.23463f,0.944122f,0.231479f, +-0.0440541f,0.996345f,0.0731815f, +-0.127251f,0.98255f,0.135658f, +-0.207412f,0.958865f,0.1938f, +-0.296871f,0.939382f,0.171549f, +-0.278192f,0.946498f,0.163558f, +-0.178451f,0.945897f,0.270988f, +-0.115294f,0.937073f,0.329548f, +-0.175206f,0.945254f,0.275312f, +-0.191323f,0.939359f,0.284604f, +-0.0822793f,0.949627f,0.302389f, +0.0583847f,0.93226f,0.357046f, +0.125066f,0.884667f,0.449136f, +0.147347f,0.866347f,0.477213f, +0.0545541f,0.865292f,0.49829f, +-0.098516f,0.887377f,0.450395f, +-0.209769f,0.897417f,0.388122f, +-0.210182f,0.881546f,0.422729f, +-0.451263f,0.852365f,0.264264f, +-0.650724f,0.758775f,-0.0286192f, +-0.407582f,0.890583f,0.201838f, +-0.388367f,0.887583f,0.247725f, +0.193188f,0.884808f,0.424019f, +0.215311f,0.880386f,0.422566f, +-0.165147f,0.855262f,0.491176f, +-0.520864f,0.795129f,0.310596f, +-0.488998f,0.786967f,0.37625f, +0.0562235f,0.868104f,0.493187f, +0.400928f,0.84731f,0.348313f, +0.199813f,0.978725f,-0.0465961f, +-0.198621f,0.97682f,0.0798329f, +-0.0891351f,0.888352f,0.450429f, +0.204835f,0.834736f,0.511135f, +-0.0720813f,0.941881f,0.328121f, +-0.196291f,0.972713f,0.123691f, +0.179787f,0.980826f,-0.0752149f, +0.511674f,0.853811f,0.0958982f, +0.0191479f,0.909767f,0.414677f, +-0.125562f,0.89333f,0.431505f, +0.22305f,0.943278f,0.245918f, +0.527748f,0.84488f,0.0875187f, +0.598212f,0.799615f,-0.0525252f, +0.0107332f,0.903361f,0.428747f, +-0.300811f,0.914951f,0.269032f, +0.179787f,0.975264f,0.128593f, +0.519301f,0.854591f,0.00126655f, +0.419398f,0.906587f,-0.0469514f, +0.0522982f,0.994257f,0.0933686f, +0.0513278f,0.996267f,0.0694112f, +0.103651f,0.993237f,0.0523089f, +0.0555975f,0.984758f,0.164805f, +0.0862163f,0.988349f,0.12543f, +0.0909734f,0.981273f,0.169784f, +-0.14512f,0.970727f,0.191388f, +-0.180918f,0.953611f,0.240612f, +-0.140102f,0.96533f,0.22025f, +-0.119189f,0.970295f,0.210526f, +-0.0126783f,0.974075f,0.225869f, +0.0237961f,0.97809f,0.20682f, +-0.0862872f,0.95413f,0.286688f, +-0.14433f,0.944949f,0.293667f, +0.132869f,0.954959f,0.265329f, +0.22733f,0.94991f,0.214458f, +0.185536f,0.968744f,0.164655f, +0.30218f,0.927213f,0.221277f, +-0.010566f,0.987352f,0.158194f, +-0.227641f,0.957817f,0.175404f, +-0.212635f,0.950922f,0.224799f, +-0.288872f,0.93765f,0.193302f, +-0.303211f,0.936666f,0.175273f, +-0.283958f,0.943546f,0.170553f, +-0.13575f,0.960553f,0.242714f, +-0.0816944f,0.973992f,0.211345f, +-0.191701f,0.977982f,0.0824724f, +-0.110352f,0.986199f,0.123427f, +-0.0409453f,0.971384f,0.233958f, +0.0185038f,0.933683f,0.357621f, +0.13477f,0.907601f,0.397615f, +0.0792432f,0.925049f,0.371489f, +-0.0350852f,0.929789f,0.366418f, +-0.159548f,0.910971f,0.380363f, +-0.245138f,0.905643f,0.346003f, +-0.179352f,0.926492f,0.330825f, +-0.589052f,0.80668f,0.0478056f, +-0.578625f,0.779472f,0.240033f, +-0.471687f,0.839166f,0.270762f, +0.0987404f,0.916105f,0.388589f, +0.173592f,0.831445f,0.527792f, +-0.220086f,0.704489f,0.674728f, +-0.395802f,0.62503f,0.672813f, +-0.417304f,0.755058f,0.505712f, +0.0513487f,0.865997f,0.497406f, +0.431689f,0.734124f,0.524124f, +0.359032f,0.884637f,0.297512f, +-0.308259f,0.930686f,0.196975f, +-0.34698f,0.877125f,0.332049f, +0.00851592f,0.919266f,0.393545f, +0.326193f,0.840272f,0.433061f, +0.261231f,0.960149f,-0.0993615f, +0.388612f,0.889039f,-0.242053f, +0.0354931f,0.979528f,-0.198152f, +0.0485316f,0.907873f,0.416427f, +-0.0781845f,0.964592f,0.251892f, +0.47974f,0.876345f,0.0432286f, +0.568817f,0.783907f,-0.248873f, +0.483889f,0.834837f,-0.262485f, +-0.220496f,0.975376f,0.00471288f, +-0.25449f,0.933474f,0.252706f, +0.326168f,0.921789f,0.209569f, +0.609761f,0.790958f,0.0507595f, +0.419183f,0.900774f,-0.11354f, +-0.0389936f,0.992704f,-0.114095f, +0.112818f,0.992086f,-0.0551048f, +0.140261f,0.98577f,-0.0926471f, +0.0460285f,0.981507f,0.185811f, +0.0839854f,0.981486f,0.172137f, +0.0780195f,0.983837f,0.161178f, +-0.135272f,0.977846f,0.159743f, +-0.233239f,0.960885f,0.149328f, +-0.119476f,0.978748f,0.166665f, +-0.0623017f,0.991047f,0.118089f, +-0.0310067f,0.999432f,0.0132292f, +-0.0037253f,0.997112f,0.0758502f, +-0.0758016f,0.98526f,0.153355f, +-0.143296f,0.988211f,0.0539015f, +0.103486f,0.991653f,0.076914f, +0.266632f,0.947722f,0.175298f, +0.164045f,0.978994f,0.121078f, +0.196418f,0.969063f,0.149458f, +0.0648458f,0.968138f,0.241876f, +-0.21695f,0.963194f,0.158716f, +-0.238014f,0.956133f,0.17076f, +-0.251543f,0.948014f,0.194926f, +-0.241597f,0.958745f,0.149794f, +-0.248822f,0.966568f,0.0619263f, +-0.195635f,0.9804f,0.0233089f, +0.00681016f,0.994726f,0.102342f, +-0.0728308f,0.997328f,0.00570638f, +-0.223928f,0.970021f,-0.0944255f, +-0.201047f,0.979434f,0.0169867f, +-0.100278f,0.986057f,0.132801f, +0.129703f,0.962794f,0.237074f, +0.129196f,0.949613f,0.28556f, +-0.100355f,0.959332f,0.263838f, +-0.226831f,0.927446f,0.297306f, +-0.211803f,0.921673f,0.325051f, +-0.16781f,0.90652f,0.387378f, +-0.507141f,0.76624f,0.394569f, +-0.499456f,0.740703f,0.449336f, +-0.375574f,0.865361f,0.331805f, +0.0665425f,0.96722f,0.245068f, +-0.127974f,0.946728f,0.295513f, +-0.531445f,0.627941f,0.568557f, +-0.268657f,0.746051f,0.609287f, +-0.123398f,0.84105f,0.526695f, +0.113268f,0.868801f,0.482033f, +0.278975f,0.860996f,0.425274f, +0.256512f,0.783766f,0.565608f, +0.24637f,0.788587f,0.563411f, +-0.207735f,0.977522f,-0.036006f, +0.0390118f,0.996098f,0.0791601f, +0.408253f,0.910351f,0.0677493f, +0.466297f,0.863647f,-0.191525f, +0.226125f,0.967725f,-0.111247f, +-0.24034f,0.965221f,0.102887f, +-0.130757f,0.944853f,0.300258f, +0.283435f,0.943407f,0.172188f, +0.590839f,0.8059f,-0.0378747f, +0.573782f,0.756596f,-0.313587f, +0.355206f,0.926281f,0.12583f, +-0.219704f,0.910923f,0.349212f, +-0.277723f,0.959254f,0.051969f, +0.340807f,0.938572f,0.0541606f, +0.677372f,0.729826f,0.0923128f, +0.49544f,0.867668f,-0.0411347f, +-0.024834f,0.981688f,-0.188872f, +0.050519f,0.974996f,-0.216403f, +0.180767f,0.970256f,-0.161015f, +0.0401148f,0.977494f,0.207113f, +0.106256f,0.969045f,0.222848f, +0.0969035f,0.97128f,0.217314f, +-0.118574f,0.978564f,0.16838f, +-0.194437f,0.978726f,0.0655019f, +-0.11441f,0.993427f,0.0037257f, +0.00229181f,0.999514f,0.0311045f, +0.0309142f,0.998007f,0.0550047f, +-0.113357f,0.989867f,0.085516f, +-0.111292f,0.980012f,0.164894f, +-0.0212066f,0.993646f,0.110539f, +0.0241257f,0.999577f,-0.0162417f, +0.157698f,0.982481f,0.0993122f, +0.222931f,0.950361f,0.21706f, +0.18078f,0.964986f,0.190052f, +0.0702985f,0.98108f,0.180387f, +-0.190259f,0.977665f,0.089291f, +-0.268574f,0.956136f,0.116926f, +-0.267756f,0.955804f,0.121429f, +-0.211446f,0.969418f,0.124579f, +-0.14687f,0.983484f,0.105776f, +-0.198985f,0.979945f,-0.0106117f, +-0.0887412f,0.995564f,0.0312775f, +0.0104704f,0.992989f,0.117739f, +-0.125001f,0.9915f,0.0360868f, +-0.238906f,0.968221f,-0.0739686f, +-0.167029f,0.981518f,-0.0933989f, +-0.0351406f,0.998931f,-0.030045f, +0.0130186f,0.974123f,0.225643f, +-0.0745329f,0.922898f,0.377762f, +-0.18971f,0.916591f,0.351953f, +-0.286917f,0.902381f,0.321538f, +-0.328487f,0.84853f,0.414841f, +-0.591704f,0.685127f,0.424839f, +-0.448564f,0.796089f,0.406241f, +-0.170353f,0.888356f,0.426384f, +-0.00830475f,0.908708f,0.417349f, +-0.140027f,0.883683f,0.446651f, +-0.599598f,0.727182f,0.334197f, +-0.234879f,0.924162f,0.301258f, +-0.0954672f,0.951872f,0.291248f, +0.100155f,0.948228f,0.301383f, +0.352663f,0.898478f,0.261471f, +0.217902f,0.956165f,0.19562f, +0.428441f,0.89557f,0.119967f, +0.0504867f,0.972497f,-0.227379f, +-0.160086f,0.98254f,-0.0948013f, +0.319131f,0.945228f,-0.0685555f, +0.64992f,0.715088f,0.257397f, +0.0361031f,0.995429f,0.0884124f, +-0.2599f,0.897768f,0.355618f, +-0.17567f,0.983498f,0.0432638f, +0.53944f,0.841427f,-0.0317039f, +0.60742f,0.697232f,-0.380669f, +0.609044f,0.790595f,-0.063438f, +-0.195234f,0.980448f,0.0245981f, +-0.224173f,0.885759f,0.406419f, +0.0964403f,0.992198f,0.0790071f, +0.380926f,0.892571f,-0.241272f, +0.532566f,0.777301f,-0.334927f, +0.58332f,0.811668f,0.0305478f, +0.122052f,0.989417f,-0.0784701f, +0.094933f,0.975516f,-0.198385f, +0.104703f,0.956209f,-0.273317f, +0.0116109f,0.989434f,0.144515f, +0.0514824f,0.974923f,0.216505f, +0.096067f,0.950842f,0.294399f, +0.00976988f,0.964716f,0.263111f, +-0.0931121f,0.98126f,0.168699f, +-0.0745948f,0.982842f,0.168693f, +-0.083139f,0.982475f,0.166825f, +-0.0763046f,0.97088f,0.22709f, +-0.130809f,0.960701f,0.244832f, +-0.117161f,0.974629f,0.190711f, +0.0735371f,0.976475f,0.202706f, +0.123062f,0.984428f,0.125529f, +0.0660058f,0.995943f,0.0611663f, +0.0811078f,0.98996f,0.115763f, +0.156048f,0.953727f,0.257008f, +0.12971f,0.935453f,0.32879f, +-0.0928149f,0.955298f,0.280698f, +-0.264252f,0.949049f,0.171686f, +-0.241724f,0.966072f,0.0909662f, +-0.244999f,0.96713f,0.0680795f, +-0.106995f,0.982895f,0.149898f, +-0.106861f,0.990227f,0.089616f, +-0.133621f,0.990932f,0.0141138f, +-0.0517957f,0.998024f,0.0355675f, +-0.0225779f,0.998718f,0.0453005f, +-0.144281f,0.986502f,-0.0774439f, +-0.157036f,0.983398f,-0.0909287f, +-0.161108f,0.986936f,-0.00118469f, +-0.22235f,0.965394f,0.136287f, +-0.250578f,0.942366f,0.221715f, +-0.217658f,0.901831f,0.373264f, +-0.29708f,0.848133f,0.438651f, +-0.36269f,0.819581f,0.443558f, +-0.534096f,0.793842f,0.290785f, +-0.584404f,0.811192f,0.0209707f, +-0.1404f,0.905222f,0.401075f, +-0.307079f,0.89418f,0.325797f, +-0.27164f,0.834087f,0.480115f, +-0.322843f,0.946322f,0.0157466f, +-0.301281f,0.933652f,-0.193713f, +-0.127165f,0.985755f,0.11007f, +0.121812f,0.97858f,0.165962f, +0.500139f,0.864928f,0.0419482f, +0.30357f,0.892132f,-0.334582f, +0.443241f,0.85073f,-0.282481f, +0.0967978f,0.993781f,0.0550442f, +-0.201565f,0.978713f,0.0386423f, +0.209591f,0.974539f,0.0796601f, +0.481917f,0.851558f,0.20641f, +-0.0224044f,0.977009f,0.212016f, +-0.238315f,0.88567f,0.398491f, +0.220358f,0.960844f,0.167992f, +0.601263f,0.791797f,-0.107428f, +0.618362f,0.741713f,-0.25979f, +0.284452f,0.956119f,0.0701626f, +-0.201478f,0.913131f,0.3544f, +-0.20526f,0.978252f,0.0298624f, +0.352634f,0.929538f,-0.107737f, +0.649062f,0.752634f,-0.110725f, +0.490387f,0.729272f,-0.477162f, +0.431974f,0.874843f,-0.219197f, +0.184608f,0.975155f,-0.122446f, +0.192786f,0.978517f,-0.0730681f, +0.240097f,0.966116f,-0.094733f, +-0.255309f,0.963455f,-0.0810722f, +-0.124334f,0.990531f,0.0582188f, +0.042075f,0.979967f,0.194667f, +0.0324324f,0.965776f,0.25734f, +-0.0760147f,0.965606f,0.248649f, +-0.138926f,0.972343f,0.187746f, +-0.0932442f,0.974882f,0.202264f, +-0.0380092f,0.975147f,0.218276f, +-0.0242537f,0.984345f,0.174576f, +-0.0724602f,0.995976f,0.0527463f, +0.0175716f,0.997526f,0.068069f, +0.191598f,0.97051f,0.146287f, +0.0888492f,0.992747f,0.0809944f, +0.0509079f,0.989914f,0.132209f, +0.0413152f,0.988953f,0.142354f, +-0.00590782f,0.97647f,0.215574f, +-0.0327876f,0.94937f,0.312443f, +-0.0862721f,0.978712f,0.186225f, +-0.179337f,0.981669f,0.0645377f, +-0.255621f,0.960924f,0.106226f, +-0.157413f,0.981394f,0.109943f, +-0.0325878f,0.996293f,0.0796149f, +-0.0627116f,0.997982f,-0.00999288f, +-0.0263234f,0.995733f,-0.0884504f, +0.00359159f,0.990572f,-0.136946f, +-0.0963f,0.991181f,-0.0910356f, +-0.255814f,0.966717f,-0.00409974f, +-0.292954f,0.950051f,0.107618f, +-0.259513f,0.946888f,0.189886f, +-0.274998f,0.934354f,0.226623f, +-0.37248f,0.885745f,0.276974f, +-0.384203f,0.849481f,0.361622f, +-0.326853f,0.86434f,0.382208f, +-0.213332f,0.922586f,0.321442f, +-0.528611f,0.848285f,0.0313709f, +-0.466119f,0.869006f,0.166018f, +-0.226659f,0.921685f,0.314837f, +-0.225942f,0.929604f,0.291181f, +0.262979f,0.943638f,0.200972f, +-0.158823f,0.970135f,-0.183342f, +-0.433654f,0.893597f,-0.115884f, +0.0458639f,0.99877f,-0.0188405f, +0.612149f,0.789064f,0.0514904f, +0.423383f,0.878106f,-0.222881f, +0.0967751f,0.930754f,-0.352606f, +0.0811144f,0.996202f,0.0316668f, +-0.413686f,0.895072f,-0.166465f, +0.148131f,0.951189f,0.270735f, +0.436798f,0.864787f,0.247692f, +0.0437864f,0.959427f,0.278536f, +-0.28501f,0.956226f,0.0663364f, +0.510274f,0.859616f,0.0260981f, +0.648806f,0.686419f,-0.328451f, +0.586912f,0.808674f,0.0397475f, +-0.0852935f,0.966768f,0.241009f, +-0.148057f,0.961052f,0.233361f, +0.164136f,0.983527f,-0.0757203f, +0.450314f,0.849987f,-0.273386f, +0.550526f,0.728504f,-0.407679f, +0.58281f,0.780161f,-0.227338f, +0.258267f,0.941325f,-0.21727f, +0.0807909f,0.98982f,-0.117172f, +0.0801488f,0.996327f,0.0301511f, +0.239863f,0.961671f,0.132871f, +-0.229647f,0.969202f,0.0889415f, +-0.172859f,0.981826f,0.0783421f, +-0.0626565f,0.996388f,0.0573105f, +-0.0572909f,0.992727f,0.105883f, +-0.0279351f,0.983375f,0.179427f, +-0.00285096f,0.99214f,0.125102f, +-0.084025f,0.99632f,-0.0168937f, +-0.0732377f,0.997041f,-0.0233556f, +-0.0045065f,0.999839f,0.0173404f, +0.0203121f,0.999722f,0.0119547f, +-0.0506539f,0.996487f,-0.0666886f, +0.119651f,0.992498f,0.0251293f, +0.0686084f,0.989615f,0.126312f, +0.000108814f,0.982339f,0.187109f, +0.0874025f,0.98865f,0.122196f, +-0.0625717f,0.997577f,0.0304034f, +-0.0486926f,0.992353f,0.113426f, +0.0140738f,0.989644f,0.142855f, +-0.151919f,0.980609f,0.123804f, +-0.280176f,0.959074f,0.0409668f, +-0.112828f,0.992642f,-0.0439511f, +0.0530002f,0.995827f,-0.0742939f, +0.0297885f,0.985001f,-0.169959f, +0.0528437f,0.970999f,-0.233169f, +-0.0380639f,0.977109f,-0.209305f, +-0.249056f,0.968138f,-0.0260696f, +-0.370842f,0.913812f,0.165599f, +-0.310025f,0.907402f,0.283736f, +-0.313659f,0.908343f,0.276641f, +-0.360766f,0.88042f,0.307747f, +-0.383668f,0.851108f,0.358349f, +-0.392242f,0.857478f,0.332984f, +-0.296931f,0.900087f,0.318865f, +-0.199402f,0.936164f,0.289543f, +-0.412291f,0.885214f,0.215434f, +-0.62242f,0.781068f,-0.0502514f, +-0.272781f,0.928261f,0.252828f, +-0.317665f,0.921151f,0.224876f, +0.0813846f,0.925309f,0.370378f, +0.00278871f,0.889899f,0.45615f, +-0.460626f,0.879338f,0.120782f, +0.0601251f,0.985077f,0.161272f, +0.599887f,0.787248f,0.142742f, +0.617017f,0.753279f,0.227729f, +0.13665f,0.981422f,0.134675f, +0.136502f,0.974756f,0.176687f, +-0.27066f,0.954113f,-0.128105f, +-0.13295f,0.980241f,-0.146465f, +0.409773f,0.909514f,-0.0697851f, +0.339811f,0.93455f,0.10557f, +-0.243979f,0.943604f,-0.223798f, +0.572252f,0.820076f,0.00181093f, +0.58136f,0.813444f,0.0181706f, +0.213313f,0.927464f,0.307095f, +-0.0427767f,0.853854f,0.518751f, +0.0717407f,0.97577f,0.206702f, +0.349298f,0.936925f,0.0127626f, +0.643074f,0.765767f,0.00757208f, +0.584117f,0.763349f,-0.275872f, +0.414478f,0.906497f,-0.0804466f, +0.213842f,0.975055f,-0.0594842f, +-0.00469446f,0.990505f,-0.137399f, +-0.0685672f,0.992236f,-0.103764f, +0.0844774f,0.996384f,-0.00904741f, +-0.320391f,0.938064f,0.131853f, +-0.173519f,0.96335f,0.204565f, +-0.0123366f,0.973468f,0.228492f, +-0.018009f,0.983892f,0.177855f, +-0.10447f,0.992257f,0.0671745f, +0.0409931f,0.988078f,0.148399f, +0.0370075f,0.994865f,0.0941976f, +-0.0471895f,0.997972f,-0.0427132f, +-0.0371271f,0.993135f,-0.110921f, +0.0109117f,0.996203f,-0.0863686f, +0.0455917f,0.995961f,-0.0773449f, +-0.0321894f,0.986545f,-0.160288f, +-0.0649603f,0.996397f,0.0545189f, +0.00369488f,0.985567f,0.169244f, +0.226168f,0.962189f,0.151787f, +0.029392f,0.999567f,0.00117257f, +-0.13579f,0.984206f,-0.113581f, +-0.10103f,0.992288f,-0.0718192f, +-0.125171f,0.991084f,0.0456533f, +-0.108309f,0.993989f,0.015999f, +-0.0231464f,0.995269f,-0.0943563f, +0.0270486f,0.99325f,-0.112795f, +0.141677f,0.989359f,-0.0331051f, +0.0268575f,0.994547f,-0.100767f, +-0.194101f,0.980932f,0.009818f, +-0.41139f,0.899763f,0.145547f, +-0.482013f,0.8562f,0.185973f, +-0.415606f,0.872343f,0.257468f, +-0.291757f,0.884021f,0.365218f, +-0.316561f,0.886381f,0.337814f, +-0.406f,0.884827f,0.22857f, +-0.363525f,0.905831f,0.217534f, +-0.301242f,0.93366f,0.193734f, +-0.208193f,0.941974f,0.263325f, +-0.164184f,0.932027f,0.323063f, +-0.4694f,0.88027f,-0.0691917f, +-0.525104f,0.840943f,-0.130688f, +-0.256903f,0.950739f,0.17348f, +-0.180022f,0.968548f,0.171775f, +0.0734506f,0.860739f,0.50372f, +-0.205317f,0.895889f,0.393991f, +0.0472127f,0.984089f,0.171289f, +0.492639f,0.869295f,-0.040419f, +0.615313f,0.776504f,0.135761f, +0.240143f,0.940103f,0.241946f, +0.0961855f,0.982412f,0.160044f, +0.107308f,0.976554f,0.186622f, +-0.0192621f,0.988216f,-0.151846f, +0.243819f,0.934285f,-0.260122f, +0.363158f,0.92047f,-0.144401f, +-0.0181857f,0.911833f,-0.410158f, +0.13216f,0.935755f,-0.326948f, +0.234069f,0.876493f,0.42068f, +-0.0429998f,0.864233f,0.501251f, +0.30178f,0.838678f,0.453374f, +0.334916f,0.905993f,0.258858f, +0.486799f,0.865003f,0.121641f, +0.551114f,0.813232f,-0.186886f, +0.639118f,0.75121f,0.164956f, +0.383938f,0.890692f,0.243432f, +0.354878f,0.921145f,0.159855f, +0.162961f,0.98584f,-0.0395363f, +-0.0637937f,0.974986f,-0.212914f, +-0.0365262f,0.968846f,-0.244954f, +-0.281965f,0.951785f,0.120834f, +-0.274882f,0.955225f,0.109473f, +-0.104135f,0.948711f,0.298502f, +0.0826411f,0.912269f,0.401168f, +0.0342531f,0.97031f,0.239425f, +-0.0365634f,0.991589f,0.124154f, +0.134024f,0.975461f,0.174679f, +0.109589f,0.99345f,0.032348f, +0.0453955f,0.994687f,-0.0923934f, +-0.0149079f,0.988982f,-0.147281f, +0.0512217f,0.992549f,-0.110554f, +0.0167819f,0.988638f,-0.149377f, +-0.222271f,0.949144f,-0.222982f, +-0.0921327f,0.987637f,-0.126823f, +0.189567f,0.98184f,-0.00744372f, +0.205171f,0.976356f,0.0680753f, +-0.00982996f,0.993812f,-0.110639f, +-0.0883427f,0.978311f,-0.18736f, +-0.198236f,0.955921f,-0.216604f, +-0.180283f,0.972159f,-0.149685f, +0.0029493f,0.99947f,-0.0324137f, +-0.0433514f,0.998534f,-0.0324142f, +0.0405175f,0.99421f,0.0995223f, +0.00286263f,0.981263f,0.19265f, +-0.296663f,0.921382f,0.251091f, +-0.412123f,0.867858f,0.277446f, +-0.439996f,0.871969f,0.214648f, +-0.457669f,0.875232f,0.156552f, +-0.384822f,0.899193f,0.208242f, +-0.276213f,0.916653f,0.288882f, +-0.314226f,0.91283f,0.260774f, +-0.345662f,0.91535f,0.206522f, +-0.311859f,0.934366f,0.17235f, +-0.323293f,0.931681f,0.165688f, +-0.218081f,0.943645f,0.248946f, +0.00414662f,0.967721f,0.251991f, +-0.350612f,0.910773f,-0.218092f, +-0.590427f,0.768592f,-0.246296f, +-0.263693f,0.937904f,0.225393f, +-0.149885f,0.945975f,0.287518f, +-0.0723712f,0.947676f,0.310922f, +0.303995f,0.902765f,0.304306f, +0.615729f,0.768916f,0.172179f, +0.376573f,0.870472f,0.316971f, +0.258103f,0.862435f,0.435417f, +0.208037f,0.965523f,0.156476f, +0.041711f,0.997309f,0.0602974f, +0.0896451f,0.984172f,0.152868f, +0.200861f,0.950569f,0.236798f, +0.331115f,0.861074f,0.385894f, +0.343908f,0.839357f,0.420961f, +-0.162885f,0.985003f,0.0568977f, +-0.0608521f,0.991774f,0.112611f, +0.279417f,0.937386f,0.207929f, +0.438178f,0.898268f,0.033396f, +0.516016f,0.854846f,-0.0544561f, +0.550254f,0.781096f,-0.295143f, +0.499018f,0.830127f,-0.248738f, +0.421585f,0.905472f,0.0488414f, +0.355515f,0.918443f,0.173411f, +0.416018f,0.882036f,0.221226f, +0.346021f,0.922667f,0.170161f, +0.0862406f,0.994799f,-0.0542001f, +0.0251294f,0.989963f,-0.139071f, +-0.167311f,0.982002f,0.0876306f, +-0.296088f,0.953872f,0.0496014f, +-0.309819f,0.944071f,0.112878f, +0.0107419f,0.974593f,0.223724f, +0.235566f,0.938548f,0.252263f, +0.0528759f,0.995406f,0.0798236f, +0.106055f,0.992977f,0.0524375f, +0.227694f,0.967451f,0.110427f, +0.15013f,0.988604f,0.0110517f, +0.0292872f,0.989448f,-0.141897f, +0.0113647f,0.978518f,-0.205848f, +0.0966514f,0.981912f,-0.162811f, +-0.0834695f,0.969158f,-0.231875f, +-0.173766f,0.92349f,-0.34201f, +0.0289323f,0.967596f,-0.250839f, +0.166759f,0.980973f,-0.0994165f, +0.0796755f,0.992423f,-0.0935347f, +-0.0109031f,0.993494f,-0.113363f, +-0.181202f,0.957527f,-0.224295f, +-0.231371f,0.948894f,-0.214636f, +-0.0963906f,0.978232f,-0.183771f, +-0.0964169f,0.992283f,-0.0779687f, +-0.114591f,0.992373f,0.045429f, +-0.0476997f,0.984744f,0.167343f, +-0.353531f,0.929974f,0.100818f, +-0.42903f,0.892447f,0.139543f, +-0.399459f,0.902474f,0.161164f, +-0.44275f,0.883954f,0.150326f, +-0.416721f,0.891582f,0.177271f, +-0.364313f,0.907101f,0.210818f, +-0.329954f,0.890729f,0.312622f, +-0.308128f,0.891277f,0.33269f, +-0.248313f,0.912421f,0.325314f, +-0.264673f,0.92449f,0.274348f, +-0.221501f,0.958108f,0.181568f, +-0.00722143f,0.985032f,0.17222f, +0.0811419f,0.973825f,0.212324f, +-0.519461f,0.82914f,-0.206608f, +-0.561212f,0.816969f,-0.132674f, +-0.10198f,0.978452f,0.179533f, +-0.0294922f,0.994047f,0.104885f, +0.212965f,0.975972f,0.0461033f, +0.39072f,0.902699f,0.180202f, +0.284816f,0.877828f,0.385096f, +0.371584f,0.726424f,0.578129f, +0.415725f,0.734903f,0.535809f, +0.0647658f,0.913533f,0.401575f, +0.0316961f,0.895539f,0.443852f, +-0.0215836f,0.930013f,0.366891f, +0.0389377f,0.900411f,0.433293f, +0.182398f,0.888094f,0.421923f, +0.319795f,0.864372f,0.388061f, +0.179682f,0.983355f,0.0269752f, +0.358016f,0.913314f,-0.19412f, +0.445422f,0.82688f,-0.343321f, +0.564533f,0.736553f,-0.372547f, +0.511683f,0.792162f,-0.332656f, +0.362215f,0.931906f,0.0187495f, +0.332114f,0.925718f,0.180958f, +0.376936f,0.924108f,0.0628019f, +0.34207f,0.939661f,0.00505146f, +0.432513f,0.89733f,0.0879243f, +0.250624f,0.96783f,0.022189f, +0.113333f,0.993448f,0.0146943f, +-0.330108f,0.943938f,0.00323688f, +-0.32108f,0.944743f,0.0660874f, +-0.312445f,0.949733f,0.0196284f, +-0.0425447f,0.998988f,-0.0145795f, +0.234895f,0.971633f,0.0274452f, +0.205978f,0.978297f,0.0225396f, +0.0556133f,0.99289f,-0.10525f, +0.149272f,0.988455f,-0.0259672f, +0.25486f,0.966188f,0.0390683f, +0.206371f,0.977859f,-0.0346908f, +0.0798975f,0.983688f,-0.161166f, +0.0387149f,0.980238f,-0.193996f, +-0.0261652f,0.985317f,-0.168719f, +-0.115457f,0.963019f,-0.243441f, +-0.0914394f,0.962229f,-0.256427f, +0.0382488f,0.992063f,-0.119784f, +0.0800161f,0.996698f,-0.0137989f, +0.0187475f,0.998138f,-0.0580508f, +-0.073595f,0.994051f,-0.0802936f, +-0.224165f,0.957926f,-0.179241f, +-0.16346f,0.967941f,-0.190711f, +-0.19173f,0.978244f,-0.0792358f, +-0.275576f,0.961029f,-0.0219235f, +-0.0407932f,0.98802f,0.148838f, +-0.278629f,0.956556f,0.085827f, +-0.465684f,0.878931f,0.103047f, +-0.438529f,0.89146f,0.11398f, +-0.455089f,0.880964f,0.129601f, +-0.457802f,0.879895f,0.127287f, +-0.406331f,0.89051f,0.204664f, +-0.386395f,0.891456f,0.236654f, +-0.321818f,0.921226f,0.218577f, +-0.271011f,0.935727f,0.22576f, +-0.198383f,0.944022f,0.263564f, +-0.105727f,0.975806f,0.191373f, +-0.0832756f,0.987941f,0.130528f, +0.0931562f,0.956641f,0.27597f, +-0.216408f,0.96162f,0.168686f, +-0.648586f,0.688743f,-0.323988f, +-0.276841f,0.843915f,-0.459527f, +-0.060911f,0.935148f,-0.348981f, +0.243821f,0.963831f,-0.107611f, +0.35478f,0.93349f,-0.0522288f, +0.124674f,0.987025f,-0.101179f, +0.106145f,0.993646f,0.0374371f, +0.264307f,0.911176f,0.316069f, +0.180037f,0.821936f,0.540378f, +0.0976487f,0.839888f,0.533903f, +0.242869f,0.82432f,0.511381f, +0.296956f,0.900742f,0.316987f, +0.37446f,0.92343f,0.0840066f, +0.38614f,0.913414f,-0.128727f, +0.497691f,0.838063f,-0.223505f, +0.399217f,0.778523f,-0.484281f, +0.607215f,0.684189f,-0.403949f, +0.455879f,0.835157f,-0.307715f, +0.317815f,0.943806f,-0.0906903f, +0.166917f,0.983806f,0.0653043f, +0.277188f,0.953387f,0.119249f, +0.491287f,0.85011f,0.189606f, +0.3858f,0.919271f,0.0780984f, +0.390109f,0.91635f,0.0900968f, +0.247947f,0.964668f,0.0890966f, +0.0188396f,0.999506f,0.0251451f, +-0.249227f,0.949063f,0.192782f, +-0.24873f,0.963608f,0.0979465f, +-0.225537f,0.968208f,-0.108193f, +-0.0586638f,0.984304f,-0.166448f, +0.193919f,0.980395f,-0.0349386f, +0.232927f,0.972341f,0.0172453f, +0.165218f,0.985248f,-0.0445953f, +0.10666f,0.982482f,-0.152814f, +0.176402f,0.976328f,-0.125164f, +0.217875f,0.975941f,-0.00837002f, +0.138055f,0.990338f,0.0130638f, +0.0914598f,0.995289f,-0.0321788f, +-0.014672f,0.992233f,-0.123523f, +-0.0701479f,0.990985f,-0.114142f, +-0.0940689f,0.987781f,-0.124254f, +-0.152176f,0.977744f,-0.144426f, +0.043676f,0.996991f,0.0640382f, +0.0457416f,0.996307f,0.07266f, +-0.0198973f,0.997072f,0.0738311f, +-0.119455f,0.990174f,-0.0727032f, +-0.224875f,0.962572f,-0.151282f, +-0.250045f,0.966903f,-0.0507448f, +-0.319974f,0.944248f,-0.0775328f, +-0.16005f,0.987102f,-0.00365841f, +-0.307005f,0.947659f,0.0876954f, +-0.490256f,0.846833f,0.206209f, +-0.400386f,0.879926f,0.255778f, +-0.427515f,0.880624f,0.204282f, +-0.477897f,0.856347f,0.195663f, +-0.43217f,0.864768f,0.255745f, +-0.342474f,0.92438f,0.16803f, +-0.284468f,0.956998f,0.0568588f, +-0.290121f,0.956708f,0.023234f, +-0.249156f,0.966838f,0.0560771f, +-0.0655515f,0.986836f,0.147842f, +-0.100568f,0.984251f,0.145384f, +-0.0191778f,0.985445f,0.168911f, +-0.0443403f,0.97787f,0.204462f, +-0.28653f,0.957033f,-0.044587f, +-0.127864f,0.901634f,-0.413166f, +-0.0930849f,0.861283f,-0.499526f, +-0.10032f,0.791759f,-0.60254f, +0.277857f,0.863349f,-0.421218f, +0.0733471f,0.944573f,-0.320003f, +0.0656198f,0.995434f,-0.0693225f, +0.0994234f,0.993172f,-0.0610351f, +0.0758799f,0.991718f,0.103618f, +0.0755546f,0.978148f,0.193698f, +0.318521f,0.931105f,0.177731f, +0.532035f,0.846717f,0.00302226f, +0.479952f,0.801468f,-0.356785f, +0.444207f,0.753204f,-0.485143f, +0.599635f,0.661874f,-0.449845f, +0.467802f,0.782561f,-0.410805f, +0.194572f,0.899472f,-0.391269f, +0.334078f,0.938895f,-0.0828733f, +0.236858f,0.971355f,0.0191963f, +0.177255f,0.983392f,0.0389945f, +0.22691f,0.973661f,-0.0222777f, +0.408661f,0.912593f,0.013075f, +0.394434f,0.908333f,0.139114f, +0.34039f,0.913901f,0.221176f, +0.340162f,0.904445f,0.257428f, +0.21637f,0.954077f,0.207173f, +-0.190356f,0.960699f,0.202044f, +-0.0745122f,0.978557f,0.192026f, +-0.0103556f,0.997337f,0.0721953f, +-0.102208f,0.994222f,-0.0328074f, +0.0538732f,0.998534f,0.00527007f, +0.220064f,0.97523f,-0.0223306f, +0.22889f,0.972208f,-0.0492086f, +0.203387f,0.976813f,-0.0668524f, +0.112155f,0.987122f,-0.114071f, +0.137033f,0.989998f,-0.0335468f, +0.125928f,0.990544f,-0.0544465f, +0.164164f,0.983484f,-0.0762248f, +0.056178f,0.987899f,-0.14457f, +-0.125491f,0.977887f,-0.167299f, +-0.0763702f,0.993552f,-0.0837951f, +-0.140516f,0.986451f,-0.0846751f, +-0.138825f,0.988035f,-0.0671838f, +0.0272382f,0.998662f,0.0439583f, +0.051406f,0.998673f,0.00322772f, +0.0131796f,0.996364f,-0.0841692f, +-0.197723f,0.973335f,-0.116299f, +-0.315939f,0.94482f,-0.0865842f, +-0.273936f,0.961179f,-0.0330844f, +-0.278588f,0.957771f,-0.0711653f, +-0.371629f,0.922753f,0.102078f, +-0.589295f,0.797687f,0.128167f, +-0.394808f,0.893641f,0.213383f, +-0.419749f,0.89327f,0.160869f, +-0.503386f,0.848953f,0.160878f, +-0.392151f,0.910681f,0.129912f, +-0.194389f,0.97789f,0.0771005f, +-0.210697f,0.97754f,0.00473511f, +-0.261758f,0.965059f,0.0120029f, +-0.306606f,0.951531f,-0.0240962f, +-0.191391f,0.98062f,0.0418887f, +-0.0805366f,0.9875f,0.135492f, +-0.0197042f,0.996843f,0.0769187f, +-0.0102082f,0.996001f,0.0887568f, +-0.106967f,0.993499f,0.0389638f, +-0.0299932f,0.997488f,-0.0641764f, +0.166392f,0.98551f,-0.0329295f, +0.122834f,0.919366f,-0.373736f, +0.0989442f,0.860803f,-0.499228f, +-0.16483f,0.786842f,-0.594736f, +-0.139994f,0.854441f,-0.500331f, +0.037386f,0.884593f,-0.464864f, +-0.0340706f,0.910599f,-0.411885f, +0.0643546f,0.934103f,-0.351155f, +0.330549f,0.864687f,-0.378225f, +0.61879f,0.706641f,-0.343158f, +0.664468f,0.668218f,-0.334614f, +0.535603f,0.737564f,-0.411252f, +0.392926f,0.807647f,-0.439677f, +0.299634f,0.936543f,-0.181953f, +0.20385f,0.978529f,-0.030423f, +0.255219f,0.962099f,-0.0960637f, +0.218057f,0.97044f,-0.103423f, +0.152183f,0.981776f,-0.113823f, +0.287579f,0.953452f,-0.0907011f, +0.354102f,0.933846f,-0.0504376f, +0.271766f,0.955964f,0.110796f, +0.254566f,0.942907f,0.214762f, +0.330431f,0.909031f,0.253925f, +0.276649f,0.934017f,0.226003f, +-0.276078f,0.960525f,0.0342386f, +-0.126608f,0.988039f,0.088024f, +-0.0433883f,0.982429f,0.181523f, +-0.0351658f,0.95918f,0.280603f, +0.130316f,0.978179f,0.161815f, +0.34012f,0.939563f,0.0392436f, +0.225269f,0.971719f,-0.0708295f, +0.186144f,0.981343f,-0.0481244f, +0.117145f,0.991402f,-0.0582961f, +0.122374f,0.988553f,-0.0882497f, +0.217284f,0.968092f,-0.124844f, +0.168939f,0.967628f,-0.1875f, +0.0966952f,0.983818f,-0.150838f, +-0.108071f,0.971789f,-0.209635f, +-0.167419f,0.956466f,-0.239047f, +-0.15925f,0.972646f,-0.169115f, +-0.169755f,0.972705f,-0.158205f, +0.0352685f,0.991682f,-0.123784f, +0.0984439f,0.980655f,-0.169186f, +0.0318934f,0.989724f,-0.139387f, +-0.246309f,0.963763f,-0.102435f, +-0.355567f,0.934631f,-0.00599911f, +-0.265814f,0.963735f,-0.0236194f, +-0.351588f,0.935043f,-0.0456126f, +-0.494494f,0.858936f,0.133056f, +-0.559402f,0.824266f,0.0874941f, +-0.405326f,0.914016f,0.0169127f, +-0.376559f,0.926338f,0.010028f, +-0.448864f,0.890609f,-0.0730511f, +-0.3487f,0.913403f,-0.210007f, +-0.225518f,0.948441f,-0.222713f, +-0.278172f,0.957801f,-0.0723737f, +-0.296428f,0.947861f,0.117f, +-0.260326f,0.954501f,0.14546f, +-0.208806f,0.976306f,0.0568064f, +-0.0937503f,0.995595f,-0.00141652f, +0.0211825f,0.998587f,-0.0487327f, +-0.0203898f,0.998016f,-0.0595622f, +-0.117256f,0.992273f,-0.0405676f, +0.0346735f,0.999272f,0.0158994f, +0.165596f,0.985653f,-0.0326431f, +0.277068f,0.959929f,-0.0420538f, +0.211278f,0.971116f,-0.110882f, +0.138826f,0.972226f,-0.188423f, +0.0186164f,0.920791f,-0.389612f, +0.00693313f,0.891348f,-0.453267f, +-0.0471378f,0.869656f,-0.491403f, +0.135484f,0.84445f,-0.518217f, +0.351566f,0.784405f,-0.510988f, +0.399468f,0.772299f,-0.493943f, +0.574953f,0.790421f,-0.211338f, +0.577809f,0.813449f,-0.0666111f, +0.451377f,0.892327f,0.00336233f, +0.237932f,0.970883f,-0.0278435f, +0.170635f,0.975266f,-0.140498f, +0.305065f,0.94416f,-0.124487f, +0.219111f,0.958291f,-0.183492f, +0.160317f,0.981326f,-0.106286f, +0.222178f,0.974771f,-0.021419f, +0.23168f,0.971792f,0.0441002f, +0.140177f,0.984507f,0.105338f, +0.184383f,0.966339f,0.179422f, +0.307531f,0.911743f,0.272303f, +0.342083f,0.879118f,0.331859f, +-0.245266f,0.968917f,0.0323163f, +-0.176433f,0.984311f,-0.00156667f, +-0.164847f,0.983548f,0.0738887f, +-0.0271087f,0.959686f,0.279762f, +0.210185f,0.960158f,0.18417f, +0.386525f,0.917795f,0.0908302f, +0.288585f,0.956426f,0.04436f, +0.157424f,0.986731f,-0.0397454f, +0.194229f,0.980956f,0.000793421f, +0.143953f,0.978f,-0.150974f, +0.243865f,0.955091f,-0.168319f, +0.151307f,0.968911f,-0.195749f, +0.0861511f,0.987302f,-0.133462f, +-0.0343302f,0.988258f,-0.148887f, +-0.149683f,0.954065f,-0.259529f, +-0.180054f,0.943807f,-0.277143f, +-0.182632f,0.946912f,-0.26458f, +0.0250152f,0.97257f,-0.23126f, +0.0655433f,0.96826f,-0.241197f, +0.00940225f,0.990707f,-0.135685f, +-0.313822f,0.94168f,-0.121471f, +-0.325919f,0.940955f,0.0915474f, +-0.245857f,0.968763f,-0.0324418f, +-0.38384f,0.920444f,-0.0738245f, +-0.542624f,0.834584f,0.0950211f, +-0.496894f,0.865347f,0.0653522f, +-0.40471f,0.910862f,-0.0808731f, +-0.336326f,0.940002f,-0.0572751f, +-0.384947f,0.90765f,-0.167296f, +-0.26052f,0.919475f,-0.294439f, +-0.278076f,0.879766f,-0.385599f, +-0.415096f,0.880667f,-0.2283f, +-0.411169f,0.907675f,0.0840562f, +-0.22106f,0.940981f,0.256296f, +-0.105371f,0.978797f,0.175653f, +-0.0100537f,0.999811f,0.0166273f, +0.0459065f,0.991326f,-0.123151f, +-0.0151969f,0.991011f,-0.132912f, +-0.164041f,0.976761f,-0.137947f, +0.00793599f,0.998771f,-0.0489272f, +0.178958f,0.98335f,-0.031577f, +0.314466f,0.949045f,-0.0206086f, +0.240757f,0.963062f,-0.120617f, +0.126531f,0.982046f,-0.139911f, +0.0695074f,0.9956f,-0.062839f, +0.0427419f,0.998852f,-0.02164f, +-0.0292495f,0.993565f,-0.109419f, +0.176081f,0.974549f,-0.138744f, +0.405406f,0.900659f,-0.156393f, +0.48202f,0.865956f,-0.133334f, +0.477566f,0.852664f,-0.211881f, +0.526274f,0.839922f,-0.132537f, +0.390331f,0.920621f,-0.0098857f, +0.349443f,0.931118f,0.104442f, +0.205374f,0.96487f,-0.163851f, +0.359411f,0.921384f,-0.147904f, +0.161592f,0.938137f,-0.306246f, +0.0124614f,0.982178f,-0.187542f, +0.143914f,0.986786f,0.0744463f, +0.270333f,0.949018f,0.162126f, +0.132f,0.991194f,0.0105184f, +0.131712f,0.991267f,0.00644011f, +0.199003f,0.974024f,0.108048f, +0.274163f,0.928953f,0.248757f, +}; + +btScalar Landscape01Tex[] = { +0.507813f,0.0078125f, +0.507813f,0.0f, +0.515625f,0.0078125f, +0.515625f,0.0f, +0.523438f,0.0078125f, +0.523438f,0.0f, +0.53125f,0.0078125f, +0.53125f,0.0f, +0.539063f,0.0078125f, +0.539063f,0.0f, +0.546875f,0.0078125f, +0.546875f,0.0f, +0.554688f,0.0078125f, +0.554688f,0.0f, +0.5625f,0.0078125f, +0.5625f,0.0f, +0.570313f,0.0078125f, +0.570313f,0.0f, +0.578125f,0.0078125f, +0.578125f,0.0f, +0.585938f,0.0078125f, +0.585938f,0.0f, +0.59375f,0.0078125f, +0.59375f,0.0f, +0.601563f,0.0078125f, +0.601563f,0.0f, +0.609375f,0.0078125f, +0.609375f,0.0f, +0.617188f,0.0078125f, +0.617188f,0.0f, +0.625f,0.0078125f, +0.625f,0.0f, +0.632813f,0.0078125f, +0.632813f,0.0f, +0.640625f,0.0078125f, +0.640625f,0.0f, +0.648438f,0.0078125f, +0.648438f,0.0f, +0.65625f,0.0078125f, +0.65625f,0.0f, +0.664063f,0.0078125f, +0.664063f,0.0f, +0.671875f,0.0078125f, +0.671875f,0.0f, +0.679688f,0.0078125f, +0.679688f,0.0f, +0.6875f,0.0078125f, +0.6875f,0.0f, +0.695313f,0.0078125f, +0.695313f,0.0f, +0.703125f,0.0078125f, +0.703125f,0.0f, +0.710938f,0.0078125f, +0.710938f,0.0f, +0.71875f,0.0078125f, +0.71875f,0.0f, +0.726563f,0.0078125f, +0.726563f,0.0f, +0.734375f,0.0078125f, +0.734375f,0.0f, +0.742188f,0.0078125f, +0.742188f,0.0f, +0.75f,0.0078125f, +0.75f,0.0f, +0.757813f,0.0078125f, +0.757813f,0.0f, +0.765625f,0.0078125f, +0.765625f,0.0f, +0.773438f,0.0078125f, +0.773438f,0.0f, +0.78125f,0.0078125f, +0.78125f,0.0f, +0.789063f,0.0078125f, +0.789063f,0.0f, +0.796875f,0.0078125f, +0.796875f,0.0f, +0.804688f,0.0078125f, +0.804688f,0.0f, +0.8125f,0.0078125f, +0.8125f,0.0f, +0.820313f,0.0078125f, +0.820313f,0.0f, +0.828125f,0.0078125f, +0.828125f,0.0f, +0.835938f,0.0078125f, +0.835938f,0.0f, +0.84375f,0.0078125f, +0.84375f,0.0f, +0.851563f,0.0078125f, +0.851563f,0.0f, +0.859375f,0.0078125f, +0.859375f,0.0f, +0.867188f,0.0078125f, +0.867188f,0.0f, +0.875f,0.0078125f, +0.875f,0.0f, +0.882813f,0.0078125f, +0.882813f,0.0f, +0.890625f,0.0078125f, +0.890625f,0.0f, +0.898438f,0.0078125f, +0.898438f,0.0f, +0.90625f,0.0078125f, +0.90625f,0.0f, +0.914063f,0.0078125f, +0.914063f,0.0f, +0.921875f,0.0078125f, +0.921875f,0.0f, +0.929688f,0.0078125f, +0.929688f,0.0f, +0.9375f,0.0078125f, +0.9375f,0.0f, +0.945313f,0.0078125f, +0.945313f,0.0f, +0.953125f,0.0078125f, +0.953125f,0.0f, +0.960938f,0.0078125f, +0.960938f,0.0f, +0.96875f,0.0078125f, +0.96875f,0.0f, +0.976563f,0.0078125f, +0.976563f,0.0f, +0.984375f,0.0078125f, +0.984375f,0.0f, +0.992188f,0.0078125f, +0.992188f,0.0f, +1.0f,0.0078125f, +1.0f,0.0f, +0.507813f,0.015625f, +0.515625f,0.015625f, +0.523438f,0.015625f, +0.53125f,0.015625f, +0.539063f,0.015625f, +0.546875f,0.015625f, +0.554688f,0.015625f, +0.5625f,0.015625f, +0.570313f,0.015625f, +0.578125f,0.015625f, +0.585938f,0.015625f, +0.59375f,0.015625f, +0.601563f,0.015625f, +0.609375f,0.015625f, +0.617188f,0.015625f, +0.625f,0.015625f, +0.632813f,0.015625f, +0.640625f,0.015625f, +0.648438f,0.015625f, +0.65625f,0.015625f, +0.664063f,0.015625f, +0.671875f,0.015625f, +0.679688f,0.015625f, +0.6875f,0.015625f, +0.695313f,0.015625f, +0.703125f,0.015625f, +0.710938f,0.015625f, +0.71875f,0.015625f, +0.726563f,0.015625f, +0.734375f,0.015625f, +0.742188f,0.015625f, +0.75f,0.015625f, +0.757813f,0.015625f, +0.765625f,0.015625f, +0.773438f,0.015625f, +0.78125f,0.015625f, +0.789063f,0.015625f, +0.796875f,0.015625f, +0.804688f,0.015625f, +0.8125f,0.015625f, +0.820313f,0.015625f, +0.828125f,0.015625f, +0.835938f,0.015625f, +0.84375f,0.015625f, +0.851563f,0.015625f, +0.859375f,0.015625f, +0.867188f,0.015625f, +0.875f,0.015625f, +0.882813f,0.015625f, +0.890625f,0.015625f, +0.898438f,0.015625f, +0.90625f,0.015625f, +0.914063f,0.015625f, +0.921875f,0.015625f, +0.929688f,0.015625f, +0.9375f,0.015625f, +0.945313f,0.015625f, +0.953125f,0.015625f, +0.960938f,0.015625f, +0.96875f,0.015625f, +0.976563f,0.015625f, +0.984375f,0.015625f, +0.992188f,0.015625f, +1.0f,0.015625f, +0.507813f,0.0234375f, +0.515625f,0.0234375f, +0.523438f,0.0234375f, +0.53125f,0.0234375f, +0.539063f,0.0234375f, +0.546875f,0.0234375f, +0.554688f,0.0234375f, +0.5625f,0.0234375f, +0.570313f,0.0234375f, +0.578125f,0.0234375f, +0.585938f,0.0234375f, +0.59375f,0.0234375f, +0.601563f,0.0234375f, +0.609375f,0.0234375f, +0.617188f,0.0234375f, +0.625f,0.0234375f, +0.632813f,0.0234375f, +0.640625f,0.0234375f, +0.648438f,0.0234375f, +0.65625f,0.0234375f, +0.664063f,0.0234375f, +0.671875f,0.0234375f, +0.679688f,0.0234375f, +0.6875f,0.0234375f, +0.695313f,0.0234375f, +0.703125f,0.0234375f, +0.710938f,0.0234375f, +0.71875f,0.0234375f, +0.726563f,0.0234375f, +0.734375f,0.0234375f, +0.742188f,0.0234375f, +0.75f,0.0234375f, +0.757813f,0.0234375f, +0.765625f,0.0234375f, +0.773438f,0.0234375f, +0.78125f,0.0234375f, +0.789063f,0.0234375f, +0.796875f,0.0234375f, +0.804688f,0.0234375f, +0.8125f,0.0234375f, +0.820313f,0.0234375f, +0.828125f,0.0234375f, +0.835938f,0.0234375f, +0.84375f,0.0234375f, +0.851563f,0.0234375f, +0.859375f,0.0234375f, +0.867188f,0.0234375f, +0.875f,0.0234375f, +0.882813f,0.0234375f, +0.890625f,0.0234375f, +0.898438f,0.0234375f, +0.90625f,0.0234375f, +0.914063f,0.0234375f, +0.921875f,0.0234375f, +0.929688f,0.0234375f, +0.9375f,0.0234375f, +0.945313f,0.0234375f, +0.953125f,0.0234375f, +0.960938f,0.0234375f, +0.96875f,0.0234375f, +0.976563f,0.0234375f, +0.984375f,0.0234375f, +0.992188f,0.0234375f, +1.0f,0.0234375f, +0.507813f,0.03125f, +0.515625f,0.03125f, +0.523438f,0.03125f, +0.53125f,0.03125f, +0.539063f,0.03125f, +0.546875f,0.03125f, +0.554688f,0.03125f, +0.5625f,0.03125f, +0.570313f,0.03125f, +0.578125f,0.03125f, +0.585938f,0.03125f, +0.59375f,0.03125f, +0.601563f,0.03125f, +0.609375f,0.03125f, +0.617188f,0.03125f, +0.625f,0.03125f, +0.632813f,0.03125f, +0.640625f,0.03125f, +0.648438f,0.03125f, +0.65625f,0.03125f, +0.664063f,0.03125f, +0.671875f,0.03125f, +0.679688f,0.03125f, +0.6875f,0.03125f, +0.695313f,0.03125f, +0.703125f,0.03125f, +0.710938f,0.03125f, +0.71875f,0.03125f, +0.726563f,0.03125f, +0.734375f,0.03125f, +0.742188f,0.03125f, +0.75f,0.03125f, +0.757813f,0.03125f, +0.765625f,0.03125f, +0.773438f,0.03125f, +0.78125f,0.03125f, +0.789063f,0.03125f, +0.796875f,0.03125f, +0.804688f,0.03125f, +0.8125f,0.03125f, +0.820313f,0.03125f, +0.828125f,0.03125f, +0.835938f,0.03125f, +0.84375f,0.03125f, +0.851563f,0.03125f, +0.859375f,0.03125f, +0.867188f,0.03125f, +0.875f,0.03125f, +0.882813f,0.03125f, +0.890625f,0.03125f, +0.898438f,0.03125f, +0.90625f,0.03125f, +0.914063f,0.03125f, +0.921875f,0.03125f, +0.929688f,0.03125f, +0.9375f,0.03125f, +0.945313f,0.03125f, +0.953125f,0.03125f, +0.960938f,0.03125f, +0.96875f,0.03125f, +0.976563f,0.03125f, +0.984375f,0.03125f, +0.992188f,0.03125f, +1.0f,0.03125f, +0.507813f,0.0390625f, +0.515625f,0.0390625f, +0.523438f,0.0390625f, +0.53125f,0.0390625f, +0.539063f,0.0390625f, +0.546875f,0.0390625f, +0.554688f,0.0390625f, +0.5625f,0.0390625f, +0.570313f,0.0390625f, +0.578125f,0.0390625f, +0.585938f,0.0390625f, +0.59375f,0.0390625f, +0.601563f,0.0390625f, +0.609375f,0.0390625f, +0.617188f,0.0390625f, +0.625f,0.0390625f, +0.632813f,0.0390625f, +0.640625f,0.0390625f, +0.648438f,0.0390625f, +0.65625f,0.0390625f, +0.664063f,0.0390625f, +0.671875f,0.0390625f, +0.679688f,0.0390625f, +0.6875f,0.0390625f, +0.695313f,0.0390625f, +0.703125f,0.0390625f, +0.710938f,0.0390625f, +0.71875f,0.0390625f, +0.726563f,0.0390625f, +0.734375f,0.0390625f, +0.742188f,0.0390625f, +0.75f,0.0390625f, +0.757813f,0.0390625f, +0.765625f,0.0390625f, +0.773438f,0.0390625f, +0.78125f,0.0390625f, +0.789063f,0.0390625f, +0.796875f,0.0390625f, +0.804688f,0.0390625f, +0.8125f,0.0390625f, +0.820313f,0.0390625f, +0.828125f,0.0390625f, +0.835938f,0.0390625f, +0.84375f,0.0390625f, +0.851563f,0.0390625f, +0.859375f,0.0390625f, +0.867188f,0.0390625f, +0.875f,0.0390625f, +0.882813f,0.0390625f, +0.890625f,0.0390625f, +0.898438f,0.0390625f, +0.90625f,0.0390625f, +0.914063f,0.0390625f, +0.921875f,0.0390625f, +0.929688f,0.0390625f, +0.9375f,0.0390625f, +0.945313f,0.0390625f, +0.953125f,0.0390625f, +0.960938f,0.0390625f, +0.96875f,0.0390625f, +0.976563f,0.0390625f, +0.984375f,0.0390625f, +0.992188f,0.0390625f, +1.0f,0.0390625f, +0.507813f,0.046875f, +0.515625f,0.046875f, +0.523438f,0.046875f, +0.53125f,0.046875f, +0.539063f,0.046875f, +0.546875f,0.046875f, +0.554688f,0.046875f, +0.5625f,0.046875f, +0.570313f,0.046875f, +0.578125f,0.046875f, +0.585938f,0.046875f, +0.59375f,0.046875f, +0.601563f,0.046875f, +0.609375f,0.046875f, +0.617188f,0.046875f, +0.625f,0.046875f, +0.632813f,0.046875f, +0.640625f,0.046875f, +0.648438f,0.046875f, +0.65625f,0.046875f, +0.664063f,0.046875f, +0.671875f,0.046875f, +0.679688f,0.046875f, +0.6875f,0.046875f, +0.695313f,0.046875f, +0.703125f,0.046875f, +0.710938f,0.046875f, +0.71875f,0.046875f, +0.726563f,0.046875f, +0.734375f,0.046875f, +0.742188f,0.046875f, +0.75f,0.046875f, +0.757813f,0.046875f, +0.765625f,0.046875f, +0.773438f,0.046875f, +0.78125f,0.046875f, +0.789063f,0.046875f, +0.796875f,0.046875f, +0.804688f,0.046875f, +0.8125f,0.046875f, +0.820313f,0.046875f, +0.828125f,0.046875f, +0.835938f,0.046875f, +0.84375f,0.046875f, +0.851563f,0.046875f, +0.859375f,0.046875f, +0.867188f,0.046875f, +0.875f,0.046875f, +0.882813f,0.046875f, +0.890625f,0.046875f, +0.898438f,0.046875f, +0.90625f,0.046875f, +0.914063f,0.046875f, +0.921875f,0.046875f, +0.929688f,0.046875f, +0.9375f,0.046875f, +0.945313f,0.046875f, +0.953125f,0.046875f, +0.960938f,0.046875f, +0.96875f,0.046875f, +0.976563f,0.046875f, +0.984375f,0.046875f, +0.992188f,0.046875f, +1.0f,0.046875f, +0.507813f,0.0546875f, +0.515625f,0.0546875f, +0.523438f,0.0546875f, +0.53125f,0.0546875f, +0.539063f,0.0546875f, +0.546875f,0.0546875f, +0.554688f,0.0546875f, +0.5625f,0.0546875f, +0.570313f,0.0546875f, +0.578125f,0.0546875f, +0.585938f,0.0546875f, +0.59375f,0.0546875f, +0.601563f,0.0546875f, +0.609375f,0.0546875f, +0.617188f,0.0546875f, +0.625f,0.0546875f, +0.632813f,0.0546875f, +0.640625f,0.0546875f, +0.648438f,0.0546875f, +0.65625f,0.0546875f, +0.664063f,0.0546875f, +0.671875f,0.0546875f, +0.679688f,0.0546875f, +0.6875f,0.0546875f, +0.695313f,0.0546875f, +0.703125f,0.0546875f, +0.710938f,0.0546875f, +0.71875f,0.0546875f, +0.726563f,0.0546875f, +0.734375f,0.0546875f, +0.742188f,0.0546875f, +0.75f,0.0546875f, +0.757813f,0.0546875f, +0.765625f,0.0546875f, +0.773438f,0.0546875f, +0.78125f,0.0546875f, +0.789063f,0.0546875f, +0.796875f,0.0546875f, +0.804688f,0.0546875f, +0.8125f,0.0546875f, +0.820313f,0.0546875f, +0.828125f,0.0546875f, +0.835938f,0.0546875f, +0.84375f,0.0546875f, +0.851563f,0.0546875f, +0.859375f,0.0546875f, +0.867188f,0.0546875f, +0.875f,0.0546875f, +0.882813f,0.0546875f, +0.890625f,0.0546875f, +0.898438f,0.0546875f, +0.90625f,0.0546875f, +0.914063f,0.0546875f, +0.921875f,0.0546875f, +0.929688f,0.0546875f, +0.9375f,0.0546875f, +0.945313f,0.0546875f, +0.953125f,0.0546875f, +0.960938f,0.0546875f, +0.96875f,0.0546875f, +0.976563f,0.0546875f, +0.984375f,0.0546875f, +0.992188f,0.0546875f, +1.0f,0.0546875f, +0.507813f,0.0625f, +0.515625f,0.0625f, +0.523438f,0.0625f, +0.53125f,0.0625f, +0.539063f,0.0625f, +0.546875f,0.0625f, +0.554688f,0.0625f, +0.5625f,0.0625f, +0.570313f,0.0625f, +0.578125f,0.0625f, +0.585938f,0.0625f, +0.59375f,0.0625f, +0.601563f,0.0625f, +0.609375f,0.0625f, +0.617188f,0.0625f, +0.625f,0.0625f, +0.632813f,0.0625f, +0.640625f,0.0625f, +0.648438f,0.0625f, +0.65625f,0.0625f, +0.664063f,0.0625f, +0.671875f,0.0625f, +0.679688f,0.0625f, +0.6875f,0.0625f, +0.695313f,0.0625f, +0.703125f,0.0625f, +0.710938f,0.0625f, +0.71875f,0.0625f, +0.726563f,0.0625f, +0.734375f,0.0625f, +0.742188f,0.0625f, +0.75f,0.0625f, +0.757813f,0.0625f, +0.765625f,0.0625f, +0.773438f,0.0625f, +0.78125f,0.0625f, +0.789063f,0.0625f, +0.796875f,0.0625f, +0.804688f,0.0625f, +0.8125f,0.0625f, +0.820313f,0.0625f, +0.828125f,0.0625f, +0.835938f,0.0625f, +0.84375f,0.0625f, +0.851563f,0.0625f, +0.859375f,0.0625f, +0.867188f,0.0625f, +0.875f,0.0625f, +0.882813f,0.0625f, +0.890625f,0.0625f, +0.898438f,0.0625f, +0.90625f,0.0625f, +0.914063f,0.0625f, +0.921875f,0.0625f, +0.929688f,0.0625f, +0.9375f,0.0625f, +0.945313f,0.0625f, +0.953125f,0.0625f, +0.960938f,0.0625f, +0.96875f,0.0625f, +0.976563f,0.0625f, +0.984375f,0.0625f, +0.992188f,0.0625f, +1.0f,0.0625f, +0.507813f,0.0703125f, +0.515625f,0.0703125f, +0.523438f,0.0703125f, +0.53125f,0.0703125f, +0.539063f,0.0703125f, +0.546875f,0.0703125f, +0.554688f,0.0703125f, +0.5625f,0.0703125f, +0.570313f,0.0703125f, +0.578125f,0.0703125f, +0.585938f,0.0703125f, +0.59375f,0.0703125f, +0.601563f,0.0703125f, +0.609375f,0.0703125f, +0.617188f,0.0703125f, +0.625f,0.0703125f, +0.632813f,0.0703125f, +0.640625f,0.0703125f, +0.648438f,0.0703125f, +0.65625f,0.0703125f, +0.664063f,0.0703125f, +0.671875f,0.0703125f, +0.679688f,0.0703125f, +0.6875f,0.0703125f, +0.695313f,0.0703125f, +0.703125f,0.0703125f, +0.710938f,0.0703125f, +0.71875f,0.0703125f, +0.726563f,0.0703125f, +0.734375f,0.0703125f, +0.742188f,0.0703125f, +0.75f,0.0703125f, +0.757813f,0.0703125f, +0.765625f,0.0703125f, +0.773438f,0.0703125f, +0.78125f,0.0703125f, +0.789063f,0.0703125f, +0.796875f,0.0703125f, +0.804688f,0.0703125f, +0.8125f,0.0703125f, +0.820313f,0.0703125f, +0.828125f,0.0703125f, +0.835938f,0.0703125f, +0.84375f,0.0703125f, +0.851563f,0.0703125f, +0.859375f,0.0703125f, +0.867188f,0.0703125f, +0.875f,0.0703125f, +0.882813f,0.0703125f, +0.890625f,0.0703125f, +0.898438f,0.0703125f, +0.90625f,0.0703125f, +0.914063f,0.0703125f, +0.921875f,0.0703125f, +0.929688f,0.0703125f, +0.9375f,0.0703125f, +0.945313f,0.0703125f, +0.953125f,0.0703125f, +0.960938f,0.0703125f, +0.96875f,0.0703125f, +0.976563f,0.0703125f, +0.984375f,0.0703125f, +0.992188f,0.0703125f, +1.0f,0.0703125f, +0.507813f,0.078125f, +0.515625f,0.078125f, +0.523438f,0.078125f, +0.53125f,0.078125f, +0.539063f,0.078125f, +0.546875f,0.078125f, +0.554688f,0.078125f, +0.5625f,0.078125f, +0.570313f,0.078125f, +0.578125f,0.078125f, +0.585938f,0.078125f, +0.59375f,0.078125f, +0.601563f,0.078125f, +0.609375f,0.078125f, +0.617188f,0.078125f, +0.625f,0.078125f, +0.632813f,0.078125f, +0.640625f,0.078125f, +0.648438f,0.078125f, +0.65625f,0.078125f, +0.664063f,0.078125f, +0.671875f,0.078125f, +0.679688f,0.078125f, +0.6875f,0.078125f, +0.695313f,0.078125f, +0.703125f,0.078125f, +0.710938f,0.078125f, +0.71875f,0.078125f, +0.726563f,0.078125f, +0.734375f,0.078125f, +0.742188f,0.078125f, +0.75f,0.078125f, +0.757813f,0.078125f, +0.765625f,0.078125f, +0.773438f,0.078125f, +0.78125f,0.078125f, +0.789063f,0.078125f, +0.796875f,0.078125f, +0.804688f,0.078125f, +0.8125f,0.078125f, +0.820313f,0.078125f, +0.828125f,0.078125f, +0.835938f,0.078125f, +0.84375f,0.078125f, +0.851563f,0.078125f, +0.859375f,0.078125f, +0.867188f,0.078125f, +0.875f,0.078125f, +0.882813f,0.078125f, +0.890625f,0.078125f, +0.898438f,0.078125f, +0.90625f,0.078125f, +0.914063f,0.078125f, +0.921875f,0.078125f, +0.929688f,0.078125f, +0.9375f,0.078125f, +0.945313f,0.078125f, +0.953125f,0.078125f, +0.960938f,0.078125f, +0.96875f,0.078125f, +0.976563f,0.078125f, +0.984375f,0.078125f, +0.992188f,0.078125f, +1.0f,0.078125f, +0.507813f,0.0859375f, +0.515625f,0.0859375f, +0.523438f,0.0859375f, +0.53125f,0.0859375f, +0.539063f,0.0859375f, +0.546875f,0.0859375f, +0.554688f,0.0859375f, +0.5625f,0.0859375f, +0.570313f,0.0859375f, +0.578125f,0.0859375f, +0.585938f,0.0859375f, +0.59375f,0.0859375f, +0.601563f,0.0859375f, +0.609375f,0.0859375f, +0.617188f,0.0859375f, +0.625f,0.0859375f, +0.632813f,0.0859375f, +0.640625f,0.0859375f, +0.648438f,0.0859375f, +0.65625f,0.0859375f, +0.664063f,0.0859375f, +0.671875f,0.0859375f, +0.679688f,0.0859375f, +0.6875f,0.0859375f, +0.695313f,0.0859375f, +0.703125f,0.0859375f, +0.710938f,0.0859375f, +0.71875f,0.0859375f, +0.726563f,0.0859375f, +0.734375f,0.0859375f, +0.742188f,0.0859375f, +0.75f,0.0859375f, +0.757813f,0.0859375f, +0.765625f,0.0859375f, +0.773438f,0.0859375f, +0.78125f,0.0859375f, +0.789063f,0.0859375f, +0.796875f,0.0859375f, +0.804688f,0.0859375f, +0.8125f,0.0859375f, +0.820313f,0.0859375f, +0.828125f,0.0859375f, +0.835938f,0.0859375f, +0.84375f,0.0859375f, +0.851563f,0.0859375f, +0.859375f,0.0859375f, +0.867188f,0.0859375f, +0.875f,0.0859375f, +0.882813f,0.0859375f, +0.890625f,0.0859375f, +0.898438f,0.0859375f, +0.90625f,0.0859375f, +0.914063f,0.0859375f, +0.921875f,0.0859375f, +0.929688f,0.0859375f, +0.9375f,0.0859375f, +0.945313f,0.0859375f, +0.953125f,0.0859375f, +0.960938f,0.0859375f, +0.96875f,0.0859375f, +0.976563f,0.0859375f, +0.984375f,0.0859375f, +0.992188f,0.0859375f, +1.0f,0.0859375f, +0.507813f,0.09375f, +0.515625f,0.09375f, +0.523438f,0.09375f, +0.53125f,0.09375f, +0.539063f,0.09375f, +0.546875f,0.09375f, +0.554688f,0.09375f, +0.5625f,0.09375f, +0.570313f,0.09375f, +0.578125f,0.09375f, +0.585938f,0.09375f, +0.59375f,0.09375f, +0.601563f,0.09375f, +0.609375f,0.09375f, +0.617188f,0.09375f, +0.625f,0.09375f, +0.632813f,0.09375f, +0.640625f,0.09375f, +0.648438f,0.09375f, +0.65625f,0.09375f, +0.664063f,0.09375f, +0.671875f,0.09375f, +0.679688f,0.09375f, +0.6875f,0.09375f, +0.695313f,0.09375f, +0.703125f,0.09375f, +0.710938f,0.09375f, +0.71875f,0.09375f, +0.726563f,0.09375f, +0.734375f,0.09375f, +0.742188f,0.09375f, +0.75f,0.09375f, +0.757813f,0.09375f, +0.765625f,0.09375f, +0.773438f,0.09375f, +0.78125f,0.09375f, +0.789063f,0.09375f, +0.796875f,0.09375f, +0.804688f,0.09375f, +0.8125f,0.09375f, +0.820313f,0.09375f, +0.828125f,0.09375f, +0.835938f,0.09375f, +0.84375f,0.09375f, +0.851563f,0.09375f, +0.859375f,0.09375f, +0.867188f,0.09375f, +0.875f,0.09375f, +0.882813f,0.09375f, +0.890625f,0.09375f, +0.898438f,0.09375f, +0.90625f,0.09375f, +0.914063f,0.09375f, +0.921875f,0.09375f, +0.929688f,0.09375f, +0.9375f,0.09375f, +0.945313f,0.09375f, +0.953125f,0.09375f, +0.960938f,0.09375f, +0.96875f,0.09375f, +0.976563f,0.09375f, +0.984375f,0.09375f, +0.992188f,0.09375f, +1.0f,0.09375f, +0.507813f,0.101563f, +0.515625f,0.101563f, +0.523438f,0.101563f, +0.53125f,0.101563f, +0.539063f,0.101563f, +0.546875f,0.101563f, +0.554688f,0.101563f, +0.5625f,0.101563f, +0.570313f,0.101563f, +0.578125f,0.101563f, +0.585938f,0.101563f, +0.59375f,0.101563f, +0.601563f,0.101563f, +0.609375f,0.101563f, +0.617188f,0.101563f, +0.625f,0.101563f, +0.632813f,0.101563f, +0.640625f,0.101563f, +0.648438f,0.101563f, +0.65625f,0.101563f, +0.664063f,0.101563f, +0.671875f,0.101563f, +0.679688f,0.101563f, +0.6875f,0.101563f, +0.695313f,0.101563f, +0.703125f,0.101563f, +0.710938f,0.101563f, +0.71875f,0.101563f, +0.726563f,0.101563f, +0.734375f,0.101563f, +0.742188f,0.101563f, +0.75f,0.101563f, +0.757813f,0.101563f, +0.765625f,0.101563f, +0.773438f,0.101563f, +0.78125f,0.101563f, +0.789063f,0.101563f, +0.796875f,0.101563f, +0.804688f,0.101563f, +0.8125f,0.101563f, +0.820313f,0.101563f, +0.828125f,0.101563f, +0.835938f,0.101563f, +0.84375f,0.101563f, +0.851563f,0.101563f, +0.859375f,0.101563f, +0.867188f,0.101563f, +0.875f,0.101563f, +0.882813f,0.101563f, +0.890625f,0.101563f, +0.898438f,0.101563f, +0.90625f,0.101563f, +0.914063f,0.101563f, +0.921875f,0.101563f, +0.929688f,0.101563f, +0.9375f,0.101563f, +0.945313f,0.101563f, +0.953125f,0.101563f, +0.960938f,0.101563f, +0.96875f,0.101563f, +0.976563f,0.101563f, +0.984375f,0.101563f, +0.992188f,0.101563f, +1.0f,0.101563f, +0.507813f,0.109375f, +0.515625f,0.109375f, +0.523438f,0.109375f, +0.53125f,0.109375f, +0.539063f,0.109375f, +0.546875f,0.109375f, +0.554688f,0.109375f, +0.5625f,0.109375f, +0.570313f,0.109375f, +0.578125f,0.109375f, +0.585938f,0.109375f, +0.59375f,0.109375f, +0.601563f,0.109375f, +0.609375f,0.109375f, +0.617188f,0.109375f, +0.625f,0.109375f, +0.632813f,0.109375f, +0.640625f,0.109375f, +0.648438f,0.109375f, +0.65625f,0.109375f, +0.664063f,0.109375f, +0.671875f,0.109375f, +0.679688f,0.109375f, +0.6875f,0.109375f, +0.695313f,0.109375f, +0.703125f,0.109375f, +0.710938f,0.109375f, +0.71875f,0.109375f, +0.726563f,0.109375f, +0.734375f,0.109375f, +0.742188f,0.109375f, +0.75f,0.109375f, +0.757813f,0.109375f, +0.765625f,0.109375f, +0.773438f,0.109375f, +0.78125f,0.109375f, +0.789063f,0.109375f, +0.796875f,0.109375f, +0.804688f,0.109375f, +0.8125f,0.109375f, +0.820313f,0.109375f, +0.828125f,0.109375f, +0.835938f,0.109375f, +0.84375f,0.109375f, +0.851563f,0.109375f, +0.859375f,0.109375f, +0.867188f,0.109375f, +0.875f,0.109375f, +0.882813f,0.109375f, +0.890625f,0.109375f, +0.898438f,0.109375f, +0.90625f,0.109375f, +0.914063f,0.109375f, +0.921875f,0.109375f, +0.929688f,0.109375f, +0.9375f,0.109375f, +0.945313f,0.109375f, +0.953125f,0.109375f, +0.960938f,0.109375f, +0.96875f,0.109375f, +0.976563f,0.109375f, +0.984375f,0.109375f, +0.992188f,0.109375f, +1.0f,0.109375f, +0.507813f,0.117188f, +0.515625f,0.117188f, +0.523438f,0.117188f, +0.53125f,0.117188f, +0.539063f,0.117188f, +0.546875f,0.117188f, +0.554688f,0.117188f, +0.5625f,0.117188f, +0.570313f,0.117188f, +0.578125f,0.117188f, +0.585938f,0.117188f, +0.59375f,0.117188f, +0.601563f,0.117188f, +0.609375f,0.117188f, +0.617188f,0.117188f, +0.625f,0.117188f, +0.632813f,0.117188f, +0.640625f,0.117188f, +0.648438f,0.117188f, +0.65625f,0.117188f, +0.664063f,0.117188f, +0.671875f,0.117188f, +0.679688f,0.117188f, +0.6875f,0.117188f, +0.695313f,0.117188f, +0.703125f,0.117188f, +0.710938f,0.117188f, +0.71875f,0.117188f, +0.726563f,0.117188f, +0.734375f,0.117188f, +0.742188f,0.117188f, +0.75f,0.117188f, +0.757813f,0.117188f, +0.765625f,0.117188f, +0.773438f,0.117188f, +0.78125f,0.117188f, +0.789063f,0.117188f, +0.796875f,0.117188f, +0.804688f,0.117188f, +0.8125f,0.117188f, +0.820313f,0.117188f, +0.828125f,0.117188f, +0.835938f,0.117188f, +0.84375f,0.117188f, +0.851563f,0.117188f, +0.859375f,0.117188f, +0.867188f,0.117188f, +0.875f,0.117188f, +0.882813f,0.117188f, +0.890625f,0.117188f, +0.898438f,0.117188f, +0.90625f,0.117188f, +0.914063f,0.117188f, +0.921875f,0.117188f, +0.929688f,0.117188f, +0.9375f,0.117188f, +0.945313f,0.117188f, +0.953125f,0.117188f, +0.960938f,0.117188f, +0.96875f,0.117188f, +0.976563f,0.117188f, +0.984375f,0.117188f, +0.992188f,0.117188f, +1.0f,0.117188f, +0.507813f,0.125f, +0.515625f,0.125f, +0.523438f,0.125f, +0.53125f,0.125f, +0.539063f,0.125f, +0.546875f,0.125f, +0.554688f,0.125f, +0.5625f,0.125f, +0.570313f,0.125f, +0.578125f,0.125f, +0.585938f,0.125f, +0.59375f,0.125f, +0.601563f,0.125f, +0.609375f,0.125f, +0.617188f,0.125f, +0.625f,0.125f, +0.632813f,0.125f, +0.640625f,0.125f, +0.648438f,0.125f, +0.65625f,0.125f, +0.664063f,0.125f, +0.671875f,0.125f, +0.679688f,0.125f, +0.6875f,0.125f, +0.695313f,0.125f, +0.703125f,0.125f, +0.710938f,0.125f, +0.71875f,0.125f, +0.726563f,0.125f, +0.734375f,0.125f, +0.742188f,0.125f, +0.75f,0.125f, +0.757813f,0.125f, +0.765625f,0.125f, +0.773438f,0.125f, +0.78125f,0.125f, +0.789063f,0.125f, +0.796875f,0.125f, +0.804688f,0.125f, +0.8125f,0.125f, +0.820313f,0.125f, +0.828125f,0.125f, +0.835938f,0.125f, +0.84375f,0.125f, +0.851563f,0.125f, +0.859375f,0.125f, +0.867188f,0.125f, +0.875f,0.125f, +0.882813f,0.125f, +0.890625f,0.125f, +0.898438f,0.125f, +0.90625f,0.125f, +0.914063f,0.125f, +0.921875f,0.125f, +0.929688f,0.125f, +0.9375f,0.125f, +0.945313f,0.125f, +0.953125f,0.125f, +0.960938f,0.125f, +0.96875f,0.125f, +0.976563f,0.125f, +0.984375f,0.125f, +0.992188f,0.125f, +1.0f,0.125f, +0.507813f,0.132813f, +0.515625f,0.132813f, +0.523438f,0.132813f, +0.53125f,0.132813f, +0.539063f,0.132813f, +0.546875f,0.132813f, +0.554688f,0.132813f, +0.5625f,0.132813f, +0.570313f,0.132813f, +0.578125f,0.132813f, +0.585938f,0.132813f, +0.59375f,0.132813f, +0.601563f,0.132813f, +0.609375f,0.132813f, +0.617188f,0.132813f, +0.625f,0.132813f, +0.632813f,0.132813f, +0.640625f,0.132813f, +0.648438f,0.132813f, +0.65625f,0.132813f, +0.664063f,0.132813f, +0.671875f,0.132813f, +0.679688f,0.132813f, +0.6875f,0.132813f, +0.695313f,0.132813f, +0.703125f,0.132813f, +0.710938f,0.132813f, +0.71875f,0.132813f, +0.726563f,0.132813f, +0.734375f,0.132813f, +0.742188f,0.132813f, +0.75f,0.132813f, +0.757813f,0.132813f, +0.765625f,0.132813f, +0.773438f,0.132813f, +0.78125f,0.132813f, +0.789063f,0.132813f, +0.796875f,0.132813f, +0.804688f,0.132813f, +0.8125f,0.132813f, +0.820313f,0.132813f, +0.828125f,0.132813f, +0.835938f,0.132813f, +0.84375f,0.132813f, +0.851563f,0.132813f, +0.859375f,0.132813f, +0.867188f,0.132813f, +0.875f,0.132813f, +0.882813f,0.132813f, +0.890625f,0.132813f, +0.898438f,0.132813f, +0.90625f,0.132813f, +0.914063f,0.132813f, +0.921875f,0.132813f, +0.929688f,0.132813f, +0.9375f,0.132813f, +0.945313f,0.132813f, +0.953125f,0.132813f, +0.960938f,0.132813f, +0.96875f,0.132813f, +0.976563f,0.132813f, +0.984375f,0.132813f, +0.992188f,0.132813f, +1.0f,0.132813f, +0.507813f,0.140625f, +0.515625f,0.140625f, +0.523438f,0.140625f, +0.53125f,0.140625f, +0.539063f,0.140625f, +0.546875f,0.140625f, +0.554688f,0.140625f, +0.5625f,0.140625f, +0.570313f,0.140625f, +0.578125f,0.140625f, +0.585938f,0.140625f, +0.59375f,0.140625f, +0.601563f,0.140625f, +0.609375f,0.140625f, +0.617188f,0.140625f, +0.625f,0.140625f, +0.632813f,0.140625f, +0.640625f,0.140625f, +0.648438f,0.140625f, +0.65625f,0.140625f, +0.664063f,0.140625f, +0.671875f,0.140625f, +0.679688f,0.140625f, +0.6875f,0.140625f, +0.695313f,0.140625f, +0.703125f,0.140625f, +0.710938f,0.140625f, +0.71875f,0.140625f, +0.726563f,0.140625f, +0.734375f,0.140625f, +0.742188f,0.140625f, +0.75f,0.140625f, +0.757813f,0.140625f, +0.765625f,0.140625f, +0.773438f,0.140625f, +0.78125f,0.140625f, +0.789063f,0.140625f, +0.796875f,0.140625f, +0.804688f,0.140625f, +0.8125f,0.140625f, +0.820313f,0.140625f, +0.828125f,0.140625f, +0.835938f,0.140625f, +0.84375f,0.140625f, +0.851563f,0.140625f, +0.859375f,0.140625f, +0.867188f,0.140625f, +0.875f,0.140625f, +0.882813f,0.140625f, +0.890625f,0.140625f, +0.898438f,0.140625f, +0.90625f,0.140625f, +0.914063f,0.140625f, +0.921875f,0.140625f, +0.929688f,0.140625f, +0.9375f,0.140625f, +0.945313f,0.140625f, +0.953125f,0.140625f, +0.960938f,0.140625f, +0.96875f,0.140625f, +0.976563f,0.140625f, +0.984375f,0.140625f, +0.992188f,0.140625f, +1.0f,0.140625f, +0.507813f,0.148438f, +0.515625f,0.148438f, +0.523438f,0.148438f, +0.53125f,0.148438f, +0.539063f,0.148438f, +0.546875f,0.148438f, +0.554688f,0.148438f, +0.5625f,0.148438f, +0.570313f,0.148438f, +0.578125f,0.148438f, +0.585938f,0.148438f, +0.59375f,0.148438f, +0.601563f,0.148438f, +0.609375f,0.148438f, +0.617188f,0.148438f, +0.625f,0.148438f, +0.632813f,0.148438f, +0.640625f,0.148438f, +0.648438f,0.148438f, +0.65625f,0.148438f, +0.664063f,0.148438f, +0.671875f,0.148438f, +0.679688f,0.148438f, +0.6875f,0.148438f, +0.695313f,0.148438f, +0.703125f,0.148438f, +0.710938f,0.148438f, +0.71875f,0.148438f, +0.726563f,0.148438f, +0.734375f,0.148438f, +0.742188f,0.148438f, +0.75f,0.148438f, +0.757813f,0.148438f, +0.765625f,0.148438f, +0.773438f,0.148438f, +0.78125f,0.148438f, +0.789063f,0.148438f, +0.796875f,0.148438f, +0.804688f,0.148438f, +0.8125f,0.148438f, +0.820313f,0.148438f, +0.828125f,0.148438f, +0.835938f,0.148438f, +0.84375f,0.148438f, +0.851563f,0.148438f, +0.859375f,0.148438f, +0.867188f,0.148438f, +0.875f,0.148438f, +0.882813f,0.148438f, +0.890625f,0.148438f, +0.898438f,0.148438f, +0.90625f,0.148438f, +0.914063f,0.148438f, +0.921875f,0.148438f, +0.929688f,0.148438f, +0.9375f,0.148438f, +0.945313f,0.148438f, +0.953125f,0.148438f, +0.960938f,0.148438f, +0.96875f,0.148438f, +0.976563f,0.148438f, +0.984375f,0.148438f, +0.992188f,0.148438f, +1.0f,0.148438f, +0.507813f,0.15625f, +0.515625f,0.15625f, +0.523438f,0.15625f, +0.53125f,0.15625f, +0.539063f,0.15625f, +0.546875f,0.15625f, +0.554688f,0.15625f, +0.5625f,0.15625f, +0.570313f,0.15625f, +0.578125f,0.15625f, +0.585938f,0.15625f, +0.59375f,0.15625f, +0.601563f,0.15625f, +0.609375f,0.15625f, +0.617188f,0.15625f, +0.625f,0.15625f, +0.632813f,0.15625f, +0.640625f,0.15625f, +0.648438f,0.15625f, +0.65625f,0.15625f, +0.664063f,0.15625f, +0.671875f,0.15625f, +0.679688f,0.15625f, +0.6875f,0.15625f, +0.695313f,0.15625f, +0.703125f,0.15625f, +0.710938f,0.15625f, +0.71875f,0.15625f, +0.726563f,0.15625f, +0.734375f,0.15625f, +0.742188f,0.15625f, +0.75f,0.15625f, +0.757813f,0.15625f, +0.765625f,0.15625f, +0.773438f,0.15625f, +0.78125f,0.15625f, +0.789063f,0.15625f, +0.796875f,0.15625f, +0.804688f,0.15625f, +0.8125f,0.15625f, +0.820313f,0.15625f, +0.828125f,0.15625f, +0.835938f,0.15625f, +0.84375f,0.15625f, +0.851563f,0.15625f, +0.859375f,0.15625f, +0.867188f,0.15625f, +0.875f,0.15625f, +0.882813f,0.15625f, +0.890625f,0.15625f, +0.898438f,0.15625f, +0.90625f,0.15625f, +0.914063f,0.15625f, +0.921875f,0.15625f, +0.929688f,0.15625f, +0.9375f,0.15625f, +0.945313f,0.15625f, +0.953125f,0.15625f, +0.960938f,0.15625f, +0.96875f,0.15625f, +0.976563f,0.15625f, +0.984375f,0.15625f, +0.992188f,0.15625f, +1.0f,0.15625f, +0.507813f,0.164063f, +0.515625f,0.164063f, +0.523438f,0.164063f, +0.53125f,0.164063f, +0.539063f,0.164063f, +0.546875f,0.164063f, +0.554688f,0.164063f, +0.5625f,0.164063f, +0.570313f,0.164063f, +0.578125f,0.164063f, +0.585938f,0.164063f, +0.59375f,0.164063f, +0.601563f,0.164063f, +0.609375f,0.164063f, +0.617188f,0.164063f, +0.625f,0.164063f, +0.632813f,0.164063f, +0.640625f,0.164063f, +0.648438f,0.164063f, +0.65625f,0.164063f, +0.664063f,0.164063f, +0.671875f,0.164063f, +0.679688f,0.164063f, +0.6875f,0.164063f, +0.695313f,0.164063f, +0.703125f,0.164063f, +0.710938f,0.164063f, +0.71875f,0.164063f, +0.726563f,0.164063f, +0.734375f,0.164063f, +0.742188f,0.164063f, +0.75f,0.164063f, +0.757813f,0.164063f, +0.765625f,0.164063f, +0.773438f,0.164063f, +0.78125f,0.164063f, +0.789063f,0.164063f, +0.796875f,0.164063f, +0.804688f,0.164063f, +0.8125f,0.164063f, +0.820313f,0.164063f, +0.828125f,0.164063f, +0.835938f,0.164063f, +0.84375f,0.164063f, +0.851563f,0.164063f, +0.859375f,0.164063f, +0.867188f,0.164063f, +0.875f,0.164063f, +0.882813f,0.164063f, +0.890625f,0.164063f, +0.898438f,0.164063f, +0.90625f,0.164063f, +0.914063f,0.164063f, +0.921875f,0.164063f, +0.929688f,0.164063f, +0.9375f,0.164063f, +0.945313f,0.164063f, +0.953125f,0.164063f, +0.960938f,0.164063f, +0.96875f,0.164063f, +0.976563f,0.164063f, +0.984375f,0.164063f, +0.992188f,0.164063f, +1.0f,0.164063f, +0.507813f,0.171875f, +0.515625f,0.171875f, +0.523438f,0.171875f, +0.53125f,0.171875f, +0.539063f,0.171875f, +0.546875f,0.171875f, +0.554688f,0.171875f, +0.5625f,0.171875f, +0.570313f,0.171875f, +0.578125f,0.171875f, +0.585938f,0.171875f, +0.59375f,0.171875f, +0.601563f,0.171875f, +0.609375f,0.171875f, +0.617188f,0.171875f, +0.625f,0.171875f, +0.632813f,0.171875f, +0.640625f,0.171875f, +0.648438f,0.171875f, +0.65625f,0.171875f, +0.664063f,0.171875f, +0.671875f,0.171875f, +0.679688f,0.171875f, +0.6875f,0.171875f, +0.695313f,0.171875f, +0.703125f,0.171875f, +0.710938f,0.171875f, +0.71875f,0.171875f, +0.726563f,0.171875f, +0.734375f,0.171875f, +0.742188f,0.171875f, +0.75f,0.171875f, +0.757813f,0.171875f, +0.765625f,0.171875f, +0.773438f,0.171875f, +0.78125f,0.171875f, +0.789063f,0.171875f, +0.796875f,0.171875f, +0.804688f,0.171875f, +0.8125f,0.171875f, +0.820313f,0.171875f, +0.828125f,0.171875f, +0.835938f,0.171875f, +0.84375f,0.171875f, +0.851563f,0.171875f, +0.859375f,0.171875f, +0.867188f,0.171875f, +0.875f,0.171875f, +0.882813f,0.171875f, +0.890625f,0.171875f, +0.898438f,0.171875f, +0.90625f,0.171875f, +0.914063f,0.171875f, +0.921875f,0.171875f, +0.929688f,0.171875f, +0.9375f,0.171875f, +0.945313f,0.171875f, +0.953125f,0.171875f, +0.960938f,0.171875f, +0.96875f,0.171875f, +0.976563f,0.171875f, +0.984375f,0.171875f, +0.992188f,0.171875f, +1.0f,0.171875f, +0.507813f,0.179688f, +0.515625f,0.179688f, +0.523438f,0.179688f, +0.53125f,0.179688f, +0.539063f,0.179688f, +0.546875f,0.179688f, +0.554688f,0.179688f, +0.5625f,0.179688f, +0.570313f,0.179688f, +0.578125f,0.179688f, +0.585938f,0.179688f, +0.59375f,0.179688f, +0.601563f,0.179688f, +0.609375f,0.179688f, +0.617188f,0.179688f, +0.625f,0.179688f, +0.632813f,0.179688f, +0.640625f,0.179688f, +0.648438f,0.179688f, +0.65625f,0.179688f, +0.664063f,0.179688f, +0.671875f,0.179688f, +0.679688f,0.179688f, +0.6875f,0.179688f, +0.695313f,0.179688f, +0.703125f,0.179688f, +0.710938f,0.179688f, +0.71875f,0.179688f, +0.726563f,0.179688f, +0.734375f,0.179688f, +0.742188f,0.179688f, +0.75f,0.179688f, +0.757813f,0.179688f, +0.765625f,0.179688f, +0.773438f,0.179688f, +0.78125f,0.179688f, +0.789063f,0.179688f, +0.796875f,0.179688f, +0.804688f,0.179688f, +0.8125f,0.179688f, +0.820313f,0.179688f, +0.828125f,0.179688f, +0.835938f,0.179688f, +0.84375f,0.179688f, +0.851563f,0.179688f, +0.859375f,0.179688f, +0.867188f,0.179688f, +0.875f,0.179688f, +0.882813f,0.179688f, +0.890625f,0.179688f, +0.898438f,0.179688f, +0.90625f,0.179688f, +0.914063f,0.179688f, +0.921875f,0.179688f, +0.929688f,0.179688f, +0.9375f,0.179688f, +0.945313f,0.179688f, +0.953125f,0.179688f, +0.960938f,0.179688f, +0.96875f,0.179688f, +0.976563f,0.179688f, +0.984375f,0.179688f, +0.992188f,0.179688f, +1.0f,0.179688f, +0.507813f,0.1875f, +0.515625f,0.1875f, +0.523438f,0.1875f, +0.53125f,0.1875f, +0.539063f,0.1875f, +0.546875f,0.1875f, +0.554688f,0.1875f, +0.5625f,0.1875f, +0.570313f,0.1875f, +0.578125f,0.1875f, +0.585938f,0.1875f, +0.59375f,0.1875f, +0.601563f,0.1875f, +0.609375f,0.1875f, +0.617188f,0.1875f, +0.625f,0.1875f, +0.632813f,0.1875f, +0.640625f,0.1875f, +0.648438f,0.1875f, +0.65625f,0.1875f, +0.664063f,0.1875f, +0.671875f,0.1875f, +0.679688f,0.1875f, +0.6875f,0.1875f, +0.695313f,0.1875f, +0.703125f,0.1875f, +0.710938f,0.1875f, +0.71875f,0.1875f, +0.726563f,0.1875f, +0.734375f,0.1875f, +0.742188f,0.1875f, +0.75f,0.1875f, +0.757813f,0.1875f, +0.765625f,0.1875f, +0.773438f,0.1875f, +0.78125f,0.1875f, +0.789063f,0.1875f, +0.796875f,0.1875f, +0.804688f,0.1875f, +0.8125f,0.1875f, +0.820313f,0.1875f, +0.828125f,0.1875f, +0.835938f,0.1875f, +0.84375f,0.1875f, +0.851563f,0.1875f, +0.859375f,0.1875f, +0.867188f,0.1875f, +0.875f,0.1875f, +0.882813f,0.1875f, +0.890625f,0.1875f, +0.898438f,0.1875f, +0.90625f,0.1875f, +0.914063f,0.1875f, +0.921875f,0.1875f, +0.929688f,0.1875f, +0.9375f,0.1875f, +0.945313f,0.1875f, +0.953125f,0.1875f, +0.960938f,0.1875f, +0.96875f,0.1875f, +0.976563f,0.1875f, +0.984375f,0.1875f, +0.992188f,0.1875f, +1.0f,0.1875f, +0.507813f,0.195313f, +0.515625f,0.195313f, +0.523438f,0.195313f, +0.53125f,0.195313f, +0.539063f,0.195313f, +0.546875f,0.195313f, +0.554688f,0.195313f, +0.5625f,0.195313f, +0.570313f,0.195313f, +0.578125f,0.195313f, +0.585938f,0.195313f, +0.59375f,0.195313f, +0.601563f,0.195313f, +0.609375f,0.195313f, +0.617188f,0.195313f, +0.625f,0.195313f, +0.632813f,0.195313f, +0.640625f,0.195313f, +0.648438f,0.195313f, +0.65625f,0.195313f, +0.664063f,0.195313f, +0.671875f,0.195313f, +0.679688f,0.195313f, +0.6875f,0.195313f, +0.695313f,0.195313f, +0.703125f,0.195313f, +0.710938f,0.195313f, +0.71875f,0.195313f, +0.726563f,0.195313f, +0.734375f,0.195313f, +0.742188f,0.195313f, +0.75f,0.195313f, +0.757813f,0.195313f, +0.765625f,0.195313f, +0.773438f,0.195313f, +0.78125f,0.195313f, +0.789063f,0.195313f, +0.796875f,0.195313f, +0.804688f,0.195313f, +0.8125f,0.195313f, +0.820313f,0.195313f, +0.828125f,0.195313f, +0.835938f,0.195313f, +0.84375f,0.195313f, +0.851563f,0.195313f, +0.859375f,0.195313f, +0.867188f,0.195313f, +0.875f,0.195313f, +0.882813f,0.195313f, +0.890625f,0.195313f, +0.898438f,0.195313f, +0.90625f,0.195313f, +0.914063f,0.195313f, +0.921875f,0.195313f, +0.929688f,0.195313f, +0.9375f,0.195313f, +0.945313f,0.195313f, +0.953125f,0.195313f, +0.960938f,0.195313f, +0.96875f,0.195313f, +0.976563f,0.195313f, +0.984375f,0.195313f, +0.992188f,0.195313f, +1.0f,0.195313f, +0.507813f,0.203125f, +0.515625f,0.203125f, +0.523438f,0.203125f, +0.53125f,0.203125f, +0.539063f,0.203125f, +0.546875f,0.203125f, +0.554688f,0.203125f, +0.5625f,0.203125f, +0.570313f,0.203125f, +0.578125f,0.203125f, +0.585938f,0.203125f, +0.59375f,0.203125f, +0.601563f,0.203125f, +0.609375f,0.203125f, +0.617188f,0.203125f, +0.625f,0.203125f, +0.632813f,0.203125f, +0.640625f,0.203125f, +0.648438f,0.203125f, +0.65625f,0.203125f, +0.664063f,0.203125f, +0.671875f,0.203125f, +0.679688f,0.203125f, +0.6875f,0.203125f, +0.695313f,0.203125f, +0.703125f,0.203125f, +0.710938f,0.203125f, +0.71875f,0.203125f, +0.726563f,0.203125f, +0.734375f,0.203125f, +0.742188f,0.203125f, +0.75f,0.203125f, +0.757813f,0.203125f, +0.765625f,0.203125f, +0.773438f,0.203125f, +0.78125f,0.203125f, +0.789063f,0.203125f, +0.796875f,0.203125f, +0.804688f,0.203125f, +0.8125f,0.203125f, +0.820313f,0.203125f, +0.828125f,0.203125f, +0.835938f,0.203125f, +0.84375f,0.203125f, +0.851563f,0.203125f, +0.859375f,0.203125f, +0.867188f,0.203125f, +0.875f,0.203125f, +0.882813f,0.203125f, +0.890625f,0.203125f, +0.898438f,0.203125f, +0.90625f,0.203125f, +0.914063f,0.203125f, +0.921875f,0.203125f, +0.929688f,0.203125f, +0.9375f,0.203125f, +0.945313f,0.203125f, +0.953125f,0.203125f, +0.960938f,0.203125f, +0.96875f,0.203125f, +0.976563f,0.203125f, +0.984375f,0.203125f, +0.992188f,0.203125f, +1.0f,0.203125f, +0.507813f,0.210938f, +0.515625f,0.210938f, +0.523438f,0.210938f, +0.53125f,0.210938f, +0.539063f,0.210938f, +0.546875f,0.210938f, +0.554688f,0.210938f, +0.5625f,0.210938f, +0.570313f,0.210938f, +0.578125f,0.210938f, +0.585938f,0.210938f, +0.59375f,0.210938f, +0.601563f,0.210938f, +0.609375f,0.210938f, +0.617188f,0.210938f, +0.625f,0.210938f, +0.632813f,0.210938f, +0.640625f,0.210938f, +0.648438f,0.210938f, +0.65625f,0.210938f, +0.664063f,0.210938f, +0.671875f,0.210938f, +0.679688f,0.210938f, +0.6875f,0.210938f, +0.695313f,0.210938f, +0.703125f,0.210938f, +0.710938f,0.210938f, +0.71875f,0.210938f, +0.726563f,0.210938f, +0.734375f,0.210938f, +0.742188f,0.210938f, +0.75f,0.210938f, +0.757813f,0.210938f, +0.765625f,0.210938f, +0.773438f,0.210938f, +0.78125f,0.210938f, +0.789063f,0.210938f, +0.796875f,0.210938f, +0.804688f,0.210938f, +0.8125f,0.210938f, +0.820313f,0.210938f, +0.828125f,0.210938f, +0.835938f,0.210938f, +0.84375f,0.210938f, +0.851563f,0.210938f, +0.859375f,0.210938f, +0.867188f,0.210938f, +0.875f,0.210938f, +0.882813f,0.210938f, +0.890625f,0.210938f, +0.898438f,0.210938f, +0.90625f,0.210938f, +0.914063f,0.210938f, +0.921875f,0.210938f, +0.929688f,0.210938f, +0.9375f,0.210938f, +0.945313f,0.210938f, +0.953125f,0.210938f, +0.960938f,0.210938f, +0.96875f,0.210938f, +0.976563f,0.210938f, +0.984375f,0.210938f, +0.992188f,0.210938f, +1.0f,0.210938f, +0.507813f,0.21875f, +0.515625f,0.21875f, +0.523438f,0.21875f, +0.53125f,0.21875f, +0.539063f,0.21875f, +0.546875f,0.21875f, +0.554688f,0.21875f, +0.5625f,0.21875f, +0.570313f,0.21875f, +0.578125f,0.21875f, +0.585938f,0.21875f, +0.59375f,0.21875f, +0.601563f,0.21875f, +0.609375f,0.21875f, +0.617188f,0.21875f, +0.625f,0.21875f, +0.632813f,0.21875f, +0.640625f,0.21875f, +0.648438f,0.21875f, +0.65625f,0.21875f, +0.664063f,0.21875f, +0.671875f,0.21875f, +0.679688f,0.21875f, +0.6875f,0.21875f, +0.695313f,0.21875f, +0.703125f,0.21875f, +0.710938f,0.21875f, +0.71875f,0.21875f, +0.726563f,0.21875f, +0.734375f,0.21875f, +0.742188f,0.21875f, +0.75f,0.21875f, +0.757813f,0.21875f, +0.765625f,0.21875f, +0.773438f,0.21875f, +0.78125f,0.21875f, +0.789063f,0.21875f, +0.796875f,0.21875f, +0.804688f,0.21875f, +0.8125f,0.21875f, +0.820313f,0.21875f, +0.828125f,0.21875f, +0.835938f,0.21875f, +0.84375f,0.21875f, +0.851563f,0.21875f, +0.859375f,0.21875f, +0.867188f,0.21875f, +0.875f,0.21875f, +0.882813f,0.21875f, +0.890625f,0.21875f, +0.898438f,0.21875f, +0.90625f,0.21875f, +0.914063f,0.21875f, +0.921875f,0.21875f, +0.929688f,0.21875f, +0.9375f,0.21875f, +0.945313f,0.21875f, +0.953125f,0.21875f, +0.960938f,0.21875f, +0.96875f,0.21875f, +0.976563f,0.21875f, +0.984375f,0.21875f, +0.992188f,0.21875f, +1.0f,0.21875f, +0.507813f,0.226563f, +0.515625f,0.226563f, +0.523438f,0.226563f, +0.53125f,0.226563f, +0.539063f,0.226563f, +0.546875f,0.226563f, +0.554688f,0.226563f, +0.5625f,0.226563f, +0.570313f,0.226563f, +0.578125f,0.226563f, +0.585938f,0.226563f, +0.59375f,0.226563f, +0.601563f,0.226563f, +0.609375f,0.226563f, +0.617188f,0.226563f, +0.625f,0.226563f, +0.632813f,0.226563f, +0.640625f,0.226563f, +0.648438f,0.226563f, +0.65625f,0.226563f, +0.664063f,0.226563f, +0.671875f,0.226563f, +0.679688f,0.226563f, +0.6875f,0.226563f, +0.695313f,0.226563f, +0.703125f,0.226563f, +0.710938f,0.226563f, +0.71875f,0.226563f, +0.726563f,0.226563f, +0.734375f,0.226563f, +0.742188f,0.226563f, +0.75f,0.226563f, +0.757813f,0.226563f, +0.765625f,0.226563f, +0.773438f,0.226563f, +0.78125f,0.226563f, +0.789063f,0.226563f, +0.796875f,0.226563f, +0.804688f,0.226563f, +0.8125f,0.226563f, +0.820313f,0.226563f, +0.828125f,0.226563f, +0.835938f,0.226563f, +0.84375f,0.226563f, +0.851563f,0.226563f, +0.859375f,0.226563f, +0.867188f,0.226563f, +0.875f,0.226563f, +0.882813f,0.226563f, +0.890625f,0.226563f, +0.898438f,0.226563f, +0.90625f,0.226563f, +0.914063f,0.226563f, +0.921875f,0.226563f, +0.929688f,0.226563f, +0.9375f,0.226563f, +0.945313f,0.226563f, +0.953125f,0.226563f, +0.960938f,0.226563f, +0.96875f,0.226563f, +0.976563f,0.226563f, +0.984375f,0.226563f, +0.992188f,0.226563f, +1.0f,0.226563f, +0.507813f,0.234375f, +0.515625f,0.234375f, +0.523438f,0.234375f, +0.53125f,0.234375f, +0.539063f,0.234375f, +0.546875f,0.234375f, +0.554688f,0.234375f, +0.5625f,0.234375f, +0.570313f,0.234375f, +0.578125f,0.234375f, +0.585938f,0.234375f, +0.59375f,0.234375f, +0.601563f,0.234375f, +0.609375f,0.234375f, +0.617188f,0.234375f, +0.625f,0.234375f, +0.632813f,0.234375f, +0.640625f,0.234375f, +0.648438f,0.234375f, +0.65625f,0.234375f, +0.664063f,0.234375f, +0.671875f,0.234375f, +0.679688f,0.234375f, +0.6875f,0.234375f, +0.695313f,0.234375f, +0.703125f,0.234375f, +0.710938f,0.234375f, +0.71875f,0.234375f, +0.726563f,0.234375f, +0.734375f,0.234375f, +0.742188f,0.234375f, +0.75f,0.234375f, +0.757813f,0.234375f, +0.765625f,0.234375f, +0.773438f,0.234375f, +0.78125f,0.234375f, +0.789063f,0.234375f, +0.796875f,0.234375f, +0.804688f,0.234375f, +0.8125f,0.234375f, +0.820313f,0.234375f, +0.828125f,0.234375f, +0.835938f,0.234375f, +0.84375f,0.234375f, +0.851563f,0.234375f, +0.859375f,0.234375f, +0.867188f,0.234375f, +0.875f,0.234375f, +0.882813f,0.234375f, +0.890625f,0.234375f, +0.898438f,0.234375f, +0.90625f,0.234375f, +0.914063f,0.234375f, +0.921875f,0.234375f, +0.929688f,0.234375f, +0.9375f,0.234375f, +0.945313f,0.234375f, +0.953125f,0.234375f, +0.960938f,0.234375f, +0.96875f,0.234375f, +0.976563f,0.234375f, +0.984375f,0.234375f, +0.992188f,0.234375f, +1.0f,0.234375f, +0.507813f,0.242188f, +0.515625f,0.242188f, +0.523438f,0.242188f, +0.53125f,0.242188f, +0.539063f,0.242188f, +0.546875f,0.242188f, +0.554688f,0.242188f, +0.5625f,0.242188f, +0.570313f,0.242188f, +0.578125f,0.242188f, +0.585938f,0.242188f, +0.59375f,0.242188f, +0.601563f,0.242188f, +0.609375f,0.242188f, +0.617188f,0.242188f, +0.625f,0.242188f, +0.632813f,0.242188f, +0.640625f,0.242188f, +0.648438f,0.242188f, +0.65625f,0.242188f, +0.664063f,0.242188f, +0.671875f,0.242188f, +0.679688f,0.242188f, +0.6875f,0.242188f, +0.695313f,0.242188f, +0.703125f,0.242188f, +0.710938f,0.242188f, +0.71875f,0.242188f, +0.726563f,0.242188f, +0.734375f,0.242188f, +0.742188f,0.242188f, +0.75f,0.242188f, +0.757813f,0.242188f, +0.765625f,0.242188f, +0.773438f,0.242188f, +0.78125f,0.242188f, +0.789063f,0.242188f, +0.796875f,0.242188f, +0.804688f,0.242188f, +0.8125f,0.242188f, +0.820313f,0.242188f, +0.828125f,0.242188f, +0.835938f,0.242188f, +0.84375f,0.242188f, +0.851563f,0.242188f, +0.859375f,0.242188f, +0.867188f,0.242188f, +0.875f,0.242188f, +0.882813f,0.242188f, +0.890625f,0.242188f, +0.898438f,0.242188f, +0.90625f,0.242188f, +0.914063f,0.242188f, +0.921875f,0.242188f, +0.929688f,0.242188f, +0.9375f,0.242188f, +0.945313f,0.242188f, +0.953125f,0.242188f, +0.960938f,0.242188f, +0.96875f,0.242188f, +0.976563f,0.242188f, +0.984375f,0.242188f, +0.992188f,0.242188f, +1.0f,0.242188f, +}; + +unsigned short Landscape01Idx[] = { +0,1,2, +3,2,1, +2,3,4, +5,4,3, +4,5,6, +7,6,5, +6,7,8, +9,8,7, +8,9,10, +11,10,9, +10,11,12, +13,12,11, +12,13,14, +15,14,13, +14,15,16, +17,16,15, +16,17,18, +19,18,17, +18,19,20, +21,20,19, +20,21,22, +23,22,21, +22,23,24, +25,24,23, +24,25,26, +27,26,25, +26,27,28, +29,28,27, +28,29,30, +31,30,29, +30,31,32, +33,32,31, +32,33,34, +35,34,33, +34,35,36, +37,36,35, +36,37,38, +39,38,37, +38,39,40, +41,40,39, +40,41,42, +43,42,41, +42,43,44, +45,44,43, +44,45,46, +47,46,45, +46,47,48, +49,48,47, +48,49,50, +51,50,49, +50,51,52, +53,52,51, +52,53,54, +55,54,53, +54,55,56, +57,56,55, +56,57,58, +59,58,57, +58,59,60, +61,60,59, +60,61,62, +63,62,61, +62,63,64, +65,64,63, +64,65,66, +67,66,65, +66,67,68, +69,68,67, +68,69,70, +71,70,69, +70,71,72, +73,72,71, +72,73,74, +75,74,73, +74,75,76, +77,76,75, +76,77,78, +79,78,77, +78,79,80, +81,80,79, +80,81,82, +83,82,81, +82,83,84, +85,84,83, +84,85,86, +87,86,85, +86,87,88, +89,88,87, +88,89,90, +91,90,89, +90,91,92, +93,92,91, +92,93,94, +95,94,93, +94,95,96, +97,96,95, +96,97,98, +99,98,97, +98,99,100, +101,100,99, +100,101,102, +103,102,101, +102,103,104, +105,104,103, +104,105,106, +107,106,105, +106,107,108, +109,108,107, +108,109,110, +111,110,109, +110,111,112, +113,112,111, +112,113,114, +115,114,113, +114,115,116, +117,116,115, +116,117,118, +119,118,117, +118,119,120, +121,120,119, +120,121,122, +123,122,121, +122,123,124, +125,124,123, +124,125,126, +127,126,125, +128,0,129, +2,129,0, +129,2,130, +4,130,2, +130,4,131, +6,131,4, +131,6,132, +8,132,6, +132,8,133, +10,133,8, +133,10,134, +12,134,10, +134,12,135, +14,135,12, +135,14,136, +16,136,14, +136,16,137, +18,137,16, +137,18,138, +20,138,18, +138,20,139, +22,139,20, +139,22,140, +24,140,22, +140,24,141, +26,141,24, +141,26,142, +28,142,26, +142,28,143, +30,143,28, +143,30,144, +32,144,30, +144,32,145, +34,145,32, +145,34,146, +36,146,34, +146,36,147, +38,147,36, +147,38,148, +40,148,38, +148,40,149, +42,149,40, +149,42,150, +44,150,42, +150,44,151, +46,151,44, +151,46,152, +48,152,46, +152,48,153, +50,153,48, +153,50,154, +52,154,50, +154,52,155, +54,155,52, +155,54,156, +56,156,54, +156,56,157, +58,157,56, +157,58,158, +60,158,58, +158,60,159, +62,159,60, +159,62,160, +64,160,62, +160,64,161, +66,161,64, +161,66,162, +68,162,66, +162,68,163, +70,163,68, +163,70,164, +72,164,70, +164,72,165, +74,165,72, +165,74,166, +76,166,74, +166,76,167, +78,167,76, +167,78,168, +80,168,78, +168,80,169, +82,169,80, +169,82,170, +84,170,82, +170,84,171, +86,171,84, +171,86,172, +88,172,86, +172,88,173, +90,173,88, +173,90,174, +92,174,90, +174,92,175, +94,175,92, +175,94,176, +96,176,94, +176,96,177, +98,177,96, +177,98,178, +100,178,98, +178,100,179, +102,179,100, +179,102,180, +104,180,102, +180,104,181, +106,181,104, +181,106,182, +108,182,106, +182,108,183, +110,183,108, +183,110,184, +112,184,110, +184,112,185, +114,185,112, +185,114,186, +116,186,114, +186,116,187, +118,187,116, +187,118,188, +120,188,118, +188,120,189, +122,189,120, +189,122,190, +124,190,122, +190,124,191, +126,191,124, +192,128,193, +129,193,128, +193,129,194, +130,194,129, +194,130,195, +131,195,130, +195,131,196, +132,196,131, +196,132,197, +133,197,132, +197,133,198, +134,198,133, +198,134,199, +135,199,134, +199,135,200, +136,200,135, +200,136,201, +137,201,136, +201,137,202, +138,202,137, +202,138,203, +139,203,138, +203,139,204, +140,204,139, +204,140,205, +141,205,140, +205,141,206, +142,206,141, +206,142,207, +143,207,142, +207,143,208, +144,208,143, +208,144,209, +145,209,144, +209,145,210, +146,210,145, +210,146,211, +147,211,146, +211,147,212, +148,212,147, +212,148,213, +149,213,148, +213,149,214, +150,214,149, +214,150,215, +151,215,150, +215,151,216, +152,216,151, +216,152,217, +153,217,152, +217,153,218, +154,218,153, +218,154,219, +155,219,154, +219,155,220, +156,220,155, +220,156,221, +157,221,156, +221,157,222, +158,222,157, +222,158,223, +159,223,158, +223,159,224, +160,224,159, +224,160,225, +161,225,160, +225,161,226, +162,226,161, +226,162,227, +163,227,162, +227,163,228, +164,228,163, +228,164,229, +165,229,164, +229,165,230, +166,230,165, +230,166,231, +167,231,166, +231,167,232, +168,232,167, +232,168,233, +169,233,168, +233,169,234, +170,234,169, +234,170,235, +171,235,170, +235,171,236, +172,236,171, +236,172,237, +173,237,172, +237,173,238, +174,238,173, +238,174,239, +175,239,174, +239,175,240, +176,240,175, +240,176,241, +177,241,176, +241,177,242, +178,242,177, +242,178,243, +179,243,178, +243,179,244, +180,244,179, +244,180,245, +181,245,180, +245,181,246, +182,246,181, +246,182,247, +183,247,182, +247,183,248, +184,248,183, +248,184,249, +185,249,184, +249,185,250, +186,250,185, +250,186,251, +187,251,186, +251,187,252, +188,252,187, +252,188,253, +189,253,188, +253,189,254, +190,254,189, +254,190,255, +191,255,190, +256,192,257, +193,257,192, +257,193,258, +194,258,193, +258,194,259, +195,259,194, +259,195,260, +196,260,195, +260,196,261, +197,261,196, +261,197,262, +198,262,197, +262,198,263, +199,263,198, +263,199,264, +200,264,199, +264,200,265, +201,265,200, +265,201,266, +202,266,201, +266,202,267, +203,267,202, +267,203,268, +204,268,203, +268,204,269, +205,269,204, +269,205,270, +206,270,205, +270,206,271, +207,271,206, +271,207,272, +208,272,207, +272,208,273, +209,273,208, +273,209,274, +210,274,209, +274,210,275, +211,275,210, +275,211,276, +212,276,211, +276,212,277, +213,277,212, +277,213,278, +214,278,213, +278,214,279, +215,279,214, +279,215,280, +216,280,215, +280,216,281, +217,281,216, +281,217,282, +218,282,217, +282,218,283, +219,283,218, +283,219,284, +220,284,219, +284,220,285, +221,285,220, +285,221,286, +222,286,221, +286,222,287, +223,287,222, +287,223,288, +224,288,223, +288,224,289, +225,289,224, +289,225,290, +226,290,225, +290,226,291, +227,291,226, +291,227,292, +228,292,227, +292,228,293, +229,293,228, +293,229,294, +230,294,229, +294,230,295, +231,295,230, +295,231,296, +232,296,231, +296,232,297, +233,297,232, +297,233,298, +234,298,233, +298,234,299, +235,299,234, +299,235,300, +236,300,235, +300,236,301, +237,301,236, +301,237,302, +238,302,237, +302,238,303, +239,303,238, +303,239,304, +240,304,239, +304,240,305, +241,305,240, +305,241,306, +242,306,241, +306,242,307, +243,307,242, +307,243,308, +244,308,243, +308,244,309, +245,309,244, +309,245,310, +246,310,245, +310,246,311, +247,311,246, +311,247,312, +248,312,247, +312,248,313, +249,313,248, +313,249,314, +250,314,249, +314,250,315, +251,315,250, +315,251,316, +252,316,251, +316,252,317, +253,317,252, +317,253,318, +254,318,253, +318,254,319, +255,319,254, +320,256,321, +257,321,256, +321,257,322, +258,322,257, +322,258,323, +259,323,258, +323,259,324, +260,324,259, +324,260,325, +261,325,260, +325,261,326, +262,326,261, +326,262,327, +263,327,262, +327,263,328, +264,328,263, +328,264,329, +265,329,264, +329,265,330, +266,330,265, +330,266,331, +267,331,266, +331,267,332, +268,332,267, +332,268,333, +269,333,268, +333,269,334, +270,334,269, +334,270,335, +271,335,270, +335,271,336, +272,336,271, +336,272,337, +273,337,272, +337,273,338, +274,338,273, +338,274,339, +275,339,274, +339,275,340, +276,340,275, +340,276,341, +277,341,276, +341,277,342, +278,342,277, +342,278,343, +279,343,278, +343,279,344, +280,344,279, +344,280,345, +281,345,280, +345,281,346, +282,346,281, +346,282,347, +283,347,282, +347,283,348, +284,348,283, +348,284,349, +285,349,284, +349,285,350, +286,350,285, +350,286,351, +287,351,286, +351,287,352, +288,352,287, +352,288,353, +289,353,288, +353,289,354, +290,354,289, +354,290,355, +291,355,290, +355,291,356, +292,356,291, +356,292,357, +293,357,292, +357,293,358, +294,358,293, +358,294,359, +295,359,294, +359,295,360, +296,360,295, +360,296,361, +297,361,296, +361,297,362, +298,362,297, +362,298,363, +299,363,298, +363,299,364, +300,364,299, +364,300,365, +301,365,300, +365,301,366, +302,366,301, +366,302,367, +303,367,302, +367,303,368, +304,368,303, +368,304,369, +305,369,304, +369,305,370, +306,370,305, +370,306,371, +307,371,306, +371,307,372, +308,372,307, +372,308,373, +309,373,308, +373,309,374, +310,374,309, +374,310,375, +311,375,310, +375,311,376, +312,376,311, +376,312,377, +313,377,312, +377,313,378, +314,378,313, +378,314,379, +315,379,314, +379,315,380, +316,380,315, +380,316,381, +317,381,316, +381,317,382, +318,382,317, +382,318,383, +319,383,318, +384,320,385, +321,385,320, +385,321,386, +322,386,321, +386,322,387, +323,387,322, +387,323,388, +324,388,323, +388,324,389, +325,389,324, +389,325,390, +326,390,325, +390,326,391, +327,391,326, +391,327,392, +328,392,327, +392,328,393, +329,393,328, +393,329,394, +330,394,329, +394,330,395, +331,395,330, +395,331,396, +332,396,331, +396,332,397, +333,397,332, +397,333,398, +334,398,333, +398,334,399, +335,399,334, +399,335,400, +336,400,335, +400,336,401, +337,401,336, +401,337,402, +338,402,337, +402,338,403, +339,403,338, +403,339,404, +340,404,339, +404,340,405, +341,405,340, +405,341,406, +342,406,341, +406,342,407, +343,407,342, +407,343,408, +344,408,343, +408,344,409, +345,409,344, +409,345,410, +346,410,345, +410,346,411, +347,411,346, +411,347,412, +348,412,347, +412,348,413, +349,413,348, +413,349,414, +350,414,349, +414,350,415, +351,415,350, +415,351,416, +352,416,351, +416,352,417, +353,417,352, +417,353,418, +354,418,353, +418,354,419, +355,419,354, +419,355,420, +356,420,355, +420,356,421, +357,421,356, +421,357,422, +358,422,357, +422,358,423, +359,423,358, +423,359,424, +360,424,359, +424,360,425, +361,425,360, +425,361,426, +362,426,361, +426,362,427, +363,427,362, +427,363,428, +364,428,363, +428,364,429, +365,429,364, +429,365,430, +366,430,365, +430,366,431, +367,431,366, +431,367,432, +368,432,367, +432,368,433, +369,433,368, +433,369,434, +370,434,369, +434,370,435, +371,435,370, +435,371,436, +372,436,371, +436,372,437, +373,437,372, +437,373,438, +374,438,373, +438,374,439, +375,439,374, +439,375,440, +376,440,375, +440,376,441, +377,441,376, +441,377,442, +378,442,377, +442,378,443, +379,443,378, +443,379,444, +380,444,379, +444,380,445, +381,445,380, +445,381,446, +382,446,381, +446,382,447, +383,447,382, +448,384,449, +385,449,384, +449,385,450, +386,450,385, +450,386,451, +387,451,386, +451,387,452, +388,452,387, +452,388,453, +389,453,388, +453,389,454, +390,454,389, +454,390,455, +391,455,390, +455,391,456, +392,456,391, +456,392,457, +393,457,392, +457,393,458, +394,458,393, +458,394,459, +395,459,394, +459,395,460, +396,460,395, +460,396,461, +397,461,396, +461,397,462, +398,462,397, +462,398,463, +399,463,398, +463,399,464, +400,464,399, +464,400,465, +401,465,400, +465,401,466, +402,466,401, +466,402,467, +403,467,402, +467,403,468, +404,468,403, +468,404,469, +405,469,404, +469,405,470, +406,470,405, +470,406,471, +407,471,406, +471,407,472, +408,472,407, +472,408,473, +409,473,408, +473,409,474, +410,474,409, +474,410,475, +411,475,410, +475,411,476, +412,476,411, +476,412,477, +413,477,412, +477,413,478, +414,478,413, +478,414,479, +415,479,414, +479,415,480, +416,480,415, +480,416,481, +417,481,416, +481,417,482, +418,482,417, +482,418,483, +419,483,418, +483,419,484, +420,484,419, +484,420,485, +421,485,420, +485,421,486, +422,486,421, +486,422,487, +423,487,422, +487,423,488, +424,488,423, +488,424,489, +425,489,424, +489,425,490, +426,490,425, +490,426,491, +427,491,426, +491,427,492, +428,492,427, +492,428,493, +429,493,428, +493,429,494, +430,494,429, +494,430,495, +431,495,430, +495,431,496, +432,496,431, +496,432,497, +433,497,432, +497,433,498, +434,498,433, +498,434,499, +435,499,434, +499,435,500, +436,500,435, +500,436,501, +437,501,436, +501,437,502, +438,502,437, +502,438,503, +439,503,438, +503,439,504, +440,504,439, +504,440,505, +441,505,440, +505,441,506, +442,506,441, +506,442,507, +443,507,442, +507,443,508, +444,508,443, +508,444,509, +445,509,444, +509,445,510, +446,510,445, +510,446,511, +447,511,446, +512,448,513, +449,513,448, +513,449,514, +450,514,449, +514,450,515, +451,515,450, +515,451,516, +452,516,451, +516,452,517, +453,517,452, +517,453,518, +454,518,453, +518,454,519, +455,519,454, +519,455,520, +456,520,455, +520,456,521, +457,521,456, +521,457,522, +458,522,457, +522,458,523, +459,523,458, +523,459,524, +460,524,459, +524,460,525, +461,525,460, +525,461,526, +462,526,461, +526,462,527, +463,527,462, +527,463,528, +464,528,463, +528,464,529, +465,529,464, +529,465,530, +466,530,465, +530,466,531, +467,531,466, +531,467,532, +468,532,467, +532,468,533, +469,533,468, +533,469,534, +470,534,469, +534,470,535, +471,535,470, +535,471,536, +472,536,471, +536,472,537, +473,537,472, +537,473,538, +474,538,473, +538,474,539, +475,539,474, +539,475,540, +476,540,475, +540,476,541, +477,541,476, +541,477,542, +478,542,477, +542,478,543, +479,543,478, +543,479,544, +480,544,479, +544,480,545, +481,545,480, +545,481,546, +482,546,481, +546,482,547, +483,547,482, +547,483,548, +484,548,483, +548,484,549, +485,549,484, +549,485,550, +486,550,485, +550,486,551, +487,551,486, +551,487,552, +488,552,487, +552,488,553, +489,553,488, +553,489,554, +490,554,489, +554,490,555, +491,555,490, +555,491,556, +492,556,491, +556,492,557, +493,557,492, +557,493,558, +494,558,493, +558,494,559, +495,559,494, +559,495,560, +496,560,495, +560,496,561, +497,561,496, +561,497,562, +498,562,497, +562,498,563, +499,563,498, +563,499,564, +500,564,499, +564,500,565, +501,565,500, +565,501,566, +502,566,501, +566,502,567, +503,567,502, +567,503,568, +504,568,503, +568,504,569, +505,569,504, +569,505,570, +506,570,505, +570,506,571, +507,571,506, +571,507,572, +508,572,507, +572,508,573, +509,573,508, +573,509,574, +510,574,509, +574,510,575, +511,575,510, +576,512,577, +513,577,512, +577,513,578, +514,578,513, +578,514,579, +515,579,514, +579,515,580, +516,580,515, +580,516,581, +517,581,516, +581,517,582, +518,582,517, +582,518,583, +519,583,518, +583,519,584, +520,584,519, +584,520,585, +521,585,520, +585,521,586, +522,586,521, +586,522,587, +523,587,522, +587,523,588, +524,588,523, +588,524,589, +525,589,524, +589,525,590, +526,590,525, +590,526,591, +527,591,526, +591,527,592, +528,592,527, +592,528,593, +529,593,528, +593,529,594, +530,594,529, +594,530,595, +531,595,530, +595,531,596, +532,596,531, +596,532,597, +533,597,532, +597,533,598, +534,598,533, +598,534,599, +535,599,534, +599,535,600, +536,600,535, +600,536,601, +537,601,536, +601,537,602, +538,602,537, +602,538,603, +539,603,538, +603,539,604, +540,604,539, +604,540,605, +541,605,540, +605,541,606, +542,606,541, +606,542,607, +543,607,542, +607,543,608, +544,608,543, +608,544,609, +545,609,544, +609,545,610, +546,610,545, +610,546,611, +547,611,546, +611,547,612, +548,612,547, +612,548,613, +549,613,548, +613,549,614, +550,614,549, +614,550,615, +551,615,550, +615,551,616, +552,616,551, +616,552,617, +553,617,552, +617,553,618, +554,618,553, +618,554,619, +555,619,554, +619,555,620, +556,620,555, +620,556,621, +557,621,556, +621,557,622, +558,622,557, +622,558,623, +559,623,558, +623,559,624, +560,624,559, +624,560,625, +561,625,560, +625,561,626, +562,626,561, +626,562,627, +563,627,562, +627,563,628, +564,628,563, +628,564,629, +565,629,564, +629,565,630, +566,630,565, +630,566,631, +567,631,566, +631,567,632, +568,632,567, +632,568,633, +569,633,568, +633,569,634, +570,634,569, +634,570,635, +571,635,570, +635,571,636, +572,636,571, +636,572,637, +573,637,572, +637,573,638, +574,638,573, +638,574,639, +575,639,574, +640,576,641, +577,641,576, +641,577,642, +578,642,577, +642,578,643, +579,643,578, +643,579,644, +580,644,579, +644,580,645, +581,645,580, +645,581,646, +582,646,581, +646,582,647, +583,647,582, +647,583,648, +584,648,583, +648,584,649, +585,649,584, +649,585,650, +586,650,585, +650,586,651, +587,651,586, +651,587,652, +588,652,587, +652,588,653, +589,653,588, +653,589,654, +590,654,589, +654,590,655, +591,655,590, +655,591,656, +592,656,591, +656,592,657, +593,657,592, +657,593,658, +594,658,593, +658,594,659, +595,659,594, +659,595,660, +596,660,595, +660,596,661, +597,661,596, +661,597,662, +598,662,597, +662,598,663, +599,663,598, +663,599,664, +600,664,599, +664,600,665, +601,665,600, +665,601,666, +602,666,601, +666,602,667, +603,667,602, +667,603,668, +604,668,603, +668,604,669, +605,669,604, +669,605,670, +606,670,605, +670,606,671, +607,671,606, +671,607,672, +608,672,607, +672,608,673, +609,673,608, +673,609,674, +610,674,609, +674,610,675, +611,675,610, +675,611,676, +612,676,611, +676,612,677, +613,677,612, +677,613,678, +614,678,613, +678,614,679, +615,679,614, +679,615,680, +616,680,615, +680,616,681, +617,681,616, +681,617,682, +618,682,617, +682,618,683, +619,683,618, +683,619,684, +620,684,619, +684,620,685, +621,685,620, +685,621,686, +622,686,621, +686,622,687, +623,687,622, +687,623,688, +624,688,623, +688,624,689, +625,689,624, +689,625,690, +626,690,625, +690,626,691, +627,691,626, +691,627,692, +628,692,627, +692,628,693, +629,693,628, +693,629,694, +630,694,629, +694,630,695, +631,695,630, +695,631,696, +632,696,631, +696,632,697, +633,697,632, +697,633,698, +634,698,633, +698,634,699, +635,699,634, +699,635,700, +636,700,635, +700,636,701, +637,701,636, +701,637,702, +638,702,637, +702,638,703, +639,703,638, +704,640,705, +641,705,640, +705,641,706, +642,706,641, +706,642,707, +643,707,642, +707,643,708, +644,708,643, +708,644,709, +645,709,644, +709,645,710, +646,710,645, +710,646,711, +647,711,646, +711,647,712, +648,712,647, +712,648,713, +649,713,648, +713,649,714, +650,714,649, +714,650,715, +651,715,650, +715,651,716, +652,716,651, +716,652,717, +653,717,652, +717,653,718, +654,718,653, +718,654,719, +655,719,654, +719,655,720, +656,720,655, +720,656,721, +657,721,656, +721,657,722, +658,722,657, +722,658,723, +659,723,658, +723,659,724, +660,724,659, +724,660,725, +661,725,660, +725,661,726, +662,726,661, +726,662,727, +663,727,662, +727,663,728, +664,728,663, +728,664,729, +665,729,664, +729,665,730, +666,730,665, +730,666,731, +667,731,666, +731,667,732, +668,732,667, +732,668,733, +669,733,668, +733,669,734, +670,734,669, +734,670,735, +671,735,670, +735,671,736, +672,736,671, +736,672,737, +673,737,672, +737,673,738, +674,738,673, +738,674,739, +675,739,674, +739,675,740, +676,740,675, +740,676,741, +677,741,676, +741,677,742, +678,742,677, +742,678,743, +679,743,678, +743,679,744, +680,744,679, +744,680,745, +681,745,680, +745,681,746, +682,746,681, +746,682,747, +683,747,682, +747,683,748, +684,748,683, +748,684,749, +685,749,684, +749,685,750, +686,750,685, +750,686,751, +687,751,686, +751,687,752, +688,752,687, +752,688,753, +689,753,688, +753,689,754, +690,754,689, +754,690,755, +691,755,690, +755,691,756, +692,756,691, +756,692,757, +693,757,692, +757,693,758, +694,758,693, +758,694,759, +695,759,694, +759,695,760, +696,760,695, +760,696,761, +697,761,696, +761,697,762, +698,762,697, +762,698,763, +699,763,698, +763,699,764, +700,764,699, +764,700,765, +701,765,700, +765,701,766, +702,766,701, +766,702,767, +703,767,702, +768,704,769, +705,769,704, +769,705,770, +706,770,705, +770,706,771, +707,771,706, +771,707,772, +708,772,707, +772,708,773, +709,773,708, +773,709,774, +710,774,709, +774,710,775, +711,775,710, +775,711,776, +712,776,711, +776,712,777, +713,777,712, +777,713,778, +714,778,713, +778,714,779, +715,779,714, +779,715,780, +716,780,715, +780,716,781, +717,781,716, +781,717,782, +718,782,717, +782,718,783, +719,783,718, +783,719,784, +720,784,719, +784,720,785, +721,785,720, +785,721,786, +722,786,721, +786,722,787, +723,787,722, +787,723,788, +724,788,723, +788,724,789, +725,789,724, +789,725,790, +726,790,725, +790,726,791, +727,791,726, +791,727,792, +728,792,727, +792,728,793, +729,793,728, +793,729,794, +730,794,729, +794,730,795, +731,795,730, +795,731,796, +732,796,731, +796,732,797, +733,797,732, +797,733,798, +734,798,733, +798,734,799, +735,799,734, +799,735,800, +736,800,735, +800,736,801, +737,801,736, +801,737,802, +738,802,737, +802,738,803, +739,803,738, +803,739,804, +740,804,739, +804,740,805, +741,805,740, +805,741,806, +742,806,741, +806,742,807, +743,807,742, +807,743,808, +744,808,743, +808,744,809, +745,809,744, +809,745,810, +746,810,745, +810,746,811, +747,811,746, +811,747,812, +748,812,747, +812,748,813, +749,813,748, +813,749,814, +750,814,749, +814,750,815, +751,815,750, +815,751,816, +752,816,751, +816,752,817, +753,817,752, +817,753,818, +754,818,753, +818,754,819, +755,819,754, +819,755,820, +756,820,755, +820,756,821, +757,821,756, +821,757,822, +758,822,757, +822,758,823, +759,823,758, +823,759,824, +760,824,759, +824,760,825, +761,825,760, +825,761,826, +762,826,761, +826,762,827, +763,827,762, +827,763,828, +764,828,763, +828,764,829, +765,829,764, +829,765,830, +766,830,765, +830,766,831, +767,831,766, +832,768,833, +769,833,768, +833,769,834, +770,834,769, +834,770,835, +771,835,770, +835,771,836, +772,836,771, +836,772,837, +773,837,772, +837,773,838, +774,838,773, +838,774,839, +775,839,774, +839,775,840, +776,840,775, +840,776,841, +777,841,776, +841,777,842, +778,842,777, +842,778,843, +779,843,778, +843,779,844, +780,844,779, +844,780,845, +781,845,780, +845,781,846, +782,846,781, +846,782,847, +783,847,782, +847,783,848, +784,848,783, +848,784,849, +785,849,784, +849,785,850, +786,850,785, +850,786,851, +787,851,786, +851,787,852, +788,852,787, +852,788,853, +789,853,788, +853,789,854, +790,854,789, +854,790,855, +791,855,790, +855,791,856, +792,856,791, +856,792,857, +793,857,792, +857,793,858, +794,858,793, +858,794,859, +795,859,794, +859,795,860, +796,860,795, +860,796,861, +797,861,796, +861,797,862, +798,862,797, +862,798,863, +799,863,798, +863,799,864, +800,864,799, +864,800,865, +801,865,800, +865,801,866, +802,866,801, +866,802,867, +803,867,802, +867,803,868, +804,868,803, +868,804,869, +805,869,804, +869,805,870, +806,870,805, +870,806,871, +807,871,806, +871,807,872, +808,872,807, +872,808,873, +809,873,808, +873,809,874, +810,874,809, +874,810,875, +811,875,810, +875,811,876, +812,876,811, +876,812,877, +813,877,812, +877,813,878, +814,878,813, +878,814,879, +815,879,814, +879,815,880, +816,880,815, +880,816,881, +817,881,816, +881,817,882, +818,882,817, +882,818,883, +819,883,818, +883,819,884, +820,884,819, +884,820,885, +821,885,820, +885,821,886, +822,886,821, +886,822,887, +823,887,822, +887,823,888, +824,888,823, +888,824,889, +825,889,824, +889,825,890, +826,890,825, +890,826,891, +827,891,826, +891,827,892, +828,892,827, +892,828,893, +829,893,828, +893,829,894, +830,894,829, +894,830,895, +831,895,830, +896,832,897, +833,897,832, +897,833,898, +834,898,833, +898,834,899, +835,899,834, +899,835,900, +836,900,835, +900,836,901, +837,901,836, +901,837,902, +838,902,837, +902,838,903, +839,903,838, +903,839,904, +840,904,839, +904,840,905, +841,905,840, +905,841,906, +842,906,841, +906,842,907, +843,907,842, +907,843,908, +844,908,843, +908,844,909, +845,909,844, +909,845,910, +846,910,845, +910,846,911, +847,911,846, +911,847,912, +848,912,847, +912,848,913, +849,913,848, +913,849,914, +850,914,849, +914,850,915, +851,915,850, +915,851,916, +852,916,851, +916,852,917, +853,917,852, +917,853,918, +854,918,853, +918,854,919, +855,919,854, +919,855,920, +856,920,855, +920,856,921, +857,921,856, +921,857,922, +858,922,857, +922,858,923, +859,923,858, +923,859,924, +860,924,859, +924,860,925, +861,925,860, +925,861,926, +862,926,861, +926,862,927, +863,927,862, +927,863,928, +864,928,863, +928,864,929, +865,929,864, +929,865,930, +866,930,865, +930,866,931, +867,931,866, +931,867,932, +868,932,867, +932,868,933, +869,933,868, +933,869,934, +870,934,869, +934,870,935, +871,935,870, +935,871,936, +872,936,871, +936,872,937, +873,937,872, +937,873,938, +874,938,873, +938,874,939, +875,939,874, +939,875,940, +876,940,875, +940,876,941, +877,941,876, +941,877,942, +878,942,877, +942,878,943, +879,943,878, +943,879,944, +880,944,879, +944,880,945, +881,945,880, +945,881,946, +882,946,881, +946,882,947, +883,947,882, +947,883,948, +884,948,883, +948,884,949, +885,949,884, +949,885,950, +886,950,885, +950,886,951, +887,951,886, +951,887,952, +888,952,887, +952,888,953, +889,953,888, +953,889,954, +890,954,889, +954,890,955, +891,955,890, +955,891,956, +892,956,891, +956,892,957, +893,957,892, +957,893,958, +894,958,893, +958,894,959, +895,959,894, +960,896,961, +897,961,896, +961,897,962, +898,962,897, +962,898,963, +899,963,898, +963,899,964, +900,964,899, +964,900,965, +901,965,900, +965,901,966, +902,966,901, +966,902,967, +903,967,902, +967,903,968, +904,968,903, +968,904,969, +905,969,904, +969,905,970, +906,970,905, +970,906,971, +907,971,906, +971,907,972, +908,972,907, +972,908,973, +909,973,908, +973,909,974, +910,974,909, +974,910,975, +911,975,910, +975,911,976, +912,976,911, +976,912,977, +913,977,912, +977,913,978, +914,978,913, +978,914,979, +915,979,914, +979,915,980, +916,980,915, +980,916,981, +917,981,916, +981,917,982, +918,982,917, +982,918,983, +919,983,918, +983,919,984, +920,984,919, +984,920,985, +921,985,920, +985,921,986, +922,986,921, +986,922,987, +923,987,922, +987,923,988, +924,988,923, +988,924,989, +925,989,924, +989,925,990, +926,990,925, +990,926,991, +927,991,926, +991,927,992, +928,992,927, +992,928,993, +929,993,928, +993,929,994, +930,994,929, +994,930,995, +931,995,930, +995,931,996, +932,996,931, +996,932,997, +933,997,932, +997,933,998, +934,998,933, +998,934,999, +935,999,934, +999,935,1000, +936,1000,935, +1000,936,1001, +937,1001,936, +1001,937,1002, +938,1002,937, +1002,938,1003, +939,1003,938, +1003,939,1004, +940,1004,939, +1004,940,1005, +941,1005,940, +1005,941,1006, +942,1006,941, +1006,942,1007, +943,1007,942, +1007,943,1008, +944,1008,943, +1008,944,1009, +945,1009,944, +1009,945,1010, +946,1010,945, +1010,946,1011, +947,1011,946, +1011,947,1012, +948,1012,947, +1012,948,1013, +949,1013,948, +1013,949,1014, +950,1014,949, +1014,950,1015, +951,1015,950, +1015,951,1016, +952,1016,951, +1016,952,1017, +953,1017,952, +1017,953,1018, +954,1018,953, +1018,954,1019, +955,1019,954, +1019,955,1020, +956,1020,955, +1020,956,1021, +957,1021,956, +1021,957,1022, +958,1022,957, +1022,958,1023, +959,1023,958, +1024,960,1025, +961,1025,960, +1025,961,1026, +962,1026,961, +1026,962,1027, +963,1027,962, +1027,963,1028, +964,1028,963, +1028,964,1029, +965,1029,964, +1029,965,1030, +966,1030,965, +1030,966,1031, +967,1031,966, +1031,967,1032, +968,1032,967, +1032,968,1033, +969,1033,968, +1033,969,1034, +970,1034,969, +1034,970,1035, +971,1035,970, +1035,971,1036, +972,1036,971, +1036,972,1037, +973,1037,972, +1037,973,1038, +974,1038,973, +1038,974,1039, +975,1039,974, +1039,975,1040, +976,1040,975, +1040,976,1041, +977,1041,976, +1041,977,1042, +978,1042,977, +1042,978,1043, +979,1043,978, +1043,979,1044, +980,1044,979, +1044,980,1045, +981,1045,980, +1045,981,1046, +982,1046,981, +1046,982,1047, +983,1047,982, +1047,983,1048, +984,1048,983, +1048,984,1049, +985,1049,984, +1049,985,1050, +986,1050,985, +1050,986,1051, +987,1051,986, +1051,987,1052, +988,1052,987, +1052,988,1053, +989,1053,988, +1053,989,1054, +990,1054,989, +1054,990,1055, +991,1055,990, +1055,991,1056, +992,1056,991, +1056,992,1057, +993,1057,992, +1057,993,1058, +994,1058,993, +1058,994,1059, +995,1059,994, +1059,995,1060, +996,1060,995, +1060,996,1061, +997,1061,996, +1061,997,1062, +998,1062,997, +1062,998,1063, +999,1063,998, +1063,999,1064, +1000,1064,999, +1064,1000,1065, +1001,1065,1000, +1065,1001,1066, +1002,1066,1001, +1066,1002,1067, +1003,1067,1002, +1067,1003,1068, +1004,1068,1003, +1068,1004,1069, +1005,1069,1004, +1069,1005,1070, +1006,1070,1005, +1070,1006,1071, +1007,1071,1006, +1071,1007,1072, +1008,1072,1007, +1072,1008,1073, +1009,1073,1008, +1073,1009,1074, +1010,1074,1009, +1074,1010,1075, +1011,1075,1010, +1075,1011,1076, +1012,1076,1011, +1076,1012,1077, +1013,1077,1012, +1077,1013,1078, +1014,1078,1013, +1078,1014,1079, +1015,1079,1014, +1079,1015,1080, +1016,1080,1015, +1080,1016,1081, +1017,1081,1016, +1081,1017,1082, +1018,1082,1017, +1082,1018,1083, +1019,1083,1018, +1083,1019,1084, +1020,1084,1019, +1084,1020,1085, +1021,1085,1020, +1085,1021,1086, +1022,1086,1021, +1086,1022,1087, +1023,1087,1022, +1088,1024,1089, +1025,1089,1024, +1089,1025,1090, +1026,1090,1025, +1090,1026,1091, +1027,1091,1026, +1091,1027,1092, +1028,1092,1027, +1092,1028,1093, +1029,1093,1028, +1093,1029,1094, +1030,1094,1029, +1094,1030,1095, +1031,1095,1030, +1095,1031,1096, +1032,1096,1031, +1096,1032,1097, +1033,1097,1032, +1097,1033,1098, +1034,1098,1033, +1098,1034,1099, +1035,1099,1034, +1099,1035,1100, +1036,1100,1035, +1100,1036,1101, +1037,1101,1036, +1101,1037,1102, +1038,1102,1037, +1102,1038,1103, +1039,1103,1038, +1103,1039,1104, +1040,1104,1039, +1104,1040,1105, +1041,1105,1040, +1105,1041,1106, +1042,1106,1041, +1106,1042,1107, +1043,1107,1042, +1107,1043,1108, +1044,1108,1043, +1108,1044,1109, +1045,1109,1044, +1109,1045,1110, +1046,1110,1045, +1110,1046,1111, +1047,1111,1046, +1111,1047,1112, +1048,1112,1047, +1112,1048,1113, +1049,1113,1048, +1113,1049,1114, +1050,1114,1049, +1114,1050,1115, +1051,1115,1050, +1115,1051,1116, +1052,1116,1051, +1116,1052,1117, +1053,1117,1052, +1117,1053,1118, +1054,1118,1053, +1118,1054,1119, +1055,1119,1054, +1119,1055,1120, +1056,1120,1055, +1120,1056,1121, +1057,1121,1056, +1121,1057,1122, +1058,1122,1057, +1122,1058,1123, +1059,1123,1058, +1123,1059,1124, +1060,1124,1059, +1124,1060,1125, +1061,1125,1060, +1125,1061,1126, +1062,1126,1061, +1126,1062,1127, +1063,1127,1062, +1127,1063,1128, +1064,1128,1063, +1128,1064,1129, +1065,1129,1064, +1129,1065,1130, +1066,1130,1065, +1130,1066,1131, +1067,1131,1066, +1131,1067,1132, +1068,1132,1067, +1132,1068,1133, +1069,1133,1068, +1133,1069,1134, +1070,1134,1069, +1134,1070,1135, +1071,1135,1070, +1135,1071,1136, +1072,1136,1071, +1136,1072,1137, +1073,1137,1072, +1137,1073,1138, +1074,1138,1073, +1138,1074,1139, +1075,1139,1074, +1139,1075,1140, +1076,1140,1075, +1140,1076,1141, +1077,1141,1076, +1141,1077,1142, +1078,1142,1077, +1142,1078,1143, +1079,1143,1078, +1143,1079,1144, +1080,1144,1079, +1144,1080,1145, +1081,1145,1080, +1145,1081,1146, +1082,1146,1081, +1146,1082,1147, +1083,1147,1082, +1147,1083,1148, +1084,1148,1083, +1148,1084,1149, +1085,1149,1084, +1149,1085,1150, +1086,1150,1085, +1150,1086,1151, +1087,1151,1086, +1152,1088,1153, +1089,1153,1088, +1153,1089,1154, +1090,1154,1089, +1154,1090,1155, +1091,1155,1090, +1155,1091,1156, +1092,1156,1091, +1156,1092,1157, +1093,1157,1092, +1157,1093,1158, +1094,1158,1093, +1158,1094,1159, +1095,1159,1094, +1159,1095,1160, +1096,1160,1095, +1160,1096,1161, +1097,1161,1096, +1161,1097,1162, +1098,1162,1097, +1162,1098,1163, +1099,1163,1098, +1163,1099,1164, +1100,1164,1099, +1164,1100,1165, +1101,1165,1100, +1165,1101,1166, +1102,1166,1101, +1166,1102,1167, +1103,1167,1102, +1167,1103,1168, +1104,1168,1103, +1168,1104,1169, +1105,1169,1104, +1169,1105,1170, +1106,1170,1105, +1170,1106,1171, +1107,1171,1106, +1171,1107,1172, +1108,1172,1107, +1172,1108,1173, +1109,1173,1108, +1173,1109,1174, +1110,1174,1109, +1174,1110,1175, +1111,1175,1110, +1175,1111,1176, +1112,1176,1111, +1176,1112,1177, +1113,1177,1112, +1177,1113,1178, +1114,1178,1113, +1178,1114,1179, +1115,1179,1114, +1179,1115,1180, +1116,1180,1115, +1180,1116,1181, +1117,1181,1116, +1181,1117,1182, +1118,1182,1117, +1182,1118,1183, +1119,1183,1118, +1183,1119,1184, +1120,1184,1119, +1184,1120,1185, +1121,1185,1120, +1185,1121,1186, +1122,1186,1121, +1186,1122,1187, +1123,1187,1122, +1187,1123,1188, +1124,1188,1123, +1188,1124,1189, +1125,1189,1124, +1189,1125,1190, +1126,1190,1125, +1190,1126,1191, +1127,1191,1126, +1191,1127,1192, +1128,1192,1127, +1192,1128,1193, +1129,1193,1128, +1193,1129,1194, +1130,1194,1129, +1194,1130,1195, +1131,1195,1130, +1195,1131,1196, +1132,1196,1131, +1196,1132,1197, +1133,1197,1132, +1197,1133,1198, +1134,1198,1133, +1198,1134,1199, +1135,1199,1134, +1199,1135,1200, +1136,1200,1135, +1200,1136,1201, +1137,1201,1136, +1201,1137,1202, +1138,1202,1137, +1202,1138,1203, +1139,1203,1138, +1203,1139,1204, +1140,1204,1139, +1204,1140,1205, +1141,1205,1140, +1205,1141,1206, +1142,1206,1141, +1206,1142,1207, +1143,1207,1142, +1207,1143,1208, +1144,1208,1143, +1208,1144,1209, +1145,1209,1144, +1209,1145,1210, +1146,1210,1145, +1210,1146,1211, +1147,1211,1146, +1211,1147,1212, +1148,1212,1147, +1212,1148,1213, +1149,1213,1148, +1213,1149,1214, +1150,1214,1149, +1214,1150,1215, +1151,1215,1150, +1216,1152,1217, +1153,1217,1152, +1217,1153,1218, +1154,1218,1153, +1218,1154,1219, +1155,1219,1154, +1219,1155,1220, +1156,1220,1155, +1220,1156,1221, +1157,1221,1156, +1221,1157,1222, +1158,1222,1157, +1222,1158,1223, +1159,1223,1158, +1223,1159,1224, +1160,1224,1159, +1224,1160,1225, +1161,1225,1160, +1225,1161,1226, +1162,1226,1161, +1226,1162,1227, +1163,1227,1162, +1227,1163,1228, +1164,1228,1163, +1228,1164,1229, +1165,1229,1164, +1229,1165,1230, +1166,1230,1165, +1230,1166,1231, +1167,1231,1166, +1231,1167,1232, +1168,1232,1167, +1232,1168,1233, +1169,1233,1168, +1233,1169,1234, +1170,1234,1169, +1234,1170,1235, +1171,1235,1170, +1235,1171,1236, +1172,1236,1171, +1236,1172,1237, +1173,1237,1172, +1237,1173,1238, +1174,1238,1173, +1238,1174,1239, +1175,1239,1174, +1239,1175,1240, +1176,1240,1175, +1240,1176,1241, +1177,1241,1176, +1241,1177,1242, +1178,1242,1177, +1242,1178,1243, +1179,1243,1178, +1243,1179,1244, +1180,1244,1179, +1244,1180,1245, +1181,1245,1180, +1245,1181,1246, +1182,1246,1181, +1246,1182,1247, +1183,1247,1182, +1247,1183,1248, +1184,1248,1183, +1248,1184,1249, +1185,1249,1184, +1249,1185,1250, +1186,1250,1185, +1250,1186,1251, +1187,1251,1186, +1251,1187,1252, +1188,1252,1187, +1252,1188,1253, +1189,1253,1188, +1253,1189,1254, +1190,1254,1189, +1254,1190,1255, +1191,1255,1190, +1255,1191,1256, +1192,1256,1191, +1256,1192,1257, +1193,1257,1192, +1257,1193,1258, +1194,1258,1193, +1258,1194,1259, +1195,1259,1194, +1259,1195,1260, +1196,1260,1195, +1260,1196,1261, +1197,1261,1196, +1261,1197,1262, +1198,1262,1197, +1262,1198,1263, +1199,1263,1198, +1263,1199,1264, +1200,1264,1199, +1264,1200,1265, +1201,1265,1200, +1265,1201,1266, +1202,1266,1201, +1266,1202,1267, +1203,1267,1202, +1267,1203,1268, +1204,1268,1203, +1268,1204,1269, +1205,1269,1204, +1269,1205,1270, +1206,1270,1205, +1270,1206,1271, +1207,1271,1206, +1271,1207,1272, +1208,1272,1207, +1272,1208,1273, +1209,1273,1208, +1273,1209,1274, +1210,1274,1209, +1274,1210,1275, +1211,1275,1210, +1275,1211,1276, +1212,1276,1211, +1276,1212,1277, +1213,1277,1212, +1277,1213,1278, +1214,1278,1213, +1278,1214,1279, +1215,1279,1214, +1280,1216,1281, +1217,1281,1216, +1281,1217,1282, +1218,1282,1217, +1282,1218,1283, +1219,1283,1218, +1283,1219,1284, +1220,1284,1219, +1284,1220,1285, +1221,1285,1220, +1285,1221,1286, +1222,1286,1221, +1286,1222,1287, +1223,1287,1222, +1287,1223,1288, +1224,1288,1223, +1288,1224,1289, +1225,1289,1224, +1289,1225,1290, +1226,1290,1225, +1290,1226,1291, +1227,1291,1226, +1291,1227,1292, +1228,1292,1227, +1292,1228,1293, +1229,1293,1228, +1293,1229,1294, +1230,1294,1229, +1294,1230,1295, +1231,1295,1230, +1295,1231,1296, +1232,1296,1231, +1296,1232,1297, +1233,1297,1232, +1297,1233,1298, +1234,1298,1233, +1298,1234,1299, +1235,1299,1234, +1299,1235,1300, +1236,1300,1235, +1300,1236,1301, +1237,1301,1236, +1301,1237,1302, +1238,1302,1237, +1302,1238,1303, +1239,1303,1238, +1303,1239,1304, +1240,1304,1239, +1304,1240,1305, +1241,1305,1240, +1305,1241,1306, +1242,1306,1241, +1306,1242,1307, +1243,1307,1242, +1307,1243,1308, +1244,1308,1243, +1308,1244,1309, +1245,1309,1244, +1309,1245,1310, +1246,1310,1245, +1310,1246,1311, +1247,1311,1246, +1311,1247,1312, +1248,1312,1247, +1312,1248,1313, +1249,1313,1248, +1313,1249,1314, +1250,1314,1249, +1314,1250,1315, +1251,1315,1250, +1315,1251,1316, +1252,1316,1251, +1316,1252,1317, +1253,1317,1252, +1317,1253,1318, +1254,1318,1253, +1318,1254,1319, +1255,1319,1254, +1319,1255,1320, +1256,1320,1255, +1320,1256,1321, +1257,1321,1256, +1321,1257,1322, +1258,1322,1257, +1322,1258,1323, +1259,1323,1258, +1323,1259,1324, +1260,1324,1259, +1324,1260,1325, +1261,1325,1260, +1325,1261,1326, +1262,1326,1261, +1326,1262,1327, +1263,1327,1262, +1327,1263,1328, +1264,1328,1263, +1328,1264,1329, +1265,1329,1264, +1329,1265,1330, +1266,1330,1265, +1330,1266,1331, +1267,1331,1266, +1331,1267,1332, +1268,1332,1267, +1332,1268,1333, +1269,1333,1268, +1333,1269,1334, +1270,1334,1269, +1334,1270,1335, +1271,1335,1270, +1335,1271,1336, +1272,1336,1271, +1336,1272,1337, +1273,1337,1272, +1337,1273,1338, +1274,1338,1273, +1338,1274,1339, +1275,1339,1274, +1339,1275,1340, +1276,1340,1275, +1340,1276,1341, +1277,1341,1276, +1341,1277,1342, +1278,1342,1277, +1342,1278,1343, +1279,1343,1278, +1344,1280,1345, +1281,1345,1280, +1345,1281,1346, +1282,1346,1281, +1346,1282,1347, +1283,1347,1282, +1347,1283,1348, +1284,1348,1283, +1348,1284,1349, +1285,1349,1284, +1349,1285,1350, +1286,1350,1285, +1350,1286,1351, +1287,1351,1286, +1351,1287,1352, +1288,1352,1287, +1352,1288,1353, +1289,1353,1288, +1353,1289,1354, +1290,1354,1289, +1354,1290,1355, +1291,1355,1290, +1355,1291,1356, +1292,1356,1291, +1356,1292,1357, +1293,1357,1292, +1357,1293,1358, +1294,1358,1293, +1358,1294,1359, +1295,1359,1294, +1359,1295,1360, +1296,1360,1295, +1360,1296,1361, +1297,1361,1296, +1361,1297,1362, +1298,1362,1297, +1362,1298,1363, +1299,1363,1298, +1363,1299,1364, +1300,1364,1299, +1364,1300,1365, +1301,1365,1300, +1365,1301,1366, +1302,1366,1301, +1366,1302,1367, +1303,1367,1302, +1367,1303,1368, +1304,1368,1303, +1368,1304,1369, +1305,1369,1304, +1369,1305,1370, +1306,1370,1305, +1370,1306,1371, +1307,1371,1306, +1371,1307,1372, +1308,1372,1307, +1372,1308,1373, +1309,1373,1308, +1373,1309,1374, +1310,1374,1309, +1374,1310,1375, +1311,1375,1310, +1375,1311,1376, +1312,1376,1311, +1376,1312,1377, +1313,1377,1312, +1377,1313,1378, +1314,1378,1313, +1378,1314,1379, +1315,1379,1314, +1379,1315,1380, +1316,1380,1315, +1380,1316,1381, +1317,1381,1316, +1381,1317,1382, +1318,1382,1317, +1382,1318,1383, +1319,1383,1318, +1383,1319,1384, +1320,1384,1319, +1384,1320,1385, +1321,1385,1320, +1385,1321,1386, +1322,1386,1321, +1386,1322,1387, +1323,1387,1322, +1387,1323,1388, +1324,1388,1323, +1388,1324,1389, +1325,1389,1324, +1389,1325,1390, +1326,1390,1325, +1390,1326,1391, +1327,1391,1326, +1391,1327,1392, +1328,1392,1327, +1392,1328,1393, +1329,1393,1328, +1393,1329,1394, +1330,1394,1329, +1394,1330,1395, +1331,1395,1330, +1395,1331,1396, +1332,1396,1331, +1396,1332,1397, +1333,1397,1332, +1397,1333,1398, +1334,1398,1333, +1398,1334,1399, +1335,1399,1334, +1399,1335,1400, +1336,1400,1335, +1400,1336,1401, +1337,1401,1336, +1401,1337,1402, +1338,1402,1337, +1402,1338,1403, +1339,1403,1338, +1403,1339,1404, +1340,1404,1339, +1404,1340,1405, +1341,1405,1340, +1405,1341,1406, +1342,1406,1341, +1406,1342,1407, +1343,1407,1342, +1408,1344,1409, +1345,1409,1344, +1409,1345,1410, +1346,1410,1345, +1410,1346,1411, +1347,1411,1346, +1411,1347,1412, +1348,1412,1347, +1412,1348,1413, +1349,1413,1348, +1413,1349,1414, +1350,1414,1349, +1414,1350,1415, +1351,1415,1350, +1415,1351,1416, +1352,1416,1351, +1416,1352,1417, +1353,1417,1352, +1417,1353,1418, +1354,1418,1353, +1418,1354,1419, +1355,1419,1354, +1419,1355,1420, +1356,1420,1355, +1420,1356,1421, +1357,1421,1356, +1421,1357,1422, +1358,1422,1357, +1422,1358,1423, +1359,1423,1358, +1423,1359,1424, +1360,1424,1359, +1424,1360,1425, +1361,1425,1360, +1425,1361,1426, +1362,1426,1361, +1426,1362,1427, +1363,1427,1362, +1427,1363,1428, +1364,1428,1363, +1428,1364,1429, +1365,1429,1364, +1429,1365,1430, +1366,1430,1365, +1430,1366,1431, +1367,1431,1366, +1431,1367,1432, +1368,1432,1367, +1432,1368,1433, +1369,1433,1368, +1433,1369,1434, +1370,1434,1369, +1434,1370,1435, +1371,1435,1370, +1435,1371,1436, +1372,1436,1371, +1436,1372,1437, +1373,1437,1372, +1437,1373,1438, +1374,1438,1373, +1438,1374,1439, +1375,1439,1374, +1439,1375,1440, +1376,1440,1375, +1440,1376,1441, +1377,1441,1376, +1441,1377,1442, +1378,1442,1377, +1442,1378,1443, +1379,1443,1378, +1443,1379,1444, +1380,1444,1379, +1444,1380,1445, +1381,1445,1380, +1445,1381,1446, +1382,1446,1381, +1446,1382,1447, +1383,1447,1382, +1447,1383,1448, +1384,1448,1383, +1448,1384,1449, +1385,1449,1384, +1449,1385,1450, +1386,1450,1385, +1450,1386,1451, +1387,1451,1386, +1451,1387,1452, +1388,1452,1387, +1452,1388,1453, +1389,1453,1388, +1453,1389,1454, +1390,1454,1389, +1454,1390,1455, +1391,1455,1390, +1455,1391,1456, +1392,1456,1391, +1456,1392,1457, +1393,1457,1392, +1457,1393,1458, +1394,1458,1393, +1458,1394,1459, +1395,1459,1394, +1459,1395,1460, +1396,1460,1395, +1460,1396,1461, +1397,1461,1396, +1461,1397,1462, +1398,1462,1397, +1462,1398,1463, +1399,1463,1398, +1463,1399,1464, +1400,1464,1399, +1464,1400,1465, +1401,1465,1400, +1465,1401,1466, +1402,1466,1401, +1466,1402,1467, +1403,1467,1402, +1467,1403,1468, +1404,1468,1403, +1468,1404,1469, +1405,1469,1404, +1469,1405,1470, +1406,1470,1405, +1470,1406,1471, +1407,1471,1406, +1472,1408,1473, +1409,1473,1408, +1473,1409,1474, +1410,1474,1409, +1474,1410,1475, +1411,1475,1410, +1475,1411,1476, +1412,1476,1411, +1476,1412,1477, +1413,1477,1412, +1477,1413,1478, +1414,1478,1413, +1478,1414,1479, +1415,1479,1414, +1479,1415,1480, +1416,1480,1415, +1480,1416,1481, +1417,1481,1416, +1481,1417,1482, +1418,1482,1417, +1482,1418,1483, +1419,1483,1418, +1483,1419,1484, +1420,1484,1419, +1484,1420,1485, +1421,1485,1420, +1485,1421,1486, +1422,1486,1421, +1486,1422,1487, +1423,1487,1422, +1487,1423,1488, +1424,1488,1423, +1488,1424,1489, +1425,1489,1424, +1489,1425,1490, +1426,1490,1425, +1490,1426,1491, +1427,1491,1426, +1491,1427,1492, +1428,1492,1427, +1492,1428,1493, +1429,1493,1428, +1493,1429,1494, +1430,1494,1429, +1494,1430,1495, +1431,1495,1430, +1495,1431,1496, +1432,1496,1431, +1496,1432,1497, +1433,1497,1432, +1497,1433,1498, +1434,1498,1433, +1498,1434,1499, +1435,1499,1434, +1499,1435,1500, +1436,1500,1435, +1500,1436,1501, +1437,1501,1436, +1501,1437,1502, +1438,1502,1437, +1502,1438,1503, +1439,1503,1438, +1503,1439,1504, +1440,1504,1439, +1504,1440,1505, +1441,1505,1440, +1505,1441,1506, +1442,1506,1441, +1506,1442,1507, +1443,1507,1442, +1507,1443,1508, +1444,1508,1443, +1508,1444,1509, +1445,1509,1444, +1509,1445,1510, +1446,1510,1445, +1510,1446,1511, +1447,1511,1446, +1511,1447,1512, +1448,1512,1447, +1512,1448,1513, +1449,1513,1448, +1513,1449,1514, +1450,1514,1449, +1514,1450,1515, +1451,1515,1450, +1515,1451,1516, +1452,1516,1451, +1516,1452,1517, +1453,1517,1452, +1517,1453,1518, +1454,1518,1453, +1518,1454,1519, +1455,1519,1454, +1519,1455,1520, +1456,1520,1455, +1520,1456,1521, +1457,1521,1456, +1521,1457,1522, +1458,1522,1457, +1522,1458,1523, +1459,1523,1458, +1523,1459,1524, +1460,1524,1459, +1524,1460,1525, +1461,1525,1460, +1525,1461,1526, +1462,1526,1461, +1526,1462,1527, +1463,1527,1462, +1527,1463,1528, +1464,1528,1463, +1528,1464,1529, +1465,1529,1464, +1529,1465,1530, +1466,1530,1465, +1530,1466,1531, +1467,1531,1466, +1531,1467,1532, +1468,1532,1467, +1532,1468,1533, +1469,1533,1468, +1533,1469,1534, +1470,1534,1469, +1534,1470,1535, +1471,1535,1470, +1536,1472,1537, +1473,1537,1472, +1537,1473,1538, +1474,1538,1473, +1538,1474,1539, +1475,1539,1474, +1539,1475,1540, +1476,1540,1475, +1540,1476,1541, +1477,1541,1476, +1541,1477,1542, +1478,1542,1477, +1542,1478,1543, +1479,1543,1478, +1543,1479,1544, +1480,1544,1479, +1544,1480,1545, +1481,1545,1480, +1545,1481,1546, +1482,1546,1481, +1546,1482,1547, +1483,1547,1482, +1547,1483,1548, +1484,1548,1483, +1548,1484,1549, +1485,1549,1484, +1549,1485,1550, +1486,1550,1485, +1550,1486,1551, +1487,1551,1486, +1551,1487,1552, +1488,1552,1487, +1552,1488,1553, +1489,1553,1488, +1553,1489,1554, +1490,1554,1489, +1554,1490,1555, +1491,1555,1490, +1555,1491,1556, +1492,1556,1491, +1556,1492,1557, +1493,1557,1492, +1557,1493,1558, +1494,1558,1493, +1558,1494,1559, +1495,1559,1494, +1559,1495,1560, +1496,1560,1495, +1560,1496,1561, +1497,1561,1496, +1561,1497,1562, +1498,1562,1497, +1562,1498,1563, +1499,1563,1498, +1563,1499,1564, +1500,1564,1499, +1564,1500,1565, +1501,1565,1500, +1565,1501,1566, +1502,1566,1501, +1566,1502,1567, +1503,1567,1502, +1567,1503,1568, +1504,1568,1503, +1568,1504,1569, +1505,1569,1504, +1569,1505,1570, +1506,1570,1505, +1570,1506,1571, +1507,1571,1506, +1571,1507,1572, +1508,1572,1507, +1572,1508,1573, +1509,1573,1508, +1573,1509,1574, +1510,1574,1509, +1574,1510,1575, +1511,1575,1510, +1575,1511,1576, +1512,1576,1511, +1576,1512,1577, +1513,1577,1512, +1577,1513,1578, +1514,1578,1513, +1578,1514,1579, +1515,1579,1514, +1579,1515,1580, +1516,1580,1515, +1580,1516,1581, +1517,1581,1516, +1581,1517,1582, +1518,1582,1517, +1582,1518,1583, +1519,1583,1518, +1583,1519,1584, +1520,1584,1519, +1584,1520,1585, +1521,1585,1520, +1585,1521,1586, +1522,1586,1521, +1586,1522,1587, +1523,1587,1522, +1587,1523,1588, +1524,1588,1523, +1588,1524,1589, +1525,1589,1524, +1589,1525,1590, +1526,1590,1525, +1590,1526,1591, +1527,1591,1526, +1591,1527,1592, +1528,1592,1527, +1592,1528,1593, +1529,1593,1528, +1593,1529,1594, +1530,1594,1529, +1594,1530,1595, +1531,1595,1530, +1595,1531,1596, +1532,1596,1531, +1596,1532,1597, +1533,1597,1532, +1597,1533,1598, +1534,1598,1533, +1598,1534,1599, +1535,1599,1534, +1600,1536,1601, +1537,1601,1536, +1601,1537,1602, +1538,1602,1537, +1602,1538,1603, +1539,1603,1538, +1603,1539,1604, +1540,1604,1539, +1604,1540,1605, +1541,1605,1540, +1605,1541,1606, +1542,1606,1541, +1606,1542,1607, +1543,1607,1542, +1607,1543,1608, +1544,1608,1543, +1608,1544,1609, +1545,1609,1544, +1609,1545,1610, +1546,1610,1545, +1610,1546,1611, +1547,1611,1546, +1611,1547,1612, +1548,1612,1547, +1612,1548,1613, +1549,1613,1548, +1613,1549,1614, +1550,1614,1549, +1614,1550,1615, +1551,1615,1550, +1615,1551,1616, +1552,1616,1551, +1616,1552,1617, +1553,1617,1552, +1617,1553,1618, +1554,1618,1553, +1618,1554,1619, +1555,1619,1554, +1619,1555,1620, +1556,1620,1555, +1620,1556,1621, +1557,1621,1556, +1621,1557,1622, +1558,1622,1557, +1622,1558,1623, +1559,1623,1558, +1623,1559,1624, +1560,1624,1559, +1624,1560,1625, +1561,1625,1560, +1625,1561,1626, +1562,1626,1561, +1626,1562,1627, +1563,1627,1562, +1627,1563,1628, +1564,1628,1563, +1628,1564,1629, +1565,1629,1564, +1629,1565,1630, +1566,1630,1565, +1630,1566,1631, +1567,1631,1566, +1631,1567,1632, +1568,1632,1567, +1632,1568,1633, +1569,1633,1568, +1633,1569,1634, +1570,1634,1569, +1634,1570,1635, +1571,1635,1570, +1635,1571,1636, +1572,1636,1571, +1636,1572,1637, +1573,1637,1572, +1637,1573,1638, +1574,1638,1573, +1638,1574,1639, +1575,1639,1574, +1639,1575,1640, +1576,1640,1575, +1640,1576,1641, +1577,1641,1576, +1641,1577,1642, +1578,1642,1577, +1642,1578,1643, +1579,1643,1578, +1643,1579,1644, +1580,1644,1579, +1644,1580,1645, +1581,1645,1580, +1645,1581,1646, +1582,1646,1581, +1646,1582,1647, +1583,1647,1582, +1647,1583,1648, +1584,1648,1583, +1648,1584,1649, +1585,1649,1584, +1649,1585,1650, +1586,1650,1585, +1650,1586,1651, +1587,1651,1586, +1651,1587,1652, +1588,1652,1587, +1652,1588,1653, +1589,1653,1588, +1653,1589,1654, +1590,1654,1589, +1654,1590,1655, +1591,1655,1590, +1655,1591,1656, +1592,1656,1591, +1656,1592,1657, +1593,1657,1592, +1657,1593,1658, +1594,1658,1593, +1658,1594,1659, +1595,1659,1594, +1659,1595,1660, +1596,1660,1595, +1660,1596,1661, +1597,1661,1596, +1661,1597,1662, +1598,1662,1597, +1662,1598,1663, +1599,1663,1598, +1664,1600,1665, +1601,1665,1600, +1665,1601,1666, +1602,1666,1601, +1666,1602,1667, +1603,1667,1602, +1667,1603,1668, +1604,1668,1603, +1668,1604,1669, +1605,1669,1604, +1669,1605,1670, +1606,1670,1605, +1670,1606,1671, +1607,1671,1606, +1671,1607,1672, +1608,1672,1607, +1672,1608,1673, +1609,1673,1608, +1673,1609,1674, +1610,1674,1609, +1674,1610,1675, +1611,1675,1610, +1675,1611,1676, +1612,1676,1611, +1676,1612,1677, +1613,1677,1612, +1677,1613,1678, +1614,1678,1613, +1678,1614,1679, +1615,1679,1614, +1679,1615,1680, +1616,1680,1615, +1680,1616,1681, +1617,1681,1616, +1681,1617,1682, +1618,1682,1617, +1682,1618,1683, +1619,1683,1618, +1683,1619,1684, +1620,1684,1619, +1684,1620,1685, +1621,1685,1620, +1685,1621,1686, +1622,1686,1621, +1686,1622,1687, +1623,1687,1622, +1687,1623,1688, +1624,1688,1623, +1688,1624,1689, +1625,1689,1624, +1689,1625,1690, +1626,1690,1625, +1690,1626,1691, +1627,1691,1626, +1691,1627,1692, +1628,1692,1627, +1692,1628,1693, +1629,1693,1628, +1693,1629,1694, +1630,1694,1629, +1694,1630,1695, +1631,1695,1630, +1695,1631,1696, +1632,1696,1631, +1696,1632,1697, +1633,1697,1632, +1697,1633,1698, +1634,1698,1633, +1698,1634,1699, +1635,1699,1634, +1699,1635,1700, +1636,1700,1635, +1700,1636,1701, +1637,1701,1636, +1701,1637,1702, +1638,1702,1637, +1702,1638,1703, +1639,1703,1638, +1703,1639,1704, +1640,1704,1639, +1704,1640,1705, +1641,1705,1640, +1705,1641,1706, +1642,1706,1641, +1706,1642,1707, +1643,1707,1642, +1707,1643,1708, +1644,1708,1643, +1708,1644,1709, +1645,1709,1644, +1709,1645,1710, +1646,1710,1645, +1710,1646,1711, +1647,1711,1646, +1711,1647,1712, +1648,1712,1647, +1712,1648,1713, +1649,1713,1648, +1713,1649,1714, +1650,1714,1649, +1714,1650,1715, +1651,1715,1650, +1715,1651,1716, +1652,1716,1651, +1716,1652,1717, +1653,1717,1652, +1717,1653,1718, +1654,1718,1653, +1718,1654,1719, +1655,1719,1654, +1719,1655,1720, +1656,1720,1655, +1720,1656,1721, +1657,1721,1656, +1721,1657,1722, +1658,1722,1657, +1722,1658,1723, +1659,1723,1658, +1723,1659,1724, +1660,1724,1659, +1724,1660,1725, +1661,1725,1660, +1725,1661,1726, +1662,1726,1661, +1726,1662,1727, +1663,1727,1662, +1728,1664,1729, +1665,1729,1664, +1729,1665,1730, +1666,1730,1665, +1730,1666,1731, +1667,1731,1666, +1731,1667,1732, +1668,1732,1667, +1732,1668,1733, +1669,1733,1668, +1733,1669,1734, +1670,1734,1669, +1734,1670,1735, +1671,1735,1670, +1735,1671,1736, +1672,1736,1671, +1736,1672,1737, +1673,1737,1672, +1737,1673,1738, +1674,1738,1673, +1738,1674,1739, +1675,1739,1674, +1739,1675,1740, +1676,1740,1675, +1740,1676,1741, +1677,1741,1676, +1741,1677,1742, +1678,1742,1677, +1742,1678,1743, +1679,1743,1678, +1743,1679,1744, +1680,1744,1679, +1744,1680,1745, +1681,1745,1680, +1745,1681,1746, +1682,1746,1681, +1746,1682,1747, +1683,1747,1682, +1747,1683,1748, +1684,1748,1683, +1748,1684,1749, +1685,1749,1684, +1749,1685,1750, +1686,1750,1685, +1750,1686,1751, +1687,1751,1686, +1751,1687,1752, +1688,1752,1687, +1752,1688,1753, +1689,1753,1688, +1753,1689,1754, +1690,1754,1689, +1754,1690,1755, +1691,1755,1690, +1755,1691,1756, +1692,1756,1691, +1756,1692,1757, +1693,1757,1692, +1757,1693,1758, +1694,1758,1693, +1758,1694,1759, +1695,1759,1694, +1759,1695,1760, +1696,1760,1695, +1760,1696,1761, +1697,1761,1696, +1761,1697,1762, +1698,1762,1697, +1762,1698,1763, +1699,1763,1698, +1763,1699,1764, +1700,1764,1699, +1764,1700,1765, +1701,1765,1700, +1765,1701,1766, +1702,1766,1701, +1766,1702,1767, +1703,1767,1702, +1767,1703,1768, +1704,1768,1703, +1768,1704,1769, +1705,1769,1704, +1769,1705,1770, +1706,1770,1705, +1770,1706,1771, +1707,1771,1706, +1771,1707,1772, +1708,1772,1707, +1772,1708,1773, +1709,1773,1708, +1773,1709,1774, +1710,1774,1709, +1774,1710,1775, +1711,1775,1710, +1775,1711,1776, +1712,1776,1711, +1776,1712,1777, +1713,1777,1712, +1777,1713,1778, +1714,1778,1713, +1778,1714,1779, +1715,1779,1714, +1779,1715,1780, +1716,1780,1715, +1780,1716,1781, +1717,1781,1716, +1781,1717,1782, +1718,1782,1717, +1782,1718,1783, +1719,1783,1718, +1783,1719,1784, +1720,1784,1719, +1784,1720,1785, +1721,1785,1720, +1785,1721,1786, +1722,1786,1721, +1786,1722,1787, +1723,1787,1722, +1787,1723,1788, +1724,1788,1723, +1788,1724,1789, +1725,1789,1724, +1789,1725,1790, +1726,1790,1725, +1790,1726,1791, +1727,1791,1726, +1792,1728,1793, +1729,1793,1728, +1793,1729,1794, +1730,1794,1729, +1794,1730,1795, +1731,1795,1730, +1795,1731,1796, +1732,1796,1731, +1796,1732,1797, +1733,1797,1732, +1797,1733,1798, +1734,1798,1733, +1798,1734,1799, +1735,1799,1734, +1799,1735,1800, +1736,1800,1735, +1800,1736,1801, +1737,1801,1736, +1801,1737,1802, +1738,1802,1737, +1802,1738,1803, +1739,1803,1738, +1803,1739,1804, +1740,1804,1739, +1804,1740,1805, +1741,1805,1740, +1805,1741,1806, +1742,1806,1741, +1806,1742,1807, +1743,1807,1742, +1807,1743,1808, +1744,1808,1743, +1808,1744,1809, +1745,1809,1744, +1809,1745,1810, +1746,1810,1745, +1810,1746,1811, +1747,1811,1746, +1811,1747,1812, +1748,1812,1747, +1812,1748,1813, +1749,1813,1748, +1813,1749,1814, +1750,1814,1749, +1814,1750,1815, +1751,1815,1750, +1815,1751,1816, +1752,1816,1751, +1816,1752,1817, +1753,1817,1752, +1817,1753,1818, +1754,1818,1753, +1818,1754,1819, +1755,1819,1754, +1819,1755,1820, +1756,1820,1755, +1820,1756,1821, +1757,1821,1756, +1821,1757,1822, +1758,1822,1757, +1822,1758,1823, +1759,1823,1758, +1823,1759,1824, +1760,1824,1759, +1824,1760,1825, +1761,1825,1760, +1825,1761,1826, +1762,1826,1761, +1826,1762,1827, +1763,1827,1762, +1827,1763,1828, +1764,1828,1763, +1828,1764,1829, +1765,1829,1764, +1829,1765,1830, +1766,1830,1765, +1830,1766,1831, +1767,1831,1766, +1831,1767,1832, +1768,1832,1767, +1832,1768,1833, +1769,1833,1768, +1833,1769,1834, +1770,1834,1769, +1834,1770,1835, +1771,1835,1770, +1835,1771,1836, +1772,1836,1771, +1836,1772,1837, +1773,1837,1772, +1837,1773,1838, +1774,1838,1773, +1838,1774,1839, +1775,1839,1774, +1839,1775,1840, +1776,1840,1775, +1840,1776,1841, +1777,1841,1776, +1841,1777,1842, +1778,1842,1777, +1842,1778,1843, +1779,1843,1778, +1843,1779,1844, +1780,1844,1779, +1844,1780,1845, +1781,1845,1780, +1845,1781,1846, +1782,1846,1781, +1846,1782,1847, +1783,1847,1782, +1847,1783,1848, +1784,1848,1783, +1848,1784,1849, +1785,1849,1784, +1849,1785,1850, +1786,1850,1785, +1850,1786,1851, +1787,1851,1786, +1851,1787,1852, +1788,1852,1787, +1852,1788,1853, +1789,1853,1788, +1853,1789,1854, +1790,1854,1789, +1854,1790,1855, +1791,1855,1790, +1856,1792,1857, +1793,1857,1792, +1857,1793,1858, +1794,1858,1793, +1858,1794,1859, +1795,1859,1794, +1859,1795,1860, +1796,1860,1795, +1860,1796,1861, +1797,1861,1796, +1861,1797,1862, +1798,1862,1797, +1862,1798,1863, +1799,1863,1798, +1863,1799,1864, +1800,1864,1799, +1864,1800,1865, +1801,1865,1800, +1865,1801,1866, +1802,1866,1801, +1866,1802,1867, +1803,1867,1802, +1867,1803,1868, +1804,1868,1803, +1868,1804,1869, +1805,1869,1804, +1869,1805,1870, +1806,1870,1805, +1870,1806,1871, +1807,1871,1806, +1871,1807,1872, +1808,1872,1807, +1872,1808,1873, +1809,1873,1808, +1873,1809,1874, +1810,1874,1809, +1874,1810,1875, +1811,1875,1810, +1875,1811,1876, +1812,1876,1811, +1876,1812,1877, +1813,1877,1812, +1877,1813,1878, +1814,1878,1813, +1878,1814,1879, +1815,1879,1814, +1879,1815,1880, +1816,1880,1815, +1880,1816,1881, +1817,1881,1816, +1881,1817,1882, +1818,1882,1817, +1882,1818,1883, +1819,1883,1818, +1883,1819,1884, +1820,1884,1819, +1884,1820,1885, +1821,1885,1820, +1885,1821,1886, +1822,1886,1821, +1886,1822,1887, +1823,1887,1822, +1887,1823,1888, +1824,1888,1823, +1888,1824,1889, +1825,1889,1824, +1889,1825,1890, +1826,1890,1825, +1890,1826,1891, +1827,1891,1826, +1891,1827,1892, +1828,1892,1827, +1892,1828,1893, +1829,1893,1828, +1893,1829,1894, +1830,1894,1829, +1894,1830,1895, +1831,1895,1830, +1895,1831,1896, +1832,1896,1831, +1896,1832,1897, +1833,1897,1832, +1897,1833,1898, +1834,1898,1833, +1898,1834,1899, +1835,1899,1834, +1899,1835,1900, +1836,1900,1835, +1900,1836,1901, +1837,1901,1836, +1901,1837,1902, +1838,1902,1837, +1902,1838,1903, +1839,1903,1838, +1903,1839,1904, +1840,1904,1839, +1904,1840,1905, +1841,1905,1840, +1905,1841,1906, +1842,1906,1841, +1906,1842,1907, +1843,1907,1842, +1907,1843,1908, +1844,1908,1843, +1908,1844,1909, +1845,1909,1844, +1909,1845,1910, +1846,1910,1845, +1910,1846,1911, +1847,1911,1846, +1911,1847,1912, +1848,1912,1847, +1912,1848,1913, +1849,1913,1848, +1913,1849,1914, +1850,1914,1849, +1914,1850,1915, +1851,1915,1850, +1915,1851,1916, +1852,1916,1851, +1916,1852,1917, +1853,1917,1852, +1917,1853,1918, +1854,1918,1853, +1918,1854,1919, +1855,1919,1854, +1920,1856,1921, +1857,1921,1856, +1921,1857,1922, +1858,1922,1857, +1922,1858,1923, +1859,1923,1858, +1923,1859,1924, +1860,1924,1859, +1924,1860,1925, +1861,1925,1860, +1925,1861,1926, +1862,1926,1861, +1926,1862,1927, +1863,1927,1862, +1927,1863,1928, +1864,1928,1863, +1928,1864,1929, +1865,1929,1864, +1929,1865,1930, +1866,1930,1865, +1930,1866,1931, +1867,1931,1866, +1931,1867,1932, +1868,1932,1867, +1932,1868,1933, +1869,1933,1868, +1933,1869,1934, +1870,1934,1869, +1934,1870,1935, +1871,1935,1870, +1935,1871,1936, +1872,1936,1871, +1936,1872,1937, +1873,1937,1872, +1937,1873,1938, +1874,1938,1873, +1938,1874,1939, +1875,1939,1874, +1939,1875,1940, +1876,1940,1875, +1940,1876,1941, +1877,1941,1876, +1941,1877,1942, +1878,1942,1877, +1942,1878,1943, +1879,1943,1878, +1943,1879,1944, +1880,1944,1879, +1944,1880,1945, +1881,1945,1880, +1945,1881,1946, +1882,1946,1881, +1946,1882,1947, +1883,1947,1882, +1947,1883,1948, +1884,1948,1883, +1948,1884,1949, +1885,1949,1884, +1949,1885,1950, +1886,1950,1885, +1950,1886,1951, +1887,1951,1886, +1951,1887,1952, +1888,1952,1887, +1952,1888,1953, +1889,1953,1888, +1953,1889,1954, +1890,1954,1889, +1954,1890,1955, +1891,1955,1890, +1955,1891,1956, +1892,1956,1891, +1956,1892,1957, +1893,1957,1892, +1957,1893,1958, +1894,1958,1893, +1958,1894,1959, +1895,1959,1894, +1959,1895,1960, +1896,1960,1895, +1960,1896,1961, +1897,1961,1896, +1961,1897,1962, +1898,1962,1897, +1962,1898,1963, +1899,1963,1898, +1963,1899,1964, +1900,1964,1899, +1964,1900,1965, +1901,1965,1900, +1965,1901,1966, +1902,1966,1901, +1966,1902,1967, +1903,1967,1902, +1967,1903,1968, +1904,1968,1903, +1968,1904,1969, +1905,1969,1904, +1969,1905,1970, +1906,1970,1905, +1970,1906,1971, +1907,1971,1906, +1971,1907,1972, +1908,1972,1907, +1972,1908,1973, +1909,1973,1908, +1973,1909,1974, +1910,1974,1909, +1974,1910,1975, +1911,1975,1910, +1975,1911,1976, +1912,1976,1911, +1976,1912,1977, +1913,1977,1912, +1977,1913,1978, +1914,1978,1913, +1978,1914,1979, +1915,1979,1914, +1979,1915,1980, +1916,1980,1915, +1980,1916,1981, +1917,1981,1916, +1981,1917,1982, +1918,1982,1917, +1982,1918,1983, +1919,1983,1918, +1984,1920,1985, +1921,1985,1920, +1985,1921,1986, +1922,1986,1921, +1986,1922,1987, +1923,1987,1922, +1987,1923,1988, +1924,1988,1923, +1988,1924,1989, +1925,1989,1924, +1989,1925,1990, +1926,1990,1925, +1990,1926,1991, +1927,1991,1926, +1991,1927,1992, +1928,1992,1927, +1992,1928,1993, +1929,1993,1928, +1993,1929,1994, +1930,1994,1929, +1994,1930,1995, +1931,1995,1930, +1995,1931,1996, +1932,1996,1931, +1996,1932,1997, +1933,1997,1932, +1997,1933,1998, +1934,1998,1933, +1998,1934,1999, +1935,1999,1934, +1999,1935,2000, +1936,2000,1935, +2000,1936,2001, +1937,2001,1936, +2001,1937,2002, +1938,2002,1937, +2002,1938,2003, +1939,2003,1938, +2003,1939,2004, +1940,2004,1939, +2004,1940,2005, +1941,2005,1940, +2005,1941,2006, +1942,2006,1941, +2006,1942,2007, +1943,2007,1942, +2007,1943,2008, +1944,2008,1943, +2008,1944,2009, +1945,2009,1944, +2009,1945,2010, +1946,2010,1945, +2010,1946,2011, +1947,2011,1946, +2011,1947,2012, +1948,2012,1947, +2012,1948,2013, +1949,2013,1948, +2013,1949,2014, +1950,2014,1949, +2014,1950,2015, +1951,2015,1950, +2015,1951,2016, +1952,2016,1951, +2016,1952,2017, +1953,2017,1952, +2017,1953,2018, +1954,2018,1953, +2018,1954,2019, +1955,2019,1954, +2019,1955,2020, +1956,2020,1955, +2020,1956,2021, +1957,2021,1956, +2021,1957,2022, +1958,2022,1957, +2022,1958,2023, +1959,2023,1958, +2023,1959,2024, +1960,2024,1959, +2024,1960,2025, +1961,2025,1960, +2025,1961,2026, +1962,2026,1961, +2026,1962,2027, +1963,2027,1962, +2027,1963,2028, +1964,2028,1963, +2028,1964,2029, +1965,2029,1964, +2029,1965,2030, +1966,2030,1965, +2030,1966,2031, +1967,2031,1966, +2031,1967,2032, +1968,2032,1967, +2032,1968,2033, +1969,2033,1968, +2033,1969,2034, +1970,2034,1969, +2034,1970,2035, +1971,2035,1970, +2035,1971,2036, +1972,2036,1971, +2036,1972,2037, +1973,2037,1972, +2037,1973,2038, +1974,2038,1973, +2038,1974,2039, +1975,2039,1974, +2039,1975,2040, +1976,2040,1975, +2040,1976,2041, +1977,2041,1976, +2041,1977,2042, +1978,2042,1977, +2042,1978,2043, +1979,2043,1978, +2043,1979,2044, +1980,2044,1979, +2044,1980,2045, +1981,2045,1980, +2045,1981,2046, +1982,2046,1981, +2046,1982,2047, +1983,2047,1982, +}; + diff --git a/BulletPhysics/bulletTrunk/Demos/Benchmarks/main.cpp b/BulletPhysics/bulletTrunk/Demos/Benchmarks/main.cpp new file mode 100644 index 00000000..fbe3a928 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/Benchmarks/main.cpp @@ -0,0 +1,45 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2007 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#include "BenchmarkDemo.h" +#include "GlutStuff.h" +#include "GLDebugDrawer.h" +#include "btBulletDynamicsCommon.h" +#include "LinearMath/btHashMap.h" + + + + +int main(int argc,char** argv) +{ + GLDebugDrawer gDebugDrawer; + + BenchmarkDemo1 benchmarkDemo; +// BenchmarkDemo2 benchmarkDemo; +// BenchmarkDemo3 benchmarkDemo; +// BenchmarkDemo4 benchmarkDemo; +// BenchmarkDemo5 benchmarkDemo; +// BenchmarkDemo6 benchmarkDemo; +// BenchmarkDemo7 benchmarkDemo; + + + benchmarkDemo.initPhysics(); + benchmarkDemo.getDynamicsWorld()->setDebugDrawer(&gDebugDrawer); + + return glutmain(argc, argv,640,480,"Bullet Physics Demo. http://bulletphysics.com",&benchmarkDemo); + + //default glut doesn't return from mainloop + return 0; +} \ No newline at end of file diff --git a/BulletPhysics/bulletTrunk/Demos/BspDemo/BspConverter.cpp b/BulletPhysics/bulletTrunk/Demos/BspDemo/BspConverter.cpp new file mode 100644 index 00000000..8d750c32 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/BspDemo/BspConverter.cpp @@ -0,0 +1,207 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#include "BspConverter.h" +#include "BspLoader.h" +#include "LinearMath/btVector3.h" +#include "LinearMath/btGeometryUtil.h" +#include +#include + + +void BspConverter::convertBsp(BspLoader& bspLoader,float scaling) +{ + { + + float playstartf[3] = {0,0,100}; + + if (bspLoader.findVectorByName(&playstartf[0],"info_player_start")) + { + printf("found playerstart\n"); + } + else + { + if (bspLoader.findVectorByName(&playstartf[0],"info_player_deathmatch")) + { + printf("found deatchmatch start\n"); + } + } + + btVector3 playerStart (playstartf[0],playstartf[1],playstartf[2]); + + + playerStart[2] += 20.f; //start a bit higher + + playerStart *= scaling; + + + + //progressBegin("Loading bsp"); + + for (int i=0;i planeEquations; + + int brushid = bspLoader.m_dleafbrushes[leaf.firstLeafBrush+b]; + + BSPBrush& brush = bspLoader.m_dbrushes[brushid]; + if (brush.shaderNum!=-1) + { + if (bspLoader.m_dshaders[ brush.shaderNum ].contentFlags & BSPCONTENTS_SOLID) + { + brush.shaderNum = -1; + + for (int p=0;p vertices; + btGeometryUtil::getVerticesFromPlaneEquations(planeEquations,vertices); + + bool isEntity = false; + btVector3 entityTarget(0.f,0.f,0.f); + addConvexVerticesCollider(vertices,isEntity,entityTarget); + + } + } + } + } + } + +#define USE_ENTITIES +#ifdef USE_ENTITIES + + + { + int i; + for (i=0;i=0) && (modelnr < bspLoader.m_nummodels)) + { + const BSPModel& model = bspLoader.m_dmodels[modelnr]; + for (int n=0;n planeEquations; + bool isValidBrush = false; + + //convert brush + const BSPBrush& brush = bspLoader.m_dbrushes[model.firstBrush+n]; + { + for (int p=0;p vertices; + btGeometryUtil::getVerticesFromPlaneEquations(planeEquations,vertices); + + bool isEntity=true; + addConvexVerticesCollider(vertices,isEntity,targetLocation); + + } + } + + } + } + } + else + { + printf("unsupported trigger_push model, md3 ?\n"); + } + } + + } + } + } + } + +#endif //USE_ENTITIES + + + + //progressEnd(); + } + + } + + + + + + diff --git a/BulletPhysics/bulletTrunk/Demos/BspDemo/BspConverter.h b/BulletPhysics/bulletTrunk/Demos/BspDemo/BspConverter.h new file mode 100644 index 00000000..aca44db2 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/BspDemo/BspConverter.h @@ -0,0 +1,39 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef BSP_CONVERTER_H +#define BSP_CONVERTER_H + +class BspLoader; +#include "LinearMath/btVector3.h" +#include "LinearMath/btAlignedObjectArray.h" + +///BspConverter turns a loaded bsp level into convex parts (vertices) +class BspConverter +{ + public: + + void convertBsp(BspLoader& bspLoader,float scaling); + virtual ~BspConverter() + { + } + + ///this callback is called for each brush that succesfully converted into vertices + virtual void addConvexVerticesCollider(btAlignedObjectArray& vertices, bool isEntity, const btVector3& entityTargetLocation) = 0; + +}; + +#endif //BSP_CONVERTER_H + diff --git a/BulletPhysics/bulletTrunk/Demos/BspDemo/BspDemo.cpp b/BulletPhysics/bulletTrunk/Demos/BspDemo/BspDemo.cpp new file mode 100644 index 00000000..cb12f123 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/BspDemo/BspDemo.cpp @@ -0,0 +1,305 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#include "btBulletDynamicsCommon.h" + +#include "LinearMath/btQuickprof.h" +#include "LinearMath/btIDebugDraw.h" + +#include "GLDebugDrawer.h" + + +#define QUAKE_BSP_IMPORTING 1 + +#ifdef QUAKE_BSP_IMPORTING +#include "BspLoader.h" +#include "BspConverter.h" +#endif //QUAKE_BSP_IMPORTING + +#include "BMF_Api.h" +#include //printf debugging + + +#include "BspDemo.h" +#include "GL_ShapeDrawer.h" +#include "GlutStuff.h" + + + + +#define CUBE_HALF_EXTENTS 1 +#define EXTRA_HEIGHT -20.f + + + +///BspToBulletConverter extends the BspConverter to convert to Bullet datastructures +class BspToBulletConverter : public BspConverter +{ + BspDemo* m_demoApp; + +public: + + BspToBulletConverter(BspDemo* demoApp) + :m_demoApp(demoApp) + { + } + + virtual void addConvexVerticesCollider(btAlignedObjectArray& vertices, bool isEntity, const btVector3& entityTargetLocation) + { + ///perhaps we can do something special with entities (isEntity) + ///like adding a collision Triggering (as example) + + if (vertices.size() > 0) + { + float mass = 0.f; + btTransform startTransform; + //can use a shift + startTransform.setIdentity(); + startTransform.setOrigin(btVector3(0,0,-10.f)); + //this create an internal copy of the vertices + + btCollisionShape* shape = new btConvexHullShape(&(vertices[0].getX()),vertices.size()); + m_demoApp->m_collisionShapes.push_back(shape); + + //btRigidBody* body = m_demoApp->localCreateRigidBody(mass, startTransform,shape); + m_demoApp->localCreateRigidBody(mass, startTransform,shape); + } + } +}; + + + + + +//////////////////////////////////// + + + + + + + +BspDemo::~BspDemo() +{ + //cleanup in the reverse order of creation/initialization + + //remove the rigidbodies from the dynamics world and delete them + int i; + for (i=m_dynamicsWorld->getNumCollisionObjects()-1; i>=0 ;i--) + { + btCollisionObject* obj = m_dynamicsWorld->getCollisionObjectArray()[i]; + btRigidBody* body = btRigidBody::upcast(obj); + if (body && body->getMotionState()) + { + delete body->getMotionState(); + } + m_dynamicsWorld->removeCollisionObject( obj ); + delete obj; + } + + //delete collision shapes + for (int j=0;jsetGravity(-m_cameraUp * 10); + + +#ifdef QUAKE_BSP_IMPORTING + + void* memoryBuffer = 0; + + FILE* file = fopen(bspfilename,"r"); + if (!file) + { + //try again other path, + //sight... visual studio leaves the current working directory in the projectfiles folder + //instead of executable folder. who wants this default behaviour?!? + bspfilename = "../../BspDemo.bsp"; + file = fopen(bspfilename,"r"); + } + if (!file) + { + //try again other path, + //sight... visual studio leaves the current working directory in the projectfiles folder + //instead of executable folder. who wants this default behaviour?!? + bspfilename = "BspDemo.bsp"; + file = fopen(bspfilename,"r"); + } + + if (file) + { + BspLoader bspLoader; + int size=0; + if (fseek(file, 0, SEEK_END) || (size = ftell(file)) == EOF || fseek(file, 0, SEEK_SET)) { /* File operations denied? ok, just close and return failure */ + printf("Error: cannot get filesize from %s\n", bspfilename); + } else + { + //how to detect file size? + memoryBuffer = malloc(size+1); + fread(memoryBuffer,1,size,file); + bspLoader.loadBSPFile( memoryBuffer); + + BspToBulletConverter bsp2bullet(this); + float bspScaling = 0.1f; + bsp2bullet.convertBsp(bspLoader,bspScaling); + + } + fclose(file); + } + +#endif + + + + + clientResetScene(); + +} + + +void BspDemo::clientMoveAndDisplay() +{ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + float dt = getDeltaTimeMicroseconds() * 0.000001f; + + m_dynamicsWorld->stepSimulation(dt); + + //optional but useful: debug drawing + m_dynamicsWorld->debugDrawWorld(); + + renderme(); + + glFlush(); + glutSwapBuffers(); + +} + + + +void BspDemo::displayCallback(void) { + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + + renderme(); + + //optional but useful: debug drawing + if (m_dynamicsWorld) + m_dynamicsWorld->debugDrawWorld(); + + glFlush(); + glutSwapBuffers(); +} + + + + + + +//some code that de-mangles the windows filename passed in as argument +char cleaned_filename[512]; +char* getLastFileName() +{ + return cleaned_filename; +} +char* makeExeToBspFilename(const char* lpCmdLine) +{ + + + // We might get a windows-style path on the command line, this can mess up the DOM which expects + // all paths to be URI's. This block of code does some conversion to try and make the input + // compliant without breaking the ability to accept a properly formatted URI. Right now this only + // displays the first filename + const char *in = lpCmdLine; + char* out = cleaned_filename; + *out = '\0'; + // If the first character is a ", skip it (filenames with spaces in them are quoted) + if(*in == '\"') + { + in++; + } + int i; + for(i =0; i<512; i++) + { + //if we get '.' we stop as well, unless it's the first character. Then we add .bsp as extension + // If we hit a null or a quote, stop copying. This will get just the first filename. + if(i && (in[0] == '.') && (in[1] == 'e') && (in[2] == 'x') && (in[3] == 'e')) + break; + + // If we hit a null or a quote, stop copying. This will get just the first filename. + if(*in == '\0' || *in == '\"') + break; + // Copy while swapping backslashes for forward ones + if(*in == '\\') + { + *out = '/'; + } + else + { + *out = *in; + } + in++; + out++; + } + *(out++) = '.'; + *(out++) = 'b'; + *(out++) = 's'; + *(out++) = 'p'; + *(out++) = 0; + + return cleaned_filename; +} diff --git a/BulletPhysics/bulletTrunk/Demos/BspDemo/BspDemo.h b/BulletPhysics/bulletTrunk/Demos/BspDemo/BspDemo.h new file mode 100644 index 00000000..6a8f933a --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/BspDemo/BspDemo.h @@ -0,0 +1,69 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ +#ifndef BSP_DEMO_H +#define BSP_DEMO_H + +#include "DemoApplication.h" +#include "LinearMath/btAlignedObjectArray.h" + +class btBroadphaseInterface; +class btCollisionShape; +class btOverlappingPairCache; +class btCollisionDispatcher; +class btConstraintSolver; +struct btCollisionAlgorithmCreateFunc; +class btDefaultCollisionConfiguration; + + +///BspDemo shows the convex collision detection, by converting a Quake BSP file into convex objects and allowing interaction with boxes. +class BspDemo : public DemoApplication +{ + public: + + //keep the collision shapes, for deletion/cleanup + btAlignedObjectArray m_collisionShapes; + + btBroadphaseInterface* m_broadphase; + + btCollisionDispatcher* m_dispatcher; + + btConstraintSolver* m_solver; + + btDefaultCollisionConfiguration* m_collisionConfiguration; + + + + + virtual ~BspDemo(); + + void initPhysics(char* bspfilename); + + virtual void clientMoveAndDisplay(); + + virtual void displayCallback(); + + static DemoApplication* Create() + { + BspDemo* demo = new BspDemo; + demo->myinit(); + demo->initPhysics("BspDemo.bsp"); + return demo; + } + +}; + +#endif //BSP_DEMO_H + + diff --git a/BulletPhysics/bulletTrunk/Demos/BspDemo/BspLoader.cpp b/BulletPhysics/bulletTrunk/Demos/BspDemo/BspLoader.cpp new file mode 100644 index 00000000..0572463a --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/BspDemo/BspLoader.cpp @@ -0,0 +1,730 @@ +/* +=========================================================================== +Copyright (C) 1999-2005 Id Software, Inc. + +This file is part of Quake III Arena source code. + +Quake III Arena source code is free software; you can redistribute it +and/or modify it under the terms of the GNU bteral Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Quake III Arena source code is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU bteral Public License for more details. + +You should have received a copy of the GNU bteral Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + + +#include "BspLoader.h" +#include +#include + +typedef struct +{ + char filename[1024]; + char *buffer,*script_p,*end_p; + int line; +} BSPScript; + +#define MAX_INCLUDES 8 +BSPScript scriptstack[MAX_INCLUDES]; +BSPScript *script; +int scriptline; + +char token[BSPMAXTOKEN]; +bool endofscript; +bool tokenready; // only true if UnGetToken was just called + +// +//loadBSPFile +// + +int extrasize = 100; + +BspLoader::BspLoader() + :m_num_entities(0) +{ + m_Endianness = getMachineEndianness(); + if (m_Endianness == BSP_BIG_ENDIAN) + { + printf("Machine is BIG_ENDIAN\n"); + } else + { + printf("Machine is Little Endian\n"); + } +} + + +bool BspLoader::loadBSPFile( void* memoryBuffer) { + + BSPHeader *header = (BSPHeader*) memoryBuffer; + + // load the file header + if (header) + { + // swap the header + swapBlock( (int *)header, sizeof(*header) ); + + int length = (header->lumps[BSPLUMP_SHADERS].filelen) / sizeof(BSPShader); + m_dshaders.resize(length+extrasize); + m_numShaders = copyLump( header, BSPLUMP_SHADERS, &m_dshaders[0], sizeof(BSPShader) ); + + length = (header->lumps[LUMP_MODELS].filelen) / sizeof(BSPModel); + m_dmodels.resize(length+extrasize); + m_nummodels = copyLump( header, LUMP_MODELS, &m_dmodels[0], sizeof(BSPModel) ); + + length = (header->lumps[BSPLUMP_PLANES].filelen) / sizeof(BSPPlane); + m_dplanes.resize(length+extrasize); + m_numplanes = copyLump( header, BSPLUMP_PLANES, &m_dplanes[0], sizeof(BSPPlane) ); + + length = (header->lumps[BSPLUMP_LEAFS].filelen) / sizeof(BSPLeaf); + m_dleafs.resize(length+extrasize); + m_numleafs = copyLump( header, BSPLUMP_LEAFS, &m_dleafs[0], sizeof(BSPLeaf) ); + + length = (header->lumps[BSPLUMP_NODES].filelen) / sizeof(BSPNode); + m_dnodes.resize(length+extrasize); + m_numnodes = copyLump( header, BSPLUMP_NODES, &m_dnodes[0], sizeof(BSPNode) ); + + length = (header->lumps[BSPLUMP_LEAFSURFACES].filelen) / sizeof(m_dleafsurfaces[0]); + m_dleafsurfaces.resize(length+extrasize); + m_numleafsurfaces = copyLump( header, BSPLUMP_LEAFSURFACES, &m_dleafsurfaces[0], sizeof(m_dleafsurfaces[0]) ); + + length = (header->lumps[BSPLUMP_LEAFBRUSHES].filelen) / sizeof(m_dleafbrushes[0]) ; + m_dleafbrushes.resize(length+extrasize); + m_numleafbrushes = copyLump( header, BSPLUMP_LEAFBRUSHES, &m_dleafbrushes[0], sizeof(m_dleafbrushes[0]) ); + + length = (header->lumps[LUMP_BRUSHES].filelen) / sizeof(BSPBrush); + m_dbrushes.resize(length+extrasize); + m_numbrushes = copyLump( header, LUMP_BRUSHES, &m_dbrushes[0], sizeof(BSPBrush) ); + + + length = (header->lumps[LUMP_BRUSHSIDES].filelen) / sizeof(BSPBrushSide); + m_dbrushsides.resize(length+extrasize); + m_numbrushsides = copyLump( header, LUMP_BRUSHSIDES, &m_dbrushsides[0], sizeof(BSPBrushSide) ); + + + length = (header->lumps[LUMP_SURFACES].filelen) / sizeof(BSPSurface); + m_drawSurfaces.resize(length+extrasize); + m_numDrawSurfaces = copyLump( header, LUMP_SURFACES, &m_drawSurfaces[0], sizeof(BSPSurface) ); + + + length = (header->lumps[LUMP_DRAWINDEXES].filelen) / sizeof(m_drawIndexes[0]); + m_drawIndexes.resize(length+extrasize); + m_numDrawIndexes = copyLump( header, LUMP_DRAWINDEXES, &m_drawIndexes[0], sizeof(m_drawIndexes[0]) ); + + length = (header->lumps[LUMP_VISIBILITY].filelen) / 1; + m_visBytes.resize(length+extrasize); + m_numVisBytes = copyLump( header, LUMP_VISIBILITY, &m_visBytes[0], 1 ); + + length = (header->lumps[LUMP_LIGHTMAPS].filelen) / 1; + m_lightBytes.resize(length+extrasize); + m_numLightBytes = copyLump( header, LUMP_LIGHTMAPS, &m_lightBytes[0], 1 ); + + length = (header->lumps[BSPLUMP_ENTITIES].filelen) / 1; + m_dentdata.resize(length+extrasize); + m_entdatasize = copyLump( header, BSPLUMP_ENTITIES, &m_dentdata[0], 1); + + length = (header->lumps[LUMP_LIGHTGRID].filelen) / 1; + m_gridData.resize(length+extrasize); + m_numGridPoints = copyLump( header, LUMP_LIGHTGRID, &m_gridData[0], 8 ); + + // swap everything + swapBSPFile(); + + return true; + + } + return false; +} + + + +const char* BspLoader::getValueForKey( const BSPEntity* ent, const char* key ) const { + + const BSPKeyValuePair* ep; + + for (ep=ent->epairs ; ep ; ep=ep->next) { + if (!strcmp(ep->key, key) ) { + return ep->value; + } + } + return ""; +} + +float BspLoader::getFloatForKey( const BSPEntity *ent, const char *key ) { + const char *k; + + k = getValueForKey( ent, key ); + return float(atof(k)); +} + +bool BspLoader::getVectorForKey( const BSPEntity *ent, const char *key, BSPVector3 vec ) { + + const char *k; + k = getValueForKey (ent, key); + if (strcmp(k, "")) + { + sscanf (k, "%f %f %f", &vec[0], &vec[1], &vec[2]); + return true; + } + return false; +} + + + + +/* +============== +parseFromMemory +============== +*/ +void BspLoader::parseFromMemory (char *buffer, int size) +{ + script = scriptstack; + script++; + if (script == &scriptstack[MAX_INCLUDES]) + { + //printf("script file exceeded MAX_INCLUDES"); + } + strcpy (script->filename, "memory buffer" ); + + script->buffer = buffer; + script->line = 1; + script->script_p = script->buffer; + script->end_p = script->buffer + size; + + endofscript = false; + tokenready = false; +} + + +bool BspLoader::isEndOfScript (bool crossline) +{ + if (!crossline) + //printf("Line %i is incomplete\n",scriptline); + + if (!strcmp (script->filename, "memory buffer")) + { + endofscript = true; + return false; + } + + //free (script->buffer); + if (script == scriptstack+1) + { + endofscript = true; + return false; + } + script--; + scriptline = script->line; + //printf ("returning to %s\n", script->filename); + return getToken (crossline); +} + +/* + +============== +getToken +============== +*/ +bool BspLoader::getToken (bool crossline) +{ + char *token_p; + + if (tokenready) // is a token allready waiting? + { + tokenready = false; + return true; + } + + if (script->script_p >= script->end_p) + return isEndOfScript (crossline); + +// +// skip space +// +skipspace: + while (*script->script_p <= 32) + { + if (script->script_p >= script->end_p) + return isEndOfScript (crossline); + if (*script->script_p++ == '\n') + { + if (!crossline) + { + //printf("Line %i is incomplete\n",scriptline); + } + scriptline = script->line++; + } + } + + if (script->script_p >= script->end_p) + return isEndOfScript (crossline); + + // ; # // comments + if (*script->script_p == ';' || *script->script_p == '#' + || ( script->script_p[0] == '/' && script->script_p[1] == '/') ) + { + if (!crossline) + { + //printf("Line %i is incomplete\n",scriptline); + } + while (*script->script_p++ != '\n') + if (script->script_p >= script->end_p) + return isEndOfScript (crossline); + scriptline = script->line++; + goto skipspace; + } + + // /* */ comments + if (script->script_p[0] == '/' && script->script_p[1] == '*') + { + if (!crossline) + { + //printf("Line %i is incomplete\n",scriptline); + } + script->script_p+=2; + while (script->script_p[0] != '*' && script->script_p[1] != '/') + { + if ( *script->script_p == '\n' ) { + scriptline = script->line++; + } + script->script_p++; + if (script->script_p >= script->end_p) + return isEndOfScript (crossline); + } + script->script_p += 2; + goto skipspace; + } + +// +// copy token +// + token_p = token; + + if (*script->script_p == '"') + { + // quoted token + script->script_p++; + while (*script->script_p != '"') + { + *token_p++ = *script->script_p++; + if (script->script_p == script->end_p) + break; + if (token_p == &token[BSPMAXTOKEN]) + { + //printf ("Token too large on line %i\n",scriptline); + } + } + script->script_p++; + } + else // regular token + while ( *script->script_p > 32 && *script->script_p != ';') + { + *token_p++ = *script->script_p++; + if (script->script_p == script->end_p) + break; + if (token_p == &token[BSPMAXTOKEN]) + { + //printf ("Token too large on line %i\n",scriptline); + } + } + + *token_p = 0; + + if (!strcmp (token, "$include")) + { + //getToken (false); + //AddScriptToStack (token); + return false;//getToken (crossline); + } + + return true; +} + +char *BspLoader::copystring(const char *s) +{ + char *b; + b = (char*) malloc( strlen(s)+1); + strcpy (b, s); + return b; +} + +void BspLoader::stripTrailing( char *e ) { + char *s; + + s = e + strlen(e)-1; + while (s >= e && *s <= 32) + { + *s = 0; + s--; + } +} +/* +================= +parseEpair +================= +*/ +BSPKeyValuePair *BspLoader::parseEpair( void ) { + BSPKeyValuePair *e; + + e = (struct BSPPair*) malloc( sizeof(BSPKeyValuePair)); + memset( e, 0, sizeof(BSPKeyValuePair) ); + + if ( strlen(token) >= BSPMAX_KEY-1 ) { + //printf ("ParseEpar: token too long"); + } + e->key = copystring( token ); + getToken( false ); + if ( strlen(token) >= BSPMAX_VALUE-1 ) { + + //printf ("ParseEpar: token too long"); + } + e->value = copystring( token ); + + // strip trailing spaces that sometimes get accidentally + // added in the editor + stripTrailing( e->key ); + stripTrailing( e->value ); + + return e; +} + + +/* +================ +parseEntity +================ +*/ +bool BspLoader::parseEntity( void ) { + BSPKeyValuePair *e; + BSPEntity *mapent; + + if ( !getToken (true) ) { + return false; + } + + if ( strcmp (token, "{") ) { + + //printf ("parseEntity: { not found"); + } + + BSPEntity bla; + bla.brushes = 0; + bla.epairs = 0; + bla.firstDrawSurf = 0; + bla.origin[0] = 0.f; + bla.origin[1] = 0.f; + bla.origin[2] = 0.f; + bla.patches = 0; + + m_entities.push_back(bla); + mapent = &m_entities[m_entities.size()-1]; + m_num_entities++; + + do { + if ( !getToken (true) ) { + //printf("parseEntity: EOF without closing brace"); + } + if ( !strcmp (token, "}") ) { + break; + } + e = (struct BSPPair*)parseEpair (); + e->next = mapent->epairs; + mapent->epairs = e; + } while (1); + + return true; +} + +/* +================ +parseEntities + +Parses the dentdata string into entities +================ +*/ +void BspLoader::parseEntities( void ) { + m_num_entities = 0; + m_entities.clear(); + + parseFromMemory( &m_dentdata[0], m_entdatasize ); + + while ( parseEntity () ) { + } +} + + + +int BspLoader::getMachineEndianness() +{ + long int i = 1; + const char *p = (const char *) &i; + if (p[0] == 1) // Lowest address contains the least significant byte + return BSP_LITTLE_ENDIAN; + else + return BSP_BIG_ENDIAN; +} + +short BspLoader::isLittleShort (short l) +{ + if (machineEndianness() == BSP_BIG_ENDIAN) + { + unsigned char b1,b2; + + b1 = l&255; + b2 = (l>>8)&255; + + return (b1<<8) + b2; + } + //little endian + return l; +} + +short BspLoader::isBigShort (short l) +{ + if (machineEndianness() == BSP_BIG_ENDIAN) + { + return l; + } + + unsigned char b1,b2; + + b1 = l&255; + b2 = (l>>8)&255; + + return (b1<<8) + b2; + + + +} + + +int BspLoader::isLittleLong (int l) +{ + if (machineEndianness() == BSP_BIG_ENDIAN) + { + unsigned char b1,b2,b3,b4; + + b1 = l&255; + b2 = (l>>8)&255; + b3 = (l>>16)&255; + b4 = (l>>24)&255; + + return ((int)b1<<24) + ((int)b2<<16) + ((int)b3<<8) + b4; + } + + //little endian + return l; + +} + +int BspLoader::isBigLong (int l) +{ + if (machineEndianness() == BSP_BIG_ENDIAN) + { + return l; + } + + + unsigned char b1,b2,b3,b4; + + b1 = l&255; + b2 = (l>>8)&255; + b3 = (l>>16)&255; + b4 = (l>>24)&255; + + return ((int)b1<<24) + ((int)b2<<16) + ((int)b3<<8) + b4; + +} + + +float BspLoader::isLittleFloat (float l) +{ + if (machineEndianness() == BSP_BIG_ENDIAN) + { + union {unsigned char b[4]; float f;} in, out; + + in.f = l; + out.b[0] = in.b[3]; + out.b[1] = in.b[2]; + out.b[2] = in.b[1]; + out.b[3] = in.b[0]; + + return out.f; + } + + //little endian + return l; +} + +float BspLoader::isBigFloat (float l) +{ + if (machineEndianness() == BSP_BIG_ENDIAN) + { + return l; + } + //little endian + union {unsigned char b[4]; float f;} in, out; + + in.f = l; + out.b[0] = in.b[3]; + out.b[1] = in.b[2]; + out.b[2] = in.b[1]; + out.b[3] = in.b[0]; + + return out.f; +} + + + + + + +// +// swapBlock +// If all values are 32 bits, this can be used to swap everything +// + +void BspLoader::swapBlock( int *block, int sizeOfBlock ) { + int i; + + sizeOfBlock >>= 2; + for ( i = 0 ; i < sizeOfBlock ; i++ ) { + block[i] = isLittleLong( block[i] ); + } +} + +// +// copyLump +// + +int BspLoader::copyLump( BSPHeader *header, int lump, void *dest, int size ) { + int length, ofs; + + length = header->lumps[lump].filelen; + ofs = header->lumps[lump].fileofs; + + //if ( length % size ) { + // printf ("loadBSPFile: odd lump size"); + //} + + memcpy( dest, (unsigned char *)header + ofs, length ); + + return length / size; +} + + + + +// +// swapBSPFile +// + +void BspLoader::swapBSPFile( void ) { + int i; + + // models + swapBlock( (int *) &m_dmodels[0], m_nummodels * sizeof( m_dmodels[0] ) ); + + // shaders (don't swap the name) + for ( i = 0 ; i < m_numShaders ; i++ ) { + m_dshaders[i].contentFlags = isLittleLong( m_dshaders[i].contentFlags ); + m_dshaders[i].surfaceFlags = isLittleLong( m_dshaders[i].surfaceFlags ); + } + + // planes + swapBlock( (int *)&m_dplanes[0], m_numplanes * sizeof( m_dplanes[0] ) ); + + // nodes + swapBlock( (int *)&m_dnodes[0], m_numnodes * sizeof( m_dnodes[0] ) ); + + // leafs + swapBlock( (int *)&m_dleafs[0], m_numleafs * sizeof( m_dleafs[0] ) ); + + // leaffaces + swapBlock( (int *)&m_dleafsurfaces[0], m_numleafsurfaces * sizeof( m_dleafsurfaces[0] ) ); + + // leafbrushes + swapBlock( (int *)&m_dleafbrushes[0], m_numleafbrushes * sizeof( m_dleafbrushes[0] ) ); + + // brushes + swapBlock( (int *)&m_dbrushes[0], m_numbrushes * sizeof( m_dbrushes[0] ) ); + + // brushsides + swapBlock( (int *)&m_dbrushsides[0], m_numbrushsides * sizeof( m_dbrushsides[0] ) ); + + // vis + ((int *)&m_visBytes)[0] = isLittleLong( ((int *)&m_visBytes)[0] ); + ((int *)&m_visBytes)[1] = isLittleLong( ((int *)&m_visBytes)[1] ); + + + // drawindexes + swapBlock( (int *)&m_drawIndexes[0], m_numDrawIndexes * sizeof( m_drawIndexes[0] ) ); + + // drawsurfs + swapBlock( (int *)&m_drawSurfaces[0], m_numDrawSurfaces * sizeof( m_drawSurfaces[0] ) ); + +} + + + + + +bool BspLoader::findVectorByName(float* outvec,const char* name) +{ + const char *cl; + BSPVector3 origin; + + bool found = false; + + parseEntities(); + + for ( int i = 1; i < m_num_entities; i++ ) { + cl = getValueForKey (&m_entities[i], "classname"); + if ( !strcmp( cl, "info_player_start" ) ) { + getVectorForKey( &m_entities[i], "origin", origin ); + found = true; + break; + } + if ( !strcmp( cl, "info_player_deathmatch" ) ) { + getVectorForKey( &m_entities[i], "origin", origin ); + found = true; + break; + } + } + + if (found) + { + outvec[0] = origin[0]; + outvec[1] = origin[1]; + outvec[2] = origin[2]; + } + return found; +} + + + +const BSPEntity * BspLoader::getEntityByValue( const char* name, const char* value) +{ + const BSPEntity* entity = NULL; + + for ( int i = 1; i < m_num_entities; i++ ) { + + const BSPEntity& ent = m_entities[i]; + + const char* cl = getValueForKey (&m_entities[i], name); + if ( !strcmp( cl, value ) ) { + entity = &ent; + break; + } + } + return entity; +} + diff --git a/BulletPhysics/bulletTrunk/Demos/BspDemo/BspLoader.h b/BulletPhysics/bulletTrunk/Demos/BspDemo/BspLoader.h new file mode 100644 index 00000000..b7fc302d --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/BspDemo/BspLoader.h @@ -0,0 +1,295 @@ +/* +=========================================================================== +Copyright (C) 1999-2005 Id Software, Inc. + +This file is part of Quake III Arena source code. + +Quake III Arena source code is free software; you can redistribute it +and/or modify it under the terms of the GNU bteral Public License as +published by the Free Software Foundation; either version 2 of the License, +or (at your option) any later version. + +Quake III Arena source code is distributed in the hope that it will be +useful, but WITHOUT ANY WARRANTY; without even the implied warranty of +MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +GNU bteral Public License for more details. + +You should have received a copy of the GNU bteral Public License +along with Foobar; if not, write to the Free Software +Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA +=========================================================================== +*/ + + + +#ifndef BSP_LOADER_H +#define BSP_LOADER_H + +#include "LinearMath/btAlignedObjectArray.h" + +#define BSPMAXTOKEN 1024 +#define BSPMAX_KEY 32 +#define BSPMAX_VALUE 1024 +#define BSPCONTENTS_SOLID 1 +#define BSPCONTENTS_AREAPORTAL 0x8000 +#define BSPLUMP_ENTITIES 0 +#define BSPLUMP_SHADERS 1 +#define BSPLUMP_PLANES 2 +#define BSPLUMP_NODES 3 +#define BSPLUMP_LEAFS 4 +#define BSPLUMP_LEAFSURFACES 5 +#define BSPLUMP_LEAFBRUSHES 6 +#define LUMP_MODELS 7 +#define LUMP_BRUSHES 8 +#define LUMP_BRUSHSIDES 9 +#define LUMP_DRAWVERTS 10 +#define LUMP_DRAWINDEXES 11 +#define LUMP_SURFACES 13 +#define LUMP_LIGHTMAPS 14 +#define LUMP_LIGHTGRID 15 +#define LUMP_VISIBILITY 16 +#define HEADER_LUMPS 17 +#define MAX_QPATH 64 + + + +typedef struct { + int fileofs, filelen; +} BSPLump; + +typedef float BSPVector3[3]; + +typedef struct { + int ident; + int version; + + BSPLump lumps[HEADER_LUMPS]; +} BSPHeader; + + +typedef struct { + float mins[3], maxs[3]; + int firstSurface, numSurfaces; + int firstBrush, numBrushes; +} BSPModel; + +typedef struct { + char shader[MAX_QPATH]; + int surfaceFlags; + int contentFlags; +} BSPShader; + +typedef struct { + float normal[3]; + float dist; +} BSPPlane; + +typedef struct { + int planeNum; + int children[2]; + int mins[3]; + int maxs[3]; +} BSPNode; + +typedef struct { + int cluster; + int area; + + int mins[3]; + int maxs[3]; + + int firstLeafSurface; + int numLeafSurfaces; + + int firstLeafBrush; + int numLeafBrushes; +} BSPLeaf; + +typedef struct { + int planeNum; + int shaderNum; +} BSPBrushSide; + +typedef struct { + int firstSide; + int numSides; + int shaderNum; +} BSPBrush; + + + + +typedef struct BSPPair { + struct BSPPair *next; + char *key; + char *value; +} BSPKeyValuePair; + +typedef struct { + BSPVector3 origin; + struct bspbrush_s *brushes; + struct parseMesh_s *patches; + int firstDrawSurf; + BSPKeyValuePair *epairs; +} BSPEntity; + +typedef enum { + MST_BAD, + MST_PLANAR, + MST_PATCH, + MST_TRIANGLE_SOUP, + MST_FLARE +} BSPMapSurface; + +typedef struct { + int shaderNum; + int fogNum; + int surfaceType; + + int firstVert; + int numVerts; + + int firstIndex; + int numIndexes; + + int lightmapNum; + int lightmapX, lightmapY; + int lightmapWidth, lightmapHeight; + + BSPVector3 lightmapOrigin; + BSPVector3 lightmapVecs[3]; + + int patchWidth; + int patchHeight; +} BSPSurface; + + + +///GPL code from IdSofware to parse a Quake 3 BSP file +///check that your platform define __BIG_ENDIAN__ correctly (in BspLoader.cpp) +class BspLoader +{ + int m_Endianness; + + public: + + BspLoader(); + + bool loadBSPFile( void* memoryBuffer); + + const char* getValueForKey( const BSPEntity *ent, const char *key ) const; + + bool getVectorForKey( const BSPEntity *ent, const char *key, BSPVector3 vec ); + + float getFloatForKey( const BSPEntity *ent, const char *key ); + + void parseEntities( void ); + + bool findVectorByName(float* outvec,const char* name); + + const BSPEntity * getEntityByValue( const char* name, const char* value); + + + protected: + + void parseFromMemory (char *buffer, int size); + + + + bool isEndOfScript (bool crossline); + + bool getToken (bool crossline); + + char *copystring(const char *s); + + void stripTrailing( char *e ); + + BSPKeyValuePair * parseEpair( void ); + + bool parseEntity( void ); + + short isLittleShort (short l); + int isLittleLong (int l); + float isLittleFloat (float l); + + int isBigLong (int l); + short isBigShort (short l); + float isBigFloat (float l); + + void swapBlock( int *block, int sizeOfBlock ); + + int copyLump( BSPHeader *header, int lump, void *dest, int size ); + + void swapBSPFile( void ); + + + + + public: //easier for conversion + int m_num_entities; + btAlignedObjectArray m_entities; + + int m_nummodels; + btAlignedObjectArray m_dmodels; + + int m_numShaders; + btAlignedObjectArray m_dshaders; + + int m_entdatasize; + btAlignedObjectArray m_dentdata; + + int m_numleafs; + btAlignedObjectArray m_dleafs; + + int m_numplanes; + btAlignedObjectArray m_dplanes; + + int m_numnodes; + btAlignedObjectArray m_dnodes; + + int m_numleafsurfaces; + btAlignedObjectArray m_dleafsurfaces; + + int m_numleafbrushes; + btAlignedObjectArray m_dleafbrushes; + + int m_numbrushes; + btAlignedObjectArray m_dbrushes; + + int m_numbrushsides; + btAlignedObjectArray m_dbrushsides; + + int m_numLightBytes; + btAlignedObjectArray m_lightBytes; + + int m_numGridPoints; + btAlignedObjectArray m_gridData; + + int m_numVisBytes; + btAlignedObjectArray m_visBytes; + + + int m_numDrawIndexes; + btAlignedObjectArray m_drawIndexes; + + int m_numDrawSurfaces; + btAlignedObjectArray m_drawSurfaces; + + enum + { + BSP_LITTLE_ENDIAN = 0, + BSP_BIG_ENDIAN = 1 + }; + + //returns machines big endian / little endian + // + int getMachineEndianness(); + + inline int machineEndianness() + { + return m_Endianness; + } + +}; + +#endif //BSP_LOADER_H diff --git a/BulletPhysics/bulletTrunk/Demos/BspDemo/CMakeLists.txt b/BulletPhysics/bulletTrunk/Demos/BspDemo/CMakeLists.txt new file mode 100644 index 00000000..96781034 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/BspDemo/CMakeLists.txt @@ -0,0 +1,26 @@ +# This is basically the overall name of the project in Visual Studio this is the name of the Solution File + + +# For every executable you have with a main method you should have an add_executable line below. +# For every add executable line you should list every .cpp and .h file you have associated with that executable. + + +# You shouldn't have to modify anything below this line +######################################################## + + +INCLUDE_DIRECTORIES( +${BULLET_PHYSICS_SOURCE_DIR}/src ${BULLET_PHYSICS_SOURCE_DIR}/Demos/OpenGL } +) + +LINK_LIBRARIES( + OpenGLSupport BulletDynamics BulletCollision LinearMath ${GLUT_glut_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} +) + +ADD_EXECUTABLE(AppBspPhysicsDemo + main.cpp + BspDemo.cpp + BspLoader.cpp + BspConverter.cpp +) + diff --git a/BulletPhysics/bulletTrunk/Demos/BspDemo/Jamfile b/BulletPhysics/bulletTrunk/Demos/BspDemo/Jamfile new file mode 100644 index 00000000..f97d788c --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/BspDemo/Jamfile @@ -0,0 +1,3 @@ +SubDir TOP Demos BspDemo ; + +BulletDemo BspDemo : [ Wildcard *.h *.cpp ] ; diff --git a/BulletPhysics/bulletTrunk/Demos/BspDemo/main.cpp b/BulletPhysics/bulletTrunk/Demos/BspDemo/main.cpp new file mode 100644 index 00000000..e957fa1c --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/BspDemo/main.cpp @@ -0,0 +1,59 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2007 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + + +#include "BspDemo.h" +#include "GlutStuff.h" +#include "GLDebugDrawer.h" +#include "btBulletDynamicsCommon.h" + +char* makeExeToBspFilename(const char* lpCmdLine); +char* getLastFileName(); + + +int main(int argc,char** argv) +{ + + BspDemo* bspDemo = new BspDemo(); + + const char* bspfilename = "BspDemo.bsp"; + + printf("argc=%i\n",argc); + { + for (int i=0;i1) + { + bspfilename = argv[1]; + } + + GLDebugDrawer gDebugDrawer; + + // Enrico: TODO: Should change parameter type of initPhysics() to std::string or at least const char * + bspDemo->initPhysics((char*)bspfilename); + + bspDemo->getDynamicsWorld()->setDebugDrawer(&gDebugDrawer); + + + + return glutmain(argc, argv,640,480,"Bullet Quake BSP Physics Viewer http://bulletphysics.org",bspDemo); +} + diff --git a/BulletPhysics/bulletTrunk/Demos/BulletDinoDemo/BulletDino.c b/BulletPhysics/bulletTrunk/Demos/BulletDinoDemo/BulletDino.c new file mode 100644 index 00000000..146f28d2 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/BulletDinoDemo/BulletDino.c @@ -0,0 +1,996 @@ + +/* This demo has been modified to use the Bullet C-API. + The C-API is minimal, and will develop based on developer feedback. + The C++ API is recommended, and compatible with the C-API. +*/ + +/* Copyright (c) Mark J. Kilgard, 1994, 1997. */ + +/* This program is freely distributable without licensing fees + and is provided without guarantee or warrantee expressed or + implied. This program is -not- in the public domain. */ + +/* Example for PC game developers to show how to *combine* texturing, + reflections, and projected shadows all in real-time with OpenGL. + Robust reflections use stenciling. Robust projected shadows + use both stenciling and polygon offset. PC game programmers + should realize that neither stenciling nor polygon offset are + supported by Direct3D, so these real-time rendering algorithms + are only really viable with OpenGL. + + The program has modes for disabling the stenciling and polygon + offset uses. It is worth running this example with these features + toggled off so you can see the sort of artifacts that result. + + Notice that the floor texturing, reflections, and shadowing + all co-exist properly. */ + +/* When you run this program: Left mouse button controls the + view. Middle mouse button controls light position (left & + right rotates light around dino; up & down moves light + position up and down). Right mouse button pops up menu. */ + +/* Check out the comments in the "redraw" routine to see how the + reflection blending and surface stenciling is done. You can + also see in "redraw" how the projected shadows are rendered, + including the use of stenciling and polygon offset. */ + +/* This program is derived from glutdino.c */ + +/* Compile: cc -o dinoshade dinoshade.c -lglut -lGLU -lGL -lXmu -lXext -lX11 -lm */ + +#include +#include +#include +#include /* for cos(), sin(), and sqrt() */ +#ifdef WIN32//for glut.h +#include +#endif + +#ifndef WIN32 +#ifndef CALLBACK +#define CALLBACK +#endif +#endif + +//think different +#if defined(__APPLE__) && !defined (VMDMESA) +#include +#include +#include +#define GLVOIDPTR GLvoid(*)() +#else +#include +#include +#define GLVOIDPTR void(CALLBACK*)() +#endif + +/* Some files do not define M_PI... */ +#ifndef M_PI +#define M_PI 3.14159265 +#endif + + +//#include "../../include/Bullet-C-Api.h" +#include "Bullet-C-Api.h" + + + +plPhysicsSdkHandle physicsSdk=0; +plDynamicsWorldHandle dynamicsWorld=0; +plRigidBodyHandle floorRigidBody; +plRigidBodyHandle dinoRigidBody; + +/* Variable controlling various rendering modes. */ +static int stencilReflection = 1, stencilShadow = 1, offsetShadow = 1; +static int renderShadow = 1, renderDinosaur = 1, renderReflection = 1; +static int linearFiltering = 0, useMipmaps = 0, useTexture = 1; +static int reportSpeed = 0; +static int animation = 1; +static GLboolean lightSwitch = GL_TRUE; +static int directionalLight = 1; +static int forceExtension = 0; + +/* Time varying or user-controled variables. */ +static float jump = 0.0; +static float lightAngle = 0.0, lightHeight = 20; +GLfloat angle = -150; /* in degrees */ +GLfloat angle2 = 30; /* in degrees */ + +int moving, startx, starty; +int lightMoving = 0, lightStartX, lightStartY; + +enum { + MISSING, EXTENSION, ONE_DOT_ONE +}; +int polygonOffsetVersion; + +static GLdouble bodyWidth = 3.0; +/* *INDENT-OFF* */ +static GLfloat body[][2] = { {0, 3}, {1, 1}, {5, 1}, {8, 4}, {10, 4}, {11, 5}, + {11, 11.5}, {13, 12}, {13, 13}, {10, 13.5}, {13, 14}, {13, 15}, {11, 16}, + {8, 16}, {7, 15}, {7, 13}, {8, 12}, {7, 11}, {6, 6}, {4, 3}, {3, 2}, + {1, 2} }; +static GLfloat arm[][2] = { {8, 10}, {9, 9}, {10, 9}, {13, 8}, {14, 9}, {16, 9}, + {15, 9.5}, {16, 10}, {15, 10}, {15.5, 11}, {14.5, 10}, {14, 11}, {14, 10}, + {13, 9}, {11, 11}, {9, 11} }; +static GLfloat leg[][2] = { {8, 6}, {8, 4}, {9, 3}, {9, 2}, {8, 1}, {8, 0.5}, {9, 0}, + {12, 0}, {10, 1}, {10, 2}, {12, 4}, {11, 6}, {10, 7}, {9, 7} }; +static GLfloat eye[][2] = { {8.75, 15}, {9, 14.7}, {9.6, 14.7}, {10.1, 15}, + {9.6, 15.25}, {9, 15.25} }; +static GLfloat lightPosition[4]; +static GLfloat lightColor[] = {0.8, 1.0, 0.8, 1.0}; /* green-tinted */ +static GLfloat skinColor[] = {0.1, 1.0, 0.1, 1.0}, eyeColor[] = {1.0, 0.2, 0.2, 1.0}; +/* *INDENT-ON* */ + +/* Nice floor texture tiling pattern. */ +static char *circles[] = { + "....xxxx........", + "..xxxxxxxx......", + ".xxxxxxxxxx.....", + ".xxx....xxx.....", + "xxx......xxx....", + "xxx......xxx....", + "xxx......xxx....", + "xxx......xxx....", + ".xxx....xxx.....", + ".xxxxxxxxxx.....", + "..xxxxxxxx......", + "....xxxx........", + "................", + "................", + "................", + "................", +}; + +static void +makeFloorTexture(void) +{ + GLubyte floorTexture[16][16][3]; + GLubyte *loc; + int s, t; + loc=0; + + /* Setup RGB image for the texture. */ + loc = (GLubyte*) floorTexture; + for (t = 0; t < 16; t++) { + for (s = 0; s < 16; s++) { + if (circles[t][s] == 'x') { + /* Nice green. */ + loc[0] = 0x1f; + loc[1] = 0x8f; + loc[2] = 0x1f; + } else { + /* Light gray. */ + loc[0] = 0xaa; + loc[1] = 0xaa; + loc[2] = 0xaa; + } + loc += 3; + } + } + + glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + + if (useMipmaps) { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, + GL_LINEAR_MIPMAP_LINEAR); + gluBuild2DMipmaps(GL_TEXTURE_2D, 3, 16, 16, + GL_RGB, GL_UNSIGNED_BYTE, floorTexture); + } else { + if (linearFiltering) { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + } else { + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + } + glTexImage2D(GL_TEXTURE_2D, 0, 3, 16, 16, 0, + GL_RGB, GL_UNSIGNED_BYTE, floorTexture); + } +} + +enum { + X, Y, Z, W +}; +enum { + A, B, C, D +}; + +/* Create a matrix that will project the desired shadow. */ +void +shadowMatrix(GLfloat shadowMat[4][4], + GLfloat groundplane[4], + GLfloat lightpos[4]) +{ + GLfloat dot; + + /* Find dot product between light position vector and ground plane normal. */ + dot = groundplane[X] * lightpos[X] + + groundplane[Y] * lightpos[Y] + + groundplane[Z] * lightpos[Z] + + groundplane[W] * lightpos[W]; + + shadowMat[0][0] = dot - lightpos[X] * groundplane[X]; + shadowMat[1][0] = 0.f - lightpos[X] * groundplane[Y]; + shadowMat[2][0] = 0.f - lightpos[X] * groundplane[Z]; + shadowMat[3][0] = 0.f - lightpos[X] * groundplane[W]; + + shadowMat[X][1] = 0.f - lightpos[Y] * groundplane[X]; + shadowMat[1][1] = dot - lightpos[Y] * groundplane[Y]; + shadowMat[2][1] = 0.f - lightpos[Y] * groundplane[Z]; + shadowMat[3][1] = 0.f - lightpos[Y] * groundplane[W]; + + shadowMat[X][2] = 0.f - lightpos[Z] * groundplane[X]; + shadowMat[1][2] = 0.f - lightpos[Z] * groundplane[Y]; + shadowMat[2][2] = dot - lightpos[Z] * groundplane[Z]; + shadowMat[3][2] = 0.f - lightpos[Z] * groundplane[W]; + + shadowMat[X][3] = 0.f - lightpos[W] * groundplane[X]; + shadowMat[1][3] = 0.f - lightpos[W] * groundplane[Y]; + shadowMat[2][3] = 0.f - lightpos[W] * groundplane[Z]; + shadowMat[3][3] = dot - lightpos[W] * groundplane[W]; + +} + +/* Find the plane equation given 3 points. */ +void +findPlane(GLfloat plane[4], + GLfloat v0[3], GLfloat v1[3], GLfloat v2[3]) +{ + GLfloat vec0[3], vec1[3]; + + /* Need 2 vectors to find cross product. */ + vec0[X] = v1[X] - v0[X]; + vec0[Y] = v1[Y] - v0[Y]; + vec0[Z] = v1[Z] - v0[Z]; + + vec1[X] = v2[X] - v0[X]; + vec1[Y] = v2[Y] - v0[Y]; + vec1[Z] = v2[Z] - v0[Z]; + + /* find cross product to get A, B, and C of plane equation */ + plane[A] = vec0[Y] * vec1[Z] - vec0[Z] * vec1[Y]; + plane[B] = -(vec0[X] * vec1[Z] - vec0[Z] * vec1[X]); + plane[C] = vec0[X] * vec1[Y] - vec0[Y] * vec1[X]; + + plane[D] = -(plane[A] * v0[X] + plane[B] * v0[Y] + plane[C] * v0[Z]); +} + +void +extrudeSolidFromPolygon(GLfloat data[][2], unsigned int dataSize, + GLdouble thickness, GLuint side, GLuint edge, GLuint whole) +{ + static GLUtriangulatorObj *tobj = NULL; + GLdouble vertex[3], dx, dy, len; + int i; + int count = dataSize / (2 * sizeof(GLfloat)); + + if (tobj == NULL) { + tobj = gluNewTess(); /* create and initialize a GLU + polygon * * tesselation object */ + gluTessCallback(tobj, (GLenum)GLU_BEGIN, (GLVOIDPTR)glBegin); + gluTessCallback(tobj, (GLenum)GLU_VERTEX, (GLVOIDPTR)glVertex2fv); /* semi-tricky */ + gluTessCallback(tobj, (GLenum)GLU_END, (GLVOIDPTR)glEnd); + } + glNewList(side, GL_COMPILE); + glShadeModel(GL_SMOOTH); /* smooth minimizes seeing + tessellation */ + gluBeginPolygon(tobj); + for (i = 0; i < count; i++) { + vertex[0] = data[i][0]; + vertex[1] = data[i][1]; + vertex[2] = 0; + gluTessVertex(tobj, vertex, data[i]); + } + gluEndPolygon(tobj); + glEndList(); + glNewList(edge, GL_COMPILE); + glShadeModel(GL_FLAT); /* flat shade keeps angular hands + from being "smoothed" */ + glBegin(GL_QUAD_STRIP); + for (i = 0; i <= count; i++) { + /* mod function handles closing the edge */ + glVertex3f(data[i % count][0], data[i % count][1], 0.0); + glVertex3f(data[i % count][0], data[i % count][1], thickness); + /* Calculate a unit normal by dividing by Euclidean + distance. We * could be lazy and use + glEnable(GL_NORMALIZE) so we could pass in * arbitrary + normals for a very slight performance hit. */ + dx = data[(i + 1) % count][1] - data[i % count][1]; + dy = data[i % count][0] - data[(i + 1) % count][0]; + len = sqrt(dx * dx + dy * dy); + glNormal3f(dx / len, dy / len, 0.0); + } + glEnd(); + glEndList(); + glNewList(whole, GL_COMPILE); + glFrontFace(GL_CW); + glCallList(edge); + glNormal3f(0.0, 0.0, -1.0); /* constant normal for side */ + glCallList(side); + glPushMatrix(); + glTranslatef(0.0, 0.0, thickness); + glFrontFace(GL_CCW); + glNormal3f(0.0, 0.0, 1.0); /* opposite normal for other side */ + glCallList(side); + glPopMatrix(); + glEndList(); +} + +/* Enumerants for refering to display lists. */ +typedef enum { + RESERVED, BODY_SIDE, BODY_EDGE, BODY_WHOLE, ARM_SIDE, ARM_EDGE, ARM_WHOLE, + LEG_SIDE, LEG_EDGE, LEG_WHOLE, EYE_SIDE, EYE_EDGE, EYE_WHOLE +} displayLists; + +static void +makeDinosaur(void) +{ + extrudeSolidFromPolygon(body, sizeof(body), bodyWidth, + BODY_SIDE, BODY_EDGE, BODY_WHOLE); + extrudeSolidFromPolygon(arm, sizeof(arm), bodyWidth / 4, + ARM_SIDE, ARM_EDGE, ARM_WHOLE); + extrudeSolidFromPolygon(leg, sizeof(leg), bodyWidth / 2, + LEG_SIDE, LEG_EDGE, LEG_WHOLE); + extrudeSolidFromPolygon(eye, sizeof(eye), bodyWidth + 0.2, + EYE_SIDE, EYE_EDGE, EYE_WHOLE); +} + +static void +drawDinosaur(void) + +{ + plReal matrix[16]; + + glPushMatrix(); + /* Translate the dinosaur to be at (0,8,0). */ + + plGetOpenGLMatrix(dinoRigidBody,matrix); +// plGetPosition(dinoRigidBody,dinoWorldPos); + // glTranslatef(-8, 0, -bodyWidth / 2); + //glTranslatef(0.0, jump, 0.0); +// glTranslatef(dinoWorldPos[0],dinoWorldPos[1],dinoWorldPos[2]); + +#ifdef BT_USE_DOUBLE_PRECISION + glMultMatrixd(matrix); +#else + glMultMatrixf(matrix); +#endif +// glutSolidCube(15); + glTranslatef(-8.5, -8.5, 0); + + glMaterialfv(GL_FRONT, GL_DIFFUSE, skinColor); + glCallList(BODY_WHOLE); + glTranslatef(0.0, 0.0, bodyWidth); + glCallList(ARM_WHOLE); + glCallList(LEG_WHOLE); + glTranslatef(0.0, 0.0, -bodyWidth - bodyWidth / 4); + glCallList(ARM_WHOLE); + glTranslatef(0.0, 0.0, -bodyWidth / 4); + glCallList(LEG_WHOLE); + glTranslatef(0.0, 0.0, bodyWidth / 2 - 0.1); + glMaterialfv(GL_FRONT, GL_DIFFUSE, eyeColor); + glCallList(EYE_WHOLE); + + + glPopMatrix(); +} + +static GLfloat floorVertices[4][3] = { + { -20.0, 0.0, 20.0 }, + { 20.0, 0.0, 20.0 }, + { 20.0, 0.0, -20.0 }, + { -20.0, 0.0, -20.0 }, +}; + +/* Draw a floor (possibly textured). */ +static void +drawFloor(void) +{ + glDisable(GL_LIGHTING); + + if (useTexture) { + glEnable(GL_TEXTURE_2D); + } + + glBegin(GL_QUADS); + glTexCoord2f(0.0, 0.0); + glVertex3fv(floorVertices[0]); + glTexCoord2f(0.0, 16.0); + glVertex3fv(floorVertices[1]); + glTexCoord2f(16.0, 16.0); + glVertex3fv(floorVertices[2]); + glTexCoord2f(16.0, 0.0); + glVertex3fv(floorVertices[3]); + glEnd(); + + if (useTexture) { + glDisable(GL_TEXTURE_2D); + } + + glEnable(GL_LIGHTING); +} + +static GLfloat floorPlane[4]; +static GLfloat floorShadow[4][4]; + +static void +redraw(void) +{ + int start = 0, end = 0 ; + + if (reportSpeed) { + start = glutGet(GLUT_ELAPSED_TIME); + } + + /* Clear; default stencil clears to zero. */ + if ((stencilReflection && renderReflection) || (stencilShadow && renderShadow)) { + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT | GL_STENCIL_BUFFER_BIT); + } else { + /* Avoid clearing stencil when not using it. */ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + } + + /* Reposition the light source. */ + lightPosition[0] = 12*cos(lightAngle); + lightPosition[1] = lightHeight; + lightPosition[2] = 12*sin(lightAngle); + if (directionalLight) { + lightPosition[3] = 0.0; + } else { + lightPosition[3] = 1.0; + } + + shadowMatrix(floorShadow, floorPlane, lightPosition); + + glPushMatrix(); + /* Perform scene rotations based on user mouse input. */ + glRotatef(angle2, 1.0, 0.0, 0.0); + glRotatef(angle, 0.0, 1.0, 0.0); + + /* Tell GL new light source position. */ + glLightfv(GL_LIGHT0, GL_POSITION, lightPosition); + + if (renderReflection) { + if (stencilReflection) { + /* We can eliminate the visual "artifact" of seeing the "flipped" + dinosaur underneath the floor by using stencil. The idea is + draw the floor without color or depth update but so that + a stencil value of one is where the floor will be. Later when + rendering the dinosaur reflection, we will only update pixels + with a stencil value of 1 to make sure the reflection only + lives on the floor, not below the floor. */ + + /* Don't update color or depth. */ + glDisable(GL_DEPTH_TEST); + glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); + + /* Draw 1 into the stencil buffer. */ + glEnable(GL_STENCIL_TEST); + glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE); + glStencilFunc(GL_ALWAYS, 1, 0xffffffff); + + /* Now render floor; floor pixels just get their stencil set to 1. */ + drawFloor(); + + /* Re-enable update of color and depth. */ + glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE); + glEnable(GL_DEPTH_TEST); + + /* Now, only render where stencil is set to 1. */ + glStencilFunc(GL_EQUAL, 1, 0xffffffff); /* draw if ==1 */ + glStencilOp(GL_KEEP, GL_KEEP, GL_KEEP); + } + + glPushMatrix(); + + /* The critical reflection step: Reflect dinosaur through the floor + (the Y=0 plane) to make a relection. */ + glScalef(1.0, -1.0, 1.0); + + /* Reflect the light position. */ + glLightfv(GL_LIGHT0, GL_POSITION, lightPosition); + + /* To avoid our normals getting reversed and hence botched lighting + on the reflection, turn on normalize. */ + glEnable(GL_NORMALIZE); + glCullFace(GL_FRONT); + + /* Draw the reflected dinosaur. */ + drawDinosaur(); + + /* Disable noramlize again and re-enable back face culling. */ + glDisable(GL_NORMALIZE); + glCullFace(GL_BACK); + + glPopMatrix(); + + /* Switch back to the unreflected light position. */ + glLightfv(GL_LIGHT0, GL_POSITION, lightPosition); + + if (stencilReflection) { + glDisable(GL_STENCIL_TEST); + } + } + + /* Back face culling will get used to only draw either the top or the + bottom floor. This let's us get a floor with two distinct + appearances. The top floor surface is reflective and kind of red. + The bottom floor surface is not reflective and blue. */ + + /* Draw "bottom" of floor in blue. */ + glFrontFace(GL_CW); /* Switch face orientation. */ + glColor4f(0.1, 0.1, 0.7, 1.0); + drawFloor(); + glFrontFace(GL_CCW); + + if (renderShadow) { + if (stencilShadow) { + /* Draw the floor with stencil value 3. This helps us only + draw the shadow once per floor pixel (and only on the + floor pixels). */ + glEnable(GL_STENCIL_TEST); + glStencilFunc(GL_ALWAYS, 3, 0xffffffff); + glStencilOp(GL_KEEP, GL_KEEP, GL_REPLACE); + } + } + + /* Draw "top" of floor. Use blending to blend in reflection. */ + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glColor4f(0.7, 0.0, 0.0, 0.3); + glColor4f(1.0, 1.0, 1.0, 0.3); + drawFloor(); + glDisable(GL_BLEND); + + if (renderDinosaur) { + /* Draw "actual" dinosaur, not its reflection. */ + drawDinosaur(); + } + + if (renderShadow) { + + /* Render the projected shadow. */ + + if (stencilShadow) { + + /* Now, only render where stencil is set above 2 (ie, 3 where + the top floor is). Update stencil with 2 where the shadow + gets drawn so we don't redraw (and accidently reblend) the + shadow). */ + glStencilFunc(GL_LESS, 2, 0xffffffff); /* draw if ==1 */ + glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE); + } + + /* To eliminate depth buffer artifacts, we use polygon offset + to raise the depth of the projected shadow slightly so + that it does not depth buffer alias with the floor. */ + if (offsetShadow) { + switch (polygonOffsetVersion) { + case EXTENSION: +#ifdef GL_VERSION_1_1 + case ONE_DOT_ONE: + glEnable(GL_POLYGON_OFFSET_FILL); + break; +#endif + case MISSING: + /* Oh well. */ + break; + } + } + + /* Render 50% black shadow color on top of whatever the + floor appareance is. */ + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glDisable(GL_LIGHTING); /* Force the 50% black. */ + glColor4f(0.0, 0.0, 0.0, 0.5); + + glPushMatrix(); + /* Project the shadow. */ + glMultMatrixf((GLfloat *) floorShadow); + drawDinosaur(); + glPopMatrix(); + + glDisable(GL_BLEND); + glEnable(GL_LIGHTING); + + if (offsetShadow) { + switch (polygonOffsetVersion) { +#ifdef GL_VERSION_1_1 + case ONE_DOT_ONE: + glDisable(GL_POLYGON_OFFSET_FILL); + break; +#endif + case MISSING: + /* Oh well. */ + break; + } + } + if (stencilShadow) { + glDisable(GL_STENCIL_TEST); + } + } + + glPushMatrix(); + glDisable(GL_LIGHTING); + glColor3f(1.0, 1.0, 0.0); + if (directionalLight) { + /* Draw an arrowhead. */ + glDisable(GL_CULL_FACE); + glTranslatef(lightPosition[0], lightPosition[1], lightPosition[2]); + glRotatef(lightAngle * -180.0 / M_PI, 0, 1, 0); + glRotatef(atan(lightHeight/12) * 180.0 / M_PI, 0, 0, 1); + glBegin(GL_TRIANGLE_FAN); + glVertex3f(0, 0, 0); + glVertex3f(2, 1, 1); + glVertex3f(2, -1, 1); + glVertex3f(2, -1, -1); + glVertex3f(2, 1, -1); + glVertex3f(2, 1, 1); + glEnd(); + /* Draw a white line from light direction. */ + glColor3f(1.0, 1.0, 1.0); + glBegin(GL_LINES); + glVertex3f(0, 0, 0); + glVertex3f(5, 0, 0); + glEnd(); + glEnable(GL_CULL_FACE); + } else { + /* Draw a yellow ball at the light source. */ + glTranslatef(lightPosition[0], lightPosition[1], lightPosition[2]); + glutSolidSphere(1.0, 5, 5); + } + glEnable(GL_LIGHTING); + glPopMatrix(); + + glPopMatrix(); + + if (reportSpeed) { + glFinish(); + end = glutGet(GLUT_ELAPSED_TIME); + printf("Speed %.3g frames/sec (%d ms)\n", 1000.0/(end-start), end-start); + } + + glutSwapBuffers(); +} + +/* ARGSUSED2 */ +static void +mouse(int button, int state, int x, int y) +{ + if (button == GLUT_LEFT_BUTTON) { + if (state == GLUT_DOWN) { + moving = 1; + startx = x; + starty = y; + } + if (state == GLUT_UP) { + moving = 0; + } + } + if (button == GLUT_MIDDLE_BUTTON) { + if (state == GLUT_DOWN) { + lightMoving = 1; + lightStartX = x; + lightStartY = y; + } + if (state == GLUT_UP) { + lightMoving = 0; + } + } +} + +/* ARGSUSED1 */ +static void +motion(int x, int y) +{ + if (moving) { + angle = angle + (x - startx); + angle2 = angle2 + (y - starty); + startx = x; + starty = y; + glutPostRedisplay(); + } + if (0){//lightMoving) { + lightAngle += (x - lightStartX)/40.0; + lightHeight += (lightStartY - y)/20.0; + lightStartX = x; + lightStartY = y; + glutPostRedisplay(); + } +} + +/* Advance time varying state when idle callback registered. */ +static void +idle(void) +{ + static float time = 0.0; + static float prevtime = 0.0; + float dtime; + prevtime = time; + + time = glutGet(GLUT_ELAPSED_TIME) / 500.0; + dtime = time - prevtime; + + jump = 4.0 * fabs(sin(time)*0.5); + if (!lightMoving) { + lightAngle = time; + } + + if (dynamicsWorld) + plStepSimulation(dynamicsWorld,dtime); + + glutPostRedisplay(); +} + +enum { + M_NONE, M_MOTION, M_LIGHT, M_TEXTURE, M_SHADOWS, M_REFLECTION, M_DINOSAUR, + M_STENCIL_REFLECTION, M_STENCIL_SHADOW, M_OFFSET_SHADOW, + M_POSITIONAL, M_DIRECTIONAL, M_PERFORMANCE +}; + +static void +controlLights(int value) +{ + switch (value) { + case M_NONE: + return; + case M_MOTION: + animation = 1 - animation; + if (animation) { + glutIdleFunc(idle); + } else { + glutIdleFunc(NULL); + } + break; + case M_LIGHT: + lightSwitch = !lightSwitch; + if (lightSwitch) { + glEnable(GL_LIGHT0); + } else { + glDisable(GL_LIGHT0); + } + break; + case M_TEXTURE: + useTexture = !useTexture; + break; + case M_SHADOWS: + renderShadow = 1 - renderShadow; + break; + case M_REFLECTION: + renderReflection = 1 - renderReflection; + break; + case M_DINOSAUR: + renderDinosaur = 1 - renderDinosaur; + break; + case M_STENCIL_REFLECTION: + stencilReflection = 1 - stencilReflection; + break; + case M_STENCIL_SHADOW: + stencilShadow = 1 - stencilShadow; + break; + case M_OFFSET_SHADOW: + offsetShadow = 1 - offsetShadow; + break; + case M_POSITIONAL: + directionalLight = 0; + break; + case M_DIRECTIONAL: + directionalLight = 1; + break; + case M_PERFORMANCE: + reportSpeed = 1 - reportSpeed; + break; + } + glutPostRedisplay(); +} + +/* When not visible, stop animating. Restart when visible again. */ +static void +visible(int vis) +{ + if (vis == GLUT_VISIBLE) { + if (animation) + glutIdleFunc(idle); + } else { + if (!animation) + glutIdleFunc(NULL); + } +} + +/* Press any key to redraw; good when motion stopped and + performance reporting on. */ +/* ARGSUSED */ +static void +key(unsigned char c, int x, int y) +{ + if (c == 27) { + exit(0); /* IRIS GLism, Escape quits. */ + } + glutPostRedisplay(); +} + +/* Press any key to redraw; good when motion stopped and + performance reporting on. */ +/* ARGSUSED */ +static void +special(int k, int x, int y) +{ + glutPostRedisplay(); +} + +static int +supportsOneDotOne(void) +{ + const char *version; + int major, minor; + + version = (char *) glGetString(GL_VERSION); + if (sscanf(version, "%d.%d", &major, &minor) == 2) + return ((major > 1) || (major >= 1 && minor >= 1)); + return 0; /* OpenGL version string malformed! */ +} + + +int +main(int argc, char **argv) +{ + int i; + plCollisionShapeHandle floorShape; + plCollisionShapeHandle dinoShape,dinoChildShape; + plVector3 floorPos,childPos; + plVector3 dinoPos; + plQuaternion childOrn,dinoOrient; + + void* user_data=NULL; + + physicsSdk = plNewBulletSdk(); + dynamicsWorld = plCreateDynamicsWorld(physicsSdk); + + //create ground plane + + floorShape = plNewConvexHullShape(); + + for (i=0;i<4;i++) + { +// floorVertices + plAddVertex(floorShape,floorVertices[i][0],floorVertices[i][1],floorVertices[i][2]); + } + + + floorShape = plNewBoxShape(120,0,120); + + floorRigidBody = plCreateRigidBody(user_data,0.f,floorShape); + floorPos[0] = 0; + floorPos[1] = 0; + floorPos[2] = 0; + + plSetPosition(floorRigidBody,floorPos); + plAddRigidBody(dynamicsWorld,floorRigidBody); + + //create dino rigidbody + dinoChildShape = plNewBoxShape(8.5,8.5,8.5); + dinoShape = plNewCompoundShape(); + childPos[0] = 0; + childPos[1] = 0; + childPos[2] = 0; + childOrn[0] = 0; + childOrn[1] = 0; + childOrn[2] = 0; + childOrn[3] = 1; + + plAddChildShape(dinoShape,dinoChildShape,childPos,childOrn); + + dinoPos[0] = -10; dinoPos[1] = 28; dinoPos[2] = 0; + dinoRigidBody = plCreateRigidBody(0,1.0,dinoShape); + plSetPosition(dinoRigidBody,dinoPos); + plSetEuler(0,0,3.15*0.20,dinoOrient); + plSetOrientation(dinoRigidBody,dinoOrient); + + plAddRigidBody(dynamicsWorld,dinoRigidBody); + + printf("BulletDino\n"); + glutInit(&argc, argv); + + for (i=1; i=2 rgb double depth"); +#endif + + glutCreateWindow("Shadowy Leapin' Lizards"); + + if (glutGet(GLUT_WINDOW_STENCIL_SIZE) <= 1) { + printf("dinoshade: Sorry, I need at least 2 bits of stencil.\n"); + exit(1); + } + + /* Register GLUT callbacks. */ + glutDisplayFunc(redraw); + glutMouseFunc(mouse); + glutMotionFunc(motion); + glutVisibilityFunc(visible); + glutKeyboardFunc(key); + glutSpecialFunc(special); + + glutCreateMenu(controlLights); + + glutAddMenuEntry("Toggle motion", M_MOTION); + glutAddMenuEntry("-----------------------", M_NONE); + glutAddMenuEntry("Toggle light", M_LIGHT); + glutAddMenuEntry("Toggle texture", M_TEXTURE); + glutAddMenuEntry("Toggle shadows", M_SHADOWS); + glutAddMenuEntry("Toggle reflection", M_REFLECTION); + glutAddMenuEntry("Toggle dinosaur", M_DINOSAUR); + glutAddMenuEntry("-----------------------", M_NONE); + glutAddMenuEntry("Toggle reflection stenciling", M_STENCIL_REFLECTION); + glutAddMenuEntry("Toggle shadow stenciling", M_STENCIL_SHADOW); + glutAddMenuEntry("Toggle shadow offset", M_OFFSET_SHADOW); + glutAddMenuEntry("----------------------", M_NONE); + glutAddMenuEntry("Positional light", M_POSITIONAL); + glutAddMenuEntry("Directional light", M_DIRECTIONAL); + glutAddMenuEntry("-----------------------", M_NONE); + glutAddMenuEntry("Toggle performance", M_PERFORMANCE); + glutAttachMenu(GLUT_RIGHT_BUTTON); + makeDinosaur(); + +#ifdef GL_VERSION_1_1 + if (supportsOneDotOne() && !forceExtension) { + polygonOffsetVersion = ONE_DOT_ONE; + glPolygonOffset(-2.0, -1.0); + } else +#endif + { + { + polygonOffsetVersion = MISSING; + printf("\ndinoshine: Missing polygon offset.\n"); + printf(" Expect shadow depth aliasing artifacts.\n\n"); + } + } + + glEnable(GL_CULL_FACE); + glEnable(GL_DEPTH_TEST); + glEnable(GL_TEXTURE_2D); + glLineWidth(3.0); + + glMatrixMode(GL_PROJECTION); + gluPerspective( /* field of view in degree */ 40.0, + /* aspect ratio */ 1.0, + /* Z near */ 20.0, /* Z far */ 100.0); + glMatrixMode(GL_MODELVIEW); + gluLookAt(0.0, 8.0, 60.0, /* eye is at (0,0,30) */ + 0.0, 8.0, 0.0, /* center is at (0,0,0) */ + 0.0, 1.0, 0.); /* up is in postivie Y direction */ + + glLightModeli(GL_LIGHT_MODEL_LOCAL_VIEWER, 1); + glLightfv(GL_LIGHT0, GL_DIFFUSE, lightColor); + glLightf(GL_LIGHT0, GL_CONSTANT_ATTENUATION, 0.1); + glLightf(GL_LIGHT0, GL_LINEAR_ATTENUATION, 0.05); + glEnable(GL_LIGHT0); + glEnable(GL_LIGHTING); + + makeFloorTexture(); + + /* Setup floor plane for projected shadow calculations. */ + findPlane(floorPlane, floorVertices[1], floorVertices[2], floorVertices[3]); + + glutMainLoop(); + + plDeleteDynamicsWorld(dynamicsWorld); + plDeletePhysicsSdk(physicsSdk); + + + return 0; /* ANSI C requires main to return int. */ +} diff --git a/BulletPhysics/bulletTrunk/Demos/BulletDinoDemo/CMakeLists.txt b/BulletPhysics/bulletTrunk/Demos/BulletDinoDemo/CMakeLists.txt new file mode 100644 index 00000000..fa675a1a --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/BulletDinoDemo/CMakeLists.txt @@ -0,0 +1,61 @@ +# This is basically the overall name of the project in Visual Studio this is the name of the Solution File + + +# For every executable you have with a main method you should have an add_executable line below. +# For every add executable line you should list every .cpp and .h file you have associated with that executable. + + +# This is the variable for Windows. I use this to define the root of my directory structure. +SET(GLUT_ROOT ${BULLET_PHYSICS_SOURCE_DIR}/Glut) + +# You shouldn't have to modify anything below this line +######################################################## + + +# This is the shortcut to finding GLU, GLUT and OpenGL if they are properly installed on your system +# This should be the case. +INCLUDE (${CMAKE_ROOT}/Modules/FindGLU.cmake) +INCLUDE (${CMAKE_ROOT}/Modules/FindGLUT.cmake) +INCLUDE (${CMAKE_ROOT}/Modules/FindOpenGL.cmake) + + +IF (WIN32) + # This is the Windows code for which Opengl, and Glut are not properly installed + # since I can't install them I must cheat and copy libraries around + INCLUDE_DIRECTORIES(${GLUT_ROOT}) + # LINK_DIRECTORIES(${GLUT_ROOT}\\lib) + IF (${GLUT_glut_LIBRARY} MATCHES "GLUT_glut_LIBRARY-NOTFOUND") + SET(GLUT_glut_LIBRARY ${BULLET_PHYSICS_SOURCE_DIR}/Glut/glut32.lib) + # LINK_LIBRARIES(${GLUT_ROOT}\\lib\\glut32 ${OPENGL_gl_LIBRARY} ${OPENGL_glU_LIBRARY}) + # TARGET_LINK_LIBRARIES(table ${GLUT_ROOT}\\lib\\glut32) +# +# ADD_CUSTOM_COMMAND(TARGET table POST_BUILD COMMAND copy ${GLUT_ROOT}\\lib\\glut32.dll ${GLUT_ROOT}\\bin\\vs2005\\Debug +# COMMAND copy ${GLUT_ROOT}\\lib\\glut32.dll ${GLUT_ROOT}\\bin\\vs2003\\Debug +# COMMAND copy ${GLUT_ROOT}\\lib\\glut32.dll ${GLUT_ROOT}\\bin\\vs6\\Debug) + ELSE (${GLUT_glut_LIBRARY} MATCHES "GLUT_glut_LIBRARY-NOTFOUND") +# LINK_LIBRARIES(${GLUT_glut_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glU_LIBRARY}) +# TARGET_LINK_LIBRARIES(table ${GLUT_glut_LIBRARY}) + ENDIF(${GLUT_glut_LIBRARY} MATCHES "GLUT_glut_LIBRARY-NOTFOUND") +# TARGET_LINK_LIBRARIES(table ${OPENGL_gl_LIBRARY}) +# TARGET_LINK_LIBRARIES(table ${OPENGL_glu_LIBRARY}) +ELSE (WIN32) + # This is the lines for linux. This should always work if everything is installed and working fine. +# SET(CMAKE_BUILD_TYPE Debug) +# SET(CMAKE_CXX_FLAGS_DEBUG "-g") + INCLUDE_DIRECTORIES(/usr/include /usr/local/include ${GLUT_INCLUDE_DIR}) +# TARGET_LINK_LIBRARIES(table ${GLUT_glut_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glU_LIBRARY}) +# TARGET_LINK_LIBRARIES(checker ${GLUT_glut_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glU_LIBRARY}) +ENDIF (WIN32) + +INCLUDE_DIRECTORIES( +${BULLET_PHYSICS_SOURCE_DIR}/src ${BULLET_PHYSICS_SOURCE_DIR}/Demos/OpenGL } +) + +LINK_LIBRARIES( + LibOpenGLSupport LibBulletDynamics LibBulletCollision LibLinearMath ${GLUT_glut_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glU_LIBRARY} +) + +ADD_EXECUTABLE(BulletDino + BulletDino.c +) + diff --git a/BulletPhysics/bulletTrunk/Demos/BulletDinoDemo/Jamfile b/BulletPhysics/bulletTrunk/Demos/BulletDinoDemo/Jamfile new file mode 100644 index 00000000..7c39b2c9 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/BulletDinoDemo/Jamfile @@ -0,0 +1,3 @@ +SubDir TOP Demos BulletDinoDemo ; + +BulletDemo BulletDino : [ Wildcard *.h *.c ] ; diff --git a/BulletPhysics/bulletTrunk/Demos/CMakeLists.txt b/BulletPhysics/bulletTrunk/Demos/CMakeLists.txt new file mode 100644 index 00000000..cdf36bd9 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/CMakeLists.txt @@ -0,0 +1,12 @@ +if (CMAKE_SIZEOF_VOID_P MATCHES "8") +SUBDIRS( OpenGL AllBulletDemos ConvexDecompositionDemo Benchmarks HelloWorld +CcdPhysicsDemo ConstraintDemo SliderConstraintDemo GenericJointDemo +RagdollDemo ForkLiftDemo BasicDemo BspDemo MovingConcaveDemo VehicleDemo +ColladaDemo UserCollisionAlgorithm CharacterDemo SoftDemo HeightFieldFluidDemo) +else (CMAKE_SIZEOF_VOID_P MATCHES "8") +SUBDIRS( OpenGL AllBulletDemos ConvexDecompositionDemo Benchmarks HelloWorld +MultiThreadedDemo CcdPhysicsDemo ConstraintDemo SliderConstraintDemo +GenericJointDemo RagdollDemo ForkLiftDemo BasicDemo BspDemo MovingConcaveDemo +VehicleDemo ColladaDemo UserCollisionAlgorithm CharacterDemo SoftDemo + HeightFieldFluidDemo) +endif (CMAKE_SIZEOF_VOID_P MATCHES "8") diff --git a/BulletPhysics/bulletTrunk/Demos/CcdPhysicsDemo/CMakeLists.txt b/BulletPhysics/bulletTrunk/Demos/CcdPhysicsDemo/CMakeLists.txt new file mode 100644 index 00000000..36dad7bc --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/CcdPhysicsDemo/CMakeLists.txt @@ -0,0 +1,26 @@ +# This is basically the overall name of the project in Visual Studio this is the name of the Solution File + + +# For every executable you have with a main method you should have an add_executable line below. +# For every add executable line you should list every .cpp and .h file you have associated with that executable. + + + +# You shouldn't have to modify anything below this line +######################################################## + + + +INCLUDE_DIRECTORIES( +${BULLET_PHYSICS_SOURCE_DIR}/src ${BULLET_PHYSICS_SOURCE_DIR}/Demos/OpenGL } +) + +LINK_LIBRARIES( +OpenGLSupport BulletDynamics BulletCollision LinearMath ${GLUT_glut_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} +) + +ADD_EXECUTABLE(AppCcdPhysicsDemo + main.cpp + CcdPhysicsDemo.cpp +) + diff --git a/BulletPhysics/bulletTrunk/Demos/CcdPhysicsDemo/CcdPhysicsDemo.cpp b/BulletPhysics/bulletTrunk/Demos/CcdPhysicsDemo/CcdPhysicsDemo.cpp new file mode 100644 index 00000000..57db32dc --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/CcdPhysicsDemo/CcdPhysicsDemo.cpp @@ -0,0 +1,681 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +//enable just one, DO_BENCHMARK_PYRAMIDS or DO_WALL +//#define DO_BENCHMARK_PYRAMIDS 1 +#define DO_WALL 1 + +//Note: some of those settings need 'DO_WALL' demo +//#define USE_KINEMATIC_GROUND 1 +//#define PRINT_CONTACT_STATISTICS 1 +//#define USER_DEFINED_FRICTION_MODEL 1 +//#define USE_CUSTOM_NEAR_CALLBACK 1 +//#define CENTER_OF_MASS_SHIFT 1 +//#define VERBOSE_TIMESTEPPING_CONSOLEOUTPUT 1 + +//#define USE_PARALLEL_DISPATCHER 1 +//#define USE_PARALLEL_SOLVER 1 //experimental parallel solver + + +//from Bullet 2.68 onwards ODE Quickstep constraint solver is optional part of Bullet, re-distributed under the ZLib license with permission of Russell L. Smith +//#define COMPARE_WITH_QUICKSTEP 1 + + +#include "btBulletDynamicsCommon.h" +#include "BulletCollision/CollisionDispatch/btSphereSphereCollisionAlgorithm.h" +#include "BulletCollision/CollisionDispatch/btSphereTriangleCollisionAlgorithm.h" + +#ifdef USE_PARALLEL_DISPATCHER +#include "../../Extras/BulletMultiThreaded/SpuGatheringCollisionDispatcher.h" +#ifdef WIN32 +#include "../../Extras/BulletMultiThreaded/Win32ThreadSupport.h" +#include "../../Extras/BulletMultiThreaded/SpuNarrowPhaseCollisionTask/SpuGatheringCollisionTask.h" +#endif //WIN32 + +#ifdef USE_LIBSPE2 +#include "../../Extras/BulletMultiThreaded/SpuLibspe2Support.h" +#endif //USE_LIBSPE2 + +#ifdef USE_PARALLEL_SOLVER +#include "../../Extras/BulletMultiThreaded/SpuParallelSolver.h" +#include "../../Extras/BulletMultiThreaded/SpuSolverTask/SpuParallellSolverTask.h" +#endif //USE_PARALLEL_SOLVER + +#endif//USE_PARALLEL_DISPATCHER + + + +#include "LinearMath/btQuickprof.h" +#include "LinearMath/btIDebugDraw.h" + + +#include "BMF_Api.h" +#include //printf debugging + +static float gCollisionMargin = 0.05f; +#include "CcdPhysicsDemo.h" +#include "GL_ShapeDrawer.h" + +#include "GlutStuff.h" + +btTransform comOffset; +btVector3 comOffsetVec(0,2,0); + +extern float eye[3]; +extern int glutScreenWidth; +extern int glutScreenHeight; + +const int maxProxies = 32766; +const int maxOverlap = 65535; + +bool createConstraint = true;//false; +#ifdef CENTER_OF_MASS_SHIFT +bool useCompound = true; +#else +bool useCompound = false; +#endif + + + +#ifdef _DEBUG +const int gNumObjects = 120; +#else +const int gNumObjects = 120;//try this in release mode: 3000. never go above 16384, unless you increate maxNumObjects value in DemoApplication.cp +#endif + + +const int maxNumObjects = 32760; + +int shapeIndex[maxNumObjects]; + + +#define CUBE_HALF_EXTENTS 0.5 + +#define EXTRA_HEIGHT -10.f +//GL_LineSegmentShape shapeE(btVector3(-50,0,0), +// btVector3(50,0,0)); + + +void CcdPhysicsDemo::createStack( btCollisionShape* boxShape, float halfCubeSize, int size, float zPos ) +{ + btTransform trans; + trans.setIdentity(); + + for(int i=0; im_frictionSolverType = USER_CONTACT_SOLVER_TYPE1; +#endif //USER_DEFINED_FRICTION_MODEL + + } + } +} + + +//////////////////////////////////// + + + +//by default, Bullet will use its own nearcallback, but you can override it using dispatcher->setNearCallback() +void customNearCallback(btBroadphasePair& collisionPair, btCollisionDispatcher& dispatcher, const btDispatcherInfo& dispatchInfo) +{ + btCollisionObject* colObj0 = (btCollisionObject*)collisionPair.m_pProxy0->m_clientObject; + btCollisionObject* colObj1 = (btCollisionObject*)collisionPair.m_pProxy1->m_clientObject; + + if (dispatcher.needsCollision(colObj0,colObj1)) + { + //dispatcher will keep algorithms persistent in the collision pair + if (!collisionPair.m_algorithm) + { + collisionPair.m_algorithm = dispatcher.findAlgorithm(colObj0,colObj1); + } + + if (collisionPair.m_algorithm) + { + btManifoldResult contactPointResult(colObj0,colObj1); + + if (dispatchInfo.m_dispatchFunc == btDispatcherInfo::DISPATCH_DISCRETE) + { + //discrete collision detection query + collisionPair.m_algorithm->processCollision(colObj0,colObj1,dispatchInfo,&contactPointResult); + } else + { + //continuous collision detection query, time of impact (toi) + float toi = collisionPair.m_algorithm->calculateTimeOfImpact(colObj0,colObj1,dispatchInfo,&contactPointResult); + if (dispatchInfo.m_timeOfImpact > toi) + dispatchInfo.m_timeOfImpact = toi; + + } + } + } + +} + + + + + + +//experimental jitter damping (1 = no damping, 0 = total damping once motion below threshold) +extern btScalar gJitterVelocityDampingFactor; + + + + +extern int gNumManifold; +extern int gOverlappingPairs; + + +void CcdPhysicsDemo::clientMoveAndDisplay() +{ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + +#ifdef USE_KINEMATIC_GROUND + //btQuaternion kinRotation(btVector3(0,0,1),0.); + btVector3 kinTranslation(-0.01,0,0); + //kinematic object + btCollisionObject* colObj = m_dynamicsWorld->getCollisionObjectArray()[0]; + //is this a rigidbody with a motionstate? then use the motionstate to update positions! + if (btRigidBody::upcast(colObj) && btRigidBody::upcast(colObj)->getMotionState()) + { + btTransform newTrans; + btRigidBody::upcast(colObj)->getMotionState()->getWorldTransform(newTrans); + newTrans.getOrigin()+=kinTranslation; + btRigidBody::upcast(colObj)->getMotionState()->setWorldTransform(newTrans); + } else + { + m_dynamicsWorld->getCollisionObjectArray()[0]->getWorldTransform().getOrigin() += kinTranslation; + } + +#endif //USE_KINEMATIC_GROUND + + + float dt = getDeltaTimeMicroseconds() * 0.000001f; + +// printf("dt = %f: ",dt); + + if (m_dynamicsWorld) + { + +//#define FIXED_STEP 1 +#ifdef FIXED_STEP + m_dynamicsWorld->stepSimulation(1.0f/60.f,0); + +#else + //during idle mode, just run 1 simulation step maximum + int maxSimSubSteps = m_idle ? 1 : 1; + if (m_idle) + dt = 1.0/420.f; + + int numSimSteps = 0; + numSimSteps = m_dynamicsWorld->stepSimulation(dt,maxSimSubSteps); + + //optional but useful: debug drawing + m_dynamicsWorld->debugDrawWorld(); + +#ifdef VERBOSE_TIMESTEPPING_CONSOLEOUTPUT + if (!numSimSteps) + printf("Interpolated transforms\n"); + else + { + if (numSimSteps > maxSimSubSteps) + { + //detect dropping frames + printf("Dropped (%i) simulation steps out of %i\n",numSimSteps - maxSimSubSteps,numSimSteps); + } else + { + printf("Simulated (%i) steps\n",numSimSteps); + } + } +#endif //VERBOSE_TIMESTEPPING_CONSOLEOUTPUT + +#endif + } + +#ifdef USE_QUICKPROF + btProfiler::beginBlock("render"); +#endif //USE_QUICKPROF + + renderme(); + + + //render the graphics objects, with center of mass shift + + updateCamera(); + + + +#ifdef USE_QUICKPROF + btProfiler::endBlock("render"); +#endif + glFlush(); + //some additional debugging info +#ifdef PRINT_CONTACT_STATISTICS + printf("num manifolds: %i\n",gNumManifold); + printf("num gOverlappingPairs: %i\n",gOverlappingPairs); + +#endif //PRINT_CONTACT_STATISTICS + + + glutSwapBuffers(); + +} + + + +void CcdPhysicsDemo::displayCallback(void) { + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + renderme(); + + //optional but useful: debug drawing + if (m_dynamicsWorld) + m_dynamicsWorld->debugDrawWorld(); + + glFlush(); + glutSwapBuffers(); +} + + + + + +///User-defined friction model, the most simple friction model available: no friction +float myFrictionModel( btRigidBody& body1, btRigidBody& body2, btManifoldPoint& contactPoint, const btContactSolverInfo& solverInfo ) +{ + //don't do any friction + return 0.f; +} + +void CcdPhysicsDemo::initPhysics() +{ + setTexturing(true); + setShadows(false); + +#ifdef USE_PARALLEL_DISPATCHER +#ifdef WIN32 + m_threadSupportSolver = 0; + m_threadSupportCollision = 0; +#endif // +#endif + +//#define USE_GROUND_PLANE 1 +#ifdef USE_GROUND_PLANE + m_collisionShapes.push_back(new btStaticPlaneShape(btVector3(0,1,0),0.5)); +#else + + ///Please don't make the box sizes larger then 1000: the collision detection will be inaccurate. + ///See http://www.continuousphysics.com/Bullet/phpBB2/viewtopic.php?t=346 + m_collisionShapes.push_back(new btBoxShape (btVector3(200,CUBE_HALF_EXTENTS,200))); +#endif + +#ifdef DO_BENCHMARK_PYRAMIDS + m_collisionShapes.push_back(new btBoxShape (btVector3(CUBE_HALF_EXTENTS,CUBE_HALF_EXTENTS,CUBE_HALF_EXTENTS))); +#else +// m_collisionShapes.push_back(new btBoxShape (btVector3(CUBE_HALF_EXTENTS,CUBE_HALF_EXTENTS,CUBE_HALF_EXTENTS))); + m_collisionShapes.push_back(new btCylinderShape (btVector3(CUBE_HALF_EXTENTS,CUBE_HALF_EXTENTS,CUBE_HALF_EXTENTS))); +#endif + + + +#ifdef DO_BENCHMARK_PYRAMIDS + setCameraDistance(32.5f); +#endif + +#ifdef DO_BENCHMARK_PYRAMIDS + m_azi = 90.f; +#endif //DO_BENCHMARK_PYRAMIDS + + m_dispatcher=0; + m_collisionConfiguration = new btDefaultCollisionConfiguration(); + +#ifdef USE_PARALLEL_DISPATCHER +int maxNumOutstandingTasks = 4; + +#ifdef USE_WIN32_THREADING + + m_threadSupportCollision = new Win32ThreadSupport(Win32ThreadSupport::Win32ThreadConstructionInfo( + "collision", + processCollisionTask, + createCollisionLocalStoreMemory, + maxNumOutstandingTasks)); +#else + +#ifdef USE_LIBSPE2 + + spe_program_handle_t * program_handle; +#ifndef USE_CESOF + program_handle = spe_image_open ("./spuCollision.elf"); + if (program_handle == NULL) + { + perror( "SPU OPEN IMAGE ERROR\n"); + } + else + { + printf( "IMAGE OPENED\n"); + } +#else + extern spe_program_handle_t spu_program; + program_handle = &spu_program; +#endif + SpuLibspe2Support* threadSupportCollision = new SpuLibspe2Support( program_handle, maxNumOutstandingTasks); +#endif //USE_LIBSPE2 + +///Playstation 3 SPU (SPURS) version is available through PS3 Devnet +/// For Unix/Mac someone could implement a pthreads version of btThreadSupportInterface? +///you can hook it up to your custom task scheduler by deriving from btThreadSupportInterface +#endif + + + m_dispatcher = new SpuGatheringCollisionDispatcher(m_threadSupportCollision,maxNumOutstandingTasks,m_collisionConfiguration); +// m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); +#else + + m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); +#endif //USE_PARALLEL_DISPATCHER + +#ifdef USE_CUSTOM_NEAR_CALLBACK + //this is optional + m_dispatcher->setNearCallback(customNearCallback); +#endif + + + m_broadphase = new btDbvtBroadphase(); + +#ifdef COMPARE_WITH_QUICKSTEP + m_solver = new btOdeQuickstepConstraintSolver(); +#else + + +#ifdef USE_PARALLEL_SOLVER + + m_threadSupportSolver = new Win32ThreadSupport(Win32ThreadSupport::Win32ThreadConstructionInfo( + "solver", + processSolverTask, + createSolverLocalStoreMemory, + maxNumOutstandingTasks)); + + m_solver = new btParallelSequentialImpulseSolver(m_threadSupportSolver,maxNumOutstandingTasks); +#else + btSequentialImpulseConstraintSolver* solver = new btSequentialImpulseConstraintSolver(); + + m_solver = solver;//new btOdeQuickstepConstraintSolver(); + +#endif //USE_PARALLEL_SOLVER + +#endif + + + + btDiscreteDynamicsWorld* world = new btDiscreteDynamicsWorld(m_dispatcher,m_broadphase,m_solver,m_collisionConfiguration); + m_dynamicsWorld = world; + +#ifdef USER_DEFINED_FRICTION_MODEL + //user defined friction model is not supported in 'cache friendly' solver yet, so switch to old solver + + world->getSolverInfo().m_solverMode = SOLVER_RANDMIZE_ORDER; + +#endif //USER_DEFINED_FRICTION_MODEL + +#ifdef DO_BENCHMARK_PYRAMIDS + world->getSolverInfo().m_numIterations = 4; +#endif //DO_BENCHMARK_PYRAMIDS + + m_dynamicsWorld->getDispatchInfo().m_enableSPU = true; + m_dynamicsWorld->setGravity(btVector3(0,-10,0)); + + + +#ifdef USER_DEFINED_FRICTION_MODEL + { + //m_solver->setContactSolverFunc(ContactSolverFunc func,USER_CONTACT_SOLVER_TYPE1,DEFAULT_CONTACT_SOLVER_TYPE); + solver->SetFrictionSolverFunc(myFrictionModel,USER_CONTACT_SOLVER_TYPE1,DEFAULT_CONTACT_SOLVER_TYPE); + solver->SetFrictionSolverFunc(myFrictionModel,DEFAULT_CONTACT_SOLVER_TYPE,USER_CONTACT_SOLVER_TYPE1); + solver->SetFrictionSolverFunc(myFrictionModel,USER_CONTACT_SOLVER_TYPE1,USER_CONTACT_SOLVER_TYPE1); + //m_physicsEnvironmentPtr->setNumIterations(2); + } +#endif //USER_DEFINED_FRICTION_MODEL + + + + int i; + + btTransform tr; + tr.setIdentity(); + + + for (i=0;i0) + { + shapeIndex[i] = 1;//sphere + } + else + shapeIndex[i] = 0; + } + + if (useCompound) + { + btCompoundShape* compoundShape = new btCompoundShape(); + btCollisionShape* oldShape = m_collisionShapes[1]; + m_collisionShapes[1] = compoundShape; + btVector3 sphereOffset(0,0,2); + + comOffset.setIdentity(); + +#ifdef CENTER_OF_MASS_SHIFT + comOffset.setOrigin(comOffsetVec); + compoundShape->addChildShape(comOffset,oldShape); + +#else + compoundShape->addChildShape(tr,oldShape); + tr.setOrigin(sphereOffset); + compoundShape->addChildShape(tr,new btSphereShape(0.9)); +#endif + } + +#ifdef DO_WALL + + for (i=0;isetMargin(gCollisionMargin); + + bool isDyna = i>0; + + btTransform trans; + trans.setIdentity(); + + if (i>0) + { + //stack them + int colsize = 10; + int row = (i*CUBE_HALF_EXTENTS*2)/(colsize*2*CUBE_HALF_EXTENTS); + int row2 = row; + int col = (i)%(colsize)-colsize/2; + + + if (col>3) + { + col=11; + row2 |=1; + } + + btVector3 pos(col*2*CUBE_HALF_EXTENTS + (row2%2)*CUBE_HALF_EXTENTS, + row*2*CUBE_HALF_EXTENTS+CUBE_HALF_EXTENTS+EXTRA_HEIGHT,0); + + trans.setOrigin(pos); + } else + { + trans.setOrigin(btVector3(0,EXTRA_HEIGHT-CUBE_HALF_EXTENTS,0)); + } + + float mass = 1.f; + + if (!isDyna) + mass = 0.f; + + btRigidBody* body = localCreateRigidBody(mass,trans,shape); +#ifdef USE_KINEMATIC_GROUND + if (mass == 0.f) + { + body->setCollisionFlags( body->getCollisionFlags() | btCollisionObject::CF_KINEMATIC_OBJECT); + body->setActivationState(DISABLE_DEACTIVATION); + } +#endif //USE_KINEMATIC_GROUND + + + // Only do CCD if motion in one timestep (1.f/60.f) exceeds CUBE_HALF_EXTENTS + body->setCcdMotionThreshold( CUBE_HALF_EXTENTS ); + + //Experimental: better estimation of CCD Time of Impact: + body->setCcdSweptSphereRadius( 0.2*CUBE_HALF_EXTENTS ); + +#ifdef USER_DEFINED_FRICTION_MODEL + ///Advanced use: override the friction solver + body->m_frictionSolverType = USER_CONTACT_SOLVER_TYPE1; +#endif //USER_DEFINED_FRICTION_MODEL + + } +#endif + + +#ifdef DO_BENCHMARK_PYRAMIDS + btTransform trans; + trans.setIdentity(); + + btScalar halfExtents = CUBE_HALF_EXTENTS; + + trans.setOrigin(btVector3(0,-halfExtents,0)); + + + + localCreateRigidBody(0.f,trans,m_collisionShapes[shapeIndex[0]]); + + int numWalls = 15; + int wallHeight = 15; + float wallDistance = 3; + + + for (int i=0;isetLinearVelocity(btVector3(0,0,-10)); +#endif +#endif //DO_BENCHMARK_PYRAMIDS +// clientResetScene(); + + +} + + + + + + +void CcdPhysicsDemo::exitPhysics() +{ + + + //cleanup in the reverse order of creation/initialization + + //remove the rigidbodies from the dynamics world and delete them + int i; + for (i=m_dynamicsWorld->getNumCollisionObjects()-1; i>=0 ;i--) + { + btCollisionObject* obj = m_dynamicsWorld->getCollisionObjectArray()[i]; + btRigidBody* body = btRigidBody::upcast(obj); + if (body && body->getMotionState()) + { + delete body->getMotionState(); + } + m_dynamicsWorld->removeCollisionObject( obj ); + delete obj; + } + + //delete collision shapes + for (int j=0;j m_collisionShapes; + + btBroadphaseInterface* m_broadphase; + + btCollisionDispatcher* m_dispatcher; + +#ifdef USE_PARALLEL_DISPATCHER +#ifdef WIN32 + class Win32ThreadSupport* m_threadSupportCollision; + class Win32ThreadSupport* m_threadSupportSolver; +#endif +#endif + + btConstraintSolver* m_solver; + + btCollisionAlgorithmCreateFunc* m_boxBoxCF; + + btDefaultCollisionConfiguration* m_collisionConfiguration; + + + public: + + void initPhysics(); + + void exitPhysics(); + + virtual ~CcdPhysicsDemo() + { + exitPhysics(); + } + + virtual void clientMoveAndDisplay(); + + virtual void displayCallback(); + + void createStack( btCollisionShape* boxShape, float halfCubeSize, int size, float zPos ); + + static DemoApplication* Create() + { + CcdPhysicsDemo* demo = new CcdPhysicsDemo; + demo->myinit(); + demo->initPhysics(); + return demo; + } + +}; + +#endif //CCD_PHYSICS_DEMO_H + diff --git a/BulletPhysics/bulletTrunk/Demos/CcdPhysicsDemo/Jamfile b/BulletPhysics/bulletTrunk/Demos/CcdPhysicsDemo/Jamfile new file mode 100644 index 00000000..6ff8d83f --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/CcdPhysicsDemo/Jamfile @@ -0,0 +1,3 @@ +SubDir TOP Demos CcdPhysicsDemo ; + +BulletDemo CcdPhysicsDemo : [ Wildcard *.h *.cpp ] ; diff --git a/BulletPhysics/bulletTrunk/Demos/CcdPhysicsDemo/Makefile.am b/BulletPhysics/bulletTrunk/Demos/CcdPhysicsDemo/Makefile.am new file mode 100644 index 00000000..506dfa3f --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/CcdPhysicsDemo/Makefile.am @@ -0,0 +1,5 @@ +noinst_PROGRAMS=CcdPhysicsDemo + +CcdPhysicsDemo_SOURCES=CcdPhysicsDemo.cpp CcdPhysicsDemo.h main.cpp +CcdPhysicsDemo_CXXFLAGS=-I@top_builddir@/src -I@top_builddir@/Demos/OpenGL $(CXXFLAGS) +CcdPhysicsDemo_LDADD=-L../OpenGL -lbulletopenglsupport -L../../src -lbulletdynamics -lbulletcollision -lbulletmath @opengl_LIBS@ diff --git a/BulletPhysics/bulletTrunk/Demos/CcdPhysicsDemo/main.cpp b/BulletPhysics/bulletTrunk/Demos/CcdPhysicsDemo/main.cpp new file mode 100644 index 00000000..3d0955a7 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/CcdPhysicsDemo/main.cpp @@ -0,0 +1,49 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#include "CcdPhysicsDemo.h" +#include "GlutStuff.h" +#include "GLDebugDrawer.h" +#include "btBulletDynamicsCommon.h" +#ifdef __DEBUG_FPU_ISSUES +#define _GNU_SOURCE +#include +#endif + +GLDebugDrawer gDebugDrawer; + +int main(int argc,char** argv) +{ + + CcdPhysicsDemo* ccdDemo = new CcdPhysicsDemo(); + +#ifdef __DEBUG_FPU_ISSUES +// feenableexcept (FE_DIVBYZERO); +// feenableexcept (FE_INEXACT); +// feenableexcept (FE_INVALID); +// feenableexcept (FE_OVERFLOW|FE_DIVBYZERO|FE_UNDERFLOW); +// feenableexcept (FE_UNDERFLOW); +#endif + + ccdDemo->initPhysics(); + ccdDemo->getDynamicsWorld()->setDebugDrawer(&gDebugDrawer); + + + glutmain(argc, argv,640,480,"Bullet Physics Demo. http://bulletphysics.com",ccdDemo); + + delete ccdDemo; + return 0; + +} diff --git a/BulletPhysics/bulletTrunk/Demos/CellSpuDemo/BasicDemo2.cpp b/BulletPhysics/bulletTrunk/Demos/CellSpuDemo/BasicDemo2.cpp new file mode 100644 index 00000000..2af2b802 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/CellSpuDemo/BasicDemo2.cpp @@ -0,0 +1,277 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + + +//#define USE_GROUND_BOX 1 +#define PRINT_CONTACT_STATISTICS 1 +#define USE_PARALLEL_DISPATCHER 1 + + +//#define USE_SIMPLE_DYNAMICS_WORLD 1 + +int gNumObjects = 5; +#define HALF_EXTENTS btScalar(1.) +#include "btBulletDynamicsCommon.h" +#include "BulletCollision/BroadphaseCollision/btMultiSapBroadphase.h" +#include "LinearMath/btIDebugDraw.h" +#include //printf debugging +btScalar deltaTime = btScalar(1./60.); +btScalar gCollisionMargin = btScalar(0.05); +#include "BasicDemo2.h" + +#ifdef USE_PARALLEL_DISPATCHER +#include "BulletMultiThreaded/SpuGatheringCollisionDispatcher.h" +#include "BulletMultiThreaded/Win32ThreadSupport.h" +#include "BulletMultiThreaded/SpuLibspe2Support.h" +#include "BulletMultiThreaded/SpuNarrowPhaseCollisionTask/SpuGatheringCollisionTask.h" +#endif//USE_PARALLEL_DISPATCHER + + +#include + +//////////////////////////////////// + + + + +int main(int argc,char** argv) +{ + + BasicDemo ccdDemo; + ccdDemo.initPhysics(); + + int i; + for (i=0;i<5;i++) + ccdDemo.clientMoveAndDisplay(); + ccdDemo.exitPhysics(); + + return 0; +} + + + +extern int gNumManifold; + +void BasicDemo::clientMoveAndDisplay() +{ + + //simple dynamics world doesn't handle fixed-time-stepping + float ms = m_clock.getTimeMicroseconds(); + m_clock.reset(); + float minFPS = 1000000.f/60.f; + if (ms > minFPS) + ms = minFPS; + + if (m_dynamicsWorld) + m_dynamicsWorld->stepSimulation(ms / 1000000.f); + + //some additional debugging info +#ifdef PRINT_CONTACT_STATISTICS + printf("num contact manifolds: %i\n",gNumManifold); + int numManifolds = m_dynamicsWorld->getDispatcher()->getNumManifolds(); + for (int i=0;igetDispatcher()->getManifoldByIndexInternal(i); + btCollisionObject* obA = static_cast(contactManifold->getBody0()); + btCollisionObject* obB = static_cast(contactManifold->getBody1()); + + int numContacts = contactManifold->getNumContacts(); + for (int j=0;jgetContactPoint(j); + btVector3 ptA = pt.getPositionWorldOnA(); + btVector3 ptB = pt.getPositionWorldOnB(); + printf("contact manifold[%d],pointA[%d]=(%f,%f,%f)\n",i,j,ptA[0],ptA[1],ptA[2]); + } + } +#endif //PRINT_CONTACT_STATISTICS + + +} + + + + + +void BasicDemo::initPhysics() +{ + + btDefaultCollisionConfiguration* collisionConfiguration = new btDefaultCollisionConfiguration(); + +#ifdef USE_PARALLEL_DISPATCHER + + int maxNumOutstandingTasks = 1;//number of maximum outstanding tasks +#ifdef USE_WIN32_THREADING + + Win32ThreadSupport* threadSupport = new Win32ThreadSupport(Win32ThreadSupport::Win32ThreadConstructionInfo( + "collision", + processCollisionTask, + createCollisionLocalStoreMemory, + maxNumOutstandingTasks)); +#else + + spe_program_handle_t * program_handle; +#ifndef USE_CESOF + char* spuFileName = "../../../src/BulletMultiThreaded/out/spuCollision.elf"; + + program_handle = spe_image_open (spuFileName); + if (program_handle == NULL) + { + printf( "SPU OPEN IMAGE ERROR:%s\n",spuFileName); + exit(0); + } + else + { + printf( "IMAGE OPENED:%s\n",spuFileName); + } +#else + extern spe_program_handle_t spu_program; + program_handle = &spu_program; +#endif + SpuLibspe2Support* threadSupport = new SpuLibspe2Support( program_handle, maxNumOutstandingTasks); + +#endif // WIN32 + + + m_dispatcher = new SpuGatheringCollisionDispatcher(threadSupport,maxNumOutstandingTasks,collisionConfiguration); +#else + m_dispatcher = new btCollisionDispatcher(collisionConfiguration); +#endif //USE_PARALLEL_DISPATCHER + m_collisionConfiguration = new btDefaultCollisionConfiguration(); + + +#define USE_SWEEP_AND_PRUNE 1 +#ifdef USE_SWEEP_AND_PRUNE +#define maxProxies 8192 + btVector3 worldAabbMin(-10000,-10000,-10000); + btVector3 worldAabbMax(10000,10000,10000); + m_overlappingPairCache = new btAxisSweep3(worldAabbMin,worldAabbMax,maxProxies); + //m_overlappingPairCache = new btMultiSapBroadphase(); + + +#else + m_overlappingPairCache = new btSimpleBroadphase; +#endif //USE_SWEEP_AND_PRUNE + + + + btSequentialImpulseConstraintSolver* sol = new btSequentialImpulseConstraintSolver; + m_solver = sol; + + + m_dynamicsWorld = new btDiscreteDynamicsWorld(m_dispatcher,m_overlappingPairCache,m_solver,m_collisionConfiguration); + m_dynamicsWorld->getDispatchInfo().m_enableSPU = true; + + m_dynamicsWorld->setGravity(btVector3(0,-10,0)); + + + ///create a few basic rigid bodies + + + //static ground +#ifdef USE_GROUND_BOX + btCollisionShape* groundShape = new btBoxShape(btVector3(btScalar(50.),btScalar(50.),btScalar(50.))); +#else + btCollisionShape* groundShape = new btSphereShape(btScalar(50.)); +#endif//USE_GROUND_BOX + + m_collisionShapes.push_back(groundShape); + + btTransform groundTransform; + groundTransform.setIdentity(); + groundTransform.setOrigin(btVector3(0,-50,0)); + localCreateRigidBody(btScalar(0.),groundTransform,groundShape); + + //create a few dynamic sphere rigidbodies (re-using the same sphere shape) + //btCollisionShape* sphereShape = new btBoxShape(btVector3(1,1,1)); + btCollisionShape* sphereShape = new btSphereShape(btScalar(1.)); + m_collisionShapes.push_back(sphereShape); + + int i; + for (i=0;isetMargin(gCollisionMargin); + btTransform trans; + trans.setIdentity(); + //stack them + int colsize = 2; + int row = (int)((i*HALF_EXTENTS*2)/(colsize*2*HALF_EXTENTS)); + int row2 = row; + int col = (i)%(colsize)-colsize/2; + btVector3 pos(col*2*HALF_EXTENTS + (row2%2)*HALF_EXTENTS, + row*2*HALF_EXTENTS+HALF_EXTENTS,0); + + trans.setOrigin(pos); + //btRigidBody* body = localCreateRigidBody(btScalar(1.),trans,sphereShape); + localCreateRigidBody(btScalar(1.),trans,sphereShape); + } + + //clientResetScene(); +} + +btRigidBody* BasicDemo::localCreateRigidBody(btScalar mass,const btTransform& startTrans,btCollisionShape* colShape) +{ +btVector3 inertia(0,0,0); +if (mass) + colShape->calculateLocalInertia(mass,inertia); + btRigidBody::btRigidBodyConstructionInfo rbci(mass,0,colShape,inertia); + rbci.m_startWorldTransform = startTrans; + +btRigidBody* body = new btRigidBody(rbci); + m_dynamicsWorld->addRigidBody(body); +return body; + +} +void BasicDemo::exitPhysics() +{ + + + //cleanup in the reverse order of creation/initialization + + //remove the rigidbodies from the dynamics world and delete them + int i; + for (i=m_dynamicsWorld->getNumCollisionObjects()-1; i>=0 ;i--) + { + btCollisionObject* obj = m_dynamicsWorld->getCollisionObjectArray()[i]; + m_dynamicsWorld->removeCollisionObject( obj ); + delete obj; + } + + //delete collision shapes + for (int j=0;j m_collisionShapes; + + btBroadphaseInterface* m_overlappingPairCache; + + btCollisionDispatcher* m_dispatcher; + btDefaultCollisionConfiguration* m_collisionConfiguration; + btConstraintSolver* m_solver; + btDiscreteDynamicsWorld* m_dynamicsWorld; + + btCollisionAlgorithmCreateFunc* m_sphereSphereCF; + btCollisionAlgorithmCreateFunc* m_sphereBoxCF; + btCollisionAlgorithmCreateFunc* m_boxSphereCF; + + btRigidBody* localCreateRigidBody(btScalar mass,const btTransform& startTrans,btCollisionShape* colShape); + + + public: + + void initPhysics(); + + void exitPhysics(); + + virtual void clientMoveAndDisplay(); + + + +}; + +#endif //BASIC_DEMO_H + diff --git a/BulletPhysics/bulletTrunk/Demos/CellSpuDemo/ibmsdk/Makefile b/BulletPhysics/bulletTrunk/Demos/CellSpuDemo/ibmsdk/Makefile new file mode 100644 index 00000000..9777906e --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/CellSpuDemo/ibmsdk/Makefile @@ -0,0 +1,69 @@ +# --------------------------------------------------------------- +# PLEASE DO NOT MODIFY THIS SECTION +# This prolog section is automatically generated. +# +# (C) Copyright 2001,2006, +# International Business Machines Corporation, +# +# All Rights Reserved. +# --------------------------------------------------------------- +# -------------------------------------------------------------- +# PROLOG END TAG zYx + +######################################################################## +# Source Code +######################################################################## +VPATH = ../ +######################################################################## +# Target +######################################################################## +ROOT = ../../.. +HOSTINC = /usr/include +PROGRAM_ppu := BasicDemo2 + +####################################################################### +# Objs +###################################################################### +OBJS = BasicDemo2.o + +######################################################################## +# Libraries, Include paths, Defines +######################################################################## +INCLUDE = -DUSE_LIBSPE2 \ + -I../ \ + -I$(ROOT)/src \ + -I$(ROOT)/Demos/OpenGL \ + -I$(HOSTINC) +SYS_LIBS := -lspe2 -lm + +IMPORTS = $(ROOT)/lib/ibmsdk/bulletmultithreaded.a \ + $(ROOT)/lib/ibmsdk/bulletdynamics.a \ + $(ROOT)/lib/ibmsdk/bulletcollision.a \ + $(ROOT)/lib/ibmsdk/bulletmath.a + +####################################################################### +# Install files/dirs +####################################################################### +INSTALL_DIR = $(ROOT)/ibmsdk +INSTALL_FILES = $(PROGRAM_ppu) +######################################################################## +# make.footer +######################################################################## + + +IBM_CELLSDK_VERSION := $(shell if [ -d /opt/cell ]; then echo "3.0"; fi) + +ifeq ("$(IBM_CELLSDK_VERSION)","3.0") + CELL_TOP ?= /opt/cell/sdk + include $(CELL_TOP)/buildutils/make.footer +else + CELL_TOP ?= /opt/ibm/cell-sdk/prototype + include $(CELL_TOP)/make.footer +endif + + +$(PPMS): + cp textures/$@ . + +cleanlocal: + rm -f $(PPMS) diff --git a/BulletPhysics/bulletTrunk/Demos/CharacterDemo/CMakeLists.txt b/BulletPhysics/bulletTrunk/Demos/CharacterDemo/CMakeLists.txt new file mode 100644 index 00000000..f0089f3d --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/CharacterDemo/CMakeLists.txt @@ -0,0 +1,31 @@ +# This is basically the overall name of the project in Visual Studio this is the name of the Solution File + + +# For every executable you have with a main method you should have an add_executable line below. +# For every add executable line you should list every .cpp and .h file you have associated with that executable. + + +# You shouldn't have to modify anything below this line +######################################################## + + +INCLUDE_DIRECTORIES( +${BULLET_PHYSICS_SOURCE_DIR}/src ${BULLET_PHYSICS_SOURCE_DIR}/Demos/OpenGL } +) + +LINK_LIBRARIES( + OpenGLSupport BulletDynamics BulletCollision LinearMath ${GLUT_glut_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} +) + +ADD_EXECUTABLE(AppCharacterDemo + DynamicCharacterController.cpp + DynamicCharacterController.h + CharacterDemo.cpp + CharacterDemo.h + ../BspDemo/BspConverter.cpp + ../BspDemo/BspConverter.h + ../BspDemo/BspLoader.cpp + ../BspDemo/BspLoader.h + main.cpp +) + diff --git a/BulletPhysics/bulletTrunk/Demos/CharacterDemo/CharacterDemo.cpp b/BulletPhysics/bulletTrunk/Demos/CharacterDemo/CharacterDemo.cpp new file mode 100644 index 00000000..b5dfd2dc --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/CharacterDemo/CharacterDemo.cpp @@ -0,0 +1,490 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#include "btBulletDynamicsCommon.h" +#include "BulletCollision/CollisionShapes/btHeightfieldTerrainShape.h" +#include "BulletCollision/CollisionDispatch/btGhostObject.h" + +#include "GLDebugDrawer.h" +#include //printf debugging + +#include "GL_ShapeDrawer.h" + +#include "GlutStuff.h" +#include "CharacterDemo.h" +#ifdef DYNAMIC_CHARACTER_CONTROLLER +#include "DynamicCharacterController.h" +#else +#include "BulletDynamics/Character/btKinematicCharacterController.h" +#endif + +const int maxProxies = 32766; +const int maxOverlap = 65535; + +static int gForward = 0; +static int gBackward = 0; +static int gLeft = 0; +static int gRight = 0; +static int gJump = 0; + + + + +CharacterDemo::CharacterDemo() +: +m_cameraHeight(4.f), +m_minCameraDistance(3.f), +m_maxCameraDistance(10.f), +m_indexVertexArrays(0), +m_vertices(0) +{ + m_character = 0; + m_cameraPosition = btVector3(30,30,30); +} + + +void CharacterDemo::initPhysics() +{ + btCollisionShape* groundShape = new btBoxShape(btVector3(50,3,50)); + m_collisionShapes.push_back(groundShape); + m_collisionConfiguration = new btDefaultCollisionConfiguration(); + m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); + btVector3 worldMin(-1000,-1000,-1000); + btVector3 worldMax(1000,1000,1000); + btAxisSweep3* sweepBP = new btAxisSweep3(worldMin,worldMax); + m_overlappingPairCache = sweepBP; + + m_constraintSolver = new btSequentialImpulseConstraintSolver(); + m_dynamicsWorld = new btDiscreteDynamicsWorld(m_dispatcher,m_overlappingPairCache,m_constraintSolver,m_collisionConfiguration); + +#ifdef DYNAMIC_CHARACTER_CONTROLLER + m_character = new DynamicCharacterController (); +#else + + btTransform startTransform; + startTransform.setIdentity (); + startTransform.setOrigin (btVector3(0.0, 4.0, 0.0)); + + m_ghostObject = new btPairCachingGhostObject(); + m_ghostObject->setWorldTransform(startTransform); + sweepBP->getOverlappingPairCache()->setInternalGhostPairCallback(new btGhostPairCallback()); + btScalar characterHeight=1.75; + btScalar characterWidth =1.75; + btConvexShape* capsule = new btCapsuleShape(characterWidth,characterHeight); + m_ghostObject->setCollisionShape (capsule); + m_ghostObject->setCollisionFlags (btCollisionObject::CF_CHARACTER_OBJECT); + + btScalar stepHeight = btScalar(0.35); + m_character = new btKinematicCharacterController (m_ghostObject,capsule,stepHeight); +#endif + + //////////////// + + /// Create some basic environment from a Quake level + + //m_dynamicsWorld->setGravity(btVector3(0,0,0)); + btTransform tr; + tr.setIdentity(); + + char* bspfilename = "BspDemo.bsp"; + void* memoryBuffer = 0; + + FILE* file = fopen(bspfilename,"r"); + if (!file) + { + //visual studio leaves the current working directory in the projectfiles folder + bspfilename = "../../BspDemo.bsp"; + file = fopen(bspfilename,"r"); + } + if (!file) + { + //visual studio leaves the current working directory in the projectfiles folder + bspfilename = "BspDemo.bsp"; + file = fopen(bspfilename,"r"); + } + + if (file) + { + BspLoader bspLoader; + int size=0; + if (fseek(file, 0, SEEK_END) || (size = ftell(file)) == EOF || fseek(file, 0, SEEK_SET)) { /* File operations denied? ok, just close and return failure */ + printf("Error: cannot get filesize from %s\n", bspfilename); + } else + { + //how to detect file size? + memoryBuffer = malloc(size+1); + fread(memoryBuffer,1,size,file); + bspLoader.loadBSPFile( memoryBuffer); + + BspToBulletConverter bsp2bullet(this); + float bspScaling = 0.1f; + bsp2bullet.convertBsp(bspLoader,bspScaling); + + } + fclose(file); + } + + ///only collide with static for now (no interaction with dynamic objects) + m_dynamicsWorld->addCollisionObject(m_ghostObject,btBroadphaseProxy::CharacterFilter, btBroadphaseProxy::StaticFilter|btBroadphaseProxy::DefaultFilter); + + m_dynamicsWorld->addAction(m_character); + + + /////////////// + + clientResetScene(); + + setCameraDistance(56.f); + +} + + +//to be implemented by the demo +void CharacterDemo::renderme() +{ + updateCamera(); + + DemoApplication::renderme(); +} + + + +void CharacterDemo::debugDrawContacts() +{ +// printf("numPairs = %d\n",m_customPairCallback->getOverlappingPairArray().size()); + { + btManifoldArray manifoldArray; + btBroadphasePairArray& pairArray = m_ghostObject->getOverlappingPairCache()->getOverlappingPairArray(); + int numPairs = pairArray.size(); + + for (int i=0;igetOverlappingPairCache()->findPair(pair.m_pProxy0,pair.m_pProxy1); + if (!collisionPair) + continue; + + if (collisionPair->m_algorithm) + collisionPair->m_algorithm->getAllContactManifolds(manifoldArray); + + for (int j=0;jgetNumContacts();p++) + { + const btManifoldPoint&pt = manifold->getContactPoint(p); + + btVector3 color(255,255,255); + m_dynamicsWorld->getDebugDrawer()->drawContactPoint(pt.getPositionWorldOnB(),pt.m_normalWorldOnB,pt.getDistance(),pt.getLifeTime(),color); + } + } + } + } + +} + +void CharacterDemo::clientMoveAndDisplay() +{ + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + float dt = getDeltaTimeMicroseconds() * 0.000001f; + + /* Character stuff &*/ + if (m_character) + { + + } + + debugDrawContacts(); + + + if (m_dynamicsWorld) + { + //during idle mode, just run 1 simulation step maximum + int maxSimSubSteps = m_idle ? 1 : 2; + if (m_idle) + dt = 1.0/420.f; + + ///set walkDirection for our character + btTransform xform; + xform = m_ghostObject->getWorldTransform (); + + btVector3 forwardDir = xform.getBasis()[2]; + // printf("forwardDir=%f,%f,%f\n",forwardDir[0],forwardDir[1],forwardDir[2]); + btVector3 upDir = xform.getBasis()[1]; + btVector3 strafeDir = xform.getBasis()[0]; + forwardDir.normalize (); + upDir.normalize (); + strafeDir.normalize (); + + btVector3 walkDirection = btVector3(0.0, 0.0, 0.0); + btScalar walkVelocity = btScalar(1.1) * 4.0; // 4 km/h -> 1.1 m/s + btScalar walkSpeed = walkVelocity * dt; + + if (gLeft) + walkDirection += strafeDir; + + if (gRight) + walkDirection -= strafeDir; + + if (gForward) + walkDirection += forwardDir; + + if (gBackward) + walkDirection -= forwardDir; + + + m_character->setWalkDirection(walkDirection*walkSpeed); + + + int numSimSteps = m_dynamicsWorld->stepSimulation(dt,maxSimSubSteps); + + //optional but useful: debug drawing + if (m_dynamicsWorld) + m_dynamicsWorld->debugDrawWorld(); + +//#define VERBOSE_FEEDBACK +#ifdef VERBOSE_FEEDBACK + if (!numSimSteps) + printf("Interpolated transforms\n"); + else + { + if (numSimSteps > maxSimSubSteps) + { + //detect dropping frames + printf("Dropped (%i) simulation steps out of %i\n",numSimSteps - maxSimSubSteps,numSimSteps); + } else + { + printf("Simulated (%i) steps\n",numSimSteps); + } + } +#endif //VERBOSE_FEEDBACK + + } + + + + + + + +#ifdef USE_QUICKPROF + btProfiler::beginBlock("render"); +#endif //USE_QUICKPROF + + + renderme(); + +#ifdef USE_QUICKPROF + btProfiler::endBlock("render"); +#endif + + + glFlush(); + glutSwapBuffers(); + +} + + + +void CharacterDemo::displayCallback(void) +{ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + renderme(); + + //optional but useful: debug drawing + if (m_dynamicsWorld) + m_dynamicsWorld->debugDrawWorld(); + + debugDrawContacts(); + + glFlush(); + glutSwapBuffers(); +} + +void CharacterDemo::clientResetScene() +{ + m_dynamicsWorld->getBroadphase()->getOverlappingPairCache()->cleanProxyFromPairs(m_ghostObject->getBroadphaseHandle(),getDynamicsWorld()->getDispatcher()); + + m_character->reset (); + ///WTF + m_character->warp (btVector3(0, -2.0, 0.)); +} + +void CharacterDemo::specialKeyboardUp(int key, int x, int y) +{ + switch (key) + { + case GLUT_KEY_UP: + { + gForward = 0; + } + break; + case GLUT_KEY_DOWN: + { + gBackward = 0; + } + break; + case GLUT_KEY_LEFT: + { + gLeft = 0; + } + break; + case GLUT_KEY_RIGHT: + { + gRight = 0; + } + break; + default: + DemoApplication::specialKeyboardUp(key,x,y); + break; + } +} + + +void CharacterDemo::specialKeyboard(int key, int x, int y) +{ + +// printf("key = %i x=%i y=%i\n",key,x,y); + + switch (key) + { + case GLUT_KEY_UP: + { + gForward = 1; + } + break; + case GLUT_KEY_DOWN: + { + gBackward = 1; + } + break; + case GLUT_KEY_LEFT: + { + gLeft = 1; + } + break; + case GLUT_KEY_RIGHT: + { + gRight = 1; + } + break; + case GLUT_KEY_F1: + { + if (m_character && m_character->canJump()) + gJump = 1; + } + break; + default: + DemoApplication::specialKeyboard(key,x,y); + break; + } + +// glutPostRedisplay(); + + +} + +void CharacterDemo::updateCamera() +{ + +//#define DISABLE_CAMERA 1 +#ifdef DISABLE_CAMERA + DemoApplication::updateCamera(); + return; +#endif //DISABLE_CAMERA + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + + btTransform characterWorldTrans; + + //look at the vehicle + characterWorldTrans = m_ghostObject->getWorldTransform(); + btVector3 up = characterWorldTrans.getBasis()[1]; + btVector3 backward = -characterWorldTrans.getBasis()[2]; + up.normalize (); + backward.normalize (); + + m_cameraTargetPosition = characterWorldTrans.getOrigin(); + m_cameraPosition = m_cameraTargetPosition + up * 2.0 + backward * 12.0; + + //update OpenGL camera settings + glFrustum(-1.0, 1.0, -1.0, 1.0, 1.0, 10000.0); + + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + + gluLookAt(m_cameraPosition[0],m_cameraPosition[1],m_cameraPosition[2], + m_cameraTargetPosition[0],m_cameraTargetPosition[1], m_cameraTargetPosition[2], + m_cameraUp.getX(),m_cameraUp.getY(),m_cameraUp.getZ()); + + + +} + + +CharacterDemo::~CharacterDemo() +{ + //cleanup in the reverse order of creation/initialization + if (m_character) + { + m_dynamicsWorld->removeCollisionObject(m_ghostObject); + } + //remove the rigidbodies from the dynamics world and delete them + int i; + for (i=m_dynamicsWorld->getNumCollisionObjects()-1; i>=0 ;i--) + { + btCollisionObject* obj = m_dynamicsWorld->getCollisionObjectArray()[i]; + btRigidBody* body = btRigidBody::upcast(obj); + if (body && body->getMotionState()) + { + delete body->getMotionState(); + } + m_dynamicsWorld->removeCollisionObject( obj ); + delete obj; + } + + //delete collision shapes + for (int j=0;j m_collisionShapes; + + class btBroadphaseInterface* m_overlappingPairCache; + + class btCollisionDispatcher* m_dispatcher; + + class btConstraintSolver* m_constraintSolver; + + class btDefaultCollisionConfiguration* m_collisionConfiguration; + + class btTriangleIndexVertexArray* m_indexVertexArrays; + + btVector3* m_vertices; + + void debugDrawContacts(); + + float m_cameraHeight; + + float m_minCameraDistance; + float m_maxCameraDistance; + + + CharacterDemo(); + + virtual ~CharacterDemo(); + + virtual void clientMoveAndDisplay(); + + virtual void clientResetScene(); + + virtual void displayCallback(); + + ///a very basic camera following the character + virtual void updateCamera(); + + virtual void specialKeyboard(int key, int x, int y); + + virtual void specialKeyboardUp(int key, int x, int y); + + void renderme(); + + void initPhysics(); + + static DemoApplication* Create() + { + CharacterDemo* demo = new CharacterDemo(); + demo->myinit(); + demo->initPhysics(); + return demo; + } +}; + + + +#define QUAKE_BSP_IMPORTING 1 +#ifdef QUAKE_BSP_IMPORTING +#include "../BspDemo/BspLoader.h" +#include "../BspDemo/BspConverter.h" + + + + +class BspToBulletConverter : public BspConverter +{ + CharacterDemo* m_demoApp; + +public: + + BspToBulletConverter(CharacterDemo* demoApp) + :m_demoApp(demoApp) + { + } + + virtual void addConvexVerticesCollider(btAlignedObjectArray& vertices, bool isEntity, const btVector3& entityTargetLocation) + { + ///perhaps we can do something special with entities (isEntity) + ///like adding a collision Triggering (as example) + + if (vertices.size() > 0) + { + float mass = 0.f; + btTransform startTransform; + //can use a shift + startTransform.setIdentity(); + startTransform.setOrigin(btVector3(0,-10.0f,0.0f)); + //this create an internal copy of the vertices + for (int i = 0; i < vertices.size(); i++) + { + vertices[i] *= btScalar(0.5); + float t = vertices[i].getZ() * btScalar(0.75); + vertices[i].setZ(-vertices[i].getY()); + vertices[i].setY(t); + } + + btCollisionShape* shape = new btConvexHullShape(&(vertices[0].getX()),vertices.size()); + m_demoApp->m_collisionShapes.push_back(shape); + + //btRigidBody* body = m_demoApp->localCreateRigidBody(mass, startTransform,shape); + m_demoApp->localCreateRigidBody(mass, startTransform,shape); + } + } +}; +#endif //QUAKE_BSP_IMPORTING + + +#endif //CHARACTER_DEMO_H + + diff --git a/BulletPhysics/bulletTrunk/Demos/CharacterDemo/DynamicCharacterController.cpp b/BulletPhysics/bulletTrunk/Demos/CharacterDemo/DynamicCharacterController.cpp new file mode 100644 index 00000000..a327c734 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/CharacterDemo/DynamicCharacterController.cpp @@ -0,0 +1,204 @@ +#include "BulletCollision/CollisionShapes/btMultiSphereShape.h" +#include "BulletDynamics/Dynamics/btRigidBody.h" +#include "BulletCollision/CollisionDispatch/btCollisionWorld.h" +#include "LinearMath/btDefaultMotionState.h" +#include "DynamicCharacterController.h" + +DynamicCharacterController::DynamicCharacterController () +{ + m_rayLambda[0] = 1.0; + m_rayLambda[1] = 1.0; + m_halfHeight = 1.0; + m_turnAngle = 0.0; + m_maxLinearVelocity = 10.0; + m_walkVelocity = 8.0; // meters/sec + m_turnVelocity = 1.0; // radians/sec + m_shape = NULL; + m_rigidBody = NULL; +} + +DynamicCharacterController::~DynamicCharacterController () +{ +} + +void DynamicCharacterController::setup (btScalar height, btScalar width, btScalar stepHeight) +{ + btVector3 spherePositions[2]; + btScalar sphereRadii[2]; + + sphereRadii[0] = width; + sphereRadii[1] = width; + spherePositions[0] = btVector3 (0.0, (height/btScalar(2.0) - width), 0.0); + spherePositions[1] = btVector3 (0.0, (-height/btScalar(2.0) + width), 0.0); + + m_halfHeight = height/btScalar(2.0); + + m_shape = new btMultiSphereShape (btVector3(width/btScalar(2.0), height/btScalar(2.0), width/btScalar(2.0)), &spherePositions[0], &sphereRadii[0], 2); + + btTransform startTransform; + startTransform.setIdentity (); + startTransform.setOrigin (btVector3(0.0, 2.0, 0.0)); + btDefaultMotionState* myMotionState = new btDefaultMotionState(startTransform); + btRigidBody::btRigidBodyConstructionInfo cInfo(1.0, myMotionState, m_shape); + m_rigidBody = new btRigidBody(cInfo); + // kinematic vs. static doesn't work + //m_rigidBody->setCollisionFlags( m_rigidBody->getCollisionFlags() | btCollisionObject::CF_KINEMATIC_OBJECT); + m_rigidBody->setSleepingThresholds (0.0, 0.0); + m_rigidBody->setAngularFactor (0.0); + +} + +void DynamicCharacterController::destroy () +{ + if (m_shape) + { + delete m_shape; + } + + if (m_rigidBody) + { + delete m_rigidBody; + m_rigidBody = 0; + } +} + +btCollisionObject* DynamicCharacterController::getCollisionObject () +{ + return m_rigidBody; +} + +void DynamicCharacterController::preStep (const btCollisionWorld* collisionWorld) +{ + btTransform xform; + m_rigidBody->getMotionState()->getWorldTransform (xform); + btVector3 down = -xform.getBasis()[1]; + btVector3 forward = xform.getBasis()[2]; + down.normalize (); + forward.normalize(); + + m_raySource[0] = xform.getOrigin(); + m_raySource[1] = xform.getOrigin(); + + m_rayTarget[0] = m_raySource[0] + down * m_halfHeight * btScalar(1.1); + m_rayTarget[1] = m_raySource[1] + forward * m_halfHeight * btScalar(1.1); + + class ClosestNotMe : public btCollisionWorld::ClosestRayResultCallback + { + public: + ClosestNotMe (btRigidBody* me) : btCollisionWorld::ClosestRayResultCallback(btVector3(0.0, 0.0, 0.0), btVector3(0.0, 0.0, 0.0)) + { + m_me = me; + } + + virtual btScalar addSingleResult(btCollisionWorld::LocalRayResult& rayResult,bool normalInWorldSpace) + { + if (rayResult.m_collisionObject == m_me) + return 1.0; + + return ClosestRayResultCallback::addSingleResult (rayResult, normalInWorldSpace + ); + } + protected: + btRigidBody* m_me; + }; + + ClosestNotMe rayCallback(m_rigidBody); + + int i = 0; + for (i = 0; i < 2; i++) + { + rayCallback.m_closestHitFraction = 1.0; + collisionWorld->rayTest (m_raySource[i], m_rayTarget[i], rayCallback); + if (rayCallback.hasHit()) + { + m_rayLambda[i] = rayCallback.m_closestHitFraction; + } else { + m_rayLambda[i] = 1.0; + } + } +} + +void DynamicCharacterController::playerStep (const btCollisionWorld* dynaWorld,btScalar dt, + int forward, + int backward, + int left, + int right, + int jump) +{ + btTransform xform; + m_rigidBody->getMotionState()->getWorldTransform (xform); + + /* Handle turning */ + if (left) + m_turnAngle -= dt * m_turnVelocity; + if (right) + m_turnAngle += dt * m_turnVelocity; + + xform.setRotation (btQuaternion (btVector3(0.0, 1.0, 0.0), m_turnAngle)); + + btVector3 linearVelocity = m_rigidBody->getLinearVelocity(); + btScalar speed = m_rigidBody->getLinearVelocity().length(); + + btVector3 forwardDir = xform.getBasis()[2]; + forwardDir.normalize (); + btVector3 walkDirection = btVector3(0.0, 0.0, 0.0); + btScalar walkSpeed = m_walkVelocity * dt; + + if (forward) + walkDirection += forwardDir; + if (backward) + walkDirection -= forwardDir; + + + + if (!forward && !backward && onGround()) + { + /* Dampen when on the ground and not being moved by the player */ + linearVelocity *= btScalar(0.2); + m_rigidBody->setLinearVelocity (linearVelocity); + } else { + if (speed < m_maxLinearVelocity) + { + btVector3 velocity = linearVelocity + walkDirection * walkSpeed; + m_rigidBody->setLinearVelocity (velocity); + } + } + + m_rigidBody->getMotionState()->setWorldTransform (xform); + m_rigidBody->setCenterOfMassTransform (xform); +} + +bool DynamicCharacterController::canJump () const +{ + return onGround(); +} + +void DynamicCharacterController::jump () +{ + if (!canJump()) + return; + + btTransform xform; + m_rigidBody->getMotionState()->getWorldTransform (xform); + btVector3 up = xform.getBasis()[1]; + up.normalize (); + btScalar magnitude = (btScalar(1.0)/m_rigidBody->getInvMass()) * btScalar(8.0); + m_rigidBody->applyCentralImpulse (up * magnitude); +} + +bool DynamicCharacterController::onGround () const +{ + return m_rayLambda[0] < btScalar(1.0); +} + +void DynamicCharacterController::reset () +{ +} +void DynamicCharacterController::warp (const btVector3& origin) +{ +} +void DynamicCharacterController::registerPairCacheAndDispatcher (btOverlappingPairCache* pairCache, btCollisionDispatcher* dispatcher) +{ + +} + diff --git a/BulletPhysics/bulletTrunk/Demos/CharacterDemo/DynamicCharacterController.h b/BulletPhysics/bulletTrunk/Demos/CharacterDemo/DynamicCharacterController.h new file mode 100644 index 00000000..241aaeac --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/CharacterDemo/DynamicCharacterController.h @@ -0,0 +1,55 @@ +#ifndef CHARACTER_CONTROLLER_H +#define CHARACTER_CONTROLLER_H + +#include "LinearMath/btVector3.h" + +#include "BulletDynamics/Character/btCharacterControllerInterface.h" + +class btCollisionShape; +class btRigidBody; +class btCollisionWorld; + +///DynamicCharacterController is obsolete/unsupported at the moment +class DynamicCharacterController : public btCharacterControllerInterface +{ +protected: + btScalar m_halfHeight; + btCollisionShape* m_shape; + btRigidBody* m_rigidBody; + + btVector3 m_raySource[2]; + btVector3 m_rayTarget[2]; + btScalar m_rayLambda[2]; + btVector3 m_rayNormal[2]; + + btScalar m_turnAngle; + + btScalar m_maxLinearVelocity; + btScalar m_walkVelocity; + btScalar m_turnVelocity; +public: + DynamicCharacterController (); + ~DynamicCharacterController (); + void setup (btScalar height = 2.0, btScalar width = 0.25, btScalar stepHeight = 0.25); + void destroy (); + + virtual void reset (); + virtual void warp (const btVector3& origin); + virtual void registerPairCacheAndDispatcher (btOverlappingPairCache* pairCache, btCollisionDispatcher* dispatcher); + + btCollisionObject* getCollisionObject (); + + void preStep (const btCollisionWorld* collisionWorld); + void playerStep (const btCollisionWorld* collisionWorld,btScalar dt, + int forward, + int backward, + int left, + int right, + int jump); + bool canJump () const; + void jump (); + + bool onGround () const; +}; + +#endif diff --git a/BulletPhysics/bulletTrunk/Demos/CharacterDemo/Jamfile b/BulletPhysics/bulletTrunk/Demos/CharacterDemo/Jamfile new file mode 100644 index 00000000..db7ad904 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/CharacterDemo/Jamfile @@ -0,0 +1,9 @@ +SubDir TOP Demos CharacterDemo ; + +BulletDemo CharacterDemo : [ Wildcard *.h *.cpp ] + ../BspDemo/BspConverter.cpp + ../BspDemo/BspConverter.h + ../BspDemo/BspLoader.cpp + ../BspDemo/BspLoader.h + +; diff --git a/BulletPhysics/bulletTrunk/Demos/CharacterDemo/main.cpp b/BulletPhysics/bulletTrunk/Demos/CharacterDemo/main.cpp new file mode 100644 index 00000000..080eb862 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/CharacterDemo/main.cpp @@ -0,0 +1,19 @@ + +#include "CharacterDemo.h" +#include "GlutStuff.h" +#include "GLDebugDrawer.h" +#include "btBulletDynamicsCommon.h" + +GLDebugDrawer gDebugDrawer; + +int main(int argc,char** argv) +{ + + CharacterDemo* characterDemo = new CharacterDemo; + + characterDemo->initPhysics(); + characterDemo->getDynamicsWorld()->setDebugDrawer(&gDebugDrawer); + + return glutmain(argc, argv,640,480,"Bullet Character Demo. http://www.continuousphysics.com/Bullet/phpBB2/", characterDemo); +} + diff --git a/BulletPhysics/bulletTrunk/Demos/ColladaDemo/CMakeLists.txt b/BulletPhysics/bulletTrunk/Demos/ColladaDemo/CMakeLists.txt new file mode 100644 index 00000000..9b544928 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/ColladaDemo/CMakeLists.txt @@ -0,0 +1,25 @@ +# This is basically the overall name of the project in Visual Studio this is the name of the Solution File + + +# For every executable you have with a main method you should have an add_executable line below. +# For every add executable line you should list every .cpp and .h file you have associated with that executable. + + + +# You shouldn't have to modify anything below this line +######################################################## + + + +INCLUDE_DIRECTORIES( +${BULLET_PHYSICS_SOURCE_DIR}/Extras/BulletColladaConverter ${BULLET_PHYSICS_SOURCE_DIR}/Extras/LibXML ${BULLET_PHYSICS_SOURCE_DIR}/Extras/LibXML/include ${BULLET_PHYSICS_SOURCE_DIR}/Extras/COLLADA_DOM/include/1.4 ${BULLET_PHYSICS_SOURCE_DIR}/Extras/COLLADA_DOM/include ${BULLET_PHYSICS_SOURCE_DIR}/src ${BULLET_PHYSICS_SOURCE_DIR}/Demos/OpenGL } +) + +LINK_LIBRARIES( +BulletColladaConverter ColladaDom XML OpenGLSupport BulletDynamics BulletCollision LinearMath ${GLUT_glut_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} +) + +ADD_EXECUTABLE(AppColladaDemo + ColladaDemo.cpp +) + diff --git a/BulletPhysics/bulletTrunk/Demos/ColladaDemo/ColladaDemo.cpp b/BulletPhysics/bulletTrunk/Demos/ColladaDemo/ColladaDemo.cpp new file mode 100644 index 00000000..903f73b7 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/ColladaDemo/ColladaDemo.cpp @@ -0,0 +1,209 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#include "btBulletDynamicsCommon.h" +#include "LinearMath/btQuickprof.h" +#include "LinearMath/btIDebugDraw.h" +#include "GLDebugDrawer.h" + +#include "BulletCollision/Gimpact/btGImpactCollisionAlgorithm.h" + +//COLLADA_DOM and LibXML source code are included in Extras/ folder. +//COLLADA_DOM should compile under all platforms, and is enabled by default. + +#include "ColladaConverter.h" + +#include "BMF_Api.h" +#include //printf debugging + +float deltaTime = 1.f/60.f; + +#include "ColladaDemo.h" +#include "GL_ShapeDrawer.h" +#include "GlutStuff.h" + + +///custom version of the converter, that creates physics objects/constraints +class MyColladaConverter : public ColladaConverter +{ + DemoApplication* m_demoApp; + + public: + MyColladaConverter(DemoApplication* demoApp) + : ColladaConverter(demoApp->getDynamicsWorld()), + m_demoApp(demoApp) + { + } + + + virtual void setCameraInfo(const btVector3& camUp,int forwardAxis) + { + m_demoApp->setCameraUp(camUp); + m_demoApp->setCameraForwardAxis(forwardAxis); + } + +}; + +MyColladaConverter* gColladaConverter = 0; + + + + + +//////////////////////////////////// + + + +GLDebugDrawer debugDrawer; + + + + +int main(int argc,char** argv) +{ + + /// Import Collada 1.4 Physics objects + /// also can pass filename in as argument + const char* filename = "jenga.dae"; + printf("argc=%i\n",argc); + { + for (int i=0;i1) + { + filename = argv[1]; + } + + ColladaDemo* colladaDemo = new ColladaDemo(); + + colladaDemo->initPhysics(filename); + + +// colladaDemo->clientResetScene(); + + colladaDemo->setCameraDistance(26.f); + + return glutmain(argc, argv,640,480,"Bullet COLLADA Physics Viewer http://bulletphysics.org",colladaDemo); +} + +void ColladaDemo::initPhysics(const char* filename) +{ + m_cameraUp = btVector3(0,0,1); + m_ele = 60; + m_forwardAxis = 1; + + btDefaultCollisionConfiguration* collisionConfiguration = new btDefaultCollisionConfiguration(); + btCollisionDispatcher* dispatcher = new btCollisionDispatcher(collisionConfiguration); + btGImpactCollisionAlgorithm::registerAlgorithm(dispatcher); + + btVector3 worldMin(-1000,-1000,-1000); + btVector3 worldMax(1000,1000,1000); + btBroadphaseInterface* pairCache = new btAxisSweep3(worldMin,worldMax); + btConstraintSolver* constraintSolver = new btSequentialImpulseConstraintSolver(); + m_dynamicsWorld = new btDiscreteDynamicsWorld(dispatcher,pairCache,constraintSolver,collisionConfiguration); + + //m_dynamicsWorld = new btSimpleDynamicsWorld(); + + m_dynamicsWorld->setDebugDrawer(&debugDrawer); + + + MyColladaConverter* converter = new MyColladaConverter(this); + + bool result = converter->load(filename); + if (result) + { + gColladaConverter = converter; + } else + { + gColladaConverter = 0; + printf("gColladaConverter = 0\n"); + } +} + + +void ColladaDemo::clientMoveAndDisplay() +{ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + float dt = getDeltaTimeMicroseconds() * 0.000001f; + + m_dynamicsWorld->stepSimulation(dt); + + //optional but useful: debug drawing + m_dynamicsWorld->debugDrawWorld(); + + renderme(); + + glFlush(); + glutSwapBuffers(); + +} + + + +void ColladaDemo::displayCallback(void) { + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + + if (m_dynamicsWorld) + m_dynamicsWorld->debugDrawWorld(); + + renderme(); + + + glFlush(); + glutSwapBuffers(); +} + + + + + + +void ColladaDemo::keyboardCallback(unsigned char key, int x, int y) +{ + if (key =='e') + { + //save a COLLADA .dae physics snapshot + if (gColladaConverter) + { + if (gColladaConverter->getLastFileName()) + { + //deal with the name pre/post fixing etc. + char saveName[550]; + static int saveCount=1; + sprintf(saveName,"%s%i",gColladaConverter->getLastFileName(),saveCount++); + char* name = &saveName[0]; + if (name[0] == '/') + { + name = &saveName[1]; + } + gColladaConverter->save(name); + + } else + { + gColladaConverter->save("brandNew.dae"); + } + } + } else + { + DemoApplication::keyboardCallback(key,x,y); + } +} + diff --git a/BulletPhysics/bulletTrunk/Demos/ColladaDemo/ColladaDemo.h b/BulletPhysics/bulletTrunk/Demos/ColladaDemo/ColladaDemo.h new file mode 100644 index 00000000..c0fb159c --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/ColladaDemo/ColladaDemo.h @@ -0,0 +1,38 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ +#ifndef COLLADA_PHYSICS_DEMO_H +#define COLLADA_PHYSICS_DEMO_H + +#include "DemoApplication.h" + +///ColladaDemo shows the loading and exporting of COLLADA physics xml files. +///It uses COLLADA DOM +class ColladaDemo : public DemoApplication +{ + public: + + void initPhysics(const char* filename); + + virtual void clientMoveAndDisplay(); + + virtual void displayCallback(); + + + virtual void keyboardCallback(unsigned char key, int x, int y); + +}; + +#endif //COLLADA_PHYSICS_DEMO_H + diff --git a/BulletPhysics/bulletTrunk/Demos/ColladaDemo/Jamfile b/BulletPhysics/bulletTrunk/Demos/ColladaDemo/Jamfile new file mode 100644 index 00000000..d88ed4f1 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/ColladaDemo/Jamfile @@ -0,0 +1,32 @@ +SubDir TOP Demos ColladaDemo ; + +#some demos need extra functionality, Collada / ConvexDecomposition etc. + + rule ExtraDemo3 + + { + Application $(<) : $(>) : noinstall console nomanifest ; + LinkWith $(<) : BulletColladaConverter colladadom libxml bulletopenglsupport bulletdynamics bulletcollision bulletmath ; + CFlags $(<) : + [ FIncludes $(TOP)/Demos/OpenGL ] + [ FIncludes $(TOP)/Extras/BulletColladaConverter ] + [ FIncludes $(TOP)/Extras/COLLADA_DOM/include ] + [ FIncludes $(TOP)/Extras/COLLADA_DOM/include/1.4 ] + [ FIncludes $(TOP)/Extras/LibXML ] + + [ FIncludes $(TOP)/Extras/LibXML/include ] + + ; + + MsvcIncDirs $(<) : + "../../Demos/OpenGL" + "../../Extras/BulletColladaConverter" + "../../Extras/COLLADA_DOM/include" + "../../Extras/COLLADA_DOM/include/1.4" + "../../Extras/LibXML" + "../../Extras/LibXML/include" ; + } + +ExtraDemo3 ColladaDemo : [ Wildcard *.h *.cpp ] ; + +MsvcIncDirs ColladaDemo : "../../Extras/FCollada" ; diff --git a/BulletPhysics/bulletTrunk/Demos/ColladaDemo/Makefile.am b/BulletPhysics/bulletTrunk/Demos/ColladaDemo/Makefile.am new file mode 100644 index 00000000..ef881183 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/ColladaDemo/Makefile.am @@ -0,0 +1,5 @@ +noinst_PROGRAMS=ColladaDemo + +ColladaDemo_SOURCES=ColladaDemo.cpp ColladaDemo.h +ColladaDemo_CXXFLAGS=-I@top_builddir@/src -I@top_builddir@/Demos/OpenGL -I@top_builddir@/Extras -I@top_builddir@/Extras/BulletColladaConverter $(CXXFLAGS) +ColladaDemo_LDADD=-L../OpenGL -L../../Extras -L../../src -lbulletcolladaconverter -lbulletopenglsupport -lbulletdynamics -lbulletcollision -lbulletmath -lcollada_dom -lxml @opengl_LIBS@ diff --git a/BulletPhysics/bulletTrunk/Demos/CollisionDemo/CollisionDemo.cpp b/BulletPhysics/bulletTrunk/Demos/CollisionDemo/CollisionDemo.cpp new file mode 100644 index 00000000..3837a586 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/CollisionDemo/CollisionDemo.cpp @@ -0,0 +1,296 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + + +/// +/// Collision Demo shows a degenerate case, where the Simplex solver has to deal with near-affine dependent cases +/// See the define CATCH_DEGENERATE_TETRAHEDRON in Bullet's btVoronoiSimplexSolver.cpp +/// + + +//#define CHECK_GENSHER_TRIANGLE_CASE 1 + + +///This low-level internal demo does intentionally NOT use the btBulletCollisionCommon.h header +///It needs internal access +#include "GL_Simplex1to4.h" +#include "LinearMath/btQuaternion.h" +#include "LinearMath/btTransform.h" +#include "BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.h" +#include "BulletCollision/CollisionShapes/btBoxShape.h" +#include "BulletCollision/NarrowPhaseCollision/btGjkPairDetector.h" +#include "BulletCollision/NarrowPhaseCollision/btPointCollector.h" +#include "BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.h" +#include "BulletCollision/NarrowPhaseCollision/btConvexPenetrationDepthSolver.h" +#include "BulletCollision/NarrowPhaseCollision/btGjkEpaPenetrationDepthSolver.h" +#include "LinearMath/btTransformUtil.h" + +#include "CollisionDemo.h" +#include "GL_ShapeDrawer.h" +#include "GlutStuff.h" +#include "LinearMath/btIDebugDraw.h" +#include "../OpenGL/GLDebugDrawer.h" +GLDebugDrawer debugDrawer; + + +float yaw=0.f,pitch=0.f,roll=0.f; +const int maxNumObjects = 4; +const int numObjects = 2; + +GL_Simplex1to4 simplex; + +btPolyhedralConvexShape* shapePtr[maxNumObjects]; + +btTransform tr[numObjects]; +int screenWidth = 640; +int screenHeight = 480; + +void DrawRasterizerLine(float const* , float const*, int) +{ + +} + +int main(int argc,char** argv) +{ + CollisionDemo* colDemo = new CollisionDemo(); + +#ifdef CHECK_GENSHER_TRIANGLE_CASE + colDemo->setCameraDistance(8.f); +#else + colDemo->setCameraDistance(18.f); + +#endif // + colDemo->initPhysics(); + + + + return glutmain(argc, argv,screenWidth,screenHeight,"Collision Demo",colDemo); +} + +void CollisionDemo::initPhysics() +{ + setTexturing(false); + setShadows(false); + + //m_debugMode |= btIDebugDraw::DBG_DrawWireframe; +#ifdef CHECK_GENSHER_TRIANGLE_CASE + m_azi = 140.f; +#else + m_azi = 250.f; +#endif + m_ele = 25.f; + + m_azi = 0; + m_ele = 0; + + tr[0].setIdentity(); + tr[0].setOrigin(btVector3(10,0,0)); + tr[1].setIdentity(); + tr[1].setOrigin(btVector3(0,0,0)); + + +#ifdef CHECK_GENSHER_TRIANGLE_CASE + tr[0].setIdentity(); + tr[1].setIdentity(); +#endif //CHECK_GENSHER_TRIANGLE_CASE + + btVector3 boxHalfExtentsA(1,1,1);//1.0000004768371582f,1.0000004768371582f,1.0000001192092896f); + btVector3 boxHalfExtentsB(4,4,4);//3.2836332321166992f,3.2836332321166992f,3.2836320400238037f); + +#ifndef CHECK_GENSHER_TRIANGLE_CASE + btBoxShape* boxA = new btBoxShape(boxHalfExtentsA); + btBoxShape* boxB = new btBoxShape(boxHalfExtentsB); +#endif + + + + + + +#ifdef CHECK_GENSHER_TRIANGLE_CASE + shapePtr[0] = trishapeA; + shapePtr[1] = trishapeB; +#else + shapePtr[0] = boxA; + shapePtr[1] = boxB; +#endif + +} + +void CollisionDemo::clientMoveAndDisplay() +{ + + displayCallback(); +} + + +static btVoronoiSimplexSolver sGjkSimplexSolver; +btSimplexSolverInterface& gGjkSimplexSolver = sGjkSimplexSolver; + +static btScalar gContactBreakingThreshold=.02f; + +int checkPerturbation = 1; +int numPerturbationIterations = 20; +void CollisionDemo::displayCallback(void) { + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glDisable(GL_LIGHTING); + + btVoronoiSimplexSolver sGjkSimplexSolver; + btGjkEpaPenetrationDepthSolver epaSolver; + btPointCollector gjkOutput; + btVector3 worldBoundsMin(-1000,-1000,-1000); + btVector3 worldBoundsMax(1000,1000,1000); + { + btGjkPairDetector convexConvex(shapePtr[0],shapePtr[1],&sGjkSimplexSolver,&epaSolver); + + btGjkPairDetector::ClosestPointInput input; + input.m_transformA = tr[0]; + input.m_transformB = tr[1]; + + + convexConvex.getClosestPoints(input, gjkOutput, 0); + } + + if (gjkOutput.m_hasResult) + { + printf("bullet: %10.10f\n", gjkOutput.m_distance); + btVector3 endPt = gjkOutput.m_pointInWorld + + gjkOutput.m_normalOnBInWorld*gjkOutput.m_distance; + + debugDrawer.drawLine(gjkOutput.m_pointInWorld,endPt,btVector3(1,0,0)); + debugDrawer.drawSphere(gjkOutput.m_pointInWorld,0.05,btVector3(0,1,0)); + debugDrawer.drawSphere(endPt,0.05,btVector3(0,0,1)); + + bool perturbeA = false;//true; + const btScalar angleLimit = 0.125f * SIMD_PI; + btScalar perturbeAngle; + btScalar radiusA = shapePtr[0]->getAngularMotionDisc(); + btScalar radiusB = shapePtr[1]->getAngularMotionDisc(); + + if (radiusA < radiusB) + { + perturbeAngle = gContactBreakingThreshold /radiusA; + perturbeA = true; + } else + { + perturbeAngle = gContactBreakingThreshold / radiusB; + perturbeA = false; + } + if ( perturbeAngle > angleLimit ) + perturbeAngle = angleLimit; + + btVector3 v0,v1; + btPlaneSpace1(gjkOutput.m_normalOnBInWorld,v0,v1); + + + int i; + for ( i=0;idrawOpenGL(m,shapePtr[0],btVector3(0,1,0),getDebugMode(),worldBoundsMin,worldBoundsMax); + + } + + if (1)//gjkOutput.m_hasResult) + { + printf("bullet: %10.10f\n", gjkOutput.m_distance); + btVector3 startPt,endPt; + if (perturbeA) + { + btVector3 endPtOrg = gjkOutput.m_pointInWorld + gjkOutput.m_normalOnBInWorld*gjkOutput.m_distance; + endPt = (tr[0]*input.m_transformA.inverse())(endPtOrg); + btScalar depth = (endPt - gjkOutput.m_pointInWorld).dot(gjkOutput.m_normalOnBInWorld); + startPt = endPt-gjkOutput.m_normalOnBInWorld*depth; + } else + { + endPt = gjkOutput.m_pointInWorld + gjkOutput.m_normalOnBInWorld*gjkOutput.m_distance; + startPt = (tr[1]*input.m_transformB.inverse())(gjkOutput.m_pointInWorld); + btScalar depth = (endPt - startPt).dot(gjkOutput.m_normalOnBInWorld); + } + + + debugDrawer.drawLine(startPt,endPt,btVector3(1,0,0)); + debugDrawer.drawSphere(startPt,0.05,btVector3(0,1,0)); + debugDrawer.drawSphere(endPt,0.05,btVector3(0,0,1)); + } + } + + } + static int looper = 0; + if (looper++>10) + { + looper =0; + checkPerturbation++; + if (checkPerturbation>numPerturbationIterations) + checkPerturbation=0; + } + + GL_ShapeDrawer::drawCoordSystem(); + + btScalar m[16]; + int i; + + + + + + for (i=0;idrawOpenGL(m,shapePtr[i],btVector3(1,1,1),getDebugMode(),worldBoundsMin,worldBoundsMax); + } + + + btQuaternion orn; + orn.setEuler(yaw,pitch,roll); + //let it rotate + //tr[0].setRotation(orn); + + pitch += 0.005f; + yaw += 0.01f; + + glFlush(); + glutSwapBuffers(); +} + diff --git a/BulletPhysics/bulletTrunk/Demos/CollisionDemo/CollisionDemo.h b/BulletPhysics/bulletTrunk/Demos/CollisionDemo/CollisionDemo.h new file mode 100644 index 00000000..f740e682 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/CollisionDemo/CollisionDemo.h @@ -0,0 +1,34 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ +#ifndef COLLISION_DEMO_H +#define COLLISION_DEMO_H + +#include "DemoApplication.h" + +///CollisionDemo shows the low-level direct access to GJK +class CollisionDemo : public DemoApplication +{ + public: + + void initPhysics(); + + virtual void clientMoveAndDisplay(); + + virtual void displayCallback(); + +}; + +#endif //COLLISION_DEMO_H + diff --git a/BulletPhysics/bulletTrunk/Demos/CollisionDemo/Jamfile b/BulletPhysics/bulletTrunk/Demos/CollisionDemo/Jamfile new file mode 100644 index 00000000..43994f39 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/CollisionDemo/Jamfile @@ -0,0 +1,3 @@ +SubDir TOP Demos CollisionDemo ; + +BulletDemo CollisionDemo : [ Wildcard *.h *.cpp ] ; diff --git a/BulletPhysics/bulletTrunk/Demos/CollisionInterfaceDemo/CollisionInterfaceDemo.cpp b/BulletPhysics/bulletTrunk/Demos/CollisionInterfaceDemo/CollisionInterfaceDemo.cpp new file mode 100644 index 00000000..584d2eba --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/CollisionInterfaceDemo/CollisionInterfaceDemo.cpp @@ -0,0 +1,190 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + + +/// +/// CollisionInterfaceDemo shows high level usage of the Collision Detection. +/// + +#include "GL_Simplex1to4.h" + +//include common Bullet Collision Detection headerfiles +#include "btBulletCollisionCommon.h" + +#include "LinearMath/btIDebugDraw.h" +#include "GL_ShapeDrawer.h" +#include "CollisionInterfaceDemo.h" +#include "GlutStuff.h" +#include "GLDebugDrawer.h" + +float yaw=0.f,pitch=0.f,roll=0.f; +const int maxNumObjects = 4; +const int numObjects = 2; + +GL_Simplex1to4 simplex; + + +btCollisionObject objects[maxNumObjects]; +btCollisionWorld* collisionWorld = 0; + +int screenWidth = 640; +int screenHeight = 480; +GLDebugDrawer debugDrawer; + +int main(int argc,char** argv) +{ + CollisionInterfaceDemo* collisionInterfaceDemo = new CollisionInterfaceDemo(); + + collisionInterfaceDemo->initPhysics(); + + collisionInterfaceDemo->clientResetScene(); + + return glutmain(argc, argv,screenWidth,screenHeight,"Collision Interface Demo",collisionInterfaceDemo); +} + +void CollisionInterfaceDemo::initPhysics() +{ + + //m_debugMode |= btIDebugDraw::DBG_DrawWireframe; + + btMatrix3x3 basisA; + basisA.setIdentity(); + + btMatrix3x3 basisB; + basisB.setIdentity(); + + objects[0].getWorldTransform().setBasis(basisA); + objects[1].getWorldTransform().setBasis(basisB); + + btBoxShape* boxA = new btBoxShape(btVector3(1,1,1)); + btBoxShape* boxB = new btBoxShape(btVector3(0.5,0.5,0.5)); + //ConvexHullShape hullA(points0,3); + //hullA.setLocalScaling(btVector3(3,3,3)); + //ConvexHullShape hullB(points1,4); + //hullB.setLocalScaling(btVector3(4,4,4)); + + objects[0].setCollisionShape(boxA);//&hullA; + objects[1].setCollisionShape(boxB);//&hullB; + + btDefaultCollisionConfiguration* collisionConfiguration = new btDefaultCollisionConfiguration(); + btCollisionDispatcher* dispatcher = new btCollisionDispatcher(collisionConfiguration); + btVector3 worldAabbMin(-1000,-1000,-1000); + btVector3 worldAabbMax(1000,1000,1000); + + btAxisSweep3* broadphase = new btAxisSweep3(worldAabbMin,worldAabbMax); + + //SimpleBroadphase is a brute force alternative, performing N^2 aabb overlap tests + //SimpleBroadphase* broadphase = new btSimpleBroadphase; + + collisionWorld = new btCollisionWorld(dispatcher,broadphase,collisionConfiguration); + + collisionWorld->addCollisionObject(&objects[0]); + collisionWorld->addCollisionObject(&objects[1]); + +} + + +//to be implemented by the demo + +void CollisionInterfaceDemo::clientMoveAndDisplay() +{ + + displayCallback(); +} + + +static btVoronoiSimplexSolver sGjkSimplexSolver; +btSimplexSolverInterface& gGjkSimplexSolver = sGjkSimplexSolver; + + + +void CollisionInterfaceDemo::displayCallback(void) { + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glDisable(GL_LIGHTING); + + collisionWorld->getDispatchInfo().m_debugDraw = &debugDrawer; + + if (collisionWorld) + collisionWorld->performDiscreteCollisionDetection(); + + int i; + + ///one way to draw all the contact points is iterating over contact manifolds / points: + + int numManifolds = collisionWorld->getDispatcher()->getNumManifolds(); + for (i=0;igetDispatcher()->getManifoldByIndexInternal(i); + btCollisionObject* obA = static_cast(contactManifold->getBody0()); + btCollisionObject* obB = static_cast(contactManifold->getBody1()); + + int numContacts = contactManifold->getNumContacts(); + for (int j=0;jgetContactPoint(j); + + glBegin(GL_LINES); + glColor3f(1, 0, 1); + + btVector3 ptA = pt.getPositionWorldOnA(); + btVector3 ptB = pt.getPositionWorldOnB(); + + glVertex3d(ptA.x(),ptA.y(),ptA.z()); + glVertex3d(ptB.x(),ptB.y(),ptB.z()); + glEnd(); + } + + //you can un-comment out this line, and then all points are removed + //contactManifold->clearManifold(); + } + + //GL_ShapeDrawer::drawCoordSystem(); + + btScalar m[16]; + + btVector3 worldBoundsMin,worldBoundsMax; + collisionWorld->getBroadphase()->getBroadphaseAabb(worldBoundsMin,worldBoundsMax); + + + for (i=0;idrawOpenGL(m,objects[i].getCollisionShape(),btVector3(1,1,1),getDebugMode(),worldBoundsMin,worldBoundsMax); + + } + + + btQuaternion orn; + orn.setEuler(yaw,pitch,roll); + objects[1].getWorldTransform().setOrigin(objects[1].getWorldTransform().getOrigin()+btVector3(0,-0.01,0)); + + objects[0].getWorldTransform().setRotation(orn); + + pitch += 0.005f; + yaw += 0.01f; + + glFlush(); + glutSwapBuffers(); +} + +void CollisionInterfaceDemo::clientResetScene() +{ + objects[0].getWorldTransform().setOrigin(btVector3(0.0f,3.f,0.f)); + objects[1].getWorldTransform().setOrigin(btVector3(0.0f,9.f,0.f)); +} + + diff --git a/BulletPhysics/bulletTrunk/Demos/CollisionInterfaceDemo/CollisionInterfaceDemo.h b/BulletPhysics/bulletTrunk/Demos/CollisionInterfaceDemo/CollisionInterfaceDemo.h new file mode 100644 index 00000000..41cad7cd --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/CollisionInterfaceDemo/CollisionInterfaceDemo.h @@ -0,0 +1,36 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ +#ifndef COLLISION_INTERFACE_DEMO_H +#define COLLISION_INTERFACE_DEMO_H + +#include "DemoApplication.h" + +///CollisionInterfaceDemo shows how to use the collision detection without dynamics (btCollisionWorld/CollisionObject) +class CollisionInterfaceDemo : public DemoApplication +{ + public: + + void initPhysics(); + + virtual void clientMoveAndDisplay(); + + virtual void displayCallback(); + + virtual void clientResetScene(); + +}; + +#endif //COLLISION_INTERFACE_DEMO_H + diff --git a/BulletPhysics/bulletTrunk/Demos/CollisionInterfaceDemo/Jamfile b/BulletPhysics/bulletTrunk/Demos/CollisionInterfaceDemo/Jamfile new file mode 100644 index 00000000..f2704f6c --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/CollisionInterfaceDemo/Jamfile @@ -0,0 +1,3 @@ +SubDir TOP Demos CollisionInterfaceDemo ; + +BulletDemo CollisionInterfaceDemo : [ Wildcard *.h *.cpp ] ; diff --git a/BulletPhysics/bulletTrunk/Demos/ConcaveConvexcastDemo/ConcaveConvexcastDemo.cpp b/BulletPhysics/bulletTrunk/Demos/ConcaveConvexcastDemo/ConcaveConvexcastDemo.cpp new file mode 100644 index 00000000..f16bc17d --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/ConcaveConvexcastDemo/ConcaveConvexcastDemo.cpp @@ -0,0 +1,517 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#include "btBulletDynamicsCommon.h" +#include "LinearMath/btIDebugDraw.h" +#include "BulletCollision/CollisionShapes/btBoxShape.h" +#include "GLDebugDrawer.h" +#include "ConcaveConvexcastDemo.h" +#include "GL_ShapeDrawer.h" +#include "GlutStuff.h" + +#define NUM_DYNAMIC_BOXES_X 30 +#define NUM_DYNAMIC_BOXES_Y 30 + +static btVector3* gVertices=0; +static int* gIndices=0; +static btBvhTriangleMeshShape* trimeshShape =0; +static btRigidBody* staticBody = 0; +static float waveheight = 5.f; + +const float TRIANGLE_SIZE=8.f; + + +/* Scrolls back and forth over terrain */ +#define NUMRAYS_IN_BAR 100 +class btConvexcastBatch +{ +public: + btVector3 source[NUMRAYS_IN_BAR]; + btVector3 dest[NUMRAYS_IN_BAR]; + btVector3 direction[NUMRAYS_IN_BAR]; + btVector3 hit_com[NUMRAYS_IN_BAR]; + btVector3 hit_surface[NUMRAYS_IN_BAR]; + btScalar hit_fraction[NUMRAYS_IN_BAR]; + btVector3 normal[NUMRAYS_IN_BAR]; + + int frame_counter; + int ms; + int sum_ms; + int sum_ms_samples; + int min_ms; + int max_ms; + +#ifdef USE_BT_CLOCK + btClock frame_timer; +#endif //USE_BT_CLOCK + + btScalar dx; + btScalar min_x; + btScalar max_x; + btScalar min_y; + btScalar max_y; + btScalar sign; + + btVector3 boxShapeHalfExtents; + btBoxShape boxShape; + + btConvexcastBatch () : boxShape(btVector3(0.0, 0.0, 0.0)) + { + ms = 0; + max_ms = 0; + min_ms = 9999.0; + sum_ms_samples = 0; + sum_ms = 0; + } + + btConvexcastBatch (bool unused, btScalar ray_length, btScalar min_z, btScalar max_z, btScalar min_y , btScalar max_y ) : boxShape(btVector3(0.0, 0.0, 0.0)) + { + boxShapeHalfExtents = btVector3(1.0, 1.0, 1.0); + boxShape = btBoxShape(boxShapeHalfExtents); + frame_counter = 0; + ms = 0; + max_ms = 0; + min_ms = 9999.0; + sum_ms_samples = 0; + sum_ms = 0; + dx = 10.0; + min_x = -40; + max_x = 20; + this->min_y = min_y; + this->max_y = max_y; + sign = 1.0; + btScalar dalpha = 2*SIMD_2_PI/NUMRAYS_IN_BAR; + for (int i = 0; i < NUMRAYS_IN_BAR; i++) + { + btScalar z = (max_z-min_z)/NUMRAYS_IN_BAR * i + min_z; + source[i] = btVector3(min_x, max_y, z); + dest[i] = btVector3(min_x + ray_length, min_y, z); + normal[i] = btVector3(1.0, 0.0, 0.0); + } + } + + btConvexcastBatch (btScalar ray_length, btScalar z, btScalar min_y = -1000, btScalar max_y = 10) : boxShape(btVector3(0.0, 0.0, 0.0)) + { + boxShapeHalfExtents = btVector3(1.0, 1.0, 1.0); + boxShape = btBoxShape(boxShapeHalfExtents); + frame_counter = 0; + ms = 0; + max_ms = 0; + min_ms = 9999.0; + sum_ms_samples = 0; + sum_ms = 0; + dx = 10.0; + min_x = -40; + max_x = 20; + this->min_y = min_y; + this->max_y = max_y; + sign = 1.0; + btScalar dalpha = 2*SIMD_2_PI/NUMRAYS_IN_BAR; + for (int i = 0; i < NUMRAYS_IN_BAR; i++) + { + btScalar alpha = dalpha * i; + // rotate around by alpha degrees y + btTransform tr(btQuaternion(btVector3(0.0, 1.0, 0.0), alpha)); + direction[i] = btVector3(1.0, 0.0, 0.0); + direction[i] = tr * direction[i]; + direction[i] = direction[i]; + source[i] = btVector3(min_x, max_y, z); + dest[i] = source[i] + direction[i] * ray_length; + dest[i][1] = min_y; + normal[i] = btVector3(1.0, 0.0, 0.0); + } + } + + void move (btScalar dt) + { + if (dt > (1.0/60.0)) + dt = 1.0/60.0; + for (int i = 0; i < NUMRAYS_IN_BAR; i++) + { + source[i][0] += dx * dt * sign; + dest[i][0] += dx * dt * sign; + } + if (source[0][0] < min_x) + sign = 1.0; + else if (source[0][0] > max_x) + sign = -1.0; + } + + void cast (btCollisionWorld* cw) + { +#ifdef USE_BT_CLOCK + frame_timer.reset (); +#endif //USE_BT_CLOCK + for (int i = 0; i < NUMRAYS_IN_BAR; i++) + { + btCollisionWorld::ClosestConvexResultCallback cb(source[i], dest[i]); + btQuaternion qFrom; + btQuaternion qTo; + qFrom.setRotation (btVector3(1.0, 0.0, 0.0), 0.0); + qTo.setRotation (btVector3(1.0, 0.0, 0.0), 0.7); + btTransform from(qFrom, source[i]); + btTransform to(qTo, dest[i]); + cw->convexSweepTest (&boxShape, from, to, cb); + if (cb.hasHit ()) + { + hit_surface[i] = cb.m_hitPointWorld; + hit_com[i].setInterpolate3(source[i], dest[i], cb.m_closestHitFraction); + hit_fraction[i] = cb.m_closestHitFraction; + normal[i] = cb.m_hitNormalWorld; + normal[i].normalize (); + } else { + hit_com[i] = dest[i]; + hit_surface[i] = dest[i]; + hit_fraction[i] = 1.0f; + normal[i] = btVector3(1.0, 0.0, 0.0); + } + + } +#ifdef USE_BT_CLOCK + ms += frame_timer.getTimeMilliseconds (); +#endif //USE_BT_CLOCK + frame_counter++; + if (frame_counter > 50) + { + min_ms = ms < min_ms ? ms : min_ms; + max_ms = ms > max_ms ? ms : max_ms; + sum_ms += ms; + sum_ms_samples++; + btScalar mean_ms = (btScalar)sum_ms/(btScalar)sum_ms_samples; + printf("%d rays in %d ms %d %d %f\n", NUMRAYS_IN_BAR * frame_counter, ms, min_ms, max_ms, mean_ms); + ms = 0; + frame_counter = 0; + } + } + + + void drawCube (const btTransform& T) + { + btScalar m[16]; + T.getOpenGLMatrix (&m[0]); + glPushMatrix (); +#ifdef BT_USE_DOUBLE_PRECISION + glMultMatrixd (&m[0]); + glScaled (2.0 * boxShapeHalfExtents[0], 2.0 * boxShapeHalfExtents[1], 2.0 * boxShapeHalfExtents[2]); +#else + glMultMatrixf (&m[0]); + glScalef (2.0 * boxShapeHalfExtents[0], 2.0 * boxShapeHalfExtents[1], 2.0 * boxShapeHalfExtents[2]); +#endif //BT_USE_DOUBLE_PRECISION + glutSolidCube (1.0); + glPopMatrix (); + } + + void draw () + { + glDisable (GL_LIGHTING); + glColor3f (0.0, 1.0, 0.0); + glBegin (GL_LINES); + int i; + for (i = 0; i < NUMRAYS_IN_BAR; i++) + { + glVertex3f (source[i][0], source[i][1], source[i][2]); + glVertex3f (hit_com[i][0], hit_com[i][1], hit_com[i][2]); + } + glColor3f (1.0, 1.0, 1.0); + glBegin (GL_LINES); + btScalar normal_scale = 10.0; // easier to see if this is big + for (i = 0; i < NUMRAYS_IN_BAR; i++) + { + glVertex3f (hit_surface[i][0], hit_surface[i][1], hit_surface[i][2]); + glVertex3f (hit_surface[i][0] + normal_scale * normal[i][0], hit_surface[i][1] + normal_scale * normal[i][1], hit_surface[i][2] + normal_scale * normal[i][2]); + } + glEnd (); + glColor3f (0.0, 1.0, 1.0); + btQuaternion qFrom; + btQuaternion qTo; + qFrom.setRotation (btVector3(1.0, 0.0, 0.0), 0.0); + qTo.setRotation (btVector3(1.0, 0.0, 0.0), 0.7); + for ( i = 0; i < NUMRAYS_IN_BAR; i++) + { + btTransform from(qFrom, source[i]); + btTransform to(qTo, dest[i]); + btVector3 linVel, angVel; + btTransformUtil::calculateVelocity (from, to, 1.0, linVel, angVel); + btTransform T; + btTransformUtil::integrateTransform (from, linVel, angVel, hit_fraction[i], T); + drawCube (T); + } + glEnable (GL_LIGHTING); + } +}; + + +static btConvexcastBatch convexcastBatch; + + + + + +const int NUM_VERTS_X = 30; +const int NUM_VERTS_Y = 30; +const int totalVerts = NUM_VERTS_X*NUM_VERTS_Y; + +void ConcaveConvexcastDemo::setVertexPositions(float waveheight, float offset) +{ + int i; + int j; + + for ( i=0;isetCollisionFlags( staticBody->getCollisionFlags() | btCollisionObject::CF_KINEMATIC_OBJECT); + staticBody->setActivationState(DISABLE_DEACTIVATION); + } else + { + staticBody->setCollisionFlags( staticBody->getCollisionFlags() & ~btCollisionObject::CF_KINEMATIC_OBJECT); + staticBody->forceActivationState(ACTIVE_TAG); + } + } + + DemoApplication::keyboardCallback(key,x,y); + +} + +void ConcaveConvexcastDemo::initPhysics() +{ + #define TRISIZE 10.f + + setCameraDistance(100.f); + + + int vertStride = sizeof(btVector3); + int indexStride = 3*sizeof(int); + + + const int totalTriangles = 2*(NUM_VERTS_X-1)*(NUM_VERTS_Y-1); + + gVertices = new btVector3[totalVerts]; + gIndices = new int[totalTriangles*3]; + + int i; + + + setVertexPositions(waveheight,0.f); + + int index=0; + for ( i=0;isetCollisionFlags(staticBody->getCollisionFlags() | btCollisionObject::CF_STATIC_OBJECT); + + //enable custom material callback + staticBody->setCollisionFlags(staticBody->getCollisionFlags() | btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK); + + convexcastBatch = btConvexcastBatch (40.0, 0.0, -10.0,80.0); + //convexcastBatch = btConvexcastBatch (true, 40.0, -50.0, 50.0); +} + +void ConcaveConvexcastDemo::clientMoveAndDisplay() +{ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + float dt = getDeltaTimeMicroseconds() * 0.000001f; + + if (m_animatedMesh) + { + static float offset=0.f; + offset+=0.01f; + + + + int i; + int j; + btVector3 aabbMin(1e30,1e30,1e30); + btVector3 aabbMax(-1e30,-1e30,-1e30); + + for ( i=NUM_VERTS_X/2-3;ipartialRefitTree(aabbMin,aabbMax); + + + //clear all contact points involving mesh proxy. Note: this is a slow/unoptimized operation. + m_dynamicsWorld->getBroadphase()->getOverlappingPairCache()->cleanProxyFromPairs(staticBody->getBroadphaseHandle(),getDynamicsWorld()->getDispatcher()); + } + + m_dynamicsWorld->stepSimulation(dt); + + //optional but useful: debug drawing + m_dynamicsWorld->debugDrawWorld(); + + convexcastBatch.move (dt); + convexcastBatch.cast (m_dynamicsWorld); + renderme(); + convexcastBatch.draw (); + glFlush(); + glutSwapBuffers(); + +} + + + + +void ConcaveConvexcastDemo::displayCallback(void) { + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + renderme(); + convexcastBatch.draw (); + glFlush(); + glutSwapBuffers(); +} + + + +void ConcaveConvexcastDemo::exitPhysics() +{ + + + + //cleanup in the reverse order of creation/initialization + + //remove the rigidbodies from the dynamics world and delete them + int i; + for (i=m_dynamicsWorld->getNumCollisionObjects()-1; i>=0 ;i--) + { + btCollisionObject* obj = m_dynamicsWorld->getCollisionObjectArray()[i]; + btRigidBody* body = btRigidBody::upcast(obj); + if (body && body->getMotionState()) + { + delete body->getMotionState(); + } + m_dynamicsWorld->removeCollisionObject( obj ); + delete obj; + } + + //delete collision shapes + for (int j=0;j m_collisionShapes; + + btTriangleIndexVertexArray* m_indexVertexArrays; + + btBroadphaseInterface* m_broadphase; + + btCollisionDispatcher* m_dispatcher; + + btConstraintSolver* m_solver; + + btDefaultCollisionConfiguration* m_collisionConfiguration; + + bool m_animatedMesh; + + public: + + ConcaveConvexcastDemo() : m_animatedMesh(true) + { + + } + void initPhysics(); + + void exitPhysics(); + + virtual ~ConcaveConvexcastDemo() + { + exitPhysics(); + } + + virtual void clientMoveAndDisplay(); + + virtual void displayCallback(); + + //to show refit works + void setVertexPositions(float waveheight, float offset); + + virtual void keyboardCallback(unsigned char key, int x, int y); + + static DemoApplication* Create() + { + ConcaveConvexcastDemo* demo = new ConcaveConvexcastDemo(); + demo->myinit(); + demo->initPhysics(); + return demo; + }; +}; + +#endif //CONCAVE_CONVEXCAST_DEMO_H + diff --git a/BulletPhysics/bulletTrunk/Demos/ConcaveConvexcastDemo/main.cpp b/BulletPhysics/bulletTrunk/Demos/ConcaveConvexcastDemo/main.cpp new file mode 100644 index 00000000..6f405b6a --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/ConcaveConvexcastDemo/main.cpp @@ -0,0 +1,15 @@ + +#include "ConcaveConvexcastDemo.h" +#include "GlutStuff.h" + + +int main(int argc,char** argv) +{ + + ConcaveConvexcastDemo* concaveConvexcastDemo = new ConcaveConvexcastDemo(); + concaveConvexcastDemo->initPhysics(); + concaveConvexcastDemo->setCameraDistance(30.f); + + return glutmain(argc, argv,640,480,"Concave Convexcast Demo",concaveConvexcastDemo); +} + diff --git a/BulletPhysics/bulletTrunk/Demos/ConcaveDemo/ConcaveDemo.h b/BulletPhysics/bulletTrunk/Demos/ConcaveDemo/ConcaveDemo.h new file mode 100644 index 00000000..a04f45e1 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/ConcaveDemo/ConcaveDemo.h @@ -0,0 +1,84 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ +#ifndef CONCAVE_DEMO_H +#define CONCAVE_DEMO_H + +#include "DemoApplication.h" +#include "LinearMath/btAlignedObjectArray.h" + +class btBroadphaseInterface; +class btCollisionShape; +class btOverlappingPairCache; +class btCollisionDispatcher; +class btConstraintSolver; +struct btCollisionAlgorithmCreateFunc; +class btDefaultCollisionConfiguration; +class btTriangleIndexVertexArray; + +///ConcaveDemo shows usage of static concave triangle meshes +///It also shows per-triangle material (friction/restitution) through CustomMaterialCombinerCallback +class ConcaveDemo : public DemoApplication +{ + + //keep the collision shapes, for deletion/cleanup + btAlignedObjectArray m_collisionShapes; + + btTriangleIndexVertexArray* m_indexVertexArrays; + + btBroadphaseInterface* m_broadphase; + + btCollisionDispatcher* m_dispatcher; + + btConstraintSolver* m_solver; + + btDefaultCollisionConfiguration* m_collisionConfiguration; + + bool m_animatedMesh; + + public: + + ConcaveDemo() : m_animatedMesh(true) + { + + } + void initPhysics(); + + void exitPhysics(); + + virtual ~ConcaveDemo() + { + exitPhysics(); + } + + virtual void clientMoveAndDisplay(); + + virtual void displayCallback(); + + //to show refit works + void setVertexPositions(float waveheight, float offset); + + virtual void keyboardCallback(unsigned char key, int x, int y); + + static DemoApplication* Create() + { + ConcaveDemo* demo = new ConcaveDemo(); + demo->myinit(); + demo->initPhysics(); + return demo; + }; +}; + +#endif //CONCAVE_DEMO_H + diff --git a/BulletPhysics/bulletTrunk/Demos/ConcaveDemo/ConcavePhysicsDemo.cpp b/BulletPhysics/bulletTrunk/Demos/ConcaveDemo/ConcavePhysicsDemo.cpp new file mode 100644 index 00000000..ab007844 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/ConcaveDemo/ConcavePhysicsDemo.cpp @@ -0,0 +1,454 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#include "btBulletDynamicsCommon.h" +#include "LinearMath/btIDebugDraw.h" +#include "GLDebugDrawer.h" +#include "ConcaveDemo.h" +#include "GL_ShapeDrawer.h" +#include "GlutStuff.h" + +//#define USE_PARALLEL_DISPATCHER 1 +#ifdef USE_PARALLEL_DISPATCHER +#include "../../Extras/BulletMultiThreaded/SpuGatheringCollisionDispatcher.h" +#include "../../Extras/BulletMultiThreaded/Win32ThreadSupport.h" +#include "../../Extras/BulletMultiThreaded/SpuNarrowPhaseCollisionTask/SpuGatheringCollisionTask.h" +#endif//USE_PARALLEL_DISPATCHER + + + + +static btVector3* gVertices=0; +static int* gIndices=0; +static btBvhTriangleMeshShape* trimeshShape =0; +static btRigidBody* staticBody = 0; +static float waveheight = 5.f; + +const float TRIANGLE_SIZE=8.f; + + + +///User can override this material combiner by implementing gContactAddedCallback and setting body0->m_collisionFlags |= btCollisionObject::customMaterialCallback; +inline btScalar calculateCombinedFriction(float friction0,float friction1) +{ + btScalar friction = friction0 * friction1; + + const btScalar MAX_FRICTION = 10.f; + if (friction < -MAX_FRICTION) + friction = -MAX_FRICTION; + if (friction > MAX_FRICTION) + friction = MAX_FRICTION; + return friction; + +} + +inline btScalar calculateCombinedRestitution(float restitution0,float restitution1) +{ + return restitution0 * restitution1; +} + + + +static bool CustomMaterialCombinerCallback(btManifoldPoint& cp, const btCollisionObject* colObj0,int partId0,int index0,const btCollisionObject* colObj1,int partId1,int index1) +{ + + float friction0 = colObj0->getFriction(); + float friction1 = colObj1->getFriction(); + float restitution0 = colObj0->getRestitution(); + float restitution1 = colObj1->getRestitution(); + + if (colObj0->getCollisionFlags() & btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK) + { + friction0 = 1.0;//partId0,index0 + restitution0 = 0.f; + } + if (colObj1->getCollisionFlags() & btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK) + { + if (index1&1) + { + friction1 = 1.0f;//partId1,index1 + } else + { + friction1 = 0.f; + } + restitution1 = 0.f; + } + + cp.m_combinedFriction = calculateCombinedFriction(friction0,friction1); + cp.m_combinedRestitution = calculateCombinedRestitution(restitution0,restitution1); + + //this return value is currently ignored, but to be on the safe side: return false if you don't calculate friction + return true; +} + +extern ContactAddedCallback gContactAddedCallback; + + const int NUM_VERTS_X = 30; + const int NUM_VERTS_Y = 30; + const int totalVerts = NUM_VERTS_X*NUM_VERTS_Y; + +void ConcaveDemo::setVertexPositions(float waveheight, float offset) +{ + int i; + int j; + + for ( i=0;isetCollisionFlags( staticBody->getCollisionFlags() | btCollisionObject::CF_KINEMATIC_OBJECT); + staticBody->setActivationState(DISABLE_DEACTIVATION); + } else + { + staticBody->setCollisionFlags( staticBody->getCollisionFlags() & ~btCollisionObject::CF_KINEMATIC_OBJECT); + staticBody->forceActivationState(ACTIVE_TAG); + } + } + + DemoApplication::keyboardCallback(key,x,y); + +} + +void ConcaveDemo::initPhysics() +{ + + setTexturing(true); + setShadows(false);//true); + + #define TRISIZE 10.f + + gContactAddedCallback = CustomMaterialCombinerCallback; + +#define USE_TRIMESH_SHAPE 1 +#ifdef USE_TRIMESH_SHAPE + + int vertStride = sizeof(btVector3); + int indexStride = 3*sizeof(int); + + + const int totalTriangles = 2*(NUM_VERTS_X-1)*(NUM_VERTS_Y-1); + + gVertices = new btVector3[totalVerts]; + gIndices = new int[totalTriangles*3]; + + int i; + + + setVertexPositions(waveheight,0.f); + + int index=0; + for ( i=0;igetOptimizedBvh()->calculateSerializeBufferSize(); + buffer = btAlignedAlloc(numBytes,16); + bool swapEndian = false; + trimeshShape->getOptimizedBvh()->serialize(buffer,numBytes,swapEndian); + FILE* file = fopen("bvh.bin","wb"); + fwrite(buffer,1,numBytes,file); + fclose(file); + btAlignedFree(buffer); + + + +#else + + trimeshShape = new btBvhTriangleMeshShape(m_indexVertexArrays,useQuantizedAabbCompression,false); + + char* fileName = "bvh.bin"; + + FILE* file = fopen(fileName,"rb"); + int size=0; + btOptimizedBvh* bvh = 0; + + if (fseek(file, 0, SEEK_END) || (size = ftell(file)) == EOF || fseek(file, 0, SEEK_SET)) { /* File operations denied? ok, just close and return failure */ + printf("Error: cannot get filesize from %s\n", fileName); + exit(0); + } else + { + + fseek(file, 0, SEEK_SET); + + int buffersize = size+btOptimizedBvh::getAlignmentSerializationPadding(); + + void* buffer = btAlignedAlloc(buffersize,16); + int read = fread(buffer,1,size,file); + fclose(file); + bool swapEndian = false; + bvh = btOptimizedBvh::deSerializeInPlace(buffer,buffersize,swapEndian); + } + + trimeshShape->setOptimizedBvh(bvh); + +#endif + + btCollisionShape* groundShape = trimeshShape; + +#else + btCollisionShape* groundShape = new btBoxShape(btVector3(50,3,50)); + m_collisionShapes.push_back(groundShape); + +#endif //USE_TRIMESH_SHAPE + + m_collisionConfiguration = new btDefaultCollisionConfiguration(); + +#ifdef USE_PARALLEL_DISPATCHER + +#ifdef USE_WIN32_THREADING + + int maxNumOutstandingTasks = 4;//number of maximum outstanding tasks + Win32ThreadSupport* threadSupport = new Win32ThreadSupport(Win32ThreadSupport::Win32ThreadConstructionInfo( + "collision", + processCollisionTask, + createCollisionLocalStoreMemory, + maxNumOutstandingTasks)); +#else +///@todo show other platform threading +///Playstation 3 SPU (SPURS) version is available through PS3 Devnet +///Libspe2 SPU support will be available soon +///pthreads version +///you can hook it up to your custom task scheduler by deriving from btThreadSupportInterface +#endif + + m_dispatcher = new SpuGatheringCollisionDispatcher(threadSupport,maxNumOutstandingTasks,m_collisionConfiguration); +#else + m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); +#endif//USE_PARALLEL_DISPATCHER + + + btVector3 worldMin(-1000,-1000,-1000); + btVector3 worldMax(1000,1000,1000); + m_broadphase = new btAxisSweep3(worldMin,worldMax); + m_solver = new btSequentialImpulseConstraintSolver(); + m_dynamicsWorld = new btDiscreteDynamicsWorld(m_dispatcher,m_broadphase,m_solver,m_collisionConfiguration); +#ifdef USE_PARALLEL_DISPATCHER + m_dynamicsWorld->getDispatchInfo().m_enableSPU=true; +#endif //USE_PARALLEL_DISPATCHER + + float mass = 0.f; + btTransform startTransform; + startTransform.setIdentity(); + startTransform.setOrigin(btVector3(0,-2,0)); + +#ifdef USE_BOX_SHAPE + btCollisionShape* colShape = new btBoxShape(btVector3(1,1,1)); +#else + + btCompoundShape* colShape = new btCompoundShape; + btCollisionShape* cylinderShape = new btCylinderShapeX(btVector3(4,1,1)); + btCollisionShape* boxShape = new btBoxShape(btVector3(4,1,1)); + btTransform localTransform; + localTransform.setIdentity(); + colShape->addChildShape(localTransform,boxShape); + btQuaternion orn(SIMD_HALF_PI,0,0); + localTransform.setRotation(orn); + colShape->addChildShape(localTransform,cylinderShape); + +#endif //USE_BOX_SHAPE + + + m_collisionShapes.push_back(colShape); + + { + for (int i=0;i<10;i++) + { + startTransform.setOrigin(btVector3(2,10+i*2,1)); + localCreateRigidBody(1, startTransform,colShape); + } + } + + startTransform.setIdentity(); + staticBody = localCreateRigidBody(mass, startTransform,groundShape); + + staticBody->setCollisionFlags(staticBody->getCollisionFlags() | btCollisionObject::CF_KINEMATIC_OBJECT);//STATIC_OBJECT); + + //enable custom material callback + staticBody->setCollisionFlags(staticBody->getCollisionFlags() | btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK); + + + +} + +void ConcaveDemo::clientMoveAndDisplay() +{ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + float dt = getDeltaTimeMicroseconds() * 0.000001f; + + if (m_animatedMesh) + { + static float offset=0.f; + offset+=0.01f; + + // setVertexPositions(waveheight,offset); + + int i; + int j; + btVector3 aabbMin(1e30,1e30,1e30); + btVector3 aabbMax(-1e30,-1e30,-1e30); + + for ( i=NUM_VERTS_X/2-3;ipartialRefitTree(aabbMin,aabbMax); + + //clear all contact points involving mesh proxy. Note: this is a slow/unoptimized operation. + m_dynamicsWorld->getBroadphase()->getOverlappingPairCache()->cleanProxyFromPairs(staticBody->getBroadphaseHandle(),getDynamicsWorld()->getDispatcher()); + } + + m_dynamicsWorld->stepSimulation(dt); + + //optional but useful: debug drawing + m_dynamicsWorld->debugDrawWorld(); + + + renderme(); + + glFlush(); + glutSwapBuffers(); + +} + + + + +void ConcaveDemo::displayCallback(void) { + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + renderme(); + + //optional but useful: debug drawing + if (m_dynamicsWorld) + m_dynamicsWorld->debugDrawWorld(); + + + glFlush(); + glutSwapBuffers(); +} + + + +void ConcaveDemo::exitPhysics() +{ + + + + //cleanup in the reverse order of creation/initialization + + //remove the rigidbodies from the dynamics world and delete them + int i; + for (i=m_dynamicsWorld->getNumCollisionObjects()-1; i>=0 ;i--) + { + btCollisionObject* obj = m_dynamicsWorld->getCollisionObjectArray()[i]; + btRigidBody* body = btRigidBody::upcast(obj); + if (body && body->getMotionState()) + { + delete body->getMotionState(); + } + m_dynamicsWorld->removeCollisionObject( obj ); + delete obj; + } + + //delete collision shapes + for (int j=0;jinitPhysics(); + concaveDemo->setCameraDistance(30.f); + concaveDemo->getDynamicsWorld()->setDebugDrawer(&gDebugDrawer); + + return glutmain(argc, argv,640,480,"Static Concave Mesh Demo",concaveDemo); +} + diff --git a/BulletPhysics/bulletTrunk/Demos/ConcaveRaycastDemo/ConcaveRaycastDemo.cpp b/BulletPhysics/bulletTrunk/Demos/ConcaveRaycastDemo/ConcaveRaycastDemo.cpp new file mode 100644 index 00000000..49e2207e --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/ConcaveRaycastDemo/ConcaveRaycastDemo.cpp @@ -0,0 +1,493 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#include "btBulletDynamicsCommon.h" +#include "LinearMath/btIDebugDraw.h" +#include "GLDebugDrawer.h" +#include "ConcaveRaycastDemo.h" +#include "GL_ShapeDrawer.h" +#include "GlutStuff.h" + +//#define BATCH_RAYCASTER + +#ifdef BATCH_RAYCASTER +#include "BulletMultiThreaded/SpuBatchRaycaster.h" +static SpuBatchRaycaster* gBatchRaycaster = NULL; +#endif + +#ifdef USE_LIBSPE2 +#include "BulletMultiThreaded/SpuLibspe2Support.h" +#elif defined (WIN32) +#include "BulletMultiThreaded/Win32ThreadSupport.h" +#else +//other platforms run the parallel code sequentially (until pthread support or other parallel implementation is added) +#include "BulletMultiThreaded/SequentialThreadSupport.h" +#endif //USE_LIBSPE2 + +static btVector3* gVertices=0; +static int* gIndices=0; +static btBvhTriangleMeshShape* trimeshShape =0; +static btRigidBody* staticBody = 0; +static float waveheight = 5.f; + +const float TRIANGLE_SIZE=8.f; + + +/* Scrolls back and forth over terrain */ +#define NUMRAYS_IN_BAR 100 +class btRaycastBar +{ +public: + btVector3 source[NUMRAYS_IN_BAR]; + btVector3 dest[NUMRAYS_IN_BAR]; + btVector3 direction[NUMRAYS_IN_BAR]; + btVector3 hit[NUMRAYS_IN_BAR]; + btVector3 normal[NUMRAYS_IN_BAR]; + + int frame_counter; + int ms; + int sum_ms; + int sum_ms_samples; + int min_ms; + int max_ms; + +#ifdef USE_BT_CLOCK + btClock frame_timer; +#endif //USE_BT_CLOCK + + btScalar dx; + btScalar min_x; + btScalar max_x; + btScalar min_y; + btScalar max_y; + btScalar sign; + + btRaycastBar () + { + ms = 0; + max_ms = 0; + min_ms = 9999.0; + sum_ms_samples = 0; + sum_ms = 0; + } + + btRaycastBar (bool unused, btScalar ray_length, btScalar min_z, btScalar max_z, btScalar min_y = -10, btScalar max_y = 10) + { + frame_counter = 0; + ms = 0; + max_ms = 0; + min_ms = 9999.0; + sum_ms_samples = 0; + sum_ms = 0; + dx = 10.0; + min_x = -40; + max_x = 20; + this->min_y = min_y; + this->max_y = max_y; + sign = 1.0; + btScalar dalpha = 2*SIMD_2_PI/NUMRAYS_IN_BAR; + for (int i = 0; i < NUMRAYS_IN_BAR; i++) + { + btScalar z = (max_z-min_z)/NUMRAYS_IN_BAR * i + min_z; + source[i] = btVector3(min_x, max_y, z); + dest[i] = btVector3(min_x + ray_length, min_y, z); + normal[i] = btVector3(1.0, 0.0, 0.0); + } + } + + btRaycastBar (btScalar ray_length, btScalar z, btScalar min_y = -1000, btScalar max_y = 10) + { + frame_counter = 0; + ms = 0; + max_ms = 0; + min_ms = 9999.0; + sum_ms_samples = 0; + sum_ms = 0; + dx = 10.0; + min_x = -40; + max_x = 20; + this->min_y = min_y; + this->max_y = max_y; + sign = 1.0; + btScalar dalpha = 2*SIMD_2_PI/NUMRAYS_IN_BAR; + for (int i = 0; i < NUMRAYS_IN_BAR; i++) + { + btScalar alpha = dalpha * i; + // rotate around by alpha degrees y + btTransform tr (btQuaternion (btVector3(0.0, 1.0, 0.0), alpha)); + direction[i] = btVector3(1.0, 0.0, 0.0); + direction[i] = tr* direction[i]; + direction[i] = direction[i] * ray_length; + source[i] = btVector3(min_x, max_y, z); + dest[i] = source[i] + direction[i]; + dest[i][1] = min_y; + normal[i] = btVector3(1.0, 0.0, 0.0); + } + } + + void move (btScalar dt) + { + if (dt > (1.0/60.0)) + dt = 1.0/60.0; + for (int i = 0; i < NUMRAYS_IN_BAR; i++) + { + source[i][0] += dx * dt * sign; + dest[i][0] += dx * dt * sign; + } + if (source[0][0] < min_x) + sign = 1.0; + else if (source[0][0] > max_x) + sign = -1.0; + } + + void cast (btCollisionWorld* cw) + { +#ifdef USE_BT_CLOCK + frame_timer.reset (); +#endif //USE_BT_CLOCK + +#ifdef BATCH_RAYCASTER + if (!gBatchRaycaster) + return; + + gBatchRaycaster->clearRays (); + for (int i = 0; i < NUMRAYS_IN_BAR; i++) + { + gBatchRaycaster->addRay (source[i], dest[i]); + } + gBatchRaycaster->performBatchRaycast (); + for (int i = 0; i < gBatchRaycaster->getNumRays (); i++) + { + const SpuRaycastTaskWorkUnitOut& out = (*gBatchRaycaster)[i]; + hit[i].setInterpolate3(source[i],dest[i],out.hitFraction); + normal[i] = out.hitNormal; + normal[i].normalize (); + } +#else + for (int i = 0; i < NUMRAYS_IN_BAR; i++) + { + btCollisionWorld::ClosestRayResultCallback cb(source[i], dest[i]); + + cw->rayTest (source[i], dest[i], cb); + if (cb.hasHit ()) + { + hit[i] = cb.m_hitPointWorld; + normal[i] = cb.m_hitNormalWorld; + normal[i].normalize (); + } else { + hit[i] = dest[i]; + normal[i] = btVector3(1.0, 0.0, 0.0); + } + + } +#ifdef USE_BT_CLOCK + ms += frame_timer.getTimeMilliseconds (); +#endif //USE_BT_CLOCK + frame_counter++; + if (frame_counter > 50) + { + min_ms = ms < min_ms ? ms : min_ms; + max_ms = ms > max_ms ? ms : max_ms; + sum_ms += ms; + sum_ms_samples++; + btScalar mean_ms = (btScalar)sum_ms/(btScalar)sum_ms_samples; + printf("%d rays in %d ms %d %d %f\n", NUMRAYS_IN_BAR * frame_counter, ms, min_ms, max_ms, mean_ms); + ms = 0; + frame_counter = 0; + } +#endif + } + + void draw () + { + glDisable (GL_LIGHTING); + glColor3f (0.0, 1.0, 0.0); + glBegin (GL_LINES); + int i; + + for (i = 0; i < NUMRAYS_IN_BAR; i++) + { + glVertex3f (source[i][0], source[i][1], source[i][2]); + glVertex3f (hit[i][0], hit[i][1], hit[i][2]); + } + glEnd (); + glColor3f (1.0, 1.0, 1.0); + glBegin (GL_LINES); + for (i = 0; i < NUMRAYS_IN_BAR; i++) + { + glVertex3f (hit[i][0], hit[i][1], hit[i][2]); + glVertex3f (hit[i][0] + normal[i][0], hit[i][1] + normal[i][1], hit[i][2] + normal[i][2]); + } + glEnd (); + glColor3f (0.0, 1.0, 1.0); + glBegin (GL_POINTS); + for ( i = 0; i < NUMRAYS_IN_BAR; i++) + { + glVertex3f (hit[i][0], hit[i][1], hit[i][2]); + } + glEnd (); + glEnable (GL_LIGHTING); + } +}; + + +static btRaycastBar raycastBar; + + +const int NUM_VERTS_X = 30; +const int NUM_VERTS_Y = 30; +const int totalVerts = NUM_VERTS_X*NUM_VERTS_Y; + +void ConcaveRaycastDemo::setVertexPositions(float waveheight, float offset) +{ + int i; + int j; + + for ( i=0;isetCollisionFlags( staticBody->getCollisionFlags() | btCollisionObject::CF_KINEMATIC_OBJECT); + staticBody->setActivationState(DISABLE_DEACTIVATION); + } else + { + staticBody->setCollisionFlags( staticBody->getCollisionFlags() & ~btCollisionObject::CF_KINEMATIC_OBJECT); + staticBody->forceActivationState(ACTIVE_TAG); + } + } + + DemoApplication::keyboardCallback(key,x,y); + +} + +void ConcaveRaycastDemo::initPhysics() +{ + #define TRISIZE 10.f + + + + int vertStride = sizeof(btVector3); + int indexStride = 3*sizeof(int); + + + const int totalTriangles = 2*(NUM_VERTS_X-1)*(NUM_VERTS_Y-1); + + gVertices = new btVector3[totalVerts]; + gIndices = new int[totalTriangles*3]; + + int i; + + + setVertexPositions(waveheight,0.f); + + int index=0; + for ( i=0;isetCollisionFlags(staticBody->getCollisionFlags() | btCollisionObject::CF_STATIC_OBJECT); + +#ifdef BATCH_RAYCASTER +int maxNumOutstandingTasks = 4; + +#ifdef USE_WIN32_THREADING + Win32ThreadSupport::Win32ThreadConstructionInfo tci("batch raycast", + processRaycastTask, + createRaycastLocalStoreMemory, + maxNumOutstandingTasks); + m_threadSupportRaycast = new Win32ThreadSupport(tci); + printf("m_threadSupportRaycast = %p\n", m_threadSupportRaycast); +#endif + + gBatchRaycaster = new SpuBatchRaycaster (m_threadSupportRaycast, maxNumOutstandingTasks, m_dynamicsWorld->getCollisionObjectArray(), m_dynamicsWorld->getNumCollisionObjects()); +#endif + + raycastBar = btRaycastBar (4000.0, 0.0); + //raycastBar = btRaycastBar (true, 40.0, -50.0, 50.0); +} + +void ConcaveRaycastDemo::clientMoveAndDisplay() +{ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + float dt = getDeltaTimeMicroseconds() * 0.000001f; + + if (m_animatedMesh) + { + static float offset=0.f; + offset+=0.01f; + + setVertexPositions(waveheight,offset); + + btVector3 worldMin(-1000,-1000,-1000); + btVector3 worldMax(1000,1000,1000); + + trimeshShape->refitTree(worldMin,worldMax); + + //clear all contact points involving mesh proxy. Note: this is a slow/unoptimized operation. + m_dynamicsWorld->getBroadphase()->getOverlappingPairCache()->cleanProxyFromPairs(staticBody->getBroadphaseHandle(),getDynamicsWorld()->getDispatcher()); + } + + m_dynamicsWorld->stepSimulation(dt); + + //optional but useful: debug drawing + m_dynamicsWorld->debugDrawWorld(); + + raycastBar.move (dt); + raycastBar.cast (m_dynamicsWorld); + renderme(); + raycastBar.draw (); + glFlush(); + glutSwapBuffers(); + +} + + + + +void ConcaveRaycastDemo::displayCallback(void) { + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + renderme(); + raycastBar.draw (); + glFlush(); + glutSwapBuffers(); +} + + + +void ConcaveRaycastDemo::exitPhysics() +{ + + + + //cleanup in the reverse order of creation/initialization + + //remove the rigidbodies from the dynamics world and delete them + int i; + for (i=m_dynamicsWorld->getNumCollisionObjects()-1; i>=0 ;i--) + { + btCollisionObject* obj = m_dynamicsWorld->getCollisionObjectArray()[i]; + btRigidBody* body = btRigidBody::upcast(obj); + if (body && body->getMotionState()) + { + delete body->getMotionState(); + } + m_dynamicsWorld->removeCollisionObject( obj ); + delete obj; + } + + //delete collision shapes + for (int j=0;j m_collisionShapes; + + btTriangleIndexVertexArray* m_indexVertexArrays; + + btBroadphaseInterface* m_broadphase; + + btCollisionDispatcher* m_dispatcher; + + btConstraintSolver* m_solver; + + class btThreadSupportInterface* m_threadSupportRaycast; + + btDefaultCollisionConfiguration* m_collisionConfiguration; + + bool m_animatedMesh; + + public: + + ConcaveRaycastDemo() : m_animatedMesh(false) + { + + } + void initPhysics(); + + void exitPhysics(); + + virtual ~ConcaveRaycastDemo() + { + exitPhysics(); + } + + virtual void clientMoveAndDisplay(); + + virtual void displayCallback(); + + //to show refit works + void setVertexPositions(float waveheight, float offset); + + virtual void keyboardCallback(unsigned char key, int x, int y); + + static DemoApplication* Create() + { + ConcaveRaycastDemo* demo = new ConcaveRaycastDemo(); + demo->myinit(); + demo->initPhysics(); + return demo; + }; +}; + +#endif //CONCAVE_RAYCAST_DEMO_H + diff --git a/BulletPhysics/bulletTrunk/Demos/ConcaveRaycastDemo/main.cpp b/BulletPhysics/bulletTrunk/Demos/ConcaveRaycastDemo/main.cpp new file mode 100644 index 00000000..03fe36f0 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/ConcaveRaycastDemo/main.cpp @@ -0,0 +1,15 @@ + +#include "ConcaveRaycastDemo.h" +#include "GlutStuff.h" + + +int main(int argc,char** argv) +{ + + ConcaveRaycastDemo* concaveRaycastDemo = new ConcaveRaycastDemo(); + concaveRaycastDemo->initPhysics(); + concaveRaycastDemo->setCameraDistance(30.f); + + return glutmain(argc, argv,640,480,"Concave Raycast Demo",concaveRaycastDemo); +} + diff --git a/BulletPhysics/bulletTrunk/Demos/ConstraintDemo/CMakeLists.txt b/BulletPhysics/bulletTrunk/Demos/ConstraintDemo/CMakeLists.txt new file mode 100644 index 00000000..c99fe573 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/ConstraintDemo/CMakeLists.txt @@ -0,0 +1,26 @@ +# This is basically the overall name of the project in Visual Studio this is the name of the Solution File + + +# For every executable you have with a main method you should have an add_executable line below. +# For every add executable line you should list every .cpp and .h file you have associated with that executable. + + + +# You shouldn't have to modify anything below this line +######################################################## + + + +INCLUDE_DIRECTORIES( +${BULLET_PHYSICS_SOURCE_DIR}/src ${BULLET_PHYSICS_SOURCE_DIR}/Demos/OpenGL } +) + +LINK_LIBRARIES( +OpenGLSupport BulletDynamics BulletCollision LinearMath ${GLUT_glut_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} +) + +ADD_EXECUTABLE(AppConstraintDemo + ConstraintDemo.cpp + main.cpp +) + diff --git a/BulletPhysics/bulletTrunk/Demos/ConstraintDemo/ConstraintDemo.cpp b/BulletPhysics/bulletTrunk/Demos/ConstraintDemo/ConstraintDemo.cpp new file mode 100644 index 00000000..e6d97ffa --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/ConstraintDemo/ConstraintDemo.cpp @@ -0,0 +1,433 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + + + + +#include "btBulletDynamicsCommon.h" +#include "LinearMath/btIDebugDraw.h" + +#include "GLDebugDrawer.h" + +#include "BMF_Api.h" +#include //printf debugging + +#include "ConstraintDemo.h" +#include "GL_ShapeDrawer.h" +#include "GlutStuff.h" + +const int numObjects = 3; + +#define CUBE_HALF_EXTENTS 1.f + +#define M_PI 3.1415926f +#define M_PI_2 ((M_PI)*0.5f) +#define M_PI_4 ((M_PI)*0.25f) + +btTransform sliderTransform; +btVector3 lowerSliderLimit = btVector3(-10,0,0); +btVector3 hiSliderLimit = btVector3(10,0,0); + +btRigidBody* d6body0 =0; + +btHingeConstraint* spDoorHinge = NULL; + +void drawLimit() +{ + btVector3 from = sliderTransform*lowerSliderLimit; + btVector3 to = sliderTransform*hiSliderLimit; + btVector3 color(255,0,0); + glBegin(GL_LINES); + glColor3f(color.getX(), color.getY(), color.getZ()); + glVertex3d(from.getX(), from.getY(), from.getZ()); + glVertex3d(to.getX(), to.getY(), to.getZ()); + if (d6body0) + { + from = d6body0->getWorldTransform().getOrigin(); + to = from + d6body0->getWorldTransform().getBasis() * btVector3(0,0,10); + glVertex3d(from.getX(), from.getY(), from.getZ()); + glVertex3d(to.getX(), to.getY(), to.getZ()); + } + glEnd(); +} + + + +void ConstraintDemo::initPhysics() +{ + setTexturing(true); + setShadows(true); + + setCameraDistance(26.f); + + m_collisionConfiguration = new btDefaultCollisionConfiguration(); + m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); + btVector3 worldMin(-1000,-1000,-1000); + btVector3 worldMax(1000,1000,1000); + m_overlappingPairCache = new btAxisSweep3(worldMin,worldMax); + m_constraintSolver = new btSequentialImpulseConstraintSolver(); + m_dynamicsWorld = new btDiscreteDynamicsWorld(m_dispatcher,m_overlappingPairCache,m_constraintSolver,m_collisionConfiguration); + + + btCollisionShape* groundShape = new btBoxShape(btVector3(btScalar(50.),btScalar(40.),btScalar(50.))); + m_collisionShapes.push_back(groundShape); + btTransform groundTransform; + groundTransform.setIdentity(); + groundTransform.setOrigin(btVector3(0,-56,0)); + btRigidBody* groundBody = localCreateRigidBody(0, groundTransform, groundShape); + + + + btCollisionShape* shape = new btBoxShape(btVector3(CUBE_HALF_EXTENTS,CUBE_HALF_EXTENTS,CUBE_HALF_EXTENTS)); + m_collisionShapes.push_back(shape); + btTransform trans; + trans.setIdentity(); + trans.setOrigin(btVector3(0,20,0)); + + float mass = 1.f; +#if 1 + //point to point constraint (ball socket) + { + btRigidBody* body0 = localCreateRigidBody( mass,trans,shape); + trans.setOrigin(btVector3(2*CUBE_HALF_EXTENTS,20,0)); + + mass = 1.f; + btRigidBody* body1 = 0;//localCreateRigidBody( mass,trans,shape); +// btRigidBody* body1 = localCreateRigidBody( 0.0,trans,0); + //body1->setActivationState(DISABLE_DEACTIVATION); + //body1->setDamping(0.3,0.3); + + btVector3 pivotInA(CUBE_HALF_EXTENTS,-CUBE_HALF_EXTENTS,-CUBE_HALF_EXTENTS); + btVector3 axisInA(0,0,1); + + btVector3 pivotInB = body1 ? body1->getCenterOfMassTransform().inverse()(body0->getCenterOfMassTransform()(pivotInA)) : pivotInA; + btVector3 axisInB = body1? + (body1->getCenterOfMassTransform().getBasis().inverse()*(body1->getCenterOfMassTransform().getBasis() * axisInA)) : + body0->getCenterOfMassTransform().getBasis() * axisInA; + + //btTypedConstraint* p2p = new btPoint2PointConstraint(*body0,*body1,pivotInA,pivotInB); + //btTypedConstraint* hinge = new btHingeConstraint(*body0,*body1,pivotInA,pivotInB,axisInA,axisInB); + btHingeConstraint* hinge = new btHingeConstraint(*body0,pivotInA,axisInA); + + //use zero targetVelocity and a small maxMotorImpulse to simulate joint friction + //float targetVelocity = 0.f; + //float maxMotorImpulse = 0.01; + float targetVelocity = 1.f; + float maxMotorImpulse = 1.0f; + hinge->enableAngularMotor(true,targetVelocity,maxMotorImpulse); + + m_dynamicsWorld->addConstraint(hinge);//p2p); +// m_dynamicsWorld->addConstraint(p2p); + hinge->setDbgDrawSize(btScalar(5.f)); + + } +#endif + +#if 1 + //create a slider, using the generic D6 constraint + { + mass = 1.f; + btVector3 sliderWorldPos(0,10,0); + btVector3 sliderAxis(1,0,0); + btScalar angle=0.f;//SIMD_RADS_PER_DEG * 10.f; + btMatrix3x3 sliderOrientation(btQuaternion(sliderAxis ,angle)); + trans.setIdentity(); + trans.setOrigin(sliderWorldPos); + //trans.setBasis(sliderOrientation); + sliderTransform = trans; + + d6body0 = localCreateRigidBody( mass,trans,shape); + d6body0->setActivationState(DISABLE_DEACTIVATION); + btRigidBody* fixedBody1 = localCreateRigidBody(0,trans,0); + m_dynamicsWorld->addRigidBody(fixedBody1); + + btTransform frameInA, frameInB; + frameInA = btTransform::getIdentity(); + frameInB = btTransform::getIdentity(); + +// bool useLinearReferenceFrameA = false;//use fixed frame B for linear llimits + bool useLinearReferenceFrameA = true;//use fixed frame A for linear llimits + btGeneric6DofConstraint* slider = new btGeneric6DofConstraint(*fixedBody1, *d6body0,frameInA,frameInB,useLinearReferenceFrameA); + slider->setLinearLowerLimit(lowerSliderLimit); + slider->setLinearUpperLimit(hiSliderLimit); + + //range should be small, otherwise singularities will 'explode' the constraint + slider->setAngularLowerLimit(btVector3(-1.5,0,0)); + slider->setAngularUpperLimit(btVector3(1.5,0,0)); +// slider->setAngularLowerLimit(btVector3(0,0,0)); +// slider->setAngularUpperLimit(btVector3(0,0,0)); + + slider->getTranslationalLimitMotor()->m_enableMotor[0] = true; + slider->getTranslationalLimitMotor()->m_targetVelocity[0] = -5.0f; + slider->getTranslationalLimitMotor()->m_maxMotorForce[0] = 0.1f; + + + m_dynamicsWorld->addConstraint(slider); + slider->setDbgDrawSize(btScalar(5.f)); + + } +#endif +#if 1 + { // create a door using hinge constraint attached to the world + btCollisionShape* pDoorShape = new btBoxShape(btVector3(2.0f, 5.0f, 0.2f)); + m_collisionShapes.push_back(pDoorShape); + btTransform doorTrans; + doorTrans.setIdentity(); + doorTrans.setOrigin(btVector3(-5.0f, -2.0f, 0.0f)); + btRigidBody* pDoorBody = localCreateRigidBody( 1.0, doorTrans, pDoorShape); + pDoorBody->setActivationState(DISABLE_DEACTIVATION); + const btVector3 btPivotA( 2.1f, -2.0f, 0.0f ); // right next to the door slightly outside + btVector3 btAxisA( 0.0f, 1.0f, 0.0f ); // pointing upwards, aka Y-axis + + spDoorHinge = new btHingeConstraint( *pDoorBody, btPivotA, btAxisA ); + + spDoorHinge->setLimit( 0.0f, M_PI_2 ); + m_dynamicsWorld->addConstraint(spDoorHinge); + spDoorHinge->setDbgDrawSize(btScalar(5.f)); + + //doorTrans.setOrigin(btVector3(-5.0f, 2.0f, 0.0f)); + //btRigidBody* pDropBody = localCreateRigidBody( 10.0, doorTrans, shape); + } +#endif +#if 1 + { // create a generic 6DOF constraint + + btTransform tr; + tr.setIdentity(); + tr.setOrigin(btVector3(btScalar(10.), btScalar(6.), btScalar(0.))); + tr.getBasis().setEulerZYX(0,0,0); +// btRigidBody* pBodyA = localCreateRigidBody( mass, tr, shape); + btRigidBody* pBodyA = localCreateRigidBody( 0.0, tr, shape); +// btRigidBody* pBodyA = localCreateRigidBody( 0.0, tr, 0); + pBodyA->setActivationState(DISABLE_DEACTIVATION); + + tr.setIdentity(); + tr.setOrigin(btVector3(btScalar(0.), btScalar(6.), btScalar(0.))); + tr.getBasis().setEulerZYX(0,0,0); + btRigidBody* pBodyB = localCreateRigidBody(1.0, tr, shape); + pBodyB->setActivationState(DISABLE_DEACTIVATION); + + btTransform frameInA, frameInB; + frameInA = btTransform::getIdentity(); + frameInA.setOrigin(btVector3(btScalar(-5.), btScalar(0.), btScalar(0.))); + frameInB = btTransform::getIdentity(); + frameInB.setOrigin(btVector3(btScalar(5.), btScalar(0.), btScalar(0.))); + + btGeneric6DofConstraint* pGen6DOF = new btGeneric6DofConstraint(*pBodyA, *pBodyB, frameInA, frameInB, true); +// btGeneric6DofConstraint* pGen6DOF = new btGeneric6DofConstraint(*pBodyA, *pBodyB, frameInA, frameInB, false); + pGen6DOF->setLinearLowerLimit(btVector3(-10., -2., -1.)); + pGen6DOF->setLinearUpperLimit(btVector3(10., 2., 1.)); + pGen6DOF->setLinearLowerLimit(btVector3(-10., 0., 0.)); +// pGen6DOF->setLinearUpperLimit(btVector3(10., 0., 0.)); +// pGen6DOF->setLinearLowerLimit(btVector3(0., 0., 0.)); +// pGen6DOF->setLinearUpperLimit(btVector3(0., 0., 0.)); + +// pGen6DOF->getTranslationalLimitMotor()->m_enableMotor[0] = true; +// pGen6DOF->getTranslationalLimitMotor()->m_targetVelocity[0] = 5.0f; +// pGen6DOF->getTranslationalLimitMotor()->m_maxMotorForce[0] = 0.1f; + + +// pGen6DOF->setAngularLowerLimit(btVector3(0., SIMD_HALF_PI*0.9, 0.)); +// pGen6DOF->setAngularUpperLimit(btVector3(0., -SIMD_HALF_PI*0.9, 0.)); +// pGen6DOF->setAngularLowerLimit(btVector3(0., 0., -SIMD_HALF_PI)); +// pGen6DOF->setAngularUpperLimit(btVector3(0., 0., SIMD_HALF_PI)); + + pGen6DOF->setAngularLowerLimit(btVector3(-SIMD_HALF_PI * 0.5f, -0.75, -SIMD_HALF_PI * 0.8f)); + pGen6DOF->setAngularUpperLimit(btVector3(SIMD_HALF_PI * 0.5f, 0.75, SIMD_HALF_PI * 0.8f)); +// pGen6DOF->setAngularLowerLimit(btVector3(0.f, -0.75, SIMD_HALF_PI * 0.8f)); +// pGen6DOF->setAngularUpperLimit(btVector3(0.f, 0.75, -SIMD_HALF_PI * 0.8f)); +// pGen6DOF->setAngularLowerLimit(btVector3(0.f, -SIMD_HALF_PI * 0.8f, SIMD_HALF_PI * 1.98f)); +// pGen6DOF->setAngularUpperLimit(btVector3(0.f, SIMD_HALF_PI * 0.8f, -SIMD_HALF_PI * 1.98f)); + + + +// pGen6DOF->setAngularLowerLimit(btVector3(-0.75,-0.5, -0.5)); +// pGen6DOF->setAngularUpperLimit(btVector3(0.75,0.5, 0.5)); +// pGen6DOF->setAngularLowerLimit(btVector3(-0.75,0., 0.)); +// pGen6DOF->setAngularUpperLimit(btVector3(0.75,0., 0.)); + + m_dynamicsWorld->addConstraint(pGen6DOF, true); + pGen6DOF->setDbgDrawSize(btScalar(5.f)); + } +#endif +#if 1 + { // create a ConeTwist constraint + + btTransform tr; + tr.setIdentity(); + tr.setOrigin(btVector3(btScalar(-10.), btScalar(5.), btScalar(0.))); + tr.getBasis().setEulerZYX(0,0,0); + btRigidBody* pBodyA = localCreateRigidBody( 1.0, tr, shape); +// btRigidBody* pBodyA = localCreateRigidBody( 0.0, tr, shape); + pBodyA->setActivationState(DISABLE_DEACTIVATION); + + tr.setIdentity(); + tr.setOrigin(btVector3(btScalar(-10.), btScalar(0.), btScalar(0.))); + tr.getBasis().setEulerZYX(0,0,0); + btRigidBody* pBodyB = localCreateRigidBody(0.0, tr, shape); +// btRigidBody* pBodyB = localCreateRigidBody(1.0, tr, shape); + + btTransform frameInA, frameInB; + frameInA = btTransform::getIdentity(); + frameInA.getBasis().setEulerZYX(0, 0, M_PI_2); + frameInA.setOrigin(btVector3(btScalar(0.), btScalar(-1.), btScalar(0.))); + frameInB = btTransform::getIdentity(); + frameInB.getBasis().setEulerZYX(0,0, M_PI_2); + frameInB.setOrigin(btVector3(btScalar(0.), btScalar(4.), btScalar(0.))); + + btConeTwistConstraint* pCT = new btConeTwistConstraint(*pBodyA, *pBodyB, frameInA, frameInB); +// pCT->setLimit(btScalar(M_PI_4), btScalar(M_PI_4), btScalar(M_PI) * 0.8f); + pCT->setLimit(btScalar(M_PI_4), btScalar(M_PI_4), btScalar(M_PI) * 0.8f, 1.0f); // soft limit == hard limit + m_dynamicsWorld->addConstraint(pCT, true); + pCT->setDbgDrawSize(btScalar(5.f)); + } +#endif +#if 1 + { // Hinge connected to the world, with motor (to hinge motor with new and old constraint solver) + btTransform tr; + tr.setIdentity(); + tr.setOrigin(btVector3(btScalar(0.), btScalar(0.), btScalar(0.))); + btRigidBody* pBody = localCreateRigidBody( 1.0, tr, shape); + pBody->setActivationState(DISABLE_DEACTIVATION); + const btVector3 btPivotA( 10.0f, 0.0f, 0.0f ); + btVector3 btAxisA( 0.0f, 0.0f, 1.0f ); + + btHingeConstraint* pHinge = new btHingeConstraint( *pBody, btPivotA, btAxisA ); +// pHinge->enableAngularMotor(true, -1.0, 0.165); // use for the old solver + pHinge->enableAngularMotor(true, -1.0, 1.65); // use for the new SIMD solver + m_dynamicsWorld->addConstraint(pHinge); + pHinge->setDbgDrawSize(btScalar(5.f)); + } +#endif +} + +ConstraintDemo::~ConstraintDemo() +{ + //cleanup in the reverse order of creation/initialization + + int i; + + //removed/delete constraints + for (i=m_dynamicsWorld->getNumConstraints()-1; i>=0 ;i--) + { + btTypedConstraint* constraint = m_dynamicsWorld->getConstraint(i); + m_dynamicsWorld->removeConstraint(constraint); + delete constraint; + } + + //remove the rigidbodies from the dynamics world and delete them + for (i=m_dynamicsWorld->getNumCollisionObjects()-1; i>=0 ;i--) + { + btCollisionObject* obj = m_dynamicsWorld->getCollisionObjectArray()[i]; + btRigidBody* body = btRigidBody::upcast(obj); + if (body && body->getMotionState()) + { + delete body->getMotionState(); + } + m_dynamicsWorld->removeCollisionObject( obj ); + delete obj; + } + + + + + //delete collision shapes + for (int j=0;jstepSimulation(dt,maxSimSubSteps); + + //optional but useful: debug drawing + m_dynamicsWorld->debugDrawWorld(); + + bool verbose = false; + if (verbose) + { + if (!numSimSteps) + printf("Interpolated transforms\n"); + else + { + if (numSimSteps > maxSimSubSteps) + { + //detect dropping frames + printf("Dropped (%i) simulation steps out of %i\n",numSimSteps - maxSimSubSteps,numSimSteps); + } else + { + printf("Simulated (%i) steps\n",numSimSteps); + } + } + } + } + renderme(); + +// drawLimit(); + + glFlush(); + glutSwapBuffers(); +} + + + + +void ConstraintDemo::displayCallback(void) { + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + if (m_dynamicsWorld) + m_dynamicsWorld->debugDrawWorld(); + +// drawLimit(); + + renderme(); + + glFlush(); + glutSwapBuffers(); +} + + diff --git a/BulletPhysics/bulletTrunk/Demos/ConstraintDemo/ConstraintDemo.h b/BulletPhysics/bulletTrunk/Demos/ConstraintDemo/ConstraintDemo.h new file mode 100644 index 00000000..a583774b --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/ConstraintDemo/ConstraintDemo.h @@ -0,0 +1,56 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ +#ifndef CONSTRAINT_DEMO_H +#define CONSTRAINT_DEMO_H + +#include "DemoApplication.h" + +///ConstraintDemo shows how to create a constraint, like Hinge or btGenericD6constraint +class ConstraintDemo : public DemoApplication +{ + //keep track of variables to delete memory at the end + btAlignedObjectArray m_collisionShapes; + + class btBroadphaseInterface* m_overlappingPairCache; + + class btCollisionDispatcher* m_dispatcher; + + class btConstraintSolver* m_constraintSolver; + + class btDefaultCollisionConfiguration* m_collisionConfiguration; + + public: + + + virtual ~ConstraintDemo(); + + void initPhysics(); + + virtual void clientMoveAndDisplay(); + + virtual void displayCallback(); + + static DemoApplication* Create() + { + ConstraintDemo* demo = new ConstraintDemo(); + demo->myinit(); + demo->initPhysics(); + return demo; + } + +}; + +#endif //CONSTRAINT_DEMO_H + diff --git a/BulletPhysics/bulletTrunk/Demos/ConstraintDemo/Jamfile b/BulletPhysics/bulletTrunk/Demos/ConstraintDemo/Jamfile new file mode 100644 index 00000000..e66af032 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/ConstraintDemo/Jamfile @@ -0,0 +1,3 @@ +SubDir TOP Demos ConstraintDemo ; + +BulletDemo ConstraintDemo : [ Wildcard *.h *.cpp ] ; diff --git a/BulletPhysics/bulletTrunk/Demos/ConstraintDemo/main.cpp b/BulletPhysics/bulletTrunk/Demos/ConstraintDemo/main.cpp new file mode 100644 index 00000000..c5e85384 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/ConstraintDemo/main.cpp @@ -0,0 +1,20 @@ +#include "ConstraintDemo.h" +#include "GlutStuff.h" +#include "GLDebugDrawer.h" +#include "btBulletDynamicsCommon.h" + +int main(int argc,char** argv) +{ + + GLDebugDrawer gDebugDrawer; + + ConstraintDemo* constraintDemo = new ConstraintDemo(); + + + constraintDemo->initPhysics(); + constraintDemo->getDynamicsWorld()->setDebugDrawer(&gDebugDrawer); + constraintDemo->setDebugMode(btIDebugDraw::DBG_DrawConstraints+btIDebugDraw::DBG_DrawConstraintLimits); + + return glutmain(argc, argv,640,480,"Constraint Demo. http://www.continuousphysics.com/Bullet/phpBB2/",constraintDemo); +} + diff --git a/BulletPhysics/bulletTrunk/Demos/ContinuousConvexCollision/ContinuousConvexCollision.h b/BulletPhysics/bulletTrunk/Demos/ContinuousConvexCollision/ContinuousConvexCollision.h new file mode 100644 index 00000000..46861ae4 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/ContinuousConvexCollision/ContinuousConvexCollision.h @@ -0,0 +1,35 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ +#ifndef CONTINUOUS_CONVEX_COLLISION_DEMO_H +#define CONTINUOUS_CONVEX_COLLISION_DEMO_H + +#include "DemoApplication.h" + +///ContinuousConvexCollisionDemo shows the working of the continuous collision detection, including linear and angular motion +class btContinuousConvexCollisionDemo : public DemoApplication +{ + public: + + void initPhysics(); + + virtual void clientMoveAndDisplay(); + + virtual void displayCallback(); + + +}; + +#endif //CONTINUOUS_CONVEX_COLLISION_DEMO_H + diff --git a/BulletPhysics/bulletTrunk/Demos/ContinuousConvexCollision/ContinuousConvexCollisionDemo.cpp b/BulletPhysics/bulletTrunk/Demos/ContinuousConvexCollision/ContinuousConvexCollisionDemo.cpp new file mode 100644 index 00000000..350a3ad5 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/ContinuousConvexCollision/ContinuousConvexCollisionDemo.cpp @@ -0,0 +1,287 @@ +/* + * Copyright (c) 2005 Erwin Coumans http://continuousphysics.com/Bullet/ + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies. + * Erwin Coumans makes no representations about the suitability + * of this software for any purpose. + * It is provided "as is" without express or implied warranty. + */ + + +/* + Continuous Convex Collision Demo demonstrates an efficient continuous collision detection algorithm. + Both linear and angular velocities are supported. Convex Objects are sampled using Supporting Vertex. + Motion using Exponential Map. + Future ideas: Comparison with Screwing Motion. + Also comparision with Algebraic CCD and Interval Arithmetic methods (Stephane Redon) +*/ + + +///This low level demo need internal access, and intentionally doesn't include the btBulletCollisionCommon.h headerfile +#include "LinearMath/btQuaternion.h" +#include "LinearMath/btTransform.h" +#include "BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.h" +#include "BulletCollision/CollisionShapes/btBoxShape.h" +#include "BulletCollision/CollisionShapes/btMinkowskiSumShape.h" + +#include "BulletCollision/NarrowPhaseCollision/btGjkPairDetector.h" +#include "BulletCollision/NarrowPhaseCollision/btGjkConvexCast.h" +#include "BulletCollision/NarrowPhaseCollision/btSubSimplexConvexCast.h" +#include "BulletCollision/NarrowPhaseCollision/btContinuousConvexCollision.h" + +#include "LinearMath/btTransformUtil.h" +#include "DebugCastResult.h" + +#include "BulletCollision/CollisionShapes/btSphereShape.h" + +#include "BulletCollision/CollisionShapes/btTetrahedronShape.h" + +#include "BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.h" +#include "BulletCollision/NarrowPhaseCollision/btConvexPenetrationDepthSolver.h" + +#include "GL_ShapeDrawer.h" +#include "ContinuousConvexCollision.h" +#include "GlutStuff.h" + + +float yaw=0.f,pitch=0.f,roll=0.f; +const int maxNumObjects = 4; +const int numObjects = 2; + +btVector3 angVels[numObjects]; +btVector3 linVels[numObjects]; + +btPolyhedralConvexShape* shapePtr[maxNumObjects]; + + +btTransform fromTrans[maxNumObjects]; +btTransform toTrans[maxNumObjects]; + + +int screenWidth = 640; +int screenHeight = 480; + + +int main(int argc,char** argv) +{ + btContinuousConvexCollisionDemo* ccdDemo = new btContinuousConvexCollisionDemo(); + + ccdDemo->setCameraDistance(40.f); + + ccdDemo->initPhysics(); + + return glutmain(argc, argv,screenWidth,screenHeight,"Continuous Convex Collision Demo",ccdDemo); +} + +void btContinuousConvexCollisionDemo::initPhysics() +{ + fromTrans[0].setOrigin(btVector3(0,10,20)); + toTrans[0].setOrigin(btVector3(0,10,-20)); + fromTrans[1].setOrigin(btVector3(-2,7,0)); + toTrans[1].setOrigin(btVector3(-2,10,0)); + + btMatrix3x3 identBasis; + identBasis.setIdentity(); + + btMatrix3x3 basisA; + basisA.setIdentity(); + basisA.setEulerZYX(0.f,-SIMD_HALF_PI,0.f); + + fromTrans[0].setBasis(identBasis); + toTrans[0].setBasis(basisA); + + fromTrans[1].setBasis(identBasis); + toTrans[1].setBasis(identBasis); + + toTrans[1].setBasis(identBasis); + btVector3 boxHalfExtentsA(10,1,1); + btVector3 boxHalfExtentsB(1.1f,1.1f,1.1f); + btBoxShape* boxA = new btBoxShape(boxHalfExtentsA); +// btBU_Simplex1to4* boxA = new btBU_Simplex1to4(btVector3(-2,0,-2),btVector3(2,0,-2),btVector3(0,0,2),btVector3(0,2,0)); +// btBU_Simplex1to4* boxA = new btBU_Simplex1to4(btVector3(-12,0,0),btVector3(12,0,0)); + + + btBoxShape* boxB = new btBoxShape(boxHalfExtentsB); + + shapePtr[0] = boxA; + shapePtr[1] = boxB; + + shapePtr[0]->setMargin(0.01f); + shapePtr[1]->setMargin(0.01f); + + for (int i=0;idrawOpenGL(m,shapePtr[i],btVector3(1,0,1),getDebugMode(),worldBoundsMin,worldBoundsMax); + } + } + } + + + btMatrix3x3 mat; + mat.setEulerZYX(yaw,pitch,roll); + btQuaternion orn; + mat.getRotation(orn); + orn.setEuler(yaw,pitch,roll); + fromTrans[1].setRotation(orn); + toTrans[1].setRotation(orn); + + + if (m_stepping || m_singleStep) + { + m_singleStep = false; + pitch += 0.005f; +// yaw += 0.01f; + } +// btVector3 fromA(-25,11,0); +// btVector3 toA(-15,11,0); + +// btQuaternion ornFromA(0.f,0.f,0.f,1.f); +// btQuaternion ornToA(0.f,0.f,0.f,1.f); + +// btTransform rayFromWorld(ornFromA,fromA); +// btTransform rayToWorld(ornToA,toA); + + btTransform rayFromWorld = fromTrans[0]; + btTransform rayToWorld = toTrans[0]; + + + if (drawLine) + { + glBegin(GL_LINES); + glColor3f(0, 0, 1); + glVertex3d(rayFromWorld.getOrigin().x(), rayFromWorld.getOrigin().y(),rayFromWorld.getOrigin().z()); + glVertex3d(rayToWorld.getOrigin().x(),rayToWorld.getOrigin().y(),rayToWorld.getOrigin().z()); + glEnd(); + } + + //now perform a raycast on the shapes, in local (shape) space + gGjkSimplexSolver.reset(); + + //choose one of the following lines + + + for (i=0;idrawOpenGL(m,shapePtr[i],btVector3(1,1,1),getDebugMode(),worldBoundsMin,worldBoundsMax); + } + + btDebugCastResult rayResult1(fromTrans[0],shapePtr[0],linVels[0],angVels[0],m_shapeDrawer); + + + for (i=1;im_fraction,hitTrans); + + hitTrans.getOpenGLMatrix(m); + m_shapeDrawer->drawOpenGL(m,shapePtr[0],btVector3(0,1,0),getDebugMode(),worldBoundsMin,worldBoundsMax); + + btTransformUtil::integrateTransform(fromTrans[i],linVels[i],angVels[i],rayResultPtr->m_fraction,hitTrans); + + hitTrans.getOpenGLMatrix(m); + m_shapeDrawer->drawOpenGL(m,shapePtr[i],btVector3(0,1,1),getDebugMode(),worldBoundsMin,worldBoundsMax); + + + } + } + + glFlush(); + glutSwapBuffers(); +} + + diff --git a/BulletPhysics/bulletTrunk/Demos/ContinuousConvexCollision/Jamfile b/BulletPhysics/bulletTrunk/Demos/ContinuousConvexCollision/Jamfile new file mode 100644 index 00000000..be75e55d --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/ContinuousConvexCollision/Jamfile @@ -0,0 +1,3 @@ +SubDir TOP Demos ContinuousConvexCollision ; + +BulletDemo ContinuousConvexCollision : [ Wildcard *.h *.cpp ] ; diff --git a/BulletPhysics/bulletTrunk/Demos/ConvexDecompositionDemo/CMakeLists.txt b/BulletPhysics/bulletTrunk/Demos/ConvexDecompositionDemo/CMakeLists.txt new file mode 100644 index 00000000..00bf5ac9 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/ConvexDecompositionDemo/CMakeLists.txt @@ -0,0 +1,26 @@ +# This is basically the overall name of the project in Visual Studio this is the name of the Solution File + + +# For every executable you have with a main method you should have an add_executable line below. +# For every add executable line you should list every .cpp and .h file you have associated with that executable. + + +# This is the variable for Windows. I use this to define the root of my directory structure. +SET(GLUT_ROOT ${BULLET_PHYSICS_SOURCE_DIR}/Glut) + +# You shouldn't have to modify anything below this line +######################################################## + +INCLUDE_DIRECTORIES( +${BULLET_PHYSICS_SOURCE_DIR}/src ${BULLET_PHYSICS_SOURCE_DIR}/Demos/OpenGL ${BULLET_PHYSICS_SOURCE_DIR}/Extras/ConvexDecomposition +) + +LINK_LIBRARIES( +OpenGLSupport BulletDynamics BulletCollision LinearMath ConvexDecomposition ${GLUT_glut_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} +) + +ADD_EXECUTABLE(AppConvexDecompositionDemo + main.cpp + ConvexDecompositionDemo.cpp +) + diff --git a/BulletPhysics/bulletTrunk/Demos/ConvexDecompositionDemo/ConvexDecompositionDemo.cpp b/BulletPhysics/bulletTrunk/Demos/ConvexDecompositionDemo/ConvexDecompositionDemo.cpp new file mode 100644 index 00000000..929f23de --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/ConvexDecompositionDemo/ConvexDecompositionDemo.cpp @@ -0,0 +1,519 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#include "cd_wavefront.h" +#include "ConvexBuilder.h" + +#include "btBulletDynamicsCommon.h" + +#include "LinearMath/btQuickprof.h" +#include "LinearMath/btIDebugDraw.h" +#include "LinearMath/btGeometryUtil.h" +#include "BulletCollision/CollisionShapes/btShapeHull.h" + +//#define USE_PARALLEL_DISPATCHER 1 +#ifdef USE_PARALLEL_DISPATCHER +#include "../../Extras/BulletMultiThreaded/SpuGatheringCollisionDispatcher.h" +#include "../../Extras/BulletMultiThreaded/Win32ThreadSupport.h" +#include "../../Extras/BulletMultiThreaded/SpuNarrowPhaseCollisionTask/SpuGatheringCollisionTask.h" +#endif//USE_PARALLEL_DISPATCHER + + + + + +#include "BMF_Api.h" +#include //printf debugging + + +#include "ConvexDecompositionDemo.h" +#include "GL_ShapeDrawer.h" + +#include "GlutStuff.h" + + +btVector3 centroid=btVector3(0,0,0); +btVector3 convexDecompositionObjectOffset(10,0,0); + +#define CUBE_HALF_EXTENTS 4 + + +//////////////////////////////////// + +unsigned int tcount = 0; + + + +void ConvexDecompositionDemo::initPhysics(const char* filename) +{ + setTexturing(true); + setShadows(true); + + setCameraDistance(26.f); + + ConvexDecomposition::WavefrontObj wo; + + tcount = wo.loadObj(filename); + + if (!tcount) + { + //when running this app from visual studio, the default starting folder is different, so make a second attempt... + tcount = wo.loadObj("../../file.obj"); + } + + + m_collisionConfiguration = new btDefaultCollisionConfiguration(); + +#ifdef USE_PARALLEL_DISPATCHER +#ifdef USE_WIN32_THREADING + + int maxNumOutstandingTasks = 4;//number of maximum outstanding tasks + Win32ThreadSupport* threadSupport = new Win32ThreadSupport(Win32ThreadSupport::Win32ThreadConstructionInfo( + "collision", + processCollisionTask, + createCollisionLocalStoreMemory, + maxNumOutstandingTasks)); +#else +///@todo other platform threading +///Playstation 3 SPU (SPURS) version is available through PS3 Devnet +///Libspe2 SPU support will be available soon +///pthreads version +///you can hook it up to your custom task scheduler by deriving from btThreadSupportInterface +#endif + + m_dispatcher = new SpuGatheringCollisionDispatcher(threadSupport,maxNumOutstandingTasks,m_collisionConfiguration); +#else + m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); +#endif//USE_PARALLEL_DISPATCHER + + + convexDecompositionObjectOffset.setValue(10,0,0); + + btVector3 worldAabbMin(-10000,-10000,-10000); + btVector3 worldAabbMax(10000,10000,10000); + + m_broadphase = new btAxisSweep3(worldAabbMin,worldAabbMax); + //m_broadphase = new btSimpleBroadphase(); + + m_solver = new btSequentialImpulseConstraintSolver(); + m_dynamicsWorld = new btDiscreteDynamicsWorld(m_dispatcher,m_broadphase,m_solver,m_collisionConfiguration); + +#ifdef USE_PARALLEL_DISPATCHER + m_dynamicsWorld->getDispatchInfo().m_enableSPU = true; +#endif //USE_PARALLEL_DISPATCHER + + btTransform startTransform; + startTransform.setIdentity(); + startTransform.setOrigin(btVector3(0,-4.5,0)); + + btCollisionShape* boxShape = new btBoxShape(btVector3(30,2,30)); + m_collisionShapes.push_back(boxShape); + localCreateRigidBody(0.f,startTransform,boxShape); + + class MyConvexDecomposition : public ConvexDecomposition::ConvexDecompInterface + { + ConvexDecompositionDemo* m_convexDemo; + + public: + + btAlignedObjectArray m_convexShapes; + btAlignedObjectArray m_convexCentroids; + + MyConvexDecomposition (FILE* outputFile,ConvexDecompositionDemo* demo) + :m_convexDemo(demo), + mBaseCount(0), + mHullCount(0), + mOutputFile(outputFile) + + { + } + + virtual void ConvexDecompResult(ConvexDecomposition::ConvexResult &result) + { + + btTriangleMesh* trimesh = new btTriangleMesh(); + m_convexDemo->m_trimeshes.push_back(trimesh); + + btVector3 localScaling(6.f,6.f,6.f); + + //export data to .obj + printf("ConvexResult. "); + if (mOutputFile) + { + fprintf(mOutputFile,"## Hull Piece %d with %d vertices and %d triangles.\r\n", mHullCount, result.mHullVcount, result.mHullTcount ); + + fprintf(mOutputFile,"usemtl Material%i\r\n",mBaseCount); + fprintf(mOutputFile,"o Object%i\r\n",mBaseCount); + + for (unsigned int i=0; i vertices; + if ( 1 ) + { + //const unsigned int *src = result.mHullIndices; + for (unsigned int i=0; iaddTriangle(vertex0,vertex1,vertex2); + + index0+=mBaseCount; + index1+=mBaseCount; + index2+=mBaseCount; + + fprintf(mOutputFile,"f %d %d %d\r\n", index0+1, index1+1, index2+1 ); + } + } + + float mass = 1.f; + //float collisionMargin = 0.01f; + +//this is a tools issue: due to collision margin, convex objects overlap, compensate for it here: +//#define SHRINK_OBJECT_INWARDS 1 +#ifdef SHRINK_OBJECT_INWARDS + + + std::vector planeEquations; + btGeometryUtil::getPlaneEquationsFromVertices(vertices,planeEquations); + + std::vector shiftedPlaneEquations; + for (int p=0;p shiftedVertices; + btGeometryUtil::getVerticesFromPlaneEquations(shiftedPlaneEquations,shiftedVertices); + + + btConvexHullShape* convexShape = new btConvexHullShape(&(shiftedVertices[0].getX()),shiftedVertices.size()); + +#else //SHRINK_OBJECT_INWARDS + + btConvexHullShape* convexShape = new btConvexHullShape(&(vertices[0].getX()),vertices.size()); +#endif + + convexShape->setMargin(0.01); + m_convexShapes.push_back(convexShape); + m_convexCentroids.push_back(centroid); + m_convexDemo->m_collisionShapes.push_back(convexShape); + mBaseCount+=result.mHullVcount; // advance the 'base index' counter. + + + } + } + + int mBaseCount; + int mHullCount; + FILE* mOutputFile; + + }; + + if (tcount) + { + btTriangleMesh* trimesh = new btTriangleMesh(); + m_trimeshes.push_back(trimesh); + + btVector3 localScaling(6.f,6.f,6.f); + + int i; + for ( i=0;iaddTriangle(vertex0,vertex1,vertex2); + } + + + btConvexShape* tmpConvexShape = new btConvexTriangleMeshShape(trimesh); + + printf("old numTriangles= %d\n",wo.mTriCount); + printf("old numIndices = %d\n",wo.mTriCount*3); + printf("old numVertices = %d\n",wo.mVertexCount); + + printf("reducing vertices by creating a convex hull\n"); + + //create a hull approximation + btShapeHull* hull = new btShapeHull(tmpConvexShape); + btScalar margin = tmpConvexShape->getMargin(); + hull->buildHull(margin); + tmpConvexShape->setUserPointer(hull); + + + printf("new numTriangles = %d\n", hull->numTriangles ()); + printf("new numIndices = %d\n", hull->numIndices ()); + printf("new numVertices = %d\n", hull->numVertices ()); + + btConvexHullShape* convexShape = new btConvexHullShape(); + for (i=0;inumVertices();i++) + { + convexShape->addPoint(hull->getVertexPointer()[i]); + } + + delete tmpConvexShape; + delete hull; + + + + m_collisionShapes.push_back(convexShape); + + float mass = 1.f; + + btTransform startTransform; + startTransform.setIdentity(); + startTransform.setOrigin(btVector3(0,2,0)); + + localCreateRigidBody(mass, startTransform,convexShape); + + bool useQuantization = true; + btCollisionShape* concaveShape = new btBvhTriangleMeshShape(trimesh,useQuantization); + startTransform.setOrigin(convexDecompositionObjectOffset); + localCreateRigidBody(0.f,startTransform,concaveShape); + + m_collisionShapes.push_back (concaveShape); + + } + + + if (tcount) + { + + char outputFileName[512]; + strcpy(outputFileName,filename); + char *dot = strstr(outputFileName,"."); + if ( dot ) + *dot = 0; + strcat(outputFileName,"_convex.obj"); + FILE* outputFile = fopen(outputFileName,"wb"); + + unsigned int depth = 5; + float cpercent = 5; + float ppercent = 15; + unsigned int maxv = 16; + float skinWidth = 0.0; + + printf("WavefrontObj num triangles read %i\n",tcount); + ConvexDecomposition::DecompDesc desc; + desc.mVcount = wo.mVertexCount; + desc.mVertices = wo.mVertices; + desc.mTcount = wo.mTriCount; + desc.mIndices = (unsigned int *)wo.mIndices; + desc.mDepth = depth; + desc.mCpercent = cpercent; + desc.mPpercent = ppercent; + desc.mMaxVertices = maxv; + desc.mSkinWidth = skinWidth; + + MyConvexDecomposition convexDecomposition(outputFile,this); + desc.mCallback = &convexDecomposition; + + + + //convexDecomposition.performConvexDecomposition(desc); + + ConvexBuilder cb(desc.mCallback); + cb.process(desc); + //now create some bodies + + { + btCompoundShape* compound = new btCompoundShape(); + m_collisionShapes.push_back (compound); + + btTransform trans; + trans.setIdentity(); + for (int i=0;iaddChildShape(trans,convexShape); + } + btScalar mass=10.f; + trans.setOrigin(-convexDecompositionObjectOffset); + localCreateRigidBody( mass, trans,compound); + convexDecompositionObjectOffset.setZ(6); + trans.setOrigin(-convexDecompositionObjectOffset); + localCreateRigidBody( mass, trans,compound); + convexDecompositionObjectOffset.setZ(-6); + trans.setOrigin(-convexDecompositionObjectOffset); + localCreateRigidBody( mass, trans,compound); + + } + + + if (outputFile) + fclose(outputFile); + + + } + + + +} + +void ConvexDecompositionDemo::clientMoveAndDisplay() +{ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + float dt = getDeltaTimeMicroseconds() * 0.000001f; + + m_dynamicsWorld->stepSimulation(dt); + + //optional but useful: debug drawing + m_dynamicsWorld->debugDrawWorld(); + + renderme(); + + glFlush(); + glutSwapBuffers(); + +} + + + +void ConvexDecompositionDemo::displayCallback(void) { + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + + if (m_dynamicsWorld) + m_dynamicsWorld->debugDrawWorld(); + + renderme(); + + + glFlush(); + glutSwapBuffers(); +} + + + + +void ConvexDecompositionDemo::exitPhysics() +{ + + + //cleanup in the reverse order of creation/initialization + + //remove the rigidbodies from the dynamics world and delete them + int i; + for (i=m_dynamicsWorld->getNumCollisionObjects()-1; i>=0 ;i--) + { + btCollisionObject* obj = m_dynamicsWorld->getCollisionObjectArray()[i]; + btRigidBody* body = btRigidBody::upcast(obj); + if (body && body->getMotionState()) + { + delete body->getMotionState(); + } + m_dynamicsWorld->removeCollisionObject( obj ); + delete obj; + } + + //delete collision shapes + for (i=0;i m_collisionShapes; + + btAlignedObjectArray m_trimeshes; + + btBroadphaseInterface* m_broadphase; + + btCollisionDispatcher* m_dispatcher; + + btConstraintSolver* m_solver; + + btDefaultCollisionConfiguration* m_collisionConfiguration; + + + + void initPhysics(const char* filename); + + void exitPhysics(); + + virtual ~ConvexDecompositionDemo() + { + exitPhysics(); + } + + virtual void clientMoveAndDisplay(); + + virtual void displayCallback(); + + static DemoApplication* Create() + { + ConvexDecompositionDemo* demo = new ConvexDecompositionDemo(); + demo->myinit(); + demo->initPhysics("file.obj"); + return demo; + } + + +}; + +#endif //CONVEX_DECOMPOSITION_DEMO_H + + diff --git a/BulletPhysics/bulletTrunk/Demos/ConvexDecompositionDemo/Jamfile b/BulletPhysics/bulletTrunk/Demos/ConvexDecompositionDemo/Jamfile new file mode 100644 index 00000000..01c4741a --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/ConvexDecompositionDemo/Jamfile @@ -0,0 +1,22 @@ +SubDir TOP Demos ConvexDecompositionDemo ; + +#some demos need extra functionality, Collada / ConvexDecomposition etc. + + rule ExtraDemo2 + + { + Application $(<) : $(>) : noinstall console nomanifest ; + LinkWith $(<) : bulletopenglsupport convexdecomposition bulletdynamics bulletcollision bulletmath ; + CFlags $(<) : + [ FIncludes $(TOP)/Demos/OpenGL ] + [ FIncludes $(TOP)/Extras/ConvexDecomposition ] + [ FIncludes $(TOP)/Extras/ConvexHull ] + ; + + MsvcIncDirs $(<) : + "../../Demos/OpenGL" + "../../Extras/ConvexDecomposition" + "../../Extras/ConvexHull" ; + } + +ExtraDemo2 ConvexDecompositionDemo : [ Wildcard *.h *.cpp ] ; diff --git a/BulletPhysics/bulletTrunk/Demos/ConvexDecompositionDemo/main.cpp b/BulletPhysics/bulletTrunk/Demos/ConvexDecompositionDemo/main.cpp new file mode 100644 index 00000000..9c5675dd --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/ConvexDecompositionDemo/main.cpp @@ -0,0 +1,32 @@ + + +#include "ConvexDecompositionDemo.h" +#include "GlutStuff.h" +#include "GLDebugDrawer.h" +#include "btBulletDynamicsCommon.h" + +GLDebugDrawer gDebugDrawer; + +int main(int argc,char** argv) +{ + const char* filename = "file.obj"; + + + ConvexDecompositionDemo* convexDecompDemo = new ConvexDecompositionDemo(); + + convexDecompDemo->initPhysics(filename); + + convexDecompDemo->getDynamicsWorld()->setDebugDrawer(&gDebugDrawer); + + + convexDecompDemo->clientResetScene(); + + + + glutmain(argc, argv,640,480,"Bullet Physics Demo. http://www.continuousphysics.com/Bullet/phpBB2/",convexDecompDemo); + + delete convexDecompDemo; + + return 0; +} + diff --git a/BulletPhysics/bulletTrunk/Demos/ConvexHullDistance/ConvexHullDistanceDemo.cpp b/BulletPhysics/bulletTrunk/Demos/ConvexHullDistance/ConvexHullDistanceDemo.cpp new file mode 100644 index 00000000..cc5ff807 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/ConvexHullDistance/ConvexHullDistanceDemo.cpp @@ -0,0 +1,195 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + + +/// +/// Convex Hull Distance Demo shows distance calculation between two convex hulls of points. +/// GJK with the btVoronoiSimplexSolver is used. +/// + +#include "GL_Simplex1to4.h" +#include "LinearMath/btQuaternion.h" +#include "LinearMath/btTransform.h" +#include "BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.h" +#include "BulletCollision/CollisionShapes/btConvexHullShape.h" + +#include "BulletCollision/NarrowPhaseCollision/btGjkPairDetector.h" +#include "BulletDynamics/NarrowPhaseCollision/btPointCollector.h" +#include "BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.h" +#include "BulletCollision/NarrowPhaseCollision/btConvexPenetrationDepthSolver.h" + +#include "GL_ShapeDrawer.h" +#ifdef WIN32 //needed for glut.h +#include +#endif +//think different +#if defined(__APPLE__) && !defined (VMDMESA) +#include +#include +#include +#else +#include +#endif +#include "GlutStuff.h" + + +float yaw=0.f,pitch=0.f,roll=0.f; +const int maxNumObjects = 4; +const int numObjects = 2; + +GL_Simplex1to4 simplex; + +btPolyhedralConvexShape* shapePtr[maxNumObjects]; + +btTransform tr[numObjects]; +int screenWidth = 640.f; +int screenHeight = 480.f; + + +int main(int argc,char** argv) +{ + clientResetScene(); + + btMatrix3x3 basisA; + basisA.setIdentity(); + + btMatrix3x3 basisB; + basisB.setIdentity(); + + tr[0].setBasis(basisA); + tr[1].setBasis(basisB); + + btPoint3 points0[3]={btPoint3(1,0,0),btPoint3(0,1,0),btPoint3(0,0,1)}; + btPoint3 points1[5]={btPoint3(1,0,0),btPoint3(0,1,0),btPoint3(0,0,1),btPoint3(0,0,-1),btPoint3(-1,-1,0)}; + + btConvexHullShape hullA(points0,3); + btConvexHullShape hullB(points1,5); + + shapePtr[0] = &hullA; + shapePtr[1] = &hullB; + + + btTransform tr; + tr.setIdentity(); + + + return glutmain(argc, argv,screenWidth,screenHeight,"Convex Hull Distance Demo"); +} + +//to be implemented by the demo + +void clientMoveAndDisplay() +{ + + clientDisplay(); +} + + +static btVoronoiSimplexSolver sGjkSimplexSolver; +btSimplexSolverInterface& gGjkSimplexSolver = sGjkSimplexSolver; + + + +void clientDisplay(void) { + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glDisable(GL_LIGHTING); + + //GL_ShapeDrawer::drawCoordSystem(); + + float m[16]; + int i; + + btGjkPairDetector convexConvex(shapePtr[0],shapePtr[1],&sGjkSimplexSolver,0); + + btVector3 seperatingAxis(0.00000000f,0.059727669f,0.29259586f); + convexConvex.setCachedSeperatingAxis(seperatingAxis); + + btPointCollector gjkOutput; + btGjkPairDetector::ClosestPointInput input; + input.m_transformA = tr[0]; + input.m_transformB = tr[1]; + + convexConvex.getClosestPoints(input ,gjkOutput,0); + + if (gjkOutput.m_hasResult) + { + btVector3 endPt = gjkOutput.m_pointInWorld + + gjkOutput.m_normalOnBInWorld*gjkOutput.m_distance; + + glBegin(GL_LINES); + glColor3f(1, 0, 0); + glVertex3d(gjkOutput.m_pointInWorld.x(), gjkOutput.m_pointInWorld.y(),gjkOutput.m_pointInWorld.z()); + glVertex3d(endPt.x(),endPt.y(),endPt.z()); + glEnd(); + + } + + for (i=0;iinitPhysics(); + doublePrecisionDemo->setCameraDistance(btScalar(2.0)); + + doublePrecisionDemo->clientResetScene(); + + return glutmain(argc, argv,screenWidth,screenHeight,"Double Precision Demo",doublePrecisionDemo); +} + +void DoublePrecisionDemo::initPhysics() +{ + m_debugMode |= btIDebugDraw::DBG_DrawWireframe; + + btMatrix3x3 basisA; + basisA.setIdentity(); + + btMatrix3x3 basisB; + basisB.setIdentity(); + + objects[0].getWorldTransform().setBasis(basisA); + objects[1].getWorldTransform().setBasis(basisB); + + + btBoxShape* boxA = new btBoxShape(btVector3(0.5,0.5,0.5)); + btBoxShape* boxB = new btBoxShape(btVector3(0.5,0.5,0.5)); + + objects[0].setCollisionShape(boxA);//&hullA; + objects[1].setCollisionShape(boxB);//&hullB; + + btDefaultCollisionConfiguration* collisionConfiguration = new btDefaultCollisionConfiguration(); + btCollisionDispatcher* dispatcher = new btCollisionDispatcher(collisionConfiguration); + btVector3 worldAabbMin(80000,80000,80000); + btVector3 worldAabbMax(120000,120000,120000); + + btAxisSweep3* broadphase = new btAxisSweep3(worldAabbMin,worldAabbMax); + + collisionWorld = new btCollisionWorld(dispatcher,broadphase,collisionConfiguration); + + collisionWorld->addCollisionObject(&objects[0]); + collisionWorld->addCollisionObject(&objects[1]); + +} + + +//to be implemented by the demo + +void DoublePrecisionDemo::clientMoveAndDisplay() +{ + + displayCallback(); +} + + +static btVoronoiSimplexSolver sGjkSimplexSolver; +btSimplexSolverInterface& gGjkSimplexSolver = sGjkSimplexSolver; + +void DoublePrecisionDemo::displayCallback(void) +{ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glDisable(GL_LIGHTING); + + collisionWorld->getDispatchInfo().m_debugDraw = &debugDrawer; + + if (collisionWorld) + collisionWorld->performDiscreteCollisionDetection(); + + int i; + + btVector3 worldBoundsMin,worldBoundsMax; + collisionWorld->getBroadphase()->getBroadphaseAabb(worldBoundsMin,worldBoundsMax); + + + ///one way to draw all the contact points is iterating over contact manifolds / points: + int numManifolds = collisionWorld->getDispatcher()->getNumManifolds(); + for (i=0;igetDispatcher()->getManifoldByIndexInternal(i); + btCollisionObject* obA = static_cast(contactManifold->getBody0()); + btCollisionObject* obB = static_cast(contactManifold->getBody1()); + contactManifold->refreshContactPoints(obA->getWorldTransform(),obB->getWorldTransform()); + + int numContacts = contactManifold->getNumContacts(); + for (int j=0;jgetContactPoint(j); + + glBegin(GL_LINES); + glColor3f(1, 1, 1); + + btVector3 ptA = pt.getPositionWorldOnA() - m_cameraPosition; + btVector3 ptB = pt.getPositionWorldOnB() - m_cameraPosition; + + glVertex3d(ptA.x(),ptA.y(),ptA.z()); + glVertex3d(ptB.x(),ptB.y(),ptB.z()); + glEnd(); + } + + //you can un-comment out this line, and then all points are removed + //contactManifold->clearManifold(); + } + + btScalar m[16]; + btTransform temp; + + + btVector3 color; + //int i; + for (i=0;idrawOpenGL(m,objects[i].getCollisionShape(),color,getDebugMode(),worldBoundsMin,worldBoundsMax); + } + + objects[1].getWorldTransform().setOrigin(objects[1].getWorldTransform().getOrigin()+btVector3(-VERY_SMALL_INCREMENT,-VERY_SMALL_INCREMENT,0)); + objects[0].getWorldTransform().setOrigin(objects[0].getWorldTransform().getOrigin()+btVector3(VERY_SMALL_INCREMENT,VERY_SMALL_INCREMENT,0)); + + float yStart = 20.f; + float yIncr = 20.f; + char buf[124]; + + glColor3f(0, 0, 0); + + setOrthographicProjection(); + + glRasterPos3f(10.0f,yStart,0); + #ifdef BT_USE_DOUBLE_PRECISION + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),"Double Precision Mode"); + #else + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),"Single Precision Mode"); + #endif + yStart += yIncr; + + glRasterPos3f(10.0f,yStart,0); + sprintf(buf,"Movement distance in x and y axis = %lf", VERY_SMALL_INCREMENT); + + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); + yStart += yIncr; + + glRasterPos3f(10.0f,yStart,0); + btScalar xValue = objects[0].getWorldTransform().getOrigin().x(); + btScalar yValue = objects[0].getWorldTransform().getOrigin().y(); + btScalar zValue = objects[0].getWorldTransform().getOrigin().z(); + sprintf(buf,"Cube 0 location = ( %lf, %lf, %lf )", xValue, yValue, zValue); + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); + yStart += yIncr; + + xValue = objects[1].getWorldTransform().getOrigin().x(); + yValue = objects[1].getWorldTransform().getOrigin().y(); + zValue = objects[1].getWorldTransform().getOrigin().z(); + glRasterPos3f(10.0f,yStart,0); + sprintf(buf,"Cube 1 location = ( %lf, %lf, %lf )", xValue, yValue, zValue); + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); + yStart += yIncr; + + glRasterPos3f(10.0f,yStart,0); + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),"w=toggle wireframe/solid"); + + resetPerspectiveProjection(); + + glFlush(); + glutSwapBuffers(); +} + +void DoublePrecisionDemo::clientResetScene() +{ + objects[0].getWorldTransform().setOrigin(btVector3(LARGE_DISTANCE_FROM_ORIGIN,LARGE_DISTANCE_FROM_ORIGIN,LARGE_DISTANCE_FROM_ORIGIN)); + objects[1].getWorldTransform().setOrigin(btVector3(LARGE_DISTANCE_FROM_ORIGIN-VERY_SMALL_INCREMENT,LARGE_DISTANCE_FROM_ORIGIN-VERY_SMALL_INCREMENT,LARGE_DISTANCE_FROM_ORIGIN)); +} + + + +void DoublePrecisionDemo::updateCamera() +{ + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + + // look at the stationary cube + m_cameraTargetPosition = objects[0].getWorldTransform().getOrigin(); + + m_cameraPosition = m_cameraTargetPosition; + m_cameraPosition[2] = m_cameraTargetPosition[2] - m_cameraDistance; + + //update OpenGL camera settings + glFrustum(-1.0, 1.0, -1.0, 1.0, 1.0, 10000.0); + + // To not loose precision in the rendering process, we shift the object to the origin + gluLookAt(0.0, 0.0, 0.0, + m_cameraTargetPosition[0]-m_cameraPosition[0],m_cameraTargetPosition[1]-m_cameraPosition[1], m_cameraTargetPosition[2]-m_cameraPosition[2], + m_cameraUp.getX(),m_cameraUp.getY(),m_cameraUp.getZ()); + glMatrixMode(GL_MODELVIEW); +} + +void DoublePrecisionDemo::keyboardCallback(unsigned char key, int x, int y) +{ + if (key == 'w') + { + if (m_debugMode & btIDebugDraw::DBG_DrawWireframe) + { + m_debugMode = m_debugMode & (~btIDebugDraw::DBG_DrawWireframe); + m_debugMode |= btIDebugDraw::DBG_DrawAabb; + } + else + { + m_debugMode = m_debugMode & (~btIDebugDraw::DBG_DrawAabb); + m_debugMode |= btIDebugDraw::DBG_DrawWireframe; + } + return; + } + + DemoApplication::keyboardCallback(key, x, y); +} + + diff --git a/BulletPhysics/bulletTrunk/Demos/DoublePrecisionDemo/DoublePrecisionDemo.h b/BulletPhysics/bulletTrunk/Demos/DoublePrecisionDemo/DoublePrecisionDemo.h new file mode 100644 index 00000000..56f81159 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/DoublePrecisionDemo/DoublePrecisionDemo.h @@ -0,0 +1,41 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ +#ifndef COLLISION_INTERFACE_DEMO_H +#define COLLISION_INTERFACE_DEMO_H + +#include "DemoApplication.h" + +///DoublePrecisionDemo shows how to use the collision detection without dynamics (btCollisionWorld/CollisionObject) +class DoublePrecisionDemo : public DemoApplication +{ + public: + + void initPhysics(); + + virtual void clientMoveAndDisplay(); + + virtual void displayCallback(); + + virtual void clientResetScene(); + + virtual void updateCamera(); + + virtual void keyboardCallback(unsigned char key, int x, int y); + +}; + +#endif //COLLISION_INTERFACE_DEMO_H + + diff --git a/BulletPhysics/bulletTrunk/Demos/DoublePrecisionDemo/Jamfile b/BulletPhysics/bulletTrunk/Demos/DoublePrecisionDemo/Jamfile new file mode 100644 index 00000000..57d75422 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/DoublePrecisionDemo/Jamfile @@ -0,0 +1,3 @@ +SubDir TOP Demos DoublePrecisionDemo ; + +BulletDemo DoublePrecisionDemo : [ Wildcard *.h *.cpp ] ; diff --git a/BulletPhysics/bulletTrunk/Demos/DynamicControlDemo/MotorDemo.cpp b/BulletPhysics/bulletTrunk/Demos/DynamicControlDemo/MotorDemo.cpp new file mode 100644 index 00000000..b44ff029 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/DynamicControlDemo/MotorDemo.cpp @@ -0,0 +1,444 @@ +/* +Bullet Continuous Collision Detection and Physics Library Copyright (c) 2007 Erwin Coumans +Motor Demo + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + + +#include "btBulletDynamicsCommon.h" +#include "GlutStuff.h" +#include "GL_ShapeDrawer.h" + +#include "LinearMath/btIDebugDraw.h" + +#include "GLDebugDrawer.h" +#include "MotorDemo.h" + + +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#endif + +#ifndef M_PI_2 +#define M_PI_2 1.57079632679489661923 +#endif + +#ifndef M_PI_4 +#define M_PI_4 0.785398163397448309616 +#endif + +#ifndef M_PI_8 +#define M_PI_8 0.5 * M_PI_4 +#endif + + +// LOCAL FUNCTIONS + +void vertex(btVector3 &v) +{ + glVertex3d(v.getX(), v.getY(), v.getZ()); +} + +void drawFrame(btTransform &tr) +{ + const float fSize = 1.f; + + glBegin(GL_LINES); + + // x + glColor3f(255.f,0,0); + btVector3 vX = tr*btVector3(fSize,0,0); + vertex(tr.getOrigin()); vertex(vX); + + // y + glColor3f(0,255.f,0); + btVector3 vY = tr*btVector3(0,fSize,0); + vertex(tr.getOrigin()); vertex(vY); + + // z + glColor3f(0,0,255.f); + btVector3 vZ = tr*btVector3(0,0,fSize); + vertex(tr.getOrigin()); vertex(vZ); + + glEnd(); +} + +// /LOCAL FUNCTIONS + + + +#define NUM_LEGS 6 +#define BODYPART_COUNT 2 * NUM_LEGS + 1 +#define JOINT_COUNT BODYPART_COUNT - 1 + +class TestRig +{ + btDynamicsWorld* m_ownerWorld; + btCollisionShape* m_shapes[BODYPART_COUNT]; + btRigidBody* m_bodies[BODYPART_COUNT]; + btTypedConstraint* m_joints[JOINT_COUNT]; + + btRigidBody* localCreateRigidBody (btScalar mass, const btTransform& startTransform, btCollisionShape* shape) + { + bool isDynamic = (mass != 0.f); + + btVector3 localInertia(0,0,0); + if (isDynamic) + shape->calculateLocalInertia(mass,localInertia); + + btDefaultMotionState* myMotionState = new btDefaultMotionState(startTransform); + btRigidBody::btRigidBodyConstructionInfo rbInfo(mass,myMotionState,shape,localInertia); + btRigidBody* body = new btRigidBody(rbInfo); + + m_ownerWorld->addRigidBody(body); + + return body; + } + + +public: + TestRig (btDynamicsWorld* ownerWorld, const btVector3& positionOffset, bool bFixed) + : m_ownerWorld (ownerWorld) + { + btVector3 vUp(0, 1, 0); + + // + // Setup geometry + // + float fBodySize = 0.25f; + float fLegLength = 0.45f; + float fForeLegLength = 0.75f; + m_shapes[0] = new btCapsuleShape(btScalar(fBodySize), btScalar(0.10)); + int i; + for ( i=0; isetDamping(0.05, 0.85); + m_bodies[i]->setDeactivationTime(0.8); + //m_bodies[i]->setSleepingThresholds(1.6, 2.5); + m_bodies[i]->setSleepingThresholds(0.5f, 0.5f); + } + + + // + // Setup the constraints + // + btHingeConstraint* hingeC; + //btConeTwistConstraint* coneC; + + btTransform localA, localB, localC; + + for ( i=0; igetWorldTransform().inverse() * m_bodies[0]->getWorldTransform() * localA; + hingeC = new btHingeConstraint(*m_bodies[0], *m_bodies[1+2*i], localA, localB); + hingeC->setLimit(btScalar(-0.75 * M_PI_4), btScalar(M_PI_8)); + //hingeC->setLimit(btScalar(-0.1), btScalar(0.1)); + m_joints[2*i] = hingeC; + m_ownerWorld->addConstraint(m_joints[2*i], true); + + // knee joints + localA.setIdentity(); localB.setIdentity(); localC.setIdentity(); + localA.getBasis().setEulerZYX(0,-fAngle,0); localA.setOrigin(btVector3(btScalar(fCos*(fBodySize+fLegLength)), btScalar(0.), btScalar(fSin*(fBodySize+fLegLength)))); + localB = m_bodies[1+2*i]->getWorldTransform().inverse() * m_bodies[0]->getWorldTransform() * localA; + localC = m_bodies[2+2*i]->getWorldTransform().inverse() * m_bodies[0]->getWorldTransform() * localA; + hingeC = new btHingeConstraint(*m_bodies[1+2*i], *m_bodies[2+2*i], localB, localC); + //hingeC->setLimit(btScalar(-0.01), btScalar(0.01)); + hingeC->setLimit(btScalar(-M_PI_8), btScalar(0.2)); + m_joints[1+2*i] = hingeC; + m_ownerWorld->addConstraint(m_joints[1+2*i], true); + } + } + + virtual ~TestRig () + { + int i; + + // Remove all constraints + for ( i = 0; i < JOINT_COUNT; ++i) + { + m_ownerWorld->removeConstraint(m_joints[i]); + delete m_joints[i]; m_joints[i] = 0; + } + + // Remove all bodies and shapes + for ( i = 0; i < BODYPART_COUNT; ++i) + { + m_ownerWorld->removeRigidBody(m_bodies[i]); + + delete m_bodies[i]->getMotionState(); + + delete m_bodies[i]; m_bodies[i] = 0; + delete m_shapes[i]; m_shapes[i] = 0; + } + } + + btTypedConstraint** GetJoints() {return &m_joints[0];} + +}; + + + + + + + +void MotorDemo::initPhysics() +{ + setTexturing(true); + setShadows(true); + + // Setup the basic world + + m_Time = 0; + m_fCyclePeriod = 2000.f; // in milliseconds + +// m_fMuscleStrength = 0.05f; + // new SIMD solver for joints clips accumulated impulse, so the new limits for the motor + // should be (numberOfsolverIterations * oldLimits) + // currently solver uses 10 iterations, so: + m_fMuscleStrength = 0.5f; + + setCameraDistance(btScalar(5.)); + + m_collisionConfiguration = new btDefaultCollisionConfiguration(); + + m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); + + btVector3 worldAabbMin(-10000,-10000,-10000); + btVector3 worldAabbMax(10000,10000,10000); + m_broadphase = new btAxisSweep3 (worldAabbMin, worldAabbMax); + + m_solver = new btSequentialImpulseConstraintSolver; + + m_dynamicsWorld = new btDiscreteDynamicsWorld(m_dispatcher,m_broadphase,m_solver,m_collisionConfiguration); + + + // Setup a big ground box + { + btCollisionShape* groundShape = new btBoxShape(btVector3(btScalar(200.),btScalar(10.),btScalar(200.))); + m_collisionShapes.push_back(groundShape); + btTransform groundTransform; + groundTransform.setIdentity(); + groundTransform.setOrigin(btVector3(0,-10,0)); + localCreateRigidBody(btScalar(0.),groundTransform,groundShape); + } + + // Spawn one ragdoll + btVector3 startOffset(1,0.5,0); + spawnTestRig(startOffset, false); + startOffset.setValue(-2,0.5,0); + spawnTestRig(startOffset, true); + + clientResetScene(); +} + + +void MotorDemo::spawnTestRig(const btVector3& startOffset, bool bFixed) +{ + TestRig* rig = new TestRig(m_dynamicsWorld, startOffset, bFixed); + m_rigs.push_back(rig); +} + +void MotorDemo::clientMoveAndDisplay() +{ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + //simple dynamics world doesn't handle fixed-time-stepping + float ms = getDeltaTimeMicroseconds(); + float minFPS = 1000000.f/60.f; + if (ms > minFPS) + ms = minFPS; + + m_Time += ms; + + // + // set per-frame sinusoidal position targets using angular motor (hacky?) + // + for (int r=0; r(m_rigs[r]->GetJoints()[i]); + btScalar fCurAngle = hingeC->getHingeAngle(); + + btScalar fTargetPercent = (int(m_Time / 1000) % int(m_fCyclePeriod)) / m_fCyclePeriod; + btScalar fTargetAngle = 0.5 * (1 + sin(2 * M_PI * fTargetPercent)); + btScalar fTargetLimitAngle = hingeC->getLowerLimit() + fTargetAngle * (hingeC->getUpperLimit() - hingeC->getLowerLimit()); + btScalar fAngleError = fTargetLimitAngle - fCurAngle; + btScalar fDesiredAngularVel = 1000000.f * fAngleError/ms; + hingeC->enableAngularMotor(true, fDesiredAngularVel, m_fMuscleStrength); + } + } + + + if (m_dynamicsWorld) + { + m_dynamicsWorld->stepSimulation(ms / 1000000.f); + m_dynamicsWorld->debugDrawWorld(); + } + + renderme(); + + for (int i=2; i>=0 ;i--) + { + btCollisionObject* obj = m_dynamicsWorld->getCollisionObjectArray()[i]; + btRigidBody* body = btRigidBody::upcast(obj); + drawFrame(body->getWorldTransform()); + } + + glFlush(); + + glutSwapBuffers(); +} + +void MotorDemo::displayCallback() +{ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + if (m_dynamicsWorld) + m_dynamicsWorld->debugDrawWorld(); + + renderme(); + + glFlush(); + glutSwapBuffers(); +} + +void MotorDemo::keyboardCallback(unsigned char key, int x, int y) +{ + switch (key) + { + case '+': case '=': + m_fCyclePeriod /= 1.1f; + if (m_fCyclePeriod < 1.f) + m_fCyclePeriod = 1.f; + break; + case '-': case '_': + m_fCyclePeriod *= 1.1f; + break; + case '[': + m_fMuscleStrength /= 1.1f; + break; + case ']': + m_fMuscleStrength *= 1.1f; + break; + default: + DemoApplication::keyboardCallback(key, x, y); + } +} + + + +void MotorDemo::exitPhysics() +{ + + int i; + + for (i=0;igetNumCollisionObjects()-1; i>=0 ;i--) + { + btCollisionObject* obj = m_dynamicsWorld->getCollisionObjectArray()[i]; + btRigidBody* body = btRigidBody::upcast(obj); + if (body && body->getMotionState()) + { + delete body->getMotionState(); + } + m_dynamicsWorld->removeCollisionObject( obj ); + delete obj; + } + + //delete collision shapes + for (int j=0;j m_rigs; + + //keep the collision shapes, for deletion/cleanup + btAlignedObjectArray m_collisionShapes; + + btBroadphaseInterface* m_broadphase; + + btCollisionDispatcher* m_dispatcher; + + btConstraintSolver* m_solver; + + btDefaultCollisionConfiguration* m_collisionConfiguration; + +public: + void initPhysics(); + + void exitPhysics(); + + virtual ~MotorDemo() + { + exitPhysics(); + } + + void spawnTestRig(const btVector3& startOffset, bool bFixed); + + virtual void clientMoveAndDisplay(); + + virtual void displayCallback(); + + virtual void keyboardCallback(unsigned char key, int x, int y); + + static DemoApplication* Create() + { + MotorDemo* demo = new MotorDemo(); + demo->myinit(); + demo->initPhysics(); + return demo; + } + +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Demos/DynamicControlDemo/main.cpp b/BulletPhysics/bulletTrunk/Demos/DynamicControlDemo/main.cpp new file mode 100644 index 00000000..188c88d5 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/DynamicControlDemo/main.cpp @@ -0,0 +1,28 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + + +#include "MotorDemo.h" +#include "GlutStuff.h" + +int main(int argc,char* argv[]) +{ + MotorDemo demoApp; + + demoApp.initPhysics(); + + + return glutmain(argc, argv,640,480,"Bullet Physics Demo. http://bullet.sf.net",&demoApp); +} diff --git a/BulletPhysics/bulletTrunk/Demos/EPAPenDepthDemo/Jamfile b/BulletPhysics/bulletTrunk/Demos/EPAPenDepthDemo/Jamfile new file mode 100644 index 00000000..bd058241 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/EPAPenDepthDemo/Jamfile @@ -0,0 +1,20 @@ +SubDir TOP Demos EPAPenDepthDemo ; + +#some demos need extra functionality, Collada / ConvexDecomposition etc. + + rule ExtraDemo4 + + { + Application $(<) : $(>) : noinstall console nomanifest ; + LinkWith $(<) : bulletopenglsupport bulletdynamics bulletcollision bulletmath ; + CFlags $(<) : + [ FIncludes $(TOP)/Demos/OpenGL ] + [ FIncludes $(TOP)/Extras/GIMPACT/include ] + + ; + + MsvcIncDirs $(<) : + "../../Demos/OpenGL" ; + } + +ExtraDemo4 EPAPenDepthDemo : [ Wildcard *.h *.cpp ] ; diff --git a/BulletPhysics/bulletTrunk/Demos/EPAPenDepthDemo/PenetrationTestBullet.cpp b/BulletPhysics/bulletTrunk/Demos/EPAPenDepthDemo/PenetrationTestBullet.cpp new file mode 100644 index 00000000..24b99815 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/EPAPenDepthDemo/PenetrationTestBullet.cpp @@ -0,0 +1,857 @@ + +///contribution by Pierre Terdiman to check penetration depth solvers +///see http://www.continuousphysics.com/Bullet/phpBB2/viewtopic.php?t=638 + +#ifdef WIN32//for glut.h +#include +#endif + + +//think different +#if defined(__APPLE__) && !defined (VMDMESA) +#include +#include +#include +#else +#include +#endif + +#include +#include +#include + +#define VERBOSE_TEXT_ONSCREEN 1 +#ifdef VERBOSE_TEXT_ONSCREEN +#include "BMF_Api.h" +#endif + +#include "btBulletCollisionCommon.h" + +#include "BulletCollision/NarrowPhaseCollision/btDiscreteCollisionDetectorInterface.h" +#include "BulletCollision/NarrowPhaseCollision/btSimplexSolverInterface.h" +#include "BulletCollision/NarrowPhaseCollision/btMinkowskiPenetrationDepthSolver.h" +#include "BulletCollision/NarrowPhaseCollision/btGjkPairDetector.h" +#include "BulletCollision/NarrowPhaseCollision/btGjkEpaPenetrationDepthSolver.h" +#include "LinearMath/btStackAlloc.h" + +//We can use the Bullet EPA or sampling penetration depth solver, but comparison might be useful +//#define COMPARE_WITH_SOLID35_AND_OTHER_EPA 1 +#ifdef COMPARE_WITH_SOLID35_AND_OTHER_EPA +#include "../Extras/ExtraSolid35/Solid3EpaPenetrationDepth.h" +#include "../Extras/ExtraSolid35/Solid3JohnsonSimplexSolver.h" +#include "../Extras/EPA/EpaPenetrationDepthSolver.h" +#endif //COMPARE_WITH_SOLID35_AND_OTHER_EPA + +#define USE_ORIGINAL 1 +#ifndef USE_ORIGINAL +#include "BulletCollision/NarrowPhaseCollision/btGjkEpa2.h" +#endif //USE_ORIGINAL + +static bool gRefMode = false; +static int gMethod = 0; +static int gLastUsedMethod = -1; +static int gNumGjkIterations = -1; +static int gLastDegenerateSimplex = -1; + +static const float gDisp = 0.01f; +static const float gCamSpeed = 0.1f; +static btVector3 Eye(3.0616338f, 1.1985892f, 2.5769043f); +static btVector3 Dir(-0.66853905,-0.14004262,-0.73037237); +static btVector3 N; +static int mx = 0; +static int my = 0; +static int glutScreenHeight = 512; +static int glutScreenWidth = 512; + +static void DrawLine(const btVector3& p0, const btVector3& p1, const btVector3& color, float line_width) +{ + glDisable(GL_LIGHTING); + glLineWidth(line_width); + glColor4f(color.x(), color.y(), color.z(), 1.0f); + btVector3 tmp[] = {p0, p1}; + glEnableClientState(GL_VERTEX_ARRAY); +#ifndef BT_USE_DOUBLE_PRECISION + glVertexPointer(3, GL_FLOAT, sizeof(btVector3), &tmp[0].x()); +#else + glVertexPointer(3, GL_DOUBLE, sizeof(btVector3), &tmp[0].x()); +#endif + glDrawArrays(GL_LINES, 0, 2); + glDisableClientState(GL_VERTEX_ARRAY); + glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + glEnable(GL_LIGHTING); +} + +void DrawTriangle(const btVector3& p0, const btVector3& p1, const btVector3& p2, const btVector3& color) +{ +// glDisable(GL_LIGHTING); + glColor4f(color.x(), color.y(), color.z(), 1.0f); + btVector3 tmp[] = {p0, p1, p2}; + glEnableClientState(GL_VERTEX_ARRAY); +#ifndef BT_USE_DOUBLE_PRECISION + glVertexPointer(3, GL_FLOAT, sizeof(btVector3), &tmp[0].x()); +#else + glVertexPointer(3, GL_DOUBLE, sizeof(btVector3), &tmp[0].x()); +#endif + glDrawArrays(GL_TRIANGLES, 0, 3); + glDisableClientState(GL_VERTEX_ARRAY); +// glColor4f(1.0f, 1.0f, 1.0f, 1.0f); +// glEnable(GL_LIGHTING); +} + +class MyPoly +{ + public: + MyPoly() : mNbVerts(0), mIndices(NULL) {} + ~MyPoly() { delete[]mIndices; } + + short mNbVerts; + char* mIndices; + float mPlane[4]; +}; + +class MyConvex +{ + public: + MyConvex(); + ~MyConvex(); + + bool LoadFromFile(const char* filename); + void Render(bool only_wireframe, const btVector3& wire_color) const; + void Project(const btVector3& dir, float& min, float& max) const; + + int mNbVerts; + btVector3* mVerts; + int mNbPolys; + MyPoly* mPolys; + btTransform mTransform; +}; + +MyConvex::MyConvex() : + mNbVerts (0), + mVerts (NULL), + mNbPolys (0), + mPolys (NULL) +{ + mTransform.setIdentity(); +} + +MyConvex::~MyConvex() +{ + delete[]mPolys; + delete[]mVerts; +} + +bool MyConvex::LoadFromFile(const char* filename) +{ + FILE* fp = fopen(filename, "rb"); + if(!fp) return false; + + fread(&mNbVerts, sizeof(int), 1, fp); + + int i; + + mVerts = new btVector3[mNbVerts]; + for( i=0;i max) max = dp; + } + if(min>max) + { + float tmp = min; + min = max; + max = tmp; + } +} + +static btVector3 gNormal; +static btVector3 gPoint; +static float gDepth; + + struct MyResult : public btDiscreteCollisionDetectorInterface::Result + { + virtual void setShapeIdentifiers(int partId0, int index0, int partId1, int index1) + { + } + + virtual void addContactPoint(const btVector3& normalOnBInWorld, const btVector3& pointInWorld, btScalar depth) + { + gNormal = normalOnBInWorld; + gPoint = pointInWorld; + gDepth = depth; + } + }; + +//2 Mb by default, could be made smaller +btStackAlloc gStackAlloc(1024*1024*2); + +static bool TestEPA(const MyConvex& hull0, const MyConvex& hull1) +{ + static btSimplexSolverInterface simplexSolver; +#ifdef COMPARE_WITH_SOLID35_AND_OTHER_EPA +// static Solid3JohnsonSimplexSolver simplexSolver2; +#endif //COMPARE_WITH_SOLID35_AND_OTHER_EPA + + simplexSolver.reset(); + + btConvexHullShape convexA((btScalar*)hull0.mVerts, hull0.mNbVerts, sizeof(btVector3)); + btConvexHullShape convexB((btScalar*)hull1.mVerts, hull1.mNbVerts, sizeof(btVector3)); + + static btGjkEpaPenetrationDepthSolver Solver0; + static btMinkowskiPenetrationDepthSolver Solver1; + +#ifdef COMPARE_WITH_SOLID35_AND_OTHER_EPA + static Solid3EpaPenetrationDepth Solver2; + static EpaPenetrationDepthSolver Solver3; +#endif + + + btConvexPenetrationDepthSolver* Solver = NULL ; + if(gMethod==0) + Solver = &Solver0; + else if(gMethod==1) + Solver = &Solver1; +#ifdef COMPARE_WITH_SOLID35_AND_OTHER_EPA + else if(gMethod==2) + Solver = &Solver2; + else + Solver = &Solver3; +#endif //COMPARE_WITH_SOLID35_AND_OTHER_EPA + + +#ifdef USE_ORIGINAL + + btGjkPairDetector GJK(&convexA, &convexB, &simplexSolver, Solver); + GJK.m_catchDegeneracies = 1; + convexA.setMargin(0.01f); + convexB.setMargin(0.01f); + + btDiscreteCollisionDetectorInterface::ClosestPointInput input; + input.m_transformA = hull0.mTransform; + input.m_transformB = hull1.mTransform; + input.m_stackAlloc = &gStackAlloc; + + MyResult output; + GJK.getClosestPoints(input, output, 0); + gLastUsedMethod = GJK.m_lastUsedMethod; + gNumGjkIterations = GJK.m_curIter; + gLastDegenerateSimplex= GJK.m_degenerateSimplex; +#else + MyResult output; + btVector3 witnesses[2]; + btVector3 normal; + btScalar depth; + + btGjkEpaSolver::sResults results; + btScalar radialMargin = 0.01f; + + btGjkEpaSolver::Collide(&convexA,hull0.mTransform, + &convexB,hull1.mTransform, + radialMargin, + results); + if (results.depth>0) + { + output.addContactPoint(results.normal,results.witnesses[1],-results.depth); + } +#endif + return true; +} + +static bool TestSepAxis(const btVector3& sep_axis, const MyConvex& hull0, const MyConvex& hull1, float& depth) +{ + float Min0,Max0; + float Min1,Max1; + hull0.Project(sep_axis, Min0, Max0); + hull1.Project(sep_axis, Min1, Max1); + + if(Max0=0.0f); + float d1 = Max1 - Min0; + assert(d1>=0.0f); + depth = d01e-6 || fabsf(v.y())>1e-6 || fabsf(v.z())>1e-6) return false; + return true; +} + +static bool ReferenceCode(const MyConvex& hull0, const MyConvex& hull1, float& dmin, btVector3& sep) +{ + dmin = FLT_MAX; + + int i; + + // Test normals from hull0 + for( i=0;i0.0f) sep = -sep; + + return true; +} + + + +static MyConvex gConvex0; +static MyConvex gConvex1; + +static void KeyboardCallback(unsigned char key, int x, int y) +{ + switch (key) + { + case 27: exit(0); break; + + case 'R': + case 'r': + gRefMode = !gRefMode; + break; + + case ' ': + gMethod++; +#ifdef COMPARE_WITH_SOLID35_AND_OTHER_EPA + if(gMethod==4) gMethod=0; +#else + if(gMethod==2) gMethod=0; +#endif + break; + + case '4': + gConvex0.mTransform.setOrigin(gConvex0.mTransform.getOrigin() + btVector3(-gDisp,0,0)); + break; + case '7': + gConvex0.mTransform.setRotation(gConvex0.mTransform.getRotation()*btQuaternion(btVector3(1,0,0),0.01)); + break; + case '9': + gConvex0.mTransform.setRotation(gConvex0.mTransform.getRotation()*btQuaternion(btVector3(1,0,0),-0.01)); + break; + case '1': + gConvex0.mTransform.setRotation(gConvex0.mTransform.getRotation()*btQuaternion(btVector3(0,1,0),0.01)); + break; + case '3': + gConvex0.mTransform.setRotation(gConvex0.mTransform.getRotation()*btQuaternion(btVector3(0,1,0),-0.01)); + break; + case '5': + gConvex0.mTransform.setRotation(gConvex0.mTransform.getRotation()*btQuaternion(btVector3(0,0,1),0.01)); + break; + + case '6': + gConvex0.mTransform.setOrigin(gConvex0.mTransform.getOrigin() + btVector3(gDisp,0,0)); + break; + case '8': + gConvex0.mTransform.setOrigin(gConvex0.mTransform.getOrigin() + btVector3(0,gDisp,0)); + break; + case '2': + gConvex0.mTransform.setOrigin(gConvex0.mTransform.getOrigin() + btVector3(0,-gDisp,0)); + break; + + case 101: Eye += Dir * gCamSpeed; break; + case 103: Eye -= Dir * gCamSpeed; break; + case 100: Eye -= N * gCamSpeed; break; + case 102: Eye += N * gCamSpeed; break; + } +} + +static void ArrowKeyCallback(int key, int x, int y) +{ + KeyboardCallback(key,x,y); +} + +static void MouseCallback(int button, int state, int x, int y) +{ + mx = x; + my = y; +} + +static const float NxPiF32 = 3.141592653589793f; + +float degToRad(float a) + { + return (float)0.01745329251994329547 * a; + } + +class NxQuat + { + public: + NxQuat(){} + + NxQuat(const float angle, const btVector3 & axis) + { + x = axis.x(); + y = axis.y(); + z = axis.z(); + + const float i_length = 1.0f / sqrtf( x*x + y*y + z*z ); + x = x * i_length; + y = y * i_length; + z = z * i_length; + + float Half = degToRad(angle * 0.5f); + + w = cosf(Half); + const float sin_theta_over_two = sinf(Half ); + x = x * sin_theta_over_two; + y = y * sin_theta_over_two; + z = z * sin_theta_over_two; + } + + void multiply(const NxQuat& left, const btVector3& right) + { + float a,b,c,d; + + a = - left.x*right.x() - left.y*right.y() - left.z *right.z(); + b = left.w*right.x() + left.y*right.z() - right.y()*left.z; + c = left.w*right.y() + left.z*right.x() - right.z()*left.x; + d = left.w*right.z() + left.x*right.y() - right.x()*left.y; + + w = a; + x = b; + y = c; + z = d; + } + + void rotate(btVector3 & v) const + { + NxQuat myInverse; + myInverse.x = -x; + myInverse.y = -y; + myInverse.z = -z; + myInverse.w = w; + + NxQuat left; + left.multiply(*this,v); + float vx = left.w*myInverse.x + myInverse.w*left.x + left.y*myInverse.z - myInverse.y*left.z; + float vy = left.w*myInverse.y + myInverse.w*left.y + left.z*myInverse.x - myInverse.z*left.x; + float vz = left.w*myInverse.z + myInverse.w*left.z + left.x*myInverse.y - myInverse.x*left.y; + v.setValue(vx, vy, vz); + } + + float x,y,z,w; +}; + + +static void MotionCallback(int x, int y) +{ + int dx = mx - x; + int dy = my - y; + + Dir = Dir.normalize(); + N = Dir.cross(btVector3(0,1,0)); + + NxQuat qx(NxPiF32 * dx * 20/ 180.0f, btVector3(0,1,0)); + qx.rotate(Dir); + NxQuat qy(NxPiF32 * dy * 20/ 180.0f, N); + qy.rotate(Dir); + + mx = x; + my = y; +} + +static void RenderCallback() +{ + // Clear buffers + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + // Setup camera + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + gluPerspective(60.0f, ((float)glutGet(GLUT_WINDOW_WIDTH))/((float)glutGet(GLUT_WINDOW_HEIGHT)), 1.0f, 10000.0f); + gluLookAt(Eye.x(), Eye.y(), Eye.z(), Eye.x() + Dir.x(), Eye.y() + Dir.y(), Eye.z() + Dir.z(), 0.0f, 1.0f, 0.0f); + + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + + glEnable(GL_LIGHTING); + + //clear previous frames result + gNormal.setValue(10,0,0); + gPoint.setValue(0,0,0); + gDepth = 999.999; + gLastUsedMethod = -1; + gNumGjkIterations = -1; + + + TestEPA(gConvex0, gConvex1); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + + btVector3 RefSep(btScalar(0.), btScalar(0.), btScalar(0.)); + float RefDMin=0.f; + bool RefResult = false; + if(gRefMode) + RefResult = ReferenceCode(gConvex0, gConvex1, RefDMin, RefSep); + +// DrawLine(gPoint, gPoint + gNormal*20.0f, btVector3(1,0,0), 2.0f); +// printf("%f: %f %f %f\n", gDepth, gNormal.x(), gNormal.y(), gNormal.z()); + +#ifdef VERBOSE_TEXT_ONSCREEN + glColor3f(255.f, 255.f, 255.f); + + setOrthographicProjection(); + float xOffset = 10.f; + float yStart = 20.f; + float yIncr = 20.f; + char buf[124]; + + glRasterPos3f(xOffset,yStart,0); + sprintf(buf,"gDepth=%f: gNormal=(%f %f %f)\n", gDepth, gNormal.x(), gNormal.y(), gNormal.z()); + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); + yStart += yIncr; + + glRasterPos3f(xOffset,yStart,0); + sprintf(buf,"num GJK iterations =%d\n", gNumGjkIterations); + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); + yStart += yIncr; + + glRasterPos3f(xOffset,yStart,0); + sprintf(buf,"gLastUsedMethod=%d\n", gLastUsedMethod); + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); + yStart += yIncr; + + + + + + if (gLastUsedMethod >= 3) + { + switch ( gMethod) + { + case 0: + sprintf(buf,"Bullet GjkEpa Penetration depth solver (zlib free\n" ); + break; + case 1: + sprintf(buf,"Bullet Minkowski sampling Penetration depth solver\n" ); + break; + case 2: + sprintf(buf,"Solid35 EPA Penetration depth solver\n" ); + break; + case 3: + sprintf(buf,"EPA Penetration depth solver (Experimental/WorkInProgress, zlib free\n" ); + break; + default: + sprintf(buf,"Unknown Penetration Depth\n" ); + } + glRasterPos3f(xOffset,yStart,0); + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); + yStart += yIncr; + + } else + { + glRasterPos3f(xOffset,yStart,0); + sprintf(buf,"Hybrid GJK method %d\n", gLastUsedMethod); + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); + yStart += yIncr; + } + + if (gLastDegenerateSimplex) + { + glRasterPos3f(xOffset,yStart,0); + sprintf(buf,"DegenerateSimplex %d\n", gLastDegenerateSimplex); + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); + yStart += yIncr; + } + + + + + resetPerspectiveProjection(); +#endif //VERBOSE_TEXT_ONSCREEN + + btVector3 color(0,0,0); + gConvex0.Render(false, color); + gConvex1.Render(false, color); + + if(gDepth<0.0f) + { + btTransform Saved = gConvex0.mTransform; + gConvex0.mTransform.setOrigin(gConvex0.mTransform.getOrigin() - btVector3(gNormal*gDepth)); + gConvex0.Render(true, btVector3(1.0f, 0.5f, 0.0f)); + gConvex0.mTransform = Saved; + } + else + { + DrawLine(gPoint, gPoint + gNormal, btVector3(0,1,0), 2.0f); + } + + if(RefResult & gRefMode) + { + btTransform Saved = gConvex0.mTransform; + gConvex0.mTransform.setOrigin(gConvex0.mTransform.getOrigin() + btVector3(RefSep*RefDMin)); + gConvex0.Render(true, btVector3(0.0f, 0.5f, 1.0f)); + gConvex0.mTransform = Saved; + } + + glutSwapBuffers(); +} + +static void ReshapeCallback(int width, int height) +{ + glViewport(0, 0, width, height); +} + +static void IdleCallback() +{ + glutPostRedisplay(); +} + +int main(int argc, char** argv) +{ + // Initialize Glut + glutInit(&argc, argv); + glutInitWindowSize(glutScreenWidth, glutScreenHeight); + glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); + int mainHandle = glutCreateWindow("TestBullet"); + glutSetWindow(mainHandle); + glutDisplayFunc(RenderCallback); + glutReshapeFunc(ReshapeCallback); + glutIdleFunc(IdleCallback); + glutKeyboardFunc(KeyboardCallback); + glutSpecialFunc(ArrowKeyCallback); + glutMouseFunc(MouseCallback); + glutMotionFunc(MotionCallback); + MotionCallback(0,0); + + // Setup default render states + glClearColor(0.3f, 0.4f, 0.5f, 1.0); + glEnable(GL_DEPTH_TEST); + glEnable(GL_COLOR_MATERIAL); + glEnable(GL_CULL_FACE); + + // Setup lighting + glEnable(GL_LIGHTING); + float AmbientColor[] = { 0.0f, 0.1f, 0.2f, 0.0f }; glLightfv(GL_LIGHT0, GL_AMBIENT, AmbientColor); + float DiffuseColor[] = { 1.0f, 1.0f, 1.0f, 0.0f }; glLightfv(GL_LIGHT0, GL_DIFFUSE, DiffuseColor); + float SpecularColor[] = { 0.0f, 0.0f, 0.0f, 0.0f }; glLightfv(GL_LIGHT0, GL_SPECULAR, SpecularColor); + float Position[] = { -10.0f, 1000.0f, -4.0f, 1.0f }; glLightfv(GL_LIGHT0, GL_POSITION, Position); + glEnable(GL_LIGHT0); + + // + bool Status = gConvex0.LoadFromFile("convex0.bin"); + if(!Status) + { + Status = gConvex0.LoadFromFile("../../convex0.bin"); + if(!Status) + { + printf("Failed to load object!\n"); + exit(0); + } + } + Status = gConvex1.LoadFromFile("convex0.bin"); + if(!Status) + { + Status = gConvex1.LoadFromFile("../../convex0.bin"); + if(!Status) + { + printf("Failed to load object!\n"); + exit(0); + } + } + +// gConvex0.mTransform.setOrigin(btVector3(1.0f, 1.0f, 0.0f)); + gConvex0.mTransform.setOrigin(btVector3(0.20000069f, 0.95000005f, 0.0f)); + + // Run + glutMainLoop(); + + return 0; +} diff --git a/BulletPhysics/bulletTrunk/Demos/ForkLiftDemo/CMakeLists.txt b/BulletPhysics/bulletTrunk/Demos/ForkLiftDemo/CMakeLists.txt new file mode 100644 index 00000000..fd3ef5a7 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/ForkLiftDemo/CMakeLists.txt @@ -0,0 +1,62 @@ +# This is basically the overall name of the project in Visual Studio this is the name of the Solution File + + +# For every executable you have with a main method you should have an add_executable line below. +# For every add executable line you should list every .cpp and .h file you have associated with that executable. + + +# This is the variable for Windows. I use this to define the root of my directory structure. +SET(GLUT_ROOT ${BULLET_PHYSICS_SOURCE_DIR}/Glut) + +# You shouldn't have to modify anything below this line +######################################################## + + +# This is the shortcut to finding GLU, GLUT and OpenGL if they are properly installed on your system +# This should be the case. +INCLUDE (${CMAKE_ROOT}/Modules/FindGLU.cmake) +INCLUDE (${CMAKE_ROOT}/Modules/FindGLUT.cmake) +INCLUDE (${CMAKE_ROOT}/Modules/FindOpenGL.cmake) + + +IF (WIN32) + # This is the Windows code for which Opengl, and Glut are not properly installed + # since I can't install them I must cheat and copy libraries around + INCLUDE_DIRECTORIES(${GLUT_ROOT}) + # LINK_DIRECTORIES(${GLUT_ROOT}\\lib) + IF (${GLUT_glut_LIBRARY} MATCHES "GLUT_glut_LIBRARY-NOTFOUND") + SET(GLUT_glut_LIBRARY ${BULLET_PHYSICS_SOURCE_DIR}/Glut/glut32.lib) + # LINK_LIBRARIES(${GLUT_ROOT}\\lib\\glut32 ${OPENGL_gl_LIBRARY} ${OPENGL_glU_LIBRARY}) + # TARGET_LINK_LIBRARIES(table ${GLUT_ROOT}\\lib\\glut32) +# +# ADD_CUSTOM_COMMAND(TARGET table POST_BUILD COMMAND copy ${GLUT_ROOT}\\lib\\glut32.dll ${GLUT_ROOT}\\bin\\vs2005\\Debug +# COMMAND copy ${GLUT_ROOT}\\lib\\glut32.dll ${GLUT_ROOT}\\bin\\vs2003\\Debug +# COMMAND copy ${GLUT_ROOT}\\lib\\glut32.dll ${GLUT_ROOT}\\bin\\vs6\\Debug) + ELSE (${GLUT_glut_LIBRARY} MATCHES "GLUT_glut_LIBRARY-NOTFOUND") +# LINK_LIBRARIES(${GLUT_glut_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glU_LIBRARY}) +# TARGET_LINK_LIBRARIES(table ${GLUT_glut_LIBRARY}) + ENDIF(${GLUT_glut_LIBRARY} MATCHES "GLUT_glut_LIBRARY-NOTFOUND") +# TARGET_LINK_LIBRARIES(table ${OPENGL_gl_LIBRARY}) +# TARGET_LINK_LIBRARIES(table ${OPENGL_glu_LIBRARY}) +ELSE (WIN32) + # This is the lines for linux. This should always work if everything is installed and working fine. +# SET(CMAKE_BUILD_TYPE Debug) +# SET(CMAKE_CXX_FLAGS_DEBUG "-g") + INCLUDE_DIRECTORIES(/usr/include /usr/local/include ${GLUT_INCLUDE_DIR}) +# TARGET_LINK_LIBRARIES(table ${GLUT_glut_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glU_LIBRARY}) +# TARGET_LINK_LIBRARIES(checker ${GLUT_glut_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glU_LIBRARY}) +ENDIF (WIN32) + +INCLUDE_DIRECTORIES( +${BULLET_PHYSICS_SOURCE_DIR}/src ${BULLET_PHYSICS_SOURCE_DIR}/Demos/OpenGL } +) + +LINK_LIBRARIES( +OpenGLSupport BulletDynamics BulletCollision LinearMath ${GLUT_glut_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} +) + +ADD_EXECUTABLE(AppForkLiftDemo + ForkLiftDemo.cpp + main.cpp +) + diff --git a/BulletPhysics/bulletTrunk/Demos/ForkLiftDemo/ForkLiftDemo.cpp b/BulletPhysics/bulletTrunk/Demos/ForkLiftDemo/ForkLiftDemo.cpp new file mode 100644 index 00000000..9d64ac84 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/ForkLiftDemo/ForkLiftDemo.cpp @@ -0,0 +1,857 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +///September 2006: VehicleDemo is work in progress, this file is mostly just a placeholder +///This VehicleDemo file is very early in development, please check it later +///@todo is a basic engine model: +///A function that maps user input (throttle) into torque/force applied on the wheels +///with gears etc. +#include "btBulletDynamicsCommon.h" +#include "BulletCollision/CollisionShapes/btHeightfieldTerrainShape.h" + + +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#endif + +#ifndef M_PI_2 +#define M_PI_2 1.57079632679489661923 +#endif + +#ifndef M_PI_4 +#define M_PI_4 0.785398163397448309616 +#endif + +//#define LIFT_EPS 0.0000001f +// +// By default, Bullet Vehicle uses Y as up axis. +// You can override the up axis, for example Z-axis up. Enable this define to see how to: +//#define FORCE_ZAXIS_UP 1 +// + +#ifdef FORCE_ZAXIS_UP + int rightIndex = 0; + int upIndex = 2; + int forwardIndex = 1; + btVector3 wheelDirectionCS0(0,0,-1); + btVector3 wheelAxleCS(1,0,0); +#else + int rightIndex = 0; + int upIndex = 1; + int forwardIndex = 2; + btVector3 wheelDirectionCS0(0,-1,0); + btVector3 wheelAxleCS(-1,0,0); +#endif + +#include "GLDebugDrawer.h" +#include //printf debugging + +#include "GL_ShapeDrawer.h" + +#include "GlutStuff.h" +#include "ForkLiftDemo.h" +#include "BMF_Api.h" + +const int maxProxies = 32766; +const int maxOverlap = 65535; + +///btRaycastVehicle is the interface for the constraint that implements the raycast vehicle +///notice that for higher-quality slow-moving vehicles, another approach might be better +///implementing explicit hinged-wheel constraints with cylinder collision, rather then raycasts +float gEngineForce = 0.f; + +float defaultBreakingForce = 10.f; +float gBreakingForce = 100.f; + +float maxEngineForce = 1000.f;//this should be engine/velocity dependent +float maxBreakingForce = 100.f; + +float gVehicleSteering = 0.f; +float steeringIncrement = 0.04f; +float steeringClamp = 0.3f; +float wheelRadius = 0.5f; +float wheelWidth = 0.4f; +float wheelFriction = 1000;//1e30f; +float suspensionStiffness = 20.f; +float suspensionDamping = 2.3f; +float suspensionCompression = 4.4f; +float rollInfluence = 0.1f;//1.0f; + + +btScalar suspensionRestLength(0.6); + +#define CUBE_HALF_EXTENTS 1 + + + +//////////////////////////////////// + + + + +ForkLiftDemo::ForkLiftDemo() +: +m_carChassis(0), +m_liftBody(0), +m_forkBody(0), +m_loadBody(0), +m_cameraHeight(4.f), +m_minCameraDistance(3.f), +m_maxCameraDistance(10.f), +m_indexVertexArrays(0), +m_vertices(0) +{ + m_vehicle = 0; + m_cameraPosition = btVector3(30,30,30); + m_useDefaultCamera = false; + setTexturing(true); + setShadows(true); + +} + + +void ForkLiftDemo::termPhysics() +{ + //cleanup in the reverse order of creation/initialization + + //remove the rigidbodies from the dynamics world and delete them + int i; + for (i=m_dynamicsWorld->getNumCollisionObjects()-1; i>=0 ;i--) + { + btCollisionObject* obj = m_dynamicsWorld->getCollisionObjectArray()[i]; + btRigidBody* body = btRigidBody::upcast(obj); + if (body && body->getMotionState()) + { + + while (body->getNumConstraintRefs()) + { + btTypedConstraint* constraint = body->getConstraintRef(0); + m_dynamicsWorld->removeConstraint(constraint); + delete constraint; + } + delete body->getMotionState(); + m_dynamicsWorld->removeRigidBody(body); + } else + { + m_dynamicsWorld->removeCollisionObject( obj ); + } + delete obj; + } + + //delete collision shapes + for (int j=0;jsetGravity(btVector3(0,0,-10)); +#endif + + //m_dynamicsWorld->setGravity(btVector3(0,0,0)); +btTransform tr; +tr.setIdentity(); +tr.setOrigin(btVector3(0,-10,0)); + +//either use heightfield or triangle mesh + + + //create ground object + localCreateRigidBody(0,tr,groundShape); + +#ifdef FORCE_ZAXIS_UP +// indexRightAxis = 0; +// indexUpAxis = 2; +// indexForwardAxis = 1; + btCollisionShape* chassisShape = new btBoxShape(btVector3(1.f,2.f, 0.5f)); + btCompoundShape* compound = new btCompoundShape(); + btTransform localTrans; + localTrans.setIdentity(); + //localTrans effectively shifts the center of mass with respect to the chassis + localTrans.setOrigin(btVector3(0,0,1)); +#else + btCollisionShape* chassisShape = new btBoxShape(btVector3(1.f,0.5f,2.f)); + m_collisionShapes.push_back(chassisShape); + + btCompoundShape* compound = new btCompoundShape(); + m_collisionShapes.push_back(compound); + btTransform localTrans; + localTrans.setIdentity(); + //localTrans effectively shifts the center of mass with respect to the chassis + localTrans.setOrigin(btVector3(0,1,0)); +#endif + + compound->addChildShape(localTrans,chassisShape); + + { + btCollisionShape* suppShape = new btBoxShape(btVector3(0.5f,0.1f,0.5f)); + btTransform suppLocalTrans; + suppLocalTrans.setIdentity(); + //localTrans effectively shifts the center of mass with respect to the chassis + suppLocalTrans.setOrigin(btVector3(0,1.0,2.5)); + compound->addChildShape(suppLocalTrans, suppShape); + } + + tr.setOrigin(btVector3(0,0.f,0)); + + m_carChassis = localCreateRigidBody(800,tr,compound);//chassisShape); + //m_carChassis->setDamping(0.2,0.2); + + + { + btCollisionShape* liftShape = new btBoxShape(btVector3(0.5f,2.0f,0.05f)); + m_collisionShapes.push_back(liftShape); + btTransform liftTrans; + m_liftStartPos = btVector3(0.0f, 2.5f, 3.05f); + liftTrans.setIdentity(); + liftTrans.setOrigin(m_liftStartPos); + m_liftBody = localCreateRigidBody(10,liftTrans, liftShape); + + btTransform localA, localB; + localA.setIdentity(); + localB.setIdentity(); + localA.getBasis().setEulerZYX(0, M_PI_2, 0); + localA.setOrigin(btVector3(0.0, 1.0, 3.05)); + localB.getBasis().setEulerZYX(0, M_PI_2, 0); + localB.setOrigin(btVector3(0.0, -1.5, -0.05)); + m_liftHinge = new btHingeConstraint(*m_carChassis,*m_liftBody, localA, localB); +// m_liftHinge->setLimit(-LIFT_EPS, LIFT_EPS); + m_liftHinge->setLimit(0.0f, 0.0f); + m_dynamicsWorld->addConstraint(m_liftHinge, true); + + btCollisionShape* forkShapeA = new btBoxShape(btVector3(1.0f,0.1f,0.1f)); + m_collisionShapes.push_back(forkShapeA); + btCompoundShape* forkCompound = new btCompoundShape(); + m_collisionShapes.push_back(forkCompound); + btTransform forkLocalTrans; + forkLocalTrans.setIdentity(); + forkCompound->addChildShape(forkLocalTrans, forkShapeA); + + btCollisionShape* forkShapeB = new btBoxShape(btVector3(0.1f,0.02f,0.6f)); + m_collisionShapes.push_back(forkShapeB); + forkLocalTrans.setIdentity(); + forkLocalTrans.setOrigin(btVector3(-0.9f, -0.08f, 0.7f)); + forkCompound->addChildShape(forkLocalTrans, forkShapeB); + + btCollisionShape* forkShapeC = new btBoxShape(btVector3(0.1f,0.02f,0.6f)); + m_collisionShapes.push_back(forkShapeC); + forkLocalTrans.setIdentity(); + forkLocalTrans.setOrigin(btVector3(0.9f, -0.08f, 0.7f)); + forkCompound->addChildShape(forkLocalTrans, forkShapeC); + + btTransform forkTrans; + m_forkStartPos = btVector3(0.0f, 0.6f, 3.2f); + forkTrans.setIdentity(); + forkTrans.setOrigin(m_forkStartPos); + m_forkBody = localCreateRigidBody(5, forkTrans, forkCompound); + + localA.setIdentity(); + localB.setIdentity(); + localA.getBasis().setEulerZYX(0, 0, M_PI_2); + localA.setOrigin(btVector3(0.0f, -1.9f, 0.05f)); + localB.getBasis().setEulerZYX(0, 0, M_PI_2); + localB.setOrigin(btVector3(0.0, 0.0, -0.1)); + m_forkSlider = new btSliderConstraint(*m_liftBody, *m_forkBody, localA, localB, true); + m_forkSlider->setLowerLinLimit(0.1f); + m_forkSlider->setUpperLinLimit(0.1f); +// m_forkSlider->setLowerAngLimit(-LIFT_EPS); +// m_forkSlider->setUpperAngLimit(LIFT_EPS); + m_forkSlider->setLowerAngLimit(0.0f); + m_forkSlider->setUpperAngLimit(0.0f); + m_dynamicsWorld->addConstraint(m_forkSlider, true); + + + btCompoundShape* loadCompound = new btCompoundShape(); + m_collisionShapes.push_back(loadCompound); + btCollisionShape* loadShapeA = new btBoxShape(btVector3(2.0f,0.5f,0.5f)); + m_collisionShapes.push_back(loadShapeA); + btTransform loadTrans; + loadTrans.setIdentity(); + loadCompound->addChildShape(loadTrans, loadShapeA); + btCollisionShape* loadShapeB = new btBoxShape(btVector3(0.1f,1.0f,1.0f)); + m_collisionShapes.push_back(loadShapeB); + loadTrans.setIdentity(); + loadTrans.setOrigin(btVector3(2.1f, 0.0f, 0.0f)); + loadCompound->addChildShape(loadTrans, loadShapeB); + btCollisionShape* loadShapeC = new btBoxShape(btVector3(0.1f,1.0f,1.0f)); + m_collisionShapes.push_back(loadShapeC); + loadTrans.setIdentity(); + loadTrans.setOrigin(btVector3(-2.1f, 0.0f, 0.0f)); + loadCompound->addChildShape(loadTrans, loadShapeC); + loadTrans.setIdentity(); + m_loadStartPos = btVector3(0.0f, -3.5f, 7.0f); + loadTrans.setOrigin(m_loadStartPos); + m_loadBody = localCreateRigidBody(4, loadTrans, loadCompound); + } + + + + clientResetScene(); + + /// create vehicle + { + + m_vehicleRayCaster = new btDefaultVehicleRaycaster(m_dynamicsWorld); + m_vehicle = new btRaycastVehicle(m_tuning,m_carChassis,m_vehicleRayCaster); + + ///never deactivate the vehicle + m_carChassis->setActivationState(DISABLE_DEACTIVATION); + + m_dynamicsWorld->addVehicle(m_vehicle); + + float connectionHeight = 1.2f; + + + bool isFrontWheel=true; + + //choose coordinate system + m_vehicle->setCoordinateSystem(rightIndex,upIndex,forwardIndex); + +#ifdef FORCE_ZAXIS_UP + btVector3 connectionPointCS0(CUBE_HALF_EXTENTS-(0.3*wheelWidth),2*CUBE_HALF_EXTENTS-wheelRadius, connectionHeight); +#else + btVector3 connectionPointCS0(CUBE_HALF_EXTENTS-(0.3*wheelWidth),connectionHeight,2*CUBE_HALF_EXTENTS-wheelRadius); +#endif + + m_vehicle->addWheel(connectionPointCS0,wheelDirectionCS0,wheelAxleCS,suspensionRestLength,wheelRadius,m_tuning,isFrontWheel); +#ifdef FORCE_ZAXIS_UP + connectionPointCS0 = btVector3(-CUBE_HALF_EXTENTS+(0.3*wheelWidth),2*CUBE_HALF_EXTENTS-wheelRadius, connectionHeight); +#else + connectionPointCS0 = btVector3(-CUBE_HALF_EXTENTS+(0.3*wheelWidth),connectionHeight,2*CUBE_HALF_EXTENTS-wheelRadius); +#endif + + m_vehicle->addWheel(connectionPointCS0,wheelDirectionCS0,wheelAxleCS,suspensionRestLength,wheelRadius,m_tuning,isFrontWheel); +#ifdef FORCE_ZAXIS_UP + connectionPointCS0 = btVector3(-CUBE_HALF_EXTENTS+(0.3*wheelWidth),-2*CUBE_HALF_EXTENTS+wheelRadius, connectionHeight); +#else + connectionPointCS0 = btVector3(-CUBE_HALF_EXTENTS+(0.3*wheelWidth),connectionHeight,-2*CUBE_HALF_EXTENTS+wheelRadius); +#endif //FORCE_ZAXIS_UP + isFrontWheel = false; + m_vehicle->addWheel(connectionPointCS0,wheelDirectionCS0,wheelAxleCS,suspensionRestLength,wheelRadius,m_tuning,isFrontWheel); +#ifdef FORCE_ZAXIS_UP + connectionPointCS0 = btVector3(CUBE_HALF_EXTENTS-(0.3*wheelWidth),-2*CUBE_HALF_EXTENTS+wheelRadius, connectionHeight); +#else + connectionPointCS0 = btVector3(CUBE_HALF_EXTENTS-(0.3*wheelWidth),connectionHeight,-2*CUBE_HALF_EXTENTS+wheelRadius); +#endif + m_vehicle->addWheel(connectionPointCS0,wheelDirectionCS0,wheelAxleCS,suspensionRestLength,wheelRadius,m_tuning,isFrontWheel); + + for (int i=0;igetNumWheels();i++) + { + btWheelInfo& wheel = m_vehicle->getWheelInfo(i); + wheel.m_suspensionStiffness = suspensionStiffness; + wheel.m_wheelsDampingRelaxation = suspensionDamping; + wheel.m_wheelsDampingCompression = suspensionCompression; + wheel.m_frictionSlip = wheelFriction; + wheel.m_rollInfluence = rollInfluence; + } + } + + + setCameraDistance(26.f); + +} + + +//to be implemented by the demo +void ForkLiftDemo::renderme() +{ + + updateCamera(); + + btScalar m[16]; + int i; + + btCylinderShapeX wheelShape(btVector3(wheelWidth,wheelRadius,wheelRadius)); + btVector3 wheelColor(1,0,0); + + btVector3 worldBoundsMin,worldBoundsMax; + getDynamicsWorld()->getBroadphase()->getBroadphaseAabb(worldBoundsMin,worldBoundsMax); + + + + for (i=0;igetNumWheels();i++) + { + //synchronize the wheels with the (interpolated) chassis worldtransform + m_vehicle->updateWheelTransform(i,true); + //draw wheels (cylinders) + m_vehicle->getWheelInfo(i).m_worldTransform.getOpenGLMatrix(m); + m_shapeDrawer->drawOpenGL(m,&wheelShape,wheelColor,getDebugMode(),worldBoundsMin,worldBoundsMax); + } + + + int lineWidth=250; + int xStart = m_glutScreenWidth - lineWidth; + + + if((getDebugMode() & btIDebugDraw::DBG_NoHelpText)==0) + { + setOrthographicProjection(); + glDisable(GL_LIGHTING); + glColor3f(0, 0, 0); + char buf[124]; + glRasterPos3f(xStart, 20, 0); + sprintf(buf,"SHIFT+Cursor Left/Right - rotate lift"); + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); + glRasterPos3f(xStart, 40, 0); + sprintf(buf,"SHIFT+Cursor UP/Down - move fork up/down"); + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); + glRasterPos3f(xStart, 60, 0); + sprintf(buf,"F5 - toggle camera mode"); + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); + glRasterPos3f(xStart, 80, 0); + sprintf(buf,"Click inside this window for keyboard focus"); + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); + + + resetPerspectiveProjection(); + glEnable(GL_LIGHTING); + } + DemoApplication::renderme(); +} + +void ForkLiftDemo::clientMoveAndDisplay() +{ + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + + { + int wheelIndex = 2; + m_vehicle->applyEngineForce(gEngineForce,wheelIndex); + m_vehicle->setBrake(gBreakingForce,wheelIndex); + wheelIndex = 3; + m_vehicle->applyEngineForce(gEngineForce,wheelIndex); + m_vehicle->setBrake(gBreakingForce,wheelIndex); + + + wheelIndex = 0; + m_vehicle->setSteeringValue(gVehicleSteering,wheelIndex); + wheelIndex = 1; + m_vehicle->setSteeringValue(gVehicleSteering,wheelIndex); + + } + + + float dt = getDeltaTimeMicroseconds() * 0.000001f; + + if (m_dynamicsWorld) + { + //during idle mode, just run 1 simulation step maximum + int maxSimSubSteps = m_idle ? 1 : 2; + if (m_idle) + dt = 1.0/420.f; + + int numSimSteps = m_dynamicsWorld->stepSimulation(dt,maxSimSubSteps); + + +//#define VERBOSE_FEEDBACK +#ifdef VERBOSE_FEEDBACK + if (!numSimSteps) + printf("Interpolated transforms\n"); + else + { + if (numSimSteps > maxSimSubSteps) + { + //detect dropping frames + printf("Dropped (%i) simulation steps out of %i\n",numSimSteps - maxSimSubSteps,numSimSteps); + } else + { + printf("Simulated (%i) steps\n",numSimSteps); + } + } +#endif //VERBOSE_FEEDBACK + + } + + + + + + + +#ifdef USE_QUICKPROF + btProfiler::beginBlock("render"); +#endif //USE_QUICKPROF + + + renderme(); + + //optional but useful: debug drawing + if (m_dynamicsWorld) + m_dynamicsWorld->debugDrawWorld(); + +#ifdef USE_QUICKPROF + btProfiler::endBlock("render"); +#endif + + + glFlush(); + glutSwapBuffers(); + +} + + + +void ForkLiftDemo::displayCallback(void) +{ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + renderme(); + +//optional but useful: debug drawing + if (m_dynamicsWorld) + m_dynamicsWorld->debugDrawWorld(); + + glFlush(); + glutSwapBuffers(); +} + + + +void ForkLiftDemo::clientResetScene() +{ + gVehicleSteering = 0.f; + gBreakingForce = defaultBreakingForce; + gEngineForce = 0.f; + + m_carChassis->setCenterOfMassTransform(btTransform::getIdentity()); + m_carChassis->setLinearVelocity(btVector3(0,0,0)); + m_carChassis->setAngularVelocity(btVector3(0,0,0)); + m_dynamicsWorld->getBroadphase()->getOverlappingPairCache()->cleanProxyFromPairs(m_carChassis->getBroadphaseHandle(),getDynamicsWorld()->getDispatcher()); + if (m_vehicle) + { + m_vehicle->resetSuspension(); + for (int i=0;igetNumWheels();i++) + { + //synchronize the wheels with the (interpolated) chassis worldtransform + m_vehicle->updateWheelTransform(i,true); + } + } + btTransform liftTrans; + liftTrans.setIdentity(); + liftTrans.setOrigin(m_liftStartPos); + m_liftBody->activate(); + m_liftBody->setCenterOfMassTransform(liftTrans); + m_liftBody->setLinearVelocity(btVector3(0,0,0)); + m_liftBody->setAngularVelocity(btVector3(0,0,0)); + + btTransform forkTrans; + forkTrans.setIdentity(); + forkTrans.setOrigin(m_forkStartPos); + m_forkBody->activate(); + m_forkBody->setCenterOfMassTransform(forkTrans); + m_forkBody->setLinearVelocity(btVector3(0,0,0)); + m_forkBody->setAngularVelocity(btVector3(0,0,0)); + +// m_liftHinge->setLimit(-LIFT_EPS, LIFT_EPS); + m_liftHinge->setLimit(0.0f, 0.0f); + m_liftHinge->enableAngularMotor(false, 0, 0); + + + m_forkSlider->setLowerLinLimit(0.1f); + m_forkSlider->setUpperLinLimit(0.1f); + m_forkSlider->setPoweredLinMotor(false); + + btTransform loadTrans; + loadTrans.setIdentity(); + loadTrans.setOrigin(m_loadStartPos); + m_loadBody->activate(); + m_loadBody->setCenterOfMassTransform(loadTrans); + m_loadBody->setLinearVelocity(btVector3(0,0,0)); + m_loadBody->setAngularVelocity(btVector3(0,0,0)); + +} + + + +void ForkLiftDemo::specialKeyboardUp(int key, int x, int y) +{ + switch (key) + { + case GLUT_KEY_UP : + { + lockForkSlider(); + gEngineForce = 0.f; + gBreakingForce = defaultBreakingForce; + break; + } + case GLUT_KEY_DOWN : + { + lockForkSlider(); + gEngineForce = 0.f; + gBreakingForce = defaultBreakingForce; + break; + } + case GLUT_KEY_LEFT: + case GLUT_KEY_RIGHT: + { + lockLiftHinge(); + break; + } + default: + DemoApplication::specialKeyboardUp(key,x,y); + break; + } +} + + +void ForkLiftDemo::specialKeyboard(int key, int x, int y) +{ + + if (key==GLUT_KEY_END) + return; + + // printf("key = %i x=%i y=%i\n",key,x,y); + + int state; + state=glutGetModifiers(); + if (state & GLUT_ACTIVE_SHIFT) + { + switch (key) + { + case GLUT_KEY_LEFT : + { + + m_liftHinge->setLimit(-M_PI/16.0f, M_PI/8.0f); + m_liftHinge->enableAngularMotor(true, -0.1, 10.0); + break; + } + case GLUT_KEY_RIGHT : + { + + m_liftHinge->setLimit(-M_PI/16.0f, M_PI/8.0f); + m_liftHinge->enableAngularMotor(true, 0.1, 10.0); + break; + } + case GLUT_KEY_UP : + { + m_forkSlider->setLowerLinLimit(0.1f); + m_forkSlider->setUpperLinLimit(3.9f); + m_forkSlider->setPoweredLinMotor(true); + m_forkSlider->setMaxLinMotorForce(10.0); + m_forkSlider->setTargetLinMotorVelocity(1.0); + break; + } + case GLUT_KEY_DOWN : + { + m_forkSlider->setLowerLinLimit(0.1f); + m_forkSlider->setUpperLinLimit(3.9f); + m_forkSlider->setPoweredLinMotor(true); + m_forkSlider->setMaxLinMotorForce(10.0); + m_forkSlider->setTargetLinMotorVelocity(-1.0); + break; + } + + default: + DemoApplication::specialKeyboard(key,x,y); + break; + } + + } else + { + switch (key) + { + case GLUT_KEY_LEFT : + { + gVehicleSteering += steeringIncrement; + if ( gVehicleSteering > steeringClamp) + gVehicleSteering = steeringClamp; + + break; + } + case GLUT_KEY_RIGHT : + { + gVehicleSteering -= steeringIncrement; + if ( gVehicleSteering < -steeringClamp) + gVehicleSteering = -steeringClamp; + + break; + } + case GLUT_KEY_UP : + { + gEngineForce = maxEngineForce; + gBreakingForce = 0.f; + break; + } + case GLUT_KEY_DOWN : + { + gEngineForce = -maxEngineForce; + gBreakingForce = 0.f; + break; + } + + case GLUT_KEY_F5: + m_useDefaultCamera = !m_useDefaultCamera; + break; + default: + DemoApplication::specialKeyboard(key,x,y); + break; + } + + } + // glutPostRedisplay(); + + +} + +void ForkLiftDemo::updateCamera() +{ + +//#define DISABLE_CAMERA 1 + if(m_useDefaultCamera) + { + DemoApplication::updateCamera(); + return; + } + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + + btTransform chassisWorldTrans; + + //look at the vehicle + m_carChassis->getMotionState()->getWorldTransform(chassisWorldTrans); + m_cameraTargetPosition = chassisWorldTrans.getOrigin(); + + //interpolate the camera height +#ifdef FORCE_ZAXIS_UP + m_cameraPosition[2] = (15.0*m_cameraPosition[2] + m_cameraTargetPosition[2] + m_cameraHeight)/16.0; +#else + m_cameraPosition[1] = (15.0*m_cameraPosition[1] + m_cameraTargetPosition[1] + m_cameraHeight)/16.0; +#endif + + btVector3 camToObject = m_cameraTargetPosition - m_cameraPosition; + + //keep distance between min and max distance + float cameraDistance = camToObject.length(); + float correctionFactor = 0.f; + if (cameraDistance < m_minCameraDistance) + { + correctionFactor = 0.15*(m_minCameraDistance-cameraDistance)/cameraDistance; + } + if (cameraDistance > m_maxCameraDistance) + { + correctionFactor = 0.15*(m_maxCameraDistance-cameraDistance)/cameraDistance; + } + m_cameraPosition -= correctionFactor*camToObject; + + //update OpenGL camera settings + btScalar aspect = m_glutScreenWidth / (btScalar)m_glutScreenHeight; + glFrustum (-aspect, aspect, -1.0, 1.0, 1.0, 10000.0); + + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + + gluLookAt(m_cameraPosition[0],m_cameraPosition[1],m_cameraPosition[2], + m_cameraTargetPosition[0],m_cameraTargetPosition[1], m_cameraTargetPosition[2], + m_cameraUp.getX(),m_cameraUp.getY(),m_cameraUp.getZ()); + + + +} + +void ForkLiftDemo::lockLiftHinge(void) +{ + btScalar hingeAngle = m_liftHinge->getHingeAngle(); + btScalar lowLim = m_liftHinge->getLowerLimit(); + btScalar hiLim = m_liftHinge->getUpperLimit(); + m_liftHinge->enableAngularMotor(false, 0, 0); + if(hingeAngle < lowLim) + { +// m_liftHinge->setLimit(lowLim, lowLim + LIFT_EPS); + m_liftHinge->setLimit(lowLim, lowLim); + } + else if(hingeAngle > hiLim) + { +// m_liftHinge->setLimit(hiLim - LIFT_EPS, hiLim); + m_liftHinge->setLimit(hiLim, hiLim); + } + else + { +// m_liftHinge->setLimit(hingeAngle - LIFT_EPS, hingeAngle + LIFT_EPS); + m_liftHinge->setLimit(hingeAngle, hingeAngle); + } + return; +} // ForkLiftDemo::lockLiftHinge() + +void ForkLiftDemo::lockForkSlider(void) +{ + btScalar linDepth = m_forkSlider->getLinearPos(); + btScalar lowLim = m_forkSlider->getLowerLinLimit(); + btScalar hiLim = m_forkSlider->getUpperLinLimit(); + m_forkSlider->setPoweredLinMotor(false); + if(linDepth <= lowLim) + { + m_forkSlider->setLowerLinLimit(lowLim); + m_forkSlider->setUpperLinLimit(lowLim); + } + else if(linDepth > hiLim) + { + m_forkSlider->setLowerLinLimit(hiLim); + m_forkSlider->setUpperLinLimit(hiLim); + } + else + { + m_forkSlider->setLowerLinLimit(linDepth); + m_forkSlider->setUpperLinLimit(linDepth); + } + return; +} // ForkLiftDemo::lockForkSlider() diff --git a/BulletPhysics/bulletTrunk/Demos/ForkLiftDemo/ForkLiftDemo.h b/BulletPhysics/bulletTrunk/Demos/ForkLiftDemo/ForkLiftDemo.h new file mode 100644 index 00000000..d0d197e7 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/ForkLiftDemo/ForkLiftDemo.h @@ -0,0 +1,112 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ +#ifndef FORKLIFT_DEMO_H +#define FORKLIFT_DEMO_H + +class btVehicleTuning; +struct btVehicleRaycaster; +class btCollisionShape; + +#include "BulletDynamics/Vehicle/btRaycastVehicle.h" +#include "BulletDynamics/ConstraintSolver/btHingeConstraint.h" +#include "BulletDynamics/ConstraintSolver/btSliderConstraint.h" + +#include "DemoApplication.h" + +///VehicleDemo shows how to setup and use the built-in raycast vehicle +class ForkLiftDemo : public DemoApplication +{ + public: + + btRigidBody* m_carChassis; + +//---------------------------- + btRigidBody* m_liftBody; + btVector3 m_liftStartPos; + btHingeConstraint* m_liftHinge; + + btRigidBody* m_forkBody; + btVector3 m_forkStartPos; + btSliderConstraint* m_forkSlider; + + btRigidBody* m_loadBody; + btVector3 m_loadStartPos; + + void lockLiftHinge(void); + void lockForkSlider(void); + + bool m_useDefaultCamera; +//---------------------------- + + + btAlignedObjectArray m_collisionShapes; + + class btBroadphaseInterface* m_overlappingPairCache; + + class btCollisionDispatcher* m_dispatcher; + + class btConstraintSolver* m_constraintSolver; + + class btDefaultCollisionConfiguration* m_collisionConfiguration; + + class btTriangleIndexVertexArray* m_indexVertexArrays; + + btVector3* m_vertices; + + + btRaycastVehicle::btVehicleTuning m_tuning; + btVehicleRaycaster* m_vehicleRayCaster; + btRaycastVehicle* m_vehicle; + + float m_cameraHeight; + + float m_minCameraDistance; + float m_maxCameraDistance; + + + ForkLiftDemo(); + + virtual ~ForkLiftDemo(); + + virtual void clientMoveAndDisplay(); + + virtual void clientResetScene(); + + virtual void displayCallback(); + + ///a very basic camera following the vehicle + virtual void updateCamera(); + + virtual void specialKeyboard(int key, int x, int y); + + virtual void specialKeyboardUp(int key, int x, int y); + + void renderme(); + + void initPhysics(); + void termPhysics(); + + static DemoApplication* Create() + { + ForkLiftDemo* demo = new ForkLiftDemo(); + demo->myinit(); + demo->initPhysics(); + return demo; + } +}; + +#endif // FORKLIFT_DEMO_H + + diff --git a/BulletPhysics/bulletTrunk/Demos/ForkLiftDemo/Jamfile b/BulletPhysics/bulletTrunk/Demos/ForkLiftDemo/Jamfile new file mode 100644 index 00000000..300a1440 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/ForkLiftDemo/Jamfile @@ -0,0 +1,3 @@ +SubDir TOP Demos ForkLiftDemo ; + +BulletDemo ForkLiftDemo : [ Wildcard *.h *.cpp ] ; diff --git a/BulletPhysics/bulletTrunk/Demos/ForkLiftDemo/main.cpp b/BulletPhysics/bulletTrunk/Demos/ForkLiftDemo/main.cpp new file mode 100644 index 00000000..e5ee20f1 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/ForkLiftDemo/main.cpp @@ -0,0 +1,18 @@ + +#include "ForkLiftDemo.h" +#include "GlutStuff.h" +#include "GLDebugDrawer.h" +#include "btBulletDynamicsCommon.h" +GLDebugDrawer gDebugDrawer; + +int main(int argc,char** argv) +{ + + ForkLiftDemo* pForkLiftDemo = new ForkLiftDemo; + + pForkLiftDemo->initPhysics(); + pForkLiftDemo->getDynamicsWorld()->setDebugDrawer(&gDebugDrawer); + + return glutmain(argc, argv,640,480,"Bullet ForkLift Demo. http://www.continuousphysics.com/Bullet/phpBB2/", pForkLiftDemo); +} + diff --git a/BulletPhysics/bulletTrunk/Demos/GenericJointDemo/CMakeLists.txt b/BulletPhysics/bulletTrunk/Demos/GenericJointDemo/CMakeLists.txt new file mode 100644 index 00000000..07b44f97 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/GenericJointDemo/CMakeLists.txt @@ -0,0 +1,25 @@ +# This is basically the overall name of the project in Visual Studio this is the name of the Solution File + + +# For every executable you have with a main method you should have an add_executable line below. +# For every add executable line you should list every .cpp and .h file you have associated with that executable. + + + +# You shouldn't have to modify anything below this line +######################################################## + + +INCLUDE_DIRECTORIES( +${BULLET_PHYSICS_SOURCE_DIR}/src ${BULLET_PHYSICS_SOURCE_DIR}/Demos/OpenGL } +) + +LINK_LIBRARIES( +OpenGLSupport BulletDynamics BulletCollision LinearMath ${GLUT_glut_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} +) + +ADD_EXECUTABLE(AppGenericJointDemo + GenericJointDemo.cpp + Ragdoll.cpp +) + diff --git a/BulletPhysics/bulletTrunk/Demos/GenericJointDemo/GenericJointDemo.cpp b/BulletPhysics/bulletTrunk/Demos/GenericJointDemo/GenericJointDemo.cpp new file mode 100644 index 00000000..fb7e7f0b --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/GenericJointDemo/GenericJointDemo.cpp @@ -0,0 +1,160 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Ragdoll Demo +Copyright (c) 2007 Starbreeze Studios + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. + +Originally Written by: Marten Svanfeldt +ReWritten by: Francisco León +*/ + +//#define USE_ODE_QUICKSTEP 1 + + +#include "btBulletDynamicsCommon.h" +#include "GlutStuff.h" +#include "GL_ShapeDrawer.h" + +#include "LinearMath/btIDebugDraw.h" + +#include "GLDebugDrawer.h" +#include "GenericJointDemo.h" + +#ifdef USE_ODE_QUICKSTEP + #include "OdeConstraintSolver.h" +#endif + + +GLDebugDrawer debugDrawer; + + + +int main(int argc,char* argv[]) +{ + GenericJointDemo demoApp; +// demoApp.configDebugDrawer(&debugDrawer); + + demoApp.initPhysics(); + demoApp.setCameraDistance(btScalar(10.)); + +#ifdef USE_ODE_QUICKSTEP + return glutmain(argc, argv,640,480,"Joint 6DOF - ODE QuickStep Solver",&demoApp); +#else + return glutmain(argc, argv,640,480,"Joint 6DOF - Sequencial Impulse Solver",&demoApp); +#endif + + +} + + + +void GenericJointDemo::initPhysics() +{ + setTexturing(true); + setShadows(true); + + // Setup the basic world + + btDefaultCollisionConfiguration * collision_config = new btDefaultCollisionConfiguration(); + + btCollisionDispatcher* dispatcher = new btCollisionDispatcher(collision_config); + + btVector3 worldAabbMin(-10000,-10000,-10000); + btVector3 worldAabbMax(10000,10000,10000); + btBroadphaseInterface* overlappingPairCache = new btAxisSweep3 (worldAabbMin, worldAabbMax); + +#ifdef USE_ODE_QUICKSTEP + btConstraintSolver* constraintSolver = new OdeConstraintSolver(); +#else + btConstraintSolver* constraintSolver = new btSequentialImpulseConstraintSolver; +#endif + + + + m_dynamicsWorld = new btDiscreteDynamicsWorld(dispatcher,overlappingPairCache,constraintSolver,collision_config); + + m_dynamicsWorld->setGravity(btVector3(0,-30,0)); + + m_dynamicsWorld->setDebugDrawer(&debugDrawer); + + // Setup a big ground box + { + btCollisionShape* groundShape = new btBoxShape(btVector3(btScalar(200.),btScalar(10.),btScalar(200.))); + btTransform groundTransform; + groundTransform.setIdentity(); + groundTransform.setOrigin(btVector3(0,-15,0)); + localCreateRigidBody(btScalar(0.),groundTransform,groundShape); + } + + // Spawn one ragdoll + spawnRagdoll(); + + clientResetScene(); +} + +void GenericJointDemo::spawnRagdoll(bool random) +{ + RagDoll* ragDoll = new RagDoll (m_dynamicsWorld, btVector3 (0,0,10),5.f); + m_ragdolls.push_back(ragDoll); +} + +void GenericJointDemo::clientMoveAndDisplay() +{ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + //simple dynamics world doesn't handle fixed-time-stepping + float ms = getDeltaTimeMicroseconds(); + + float minFPS = 1000000.f/60.f; + if (ms > minFPS) + ms = minFPS; + + if (m_dynamicsWorld) + { + m_dynamicsWorld->stepSimulation(ms / 1000000.f); + //optional but useful: debug drawing + m_dynamicsWorld->debugDrawWorld(); + } + + renderme(); + + glFlush(); + + glutSwapBuffers(); +} + +void GenericJointDemo::displayCallback() +{ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + if (m_dynamicsWorld) + m_dynamicsWorld->debugDrawWorld(); + + renderme(); + + glFlush(); + glutSwapBuffers(); +} + +void GenericJointDemo::keyboardCallback(unsigned char key, int x, int y) +{ + switch (key) + { + case 'e': + spawnRagdoll(true); + break; + default: + DemoApplication::keyboardCallback(key, x, y); + } + + +} diff --git a/BulletPhysics/bulletTrunk/Demos/GenericJointDemo/GenericJointDemo.h b/BulletPhysics/bulletTrunk/Demos/GenericJointDemo/GenericJointDemo.h new file mode 100644 index 00000000..2b3694ed --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/GenericJointDemo/GenericJointDemo.h @@ -0,0 +1,44 @@ +/* +Bullet Continuous Collision Detection and Physics Library +GenericJointDemo +Copyright (c) 2007 Starbreeze Studios + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. + +Written by: Marten Svanfeldt +*/ + +#ifndef GENERIGJOINTDEMO_H +#define GENERIGJOINTDEMO_H + +#include "DemoApplication.h" +#include "LinearMath/btAlignedObjectArray.h" +#include "Ragdoll.h" + +class GenericJointDemo : public DemoApplication +{ + + btAlignedObjectArray m_ragdolls; + +public: + void initPhysics(); + + void spawnRagdoll(bool random = false); + + virtual void clientMoveAndDisplay(); + + virtual void displayCallback(); + + virtual void keyboardCallback(unsigned char key, int x, int y); +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Demos/GenericJointDemo/Jamfile b/BulletPhysics/bulletTrunk/Demos/GenericJointDemo/Jamfile new file mode 100644 index 00000000..9640abf3 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/GenericJointDemo/Jamfile @@ -0,0 +1,3 @@ +SubDir TOP Demos GenericJointDemo ; + +BulletDemo GenericJointDemo : [ Wildcard *.h *.cpp ] ; diff --git a/BulletPhysics/bulletTrunk/Demos/GenericJointDemo/Ragdoll.cpp b/BulletPhysics/bulletTrunk/Demos/GenericJointDemo/Ragdoll.cpp new file mode 100644 index 00000000..0b6b5df2 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/GenericJointDemo/Ragdoll.cpp @@ -0,0 +1,373 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Ragdoll Demo +Copyright (c) 2007 Starbreeze Studios + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. + +Written by: Marten Svanfeldt +*/ + +#include "Ragdoll.h" + +//#define RIGID 1 + +RagDoll::RagDoll (btDynamicsWorld* ownerWorld, const btVector3& positionOffset, + btScalar scale_ragdoll) : m_ownerWorld (ownerWorld) +{ + + + // Setup the geometry + m_shapes[BODYPART_PELVIS] = new btCapsuleShape( + btScalar(scale_ragdoll*0.15), btScalar(scale_ragdoll*0.20)); + m_shapes[BODYPART_SPINE] = new btCapsuleShape( + btScalar(scale_ragdoll*0.15), btScalar(scale_ragdoll*0.28)); + m_shapes[BODYPART_HEAD] = new btCapsuleShape(btScalar(scale_ragdoll*0.10), btScalar(scale_ragdoll*0.05)); + m_shapes[BODYPART_LEFT_UPPER_LEG] = new btCapsuleShape(btScalar(scale_ragdoll*0.07), btScalar(scale_ragdoll*0.45)); + m_shapes[BODYPART_LEFT_LOWER_LEG] = new btCapsuleShape(btScalar(scale_ragdoll*0.05), btScalar(scale_ragdoll*0.37)); + m_shapes[BODYPART_RIGHT_UPPER_LEG] = new btCapsuleShape(btScalar(scale_ragdoll*0.07), btScalar(scale_ragdoll*0.45)); + m_shapes[BODYPART_RIGHT_LOWER_LEG] = new btCapsuleShape(btScalar(scale_ragdoll*0.05), btScalar(scale_ragdoll*0.37)); + m_shapes[BODYPART_LEFT_UPPER_ARM] = new btCapsuleShape(btScalar(scale_ragdoll*0.05), btScalar(scale_ragdoll*0.33)); + m_shapes[BODYPART_LEFT_LOWER_ARM] = new btCapsuleShape(btScalar(scale_ragdoll*0.04), btScalar(scale_ragdoll*0.25)); + m_shapes[BODYPART_RIGHT_UPPER_ARM] = new btCapsuleShape(btScalar(scale_ragdoll*0.05), btScalar(scale_ragdoll*0.33)); + m_shapes[BODYPART_RIGHT_LOWER_ARM] = new btCapsuleShape(btScalar(scale_ragdoll*0.04), btScalar(scale_ragdoll*0.25)); + + // Setup all the rigid bodies + btTransform offset; offset.setIdentity(); + offset.setOrigin(positionOffset); + + btTransform transform; + transform.setIdentity(); + transform.setOrigin(btVector3(btScalar(0.), btScalar(scale_ragdoll*1.), btScalar(0.))); + m_bodies[BODYPART_PELVIS] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_PELVIS]); + + transform.setIdentity(); + transform.setOrigin(btVector3(btScalar(0.), btScalar(scale_ragdoll*1.2), btScalar(0.))); + m_bodies[BODYPART_SPINE] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_SPINE]); + + transform.setIdentity(); + transform.setOrigin(btVector3(btScalar(0.), btScalar(scale_ragdoll*1.6), btScalar(0.))); + m_bodies[BODYPART_HEAD] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_HEAD]); + + transform.setIdentity(); + transform.setOrigin(btVector3(btScalar(-0.18*scale_ragdoll), btScalar(0.65*scale_ragdoll), +btScalar(0.))); + m_bodies[BODYPART_LEFT_UPPER_LEG] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_LEFT_UPPER_LEG]); + + transform.setIdentity(); + transform.setOrigin(btVector3(btScalar(-0.18*scale_ragdoll), btScalar(0.2*scale_ragdoll), btScalar(0.))); + m_bodies[BODYPART_LEFT_LOWER_LEG] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_LEFT_LOWER_LEG]); + + transform.setIdentity(); + transform.setOrigin(btVector3(btScalar(0.18*scale_ragdoll), btScalar(0.65*scale_ragdoll), btScalar(0.))); + m_bodies[BODYPART_RIGHT_UPPER_LEG] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_RIGHT_UPPER_LEG]); + + transform.setIdentity(); + transform.setOrigin(btVector3(btScalar(0.18*scale_ragdoll), btScalar(0.2*scale_ragdoll), btScalar(0.))); + m_bodies[BODYPART_RIGHT_LOWER_LEG] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_RIGHT_LOWER_LEG]); + + transform.setIdentity(); + transform.setOrigin(btVector3(btScalar(-0.35*scale_ragdoll), btScalar(1.45*scale_ragdoll), btScalar(0.))); + transform.getBasis().setEulerZYX(0,0,SIMD_HALF_PI); + m_bodies[BODYPART_LEFT_UPPER_ARM] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_LEFT_UPPER_ARM]); + + transform.setIdentity(); + transform.setOrigin(btVector3(btScalar(-0.7*scale_ragdoll), btScalar(1.45*scale_ragdoll), btScalar(0.))); + transform.getBasis().setEulerZYX(0,0,SIMD_HALF_PI); + m_bodies[BODYPART_LEFT_LOWER_ARM] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_LEFT_LOWER_ARM]); + + transform.setIdentity(); + transform.setOrigin(btVector3(btScalar(0.35*scale_ragdoll), btScalar(1.45*scale_ragdoll), btScalar(0.))); + transform.getBasis().setEulerZYX(0,0,-SIMD_HALF_PI); + m_bodies[BODYPART_RIGHT_UPPER_ARM] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_RIGHT_UPPER_ARM]); + + transform.setIdentity(); + transform.setOrigin(btVector3(btScalar(0.7*scale_ragdoll), btScalar(1.45*scale_ragdoll), btScalar(0.))); + transform.getBasis().setEulerZYX(0,0,-SIMD_HALF_PI); + m_bodies[BODYPART_RIGHT_LOWER_ARM] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_RIGHT_LOWER_ARM]); + + // Setup some damping on the m_bodies + for (int i = 0; i < BODYPART_COUNT; ++i) + { + m_bodies[i]->setDamping(0.05, 0.85); + m_bodies[i]->setDeactivationTime(0.8); + m_bodies[i]->setSleepingThresholds(1.6, 2.5); + } + +///////////////////////////// SETTING THE CONSTRAINTS /////////////////////////////////////////////7777 + // Now setup the constraints + btGeneric6DofConstraint * joint6DOF; + btTransform localA, localB; + bool useLinearReferenceFrameA = true; +/// ******* SPINE HEAD ******** /// + { + localA.setIdentity(); localB.setIdentity(); + + localA.setOrigin(btVector3(btScalar(0.), btScalar(0.30*scale_ragdoll), btScalar(0.))); + + localB.setOrigin(btVector3(btScalar(0.), btScalar(-0.14*scale_ragdoll), btScalar(0.))); + + joint6DOF = new btGeneric6DofConstraint(*m_bodies[BODYPART_SPINE], *m_bodies[BODYPART_HEAD], localA, localB,useLinearReferenceFrameA); + +#ifdef RIGID + joint6DOF->setAngularLowerLimit(btVector3(-SIMD_EPSILON,-SIMD_EPSILON,-SIMD_EPSILON)); + joint6DOF->setAngularUpperLimit(btVector3(SIMD_EPSILON,SIMD_EPSILON,SIMD_EPSILON)); +#else + joint6DOF->setAngularLowerLimit(btVector3(-SIMD_PI*0.3f,-SIMD_EPSILON,-SIMD_PI*0.3f)); + joint6DOF->setAngularUpperLimit(btVector3(SIMD_PI*0.5f,SIMD_EPSILON,SIMD_PI*0.3f)); +#endif + m_joints[JOINT_SPINE_HEAD] = joint6DOF; + m_ownerWorld->addConstraint(m_joints[JOINT_SPINE_HEAD], true); + } +/// *************************** /// + + + + +/// ******* LEFT SHOULDER ******** /// + { + localA.setIdentity(); localB.setIdentity(); + + localA.setOrigin(btVector3(btScalar(-0.2*scale_ragdoll), btScalar(0.15*scale_ragdoll), btScalar(0.))); + + localB.getBasis().setEulerZYX(SIMD_HALF_PI,0,-SIMD_HALF_PI); + localB.setOrigin(btVector3(btScalar(0.), btScalar(-0.18*scale_ragdoll), btScalar(0.))); + + joint6DOF = new btGeneric6DofConstraint(*m_bodies[BODYPART_SPINE], *m_bodies[BODYPART_LEFT_UPPER_ARM], localA, localB,useLinearReferenceFrameA); + +#ifdef RIGID + joint6DOF->setAngularLowerLimit(btVector3(-SIMD_EPSILON,-SIMD_EPSILON,-SIMD_EPSILON)); + joint6DOF->setAngularUpperLimit(btVector3(SIMD_EPSILON,SIMD_EPSILON,SIMD_EPSILON)); +#else + joint6DOF->setAngularLowerLimit(btVector3(-SIMD_PI*0.8f,-SIMD_EPSILON,-SIMD_PI*0.5f)); + joint6DOF->setAngularUpperLimit(btVector3(SIMD_PI*0.8f,SIMD_EPSILON,SIMD_PI*0.5f)); +#endif + m_joints[JOINT_LEFT_SHOULDER] = joint6DOF; + m_ownerWorld->addConstraint(m_joints[JOINT_LEFT_SHOULDER], true); + } +/// *************************** /// + + +/// ******* RIGHT SHOULDER ******** /// + { + localA.setIdentity(); localB.setIdentity(); + + localA.setOrigin(btVector3(btScalar(0.2*scale_ragdoll), btScalar(0.15*scale_ragdoll), btScalar(0.))); + localB.getBasis().setEulerZYX(0,0,SIMD_HALF_PI); + localB.setOrigin(btVector3(btScalar(0.), btScalar(-0.18*scale_ragdoll), btScalar(0.))); + joint6DOF = new btGeneric6DofConstraint(*m_bodies[BODYPART_SPINE], *m_bodies[BODYPART_RIGHT_UPPER_ARM], localA, localB,useLinearReferenceFrameA); + +#ifdef RIGID + joint6DOF->setAngularLowerLimit(btVector3(-SIMD_EPSILON,-SIMD_EPSILON,-SIMD_EPSILON)); + joint6DOF->setAngularUpperLimit(btVector3(SIMD_EPSILON,SIMD_EPSILON,SIMD_EPSILON)); +#else + + joint6DOF->setAngularLowerLimit(btVector3(-SIMD_PI*0.8f,-SIMD_EPSILON,-SIMD_PI*0.5f)); + joint6DOF->setAngularUpperLimit(btVector3(SIMD_PI*0.8f,SIMD_EPSILON,SIMD_PI*0.5f)); +#endif + m_joints[JOINT_RIGHT_SHOULDER] = joint6DOF; + m_ownerWorld->addConstraint(m_joints[JOINT_RIGHT_SHOULDER], true); + } +/// *************************** /// + +/// ******* LEFT ELBOW ******** /// + { + localA.setIdentity(); localB.setIdentity(); + + localA.setOrigin(btVector3(btScalar(0.), btScalar(0.18*scale_ragdoll), btScalar(0.))); + localB.setOrigin(btVector3(btScalar(0.), btScalar(-0.14*scale_ragdoll), btScalar(0.))); + joint6DOF = new btGeneric6DofConstraint (*m_bodies[BODYPART_LEFT_UPPER_ARM], *m_bodies[BODYPART_LEFT_LOWER_ARM], localA, localB,useLinearReferenceFrameA); + +#ifdef RIGID + joint6DOF->setAngularLowerLimit(btVector3(-SIMD_EPSILON,-SIMD_EPSILON,-SIMD_EPSILON)); + joint6DOF->setAngularUpperLimit(btVector3(SIMD_EPSILON,SIMD_EPSILON,SIMD_EPSILON)); +#else + joint6DOF->setAngularLowerLimit(btVector3(-SIMD_EPSILON,-SIMD_EPSILON,-SIMD_EPSILON)); + joint6DOF->setAngularUpperLimit(btVector3(SIMD_PI*0.7,SIMD_EPSILON,SIMD_EPSILON)); +#endif + m_joints[JOINT_LEFT_ELBOW] = joint6DOF; + m_ownerWorld->addConstraint(m_joints[JOINT_LEFT_ELBOW], true); + } +/// *************************** /// + +/// ******* RIGHT ELBOW ******** /// + { + localA.setIdentity(); localB.setIdentity(); + + localA.setOrigin(btVector3(btScalar(0.), btScalar(0.18*scale_ragdoll), btScalar(0.))); + localB.setOrigin(btVector3(btScalar(0.), btScalar(-0.14*scale_ragdoll), btScalar(0.))); + joint6DOF = new btGeneric6DofConstraint (*m_bodies[BODYPART_RIGHT_UPPER_ARM], *m_bodies[BODYPART_RIGHT_LOWER_ARM], localA, localB,useLinearReferenceFrameA); + +#ifdef RIGID + joint6DOF->setAngularLowerLimit(btVector3(-SIMD_EPSILON,-SIMD_EPSILON,-SIMD_EPSILON)); + joint6DOF->setAngularUpperLimit(btVector3(SIMD_EPSILON,SIMD_EPSILON,SIMD_EPSILON)); +#else + joint6DOF->setAngularLowerLimit(btVector3(-SIMD_EPSILON,-SIMD_EPSILON,-SIMD_EPSILON)); + joint6DOF->setAngularUpperLimit(btVector3(SIMD_PI*0.7,SIMD_EPSILON,SIMD_EPSILON)); +#endif + + m_joints[JOINT_RIGHT_ELBOW] = joint6DOF; + m_ownerWorld->addConstraint(m_joints[JOINT_RIGHT_ELBOW], true); + } +/// *************************** /// + + +/// ******* PELVIS ******** /// + { + localA.setIdentity(); localB.setIdentity(); + + localA.getBasis().setEulerZYX(0,SIMD_HALF_PI,0); + localA.setOrigin(btVector3(btScalar(0.), btScalar(0.15*scale_ragdoll), btScalar(0.))); + localB.getBasis().setEulerZYX(0,SIMD_HALF_PI,0); + localB.setOrigin(btVector3(btScalar(0.), btScalar(-0.15*scale_ragdoll), btScalar(0.))); + joint6DOF = new btGeneric6DofConstraint (*m_bodies[BODYPART_PELVIS], *m_bodies[BODYPART_SPINE], localA, localB,useLinearReferenceFrameA); + +#ifdef RIGID + joint6DOF->setAngularLowerLimit(btVector3(-SIMD_EPSILON,-SIMD_EPSILON,-SIMD_EPSILON)); + joint6DOF->setAngularUpperLimit(btVector3(SIMD_EPSILON,SIMD_EPSILON,SIMD_EPSILON)); +#else + joint6DOF->setAngularLowerLimit(btVector3(-SIMD_PI*0.2,-SIMD_EPSILON,-SIMD_PI*0.3)); + joint6DOF->setAngularUpperLimit(btVector3(SIMD_PI*0.2,SIMD_EPSILON,SIMD_PI*0.6)); +#endif + m_joints[JOINT_PELVIS_SPINE] = joint6DOF; + m_ownerWorld->addConstraint(m_joints[JOINT_PELVIS_SPINE], true); + } +/// *************************** /// + +/// ******* LEFT HIP ******** /// + { + localA.setIdentity(); localB.setIdentity(); + + localA.setOrigin(btVector3(btScalar(-0.18*scale_ragdoll), btScalar(-0.10*scale_ragdoll), btScalar(0.))); + + localB.setOrigin(btVector3(btScalar(0.), btScalar(0.225*scale_ragdoll), btScalar(0.))); + + joint6DOF = new btGeneric6DofConstraint(*m_bodies[BODYPART_PELVIS], *m_bodies[BODYPART_LEFT_UPPER_LEG], localA, localB,useLinearReferenceFrameA); + +#ifdef RIGID + joint6DOF->setAngularLowerLimit(btVector3(-SIMD_EPSILON,-SIMD_EPSILON,-SIMD_EPSILON)); + joint6DOF->setAngularUpperLimit(btVector3(SIMD_EPSILON,SIMD_EPSILON,SIMD_EPSILON)); +#else + joint6DOF->setAngularLowerLimit(btVector3(-SIMD_HALF_PI*0.5,-SIMD_EPSILON,-SIMD_EPSILON)); + joint6DOF->setAngularUpperLimit(btVector3(SIMD_HALF_PI*0.8,SIMD_EPSILON,SIMD_HALF_PI*0.6f)); +#endif + m_joints[JOINT_LEFT_HIP] = joint6DOF; + m_ownerWorld->addConstraint(m_joints[JOINT_LEFT_HIP], true); + } +/// *************************** /// + + +/// ******* RIGHT HIP ******** /// + { + localA.setIdentity(); localB.setIdentity(); + + localA.setOrigin(btVector3(btScalar(0.18*scale_ragdoll), btScalar(-0.10*scale_ragdoll), btScalar(0.))); + localB.setOrigin(btVector3(btScalar(0.), btScalar(0.225*scale_ragdoll), btScalar(0.))); + + joint6DOF = new btGeneric6DofConstraint(*m_bodies[BODYPART_PELVIS], *m_bodies[BODYPART_RIGHT_UPPER_LEG], localA, localB,useLinearReferenceFrameA); + +#ifdef RIGID + joint6DOF->setAngularLowerLimit(btVector3(-SIMD_EPSILON,-SIMD_EPSILON,-SIMD_EPSILON)); + joint6DOF->setAngularUpperLimit(btVector3(SIMD_EPSILON,SIMD_EPSILON,SIMD_EPSILON)); +#else + joint6DOF->setAngularLowerLimit(btVector3(-SIMD_HALF_PI*0.5,-SIMD_EPSILON,-SIMD_HALF_PI*0.6f)); + joint6DOF->setAngularUpperLimit(btVector3(SIMD_HALF_PI*0.8,SIMD_EPSILON,SIMD_EPSILON)); +#endif + m_joints[JOINT_RIGHT_HIP] = joint6DOF; + m_ownerWorld->addConstraint(m_joints[JOINT_RIGHT_HIP], true); + } +/// *************************** /// + + +/// ******* LEFT KNEE ******** /// + { + localA.setIdentity(); localB.setIdentity(); + + localA.setOrigin(btVector3(btScalar(0.), btScalar(-0.225*scale_ragdoll), btScalar(0.))); + localB.setOrigin(btVector3(btScalar(0.), btScalar(0.185*scale_ragdoll), btScalar(0.))); + joint6DOF = new btGeneric6DofConstraint (*m_bodies[BODYPART_LEFT_UPPER_LEG], *m_bodies[BODYPART_LEFT_LOWER_LEG], localA, localB,useLinearReferenceFrameA); +// +#ifdef RIGID + joint6DOF->setAngularLowerLimit(btVector3(-SIMD_EPSILON,-SIMD_EPSILON,-SIMD_EPSILON)); + joint6DOF->setAngularUpperLimit(btVector3(SIMD_EPSILON,SIMD_EPSILON,SIMD_EPSILON)); +#else + joint6DOF->setAngularLowerLimit(btVector3(-SIMD_EPSILON,-SIMD_EPSILON,-SIMD_EPSILON)); + joint6DOF->setAngularUpperLimit(btVector3(SIMD_PI*0.7f,SIMD_EPSILON,SIMD_EPSILON)); +#endif + m_joints[JOINT_LEFT_KNEE] = joint6DOF; + m_ownerWorld->addConstraint(m_joints[JOINT_LEFT_KNEE], true); + } +/// *************************** /// + +/// ******* RIGHT KNEE ******** /// + { + localA.setIdentity(); localB.setIdentity(); + + localA.setOrigin(btVector3(btScalar(0.), btScalar(-0.225*scale_ragdoll), btScalar(0.))); + localB.setOrigin(btVector3(btScalar(0.), btScalar(0.185*scale_ragdoll), btScalar(0.))); + joint6DOF = new btGeneric6DofConstraint (*m_bodies[BODYPART_RIGHT_UPPER_LEG], *m_bodies[BODYPART_RIGHT_LOWER_LEG], localA, localB,useLinearReferenceFrameA); + +#ifdef RIGID + joint6DOF->setAngularLowerLimit(btVector3(-SIMD_EPSILON,-SIMD_EPSILON,-SIMD_EPSILON)); + joint6DOF->setAngularUpperLimit(btVector3(SIMD_EPSILON,SIMD_EPSILON,SIMD_EPSILON)); +#else + joint6DOF->setAngularLowerLimit(btVector3(-SIMD_EPSILON,-SIMD_EPSILON,-SIMD_EPSILON)); + joint6DOF->setAngularUpperLimit(btVector3(SIMD_PI*0.7f,SIMD_EPSILON,SIMD_EPSILON)); +#endif + m_joints[JOINT_RIGHT_KNEE] = joint6DOF; + m_ownerWorld->addConstraint(m_joints[JOINT_RIGHT_KNEE], true); + } +/// *************************** /// + +} + + +RagDoll::~RagDoll() +{ + int i; + + // Remove all constraints + for (i = 0; i < JOINT_COUNT; ++i) + { + m_ownerWorld->removeConstraint(m_joints[i]); + delete m_joints[i]; m_joints[i] = 0; + } + + // Remove all bodies and shapes + for (i = 0; i < BODYPART_COUNT; ++i) + { + m_ownerWorld->removeRigidBody(m_bodies[i]); + + delete m_bodies[i]->getMotionState(); + + delete m_bodies[i]; m_bodies[i] = 0; + delete m_shapes[i]; m_shapes[i] = 0; + } +} + + +btRigidBody* RagDoll::localCreateRigidBody (btScalar mass, const btTransform& startTransform, btCollisionShape* shape) +{ + bool isDynamic = (mass != 0.f); + + btVector3 localInertia(0,0,0); + if (isDynamic) + shape->calculateLocalInertia(mass,localInertia); + + btDefaultMotionState* myMotionState = new btDefaultMotionState(startTransform); + btRigidBody::btRigidBodyConstructionInfo rbInfo(mass,myMotionState,shape,localInertia); + rbInfo.m_additionalDamping = true; + btRigidBody* body = new btRigidBody(rbInfo); + + m_ownerWorld->addRigidBody(body); + + return body; +} diff --git a/BulletPhysics/bulletTrunk/Demos/GenericJointDemo/Ragdoll.h b/BulletPhysics/bulletTrunk/Demos/GenericJointDemo/Ragdoll.h new file mode 100644 index 00000000..29a9cbde --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/GenericJointDemo/Ragdoll.h @@ -0,0 +1,71 @@ +#ifndef RAGDOLL_H_INCLUDED +#define RAGDOLL_H_INCLUDED + +#include "DemoApplication.h" +#include "LinearMath/btAlignedObjectArray.h" +#include "btBulletDynamicsCommon.h" + + + + +class RagDoll +{ + enum + { + BODYPART_PELVIS = 0, + BODYPART_SPINE, + BODYPART_HEAD, + + BODYPART_LEFT_UPPER_LEG, + BODYPART_LEFT_LOWER_LEG, + + BODYPART_RIGHT_UPPER_LEG, + BODYPART_RIGHT_LOWER_LEG, + + BODYPART_LEFT_UPPER_ARM, + BODYPART_LEFT_LOWER_ARM, + + BODYPART_RIGHT_UPPER_ARM, + BODYPART_RIGHT_LOWER_ARM, + + BODYPART_COUNT + }; + + enum + { + JOINT_PELVIS_SPINE = 0, + JOINT_SPINE_HEAD, + + JOINT_LEFT_HIP, + JOINT_LEFT_KNEE, + + JOINT_RIGHT_HIP, + JOINT_RIGHT_KNEE, + + JOINT_LEFT_SHOULDER, + JOINT_LEFT_ELBOW, + + JOINT_RIGHT_SHOULDER, + JOINT_RIGHT_ELBOW, + + JOINT_COUNT + }; + + btDynamicsWorld* m_ownerWorld; + btCollisionShape* m_shapes[BODYPART_COUNT]; + btRigidBody* m_bodies[BODYPART_COUNT]; + btTypedConstraint* m_joints[JOINT_COUNT]; + + btRigidBody* localCreateRigidBody (btScalar mass, const btTransform& startTransform, btCollisionShape* shape); + +public: + RagDoll (btDynamicsWorld* ownerWorld, + const btVector3& positionOffset, + btScalar scale_ragdoll = btScalar(1.0)); + + ~RagDoll (); +}; + + + +#endif // RAGDOLL_H_INCLUDED diff --git a/BulletPhysics/bulletTrunk/Demos/GimpactTestDemo/BunnyMesh.h b/BulletPhysics/bulletTrunk/Demos/GimpactTestDemo/BunnyMesh.h new file mode 100644 index 00000000..818bd024 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/GimpactTestDemo/BunnyMesh.h @@ -0,0 +1,1379 @@ +#ifndef BUNNY_MESH_H_ +#define BUNNY_MESH_H_ + + + +//***************************THE FAMOUS BUNNY TRIMESH********************************************// + +#define REAL btScalar +const int BUNNY_NUM_TRIANGLES =902; +const int BUNNY_NUM_VERTICES = 453; +const int BUNNY_NUM_INDICES = BUNNY_NUM_TRIANGLES * 3; + + +static REAL gVerticesBunny[BUNNY_NUM_VERTICES * 3] = { + REAL(-0.334392), REAL(0.133007), REAL(0.062259), + REAL(-0.350189), REAL(0.150354), REAL(-0.147769), + REAL(-0.234201), REAL(0.343811), REAL(-0.174307), + REAL(-0.200259), REAL(0.285207), REAL(0.093749), + REAL(0.003520), REAL(0.475208), REAL(-0.159365), + REAL(0.001856), REAL(0.419203), REAL(0.098582), + REAL(-0.252802), REAL(0.093666), REAL(0.237538), + REAL(-0.162901), REAL(0.237984), REAL(0.206905), + REAL(0.000865), REAL(0.318141), REAL(0.235370), + REAL(-0.414624), REAL(0.164083), REAL(-0.278254), + REAL(-0.262213), REAL(0.357334), REAL(-0.293246), + REAL(0.004628), REAL(0.482694), REAL(-0.338626), + REAL(-0.402162), REAL(0.133528), REAL(-0.443247), + REAL(-0.243781), REAL(0.324275), REAL(-0.436763), + REAL(0.005293), REAL(0.437592), REAL(-0.458332), + REAL(-0.339884), REAL(-0.041150), REAL(-0.668211), + REAL(-0.248382), REAL(0.255825), REAL(-0.627493), + REAL(0.006261), REAL(0.376103), REAL(-0.631506), + REAL(-0.216201), REAL(-0.126776), REAL(-0.886936), + REAL(-0.171075), REAL(0.011544), REAL(-0.881386), + REAL(-0.181074), REAL(0.098223), REAL(-0.814779), + REAL(-0.119891), REAL(0.218786), REAL(-0.760153), + REAL(-0.078895), REAL(0.276780), REAL(-0.739281), + REAL(0.006801), REAL(0.310959), REAL(-0.735661), + REAL(-0.168842), REAL(0.102387), REAL(-0.920381), + REAL(-0.104072), REAL(0.177278), REAL(-0.952530), + REAL(-0.129704), REAL(0.211848), REAL(-0.836678), + REAL(-0.099875), REAL(0.310931), REAL(-0.799381), + REAL(0.007237), REAL(0.361687), REAL(-0.794439), + REAL(-0.077913), REAL(0.258753), REAL(-0.921640), + REAL(0.007957), REAL(0.282241), REAL(-0.931680), + REAL(-0.252222), REAL(-0.550401), REAL(-0.557810), + REAL(-0.267633), REAL(-0.603419), REAL(-0.655209), + REAL(-0.446838), REAL(-0.118517), REAL(-0.466159), + REAL(-0.459488), REAL(-0.093017), REAL(-0.311341), + REAL(-0.370645), REAL(-0.100108), REAL(-0.159454), + REAL(-0.371984), REAL(-0.091991), REAL(-0.011044), + REAL(-0.328945), REAL(-0.098269), REAL(0.088659), + REAL(-0.282452), REAL(-0.018862), REAL(0.311501), + REAL(-0.352403), REAL(-0.131341), REAL(0.144902), + REAL(-0.364126), REAL(-0.200299), REAL(0.202388), + REAL(-0.283965), REAL(-0.231869), REAL(0.023668), + REAL(-0.298943), REAL(-0.155218), REAL(0.369716), + REAL(-0.293787), REAL(-0.121856), REAL(0.419097), + REAL(-0.290163), REAL(-0.290797), REAL(0.107824), + REAL(-0.264165), REAL(-0.272849), REAL(0.036347), + REAL(-0.228567), REAL(-0.372573), REAL(0.290309), + REAL(-0.190431), REAL(-0.286997), REAL(0.421917), + REAL(-0.191039), REAL(-0.240973), REAL(0.507118), + REAL(-0.287272), REAL(-0.276431), REAL(-0.065444), + REAL(-0.295675), REAL(-0.280818), REAL(-0.174200), + REAL(-0.399537), REAL(-0.313131), REAL(-0.376167), + REAL(-0.392666), REAL(-0.488581), REAL(-0.427494), + REAL(-0.331669), REAL(-0.570185), REAL(-0.466054), + REAL(-0.282290), REAL(-0.618140), REAL(-0.589220), + REAL(-0.374238), REAL(-0.594882), REAL(-0.323298), + REAL(-0.381071), REAL(-0.629723), REAL(-0.350777), + REAL(-0.382112), REAL(-0.624060), REAL(-0.221577), + REAL(-0.272701), REAL(-0.566522), REAL(0.259157), + REAL(-0.256702), REAL(-0.663406), REAL(0.286079), + REAL(-0.280948), REAL(-0.428359), REAL(0.055790), + REAL(-0.184974), REAL(-0.508894), REAL(0.326265), + REAL(-0.279971), REAL(-0.526918), REAL(0.395319), + REAL(-0.282599), REAL(-0.663393), REAL(0.412411), + REAL(-0.188329), REAL(-0.475093), REAL(0.417954), + REAL(-0.263384), REAL(-0.663396), REAL(0.466604), + REAL(-0.209063), REAL(-0.663393), REAL(0.509344), + REAL(-0.002044), REAL(-0.319624), REAL(0.553078), + REAL(-0.001266), REAL(-0.371260), REAL(0.413296), + REAL(-0.219753), REAL(-0.339762), REAL(-0.040921), + REAL(-0.256986), REAL(-0.282511), REAL(-0.006349), + REAL(-0.271706), REAL(-0.260881), REAL(0.001764), + REAL(-0.091191), REAL(-0.419184), REAL(-0.045912), + REAL(-0.114944), REAL(-0.429752), REAL(-0.124739), + REAL(-0.113970), REAL(-0.382987), REAL(-0.188540), + REAL(-0.243012), REAL(-0.464942), REAL(-0.242850), + REAL(-0.314815), REAL(-0.505402), REAL(-0.324768), + REAL(0.002774), REAL(-0.437526), REAL(-0.262766), + REAL(-0.072625), REAL(-0.417748), REAL(-0.221440), + REAL(-0.160112), REAL(-0.476932), REAL(-0.293450), + REAL(0.003859), REAL(-0.453425), REAL(-0.443916), + REAL(-0.120363), REAL(-0.581567), REAL(-0.438689), + REAL(-0.091499), REAL(-0.584191), REAL(-0.294511), + REAL(-0.116469), REAL(-0.599861), REAL(-0.188308), + REAL(-0.208032), REAL(-0.513640), REAL(-0.134649), + REAL(-0.235749), REAL(-0.610017), REAL(-0.040939), + REAL(-0.344916), REAL(-0.622487), REAL(-0.085380), + REAL(-0.336401), REAL(-0.531864), REAL(-0.212298), + REAL(0.001961), REAL(-0.459550), REAL(-0.135547), + REAL(-0.058296), REAL(-0.430536), REAL(-0.043440), + REAL(0.001378), REAL(-0.449511), REAL(-0.037762), + REAL(-0.130135), REAL(-0.510222), REAL(0.079144), + REAL(0.000142), REAL(-0.477549), REAL(0.157064), + REAL(-0.114284), REAL(-0.453206), REAL(0.304397), + REAL(-0.000592), REAL(-0.443558), REAL(0.285401), + REAL(-0.056215), REAL(-0.663402), REAL(0.326073), + REAL(-0.026248), REAL(-0.568010), REAL(0.273318), + REAL(-0.049261), REAL(-0.531064), REAL(0.389854), + REAL(-0.127096), REAL(-0.663398), REAL(0.479316), + REAL(-0.058384), REAL(-0.663401), REAL(0.372891), + REAL(-0.303961), REAL(0.054199), REAL(0.625921), + REAL(-0.268594), REAL(0.193403), REAL(0.502766), + REAL(-0.277159), REAL(0.126123), REAL(0.443289), + REAL(-0.287605), REAL(-0.005722), REAL(0.531844), + REAL(-0.231396), REAL(-0.121289), REAL(0.587387), + REAL(-0.253475), REAL(-0.081797), REAL(0.756541), + REAL(-0.195164), REAL(-0.137969), REAL(0.728011), + REAL(-0.167673), REAL(-0.156573), REAL(0.609388), + REAL(-0.145917), REAL(-0.169029), REAL(0.697600), + REAL(-0.077776), REAL(-0.214247), REAL(0.622586), + REAL(-0.076873), REAL(-0.214971), REAL(0.696301), + REAL(-0.002341), REAL(-0.233135), REAL(0.622859), + REAL(-0.002730), REAL(-0.213526), REAL(0.691267), + REAL(-0.003136), REAL(-0.192628), REAL(0.762731), + REAL(-0.056136), REAL(-0.201222), REAL(0.763806), + REAL(-0.114589), REAL(-0.166192), REAL(0.770723), + REAL(-0.155145), REAL(-0.129632), REAL(0.791738), + REAL(-0.183611), REAL(-0.058705), REAL(0.847012), + REAL(-0.165562), REAL(0.001980), REAL(0.833386), + REAL(-0.220084), REAL(0.019914), REAL(0.768935), + REAL(-0.255730), REAL(0.090306), REAL(0.670782), + REAL(-0.255594), REAL(0.113833), REAL(0.663389), + REAL(-0.226380), REAL(0.212655), REAL(0.617740), + REAL(-0.003367), REAL(-0.195342), REAL(0.799680), + REAL(-0.029743), REAL(-0.210508), REAL(0.827180), + REAL(-0.003818), REAL(-0.194783), REAL(0.873636), + REAL(-0.004116), REAL(-0.157907), REAL(0.931268), + REAL(-0.031280), REAL(-0.184555), REAL(0.889476), + REAL(-0.059885), REAL(-0.184448), REAL(0.841330), + REAL(-0.135333), REAL(-0.164332), REAL(0.878200), + REAL(-0.085574), REAL(-0.170948), REAL(0.925547), + REAL(-0.163833), REAL(-0.094170), REAL(0.897114), + REAL(-0.138444), REAL(-0.104250), REAL(0.945975), + REAL(-0.083497), REAL(-0.084934), REAL(0.979607), + REAL(-0.004433), REAL(-0.146642), REAL(0.985872), + REAL(-0.150715), REAL(0.032650), REAL(0.884111), + REAL(-0.135892), REAL(-0.035520), REAL(0.945455), + REAL(-0.070612), REAL(0.036849), REAL(0.975733), + REAL(-0.004458), REAL(-0.042526), REAL(1.015670), + REAL(-0.004249), REAL(0.046042), REAL(1.003240), + REAL(-0.086969), REAL(0.133224), REAL(0.947633), + REAL(-0.003873), REAL(0.161605), REAL(0.970499), + REAL(-0.125544), REAL(0.140012), REAL(0.917678), + REAL(-0.125651), REAL(0.250246), REAL(0.857602), + REAL(-0.003127), REAL(0.284070), REAL(0.878870), + REAL(-0.159174), REAL(0.125726), REAL(0.888878), + REAL(-0.183807), REAL(0.196970), REAL(0.844480), + REAL(-0.159890), REAL(0.291736), REAL(0.732480), + REAL(-0.199495), REAL(0.207230), REAL(0.779864), + REAL(-0.206182), REAL(0.164608), REAL(0.693257), + REAL(-0.186315), REAL(0.160689), REAL(0.817193), + REAL(-0.192827), REAL(0.166706), REAL(0.782271), + REAL(-0.175112), REAL(0.110008), REAL(0.860621), + REAL(-0.161022), REAL(0.057420), REAL(0.855111), + REAL(-0.172319), REAL(0.036155), REAL(0.816189), + REAL(-0.190318), REAL(0.064083), REAL(0.760605), + REAL(-0.195072), REAL(0.129179), REAL(0.731104), + REAL(-0.203126), REAL(0.410287), REAL(0.680536), + REAL(-0.216677), REAL(0.309274), REAL(0.642272), + REAL(-0.241515), REAL(0.311485), REAL(0.587832), + REAL(-0.002209), REAL(0.366663), REAL(0.749413), + REAL(-0.088230), REAL(0.396265), REAL(0.678635), + REAL(-0.170147), REAL(0.109517), REAL(0.840784), + REAL(-0.160521), REAL(0.067766), REAL(0.830650), + REAL(-0.181546), REAL(0.139805), REAL(0.812146), + REAL(-0.180495), REAL(0.148568), REAL(0.776087), + REAL(-0.180255), REAL(0.129125), REAL(0.744192), + REAL(-0.186298), REAL(0.078308), REAL(0.769352), + REAL(-0.167622), REAL(0.060539), REAL(0.806675), + REAL(-0.189876), REAL(0.102760), REAL(0.802582), + REAL(-0.108340), REAL(0.455446), REAL(0.657174), + REAL(-0.241585), REAL(0.527592), REAL(0.669296), + REAL(-0.265676), REAL(0.513366), REAL(0.634594), + REAL(-0.203073), REAL(0.478550), REAL(0.581526), + REAL(-0.266772), REAL(0.642330), REAL(0.602061), + REAL(-0.216961), REAL(0.564846), REAL(0.535435), + REAL(-0.202210), REAL(0.525495), REAL(0.475944), + REAL(-0.193888), REAL(0.467925), REAL(0.520606), + REAL(-0.265837), REAL(0.757267), REAL(0.500933), + REAL(-0.240306), REAL(0.653440), REAL(0.463215), + REAL(-0.309239), REAL(0.776868), REAL(0.304726), + REAL(-0.271009), REAL(0.683094), REAL(0.382018), + REAL(-0.312111), REAL(0.671099), REAL(0.286687), + REAL(-0.268791), REAL(0.624342), REAL(0.377231), + REAL(-0.302457), REAL(0.533996), REAL(0.360289), + REAL(-0.263656), REAL(0.529310), REAL(0.412564), + REAL(-0.282311), REAL(0.415167), REAL(0.447666), + REAL(-0.239201), REAL(0.442096), REAL(0.495604), + REAL(-0.220043), REAL(0.569026), REAL(0.445877), + REAL(-0.001263), REAL(0.395631), REAL(0.602029), + REAL(-0.057345), REAL(0.442535), REAL(0.572224), + REAL(-0.088927), REAL(0.506333), REAL(0.529106), + REAL(-0.125738), REAL(0.535076), REAL(0.612913), + REAL(-0.126251), REAL(0.577170), REAL(0.483159), + REAL(-0.149594), REAL(0.611520), REAL(0.557731), + REAL(-0.163188), REAL(0.660791), REAL(0.491080), + REAL(-0.172482), REAL(0.663387), REAL(0.415416), + REAL(-0.160464), REAL(0.591710), REAL(0.370659), + REAL(-0.156445), REAL(0.536396), REAL(0.378302), + REAL(-0.136496), REAL(0.444358), REAL(0.425226), + REAL(-0.095564), REAL(0.373768), REAL(0.473659), + REAL(-0.104146), REAL(0.315912), REAL(0.498104), + REAL(-0.000496), REAL(0.384194), REAL(0.473817), + REAL(-0.000183), REAL(0.297770), REAL(0.401486), + REAL(-0.129042), REAL(0.270145), REAL(0.434495), + REAL(0.000100), REAL(0.272963), REAL(0.349138), + REAL(-0.113060), REAL(0.236984), REAL(0.385554), + REAL(0.007260), REAL(0.016311), REAL(-0.883396), + REAL(0.007865), REAL(0.122104), REAL(-0.956137), + REAL(-0.032842), REAL(0.115282), REAL(-0.953252), + REAL(-0.089115), REAL(0.108449), REAL(-0.950317), + REAL(-0.047440), REAL(0.014729), REAL(-0.882756), + REAL(-0.104458), REAL(0.013137), REAL(-0.882070), + REAL(-0.086439), REAL(-0.584866), REAL(-0.608343), + REAL(-0.115026), REAL(-0.662605), REAL(-0.436732), + REAL(-0.071683), REAL(-0.665372), REAL(-0.606385), + REAL(-0.257884), REAL(-0.665381), REAL(-0.658052), + REAL(-0.272542), REAL(-0.665381), REAL(-0.592063), + REAL(-0.371322), REAL(-0.665382), REAL(-0.353620), + REAL(-0.372362), REAL(-0.665381), REAL(-0.224420), + REAL(-0.335166), REAL(-0.665380), REAL(-0.078623), + REAL(-0.225999), REAL(-0.665375), REAL(-0.038981), + REAL(-0.106719), REAL(-0.665374), REAL(-0.186351), + REAL(-0.081749), REAL(-0.665372), REAL(-0.292554), + REAL(0.006943), REAL(-0.091505), REAL(-0.858354), + REAL(0.006117), REAL(-0.280985), REAL(-0.769967), + REAL(0.004495), REAL(-0.502360), REAL(-0.559799), + REAL(-0.198638), REAL(-0.302135), REAL(-0.845816), + REAL(-0.237395), REAL(-0.542544), REAL(-0.587188), + REAL(-0.270001), REAL(-0.279489), REAL(-0.669861), + REAL(-0.134547), REAL(-0.119852), REAL(-0.959004), + REAL(-0.052088), REAL(-0.122463), REAL(-0.944549), + REAL(-0.124463), REAL(-0.293508), REAL(-0.899566), + REAL(-0.047616), REAL(-0.289643), REAL(-0.879292), + REAL(-0.168595), REAL(-0.529132), REAL(-0.654931), + REAL(-0.099793), REAL(-0.515719), REAL(-0.645873), + REAL(-0.186168), REAL(-0.605282), REAL(-0.724690), + REAL(-0.112970), REAL(-0.583097), REAL(-0.707469), + REAL(-0.108152), REAL(-0.665375), REAL(-0.700408), + REAL(-0.183019), REAL(-0.665378), REAL(-0.717630), + REAL(-0.349529), REAL(-0.334459), REAL(-0.511985), + REAL(-0.141182), REAL(-0.437705), REAL(-0.798194), + REAL(-0.212670), REAL(-0.448725), REAL(-0.737447), + REAL(-0.261111), REAL(-0.414945), REAL(-0.613835), + REAL(-0.077364), REAL(-0.431480), REAL(-0.778113), + REAL(0.005174), REAL(-0.425277), REAL(-0.651592), + REAL(0.089236), REAL(-0.431732), REAL(-0.777093), + REAL(0.271006), REAL(-0.415749), REAL(-0.610577), + REAL(0.223981), REAL(-0.449384), REAL(-0.734774), + REAL(0.153275), REAL(-0.438150), REAL(-0.796391), + REAL(0.358414), REAL(-0.335529), REAL(-0.507649), + REAL(0.193434), REAL(-0.665946), REAL(-0.715325), + REAL(0.118363), REAL(-0.665717), REAL(-0.699021), + REAL(0.123515), REAL(-0.583454), REAL(-0.706020), + REAL(0.196851), REAL(-0.605860), REAL(-0.722345), + REAL(0.109788), REAL(-0.516035), REAL(-0.644590), + REAL(0.178656), REAL(-0.529656), REAL(-0.652804), + REAL(0.061157), REAL(-0.289807), REAL(-0.878626), + REAL(0.138234), REAL(-0.293905), REAL(-0.897958), + REAL(0.066933), REAL(-0.122643), REAL(-0.943820), + REAL(0.149571), REAL(-0.120281), REAL(-0.957264), + REAL(0.280989), REAL(-0.280321), REAL(-0.666487), + REAL(0.246581), REAL(-0.543275), REAL(-0.584224), + REAL(0.211720), REAL(-0.302754), REAL(-0.843303), + REAL(0.086966), REAL(-0.665627), REAL(-0.291520), + REAL(0.110634), REAL(-0.665702), REAL(-0.185021), + REAL(0.228099), REAL(-0.666061), REAL(-0.036201), + REAL(0.337743), REAL(-0.666396), REAL(-0.074503), + REAL(0.376722), REAL(-0.666513), REAL(-0.219833), + REAL(0.377265), REAL(-0.666513), REAL(-0.349036), + REAL(0.281411), REAL(-0.666217), REAL(-0.588670), + REAL(0.267564), REAL(-0.666174), REAL(-0.654834), + REAL(0.080745), REAL(-0.665602), REAL(-0.605452), + REAL(0.122016), REAL(-0.662963), REAL(-0.435280), + REAL(0.095767), REAL(-0.585141), REAL(-0.607228), + REAL(0.118944), REAL(0.012799), REAL(-0.880702), + REAL(0.061944), REAL(0.014564), REAL(-0.882086), + REAL(0.104725), REAL(0.108156), REAL(-0.949130), + REAL(0.048513), REAL(0.115159), REAL(-0.952753), + REAL(0.112696), REAL(0.236643), REAL(0.386937), + REAL(0.128177), REAL(0.269757), REAL(0.436071), + REAL(0.102643), REAL(0.315600), REAL(0.499370), + REAL(0.094535), REAL(0.373481), REAL(0.474824), + REAL(0.136270), REAL(0.443946), REAL(0.426895), + REAL(0.157071), REAL(0.535923), REAL(0.380222), + REAL(0.161350), REAL(0.591224), REAL(0.372630), + REAL(0.173035), REAL(0.662865), REAL(0.417531), + REAL(0.162808), REAL(0.660299), REAL(0.493077), + REAL(0.148250), REAL(0.611070), REAL(0.559555), + REAL(0.125719), REAL(0.576790), REAL(0.484702), + REAL(0.123489), REAL(0.534699), REAL(0.614440), + REAL(0.087621), REAL(0.506066), REAL(0.530188), + REAL(0.055321), REAL(0.442365), REAL(0.572915), + REAL(0.219936), REAL(0.568361), REAL(0.448571), + REAL(0.238099), REAL(0.441375), REAL(0.498528), + REAL(0.281711), REAL(0.414315), REAL(0.451121), + REAL(0.263833), REAL(0.528513), REAL(0.415794), + REAL(0.303284), REAL(0.533081), REAL(0.363998), + REAL(0.269687), REAL(0.623528), REAL(0.380528), + REAL(0.314255), REAL(0.670153), REAL(0.290524), + REAL(0.272023), REAL(0.682273), REAL(0.385343), + REAL(0.311480), REAL(0.775931), REAL(0.308527), + REAL(0.240239), REAL(0.652714), REAL(0.466159), + REAL(0.265619), REAL(0.756464), REAL(0.504187), + REAL(0.192562), REAL(0.467341), REAL(0.522972), + REAL(0.201605), REAL(0.524885), REAL(0.478417), + REAL(0.215743), REAL(0.564193), REAL(0.538084), + REAL(0.264969), REAL(0.641527), REAL(0.605317), + REAL(0.201031), REAL(0.477940), REAL(0.584002), + REAL(0.263086), REAL(0.512567), REAL(0.637832), + REAL(0.238615), REAL(0.526867), REAL(0.672237), + REAL(0.105309), REAL(0.455123), REAL(0.658482), + REAL(0.183993), REAL(0.102195), REAL(0.804872), + REAL(0.161563), REAL(0.060042), REAL(0.808692), + REAL(0.180748), REAL(0.077754), REAL(0.771600), + REAL(0.175168), REAL(0.128588), REAL(0.746368), + REAL(0.175075), REAL(0.148030), REAL(0.778264), + REAL(0.175658), REAL(0.139265), REAL(0.814333), + REAL(0.154191), REAL(0.067291), REAL(0.832578), + REAL(0.163818), REAL(0.109013), REAL(0.842830), + REAL(0.084760), REAL(0.396004), REAL(0.679695), + REAL(0.238888), REAL(0.310760), REAL(0.590775), + REAL(0.213380), REAL(0.308625), REAL(0.644905), + REAL(0.199666), REAL(0.409678), REAL(0.683003), + REAL(0.190143), REAL(0.128597), REAL(0.733463), + REAL(0.184833), REAL(0.063516), REAL(0.762902), + REAL(0.166070), REAL(0.035644), REAL(0.818261), + REAL(0.154361), REAL(0.056943), REAL(0.857042), + REAL(0.168542), REAL(0.109489), REAL(0.862725), + REAL(0.187387), REAL(0.166131), REAL(0.784599), + REAL(0.180428), REAL(0.160135), REAL(0.819438), + REAL(0.201823), REAL(0.163991), REAL(0.695756), + REAL(0.194206), REAL(0.206635), REAL(0.782275), + REAL(0.155438), REAL(0.291260), REAL(0.734412), + REAL(0.177696), REAL(0.196424), REAL(0.846693), + REAL(0.152305), REAL(0.125256), REAL(0.890786), + REAL(0.119546), REAL(0.249876), REAL(0.859104), + REAL(0.118369), REAL(0.139643), REAL(0.919173), + REAL(0.079410), REAL(0.132973), REAL(0.948652), + REAL(0.062419), REAL(0.036648), REAL(0.976547), + REAL(0.127847), REAL(-0.035919), REAL(0.947070), + REAL(0.143624), REAL(0.032206), REAL(0.885913), + REAL(0.074888), REAL(-0.085173), REAL(0.980577), + REAL(0.130184), REAL(-0.104656), REAL(0.947620), + REAL(0.156201), REAL(-0.094653), REAL(0.899074), + REAL(0.077366), REAL(-0.171194), REAL(0.926545), + REAL(0.127722), REAL(-0.164729), REAL(0.879810), + REAL(0.052670), REAL(-0.184618), REAL(0.842019), + REAL(0.023477), REAL(-0.184638), REAL(0.889811), + REAL(0.022626), REAL(-0.210587), REAL(0.827500), + REAL(0.223089), REAL(0.211976), REAL(0.620493), + REAL(0.251444), REAL(0.113067), REAL(0.666494), + REAL(0.251419), REAL(0.089540), REAL(0.673887), + REAL(0.214360), REAL(0.019258), REAL(0.771595), + REAL(0.158999), REAL(0.001490), REAL(0.835374), + REAL(0.176696), REAL(-0.059249), REAL(0.849218), + REAL(0.148696), REAL(-0.130091), REAL(0.793599), + REAL(0.108290), REAL(-0.166528), REAL(0.772088), + REAL(0.049820), REAL(-0.201382), REAL(0.764454), + REAL(0.071341), REAL(-0.215195), REAL(0.697209), + REAL(0.073148), REAL(-0.214475), REAL(0.623510), + REAL(0.140502), REAL(-0.169461), REAL(0.699354), + REAL(0.163374), REAL(-0.157073), REAL(0.611416), + REAL(0.189466), REAL(-0.138550), REAL(0.730366), + REAL(0.247593), REAL(-0.082554), REAL(0.759610), + REAL(0.227468), REAL(-0.121982), REAL(0.590197), + REAL(0.284702), REAL(-0.006586), REAL(0.535347), + REAL(0.275741), REAL(0.125287), REAL(0.446676), + REAL(0.266650), REAL(0.192594), REAL(0.506044), + REAL(0.300086), REAL(0.053287), REAL(0.629620), + REAL(0.055450), REAL(-0.663935), REAL(0.375065), + REAL(0.122854), REAL(-0.664138), REAL(0.482323), + REAL(0.046520), REAL(-0.531571), REAL(0.391918), + REAL(0.024824), REAL(-0.568450), REAL(0.275106), + REAL(0.053855), REAL(-0.663931), REAL(0.328224), + REAL(0.112829), REAL(-0.453549), REAL(0.305788), + REAL(0.131265), REAL(-0.510617), REAL(0.080746), + REAL(0.061174), REAL(-0.430716), REAL(-0.042710), + REAL(0.341019), REAL(-0.532887), REAL(-0.208150), + REAL(0.347705), REAL(-0.623533), REAL(-0.081139), + REAL(0.238040), REAL(-0.610732), REAL(-0.038037), + REAL(0.211764), REAL(-0.514274), REAL(-0.132078), + REAL(0.120605), REAL(-0.600219), REAL(-0.186856), + REAL(0.096985), REAL(-0.584476), REAL(-0.293357), + REAL(0.127621), REAL(-0.581941), REAL(-0.437170), + REAL(0.165902), REAL(-0.477425), REAL(-0.291453), + REAL(0.077720), REAL(-0.417975), REAL(-0.220519), + REAL(0.320892), REAL(-0.506363), REAL(-0.320874), + REAL(0.248214), REAL(-0.465684), REAL(-0.239842), + REAL(0.118764), REAL(-0.383338), REAL(-0.187114), + REAL(0.118816), REAL(-0.430106), REAL(-0.123307), + REAL(0.094131), REAL(-0.419464), REAL(-0.044777), + REAL(0.274526), REAL(-0.261706), REAL(0.005110), + REAL(0.259842), REAL(-0.283292), REAL(-0.003185), + REAL(0.222861), REAL(-0.340431), REAL(-0.038210), + REAL(0.204445), REAL(-0.664380), REAL(0.513353), + REAL(0.259286), REAL(-0.664547), REAL(0.471281), + REAL(0.185402), REAL(-0.476020), REAL(0.421718), + REAL(0.279163), REAL(-0.664604), REAL(0.417328), + REAL(0.277157), REAL(-0.528122), REAL(0.400208), + REAL(0.183069), REAL(-0.509812), REAL(0.329995), + REAL(0.282599), REAL(-0.429210), REAL(0.059242), + REAL(0.254816), REAL(-0.664541), REAL(0.290687), + REAL(0.271436), REAL(-0.567707), REAL(0.263966), + REAL(0.386561), REAL(-0.625221), REAL(-0.216870), + REAL(0.387086), REAL(-0.630883), REAL(-0.346073), + REAL(0.380021), REAL(-0.596021), REAL(-0.318679), + REAL(0.291269), REAL(-0.619007), REAL(-0.585707), + REAL(0.339280), REAL(-0.571198), REAL(-0.461946), + REAL(0.400045), REAL(-0.489778), REAL(-0.422640), + REAL(0.406817), REAL(-0.314349), REAL(-0.371230), + REAL(0.300588), REAL(-0.281718), REAL(-0.170549), + REAL(0.290866), REAL(-0.277304), REAL(-0.061905), + REAL(0.187735), REAL(-0.241545), REAL(0.509437), + REAL(0.188032), REAL(-0.287569), REAL(0.424234), + REAL(0.227520), REAL(-0.373262), REAL(0.293102), + REAL(0.266526), REAL(-0.273650), REAL(0.039597), + REAL(0.291592), REAL(-0.291676), REAL(0.111386), + REAL(0.291914), REAL(-0.122741), REAL(0.422683), + REAL(0.297574), REAL(-0.156119), REAL(0.373368), + REAL(0.286603), REAL(-0.232731), REAL(0.027162), + REAL(0.364663), REAL(-0.201399), REAL(0.206850), + REAL(0.353855), REAL(-0.132408), REAL(0.149228), + REAL(0.282208), REAL(-0.019715), REAL(0.314960), + REAL(0.331187), REAL(-0.099266), REAL(0.092701), + REAL(0.375463), REAL(-0.093120), REAL(-0.006467), + REAL(0.375917), REAL(-0.101236), REAL(-0.154882), + REAL(0.466635), REAL(-0.094416), REAL(-0.305669), + REAL(0.455805), REAL(-0.119881), REAL(-0.460632), + REAL(0.277465), REAL(-0.604242), REAL(-0.651871), + REAL(0.261022), REAL(-0.551176), REAL(-0.554667), + REAL(0.093627), REAL(0.258494), REAL(-0.920589), + REAL(0.114248), REAL(0.310608), REAL(-0.798070), + REAL(0.144232), REAL(0.211434), REAL(-0.835001), + REAL(0.119916), REAL(0.176940), REAL(-0.951159), + REAL(0.184061), REAL(0.101854), REAL(-0.918220), + REAL(0.092431), REAL(0.276521), REAL(-0.738231), + REAL(0.133504), REAL(0.218403), REAL(-0.758602), + REAL(0.194987), REAL(0.097655), REAL(-0.812476), + REAL(0.185542), REAL(0.011005), REAL(-0.879202), + REAL(0.230315), REAL(-0.127450), REAL(-0.884202), + REAL(0.260471), REAL(0.255056), REAL(-0.624378), + REAL(0.351567), REAL(-0.042194), REAL(-0.663976), + REAL(0.253742), REAL(0.323524), REAL(-0.433716), + REAL(0.411612), REAL(0.132299), REAL(-0.438264), + REAL(0.270513), REAL(0.356530), REAL(-0.289984), + REAL(0.422146), REAL(0.162819), REAL(-0.273130), + REAL(0.164724), REAL(0.237490), REAL(0.208912), + REAL(0.253806), REAL(0.092900), REAL(0.240640), + REAL(0.203608), REAL(0.284597), REAL(0.096223), + REAL(0.241006), REAL(0.343093), REAL(-0.171396), + REAL(0.356076), REAL(0.149288), REAL(-0.143443), + REAL(0.337656), REAL(0.131992), REAL(0.066374) +}; + +static int gIndicesBunny[BUNNY_NUM_TRIANGLES][3] = { + {126,134,133}, + {342,138,134}, + {133,134,138}, + {126,342,134}, + {312,316,317}, + {169,163,162}, + {312,317,319}, + {312,319,318}, + {169,162,164}, + {169,168,163}, + {312,314,315}, + {169,164,165}, + {169,167,168}, + {312,315,316}, + {312,313,314}, + {169,165,166}, + {169,166,167}, + {312,318,313}, + {308,304,305}, + {308,305,306}, + {179,181,188}, + {177,173,175}, + {177,175,176}, + {302,293,300}, + {322,294,304}, + {188,176,175}, + {188,175,179}, + {158,177,187}, + {305,293,302}, + {305,302,306}, + {322,304,308}, + {188,181,183}, + {158,173,177}, + {293,298,300}, + {304,294,296}, + {304,296,305}, + {185,176,188}, + {185,188,183}, + {187,177,176}, + {187,176,185}, + {305,296,298}, + {305,298,293}, + {436,432, 28}, + {436, 28, 23}, + {434,278,431}, + { 30,208,209}, + { 30,209, 29}, + { 19, 20, 24}, + {208,207,211}, + {208,211,209}, + { 19,210,212}, + {433,434,431}, + {433,431,432}, + {433,432,436}, + {436,437,433}, + {277,275,276}, + {277,276,278}, + {209,210, 25}, + { 21, 26, 24}, + { 21, 24, 20}, + { 25, 26, 27}, + { 25, 27, 29}, + {435,439,277}, + {439,275,277}, + {432,431, 30}, + {432, 30, 28}, + {433,437,438}, + {433,438,435}, + {434,277,278}, + { 24, 25,210}, + { 24, 26, 25}, + { 29, 27, 28}, + { 29, 28, 30}, + { 19, 24,210}, + {208, 30,431}, + {208,431,278}, + {435,434,433}, + {435,277,434}, + { 25, 29,209}, + { 27, 22, 23}, + { 27, 23, 28}, + { 26, 22, 27}, + { 26, 21, 22}, + {212,210,209}, + {212,209,211}, + {207,208,278}, + {207,278,276}, + {439,435,438}, + { 12, 9, 10}, + { 12, 10, 13}, + { 2, 3, 5}, + { 2, 5, 4}, + { 16, 13, 14}, + { 16, 14, 17}, + { 22, 21, 16}, + { 13, 10, 11}, + { 13, 11, 14}, + { 1, 0, 3}, + { 1, 3, 2}, + { 15, 12, 16}, + { 19, 18, 15}, + { 19, 15, 16}, + { 19, 16, 20}, + { 9, 1, 2}, + { 9, 2, 10}, + { 3, 7, 8}, + { 3, 8, 5}, + { 16, 17, 23}, + { 16, 23, 22}, + { 21, 20, 16}, + { 10, 2, 4}, + { 10, 4, 11}, + { 0, 6, 7}, + { 0, 7, 3}, + { 12, 13, 16}, + {451,446,445}, + {451,445,450}, + {442,440,439}, + {442,439,438}, + {442,438,441}, + {421,420,422}, + {412,411,426}, + {412,426,425}, + {408,405,407}, + {413, 67, 68}, + {413, 68,414}, + {391,390,412}, + { 80,384,386}, + {404,406,378}, + {390,391,377}, + {390,377, 88}, + {400,415,375}, + {398,396,395}, + {398,395,371}, + {398,371,370}, + {112,359,358}, + {112,358,113}, + {351,352,369}, + {125,349,348}, + {345,343,342}, + {342,340,339}, + {341,335,337}, + {328,341,327}, + {331,323,333}, + {331,322,323}, + {327,318,319}, + {327,319,328}, + {315,314,324}, + {302,300,301}, + {302,301,303}, + {320,311,292}, + {285,284,289}, + {310,307,288}, + {310,288,290}, + {321,350,281}, + {321,281,282}, + {423,448,367}, + {272,273,384}, + {272,384,274}, + {264,265,382}, + {264,382,383}, + {440,442,261}, + {440,261,263}, + {252,253,254}, + {252,254,251}, + {262,256,249}, + {262,249,248}, + {228,243,242}, + {228, 31,243}, + {213,215,238}, + {213,238,237}, + { 19,212,230}, + {224,225,233}, + {224,233,231}, + {217,218, 56}, + {217, 56, 54}, + {217,216,239}, + {217,239,238}, + {217,238,215}, + {218,217,215}, + {218,215,214}, + { 6,102,206}, + {186,199,200}, + {197,182,180}, + {170,171,157}, + {201,200,189}, + {170,190,191}, + {170,191,192}, + {175,174,178}, + {175,178,179}, + {168,167,155}, + {122,149,158}, + {122,158,159}, + {135,153,154}, + {135,154,118}, + {143,140,141}, + {143,141,144}, + {132,133,136}, + {130,126,133}, + {124,125,127}, + {122,101,100}, + {122,100,121}, + {110,108,107}, + {110,107,109}, + { 98, 99, 97}, + { 98, 97, 64}, + { 98, 64, 66}, + { 87, 55, 57}, + { 83, 82, 79}, + { 83, 79, 84}, + { 78, 74, 50}, + { 49, 71, 41}, + { 49, 41, 37}, + { 49, 37, 36}, + { 58, 44, 60}, + { 60, 59, 58}, + { 51, 34, 33}, + { 39, 40, 42}, + { 39, 42, 38}, + {243,240, 33}, + {243, 33,229}, + { 39, 38, 6}, + { 44, 46, 40}, + { 55, 56, 57}, + { 64, 62, 65}, + { 64, 65, 66}, + { 41, 71, 45}, + { 75, 50, 51}, + { 81, 79, 82}, + { 77, 88, 73}, + { 93, 92, 94}, + { 68, 47, 46}, + { 96, 97, 99}, + { 96, 99, 95}, + {110,109,111}, + {111,112,110}, + {114,113,123}, + {114,123,124}, + {132,131,129}, + {133,137,136}, + {135,142,145}, + {145,152,135}, + {149,147,157}, + {157,158,149}, + {164,150,151}, + {153,163,168}, + {153,168,154}, + {185,183,182}, + {185,182,184}, + {161,189,190}, + {200,199,191}, + {200,191,190}, + {180,178,195}, + {180,195,196}, + {102,101,204}, + {102,204,206}, + { 43, 48,104}, + { 43,104,103}, + {216,217, 54}, + {216, 54, 32}, + {207,224,231}, + {230,212,211}, + {230,211,231}, + {227,232,241}, + {227,241,242}, + {235,234,241}, + {235,241,244}, + {430,248,247}, + {272,274,253}, + {272,253,252}, + {439,260,275}, + {225,224,259}, + {225,259,257}, + {269,270,407}, + {269,407,405}, + {270,269,273}, + {270,273,272}, + {273,269,268}, + {273,268,267}, + {273,267,266}, + {273,266,265}, + {273,265,264}, + {448,279,367}, + {281,350,368}, + {285,286,301}, + {290,323,310}, + {290,311,323}, + {282,281,189}, + {292,311,290}, + {292,290,291}, + {307,306,302}, + {307,302,303}, + {316,315,324}, + {316,324,329}, + {331,351,350}, + {330,334,335}, + {330,335,328}, + {341,337,338}, + {344,355,354}, + {346,345,348}, + {346,348,347}, + {364,369,352}, + {364,352,353}, + {365,363,361}, + {365,361,362}, + {376,401,402}, + {373,372,397}, + {373,397,400}, + {376, 92,377}, + {381,378,387}, + {381,387,385}, + {386, 77, 80}, + {390,389,412}, + {416,417,401}, + {403,417,415}, + {408,429,430}, + {419,423,418}, + {427,428,444}, + {427,444,446}, + {437,436,441}, + {450,445, 11}, + {450, 11, 4}, + {447,449, 5}, + {447, 5, 8}, + {441,438,437}, + {425,426,451}, + {425,451,452}, + {417,421,415}, + {408,407,429}, + {399,403,400}, + {399,400,397}, + {394,393,416}, + {389,411,412}, + {386,383,385}, + {408,387,378}, + {408,378,406}, + {377,391,376}, + { 94,375,415}, + {372,373,374}, + {372,374,370}, + {359,111,360}, + {359,112,111}, + {113,358,349}, + {113,349,123}, + {346,343,345}, + {343,340,342}, + {338,336,144}, + {338,144,141}, + {327,341,354}, + {327,354,326}, + {331,350,321}, + {331,321,322}, + {314,313,326}, + {314,326,325}, + {300,298,299}, + {300,299,301}, + {288,287,289}, + {189,292,282}, + {287,288,303}, + {284,285,297}, + {368,280,281}, + {448,447,279}, + {274,226,255}, + {267,268,404}, + {267,404,379}, + {429,262,430}, + {439,440,260}, + {257,258,249}, + {257,249,246}, + {430,262,248}, + {234,228,242}, + {234,242,241}, + {237,238,239}, + {237,239,236}, + { 15, 18,227}, + { 15,227,229}, + {222,223, 82}, + {222, 82, 83}, + {214,215,213}, + {214,213, 81}, + { 38,102, 6}, + {122,159,200}, + {122,200,201}, + {174,171,192}, + {174,192,194}, + {197,193,198}, + {190,170,161}, + {181,179,178}, + {181,178,180}, + {166,156,155}, + {163,153,152}, + {163,152,162}, + {120,156,149}, + {120,149,121}, + {152,153,135}, + {140,143,142}, + {135,131,132}, + {135,132,136}, + {130,129,128}, + {130,128,127}, + {100,105,119}, + {100,119,120}, + {106,104,107}, + {106,107,108}, + { 91, 95, 59}, + { 93, 94, 68}, + { 91, 89, 92}, + { 76, 53, 55}, + { 76, 55, 87}, + { 81, 78, 79}, + { 74, 73, 49}, + { 69, 60, 45}, + { 58, 62, 64}, + { 58, 64, 61}, + { 53, 31, 32}, + { 32, 54, 53}, + { 42, 43, 38}, + { 35, 36, 0}, + { 35, 0, 1}, + { 34, 35, 1}, + { 34, 1, 9}, + { 44, 40, 41}, + { 44, 41, 45}, + { 33,240, 51}, + { 63, 62, 58}, + { 63, 58, 59}, + { 45, 71, 70}, + { 76, 75, 51}, + { 76, 51, 52}, + { 86, 85, 84}, + { 86, 84, 87}, + { 89, 72, 73}, + { 89, 73, 88}, + { 91, 92, 96}, + { 91, 96, 95}, + { 72, 91, 60}, + { 72, 60, 69}, + {104,106,105}, + {119,105,117}, + {119,117,118}, + {124,127,128}, + {117,116,129}, + {117,129,131}, + {118,117,131}, + {135,140,142}, + {146,150,152}, + {146,152,145}, + {149,122,121}, + {166,165,151}, + {166,151,156}, + {158,172,173}, + {161,160,189}, + {199,198,193}, + {199,193,191}, + {204,201,202}, + {178,174,194}, + {200,159,186}, + {109, 48, 67}, + { 48,107,104}, + {216, 32,236}, + {216,236,239}, + {223,214, 81}, + {223, 81, 82}, + { 33, 12, 15}, + { 32,228,234}, + { 32,234,236}, + {240, 31, 52}, + {256,255,246}, + {256,246,249}, + {258,263,248}, + {258,248,249}, + {275,260,259}, + {275,259,276}, + {207,276,259}, + {270,271,429}, + {270,429,407}, + {413,418,366}, + {413,366,365}, + {368,367,279}, + {368,279,280}, + {303,301,286}, + {303,286,287}, + {283,282,292}, + {283,292,291}, + {320,292,189}, + {298,296,297}, + {298,297,299}, + {318,327,326}, + {318,326,313}, + {329,330,317}, + {336,333,320}, + {326,354,353}, + {334,332,333}, + {334,333,336}, + {342,339,139}, + {342,139,138}, + {345,342,126}, + {347,357,356}, + {369,368,351}, + {363,356,357}, + {363,357,361}, + {366,367,368}, + {366,368,369}, + {375,373,400}, + { 92, 90,377}, + {409,387,408}, + {386,385,387}, + {386,387,388}, + {412,394,391}, + {396,398,399}, + {408,406,405}, + {415,421,419}, + {415,419,414}, + {425,452,448}, + {425,448,424}, + {444,441,443}, + {448,452,449}, + {448,449,447}, + {446,444,443}, + {446,443,445}, + {250,247,261}, + {250,261,428}, + {421,422,423}, + {421,423,419}, + {427,410,250}, + {417,403,401}, + {403,402,401}, + {420,392,412}, + {420,412,425}, + {420,425,424}, + {386,411,389}, + {383,382,381}, + {383,381,385}, + {378,379,404}, + {372,371,395}, + {372,395,397}, + {371,372,370}, + {361,359,360}, + {361,360,362}, + {368,350,351}, + {349,347,348}, + {356,355,344}, + {356,344,346}, + {344,341,340}, + {344,340,343}, + {338,337,336}, + {328,335,341}, + {324,352,351}, + {324,351,331}, + {320,144,336}, + {314,325,324}, + {322,308,309}, + {310,309,307}, + {287,286,289}, + {203,280,279}, + {203,279,205}, + {297,295,283}, + {297,283,284}, + {447,205,279}, + {274,384, 80}, + {274, 80,226}, + {266,267,379}, + {266,379,380}, + {225,257,246}, + {225,246,245}, + {256,254,253}, + {256,253,255}, + {430,247,250}, + {226,235,244}, + {226,244,245}, + {232,233,244}, + {232,244,241}, + {230, 18, 19}, + { 32, 31,228}, + {219,220, 86}, + {219, 86, 57}, + {226,213,235}, + {206, 7, 6}, + {122,201,101}, + {201,204,101}, + {180,196,197}, + {170,192,171}, + {200,190,189}, + {194,193,195}, + {183,181,180}, + {183,180,182}, + {155,154,168}, + {149,156,151}, + {149,151,148}, + {155,156,120}, + {145,142,143}, + {145,143,146}, + {136,137,140}, + {133,132,130}, + {128,129,116}, + {100,120,121}, + {110,112,113}, + {110,113,114}, + { 66, 65, 63}, + { 66, 63, 99}, + { 66, 99, 98}, + { 96, 46, 61}, + { 89, 88, 90}, + { 86, 87, 57}, + { 80, 78, 81}, + { 72, 69, 49}, + { 67, 48, 47}, + { 67, 47, 68}, + { 56, 55, 53}, + { 50, 49, 36}, + { 50, 36, 35}, + { 40, 39, 41}, + {242,243,229}, + {242,229,227}, + { 6, 37, 39}, + { 42, 47, 48}, + { 42, 48, 43}, + { 61, 46, 44}, + { 45, 70, 69}, + { 69, 70, 71}, + { 69, 71, 49}, + { 74, 78, 77}, + { 83, 84, 85}, + { 73, 74, 77}, + { 93, 96, 92}, + { 68, 46, 93}, + { 95, 99, 63}, + { 95, 63, 59}, + {115,108,110}, + {115,110,114}, + {125,126,127}, + {129,130,132}, + {137,133,138}, + {137,138,139}, + {148,146,143}, + {148,143,147}, + {119,118,154}, + {161,147,143}, + {165,164,151}, + {158,157,171}, + {158,171,172}, + {159,158,187}, + {159,187,186}, + {194,192,191}, + {194,191,193}, + {189,202,201}, + {182,197,184}, + {205, 8, 7}, + { 48,109,107}, + {218,219, 57}, + {218, 57, 56}, + {207,231,211}, + {232,230,231}, + {232,231,233}, + { 53, 52, 31}, + {388,411,386}, + {409,430,250}, + {262,429,254}, + {262,254,256}, + {442,444,428}, + {273,264,383}, + {273,383,384}, + {429,271,251}, + {429,251,254}, + {413,365,362}, + { 67,413,360}, + {282,283,295}, + {285,301,299}, + {202,281,280}, + {284,283,291}, + {284,291,289}, + {320,189,160}, + {308,306,307}, + {307,309,308}, + {319,317,330}, + {319,330,328}, + {353,352,324}, + {332,331,333}, + {340,341,338}, + {354,341,344}, + {349,358,357}, + {349,357,347}, + {364,355,356}, + {364,356,363}, + {364,365,366}, + {364,366,369}, + {374,376,402}, + {375, 92,373}, + { 77,389,390}, + {382,380,381}, + {389, 77,386}, + {393,394,412}, + {393,412,392}, + {401,394,416}, + {415,400,403}, + {411,410,427}, + {411,427,426}, + {422,420,424}, + {247,248,263}, + {247,263,261}, + {445,443, 14}, + {445, 14, 11}, + {449,450, 4}, + {449, 4, 5}, + {443,441, 17}, + {443, 17, 14}, + {436, 23, 17}, + {436, 17,441}, + {424,448,422}, + {448,423,422}, + {414,419,418}, + {414,418,413}, + {406,404,405}, + {399,397,395}, + {399,395,396}, + {420,416,392}, + {388,410,411}, + {386,384,383}, + {390, 88, 77}, + {375, 94, 92}, + {415,414, 68}, + {415, 68, 94}, + {370,374,402}, + {370,402,398}, + {361,357,358}, + {361,358,359}, + {125,348,126}, + {346,344,343}, + {340,338,339}, + {337,335,334}, + {337,334,336}, + {325,353,324}, + {324,331,332}, + {324,332,329}, + {323,322,309}, + {323,309,310}, + {294,295,297}, + {294,297,296}, + {289,286,285}, + {202,280,203}, + {288,307,303}, + {282,295,321}, + { 67,360,111}, + {418,423,367}, + {418,367,366}, + {272,252,251}, + {272,251,271}, + {272,271,270}, + {255,253,274}, + {265,266,380}, + {265,380,382}, + {442,428,261}, + {440,263,258}, + {440,258,260}, + {409,250,410}, + {255,226,245}, + {255,245,246}, + { 31,240,243}, + {236,234,235}, + {236,235,237}, + {233,225,245}, + {233,245,244}, + {220,221, 85}, + {220, 85, 86}, + { 81,213,226}, + { 81,226, 80}, + { 7,206,205}, + {186,184,198}, + {186,198,199}, + {204,203,205}, + {204,205,206}, + {195,193,196}, + {171,174,172}, + {173,174,175}, + {173,172,174}, + {155,167,166}, + {160,161,143}, + {160,143,144}, + {119,154,155}, + {148,151,150}, + {148,150,146}, + {140,137,139}, + {140,139,141}, + {127,126,130}, + {114,124,128}, + {114,128,115}, + {117,105,106}, + {117,106,116}, + {104,105,100}, + {104,100,103}, + { 59, 60, 91}, + { 97, 96, 61}, + { 97, 61, 64}, + { 91, 72, 89}, + { 87, 84, 79}, + { 87, 79, 76}, + { 78, 80, 77}, + { 49, 50, 74}, + { 60, 44, 45}, + { 61, 44, 58}, + { 51, 50, 35}, + { 51, 35, 34}, + { 39, 37, 41}, + { 33, 34, 9}, + { 33, 9, 12}, + { 0, 36, 37}, + { 0, 37, 6}, + { 40, 46, 47}, + { 40, 47, 42}, + { 53, 54, 56}, + { 65, 62, 63}, + { 72, 49, 73}, + { 79, 78, 75}, + { 79, 75, 76}, + { 52, 53, 76}, + { 92, 89, 90}, + { 96, 93, 46}, + {102,103,100}, + {102,100,101}, + {116,106,108}, + {116,108,115}, + {123,125,124}, + {116,115,128}, + {118,131,135}, + {140,135,136}, + {148,147,149}, + {120,119,155}, + {164,162,152}, + {164,152,150}, + {157,147,161}, + {157,161,170}, + {186,187,185}, + {186,185,184}, + {193,197,196}, + {202,203,204}, + {194,195,178}, + {198,184,197}, + { 67,111,109}, + { 38, 43,103}, + { 38,103,102}, + {214,223,222}, + {214,222,221}, + {214,221,220}, + {214,220,219}, + {214,219,218}, + {213,237,235}, + {221,222, 83}, + {221, 83, 85}, + { 15,229, 33}, + {227, 18,230}, + {227,230,232}, + { 52, 51,240}, + { 75, 78, 50}, + {408,430,409}, + {260,258,257}, + {260,257,259}, + {224,207,259}, + {268,269,405}, + {268,405,404}, + {413,362,360}, + {447, 8,205}, + {299,297,285}, + {189,281,202}, + {290,288,289}, + {290,289,291}, + {322,321,295}, + {322,295,294}, + {333,323,311}, + {333,311,320}, + {317,316,329}, + {320,160,144}, + {353,325,326}, + {329,332,334}, + {329,334,330}, + {339,338,141}, + {339,141,139}, + {348,345,126}, + {347,356,346}, + {123,349,125}, + {364,353,354}, + {364,354,355}, + {365,364,363}, + {376,391,394}, + {376,394,401}, + { 92,376,374}, + { 92,374,373}, + {377, 90, 88}, + {380,379,378}, + {380,378,381}, + {388,387,409}, + {388,409,410}, + {416,393,392}, + {399,398,402}, + {399,402,403}, + {250,428,427}, + {421,417,416}, + {421,416,420}, + {426,427,446}, + {426,446,451}, + {444,442,441}, + {452,451,450}, + {452,450,449} +}; + + +//***************************THE END OF FAMOUS BUNNY TRIMESH********************************************// + + +#endif //BUNNY_MESH_H_ diff --git a/BulletPhysics/bulletTrunk/Demos/GimpactTestDemo/GimpactTestDemo.cpp b/BulletPhysics/bulletTrunk/Demos/GimpactTestDemo/GimpactTestDemo.cpp new file mode 100644 index 00000000..a78f8de4 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/GimpactTestDemo/GimpactTestDemo.cpp @@ -0,0 +1,684 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#include "btBulletDynamicsCommon.h" +#include "GimpactTestDemo.h" + +#define SHOW_NUM_DEEP_PENETRATIONS + +#include "LinearMath/btDefaultMotionState.h" +#include "LinearMath/btIDebugDraw.h" +#include "LinearMath/btQuickprof.h" +#include "LinearMath/btDefaultMotionState.h" + +/// Including GIMPACT here + + + +#include "BMF_Api.h" + +#include "GLDebugDrawer.h" + +#include "GL_ShapeDrawer.h" +#include "GlutStuff.h" + +/// Include Torus Mesh here +#include "TorusMesh.h" +#include "BunnyMesh.h" + +#ifdef SHOW_NUM_DEEP_PENETRATIONS +extern int gNumDeepPenetrationChecks; +extern int gNumSplitImpulseRecoveries; +extern int gNumGjkChecks; +#endif // + + + +//Real dts = 0.000001f; +Real dts = 1.0 / 60.0; + + +///************************************************************************************** +/// GIMPACT Test Demo made by DevO +/// +///************************************************************************************** + + + +GimpactConcaveDemo::~GimpactConcaveDemo() +{ + + int i; + for (i=m_dynamicsWorld->getNumCollisionObjects()-1; i>=0 ;i--) + { + btCollisionObject* obj = m_dynamicsWorld->getCollisionObjectArray()[i]; + btRigidBody* body = btRigidBody::upcast(obj); + if (body && body->getMotionState()) + { + delete body->getMotionState(); + } + m_dynamicsWorld->removeCollisionObject( obj ); + delete obj; + } + + delete m_dynamicsWorld; + + delete m_indexVertexArrays; + delete m_trimeshShape; + + delete m_indexVertexArrays2; + delete m_trimeshShape2; + + for (i=0;igetBroadphase()->getBroadphaseAabb(worldBoundsMin,worldBoundsMax); + + + int numObjects = m_dynamicsWorld->getNumCollisionObjects(); + btVector3 wireColor(1,0,0); + for (int i=0;igetCollisionObjectArray()[i]; + btRigidBody* body = btRigidBody::upcast(colObj); + + if (body && body->getMotionState()) + { + btDefaultMotionState* myMotionState = (btDefaultMotionState*)body->getMotionState(); + myMotionState->m_graphicsWorldTrans.getOpenGLMatrix(m); + } else + { + colObj->getWorldTransform().getOpenGLMatrix(m); + } + + btVector3 wireColor(1.f,1.0f,0.5f); //wants deactivation + if (i & 1) + { + wireColor = btVector3(0.f,0.0f,1.f); + } + ///color differently for active, sleeping, wantsdeactivation states + if (colObj->getActivationState() == 1) //active + { + if (i & 1) + { + wireColor += btVector3 (0.8f,0.1f,0.1f); + } else + { + wireColor += btVector3 (0.5f,0.f,0.f); + } + } + if (colObj->getActivationState() == 2) //ISLAND_SLEEPING + { + if (i & 1) + { + wireColor += btVector3 (0.5f,0.8f, 0.5f); + } else + { + wireColor += btVector3 (0.f,0.5f,0.f); + } + } + + m_shapeDrawer->drawOpenGL(m,colObj->getCollisionShape(),wireColor,getDebugMode(),worldBoundsMin,worldBoundsMax); + } + + + float xOffset = 10.f; + float yStart = 20.f; + float yIncr = 20.f; + char buf[124]; + + glColor3f(0, 0, 0); + + setOrthographicProjection(); + + glRasterPos3f(xOffset,yStart,0); + sprintf(buf,"mouse to interact"); + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); + yStart += yIncr; + + /* glRasterPos3f(xOffset,yStart,0); + sprintf(buf,"space to reset"); + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); + yStart += yIncr; + */ + glRasterPos3f(xOffset,yStart,0); + sprintf(buf,"cursor keys and z,x to navigate"); + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); + yStart += yIncr; + + glRasterPos3f(xOffset,yStart,0); + sprintf(buf,"i to toggle simulation, s single step"); + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); + yStart += yIncr; + + glRasterPos3f(xOffset,yStart,0); + sprintf(buf,"q to quit"); + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); + yStart += yIncr; + + glRasterPos3f(xOffset,yStart,0); + sprintf(buf,". to shoot TRIMESH (dot)"); + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); + yStart += yIncr; + + // not yet hooked up again after refactoring... + +/* glRasterPos3f(xOffset,yStart,0); + sprintf(buf,"d to toggle deactivation"); + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); + yStart += yIncr; +*/ + + /* + glRasterPos3f(xOffset,yStart,0); + sprintf(buf,"a to draw temporal AABBs"); + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); + yStart += yIncr; + */ + + glRasterPos3f(xOffset,yStart,0); + sprintf(buf,"h to toggle help text"); + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); + yStart += yIncr; + + //bool useBulletLCP = !(getDebugMode() & btIDebugDraw::DBG_DisableBulletLCP); + + bool useCCD = ((getDebugMode() & btIDebugDraw::DBG_EnableCCD) != 0); + + glRasterPos3f(xOffset,yStart,0); + sprintf(buf,"1 CCD mode (adhoc) = %i",useCCD); + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); + yStart += yIncr; + + glRasterPos3f(xOffset,yStart,0); + sprintf(buf,"+- shooting speed = %10.2f",m_ShootBoxInitialSpeed); + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); + yStart += yIncr; + + #ifdef SHOW_NUM_DEEP_PENETRATIONS + + glRasterPos3f(xOffset,yStart,0); + sprintf(buf,"gNumDeepPenetrationChecks = %d",gNumDeepPenetrationChecks); + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); + yStart += yIncr; + + glRasterPos3f(xOffset,yStart,0); + sprintf(buf,"gNumSplitImpulseRecoveries= %d",gNumSplitImpulseRecoveries); + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); + yStart += yIncr; + + + + + glRasterPos3f(xOffset,yStart,0); + sprintf(buf,"gNumGjkChecks= %d",gNumGjkChecks); + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); + yStart += yIncr; + + #endif //SHOW_NUM_DEEP_PENETRATIONS + + + resetPerspectiveProjection(); + + + } + +} + +//------------------------------------------------------------------------------ +void GimpactConcaveDemo::initGImpactCollision() +{ + /// Create Torus Shape + { + m_indexVertexArrays = new btTriangleIndexVertexArray + (NUM_TRIANGLES, + &gIndices[0][0], + 3*sizeof(int), + NUM_VERTICES, + (Real*) &gVertices[0],sizeof(Real)*3); + + +#ifdef BULLET_GIMPACT + #ifdef BULLET_GIMPACT_CONVEX_DECOMPOSITION + btGImpactConvexDecompositionShape * trimesh = new + btGImpactConvexDecompositionShape( + m_indexVertexArrays, btVector3(1.f,1.f,1.f),btScalar(0.01)); + trimesh->updateBound(); + #else + btGImpactMeshShape * trimesh = new btGImpactMeshShape(m_indexVertexArrays); + trimesh->setLocalScaling(btVector3(1.f,1.f,1.f)); + #ifdef BULLET_TRIANGLE_COLLISION + trimesh->setMargin(0.07f); ///????? + #else + trimesh->setMargin(0.0f); + #endif + trimesh->updateBound(); + #endif + + m_trimeshShape = trimesh; + +#else + m_trimeshShape = new btGIMPACTMeshData(m_indexVertexArrays); +#endif + + } + + /// Create Bunny Shape + { + m_indexVertexArrays2 = new btTriangleIndexVertexArray + (BUNNY_NUM_TRIANGLES, + &gIndicesBunny[0][0], + 3*sizeof(int), + BUNNY_NUM_VERTICES, + (Real*) &gVerticesBunny[0],sizeof(Real)*3); +#ifdef BULLET_GIMPACT + + #ifdef BULLET_GIMPACT_CONVEX_DECOMPOSITION + btGImpactConvexDecompositionShape * trimesh2 = new + btGImpactConvexDecompositionShape( + m_indexVertexArrays2, btVector3(4.f,4.f,4.f),btScalar(0.01)); + trimesh2->updateBound(); + #else + btGImpactMeshShape * trimesh2 = new btGImpactMeshShape(m_indexVertexArrays2); + trimesh2->setLocalScaling(btVector3(4.f,4.f,4.f)); + #ifdef BULLET_TRIANGLE_COLLISION + trimesh2->setMargin(0.07f); ///????? + #else + trimesh2->setMargin(0.0f); + #endif + trimesh2->updateBound(); + #endif + + + + m_trimeshShape2 = trimesh2; +#else + m_trimeshShape2 = new btGIMPACTMeshData(m_indexVertexArrays2); + +#endif + + } + + + ///register GIMPACT algorithm + btCollisionDispatcher * dispatcher = static_cast(m_dynamicsWorld ->getDispatcher()); + +#ifdef BULLET_GIMPACT + btGImpactCollisionAlgorithm::registerAlgorithm(dispatcher); +#else + btConcaveConcaveCollisionAlgorithm::registerAlgorithm(dispatcher); +#endif + + +} + +#ifndef BULLET_GIMPACT +btCollisionShape * GimpactConcaveDemo::createTorusShape() +{ + btGIMPACTMeshShape * newtrimeshShape = new btGIMPACTMeshShape(m_trimeshShape); + newtrimeshShape->setLocalScaling(btVector3(1.f,1.f,1.f)); + return newtrimeshShape; +} +btCollisionShape * GimpactConcaveDemo::createBunnyShape() +{ + btGIMPACTMeshShape * newtrimeshShape = new btGIMPACTMeshShape(m_trimeshShape2); + newtrimeshShape->setLocalScaling(btVector3(4.f,4.f,4.f)); + return newtrimeshShape; +} +#endif +//------------------------------------------------------------------------------ +void GimpactConcaveDemo::initPhysics() +{ + setTexturing(true); + setShadows(false); + + setCameraDistance(45.f); + + + /// Init Bullet + m_collisionConfiguration = new btDefaultCollisionConfiguration(); + + m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); + //btOverlappingPairCache* broadphase = new btSimpleBroadphase(); + //m_broadphase = new btSimpleBroadphase(); + + int maxProxies = 1024; + btVector3 worldAabbMin(-10000,-10000,-10000); + btVector3 worldAabbMax( 10000, 10000, 10000); + m_broadphase = new bt32BitAxisSweep3(worldAabbMin,worldAabbMax,maxProxies); + + m_constraintSolver = new btSequentialImpulseConstraintSolver(); + + m_dynamicsWorld = new btDiscreteDynamicsWorld(m_dispatcher,m_broadphase,m_constraintSolver,m_collisionConfiguration); + + //create trimesh model and shape + initGImpactCollision(); + + + + /// Create Scene + float mass = 0.f; + btTransform startTransform; + startTransform.setIdentity(); + + + btCollisionShape* staticboxShape1 = new btBoxShape(btVector3(200,1,200));//floor + m_collisionShapes.push_back(staticboxShape1); + startTransform.setOrigin(btVector3(0,-10,0)); + localCreateRigidBody(mass, startTransform,staticboxShape1); + + btCollisionShape* staticboxShape2 = new btBoxShape(btVector3(1,50,200));//left wall + m_collisionShapes.push_back(staticboxShape2); + startTransform.setOrigin(btVector3(-200,15,0)); + localCreateRigidBody(mass, startTransform,staticboxShape2); + + btCollisionShape* staticboxShape3 = new btBoxShape(btVector3(1,50,200));//right wall + m_collisionShapes.push_back(staticboxShape3); + startTransform.setOrigin(btVector3(200,15,0)); + localCreateRigidBody(mass, startTransform,staticboxShape3); + + btCollisionShape* staticboxShape4 = new btBoxShape(btVector3(200,50,1));//front wall + m_collisionShapes.push_back(staticboxShape4); + startTransform.setOrigin(btVector3(0,15,200)); + localCreateRigidBody(mass, startTransform,staticboxShape4); + + btCollisionShape* staticboxShape5 = new btBoxShape(btVector3(200,50,1));//back wall + m_collisionShapes.push_back(staticboxShape5); + startTransform.setOrigin(btVector3(0,15,-200)); + localCreateRigidBody(mass, startTransform,staticboxShape5); + + + //static plane + + btVector3 normal(-0.5,0.5,0.0); + normal.normalize(); + btCollisionShape* staticplaneShape6 = new btStaticPlaneShape(normal,0.0);// A plane + m_collisionShapes.push_back(staticplaneShape6); + startTransform.setOrigin(btVector3(0,-9,0)); + + btRigidBody* staticBody2 = localCreateRigidBody(mass, startTransform,staticplaneShape6 ); + + //another static plane + + normal.setValue(0.5,0.7,0.0); + //normal.normalize(); + btCollisionShape* staticplaneShape7 = new btStaticPlaneShape(normal,0.0);// A plane + m_collisionShapes.push_back(staticplaneShape7); + startTransform.setOrigin(btVector3(0,-10,0)); + + staticBody2 = localCreateRigidBody(mass, startTransform,staticplaneShape7 ); + + /// Create Static Torus + float height = 28; + float step = 2.5; + float massT = 1.0; + + startTransform.setOrigin(btVector3(0,height,-5)); + startTransform.setRotation(btQuaternion(3.14159265*0.5,0,3.14159265*0.5)); +#ifdef BULLET_GIMPACT + kinematicTorus = localCreateRigidBody(0.0, startTransform,m_trimeshShape); + +#else + kinematicTorus = localCreateRigidBody(0.0, startTransform,createTorusShape()); + +#endif //kinematicTorus->setCollisionFlags(kinematicTorus->getCollisionFlags()|btCollisionObject::CF_STATIC_OBJECT); + //kinematicTorus->setActivationState(ISLAND_SLEEPING); + + kinematicTorus->setCollisionFlags( kinematicTorus->getCollisionFlags() | btCollisionObject::CF_KINEMATIC_OBJECT); + kinematicTorus->setActivationState(DISABLE_DEACTIVATION); + + /// Kinematic + kinTorusTran = btVector3(-0.1,0,0); + kinTorusRot = btQuaternion(0,3.14159265*0.01,0); + +#ifdef TEST_GIMPACT_TORUS + +#ifdef BULLET_GIMPACT + /// Create dynamic Torus + for (int i=0;i<6;i++) + { + height -= step; + startTransform.setOrigin(btVector3(0,height,-5)); + startTransform.setRotation(btQuaternion(0,0,3.14159265*0.5)); + + btRigidBody* bodyA = localCreateRigidBody(massT, startTransform,m_trimeshShape); + + height -= step; + startTransform.setOrigin(btVector3(0,height,-5)); + startTransform.setRotation(btQuaternion(3.14159265*0.5,0,3.14159265*0.5)); + btRigidBody* bodyB = localCreateRigidBody(massT, startTransform,m_trimeshShape); + + } +#else + +/// Create dynamic Torus + for (int i=0;i<6;i++) + { + height -= step; + startTransform.setOrigin(btVector3(0,height,-5)); + startTransform.setRotation(btQuaternion(0,0,3.14159265*0.5)); + + btRigidBody* bodyA = localCreateRigidBody(massT, startTransform,createTorusShape()); + + height -= step; + startTransform.setOrigin(btVector3(0,height,-5)); + startTransform.setRotation(btQuaternion(3.14159265*0.5,0,3.14159265*0.5)); + btRigidBody* bodyB = localCreateRigidBody(massT, startTransform,createTorusShape()); + + } +#endif //no BULLET_GIMPACT +#endif + + startTransform.setIdentity(); + + + /// Create Dynamic Boxes + { + for (int i=0;i<8;i++) + { + btCollisionShape* boxShape = new btBoxShape(btVector3(1,1,1)); + m_collisionShapes.push_back(boxShape); + + startTransform.setOrigin(btVector3(2*i-5,2,-3)); + localCreateRigidBody(1, startTransform,boxShape); + } + } + + + //m_debugMode |= btIDebugDraw::DBG_DrawWireframe; + +} + +//------------------------------------------------------------------------------ +void GimpactConcaveDemo::shootTrimesh(const btVector3& destination) +{ + + if (m_dynamicsWorld) + { + float mass = 4.f; + btTransform startTransform; + startTransform.setIdentity(); + btVector3 camPos = getCameraPosition(); + startTransform.setOrigin(camPos); +#ifdef BULLET_GIMPACT + btRigidBody* body = this->localCreateRigidBody(mass, startTransform,m_trimeshShape2); +#else + btRigidBody* body = this->localCreateRigidBody(mass, startTransform,createBunnyShape()); +#endif + btVector3 linVel(destination[0]-camPos[0],destination[1]-camPos[1],destination[2]-camPos[2]); + linVel.normalize(); + linVel*=m_ShootBoxInitialSpeed*0.25; + + body->getWorldTransform().setOrigin(camPos); + body->getWorldTransform().setRotation(btQuaternion(0,0,0,1)); + body->setLinearVelocity(linVel); + body->setAngularVelocity(btVector3(0,0,0)); + } +} + +//------------------------------------------------------------------------------ +void GimpactConcaveDemo::clientMoveAndDisplay() +{ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + +#define USE_KINEMATIC_GROUND +#ifdef USE_KINEMATIC_GROUND + //kinTorusTran = btVector3(-0.05,0,0); + //kinTorusRot = btQuaternion(0,3.14159265*0.1,0); + + //kinematic object + btCollisionObject* colObj = kinematicTorus; + //is this a rigidbody with a motionstate? then use the motionstate to update positions! + if (colObj && btRigidBody::upcast(colObj) && btRigidBody::upcast(colObj)->getMotionState()) + { + btTransform newTrans; + btRigidBody::upcast(colObj)->getMotionState()->getWorldTransform(newTrans); + + newTrans.getOrigin() += kinTorusTran; + newTrans.getBasis() = newTrans.getBasis() * btMatrix3x3(kinTorusRot); + if(newTrans.getOrigin().getX() > 6.0){ + newTrans.getOrigin().setX(6.0); + kinTorusTran = -kinTorusTran; + } + if(newTrans.getOrigin().getX() < -6.0){ + newTrans.getOrigin().setX(-6.0); + kinTorusTran = -kinTorusTran; + } + + btRigidBody::upcast(colObj)->getMotionState()->setWorldTransform(newTrans); + } else + { + /* + btTransform &newTrans = m_dynamicsWorld->getCollisionObjectArray()[0]->getWorldTransform(); + newTrans.getOrigin() += kinTorusTran; + if(newTrans.getOrigin().getX() > 0.1) kinTorusTran = -kinTorusTran; + if(newTrans.getOrigin().getX() < 0.1) kinTorusTran = -kinTorusTran; + */ + } + +#endif //USE_KINEMATIC_GROUND + + + unsigned long int time = getDeltaTimeMicroseconds()/btScalar(1000); + printf("%i time %i ms \n",m_steps_done,time); + +//#ifdef BULLET_GIMPACT +// printf("%i time %.1f ms \n",m_steps_done,btGImpactCollisionAlgorithm::getAverageTreeCollisionTime()); +//#else +// printf("%i time %.1f ms \n",m_steps_done,btConcaveConcaveCollisionAlgorithm::getAverageTreeCollisionTime()); +//#endif + + //float dt = float(m_clock.getTimeMicroseconds()) * dts; //0.000001f; + float dt = btScalar(1./60.); + + + + m_dynamicsWorld->stepSimulation(dt); + + //optional but useful: debug drawing + m_dynamicsWorld->debugDrawWorld(); + + m_steps_done++; + + //m_dynamicsWorld->stepSimulation(dts); + + renderme(); + + glFlush(); + glutSwapBuffers(); + +} + +//------------------------------------------------------------------------------ +void GimpactConcaveDemo::displayCallback(void) { + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + renderme(); + + //optional but useful: debug drawing + if (m_dynamicsWorld) + m_dynamicsWorld->debugDrawWorld(); + + glFlush(); + glutSwapBuffers(); +} + +//------------------------------------------------------------------------------ +void GimpactConcaveDemo::clientResetScene() +{ + m_steps_done = 0; + DemoApplication::clientResetScene(); +} + +#define KEY_ESCAPE 0x1B + + +//------------------------------------------------------------------------------ +void GimpactConcaveDemo::keyboardCallback(unsigned char key, int x, int y) +{ + switch (key) + { + case '.': + { + shootTrimesh(getCameraTargetPosition()); + break; + } + + case '2': + { + dts += 0.000001f; + break; + } + case '3': + { + dts -= 0.000001f; if(dts<0.000001f) dts = 0.000001f; + break; + } + + default: + DemoApplication::keyboardCallback(key, x, y); + } +} + + + diff --git a/BulletPhysics/bulletTrunk/Demos/GimpactTestDemo/GimpactTestDemo.h b/BulletPhysics/bulletTrunk/Demos/GimpactTestDemo/GimpactTestDemo.h new file mode 100644 index 00000000..42ff51bd --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/GimpactTestDemo/GimpactTestDemo.h @@ -0,0 +1,131 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ +#ifndef TEST_CONCAVE_DEMO_H +#define TEST_CONCAVE_DEMO_H + +#include "DemoApplication.h" +class btTriangleIndexVertexArray; +class btDefaultCollisionConfiguration; + +//#define BULLET_TRIANGLE_COLLISION 1 +#define BULLET_GIMPACT 1 +#define BULLET_GIMPACT_CONVEX_DECOMPOSITION 1 + +#define TEST_GIMPACT_TORUS + +#ifdef BULLET_GIMPACT + +#include "BulletCollision/Gimpact/btGImpactCollisionAlgorithm.h" + #ifdef BULLET_GIMPACT_CONVEX_DECOMPOSITION + #include "../Extras/GIMPACTUtils/btGImpactConvexDecompositionShape.h" + #endif + + +#else + +#include "BulletCollision/Gimpact/btConcaveConcaveCollisionAlgorithm.h" +#include "BulletCollision/Gimpact/btGIMPACTMeshShape.h" + +#endif + + + +class btConstraintSolver; +struct btCollisionAlgorithmCreateFunc; + +///GimpactConcaveDemo shows usage of static concave triangle meshes +///It also shows per-triangle material (friction/restitution) through CustomMaterialCombinerCallback +class GimpactConcaveDemo : public DemoApplication +{ + +public: + GimpactConcaveDemo() + : m_trimeshShape(NULL), + m_trimeshShape2(NULL), + m_indexVertexArrays(NULL), + m_indexVertexArrays2(NULL), + m_collisionConfiguration(NULL), + m_dispatcher(NULL), + m_broadphase(NULL), + kinematicTorus(NULL), + m_constraintSolver(NULL), + m_gimpactCollisionCreateFunc(NULL), + m_steps_done(0) + { + } + + virtual ~GimpactConcaveDemo(); + + + void initGImpactCollision(); + void initPhysics(); + + virtual void clientMoveAndDisplay(); + + virtual void displayCallback(); + + virtual void clientResetScene(); + + virtual void renderme(); + virtual void keyboardCallback(unsigned char key, int x, int y); + + ///Demo functions + void shootTrimesh(const btVector3& destination); + +public: ///data + unsigned int m_steps_done; + +#ifdef BULLET_GIMPACT + btCollisionShape *m_trimeshShape; + btCollisionShape *m_trimeshShape2; +#else + + btGIMPACTMeshData * m_trimeshShape; + btGIMPACTMeshData * m_trimeshShape2; + + btCollisionShape * createTorusShape(); + btCollisionShape * createBunnyShape(); + +#endif + + //keep the collision shapes, for deletion/cleanup + btAlignedObjectArray m_collisionShapes; + + btTriangleIndexVertexArray *m_indexVertexArrays; + btTriangleIndexVertexArray *m_indexVertexArrays2; + + btVector3 kinTorusTran; + btQuaternion kinTorusRot; + btRigidBody *kinematicTorus; + + + btCollisionAlgorithmCreateFunc* m_gimpactCollisionCreateFunc; + + btDefaultCollisionConfiguration* m_collisionConfiguration; + btCollisionDispatcher* m_dispatcher; + btBroadphaseInterface* m_broadphase; + btConstraintSolver* m_constraintSolver; + + static DemoApplication* Create() + { + GimpactConcaveDemo* demo = new GimpactConcaveDemo(); + demo->myinit(); + demo->initPhysics(); + return demo; + } +}; + +#endif //CONCAVE_DEMO_H + diff --git a/BulletPhysics/bulletTrunk/Demos/GimpactTestDemo/Jamfile b/BulletPhysics/bulletTrunk/Demos/GimpactTestDemo/Jamfile new file mode 100644 index 00000000..b55b2388 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/GimpactTestDemo/Jamfile @@ -0,0 +1,21 @@ +SubDir TOP Demos GimpactTestDemo ; + + #some demos need extra functionality, Collada / ConvexDecomposition etc. + + rule ExtraDemo1 + + { + Application $(<) : $(>) : noinstall console nomanifest ; + LinkWith $(<) : GIMPACTUtils bulletopenglsupport bulletdynamics bulletcollision bulletmath ; + CFlags $(<) : + [ FIncludes $(TOP)/Demos/OpenGL ] + [ FIncludes $(TOP)/Extras/GIMPACTUtils ] + ; + + MsvcIncDirs $(<) : + "../../Demos/OpenGL" + "../../Extras/GIMPACTUtils" + ; + } + +ExtraDemo1 GimpactTestDemo : [ Wildcard *.h *.cpp ] ; diff --git a/BulletPhysics/bulletTrunk/Demos/GimpactTestDemo/TorusMesh.h b/BulletPhysics/bulletTrunk/Demos/GimpactTestDemo/TorusMesh.h new file mode 100644 index 00000000..69190413 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/GimpactTestDemo/TorusMesh.h @@ -0,0 +1,921 @@ +#ifndef TORUS_MESH_H_ +#define TORUS_MESH_H_ + + +//*************************** NOT REALLY FAMOUS TORUS ********************************************// + +#define Real btScalar +const int NUM_TRIANGLES =600; +const int NUM_VERTICES = 300; +const int NUM_INDICES = NUM_TRIANGLES * 3; + + +static Real gVertices[NUM_VERTICES * 3] = { + Real(2.5), Real(0), Real(0), + Real(2.405), Real(0.294), Real(0), + Real(2.155), Real(0.476), Real(0), + Real(1.845), Real(0.476), Real(0), + Real(1.595), Real(0.294), Real(0), + Real(1.5), Real(0 ), Real(0), + Real(1.595), Real(-0.294), Real(0), + Real(1.845), Real(-0.476), Real(0), + Real(2.155), Real(-0.476), Real(0), + Real(2.405), Real(-0.294), Real(0), + Real(2.445), Real(0 ), Real(0.52 ), + Real(2.352), Real(0.294), Real(0.5 ), + Real(2.107), Real(0.476), Real(0.448), + Real(1.805), Real(0.476), Real(0.384), + Real(1.561), Real(0.294), Real(0.332), + Real(1.467), Real(0 ), Real(0.312), + Real(1.561), Real(-0.294), Real(0.332), + Real(1.805), Real(-0.476), Real(0.384), + Real(2.107), Real(-0.476), Real(0.448), + Real(2.352), Real(-0.294), Real(0.5 ), + Real(2.284), Real(0), Real(1.017), + Real(2.197), Real(0.294), Real(0.978), + Real(1.968), Real(0.476), Real(0.876), + Real(1.686), Real(0.476), Real(0.751), + Real(1.458), Real(0.294), Real(0.649), + Real(1.37), Real(0), Real(0.61 ), + Real(1.458), Real(-0.294), Real(0.649), + Real(1.686), Real(-0.476), Real(0.751), + Real(1.968), Real(-0.476), Real(0.876), + Real(2.197), Real(-0.294), Real(0.978), + Real(2.023), Real(0), Real(1.469), + Real(1.945), Real(0.294), Real(1.413), + Real(1.743), Real(0.476), Real(1.266), + Real(1.493), Real(0.476), Real(1.085), + Real(1.291), Real(0.294), Real(0.938), + Real(1.214), Real(0), Real(0.882), + Real(1.291), Real(-0.294), Real(0.938), + Real(1.493), Real(-0.476), Real(1.085), + Real(1.743), Real(-0.476), Real(1.266), + Real(1.945), Real(-0.294), Real(1.413), + Real(1.673), Real(0), Real(1.858), + Real(1.609), Real(0.294), Real(1.787), + Real(1.442), Real(0.476), Real(1.601), + Real(1.235), Real(0.476), Real(1.371), + Real(1.068), Real(0.294), Real(1.186), + Real(1.004), Real(0), Real(1.115), + Real(1.068), Real(-0.294), Real(1.186), + Real(1.235), Real(-0.476), Real(1.371), + Real(1.442), Real(-0.476), Real(1.601), + Real(1.609), Real(-0.294), Real(1.787), + Real(1.25), Real(0), Real(2.165), + Real(1.202), Real(0.294), Real(2.082), + Real(1.077), Real(0.476), Real(1.866), + Real(0.923), Real(0.476), Real(1.598), + Real(0.798), Real(0.294), Real(1.382), + Real(0.75), Real(0), Real(1.299), + Real(0.798), Real(-0.294), Real(1.382), + Real(0.923), Real(-0.476), Real(1.598), + Real(1.077), Real(-0.476), Real(1.866), + Real(1.202), Real(-0.294), Real(2.082), + Real(0.773), Real(0), Real(2.378), + Real(0.743), Real(0.294), Real(2.287), + Real(0.666), Real(0.476), Real(2.049), + Real(0.57), Real(0.476), Real(1.755), + Real(0.493), Real(0.294), Real(1.517), + Real(0.464), Real(0), Real(1.427), + Real(0.493), Real(-0.294), Real(1.517), + Real(0.57), Real(-0.476), Real(1.755), + Real(0.666), Real(-0.476), Real(2.049), + Real(0.743), Real(-0.294), Real(2.287), + Real(0.261), Real(0), Real(2.486), + Real(0.251), Real(0.294), Real(2.391), + Real(0.225), Real(0.476), Real(2.143), + Real(0.193), Real(0.476), Real(1.835), + Real(0.167), Real(0.294), Real(1.587), + Real(0.157), Real(0), Real(1.492), + Real(0.167), Real(-0.294), Real(1.587), + Real(0.193), Real(-0.476), Real(1.835), + Real(0.225), Real(-0.476), Real(2.143), + Real(0.251), Real(-0.294), Real(2.391), + Real(-0.261), Real(0), Real(2.486), + Real(-0.251), Real(0.294), Real(2.391), + Real(-0.225), Real(0.476), Real(2.143), + Real(-0.193), Real(0.476), Real(1.835), + Real(-0.167), Real(0.294), Real(1.587), + Real(-0.157), Real(0), Real(1.492), + Real(-0.167), Real(-0.294), Real(1.587), + Real(-0.193), Real(-0.476), Real(1.835), + Real(-0.225), Real(-0.476), Real(2.143), + Real(-0.251), Real(-0.294), Real(2.391), + Real(-0.773), Real(0), Real(2.378), + Real(-0.743), Real(0.294), Real(2.287), + Real(-0.666), Real(0.476), Real(2.049), + Real(-0.57), Real(0.476), Real(1.755), + Real(-0.493), Real(0.294), Real(1.517), + Real(-0.464), Real(0), Real(1.427), + Real(-0.493), Real(-0.294), Real(1.517), + Real(-0.57), Real(-0.476), Real(1.755), + Real(-0.666), Real(-0.476), Real(2.049), + Real(-0.743), Real(-0.294), Real(2.287), + Real(-1.25 ), Real(0), Real(2.165), + Real(-1.202), Real(0.294), Real(2.082), + Real(-1.077), Real(0.476), Real(1.866), + Real(-0.923), Real(0.476), Real(1.598), + Real(-0.798), Real(0.294), Real(1.382), + Real(-0.75), Real(0), Real(1.299), + Real(-0.798), Real(-0.294), Real(1.382), + Real(-0.923), Real(-0.476), Real(1.598), + Real(-1.077), Real(-0.476), Real(1.866), + Real(-1.202), Real(-0.294), Real(2.082), + Real(-1.673), Real(0), Real(1.858), + Real(-1.609), Real(0.294), Real(1.787), + Real(-1.442), Real(0.476), Real(1.601), + Real(-1.235), Real(0.476), Real(1.371), + Real(-1.068), Real(0.294), Real(1.186), + Real(-1.004), Real(0), Real(1.115), + Real(-1.068), Real(-0.294), Real(1.186), + Real(-1.235), Real(-0.476), Real(1.371), + Real(-1.442), Real(-0.476), Real(1.601), + Real(-1.609), Real(-0.294), Real(1.787), + Real(-2.023), Real(0), Real(1.469), + Real(-1.945), Real(0.294), Real(1.413), + Real(-1.743), Real(0.476), Real(1.266), + Real(-1.493), Real(0.476), Real(1.085), + Real(-1.291), Real(0.294), Real(0.938), + Real(-1.214), Real(0), Real(0.882), + Real(-1.291), Real(-0.294), Real(0.938), + Real(-1.493), Real(-0.476), Real(1.085), + Real(-1.743), Real(-0.476), Real(1.266), + Real(-1.945), Real(-0.294), Real(1.413), + Real(-2.284), Real(0), Real(1.017), + Real(-2.197), Real(0.294), Real(0.978), + Real(-1.968), Real(0.476), Real(0.876), + Real(-1.686), Real(0.476), Real(0.751), + Real(-1.458), Real(0.294), Real(0.649), + Real(-1.37), Real(0), Real(0.61 ), + Real(-1.458), Real(-0.294), Real(0.649), + Real(-1.686), Real(-0.476), Real(0.751), + Real(-1.968), Real(-0.476), Real(0.876), + Real(-2.197), Real(-0.294), Real(0.978), + Real(-2.445), Real(0), Real(0.52), + Real(-2.352), Real(0.294), Real(0.5), + Real(-2.107), Real(0.476), Real(0.448), + Real(-1.805), Real(0.476), Real(0.384), + Real(-1.561), Real(0.294), Real(0.332), + Real(-1.467), Real(0), Real(0.312), + Real(-1.561), Real(-0.294), Real(0.332), + Real(-1.805), Real(-0.476), Real(0.384), + Real(-2.107), Real(-0.476), Real(0.448), + Real(-2.352), Real(-0.294), Real(0.5), + Real(-2.5 ), Real(0), Real(0), + Real(-2.405), Real(0.294), Real(0), + Real(-2.155), Real(0.476), Real(0), + Real(-1.845), Real(0.476), Real(0), + Real(-1.595), Real(0.294), Real(0), + Real(-1.5), Real(0), Real(0), + Real(-1.595), Real(-0.294), Real(0), + Real(-1.845), Real(-0.476), Real(0), + Real(-2.155), Real(-0.476), Real(0), + Real(-2.405), Real(-0.294), Real(0), + Real(-2.445), Real(0), Real(-0.52), + Real(-2.352), Real(0.294), Real(-0.5), + Real(-2.107), Real(0.476), Real(-0.448), + Real(-1.805), Real(0.476), Real(-0.384), + Real(-1.561), Real(0.294), Real(-0.332), + Real(-1.467), Real(0), Real(-0.312), + Real(-1.561), Real(-0.294), Real(-0.332), + Real(-1.805), Real(-0.476), Real(-0.384), + Real(-2.107), Real(-0.476), Real(-0.448), + Real(-2.352), Real(-0.294), Real(-0.5), + Real(-2.284), Real(0), Real(-1.017), + Real(-2.197), Real(0.294), Real(-0.978), + Real(-1.968), Real(0.476), Real(-0.876), + Real(-1.686), Real(0.476), Real(-0.751), + Real(-1.458), Real(0.294), Real(-0.649), + Real(-1.37), Real(0), Real(-0.61), + Real(-1.458), Real(-0.294), Real(-0.649), + Real(-1.686), Real(-0.476), Real(-0.751), + Real(-1.968), Real(-0.476), Real(-0.876), + Real(-2.197), Real(-0.294), Real(-0.978), + Real(-2.023), Real(0), Real(-1.469), + Real(-1.945), Real(0.294), Real(-1.413), + Real(-1.743), Real(0.476), Real(-1.266), + Real(-1.493), Real(0.476), Real(-1.085), + Real(-1.291), Real(0.294), Real(-0.938), + Real(-1.214), Real(0), Real(-0.882), + Real(-1.291), Real(-0.294), Real(-0.938), + Real(-1.493), Real(-0.476), Real(-1.085), + Real(-1.743), Real(-0.476), Real(-1.266), + Real(-1.945), Real(-0.294), Real(-1.413), + Real(-1.673), Real(0), Real(-1.858), + Real(-1.609), Real(0.294), Real(-1.787), + Real(-1.442), Real(0.476), Real(-1.601), + Real(-1.235), Real(0.476), Real(-1.371), + Real(-1.068), Real(0.294), Real(-1.186), + Real(-1.004), Real(0), Real(-1.115), + Real(-1.068), Real(-0.294), Real(-1.186), + Real(-1.235), Real(-0.476), Real(-1.371), + Real(-1.442), Real(-0.476), Real(-1.601), + Real(-1.609), Real(-0.294), Real(-1.787), + Real(-1.25 ), Real(0), Real(-2.165), + Real(-1.202), Real(0.294), Real(-2.082), + Real(-1.077), Real(0.476), Real(-1.866), + Real(-0.923), Real(0.476), Real(-1.598), + Real(-0.798), Real(0.294), Real(-1.382), + Real(-0.75), Real(0), Real(-1.299), + Real(-0.798), Real(-0.294), Real(-1.382), + Real(-0.923), Real(-0.476), Real(-1.598), + Real(-1.077), Real(-0.476), Real(-1.866), + Real(-1.202), Real(-0.294), Real(-2.082), + Real(-0.773), Real(0), Real(-2.378), + Real(-0.743), Real(0.294), Real(-2.287), + Real(-0.666), Real(0.476), Real(-2.049), + Real(-0.57), Real(0.476), Real(-1.755), + Real(-0.493), Real(0.294), Real(-1.517), + Real(-0.464), Real(0), Real(-1.427), + Real(-0.493), Real(-0.294), Real(-1.517), + Real(-0.57), Real(-0.476), Real(-1.755), + Real(-0.666), Real(-0.476), Real(-2.049), + Real(-0.743), Real(-0.294), Real(-2.287), + Real(-0.261), Real(0), Real(-2.486), + Real(-0.251), Real(0.294), Real(-2.391), + Real(-0.225), Real(0.476), Real(-2.143), + Real(-0.193), Real(0.476), Real(-1.835), + Real(-0.167), Real(0.294), Real(-1.587), + Real(-0.157), Real(0), Real(-1.492), + Real(-0.167), Real(-0.294), Real(-1.587), + Real(-0.193), Real(-0.476), Real(-1.835), + Real(-0.225), Real(-0.476), Real(-2.143), + Real(-0.251), Real(-0.294), Real(-2.391), + Real(0.261), Real(0), Real(-2.486), + Real(0.251), Real(0.294), Real(-2.391), + Real(0.225), Real(0.476), Real(-2.143), + Real(0.193), Real(0.476), Real(-1.835), + Real(0.167), Real(0.294), Real(-1.587), + Real(0.157), Real(0), Real(-1.492), + Real(0.167), Real(-0.294), Real(-1.587), + Real(0.193), Real(-0.476), Real(-1.835), + Real(0.225), Real(-0.476), Real(-2.143), + Real(0.251), Real(-0.294), Real(-2.391), + Real(0.773), Real(0), Real(-2.378), + Real(0.743), Real(0.294), Real(-2.287), + Real(0.666), Real(0.476), Real(-2.049), + Real(0.57), Real(0.476), Real(-1.755), + Real(0.493), Real(0.294), Real(-1.517), + Real(0.464), Real(0), Real(-1.427), + Real(0.493), Real(-0.294), Real(-1.517), + Real(0.57), Real(-0.476), Real(-1.755), + Real(0.666), Real(-0.476), Real(-2.049), + Real(0.743), Real(-0.294), Real(-2.287), + Real(1.25), Real(0), Real(-2.165), + Real(1.202), Real(0.294), Real(-2.082), + Real(1.077), Real(0.476), Real(-1.866), + Real(0.923), Real(0.476), Real(-1.598), + Real(0.798), Real(0.294), Real(-1.382), + Real(0.75), Real(0), Real(-1.299), + Real(0.798), Real(-0.294), Real(-1.382), + Real(0.923), Real(-0.476), Real(-1.598), + Real(1.077), Real(-0.476), Real(-1.866), + Real(1.202), Real(-0.294), Real(-2.082), + Real(1.673), Real(0), Real(-1.858), + Real(1.609), Real(0.294), Real(-1.787), + Real(1.442), Real(0.476), Real(-1.601), + Real(1.235), Real(0.476), Real(-1.371), + Real(1.068), Real(0.294), Real(-1.186), + Real(1.004), Real(0), Real(-1.115), + Real(1.068), Real(-0.294), Real(-1.186), + Real(1.235), Real(-0.476), Real(-1.371), + Real(1.442), Real(-0.476), Real(-1.601), + Real(1.609), Real(-0.294), Real(-1.787), + Real(2.023), Real(0), Real(-1.469), + Real(1.945), Real(0.294), Real(-1.413), + Real(1.743), Real(0.476), Real(-1.266), + Real(1.493), Real(0.476), Real(-1.085), + Real(1.291), Real(0.294), Real(-0.938), + Real(1.214), Real(0), Real(-0.882), + Real(1.291), Real(-0.294), Real(-0.938), + Real(1.493), Real(-0.476), Real(-1.085), + Real(1.743), Real(-0.476), Real(-1.266), + Real(1.945), Real(-0.294), Real(-1.413), + Real(2.284), Real(0), Real(-1.017), + Real(2.197), Real(0.294), Real(-0.978), + Real(1.968), Real(0.476), Real(-0.876), + Real(1.686), Real(0.476), Real(-0.751), + Real(1.458), Real(0.294), Real(-0.649), + Real(1.37), Real(0), Real(-0.61 ), + Real(1.458), Real(-0.294), Real(-0.649), + Real(1.686), Real(-0.476), Real(-0.751), + Real(1.968), Real(-0.476), Real(-0.876), + Real(2.197), Real(-0.294), Real(-0.978), + Real(2.445), Real(0), Real(-0.52 ), + Real(2.352), Real(0.294), Real(-0.5 ), + Real(2.107), Real(0.476), Real(-0.448), + Real(1.805), Real(0.476), Real(-0.384), + Real(1.561), Real(0.294), Real(-0.332), + Real(1.467), Real(0), Real(-0.312), + Real(1.561), Real(-0.294), Real(-0.332), + Real(1.805), Real(-0.476), Real(-0.384), + Real(2.107), Real(-0.476), Real(-0.448), + Real(2.352), Real(-0.294), Real(-0.5) +}; + + +static int gIndices[NUM_TRIANGLES][3] = { + {0, 1, 11}, + {1, 2, 12}, + {2, 3, 13}, + {3, 4, 14}, + {4, 5, 15}, + {5, 6, 16}, + {6, 7, 17}, + {7, 8, 18}, + {8, 9, 19}, + {9, 0, 10}, + {10, 11, 21}, + {11, 12, 22}, + {12, 13, 23}, + {13, 14, 24}, + {14, 15, 25}, + {15, 16, 26}, + {16, 17, 27}, + {17, 18, 28}, + {18, 19, 29}, + {19, 10, 20}, + {20, 21, 31}, + {21, 22, 32}, + {22, 23, 33}, + {23, 24, 34}, + {24, 25, 35}, + {25, 26, 36}, + {26, 27, 37}, + {27, 28, 38}, + {28, 29, 39}, + {29, 20, 30}, + {30, 31, 41}, + {31, 32, 42}, + {32, 33, 43}, + {33, 34, 44}, + {34, 35, 45}, + {35, 36, 46}, + {36, 37, 47}, + {37, 38, 48}, + {38, 39, 49}, + {39, 30, 40}, + {40, 41, 51}, + {41, 42, 52}, + {42, 43, 53}, + {43, 44, 54}, + {44, 45, 55}, + {45, 46, 56}, + {46, 47, 57}, + {47, 48, 58}, + {48, 49, 59}, + {49, 40, 50}, + {50, 51, 61}, + {51, 52, 62}, + {52, 53, 63}, + {53, 54, 64}, + {54, 55, 65}, + {55, 56, 66}, + {56, 57, 67}, + {57, 58, 68}, + {58, 59, 69}, + {59, 50, 60}, + {60, 61, 71}, + {61, 62, 72}, + {62, 63, 73}, + {63, 64, 74}, + {64, 65, 75}, + {65, 66, 76}, + {66, 67, 77}, + {67, 68, 78}, + {68, 69, 79}, + {69, 60, 70}, + {70, 71, 81}, + {71, 72, 82}, + {72, 73, 83}, + {73, 74, 84}, + {74, 75, 85}, + {75, 76, 86}, + {76, 77, 87}, + {77, 78, 88}, + {78, 79, 89}, + {79, 70, 80}, + {80, 81, 91}, + {81, 82, 92}, + {82, 83, 93}, + {83, 84, 94}, + {84, 85, 95}, + {85, 86, 96}, + {86, 87, 97}, + {87, 88, 98}, + {88, 89, 99}, + {89, 80, 90}, + {90, 91, 101}, + {91, 92, 102}, + {92, 93, 103}, + {93, 94, 104}, + {94, 95, 105}, + {95, 96, 106}, + {96, 97, 107}, + {97, 98, 108}, + {98, 99, 109}, + {99, 90, 100}, + {100, 101, 111}, + {101, 102, 112}, + {102, 103, 113}, + {103, 104, 114}, + {104, 105, 115}, + {105, 106, 116}, + {106, 107, 117}, + {107, 108, 118}, + {108, 109, 119}, + {109, 100, 110}, + {110, 111, 121}, + {111, 112, 122}, + {112, 113, 123}, + {113, 114, 124}, + {114, 115, 125}, + {115, 116, 126}, + {116, 117, 127}, + {117, 118, 128}, + {118, 119, 129}, + {119, 110, 120}, + {120, 121, 131}, + {121, 122, 132}, + {122, 123, 133}, + {123, 124, 134}, + {124, 125, 135}, + {125, 126, 136}, + {126, 127, 137}, + {127, 128, 138}, + {128, 129, 139}, + {129, 120, 130}, + {130, 131, 141}, + {131, 132, 142}, + {132, 133, 143}, + {133, 134, 144}, + {134, 135, 145}, + {135, 136, 146}, + {136, 137, 147}, + {137, 138, 148}, + {138, 139, 149}, + {139, 130, 140}, + {140, 141, 151}, + {141, 142, 152}, + {142, 143, 153}, + {143, 144, 154}, + {144, 145, 155}, + {145, 146, 156}, + {146, 147, 157}, + {147, 148, 158}, + {148, 149, 159}, + {149, 140, 150}, + {150, 151, 161}, + {151, 152, 162}, + {152, 153, 163}, + {153, 154, 164}, + {154, 155, 165}, + {155, 156, 166}, + {156, 157, 167}, + {157, 158, 168}, + {158, 159, 169}, + {159, 150, 160}, + {160, 161, 171}, + {161, 162, 172}, + {162, 163, 173}, + {163, 164, 174}, + {164, 165, 175}, + {165, 166, 176}, + {166, 167, 177}, + {167, 168, 178}, + {168, 169, 179}, + {169, 160, 170}, + {170, 171, 181}, + {171, 172, 182}, + {172, 173, 183}, + {173, 174, 184}, + {174, 175, 185}, + {175, 176, 186}, + {176, 177, 187}, + {177, 178, 188}, + {178, 179, 189}, + {179, 170, 180}, + {180, 181, 191}, + {181, 182, 192}, + {182, 183, 193}, + {183, 184, 194}, + {184, 185, 195}, + {185, 186, 196}, + {186, 187, 197}, + {187, 188, 198}, + {188, 189, 199}, + {189, 180, 190}, + {190, 191, 201}, + {191, 192, 202}, + {192, 193, 203}, + {193, 194, 204}, + {194, 195, 205}, + {195, 196, 206}, + {196, 197, 207}, + {197, 198, 208}, + {198, 199, 209}, + {199, 190, 200}, + {200, 201, 211}, + {201, 202, 212}, + {202, 203, 213}, + {203, 204, 214}, + {204, 205, 215}, + {205, 206, 216}, + {206, 207, 217}, + {207, 208, 218}, + {208, 209, 219}, + {209, 200, 210}, + {210, 211, 221}, + {211, 212, 222}, + {212, 213, 223}, + {213, 214, 224}, + {214, 215, 225}, + {215, 216, 226}, + {216, 217, 227}, + {217, 218, 228}, + {218, 219, 229}, + {219, 210, 220}, + {220, 221, 231}, + {221, 222, 232}, + {222, 223, 233}, + {223, 224, 234}, + {224, 225, 235}, + {225, 226, 236}, + {226, 227, 237}, + {227, 228, 238}, + {228, 229, 239}, + {229, 220, 230}, + {230, 231, 241}, + {231, 232, 242}, + {232, 233, 243}, + {233, 234, 244}, + {234, 235, 245}, + {235, 236, 246}, + {236, 237, 247}, + {237, 238, 248}, + {238, 239, 249}, + {239, 230, 240}, + {240, 241, 251}, + {241, 242, 252}, + {242, 243, 253}, + {243, 244, 254}, + {244, 245, 255}, + {245, 246, 256}, + {246, 247, 257}, + {247, 248, 258}, + {248, 249, 259}, + {249, 240, 250}, + {250, 251, 261}, + {251, 252, 262}, + {252, 253, 263}, + {253, 254, 264}, + {254, 255, 265}, + {255, 256, 266}, + {256, 257, 267}, + {257, 258, 268}, + {258, 259, 269}, + {259, 250, 260}, + {260, 261, 271}, + {261, 262, 272}, + {262, 263, 273}, + {263, 264, 274}, + {264, 265, 275}, + {265, 266, 276}, + {266, 267, 277}, + {267, 268, 278}, + {268, 269, 279}, + {269, 260, 270}, + {270, 271, 281}, + {271, 272, 282}, + {272, 273, 283}, + {273, 274, 284}, + {274, 275, 285}, + {275, 276, 286}, + {276, 277, 287}, + {277, 278, 288}, + {278, 279, 289}, + {279, 270, 280}, + {280, 281, 291}, + {281, 282, 292}, + {282, 283, 293}, + {283, 284, 294}, + {284, 285, 295}, + {285, 286, 296}, + {286, 287, 297}, + {287, 288, 298}, + {288, 289, 299}, + {289, 280, 290}, + {290, 291, 1}, + {291, 292, 2}, + {292, 293, 3}, + {293, 294, 4}, + {294, 295, 5}, + {295, 296, 6}, + {296, 297, 7}, + {297, 298, 8}, + {298, 299, 9}, + {299, 290, 0}, + {0, 11, 10}, + {1, 12, 11}, + {2, 13, 12}, + {3, 14, 13}, + {4, 15, 14}, + {5, 16, 15}, + {6, 17, 16}, + {7, 18, 17}, + {8, 19, 18}, + {9, 10, 19}, + {10, 21, 20}, + {11, 22, 21}, + {12, 23, 22}, + {13, 24, 23}, + {14, 25, 24}, + {15, 26, 25}, + {16, 27, 26}, + {17, 28, 27}, + {18, 29, 28}, + {19, 20, 29}, + {20, 31, 30}, + {21, 32, 31}, + {22, 33, 32}, + {23, 34, 33}, + {24, 35, 34}, + {25, 36, 35}, + {26, 37, 36}, + {27, 38, 37}, + {28, 39, 38}, + {29, 30, 39}, + {30, 41, 40}, + {31, 42, 41}, + {32, 43, 42}, + {33, 44, 43}, + {34, 45, 44}, + {35, 46, 45}, + {36, 47, 46}, + {37, 48, 47}, + {38, 49, 48}, + {39, 40, 49}, + {40, 51, 50}, + {41, 52, 51}, + {42, 53, 52}, + {43, 54, 53}, + {44, 55, 54}, + {45, 56, 55}, + {46, 57, 56}, + {47, 58, 57}, + {48, 59, 58}, + {49, 50, 59}, + {50, 61, 60}, + {51, 62, 61}, + {52, 63, 62}, + {53, 64, 63}, + {54, 65, 64}, + {55, 66, 65}, + {56, 67, 66}, + {57, 68, 67}, + {58, 69, 68}, + {59, 60, 69}, + {60, 71, 70}, + {61, 72, 71}, + {62, 73, 72}, + {63, 74, 73}, + {64, 75, 74}, + {65, 76, 75}, + {66, 77, 76}, + {67, 78, 77}, + {68, 79, 78}, + {69, 70, 79}, + {70, 81, 80}, + {71, 82, 81}, + {72, 83, 82}, + {73, 84, 83}, + {74, 85, 84}, + {75, 86, 85}, + {76, 87, 86}, + {77, 88, 87}, + {78, 89, 88}, + {79, 80, 89}, + {80, 91, 90}, + {81, 92, 91}, + {82, 93, 92}, + {83, 94, 93}, + {84, 95, 94}, + {85, 96, 95}, + {86, 97, 96}, + {87, 98, 97}, + {88, 99, 98}, + {89, 90, 99}, + {90, 101, 100}, + {91, 102, 101}, + {92, 103, 102}, + {93, 104, 103}, + {94, 105, 104}, + {95, 106, 105}, + {96, 107, 106}, + {97, 108, 107}, + {98, 109, 108}, + {99, 100, 109}, + {100, 111, 110}, + {101, 112, 111}, + {102, 113, 112}, + {103, 114, 113}, + {104, 115, 114}, + {105, 116, 115}, + {106, 117, 116}, + {107, 118, 117}, + {108, 119, 118}, + {109, 110, 119}, + {110, 121, 120}, + {111, 122, 121}, + {112, 123, 122}, + {113, 124, 123}, + {114, 125, 124}, + {115, 126, 125}, + {116, 127, 126}, + {117, 128, 127}, + {118, 129, 128}, + {119, 120, 129}, + {120, 131, 130}, + {121, 132, 131}, + {122, 133, 132}, + {123, 134, 133}, + {124, 135, 134}, + {125, 136, 135}, + {126, 137, 136}, + {127, 138, 137}, + {128, 139, 138}, + {129, 130, 139}, + {130, 141, 140}, + {131, 142, 141}, + {132, 143, 142}, + {133, 144, 143}, + {134, 145, 144}, + {135, 146, 145}, + {136, 147, 146}, + {137, 148, 147}, + {138, 149, 148}, + {139, 140, 149}, + {140, 151, 150}, + {141, 152, 151}, + {142, 153, 152}, + {143, 154, 153}, + {144, 155, 154}, + {145, 156, 155}, + {146, 157, 156}, + {147, 158, 157}, + {148, 159, 158}, + {149, 150, 159}, + {150, 161, 160}, + {151, 162, 161}, + {152, 163, 162}, + {153, 164, 163}, + {154, 165, 164}, + {155, 166, 165}, + {156, 167, 166}, + {157, 168, 167}, + {158, 169, 168}, + {159, 160, 169}, + {160, 171, 170}, + {161, 172, 171}, + {162, 173, 172}, + {163, 174, 173}, + {164, 175, 174}, + {165, 176, 175}, + {166, 177, 176}, + {167, 178, 177}, + {168, 179, 178}, + {169, 170, 179}, + {170, 181, 180}, + {171, 182, 181}, + {172, 183, 182}, + {173, 184, 183}, + {174, 185, 184}, + {175, 186, 185}, + {176, 187, 186}, + {177, 188, 187}, + {178, 189, 188}, + {179, 180, 189}, + {180, 191, 190}, + {181, 192, 191}, + {182, 193, 192}, + {183, 194, 193}, + {184, 195, 194}, + {185, 196, 195}, + {186, 197, 196}, + {187, 198, 197}, + {188, 199, 198}, + {189, 190, 199}, + {190, 201, 200}, + {191, 202, 201}, + {192, 203, 202}, + {193, 204, 203}, + {194, 205, 204}, + {195, 206, 205}, + {196, 207, 206}, + {197, 208, 207}, + {198, 209, 208}, + {199, 200, 209}, + {200, 211, 210}, + {201, 212, 211}, + {202, 213, 212}, + {203, 214, 213}, + {204, 215, 214}, + {205, 216, 215}, + {206, 217, 216}, + {207, 218, 217}, + {208, 219, 218}, + {209, 210, 219}, + {210, 221, 220}, + {211, 222, 221}, + {212, 223, 222}, + {213, 224, 223}, + {214, 225, 224}, + {215, 226, 225}, + {216, 227, 226}, + {217, 228, 227}, + {218, 229, 228}, + {219, 220, 229}, + {220, 231, 230}, + {221, 232, 231}, + {222, 233, 232}, + {223, 234, 233}, + {224, 235, 234}, + {225, 236, 235}, + {226, 237, 236}, + {227, 238, 237}, + {228, 239, 238}, + {229, 230, 239}, + {230, 241, 240}, + {231, 242, 241}, + {232, 243, 242}, + {233, 244, 243}, + {234, 245, 244}, + {235, 246, 245}, + {236, 247, 246}, + {237, 248, 247}, + {238, 249, 248}, + {239, 240, 249}, + {240, 251, 250}, + {241, 252, 251}, + {242, 253, 252}, + {243, 254, 253}, + {244, 255, 254}, + {245, 256, 255}, + {246, 257, 256}, + {247, 258, 257}, + {248, 259, 258}, + {249, 250, 259}, + {250, 261, 260}, + {251, 262, 261}, + {252, 263, 262}, + {253, 264, 263}, + {254, 265, 264}, + {255, 266, 265}, + {256, 267, 266}, + {257, 268, 267}, + {258, 269, 268}, + {259, 260, 269}, + {260, 271, 270}, + {261, 272, 271}, + {262, 273, 272}, + {263, 274, 273}, + {264, 275, 274}, + {265, 276, 275}, + {266, 277, 276}, + {267, 278, 277}, + {268, 279, 278}, + {269, 270, 279}, + {270, 281, 280}, + {271, 282, 281}, + {272, 283, 282}, + {273, 284, 283}, + {274, 285, 284}, + {275, 286, 285}, + {276, 287, 286}, + {277, 288, 287}, + {278, 289, 288}, + {279, 280, 289}, + {280, 291, 290}, + {281, 292, 291}, + {282, 293, 292}, + {283, 294, 293}, + {284, 295, 294}, + {285, 296, 295}, + {286, 297, 296}, + {287, 298, 297}, + {288, 299, 298}, + {289, 290, 299}, + {290, 1, 0}, + {291, 2, 1}, + {292, 3, 2}, + {293, 4, 3}, + {294, 5, 4}, + {295, 6, 5}, + {296, 7, 6}, + {297, 8, 7}, + {298, 9, 8}, + {299, 0, 9}, +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Demos/GimpactTestDemo/main.cpp b/BulletPhysics/bulletTrunk/Demos/GimpactTestDemo/main.cpp new file mode 100644 index 00000000..2deb7261 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/GimpactTestDemo/main.cpp @@ -0,0 +1,13 @@ + +#include "GimpactTestDemo.h" +#include "GlutStuff.h" + +//################################## main ##################################### +int main(int argc,char** argv) +{ + + GimpactConcaveDemo* concaveDemo = new GimpactConcaveDemo(); /// This will not be Deleted!!! + concaveDemo->initPhysics(); + + return glutmain(argc, argv,640,480,"DevO,s GIMPACT Test Demo",concaveDemo); +} diff --git a/BulletPhysics/bulletTrunk/Demos/GjkConvexCastDemo/Jamfile b/BulletPhysics/bulletTrunk/Demos/GjkConvexCastDemo/Jamfile new file mode 100644 index 00000000..3f5f09a9 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/GjkConvexCastDemo/Jamfile @@ -0,0 +1,3 @@ +SubDir TOP Demos GjkConvexCastDemo ; + +BulletDemo GjkConvexCastDemo : [ Wildcard *.h *.cpp ] ; diff --git a/BulletPhysics/bulletTrunk/Demos/GjkConvexCastDemo/LinearConvexCastDemo.cpp b/BulletPhysics/bulletTrunk/Demos/GjkConvexCastDemo/LinearConvexCastDemo.cpp new file mode 100644 index 00000000..a1733d08 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/GjkConvexCastDemo/LinearConvexCastDemo.cpp @@ -0,0 +1,185 @@ +/* + * Copyright (c) 2005 Erwin Coumans http://continuousphysics.com/Bullet/ + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies. + * Erwin Coumans makes no representations about the suitability + * of this software for any purpose. + * It is provided "as is" without express or implied warranty. + */ + + + +/* + LinearConvexCastDemo implements an efficient continuous collision detection algorithm. + Both linear and angular velocities are supported. Gjk or Simplex based methods. + Motion using Exponential Map. + Comparison with Screwing Motion. + Also comparision with Algebraic CCD and Interval Arithmetic methods (Stephane Redon) +*/ + + +///Low level demo, doesn't include btBulletCollisionCommon.h +#include "LinearMath/btQuaternion.h" +#include "LinearMath/btTransform.h" + +#include "BulletCollision/CollisionShapes/btBoxShape.h" +#include "BulletCollision/CollisionShapes/btConvexHullShape.h" +#include "BulletCollision/CollisionShapes/btMinkowskiSumShape.h" + +#include "BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.h" +#include "BulletCollision/NarrowPhaseCollision/btGjkPairDetector.h" +#include "BulletCollision/NarrowPhaseCollision/btGjkConvexCast.h" +#include "BulletCollision/NarrowPhaseCollision/btContinuousConvexCollision.h" +#include "BulletCollision/NarrowPhaseCollision/btSubSimplexConvexCast.h" + + + +#include "BulletCollision/CollisionShapes/btSphereShape.h" +#include "BulletCollision/CollisionShapes/btTetrahedronShape.h" + +#include "BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.h" +#include "BulletCollision/NarrowPhaseCollision/btConvexPenetrationDepthSolver.h" + + + +#include "GL_ShapeDrawer.h" +#include "LinearConvexCastDemo.h" +#include "GlutStuff.h" + +static btVoronoiSimplexSolver sVoronoiSimplexSolver; +btSimplexSolverInterface& gGjkSimplexSolver = sVoronoiSimplexSolver; + +static float yaw=0.f,pitch=0.f,roll=0.f; +static const int maxNumObjects = 4; +static const int numObjects = 2; + +static btPolyhedralConvexShape* shapePtr[maxNumObjects]; + +static btTransform tr[numObjects]; + + + +void LinearConvexCastDemo::initPhysics() +{ + + setCameraDistance(10.f); + + tr[0].setIdentity(); + tr[0].setOrigin( btVector3( 0.0f, 5.5f, 0.0f ) ); + + tr[1].setIdentity(); + tr[1].setOrigin( btVector3( 0.0f, 0.0f, 0.0f ) ); + + // Pyramide + float r = 1.0f; + float h = 2.0f; + + btConvexHullShape* shapeA = new btConvexHullShape; + shapeA->addPoint( btVector3( 0.0f, 0.75f * h, 0.0f ) ); + shapeA->addPoint( btVector3( -r, -0.25f * h, r ) ); + shapeA->addPoint( btVector3( r, -0.25f * h, r ) ); + shapeA->addPoint( btVector3( r, -0.25f * h, -r ) ); + shapeA->addPoint( btVector3( -r, -0.25f * h, -r ) ); + + + + // Triangle + btConvexHullShape* shapeB = new btConvexHullShape; + shapeB->addPoint( btVector3( 0.0f, 1.0f, 0.0f ) ); + shapeB->addPoint( btVector3( 1.0f, -1.0f, 0.0f ) ); + shapeB->addPoint( btVector3( -1.0f, -1.0f, 0.0f ) ); + + shapePtr[0] = shapeA; + shapePtr[1] = shapeB; + + shapePtr[0]->setMargin( 0.01f ); + shapePtr[1]->setMargin( 0.01f ); +} + +//to be implemented by the demo +void LinearConvexCastDemo::clientMoveAndDisplay() +{ + displayCallback(); +} + +LinearConvexCastDemo::~LinearConvexCastDemo() +{ + delete shapePtr[0]; + delete shapePtr[1]; +} + +void LinearConvexCastDemo::displayCallback(void) +{ + updateCamera(); + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glDisable(GL_LIGHTING); + + GL_ShapeDrawer::drawCoordSystem(); + + + + static btScalar angle = 0.f; + angle+=getDeltaTimeMicroseconds()/1000000.0; + + tr[1].setRotation(btQuaternion(btVector3(1,0,0),angle)); + + btTransform toA, toB; + toA = tr[0]; + toA.setOrigin( btVector3( 0.0f, 0.f, 0.0f ) ); + toB = tr[1]; + toB.setOrigin( btVector3( 0.0f, 0.0f, 0.0f ) ); + + + gGjkSimplexSolver.reset(); + + + btVector3 worldBoundsMin(-1000,-1000,-1000); + btVector3 worldBoundsMax(1000,1000,1000); + + + //btGjkConvexCast convexCaster(shapePtr[ 0 ], shapePtr[ 1 ], &gGjkSimplexSolver ); + btSubsimplexConvexCast convexCaster( shapePtr[ 0 ], shapePtr[ 1 ], &gGjkSimplexSolver ); + + btConvexCast::CastResult result; + + result.m_hitPoint.setValue(0,0,0); + + convexCaster.calcTimeOfImpact( tr[ 0 ], toA, tr[ 1 ], toB, result ); + + btScalar m1[16], m2[16],m3[16]; + tr[ 0 ].getOpenGLMatrix( m1 ); + tr[ 1 ].getOpenGLMatrix( m2 ); + + btSphereShape sphere(0.2); + + btTransform tmp = tr[0]; + tmp.setOrigin(result.m_hitPoint); + tmp.getOpenGLMatrix(m3); + m_shapeDrawer->drawOpenGL( m3, &sphere, btVector3( 1, 0, 1 ), getDebugMode() ,worldBoundsMin,worldBoundsMax); + + + m_shapeDrawer->drawOpenGL( m1, shapePtr[ 0 ], btVector3( 1, 0, 0 ), getDebugMode() ,worldBoundsMin,worldBoundsMax); + m_shapeDrawer->drawOpenGL( m2, shapePtr[ 1 ], btVector3( 1, 0, 0 ), getDebugMode() ,worldBoundsMin,worldBoundsMax); + + btVector3 originA, originB; + originA.setInterpolate3( tr[ 0 ].getOrigin(), toA.getOrigin(), result.m_fraction ); + originB.setInterpolate3( tr[ 1 ].getOrigin(), toB.getOrigin(), result.m_fraction ); + + btTransform A = tr[ 0 ]; + A.setOrigin( originA ); + + btTransform B = tr[ 1 ]; + B.setOrigin( originB ); + + A.getOpenGLMatrix( m1 ); + B.getOpenGLMatrix( m2 ); + + m_shapeDrawer->drawOpenGL( m1, shapePtr[ 0 ], btVector3( 1, 1, 0 ), getDebugMode() ,worldBoundsMin,worldBoundsMax); + m_shapeDrawer->drawOpenGL( m2, shapePtr[ 1 ], btVector3( 1, 1, 0 ), getDebugMode() ,worldBoundsMin,worldBoundsMax); + + glFlush(); + glutSwapBuffers(); +} diff --git a/BulletPhysics/bulletTrunk/Demos/GjkConvexCastDemo/LinearConvexCastDemo.h b/BulletPhysics/bulletTrunk/Demos/GjkConvexCastDemo/LinearConvexCastDemo.h new file mode 100644 index 00000000..3402e30a --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/GjkConvexCastDemo/LinearConvexCastDemo.h @@ -0,0 +1,44 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ +#ifndef LINEAR_CONVEX_CAST_DEMO_H +#define LINEAR_CONVEX_CAST_DEMO_H + +#include "DemoApplication.h" + +///LinearConvexCastDemo shows the working of the object sweep / pure-linear continuous collision detection query +class LinearConvexCastDemo : public DemoApplication +{ + public: + + virtual ~LinearConvexCastDemo(); + + void initPhysics(); + + virtual void clientMoveAndDisplay(); + + virtual void displayCallback(); + + static DemoApplication* Create() + { + LinearConvexCastDemo* demo = new LinearConvexCastDemo(); + demo->myinit(); + demo->initPhysics(); + return demo; + } + +}; + +#endif //LINEAR_CONVEX_CAST_DEMO_H + diff --git a/BulletPhysics/bulletTrunk/Demos/GjkConvexCastDemo/main.cpp b/BulletPhysics/bulletTrunk/Demos/GjkConvexCastDemo/main.cpp new file mode 100644 index 00000000..3c2748a7 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/GjkConvexCastDemo/main.cpp @@ -0,0 +1,17 @@ + +#include "LinearConvexCastDemo.h" +#include "GlutStuff.h" + +int screenWidth = 640; +int screenHeight = 480; + +int main(int argc,char** argv) +{ + + LinearConvexCastDemo* linearCastDemo = new LinearConvexCastDemo(); + + linearCastDemo->initPhysics(); + + + return glutmain(argc, argv,screenWidth,screenHeight,"Linear Convex Cast Demo",linearCastDemo); +} diff --git a/BulletPhysics/bulletTrunk/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluid.cpp b/BulletPhysics/bulletTrunk/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluid.cpp new file mode 100644 index 00000000..cf5c58eb --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluid.cpp @@ -0,0 +1,1044 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. + +Experimental Buoyancy fluid demo written by John McCutchan +*/ + +#include +#include "btHfFluid.h" +#include "btHfFluidCollisionShape.h" +#include "btHfFluidBuoyantConvexShape.h" +#include "BulletCollision/NarrowPhaseCollision/btPersistentManifold.h" +#include "BulletCollision/CollisionDispatch/btConvexConcaveCollisionAlgorithm.h" +#include "BulletCollision/CollisionDispatch/btCollisionWorld.h" +#include "BulletCollision/CollisionDispatch/btManifoldResult.h" +#include "BulletCollision/CollisionShapes/btTriangleShape.h" +#include "BulletDynamics/Dynamics/btRigidBody.h" +#include "../../OpenGL/GLDebugDrawer.h" + +btHfFluid::btHfFluid (btScalar gridCellWidth, int numNodesWidth, int numNodesLength) +{ + m_eta = NULL; + m_temp = NULL; + m_ground = NULL; + m_height[0] = NULL; + m_height[1] = NULL; + m_u[0] = NULL; + m_u[1] = NULL; + m_v[0] = NULL; + m_v[1] = NULL; + m_r[0] = NULL; + m_r[1] = NULL; + m_flags = NULL; + m_fillRatio = NULL; + m_internalType = CO_HF_FLUID; + m_heightIndex = 0; + m_velocityIndex = 0; + m_rIndex = 0; + setGridDimensions (gridCellWidth, numNodesWidth, numNodesLength); + + btScalar maxHeight = 20.0; + m_aabbMin = btVector3 (0.0, 0.0, 0.0); + m_aabbMax = btVector3 (m_gridWidth, maxHeight, m_gridLength); + + setCollisionShape (new btHfFluidCollisionShape (this)); + + m_globalVelocityU = btScalar(0.0f); + m_globalVelocityV = btScalar(0.0f); + m_gravity = btScalar(-10.0f); + + m_volumeDisplacementScale = btScalar(0.5f); + m_horizontalVelocityScale = btScalar(0.5f); + + m_epsEta = btScalar(0.01f); + m_epsHeight = btScalar(0.001f); +} + +btHfFluid::~btHfFluid () +{ + btCollisionShape* collisionShape = getCollisionShape (); + delete collisionShape; + btAlignedFree (m_temp); + btAlignedFree (m_height[0]); + btAlignedFree (m_height[1]); + btAlignedFree (m_ground); + btAlignedFree (m_eta); + btAlignedFree (m_u[0]); + btAlignedFree (m_u[1]); + btAlignedFree (m_v[0]); + btAlignedFree (m_v[1]); + btAlignedFree (m_flags); + btAlignedFree (m_fillRatio); +} + +void btHfFluid::predictMotion(btScalar dt) +{ + transferDisplaced (dt); + + advectEta (dt); + advectVelocityU (dt); + advectVelocityV (dt); + updateHeight (dt); + computeFlagsAndFillRatio (); + updateVelocity (dt); + setReflectBoundaryLeft (); + setReflectBoundaryRight (); + setReflectBoundaryTop (); + setReflectBoundaryBottom (); + debugTests(); + //m_heightIndex = (m_heightIndex + 1) % 2; + //m_velocityIndex = (m_velocityIndex + 1) % 2; +} + +void btHfFluid::prep () +{ + for (int i = 0; i < m_numNodesLength*m_numNodesWidth;i++) + { + m_height[0][i] = m_eta[i] + m_ground[i]; + m_height[1][i] = m_eta[i] + m_ground[i]; + } + computeFlagsAndFillRatio (); +} + +btScalar btHfFluid::widthPos (int i) const +{ + return m_gridCellWidth * i; +} + +btScalar btHfFluid::lengthPos (int j) const +{ +return m_gridCellWidth * j; +} + +int btHfFluid::arrayIndex (int i, int j) const +{ + btAssert (i >= 0); + btAssert (i < m_numNodesWidth); + btAssert (j >= 0); + btAssert (j < m_numNodesLength); + int index = i + (j * m_numNodesWidth); + return index; +} + +int btHfFluid::arrayIndex (btScalar i, btScalar j) const +{ + int ii = (int)i; // truncate / floor + int ij = (int)j; // truncate / floor + + return arrayIndex (ii, ij); +} + +const btScalar* btHfFluid::getHeightArray () const +{ + return m_height[m_heightIndex]; +} + +const btScalar* btHfFluid::getGroundArray () const +{ + return m_ground; +} +const btScalar* btHfFluid::getEtaArray () const +{ + return m_eta; +} +const btScalar* btHfFluid::getVelocityUArray () const +{ + return m_u[m_velocityIndex]; +} +const btScalar* btHfFluid::getVelocityVArray () const +{ + return m_v[m_velocityIndex]; +} + +const bool* btHfFluid::getFlagsArray () const +{ + return m_flags; +} + + btScalar* btHfFluid::getHeightArray () +{ + return m_height[m_heightIndex]; +} + btScalar* btHfFluid::getGroundArray () +{ + return m_ground; +} + btScalar* btHfFluid::getEtaArray () +{ + return m_eta; +} + btScalar* btHfFluid::getVelocityUArray () +{ + return m_u[m_velocityIndex]; +} + btScalar* btHfFluid::getVelocityVArray () +{ + return m_v[m_velocityIndex]; +} + +bool* btHfFluid::getFlagsArray () +{ + return m_flags; +} + +void btHfFluid::setFluidHeight (int x, int y, btScalar height) +{ + int index = arrayIndex (x,y); + setFluidHeight (index, height); +} + +void btHfFluid::setFluidHeight (int index, btScalar height) +{ + m_eta[index] = height; + m_height[m_heightIndex][index] = m_ground[index] + m_eta[index]; + m_flags[index] = true; +} + +void btHfFluid::addFluidHeight (int x, int y, btScalar height) +{ + int index = arrayIndex (x,y); + m_eta[index] += height; + m_height[m_heightIndex][index] = m_ground[index] + m_eta[index]; + m_flags[index] = true; +} + +void btHfFluid::getAabbForColumn (int i, int j, btVector3& aabbMin, btVector3& aabbMax) +{ + btVector3 com = getWorldTransform().getOrigin(); + int sw = arrayIndex (i, j); + int se = arrayIndex (i+1, j); + int nw = arrayIndex (i, j+1); + int ne = arrayIndex (i+1, j+1); + + btScalar h = m_height[m_heightIndex][sw]; + btScalar g = m_ground[sw]; + + aabbMin = btVector3(widthPos (i), g, lengthPos (j)); + aabbMax = btVector3(widthPos (i+1), h, lengthPos (j+1)); + aabbMin += com; + aabbMax += com; +} + +void btHfFluid::foreachGroundTriangle(btTriangleCallback* callback,const btVector3& aabbMin,const btVector3& aabbMax) +{ + btVector3 verts[3]; + + btScalar minX, minZ, maxX, maxZ; + int startNodeX, startNodeZ, endNodeX, endNodeZ; + + minX = aabbMin.getX(); + minZ = aabbMin.getZ(); + maxX = aabbMax.getX(); + maxZ = aabbMax.getZ(); + + startNodeX = (int)(minX * m_gridCellWidthInv); + startNodeZ = (int)(minZ * m_gridCellWidthInv); + + endNodeX = (int)(maxX * m_gridCellWidthInv); + endNodeZ = (int)(maxZ * m_gridCellWidthInv); + + endNodeX++; + endNodeZ++; + + startNodeX = btMax (1, startNodeX); + startNodeZ = btMax (1, startNodeZ); + endNodeX = btMin (m_numNodesWidth-1, endNodeX); + endNodeZ = btMin (m_numNodesLength-1, endNodeZ); + +#ifdef __BRUTE__ + for (int i = 1; i < m_numNodesWidth-1; i++) + { + for (int j = 1; j < m_numNodesLength-1; j++) + { + // triangle 1 + verts[0] = btVector3(widthPos(i), m_ground[arrayIndex(i,j)], lengthPos(j)); + verts[1] = btVector3(widthPos(i), m_ground[arrayIndex(i,j+1)], lengthPos(j+1)); + verts[2] = btVector3(widthPos(i+1), m_ground[arrayIndex(i+1,j)], lengthPos(j)); + callback->processTriangle(verts,i,j); + // triangle 2 + verts[0] = btVector3(widthPos(i+1), m_ground[arrayIndex(i+1,j)], lengthPos(j)); + verts[1] = btVector3(widthPos(i), m_ground[arrayIndex(i,j+1)], lengthPos(j+1)); + verts[2] = btVector3(widthPos(i+1), m_ground[arrayIndex(i+1,j+1)], lengthPos(j+1)); + callback->processTriangle(verts,i,j); + } + } +#else + + for (int i = startNodeX; i < endNodeX; i++) + { + for (int j = startNodeZ; j < endNodeZ; j++) + { + // triangle 1 + verts[0] = btVector3(widthPos(i), m_ground[arrayIndex(i,j)], lengthPos(j)); + verts[1] = btVector3(widthPos(i), m_ground[arrayIndex(i,j+1)], lengthPos(j+1)); + verts[2] = btVector3(widthPos(i+1), m_ground[arrayIndex(i+1,j)], lengthPos(j)); + callback->processTriangle(verts,i,j); + // triangle 2 + verts[0] = btVector3(widthPos(i+1), m_ground[arrayIndex(i+1,j)], lengthPos(j)); + verts[1] = btVector3(widthPos(i), m_ground[arrayIndex(i,j+1)], lengthPos(j+1)); + verts[2] = btVector3(widthPos(i+1), m_ground[arrayIndex(i+1,j+1)], lengthPos(j+1)); + callback->processTriangle(verts,i,j); + } + } +#endif +} + +void btHfFluid::foreachFluidColumn (btHfFluidColumnCallback* callback, const btVector3& aabbMin, const btVector3& aabbMax) +{ + btScalar minX, minZ, maxX, maxZ; + int startNodeX, startNodeZ, endNodeX, endNodeZ; + + minX = aabbMin.getX(); + minZ = aabbMin.getZ(); + maxX = aabbMax.getX(); + maxZ = aabbMax.getZ(); + + startNodeX = (int)(minX * m_gridCellWidthInv); + startNodeZ = (int)(minZ * m_gridCellWidthInv); + + endNodeX = (int)(maxX * m_gridCellWidthInv); + endNodeZ = (int)(maxZ * m_gridCellWidthInv); + + endNodeX++; + endNodeZ++; + + startNodeX = btMax (1, startNodeX); + startNodeZ = btMax (1, startNodeZ); + endNodeX = btMin (m_numNodesWidth-2, endNodeX); + endNodeZ = btMin (m_numNodesLength-2, endNodeZ); + + bool r; + for (int i = startNodeX; i < endNodeX; i++) + { + for (int j = startNodeZ; j < endNodeZ; j++) + { + if (m_flags[arrayIndex (i, j)] == false) + continue; + + r = callback->processColumn (this, i, j); + if (!r) + return; + } + } +} + +void btHfFluid::foreachSurfaceTriangle (btTriangleCallback* callback, const btVector3& aabbMin, const btVector3& aabbMax) +{ + btVector3 verts[3]; + + btScalar minX, minZ, maxX, maxZ; + int startNodeX, startNodeZ, endNodeX, endNodeZ; + + minX = aabbMin.getX(); + minZ = aabbMin.getZ(); + maxX = aabbMax.getX(); + maxZ = aabbMax.getZ(); + + startNodeX = (int)(minX * m_gridCellWidthInv); + startNodeZ = (int)(minZ * m_gridCellWidthInv); + + endNodeX = (int)(maxX * m_gridCellWidthInv); + endNodeZ = (int)(maxZ * m_gridCellWidthInv); + + endNodeX++; + endNodeZ++; + + startNodeX = btMax (1, startNodeX); + startNodeZ = btMax (1, startNodeZ); + endNodeX = m_numNodesWidth-1; + endNodeZ = m_numNodesLength-1; + + for (int i = startNodeX; i < endNodeX; i++) + { + for (int j = startNodeZ; j < endNodeZ; j++) + { + if (!m_flags[arrayIndex(i,j)]) + continue; + // triangle 1 + verts[0] = btVector3(widthPos(i), m_height[m_heightIndex][arrayIndex(i,j)], lengthPos(j)); + verts[1] = btVector3(widthPos(i), m_height[m_heightIndex][arrayIndex(i,j+1)], lengthPos(j+1)); + verts[2] = btVector3(widthPos(i+1), m_height[m_heightIndex][arrayIndex(i+1,j)], lengthPos(j)); + callback->processTriangle(verts,i,j); + // triangle 2 + verts[0] = btVector3(widthPos(i+1), m_height[m_heightIndex][arrayIndex(i+1,j)], lengthPos(j)); + verts[1] = btVector3(widthPos(i), m_height[m_heightIndex][arrayIndex(i,j+1)], lengthPos(j+1)); + verts[2] = btVector3(widthPos(i+1), m_height[m_heightIndex][arrayIndex(i+1,j+1)], lengthPos(j+1)); + callback->processTriangle(verts,i,j); + } + } +} + +void btHfFluid::setGridDimensions (btScalar gridCellWidth, + int numNodesWidth, int numNodesLength) +{ + m_gridWidth = gridCellWidth * numNodesWidth; + m_gridLength = gridCellWidth * numNodesLength; + m_gridCellWidth = gridCellWidth; + m_numNodesWidth = numNodesWidth; + m_numNodesLength = numNodesLength; + m_gridCellWidthInv = btScalar(1.0) / gridCellWidth; + + allocateArrays (); +} + +btScalar btHfFluid::bilinearInterpolate (const btScalar* array, btScalar iPos, btScalar jPos) +{ + int i = (int)iPos; + int j = (int)jPos; + + btScalar iParam1 = iPos - btScalar(i); + btScalar iParam0 = btScalar(1.0) - iParam1; + + btScalar jParam1 = jPos - btScalar(j); + btScalar jParam0 = btScalar(1.0) - jParam1; + + btScalar SW = array[arrayIndex(i, j)]; + btScalar SE = array[arrayIndex(i+1, j)]; + btScalar NW = array[arrayIndex(i, j+1)]; + btScalar NE = array[arrayIndex(i+1, j+1)]; + + btScalar a = jParam0 * SW + jParam1 * NW; + btScalar b = jParam0 * SE + jParam1 * NE; + return iParam0 * a + iParam1 * b; +} + +btScalar btHfFluid::advect (const btScalar* array, btScalar i, btScalar j, btScalar di, btScalar dj,btScalar dt) +{ + // trace particle backwards in time + btScalar srcI = i - di * dt * m_gridCellWidthInv; + btScalar srcJ = j - dj * dt * m_gridCellWidthInv; + + // srcI and srcJ are indices into the array, + // we need to clamp them to within the domain + srcI = btMax (srcI, btScalar(0.0)); + srcI = btMin (srcI, btScalar(m_numNodesWidth-1)); + srcJ = btMax (srcJ, btScalar(0.0)); + srcJ = btMin (srcJ, btScalar(m_numNodesLength-1)); + + return bilinearInterpolate (array, srcI, srcJ); +} + +void btHfFluid::advectEta (btScalar dt) +{ + for (int i = 1; i < m_numNodesWidth-1; i++) + { + for (int j = 1; j < m_numNodesLength-1; j++) + { + int index = arrayIndex (i, j); + + if (!m_flags[index]) + continue; + + btScalar u = m_globalVelocityU; + btScalar v = m_globalVelocityV; + + u += (m_u[m_velocityIndex][index]+m_u[m_velocityIndex][index+1]) * btScalar(0.5); + v += (m_v[m_velocityIndex][index]+m_v[m_velocityIndex][index+m_numNodesWidth]) * btScalar(0.5); + + m_temp[index] = advect (m_eta, btScalar(i), btScalar(j), u, v, dt); + } + } + for (int i = 1; i < m_numNodesWidth-1; i++) + { + for (int j = 1; j < m_numNodesLength-1; j++) + { + int index = arrayIndex (i, j); + m_eta[index] = m_temp[index]; + } + } +} + +void btHfFluid::updateHeight (btScalar dt) +{ + for (int j = 1; j < m_numNodesLength-1; j++) + { + for (int i = 1; i < m_numNodesWidth-1; i++) + { + int index = arrayIndex (i, j); + if (!m_flags[index]) + { + m_height[m_heightIndex][index] = m_ground[index] + m_eta[index]; + continue; + } + btScalar deta = -btScalar(0.5f) * m_eta[index] * dt * m_gridCellWidthInv * ( (m_u[m_velocityIndex][index+1] - m_u[m_velocityIndex][index]) + (m_v[m_velocityIndex][index+m_numNodesWidth] - m_v[m_velocityIndex][index])); + m_eta[index] += deta; + m_height[m_heightIndex][index] = m_ground[index] + btMax(m_eta[index],btScalar(0.0f)); + } + } +} + +void btHfFluid::advectVelocityU (btScalar dt) +{ + for (int i = 1; i < m_numNodesWidth-1; i++) + { + for (int j = 1; j < m_numNodesLength-1; j++) + { + int index = arrayIndex (i, j); + if (!m_flags[index]) + { + continue; + } + btScalar u = m_globalVelocityU; + btScalar v = m_globalVelocityV; + + u += m_u[m_velocityIndex][index]; + v += (m_v[m_velocityIndex][index]+m_v[m_velocityIndex][index+1]+m_v[m_velocityIndex][index+m_numNodesWidth]+m_v[m_velocityIndex][index+m_numNodesWidth+1]) * btScalar(0.25); + + m_temp[index] = advect (m_u[m_velocityIndex], btScalar(i), btScalar(j), u, v, dt); + } + } + + for (int i = 1; i < m_numNodesWidth-1; i++) + { + for (int j = 1; j < m_numNodesLength-1; j++) + { + int index = arrayIndex (i, j); + m_u[m_velocityIndex][index] = m_temp[index]; + } + } +} + +void btHfFluid::advectVelocityV (btScalar dt) +{ + for (int i = 1; i < m_numNodesWidth-1; i++) + { + for (int j = 1; j < m_numNodesLength-1; j++) + { + int index = arrayIndex (i, j); + if (!m_flags[index]) + { + continue; + } + btScalar u = m_globalVelocityU; + btScalar v = m_globalVelocityV; + + u += (m_u[m_velocityIndex][index]+m_u[m_velocityIndex][index+1]+m_u[m_velocityIndex][index+m_numNodesWidth]+m_u[m_velocityIndex][index+m_numNodesWidth+1]) * btScalar(0.25); + v += m_v[m_velocityIndex][index]; + + + m_temp[index] = advect (m_v[m_velocityIndex], btScalar(i), btScalar(j), u, v, dt); + } + } + for (int i = 1; i < m_numNodesWidth-1; i++) + { + for (int j = 1; j < m_numNodesLength-1; j++) + { + int index = arrayIndex (i, j); + m_v[m_velocityIndex][index] = m_temp[index]; + } + } +} + +void btHfFluid::addDisplaced (int i, int j, btScalar r) +{ + m_r[m_rIndex][arrayIndex(i,j)] += r; +} + +void btHfFluid::transferDisplaced (btScalar dt) +{ + for (int i = 2; i < m_numNodesWidth - 2; i++) + { + for (int j = 2; j < m_numNodesLength - 2; j++) + { + btScalar deltaR = m_r[m_rIndex][arrayIndex(i,j)] - m_r[(m_rIndex+1)%2][arrayIndex(i,j)]; + // deltaR is in volume, but we want to change the height.. + deltaR = deltaR / (m_gridCellWidth * m_gridCellWidth); + deltaR *= m_volumeDisplacementScale; + btScalar qdeltaR = deltaR / btScalar(4.0f); + m_eta[arrayIndex(i-1,j-1)] += qdeltaR; + m_eta[arrayIndex(i-1,j+1)] += qdeltaR; + m_eta[arrayIndex(i+1,j-1)] += qdeltaR; + m_eta[arrayIndex(i+1,j+1)] += qdeltaR; + m_eta[arrayIndex(i,j)] -= deltaR; + // OPTIMIZATION: zero out next frames r value + m_r[(m_rIndex+1)%2][arrayIndex(i,j)] = btScalar(0.0); + } + } + m_rIndex = (m_rIndex + 1) % 2; // flip frame +} + +void btHfFluid::updateVelocity (btScalar dt) +{ + for (int j = 1; j < m_numNodesLength-1; j++) + { + for (int i = 2; i < m_numNodesWidth-1; i++) + { + int index = arrayIndex (i, j); + if (!m_flags[index]) + { + continue; + } + m_u[m_velocityIndex][index] += m_gravity * dt * m_gridCellWidthInv * (m_height[m_heightIndex][index]-m_height[m_heightIndex][index-1]); + } + } + + for (int j = 2; j < m_numNodesLength-1; j++) + { + for (int i = 1; i < m_numNodesWidth-1; i++) + { + int index = arrayIndex (i, j); + if (!m_flags[index]) + { + continue; + } + m_v[m_velocityIndex][index] += m_gravity * dt * m_gridCellWidthInv * (m_height[m_heightIndex][index]-m_height[m_heightIndex][index-m_numNodesWidth]); + } + } +} + +void btHfFluid::setReflectBoundaryLeft () +{ + for (int j = 0; j < m_numNodesLength; j++) + { + int indexL = arrayIndex (0, j); + + m_height[m_heightIndex][indexL] = m_height[m_heightIndex][indexL+1]; + m_u[m_velocityIndex][indexL+1] = btScalar(0.0); + m_v[m_velocityIndex][indexL] = btScalar(0.0); + } +} + +void btHfFluid::setReflectBoundaryRight () +{ + for (int j = 0; j < m_numNodesLength; j++) + { + int indexR = arrayIndex (m_numNodesWidth-1, j); + + m_height[m_heightIndex][indexR] = m_height[m_heightIndex][indexR-1]; + m_u[m_velocityIndex][indexR-1] = btScalar(0.0); + m_v[m_velocityIndex][indexR] = btScalar(0.0); + } +} + +void btHfFluid::setReflectBoundaryBottom () +{ + for (int i = 0; i < m_numNodesWidth; i++) + { + int indexT = arrayIndex (i, 0); + + m_height[m_heightIndex][indexT] = m_height[m_heightIndex][indexT+m_numNodesWidth]; + m_v[m_velocityIndex][indexT+m_numNodesWidth] = btScalar(0.0); + m_u[m_velocityIndex][indexT] = btScalar(0.0); + } +} + +void btHfFluid::setReflectBoundaryTop () +{ + for (int i = 0; i < m_numNodesWidth; i++) + { + int indexB = arrayIndex (i, m_numNodesLength-1); + + m_height[m_heightIndex][indexB] = m_height[m_heightIndex][indexB-m_numNodesWidth]; + m_v[m_velocityIndex][indexB-m_numNodesWidth] = btScalar(0.0); + m_u[m_velocityIndex][indexB] = btScalar(0.0); + } +} + +void btHfFluid::setAbsorbBoundaryLeft (btScalar dt) +{ + for (int j = 0; j < m_numNodesLength; j++) + { + int indexL = arrayIndex (0, j); + + btScalar c = btSqrt(m_eta[indexL+1]*m_gravity); + m_height[m_heightIndex][indexL] = ((m_gridCellWidthInv * m_height[(m_heightIndex+1)%2][indexL+1])+(dt*c*m_height[m_heightIndex][indexL+1]))/(m_gridCellWidthInv + dt * c); + m_u[m_velocityIndex][indexL+1] = btScalar(0.0f); + m_v[m_velocityIndex][indexL+1] = btScalar(0.0); + } +} + +void btHfFluid::setAbsorbBoundaryRight (btScalar dt) +{ +} + +void btHfFluid::setAbsorbBoundaryTop (btScalar dt) +{ +} + +void btHfFluid::setAbsorbBoundaryBottom (btScalar dt) +{ +} + +void btHfFluid::computeFlagsAndFillRatio () +{ + for (int i = 1; i < m_numNodesWidth-1; i++) + { + for (int j = 1; j < m_numNodesLength-1; j++) + { + btScalar h = m_height[m_heightIndex][arrayIndex(i,j)]; + btScalar hMin = computeHmin(i,j); + btScalar hMax = computeHmax(i,j); + btScalar etaMax = computeEtaMax(i,j); + if (h <= hMin && etaMax < m_epsEta) + { + m_flags[arrayIndex(i,j)] = false; + m_fillRatio[arrayIndex(i,j)] = btScalar(0.0f); + } else if (h > hMax) { + m_flags[arrayIndex(i,j)] = true; + m_fillRatio[arrayIndex(i,j)] = btScalar(1.0f); + } else { + m_flags[arrayIndex(i,j)] = true; + m_fillRatio[arrayIndex(i,j)] = (h - hMin)/(hMax - hMin); + } + + } + } +} + +btScalar btHfFluid::computeHmin (int i, int j) +{ + btAssert (i > 0); + btAssert (i < m_numNodesWidth-1); + btAssert (j > 0); + btAssert (j < m_numNodesLength-1); + + btScalar h1 = m_height[m_heightIndex][arrayIndex(i-1,j-1)]; + btScalar h2 = m_height[m_heightIndex][arrayIndex(i-1,j+1)]; + btScalar h3 = m_height[m_heightIndex][arrayIndex(i+1,j-1)]; + btScalar h4 = m_height[m_heightIndex][arrayIndex(i+1,j+1)]; + btScalar h = m_height[m_heightIndex][arrayIndex(i,j)]; + btScalar minh = btMin(h1, btMin(h2, btMin(h3,h4))); + + return (minh + h) * btScalar(0.5f); +} + +btScalar btHfFluid::computeHmax (int i, int j) +{ + btAssert (i > 0); + btAssert (i < m_numNodesWidth-1); + btAssert (j > 0); + btAssert (j < m_numNodesLength-1); + + btScalar h1 = m_height[m_heightIndex][arrayIndex(i-1,j-1)]; + btScalar h2 = m_height[m_heightIndex][arrayIndex(i-1,j+1)]; + btScalar h3 = m_height[m_heightIndex][arrayIndex(i+1,j-1)]; + btScalar h4 = m_height[m_heightIndex][arrayIndex(i+1,j+1)]; + btScalar h = m_height[m_heightIndex][arrayIndex(i,j)]; + btScalar maxh = btMax(h1, btMax(h2, btMax(h3,h4))); + + return (maxh + h) * btScalar(0.5f) + m_epsHeight; +} + +btScalar btHfFluid::computeEtaMax (int i, int j) +{ + btAssert (i > 0); + btAssert (i < m_numNodesWidth-1); + btAssert (j > 0); + btAssert (j < m_numNodesLength-1); + + btScalar eta1 = m_eta[arrayIndex(i-1,j-1)]; + btScalar eta2 = m_eta[arrayIndex(i-1,j+1)]; + btScalar eta3 = m_eta[arrayIndex(i+1,j-1)]; + btScalar eta4 = m_eta[arrayIndex(i+1,j+1)]; + btScalar eta = m_eta[arrayIndex(i,j)]; + btScalar maxeta = btMax(eta1, btMax(eta2, btMax(eta3,eta4))); + + return (maxeta + eta) * btScalar(0.5f); +} + +void btHfFluid::allocateArrays () +{ + if (m_temp) + btAlignedFree (m_temp); + if (m_height[0]) + { + btAlignedFree (m_height[0]); + btAlignedFree (m_height[1]); + } + if (m_ground) + btAlignedFree (m_ground); + if (m_eta) + btAlignedFree (m_eta); + if (m_u[0]) + { + btAlignedFree (m_u[0]); + btAlignedFree (m_u[1]); + } + if (m_v) + { + btAlignedFree (m_v[0]); + btAlignedFree (m_v[1]); + } + if (m_r) + { + btAlignedFree (m_r[0]); + btAlignedFree (m_r[1]); + } + if (m_flags) + btAlignedFree (m_flags); + if (m_fillRatio) + btAlignedFree (m_fillRatio); + + m_heightIndex = 0; + m_velocityIndex = 0; + m_temp = (btScalar*)btAlignedAlloc (sizeof(btScalar) * m_numNodesWidth * m_numNodesLength, 16); + m_height[0] = (btScalar*)btAlignedAlloc (sizeof(btScalar) * m_numNodesWidth * m_numNodesLength, 16); + m_height[1] = (btScalar*)btAlignedAlloc (sizeof(btScalar) * m_numNodesWidth * m_numNodesLength, 16); + m_ground = (btScalar*)btAlignedAlloc (sizeof(btScalar) * m_numNodesWidth * m_numNodesLength, 16); + m_eta = (btScalar*)btAlignedAlloc (sizeof(btScalar) * m_numNodesWidth * m_numNodesLength, 16); + m_u[0] = (btScalar*)btAlignedAlloc (sizeof(btScalar) * m_numNodesWidth * m_numNodesLength, 16); + m_u[1] = (btScalar*)btAlignedAlloc (sizeof(btScalar) * m_numNodesWidth * m_numNodesLength, 16); + m_v[0] = (btScalar*)btAlignedAlloc (sizeof(btScalar) * m_numNodesWidth * m_numNodesLength, 16); + m_v[1] = (btScalar*)btAlignedAlloc (sizeof(btScalar) * m_numNodesWidth * m_numNodesLength, 16); + m_r[0] = (btScalar*)btAlignedAlloc (sizeof(btScalar) * m_numNodesWidth * m_numNodesLength, 16); + m_r[1] = (btScalar*)btAlignedAlloc (sizeof(btScalar) * m_numNodesWidth * m_numNodesLength, 16); + m_fillRatio = (btScalar*)btAlignedAlloc (sizeof(btScalar) * m_numNodesWidth * m_numNodesLength, 16); + m_flags = (bool*)btAlignedAlloc (sizeof(bool) * m_numNodesWidth * m_numNodesLength, 16); + + { + int bufferSize = sizeof(btScalar) * m_numNodesWidth * m_numNodesLength; + printf("[HfFluid] Fluid buffer size %d bytes\n", bufferSize); + printf("[HfFluid] Temp %d buffers\n", 1); + printf("[HfFluid] Height %d buffers\n", 2); + printf("[HfFluid] Velocity %d buffers\n", 4); + printf("[HfFluid] Eta %d buffers\n", 1); + printf("[HfFluid] Fill Ratio %d buffers\n", 1); + printf("[HfFluid] ===============================\n"); + printf("[HfFluid] Total %d buffers\n", 9); + printf("[HfFluid] Total %d KB\n", (9 * bufferSize)/1024); + } + for (int i = 0; i < m_numNodesWidth*m_numNodesLength; i++) + { + m_eta[i] = btScalar(0.0); + m_u[0][i] = btScalar(0.0); + m_u[1][i] = btScalar(0.0); + m_v[0][i] = btScalar(0.0); + m_v[1][i] = btScalar(0.0); + m_r[0][i] = btScalar(0.0); + m_r[1][i] = btScalar(0.0); + m_height[0][i] = btScalar(0.0); + m_height[1][i] = btScalar(0.0); + m_ground[i] = btScalar(0.0); + m_flags[i] = false; + m_fillRatio[i] = btScalar(0.0); + m_temp[i] = btScalar(0.0); + } +} + + +void btHfFluid::debugTests () +{ + static btScalar total_volume = btScalar(0.0f); + btScalar new_total_volume = btScalar(0.0f); + for (int i = 0; i < m_numNodesWidth*m_numNodesLength; i++) + { + new_total_volume += m_eta[i] * m_gridCellWidth * m_gridCellWidth; + } + printf("volume = %f volume delta = %f\n", new_total_volume, new_total_volume - total_volume); + total_volume = new_total_volume; +} + +// You can enforce a global velocity at the surface of the fluid +// default: 0.0 and 0.0 +void btHfFluid::setGlobaVelocity (btScalar globalVelocityU, btScalar globalVelocityV) +{ + m_globalVelocityU = globalVelocityU; + m_globalVelocityV = globalVelocityV; +} + +void btHfFluid::getGlobalVelocity (btScalar& globalVelocityU, btScalar& globalVelocityV) const +{ + globalVelocityU = m_globalVelocityU; + globalVelocityV = m_globalVelocityV; +} + +// Control force of gravity, should match physics world +// default: -10.0 +void btHfFluid::setGravity (btScalar gravity) +{ + m_gravity = gravity; +} +btScalar btHfFluid::getGravity () const +{ + return m_gravity; +} + +// When a body is submerged into the fluid, the displaced fluid +// is spread to adjacent cells. You can control the percentage of this +// by setting this value between 0.0 and 1.0 +// default: 0.5 +void btHfFluid::setVolumeDisplacementScale (btScalar volumeDisplacementScale) +{ + m_volumeDisplacementScale = volumeDisplacementScale; +} + +btScalar btHfFluid::getVolumeDisplacementScale () const +{ + return m_volumeDisplacementScale; +} + +// The horizontal velocity of the fluid can influence bodies submerged +// in the fluid. You can control how much influence by setting this +// between 0.0 and 1.0 +// default: 0.5 +void btHfFluid::setHorizontalVelocityScale (btScalar horizontalVelocityScale) +{ + m_horizontalVelocityScale = horizontalVelocityScale; +} + +btScalar btHfFluid::getHorizontalVelocityScale () const +{ + return m_horizontalVelocityScale; +} + +static btScalar rangeOverlap (btScalar lo1, btScalar hi1, btScalar lo2, btScalar hi2, btScalar& loOut, btScalar& hiOut) +{ + if (!(lo1 <= hi2 && lo2 <= hi1)) + return btScalar(0.0f); + + if (lo1 >= lo2 && lo1 <= hi2 && + hi1 >= lo2 && hi1 <= hi2) + { + hiOut = hi1; + loOut = lo1; + return hi1 - lo1; + } else if (lo2 >= lo1 && lo2 <= hi1 && + hi2 >= lo1 && hi2 <= hi1) + { + hiOut = hi2; + loOut = lo2; + return hi2 - lo2; + } else if (hi1 >= lo2 && lo1 <= lo2) { + hiOut = hi1; + loOut = lo2; + return hi1 - lo2; + } else { + hiOut = hi2; + loOut = lo1; + return hi2 - lo1; + } +} + +btHfFluidColumnRigidBodyCallback::btHfFluidColumnRigidBodyCallback (btRigidBody* rigidBody, btIDebugDraw* debugDraw, btScalar density, btScalar floatyness) +{ + m_rigidBody = rigidBody; + m_buoyantShape = (btHfFluidBuoyantConvexShape*)rigidBody->getCollisionShape(); + m_debugDraw = debugDraw; + m_rigidBody->getAabb (m_aabbMin, m_aabbMax); + m_volume = btScalar(0.0f); + m_density = density; + m_floatyness = floatyness; + m_numVoxels = m_buoyantShape->getNumVoxels (); + m_voxelPositionsXformed = (btVector3*)btAlignedAlloc(sizeof(btVector3)*m_numVoxels, 16); + m_voxelSubmerged = (bool*)btAlignedAlloc(sizeof(bool)*m_numVoxels, 16); + for (int i = 0; i < m_numVoxels; i++) + { + btVector3 p = m_buoyantShape->getVoxelPositionsArray()[i]; + p = m_rigidBody->getWorldTransform().getBasis() * p; + p += m_rigidBody->getWorldTransform().getOrigin(); + m_voxelPositionsXformed[i] = p; + m_voxelSubmerged[i] = false; + } +} + +btHfFluidColumnRigidBodyCallback::~btHfFluidColumnRigidBodyCallback () +{ + if (m_voxelPositionsXformed) + btAlignedFree (m_voxelPositionsXformed); + if (m_voxelSubmerged) + btAlignedFree (m_voxelSubmerged); +} + +static bool sphereVsAABB (const btVector3& aabbMin, const btVector3& aabbMax, const btVector3& sphereCenter, const btScalar sphereRadius) +{ + btScalar totalDistance = 0; + + // Accumulate the distance of the sphere's center on each axis + for(int i = 0; i < 3; ++i) { + + // If the sphere's center is outside the aabb, we've got distance on this axis + if(sphereCenter[i] < aabbMin[i]) { + btScalar borderDistance = aabbMin[i] - sphereCenter[i]; + totalDistance += borderDistance * borderDistance; + + } else if(sphereCenter[i] > aabbMax[i]) { + btScalar borderDistance = sphereCenter[i] - aabbMax[i]; + totalDistance += borderDistance * borderDistance; + + } + // Otherwise the sphere's center is within the box on this axis, so the + // distance will be 0 and we do not need to accumulate anything at all + + } + + // If the distance to the box is lower than the sphere's radius, both are overlapping + return (totalDistance <= (sphereRadius * sphereRadius)); +} + +bool btHfFluidColumnRigidBodyCallback::processColumn (btHfFluid* fluid, int w, int l) +{ + btVector3 columnAabbMin,columnAabbMax; + + fluid->getAabbForColumn (w, l, columnAabbMin, columnAabbMax); + + bool applyBuoyancyImpulse = true; + bool applyFluidVelocityImpulse = true; + bool applyFluidDisplace = true; + + btScalar dt = btScalar(1.0f/60.0f); + + btScalar columnVolume = btScalar(0.0f); + + for (int i = 0; i < m_buoyantShape->getNumVoxels(); i++) + { + if (m_voxelSubmerged[i]) + continue; + + if (sphereVsAABB(columnAabbMin, columnAabbMax, m_voxelPositionsXformed[i], m_buoyantShape->getVoxelRadius())) + { + m_voxelSubmerged[i] = true; + btScalar voxelVolume = m_buoyantShape->getVolumePerVoxel(); + columnVolume += voxelVolume; + + btVector3 application_point = m_voxelPositionsXformed[i]; + btVector3 relative_position = application_point - m_rigidBody->getCenterOfMassPosition(); + + if (applyBuoyancyImpulse) + { + btScalar massDisplacedWater = voxelVolume * m_density * m_floatyness; + btScalar force = massDisplacedWater * -fluid->getGravity(); + btScalar impulseMag = force * dt; + btVector3 impulseVec = btVector3(btScalar(0.0f), btScalar(1.0f), btScalar(0.0f)) * impulseMag; +//#define CENTER_IMPULSE_ONLY 1 +#ifdef CENTER_IMPULSE_ONLY + m_rigidBody->applyCentralImpulse (impulseVec); +#else + m_rigidBody->applyImpulse (impulseVec, relative_position); +#endif + } + } + } + + if (columnVolume > btScalar(0.0)) + { + m_volume += columnVolume; + + if (applyFluidDisplace) + { + fluid->addDisplaced (w, l, columnVolume); + } + + if (applyFluidVelocityImpulse) + { + int index = fluid->arrayIndex (w,l); + btScalar u = fluid->getVelocityUArray()[index]; + btScalar v = fluid->getVelocityVArray()[index]; + btVector3 vd = btVector3(u, btScalar(0.0f), v); + btVector3 impulse = vd * dt * fluid->getHorizontalVelocityScale(); + m_rigidBody->applyCentralImpulse (impulse); + } + } + + return true; +} \ No newline at end of file diff --git a/BulletPhysics/bulletTrunk/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluid.h b/BulletPhysics/bulletTrunk/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluid.h new file mode 100644 index 00000000..551c253c --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluid.h @@ -0,0 +1,243 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. + +Experimental Buoyancy fluid demo written by John McCutchan +*/ + +#ifndef __HFFLUID_H +#define __HFFLUID_H + +#include "BulletCollision/CollisionDispatch/btCollisionObject.h" +#include "BulletCollision/CollisionShapes/btTriangleCallback.h" + +class btPersistentManifold; +class btManifoldResult; + +// FIX AABB calculation for whole btHfFluid shape +// Fix flags and fill ratio +// -> Figure out the constants used in flags and fill ratio code +// Fix volume removal +// add buoyant convex vs. convex / concave +// add buoyant concave support (try bunny model) + +///experimental buyancy fluid demo +class btHfFluid : public btCollisionObject +{ +public: + btHfFluid (btScalar gridCellWidth, int numNodesWidth, int numNodesLength); + + ~btHfFluid (); + + void predictMotion(btScalar dt); + + /* Prep does some initial setup of the height field fluid. + * You should call this at initialization time. + */ + void prep (); + + static const btHfFluid* upcast(const btCollisionObject* colObj) + { + if (colObj->getInternalType()==CO_HF_FLUID) + return (const btHfFluid*)colObj; + return 0; + } + static btHfFluid* upcast(btCollisionObject* colObj) + { + if (colObj->getInternalType()==CO_HF_FLUID) + return (btHfFluid*)colObj; + return 0; + } + + // + // ::btCollisionObject + // + + virtual void getAabb(btVector3& aabbMin,btVector3& aabbMax) const + { + aabbMin = m_aabbMin; + aabbMax = m_aabbMax; + } + + int getNumNodesWidth () const { return m_numNodesWidth; } + int getNumNodesLength () const { return m_numNodesLength; } + + btScalar getGridCellWidth () const { return m_gridCellWidth; } + btScalar widthPos (int i) const; + btScalar lengthPos (int j) const; + + int arrayIndex (int i, int j) const; + int arrayIndex (btScalar i, btScalar j) const; + int arrayIndex (unsigned int i, unsigned int j) const; + const btScalar* getHeightArray () const; + const btScalar* getGroundArray () const; + const btScalar* getEtaArray () const; + const btScalar* getVelocityUArray () const; + const btScalar* getVelocityVArray () const; + const bool* getFlagsArray () const; + + void setFluidHeight (int x, int y, btScalar height); + void setFluidHeight (int index, btScalar height); + + void addFluidHeight (int x, int y, btScalar height); + void addDisplaced (int i, int j, btScalar r); + + void getAabbForColumn (int x, int y, btVector3& aabbMin, btVector3& aabbMax); + + btScalar* getHeightArray (); + btScalar* getGroundArray (); + btScalar* getEtaArray (); + btScalar* getVelocityUArray (); + btScalar* getVelocityVArray (); + bool* getFlagsArray (); + + void foreachGroundTriangle(btTriangleCallback* callback,const btVector3& aabbMin,const btVector3& aabbMax); + class btHfFluidColumnCallback + { + public: + btHfFluidColumnCallback () {} + + virtual ~btHfFluidColumnCallback () {} + + virtual bool processColumn (btHfFluid* fluid, int w, int l) + { + return true; // keep going + } + }; + + void foreachFluidColumn (btHfFluidColumnCallback* callback, const btVector3& aabbMin, const btVector3& aabbMax); + + void foreachSurfaceTriangle (btTriangleCallback* callback, const btVector3& aabbMin, const btVector3& aabbMax); +protected: + int m_numNodesWidth; + int m_numNodesLength; + + btScalar m_gridCellWidth; + btScalar m_gridWidth; + btScalar m_gridLength; + + btScalar m_gridCellWidthInv; + + btVector3 m_aabbMin; + btVector3 m_aabbMax; + + void setGridDimensions (btScalar gridCellWidth, + int numNodesWidth, int numNodesLength); + + btScalar bilinearInterpolate (const btScalar* array, btScalar i, btScalar j); + + btScalar advect (const btScalar* array, btScalar i, btScalar j, btScalar di, btScalar dj, btScalar dt); + + void advectEta (btScalar dt); + void updateHeight (btScalar dt); + + void advectVelocityU (btScalar dt); + void advectVelocityV (btScalar dt); + void updateVelocity (btScalar dt); + + void transferDisplaced (btScalar dt); + + void setReflectBoundaryLeft (); + void setReflectBoundaryRight (); + void setReflectBoundaryTop (); + void setReflectBoundaryBottom (); + + void setAbsorbBoundaryLeft (btScalar dt); + void setAbsorbBoundaryRight (btScalar dt); + void setAbsorbBoundaryTop (btScalar dt); + void setAbsorbBoundaryBottom (btScalar dt); + + void computeFlagsAndFillRatio (); + btScalar computeHmin (int i, int j); + btScalar computeHmax (int i, int j); + btScalar computeEtaMax (int i, int j); + + void allocateArrays (); + + void debugTests (); + + btScalar* m_temp; // temp + int m_heightIndex; + btScalar* m_height[2]; + btScalar* m_ground; + btScalar* m_eta; // height - ground + btScalar* m_u[2]; + btScalar* m_v[2]; + int m_rIndex; + btScalar* m_r[2]; + int m_velocityIndex; + bool* m_flags; + btScalar* m_fillRatio; + + // tweakables + btScalar m_globalVelocityU; + btScalar m_globalVelocityV; + btScalar m_gravity; + btScalar m_volumeDisplacementScale; + btScalar m_horizontalVelocityScale; + + btScalar m_epsHeight; + btScalar m_epsEta; +public: + // You can enforce a global velocity at the surface of the fluid + // default: 0.0 and 0.0 + void setGlobaVelocity (btScalar globalVelocityU, btScalar globalVelocityV); + void getGlobalVelocity (btScalar& globalVelocityU, btScalar& globalVelocityV) const; + + // Control force of gravity, should match physics world + // default: -10.0 + void setGravity (btScalar gravity); + btScalar getGravity () const; + + // When a body is submerged into the fluid, the displaced fluid + // is spread to adjacent cells. You can control the percentage of this + // by setting this value between 0.0 and 1.0 + // default: 0.5 + void setVolumeDisplacementScale (btScalar volumeDisplacementScale); + btScalar getVolumeDisplacementScale () const; + + // The horizontal velocity of the fluid can influence bodies submerged + // in the fluid. You can control how much influence by setting this + // between 0.0 and 1.0 + // default: 0.5 + void setHorizontalVelocityScale (btScalar horizontalVelocityScale); + btScalar getHorizontalVelocityScale () const; +}; + +class btRigidBody; +class btIDebugDraw; +class btHfFluidBuoyantConvexShape; + +class btHfFluidColumnRigidBodyCallback : public btHfFluid::btHfFluidColumnCallback +{ +protected: + btRigidBody* m_rigidBody; + btHfFluidBuoyantConvexShape* m_buoyantShape; + btIDebugDraw* m_debugDraw; + int m_numVoxels; + btVector3* m_voxelPositionsXformed; + bool* m_voxelSubmerged; + btVector3 m_aabbMin; + btVector3 m_aabbMax; + btScalar m_volume; + btScalar m_density; + btScalar m_floatyness; +public: + btHfFluidColumnRigidBodyCallback (btRigidBody* rigidBody, btIDebugDraw* debugDraw, btScalar density, btScalar floatyness); + ~btHfFluidColumnRigidBodyCallback (); + bool processColumn (btHfFluid* fluid, int w, int l); + btScalar getVolume () const { return m_volume; } +}; + +#endif + diff --git a/BulletPhysics/bulletTrunk/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidBuoyantConvexShape.cpp b/BulletPhysics/bulletTrunk/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidBuoyantConvexShape.cpp new file mode 100644 index 00000000..28c131e6 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidBuoyantConvexShape.cpp @@ -0,0 +1,194 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. + +Experimental Buoyancy fluid demo written by John McCutchan +*/ +#include + +#include "LinearMath/btAabbUtil2.h" +#include "BulletCollision/CollisionShapes/btConvexShape.h" +#include "BulletCollision/CollisionShapes/btSphereShape.h" +#include "BulletCollision/NarrowPhaseCollision/btGjkPairDetector.h" +#include "BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.h" +#include "BulletCollision/NarrowPhaseCollision/btMinkowskiPenetrationDepthSolver.h" +#include "BulletCollision/NarrowPhaseCollision/btDiscreteCollisionDetectorInterface.h" + +#include "btHfFluidBuoyantConvexShape.h" + +btHfFluidBuoyantConvexShape::btHfFluidBuoyantConvexShape (btConvexShape* convexShape) +{ + m_convexShape = convexShape; + m_shapeType = HFFLUID_BUOYANT_CONVEX_SHAPE_PROXYTYPE; + m_radius = btScalar(0.f); + m_numVoxels = 0; + m_voxelPositions = NULL; + m_totalVolume = btScalar(0.0f); + m_floatyness = btScalar(1.5f); +} + +btHfFluidBuoyantConvexShape::~btHfFluidBuoyantConvexShape () +{ + if (m_voxelPositions) + btAlignedFree (m_voxelPositions); +} + +void btHfFluidBuoyantConvexShape::getAabb(const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) const +{ + return m_convexShape->getAabb (t, aabbMin, aabbMax); +} + +void btHfFluidBuoyantConvexShape::setMargin(btScalar margin) +{ + m_convexShape->setMargin (margin); +} + +void btHfFluidBuoyantConvexShape::setLocalScaling(const btVector3& scaling) +{ + m_convexShape->setLocalScaling (scaling); +} + +const char* btHfFluidBuoyantConvexShape::getName() const +{ + return "HF_FLUID_BUOYANT_CONVEX_SHAPE"; +} + +const btVector3& btHfFluidBuoyantConvexShape::getLocalScaling() const +{ + return m_convexShape->getLocalScaling(); +} + +void btHfFluidBuoyantConvexShape::calculateLocalInertia(btScalar mass,btVector3& inertia) const +{ + m_convexShape->calculateLocalInertia (mass, inertia); +} + +btScalar btHfFluidBuoyantConvexShape::getMargin() const +{ + return m_convexShape->getMargin(); +} + +//must be above the machine epsilon +#define REL_ERROR2 btScalar(1.0e-6) +static bool intersect(btVoronoiSimplexSolver* simplexSolver, + const btTransform& transformA, + const btTransform& transformB, + btConvexShape* a, + btConvexShape* b) +{ + + btScalar squaredDistance = SIMD_INFINITY; + btTransform localTransA = transformA; + btTransform localTransB = transformB; + btVector3 positionOffset = (localTransA.getOrigin() + localTransB.getOrigin()) * btScalar(0.5); + localTransA.getOrigin() -= positionOffset; + localTransB.getOrigin() -= positionOffset; + btScalar delta = btScalar(0.); + btVector3 v = btVector3(1.0f, 0.0f, 0.0f); + simplexSolver->reset (); + do + { + btVector3 seperatingAxisInA = (-v)* transformA.getBasis(); + btVector3 seperatingAxisInB = v* transformB.getBasis(); + + btVector3 pInA = a->localGetSupportVertexNonVirtual(seperatingAxisInA); + btVector3 qInB = b->localGetSupportVertexNonVirtual(seperatingAxisInB); + + btVector3 pWorld = localTransA(pInA); + btVector3 qWorld = localTransB(qInB); + + btVector3 w = pWorld - qWorld; + delta = v.dot(w); + + // potential exit, they don't overlap + if ((delta > btScalar(0.0))) + { + return false; + } + + if (simplexSolver->inSimplex (w)) + { + return false; + } + + simplexSolver->addVertex (w, pWorld, qWorld); + + if (!simplexSolver->closest(v)) + { + return false; + } + + btScalar previousSquaredDistance = squaredDistance; + squaredDistance = v.length2(); + + if (previousSquaredDistance - squaredDistance <= SIMD_EPSILON * previousSquaredDistance) + { + return false; + } + } while (!simplexSolver->fullSimplex() && squaredDistance > REL_ERROR2 * simplexSolver->maxVertex()); + + return true; +} + +void btHfFluidBuoyantConvexShape::generateShape (btScalar radius, btScalar gap) +{ + btTransform T; + T.setIdentity (); + btVector3 aabbMin, aabbMax; + getAabb (T, aabbMin, aabbMax); + + m_radius = radius; + m_numVoxels = 0; + + btVoronoiSimplexSolver simplexSolver; + btSphereShape sphereShape(radius); + btVector3* voxelPositions = (btVector3*)btAlignedAlloc (sizeof(btVector3)*MAX_VOXEL_DIMENSION*MAX_VOXEL_DIMENSION*MAX_VOXEL_DIMENSION,16); + for (int i = 0; i < MAX_VOXEL_DIMENSION; i++) + { + for (int j = 0; j < MAX_VOXEL_DIMENSION; j++) + { + for (int k = 0; k < MAX_VOXEL_DIMENSION; k++) + { + btVector3 point; + btTransform sT; + sT.setIdentity (); + + point.setX(aabbMin.getX() + (i * btScalar(2.0f) * radius) + (i * gap)); + point.setY(aabbMin.getY() + (j * btScalar(2.0f) * radius) + (j * gap)); + point.setZ(aabbMin.getZ() + (k * btScalar(2.0f) * radius) + (k * gap)); + + if (TestPointAgainstAabb2(aabbMin, aabbMax, point)) + { + btTransform sT; + sT.setIdentity (); + sT.setOrigin (point); + + if (intersect (&simplexSolver, T, sT, m_convexShape, &sphereShape)) + { + voxelPositions[m_numVoxels] = point; + m_numVoxels++; + } + } + } + } + } + m_voxelPositions = (btVector3*)btAlignedAlloc (sizeof(btVector3)*m_numVoxels, 16); + for (int i = 0; i < m_numVoxels;i++) + { + m_voxelPositions[i] = voxelPositions[i]; + } + btAlignedFree (voxelPositions); + m_volumePerVoxel = btScalar(4.0f)/btScalar(3.0f)*SIMD_PI*radius*radius*radius; + m_totalVolume = m_numVoxels * m_volumePerVoxel; + m_radius = radius; +} \ No newline at end of file diff --git a/BulletPhysics/bulletTrunk/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidBuoyantConvexShape.h b/BulletPhysics/bulletTrunk/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidBuoyantConvexShape.h new file mode 100644 index 00000000..72266625 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidBuoyantConvexShape.h @@ -0,0 +1,62 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. + +Experimental Buoyancy fluid demo written by John McCutchan +*/ +#ifndef __BT_HFFLUID_BUOYANT_CONVEX_SHAPE_H +#define __BT_HFFLUID_BUOYANT_CONVEX_SHAPE_H + +#include "LinearMath/btVector3.h" +#include "BulletCollision/CollisionShapes/btCollisionShape.h" + +#define MAX_VOXEL_DIMENSION 32 + +class btConvexShape; +///experimental buyancy fluid demo +class btHfFluidBuoyantConvexShape : public btCollisionShape +{ +public: + btHfFluidBuoyantConvexShape (btConvexShape* convexShape); + ~btHfFluidBuoyantConvexShape (); + void generateShape (btScalar radius, btScalar gap); + + btConvexShape* getConvexShape () { return m_convexShape; } + + virtual void getAabb(const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) const; + virtual void setMargin(btScalar margin); + virtual btScalar getMargin() const; + virtual void setLocalScaling(const btVector3& scaling); + virtual const btVector3& getLocalScaling() const; + virtual void calculateLocalInertia(btScalar mass,btVector3& inertia) const; + virtual const char* getName()const; + + btScalar getVoxelRadius () const { return m_radius; } + btScalar getTotalVolume () const { return m_totalVolume; } + btScalar getVolumePerVoxel () const { return m_volumePerVoxel; } + btScalar getFloatyness () const { return m_floatyness; } + void setFloatyness (btScalar floatyness) { m_floatyness = floatyness; } + int getNumVoxels () const { return m_numVoxels; } + const btVector3* getVoxelPositionsArray() { return m_voxelPositions; } + +protected: + btScalar m_floatyness; + btScalar m_radius; + btScalar m_totalVolume; + btScalar m_volumePerVoxel; + int m_numVoxels; + btVector3* m_voxelPositions; + btConvexShape* m_convexShape; +}; + +#endif diff --git a/BulletPhysics/bulletTrunk/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidBuoyantShapeCollisionAlgorithm.cpp b/BulletPhysics/bulletTrunk/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidBuoyantShapeCollisionAlgorithm.cpp new file mode 100644 index 00000000..91e4d4c9 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidBuoyantShapeCollisionAlgorithm.cpp @@ -0,0 +1,74 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. + +Experimental Buoyancy fluid demo written by John McCutchan +*/ +#include + +#include "btHfFluidBuoyantShapeCollisionAlgorithm.h" +#include "btHfFluidBuoyantConvexShape.h" +#include "BulletCollision/CollisionDispatch/btCollisionDispatcher.h" +#include "BulletCollision/CollisionShapes/btSphereShape.h" +#include "BulletCollision/CollisionShapes/btBoxShape.h" + +#include "BulletCollision/CollisionDispatch/btCollisionObject.h" +#include "BulletDynamics/Dynamics/btRigidBody.h" +#include "btHfFluid.h" + +btHfFluidBuoyantShapeCollisionAlgorithm::btHfFluidBuoyantShapeCollisionAlgorithm(const btCollisionAlgorithmConstructionInfo& ci,btCollisionObject* col0,btCollisionObject* col1,btSimplexSolverInterface* simplexSolver, btConvexPenetrationDepthSolver* pdSolver) +: btCollisionAlgorithm(ci), m_convexConvexAlgorithm(NULL, ci, col0, col1, simplexSolver, pdSolver,0,0) +{ + m_collisionObject0 = col0; + m_collisionObject1 = col1; +} + +btHfFluidBuoyantShapeCollisionAlgorithm::~btHfFluidBuoyantShapeCollisionAlgorithm() +{ +} + +void btHfFluidBuoyantShapeCollisionAlgorithm::processCollision (btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut) +{ + btHfFluidBuoyantConvexShape* tmpShape0 = (btHfFluidBuoyantConvexShape*)body0->getCollisionShape(); + btHfFluidBuoyantConvexShape* tmpShape1 = (btHfFluidBuoyantConvexShape*)body1->getCollisionShape(); + btConvexShape* convexShape0 = tmpShape0->getConvexShape(); + btConvexShape* convexShape1 = tmpShape1->getConvexShape(); + + body0->setCollisionShape (convexShape0); + body1->setCollisionShape (convexShape1); + + m_convexConvexAlgorithm.processCollision (body0, body1, dispatchInfo,resultOut); + + body0->setCollisionShape (tmpShape0); + body1->setCollisionShape (tmpShape1); +} + +btScalar btHfFluidBuoyantShapeCollisionAlgorithm::calculateTimeOfImpact(btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut) +{ + btHfFluidBuoyantConvexShape* tmpShape0 = (btHfFluidBuoyantConvexShape*)body0->getCollisionShape(); + btHfFluidBuoyantConvexShape* tmpShape1 = (btHfFluidBuoyantConvexShape*)body1->getCollisionShape(); + btConvexShape* convexShape0 = tmpShape0->getConvexShape(); + btConvexShape* convexShape1 = tmpShape1->getConvexShape(); + + body0->setCollisionShape (convexShape0); + body1->setCollisionShape (convexShape1); + + btScalar toi = btScalar(0.0f); + + toi = m_convexConvexAlgorithm.calculateTimeOfImpact (body0, body1, dispatchInfo, resultOut); + + body0->setCollisionShape (tmpShape0); + body1->setCollisionShape (tmpShape1); + + return toi; +} diff --git a/BulletPhysics/bulletTrunk/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidBuoyantShapeCollisionAlgorithm.h b/BulletPhysics/bulletTrunk/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidBuoyantShapeCollisionAlgorithm.h new file mode 100644 index 00000000..cb792449 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidBuoyantShapeCollisionAlgorithm.h @@ -0,0 +1,87 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. + +Experimental Buoyancy fluid demo written by John McCutchan +*/ + +#ifndef HF_FLUID_BUOYANT_SHAPE_COLLISION_ALGORITHM_H +#define HF_FLUID_BUOYANT_SHAPE_COLLISION_ALGORITHM_H + +#include "BulletCollision/BroadphaseCollision/btCollisionAlgorithm.h" +#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" +#include "BulletCollision/CollisionDispatch/btCollisionCreateFunc.h" +#include "BulletCollision/NarrowPhaseCollision/btPersistentManifold.h" +#include "BulletCollision/CollisionDispatch/btCollisionDispatcher.h" +#include "BulletCollision/CollisionShapes/btTriangleCallback.h" +#include "BulletCollision/CollisionDispatch/btConvexConvexAlgorithm.h" +#include "BulletCollision/CollisionDispatch/btConvexConcaveCollisionAlgorithm.h" + +#include "LinearMath/btVector3.h" +class btHfFluid; + +class btConvexConvexAlgorithm; +class btConvexPenetrationDepthSolver; +class btSimplexSolverInterface; + +///experimental buyancy fluid demo +/// btHfFluidBuoyantShapeCollisionAlgorithm provides collision detection between btHfFluidBuoyantConvexShape and btHfFluidBuoyantConvexShape +class btHfFluidBuoyantShapeCollisionAlgorithm : public btCollisionAlgorithm +{ + btCollisionObject* m_collisionObject0; + btCollisionObject* m_collisionObject1; + + btConvexConvexAlgorithm m_convexConvexAlgorithm; +public: + + btHfFluidBuoyantShapeCollisionAlgorithm(const btCollisionAlgorithmConstructionInfo& ci,btCollisionObject* col0,btCollisionObject* col1, btSimplexSolverInterface* simplexSolver, btConvexPenetrationDepthSolver* pdSolver); + + virtual ~btHfFluidBuoyantShapeCollisionAlgorithm(); + + virtual void processCollision (btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut); + + virtual btScalar calculateTimeOfImpact(btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut); + + virtual void getAllContactManifolds(btManifoldArray& manifoldArray) + { + m_convexConvexAlgorithm.getAllContactManifolds (manifoldArray); + } + + + struct CreateFunc :public btCollisionAlgorithmCreateFunc + { + btConvexPenetrationDepthSolver* m_pdSolver; + btSimplexSolverInterface* m_simplexSolver; + + CreateFunc(btSimplexSolverInterface* simplexSolver, btConvexPenetrationDepthSolver* pdSolver) + { + m_simplexSolver = simplexSolver; + m_pdSolver = pdSolver; + } + + virtual ~CreateFunc() {} + virtual btCollisionAlgorithm* CreateCollisionAlgorithm(btCollisionAlgorithmConstructionInfo& ci, btCollisionObject* body0,btCollisionObject* body1) + { + void* mem = ci.m_dispatcher1->allocateCollisionAlgorithm(sizeof(btHfFluidBuoyantShapeCollisionAlgorithm)); + if (!m_swapped) + { + return new(mem) btHfFluidBuoyantShapeCollisionAlgorithm(ci,body0,body1, m_simplexSolver, m_pdSolver); + } else + { + return new(mem) btHfFluidBuoyantShapeCollisionAlgorithm(ci,body0,body1, m_simplexSolver, m_pdSolver); + } + } + }; +}; + +#endif //HF_FLUID_BUOYANT_SHAPE_COLLISION_ALGORITHM_H diff --git a/BulletPhysics/bulletTrunk/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidCollisionShape.cpp b/BulletPhysics/bulletTrunk/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidCollisionShape.cpp new file mode 100644 index 00000000..1d78a148 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidCollisionShape.cpp @@ -0,0 +1,18 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. + +Experimental Buoyancy fluid demo written by John McCutchan +*/ +#include "btHfFluidCollisionShape.h" + diff --git a/BulletPhysics/bulletTrunk/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidCollisionShape.h b/BulletPhysics/bulletTrunk/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidCollisionShape.h new file mode 100644 index 00000000..56f01e4c --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidCollisionShape.h @@ -0,0 +1,94 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. + +Experimental Buoyancy fluid demo written by John McCutchan +*/ +#ifndef BT_HF_FLUID_COLLISION_SHAPE_H +#define BT_HF_FLUID_COLLISION_SHAPE_H + +#include "btHfFluid.h" +#include "BulletCollision/BroadphaseCollision/btBroadphaseInterface.h" +#include "BulletCollision/CollisionDispatch/btCollisionDispatcher.h" +#include "BulletCollision/CollisionShapes/btConvexInternalShape.h" +#include "BulletCollision/CollisionShapes/btConcaveShape.h" + +class btHfFluidCollisionShape : public btConcaveShape +{ + public: + btHfFluid* m_fluid; + + btHfFluidCollisionShape(btHfFluid* backptr) : btConcaveShape () + { + m_shapeType = HFFLUID_SHAPE_PROXYTYPE; + m_fluid=backptr; + } + + virtual ~btHfFluidCollisionShape() + { + + } + + void processAllTriangles(btTriangleCallback* /*callback*/,const btVector3& /*aabbMin*/,const btVector3& /*aabbMax*/) const + { + //not yet + btAssert(0); + } + + ///getAabb returns the axis aligned bounding box in the coordinate frame of the given transform t. + virtual void getAabb(const btTransform& t,btVector3& aabbMin,btVector3& aabbMax) const + { + /* t should be identity, but better be safe than...fast? */ + btVector3 mins; + btVector3 maxs; + + m_fluid->getAabb (mins, maxs); + + const btVector3 crns[]={t*btVector3(mins.x(),mins.y(),mins.z()), + t*btVector3(maxs.x(),mins.y(),mins.z()), + t*btVector3(maxs.x(),maxs.y(),mins.z()), + t*btVector3(mins.x(),maxs.y(),mins.z()), + t*btVector3(mins.x(),mins.y(),maxs.z()), + t*btVector3(maxs.x(),mins.y(),maxs.z()), + t*btVector3(maxs.x(),maxs.y(),maxs.z()), + t*btVector3(mins.x(),maxs.y(),maxs.z())}; + aabbMin=aabbMax=crns[0]; + for(int i=1;i<8;++i) + { + aabbMin.setMin(crns[i]); + aabbMax.setMax(crns[i]); + } + } + + virtual void setLocalScaling(const btVector3& /*scaling*/) + { + ///na + btAssert(0); + } + virtual const btVector3& getLocalScaling() const + { + static const btVector3 dummy(1,1,1); + return dummy; + } + virtual void calculateLocalInertia(btScalar /*mass*/,btVector3& /*inertia*/) const + { + ///not yet + btAssert(0); + } + virtual const char* getName()const + { + return "HfFluid"; + } +}; + +#endif diff --git a/BulletPhysics/bulletTrunk/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidRigidCollisionAlgorithm.cpp b/BulletPhysics/bulletTrunk/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidRigidCollisionAlgorithm.cpp new file mode 100644 index 00000000..e89f5486 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidRigidCollisionAlgorithm.cpp @@ -0,0 +1,133 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. + +Experimental Buoyancy fluid demo written by John McCutchan +*/ + +#include + +#include "btHfFluidRigidCollisionAlgorithm.h" +#include "btHfFluidBuoyantConvexShape.h" +#include "BulletCollision/CollisionDispatch/btCollisionDispatcher.h" +#include "BulletCollision/CollisionShapes/btSphereShape.h" +#include "BulletCollision/CollisionShapes/btBoxShape.h" +#include "BulletCollision/CollisionDispatch/btCollisionObject.h" +#include "BulletDynamics/Dynamics/btRigidBody.h" +#include "btHfFluid.h" + +btHfFluidRigidCollisionAlgorithm::~btHfFluidRigidCollisionAlgorithm() +{ +} + +btHfFluidRigidCollisionAlgorithm::btHfFluidRigidCollisionAlgorithm(const btCollisionAlgorithmConstructionInfo& ci,btCollisionObject* col0,btCollisionObject* col1, bool isSwapped) +: btCollisionAlgorithm(ci), m_isSwapped(isSwapped), + m_convexTrianglecallback(ci.m_dispatcher1, col0, col1, !isSwapped) // we flip the isSwapped because we are hf fluid vs. convex and callback expects convex vs. concave +{ + m_manifoldPtr = m_convexTrianglecallback.m_manifoldPtr; + if (m_isSwapped) + { + m_hfFluid = static_cast(col1); + m_rigidCollisionObject = static_cast(col0); + m_manifoldPtr->setBodies(m_hfFluid,m_rigidCollisionObject); + } else { + m_hfFluid = static_cast(col0); + m_rigidCollisionObject = static_cast(col1); + m_manifoldPtr->setBodies(m_rigidCollisionObject,m_hfFluid); + } +} + +void btHfFluidRigidCollisionAlgorithm::processGround (const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut) +{ + btScalar triangleMargin = m_rigidCollisionObject->getCollisionShape()->getMargin(); + resultOut->setPersistentManifold(m_manifoldPtr); + // to perform the convex shape vs. ground terrain: + // we pull the convex shape out of the buoyant shape and replace it temporarily + btHfFluidBuoyantConvexShape* tmpShape = (btHfFluidBuoyantConvexShape*)m_rigidCollisionObject->getCollisionShape(); + btConvexShape* convexShape = ((btHfFluidBuoyantConvexShape*)tmpShape)->getConvexShape(); + m_rigidCollisionObject->setCollisionShape (convexShape); + m_convexTrianglecallback.setTimeStepAndCounters (triangleMargin, dispatchInfo, resultOut); + m_hfFluid->foreachGroundTriangle (&m_convexTrianglecallback, m_convexTrianglecallback.getAabbMin(),m_convexTrianglecallback.getAabbMax()); + resultOut->refreshContactPoints(); + // restore the buoyant shape + m_rigidCollisionObject->setCollisionShape (tmpShape); +} + +btScalar btHfFluidRigidCollisionAlgorithm::processFluid (const btDispatcherInfo& dispatchInfo, btScalar density, btScalar floatyness) +{ + btRigidBody* rb = btRigidBody::upcast(m_rigidCollisionObject); + btHfFluidColumnRigidBodyCallback columnCallback (rb, dispatchInfo.m_debugDraw, density, floatyness); + m_hfFluid->foreachFluidColumn (&columnCallback, m_convexTrianglecallback.getAabbMin(), m_convexTrianglecallback.getAabbMax()); + return columnCallback.getVolume (); +} + +void btHfFluidRigidCollisionAlgorithm::applyFluidFriction (btScalar mu, btScalar submerged_percentage) +{ + btRigidBody* rb = btRigidBody::upcast(m_rigidCollisionObject); + btScalar dt = btScalar(1.0f/60.0f); + +//#define OLD_WAY +#ifdef OLD_WAY + btScalar radius = btScalar(0.0f); + { + btVector3 aabbMin, aabbMax; + btTransform T; + T.setIdentity(); + rb->getCollisionShape()->getAabb (T, aabbMin, aabbMax); + radius = (aabbMax-aabbMin).length()*btScalar(0.5); + } + btScalar viscosity = btScalar(0.05); + btVector3 force = btScalar(6.0f) * SIMD_PI * viscosity * radius * -rb->getLinearVelocity(); + + btVector3 impulse = force * dt; + rb->applyCentralImpulse (impulse); + + if (true) + { + btVector3 av = rb->getAngularVelocity(); + av *= btScalar(0.99); + rb->setAngularVelocity (av); + } +#else + btScalar scaled_mu = mu * submerged_percentage * btScalar(0.4f); + rb->applyCentralImpulse (dt * scaled_mu * -rb->getLinearVelocity()); + rb->applyTorqueImpulse (dt * scaled_mu * -rb->getAngularVelocity()); +#endif +} + +void btHfFluidRigidCollisionAlgorithm::processCollision (btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut) +{ + processGround (dispatchInfo, resultOut); + btHfFluidBuoyantConvexShape* buoyantShape = (btHfFluidBuoyantConvexShape*)m_rigidCollisionObject->getCollisionShape(); + btRigidBody* rb = btRigidBody::upcast(m_rigidCollisionObject); + if (rb) + { + btScalar mass = btScalar(1.0f) / rb->getInvMass (); + btScalar volume = buoyantShape->getTotalVolume (); + btScalar density = mass / volume; + btScalar floatyness = buoyantShape->getFloatyness (); + btScalar submerged_volume = processFluid (dispatchInfo, density, floatyness); + if (submerged_volume > btScalar(0.0)) + { + btScalar submerged_percentage = submerged_volume/buoyantShape->getTotalVolume(); + //printf("%f\n", submerged_percentage); + btScalar mu = btScalar(6.0f); + applyFluidFriction (mu, submerged_percentage); + } + } +} + +btScalar btHfFluidRigidCollisionAlgorithm::calculateTimeOfImpact(btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut) +{ + return btScalar(1.0); +} diff --git a/BulletPhysics/bulletTrunk/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidRigidCollisionAlgorithm.h b/BulletPhysics/bulletTrunk/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidRigidCollisionAlgorithm.h new file mode 100644 index 00000000..0b69a63b --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidRigidCollisionAlgorithm.h @@ -0,0 +1,81 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. + +Experimental Buoyancy fluid demo written by John McCutchan +*/ + +#ifndef HF_FLUID_RIGID_COLLISION_ALGORITHM_H +#define HF_FLUID_RIGID_COLLISION_ALGORITHM_H + +#include "BulletCollision/BroadphaseCollision/btCollisionAlgorithm.h" +#include "BulletCollision/BroadphaseCollision/btBroadphaseProxy.h" +#include "BulletCollision/CollisionDispatch/btCollisionCreateFunc.h" +#include "BulletCollision/NarrowPhaseCollision/btPersistentManifold.h" +#include "BulletCollision/CollisionDispatch/btCollisionDispatcher.h" +#include "BulletCollision/CollisionShapes/btTriangleCallback.h" +#include "BulletCollision/CollisionDispatch/btConvexConcaveCollisionAlgorithm.h" + +#include "LinearMath/btVector3.h" +class btHfFluid; + +///experimental buyancy fluid demo +/// btHfFluidRigidCollisionAlgorithm provides collision detection between btHfFluid and btRigidBody +class btHfFluidRigidCollisionAlgorithm : public btCollisionAlgorithm +{ + btPersistentManifold* m_manifoldPtr; + + btHfFluid* m_hfFluid; + btCollisionObject* m_rigidCollisionObject; + + ///for rigid versus fluid (instead of fluid versus rigid), we use this swapped boolean + bool m_isSwapped; + + btConvexTriangleCallback m_convexTrianglecallback; + + void processGround (const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut); + void applyFluidFriction (btScalar mu, btScalar submerged_percentage); + btScalar processFluid (const btDispatcherInfo& dispatchInfo, btScalar density, btScalar floatyness); +public: + + btHfFluidRigidCollisionAlgorithm(const btCollisionAlgorithmConstructionInfo& ci,btCollisionObject* col0,btCollisionObject* col1, bool isSwapped); + + virtual ~btHfFluidRigidCollisionAlgorithm(); + + virtual void processCollision (btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut); + + virtual btScalar calculateTimeOfImpact(btCollisionObject* body0,btCollisionObject* body1,const btDispatcherInfo& dispatchInfo,btManifoldResult* resultOut); + + virtual void getAllContactManifolds(btManifoldArray& manifoldArray) + { + manifoldArray.push_back (m_manifoldPtr); + } + + + struct CreateFunc :public btCollisionAlgorithmCreateFunc + { + virtual btCollisionAlgorithm* CreateCollisionAlgorithm(btCollisionAlgorithmConstructionInfo& ci, btCollisionObject* body0,btCollisionObject* body1) + { + void* mem = ci.m_dispatcher1->allocateCollisionAlgorithm(sizeof(btHfFluidRigidCollisionAlgorithm)); + if (!m_swapped) + { + return new(mem) btHfFluidRigidCollisionAlgorithm(ci,body0,body1,false); + } else + { + return new(mem) btHfFluidRigidCollisionAlgorithm(ci,body0,body1,true); + } + } + }; +}; + +#endif //HF_FLUID_RIGID_COLLISION_ALGORITHM_H diff --git a/BulletPhysics/bulletTrunk/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidRigidCollisionConfiguration.cpp b/BulletPhysics/bulletTrunk/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidRigidCollisionConfiguration.cpp new file mode 100644 index 00000000..374ff0d9 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidRigidCollisionConfiguration.cpp @@ -0,0 +1,87 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. + +Experimental Buoyancy fluid demo written by John McCutchan +*/ + +#include "btHfFluidRigidCollisionConfiguration.h" +#include "btHfFluidRigidCollisionAlgorithm.h" +#include "btHfFluidBuoyantShapeCollisionAlgorithm.h" +#include "LinearMath/btPoolAllocator.h" + +btHfFluidRigidCollisionConfiguration::btHfFluidRigidCollisionConfiguration(const btDefaultCollisionConstructionInfo& constructionInfo) +:btDefaultCollisionConfiguration(constructionInfo) +{ + void* mem; + + mem = btAlignedAlloc(sizeof(btHfFluidRigidCollisionAlgorithm::CreateFunc),16); + m_hfFluidRigidConvexCreateFunc = new(mem) btHfFluidRigidCollisionAlgorithm::CreateFunc; + + mem = btAlignedAlloc(sizeof(btHfFluidRigidCollisionAlgorithm::CreateFunc),16); + m_swappedHfFluidRigidConvexCreateFunc = new(mem) btHfFluidRigidCollisionAlgorithm::CreateFunc; + m_swappedHfFluidRigidConvexCreateFunc->m_swapped = true; + + mem = btAlignedAlloc(sizeof(btHfFluidBuoyantShapeCollisionAlgorithm::CreateFunc),16); + m_hfFluidBuoyantShapeCollisionCreateFunc = new(mem) btHfFluidBuoyantShapeCollisionAlgorithm::CreateFunc(m_simplexSolver, m_pdSolver); + + if (m_ownsCollisionAlgorithmPool && m_collisionAlgorithmPool) + { + int curElemSize = m_collisionAlgorithmPool->getElementSize(); + ///calculate maximum element size, big enough to fit any collision algorithm in the memory pool + + int maxSize0 = sizeof(btHfFluidRigidCollisionAlgorithm); + int maxSize1 = 0; + int maxSize2 = 0; + + int collisionAlgorithmMaxElementSize = btMax(maxSize0,maxSize1); + collisionAlgorithmMaxElementSize = btMax(collisionAlgorithmMaxElementSize,maxSize2); + + if (collisionAlgorithmMaxElementSize > curElemSize) + { + m_collisionAlgorithmPool->~btPoolAllocator(); + btAlignedFree(m_collisionAlgorithmPool); + void* mem = btAlignedAlloc(sizeof(btPoolAllocator),16); + m_collisionAlgorithmPool = new(mem) btPoolAllocator(collisionAlgorithmMaxElementSize,constructionInfo.m_defaultMaxCollisionAlgorithmPoolSize); + } + } +} + +btHfFluidRigidCollisionConfiguration::~btHfFluidRigidCollisionConfiguration() +{ + m_hfFluidRigidConvexCreateFunc->~btCollisionAlgorithmCreateFunc(); + m_swappedHfFluidRigidConvexCreateFunc->~btCollisionAlgorithmCreateFunc(); + btAlignedFree(m_hfFluidRigidConvexCreateFunc); + btAlignedFree(m_swappedHfFluidRigidConvexCreateFunc); +} + +btCollisionAlgorithmCreateFunc* btHfFluidRigidCollisionConfiguration::getCollisionAlgorithmCreateFunc(int proxyType0,int proxyType1) +{ + if ((proxyType0 == HFFLUID_SHAPE_PROXYTYPE) && (proxyType1 == HFFLUID_BUOYANT_CONVEX_SHAPE_PROXYTYPE)) + { + return m_hfFluidRigidConvexCreateFunc; + } + + if ((proxyType0 == HFFLUID_BUOYANT_CONVEX_SHAPE_PROXYTYPE) && (proxyType1 == HFFLUID_SHAPE_PROXYTYPE)) + { + return m_swappedHfFluidRigidConvexCreateFunc; + } + + if ((proxyType0 == HFFLUID_BUOYANT_CONVEX_SHAPE_PROXYTYPE) && (proxyType1 == HFFLUID_BUOYANT_CONVEX_SHAPE_PROXYTYPE)) + { + return m_hfFluidBuoyantShapeCollisionCreateFunc; + } + + ///fallback to the regular rigid collision shape + return btDefaultCollisionConfiguration::getCollisionAlgorithmCreateFunc(proxyType0,proxyType1); +} \ No newline at end of file diff --git a/BulletPhysics/bulletTrunk/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidRigidCollisionConfiguration.h b/BulletPhysics/bulletTrunk/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidRigidCollisionConfiguration.h new file mode 100644 index 00000000..e762ee88 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidRigidCollisionConfiguration.h @@ -0,0 +1,47 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. + +Experimental Buoyancy fluid demo written by John McCutchan +*/ + +#ifndef BT_HFFLUID_RIGID_COLLISION_CONFIGURATION +#define BT_HFFLUID_RIGID_COLLISION_CONFIGURATION + +#include "BulletCollision/CollisionDispatch/btDefaultCollisionConfiguration.h" + +class btVoronoiSimplexSolver; +class btGjkEpaPenetrationDepthSolver; + +///experimental buyancy fluid demo +///btSoftBodyRigidBodyCollisionConfiguration add softbody interaction on top of btDefaultCollisionConfiguration +class btHfFluidRigidCollisionConfiguration : public btDefaultCollisionConfiguration +{ + //default CreationFunctions, filling the m_doubleDispatch table + btCollisionAlgorithmCreateFunc* m_hfFluidRigidConvexCreateFunc; + btCollisionAlgorithmCreateFunc* m_swappedHfFluidRigidConvexCreateFunc; + btCollisionAlgorithmCreateFunc* m_hfFluidBuoyantShapeCollisionCreateFunc; + +public: + + btHfFluidRigidCollisionConfiguration(const btDefaultCollisionConstructionInfo& constructionInfo = btDefaultCollisionConstructionInfo()); + + virtual ~btHfFluidRigidCollisionConfiguration(); + + ///creation of soft-soft and soft-rigid, and otherwise fallback to base class implementation + virtual btCollisionAlgorithmCreateFunc* getCollisionAlgorithmCreateFunc(int proxyType0,int proxyType1); + +}; + +#endif //BT_HFFLUID_RIGID_COLLISION_CONFIGURATION + diff --git a/BulletPhysics/bulletTrunk/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidRigidDynamicsWorld.cpp b/BulletPhysics/bulletTrunk/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidRigidDynamicsWorld.cpp new file mode 100644 index 00000000..165de07b --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidRigidDynamicsWorld.cpp @@ -0,0 +1,273 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. + +Experimental Buoyancy fluid demo written by John McCutchan +*/ + +#include +#include "LinearMath/btQuickprof.h" +#include "LinearMath/btIDebugDraw.h" +#include "BulletCollision/CollisionShapes/btCollisionShape.h" + +// height field fluid +#include "btHfFluid.h" +#include "btHfFluidBuoyantConvexShape.h" +#include "btHfFluidRigidDynamicsWorld.h" + + + + +btHfFluidRigidDynamicsWorld::btHfFluidRigidDynamicsWorld(btDispatcher* dispatcher,btBroadphaseInterface* pairCache,btConstraintSolver* constraintSolver,btCollisionConfiguration* collisionConfiguration) +:btDiscreteDynamicsWorld(dispatcher,pairCache,constraintSolver,collisionConfiguration) +{ + m_drawMode = DRAWMODE_NORMAL; + m_bodyDrawMode = BODY_DRAWMODE_NORMAL; +} + +btHfFluidRigidDynamicsWorld::~btHfFluidRigidDynamicsWorld() +{ + +} + +void btHfFluidRigidDynamicsWorld::predictUnconstraintMotion(btScalar timeStep) +{ + btDiscreteDynamicsWorld::predictUnconstraintMotion( timeStep); + + for ( int i=0;ipredictMotion(timeStep); + } +} + +void btHfFluidRigidDynamicsWorld::internalSingleStepSimulation( btScalar timeStep) +{ + btDiscreteDynamicsWorld::internalSingleStepSimulation( timeStep ); + + updateFluids (timeStep); + + solveFluidConstraints (timeStep); +} + +void btHfFluidRigidDynamicsWorld::updateFluids(btScalar timeStep) +{ + BT_PROFILE("updateFluids"); + + for ( int i=0;ipredictMotion (timeStep); + } +} + +void btHfFluidRigidDynamicsWorld::solveFluidConstraints(btScalar timeStep) +{ + BT_PROFILE("solve Fluid Contacts"); + +#if 0 + if(m_hfFluids.size()) + { + btHfFluid::solveClusters(m_hfFluids); + } + + for(int i=0;isolveConstraints(); + } +#endif +} + +void btHfFluidRigidDynamicsWorld::addHfFluid(btHfFluid* body) +{ + m_hfFluids.push_back(body); + + btCollisionWorld::addCollisionObject(body, + btBroadphaseProxy::DefaultFilter, + btBroadphaseProxy::AllFilter); + +} + +void btHfFluidRigidDynamicsWorld::removeHfFluid(btHfFluid* body) +{ + m_hfFluids.remove(body); + + btCollisionWorld::removeCollisionObject(body); +} + +void btHfFluidRigidDynamicsWorld::drawHfFluidGround (btIDebugDraw* debugDraw, btHfFluid* fluid) +{ + const btScalar* ground = fluid->getGroundArray (); + btVector3 com = fluid->getWorldTransform().getOrigin(); + btVector3 color = btVector3(btScalar(0.13f), btScalar(0.13f), btScalar(0.0)); + for (int i = 1; i < fluid->getNumNodesWidth()-1; i++) + { + for (int j = 1; j < fluid->getNumNodesLength()-1; j++) + { + int sw = fluid->arrayIndex (i, j); + int se = fluid->arrayIndex (i+1, j); + int nw = fluid->arrayIndex (i, j+1); + int ne = fluid->arrayIndex (i+1, j+1); + btVector3 swV = btVector3 (fluid->widthPos (i), ground[sw], fluid->lengthPos (j)); + btVector3 seV = btVector3 (fluid->widthPos (i+1), ground[se], fluid->lengthPos (j)); + btVector3 nwV = btVector3 (fluid->widthPos (i), ground[nw], fluid->lengthPos (j+1)); + btVector3 neV = btVector3 (fluid->widthPos (i+1), ground[ne], fluid->lengthPos (j+1)); + debugDraw->drawTriangle (swV+com, seV+com, nwV+com, color, btScalar(1.0f)); + debugDraw->drawTriangle (seV+com, neV+com, nwV+com, color, btScalar(1.0f)); + } + } +} + +void btHfFluidRigidDynamicsWorld::drawHfFluidVelocity (btIDebugDraw* debugDraw, btHfFluid* fluid) +{ + btScalar alpha(0.7f); + const btScalar* height = fluid->getHeightArray (); + btVector3 com = fluid->getWorldTransform().getOrigin(); + btVector3 red = btVector3(btScalar(1.0f), btScalar(0.0f), btScalar(0.0)); + btVector3 green = btVector3(btScalar(0.0f), btScalar(1.0f), btScalar(0.0)); + const bool* flags = fluid->getFlagsArray (); + for (int i = 1; i < fluid->getNumNodesWidth()-1; i++) + { + for (int j = 1; j < fluid->getNumNodesLength()-1; j++) + { + int index = fluid->arrayIndex (i, j); + if (!flags[index]) + continue; + btVector3 from = btVector3 (fluid->widthPos (i), height[index]+btScalar(0.1f), fluid->lengthPos (j)); + btVector3 velocity; + velocity.setX (fluid->getVelocityUArray()[index]); + velocity.setY (btScalar(0.0f)); + velocity.setZ (fluid->getVelocityVArray()[index]); + velocity.normalize(); + btVector3 to = from + velocity; + + debugDraw->drawLine (from+com, to+com, red, green); + } + } +} + +void btHfFluidRigidDynamicsWorld::drawHfFluidBuoyantConvexShape (btIDebugDraw* debugDrawer, btCollisionObject* object, btHfFluidBuoyantConvexShape* buoyantShape, int voxelDraw) +{ + if (voxelDraw) + { + btTransform xform = object->getWorldTransform(); + for (int i = 0; i < buoyantShape->getNumVoxels(); i++) + { + btVector3 p = buoyantShape->getVoxelPositionsArray()[i]; + p = xform.getBasis() * p; + p += xform.getOrigin(); + debugDrawer->drawSphere (p, buoyantShape->getVoxelRadius(), btVector3(1.0, 0.0, 0.0)); + } + } else { + btVector3 color(btScalar(255.),btScalar(255.),btScalar(255.)); + switch(object->getActivationState()) + { + case ACTIVE_TAG: + color = btVector3(btScalar(255.),btScalar(255.),btScalar(255.)); break; + case ISLAND_SLEEPING: + color = btVector3(btScalar(0.),btScalar(255.),btScalar(0.));break; + case WANTS_DEACTIVATION: + color = btVector3(btScalar(0.),btScalar(255.),btScalar(255.));break; + case DISABLE_DEACTIVATION: + color = btVector3(btScalar(255.),btScalar(0.),btScalar(0.));break; + case DISABLE_SIMULATION: + color = btVector3(btScalar(255.),btScalar(255.),btScalar(0.));break; + default: + { + color = btVector3(btScalar(255.),btScalar(0.),btScalar(0.)); + } + }; + + btConvexShape* convexShape = ((btHfFluidBuoyantConvexShape*)object->getCollisionShape())->getConvexShape(); + debugDrawObject(object->getWorldTransform(),(btCollisionShape*)convexShape,color); + } +} + +void btHfFluidRigidDynamicsWorld::drawHfFluidNormal (btIDebugDraw* debugDraw, btHfFluid* fluid) +{ + int colIndex = 0; + btVector3 col[2]; + col[0] = btVector3(btScalar(0.0f), btScalar(0.0f), btScalar(1.0)); + col[1] = btVector3(btScalar(0.0f), btScalar(0.5f), btScalar(0.5)); + btScalar alpha(0.7f); + const btScalar* height = fluid->getHeightArray (); + const btScalar* eta = fluid->getEtaArray (); + const btScalar* ground = fluid->getGroundArray (); + btVector3 com = fluid->getWorldTransform().getOrigin(); + const bool* flags = fluid->getFlagsArray (); + for (int i = 0; i < fluid->getNumNodesWidth()-1; i++) + { + for (int j = 0; j < fluid->getNumNodesLength()-1; j++) + { + int sw = fluid->arrayIndex (i, j); + int se = fluid->arrayIndex (i+1, j); + int nw = fluid->arrayIndex (i, j+1); + int ne = fluid->arrayIndex (i+1, j+1); + + btScalar h = eta[sw]; + btScalar g = ground[sw]; + + if (h < btScalar(0.05f)) + continue; + + if (h <= btScalar(0.01f)) + continue; + + btVector3 boxMin = btVector3(fluid->widthPos (i), g, fluid->lengthPos(j)); + btVector3 boxMax = btVector3(fluid->widthPos(i+1), g+h, fluid->lengthPos(j+1)); + boxMin += com; + boxMax += com; + + debugDraw->drawBox (boxMin, boxMax, btVector3(btScalar(0.0f), btScalar(0.0f), btScalar(1.0f)), btScalar(1.0f)); + } + } +} + +void btHfFluidRigidDynamicsWorld::debugDrawWorld() +{ + if (getDebugDrawer()) + { + int i; + for ( i=0;im_hfFluids.size();i++) + { + btHfFluid* phh=(btHfFluid*)this->m_hfFluids[i]; + switch (m_drawMode) + { + case DRAWMODE_NORMAL: + drawHfFluidGround (m_debugDrawer, phh); + //drawHfFluidNormal (m_debugDrawer, phh); + break; + case DRAWMODE_VELOCITY: + drawHfFluidGround (m_debugDrawer, phh); + //drawHfFluidNormal (m_debugDrawer, phh); + drawHfFluidVelocity (m_debugDrawer, phh); + break; + default: + btAssert (0); + break; + } + } + for (i = 0; i < this->m_collisionObjects.size(); i++) + { + btCollisionShape* shape = m_collisionObjects[i]->getCollisionShape(); + if (shape->getShapeType() == HFFLUID_BUOYANT_CONVEX_SHAPE_PROXYTYPE) + { + btHfFluidBuoyantConvexShape* buoyantShape = (btHfFluidBuoyantConvexShape*)shape; + drawHfFluidBuoyantConvexShape (m_debugDrawer, m_collisionObjects[i], buoyantShape, m_bodyDrawMode); + } + } + } + btDiscreteDynamicsWorld::debugDrawWorld(); +} diff --git a/BulletPhysics/bulletTrunk/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidRigidDynamicsWorld.h b/BulletPhysics/bulletTrunk/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidRigidDynamicsWorld.h new file mode 100644 index 00000000..6dfa487c --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/HeightFieldFluidDemo/BulletHfFluid/btHfFluidRigidDynamicsWorld.h @@ -0,0 +1,92 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. + +Experimental Buoyancy fluid demo written by John McCutchan +*/ + +#include "BulletDynamics/Dynamics/btDiscreteDynamicsWorld.h" + +#ifndef BT_HFFLUID_RIGID_DYNAMICS_WORLD_H +#define BT_HFFLUID_RIGID_DYNAMICS_WORLD_H + +class btHfFluid; +typedef btAlignedObjectArray btHfFluidArray; + +#define DRAWMODE_NORMAL 0 +#define DRAWMODE_VELOCITY 1 +#define DRAWMODE_MAX 2 + +#define BODY_DRAWMODE_NORMAL 0 +#define BODY_DRAWMODE_VOXEL 1 +#define BODY_DRAWMODE_MAX 2 + +class btHfFluidBuoyantConvexShape; + +///experimental buyancy fluid demo +class btHfFluidRigidDynamicsWorld : public btDiscreteDynamicsWorld +{ + + btHfFluidArray m_hfFluids; + int m_drawMode; + int m_bodyDrawMode; +protected: + + virtual void predictUnconstraintMotion(btScalar timeStep); + + virtual void internalSingleStepSimulation( btScalar timeStep); + + void updateFluids(btScalar timeStep); + + void solveFluidConstraints(btScalar timeStep); + + virtual void debugDrawWorld(); + + void drawHfFluidGround (btIDebugDraw* debugDraw, btHfFluid* fluid); + void drawHfFluidVelocity (btIDebugDraw* debugDraw, btHfFluid* fluid); + void drawHfFluidBuoyantConvexShape (btIDebugDraw* debugDrawer, btCollisionObject* object, btHfFluidBuoyantConvexShape* buoyantShape, int voxelDraw); + void drawHfFluidNormal (btIDebugDraw* debugDraw, btHfFluid* fluid); +public: + + btHfFluidRigidDynamicsWorld(btDispatcher* dispatcher,btBroadphaseInterface* pairCache,btConstraintSolver* constraintSolver,btCollisionConfiguration* collisionConfiguration); + + virtual ~btHfFluidRigidDynamicsWorld(); + + + void addHfFluid(btHfFluid* fluid); + + void removeHfFluid(btHfFluid* fluid); + + void setDrawMode (int drawMode) + { + m_drawMode = drawMode; + } + + void setBodyDrawMode (int bodyDrawMode) + { + m_bodyDrawMode = bodyDrawMode; + } + + btHfFluidArray& getHfFluidArray() + { + return m_hfFluids; + } + + const btHfFluidArray& getHfFluidArray() const + { + return m_hfFluids; + } + +}; + +#endif //BT_HFFLUID_RIGID_DYNAMICS_WORLD_H diff --git a/BulletPhysics/bulletTrunk/Demos/HeightFieldFluidDemo/CMakeLists.txt b/BulletPhysics/bulletTrunk/Demos/HeightFieldFluidDemo/CMakeLists.txt new file mode 100644 index 00000000..5c250500 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/HeightFieldFluidDemo/CMakeLists.txt @@ -0,0 +1,35 @@ +# This is basically the overall name of the project in Visual Studio this is the name of the Solution File + + +# For every executable you have with a main method you should have an add_executable line below. +# For every add executable line you should list every .cpp and .h file you have associated with that executable. + + + + +# You shouldn't have to modify anything below this line +######################################################## + + + +INCLUDE_DIRECTORIES( +${BULLET_PHYSICS_SOURCE_DIR}/src ${BULLET_PHYSICS_SOURCE_DIR}/Demos/OpenGL } +) + +LINK_LIBRARIES( +OpenGLSupport BulletDynamics BulletCollision LinearMath ${GLUT_glut_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} +) + +ADD_EXECUTABLE(HfFluidDemo + HfFluidDemo_GL_ShapeDrawer.cpp + BulletHfFluid/btHfFluid.cpp + BulletHfFluid/btHfFluidBuoyantConvexShape.cpp + BulletHfFluid/btHfFluidBuoyantShapeCollisionAlgorithm.cpp + BulletHfFluid/btHfFluidCollisionShape.cpp + BulletHfFluid/btHfFluidRigidCollisionAlgorithm.cpp + BulletHfFluid/btHfFluidRigidCollisionConfiguration.cpp + BulletHfFluid/btHfFluidRigidDynamicsWorld.cpp + main.cpp + HfFluidDemo.cpp +) + diff --git a/BulletPhysics/bulletTrunk/Demos/HeightFieldFluidDemo/HfFluidDemo.cpp b/BulletPhysics/bulletTrunk/Demos/HeightFieldFluidDemo/HfFluidDemo.cpp new file mode 100644 index 00000000..1da02925 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/HeightFieldFluidDemo/HfFluidDemo.cpp @@ -0,0 +1,1458 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. + +Experimental Buoyancy fluid demo written by John McCutchan +*/ + +#include "btBulletDynamicsCommon.h" + +#include "BulletHfFluid/btHfFluidRigidDynamicsWorld.h" +#include "BulletHfFluid/btHfFluid.h" +#include "BulletHfFluid/btHfFluidRigidCollisionConfiguration.h" +#include "BulletHfFluid/btHfFluidBuoyantConvexShape.h" +#include "BulletCollision/CollisionDispatch/btSphereSphereCollisionAlgorithm.h" +#include "BulletCollision/NarrowPhaseCollision/btGjkEpa2.h" +#include "LinearMath/btQuickprof.h" +#include "LinearMath/btIDebugDraw.h" +#include "LinearMath/btRandom.h" +#include "BMF_Api.h" +#include //printf debugging +#include "LinearMath/btConvexHull.h" + +#include "HfFluidDemo.h" +#include "GL_ShapeDrawer.h" +#include "HfFluidDemo_GL_ShapeDrawer.h" + +#include "GlutStuff.h" + +extern float eye[3]; +extern int glutScreenWidth; +extern int glutScreenHeight; + +const int maxProxies = 32766; +const int maxOverlap = 65535; + +static btVector3* gGroundVertices=0; +static int* gGroundIndices=0; +static btBvhTriangleMeshShape* trimeshShape =0; +static btRigidBody* staticBody = 0; +static float waveheight = 5.f; + +const float TRIANGLE_SIZE=8.f; + +#define ARRAY_SIZE_X 1 +#define ARRAY_SIZE_Y 1 +#define ARRAY_SIZE_Z 1 + +//maximum number of objects (and allow user to shoot additional boxes) +#define MAX_PROXIES (ARRAY_SIZE_X*ARRAY_SIZE_Y*ARRAY_SIZE_Z + 1024) + +#define START_POS_X 5 +#define START_POS_Y -5 +#define START_POS_Z 3 + +unsigned int current_draw_mode=DRAWMODE_NORMAL; +unsigned int current_body_draw_mode = 0; +unsigned current_demo=0; + +void Init_Floatyness (HfFluidDemo* fluidDemo) +{ + btHfFluid* fluid = NULL; + + fluid = new btHfFluid (btScalar(0.25), 100, 100); + btTransform xform; + xform.setIdentity (); + xform.getOrigin() = btVector3(btScalar(-10.0), btScalar(-5.0), btScalar(-10.0)); + fluid->setWorldTransform (xform); + fluid->setHorizontalVelocityScale (btScalar(0.0f)); + fluid->setVolumeDisplacementScale (btScalar(0.0f)); + fluidDemo->getHfFluidDynamicsWorld()->addHfFluid (fluid); + + for (int i = 0; i < fluid->getNumNodesLength()*fluid->getNumNodesWidth(); i++) + { + fluid->setFluidHeight(i, btScalar(5.0f)); + } + + fluid->prep (); + + const int numObjects = 5; + btScalar floatyness = btScalar(1.0f); + btScalar dfloatyness = btScalar(0.25f); + btScalar start_x = btScalar(-5.0f); + btScalar step_x = btScalar(3.0f); + btScalar start_z = btScalar(-5.0f); + for (int i = 0; i < numObjects; i++) + { + //btConvexShape* colShape = new btBoxShape(btVector3(1.0, 1.0, 1.0)); + btConvexShape* colShape = new btSphereShape(btScalar(1.)); + btHfFluidBuoyantConvexShape* buoyantShape = new btHfFluidBuoyantConvexShape(colShape); + buoyantShape->generateShape (btScalar(0.25f), btScalar(0.05f)); + buoyantShape->setFloatyness (floatyness + dfloatyness * i); + fluidDemo->m_collisionShapes.push_back (buoyantShape); + + btTransform startTransform; + startTransform.setIdentity(); + + btScalar mass(1.f); + + btVector3 localInertia(0,0,0); + colShape->calculateLocalInertia(mass,localInertia); + + btVector3 origin = btVector3(step_x * i + start_x, 7.5f, start_z); + startTransform.setOrigin(origin); + + //using motionstate is recommended, it provides interpolation capabilities, and only synchronizes 'active' objects + btDefaultMotionState* myMotionState = new btDefaultMotionState(startTransform); + btRigidBody::btRigidBodyConstructionInfo rbInfo(mass,myMotionState,buoyantShape,localInertia); + btRigidBody* body = new btRigidBody(rbInfo); + fluidDemo->getHfFluidDynamicsWorld()->addRigidBody(body); + } + floatyness = btScalar(2.0f); + start_z = btScalar(5.0f); + for (int i = 0; i < numObjects; i++) + { + //btConvexShape* colShape = new btBoxShape(btVector3(1.0, 1.0, 1.0)); + btConvexShape* colShape = new btSphereShape(btScalar(1.)); + btHfFluidBuoyantConvexShape* buoyantShape = new btHfFluidBuoyantConvexShape(colShape); + buoyantShape->generateShape (btScalar(0.25f), btScalar(0.05f)); + buoyantShape->setFloatyness (floatyness + dfloatyness * i); + fluidDemo->m_collisionShapes.push_back (buoyantShape); + + btTransform startTransform; + startTransform.setIdentity(); + + btScalar mass(1.f); + + btVector3 localInertia(0,0,0); + colShape->calculateLocalInertia(mass,localInertia); + + btVector3 origin = btVector3(step_x * i + start_x, -4.0f, start_z); + startTransform.setOrigin(origin); + + //using motionstate is recommended, it provides interpolation capabilities, and only synchronizes 'active' objects + btDefaultMotionState* myMotionState = new btDefaultMotionState(startTransform); + btRigidBody::btRigidBodyConstructionInfo rbInfo(mass,myMotionState,buoyantShape,localInertia); + btRigidBody* body = new btRigidBody(rbInfo); + fluidDemo->getHfFluidDynamicsWorld()->addRigidBody(body); + } +} + +void Init_Bowl (HfFluidDemo* fluidDemo) +{ + btHfFluid* fluid = NULL; + + fluid = new btHfFluid (btScalar(1.0), 50, 50); + btTransform xform; + xform.setIdentity (); + xform.getOrigin() = btVector3(btScalar(-10.0), btScalar(-5.0), btScalar(-10.0)); + fluid->setWorldTransform (xform); + fluidDemo->getHfFluidDynamicsWorld()->addHfFluid (fluid); + + btScalar* ground = fluid->getGroundArray(); + btScalar* eta = fluid->getEtaArray(); + btScalar amplitude = btScalar(200.0); + for (int i = 0; i < fluid->getNumNodesWidth(); i++) + { + btScalar x = btScalar(i - fluid->getNumNodesWidth()/2)/btScalar(fluid->getNumNodesWidth()*2); + btScalar xh = amplitude * (x * x) + btScalar(5.0); + for (int j = 0; j < fluid->getNumNodesLength(); j++) + { + btScalar y = btScalar(j - fluid->getNumNodesLength()/2)/btScalar(fluid->getNumNodesLength()*2); + btScalar yh = amplitude * (y * y) + btScalar(5.0); + btScalar gHeight = btMax(xh,yh); + int index = fluid->arrayIndex (i, j); + ground[index] = gHeight; + btScalar wHeight = btScalar(0.0f); + if (gHeight > 14.0) + { + wHeight = btScalar(0.0f); + } else { + wHeight = btScalar(14.0f) - gHeight; + } + eta[index] = wHeight; } + } + + fluid->prep (); + + { + //create a few dynamic rigidbodies + // Re-using the same collision is better for memory usage and performance + + btConvexShape* colShape = new btBoxShape(btVector3(1,1,1)); + btHfFluidBuoyantConvexShape* buoyantShape = new btHfFluidBuoyantConvexShape(colShape); + buoyantShape->generateShape (btScalar(0.25f), btScalar(0.05f)); + //btCollisionShape* colShape = new btSphereShape(btScalar(1.)); + fluidDemo->m_collisionShapes.push_back(colShape); + fluidDemo->m_collisionShapes.push_back (buoyantShape); + + /// Create Dynamic Objects + btTransform startTransform; + startTransform.setIdentity(); + + btScalar mass(1.f); + + //rigidbody is dynamic if and only if mass is non zero, otherwise static + bool isDynamic = (mass != 0.f); + + btVector3 localInertia(0,0,0); + if (isDynamic) + colShape->calculateLocalInertia(mass,localInertia); + + float start_x = START_POS_X - ARRAY_SIZE_X/2; + float start_y = START_POS_Y; + float start_z = START_POS_Z - ARRAY_SIZE_Z/2; + + for (int k=0;kgetHfFluidDynamicsWorld()->addRigidBody(body); + } + } + } + } +} + +void Init_Drops (HfFluidDemo* fluidDemo) +{ + btHfFluid* fluid = NULL; + + fluid = new btHfFluid (btScalar(0.5), 50, 50); + btTransform xform; + xform.setIdentity (); + xform.getOrigin() = btVector3(btScalar(-10.0), btScalar(-5.0), btScalar(-10.0)); + fluid->setWorldTransform (xform); + fluidDemo->getHfFluidDynamicsWorld()->addHfFluid (fluid); + + for (int i = 0; i < fluid->getNumNodesLength()*fluid->getNumNodesWidth(); i++) + { + fluid->setFluidHeight(i, btScalar(5.0f)); + } + + fluid->prep (); + { + //create a few dynamic rigidbodies + // Re-using the same collision is better for memory usage and performance + + btConvexShape* colShape = new btBoxShape(btVector3(5,0.5,5)); + btHfFluidBuoyantConvexShape* buoyantShape = new btHfFluidBuoyantConvexShape(colShape); + buoyantShape->generateShape (btScalar(0.25f), btScalar(0.05f)); + //btCollisionShape* colShape = new btSphereShape(btScalar(1.)); + fluidDemo->m_collisionShapes.push_back(colShape); + fluidDemo->m_collisionShapes.push_back (buoyantShape); + + /// Create Dynamic Objects + btTransform startTransform; + startTransform.setIdentity(); + + btScalar mass(1.f); + + //rigidbody is dynamic if and only if mass is non zero, otherwise static + bool isDynamic = (mass != 0.f); + + btVector3 localInertia(0,0,0); + if (isDynamic) + colShape->calculateLocalInertia(mass,localInertia); + + float start_x = START_POS_X - ARRAY_SIZE_X/2; + float start_y = START_POS_Y; + float start_z = START_POS_Z - ARRAY_SIZE_Z/2; + + for (int k=0;kgetHfFluidDynamicsWorld()->addRigidBody(body); + } + } + } + } +} + +void Init_Wave (HfFluidDemo* fluidDemo) +{ + btHfFluid* fluid = NULL; + + fluid = new btHfFluid (btScalar(1.0f), 75, 50); + btTransform xform; + xform.setIdentity (); + xform.getOrigin() = btVector3(btScalar(-50.0), btScalar(-5.0), btScalar(-50.0)); + fluid->setWorldTransform (xform); + fluidDemo->getHfFluidDynamicsWorld()->addHfFluid (fluid); + + for (int i = 0; i < fluid->getNumNodesLength()*fluid->getNumNodesWidth(); i++) + { + fluid->getEtaArray()[i] = btScalar(10.0f); + } + + for (int i = 1; i < fluid->getNumNodesWidth()-1; i++) + { + fluid->getEtaArray()[fluid->arrayIndex (i, fluid->getNumNodesLength()/2-1)] = btScalar (2.0); + fluid->getEtaArray()[fluid->arrayIndex (i, fluid->getNumNodesLength()/2)] = btScalar (2.0); + fluid->getEtaArray()[fluid->arrayIndex (i, fluid->getNumNodesLength()/2+1)] = btScalar (2.0); + } + + fluid->prep (); +} + +void Init_RandomDrops (HfFluidDemo* fluidDemo) +{ + btHfFluid* fluid = NULL; + + fluid = new btHfFluid (btScalar(1.0),75, 50); + btTransform xform; + xform.setIdentity (); + xform.getOrigin() = btVector3(btScalar(-50.0), btScalar(-5.0), btScalar(-50.0)); + fluid->setWorldTransform (xform); + fluidDemo->getHfFluidDynamicsWorld()->addHfFluid (fluid); + for (int i = 0; i < fluid->getNumNodesLength()*fluid->getNumNodesWidth(); i++) + { + fluid->getEtaArray()[i] = btScalar(0.0f); + } + fluid->prep (); +} + +void Init_FillPool (HfFluidDemo* fluidDemo) +{ + btHfFluid* fluid = NULL; + const int gridLength = 50; + const int gridWidth = 50; + fluid = new btHfFluid (btScalar(1.0), gridLength, gridWidth); + btTransform xform; + xform.setIdentity (); + xform.getOrigin() = btVector3(btScalar(-20.0), btScalar(-5.0), btScalar(-20.0)); + fluid->setWorldTransform (xform); + fluidDemo->getHfFluidDynamicsWorld()->addHfFluid (fluid); + + btScalar* ground = fluid->getGroundArray(); + btScalar* eta = fluid->getEtaArray(); + + const btScalar poolEdgeHeight = btScalar(10.0f); + const btScalar poolBottomHeight = btScalar(1.0f); + const btScalar poolPourerHeight = btScalar(6.0f); + for (int j = 1; j < fluid->getNumNodesLength()-1; j++) + { + for (int i = 1; i < fluid->getNumNodesWidth()-1; i++) + { + int index = fluid->arrayIndex (i, j); + // pool edge + if (j == 1 || i == 1 || j == fluid->getNumNodesLength()-2 || i == fluid->getNumNodesWidth()-2) + { + ground[index] = poolEdgeHeight; + continue; + } + if (j > 35) + { + if (i <= 25 || i >= 30) + { + ground[index] = poolEdgeHeight; + } else { + ground[index] = poolPourerHeight; + } + continue; + } + ground[index] = poolBottomHeight; + //eta[index] = btScalar(3.0f); + } + } + fluid->prep (); + + { + btConvexShape* colShape = new btBoxShape(btVector3(btScalar(1.), btScalar(1.), btScalar(1.))); + btHfFluidBuoyantConvexShape* buoyantShape = new btHfFluidBuoyantConvexShape(colShape); + buoyantShape->generateShape (btScalar(0.25f), btScalar(0.05f)); + fluidDemo->m_collisionShapes.push_back(colShape); + fluidDemo->m_collisionShapes.push_back(buoyantShape); + + /// Create Dynamic Objects + btTransform startTransform; + startTransform.setIdentity(); + + btScalar mass(1.f); + + //rigidbody is dynamic if and only if mass is non zero, otherwise static + bool isDynamic = (mass != 0.f); + + btVector3 localInertia(0,0,0); + if (isDynamic) + colShape->calculateLocalInertia(mass,localInertia); + + int gridSize = 2; + btScalar startPosX = btScalar(-10.0f); + btScalar startPosY = btScalar(2.0f); + btScalar startPosZ = btScalar(-10.f); + float start_x = startPosX - gridSize/2; + float start_y = startPosY; + float start_z = startPosZ - gridSize/2; + + for (int k=0;kgetHfFluidDynamicsWorld()->addRigidBody(body); + } + } + } + } +} + +void Run_FillPool (HfFluidDemo* fluidDemo) +{ + static btScalar dtSinceLastDrop = btScalar(0.0f); + btScalar dt = btScalar(1.0/60.); + btHfFluidArray& fluids = fluidDemo->getHfFluidDynamicsWorld ()->getHfFluidArray (); + btHfFluid* fluid = fluids[0]; + + for (int i = 26; i < 30; i++) + { + fluid->setFluidHeight (i, fluid->getNumNodesLength()-3, btScalar(3.0f)); + } +} + + +void Run_RandomDrops (HfFluidDemo* fluidDemo) +{ + static btScalar dtSinceLastDrop = btScalar(0.0f); + btScalar dt = btScalar(1.0/60.); + + + btHfFluidArray& fluids = fluidDemo->getHfFluidDynamicsWorld ()->getHfFluidArray (); + btHfFluid* fluid = fluids[0]; + + if (dtSinceLastDrop > btScalar(0.5f)) + { + dtSinceLastDrop = btScalar(0.0f); + int randomXNode = GEN_rand () % (fluid->getNumNodesWidth()-2); + int randomZNode = GEN_rand () % (fluid->getNumNodesLength()-2); + if (randomXNode <= 1) + randomXNode = 2; + if (randomZNode <= 1) + randomZNode = 2; + + btScalar* eta = fluid->getEtaArray (); + btScalar* height = fluid->getHeightArray (); + const btScalar* ground = fluid->getGroundArray (); + bool* flags = fluid->getFlagsArray(); + int index = fluid->arrayIndex (randomXNode, randomZNode); + eta[index] += btScalar(4.5f); + eta[index-1] += btScalar(2.25f); + eta[index+1] += btScalar(2.25f); + eta[index+fluid->getNumNodesWidth()] += btScalar(2.25f); + eta[index-fluid->getNumNodesWidth()] += btScalar(2.25f); + height[index] = eta[index] + ground[index]; + height[index-1] = eta[index-1] + ground[index-1]; + height[index+1] = eta[index+1] + ground[index+1]; + height[index+fluid->getNumNodesWidth()] = eta[index+fluid->getNumNodesWidth()] + ground[index+fluid->getNumNodesWidth()]; + height[index-fluid->getNumNodesWidth()] = eta[index-fluid->getNumNodesWidth()] + ground[index-fluid->getNumNodesWidth()]; + flags[index] = true; + flags[index-1] = true; + flags[index+1] = true; + flags[index+fluid->getNumNodesWidth()] = true; + flags[index-fluid->getNumNodesWidth()] = true; + } else { + dtSinceLastDrop += dt; + } +} + +void Init_Fill (HfFluidDemo* fluidDemo) +{ + btHfFluid* fluid = NULL; + + fluid = new btHfFluid (btScalar(1.0f), 75, 50); + btTransform xform; + xform.setIdentity (); + xform.getOrigin() = btVector3(btScalar(-50.0), btScalar(-5.0), btScalar(-50.0)); + fluid->setWorldTransform (xform); + fluidDemo->getHfFluidDynamicsWorld()->addHfFluid (fluid); + for (int i = 0; i < fluid->getNumNodesLength()*fluid->getNumNodesWidth(); i++) + { + fluid->getEtaArray()[i] = btScalar(0.0f); + } + fluid->prep (); +} + +void Run_Fill (HfFluidDemo* fluidDemo) +{ + static btScalar dtSinceLastDrop = btScalar(0.0f); + btScalar dt = btScalar(1.0/60.); + + btHfFluidArray& fluids = fluidDemo->getHfFluidDynamicsWorld ()->getHfFluidArray (); + btHfFluid* fluid = fluids[0]; + + if (dtSinceLastDrop > btScalar(0.25f)) + { + dtSinceLastDrop = btScalar(0.0f); + + btScalar* eta = fluid->getEtaArray (); + btScalar* velocityU = fluid->getVelocityUArray (); + btScalar* velocityV = fluid->getVelocityVArray (); + btScalar* height = fluid->getHeightArray (); + const btScalar* ground = fluid->getGroundArray (); + bool* flags = fluid->getFlagsArray(); + int index = fluid->arrayIndex (fluid->getNumNodesWidth()/2, fluid->getNumNodesLength()/2); + eta[index] += btScalar(4.5f); + eta[index-1] += btScalar(2.25f); + eta[index+1] += btScalar(2.25f); + eta[index+fluid->getNumNodesWidth()] += btScalar(2.25f); + eta[index-fluid->getNumNodesWidth()] += btScalar(2.25f); + + velocityU[index] = btScalar(0.0f); + velocityU[index-1] = btScalar(-10.0f); + velocityU[index+1] = btScalar(10.0f); + velocityU[index+fluid->getNumNodesWidth()] = btScalar(0.0f); + velocityU[index-fluid->getNumNodesWidth()] = btScalar(0.0f); + + velocityV[index] = btScalar(0.0f); + velocityV[index-1] = btScalar(0.0f); + velocityV[index+1] = btScalar(0.0f); + velocityV[index+fluid->getNumNodesWidth()] = btScalar(10.0f); + velocityV[index-fluid->getNumNodesWidth()] = btScalar(-10.0f); + + height[index] = eta[index] + ground[index]; + height[index-1] = eta[index-1] + ground[index-1]; + height[index+1] = eta[index+1] + ground[index+1]; + height[index+fluid->getNumNodesWidth()] = eta[index+fluid->getNumNodesWidth()] + ground[index+fluid->getNumNodesWidth()]; + height[index-fluid->getNumNodesWidth()] = eta[index-fluid->getNumNodesWidth()] + ground[index-fluid->getNumNodesWidth()]; + flags[index] = true; + flags[index-1] = true; + flags[index+1] = true; + flags[index+fluid->getNumNodesWidth()] = true; + flags[index-fluid->getNumNodesWidth()] = true; + } else { + dtSinceLastDrop += dt; + } + +} + +void Init_BlockWave (HfFluidDemo* fluidDemo) +{ + btHfFluid* fluid = NULL; + + fluid = new btHfFluid (btScalar(1.0), 75, 50); + btTransform xform; + xform.setIdentity (); + xform.getOrigin() = btVector3(btScalar(-50.0), btScalar(-5.0), btScalar(-50.0)); + fluid->setWorldTransform (xform); + fluidDemo->getHfFluidDynamicsWorld()->addHfFluid (fluid); + + btScalar* eta = fluid->getEtaArray (); + + for (int i = 0; i < fluid->getNumNodesLength() * fluid->getNumNodesWidth(); i++) + { + eta[i] = btScalar(12.0f); + } + + for (int i = fluid->getNumNodesWidth()/8; i < fluid->getNumNodesWidth()/4; i++) + { + for (int j = fluid->getNumNodesLength()/8; j < fluid->getNumNodesLength()/4; j++) + { + int index = fluid->arrayIndex(i, j); + eta[index] = btScalar(4.0f); + } + } + fluid->prep (); + + { + btConvexShape* colShape = new btSphereShape(btScalar(1.)); + btHfFluidBuoyantConvexShape* buoyantShape = new btHfFluidBuoyantConvexShape(colShape); + buoyantShape->generateShape (btScalar(0.25f), btScalar(0.05f)); + fluidDemo->m_collisionShapes.push_back(buoyantShape); + fluidDemo->m_collisionShapes.push_back(colShape); + + /// Create Dynamic Objects + btTransform startTransform; + startTransform.setIdentity(); + + btScalar mass(1.f); + + //rigidbody is dynamic if and only if mass is non zero, otherwise static + bool isDynamic = (mass != 0.f); + + btVector3 localInertia(0,0,0); + if (isDynamic) + colShape->calculateLocalInertia(mass,localInertia); + + int gridSize = 2; + btScalar startPosX = btScalar(-10.0f); + btScalar startPosY = btScalar(2.0f); + btScalar startPosZ = btScalar(-10.f); + float start_x = startPosX - gridSize/2; + float start_y = startPosY; + float start_z = startPosZ - gridSize/2; + + for (int k=0;kgetHfFluidDynamicsWorld()->addRigidBody(body); + } + } + } + } +} + +void Init_Ground (HfFluidDemo* fluidDemo) +{ + btHfFluid* fluid = NULL; + + fluid = new btHfFluid (btScalar(1.0f),75, 50); + btTransform xform; + xform.setIdentity (); + xform.getOrigin() = btVector3(btScalar(-50.0), btScalar(5.0), btScalar(-50.0)); + fluid->setWorldTransform (xform); + fluidDemo->getHfFluidDynamicsWorld()->addHfFluid (fluid); + + btScalar* eta = fluid->getEtaArray (); + + for (int i = 0; i < fluid->getNumNodesLength() * fluid->getNumNodesWidth(); i++) + { + eta[i] = btScalar(4.0f); + } + + btScalar* ground = fluid->getGroundArray (); + for (int i = 0; i < fluid->getNumNodesWidth(); i++) + { + for (int j = 0; j < fluid->getNumNodesLength(); j++) + { + int index = fluid->arrayIndex (i, j); + + if (j <= fluid->getNumNodesLength()/2) + { + + ground[index] = btScalar(5.0f); + } else if (j > (fluid->getNumNodesLength()/8*6)) { + ground[index] = btScalar(0.0f); + } else { + ground[index] = btScalar(6.5f); + } + + if (j <= fluid->getNumNodesLength()/4 && j > fluid->getNumNodesLength()/8) + { + eta[index] = btScalar(8.0f); + } else if (j <= fluid->getNumNodesLength()/8) + { + eta[index] = btScalar(20.0f); + } else { + eta[index] = btScalar(0.0f); + } + + } + } + fluid->prep (); +} + +void Init_Ground2 (HfFluidDemo* fluidDemo) +{ + btHfFluid* fluid = NULL; + + fluid = new btHfFluid (btScalar(1.0f), 75, 50); + btTransform xform; + xform.setIdentity (); + xform.getOrigin() = btVector3(btScalar(-50.0), btScalar(5.0), btScalar(-50.0)); + fluid->setWorldTransform (xform); + fluidDemo->getHfFluidDynamicsWorld()->addHfFluid (fluid); + + btScalar* eta = fluid->getEtaArray (); + + for (int i = 0; i < fluid->getNumNodesLength() * fluid->getNumNodesWidth(); i++) + { + eta[i] = btScalar(4.0f); + } + + btScalar* ground = fluid->getGroundArray (); + for (int i = 0; i < fluid->getNumNodesWidth(); i++) + { + for (int j = 0; j < fluid->getNumNodesLength(); j++) + { + int index = fluid->arrayIndex (i, j); + + ground[index] = (btScalar(j)/fluid->getNumNodesLength()-1)*btScalar(8.0f); + } + } + + for (int i = 0; i < fluid->getNumNodesLength() * fluid->getNumNodesWidth(); i++) + { + eta[i] = btScalar(2.0f); + } + + for (int i = fluid->getNumNodesWidth()/8; i < fluid->getNumNodesWidth()/4; i++) + { + for (int j = fluid->getNumNodesLength()/8; j < fluid->getNumNodesLength()/4; j++) + { + int index = fluid->arrayIndex(i, j); + eta[index] = btScalar(8.0f); + } + } + fluid->prep (); +} + +void Init_Fill2 (HfFluidDemo* fluidDemo) +{ + btHfFluid* fluid = NULL; + + fluid = new btHfFluid (btScalar(1.0), 100, 100); + btTransform xform; + xform.setIdentity (); + xform.getOrigin() = btVector3(btScalar(-50.0), btScalar(-5.0), btScalar(-50.0)); + fluid->setWorldTransform (xform); + fluidDemo->getHfFluidDynamicsWorld()->addHfFluid (fluid); + for (int i = 0; i < fluid->getNumNodesLength()*fluid->getNumNodesWidth(); i++) + { + fluid->getEtaArray()[i] = btScalar(0.0f); + } + fluid->prep (); +} + +void Run_Fill2 (HfFluidDemo* fluidDemo) +{ + static btScalar dtSinceLastDrop = btScalar(0.0f); + btScalar dt = btScalar(1.0/60.); + + btHfFluidArray& fluids = fluidDemo->getHfFluidDynamicsWorld ()->getHfFluidArray (); + btHfFluid* fluid = fluids[0]; + + if (dtSinceLastDrop > btScalar(0.25f)) + { + dtSinceLastDrop = btScalar(0.0f); + + btScalar* eta = fluid->getEtaArray (); + btScalar* velocityU = fluid->getVelocityUArray (); + btScalar* velocityV = fluid->getVelocityVArray (); + btScalar* height = fluid->getHeightArray (); + const btScalar* ground = fluid->getGroundArray (); + bool* flags = fluid->getFlagsArray(); + + for (int i = 1; i < fluid->getNumNodesWidth()-1; i++) + { + int index = fluid->arrayIndex (i, 1); + eta[index] += btScalar(3.0f); + velocityU[index] = btScalar(4.0f); + height[index] = ground[index] + eta[index]; + flags[index] = true; + } + } else { + dtSinceLastDrop += dt; + } + +} + +void Init_MovingPour (HfFluidDemo* fluidDemo) +{ + btHfFluid* fluid = NULL; + + fluid = new btHfFluid (btScalar(1.0),75, 50); + btTransform xform; + xform.setIdentity (); + xform.getOrigin() = btVector3(btScalar(-50.0), btScalar(-5.0), btScalar(-50.0)); + fluid->setWorldTransform (xform); + fluidDemo->getHfFluidDynamicsWorld()->addHfFluid (fluid); + + for (int i = 0; i < fluid->getNumNodesLength()*fluid->getNumNodesWidth(); i++) + { + fluid->getEtaArray()[i] = btScalar(5.0f); + } + + + fluid->prep (); + { + //create a few dynamic rigidbodies + // Re-using the same collision is better for memory usage and performance + + btCollisionShape* colShape = new btBoxShape(btVector3(1,1,1)); + //btCollisionShape* colShape = new btSphereShape(btScalar(1.)); + fluidDemo->m_collisionShapes.push_back(colShape); + + /// Create Dynamic Objects + btTransform startTransform; + startTransform.setIdentity(); + + btScalar mass(1.f); + + //rigidbody is dynamic if and only if mass is non zero, otherwise static + bool isDynamic = (mass != 0.f); + + btVector3 localInertia(0,0,0); + if (isDynamic) + colShape->calculateLocalInertia(mass,localInertia); + + float start_x = START_POS_X - ARRAY_SIZE_X/2; + float start_y = START_POS_Y; + float start_z = START_POS_Z - ARRAY_SIZE_Z/2; + + for (int k=0;kgetHfFluidDynamicsWorld()->addRigidBody(body); + } + } + } + } +} + +void Run_MovingPour(HfFluidDemo* fluidDemo) +{ + static btScalar dtSinceLastDrop = btScalar(0.0f); + static btScalar x = 4; + static btScalar z = 4; + static btScalar dx = btScalar(20.0f); + static btScalar dz = btScalar(30.0f); + btScalar dt = btScalar(1.0/60.); + + btHfFluidArray& fluids = fluidDemo->getHfFluidDynamicsWorld ()->getHfFluidArray (); + btHfFluid* fluid = fluids[0]; + + int minX = 2; + int minZ = 2; + int maxX = fluid->getNumNodesWidth() - 2; + int maxZ = fluid->getNumNodesLength() - 2; + + x += dx * dt; + + if (x <= minX) + { + dx *= btScalar(-1.0f); + x = minX; + } else if (x >= maxX) { + dx *= btScalar(-1.0f); + x = maxX; + } + z += dz * dt; + + if (z <= minZ) + { + dz *= btScalar(-1.0f); + z = minZ; + } else if (z >= maxZ) { + dz *= btScalar(-1.0f); + z = maxZ; + } + + const btScalar dropHeight = btScalar(3.0f); + + { + int iX = (int)x; + int iZ = (int)z; + fluid->addFluidHeight (iX,iZ, dropHeight); + //fluid->addFluidHeight (x, z+1, dropHeight); + //fluid->addFluidHeight (x+1, z, dropHeight); + //fluid->addFluidHeight (x+1, z+1, dropHeight); + } +} + +#define NUM_DEMOS 12 + +void (*demo_run_functions[NUM_DEMOS])(HfFluidDemo*)= +{ + NULL, // Run_Floatyness + NULL, // Run_Bowl + Run_FillPool, //Run_FillPool + NULL, // Run_Drops + NULL, // Run_Wave + Run_RandomDrops, + Run_Fill, + Run_Fill2, + NULL, // Run_BlockWave + NULL, // Run_Ground + NULL, // Run_Ground2 + Run_MovingPour, +}; +void (*demo_init_functions[NUM_DEMOS])(HfFluidDemo*)= +{ + Init_Floatyness, + Init_Bowl, + Init_FillPool, + Init_Drops, + Init_Wave, + Init_RandomDrops, + Init_Fill, + Init_Fill2, + Init_BlockWave, + Init_Ground, + Init_Ground2, + Init_MovingPour, +}; + +btScalar g_ele_array[NUM_DEMOS] = { + btScalar(10), + btScalar(45), + btScalar(35), + btScalar(35), + btScalar(10), + btScalar(10), + btScalar(35), + btScalar(45), + btScalar(35), + btScalar(20), + btScalar(20), +}; + +btScalar g_azi_array[NUM_DEMOS] = { + btScalar(0), + btScalar(55), + btScalar(245), + btScalar(270), + btScalar(55), + btScalar(55), + btScalar(180), + btScalar(205), + btScalar(255), + btScalar(305), + btScalar(305), +}; + +btScalar g_cameraDistance_array[NUM_DEMOS] = { + btScalar(20), + btScalar(29), + btScalar(43), + btScalar(26), + btScalar(77), + btScalar(77), + btScalar(77), + btScalar(32), + btScalar(62), + btScalar(70), + btScalar(70), +}; + +#ifdef _DEBUG +const int gNumObjects = 1; +#else +const int gNumObjects = 1;//try this in release mode: 3000. never go above 16384, unless you increate maxNumObjects value in DemoApplication.cp +#endif + +const int maxNumObjects = 32760; + +#define CUBE_HALF_EXTENTS 1.5 +#define EXTRA_HEIGHT -10.f + +// +void HfFluidDemo::createStack( btCollisionShape* boxShape, float halfCubeSize, int size, float zPos ) +{ + btTransform trans; + trans.setIdentity(); + + for(int i=0; igenerateShape (btScalar(0.25f), btScalar(0.05f)); + m_shootBoxShape = buoyantShape; + } +} + +//////////////////////////////////// + +extern int gNumManifold; +extern int gOverlappingPairs; + +void HfFluidDemo::clientMoveAndDisplay() +{ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT|GL_STENCIL_BUFFER_BIT); + + + float dt = 1.0/60.; + + if (m_dynamicsWorld) + { + if (demo_run_functions[current_demo]) + { + demo_run_functions[current_demo](this); + } + } + + if (m_dynamicsWorld) + { + if(m_drag) + { + const int x=m_lastmousepos[0]; + const int y=m_lastmousepos[1]; + const btVector3 rayFrom=m_cameraPosition; + const btVector3 rayTo=getRayTo(x,y); + const btVector3 rayDir=(rayTo-rayFrom).normalized(); + const btVector3 N=(m_cameraTargetPosition-m_cameraPosition).normalized(); + const btScalar O=dot(m_impact,N); + const btScalar den=dot(N,rayDir); + if((den*den)>0) + { + const btScalar num=O-dot(N,rayFrom); + const btScalar hit=num/den; + if((hit>0)&&(hit<1500)) + { + m_goal=rayFrom+rayDir*hit; + } + } + btVector3 delta; + static const btScalar maxdrag=10; + if(delta.length2()>(maxdrag*maxdrag)) + { + delta=delta.normalized()*maxdrag; + } + } + +#define FIXED_STEP +#ifdef FIXED_STEP + m_dynamicsWorld->stepSimulation(dt=1.0f/60.f,0); + +#else + //during idle mode, just run 1 simulation step maximum, otherwise 4 at max + int maxSimSubSteps = m_idle ? 1 : 4; + //if (m_idle) + // dt = 1.0/420.f; + + int numSimSteps; + numSimSteps = m_dynamicsWorld->stepSimulation(dt); + +#ifdef VERBOSE_TIMESTEPPING_CONSOLEOUTPUT + if (!numSimSteps) + printf("Interpolated transforms\n"); + else + { + if (numSimSteps > maxSimSubSteps) + { + //detect dropping frames + printf("Dropped (%i) simulation steps out of %i\n",numSimSteps - maxSimSubSteps,numSimSteps); + } else + { + printf("Simulated (%i) steps\n",numSimSteps); + } + } +#endif //VERBOSE_TIMESTEPPING_CONSOLEOUTPUT + +#endif + + //optional but useful: debug drawing + + } + +#ifdef USE_QUICKPROF + btProfiler::beginBlock("render"); +#endif //USE_QUICKPROF + + renderme(); + + //render the graphics objects, with center of mass shift + + updateCamera(); + + + +#ifdef USE_QUICKPROF + btProfiler::endBlock("render"); +#endif + glFlush(); + //some additional debugging info +#ifdef PRINT_CONTACT_STATISTICS + printf("num manifolds: %i\n",gNumManifold); + printf("num gOverlappingPairs: %i\n",gOverlappingPairs); + printf("num gTotalContactPoints : %i\n",gTotalContactPoints ); +#endif //PRINT_CONTACT_STATISTICS + + //gTotalContactPoints = 0; + glutSwapBuffers(); + +} + + + +void HfFluidDemo::displayCallback(void) { + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + + renderme(); + + glFlush(); + glutSwapBuffers(); +} + + + + +void HfFluidDemo::clientResetScene() +{ + DemoApplication::clientResetScene(); + /* Clean up */ + for(int i=m_dynamicsWorld->getNumCollisionObjects()-1;i>0;i--) + { + btCollisionObject* obj=m_dynamicsWorld->getCollisionObjectArray()[i]; + btRigidBody* body=btRigidBody::upcast(obj); + if(body&&body->getMotionState()) + { + delete body->getMotionState(); + } + while(m_dynamicsWorld->getNumConstraints()) + { + btTypedConstraint* pc=m_dynamicsWorld->getConstraint(0); + m_dynamicsWorld->removeConstraint(pc); + delete pc; + } + btHfFluid* hfFluid = btHfFluid::upcast(obj); + if (hfFluid) + { + getHfFluidDynamicsWorld()->removeHfFluid(hfFluid); + } else + { + m_dynamicsWorld->removeCollisionObject(obj); + } + delete obj; + } + + /* Init */ + + + m_autocam = false; + m_raycast = false; + m_cutting = false; + printf("current_demo = %d\n", current_demo); + m_azi = g_azi_array[current_demo]; + m_ele = g_ele_array[current_demo]; + m_cameraDistance = g_cameraDistance_array[current_demo]; + updateCamera(); + demo_init_functions[current_demo](this); +} + +void HfFluidDemo::renderme() +{ + btIDebugDraw* idraw=m_dynamicsWorld->getDebugDrawer(); + + m_dynamicsWorld->debugDrawWorld(); + + /* Bodies */ + btVector3 ps(0,0,0); + int nps=0; + + DemoApplication::renderme(); +} + + +void HfFluidDemo::keyboardCallback(unsigned char key, int x, int y) +{ + switch(key) + { + case ']': + current_demo = (current_demo+1)%NUM_DEMOS; + clientResetScene(); + break; + case '[': + current_demo = (current_demo-1)%NUM_DEMOS; + clientResetScene(); + break; + case '.': + current_draw_mode = (current_draw_mode+1) % DRAWMODE_MAX; + getHfFluidDynamicsWorld()->setDrawMode (current_draw_mode); + break; + case 'v': + current_body_draw_mode = (current_body_draw_mode+1) % BODY_DRAWMODE_MAX; + getHfFluidDynamicsWorld()->setBodyDrawMode (current_body_draw_mode); + break; + default: + DemoApplication::keyboardCallback(key,x,y); + break; + } +} + +// +void HfFluidDemo::mouseMotionFunc(int x,int y) +{ + DemoApplication::mouseMotionFunc(x,y); +} + +// +void HfFluidDemo::mouseFunc(int button, int state, int x, int y) +{ +if(button==0) + { + switch(state) + { + case 0: + { + DemoApplication::mouseFunc(button,state,x,y); + } + break; + case 1: + DemoApplication::mouseFunc(button,state,x,y); + break; + } + } + else + { + DemoApplication::mouseFunc(button,state,x,y); + } +} + + +void HfFluidDemo::initPhysics() +{ +///create concave ground mesh + + btCollisionShape* groundShape = 0; + bool useConcaveMesh = false;//not ready yet true; + + if (useConcaveMesh) + { + int i; + int j; + + const int NUM_VERTS_X = 30; + const int NUM_VERTS_Y = 30; + const int totalVerts = NUM_VERTS_X*NUM_VERTS_Y; + const int totalTriangles = 2*(NUM_VERTS_X-1)*(NUM_VERTS_Y-1); + + gGroundVertices = new btVector3[totalVerts]; + gGroundIndices = new int[totalTriangles*3]; + + btScalar offset(-50); + + for ( i=0;iaddChildShape(localTransform,cylinderShape); + btQuaternion orn(btVector3(0,1,0),SIMD_PI); + localTransform.setRotation(orn); + cylinderCompound->addChildShape(localTransform,cylinderShape); + + m_collisionShapes.push_back(cylinderCompound); + + + m_dispatcher=0; + + /* FIXME: Register new collision algorithm */ + ///register some softbody collision algorithms on top of the default btDefaultCollisionConfiguration + m_collisionConfiguration = new btHfFluidRigidCollisionConfiguration(); + + + m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); + + //////////////////////////// + ///Register HfFluid versus rigidbody collision algorithm + + + btVector3 worldAabbMin(-1000,-1000,-1000); + btVector3 worldAabbMax(1000,1000,1000); + + m_broadphase = new btAxisSweep3(worldAabbMin,worldAabbMax,maxProxies); + + btSequentialImpulseConstraintSolver* solver = new btSequentialImpulseConstraintSolver(); + + m_solver = solver; + + btDiscreteDynamicsWorld* world = new btHfFluidRigidDynamicsWorld(m_dispatcher,m_broadphase,m_solver,m_collisionConfiguration); + m_dynamicsWorld = world; + + + m_dynamicsWorld->getDispatchInfo().m_enableSPU = true; + m_dynamicsWorld->setGravity(btVector3(0,-10,0)); + + btTransform tr; + tr.setIdentity(); + tr.setOrigin(btVector3(0,-12,0)); + + + + localCreateRigidBody(0.f,tr,m_collisionShapes[0]); + + + // clientResetScene(); + + clientResetScene(); +} + + + + + + +void HfFluidDemo::exitPhysics() +{ + + //cleanup in the reverse order of creation/initialization + + //remove the rigidbodies from the dynamics world and delete them + int i; + for (i=m_dynamicsWorld->getNumCollisionObjects()-1; i>=0 ;i--) + { + btCollisionObject* obj = m_dynamicsWorld->getCollisionObjectArray()[i]; + btRigidBody* body = btRigidBody::upcast(obj); + if (body && body->getMotionState()) + { + delete body->getMotionState(); + } + m_dynamicsWorld->removeCollisionObject( obj ); + delete obj; + } + + //delete collision shapes + for (int j=0;j m_FluidRigidCollisionAlgorithms; + + + bool m_autocam; + bool m_cutting; + bool m_raycast; + btScalar m_animtime; + btClock m_clock; + int m_lastmousepos[2]; + btVector3 m_impact; + btVector3 m_goal; + bool m_drag; + + + //keep the collision shapes, for deletion/cleanup + btAlignedObjectArray m_collisionShapes; + + btBroadphaseInterface* m_broadphase; + + btCollisionDispatcher* m_dispatcher; + + + btConstraintSolver* m_solver; + + btCollisionAlgorithmCreateFunc* m_boxBoxCF; + + btDefaultCollisionConfiguration* m_collisionConfiguration; + +public: + + void initPhysics(); + + void exitPhysics(); + + HfFluidDemo (); + + virtual ~HfFluidDemo() + { + exitPhysics(); + } + + virtual void setDrawClusters(bool drawClusters) + { + + } + + virtual void setShootBoxShape (); + + virtual void clientMoveAndDisplay(); + + virtual void displayCallback(); + + void createStack( btCollisionShape* boxShape, float halfCubeSize, int size, float zPos ); + + static DemoApplication* Create() + { + HfFluidDemo* demo = new HfFluidDemo; + demo->myinit(); + demo->initPhysics(); + return demo; + } + + virtual const btHfFluidRigidDynamicsWorld* getHfFluidDynamicsWorld() const + { + ///just make it a btSoftRigidDynamicsWorld please + ///or we will add type checking + return (btHfFluidRigidDynamicsWorld*) m_dynamicsWorld; + } + + virtual btHfFluidRigidDynamicsWorld* getHfFluidDynamicsWorld() + { + ///just make it a btSoftRigidDynamicsWorld please + ///or we will add type checking + return (btHfFluidRigidDynamicsWorld*) m_dynamicsWorld; + } + + // + void clientResetScene(); + void renderme(); + void keyboardCallback(unsigned char key, int x, int y); + void mouseFunc(int button, int state, int x, int y); + void mouseMotionFunc(int x,int y); + +}; + +#define MACRO_SOFT_DEMO(a) class HfFluidDemo##a : public HfFluidDemo\ +{\ +public:\ + static DemoApplication* Create()\ + {\ + HfFluidDemo* demo = new HfFluidDemo##a;\ + extern unsigned int current_demo;\ + current_demo=a;\ + demo->myinit();\ + demo->initPhysics();\ + return demo;\ + }\ +}; + + +MACRO_SOFT_DEMO(0) //Init_Drops +MACRO_SOFT_DEMO(1) //Init_Wave +MACRO_SOFT_DEMO(2) //Init_RandomDrops +MACRO_SOFT_DEMO(3) + +#endif //CCD_PHYSICS_DEMO_H + + + + + diff --git a/BulletPhysics/bulletTrunk/Demos/HeightFieldFluidDemo/HfFluidDemo_GL_ShapeDrawer.cpp b/BulletPhysics/bulletTrunk/Demos/HeightFieldFluidDemo/HfFluidDemo_GL_ShapeDrawer.cpp new file mode 100644 index 00000000..a0aee633 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/HeightFieldFluidDemo/HfFluidDemo_GL_ShapeDrawer.cpp @@ -0,0 +1,606 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. + +Experimental Buoyancy fluid demo written by John McCutchan +*/ + +#ifdef WIN32 //needed for glut.h +#include +#endif + +//think different +#if defined(__APPLE__) && !defined (VMDMESA) +#include +#include +#include +#else +#include +#endif + +#include "GlutStuff.h" +#include "HfFluidDemo_GL_ShapeDrawer.h" + +#include "BulletCollision/CollisionShapes/btPolyhedralConvexShape.h" +#include "BulletCollision/CollisionShapes/btTriangleMeshShape.h" +#include "BulletCollision/CollisionShapes/btBoxShape.h" +#include "BulletCollision/CollisionShapes/btSphereShape.h" +#include "BulletCollision/CollisionShapes/btConeShape.h" +#include "BulletCollision/CollisionShapes/btCylinderShape.h" +#include "BulletCollision/CollisionShapes/btTetrahedronShape.h" +#include "BulletCollision/CollisionShapes/btCompoundShape.h" +#include "BulletCollision/CollisionShapes/btCapsuleShape.h" +#include "BulletCollision/CollisionShapes/btConvexTriangleMeshShape.h" +#include "BulletCollision/CollisionShapes/btUniformScalingShape.h" +#include "BulletCollision/CollisionShapes/btStaticPlaneShape.h" +/// +#include "BulletCollision/CollisionShapes/btShapeHull.h" +#include "BulletHfFluid/btHfFluidBuoyantConvexShape.h" +#include "BulletHfFluid/btHfFluid.h" +#include "BulletHfFluid/btHfFluidCollisionShape.h" + +#include "LinearMath/btTransformUtil.h" + + +#include "LinearMath/btIDebugDraw.h" +//for debugmodes +#include "BMF_Api.h" +#include //printf debugging + +#include + +using namespace std; + + +class GlDrawcallback : public btTriangleCallback +{ + +public: + + bool m_wireframe; + + GlDrawcallback() + :m_wireframe(false) + { + } + + virtual void processTriangle(btVector3* triangle,int partId, int triangleIndex) + { + + (void)triangleIndex; + (void)partId; + + + if (m_wireframe) + { + glBegin(GL_LINES); + glColor3f(1, 0, 0); + glVertex3d(triangle[0].getX(), triangle[0].getY(), triangle[0].getZ()); + glVertex3d(triangle[1].getX(), triangle[1].getY(), triangle[1].getZ()); + glColor3f(0, 1, 0); + glVertex3d(triangle[2].getX(), triangle[2].getY(), triangle[2].getZ()); + glVertex3d(triangle[1].getX(), triangle[1].getY(), triangle[1].getZ()); + glColor3f(0, 0, 1); + glVertex3d(triangle[2].getX(), triangle[2].getY(), triangle[2].getZ()); + glVertex3d(triangle[0].getX(), triangle[0].getY(), triangle[0].getZ()); + glEnd(); + } else + { + glBegin(GL_TRIANGLES); + //glColor3f(1, 1, 1); + + + glVertex3d(triangle[0].getX(), triangle[0].getY(), triangle[0].getZ()); + glVertex3d(triangle[1].getX(), triangle[1].getY(), triangle[1].getZ()); + glVertex3d(triangle[2].getX(), triangle[2].getY(), triangle[2].getZ()); + + glVertex3d(triangle[2].getX(), triangle[2].getY(), triangle[2].getZ()); + glVertex3d(triangle[1].getX(), triangle[1].getY(), triangle[1].getZ()); + glVertex3d(triangle[0].getX(), triangle[0].getY(), triangle[0].getZ()); + glEnd(); + } + } +}; + +class TriangleGlDrawcallback : public btInternalTriangleIndexCallback +{ +public: + virtual void internalProcessTriangleIndex(btVector3* triangle,int partId,int triangleIndex) + { + (void)triangleIndex; + (void)partId; + + + glBegin(GL_TRIANGLES);//LINES); + glColor3f(1, 0, 0); + glVertex3d(triangle[0].getX(), triangle[0].getY(), triangle[0].getZ()); + glVertex3d(triangle[1].getX(), triangle[1].getY(), triangle[1].getZ()); + glColor3f(0, 1, 0); + glVertex3d(triangle[2].getX(), triangle[2].getY(), triangle[2].getZ()); + glVertex3d(triangle[1].getX(), triangle[1].getY(), triangle[1].getZ()); + glColor3f(0, 0, 1); + glVertex3d(triangle[2].getX(), triangle[2].getY(), triangle[2].getZ()); + glVertex3d(triangle[0].getX(), triangle[0].getY(), triangle[0].getZ()); + glEnd(); + } +}; + + + +void HfFluidDemo_GL_ShapeDrawer::drawOpenGL(btScalar* m, const btCollisionShape* shape, const btVector3& color,int debugMode,const btVector3& worldBoundsMin,const btVector3& worldBoundsMax) +{ + + + glPushMatrix(); + btglMultMatrix(m); + + if (shape->getShapeType() == UNIFORM_SCALING_SHAPE_PROXYTYPE) + { + const btUniformScalingShape* scalingShape = static_cast(shape); + const btConvexShape* convexShape = scalingShape->getChildShape(); + float scalingFactor = (float)scalingShape->getUniformScalingFactor(); + { + btScalar tmpScaling[4][4]={{scalingFactor,0,0,0}, + {0,scalingFactor,0,0}, + {0,0,scalingFactor,0}, + {0,0,0,1}}; + + drawOpenGL( (btScalar*)tmpScaling,convexShape,color,debugMode,worldBoundsMin,worldBoundsMax); + } + glPopMatrix(); + return; + } + + if (shape->getShapeType() == HFFLUID_BUOYANT_CONVEX_SHAPE_PROXYTYPE) + { + btConvexShape* convexShape = ((btHfFluidBuoyantConvexShape*)shape)->getConvexShape(); + btTransform I; + I.setIdentity(); + btScalar mat[16]; + I.getOpenGLMatrix (&mat[0]); + drawOpenGL (mat, convexShape, color, debugMode, worldBoundsMin, worldBoundsMax); + return; + } + + if (shape->getShapeType() == COMPOUND_SHAPE_PROXYTYPE) + { + const btCompoundShape* compoundShape = static_cast(shape); + for (int i=compoundShape->getNumChildShapes()-1;i>=0;i--) + { + btTransform childTrans = compoundShape->getChildTransform(i); + const btCollisionShape* colShape = compoundShape->getChildShape(i); + btScalar childMat[16]; + childTrans.getOpenGLMatrix(childMat); + drawOpenGL(childMat,colShape,color,debugMode,worldBoundsMin,worldBoundsMax); + + } + + } else + { + if(m_textureenabled&&(!m_textureinitialized)) + { + GLubyte* image=new GLubyte[256*256*3]; + for(int y=0;y<256;++y) + { + const int t=y>>4; + GLubyte* pi=image+y*256*3; + for(int x=0;x<256;++x) + { + const int s=x>>4; + const GLubyte b=180; + GLubyte c=b+((s+t&1)&1)*(255-b); + pi[0]=pi[1]=pi[2]=c;pi+=3; + } + } + glGenTextures(1,(GLuint*)&m_texturehandle); + glBindTexture(GL_TEXTURE_2D,m_texturehandle); + glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE); + glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR); + glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR_MIPMAP_LINEAR); + glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT); + glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT); + gluBuild2DMipmaps(GL_TEXTURE_2D,3,256,256,GL_RGB,GL_UNSIGNED_BYTE,image); + delete[] image; + + glMatrixMode(GL_TEXTURE); + glLoadIdentity(); + glScalef(0.025,0.025,0.025); + + static const GLfloat planex[]={1,0,0,0}; + static const GLfloat planey[]={0,1,0,0}; + static const GLfloat planez[]={0,0,1,0}; + glTexGenfv(GL_S,GL_OBJECT_PLANE,planex); + glTexGenfv(GL_T,GL_OBJECT_PLANE,planez); + glTexGeni(GL_S,GL_TEXTURE_GEN_MODE,GL_OBJECT_LINEAR); + glTexGeni(GL_T,GL_TEXTURE_GEN_MODE,GL_OBJECT_LINEAR); + glEnable(GL_TEXTURE_GEN_S); + glEnable(GL_TEXTURE_GEN_T); + glEnable(GL_TEXTURE_GEN_R); + m_textureinitialized=true; + } + //drawCoordSystem(); + + //glPushMatrix(); + glEnable(GL_COLOR_MATERIAL); + if(m_textureenabled) + { + glEnable(GL_TEXTURE_2D); + glBindTexture(GL_TEXTURE_2D,m_texturehandle); + } else + { + glDisable(GL_TEXTURE_2D); + } + + + glColor3f(color.x(),color.y(), color.z()); + + bool useWireframeFallback = true; + + if (!(debugMode & btIDebugDraw::DBG_DrawWireframe)) + { + ///you can comment out any of the specific cases, and use the default + ///the benefit of 'default' is that it approximates the actual collision shape including collision margin + int shapetype=m_textureenabled?MAX_BROADPHASE_COLLISION_TYPES:shape->getShapeType(); + switch (shapetype) + { + case BOX_SHAPE_PROXYTYPE: + { + const btBoxShape* boxShape = static_cast(shape); + btVector3 halfExtent = boxShape->getHalfExtentsWithMargin(); + glScaled(2*halfExtent[0], 2*halfExtent[1], 2*halfExtent[2]); + glutSolidCube(1.0); + useWireframeFallback = false; + break; + } + + + case SPHERE_SHAPE_PROXYTYPE: + { + const btSphereShape* sphereShape = static_cast(shape); + float radius = sphereShape->getMargin();//radius doesn't include the margin, so draw with margin + glutSolidSphere(radius,10,10); + useWireframeFallback = false; + break; + } + + case CONE_SHAPE_PROXYTYPE: + { + const btConeShape* coneShape = static_cast(shape); + int upIndex = coneShape->getConeUpIndex(); + float radius = coneShape->getRadius();//+coneShape->getMargin(); + float height = coneShape->getHeight();//+coneShape->getMargin(); + switch (upIndex) + { + case 0: + glRotatef(90.0, 0.0, 1.0, 0.0); + break; + case 1: + glRotatef(-90.0, 1.0, 0.0, 0.0); + break; + case 2: + break; + default: + { + } + }; + + glTranslatef(0.0, 0.0, -0.5*height); + glutSolidCone(radius,height,10,10); + useWireframeFallback = false; + break; + + } + + + case STATIC_PLANE_PROXYTYPE: + { + const btStaticPlaneShape* staticPlaneShape = static_cast(shape); + btScalar planeConst = staticPlaneShape->getPlaneConstant(); + const btVector3& planeNormal = staticPlaneShape->getPlaneNormal(); + btVector3 planeOrigin = planeNormal * planeConst; + btVector3 vec0,vec1; + btPlaneSpace1(planeNormal,vec0,vec1); + btScalar vecLen = 100.f; + btVector3 pt0 = planeOrigin + vec0*vecLen; + btVector3 pt1 = planeOrigin - vec0*vecLen; + btVector3 pt2 = planeOrigin + vec1*vecLen; + btVector3 pt3 = planeOrigin - vec1*vecLen; + glBegin(GL_LINES); + glVertex3f(pt0.getX(),pt0.getY(),pt0.getZ()); + glVertex3f(pt1.getX(),pt1.getY(),pt1.getZ()); + glVertex3f(pt2.getX(),pt2.getY(),pt2.getZ()); + glVertex3f(pt3.getX(),pt3.getY(),pt3.getZ()); + glEnd(); + + + break; + + } + + case CYLINDER_SHAPE_PROXYTYPE: + { + const btCylinderShape* cylinder = static_cast(shape); + int upAxis = cylinder->getUpAxis(); + + + float radius = cylinder->getRadius(); + float halfHeight = cylinder->getHalfExtentsWithMargin()[upAxis]; + + drawCylinder(radius,halfHeight,upAxis); + + break; + } + + default: + { + + + if (shape->isConvex()) + { + ShapeCache* sc=cache((btConvexShape*)shape); + + //if (shape->getUserPointer()) + { + //glutSolidCube(1.0); + btShapeHull* hull = &sc->m_shapehull/*(btShapeHull*)shape->getUserPointer()*/; + + + if (hull->numTriangles () > 0) + { + int index = 0; + const unsigned int* idx = hull->getIndexPointer(); + const btVector3* vtx = hull->getVertexPointer(); + + glBegin (GL_TRIANGLES); + + for (int i = 0; i < hull->numTriangles (); i++) + { + int i1 = index++; + int i2 = index++; + int i3 = index++; + btAssert(i1 < hull->numIndices () && + i2 < hull->numIndices () && + i3 < hull->numIndices ()); + + int index1 = idx[i1]; + int index2 = idx[i2]; + int index3 = idx[i3]; + btAssert(index1 < hull->numVertices () && + index2 < hull->numVertices () && + index3 < hull->numVertices ()); + + btVector3 v1 = vtx[index1]; + btVector3 v2 = vtx[index2]; + btVector3 v3 = vtx[index3]; + btVector3 normal = (v3-v1).cross(v2-v1); + normal.normalize (); + + glNormal3f(normal.getX(),normal.getY(),normal.getZ()); + glVertex3f (v1.x(), v1.y(), v1.z()); + glVertex3f (v2.x(), v2.y(), v2.z()); + glVertex3f (v3.x(), v3.y(), v3.z()); + + } + glEnd (); + + } + } + } + } + } + + } + + + + + /// for polyhedral shapes + if (debugMode==btIDebugDraw::DBG_DrawFeaturesText && (shape->isPolyhedral())) + { + btPolyhedralConvexShape* polyshape = (btPolyhedralConvexShape*) shape; + + { + glRasterPos3f(0.0, 0.0, 0.0); + //BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),polyshape->getExtraDebugInfo()); + + glColor3f(1.f, 1.f, 1.f); + int i; + for (i=0;igetNumVertices();i++) + { + btVector3 vtx; + polyshape->getVertex(i,vtx); + glRasterPos3f(vtx.x(), vtx.y(), vtx.z()); + char buf[12]; + sprintf(buf," %d",i); + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); + } + + for (i=0;igetNumPlanes();i++) + { + btVector3 normal; + btVector3 vtx; + polyshape->getPlane(normal,vtx,i); + btScalar d = vtx.dot(normal); + + glRasterPos3f(normal.x()*d, normal.y()*d, normal.z()*d); + char buf[12]; + sprintf(buf," plane %d",i); + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); + + } + } + + } + + +#ifdef USE_DISPLAY_LISTS + + if (shape->getShapeType() == TRIANGLE_MESH_SHAPE_PROXYTYPE||shape->getShapeType() == GIMPACT_SHAPE_PROXYTYPE) + { + GLuint dlist = OGL_get_displaylist_for_shape((btCollisionShape * )shape); + if (dlist) + { + glCallList(dlist); + } + else + { +#else + if (shape->isConcave())//>getShapeType() == TRIANGLE_MESH_SHAPE_PROXYTYPE||shape->getShapeType() == GIMPACT_SHAPE_PROXYTYPE) + // if (shape->getShapeType() == TRIANGLE_MESH_SHAPE_PROXYTYPE) + { + btConcaveShape* concaveMesh = (btConcaveShape*) shape; + + GlDrawcallback drawCallback; + drawCallback.m_wireframe = (debugMode & btIDebugDraw::DBG_DrawWireframe)!=0; + + concaveMesh->processAllTriangles(&drawCallback,worldBoundsMin,worldBoundsMax); + + } + if (shape->getShapeType() == HFFLUID_SHAPE_PROXYTYPE) + { + btHfFluidCollisionShape* hfFluidShape = (btHfFluidCollisionShape*)shape; + btHfFluid* fluid = hfFluidShape->m_fluid; + + GlDrawcallback drawCallback; + drawCallback.m_wireframe = (debugMode & btIDebugDraw::DBG_DrawWireframe) != 0; + fluid->foreachSurfaceTriangle (&drawCallback, worldBoundsMin, worldBoundsMax); + } +#endif + +#ifdef USE_DISPLAY_LISTS + } +} +#endif + +/* +if (shape->getShapeType() == CONVEX_TRIANGLEMESH_SHAPE_PROXYTYPE) +{ +btConvexTriangleMeshShape* convexMesh = (btConvexTriangleMeshShape*) shape; + +//todo: pass camera for some culling +btVector3 aabbMax(btScalar(1e30),btScalar(1e30),btScalar(1e30)); +btVector3 aabbMin(-btScalar(1e30),-btScalar(1e30),-btScalar(1e30)); +TriangleGlDrawcallback drawCallback; +convexMesh->getMeshInterface()->InternalProcessAllTriangles(&drawCallback,aabbMin,aabbMax); + +} +*/ + + + +glDisable(GL_DEPTH_TEST); +glRasterPos3f(0,0,0);//mvtx.x(), vtx.y(), vtx.z()); +if (debugMode&btIDebugDraw::DBG_DrawText) +{ + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),shape->getName()); +} + +if (debugMode& btIDebugDraw::DBG_DrawFeaturesText) +{ + //BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),shape->getExtraDebugInfo()); +} +glEnable(GL_DEPTH_TEST); + +// glPopMatrix(); +if(m_textureenabled) glDisable(GL_TEXTURE_2D); + } + glPopMatrix(); + +} + +// +void HfFluidDemo_GL_ShapeDrawer::drawShadow(btScalar* m,const btVector3& extrusion,const btCollisionShape* shape,const btVector3& worldBoundsMin,const btVector3& worldBoundsMax) +{ + glPushMatrix(); + btglMultMatrix(m); + if(shape->getShapeType() == UNIFORM_SCALING_SHAPE_PROXYTYPE) + { + const btUniformScalingShape* scalingShape = static_cast(shape); + const btConvexShape* convexShape = scalingShape->getChildShape(); + float scalingFactor = (float)scalingShape->getUniformScalingFactor(); + btScalar tmpScaling[4][4]={ {scalingFactor,0,0,0}, + {0,scalingFactor,0,0}, + {0,0,scalingFactor,0}, + {0,0,0,1}}; + drawShadow((btScalar*)tmpScaling,extrusion,convexShape,worldBoundsMin,worldBoundsMax); + glPopMatrix(); + return; + } + else if(shape->getShapeType()==COMPOUND_SHAPE_PROXYTYPE) + { + const btCompoundShape* compoundShape = static_cast(shape); + for (int i=compoundShape->getNumChildShapes()-1;i>=0;i--) + { + btTransform childTrans = compoundShape->getChildTransform(i); + const btCollisionShape* colShape = compoundShape->getChildShape(i); + btScalar childMat[16]; + childTrans.getOpenGLMatrix(childMat); + drawShadow(childMat,extrusion*childTrans.getBasis(),colShape,worldBoundsMin,worldBoundsMax); + } + } + else + { + bool useWireframeFallback = true; + if (shape->isConvex()) + { + ShapeCache* sc=cache((btConvexShape*)shape); + btShapeHull* hull =&sc->m_shapehull; + glBegin(GL_QUADS); + for(int i=0;im_edges.size();++i) + { + const btScalar d=dot(sc->m_edges[i].n[0],extrusion); + if((d*dot(sc->m_edges[i].n[1],extrusion))<0) + { + const int q= d<0?1:0; + const btVector3& a= hull->getVertexPointer()[sc->m_edges[i].v[q]]; + const btVector3& b= hull->getVertexPointer()[sc->m_edges[i].v[1-q]]; + glVertex3f(a[0],a[1],a[2]); + glVertex3f(b[0],b[1],b[2]); + glVertex3f(b[0]+extrusion[0],b[1]+extrusion[1],b[2]+extrusion[2]); + glVertex3f(a[0]+extrusion[0],a[1]+extrusion[1],a[2]+extrusion[2]); + } + } + glEnd(); + } + + } + + + + + if (shape->isConcave())//>getShapeType() == TRIANGLE_MESH_SHAPE_PROXYTYPE||shape->getShapeType() == GIMPACT_SHAPE_PROXYTYPE) + // if (shape->getShapeType() == TRIANGLE_MESH_SHAPE_PROXYTYPE) + { + btConcaveShape* concaveMesh = (btConcaveShape*) shape; + + GlDrawcallback drawCallback; + drawCallback.m_wireframe = false; + + concaveMesh->processAllTriangles(&drawCallback,worldBoundsMin,worldBoundsMax); + + } + glPopMatrix(); + +} + +// +HfFluidDemo_GL_ShapeDrawer::HfFluidDemo_GL_ShapeDrawer() +{ + m_texturehandle = 0; + m_textureenabled = true; + m_textureinitialized = false; +} + +HfFluidDemo_GL_ShapeDrawer::~HfFluidDemo_GL_ShapeDrawer() +{ +} \ No newline at end of file diff --git a/BulletPhysics/bulletTrunk/Demos/HeightFieldFluidDemo/HfFluidDemo_GL_ShapeDrawer.h b/BulletPhysics/bulletTrunk/Demos/HeightFieldFluidDemo/HfFluidDemo_GL_ShapeDrawer.h new file mode 100644 index 00000000..b9808adf --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/HeightFieldFluidDemo/HfFluidDemo_GL_ShapeDrawer.h @@ -0,0 +1,37 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. + +Experimental Buoyancy fluid demo written by John McCutchan +*/ + +#ifndef HFFLUID_GL_SHAPE_DRAWER_H +#define HFFLUID_GL_SHAPE_DRAWER_H + +#include "GL_ShapeDrawer.h" + +///experimental buyancy fluid demo +/// OpenGL shape drawing +class HfFluidDemo_GL_ShapeDrawer : public GL_ShapeDrawer +{ + public: + HfFluidDemo_GL_ShapeDrawer(); + + virtual ~HfFluidDemo_GL_ShapeDrawer(); + + ///drawOpenGL might allocate temporary memoty, stores pointer in shape userpointer + virtual void drawOpenGL(btScalar* m, const btCollisionShape* shape, const btVector3& color,int debugMode,const btVector3& worldBoundsMin,const btVector3& worldBoundsMax); + virtual void drawShadow(btScalar* m, const btVector3& extrusion,const btCollisionShape* shape,const btVector3& worldBoundsMin,const btVector3& worldBoundsMax); +}; + +#endif //HFFLUID_GL_SHAPE_DRAWER_H diff --git a/BulletPhysics/bulletTrunk/Demos/HeightFieldFluidDemo/Jamfile b/BulletPhysics/bulletTrunk/Demos/HeightFieldFluidDemo/Jamfile new file mode 100644 index 00000000..da5763bd --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/HeightFieldFluidDemo/Jamfile @@ -0,0 +1,5 @@ +SubDir TOP Demos HeightFieldFluidDemo ; + +BulletDemo HeightFieldFluidDemo : [ Wildcard *.cpp *.h ] +[ Wildcard BulletHfFluid : *.h *.cpp ] +; diff --git a/BulletPhysics/bulletTrunk/Demos/HeightFieldFluidDemo/main.cpp b/BulletPhysics/bulletTrunk/Demos/HeightFieldFluidDemo/main.cpp new file mode 100644 index 00000000..eb72aad9 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/HeightFieldFluidDemo/main.cpp @@ -0,0 +1,39 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2009 Erwin Coumans http://bulletphysics.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. + +Experimental Buoyancy fluid demo written by John McCutchan +*/ + +#include "HfFluidDemo.h" +#include "GlutStuff.h" +#include "GLDebugDrawer.h" +#include "btBulletDynamicsCommon.h" + +GLDebugDrawer gDebugDrawer; + +int main(int argc,char** argv) +{ + + HfFluidDemo* fluidDemo = new HfFluidDemo(); + + fluidDemo->initPhysics(); + fluidDemo->getDynamicsWorld()->setDebugDrawer(&gDebugDrawer); + + + glutmain(argc, argv,640,480,"Bullet Physics Demo. http://bulletphysics.com",fluidDemo); + + delete fluidDemo; + return 0; + +} diff --git a/BulletPhysics/bulletTrunk/Demos/HelloWorld/CMakeLists.txt b/BulletPhysics/bulletTrunk/Demos/HelloWorld/CMakeLists.txt new file mode 100644 index 00000000..08437512 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/HelloWorld/CMakeLists.txt @@ -0,0 +1,14 @@ +# HelloWorld is a minimal sample creating, stepping and deleting a Bullet dynamics world + +INCLUDE_DIRECTORIES( +${BULLET_PHYSICS_SOURCE_DIR}/src } +) + +LINK_LIBRARIES( + BulletDynamics BulletCollision LinearMath +) + +ADD_EXECUTABLE(AppHelloWorld + HelloWorld.cpp +) + diff --git a/BulletPhysics/bulletTrunk/Demos/HelloWorld/HelloWorld.cpp b/BulletPhysics/bulletTrunk/Demos/HelloWorld/HelloWorld.cpp new file mode 100644 index 00000000..d987d293 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/HelloWorld/HelloWorld.cpp @@ -0,0 +1,175 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2007 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + + +#include "btBulletDynamicsCommon.h" +#include + +/// This is a Hello World program for running a basic Bullet physics simulation + +int main(int argc, char** argv) +{ + + int i; + + ///collision configuration contains default setup for memory, collision setup. Advanced users can create their own configuration. + btDefaultCollisionConfiguration* collisionConfiguration = new btDefaultCollisionConfiguration(); + + ///use the default collision dispatcher. For parallel processing you can use a diffent dispatcher (see Extras/BulletMultiThreaded) + btCollisionDispatcher* dispatcher = new btCollisionDispatcher(collisionConfiguration); + + ///the maximum size of the collision world. Make sure objects stay within these boundaries + ///Don't make the world AABB size too large, it will harm simulation quality and performance + btVector3 worldAabbMin(-10000,-10000,-10000); + btVector3 worldAabbMax(10000,10000,10000); + int maxProxies = 1024; + btAxisSweep3* overlappingPairCache = new btAxisSweep3(worldAabbMin,worldAabbMax,maxProxies); + + ///the default constraint solver. For parallel processing you can use a different solver (see Extras/BulletMultiThreaded) + btSequentialImpulseConstraintSolver* solver = new btSequentialImpulseConstraintSolver; + + btDiscreteDynamicsWorld* dynamicsWorld = new btDiscreteDynamicsWorld(dispatcher,overlappingPairCache,solver,collisionConfiguration); + + dynamicsWorld->setGravity(btVector3(0,-10,0)); + + ///create a few basic rigid bodies + btCollisionShape* groundShape = new btBoxShape(btVector3(btScalar(50.),btScalar(50.),btScalar(50.))); + + //keep track of the shapes, we release memory at exit. + //make sure to re-use collision shapes among rigid bodies whenever possible! + btAlignedObjectArray collisionShapes; + + collisionShapes.push_back(groundShape); + + btTransform groundTransform; + groundTransform.setIdentity(); + groundTransform.setOrigin(btVector3(0,-56,0)); + + { + btScalar mass(0.); + + //rigidbody is dynamic if and only if mass is non zero, otherwise static + bool isDynamic = (mass != 0.f); + + btVector3 localInertia(0,0,0); + if (isDynamic) + groundShape->calculateLocalInertia(mass,localInertia); + + //using motionstate is recommended, it provides interpolation capabilities, and only synchronizes 'active' objects + btDefaultMotionState* myMotionState = new btDefaultMotionState(groundTransform); + btRigidBody::btRigidBodyConstructionInfo rbInfo(mass,myMotionState,groundShape,localInertia); + btRigidBody* body = new btRigidBody(rbInfo); + + //add the body to the dynamics world + dynamicsWorld->addRigidBody(body); + } + + + { + //create a dynamic rigidbody + + //btCollisionShape* colShape = new btBoxShape(btVector3(1,1,1)); + btCollisionShape* colShape = new btSphereShape(btScalar(1.)); + collisionShapes.push_back(colShape); + + /// Create Dynamic Objects + btTransform startTransform; + startTransform.setIdentity(); + + btScalar mass(1.f); + + //rigidbody is dynamic if and only if mass is non zero, otherwise static + bool isDynamic = (mass != 0.f); + + btVector3 localInertia(0,0,0); + if (isDynamic) + colShape->calculateLocalInertia(mass,localInertia); + + startTransform.setOrigin(btVector3(2,10,0)); + + //using motionstate is recommended, it provides interpolation capabilities, and only synchronizes 'active' objects + btDefaultMotionState* myMotionState = new btDefaultMotionState(startTransform); + btRigidBody::btRigidBodyConstructionInfo rbInfo(mass,myMotionState,colShape,localInertia); + btRigidBody* body = new btRigidBody(rbInfo); + + dynamicsWorld->addRigidBody(body); + } + + + +/// Do some simulation + + + + for (i=0;i<100;i++) + { + dynamicsWorld->stepSimulation(1.f/60.f,10); + + //print positions of all objects + for (int j=dynamicsWorld->getNumCollisionObjects()-1; j>=0 ;j--) + { + btCollisionObject* obj = dynamicsWorld->getCollisionObjectArray()[j]; + btRigidBody* body = btRigidBody::upcast(obj); + if (body && body->getMotionState()) + { + btTransform trans; + body->getMotionState()->getWorldTransform(trans); + printf("world pos = %f,%f,%f\n",float(trans.getOrigin().getX()),float(trans.getOrigin().getY()),float(trans.getOrigin().getZ())); + } + } + } + + + //cleanup in the reverse order of creation/initialization + + //remove the rigidbodies from the dynamics world and delete them + for (i=dynamicsWorld->getNumCollisionObjects()-1; i>=0 ;i--) + { + btCollisionObject* obj = dynamicsWorld->getCollisionObjectArray()[i]; + btRigidBody* body = btRigidBody::upcast(obj); + if (body && body->getMotionState()) + { + delete body->getMotionState(); + } + dynamicsWorld->removeCollisionObject( obj ); + delete obj; + } + + //delete collision shapes + for (int j=0;j) : noinstall console nomanifest ; + LinkWith $(<) : bulletopenglsupport bulletdynamics bulletcollision bulletmath ; + CFlags $(<) : + [ FIncludes $(TOP)/Demos/OpenGL ] + [ FIncludes $(TOP)/Extras/ConvexHull ] + ; + MsvcIncDirs $(<) : + "../../Demos/OpenGL" + "../../Extras/ConvexHull" + "../../src" ; + } +} + +rule BulletSoftBodyDemo +{ + Application $(<) : $(>) : noinstall console nomanifest ; + LinkWith $(<) : bulletopenglsupport bulletsoftbody bulletdynamics bulletcollision bulletmath ; + CFlags $(<) : + [ FIncludes $(TOP)/src ] + [ FIncludes $(TOP)/Demos/OpenGL ] + ; + MsvcIncDirs $(<) : + "../../Demos/OpenGL" + "../../src" ; +} + + rule BulletBasicDemo + { + Application $(<) : $(>) : noinstall console nomanifest ; + LinkWith $(<) : bulletdynamics bulletcollision bulletmath ; + CFlags $(<) : + [ FIncludes $(TOP)/src ] + ; + MsvcIncDirs $(<) : + "../../src" ; + } + +if $(GLUT.AVAILABLE) = "yes" +{ + # All demo apps have a lot in common, so use this rule to simply things + rule FrameWorkDemo + { + Application $(<) : $(>) : noinstall console nomanifest ; + LinkWith $(<) : GIMPACTUtils bulletopenglsupport bulletsoftbody convexdecomposition bulletdynamics bulletcollision bulletmath glui ; + CFlags $(<) : + [ FIncludes $(TOP)/Extras ] + [ FIncludes $(TOP)/Demos/OpenGL ] + [ FIncludes $(TOP)/Extras/ConvexDecomposition ] + [ FIncludes $(TOP)/Extras/ConvexHull ] + [ FIncludes $(TOP)/Extras/GIMPACTUtils ] + ; + MsvcIncDirs $(<) : + "../../Extras" + "../../src" + "../../Extras/ConvexHull" + "../../Demos/OpenGL" + "../../Extras/ConvexDecomposition" + "../../Extras/GIMPACTUtils" +; + + } +} + +SubInclude TOP Demos AllBulletDemos ; +SubInclude TOP Demos CcdPhysicsDemo ; +SubInclude TOP Demos Benchmarks ; +SubInclude TOP Demos UserCollisionAlgorithm ; +SubInclude TOP Demos MultiThreadedDemo ; +SubInclude TOP Demos ForkLiftDemo ; +SubInclude TOP Demos BulletDinoDemo ; +SubInclude TOP Demos EPAPenDepthDemo ; +SubInclude TOP Demos HelloWorld ; +SubInclude TOP Demos BspDemo ; +SubInclude TOP Demos BasicDemo ; +SubInclude TOP Demos ConvexDecompositionDemo ; +SubInclude TOP Demos ColladaDemo ; +SubInclude TOP Demos CharacterDemo ; +SubInclude TOP Demos VehicleDemo ; +SubInclude TOP Demos CollisionDemo ; +SubInclude TOP Demos CollisionInterfaceDemo ; +SubInclude TOP Demos GimpactTestDemo ; +SubInclude TOP Demos MovingConcaveDemo ; +SubInclude TOP Demos ConcaveDemo ; +SubInclude TOP Demos MultiMaterialDemo ; +SubInclude TOP Demos ConstraintDemo ; +SubInclude TOP Demos SliderConstraintDemo ; +SubInclude TOP Demos RagdollDemo ; +SubInclude TOP Demos GenericJointDemo ; +SubInclude TOP Demos SoftDemo ; +SubInclude TOP Demos ContinuousConvexCollision ; +SubInclude TOP Demos GjkConvexCastDemo ; +SubInclude TOP Demos Raytracer ; +SubInclude TOP Demos SimplexDemo ; +SubInclude TOP Demos DoublePrecisionDemo ; +SubInclude TOP Demos TerrainDemo ; +SubInclude TOP Demos HeightFieldFluidDemo ; + diff --git a/BulletPhysics/bulletTrunk/Demos/Makefile.am b/BulletPhysics/bulletTrunk/Demos/Makefile.am new file mode 100644 index 00000000..db2d4122 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/Makefile.am @@ -0,0 +1,5 @@ +if CONDITIONAL_BUILD_MULTITHREADED +SUBDIRS=OpenGL BasicDemo TerrainDemo VehicleDemo CcdPhysicsDemo ColladaDemo MultiThreadedDemo SoftDemo AllBulletDemos +else +SUBDIRS=OpenGL BasicDemo TerrainDemo VehicleDemo CcdPhysicsDemo ColladaDemo SoftDemo AllBulletDemos +endif diff --git a/BulletPhysics/bulletTrunk/Demos/MovingConcaveDemo/CMakeLists.txt b/BulletPhysics/bulletTrunk/Demos/MovingConcaveDemo/CMakeLists.txt new file mode 100644 index 00000000..1067ff03 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/MovingConcaveDemo/CMakeLists.txt @@ -0,0 +1,61 @@ +# This is basically the overall name of the project in Visual Studio this is the name of the Solution File + + +# For every executable you have with a main method you should have an add_executable line below. +# For every add executable line you should list every .cpp and .h file you have associated with that executable. + + +# This is the variable for Windows. I use this to define the root of my directory structure. +SET(GLUT_ROOT ${BULLET_PHYSICS_SOURCE_DIR}/Glut) + +# You shouldn't have to modify anything below this line +######################################################## + + +# This is the shortcut to finding GLU, GLUT and OpenGL if they are properly installed on your system +# This should be the case. +INCLUDE (${CMAKE_ROOT}/Modules/FindGLU.cmake) +INCLUDE (${CMAKE_ROOT}/Modules/FindGLUT.cmake) +INCLUDE (${CMAKE_ROOT}/Modules/FindOpenGL.cmake) + + +IF (WIN32) + # This is the Windows code for which Opengl, and Glut are not properly installed + # since I can't install them I must cheat and copy libraries around + INCLUDE_DIRECTORIES(${GLUT_ROOT}) + # LINK_DIRECTORIES(${GLUT_ROOT}\\lib) + IF (${GLUT_glut_LIBRARY} MATCHES "GLUT_glut_LIBRARY-NOTFOUND") + SET(GLUT_glut_LIBRARY ${BULLET_PHYSICS_SOURCE_DIR}/Glut/glut32.lib) + # LINK_LIBRARIES(${GLUT_ROOT}\\lib\\glut32 ${OPENGL_gl_LIBRARY} ${OPENGL_glU_LIBRARY}) + # TARGET_LINK_LIBRARIES(table ${GLUT_ROOT}\\lib\\glut32) +# +# ADD_CUSTOM_COMMAND(TARGET table POST_BUILD COMMAND copy ${GLUT_ROOT}\\lib\\glut32.dll ${GLUT_ROOT}\\bin\\vs2005\\Debug +# COMMAND copy ${GLUT_ROOT}\\lib\\glut32.dll ${GLUT_ROOT}\\bin\\vs2003\\Debug +# COMMAND copy ${GLUT_ROOT}\\lib\\glut32.dll ${GLUT_ROOT}\\bin\\vs6\\Debug) + ELSE (${GLUT_glut_LIBRARY} MATCHES "GLUT_glut_LIBRARY-NOTFOUND") +# LINK_LIBRARIES(${GLUT_glut_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glU_LIBRARY}) +# TARGET_LINK_LIBRARIES(table ${GLUT_glut_LIBRARY}) + ENDIF(${GLUT_glut_LIBRARY} MATCHES "GLUT_glut_LIBRARY-NOTFOUND") +# TARGET_LINK_LIBRARIES(table ${OPENGL_gl_LIBRARY}) +# TARGET_LINK_LIBRARIES(table ${OPENGL_glu_LIBRARY}) +ELSE (WIN32) + # This is the lines for linux. This should always work if everything is installed and working fine. +# SET(CMAKE_BUILD_TYPE Debug) +# SET(CMAKE_CXX_FLAGS_DEBUG "-g") + INCLUDE_DIRECTORIES(/usr/include /usr/local/include ${GLUT_INCLUDE_DIR}) +# TARGET_LINK_LIBRARIES(table ${GLUT_glut_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glU_LIBRARY}) +# TARGET_LINK_LIBRARIES(checker ${GLUT_glut_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glU_LIBRARY}) +ENDIF (WIN32) + +INCLUDE_DIRECTORIES( + ${BULLET_PHYSICS_SOURCE_DIR}/src ${BULLET_PHYSICS_SOURCE_DIR}/Demos/OpenGL } +) + +LINK_LIBRARIES( +OpenGLSupport BulletDynamics BulletCollision LinearMath ${GLUT_glut_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} +) + +ADD_EXECUTABLE(AppMovingConcaveDemo +ConcavePhysicsDemo.cpp +) + diff --git a/BulletPhysics/bulletTrunk/Demos/MovingConcaveDemo/ConcaveDemo.h b/BulletPhysics/bulletTrunk/Demos/MovingConcaveDemo/ConcaveDemo.h new file mode 100644 index 00000000..d1649a4f --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/MovingConcaveDemo/ConcaveDemo.h @@ -0,0 +1,48 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ +#ifndef CONCAVE_DEMO_H +#define CONCAVE_DEMO_H + +#include "DemoApplication.h" + +struct btCollisionAlgorithmCreateFunc; + +///ConcaveDemo shows usage of static concave triangle meshes +///It also shows per-triangle material (friction/restitution) through CustomMaterialCombinerCallback +class ConcaveDemo : public DemoApplication +{ + + btCollisionShape * m_trimeshShape; + + public: + + void initGImpactCollision(); + void initPhysics(); + + virtual void clientMoveAndDisplay(); + + virtual void displayCallback(); + + virtual void renderme(); + virtual void keyboardCallback(unsigned char key, int x, int y); + + ///Demo functions + void shootTrimesh(const btVector3& startPosition,const btVector3& destination); + + +}; + +#endif //CONCAVE_DEMO_H + diff --git a/BulletPhysics/bulletTrunk/Demos/MovingConcaveDemo/ConcavePhysicsDemo.cpp b/BulletPhysics/bulletTrunk/Demos/MovingConcaveDemo/ConcavePhysicsDemo.cpp new file mode 100644 index 00000000..e9f8e3bc --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/MovingConcaveDemo/ConcavePhysicsDemo.cpp @@ -0,0 +1,1927 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#include "btBulletDynamicsCommon.h" +#include "ConcaveDemo.h" + +#include "LinearMath/btDefaultMotionState.h" +#include "LinearMath/btIDebugDraw.h" +#include "LinearMath/btQuickprof.h" +#include "LinearMath/btDefaultMotionState.h" +#include "BulletCollision/Gimpact/btGImpactShape.h" +#include "BulletCollision/Gimpact/btGImpactCollisionAlgorithm.h" + + + +#include "BMF_Api.h" + +#include "GLDebugDrawer.h" + +#include "GL_ShapeDrawer.h" +#include "GlutStuff.h" + + +GLDebugDrawer debugDrawer; + +//***************************THE FAMOUS BUNNY TRIMESH********************************************// + +#define REAL btScalar +const int NUM_TRIANGLES =902; +const int NUM_VERTICES = 453; +const int NUM_INDICES = NUM_TRIANGLES * 3; + + +REAL gVertices[NUM_VERTICES * 3] = { + REAL(-0.334392), REAL(0.133007), REAL(0.062259), + REAL(-0.350189), REAL(0.150354), REAL(-0.147769), + REAL(-0.234201), REAL(0.343811), REAL(-0.174307), + REAL(-0.200259), REAL(0.285207), REAL(0.093749), + REAL(0.003520), REAL(0.475208), REAL(-0.159365), + REAL(0.001856), REAL(0.419203), REAL(0.098582), + REAL(-0.252802), REAL(0.093666), REAL(0.237538), + REAL(-0.162901), REAL(0.237984), REAL(0.206905), + REAL(0.000865), REAL(0.318141), REAL(0.235370), + REAL(-0.414624), REAL(0.164083), REAL(-0.278254), + REAL(-0.262213), REAL(0.357334), REAL(-0.293246), + REAL(0.004628), REAL(0.482694), REAL(-0.338626), + REAL(-0.402162), REAL(0.133528), REAL(-0.443247), + REAL(-0.243781), REAL(0.324275), REAL(-0.436763), + REAL(0.005293), REAL(0.437592), REAL(-0.458332), + REAL(-0.339884), REAL(-0.041150), REAL(-0.668211), + REAL(-0.248382), REAL(0.255825), REAL(-0.627493), + REAL(0.006261), REAL(0.376103), REAL(-0.631506), + REAL(-0.216201), REAL(-0.126776), REAL(-0.886936), + REAL(-0.171075), REAL(0.011544), REAL(-0.881386), + REAL(-0.181074), REAL(0.098223), REAL(-0.814779), + REAL(-0.119891), REAL(0.218786), REAL(-0.760153), + REAL(-0.078895), REAL(0.276780), REAL(-0.739281), + REAL(0.006801), REAL(0.310959), REAL(-0.735661), + REAL(-0.168842), REAL(0.102387), REAL(-0.920381), + REAL(-0.104072), REAL(0.177278), REAL(-0.952530), + REAL(-0.129704), REAL(0.211848), REAL(-0.836678), + REAL(-0.099875), REAL(0.310931), REAL(-0.799381), + REAL(0.007237), REAL(0.361687), REAL(-0.794439), + REAL(-0.077913), REAL(0.258753), REAL(-0.921640), + REAL(0.007957), REAL(0.282241), REAL(-0.931680), + REAL(-0.252222), REAL(-0.550401), REAL(-0.557810), + REAL(-0.267633), REAL(-0.603419), REAL(-0.655209), + REAL(-0.446838), REAL(-0.118517), REAL(-0.466159), + REAL(-0.459488), REAL(-0.093017), REAL(-0.311341), + REAL(-0.370645), REAL(-0.100108), REAL(-0.159454), + REAL(-0.371984), REAL(-0.091991), REAL(-0.011044), + REAL(-0.328945), REAL(-0.098269), REAL(0.088659), + REAL(-0.282452), REAL(-0.018862), REAL(0.311501), + REAL(-0.352403), REAL(-0.131341), REAL(0.144902), + REAL(-0.364126), REAL(-0.200299), REAL(0.202388), + REAL(-0.283965), REAL(-0.231869), REAL(0.023668), + REAL(-0.298943), REAL(-0.155218), REAL(0.369716), + REAL(-0.293787), REAL(-0.121856), REAL(0.419097), + REAL(-0.290163), REAL(-0.290797), REAL(0.107824), + REAL(-0.264165), REAL(-0.272849), REAL(0.036347), + REAL(-0.228567), REAL(-0.372573), REAL(0.290309), + REAL(-0.190431), REAL(-0.286997), REAL(0.421917), + REAL(-0.191039), REAL(-0.240973), REAL(0.507118), + REAL(-0.287272), REAL(-0.276431), REAL(-0.065444), + REAL(-0.295675), REAL(-0.280818), REAL(-0.174200), + REAL(-0.399537), REAL(-0.313131), REAL(-0.376167), + REAL(-0.392666), REAL(-0.488581), REAL(-0.427494), + REAL(-0.331669), REAL(-0.570185), REAL(-0.466054), + REAL(-0.282290), REAL(-0.618140), REAL(-0.589220), + REAL(-0.374238), REAL(-0.594882), REAL(-0.323298), + REAL(-0.381071), REAL(-0.629723), REAL(-0.350777), + REAL(-0.382112), REAL(-0.624060), REAL(-0.221577), + REAL(-0.272701), REAL(-0.566522), REAL(0.259157), + REAL(-0.256702), REAL(-0.663406), REAL(0.286079), + REAL(-0.280948), REAL(-0.428359), REAL(0.055790), + REAL(-0.184974), REAL(-0.508894), REAL(0.326265), + REAL(-0.279971), REAL(-0.526918), REAL(0.395319), + REAL(-0.282599), REAL(-0.663393), REAL(0.412411), + REAL(-0.188329), REAL(-0.475093), REAL(0.417954), + REAL(-0.263384), REAL(-0.663396), REAL(0.466604), + REAL(-0.209063), REAL(-0.663393), REAL(0.509344), + REAL(-0.002044), REAL(-0.319624), REAL(0.553078), + REAL(-0.001266), REAL(-0.371260), REAL(0.413296), + REAL(-0.219753), REAL(-0.339762), REAL(-0.040921), + REAL(-0.256986), REAL(-0.282511), REAL(-0.006349), + REAL(-0.271706), REAL(-0.260881), REAL(0.001764), + REAL(-0.091191), REAL(-0.419184), REAL(-0.045912), + REAL(-0.114944), REAL(-0.429752), REAL(-0.124739), + REAL(-0.113970), REAL(-0.382987), REAL(-0.188540), + REAL(-0.243012), REAL(-0.464942), REAL(-0.242850), + REAL(-0.314815), REAL(-0.505402), REAL(-0.324768), + REAL(0.002774), REAL(-0.437526), REAL(-0.262766), + REAL(-0.072625), REAL(-0.417748), REAL(-0.221440), + REAL(-0.160112), REAL(-0.476932), REAL(-0.293450), + REAL(0.003859), REAL(-0.453425), REAL(-0.443916), + REAL(-0.120363), REAL(-0.581567), REAL(-0.438689), + REAL(-0.091499), REAL(-0.584191), REAL(-0.294511), + REAL(-0.116469), REAL(-0.599861), REAL(-0.188308), + REAL(-0.208032), REAL(-0.513640), REAL(-0.134649), + REAL(-0.235749), REAL(-0.610017), REAL(-0.040939), + REAL(-0.344916), REAL(-0.622487), REAL(-0.085380), + REAL(-0.336401), REAL(-0.531864), REAL(-0.212298), + REAL(0.001961), REAL(-0.459550), REAL(-0.135547), + REAL(-0.058296), REAL(-0.430536), REAL(-0.043440), + REAL(0.001378), REAL(-0.449511), REAL(-0.037762), + REAL(-0.130135), REAL(-0.510222), REAL(0.079144), + REAL(0.000142), REAL(-0.477549), REAL(0.157064), + REAL(-0.114284), REAL(-0.453206), REAL(0.304397), + REAL(-0.000592), REAL(-0.443558), REAL(0.285401), + REAL(-0.056215), REAL(-0.663402), REAL(0.326073), + REAL(-0.026248), REAL(-0.568010), REAL(0.273318), + REAL(-0.049261), REAL(-0.531064), REAL(0.389854), + REAL(-0.127096), REAL(-0.663398), REAL(0.479316), + REAL(-0.058384), REAL(-0.663401), REAL(0.372891), + REAL(-0.303961), REAL(0.054199), REAL(0.625921), + REAL(-0.268594), REAL(0.193403), REAL(0.502766), + REAL(-0.277159), REAL(0.126123), REAL(0.443289), + REAL(-0.287605), REAL(-0.005722), REAL(0.531844), + REAL(-0.231396), REAL(-0.121289), REAL(0.587387), + REAL(-0.253475), REAL(-0.081797), REAL(0.756541), + REAL(-0.195164), REAL(-0.137969), REAL(0.728011), + REAL(-0.167673), REAL(-0.156573), REAL(0.609388), + REAL(-0.145917), REAL(-0.169029), REAL(0.697600), + REAL(-0.077776), REAL(-0.214247), REAL(0.622586), + REAL(-0.076873), REAL(-0.214971), REAL(0.696301), + REAL(-0.002341), REAL(-0.233135), REAL(0.622859), + REAL(-0.002730), REAL(-0.213526), REAL(0.691267), + REAL(-0.003136), REAL(-0.192628), REAL(0.762731), + REAL(-0.056136), REAL(-0.201222), REAL(0.763806), + REAL(-0.114589), REAL(-0.166192), REAL(0.770723), + REAL(-0.155145), REAL(-0.129632), REAL(0.791738), + REAL(-0.183611), REAL(-0.058705), REAL(0.847012), + REAL(-0.165562), REAL(0.001980), REAL(0.833386), + REAL(-0.220084), REAL(0.019914), REAL(0.768935), + REAL(-0.255730), REAL(0.090306), REAL(0.670782), + REAL(-0.255594), REAL(0.113833), REAL(0.663389), + REAL(-0.226380), REAL(0.212655), REAL(0.617740), + REAL(-0.003367), REAL(-0.195342), REAL(0.799680), + REAL(-0.029743), REAL(-0.210508), REAL(0.827180), + REAL(-0.003818), REAL(-0.194783), REAL(0.873636), + REAL(-0.004116), REAL(-0.157907), REAL(0.931268), + REAL(-0.031280), REAL(-0.184555), REAL(0.889476), + REAL(-0.059885), REAL(-0.184448), REAL(0.841330), + REAL(-0.135333), REAL(-0.164332), REAL(0.878200), + REAL(-0.085574), REAL(-0.170948), REAL(0.925547), + REAL(-0.163833), REAL(-0.094170), REAL(0.897114), + REAL(-0.138444), REAL(-0.104250), REAL(0.945975), + REAL(-0.083497), REAL(-0.084934), REAL(0.979607), + REAL(-0.004433), REAL(-0.146642), REAL(0.985872), + REAL(-0.150715), REAL(0.032650), REAL(0.884111), + REAL(-0.135892), REAL(-0.035520), REAL(0.945455), + REAL(-0.070612), REAL(0.036849), REAL(0.975733), + REAL(-0.004458), REAL(-0.042526), REAL(1.015670), + REAL(-0.004249), REAL(0.046042), REAL(1.003240), + REAL(-0.086969), REAL(0.133224), REAL(0.947633), + REAL(-0.003873), REAL(0.161605), REAL(0.970499), + REAL(-0.125544), REAL(0.140012), REAL(0.917678), + REAL(-0.125651), REAL(0.250246), REAL(0.857602), + REAL(-0.003127), REAL(0.284070), REAL(0.878870), + REAL(-0.159174), REAL(0.125726), REAL(0.888878), + REAL(-0.183807), REAL(0.196970), REAL(0.844480), + REAL(-0.159890), REAL(0.291736), REAL(0.732480), + REAL(-0.199495), REAL(0.207230), REAL(0.779864), + REAL(-0.206182), REAL(0.164608), REAL(0.693257), + REAL(-0.186315), REAL(0.160689), REAL(0.817193), + REAL(-0.192827), REAL(0.166706), REAL(0.782271), + REAL(-0.175112), REAL(0.110008), REAL(0.860621), + REAL(-0.161022), REAL(0.057420), REAL(0.855111), + REAL(-0.172319), REAL(0.036155), REAL(0.816189), + REAL(-0.190318), REAL(0.064083), REAL(0.760605), + REAL(-0.195072), REAL(0.129179), REAL(0.731104), + REAL(-0.203126), REAL(0.410287), REAL(0.680536), + REAL(-0.216677), REAL(0.309274), REAL(0.642272), + REAL(-0.241515), REAL(0.311485), REAL(0.587832), + REAL(-0.002209), REAL(0.366663), REAL(0.749413), + REAL(-0.088230), REAL(0.396265), REAL(0.678635), + REAL(-0.170147), REAL(0.109517), REAL(0.840784), + REAL(-0.160521), REAL(0.067766), REAL(0.830650), + REAL(-0.181546), REAL(0.139805), REAL(0.812146), + REAL(-0.180495), REAL(0.148568), REAL(0.776087), + REAL(-0.180255), REAL(0.129125), REAL(0.744192), + REAL(-0.186298), REAL(0.078308), REAL(0.769352), + REAL(-0.167622), REAL(0.060539), REAL(0.806675), + REAL(-0.189876), REAL(0.102760), REAL(0.802582), + REAL(-0.108340), REAL(0.455446), REAL(0.657174), + REAL(-0.241585), REAL(0.527592), REAL(0.669296), + REAL(-0.265676), REAL(0.513366), REAL(0.634594), + REAL(-0.203073), REAL(0.478550), REAL(0.581526), + REAL(-0.266772), REAL(0.642330), REAL(0.602061), + REAL(-0.216961), REAL(0.564846), REAL(0.535435), + REAL(-0.202210), REAL(0.525495), REAL(0.475944), + REAL(-0.193888), REAL(0.467925), REAL(0.520606), + REAL(-0.265837), REAL(0.757267), REAL(0.500933), + REAL(-0.240306), REAL(0.653440), REAL(0.463215), + REAL(-0.309239), REAL(0.776868), REAL(0.304726), + REAL(-0.271009), REAL(0.683094), REAL(0.382018), + REAL(-0.312111), REAL(0.671099), REAL(0.286687), + REAL(-0.268791), REAL(0.624342), REAL(0.377231), + REAL(-0.302457), REAL(0.533996), REAL(0.360289), + REAL(-0.263656), REAL(0.529310), REAL(0.412564), + REAL(-0.282311), REAL(0.415167), REAL(0.447666), + REAL(-0.239201), REAL(0.442096), REAL(0.495604), + REAL(-0.220043), REAL(0.569026), REAL(0.445877), + REAL(-0.001263), REAL(0.395631), REAL(0.602029), + REAL(-0.057345), REAL(0.442535), REAL(0.572224), + REAL(-0.088927), REAL(0.506333), REAL(0.529106), + REAL(-0.125738), REAL(0.535076), REAL(0.612913), + REAL(-0.126251), REAL(0.577170), REAL(0.483159), + REAL(-0.149594), REAL(0.611520), REAL(0.557731), + REAL(-0.163188), REAL(0.660791), REAL(0.491080), + REAL(-0.172482), REAL(0.663387), REAL(0.415416), + REAL(-0.160464), REAL(0.591710), REAL(0.370659), + REAL(-0.156445), REAL(0.536396), REAL(0.378302), + REAL(-0.136496), REAL(0.444358), REAL(0.425226), + REAL(-0.095564), REAL(0.373768), REAL(0.473659), + REAL(-0.104146), REAL(0.315912), REAL(0.498104), + REAL(-0.000496), REAL(0.384194), REAL(0.473817), + REAL(-0.000183), REAL(0.297770), REAL(0.401486), + REAL(-0.129042), REAL(0.270145), REAL(0.434495), + REAL(0.000100), REAL(0.272963), REAL(0.349138), + REAL(-0.113060), REAL(0.236984), REAL(0.385554), + REAL(0.007260), REAL(0.016311), REAL(-0.883396), + REAL(0.007865), REAL(0.122104), REAL(-0.956137), + REAL(-0.032842), REAL(0.115282), REAL(-0.953252), + REAL(-0.089115), REAL(0.108449), REAL(-0.950317), + REAL(-0.047440), REAL(0.014729), REAL(-0.882756), + REAL(-0.104458), REAL(0.013137), REAL(-0.882070), + REAL(-0.086439), REAL(-0.584866), REAL(-0.608343), + REAL(-0.115026), REAL(-0.662605), REAL(-0.436732), + REAL(-0.071683), REAL(-0.665372), REAL(-0.606385), + REAL(-0.257884), REAL(-0.665381), REAL(-0.658052), + REAL(-0.272542), REAL(-0.665381), REAL(-0.592063), + REAL(-0.371322), REAL(-0.665382), REAL(-0.353620), + REAL(-0.372362), REAL(-0.665381), REAL(-0.224420), + REAL(-0.335166), REAL(-0.665380), REAL(-0.078623), + REAL(-0.225999), REAL(-0.665375), REAL(-0.038981), + REAL(-0.106719), REAL(-0.665374), REAL(-0.186351), + REAL(-0.081749), REAL(-0.665372), REAL(-0.292554), + REAL(0.006943), REAL(-0.091505), REAL(-0.858354), + REAL(0.006117), REAL(-0.280985), REAL(-0.769967), + REAL(0.004495), REAL(-0.502360), REAL(-0.559799), + REAL(-0.198638), REAL(-0.302135), REAL(-0.845816), + REAL(-0.237395), REAL(-0.542544), REAL(-0.587188), + REAL(-0.270001), REAL(-0.279489), REAL(-0.669861), + REAL(-0.134547), REAL(-0.119852), REAL(-0.959004), + REAL(-0.052088), REAL(-0.122463), REAL(-0.944549), + REAL(-0.124463), REAL(-0.293508), REAL(-0.899566), + REAL(-0.047616), REAL(-0.289643), REAL(-0.879292), + REAL(-0.168595), REAL(-0.529132), REAL(-0.654931), + REAL(-0.099793), REAL(-0.515719), REAL(-0.645873), + REAL(-0.186168), REAL(-0.605282), REAL(-0.724690), + REAL(-0.112970), REAL(-0.583097), REAL(-0.707469), + REAL(-0.108152), REAL(-0.665375), REAL(-0.700408), + REAL(-0.183019), REAL(-0.665378), REAL(-0.717630), + REAL(-0.349529), REAL(-0.334459), REAL(-0.511985), + REAL(-0.141182), REAL(-0.437705), REAL(-0.798194), + REAL(-0.212670), REAL(-0.448725), REAL(-0.737447), + REAL(-0.261111), REAL(-0.414945), REAL(-0.613835), + REAL(-0.077364), REAL(-0.431480), REAL(-0.778113), + REAL(0.005174), REAL(-0.425277), REAL(-0.651592), + REAL(0.089236), REAL(-0.431732), REAL(-0.777093), + REAL(0.271006), REAL(-0.415749), REAL(-0.610577), + REAL(0.223981), REAL(-0.449384), REAL(-0.734774), + REAL(0.153275), REAL(-0.438150), REAL(-0.796391), + REAL(0.358414), REAL(-0.335529), REAL(-0.507649), + REAL(0.193434), REAL(-0.665946), REAL(-0.715325), + REAL(0.118363), REAL(-0.665717), REAL(-0.699021), + REAL(0.123515), REAL(-0.583454), REAL(-0.706020), + REAL(0.196851), REAL(-0.605860), REAL(-0.722345), + REAL(0.109788), REAL(-0.516035), REAL(-0.644590), + REAL(0.178656), REAL(-0.529656), REAL(-0.652804), + REAL(0.061157), REAL(-0.289807), REAL(-0.878626), + REAL(0.138234), REAL(-0.293905), REAL(-0.897958), + REAL(0.066933), REAL(-0.122643), REAL(-0.943820), + REAL(0.149571), REAL(-0.120281), REAL(-0.957264), + REAL(0.280989), REAL(-0.280321), REAL(-0.666487), + REAL(0.246581), REAL(-0.543275), REAL(-0.584224), + REAL(0.211720), REAL(-0.302754), REAL(-0.843303), + REAL(0.086966), REAL(-0.665627), REAL(-0.291520), + REAL(0.110634), REAL(-0.665702), REAL(-0.185021), + REAL(0.228099), REAL(-0.666061), REAL(-0.036201), + REAL(0.337743), REAL(-0.666396), REAL(-0.074503), + REAL(0.376722), REAL(-0.666513), REAL(-0.219833), + REAL(0.377265), REAL(-0.666513), REAL(-0.349036), + REAL(0.281411), REAL(-0.666217), REAL(-0.588670), + REAL(0.267564), REAL(-0.666174), REAL(-0.654834), + REAL(0.080745), REAL(-0.665602), REAL(-0.605452), + REAL(0.122016), REAL(-0.662963), REAL(-0.435280), + REAL(0.095767), REAL(-0.585141), REAL(-0.607228), + REAL(0.118944), REAL(0.012799), REAL(-0.880702), + REAL(0.061944), REAL(0.014564), REAL(-0.882086), + REAL(0.104725), REAL(0.108156), REAL(-0.949130), + REAL(0.048513), REAL(0.115159), REAL(-0.952753), + REAL(0.112696), REAL(0.236643), REAL(0.386937), + REAL(0.128177), REAL(0.269757), REAL(0.436071), + REAL(0.102643), REAL(0.315600), REAL(0.499370), + REAL(0.094535), REAL(0.373481), REAL(0.474824), + REAL(0.136270), REAL(0.443946), REAL(0.426895), + REAL(0.157071), REAL(0.535923), REAL(0.380222), + REAL(0.161350), REAL(0.591224), REAL(0.372630), + REAL(0.173035), REAL(0.662865), REAL(0.417531), + REAL(0.162808), REAL(0.660299), REAL(0.493077), + REAL(0.148250), REAL(0.611070), REAL(0.559555), + REAL(0.125719), REAL(0.576790), REAL(0.484702), + REAL(0.123489), REAL(0.534699), REAL(0.614440), + REAL(0.087621), REAL(0.506066), REAL(0.530188), + REAL(0.055321), REAL(0.442365), REAL(0.572915), + REAL(0.219936), REAL(0.568361), REAL(0.448571), + REAL(0.238099), REAL(0.441375), REAL(0.498528), + REAL(0.281711), REAL(0.414315), REAL(0.451121), + REAL(0.263833), REAL(0.528513), REAL(0.415794), + REAL(0.303284), REAL(0.533081), REAL(0.363998), + REAL(0.269687), REAL(0.623528), REAL(0.380528), + REAL(0.314255), REAL(0.670153), REAL(0.290524), + REAL(0.272023), REAL(0.682273), REAL(0.385343), + REAL(0.311480), REAL(0.775931), REAL(0.308527), + REAL(0.240239), REAL(0.652714), REAL(0.466159), + REAL(0.265619), REAL(0.756464), REAL(0.504187), + REAL(0.192562), REAL(0.467341), REAL(0.522972), + REAL(0.201605), REAL(0.524885), REAL(0.478417), + REAL(0.215743), REAL(0.564193), REAL(0.538084), + REAL(0.264969), REAL(0.641527), REAL(0.605317), + REAL(0.201031), REAL(0.477940), REAL(0.584002), + REAL(0.263086), REAL(0.512567), REAL(0.637832), + REAL(0.238615), REAL(0.526867), REAL(0.672237), + REAL(0.105309), REAL(0.455123), REAL(0.658482), + REAL(0.183993), REAL(0.102195), REAL(0.804872), + REAL(0.161563), REAL(0.060042), REAL(0.808692), + REAL(0.180748), REAL(0.077754), REAL(0.771600), + REAL(0.175168), REAL(0.128588), REAL(0.746368), + REAL(0.175075), REAL(0.148030), REAL(0.778264), + REAL(0.175658), REAL(0.139265), REAL(0.814333), + REAL(0.154191), REAL(0.067291), REAL(0.832578), + REAL(0.163818), REAL(0.109013), REAL(0.842830), + REAL(0.084760), REAL(0.396004), REAL(0.679695), + REAL(0.238888), REAL(0.310760), REAL(0.590775), + REAL(0.213380), REAL(0.308625), REAL(0.644905), + REAL(0.199666), REAL(0.409678), REAL(0.683003), + REAL(0.190143), REAL(0.128597), REAL(0.733463), + REAL(0.184833), REAL(0.063516), REAL(0.762902), + REAL(0.166070), REAL(0.035644), REAL(0.818261), + REAL(0.154361), REAL(0.056943), REAL(0.857042), + REAL(0.168542), REAL(0.109489), REAL(0.862725), + REAL(0.187387), REAL(0.166131), REAL(0.784599), + REAL(0.180428), REAL(0.160135), REAL(0.819438), + REAL(0.201823), REAL(0.163991), REAL(0.695756), + REAL(0.194206), REAL(0.206635), REAL(0.782275), + REAL(0.155438), REAL(0.291260), REAL(0.734412), + REAL(0.177696), REAL(0.196424), REAL(0.846693), + REAL(0.152305), REAL(0.125256), REAL(0.890786), + REAL(0.119546), REAL(0.249876), REAL(0.859104), + REAL(0.118369), REAL(0.139643), REAL(0.919173), + REAL(0.079410), REAL(0.132973), REAL(0.948652), + REAL(0.062419), REAL(0.036648), REAL(0.976547), + REAL(0.127847), REAL(-0.035919), REAL(0.947070), + REAL(0.143624), REAL(0.032206), REAL(0.885913), + REAL(0.074888), REAL(-0.085173), REAL(0.980577), + REAL(0.130184), REAL(-0.104656), REAL(0.947620), + REAL(0.156201), REAL(-0.094653), REAL(0.899074), + REAL(0.077366), REAL(-0.171194), REAL(0.926545), + REAL(0.127722), REAL(-0.164729), REAL(0.879810), + REAL(0.052670), REAL(-0.184618), REAL(0.842019), + REAL(0.023477), REAL(-0.184638), REAL(0.889811), + REAL(0.022626), REAL(-0.210587), REAL(0.827500), + REAL(0.223089), REAL(0.211976), REAL(0.620493), + REAL(0.251444), REAL(0.113067), REAL(0.666494), + REAL(0.251419), REAL(0.089540), REAL(0.673887), + REAL(0.214360), REAL(0.019258), REAL(0.771595), + REAL(0.158999), REAL(0.001490), REAL(0.835374), + REAL(0.176696), REAL(-0.059249), REAL(0.849218), + REAL(0.148696), REAL(-0.130091), REAL(0.793599), + REAL(0.108290), REAL(-0.166528), REAL(0.772088), + REAL(0.049820), REAL(-0.201382), REAL(0.764454), + REAL(0.071341), REAL(-0.215195), REAL(0.697209), + REAL(0.073148), REAL(-0.214475), REAL(0.623510), + REAL(0.140502), REAL(-0.169461), REAL(0.699354), + REAL(0.163374), REAL(-0.157073), REAL(0.611416), + REAL(0.189466), REAL(-0.138550), REAL(0.730366), + REAL(0.247593), REAL(-0.082554), REAL(0.759610), + REAL(0.227468), REAL(-0.121982), REAL(0.590197), + REAL(0.284702), REAL(-0.006586), REAL(0.535347), + REAL(0.275741), REAL(0.125287), REAL(0.446676), + REAL(0.266650), REAL(0.192594), REAL(0.506044), + REAL(0.300086), REAL(0.053287), REAL(0.629620), + REAL(0.055450), REAL(-0.663935), REAL(0.375065), + REAL(0.122854), REAL(-0.664138), REAL(0.482323), + REAL(0.046520), REAL(-0.531571), REAL(0.391918), + REAL(0.024824), REAL(-0.568450), REAL(0.275106), + REAL(0.053855), REAL(-0.663931), REAL(0.328224), + REAL(0.112829), REAL(-0.453549), REAL(0.305788), + REAL(0.131265), REAL(-0.510617), REAL(0.080746), + REAL(0.061174), REAL(-0.430716), REAL(-0.042710), + REAL(0.341019), REAL(-0.532887), REAL(-0.208150), + REAL(0.347705), REAL(-0.623533), REAL(-0.081139), + REAL(0.238040), REAL(-0.610732), REAL(-0.038037), + REAL(0.211764), REAL(-0.514274), REAL(-0.132078), + REAL(0.120605), REAL(-0.600219), REAL(-0.186856), + REAL(0.096985), REAL(-0.584476), REAL(-0.293357), + REAL(0.127621), REAL(-0.581941), REAL(-0.437170), + REAL(0.165902), REAL(-0.477425), REAL(-0.291453), + REAL(0.077720), REAL(-0.417975), REAL(-0.220519), + REAL(0.320892), REAL(-0.506363), REAL(-0.320874), + REAL(0.248214), REAL(-0.465684), REAL(-0.239842), + REAL(0.118764), REAL(-0.383338), REAL(-0.187114), + REAL(0.118816), REAL(-0.430106), REAL(-0.123307), + REAL(0.094131), REAL(-0.419464), REAL(-0.044777), + REAL(0.274526), REAL(-0.261706), REAL(0.005110), + REAL(0.259842), REAL(-0.283292), REAL(-0.003185), + REAL(0.222861), REAL(-0.340431), REAL(-0.038210), + REAL(0.204445), REAL(-0.664380), REAL(0.513353), + REAL(0.259286), REAL(-0.664547), REAL(0.471281), + REAL(0.185402), REAL(-0.476020), REAL(0.421718), + REAL(0.279163), REAL(-0.664604), REAL(0.417328), + REAL(0.277157), REAL(-0.528122), REAL(0.400208), + REAL(0.183069), REAL(-0.509812), REAL(0.329995), + REAL(0.282599), REAL(-0.429210), REAL(0.059242), + REAL(0.254816), REAL(-0.664541), REAL(0.290687), + REAL(0.271436), REAL(-0.567707), REAL(0.263966), + REAL(0.386561), REAL(-0.625221), REAL(-0.216870), + REAL(0.387086), REAL(-0.630883), REAL(-0.346073), + REAL(0.380021), REAL(-0.596021), REAL(-0.318679), + REAL(0.291269), REAL(-0.619007), REAL(-0.585707), + REAL(0.339280), REAL(-0.571198), REAL(-0.461946), + REAL(0.400045), REAL(-0.489778), REAL(-0.422640), + REAL(0.406817), REAL(-0.314349), REAL(-0.371230), + REAL(0.300588), REAL(-0.281718), REAL(-0.170549), + REAL(0.290866), REAL(-0.277304), REAL(-0.061905), + REAL(0.187735), REAL(-0.241545), REAL(0.509437), + REAL(0.188032), REAL(-0.287569), REAL(0.424234), + REAL(0.227520), REAL(-0.373262), REAL(0.293102), + REAL(0.266526), REAL(-0.273650), REAL(0.039597), + REAL(0.291592), REAL(-0.291676), REAL(0.111386), + REAL(0.291914), REAL(-0.122741), REAL(0.422683), + REAL(0.297574), REAL(-0.156119), REAL(0.373368), + REAL(0.286603), REAL(-0.232731), REAL(0.027162), + REAL(0.364663), REAL(-0.201399), REAL(0.206850), + REAL(0.353855), REAL(-0.132408), REAL(0.149228), + REAL(0.282208), REAL(-0.019715), REAL(0.314960), + REAL(0.331187), REAL(-0.099266), REAL(0.092701), + REAL(0.375463), REAL(-0.093120), REAL(-0.006467), + REAL(0.375917), REAL(-0.101236), REAL(-0.154882), + REAL(0.466635), REAL(-0.094416), REAL(-0.305669), + REAL(0.455805), REAL(-0.119881), REAL(-0.460632), + REAL(0.277465), REAL(-0.604242), REAL(-0.651871), + REAL(0.261022), REAL(-0.551176), REAL(-0.554667), + REAL(0.093627), REAL(0.258494), REAL(-0.920589), + REAL(0.114248), REAL(0.310608), REAL(-0.798070), + REAL(0.144232), REAL(0.211434), REAL(-0.835001), + REAL(0.119916), REAL(0.176940), REAL(-0.951159), + REAL(0.184061), REAL(0.101854), REAL(-0.918220), + REAL(0.092431), REAL(0.276521), REAL(-0.738231), + REAL(0.133504), REAL(0.218403), REAL(-0.758602), + REAL(0.194987), REAL(0.097655), REAL(-0.812476), + REAL(0.185542), REAL(0.011005), REAL(-0.879202), + REAL(0.230315), REAL(-0.127450), REAL(-0.884202), + REAL(0.260471), REAL(0.255056), REAL(-0.624378), + REAL(0.351567), REAL(-0.042194), REAL(-0.663976), + REAL(0.253742), REAL(0.323524), REAL(-0.433716), + REAL(0.411612), REAL(0.132299), REAL(-0.438264), + REAL(0.270513), REAL(0.356530), REAL(-0.289984), + REAL(0.422146), REAL(0.162819), REAL(-0.273130), + REAL(0.164724), REAL(0.237490), REAL(0.208912), + REAL(0.253806), REAL(0.092900), REAL(0.240640), + REAL(0.203608), REAL(0.284597), REAL(0.096223), + REAL(0.241006), REAL(0.343093), REAL(-0.171396), + REAL(0.356076), REAL(0.149288), REAL(-0.143443), + REAL(0.337656), REAL(0.131992), REAL(0.066374) +}; + +int gIndices[NUM_TRIANGLES][3] = { + {126,134,133}, + {342,138,134}, + {133,134,138}, + {126,342,134}, + {312,316,317}, + {169,163,162}, + {312,317,319}, + {312,319,318}, + {169,162,164}, + {169,168,163}, + {312,314,315}, + {169,164,165}, + {169,167,168}, + {312,315,316}, + {312,313,314}, + {169,165,166}, + {169,166,167}, + {312,318,313}, + {308,304,305}, + {308,305,306}, + {179,181,188}, + {177,173,175}, + {177,175,176}, + {302,293,300}, + {322,294,304}, + {188,176,175}, + {188,175,179}, + {158,177,187}, + {305,293,302}, + {305,302,306}, + {322,304,308}, + {188,181,183}, + {158,173,177}, + {293,298,300}, + {304,294,296}, + {304,296,305}, + {185,176,188}, + {185,188,183}, + {187,177,176}, + {187,176,185}, + {305,296,298}, + {305,298,293}, + {436,432, 28}, + {436, 28, 23}, + {434,278,431}, + { 30,208,209}, + { 30,209, 29}, + { 19, 20, 24}, + {208,207,211}, + {208,211,209}, + { 19,210,212}, + {433,434,431}, + {433,431,432}, + {433,432,436}, + {436,437,433}, + {277,275,276}, + {277,276,278}, + {209,210, 25}, + { 21, 26, 24}, + { 21, 24, 20}, + { 25, 26, 27}, + { 25, 27, 29}, + {435,439,277}, + {439,275,277}, + {432,431, 30}, + {432, 30, 28}, + {433,437,438}, + {433,438,435}, + {434,277,278}, + { 24, 25,210}, + { 24, 26, 25}, + { 29, 27, 28}, + { 29, 28, 30}, + { 19, 24,210}, + {208, 30,431}, + {208,431,278}, + {435,434,433}, + {435,277,434}, + { 25, 29,209}, + { 27, 22, 23}, + { 27, 23, 28}, + { 26, 22, 27}, + { 26, 21, 22}, + {212,210,209}, + {212,209,211}, + {207,208,278}, + {207,278,276}, + {439,435,438}, + { 12, 9, 10}, + { 12, 10, 13}, + { 2, 3, 5}, + { 2, 5, 4}, + { 16, 13, 14}, + { 16, 14, 17}, + { 22, 21, 16}, + { 13, 10, 11}, + { 13, 11, 14}, + { 1, 0, 3}, + { 1, 3, 2}, + { 15, 12, 16}, + { 19, 18, 15}, + { 19, 15, 16}, + { 19, 16, 20}, + { 9, 1, 2}, + { 9, 2, 10}, + { 3, 7, 8}, + { 3, 8, 5}, + { 16, 17, 23}, + { 16, 23, 22}, + { 21, 20, 16}, + { 10, 2, 4}, + { 10, 4, 11}, + { 0, 6, 7}, + { 0, 7, 3}, + { 12, 13, 16}, + {451,446,445}, + {451,445,450}, + {442,440,439}, + {442,439,438}, + {442,438,441}, + {421,420,422}, + {412,411,426}, + {412,426,425}, + {408,405,407}, + {413, 67, 68}, + {413, 68,414}, + {391,390,412}, + { 80,384,386}, + {404,406,378}, + {390,391,377}, + {390,377, 88}, + {400,415,375}, + {398,396,395}, + {398,395,371}, + {398,371,370}, + {112,359,358}, + {112,358,113}, + {351,352,369}, + {125,349,348}, + {345,343,342}, + {342,340,339}, + {341,335,337}, + {328,341,327}, + {331,323,333}, + {331,322,323}, + {327,318,319}, + {327,319,328}, + {315,314,324}, + {302,300,301}, + {302,301,303}, + {320,311,292}, + {285,284,289}, + {310,307,288}, + {310,288,290}, + {321,350,281}, + {321,281,282}, + {423,448,367}, + {272,273,384}, + {272,384,274}, + {264,265,382}, + {264,382,383}, + {440,442,261}, + {440,261,263}, + {252,253,254}, + {252,254,251}, + {262,256,249}, + {262,249,248}, + {228,243,242}, + {228, 31,243}, + {213,215,238}, + {213,238,237}, + { 19,212,230}, + {224,225,233}, + {224,233,231}, + {217,218, 56}, + {217, 56, 54}, + {217,216,239}, + {217,239,238}, + {217,238,215}, + {218,217,215}, + {218,215,214}, + { 6,102,206}, + {186,199,200}, + {197,182,180}, + {170,171,157}, + {201,200,189}, + {170,190,191}, + {170,191,192}, + {175,174,178}, + {175,178,179}, + {168,167,155}, + {122,149,158}, + {122,158,159}, + {135,153,154}, + {135,154,118}, + {143,140,141}, + {143,141,144}, + {132,133,136}, + {130,126,133}, + {124,125,127}, + {122,101,100}, + {122,100,121}, + {110,108,107}, + {110,107,109}, + { 98, 99, 97}, + { 98, 97, 64}, + { 98, 64, 66}, + { 87, 55, 57}, + { 83, 82, 79}, + { 83, 79, 84}, + { 78, 74, 50}, + { 49, 71, 41}, + { 49, 41, 37}, + { 49, 37, 36}, + { 58, 44, 60}, + { 60, 59, 58}, + { 51, 34, 33}, + { 39, 40, 42}, + { 39, 42, 38}, + {243,240, 33}, + {243, 33,229}, + { 39, 38, 6}, + { 44, 46, 40}, + { 55, 56, 57}, + { 64, 62, 65}, + { 64, 65, 66}, + { 41, 71, 45}, + { 75, 50, 51}, + { 81, 79, 82}, + { 77, 88, 73}, + { 93, 92, 94}, + { 68, 47, 46}, + { 96, 97, 99}, + { 96, 99, 95}, + {110,109,111}, + {111,112,110}, + {114,113,123}, + {114,123,124}, + {132,131,129}, + {133,137,136}, + {135,142,145}, + {145,152,135}, + {149,147,157}, + {157,158,149}, + {164,150,151}, + {153,163,168}, + {153,168,154}, + {185,183,182}, + {185,182,184}, + {161,189,190}, + {200,199,191}, + {200,191,190}, + {180,178,195}, + {180,195,196}, + {102,101,204}, + {102,204,206}, + { 43, 48,104}, + { 43,104,103}, + {216,217, 54}, + {216, 54, 32}, + {207,224,231}, + {230,212,211}, + {230,211,231}, + {227,232,241}, + {227,241,242}, + {235,234,241}, + {235,241,244}, + {430,248,247}, + {272,274,253}, + {272,253,252}, + {439,260,275}, + {225,224,259}, + {225,259,257}, + {269,270,407}, + {269,407,405}, + {270,269,273}, + {270,273,272}, + {273,269,268}, + {273,268,267}, + {273,267,266}, + {273,266,265}, + {273,265,264}, + {448,279,367}, + {281,350,368}, + {285,286,301}, + {290,323,310}, + {290,311,323}, + {282,281,189}, + {292,311,290}, + {292,290,291}, + {307,306,302}, + {307,302,303}, + {316,315,324}, + {316,324,329}, + {331,351,350}, + {330,334,335}, + {330,335,328}, + {341,337,338}, + {344,355,354}, + {346,345,348}, + {346,348,347}, + {364,369,352}, + {364,352,353}, + {365,363,361}, + {365,361,362}, + {376,401,402}, + {373,372,397}, + {373,397,400}, + {376, 92,377}, + {381,378,387}, + {381,387,385}, + {386, 77, 80}, + {390,389,412}, + {416,417,401}, + {403,417,415}, + {408,429,430}, + {419,423,418}, + {427,428,444}, + {427,444,446}, + {437,436,441}, + {450,445, 11}, + {450, 11, 4}, + {447,449, 5}, + {447, 5, 8}, + {441,438,437}, + {425,426,451}, + {425,451,452}, + {417,421,415}, + {408,407,429}, + {399,403,400}, + {399,400,397}, + {394,393,416}, + {389,411,412}, + {386,383,385}, + {408,387,378}, + {408,378,406}, + {377,391,376}, + { 94,375,415}, + {372,373,374}, + {372,374,370}, + {359,111,360}, + {359,112,111}, + {113,358,349}, + {113,349,123}, + {346,343,345}, + {343,340,342}, + {338,336,144}, + {338,144,141}, + {327,341,354}, + {327,354,326}, + {331,350,321}, + {331,321,322}, + {314,313,326}, + {314,326,325}, + {300,298,299}, + {300,299,301}, + {288,287,289}, + {189,292,282}, + {287,288,303}, + {284,285,297}, + {368,280,281}, + {448,447,279}, + {274,226,255}, + {267,268,404}, + {267,404,379}, + {429,262,430}, + {439,440,260}, + {257,258,249}, + {257,249,246}, + {430,262,248}, + {234,228,242}, + {234,242,241}, + {237,238,239}, + {237,239,236}, + { 15, 18,227}, + { 15,227,229}, + {222,223, 82}, + {222, 82, 83}, + {214,215,213}, + {214,213, 81}, + { 38,102, 6}, + {122,159,200}, + {122,200,201}, + {174,171,192}, + {174,192,194}, + {197,193,198}, + {190,170,161}, + {181,179,178}, + {181,178,180}, + {166,156,155}, + {163,153,152}, + {163,152,162}, + {120,156,149}, + {120,149,121}, + {152,153,135}, + {140,143,142}, + {135,131,132}, + {135,132,136}, + {130,129,128}, + {130,128,127}, + {100,105,119}, + {100,119,120}, + {106,104,107}, + {106,107,108}, + { 91, 95, 59}, + { 93, 94, 68}, + { 91, 89, 92}, + { 76, 53, 55}, + { 76, 55, 87}, + { 81, 78, 79}, + { 74, 73, 49}, + { 69, 60, 45}, + { 58, 62, 64}, + { 58, 64, 61}, + { 53, 31, 32}, + { 32, 54, 53}, + { 42, 43, 38}, + { 35, 36, 0}, + { 35, 0, 1}, + { 34, 35, 1}, + { 34, 1, 9}, + { 44, 40, 41}, + { 44, 41, 45}, + { 33,240, 51}, + { 63, 62, 58}, + { 63, 58, 59}, + { 45, 71, 70}, + { 76, 75, 51}, + { 76, 51, 52}, + { 86, 85, 84}, + { 86, 84, 87}, + { 89, 72, 73}, + { 89, 73, 88}, + { 91, 92, 96}, + { 91, 96, 95}, + { 72, 91, 60}, + { 72, 60, 69}, + {104,106,105}, + {119,105,117}, + {119,117,118}, + {124,127,128}, + {117,116,129}, + {117,129,131}, + {118,117,131}, + {135,140,142}, + {146,150,152}, + {146,152,145}, + {149,122,121}, + {166,165,151}, + {166,151,156}, + {158,172,173}, + {161,160,189}, + {199,198,193}, + {199,193,191}, + {204,201,202}, + {178,174,194}, + {200,159,186}, + {109, 48, 67}, + { 48,107,104}, + {216, 32,236}, + {216,236,239}, + {223,214, 81}, + {223, 81, 82}, + { 33, 12, 15}, + { 32,228,234}, + { 32,234,236}, + {240, 31, 52}, + {256,255,246}, + {256,246,249}, + {258,263,248}, + {258,248,249}, + {275,260,259}, + {275,259,276}, + {207,276,259}, + {270,271,429}, + {270,429,407}, + {413,418,366}, + {413,366,365}, + {368,367,279}, + {368,279,280}, + {303,301,286}, + {303,286,287}, + {283,282,292}, + {283,292,291}, + {320,292,189}, + {298,296,297}, + {298,297,299}, + {318,327,326}, + {318,326,313}, + {329,330,317}, + {336,333,320}, + {326,354,353}, + {334,332,333}, + {334,333,336}, + {342,339,139}, + {342,139,138}, + {345,342,126}, + {347,357,356}, + {369,368,351}, + {363,356,357}, + {363,357,361}, + {366,367,368}, + {366,368,369}, + {375,373,400}, + { 92, 90,377}, + {409,387,408}, + {386,385,387}, + {386,387,388}, + {412,394,391}, + {396,398,399}, + {408,406,405}, + {415,421,419}, + {415,419,414}, + {425,452,448}, + {425,448,424}, + {444,441,443}, + {448,452,449}, + {448,449,447}, + {446,444,443}, + {446,443,445}, + {250,247,261}, + {250,261,428}, + {421,422,423}, + {421,423,419}, + {427,410,250}, + {417,403,401}, + {403,402,401}, + {420,392,412}, + {420,412,425}, + {420,425,424}, + {386,411,389}, + {383,382,381}, + {383,381,385}, + {378,379,404}, + {372,371,395}, + {372,395,397}, + {371,372,370}, + {361,359,360}, + {361,360,362}, + {368,350,351}, + {349,347,348}, + {356,355,344}, + {356,344,346}, + {344,341,340}, + {344,340,343}, + {338,337,336}, + {328,335,341}, + {324,352,351}, + {324,351,331}, + {320,144,336}, + {314,325,324}, + {322,308,309}, + {310,309,307}, + {287,286,289}, + {203,280,279}, + {203,279,205}, + {297,295,283}, + {297,283,284}, + {447,205,279}, + {274,384, 80}, + {274, 80,226}, + {266,267,379}, + {266,379,380}, + {225,257,246}, + {225,246,245}, + {256,254,253}, + {256,253,255}, + {430,247,250}, + {226,235,244}, + {226,244,245}, + {232,233,244}, + {232,244,241}, + {230, 18, 19}, + { 32, 31,228}, + {219,220, 86}, + {219, 86, 57}, + {226,213,235}, + {206, 7, 6}, + {122,201,101}, + {201,204,101}, + {180,196,197}, + {170,192,171}, + {200,190,189}, + {194,193,195}, + {183,181,180}, + {183,180,182}, + {155,154,168}, + {149,156,151}, + {149,151,148}, + {155,156,120}, + {145,142,143}, + {145,143,146}, + {136,137,140}, + {133,132,130}, + {128,129,116}, + {100,120,121}, + {110,112,113}, + {110,113,114}, + { 66, 65, 63}, + { 66, 63, 99}, + { 66, 99, 98}, + { 96, 46, 61}, + { 89, 88, 90}, + { 86, 87, 57}, + { 80, 78, 81}, + { 72, 69, 49}, + { 67, 48, 47}, + { 67, 47, 68}, + { 56, 55, 53}, + { 50, 49, 36}, + { 50, 36, 35}, + { 40, 39, 41}, + {242,243,229}, + {242,229,227}, + { 6, 37, 39}, + { 42, 47, 48}, + { 42, 48, 43}, + { 61, 46, 44}, + { 45, 70, 69}, + { 69, 70, 71}, + { 69, 71, 49}, + { 74, 78, 77}, + { 83, 84, 85}, + { 73, 74, 77}, + { 93, 96, 92}, + { 68, 46, 93}, + { 95, 99, 63}, + { 95, 63, 59}, + {115,108,110}, + {115,110,114}, + {125,126,127}, + {129,130,132}, + {137,133,138}, + {137,138,139}, + {148,146,143}, + {148,143,147}, + {119,118,154}, + {161,147,143}, + {165,164,151}, + {158,157,171}, + {158,171,172}, + {159,158,187}, + {159,187,186}, + {194,192,191}, + {194,191,193}, + {189,202,201}, + {182,197,184}, + {205, 8, 7}, + { 48,109,107}, + {218,219, 57}, + {218, 57, 56}, + {207,231,211}, + {232,230,231}, + {232,231,233}, + { 53, 52, 31}, + {388,411,386}, + {409,430,250}, + {262,429,254}, + {262,254,256}, + {442,444,428}, + {273,264,383}, + {273,383,384}, + {429,271,251}, + {429,251,254}, + {413,365,362}, + { 67,413,360}, + {282,283,295}, + {285,301,299}, + {202,281,280}, + {284,283,291}, + {284,291,289}, + {320,189,160}, + {308,306,307}, + {307,309,308}, + {319,317,330}, + {319,330,328}, + {353,352,324}, + {332,331,333}, + {340,341,338}, + {354,341,344}, + {349,358,357}, + {349,357,347}, + {364,355,356}, + {364,356,363}, + {364,365,366}, + {364,366,369}, + {374,376,402}, + {375, 92,373}, + { 77,389,390}, + {382,380,381}, + {389, 77,386}, + {393,394,412}, + {393,412,392}, + {401,394,416}, + {415,400,403}, + {411,410,427}, + {411,427,426}, + {422,420,424}, + {247,248,263}, + {247,263,261}, + {445,443, 14}, + {445, 14, 11}, + {449,450, 4}, + {449, 4, 5}, + {443,441, 17}, + {443, 17, 14}, + {436, 23, 17}, + {436, 17,441}, + {424,448,422}, + {448,423,422}, + {414,419,418}, + {414,418,413}, + {406,404,405}, + {399,397,395}, + {399,395,396}, + {420,416,392}, + {388,410,411}, + {386,384,383}, + {390, 88, 77}, + {375, 94, 92}, + {415,414, 68}, + {415, 68, 94}, + {370,374,402}, + {370,402,398}, + {361,357,358}, + {361,358,359}, + {125,348,126}, + {346,344,343}, + {340,338,339}, + {337,335,334}, + {337,334,336}, + {325,353,324}, + {324,331,332}, + {324,332,329}, + {323,322,309}, + {323,309,310}, + {294,295,297}, + {294,297,296}, + {289,286,285}, + {202,280,203}, + {288,307,303}, + {282,295,321}, + { 67,360,111}, + {418,423,367}, + {418,367,366}, + {272,252,251}, + {272,251,271}, + {272,271,270}, + {255,253,274}, + {265,266,380}, + {265,380,382}, + {442,428,261}, + {440,263,258}, + {440,258,260}, + {409,250,410}, + {255,226,245}, + {255,245,246}, + { 31,240,243}, + {236,234,235}, + {236,235,237}, + {233,225,245}, + {233,245,244}, + {220,221, 85}, + {220, 85, 86}, + { 81,213,226}, + { 81,226, 80}, + { 7,206,205}, + {186,184,198}, + {186,198,199}, + {204,203,205}, + {204,205,206}, + {195,193,196}, + {171,174,172}, + {173,174,175}, + {173,172,174}, + {155,167,166}, + {160,161,143}, + {160,143,144}, + {119,154,155}, + {148,151,150}, + {148,150,146}, + {140,137,139}, + {140,139,141}, + {127,126,130}, + {114,124,128}, + {114,128,115}, + {117,105,106}, + {117,106,116}, + {104,105,100}, + {104,100,103}, + { 59, 60, 91}, + { 97, 96, 61}, + { 97, 61, 64}, + { 91, 72, 89}, + { 87, 84, 79}, + { 87, 79, 76}, + { 78, 80, 77}, + { 49, 50, 74}, + { 60, 44, 45}, + { 61, 44, 58}, + { 51, 50, 35}, + { 51, 35, 34}, + { 39, 37, 41}, + { 33, 34, 9}, + { 33, 9, 12}, + { 0, 36, 37}, + { 0, 37, 6}, + { 40, 46, 47}, + { 40, 47, 42}, + { 53, 54, 56}, + { 65, 62, 63}, + { 72, 49, 73}, + { 79, 78, 75}, + { 79, 75, 76}, + { 52, 53, 76}, + { 92, 89, 90}, + { 96, 93, 46}, + {102,103,100}, + {102,100,101}, + {116,106,108}, + {116,108,115}, + {123,125,124}, + {116,115,128}, + {118,131,135}, + {140,135,136}, + {148,147,149}, + {120,119,155}, + {164,162,152}, + {164,152,150}, + {157,147,161}, + {157,161,170}, + {186,187,185}, + {186,185,184}, + {193,197,196}, + {202,203,204}, + {194,195,178}, + {198,184,197}, + { 67,111,109}, + { 38, 43,103}, + { 38,103,102}, + {214,223,222}, + {214,222,221}, + {214,221,220}, + {214,220,219}, + {214,219,218}, + {213,237,235}, + {221,222, 83}, + {221, 83, 85}, + { 15,229, 33}, + {227, 18,230}, + {227,230,232}, + { 52, 51,240}, + { 75, 78, 50}, + {408,430,409}, + {260,258,257}, + {260,257,259}, + {224,207,259}, + {268,269,405}, + {268,405,404}, + {413,362,360}, + {447, 8,205}, + {299,297,285}, + {189,281,202}, + {290,288,289}, + {290,289,291}, + {322,321,295}, + {322,295,294}, + {333,323,311}, + {333,311,320}, + {317,316,329}, + {320,160,144}, + {353,325,326}, + {329,332,334}, + {329,334,330}, + {339,338,141}, + {339,141,139}, + {348,345,126}, + {347,356,346}, + {123,349,125}, + {364,353,354}, + {364,354,355}, + {365,364,363}, + {376,391,394}, + {376,394,401}, + { 92,376,374}, + { 92,374,373}, + {377, 90, 88}, + {380,379,378}, + {380,378,381}, + {388,387,409}, + {388,409,410}, + {416,393,392}, + {399,398,402}, + {399,402,403}, + {250,428,427}, + {421,417,416}, + {421,416,420}, + {426,427,446}, + {426,446,451}, + {444,442,441}, + {452,451,450}, + {452,450,449} +}; + + +//***************************THE END OF FAMOUS BUNNY TRIMESH********************************************// + +//****GLOBALS + +//****GLOBALS + +///User can override this material combiner by implementing gContactAddedCallback and setting body0->m_collisionFlags |= btCollisionObject::customMaterialCallback; +inline btScalar calculateCombinedFriction(float friction0,float friction1) +{ + btScalar friction = friction0 * friction1; + + const btScalar MAX_FRICTION = 10.f; + if (friction < -MAX_FRICTION) + friction = -MAX_FRICTION; + if (friction > MAX_FRICTION) + friction = MAX_FRICTION; + return friction; + +} + +inline btScalar calculateCombinedRestitution(float restitution0,float restitution1) +{ + return restitution0 * restitution1; +} + + + +bool CustomMaterialCombinerCallback(btManifoldPoint& cp, const btCollisionObject* colObj0,int partId0,int index0,const btCollisionObject* colObj1,int partId1,int index1) +{ + + float friction0 = colObj0->getFriction(); + float friction1 = colObj1->getFriction(); + float restitution0 = colObj0->getRestitution(); + float restitution1 = colObj1->getRestitution(); + + if (colObj0->getCollisionFlags() & btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK) + { + friction0 = 1.0;//partId0,index0 + restitution0 = 0.f; + } + if (colObj1->getCollisionFlags() & btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK) + { + if (index1&1) + { + friction1 = 1.0f;//partId1,index1 + } else + { + friction1 = 0.f; + } + restitution1 = 0.f; + } + + cp.m_combinedFriction = calculateCombinedFriction(friction0,friction1); + cp.m_combinedRestitution = calculateCombinedRestitution(restitution0,restitution1); + + //this return value is currently ignored, but to be on the safe side: return false if you don't calculate friction + return true; +} + +extern ContactAddedCallback gContactAddedCallback; + + + +int main(int argc,char** argv) +{ + gContactAddedCallback = CustomMaterialCombinerCallback; + + ConcaveDemo* concaveDemo = new ConcaveDemo(); + concaveDemo->initPhysics(); + concaveDemo->setCameraDistance(30.f); +//cannot run stepFront yet, the OpenGL context is not opened (stepFront updates camera...) +// concaveDemo->stepFront(); +// concaveDemo->stepFront(); +// concaveDemo->stepFront(); +// concaveDemo->stepFront(); + + return glutmain(argc, argv,640,480,"Moving Concave Mesh Demo",concaveDemo); +} + +void ConcaveDemo::renderme() +{ + updateCamera(); + + btScalar m[16]; + + if (m_dynamicsWorld) + { + btVector3 worldBoundsMin,worldBoundsMax; + getDynamicsWorld()->getBroadphase()->getBroadphaseAabb(worldBoundsMin,worldBoundsMax); + + + int numObjects = m_dynamicsWorld->getNumCollisionObjects(); + btVector3 wireColor(1,0,0); + for (int i=0;igetCollisionObjectArray()[i]; + btRigidBody* body = btRigidBody::upcast(colObj); + + if (body && body->getMotionState()) + { + btDefaultMotionState* myMotionState = (btDefaultMotionState*)body->getMotionState(); + myMotionState->m_graphicsWorldTrans.getOpenGLMatrix(m); + } else + { + colObj->getWorldTransform().getOpenGLMatrix(m); + } + + btVector3 wireColor(1.f,1.0f,0.5f); //wants deactivation + if (i & 1) + { + wireColor = btVector3(0.f,0.0f,1.f); + } + ///color differently for active, sleeping, wantsdeactivation states + if (colObj->getActivationState() == 1) //active + { + if (i & 1) + { + wireColor += btVector3 (1.f,0.f,0.f); + } else + { + wireColor += btVector3 (.5f,0.f,0.f); + } + } + if (colObj->getActivationState() == 2) //ISLAND_SLEEPING + { + if (i & 1) + { + wireColor += btVector3 (0.f,1.f, 0.f); + } else + { + wireColor += btVector3 (0.f,0.5f,0.f); + } + } + + m_shapeDrawer->drawOpenGL(m,colObj->getCollisionShape(),wireColor,getDebugMode(),worldBoundsMin,worldBoundsMax); + } + + + float xOffset = 10.f; + float yStart = 20.f; + float yIncr = 20.f; + char buf[124]; + + glColor3f(0, 0, 0); + + setOrthographicProjection(); + + glRasterPos3f(xOffset,yStart,0); + sprintf(buf,"mouse to interact"); + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); + yStart += yIncr; + + /* glRasterPos3f(xOffset,yStart,0); + sprintf(buf,"space to reset"); + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); + yStart += yIncr; + */ + glRasterPos3f(xOffset,yStart,0); + sprintf(buf,"cursor keys and z,x to navigate"); + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); + yStart += yIncr; + + glRasterPos3f(xOffset,yStart,0); + sprintf(buf,"i to toggle simulation, s single step"); + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); + yStart += yIncr; + + glRasterPos3f(xOffset,yStart,0); + sprintf(buf,"q to quit"); + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); + yStart += yIncr; + + glRasterPos3f(xOffset,yStart,0); + sprintf(buf,". to shoot TRIMESH (dot)"); + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); + yStart += yIncr; + + // not yet hooked up again after refactoring... + +/* glRasterPos3f(xOffset,yStart,0); + sprintf(buf,"d to toggle deactivation"); + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); + yStart += yIncr; +*/ + + /* + glRasterPos3f(xOffset,yStart,0); + sprintf(buf,"a to draw temporal AABBs"); + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); + yStart += yIncr; + */ + + glRasterPos3f(xOffset,yStart,0); + sprintf(buf,"h to toggle help text"); + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); + yStart += yIncr; + + //bool useBulletLCP = !(getDebugMode() & btIDebugDraw::DBG_DisableBulletLCP); + + bool useCCD = ((getDebugMode() & btIDebugDraw::DBG_EnableCCD) != 0); + + glRasterPos3f(xOffset,yStart,0); + sprintf(buf,"1 CCD mode (adhoc) = %i",useCCD); + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); + yStart += yIncr; + + glRasterPos3f(xOffset,yStart,0); + sprintf(buf,"+- shooting speed = %10.2f",m_ShootBoxInitialSpeed); + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); + yStart += yIncr; + + resetPerspectiveProjection(); + + + } + +} + + + +void ConcaveDemo::initGImpactCollision() +{ + // create trimesh + btTriangleIndexVertexArray* indexVertexArrays = new btTriangleIndexVertexArray(NUM_TRIANGLES, + &gIndices[0][0], + 3*sizeof(int), + NUM_VERTICES,(REAL*) &gVertices[0],sizeof(REAL)*3); + + btGImpactMeshShape * trimesh = new btGImpactMeshShape(indexVertexArrays); + trimesh->setLocalScaling(btVector3(4.f,4.f,4.f)); + trimesh->updateBound(); + m_trimeshShape = trimesh; + + //register algorithm + + btCollisionDispatcher * dispatcher = static_cast(m_dynamicsWorld ->getDispatcher()); + btGImpactCollisionAlgorithm::registerAlgorithm(dispatcher); + +} + +void ConcaveDemo::initPhysics() +{ + + btDefaultCollisionConfiguration* collisionConfiguration = new btDefaultCollisionConfiguration(); + + //btConstraintSolver* solver = new btSequentialImpulseConstraintSolver; + btCollisionDispatcher* dispatcher = new btCollisionDispatcher(collisionConfiguration); + //btOverlappingPairCache* broadphase = new btSimpleBroadphase(); + btBroadphaseInterface* broadphase = new btSimpleBroadphase(); + + btConstraintSolver* constraintSolver = new btSequentialImpulseConstraintSolver(); + m_dynamicsWorld = new btDiscreteDynamicsWorld(dispatcher,broadphase,constraintSolver,collisionConfiguration); + + + //create trimesh model and shape + initGImpactCollision(); + + + + float mass = 0.f; + btTransform startTransform; + startTransform.setIdentity(); + + btCollisionShape* staticboxShape1 = new btBoxShape(btVector3(200,1,200));//floor + btCollisionShape* staticboxShape2 = new btBoxShape(btVector3(1,50,200));//left wall + btCollisionShape* staticboxShape3 = new btBoxShape(btVector3(1,50,200));//right wall + btCollisionShape* staticboxShape4 = new btBoxShape(btVector3(200,50,1));//front wall + btCollisionShape* staticboxShape5 = new btBoxShape(btVector3(200,50,1));//back wall + + btCompoundShape* staticScenario = new btCompoundShape();//static scenario + + startTransform.setOrigin(btVector3(0,0,0)); + staticScenario->addChildShape(startTransform,staticboxShape1); + startTransform.setOrigin(btVector3(-200,25,0)); + staticScenario->addChildShape(startTransform,staticboxShape2); + startTransform.setOrigin(btVector3(200,25,0)); + staticScenario->addChildShape(startTransform,staticboxShape3); + startTransform.setOrigin(btVector3(0,25,200)); + staticScenario->addChildShape(startTransform,staticboxShape4); + startTransform.setOrigin(btVector3(0,25,-200)); + staticScenario->addChildShape(startTransform,staticboxShape5); + + startTransform.setOrigin(btVector3(0,0,0)); + + btRigidBody* staticBody = localCreateRigidBody(mass, startTransform,staticScenario); + + staticBody->setCollisionFlags(staticBody->getCollisionFlags()|btCollisionObject::CF_STATIC_OBJECT); + + //enable custom material callback + staticBody->setCollisionFlags(staticBody->getCollisionFlags()|btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK); + + + //static plane + btVector3 normal(0.4,1.5,-0.4); + normal.normalize(); + btCollisionShape* staticplaneShape6 = new btStaticPlaneShape(normal,0.0);// A plane + + startTransform.setOrigin(btVector3(0,0,0)); + + btRigidBody* staticBody2 = localCreateRigidBody(mass, startTransform,staticplaneShape6 ); + + staticBody2->setCollisionFlags(staticBody2->getCollisionFlags()|btCollisionObject::CF_STATIC_OBJECT); + + { + for (int i=0;i<9;i++) + { + btCollisionShape* boxShape = new btBoxShape(btVector3(1,1,1)); + startTransform.setOrigin(btVector3(2*i-5,2,-3)); + localCreateRigidBody(1, startTransform,boxShape); + } + } + + shootTrimesh(btVector3(0,10,0),btVector3(0,0,0)); + + shootTrimesh(btVector3(0,20,0),btVector3(0,10,0)); + + //m_debugMode |= btIDebugDraw::DBG_DrawWireframe; + +} + +void ConcaveDemo::keyboardCallback(unsigned char key, int x, int y) +{ + m_lastKey = 0; + + switch (key) + { + case 'q' : exit(0); break; + + case 'l' : stepLeft(); break; + case 'r' : stepRight(); break; + case 'f' : stepFront(); break; + case 'b' : stepBack(); break; + case 'z' : zoomIn(); break; + case 'x' : zoomOut(); break; + case 'i' : toggleIdle(); break; + case 'h': + if (m_debugMode & btIDebugDraw::DBG_NoHelpText) + m_debugMode = m_debugMode & (~btIDebugDraw::DBG_NoHelpText); + else + m_debugMode |= btIDebugDraw::DBG_NoHelpText; + break; + + case 'w': + if (m_debugMode & btIDebugDraw::DBG_DrawWireframe) + m_debugMode = m_debugMode & (~btIDebugDraw::DBG_DrawWireframe); + else + m_debugMode |= btIDebugDraw::DBG_DrawWireframe; + break; + + case 'p': + if (m_debugMode & btIDebugDraw::DBG_ProfileTimings) + m_debugMode = m_debugMode & (~btIDebugDraw::DBG_ProfileTimings); + else + m_debugMode |= btIDebugDraw::DBG_ProfileTimings; + break; + + case 'm': + if (m_debugMode & btIDebugDraw::DBG_EnableSatComparison) + m_debugMode = m_debugMode & (~btIDebugDraw::DBG_EnableSatComparison); + else + m_debugMode |= btIDebugDraw::DBG_EnableSatComparison; + break; + + case 'n': + if (m_debugMode & btIDebugDraw::DBG_DisableBulletLCP) + m_debugMode = m_debugMode & (~btIDebugDraw::DBG_DisableBulletLCP); + else + m_debugMode |= btIDebugDraw::DBG_DisableBulletLCP; + break; + + case 't' : + if (m_debugMode & btIDebugDraw::DBG_DrawText) + m_debugMode = m_debugMode & (~btIDebugDraw::DBG_DrawText); + else + m_debugMode |= btIDebugDraw::DBG_DrawText; + break; + case 'y': + if (m_debugMode & btIDebugDraw::DBG_DrawFeaturesText) + m_debugMode = m_debugMode & (~btIDebugDraw::DBG_DrawFeaturesText); + else + m_debugMode |= btIDebugDraw::DBG_DrawFeaturesText; + break; + case 'a': + if (m_debugMode & btIDebugDraw::DBG_DrawAabb) + m_debugMode = m_debugMode & (~btIDebugDraw::DBG_DrawAabb); + else + m_debugMode |= btIDebugDraw::DBG_DrawAabb; + break; + case 'c' : + if (m_debugMode & btIDebugDraw::DBG_DrawContactPoints) + m_debugMode = m_debugMode & (~btIDebugDraw::DBG_DrawContactPoints); + else + m_debugMode |= btIDebugDraw::DBG_DrawContactPoints; + break; + + case 'd' : + if (m_debugMode & btIDebugDraw::DBG_NoDeactivation) + m_debugMode = m_debugMode & (~btIDebugDraw::DBG_NoDeactivation); + else + m_debugMode |= btIDebugDraw::DBG_NoDeactivation; + if (m_debugMode | btIDebugDraw::DBG_NoDeactivation) + { + gDisableDeactivation = true; + } else + { + gDisableDeactivation = false; + } + break; + + + + + case 'o' : + { + m_stepping = !m_stepping; + break; + } + case 's' : clientMoveAndDisplay(); break; +// case ' ' : newRandom(); break; + case ' ': + clientResetScene(); + break; + case '1': + { + if (m_debugMode & btIDebugDraw::DBG_EnableCCD) + m_debugMode = m_debugMode & (~btIDebugDraw::DBG_EnableCCD); + else + m_debugMode |= btIDebugDraw::DBG_EnableCCD; + break; + } + + case '.': + { + shootTrimesh(getCameraPosition(),getCameraTargetPosition()); + break; + } + + case '+': + { + m_ShootBoxInitialSpeed += 10.f; + break; + } + case '-': + { + m_ShootBoxInitialSpeed -= 10.f; + break; + } + + default: +// std::cout << "unused key : " << key << std::endl; + break; + } + + if (getDynamicsWorld() && getDynamicsWorld()->getDebugDrawer()) + getDynamicsWorld()->getDebugDrawer()->setDebugMode(m_debugMode); + + glutPostRedisplay(); + +} + + +void ConcaveDemo::shootTrimesh(const btVector3& startPosition,const btVector3& destination) +{ + + if (m_dynamicsWorld) + { + float mass = 4.f; + btTransform startTransform; + startTransform.setIdentity(); + startTransform.setOrigin(startPosition); + + btRigidBody* body = this->localCreateRigidBody(mass, startTransform,m_trimeshShape); + + btVector3 linVel(destination[0]-startPosition[0],destination[1]-startPosition[1],destination[2]-startPosition[2]); + linVel.normalize(); + linVel*=m_ShootBoxInitialSpeed*0.25; + + body->getWorldTransform().setOrigin(startPosition); + body->getWorldTransform().setRotation(btQuaternion(0,0,0,1)); + body->setLinearVelocity(linVel); + body->setAngularVelocity(btVector3(0,0,0)); + } +} + +void ConcaveDemo::clientMoveAndDisplay() +{ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + float dt = float(getDeltaTimeMicroseconds()) * 0.000001f; + + m_dynamicsWorld->stepSimulation(dt); + + //optional but useful: debug drawing + m_dynamicsWorld->debugDrawWorld(); + + renderme(); + + glFlush(); + glutSwapBuffers(); + +} + + + + +void ConcaveDemo::displayCallback(void) { + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + renderme(); + + //optional but useful: debug drawing + if (m_dynamicsWorld) + m_dynamicsWorld->debugDrawWorld(); + + glFlush(); + glutSwapBuffers(); +} + + diff --git a/BulletPhysics/bulletTrunk/Demos/MovingConcaveDemo/Jamfile b/BulletPhysics/bulletTrunk/Demos/MovingConcaveDemo/Jamfile new file mode 100644 index 00000000..05d0e58a --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/MovingConcaveDemo/Jamfile @@ -0,0 +1,19 @@ +SubDir TOP Demos MovingConcaveDemo ; + + #some demos need extra functionality, Collada / ConvexDecomposition etc. + + rule ExtraDemo1 + + { + Application $(<) : $(>) : noinstall console nomanifest ; + LinkWith $(<) : bulletopenglsupport bulletdynamics bulletcollision bulletmath ; + CFlags $(<) : + [ FIncludes $(TOP)/Demos/OpenGL ] + + ; + + MsvcIncDirs $(<) : + "../../Demos/OpenGL" ; + } + +ExtraDemo1 MovingConcaveDemo : [ Wildcard *.h *.cpp ] ; diff --git a/BulletPhysics/bulletTrunk/Demos/MultiMaterialDemo/Jamfile b/BulletPhysics/bulletTrunk/Demos/MultiMaterialDemo/Jamfile new file mode 100644 index 00000000..b6337835 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/MultiMaterialDemo/Jamfile @@ -0,0 +1,3 @@ +SubDir TOP Demos MultiMaterialDemo ; + +BulletDemo MultiMaterialDemo : [ Wildcard *.h *.cpp ] ; diff --git a/BulletPhysics/bulletTrunk/Demos/MultiMaterialDemo/MultiMaterialDemo.cpp b/BulletPhysics/bulletTrunk/Demos/MultiMaterialDemo/MultiMaterialDemo.cpp new file mode 100644 index 00000000..e82acb07 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/MultiMaterialDemo/MultiMaterialDemo.cpp @@ -0,0 +1,382 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#include "btBulletDynamicsCommon.h" +#include "LinearMath/btIDebugDraw.h" +#include "GLDebugDrawer.h" +#include "MultiMaterialDemo.h" +#include "GL_ShapeDrawer.h" +#include "GlutStuff.h" + +#include "BulletCollision/CollisionShapes/btTriangleShape.h" +#include "BulletCollision/CollisionShapes/btTriangleIndexVertexMaterialArray.h" +#include "BulletCollision/CollisionShapes/btMultimaterialTriangleMeshShape.h" +#include "BulletCollision/CollisionShapes/btMaterial.h" + +// Create a custom material, just because we can +class CustomMaterial : public btMaterial +{ +public: + int foo1; + int foo2; + CustomMaterial(){} + CustomMaterial(int a, int b) {foo1 = a; foo2 = b;} +}; + +// Storage for the vertex data +static btVector3* gVertices = 0; +// Storage for the face data +static int* gIndices = 0; +// Storage for the material data +static CustomMaterial* gMaterials = 0; +// Storage for the face -> material index data +static int* gFaceMaterialIndices = 0; + +static btBvhTriangleMeshShape* trimeshShape =0; +static btRigidBody* staticBody = 0; +static float waveheight = 0.f; + +const float TRIANGLE_SIZE=1.f; + + +///User can override this material combiner by implementing gContactAddedCallback and setting body0->m_collisionFlags |= btCollisionObject::customMaterialCallback; +inline btScalar calculateCombinedFriction(float friction0,float friction1) +{ + btScalar friction = friction0 * friction1; + + const btScalar MAX_FRICTION = 10.f; + if (friction < -MAX_FRICTION) + friction = -MAX_FRICTION; + if (friction > MAX_FRICTION) + friction = MAX_FRICTION; + return friction; + +} + +inline btScalar calculateCombinedRestitution(float restitution0,float restitution1) +{ + return restitution0 * restitution1; +} + + + +static bool CustomMaterialCombinerCallback(btManifoldPoint& cp, const btCollisionObject* colObj0,int partId0,int index0,const btCollisionObject* colObj1,int partId1,int index1) +{ + + // Apply material properties + if (colObj0->getCollisionShape()->getShapeType() == TRIANGLE_SHAPE_PROXYTYPE) + { + const btCollisionShape* parent0 = colObj0->getRootCollisionShape(); + if(parent0 != 0 && parent0->getShapeType() == MULTIMATERIAL_TRIANGLE_MESH_PROXYTYPE) + { + btMultimaterialTriangleMeshShape* shape = (btMultimaterialTriangleMeshShape*)parent0; + const btMaterial * props = shape->getMaterialProperties(partId0, index0); + cp.m_combinedFriction = calculateCombinedFriction(props->m_friction, colObj1->getFriction()); + cp.m_combinedRestitution = props->m_restitution * colObj1->getRestitution(); + } + } + else if (colObj1->getCollisionShape()->getShapeType() == TRIANGLE_SHAPE_PROXYTYPE) + { + const btCollisionShape* parent1 = colObj1->getRootCollisionShape(); + if(parent1 != 0 && parent1->getShapeType() == MULTIMATERIAL_TRIANGLE_MESH_PROXYTYPE) + { + btMultimaterialTriangleMeshShape* shape = (btMultimaterialTriangleMeshShape*)parent1; + const btMaterial * props = shape->getMaterialProperties(partId1, index1); + cp.m_combinedFriction = calculateCombinedFriction(props->m_friction, colObj0->getFriction()); + cp.m_combinedRestitution = props->m_restitution * colObj0->getRestitution(); + } + } + + //this return value is currently ignored, but to be on the safe side: return false if you don't calculate friction + return true; +} + +extern ContactAddedCallback gContactAddedCallback; + +const int NUM_VERTS_X = 20; +const int NUM_VERTS_Y = 50; +const int totalVerts = NUM_VERTS_X*NUM_VERTS_Y; + +void MultiMaterialDemo::setVertexPositions(float waveheight, float offset) +{ + int i; + int j; + + for ( i=0;isetCollisionFlags( staticBody->getCollisionFlags() | btCollisionObject::CF_KINEMATIC_OBJECT); + staticBody->setActivationState(DISABLE_DEACTIVATION); + } else + { + staticBody->setCollisionFlags( staticBody->getCollisionFlags() & ~btCollisionObject::CF_KINEMATIC_OBJECT); + staticBody->forceActivationState(ACTIVE_TAG); + } + } + + DemoApplication::keyboardCallback(key,x,y); + +} + +void MultiMaterialDemo::initPhysics() +{ +#define TRISIZE 50.f + + gContactAddedCallback = CustomMaterialCombinerCallback; + + // The number of triangles + const int totalTriangles = 2*(NUM_VERTS_X-1)*(NUM_VERTS_Y-1); + // The number of materials + const int totalMaterials = 2; + + int vertStride = sizeof(btVector3); + int indexStride = 3*sizeof(int); + int materialStride = sizeof(CustomMaterial); + int triangleMaterialStride = sizeof(int); + + gVertices = new btVector3[totalVerts]; + gIndices = new int[totalTriangles*3]; + gMaterials = new CustomMaterial[totalMaterials]; + gFaceMaterialIndices = new int[totalTriangles]; + + // Explicitly set up the materials. It's a small array so let's do it bit by bit. + gMaterials[0].m_friction = 0; + gMaterials[0].m_restitution = 0.9; + gMaterials[0].foo1 = 5; + gMaterials[0].foo2 = 7; + gMaterials[1].m_friction = 0.9; + gMaterials[1].m_restitution = 0.1; + gMaterials[1].foo1 = 53; + gMaterials[1].foo2 = 15; + + int i; + // Set up the vertex data + setVertexPositions(waveheight,0.f); + int index=0; + // Set up the face data + for ( i=0;imaterial index data + for(int a = 0; a < totalTriangles; a++) + { + // This will give the first half of the faces low friction and high restitution + // and the second half of the faces high friction and low restitution + if(a > totalTriangles*0.5f) + gFaceMaterialIndices[a] = 0; + else + gFaceMaterialIndices[a] = 1; + } + + // Create the array structure + m_indexVertexArrays = new btTriangleIndexVertexMaterialArray( + totalTriangles, gIndices, indexStride, + totalVerts,(btScalar*) &gVertices[0].x(),vertStride, + totalMaterials, (unsigned char *)gMaterials, sizeof(CustomMaterial), + gFaceMaterialIndices, sizeof(int)); + + bool useQuantizedAabbCompression = true; + // Create the multimaterial mesh shape + trimeshShape = new btMultimaterialTriangleMeshShape((btTriangleIndexVertexMaterialArray*)m_indexVertexArrays,useQuantizedAabbCompression); + m_collisionShapes.push_back(trimeshShape); + + btCollisionShape* groundShape = trimeshShape; + + m_collisionConfiguration = new btDefaultCollisionConfiguration(); + + m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); + + btVector3 worldMin(-1000,-1000,-1000); + btVector3 worldMax(1000,1000,1000); + m_broadphase = new btAxisSweep3(worldMin,worldMax); + m_solver = new btSequentialImpulseConstraintSolver(); + m_dynamicsWorld = new btDiscreteDynamicsWorld(m_dispatcher,m_broadphase,m_solver,m_collisionConfiguration); + + float mass = 0.f; + btTransform startTransform; + startTransform.setIdentity(); + startTransform.setOrigin(btVector3(0,-2,0)); + + btCollisionShape* colShape = new btBoxShape(btVector3(0.5f,0.5f,0.5f)); + m_collisionShapes.push_back(colShape); + + { + for (int i=0;i<1;i++) + { + startTransform.setOrigin(btVector3(10,10,-20)); + btRigidBody* body = localCreateRigidBody(1, startTransform,colShape); + body->setCollisionFlags(body->getCollisionFlags() | btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK); + body->setFriction(0.9f); + body->setGravity(btVector3(0,-20.f,0)); + body->applyCentralImpulse(btVector3(-7.7f,0,0)); + } + } + + startTransform.setIdentity(); + staticBody = localCreateRigidBody(mass, startTransform,groundShape); + + staticBody->setCollisionFlags(staticBody->getCollisionFlags() | btCollisionObject::CF_STATIC_OBJECT); + + //enable custom material callback + staticBody->setCollisionFlags(staticBody->getCollisionFlags() | btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK); +} + +void MultiMaterialDemo::clientMoveAndDisplay() +{ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + float dt = getDeltaTimeMicroseconds() * 0.000001f; + + if (m_animatedMesh) + { + static float offset=0.f; + offset+=0.01f; + + // setVertexPositions(waveheight,offset); + + int i; + int j; + btVector3 aabbMin(1e30,1e30,1e30); + btVector3 aabbMax(-1e30,-1e30,-1e30); + + for ( i=NUM_VERTS_X/2-3;ipartialRefitTree(aabbMin,aabbMax); + + //clear all contact points involving mesh proxy. Note: this is a slow/unoptimized operation. + m_dynamicsWorld->getBroadphase()->getOverlappingPairCache()->cleanProxyFromPairs(staticBody->getBroadphaseHandle(),getDynamicsWorld()->getDispatcher()); + } + + m_dynamicsWorld->stepSimulation(dt); + + //optional but useful: debug drawing + m_dynamicsWorld->debugDrawWorld(); + + renderme(); + + glFlush(); + glutSwapBuffers(); + +} + + + + +void MultiMaterialDemo::displayCallback(void) { + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + renderme(); + + glFlush(); + glutSwapBuffers(); +} + + + +void MultiMaterialDemo::exitPhysics() +{ + + + + //cleanup in the reverse order of creation/initialization + + //remove the rigidbodies from the dynamics world and delete them + int i; + for (i=m_dynamicsWorld->getNumCollisionObjects()-1; i>=0 ;i--) + { + btCollisionObject* obj = m_dynamicsWorld->getCollisionObjectArray()[i]; + btRigidBody* body = btRigidBody::upcast(obj); + if (body && body->getMotionState()) + { + delete body->getMotionState(); + } + m_dynamicsWorld->removeCollisionObject( obj ); + delete obj; + } + + //delete collision shapes + for (int j=0;j m_collisionShapes; + + btTriangleIndexVertexArray* m_indexVertexArrays; + + btBroadphaseInterface* m_broadphase; + + btCollisionDispatcher* m_dispatcher; + + btConstraintSolver* m_solver; + + btDefaultCollisionConfiguration* m_collisionConfiguration; + + bool m_animatedMesh; + + public: + + MultiMaterialDemo() : m_animatedMesh(true) + { + + } + void initPhysics(); + + void exitPhysics(); + + virtual ~MultiMaterialDemo() + { + exitPhysics(); + } + + virtual void clientMoveAndDisplay(); + + virtual void displayCallback(); + + //to show refit works + void setVertexPositions(float waveheight, float offset); + + virtual void keyboardCallback(unsigned char key, int x, int y); + + static DemoApplication* Create() + { + MultiMaterialDemo* demo = new MultiMaterialDemo(); + demo->myinit(); + demo->initPhysics(); + return demo; + }; +}; + +#endif //CONCAVE_DEMO_H + diff --git a/BulletPhysics/bulletTrunk/Demos/MultiMaterialDemo/main.cpp b/BulletPhysics/bulletTrunk/Demos/MultiMaterialDemo/main.cpp new file mode 100644 index 00000000..9b8d35bd --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/MultiMaterialDemo/main.cpp @@ -0,0 +1,22 @@ + +#include "MultiMaterialDemo.h" +#include "GlutStuff.h" + +#include "GlutStuff.h" +#include "GLDebugDrawer.h" +#include "btBulletDynamicsCommon.h" + +GLDebugDrawer gDebugDrawer; + +int main(int argc,char** argv) +{ + + MultiMaterialDemo* multiMaterialDemo = new MultiMaterialDemo(); + multiMaterialDemo->initPhysics(); + multiMaterialDemo->setCameraDistance(30.f); + + multiMaterialDemo->getDynamicsWorld()->setDebugDrawer(&gDebugDrawer); + + return glutmain(argc, argv,640,480,"Multimaterial Mesh Demo",multiMaterialDemo); +} + diff --git a/BulletPhysics/bulletTrunk/Demos/MultiThreadedDemo/CMakeLists.txt b/BulletPhysics/bulletTrunk/Demos/MultiThreadedDemo/CMakeLists.txt new file mode 100644 index 00000000..3bd05c03 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/MultiThreadedDemo/CMakeLists.txt @@ -0,0 +1,29 @@ +# This is basically the overall name of the project in Visual Studio this is the name of the Solution File + + +# For every executable you have with a main method you should have an add_executable line below. +# For every add executable line you should list every .cpp and .h file you have associated with that executable. + + + +# You shouldn't have to modify anything below this line +######################################################## + + +INCLUDE_DIRECTORIES( +${BULLET_PHYSICS_SOURCE_DIR}/src ${BULLET_PHYSICS_SOURCE_DIR}/Demos/OpenGL } +) + +LINK_LIBRARIES( +OpenGLSupport BulletMultiThreaded BulletDynamics BulletCollision LinearMath ${GLUT_glut_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} +) + +ADD_EXECUTABLE(AppMultiThreadedDemo + main.cpp + MultiThreadedDemo.cpp + MultiThreadedDemo.h +) +IF (UNIX) + TARGET_LINK_LIBRARIES(AppMultiThreadedDemo pthread) +ENDIF(UNIX) + diff --git a/BulletPhysics/bulletTrunk/Demos/MultiThreadedDemo/Jamfile b/BulletPhysics/bulletTrunk/Demos/MultiThreadedDemo/Jamfile new file mode 100644 index 00000000..677292f5 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/MultiThreadedDemo/Jamfile @@ -0,0 +1,27 @@ +SubDir TOP Demos MultiThreadedDemo ; + +#some demos need extra functionality, Collada / ConvexDecomposition etc. + + rule ExtraDemo4 + + { + Application $(<) : $(>) : noinstall console nomanifest ; + LinkWith $(<) : bulletopenglsupport bulletmultithreaded bulletdynamics bulletcollision bulletmath ; + CFlags $(<) : + [ FIncludes $(TOP)/Demos/OpenGL ] + [ FIncludes $(TOP)/Extras/BulletMultiThreaded ] + + ; + + MsvcIncDirs $(<) : + "../../Demos/OpenGL" + "../../Extras/BulletColladaConverter" + "../../Extras/COLLADA_DOM/include" + "../../Extras/COLLADA_DOM/include/1.4" + "../../Extras/LibXML" + "../../Extras/LibXML/include" ; + } + +ExtraDemo4 MultiThreadedDemo : [ Wildcard *.h *.cpp ] ; + +MsvcIncDirs MultiThreadedDemo : "../../Extras/BulletMultiThreaded" ; diff --git a/BulletPhysics/bulletTrunk/Demos/MultiThreadedDemo/Makefile.am b/BulletPhysics/bulletTrunk/Demos/MultiThreadedDemo/Makefile.am new file mode 100644 index 00000000..71d8dd3c --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/MultiThreadedDemo/Makefile.am @@ -0,0 +1,5 @@ +noinst_PROGRAMS=MultiThreadedDemo + +MultiThreadedDemo_SOURCES=MultiThreadedDemo.cpp MultiThreadedDemo.h main.cpp +MultiThreadedDemo_CXXFLAGS=-I@top_builddir@/src -I@top_builddir@/Demos/OpenGL -I@top_builddir@/Extras $(CXXFLAGS) +MultiThreadedDemo_LDADD=-L../OpenGL -L../../Extras -L../../src -lbulletmultithreaded -lbulletopenglsupport -lbulletdynamics -lbulletcollision -lbulletmath @opengl_LIBS@ -lpthread diff --git a/BulletPhysics/bulletTrunk/Demos/MultiThreadedDemo/MultiThreadedDemo.cpp b/BulletPhysics/bulletTrunk/Demos/MultiThreadedDemo/MultiThreadedDemo.cpp new file mode 100644 index 00000000..d92eb4b5 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/MultiThreadedDemo/MultiThreadedDemo.cpp @@ -0,0 +1,480 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +//#define USE_PARALLEL_SOLVER 1 //experimental parallel solver +#define USE_PARALLEL_DISPATCHER 1 + +#include "btBulletDynamicsCommon.h" +#include "BulletCollision/CollisionDispatch/btSphereSphereCollisionAlgorithm.h" +#include "BulletCollision/CollisionDispatch/btSphereTriangleCollisionAlgorithm.h" + +#ifdef USE_PARALLEL_DISPATCHER +#include "BulletMultiThreaded/SpuGatheringCollisionDispatcher.h" +#include "BulletMultiThreaded/PlatformDefinitions.h" + +#ifdef USE_LIBSPE2 +#include "BulletMultiThreaded/SpuLibspe2Support.h" +#elif defined (WIN32) +#include "BulletMultiThreaded/Win32ThreadSupport.h" +#include "BulletMultiThreaded/SpuNarrowPhaseCollisionTask/SpuGatheringCollisionTask.h" + +#elif defined (USE_PTHREADS) + +#include "BulletMultiThreaded/PosixThreadSupport.h" +#include "BulletMultiThreaded/SpuNarrowPhaseCollisionTask/SpuGatheringCollisionTask.h" + +#else +//other platforms run the parallel code sequentially (until pthread support or other parallel implementation is added) +#include "BulletMultiThreaded/SequentialThreadSupport.h" +#include "BulletMultiThreaded/SpuNarrowPhaseCollisionTask/SpuGatheringCollisionTask.h" +#endif //USE_LIBSPE2 + +#ifdef USE_PARALLEL_SOLVER +#include "BulletMultiThreaded/SpuParallelSolver.h" +#include "BulletMultiThreaded/SpuSolverTask/SpuParallellSolverTask.h" +#endif //USE_PARALLEL_SOLVER + +#endif//USE_PARALLEL_DISPATCHER + + +#include "LinearMath/btQuickprof.h" +#include "LinearMath/btIDebugDraw.h" + + +#include "BMF_Api.h" +#include //printf debugging + +#include "MultiThreadedDemo.h" +#include "GL_ShapeDrawer.h" + +#include "GlutStuff.h" + + +extern float eye[3]; +extern int glutScreenWidth; +extern int glutScreenHeight; + +const int maxProxies = 32766; +const int maxOverlap = 65535; + + + + +#ifdef _DEBUG +const int gNumObjects = 120; +#else +const int gNumObjects = 120;//try this in release mode: 3000. never go above 16384, unless you increate maxNumObjects value in DemoApplication.cp +#endif + + +const int maxNumObjects = 32760; + +static int shapeIndex[maxNumObjects]; + + +#define CUBE_HALF_EXTENTS 0.5 + +#define EXTRA_HEIGHT -10.f +//GL_LineSegmentShape shapeE(btVector3(-50,0,0), +// btVector3(50,0,0)); + + +void MultiThreadedDemo::createStack( btCollisionShape* boxShape, float halfCubeSize, int size, float zPos ) +{ + btTransform trans; + trans.setIdentity(); + + for(int i=0; istepSimulation(1.0f/60.f,0); + //CProfileManager::dumpAll(); + +#else + //during idle mode, just run 1 simulation step maximum + int maxSimSubSteps = m_idle ? 1 : 1; + if (m_idle) + dt = 1.0/420.f; + + int numSimSteps = 0; + numSimSteps = m_dynamicsWorld->stepSimulation(dt,maxSimSubSteps); + + //optional but useful: debug drawing + m_dynamicsWorld->debugDrawWorld(); + +#ifdef VERBOSE_TIMESTEPPING_CONSOLEOUTPUT + if (!numSimSteps) + printf("Interpolated transforms\n"); + else + { + if (numSimSteps > maxSimSubSteps) + { + //detect dropping frames + printf("Dropped (%i) simulation steps out of %i\n",numSimSteps - maxSimSubSteps,numSimSteps); + } else + { + printf("Simulated (%i) steps\n",numSimSteps); + } + } +#endif //VERBOSE_TIMESTEPPING_CONSOLEOUTPUT + +#endif + } + +#ifdef USE_QUICKPROF + btProfiler::beginBlock("render"); +#endif //USE_QUICKPROF + + renderme(); + + + //render the graphics objects, with center of mass shift + + updateCamera(); + + + +#ifdef USE_QUICKPROF + btProfiler::endBlock("render"); +#endif + glFlush(); + + + glutSwapBuffers(); + +} + + + +void MultiThreadedDemo::displayCallback(void) { + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + //optional but useful: debug drawing + if (m_dynamicsWorld) + m_dynamicsWorld->debugDrawWorld(); + + + renderme(); + + glFlush(); + glutSwapBuffers(); +} + + + + + +void MultiThreadedDemo::initPhysics() +{ +#ifdef USE_PARALLEL_DISPATCHER + m_threadSupportSolver = 0; + m_threadSupportCollision = 0; +#endif + +//#define USE_GROUND_PLANE 1 +#ifdef USE_GROUND_PLANE + m_collisionShapes.push_back(new btStaticPlaneShape(btVector3(0,1,0),0.5)); +#else + + ///Please don't make the box sizes larger then 1000: the collision detection will be inaccurate. + ///See http://www.continuousphysics.com/Bullet/phpBB2/viewtopic.php?t=346 + m_collisionShapes.push_back(new btBoxShape (btVector3(200,CUBE_HALF_EXTENTS,200))); +#endif + + m_collisionShapes.push_back(new btBoxShape (btVector3(CUBE_HALF_EXTENTS,CUBE_HALF_EXTENTS,CUBE_HALF_EXTENTS))); + + + + setCameraDistance(32.5f); + + m_azi = 90.f; + + m_dispatcher=0; + m_collisionConfiguration = new btDefaultCollisionConfiguration(); + +#ifdef USE_PARALLEL_DISPATCHER + int maxNumOutstandingTasks = 4; + +#ifdef USE_WIN32_THREADING + +m_threadSupportCollision = new Win32ThreadSupport(Win32ThreadSupport::Win32ThreadConstructionInfo( + "collision", + processCollisionTask, + createCollisionLocalStoreMemory, + maxNumOutstandingTasks)); +#else + +#ifdef USE_LIBSPE2 + + spe_program_handle_t * program_handle; +#ifndef USE_CESOF + program_handle = spe_image_open ("./spuCollision.elf"); + if (program_handle == NULL) + { + perror( "SPU OPEN IMAGE ERROR\n"); + } + else + { + printf( "IMAGE OPENED\n"); + } +#else + extern spe_program_handle_t spu_program; + program_handle = &spu_program; +#endif + SpuLibspe2Support* threadSupportCollision = new SpuLibspe2Support( program_handle, maxNumOutstandingTasks); +#elif defined (USE_PTHREADS) + PosixThreadSupport::ThreadConstructionInfo constructionInfo("collision", + processCollisionTask, + createCollisionLocalStoreMemory, + maxNumOutstandingTasks); + m_threadSupportCollision = new PosixThreadSupport(constructionInfo); +#else + + SequentialThreadSupport::SequentialThreadConstructionInfo colCI("collision",processCollisionTask,createCollisionLocalStoreMemory); + SequentialThreadSupport* m_threadSupportCollision = new SequentialThreadSupport(colCI); + +#endif //USE_LIBSPE2 + +///Playstation 3 SPU (SPURS) version is available through PS3 Devnet +/// For Unix/Mac someone could implement a pthreads version of btThreadSupportInterface? +///you can hook it up to your custom task scheduler by deriving from btThreadSupportInterface +#endif + + + m_dispatcher = new SpuGatheringCollisionDispatcher(m_threadSupportCollision,maxNumOutstandingTasks,m_collisionConfiguration); +// m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); +#else + + m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); +#endif //USE_PARALLEL_DISPATCHER + + + btVector3 worldAabbMin(-1000,-1000,-1000); + btVector3 worldAabbMax(1000,1000,1000); + + m_broadphase = new btAxisSweep3(worldAabbMin,worldAabbMax,maxProxies); + + + +#ifdef USE_PARALLEL_SOLVER + +#ifdef USE_WIN32_THREADING + m_threadSupportSolver = new Win32ThreadSupport(Win32ThreadSupport::Win32ThreadConstructionInfo( + "solver", + processSolverTask, + createSolverLocalStoreMemory, + maxNumOutstandingTasks)); +#elif defined (USE_PTHREADS) + PosixThreadSupport::ThreadConstructionInfo solverConstructionInfo("solver", processSolverTask, + createSolverLocalStoreMemory, maxNumOutstandingTasks); + + m_threadSupportSolver = new PosixThreadSupport(solverConstructionInfo); +#else + //for now use sequential version + SequentialThreadSupport::SequentialThreadConstructionInfo solverCI("solver",processSolverTask,createSolverLocalStoreMemory); + m_threadSupportSolver = new SequentialThreadSupport(solverCI); + +#endif //USE_WIN32_THREADING + m_solver = new btParallelSequentialImpulseSolver(m_threadSupportSolver,maxNumOutstandingTasks); + +#else + + btSequentialImpulseConstraintSolver* solver = new btSequentialImpulseConstraintSolver(); + + m_solver = solver; + //default solverMode is SOLVER_RANDMIZE_ORDER. Warmstarting seems not to improve convergence, see + //solver->setSolverMode(0);//btSequentialImpulseConstraintSolver::SOLVER_USE_WARMSTARTING | btSequentialImpulseConstraintSolver::SOLVER_RANDMIZE_ORDER); + +#endif //USE_PARALLEL_SOLVER + + btDiscreteDynamicsWorld* world = new btDiscreteDynamicsWorld(m_dispatcher,m_broadphase,m_solver,m_collisionConfiguration); + m_dynamicsWorld = world; + + world->getSolverInfo().m_numIterations = 4; + world->getSolverInfo().m_solverMode = SOLVER_SIMD+SOLVER_USE_WARMSTARTING; + + m_dynamicsWorld->getDispatchInfo().m_enableSPU = true; + m_dynamicsWorld->setGravity(btVector3(0,-10,0)); + + + + int i; + + btTransform tr; + tr.setIdentity(); + + + for (i=0;i0) + { + shapeIndex[i] = 1;//sphere + } + else + shapeIndex[i] = 0; + } + + + btTransform trans; + trans.setIdentity(); + + btScalar halfExtents = CUBE_HALF_EXTENTS; + + trans.setOrigin(btVector3(0,-halfExtents,0)); + + + + localCreateRigidBody(0.f,trans,m_collisionShapes[shapeIndex[0]]); + + int numWalls = 15; + int wallHeight = 15; + float wallDistance = 3; + + + for ( i=0;isetLinearVelocity(btVector3(0,0,-10)); +#endif +// clientResetScene(); + + +} + + + + + + +void MultiThreadedDemo::exitPhysics() +{ + + //cleanup in the reverse order of creation/initialization + + //remove the rigidbodies from the dynamics world and delete them + int i; + for (i=m_dynamicsWorld->getNumCollisionObjects()-1; i>=0 ;i--) + { + btCollisionObject* obj = m_dynamicsWorld->getCollisionObjectArray()[i]; + btRigidBody* body = btRigidBody::upcast(obj); + if (body && body->getMotionState()) + { + delete body->getMotionState(); + } + m_dynamicsWorld->removeCollisionObject( obj ); + delete obj; + } + + //delete collision shapes + for (int j=0;j m_collisionShapes; + + btBroadphaseInterface* m_broadphase; + + btCollisionDispatcher* m_dispatcher; + + class btThreadSupportInterface* m_threadSupportCollision; + class btThreadSupportInterface* m_threadSupportSolver; + + btConstraintSolver* m_solver; + + btCollisionAlgorithmCreateFunc* m_boxBoxCF; + + btDefaultCollisionConfiguration* m_collisionConfiguration; + + + public: + + void initPhysics(); + + void exitPhysics(); + + virtual ~MultiThreadedDemo() + { + exitPhysics(); + } + + virtual void clientMoveAndDisplay(); + + virtual void displayCallback(); + + void createStack( btCollisionShape* boxShape, float halfCubeSize, int size, float zPos ); + + static DemoApplication* Create() + { + MultiThreadedDemo* demo = new MultiThreadedDemo; + demo->myinit(); + demo->initPhysics(); + return demo; + } + +}; + +#endif //MULTI_THREADED_DEMO_H + diff --git a/BulletPhysics/bulletTrunk/Demos/MultiThreadedDemo/main.cpp b/BulletPhysics/bulletTrunk/Demos/MultiThreadedDemo/main.cpp new file mode 100644 index 00000000..36b56dea --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/MultiThreadedDemo/main.cpp @@ -0,0 +1,36 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ +#include +#include "MultiThreadedDemo.h" +#include "GlutStuff.h" +#include "GLDebugDrawer.h" +#include "btBulletDynamicsCommon.h" + +GLDebugDrawer gDebugDrawer; + +int main(int argc,char** argv) +{ + MultiThreadedDemo* demo = new MultiThreadedDemo(); + + demo->initPhysics(); + demo->getDynamicsWorld()->setDebugDrawer(&gDebugDrawer); + + + glutmain(argc, argv,640,480,"Bullet Physics Demo. http://bulletphysics.com",demo); + + delete demo; + + return EXIT_SUCCESS; +} diff --git a/BulletPhysics/bulletTrunk/Demos/OpenGL/BMF_Api.cpp b/BulletPhysics/bulletTrunk/Demos/OpenGL/BMF_Api.cpp new file mode 100644 index 00000000..3c6bf45c --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/OpenGL/BMF_Api.cpp @@ -0,0 +1,162 @@ +/** + * ***** BEGIN GPL/BL DUAL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU bteral Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. The Blender + * Foundation also sells licenses for use in proprietary software under + * the Blender License. See http://www.blender.org/BL/ for information + * about this. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU bteral Public License for more details. + * + * You should have received a copy of the GNU bteral Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): none yet. + * + * ***** END GPL/BL DUAL LICENSE BLOCK ***** + */ + +/** + + * Copyright (C) 2001 NaN Technologies B.V. + * + * Implementation of the API of the OpenGL bitmap font library. + */ + +#include "BMF_Api.h" + +#include "BMF_BitmapFont.h" + + +#if BMF_INCLUDE_HELV10 +extern BMF_FontData BMF_font_helv10; +static BMF_BitmapFont bmfHelv10(&BMF_font_helv10); +#endif // BMF_INCLUDE_HELV10 +#if BMF_INCLUDE_HELV12 +extern BMF_FontData BMF_font_helv12; +static BMF_BitmapFont bmfHelv12(&BMF_font_helv12); +#endif // BMF_INCLUDE_HELV12 +#if BMF_INCLUDE_HELVB8 +extern BMF_FontData BMF_font_helvb8; +static BMF_BitmapFont bmfHelvb8(&BMF_font_helvb8); +#endif // BMF_INCLUDE_HELVB8 +#if BMF_INCLUDE_HELVB10 +extern BMF_FontData BMF_font_helvb10; +static BMF_BitmapFont bmfHelvb10(&BMF_font_helvb10); +#endif // BMF_INCLUDE_HELVB10 +#if BMF_INCLUDE_HELVB12 +extern BMF_FontData BMF_font_helvb12; +static BMF_BitmapFont bmfHelvb12(&BMF_font_helvb12); +#endif // BMF_INCLUDE_HELVB12 +#if BMF_INCLUDE_HELVB14 +extern BMF_FontData BMF_font_helvb14; +static BMF_BitmapFont bmfHelvb14(&BMF_font_helvb14); +#endif // BMF_INCLUDE_HELVB14 +#if BMF_INCLUDE_SCR12 +extern BMF_FontData BMF_font_scr12; +static BMF_BitmapFont bmfScreen12(&BMF_font_scr12); +#endif // BMF_INCLUDE_SCR12 +#if BMF_INCLUDE_SCR14 +extern BMF_FontData BMF_font_scr14; +static BMF_BitmapFont bmfScreen14(&BMF_font_scr14); +#endif // BMF_INCLUDE_SCR14 +#if BMF_INCLUDE_SCR15 +extern BMF_FontData BMF_font_scr15; +static BMF_BitmapFont bmfScreen15(&BMF_font_scr15); +#endif // BMF_INCLUDE_SCR15 + + +BMF_Font* BMF_GetFont(BMF_FontType font) +{ + switch (font) + { +#if BMF_INCLUDE_HELV10 + case BMF_kHelvetica10: return (BMF_Font*) &bmfHelv10; +#endif // BMF_INCLUDE_HELV10 +#if BMF_INCLUDE_HELV12 + case BMF_kHelvetica12: return (BMF_Font*) &bmfHelv12; +#endif // BMF_INCLUDE_HELV12 +#if BMF_INCLUDE_HELVB8 + case BMF_kHelveticaBold8: return (BMF_Font*) &bmfHelvb8; +#endif // BMF_INCLUDE_HELVB8 +#if BMF_INCLUDE_HELVB10 + case BMF_kHelveticaBold10: return (BMF_Font*) &bmfHelvb10; +#endif // BMF_INCLUDE_HELVB10 +#if BMF_INCLUDE_HELVB12 + case BMF_kHelveticaBold12: return (BMF_Font*) &bmfHelvb12; +#endif // BMF_INCLUDE_HELVB12 +#if BMF_INCLUDE_HELVB14 + case BMF_kHelveticaBold14: return (BMF_Font*) &bmfHelvb14; +#endif // BMF_INCLUDE_HELVB12 +#if BMF_INCLUDE_SCR12 + case BMF_kScreen12: return (BMF_Font*) &bmfScreen12; +#endif // BMF_INCLUDE_SCR12 +#if BMF_INCLUDE_SCR14 + case BMF_kScreen14: return (BMF_Font*) &bmfScreen14; +#endif // BMF_INCLUDE_SCR14 +#if BMF_INCLUDE_SCR15 + case BMF_kScreen15: return (BMF_Font*) &bmfScreen15; +#endif // BMF_INCLUDE_SCR15 + default: + break; + } + return 0; +} + + +int BMF_DrawCharacter(BMF_Font* font, char c) +{ + char str[2] = {c, '\0'}; + return BMF_DrawString(font, str); +} + + +int BMF_DrawString(BMF_Font* font, const char* str) +{ + if (!font) return 0; + ((BMF_BitmapFont*)font)->drawString(str); + return 1; +} + + +int BMF_GetCharacterWidth(BMF_Font* font, char c) +{ + char str[2] = {c, '\0'}; + return BMF_GetStringWidth(font, str); +} + + +int BMF_GetStringWidth(BMF_Font* font, char* str) +{ + if (!font) return 0; + return ((BMF_BitmapFont*)font)->getStringWidth(str); +} + + +void BMF_GetBoundingBox(BMF_Font* font, int *xmin_r, int *ymin_r, int *xmax_r, int *ymax_r) +{ + if (!font) return; + ((BMF_BitmapFont*)font)->getBoundingBox(*xmin_r, *ymin_r, *xmax_r, *ymax_r); +} + +int BMF_GetFontTexture(BMF_Font* font) { + if (!font) return -1; + return ((BMF_BitmapFont*)font)->getTexture(); +} + +void BMF_DrawStringTexture(BMF_Font* font, char *string, float x, float y, float z) { + if (!font) return; + ((BMF_BitmapFont*)font)->drawStringTexture(string, x, y, z); +} diff --git a/BulletPhysics/bulletTrunk/Demos/OpenGL/BMF_Api.h b/BulletPhysics/bulletTrunk/Demos/OpenGL/BMF_Api.h new file mode 100644 index 00000000..2bb3a7ab --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/OpenGL/BMF_Api.h @@ -0,0 +1,128 @@ +/** + * ***** BEGIN GPL/BL DUAL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU bteral Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. The Blender + * Foundation also sells licenses for use in proprietary software under + * the Blender License. See http://www.blender.org/BL/ for information + * about this. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU bteral Public License for more details. + * + * You should have received a copy of the GNU bteral Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): none yet. + * + * ***** END GPL/BL DUAL LICENSE BLOCK ***** + */ + +/** + + * Copyright (C) 2001 NaN Technologies B.V. + * + * API of the OpenGL bitmap font library. + * Currently draws fonts using the glBitmap routine. + * This implies that drawing speed is heavyly dependant on + * the 2D capabilities of the graphics card. + */ + +#ifndef __BMF_API_H +#define __BMF_API_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include "BMF_Fonts.h" + +/** + * Returns the font for a given font type. + * @param font The font to retrieve. + * @return The font (or nil if not found). + */ +BMF_Font* BMF_GetFont(BMF_FontType font); + +/** + * Draws a character at the current raster position. + * @param font The font to use. + * @param c The character to draw. + * @return Indication of success (0 == error). + */ +int BMF_DrawCharacter(BMF_Font* font, char c); + +/** + * Draws a string at the current raster position. + * @param font The font to use. + * @param str The string to draw. + * @return Indication of success (0 == error). + */ +int BMF_DrawString(BMF_Font* font, const char* str); + +/** + * Returns the width of a character in pixels. + * @param font The font to use. + * @param c The character. + * @return The length. + */ +int BMF_GetCharacterWidth(BMF_Font* font, char c); + +/** + * Returns the width of a string of characters. + * @param font The font to use. + * @param str The string. + * @return The length. + */ +int BMF_GetStringWidth(BMF_Font* font, char* str); + +/** + * Returns the bounding box of the font. The width and + * height represent the bounding box of the union of + * all glyps. The minimum and maximum values of the + * box represent the extent of the font and its positioning + * about the origin. + */ +void BMF_GetBoundingBox(BMF_Font* font, int *xmin_r, int *ymin_r, int *xmax_r, int *ymax_r); + +/** + * Convert the given @a font to a texture, and return the GL texture + * ID of the texture. If the texture ID is bound, text can + * be drawn using the texture by calling drawStringTexture. + * + * @param font The font to create the texture from. + * @return The GL texture ID of the new texture, or -1 if unable + * to create. + */ +int BMF_GetFontTexture(BMF_Font* font); + +/** + * Draw the given @a str at the point @a x, @a y, @a z, using + * texture coordinates. This assumes that an appropriate texture + * has been bound, see BMF_BitmapFont::getTexture(). The string + * is drawn along the positive X axis. + * + * @param font The font to draw with. + * @param string The c-string to draw. + * @param x The x coordinate to start drawing at. + * @param y The y coordinate to start drawing at. + * @param z The z coordinate to start drawing at. + */ +void BMF_DrawStringTexture(BMF_Font* font, char* string, float x, float y, float z); + +#ifdef __cplusplus +} +#endif + +#endif /* __BMF_API_H */ + diff --git a/BulletPhysics/bulletTrunk/Demos/OpenGL/BMF_BitmapFont.cpp b/BulletPhysics/bulletTrunk/Demos/OpenGL/BMF_BitmapFont.cpp new file mode 100644 index 00000000..4098b214 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/OpenGL/BMF_BitmapFont.cpp @@ -0,0 +1,208 @@ +/** + * ***** BEGIN GPL/BL DUAL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU bteral Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. The Blender + * Foundation also sells licenses for use in proprietary software under + * the Blender License. See http://www.blender.org/BL/ for information + * about this. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU bteral Public License for more details. + * + * You should have received a copy of the GNU bteral Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): none yet. + * + * ***** END GPL/BL DUAL LICENSE BLOCK ***** + */ + +/** + + * Copyright (C) 2001 NaN Technologies B.V. + */ + +#include + +#if defined(WIN32) || defined(__APPLE__) + #ifdef WIN32 + #if !defined(__CYGWIN32__) + #pragma warning(disable:4244) + #endif /* __CYGWIN32__ */ + #include + #include + #else // WIN32 + // __APPLE__ is defined + #include + #endif // WIN32 +#else // defined(WIN32) || defined(__APPLE__) + #include +#endif // defined(WIN32) || defined(__APPLE__) + +#include "BMF_BitmapFont.h" + + +BMF_BitmapFont::BMF_BitmapFont(BMF_FontData* fontData) +: m_fontData(fontData) +{ +} + + +BMF_BitmapFont::~BMF_BitmapFont(void) +{ +} + + +void BMF_BitmapFont::drawString(const char* str) +{ + if (!str) + return; + + GLint alignment; + unsigned char c; + + glGetIntegerv(GL_UNPACK_ALIGNMENT, &alignment); + glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + + while ((c = (unsigned char) *str++)) { + BMF_CharData & cd = m_fontData->chars[c]; + + if (cd.data_offset==-1) { + GLubyte nullBitmap = 0; + + glBitmap(1, 1, 0, 0, cd.advance, 0, &nullBitmap); + } else { + GLubyte *bitmap = &m_fontData->bitmap_data[cd.data_offset]; + + glBitmap(cd.width, cd.height, cd.xorig, cd.yorig, cd.advance, 0, bitmap); + } + } + + glPixelStorei(GL_UNPACK_ALIGNMENT, alignment); +} + + +int BMF_BitmapFont::getStringWidth(char* str) +{ + unsigned char c; + int length = 0; + + while ((c = (unsigned char) *str++)) { + length += m_fontData->chars[c].advance; + } + + return length; +} + +void BMF_BitmapFont::getBoundingBox(int & xMin, int & yMin, int & xMax, int & yMax) +{ + xMin = m_fontData->xmin; + yMin = m_fontData->ymin; + xMax = m_fontData->xmax; + yMax = m_fontData->ymax; +} + +int BMF_BitmapFont::getTexture() +{ + int fWidth = m_fontData->xmax - m_fontData->xmin; + int fHeight = m_fontData->ymax - m_fontData->ymin; + + if (fWidth>=16 || fHeight>=16) { + return -1; + } + + int cRows = 16, cCols = 16; + int cWidth = 16, cHeight = 16; + int iWidth = cCols*cWidth; + int iHeight = cRows*cHeight; + GLubyte *img = new GLubyte [iHeight*iWidth]; + GLuint texId; + + int baseLine = -(m_fontData->ymin); + + memset(img, 0, iHeight*iWidth); + for (int i = 0; i<256; i++) { + BMF_CharData & cd = m_fontData->chars[i]; + + if (cd.data_offset != -1) { + int cellX = i%16; + int cellY = i/16; + + for (int y = 0; ybitmap_data[cd.data_offset + ((cd.width+7)/8)*y]; + + for (int x = 0; xymin); + + glBegin(GL_QUADS); + while ((c = (unsigned char) *str++)) { + BMF_CharData & cd = m_fontData->chars[c]; + + if (cd.data_offset != -1) { + float cellX = (c%16)/16.0; + float cellY = (c/16)/16.0; + + glTexCoord2f(cellX + 1.0/16.0, cellY); + glVertex3f(x + pos + 16.0, -baseLine + y + 0.0, z); + + glTexCoord2f(cellX + 1.0/16.0, cellY + 1.0/16.0); + glVertex3f(x + pos + 16.0, -baseLine + y + 16.0, z); + + glTexCoord2f(cellX, cellY + 1.0/16.0); + glVertex3f(x + pos + 0.0, -baseLine + y + 16.0, z); + + glTexCoord2f(cellX, cellY); + glVertex3f(x + pos + 0.0, -baseLine + y + 0.0, z); + } + + pos += cd.advance; + } + glEnd(); +} diff --git a/BulletPhysics/bulletTrunk/Demos/OpenGL/BMF_BitmapFont.h b/BulletPhysics/bulletTrunk/Demos/OpenGL/BMF_BitmapFont.h new file mode 100644 index 00000000..00354f4a --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/OpenGL/BMF_BitmapFont.h @@ -0,0 +1,111 @@ +/** + * ***** BEGIN GPL/BL DUAL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU bteral Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. The Blender + * Foundation also sells licenses for use in proprietary software under + * the Blender License. See http://www.blender.org/BL/ for information + * about this. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU bteral Public License for more details. + * + * You should have received a copy of the GNU bteral Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): none yet. + * + * ***** END GPL/BL DUAL LICENSE BLOCK ***** + */ + +/** + + * Copyright (C) 2001 NaN Technologies B.V. + */ + +#ifndef __BMF_BITMAP_FONT_H +#define __BMF_BITMAP_FONT_H + +#include "BMF_FontData.h" + +/** + * Base class for OpenGL bitmap fonts. + */ +class BMF_BitmapFont +{ +public: + /** + * Default constructor. + */ + BMF_BitmapFont(BMF_FontData* fontData); + + /** + * Destructor. + */ + virtual ~BMF_BitmapFont(void); + + /** + * Draws a string at the current raster position. + * @param str The string to draw. + */ + void drawString(const char* str); + + void drawStringMemory(char* str); + + + /** + * Draws a string at the current raster position. + * @param str The string to draw. + * @return The width of the string. + */ + int getStringWidth(char* str); + + /** + * Returns the bounding box of the font. The width and + * height represent the bounding box of the union of + * all glyps. The minimum and maximum values of the + * box represent the extent of the font and its positioning + * about the origin. + */ + void getBoundingBox(int & xMin, int & yMin, int & xMax, int & yMax); + + /** + * Convert the font to a texture, and return the GL texture + * ID of the texture. If the texture ID is bound, text can + * be drawn using the texture by calling drawStringTexture. + * + * @return The GL texture ID of the new texture, or -1 if unable + * to create. + */ + int getTexture(); + + /** + * Draw the given @a string at the point @a x, @a y, @a z, using + * texture coordinates. This assumes that an appropriate texture + * has been bound, see BMF_BitmapFont::getTexture(). The string + * is drawn along the positive X axis. + * + * @param string The c-string to draw. + * @param x The x coordinate to start drawing at. + * @param y The y coordinate to start drawing at. + * @param z The z coordinate to start drawing at. + */ + void drawStringTexture(char* string, float x, float y, float z); + +protected: + /** Pointer to the font data. */ + BMF_FontData* m_fontData; +}; + +#endif // __BMF_BITMAP_FONT_H + diff --git a/BulletPhysics/bulletTrunk/Demos/OpenGL/BMF_FontData.h b/BulletPhysics/bulletTrunk/Demos/OpenGL/BMF_FontData.h new file mode 100644 index 00000000..c3bdd808 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/OpenGL/BMF_FontData.h @@ -0,0 +1,56 @@ +/** + * ***** BEGIN GPL/BL DUAL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU bteral Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. The Blender + * Foundation also sells licenses for use in proprietary software under + * the Blender License. See http://www.blender.org/BL/ for information + * about this. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU bteral Public License for more details. + * + * You should have received a copy of the GNU bteral Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): none yet. + * + * ***** END GPL/BL DUAL LICENSE BLOCK ***** + */ + +/** + + * Copyright (C) 2001 NaN Technologies B.V. + */ + +#ifndef __BMF_FONTDATA_H__ +#define __BMF_FONTDATA_H__ + +typedef struct { + signed char width, height; + signed char xorig, yorig; + signed char advance; + + short data_offset; +} BMF_CharData; + +typedef struct { + int xmin, ymin; + int xmax, ymax; + + BMF_CharData chars[256]; + unsigned char* bitmap_data; +} BMF_FontData; + +#endif + diff --git a/BulletPhysics/bulletTrunk/Demos/OpenGL/BMF_Fonts.h b/BulletPhysics/bulletTrunk/Demos/OpenGL/BMF_Fonts.h new file mode 100644 index 00000000..96bc9610 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/OpenGL/BMF_Fonts.h @@ -0,0 +1,75 @@ +/** + * ***** BEGIN GPL/BL DUAL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU bteral Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. The Blender + * Foundation also sells licenses for use in proprietary software under + * the Blender License. See http://www.blender.org/BL/ for information + * about this. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU bteral Public License for more details. + * + * You should have received a copy of the GNU bteral Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): none yet. + * + * ***** END GPL/BL DUAL LICENSE BLOCK ***** + */ + +/** + + * Copyright (C) 2001 NaN Technologies B.V. + * Defines the names of the fonts in the library. + */ + +#ifndef __BMF_FONTS_H +#define __BMF_FONTS_H + +#include "BMF_Settings.h" + +typedef enum +{ + BMF_kHelvetica10 = 0, +#if BMF_INCLUDE_HELV12 + BMF_kHelvetica12, +#endif +#if BMF_INCLUDE_HELVB8 + BMF_kHelveticaBold8, +#endif +#if BMF_INCLUDE_HELVB10 + BMF_kHelveticaBold10, +#endif +#if BMF_INCLUDE_HELVB12 + BMF_kHelveticaBold12, +#endif +#if BMF_INCLUDE_HELVB14 + BMF_kHelveticaBold14, +#endif +#if BMF_INCLUDE_SCR12 + BMF_kScreen12, +#endif +#if BMF_INCLUDE_SCR14 + BMF_kScreen14, +#endif +#if BMF_INCLUDE_SCR15 + BMF_kScreen15, +#endif + BMF_kNumFonts +} BMF_FontType; + +typedef struct BMF_Font BMF_Font; + +#endif /* __BMF_FONTS_H */ + diff --git a/BulletPhysics/bulletTrunk/Demos/OpenGL/BMF_Settings.h b/BulletPhysics/bulletTrunk/Demos/OpenGL/BMF_Settings.h new file mode 100644 index 00000000..90a07340 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/OpenGL/BMF_Settings.h @@ -0,0 +1,52 @@ +/** + * ***** BEGIN GPL/BL DUAL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU bteral Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. The Blender + * Foundation also sells licenses for use in proprietary software under + * the Blender License. See http://www.blender.org/BL/ for information + * about this. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU bteral Public License for more details. + * + * You should have received a copy of the GNU bteral Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): none yet. + * + * ***** END GPL/BL DUAL LICENSE BLOCK ***** + */ + +/** + + * Copyright (C) 2001 NaN Technologies B.V. + * Allows you to determine which fonts to include in the library. + */ + +#ifndef __BMF_SETTINGS_H +#define __BMF_SETTINGS_H + + +#define BMF_INCLUDE_HELV12 0 +#define BMF_INCLUDE_HELVB8 0 +#define BMF_INCLUDE_HELVB10 0 +#define BMF_INCLUDE_HELVB12 0 +#define BMF_INCLUDE_HELVB14 0 +#define BMF_INCLUDE_SCR12 0 +#define BMF_INCLUDE_SCR14 0 +#define BMF_INCLUDE_SCR15 0 +#define BMF_INCLUDE_HELV10 1 + +#endif /* __BMF_SETTINGS_H */ + diff --git a/BulletPhysics/bulletTrunk/Demos/OpenGL/BMF_font_helv10.cpp b/BulletPhysics/bulletTrunk/Demos/OpenGL/BMF_font_helv10.cpp new file mode 100644 index 00000000..025ebf6b --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/OpenGL/BMF_font_helv10.cpp @@ -0,0 +1,491 @@ +/** + * ***** BEGIN GPL/BL DUAL LICENSE BLOCK ***** + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU bteral Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. The Blender + * Foundation also sells licenses for use in proprietary software under + * the Blender License. See http://www.blender.org/BL/ for information + * about this. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU bteral Public License for more details. + * + * You should have received a copy of the GNU bteral Public License + * along with this program; if not, write to the Free Software Foundation, + * Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. + * + * The Original Code is Copyright (C) 2001-2002 by NaN Holding BV. + * All rights reserved. + * + * The Original Code is: all of this file. + * + * Contributor(s): none yet. + * + * ***** END GPL/BL DUAL LICENSE BLOCK ***** + */ + +#include "BMF_FontData.h" +#include "BMF_Settings.h" + +#if BMF_INCLUDE_HELV10 + +static unsigned char bitmap_data[]= { + 0x80,0x00,0x80,0x80,0x80,0x80,0x80,0x80, + 0xa0,0xa0,0x50,0x50,0xf8,0x28,0x7c,0x28, + 0x28,0x20,0x70,0xa8,0x28,0x70,0xa0,0xa8, + 0x70,0x20,0x26,0x29,0x16,0x10,0x08,0x68, + 0x94,0x64,0x64,0x98,0x98,0xa4,0x60,0x50, + 0x50,0x20,0x80,0x40,0x40,0x20,0x40,0x40, + 0x80,0x80,0x80,0x80,0x40,0x40,0x20,0x80, + 0x40,0x40,0x20,0x20,0x20,0x20,0x40,0x40, + 0x80,0xa0,0x40,0xa0,0x20,0x20,0xf8,0x20, + 0x20,0x80,0x40,0x40,0xf8,0x80,0x80,0x80, + 0x40,0x40,0x40,0x40,0x20,0x20,0x70,0x88, + 0x88,0x88,0x88,0x88,0x88,0x70,0x40,0x40, + 0x40,0x40,0x40,0x40,0xc0,0x40,0xf8,0x80, + 0x40,0x30,0x08,0x08,0x88,0x70,0x70,0x88, + 0x08,0x08,0x30,0x08,0x88,0x70,0x10,0x10, + 0xf8,0x90,0x50,0x50,0x30,0x10,0x70,0x88, + 0x08,0x08,0xf0,0x80,0x80,0xf8,0x70,0x88, + 0x88,0xc8,0xb0,0x80,0x88,0x70,0x40,0x40, + 0x20,0x20,0x10,0x10,0x08,0xf8,0x70,0x88, + 0x88,0x88,0x70,0x88,0x88,0x70,0x70,0x88, + 0x08,0x68,0x98,0x88,0x88,0x70,0x80,0x00, + 0x00,0x00,0x00,0x80,0x80,0x40,0x40,0x00, + 0x00,0x00,0x00,0x40,0x20,0x40,0x80,0x40, + 0x20,0xf0,0x00,0xf0,0x80,0x40,0x20,0x40, + 0x80,0x40,0x00,0x40,0x40,0x20,0x10,0x90, + 0x60,0x3e,0x00,0x40,0x00,0x9b,0x00,0xa4, + 0x80,0xa4,0x80,0xa2,0x40,0x92,0x40,0x4d, + 0x40,0x20,0x80,0x1f,0x00,0x82,0x82,0x7c, + 0x44,0x28,0x28,0x10,0x10,0xf0,0x88,0x88, + 0x88,0xf0,0x88,0x88,0xf0,0x78,0x84,0x80, + 0x80,0x80,0x80,0x84,0x78,0xf0,0x88,0x84, + 0x84,0x84,0x84,0x88,0xf0,0xf8,0x80,0x80, + 0x80,0xf8,0x80,0x80,0xf8,0x80,0x80,0x80, + 0x80,0xf0,0x80,0x80,0xf8,0x74,0x8c,0x84, + 0x8c,0x80,0x80,0x84,0x78,0x84,0x84,0x84, + 0x84,0xfc,0x84,0x84,0x84,0x80,0x80,0x80, + 0x80,0x80,0x80,0x80,0x80,0x60,0x90,0x10, + 0x10,0x10,0x10,0x10,0x10,0x88,0x88,0x90, + 0x90,0xe0,0xa0,0x90,0x88,0xf0,0x80,0x80, + 0x80,0x80,0x80,0x80,0x80,0x92,0x92,0x92, + 0xaa,0xaa,0xc6,0xc6,0x82,0x8c,0x8c,0x94, + 0x94,0xa4,0xa4,0xc4,0xc4,0x78,0x84,0x84, + 0x84,0x84,0x84,0x84,0x78,0x80,0x80,0x80, + 0x80,0xf0,0x88,0x88,0xf0,0x02,0x7c,0x8c, + 0x94,0x84,0x84,0x84,0x84,0x78,0x88,0x88, + 0x88,0x88,0xf0,0x88,0x88,0xf0,0x70,0x88, + 0x88,0x08,0x70,0x80,0x88,0x70,0x20,0x20, + 0x20,0x20,0x20,0x20,0x20,0xf8,0x78,0x84, + 0x84,0x84,0x84,0x84,0x84,0x84,0x10,0x28, + 0x28,0x44,0x44,0x44,0x82,0x82,0x22,0x00, + 0x22,0x00,0x22,0x00,0x55,0x00,0x49,0x00, + 0x49,0x00,0x88,0x80,0x88,0x80,0x88,0x88, + 0x50,0x50,0x20,0x50,0x88,0x88,0x10,0x10, + 0x10,0x28,0x28,0x44,0x44,0x82,0xf8,0x80, + 0x40,0x20,0x20,0x10,0x08,0xf8,0xc0,0x80, + 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0xc0, + 0x20,0x20,0x40,0x40,0x40,0x40,0x80,0x80, + 0xc0,0x40,0x40,0x40,0x40,0x40,0x40,0x40, + 0x40,0xc0,0x88,0x50,0x50,0x20,0x20,0xfc, + 0x80,0x80,0x40,0x68,0x90,0x90,0x70,0x10, + 0xe0,0xb0,0xc8,0x88,0x88,0xc8,0xb0,0x80, + 0x80,0x60,0x90,0x80,0x80,0x90,0x60,0x68, + 0x98,0x88,0x88,0x98,0x68,0x08,0x08,0x60, + 0x90,0x80,0xf0,0x90,0x60,0x40,0x40,0x40, + 0x40,0x40,0xe0,0x40,0x30,0x70,0x08,0x68, + 0x98,0x88,0x88,0x98,0x68,0x88,0x88,0x88, + 0x88,0xc8,0xb0,0x80,0x80,0x80,0x80,0x80, + 0x80,0x80,0x80,0x00,0x80,0x80,0x80,0x80, + 0x80,0x80,0x80,0x80,0x00,0x80,0x90,0x90, + 0xa0,0xc0,0xa0,0x90,0x80,0x80,0x80,0x80, + 0x80,0x80,0x80,0x80,0x80,0x80,0x92,0x92, + 0x92,0x92,0x92,0xec,0x88,0x88,0x88,0x88, + 0xc8,0xb0,0x70,0x88,0x88,0x88,0x88,0x70, + 0x80,0x80,0xb0,0xc8,0x88,0x88,0xc8,0xb0, + 0x08,0x08,0x68,0x98,0x88,0x88,0x98,0x68, + 0x80,0x80,0x80,0x80,0xc0,0xa0,0x60,0x90, + 0x10,0x60,0x90,0x60,0x60,0x40,0x40,0x40, + 0x40,0xe0,0x40,0x40,0x70,0x90,0x90,0x90, + 0x90,0x90,0x20,0x20,0x50,0x50,0x88,0x88, + 0x28,0x28,0x54,0x54,0x92,0x92,0x88,0x88, + 0x50,0x20,0x50,0x88,0x80,0x40,0x40,0x60, + 0xa0,0xa0,0x90,0x90,0xf0,0x80,0x40,0x20, + 0x10,0xf0,0x20,0x40,0x40,0x40,0x40,0x80, + 0x40,0x40,0x40,0x20,0x80,0x80,0x80,0x80, + 0x80,0x80,0x80,0x80,0x80,0x80,0x80,0x40, + 0x40,0x40,0x40,0x20,0x40,0x40,0x40,0x80, + 0x98,0x64,0x80,0x80,0x80,0x80,0x80,0x80, + 0x00,0x80,0x40,0x70,0xa8,0xa0,0xa0,0xa8, + 0x70,0x10,0xb0,0x48,0x40,0x40,0xe0,0x40, + 0x48,0x30,0x90,0x60,0x90,0x90,0x60,0x90, + 0x20,0xf8,0x20,0xf8,0x50,0x50,0x88,0x88, + 0x80,0x80,0x80,0x80,0x00,0x00,0x80,0x80, + 0x80,0x80,0x70,0x88,0x18,0x70,0xc8,0x98, + 0x70,0xc0,0x88,0x70,0xa0,0x38,0x44,0x9a, + 0xa2,0x9a,0x44,0x38,0xe0,0x00,0xa0,0x20, + 0xe0,0x28,0x50,0xa0,0x50,0x28,0x08,0x08, + 0xf8,0xe0,0x38,0x44,0xaa,0xb2,0xba,0x44, + 0x38,0xe0,0x60,0x90,0x90,0x60,0xf8,0x00, + 0x20,0x20,0xf8,0x20,0x20,0xe0,0x40,0xa0, + 0x60,0xc0,0x20,0x40,0xe0,0x80,0x40,0x80, + 0x80,0xf0,0x90,0x90,0x90,0x90,0x90,0x28, + 0x28,0x28,0x28,0x28,0x68,0xe8,0xe8,0xe8, + 0x7c,0xc0,0xc0,0x40,0x40,0x40,0xc0,0x40, + 0xe0,0x00,0xe0,0xa0,0xe0,0xa0,0x50,0x28, + 0x50,0xa0,0x21,0x00,0x17,0x80,0x13,0x00, + 0x09,0x00,0x48,0x00,0x44,0x00,0xc4,0x00, + 0x42,0x00,0x27,0x12,0x15,0x0b,0x48,0x44, + 0xc4,0x42,0x21,0x00,0x17,0x80,0x13,0x00, + 0x09,0x00,0xc8,0x00,0x24,0x00,0x44,0x00, + 0xe2,0x00,0x60,0x90,0x80,0x40,0x20,0x20, + 0x00,0x20,0x82,0x82,0x7c,0x44,0x28,0x28, + 0x10,0x10,0x00,0x10,0x20,0x82,0x82,0x7c, + 0x44,0x28,0x28,0x10,0x10,0x00,0x10,0x08, + 0x82,0x82,0x7c,0x44,0x28,0x28,0x10,0x10, + 0x00,0x28,0x10,0x82,0x82,0x7c,0x44,0x28, + 0x28,0x10,0x10,0x00,0x28,0x14,0x82,0x82, + 0x7c,0x44,0x28,0x28,0x10,0x10,0x00,0x28, + 0x82,0x82,0x7c,0x44,0x28,0x28,0x10,0x10, + 0x10,0x28,0x10,0x8f,0x80,0x88,0x00,0x78, + 0x00,0x48,0x00,0x2f,0x80,0x28,0x00,0x18, + 0x00,0x1f,0x80,0x30,0x10,0x78,0x84,0x80, + 0x80,0x80,0x80,0x84,0x78,0xf8,0x80,0x80, + 0x80,0xf8,0x80,0x80,0xf8,0x00,0x20,0x40, + 0xf8,0x80,0x80,0x80,0xf8,0x80,0x80,0xf8, + 0x00,0x20,0x10,0xf8,0x80,0x80,0xf8,0x80, + 0x80,0x80,0xf8,0x00,0x50,0x20,0xf8,0x80, + 0x80,0x80,0xf8,0x80,0x80,0xf8,0x00,0x50, + 0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, + 0x00,0x40,0x80,0x80,0x80,0x80,0x80,0x80, + 0x80,0x80,0x80,0x00,0x80,0x40,0x40,0x40, + 0x40,0x40,0x40,0x40,0x40,0x40,0x00,0xa0, + 0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x40, + 0x40,0x00,0xa0,0x78,0x44,0x42,0x42,0xf2, + 0x42,0x44,0x78,0x8c,0x8c,0x94,0x94,0xa4, + 0xa4,0xc4,0xc4,0x00,0x50,0x28,0x78,0x84, + 0x84,0x84,0x84,0x84,0x84,0x78,0x00,0x10, + 0x20,0x78,0x84,0x84,0x84,0x84,0x84,0x84, + 0x78,0x00,0x10,0x08,0x78,0x84,0x84,0x84, + 0x84,0x84,0x84,0x78,0x00,0x28,0x10,0x78, + 0x84,0x84,0x84,0x84,0x84,0x84,0x78,0x00, + 0x50,0x28,0x78,0x84,0x84,0x84,0x84,0x84, + 0x84,0x78,0x00,0x48,0x88,0x50,0x20,0x50, + 0x88,0x80,0x78,0xc4,0xa4,0xa4,0x94,0x94, + 0x8c,0x78,0x04,0x78,0x84,0x84,0x84,0x84, + 0x84,0x84,0x84,0x00,0x10,0x20,0x78,0x84, + 0x84,0x84,0x84,0x84,0x84,0x84,0x00,0x20, + 0x10,0x78,0x84,0x84,0x84,0x84,0x84,0x84, + 0x84,0x00,0x28,0x10,0x78,0x84,0x84,0x84, + 0x84,0x84,0x84,0x84,0x00,0x48,0x10,0x10, + 0x10,0x28,0x28,0x44,0x44,0x82,0x00,0x10, + 0x08,0x80,0x80,0xf0,0x88,0x88,0xf0,0x80, + 0x80,0xa0,0x90,0x90,0x90,0xa0,0x90,0x90, + 0x60,0x68,0x90,0x90,0x70,0x10,0xe0,0x00, + 0x20,0x40,0x68,0x90,0x90,0x70,0x10,0xe0, + 0x00,0x20,0x10,0x68,0x90,0x90,0x70,0x10, + 0xe0,0x00,0x50,0x20,0x68,0x90,0x90,0x70, + 0x10,0xe0,0x00,0xa0,0x50,0x68,0x90,0x90, + 0x70,0x10,0xe0,0x00,0x50,0x68,0x90,0x90, + 0x70,0x10,0xe0,0x20,0x50,0x20,0x6c,0x92, + 0x90,0x7e,0x12,0xec,0x60,0x20,0x60,0x90, + 0x80,0x80,0x90,0x60,0x60,0x90,0x80,0xf0, + 0x90,0x60,0x00,0x20,0x40,0x60,0x90,0x80, + 0xf0,0x90,0x60,0x00,0x40,0x20,0x60,0x90, + 0x80,0xf0,0x90,0x60,0x00,0x50,0x20,0x60, + 0x90,0x80,0xf0,0x90,0x60,0x00,0x50,0x40, + 0x40,0x40,0x40,0x40,0x40,0x00,0x40,0x80, + 0x80,0x80,0x80,0x80,0x80,0x80,0x00,0x80, + 0x40,0x40,0x40,0x40,0x40,0x40,0x40,0x00, + 0xa0,0x40,0x40,0x40,0x40,0x40,0x40,0x40, + 0x00,0xa0,0x70,0x88,0x88,0x88,0x88,0x78, + 0x90,0x60,0x50,0x90,0x90,0x90,0x90,0x90, + 0xe0,0x00,0xa0,0x50,0x70,0x88,0x88,0x88, + 0x88,0x70,0x00,0x20,0x40,0x70,0x88,0x88, + 0x88,0x88,0x70,0x00,0x20,0x10,0x70,0x88, + 0x88,0x88,0x88,0x70,0x00,0x50,0x20,0x70, + 0x88,0x88,0x88,0x88,0x70,0x00,0x50,0x28, + 0x70,0x88,0x88,0x88,0x88,0x70,0x00,0x50, + 0x20,0x00,0xf8,0x00,0x20,0x70,0x88,0xc8, + 0xa8,0x98,0x74,0x70,0x90,0x90,0x90,0x90, + 0x90,0x00,0x20,0x40,0x70,0x90,0x90,0x90, + 0x90,0x90,0x00,0x40,0x20,0x70,0x90,0x90, + 0x90,0x90,0x90,0x00,0x50,0x20,0x70,0x90, + 0x90,0x90,0x90,0x90,0x00,0x50,0x80,0x40, + 0x40,0x60,0xa0,0xa0,0x90,0x90,0x00,0x20, + 0x10,0x80,0x80,0xb0,0xc8,0x88,0x88,0xc8, + 0xb0,0x80,0x80,0x80,0x40,0x40,0x60,0xa0, + 0xa0,0x90,0x90,0x00,0x50, +}; + +BMF_FontData BMF_font_helv10 = { + -1, -2, + 10, 11, + { + {0,0,0,0,0, -1}, + {0,0,0,0,0, -1}, + {0,0,0,0,0, -1}, + {0,0,0,0,0, -1}, + {0,0,0,0,0, -1}, + {0,0,0,0,0, -1}, + {0,0,0,0,0, -1}, + {0,0,0,0,0, -1}, + {0,0,0,0,0, -1}, + {0, 0, 0, 0, 12, -1}, + {0,0,0,0,0, -1}, + {0,0,0,0,0, -1}, + {0,0,0,0,0, -1}, + {0,0,0,0,0, -1}, + {0,0,0,0,0, -1}, + {0,0,0,0,0, -1}, + {0,0,0,0,0, -1}, + {0,0,0,0,0, -1}, + {0,0,0,0,0, -1}, + {0,0,0,0,0, -1}, + {0,0,0,0,0, -1}, + {0,0,0,0,0, -1}, + {0,0,0,0,0, -1}, + {0,0,0,0,0, -1}, + {0,0,0,0,0, -1}, + {0,0,0,0,0, -1}, + {0,0,0,0,0, -1}, + {0,0,0,0,0, -1}, + {0,0,0,0,0, -1}, + {0,0,0,0,0, -1}, + {0,0,0,0,0, -1}, + {0,0,0,0,0, -1}, + {0, 0, 0, 0, 3, -1}, + {1, 8, -1, 0, 3, 0}, + {3, 2, -1, -6, 4, 8}, + {6, 7, 0, 0, 6, 10}, + {5, 9, 0, 1, 6, 17}, + {8, 8, 0, 0, 9, 26}, + {6, 8, -1, 0, 8, 34}, + {2, 3, -1, -5, 3, 42}, + {3, 10, 0, 2, 4, 45}, + {3, 10, -1, 2, 4, 55}, + {3, 3, 0, -5, 4, 65}, + {5, 5, 0, -1, 6, 68}, + {2, 3, 0, 2, 3, 73}, + {5, 1, -1, -3, 7, 76}, + {1, 1, -1, 0, 3, 77}, + {3, 8, 0, 0, 3, 78}, + {5, 8, 0, 0, 6, 86}, + {2, 8, -1, 0, 6, 94}, + {5, 8, 0, 0, 6, 102}, + {5, 8, 0, 0, 6, 110}, + {5, 8, 0, 0, 6, 118}, + {5, 8, 0, 0, 6, 126}, + {5, 8, 0, 0, 6, 134}, + {5, 8, 0, 0, 6, 142}, + {5, 8, 0, 0, 6, 150}, + {5, 8, 0, 0, 6, 158}, + {1, 6, -1, 0, 3, 166}, + {2, 8, 0, 2, 3, 172}, + {3, 5, -1, -1, 6, 180}, + {4, 3, 0, -2, 5, 185}, + {3, 5, -1, -1, 6, 188}, + {4, 8, -1, 0, 6, 193}, + {10, 10, 0, 2, 11, 201}, + {7, 8, 0, 0, 7, 221}, + {5, 8, -1, 0, 7, 229}, + {6, 8, -1, 0, 8, 237}, + {6, 8, -1, 0, 8, 245}, + {5, 8, -1, 0, 7, 253}, + {5, 8, -1, 0, 6, 261}, + {6, 8, -1, 0, 8, 269}, + {6, 8, -1, 0, 8, 277}, + {1, 8, -1, 0, 3, 285}, + {4, 8, 0, 0, 5, 293}, + {5, 8, -1, 0, 7, 301}, + {4, 8, -1, 0, 6, 309}, + {7, 8, -1, 0, 9, 317}, + {6, 8, -1, 0, 8, 325}, + {6, 8, -1, 0, 8, 333}, + {5, 8, -1, 0, 7, 341}, + {7, 9, -1, 1, 8, 349}, + {5, 8, -1, 0, 7, 358}, + {5, 8, -1, 0, 7, 366}, + {5, 8, 0, 0, 5, 374}, + {6, 8, -1, 0, 8, 382}, + {7, 8, 0, 0, 7, 390}, + {9, 8, 0, 0, 9, 398}, + {5, 8, -1, 0, 7, 414}, + {7, 8, 0, 0, 7, 422}, + {5, 8, -1, 0, 7, 430}, + {2, 10, -1, 2, 3, 438}, + {3, 8, 0, 0, 3, 448}, + {2, 10, 0, 2, 3, 456}, + {5, 5, 0, -3, 6, 466}, + {6, 1, 0, 2, 6, 471}, + {2, 3, 0, -5, 3, 472}, + {5, 6, 0, 0, 5, 475}, + {5, 8, 0, 0, 6, 481}, + {4, 6, 0, 0, 5, 489}, + {5, 8, 0, 0, 6, 495}, + {4, 6, 0, 0, 5, 503}, + {4, 8, 0, 0, 4, 509}, + {5, 8, 0, 2, 6, 517}, + {5, 8, 0, 0, 6, 525}, + {1, 8, 0, 0, 2, 533}, + {1, 9, 0, 1, 2, 541}, + {4, 8, 0, 0, 5, 550}, + {1, 8, 0, 0, 2, 558}, + {7, 6, 0, 0, 8, 566}, + {5, 6, 0, 0, 6, 572}, + {5, 6, 0, 0, 6, 578}, + {5, 8, 0, 2, 6, 584}, + {5, 8, 0, 2, 6, 592}, + {3, 6, 0, 0, 4, 600}, + {4, 6, 0, 0, 5, 606}, + {3, 8, 0, 0, 4, 612}, + {4, 6, 0, 0, 5, 620}, + {5, 6, 0, 0, 6, 626}, + {7, 6, 0, 0, 8, 632}, + {5, 6, 0, 0, 6, 638}, + {4, 8, 0, 2, 5, 644}, + {4, 6, 0, 0, 5, 652}, + {3, 10, 0, 2, 3, 658}, + {1, 10, -1, 2, 3, 668}, + {3, 10, 0, 2, 3, 678}, + {6, 2, 0, -3, 7, 688}, + {0,0,0,0,0, -1}, + {0,0,0,0,0, -1}, + {0,0,0,0,0, -1}, + {0,0,0,0,0, -1}, + {0,0,0,0,0, -1}, + {0,0,0,0,0, -1}, + {0,0,0,0,0, -1}, + {0,0,0,0,0, -1}, + {0,0,0,0,0, -1}, + {0,0,0,0,0, -1}, + {0,0,0,0,0, -1}, + {0,0,0,0,0, -1}, + {0,0,0,0,0, -1}, + {0,0,0,0,0, -1}, + {0,0,0,0,0, -1}, + {0,0,0,0,0, -1}, + {0,0,0,0,0, -1}, + {0,0,0,0,0, -1}, + {0,0,0,0,0, -1}, + {0,0,0,0,0, -1}, + {0,0,0,0,0, -1}, + {0,0,0,0,0, -1}, + {0,0,0,0,0, -1}, + {0,0,0,0,0, -1}, + {0,0,0,0,0, -1}, + {0,0,0,0,0, -1}, + {0,0,0,0,0, -1}, + {0,0,0,0,0, -1}, + {0,0,0,0,0, -1}, + {0,0,0,0,0, -1}, + {0,0,0,0,0, -1}, + {0,0,0,0,0, -1}, + {0,0,0,0,0, -1}, + {0, 0, 0, 0, 3, -1}, + {1, 8, -1, 2, 3, 690}, + {5, 8, 0, 1, 6, 698}, + {5, 8, 0, 0, 6, 706}, + {4, 6, 0, -1, 5, 714}, + {5, 8, 0, 0, 6, 720}, + {1, 10, -1, 2, 3, 728}, + {5, 10, 0, 2, 6, 738}, + {3, 1, 0, -7, 3, 748}, + {7, 7, -1, 0, 9, 749}, + {3, 5, 0, -3, 4, 756}, + {5, 5, 0, 0, 6, 761}, + {5, 3, -1, -2, 7, 766}, + {3, 1, 0, -3, 4, 769}, + {7, 7, -1, 0, 9, 770}, + {3, 1, 0, -7, 3, 777}, + {4, 4, 0, -3, 4, 778}, + {5, 7, 0, 0, 6, 782}, + {3, 4, 0, -3, 3, 789}, + {3, 4, 0, -3, 3, 793}, + {2, 2, 0, -6, 3, 797}, + {4, 8, 0, 2, 5, 799}, + {6, 10, 0, 2, 6, 807}, + {2, 1, 0, -3, 3, 817}, + {2, 2, 0, 2, 3, 818}, + {2, 4, 0, -3, 3, 820}, + {3, 5, 0, -3, 4, 824}, + {5, 5, 0, 0, 6, 829}, + {9, 8, 0, 0, 9, 834}, + {8, 8, 0, 0, 9, 850}, + {9, 8, 0, 0, 9, 858}, + {4, 8, -1, 2, 6, 874}, + {7, 11, 0, 0, 7, 882}, + {7, 11, 0, 0, 7, 893}, + {7, 11, 0, 0, 7, 904}, + {7, 11, 0, 0, 7, 915}, + {7, 10, 0, 0, 7, 926}, + {7, 11, 0, 0, 7, 936}, + {9, 8, 0, 0, 10, 947}, + {6, 10, -1, 2, 8, 963}, + {5, 11, -1, 0, 7, 973}, + {5, 11, -1, 0, 7, 984}, + {5, 11, -1, 0, 7, 995}, + {5, 10, -1, 0, 7, 1006}, + {2, 11, 0, 0, 3, 1016}, + {2, 11, -1, 0, 3, 1027}, + {3, 11, 0, 0, 3, 1038}, + {3, 10, 0, 0, 3, 1049}, + {7, 8, 0, 0, 8, 1059}, + {6, 11, -1, 0, 8, 1067}, + {6, 11, -1, 0, 8, 1078}, + {6, 11, -1, 0, 8, 1089}, + {6, 11, -1, 0, 8, 1100}, + {6, 11, -1, 0, 8, 1111}, + {6, 10, -1, 0, 8, 1122}, + {5, 5, 0, -1, 6, 1132}, + {6, 10, -1, 1, 8, 1137}, + {6, 11, -1, 0, 8, 1147}, + {6, 11, -1, 0, 8, 1158}, + {6, 11, -1, 0, 8, 1169}, + {6, 10, -1, 0, 8, 1180}, + {7, 11, 0, 0, 7, 1190}, + {5, 8, -1, 0, 7, 1201}, + {4, 8, 0, 0, 5, 1209}, + {5, 9, 0, 0, 5, 1217}, + {5, 9, 0, 0, 5, 1226}, + {5, 9, 0, 0, 5, 1235}, + {5, 9, 0, 0, 5, 1244}, + {5, 8, 0, 0, 5, 1253}, + {5, 9, 0, 0, 5, 1261}, + {7, 6, 0, 0, 8, 1270}, + {4, 8, 0, 2, 5, 1276}, + {4, 9, 0, 0, 5, 1284}, + {4, 9, 0, 0, 5, 1293}, + {4, 9, 0, 0, 5, 1302}, + {4, 8, 0, 0, 5, 1311}, + {2, 9, 1, 0, 2, 1319}, + {2, 9, 0, 0, 2, 1328}, + {3, 9, 1, 0, 2, 1337}, + {3, 8, 0, 0, 2, 1346}, + {5, 9, 0, 0, 6, 1354}, + {4, 9, 0, 0, 5, 1363}, + {5, 9, 0, 0, 6, 1372}, + {5, 9, 0, 0, 6, 1381}, + {5, 9, 0, 0, 6, 1390}, + {5, 9, 0, 0, 6, 1399}, + {5, 8, 0, 0, 6, 1408}, + {5, 5, 0, -1, 6, 1416}, + {6, 6, 0, 0, 6, 1421}, + {4, 9, 0, 0, 5, 1427}, + {4, 9, 0, 0, 5, 1436}, + {4, 9, 0, 0, 5, 1445}, + {4, 8, 0, 0, 5, 1454}, + {4, 11, 0, 2, 5, 1462}, + {5, 10, 0, 2, 6, 1473}, + {4, 10, 0, 2, 5, 1483}, + }, + bitmap_data +}; + +#endif + diff --git a/BulletPhysics/bulletTrunk/Demos/OpenGL/CMakeLists.txt b/BulletPhysics/bulletTrunk/Demos/OpenGL/CMakeLists.txt new file mode 100644 index 00000000..3c61db6d --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/OpenGL/CMakeLists.txt @@ -0,0 +1,34 @@ +# This is basically the overall name of the project in Visual Studio this is the name of the Solution File + + +# For every executable you have with a main method you should have an add_executable line below. +# For every add executable line you should list every .cpp and .h file you have associated with that executable. + + + + +# You shouldn't have to modify anything below this line +######################################################## + + + + +INCLUDE_DIRECTORIES( +${BULLET_PHYSICS_SOURCE_DIR}/src ${BULLET_PHYSICS_SOURCE_DIR}/Extras/ConvexHull } +) + +ADD_LIBRARY(OpenGLSupport + BMF_Api.cpp + BMF_BitmapFont.cpp + BMF_font_helv10.cpp + GL_ShapeDrawer.cpp + GL_Simplex1to4.cpp + GLDebugDrawer.cpp + GlutStuff.cpp + RenderTexture.cpp + DemoApplication.cpp +) + +IF (BUILD_SHARED_LIBS) + TARGET_LINK_LIBRARIES(OpenGLSupport BulletDynamics BulletCollision ${GLUT_glut_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY}) +ENDIF (BUILD_SHARED_LIBS) diff --git a/BulletPhysics/bulletTrunk/Demos/OpenGL/DebugCastResult.h b/BulletPhysics/bulletTrunk/Demos/OpenGL/DebugCastResult.h new file mode 100644 index 00000000..ef3befe4 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/OpenGL/DebugCastResult.h @@ -0,0 +1,88 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef DEBUG_CAST_RESULT_H +#define DEBUG_CAST_RESULT_H + +#include "BulletCollision/NarrowPhaseCollision/btConvexCast.h" +#include "LinearMath/btTransform.h" +#include "GL_ShapeDrawer.h" +#include "GlutStuff.h" +#ifdef WIN32 +#include +#endif +//think different +#if defined(__APPLE__) && !defined (VMDMESA) +#include +#include +#else +#include +#endif +struct btDebugCastResult : public btConvexCast::CastResult +{ + + btTransform m_fromTrans; + const btPolyhedralConvexShape* m_shape; + btVector3 m_linVel; + btVector3 m_angVel; + GL_ShapeDrawer* m_shapeDrawer; + + btDebugCastResult(const btTransform& fromTrans,const btPolyhedralConvexShape* shape, + const btVector3& linVel,const btVector3& angVel,GL_ShapeDrawer* drawer) + :m_fromTrans(fromTrans), + m_shape(shape), + m_linVel(linVel), + m_angVel(angVel), + m_shapeDrawer(drawer) + { + } + + virtual void drawCoordSystem(const btTransform& tr) + { + btScalar m[16]; + tr.getOpenGLMatrix(m); + glPushMatrix(); + btglLoadMatrix(m); + glBegin(GL_LINES); + btglColor3(1, 0, 0); + btglVertex3(0, 0, 0); + btglVertex3(1, 0, 0); + btglColor3(0, 1, 0); + btglVertex3(0, 0, 0); + btglVertex3(0, 1, 0); + btglColor3(0, 0, 1); + btglVertex3(0, 0, 0); + btglVertex3(0, 0, 1); + glEnd(); + glPopMatrix(); + } + + virtual void DebugDraw(btScalar fraction) + { + btVector3 worldBoundsMin(-1000,-1000,-1000); + btVector3 worldBoundsMax(1000,1000,1000); + + + btScalar m[16]; + btTransform hitTrans; + btTransformUtil::integrateTransform(m_fromTrans,m_linVel,m_angVel,fraction,hitTrans); + hitTrans.getOpenGLMatrix(m); + if (m_shapeDrawer) + m_shapeDrawer->drawOpenGL(m,m_shape,btVector3(1,0,0),btIDebugDraw::DBG_NoDebug,worldBoundsMin,worldBoundsMax); + } +}; + + +#endif //DEBUG_CAST_RESULT_H diff --git a/BulletPhysics/bulletTrunk/Demos/OpenGL/DemoApplication.cpp b/BulletPhysics/bulletTrunk/Demos/OpenGL/DemoApplication.cpp new file mode 100644 index 00000000..2aa7ef0c --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/OpenGL/DemoApplication.cpp @@ -0,0 +1,1328 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + + +#include "DemoApplication.h" +#include "LinearMath/btIDebugDraw.h" +#include "BulletDynamics/Dynamics/btDynamicsWorld.h" + +#include "BulletDynamics/ConstraintSolver/btPoint2PointConstraint.h"//picking +#include "BulletCollision/CollisionShapes/btCollisionShape.h" +#include "BulletCollision/CollisionShapes/btBoxShape.h" +#include "BulletCollision/CollisionShapes/btSphereShape.h" +#include "BulletCollision/CollisionShapes/btCompoundShape.h" +#include "BulletCollision/CollisionShapes/btUniformScalingShape.h" +#include "BulletDynamics/ConstraintSolver/btConstraintSolver.h" +#include "GL_ShapeDrawer.h" +#include "LinearMath/btQuickprof.h" +#include "LinearMath/btDefaultMotionState.h" + + +#include "BMF_Api.h" + +extern bool gDisableDeactivation; +int numObjects = 0; +const int maxNumObjects = 16384; +btTransform startTransforms[maxNumObjects]; +btCollisionShape* gShapePtr[maxNumObjects];//1 rigidbody has 1 shape (no re-use of shapes) +#define SHOW_NUM_DEEP_PENETRATIONS 1 + +extern int gNumClampedCcdMotions; + +#ifdef SHOW_NUM_DEEP_PENETRATIONS +extern int gNumDeepPenetrationChecks; + +extern int gNumSplitImpulseRecoveries; +extern int gNumGjkChecks; +extern int gNumAlignedAllocs; +extern int gNumAlignedFree; +extern int gTotalBytesAlignedAllocs; + +#endif // + + +DemoApplication::DemoApplication() +//see btIDebugDraw.h for modes +: +m_dynamicsWorld(0), +m_pickConstraint(0), +m_shootBoxShape(0), +m_cameraDistance(15.0), +m_debugMode(0), +m_ele(20.f), +m_azi(0.f), +m_cameraPosition(0.f,0.f,0.f), +m_cameraTargetPosition(0.f,0.f,0.f), +m_scaleBottom(0.5f), +m_scaleFactor(2.f), +m_cameraUp(0,1,0), +m_forwardAxis(2), +m_glutScreenWidth(0), +m_glutScreenHeight(0), +m_ShootBoxInitialSpeed(40.f), +m_stepping(true), +m_singleStep(false), +m_idle(false), +m_enableshadows(false), +m_sundirection(btVector3(1,-2,1)*1000) +{ +#ifndef BT_NO_PROFILE + m_profileIterator = CProfileManager::Get_Iterator(); +#endif //BT_NO_PROFILE + + m_shapeDrawer = new GL_ShapeDrawer (); + m_shapeDrawer->enableTexture(true); + m_enableshadows = false; +} + + + +DemoApplication::~DemoApplication() +{ +#ifndef BT_NO_PROFILE + CProfileManager::Release_Iterator(m_profileIterator); +#endif //BT_NO_PROFILE + + if (m_shootBoxShape) + delete m_shootBoxShape; + + if (m_shapeDrawer) + delete m_shapeDrawer; +} + + +void DemoApplication::overrideGLShapeDrawer (GL_ShapeDrawer* shapeDrawer) +{ + shapeDrawer->enableTexture (m_shapeDrawer->hasTextureEnabled()); + delete m_shapeDrawer; + m_shapeDrawer = shapeDrawer; +} + +void DemoApplication::myinit(void) +{ + + GLfloat light_ambient[] = { 0.2, 0.2, 0.2, 1.0 }; + GLfloat light_diffuse[] = { 1.0, 1.0, 1.0, 1.0 }; + GLfloat light_specular[] = { 1.0, 1.0, 1.0, 1.0 }; + /* light_position is NOT default value */ + GLfloat light_position0[] = { 1.0, 10.0, 1.0, 0.0 }; + GLfloat light_position1[] = { -1.0, -10.0, -1.0, 0.0 }; + + glLightfv(GL_LIGHT0, GL_AMBIENT, light_ambient); + glLightfv(GL_LIGHT0, GL_DIFFUSE, light_diffuse); + glLightfv(GL_LIGHT0, GL_SPECULAR, light_specular); + glLightfv(GL_LIGHT0, GL_POSITION, light_position0); + + glLightfv(GL_LIGHT1, GL_AMBIENT, light_ambient); + glLightfv(GL_LIGHT1, GL_DIFFUSE, light_diffuse); + glLightfv(GL_LIGHT1, GL_SPECULAR, light_specular); + glLightfv(GL_LIGHT1, GL_POSITION, light_position1); + + glEnable(GL_LIGHTING); + glEnable(GL_LIGHT0); + glEnable(GL_LIGHT1); + + + glShadeModel(GL_SMOOTH); + glEnable(GL_DEPTH_TEST); + glDepthFunc(GL_LESS); + + glClearColor(0.7,0.7,0.7,0); + + // glEnable(GL_CULL_FACE); + // glCullFace(GL_BACK); +} + + +void DemoApplication::setCameraDistance(float dist) +{ + m_cameraDistance = dist; +} + +float DemoApplication::getCameraDistance() +{ + return m_cameraDistance; +} + + + +void DemoApplication::toggleIdle() { + if (m_idle) { + m_idle = false; + } + else { + m_idle = true; + } +} + + + + +void DemoApplication::updateCamera() { + + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + float rele = m_ele * 0.01745329251994329547;// rads per deg + float razi = m_azi * 0.01745329251994329547;// rads per deg + + + btQuaternion rot(m_cameraUp,razi); + + + btVector3 eyePos(0,0,0); + eyePos[m_forwardAxis] = -m_cameraDistance; + + btVector3 forward(eyePos[0],eyePos[1],eyePos[2]); + if (forward.length2() < SIMD_EPSILON) + { + forward.setValue(1.f,0.f,0.f); + } + btVector3 right = m_cameraUp.cross(forward); + btQuaternion roll(right,-rele); + + eyePos = btMatrix3x3(rot) * btMatrix3x3(roll) * eyePos; + + m_cameraPosition[0] = eyePos.getX(); + m_cameraPosition[1] = eyePos.getY(); + m_cameraPosition[2] = eyePos.getZ(); + m_cameraPosition += m_cameraTargetPosition; + + if (m_glutScreenWidth == 0 && m_glutScreenHeight == 0) + return; + + if (m_glutScreenWidth > m_glutScreenHeight) + { + btScalar aspect = m_glutScreenWidth / (btScalar)m_glutScreenHeight; + glFrustum (-aspect, aspect, -1.0, 1.0, 1.0, 10000.0); + } else + { + btScalar aspect = m_glutScreenHeight / (btScalar)m_glutScreenWidth; + glFrustum (-1.0, 1.0, -aspect, aspect, 1.0, 10000.0); + } + + + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + gluLookAt(m_cameraPosition[0], m_cameraPosition[1], m_cameraPosition[2], + m_cameraTargetPosition[0], m_cameraTargetPosition[1], m_cameraTargetPosition[2], + m_cameraUp.getX(),m_cameraUp.getY(),m_cameraUp.getZ()); +} + + + +const float STEPSIZE = 5; + +void DemoApplication::stepLeft() +{ + m_azi -= STEPSIZE; if (m_azi < 0) m_azi += 360; updateCamera(); +} +void DemoApplication::stepRight() +{ + m_azi += STEPSIZE; if (m_azi >= 360) m_azi -= 360; updateCamera(); +} +void DemoApplication::stepFront() +{ + m_ele += STEPSIZE; if (m_ele >= 360) m_ele -= 360; updateCamera(); +} +void DemoApplication::stepBack() +{ + m_ele -= STEPSIZE; if (m_ele < 0) m_ele += 360; updateCamera(); +} +void DemoApplication::zoomIn() +{ + m_cameraDistance -= 0.4; updateCamera(); + if (m_cameraDistance < 0.1) + m_cameraDistance = 0.1; + +} +void DemoApplication::zoomOut() +{ + m_cameraDistance += 0.4; updateCamera(); + +} + + + + + + + + + + +void DemoApplication::reshape(int w, int h) +{ + m_glutScreenWidth = w; + m_glutScreenHeight = h; + + glViewport(0, 0, w, h); + updateCamera(); +} + + +void DemoApplication::keyboardCallback(unsigned char key, int x, int y) +{ + (void)x; + (void)y; + + m_lastKey = 0; + +#ifndef BT_NO_PROFILE + if (key >= 0x31 && key <= 0x39) + { + int child = key-0x31; + m_profileIterator->Enter_Child(child); + } + if (key==0x30) + { + m_profileIterator->Enter_Parent(); + } +#endif //BT_NO_PROFILE + + switch (key) + { + case 'q' : +#ifdef BT_USE_FREEGLUT + //return from glutMainLoop(), detect memory leaks etc. + glutLeaveMainLoop(); +#else + exit(0); +#endif + break; + + case 'l' : stepLeft(); break; + case 'r' : stepRight(); break; + case 'f' : stepFront(); break; + case 'b' : stepBack(); break; + case 'z' : zoomIn(); break; + case 'x' : zoomOut(); break; + case 'i' : toggleIdle(); break; + case 'g' : m_enableshadows=!m_enableshadows;break; + case 'u' : m_shapeDrawer->enableTexture(!m_shapeDrawer->enableTexture(false));break; + case 'h': + if (m_debugMode & btIDebugDraw::DBG_NoHelpText) + m_debugMode = m_debugMode & (~btIDebugDraw::DBG_NoHelpText); + else + m_debugMode |= btIDebugDraw::DBG_NoHelpText; + break; + + case 'w': + if (m_debugMode & btIDebugDraw::DBG_DrawWireframe) + m_debugMode = m_debugMode & (~btIDebugDraw::DBG_DrawWireframe); + else + m_debugMode |= btIDebugDraw::DBG_DrawWireframe; + break; + + case 'p': + if (m_debugMode & btIDebugDraw::DBG_ProfileTimings) + m_debugMode = m_debugMode & (~btIDebugDraw::DBG_ProfileTimings); + else + m_debugMode |= btIDebugDraw::DBG_ProfileTimings; + break; + + case 'm': + if (m_debugMode & btIDebugDraw::DBG_EnableSatComparison) + m_debugMode = m_debugMode & (~btIDebugDraw::DBG_EnableSatComparison); + else + m_debugMode |= btIDebugDraw::DBG_EnableSatComparison; + break; + + case 'n': + if (m_debugMode & btIDebugDraw::DBG_DisableBulletLCP) + m_debugMode = m_debugMode & (~btIDebugDraw::DBG_DisableBulletLCP); + else + m_debugMode |= btIDebugDraw::DBG_DisableBulletLCP; + break; + + case 't' : + if (m_debugMode & btIDebugDraw::DBG_DrawText) + m_debugMode = m_debugMode & (~btIDebugDraw::DBG_DrawText); + else + m_debugMode |= btIDebugDraw::DBG_DrawText; + break; + case 'y': + if (m_debugMode & btIDebugDraw::DBG_DrawFeaturesText) + m_debugMode = m_debugMode & (~btIDebugDraw::DBG_DrawFeaturesText); + else + m_debugMode |= btIDebugDraw::DBG_DrawFeaturesText; + break; + case 'a': + if (m_debugMode & btIDebugDraw::DBG_DrawAabb) + m_debugMode = m_debugMode & (~btIDebugDraw::DBG_DrawAabb); + else + m_debugMode |= btIDebugDraw::DBG_DrawAabb; + break; + case 'c' : + if (m_debugMode & btIDebugDraw::DBG_DrawContactPoints) + m_debugMode = m_debugMode & (~btIDebugDraw::DBG_DrawContactPoints); + else + m_debugMode |= btIDebugDraw::DBG_DrawContactPoints; + break; + case 'C' : + if (m_debugMode & btIDebugDraw::DBG_DrawConstraints) + m_debugMode = m_debugMode & (~btIDebugDraw::DBG_DrawConstraints); + else + m_debugMode |= btIDebugDraw::DBG_DrawConstraints; + break; + case 'L' : + if (m_debugMode & btIDebugDraw::DBG_DrawConstraintLimits) + m_debugMode = m_debugMode & (~btIDebugDraw::DBG_DrawConstraintLimits); + else + m_debugMode |= btIDebugDraw::DBG_DrawConstraintLimits; + break; + + case 'd' : + if (m_debugMode & btIDebugDraw::DBG_NoDeactivation) + m_debugMode = m_debugMode & (~btIDebugDraw::DBG_NoDeactivation); + else + m_debugMode |= btIDebugDraw::DBG_NoDeactivation; + if (m_debugMode & btIDebugDraw::DBG_NoDeactivation) + { + gDisableDeactivation = true; + } else + { + gDisableDeactivation = false; + } + break; + + + + + case 'o' : + { + m_stepping = !m_stepping; + break; + } + case 's' : clientMoveAndDisplay(); break; + // case ' ' : newRandom(); break; + case ' ': + clientResetScene(); + break; + case '1': + { + if (m_debugMode & btIDebugDraw::DBG_EnableCCD) + m_debugMode = m_debugMode & (~btIDebugDraw::DBG_EnableCCD); + else + m_debugMode |= btIDebugDraw::DBG_EnableCCD; + break; + } + + case '.': + { + shootBox(getRayTo(x,y));//getCameraTargetPosition()); + break; + } + + case '+': + { + m_ShootBoxInitialSpeed += 10.f; + break; + } + case '-': + { + m_ShootBoxInitialSpeed -= 10.f; + break; + } + + default: + // std::cout << "unused key : " << key << std::endl; + break; + } + + if (getDynamicsWorld() && getDynamicsWorld()->getDebugDrawer()) + getDynamicsWorld()->getDebugDrawer()->setDebugMode(m_debugMode); + + glutPostRedisplay(); + +} + +void DemoApplication::setDebugMode(int mode) +{ + m_debugMode = mode; + if (getDynamicsWorld() && getDynamicsWorld()->getDebugDrawer()) + getDynamicsWorld()->getDebugDrawer()->setDebugMode(mode); +} + + +void DemoApplication::specialKeyboardUp(int key, int x, int y) +{ + + glutPostRedisplay(); + +} + +void DemoApplication::specialKeyboard(int key, int x, int y) +{ + (void)x; + (void)y; + + switch (key) + { + case GLUT_KEY_F1: + { + + break; + } + + case GLUT_KEY_F2: + { + + break; + } + + + case GLUT_KEY_END: + { + int numObj = getDynamicsWorld()->getNumCollisionObjects(); + if (numObj) + { + btCollisionObject* obj = getDynamicsWorld()->getCollisionObjectArray()[numObj-1]; + + getDynamicsWorld()->removeCollisionObject(obj); + btRigidBody* body = btRigidBody::upcast(obj); + if (body && body->getMotionState()) + { + delete body->getMotionState(); + } + delete obj; + + + } + break; + } + case GLUT_KEY_LEFT : stepLeft(); break; + case GLUT_KEY_RIGHT : stepRight(); break; + case GLUT_KEY_UP : stepFront(); break; + case GLUT_KEY_DOWN : stepBack(); break; + case GLUT_KEY_PAGE_UP : zoomIn(); break; + case GLUT_KEY_PAGE_DOWN : zoomOut(); break; + case GLUT_KEY_HOME : toggleIdle(); break; + default: + // std::cout << "unused (special) key : " << key << std::endl; + break; + } + + glutPostRedisplay(); + +} + + + +void DemoApplication::moveAndDisplay() +{ + if (!m_idle) + clientMoveAndDisplay(); +} + + + + +void DemoApplication::displayCallback() +{ +} + + +void DemoApplication::setShootBoxShape () +{ + if (!m_shootBoxShape) + { + //#define TEST_UNIFORM_SCALING_SHAPE 1 +#ifdef TEST_UNIFORM_SCALING_SHAPE + btConvexShape* childShape = new btBoxShape(btVector3(1.f,1.f,1.f)); + m_shootBoxShape = new btUniformScalingShape(childShape,0.5f); +#else + m_shootBoxShape = new btBoxShape(btVector3(.5f,.5f,.5f)); +#endif// + } +} + +void DemoApplication::shootBox(const btVector3& destination) +{ + + if (m_dynamicsWorld) + { + float mass = 1.f; + btTransform startTransform; + startTransform.setIdentity(); + btVector3 camPos = getCameraPosition(); + startTransform.setOrigin(camPos); + + setShootBoxShape (); + + btRigidBody* body = this->localCreateRigidBody(mass, startTransform,m_shootBoxShape); + body->setLinearFactor(btVector3(1,1,1)); + + btVector3 linVel(destination[0]-camPos[0],destination[1]-camPos[1],destination[2]-camPos[2]); + linVel.normalize(); + linVel*=m_ShootBoxInitialSpeed; + + body->getWorldTransform().setOrigin(camPos); + body->getWorldTransform().setRotation(btQuaternion(0,0,0,1)); + body->setLinearVelocity(linVel); + body->setAngularVelocity(btVector3(0,0,0)); + body->setCcdMotionThreshold(1.); + body->setCcdSweptSphereRadius(0.2f); + + } + +} + + +int gPickingConstraintId = 0; +btVector3 gOldPickingPos; +float gOldPickingDist = 0.f; +btRigidBody* pickedBody = 0;//for deactivation state + + +btVector3 DemoApplication::getRayTo(int x,int y) +{ + + float top = 1.f; + float bottom = -1.f; + float nearPlane = 1.f; + float tanFov = (top-bottom)*0.5f / nearPlane; + float fov = 2.0 * atanf (tanFov); + + btVector3 rayFrom = getCameraPosition(); + btVector3 rayForward = (getCameraTargetPosition()-getCameraPosition()); + rayForward.normalize(); + float farPlane = 10000.f; + rayForward*= farPlane; + + btVector3 rightOffset; + btVector3 vertical = m_cameraUp; + + btVector3 hor; + hor = rayForward.cross(vertical); + hor.normalize(); + vertical = hor.cross(rayForward); + vertical.normalize(); + + float tanfov = tanf(0.5f*fov); + + btScalar aspect = m_glutScreenHeight / (btScalar)m_glutScreenWidth; + + hor *= 2.f * farPlane * tanfov; + vertical *= 2.f * farPlane * tanfov; + + if (aspect<1) + { + hor/=aspect; + } else + { + vertical*=aspect; + } + + btVector3 rayToCenter = rayFrom + rayForward; + btVector3 dHor = hor * 1.f/float(m_glutScreenWidth); + btVector3 dVert = vertical * 1.f/float(m_glutScreenHeight); + + + btVector3 rayTo = rayToCenter - 0.5f * hor + 0.5f * vertical; + rayTo += x * dHor; + rayTo -= y * dVert; + return rayTo; +} + +btScalar mousePickClamping = 30.f; + + +void DemoApplication::mouseFunc(int button, int state, int x, int y) +{ + //printf("button %i, state %i, x=%i,y=%i\n",button,state,x,y); + //button 0, state 0 means left mouse down + + btVector3 rayTo = getRayTo(x,y); + + switch (button) + { + case 2: + { + if (state==0) + { + + shootBox(rayTo); + } + break; + }; + case 1: + { + + + if (state==0) + { + + + //apply an impulse + if (m_dynamicsWorld) + { + btCollisionWorld::ClosestRayResultCallback rayCallback(m_cameraPosition,rayTo); + m_dynamicsWorld->rayTest(m_cameraPosition,rayTo,rayCallback); + if (rayCallback.hasHit()) + { + + btRigidBody* body = btRigidBody::upcast(rayCallback.m_collisionObject); + if (body) + { + body->setActivationState(ACTIVE_TAG); + btVector3 impulse = rayTo; + impulse.normalize(); + float impulseStrength = 10.f; + impulse *= impulseStrength; + btVector3 relPos = rayCallback.m_hitPointWorld - body->getCenterOfMassPosition(); + body->applyImpulse(impulse,relPos); + } + } + } + + + + } else + { + + } + break; + } + case 0: + { + if (state==0) + { + + + //add a point to point constraint for picking + if (m_dynamicsWorld) + { + btCollisionWorld::ClosestRayResultCallback rayCallback(m_cameraPosition,rayTo); + m_dynamicsWorld->rayTest(m_cameraPosition,rayTo,rayCallback); + if (rayCallback.hasHit()) + { + + + btRigidBody* body = btRigidBody::upcast(rayCallback.m_collisionObject); + if (body) + { + //other exclusions? + if (!(body->isStaticObject() || body->isKinematicObject())) + { + pickedBody = body; + pickedBody->setActivationState(DISABLE_DEACTIVATION); + + + btVector3 pickPos = rayCallback.m_hitPointWorld; + + btVector3 localPivot = body->getCenterOfMassTransform().inverse() * pickPos; + + btPoint2PointConstraint* p2p = new btPoint2PointConstraint(*body,localPivot); + p2p->m_setting.m_impulseClamp = mousePickClamping; + + m_dynamicsWorld->addConstraint(p2p); + m_pickConstraint = p2p; + + //save mouse position for dragging + gOldPickingPos = rayTo; + + btVector3 eyePos(m_cameraPosition[0],m_cameraPosition[1],m_cameraPosition[2]); + + gOldPickingDist = (pickPos-eyePos).length(); + + //very weak constraint for picking + p2p->m_setting.m_tau = 0.1f; + } + } + } + } + + } else + { + + if (m_pickConstraint && m_dynamicsWorld) + { + m_dynamicsWorld->removeConstraint(m_pickConstraint); + delete m_pickConstraint; + //printf("removed constraint %i",gPickingConstraintId); + m_pickConstraint = 0; + pickedBody->forceActivationState(ACTIVE_TAG); + pickedBody->setDeactivationTime( 0.f ); + pickedBody = 0; + } + + + } + + break; + + } + default: + { + } + } + +} + +void DemoApplication::mouseMotionFunc(int x,int y) +{ + + if (m_pickConstraint) + { + //move the constraint pivot + btPoint2PointConstraint* p2p = static_cast(m_pickConstraint); + if (p2p) + { + //keep it at the same picking distance + + btVector3 newRayTo = getRayTo(x,y); + btVector3 eyePos(m_cameraPosition[0],m_cameraPosition[1],m_cameraPosition[2]); + btVector3 dir = newRayTo-eyePos; + dir.normalize(); + dir *= gOldPickingDist; + + btVector3 newPos = eyePos + dir; + p2p->setPivotB(newPos); + } + + } + + +} + + + +btRigidBody* DemoApplication::localCreateRigidBody(float mass, const btTransform& startTransform,btCollisionShape* shape) +{ + btAssert((!shape || shape->getShapeType() != INVALID_SHAPE_PROXYTYPE)); + + //rigidbody is dynamic if and only if mass is non zero, otherwise static + bool isDynamic = (mass != 0.f); + + btVector3 localInertia(0,0,0); + if (isDynamic) + shape->calculateLocalInertia(mass,localInertia); + + //using motionstate is recommended, it provides interpolation capabilities, and only synchronizes 'active' objects + +#define USE_MOTIONSTATE 1 +#ifdef USE_MOTIONSTATE + btDefaultMotionState* myMotionState = new btDefaultMotionState(startTransform); + + btRigidBody::btRigidBodyConstructionInfo cInfo(mass,myMotionState,shape,localInertia); + + btRigidBody* body = new btRigidBody(cInfo); + +#else + btRigidBody* body = new btRigidBody(mass,0,shape,localInertia); + body->setWorldTransform(startTransform); +#endif// + + m_dynamicsWorld->addRigidBody(body); + + return body; +} + +//See http://www.lighthouse3d.com/opengl/glut/index.php?bmpfontortho +void DemoApplication::setOrthographicProjection() +{ + + // switch to projection mode + glMatrixMode(GL_PROJECTION); + + // save previous matrix which contains the + //settings for the perspective projection + glPushMatrix(); + // reset matrix + glLoadIdentity(); + // set a 2D orthographic projection + gluOrtho2D(0, m_glutScreenWidth, 0, m_glutScreenHeight); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + + // invert the y axis, down is positive + glScalef(1, -1, 1); + // mover the origin from the bottom left corner + // to the upper left corner + glTranslatef(0, -m_glutScreenHeight, 0); + +} + +void DemoApplication::resetPerspectiveProjection() +{ + + glMatrixMode(GL_PROJECTION); + glPopMatrix(); + glMatrixMode(GL_MODELVIEW); + updateCamera(); +} + + + + +extern CProfileIterator * m_profileIterator; + +void DemoApplication::displayProfileString(int xOffset,int yStart,char* message) +{ + glRasterPos3f(xOffset,yStart,0); + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),message); +} + + +void DemoApplication::showProfileInfo(float& xOffset,float& yStart, float yIncr) +{ +#ifndef BT_NO_PROFILE + + static double time_since_reset = 0.f; + if (!m_idle) + { + time_since_reset = CProfileManager::Get_Time_Since_Reset(); + } + + + { + //recompute profiling data, and store profile strings + + char blockTime[128]; + + double totalTime = 0; + + int frames_since_reset = CProfileManager::Get_Frame_Count_Since_Reset(); + + m_profileIterator->First(); + + double parent_time = m_profileIterator->Is_Root() ? time_since_reset : m_profileIterator->Get_Current_Parent_Total_Time(); + + { + sprintf(blockTime,"--- Profiling: %s (total running time: %.3f ms) ---", m_profileIterator->Get_Current_Parent_Name(), parent_time ); + displayProfileString(xOffset,yStart,blockTime); + yStart += yIncr; + sprintf(blockTime,"press number (1,2...) to display child timings, or 0 to go up to parent" ); + displayProfileString(xOffset,yStart,blockTime); + yStart += yIncr; + + } + + + double accumulated_time = 0.f; + + for (int i = 0; !m_profileIterator->Is_Done(); m_profileIterator->Next()) + { + double current_total_time = m_profileIterator->Get_Current_Total_Time(); + accumulated_time += current_total_time; + double fraction = parent_time > SIMD_EPSILON ? (current_total_time / parent_time) * 100 : 0.f; + + sprintf(blockTime,"%d -- %s (%.2f %%) :: %.3f ms / frame (%d calls)", + ++i, m_profileIterator->Get_Current_Name(), fraction, + (current_total_time / (double)frames_since_reset),m_profileIterator->Get_Current_Total_Calls()); + displayProfileString(xOffset,yStart,blockTime); + yStart += yIncr; + totalTime += current_total_time; + } + + sprintf(blockTime,"%s (%.3f %%) :: %.3f ms", "Unaccounted", + // (min(0, time_since_reset - totalTime) / time_since_reset) * 100); + parent_time > SIMD_EPSILON ? ((parent_time - accumulated_time) / parent_time) * 100 : 0.f, parent_time - accumulated_time); + + displayProfileString(xOffset,yStart,blockTime); + yStart += yIncr; + + + + sprintf(blockTime,"-------------------------------------------------"); + displayProfileString(xOffset,yStart,blockTime); + yStart += yIncr; + + } +#endif//BT_NO_PROFILE + + + + +} + + +// +void DemoApplication::renderscene(int pass) +{ + btScalar m[16]; + btMatrix3x3 rot;rot.setIdentity(); + const int numObjects=m_dynamicsWorld->getNumCollisionObjects(); + btVector3 wireColor(1,0,0); + for(int i=0;igetCollisionObjectArray()[i]; + btRigidBody* body=btRigidBody::upcast(colObj); + if(body&&body->getMotionState()) + { + btDefaultMotionState* myMotionState = (btDefaultMotionState*)body->getMotionState(); + myMotionState->m_graphicsWorldTrans.getOpenGLMatrix(m); + rot=myMotionState->m_graphicsWorldTrans.getBasis(); + } + else + { + colObj->getWorldTransform().getOpenGLMatrix(m); + rot=colObj->getWorldTransform().getBasis(); + } + btVector3 wireColor(1.f,1.0f,0.5f); //wants deactivation + if(i&1) wireColor=btVector3(0.f,0.0f,1.f); + ///color differently for active, sleeping, wantsdeactivation states + if (colObj->getActivationState() == 1) //active + { + if (i & 1) + { + wireColor += btVector3 (1.f,0.f,0.f); + } + else + { + wireColor += btVector3 (.5f,0.f,0.f); + } + } + if(colObj->getActivationState()==2) //ISLAND_SLEEPING + { + if(i&1) + { + wireColor += btVector3 (0.f,1.f, 0.f); + } + else + { + wireColor += btVector3 (0.f,0.5f,0.f); + } + } + + btVector3 aabbMin,aabbMax; + m_dynamicsWorld->getBroadphase()->getBroadphaseAabb(aabbMin,aabbMax); + + aabbMin-=btVector3(1e30,1e30,1e30); + aabbMax+=btVector3(1e30,1e30,1e30); +// printf("aabbMin=(%f,%f,%f)\n",aabbMin.getX(),aabbMin.getY(),aabbMin.getZ()); +// printf("aabbMax=(%f,%f,%f)\n",aabbMax.getX(),aabbMax.getY(),aabbMax.getZ()); +// m_dynamicsWorld->getDebugDrawer()->drawAabb(aabbMin,aabbMax,btVector3(1,1,1)); + + + switch(pass) + { + case 0: m_shapeDrawer->drawOpenGL(m,colObj->getCollisionShape(),wireColor,getDebugMode(),aabbMin,aabbMax);break; + case 1: m_shapeDrawer->drawShadow(m,m_sundirection*rot,colObj->getCollisionShape(),aabbMin,aabbMax);break; + case 2: m_shapeDrawer->drawOpenGL(m,colObj->getCollisionShape(),wireColor*0.3,0,aabbMin,aabbMax);break; + } + } +} + +// +void DemoApplication::renderme() +{ + myinit(); + + updateCamera(); + + if (m_dynamicsWorld) + { + if(m_enableshadows) + { + glClear(GL_STENCIL_BUFFER_BIT); + glEnable(GL_CULL_FACE); + renderscene(0); + + glDisable(GL_LIGHTING); + glDepthMask(GL_FALSE); + glDepthFunc(GL_LEQUAL); + glEnable(GL_STENCIL_TEST); + glColorMask(GL_FALSE,GL_FALSE,GL_FALSE,GL_FALSE); + glStencilFunc(GL_ALWAYS,1,0xFFFFFFFFL); + glFrontFace(GL_CCW); + glStencilOp(GL_KEEP,GL_KEEP,GL_INCR); + renderscene(1); + glFrontFace(GL_CW); + glStencilOp(GL_KEEP,GL_KEEP,GL_DECR); + renderscene(1); + glFrontFace(GL_CCW); + + glPolygonMode(GL_FRONT,GL_FILL); + glPolygonMode(GL_BACK,GL_FILL); + glShadeModel(GL_SMOOTH); + glEnable(GL_DEPTH_TEST); + glDepthFunc(GL_LESS); + glEnable(GL_LIGHTING); + glDepthMask(GL_TRUE); + glCullFace(GL_BACK); + glFrontFace(GL_CCW); + glEnable(GL_CULL_FACE); + glColorMask(GL_TRUE,GL_TRUE,GL_TRUE,GL_TRUE); + + glDepthFunc(GL_LEQUAL); + glStencilFunc( GL_NOTEQUAL, 0, 0xFFFFFFFFL ); + glStencilOp( GL_KEEP, GL_KEEP, GL_KEEP ); + glDisable(GL_LIGHTING); + renderscene(2); + glEnable(GL_LIGHTING); + glDepthFunc(GL_LESS); + glDisable(GL_STENCIL_TEST); + glDisable(GL_CULL_FACE); + } + else + { + glDisable(GL_CULL_FACE); + renderscene(0); + } + + float xOffset = 10.f; + float yStart = 20.f; + float yIncr = 20.f; + char buf[124]; + + glDisable(GL_LIGHTING); + glColor3f(0, 0, 0); + + if ((m_debugMode & btIDebugDraw::DBG_NoHelpText)==0) + { + setOrthographicProjection(); + + showProfileInfo(xOffset,yStart,yIncr); + +#ifdef USE_QUICKPROF + + + if ( getDebugMode() & btIDebugDraw::DBG_ProfileTimings) + { + static int counter = 0; + counter++; + std::map::iterator iter; + for (iter = btProfiler::mProfileBlocks.begin(); iter != btProfiler::mProfileBlocks.end(); ++iter) + { + char blockTime[128]; + sprintf(blockTime, "%s: %lf",&((*iter).first[0]),btProfiler::getBlockTime((*iter).first, btProfiler::BLOCK_CYCLE_SECONDS));//BLOCK_TOTAL_PERCENT)); + glRasterPos3f(xOffset,yStart,0); + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),blockTime); + yStart += yIncr; + + } + + } +#endif //USE_QUICKPROF + + + glRasterPos3f(xOffset,yStart,0); + sprintf(buf,"mouse to interact"); + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); + yStart += yIncr; + + glRasterPos3f(xOffset,yStart,0); + sprintf(buf,"space to reset"); + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); + yStart += yIncr; + + glRasterPos3f(xOffset,yStart,0); + sprintf(buf,"cursor keys and z,x to navigate"); + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); + yStart += yIncr; + + glRasterPos3f(xOffset,yStart,0); + sprintf(buf,"i to toggle simulation, s single step"); + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); + yStart += yIncr; + + glRasterPos3f(xOffset,yStart,0); + sprintf(buf,"q to quit"); + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); + yStart += yIncr; + + glRasterPos3f(xOffset,yStart,0); + sprintf(buf,". to shoot box"); + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); + yStart += yIncr; + + // not yet hooked up again after refactoring... + + glRasterPos3f(xOffset,yStart,0); + sprintf(buf,"d to toggle deactivation"); + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); + yStart += yIncr; + + + glRasterPos3f(xOffset,yStart,0); + sprintf(buf,"g to toggle mesh animation (ConcaveDemo)"); + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); + yStart += yIncr; + + + glRasterPos3f(xOffset,yStart,0); + sprintf(buf,"h to toggle help text"); + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); + yStart += yIncr; + + + glRasterPos3f(xOffset,yStart,0); + sprintf(buf,"p to toggle profiling (+results to file)"); + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); + yStart += yIncr; + + + //bool useBulletLCP = !(getDebugMode() & btIDebugDraw::DBG_DisableBulletLCP); + //bool useCCD = (getDebugMode() & btIDebugDraw::DBG_EnableCCD); + //glRasterPos3f(xOffset,yStart,0); + //sprintf(buf,"1 CCD mode (adhoc) = %i",useCCD); + //BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); + //yStart += yIncr; + + + glRasterPos3f(xOffset,yStart,0); + sprintf(buf,"+- shooting speed = %10.2f",m_ShootBoxInitialSpeed); + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); + yStart += yIncr; + +#ifdef SHOW_NUM_DEEP_PENETRATIONS + + + glRasterPos3f(xOffset,yStart,0); + sprintf(buf,"gNumDeepPenetrationChecks = %d",gNumDeepPenetrationChecks); + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); + yStart += yIncr; + + glRasterPos3f(xOffset,yStart,0); + sprintf(buf,"gNumGjkChecks= %d",gNumGjkChecks); + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); + yStart += yIncr; + + glRasterPos3f(xOffset,yStart,0); + sprintf(buf,"gNumClampedCcdMotions = %d",gNumClampedCcdMotions); + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); + yStart += yIncr; + + glRasterPos3f(xOffset,yStart,0); + sprintf(buf,"gNumSplitImpulseRecoveries= %d",gNumSplitImpulseRecoveries); + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); + yStart += yIncr; + + glRasterPos3f(xOffset,yStart,0); + sprintf(buf,"gNumAlignedAllocs = %d",gNumAlignedAllocs); + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); + yStart += yIncr; + + glRasterPos3f(xOffset,yStart,0); + sprintf(buf,"gNumAlignedFree= %d",gNumAlignedFree); + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); + yStart += yIncr; + + glRasterPos3f(xOffset,yStart,0); + sprintf(buf,"# alloc-free = %d",gNumAlignedAllocs-gNumAlignedFree); + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); + yStart += yIncr; + + //enable BT_DEBUG_MEMORY_ALLOCATIONS define in Bullet/src/LinearMath/btAlignedAllocator.h for memory leak detection +#ifdef BT_DEBUG_MEMORY_ALLOCATIONS + glRasterPos3f(xOffset,yStart,0); + sprintf(buf,"gTotalBytesAlignedAllocs = %d",gTotalBytesAlignedAllocs); + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); + yStart += yIncr; +#endif //BT_DEBUG_MEMORY_ALLOCATIONS + + if (getDynamicsWorld()) + { + glRasterPos3f(xOffset,yStart,0); + sprintf(buf,"# objects = %d",getDynamicsWorld()->getNumCollisionObjects()); + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); + yStart += yIncr; + glRasterPos3f(xOffset,yStart,0); + sprintf(buf,"# pairs = %d",getDynamicsWorld()->getBroadphase()->getOverlappingPairCache()->getNumOverlappingPairs()); + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); + yStart += yIncr; + + } + + +#endif //SHOW_NUM_DEEP_PENETRATIONS + + resetPerspectiveProjection(); + } + + glEnable(GL_LIGHTING); + + + } + + updateCamera(); + +} +#include "BulletCollision/BroadphaseCollision/btAxisSweep3.h" + +void DemoApplication::clientResetScene() +{ +#ifdef SHOW_NUM_DEEP_PENETRATIONS + gNumDeepPenetrationChecks = 0; + gNumGjkChecks = 0; +#endif //SHOW_NUM_DEEP_PENETRATIONS + + gNumClampedCcdMotions = 0; + int numObjects = 0; + int i; + + if (m_dynamicsWorld) + { + numObjects = m_dynamicsWorld->getNumCollisionObjects(); + } + + ///create a copy of the array, not a reference! + btCollisionObjectArray copyArray = m_dynamicsWorld->getCollisionObjectArray(); + + for (i=0;iremoveRigidBody(body); + } + + + + for (i=0;igetMotionState()) + { + btDefaultMotionState* myMotionState = (btDefaultMotionState*)body->getMotionState(); + myMotionState->m_graphicsWorldTrans = myMotionState->m_startWorldTrans; + body->setCenterOfMassTransform( myMotionState->m_graphicsWorldTrans ); + colObj->setInterpolationWorldTransform( myMotionState->m_startWorldTrans ); + colObj->forceActivationState(ACTIVE_TAG); + colObj->activate(); + colObj->setDeactivationTime(0); + //colObj->setActivationState(WANTS_DEACTIVATION); + } + //removed cached contact points (this is not necessary if all objects have been removed from the dynamics world) + m_dynamicsWorld->getBroadphase()->getOverlappingPairCache()->cleanProxyFromPairs(colObj->getBroadphaseHandle(),getDynamicsWorld()->getDispatcher()); + + btRigidBody* body = btRigidBody::upcast(colObj); + if (body && !body->isStaticObject()) + { + btRigidBody::upcast(colObj)->setLinearVelocity(btVector3(0,0,0)); + btRigidBody::upcast(colObj)->setAngularVelocity(btVector3(0,0,0)); + } + } + + } + + ///reset some internal cached data in the broadphase + m_dynamicsWorld->getBroadphase()->resetPool(getDynamicsWorld()->getDispatcher()); + m_dynamicsWorld->getConstraintSolver()->reset(); + + for ( i=0;iaddRigidBody(btRigidBody::upcast(copyArray[i])); + } + + + +} diff --git a/BulletPhysics/bulletTrunk/Demos/OpenGL/DemoApplication.h b/BulletPhysics/bulletTrunk/Demos/OpenGL/DemoApplication.h new file mode 100644 index 00000000..741e4fc9 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/OpenGL/DemoApplication.h @@ -0,0 +1,229 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef DEMO_APPLICATION_H +#define DEMO_APPLICATION_H + + +#include "GlutStuff.h" +#include "GL_ShapeDrawer.h" + +#include +#include +#include + + +#include "LinearMath/btVector3.h" +#include "LinearMath/btMatrix3x3.h" +#include "LinearMath/btTransform.h" +#include "LinearMath/btQuickprof.h" +#include "LinearMath/btAlignedObjectArray.h" + +class btCollisionShape; +class btDynamicsWorld; +class btRigidBody; +class btTypedConstraint; + + + +class DemoApplication +{ + void displayProfileString(int xOffset,int yStart,char* message); + class CProfileIterator* m_profileIterator; + + protected: +#ifdef USE_BT_CLOCK + btClock m_clock; +#endif //USE_BT_CLOCK + + ///this is the most important class + btDynamicsWorld* m_dynamicsWorld; + + ///constraint for mouse picking + btTypedConstraint* m_pickConstraint; + + btCollisionShape* m_shootBoxShape; + + float m_cameraDistance; + int m_debugMode; + + float m_ele; + float m_azi; + btVector3 m_cameraPosition; + btVector3 m_cameraTargetPosition;//look at + + float m_scaleBottom; + float m_scaleFactor; + btVector3 m_cameraUp; + int m_forwardAxis; + + int m_glutScreenWidth; + int m_glutScreenHeight; + + float m_ShootBoxInitialSpeed; + + bool m_stepping; + bool m_singleStep; + bool m_idle; + int m_lastKey; + + void showProfileInfo(float& xOffset,float& yStart, float yIncr); + void renderscene(int pass); + + GL_ShapeDrawer* m_shapeDrawer; + bool m_enableshadows; + btVector3 m_sundirection; + +public: + + DemoApplication(); + + virtual ~DemoApplication(); + + btDynamicsWorld* getDynamicsWorld() + { + return m_dynamicsWorld; + } + + virtual void setDrawClusters(bool drawClusters) + { + + } + + void overrideGLShapeDrawer (GL_ShapeDrawer* shapeDrawer); + + void setOrthographicProjection(); + void resetPerspectiveProjection(); + + bool setTexturing(bool enable) { return(m_shapeDrawer->enableTexture(enable)); } + bool setShadows(bool enable) { bool p=m_enableshadows;m_enableshadows=enable;return(p); } + bool getTexturing() const + { + return m_shapeDrawer->hasTextureEnabled(); + } + bool getShadows() const + { + return m_enableshadows; + } + + + int getDebugMode() + { + return m_debugMode ; + } + + void setDebugMode(int mode); + + void setAzi(float azi) + { + m_azi = azi; + } + + void setCameraUp(const btVector3& camUp) + { + m_cameraUp = camUp; + } + void setCameraForwardAxis(int axis) + { + m_forwardAxis = axis; + } + + void myinit(); + + void toggleIdle(); + + virtual void updateCamera(); + + btVector3 getCameraPosition() + { + return m_cameraPosition; + } + btVector3 getCameraTargetPosition() + { + return m_cameraTargetPosition; + } + + btScalar getDeltaTimeMicroseconds() + { +#ifdef USE_BT_CLOCK + btScalar dt = m_clock.getTimeMicroseconds(); + m_clock.reset(); + return dt; +#else + return btScalar(16666.); +#endif + } + + ///glut callbacks + + float getCameraDistance(); + void setCameraDistance(float dist); + void moveAndDisplay(); + + virtual void clientMoveAndDisplay() = 0; + + virtual void clientResetScene(); + + ///Demo functions + virtual void setShootBoxShape (); + void shootBox(const btVector3& destination); + + + btVector3 getRayTo(int x,int y); + + btRigidBody* localCreateRigidBody(float mass, const btTransform& startTransform,btCollisionShape* shape); + + ///callback methods by glut + + virtual void keyboardCallback(unsigned char key, int x, int y); + + virtual void specialKeyboard(int key, int x, int y); + + virtual void specialKeyboardUp(int key, int x, int y); + + virtual void reshape(int w, int h); + + virtual void mouseFunc(int button, int state, int x, int y); + + virtual void mouseMotionFunc(int x,int y); + + virtual void displayCallback(); + + virtual void renderme(); + + + void stepLeft(); + void stepRight(); + void stepFront(); + void stepBack(); + void zoomIn(); + void zoomOut(); + + bool isIdle() const + { + return m_idle; + } + + void setIdle(bool idle) + { + m_idle = idle; + } + + +}; + +#endif //DEMO_APPLICATION_H + + diff --git a/BulletPhysics/bulletTrunk/Demos/OpenGL/GLDebugDrawer.cpp b/BulletPhysics/bulletTrunk/Demos/OpenGL/GLDebugDrawer.cpp new file mode 100644 index 00000000..1c768a68 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/OpenGL/GLDebugDrawer.cpp @@ -0,0 +1,130 @@ + +#include "GLDebugDrawer.h" + +#ifdef WIN32 //needed for glut.h +#include +#endif + +//think different +#if defined(__APPLE__) && !defined (VMDMESA) +#include +#include +#include +#else +#include +#endif + +#include "BMF_Api.h" +#include //printf debugging +GLDebugDrawer::GLDebugDrawer() +:m_debugMode(0) +{ + +} + +void GLDebugDrawer::drawLine(const btVector3& from,const btVector3& to,const btVector3& fromColor, const btVector3& toColor) +{ + glBegin(GL_LINES); + glColor3f(fromColor.getX(), fromColor.getY(), fromColor.getZ()); + glVertex3d(from.getX(), from.getY(), from.getZ()); + glColor3f(toColor.getX(), toColor.getY(), toColor.getZ()); + glVertex3d(to.getX(), to.getY(), to.getZ()); + glEnd(); +} + +void GLDebugDrawer::drawLine(const btVector3& from,const btVector3& to,const btVector3& color) +{ +// if (m_debugMode > 0) + { + glBegin(GL_LINES); + glColor4f(color.getX(), color.getY(), color.getZ(),1.f); + glVertex3d(from.getX(), from.getY(), from.getZ()); + glVertex3d(to.getX(), to.getY(), to.getZ()); + glEnd(); + } +} + +void GLDebugDrawer::drawSphere (const btVector3& p, btScalar radius, const btVector3& color) +{ + glColor4f (color.getX(), color.getY(), color.getZ(), btScalar(1.0f)); + glPushMatrix (); + glTranslatef (p.getX(), p.getY(), p.getZ()); + glutSolidSphere (radius, 10, 10); + glPopMatrix(); +} + +void GLDebugDrawer::drawBox (const btVector3& boxMin, const btVector3& boxMax, const btVector3& color, btScalar alpha) +{ + btVector3 halfExtent = (boxMax - boxMin) * btScalar(0.5f); + btVector3 center = (boxMax + boxMin) * btScalar(0.5f); + //glEnable(GL_BLEND); // Turn blending On + //glBlendFunc(GL_SRC_ALPHA, GL_ONE); + glColor4f (color.getX(), color.getY(), color.getZ(), alpha); + glPushMatrix (); + glTranslatef (center.getX(), center.getY(), center.getZ()); + glScaled(2*halfExtent[0], 2*halfExtent[1], 2*halfExtent[2]); + glutSolidCube(1.0); + glPopMatrix (); + //glDisable(GL_BLEND); +} + +void GLDebugDrawer::drawTriangle(const btVector3& a,const btVector3& b,const btVector3& c,const btVector3& color,btScalar alpha) +{ +// if (m_debugMode > 0) + { + const btVector3 n=cross(b-a,c-a).normalized(); + glBegin(GL_TRIANGLES); + glColor4f(color.getX(), color.getY(), color.getZ(),alpha); + glNormal3d(n.getX(),n.getY(),n.getZ()); + glVertex3d(a.getX(),a.getY(),a.getZ()); + glVertex3d(b.getX(),b.getY(),b.getZ()); + glVertex3d(c.getX(),c.getY(),c.getZ()); + glEnd(); + } +} + +void GLDebugDrawer::setDebugMode(int debugMode) +{ + m_debugMode = debugMode; + +} + +void GLDebugDrawer::draw3dText(const btVector3& location,const char* textString) +{ + glRasterPos3f(location.x(), location.y(), location.z()); + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),textString); +} + +void GLDebugDrawer::reportErrorWarning(const char* warningString) +{ + printf(warningString); +} + +void GLDebugDrawer::drawContactPoint(const btVector3& pointOnB,const btVector3& normalOnB,btScalar distance,int lifeTime,const btVector3& color) +{ + + { + btVector3 to=pointOnB+normalOnB*distance; + const btVector3&from = pointOnB; + glColor4f(color.getX(), color.getY(), color.getZ(),1.f); + //glColor4f(0,0,0,1.f); + + glBegin(GL_LINES); + glVertex3d(from.getX(), from.getY(), from.getZ()); + glVertex3d(to.getX(), to.getY(), to.getZ()); + glEnd(); + + + glRasterPos3f(from.x(), from.y(), from.z()); + char buf[12]; + sprintf(buf," %d",lifeTime); + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); + + + } +} + + + + + diff --git a/BulletPhysics/bulletTrunk/Demos/OpenGL/GLDebugDrawer.h b/BulletPhysics/bulletTrunk/Demos/OpenGL/GLDebugDrawer.h new file mode 100644 index 00000000..2a05405a --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/OpenGL/GLDebugDrawer.h @@ -0,0 +1,38 @@ +#ifndef GL_DEBUG_DRAWER_H +#define GL_DEBUG_DRAWER_H + +#include "LinearMath/btIDebugDraw.h" + + + +class GLDebugDrawer : public btIDebugDraw +{ + int m_debugMode; + +public: + + GLDebugDrawer(); + + + virtual void drawLine(const btVector3& from,const btVector3& to,const btVector3& fromColor, const btVector3& toColor); + + virtual void drawLine(const btVector3& from,const btVector3& to,const btVector3& color); + + virtual void drawSphere (const btVector3& p, btScalar radius, const btVector3& color); + virtual void drawBox (const btVector3& boxMin, const btVector3& boxMax, const btVector3& color, btScalar alpha); + + virtual void drawTriangle(const btVector3& a,const btVector3& b,const btVector3& c,const btVector3& color,btScalar alpha); + + virtual void drawContactPoint(const btVector3& PointOnB,const btVector3& normalOnB,btScalar distance,int lifeTime,const btVector3& color); + + virtual void reportErrorWarning(const char* warningString); + + virtual void draw3dText(const btVector3& location,const char* textString); + + virtual void setDebugMode(int debugMode); + + virtual int getDebugMode() const { return m_debugMode;} + +}; + +#endif//GL_DEBUG_DRAWER_H diff --git a/BulletPhysics/bulletTrunk/Demos/OpenGL/GL_ShapeDrawer.cpp b/BulletPhysics/bulletTrunk/Demos/OpenGL/GL_ShapeDrawer.cpp new file mode 100644 index 00000000..15a74ceb --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/OpenGL/GL_ShapeDrawer.cpp @@ -0,0 +1,850 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#ifdef WIN32 //needed for glut.h +#include +#endif + +//think different +#if defined(__APPLE__) && !defined (VMDMESA) +#include +#include +#include +#else +#include +#endif + +#include "GlutStuff.h" +#include "GL_ShapeDrawer.h" +#include "BulletCollision/CollisionShapes/btPolyhedralConvexShape.h" +#include "BulletCollision/CollisionShapes/btTriangleMeshShape.h" +#include "BulletCollision/CollisionShapes/btBoxShape.h" +#include "BulletCollision/CollisionShapes/btSphereShape.h" +#include "BulletCollision/CollisionShapes/btConeShape.h" +#include "BulletCollision/CollisionShapes/btCylinderShape.h" +#include "BulletCollision/CollisionShapes/btTetrahedronShape.h" +#include "BulletCollision/CollisionShapes/btCompoundShape.h" +#include "BulletCollision/CollisionShapes/btCapsuleShape.h" +#include "BulletCollision/CollisionShapes/btConvexTriangleMeshShape.h" +#include "BulletCollision/CollisionShapes/btUniformScalingShape.h" +#include "BulletCollision/CollisionShapes/btStaticPlaneShape.h" +/// +#include "BulletCollision/CollisionShapes/btShapeHull.h" + +#include "LinearMath/btTransformUtil.h" + + +#include "LinearMath/btIDebugDraw.h" +//for debugmodes +#include "BMF_Api.h" +#include //printf debugging + +//#define USE_DISPLAY_LISTS 1 +#ifdef USE_DISPLAY_LISTS + +#include + +using namespace std; + +//Set for storing Display list per trimesh +struct TRIMESH_KEY +{ + btCollisionShape* m_shape; + GLuint m_dlist;//OpenGL display list +}; + +typedef map TRIMESH_KEY_MAP; + +typedef pair TRIMESH_KEY_PAIR; + +TRIMESH_KEY_MAP g_display_lists; + +class GlDisplaylistDrawcallback : public btTriangleCallback +{ +public: + + virtual void processTriangle(btVector3* triangle,int partId, int triangleIndex) + { + + btVector3 diff1 = triangle[1] - triangle[0]; + btVector3 diff2 = triangle[2] - triangle[0]; + btVector3 normal = diff1.cross(diff2); + + normal.normalize(); + + glBegin(GL_TRIANGLES); + glColor3f(1, 1, 1); + glNormal3d(normal.getX(),normal.getY(),normal.getZ()); + glVertex3d(triangle[0].getX(), triangle[0].getY(), triangle[0].getZ()); + + //glColor3f(0, 1, 0); + glNormal3d(normal.getX(),normal.getY(),normal.getZ()); + glVertex3d(triangle[1].getX(), triangle[1].getY(), triangle[1].getZ()); + + //glColor3f(0, 1, 0); + glNormal3d(normal.getX(),normal.getY(),normal.getZ()); + glVertex3d(triangle[2].getX(), triangle[2].getY(), triangle[2].getZ()); + glEnd(); + + /*glBegin(GL_LINES); + glColor3f(1, 1, 0); + glNormal3d(normal.getX(),normal.getY(),normal.getZ()); + glVertex3d(triangle[0].getX(), triangle[0].getY(), triangle[0].getZ()); + glNormal3d(normal.getX(),normal.getY(),normal.getZ()); + glVertex3d(triangle[1].getX(), triangle[1].getY(), triangle[1].getZ()); + glColor3f(1, 1, 0); + glNormal3d(normal.getX(),normal.getY(),normal.getZ()); + glVertex3d(triangle[2].getX(), triangle[2].getY(), triangle[2].getZ()); + glNormal3d(normal.getX(),normal.getY(),normal.getZ()); + glVertex3d(triangle[1].getX(), triangle[1].getY(), triangle[1].getZ()); + glColor3f(1, 1, 0); + glNormal3d(normal.getX(),normal.getY(),normal.getZ()); + glVertex3d(triangle[2].getX(), triangle[2].getY(), triangle[2].getZ()); + glNormal3d(normal.getX(),normal.getY(),normal.getZ()); + glVertex3d(triangle[0].getX(), triangle[0].getY(), triangle[0].getZ()); + glEnd();*/ + + + } +}; + +GLuint OGL_get_displaylist_for_shape(btCollisionShape * shape) +{ + TRIMESH_KEY_MAP::iterator map_iter; + + unsigned long key = (unsigned long)shape; + map_iter = g_display_lists.find(key); + if(map_iter!=g_display_lists.end()) + { + return map_iter->second.m_dlist; + } + + return 0; +} + +void OGL_displaylist_clean() +{ + TRIMESH_KEY_MAP::iterator map_iter,map_itend; + + map_iter = g_display_lists.begin(); + + while(map_iter!=map_itend) + { + glDeleteLists(map_iter->second.m_dlist,1); + map_iter++; + } + + g_display_lists.clear(); +} + + +void OGL_displaylist_register_shape(btCollisionShape * shape) +{ + btVector3 aabbMax(btScalar(1e30),btScalar(1e30),btScalar(1e30)); + btVector3 aabbMin(-btScalar(1e30),-btScalar(1e30),-btScalar(1e30)); + GlDisplaylistDrawcallback drawCallback; + TRIMESH_KEY dlist; + + dlist.m_dlist = glGenLists(1); + dlist.m_shape = shape; + + unsigned long key = (unsigned long)shape; + + g_display_lists.insert(TRIMESH_KEY_PAIR(key,dlist)); + + glNewList(dlist.m_dlist,GL_COMPILE); + +// glEnable(GL_CULL_FACE); + + glCullFace(GL_BACK); + + if (shape->isConcave()) + { + btConcaveShape* concaveMesh = (btConcaveShape*) shape; + //todo pass camera, for some culling + concaveMesh->processAllTriangles(&drawCallback,aabbMin,aabbMax); + } + +// glDisable(GL_CULL_FACE); + + glEndList(); +} +#endif //USE_DISPLAY_LISTS + +void GL_ShapeDrawer::drawCoordSystem() { + glBegin(GL_LINES); + glColor3f(1, 0, 0); + glVertex3d(0, 0, 0); + glVertex3d(1, 0, 0); + glColor3f(0, 1, 0); + glVertex3d(0, 0, 0); + glVertex3d(0, 1, 0); + glColor3f(0, 0, 1); + glVertex3d(0, 0, 0); + glVertex3d(0, 0, 1); + glEnd(); + +} + + + + + +class GlDrawcallback : public btTriangleCallback +{ + +public: + + bool m_wireframe; + + GlDrawcallback() + :m_wireframe(false) + { + } + + virtual void processTriangle(btVector3* triangle,int partId, int triangleIndex) + { + + (void)triangleIndex; + (void)partId; + + + if (m_wireframe) + { + glBegin(GL_LINES); + glColor3f(1, 0, 0); + glVertex3d(triangle[0].getX(), triangle[0].getY(), triangle[0].getZ()); + glVertex3d(triangle[1].getX(), triangle[1].getY(), triangle[1].getZ()); + glColor3f(0, 1, 0); + glVertex3d(triangle[2].getX(), triangle[2].getY(), triangle[2].getZ()); + glVertex3d(triangle[1].getX(), triangle[1].getY(), triangle[1].getZ()); + glColor3f(0, 0, 1); + glVertex3d(triangle[2].getX(), triangle[2].getY(), triangle[2].getZ()); + glVertex3d(triangle[0].getX(), triangle[0].getY(), triangle[0].getZ()); + glEnd(); + } else + { + glBegin(GL_TRIANGLES); + //glColor3f(1, 1, 1); + + + glVertex3d(triangle[0].getX(), triangle[0].getY(), triangle[0].getZ()); + glVertex3d(triangle[1].getX(), triangle[1].getY(), triangle[1].getZ()); + glVertex3d(triangle[2].getX(), triangle[2].getY(), triangle[2].getZ()); + + glVertex3d(triangle[2].getX(), triangle[2].getY(), triangle[2].getZ()); + glVertex3d(triangle[1].getX(), triangle[1].getY(), triangle[1].getZ()); + glVertex3d(triangle[0].getX(), triangle[0].getY(), triangle[0].getZ()); + glEnd(); + } + } +}; + +class TriangleGlDrawcallback : public btInternalTriangleIndexCallback +{ +public: + virtual void internalProcessTriangleIndex(btVector3* triangle,int partId,int triangleIndex) + { + (void)triangleIndex; + (void)partId; + + + glBegin(GL_TRIANGLES);//LINES); + glColor3f(1, 0, 0); + glVertex3d(triangle[0].getX(), triangle[0].getY(), triangle[0].getZ()); + glVertex3d(triangle[1].getX(), triangle[1].getY(), triangle[1].getZ()); + glColor3f(0, 1, 0); + glVertex3d(triangle[2].getX(), triangle[2].getY(), triangle[2].getZ()); + glVertex3d(triangle[1].getX(), triangle[1].getY(), triangle[1].getZ()); + glColor3f(0, 0, 1); + glVertex3d(triangle[2].getX(), triangle[2].getY(), triangle[2].getZ()); + glVertex3d(triangle[0].getX(), triangle[0].getY(), triangle[0].getZ()); + glEnd(); + } +}; + +void GL_ShapeDrawer::drawCylinder(float radius,float halfHeight, int upAxis) +{ + + + glPushMatrix(); + switch (upAxis) + { + case 0: + glRotatef(-90.0, 0.0, 1.0, 0.0); + glTranslatef(0.0, 0.0, -halfHeight); + break; + case 1: + glRotatef(-90.0, 1.0, 0.0, 0.0); + glTranslatef(0.0, 0.0, -halfHeight); + break; + case 2: + + glTranslatef(0.0, 0.0, -halfHeight); + break; + default: + { + btAssert(0); + } + + } + + GLUquadricObj *quadObj = gluNewQuadric(); + + //The gluCylinder subroutine draws a cylinder that is oriented along the z axis. + //The base of the cylinder is placed at z = 0; the top of the cylinder is placed at z=height. + //Like a sphere, the cylinder is subdivided around the z axis into slices and along the z axis into stacks. + + gluQuadricDrawStyle(quadObj, (GLenum)GLU_FILL); + gluQuadricNormals(quadObj, (GLenum)GLU_SMOOTH); + + gluDisk(quadObj,0,radius,15, 10); + + gluCylinder(quadObj, radius, radius, 2.f*halfHeight, 15, 10); + glTranslatef(0.0, 0.0, 2.*halfHeight); + glRotatef(-180.0, 0.0, 1.0, 0.0); + gluDisk(quadObj,0,radius,15, 10); + + glPopMatrix(); + gluDeleteQuadric(quadObj); +} + +GL_ShapeDrawer::ShapeCache* GL_ShapeDrawer::cache(btConvexShape* shape) +{ + ShapeCache* sc=(ShapeCache*)shape->getUserPointer(); + if(!sc) + { + sc=new(btAlignedAlloc(sizeof(ShapeCache),16)) ShapeCache(shape); + sc->m_shapehull.buildHull(shape->getMargin()); + m_shapecaches.push_back(sc); + shape->setUserPointer(sc); + /* Build edges */ + const int ni=sc->m_shapehull.numIndices(); + const int nv=sc->m_shapehull.numVertices(); + const unsigned int* pi=sc->m_shapehull.getIndexPointer(); + const btVector3* pv=sc->m_shapehull.getVertexPointer(); + btAlignedObjectArray edges; + sc->m_edges.reserve(ni); + edges.resize(nv*nv,0); + for(int i=0;im_edges.push_back(ShapeCache::Edge()); + e=&sc->m_edges[sc->m_edges.size()-1]; + e->n[0]=nrm;e->n[1]=-nrm; + e->v[0]=a;e->v[1]=b; + } + else + { + e->n[1]=nrm; + } + } + } + } + return(sc); +} + +void GL_ShapeDrawer::drawOpenGL(btScalar* m, const btCollisionShape* shape, const btVector3& color,int debugMode,const btVector3& worldBoundsMin,const btVector3& worldBoundsMax) +{ + + + glPushMatrix(); + btglMultMatrix(m); + + if (shape->getShapeType() == UNIFORM_SCALING_SHAPE_PROXYTYPE) + { + const btUniformScalingShape* scalingShape = static_cast(shape); + const btConvexShape* convexShape = scalingShape->getChildShape(); + float scalingFactor = (float)scalingShape->getUniformScalingFactor(); + { + btScalar tmpScaling[4][4]={{scalingFactor,0,0,0}, + {0,scalingFactor,0,0}, + {0,0,scalingFactor,0}, + {0,0,0,1}}; + + drawOpenGL( (btScalar*)tmpScaling,convexShape,color,debugMode,worldBoundsMin,worldBoundsMax); + } + glPopMatrix(); + return; + } + + if (shape->getShapeType() == COMPOUND_SHAPE_PROXYTYPE) + { + const btCompoundShape* compoundShape = static_cast(shape); + for (int i=compoundShape->getNumChildShapes()-1;i>=0;i--) + { + btTransform childTrans = compoundShape->getChildTransform(i); + const btCollisionShape* colShape = compoundShape->getChildShape(i); + btScalar childMat[16]; + childTrans.getOpenGLMatrix(childMat); + drawOpenGL(childMat,colShape,color,debugMode,worldBoundsMin,worldBoundsMax); + } + + } else + { + if(m_textureenabled&&(!m_textureinitialized)) + { + GLubyte* image=new GLubyte[256*256*3]; + for(int y=0;y<256;++y) + { + const int t=y>>4; + GLubyte* pi=image+y*256*3; + for(int x=0;x<256;++x) + { + const int s=x>>4; + const GLubyte b=180; + GLubyte c=b+((s+t&1)&1)*(255-b); + pi[0]=pi[1]=pi[2]=c;pi+=3; + } + } + glGenTextures(1,(GLuint*)&m_texturehandle); + glBindTexture(GL_TEXTURE_2D,m_texturehandle); + glTexEnvf(GL_TEXTURE_ENV,GL_TEXTURE_ENV_MODE,GL_MODULATE); + glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_LINEAR); + glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR_MIPMAP_LINEAR); + glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_S,GL_REPEAT); + glTexParameterf(GL_TEXTURE_2D,GL_TEXTURE_WRAP_T,GL_REPEAT); + gluBuild2DMipmaps(GL_TEXTURE_2D,3,256,256,GL_RGB,GL_UNSIGNED_BYTE,image); + delete[] image; + + glMatrixMode(GL_TEXTURE); + glLoadIdentity(); + glScalef(0.025,0.025,0.025); + + static const GLfloat planex[]={1,0,0,0}; + static const GLfloat planey[]={0,1,0,0}; + static const GLfloat planez[]={0,0,1,0}; + glTexGenfv(GL_S,GL_OBJECT_PLANE,planex); + glTexGenfv(GL_T,GL_OBJECT_PLANE,planez); + glTexGeni(GL_S,GL_TEXTURE_GEN_MODE,GL_OBJECT_LINEAR); + glTexGeni(GL_T,GL_TEXTURE_GEN_MODE,GL_OBJECT_LINEAR); + glEnable(GL_TEXTURE_GEN_S); + glEnable(GL_TEXTURE_GEN_T); + glEnable(GL_TEXTURE_GEN_R); + m_textureinitialized=true; + } + //drawCoordSystem(); + + //glPushMatrix(); + glEnable(GL_COLOR_MATERIAL); + if(m_textureenabled) + { + glEnable(GL_TEXTURE_2D); + glBindTexture(GL_TEXTURE_2D,m_texturehandle); + } else + { + glDisable(GL_TEXTURE_2D); + } + + + glColor3f(color.x(),color.y(), color.z()); + + bool useWireframeFallback = true; + + if (!(debugMode & btIDebugDraw::DBG_DrawWireframe)) + { + ///you can comment out any of the specific cases, and use the default + ///the benefit of 'default' is that it approximates the actual collision shape including collision margin + int shapetype=m_textureenabled?MAX_BROADPHASE_COLLISION_TYPES:shape->getShapeType(); + switch (shapetype) + { + case BOX_SHAPE_PROXYTYPE: + { + const btBoxShape* boxShape = static_cast(shape); + btVector3 halfExtent = boxShape->getHalfExtentsWithMargin(); + glScaled(2*halfExtent[0], 2*halfExtent[1], 2*halfExtent[2]); + glutSolidCube(1.0); + useWireframeFallback = false; + break; + } + + + case SPHERE_SHAPE_PROXYTYPE: + { + const btSphereShape* sphereShape = static_cast(shape); + float radius = sphereShape->getMargin();//radius doesn't include the margin, so draw with margin + glutSolidSphere(radius,10,10); + useWireframeFallback = false; + break; + } + + case CONE_SHAPE_PROXYTYPE: + { + const btConeShape* coneShape = static_cast(shape); + int upIndex = coneShape->getConeUpIndex(); + float radius = coneShape->getRadius();//+coneShape->getMargin(); + float height = coneShape->getHeight();//+coneShape->getMargin(); + switch (upIndex) + { + case 0: + glRotatef(90.0, 0.0, 1.0, 0.0); + break; + case 1: + glRotatef(-90.0, 1.0, 0.0, 0.0); + break; + case 2: + break; + default: + { + } + }; + + glTranslatef(0.0, 0.0, -0.5*height); + glutSolidCone(radius,height,10,10); + useWireframeFallback = false; + break; + + } + + + case STATIC_PLANE_PROXYTYPE: + { + const btStaticPlaneShape* staticPlaneShape = static_cast(shape); + btScalar planeConst = staticPlaneShape->getPlaneConstant(); + const btVector3& planeNormal = staticPlaneShape->getPlaneNormal(); + btVector3 planeOrigin = planeNormal * planeConst; + btVector3 vec0,vec1; + btPlaneSpace1(planeNormal,vec0,vec1); + btScalar vecLen = 100.f; + btVector3 pt0 = planeOrigin + vec0*vecLen; + btVector3 pt1 = planeOrigin - vec0*vecLen; + btVector3 pt2 = planeOrigin + vec1*vecLen; + btVector3 pt3 = planeOrigin - vec1*vecLen; + glBegin(GL_LINES); + glVertex3f(pt0.getX(),pt0.getY(),pt0.getZ()); + glVertex3f(pt1.getX(),pt1.getY(),pt1.getZ()); + glVertex3f(pt2.getX(),pt2.getY(),pt2.getZ()); + glVertex3f(pt3.getX(),pt3.getY(),pt3.getZ()); + glEnd(); + + + break; + + } + + case CYLINDER_SHAPE_PROXYTYPE: + { + const btCylinderShape* cylinder = static_cast(shape); + int upAxis = cylinder->getUpAxis(); + + + float radius = cylinder->getRadius(); + float halfHeight = cylinder->getHalfExtentsWithMargin()[upAxis]; + + drawCylinder(radius,halfHeight,upAxis); + + break; + } + + default: + { + + + if (shape->isConvex()) + { + ShapeCache* sc=cache((btConvexShape*)shape); +#if 0 + btConvexShape* convexShape = (btConvexShape*)shape; + if (!shape->getUserPointer()) + { + //create a hull approximation + void* mem = btAlignedAlloc(sizeof(btShapeHull),16); + btShapeHull* hull = new(mem) btShapeHull(convexShape); + + ///cleanup memory + m_shapeHulls.push_back(hull); + + btScalar margin = shape->getMargin(); + hull->buildHull(margin); + convexShape->setUserPointer(hull); + + + // printf("numTriangles = %d\n", hull->numTriangles ()); + // printf("numIndices = %d\n", hull->numIndices ()); + // printf("numVertices = %d\n", hull->numVertices ()); + + + } +#endif + + + + //if (shape->getUserPointer()) + { + //glutSolidCube(1.0); + btShapeHull* hull = &sc->m_shapehull/*(btShapeHull*)shape->getUserPointer()*/; + + + if (hull->numTriangles () > 0) + { + int index = 0; + const unsigned int* idx = hull->getIndexPointer(); + const btVector3* vtx = hull->getVertexPointer(); + + glBegin (GL_TRIANGLES); + + for (int i = 0; i < hull->numTriangles (); i++) + { + int i1 = index++; + int i2 = index++; + int i3 = index++; + btAssert(i1 < hull->numIndices () && + i2 < hull->numIndices () && + i3 < hull->numIndices ()); + + int index1 = idx[i1]; + int index2 = idx[i2]; + int index3 = idx[i3]; + btAssert(index1 < hull->numVertices () && + index2 < hull->numVertices () && + index3 < hull->numVertices ()); + + btVector3 v1 = vtx[index1]; + btVector3 v2 = vtx[index2]; + btVector3 v3 = vtx[index3]; + btVector3 normal = (v3-v1).cross(v2-v1); + normal.normalize (); + + glNormal3f(normal.getX(),normal.getY(),normal.getZ()); + glVertex3f (v1.x(), v1.y(), v1.z()); + glVertex3f (v2.x(), v2.y(), v2.z()); + glVertex3f (v3.x(), v3.y(), v3.z()); + + } + glEnd (); + + } + } + } + } + } + + } + + + + + /// for polyhedral shapes + if (debugMode==btIDebugDraw::DBG_DrawFeaturesText && (shape->isPolyhedral())) + { + btPolyhedralConvexShape* polyshape = (btPolyhedralConvexShape*) shape; + + { + glRasterPos3f(0.0, 0.0, 0.0); + //BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),polyshape->getExtraDebugInfo()); + + glColor3f(1.f, 1.f, 1.f); + int i; + for (i=0;igetNumVertices();i++) + { + btVector3 vtx; + polyshape->getVertex(i,vtx); + glRasterPos3f(vtx.x(), vtx.y(), vtx.z()); + char buf[12]; + sprintf(buf," %d",i); + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); + } + + for (i=0;igetNumPlanes();i++) + { + btVector3 normal; + btVector3 vtx; + polyshape->getPlane(normal,vtx,i); + btScalar d = vtx.dot(normal); + + glRasterPos3f(normal.x()*d, normal.y()*d, normal.z()*d); + char buf[12]; + sprintf(buf," plane %d",i); + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),buf); + + } + } + + } + + +#ifdef USE_DISPLAY_LISTS + + if (shape->getShapeType() == TRIANGLE_MESH_SHAPE_PROXYTYPE||shape->getShapeType() == GIMPACT_SHAPE_PROXYTYPE) + { + GLuint dlist = OGL_get_displaylist_for_shape((btCollisionShape * )shape); + if (dlist) + { + glCallList(dlist); + } + else + { +#else + if (shape->isConcave())//>getShapeType() == TRIANGLE_MESH_SHAPE_PROXYTYPE||shape->getShapeType() == GIMPACT_SHAPE_PROXYTYPE) + // if (shape->getShapeType() == TRIANGLE_MESH_SHAPE_PROXYTYPE) + { + btConcaveShape* concaveMesh = (btConcaveShape*) shape; + + GlDrawcallback drawCallback; + drawCallback.m_wireframe = (debugMode & btIDebugDraw::DBG_DrawWireframe)!=0; + + concaveMesh->processAllTriangles(&drawCallback,worldBoundsMin,worldBoundsMax); + + } +#endif + +#ifdef USE_DISPLAY_LISTS + } +} +#endif + +/* +if (shape->getShapeType() == CONVEX_TRIANGLEMESH_SHAPE_PROXYTYPE) +{ +btConvexTriangleMeshShape* convexMesh = (btConvexTriangleMeshShape*) shape; + +//todo: pass camera for some culling +btVector3 aabbMax(btScalar(1e30),btScalar(1e30),btScalar(1e30)); +btVector3 aabbMin(-btScalar(1e30),-btScalar(1e30),-btScalar(1e30)); +TriangleGlDrawcallback drawCallback; +convexMesh->getMeshInterface()->InternalProcessAllTriangles(&drawCallback,aabbMin,aabbMax); + +} +*/ + + + +glDisable(GL_DEPTH_TEST); +glRasterPos3f(0,0,0);//mvtx.x(), vtx.y(), vtx.z()); +if (debugMode&btIDebugDraw::DBG_DrawText) +{ + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),shape->getName()); +} + +if (debugMode& btIDebugDraw::DBG_DrawFeaturesText) +{ + //BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),shape->getExtraDebugInfo()); +} +glEnable(GL_DEPTH_TEST); + +// glPopMatrix(); +if(m_textureenabled) glDisable(GL_TEXTURE_2D); + } + glPopMatrix(); + +} + +// +void GL_ShapeDrawer::drawShadow(btScalar* m,const btVector3& extrusion,const btCollisionShape* shape,const btVector3& worldBoundsMin,const btVector3& worldBoundsMax) +{ + glPushMatrix(); + btglMultMatrix(m); + if(shape->getShapeType() == UNIFORM_SCALING_SHAPE_PROXYTYPE) + { + const btUniformScalingShape* scalingShape = static_cast(shape); + const btConvexShape* convexShape = scalingShape->getChildShape(); + float scalingFactor = (float)scalingShape->getUniformScalingFactor(); + btScalar tmpScaling[4][4]={ {scalingFactor,0,0,0}, + {0,scalingFactor,0,0}, + {0,0,scalingFactor,0}, + {0,0,0,1}}; + drawShadow((btScalar*)tmpScaling,extrusion,convexShape,worldBoundsMin,worldBoundsMax); + glPopMatrix(); + return; + } + else if(shape->getShapeType()==COMPOUND_SHAPE_PROXYTYPE) + { + const btCompoundShape* compoundShape = static_cast(shape); + for (int i=compoundShape->getNumChildShapes()-1;i>=0;i--) + { + btTransform childTrans = compoundShape->getChildTransform(i); + const btCollisionShape* colShape = compoundShape->getChildShape(i); + btScalar childMat[16]; + childTrans.getOpenGLMatrix(childMat); + drawShadow(childMat,extrusion*childTrans.getBasis(),colShape,worldBoundsMin,worldBoundsMax); + } + } + else + { + bool useWireframeFallback = true; + if (shape->isConvex()) + { + ShapeCache* sc=cache((btConvexShape*)shape); + btShapeHull* hull =&sc->m_shapehull; + glBegin(GL_QUADS); + for(int i=0;im_edges.size();++i) + { + const btScalar d=dot(sc->m_edges[i].n[0],extrusion); + if((d*dot(sc->m_edges[i].n[1],extrusion))<0) + { + const int q= d<0?1:0; + const btVector3& a= hull->getVertexPointer()[sc->m_edges[i].v[q]]; + const btVector3& b= hull->getVertexPointer()[sc->m_edges[i].v[1-q]]; + glVertex3f(a[0],a[1],a[2]); + glVertex3f(b[0],b[1],b[2]); + glVertex3f(b[0]+extrusion[0],b[1]+extrusion[1],b[2]+extrusion[2]); + glVertex3f(a[0]+extrusion[0],a[1]+extrusion[1],a[2]+extrusion[2]); + } + } + glEnd(); + } + + } + + + + + if (shape->isConcave())//>getShapeType() == TRIANGLE_MESH_SHAPE_PROXYTYPE||shape->getShapeType() == GIMPACT_SHAPE_PROXYTYPE) + // if (shape->getShapeType() == TRIANGLE_MESH_SHAPE_PROXYTYPE) + { + btConcaveShape* concaveMesh = (btConcaveShape*) shape; + + GlDrawcallback drawCallback; + drawCallback.m_wireframe = false; + + concaveMesh->processAllTriangles(&drawCallback,worldBoundsMin,worldBoundsMax); + + } + glPopMatrix(); + +} + +// +GL_ShapeDrawer::GL_ShapeDrawer() +{ + m_texturehandle = 0; + m_textureenabled = false; + m_textureinitialized = false; +} + +GL_ShapeDrawer::~GL_ShapeDrawer() +{ + int i; + for (i=0;i~ShapeCache(); + btAlignedFree(m_shapecaches[i]); + } + m_shapecaches.clear(); + if(m_textureinitialized) + { + glDeleteTextures(1,(const GLuint*) &m_texturehandle); + } +} + + diff --git a/BulletPhysics/bulletTrunk/Demos/OpenGL/GL_ShapeDrawer.h b/BulletPhysics/bulletTrunk/Demos/OpenGL/GL_ShapeDrawer.h new file mode 100644 index 00000000..6b7b3e22 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/OpenGL/GL_ShapeDrawer.h @@ -0,0 +1,68 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ +#ifndef GL_SHAPE_DRAWER_H +#define GL_SHAPE_DRAWER_H + +class btCollisionShape; +class btShapeHull; +#include "LinearMath/btAlignedObjectArray.h" +#include "LinearMath/btVector3.h" + +#include "BulletCollision/CollisionShapes/btShapeHull.h" + +/// OpenGL shape drawing +class GL_ShapeDrawer +{ +protected: + struct ShapeCache + { + struct Edge { btVector3 n[2];int v[2]; }; + ShapeCache(btConvexShape* s) : m_shapehull(s) {} + btShapeHull m_shapehull; + btAlignedObjectArray m_edges; + }; + //clean-up memory of dynamically created shape hulls + btAlignedObjectArray m_shapecaches; + unsigned int m_texturehandle; + bool m_textureenabled; + bool m_textureinitialized; + + + ShapeCache* cache(btConvexShape*); + +public: + GL_ShapeDrawer(); + + virtual ~GL_ShapeDrawer(); + + ///drawOpenGL might allocate temporary memoty, stores pointer in shape userpointer + virtual void drawOpenGL(btScalar* m, const btCollisionShape* shape, const btVector3& color,int debugMode,const btVector3& worldBoundsMin,const btVector3& worldBoundsMax); + virtual void drawShadow(btScalar* m, const btVector3& extrusion,const btCollisionShape* shape,const btVector3& worldBoundsMin,const btVector3& worldBoundsMax); + + bool enableTexture(bool enable) { bool p=m_textureenabled;m_textureenabled=enable;return(p); } + bool hasTextureEnabled() const + { + return m_textureenabled; + } + + static void drawCylinder(float radius,float halfHeight, int upAxis); + static void drawCoordSystem(); + +}; + +void OGL_displaylist_register_shape(btCollisionShape * shape); +void OGL_displaylist_clean(); + +#endif //GL_SHAPE_DRAWER_H \ No newline at end of file diff --git a/BulletPhysics/bulletTrunk/Demos/OpenGL/GL_Simplex1to4.cpp b/BulletPhysics/bulletTrunk/Demos/OpenGL/GL_Simplex1to4.cpp new file mode 100644 index 00000000..bca9fd6b --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/OpenGL/GL_Simplex1to4.cpp @@ -0,0 +1,76 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ +#include "GL_Simplex1to4.h" +#include "BulletCollision/NarrowPhaseCollision/btSimplexSolverInterface.h" +#include "GL_ShapeDrawer.h" +#ifdef WIN32 +#include +#endif + +//think different +#if defined(__APPLE__) && !defined (VMDMESA) +#include +#include +#else +#include +#endif +#include "GlutStuff.h" +#include "LinearMath/btTransform.h" + +GL_Simplex1to4::GL_Simplex1to4() +:m_simplexSolver(0) +{ +} + +/// +/// Debugging method calcClosest calculates the closest point to the origin, using m_simplexSolver +/// +void GL_Simplex1to4::calcClosest(btScalar* m) +{ + btTransform tr; + tr.setFromOpenGLMatrix(m); + + + + GL_ShapeDrawer::drawCoordSystem(); + + if (m_simplexSolver) + { + m_simplexSolver->reset(); + bool res; + + btVector3 v; + + for (int i=0;iaddVertex(v,v,btVector3(0.f,0.f,0.f)); + res = m_simplexSolver->closest(v); + } + + //draw v? + glDisable(GL_LIGHTING); + glBegin(GL_LINES); + btglColor3(1.f, 0.f, 0.f); + btglVertex3(0.f, 0.f, 0.f); + btglVertex3(v.x(),v.y(),v.z()); + glEnd(); + + glEnable(GL_LIGHTING); + + + } + +} diff --git a/BulletPhysics/bulletTrunk/Demos/OpenGL/GL_Simplex1to4.h b/BulletPhysics/bulletTrunk/Demos/OpenGL/GL_Simplex1to4.h new file mode 100644 index 00000000..c75e3573 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/OpenGL/GL_Simplex1to4.h @@ -0,0 +1,40 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ +#ifndef GL_SIMPLEX_1TO4_H +#define GL_SIMPLEX_1TO4_H + +#include "BulletCollision/CollisionShapes/btTetrahedronShape.h" + +#include "BulletCollision/NarrowPhaseCollision/btSimplexSolverInterface.h" + +///GL_Simplex1to4 is a class to debug a Simplex Solver with 1 to 4 points. +///Can be used by GJK. +class GL_Simplex1to4 : public btBU_Simplex1to4 +{ + btSimplexSolverInterface* m_simplexSolver; + + public: + + GL_Simplex1to4(); + + void calcClosest(btScalar* m); + + void setSimplexSolver(btSimplexSolverInterface* simplexSolver) { + m_simplexSolver = simplexSolver; + } + +}; + +#endif //GL_SIMPLEX_1TO4_H diff --git a/BulletPhysics/bulletTrunk/Demos/OpenGL/GlutStuff.cpp b/BulletPhysics/bulletTrunk/Demos/OpenGL/GlutStuff.cpp new file mode 100644 index 00000000..4a7cb049 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/OpenGL/GlutStuff.cpp @@ -0,0 +1,99 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + + +#include "DemoApplication.h" + +//glut is C code, this global gDemoApplication links glut to the C++ demo +static DemoApplication* gDemoApplication = 0; + + +#include "GlutStuff.h" + +static void glutKeyboardCallback(unsigned char key, int x, int y) +{ + gDemoApplication->keyboardCallback(key,x,y); +} + +static void glutSpecialKeyboardCallback(int key, int x, int y) +{ + gDemoApplication->specialKeyboard(key,x,y); +} + +static void glutSpecialKeyboardUpCallback(int key, int x, int y) +{ + gDemoApplication->specialKeyboardUp(key,x,y); +} + + +static void glutReshapeCallback(int w, int h) +{ + gDemoApplication->reshape(w,h); +} + +static void glutMoveAndDisplayCallback() +{ + gDemoApplication->moveAndDisplay(); +} + +static void glutMouseFuncCallback(int button, int state, int x, int y) +{ + gDemoApplication->mouseFunc(button,state,x,y); +} + + +static void glutMotionFuncCallback(int x,int y) +{ + gDemoApplication->mouseMotionFunc(x,y); +} + + +static void glutDisplayCallback(void) +{ + gDemoApplication->displayCallback(); +} + + +int glutmain(int argc, char **argv,int width,int height,const char* title,DemoApplication* demoApp) { + + gDemoApplication = demoApp; + + glutInit(&argc, argv); + glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_DEPTH | GLUT_STENCIL); + glutInitWindowPosition(0, 0); + glutInitWindowSize(width, height); + glutCreateWindow(title); +#ifdef BT_USE_FREEGLUT + glutSetOption (GLUT_ACTION_ON_WINDOW_CLOSE, GLUT_ACTION_GLUTMAINLOOP_RETURNS); +#endif + + gDemoApplication->myinit(); + + glutKeyboardFunc(glutKeyboardCallback); + glutSpecialFunc(glutSpecialKeyboardCallback); + glutSpecialUpFunc(glutSpecialKeyboardUpCallback); + + glutReshapeFunc(glutReshapeCallback); + //createMenu(); + glutIdleFunc(glutMoveAndDisplayCallback); + glutMouseFunc(glutMouseFuncCallback); + glutMotionFunc(glutMotionFuncCallback); + glutDisplayFunc( glutDisplayCallback ); + + glutMoveAndDisplayCallback(); + + glutMainLoop(); + return 0; +} diff --git a/BulletPhysics/bulletTrunk/Demos/OpenGL/GlutStuff.h b/BulletPhysics/bulletTrunk/Demos/OpenGL/GlutStuff.h new file mode 100644 index 00000000..4727845b --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/OpenGL/GlutStuff.h @@ -0,0 +1,52 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ +#ifndef GLUT_STUFF_H +#define GLUT_STUFF_H + +#ifdef WIN32//for glut.h +#include +#endif + +//think different +#if defined(__APPLE__) && !defined (VMDMESA) +#include +#include +#include +#else +#include +#endif + +#if BT_USE_FREEGLUT +#include "GL/freeglut_ext.h" //to be able to return from glutMainLoop() +#endif + + +class DemoApplication; + +int glutmain(int argc, char **argv,int width,int height,const char* title,DemoApplication* demoApp); + +#if defined(BT_USE_DOUBLE_PRECISION) +#define btglLoadMatrix glLoadMatrixd +#define btglMultMatrix glMultMatrixd +#define btglColor3 glColor3d +#define btglVertex3 glVertex3d +#else +#define btglLoadMatrix glLoadMatrixf +#define btglMultMatrix glMultMatrixf +#define btglColor3 glColor3f +#define btglVertex3 glVertex3d +#endif + +#endif //GLUT_STUFF_H diff --git a/BulletPhysics/bulletTrunk/Demos/OpenGL/Jamfile b/BulletPhysics/bulletTrunk/Demos/OpenGL/Jamfile new file mode 100644 index 00000000..4efdf597 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/OpenGL/Jamfile @@ -0,0 +1,19 @@ +SubDir TOP Demos OpenGL ; + +if $(GLUT.AVAILABLE) = "yes" +{ + + + Description bulletopenglsupport : "Bullet OpenGL support" ; + Library bulletopenglsupport : + [ Wildcard *.h *.cpp ] : noinstall +; + + + + + +LibDepends bulletopenglsupport : bulletdynamics ; + + ExternalLibs bulletopenglsupport : GLUT ; +} diff --git a/BulletPhysics/bulletTrunk/Demos/OpenGL/Makefile.am b/BulletPhysics/bulletTrunk/Demos/OpenGL/Makefile.am new file mode 100644 index 00000000..f2052b9a --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/OpenGL/Makefile.am @@ -0,0 +1,12 @@ +noinst_LIBRARIES = libbulletopenglsupport.a + +libbulletopenglsupport_a_SOURCES = \ + BMF_Api.cpp BMF_BitmapFont.h BMF_Fonts.h \ + DemoApplication.cpp GLDebugDrawer.h GL_Simplex1to4.cpp \ + GlutStuff.h BMF_Api.h BMF_FontData.h \ + BMF_Settings.h DemoApplication.h GL_ShapeDrawer.cpp \ + GL_Simplex1to4.h RenderTexture.cpp BMF_BitmapFont.cpp \ + BMF_font_helv10.cpp DebugCastResult.h GLDebugDrawer.cpp \ + GL_ShapeDrawer.h GlutStuff.cpp RenderTexture.h + +INCLUDES=-I../../src diff --git a/BulletPhysics/bulletTrunk/Demos/OpenGL/RenderTexture.cpp b/BulletPhysics/bulletTrunk/Demos/OpenGL/RenderTexture.cpp new file mode 100644 index 00000000..c958ae4d --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/OpenGL/RenderTexture.cpp @@ -0,0 +1,73 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#include "RenderTexture.h" +#include +#include "BMF_FontData.h" + +renderTexture::renderTexture(int width,int height) +:m_height(height),m_width(width) +{ + m_buffer = new unsigned char[m_width*m_height*4]; + + //clear screen + memset(m_buffer,0,m_width*m_height*4); + + //clear screen version 2 + for (int x=0;xchars[c]; + + if (cd.data_offset!=-1) { + unsigned char* bitmap = &fontData->bitmap_data[cd.data_offset]; + for (int y=0;y>=1; + } + } + } + rasterposx+= cd.advance; + } +} + +renderTexture::~renderTexture() +{ + delete [] m_buffer; +} + + + diff --git a/BulletPhysics/bulletTrunk/Demos/OpenGL/RenderTexture.h b/BulletPhysics/bulletTrunk/Demos/OpenGL/RenderTexture.h new file mode 100644 index 00000000..1ced2477 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/OpenGL/RenderTexture.h @@ -0,0 +1,63 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef RENDER_TEXTURE_H +#define RENDER_TEXTURE_H + +#include "LinearMath/btVector3.h" +#include "BMF_FontData.h" + +/// +///renderTexture provides a software-render context (setpixel/printf) +/// +class renderTexture +{ + int m_height; + int m_width; + unsigned char* m_buffer; + +public: + + renderTexture(int width,int height); + ~renderTexture(); + + inline void setPixel(int x,int y,const btVector4& rgba) + { + unsigned char* pixel = &m_buffer[ (x+y*m_width) * 4]; + + pixel[0] = (unsigned char)(255*rgba.getX()); + pixel[1] = (unsigned char)(255*rgba.getY()); + pixel[2] = (unsigned char)(255*rgba.getZ()); + pixel[3] = (unsigned char)(255*rgba.getW()); + } + + inline btVector4 getPixel(int x,int y) + { + unsigned char* pixel = &m_buffer[ (x+y*m_width) * 4]; + return btVector4(pixel[0]*1.f/255.f, + pixel[1]*1.f/255.f, + pixel[2]*1.f/255.f, + pixel[3]*1.f/255.f); + } + + const unsigned char* getBuffer() const { return m_buffer;} + int getWidth() const { return m_width;} + int getHeight() const { return m_height;} + void grapicalPrintf(char* str, BMF_FontData* fontData, int startx = 0,int starty=0); + +}; + +#endif //RENDER_TEXTURE_H + diff --git a/BulletPhysics/bulletTrunk/Demos/OpenGL/ibmsdk/Makefile b/BulletPhysics/bulletTrunk/Demos/OpenGL/ibmsdk/Makefile new file mode 100644 index 00000000..85a19c6e --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/OpenGL/ibmsdk/Makefile @@ -0,0 +1,45 @@ +#### Source code Dirs +VPATH = ../ + +ROOT = ../../.. +HOST = /usr/include + +#### Library +LIBRARY_ppu = bulletopenglsupport.a + +#### Compiler flags +CPPFLAGS = -DUSE_LIBSPE2 \ +-I$(ROOT)/Extras/ConvexHull \ +-I$(ROOT)/src/ \ +-I$(SDKINC) \ +-I$(HOST) + +#### Optimization level flags +#CC_OPT_LEVEL = $(CC_OPT_LEVEL_DEBUG) +CC_OPT_LEVEL = -O3 + +##### Objects to be archived in lib +OBJS = \ +BMF_Api.o \ +BMF_BitmapFont.o \ +BMF_font_helv10.o \ +DemoApplication.o \ +GLDebugDrawer.o \ +GL_ShapeDrawer.o \ +GL_Simplex1to4.o \ +GlutStuff.o \ +RenderTexture.o + +#### Install directories +INSTALL_DIR = $(ROOT)/lib/ibmsdk/ +INSTALL_FILES = $(LIBRARY) + +IBM_CELLSDK_VERSION := $(shell if [ -d /opt/cell ]; then echo "3.0"; fi) + +ifeq ("$(IBM_CELLSDK_VERSION)","3.0") + CELL_TOP ?= /opt/cell/sdk + include $(CELL_TOP)/buildutils/make.footer +else + CELL_TOP ?= /opt/ibm/cell-sdk/prototype + include $(CELL_TOP)/make.footer +endif diff --git a/BulletPhysics/bulletTrunk/Demos/OpenPL_Demo/CApi.cpp b/BulletPhysics/bulletTrunk/Demos/OpenPL_Demo/CApi.cpp new file mode 100644 index 00000000..171c7700 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/OpenPL_Demo/CApi.cpp @@ -0,0 +1,159 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +/* + Draft high-level generic physics C-API. For low-level access, use the physics SDK native API's. + Work in progress, functionality will be added on demand. + + If possible, use the richer Bullet C++ API, by including +*/ + +#include "Bullet-C-Api.h" +#include "btBulletDynamicsCommon.h" + +/* + Create and Delete a Physics SDK +*/ + +plPhysicsSdkHandle plNewBulletSdk() +{ + return 0; +} + +void plDeletePhysicsSdk(plPhysicsSdkHandle physicsSdk) +{ + +} + +/* Dynamics World */ +plDynamicsWorldHandle plCreateDynamicsWorld(plPhysicsSdkHandle physicsSdk) +{ + return (plDynamicsWorldHandle) new btDiscreteDynamicsWorld; +} +void plDeleteDynamicsWorld(plDynamicsWorldHandle world) +{ + btDynamicsWorld* dynamicsWorld = reinterpret_cast< btDynamicsWorld* >(world); + delete dynamicsWorld; +} + +void plStepSimulation(plDynamicsWorldHandle world, plReal timeStep) +{ + btDynamicsWorld* dynamicsWorld = reinterpret_cast< btDynamicsWorld* >(world); + assert(dynamicsWorld); + dynamicsWorld->stepSimulation(timeStep); +} + +void plAddRigidBody(plDynamicsWorldHandle world, plRigidBodyHandle object) +{ + btDynamicsWorld* dynamicsWorld = reinterpret_cast< btDynamicsWorld* >(world); + assert(dynamicsWorld); + btRigidBody* body = reinterpret_cast< btRigidBody* >(object); + assert(body); + + dynamicsWorld->addRigidBody(body); +} + +void plRemoveRigidBody(plDynamicsWorldHandle world, plRigidBodyHandle object) +{ + btDynamicsWorld* dynamicsWorld = reinterpret_cast< btDynamicsWorld* >(world); + assert(dynamicsWorld); + btRigidBody* body = reinterpret_cast< btRigidBody* >(object); + assert(body); + + dynamicsWorld->removeRigidBody(body); +} + +/* Rigid Body */ + +plRigidBodyHandle plCreateRigidBody( void* user_data, float mass, plCollisionShapeHandle cshape ) +{ + btTransform trans; + trans.setIdentity(); + btVector3 localInertia; + btCollisionShape* shape = reinterpret_cast( cshape); + assert(shape); + shape->calculateLocalInertia(mass,localInertia); + btRigidBody* body = new btRigidBody(mass, trans,shape,localInertia); + body->m_userObjectPointer = user_data; + return (plRigidBodyHandle) body; +} + +void plDeleteRigidBody(plRigidBodyHandle cbody) +{ + btRigidBody* body = reinterpret_cast< btRigidBody* >(cbody); + assert(body); + delete body; +} + + +/* Collision Shape definition */ + +plCollisionShapeHandle plNewSphereShape(plReal radius) +{ + return (plCollisionShapeHandle) new btSphereShape(radius); + +} + +plCollisionShapeHandle plNewBoxShape(plReal x, plReal y, plReal z) +{ + return (plCollisionShapeHandle) new btBoxShape(btVector3(x,y,z)); +} + +plCollisionShapeHandle plNewCapsuleShape(plReal radius, plReal height) +{ + //capsule is convex hull of 2 spheres, so use btMultiSphereShape + btVector3 inertiaHalfExtents(radius,height,radius); + const int numSpheres = 2; + btVector3 positions[numSpheres] = {btVector3(0,height,0),btVector3(0,-height,0)}; + btScalar radi[numSpheres] = {radius,radius}; + return (plCollisionShapeHandle) new btMultiSphereShape(inertiaHalfExtents,positions,radi,numSpheres); +} +plCollisionShapeHandle plNewConeShape(plReal radius, plReal height) +{ + return (plCollisionShapeHandle) new btConeShape(radius,height); +} + +plCollisionShapeHandle plNewCylinderShape(plReal radius, plReal height) +{ + return (plCollisionShapeHandle) new btCylinderShape(btVector3(radius,height,radius)); +} + +void plDeleteShape(plCollisionShapeHandle cshape) +{ + btCollisionShape* shape = reinterpret_cast( cshape); + assert(shape); + delete shape; +} +void plSetScaling(plCollisionShapeHandle cshape, plVector3 cscaling) +{ + btCollisionShape* shape = reinterpret_cast( cshape); + assert(shape); + btVector3 scaling(cscaling[0],cscaling[1],cscaling[2]); + shape->setLocalScaling(scaling); +} + + + +void plSetPosition(plRigidBodyHandle object, const plVector3 position) +{ +} +void plSetOrientation(plRigidBodyHandle object, const plQuaternion orientation) +{ +} + + +//plRigidBodyHandle plRayCast(plDynamicsWorldHandle world, const plVector3 rayStart, const plVector3 rayEnd, plVector3 hitpoint, plVector3 normal); + +// extern plRigidBodyHandle plObjectCast(plDynamicsWorldHandle world, const plVector3 rayStart, const plVector3 rayEnd, plVector3 hitpoint, plVector3 normal); diff --git a/BulletPhysics/bulletTrunk/Demos/OpenPL_Demo/OpenPL_Demo.c b/BulletPhysics/bulletTrunk/Demos/OpenPL_Demo/OpenPL_Demo.c new file mode 100644 index 00000000..cef1f76a --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/OpenPL_Demo/OpenPL_Demo.c @@ -0,0 +1,44 @@ + +#include "Bullet-C-Api.h" + + +int main() +{ + float timeStep = 1.f/60.f; + + /* initialize */ + plPhysicsSdkHandle sdk = plNewBulletSdk(); + + plDynamicsWorldHandle world = plCreateDynamicsWorld(sdk); + + + float radius = 1.f; + plCollisionShapeHandle collisionShape = plNewSphereShape(radius); + + void* user_data = 0;/* can point to a graphics object */ + + float mass = 1.f; + + plRigidBodyHandle body = plCreateRigidBody(user_data, mass, collisionShape ); + + plAddRigidBody(world, body); + + + + plStepSimulation(world,0.1f); + + /* cleanup */ + + plRemoveRigidBody(world, body); + + + plDeleteRigidBody(body); + + plDeleteShape( collisionShape); + + plDeleteDynamicsWorld( world); + + plDeletePhysicsSdk(sdk); + + return 0; +} \ No newline at end of file diff --git a/BulletPhysics/bulletTrunk/Demos/RagdollDemo/CMakeLists.txt b/BulletPhysics/bulletTrunk/Demos/RagdollDemo/CMakeLists.txt new file mode 100644 index 00000000..4f079ac6 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/RagdollDemo/CMakeLists.txt @@ -0,0 +1,25 @@ +# This is basically the overall name of the project in Visual Studio this is the name of the Solution File + + +# For every executable you have with a main method you should have an add_executable line below. +# For every add executable line you should list every .cpp and .h file you have associated with that executable. + + +# You shouldn't have to modify anything below this line +######################################################## + + + +INCLUDE_DIRECTORIES( +${BULLET_PHYSICS_SOURCE_DIR}/src ${BULLET_PHYSICS_SOURCE_DIR}/Demos/OpenGL } +) + +LINK_LIBRARIES( +OpenGLSupport BulletDynamics BulletCollision LinearMath ${GLUT_glut_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} +) + +ADD_EXECUTABLE(AppRagdollDemo + RagdollDemo.cpp + main.cpp +) + diff --git a/BulletPhysics/bulletTrunk/Demos/RagdollDemo/Jamfile b/BulletPhysics/bulletTrunk/Demos/RagdollDemo/Jamfile new file mode 100644 index 00000000..76249d3d --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/RagdollDemo/Jamfile @@ -0,0 +1,3 @@ +SubDir TOP Demos RagdollDemo ; + +BulletDemo RagdollDemo : [ Wildcard *.h *.cpp ] ; diff --git a/BulletPhysics/bulletTrunk/Demos/RagdollDemo/RagdollDemo.cpp b/BulletPhysics/bulletTrunk/Demos/RagdollDemo/RagdollDemo.cpp new file mode 100644 index 00000000..990ded4b --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/RagdollDemo/RagdollDemo.cpp @@ -0,0 +1,504 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Ragdoll Demo +Copyright (c) 2007 Starbreeze Studios + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. + +Written by: Marten Svanfeldt +*/ + +#define CONSTRAINT_DEBUG_SIZE 0.2f + + +#include "btBulletDynamicsCommon.h" +#include "GlutStuff.h" +#include "GL_ShapeDrawer.h" + +#include "LinearMath/btIDebugDraw.h" + +#include "GLDebugDrawer.h" +#include "RagdollDemo.h" + + +// Enrico: Shouldn't these three variables be real constants and not defines? + +#ifndef M_PI +#define M_PI 3.14159265358979323846 +#endif + +#ifndef M_PI_2 +#define M_PI_2 1.57079632679489661923 +#endif + +#ifndef M_PI_4 +#define M_PI_4 0.785398163397448309616 +#endif + +class RagDoll +{ + enum + { + BODYPART_PELVIS = 0, + BODYPART_SPINE, + BODYPART_HEAD, + + BODYPART_LEFT_UPPER_LEG, + BODYPART_LEFT_LOWER_LEG, + + BODYPART_RIGHT_UPPER_LEG, + BODYPART_RIGHT_LOWER_LEG, + + BODYPART_LEFT_UPPER_ARM, + BODYPART_LEFT_LOWER_ARM, + + BODYPART_RIGHT_UPPER_ARM, + BODYPART_RIGHT_LOWER_ARM, + + BODYPART_COUNT + }; + + enum + { + JOINT_PELVIS_SPINE = 0, + JOINT_SPINE_HEAD, + + JOINT_LEFT_HIP, + JOINT_LEFT_KNEE, + + JOINT_RIGHT_HIP, + JOINT_RIGHT_KNEE, + + JOINT_LEFT_SHOULDER, + JOINT_LEFT_ELBOW, + + JOINT_RIGHT_SHOULDER, + JOINT_RIGHT_ELBOW, + + JOINT_COUNT + }; + + btDynamicsWorld* m_ownerWorld; + btCollisionShape* m_shapes[BODYPART_COUNT]; + btRigidBody* m_bodies[BODYPART_COUNT]; + btTypedConstraint* m_joints[JOINT_COUNT]; + + btRigidBody* localCreateRigidBody (btScalar mass, const btTransform& startTransform, btCollisionShape* shape) + { + bool isDynamic = (mass != 0.f); + + btVector3 localInertia(0,0,0); + if (isDynamic) + shape->calculateLocalInertia(mass,localInertia); + + btDefaultMotionState* myMotionState = new btDefaultMotionState(startTransform); + + btRigidBody::btRigidBodyConstructionInfo rbInfo(mass,myMotionState,shape,localInertia); + btRigidBody* body = new btRigidBody(rbInfo); + + m_ownerWorld->addRigidBody(body); + + return body; + } + +public: + RagDoll (btDynamicsWorld* ownerWorld, const btVector3& positionOffset) + : m_ownerWorld (ownerWorld) + { + // Setup the geometry + m_shapes[BODYPART_PELVIS] = new btCapsuleShape(btScalar(0.15), btScalar(0.20)); + m_shapes[BODYPART_SPINE] = new btCapsuleShape(btScalar(0.15), btScalar(0.28)); + m_shapes[BODYPART_HEAD] = new btCapsuleShape(btScalar(0.10), btScalar(0.05)); + m_shapes[BODYPART_LEFT_UPPER_LEG] = new btCapsuleShape(btScalar(0.07), btScalar(0.45)); + m_shapes[BODYPART_LEFT_LOWER_LEG] = new btCapsuleShape(btScalar(0.05), btScalar(0.37)); + m_shapes[BODYPART_RIGHT_UPPER_LEG] = new btCapsuleShape(btScalar(0.07), btScalar(0.45)); + m_shapes[BODYPART_RIGHT_LOWER_LEG] = new btCapsuleShape(btScalar(0.05), btScalar(0.37)); + m_shapes[BODYPART_LEFT_UPPER_ARM] = new btCapsuleShape(btScalar(0.05), btScalar(0.33)); + m_shapes[BODYPART_LEFT_LOWER_ARM] = new btCapsuleShape(btScalar(0.04), btScalar(0.25)); + m_shapes[BODYPART_RIGHT_UPPER_ARM] = new btCapsuleShape(btScalar(0.05), btScalar(0.33)); + m_shapes[BODYPART_RIGHT_LOWER_ARM] = new btCapsuleShape(btScalar(0.04), btScalar(0.25)); + + // Setup all the rigid bodies + btTransform offset; offset.setIdentity(); + offset.setOrigin(positionOffset); + + btTransform transform; + transform.setIdentity(); + transform.setOrigin(btVector3(btScalar(0.), btScalar(1.), btScalar(0.))); + m_bodies[BODYPART_PELVIS] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_PELVIS]); + + transform.setIdentity(); + transform.setOrigin(btVector3(btScalar(0.), btScalar(1.2), btScalar(0.))); + m_bodies[BODYPART_SPINE] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_SPINE]); + + transform.setIdentity(); + transform.setOrigin(btVector3(btScalar(0.), btScalar(1.6), btScalar(0.))); + m_bodies[BODYPART_HEAD] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_HEAD]); + + transform.setIdentity(); + transform.setOrigin(btVector3(btScalar(-0.18), btScalar(0.65), btScalar(0.))); + m_bodies[BODYPART_LEFT_UPPER_LEG] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_LEFT_UPPER_LEG]); + + transform.setIdentity(); + transform.setOrigin(btVector3(btScalar(-0.18), btScalar(0.2), btScalar(0.))); + m_bodies[BODYPART_LEFT_LOWER_LEG] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_LEFT_LOWER_LEG]); + + transform.setIdentity(); + transform.setOrigin(btVector3(btScalar(0.18), btScalar(0.65), btScalar(0.))); + m_bodies[BODYPART_RIGHT_UPPER_LEG] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_RIGHT_UPPER_LEG]); + + transform.setIdentity(); + transform.setOrigin(btVector3(btScalar(0.18), btScalar(0.2), btScalar(0.))); + m_bodies[BODYPART_RIGHT_LOWER_LEG] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_RIGHT_LOWER_LEG]); + + transform.setIdentity(); + transform.setOrigin(btVector3(btScalar(-0.35), btScalar(1.45), btScalar(0.))); + transform.getBasis().setEulerZYX(0,0,M_PI_2); + m_bodies[BODYPART_LEFT_UPPER_ARM] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_LEFT_UPPER_ARM]); + + transform.setIdentity(); + transform.setOrigin(btVector3(btScalar(-0.7), btScalar(1.45), btScalar(0.))); + transform.getBasis().setEulerZYX(0,0,M_PI_2); + m_bodies[BODYPART_LEFT_LOWER_ARM] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_LEFT_LOWER_ARM]); + + transform.setIdentity(); + transform.setOrigin(btVector3(btScalar(0.35), btScalar(1.45), btScalar(0.))); + transform.getBasis().setEulerZYX(0,0,-M_PI_2); + m_bodies[BODYPART_RIGHT_UPPER_ARM] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_RIGHT_UPPER_ARM]); + + transform.setIdentity(); + transform.setOrigin(btVector3(btScalar(0.7), btScalar(1.45), btScalar(0.))); + transform.getBasis().setEulerZYX(0,0,-M_PI_2); + m_bodies[BODYPART_RIGHT_LOWER_ARM] = localCreateRigidBody(btScalar(1.), offset*transform, m_shapes[BODYPART_RIGHT_LOWER_ARM]); + + // Setup some damping on the m_bodies + for (int i = 0; i < BODYPART_COUNT; ++i) + { + m_bodies[i]->setDamping(0.05, 0.85); + m_bodies[i]->setDeactivationTime(0.8); + m_bodies[i]->setSleepingThresholds(1.6, 2.5); + } + + // Now setup the constraints + btHingeConstraint* hingeC; + btConeTwistConstraint* coneC; + + btTransform localA, localB; + + localA.setIdentity(); localB.setIdentity(); + localA.getBasis().setEulerZYX(0,M_PI_2,0); localA.setOrigin(btVector3(btScalar(0.), btScalar(0.15), btScalar(0.))); + localB.getBasis().setEulerZYX(0,M_PI_2,0); localB.setOrigin(btVector3(btScalar(0.), btScalar(-0.15), btScalar(0.))); + hingeC = new btHingeConstraint(*m_bodies[BODYPART_PELVIS], *m_bodies[BODYPART_SPINE], localA, localB); + hingeC->setLimit(btScalar(-M_PI_4), btScalar(M_PI_2)); + m_joints[JOINT_PELVIS_SPINE] = hingeC; + hingeC->setDbgDrawSize(CONSTRAINT_DEBUG_SIZE); + + m_ownerWorld->addConstraint(m_joints[JOINT_PELVIS_SPINE], true); + + + localA.setIdentity(); localB.setIdentity(); + localA.getBasis().setEulerZYX(0,0,M_PI_2); localA.setOrigin(btVector3(btScalar(0.), btScalar(0.30), btScalar(0.))); + localB.getBasis().setEulerZYX(0,0,M_PI_2); localB.setOrigin(btVector3(btScalar(0.), btScalar(-0.14), btScalar(0.))); + coneC = new btConeTwistConstraint(*m_bodies[BODYPART_SPINE], *m_bodies[BODYPART_HEAD], localA, localB); + coneC->setLimit(M_PI_4, M_PI_4, M_PI_2); + m_joints[JOINT_SPINE_HEAD] = coneC; + coneC->setDbgDrawSize(CONSTRAINT_DEBUG_SIZE); + + m_ownerWorld->addConstraint(m_joints[JOINT_SPINE_HEAD], true); + + + localA.setIdentity(); localB.setIdentity(); + localA.getBasis().setEulerZYX(0,0,-M_PI_4*5); localA.setOrigin(btVector3(btScalar(-0.18), btScalar(-0.10), btScalar(0.))); + localB.getBasis().setEulerZYX(0,0,-M_PI_4*5); localB.setOrigin(btVector3(btScalar(0.), btScalar(0.225), btScalar(0.))); + coneC = new btConeTwistConstraint(*m_bodies[BODYPART_PELVIS], *m_bodies[BODYPART_LEFT_UPPER_LEG], localA, localB); + coneC->setLimit(M_PI_4, M_PI_4, 0); + m_joints[JOINT_LEFT_HIP] = coneC; + coneC->setDbgDrawSize(CONSTRAINT_DEBUG_SIZE); + + m_ownerWorld->addConstraint(m_joints[JOINT_LEFT_HIP], true); + + localA.setIdentity(); localB.setIdentity(); + localA.getBasis().setEulerZYX(0,M_PI_2,0); localA.setOrigin(btVector3(btScalar(0.), btScalar(-0.225), btScalar(0.))); + localB.getBasis().setEulerZYX(0,M_PI_2,0); localB.setOrigin(btVector3(btScalar(0.), btScalar(0.185), btScalar(0.))); + hingeC = new btHingeConstraint(*m_bodies[BODYPART_LEFT_UPPER_LEG], *m_bodies[BODYPART_LEFT_LOWER_LEG], localA, localB); + hingeC->setLimit(btScalar(0), btScalar(M_PI_2)); + m_joints[JOINT_LEFT_KNEE] = hingeC; + hingeC->setDbgDrawSize(CONSTRAINT_DEBUG_SIZE); + + m_ownerWorld->addConstraint(m_joints[JOINT_LEFT_KNEE], true); + + + localA.setIdentity(); localB.setIdentity(); + localA.getBasis().setEulerZYX(0,0,M_PI_4); localA.setOrigin(btVector3(btScalar(0.18), btScalar(-0.10), btScalar(0.))); + localB.getBasis().setEulerZYX(0,0,M_PI_4); localB.setOrigin(btVector3(btScalar(0.), btScalar(0.225), btScalar(0.))); + coneC = new btConeTwistConstraint(*m_bodies[BODYPART_PELVIS], *m_bodies[BODYPART_RIGHT_UPPER_LEG], localA, localB); + coneC->setLimit(M_PI_4, M_PI_4, 0); + m_joints[JOINT_RIGHT_HIP] = coneC; + coneC->setDbgDrawSize(CONSTRAINT_DEBUG_SIZE); + + m_ownerWorld->addConstraint(m_joints[JOINT_RIGHT_HIP], true); + + localA.setIdentity(); localB.setIdentity(); + localA.getBasis().setEulerZYX(0,M_PI_2,0); localA.setOrigin(btVector3(btScalar(0.), btScalar(-0.225), btScalar(0.))); + localB.getBasis().setEulerZYX(0,M_PI_2,0); localB.setOrigin(btVector3(btScalar(0.), btScalar(0.185), btScalar(0.))); + hingeC = new btHingeConstraint(*m_bodies[BODYPART_RIGHT_UPPER_LEG], *m_bodies[BODYPART_RIGHT_LOWER_LEG], localA, localB); + hingeC->setLimit(btScalar(0), btScalar(M_PI_2)); + m_joints[JOINT_RIGHT_KNEE] = hingeC; + hingeC->setDbgDrawSize(CONSTRAINT_DEBUG_SIZE); + + m_ownerWorld->addConstraint(m_joints[JOINT_RIGHT_KNEE], true); + + + localA.setIdentity(); localB.setIdentity(); + localA.getBasis().setEulerZYX(0,0,M_PI); localA.setOrigin(btVector3(btScalar(-0.2), btScalar(0.15), btScalar(0.))); + localB.getBasis().setEulerZYX(0,0,M_PI_2); localB.setOrigin(btVector3(btScalar(0.), btScalar(-0.18), btScalar(0.))); + coneC = new btConeTwistConstraint(*m_bodies[BODYPART_SPINE], *m_bodies[BODYPART_LEFT_UPPER_ARM], localA, localB); + coneC->setLimit(M_PI_2, M_PI_2, 0); + coneC->setDbgDrawSize(CONSTRAINT_DEBUG_SIZE); + + m_joints[JOINT_LEFT_SHOULDER] = coneC; + m_ownerWorld->addConstraint(m_joints[JOINT_LEFT_SHOULDER], true); + + localA.setIdentity(); localB.setIdentity(); + localA.getBasis().setEulerZYX(0,M_PI_2,0); localA.setOrigin(btVector3(btScalar(0.), btScalar(0.18), btScalar(0.))); + localB.getBasis().setEulerZYX(0,M_PI_2,0); localB.setOrigin(btVector3(btScalar(0.), btScalar(-0.14), btScalar(0.))); + hingeC = new btHingeConstraint(*m_bodies[BODYPART_LEFT_UPPER_ARM], *m_bodies[BODYPART_LEFT_LOWER_ARM], localA, localB); +// hingeC->setLimit(btScalar(-M_PI_2), btScalar(0)); + hingeC->setLimit(btScalar(0), btScalar(M_PI_2)); + m_joints[JOINT_LEFT_ELBOW] = hingeC; + hingeC->setDbgDrawSize(CONSTRAINT_DEBUG_SIZE); + + m_ownerWorld->addConstraint(m_joints[JOINT_LEFT_ELBOW], true); + + + + localA.setIdentity(); localB.setIdentity(); + localA.getBasis().setEulerZYX(0,0,0); localA.setOrigin(btVector3(btScalar(0.2), btScalar(0.15), btScalar(0.))); + localB.getBasis().setEulerZYX(0,0,M_PI_2); localB.setOrigin(btVector3(btScalar(0.), btScalar(-0.18), btScalar(0.))); + coneC = new btConeTwistConstraint(*m_bodies[BODYPART_SPINE], *m_bodies[BODYPART_RIGHT_UPPER_ARM], localA, localB); + coneC->setLimit(M_PI_2, M_PI_2, 0); + m_joints[JOINT_RIGHT_SHOULDER] = coneC; + coneC->setDbgDrawSize(CONSTRAINT_DEBUG_SIZE); + + m_ownerWorld->addConstraint(m_joints[JOINT_RIGHT_SHOULDER], true); + + localA.setIdentity(); localB.setIdentity(); + localA.getBasis().setEulerZYX(0,M_PI_2,0); localA.setOrigin(btVector3(btScalar(0.), btScalar(0.18), btScalar(0.))); + localB.getBasis().setEulerZYX(0,M_PI_2,0); localB.setOrigin(btVector3(btScalar(0.), btScalar(-0.14), btScalar(0.))); + hingeC = new btHingeConstraint(*m_bodies[BODYPART_RIGHT_UPPER_ARM], *m_bodies[BODYPART_RIGHT_LOWER_ARM], localA, localB); +// hingeC->setLimit(btScalar(-M_PI_2), btScalar(0)); + hingeC->setLimit(btScalar(0), btScalar(M_PI_2)); + m_joints[JOINT_RIGHT_ELBOW] = hingeC; + hingeC->setDbgDrawSize(CONSTRAINT_DEBUG_SIZE); + + m_ownerWorld->addConstraint(m_joints[JOINT_RIGHT_ELBOW], true); + } + + virtual ~RagDoll () + { + int i; + + // Remove all constraints + for ( i = 0; i < JOINT_COUNT; ++i) + { + m_ownerWorld->removeConstraint(m_joints[i]); + delete m_joints[i]; m_joints[i] = 0; + } + + // Remove all bodies and shapes + for ( i = 0; i < BODYPART_COUNT; ++i) + { + m_ownerWorld->removeRigidBody(m_bodies[i]); + + delete m_bodies[i]->getMotionState(); + + delete m_bodies[i]; m_bodies[i] = 0; + delete m_shapes[i]; m_shapes[i] = 0; + } + } +}; + + + + +void RagdollDemo::initPhysics() +{ + // Setup the basic world + + setTexturing(true); + setShadows(true); + + setCameraDistance(btScalar(5.)); + + m_collisionConfiguration = new btDefaultCollisionConfiguration(); + + m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); + + btVector3 worldAabbMin(-10000,-10000,-10000); + btVector3 worldAabbMax(10000,10000,10000); + m_broadphase = new btAxisSweep3 (worldAabbMin, worldAabbMax); + + m_solver = new btSequentialImpulseConstraintSolver; + + m_dynamicsWorld = new btDiscreteDynamicsWorld(m_dispatcher,m_broadphase,m_solver,m_collisionConfiguration); + + + // Setup a big ground box + { + btCollisionShape* groundShape = new btBoxShape(btVector3(btScalar(200.),btScalar(10.),btScalar(200.))); + m_collisionShapes.push_back(groundShape); + btTransform groundTransform; + groundTransform.setIdentity(); + groundTransform.setOrigin(btVector3(0,-10,0)); + +#define CREATE_GROUND_COLLISION_OBJECT 1 +#ifdef CREATE_GROUND_COLLISION_OBJECT + btCollisionObject* fixedGround = new btCollisionObject(); + fixedGround->setCollisionShape(groundShape); + fixedGround->setWorldTransform(groundTransform); + m_dynamicsWorld->addCollisionObject(fixedGround); +#else + localCreateRigidBody(btScalar(0.),groundTransform,groundShape); +#endif //CREATE_GROUND_COLLISION_OBJECT + + } + + // Spawn one ragdoll + btVector3 startOffset(1,0.5,0); + spawnRagdoll(startOffset); + startOffset.setValue(-1,0.5,0); + spawnRagdoll(startOffset); + + clientResetScene(); +} + +void RagdollDemo::spawnRagdoll(const btVector3& startOffset) +{ + RagDoll* ragDoll = new RagDoll (m_dynamicsWorld, startOffset); + m_ragdolls.push_back(ragDoll); +} + +void RagdollDemo::clientMoveAndDisplay() +{ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + //simple dynamics world doesn't handle fixed-time-stepping + float ms = getDeltaTimeMicroseconds(); + + float minFPS = 1000000.f/60.f; + if (ms > minFPS) + ms = minFPS; + + if (m_dynamicsWorld) + { + m_dynamicsWorld->stepSimulation(ms / 1000000.f); + + //optional but useful: debug drawing + m_dynamicsWorld->debugDrawWorld(); + + + } + + renderme(); + + glFlush(); + + glutSwapBuffers(); +} + +void RagdollDemo::displayCallback() +{ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + renderme(); + + //optional but useful: debug drawing + if (m_dynamicsWorld) + m_dynamicsWorld->debugDrawWorld(); + + glFlush(); + glutSwapBuffers(); +} + +void RagdollDemo::keyboardCallback(unsigned char key, int x, int y) +{ + switch (key) + { + case 'e': + { + btVector3 startOffset(0,2,0); + spawnRagdoll(startOffset); + break; + } + default: + DemoApplication::keyboardCallback(key, x, y); + } + + +} + + + +void RagdollDemo::exitPhysics() +{ + + int i; + + for (i=0;igetNumCollisionObjects()-1; i>=0 ;i--) + { + btCollisionObject* obj = m_dynamicsWorld->getCollisionObjectArray()[i]; + btRigidBody* body = btRigidBody::upcast(obj); + if (body && body->getMotionState()) + { + delete body->getMotionState(); + } + m_dynamicsWorld->removeCollisionObject( obj ); + delete obj; + } + + //delete collision shapes + for (int j=0;j m_ragdolls; + + //keep the collision shapes, for deletion/cleanup + btAlignedObjectArray m_collisionShapes; + + btBroadphaseInterface* m_broadphase; + + btCollisionDispatcher* m_dispatcher; + + btConstraintSolver* m_solver; + + btDefaultCollisionConfiguration* m_collisionConfiguration; + +public: + void initPhysics(); + + void exitPhysics(); + + virtual ~RagdollDemo() + { + exitPhysics(); + } + + void spawnRagdoll(const btVector3& startOffset); + + virtual void clientMoveAndDisplay(); + + virtual void displayCallback(); + + virtual void keyboardCallback(unsigned char key, int x, int y); + + static DemoApplication* Create() + { + RagdollDemo* demo = new RagdollDemo(); + demo->myinit(); + demo->initPhysics(); + return demo; + } + +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Demos/RagdollDemo/main.cpp b/BulletPhysics/bulletTrunk/Demos/RagdollDemo/main.cpp new file mode 100644 index 00000000..0cbf63b9 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/RagdollDemo/main.cpp @@ -0,0 +1,31 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2008 Erwin Coumans http://bulletphysics.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#include "RagdollDemo.h" +#include "GlutStuff.h" +#include "GLDebugDrawer.h" +#include "btBulletDynamicsCommon.h" + +GLDebugDrawer gDebugDrawer; + +int main(int argc,char* argv[]) +{ + RagdollDemo demoApp; + + demoApp.initPhysics(); + demoApp.getDynamicsWorld()->setDebugDrawer(&gDebugDrawer); + + return glutmain(argc, argv,640,480,"Bullet Physics Demo. http://bulletphysics.com",&demoApp); +} diff --git a/BulletPhysics/bulletTrunk/Demos/Raytracer/Jamfile b/BulletPhysics/bulletTrunk/Demos/Raytracer/Jamfile new file mode 100644 index 00000000..b680d557 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/Raytracer/Jamfile @@ -0,0 +1,3 @@ +SubDir TOP Demos Raytracer ; + +BulletDemo Raytracer : [ Wildcard *.h *.cpp ] ; diff --git a/BulletPhysics/bulletTrunk/Demos/Raytracer/Raytracer.cpp b/BulletPhysics/bulletTrunk/Demos/Raytracer/Raytracer.cpp new file mode 100644 index 00000000..f8b04b44 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/Raytracer/Raytracer.cpp @@ -0,0 +1,578 @@ +/* +* Copyright (c) 2005 Erwin Coumans +* +* Permission to use, copy, modify, distribute and sell this software +* and its documentation for any purpose is hereby granted without fee, +* provided that the above copyright notice appear in all copies. +* Erwin Coumans makes no representations about the suitability +* of this software for any purpose. +* It is provided "as is" without express or implied warranty. +*/ + + + +#include "BulletCollision/CollisionDispatch/btCollisionWorld.h" + +/* +Raytracer uses the Convex rayCast to visualize the Collision Shapes/Minkowski Sum. +Very basic raytracer, rendering into a texture. +*/ + +///Low level demo, doesn't include btBulletCollisionCommon.h + +#include "LinearMath/btQuaternion.h" +#include "LinearMath/btTransform.h" +#include "GL_ShapeDrawer.h" +#include "GLDebugDrawer.h" + +#include "Raytracer.h" +#include "GlutStuff.h" + + +#include "BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.h" +#include "BulletCollision/NarrowPhaseCollision/btSubSimplexConvexCast.h" +#include "BulletCollision/NarrowPhaseCollision/btGjkConvexCast.h" +#include "BulletCollision/NarrowPhaseCollision/btContinuousConvexCollision.h" + +#include "BulletCollision/CollisionShapes/btSphereShape.h" +#include "BulletCollision/CollisionShapes/btMultiSphereShape.h" + +#include "BulletCollision/CollisionShapes/btConvexHullShape.h" +#include "LinearMath/btAabbUtil2.h" +#include "BulletCollision/CollisionShapes/btBoxShape.h" +#include "BulletCollision/CollisionShapes/btCompoundShape.h" + + +#include "BulletCollision/CollisionShapes/btTetrahedronShape.h" +#include "BulletCollision/CollisionShapes/btConeShape.h" +#include "BulletCollision/CollisionShapes/btCylinderShape.h" +#include "BulletCollision/CollisionShapes/btMinkowskiSumShape.h" + +#include "BulletCollision/CollisionDispatch/btDefaultCollisionConfiguration.h" +#include "BulletCollision/BroadphaseCollision/btAxisSweep3.h" + +#include "RenderTexture.h" + + + +static btVoronoiSimplexSolver simplexSolver; + +static float yaw=0.f,pitch=0.f,roll=0.f; +static const int maxNumObjects = 4; +static const int numObjects = 3; + + +static btConvexShape* shapePtr[maxNumObjects]; +static btTransform transforms[maxNumObjects]; + +renderTexture* raytracePicture = 0; + +//this applies to the raytracer virtual screen/image buffer +static int screenWidth = 100; +//float aspectRatio = (3.f/4.f); +static int screenHeight = 80;//screenWidth * aspectRatio; +GLuint glTextureId; + +btConeShape myCone(1,1); +btSphereShape mysphere(1); +btBoxShape mybox(btVector3(1,1,1)); + +btCollisionWorld* m_collisionWorld = 0; + + + +/// +/// +/// + +void Raytracer::initPhysics() +{ + m_ele = 0; + + raytracePicture = new renderTexture(screenWidth,screenHeight); + myCone.setMargin(0.2f); + + //choose shape + shapePtr[0] = &myCone; + shapePtr[1] = &mysphere; + shapePtr[2] = &mybox; + + for (int i=0;isetCollisionShape(shapePtr[s]); + obj->setWorldTransform(transforms[s]); + m_collisionWorld->addCollisionObject(obj); + } + + +} + +Raytracer::~Raytracer() +{ + + //cleanup in the reverse order of creation/initialization + + //remove the rigidbodies from the dynamics world and delete them + int i; + for (i=m_collisionWorld->getNumCollisionObjects()-1; i>=0 ;i--) + { + btCollisionObject* obj = m_collisionWorld->getCollisionObjectArray()[i]; + m_collisionWorld->removeCollisionObject( obj ); + delete obj; + } + + //delete collision world + delete m_collisionWorld; + + //delete broadphase + delete m_overlappingPairCache; + + //delete dispatcher + delete m_dispatcher; + + delete m_collisionConfiguration; + + delete raytracePicture; + raytracePicture=0; +} + +//to be implemented by the demo + +void Raytracer::clientMoveAndDisplay() +{ + displayCallback(); +} + + + + + + +bool Raytracer::worldRaytest(const btVector3& rayFrom,const btVector3& rayTo,btVector3& worldNormal,btVector3& worldHitPoint) +{ + + struct AllRayResultCallback : public btCollisionWorld::RayResultCallback + { + AllRayResultCallback(const btVector3& rayFromWorld,const btVector3& rayToWorld) + :m_rayFromWorld(rayFromWorld), + m_rayToWorld(rayToWorld) + { + } + + btVector3 m_rayFromWorld;//used to calculate hitPointWorld from hitFraction + btVector3 m_rayToWorld; + + btVector3 m_hitNormalWorld; + btVector3 m_hitPointWorld; + + virtual btScalar addSingleResult(btCollisionWorld::LocalRayResult& rayResult,bool normalInWorldSpace) + { + +//caller already does the filter on the m_closestHitFraction + btAssert(rayResult.m_hitFraction <= m_closestHitFraction); + + m_closestHitFraction = rayResult.m_hitFraction; + + m_collisionObject = rayResult.m_collisionObject; + if (normalInWorldSpace) + { + m_hitNormalWorld = rayResult.m_hitNormalLocal; + } else + { + ///need to transform normal into worldspace + m_hitNormalWorld = m_collisionObject->getWorldTransform().getBasis()*rayResult.m_hitNormalLocal; + } + m_hitPointWorld.setInterpolate3(m_rayFromWorld,m_rayToWorld,rayResult.m_hitFraction); + return 1.f; + } + }; + + + AllRayResultCallback resultCallback(rayFrom,rayTo); +// btCollisionWorld::ClosestRayResultCallback resultCallback(rayFrom,rayTo); + m_collisionWorld->rayTest(rayFrom,rayTo,resultCallback); + if (resultCallback.hasHit()) + { + worldNormal = resultCallback.m_hitNormalWorld; + return true; + } + return false; +} + + +bool Raytracer::singleObjectRaytest(const btVector3& rayFrom,const btVector3& rayTo,btVector3& worldNormal,btVector3& worldHitPoint) +{ + + btScalar closestHitResults = 1.f; + + btCollisionWorld::ClosestRayResultCallback resultCallback(rayFrom,rayTo); + + bool hasHit = false; + btConvexCast::CastResult rayResult; + btSphereShape pointShape(0.0f); + btTransform rayFromTrans; + btTransform rayToTrans; + + rayFromTrans.setIdentity(); + rayFromTrans.setOrigin(rayFrom); + rayToTrans.setIdentity(); + rayToTrans.setOrigin(rayTo); + + for (int s=0;sgetAabb(transforms[s],aabbMin,aabbMax); + btScalar hitLambda = 1.f; + btVector3 hitNormal; + btCollisionObject tmpObj; + tmpObj.setWorldTransform(transforms[s]); + + + if (btRayAabb(rayFrom,rayTo,aabbMin,aabbMax,hitLambda,hitNormal)) + { + //reset previous result + + btCollisionWorld::rayTestSingle(rayFromTrans,rayToTrans, &tmpObj, shapePtr[s], transforms[s], resultCallback); + if (resultCallback.hasHit()) + { + //float fog = 1.f - 0.1f * rayResult.m_fraction; + resultCallback.m_hitNormalWorld.normalize();//.m_normal.normalize(); + worldNormal = resultCallback.m_hitNormalWorld; + //worldNormal = transforms[s].getBasis() *rayResult.m_normal; + worldNormal.normalize(); + hasHit = true; + } + } + } + + return hasHit; +} + + +bool Raytracer::lowlevelRaytest(const btVector3& rayFrom,const btVector3& rayTo,btVector3& worldNormal,btVector3& worldHitPoint) +{ + + btScalar closestHitResults = 1.f; + + bool hasHit = false; + btConvexCast::CastResult rayResult; + btSphereShape pointShape(0.0f); + btTransform rayFromTrans; + btTransform rayToTrans; + + rayFromTrans.setIdentity(); + rayFromTrans.setOrigin(rayFrom); + rayToTrans.setIdentity(); + rayToTrans.setOrigin(rayTo); + + for (int s=0;sgetAabb(transforms[s],aabbMin,aabbMax); + btScalar hitLambda = 1.f; + btVector3 hitNormal; + btCollisionObject tmpObj; + tmpObj.setWorldTransform(transforms[s]); + + + if (btRayAabb(rayFrom,rayTo,aabbMin,aabbMax,hitLambda,hitNormal)) + { + //reset previous result + + //choose the continuous collision detection method + btSubsimplexConvexCast convexCaster(&pointShape,shapePtr[s],&simplexSolver); + //btGjkConvexCast convexCaster(&pointShape,shapePtr[s],&simplexSolver); + //btContinuousConvexCollision convexCaster(&pointShape,shapePtr[s],&simplexSolver,0); + + if (convexCaster.calcTimeOfImpact(rayFromTrans,rayToTrans,transforms[s],transforms[s],rayResult)) + { + if (rayResult.m_fraction < closestHitResults) + { + closestHitResults = rayResult.m_fraction; + + worldNormal = transforms[s].getBasis() *rayResult.m_normal; + worldNormal.normalize(); + hasHit = true; + } + } + } + } + + return hasHit; + +} + + +void Raytracer::displayCallback() +{ + + updateCamera(); + + for (int i=0;isetPixel(x,y,rgba); + } + } + + + btVector3 rayTo; + btTransform colObjWorldTransform; + colObjWorldTransform.setIdentity(); + + int mode = 0; + + for (x=0;xsetPixel(x,y,rgba); + } else + btVector4 rgba = raytracePicture->getPixel(x,y); + if (!rgba.length2()) + { + raytracePicture->setPixel(x,y,btVector4(1,1,1,1)); + } + } + } + + + + + extern BMF_FontData BMF_font_helv10; + + raytracePicture->grapicalPrintf("CCD RAYTRACER",&BMF_font_helv10); + char buffer[256]; + sprintf(buffer,"%d RAYS / Frame",screenWidth*screenHeight*numObjects); + raytracePicture->grapicalPrintf(buffer,&BMF_font_helv10,0,10); + + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glLoadIdentity(); + glFrustum(-1.0,1.0,-1.0,1.0,3,2020.0); + + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + glLoadIdentity(); // reset The Modelview Matrix + glTranslatef(0.0f,0.0f,-3.1f); // Move Into The Screen 5 Units + + + + glEnable(GL_TEXTURE_2D); + glBindTexture(GL_TEXTURE_2D,glTextureId ); + + const unsigned char *ptr = raytracePicture->getBuffer(); + glTexImage2D(GL_TEXTURE_2D, + 0, + GL_RGBA, + raytracePicture->getWidth(),raytracePicture->getHeight(), + 0, + GL_RGBA, + GL_UNSIGNED_BYTE, + ptr); + + + glEnable (GL_BLEND); + glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glColor4f (1,1,1,1); // alpha=0.5=half visible + + glBegin(GL_QUADS); + glTexCoord2f(0.0f, 0.0f); + glVertex2f(-1,1); + glTexCoord2f(1.0f, 0.0f); + glVertex2f(1,1); + glTexCoord2f(1.0f, 1.0f); + glVertex2f(1,-1); + glTexCoord2f(0.0f, 1.0f); + glVertex2f(-1,-1); + glEnd(); + + + + glMatrixMode(GL_MODELVIEW); + glPopMatrix(); + glMatrixMode(GL_PROJECTION); + glPopMatrix(); + glMatrixMode(GL_MODELVIEW); + + + glDisable(GL_TEXTURE_2D); + glDisable(GL_DEPTH_TEST); + + GL_ShapeDrawer::drawCoordSystem(); + + + + { + for (int i=0;igetAabb(transforms[i],aabbMin,aabbMax); + } + } + + glPushMatrix(); + + + + + glPopMatrix(); + + pitch += 0.005f; + yaw += 0.01f; + m_azi += 1.f; + + glFlush(); + glutSwapBuffers(); +} + diff --git a/BulletPhysics/bulletTrunk/Demos/Raytracer/Raytracer.h b/BulletPhysics/bulletTrunk/Demos/Raytracer/Raytracer.h new file mode 100644 index 00000000..1deca701 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/Raytracer/Raytracer.h @@ -0,0 +1,65 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ +#ifndef RAYTRACER_H +#define RAYTRACER_H + +#include "DemoApplication.h" + +class btDefaultCollisionConfiguration; +class btCollisionDispatcher; +class btAxisSweep3; +class btCollisionWorld; + +///Raytracer shows the inner working of the ray casting, using ray tracing rendering into a texture. +class Raytracer : public DemoApplication +{ + + btDefaultCollisionConfiguration* m_collisionConfiguration; + btCollisionDispatcher* m_dispatcher; + btAxisSweep3* m_overlappingPairCache; + btCollisionWorld* m_collisionWorld; + bool m_initialized; + + public: + + void initPhysics(); + + virtual ~Raytracer(); + + virtual void clientMoveAndDisplay(); + + virtual void displayCallback(); + + ///worldRaytest performs a ray versus all objects in a collision world, returning true is a hit is found (filling in worldNormal and worldHitPoint) + bool worldRaytest(const btVector3& rayFrom,const btVector3& rayTo,btVector3& worldNormal,btVector3& worldHitPoint); + + ///singleObjectRaytest performs a ray versus one collision shape, returning true is a hit is found (filling in worldNormal and worldHitPoint) + bool singleObjectRaytest(const btVector3& rayFrom,const btVector3& rayTo,btVector3& worldNormal,btVector3& worldHitPoint); + + ///lowlevelRaytest performs a ray versus convex shape, returning true is a hit is found (filling in worldNormal and worldHitPoint) + bool lowlevelRaytest(const btVector3& rayFrom,const btVector3& rayTo,btVector3& worldNormal,btVector3& worldHitPoint); + + static DemoApplication* Create() + { + Raytracer* demo = new Raytracer(); + demo->myinit(); + demo->initPhysics(); + return demo; + } +}; + +#endif //RAYTRACER_H + + diff --git a/BulletPhysics/bulletTrunk/Demos/Raytracer/main.cpp b/BulletPhysics/bulletTrunk/Demos/Raytracer/main.cpp new file mode 100644 index 00000000..dd515294 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/Raytracer/main.cpp @@ -0,0 +1,16 @@ + +#include "Raytracer.h" +#include "GlutStuff.h" + + +int main(int argc,char** argv) +{ + Raytracer* raytraceDemo = new Raytracer(); + + raytraceDemo->initPhysics(); + + raytraceDemo->setCameraDistance(6.f); + + return glutmain(argc, argv,640,640,"Bullet GJK Implicit Shape Raytracer Demo",raytraceDemo); +} + diff --git a/BulletPhysics/bulletTrunk/Demos/SimplexDemo/Jamfile b/BulletPhysics/bulletTrunk/Demos/SimplexDemo/Jamfile new file mode 100644 index 00000000..0d72d8a3 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/SimplexDemo/Jamfile @@ -0,0 +1,3 @@ +SubDir TOP Demos SimplexDemo ; + +BulletDemo SimplexDemo : [ Wildcard *.h *.cpp ] ; diff --git a/BulletPhysics/bulletTrunk/Demos/SimplexDemo/SimplexDemo.cpp b/BulletPhysics/bulletTrunk/Demos/SimplexDemo/SimplexDemo.cpp new file mode 100644 index 00000000..f804c73d --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/SimplexDemo/SimplexDemo.cpp @@ -0,0 +1,123 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +/* + SimplexDemo demonstrated the working of the subdistance algorithm as used in GJK. + It draws the simplex, and calculates the closest vector from simplex to the origin +*/ + +#include "GL_Simplex1to4.h" +#include "LinearMath/btQuaternion.h" +#include "LinearMath/btTransform.h" +#include "GL_ShapeDrawer.h" + +#include "BulletCollision/NarrowPhaseCollision/btVoronoiSimplexSolver.h" +#include "SimplexDemo.h" +#include "GlutStuff.h" + +btVoronoiSimplexSolver simplexSolver; + + + +float yaw=0.f,pitch=0.f,roll=0.f; +const int maxNumObjects = 4; +const int numObjects = 1; +int screenWidth = 640; +int screenHeight = 480; +/// simplex contains the vertices, and some extra code to draw and debug +GL_Simplex1to4 simplex; + + +btPolyhedralConvexShape* shapePtr[maxNumObjects]; + + +/// +/// +/// +int main(int argc,char** argv) +{ + + SimplexDemo* demo = new SimplexDemo(); + + demo->initPhysics(); + + return glutmain(argc, argv,screenWidth,screenHeight,"SimplexDemo",demo); +} + +//to be implemented by the demo + +void SimplexDemo::clientMoveAndDisplay() +{ + + displayCallback(); +} + + + +void SimplexDemo::displayCallback() +{ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + glDisable(GL_LIGHTING); + + GL_ShapeDrawer::drawCoordSystem(); + + btScalar m[16]; + int i; + + btVector3 worldBoundsMin(-1000,-1000,-1000); + btVector3 worldBoundsMax(1000,1000,1000); + + for (i=0;idrawOpenGL(m,shapePtr[i],btVector3(1,1,1),getDebugMode(),worldBoundsMin,worldBoundsMax); + + /// calculate closest point from simplex to the origin, and draw this vector + simplex.calcClosest(m); + + } + pitch += 0.005f; + yaw += 0.01f; + + glFlush(); + glutSwapBuffers(); +} + +void SimplexDemo::initPhysics() +{ + + simplex.setSimplexSolver(&simplexSolver); + + simplex.addVertex(btVector3(-2,0,-2)); + simplex.addVertex(btVector3(2,0,-2)); + simplex.addVertex(btVector3(0,0,2)); + simplex.addVertex(btVector3(0,2,0)); + + shapePtr[0] = &simplex; + + btTransform tr; + tr.setIdentity(); +} + + diff --git a/BulletPhysics/bulletTrunk/Demos/SimplexDemo/SimplexDemo.h b/BulletPhysics/bulletTrunk/Demos/SimplexDemo/SimplexDemo.h new file mode 100644 index 00000000..e113cfa9 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/SimplexDemo/SimplexDemo.h @@ -0,0 +1,36 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ +#ifndef SIMPLEX_DEMO_H +#define SIMPLEX_DEMO_H + +#include "DemoApplication.h" + +///SimplexDemo shows the working of the sub-distance algorithm, used inside GJK +class SimplexDemo : public DemoApplication +{ + public: + + void initPhysics(); + + virtual void clientMoveAndDisplay(); + + virtual void displayCallback(); + + +}; + +#endif //SIMPLEX_DEMO_H + + diff --git a/BulletPhysics/bulletTrunk/Demos/SliderConstraintDemo/CMakeLists.txt b/BulletPhysics/bulletTrunk/Demos/SliderConstraintDemo/CMakeLists.txt new file mode 100644 index 00000000..5a5653f2 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/SliderConstraintDemo/CMakeLists.txt @@ -0,0 +1,26 @@ +# This is basically the overall name of the project in Visual Studio this is the name of the Solution File + + +# For every executable you have with a main method you should have an add_executable line below. +# For every add executable line you should list every .cpp and .h file you have associated with that executable. + + + +# You shouldn't have to modify anything below this line +######################################################## + + + +INCLUDE_DIRECTORIES( +${BULLET_PHYSICS_SOURCE_DIR}/src ${BULLET_PHYSICS_SOURCE_DIR}/Demos/OpenGL } +) + +LINK_LIBRARIES( +OpenGLSupport BulletDynamics BulletCollision LinearMath ${GLUT_glut_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} +) + +ADD_EXECUTABLE(AppSliderConstraintDemo + SliderConstraintDemo.cpp + main.cpp +) + diff --git a/BulletPhysics/bulletTrunk/Demos/SliderConstraintDemo/Jamfile b/BulletPhysics/bulletTrunk/Demos/SliderConstraintDemo/Jamfile new file mode 100644 index 00000000..c78fd19e --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/SliderConstraintDemo/Jamfile @@ -0,0 +1,3 @@ +SubDir TOP Demos SliderConstraintDemo ; + +BulletDemo SliderConstraintDemo : [ Wildcard *.h *.cpp ] ; diff --git a/BulletPhysics/bulletTrunk/Demos/SliderConstraintDemo/SliderConstraintDemo.cpp b/BulletPhysics/bulletTrunk/Demos/SliderConstraintDemo/SliderConstraintDemo.cpp new file mode 100644 index 00000000..18fab719 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/SliderConstraintDemo/SliderConstraintDemo.cpp @@ -0,0 +1,439 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +/* +Added by Roman Ponomarev (rponom@gmail.com) +April 04, 2008 + +Added support for ODE sover +April 24, 2008 +*/ + +//----------------------------------------------------------------------------- + + +#include "btBulletDynamicsCommon.h" +#include "LinearMath/btIDebugDraw.h" + +#include "GLDebugDrawer.h" + +#include "BMF_Api.h" +#include //printf debugging + +#include "SliderConstraintDemo.h" +#include "GL_ShapeDrawer.h" +#include "GlutStuff.h" + +//----------------------------------------------------------------------------- + +#define SLIDER_DEMO_USE_ODE_SOLVER 0 +#define SLIDER_DEMO_USE_6DOF 0 + +#define CUBE_HALF_EXTENTS 1.f + +//----------------------------------------------------------------------------- + +// A couple of sliders +#if SLIDER_DEMO_USE_6DOF + static btGeneric6DofConstraint *spSlider1, *spSlider2; +#else + static btSliderConstraint *spSlider1, *spSlider2; +#endif + +static btPoint2PointConstraint* spP2PConst; +static btHingeConstraint* spHingeConst; + +//----------------------------------------------------------------------------- + +static void draw_axes(const btRigidBody& rb, const btTransform& frame) +{ + glBegin(GL_LINES); + // draw world transform + btVector3 from = rb.getWorldTransform().getOrigin(); + btVector3 to = from + rb.getWorldTransform().getBasis() * btVector3(5,0,0); + // X in red + glColor3f(255.0F, 0.0F, 0.0F); + glVertex3d(from.getX(), from.getY(), from.getZ()); + glVertex3d(to.getX(), to.getY(), to.getZ()); + to = from + rb.getWorldTransform().getBasis() * btVector3(0,5,0); + // Y in green + glColor3f(0.0F, 255.0F, 0.0F); + glVertex3d(from.getX(), from.getY(), from.getZ()); + glVertex3d(to.getX(), to.getY(), to.getZ()); + to = from + rb.getWorldTransform().getBasis() * btVector3(0,0,5); + // Z in blue + glColor3f(0.0F, 0.0F, 255.0F); + glVertex3d(from.getX(), from.getY(), from.getZ()); + glVertex3d(to.getX(), to.getY(), to.getZ()); + // draw slider frame + btTransform calc_frame = rb.getWorldTransform() * frame; + from = calc_frame.getOrigin(); + to = from + calc_frame.getBasis() * btVector3(10,0,0); + // X in red + glColor3f(255.0F, 0.0F, 0.0F); + glVertex3d(from.getX(), from.getY(), from.getZ()); + glVertex3d(to.getX(), to.getY(), to.getZ()); + to = from + calc_frame.getBasis() * btVector3(0,10,0); + // Y in green + glColor3f(0.0F, 255.0F, 0.0F); + glVertex3d(from.getX(), from.getY(), from.getZ()); + glVertex3d(to.getX(), to.getY(), to.getZ()); + to = from + calc_frame.getBasis() * btVector3(0,0,10); + // Z in blue + glColor3f(0.0F, 0.0F, 255.0F); + glVertex3d(from.getX(), from.getY(), from.getZ()); + glVertex3d(to.getX(), to.getY(), to.getZ()); + glEnd(); +} // draw_axes() + +//----------------------------------------------------------------------------- + +#if SLIDER_DEMO_USE_6DOF +static void drawSlider(btGeneric6DofConstraint* pSlider) +{ + draw_axes(pSlider->getRigidBodyA(), pSlider->getFrameOffsetA()); + draw_axes(pSlider->getRigidBodyB(), pSlider->getFrameOffsetB()); +} // drawSlider() +#else +static void drawSlider(btSliderConstraint* pSlider) +{ + draw_axes(pSlider->getRigidBodyA(), pSlider->getFrameOffsetA()); + draw_axes(pSlider->getRigidBodyB(), pSlider->getFrameOffsetB()); + // draw limits in white + btVector3 from(pSlider->getLowerLinLimit(), 0, 0); + btVector3 to(pSlider->getUpperLinLimit(), 0, 0); + btTransform trans; + if(pSlider->getUseLinearReferenceFrameA()) + { + trans = pSlider->getRigidBodyA().getWorldTransform() * pSlider->getFrameOffsetA(); + } + else + { + trans = pSlider->getRigidBodyB().getWorldTransform() * pSlider->getFrameOffsetB(); + } + from = trans * from; + to = trans * to; + glBegin(GL_LINES); + glColor3f(255.0F, 255.0F, 255.0F); + glVertex3d(from.getX(), from.getY(), from.getZ()); + glVertex3d(to.getX(), to.getY(), to.getZ()); + glEnd(); +} // drawSlider() +#endif + +//----------------------------------------------------------------------------- + +void SliderConstraintDemo::initPhysics() +{ + setTexturing(true); + setShadows(true); + + setCameraDistance(26.f); + + // init world + m_collisionConfiguration = new btDefaultCollisionConfiguration(); + m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); + btVector3 worldMin(-1000,-1000,-1000); + btVector3 worldMax(1000,1000,1000); + m_overlappingPairCache = new btAxisSweep3(worldMin,worldMax); + +#if SLIDER_DEMO_USE_ODE_SOLVER + m_constraintSolver = new btOdeQuickstepConstraintSolver(); +#else + m_constraintSolver = new btSequentialImpulseConstraintSolver(); +#endif + + btDiscreteDynamicsWorld* wp = new btDiscreteDynamicsWorld(m_dispatcher,m_overlappingPairCache,m_constraintSolver,m_collisionConfiguration); + // wp->getSolverInfo().m_numIterations = 20; // default is 10 + m_dynamicsWorld = wp; +// wp->getSolverInfo().m_erp = 0.8; + + // add floor + //btCollisionShape* groundShape = new btStaticPlaneShape(btVector3(0,1,0),50); + btCollisionShape* groundShape = new btBoxShape(btVector3(btScalar(50.),btScalar(50.),btScalar(50.))); + m_collisionShapes.push_back(groundShape); + btTransform groundTransform; + groundTransform.setIdentity(); + groundTransform.setOrigin(btVector3(0,-56,0)); + btRigidBody* groundBody = localCreateRigidBody(0, groundTransform, groundShape); + + // add box shape (will be reused for all bodies) + btCollisionShape* shape = new btBoxShape(btVector3(CUBE_HALF_EXTENTS,CUBE_HALF_EXTENTS,CUBE_HALF_EXTENTS)); + m_collisionShapes.push_back(shape); + // mass of dymamic bodies + btScalar mass = btScalar(1.); + + // add dynamic rigid body A1 + btTransform trans; + trans.setIdentity(); + btVector3 worldPos(0,0,0); + trans.setOrigin(worldPos); + btRigidBody* pRbA1 = localCreateRigidBody(mass, trans, shape); + pRbA1->setActivationState(DISABLE_DEACTIVATION); + + // add dynamic rigid body B1 + worldPos.setValue(-10,0,0); + trans.setOrigin(worldPos); + btRigidBody* pRbB1 = localCreateRigidBody(mass, trans, shape); + pRbB1->setActivationState(DISABLE_DEACTIVATION); + + // create slider constraint between A1 and B1 and add it to world + btTransform frameInA, frameInB; + frameInA = btTransform::getIdentity(); + frameInB = btTransform::getIdentity(); + +#if SLIDER_DEMO_USE_6DOF + spSlider1 = new btGeneric6DofConstraint(*pRbA1, *pRbB1, frameInA, frameInB, true); + btVector3 lowerSliderLimit = btVector3(-20,0,0); + btVector3 hiSliderLimit = btVector3(-10,0,0); +// btVector3 lowerSliderLimit = btVector3(-20,-5,-5); +// btVector3 hiSliderLimit = btVector3(-10,5,5); + spSlider1->setLinearLowerLimit(lowerSliderLimit); + spSlider1->setLinearUpperLimit(hiSliderLimit); + spSlider1->setAngularLowerLimit(btVector3(0,0,0)); + spSlider1->setAngularUpperLimit(btVector3(0,0,0)); +#else + spSlider1 = new btSliderConstraint(*pRbA1, *pRbB1, frameInA, frameInB, true); +// spSlider1 = new btSliderConstraint(*pRbA1, *pRbB1, frameInA, frameInB, false); + spSlider1->setLowerLinLimit(-15.0F); + spSlider1->setUpperLinLimit(-5.0F); +// spSlider1->setLowerLinLimit(5.0F); +// spSlider1->setUpperLinLimit(15.0F); +// spSlider1->setLowerLinLimit(-10.0F); +// spSlider1->setUpperLinLimit(-10.0F); + spSlider1->setLowerAngLimit(-SIMD_PI / 3.0F); + spSlider1->setUpperAngLimit( SIMD_PI / 3.0F); +#endif + + m_dynamicsWorld->addConstraint(spSlider1, true); + + // add kinematic rigid body A2 + worldPos.setValue(0,2,0); + trans.setOrigin(worldPos); + btRigidBody* pRbA2 = localCreateRigidBody(0., trans, shape); + pRbA2->setActivationState(DISABLE_DEACTIVATION); + + // add dynamic rigid body B2 + worldPos.setValue(-10,2,0); + trans.setOrigin(worldPos); + btRigidBody* pRbB2 = localCreateRigidBody(mass, trans, shape); + pRbB2->setActivationState(DISABLE_DEACTIVATION); + + // create slider constraint between A2 and B2 and add it to world +#if SLIDER_DEMO_USE_6DOF + spSlider2 = new btGeneric6DofConstraint(*pRbA2, *pRbB2, frameInA, frameInB, true); + spSlider2->setLinearLowerLimit(lowerSliderLimit); + spSlider2->setLinearUpperLimit(hiSliderLimit); + spSlider2->setAngularLowerLimit(btVector3(0,0,0)); + spSlider2->setAngularUpperLimit(btVector3(0,0,0)); +#else + spSlider2 = new btSliderConstraint(*pRbA2, *pRbB2, frameInA, frameInB, true); +// spSlider2 = new btSliderConstraint(*pRbA2, *pRbB2, frameInA, frameInB, false); + spSlider2->setLowerLinLimit(-25.0F); + spSlider2->setUpperLinLimit(-5.0F); +// spSlider2->setLowerLinLimit(5.0F); +// spSlider2->setUpperLinLimit(25.0F); +// spSlider2->setUpperLinLimit(-5.0F); +// spSlider2->setUpperLinLimit(-9.99F); + + +// spSlider2->setLowerAngLimit(SIMD_PI / 2.0F); +// spSlider2->setUpperAngLimit(-SIMD_PI / 2.0F); + spSlider2->setLowerAngLimit(-SIMD_PI / 2.0F); + spSlider2->setUpperAngLimit(SIMD_PI / 2.0F); +// spSlider2->setLowerAngLimit(-0.01F); +// spSlider2->setUpperAngLimit(0.01F); + + +// spSlider2->setDampingLimLin(0.5f); + +#if 0 + // add motors + spSlider2->setPoweredLinMotor(true); + spSlider2->setMaxLinMotorForce(0.1); + spSlider2->setTargetLinMotorVelocity(-5.0); + + spSlider2->setPoweredAngMotor(true); +// spSlider2->setMaxAngMotorForce(0.01); + spSlider2->setMaxAngMotorForce(10.0); + spSlider2->setTargetAngMotorVelocity(1.0); + + // change default damping and restitution + + spSlider2->setDampingDirLin(0.005F); + spSlider2->setRestitutionLimLin(1.1F); +#endif + + // various ODE tests +// spSlider2->setDampingLimLin(0.1F); // linear bounce factor for ODE == 1.0 - DampingLimLin; +// spSlider2->setDampingLimAng(0.1F); // angular bounce factor for ODE == 1.0 - DampingLimAng; +// spSlider2->setSoftnessOrthoAng(0.1); +// spSlider2->setSoftnessOrthoLin(0.1); +// spSlider2->setSoftnessLimLin(0.1); +// spSlider2->setSoftnessLimAng(0.1); +#endif + m_dynamicsWorld->addConstraint(spSlider2, true); + + +#if 1 +{ + // add dynamic rigid body A1 + trans.setIdentity(); + worldPos.setValue(20,0,0); + trans.setOrigin(worldPos); + btRigidBody* pRbA3 = localCreateRigidBody(0.0F, trans, shape); + pRbA1->setActivationState(DISABLE_DEACTIVATION); + + // add dynamic rigid body B1 + worldPos.setValue(25,0,0); + trans.setOrigin(worldPos); + btRigidBody* pRbB3 = localCreateRigidBody(mass, trans, shape); + pRbB1->setActivationState(DISABLE_DEACTIVATION); + + btVector3 pivA( 2.5, 0., 0.); + btVector3 pivB(-2.5, 0., 0.); + spP2PConst = new btPoint2PointConstraint(*pRbA3, *pRbB3, pivA, pivB); + m_dynamicsWorld->addConstraint(spP2PConst, true); +} +#endif + +#if 1 + // add dynamic rigid body A4 + trans.setIdentity(); + worldPos.setValue(20,10,0); + trans.setOrigin(worldPos); + btRigidBody* pRbA4 = localCreateRigidBody(0.0F, trans, shape); + pRbA4->setActivationState(DISABLE_DEACTIVATION); + + // add dynamic rigid body B1 + worldPos.setValue(27,10,0); + trans.setOrigin(worldPos); + btRigidBody* pRbB4 = localCreateRigidBody(mass, trans, shape); + pRbB1->setActivationState(DISABLE_DEACTIVATION); + + + btVector3 pivA( 2., 0., 0.); + btVector3 pivB(-5., 0., 0.); + btVector3 axisA(0., 0., 1.); + btVector3 axisB(0., 0., 1.); + + spHingeConst = new btHingeConstraint(*pRbA4, *pRbB4, pivA, pivB, axisA, axisB); +// spHingeConst->setLimit(-1.57, 1.57); + spHingeConst->setLimit(1.57, -1.57); + spHingeConst->enableAngularMotor(true, 10.0, 0.19); + + m_dynamicsWorld->addConstraint(spHingeConst, true); +#endif + +} // SliderConstraintDemo::initPhysics() + +//----------------------------------------------------------------------------- + +SliderConstraintDemo::~SliderConstraintDemo() +{ + //cleanup in the reverse order of creation/initialization + int i; + //removed/delete constraints + for (i=m_dynamicsWorld->getNumConstraints()-1; i>=0 ;i--) + { + btTypedConstraint* constraint = m_dynamicsWorld->getConstraint(i); + m_dynamicsWorld->removeConstraint(constraint); + delete constraint; + } + //remove the rigidbodies from the dynamics world and delete them + for (i=m_dynamicsWorld->getNumCollisionObjects()-1; i>=0 ;i--) + { + btCollisionObject* obj = m_dynamicsWorld->getCollisionObjectArray()[i]; + btRigidBody* body = btRigidBody::upcast(obj); + if (body && body->getMotionState()) + { + delete body->getMotionState(); + } + m_dynamicsWorld->removeCollisionObject( obj ); + delete obj; + } + //delete collision shapes + for (int j=0;jstepSimulation(dt,maxSimSubSteps); + //optional but useful: debug drawing + m_dynamicsWorld->debugDrawWorld(); + bool verbose = false; + if (verbose) + { + if (!numSimSteps) + printf("Interpolated transforms\n"); + else + { + if (numSimSteps > maxSimSubSteps) + { + //detect dropping frames + printf("Dropped (%i) simulation steps out of %i\n",numSimSteps - maxSimSubSteps,numSimSteps); + } else + { + printf("Simulated (%i) steps\n",numSimSteps); + } + } + } + renderme(); +// drawSlider(spSlider1); +// drawSlider(spSlider2); + glFlush(); + glutSwapBuffers(); +} // SliderConstraintDemo::clientMoveAndDisplay() + +//----------------------------------------------------------------------------- + +void SliderConstraintDemo::displayCallback(void) +{ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + if(m_dynamicsWorld) + { + m_dynamicsWorld->debugDrawWorld(); + } +// drawSlider(spSlider1); +// drawSlider(spSlider2); + renderme(); + glFlush(); + glutSwapBuffers(); +} // SliderConstraintDemo::displayCallback() + +//----------------------------------------------------------------------------- diff --git a/BulletPhysics/bulletTrunk/Demos/SliderConstraintDemo/SliderConstraintDemo.h b/BulletPhysics/bulletTrunk/Demos/SliderConstraintDemo/SliderConstraintDemo.h new file mode 100644 index 00000000..7987a93b --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/SliderConstraintDemo/SliderConstraintDemo.h @@ -0,0 +1,71 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +//----------------------------------------------------------------------------- + +#ifndef SLIDER_CONSTRAINT_DEMO_H +#define SLIDER_CONSTRAINT_DEMO_H + +//----------------------------------------------------------------------------- + +#include "btBulletDynamicsCommon.h" +#include "BulletDynamics/ConstraintSolver/btSliderConstraint.h" +#include "DemoApplication.h" + +//----------------------------------------------------------------------------- + + +/// SliderConstraintDemo shows how to create a slider constraint +class SliderConstraintDemo : public DemoApplication +{ + //keep track of variables to delete memory at the end + btAlignedObjectArray m_collisionShapes; + + class btBroadphaseInterface* m_overlappingPairCache; + + class btCollisionDispatcher* m_dispatcher; + + class btConstraintSolver* m_constraintSolver; + + class btDefaultCollisionConfiguration* m_collisionConfiguration; + + public: + + virtual ~SliderConstraintDemo(); + + void initPhysics(); + + void initModel(); + + void drawSliders(); + void drawSliderConstraint(btSliderConstraint* constraint); + + + virtual void clientMoveAndDisplay(); + + virtual void displayCallback(); + + static DemoApplication* Create() + { + SliderConstraintDemo* demo = new SliderConstraintDemo(); + demo->myinit(); + demo->initPhysics(); + return demo; + } + +}; + +#endif //SLIDER_CONSTRAINT_DEMO_H + diff --git a/BulletPhysics/bulletTrunk/Demos/SliderConstraintDemo/main.cpp b/BulletPhysics/bulletTrunk/Demos/SliderConstraintDemo/main.cpp new file mode 100644 index 00000000..f84bee37 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/SliderConstraintDemo/main.cpp @@ -0,0 +1,24 @@ +/* +Added by Roman Ponomarev (rponom@gmail.com) +April 04, 2008 +*/ +#include "SliderConstraintDemo.h" +#include "GlutStuff.h" + +#include "GLDebugDrawer.h" +#include "btBulletDynamicsCommon.h" + +GLDebugDrawer gDebugDrawer; + +int main(int argc,char** argv) +{ + + SliderConstraintDemo* sliderConstraintDemo = new SliderConstraintDemo(); + + sliderConstraintDemo->initPhysics(); + sliderConstraintDemo->getDynamicsWorld()->setDebugDrawer(&gDebugDrawer); + + + return glutmain(argc, argv,640,480,"Slider Constraint Demo. http://www.continuousphysics.com/Bullet/phpBB2/", sliderConstraintDemo); +} + diff --git a/BulletPhysics/bulletTrunk/Demos/SoftDemo/CMakeLists.txt b/BulletPhysics/bulletTrunk/Demos/SoftDemo/CMakeLists.txt new file mode 100644 index 00000000..5e7941f7 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/SoftDemo/CMakeLists.txt @@ -0,0 +1,27 @@ +# This is basically the overall name of the project in Visual Studio this is the name of the Solution File + + +# For every executable you have with a main method you should have an add_executable line below. +# For every add executable line you should list every .cpp and .h file you have associated with that executable. + + + + +# You shouldn't have to modify anything below this line +######################################################## + + + +INCLUDE_DIRECTORIES( +${BULLET_PHYSICS_SOURCE_DIR}/src ${BULLET_PHYSICS_SOURCE_DIR}/Demos/OpenGL } +) + +LINK_LIBRARIES( +OpenGLSupport BulletSoftBody BulletDynamics BulletCollision LinearMath ${GLUT_glut_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} +) + +ADD_EXECUTABLE(AppSoftBodyDemo + main.cpp + SoftDemo.cpp +) + diff --git a/BulletPhysics/bulletTrunk/Demos/SoftDemo/Jamfile b/BulletPhysics/bulletTrunk/Demos/SoftDemo/Jamfile new file mode 100644 index 00000000..d7abfa02 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/SoftDemo/Jamfile @@ -0,0 +1,3 @@ +SubDir TOP Demos SoftDemo ; + +BulletSoftBodyDemo SoftBodyDemo : [ Wildcard *.h *.cpp ] ; diff --git a/BulletPhysics/bulletTrunk/Demos/SoftDemo/Makefile.am b/BulletPhysics/bulletTrunk/Demos/SoftDemo/Makefile.am new file mode 100644 index 00000000..a17afb82 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/SoftDemo/Makefile.am @@ -0,0 +1,5 @@ +noinst_PROGRAMS=SoftDemo + +SoftDemo_SOURCES=SoftDemo.cpp SoftDemo.h main.cpp +SoftDemo_CXXFLAGS=-I@top_builddir@/src -I@top_builddir@/Demos/OpenGL $(CXXFLAGS) +SoftDemo_LDADD=-L../OpenGL -lbulletopenglsupport -L../../src -lbulletsoftbody -lbulletdynamics -lbulletcollision -lbulletmath @opengl_LIBS@ diff --git a/BulletPhysics/bulletTrunk/Demos/SoftDemo/SoftDemo.cpp b/BulletPhysics/bulletTrunk/Demos/SoftDemo/SoftDemo.cpp new file mode 100644 index 00000000..2a313b98 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/SoftDemo/SoftDemo.cpp @@ -0,0 +1,1800 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +///btSoftBody implementation by Nathanael Presson + + +#include "btBulletDynamicsCommon.h" +#include "BulletSoftBody/btSoftRigidDynamicsWorld.h" + +#include "BulletCollision/CollisionDispatch/btSphereSphereCollisionAlgorithm.h" +#include "BulletCollision/NarrowPhaseCollision/btGjkEpa2.h" +#include "LinearMath/btQuickprof.h" +#include "LinearMath/btIDebugDraw.h" +#include "BMF_Api.h" +#include "../GimpactTestDemo/BunnyMesh.h" +#include "../GimpactTestDemo/TorusMesh.h" +#include //printf debugging +#include "LinearMath/btConvexHull.h" +#include "BulletSoftBody/btSoftBodyRigidBodyCollisionConfiguration.h" +#include "BulletSoftBody/btSoftBodyHelpers.h" + +#include "SoftDemo.h" +#include "GL_ShapeDrawer.h" + +#include "GlutStuff.h" + +extern float eye[3]; +extern int glutScreenWidth; +extern int glutScreenHeight; + +const int maxProxies = 32766; +const int maxOverlap = 65535; + +static btVector3* gGroundVertices=0; +static int* gGroundIndices=0; +static btBvhTriangleMeshShape* trimeshShape =0; +static btRigidBody* staticBody = 0; +static float waveheight = 5.f; + +const float TRIANGLE_SIZE=8.f; + + + +#ifdef _DEBUG +const int gNumObjects = 1; +#else +const int gNumObjects = 1;//try this in release mode: 3000. never go above 16384, unless you increate maxNumObjects value in DemoApplication.cp +#endif + +const int maxNumObjects = 32760; + +#define CUBE_HALF_EXTENTS 1.5 +#define EXTRA_HEIGHT -10.f + +// +void SoftDemo::createStack( btCollisionShape* boxShape, float halfCubeSize, int size, float zPos ) +{ + btTransform trans; + trans.setIdentity(); + + for(int i=0; i0) + { + const btScalar num=O-dot(N,rayFrom); + const btScalar hit=num/den; + if((hit>0)&&(hit<1500)) + { + m_goal=rayFrom+rayDir*hit; + } + } + btVector3 delta=m_goal-m_node->m_x; + static const btScalar maxdrag=10; + if(delta.length2()>(maxdrag*maxdrag)) + { + delta=delta.normalized()*maxdrag; + } + m_node->m_v+=delta/dt; + } + +#define FIXED_STEP +#ifdef FIXED_STEP + m_dynamicsWorld->stepSimulation(dt=1.0f/60.f,0); + +#else + //during idle mode, just run 1 simulation step maximum, otherwise 4 at max + int maxSimSubSteps = m_idle ? 1 : 4; + //if (m_idle) + // dt = 1.0/420.f; + + int numSimSteps; + numSimSteps = m_dynamicsWorld->stepSimulation(dt); + +#ifdef VERBOSE_TIMESTEPPING_CONSOLEOUTPUT + if (!numSimSteps) + printf("Interpolated transforms\n"); + else + { + if (numSimSteps > maxSimSubSteps) + { + //detect dropping frames + printf("Dropped (%i) simulation steps out of %i\n",numSimSteps - maxSimSubSteps,numSimSteps); + } else + { + printf("Simulated (%i) steps\n",numSimSteps); + } + } +#endif //VERBOSE_TIMESTEPPING_CONSOLEOUTPUT + +#endif + + if(m_drag) + { + m_node->m_v*=0; + } + + m_softBodyWorldInfo.m_sparsesdf.GarbageCollect(); + + //optional but useful: debug drawing + + } + +#ifdef USE_QUICKPROF + btProfiler::beginBlock("render"); +#endif //USE_QUICKPROF + + renderme(); + + //render the graphics objects, with center of mass shift + + updateCamera(); + + + +#ifdef USE_QUICKPROF + btProfiler::endBlock("render"); +#endif + glFlush(); + //some additional debugging info +#ifdef PRINT_CONTACT_STATISTICS + printf("num manifolds: %i\n",gNumManifold); + printf("num gOverlappingPairs: %i\n",gOverlappingPairs); + +#endif //PRINT_CONTACT_STATISTICS + + + glutSwapBuffers(); + +} + + + +void SoftDemo::displayCallback(void) { + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + + renderme(); + + glFlush(); + glutSwapBuffers(); +} + + +// +// ImplicitShape +// + +// +struct ImplicitSphere : btSoftBody::ImplicitFn +{ + btVector3 center; + btScalar sqradius; + ImplicitSphere() {} + ImplicitSphere(const btVector3& c,btScalar r) : center(c),sqradius(r*r) {} + btScalar Eval(const btVector3& x) + { + return((x-center).length2()-sqradius); + } +}; + +// +// Tetra meshes +// + +struct TetraBunny +{ +#include "bunny.inl" +}; + +struct TetraCube +{ +#include "cube.inl" +}; + + +// +// Random +// + +static inline btScalar UnitRand() +{ + return(rand()/(btScalar)RAND_MAX); +} + +static inline btScalar SignedUnitRand() +{ + return(UnitRand()*2-1); +} + +static inline btVector3 Vector3Rand() +{ + const btVector3 p=btVector3(SignedUnitRand(),SignedUnitRand(),SignedUnitRand()); + return(p.normalized()); +} + +// +// Rb rain +// +static void Ctor_RbUpStack(SoftDemo* pdemo,int count) +{ + float mass=10; + + btCompoundShape* cylinderCompound = new btCompoundShape; + btCollisionShape* cylinderShape = new btCylinderShapeX(btVector3(4,1,1)); + btCollisionShape* boxShape = new btBoxShape(btVector3(4,1,1)); + btTransform localTransform; + localTransform.setIdentity(); + cylinderCompound->addChildShape(localTransform,boxShape); + btQuaternion orn(SIMD_HALF_PI,0,0); + localTransform.setRotation(orn); + // localTransform.setOrigin(btVector3(1,1,1)); + cylinderCompound->addChildShape(localTransform,cylinderShape); + + + btCollisionShape* shape[]={ cylinderCompound, + new btSphereShape(1.5), + new btBoxShape(btVector3(1,1,1)) + }; + static const int nshapes=sizeof(shape)/sizeof(shape[0]); + for(int i=0;ilocalCreateRigidBody(mass,startTransform,shape[i%nshapes]); + } +} + +// +// Big ball +// +static void Ctor_BigBall(SoftDemo* pdemo,btScalar mass=10) +{ + btTransform startTransform; + startTransform.setIdentity(); + startTransform.setOrigin(btVector3(0,13,0)); + pdemo->localCreateRigidBody(mass,startTransform,new btSphereShape(3)); +} + +// +// Big plate +// +static btRigidBody* Ctor_BigPlate(SoftDemo* pdemo,btScalar mass=15,btScalar height=4) +{ + btTransform startTransform; + startTransform.setIdentity(); + startTransform.setOrigin(btVector3(0,height,0.5)); + btRigidBody* body=pdemo->localCreateRigidBody(mass,startTransform,new btBoxShape(btVector3(5,1,5))); + body->setFriction(1); + return(body); +} + +// +// Linear stair +// +static void Ctor_LinearStair(SoftDemo* pdemo,const btVector3& org,const btVector3& sizes,btScalar angle,int count) +{ + btBoxShape* shape=new btBoxShape(sizes); + for(int i=0;ilocalCreateRigidBody(0,startTransform,shape); + body->setFriction(1); + } +} + +// +// Softbox +// +static btSoftBody* Ctor_SoftBox(SoftDemo* pdemo,const btVector3& p,const btVector3& s) +{ + const btVector3 h=s*0.5; + const btVector3 c[]={ p+h*btVector3(-1,-1,-1), + p+h*btVector3(+1,-1,-1), + p+h*btVector3(-1,+1,-1), + p+h*btVector3(+1,+1,-1), + p+h*btVector3(-1,-1,+1), + p+h*btVector3(+1,-1,+1), + p+h*btVector3(-1,+1,+1), + p+h*btVector3(+1,+1,+1)}; + btSoftBody* psb=btSoftBodyHelpers::CreateFromConvexHull(pdemo->m_softBodyWorldInfo,c,8); + psb->generateBendingConstraints(2); + pdemo->getSoftDynamicsWorld()->addSoftBody(psb); + + return(psb); + +} + +// +// SoftBoulder +// +static btSoftBody* Ctor_SoftBoulder(SoftDemo* pdemo,const btVector3& p,const btVector3& s,int np,int id) +{ + btAlignedObjectArray pts; + if(id) srand(id); + for(int i=0;im_softBodyWorldInfo,&pts[0],pts.size()); + psb->generateBendingConstraints(2); + pdemo->getSoftDynamicsWorld()->addSoftBody(psb); + + return(psb); +} + +//#define TRACEDEMO { pdemo->demoname=__FUNCTION__+5;printf("Launching demo: " __FUNCTION__ "\r\n"); } + +// +// Basic ropes +// +static void Init_Ropes(SoftDemo* pdemo) +{ + //TRACEDEMO + const int n=15; + for(int i=0;im_softBodyWorldInfo, btVector3(-10,0,i*0.25), + btVector3(10,0,i*0.25), + 16, + 1+2); + psb->m_cfg.piterations = 4; + psb->m_materials[0]->m_kLST = 0.1+(i/(btScalar)(n-1))*0.9; + psb->setTotalMass(20); + pdemo->getSoftDynamicsWorld()->addSoftBody(psb); + + } +} + +// +// Rope attach +// +static void Init_RopeAttach(SoftDemo* pdemo) +{ + //TRACEDEMO + pdemo->m_softBodyWorldInfo.m_sparsesdf.RemoveReferences(0); + struct Functors + { + static btSoftBody* CtorRope(SoftDemo* pdemo,const btVector3& p) + { + btSoftBody* psb=btSoftBodyHelpers::CreateRope(pdemo->m_softBodyWorldInfo,p,p+btVector3(10,0,0),8,1); + psb->setTotalMass(50); + pdemo->getSoftDynamicsWorld()->addSoftBody(psb); + return(psb); + } + }; + btTransform startTransform; + startTransform.setIdentity(); + startTransform.setOrigin(btVector3(12,8,0)); + btRigidBody* body=pdemo->localCreateRigidBody(50,startTransform,new btBoxShape(btVector3(2,6,2))); + btSoftBody* psb0=Functors::CtorRope(pdemo,btVector3(0,8,-1)); + btSoftBody* psb1=Functors::CtorRope(pdemo,btVector3(0,8,+1)); + psb0->appendAnchor(psb0->m_nodes.size()-1,body); + psb1->appendAnchor(psb1->m_nodes.size()-1,body); +} + +// +// Cloth attach +// +static void Init_ClothAttach(SoftDemo* pdemo) +{ + //TRACEDEMO + const btScalar s=4; + const btScalar h=6; + const int r=9; + btSoftBody* psb=btSoftBodyHelpers::CreatePatch(pdemo->m_softBodyWorldInfo,btVector3(-s,h,-s), + btVector3(+s,h,-s), + btVector3(-s,h,+s), + btVector3(+s,h,+s),r,r,4+8,true); + pdemo->getSoftDynamicsWorld()->addSoftBody(psb); + + btTransform startTransform; + startTransform.setIdentity(); + startTransform.setOrigin(btVector3(0,h,-(s+3.5))); + btRigidBody* body=pdemo->localCreateRigidBody(20,startTransform,new btBoxShape(btVector3(s,1,3))); + psb->appendAnchor(0,body); + psb->appendAnchor(r-1,body); + pdemo->m_cutting=true; +} + +// +// Impact +// +static void Init_Impact(SoftDemo* pdemo) +{ + //TRACEDEMO + btSoftBody* psb=btSoftBodyHelpers::CreateRope(pdemo->m_softBodyWorldInfo, btVector3(0,0,0), + btVector3(0,-1,0), + 0, + 1); + pdemo->getSoftDynamicsWorld()->addSoftBody(psb); + psb->m_cfg.kCHR=0.5; + btTransform startTransform; + startTransform.setIdentity(); + startTransform.setOrigin(btVector3(0,20,0)); + pdemo->localCreateRigidBody(10,startTransform,new btBoxShape(btVector3(2,2,2))); +} + +// +// Collide +// +static void Init_Collide(SoftDemo* pdemo) +{ + //TRACEDEMO + struct Functor + { + static btSoftBody* Create(SoftDemo* pdemo,const btVector3& x,const btVector3& a) + { + btSoftBody* psb=btSoftBodyHelpers::CreateFromTriMesh(pdemo->m_softBodyWorldInfo,gVertices, + &gIndices[0][0], + NUM_TRIANGLES); + psb->generateBendingConstraints(2); + psb->m_cfg.piterations=2; + psb->m_cfg.collisions|=btSoftBody::fCollision::VF_SS; + psb->randomizeConstraints(); + btMatrix3x3 m; + m.setEulerZYX(a.x(),a.y(),a.z()); + psb->transform(btTransform(m,x)); + psb->scale(btVector3(2,2,2)); + psb->setTotalMass(50,true); + pdemo->getSoftDynamicsWorld()->addSoftBody(psb); + return(psb); + } + }; + for(int i=0;i<3;++i) + { + Functor::Create(pdemo,btVector3(3*i,2,0),btVector3(SIMD_PI/2*(1-(i&1)),SIMD_PI/2*(i&1),0)); + } + pdemo->m_cutting=true; +} + +// +// Collide2 +// +static void Init_Collide2(SoftDemo* pdemo) +{ + //TRACEDEMO + struct Functor + { + static btSoftBody* Create(SoftDemo* pdemo,const btVector3& x,const btVector3& a) + { + btSoftBody* psb=btSoftBodyHelpers::CreateFromTriMesh(pdemo->m_softBodyWorldInfo,gVerticesBunny, + &gIndicesBunny[0][0], + BUNNY_NUM_TRIANGLES); + btSoftBody::Material* pm=psb->appendMaterial(); + pm->m_kLST = 0.5; + pm->m_flags -= btSoftBody::fMaterial::DebugDraw; + psb->generateBendingConstraints(2,pm); + psb->m_cfg.piterations = 2; + psb->m_cfg.kDF = 0.5; + psb->m_cfg.collisions |= btSoftBody::fCollision::VF_SS; + psb->randomizeConstraints(); + btMatrix3x3 m; + m.setEulerZYX(a.x(),a.y(),a.z()); + psb->transform(btTransform(m,x)); + psb->scale(btVector3(6,6,6)); + psb->setTotalMass(100,true); + pdemo->getSoftDynamicsWorld()->addSoftBody(psb); + return(psb); + } + }; + for(int i=0;i<3;++i) + { + Functor::Create(pdemo,btVector3(0,-1+5*i,0),btVector3(0,SIMD_PI/2*(i&1),0)); + } + pdemo->m_cutting=true; +} + +// +// Collide3 +// +static void Init_Collide3(SoftDemo* pdemo) +{ + //TRACEDEMO + { + const btScalar s=8; + btSoftBody* psb=btSoftBodyHelpers::CreatePatch( pdemo->m_softBodyWorldInfo,btVector3(-s,0,-s), + btVector3(+s,0,-s), + btVector3(-s,0,+s), + btVector3(+s,0,+s), + 15,15,1+2+4+8,true); + psb->m_materials[0]->m_kLST = 0.4; + psb->m_cfg.collisions |= btSoftBody::fCollision::VF_SS; + psb->setTotalMass(150); + pdemo->getSoftDynamicsWorld()->addSoftBody(psb); + } + { + const btScalar s=4; + const btVector3 o=btVector3(5,10,0); + btSoftBody* psb=btSoftBodyHelpers::CreatePatch( pdemo->m_softBodyWorldInfo, + btVector3(-s,0,-s)+o, + btVector3(+s,0,-s)+o, + btVector3(-s,0,+s)+o, + btVector3(+s,0,+s)+o, + 7,7,0,true); + btSoftBody::Material* pm=psb->appendMaterial(); + pm->m_kLST = 0.1; + pm->m_flags -= btSoftBody::fMaterial::DebugDraw; + psb->generateBendingConstraints(2,pm); + psb->m_materials[0]->m_kLST = 0.5; + psb->m_cfg.collisions |= btSoftBody::fCollision::VF_SS; + psb->setTotalMass(150); + pdemo->getSoftDynamicsWorld()->addSoftBody(psb); + pdemo->m_cutting=true; + } +} + +// +// Aerodynamic forces, 50x1g flyers +// +static void Init_Aero(SoftDemo* pdemo) +{ + //TRACEDEMO + const btScalar s=2; + const btScalar h=10; + const int segments=6; + const int count=50; + for(int i=0;im_softBodyWorldInfo,btVector3(-s,h,-s), + btVector3(+s,h,-s), + btVector3(-s,h,+s), + btVector3(+s,h,+s), + segments,segments, + 0,true); + btSoftBody::Material* pm=psb->appendMaterial(); + pm->m_flags -= btSoftBody::fMaterial::DebugDraw; + psb->generateBendingConstraints(2,pm); + psb->m_cfg.kLF = 0.004; + psb->m_cfg.kDG = 0.0003; + psb->m_cfg.aeromodel = btSoftBody::eAeroModel::V_TwoSided; + btTransform trs; + btQuaternion rot; + btVector3 ra=Vector3Rand()*0.1; + btVector3 rp=Vector3Rand()*15+btVector3(0,20,80); + rot.setEuler(SIMD_PI/8+ra.x(),-SIMD_PI/7+ra.y(),ra.z()); + trs.setIdentity(); + trs.setOrigin(rp); + trs.setRotation(rot); + psb->transform(trs); + psb->setTotalMass(0.1); + psb->addForce(btVector3(0,2,0),0); + pdemo->getSoftDynamicsWorld()->addSoftBody(psb); + + } + pdemo->m_autocam=true; +} + +// +// Friction +// +static void Init_Friction(SoftDemo* pdemo) +{ + //TRACEDEMO + const btScalar bs=2; + const btScalar ts=bs+bs/4; + for(int i=0,ni=20;im_cfg.kDF = 0.1 * ((i+1)/(btScalar)ni); + psb->addVelocity(btVector3(0,0,-10)); + } +} + +// +// Pressure +// +static void Init_Pressure(SoftDemo* pdemo) +{ + //TRACEDEMO + btSoftBody* psb=btSoftBodyHelpers::CreateEllipsoid(pdemo->m_softBodyWorldInfo,btVector3(35,25,0), + btVector3(1,1,1)*3, + 512); + psb->m_materials[0]->m_kLST = 0.1; + psb->m_cfg.kDF = 1; + psb->m_cfg.kDP = 0.001; // fun factor... + psb->m_cfg.kPR = 2500; + psb->setTotalMass(30,true); + pdemo->getSoftDynamicsWorld()->addSoftBody(psb); + + Ctor_BigPlate(pdemo); + Ctor_LinearStair(pdemo,btVector3(0,0,0),btVector3(2,1,5),0,10); + pdemo->m_autocam=true; +} + +// +// Volume conservation +// +static void Init_Volume(SoftDemo* pdemo) +{ + //TRACEDEMO + btSoftBody* psb=btSoftBodyHelpers::CreateEllipsoid(pdemo->m_softBodyWorldInfo,btVector3(35,25,0), + btVector3(1,1,1)*3, + 512); + psb->m_materials[0]->m_kLST = 0.45; + psb->m_cfg.kVC = 20; + psb->setTotalMass(50,true); + psb->setPose(true,false); + pdemo->getSoftDynamicsWorld()->addSoftBody(psb); + + Ctor_BigPlate(pdemo); + Ctor_LinearStair(pdemo,btVector3(0,0,0),btVector3(2,1,5),0,10); + pdemo->m_autocam=true; +} + +// +// Stick+Bending+Rb's +// +static void Init_Sticks(SoftDemo* pdemo) +{ + //TRACEDEMO + const int n=16; + const int sg=4; + const btScalar sz=5; + const btScalar hg=4; + const btScalar in=1/(btScalar)(n-1); + for(int y=0;ym_softBodyWorldInfo, org, + org+btVector3(hg*0.001,hg,0), + sg, + 1); + psb->m_cfg.kDP = 0.005; + psb->m_cfg.kCHR = 0.1; + for(int i=0;i<3;++i) + { + psb->generateBendingConstraints(2+i); + } + psb->setMass(1,0); + psb->setTotalMass(0.01); + pdemo->getSoftDynamicsWorld()->addSoftBody(psb); + + } + } + Ctor_BigBall(pdemo); +} + +// +// Bending +// +static void Init_Bending(SoftDemo* pdemo) +{ + //TRACEDEMO + const btScalar s=4; + const btVector3 x[]={ btVector3(-s,0,-s), + btVector3(+s,0,-s), + btVector3(+s,0,+s), + btVector3(-s,0,+s)}; + const btScalar m[]={ 0,0,0,1}; + btSoftBody* psb=new btSoftBody(&pdemo->m_softBodyWorldInfo,4,x,m); + psb->appendLink(0,1); + psb->appendLink(1,2); + psb->appendLink(2,3); + psb->appendLink(3,0); + psb->appendLink(0,2); + + pdemo->getSoftDynamicsWorld()->addSoftBody(psb); +} + +// +// 100kg cloth locked at corners, 10 falling 10kg rb's. +// +static void Init_Cloth(SoftDemo* pdemo) +{ + //TRACEDEMO + const btScalar s=8; + btSoftBody* psb=btSoftBodyHelpers::CreatePatch( pdemo->m_softBodyWorldInfo,btVector3(-s,0,-s), + btVector3(+s,0,-s), + btVector3(-s,0,+s), + btVector3(+s,0,+s), + 31,31, + + // 31,31, + 1+2+4+8,true); + btSoftBody::Material* pm=psb->appendMaterial(); + pm->m_kLST = 0.4; + pm->m_flags -= btSoftBody::fMaterial::DebugDraw; + psb->generateBendingConstraints(2,pm); + psb->setTotalMass(150); + pdemo->getSoftDynamicsWorld()->addSoftBody(psb); + + Ctor_RbUpStack(pdemo,10); + pdemo->m_cutting=true; +} + +// +// 100kg Stanford's bunny +// +static void Init_Bunny(SoftDemo* pdemo) +{ + //TRACEDEMO + btSoftBody* psb=btSoftBodyHelpers::CreateFromTriMesh(pdemo->m_softBodyWorldInfo,gVerticesBunny, + &gIndicesBunny[0][0], + BUNNY_NUM_TRIANGLES); + btSoftBody::Material* pm=psb->appendMaterial(); + pm->m_kLST = 0.5; + pm->m_flags -= btSoftBody::fMaterial::DebugDraw; + psb->generateBendingConstraints(2,pm); + psb->m_cfg.piterations = 2; + psb->m_cfg.kDF = 0.5; + psb->randomizeConstraints(); + psb->scale(btVector3(6,6,6)); + psb->setTotalMass(100,true); + pdemo->getSoftDynamicsWorld()->addSoftBody(psb); + pdemo->m_cutting=true; + +} + +// +// 100kg Stanford's bunny with pose matching +// +static void Init_BunnyMatch(SoftDemo* pdemo) +{ + //TRACEDEMO + btSoftBody* psb=btSoftBodyHelpers::CreateFromTriMesh(pdemo->m_softBodyWorldInfo, gVerticesBunny, + &gIndicesBunny[0][0], + BUNNY_NUM_TRIANGLES); + psb->m_cfg.kDF = 0.5; + psb->m_cfg.kMT = 0.05; + psb->m_cfg.piterations = 5; + psb->randomizeConstraints(); + psb->scale(btVector3(6,6,6)); + psb->setTotalMass(100,true); + psb->setPose(false,true); + pdemo->getSoftDynamicsWorld()->addSoftBody(psb); + +} + +// +// 50Kg Torus +// +static void Init_Torus(SoftDemo* pdemo) +{ + //TRACEDEMO + btSoftBody* psb=btSoftBodyHelpers::CreateFromTriMesh( pdemo->m_softBodyWorldInfo, gVertices, + &gIndices[0][0], + NUM_TRIANGLES); + psb->generateBendingConstraints(2); + psb->m_cfg.piterations=2; + psb->randomizeConstraints(); + btMatrix3x3 m; + m.setEulerZYX(SIMD_PI/2,0,0); + psb->transform(btTransform(m,btVector3(0,4,0))); + psb->scale(btVector3(2,2,2)); + psb->setTotalMass(50,true); + pdemo->getSoftDynamicsWorld()->addSoftBody(psb); + pdemo->m_cutting=true; + +} + +// +// 50Kg Torus with pose matching +// +static void Init_TorusMatch(SoftDemo* pdemo) +{ + //TRACEDEMO + btSoftBody* psb=btSoftBodyHelpers::CreateFromTriMesh(pdemo->m_softBodyWorldInfo, gVertices, + &gIndices[0][0], + NUM_TRIANGLES); + psb->m_materials[0]->m_kLST = 0.1; + psb->m_cfg.kMT = 0.05; + psb->randomizeConstraints(); + btMatrix3x3 m; + m.setEulerZYX(SIMD_PI/2,0,0); + psb->transform(btTransform(m,btVector3(0,4,0))); + psb->scale(btVector3(2,2,2)); + psb->setTotalMass(50,true); + psb->setPose(false,true); + pdemo->getSoftDynamicsWorld()->addSoftBody(psb); +} + +// +// Cutting1 +// +static void Init_Cutting1(SoftDemo* pdemo) +{ + const btScalar s=6; + const btScalar h=2; + const int r=16; + const btVector3 p[]={ btVector3(+s,h,-s), + btVector3(-s,h,-s), + btVector3(+s,h,+s), + btVector3(-s,h,+s)}; + btSoftBody* psb=btSoftBodyHelpers::CreatePatch(pdemo->m_softBodyWorldInfo,p[0],p[1],p[2],p[3],r,r,1+2+4+8,true); + pdemo->getSoftDynamicsWorld()->addSoftBody(psb); + psb->m_cfg.piterations=1; + pdemo->m_cutting=true; +} + +// +// Clusters +// + +// +static void Ctor_Gear(SoftDemo* pdemo,const btVector3& pos,btScalar speed) +{ + btTransform startTransform; + startTransform.setIdentity(); + startTransform.setOrigin(pos); + btCompoundShape* shape=new btCompoundShape(); +#if 1 + shape->addChildShape(btTransform(btQuaternion(0,0,0)),new btBoxShape(btVector3(5,1,6))); + shape->addChildShape(btTransform(btQuaternion(0,0,SIMD_HALF_PI)),new btBoxShape(btVector3(5,1,6))); +#else + shape->addChildShape(btTransform(btQuaternion(0,0,0)),new btCylinderShapeZ(btVector3(5,1,7))); + shape->addChildShape(btTransform(btQuaternion(0,0,SIMD_HALF_PI)),new btBoxShape(btVector3(4,1,8))); +#endif + btRigidBody* body=pdemo->localCreateRigidBody(10,startTransform,shape); + body->setFriction(1); + btDynamicsWorld* world=pdemo->getDynamicsWorld(); + btHingeConstraint* hinge=new btHingeConstraint(*body,btTransform::getIdentity()); + if(speed!=0) hinge->enableAngularMotor(true,speed,3); + world->addConstraint(hinge); +} + +// +static btSoftBody* Ctor_ClusterBunny(SoftDemo* pdemo,const btVector3& x,const btVector3& a) +{ + btSoftBody* psb=btSoftBodyHelpers::CreateFromTriMesh(pdemo->m_softBodyWorldInfo,gVerticesBunny,&gIndicesBunny[0][0],BUNNY_NUM_TRIANGLES); + btSoftBody::Material* pm=psb->appendMaterial(); + pm->m_kLST = 1; + pm->m_flags -= btSoftBody::fMaterial::DebugDraw; + psb->generateBendingConstraints(2,pm); + psb->m_cfg.piterations = 2; + psb->m_cfg.kDF = 1; + psb->m_cfg.collisions = btSoftBody::fCollision::CL_SS+ + btSoftBody::fCollision::CL_RS; + psb->randomizeConstraints(); + btMatrix3x3 m; + m.setEulerZYX(a.x(),a.y(),a.z()); + psb->transform(btTransform(m,x)); + psb->scale(btVector3(8,8,8)); + psb->setTotalMass(150,true); + psb->generateClusters(1); + pdemo->getSoftDynamicsWorld()->addSoftBody(psb); + return(psb); +} + +// +static btSoftBody* Ctor_ClusterTorus(SoftDemo* pdemo,const btVector3& x,const btVector3& a,const btVector3& s=btVector3(2,2,2)) +{ + btSoftBody* psb=btSoftBodyHelpers::CreateFromTriMesh(pdemo->m_softBodyWorldInfo,gVertices,&gIndices[0][0],NUM_TRIANGLES); + btSoftBody::Material* pm=psb->appendMaterial(); + pm->m_kLST = 1; + pm->m_flags -= btSoftBody::fMaterial::DebugDraw; + psb->generateBendingConstraints(2,pm); + psb->m_cfg.piterations = 2; + psb->m_cfg.collisions = btSoftBody::fCollision::CL_SS+ + btSoftBody::fCollision::CL_RS; + psb->randomizeConstraints(); + psb->scale(s); + psb->rotate(btQuaternion(a[0],a[1],a[2])); + psb->translate(x); + psb->setTotalMass(50,true); + psb->generateClusters(64); + pdemo->getSoftDynamicsWorld()->addSoftBody(psb); + return(psb); +} + +// +static struct MotorControl : btSoftBody::AJoint::IControl +{ + MotorControl() + { + goal=0; + maxtorque=0; + } + btScalar Speed(btSoftBody::AJoint*,btScalar current) + { + return(current+btMin(maxtorque,btMax(-maxtorque,goal-current))); + } + btScalar goal; + btScalar maxtorque; +} motorcontrol; + +// +struct SteerControl : btSoftBody::AJoint::IControl +{ + SteerControl(btScalar s) + { + angle=0; + sign=s; + } + void Prepare(btSoftBody::AJoint* joint) + { + joint->m_refs[0][0]=btCos(angle*sign); + joint->m_refs[0][2]=btSin(angle*sign); + } + btScalar Speed(btSoftBody::AJoint* joint,btScalar current) + { + return(motorcontrol.Speed(joint,current)); + } + btScalar angle; + btScalar sign; +}; + +static SteerControl steercontrol_f(+1); +static SteerControl steercontrol_r(-1); + +// +static void Init_ClusterDeform(SoftDemo* pdemo) +{ + btSoftBody* psb=Ctor_ClusterTorus(pdemo,btVector3(0,0,0),btVector3(SIMD_PI/2,0,SIMD_HALF_PI)); + psb->generateClusters(8); + psb->m_cfg.kDF=1; +} + +// +static void Init_ClusterCollide1(SoftDemo* pdemo) +{ + const btScalar s=8; + btSoftBody* psb=btSoftBodyHelpers::CreatePatch( pdemo->m_softBodyWorldInfo,btVector3(-s,0,-s), + btVector3(+s,0,-s), + btVector3(-s,0,+s), + btVector3(+s,0,+s), + 31,31, + 1+2+4+8,true); + btSoftBody::Material* pm=psb->appendMaterial(); + pm->m_kLST = 0.4; + pm->m_flags -= btSoftBody::fMaterial::DebugDraw; + psb->m_cfg.kDF = 1; + psb->m_cfg.kSRHR_CL = 1; + psb->m_cfg.kSR_SPLT_CL = 0; + psb->m_cfg.collisions = btSoftBody::fCollision::CL_SS+ + btSoftBody::fCollision::CL_RS; + psb->generateBendingConstraints(2,pm); + psb->setTotalMass(50); + psb->generateClusters(64); + pdemo->getSoftDynamicsWorld()->addSoftBody(psb); + + Ctor_RbUpStack(pdemo,10); +} + +// +static void Init_ClusterCollide2(SoftDemo* pdemo) +{ + struct Functor + { + static btSoftBody* Create(SoftDemo* pdemo,const btVector3& x,const btVector3& a) + { + btSoftBody* psb=btSoftBodyHelpers::CreateFromTriMesh(pdemo->m_softBodyWorldInfo,gVertices, + &gIndices[0][0], + NUM_TRIANGLES); + btSoftBody::Material* pm=psb->appendMaterial(); + pm->m_flags -= btSoftBody::fMaterial::DebugDraw; + psb->generateBendingConstraints(2,pm); + psb->m_cfg.piterations=2; + psb->m_cfg.kDF =1; + psb->m_cfg.kSSHR_CL =1; + psb->m_cfg.kSS_SPLT_CL =0; + psb->m_cfg.kSKHR_CL =0.1f; + psb->m_cfg.kSK_SPLT_CL =1; + psb->m_cfg.collisions= btSoftBody::fCollision::CL_SS+ + btSoftBody::fCollision::CL_RS; + psb->randomizeConstraints(); + btMatrix3x3 m; + m.setEulerZYX(a.x(),a.y(),a.z()); + psb->transform(btTransform(m,x)); + psb->scale(btVector3(2,2,2)); + psb->setTotalMass(50,true); + psb->generateClusters(16); + pdemo->getSoftDynamicsWorld()->addSoftBody(psb); + return(psb); + } + }; + for(int i=0;i<3;++i) + { + Functor::Create(pdemo,btVector3(3*i,2,0),btVector3(SIMD_PI/2*(1-(i&1)),SIMD_PI/2*(i&1),0)); + } +} + +// +static void Init_ClusterSocket(SoftDemo* pdemo) +{ + btSoftBody* psb=Ctor_ClusterTorus(pdemo,btVector3(0,0,0),btVector3(SIMD_PI/2,0,SIMD_HALF_PI)); + btRigidBody* prb=Ctor_BigPlate(pdemo,50,8); + psb->m_cfg.kDF=1; + btSoftBody::LJoint::Specs lj; + lj.position = btVector3(0,5,0); + psb->appendLinearJoint(lj,prb); +} + +// +static void Init_ClusterHinge(SoftDemo* pdemo) +{ + btSoftBody* psb=Ctor_ClusterTorus(pdemo,btVector3(0,0,0),btVector3(SIMD_PI/2,0,SIMD_HALF_PI)); + btRigidBody* prb=Ctor_BigPlate(pdemo,50,8); + psb->m_cfg.kDF=1; + btSoftBody::AJoint::Specs aj; + aj.axis = btVector3(0,0,1); + psb->appendAngularJoint(aj,prb); +} + +// +static void Init_ClusterCombine(SoftDemo* pdemo) +{ + const btVector3 sz(2,4,2); + btSoftBody* psb0=Ctor_ClusterTorus(pdemo,btVector3(0,8,0),btVector3(SIMD_PI/2,0,SIMD_HALF_PI),sz); + btSoftBody* psb1=Ctor_ClusterTorus(pdemo,btVector3(0,8,10),btVector3(SIMD_PI/2,0,SIMD_HALF_PI),sz); + btSoftBody* psbs[]={psb0,psb1}; + for(int j=0;j<2;++j) + { + psbs[j]->m_cfg.kDF=1; + psbs[j]->m_cfg.kDP=0; + psbs[j]->m_cfg.piterations=1; + psbs[j]->m_clusters[0]->m_matching = 0.05; + psbs[j]->m_clusters[0]->m_ndamping = 0.05; + } + btSoftBody::AJoint::Specs aj; + aj.axis = btVector3(0,0,1); + aj.icontrol = &motorcontrol; + psb0->appendAngularJoint(aj,psb1); + + btSoftBody::LJoint::Specs lj; + lj.position = btVector3(0,8,5); + psb0->appendLinearJoint(lj,psb1); +} + +// +static void Init_ClusterCar(SoftDemo* pdemo) +{ + pdemo->setAzi(270); + const btVector3 origin(100,80,0); + const btQuaternion orientation(-SIMD_PI/2,0,0); + const btScalar widthf=8; + const btScalar widthr=9; + const btScalar length=8; + const btScalar height=4; + const btVector3 wheels[]= { + btVector3(+widthf,-height,+length), // Front left + btVector3(-widthf,-height,+length), // Front right + btVector3(+widthr,-height,-length), // Rear left + btVector3(-widthr,-height,-length), // Rear right + }; + btSoftBody* pa=Ctor_ClusterBunny(pdemo,btVector3(0,0,0),btVector3(0,0,0)); + btSoftBody* pfl=Ctor_ClusterTorus(pdemo,wheels[0],btVector3(0,0,SIMD_HALF_PI),btVector3(2,4,2)); + btSoftBody* pfr=Ctor_ClusterTorus(pdemo,wheels[1],btVector3(0,0,SIMD_HALF_PI),btVector3(2,4,2)); + btSoftBody* prl=Ctor_ClusterTorus(pdemo,wheels[2],btVector3(0,0,SIMD_HALF_PI),btVector3(2,5,2)); + btSoftBody* prr=Ctor_ClusterTorus(pdemo,wheels[3],btVector3(0,0,SIMD_HALF_PI),btVector3(2,5,2)); + + pfl->m_cfg.kDF = + pfr->m_cfg.kDF = + prl->m_cfg.kDF = + prr->m_cfg.kDF = 1; + + btSoftBody::LJoint::Specs lspecs; + lspecs.cfm = 1; + lspecs.erp = 1; + lspecs.position = btVector3(0,0,0); + + lspecs.position=wheels[0];pa->appendLinearJoint(lspecs,pfl); + lspecs.position=wheels[1];pa->appendLinearJoint(lspecs,pfr); + lspecs.position=wheels[2];pa->appendLinearJoint(lspecs,prl); + lspecs.position=wheels[3];pa->appendLinearJoint(lspecs,prr); + + btSoftBody::AJoint::Specs aspecs; + aspecs.cfm = 1; + aspecs.erp = 1; + aspecs.axis = btVector3(1,0,0); + + aspecs.icontrol = &steercontrol_f; + pa->appendAngularJoint(aspecs,pfl); + pa->appendAngularJoint(aspecs,pfr); + + aspecs.icontrol = &motorcontrol; + pa->appendAngularJoint(aspecs,prl); + pa->appendAngularJoint(aspecs,prr); + + pa->rotate(orientation); + pfl->rotate(orientation); + pfr->rotate(orientation); + prl->rotate(orientation); + prr->rotate(orientation); + pa->translate(origin); + pfl->translate(origin); + pfr->translate(origin); + prl->translate(origin); + prr->translate(origin); + pfl->m_cfg.piterations = + pfr->m_cfg.piterations = + prl->m_cfg.piterations = + prr->m_cfg.piterations = 1; + pfl->m_clusters[0]->m_matching = + pfr->m_clusters[0]->m_matching = + prl->m_clusters[0]->m_matching = + prr->m_clusters[0]->m_matching = 0.05; + pfl->m_clusters[0]->m_ndamping = + pfr->m_clusters[0]->m_ndamping = + prl->m_clusters[0]->m_ndamping = + prr->m_clusters[0]->m_ndamping = 0.05; + + Ctor_LinearStair(pdemo,btVector3(0,-8,0),btVector3(3,2,40),0,20); + Ctor_RbUpStack(pdemo,50); + pdemo->m_autocam=true; +} + +// +static void Init_ClusterRobot(SoftDemo* pdemo) +{ + struct Functor + { + static btSoftBody* CreateBall(SoftDemo* pdemo,const btVector3& pos) + { + btSoftBody* psb=btSoftBodyHelpers::CreateEllipsoid(pdemo->m_softBodyWorldInfo,pos,btVector3(1,1,1)*3,512); + psb->m_materials[0]->m_kLST = 0.45; + psb->m_cfg.kVC = 20; + psb->setTotalMass(50,true); + psb->setPose(true,false); + psb->generateClusters(1); + pdemo->getSoftDynamicsWorld()->addSoftBody(psb); + return(psb); + } + }; + const btVector3 base=btVector3(0,25,8); + btSoftBody* psb0=Functor::CreateBall(pdemo,base+btVector3(-8,0,0)); + btSoftBody* psb1=Functor::CreateBall(pdemo,base+btVector3(+8,0,0)); + btSoftBody* psb2=Functor::CreateBall(pdemo,base+btVector3(0,0,+8*btSqrt(2))); + const btVector3 ctr=(psb0->clusterCom(0)+psb1->clusterCom(0)+psb2->clusterCom(0))/3; + btCylinderShape* pshp=new btCylinderShape(btVector3(8,1,8)); + btRigidBody* prb=pdemo->localCreateRigidBody(50,btTransform(btQuaternion(0,0,0),ctr+btVector3(0,5,0)),pshp); + btSoftBody::LJoint::Specs ls; + ls.erp=0.5f; + ls.position=psb0->clusterCom(0);psb0->appendLinearJoint(ls,prb); + ls.position=psb1->clusterCom(0);psb1->appendLinearJoint(ls,prb); + ls.position=psb2->clusterCom(0);psb2->appendLinearJoint(ls,prb); + + btBoxShape* pbox=new btBoxShape(btVector3(20,1,40)); + btRigidBody* pgrn=pdemo->localCreateRigidBody(0,btTransform(btQuaternion(0,-SIMD_HALF_PI/2,0),btVector3(0,0,0)),pbox); + + pdemo->m_autocam=true; +} + +// +static void Init_ClusterStackSoft(SoftDemo* pdemo) +{ + for(int i=0;i<10;++i) + { + btSoftBody* psb=Ctor_ClusterTorus(pdemo,btVector3(0,-9+8.25*i,0),btVector3(0,0,0)); + psb->m_cfg.kDF=1; + } +} + +// +static void Init_ClusterStackMixed(SoftDemo* pdemo) +{ + for(int i=0;i<10;++i) + { + if((i+1)&1) + { + Ctor_BigPlate(pdemo,50,-9+4.25*i); + } + else + { + btSoftBody* psb=Ctor_ClusterTorus(pdemo,btVector3(0,-9+4.25*i,0),btVector3(0,0,0)); + psb->m_cfg.kDF=1; + } + } +} + +unsigned current_demo=18; + +void SoftDemo::clientResetScene() +{ + DemoApplication::clientResetScene(); + /* Clean up */ + for(int i=m_dynamicsWorld->getNumCollisionObjects()-1;i>0;i--) + { + btCollisionObject* obj=m_dynamicsWorld->getCollisionObjectArray()[i]; + btRigidBody* body=btRigidBody::upcast(obj); + if(body&&body->getMotionState()) + { + delete body->getMotionState(); + } + while(m_dynamicsWorld->getNumConstraints()) + { + btTypedConstraint* pc=m_dynamicsWorld->getConstraint(0); + m_dynamicsWorld->removeConstraint(pc); + delete pc; + } + btSoftBody* softBody = btSoftBody::upcast(obj); + if (softBody) + { + getSoftDynamicsWorld()->removeSoftBody(softBody); + } else + { + m_dynamicsWorld->removeCollisionObject(obj); + } + delete obj; + } + + m_softBodyWorldInfo.m_sparsesdf.Reset(); + /* Init */ + void (*demofncs[])(SoftDemo*)= + { + Init_Cloth, + Init_Pressure, + Init_Volume, + Init_Ropes, + Init_RopeAttach, + Init_ClothAttach, + Init_Sticks, + Init_Collide, + Init_Collide2, + Init_Collide3, + Init_Impact, + Init_Aero, + Init_Friction, + Init_Torus, + Init_TorusMatch, + Init_Bunny, + Init_BunnyMatch, + Init_Cutting1, + Init_ClusterDeform, + Init_ClusterCollide1, + Init_ClusterCollide2, + Init_ClusterSocket, + Init_ClusterHinge, + Init_ClusterCombine, + Init_ClusterCar, + Init_ClusterRobot, + Init_ClusterStackSoft, + Init_ClusterStackMixed, + }; + current_demo=current_demo%(sizeof(demofncs)/sizeof(demofncs[0])); + + m_softBodyWorldInfo.air_density = (btScalar)1.2; + m_softBodyWorldInfo.water_density = 0; + m_softBodyWorldInfo.water_offset = 0; + m_softBodyWorldInfo.water_normal = btVector3(0,0,0); + m_softBodyWorldInfo.m_gravity.setValue(0,-10,0); + + + m_autocam = false; + m_raycast = false; + m_cutting = false; + m_results.fraction = 1.f; + demofncs[current_demo](this); +} + +void SoftDemo::renderme() +{ + btIDebugDraw* idraw=m_dynamicsWorld->getDebugDrawer(); + + m_dynamicsWorld->debugDrawWorld(); + + /* Bodies */ + btVector3 ps(0,0,0); + int nps=0; + + btSoftBodyArray& sbs=getSoftDynamicsWorld()->getSoftBodyArray(); + for(int ib=0;ibm_nodes.size(); + for(int i=0;im_nodes.size();++i) + { + ps+=psb->m_nodes[i].m_x; + } + } + ps/=nps; + if(m_autocam) + m_cameraTargetPosition+=(ps-m_cameraTargetPosition)*0.05; + else + m_cameraTargetPosition=btVector3(0,0,0); + /* Anm */ + if(!isIdle()) + m_animtime=m_clock.getTimeMilliseconds()/1000.f; + /* Ray cast */ + if(m_raycast) + { + /* Prepare rays */ + const int res=64; + const btScalar fres=res-1; + const btScalar size=8; + const btScalar dist=10; + btTransform trs; + trs.setOrigin(ps); + btScalar rayLength = 1000.f; + + const btScalar angle=m_animtime*0.2; + trs.setRotation(btQuaternion(angle,SIMD_PI/4,0)); + btVector3 dir=trs.getBasis()*btVector3(0,-1,0); + trs.setOrigin(ps-dir*dist); + btAlignedObjectArray origins; + btAlignedObjectArray fractions; + origins.resize(res*res); + fractions.resize(res*res,1.f); + for(int y=0;yrayTest(rayFrom,rayTo,results)) + { + *fraction=results.fraction; + } + } + ++org;++fraction; + } + long ms=btMax(m_clock.getTimeMilliseconds(),1); + long rayperseconds=(1000*(origins.size()*sbs.size()))/ms; + printf("%d ms (%d rays/s)\r\n",ms,rayperseconds); + } + /* Draw rays */ + const btVector3 c[]={ origins[0], + origins[res-1], + origins[res*(res-1)], + origins[res*(res-1)+res-1]}; + idraw->drawLine(c[0],c[1],btVector3(0,0,0)); + idraw->drawLine(c[1],c[3],btVector3(0,0,0)); + idraw->drawLine(c[3],c[2],btVector3(0,0,0)); + idraw->drawLine(c[2],c[0],btVector3(0,0,0)); + for(int i=0,ni=origins.size();idrawLine(org,org+dir*rayLength*fraction,btVector3(1,0,0)); + } + else + { + idraw->drawLine(org,org-dir*rayLength*0.1,btVector3(0,0,0)); + } + } +#undef RES + } + /* Water level */ + static const btVector3 axis[]={btVector3(1,0,0), + btVector3(0,1,0), + btVector3(0,0,1)}; + if(m_softBodyWorldInfo.water_density>0) + { + const btVector3 c= btVector3((btScalar)0.25,(btScalar)0.25,1); + const btScalar a= (btScalar)0.5; + const btVector3 n= m_softBodyWorldInfo.water_normal; + const btVector3 o= -n*m_softBodyWorldInfo.water_offset; + const btVector3 x= cross(n,axis[n.minAxis()]).normalized(); + const btVector3 y= cross(x,n).normalized(); + const btScalar s= 25; + idraw->drawTriangle(o-x*s-y*s,o+x*s-y*s,o+x*s+y*s,c,a); + idraw->drawTriangle(o-x*s-y*s,o+x*s+y*s,o-x*s+y*s,c,a); + } + // + DemoApplication::renderme(); + +} + +void SoftDemo::setDrawClusters(bool drawClusters) +{ + if (drawClusters) + { + getSoftDynamicsWorld()->setDrawFlags(getSoftDynamicsWorld()->getDrawFlags()|fDrawFlags::Clusters); + } else + { + getSoftDynamicsWorld()->setDrawFlags(getSoftDynamicsWorld()->getDrawFlags()& (~fDrawFlags::Clusters)); + } +} + + + +void SoftDemo::keyboardCallback(unsigned char key, int x, int y) +{ + switch(key) + { + case 'n': motorcontrol.maxtorque=10;motorcontrol.goal+=1;break; + case 'm': motorcontrol.maxtorque=10;motorcontrol.goal-=1;break; + case 'l': steercontrol_f.angle+=0.1;steercontrol_r.angle+=0.1;break; + case 'k': steercontrol_f.angle-=0.1;steercontrol_r.angle-=0.1;break; + case ']': ++current_demo;clientResetScene();break; + case '[': --current_demo;clientResetScene();break; + case ',': m_raycast=!m_raycast;break; + case ';': m_autocam=!m_autocam;break; + case 'c': getSoftDynamicsWorld()->setDrawFlags(getSoftDynamicsWorld()->getDrawFlags()^fDrawFlags::Clusters);break; + case '`': + { + btSoftBodyArray& sbs=getSoftDynamicsWorld()->getSoftBodyArray(); + for(int ib=0;ibstaticSolve(128); + } + } + break; + default: DemoApplication::keyboardCallback(key,x,y); + } +} + +// +void SoftDemo::mouseMotionFunc(int x,int y) +{ + if(m_node&&(m_results.fraction<1.f)) + { + if(!m_drag) + { +#define SQ(_x_) (_x_)*(_x_) + if((SQ(x-m_lastmousepos[0])+SQ(y-m_lastmousepos[1]))>6) + { + m_drag=true; + } +#undef SQ + } + if(m_drag) + { + m_lastmousepos[0] = x; + m_lastmousepos[1] = y; + } + } + else + { + DemoApplication::mouseMotionFunc(x,y); + } +} + +// +void SoftDemo::mouseFunc(int button, int state, int x, int y) +{ + if(button==0) + { + switch(state) + { + case 0: + { + m_results.fraction=1.f; + DemoApplication::mouseFunc(button,state,x,y); + if(!m_pickConstraint) + { + const btVector3 rayFrom=m_cameraPosition; + const btVector3 rayTo=getRayTo(x,y); + const btVector3 rayDir=(rayTo-rayFrom).normalized(); + btSoftBodyArray& sbs=getSoftDynamicsWorld()->getSoftBodyArray(); + for(int ib=0;ibrayTest(rayFrom,rayTo,res)) + { + m_results=res; + } + } + if(m_results.fraction<1.f) + { + m_impact = rayFrom+(rayTo-rayFrom)*m_results.fraction; + m_drag = false; + m_lastmousepos[0] = x; + m_lastmousepos[1] = y; + m_node = 0; + switch(m_results.feature) + { + case btSoftBody::eFeature::Face: + { + btSoftBody::Face& f=m_results.body->m_faces[m_results.index]; + m_node=f.m_n[0]; + for(int i=1;i<3;++i) + { + if( (m_node->m_x-m_impact).length2()> + (f.m_n[i]->m_x-m_impact).length2()) + { + m_node=f.m_n[i]; + } + } + } + break; + } + if(m_node) m_goal=m_node->m_x; + return; + } + } + } + break; + case 1: + if((!m_drag)&&m_cutting&&(m_results.fraction<1.f)) + { + ImplicitSphere isphere(m_impact,1); + printf("Mass before: %f\r\n",m_results.body->getTotalMass()); + m_results.body->refine(&isphere,0.0001,true); + printf("Mass after: %f\r\n",m_results.body->getTotalMass()); + } + m_results.fraction=1.f; + m_drag=false; + DemoApplication::mouseFunc(button,state,x,y); + break; + } + } + else + { + DemoApplication::mouseFunc(button,state,x,y); + } +} + + +void SoftDemo::initPhysics() +{ + ///create concave ground mesh + + //reset and disable motorcontrol at the start + motorcontrol.goal = 0; + motorcontrol.maxtorque = 0; + m_azi = 0; + + btCollisionShape* groundShape = 0; + bool useConcaveMesh = false;//not ready yet true; + + if (useConcaveMesh) + { + int i; + int j; + + const int NUM_VERTS_X = 30; + const int NUM_VERTS_Y = 30; + const int totalVerts = NUM_VERTS_X*NUM_VERTS_Y; + const int totalTriangles = 2*(NUM_VERTS_X-1)*(NUM_VERTS_Y-1); + + gGroundVertices = new btVector3[totalVerts]; + gGroundIndices = new int[totalTriangles*3]; + + btScalar offset(-50); + + for ( i=0;iaddChildShape(localTransform,cylinderShape); + btQuaternion orn(btVector3(0,1,0),SIMD_PI); + localTransform.setRotation(orn); + cylinderCompound->addChildShape(localTransform,cylinderShape); + + m_collisionShapes.push_back(cylinderCompound); + + + m_dispatcher=0; + + ///register some softbody collision algorithms on top of the default btDefaultCollisionConfiguration + m_collisionConfiguration = new btSoftBodyRigidBodyCollisionConfiguration(); + + + m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); + m_softBodyWorldInfo.m_dispatcher = m_dispatcher; + + //////////////////////////// + ///Register softbody versus softbody collision algorithm + + + ///Register softbody versus rigidbody collision algorithm + + + //////////////////////////// + + btVector3 worldAabbMin(-1000,-1000,-1000); + btVector3 worldAabbMax(1000,1000,1000); + + m_broadphase = new btAxisSweep3(worldAabbMin,worldAabbMax,maxProxies); + + m_softBodyWorldInfo.m_broadphase = m_broadphase; + + btSequentialImpulseConstraintSolver* solver = new btSequentialImpulseConstraintSolver(); + + m_solver = solver; + + btDiscreteDynamicsWorld* world = new btSoftRigidDynamicsWorld(m_dispatcher,m_broadphase,m_solver,m_collisionConfiguration); + m_dynamicsWorld = world; + + + m_dynamicsWorld->getDispatchInfo().m_enableSPU = true; + m_dynamicsWorld->setGravity(btVector3(0,-10,0)); + m_softBodyWorldInfo.m_gravity.setValue(0,-10,0); + + + + + + btTransform tr; + tr.setIdentity(); + tr.setOrigin(btVector3(0,-12,0)); + + +#define USE_COLLISION_OBJECT 1 +#ifdef USE_COLLISION_OBJECT + btCollisionObject* newOb = new btCollisionObject(); + newOb->setWorldTransform(tr); + newOb->setInterpolationWorldTransform( tr); + newOb->setCollisionShape(m_collisionShapes[0]); + m_dynamicsWorld->addCollisionObject(newOb); +#else + this->localCreateRigidBody(0,tr,m_collisionShapes[0]); +#endif //USE_COLLISION_OBJECT + + // clientResetScene(); + + m_softBodyWorldInfo.m_sparsesdf.Initialize(); + clientResetScene(); +} + + + + + + +void SoftDemo::exitPhysics() +{ + + //cleanup in the reverse order of creation/initialization + + //remove the rigidbodies from the dynamics world and delete them + int i; + for (i=m_dynamicsWorld->getNumCollisionObjects()-1; i>=0 ;i--) + { + btCollisionObject* obj = m_dynamicsWorld->getCollisionObjectArray()[i]; + btRigidBody* body = btRigidBody::upcast(obj); + if (body && body->getMotionState()) + { + delete body->getMotionState(); + } + m_dynamicsWorld->removeCollisionObject( obj ); + delete obj; + } + + //delete collision shapes + for (int j=0;j m_SoftSoftCollisionAlgorithms; + + btAlignedObjectArray m_SoftRigidCollisionAlgorithms; + + btSoftBodyWorldInfo m_softBodyWorldInfo; + + + bool m_autocam; + bool m_cutting; + bool m_raycast; + btScalar m_animtime; + btClock m_clock; + int m_lastmousepos[2]; + btVector3 m_impact; + btSoftBody::sRayCast m_results; + btSoftBody::Node* m_node; + btVector3 m_goal; + bool m_drag; + + + //keep the collision shapes, for deletion/cleanup + btAlignedObjectArray m_collisionShapes; + + btBroadphaseInterface* m_broadphase; + + btCollisionDispatcher* m_dispatcher; + + + btConstraintSolver* m_solver; + + btCollisionAlgorithmCreateFunc* m_boxBoxCF; + + btDefaultCollisionConfiguration* m_collisionConfiguration; + + +public: + + void initPhysics(); + + void exitPhysics(); + + SoftDemo() : m_drag(false) + { + setTexturing(true); + setShadows(true); + } + virtual ~SoftDemo() + { + exitPhysics(); + } + + virtual void clientMoveAndDisplay(); + + virtual void displayCallback(); + + void createStack( btCollisionShape* boxShape, float halfCubeSize, int size, float zPos ); + + static DemoApplication* Create() + { + SoftDemo* demo = new SoftDemo; + demo->myinit(); + demo->initPhysics(); + return demo; + } + + virtual void setDrawClusters(bool drawClusters); + + virtual const btSoftRigidDynamicsWorld* getSoftDynamicsWorld() const + { + ///just make it a btSoftRigidDynamicsWorld please + ///or we will add type checking + return (btSoftRigidDynamicsWorld*) m_dynamicsWorld; + } + + virtual btSoftRigidDynamicsWorld* getSoftDynamicsWorld() + { + ///just make it a btSoftRigidDynamicsWorld please + ///or we will add type checking + return (btSoftRigidDynamicsWorld*) m_dynamicsWorld; + } + + // + void clientResetScene(); + void renderme(); + void keyboardCallback(unsigned char key, int x, int y); + void mouseFunc(int button, int state, int x, int y); + void mouseMotionFunc(int x,int y); + +}; + +#define MACRO_SOFT_DEMO(a) class SoftDemo##a : public SoftDemo\ +{\ +public:\ + static DemoApplication* Create()\ + {\ + SoftDemo* demo = new SoftDemo##a;\ + extern unsigned int current_demo;\ + current_demo=a;\ + demo->myinit();\ + demo->initPhysics();\ + return demo;\ + }\ +}; + + +MACRO_SOFT_DEMO(0) //Init_Cloth +MACRO_SOFT_DEMO(1) //Init_Pressure +MACRO_SOFT_DEMO(2)//Init_Volume +MACRO_SOFT_DEMO(3)//Init_Ropes +MACRO_SOFT_DEMO(4)//Init_Ropes_Attach +MACRO_SOFT_DEMO(5)//Init_ClothAttach +MACRO_SOFT_DEMO(6)//Init_Sticks +MACRO_SOFT_DEMO(7)//Init_Collide +MACRO_SOFT_DEMO(8)//Init_Collide2 +MACRO_SOFT_DEMO(9)//Init_Collide3 +MACRO_SOFT_DEMO(10)//Init_Impact +MACRO_SOFT_DEMO(11)//Init_Aero +MACRO_SOFT_DEMO(12)//Init_Friction +MACRO_SOFT_DEMO(13)//Init_Torus +MACRO_SOFT_DEMO(14)//Init_TorusMatch +MACRO_SOFT_DEMO(15)//Init_Bunny +MACRO_SOFT_DEMO(16)//Init_BunnyMatch +MACRO_SOFT_DEMO(17)//Init_Cutting1 +MACRO_SOFT_DEMO(18)//Init_ClusterDeform +MACRO_SOFT_DEMO(19)//Init_ClusterCollide1 +MACRO_SOFT_DEMO(20)//Init_ClusterCollide2 +MACRO_SOFT_DEMO(21)//Init_ClusterSocket +MACRO_SOFT_DEMO(22)//Init_ClusterHinge +MACRO_SOFT_DEMO(23)//Init_ClusterCombine +MACRO_SOFT_DEMO(24)//Init_ClusterCar +MACRO_SOFT_DEMO(25)//Init_ClusterRobot +MACRO_SOFT_DEMO(26)//Init_ClusterStackSoft +MACRO_SOFT_DEMO(27)//Init_ClusterStackMixed + + + +#endif //CCD_PHYSICS_DEMO_H + + + + + diff --git a/BulletPhysics/bulletTrunk/Demos/SoftDemo/bunny.inl b/BulletPhysics/bulletTrunk/Demos/SoftDemo/bunny.inl new file mode 100644 index 00000000..1d191b5d --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/SoftDemo/bunny.inl @@ -0,0 +1,1836 @@ +static const char* getNodes() { return( +"454 3 0 0" +" 0 -2.0063499999999999 0.79804200000000003 0.373554" +" 1 -2.1011299999999999 0.90212400000000004 -0.88661400000000001" +" 2 -1.4052100000000001 2.0628700000000002 -1.0458400000000001" +" 3 -1.2015499999999999 1.7112400000000001 0.56249400000000005" +" 4 0.02112 2.8512499999999998 -0.95618999999999998" +" 5 0.011136 2.5152199999999998 0.59149200000000002" +" 6 -1.51681 0.56199600000000005 1.42523" +" 7 -0.977406 1.4278999999999999 1.24143" +" 8 0.0051900000000000002 1.9088499999999999 1.41222" +" 9 -2.4877400000000001 0.98449799999999998 -1.6695199999999999" +" 10 -1.57328 2.1440000000000001 -1.7594799999999999" +" 11 0.027768000000000001 2.8961600000000001 -2.0317599999999998" +" 12 -2.4129700000000001 0.80116799999999999 -2.6594799999999998" +" 13 -1.46269 1.9456500000000001 -2.6205799999999999" +" 14 0.031758000000000002 2.6255500000000001 -2.7499899999999999" +" 15 -2.0392999999999999 -0.24690000000000001 -4.0092699999999999" +" 16 -1.4902899999999999 1.53495 -3.7649599999999999" +" 17 0.037566000000000002 2.2566199999999998 -3.78904" +" 18 -1.29721 -0.760656 -5.3216200000000002" +" 19 -1.0264500000000001 0.069264000000000006 -5.2883199999999997" +" 20 -1.0864400000000001 0.58933800000000003 -4.8886700000000003" +" 21 -0.71934600000000004 1.3127200000000001 -4.5609200000000003" +" 22 -0.47337000000000001 1.6606799999999999 -4.4356900000000001" +" 23 0.040806000000000002 1.86575 -4.4139699999999999" +" 24 -1.01305 0.61432200000000003 -5.5222899999999999" +" 25 -0.62443199999999999 1.0636699999999999 -5.7151800000000001" +" 26 -0.77822400000000003 1.2710900000000001 -5.0200699999999996" +" 27 -0.59924999999999995 1.8655900000000001 -4.7962899999999999" +" 28 0.043422000000000002 2.1701199999999998 -4.7666300000000001" +" 29 -0.467478 1.5525199999999999 -5.5298400000000001" +" 30 0.047742 1.6934499999999999 -5.5900800000000004" +" 31 -1.5133300000000001 -3.3024100000000001 -3.3468599999999999" +" 32 -1.6057999999999999 -3.6205099999999999 -3.9312499999999999" +" 33 -2.6810299999999998 -0.71110200000000001 -2.7969499999999998" +" 34 -2.7569300000000001 -0.55810199999999999 -1.86805" +" 35 -2.2238699999999998 -0.60064799999999996 -0.95672400000000002" +" 36 -2.2319 -0.55194600000000005 -0.066264000000000003" +" 37 -1.97367 -0.58961399999999997 0.53195400000000004" +" 38 -1.6947099999999999 -0.11317199999999999 1.8690100000000001" +" 39 -2.11442 -0.78804600000000002 0.86941199999999996" +" 40 -2.1847599999999998 -1.2017899999999999 1.2143299999999999" +" 41 -1.7037899999999999 -1.3912100000000001 0.142008" +" 42 -1.79366 -0.93130800000000002 2.2183000000000002" +" 43 -1.7627200000000001 -0.73113600000000001 2.51458" +" 44 -1.74098 -1.74478 0.64694399999999996" +" 45 -1.5849899999999999 -1.6370899999999999 0.218082" +" 46 -1.3714 -2.2354400000000001 1.7418499999999999" +" 47 -1.14259 -1.7219800000000001 2.5314999999999999" +" 48 -1.1462300000000001 -1.44584 3.04271" +" 49 -1.72363 -1.65859 -0.39266400000000001" +" 50 -1.7740499999999999 -1.6849099999999999 -1.0451999999999999" +" 51 -2.3972199999999999 -1.87879 -2.2570000000000001" +" 52 -2.3559999999999999 -2.9314900000000002 -2.5649600000000001" +" 53 -1.9900100000000001 -3.4211100000000001 -2.7963200000000001" +" 54 -1.69374 -3.7088399999999999 -3.53532" +" 55 -2.2454299999999998 -3.5692900000000001 -1.9397899999999999" +" 56 -2.2864300000000002 -3.77834 -2.10466" +" 57 -2.2926700000000002 -3.7443599999999999 -1.3294600000000001" +" 58 -1.6362099999999999 -3.39913 1.55494" +" 59 -1.5402100000000001 -3.9804400000000002 1.7164699999999999" +" 60 -1.6856899999999999 -2.5701499999999999 0.33473999999999998" +" 61 -1.1098399999999999 -3.0533600000000001 1.9575899999999999" +" 62 -1.6798299999999999 -3.1615099999999998 2.3719100000000002" +" 63 -1.6955899999999999 -3.9803600000000001 2.4744700000000002" +" 64 -1.1299699999999999 -2.8505600000000002 2.5077199999999999" +" 65 -1.5803 -3.9803799999999998 2.79962" +" 66 -1.2543800000000001 -3.9803600000000001 3.05606" +" 67 -0.012264000000000001 -1.91774 3.31847" +" 68 -0.0075960000000000003 -2.22756 2.4797799999999999" +" 69 -1.3185199999999999 -2.03857 -0.24552599999999999" +" 70 -1.54192 -1.6950700000000001 -0.038094000000000003" +" 71 -1.6302399999999999 -1.5652900000000001 0.010584" +" 72 -0.54714600000000002 -2.5150999999999999 -0.27547199999999999" +" 73 -0.68966400000000005 -2.5785100000000001 -0.74843400000000004" +" 74 -0.68381999999999998 -2.29792 -1.13124" +" 75 -1.45807 -2.78965 -1.4571000000000001" +" 76 -1.88889 -3.03241 -1.94861" +" 77 0.016643999999999999 -2.6251600000000002 -1.5766" +" 78 -0.43575000000000003 -2.5064899999999999 -1.32864" +" 79 -0.96067199999999997 -2.8615900000000001 -1.7606999999999999" +" 80 0.023154000000000001 -2.7205499999999998 -2.6635" +" 81 -0.72217799999999999 -3.4893999999999998 -2.6321300000000001" +" 82 -0.54899399999999998 -3.50515 -1.7670699999999999" +" 83 -0.69881400000000005 -3.59917 -1.12985" +" 84 -1.2481899999999999 -3.0818400000000001 -0.807894" +" 85 -1.41449 -3.6600999999999999 -0.24563399999999999" +" 86 -2.0695000000000001 -3.7349199999999998 -0.51227999999999996" +" 87 -2.0184099999999998 -3.1911800000000001 -1.27379" +" 88 0.011766 -2.7572999999999999 -0.81328199999999995" +" 89 -0.34977599999999998 -2.5832199999999998 -0.26063999999999998" +" 90 0.0082679999999999993 -2.6970700000000001 -0.226572" +" 91 -0.78081 -3.0613299999999999 0.47486400000000001" +" 92 0.000852 -2.8652899999999999 0.942384" +" 93 -0.68570399999999998 -2.7192400000000001 1.8263799999999999" +" 94 -0.003552 -2.6613500000000001 1.71241" +" 95 -0.33728999999999998 -3.98041 1.95644" +" 96 -0.15748799999999999 -3.4080599999999999 1.63991" +" 97 -0.295566 -3.1863800000000002 2.3391199999999999" +" 98 -0.76257600000000003 -3.9803899999999999 2.8759000000000001" +" 99 -0.350304 -3.98041 2.2373500000000002" +" 100 -1.8237699999999999 0.32519399999999998 3.7555299999999998" +" 101 -1.6115600000000001 1.16042 3.0165999999999999" +" 102 -1.6629499999999999 0.75673800000000002 2.6597300000000001" +" 103 -1.72563 -0.034332000000000001 3.1910599999999998" +" 104 -1.3883799999999999 -0.72773399999999999 3.5243199999999999" +" 105 -1.52085 -0.490782 4.53925" +" 106 -1.1709799999999999 -0.82781400000000005 4.3680700000000003" +" 107 -1.00604 -0.939438 3.6563300000000001" +" 108 -0.875502 -1.01417 4.1856" +" 109 -0.46665600000000002 -1.28548 3.7355200000000002" +" 110 -0.46123799999999998 -1.28983 4.17781" +" 111 -0.014045999999999999 -1.3988100000000001 3.7371500000000002" +" 112 -0.016379999999999999 -1.2811600000000001 4.1475999999999997" +" 113 -0.018815999999999999 -1.15577 4.57639" +" 114 -0.336816 -1.20733 4.58284" +" 115 -0.68753399999999998 -0.99715200000000004 4.6243400000000001" +" 116 -0.93086999999999998 -0.77779200000000004 4.7504299999999997" +" 117 -1.1016699999999999 -0.35222999999999999 5.0820699999999999" +" 118 -0.99337200000000003 0.01188 5.0003200000000003" +" 119 -1.3205 0.11948400000000001 4.6136100000000004" +" 120 -1.5343800000000001 0.54183599999999998 4.0246899999999997" +" 121 -1.53356 0.68299799999999999 3.9803299999999999" +" 122 -1.3582799999999999 1.27593 3.7064400000000002" +" 123 -0.020202000000000001 -1.17205 4.7980799999999997" +" 124 -0.17845800000000001 -1.26305 4.9630799999999997" +" 125 -0.022908000000000001 -1.1687000000000001 5.2418199999999997" +" 126 -0.024695999999999999 -0.94744200000000001 5.5876099999999997" +" 127 -0.18768000000000001 -1.1073299999999999 5.3368599999999997" +" 128 -0.35931000000000002 -1.10669 5.0479799999999999" +" 129 -0.811998 -0.98599199999999998 5.2691999999999997" +" 130 -0.51344400000000001 -1.02569 5.55328" +" 131 -0.98299800000000004 -0.56501999999999997 5.3826799999999997" +" 132 -0.83066399999999996 -0.62549999999999994 5.6758499999999996" +" 133 -0.50098200000000004 -0.50960399999999995 5.8776400000000004" +" 134 -0.026598 -0.87985199999999997 5.9152300000000002" +" 135 -0.90429000000000004 0.19589999999999999 5.3046699999999998" +" 136 -0.81535199999999997 -0.21312 5.6727299999999996" +" 137 -0.42367199999999999 0.22109400000000001 5.8544" +" 138 -0.026748000000000001 -0.25515599999999999 6.0940200000000004" +" 139 -0.025493999999999999 0.276252 6.0194400000000003" +" 140 -0.521814 0.79934400000000005 5.6858000000000004" +" 141 -0.023238000000000002 0.96962999999999999 5.8229899999999999" +" 142 -0.75326400000000004 0.84007200000000004 5.5060700000000002" +" 143 -0.75390599999999997 1.5014799999999999 5.1456099999999996" +" 144 -0.018762000000000001 1.70442 5.2732200000000002" +" 145 -0.955044 0.75435600000000003 5.3332699999999997" +" 146 -1.10284 1.1818200000000001 5.0668800000000003" +" 147 -0.95933999999999997 1.7504200000000001 4.3948799999999997" +" 148 -1.1969700000000001 1.2433799999999999 4.6791799999999997" +" 149 -1.23709 0.98764799999999997 4.1595399999999998" +" 150 -1.1178900000000001 0.96413400000000005 4.9031599999999997" +" 151 -1.15696 1.00024 4.6936299999999997" +" 152 -1.05067 0.66004799999999997 5.1637300000000002" +" 153 -0.96613199999999999 0.34451999999999999 5.1306700000000003" +" 154 -1.0339100000000001 0.21693000000000001 4.8971299999999998" +" 155 -1.14191 0.38449800000000001 4.5636299999999999" +" 156 -1.1704300000000001 0.77507400000000004 4.3866199999999997" +" 157 -1.2187600000000001 2.4617200000000001 4.0832199999999998" +" 158 -1.30006 1.85564 3.8536299999999999" +" 159 -1.44909 1.8689100000000001 3.5269900000000001" +" 160 -0.013254 2.19998 4.49648" +" 161 -0.52937999999999996 2.3775900000000001 4.0718100000000002" +" 162 -1.02088 0.65710199999999996 5.0446999999999997" +" 163 -0.96312600000000004 0.40659600000000001 4.9839000000000002" +" 164 -1.08928 0.83882999999999996 4.8728800000000003" +" 165 -1.08297 0.89140799999999998 4.6565200000000004" +" 166 -1.0815300000000001 0.77475000000000005 4.4651500000000004" +" 167 -1.1177900000000001 0.46984799999999999 4.6161099999999999" +" 168 -1.00573 0.363234 4.8400499999999997" +" 169 -1.1392599999999999 0.61656 4.8154899999999996" +" 170 -0.65003999999999995 2.7326800000000002 3.9430399999999999" +" 171 -1.4495100000000001 3.1655500000000001 4.0157800000000003" +" 172 -1.59406 3.0802 3.8075600000000001" +" 173 -1.21844 2.8713000000000002 3.48916" +" 174 -1.60063 3.85398 3.6123699999999999" +" 175 -1.3017700000000001 3.3890799999999999 3.2126100000000002" +" 176 -1.21326 3.1529699999999998 2.8556599999999999" +" 177 -1.16333 2.80755 3.12364" +" 178 -1.5950200000000001 4.5435999999999996 3.0055999999999998" +" 179 -1.44184 3.9206400000000001 2.77929" +" 180 -1.8554299999999999 4.6612099999999996 1.82836" +" 181 -1.62605 4.09856 2.2921100000000001" +" 182 -1.8726700000000001 4.0265899999999997 1.7201200000000001" +" 183 -1.6127499999999999 3.7460499999999999 2.2633899999999998" +" 184 -1.81474 3.2039800000000001 2.1617299999999999" +" 185 -1.5819399999999999 3.1758600000000001 2.4753799999999999" +" 186 -1.69387 2.4910000000000001 2.6859999999999999" +" 187 -1.4352100000000001 2.6525799999999999 2.9736199999999999" +" 188 -1.32026 3.4141599999999999 2.6752600000000002" +" 189 -0.0075779999999999997 2.3737900000000001 3.6121699999999999" +" 190 -0.34406999999999999 2.6552099999999998 3.4333399999999998" +" 191 -0.53356199999999998 3.0379999999999998 3.1746400000000001" +" 192 -0.75442799999999999 3.2104599999999999 3.6774800000000001" +" 193 -0.75750600000000001 3.4630200000000002 2.8989500000000001" +" 194 -0.89756400000000003 3.6691199999999999 3.34639" +" 195 -0.979128 3.96475 2.9464800000000002" +" 196 -1.0348900000000001 3.9803199999999999 2.4925000000000002" +" 197 -0.96278399999999997 3.5502600000000002 2.2239499999999999" +" 198 -0.93867 3.2183799999999998 2.2698100000000001" +" 199 -0.81897600000000004 2.66615 2.5513599999999999" +" 200 -0.573384 2.24261 2.8419500000000002" +" 201 -0.62487599999999999 1.89547 2.9886200000000001" +" 202 -0.0029759999999999999 2.3051599999999999 2.8429000000000002" +" 203 -0.001098 1.7866200000000001 2.4089200000000002" +" 204 -0.77425200000000005 1.62087 2.60697" +" 205 0.00059999999999999995 1.63778 2.09483" +" 206 -0.67835999999999996 1.4218999999999999 2.31332" +" 207 0.043560000000000001 0.097865999999999995 -5.3003799999999996" +" 208 0.047190000000000003 0.73262400000000005 -5.7368199999999998" +" 209 -0.197052 0.69169199999999997 -5.7195099999999996" +" 210 -0.53469 0.65069399999999999 -5.7019000000000002" +" 211 -0.28464 0.088373999999999994 -5.2965400000000002" +" 212 -0.62674799999999997 0.078822000000000003 -5.2924199999999999" +" 213 -0.51863400000000004 -3.5091999999999999 -3.6500599999999999" +" 214 -0.69015599999999999 -3.9756300000000002 -2.62039" +" 215 -0.43009799999999998 -3.9922300000000002 -3.6383100000000002" +" 216 -1.5472999999999999 -3.9922900000000001 -3.9483100000000002" +" 217 -1.6352500000000001 -3.9922900000000001 -3.5523799999999999" +" 218 -2.2279300000000002 -3.9922900000000001 -2.1217199999999998" +" 219 -2.2341700000000002 -3.9922900000000001 -1.3465199999999999" +" 220 -2.0110000000000001 -3.9922800000000001 -0.47173799999999999" +" 221 -1.35599 -3.9922499999999999 -0.23388600000000001" +" 222 -0.64031400000000005 -3.9922399999999998 -1.1181099999999999" +" 223 -0.49049399999999999 -3.9922300000000002 -1.75532" +" 224 0.041658000000000001 -0.54903000000000002 -5.1501200000000003" +" 225 0.036701999999999999 -1.68591 -4.6197999999999997" +" 226 0.026970000000000001 -3.01416 -3.3587899999999999" +" 227 -1.1918299999999999 -1.81281 -5.0749000000000004" +" 228 -1.4243699999999999 -3.2552599999999998 -3.5231300000000001" +" 229 -1.62001 -1.67693 -4.0191699999999999" +" 230 -0.80728200000000006 -0.71911199999999997 -5.7540199999999997" +" 231 -0.31252799999999997 -0.73477800000000004 -5.6672900000000004" +" 232 -0.74677800000000005 -1.76105 -5.3974000000000002" +" 233 -0.28569600000000001 -1.73786 -5.2757500000000004" +" 234 -1.0115700000000001 -3.1747899999999998 -3.9295900000000001" +" 235 -0.59875800000000001 -3.0943100000000001 -3.8752399999999998" +" 236 -1.1170100000000001 -3.6316899999999999 -4.3481399999999999" +" 237 -0.67781999999999998 -3.49858 -4.2448100000000002" +" 238 -0.64891200000000004 -3.9922499999999999 -4.2024499999999998" +" 239 -1.0981099999999999 -3.99227 -4.3057800000000004" +" 240 -2.0971700000000002 -2.0067499999999998 -3.0719099999999999" +" 241 -0.84709199999999996 -2.6262300000000001 -4.7891599999999999" +" 242 -1.2760199999999999 -2.6923499999999998 -4.4246800000000004" +" 243 -1.56667 -2.4896699999999998 -3.6830099999999999" +" 244 -0.46418399999999999 -2.5888800000000001 -4.6686800000000002" +" 245 0.031043999999999999 -2.55166 -3.9095499999999999" +" 246 0.535416 -2.5903900000000002 -4.66256" +" 247 1.6260399999999999 -2.4944899999999999 -3.6634600000000002" +" 248 1.34389 -2.6962999999999999 -4.4086400000000001" +" 249 0.91964999999999997 -2.6288999999999998 -4.7783499999999997" +" 250 2.1504799999999999 -2.0131700000000001 -3.04589" +" 251 1.1606000000000001 -3.9956800000000001 -4.2919499999999999" +" 252 0.71017799999999998 -3.9943 -4.1941300000000004" +" 253 0.74109000000000003 -3.5007199999999998 -4.2361199999999997" +" 254 1.1811100000000001 -3.6351599999999999 -4.3340699999999996" +" 255 0.65872799999999998 -3.0962100000000001 -3.86754" +" 256 1.0719399999999999 -3.17794 -3.91682" +" 257 0.36694199999999999 -1.7388399999999999 -5.2717599999999996" +" 258 0.82940400000000003 -1.7634300000000001 -5.3877499999999996" +" 259 0.40159800000000001 -0.73585800000000001 -5.6629199999999997" +" 260 0.89742599999999995 -0.72168600000000005 -5.7435799999999997" +" 261 1.6859299999999999 -1.6819299999999999 -3.99892" +" 262 1.47949 -3.2596500000000002 -3.5053399999999999" +" 263 1.2703199999999999 -1.8165199999999999 -5.0598200000000002" +" 264 0.52179600000000004 -3.99376 -1.74912" +" 265 0.66380399999999995 -3.9942099999999998 -1.1101300000000001" +" 266 1.36859 -3.9963700000000002 -0.21720600000000001" +" 267 2.0264600000000002 -3.99838 -0.44701800000000003" +" 268 2.2603300000000002 -3.9990800000000002 -1.319" +" 269 2.2635900000000002 -3.9990800000000002 -2.09422" +" 270 1.6884699999999999 -3.9973000000000001 -3.5320200000000002" +" 271 1.60538 -3.9970400000000001 -3.9289999999999998" +" 272 0.48447000000000001 -3.9936099999999999 -3.6327099999999999" +" 273 0.73209599999999997 -3.9777800000000001 -2.6116799999999998" +" 274 0.57460199999999995 -3.51085 -3.64337" +" 275 0.71366399999999997 0.076794000000000001 -5.2842099999999999" +" 276 0.37166399999999999 0.087384000000000003 -5.2925199999999997" +" 277 0.62834999999999996 0.64893599999999996 -5.6947799999999997" +" 278 0.291078 0.69095399999999996 -5.71652" +" 279 0.676176 1.4198599999999999 2.3216199999999998" +" 280 0.76906200000000002 1.6185400000000001 2.6164299999999998" +" 281 0.61585800000000002 1.8935999999999999 2.9962200000000001" +" 282 0.56720999999999999 2.2408899999999998 2.8489399999999998" +" 283 0.81762000000000001 2.6636799999999998 2.5613700000000001" +" 284 0.94242599999999999 3.2155399999999998 2.2813300000000001" +" 285 0.96809999999999996 3.5473400000000002 2.2357800000000001" +" 286 1.0382100000000001 3.9771899999999998 2.5051899999999998" +" 287 0.97684800000000005 3.9617900000000001 2.9584600000000001" +" 288 0.88949999999999996 3.66642 3.3573300000000001" +" 289 0.75431400000000004 3.4607399999999999 2.90821" +" 290 0.74093399999999998 3.2081900000000001 3.6866400000000001" +" 291 0.52572600000000003 3.0364 3.18113" +" 292 0.331926 2.6541899999999998 3.4374899999999999" +" 293 1.31962 3.4101699999999999 2.69143" +" 294 1.42859 2.64825 2.9911699999999999" +" 295 1.6902699999999999 2.4858899999999999 2.7067299999999999" +" 296 1.583 3.1710799999999999 2.4947599999999999" +" 297 1.8197000000000001 3.1984900000000001 2.1839900000000001" +" 298 1.61812 3.7411699999999999 2.2831700000000001" +" 299 1.8855299999999999 4.0209200000000003 1.7431399999999999" +" 300 1.6321399999999999 4.0936399999999997 2.3120599999999998" +" 301 1.8688800000000001 4.6555900000000001 1.8511599999999999" +" 302 1.44143 3.91628 2.7969499999999998" +" 303 1.59371 4.53878 3.0251199999999998" +" 304 1.15537 2.8040500000000002 3.1378300000000001" +" 305 1.20963 3.1493099999999998 2.8704999999999998" +" 306 1.2944599999999999 3.3851599999999999 3.2284999999999999" +" 307 1.5898099999999999 3.8491599999999999 3.6318999999999999" +" 308 1.2061900000000001 2.8676400000000002 3.5040100000000001" +" 309 1.5785199999999999 3.0754000000000001 3.8269899999999999" +" 310 1.4316899999999999 3.1612 4.0334199999999996" +" 311 0.63185400000000003 2.7307399999999999 3.9508899999999998" +" 312 1.1039600000000001 0.61316999999999999 4.8292299999999999" +" 313 0.96937799999999996 0.36025200000000002 4.85215" +" 314 1.08449 0.46652399999999999 4.6295999999999999" +" 315 1.05101 0.77152799999999999 4.4782099999999998" +" 316 1.0504500000000001 0.88817999999999997 4.6695799999999998" +" 317 1.0539499999999999 0.83559000000000005 4.8860000000000001" +" 318 0.92514600000000002 0.40374599999999999 4.9954700000000001" +" 319 0.982908 0.65407800000000005 5.0569800000000003" +" 320 0.50856000000000001 2.37602 4.0781700000000001" +" 321 1.43333 1.86456 3.5446499999999999" +" 322 1.2802800000000001 1.85175 3.8694299999999999" +" 323 1.198 2.4580700000000002 4.09802" +" 324 1.14086 0.77158199999999999 4.4007800000000001" +" 325 1.109 0.38109599999999999 4.5774100000000004" +" 326 0.99641999999999997 0.213864 4.9095700000000004" +" 327 0.92616600000000004 0.34165800000000002 5.1422499999999998" +" 328 1.01125 0.65693400000000002 5.1763500000000002" +" 329 1.12432 0.99678599999999995 4.7075899999999997" +" 330 1.08257 0.96081000000000005 4.9166299999999996" +" 331 1.2109399999999999 0.98394599999999999 4.1745400000000004" +" 332 1.1652400000000001 1.2398100000000001 4.6936499999999999" +" 333 0.93262800000000001 1.74756 4.4064699999999997" +" 334 1.0661799999999999 1.1785399999999999 5.0801600000000002" +" 335 0.91383000000000003 0.75153599999999998 5.3447199999999997" +" 336 0.71727600000000002 1.49926 5.1546200000000004" +" 337 0.71021400000000001 0.83785799999999999 5.5150399999999999" +" 338 0.47645999999999999 0.79783800000000005 5.69191" +" 339 0.37451400000000001 0.219888 5.85928" +" 340 0.76708200000000004 -0.21551400000000001 5.6824199999999996" +" 341 0.86174399999999995 0.19323599999999999 5.31548" +" 342 0.44932800000000001 -0.51103799999999999 5.8834600000000004" +" 343 0.78110400000000002 -0.62793600000000005 5.6857199999999999" +" 344 0.93720599999999998 -0.56791800000000003 5.3944400000000003" +" 345 0.464196 -1.0271600000000001 5.5592699999999997" +" 346 0.76633200000000001 -0.98837399999999997 5.2788599999999999" +" 347 0.31602000000000002 -1.10771 5.0521099999999999" +" 348 0.14086199999999999 -1.1078300000000001 5.33887" +" 349 0.13575599999999999 -1.26352 4.9649999999999999" +" 350 1.33853 1.27186 3.72296" +" 351 1.5086599999999999 0.67840199999999995 3.9989599999999998" +" 352 1.50851 0.53724000000000005 4.0433199999999996" +" 353 1.28616 0.115548 4.6295700000000002" +" 354 0.95399400000000001 0.00894 5.0122400000000003" +" 355 1.0601799999999999 -0.35549399999999998 5.0953099999999996" +" 356 0.89217599999999997 -0.78054599999999996 4.76159" +" 357 0.64973999999999998 -0.99916799999999995 4.63253" +" 358 0.29892000000000002 -1.2082900000000001 4.5867199999999997" +" 359 0.42804599999999998 -1.2911699999999999 4.1832500000000001" +" 360 0.438888 -1.28685 3.7410600000000001" +" 361 0.84301199999999998 -1.01677 4.1961199999999996" +" 362 0.980244 -0.942438 3.6684999999999999" +" 363 1.1368 -0.83130000000000004 4.3822000000000001" +" 364 1.48556 -0.49532399999999999 4.5576600000000003" +" 365 1.3648100000000001 -0.73189199999999999 3.5411800000000002" +" 366 1.70821 -0.039516000000000003 3.2120799999999998" +" 367 1.65445 0.751722 2.6800600000000001" +" 368 1.5999000000000001 1.1555599999999999 3.03626" +" 369 1.8005199999999999 0.31972200000000001 3.77772" +" 370 0.3327 -3.9836100000000001 2.2503899999999999" +" 371 0.737124 -3.9848300000000001 2.8939400000000002" +" 372 0.27911999999999998 -3.1894300000000002 2.3515100000000002" +" 373 0.14894399999999999 -3.4106999999999998 1.6506400000000001" +" 374 0.32312999999999997 -3.98359 1.9693400000000001" +" 375 0.67697399999999996 -2.7212900000000002 1.83473" +" 376 0.78759000000000001 -3.0636999999999999 0.48447600000000002" +" 377 0.36704399999999998 -2.5842999999999998 -0.25625999999999999" +" 378 2.0461100000000001 -3.1973199999999999 -1.2488999999999999" +" 379 2.08623 -3.7412000000000001 -0.48683399999999999" +" 380 1.42824 -3.66439 -0.22822200000000001" +" 381 1.27058 -3.0856400000000002 -0.79246799999999995" +" 382 0.72363 -3.6013099999999998 -1.12114" +" 383 0.58191000000000004 -3.5068600000000001 -1.76014" +" 384 0.76572600000000002 -3.4916499999999999 -2.6230199999999999" +" 385 0.99541199999999996 -2.8645499999999999 -1.7487200000000001" +" 386 0.46632000000000001 -2.5078499999999999 -1.32311" +" 387 1.9253499999999999 -3.0381800000000001 -1.9252400000000001" +" 388 1.4892799999999999 -2.7940999999999998 -1.4390499999999999" +" 389 0.712584 -2.30003 -1.1226799999999999" +" 390 0.71289599999999997 -2.5806399999999998 -0.739842" +" 391 0.56478600000000001 -2.5167799999999998 -0.26866200000000001" +" 392 1.64716 -1.5702400000000001 0.03066" +" 393 1.55905 -1.6997500000000001 -0.019109999999999999" +" 394 1.33717 -2.0425900000000001 -0.22925999999999999" +" 395 1.2266699999999999 -3.9862799999999998 3.08012" +" 396 1.55572 -3.9872800000000002 2.82769" +" 397 1.1124099999999999 -2.8561200000000002 2.5303100000000001" +" 398 1.6749799999999999 -3.9876200000000002 2.5039699999999998" +" 399 1.6629400000000001 -3.16873 2.4012500000000001" +" 400 1.0984100000000001 -3.0588700000000002 1.97997" +" 401 1.6955899999999999 -2.5752600000000001 0.35545199999999999" +" 402 1.5288999999999999 -3.98725 1.7441199999999999" +" 403 1.62862 -3.4062399999999999 1.5838000000000001" +" 404 2.3193700000000002 -3.7513299999999998 -1.30122" +" 405 2.3225199999999999 -3.7852999999999999 -2.0764399999999998" +" 406 2.2801300000000002 -3.57613 -1.9120699999999999" +" 407 1.7476100000000001 -3.7140399999999998 -3.51424" +" 408 2.0356800000000002 -3.42719 -2.7716799999999999" +" 409 2.4002699999999999 -2.9386700000000001 -2.5358399999999999" +" 410 2.4409000000000001 -1.88609 -2.2273800000000001" +" 411 1.8035300000000001 -1.69031 -1.02329" +" 412 1.7452000000000001 -1.6638200000000001 -0.37142999999999998" +" 413 1.1264099999999999 -1.4492700000000001 3.0566200000000001" +" 414 1.12819 -1.7254100000000001 2.5453999999999999" +" 415 1.3651199999999999 -2.2395700000000001 1.75861" +" 416 1.5991599999999999 -1.6418999999999999 0.23758199999999999" +" 417 1.7495499999999999 -1.7500599999999999 0.66831600000000002" +" 418 1.7514799999999999 -0.73644600000000005 2.5360999999999998" +" 419 1.7854399999999999 -0.93671400000000005 2.2402099999999998" +" 420 1.7196199999999999 -1.39639 0.16297200000000001" +" 421 2.18798 -1.2083900000000001 1.2411000000000001" +" 422 2.1231300000000002 -0.79444800000000004 0.89536800000000005" +" 423 1.6932499999999999 -0.11829000000000001 1.8897600000000001" +" 424 1.98712 -0.59559600000000001 0.55620599999999998" +" 425 2.25278 -0.55871999999999999 -0.038802000000000003" +" 426 2.2555000000000001 -0.60741599999999996 -0.92929200000000001" +" 427 2.7998099999999999 -0.566496 -1.8340099999999999" +" 428 2.7348300000000001 -0.71928599999999998 -2.7637900000000002" +" 429 1.66479 -3.6254499999999998 -3.9112300000000002" +" 430 1.56613 -3.3070599999999999 -3.3279999999999998" +" 431 0.56176199999999998 1.5509599999999999 -5.5235300000000001" +" 432 0.68548799999999999 1.86365 -4.7884200000000003" +" 433 0.86539200000000005 1.2685999999999999 -5.0100100000000003" +" 434 0.71949600000000002 1.0616399999999999 -5.70695" +" 435 1.1043700000000001 0.611124 -5.5093199999999998" +" 436 0.55458600000000002 1.65913 -4.4293899999999997" +" 437 0.80102399999999996 1.3104199999999999 -4.5516100000000002" +" 438 1.1699200000000001 0.58592999999999995 -4.87486" +" 439 1.1132500000000001 0.066030000000000005 -5.2752100000000004" +" 440 1.3818900000000001 -0.76470000000000005 -5.3052099999999998" +" 441 1.5628299999999999 1.53034 -3.74627" +" 442 2.1093999999999999 -0.253164 -3.98386" +" 443 1.5224500000000001 1.9411400000000001 -2.6023000000000001" +" 444 2.4696699999999998 0.793794 -2.6295799999999998" +" 445 1.6230800000000001 2.1391800000000001 -1.7399" +" 446 2.53288 0.97691399999999995 -1.6387799999999999" +" 447 0.988344 1.4249400000000001 1.2534700000000001" +" 448 1.52284 0.55740000000000001 1.44384" +" 449 1.2216499999999999 1.7075800000000001 0.57733800000000002" +" 450 1.44604 2.0585599999999999 -1.0283800000000001" +" 451 2.13646 0.89572799999999997 -0.86065800000000003" +" 452 2.0259399999999999 0.79195199999999999 0.39824399999999999" +" 453 -0.42761063083709772 1.6952470543869633 2.5510779406671853" +"# Generated by tetgen -YY bunny.smesh " +); } +static const char* getElements() { return( +"1374 4 0" +" 0 395 372 399 371" +" 1 96 46 93 44" +" 2 135 140 137 163" +" 3 318 326 354 313" +" 4 133 127 128 126" +" 5 76 83 55 218" +" 6 193 188 198 176" +" 7 450 443 451 1" +" 8 437 442 438 441" +" 9 160 336 320 144" +" 10 79 50 51 75" +" 11 408 378 387 273" +" 12 94 38 47 68" +" 13 323 308 322 311" +" 14 339 135 163 341" +" 15 152 135 153 145" +" 16 333 166 160 147" +" 17 348 346 347 342" +" 18 446 426 451 444" +" 19 46 92 94 93" +" 20 208 21 26 207" +" 21 38 360 48 413" +" 22 229 80 243 245" +" 23 241 229 227 242" +" 24 34 50 35 51" +" 25 9 33 35 34" +" 26 103 122 121 206" +" 27 257 260 259 440" +" 28 142 318 163 144" +" 29 446 443 444 451" +" 30 272 251 252 274" +" 31 193 199 176 198" +" 32 165 149 147 166" +" 33 447 3 8 449" +" 34 29 208 209 30" +" 35 300 285 286 299" +" 36 100 104 119 105" +" 37 39 44 40 41" +" 38 315 318 313 316" +" 39 422 417 421 419" +" 40 382 273 264 383" +" 41 145 143 150 146" +" 42 406 268 405 404" +" 43 427 411 426 428" +" 44 323 290 308 311" +" 45 232 18 230 227" +" 46 243 79 80 240" +" 47 391 412 390 389" +" 48 360 423 107 362" +" 49 389 71 393 392" +" 50 142 162 163 145" +" 51 245 247 261 80" +" 52 376 373 375 92" +" 53 324 352 325 362" +" 54 119 104 106 105" +" 55 165 149 166 151" +" 56 428 389 411 442" +" 57 366 351 331 352" +" 58 166 318 316 163" +" 59 368 281 280 350" +" 60 315 168 313 166" +" 61 417 422 423 419" +" 62 279 203 205 453" +" 63 80 243 245 226" +" 64 416 41 420 45" +" 65 319 330 317 335" +" 66 15 442 225 224" +" 67 116 131 117 129" +" 68 335 318 337 319" +" 69 188 197 193 198" +" 70 326 314 325 313" +" 71 313 315 314 325" +" 72 451 3 449 450" +" 73 451 449 452 450" +" 74 299 286 300 301" +" 75 450 1 3 2" +" 76 107 103 120 149" +" 77 76 82 81 79" +" 78 81 83 218 214" +" 79 14 10 2 11" +" 80 22 436 437 23" +" 81 318 144 316 163" +" 82 420 426 425 412" +" 83 450 14 11 445" +" 84 262 254 429 274" +" 85 443 442 441 444" +" 86 356 353 364 363" +" 87 102 122 206 101" +" 88 315 168 325 313" +" 89 281 331 280 350" +" 90 107 155 120 104" +" 91 443 426 444 451" +" 92 123 118 354 113" +" 93 84 220 86 83" +" 94 268 406 405 269" +" 95 287 293 289 286" +" 96 17 16 443 13" +" 97 315 168 166 325" +" 98 283 296 297 284" +" 99 333 144 336 160" +" 100 450 13 1 2" +" 101 414 423 418 419" +" 102 331 352 324 362" +" 103 144 315 333 316" +" 104 21 442 16 15" +" 105 45 72 91 69" +" 106 437 208 21 433" +" 107 288 310 290 306" +" 108 213 217 214 31" +" 109 335 327 328 341" +" 110 109 67 48 111" +" 111 316 314 315 312" +" 112 45 60 91 44" +" 113 128 118 115 116" +" 114 423 45 38 448" +" 115 155 362 166 325" +" 116 130 136 132 133" +" 117 92 72 89 91" +" 118 145 143 142 150" +" 119 153 140 163 142" +" 120 317 313 312 319" +" 121 347 118 126 354" +" 122 148 165 147 143" +" 123 170 157 171 173" +" 124 78 50 74 240" +" 125 381 273 385 378" +" 126 337 330 335 317" +" 127 267 273 379 268" +" 128 80 247 261 250" +" 129 80 225 261 245" +" 130 80 442 261 225" +" 131 211 24 212 20" +" 132 398 395 399 371" +" 133 390 389 377 391" +" 134 308 292 290 291" +" 135 176 191 177 199" +" 136 318 166 313 163" +" 137 23 16 436 17" +" 138 354 353 325 326" +" 139 423 362 366 279" +" 140 415 400 375 403" +" 141 217 239 216 213" +" 142 377 89 88 90" +" 143 10 12 13 9" +" 144 155 325 113 112" +" 145 151 164 165 150" +" 146 113 118 128 123" +" 147 95 97 99 96" +" 148 449 3 8 5" +" 149 61 99 97 64" +" 150 223 83 222 82" +" 151 37 38 6 39" +" 152 0 7 6 37" +" 153 385 430 247 250" +" 154 108 109 110 107" +" 155 415 401 417 403" +" 156 102 121 122 101" +" 157 120 107 149 156" +" 158 104 100 119 120" +" 159 3 4 2 5" +" 160 207 21 224 437" +" 161 270 273 408 430" +" 162 80 247 226 245" +" 163 80 228 81 243" +" 164 43 107 48 38" +" 165 354 340 344 341" +" 166 312 316 313 317" +" 167 435 275 277 439" +" 168 27 30 29 28" +" 169 52 76 31 240" +" 170 338 339 163 318" +" 171 47 43 42 48" +" 172 61 96 59 58" +" 173 428 389 442 261" +" 174 194 171 192 174" +" 175 318 339 341 338" +" 176 417 422 416 423" +" 177 123 124 125 128" +" 178 113 108 115 155" +" 179 300 285 299 298" +" 180 320 160 189 333" +" 181 443 35 1 13" +" 182 96 46 44 61" +" 183 316 314 313 315" +" 184 119 107 155 106" +" 185 357 325 356 361" +" 186 224 15 21 20" +" 187 319 336 337 317" +" 188 306 287 307 302" +" 189 143 141 140 144" +" 190 366 423 279 367" +" 191 74 73 88 89" +" 192 447 7 8 3" +" 193 449 8 447 5" +" 194 436 21 22 437" +" 195 92 72 91 45" +" 196 153 140 142 135" +" 197 206 121 103 149" +" 198 35 69 389 71" +" 199 165 168 167 166" +" 200 12 1 13 9" +" 201 361 112 113 325" +" 202 195 175 193 194" +" 203 292 304 322 321" +" 204 337 336 144 338" +" 205 399 372 400 371" +" 206 332 336 334 333" +" 207 111 68 67 48" +" 208 389 391 393 72" +" 209 196 179 188 195" +" 210 104 119 155 120" +" 211 168 166 325 155" +" 212 112 108 113 155" +" 213 449 425 451 452" +" 214 220 214 83 221" +" 215 261 246 245 225" +" 216 93 44 46 92" +" 217 80 255 226 247" +" 218 384 262 247 430" +" 219 336 144 319 337" +" 220 144 315 316 166" +" 221 332 336 333 316" +" 222 175 191 194 192" +" 223 362 353 325 363" +" 224 110 113 115 114" +" 225 400 370 374 402" +" 226 319 337 335 317" +" 227 430 262 247 248" +" 228 324 362 315 331" +" 229 80 228 235 81" +" 230 347 342 126 348" +" 231 295 283 296 297" +" 232 306 304 305 308" +" 233 356 353 325 354" +" 234 21 23 437 433" +" 235 195 174 194 178" +" 236 192 175 177 173" +" 237 302 287 303 286" +" 238 208 211 26 209" +" 239 118 128 115 113" +" 240 351 366 369 352" +" 241 342 344 340 343" +" 242 118 347 123 354" +" 243 354 168 163 313" +" 244 356 325 363 361" +" 245 282 321 294 304" +" 246 268 379 267 404" +" 247 296 305 284 283" +" 248 290 304 308 291" +" 249 316 318 313 319" +" 250 143 160 147 161" +" 251 149 201 122 147" +" 252 38 448 45 6" +" 253 92 415 417 94" +" 254 225 224 261 440" +" 255 198 185 184 186" +" 256 7 205 447 8" +" 257 368 351 350 367" +" 258 74 13 12 35" +" 259 190 147 161 158" +" 260 270 429 262 407" +" 261 3 4 450 2" +" 262 15 443 442 16" +" 263 193 188 195 196" +" 264 342 347 340 344" +" 265 391 393 45 416" +" 266 92 415 94 375" +" 267 61 60 91 58" +" 268 60 72 69 91" +" 269 289 283 305 291" +" 270 96 44 93 92" +" 271 324 362 325 315" +" 272 13 2 14 10" +" 273 62 63 61 64" +" 274 144 166 160 315" +" 275 417 423 416 94" +" 276 449 4 450 3" +" 277 450 13 443 1" +" 278 352 364 365 369" +" 279 7 448 205 6" +" 280 225 440 261 263" +" 281 116 155 119 118" +" 282 2 4 450 11" +" 283 416 377 92 89" +" 284 376 403 415 375" +" 285 417 376 415 92" +" 286 416 377 89 391" +" 287 249 262 246 256" +" 288 336 317 316 330" +" 289 47 43 48 38" +" 290 354 168 313 113" +" 291 115 168 118 113" +" 292 34 50 51 33" +" 293 166 169 167 165" +" 294 319 316 317 313" +" 295 318 144 337 319" +" 296 354 325 313 326" +" 297 30 436 433 431" +" 298 289 283 291 284" +" 299 58 91 96 59" +" 300 185 182 183 197" +" 301 224 438 276 437" +" 302 15 442 80 225" +" 303 111 110 112 109" +" 304 52 76 240 51" +" 305 208 26 30 29" +" 306 7 449 3 447" +" 307 296 294 283 295" +" 308 306 291 289 305" +" 309 338 140 141 144" +" 310 331 352 351 324" +" 311 322 281 333 320" +" 312 83 81 76 82" +" 313 384 262 274 255" +" 314 60 45 91 69" +" 315 15 20 19 16" +" 316 197 188 193 196" +" 317 80 229 225 245" +" 318 18 233 227 232" +" 319 344 345 343 342" +" 320 417 414 94 415" +" 321 443 16 441 442" +" 322 177 199 187 176" +" 323 149 206 121 453" +" 324 350 279 331 280" +" 325 181 188 196 179" +" 326 102 121 101 103" +" 327 347 357 354 356" +" 328 338 327 318 337" +" 329 337 330 334 335" +" 330 319 336 317 316" +" 331 193 175 188 176" +" 332 164 143 162 165" +" 333 120 104 100 103" +" 334 376 416 92 417" +" 335 113 325 155 168" +" 336 416 376 92 391" +" 337 420 45 41 393" +" 338 249 262 248 246" +" 339 147 189 161 160" +" 340 18 231 224 233" +" 341 71 45 70 41" +" 342 126 341 135 339" +" 343 21 23 22 437" +" 344 148 165 143 151" +" 345 337 327 318 335" +" 346 354 318 313 163" +" 347 115 118 155 116" +" 348 341 340 338 339" +" 349 166 168 313 163" +" 350 166 318 313 315" +" 351 48 68 67 47" +" 352 150 162 145 152" +" 353 140 339 137 163" +" 354 199 185 187 176" +" 355 333 144 316 336" +" 356 338 327 337 341" +" 357 389 70 72 393" +" 358 331 366 350 351" +" 359 94 45 92 44" +" 360 9 33 12 35" +" 361 126 139 137 138" +" 362 321 295 282 294" +" 363 135 140 136 137" +" 364 153 162 163 152" +" 365 325 362 363 361" +" 366 80 235 226 81" +" 367 74 377 89 88" +" 368 13 14 450 443" +" 369 157 172 158 171" +" 370 450 443 14 445" +" 371 155 107 120 156" +" 372 135 339 163 137" +" 373 365 325 352 362" +" 374 153 140 135 163" +" 375 448 206 205 6" +" 376 137 141 139 339" +" 377 103 107 120 104" +" 378 448 425 447 452" +" 379 165 162 168 163" +" 380 76 83 79 87" +" 381 420 45 393 416" +" 382 334 329 330 336" +" 383 89 45 92 416" +" 384 181 195 179 196" +" 385 420 448 41 416" +" 386 438 277 435 275" +" 387 400 399 402 403" +" 388 304 296 283 305" +" 389 170 158 190 161" +" 390 387 386 388 250" +" 391 54 218 217 53" +" 392 311 304 308 322" +" 393 149 281 201 189" +" 394 211 24 209 212" +" 395 166 333 149 147" +" 396 426 424 420 425" +" 397 394 376 401 416" +" 398 147 159 122 158" +" 399 202 203 201 453" +" 400 280 203 279 453" +" 401 135 126 339 137" +" 402 449 4 3 5" +" 403 14 2 450 11" +" 404 126 125 127 347" +" 405 423 413 38 414" +" 406 185 198 188 176" +" 407 144 163 142 162" +" 408 201 122 204 453" +" 409 447 425 451 449" +" 410 290 289 306 291" +" 411 35 69 71 49" +" 412 207 224 211 231" +" 413 135 154 163 118" +" 414 126 118 341 354" +" 415 191 175 194 193" +" 416 436 16 437 17" +" 417 420 422 416 421" +" 418 135 142 153 145" +" 419 15 443 16 13" +" 420 440 275 259 224" +" 421 416 421 422 417" +" 422 442 275 440 224" +" 423 347 340 354 126" +" 424 254 256 253 274" +" 425 34 50 33 35" +" 426 176 191 175 177" +" 427 433 278 434 277" +" 428 175 191 192 177" +" 429 101 206 102 204" +" 430 132 135 136 130" +" 431 49 35 50 36" +" 432 353 356 325 363" +" 433 435 277 433 434" +" 434 224 275 276 438" +" 435 212 230 18 19" +" 436 143 150 148 151" +" 437 235 228 243 234" +" 438 29 22 26 30" +" 439 125 347 349 123" +" 440 237 234 235 236" +" 441 144 336 319 316" +" 442 165 316 166 144" +" 443 142 318 338 163" +" 444 137 141 140 139" +" 445 447 279 205 448" +" 446 106 116 108 155" +" 447 217 238 239 215" +" 448 16 17 443 441" +" 449 407 262 270 430" +" 450 88 74 389 77" +" 451 78 79 80 81" +" 452 126 138 134 342" +" 453 165 150 143 151" +" 454 409 430 387 250" +" 455 128 118 116 131" +" 456 339 126 340 342" +" 457 173 192 171 170" +" 458 400 376 403 373" +" 459 15 18 212 224" +" 460 37 49 36 35" +" 461 81 82 83 214" +" 462 173 157 171 172" +" 463 220 214 219 83" +" 464 114 113 128 123" +" 465 366 423 367 418" +" 466 379 273 378 406" +" 467 30 436 23 433" +" 468 23 432 28 436" +" 469 147 144 160 143" +" 470 79 243 31 240" +" 471 33 74 50 240" +" 472 342 348 345 126" +" 473 94 416 417 92" +" 474 416 377 391 92" +" 475 147 158 149 157" +" 476 273 274 384 430" +" 477 203 281 201 453" +" 478 243 235 245 226" +" 479 18 229 227 225" +" 480 45 72 69 70" +" 481 189 149 147 201" +" 482 175 195 193 188" +" 483 362 107 155 166" +" 484 185 199 198 176" +" 485 331 166 333 149" +" 486 31 76 81 79" +" 487 323 290 310 308" +" 488 43 107 104 48" +" 489 436 16 21 437" +" 490 368 279 350 280" +" 491 424 416 423 448" +" 492 150 142 164 143" +" 493 258 248 246 249" +" 494 381 383 385 273" +" 495 73 49 72 74" +" 496 117 106 119 116" +" 497 74 377 88 389" +" 498 408 273 387 384" +" 499 191 170 173 190" +" 500 199 177 200 191" +" 501 13 80 74 12" +" 502 130 135 128 131" +" 503 92 90 89 377" +" 504 84 219 83 86" +" 505 408 378 273 406" +" 506 386 384 80 385" +" 507 392 426 389 420" +" 508 80 79 243 81" +" 509 158 177 173 190" +" 510 377 72 89 391" +" 511 394 376 416 391" +" 512 442 224 440 261" +" 513 130 131 129 132" +" 514 95 63 61 59" +" 515 252 274 253 272" +" 516 273 274 272 384" +" 517 225 263 246 257" +" 518 76 52 31 53" +" 519 243 79 31 81" +" 520 448 420 424 416" +" 521 347 358 349 123" +" 522 138 137 126 133" +" 523 368 279 367 350" +" 524 38 360 413 423" +" 525 165 168 166 163" +" 526 207 211 26 208" +" 527 54 217 32 228" +" 528 125 347 348 349" +" 529 118 347 128 123" +" 530 423 94 45 416" +" 531 250 389 428 261" +" 532 119 116 118 117" +" 533 358 113 347 357" +" 534 168 164 165 169" +" 535 242 235 243 234" +" 536 354 318 341 327" +" 537 226 247 255 245" +" 538 377 72 389 74" +" 539 168 354 163 118" +" 540 163 316 166 165" +" 541 145 163 142 153" +" 542 262 80 247 255" +" 543 281 304 292 321" +" 544 12 1 9 35" +" 545 392 426 420 412" +" 546 51 79 76 240" +" 547 274 270 273 272" +" 548 270 274 273 430" +" 549 329 331 332 324" +" 550 325 313 168 113" +" 551 306 304 308 290" +" 552 71 35 49 41" +" 553 348 346 342 345" +" 554 270 262 274 430" +" 555 353 363 365 364" +" 556 29 22 30 27" +" 557 447 425 424 451" +" 558 53 31 217 54" +" 559 194 171 175 192" +" 560 29 25 209 210" +" 561 123 358 349 113" +" 562 80 385 384 247" +" 563 204 202 201 453" +" 564 259 225 440 224" +" 565 128 347 125 123" +" 566 111 68 48 413" +" 567 48 68 47 414" +" 568 415 68 414 94" +" 569 437 208 207 21" +" 570 424 1 3 451" +" 571 447 452 449 448" +" 572 389 390 377 88" +" 573 158 170 190 173" +" 574 169 165 168 167" +" 575 155 154 119 118" +" 576 115 168 155 118" +" 577 354 168 113 118" +" 578 147 201 161 189" +" 579 115 168 113 155" +" 580 168 166 155 167" +" 581 259 225 257 440" +" 582 263 247 261 246" +" 583 281 279 201 453" +" 584 128 135 136 126" +" 585 275 260 439 440" +" 586 66 63 65 64" +" 587 277 438 276 275" +" 588 163 339 341 318" +" 589 325 314 324 315" +" 590 338 327 341 318" +" 591 319 327 328 335" +" 592 391 45 89 416" +" 593 203 281 280 202" +" 594 362 423 206 279" +" 595 239 237 213 238" +" 596 362 353 365 325" +" 597 80 235 243 226" +" 598 80 228 243 235" +" 599 15 21 20 16" +" 600 31 214 81 53" +" 601 227 244 233 225" +" 602 442 21 224 15" +" 603 284 293 298 285" +" 604 233 18 227 225" +" 605 18 233 224 225" +" 606 205 203 204 453" +" 607 163 154 168 118" +" 608 208 21 433 26" +" 609 443 389 442 444" +" 610 27 23 30 28" +" 611 54 218 56 217" +" 612 391 412 389 393" +" 613 9 13 10 1" +" 614 61 44 96 91" +" 615 316 314 312 313" +" 616 416 376 401 417" +" 617 116 108 155 115" +" 618 106 107 155 108" +" 619 442 389 411 426" +" 620 164 142 162 143" +" 621 321 294 322 295" +" 622 144 165 143 147" +" 623 357 325 313 354" +" 624 389 35 41 426" +" 625 448 7 205 447" +" 626 227 244 229 241" +" 627 206 38 103 102" +" 628 206 448 205 279" +" 629 10 4 2 11" +" 630 246 256 245 255" +" 631 37 49 35 41" +" 632 128 127 124 125" +" 633 126 138 133 134" +" 634 312 318 319 313" +" 635 81 235 226 213" +" 636 213 228 235 234" +" 637 228 81 243 31" +" 638 81 228 235 213" +" 639 317 336 337 330" +" 640 330 336 337 334" +" 641 316 330 317 329" +" 642 319 330 335 328" +" 643 231 18 232 233" +" 644 18 231 232 230" +" 645 17 437 436 441" +" 646 287 307 302 303" +" 647 287 306 307 288" +" 648 303 288 287 307" +" 649 323 320 333 311" +" 650 393 420 416 392" +" 651 79 51 76 75" +" 652 336 329 316 332" +" 653 213 236 234 237" +" 654 76 31 81 53" +" 655 45 72 391 89" +" 656 31 76 79 240" +" 657 395 372 397 399" +" 658 393 45 41 70" +" 659 45 416 94 92" +" 660 211 21 224 207" +" 661 376 417 415 401" +" 662 262 254 274 256" +" 663 320 304 292 311" +" 664 1 10 9 2" +" 665 162 165 168 164" +" 666 385 247 80 250" +" 667 371 400 370 372" +" 668 384 247 385 430" +" 669 128 130 131 129" +" 670 443 13 442 80" +" 671 284 293 289 305" +" 672 448 206 6 423" +" 673 360 107 109 362" +" 674 112 360 359 111" +" 675 287 305 306 289" +" 676 362 325 112 361" +" 677 362 166 325 315" +" 678 437 17 16 441" +" 679 438 277 276 433" +" 680 200 189 190 201" +" 681 416 422 424 423" +" 682 320 292 281 189" +" 683 110 108 113 112" +" 684 108 110 113 115" +" 685 144 318 316 319" +" 686 250 386 389 80" +" 687 166 318 315 316" +" 688 63 62 59 58" +" 689 319 327 335 318" +" 690 337 327 335 341" +" 691 1 450 3 451" +" 692 239 237 236 213" +" 693 21 442 437 16" +" 694 450 443 445 451" +" 695 14 13 450 2" +" 696 39 44 42 40" +" 697 363 357 356 361" +" 698 350 366 367 351" +" 699 331 366 362 279" +" 700 368 366 369 351" +" 701 47 43 38 42" +" 702 140 339 163 338" +" 703 289 285 293 284" +" 704 339 141 338 140" +" 705 137 141 339 140" +" 706 234 216 213 32" +" 707 273 408 430 384" +" 708 273 270 408 269" +" 709 84 220 83 85" +" 710 158 170 157 161" +" 711 255 262 274 256" +" 712 304 282 283 294" +" 713 83 218 219 87" +" 714 377 72 74 89" +" 715 206 205 204 453" +" 716 446 443 451 445" +" 717 304 292 322 320" +" 718 155 362 112 107" +" 719 292 283 304 282" +" 720 443 1 426 451" +" 721 149 362 166 107" +" 722 272 271 274 270" +" 723 306 287 289 288" +" 724 366 331 350 279" +" 725 331 366 352 362" +" 726 61 95 96 97" +" 727 224 442 275 438" +" 728 273 387 384 385" +" 729 262 271 429 270" +" 730 185 182 197 184" +" 731 153 162 145 163" +" 732 74 443 35 426" +" 733 41 389 426 420" +" 734 40 47 46 44" +" 735 262 246 247 248" +" 736 1 37 3 0" +" 737 433 432 431 436" +" 738 23 432 436 30" +" 739 67 360 413 111" +" 740 109 360 112 111" +" 741 361 360 112 362" +" 742 246 258 249 257" +" 743 87 218 219 55" +" 744 151 149 166 156" +" 745 165 149 151 148" +" 746 149 165 147 148" +" 747 155 154 118 168" +" 748 217 214 218 215" +" 749 31 214 53 217" +" 750 291 304 283 305" +" 751 23 16 22 436" +" 752 143 162 165 144" +" 753 103 102 100 101" +" 754 195 175 179 188" +" 755 182 196 197 180" +" 756 400 376 375 403" +" 757 149 281 189 331" +" 758 146 143 150 148" +" 759 150 146 152 145" +" 760 168 162 164 169" +" 761 262 384 274 430" +" 762 54 218 53 56" +" 763 125 127 347 128" +" 764 304 306 291 290" +" 765 262 80 384 247" +" 766 153 162 152 145" +" 767 150 162 152 164" +" 768 168 162 169 163" +" 769 262 80 255 384" +" 770 38 68 414 47" +" 771 423 206 38 107" +" 772 46 68 94 47" +" 773 385 430 250 387" +" 774 413 68 48 414" +" 775 46 68 93 94" +" 776 41 416 448 45" +" 777 111 68 413 67" +" 778 77 88 74 73" +" 779 393 41 420 392" +" 780 274 256 253 255" +" 781 26 23 433 30" +" 782 218 217 53 214" +" 783 231 212 18 224" +" 784 446 426 444 427" +" 785 113 114 128 115" +" 786 128 114 123 124" +" 787 285 289 293 286" +" 788 301 285 299 286" +" 789 300 285 298 286" +" 790 297 285 298 299" +" 791 26 23 30 22" +" 792 44 38 94 45" +" 793 187 158 159 177" +" 794 218 76 81 53" +" 795 162 143 142 144" +" 796 397 373 400 372" +" 797 164 142 145 162" +" 798 128 135 126 118" +" 799 289 283 284 305" +" 800 282 189 281 292" +" 801 200 186 187 199" +" 802 21 24 211 20" +" 803 11 13 14 10" +" 804 2 13 1 10" +" 805 72 377 389 391" +" 806 74 72 73 89" +" 807 92 72 45 89" +" 808 413 366 418 362" +" 809 281 304 282 292" +" 810 429 251 274 254" +" 811 438 439 275 435" +" 812 37 424 1 3" +" 813 202 189 201 281" +" 814 333 189 320 281" +" 815 94 38 68 423" +" 816 389 261 250 80" +" 817 242 241 235 234" +" 818 364 366 365 369" +" 819 302 305 306 287" +" 820 362 366 352 365" +" 821 350 366 279 367" +" 822 368 366 351 367" +" 823 191 176 175 193" +" 824 173 191 177 192" +" 825 103 121 101 100" +" 826 176 191 199 193" +" 827 191 177 200 190" +" 828 275 442 439 438" +" 829 275 442 440 439" +" 830 224 442 225 261" +" 831 442 224 437 438" +" 832 258 246 263 257" +" 833 386 384 385 383" +" 834 149 333 331 189" +" 835 318 326 327 354" +" 836 207 437 224 276" +" 837 56 76 218 53" +" 838 350 333 322 281" +" 839 37 38 45 6" +" 840 232 244 227 241" +" 841 423 206 6 38" +" 842 411 386 250 410" +" 843 224 229 18 225" +" 844 6 423 38 448" +" 845 218 57 219 55" +" 846 68 423 38 414" +" 847 377 376 391 92" +" 848 415 376 375 92" +" 849 103 121 100 120" +" 850 101 121 122 100" +" 851 102 121 103 122" +" 852 7 206 6 205" +" 853 38 206 6 102" +" 854 107 38 103 206" +" 855 448 206 423 279" +" 856 298 305 284 296" +" 857 30 432 436 431" +" 858 23 432 30 28" +" 859 119 107 104 155" +" 860 142 337 318 144" +" 861 107 103 43 104" +" 862 426 424 425 451" +" 863 107 156 155 166" +" 864 119 107 106 104" +" 865 156 107 149 166" +" 866 103 107 43 38" +" 867 103 122 206 102" +" 868 448 41 45 37" +" 869 423 416 45 448" +" 870 81 228 213 31" +" 871 217 239 213 215" +" 872 403 376 415 401" +" 873 443 74 80 389" +" 874 135 163 341 118" +" 875 133 126 136 137" +" 876 228 216 213 217" +" 877 447 451 7 449" +" 878 71 41 393 392" +" 879 282 321 304 281" +" 880 95 63 99 61" +" 881 185 197 183 188" +" 882 433 23 437 436" +" 883 212 24 210 19" +" 884 257 260 440 258" +" 885 184 197 185 198" +" 886 175 178 195 179" +" 887 61 60 58 44" +" 888 362 363 361 365" +" 889 447 451 424 7" +" 890 132 135 130 131" +" 891 61 91 96 58" +" 892 385 430 387 384" +" 893 127 133 130 126" +" 894 80 274 226 255" +" 895 80 274 255 384" +" 896 219 87 86 84" +" 897 275 259 224 276" +" 898 18 229 15 227" +" 899 320 304 311 322" +" 900 23 21 26 433" +" 901 109 38 48 107" +" 902 342 139 126 138" +" 903 21 23 26 22" +" 904 426 428 444 427" +" 905 331 166 362 315" +" 906 122 206 204 453" +" 907 12 1 35 13" +" 908 189 331 281 333" +" 909 35 9 34 1" +" 910 426 412 389 411" +" 911 287 305 289 293" +" 912 320 160 333 336" +" 913 0 35 37 36" +" 914 262 255 247 256" +" 915 353 352 325 324" +" 916 336 329 330 316" +" 917 275 260 440 259" +" 918 16 442 437 441" +" 919 380 378 273 381" +" 920 7 424 447 448" +" 921 400 376 373 375" +" 922 222 223 214 83" +" 923 30 22 23 27" +" 924 262 271 274 429" +" 925 45 44 37 41" +" 926 380 265 382 273" +" 927 149 333 189 147" +" 928 242 245 229 243" +" 929 131 135 128 118" +" 930 245 256 247 255" +" 931 391 412 393 394" +" 932 99 61 97 95" +" 933 281 203 280 453" +" 934 350 333 331 322" +" 935 41 71 393 70" +" 936 398 400 399 402" +" 937 323 309 308 310" +" 938 37 3 0 7" +" 939 72 393 45 391" +" 940 408 270 430 407" +" 941 40 47 44 42" +" 942 298 305 293 284" +" 943 250 385 386 80" +" 944 266 379 273 380" +" 945 191 170 192 173" +" 946 364 354 356 355" +" 947 200 186 159 187" +" 948 159 147 190 158" +" 949 229 244 225 245" +" 950 427 250 411 428" +" 951 342 347 126 340" +" 952 13 80 12 15" +" 953 342 346 347 344" +" 954 268 273 379 406" +" 955 352 365 366 369" +" 956 78 50 240 51" +" 957 322 321 304 294" +" 958 183 180 196 182" +" 959 266 379 267 273" +" 960 58 59 60 91" +" 961 405 273 269 406" +" 962 84 220 85 86" +" 963 81 82 214 223" +" 964 21 24 26 211" +" 965 87 219 86 57" +" 966 442 411 428 426" +" 967 35 443 1 426" +" 968 47 44 94 46" +" 969 357 325 113 313" +" 970 313 357 354 113" +" 971 31 217 228 213" +" 972 99 61 66 64" +" 973 144 166 147 160" +" 974 298 284 285 297" +" 975 398 400 371 399" +" 976 51 78 50 79" +" 977 298 284 297 296" +" 978 7 451 3 449" +" 979 281 279 280 331" +" 980 158 177 190 159" +" 981 117 106 105 119" +" 982 278 276 277 433" +" 983 200 122 201 177" +" 984 72 35 389 74" +" 985 54 228 31 217" +" 986 379 406 378 404" +" 987 347 127 126 128" +" 988 109 362 112 360" +" 989 126 339 340 341" +" 990 142 338 140 163" +" 991 38 44 47 42" +" 992 150 142 145 164" +" 993 426 424 451 420" +" 994 431 208 433 30" +" 995 437 207 433 276" +" 996 135 154 153 163" +" 997 163 341 354 318" +" 998 443 13 74 35" +" 999 143 142 144 140" +" 1000 320 322 323 333" +" 1001 122 147 158 149" +" 1002 112 359 361 113" +" 1003 359 112 361 360" +" 1004 149 121 201 453" +" 1005 361 358 113 359" +" 1006 361 113 357 325" +" 1007 113 359 358 112" +" 1008 409 388 410 250" +" 1009 71 69 389 70" +" 1010 430 409 387 408" +" 1011 32 217 216 228" +" 1012 400 374 372 373" +" 1013 419 422 423 421" +" 1014 51 78 79 240" +" 1015 387 386 250 385" +" 1016 48 360 109 111" +" 1017 438 277 433 435" +" 1018 316 331 329 315" +" 1019 74 50 49 35" +" 1020 302 305 287 293" +" 1021 287 293 286 302" +" 1022 258 440 257 263" +" 1023 188 183 181 196" +" 1024 1 426 41 35" +" 1025 236 216 213 234" +" 1026 292 283 291 304" +" 1027 381 383 273 382" +" 1028 50 15 33 35" +" 1029 79 240 78 80" +" 1030 177 122 201 190" +" 1031 307 308 309 310" +" 1032 229 240 33 243" +" 1033 200 187 177 199" +" 1034 31 214 213 81" +" 1035 128 133 126 136" +" 1036 37 424 448 41" +" 1037 263 247 246 248" +" 1038 444 389 442 426" +" 1039 423 417 414 94" +" 1040 177 190 191 173" +" 1041 417 419 415 421" +" 1042 300 293 302 286" +" 1043 442 13 15 80" +" 1044 121 103 149 120" +" 1045 136 126 135 137" +" 1046 201 122 121 149" +" 1047 331 316 333 315" +" 1048 18 19 15 212" +" 1049 38 45 423 94" +" 1050 113 347 354 123" +" 1051 273 405 269 408" +" 1052 26 208 30 433" +" 1053 431 208 278 433" +" 1054 429 251 271 274" +" 1055 109 38 360 48" +" 1056 400 398 371 370" +" 1057 174 173 175 171" +" 1058 149 362 107 206" +" 1059 245 242 229 244" +" 1060 417 423 414 419" +" 1061 185 199 186 198" +" 1062 158 170 173 157" +" 1063 177 122 190 159" +" 1064 308 292 311 290" +" 1065 380 378 379 273" +" 1066 218 81 214 53" +" 1067 232 244 233 227" +" 1068 72 49 35 74" +" 1069 235 245 226 244" +" 1070 234 243 242 228" +" 1071 316 331 332 329" +" 1072 451 41 424 1" +" 1073 362 353 363 365" +" 1074 224 20 21 211" +" 1075 258 248 263 246" +" 1076 393 389 392 412" +" 1077 212 15 224 20" +" 1078 342 346 344 345" +" 1079 229 74 240 80" +" 1080 302 301 300 286" +" 1081 203 202 204 453" +" 1082 216 234 236 32" +" 1083 386 388 410 411" +" 1084 144 163 165 316" +" 1085 347 344 346 356" +" 1086 21 442 224 437" +" 1087 190 122 201 147" +" 1088 6 424 7 448" +" 1089 269 270 408 407" +" 1090 126 125 347 348" +" 1091 37 44 45 38" +" 1092 393 72 45 70" +" 1093 413 423 418 414" +" 1094 31 32 54 53" +" 1095 29 22 27 26" +" 1096 403 376 401 402" +" 1097 83 220 221 85" +" 1098 433 207 278 276" +" 1099 218 57 55 56" +" 1100 155 116 119 106" +" 1101 173 175 171 192" +" 1102 244 225 245 233" +" 1103 158 173 172 157" +" 1104 281 203 201 202" +" 1105 344 354 356 347" +" 1106 315 144 333 160" +" 1107 392 426 412 389" +" 1108 87 83 79 84" +" 1109 347 358 357 349" +" 1110 342 139 339 126" +" 1111 126 341 340 354" +" 1112 37 424 3 7" +" 1113 210 29 25 26" +" 1114 261 389 442 80" +" 1115 107 112 155 108" +" 1116 389 250 428 411" +" 1117 80 12 15 74" +" 1118 380 265 273 266" +" 1119 190 122 147 159" +" 1120 142 338 144 140" +" 1121 109 362 107 112" +" 1122 362 423 366 418" +" 1123 97 66 98 64" +" 1124 300 293 286 298" +" 1125 130 136 133 128" +" 1126 389 77 80 386" +" 1127 142 337 338 318" +" 1128 56 76 55 218" +" 1129 214 82 83 223" +" 1130 246 261 263 225" +" 1131 35 12 15 33" +" 1132 420 1 451 426" +" 1133 63 99 61 66" +" 1134 96 44 92 91" +" 1135 219 214 218 83" +" 1136 323 308 309 322" +" 1137 224 229 225 15" +" 1138 38 413 48 414" +" 1139 281 149 279 331" +" 1140 183 188 197 196" +" 1141 180 195 181 196" +" 1142 50 15 35 74" +" 1143 113 347 357 354" +" 1144 331 166 315 333" +" 1145 19 15 212 20" +" 1146 69 389 70 72" +" 1147 216 236 213 239" +" 1148 6 424 448 37" +" 1149 74 229 33 15" +" 1150 185 199 187 186" +" 1151 71 389 41 392" +" 1152 195 174 175 194" +" 1153 398 400 402 370" +" 1154 282 283 294 295" +" 1155 244 227 229 225" +" 1156 308 310 306 290" +" 1157 288 310 306 307" +" 1158 307 308 310 306" +" 1159 251 274 254 252" +" 1160 55 219 87 57" +" 1161 64 63 65 62" +" 1162 15 13 16 12" +" 1163 190 201 189 161" +" 1164 316 331 333 332" +" 1165 329 331 324 315" +" 1166 364 354 353 356" +" 1167 166 144 147 165" +" 1168 334 329 336 332" +" 1169 420 422 424 416" +" 1170 350 333 281 331" +" 1171 322 292 321 281" +" 1172 209 24 210 212" +" 1173 424 37 1 41" +" 1174 269 407 408 405" +" 1175 429 430 407 408" +" 1176 15 443 13 442" +" 1177 214 221 222 83" +" 1178 13 17 16 14" +" 1179 333 166 315 160" +" 1180 224 20 211 212" +" 1181 122 201 121 453" +" 1182 246 247 245 256" +" 1183 391 393 416 394" +" 1184 37 44 38 39" +" 1185 344 354 355 356" +" 1186 189 147 333 160" +" 1187 437 208 433 207" +" 1188 181 195 178 179" +" 1189 403 376 402 373" +" 1190 183 180 181 196" +" 1191 433 276 438 437" +" 1192 380 273 382 381" +" 1193 209 24 26 210" +" 1194 379 406 404 268" +" 1195 7 451 424 3" +" 1196 400 402 373 403" +" 1197 21 207 211 26" +" 1198 451 41 1 420" +" 1199 201 149 279 281" +" 1200 347 344 354 340" +" 1201 419 417 415 414" +" 1202 344 345 346 343" +" 1203 79 83 76 82" +" 1204 128 133 130 127" +" 1205 6 424 37 7" +" 1206 190 147 201 161" +" 1207 87 218 55 83" +" 1208 39 44 41 37" +" 1209 245 242 235 243" +" 1210 389 41 392 420" +" 1211 24 212 20 19" +" 1212 451 41 420 424" +" 1213 78 75 50 79" +" 1214 440 257 263 225" +" 1215 81 83 76 218" +" 1216 385 378 387 381" +" 1217 430 387 384 408" +" 1218 329 315 324 316" +" 1219 281 280 279 453" +" 1220 279 205 206 453" +" 1221 253 254 274 252" +" 1222 325 357 356 354" +" 1223 443 17 13 14" +" 1224 322 292 281 320" +" 1225 399 372 397 400" +" 1226 56 76 53 55" +" 1227 212 231 18 230" +" 1228 24 26 211 209" +" 1229 420 1 426 41" +" 1230 182 196 183 197" +" 1231 229 74 80 15" +" 1232 118 347 126 128" +" 1233 180 195 178 181" +" 1234 361 358 357 113" +" 1235 239 213 215 238" +" 1236 224 229 15 18" +" 1237 423 68 94 414" +" 1238 6 45 37 448" +" 1239 48 360 111 413" +" 1240 302 301 286 303" +" 1241 35 41 1 37" +" 1242 431 278 434 433" +" 1243 145 164 162 150" +" 1244 174 173 171 172" +" 1245 423 279 367 448" +" 1246 362 423 107 206" +" 1247 272 271 251 274" +" 1248 273 385 378 387" +" 1249 200 122 177 159" +" 1250 452 425 447 449" +" 1251 210 29 26 209" +" 1252 130 135 136 128" +" 1253 234 213 237 235" +" 1254 216 54 217 32" +" 1255 402 373 376 374" +" 1256 164 143 165 150" +" 1257 427 250 410 411" +" 1258 386 388 250 410" +" 1259 96 61 59 95" +" 1260 159 200 187 177" +" 1261 389 443 442 80" +" 1262 398 395 396 399" +" 1263 87 83 55 76" +" 1264 389 77 74 80" +" 1265 229 15 80 225" +" 1266 207 433 278 208" +" 1267 96 59 91 95" +" 1268 341 126 135 118" +" 1269 62 61 59 58" +" 1270 206 149 279 453" +" 1271 400 370 372 374" +" 1272 389 35 426 74" +" 1273 360 423 362 413" +" 1274 54 228 32 31" +" 1275 109 38 107 360" +" 1276 87 83 84 219" +" 1277 72 35 69 389" +" 1278 246 262 247 256" +" 1279 352 364 353 365" +" 1280 268 273 406 269" +" 1281 443 74 13 80" +" 1282 242 244 241 229" +" 1283 149 279 362 206" +" 1284 99 64 66 97" +" 1285 376 373 92 374" +" 1286 26 29 25 27" +" 1287 32 213 228 216" +" 1288 118 163 341 354" +" 1289 161 158 147 157" +" 1290 61 60 44 91" +" 1291 292 308 304 291" +" 1292 163 144 165 162" +" 1293 407 262 430 429" +" 1294 63 62 61 59" +" 1295 153 163 154 168" +" 1296 350 281 322 321" +" 1297 262 271 270 274" +" 1298 442 426 428 444" +" 1299 38 44 42 39" +" 1300 80 240 229 243" +" 1301 194 171 174 175" +" 1302 155 362 325 112" +" 1303 306 304 291 305" +" 1304 77 78 74 80" +" 1305 80 74 240 78" +" 1306 38 44 94 47" +" 1307 273 405 408 406" +" 1308 293 298 285 286" +" 1309 88 389 390 77" +" 1310 311 304 292 308" +" 1311 99 66 98 97" +" 1312 26 210 24 25" +" 1313 259 224 276 207" +" 1314 61 62 64 58" +" 1315 244 242 235 245" +" 1316 244 241 235 242" +" 1317 63 61 64 66" +" 1318 149 201 279 453" +" 1319 206 122 121 453" +" 1320 413 366 362 365" +" 1321 409 388 250 387" +" 1322 423 362 413 418" +" 1323 38 414 48 47" +" 1324 38 360 423 107" +" 1325 290 289 288 306" +" 1326 333 322 323 331" +" 1327 389 443 74 426" +" 1328 35 71 389 41" +" 1329 279 149 362 331" +" 1330 74 12 15 35" +" 1331 424 423 422 448" +" 1332 190 201 177 200" +" 1333 365 325 353 352" +" 1334 385 383 384 273" +" 1335 331 322 321 350" +" 1336 71 70 389 393" +" 1337 126 139 339 137" +" 1338 44 45 92 91" +" 1339 72 49 69 35" +" 1340 175 178 174 195" +" 1341 247 246 245 261" +" 1342 41 424 448 420" +" 1343 46 92 44 94" +" 1344 402 400 373 374" +" 1345 198 197 185 188" +" 1346 304 296 294 283" +" 1347 116 131 129 128" +" 1348 50 15 74 33" +" 1349 110 108 112 109" +" 1350 448 425 424 447" +" 1351 166 331 362 149" +" 1352 206 149 103 107" +" 1353 209 26 208 29" +" 1354 211 231 224 212" +" 1355 33 50 51 240" +" 1356 32 213 234 228" +" 1357 444 389 426 443" +" 1358 107 112 108 109" +" 1359 217 213 214 215" +" 1360 16 22 436 21" +" 1361 142 337 144 338" +" 1362 323 311 322 320" +" 1363 411 386 389 250" +" 1364 265 273 264 382" +" 1365 211 230 231 212" +" 1366 295 296 294 297" +" 1367 0 35 1 37" +" 1368 229 74 33 240" +" 1369 131 118 116 117" +" 1370 122 204 101 201" +" 1371 206 122 204 101" +" 1372 83 220 86 219" +" 1373 113 358 347 123" +"# Generated by tetgen -YY bunny.smesh " +); } diff --git a/BulletPhysics/bulletTrunk/Demos/SoftDemo/cube.inl b/BulletPhysics/bulletTrunk/Demos/SoftDemo/cube.inl new file mode 100644 index 00000000..aa0e0f2e --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/SoftDemo/cube.inl @@ -0,0 +1,1988 @@ +static const char* getNodes() { return( +"400 3 0 0" +" 0 1 1 -1" +" 1 1 -1 -1" +" 2 -1 -1 -1" +" 3 1 1 1" +" 4 -1 -1 1" +" 5 -1 1 -1" +" 6 1 -1 1" +" 7 -1 1 1" +" 8 -1 -1 -0.000116" +" 9 0.00039500000000000006 -1 1" +" 10 1 -1 -0.00065799999999999995" +" 11 1 0.00061700000000000004 -1" +" 12 0.00098999999999999999 1 -1" +" 13 -1 1 0.00045400000000000008" +" 14 0.00052800000000008396 1 1" +" 15 1 1 -0.00038699999999991519" +" 16 -1 -5.9999999999504894e-006 1" +" 17 -1 0.00021000000000004349 -1" +" 18 1 0.00067400000000006344 1" +" 19 1.0863393114549872e-007 3.0682525964387253e-008 1" +" 20 0.00097299999999989062 -1 -1" +" 21 -1.4065544284846965e-008 1 5.0429866114086973e-008" +" 22 1 -7.0792689266241382e-008 -4.4728299621228391e-008" +" 23 8.4069120565846353e-008 3.8392827594879719e-007 -1" +" 24 1 0.49980668112692161 -0.4996917965899465" +" 25 1 0.50006700000000004 -1" +" 26 1 1 -0.50034809999999996" +" 27 1 1 0.50025040000000009" +" 28 0.50020930000000008 1 1" +" 29 -1 0.50010129999999997 1" +" 30 -0.49958379999999991 1 1" +" 31 -1 9.2038384777827427e-008 -1.100605984127867e-008" +" 32 -0.5001201999999999 -1 1" +" 33 1.0486788869007099e-007 -1 -3.3620911388254626e-008" +" 34 -1 -1 0.50008699999999995" +" 35 1 -0.50010220000000005 -1" +" 36 1 -1 -0.49985400000000002" +" 37 1 -0.4996526 1" +" 38 1 -1 0.49990490000000004" +" 39 -0.49930649999999999 1 -1" +" 40 -1 1 -0.50002420000000003" +" 41 1 -0.24974260000000004 -0.50015432157969908" +" 42 0.50015422769290296 -0.24974260000000001 -1" +" 43 0.50009680402228707 1 0.24993170000000009" +" 44 1 0.50009675187018254 0.24993170000000009" +" 45 0.24987467313200107 0.24987468273492527 -0.24987454967853764" +" 46 0.50006970000000006 1 -1" +" 47 -1 1 0.50062509999999982" +" 48 -0.24952789999999991 1 0.50013191885453001" +" 49 -0.24952789999999991 0.50013187836130635 1" +" 50 -1 -0.50000239999999996 -1" +" 51 -0.49917350000000005 -1 -1" +" 52 -1 -0.37500110896930483 0.49999770999384097" +" 53 -0.49999768418870116 -0.37500109958532857 1" +" 54 0.50016842960649455 -0.24948929999999997 1" +" 55 1 -0.24948929999999997 0.50016837821653382" +" 56 -1 0.50011355427218929 -0.24978510000000004" +" 57 -0.50011349993113807 1 -0.24978510000000009" +" 58 0.49983560886453382 -1 -0.25025600000000003" +" 59 1 -0.24959280000000006 -1" +" 60 0.46861653427920624 0.31279234072878337 -1" +" 61 0.46874721181012263 1 -0.31263609558485356" +" 62 1 1 0.24986720000000007" +" 63 1 0.50004500000000007 1" +" 64 0.41666006216462159 0.41668749191836219 1" +" 65 1 0.62492318088559184 0.62497446433589154" +" 66 0.62493687874554793 1 0.62494713479954256" +" 67 -0.32510780807963724 -0.32510780489834346 -0.32510793388507692" +" 68 1 0.12495484505171366 -0.3748231366627352" +" 69 -0.24915825000000003 0.50024732783000192 -1" +" 70 1 0.74957571448653726 -0.74971600694021778" +" 71 0.64874656072370729 1 -0.64882932411306993" +" 72 0.6488668035834122 0.64886599996407779 -1" +" 73 -1 0.41673079803079871 0.41664307505523179" +" 74 -0.62468209179782908 1 0.62494186195929313" +" 75 -0.62476903429567798 0.62489835940819183 1" +" 76 -1 0.75020764999999989 1" +" 77 0.12520010648567331 0.45856412436943739 0.37477910185628149" +" 78 -0.24942439999999994 1 1" +" 79 -0.37474797737976173 1 0.74996984889996166" +" 80 -0.3748348177892612 0.74992638728967431 1" +" 81 -1 -1 -0.49994339999999993" +" 82 -0.50002894420427402 -1 0.24998549999999997" +" 83 -1 -0.50045000000000006 1" +" 84 -0.015617775048046156 -0.5000062299955631 1" +" 85 -0.062520154989433377 -1 0.50002475010607028" +" 86 0.50024029999999997 -1 1" +" 87 1 -0.24929619999999997 1" +" 88 0.37505270907528421 -0.3750526949043349 0.12522791934472338" +" 89 -1 0.5001348000000001 -1" +" 90 -1 1 -0.24999450000000001" +" 91 1 -0.62477132796083668 -0.25025600000000003" +" 92 0.50052129999999995 -1 -1" +" 93 1 0.018238422269637886 -0.6785517711937521" +" 94 0.750039598406532 -0.12448790000000004 -1" +" 95 0.32367160517680327 0.022514689090561368 -0.65701963759824777" +" 96 0.32369468988306127 0.65698780035674154 -0.022395524628340657" +" 97 1 1 -0.25020424999999996" +" 98 1 0.62501462613012171 -0.12492844204372336" +" 99 0.16205966081319645 0.60689608104137205 -1" +" 100 0.23307615322925276 1 -0.65509826790501591" +" 101 0.6349049175761754 0.105723024682608 1" +" 102 1 0.18290638148392097 0.59627500837254621" +" 103 0.67708420758319754 0.67702605426027662 1" +" 104 1 0.7498625000000001 1" +" 105 0.75029925000000008 1 1" +" 106 0.75006454389022692 1 0.37500606926950353" +" 107 1 0.7500645207487896 0.37502882687227923" +" 108 -0.39273716375981493 0.28664398202145958 -0.051638660454459806" +" 109 -0.41671246738153483 -0.41657507574696978 -1" +" 110 -0.24910025000000008 -1 -0.50024283860374685" +" 111 -1 -0.50000177258228129 0.01562108247952367" +" 112 -1 0.062713405747402015 -0.49998686350971472" +" 113 -0.21672667787876426 1 -0.60296047487967241" +" 114 1 0.7499052299192317 -0.37495181123207261" +" 115 0.74540338978064358 1 -0.37527617499999999" +" 116 0.52159008257288741 0.55923294709068649 -0.50062662770660094" +" 117 0.75009235000000007 1 -1" +" 118 -0.52928249862025711 0.10679011696853863 1" +" 119 -1 0.034077217919757319 0.58381620432891879" +" 120 -1 0.7383278941763165 0.25053954999999994" +" 121 -0.70891631291249579 1 0.25053954999999989" +" 122 -0.46050965421976553 0.49218708190674731 0.49218708126315491" +" 123 -1 0.68039176952095026 0.65291562053589947" +" 124 0.10567541850782136 0.6349221513724419 1" +" 125 0.18288602711749127 1 0.59629803533945958" +" 126 0.54298856425431818 0.54298737875163716 0.56762073808494473" +" 127 -0.67702799351191578 -0.67732215502802495 -1" +" 128 -0.74942264999999997 -1 -1" +" 129 -1 -1 -0.74980449999999998" +" 130 -1 -0.49218854513728494 -0.49218946358719012" +" 131 -0.42414945787750447 -1 0.62500198796368489" +" 132 -0.34611026252144428 -0.35284219355707647 0.34611025416343177" +" 133 -1 -0.25018009999999996 1" +" 134 1 -0.62478846817134759 0.62485153607962096" +" 135 0.46873640237350567 -1 0.46875741869756882" +" 136 0.62487945516234578 -0.62473271086601501 1" +" 137 1 -1 0.75017445000000005" +" 138 0.74996116568713633 -0.37481680473944939 1" +" 139 1 -0.37487247538331225 0.74993327711783697" +" 140 0.52037384429375466 0.13732055395658338 0.20134643019667742" +" 141 0.15110486348630267 -0.58850137906978839 -0.32248691722782763" +" 142 0.18460607304185575 -0.25601325165021294 0.59072519783751942" +" 143 0.58280144730296801 -0.1236683742487249 -0.25429890766156527" +" 144 -0.62459780071323356 0.62480472798869868 -1" +" 145 -1 0.62491663124728913 -0.6248890159372763" +" 146 -0.62484746422599169 1 -0.62502715932999464" +" 147 -0.7093663193037405 1 -0.043380902757278066" +" 148 -1 0.70881555044570888 -0.042280622034258974" +" 149 1 -1 -0.25034290000000009" +" 150 1 -0.40640338795560693 0.10958986646960317" +" 151 0.62965348921187414 -1 0.11553823232370244" +" 152 0.62491481284490769 -0.62481034920526324 -1" +" 153 0.62518044398996542 -1 -0.62501367730297908" +" 154 1 -0.63771354537448766 -0.63764519345816328" +" 155 1 0.31875234539841601 -0.74994017167142224" +" 156 1 0.25014510000000001 -1" +" 157 0.74289722234692146 0.382058894292784 -1" +" 158 0.32367160517680327 0.022514689090561313 -1" +" 159 -0.16523027793533418 0.12134647368575949 -0.52708319267772263" +" 160 0.66127538009577513 0.12758426427554953 -1" +" 161 0.66190311587317174 -0.14472935797430672 -0.63288146125613987" +" 162 0.32369468988306133 1 -0.022395524628340657" +" 163 0.66678290425073372 1 -0.041514421404229618" +" 164 0.25040265000000006 1 -1" +" 165 0.0399620660587649 1 -0.35479393735090492" +" 166 0.39507172571995386 0.7484116421252891 -1" +" 167 1 -0.072369672334633761 0.72403943393322545" +" 168 1 0.25022030000000006 1" +" 169 -1 0.34715093732334323 0.069506853183406409" +" 170 0.004224600474193374 -0.00030510666109673235 0.14430736392114327" +" 171 -0.094962845556292308 0.5834952204256858 0.029410273259612763" +" 172 -0.37516021595805987 -1 -0.12532788579913123" +" 173 -0.24910025000000008 -0.73780528173239301 -1" +" 174 -0.24899625000000003 -1 -1" +" 175 -1 -0.68752594294730018 0.32233197415569781" +" 176 -0.63898818329694262 -0.019780155017187176 -0.25640753531059018" +" 177 -0.24918545000000003 1 -1" +" 178 -0.090115044090208485 0.73312064098608642 -1" +" 179 0.70087100707296945 0.7030864101348856 -0.70306291837965817" +" 180 0.43929348327839085 1 -0.54468859277252801" +" 181 0.24904127574612012 0.39074020564473289 -0.70186910867307939" +" 182 1 0.37487410261969639 -0.24965440370335262" +" 183 -1 0.25002235 1" +" 184 -1 0.3834446703544917 0.71903607815447956" +" 185 -0.1156880925075553 0.64434016438489528 0.64434017606689242" +" 186 -0.49172745225271947 1 0.39835250767529351" +" 187 -0.49767862299671706 0.38046779215689319 1" +" 188 -0.71839703681869116 0.71780974657570373 0.44934935063382636" +" 189 -0.51344827724776054 0.71469177745101886 0.71472798522876002" +" 190 -0.23617534848477656 0.19448005635194549 1" +" 191 0.10846459384596518 0.30820266021358389 1" +" 192 0.25057285000000007 1 1" +" 193 0.017230183845622971 1 0.32091029596366771" +" 194 0.73101248242769623 0.7310147155780512 0.70877874225568527" +" 195 0.31697048198150773 0.74665075980915008 0.4006579958540028" +" 196 0.22826577744747956 0.47891948624469016 0.71004422740180217" +" 197 1 0.41190390341165745 0.48757967789479273" +" 198 0.39445308838583859 1 0.75656358081536812" +" 199 0.37539107500000007 0.73916688955610543 1" +" 200 1 0.37513265000000007 0.77169890914285255" +" 201 0.73942011355234571 0.37513265000000007 1" +" 202 0.63994038137069154 0.63994036678159205 0.2035446667438317" +" 203 -0.46370016318896046 -0.62998103084618617 -0.61483850042635191" +" 204 -1 -0.21786745446900305 -0.71882640763337879" +" 205 -0.7381625142245487 -0.24989619999999996 -1" +" 206 -1 -0.68409919087038817 -0.74320185410965045" +" 207 -0.32233403971208485 -0.68753538843092254 1" +" 208 -0.24999429999999997 -1 1" +" 209 -1 -0.68747379665002328 0.68733786195201785" +" 210 -1 -1 0.74993719999999997" +" 211 -0.68734034505209507 -0.68746383783523624 1" +" 212 0.012621642749083783 -0.62121055252239044 0.25549907282899653" +" 213 -0.6302385799280833 -0.18856073836207951 0.63023858315073289" +" 214 -1 -0.24375245663389172 0.20780956095073669" +" 215 0.27457426263537876 -0.71671644193112283 1" +" 216 0.25031765 -1 0.74826556642116959" +" 217 0.67415846717387884 -1 0.72313083855082583" +" 218 0.62503542334105555 -0.31221159888129457 0.62503541050290967" +" 219 0.5971993096065894 0.14306806366195202 0.59872066564664705" +" 220 1 0.017233350071975677 0.32090429254255515" +" 221 0.26312362546126472 0.33468192363906535 0.084065768486193945" +" 222 0.32197792152690552 -1 0.018797337932729474" +" 223 0.18800195544968995 -1 -0.56289551925444881" +" 224 0.57038729142869704 -0.57307887210152808 -0.20881754066389768" +" 225 -0.0086896099297664228 -0.40801963637004723 -1" +" 226 0.18460607304185569 -0.25601325165021294 1" +" 227 -0.20780680948491165 -0.24375608761730455 1" +" 228 0.16210795897650465 -0.16280891134401318 -0.30907215240469521" +" 229 1 -0.26636148213032163 -0.17942676839456378" +" 230 0.56446572384612781 0.1973176117738667 -0.43724659666019622" +" 231 0.68853374013319157 -0.17744483013216472 0.09783510961497599" +" 232 -1 0.25009230000000005 -1" +" 233 -0.44245798368554617 0.091797696559903857 -1" +" 234 -0.37472098690918887 0.74987909210814685 -1" +" 235 -1 0.75000438735900432 -0.37495636858710685" +" 236 -0.74996704638216471 1 -0.37508384505925174" +" 237 -1 0.74990679999999998 -1" +" 238 -0.54712707263607874 0.54712707774677038 -0.44245689687343565" +" 239 -0.74990204999999999 1 -1" +" 240 -0.72822316548562926 0.72874031845750664 0.1036085388532241" +" 241 1 -0.71873547817891748 0.28112338497214717" +" 242 1 -1 0.24972335000000001" +" 243 0.75048264999999992 -1 -1" +" 244 0.74989614566839657 -1 -0.37495931701899499" +" 245 0.32778297288621805 -0.39528027615360428 -0.64821309452322518" +" 246 1 -0.38051416654716286 -0.74727639147947866" +" 247 0.75568696149005932 -0.39170758577960507 -1" +" 248 0.67082477453227773 0.69774082076774491 -0.21670307025395311" +" 249 0.25644629494787752 0.72897062001391455 -0.35498913750943906" +" 250 -0.66044139980269567 0.12332997433814857 0.28570391360731856" +" 251 -0.20800059812674501 0.28777064045558248 0.28593682199556314" +" 252 0.29133599196527848 -0.095788071590640317 0.30648986161740821" +" 253 -0.19340828105680374 -0.0068671095901119807 -0.17510149752792639" +" 254 -0.21084753812463372 1 -0.20339622724796672" +" 255 -0.098922382084248209 0.356624117376247 -0.256263439404529" +" 256 -1 -0.74213790787259271 -0.24206983063972595" +" 257 -0.72511478181115718 -1 -0.25002969999999997" +" 258 -0.1250383368944159 -1 -0.24987830054645518" +" 259 -0.5432409326212666 -0.58336779772250913 -0.0060938376146522089" +" 260 -1 -1 0.25020549999999997" +" 261 -0.69517902037783963 -1 0.48465629903462193" +" 262 -1 0.19801494027267907 -0.22908951271298833" +" 263 -1 -0.21170789004360985 -0.2804810168349573" +" 264 0.12431896494966958 0.19380761445281547 -0.51506516411314296" +" 265 0.016877018602808991 0.32057899216794972 -1" +" 266 0.31815206866103007 0.69886802178230512 -0.69773364246572678" +" 267 1 0.29452437620263039 0.03597223402760958" +" 268 -0.23854616157962166 0.70039865549364788 0.32382827237146705" +" 269 -0.072417036863037423 1 0.7240118059209224" +" 270 -0.65715846697692126 0.26022065746019457 0.6943166148678479" +" 271 0.032006652383344852 0.12877070459954792 0.60754383991332461" +" 272 0.70679839053632465 0.35784100137989416 0.35408213575434944" +" 273 1 0.75583880296190964 0.10796710954834202" +" 274 -0.066417091587110066 -0.67493516441615642 -0.64835749920354258" +" 275 -0.66000110931003353 -0.29732769674682547 -0.5356675566159671" +" 276 -1 -0.7460956789293286 -0.49597432811515113" +" 277 -0.63537062135554268 -1 -0.62487395000000001" +" 278 -0.072189529852730625 -0.75207129129950046 1" +" 279 -0.12479964999999998 -1 0.76180792382505302" +" 280 -0.64633703603487636 -0.58450521092750218 0.50482020379778969" +" 281 -0.19793040641595078 -1 0.22917284009874619" +" 282 0.36430902573049584 -0.60319992435881997 0.46610302519244695" +" 283 -0.014560432971481855 -0.28974170434477692 0.31899501601243035" +" 284 -0.16677858939457951 -0.59736466720530357 0.62746423626615599" +" 285 -0.70838149553417962 -0.14588171485233958 1" +" 286 -1 -0.20773576611374234 0.72382280144202749" +" 287 0.65401865792186442 -0.65865126715652123 0.6540215253821221" +" 288 0.76868552550191671 -0.1162896631221611 1" +" 289 0.39236022879703553 0.3070079448900544 0.42979647060190596" +" 290 0.3368388593683827 0.015623435483033674 1" +" 291 0.19283437348027005 -1 0.30983198636425424" +" 292 0.23987671409711908 -0.66618838122351409 0.0008945936534150746" +" 293 0.42213117252176491 -0.74712687995942406 -0.48458654817973601" +" 294 1 -0.66026812967233972 0.017464640590841476" +" 295 0.76163529643898698 -1 -0.11209435873849422" +" 296 0.71607191560259942 -0.37037315933178871 -0.41086960011962592" +" 297 -0.21716346053460103 -0.19947717862659675 -1" +" 298 -0.066700914192858729 -0.25756978212559839 -0.62896708724727191" +" 299 0.32965714090299714 -0.016623876027232615 -0.04345086208713933" +" 300 0.3771146741942551 -0.33750921003054202 -0.17865283786030017" +" 301 0.68867680851486557 0.35765454098697025 -0.68521532739244984" +" 302 0.68683764447685003 -0.49596319168560488 0.30085803648362652" +" 303 0.7090270874729655 -0.090415723473831255 0.40719961870896915" +" 304 -0.71897798523587353 0.032300798531047246 -1" +" 305 -0.78106895850102998 0.78106955040650416 -1" +" 306 -1 1 -0.75022459999999991" +" 307 -0.6917164744917017 0.69170418541265011 -0.69178840942223951" +" 308 -0.44874465612278081 0.23033846865992608 -0.37975265656437374" +" 309 -0.42791646676676653 1 -0.48213646482850109" +" 310 -0.50093773209802361 0.36943796178744326 -1" +" 311 -0.27376979380830829 0.64426231976101334 -0.66489790575084351" +" 312 -1 0.35637030336560244 -0.50592472907968644" +" 313 -0.67546025565396317 0.47435524682845248 -0.12755140965778172" +" 314 1 -1 -0.74991180000000002" +" 315 1 -0.75028080000000008 -1" +" 316 0.75389683099717963 -0.68868788457723729 -0.44203141186583489" +" 317 0.30599251534318156 -0.52261127269823027 -1" +" 318 0.40047237565428867 -0.18178393484624253 -0.46933497457143036" +" 319 0.59482353914036401 0.38624515090984007 -0.049897636224658731" +" 320 -1 0.12332997433814856 0.2857039136073185" +" 321 -1 -0.14689524813441618 0.42688908174824769" +" 322 -0.66262979736993932 -0.22367581355790006 0.28652907305244368" +" 323 -0.73506511384989526 0.43296210769478211 0.23284828493726362" +" 324 -0.35917397776062404 -0.0011820981956873755 0.46134022362807492" +" 325 -0.46329592253134338 -0.04321417701540118 0.047101266600350966" +" 326 -0.27019578023748486 0.66094639539627242 -0.2626201492532621" +" 327 -0.034393111593928383 0.28261880242562187 0.033764464745287937" +" 328 0.18250360638285329 -1 -0.25535398043003921" +" 329 -0.3030416241215706 -0.68638401151842854 -0.29392180366815041" +" 330 -0.20024923856661142 -0.43390131265744347 0.010814269493628442" +" 331 -0.70928533124789683 -1 0.043514240508664342" +" 332 -0.66723744746271052 -0.6603325322519602 -0.32775579384930814" +" 333 -0.75004930000000003 -1 1" +" 334 -0.19527119007052851 0.17101403421852743 -1" +" 335 0.035377884590221398 0.72616811699961958 0.38837547693302749" +" 336 -0.3958963327893722 1 0.076655950240576198" +" 337 -1 0.21457329427678187 0.47543850615348943" +" 338 -0.7309823244201562 0.04824246580043276 0.53867561355267524" +" 339 0.31731660817460328 0.019726050398274825 0.58867762989660533" +" 340 -0.23374781763549932 0.32728908975345111 0.68606341552187544" +" 341 -0.05707064185106852 -1 -0.71659883209883557" +" 342 0.025895325626349025 -1 -0.41197380535174077" +" 343 -0.63238580600180661 -0.3446250983839011 -0.21239475499198135" +" 344 -1 -0.44899498782248648 -0.76904522126668295" +" 345 -0.47299161220497166 -0.16458691872110107 -1" +" 346 -0.71473237282422963 -0.73570249654826969 -0.71737349776128545" +" 347 -0.74042724546706096 -1 0.74043153378626769" +" 348 -0.75006482996996637 -0.43746254158362985 1" +" 349 -1 -0.45163184813329721 0.75853196322407168" +" 350 -0.50484417551448635 -0.72312317896459377 0.74770602252103513" +" 351 -0.40758966352762416 -0.67845102844514626 0.2869272680702189" +" 352 0.34674400209661604 -0.46348651949776365 1" +" 353 -0.064367666161959269 -0.33637242545568102 0.74735946563471645" +" 354 0.092602515587840606 -0.73476755239921543 0.53136369836931496" +" 355 0.7405253302829875 -1 0.37931276242110001" +" 356 0.72074474478028516 -0.071123657589263783 0.72858260191381197" +" 357 -0.37493998320650845 -0.13123609584112483 -0.59370675998889832" +" 358 -0.038352185780633007 -0.36921106178200458 -0.36036098843849301" +" 359 -0.21058188105209746 -0.51336343843000509 -1" +" 360 0.48755585676167218 -0.72413212665883209 0.19600157800093837" +" 361 0.72678157399644117 -0.45646629587434373 0.011780680786240783" +" 362 1 -0.2170765504241112 0.26033741814256661" +" 363 -0.74541512030390267 -0.021189991595686748 -0.68170217165320612" +" 364 -0.37387254482300358 0.32527982613660117 -0.69267828171913437" +" 365 0.014913421017989981 0.548850834537849 -0.51262186425268497" +" 366 -0.74537069514237131 0.2884463439624349 -1" +" 367 -1 0.37511355000000007 -0.76842458715696027" +" 368 -0.68532657097754035 0.18056419100293586 -0.02075972921423834" +" 369 0.78133395148913365 -1 -0.78126287896225588" +" 370 0.78115294817471781 -0.78112807555219699 -1" +" 371 0.59082087507768066 -0.57000731366339108 -0.68829605397498683" +" 372 0.062122976656860403 -0.70293283755163305 -1" +" 373 0.71559274300689513 0.42281759201802555 -0.31813908171117911" +" 374 0.7564597747876356 0.13217713297538497 -0.16417576007580004" +" 375 0.40814884545639363 0.4915141193769953 -0.2436752542444009" +" 376 -0.75696767061236314 -0.5164837362163468 0.21622587965261447" +" 377 -0.452391830423859 0.55519361636450704 0.12429201972918034" +" 378 -0.43481019055019038 -0.12925317405502307 1" +" 379 -0.24742795067222612 -0.11366422696012682 0.2223275751188645" +" 380 -0.006677616808027087 -0.21615237698969206 -0.065426614396930594" +" 381 -0.062406752747729527 -0.70182414510247981 -0.087999792237402064" +" 382 0.10306104864954116 0.76464771966531997 0.11700653142882178" +" 383 0.27486783995540093 -0.12812237061584772 0.79536259891875982" +" 384 -0.74059417471417499 -0.15757730258109431 0.00074049988054281091" +" 385 -0.64002796579304344 -0.45394506207193958 -1" +" 386 -0.42239397063762912 -0.42048979870740139 0.69490811148992537" +" 387 -0.17195299402586212 -0.76346805360446235 0.40560748360163079" +" 388 0.37676760090127209 -0.4417530820461561 0.70978247252690463" +" 389 -0.20593363392839478 -0.044483242006169432 0.7439953909431003" +" 390 -0.31521564832256066 -0.39420460209868968 -0.72065547292536469" +" 391 -0.07315504595340451 0.34077703680706245 -0.71267230392230696" +" 392 -0.0052948425242513517 1 -0.74523404665783877" +" 393 -0.70127839101164502 0.30537699044254324 -0.64148488859352526" +" 394 0.25061214999999992 -1 -1" +" 395 0.40565131063307963 -0.76032995286218041 -1" +" 396 0.38398614307047785 -1 -0.75304567260853106" +" 397 0.23839244367761547 -0.68688896416028877 -0.73641430830181331" +" 398 0.76674691103343318 0.57740125411814403 -0.50231823898754502" +" 399 0.14110565781161721 -0.59279131304323562 0.77705687354697894" +"# Generated by tetgen -a0.01 cube.smesh " +); } +static const char* getElements() { return( +"1580 4 0" +" 0 120 148 13 240" +" 1 77 251 185 268" +" 2 126 194 66 198" +" 3 297 298 159 357" +" 4 13 148 147 240" +" 5 219 272 102 303" +" 6 134 137 37 136" +" 7 302 360 88 361" +" 8 23 264 95 391" +" 9 307 311 238 364" +" 10 57 309 254 326" +" 11 345 357 233 363" +" 12 176 343 325 384" +" 13 275 332 67 343" +" 14 141 245 228 318" +" 15 108 368 323 377" +" 16 7 47 74 123" +" 17 73 188 184 270" +" 18 56 235 148 313" +" 19 46 72 117 179" +" 20 66 105 28 194" +" 21 205 275 204 344" +" 22 66 194 28 198" +" 23 96 221 45 375" +" 24 93 160 94 161" +" 25 225 317 245 397" +" 26 121 186 74 188" +" 27 213 280 52 322" +" 28 52 322 280 376" +" 29 96 195 77 221" +" 30 8 257 256 331" +" 31 358 380 330 381" +" 32 99 181 166 266" +" 33 120 123 73 188" +" 34 122 189 187 340" +" 35 141 292 224 300" +" 36 313 326 240 377" +" 37 203 274 173 390" +" 38 140 299 221 319" +" 39 44 197 107 272" +" 40 171 326 108 377" +" 41 71 166 46 179" +" 42 69 364 334 391" +" 43 26 114 97 115" +" 44 228 253 159 358" +" 45 221 272 202 289" +" 46 123 184 73 188" +" 47 22 220 140 231" +" 48 250 324 322 325" +" 49 270 324 213 338" +" 50 147 240 57 336" +" 51 69 265 178 391" +" 52 100 249 165 365" +" 53 296 316 224 371" +" 54 74 188 186 189" +" 55 21 171 165 249" +" 56 23 297 225 298" +" 57 191 196 64 290" +" 58 87 139 138 288" +" 59 126 198 196 199" +" 60 223 328 141 342" +" 61 293 371 153 396" +" 62 238 308 108 313" +" 63 49 187 80 189" +" 64 143 300 224 361" +" 65 111 256 130 343" +" 66 62 107 106 273" +" 67 64 196 126 219" +" 68 314 154 315 369" +" 69 50 205 204 344" +" 70 0 70 26 71" +" 71 95 158 23 265" +" 72 37 138 87 139" +" 73 125 193 43 195" +" 74 56 312 238 313" +" 75 257 259 172 332" +" 76 25 70 0 72" +" 77 141 300 228 358" +" 78 32 207 208 350" +" 79 101 201 200 219" +" 80 13 147 121 240" +" 81 67 275 176 357" +" 82 116 249 180 266" +" 83 197 219 200 272" +" 84 152 247 42 371" +" 85 95 158 60 160" +" 86 45 230 116 375" +" 87 88 282 142 283" +" 88 96 162 61 249" +" 89 209 280 211 350" +" 90 84 353 226 399" +" 91 33 258 172 381" +" 92 118 285 213 378" +" 93 196 271 77 289" +" 94 282 287 218 388" +" 95 196 198 125 199" +" 96 74 7 76 30" +" 97 95 230 181 264" +" 98 297 359 225 390" +" 99 280 347 261 350" +" 100 253 299 170 380" +" 101 125 269 193 335" +" 102 245 293 224 300" +" 103 41 143 68 161" +" 104 58 295 244 316" +" 105 83 348 211 349" +" 106 75 29 76 123" +" 107 171 249 96 255" +" 108 124 196 125 199" +" 109 61 248 96 249" +" 110 221 255 45 327" +" 111 254 326 171 336" +" 112 194 198 126 199" +" 113 208 278 9 279" +" 114 94 93 11 160" +" 115 275 357 345 363" +" 116 127 173 109 203" +" 117 134 139 55 218" +" 118 45 255 253 327" +" 119 154 35 315 370" +" 120 283 284 142 353" +" 121 186 336 268 377" +" 122 59 93 11 94" +" 123 110 203 51 277" +" 124 59 246 94 247" +" 125 116 248 61 249" +" 126 41 229 143 296" +" 127 91 154 36 316" +" 128 71 179 116 180" +" 129 45 299 221 327" +" 130 319 373 182 374" +" 131 64 219 101 290" +" 132 116 301 179 398" +" 133 122 323 188 377" +" 134 182 373 68 374" +" 135 97 115 114 248" +" 136 60 158 95 181" +" 137 185 268 48 335" +" 138 66 125 43 195" +" 139 86 215 136 287" +" 140 106 202 163 273" +" 141 43 106 66 195" +" 142 271 324 283 389" +" 143 95 158 42 245" +" 144 186 188 122 189" +" 145 25 179 157 301" +" 146 173 274 110 341" +" 147 136 138 37 287" +" 148 244 293 58 316" +" 149 107 197 65 272" +" 150 42 160 158 161" +" 151 28 105 103 194" +" 152 200 201 126 219" +" 153 147 235 90 236" +" 154 224 292 141 293" +" 155 220 272 140 303" +" 156 4 209 83 211" +" 157 207 278 208 279" +" 158 296 300 143 318" +" 159 226 352 84 399" +" 160 104 65 63 194" +" 161 212 282 88 283" +" 162 255 308 238 364" +" 163 150 229 91 361" +" 164 43 163 106 202" +" 165 126 219 196 289" +" 166 48 185 79 189" +" 167 257 329 110 332" +" 168 170 299 252 380" +" 169 30 74 75 76" +" 170 30 79 78 80" +" 171 39 234 146 307" +" 172 218 252 142 339" +" 173 185 251 77 340" +" 174 102 200 197 219" +" 175 49 189 185 340" +" 176 213 348 286 349" +" 177 133 286 285 348" +" 178 65 197 126 272" +" 179 187 189 49 340" +" 180 213 285 53 378" +" 181 63 194 65 200" +" 182 131 279 85 387" +" 183 120 169 148 323" +" 184 197 200 126 272" +" 185 46 166 72 179" +" 186 15 248 98 273" +" 187 98 114 24 373" +" 188 46 180 100 266" +" 189 22 231 140 374" +" 190 171 335 77 382" +" 191 27 106 62 107" +" 192 255 264 159 391" +" 193 132 325 322 379" +" 194 240 323 313 377" +" 195 155 160 93 301" +" 196 221 299 170 327" +" 197 158 160 95 161" +" 198 79 80 30 189" +" 199 178 365 311 391" +" 200 16 285 133 286" +" 201 249 255 171 365" +" 202 188 270 73 323" +" 203 162 165 61 249" +" 204 107 126 65 194" +" 205 155 156 93 160" +" 206 219 303 102 356" +" 207 259 330 132 351" +" 208 224 293 141 300" +" 209 77 271 170 289" +" 210 231 252 140 299" +" 211 147 240 148 313" +" 212 152 370 153 395" +" 213 154 246 35 247" +" 214 291 354 212 387" +" 215 211 348 280 349" +" 216 144 234 39 307" +" 217 212 292 33 381" +" 218 133 348 83 349" +" 219 119 337 270 338" +" 220 120 188 73 323" +" 221 211 280 209 349" +" 222 209 211 333 347" +" 223 251 325 108 379" +" 224 236 238 146 309" +" 225 274 329 110 342" +" 226 39 305 144 307" +" 227 144 305 89 307" +" 228 96 249 248 375" +" 229 113 178 177 392" +" 230 91 294 224 295" +" 231 94 160 42 161" +" 232 165 171 21 326" +" 233 170 324 251 379" +" 234 211 347 209 350" +" 235 116 179 115 398" +" 236 214 263 31 384" +" 237 70 117 71 0" +" 238 43 195 96 202" +" 239 90 235 40 236" +" 240 134 136 37 287" +" 241 67 253 159 357" +" 242 33 328 258 381" +" 243 71 116 115 180" +" 244 55 241 134 302" +" 245 155 301 24 398" +" 246 275 345 205 363" +" 247 52 209 175 280" +" 248 287 302 241 355" +" 249 79 185 48 269" +" 250 45 181 116 230" +" 251 68 182 24 373" +" 252 106 126 66 195" +" 253 170 299 253 327" +" 254 228 298 245 358" +" 255 275 357 67 390" +" 256 126 195 77 196" +" 257 176 275 67 343" +" 258 17 363 232 367" +" 259 248 249 116 375" +" 260 251 324 250 325" +" 261 122 251 185 340" +" 262 238 311 309 326" +" 263 157 160 155 301" +" 264 60 181 99 265" +" 265 98 248 114 373" +" 266 34 261 209 347" +" 267 132 330 212 351" +" 268 245 274 141 358" +" 269 190 191 19 271" +" 270 236 238 57 313" +" 271 105 104 103 194" +" 272 94 246 161 247" +" 273 35 246 59 247" +" 274 140 319 267 374" +" 275 212 281 33 291" +" 276 117 71 46 179" +" 277 70 117 72 179" +" 278 159 253 228 264" +" 279 80 185 49 189" +" 280 209 333 4 210" +" 281 2 128 127 206" +" 282 100 164 46 166" +" 283 74 76 7 123" +" 284 80 187 75 189" +" 285 103 194 63 201" +" 286 171 326 249 365" +" 287 136 6 137 37" +" 288 216 291 85 354" +" 289 47 120 13 121" +" 290 101 288 54 356" +" 291 130 263 111 343" +" 292 168 200 101 201" +" 293 68 143 41 229" +" 294 282 291 135 354" +" 295 49 191 190 340" +" 296 184 189 75 270" +" 297 202 272 126 289" +" 298 218 356 339 383" +" 299 352 388 215 399" +" 300 124 192 125 269" +" 301 70 117 0 72" +" 302 136 218 138 287" +" 303 108 255 171 327" +" 304 223 293 153 396" +" 305 25 156 155 157" +" 306 115 116 61 180" +" 307 320 321 250 338" +" 308 60 166 99 181" +" 309 228 245 141 358" +" 310 127 346 203 385" +" 311 96 249 171 382" +" 312 219 272 140 289" +" 313 112 275 204 363" +" 314 126 197 65 200" +" 315 270 337 250 338" +" 316 42 158 95 161" +" 317 183 187 118 270" +" 318 212 283 132 284" +" 319 204 275 205 363" +" 320 165 180 61 249" +" 321 67 275 203 332" +" 322 14 185 80 269" +" 323 224 296 91 316" +" 324 209 261 175 280" +" 325 290 339 219 383" +" 326 193 269 48 335" +" 327 106 195 43 202" +" 328 176 357 275 363" +" 329 77 251 170 271" +" 330 44 267 220 272" +" 331 75 189 187 270" +" 332 65 194 126 200" +" 333 68 267 182 374" +" 334 125 195 66 198" +" 335 17 204 50 205" +" 336 250 325 322 384" +" 337 66 195 126 198" +" 338 79 185 80 189" +" 339 159 298 67 357" +" 340 218 302 88 303" +" 341 78 80 79 269" +" 342 77 221 170 327" +" 343 90 147 13 148" +" 344 319 373 230 375" +" 345 126 200 194 201" +" 346 143 161 41 296" +" 347 297 357 345 390" +" 348 126 195 106 202" +" 349 64 196 124 199" +" 350 209 333 211 4" +" 351 44 202 107 273" +" 352 195 196 125 335" +" 353 284 353 84 399" +" 354 125 196 195 198" +" 355 64 126 103 201" +" 356 63 200 168 201" +" 357 278 279 207 284" +" 358 175 209 34 261" +" 359 224 294 91 361" +" 360 274 298 225 390" +" 361 258 329 172 381" +" 362 293 316 153 371" +" 363 37 139 134 287" +" 364 200 219 126 272" +" 365 110 277 257 332" +" 366 158 225 42 245" +" 367 191 271 190 340" +" 368 6 86 136 217" +" 369 96 163 43 202" +" 370 41 246 154 296" +" 371 2 127 50 206" +" 372 120 240 188 323" +" 373 171 268 77 335" +" 374 257 277 276 332" +" 375 308 313 238 393" +" 376 98 248 202 273" +" 377 167 303 55 356" +" 378 136 137 6 217" +" 379 88 283 252 380" +" 380 188 323 240 377" +" 381 140 272 267 319" +" 382 121 188 120 240" +" 383 323 368 313 377" +" 384 172 258 110 329" +" 385 192 198 28 199" +" 386 284 354 85 387" +" 387 155 157 156 160" +" 388 143 230 45 299" +" 389 173 341 20 372" +" 390 248 319 96 375" +" 391 242 241 151 355" +" 392 30 80 75 189" +" 393 51 173 127 203" +" 394 81 256 8 257" +" 395 187 270 122 340" +" 396 38 241 242 355" +" 397 141 293 245 300" +" 398 93 156 11 160" +" 399 88 252 218 303" +" 400 29 123 75 184" +" 401 159 334 297 357" +" 402 206 344 130 346" +" 403 185 269 125 335" +" 404 151 294 10 295" +" 405 105 66 27 194" +" 406 150 302 55 362" +" 407 261 280 209 347" +" 408 312 367 145 393" +" 409 194 200 63 201" +" 410 176 275 112 363" +" 411 334 357 159 364" +" 412 231 302 88 361" +" 413 57 238 236 309" +" 414 88 300 292 380" +" 415 192 124 125 199" +" 416 148 240 120 323" +" 417 126 194 103 201" +" 418 259 331 82 351" +" 419 119 184 183 270" +" 420 150 241 55 302" +" 421 126 272 219 289" +" 422 230 301 116 373" +" 423 123 188 74 189" +" 424 74 186 79 189" +" 425 92 369 243 370" +" 426 131 280 261 350" +" 427 143 299 228 300" +" 428 220 303 231 362" +" 429 277 332 203 346" +" 430 256 257 81 276" +" 431 154 314 36 369" +" 432 100 180 165 249" +" 433 149 294 91 295" +" 434 274 329 141 358" +" 435 126 201 64 219" +" 436 64 201 101 219" +" 437 207 211 53 350" +" 438 283 330 132 379" +" 439 243 369 1 370" +" 440 24 373 114 398" +" 441 143 230 161 318" +" 442 161 296 245 371" +" 443 110 257 172 329" +" 444 96 162 43 163" +" 445 248 373 319 375" +" 446 171 221 77 327" +" 447 21 254 171 336" +" 448 306 5 239 305" +" 449 197 220 102 272" +" 450 82 281 172 351" +" 451 113 146 39 234" +" 452 143 229 68 374" +" 453 68 93 41 161" +" 454 172 351 281 381" +" 455 112 204 17 363" +" 456 124 191 185 196" +" 457 215 216 9 278" +" 458 19 383 353 389" +" 459 185 189 122 340" +" 460 137 38 287 134" +" 461 122 270 250 324" +" 462 126 202 107 272" +" 463 70 71 117 179" +" 464 84 227 226 353" +" 465 109 173 390 203" +" 466 13 121 120 240" +" 467 53 285 213 348" +" 468 228 358 300 380" +" 469 14 80 78 269" +" 470 55 302 218 303" +" 471 285 286 213 348" +" 472 107 202 106 273" +" 473 307 367 366 393" +" 474 147 148 90 235" +" 475 94 161 42 247" +" 476 276 332 277 346" +" 477 141 293 223 397" +" 478 51 203 127 346" +" 479 22 229 150 231" +" 480 163 202 96 248" +" 481 48 269 185 335" +" 482 162 163 96 248" +" 483 141 274 245 397" +" 484 115 163 61 248" +" 485 147 236 57 313" +" 486 158 181 60 265" +" 487 311 365 364 391" +" 488 193 195 125 335" +" 489 125 185 124 269" +" 490 224 296 245 300" +" 491 49 185 124 191" +" 492 132 280 213 322" +" 493 96 202 195 221" +" 494 233 357 334 364" +" 495 99 166 164 266" +" 496 245 293 141 397" +" 497 36 244 149 316" +" 498 74 79 30 189" +" 499 30 75 74 189" +" 500 12 178 99 392" +" 501 322 325 259 384" +" 502 195 196 126 198" +" 503 57 313 238 326" +" 504 48 268 186 336" +" 505 91 296 154 316" +" 506 14 192 124 269" +" 507 259 332 111 343" +" 508 238 311 255 364" +" 509 45 230 95 264" +" 510 140 252 221 299" +" 511 176 262 112 263" +" 512 32 211 207 350" +" 513 261 376 351 82" +" 514 19 227 190 389" +" 515 2 129 128 206" +" 516 102 220 167 303" +" 517 181 249 116 266" +" 518 170 271 251 324" +" 519 186 188 121 240" +" 520 213 321 286 338" +" 521 124 185 14 269" +" 522 91 295 224 316" +" 523 143 299 231 374" +" 524 159 364 255 391" +" 525 310 334 69 364" +" 526 170 283 271 379" +" 527 229 231 143 361" +" 528 241 287 134 302" +" 529 70 72 25 179" +" 530 72 157 25 179" +" 531 26 71 70 179" +" 532 70 114 26 179" +" 533 287 388 282 399" +" 534 68 229 22 374" +" 535 61 180 116 249" +" 536 115 116 71 179" +" 537 143 296 229 361" +" 538 142 354 282 399" +" 539 25 155 70 179" +" 540 139 288 167 356" +" 541 114 115 26 179" +" 542 26 115 71 179" +" 543 116 180 179 266" +" 544 164 166 100 266" +" 545 100 166 46 266" +" 546 171 255 221 327" +" 547 132 330 325 379" +" 548 140 289 252 339" +" 549 24 182 98 373" +" 550 180 249 100 266" +" 551 320 321 214 322" +" 552 213 285 270 338" +" 553 214 321 52 322" +" 554 122 188 186 268" +" 555 271 289 196 339" +" 556 108 251 250 325" +" 557 153 293 244 316" +" 558 43 193 162 382" +" 559 80 124 49 185" +" 560 159 67 358 253" +" 561 142 282 212 283" +" 562 14 124 80 185" +" 563 110 174 173 341" +" 564 187 189 122 270" +" 565 252 299 88 380" +" 566 55 218 139 356" +" 567 227 378 190 389" +" 568 33 292 222 328" +" 569 47 121 74 188" +" 570 74 123 47 188" +" 571 120 121 47 188" +" 572 47 123 120 188" +" 573 55 303 218 356" +" 574 167 288 18 356" +" 575 58 224 151 295" +" 576 18 167 87 288" +" 577 116 230 181 301" +" 578 161 246 41 296" +" 579 91 244 149 295" +" 580 33 281 212 381" +" 581 23 225 158 245" +" 582 79 186 48 189" +" 583 75 184 123 189" +" 584 74 75 76 189" +" 585 75 123 76 189" +" 586 76 123 74 189" +" 587 67 357 298 390" +" 588 124 185 125 196" +" 589 186 240 121 336" +" 590 64 191 124 196" +" 591 209 210 34 347" +" 592 80 185 79 269" +" 593 63 103 104 194" +" 594 27 107 65 194" +" 595 9 278 216 279" +" 596 66 126 106 194" +" 597 104 27 65 194" +" 598 66 106 27 194" +" 599 106 107 27 194" +" 600 27 3 105 194" +" 601 105 3 104 194" +" 602 104 3 27 194" +" 603 77 335 195 382" +" 604 136 217 86 287" +" 605 226 290 54 383" +" 606 290 356 54 383" +" 607 218 339 142 383" +" 608 21 268 193 336" +" 609 193 268 48 336" +" 610 171 268 21 336" +" 611 103 194 126 199" +" 612 28 198 194 199" +" 613 125 198 192 199" +" 614 28 194 103 199" +" 615 106 163 62 273" +" 616 98 202 44 273" +" 617 221 252 170 299" +" 618 141 300 245 318" +" 619 185 196 77 335" +" 620 244 295 91 316" +" 621 62 163 15 273" +" 622 231 299 143 300" +" 623 317 371 245 397" +" 624 126 196 64 199" +" 625 103 126 64 199" +" 626 93 94 59 246" +" 627 127 344 206 346" +" 628 224 292 222 360" +" 629 225 359 274 390" +" 630 221 319 45 375" +" 631 25 157 155 301" +" 632 19 271 191 290" +" 633 110 341 274 342" +" 634 163 248 15 273" +" 635 132 283 212 330" +" 636 119 321 320 338" +" 637 186 189 122 268" +" 638 106 194 126 202" +" 639 126 194 107 202" +" 640 107 194 106 202" +" 641 141 358 329 381" +" 642 88 302 282 360" +" 643 263 275 176 343" +" 644 173 203 110 274" +" 645 260 175 34 261" +" 646 250 270 122 323" +" 647 21 165 162 249" +" 648 193 335 268 382" +" 649 130 332 275 343" +" 650 204 275 130 344" +" 651 51 110 174 203" +" 652 110 173 174 203" +" 653 174 173 51 203" +" 654 70 155 24 398" +" 655 177 113 39 234" +" 656 218 252 88 282" +" 657 352 383 54 388" +" 658 112 263 204 275" +" 659 54 352 226 383" +" 660 134 287 241 355" +" 661 238 307 146 309" +" 662 224 295 58 316" +" 663 325 343 259 384" +" 664 259 329 67 330" +" 665 88 292 224 360" +" 666 9 215 86 216" +" 667 221 299 45 319" +" 668 245 296 161 318" +" 669 136 134 137 287" +" 670 83 211 209 349" +" 671 132 324 283 379" +" 672 84 284 207 353" +" 673 138 139 37 287" +" 674 140 252 231 303" +" 675 219 289 140 339" +" 676 181 230 45 264" +" 677 228 300 299 380" +" 678 85 279 216 354" +" 679 169 320 250 323" +" 680 68 230 143 374" +" 681 207 227 84 353" +" 682 240 313 57 326" +" 683 49 190 187 340" +" 684 286 348 133 349" +" 685 52 280 213 349" +" 686 263 343 176 384" +" 687 51 277 203 346" +" 688 220 267 140 272" +" 689 137 217 136 287" +" 690 203 329 274 390" +" 691 31 320 250 368" +" 692 224 316 293 371" +" 693 231 252 88 303" +" 694 252 271 170 283" +" 695 253 358 228 380" +" 696 256 276 130 332" +" 697 19 353 227 389" +" 698 219 339 303 356" +" 699 170 252 221 289" +" 700 142 271 252 283" +" 701 209 347 280 350" +" 702 142 252 88 283" +" 703 251 324 271 340" +" 704 95 264 181 391" +" 705 171 251 77 268" +" 706 98 319 248 373" +" 707 331 351 259 376" +" 708 41 154 91 296" +" 709 10 241 151 242" +" 710 330 380 292 381" +" 711 132 284 283 353" +" 712 140 272 221 289" +" 713 126 196 77 289" +" 714 152 371 317 395" +" 715 36 149 91 316" +" 716 108 253 176 308" +" 717 255 365 264 391" +" 718 202 248 163 273" +" 719 224 300 88 361" +" 720 65 126 107 272" +" 721 67 159 358 298" +" 722 88 300 231 361" +" 723 153 223 58 293" +" 724 146 238 236 307" +" 725 202 248 98 319" +" 726 141 328 292 381" +" 727 42 161 95 245" +" 728 176 253 108 325" +" 729 10 294 149 295" +" 730 155 179 25 301" +" 731 68 161 143 230" +" 732 264 365 181 391" +" 733 225 274 245 298" +" 734 225 245 23 298" +" 735 41 161 93 246" +" 736 97 163 115 248" +" 737 93 161 94 246" +" 738 45 255 96 375" +" 739 212 291 282 354" +" 740 148 313 323 169" +" 741 224 292 88 300" +" 742 142 283 212 354" +" 743 61 162 96 248" +" 744 97 114 98 248" +" 745 185 189 48 268" +" 746 205 345 275 385" +" 747 48 268 193 335" +" 748 24 155 68 301" +" 749 60 160 157 301" +" 750 159 357 308 364" +" 751 297 345 109 390" +" 752 61 163 162 248" +" 753 61 116 115 248" +" 754 230 299 143 374" +" 755 140 267 22 374" +" 756 102 303 167 356" +" 757 134 287 218 302" +" 758 218 282 88 302" +" 759 93 161 68 230" +" 760 357 363 308 364" +" 761 224 295 294 361" +" 762 153 244 36 316" +" 763 303 339 218 356" +" 764 294 302 150 361" +" 765 153 371 152 395" +" 766 57 326 254 336" +" 767 48 189 186 268" +" 768 238 308 255 326" +" 769 214 322 52 376" +" 770 132 322 259 376" +" 771 111 331 259 376" +" 772 121 240 147 336" +" 773 253 379 330 380" +" 774 223 274 141 397" +" 775 176 308 262 313" +" 776 31 262 176 263" +" 777 334 364 159 391" +" 778 255 311 238 326" +" 779 110 274 203 329" +" 780 315 369 154 370" +" 781 146 234 113 311" +" 782 363 366 232 367" +" 783 159 298 228 358" +" 784 292 328 33 381" +" 785 68 301 230 373" +" 786 271 340 324 389" +" 787 176 263 112 275" +" 788 1 369 315 370" +" 789 159 308 255 364" +" 790 253 255 159 308" +" 791 262 312 56 313" +" 792 19 290 226 383" +" 793 84 352 215 399" +" 794 23 158 95 245" +" 795 145 235 56 238" +" 796 132 322 213 324" +" 797 77 268 185 335" +" 798 175 214 52 376" +" 799 108 255 253 308" +" 800 56 238 235 313" +" 801 111 175 8 331" +" 802 52 286 213 321" +" 803 149 244 91 316" +" 804 237 5 306 305" +" 805 165 326 113 365" +" 806 58 293 224 316" +" 807 204 263 130 275" +" 808 222 292 58 328" +" 809 175 261 260 331" +" 810 45 253 228 299" +" 811 250 321 320 322" +" 812 102 272 220 303" +" 813 182 267 98 319" +" 814 170 379 253 380" +" 815 151 241 10 294" +" 816 52 321 213 322" +" 817 215 278 84 399" +" 818 282 354 216 399" +" 819 22 267 68 374" +" 820 230 373 319 374" +" 821 97 98 15 248" +" 822 274 341 223 342" +" 823 15 163 97 248" +" 824 153 316 36 369" +" 825 132 351 212 387" +" 826 185 251 122 268" +" 827 122 189 185 268" +" 828 250 324 270 338" +" 829 233 345 297 357" +" 830 129 277 128 346" +" 831 165 249 171 326" +" 832 122 268 251 377" +" 833 259 329 172 332" +" 834 255 364 311 365" +" 835 140 220 22 267" +" 836 142 282 218 388" +" 837 108 326 313 377" +" 838 221 252 140 289" +" 839 77 196 195 335" +" 840 251 271 77 340" +" 841 250 251 122 324" +" 842 238 309 57 326" +" 843 227 386 378 389" +" 844 171 255 108 326" +" 845 256 259 111 331" +" 846 178 365 266 392" +" 847 178 311 69 391" +" 848 102 219 197 272" +" 849 172 259 257 331" +" 850 258 342 329 381" +" 851 143 296 224 300" +" 852 88 299 231 300" +" 853 182 319 98 373" +" 854 44 220 197 272" +" 855 107 202 44 272" +" 856 333 210 209 347" +" 857 299 300 88 380" +" 858 67 253 176 325" +" 859 212 354 284 387" +" 860 203 110 332 277" +" 861 171 251 108 327" +" 862 96 221 171 255" +" 863 45 221 96 255" +" 864 58 293 223 328" +" 865 148 235 147 313" +" 866 36 316 154 369" +" 867 92 395 394 396" +" 868 132 351 280 376" +" 869 253 299 45 327" +" 870 233 334 310 364" +" 871 195 335 193 382" +" 872 193 268 21 382" +" 873 223 293 141 328" +" 874 292 293 58 328" +" 875 38 137 287 217" +" 876 315 1 314 369" +" 877 141 274 223 342" +" 878 188 268 122 377" +" 879 141 293 292 328" +" 880 235 236 147 313" +" 881 235 238 236 313" +" 882 57 240 147 313" +" 883 88 282 212 292" +" 884 23 297 159 334" +" 885 259 325 132 330" +" 886 23 334 159 391" +" 887 283 324 132 389" +" 888 205 345 304 363" +" 889 253 325 67 330" +" 890 43 162 96 382" +" 891 257 331 259 332" +" 892 256 331 257 332" +" 893 172 329 257 332" +" 894 54 356 218 383" +" 895 259 331 256 332" +" 896 208 131 32 350" +" 897 280 348 213 349" +" 898 118 270 213 285" +" 899 16 270 118 285" +" 900 253 308 159 357" +" 901 81 276 257 277" +" 902 228 253 45 264" +" 903 31 262 169 368" +" 904 262 313 169 368" +" 905 108 313 308 368" +" 906 159 255 253 264" +" 907 253 255 45 264" +" 908 95 181 158 265" +" 909 45 264 255 365" +" 910 113 311 178 392" +" 911 177 178 12 392" +" 912 100 365 165 392" +" 913 369 370 92 395" +" 914 72 179 166 266" +" 915 150 294 241 302" +" 916 134 218 55 302" +" 917 166 179 71 266" +" 918 179 180 71 266" +" 919 46 166 71 266" +" 920 71 180 46 266" +" 921 308 364 363 393" +" 922 238 313 312 393" +" 923 238 364 308 393" +" 924 366 367 363 393" +" 925 218 287 282 302" +" 926 72 166 60 266" +" 927 166 181 60 266" +" 928 116 373 301 398" +" 929 225 372 317 397" +" 930 226 388 352 399" +" 931 145 238 56 312" +" 932 176 325 108 368" +" 933 152 35 154 370" +" 934 108 327 251 379" +" 935 135 291 216 354" +" 936 283 324 271 379" +" 937 213 324 322 338" +" 938 284 351 132 387" +" 939 321 322 250 338" +" 940 73 323 270 337" +" 941 270 323 250 337" +" 942 286 321 119 338" +" 943 250 323 320 337" +" 944 320 323 73 337" +" 945 213 322 321 338" +" 946 122 189 188 270" +" 947 183 184 29 270" +" 948 29 187 183 270" +" 949 16 183 118 270" +" 950 119 183 16 270" +" 951 252 271 142 339" +" 952 196 289 219 339" +" 953 69 311 310 364" +" 954 185 191 49 340" +" 955 29 184 75 270" +" 956 75 187 29 270" +" 957 184 188 123 270" +" 958 188 189 123 270" +" 959 123 189 184 270" +" 960 255 308 108 326" +" 961 108 308 238 326" +" 962 245 298 274 358" +" 963 111 332 256 343" +" 964 53 227 207 386" +" 965 58 244 153 293" +" 966 91 296 224 361" +" 967 268 336 171 377" +" 968 162 249 96 382" +" 969 141 329 274 342" +" 970 259 322 132 325" +" 971 213 348 280 386" +" 972 130 275 263 343" +" 973 161 230 95 318" +" 974 95 230 45 318" +" 975 228 298 95 318" +" 976 302 303 55 362" +" 977 45 230 143 318" +" 978 95 245 161 318" +" 979 77 251 171 327" +" 980 233 363 357 364" +" 981 213 280 132 386" +" 982 173 109 390 359" +" 983 159 297 23 298" +" 984 213 286 52 349" +" 985 108 251 171 377" +" 986 209 280 52 349" +" 987 252 289 271 339" +" 988 84 278 207 284" +" 989 142 252 218 282" +" 990 88 252 142 282" +" 991 190 271 19 389" +" 992 257 276 256 332" +" 993 251 268 171 377" +" 994 122 270 188 323" +" 995 138 218 139 287" +" 996 226 383 352 388" +" 997 73 169 120 323" +" 998 73 320 169 323" +" 999 324 325 251 379" +" 1000 364 365 255 391" +" 1001 228 300 141 318" +" 1002 224 296 143 361" +" 1003 87 167 139 288" +" 1004 297 334 233 357" +" 1005 85 284 279 354" +" 1006 122 324 251 340" +" 1007 170 221 77 289" +" 1008 170 271 252 289" +" 1009 77 195 126 289" +" 1010 167 220 55 303" +" 1011 139 218 134 287" +" 1012 216 217 135 287" +" 1013 135 282 216 287" +" 1014 245 300 296 318" +" 1015 58 292 224 293" +" 1016 171 249 21 382" +" 1017 172 259 82 351" +" 1018 131 284 279 387" +" 1019 134 241 38 355" +" 1020 18 288 101 356" +" 1021 38 287 134 355" +" 1022 139 167 55 356" +" 1023 139 218 138 356" +" 1024 142 383 271 389" +" 1025 216 282 135 354" +" 1026 353 383 142 389" +" 1027 271 283 142 389" +" 1028 131 350 284 387" +" 1029 274 358 298 390" +" 1030 86 216 215 287" +" 1031 86 217 216 287" +" 1032 195 202 126 289" +" 1033 195 221 202 289" +" 1034 77 221 195 289" +" 1035 140 272 219 303" +" 1036 33 291 222 292" +" 1037 212 291 33 292" +" 1038 229 296 91 361" +" 1039 140 231 220 303" +" 1040 145 307 238 393" +" 1041 222 224 58 292" +" 1042 270 324 122 340" +" 1043 96 319 221 375" +" 1044 216 278 215 399" +" 1045 274 341 173 372" +" 1046 88 252 231 299" +" 1047 216 279 278 399" +" 1048 115 248 116 398" +" 1049 274 359 225 372" +" 1050 153 395 92 396" +" 1051 245 298 228 318" +" 1052 95 298 245 318" +" 1053 143 300 228 318" +" 1054 231 303 302 362" +" 1055 91 229 41 296" +" 1056 293 396 223 397" +" 1057 249 255 45 375" +" 1058 42 245 225 317" +" 1059 304 345 233 363" +" 1060 55 303 220 362" +" 1061 231 302 150 362" +" 1062 216 354 279 399" +" 1063 361 224 151 360" +" 1064 282 388 142 399" +" 1065 96 255 249 375" +" 1066 151 222 135 360" +" 1067 222 292 291 360" +" 1068 159 264 23 391" +" 1069 127 206 128 346" +" 1070 95 265 23 391" +" 1071 69 334 265 391" +" 1072 159 264 228 298" +" 1073 228 264 95 298" +" 1074 23 245 95 298" +" 1075 282 292 88 360" +" 1076 67 330 329 358" +" 1077 23 264 159 298" +" 1078 95 264 23 298" +" 1079 229 231 22 374" +" 1080 60 157 72 301" +" 1081 157 179 72 301" +" 1082 116 266 179 301" +" 1083 95 160 60 301" +" 1084 60 266 181 301" +" 1085 181 266 116 301" +" 1086 60 181 95 301" +" 1087 181 230 95 301" +" 1088 160 161 93 301" +" 1089 161 230 93 301" +" 1090 68 155 93 301" +" 1091 93 230 68 301" +" 1092 179 266 72 301" +" 1093 72 266 60 301" +" 1094 95 161 160 301" +" 1095 95 230 161 301" +" 1096 308 357 176 363" +" 1097 255 326 171 365" +" 1098 91 294 150 361" +" 1099 294 360 302 361" +" 1100 231 300 143 361" +" 1101 88 302 231 303" +" 1102 245 371 293 397" +" 1103 146 236 40 307" +" 1104 236 238 235 307" +" 1105 235 238 145 307" +" 1106 110 203 332 329" +" 1107 177 234 178 311" +" 1108 113 234 177 311" +" 1109 169 262 56 313" +" 1110 148 169 56 313" +" 1111 89 237 145 307" +" 1112 89 305 237 307" +" 1113 306 40 145 307" +" 1114 146 40 306 307" +" 1115 237 306 145 307" +" 1116 237 305 306 307" +" 1117 306 239 146 307" +" 1118 305 239 306 307" +" 1119 146 239 39 307" +" 1120 239 305 39 307" +" 1121 40 235 145 307" +" 1122 40 236 235 307" +" 1123 177 178 113 311" +" 1124 253 255 108 327" +" 1125 307 309 238 311" +" 1126 178 234 69 311" +" 1127 170 251 77 327" +" 1128 271 324 170 379" +" 1129 146 307 234 311" +" 1130 181 266 99 365" +" 1131 69 234 144 311" +" 1132 234 307 144 311" +" 1133 228 299 253 380" +" 1134 100 266 249 365" +" 1135 178 266 99 392" +" 1136 99 266 178 365" +" 1137 113 365 311 392" +" 1138 99 266 164 392" +" 1139 108 308 176 368" +" 1140 313 323 169 368" +" 1141 45 255 249 365" +" 1142 232 363 304 366" +" 1143 308 313 176 368" +" 1144 146 309 307 311" +" 1145 113 309 146 311" +" 1146 52 280 175 376" +" 1147 144 310 69 311" +" 1148 115 179 114 398" +" 1149 114 248 115 398" +" 1150 176 262 31 368" +" 1151 212 284 132 387" +" 1152 89 366 144 367" +" 1153 153 370 369 395" +" 1154 153 369 92 395" +" 1155 301 373 24 398" +" 1156 53 350 348 386" +" 1157 108 325 250 368" +" 1158 371 395 153 396" +" 1159 24 301 68 373" +" 1160 70 179 155 398" +" 1161 161 296 143 318" +" 1162 95 264 228 318" +" 1163 228 264 45 318" +" 1164 45 264 95 318" +" 1165 45 299 228 318" +" 1166 228 299 143 318" +" 1167 143 299 45 318" +" 1168 68 373 230 374" +" 1169 267 319 182 374" +" 1170 259 351 132 376" +" 1171 202 272 221 319" +" 1172 221 272 140 319" +" 1173 202 221 96 319" +" 1174 96 248 202 319" +" 1175 116 373 248 375" +" 1176 44 202 98 319" +" 1177 98 267 44 319" +" 1178 267 272 44 319" +" 1179 44 272 202 319" +" 1180 230 373 116 375" +" 1181 143 231 229 374" +" 1182 116 249 181 375" +" 1183 45 319 230 375" +" 1184 116 181 45 375" +" 1185 175 331 111 376" +" 1186 280 322 132 376" +" 1187 171 336 326 377" +" 1188 261 347 131 350" +" 1189 131 347 32 350" +" 1190 128 206 129 346" +" 1191 238 313 108 326" +" 1192 171 254 21 326" +" 1193 329 358 330 381" +" 1194 251 327 170 379" +" 1195 325 330 253 379" +" 1196 172 281 33 381" +" 1197 212 282 142 354" +" 1198 110 329 258 342" +" 1199 205 344 50 385" +" 1200 376 261 351 280" +" 1201 173 174 20 341" +" 1202 322 324 132 379" +" 1203 322 325 324 379" +" 1204 298 358 67 390" +" 1205 67 329 203 390" +" 1206 21 254 165 326" +" 1207 184 270 119 337" +" 1208 142 284 283 354" +" 1209 73 270 184 337" +" 1210 218 303 252 339" +" 1211 250 323 108 368" +" 1212 245 274 225 397" +" 1213 165 254 113 326" +" 1214 275 344 205 385" +" 1215 254 309 113 326" +" 1216 309 311 113 326" +" 1217 96 221 77 382" +" 1218 249 326 165 365" +" 1219 125 196 185 335" +" 1220 224 245 371 293" +" 1221 203 329 67 332" +" 1222 50 206 127 344" +" 1223 162 193 21 382" +" 1224 8 256 111 331" +" 1225 82 259 172 331" +" 1226 245 224 371 296" +" 1227 260 8 175 331" +" 1228 250 368 325 384" +" 1229 219 356 290 383" +" 1230 96 195 43 382" +" 1231 271 339 290 383" +" 1232 212 330 292 381" +" 1233 265 334 23 391" +" 1234 329 330 259 381" +" 1235 329 342 141 381" +" 1236 77 221 171 382" +" 1237 43 195 193 382" +" 1238 292 380 141 381" +" 1239 141 380 358 381" +" 1240 111 259 256 332" +" 1241 135 355 151 360" +" 1242 130 344 275 346" +" 1243 206 276 129 346" +" 1244 207 350 53 386" +" 1245 128 277 51 346" +" 1246 51 127 128 346" +" 1247 353 386 227 389" +" 1248 271 290 19 383" +" 1249 339 356 219 383" +" 1250 322 324 250 338" +" 1251 250 337 320 338" +" 1252 320 337 119 338" +" 1253 119 270 16 338" +" 1254 270 285 16 338" +" 1255 213 286 285 338" +" 1256 285 286 16 338" +" 1257 16 286 119 338" +" 1258 343 376 259 384" +" 1259 250 320 31 384" +" 1260 252 303 140 339" +" 1261 140 303 219 339" +" 1262 191 271 196 339" +" 1263 191 290 271 339" +" 1264 196 290 191 339" +" 1265 196 219 64 339" +" 1266 219 290 64 339" +" 1267 64 290 196 339" +" 1268 31 368 250 384" +" 1269 31 263 176 384" +" 1270 322 376 214 384" +" 1271 185 196 191 340" +" 1272 196 271 191 340" +" 1273 203 275 67 390" +" 1274 345 357 275 390" +" 1275 77 196 185 340" +" 1276 77 271 196 340" +" 1277 187 190 118 340" +" 1278 118 270 187 340" +" 1279 256 332 130 343" +" 1280 67 325 176 343" +" 1281 67 329 259 343" +" 1282 67 332 329 343" +" 1283 329 332 259 343" +" 1284 298 357 297 390" +" 1285 227 353 207 386" +" 1286 344 346 127 385" +" 1287 203 346 275 385" +" 1288 348 350 280 386" +" 1289 67 330 325 343" +" 1290 325 330 259 343" +" 1291 259 330 67 343" +" 1292 284 350 207 386" +" 1293 280 350 284 386" +" 1294 207 353 284 386" +" 1295 130 276 206 346" +" 1296 130 332 276 346" +" 1297 129 276 81 346" +" 1298 276 277 81 346" +" 1299 81 277 129 346" +" 1300 203 332 275 346" +" 1301 275 332 130 346" +" 1302 53 348 213 386" +" 1303 284 353 132 386" +" 1304 280 348 211 350" +" 1305 211 348 53 350" +" 1306 85 281 131 387" +" 1307 207 284 279 350" +" 1308 279 284 131 350" +" 1309 207 279 208 350" +" 1310 208 279 131 350" +" 1311 333 211 32 350" +" 1312 333 347 211 350" +" 1313 32 347 333 350" +" 1314 350 351 284 387" +" 1315 85 291 281 387" +" 1316 281 381 351 387" +" 1317 240 336 186 377" +" 1318 313 368 108 377" +" 1319 21 268 171 382" +" 1320 171 221 96 382" +" 1321 268 335 171 382" +" 1322 218 287 136 388" +" 1323 54 383 218 388" +" 1324 218 383 142 388" +" 1325 142 383 226 388" +" 1326 82 261 131 351" +" 1327 261 280 131 351" +" 1328 284 350 280 351" +" 1329 280 350 131 351" +" 1330 226 227 19 353" +" 1331 85 354 291 387" +" 1332 131 351 350 387" +" 1333 150 231 229 361" +" 1334 88 360 224 361" +" 1335 279 284 85 387" +" 1336 281 291 212 387" +" 1337 135 287 217 355" +" 1338 150 302 231 361" +" 1339 217 287 38 355" +" 1340 283 284 212 354" +" 1341 132 353 283 389" +" 1342 118 340 190 389" +" 1343 190 340 271 389" +" 1344 271 383 19 389" +" 1345 138 288 139 356" +" 1346 176 368 31 384" +" 1347 102 167 168 356" +" 1348 101 219 200 356" +" 1349 200 219 102 356" +" 1350 167 18 168 356" +" 1351 168 18 101 356" +" 1352 101 290 219 356" +" 1353 54 290 101 356" +" 1354 138 218 54 356" +" 1355 54 288 138 356" +" 1356 259 376 322 384" +" 1357 325 368 176 384" +" 1358 168 200 102 356" +" 1359 101 200 168 356" +" 1360 176 253 67 357" +" 1361 176 308 253 357" +" 1362 307 310 144 364" +" 1363 266 365 100 392" +" 1364 135 291 282 360" +" 1365 222 291 135 360" +" 1366 282 291 212 360" +" 1367 291 292 212 360" +" 1368 212 292 282 360" +" 1369 58 222 151 360" +" 1370 58 224 222 360" +" 1371 151 224 58 360" +" 1372 22 231 150 362" +" 1373 220 231 22 362" +" 1374 241 294 151 360" +" 1375 241 302 294 360" +" 1376 282 302 287 360" +" 1377 302 355 287 360" +" 1378 282 287 135 360" +" 1379 287 355 135 360" +" 1380 241 355 302 360" +" 1381 151 355 241 360" +" 1382 294 295 151 361" +" 1383 151 360 294 361" +" 1384 204 205 17 363" +" 1385 205 304 17 363" +" 1386 132 324 213 386" +" 1387 17 304 232 363" +" 1388 250 320 169 368" +" 1389 113 326 311 365" +" 1390 274 372 225 397" +" 1391 238 312 145 393" +" 1392 372 395 317 397" +" 1393 144 307 89 367" +" 1394 89 307 145 367" +" 1395 181 264 45 365" +" 1396 249 266 181 365" +" 1397 311 326 255 365" +" 1398 310 311 144 364" +" 1399 144 311 307 364" +" 1400 176 313 262 368" +" 1401 169 320 31 368" +" 1402 144 366 307 367" +" 1403 169 323 250 368" +" 1404 232 366 89 367" +" 1405 112 363 17 367" +" 1406 275 346 344 385" +" 1407 317 395 371 397" +" 1408 145 367 307 393" +" 1409 363 364 233 393" +" 1410 363 367 112 393" +" 1411 164 266 100 392" +" 1412 307 364 238 393" +" 1413 112 367 312 393" +" 1414 165 365 113 392" +" 1415 311 365 178 392" +" 1416 12 99 164 392" +" 1417 173 359 274 372" +" 1418 248 373 116 398" +" 1419 245 317 42 371" +" 1420 42 317 152 371" +" 1421 161 245 42 371" +" 1422 42 247 161 371" +" 1423 161 247 246 371" +" 1424 246 296 161 371" +" 1425 154 296 246 371" +" 1426 154 316 296 371" +" 1427 246 247 154 371" +" 1428 152 154 35 371" +" 1429 154 247 35 371" +" 1430 35 247 152 371" +" 1431 152 370 154 371" +" 1432 114 373 248 398" +" 1433 179 301 155 398" +" 1434 114 179 70 398" +" 1435 24 114 70 398" +" 1436 153 370 152 371" +" 1437 154 369 316 371" +" 1438 154 370 369 371" +" 1439 316 369 153 371" +" 1440 369 370 153 371" +" 1441 215 388 287 399" +" 1442 278 284 84 399" +" 1443 231 299 140 374" +" 1444 299 319 140 374" +" 1445 45 299 230 374" +" 1446 45 319 299 374" +" 1447 230 319 45 374" +" 1448 45 365 249 375" +" 1449 249 365 181 375" +" 1450 181 365 45 375" +" 1451 311 364 69 391" +" 1452 259 343 111 376" +" 1453 111 214 175 376" +" 1454 175 280 261 376" +" 1455 224 361 151 295" +" 1456 82 351 331 376" +" 1457 127 203 109 385" +" 1458 50 344 127 385" +" 1459 82 331 261 376" +" 1460 261 331 175 376" +" 1461 250 251 108 377" +" 1462 108 323 250 377" +" 1463 122 251 250 377" +" 1464 250 323 122 377" +" 1465 188 240 186 377" +" 1466 186 268 188 377" +" 1467 240 326 57 377" +" 1468 326 336 57 377" +" 1469 57 336 240 377" +" 1470 108 325 253 379" +" 1471 170 327 253 379" +" 1472 253 327 108 379" +" 1473 252 283 170 380" +" 1474 212 283 88 380" +" 1475 212 330 283 380" +" 1476 330 379 283 380" +" 1477 283 379 170 380" +" 1478 253 330 67 380" +" 1479 330 358 67 380" +" 1480 67 358 253 380" +" 1481 21 249 162 382" +" 1482 300 358 141 380" +" 1483 292 300 141 380" +" 1484 77 195 96 382" +" 1485 88 292 212 380" +" 1486 292 330 212 380" +" 1487 330 351 259 381" +" 1488 172 329 259 381" +" 1489 259 351 172 381" +" 1490 212 351 330 381" +" 1491 141 342 328 381" +" 1492 328 342 258 381" +" 1493 142 353 226 383" +" 1494 226 353 19 383" +" 1495 142 339 271 383" +" 1496 274 359 173 390" +" 1497 225 298 297 390" +" 1498 31 320 214 384" +" 1499 250 322 320 384" +" 1500 320 322 214 384" +" 1501 111 376 343 384" +" 1502 214 376 111 384" +" 1503 111 263 214 384" +" 1504 111 343 263 384" +" 1505 53 378 227 386" +" 1506 213 378 53 386" +" 1507 203 385 275 390" +" 1508 132 351 284 386" +" 1509 284 351 280 386" +" 1510 280 351 132 386" +" 1511 109 385 203 390" +" 1512 109 359 297 390" +" 1513 351 381 212 387" +" 1514 212 381 281 387" +" 1515 131 281 82 387" +" 1516 281 351 82 387" +" 1517 82 351 131 387" +" 1518 313 148 323 240" +" 1519 136 287 215 388" +" 1520 215 352 136 388" +" 1521 136 352 54 388" +" 1522 54 138 136 388" +" 1523 54 218 138 388" +" 1524 138 218 136 388" +" 1525 283 353 142 389" +" 1526 190 378 118 389" +" 1527 324 340 270 389" +" 1528 270 340 118 389" +" 1529 378 386 213 389" +" 1530 213 386 324 389" +" 1531 132 386 353 389" +" 1532 324 386 132 389" +" 1533 118 378 213 389" +" 1534 213 270 118 389" +" 1535 213 324 270 389" +" 1536 275 385 345 390" +" 1537 345 385 109 390" +" 1538 67 358 329 390" +" 1539 329 358 274 390" +" 1540 181 265 95 391" +" 1541 99 265 181 391" +" 1542 181 365 99 391" +" 1543 178 265 99 391" +" 1544 99 365 178 391" +" 1545 233 364 310 393" +" 1546 310 366 233 393" +" 1547 304 363 233 393" +" 1548 304 366 363 393" +" 1549 233 366 304 393" +" 1550 310 364 307 393" +" 1551 308 363 176 393" +" 1552 176 363 112 393" +" 1553 312 313 262 393" +" 1554 262 313 308 393" +" 1555 144 310 307 393" +" 1556 144 366 310 393" +" 1557 307 366 144 393" +" 1558 262 308 176 393" +" 1559 112 262 176 393" +" 1560 112 312 262 393" +" 1561 223 341 274 397" +" 1562 341 372 274 397" +" 1563 223 396 341 397" +" 1564 394 395 372 397" +" 1565 394 396 395 397" +" 1566 395 396 371 397" +" 1567 371 396 293 397" +" 1568 341 396 394 397" +" 1569 341 394 20 397" +" 1570 394 372 20 397" +" 1571 20 372 341 397" +" 1572 279 284 278 399" +" 1573 279 354 284 399" +" 1574 216 287 282 399" +" 1575 215 287 216 399" +" 1576 142 353 284 399" +" 1577 284 354 142 399" +" 1578 226 353 142 399" +" 1579 142 388 226 399" +"# Generated by tetgen -a0.01 cube.smesh " +); } diff --git a/BulletPhysics/bulletTrunk/Demos/SoftDemo/main.cpp b/BulletPhysics/bulletTrunk/Demos/SoftDemo/main.cpp new file mode 100644 index 00000000..5dbca5a9 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/SoftDemo/main.cpp @@ -0,0 +1,37 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#include "SoftDemo.h" +#include "GlutStuff.h" +#include "GLDebugDrawer.h" +#include "btBulletDynamicsCommon.h" + +GLDebugDrawer gDebugDrawer; + +int main(int argc,char** argv) +{ + + SoftDemo* softDemo = new SoftDemo(); + + softDemo->initPhysics(); + softDemo->getDynamicsWorld()->setDebugDrawer(&gDebugDrawer); + + + glutmain(argc, argv,640,480,"Bullet Physics Demo. http://bulletphysics.com",softDemo); + + delete softDemo; + return 0; + +} diff --git a/BulletPhysics/bulletTrunk/Demos/TerrainDemo/Jamfile b/BulletPhysics/bulletTrunk/Demos/TerrainDemo/Jamfile new file mode 100644 index 00000000..60e4e40c --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/TerrainDemo/Jamfile @@ -0,0 +1,3 @@ +SubDir TOP Demos TerrainDemo ; + +BulletDemo TerrainDemo : [ Wildcard *.h *.cpp ] ; diff --git a/BulletPhysics/bulletTrunk/Demos/TerrainDemo/Makefile.am b/BulletPhysics/bulletTrunk/Demos/TerrainDemo/Makefile.am new file mode 100644 index 00000000..1c8e68c8 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/TerrainDemo/Makefile.am @@ -0,0 +1,6 @@ + +noinst_PROGRAMS=TerrainDemo + +TerrainDemo_SOURCES=TerrainDemo.cpp TerrainDemo.h main.cpp +TerrainDemo_CXXFLAGS=-I@top_builddir@/src -I@top_builddir@/Demos/OpenGL $(CXXFLAGS) +TerrainDemo_LDADD=-L../OpenGL -lbulletopenglsupport -L../../src -lbulletdynamics -lbulletcollision -lbulletmath @opengl_LIBS@ diff --git a/BulletPhysics/bulletTrunk/Demos/TerrainDemo/TerrainDemo.cpp b/BulletPhysics/bulletTrunk/Demos/TerrainDemo/TerrainDemo.cpp new file mode 100644 index 00000000..6e0844c5 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/TerrainDemo/TerrainDemo.cpp @@ -0,0 +1,928 @@ + +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006,2008 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#include "TerrainDemo.h" // always include our own header first! + +#include "btBulletDynamicsCommon.h" +#include "BulletCollision/CollisionShapes/btHeightfieldTerrainShape.h" + +#include "GLDebugDrawer.h" + +#include "GL_ShapeDrawer.h" + +#include "GlutStuff.h" + +#include "BMF_Api.h" + + + +// constants ------------------------------------------------------------------- +static const float s_gravity = 9.8; // 9.8 m/s^2 + +static const int s_gridSize = 64 + 1; // must be (2^N) + 1 +static const float s_gridSpacing = 5.0; + +static const float s_gridHeightScale = 0.2; + +// the singularity at the center of the radial model means we need a lot of +// finely-spaced time steps to get the physics right. +// These numbers are probably too aggressive for a real game! +static const int s_requestedHz = 180; +static const float s_engineTimeStep = 1.0 / s_requestedHz; + +// delta phase: radians per second +static const float s_deltaPhase = 0.25 * 2.0 * SIMD_PI; + +// what type of terrain is generated? +enum eTerrainModel { + eRadial = 1, // deterministic + eFractal = 2 // random +}; + + +typedef unsigned char byte_t; + + + +//////////////////////////////////////////////////////////////////////////////// +// +// static helper methods +// +// Only used within this file (helpers and terrain generation, etc) +// +//////////////////////////////////////////////////////////////////////////////// + +static const char * +getTerrainTypeName +( +eTerrainModel model +) +{ + switch (model) { + case eRadial: + return "Radial"; + + case eFractal: + return "Fractal"; + + default: + btAssert(!"bad terrain model type"); + } + + return NULL; +} + + + +static const char * +getDataTypeName +( +PHY_ScalarType type +) +{ + switch (type) { + case PHY_UCHAR: + return "UnsignedChar"; + + case PHY_SHORT: + return "Short"; + + case PHY_FLOAT: + return "Float"; + + default: + btAssert(!"bad heightfield data type"); + } + + return NULL; +} + + + +static const char * +getUpAxisName +( +int axis +) +{ + switch (axis) { + case 0: + return "X"; + + case 1: + return "Y"; + + case 2: + return "Z"; + + default: + btAssert(!"bad up axis"); + } + + return NULL; +} + + + +static btVector3 +getUpVector +( +int upAxis, +btScalar regularValue, +btScalar upValue +) +{ + btAssert(upAxis >= 0 && upAxis <= 2 && "bad up axis"); + + btVector3 v(regularValue, regularValue, regularValue); + v[upAxis] = upValue; + + return v; +} + + + +// TODO: it would probably cleaner to have a struct per data type, so +// you could lookup byte sizes, conversion functions, etc. +static int getByteSize +( +PHY_ScalarType type +) +{ + int size = 0; + + switch (type) { + case PHY_FLOAT: + size = sizeof(float); + break; + + case PHY_UCHAR: + size = sizeof(unsigned char); + break; + + case PHY_SHORT: + size = sizeof(short); + break; + + default: + btAssert(!"Bad heightfield data type"); + } + + return size; +} + + + +static float +convertToFloat +( +const byte_t * p, +PHY_ScalarType type +) +{ + btAssert(p); + + switch (type) { + case PHY_FLOAT: + { + float * pf = (float *) p; + return *pf; + } + + case PHY_UCHAR: + { + unsigned char * pu = (unsigned char *) p; + return ((*pu) * s_gridHeightScale); + } + + case PHY_SHORT: + { + short * ps = (short *) p; + return ((*ps) * s_gridHeightScale); + } + + default: + btAssert(!"bad type"); + } + + return 0; +} + + + +static float +getGridHeight +( +byte_t * grid, +int i, +int j, +PHY_ScalarType type +) +{ + btAssert(grid); + btAssert(i >= 0 && i < s_gridSize); + btAssert(j >= 0 && j < s_gridSize); + + int bpe = getByteSize(type); + btAssert(bpe > 0 && "bad bytes per element"); + + int idx = (j * s_gridSize) + i; + long offset = ((long) bpe) * idx; + + byte_t * p = grid + offset; + + return convertToFloat(p, type); +} + + + +static void +convertFromFloat +( +byte_t * p, +float value, +PHY_ScalarType type +) +{ + btAssert(p && "null"); + + switch (type) { + case PHY_FLOAT: + { + float * pf = (float *) p; + *pf = value; + } + break; + + case PHY_UCHAR: + { + unsigned char * pu = (unsigned char *) p; + *pu = (unsigned char) (value / s_gridHeightScale); + } + break; + + case PHY_SHORT: + { + short * ps = (short *) p; + *ps = (short) (value / s_gridHeightScale); + } + break; + + default: + btAssert(!"bad type"); + } +} + + + +// creates a radially-varying heightfield +static void +setRadial +( +byte_t * grid, +int bytesPerElement, +PHY_ScalarType type, +float phase = 0.0 +) +{ + btAssert(grid); + btAssert(bytesPerElement > 0); + + // min/max + float period = 0.5 / s_gridSpacing; + float floor = 0.0; + float min_r = 3.0 * sqrt(s_gridSpacing); + float magnitude = 50.0 * sqrt(s_gridSpacing); + + // pick a base_phase such that phase = 0 results in max height + // (this way, if you create a heightfield with phase = 0, + // you can rely on the min/max heights that result) + float base_phase = (0.5 * SIMD_PI) - (period * min_r); + phase += base_phase; + + // center of grid + float cx = 0.5 * s_gridSize * s_gridSpacing; + float cy = cx; // assume square grid + byte_t * p = grid; + for (int i = 0; i < s_gridSize; ++i) { + float x = i * s_gridSpacing; + for (int j = 0; j < s_gridSize; ++j) { + float y = j * s_gridSpacing; + + float dx = x - cx; + float dy = y - cy; + + float r = sqrt((dx * dx) + (dy * dy)); + + float z = period; + if (r < min_r) { + r = min_r; + } + z = (1.0 / r) * sin(period * r + phase); + if (z > period) { + z = period; + } else if (z < -period) { + z = -period; + } + z = floor + magnitude * z; + + convertFromFloat(p, z, type); + p += bytesPerElement; + } + } +} + + + +static float +randomHeight +( +int step +) +{ + return (0.33 * s_gridSpacing * s_gridSize * step * (rand() - (0.5 * RAND_MAX))) / (1.0 * RAND_MAX * s_gridSize); +} + + + +static void +dumpGrid +( +const byte_t * grid, +int bytesPerElement, +PHY_ScalarType type, +int max +) +{ + //std::cerr << "Grid:\n"; + + char buffer[32]; + + for (int j = 0; j < max; ++j) { + for (int i = 0; i < max; ++i) { + long offset = j * s_gridSize + i; + float z = convertToFloat(grid + offset * bytesPerElement, type); + sprintf(buffer, "%6.2f", z); + //std::cerr << " " << buffer; + } + //std::cerr << "\n"; + } +} + + + +static void +updateHeight +( +byte_t * p, +float new_val, +PHY_ScalarType type +) +{ + float old_val = convertToFloat(p, type); + if (!old_val) { + convertFromFloat(p, new_val, type); + } +} + + + +// creates a random, fractal heightfield +static void +setFractal +( +byte_t * grid, +int bytesPerElement, +PHY_ScalarType type, +int step +) +{ + btAssert(grid); + btAssert(bytesPerElement > 0); + btAssert(step > 0); + btAssert(step < s_gridSize); + + int newStep = step / 2; +// std::cerr << "Computing grid with step = " << step << ": before\n"; +// dumpGrid(grid, bytesPerElement, type, step + 1); + + // special case: starting (must set four corners) + if (s_gridSize - 1 == step) { + // pick a non-zero (possibly negative) base elevation for testing + float base = randomHeight(step / 2); + + convertFromFloat(grid, base, type); + convertFromFloat(grid + step * bytesPerElement, base, type); + convertFromFloat(grid + step * s_gridSize * bytesPerElement, base, type); + convertFromFloat(grid + (step * s_gridSize + step) * bytesPerElement, base, type); + } + + // determine elevation of each corner + float c00 = convertToFloat(grid, type); + float c01 = convertToFloat(grid + step * bytesPerElement, type); + float c10 = convertToFloat(grid + (step * s_gridSize) * bytesPerElement, type); + float c11 = convertToFloat(grid + (step * s_gridSize + step) * bytesPerElement, type); + + // set top middle + updateHeight(grid + newStep * bytesPerElement, 0.5 * (c00 + c01) + randomHeight(step), type); + + // set left middle + updateHeight(grid + (newStep * s_gridSize) * bytesPerElement, 0.5 * (c00 + c10) + randomHeight(step), type); + + // set right middle + updateHeight(grid + (newStep * s_gridSize + step) * bytesPerElement, 0.5 * (c01 + c11) + randomHeight(step), type); + + // set bottom middle + updateHeight(grid + (step * s_gridSize + newStep) * bytesPerElement, 0.5 * (c10 + c11) + randomHeight(step), type); + + // set middle + updateHeight(grid + (newStep * s_gridSize + newStep) * bytesPerElement, 0.25 * (c00 + c01 + c10 + c11) + randomHeight(step), type); + +// std::cerr << "Computing grid with step = " << step << ": after\n"; +// dumpGrid(grid, bytesPerElement, type, step + 1); + + // terminate? + if (newStep < 2) { + return; + } + + // recurse + setFractal(grid, bytesPerElement, type, newStep); + setFractal(grid + newStep * bytesPerElement, bytesPerElement, type, newStep); + setFractal(grid + (newStep * s_gridSize) * bytesPerElement, bytesPerElement, type, newStep); + setFractal(grid + ((newStep * s_gridSize) + newStep) * bytesPerElement, bytesPerElement, type, newStep); +} + + + +static byte_t * +getRawHeightfieldData +( +eTerrainModel model, +PHY_ScalarType type, +btScalar& minHeight, +btScalar& maxHeight +) +{ +// std::cerr << "\nRegenerating terrain\n"; +// std::cerr << " model = " << model << "\n"; +// std::cerr << " type = " << type << "\n"; + + long nElements = ((long) s_gridSize) * s_gridSize; +// std::cerr << " nElements = " << nElements << "\n"; + + int bytesPerElement = getByteSize(type); +// std::cerr << " bytesPerElement = " << bytesPerElement << "\n"; + btAssert(bytesPerElement > 0 && "bad bytes per element"); + + long nBytes = nElements * bytesPerElement; +// std::cerr << " nBytes = " << nBytes << "\n"; + byte_t * raw = new byte_t[nBytes]; + btAssert(raw && "out of memory"); + + // reseed randomization every 30 seconds +// srand(time(NULL) / 30); + + // populate based on model + switch (model) { + case eRadial: + setRadial(raw, bytesPerElement, type); + break; + + case eFractal: + for (int i = 0; i < nBytes; i++) + { + raw[i] = 0; + } + setFractal(raw, bytesPerElement, type, s_gridSize - 1); + break; + + default: + btAssert(!"bad model type"); + } + + if (0) { + // inside if(0) so it keeps compiling but isn't + // exercised and doesn't cause warnings +// std::cerr << "final grid:\n"; + dumpGrid(raw, bytesPerElement, type, s_gridSize - 1); + } + + // find min/max + for (int i = 0; i < s_gridSize; ++i) { + for (int j = 0; j < s_gridSize; ++j) { + float z = getGridHeight(raw, i, j, type); +// std::cerr << "i=" << i << ", j=" << j << ": z=" << z << "\n"; + + // update min/max + if (!i && !j) { + minHeight = z; + maxHeight = z; + } else { + if (z < minHeight) { + minHeight = z; + } + if (z > maxHeight) { + maxHeight = z; + } + } + } + } + + if (maxHeight < -minHeight) { + maxHeight = -minHeight; + } + if (minHeight > -maxHeight) { + minHeight = -maxHeight; + } + +// std::cerr << " minHeight = " << minHeight << "\n"; +// std::cerr << " maxHeight = " << maxHeight << "\n"; + + return raw; +} + + + +//////////////////////////////////////////////////////////////////////////////// +// +// TerrainDemo class +// +//////////////////////////////////////////////////////////////////////////////// + +/// class that demonstrates the btHeightfieldTerrainShape object +class TerrainDemo : public DemoApplication { +public: + // constructor, destructor --------------------------------------------- + TerrainDemo(void); + ~TerrainDemo(void); + + // public class methods ------------------------------------------------ + void initialize(void); + + // DemoApplication class interface methods ----------------------------- + void clientMoveAndDisplay(void); + void keyboardCallback(unsigned char key, int x, int y); + void renderme(void); + +private: + // private helper methods ---------------------------------------------- + void resetPhysics(void); + void clearWorld(void); + + // private data members ------------------------------------------------ + btDefaultCollisionConfiguration * m_collisionConfiguration; + btCollisionDispatcher * m_dispatcher; + btAxisSweep3 * m_overlappingPairCache; + btSequentialImpulseConstraintSolver * m_constraintSolver; + btAlignedObjectArray m_collisionShapes; + int m_upAxis; + PHY_ScalarType m_type; + eTerrainModel m_model; + byte_t * m_rawHeightfieldData; + btScalar m_minHeight; + btScalar m_maxHeight; + float m_phase; // for dynamics + bool m_isDynamic; +}; + + + +TerrainDemo::TerrainDemo(void) +: +m_collisionConfiguration(NULL), +m_dispatcher(NULL), +m_overlappingPairCache(NULL), +m_constraintSolver(NULL), +m_upAxis(1), +m_type(PHY_FLOAT), +m_model(eFractal), +m_rawHeightfieldData(NULL), +m_phase(0.0), +m_isDynamic(true) +{ +} + + + +TerrainDemo::~TerrainDemo(void) +{ + clearWorld(); + + //delete dynamics world + delete m_dynamicsWorld; + + //delete solver + delete m_constraintSolver; + + //delete broadphase + delete m_overlappingPairCache; + + //delete dispatcher + delete m_dispatcher; + + delete m_collisionConfiguration; + +} + + + +//////////////////////////////////////////////////////////////////////////////// +// +// TerrainDemo -- public class methods +// +//////////////////////////////////////////////////////////////////////////////// + +/// one-time class and physics initialization +void TerrainDemo::initialize(void) +{ +// std::cerr << "initializing...\n"; + + // set up basic state + m_upAxis = 1; // start with Y-axis as "up" + m_type = PHY_FLOAT; + m_model = eRadial;//eFractal; + m_isDynamic = true; + + // set up the physics world + m_collisionConfiguration = new btDefaultCollisionConfiguration(); + m_dispatcher = new btCollisionDispatcher(m_collisionConfiguration); + btVector3 worldMin(-1000,-1000,-1000); + btVector3 worldMax(1000,1000,1000); + m_overlappingPairCache = new btAxisSweep3(worldMin,worldMax); + m_constraintSolver = new btSequentialImpulseConstraintSolver(); + m_dynamicsWorld = new btDiscreteDynamicsWorld(m_dispatcher,m_overlappingPairCache,m_constraintSolver,m_collisionConfiguration); + + // initialize axis- or type-dependent physics from here + this->resetPhysics(); +} + + + +//////////////////////////////////////////////////////////////////////////////// +// +// TerrainDemo -- DemoApplication class interface methods +// +//////////////////////////////////////////////////////////////////////////////// + +void TerrainDemo::clientMoveAndDisplay(void) +{ + // elapsed time + float us = getDeltaTimeMicroseconds(); + float seconds = 1.0e-6 * us; + + // we'll carefully iterate through each time step so we can update + // the dynamic model if necessary + long nStepsPerIteration = 1; + while (seconds > 1.0e-6) { + float dt = nStepsPerIteration * s_engineTimeStep; + if (dt > seconds) { + dt = seconds; + } + seconds -= dt; + // std::cerr << " Stepping through " << dt << " seconds\n"; + + // if dynamic and radial, go ahead and update the field + if (m_rawHeightfieldData && m_isDynamic && eRadial == m_model) { + m_phase += s_deltaPhase * dt; + if (m_phase > 2.0 * SIMD_PI) { + m_phase -= 2.0 * SIMD_PI; + } + int bpe = getByteSize(m_type); + btAssert(bpe > 0 && "Bad bytes per element"); + setRadial(m_rawHeightfieldData, bpe, m_type, m_phase); + } + + if (m_dynamicsWorld) { + m_dynamicsWorld->stepSimulation(dt, + nStepsPerIteration + 1, s_engineTimeStep); + } + } + + // okay, render + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + renderme(); + glFlush(); + glutSwapBuffers(); +} + + +static PHY_ScalarType nextType (PHY_ScalarType type) +{ + switch (type) + { + case PHY_FLOAT: + return PHY_SHORT; + break; + case PHY_SHORT: + return PHY_UCHAR; + break; + case PHY_UCHAR: + return PHY_FLOAT; + break; + } + btAssert (0); + return PHY_FLOAT; +} + +void TerrainDemo::keyboardCallback(unsigned char key, int x, int y) { + + if (',' == key) { + // increment model + m_model = (eFractal == m_model) ? eRadial : eFractal; + this->resetPhysics(); + } + if ('/' == key) { + // increment type + m_type = nextType(m_type); + this->resetPhysics(); + } + if ('\\' == key) { + // increment axis + m_upAxis++; + if (m_upAxis > 2) { + m_upAxis = 0; + } + this->resetPhysics(); + } + if ('[' == key) { + // toggle dynamics + m_isDynamic = !m_isDynamic; + } + + // let demo base class handle! + DemoApplication::keyboardCallback(key, x, y); +} + + + +static void +doPrint +( +int x, +int& y, +int dy, +const char * text +) +{ + glRasterPos3f(x, y, 0); + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10), text); + y += dy; +} + + + +/// override the default display just so we can overlay a bit more text +void TerrainDemo::renderme(void) +{ + // give base class a shot + DemoApplication::renderme(); + + // overlay any debug information + if (m_dynamicsWorld) + m_dynamicsWorld->debugDrawWorld(); + + // switch to orthographic + setOrthographicProjection(); + + // we'll draw on the right top of the screen + const int lineWidth = 200; + const int lineHeight = 16; + char buffer[256]; + + int xStart = m_glutScreenWidth - lineWidth; + int yStart = lineHeight; + + sprintf(buffer, "Terrain Type: %s", getTerrainTypeName(m_model)); + doPrint(xStart, yStart, lineHeight, buffer); + doPrint(xStart, yStart, lineHeight, "Press ',' to cycle terrain types"); + doPrint(xStart, yStart, lineHeight, ""); + + sprintf(buffer, "Data Type: %s", getDataTypeName(m_type)); + doPrint(xStart, yStart, lineHeight, buffer); + doPrint(xStart, yStart, lineHeight, "Press '/' to cycle data types"); + doPrint(xStart, yStart, lineHeight, ""); + + sprintf(buffer, "'up' axis: %s", getUpAxisName(m_upAxis)); + doPrint(xStart, yStart, lineHeight, buffer); + doPrint(xStart, yStart, lineHeight, "Press '\\' to cycle 'up' axes"); + doPrint(xStart, yStart, lineHeight, ""); + + if (eRadial == m_model) { + sprintf(buffer, "Dynamic: %s", m_isDynamic ? "yes" : "no"); + doPrint(xStart, yStart, lineHeight, buffer); + doPrint(xStart, yStart, lineHeight, "Press '[' to toggle dynamics"); + } +} + + + +//////////////////////////////////////////////////////////////////////////////// +// +// TerrainDemo -- private helper methods +// +//////////////////////////////////////////////////////////////////////////////// + +/// called whenever key terrain attribute is changed +void TerrainDemo::resetPhysics(void) +{ + // remove old heightfield + clearWorld(); + + // reset gravity to point in appropriate direction + m_dynamicsWorld->setGravity(getUpVector(m_upAxis, 0.0, -s_gravity)); + + // get new heightfield of appropriate type + m_rawHeightfieldData = + getRawHeightfieldData(m_model, m_type, m_minHeight, m_maxHeight); + btAssert(m_rawHeightfieldData && "failed to create raw heightfield"); + + bool flipQuadEdges = false; + btHeightfieldTerrainShape * heightfieldShape = + new btHeightfieldTerrainShape(s_gridSize, s_gridSize, + m_rawHeightfieldData, + s_gridHeightScale, + m_minHeight, m_maxHeight, + m_upAxis, m_type, flipQuadEdges); + btAssert(heightfieldShape && "null heightfield"); + + // scale the shape + btVector3 localScaling = getUpVector(m_upAxis, s_gridSpacing, 1.0); + heightfieldShape->setLocalScaling(localScaling); + + // stash this shape away + m_collisionShapes.push_back(heightfieldShape); + + // set origin to middle of heightfield + btTransform tr; + tr.setIdentity(); + tr.setOrigin(btVector3(0,-20,0)); + + // create ground object + float mass = 0.0; + localCreateRigidBody(mass, tr, heightfieldShape); +} + + +/// removes all objects and shapes from the world +void TerrainDemo::clearWorld(void) +{ + //remove the rigidbodies from the dynamics world and delete them + int i; + for (i=m_dynamicsWorld->getNumCollisionObjects()-1; i>=0 ;i--) + { + btCollisionObject* obj = m_dynamicsWorld->getCollisionObjectArray()[i]; + btRigidBody* body = btRigidBody::upcast(obj); + if (body && body->getMotionState()) + { + delete body->getMotionState(); + } + m_dynamicsWorld->removeCollisionObject( obj ); + delete obj; + } + + //delete collision shapes + for (int j=0;jinitialize(); + + return demo; +} + diff --git a/BulletPhysics/bulletTrunk/Demos/TerrainDemo/TerrainDemo.h b/BulletPhysics/bulletTrunk/Demos/TerrainDemo/TerrainDemo.h new file mode 100644 index 00000000..486e79ab --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/TerrainDemo/TerrainDemo.h @@ -0,0 +1,27 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006,2008 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ +#ifndef TERRAIN_DEMO_H +#define TERRAIN_DEMO_H + + +#include "DemoApplication.h" + + +// all we need to expose publicly is the factory method! +DemoApplication * btCreateTerrainDemo(void); + + +#endif //TERRAIN_DEMO_H + diff --git a/BulletPhysics/bulletTrunk/Demos/TerrainDemo/main.cpp b/BulletPhysics/bulletTrunk/Demos/TerrainDemo/main.cpp new file mode 100644 index 00000000..6510f24f --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/TerrainDemo/main.cpp @@ -0,0 +1,14 @@ + +#include "TerrainDemo.h" +#include "GlutStuff.h" + +int main(int argc,char** argv) +{ + DemoApplication * demo = btCreateTerrainDemo(); + btAssert(demo && "failed to create terrain demo object"); + + return glutmain(argc, argv, 800, 600, + "Terrain Demo. http://www.continuousphysics.com/Bullet/phpBB2/", + demo); +} + diff --git a/BulletPhysics/bulletTrunk/Demos/UserCollisionAlgorithm/CMakeLists.txt b/BulletPhysics/bulletTrunk/Demos/UserCollisionAlgorithm/CMakeLists.txt new file mode 100644 index 00000000..19a7ef03 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/UserCollisionAlgorithm/CMakeLists.txt @@ -0,0 +1,25 @@ +# This is basically the overall name of the project in Visual Studio this is the name of the Solution File + + +# For every executable you have with a main method you should have an add_executable line below. +# For every add executable line you should list every .cpp and .h file you have associated with that executable. + + + +# You shouldn't have to modify anything below this line +######################################################## + + + +INCLUDE_DIRECTORIES( +${BULLET_PHYSICS_SOURCE_DIR}/src ${BULLET_PHYSICS_SOURCE_DIR}/Demos/OpenGL } +) + +LINK_LIBRARIES( + OpenGLSupport BulletDynamics BulletCollision LinearMath ${GLUT_glut_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} +) + +ADD_EXECUTABLE(AppUserCollisionAlgorithm + UserCollisionAlgorithm.cpp +) + diff --git a/BulletPhysics/bulletTrunk/Demos/UserCollisionAlgorithm/Jamfile b/BulletPhysics/bulletTrunk/Demos/UserCollisionAlgorithm/Jamfile new file mode 100644 index 00000000..65b4fce5 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/UserCollisionAlgorithm/Jamfile @@ -0,0 +1,3 @@ +SubDir TOP Demos UserCollisionAlgorithm ; + +BulletDemo UserCollisionAlgorithm : [ Wildcard *.h *.cpp ] ; diff --git a/BulletPhysics/bulletTrunk/Demos/UserCollisionAlgorithm/UserCollisionAlgorithm.cpp b/BulletPhysics/bulletTrunk/Demos/UserCollisionAlgorithm/UserCollisionAlgorithm.cpp new file mode 100644 index 00000000..5d094f2e --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/UserCollisionAlgorithm/UserCollisionAlgorithm.cpp @@ -0,0 +1,175 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#include "btBulletDynamicsCommon.h" +#include "LinearMath/btIDebugDraw.h" +#include "GLDebugDrawer.h" +#include "UserCollisionAlgorithm.h" +#include "GL_ShapeDrawer.h" +#include "GlutStuff.h" + +//The user defined collision algorithm +#include "BulletCollision/CollisionDispatch/btSphereSphereCollisionAlgorithm.h" + +GLDebugDrawer debugDrawer; + +static const int NUM_VERTICES = 5; +static const int NUM_TRIANGLES=4; + +btVector3 gVertices[NUM_VERTICES]; +int gIndices[NUM_TRIANGLES*3]; +const float TRIANGLE_SIZE=10.f; + + +///User can override this material combiner by implementing gContactAddedCallback and setting body0->m_collisionFlags |= btCollisionObject::customMaterialCallback; +inline btScalar calculateCombinedFriction(float friction0,float friction1) +{ + btScalar friction = friction0 * friction1; + + const btScalar MAX_FRICTION = 10.f; + if (friction < -MAX_FRICTION) + friction = -MAX_FRICTION; + if (friction > MAX_FRICTION) + friction = MAX_FRICTION; + return friction; + +} + +inline btScalar calculateCombinedRestitution(float restitution0,float restitution1) +{ + return restitution0 * restitution1; +} + + + + + + +int main(int argc,char** argv) +{ + + UserCollisionAlgorithm* userCollisionAlgorithm = new UserCollisionAlgorithm; + userCollisionAlgorithm->initPhysics(); + userCollisionAlgorithm->setCameraDistance(30.f); + + return glutmain(argc, argv,640,480,"Static Concave Mesh Demo",userCollisionAlgorithm); +} + +void UserCollisionAlgorithm::initPhysics() +{ + #define TRISIZE 5.f + + + const int NUM_VERTS_X = 50; + const int NUM_VERTS_Y = 50; + const int totalVerts = NUM_VERTS_X*NUM_VERTS_Y; + + btVector3* gVertices = new btVector3[totalVerts]; + + int i; + for ( i=0;iaddTriangle(gVertices[j*NUM_VERTS_X+i],gVertices[j*NUM_VERTS_X+i+1],gVertices[(j+1)*NUM_VERTS_X+i+1]); + trimesh->addTriangle(gVertices[j*NUM_VERTS_X+i],gVertices[(j+1)*NUM_VERTS_X+i+1],gVertices[(j+1)*NUM_VERTS_X+i]); + } + } + + delete[] gVertices; + + bool useQuantizedBvhTree = true; + btCollisionShape* trimeshShape = new btBvhTriangleMeshShape(trimesh,useQuantizedBvhTree); + + //ConstraintSolver* solver = new btSequentialImpulseConstraintSolver; + btDefaultCollisionConfiguration* collisionConfiguration = new btDefaultCollisionConfiguration(); + btCollisionDispatcher* dispatcher = new btCollisionDispatcher(collisionConfiguration); + + btVector3 maxAabb(10000,10000,10000); + btBroadphaseInterface* broadphase = new btAxisSweep3(-maxAabb,maxAabb);//SimpleBroadphase(); + dispatcher->registerCollisionCreateFunc(GIMPACT_SHAPE_PROXYTYPE,GIMPACT_SHAPE_PROXYTYPE,new btSphereSphereCollisionAlgorithm::CreateFunc); + + btConstraintSolver* constraintSolver = new btSequentialImpulseConstraintSolver(); + m_dynamicsWorld = new btDiscreteDynamicsWorld(dispatcher,broadphase,constraintSolver,collisionConfiguration); + + float mass = 0.f; + btTransform startTransform; + startTransform.setIdentity(); + startTransform.setOrigin(btVector3(0,-2,0)); + + btRigidBody* staticBody= localCreateRigidBody(mass, startTransform,trimeshShape); + //enable custom material callback + staticBody->setCollisionFlags(staticBody->getCollisionFlags() | btCollisionObject::CF_CUSTOM_MATERIAL_CALLBACK); + + { + for (int i=0;i<10;i++) + { + btCollisionShape* sphereShape = new btSphereShape(1); + startTransform.setOrigin(btVector3(1,2*i,1)); + //btRigidBody* body = localCreateRigidBody(1, startTransform,sphereShape); + localCreateRigidBody(1, startTransform,sphereShape); + } + } + + + + m_dynamicsWorld->setDebugDrawer(&debugDrawer); +} + +void UserCollisionAlgorithm::clientMoveAndDisplay() +{ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + float dt = getDeltaTimeMicroseconds() * 0.000001f; + + + m_dynamicsWorld->stepSimulation(dt); + + //optional but useful: debug drawing + m_dynamicsWorld->debugDrawWorld(); + + renderme(); + + glFlush(); + glutSwapBuffers(); + +} + + + + + + +void UserCollisionAlgorithm::displayCallback(void) { + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + renderme(); + + glFlush(); + glutSwapBuffers(); +} + + diff --git a/BulletPhysics/bulletTrunk/Demos/UserCollisionAlgorithm/UserCollisionAlgorithm.h b/BulletPhysics/bulletTrunk/Demos/UserCollisionAlgorithm/UserCollisionAlgorithm.h new file mode 100644 index 00000000..9b3a8908 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/UserCollisionAlgorithm/UserCollisionAlgorithm.h @@ -0,0 +1,36 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ +#ifndef USER_COLLISION_ALGORITHM_DEMO_H +#define USER_COLLISION_ALGORITHM_DEMO_H + +#include "DemoApplication.h" + +///UserCollisionAlgorithmDemo shows how to register and use your own collision algorithm for a certain shape pair type +class UserCollisionAlgorithm : public DemoApplication +{ + public: + + void initPhysics(); + + virtual void clientMoveAndDisplay(); + + virtual void displayCallback(); + + + +}; + +#endif //USER_COLLISION_ALGORITHM_DEMO_H + diff --git a/BulletPhysics/bulletTrunk/Demos/VehicleDemo/CMakeLists.txt b/BulletPhysics/bulletTrunk/Demos/VehicleDemo/CMakeLists.txt new file mode 100644 index 00000000..31303126 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/VehicleDemo/CMakeLists.txt @@ -0,0 +1,26 @@ +# This is basically the overall name of the project in Visual Studio this is the name of the Solution File + + +# For every executable you have with a main method you should have an add_executable line below. +# For every add executable line you should list every .cpp and .h file you have associated with that executable. + + + +# You shouldn't have to modify anything below this line +######################################################## + + + +INCLUDE_DIRECTORIES( +${BULLET_PHYSICS_SOURCE_DIR}/src ${BULLET_PHYSICS_SOURCE_DIR}/Demos/OpenGL } +) + +LINK_LIBRARIES( + OpenGLSupport BulletDynamics BulletCollision LinearMath ${GLUT_glut_LIBRARY} ${OPENGL_gl_LIBRARY} ${OPENGL_glu_LIBRARY} +) + +ADD_EXECUTABLE(AppVehicleDemo + VehicleDemo.cpp + main.cpp +) + diff --git a/BulletPhysics/bulletTrunk/Demos/VehicleDemo/Jamfile b/BulletPhysics/bulletTrunk/Demos/VehicleDemo/Jamfile new file mode 100644 index 00000000..ad48d0ee --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/VehicleDemo/Jamfile @@ -0,0 +1,3 @@ +SubDir TOP Demos VehicleDemo ; + +BulletDemo VehicleDemo : [ Wildcard *.h *.cpp ] ; diff --git a/BulletPhysics/bulletTrunk/Demos/VehicleDemo/Makefile.am b/BulletPhysics/bulletTrunk/Demos/VehicleDemo/Makefile.am new file mode 100644 index 00000000..7dbab8b1 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/VehicleDemo/Makefile.am @@ -0,0 +1,5 @@ +noinst_PROGRAMS=VehicleDemo + +VehicleDemo_SOURCES=VehicleDemo.cpp VehicleDemo.h main.cpp +VehicleDemo_CXXFLAGS=-I@top_builddir@/src -I@top_builddir@/Demos/OpenGL $(CXXFLAGS) +VehicleDemo_LDADD=-L../OpenGL -lbulletopenglsupport -L../../src -lbulletdynamics -lbulletcollision -lbulletmath @opengl_LIBS@ diff --git a/BulletPhysics/bulletTrunk/Demos/VehicleDemo/VehicleDemo.cpp b/BulletPhysics/bulletTrunk/Demos/VehicleDemo/VehicleDemo.cpp new file mode 100644 index 00000000..064f2d42 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/VehicleDemo/VehicleDemo.cpp @@ -0,0 +1,667 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +/// September 2006: VehicleDemo is work in progress, this file is mostly just a placeholder +/// This VehicleDemo file is very early in development, please check it later +/// One todo is a basic engine model: +/// A function that maps user input (throttle) into torque/force applied on the wheels +/// with gears etc. +#include "btBulletDynamicsCommon.h" +#include "BulletCollision/CollisionShapes/btHeightfieldTerrainShape.h" + +// +// By default, Bullet Vehicle uses Y as up axis. +// You can override the up axis, for example Z-axis up. Enable this define to see how to: +//#define FORCE_ZAXIS_UP 1 +// + +#ifdef FORCE_ZAXIS_UP + int rightIndex = 0; + int upIndex = 2; + int forwardIndex = 1; + btVector3 wheelDirectionCS0(0,0,-1); + btVector3 wheelAxleCS(1,0,0); +#else + int rightIndex = 0; + int upIndex = 1; + int forwardIndex = 2; + btVector3 wheelDirectionCS0(0,-1,0); + btVector3 wheelAxleCS(-1,0,0); +#endif + +#include "GLDebugDrawer.h" +#include //printf debugging + +#include "GL_ShapeDrawer.h" + +#include "GlutStuff.h" +#include "VehicleDemo.h" + +const int maxProxies = 32766; +const int maxOverlap = 65535; + +///btRaycastVehicle is the interface for the constraint that implements the raycast vehicle +///notice that for higher-quality slow-moving vehicles, another approach might be better +///implementing explicit hinged-wheel constraints with cylinder collision, rather then raycasts +float gEngineForce = 0.f; +float gBreakingForce = 0.f; + +float maxEngineForce = 1000.f;//this should be engine/velocity dependent +float maxBreakingForce = 100.f; + +float gVehicleSteering = 0.f; +float steeringIncrement = 0.04f; +float steeringClamp = 0.3f; +float wheelRadius = 0.5f; +float wheelWidth = 0.4f; +float wheelFriction = 1000;//1e30f; +float suspensionStiffness = 20.f; +float suspensionDamping = 2.3f; +float suspensionCompression = 4.4f; +float rollInfluence = 0.1f;//1.0f; + + +btScalar suspensionRestLength(0.6); + +#define CUBE_HALF_EXTENTS 1 + + + +//////////////////////////////////// + + + + +VehicleDemo::VehicleDemo() +: +m_carChassis(0), +m_cameraHeight(4.f), +m_minCameraDistance(3.f), +m_maxCameraDistance(10.f), +m_indexVertexArrays(0), +m_vertices(0) +{ + m_vehicle = 0; + m_cameraPosition = btVector3(30,30,30); +} + +VehicleDemo::~VehicleDemo() +{ + //cleanup in the reverse order of creation/initialization + + //remove the rigidbodies from the dynamics world and delete them + int i; + for (i=m_dynamicsWorld->getNumCollisionObjects()-1; i>=0 ;i--) + { + btCollisionObject* obj = m_dynamicsWorld->getCollisionObjectArray()[i]; + btRigidBody* body = btRigidBody::upcast(obj); + if (body && body->getMotionState()) + { + delete body->getMotionState(); + } + m_dynamicsWorld->removeCollisionObject( obj ); + delete obj; + } + + //delete collision shapes + for (int j=0;jsetGravity(btVector3(0,0,-10)); +#endif + + //m_dynamicsWorld->setGravity(btVector3(0,0,0)); +btTransform tr; +tr.setIdentity(); + +//either use heightfield or triangle mesh +#define USE_TRIMESH_GROUND 1 +#ifdef USE_TRIMESH_GROUND + int i; + +const float TRIANGLE_SIZE=20.f; + + //create a triangle-mesh ground + int vertStride = sizeof(btVector3); + int indexStride = 3*sizeof(int); + + const int NUM_VERTS_X = 20; + const int NUM_VERTS_Y = 20; + const int totalVerts = NUM_VERTS_X*NUM_VERTS_Y; + + const int totalTriangles = 2*(NUM_VERTS_X-1)*(NUM_VERTS_Y-1); + + m_vertices = new btVector3[totalVerts]; + int* gIndices = new int[totalTriangles*3]; + + + + for ( i=0;isetUseDiamondSubdivision(true); + + btVector3 localScaling(20,20,20); + localScaling[upIndex]=1.f; + groundShape->setLocalScaling(localScaling); + + tr.setOrigin(btVector3(0,-64.5f,0)); + +#endif // + + m_collisionShapes.push_back(groundShape); + + //create ground object + localCreateRigidBody(0,tr,groundShape); + +#ifdef FORCE_ZAXIS_UP +// indexRightAxis = 0; +// indexUpAxis = 2; +// indexForwardAxis = 1; + btCollisionShape* chassisShape = new btBoxShape(btVector3(1.f,2.f, 0.5f)); + btCompoundShape* compound = new btCompoundShape(); + btTransform localTrans; + localTrans.setIdentity(); + //localTrans effectively shifts the center of mass with respect to the chassis + localTrans.setOrigin(btVector3(0,0,1)); +#else + btCollisionShape* chassisShape = new btBoxShape(btVector3(1.f,0.5f,2.f)); + m_collisionShapes.push_back(chassisShape); + + btCompoundShape* compound = new btCompoundShape(); + m_collisionShapes.push_back(compound); + btTransform localTrans; + localTrans.setIdentity(); + //localTrans effectively shifts the center of mass with respect to the chassis + localTrans.setOrigin(btVector3(0,1,0)); +#endif + + compound->addChildShape(localTrans,chassisShape); + + tr.setOrigin(btVector3(0,0.f,0)); + + m_carChassis = localCreateRigidBody(800,tr,compound);//chassisShape); + //m_carChassis->setDamping(0.2,0.2); + + + clientResetScene(); + + /// create vehicle + { + + m_vehicleRayCaster = new btDefaultVehicleRaycaster(m_dynamicsWorld); + m_vehicle = new btRaycastVehicle(m_tuning,m_carChassis,m_vehicleRayCaster); + + ///never deactivate the vehicle + m_carChassis->setActivationState(DISABLE_DEACTIVATION); + + m_dynamicsWorld->addVehicle(m_vehicle); + + float connectionHeight = 1.2f; + + + bool isFrontWheel=true; + + //choose coordinate system + m_vehicle->setCoordinateSystem(rightIndex,upIndex,forwardIndex); + +#ifdef FORCE_ZAXIS_UP + btVector3 connectionPointCS0(CUBE_HALF_EXTENTS-(0.3*wheelWidth),2*CUBE_HALF_EXTENTS-wheelRadius, connectionHeight); +#else + btVector3 connectionPointCS0(CUBE_HALF_EXTENTS-(0.3*wheelWidth),connectionHeight,2*CUBE_HALF_EXTENTS-wheelRadius); +#endif + + m_vehicle->addWheel(connectionPointCS0,wheelDirectionCS0,wheelAxleCS,suspensionRestLength,wheelRadius,m_tuning,isFrontWheel); +#ifdef FORCE_ZAXIS_UP + connectionPointCS0 = btVector3(-CUBE_HALF_EXTENTS+(0.3*wheelWidth),2*CUBE_HALF_EXTENTS-wheelRadius, connectionHeight); +#else + connectionPointCS0 = btVector3(-CUBE_HALF_EXTENTS+(0.3*wheelWidth),connectionHeight,2*CUBE_HALF_EXTENTS-wheelRadius); +#endif + + m_vehicle->addWheel(connectionPointCS0,wheelDirectionCS0,wheelAxleCS,suspensionRestLength,wheelRadius,m_tuning,isFrontWheel); +#ifdef FORCE_ZAXIS_UP + connectionPointCS0 = btVector3(-CUBE_HALF_EXTENTS+(0.3*wheelWidth),-2*CUBE_HALF_EXTENTS+wheelRadius, connectionHeight); +#else + connectionPointCS0 = btVector3(-CUBE_HALF_EXTENTS+(0.3*wheelWidth),connectionHeight,-2*CUBE_HALF_EXTENTS+wheelRadius); +#endif //FORCE_ZAXIS_UP + isFrontWheel = false; + m_vehicle->addWheel(connectionPointCS0,wheelDirectionCS0,wheelAxleCS,suspensionRestLength,wheelRadius,m_tuning,isFrontWheel); +#ifdef FORCE_ZAXIS_UP + connectionPointCS0 = btVector3(CUBE_HALF_EXTENTS-(0.3*wheelWidth),-2*CUBE_HALF_EXTENTS+wheelRadius, connectionHeight); +#else + connectionPointCS0 = btVector3(CUBE_HALF_EXTENTS-(0.3*wheelWidth),connectionHeight,-2*CUBE_HALF_EXTENTS+wheelRadius); +#endif + m_vehicle->addWheel(connectionPointCS0,wheelDirectionCS0,wheelAxleCS,suspensionRestLength,wheelRadius,m_tuning,isFrontWheel); + + for (int i=0;igetNumWheels();i++) + { + btWheelInfo& wheel = m_vehicle->getWheelInfo(i); + wheel.m_suspensionStiffness = suspensionStiffness; + wheel.m_wheelsDampingRelaxation = suspensionDamping; + wheel.m_wheelsDampingCompression = suspensionCompression; + wheel.m_frictionSlip = wheelFriction; + wheel.m_rollInfluence = rollInfluence; + } + } + + + setCameraDistance(26.f); + +} + + +//to be implemented by the demo +void VehicleDemo::renderme() +{ + + updateCamera(); + + btScalar m[16]; + int i; + + btCylinderShapeX wheelShape(btVector3(wheelWidth,wheelRadius,wheelRadius)); + btVector3 wheelColor(1,0,0); + + btVector3 worldBoundsMin,worldBoundsMax; + getDynamicsWorld()->getBroadphase()->getBroadphaseAabb(worldBoundsMin,worldBoundsMax); + + + + for (i=0;igetNumWheels();i++) + { + //synchronize the wheels with the (interpolated) chassis worldtransform + m_vehicle->updateWheelTransform(i,true); + //draw wheels (cylinders) + m_vehicle->getWheelInfo(i).m_worldTransform.getOpenGLMatrix(m); + m_shapeDrawer->drawOpenGL(m,&wheelShape,wheelColor,getDebugMode(),worldBoundsMin,worldBoundsMax); + } + + + DemoApplication::renderme(); + +} + +void VehicleDemo::clientMoveAndDisplay() +{ + + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + + { + int wheelIndex = 2; + m_vehicle->applyEngineForce(gEngineForce,wheelIndex); + m_vehicle->setBrake(gBreakingForce,wheelIndex); + wheelIndex = 3; + m_vehicle->applyEngineForce(gEngineForce,wheelIndex); + m_vehicle->setBrake(gBreakingForce,wheelIndex); + + + wheelIndex = 0; + m_vehicle->setSteeringValue(gVehicleSteering,wheelIndex); + wheelIndex = 1; + m_vehicle->setSteeringValue(gVehicleSteering,wheelIndex); + + } + + + float dt = getDeltaTimeMicroseconds() * 0.000001f; + + if (m_dynamicsWorld) + { + //during idle mode, just run 1 simulation step maximum + int maxSimSubSteps = m_idle ? 1 : 2; + if (m_idle) + dt = 1.0/420.f; + + int numSimSteps = m_dynamicsWorld->stepSimulation(dt,maxSimSubSteps); + + +//#define VERBOSE_FEEDBACK +#ifdef VERBOSE_FEEDBACK + if (!numSimSteps) + printf("Interpolated transforms\n"); + else + { + if (numSimSteps > maxSimSubSteps) + { + //detect dropping frames + printf("Dropped (%i) simulation steps out of %i\n",numSimSteps - maxSimSubSteps,numSimSteps); + } else + { + printf("Simulated (%i) steps\n",numSimSteps); + } + } +#endif //VERBOSE_FEEDBACK + + } + + + + + + + +#ifdef USE_QUICKPROF + btProfiler::beginBlock("render"); +#endif //USE_QUICKPROF + + + renderme(); + + //optional but useful: debug drawing + if (m_dynamicsWorld) + m_dynamicsWorld->debugDrawWorld(); + +#ifdef USE_QUICKPROF + btProfiler::endBlock("render"); +#endif + + + glFlush(); + glutSwapBuffers(); + +} + + + +void VehicleDemo::displayCallback(void) +{ + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + renderme(); + +//optional but useful: debug drawing + if (m_dynamicsWorld) + m_dynamicsWorld->debugDrawWorld(); + + glFlush(); + glutSwapBuffers(); +} + + + +void VehicleDemo::clientResetScene() +{ + gVehicleSteering = 0.f; + m_carChassis->setCenterOfMassTransform(btTransform::getIdentity()); + m_carChassis->setLinearVelocity(btVector3(0,0,0)); + m_carChassis->setAngularVelocity(btVector3(0,0,0)); + m_dynamicsWorld->getBroadphase()->getOverlappingPairCache()->cleanProxyFromPairs(m_carChassis->getBroadphaseHandle(),getDynamicsWorld()->getDispatcher()); + if (m_vehicle) + { + m_vehicle->resetSuspension(); + for (int i=0;igetNumWheels();i++) + { + //synchronize the wheels with the (interpolated) chassis worldtransform + m_vehicle->updateWheelTransform(i,true); + } + } + +} + + + +void VehicleDemo::specialKeyboardUp(int key, int x, int y) +{ + switch (key) + { + case GLUT_KEY_UP : + { + gEngineForce = 0.f; + break; + } + case GLUT_KEY_DOWN : + { + gBreakingForce = 0.f; + break; + } + default: + DemoApplication::specialKeyboardUp(key,x,y); + break; + } + +} + + +void VehicleDemo::specialKeyboard(int key, int x, int y) +{ + +// printf("key = %i x=%i y=%i\n",key,x,y); + + switch (key) + { + case GLUT_KEY_LEFT : + { + gVehicleSteering += steeringIncrement; + if ( gVehicleSteering > steeringClamp) + gVehicleSteering = steeringClamp; + + break; + } + case GLUT_KEY_RIGHT : + { + gVehicleSteering -= steeringIncrement; + if ( gVehicleSteering < -steeringClamp) + gVehicleSteering = -steeringClamp; + + break; + } + case GLUT_KEY_UP : + { + gEngineForce = maxEngineForce; + gBreakingForce = 0.f; + break; + } + case GLUT_KEY_DOWN : + { + gBreakingForce = maxBreakingForce; + gEngineForce = 0.f; + break; + } + default: + DemoApplication::specialKeyboard(key,x,y); + break; + } + +// glutPostRedisplay(); + + +} + + + +void VehicleDemo::updateCamera() +{ + +//#define DISABLE_CAMERA 1 +#ifdef DISABLE_CAMERA + DemoApplication::updateCamera(); + return; +#endif //DISABLE_CAMERA + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + + btTransform chassisWorldTrans; + + //look at the vehicle + m_carChassis->getMotionState()->getWorldTransform(chassisWorldTrans); + m_cameraTargetPosition = chassisWorldTrans.getOrigin(); + + //interpolate the camera height +#ifdef FORCE_ZAXIS_UP + m_cameraPosition[2] = (15.0*m_cameraPosition[2] + m_cameraTargetPosition[2] + m_cameraHeight)/16.0; +#else + m_cameraPosition[1] = (15.0*m_cameraPosition[1] + m_cameraTargetPosition[1] + m_cameraHeight)/16.0; +#endif + + btVector3 camToObject = m_cameraTargetPosition - m_cameraPosition; + + //keep distance between min and max distance + float cameraDistance = camToObject.length(); + float correctionFactor = 0.f; + if (cameraDistance < m_minCameraDistance) + { + correctionFactor = 0.15*(m_minCameraDistance-cameraDistance)/cameraDistance; + } + if (cameraDistance > m_maxCameraDistance) + { + correctionFactor = 0.15*(m_maxCameraDistance-cameraDistance)/cameraDistance; + } + m_cameraPosition -= correctionFactor*camToObject; + + //update OpenGL camera settings + glFrustum(-1.0, 1.0, -1.0, 1.0, 1.0, 10000.0); + + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + + gluLookAt(m_cameraPosition[0],m_cameraPosition[1],m_cameraPosition[2], + m_cameraTargetPosition[0],m_cameraTargetPosition[1], m_cameraTargetPosition[2], + m_cameraUp.getX(),m_cameraUp.getY(),m_cameraUp.getZ()); + + + +} + diff --git a/BulletPhysics/bulletTrunk/Demos/VehicleDemo/VehicleDemo.h b/BulletPhysics/bulletTrunk/Demos/VehicleDemo/VehicleDemo.h new file mode 100644 index 00000000..e9c8c580 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/VehicleDemo/VehicleDemo.h @@ -0,0 +1,90 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ +#ifndef VEHICLE_DEMO_H +#define VEHICLE_DEMO_H + +class btVehicleTuning; +struct btVehicleRaycaster; +class btCollisionShape; + +#include "BulletDynamics/Vehicle/btRaycastVehicle.h" + +#include "DemoApplication.h" + +///VehicleDemo shows how to setup and use the built-in raycast vehicle +class VehicleDemo : public DemoApplication +{ + public: + + btRigidBody* m_carChassis; + + btAlignedObjectArray m_collisionShapes; + + class btBroadphaseInterface* m_overlappingPairCache; + + class btCollisionDispatcher* m_dispatcher; + + class btConstraintSolver* m_constraintSolver; + + class btDefaultCollisionConfiguration* m_collisionConfiguration; + + class btTriangleIndexVertexArray* m_indexVertexArrays; + + btVector3* m_vertices; + + + btRaycastVehicle::btVehicleTuning m_tuning; + btVehicleRaycaster* m_vehicleRayCaster; + btRaycastVehicle* m_vehicle; + + float m_cameraHeight; + + float m_minCameraDistance; + float m_maxCameraDistance; + + + VehicleDemo(); + + virtual ~VehicleDemo(); + + virtual void clientMoveAndDisplay(); + + virtual void clientResetScene(); + + virtual void displayCallback(); + + ///a very basic camera following the vehicle + virtual void updateCamera(); + + virtual void specialKeyboard(int key, int x, int y); + + virtual void specialKeyboardUp(int key, int x, int y); + + void renderme(); + + void initPhysics(); + + static DemoApplication* Create() + { + VehicleDemo* demo = new VehicleDemo(); + demo->myinit(); + demo->initPhysics(); + return demo; + } +}; + +#endif //VEHICLE_DEMO_H + + diff --git a/BulletPhysics/bulletTrunk/Demos/VehicleDemo/main.cpp b/BulletPhysics/bulletTrunk/Demos/VehicleDemo/main.cpp new file mode 100644 index 00000000..0bc51c21 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Demos/VehicleDemo/main.cpp @@ -0,0 +1,18 @@ + +#include "VehicleDemo.h" +#include "GlutStuff.h" +#include "GLDebugDrawer.h" +#include "btBulletDynamicsCommon.h" +GLDebugDrawer gDebugDrawer; + +int main(int argc,char** argv) +{ + + VehicleDemo* vehicleDemo = new VehicleDemo; + + vehicleDemo->initPhysics(); + vehicleDemo->getDynamicsWorld()->setDebugDrawer(&gDebugDrawer); + + return glutmain(argc, argv,640,480,"Bullet Vehicle Demo. http://www.continuousphysics.com/Bullet/phpBB2/", vehicleDemo); +} + diff --git a/BulletPhysics/bulletTrunk/Doxyfile b/BulletPhysics/bulletTrunk/Doxyfile new file mode 100644 index 00000000..2f9a6b27 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Doxyfile @@ -0,0 +1,763 @@ +# Doxyfile 1.2.4 + +# This file describes the settings to be used by doxygen for a project +# +# All text after a hash (#) is considered a comment and will be ignored +# The format is: +# TAG = value [value, ...] +# For lists items can also be appended using: +# TAG += value [value, ...] +# Values that contain spaces should be placed between quotes (" ") + +#--------------------------------------------------------------------------- +# General configuration options +#--------------------------------------------------------------------------- + +# The PROJECT_NAME tag is a single word (or a sequence of words surrounded +# by quotes) that should identify the project. +PROJECT_NAME = "Bullet Collision Detection & Physics Library" + +# The PROJECT_NUMBER tag can be used to enter a project or revision number. +# This could be handy for archiving the generated documentation or +# if some version control system is used. + +PROJECT_NUMBER = + +# The OUTPUT_DIRECTORY tag is used to specify the (relative or absolute) +# base path where the generated documentation will be put. +# If a relative path is entered, it will be relative to the location +# where doxygen was started. If left blank the current directory will be used. + +OUTPUT_DIRECTORY = + +# The OUTPUT_LANGUAGE tag is used to specify the language in which all +# documentation generated by doxygen is written. Doxygen will use this +# information to generate all constant output in the proper language. +# The default language is English, other supported languages are: +# Dutch, French, Italian, Czech, Swedish, German, Finnish, Japanese, +# Korean, Hungarian, Norwegian, Spanish, Romanian, Russian, Croatian, +# Polish, Portuguese and Slovene. + +OUTPUT_LANGUAGE = English + +# If the EXTRACT_ALL tag is set to YES doxygen will assume all entities in +# documentation are documented, even if no documentation was available. +# Private class members and static file members will be hidden unless +# the EXTRACT_PRIVATE and EXTRACT_STATIC tags are set to YES + +EXTRACT_ALL = YES + +# If the EXTRACT_PRIVATE tag is set to YES all private members of a class +# will be included in the documentation. + +EXTRACT_PRIVATE = YES + +# If the EXTRACT_STATIC tag is set to YES all static members of a file +# will be included in the documentation. + +EXTRACT_STATIC = YES + +# If the HIDE_UNDOC_MEMBERS tag is set to YES, Doxygen will hide all +# undocumented members of documented classes, files or namespaces. +# If set to NO (the default) these members will be included in the +# various overviews, but no documentation section is generated. +# This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_MEMBERS = NO + +# If the HIDE_UNDOC_CLASSES tag is set to YES, Doxygen will hide all +# undocumented classes that are normally visible in the class hierarchy. +# If set to NO (the default) these class will be included in the various +# overviews. This option has no effect if EXTRACT_ALL is enabled. + +HIDE_UNDOC_CLASSES = NO + +# If the BRIEF_MEMBER_DESC tag is set to YES (the default) Doxygen will +# include brief member descriptions after the members that are listed in +# the file and class documentation (similar to JavaDoc). +# Set to NO to disable this. + +BRIEF_MEMBER_DESC = YES + +# If the REPEAT_BRIEF tag is set to YES (the default) Doxygen will prepend +# the brief description of a member or function before the detailed description. +# Note: if both HIDE_UNDOC_MEMBERS and BRIEF_MEMBER_DESC are set to NO, the +# brief descriptions will be completely suppressed. + +REPEAT_BRIEF = YES + +# If the ALWAYS_DETAILED_SEC and REPEAT_BRIEF tags are both set to YES then +# Doxygen will generate a detailed section even if there is only a brief +# description. + +ALWAYS_DETAILED_SEC = NO + +# If the FULL_PATH_NAMES tag is set to YES then Doxygen will prepend the full +# path before files name in the file list and in the header files. If set +# to NO the shortest path that makes the file name unique will be used. + +FULL_PATH_NAMES = NO + +# If the FULL_PATH_NAMES tag is set to YES then the STRIP_FROM_PATH tag +# can be used to strip a user defined part of the path. Stripping is +# only done if one of the specified strings matches the left-hand part of +# the path. It is allowed to use relative paths in the argument list. + +STRIP_FROM_PATH = + +# The INTERNAL_DOCS tag determines if documentation +# that is typed after a \internal command is included. If the tag is set +# to NO (the default) then the documentation will be excluded. +# Set it to YES to include the internal documentation. + +INTERNAL_DOCS = NO + +# If the CLASS_DIAGRAMS tag is set to YES (the default) Doxygen will +# generate a class diagram (in Html and LaTeX) for classes with base or +# super classes. Setting the tag to NO turns the diagrams off. + +CLASS_DIAGRAMS = YES + +# If the SOURCE_BROWSER tag is set to YES then a list of source files will +# be generated. Documented entities will be cross-referenced with these sources. + +SOURCE_BROWSER = YES + +# Setting the INLINE_SOURCES tag to YES will include the body +# of functions and classes directly in the documentation. + +INLINE_SOURCES = NO + +# Setting the STRIP_CODE_COMMENTS tag to YES (the default) will instruct +# doxygen to hide any special comment blocks from generated source code +# fragments. Normal C and C++ comments will always remain visible. + +STRIP_CODE_COMMENTS = YES + +# If the CASE_SENSE_NAMES tag is set to NO then Doxygen will only generate +# file names in lower case letters. If set to YES upper case letters are also +# allowed. This is useful if you have classes or files whose names only differ +# in case and if your file system supports case sensitive file names. Windows +# users are adviced to set this option to NO. + +CASE_SENSE_NAMES = YES + +# If the HIDE_SCOPE_NAMES tag is set to NO (the default) then Doxygen +# will show members with their full class and namespace scopes in the +# documentation. If set to YES the scope will be hidden. + +HIDE_SCOPE_NAMES = NO + +# If the VERBATIM_HEADERS tag is set to YES (the default) then Doxygen +# will generate a verbatim copy of the header file for each class for +# which an include is specified. Set to NO to disable this. + +VERBATIM_HEADERS = YES + +# If the SHOW_INCLUDE_FILES tag is set to YES (the default) then Doxygen +# will put list of the files that are included by a file in the documentation +# of that file. + +SHOW_INCLUDE_FILES = YES + +# If the JAVADOC_AUTOBRIEF tag is set to YES then Doxygen +# will interpret the first line (until the first dot) of a JavaDoc-style +# comment as the brief description. If set to NO, the JavaDoc +# comments will behave just like the Qt-style comments (thus requiring an +# explict @brief command for a brief description. + +JAVADOC_AUTOBRIEF = YES + +# If the INHERIT_DOCS tag is set to YES (the default) then an undocumented +# member inherits the documentation from any documented member that it +# reimplements. + +INHERIT_DOCS = YES + +# If the INLINE_INFO tag is set to YES (the default) then a tag [inline] +# is inserted in the documentation for inline members. + +INLINE_INFO = YES + +# If the SORT_MEMBER_DOCS tag is set to YES (the default) then doxygen +# will sort the (detailed) documentation of file and class members +# alphabetically by member name. If set to NO the members will appear in +# declaration order. + +SORT_MEMBER_DOCS = YES + +# If member grouping is used in the documentation and the DISTRIBUTE_GROUP_DOC +# tag is set to YES, then doxygen will reuse the documentation of the first +# member in the group (if any) for the other members of the group. By default +# all members of a group must be documented explicitly. + +DISTRIBUTE_GROUP_DOC = NO + +# The TAB_SIZE tag can be used to set the number of spaces in a tab. +# Doxygen uses this value to replace tabs by spaces in code fragments. + +TAB_SIZE = 8 + +# The ENABLE_SECTIONS tag can be used to enable conditional +# documentation sections, marked by \if sectionname ... \endif. + +ENABLED_SECTIONS = + +# The GENERATE_TODOLIST tag can be used to enable (YES) or +# disable (NO) the todo list. This list is created by putting \todo +# commands in the documentation. + +GENERATE_TODOLIST = NO + +# The GENERATE_TESTLIST tag can be used to enable (YES) or +# disable (NO) the test list. This list is created by putting \test +# commands in the documentation. + +GENERATE_TESTLIST = YES + +# This tag can be used to specify a number of aliases that acts +# as commands in the documentation. An alias has the form "name=value". +# For example adding "sideeffect=\par Side Effects:\n" will allow you to +# put the command \sideeffect (or @sideeffect) in the documentation, which +# will result in a user defined paragraph with heading "Side Effects:". +# You can put \n's in the value part of an alias to insert newlines. + +ALIASES = + +#--------------------------------------------------------------------------- +# configuration options related to warning and progress messages +#--------------------------------------------------------------------------- + +# The QUIET tag can be used to turn on/off the messages that are generated +# by doxygen. Possible values are YES and NO. If left blank NO is used. + +QUIET = NO + +# The WARNINGS tag can be used to turn on/off the warning messages that are +# generated by doxygen. Possible values are YES and NO. If left blank +# NO is used. + +WARNINGS = YES + +# If WARN_IF_UNDOCUMENTED is set to YES, then doxygen will generate warnings +# for undocumented members. If EXTRACT_ALL is set to YES then this flag will +# automatically be disabled. + +WARN_IF_UNDOCUMENTED = YES + +# The WARN_FORMAT tag determines the format of the warning messages that +# doxygen can produce. The string should contain the $file, $line, and $text +# tags, which will be replaced by the file and line number from which the +# warning originated and the warning text. + +WARN_FORMAT = "$file:$line: $text" + +# The WARN_LOGFILE tag can be used to specify a file to which warning +# and error messages should be written. If left blank the output is written +# to stderr. + +WARN_LOGFILE = + +#--------------------------------------------------------------------------- +# configuration options related to the input files +#--------------------------------------------------------------------------- + +# The INPUT tag can be used to specify the files and/or directories that contain +# documented source files. You may enter file names like "myfile.cpp" or +# directories like "/usr/src/myproject". Separate the files or directories +# with spaces. + +INPUT = src + + +# If the value of the INPUT tag contains directories, you can use the +# FILE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +FILE_PATTERNS = *.h *.cpp *.c + +# The RECURSIVE tag can be used to turn specify whether or not subdirectories +# should be searched for input files as well. Possible values are YES and NO. +# If left blank NO is used. + +RECURSIVE = YES + +# The EXCLUDE tag can be used to specify files and/or directories that should +# excluded from the INPUT source files. This way you can easily exclude a +# subdirectory from a directory tree whose root is specified with the INPUT tag. + +EXCLUDE = + +# If the value of the INPUT tag contains directories, you can use the +# EXCLUDE_PATTERNS tag to specify one or more wildcard patterns to exclude +# certain files from those directories. + +EXCLUDE_PATTERNS = + +# The EXAMPLE_PATH tag can be used to specify one or more files or +# directories that contain example code fragments that are included (see +# the \include command). + +EXAMPLE_PATH = + +# If the value of the EXAMPLE_PATH tag contains directories, you can use the +# EXAMPLE_PATTERNS tag to specify one or more wildcard pattern (like *.cpp +# and *.h) to filter out the source-files in the directories. If left +# blank all files are included. + +EXAMPLE_PATTERNS = + +# The IMAGE_PATH tag can be used to specify one or more files or +# directories that contain image that are included in the documentation (see +# the \image command). + +IMAGE_PATH = + +# The INPUT_FILTER tag can be used to specify a program that doxygen should +# invoke to filter for each input file. Doxygen will invoke the filter program +# by executing (via popen()) the command , where +# is the value of the INPUT_FILTER tag, and is the name of an +# input file. Doxygen will then use the output that the filter program writes +# to standard output. + +INPUT_FILTER = + +# If the FILTER_SOURCE_FILES tag is set to YES, the input filter (if set using +# INPUT_FILTER) will be used to filter the input files when producing source +# files to browse. + +FILTER_SOURCE_FILES = NO + +#--------------------------------------------------------------------------- +# configuration options related to the alphabetical class index +#--------------------------------------------------------------------------- + +# If the ALPHABETICAL_INDEX tag is set to YES, an alphabetical index +# of all compounds will be generated. Enable this if the project +# contains a lot of classes, structs, unions or interfaces. + +ALPHABETICAL_INDEX = NO + +# If the alphabetical index is enabled (see ALPHABETICAL_INDEX) then +# the COLS_IN_ALPHA_INDEX tag can be used to specify the number of columns +# in which this list will be split (can be a number in the range [1..20]) + +COLS_IN_ALPHA_INDEX = 5 + +# In case all classes in a project start with a common prefix, all +# classes will be put under the same header in the alphabetical index. +# The IGNORE_PREFIX tag can be used to specify one or more prefixes that +# should be ignored while generating the index headers. + +IGNORE_PREFIX = + +#--------------------------------------------------------------------------- +# configuration options related to the HTML output +#--------------------------------------------------------------------------- + +# If the GENERATE_HTML tag is set to YES (the default) Doxygen will +# generate HTML output. + +GENERATE_HTML = YES + +# The HTML_OUTPUT tag is used to specify where the HTML docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `html' will be used as the default path. + +HTML_OUTPUT = html + +# The HTML_HEADER tag can be used to specify a personal HTML header for +# each generated HTML page. If it is left blank doxygen will generate a +# standard header. + +HTML_HEADER = + +# The HTML_FOOTER tag can be used to specify a personal HTML footer for +# each generated HTML page. If it is left blank doxygen will generate a +# standard footer. + +HTML_FOOTER = + +# The HTML_STYLESHEET tag can be used to specify a user defined cascading +# style sheet that is used by each HTML page. It can be used to +# fine-tune the look of the HTML output. If the tag is left blank doxygen +# will generate a default style sheet + +HTML_STYLESHEET = + +# If the HTML_ALIGN_MEMBERS tag is set to YES, the members of classes, +# files or namespaces will be aligned in HTML using tables. If set to +# NO a bullet list will be used. + +HTML_ALIGN_MEMBERS = YES + +# If the GENERATE_HTMLHELP tag is set to YES, additional index files +# will be generated that can be used as input for tools like the +# Microsoft HTML help workshop to generate a compressed HTML help file (.chm) +# of the generated HTML documentation. + +GENERATE_HTMLHELP = YES + +HHC_LOCATION = "C:\Program Files\HTML Help Workshop\hhc.exe" + +HTML_FILE_EXTENSION = .html +HTML_HEADER = +HTML_FOOTER = +#HTML_STYLESHEET = "\\server\exchange\Software Development\Documentation\DoxyGen\doxygen.css" + +CHM_FILE = BulletDocs.chm +HHC_LOCATION = "c:\program files\HTML Help Workshop\hhc.exe" +GENERATE_CHI = YES +BINARY_TOC = YES + +TOC_EXPAND = YES + +SHOW_DIRECTORIES = YES + + +# The DISABLE_INDEX tag can be used to turn on/off the condensed index at +# top of each HTML page. The value NO (the default) enables the index and +# the value YES disables it. + +DISABLE_INDEX = NO + +# This tag can be used to set the number of enum values (range [1..20]) +# that doxygen will group on one line in the generated HTML documentation. + +ENUM_VALUES_PER_LINE = 1 + +# If the GENERATE_TREEVIEW tag is set to YES, a side pannel will be +# generated containing a tree-like index structure (just like the one that +# is generated for HTML Help). For this to work a browser that supports +# JavaScript and frames is required (for instance Netscape 4.0+ +# or Internet explorer 4.0+). + +GENERATE_TREEVIEW = YES + +# If the treeview is enabled (see GENERATE_TREEVIEW) then this tag can be +# used to set the initial width (in pixels) of the frame in which the tree +# is shown. + +TREEVIEW_WIDTH = 250 + +#--------------------------------------------------------------------------- +# configuration options related to the LaTeX output +#--------------------------------------------------------------------------- + +# If the GENERATE_LATEX tag is set to YES (the default) Doxygen will +# generate Latex output. + +GENERATE_LATEX = NO + +# The LATEX_OUTPUT tag is used to specify where the LaTeX docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `latex' will be used as the default path. + +LATEX_OUTPUT = latex + +# If the COMPACT_LATEX tag is set to YES Doxygen generates more compact +# LaTeX documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_LATEX = NO + +# The PAPER_TYPE tag can be used to set the paper type that is used +# by the printer. Possible values are: a4, a4wide, letter, legal and +# executive. If left blank a4wide will be used. + +PAPER_TYPE = a4wide + +# The EXTRA_PACKAGES tag can be to specify one or more names of LaTeX +# packages that should be included in the LaTeX output. + +EXTRA_PACKAGES = + +# The LATEX_HEADER tag can be used to specify a personal LaTeX header for +# the generated latex document. The header should contain everything until +# the first chapter. If it is left blank doxygen will generate a +# standard header. Notice: only use this tag if you know what you are doing! + +LATEX_HEADER = + +# If the PDF_HYPERLINKS tag is set to YES, the LaTeX that is generated +# is prepared for conversion to pdf (using ps2pdf). The pdf file will +# contain links (just like the HTML output) instead of page references +# This makes the output suitable for online browsing using a pdf viewer. + +PDF_HYPERLINKS = NO + +# If the USE_PDFLATEX tag is set to YES, pdflatex will be used instead of +# plain latex in the generated Makefile. Set this option to YES to get a +# higher quality PDF documentation. + +USE_PDFLATEX = NO + +# If the LATEX_BATCHMODE tag is set to YES, doxygen will add the \\batchmode. +# command to the generated LaTeX files. This will instruct LaTeX to keep +# running if errors occur, instead of asking the user for help. +# This option is also used when generating formulas in HTML. + +LATEX_BATCHMODE = NO + +#--------------------------------------------------------------------------- +# configuration options related to the RTF output +#--------------------------------------------------------------------------- + +# If the GENERATE_RTF tag is set to YES Doxygen will generate RTF output +# The RTF output is optimised for Word 97 and may not look very pretty with +# other RTF readers or editors. + +GENERATE_RTF = NO + +# The RTF_OUTPUT tag is used to specify where the RTF docs will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `rtf' will be used as the default path. + +RTF_OUTPUT = rtf + +# If the COMPACT_RTF tag is set to YES Doxygen generates more compact +# RTF documents. This may be useful for small projects and may help to +# save some trees in general. + +COMPACT_RTF = NO + +# If the RTF_HYPERLINKS tag is set to YES, the RTF that is generated +# will contain hyperlink fields. The RTF file will +# contain links (just like the HTML output) instead of page references. +# This makes the output suitable for online browsing using a WORD or other. +# programs which support those fields. +# Note: wordpad (write) and others do not support links. + +RTF_HYPERLINKS = NO + +# Load stylesheet definitions from file. Syntax is similar to doxygen's +# config file, i.e. a series of assigments. You only have to provide +# replacements, missing definitions are set to their default value. + +RTF_STYLESHEET_FILE = + +#--------------------------------------------------------------------------- +# configuration options related to the man page output +#--------------------------------------------------------------------------- + +# If the GENERATE_MAN tag is set to YES (the default) Doxygen will +# generate man pages + +GENERATE_MAN = NO + +# The MAN_OUTPUT tag is used to specify where the man pages will be put. +# If a relative path is entered the value of OUTPUT_DIRECTORY will be +# put in front of it. If left blank `man' will be used as the default path. + +MAN_OUTPUT = man + +# The MAN_EXTENSION tag determines the extension that is added to +# the generated man pages (default is the subroutine's section .3) + +MAN_EXTENSION = .3 + +#--------------------------------------------------------------------------- +# configuration options related to the XML output +#--------------------------------------------------------------------------- + +# If the GENERATE_XML tag is set to YES Doxygen will +# generate an XML file that captures the structure of +# the code including all documentation. Warning: This feature +# is still experimental and very incomplete. + +GENERATE_XML = NO + +#--------------------------------------------------------------------------- +# Configuration options related to the preprocessor +#--------------------------------------------------------------------------- + +# If the ENABLE_PREPROCESSING tag is set to YES (the default) Doxygen will +# evaluate all C-preprocessor directives found in the sources and include +# files. + +ENABLE_PREPROCESSING = YES + +# If the MACRO_EXPANSION tag is set to YES Doxygen will expand all macro +# names in the source code. If set to NO (the default) only conditional +# compilation will be performed. Macro expansion can be done in a controlled +# way by setting EXPAND_ONLY_PREDEF to YES. + +MACRO_EXPANSION = YES + +# If the EXPAND_ONLY_PREDEF and MACRO_EXPANSION tags are both set to YES +# then the macro expansion is limited to the macros specified with the +# PREDEFINED and EXPAND_AS_PREDEFINED tags. + +EXPAND_ONLY_PREDEF = NO + +# If the SEARCH_INCLUDES tag is set to YES (the default) the includes files +# in the INCLUDE_PATH (see below) will be search if a #include is found. + +SEARCH_INCLUDES = YES + +# The INCLUDE_PATH tag can be used to specify one or more directories that +# contain include files that are not input files but should be processed by +# the preprocessor. + +INCLUDE_PATH = src + +# You can use the INCLUDE_FILE_PATTERNS tag to specify one or more wildcard +# patterns (like *.h and *.hpp) to filter out the header-files in the +# directories. If left blank, the patterns specified with FILE_PATTERNS will +# be used. + +INCLUDE_FILE_PATTERNS = + +# The PREDEFINED tag can be used to specify one or more macro names that +# are defined before the preprocessor is started (similar to the -D option of +# gcc). The argument of the tag is a list of macros of the form: name +# or name=definition (no spaces). If the definition and the = are +# omitted =1 is assumed. + +PREDEFINED = + +# If the MACRO_EXPANSION and EXPAND_PREDEF_ONLY tags are set to YES then +# this tag can be used to specify a list of macro names that should be expanded. +# The macro definition that is found in the sources will be used. +# Use the PREDEFINED tag if you want to use a different macro definition. + +EXPAND_AS_DEFINED = + +#--------------------------------------------------------------------------- +# Configuration::addtions related to external references +#--------------------------------------------------------------------------- + +# The TAGFILES tag can be used to specify one or more tagfiles. + +TAGFILES = + +# When a file name is specified after GENERATE_TAGFILE, doxygen will create +# a tag file that is based on the input files it reads. + +GENERATE_TAGFILE = + +# If the ALLEXTERNALS tag is set to YES all external classes will be listed +# in the class index. If set to NO only the inherited external classes +# will be listed. + +ALLEXTERNALS = NO + +# The PERL_PATH should be the absolute path and name of the perl script +# interpreter (i.e. the result of `which perl'). + +PERL_PATH = /usr/bin/perl + +#--------------------------------------------------------------------------- +# Configuration options related to the dot tool +#--------------------------------------------------------------------------- + +# If you set the HAVE_DOT tag to YES then doxygen will assume the dot tool is +# available from the path. This tool is part of Graphviz, a graph visualization +# toolkit from AT&T and Lucent Bell Labs. The other options in this section +# have no effect if this option is set to NO (the default) + +HAVE_DOT = YES + +# If the CLASS_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect inheritance relations. Setting this tag to YES will force the +# the CLASS_DIAGRAMS tag to NO. + +CLASS_GRAPH = YES + +# If the COLLABORATION_GRAPH and HAVE_DOT tags are set to YES then doxygen +# will generate a graph for each documented class showing the direct and +# indirect implementation dependencies (inheritance, containment, and +# class references variables) of the class with other documented classes. + +COLLABORATION_GRAPH = YES + +# If the ENABLE_PREPROCESSING, INCLUDE_GRAPH, and HAVE_DOT tags are set to +# YES then doxygen will generate a graph for each documented file showing +# the direct and indirect include dependencies of the file with other +# documented files. + +INCLUDE_GRAPH = YES + +# If the ENABLE_PREPROCESSING, INCLUDED_BY_GRAPH, and HAVE_DOT tags are set to +# YES then doxygen will generate a graph for each documented header file showing +# the documented files that directly or indirectly include this file + +INCLUDED_BY_GRAPH = YES + +# If the GRAPHICAL_HIERARCHY and HAVE_DOT tags are set to YES then doxygen +# will graphical hierarchy of all classes instead of a textual one. + +GRAPHICAL_HIERARCHY = YES + +# The tag DOT_PATH can be used to specify the path where the dot tool can be +# found. If left blank, it is assumed the dot tool can be found on the path. + +DOT_PATH = + +# The MAX_DOT_GRAPH_WIDTH tag can be used to set the maximum allowed width +# (in pixels) of the graphs generated by dot. If a graph becomes larger than +# this value, doxygen will try to truncate the graph, so that it fits within +# the specified constraint. Beware that most browsers cannot cope with very +# large images. + +MAX_DOT_GRAPH_WIDTH = 1024 + +# The MAX_DOT_GRAPH_HEIGHT tag can be used to set the maximum allows height +# (in pixels) of the graphs generated by dot. If a graph becomes larger than +# this value, doxygen will try to truncate the graph, so that it fits within +# the specified constraint. Beware that most browsers cannot cope with very +# large images. + +MAX_DOT_GRAPH_HEIGHT = 1024 + +# If the GENERATE_LEGEND tag is set to YES (the default) Doxygen will +# generate a legend page explaining the meaning of the various boxes and +# arrows in the dot generated graphs. + +GENERATE_LEGEND = YES + +#--------------------------------------------------------------------------- +# Configuration::addtions related to the search engine +#--------------------------------------------------------------------------- + +# The SEARCHENGINE tag specifies whether or not a search engine should be +# used. If set to NO the values of all tags below this one will be ignored. + +SEARCHENGINE = NO + +# The CGI_NAME tag should be the name of the CGI script that +# starts the search engine (doxysearch) with the correct parameters. +# A script with this name will be generated by doxygen. + +CGI_NAME = search.cgi + +# The CGI_URL tag should be the absolute URL to the directory where the +# cgi binaries are located. See the documentation of your http daemon for +# details. + +CGI_URL = + +# The DOC_URL tag should be the absolute URL to the directory where the +# documentation is located. If left blank the absolute path to the +# documentation, with file:// prepended to it, will be used. + +DOC_URL = + +# The DOC_ABSPATH tag should be the absolute path to the directory where the +# documentation is located. If left blank the directory on the local machine +# will be used. + +DOC_ABSPATH = + +# The BIN_ABSPATH tag must point to the directory where the doxysearch binary +# is installed. + +BIN_ABSPATH = c:\program files\doxygen\bin + +# The EXT_DOC_PATHS tag can be used to specify one or more paths to +# documentation generated for other projects. This allows doxysearch to search +# the documentation for these projects as well. + +EXT_DOC_PATHS = diff --git a/BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/AllBulletDemos.xcodeproj/TemplateIcon.icns b/BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/AllBulletDemos.xcodeproj/TemplateIcon.icns new file mode 100644 index 0000000000000000000000000000000000000000..62cb7015e09d6ea3e65d7f7949c4c07f9246a908 GIT binary patch literal 52318 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 WhsmLR^b3` + + + + ActivePerspectiveName + Project + AllowedModules + + + BundleLoadPath + + MaxInstances + n + Module + PBXSmartGroupTreeModule + Name + Groups and Files Outline View + + + BundleLoadPath + + MaxInstances + n + Module + PBXNavigatorGroup + Name + Editor + + + BundleLoadPath + + MaxInstances + n + Module + XCTaskListModule + Name + Task List + + + BundleLoadPath + + MaxInstances + n + Module + XCDetailModule + Name + File and Smart Group Detail Viewer + + + BundleLoadPath + + MaxInstances + 1 + Module + PBXBuildResultsModule + Name + Detailed Build Results Viewer + + + BundleLoadPath + + MaxInstances + 1 + Module + PBXProjectFindModule + Name + Project Batch Find Tool + + + BundleLoadPath + + MaxInstances + n + Module + XCProjectFormatConflictsModule + Name + Project Format Conflicts List + + + BundleLoadPath + + MaxInstances + n + Module + PBXBookmarksModule + Name + Bookmarks Tool + + + BundleLoadPath + + MaxInstances + n + Module + PBXClassBrowserModule + Name + Class Browser + + + BundleLoadPath + + MaxInstances + n + Module + PBXCVSModule + Name + Source Code Control Tool + + + BundleLoadPath + + MaxInstances + n + Module + PBXDebugBreakpointsModule + Name + Debug Breakpoints Tool + + + BundleLoadPath + + MaxInstances + n + Module + XCDockableInspector + Name + Inspector + + + BundleLoadPath + + MaxInstances + n + Module + PBXOpenQuicklyModule + Name + Open Quickly Tool + + + BundleLoadPath + + MaxInstances + 1 + Module + PBXDebugSessionModule + Name + Debugger + + + BundleLoadPath + + MaxInstances + 1 + Module + PBXDebugCLIModule + Name + Debug Console + + + BundleLoadPath + + MaxInstances + n + Module + XCSnapshotModule + Name + Snapshots Tool + + + BundlePath + /Developer/Library/PrivateFrameworks/DevToolsInterface.framework/Resources + Description + AIODescriptionKey + DockingSystemVisible + + Extension + perspectivev3 + FavBarConfig + + PBXProjectModuleGUID + 36C69D140DC9E7C30034504A + XCBarModuleItemNames + + XCBarModuleItems + + + FirstTimeWindowDisplayed + + Identifier + com.apple.perspectives.project.defaultV3 + MajorVersion + 34 + MinorVersion + 0 + Name + All-In-One + Notifications + + + XCObserverAutoDisconnectKey + + XCObserverDefintionKey + + PBXStatusErrorsKey + 0 + + XCObserverFactoryKey + XCPerspectivesSpecificationIdentifier + XCObserverGUIDKey + XCObserverProjectIdentifier + XCObserverNotificationKey + PBXStatusBuildStateMessageNotification + XCObserverTargetKey + XCMainBuildResultsModuleGUID + XCObserverTriggerKey + awakenModuleWithObserver: + XCObserverValidationKey + + PBXStatusErrorsKey + 2 + + + + XCObserverAutoDisconnectKey + + XCObserverDefintionKey + + PBXStatusWarningsKey + 0 + + XCObserverFactoryKey + XCPerspectivesSpecificationIdentifier + XCObserverGUIDKey + XCObserverProjectIdentifier + XCObserverNotificationKey + PBXStatusBuildStateMessageNotification + XCObserverTargetKey + XCMainBuildResultsModuleGUID + XCObserverTriggerKey + awakenModuleWithObserver: + XCObserverValidationKey + + PBXStatusWarningsKey + 2 + + + + OpenEditors + + PerspectiveWidths + + 1440 + 1440 + + Perspectives + + + ChosenToolbarItems + + XCToolbarPerspectiveControl + NSToolbarSeparatorItem + active-target-popup + active-executable-popup + active-buildstyle-popup + action + NSToolbarFlexibleSpaceItem + buildOrClean + build-and-goOrGo + com.apple.ide.PBXToolbarStopButton + get-info + toggle-editor + NSToolbarFlexibleSpaceItem + researchAssistant + com.apple.pbx.toolbar.searchfield + + ControllerClassBaseName + + IconName + WindowOfProject + Identifier + perspective.project + IsVertical + + Layout + + + BecomeActive + + ContentConfiguration + + PBXBottomSmartGroupGIDs + + 1C37FBAC04509CD000000102 + 1C37FAAC04509CD000000102 + 1C08E77C0454961000C914BD + 1C37FABC05509CD000000102 + 1C37FABC05539CD112110102 + E2644B35053B69B200211256 + 1C37FABC04509CD000100104 + 1CC0EA4004350EF90044410B + 1CC0EA4004350EF90041110B + 1C77FABC04509CD000000102 + + PBXProjectModuleGUID + 1CA23ED40692098700951B8B + PBXProjectModuleLabel + Files + PBXProjectStructureProvided + yes + PBXSmartGroupTreeModuleColumnData + + PBXSmartGroupTreeModuleColumnWidthsKey + + 352 + + PBXSmartGroupTreeModuleColumnsKey_v4 + + MainColumn + + + PBXSmartGroupTreeModuleOutlineStateKey_v7 + + PBXSmartGroupTreeModuleOutlineStateExpansionKey + + 29B97314FDCFA39411CA2CEA + 36A05D5A0DCBAD9000ADF289 + 36C69D250DC9E7FE0034504A + 36A05DC60DCBBAC000ADF289 + 29B97317FDCFA39411CA2CEA + + PBXSmartGroupTreeModuleOutlineStateSelectionKey + + + 20 + 18 + 0 + + + PBXSmartGroupTreeModuleOutlineStateVisibleRectKey + {{0, 0}, {352, 780}} + + PBXTopSmartGroupGIDs + + XCIncludePerspectivesSwitch + + + GeometryConfiguration + + Frame + {{0, 0}, {369, 798}} + GroupTreeTableConfiguration + + MainColumn + 352 + + RubberWindowFrame + 0 39 1440 839 0 0 1440 878 + + Module + PBXSmartGroupTreeModule + Proportion + 369pt + + + Dock + + + ContentConfiguration + + PBXProjectModuleGUID + 36C69D0F0DC9E7C30034504A + PBXProjectModuleLabel + + PBXSplitModuleInNavigatorKey + + Split0 + + PBXProjectModuleGUID + 36C69D100DC9E7C30034504A + PBXProjectModuleLabel + + + SplitCount + 1 + + StatusBarVisibility + + XCSharingToken + com.apple.Xcode.CommonNavigatorGroupSharingToken + + GeometryConfiguration + + Frame + {{0, 0}, {1066, 555}} + RubberWindowFrame + 0 39 1440 839 0 0 1440 878 + + Module + PBXNavigatorGroup + Proportion + 555pt + + + Proportion + 238pt + Tabs + + + ContentConfiguration + + PBXProjectModuleGUID + 1CA23EDF0692099D00951B8B + PBXProjectModuleLabel + Detail + + GeometryConfiguration + + Frame + {{10, 27}, {1066, 211}} + RubberWindowFrame + 0 39 1440 839 0 0 1440 878 + + Module + XCDetailModule + + + ContentConfiguration + + PBXProjectModuleGUID + 1CA23EE00692099D00951B8B + PBXProjectModuleLabel + Project Find + + GeometryConfiguration + + Frame + {{10, 27}, {1066, -27}} + + Module + PBXProjectFindModule + + + ContentConfiguration + + PBXCVSModuleFilterTypeKey + 1032 + PBXProjectModuleGUID + 1CA23EE10692099D00951B8B + PBXProjectModuleLabel + SCM Results + + GeometryConfiguration + + Frame + {{10, 31}, {603, 297}} + + Module + PBXCVSModule + + + ContentConfiguration + + PBXProjectModuleGUID + XCMainBuildResultsModuleGUID + PBXProjectModuleLabel + Build + XCBuildResultsTrigger_Collapse + 1021 + XCBuildResultsTrigger_Open + 1013 + + GeometryConfiguration + + Frame + {{10, 27}, {1066, 211}} + + Module + PBXBuildResultsModule + + + + + Proportion + 1066pt + + + Name + Project + ServiceClasses + + XCModuleDock + PBXSmartGroupTreeModule + XCModuleDock + PBXNavigatorGroup + XCDockableTabModule + XCDetailModule + PBXProjectFindModule + PBXCVSModule + PBXBuildResultsModule + + TableOfContents + + 3699D2370DCF89C9001D9494 + 1CA23ED40692098700951B8B + 3699D2380DCF89C9001D9494 + 36C69D0F0DC9E7C30034504A + 3699D2390DCF89C9001D9494 + 1CA23EDF0692099D00951B8B + 1CA23EE00692099D00951B8B + 1CA23EE10692099D00951B8B + XCMainBuildResultsModuleGUID + + ToolbarConfiguration + xcode.toolbar.config.defaultV3 + + + ChosenToolbarItems + + XCToolbarPerspectiveControl + NSToolbarSeparatorItem + build-and-go + go + NSToolbarFlexibleSpaceItem + debugger-fix-and-continue + debugger-restart-executable + debugger-pause + debugger-step-over + debugger-step-into + debugger-step-out + debugger-step-instruction + NSToolbarFlexibleSpaceItem + + ControllerClassBaseName + PBXDebugSessionModule + IconName + DebugTabIcon + Identifier + perspective.debug + IsVertical + + Layout + + + ContentConfiguration + + PBXProjectModuleGUID + 1CCC7628064C1048000F2A68 + PBXProjectModuleLabel + Debugger Console + + GeometryConfiguration + + Frame + {{0, 0}, {1440, 238}} + + Module + PBXDebugCLIModule + Proportion + 238pt + + + ContentConfiguration + + Debugger + + HorizontalSplitView + + _collapsingFrameDimension + 0.0 + _indexOfCollapsedView + 0 + _percentageOfCollapsedView + 0.0 + isCollapsed + yes + sizes + + {{0, 0}, {703, 268}} + {{703, 0}, {737, 268}} + + + VerticalSplitView + + _collapsingFrameDimension + 0.0 + _indexOfCollapsedView + 0 + _percentageOfCollapsedView + 0.0 + isCollapsed + yes + sizes + + {{0, 0}, {1440, 268}} + {{0, 268}, {1440, 287}} + + + + LauncherConfigVersion + 8 + PBXProjectModuleGUID + 1CCC7629064C1048000F2A68 + PBXProjectModuleLabel + Debug + + GeometryConfiguration + + DebugConsoleVisible + None + DebugConsoleWindowFrame + {{200, 200}, {500, 300}} + DebugSTDIOWindowFrame + {{200, 200}, {500, 300}} + Frame + {{0, 243}, {1440, 555}} + PBXDebugSessionStackFrameViewKey + + DebugVariablesTableConfiguration + + Name + 120 + Value + 85 + Summary + 507 + + Frame + {{703, 0}, {737, 268}} + + + Module + PBXDebugSessionModule + Proportion + 555pt + + + Name + Debug + ServiceClasses + + XCModuleDock + PBXDebugCLIModule + PBXDebugSessionModule + PBXDebugProcessAndThreadModule + PBXDebugProcessViewModule + PBXDebugThreadViewModule + PBXDebugStackFrameViewModule + PBXNavigatorGroup + + TableOfContents + + 3699D2080DCF68BE001D9494 + 1CCC7628064C1048000F2A68 + 1CCC7629064C1048000F2A68 + 3699D2090DCF68BE001D9494 + 3699D20A0DCF68BE001D9494 + 3699D20B0DCF68BE001D9494 + 3699D20C0DCF68BE001D9494 + 36C69D0F0DC9E7C30034504A + + ToolbarConfiguration + xcode.toolbar.config.debugV3 + + + PerspectivesBarVisible + + ShelfIsVisible + + SourceDescription + file at '/Developer/Library/PrivateFrameworks/DevToolsInterface.framework/Resources/XCPerspectivesSpecification.xcperspec' + StatusbarIsVisible + + TimeStamp + 231705097.779064 + ToolbarDisplayMode + 2 + ToolbarIsVisible + + ToolbarSizeMode + 2 + Type + Perspectives + UpdateMessage + + WindowJustification + 5 + WindowOrderList + + /Users/zakariya/Code/vendor/bullet-2.68/Extras/AllBulletDemosOSX/AllBulletDemos.xcodeproj + + WindowString + 0 39 1440 839 0 0 1440 878 + WindowToolsV3 + + + Identifier + windowTool.debugger + Layout + + + Dock + + + ContentConfiguration + + Debugger + + HorizontalSplitView + + _collapsingFrameDimension + 0.0 + _indexOfCollapsedView + 0 + _percentageOfCollapsedView + 0.0 + isCollapsed + yes + sizes + + {{0, 0}, {317, 164}} + {{317, 0}, {377, 164}} + + + VerticalSplitView + + _collapsingFrameDimension + 0.0 + _indexOfCollapsedView + 0 + _percentageOfCollapsedView + 0.0 + isCollapsed + yes + sizes + + {{0, 0}, {694, 164}} + {{0, 164}, {694, 216}} + + + + LauncherConfigVersion + 8 + PBXProjectModuleGUID + 1C162984064C10D400B95A72 + PBXProjectModuleLabel + Debug - GLUTExamples (Underwater) + + GeometryConfiguration + + DebugConsoleDrawerSize + {100, 120} + DebugConsoleVisible + None + DebugConsoleWindowFrame + {{200, 200}, {500, 300}} + DebugSTDIOWindowFrame + {{200, 200}, {500, 300}} + Frame + {{0, 0}, {694, 380}} + RubberWindowFrame + 321 238 694 422 0 0 1440 878 + + Module + PBXDebugSessionModule + Proportion + 100% + + + Proportion + 100% + + + Name + Debugger + ServiceClasses + + PBXDebugSessionModule + + StatusbarIsVisible + 1 + TableOfContents + + 1CD10A99069EF8BA00B06720 + 1C0AD2AB069F1E9B00FABCE6 + 1C162984064C10D400B95A72 + 1C0AD2AC069F1E9B00FABCE6 + + ToolbarConfiguration + xcode.toolbar.config.debugV3 + WindowString + 321 238 694 422 0 0 1440 878 + WindowToolGUID + 1CD10A99069EF8BA00B06720 + WindowToolIsVisible + 0 + + + Identifier + windowTool.build + Layout + + + Dock + + + ContentConfiguration + + PBXProjectModuleGUID + 1CD0528F0623707200166675 + PBXProjectModuleLabel + <No Editor> + PBXSplitModuleInNavigatorKey + + Split0 + + PBXProjectModuleGUID + 1CD052900623707200166675 + + SplitCount + 1 + + StatusBarVisibility + 1 + + GeometryConfiguration + + Frame + {{0, 0}, {500, 215}} + RubberWindowFrame + 192 257 500 500 0 0 1280 1002 + + Module + PBXNavigatorGroup + Proportion + 218pt + + + BecomeActive + 1 + ContentConfiguration + + PBXProjectModuleGUID + XCMainBuildResultsModuleGUID + PBXProjectModuleLabel + Build + + GeometryConfiguration + + Frame + {{0, 222}, {500, 236}} + RubberWindowFrame + 192 257 500 500 0 0 1280 1002 + + Module + PBXBuildResultsModule + Proportion + 236pt + + + Proportion + 458pt + + + Name + Build Results + ServiceClasses + + PBXBuildResultsModule + + StatusbarIsVisible + 1 + TableOfContents + + 1C78EAA5065D492600B07095 + 1C78EAA6065D492600B07095 + 1CD0528F0623707200166675 + XCMainBuildResultsModuleGUID + + ToolbarConfiguration + xcode.toolbar.config.buildV3 + WindowString + 192 257 500 500 0 0 1280 1002 + + + Identifier + windowTool.find + Layout + + + Dock + + + Dock + + + ContentConfiguration + + PBXProjectModuleGUID + 1CDD528C0622207200134675 + PBXProjectModuleLabel + <No Editor> + PBXSplitModuleInNavigatorKey + + Split0 + + PBXProjectModuleGUID + 1CD0528D0623707200166675 + + SplitCount + 1 + + StatusBarVisibility + 1 + + GeometryConfiguration + + Frame + {{0, 0}, {781, 167}} + RubberWindowFrame + 62 385 781 470 0 0 1440 878 + + Module + PBXNavigatorGroup + Proportion + 781pt + + + Proportion + 50% + + + BecomeActive + 1 + ContentConfiguration + + PBXProjectModuleGUID + 1CD0528E0623707200166675 + PBXProjectModuleLabel + Project Find + + GeometryConfiguration + + Frame + {{8, 0}, {773, 254}} + RubberWindowFrame + 62 385 781 470 0 0 1440 878 + + Module + PBXProjectFindModule + Proportion + 50% + + + Proportion + 428pt + + + Name + Project Find + ServiceClasses + + PBXProjectFindModule + + StatusbarIsVisible + 1 + TableOfContents + + 1C530D57069F1CE1000CFCEE + 1C530D58069F1CE1000CFCEE + 1C530D59069F1CE1000CFCEE + 1CDD528C0622207200134675 + 1C530D5A069F1CE1000CFCEE + 1CE0B1FE06471DED0097A5F4 + 1CD0528E0623707200166675 + + WindowString + 62 385 781 470 0 0 1440 878 + WindowToolGUID + 1C530D57069F1CE1000CFCEE + WindowToolIsVisible + 0 + + + Identifier + windowTool.snapshots + Layout + + + Dock + + + Module + XCSnapshotModule + Proportion + 100% + + + Proportion + 100% + + + Name + Snapshots + ServiceClasses + + XCSnapshotModule + + StatusbarIsVisible + Yes + ToolbarConfiguration + xcode.toolbar.config.snapshots + WindowString + 315 824 300 550 0 0 1440 878 + WindowToolIsVisible + Yes + + + Identifier + windowTool.debuggerConsole + Layout + + + Dock + + + BecomeActive + 1 + ContentConfiguration + + PBXProjectModuleGUID + 1C78EAAC065D492600B07095 + PBXProjectModuleLabel + Debugger Console + + GeometryConfiguration + + Frame + {{0, 0}, {700, 358}} + RubberWindowFrame + 149 87 700 400 0 0 1440 878 + + Module + PBXDebugCLIModule + Proportion + 358pt + + + Proportion + 358pt + + + Name + Debugger Console + ServiceClasses + + PBXDebugCLIModule + + StatusbarIsVisible + 1 + TableOfContents + + 1C530D5B069F1CE1000CFCEE + 1C530D5C069F1CE1000CFCEE + 1C78EAAC065D492600B07095 + + ToolbarConfiguration + xcode.toolbar.config.consoleV3 + WindowString + 149 87 440 400 0 0 1440 878 + WindowToolGUID + 1C530D5B069F1CE1000CFCEE + WindowToolIsVisible + 0 + + + Identifier + windowTool.scm + Layout + + + Dock + + + ContentConfiguration + + PBXProjectModuleGUID + 1C78EAB2065D492600B07095 + PBXProjectModuleLabel + <No Editor> + PBXSplitModuleInNavigatorKey + + Split0 + + PBXProjectModuleGUID + 1C78EAB3065D492600B07095 + + SplitCount + 1 + + StatusBarVisibility + 1 + + GeometryConfiguration + + Frame + {{0, 0}, {452, 0}} + RubberWindowFrame + 743 379 452 308 0 0 1280 1002 + + Module + PBXNavigatorGroup + Proportion + 0pt + + + BecomeActive + 1 + ContentConfiguration + + PBXProjectModuleGUID + 1CD052920623707200166675 + PBXProjectModuleLabel + SCM + + GeometryConfiguration + + ConsoleFrame + {{0, 259}, {452, 0}} + Frame + {{0, 7}, {452, 259}} + RubberWindowFrame + 743 379 452 308 0 0 1280 1002 + TableConfiguration + + Status + 30 + FileName + 199 + Path + 197.09500122070312 + + TableFrame + {{0, 0}, {452, 250}} + + Module + PBXCVSModule + Proportion + 262pt + + + Proportion + 266pt + + + Name + SCM + ServiceClasses + + PBXCVSModule + + StatusbarIsVisible + 1 + TableOfContents + + 1C78EAB4065D492600B07095 + 1C78EAB5065D492600B07095 + 1C78EAB2065D492600B07095 + 1CD052920623707200166675 + + ToolbarConfiguration + xcode.toolbar.config.scmV3 + WindowString + 743 379 452 308 0 0 1280 1002 + + + Identifier + windowTool.breakpoints + IsVertical + 0 + Layout + + + Dock + + + BecomeActive + 1 + ContentConfiguration + + PBXBottomSmartGroupGIDs + + 1C77FABC04509CD000000102 + + PBXProjectModuleGUID + 1CE0B1FE06471DED0097A5F4 + PBXProjectModuleLabel + Files + PBXProjectStructureProvided + no + PBXSmartGroupTreeModuleColumnData + + PBXSmartGroupTreeModuleColumnWidthsKey + + 168 + + PBXSmartGroupTreeModuleColumnsKey_v4 + + MainColumn + + + PBXSmartGroupTreeModuleOutlineStateKey_v7 + + PBXSmartGroupTreeModuleOutlineStateExpansionKey + + 1C77FABC04509CD000000102 + + PBXSmartGroupTreeModuleOutlineStateSelectionKey + + + 0 + + + PBXSmartGroupTreeModuleOutlineStateVisibleRectKey + {{0, 0}, {168, 350}} + + PBXTopSmartGroupGIDs + + XCIncludePerspectivesSwitch + 0 + + GeometryConfiguration + + Frame + {{0, 0}, {185, 368}} + GroupTreeTableConfiguration + + MainColumn + 168 + + RubberWindowFrame + 315 424 744 409 0 0 1440 878 + + Module + PBXSmartGroupTreeModule + Proportion + 185pt + + + ContentConfiguration + + PBXProjectModuleGUID + 1CA1AED706398EBD00589147 + PBXProjectModuleLabel + Detail + + GeometryConfiguration + + Frame + {{190, 0}, {554, 368}} + RubberWindowFrame + 315 424 744 409 0 0 1440 878 + + Module + XCDetailModule + Proportion + 554pt + + + Proportion + 368pt + + + MajorVersion + 3 + MinorVersion + 0 + Name + Breakpoints + ServiceClasses + + PBXSmartGroupTreeModule + XCDetailModule + + StatusbarIsVisible + 1 + TableOfContents + + 1CDDB66807F98D9800BB5817 + 1CDDB66907F98D9800BB5817 + 1CE0B1FE06471DED0097A5F4 + 1CA1AED706398EBD00589147 + + ToolbarConfiguration + xcode.toolbar.config.breakpointsV3 + WindowString + 315 424 744 409 0 0 1440 878 + WindowToolGUID + 1CDDB66807F98D9800BB5817 + WindowToolIsVisible + 1 + + + Identifier + windowTool.debugAnimator + Layout + + + Dock + + + Module + PBXNavigatorGroup + Proportion + 100% + + + Proportion + 100% + + + Name + Debug Visualizer + ServiceClasses + + PBXNavigatorGroup + + StatusbarIsVisible + 1 + ToolbarConfiguration + xcode.toolbar.config.debugAnimatorV3 + WindowString + 100 100 700 500 0 0 1280 1002 + + + Identifier + windowTool.bookmarks + Layout + + + Dock + + + Module + PBXBookmarksModule + Proportion + 166pt + + + Proportion + 166pt + + + Name + Bookmarks + ServiceClasses + + PBXBookmarksModule + + StatusbarIsVisible + 0 + WindowString + 538 42 401 187 0 0 1280 1002 + + + Identifier + windowTool.projectFormatConflicts + Layout + + + Dock + + + Module + XCProjectFormatConflictsModule + Proportion + 100% + + + Proportion + 100% + + + Name + Project Format Conflicts + ServiceClasses + + XCProjectFormatConflictsModule + + StatusbarIsVisible + 0 + WindowContentMinSize + 450 300 + WindowString + 50 850 472 307 0 0 1440 877 + + + Identifier + windowTool.classBrowser + Layout + + + Dock + + + BecomeActive + 1 + ContentConfiguration + + OptionsSetName + Hierarchy, all classes + PBXProjectModuleGUID + 1CA6456E063B45B4001379D8 + PBXProjectModuleLabel + Class Browser - NSObject + + GeometryConfiguration + + ClassesFrame + {{0, 0}, {369, 96}} + ClassesTreeTableConfiguration + + PBXClassNameColumnIdentifier + 208 + PBXClassBookColumnIdentifier + 22 + + Frame + {{0, 0}, {616, 353}} + MembersFrame + {{0, 105}, {369, 395}} + MembersTreeTableConfiguration + + PBXMemberTypeIconColumnIdentifier + 22 + PBXMemberNameColumnIdentifier + 216 + PBXMemberTypeColumnIdentifier + 94 + PBXMemberBookColumnIdentifier + 22 + + PBXModuleWindowStatusBarHidden2 + 1 + RubberWindowFrame + 597 125 616 374 0 0 1280 1002 + + Module + PBXClassBrowserModule + Proportion + 354pt + + + Proportion + 354pt + + + Name + Class Browser + ServiceClasses + + PBXClassBrowserModule + + StatusbarIsVisible + 0 + TableOfContents + + 1C78EABA065D492600B07095 + 1C78EABB065D492600B07095 + 1CA6456E063B45B4001379D8 + + ToolbarConfiguration + xcode.toolbar.config.classbrowser + WindowString + 597 125 616 374 0 0 1280 1002 + + + Identifier + windowTool.refactoring + IncludeInToolsMenu + 0 + Layout + + + Dock + + + BecomeActive + 1 + GeometryConfiguration + + Frame + {0, 0}, {500, 335} + RubberWindowFrame + {0, 0}, {500, 335} + + Module + XCRefactoringModule + Proportion + 100% + + + Proportion + 100% + + + Name + Refactoring + ServiceClasses + + XCRefactoringModule + + WindowString + 200 200 500 356 0 0 1920 1200 + + + + diff --git a/BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/AllBulletDemos_Prefix.pch b/BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/AllBulletDemos_Prefix.pch new file mode 100644 index 00000000..f1d2c118 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/AllBulletDemos_Prefix.pch @@ -0,0 +1,7 @@ +// +// Prefix header for all source files of the 'AllBulletDemos' target in the 'AllBulletDemos' project +// + +#ifdef __OBJC__ + #import +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/BulletIcon.icns b/BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/BulletIcon.icns new file mode 100644 index 0000000000000000000000000000000000000000..1429602ce60360b8a4f8238c60b7fbc08505dd12 GIT binary patch literal 28472 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 A(*OVf literal 0 HcmV?d00001 diff --git a/BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/BulletIcon.psd b/BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/BulletIcon.psd new file mode 100644 index 0000000000000000000000000000000000000000..c0b4a99c98e71bf4d1248a33d32738024e8fa106 GIT binary patch literal 101941 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 a!Y*1dX%G66ZqL#C$|bw0ZoP5@jOGW1ArT7z literal 0 HcmV?d00001 diff --git a/BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/English.lproj/MainMenu.xib b/BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/English.lproj/MainMenu.xib new file mode 100644 index 00000000..6a63aae5 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/English.lproj/MainMenu.xib @@ -0,0 +1,2157 @@ + + + + 1040 + 9E17 + 670 + 949.33 + 352.00 + + YES + + + + + YES + com.apple.InterfaceBuilderKit + com.apple.InterfaceBuilder.CocoaPlugin + + + YES + + NSApplication + + + FirstResponder + + + NSApplication + + + AMainMenu + + YES + + + AllBulletDemos + + 1048576 + 2147483647 + + NSImage + NSMenuCheckmark + + + NSImage + NSMenuMixedState + + submenuAction: + + AllBulletDemos + + YES + + + About AllBulletDemos + + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + UHJlZmVyZW5jZXPigKY + , + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Services + + 1048576 + 2147483647 + + + submenuAction: + + Services + + YES + + _NSServicesMenu + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Hide AllBulletDemos + h + 1048576 + 2147483647 + + + + + + Hide Others + h + 1572864 + 2147483647 + + + + + + Show All + + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Quit AllBulletDemos + q + 1048576 + 2147483647 + + + + + _NSAppleMenu + + + + + File + + 2147483647 + + + submenuAction: + + File + + YES + + + Reset Current Demo + r + 1048576 + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Close + w + 1048576 + 2147483647 + + + + + + + + + View + + 1048576 + 2147483647 + + + submenuAction: + + View + + YES + + + Previous Demo + [ + 1048576 + 2147483647 + + + + + + Next Demo + ] + 1048576 + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Fullscreen + F + 1048576 + 2147483647 + + + + + + + + + Window + + 1048576 + 2147483647 + + + submenuAction: + + Window + + YES + + + Minimize + m + 1048576 + 2147483647 + + + + + + Zoom + + 1048576 + 2147483647 + + + + + + YES + YES + + + 1048576 + 2147483647 + + + + + + Bring All to Front + + 1048576 + 2147483647 + + + + + + YES + YES + + + 2147483647 + + + + + + Show Paramaters + P + 1048576 + 2147483647 + + + + + _NSWindowsMenu + + + + _NSMainMenu + + + 15 + 2 + {{500, 363}, {593, 360}} + 1954021376 + All Bullet Demos + NSWindow + + {3.40282e+38, 3.40282e+38} + {593, 360} + + + 256 + + YES + + + 274 + {593, 320} + + BTOpenGLView + + + + 268 + {{17, 328}, {210, 22}} + + YES + + -2076049856 + 133120 + + LucidaGrande + 1.100000e+01 + 3100 + + + 109199615 + 129 + + + 400 + 75 + + + Item 1 + + 1048576 + 2147483647 + 1 + + + _popUpItemAction: + + + YES + + OtherViews + + YES + + + + Item 2 + + 1048576 + 2147483647 + + + _popUpItemAction: + + + + + Item 3 + + 1048576 + 2147483647 + + + _popUpItemAction: + + + + + 1 + YES + YES + 2 + + + + + 265 + {{489, 331}, {86, 18}} + + YES + + 67239424 + 131072 + Fullscreen + + + 1211912703 + 130 + + NSImage + NSSwitch + + + NSSwitch + + + + 200 + 25 + + + + + 265 + {{393, 331}, {93, 18}} + + YES + + 67239424 + 131072 + Parameters + + + 1211912703 + 130 + + + + + 200 + 25 + + + + + 268 + {{227, 325}, {96, 28}} + + YES + + 67239424 + 134348800 + Reset + + + -2038284033 + 129 + + + 200 + 25 + + + + {593, 360} + + {{0, 0}, {1440, 878}} + {593, 382} + {3.40282e+38, 3.40282e+38} + _main_window_ + + + NSFontManager + + + BTDemosAppController + + + 19 + 2 + {{196, 291}, {276, 219}} + -469762048 + Parameters + NSPanel + + {276, 219} + {276, 219} + + + 256 + + YES + + + 268 + {{17, 177}, {64, 17}} + + YES + + 68288064 + 272630784 + Iterations + + LucidaGrande + 1.300000e+01 + 1044 + + + + 6 + System + controlColor + + 3 + MC42NjY2NjY2OQA + + + + 6 + System + controlTextColor + + 3 + MAA + + + + + + + 268 + {{86, 174}, {121, 22}} + + YES + + -1804468671 + -1874852864 + + + + + YES + + YES + allowsFloats + formatterBehavior + minimum + + + YES + + + + + + # + # + + + + + + + + + + NaN + + YES + + YES + + + YES + + + + + + 0 + 0 + YES + NO + 1 + AAAAAAAAAAAAAAAAAAAAAA + + + 3 + YES + YES + YES + + . + , + NO + YES + YES + + + YES + + 6 + System + textBackgroundColor + + 3 + MQA + + + + 6 + System + textColor + + + + + + + 268 + {{84, 140}, {149, 18}} + + YES + + -2080244224 + 0 + Disable deactivation + + + 1211912703 + 130 + + + + + 200 + 25 + + + + + 12 + {{12, 106}, {252, 5}} + + {0, 0} + + 67239424 + 0 + Box + + + + 3 + MCAwLjgwMDAwMDAxAA + + + 3 + 2 + 0 + NO + + + + 268 + {{212, 171}, {19, 27}} + + YES + + 917024 + 0 + + 1.000000e+02 + 1.000000e+00 + YES + + + + + 268 + {{9, 84}, {69, 17}} + + YES + + 68288064 + 272630784 + Rendering + + + + + + + + + 268 + {{84, 59}, {63, 18}} + + YES + + -2080244224 + 0 + AABBs + + + 1211912703 + 130 + + + + + 200 + 25 + + + + + 268 + {{84, 39}, {113, 18}} + + YES + + -2080244224 + 0 + Wireframe + + + 1211912703 + 130 + + + + + 200 + 25 + + + + + 268 + {{84, 19}, {113, 18}} + + YES + + -2080244224 + 0 + Contacts + + + 1211912703 + 130 + + + + + 200 + 25 + + + + + 268 + {{84, 115}, {149, 18}} + + YES + + -2080244224 + 0 + Enable Split Impulse + + + 1211912703 + 130 + + + + + 200 + 25 + + + + {276, 219} + + + {{0, 0}, {1440, 878}} + {276, 235} + {276, 235} + _parameters_window_ + + + BTSimulationParameters + + + YES + + + + + YES + + + performMiniaturize: + + + + 37 + + + + arrangeInFront: + + + + 39 + + + + orderFrontStandardAboutPanel: + + + + 142 + + + + performZoom: + + + + 240 + + + + hide: + + + + 367 + + + + hideOtherApplications: + + + + 368 + + + + terminate: + + + + 369 + + + + unhideAllApplications: + + + + 370 + + + + _glView + + + + 451 + + + + delegate + + + + 453 + + + + content: demos + + + + + + content: demos + content + demos + 2 + + + 489 + + + + selectedValue: demo + + + + + + selectedValue: demo + selectedValue + demo + + 2 + + + 490 + + + + value: fullscreen + + + + + + value: fullscreen + value + fullscreen + 2 + + + 493 + + + + nextDemo: + + + + 498 + + + + previousDemo: + + + + 499 + + + + _parameters + + + + 526 + + + + value: iterations + + + + + + value: iterations + value + iterations + 2 + + + 527 + + + + maxValue: maxIterations + + + + + + maxValue: maxIterations + maxValue + maxIterations + 2 + + + 531 + + + + minValue: minIterations + + + + + + minValue: minIterations + minValue + minIterations + + 2 + + + 532 + + + + value: iterations + + + + + + value: iterations + value + iterations + + 2 + + + 533 + + + + value: disableDeactivation + + + + + + value: disableDeactivation + value + disableDeactivation + 2 + + + 534 + + + + value: drawAABBs + + + + + + value: drawAABBs + value + drawAABBs + 2 + + + 535 + + + + value: debugDraw + + + + + + value: debugDraw + value + debugDraw + 2 + + + 537 + + + + visible: showParameters + + + + + + visible: showParameters + visible + showParameters + 2 + + + 540 + + + + value: showParameters + + + + + + value: showParameters + value + showParameters + 2 + + + 543 + + + + performClose: + + + + 559 + + + + value: showParameters + + + + + + value: showParameters + value + showParameters + 2 + + + 564 + + + + value: fullscreen + + + + + + value: fullscreen + value + fullscreen + 2 + + + 567 + + + + resetDemo: + + + + 570 + + + + resetDemo: + + + + 573 + + + + value: drawContacts + + + + + + value: drawContacts + value + drawContacts + 2 + + + 576 + + + + nullMenuTarget: + + + + 579 + + + + nullMenuTarget: + + + + 580 + + + + value: splitImpulse + + + + + + value: splitImpulse + value + splitImpulse + 2 + + + 589 + + + + + YES + + 0 + + YES + + + + + + -2 + + + RmlsZSdzIE93bmVyA + + + -1 + + + First Responder + + + -3 + + + Application + + + 29 + + + YES + + + + + + + MainMenu + + + 19 + + + YES + + + + + + 56 + + + YES + + + + + + 57 + + + YES + + + + + + + + + + + + + + + + 58 + + + + + 134 + + + + + 150 + + + + + 136 + + + 1111 + + + 144 + + + + + 129 + + + 121 + + + 143 + + + + + 236 + + + + + 131 + + + YES + + + + + + 149 + + + + + 145 + + + + + 130 + + + + + 24 + + + YES + + + + + + + + + + + 92 + + + + + 5 + + + + + 239 + + + + + 23 + + + + + 295 + + + YES + + + + + + 296 + + + YES + + + + + + + + + 371 + + + YES + + + + + + 372 + + + YES + + + + + + + + + + 420 + + + + + 449 + + + + + 450 + + + + + 483 + + + YES + + + + + + 484 + + + YES + + + + + + 485 + + + YES + + + + + + + + 486 + + + + + 487 + + + + + 488 + + + + + 491 + + + YES + + + + + + 492 + + + + + 496 + + + + + 497 + + + + + 501 + + + + + 503 + + + YES + + + + + + 504 + + + YES + + + + + + + + + + + + + + + 507 + + + YES + + + + + + 508 + + + + + 509 + + + YES + + + + + + 510 + + + YES + + + + + + 511 + + + + + 512 + + + YES + + + + + + 513 + + + + + 514 + + + + + 515 + + + YES + + + + + + 516 + + + + + 517 + + + YES + + + + + + 518 + + + + + 519 + + + YES + + + + + + 520 + + + + + 521 + + + YES + + + + + + 522 + + + + + 523 + + + YES + + + + + + 524 + + + + + 525 + + + + + 538 + + + + + 541 + + + YES + + + + + + 542 + + + + + 544 + + + YES + + + + + + 545 + + + YES + + + + + + + + 550 + + + + + 560 + + + + + 561 + + + + + 562 + + + + + 568 + + + + + 569 + + + + + 571 + + + YES + + + + + + 572 + + + + + 581 + + + YES + + + + + + 582 + + + + + + + YES + + YES + -1.IBPluginDependency + -2.IBPluginDependency + -3.IBPluginDependency + 129.IBPluginDependency + 129.ImportedFromIB2 + 130.IBPluginDependency + 130.ImportedFromIB2 + 130.editorWindowContentRectSynchronizationRect + 131.IBPluginDependency + 131.ImportedFromIB2 + 134.IBPluginDependency + 134.ImportedFromIB2 + 136.IBPluginDependency + 136.ImportedFromIB2 + 143.IBPluginDependency + 143.ImportedFromIB2 + 144.IBPluginDependency + 144.ImportedFromIB2 + 145.IBPluginDependency + 145.ImportedFromIB2 + 149.IBPluginDependency + 149.ImportedFromIB2 + 150.IBPluginDependency + 150.ImportedFromIB2 + 19.IBPluginDependency + 19.ImportedFromIB2 + 23.IBPluginDependency + 23.ImportedFromIB2 + 236.IBPluginDependency + 236.ImportedFromIB2 + 239.IBPluginDependency + 239.ImportedFromIB2 + 24.IBEditorWindowLastContentRect + 24.IBPluginDependency + 24.ImportedFromIB2 + 24.editorWindowContentRectSynchronizationRect + 29.IBEditorWindowLastContentRect + 29.IBPluginDependency + 29.ImportedFromIB2 + 29.WindowOrigin + 29.editorWindowContentRectSynchronizationRect + 295.IBPluginDependency + 296.IBEditorWindowLastContentRect + 296.IBPluginDependency + 296.editorWindowContentRectSynchronizationRect + 371.IBEditorWindowLastContentRect + 371.IBPluginDependency + 371.IBWindowTemplateEditedContentRect + 371.NSWindowTemplate.visibleAtLaunch + 371.editorWindowContentRectSynchronizationRect + 371.windowTemplate.hasMinSize + 371.windowTemplate.maxSize + 371.windowTemplate.minSize + 372.IBPluginDependency + 449.IBPluginDependency + 450.IBPluginDependency + 483.IBPluginDependency + 484.IBPluginDependency + 485.IBPluginDependency + 486.IBPluginDependency + 487.IBPluginDependency + 488.IBPluginDependency + 491.IBPluginDependency + 492.IBPluginDependency + 496.IBPluginDependency + 497.IBPluginDependency + 5.IBPluginDependency + 5.ImportedFromIB2 + 501.IBPluginDependency + 503.IBEditorWindowLastContentRect + 503.IBPluginDependency + 503.IBWindowTemplateEditedContentRect + 503.NSWindowTemplate.visibleAtLaunch + 503.windowTemplate.hasMaxSize + 503.windowTemplate.hasMinSize + 503.windowTemplate.maxSize + 503.windowTemplate.minSize + 504.IBPluginDependency + 507.IBPluginDependency + 508.IBPluginDependency + 509.IBPluginDependency + 510.IBPluginDependency + 511.IBPluginDependency + 512.IBPluginDependency + 513.IBPluginDependency + 514.IBPluginDependency + 515.IBPluginDependency + 516.IBPluginDependency + 517.IBPluginDependency + 518.IBPluginDependency + 519.IBPluginDependency + 520.IBPluginDependency + 521.IBPluginDependency + 522.IBPluginDependency + 523.IBPluginDependency + 524.IBPluginDependency + 525.IBPluginDependency + 541.IBPluginDependency + 542.IBPluginDependency + 544.IBPluginDependency + 545.IBEditorWindowLastContentRect + 545.IBPluginDependency + 550.IBPluginDependency + 56.IBPluginDependency + 56.ImportedFromIB2 + 560.IBPluginDependency + 561.IBPluginDependency + 562.IBPluginDependency + 568.IBPluginDependency + 569.IBPluginDependency + 57.IBEditorWindowLastContentRect + 57.IBPluginDependency + 57.ImportedFromIB2 + 57.editorWindowContentRectSynchronizationRect + 571.IBPluginDependency + 572.IBPluginDependency + 58.IBPluginDependency + 58.ImportedFromIB2 + 581.IBPluginDependency + 582.IBPluginDependency + 92.IBPluginDependency + 92.ImportedFromIB2 + + + YES + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilderKit + com.apple.InterfaceBuilderKit + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + {{436, 809}, {64, 6}} + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + + {{526, 428}, {211, 103}} + com.apple.InterfaceBuilder.CocoaPlugin + + {{525, 802}, {197, 73}} + {{293, 531}, {316, 20}} + com.apple.InterfaceBuilder.CocoaPlugin + + {74, 862} + {{6, 978}, {478, 20}} + com.apple.InterfaceBuilder.CocoaPlugin + {{390, 212}, {192, 73}} + com.apple.InterfaceBuilder.CocoaPlugin + {{475, 832}, {234, 43}} + {{1073, 539}, {593, 360}} + com.apple.InterfaceBuilder.CocoaPlugin + {{1073, 539}, {593, 360}} + + {{33, 99}, {480, 360}} + + {3.40282e+38, 3.40282e+38} + {593, 360} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + {{378, 681}, {276, 219}} + com.apple.InterfaceBuilder.CocoaPlugin + {{378, 681}, {276, 219}} + + + + {276, 219} + {276, 219} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{348, 232}, {218, 53}} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + {{219, 102}, {242, 183}} + com.apple.InterfaceBuilder.CocoaPlugin + + {{23, 794}, {245, 183}} + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + com.apple.InterfaceBuilder.CocoaPlugin + + + + + YES + + YES + + + YES + + + + + YES + + YES + + + YES + + + + 589 + + + + YES + + BTDemosAppController + NSObject + + YES + + YES + nextDemo: + nullMenuTarget: + previousDemo: + resetDemo: + toggleFullscreen: + toggleParameters: + + + YES + id + id + id + id + id + id + + + + YES + + YES + _glView + _parameters + + + YES + BTOpenGLView + BTSimulationParameters + + + + IBProjectSource + src/BTDemosAppController.h + + + + BTOpenGLView + NSView + + _delegate + id + + + IBProjectSource + src/toolkit/BTOpenGLView.h + + + + BTSimulationParameters + NSObject + + IBProjectSource + src/BTSimulationParameters.h + + + + + 0 + ../AllBulletDemos.xcodeproj + 3 + + diff --git a/BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/Info.plist b/BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/Info.plist new file mode 100644 index 00000000..5081c73b --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/Info.plist @@ -0,0 +1,28 @@ + + + + + CFBundleDevelopmentRegion + English + CFBundleExecutable + ${EXECUTABLE_NAME} + CFBundleIconFile + BulletIcon + CFBundleIdentifier + org.bullet.${PRODUCT_NAME:identifier} + CFBundleInfoDictionaryVersion + 6.0 + CFBundleName + ${PRODUCT_NAME} + CFBundlePackageType + APPL + CFBundleSignature + ???? + CFBundleVersion + 1.0 + NSMainNibFile + MainMenu + NSPrincipalClass + NSApplication + + diff --git a/BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/README.txt b/BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/README.txt new file mode 100644 index 00000000..173847c8 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/README.txt @@ -0,0 +1,6 @@ +To build: +Place AllBulletDemosOSX in bullet-/Extras and build with Xcode. + +Questions: +contact Shamyl Zakariya +shamyl@zakariya.net \ No newline at end of file diff --git a/BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/main.m b/BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/main.m new file mode 100644 index 00000000..699ddd42 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/main.m @@ -0,0 +1,14 @@ +// +// main.m +// AllBulletDemos +// +// Created by Shamyl Zakariya on 5/1/08. +// Copyright Shamyl Zakariya 2008. All rights reserved. +// + +#import + +int main(int argc, char *argv[]) +{ + return NSApplicationMain(argc, (const char **) argv); +} diff --git a/BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/src/BTDemo.h b/BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/src/BTDemo.h new file mode 100644 index 00000000..235353e2 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/src/BTDemo.h @@ -0,0 +1,106 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#import +#import "BTOpenGLDisplayDelegate.h" + +@class BTDemoEntry; + +@interface BTDemo : NSObject { + + NSString *_demoName; + BTDemoEntry *_demo; +} + +/** + @brief Array of all available bullet demos +*/ ++ (NSArray*) demoNames; + +/** + @brief Verify a given string is a demo name +*/ ++ (BOOL) isDemo: (NSString *) demoName; + +/** + @brief Create a demo with a given name + @note Returns nil if the name is not a valid demo name +*/ ++ (BTDemo*) demoWithName: (NSString *) demoName; + +/** + @brief Initialize a demo with a given name +*/ +- (id) initWithDemoName: (NSString *) demoName; + +/** + @brief Reset current demo +*/ +- (void) reset; + +/** + @brief Name of current demo +*/ +- (NSString*) demoName; + +/////////////////////////////////////////////////////////////////////// +// BTOpenGLDisplayDelegate + +- (void) contextCreated; +- (void) contextWillBeDestroyed; +- (void) contextWillResize; +- (void) contextResized: (NSSize) newSize; +- (void) contextDidResize; +- (void) contextStateInvalidated; + +- (void) display: (float) deltaT; + +- (void) keyPressed: (unsigned char) key; +- (void) keyReleased: (unsigned char) key; + +- (void) specialKeyPressed: (unsigned) GLUTKey; +- (void) specialKeyReleased: (unsigned) GLUTKey; + +- (void) mouseButtonPressed: (unsigned) mouseButton; +- (void) mouseButtonReleased: (unsigned) mouseButton; +- (void) mouseMoved: (NSPoint) delta; +- (void) newMousePosition: (NSPoint) newMousePosition; +- (void) scrollWheel: (NSPoint) delta; + +/////////////////////////////////////////////////////////////////////// +// Global simulation properties -- applies to all demos + ++ (void) setIterations: (unsigned) iterations; ++ (unsigned) iterations; + ++ (unsigned) minIterations; ++ (unsigned) maxIterations; + ++ (void) setDisableDeactivation: (BOOL) disableDeactivation; ++ (BOOL) disableDeactivation; + ++ (void) setDrawAABBs: (BOOL) drawAABBs; ++ (BOOL) drawAABBs; + ++ (void) setDebugDraw: (BOOL) debugDraw; ++ (BOOL) debugDraw; + ++ (void) setSplitImpulse: (BOOL) splitImpulse; ++ (BOOL) splitImpulse; + ++ (void) setDrawContacts: (BOOL) drawContacts; ++ (BOOL) drawContacts; + +@end diff --git a/BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/src/BTDemo.mm b/BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/src/BTDemo.mm new file mode 100644 index 00000000..4d64a769 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/src/BTDemo.mm @@ -0,0 +1,408 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#import "BTDemo.h" + +/////////////////////////////////////////////////////////////////////// +// Bullet includes + +#include "LinearMath/btScalar.h" +#include "LinearMath/btMinMax.h" + +#include "DemoApplication.h" +#include "DemoEntries.h" +#include "BulletDynamics/Dynamics/btDiscreteDynamicsWorld.h" + +#include "GLDebugDrawer.h" + +#include "LinearMath/btQuickprof.h" + + +/////////////////////////////////////////////////////////////////////// + +#pragma mark - +#pragma mark Globals + +static NSPoint MousePosition; +static NSSize ViewSize; +static int NumIterations = 10; +static BOOL DisableDeactivation = NO; +static BOOL DrawAABBs = NO; +static BOOL DebugDraw = NO; +static BOOL SplitImpulse = NO; +static BOOL DrawContacts = NO; + +/////////////////////////////////////////////////////////////////////// + +#pragma mark - +#pragma mark BTDemoEntry + +@interface BTDemoEntry : NSObject { + btDemoEntry *ctor; + DemoApplication *demo; +} + +- (id) initWithDemoEntry: (btDemoEntry*) constructor; +- (DemoApplication*) demo; +- (void) reset; + +@end + +@implementation BTDemoEntry + +- (id) initWithDemoEntry: (btDemoEntry*) constructor +{ + if ( self = [super init] ) + { + ctor = constructor; + [self reset]; + } + + return self; +} + +- (void) dealloc +{ + if ( demo ) delete demo; + [super dealloc]; +} + +- (DemoApplication*) demo +{ + return demo; +} + +- (void) reset +{ + if ( demo ) + { + if (demo->getDynamicsWorld()->getDebugDrawer()) + delete demo->getDynamicsWorld()->getDebugDrawer(); + + delete demo; + demo = NULL; + } + + demo = ctor->createFcn(); + btAssert(demo); + + if (demo->getDynamicsWorld()) + { + demo->getDynamicsWorld()->setDebugDrawer(new GLDebugDrawer()); + } + + #ifndef BT_NO_PROFILE + CProfileManager::Reset(); + #endif //BT_NO_PROFILE +} + +@end + +/////////////////////////////////////////////////////////////////////// + +#pragma mark - +#pragma mark BTDemo + + +@implementation BTDemo + ++ (NSArray*) demoNames +{ + static NSMutableArray *DEMOS = nil; + if ( !DEMOS ) + { + DEMOS = [[NSMutableArray alloc] init]; + + btDemoEntry* e = g_demoEntries; + while (e->createFcn) + { + [DEMOS addObject: [NSString stringWithUTF8String: e->name]]; + ++e; + } + } + + return DEMOS; +} + ++ (BOOL) isDemo: (NSString *) demoName +{ + return [[self demoNames] containsObject: demoName]; +} + ++ (BTDemo*) demoWithName: (NSString *) demoName +{ + if ( [BTDemo isDemo: demoName] ) + { + return [[[BTDemo alloc] initWithDemoName: demoName] autorelease]; + } + + return nil; +} + +- (id) initWithDemoName: (NSString *) demoName +{ + if ( self = [super init] ) + { + _demoName = [demoName copy]; + + // now walk the constructor list and find this demo + + btDemoEntry* e = g_demoEntries; + while (e->createFcn) + { + NSString *name = [NSString stringWithCString: e->name]; + if ( [name isEqualToString: demoName] ) + { + _demo = [[BTDemoEntry alloc] initWithDemoEntry: e]; + break; + } + + e++; + } + } + + return self; +} + +- (void) dealloc +{ + [_demoName release]; + [_demo release]; + [super dealloc]; +} + +- (void) reset +{ + [_demo reset]; + + [self contextWillResize]; + [self contextResized: ViewSize]; + [self contextDidResize]; +} + +- (NSString*) demoName +{ + return _demoName; +} + +#pragma mark - +#pragma mark BTOpenGLDisplayDelegate + +- (void) contextCreated +{} + +- (void) contextWillBeDestroyed +{} + +- (void) contextWillResize +{} + +- (void) contextResized: (NSSize) newSize +{ + ViewSize = newSize; + glViewport( 0, 0, (int) newSize.width, (int) newSize.height ); + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + + [_demo demo]->reshape( (int) newSize.width, (int) newSize.height ); +} + +- (void) contextDidResize +{} + +- (void) contextStateInvalidated +{} + +- (void) display: (float) deltaT +{ + DemoApplication *demo = [_demo demo]; + + if ( !demo ) + { + glClearColor( 1, 0.5, 1, 1 ); + glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); + return; + } + + if (SplitImpulse) + { + demo->getDynamicsWorld()->getSolverInfo().m_splitImpulse=1; + } else + { + demo->getDynamicsWorld()->getSolverInfo().m_splitImpulse=0; + } + if (DrawAABBs) + { + demo->setDebugMode(demo->getDebugMode() |btIDebugDraw::DBG_DrawAabb); + } + else + { + demo->setDebugMode(demo->getDebugMode() & (~btIDebugDraw::DBG_DrawAabb)); + } + + if (DebugDraw) + { + demo->setDebugMode(demo->getDebugMode() |btIDebugDraw::DBG_DrawWireframe); + } + else + { + demo->setDebugMode(demo->getDebugMode() & (~btIDebugDraw::DBG_DrawWireframe)); + } + + if (DrawContacts) + { + demo->setDebugMode(demo->getDebugMode() |btIDebugDraw::DBG_DrawContactPoints); + } + else + { + demo->setDebugMode(demo->getDebugMode() & (~btIDebugDraw::DBG_DrawContactPoints)); + } + + if (DisableDeactivation) + { + demo->setDebugMode(demo->getDebugMode() |btIDebugDraw::DBG_NoDeactivation); + } + else + { + demo->setDebugMode(demo->getDebugMode() & (~btIDebugDraw::DBG_NoDeactivation)); + } + + if (demo->getDynamicsWorld() && demo->getDynamicsWorld()->getWorldType() == BT_DISCRETE_DYNAMICS_WORLD) + { + btDiscreteDynamicsWorld* discreteWorld = (btDiscreteDynamicsWorld*) demo->getDynamicsWorld(); + discreteWorld->getSolverInfo().m_numIterations = NumIterations; + } + + if (!demo->isIdle()) + { + demo->clientMoveAndDisplay(); + } + else + { + demo->displayCallback(); + } + +} + +- (void) keyPressed: (unsigned char) key +{ + [_demo demo]->keyboardCallback(key, (int)MousePosition.x, (int)MousePosition.y ); +} + +- (void) keyReleased: (unsigned char) key +{} + +- (void) specialKeyPressed: (unsigned) key +{ + [_demo demo]->specialKeyboard(key,(int)MousePosition.x, (int)MousePosition.y ); +} + +- (void) specialKeyReleased: (unsigned) key +{} + +- (void) mouseButtonPressed: (unsigned) mouseButton +{ + [_demo demo]->mouseFunc( mouseButton, GLUT_DOWN, (int)MousePosition.x, (int)MousePosition.y ); +} + +- (void) mouseButtonReleased: (unsigned) mouseButton +{ + [_demo demo]->mouseFunc( mouseButton, GLUT_UP, (int)MousePosition.x, (int)MousePosition.y ); +} + +- (void) mouseMoved: (NSPoint) delta +{ + [_demo demo]->mouseMotionFunc((int)MousePosition.x, (int)MousePosition.y ); +} + +- (void) newMousePosition: (NSPoint) newMousePosition +{ + // Need to invert Y, since DemoApplication assumes origin at top-left + MousePosition = NSMakePoint( newMousePosition.x, ViewSize.height - newMousePosition.y ); +} + +- (void) scrollWheel: (NSPoint) delta +{} + +#pragma mark - +#pragma mark Global Simulation Properties + ++ (void) setIterations: (unsigned) iterations +{ + NumIterations = iterations; +} + ++ (unsigned) iterations +{ + return NumIterations; +} + ++ (unsigned) minIterations { return 1; } ++ (unsigned) maxIterations { return 1000; } + + ++ (void) setDisableDeactivation: (BOOL) disableDeactivation +{ + DisableDeactivation = disableDeactivation; +} + ++ (BOOL) disableDeactivation +{ + return DisableDeactivation; +} + ++ (void) setDrawAABBs: (BOOL) drawAABBs +{ + DrawAABBs = drawAABBs; +} + ++ (BOOL) drawAABBs +{ + return DrawAABBs; +} + ++ (void) setDebugDraw: (BOOL) debugDraw +{ + DebugDraw = debugDraw; +} + ++ (BOOL) debugDraw +{ + return DebugDraw; +} + ++ (void) setSplitImpulse: (BOOL) splitImpulse +{ + SplitImpulse = splitImpulse; +} + ++ (BOOL) splitImpulse +{ + return SplitImpulse; +} + ++ (void) setDrawContacts: (BOOL) drawContacts +{ + DrawContacts = drawContacts; +} + ++ (BOOL) drawContacts +{ + return DrawContacts; +} + + +@end diff --git a/BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/src/BTDemosAppController.h b/BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/src/BTDemosAppController.h new file mode 100644 index 00000000..62349e3e --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/src/BTDemosAppController.h @@ -0,0 +1,54 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#import +#import "BTOpenGLView.h" +#import "BTSimulationParameters.h" +#import "BTDemo.h" + +@interface BTDemosAppController : NSObject { + + IBOutlet BTOpenGLView* _glView; + IBOutlet BTSimulationParameters *_parameters; + + BTDemo *_currentDemo; + BOOL _showParameters; +} + +/////////////////////////////////////////////////////////////////////// +// Public API + +- (void) setFullscreen: (BOOL) fullscreen; +- (BOOL) fullscreen; + +- (void) setShowParameters: (BOOL) showParameters; +- (BOOL) showParameters; + +- (NSArray*) demos; + +- (void) setDemo: (NSString*) demoName; +- (NSString*) demo; + +/////////////////////////////////////////////////////////////////////// +// IBActions + +- (IBAction) nextDemo: (id) sender; +- (IBAction) previousDemo: (id) sender; +- (IBAction) toggleFullscreen: (id) sender; +- (IBAction) toggleParameters: (id) sender; +- (IBAction) resetDemo: (id) sender; +- (IBAction) nullMenuTarget: (id) sender; + +@end diff --git a/BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/src/BTDemosAppController.m b/BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/src/BTDemosAppController.m new file mode 100644 index 00000000..54447138 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/src/BTDemosAppController.m @@ -0,0 +1,151 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#import "BTDemosAppController.h" + + +@implementation BTDemosAppController + +- (id) init +{ + if ( self = [super init] ) + { + // change cwd to .app/Contents/Resources + NSString *resourcePath = [[NSBundle mainBundle] resourcePath]; + [[NSFileManager defaultManager] changeCurrentDirectoryPath:resourcePath]; + } + + return self; +} + +- (void) awakeFromNib +{} + +#pragma mark - +#pragma mark Public API + +- (void) setFullscreen: (BOOL) fullscreen +{ + [_glView setFullscreen: fullscreen]; +} + +- (BOOL) fullscreen +{ + return [_glView fullscreen]; +} + +- (void) setShowParameters: (BOOL) showParameters +{ + _showParameters = showParameters; +} + +- (BOOL) showParameters +{ + return _showParameters; +} + +- (NSArray*) demos +{ + return [BTDemo demoNames]; +} + +- (void) setDemo: (NSString*) demoName +{ + [_currentDemo release]; + [_glView setDelegate: nil]; + + _currentDemo = [[BTDemo demoWithName: demoName] retain]; + + if ( _currentDemo ) + { + // the demo is the rendering & input delegate for the gl view + [_glView setDelegate: _currentDemo]; + + [_currentDemo contextWillResize]; + [_currentDemo contextResized: [_glView bounds].size]; + [_currentDemo contextDidResize]; + } +} + +- (NSString*) demo +{ + return _currentDemo ? [_currentDemo demoName] : nil; +} + +#pragma mark - +#pragma mark IBActions + +- (IBAction) nextDemo: (id) sender +{ + NSArray *demos = [self demos]; + unsigned index = [demos indexOfObject: [self demo]]; + if ( index != NSNotFound ) + { + index = ( index + 1 ) % [demos count]; + [self setDemo: [demos objectAtIndex: index]]; + } +} + +- (IBAction) previousDemo: (id) sender +{ + NSArray *demos = [self demos]; + unsigned index = [demos indexOfObject: [self demo]]; + if ( index != NSNotFound ) + { + if ( index == 0 ) index = [demos count] - 1; + else index--; + + [self setDemo: [demos objectAtIndex: index]]; + } +} + +- (IBAction) toggleFullscreen: (id) sender +{ + [self setFullscreen: ![self fullscreen]]; +} + +- (IBAction) toggleParameters: (id) sender +{ + [self setShowParameters: ![self showParameters]]; +} + +- (IBAction) resetDemo: (id) sender +{ + [_currentDemo reset]; +} + +- (IBAction) nullMenuTarget: (id) sender +{ + // this handles a 10.4 bug. A menu bound to some property for toggling + // will not invoke unless it has a target and selector set. +} + +#pragma mark - +#pragma mark NSApplicationDelegate + +- (void) applicationDidFinishLaunching: (NSNotification *)aNotification +{ + // note: We load the first demo here and not in -awakeFromNib as the + // OpenGL view is instantiated, but not running yet at that point + + [self setDemo: [[self demos] objectAtIndex:0]]; +} + +- (BOOL) applicationShouldTerminateAfterLastWindowClosed: (NSApplication *)theApplication +{ + return YES; +} + +@end diff --git a/BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/src/BTSimulationParameters.h b/BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/src/BTSimulationParameters.h new file mode 100644 index 00000000..298c9dde --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/src/BTSimulationParameters.h @@ -0,0 +1,47 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#import + +/* + BTSimulationParameters is an instanceable proxy for BTDemo's global + simulation properties. We're doing this so we can bind UI to something + in the nib file. +*/ + +@interface BTSimulationParameters : NSObject {} + +- (void) setIterations: (unsigned) iterations; +- (unsigned) iterations; + +- (unsigned) minIterations; +- (unsigned) maxIterations; + +- (void) setDisableDeactivation: (BOOL) disableDeactivation; +- (BOOL) disableDeactivation; + +- (void) setDrawAABBs: (BOOL) drawAABBs; +- (BOOL) drawAABBs; + +- (void) setDebugDraw: (BOOL) debugDraw; +- (BOOL) debugDraw; + +- (void) setSplitImpulse: (BOOL) splitImpulse; +- (BOOL) splitImpulse; + +- (void) setDrawContacts: (BOOL) drawContacts; +- (BOOL) drawContacts; + +@end diff --git a/BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/src/BTSimulationParameters.m b/BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/src/BTSimulationParameters.m new file mode 100644 index 00000000..ab87cd9b --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/src/BTSimulationParameters.m @@ -0,0 +1,96 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#import "BTSimulationParameters.h" +#import "BTDemo.h" + +@implementation BTSimulationParameters + +- (id) init +{ + if ( self = [super init] ) + {} + + return self; +} + +#pragma mark Public API + +- (void) setIterations: (unsigned) iterations +{ + [BTDemo setIterations: iterations]; +} + +- (unsigned) iterations +{ + return [BTDemo iterations]; +} + +- (unsigned) minIterations { return [BTDemo minIterations]; } +- (unsigned) maxIterations { return [BTDemo maxIterations]; } + + +- (void) setDisableDeactivation: (BOOL) disableDeactivation +{ + [BTDemo setDisableDeactivation: disableDeactivation]; +} + +- (BOOL) disableDeactivation +{ + return [BTDemo disableDeactivation]; +} + +- (void) setDrawAABBs: (BOOL) drawAABBs +{ + [BTDemo setDrawAABBs: drawAABBs]; +} + +- (BOOL) drawAABBs +{ + return [BTDemo drawAABBs];; +} + +- (void) setDebugDraw: (BOOL) debugDraw +{ + [BTDemo setDebugDraw: debugDraw]; +} + +- (BOOL) debugDraw +{ + return [BTDemo debugDraw]; +} + +- (void) setSplitImpulse: (BOOL) splitImpulse +{ + [BTDemo setSplitImpulse: splitImpulse]; +} + +- (BOOL) splitImpulse +{ + return [BTDemo splitImpulse]; +} + + +- (void) setDrawContacts: (BOOL) drawContacts +{ + [BTDemo setDrawContacts: drawContacts]; +} + +- (BOOL) drawContacts +{ + return [BTDemo drawContacts]; +} + +@end diff --git a/BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/src/toolkit/BTFullscreenWindow.h b/BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/src/toolkit/BTFullscreenWindow.h new file mode 100644 index 00000000..3172f95a --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/src/toolkit/BTFullscreenWindow.h @@ -0,0 +1,25 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#import + + +@interface BTFullScreenWindow : NSWindow { + +} + +- (id) initForScreen: (NSScreen *) screen; + +@end diff --git a/BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/src/toolkit/BTFullscreenWindow.m b/BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/src/toolkit/BTFullscreenWindow.m new file mode 100644 index 00000000..2528f6e1 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/src/toolkit/BTFullscreenWindow.m @@ -0,0 +1,48 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#import "BTFullScreenWindow.h" + + +@implementation BTFullScreenWindow + +- (id) initForScreen: (NSScreen *) screen +{ + NSRect frame = [screen frame]; + frame.size.height -= [NSMenuView menuBarHeight]; + + self = [self initWithContentRect: frame + styleMask: NSBorderlessWindowMask + backing: NSBackingStoreBuffered + defer: YES + screen: screen ]; + if ( self ) + { + /* + For some reason, without this + we lose mouse moved events in fullscreen + */ + [self setAcceptsMouseMovedEvents: YES]; + } + + return self; +} + +- (BOOL)canBecomeKeyWindow +{ + return YES; +} + +@end diff --git a/BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/src/toolkit/BTGLUTKeyAdapter.h b/BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/src/toolkit/BTGLUTKeyAdapter.h new file mode 100644 index 00000000..3d19f479 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/src/toolkit/BTGLUTKeyAdapter.h @@ -0,0 +1,46 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef __BT_KEY_CODE_H__ +#define __BT_KEY_CODE_H__ + +#include + +#if defined(__cplusplus) +extern "C" { +#endif + +/** + @brief Determine if a key is a letter. + @return true if @a keycode is a letter, and not a control + or modifier key. E.g., the letter 'b' is, where the Esc key ( BTKey_Escape ) is not. +*/ +extern BOOL BTKeyIsAlpha( int ); + +/** + @brief Determine if a key is a GLUT special key. ( arrow, F-Keys, etc ) +*/ +extern BOOL BTKeyIsSpecial( int keycode ); + +/** + @brief Convert an OS X keycode to GLUT Special key representation +*/ +extern int BTKeyTranslateKeyCodeToSpecial( int ); + +#if defined(__cplusplus) +} +#endif + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/src/toolkit/BTGLUTKeyAdapter.m b/BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/src/toolkit/BTGLUTKeyAdapter.m new file mode 100644 index 00000000..786498d9 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/src/toolkit/BTGLUTKeyAdapter.m @@ -0,0 +1,128 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#import "BTGLUTKeyAdapter.h" +#import + +BOOL BTKeyIsAlpha( int key ) +{ + return !BTKeyIsSpecial( key ); +} + +BOOL BTKeyIsSpecial( int keycode ) +{ + BOOL ret = NO; + switch( keycode ) + { + case NSUpArrowFunctionKey: + case NSDownArrowFunctionKey: + case NSLeftArrowFunctionKey: + case NSRightArrowFunctionKey: + case NSF1FunctionKey: + case NSF2FunctionKey: + case NSF3FunctionKey: + case NSF4FunctionKey: + case NSF5FunctionKey: + case NSF6FunctionKey: + case NSF7FunctionKey: + case NSF8FunctionKey: + case NSF9FunctionKey: + case NSF10FunctionKey: + case NSF11FunctionKey: + case NSF12FunctionKey: + ret = YES; + break; + + default: break; + } + + return ret; +} + + +int BTKeyTranslateKeyCodeToSpecial( int kc ) +{ + int ret = kc; + switch( kc ) + { + case NSUpArrowFunctionKey: + ret = GLUT_KEY_UP; + break; + + case NSDownArrowFunctionKey: + ret = GLUT_KEY_DOWN; + break; + + case NSLeftArrowFunctionKey: + ret = GLUT_KEY_LEFT; + break; + + case NSRightArrowFunctionKey: + ret = GLUT_KEY_RIGHT; + break; + + case NSF1FunctionKey: + ret = GLUT_KEY_F1; + break; + + case NSF2FunctionKey: + ret = GLUT_KEY_F2; + break; + + case NSF3FunctionKey: + ret = GLUT_KEY_F3; + break; + + case NSF4FunctionKey: + ret = GLUT_KEY_F4; + break; + + case NSF5FunctionKey: + ret = GLUT_KEY_F5; + break; + + case NSF6FunctionKey: + ret = GLUT_KEY_F6; + break; + + case NSF7FunctionKey: + ret = GLUT_KEY_F7; + break; + + case NSF8FunctionKey: + ret = GLUT_KEY_F8; + break; + + case NSF9FunctionKey: + ret = GLUT_KEY_F9; + break; + + case NSF10FunctionKey: + ret = GLUT_KEY_F10; + break; + + case NSF11FunctionKey: + ret = GLUT_KEY_F11; + break; + + case NSF12FunctionKey: + ret = GLUT_KEY_F12; + break; + + default: break; + } + + return ret; +} diff --git a/BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/src/toolkit/BTOpenGLDisplayDelegate.h b/BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/src/toolkit/BTOpenGLDisplayDelegate.h new file mode 100644 index 00000000..41d50690 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/src/toolkit/BTOpenGLDisplayDelegate.h @@ -0,0 +1,50 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#import + + +@protocol BTOpenGLDisplayDelegate + +- (void) contextCreated; +- (void) contextWillBeDestroyed; +- (void) contextWillResize; +- (void) contextResized: (NSSize) newSize; +- (void) contextDidResize; +- (void) contextStateInvalidated; + +- (void) display: (float) deltaT; + +/////////////////////////////////////////////////////////////////////// +// ASCII keypresses + +- (void) keyPressed: (unsigned char) key; +- (void) keyReleased: (unsigned char) key; + +/////////////////////////////////////////////////////////////////////// +// GLUT Special Keys, such as GLUT_KEY_LEFT ( "left arrow key" ) + +- (void) specialKeyPressed: (unsigned) GLUTKey; +- (void) specialKeyReleased: (unsigned) GLUTKey; + +/////////////////////////////////////////////////////////////////////// +// Mouse. button is GLUT_LEFT_MOUSE, GLUT_RIGHT_MOUSE, etc. + +- (void) mouseButtonPressed: (unsigned) mouseButton; +- (void) mouseButtonReleased: (unsigned) mouseButton; +- (void) mouseMoved: (NSPoint) delta; +- (void) newMousePosition: (NSPoint) newMousePosition; +- (void) scrollWheel: (NSPoint) delta; +@end diff --git a/BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/src/toolkit/BTOpenGLView.h b/BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/src/toolkit/BTOpenGLView.h new file mode 100644 index 00000000..a5f4c72b --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/src/toolkit/BTOpenGLView.h @@ -0,0 +1,65 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#import +#import +#import "BTOpenGLDisplayDelegate.h" + +@interface BTOpenGLView : NSView +{ + IBOutlet id _delegate; + + BOOL _firstFrame, + _setupBoundsChangeNotification, + _isFullScreen, + _multisample, + _vblSync, + _suppressResize; + + NSOpenGLContext *_windowedContext; + + unsigned int _modifierFlags; + + float _interval, + _currentFPS; + + double _lastFrameTime; + + NSWindow *_fullscreenWindow, + *_windowedWindow; + + NSTimer *_timer; +} + +- (void) setDelegate: (id ) delegate; +- (id ) delegate; + +- (void) setTargetFPS: (float) fps; +- (float) targetFPS; +- (float) currentFPS; + +- (void) setFullscreen: (BOOL) yesno; +- (BOOL) fullscreen; + +- (void) setMultisampleRendering: (BOOL) multisample; +- (BOOL) multisampleRendering; + +- (void) setVBLSync: (BOOL) sync; +- (BOOL) vblSync; + +- (NSOpenGLContext*) openGLContext; + + +@end diff --git a/BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/src/toolkit/BTOpenGLView.m b/BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/src/toolkit/BTOpenGLView.m new file mode 100644 index 00000000..397764a1 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/AllBulletDemosOSX/src/toolkit/BTOpenGLView.m @@ -0,0 +1,603 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#import "BTOpenGLView.h" + +#include +#import +#import + +#import "BTFullScreenWindow.h" +#import "BTGLUTKeyAdapter.h" + +#pragma mark - +#pragma mark Private Methods + +@interface BTOpenGLView (Internal) + +- (void) update; +- (void) boundsDidChange: (NSNotification *) notification; +- (void) setVBL: (BOOL*) vbl forContext: (NSOpenGLContext*) context; +- (void) setMultithreaded: (BOOL) mt; +- (NSOpenGLPixelFormat*) windowedPixelFormat: (BOOL*) antialias; + +@end + +@implementation BTOpenGLView + +#pragma mark - +#pragma mark Bootstrap + +- (id)initWithFrame:(NSRect)frameRect +{ + self = [super initWithFrame:frameRect]; + if (self == nil) + { + NSLog( @"BTOpenGLView::initWithFrame - Unable to init" ); + return nil; + } + + _modifierFlags = 0; + _multisample = YES; + _vblSync = YES; + _firstFrame = YES; + _setupBoundsChangeNotification = NO; + + /* + Set up the windowed context -- it will be assigned to the + view later, not now. + */ + _windowedContext = [[NSOpenGLContext alloc] initWithFormat: [self windowedPixelFormat: &_multisample] + shareContext: nil]; + + [self setVBL: &_vblSync forContext: _windowedContext]; + + if (_windowedContext == nil) + { + NSLog(@"Got nil windowed context"); + [self dealloc]; + return nil; + } + + /* + Setup and start the update timer. + */ + _interval = 1.0 / 60.0; + _timer = [[NSTimer scheduledTimerWithTimeInterval: _interval + target: self + selector: @selector(update) + userInfo: nil + repeats: YES ] retain]; + + [[NSRunLoop currentRunLoop] addTimer: _timer forMode: NSEventTrackingRunLoopMode]; + + return self; +} + +- (void)dealloc +{ + [_timer invalidate]; + [_timer release]; + + [_delegate contextWillBeDestroyed]; + + [_windowedContext release]; + + [[NSNotificationCenter defaultCenter] removeObserver: self]; + + [super dealloc]; +} + +- (void) awakeFromNib +{ + NSWindow *window = [self window]; + [window setAcceptsMouseMovedEvents: YES]; + [window makeFirstResponder: self]; + [window setInitialFirstResponder: self]; +} + +- (void)drawRect:(NSRect)rect +{ + [self update]; +} + +#pragma mark - +#pragma mark Public API + +- (void) setDelegate: (id ) delegate +{ + // we don't retain delegates + _delegate = delegate; +} + +- (id ) delegate +{ + return _delegate; +} + +- (void) setTargetFPS: (float) fps +{ + float newInterval = 1.0 / fps; + if ( ABS( newInterval - _interval ) > 1.0e-3 ) + { + _interval = newInterval; + + [_timer invalidate]; + [_timer release]; + + _timer = [[NSTimer scheduledTimerWithTimeInterval: _interval + target: self + selector: @selector(update) + userInfo: nil + repeats: YES ] retain]; + + [[NSRunLoop currentRunLoop] addTimer: _timer forMode: NSEventTrackingRunLoopMode]; + } + +} + +- (float) targetFPS +{ + return 1.0 / _interval; +} + +- (float) currentFPS +{ + return _currentFPS; +} + +- (void) setFullscreen: (BOOL) fullscreen +{ + if ( fullscreen == _isFullScreen ) return; + + _isFullScreen = fullscreen; + _suppressResize = YES; + + if ( _isFullScreen ) + { + _windowedWindow = [self window]; + + /* + Detach & retain the content view from the non-fullscreen window. + */ + + NSView *contentView = [_windowedWindow contentView]; + [contentView retain]; + [contentView removeFromSuperviewWithoutNeedingDisplay]; + + /* + Create a fullscreen window, attach the content view, + and release the content view since the fullscreen window retained it. + */ + + _fullscreenWindow = [[BTFullScreenWindow alloc] initForScreen: [_windowedWindow screen]]; + [_fullscreenWindow setContentView: contentView ]; + [_fullscreenWindow makeKeyAndOrderFront:nil]; + [contentView release]; + + /* + Hide the old window + */ + [_windowedWindow orderOut: nil]; + + /* + Now, use the SetSystemUIMode API to auto-hide the dock + */ + + OSStatus error = SetSystemUIMode( kUIModeContentSuppressed, 0 ); + if ( error != noErr) + { + NSLog(@"Error couldn't set SystemUIMode: %ld", (long)error); + } + + } + else if ( _fullscreenWindow ) + { + /* + Detach and retain the content view from the fullscreen window + */ + NSView *contentView = [_fullscreenWindow contentView]; + [contentView retain]; + [contentView removeFromSuperviewWithoutNeedingDisplay]; + + /* + Reparent the content view to the non-fullscreen window, + and release it since it's now owned by the non-fullscreen window + */ + [_windowedWindow setContentView: contentView]; + [contentView release]; + + [_windowedWindow makeKeyAndOrderFront: nil]; + + /* + Release the fullscreen window + */ + [_fullscreenWindow orderOut: nil]; + [_fullscreenWindow release]; + _fullscreenWindow = nil; + + /* + Restore dock's normal behaior + */ + + OSStatus error = SetSystemUIMode( kUIModeNormal, 0 ); + if ( error != noErr) + { + NSLog(@"Error couldn't set SystemUIMode: %ld", (long)error); + } + } + + _suppressResize = NO; + + [self boundsDidChange: nil]; +} + +- (BOOL) fullscreen +{ + return _isFullScreen; +} + +- (void) setMultisampleRendering: (BOOL) multisample +{ + if ( multisample == _multisample ) return; + + _multisample = multisample; + _firstFrame = YES; + + + NSOpenGLContext *oldWindowedContext = _windowedContext; + _windowedContext = [[NSOpenGLContext alloc] initWithFormat: [self windowedPixelFormat: &_multisample] + shareContext: oldWindowedContext ]; + + [self setVBL: &_vblSync forContext: _windowedContext]; + + [oldWindowedContext release]; + [_windowedContext setView: self]; + [_windowedContext makeCurrentContext]; + [_windowedContext update]; + [self update]; +} + +- (BOOL) multisampleRendering +{ + return _multisample; +} + +- (void) setVBLSync: (BOOL) sync +{ + if ( sync == _vblSync ) return; + + _vblSync = sync; + [self setVBL: &_vblSync forContext: _windowedContext]; +} + +- (BOOL) vblSync +{ + return _vblSync; +} + +- (NSOpenGLContext *) openGLContext +{ + return _windowedContext; +} + +#pragma mark - +#pragma mark NSView Overrides + +- (BOOL) isOpaque +{ + return YES; +} + +- (BOOL) acceptsFirstResponder +{ + return YES; +} + +- (void) keyDown:(NSEvent *)theEvent +{ + int key = [[theEvent charactersIgnoringModifiers] characterAtIndex:0]; + + if ( BTKeyIsAlpha( key )) + { + [ _delegate keyPressed: key ]; + } + else + { + [_delegate specialKeyPressed: BTKeyTranslateKeyCodeToSpecial( key )]; + } +} + +- (void) keyUp:(NSEvent *)theEvent +{ + int key = [[theEvent charactersIgnoringModifiers] characterAtIndex:0]; + + if ( BTKeyIsAlpha( key )) + { + [ _delegate keyReleased: key ]; + } + else + { + [_delegate specialKeyReleased: BTKeyTranslateKeyCodeToSpecial( key )]; + } +} + +- (void) mouseDown: (NSEvent *) event +{ + int button = GLUT_LEFT_BUTTON; + switch( [event buttonNumber] ) + { + case 0: button = GLUT_LEFT_BUTTON; break; + case 1: button = GLUT_RIGHT_BUTTON; break; + case 2: button = GLUT_MIDDLE_BUTTON; break; + default: break; + } + + if ( _modifierFlags & NSControlKeyMask ) button = GLUT_RIGHT_BUTTON; + else if ( _modifierFlags & NSAlternateKeyMask ) button = GLUT_MIDDLE_BUTTON; + + [_delegate mouseButtonPressed: button]; +} + +- (void) mouseUp: (NSEvent *) event +{ + int button = GLUT_LEFT_BUTTON; + switch( [event buttonNumber] ) + { + case 0: button = GLUT_LEFT_BUTTON; break; + case 1: button = GLUT_RIGHT_BUTTON; break; + case 2: button = GLUT_MIDDLE_BUTTON; break; + default: break; + } + + if ( _modifierFlags & NSControlKeyMask ) button = GLUT_RIGHT_BUTTON; + else if ( _modifierFlags & NSAlternateKeyMask ) button = GLUT_MIDDLE_BUTTON; + + [_delegate mouseButtonReleased: button]; +} + +-(void) mouseMoved: (NSEvent *) event +{ + float dx = [event deltaX], + dy = [event deltaY]; + + NSPoint locationInView = [self convertPoint: [event locationInWindow] fromView: nil ]; + + [_delegate mouseMoved: NSMakePoint( dx, dy )]; + [_delegate newMousePosition: locationInView]; +} + +-(void) mouseDragged: (NSEvent *) event +{ + [self mouseMoved: event]; +} + +- (void) scrollWheel: (NSEvent *) event +{ + float dx = [event deltaX], + dy = [event deltaY]; + + [_delegate scrollWheel: NSMakePoint( dx, dy )]; +} + +- (void)flagsChanged:(NSEvent *) event +{ + _modifierFlags = [event modifierFlags]; +} + + +#pragma mark - +#pragma mark Private + +- (void) update +{ + if ( !_setupBoundsChangeNotification ) + { + _setupBoundsChangeNotification = YES; + + /* + This is hacky, but basically, we can't handle bounds-changing + ops correctly until everything's set up correctly. + */ + [self setPostsBoundsChangedNotifications:YES]; + [[NSNotificationCenter defaultCenter] addObserver: self + selector: @selector( boundsDidChange: ) + name: NSViewFrameDidChangeNotification + object: nil]; + } + + if (_firstFrame) + { + [_windowedContext setView:self]; + } + + [_windowedContext makeCurrentContext]; + + if (_firstFrame) + { + _firstFrame = NO; + + [_delegate contextCreated]; + + if ( _multisample ) + { + glEnable (GL_MULTISAMPLE_ARB); + // this fucks up text rendering, on nVIDIA, at least + //glHint (GL_MULTISAMPLE_FILTER_HINT_NV, GL_NICEST); + } + else + { + glDisable( GL_MULTISAMPLE_ARB ); + } + + [self setMultithreaded: NO]; + + NSSize contextSize; + if ( _isFullScreen ) + { + contextSize.width = CGDisplayPixelsWide(kCGDirectMainDisplay); + contextSize.height = CGDisplayPixelsHigh(kCGDirectMainDisplay); + } + else + { + contextSize = [self bounds].size; + } + + [_delegate contextWillResize]; + [_delegate contextResized: contextSize]; + [_delegate contextDidResize]; + [_delegate contextStateInvalidated]; + } + + double now = CFAbsoluteTimeGetCurrent(); + + if ( _delegate) [_delegate display: now - _lastFrameTime]; + else + { + glClearColor( 0.5, 0.5, 0.5, 1 ); + glClear( GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT ); + } + + _lastFrameTime = now; + + + [[NSOpenGLContext currentContext] flushBuffer]; + + /* + Now, update our FPS + */ + + { + static unsigned int frameCounter = 1; + static double lastCheckTime = 0; + + double elapsed = now - lastCheckTime; + if ( elapsed > 1.0 ) + { + _currentFPS = (float) ( ((double) frameCounter ) / elapsed ); + + lastCheckTime = now; + frameCounter = 0; + } + + frameCounter++; + } +} + +- (void) boundsDidChange: (NSNotification *) notification +{ + if ( _suppressResize ) return; + + [_windowedContext setView:self]; + [_windowedContext makeCurrentContext]; + [_windowedContext update]; + + NSSize contextSize = [self bounds].size; + + if ( _delegate ) + { + [_delegate contextWillResize]; + [_delegate contextResized: contextSize ]; + [_delegate contextDidResize]; + } + else + { + glViewport( 0, 0, (int) contextSize.width, (int) contextSize.height ); + } +} + +- (void) setVBL: (BOOL*) vbl forContext: (NSOpenGLContext*) context +{ + GLint value = *vbl ? 1 : 0; + [context setValues: &value forParameter: NSOpenGLCPSwapInterval]; + + *vbl = value ? YES : NO; +} + +- (void) setMultithreaded: (BOOL) mt +{ + CGLError err = kCGLNoError; + CGLContextObj ctx = CGLGetCurrentContext(); + + // Enable Apple's multi-threaded GL engine -- it's generally useful for + // high vertex throughput. Not high fragment situations + + if ( mt ) + { + err = CGLEnable( ctx, kCGLCEMPEngine ); + } + else + { + err = CGLDisable( ctx, kCGLCEMPEngine ); + } + + if (err != kCGLNoError ) + { + NSLog( @"BTOpenGLView -setMultithreaded: forContext: -- Unable to %s multithreaded GL", + mt ? "enable" : "disable" ); + } +} + +- (NSOpenGLPixelFormat*) windowedPixelFormat: (BOOL*) antialias +{ + NSOpenGLPixelFormatAttribute aaAttrs[] = + { + NSOpenGLPFADoubleBuffer, + NSOpenGLPFAAccelerated, + NSOpenGLPFADepthSize, (NSOpenGLPixelFormatAttribute)32, + NSOpenGLPFAStencilSize, (NSOpenGLPixelFormatAttribute)0, + NSOpenGLPFASingleRenderer, + NSOpenGLPFASampleBuffers, (NSOpenGLPixelFormatAttribute)( 1 ), + NSOpenGLPFASamples, (NSOpenGLPixelFormatAttribute)( 4 ), + NSOpenGLPFAScreenMask, (NSOpenGLPixelFormatAttribute) CGDisplayIDToOpenGLDisplayMask(kCGDirectMainDisplay), + NSOpenGLPFANoRecovery, + (NSOpenGLPixelFormatAttribute)0 + }; + + NSOpenGLPixelFormatAttribute vanillaAttrs[] = + { + NSOpenGLPFADoubleBuffer, + NSOpenGLPFAAccelerated, + NSOpenGLPFADepthSize, (NSOpenGLPixelFormatAttribute)32, + NSOpenGLPFAStencilSize, (NSOpenGLPixelFormatAttribute)0, + NSOpenGLPFASingleRenderer, + NSOpenGLPFASampleBuffers, (NSOpenGLPixelFormatAttribute)( 0 ), + NSOpenGLPFASamples, (NSOpenGLPixelFormatAttribute)( 0 ), + NSOpenGLPFAScreenMask, (NSOpenGLPixelFormatAttribute) CGDisplayIDToOpenGLDisplayMask(kCGDirectMainDisplay), + NSOpenGLPFANoRecovery, + (NSOpenGLPixelFormatAttribute)0 + }; + + NSOpenGLPixelFormat* fmt = 0; + + if ( *antialias ) + { + fmt = [[NSOpenGLPixelFormat alloc] initWithAttributes: (NSOpenGLPixelFormatAttribute*) aaAttrs]; + if ( nil == fmt ) + { + *antialias = NO; + fmt = [[NSOpenGLPixelFormat alloc] initWithAttributes: (NSOpenGLPixelFormatAttribute*) vanillaAttrs]; + } + } + else + { + fmt = [[NSOpenGLPixelFormat alloc] initWithAttributes: (NSOpenGLPixelFormatAttribute*) vanillaAttrs]; + } + + return fmt; +} + + +@end diff --git a/BulletPhysics/bulletTrunk/Extras/BulletColladaConverter/CMakeLists.txt b/BulletPhysics/bulletTrunk/Extras/BulletColladaConverter/CMakeLists.txt new file mode 100644 index 00000000..f57bca05 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/BulletColladaConverter/CMakeLists.txt @@ -0,0 +1,12 @@ +INCLUDE_DIRECTORIES( +${BULLET_PHYSICS_SOURCE_DIR}/src ${BULLET_PHYSICS_SOURCE_DIR}/Extras/ConvexHull ${BULLET_PHYSICS_SOURCE_DIR}/Extras/BulletColladaConverter ${BULLET_PHYSICS_SOURCE_DIR}/Extras/LibXML/include ${BULLET_PHYSICS_SOURCE_DIR}/Extras/COLLADA_DOM/include ${BULLET_PHYSICS_SOURCE_DIR}/Extras/COLLADA_DOM/include/1.4 +) + +ADD_LIBRARY(BulletColladaConverter + ColladaConverter.h + ColladaConverter.cpp +) + +IF (BUILD_SHARED_LIBS) + TARGET_LINK_LIBRARIES(BulletColladaConverter ColladaDom BulletCollision BulletDynamics) +ENDIF (BUILD_SHARED_LIBS) diff --git a/BulletPhysics/bulletTrunk/Extras/BulletColladaConverter/ColladaConverter.cpp b/BulletPhysics/bulletTrunk/Extras/BulletColladaConverter/ColladaConverter.cpp new file mode 100644 index 00000000..9d835a91 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/BulletColladaConverter/ColladaConverter.cpp @@ -0,0 +1,3714 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +///@todo fix naming conflicts with BulletUnnamed-* across executions -> need to generate a real unique name. +///@todo double check geometry sharing + +#include "ColladaConverter.h" +#include "btBulletDynamicsCommon.h" + +#include "dae.h" +#include "dom/domCOLLADA.h" +#include "dae/domAny.h" +#include "dom/domConstants.h" +#include + +#include "BulletCollision/CollisionShapes/btShapeHull.h" +#include "BulletCollision/CollisionShapes/btScaledBvhTriangleMeshShape.h" +#include "BulletCollision/CollisionShapes/btBoxShape.h" +#include "BulletCollision/CollisionShapes/btSphereShape.h" +#include "BulletCollision/CollisionShapes/btCylinderShape.h" +#include "BulletCollision/CollisionShapes/btConeShape.h" +#include "BulletCollision/CollisionShapes/btStaticPlaneShape.h" +#include "BulletCollision/CollisionShapes/btConvexHullShape.h" +#include "BulletCollision/CollisionShapes/btTriangleMesh.h" +#include "BulletCollision/CollisionShapes/btConvexTriangleMeshShape.h" +#include "BulletCollision/CollisionShapes/btTriangleMeshShape.h" +#include "BulletDynamics/ConstraintSolver/btGeneric6DofConstraint.h" +//#include "BulletCollision/CollisionShapes/btTriangleIndexVertexArray.h" +#include "BulletCollision/CollisionShapes/btCompoundShape.h" +#include "LinearMath/btDefaultMotionState.h" +#include "BulletCollision/Gimpact/btGImpactShape.h" + + +#ifdef WIN32 +#define snprintf _snprintf +#endif + +#ifdef __CELLOS_LV2__ +//provide some dummy stubs for getcwd and getenv on PS3 +extern "C" { + int getcwd(char* dir, int maxlen) + { + return 0; + } + int getenv(int bla) + { + return 0; + } +} +#endif + + +struct btRigidBodyInput +{ + domInstance_rigid_bodyRef m_instanceRigidBodyRef; + domRigid_bodyRef m_rigidBodyRef2; + domNodeRef m_nodeRef; + + char* m_bodyName; +}; + +struct ConstraintInput +{ + domInstance_physics_model* m_instance_physicsModelRef; + domPhysics_modelRef m_model; +}; + + +struct btRigidBodyOutput +{ + float m_mass; + bool m_isDynamics; + btCollisionShape* m_colShape; + btCompoundShape* m_compoundShape; +}; + + +int btRigidBodyColladaInfo::getUid() +{ + return m_body->getBroadphaseProxy()->getUid(); +} + + + + + + + + +int btRigidConstraintColladaInfo::getUid() +{ + if (m_typedConstraint->getUid()==-1) + { + static int gConstraintUidGenerator=5; + m_typedConstraint->setUserConstraintId(gConstraintUidGenerator); + gConstraintUidGenerator++; + } + return m_typedConstraint->getUid(); +} + + + +domMatrix_Array emptyMatrixArray; + +///This code is actually wrong: the order of transformations is lost, so we need to rewrite this! +btTransform GetbtTransformFromCOLLADA_DOM(domMatrix_Array& matrixArray, + domRotate_Array& rotateArray, + domTranslate_Array& translateArray, + float meterScaling + ) + +{ + btTransform startTransform; + startTransform.setIdentity(); + + unsigned int i; + //either load the matrix (worldspace) or incrementally build the transform from 'translate'/'rotate' + for (i=0;igetValue(); + btVector3 origin(fl16.get(3),fl16.get(7),fl16.get(11)); + startTransform.setOrigin(origin*meterScaling); + btMatrix3x3 basis(fl16.get(0),fl16.get(1),fl16.get(2), + fl16.get(4),fl16.get(5),fl16.get(6), + fl16.get(8),fl16.get(9),fl16.get(10)); + startTransform.setBasis(basis); + } + + for (i=0;igetValue(); + float angleRad = SIMD_RADS_PER_DEG*fl4.get(3); + btQuaternion rotQuat(btVector3(fl4.get(0),fl4.get(1),fl4.get(2)),angleRad); + startTransform.getBasis() = startTransform.getBasis() * btMatrix3x3(rotQuat); + } + + for (i=0;igetValue(); + btVector3 orgTrans(fl3.get(0),fl3.get(1),fl3.get(2)); + startTransform.getOrigin() += orgTrans*meterScaling; + } + return startTransform; +} + + + + + +ColladaConverter::ColladaConverter(btDynamicsWorld* dynaWorld) +:m_dynamicsWorld(dynaWorld), +m_collada(0), +m_dom(0), +m_filename(0), +m_unitMeterScaling(1.f), +m_use32bitIndices(true), +m_use4componentVertices(true) +{ +} + +ColladaConverter::~ColladaConverter () +{ + if (m_collada) + delete m_collada; + + DAE::cleanup (); + + m_collada = NULL; + m_dom = NULL; + + int i; + + for(i=0;iload(filename);//,docBuffer); + + if (res != DAE_OK) + { + //some platforms might require different path, try two additional locations + char newname[256]; + sprintf(newname,"../../%s",orgfilename); + filename = fixFileName(newname); + res = m_collada->load(filename); + if (res != DAE_OK) + { + printf("DAE/Collada-m_dom: Couldn't load %s\n",filename); + return false; + } + } + + if (res == DAE_OK) + { + + m_dom = m_collada->getDom(filename); + if ( !m_dom ) + { + printf("COLLADA File loaded to the m_dom, but query for the m_dom assets failed \n" ); + printf("COLLADA Load Aborted! \n" ); + delete m_collada; + return false; + } + } + + convert (); + + return true; +} + + +// resets the collada converter state +void ColladaConverter::reset () +{ + int i; + for(i=0;igetAsset()->getUp_axis(); + int upAxisIndex = upAxis.maxAxis(); + + switch (upAxisIndex) + { + case 0: + { + up->setValue(UPAXISTYPE_X_UP); + break; + } + case 1: + { + up->setValue(UPAXISTYPE_Y_UP); + break; + } + case 2: + { + up->setValue(UPAXISTYPE_Z_UP); + break; + } + default: + { + } + }; + +} + + +bool ColladaConverter::convert() +{ + + unsigned i; + +//succesfully loaded file, now convert data + + if (m_dom->getAsset() && m_dom->getAsset()->getUnit()) + { + domAsset::domUnitRef unit = m_dom->getAsset()->getUnit(); + domFloat meter = unit->getMeter(); + printf("asset unit meter=%f\n",meter); + //m_unitMeterScaling = meter; + + + } + if ( m_dom->getAsset() && m_dom->getAsset()->getUp_axis() ) + { + domAsset::domUp_axis * up = m_dom->getAsset()->getUp_axis(); + switch( up->getValue() ) + { + case UPAXISTYPE_X_UP: + printf(" X is Up Data and Hiearchies must be converted!\n" ); + printf(" Conversion to X axis Up isn't currently supported!\n" ); + printf(" COLLADA_RT defaulting to Y Up \n" ); + setGravity(btVector3(-10,0,0)); + setCameraInfo(btVector3(1,0,0),1); + break; + case UPAXISTYPE_Y_UP: + printf(" Y Axis is Up for this file \n" ); + printf(" COLLADA_RT set to Y Up \n" ); + setGravity(btVector3(0,-10,0)); + setCameraInfo(btVector3(0,1,0),0); + + break; + case UPAXISTYPE_Z_UP: + printf(" Z Axis is Up for this file \n" ); + printf(" All Geometry and Hiearchies must be converted!\n" ); + setGravity(btVector3(0,0,-10)); + break; + default: + + break; + } + } + + + //we don't handle visual objects, physics objects are rered as such + for (unsigned int s=0;sgetLibrary_visual_scenes_array().getCount();s++) + { + domLibrary_visual_scenesRef scenesRef = m_dom->getLibrary_visual_scenes_array()[s]; + for (unsigned int i=0;igetVisual_scene_array().getCount();i++) + { + domVisual_sceneRef sceneRef = scenesRef->getVisual_scene_array()[i]; + for (unsigned int n=0;ngetNode_array().getCount();n++) + { + domNodeRef nodeRef = sceneRef->getNode_array()[n]; + nodeRef->getRotate_array(); + nodeRef->getTranslate_array(); + nodeRef->getScale_array(); + + } + } + } + + + + + // Load all the geometry libraries + for ( i = 0; i < m_dom->getLibrary_geometries_array().getCount(); i++) + { + domLibrary_geometriesRef libgeom = m_dom->getLibrary_geometries_array()[i]; + + printf(" CrtScene::Reading Geometry Library \n" ); + for ( unsigned int i = 0; i < libgeom->getGeometry_array().getCount(); i++) + { + //ReadGeometry( ); + domGeometryRef lib = libgeom->getGeometry_array()[i]; + + domMesh *meshElement = lib->getMesh(); + if (meshElement) + { + // Find out how many groups we need to allocate space for + int numTriangleGroups = (int)meshElement->getTriangles_array().getCount(); + int numPolygonGroups = (int)meshElement->getPolygons_array().getCount(); + int numPolyList = (int)meshElement->getPolylist_array().getCount(); + int totalGroups = numTriangleGroups + numPolygonGroups + numPolyList; + if (totalGroups == 0) + { + printf("No Triangles or Polygons found int Geometry %s \n", lib->getId() ); + } else + { + printf("Found mesh geometry (%s): numTriangleGroups:%i numPolygonGroups :%i numPolyList=%i\n",lib->getId(),numTriangleGroups,numPolygonGroups,numPolyList); + } + + + } + domConvex_mesh *convexMeshElement = lib->getConvex_mesh(); + if (convexMeshElement) + { + printf("found convexmesh element\n"); + // Find out how many groups we need to allocate space for + int numTriangleGroups = (int)convexMeshElement->getTriangles_array().getCount(); + int numPolygonGroups = (int)convexMeshElement->getPolygons_array().getCount(); + + int totalGroups = numTriangleGroups + numPolygonGroups; + if (totalGroups == 0) + { + printf("No Triangles or Polygons found in ConvexMesh Geometry %s \n", lib->getId() ); + }else + { + printf("Found convexmesh geometry: numTriangleGroups:%i numPolygonGroups:%i\n",numTriangleGroups,numPolygonGroups); + } + }//fi + }//for each geometry + + }//for all geometry libraries + + + //m_dom->getLibrary_physics_models_array() + + for ( i = 0; i < m_dom->getLibrary_physics_scenes_array().getCount(); i++) + { + domLibrary_physics_scenesRef physicsScenesRef = m_dom->getLibrary_physics_scenes_array()[i]; + for (unsigned int s=0;sgetPhysics_scene_array().getCount();s++) + { + domPhysics_sceneRef physicsSceneRef = physicsScenesRef->getPhysics_scene_array()[s]; + + if (physicsSceneRef->getTechnique_common()) + { + if (physicsSceneRef->getTechnique_common()->getGravity()) + { + const domFloat3 grav = physicsSceneRef->getTechnique_common()->getGravity()->getValue(); + printf("gravity set to %f,%f,%f\n",grav.get(0),grav.get(1),grav.get(2)); + + setGravity(btVector3(grav.get(0),grav.get(1),grav.get(2))); + } + + } + + for (unsigned int ps=0;psgetInstance_physics_model_array().getCount();ps++) + { + domInstance_physics_modelRef instance_physicsModelRef = physicsSceneRef->getInstance_physics_model_array()[ps]; + + daeElementRef ref = instance_physicsModelRef->getUrl().getElement(); + + domPhysics_modelRef model = *(domPhysics_modelRef*)&ref; + + + unsigned int p,r; + for ( p=0;pgetInstance_physics_model_array().getCount();p++) + { + domInstance_physics_modelRef instancePhysicsModelRef = model->getInstance_physics_model_array()[p]; + + daeElementRef ref = instancePhysicsModelRef->getUrl().getElement(); + + domPhysics_modelRef model = *(domPhysics_modelRef*)&ref; + + ///@todo: group some shared functionality in following 2 'blocks'. + for (r=0;rgetInstance_rigid_body_array().getCount();r++) + { + domInstance_rigid_bodyRef instRigidbodyRef = instancePhysicsModelRef->getInstance_rigid_body_array()[r]; + + btVector3 linearVelocity = btVector3(0.0, 0.0, 0.0); + btVector3 angularVelocity = btVector3(0.0, 0.0, 0.0); + float mass = 1.f; + bool isDynamics = true; + btCollisionShape* colShape = 0; + btCompoundShape* compoundShape = 0; + + xsNCName bodyName = instRigidbodyRef->getBody(); + + domInstance_rigid_body::domTechnique_commonRef techniqueRef = instRigidbodyRef->getTechnique_common(); + if (techniqueRef) + { + if (techniqueRef->getMass()) + { + mass = techniqueRef->getMass()->getValue(); + } + if (techniqueRef->getDynamic()) + { + isDynamics = techniqueRef->getDynamic()->getValue(); + } + if (techniqueRef->getVelocity()) + { + linearVelocity = btVector3( + techniqueRef->getVelocity()->getValue()[0], + techniqueRef->getVelocity()->getValue()[1], + techniqueRef->getVelocity()->getValue()[2]); + + } + if (techniqueRef->getAngular_velocity()) + { + angularVelocity = btVector3( + techniqueRef->getAngular_velocity()->getValue()[0], + techniqueRef->getAngular_velocity()->getValue()[1], + techniqueRef->getAngular_velocity()->getValue()[2]); + + } + } + + printf("mass = %f, isDynamics %i\n",mass,isDynamics); + + if (bodyName && model) + { + //try to find the rigid body + + for (unsigned int r=0;rgetRigid_body_array().getCount();r++) + { + domRigid_bodyRef rigidBodyRef = model->getRigid_body_array()[r]; + if (rigidBodyRef->getSid() && !strcmp(rigidBodyRef->getSid(),bodyName)) + { + + + btRigidBodyOutput output; + output.m_colShape = colShape; + output.m_compoundShape = compoundShape; + output.m_mass = 1.f; + output.m_isDynamics = true; + + btRigidBodyInput rbInput; + rbInput.m_rigidBodyRef2 = rigidBodyRef; + rbInput.m_instanceRigidBodyRef = instRigidbodyRef; + printf("1 found body %s\n", bodyName); + /* The instance target points to the graphics node */ + ConvertRigidBodyRef( rbInput , output ); + mass = output.m_mass; + isDynamics = output.m_isDynamics; + colShape = output.m_colShape; + compoundShape = output.m_compoundShape; + + } + } + + ////////////////////// + } + + if (compoundShape) + colShape = compoundShape; + + if (colShape) + { + btRigidBodyInput input; + input.m_instanceRigidBodyRef = instRigidbodyRef; + input.m_bodyName = (char*)bodyName; + printf("1 calling prepare %s\n", bodyName); + PreparePhysicsObject(input, isDynamics,mass,colShape, linearVelocity, angularVelocity); + } + } + } + + + for (r=0;rgetInstance_rigid_body_array().getCount();r++) + { + + domInstance_rigid_bodyRef instRigidbodyRef = instance_physicsModelRef->getInstance_rigid_body_array()[r]; + + btVector3 linearVelocity = btVector3(0.0, 0.0, 0.0); + btVector3 angularVelocity = btVector3(0.0, 0.0, 0.0); + + float mass = 1.f; + bool isDynamics = true; + btCollisionShape* colShape = 0; + btCompoundShape* compoundShape = 0; + + xsNCName bodyName = instRigidbodyRef->getBody(); + + domInstance_rigid_body::domTechnique_commonRef techniqueRef = instRigidbodyRef->getTechnique_common(); + if (techniqueRef) + { + if (techniqueRef->getMass()) + { + mass = techniqueRef->getMass()->getValue(); + } + if (techniqueRef->getDynamic()) + { + isDynamics = techniqueRef->getDynamic()->getValue(); + } + if (techniqueRef->getVelocity()) + { + linearVelocity = btVector3( + techniqueRef->getVelocity()->getValue()[0], + techniqueRef->getVelocity()->getValue()[1], + techniqueRef->getVelocity()->getValue()[2]); + } + if (techniqueRef->getAngular_velocity()) + { + angularVelocity = btVector3( + techniqueRef->getAngular_velocity()->getValue()[0], + techniqueRef->getAngular_velocity()->getValue()[1], + techniqueRef->getAngular_velocity()->getValue()[2]); + } + } + + printf("mass = %f, isDynamics %i\n",mass,isDynamics); + + domRigid_bodyRef savedRbRef = NULL; + if (bodyName && model) + { + //try to find the rigid body + + for (unsigned int r=0;rgetRigid_body_array().getCount();r++) + { + domRigid_bodyRef rigidBodyRef = model->getRigid_body_array()[r]; + if (rigidBodyRef->getSid() && !strcmp(rigidBodyRef->getSid(),bodyName)) + { + + + btRigidBodyOutput output; + output.m_colShape = colShape; + output.m_compoundShape = compoundShape; + output.m_mass = 1.f; + output.m_isDynamics = true; + + btRigidBodyInput rbInput; + rbInput.m_rigidBodyRef2 = rigidBodyRef; + savedRbRef = rigidBodyRef; + rbInput.m_instanceRigidBodyRef = instRigidbodyRef; + ConvertRigidBodyRef( rbInput , output ); + printf("Found body converting %s\n", bodyName); + + mass = output.m_mass; + isDynamics = output.m_isDynamics; + colShape = output.m_colShape; + compoundShape = output.m_compoundShape; + } + } + + ////////////////////// + } + + if (compoundShape) + colShape = compoundShape; + + if (colShape) + { + btRigidBodyInput input; + input.m_instanceRigidBodyRef = instRigidbodyRef; + input.m_rigidBodyRef2 = savedRbRef; + input.m_bodyName = (char*)bodyName; + PreparePhysicsObject(input, isDynamics,mass,colShape, linearVelocity, angularVelocity); + } + + } //for each instance_rigid_body + + + } //for each physics model + + + //handle constraints + for (unsigned int ma=0;magetInstance_physics_model_array().getCount();ma++) + { + domInstance_physics_modelRef instance_physicsModelRef = physicsSceneRef->getInstance_physics_model_array()[ma]; + + daeElementRef ref = instance_physicsModelRef->getUrl().getElement(); + + domPhysics_modelRef model = *(domPhysics_modelRef*)&ref; + + { + ConstraintInput cInput; + cInput.m_instance_physicsModelRef = instance_physicsModelRef; + cInput.m_model = model; + prepareConstraints(cInput); + } + + //also don't forget the model's 'instance_physics_models! + for ( unsigned int p=0;pgetInstance_physics_model_array().getCount();p++) + { + domInstance_physics_modelRef instancePhysicsModelRef = model->getInstance_physics_model_array()[p]; + + daeElementRef ref = instancePhysicsModelRef->getUrl().getElement(); + + domPhysics_modelRef model = *(domPhysics_modelRef*)&ref; + + ConstraintInput cInput; + cInput.m_instance_physicsModelRef = instancePhysicsModelRef; + cInput.m_model = model; + prepareConstraints(cInput); + } + + + } //2nd time, for each physics model + + } + } + + return true; +} + +domNode* ColladaConverter::findNode (const char* nodeName) +{ + if (!m_dom) + return NULL; + + /* FIXME: We could search all visual scenes but we assume that only one exists */ + domVisual_scene* visualScene = getDefaultVisualScene (); + + + domNode_Array& nodesArray = visualScene->getNode_array (); + for (int i = 0; i < nodesArray.getCount(); i++) + { + domNode* node = nodesArray[i]; + if (!node->getId()) + { + continue; + } + if (!strcmp(node->getId(), nodeName)) + { + return node; + } + } + return NULL; +} + +btRigidBodyColladaInfo* ColladaConverter::findRigidBodyColladaInfo(const btRigidBody* body) +{ +///we assume that the btRigidBody getUid matches btRigidBodyColladaInfo getUid + + if (!body->getBroadphaseProxy()) + return 0; + + int uid = body->getBroadphaseProxy()->getUid(); + btHashKeyPtr tmpKey(uid); + btRigidBodyColladaInfo** rbciPtr = this->m_rbUserInfoHashMap.find(tmpKey); + btRigidBodyColladaInfo* rbci = NULL; + if (rbciPtr) + { + rbci = *rbciPtr; + } + return rbci; +} + +bool ColladaConverter::instantiateDom () +{ + if (!m_collada) + { + m_collada = new DAE; + + //set the default IOPlugin and Database + m_collada->setIOPlugin( NULL ); + m_collada->setDatabase( NULL ); + + daeInt error; + const char* documentName = "bullet snapshot"; + + //create a new document. Calling daeDatabase::insertDocument will create the + //daeDocument for you. This function will also create a domCOLLADA root + //element for you. + daeDocument *doc = NULL; + error = m_collada->getDatabase()->insertDocument(documentName, &doc ); + if ( error != DAE_OK || doc == NULL ) + { + printf("Failed to create new document\n"); + return false; + } + + m_dom = daeSafeCast(doc->getDomRoot()); + + //create the required asset tag + domAssetRef asset = daeSafeCast( m_dom->createAndPlace( COLLADA_ELEMENT_ASSET ) ); + domAsset::domCreatedRef created = daeSafeCast( asset->createAndPlace( COLLADA_ELEMENT_CREATED ) ); + created->setValue("2008-02-12T15:28:54.891550"); + domAsset::domModifiedRef modified = daeSafeCast( asset->createAndPlace( COLLADA_ELEMENT_MODIFIED ) ); + modified->setValue("2008-02-12T15:28:54.891550"); + + domAsset::domContributorRef contrib = daeSafeCast( asset->createAndPlace( COLLADA_TYPE_CONTRIBUTOR ) ); + + domAsset::domContributor::domAuthoring_toolRef authoringtool = daeSafeCast( contrib->createAndPlace( COLLADA_ELEMENT_AUTHORING_TOOL ) ); + char authbuffer[512]; + sprintf(authbuffer,"Bullet Physics SDK %d Snapshot(BulletColladaConverter) http://bulletphysics.com",BT_BULLET_VERSION); + authoringtool->setValue(authbuffer); + + domAsset::domUp_axisRef yup = daeSafeCast( asset->createAndPlace( COLLADA_ELEMENT_UP_AXIS ) ); + yup->setValue(UPAXISTYPE_Y_UP); + + domPhysics_sceneRef physicsScene = getDefaultPhysicsScene (); + domPhysics_scene::domTechnique_commonRef common = daeSafeCast(physicsScene->createAndPlace (COLLADA_ELEMENT_TECHNIQUE_COMMON)); + domTargetableFloat3Ref g = daeSafeCast(common->createAndPlace (COLLADA_ELEMENT_GRAVITY)); + btVector3 btG = getGravity (); + g->getValue().set3 (btG[0], btG[1], btG[2]); + + if (!m_dom->getScene()) + { + domCOLLADA::domScene* scene = daeSafeCast( m_dom->createAndPlace( COLLADA_ELEMENT_SCENE ) ); + { + domInstanceWithExtra* ivs = daeSafeCast( scene->createAndPlace( COLLADA_ELEMENT_INSTANCE_VISUAL_SCENE ) ); + daeURI uri; + uri.setElement( getDefaultVisualScene() ); + uri.resolveURI(); + ivs->setUrl( uri ); + } + { + domInstanceWithExtra* ips = daeSafeCast( scene->createAndPlace( COLLADA_ELEMENT_INSTANCE_PHYSICS_SCENE ) ); + daeURI uri; + uri.setElement( getDefaultPhysicsScene() ); + uri.resolveURI(); + ips->setUrl( uri ); + } + + } + } + return true; +} + +domNode* ColladaConverter::findNode (btRigidBody* rb) +{ + btRigidBodyColladaInfo* rbci = findRigidBodyColladaInfo(rb); + if (rbci) + { + return rbci->m_node; + } + return NULL; +} + +domRigid_body* ColladaConverter::findRigid_body (const char* rigidbodyName) +{ + domLibrary_physics_models_Array& physicsModelsArray = m_dom->getLibrary_physics_models_array(); + for (int i = 0; i < physicsModelsArray.getCount(); i++) + { + domLibrary_physics_models* models = physicsModelsArray[i]; + domPhysics_model_Array& modelArray = models->getPhysics_model_array(); + for (int j = 0; j < modelArray.getCount(); j++) + { + domPhysics_model* model = modelArray[j]; + domRigid_body_Array& rigidBodyArray = model->getRigid_body_array (); + for (int k = 0; k < rigidBodyArray.getCount(); k++) + { + domRigid_body* rigidBody = rigidBodyArray[k]; + if (!strcmp(rigidBody->getSid(), rigidbodyName)) + { + return rigidBody; + } + } + } + } + return NULL; +} + +domRigid_body* ColladaConverter::findRigid_body (const btRigidBody* rb) +{ + btRigidBodyColladaInfo* rbci = findRigidBodyColladaInfo(rb); + if (rbci) + { + return rbci->m_domRigidBody; + } + return NULL; +} + +domInstance_rigid_body* ColladaConverter::findRigid_body_instance (const char* nodeName) +{ + domPhysics_scene* physicsScene = getDefaultPhysicsScene (); + domInstance_physics_model_Array& physicsModelInstances = physicsScene->getInstance_physics_model_array (); + for (int i = 0; i < physicsModelInstances.getCount(); i++) + { + domInstance_physics_model* physicsModelInstance = physicsModelInstances[i]; + domInstance_rigid_body_Array& rigidBodyInstances = physicsModelInstance->getInstance_rigid_body_array (); + for (int j = 0; j < rigidBodyInstances.getCount(); j++) + { + domInstance_rigid_body* rigidBodyInstance = rigidBodyInstances[j]; + if (!strcmp(rigidBodyInstance->getTarget().getID(), nodeName)) + { + return rigidBodyInstance; + } + } + } + return NULL; +} + +domInstance_rigid_body* ColladaConverter::findRigid_body_instance (btRigidBody* rb) +{ + btRigidBodyColladaInfo* rbci = findRigidBodyColladaInfo(rb); + if (rbci) + { + return rbci->m_instanceRigidBody; + } + return NULL; +} + +domRigid_constraint* ColladaConverter::findRigid_constraint (const char* constraintName) +{ + domLibrary_physics_models_Array& physicsModelsArray = m_dom->getLibrary_physics_models_array(); + for (int i = 0; i < physicsModelsArray.getCount(); i++) + { + domLibrary_physics_models* models = physicsModelsArray[i]; + domPhysics_model_Array& modelArray = models->getPhysics_model_array(); + for (int j = 0; j < modelArray.getCount(); j++) + { + domPhysics_model* model = modelArray[j]; + domRigid_constraint_Array& rigidConstraintArray = model->getRigid_constraint_array (); + for (int k = 0; k < rigidConstraintArray.getCount(); k++) + { + domRigid_constraint* rigidConstraint = rigidConstraintArray[k]; + if (!strcmp(rigidConstraint->getSid(), constraintName)) + { + printf("Found rigid constraint in DOM already.\n"); + return rigidConstraint; + } + } + } + } + return NULL; +} + +btRigidConstraintColladaInfo* ColladaConverter::findRigidConstraintColladaInfo(btTypedConstraint* constraint) +{ + ///we assume that the btTypedConstraint getUid matches btRigidConstraintColladaInfo getUid + int uid = constraint->getUid(); + if (uid==-1) + return NULL;//not in the map + + btHashKeyPtr tmpKey(uid); + btRigidConstraintColladaInfo** rbciPtr = this->m_constraintUserInfoHashMap.find(tmpKey); + btRigidConstraintColladaInfo* rbci = NULL; + if (rbciPtr) + { + rbci = *rbciPtr; + } + return rbci; + +} + +domRigid_constraint* ColladaConverter::findRigid_constraint (btTypedConstraint* constraint) +{ + + btRigidConstraintColladaInfo* rcci = findRigidConstraintColladaInfo(constraint); + + if (rcci) + { + return rcci->m_domRigidConstraint; + } + return NULL; +} + +domGeometry* ColladaConverter::findGeometry (const char* shapeName) +{ + domLibrary_geometries* geomLib = getDefaultGeomLib (); + domGeometry_Array& geometryArray = geomLib->getGeometry_array (); + for (int i = 0; i < geometryArray.getCount (); i++) + { + domGeometry* geom = geometryArray[i]; + if (!geom->getId()) + continue; + + if (!strcmp(geom->getId(), shapeName)) + { + return geom; + } + } + return NULL; +} +/* +domGeometry* ColladaConverter::findGeometry (btCollisionShape* shape) +{ + if (shape->getTypedUserInfo ()) + { + btShapeColladaInfo* sci = (btShapeColladaInfo*)tui; + return sci->m_geometry; + } + return 0; +} +*/ + + +void ColladaConverter::prepareConstraints(ConstraintInput& input) +{ + domInstance_physics_model* instance_physicsModelRef = input.m_instance_physicsModelRef; + domPhysics_modelRef model = input.m_model; + + for (unsigned int c=0;cgetInstance_rigid_constraint_array().getCount();c++) + { + domInstance_rigid_constraintRef constraintRef = instance_physicsModelRef->getInstance_rigid_constraint_array().get(c); + xsNCName constraintName = constraintRef->getConstraint(); + + if (constraintName && model) + { + //try to find the rigid body + int numConstraints= model->getRigid_constraint_array().getCount(); + + for (int r=0;rgetRigid_constraint_array()[r]; + + if (rigidConstraintRef->getSid() && !strcmp(rigidConstraintRef->getSid(),constraintName)) + { + + //two bodies + const domRigid_constraint::domRef_attachmentRef attachRefBody = rigidConstraintRef->getRef_attachment(); + const domRigid_constraint::domAttachmentRef attachBody1 = rigidConstraintRef->getAttachment(); + + daeString orgUri0 = attachRefBody ? attachRefBody->getRigid_body().getOriginalURI() : ""; + daeString orgUri1 = attachBody1 ? attachBody1->getRigid_body().getOriginalURI() : ""; + btRigidBody* body0=0,*body1=0; + + for (int i=0;igetSid(); + if (name) + { + if (!strcmp(name, orgUri0)) + { + body0=body; + } + if (!strcmp(name,orgUri1)) + { + body1=body; + } + } + } + + + + const domRigid_constraint::domAttachmentRef attachOtherBody = rigidConstraintRef->getAttachment(); + + + const domRigid_constraint::domTechnique_commonRef commonRef = rigidConstraintRef->getTechnique_common(); + + domFloat3 flMin = commonRef->getLimits()->getLinear()->getMin()->getValue(); + btVector3 minLinearLimit(flMin.get(0),flMin.get(1),flMin.get(2)); + + domFloat3 flMax = commonRef->getLimits()->getLinear()->getMax()->getValue(); + btVector3 maxLinearLimit(flMax.get(0),flMax.get(1),flMax.get(2)); + + domFloat3 coneMinLimit = commonRef->getLimits()->getSwing_cone_and_twist()->getMin()->getValue(); + btVector3 angularMin(coneMinLimit.get(0),coneMinLimit.get(1),coneMinLimit.get(2)); + + domFloat3 coneMaxLimit = commonRef->getLimits()->getSwing_cone_and_twist()->getMax()->getValue(); + btVector3 angularMax(coneMaxLimit.get(0),coneMaxLimit.get(1),coneMaxLimit.get(2)); + + { + + btTransform attachFrameRef0; + attachFrameRef0.setIdentity(); + + if (attachRefBody) + { + attachFrameRef0 = + GetbtTransformFromCOLLADA_DOM + ( + emptyMatrixArray, + attachRefBody->getRotate_array(), + attachRefBody->getTranslate_array(), + m_unitMeterScaling); + } + + btTransform attachFrameOther; + attachFrameOther.setIdentity(); + if (attachBody1) + { + attachFrameOther = + GetbtTransformFromCOLLADA_DOM + ( + emptyMatrixArray, + attachBody1->getRotate_array(), + attachBody1->getTranslate_array(), + m_unitMeterScaling + ); + } + + domBool interpenetrate = false; + if (commonRef->getInterpenetrate()) + interpenetrate = commonRef->getInterpenetrate()->getValue(); + bool disableCollisionsBetweenLinkedBodies = interpenetrate; + //convert INF / -INF into lower > upper + + //currently there is a hack in the DOM to detect INF / -INF + //see daeMetaAttribute.cpp + //INF -> 999999.9 + //-INF -> -999999.9 + float linearCheckThreshold = 999999.0; + float angularCheckThreshold = 180.0;//check this + + + + + //free means upper < lower, + //locked means upper == lower + //limited means upper > lower + //limitIndex: first 3 are linear, next 3 are angular + + btVector3 linearLowerLimits = minLinearLimit; + btVector3 linearUpperLimits = maxLinearLimit; + btVector3 angularLowerLimits = angularMin; + btVector3 angularUpperLimits = angularMax; + { + for (int i=0;i<3;i++) + { + if ((linearLowerLimits[i] < -linearCheckThreshold) || + (linearUpperLimits[i] > linearCheckThreshold)) + { + //disable limits + linearLowerLimits[i] = 1; + linearUpperLimits[i] = 0; + } + + if ((angularLowerLimits[i] < -angularCheckThreshold) || + (angularUpperLimits[i] > angularCheckThreshold)) + { + //disable limits + angularLowerLimits[i] = 1; + angularUpperLimits[i] = 0; + } + } + } + + + if (body0 || body1) + { + //swap so that first body is non-zero + btTypedConstraint* constraint = NULL; + if (!body0) + { + constraint = createUniversalD6Constraint( + body1, + body0, + attachFrameOther, + attachFrameRef0, + linearLowerLimits, + linearUpperLimits, + angularLowerLimits, + angularUpperLimits, + disableCollisionsBetweenLinkedBodies + ); + } else + { + constraint = createUniversalD6Constraint( + body0, + body1, + attachFrameRef0, + attachFrameOther, + linearLowerLimits, + linearUpperLimits, + angularLowerLimits, + angularUpperLimits, + disableCollisionsBetweenLinkedBodies + ); + } + + // XXX: User must free this name before destroy the constraint + btRigidConstraintColladaInfo* tui = new btRigidConstraintColladaInfo (constraint,rigidConstraintRef, constraintRef); + m_constraintUserInfoHashMap.insert(btHashKeyPtr(tui->getUid()),tui); + + printf("Added constraint %s to the world\n", rigidConstraintRef->getSid()); + } else + { + printf("Error: Cannot find Rigidbodies(%s,%s) for constraint %s\n",orgUri0,orgUri1,constraintName); + } + + + } + + + + } + } + } + + } +} + +void ColladaConverter::PreparePhysicsObject(struct btRigidBodyInput& input, bool isDynamics, float mass,btCollisionShape* colShape, const btVector3& linearVelocity, const btVector3& angularVelocity) +{ + btTransform startTransform; + startTransform.setIdentity(); + btVector3 startScale(1.f,1.f,1.f); + + //The 'target' points to a graphics element/node, which contains the start (world) transform + daeElementRef elem = input.m_instanceRigidBodyRef->getTarget().getElement(); + + xsNCName bodyName; + if (elem) + { + domNodeRef node = *(domNodeRef*)&elem; + bodyName = node->getName(); + input.m_nodeRef = node; + + //find transform of the node that this rigidbody maps to + + + startTransform = GetbtTransformFromCOLLADA_DOM( + node->getMatrix_array(), + node->getRotate_array(), + node->getTranslate_array(), + m_unitMeterScaling + ); + + unsigned int i; + for (i=0;igetScale_array().getCount();i++) + { + domScaleRef scaleRef = node->getScale_array()[i]; + domFloat3 fl3 = scaleRef->getValue(); + startScale = btVector3(fl3.get(0),fl3.get(1),fl3.get(2)); + } + + } + + if (startScale.length() < 0.001) + printf("invalid scale\n"); + + colShape->setLocalScaling(startScale); + + btRigidBody* body= createRigidBody(isDynamics,mass,startTransform,colShape); + if (body) + { + btRigidBodyColladaInfo* tui = new btRigidBodyColladaInfo (body,input.m_nodeRef, input.m_rigidBodyRef2, input.m_instanceRigidBodyRef); + m_rbUserInfoHashMap.insert(btHashKeyPtr(tui->getUid()),tui); + + /* if the body is dynamic restore it's velocity */ + if (body->getInvMass() != 0.0) + { + body->setLinearVelocity (linearVelocity); + body->setAngularVelocity (angularVelocity); + } + //body->setName (strdup(bodyName)); + //printf("node = %s\n", body->getName()); + //printf("shape = %s\n", colShape->getShapeName()); + } + +} + +domLibrary_geometries* ColladaConverter::getDefaultGeomLib () +{ + domLibrary_geometries* geometriesLib = NULL; + + if (m_dom->getLibrary_geometries_array().getCount()) + { + return m_dom->getLibrary_geometries_array()[0]; + } else { + geometriesLib = daeSafeCast(m_dom->createAndPlace (COLLADA_ELEMENT_LIBRARY_GEOMETRIES)); + return geometriesLib; + } +} + +domLibrary_physics_materials* ColladaConverter::getDefaultMaterialsLib () +{ + domLibrary_physics_materials* materialsLib = NULL; + + if (m_dom->getLibrary_physics_materials_array().getCount()) + { + domLibrary_physics_materials_Array& physicsMaterialsArray = m_dom->getLibrary_physics_materials_array(); + for (int i = 0; i < physicsMaterialsArray.getCount(); i++) + { + materialsLib = physicsMaterialsArray[i]; + if (!materialsLib->getName()) + { + continue; + } + if (!strcmp("Bullet-PhysicsMaterials", materialsLib->getName())) + { + return materialsLib; + } + } + } + printf("No library physics materials. Creating one\n"); + materialsLib = daeSafeCast (m_dom->createAndPlace (COLLADA_ELEMENT_LIBRARY_PHYSICS_MATERIALS)); + materialsLib->setName("Bullet-PhysicsMaterials"); + return materialsLib; +} + +domPhysics_model* ColladaConverter::getDefaultPhysicsModel () +{ + domLibrary_physics_models* modelsLib = NULL; + + if (m_dom->getLibrary_physics_models_array().getCount()) + { + domLibrary_physics_models_Array& physicsModelsArray = m_dom->getLibrary_physics_models_array(); + for (int i = 0; i < physicsModelsArray.getCount(); i++) + { + modelsLib = physicsModelsArray[i]; + domPhysics_model_Array& modelArray = modelsLib->getPhysics_model_array(); + for (int j = 0; j < modelArray.getCount(); j++) + { + domPhysics_model* model = modelArray[j]; + if (!strcmp("Bullet-PhysicsModel", model->getId())) + { + printf("Found Bullet-PhysicsModel\n"); + return model; + } + } + } + } else { + printf("No library physics model. Creating one\n"); + modelsLib = daeSafeCast (m_dom->createAndPlace (COLLADA_ELEMENT_LIBRARY_PHYSICS_MODELS )); + } + + /* Always create in first physics models library */ + modelsLib = m_dom->getLibrary_physics_models_array()[0]; + + printf("Could not find physics model. Creating one\n"); + + domPhysics_model* physicsModel = daeSafeCast(modelsLib->createAndPlace (COLLADA_ELEMENT_PHYSICS_MODEL)); + + physicsModel->setName("Bullet-PhysicsModel"); + physicsModel->setId("Bullet-PhysicsModel"); + + return physicsModel; +} + + +domInstance_physics_model* ColladaConverter::getDefaultInstancePhysicsModel () +{ + domPhysics_scene* physicsScene = getDefaultPhysicsScene (); + domInstance_physics_model_Array& physicsModelInstances = physicsScene->getInstance_physics_model_array (); + for (int i = 0; i < physicsModelInstances.getCount (); i++) + { + domInstance_physics_model* physicsModelInstance = physicsModelInstances[i]; + if (!strcmp(physicsModelInstance->getUrl().getURI(), "#Bullet-PhysicsModel")) + { + printf("Found Bullet-PhysicsModel instance\n"); + return physicsModelInstance; + } + } + printf("Creating Bullet-PhysicsModel instance\n"); + domInstance_physics_model* physicsModelInstance = daeSafeCast(physicsScene->createAndPlace (COLLADA_ELEMENT_INSTANCE_PHYSICS_MODEL)); + physicsModelInstance->setUrl ("#Bullet-PhysicsModel"); + return physicsModelInstance; +} + +domPhysics_scene* ColladaConverter::getDefaultPhysicsScene () +{ + domLibrary_physics_scenes* physicsScenesLib = NULL; + + if (m_dom->getLibrary_physics_scenes_array().getCount ()) + { + /* Always return the first physics scene */ + physicsScenesLib = m_dom->getLibrary_physics_scenes_array()[0]; + if (physicsScenesLib->getPhysics_scene_array().getCount()) + { + return physicsScenesLib->getPhysics_scene_array()[0]; + } + } else { + physicsScenesLib = (domLibrary_physics_scenes*)m_dom->createAndPlace (COLLADA_ELEMENT_LIBRARY_PHYSICS_SCENES); + domPhysics_scene* physicsScene = daeSafeCast(physicsScenesLib->createAndPlace (COLLADA_ELEMENT_PHYSICS_SCENE)); + physicsScene->setId("Scene-Physics"); + physicsScene->setName("MyPhysicsScene"); + return physicsScene; + } + + return 0; + +} + + +domVisual_scene* ColladaConverter::getDefaultVisualScene () +{ + domLibrary_visual_scenes* visualScenesLib = NULL; + + if (m_dom->getLibrary_visual_scenes_array().getCount ()) + { + /* Always return the first visual scene */ + visualScenesLib = m_dom->getLibrary_visual_scenes_array()[0]; + if (visualScenesLib->getVisual_scene_array().getCount()) + { + return visualScenesLib->getVisual_scene_array()[0]; + } + } else { + visualScenesLib = (domLibrary_visual_scenes*)m_dom->createAndPlace (COLLADA_ELEMENT_LIBRARY_VISUAL_SCENES); + domVisual_scene* visualScene = daeSafeCast(visualScenesLib->createAndPlace (COLLADA_ELEMENT_VISUAL_SCENE)); + visualScene->setId("Scene"); + visualScene->setName("MyScene"); + return visualScene; + } + + return 0; +} + + +void ColladaConverter::addConvexHull (btCollisionShape* shape, const char* convexNodeName) +{ + domGeometry* geoConcave = 0; + + { + btConvexShape* hullShape = (btConvexShape*)shape; + btShapeHull* triHull = new btShapeHull (hullShape); + if (triHull->buildHull (0.0) == false) + { + printf("Failed to build triangle mesh of hull\n"); + return; + } + + domLibrary_geometries* geomLib = getDefaultGeomLib (); + + geoConcave = findGeometry (convexNodeName); + + /* Already in the dom */ + if (geoConcave) + return; + + geoConcave = daeSafeCast( geomLib->createAndPlace( COLLADA_ELEMENT_GEOMETRY ) ); + if ( geoConcave == NULL ) + { + printf("Failed to create the geometry element\n"); + return; + } + char nodeName[256]; + sprintf(nodeName,"RenderMesh%s",convexNodeName); + + //set it's id + geoConcave->setId( nodeName ); + geoConcave->setName ( nodeName); + + domMesh *mesh = daeSafeCast( geoConcave->createAndPlace( COLLADA_ELEMENT_MESH ) ); + if ( mesh == NULL ) + { + printf("Failed to create the mesh element\n"); + return; + } + + //we will need 3 sources for this mesh. positions, normals, and UVs + domSource *positionSrc = daeSafeCast( mesh->createAndPlace( COLLADA_ELEMENT_SOURCE ) ); + if (!positionSrc) + { + printf("Failed to create position source\n"); + return; + } + + //create the positions source. + std::string srcName = std::string(nodeName) + std::string("-positions"); + positionSrc->setId( srcName.c_str() ); + domFloat_array *fa = daeSafeCast( positionSrc->createAndPlace( COLLADA_ELEMENT_FLOAT_ARRAY ) ); + if (fa == NULL) + { + printf("Failed to create float array\n"); + return; + } + std::string arrayName = srcName + std::string("-array"); + fa->setId( arrayName.c_str() ); + fa->setCount( triHull->numVertices () * 3); + + domListOfFloats &posSrcArray = fa->getValue(); + for (int i = 0; i < triHull->numVertices (); i++) + { + btVector3 p = triHull->getVertexPointer()[i]; + posSrcArray.append3(p.getX(), p.getY(), p.getZ()); + } + + //create the accessor + domSource::domTechnique_common *srcTeqC = daeSafeCast( positionSrc->createAndPlace( COLLADA_ELEMENT_TECHNIQUE_COMMON ) ); + domAccessor *acc = daeSafeCast( srcTeqC->createAndPlace( COLLADA_ELEMENT_ACCESSOR ) ); + acc->setCount( triHull->numVertices () ); + acc->setStride( 3 ); + daeURI uri; + uri.setElement( fa ); + uri.resolveURI(); + acc->setSource( uri ); + + domParam *param = daeSafeCast( acc->createAndPlace( COLLADA_ELEMENT_PARAM ) ); + param->setName( "X" ); + param->setType( "float" ); + param = daeSafeCast( acc->createAndPlace( COLLADA_ELEMENT_PARAM ) ); + param->setName( "Y" ); + param->setType( "float" ); + param = daeSafeCast( acc->createAndPlace( COLLADA_ELEMENT_PARAM ) ); + param->setName( "Z" ); + param->setType( "float" ); + + domVertices *verts = daeSafeCast( mesh->createAndPlace( COLLADA_ELEMENT_VERTICES ) ); + srcName = std::string(nodeName) + std::string("-vertices"); + verts->setId( srcName.c_str() ); + domInputLocal *inputLocal = daeSafeCast( verts->createAndPlace( COLLADA_ELEMENT_INPUT ) ); + inputLocal->setSemantic( COMMON_PROFILE_INPUT_POSITION ); + uri.setElement( positionSrc ); + uri.resolveURI(); + inputLocal->setSource( uri ); + + domTriangles *tris = daeSafeCast( mesh->createAndPlace( COLLADA_ELEMENT_TRIANGLES ) ); + tris->setCount( triHull->numTriangles() ); + domInputLocalOffset *ilo = daeSafeCast( tris->createAndPlace( COLLADA_ELEMENT_INPUT ) ); + ilo->setSemantic( COMMON_PROFILE_INPUT_VERTEX ); + ilo->setOffset( 0 ); + uri.setElement( verts ); + uri.resolveURI(); + ilo->setSource( uri ); + + domP *p = daeSafeCast( tris->createAndPlace( COLLADA_ELEMENT_P ) ); + + domListOfUInts &indices = p->getValue(); + //each set of three is one number per input-offset. for this example it's vert, normal, uv. + //three sets of three indices per triangle + + const unsigned int* indexBase = triHull->getIndexPointer (); + for (int t = 0; t < triHull->numTriangles(); t++) + { + int* index = (int*)indexBase; + indices.append3( index[0], index[1], index[2]); + indexBase += 3; + } + + delete triHull; + } + { + domLibrary_geometries* geomLib = getDefaultGeomLib (); + domGeometry* geo = daeSafeCast( geomLib->createAndPlace( COLLADA_ELEMENT_GEOMETRY ) ); + + if ( geo == NULL ) + { + printf("Failed to create the geometry element\n"); + return; + } + + //set it's id + geo->setId( convexNodeName ); + geo->setName ( convexNodeName); + // + domConvex_mesh* meshRef = daeSafeCast( geo->createAndPlace( COLLADA_ELEMENT_CONVEX_MESH ) ); + + if ( meshRef == NULL ) + { + printf("Failed to create the mesh element\n"); + return; + } + + daeURI uri; + uri.setElement( geoConcave); + uri.resolveURI(); + + + meshRef->setConvex_hull_of(uri); + + + + + + + + + } + + +} + +void ColladaConverter::addConvexMesh (btCollisionShape* shape, const char* nodeName) +{ + printf("convex Triangle Mesh Shape\n"); + printf("ERROR: Unsupported.\n"); +} + +void ColladaConverter::addScaledConcaveMesh(btCollisionShape* shape, const char* nodeName) +{ + btScaledBvhTriangleMeshShape* scaledShape = (btScaledBvhTriangleMeshShape*)shape; + btBvhTriangleMeshShape* meshShape = scaledShape->getChildShape(); + btStridingMeshInterface* meshInterface = meshShape->getMeshInterface (); + addConcaveMeshInternal(meshInterface,nodeName); +} + + + +void ColladaConverter::addConcaveMesh(btCollisionShape* shape, const char* nodeName) +{ + btTriangleMeshShape* meshShape = (btTriangleMeshShape*)shape; + btStridingMeshInterface* meshInterface = meshShape->getMeshInterface (); + addConcaveMeshInternal(meshInterface,nodeName); + +} + +void ColladaConverter::addGimpactMesh(btCollisionShape* shape, const char* shapeName) +{ + btGImpactShapeInterface* meshShapeInterface = (btGImpactShapeInterface*) shape; + switch (meshShapeInterface->getGImpactShapeType()) + { + case CONST_GIMPACT_TRIMESH_SHAPE: + { + btGImpactMeshShape* meshShape = (btGImpactMeshShape*) shape; + btStridingMeshInterface* meshInterface = meshShape->getMeshInterface (); + addConcaveMeshInternal(meshInterface,shapeName); + break; + } + default: + { + } + }; +} + +void ColladaConverter::addConcaveMeshInternal(btStridingMeshInterface* meshInterface , const char* nodeName) +{ + + domLibrary_geometries* geomLib = getDefaultGeomLib (); + domGeometry* geo = findGeometry (nodeName); + + if (geo) + return; + + geo = daeSafeCast( geomLib->createAndPlace( COLLADA_ELEMENT_GEOMETRY ) ); + if ( geo == NULL ) + { + printf("Failed to create the geometry element\n"); + return; + } + //set it's id + geo->setId( nodeName ); + geo->setName ( nodeName); + + printf("numSubParts = \n",meshInterface->getNumSubParts ()); + + for (int i = 0; i < meshInterface->getNumSubParts (); i++) + { + + + domMesh *mesh = daeSafeCast( geo->createAndPlace( COLLADA_ELEMENT_MESH ) ); + if ( mesh == NULL ) + { + printf("Failed to create the mesh element\n"); + return; + } + + const unsigned char* vertexBase = NULL; + int numVerts; + PHY_ScalarType vertexType; + int vertexStride; + const unsigned char* indexBase = NULL; + int indexStride; + int numFaces; + PHY_ScalarType indexType; + + meshInterface->getLockedReadOnlyVertexIndexBase (&vertexBase, numVerts, vertexType, vertexStride, &indexBase, indexStride, numFaces, indexType, i); + + printf("meshInterface subpart[%d].numVerts = %d\n",i,numVerts); + printf("meshInterface subpart[%d].numFaces = %d\n",i,numFaces); + printf("meshInterface subpart[%d].indexType= %d\n",i,indexType); + + + + btAssert (vertexBase); + btAssert (indexBase); + btAssert (vertexType == PHY_FLOAT); + + + //we will need 3 sources for this mesh. positions, normals, and UVs + domSource *positionSrc = daeSafeCast( mesh->createAndPlace( COLLADA_ELEMENT_SOURCE ) ); + + //create the positions source. + std::string srcName = std::string(nodeName) + std::string("-position"); + positionSrc->setId( srcName.c_str() ); + domFloat_array *fa = daeSafeCast( positionSrc->createAndPlace( COLLADA_ELEMENT_FLOAT_ARRAY ) ); + std::string arrayName = srcName + std::string("-array"); + fa->setId( arrayName.c_str() ); + fa->setCount( numVerts * 3); + + domListOfFloats &posSrcArray = fa->getValue(); + for (int v = 0; v < numVerts; v++) + { + float* p = (float*)vertexBase; + posSrcArray.append3(p[0], p[1], p[2]); + vertexBase += vertexStride; + } + + //create the accessor + domSource::domTechnique_common *srcTeqC = daeSafeCast( positionSrc->createAndPlace( COLLADA_ELEMENT_TECHNIQUE_COMMON ) ); + domAccessor *acc = daeSafeCast( srcTeqC->createAndPlace( COLLADA_ELEMENT_ACCESSOR ) ); + acc->setCount( numVerts ); + acc->setStride( 3 ); + daeURI uri; + uri.setElement( fa ); + uri.resolveURI(); + acc->setSource( uri ); + + domParam *param = daeSafeCast( acc->createAndPlace( COLLADA_ELEMENT_PARAM ) ); + param->setName( "X" ); + param->setType( "float" ); + param = daeSafeCast( acc->createAndPlace( COLLADA_ELEMENT_PARAM ) ); + param->setName( "Y" ); + param->setType( "float" ); + param = daeSafeCast( acc->createAndPlace( COLLADA_ELEMENT_PARAM ) ); + param->setName( "Z" ); + param->setType( "float" ); + + domVertices *verts = daeSafeCast( mesh->createAndPlace( COLLADA_ELEMENT_VERTICES ) ); + srcName = std::string(nodeName) + std::string("-vertex"); + verts->setId( srcName.c_str() ); + domInputLocal *inputLocal = daeSafeCast( verts->createAndPlace( COLLADA_ELEMENT_INPUT ) ); + inputLocal->setSemantic( COMMON_PROFILE_INPUT_POSITION ); + uri.setElement( positionSrc ); + uri.resolveURI(); + inputLocal->setSource( uri ); + + + domTriangles *tris = daeSafeCast( mesh->createAndPlace( COLLADA_ELEMENT_TRIANGLES ) ); + tris->setCount( numFaces ); + domInputLocalOffset *ilo = daeSafeCast( tris->createAndPlace( COLLADA_ELEMENT_INPUT ) ); + ilo->setSemantic( COMMON_PROFILE_INPUT_VERTEX ); + ilo->setOffset( 0 ); + uri.setElement( verts ); + uri.resolveURI(); + ilo->setSource( uri ); + + domP *p = daeSafeCast( tris->createAndPlace( COLLADA_ELEMENT_P ) ); + + domListOfUInts &indices = p->getValue(); + //each set of three is one number per input-offset. for this example it's vert, normal, uv. + //three sets of three indices per triangle + + if (indexType == PHY_SHORT) + { + for (int t = 0; t < numFaces; t++) + { + unsigned short int* index = (unsigned short int*)indexBase; + indices.append3( index[0], index[1], index[2]); + indexBase += indexStride; + } + } else + { + for (int t = 0; t < numFaces; t++) + { + unsigned int* index = (unsigned int*)indexBase; + indices.append3( index[0], index[1], index[2]); + indexBase += indexStride; + } + } + + meshInterface->unLockReadOnlyVertexBase (i); + } +} + +void ColladaConverter::buildShapeNew (btCollisionShape* shape, void* domTechniqueCommon, const char* shapeName,bool isChild,const btTransform& childTrans) +{ + domRigid_body::domTechnique_common* common = (domRigid_body::domTechnique_common*)domTechniqueCommon; + domRigid_body::domTechnique_common::domShape* colladaShape = (domRigid_body::domTechnique_common::domShape*)common->createAndPlace (COLLADA_ELEMENT_SHAPE); + + if (isChild) + { + { + domTranslate* translation = (domTranslate*)colladaShape->createAndPlace (COLLADA_ELEMENT_TRANSLATE); + { + btVector3 np = childTrans.getOrigin(); + translation->getValue().append(np[0]); + translation->getValue().append(np[1]); + translation->getValue().append(np[2]); + } + domRotate* rotation = (domRotate*)colladaShape->createAndPlace (COLLADA_ELEMENT_ROTATE); + { + btQuaternion quat = childTrans.getRotation(); + btVector3 axis(quat.getX(),quat.getY(),quat.getZ()); + axis[3] = 0.f; + //check for axis length + btScalar len = axis.length2(); + if (len < SIMD_EPSILON*SIMD_EPSILON) + axis = btVector3(1.f,0.f,0.f); + else + axis /= btSqrt(len); + rotation->getValue().set(0,axis[0]); + rotation->getValue().set(1,axis[1]); + rotation->getValue().set(2,axis[2]); + rotation->getValue().set(3,quat.getAngle()*SIMD_DEGS_PER_RAD); + } + } + } + switch (shape->getShapeType()) + { + case BOX_SHAPE_PROXYTYPE: + { + addConvexHull (shape, shapeName); + btBoxShape* bs = (btBoxShape*)shape; + btVector3 halfe = bs->getHalfExtentsWithMargin(); + domBox* box = (domBox*)colladaShape->createAndPlace (COLLADA_ELEMENT_BOX); + domBox::domHalf_extents* he = (domBox::domHalf_extents*)box->createAndPlace (COLLADA_ELEMENT_HALF_EXTENTS); + he->getValue().set3 (halfe[0], halfe[1], halfe[2]); + } + break; + case SPHERE_SHAPE_PROXYTYPE: + { + addConvexHull (shape, shapeName); + btSphereShape* ss = (btSphereShape*)shape; + domSphere* sphere = (domSphere*)colladaShape->createAndPlace (COLLADA_ELEMENT_SPHERE); + domSphere::domRadius* radius = (domSphere::domRadius*)sphere->createAndPlace (COLLADA_ELEMENT_RADIUS); + radius->setValue (ss->getRadius()); + } + break; + case CYLINDER_SHAPE_PROXYTYPE: + { + btCylinderShape* cs = (btCylinderShape*)shape; + domCylinder* cylinder = (domCylinder*)colladaShape->createAndPlace (COLLADA_ELEMENT_CYLINDER); + domCylinder::domRadius* radius = (domCylinder::domRadius*)cylinder->createAndPlace (COLLADA_ELEMENT_RADIUS); + domCylinder::domHeight* height = (domCylinder::domHeight*)cylinder->createAndPlace (COLLADA_ELEMENT_HEIGHT); + domFloat2 radius2; + radius2.set2(cs->getRadius(),cs->getRadius()); + radius->setValue (radius2); + height->setValue (cs->getHalfExtentsWithMargin()[1] * 1.0); + } + break; + case STATIC_PLANE_PROXYTYPE: + { + btStaticPlaneShape* ps = (btStaticPlaneShape*)shape; + btVector3 n = ps->getPlaneNormal (); + btScalar d = ps->getPlaneConstant (); + domPlane* plane = (domPlane*)colladaShape->createAndPlace (COLLADA_ELEMENT_PLANE); + domPlane::domEquation* equation = (domPlane::domEquation*)plane->createAndPlace (COLLADA_ELEMENT_EQUATION); + equation->getValue().set4 (n[0], n[1], n[2], d); + } + break; + case CONE_SHAPE_PROXYTYPE: + { + printf("unhandled cone type\n"); + } + break; + case COMPOUND_SHAPE_PROXYTYPE: + { + btCompoundShape* cs = (btCompoundShape*)shape; + for (int i = 0; i < cs->getNumChildShapes (); i++) + { + btCollisionShape* child_shape = cs->getChildShape (i); + char childShapeName[512]; + sprintf(childShapeName,"%s-Child%d",shapeName,i); + buildShapeNew (child_shape, domTechniqueCommon, childShapeName,true, cs->getChildTransform(i)); + } + } + break; + case CONVEX_TRIANGLEMESH_SHAPE_PROXYTYPE: + { + addConvexMesh (shape, shapeName); + char shapeURL[512]; + snprintf(&shapeURL[0], 512, "#%s", shapeName); + domInstance_geometry* gi = (domInstance_geometry*)colladaShape->createAndPlace (COLLADA_ELEMENT_INSTANCE_GEOMETRY); + gi->setUrl (shapeURL); + } + break; + case CONVEX_HULL_SHAPE_PROXYTYPE: + { + addConvexHull (shape, shapeName); + char shapeURL[512]; + snprintf(&shapeURL[0], 512, "#%s", shapeName); + domInstance_geometry* gi = (domInstance_geometry*)colladaShape->createAndPlace (COLLADA_ELEMENT_INSTANCE_GEOMETRY); + gi->setUrl (shapeURL); + } + break; + case GIMPACT_SHAPE_PROXYTYPE: + { + btGImpactShapeInterface* meshShapeInterface = (btGImpactShapeInterface*) shape; + switch (meshShapeInterface->getGImpactShapeType()) + { + case CONST_GIMPACT_TRIMESH_SHAPE: + { + addGimpactMesh (shape, shapeName); + char shapeURL[512]; + snprintf(&shapeURL[0], 512, "#%s", shapeName); + domInstance_geometry* gi = (domInstance_geometry*)colladaShape->createAndPlace (COLLADA_ELEMENT_INSTANCE_GEOMETRY); + gi->setUrl (shapeURL); + break; + } + + case CONST_GIMPACT_COMPOUND_SHAPE: + { + btGImpactCompoundShape* gimpactCompoundShape = (btGImpactCompoundShape*)shape; + + for (int i = 0; i < gimpactCompoundShape->getNumChildShapes (); i++) + { + btCollisionShape* child_shape = gimpactCompoundShape->getChildShape(i); + char childShapeName[512]; + sprintf(childShapeName,"%s-Child%d",shapeName,i); + buildShapeNew (child_shape, domTechniqueCommon, childShapeName,true, gimpactCompoundShape->getChildTransform(i)); + } + break; + } + + default: + { + } + }; + + + } + break; + case SCALED_TRIANGLE_MESH_SHAPE_PROXYTYPE: + { + addScaledConcaveMesh (shape, shapeName); + char shapeURL[512]; + snprintf(&shapeURL[0], 512, "#%s", shapeName); + domInstance_geometry* gi = (domInstance_geometry*)colladaShape->createAndPlace (COLLADA_ELEMENT_INSTANCE_GEOMETRY); + gi->setUrl (shapeURL); + break; + } + case TRIANGLE_MESH_SHAPE_PROXYTYPE: + { + addConcaveMesh (shape, shapeName); + char shapeURL[512]; + snprintf(&shapeURL[0], 512, "#%s", shapeName); + domInstance_geometry* gi = (domInstance_geometry*)colladaShape->createAndPlace (COLLADA_ELEMENT_INSTANCE_GEOMETRY); + gi->setUrl (shapeURL); + } + break; + default: + printf("Unhandled %d\n", shape->getShapeType ()); + break; + } +} + + +domRigid_body* ColladaConverter::addRigidBody (btRigidBody* rb, const char* nodeName, const char* shapeName) +{ + btCollisionShape* shape = rb->getCollisionShape (); + char bodyName[512]; + char material_name[512]; + snprintf(&bodyName[0], 512, "%s-RigidBody", nodeName); + domPhysics_model* physicsModel = getDefaultPhysicsModel (); + domRigid_body* colladaRigidBody = daeSafeCast(physicsModel->createAndPlace (COLLADA_ELEMENT_RIGID_BODY)); + colladaRigidBody->setSid (bodyName); + colladaRigidBody->setName (bodyName); + domRigid_body::domTechnique_common* common = daeSafeCast(colladaRigidBody->createAndPlace (COLLADA_ELEMENT_TECHNIQUE_COMMON)); + domRigid_body::domTechnique_common::domDynamic* dynamic = daeSafeCast(common->createAndPlace (COLLADA_ELEMENT_DYNAMIC)); + domTargetableFloat* mass = daeSafeCast(common->createAndPlace (COLLADA_ELEMENT_MASS)); + domTargetableFloat3* inertia = daeSafeCast(common->createAndPlace (COLLADA_ELEMENT_INERTIA)); + if (rb->getInvMass() == 0.0) + { + domFloat3 inertia_value; + inertia_value.append (0.0); + inertia_value.append (0.0); + inertia_value.append (0.0); + mass->setValue (0.0); + dynamic->setValue (false); + inertia->setValue (inertia_value); + } else { + btVector3 II = rb->getInvInertiaDiagLocal (); + domFloat3 inertia_value; + inertia_value.append (II[0] == 0.0 ? 0.0 : 1.0 / II[0]); + inertia_value.append (II[1] == 0.0 ? 0.0 : 1.0 / II[1]); + inertia_value.append (II[2] == 0.0 ? 0.0 : 1.0 / II[2]); + mass->setValue (1.0/rb->getInvMass()); + dynamic->setValue (true); + inertia->setValue (inertia_value); + } + //domRigid_body::domTechnique_common::domMass_frame* massFrame = daeSafeCast(common->createAndPlace (COLLADA_ELEMENT_MASS_FRAME)); + + // physics material + domInstance_physics_material* mi = (domInstance_physics_material*)common->createAndPlace (COLLADA_ELEMENT_INSTANCE_PHYSICS_MATERIAL); + snprintf(&material_name[0], 512, "#%s-PhysicsMaterial", nodeName); + mi->setUrl (material_name); + // collision shape + + buildShapeNew (shape, common, shapeName); + + return colladaRigidBody; +} + + +domNode* ColladaConverter::addNode (btRigidBody* rb, const char* nodeName, const char* shapeName) +{ + domVisual_scene* vscene = getDefaultVisualScene (); + + domNode* node = (domNode*)vscene->createAndPlace (COLLADA_ELEMENT_NODE); + + node->setId (nodeName); + node->setName (nodeName); + + domTranslate* translation = (domTranslate*)node->createAndPlace (COLLADA_ELEMENT_TRANSLATE); + { + btVector3 np = rb->getWorldTransform().getOrigin(); + translation->getValue().append(np[0]); + translation->getValue().append(np[1]); + translation->getValue().append(np[2]); + } + domRotate* rotation = (domRotate*)node->createAndPlace (COLLADA_ELEMENT_ROTATE); + { + btQuaternion quat = rb->getWorldTransform().getRotation(); + btVector3 axis(quat.getX(),quat.getY(),quat.getZ()); + axis[3] = 0.f; + //check for axis length + btScalar len = axis.length2(); + if (len < SIMD_EPSILON*SIMD_EPSILON) + axis = btVector3(1.f,0.f,0.f); + else + axis /= btSqrt(len); + rotation->getValue().set(0,axis[0]); + rotation->getValue().set(1,axis[1]); + rotation->getValue().set(2,axis[2]); + rotation->getValue().set(3,quat.getAngle()*SIMD_DEGS_PER_RAD); + } + + domInstance_geometryRef gr = daeSafeCast(node->createAndPlace(COLLADA_ELEMENT_INSTANCE_GEOMETRY)); + + char shapeURL[512]; + snprintf(&shapeURL[0], 512, "#%s", shapeName); + gr->setUrl(shapeURL); + gr->createAndPlace(COLLADA_ELEMENT_BIND_MATERIAL)->createAndPlace(COLLADA_ELEMENT_TECHNIQUE_COMMON); + + /* + + + + + */ + + return node; +} + + +domRigid_constraint* ColladaConverter::addConstraint (btTypedConstraint* originalConstraint, const char* constraintName) +{ + btGeneric6DofConstraint* constraint = 0; + btGeneric6DofConstraint* tmpConstraint = 0; + + switch (originalConstraint->getConstraintType()) + { + + case D6_CONSTRAINT_TYPE: + { + constraint = (btGeneric6DofConstraint*)originalConstraint; + break; + } + + case POINT2POINT_CONSTRAINT_TYPE: + { + btPoint2PointConstraint* p2p = (btPoint2PointConstraint*) originalConstraint; + bool useLinearReferenceFrameA = true; + btTransform frameA,frameB; + frameA.setIdentity(); + frameB.setIdentity(); + frameA.setOrigin(p2p->getPivotInA()); + frameB.setOrigin(p2p->getPivotInB()); + tmpConstraint = new btGeneric6DofConstraint(p2p->getRigidBodyA(),p2p->getRigidBodyB(),frameA,frameB,useLinearReferenceFrameA); + tmpConstraint->setLinearLowerLimit(btVector3(0,0,0)); + tmpConstraint->setLinearUpperLimit(btVector3(0,0,0)); + constraint = tmpConstraint; + break; + } + case HINGE_CONSTRAINT_TYPE: + { + btHingeConstraint* hinge = (btHingeConstraint*)originalConstraint; + bool useLinearReferenceFrameA = true; + btTransform frameB = hinge->getBFrame();//todo: remove this flipping + frameB.getBasis()[0][2] *= btScalar(-1.); + frameB.getBasis()[1][2] *= btScalar(-1.); + frameB.getBasis()[2][2] *= btScalar(-1.); + + tmpConstraint = new btGeneric6DofConstraint(hinge->getRigidBodyA(),hinge->getRigidBodyB(),hinge->getAFrame(),frameB,useLinearReferenceFrameA); + tmpConstraint->setLinearLowerLimit(btVector3(0,0,0)); + tmpConstraint->setLinearUpperLimit(btVector3(0,0,0)); + tmpConstraint->setAngularLowerLimit(btVector3(0,0,1)); + tmpConstraint->setAngularUpperLimit(btVector3(0,0,-1));//maxgetConstraintType() != D6_CONSTRAINT_TYPE)) + return NULL; + + btGeneric6DofConstraint* g6c = (btGeneric6DofConstraint*)constraint; + const btRigidBody& rb1 = g6c->getRigidBodyA (); + const btRigidBody& rb2 = g6c->getRigidBodyB (); + + bool single = (findRigid_body(&rb2)==NULL); + + domPhysics_model* physicsModel = getDefaultPhysicsModel (); + domRigid_constraint* domRigidConstraint = (domRigid_constraint*)physicsModel->createAndPlace (COLLADA_ELEMENT_RIGID_CONSTRAINT); + domRigidConstraint->setName (constraintName); + domRigidConstraint->setSid (constraintName); + if (single) + { + domRigid_body* domRigidBody = findRigid_body(&rb1); + btAssert(domRigidBody); + + const char* name = domRigidBody->getName(); + btTransform rb1Frame = g6c->getFrameOffsetA (); + printf("Joint with single body: %s\n", name); + domRigid_constraint::domAttachment* attachment = (domRigid_constraint::domAttachment*)domRigidConstraint->createAndPlace (COLLADA_ELEMENT_ATTACHMENT); + attachment->setRigid_body (name); + { + domTranslate* translation = (domTranslate*)attachment->createAndPlace (COLLADA_ELEMENT_TRANSLATE); + { + btVector3 np = rb1Frame.getOrigin(); + translation->getValue().append(np[0]); + translation->getValue().append(np[1]); + translation->getValue().append(np[2]); + } + domRotate* rotation = (domRotate*)attachment->createAndPlace (COLLADA_ELEMENT_ROTATE); + { + btQuaternion quat = rb1Frame.getRotation(); + btVector3 axis(quat.getX(),quat.getY(),quat.getZ()); + axis[3] = 0.f; + //check for axis length + btScalar len = axis.length2(); + if (len < SIMD_EPSILON*SIMD_EPSILON) + axis = btVector3(1.f,0.f,0.f); + else + axis /= btSqrt(len); + rotation->getValue().set(0,axis[0]); + rotation->getValue().set(1,axis[1]); + rotation->getValue().set(2,axis[2]); + rotation->getValue().set(3,quat.getAngle()*SIMD_DEGS_PER_RAD); + } + + } + } else { + domRigid_body* domRigidBody1 = findRigid_body(&rb1); + domRigid_body* domRigidBody2 = findRigid_body(&rb2); + + const char* name1 = domRigidBody1->getName(); + const char* name2 = domRigidBody2->getName(); + + printf("Joint attached to two bodies %s and %s\n", name1, name2); + + btTransform rb1Frame = g6c->getFrameOffsetA (); + btTransform rb2Frame = g6c->getFrameOffsetB (); + domRigid_constraint::domRef_attachment* refAttachment = (domRigid_constraint::domRef_attachment*)domRigidConstraint->createAndPlace (COLLADA_ELEMENT_REF_ATTACHMENT); + domRigid_constraint::domAttachment* attachment = (domRigid_constraint::domAttachment*)domRigidConstraint->createAndPlace (COLLADA_ELEMENT_ATTACHMENT); + refAttachment->setRigid_body (name1); + attachment->setRigid_body (name2); + { + domTranslate* translation = (domTranslate*)refAttachment->createAndPlace (COLLADA_ELEMENT_TRANSLATE); + { + btVector3 np = rb1Frame.getOrigin(); + translation->getValue().append(np[0]); + translation->getValue().append(np[1]); + translation->getValue().append(np[2]); + } + domRotate* rotation = (domRotate*)refAttachment->createAndPlace (COLLADA_ELEMENT_ROTATE); + { + btQuaternion quat = rb1Frame.getRotation(); + btVector3 axis(quat.getX(),quat.getY(),quat.getZ()); + axis[3] = 0.f; + //check for axis length + btScalar len = axis.length2(); + if (len < SIMD_EPSILON*SIMD_EPSILON) + axis = btVector3(1.f,0.f,0.f); + else + axis /= btSqrt(len); + rotation->getValue().set(0,axis[0]); + rotation->getValue().set(1,axis[1]); + rotation->getValue().set(2,axis[2]); + rotation->getValue().set(3,quat.getAngle()*SIMD_DEGS_PER_RAD); + } + + } + { + domTranslate* translation = (domTranslate*)attachment->createAndPlace (COLLADA_ELEMENT_TRANSLATE); + { + btVector3 np = rb2Frame.getOrigin(); + translation->getValue().append(np[0]); + translation->getValue().append(np[1]); + translation->getValue().append(np[2]); + } + domRotate* rotation = (domRotate*)attachment->createAndPlace (COLLADA_ELEMENT_ROTATE); + { + btQuaternion quat = rb2Frame.getRotation(); + btVector3 axis(quat.getX(),quat.getY(),quat.getZ()); + axis[3] = 0.f; + //check for axis length + btScalar len = axis.length2(); + if (len < SIMD_EPSILON*SIMD_EPSILON) + axis = btVector3(1.f,0.f,0.f); + else + axis /= btSqrt(len); + rotation->getValue().set(0,axis[0]); + rotation->getValue().set(1,axis[1]); + rotation->getValue().set(2,axis[2]); + rotation->getValue().set(3,quat.getAngle()*SIMD_DEGS_PER_RAD); + } + } + } + domRigid_constraint::domTechnique_common* techniqueCommon = (domRigid_constraint::domTechnique_common*)domRigidConstraint->createAndPlace (COLLADA_ELEMENT_TECHNIQUE_COMMON); + domRigid_constraint::domTechnique_common::domEnabled* enabled = (domRigid_constraint::domTechnique_common::domEnabled*)techniqueCommon->createAndPlace (COLLADA_ELEMENT_ENABLED); + enabled->setValue (true); + domRigid_constraint::domTechnique_common::domInterpenetrate* interpenetrate = (domRigid_constraint::domTechnique_common::domInterpenetrate*)techniqueCommon->createAndPlace (COLLADA_ELEMENT_INTERPENETRATE); + interpenetrate->setValue (false); + domRigid_constraint::domTechnique_common::domLimits* limits = (domRigid_constraint::domTechnique_common::domLimits*)techniqueCommon->createAndPlace (COLLADA_ELEMENT_LIMITS); + domRigid_constraint::domTechnique_common::domLimits::domSwing_cone_and_twist* swingConeAndTwist = (domRigid_constraint::domTechnique_common::domLimits::domSwing_cone_and_twist*)limits->createAndPlace (COLLADA_ELEMENT_SWING_CONE_AND_TWIST); + domRigid_constraint::domTechnique_common::domLimits::domLinear* linear = (domRigid_constraint::domTechnique_common::domLimits::domLinear*)limits->createAndPlace (COLLADA_ELEMENT_LINEAR); + + { + domTargetableFloat3* min = (domTargetableFloat3*)swingConeAndTwist->createAndPlace (COLLADA_ELEMENT_MIN); + domTargetableFloat3* max = (domTargetableFloat3*)swingConeAndTwist->createAndPlace (COLLADA_ELEMENT_MAX); + btRotationalLimitMotor* limit = g6c->getRotationalLimitMotor (0); + min->getValue().set(0, limit->m_loLimit); + max->getValue().set(0, limit->m_hiLimit); + limit = g6c->getRotationalLimitMotor (1); + min->getValue().set(1, limit->m_loLimit); + max->getValue().set(1, limit->m_hiLimit); + limit = g6c->getRotationalLimitMotor (2); + min->getValue().set(2, limit->m_loLimit); + max->getValue().set(2, limit->m_hiLimit); + } + { + domTargetableFloat3* min = (domTargetableFloat3*)linear->createAndPlace (COLLADA_ELEMENT_MIN); + domTargetableFloat3* max = (domTargetableFloat3*)linear->createAndPlace (COLLADA_ELEMENT_MAX); + btTranslationalLimitMotor* limit = g6c->getTranslationalLimitMotor (); + min->getValue().set (0, limit->m_lowerLimit[0]); + min->getValue().set (1, limit->m_lowerLimit[1]); + min->getValue().set (2, limit->m_lowerLimit[2]); + max->getValue().set (0, limit->m_upperLimit[0]); + max->getValue().set (1, limit->m_upperLimit[1]); + max->getValue().set (2, limit->m_upperLimit[2]); + } + if (tmpConstraint) + delete tmpConstraint; + return domRigidConstraint; +} + +domInstance_rigid_constraint* ColladaConverter::addConstraintInstance (btTypedConstraint* constraint, const char* constraintName) +{ + domInstance_physics_model* mi = getDefaultInstancePhysicsModel (); + domInstance_rigid_constraint* rci = (domInstance_rigid_constraint*)mi->createAndPlace (COLLADA_ELEMENT_INSTANCE_RIGID_CONSTRAINT); + rci->setConstraint (constraintName); + return rci; +} + +domInstance_rigid_body* ColladaConverter::addRigidBodyInstance (btRigidBody* rb, const char* nodeName) +{ + char targetName[512]; + char bodyName[512]; + snprintf(&targetName[0], 512, "#%s", nodeName); + snprintf(&bodyName[0], 512, "%s-RigidBody", nodeName); + + domInstance_physics_model* mi = getDefaultInstancePhysicsModel (); + domInstance_rigid_body* rbi = (domInstance_rigid_body*)mi->createAndPlace (COLLADA_ELEMENT_INSTANCE_RIGID_BODY); + domInstance_rigid_body::domTechnique_common* common = (domInstance_rigid_body::domTechnique_common*)rbi->createAndPlace (COLLADA_ELEMENT_TECHNIQUE_COMMON); + + rbi->setBody (bodyName); + rbi->setTarget (targetName); + + domInstance_rigid_body::domTechnique_common::domAngular_velocity* av = (domInstance_rigid_body::domTechnique_common::domAngular_velocity*)common->createAndPlace (COLLADA_ELEMENT_ANGULAR_VELOCITY); + { + btVector3 btAv = rb->getAngularVelocity (); + av->getValue().set3 (btAv[0], btAv[1], btAv[2]); + } + domInstance_rigid_body::domTechnique_common::domVelocity* lv = (domInstance_rigid_body::domTechnique_common::domVelocity*)common->createAndPlace (COLLADA_ELEMENT_VELOCITY); + { + btVector3 btLv = rb->getLinearVelocity (); + lv->getValue().set3 (btLv[0], btLv[1], btLv[2]); + } + return rbi; +} + +void ColladaConverter::addMaterial (btRigidBody* rb, const char* nodeName) +{ + btScalar friction = rb->getFriction (); + btScalar restitution = rb->getRestitution (); + domLibrary_physics_materials* materialsLib = getDefaultMaterialsLib (); + if (!materialsLib) + { + printf("Something has gone terribly wrong.\n"); + return; + } + domPhysics_material* material = (domPhysics_material*)materialsLib->createAndPlace (COLLADA_ELEMENT_PHYSICS_MATERIAL); + char material_name[512]; + snprintf(&material_name[0], 512, "%s-PhysicsMaterial", nodeName); + material->setName (material_name); + material->setId (material_name); + domPhysics_material::domTechnique_common* material_common = (domPhysics_material::domTechnique_common*)material->createAndPlace(COLLADA_ELEMENT_TECHNIQUE_COMMON); + domTargetableFloat* mf = (domTargetableFloat*)material_common->createAndPlace (COLLADA_ELEMENT_DYNAMIC_FRICTION); + mf->setValue (friction); + mf = (domTargetableFloat*)material_common->createAndPlace (COLLADA_ELEMENT_STATIC_FRICTION); + mf->setValue (friction); + mf = (domTargetableFloat*)material_common->createAndPlace (COLLADA_ELEMENT_RESTITUTION); + mf->setValue (restitution); + +} + +void ColladaConverter::updateRigidBodyPosition (btRigidBody* body, domNode* node) +{ + // remove all translations + while (node->getTranslate_array().getCount()) + { + node->removeFromParent(node->getTranslate_array().get(0)); + } + + // remove all rotation matrices + while (node->getMatrix_array().getCount()) + { + node->removeFromParent(node->getMatrix_array().get(0)); + } + + // remove all quaternions + while (node->getRotate_array().getCount()) + { + node->removeFromParent(node->getRotate_array().get(0)); + } + + // update translation + { + domTranslateRef transl = daeSafeCast(node->createAndPlace("translate")); + btVector3 np = body->getWorldTransform().getOrigin(); + domFloat3 newPos = node->getTranslate_array().get(0)->getValue(); + newPos.set(0,np[0]); + newPos.set(1,np[1]); + newPos.set(2,np[2]); + transl->setValue(newPos); + } + + // update rotation + { + domRotateRef rot = daeSafeCast(node->createAndPlace("rotate")); + btQuaternion quat = body->getCenterOfMassTransform().getRotation(); + btVector3 axis(quat.getX(),quat.getY(),quat.getZ()); + axis[3] = 0.f; + //check for axis length + btScalar len = axis.length2(); + if (len < SIMD_EPSILON*SIMD_EPSILON) + axis = btVector3(1.f,0.f,0.f); + else + axis /= btSqrt(len); + rot->getValue().set(0,axis[0]); + rot->getValue().set(1,axis[1]); + rot->getValue().set(2,axis[2]); + rot->getValue().set(3,quat.getAngle()*SIMD_DEGS_PER_RAD); + } +} + +void ColladaConverter::updateRigidBodyVelocity (btRigidBody* body) +{ + domInstance_rigid_bodyRef rigidBodyInstance = findRigid_body_instance (body); + if (!rigidBodyInstance) + return; + + printf("Updating rigid body velocities %ps\n", body); + domInstance_rigid_body::domTechnique_common* common = NULL; + domInstance_rigid_body::domTechnique_common::domAngular_velocity* av = NULL; + domInstance_rigid_body::domTechnique_common::domVelocity* lv = NULL; + + if (rigidBodyInstance->getTechnique_common()) + { + common = rigidBodyInstance->getTechnique_common (); + av = common->getAngular_velocity (); + lv = common->getVelocity (); + if (av) + common->removeFromParent (av); + if (lv) + common->removeFromParent (lv); + + av = NULL; + lv = NULL; + } else { + common = daeSafeCast(rigidBodyInstance->createAndPlace (COLLADA_ELEMENT_TECHNIQUE_COMMON)); + } + av = daeSafeCast(common->createAndPlace (COLLADA_ELEMENT_ANGULAR_VELOCITY)); + lv = daeSafeCast(common->createAndPlace (COLLADA_ELEMENT_VELOCITY)); + + { + btVector3 btAv = body->getAngularVelocity (); + av->getValue().set3 (btAv[0], btAv[1], btAv[2]); + } + { + btVector3 btLv = body->getLinearVelocity (); + lv->getValue().set3 (btLv[0], btLv[1], btLv[2]); + } +} + +void ColladaConverter::updateConstraint (btTypedConstraint* constraint, domRigid_constraint* rigidConstraint) +{ + if (constraint->getConstraintType() != D6_CONSTRAINT_TYPE) + return; + + btGeneric6DofConstraint* g6c = (btGeneric6DofConstraint*)constraint; + const btRigidBody& rb1 = g6c->getRigidBodyA (); + const btRigidBody& rb2 = g6c->getRigidBodyB (); + bool single = (findRigid_body(&rb2)==NULL); + + if (single) + { + printf("Joint with single body\n"); + domRigid_body* domRigidBody = findRigid_body(&rb1); + const char* name = domRigidBody->getSid(); + btTransform rb1Frame = g6c->getFrameOffsetA (); + domRigid_constraint::domAttachmentRef attachment = daeSafeCast(rigidConstraint->createAndPlace (COLLADA_ELEMENT_ATTACHMENT)); + attachment->setRigid_body (name); + { + domTranslateRef translation = daeSafeCast(attachment->createAndPlace (COLLADA_ELEMENT_TRANSLATE)); + { + btVector3 np = rb1Frame.getOrigin(); + translation->getValue().append(np[0]); + translation->getValue().append(np[1]); + translation->getValue().append(np[2]); + } + domRotateRef rotation = daeSafeCast(attachment->createAndPlace (COLLADA_ELEMENT_ROTATE)); + { + btQuaternion quat = rb1Frame.getRotation(); + btVector3 axis(quat.getX(),quat.getY(),quat.getZ()); + axis[3] = 0.f; + //check for axis length + btScalar len = axis.length2(); + if (len < SIMD_EPSILON*SIMD_EPSILON) + axis = btVector3(1.f,0.f,0.f); + else + axis /= btSqrt(len); + rotation->getValue().set(0,axis[0]); + rotation->getValue().set(1,axis[1]); + rotation->getValue().set(2,axis[2]); + rotation->getValue().set(3,quat.getAngle()*SIMD_DEGS_PER_RAD); + } + + } + } else { + printf("Joint attached to two bodies\n"); + domRigid_body* domRigidBody1 = findRigid_body(&rb1); + domRigid_body* domRigidBody2 = findRigid_body(&rb2); + + const char* name1 = domRigidBody1->getSid(); + const char* name2 = domRigidBody2->getSid(); + + btTransform rb1Frame = g6c->getFrameOffsetA (); + btTransform rb2Frame = g6c->getFrameOffsetB (); + domRigid_constraint::domRef_attachmentRef refAttachment = daeSafeCast(rigidConstraint->createAndPlace (COLLADA_ELEMENT_REF_ATTACHMENT)); + domRigid_constraint::domAttachmentRef attachment = daeSafeCast(rigidConstraint->createAndPlace (COLLADA_ELEMENT_ATTACHMENT)); + refAttachment->setRigid_body (name1); + attachment->setRigid_body (name2); + { + domTranslate* translation = (domTranslate*)refAttachment->createAndPlace (COLLADA_ELEMENT_TRANSLATE); + { + btVector3 np = rb1Frame.getOrigin(); + translation->getValue().append(np[0]); + translation->getValue().append(np[1]); + translation->getValue().append(np[2]); + } + domRotate* rotation = (domRotate*)refAttachment->createAndPlace (COLLADA_ELEMENT_ROTATE); + { + btQuaternion quat = rb1Frame.getRotation(); + btVector3 axis(quat.getX(),quat.getY(),quat.getZ()); + axis[3] = 0.f; + //check for axis length + btScalar len = axis.length2(); + if (len < SIMD_EPSILON*SIMD_EPSILON) + axis = btVector3(1.f,0.f,0.f); + else + axis /= btSqrt(len); + rotation->getValue().set(0,axis[0]); + rotation->getValue().set(1,axis[1]); + rotation->getValue().set(2,axis[2]); + rotation->getValue().set(3,quat.getAngle()*SIMD_DEGS_PER_RAD); + } + + } + { + domTranslate* translation = (domTranslate*)attachment->createAndPlace (COLLADA_ELEMENT_TRANSLATE); + { + btVector3 np = rb2Frame.getOrigin(); + translation->getValue().append(np[0]); + translation->getValue().append(np[1]); + translation->getValue().append(np[2]); + } + domRotate* rotation = (domRotate*)attachment->createAndPlace (COLLADA_ELEMENT_ROTATE); + { + btQuaternion quat = rb2Frame.getRotation(); + btVector3 axis(quat.getX(),quat.getY(),quat.getZ()); + axis[3] = 0.f; + //check for axis length + btScalar len = axis.length2(); + if (len < SIMD_EPSILON*SIMD_EPSILON) + axis = btVector3(1.f,0.f,0.f); + else + axis /= btSqrt(len); + rotation->getValue().set(0,axis[0]); + rotation->getValue().set(1,axis[1]); + rotation->getValue().set(2,axis[2]); + rotation->getValue().set(3,quat.getAngle()*SIMD_DEGS_PER_RAD); + } + } + } + domRigid_constraint::domTechnique_commonRef techniqueCommon = daeSafeCast(rigidConstraint->createAndPlace (COLLADA_ELEMENT_TECHNIQUE_COMMON)); + domRigid_constraint::domTechnique_common::domEnabledRef enabled = daeSafeCast(techniqueCommon->createAndPlace (COLLADA_ELEMENT_ENABLED)); + enabled->setValue (true); + domRigid_constraint::domTechnique_common::domInterpenetrateRef interpenetrate = daeSafeCast(techniqueCommon->createAndPlace (COLLADA_ELEMENT_INTERPENETRATE)); + interpenetrate->setValue (false); + domRigid_constraint::domTechnique_common::domLimitsRef limits = daeSafeCast(techniqueCommon->createAndPlace (COLLADA_ELEMENT_LIMITS)); + domRigid_constraint::domTechnique_common::domLimits::domSwing_cone_and_twistRef swingConeAndTwist = daeSafeCast(limits->createAndPlace (COLLADA_ELEMENT_SWING_CONE_AND_TWIST)); + domRigid_constraint::domTechnique_common::domLimits::domLinearRef linear = daeSafeCast(limits->createAndPlace (COLLADA_ELEMENT_LINEAR)); + + { + domTargetableFloat3* min = (domTargetableFloat3*)swingConeAndTwist->createAndPlace (COLLADA_ELEMENT_MIN); + domTargetableFloat3* max = (domTargetableFloat3*)swingConeAndTwist->createAndPlace (COLLADA_ELEMENT_MAX); + btRotationalLimitMotor* limit = g6c->getRotationalLimitMotor (0); + min->getValue().set(0, limit->m_loLimit); + max->getValue().set(0, limit->m_hiLimit); + limit = g6c->getRotationalLimitMotor (1); + min->getValue().set(1, limit->m_loLimit); + max->getValue().set(1, limit->m_hiLimit); + limit = g6c->getRotationalLimitMotor (2); + min->getValue().set(2, limit->m_loLimit); + max->getValue().set(2, limit->m_hiLimit); + } + { + domTargetableFloat3* min = (domTargetableFloat3*)linear->createAndPlace (COLLADA_ELEMENT_MIN); + domTargetableFloat3* max = (domTargetableFloat3*)linear->createAndPlace (COLLADA_ELEMENT_MAX); + btTranslationalLimitMotor* limit = g6c->getTranslationalLimitMotor (); + min->getValue().set (0, limit->m_lowerLimit[0]); + min->getValue().set (1, limit->m_lowerLimit[1]); + min->getValue().set (2, limit->m_lowerLimit[2]); + max->getValue().set (0, limit->m_upperLimit[0]); + max->getValue().set (1, limit->m_upperLimit[1]); + max->getValue().set (2, limit->m_upperLimit[2]); + } +} + +void ColladaConverter::syncOrAddGeometry (btCollisionShape* shape, const char* nodeName) +{ +} + +void ColladaConverter::syncOrAddRigidBody (btRigidBody* body) +{ + domNodeRef nodeRef = findNode (body); + domLibrary_geometriesRef geomLib = getDefaultGeomLib (); + + static int random_node_name_key = 0; + if (nodeRef != NULL) + { + updateRigidBodyPosition (body, nodeRef); + updateRigidBodyVelocity (body); + printf("Updating %s in the COLLADA DOM.\n", nodeRef->getId() ? nodeRef->getId() : ""); + } else { + /* This is a new body. */ + const char* shapeName = NULL; + const char* nodeName = NULL; + char nodeNameGen[512]; + char shapeNameGen[512]; + + domNode* dNode=NULL; + domRigid_body* dRigidBody=NULL; + domInstance_rigid_body* dInstanceRigidBody=NULL; + + printf("New body\n"); + btCollisionShape* shape = body->getCollisionShape (); + + if (!nodeName) + { + //repeat until we have a unique name + do + { + snprintf(&nodeNameGen[0], 512, "BulletUnnamed-%d", random_node_name_key++); + } + while (findNode(&nodeNameGen[0])); + + nodeName = &nodeNameGen[0]; + } + if (!shapeName) + { + snprintf(&shapeNameGen[0], 512, "%s-Geometry", nodeName); + shapeName = &shapeNameGen[0]; + } + + printf("Adding %s to COLLADA DOM.\n", nodeName); + + + switch (shape->getShapeType()) + { + case STATIC_PLANE_PROXYTYPE: + case BOX_SHAPE_PROXYTYPE: + case SPHERE_SHAPE_PROXYTYPE: + case CYLINDER_SHAPE_PROXYTYPE: + case CONVEX_TRIANGLEMESH_SHAPE_PROXYTYPE: + case CONVEX_HULL_SHAPE_PROXYTYPE: + { + char concaveShapeName[256]; + sprintf(concaveShapeName,"RenderMesh%s",shapeName); + dNode = addNode (body, nodeName, concaveShapeName); + break; + } + case SCALED_TRIANGLE_MESH_SHAPE_PROXYTYPE: + { + addScaledConcaveMesh (shape, shapeName); + btScaledBvhTriangleMeshShape* scaledShape = (btScaledBvhTriangleMeshShape*)shape; + dNode = addNode (body, nodeName, shapeName); + //add scaling + domScale* scale= (domScale*)dNode->createAndPlace (COLLADA_ELEMENT_SCALE); + { + btVector3 localScaling = scaledShape->getLocalScaling(); + scale->getValue().append(localScaling[0]); + scale->getValue().append(localScaling[1]); + scale->getValue().append(localScaling[2]); + } + + + break; + } + case TRIANGLE_MESH_SHAPE_PROXYTYPE: + { + addConcaveMesh (shape, shapeName); + dNode = addNode (body, nodeName, shapeName); + break; + } + case GIMPACT_SHAPE_PROXYTYPE: + { + addGimpactMesh (shape, shapeName); + dNode = addNode (body, nodeName, shapeName); + break; + } + default: + { + if (!shape->isConvex () && !shape->isCompound() && (shape->getShapeType()!=STATIC_PLANE_PROXYTYPE)) + { + printf("Unknown shape type. %d Skipping rigidbody.\n", shape->getShapeType()); + return; + } + dNode = addNode (body, nodeName, shapeName); + }; + + }; + + + + addMaterial (body, nodeName); + + dRigidBody = addRigidBody (body, nodeName, shapeName); + dInstanceRigidBody = addRigidBodyInstance (body, nodeName); + + + btRigidBodyColladaInfo* value = new btRigidBodyColladaInfo(body,dNode,dRigidBody,dInstanceRigidBody); + m_rbUserInfoHashMap.insert(btHashKeyPtr(value->getUid()),value); + } +} + +void ColladaConverter::syncOrAddConstraint (btTypedConstraint* constraint) +{ + domRigid_constraintRef rigidConstraint = findRigid_constraint (constraint); + + static int random_node_name_key = 0; + if (rigidConstraint) + { + updateConstraint (constraint, rigidConstraint); + } else { + + + char namebuf[512]; + const char* constraintName = NULL; + if (!constraintName) + { + // generate one, and repeat until we have a unique name + do + { + sprintf(&namebuf[0], "BulletUnnamedConstraint-%d", random_node_name_key++); + } + while (findNode(&namebuf[0])); + + constraintName = &namebuf[0]; + } + + domRigid_constraint* dRigidConstraint = addConstraint (constraint, constraintName); + if (!dRigidConstraint) + return; + + domInstance_rigid_constraint* dInstanceRigidConstraint = addConstraintInstance (constraint, constraintName); + + btRigidConstraintColladaInfo* value = new btRigidConstraintColladaInfo(constraint,dRigidConstraint,dInstanceRigidConstraint); + this->m_constraintUserInfoHashMap.insert(btHashKeyPtr(value->getUid()),value); + + + } +} + +bool ColladaConverter::save(const char* filename) +{ + if (!instantiateDom ()) + { + return false; + } + + int i; + + /* Dump the scene */ + for (i = 0; i < getNumRigidBodies (); i++) + { + syncOrAddRigidBody (getRigidBody(i)); + } + + /* Dump the constraints */ + for (i = 0; i < getNumConstraints (); i++) + { + syncOrAddConstraint (getConstraint(i)); + } + + { + m_collada->saveAs (filename); + } +#if 0 + if (m_collada) + { + for (int i=0;igetTranslate_array().getCount()) + { + domTranslate* transl = (domTranslate*) m_colladadomNodes[i]->createAndPlace("translate"); + transl->getValue().append(0.); + transl->getValue().append(0.); + transl->getValue().append(0.); + } + + while (m_colladadomNodes[i]->getTranslate_array().getCount() > 1) + { + m_colladadomNodes[i]->removeFromParent(m_colladadomNodes[i]->getTranslate_array().get(1)); + //m_colladadomNodes[i]->getTranslate_array().removeIndex(1); + } + + { + + btVector3 np = m_rigidBodies[i]->getWorldTransform().getOrigin(); + domFloat3 newPos = m_colladadomNodes[i]->getTranslate_array().get(0)->getValue(); + newPos.set(0,np[0]); + newPos.set(1,np[1]); + newPos.set(2,np[2]); + m_colladadomNodes[i]->getTranslate_array().get(0)->setValue(newPos); + + } + + + if (!m_colladadomNodes[i]->getRotate_array().getCount()) + { + domRotate* rot = (domRotate*)m_colladadomNodes[i]->createAndPlace("rotate"); + rot->getValue().append(1.0); + rot->getValue().append(0.0); + rot->getValue().append(0.0); + rot->getValue().append(0.0); + } + + while (m_colladadomNodes[i]->getRotate_array().getCount()>1) + { + m_colladadomNodes[i]->removeFromParent(m_colladadomNodes[i]->getRotate_array().get(1)); + //m_colladadomNodes[i]->getRotate_array().removeIndex(1); + + } + + { + btQuaternion quat = m_rigidBodies[i]->getCenterOfMassTransform().getRotation(); + btVector3 axis(quat.getX(),quat.getY(),quat.getZ()); + axis[3] = 0.f; + //check for axis length + btScalar len = axis.length2(); + if (len < SIMD_EPSILON*SIMD_EPSILON) + axis = btVector3(1.f,0.f,0.f); + else + axis /= btSqrt(len); + m_colladadomNodes[i]->getRotate_array().get(0)->getValue().set(0,axis[0]); + m_colladadomNodes[i]->getRotate_array().get(0)->getValue().set(1,axis[1]); + m_colladadomNodes[i]->getRotate_array().get(0)->getValue().set(2,axis[2]); + m_colladadomNodes[i]->getRotate_array().get(0)->getValue().set(3,quat.getAngle()*SIMD_DEGS_PER_RAD); + } + + while (m_colladadomNodes[i]->getMatrix_array().getCount()) + { + m_colladadomNodes[i]->removeFromParent(m_colladadomNodes[i]->getMatrix_array().get(0)); + //m_colladadomNodes[i]->getMatrix_array().removeIndex(0); + } + } + char saveName[550]; + static int saveCount=1; + sprintf(saveName,"%s%i",getLastFileName(),saveCount++); + char* name = &saveName[0]; + if (name[0] == '/') + { + name = &saveName[1]; + } + + if (m_dom->getAsset()->getContributor_array().getCount()) + { + if (!m_dom->getAsset()->getContributor_array().get(0)->getAuthor()) + { + m_dom->getAsset()->getContributor_array().get(0)->createAndPlace("author"); + } + + m_dom->getAsset()->getContributor_array().get(0)->getAuthor()->setValue + ("http://bulletphysics.com Erwin Coumans"); + + if (!m_dom->getAsset()->getContributor_array().get(0)->getAuthoring_tool()) + { + m_dom->getAsset()->getContributor_array().get(0)->createAndPlace("authoring_tool"); + } + + m_dom->getAsset()->getContributor_array().get(0)->getAuthoring_tool()->setValue +#ifdef WIN32 + ("Bullet ColladaPhysicsViewer-Win32-0.8"); +#else +#ifdef __APPLE__ + ("Bullet ColladaPhysicsViewer-MacOSX-0.8"); +#else + ("Bullet ColladaPhysicsViewer-UnknownPlatform-0.8"); +#endif +#endif + if (!m_dom->getAsset()->getContributor_array().get(0)->getComments()) + { + m_dom->getAsset()->getContributor_array().get(0)->createAndPlace("comments"); + } + m_dom->getAsset()->getContributor_array().get(0)->getComments()->setValue + ("Comments to Physics Forum at http://www.continuousphysics.com/Bullet/phpBB2/index.php"); + } + + m_collada->saveAs(name); + return true; + + } +#endif + return false; +} + +//some code that de-mangles the windows filename passed in as argument + + +char* ColladaConverter::getLastFileName() +{ + return m_cleaned_filename; +} + + +char* ColladaConverter::fixFileName(const char* lpCmdLine) +{ + + int i; + for (i=0;i<513;i++) + { + m_cleaned_filename[i]=0; + } + + // We might get a windows-style path on the command line, this can mess up the DOM which expects + // all paths to be URI's. This block of code does some conversion to try and make the input + // compliant without breaking the ability to accept a properly formatted URI. Right now this only + // displays the first filename + const char *in = lpCmdLine; + char* out = m_cleaned_filename; + *out = '\0'; + // If the first character is a ", skip it (filenames with spaces in them are quoted) + if(*in == '\"') + { + in++; + } + if(*(in+1) == ':') + { + // Second character is a :, assume we have a path with a drive letter and add a slash at the beginning + *(out++) = '/'; + } + + for(i =0; i<512; i++) + { + // If we hit a null or a quote, stop copying. This will get just the first filename. + if(*in == '\0' || *in == '\"') + break; + // Copy while swapping backslashes for forward ones + if(*in == '\\') + { + *out = '/'; + } + else + { + *out = *in; + } + in++; + out++; + } + + + return m_cleaned_filename; +} + +btCollisionShape* ColladaConverter::createPlaneShape(const btVector3& planeNormal,btScalar planeConstant) +{ + btCollisionShape* planeShape = new btStaticPlaneShape(planeNormal,planeConstant); + m_allocatedCollisionShapes.push_back(planeShape); + + return planeShape; +} + +btCollisionShape* ColladaConverter::createBoxShape(const btVector3& halfExtents) +{ + btCollisionShape* shape = new btBoxShape(halfExtents); + m_allocatedCollisionShapes.push_back(shape); + return shape; +} + +btCollisionShape* ColladaConverter::createSphereShape(btScalar radius) +{ + btCollisionShape* shape = new btSphereShape(radius); + m_allocatedCollisionShapes.push_back(shape); + return shape; +} + +btCompoundShape* ColladaConverter::createCompoundShape() +{ + btCompoundShape* shape = new btCompoundShape(); + m_allocatedCollisionShapes.push_back(shape); + return shape; +} + + + + +btCollisionShape* ColladaConverter::createCylinderShapeY(btScalar radius,btScalar height) +{ + btCollisionShape* shape = new btCylinderShape(btVector3(radius,height,radius)); + m_allocatedCollisionShapes.push_back(shape); + return shape; +} + +btTriangleMesh* ColladaConverter::createTriangleMeshContainer() +{ + btTriangleMesh* meshContainer = new btTriangleMesh(m_use32bitIndices,m_use4componentVertices); + return meshContainer; +} + +btConvexHullShape* ColladaConverter::createConvexHullShape() +{ + btConvexHullShape* shape = new btConvexHullShape(); + m_allocatedCollisionShapes.push_back(shape); + return shape; +} + +btCollisionShape* ColladaConverter::createBvhTriangleMeshShape(btTriangleMesh* trimesh) +{ + bool useQuantizedAabbCompression = true; + btCollisionShape* shape = new btBvhTriangleMeshShape(trimesh,useQuantizedAabbCompression); + m_allocatedCollisionShapes.push_back(shape); + return shape; +} + +btCollisionShape* ColladaConverter::createGimpactShape(btTriangleMesh* trimesh) +{ + btGImpactMeshShape* shape = new btGImpactMeshShape(trimesh); + shape->setMargin(0.f); + shape->updateBound(); + m_allocatedCollisionShapes.push_back(shape); + return shape; +} + +btCollisionShape* ColladaConverter::createConvexTriangleMeshShape(btTriangleMesh* trimesh) +{ + btCollisionShape* shape = new btConvexTriangleMeshShape(trimesh); + m_allocatedCollisionShapes.push_back(shape); + return shape; +} + + +int ColladaConverter::getNumCollisionShapes() const +{ + return m_allocatedCollisionShapes.size(); +} + +btCollisionShape* ColladaConverter::getCollisionShape(int shapeIndex) +{ + return m_allocatedCollisionShapes[shapeIndex]; +} + + +void ColladaConverter::deleteAllocatedCollisionShapes() +{ + int i; + for (i=0;igetTechnique_common(); + if (techniqueRef) + { + + if (techniqueRef->getMass()) + { + rbOutput.m_mass = techniqueRef->getMass()->getValue(); + } + if (techniqueRef->getDynamic()) + { + rbOutput.m_isDynamics = techniqueRef->getDynamic()->getValue(); + } + //a hack to interpret PhysX profile: + //when is true, make false... + //using the DOM is a pain... + const domExtra_Array& extraArray = rbInput.m_rigidBodyRef2->getExtra_array(); + unsigned int s=0; + + for (s = 0;s< extraArray.getCount();s++) + { + const domExtraRef extraRef = extraArray[s]; + const domTechnique_Array techniqueArray = extraRef->getTechnique_array(); + unsigned int t=0; + for (t=0;tgetContents(); + unsigned int u = 0; + for (u=0;ugetElementName(); + if (elemName && !strcmp(elemName,"kinematic")) + { + //daeMemoryRef memRef = elemRef->getValuePointer(); + + //daeBool hasVal = elemRef->hasValue(); + + //COLLADA_TYPE::TypeEnum mytype = elemRef->getElementType(); + //how can I make this cast safe? + const domAny* myAny = (const domAny*)elemRef.cast(); + daeString myVal = myAny->getValue(); + if (myVal) + { + if (!strcmp(myVal,"true")) + { + printf("revert bug in PhysX .dae export -> true means false\n"); + rbOutput.m_isDynamics = false; + } + } + } + } + } + } + +// +// +// 0.399999976 +// false + + + + //shapes + for (s=0;sgetShape_array().getCount();s++) + { + domRigid_body::domTechnique_common::domShapeRef shapeRef = techniqueRef->getShape_array()[s]; + + rbOutput.m_colShape = 0; + //future shape instancing + //rbOutput.m_colShape = findShapeForShapeRef(&shapeRef) + + + if (rbOutput.m_colShape) + { + + } else + { + + + + + if (shapeRef->getPlane()) + { + domPlaneRef planeRef = shapeRef->getPlane(); + if (planeRef->getEquation()) + { + const domFloat4 planeEq = planeRef->getEquation()->getValue(); + btVector3 planeNormal(planeEq.get(0),planeEq.get(1),planeEq.get(2)); + btScalar planeConstant = planeEq.get(3)*m_unitMeterScaling; + rbOutput.m_colShape = createPlaneShape(planeNormal,planeConstant); + } + + } + + if (shapeRef->getBox()) + { + domBoxRef boxRef = shapeRef->getBox(); + domBox::domHalf_extentsRef domHalfExtentsRef = boxRef->getHalf_extents(); + domFloat3& halfExtents = domHalfExtentsRef->getValue(); + float x = halfExtents.get(0)*m_unitMeterScaling; + float y = halfExtents.get(1)*m_unitMeterScaling; + float z = halfExtents.get(2)*m_unitMeterScaling; + rbOutput.m_colShape = createBoxShape(btVector3(x,y,z)); + } + if (shapeRef->getSphere()) + { + domSphereRef sphereRef = shapeRef->getSphere(); + domSphere::domRadiusRef radiusRef = sphereRef->getRadius(); + domFloat radius = radiusRef->getValue()*m_unitMeterScaling; + rbOutput.m_colShape = createSphereShape(radius); + } + + if (shapeRef->getCylinder()) + { + domCylinderRef cylinderRef = shapeRef->getCylinder(); + domFloat height = cylinderRef->getHeight()->getValue()*m_unitMeterScaling; + domFloat2 radius2 = cylinderRef->getRadius()->getValue(); + domFloat radius0 = radius2.get(0)*m_unitMeterScaling; + + //Cylinder around the local Y axis + rbOutput.m_colShape = createCylinderShapeY(radius0,height); + } + + if (shapeRef->getInstance_geometry()) + { + const domInstance_geometryRef geomInstRef = shapeRef->getInstance_geometry(); + daeElement* geomElem = geomInstRef->getUrl().getElement(); + //elemRef->getTypeName(); + domGeometry* geom = (domGeometry*) geomElem; + if (geom && geom->getMesh()) + { + const domMeshRef meshRef = geom->getMesh(); + + //it can be either triangle mesh, or we just pick the vertices/positions + + if (meshRef->getTriangles_array().getCount()) + { + + btTriangleMesh* trimesh = createTriangleMeshContainer(); + + + for (unsigned int tg = 0;tggetTriangles_array().getCount();tg++) + { + + + domTrianglesRef triRef = meshRef->getTriangles_array()[tg]; + const domPRef pRef = triRef->getP(); + btIndexedMesh meshPart; + meshPart.m_triangleIndexStride=0; + + + + int vertexoffset = -1; + domInputLocalOffsetRef indexOffsetRef; + + + for (unsigned int w=0;wgetInput_array().getCount();w++) + { + int offset = triRef->getInput_array()[w]->getOffset(); + daeString str = triRef->getInput_array()[w]->getSemantic(); + if (!strcmp(str,"VERTEX")) + { + indexOffsetRef = triRef->getInput_array()[w]; + vertexoffset = offset; + } + if (offset > meshPart.m_triangleIndexStride) + { + meshPart.m_triangleIndexStride = offset; + } + } + meshPart.m_triangleIndexStride++; + domListOfUInts indexArray =triRef->getP()->getValue(); + + //int* m_triangleIndexBase; + + + + meshPart.m_numTriangles = triRef->getCount(); + + const domVerticesRef vertsRef = meshRef->getVertices(); + int numInputs = vertsRef->getInput_array().getCount(); + for (int i=0;igetInput_array()[i]; + daeString str = localRef->getSemantic(); + if ( !strcmp(str,"POSITION")) + { + const domURIFragmentType& frag = localRef->getSource(); + + daeElementConstRef constElem = frag.getElement(); + + const domSourceRef node = *(const domSourceRef*)&constElem; + const domFloat_arrayRef flArray = node->getFloat_array(); + if (flArray) + { + const domListOfFloats& listFloats = flArray->getValue(); + + int k=vertexoffset; + int t=0; + int vertexStride = 3;//instead of hardcoded stride, should use the 'accessor' + for (;taddTriangle(verts[0],verts[1],verts[2]); + } + } + } + } + + } + + if (rbOutput.m_isDynamics) + { + printf("moving concave added\n"); + //rbOutput.m_colShape = createConvexTriangleMeshShape(trimesh); + rbOutput.m_colShape = createGimpactShape(trimesh); + } else + { + printf("static concave triangle added\n"); + + rbOutput.m_colShape = createBvhTriangleMeshShape(trimesh); + + //rbOutput.m_colShape = new btBvhTriangleMeshShape(trimesh); + //rbOutput.m_colShape = new btConvexTriangleMeshShape(trimesh); + + //btTriangleMeshShape + } + //rbOutput.m_colShape->setTypedUserInfo (new btShapeColladaInfo (geom)); + + } else + { + + btConvexHullShape* convexHull = createConvexHullShape(); + int numAddedVerts = 0; + + const domVerticesRef vertsRef = meshRef->getVertices(); + int numInputs = vertsRef->getInput_array().getCount(); + for (int i=0;igetInput_array()[i]; + daeString str = localRef->getSemantic(); + if ( !strcmp(str,"POSITION")) + { + const domURIFragmentType& frag = localRef->getSource(); + + daeElementConstRef constElem = frag.getElement(); + + const domSourceRef node = *(const domSourceRef*)&constElem; + const domFloat_arrayRef flArray = node->getFloat_array(); + if (flArray) + { + const domListOfFloats& listFloats = flArray->getValue(); + int vertexStride = 3;//instead of hardcoded stride, should use the 'accessor' + unsigned int vertIndex = 0; + for (vertIndex = 0;vertIndex < listFloats.getCount();vertIndex+=vertexStride) + { + //btVector3 verts[3]; + domFloat fl0 = listFloats.get(vertIndex); + domFloat fl1 = listFloats.get(vertIndex+1); + domFloat fl2 = listFloats.get(vertIndex+2); + convexHull->addPoint(btVector3(fl0,fl1,fl2) * m_unitMeterScaling); + } + } + } + } + //convexHull->addPoint(); + if (numAddedVerts > 0) + { + rbOutput.m_colShape = convexHull; + //rbOutput.m_colShape->setTypedUserInfo (new btShapeColladaInfo (geom)); + } else + { + deleteShape( convexHull); + printf("no vertices found for convex hull\n"); + } + + } + + + } + + if (geom && geom->getConvex_mesh()) + { + + { + const domConvex_meshRef convexRef = geom->getConvex_mesh(); + daeElementRef otherElemRef = convexRef->getConvex_hull_of().getElement(); + if ( otherElemRef != NULL ) + { + domGeometryRef linkedGeom = *(domGeometryRef*)&otherElemRef; + printf( "otherLinked\n"); + } else + { + printf("convexMesh polyCount = %i\n",convexRef->getPolygons_array().getCount()); + printf("convexMesh triCount = %i\n",convexRef->getTriangles_array().getCount()); + + } + } + + + + btConvexHullShape* convexHullShape = createConvexHullShape(); + + //it is quite a trick to get to the vertices, using Collada. + //we are not there yet... + + const domConvex_meshRef convexRef = geom->getConvex_mesh(); + //daeString urlref = convexRef->getConvex_hull_of().getURI(); + daeString urlref2 = convexRef->getConvex_hull_of().getOriginalURI(); + if (urlref2) + { + daeElementRef otherElemRef = convexRef->getConvex_hull_of().getElement(); + // if ( otherElemRef != NULL ) + // domGeometryRef linkedGeom = *(domGeometryRef*)&otherElemRef; + + // Load all the geometry libraries + for ( unsigned int i = 0; i < m_dom->getLibrary_geometries_array().getCount(); i++) + { + domLibrary_geometriesRef libgeom = m_dom->getLibrary_geometries_array()[i]; + //int index = libgeom->findLastIndexOf(urlref2); + //can't find it + + for ( unsigned int i = 0; i < libgeom->getGeometry_array().getCount(); i++) + { + //ReadGeometry( ); + domGeometryRef lib = libgeom->getGeometry_array()[i]; + if (!strcmp(lib->getId(),urlref2+1)) // skip the # at the front of urlref2 + { + //found convex_hull geometry + domMesh *meshElement = lib->getMesh();//linkedGeom->getMesh(); + if (meshElement) + { + const domVerticesRef vertsRef = meshElement->getVertices(); + int numInputs = vertsRef->getInput_array().getCount(); + for (int i=0;igetInput_array()[i]; + daeString str = localRef->getSemantic(); + if ( !strcmp(str,"POSITION")) + { + const domURIFragmentType& frag = localRef->getSource(); + + daeElementConstRef constElem = frag.getElement(); + + const domSourceRef node = *(const domSourceRef*)&constElem; + const domFloat_arrayRef flArray = node->getFloat_array(); + if (flArray) + { + int numElem = flArray->getCount(); + const domListOfFloats& listFloats = flArray->getValue(); + + for (int k=0;k+2addPoint(btVector3(fl0,fl1,fl2) * m_unitMeterScaling); + } + + } + + } + + + } + + } + } + + + + } + } + } else { + //no getConvex_hull_of but direct vertices + const domVerticesRef vertsRef = convexRef->getVertices(); + int numInputs = vertsRef->getInput_array().getCount(); + for (int i=0;igetInput_array()[i]; + daeString str = localRef->getSemantic(); + if ( !strcmp(str,"POSITION")) + { + const domURIFragmentType& frag = localRef->getSource(); + + daeElementConstRef constElem = frag.getElement(); + + const domSourceRef node = *(const domSourceRef*)&constElem; + const domFloat_arrayRef flArray = node->getFloat_array(); + if (flArray) + { + int numElem = flArray->getCount(); + const domListOfFloats& listFloats = flArray->getValue(); + + for (int k=0;k+2addPoint(btVector3(fl0,fl1,fl2)*m_unitMeterScaling); + } + + } + } + + } + + + } + + if (convexHullShape->getNumVertices()) + { + rbOutput.m_colShape = convexHullShape; + //rbOutput.m_colShape->setTypedUserInfo (new btShapeColladaInfo (geom)); + printf("created convexHullShape with %i points\n",convexHullShape->getNumVertices()); + } else + { + deleteShape( convexHullShape); + printf("failed to create convexHullShape\n"); + } + + + //domGeometryRef linkedGeom = *(domGeometryRef*)&otherElemRef; + + printf("convexmesh\n"); + + } + } + + //if more then 1 shape, or a non-identity local shapetransform + //use a compound + + bool hasShapeLocalTransform = ((shapeRef->getRotate_array().getCount() > 0) || + (shapeRef->getTranslate_array().getCount() > 0)); + + if (rbOutput.m_colShape) + { + if ((techniqueRef->getShape_array().getCount()>1) || + (hasShapeLocalTransform)) + { + + if (!rbOutput.m_compoundShape) + { + rbOutput.m_compoundShape = createCompoundShape(); + } + + btTransform localTransform; + localTransform.setIdentity(); + if (hasShapeLocalTransform) + { + localTransform = GetbtTransformFromCOLLADA_DOM( + emptyMatrixArray, + shapeRef->getRotate_array(), + shapeRef->getTranslate_array(), + m_unitMeterScaling + ); + } + + rbOutput.m_compoundShape->addChildShape(localTransform,rbOutput.m_colShape); + rbOutput.m_colShape = 0; + } + } + + } + + + //for future shape instancing + //storeShapeRef(shapeRef,rbOutput.m_colShape); + + + }//for each shape + } + + +} + + + + +///those 2 virtuals are called for each constraint/physics object +btTypedConstraint* ColladaConverter::createUniversalD6Constraint( + class btRigidBody* bodyRef,class btRigidBody* bodyOther, + btTransform& localAttachmentFrameRef, + btTransform& localAttachmentOther, + const btVector3& linearMinLimits, + const btVector3& linearMaxLimits, + const btVector3& angularMinLimits, + const btVector3& angularMaxLimits, + bool disableCollisionsBetweenLinkedBodies + ) + { + if (bodyRef) + { + if (!bodyOther) + { + btRigidBody::btRigidBodyConstructionInfo cinfo(0,0,0); + bodyOther = new btRigidBody(cinfo); + //needs to be in the world! + m_dynamicsWorld->addRigidBody(bodyOther); + + bodyOther->setWorldTransform(bodyRef->getWorldTransform()); + localAttachmentOther = localAttachmentFrameRef; + + } + + bool useReferenceFrameA = true; + btGeneric6DofConstraint* genericConstraint = new btGeneric6DofConstraint( + *bodyRef,*bodyOther, + localAttachmentFrameRef,localAttachmentOther,useReferenceFrameA); + + genericConstraint->setLinearLowerLimit(linearMinLimits); + genericConstraint->setLinearUpperLimit(linearMaxLimits); + genericConstraint->setAngularLowerLimit(angularMinLimits); + genericConstraint->setAngularUpperLimit(angularMaxLimits); + + m_dynamicsWorld->addConstraint( genericConstraint,disableCollisionsBetweenLinkedBodies ); + + return genericConstraint; + } + return 0; + } + +btRigidBody* ColladaConverter::createRigidBody(bool isDynamic, + float mass, + const btTransform& startTransform, + btCollisionShape* shape) +{ + + if (!isDynamic && (mass != 0.f)) + { + printf("Warning: non-dynamic objects needs to have zero mass!\n"); + mass = 0.f; + } + + if (isDynamic && (mass == 0.f)) + { + printf("Warning: dynamic rigidbodies needs nonzero mass!\n"); + mass = 1.f; + } + + btVector3 localInertia(0,0,0); + if (isDynamic) + shape->calculateLocalInertia(mass,localInertia); + + //using motionstate is recommended, it provides interpolation capabilities, and only synchronizes 'active' objects + btDefaultMotionState* myMotionState = new btDefaultMotionState(startTransform); + btRigidBody::btRigidBodyConstructionInfo cInfo(mass,myMotionState,shape,localInertia); + btRigidBody* body = new btRigidBody(cInfo); + + m_dynamicsWorld->addRigidBody(body); + return body; +} + +int ColladaConverter::getNumRigidBodies () +{ + return m_dynamicsWorld->getNumCollisionObjects(); +} + +btRigidBody* ColladaConverter::getRigidBody (int i) +{ + return btRigidBody::upcast(m_dynamicsWorld->getCollisionObjectArray ()[i]); +} + +int ColladaConverter::getNumConstraints () +{ + return m_dynamicsWorld->getNumConstraints (); +} + +btTypedConstraint* ColladaConverter::getConstraint (int i) +{ + return m_dynamicsWorld->getConstraint (i); +} + +void ColladaConverter::setGravity(const btVector3& grav) +{ + m_dynamicsWorld->setGravity(grav); +} + +btVector3 ColladaConverter::getGravity () +{ + return m_dynamicsWorld->getGravity (); +} + + +void ColladaConverter::registerRigidBody(btRigidBody* body, const char* name) +{ + if (!instantiateDom ()) + { + return; + } + + btRigidBodyColladaInfo* rbci = findRigidBodyColladaInfo(body); + + if (!rbci) + { + syncOrAddRigidBody (body); + rbci = findRigidBodyColladaInfo(body); + btAssert (rbci); + } + + // update dom + char bodyName[512]; + snprintf(&bodyName[0], 512, "%s-RigidBody", name); + rbci->m_domRigidBody->setSid (bodyName); + rbci->m_domRigidBody->setName (bodyName); + rbci->m_node->setId (name); + rbci->m_node->setName (name); + rbci->m_instanceRigidBody->setBody (bodyName); + daeURI uri; + uri.setElement( rbci->m_node ); + uri.resolveURI(); + rbci->m_instanceRigidBody->setTarget (uri); + + + int i; + for (i = 0; i < body->getNumConstraintRefs(); i++) + { + btTypedConstraint* constraint = body->getConstraintRef (i); + + // not support by the dom + if (constraint->getConstraintType() != D6_CONSTRAINT_TYPE) + continue; + + btRigidConstraintColladaInfo* rcci = findRigidConstraintColladaInfo(constraint); + + // not added to the dom yet + if (!rcci) + continue; + + domRigid_constraint* rigidConstraint = rcci->m_domRigidConstraint; + + if (&constraint->getRigidBodyA() == body) + { + domRigid_constraint::domRef_attachment* refAttachment = (domRigid_constraint::domRef_attachment*)rigidConstraint->getRef_attachment(); + refAttachment->setRigid_body (bodyName); + } else if (&constraint->getRigidBodyB() == body) { + domRigid_constraint::domAttachment* attachment = (domRigid_constraint::domAttachment*)rigidConstraint->getAttachment (); + attachment->setRigid_body (bodyName); + } + } + + +} + +void ColladaConverter::deRegisterRigidBody(btRigidBody* body) +{ + btRigidBodyColladaInfo* rbci = findRigidBodyColladaInfo (body); + + if (!rbci) + return; + + daeElement::removeFromParent (rbci->m_instanceRigidBody); + daeElement::removeFromParent (rbci->m_domRigidBody); + daeElement::removeFromParent (rbci->m_node); + + delete rbci; + + // remove from map + int uid = body->getBroadphaseProxy()->getUid(); + btHashKeyPtr tmpKey(uid); + m_rbUserInfoHashMap.remove (tmpKey); +} + +const char* ColladaConverter::getName (btRigidBody* body) +{ + btRigidBodyColladaInfo* rbci = findRigidBodyColladaInfo (body); + + if (!rbci) + return NULL; + + if (rbci->m_node->getId()) + return rbci->m_node->getId(); + else + return rbci->m_node->getSid(); +} + +void ColladaConverter::registerConstraint(btTypedConstraint* constraint, const char* name) +{ + if (!instantiateDom ()) + { + return; + } + + btRigidConstraintColladaInfo* rcci = findRigidConstraintColladaInfo(constraint); + if (!rcci) + { + syncOrAddConstraint (constraint); + rcci = findRigidConstraintColladaInfo(constraint); + } + + rcci->m_domRigidConstraint->setName(name); + rcci->m_domRigidConstraint->setSid(name); + rcci->m_domInstanceRigidConstraint->setConstraint (name); +} + +void ColladaConverter::deRegisterConstraint(btTypedConstraint* constraint) +{ + if (constraint->getConstraintType () != D6_CONSTRAINT_TYPE) + { + return; + } + + btRigidConstraintColladaInfo* rcci = findRigidConstraintColladaInfo(constraint); + + if (!rcci) + { + return; + } + + daeElement::removeFromParent (rcci->m_domInstanceRigidConstraint); + daeElement::removeFromParent (rcci->m_domRigidConstraint); + delete rcci; + + // remove from map + int uid = constraint->getUid(); + btHashKeyPtr tmpKey(uid); + m_constraintUserInfoHashMap.remove (tmpKey); +} + + +const char* ColladaConverter::getName (btTypedConstraint* constraint) +{ + btRigidConstraintColladaInfo* rcci = findRigidConstraintColladaInfo (constraint); + + if (!rcci) + return NULL; + + return rcci->m_domRigidConstraint->getSid(); +} diff --git a/BulletPhysics/bulletTrunk/Extras/BulletColladaConverter/ColladaConverter.h b/BulletPhysics/bulletTrunk/Extras/BulletColladaConverter/ColladaConverter.h new file mode 100644 index 00000000..610e58b8 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/BulletColladaConverter/ColladaConverter.h @@ -0,0 +1,251 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + + + +#ifndef COLLADA_CONVERTER_H +#define COLLADA_CONVERTER_H + +#include "LinearMath/btTransform.h" +#include "LinearMath/btVector3.h" +#include "LinearMath/btAlignedObjectArray.h" +#include "LinearMath/btHashMap.h" + +class btCollisionShape; +class btRigidBody; +class btTypedConstraint; +class btDynamicsWorld; +struct ConstraintInput; +class btRigidBodyColladaInfo; + +class btRigidBodyColladaInfo +{ +public: + class domNode* m_node; + class domRigid_body* m_domRigidBody; + class domInstance_rigid_body* m_instanceRigidBody; + btRigidBody* m_body; + + int getUid(); + + btRigidBodyColladaInfo (btRigidBody* body, domNode* node, domRigid_body* rigidBody, domInstance_rigid_body* instanceRigidBody) + { + m_body = body; + m_node = node; + m_domRigidBody = rigidBody; + m_instanceRigidBody = instanceRigidBody; + } +}; + + + + +class btRigidConstraintColladaInfo +{ +public: + btTypedConstraint* m_typedConstraint; + class domRigid_constraint* m_domRigidConstraint; + class domInstance_rigid_constraint* m_domInstanceRigidConstraint; + + int getUid(); + + btRigidConstraintColladaInfo (btTypedConstraint* constraint, domRigid_constraint* rigidConstraint, domInstance_rigid_constraint* domInstanceRigidConstraint) + { + m_typedConstraint = constraint; + m_domRigidConstraint = rigidConstraint; + m_domInstanceRigidConstraint = domInstanceRigidConstraint; + } + + +}; + + + + + +///ColladaConverter helps converting the physics assets from COLLADA DOM into physics objects +class ColladaConverter +{ + char m_cleaned_filename[513]; + + +protected: + + btDynamicsWorld* m_dynamicsWorld; + + btAlignedObjectArray m_allocatedCollisionShapes; + + + btHashMap,btRigidBodyColladaInfo*> m_rbUserInfoHashMap; + btHashMap,btRigidConstraintColladaInfo*> m_constraintUserInfoHashMap; + + class DAE* m_collada; + class domCOLLADA* m_dom; + char* m_filename; + + float m_unitMeterScaling; + bool m_use32bitIndices; + bool m_use4componentVertices; + + void PreparePhysicsObject(struct btRigidBodyInput& input, bool isDynamics, float mass,btCollisionShape* colShape, const btVector3& linearVelocity, const btVector3& angularVelocity); + + void prepareConstraints(ConstraintInput& input); + + void ConvertRigidBodyRef( struct btRigidBodyInput& , struct btRigidBodyOutput& output ); + + bool convert (); + + btRigidBodyColladaInfo* findRigidBodyColladaInfo(const btRigidBody* body); + btRigidConstraintColladaInfo* findRigidConstraintColladaInfo(btTypedConstraint* constraint); + + bool instantiateDom (); + + /* Searches based on matching name/id */ + class domNode* findNode (const char* nodeName); + class domRigid_body* findRigid_body (const char* rigidBodyName); + class domInstance_rigid_body* findRigid_body_instance (const char* nodeName); + class domRigid_constraint* findRigid_constraint (const char* constraintName); + class domGeometry* findGeometry (const char* shapeName); + + class domNode* findNode (btRigidBody* rb); + class domRigid_body* findRigid_body (const btRigidBody* rb); + class domInstance_rigid_body* findRigid_body_instance (btRigidBody* rb); + class domRigid_constraint* findRigid_constraint (btTypedConstraint* constraint); + //class domGeometry* findGeometry (btCollisionShape* shape); + + /* These are the locations that NEW elements will be added to */ + class domLibrary_geometries* getDefaultGeomLib (); + class domLibrary_physics_materials* getDefaultMaterialsLib (); + class domPhysics_model* getDefaultPhysicsModel (); + class domInstance_physics_model* getDefaultInstancePhysicsModel (); + + /* Currently we assume that there is only a single physics and visual scene */ + class domPhysics_scene* getDefaultPhysicsScene (); + class domVisual_scene* getDefaultVisualScene (); + + void buildShapeNew(btCollisionShape* shape, void* domTechniqueCommon, const char* shapeName, bool isChild=false,const btTransform& childTrans=btTransform::getIdentity()); + + + void addConvexHull (btCollisionShape* shape, const char* nodeName); + void addConvexMesh (btCollisionShape* shape, const char* nodeName); + void addConcaveMesh(btCollisionShape* shape, const char* nodeName); + void addScaledConcaveMesh(btCollisionShape* shape, const char* nodeName); + void addGimpactMesh(btCollisionShape* shape, const char* nodeName); + + void addConcaveMeshInternal(class btStridingMeshInterface* meshInterface , const char* nodeName); + + class domNode* addNode (btRigidBody* body, const char* nodeName, const char* shapeName); + class domRigid_constraint* addConstraint (btTypedConstraint* constraint, const char* constraintName); + class domInstance_rigid_constraint* addConstraintInstance (btTypedConstraint* constraint, const char* constraintName); + void addMaterial (btRigidBody* body, const char* nodeName); + class domRigid_body* addRigidBody (btRigidBody* body, const char* nodeName, const char* shapeName); + class domInstance_rigid_body* addRigidBodyInstance (btRigidBody* body, const char* nodeName); + + void updateRigidBodyPosition (btRigidBody* body, class domNode* node); + void updateRigidBodyVelocity (btRigidBody* body); + void updateConstraint (btTypedConstraint* constraint, class domRigid_constraint* rigidConstraint); + + void syncOrAddGeometry (btCollisionShape* shape, const char* nodeName); + void syncOrAddRigidBody (btRigidBody* body); + void syncOrAddConstraint (btTypedConstraint* constraint); +public: + ColladaConverter(btDynamicsWorld* dynaWorld); + virtual ~ColladaConverter (); + + ///load a COLLADA .dae file + bool load(const char* filename); + + // resets the collada converter state + void reset (); + + ///save a snapshot in COLLADA physics .dae format. + ///if the filename is left empty, modify the filename used during loading + bool save(const char* filename = 0); + + void setUse32bitIndices(bool use32bitIndices) + { + m_use32bitIndices = use32bitIndices; + } + bool setUse32bitIndices() const + { + return m_use32bitIndices; + } + + void setUse4componentVertices(bool use4componentVertices) + { + m_use4componentVertices = use4componentVertices; + } + bool getUse4componentVertices() const + { + return m_use4componentVertices; + } + + void registerRigidBody(btRigidBody* body, const char* name); + void deRegisterRigidBody(btRigidBody* body); + const char* getName (btRigidBody* body); + + void registerConstraint(btTypedConstraint* constraint, const char* name); + void deRegisterConstraint(btTypedConstraint* constraint); + const char* getName (btTypedConstraint* constraint); + + ///those virtuals are called by load and save. + virtual btTypedConstraint* createUniversalD6Constraint( + class btRigidBody* body0,class btRigidBody* otherBody, + btTransform& localAttachmentFrameRef, + btTransform& localAttachmentOther, + const btVector3& linearMinLimits, + const btVector3& linearMaxLimits, + const btVector3& angularMinLimits, + const btVector3& angularMaxLimits, + bool disableCollisionsBetweenLinkedBodies + ); + virtual btRigidBody* createRigidBody(bool isDynamic, + float mass, + const btTransform& startTransform, + btCollisionShape* shape); + virtual int getNumRigidBodies (); + virtual btRigidBody* getRigidBody (int i); + virtual int getNumConstraints (); + virtual btTypedConstraint* getConstraint (int i); + virtual void setGravity(const btVector3& gravity); + virtual btVector3 getGravity (); + virtual void setCameraInfo(const btVector3& up, int forwardAxis); + + virtual btCollisionShape* createPlaneShape(const btVector3& planeNormal,btScalar planeConstant); + virtual btCollisionShape* createBoxShape(const btVector3& halfExtents); + virtual btCollisionShape* createSphereShape(btScalar radius); + virtual btCollisionShape* createCylinderShapeY(btScalar radius,btScalar height); + virtual class btTriangleMesh* createTriangleMeshContainer(); + virtual btCollisionShape* createBvhTriangleMeshShape(btTriangleMesh* trimesh); + virtual btCollisionShape* createConvexTriangleMeshShape(btTriangleMesh* trimesh); + virtual btCollisionShape* createGimpactShape(btTriangleMesh* trimesh); + virtual class btConvexHullShape* createConvexHullShape(); + virtual class btCompoundShape* createCompoundShape(); + + int getNumCollisionShapes() const; + btCollisionShape* getCollisionShape(int shapeIndex); + void deleteAllocatedCollisionShapes(); + void deleteShape(btCollisionShape* shape); + + + char* getLastFileName(); + + char* fixFileName(const char* lpCmdLine); + +}; + +#endif //COLLADA_CONVERTER_H + + diff --git a/BulletPhysics/bulletTrunk/Extras/BulletColladaConverter/Jamfile b/BulletPhysics/bulletTrunk/Extras/BulletColladaConverter/Jamfile new file mode 100644 index 00000000..021efd18 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/BulletColladaConverter/Jamfile @@ -0,0 +1,20 @@ +SubDir TOP Extras BulletColladaConverter ; + +#IncludeDir Extras/BulletColladaConverter ; + +Library BulletColladaConverter : [ Wildcard . : *.h *.cpp ] : noinstall ; +CFlags BulletColladaConverter : [ FIncludes $(TOP)/Extras/BulletColladaConverter ] [ FIncludes $(TOP)/Extras/COLLADA_DOM/include ] [ FIncludes $(TOP)/Extras/COLLADA_DOM/include/1.4 ] [ FIncludes $(TOP)/Extras/LibXML ] [ FIncludes $(TOP)/Extras/LibXML/include ] [ FIncludes $(TOP)/Extras/ConvexHull ] ; + +LibDepends BulletColladaConverter : colladadom libxml ; + + MsvcIncDirs BulletColladaConverter : + "../../Extras/BulletColladaConverter" + "../../Extras/COLLADA_DOM/include" + "../../Extras/COLLADA_DOM/include/1.4" + "../../Extras/LibXML" + "../../Extras/LibXML/include" + "../../Extras/ConvexHull" + +; + +InstallHeader [ Wildcard *.h ] : BulletColladaConverter ; diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/ChangeLog.txt b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/ChangeLog.txt new file mode 100644 index 00000000..3277df75 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/ChangeLog.txt @@ -0,0 +1,23 @@ +--- AntTweakBar library changes --- + +- Version 1.04 + OpenGL: Vertex buffer object state and Vertex/fragment program and object states are now reset and restored by TwDraw (thanks to Dylan and Siva for pointing this out). + +- Version 1.03 (2006/10/28) + Medium font is now antialiased. + Now also compiles on 64 bits x86 platform; use Makefile.x86_64 (thanks to Herling). + Slight changes to avoid visual 8 secure crt warnings. + Correct behaviour if min/max values are not defined. + Modif to avoid looping to max value when reaching zero with unsigned types. + Min/max/step commands for type TW_TYPE_CHAR now read ascii codes (not characters). + Add FPU precision control (because DirectX changes it). + Fix problem that occurs when the lib is initialized/unitialized more than once (thanks Lukasz for reporting it). + Distribution follows Savannah's recommendations. + +- Version 1.02 (2006/09/27) + Library sources released. + +- Version 1.01 (2006/09/14) + First official release. + + \ No newline at end of file diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/Clean.bat b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/Clean.bat new file mode 100644 index 00000000..34d2a4f5 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/Clean.bat @@ -0,0 +1,19 @@ +RMDIR /S /Q src\debug +RMDIR /S /Q src\release +CD src +DEL *.ncb *.aps *.o *.bak +DEL /A:h *.suo +CD .. +RMDIR /S /Q lib\debug +RMDIR /S /Q examples\debug +CD examples +DEL *.ncb *.aps *.o *.bak +DEL /A:h *.suo +DEL /S BuildLog.htm +DEL bin\*.obj +DEL bin\*.idb +CD .. + +PAUSE + + diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/License.txt b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/License.txt new file mode 100644 index 00000000..0e3f2937 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/License.txt @@ -0,0 +1,23 @@ +--- AntTweakBar license --- + +Copyright © 2005, 2006 Philippe Decaudin + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from +the use of this software. + +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim +that you wrote the original software. If you use this software in a product, +an acknowledgment in the product documentation would be appreciated. + +2. Altered source versions must be plainly marked as such, and must not be +misrepresented as being the original software. + +3. This notice may not be removed or altered from any source distribution. + + +http://www.antisphere.com diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/Readme.txt b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/Readme.txt new file mode 100644 index 00000000..87c46cb9 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/Readme.txt @@ -0,0 +1,15 @@ +--- AntTweakBar development library --- + + +AntTweakBar is a small and easy-to-use C/C++ library that allows programmers +to quickly add a light and intuitive GUI into OpenGL and DirectX based +graphic programs to interactively tweak them. + +This package includes the development version of the AntTweakBar library +for GNU/Linux and Windows, + some program examples (sources + binaries). + +For installation and documentation please refer to: +http://www.antisphere.com/Wiki/tools:anttweakbar + + +Philippe Decaudin - http://www.antisphere.com - 2006/05/20 diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/examples/Examples.ncb b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/examples/Examples.ncb new file mode 100644 index 0000000000000000000000000000000000000000..57e218451ad7a728ba261536e0daf508abe46932 GIT binary patch literal 150528 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 a;m7o!(ZI_8%&?C~eXN1U8u(wJf&T)-|8L>| literal 0 HcmV?d00001 diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/examples/Examples.sln b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/examples/Examples.sln new file mode 100644 index 00000000..728596ec --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/examples/Examples.sln @@ -0,0 +1,65 @@ +Microsoft Visual Studio Solution File, Format Version 8.00 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TwCopyDLL", "TwCopyDLL.vcproj", "{AB180E0E-0EFA-4AD4-8F08-4492D144D963}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TwSimpleGLFW", "TwSimpleGLFW.vcproj", "{29C096AF-172E-4A36-A1FE-E15B259D6834}" + ProjectSection(ProjectDependencies) = postProject + {AB180E0E-0EFA-4AD4-8F08-4492D144D963} = {AB180E0E-0EFA-4AD4-8F08-4492D144D963} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TwSimpleGLUT", "TwSimpleGLUT.vcproj", "{CC6C3AFD-5DD9-498F-9184-C53E663C2ABF}" + ProjectSection(ProjectDependencies) = postProject + {AB180E0E-0EFA-4AD4-8F08-4492D144D963} = {AB180E0E-0EFA-4AD4-8F08-4492D144D963} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TwSimpleSDL", "TwSimpleSDL.vcproj", "{3B516919-D0DA-43CE-820E-8306368F605B}" + ProjectSection(ProjectDependencies) = postProject + {AB180E0E-0EFA-4AD4-8F08-4492D144D963} = {AB180E0E-0EFA-4AD4-8F08-4492D144D963} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TwSimpleDX9", "TwSimpleDX9.vcproj", "{6B414E54-701C-4ED3-9034-F5CD7BFC3451}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TwAdvanced1", "TwAdvanced1.vcproj", "{008D1CEC-1586-4C89-B524-DF15D9605163}" + ProjectSection(ProjectDependencies) = postProject + {AB180E0E-0EFA-4AD4-8F08-4492D144D963} = {AB180E0E-0EFA-4AD4-8F08-4492D144D963} + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfiguration) = preSolution + Debug = Debug + Release = Release + EndGlobalSection + GlobalSection(ProjectConfiguration) = postSolution + {AB180E0E-0EFA-4AD4-8F08-4492D144D963}.Debug.ActiveCfg = Debug|Win32 + {AB180E0E-0EFA-4AD4-8F08-4492D144D963}.Debug.Build.0 = Debug|Win32 + {AB180E0E-0EFA-4AD4-8F08-4492D144D963}.Release.ActiveCfg = Release|Win32 + {AB180E0E-0EFA-4AD4-8F08-4492D144D963}.Release.Build.0 = Release|Win32 + {29C096AF-172E-4A36-A1FE-E15B259D6834}.Debug.ActiveCfg = Debug|Win32 + {29C096AF-172E-4A36-A1FE-E15B259D6834}.Debug.Build.0 = Debug|Win32 + {29C096AF-172E-4A36-A1FE-E15B259D6834}.Release.ActiveCfg = Release|Win32 + {29C096AF-172E-4A36-A1FE-E15B259D6834}.Release.Build.0 = Release|Win32 + {CC6C3AFD-5DD9-498F-9184-C53E663C2ABF}.Debug.ActiveCfg = Debug|Win32 + {CC6C3AFD-5DD9-498F-9184-C53E663C2ABF}.Debug.Build.0 = Debug|Win32 + {CC6C3AFD-5DD9-498F-9184-C53E663C2ABF}.Release.ActiveCfg = Release|Win32 + {CC6C3AFD-5DD9-498F-9184-C53E663C2ABF}.Release.Build.0 = Release|Win32 + {3B516919-D0DA-43CE-820E-8306368F605B}.Debug.ActiveCfg = Debug|Win32 + {3B516919-D0DA-43CE-820E-8306368F605B}.Debug.Build.0 = Debug|Win32 + {3B516919-D0DA-43CE-820E-8306368F605B}.Release.ActiveCfg = Release|Win32 + {3B516919-D0DA-43CE-820E-8306368F605B}.Release.Build.0 = Release|Win32 + {6B414E54-701C-4ED3-9034-F5CD7BFC3451}.Debug.ActiveCfg = Debug|Win32 + {6B414E54-701C-4ED3-9034-F5CD7BFC3451}.Debug.Build.0 = Debug|Win32 + {6B414E54-701C-4ED3-9034-F5CD7BFC3451}.Release.ActiveCfg = Release|Win32 + {6B414E54-701C-4ED3-9034-F5CD7BFC3451}.Release.Build.0 = Release|Win32 + {008D1CEC-1586-4C89-B524-DF15D9605163}.Debug.ActiveCfg = Debug|Win32 + {008D1CEC-1586-4C89-B524-DF15D9605163}.Debug.Build.0 = Debug|Win32 + {008D1CEC-1586-4C89-B524-DF15D9605163}.Release.ActiveCfg = Release|Win32 + {008D1CEC-1586-4C89-B524-DF15D9605163}.Release.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + EndGlobalSection + GlobalSection(ExtensibilityAddIns) = postSolution + EndGlobalSection +EndGlobal diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/examples/Examples.suo b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/examples/Examples.suo new file mode 100644 index 0000000000000000000000000000000000000000..0a6131804ea3796859a442915f1841d30f552bf2 GIT binary patch literal 15360 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 /dev/null +EXP_PATH = "export LD_LIBRARY_PATH=\"../../lib:$(LD_LIBRARY_PATH)\"" + + +####### Files + + +SRC_FILES = TwSimpleGLFW.c TwSimpleGLUT.c TwSimpleSDL.c TwAdvanced1.cpp + + +####### Build rules + + +#first: depend all +first: all + +all: Makefile $(SRC_FILES) + + @echo "===== Build TwSimpleGLFW ====" + $(CXX) $(CXXFLAGS) $(INCPATH) TwSimpleGLFW.c $(LFLAGS) -lglfw $(LIBS) -o $(OUT_DIR)/TwSimpleGLFW.out + @echo "$(EXP_PATH) ; ./TwSimpleGLFW.out" > $(OUT_DIR)/TwSimpleGLFW + + @echo "===== Build TwSimpleGLUT ====" + $(CXX) $(CXXFLAGS) $(INCPATH) TwSimpleGLUT.c $(LFLAGS) -lglut $(LIBS) -o $(OUT_DIR)/TwSimpleGLUT.out + @echo "$(EXP_PATH) ; ./TwSimpleGLUT.out" > $(OUT_DIR)/TwSimpleGLUT + + @echo "===== Build TwSimpleSDL ====" + $(CXX) $(CXXFLAGS) $(INCPATH) TwSimpleSDL.c $(LFLAGS) -lSDL $(LIBS) -o $(OUT_DIR)/TwSimpleSDL.out + @echo "$(EXP_PATH) ; ./TwSimpleSDL.out" > $(OUT_DIR)/TwSimpleSDL + + @echo "===== Build TwAdvanced1 ====" + $(CXX) $(CXXFLAGS) $(INCPATH) TwAdvanced1.cpp $(LFLAGS) -lglfw $(LIBS) -o $(OUT_DIR)/TwAdvanced1.out + @echo "$(EXP_PATH) ; ./TwAdvanced1.out" > $(OUT_DIR)/TwAdvanced1 + +# append dependencies to this Makefile +#depend: +# @echo "===== Make dependencies =====" +# makedepend -Y +# makedepend -a -Y -- $(CXXFLAGS) $(INCPATH) -- $(SRC_FILES) $(NO_STDERR) + + +# clean temporary files +clean: + @echo "===== Clean =====" + -$(DEL_FILE) *.o + -$(DEL_FILE) *~ core *.core *.stackdump + -$(DEL_FILE) debug/* + -$(DEL_DIR) debug + + +####### DEPENDENCIES + +TwSimpleGLFW.o: ../include/AntTweakBar.h +TwSimpleGLUT.o: ../include/AntTweakBar.h +TwSimpleSDL.o: ../include/AntTweakBar.h +TwAdvanced1.o: ../include/AntTweakBar.h diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/examples/Makefile.x86_64 b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/examples/Makefile.x86_64 new file mode 100644 index 00000000..067e1bbe --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/examples/Makefile.x86_64 @@ -0,0 +1,82 @@ +####### Compiler, tools and options + +#---- MinGW +#MINGWFLAGS = -mno-cygwin + + +#---- Release +CXXCFG = -O3 +LFLAGS = -L../lib +OUT_DIR = bin +#---- Debug +#CXXCFG = -g -D_DEBUG +#LFLAGS = -Wl -L./debug +#OUT_DIR = debug + + +CXX = gcc +#CXXFLAGS = $(CXXCFG) $(MINGWFLAGS) -pipe -Wall -ffast-math -fpic -fno-strength-reduce -mcpu=pentiumpro -march=i586 +#CXXFLAGS = $(CXXCFG) -Wall -mcpu=i386 -march=i386 +CXXFLAGS = $(CXXCFG) -Wall +INCPATH = -I../include -I/usr/local/include -I/usr/X11R6/include -I/usr/include +#LIBS = -L/usr/X11R6/lib -lAntTweakBar -lGL -lGLU -lX11 -lXxf86vm -lXext -lXmu -lpthread -lm +LIBS = -L/usr/lib64 -lAntTweakBar -lglfw -lGL -lGLU -lX11 -lXxf86vm -lXext -lXmu -lpthread -lm + +DEL_FILE = rm -f +DEL_DIR = rmdir +NO_STDERR = 2> /dev/null +EXP_PATH = "export LD_LIBRARY_PATH=\"../../lib:$(LD_LIBRARY_PATH)\"" + + +####### Files + + +SRC_FILES = TwSimpleGLFW.c TwSimpleGLUT.c TwSimpleSDL.c TwAdvanced1.cpp + + +####### Build rules + + +#first: depend all +first: all + +all: Makefile $(SRC_FILES) + + @echo "===== Build TwSimpleGLFW ====" + $(CXX) $(CXXFLAGS) $(INCPATH) TwSimpleGLFW.c $(LFLAGS) -lglfw $(LIBS) -o $(OUT_DIR)/TwSimpleGLFW.out + @echo "$(EXP_PATH) ; ./TwSimpleGLFW.out" > $(OUT_DIR)/TwSimpleGLFW + + @echo "===== Build TwSimpleGLUT ====" + $(CXX) $(CXXFLAGS) $(INCPATH) TwSimpleGLUT.c $(LFLAGS) -lglut $(LIBS) -o $(OUT_DIR)/TwSimpleGLUT.out + @echo "$(EXP_PATH) ; ./TwSimpleGLUT.out" > $(OUT_DIR)/TwSimpleGLUT + + @echo "===== Build TwSimpleSDL ====" + $(CXX) $(CXXFLAGS) $(INCPATH) TwSimpleSDL.c $(LFLAGS) -lSDL $(LIBS) -o $(OUT_DIR)/TwSimpleSDL.out + @echo "$(EXP_PATH) ; ./TwSimpleSDL.out" > $(OUT_DIR)/TwSimpleSDL + + @echo "===== Build TwAdvanced1 ====" + $(CXX) $(CXXFLAGS) $(INCPATH) TwAdvanced1.cpp $(LFLAGS) -lglfw $(LIBS) -o $(OUT_DIR)/TwAdvanced1.out + @echo "$(EXP_PATH) ; ./TwAdvanced1.out" > $(OUT_DIR)/TwAdvanced1 + +# append dependencies to this Makefile +#depend: +# @echo "===== Make dependencies =====" +# makedepend -Y +# makedepend -a -Y -- $(CXXFLAGS) $(INCPATH) -- $(SRC_FILES) $(NO_STDERR) + + +# clean temporary files +clean: + @echo "===== Clean =====" + -$(DEL_FILE) *.o + -$(DEL_FILE) *~ core *.core *.stackdump + -$(DEL_FILE) debug/* + -$(DEL_DIR) debug + + +####### DEPENDENCIES + +TwSimpleGLFW.o: ../include/AntTweakBar.h +TwSimpleGLUT.o: ../include/AntTweakBar.h +TwSimpleSDL.o: ../include/AntTweakBar.h +TwAdvanced1.o: ../include/AntTweakBar.h diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/examples/TwAdvanced1.cpp b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/examples/TwAdvanced1.cpp new file mode 100644 index 00000000..70e6ac58 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/examples/TwAdvanced1.cpp @@ -0,0 +1,693 @@ +// --------------------------------------------------------------------------- +// +// @file TwAdvanced1.cpp +// @brief An example showing many features of AntTweakBar. +// It also uses OpenGL and GLFW windowing system +// but could be easily adapted to other frameworks. +// +// AntTweakBar: http://www.antisphere.com/Wiki/tools:anttweakbar +// OpenGL: http://www.opengl.org +// GLFW: http://glfw.sourceforge.net +// +// +// This example draws a simple scene that can be re-tesselated +// interactively, and illuminated dynamically by an adjustable +// number of moving lights. +// +// +// @author Philippe Decaudin - http://www.antisphere.com +// @date 2006/05/20 +// +// note: TAB=4 +// +// Compilation: +// http://www.antisphere.com/Wiki/tools:anttweakbar:examples#twadvanced1 +// +// --------------------------------------------------------------------------- + +#include + +#define GLFW_DLL // use GLFW as a dynamically linked library +#include "glfw.h" + +#include +#include +#ifndef _WIN32 +# define _snprintf snprintf +#endif +const float FLOAT_2PI = 6.283185307f; // 2*PI + + +// Light structure: embed light parameters +struct Light +{ + bool Active; // light On or Off + float Pos[4]; // light position (in homogeneous coordinates, ie. Pos[4]=1) + float Color[4]; // light color (no alpha, ie. Color[4]=1) + float Radius; // radius of the light influence area + float Dist0, Angle0, Height0, Speed0; // light initial cylindrical coordinates and speed + char Name[4]; // light short name (will be named "1", "2", "3",...) + enum AnimMode { ANIM_FIXED, ANIM_BOUNCE, ANIM_ROTATE, ANIM_COMBINED }; + AnimMode Animation; // light animation mode +}; + + +// Class that describes the scene and its methods +class Scene +{ +public: + bool Wireframe; // draw scene in wireframe or filled + int Subdiv; // number of subdivisions used to tesselate the scene + int NumLights; // number of dynamic lights + float BgColor0[3], BgColor1[3]; // top and bottom background colors + float Ambient; // scene ambient factor + float Reflection; // ground plane reflection factor (0=no reflection, 1=full reflection) + float RotYAngle; // rotation angle of the scene around its Y axis (in degree) + enum RotMode { ROT_OFF, ROT_CW, ROT_CCW }; + RotMode Rotation; // scene rotation mode (off, clockwise, counter-clockwise) + + Scene(); // constructor + ~Scene(); // destructor + void Init(bool changeLightPos); // (re)intialize the scene + void Draw(); // draw scene + void Update(float time); // move lights + +private: + void CreateBar(); // create a tweak bar for lights + // Some drawing subroutines + void DrawSubdivPlaneY(float xMin, float xMax, float y, float zMin, float zMax, int xSubdiv, int zSubdiv); + void DrawSubdivCylinderY(float xCenter, float yBottom, float zCenter, float height, float radiusBottom, float radiusTop, int sideSubdiv, int ySubdiv); + void DrawSubdivHaloZ(float x, float y, float z, float radius, int subdiv); + void DrawHalos(bool reflected); + + GLuint objList, groundList, haloList; // OpenGL display list IDs + int maxLights; // maximum number of dynamic lights allowed by the graphic card + Light * lights; // array of lights + TwBar * lightsBar; // pointer to the tweak bar for lights created by CreateBar() +}; + + +// Constructor +Scene::Scene() +{ + // Set scene members. + // The scene will be created by Scene::Init( ) + Wireframe = false; + Subdiv = 20; + NumLights = 0; + BgColor0[0] = 0.9f; + BgColor0[1] = 0.0f; + BgColor0[2] = 0.0f; + BgColor1[0] = 0.6f; + BgColor1[1] = 0.6f; + BgColor1[2] = 0.6f; + Ambient = 0.3f; + Reflection = 0.5f; + RotYAngle = 0; + Rotation = ROT_CCW; + objList = 0; + groundList = 0; + haloList = 0; + maxLights = 0; + lights = NULL; + lightsBar = NULL; +} + + +// Destructor +Scene::~Scene() +{ + // delete all lights + if( lights ) + delete[] lights; +} + + +// Create the scene, and (re)initialize lights if changeLights is true +void Scene::Init(bool changeLights) +{ + // Get the max number of lights allowed by the graphic card + glGetIntegerv(GL_MAX_LIGHTS, &maxLights); + if( maxLights>16 ) + maxLights = 16; + + // Create the lights array + if( lights==NULL && maxLights>0 ) + { + lights = new Light[maxLights]; + NumLights = maxLights/2; // default number of lights + if( NumLights==0 ) + NumLights = 1; + changeLights = true; // force lights initialization + + // Create a tweak bar for lights + CreateBar(); + } + + // (Re)initialize lights if needed (uses random values) + if( changeLights ) + for(int i=0; ilights[i].Color[1]) ? 1.0f-lights[i].Color[1] : 1.0f-lights[i].Color[0]; + lights[i].Color[3] = 1; + lights[i].Active = true; + } + + // Initialize some OpenGL states + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + glEnable(GL_DEPTH_TEST); + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + glEnable(GL_LIGHTING); + glEnable(GL_CULL_FACE); + glEnable(GL_NORMALIZE); + glEnable(GL_COLOR_MATERIAL); + glColorMaterial(GL_FRONT_AND_BACK, GL_DIFFUSE); + glLightModeli(GL_LIGHT_MODEL_TWO_SIDE, GL_FALSE); + + // Create objects display list using the current Subdiv parameter to control the tesselation + if( objList>0 ) + glDeleteLists(objList, 1); // delete previously created display list + objList = glGenLists(1); + glNewList(objList, GL_COMPILE); + DrawSubdivCylinderY(-0.9f, 0, -0.9f, 1.4f, 0.15f, 0.12f, Subdiv/2+8, Subdiv); + DrawSubdivCylinderY(+0.9f, 0, -0.9f, 1.4f, 0.15f, 0.12f, Subdiv/2+8, Subdiv); + DrawSubdivCylinderY(+0.9f, 0, +0.9f, 1.4f, 0.15f, 0.12f, Subdiv/2+8, Subdiv); + DrawSubdivCylinderY(-0.9f, 0, +0.9f, 1.4f, 0.15f, 0.12f, Subdiv/2+8, Subdiv); + DrawSubdivCylinderY(0, 0, 0, 0.4f, 0.5f, 0.3f, Subdiv+16, Subdiv/8+1); + DrawSubdivCylinderY(0, 0.4f, 0, 0.05f, 0.3f, 0.0f, Subdiv+16, Subdiv/16+1); + glEndList(); + + // Create ground display list + if( groundList>0 ) + glDeleteLists(groundList, 1); // delete previously created display list + groundList = glGenLists(1); + glNewList(groundList, GL_COMPILE); + DrawSubdivPlaneY(-1.2f, 1.2f, 0, -1.2f, 1.2f, (3*Subdiv)/2, (3*Subdiv)/2); + glEndList(); + + // Create display list to draw light halos + if( haloList>0 ) + glDeleteLists(haloList, 1); // delete previously created display list + haloList = glGenLists(1); + glNewList(haloList, GL_COMPILE); + DrawSubdivHaloZ(0, 0, 0, 1, 32); + glEndList(); +} + + +// Callback function associated to the 'Change lights' button of the lights tweak bar. +void TW_CALL ReinitCB(void *clientData) +{ + Scene *scene = static_cast(clientData); // scene pointer is stored in clientData + scene->Init(true); // re-initialize the scene +} + + +// Create a tweak bar for lights. +// New enum type and struct type are defined and used by this bar. +void Scene::CreateBar() +{ + // Create a new tweak bar and change its label + lightsBar = TwNewBar("Lights"); + TwDefine(" Lights label='Lights TweakBar' "); + + // Add a variable of type int to control the number of lights + TwAddVarRW(lightsBar, "NumLights", TW_TYPE_INT32, &NumLights, " label='Number of lights' keyIncr=l keyDecr=L "); + // Set the NumLights min value (=0) and max value (depends on the user graphic card) + char def[256]; + _snprintf(def, 255, "Lights/NumLights min=0 max=%d", maxLights); + TwDefine(def); // min and max are defined using a defintion string + + // Add a button to re-initialize the lights; this button calls the ReinitCB callback function + TwAddButton(lightsBar, "Reinit", ReinitCB, this, " label='Change lights' key=RETURN "); + + // Define a new enum type for the tweak bar + TwEnumVal modeEV[] = // array used to describe the Scene::AnimMode enum values + { + { Light::ANIM_FIXED, "Fixed" }, + { Light::ANIM_BOUNCE, "Bounce" }, + { Light::ANIM_ROTATE, "Rotate" }, + { Light::ANIM_COMBINED, "Combined" } + }; + TwType modeType = TwDefineEnum("Mode", modeEV, 4); // create a new TwType associated to the enum defined by the modeEV array + + // Define a new struct type: light variables are embeded in this structure + TwStructMember lightMembers[] = // array used to describe tweakable variables of the Light structure + { + { "Active", TW_TYPE_BOOLCPP, offsetof(Light, Active), "" }, // Light::Active is a C++ boolean value + { "Color", TW_TYPE_COLOR4F, offsetof(Light, Color), "noalpha" }, // Light::Color is represented by 4 floats, but alpha channel should be ignored + { "Radius", TW_TYPE_FLOAT, offsetof(Light, Radius), "min=0 max=4 step=0.02" }, + { "Animation", modeType, offsetof(Light, Animation), "" }, // use the enum 'modeType' created before to tweak the Light::Animation variable + { "Speed", TW_TYPE_FLOAT, offsetof(Light, Speed0), "readonly" } // Light::Speed is made read-only + }; + TwType lightType = TwDefineStruct("Light", lightMembers, 5, sizeof(Light), NULL, NULL); // create a new TwType associated to the struct defined by the lightMembers array + + // Use the newly created 'lightType' to add variables associated with lights + for(int i=0; i

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

c4`kj?D)9v?U=fq{k6>h!ZphtFD2sFZLR+L1m7P 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 literal 0 HcmV?d00001 diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/lib/AntTweakBar.lib b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/lib/AntTweakBar.lib new file mode 100644 index 0000000000000000000000000000000000000000..02d0f588d99134f70094889d3327a381cded2f5f GIT binary patch literal 8904 zcmcIo&2JM&6o2_55YiCHC;7BPplJ_)O>6>cD<>p@2q&O;A*fPimUwAQ9Xnb(EalQe zF9`L>KTrvAs5o-qggA4oP=$KrP;utSg}&LD*?lu!uQ4VYy{zXqZ|65}=Dm3{6aCJ# zH@AN1Iu%i$SS*>0CuS3KNfkdWim|hE;^)mS09XO&u>pFY0vvt^F!Y$q@GtEe>Y01PFm%-}*uDrrGN@Rx1*b~%88GpcK>IMLl zq4Qj#I2KICKQPH=S5~iHSvRtaOPLGnD_4yx>)H8Y#c(Y1mj%;?Y()4rHq-bl@1L;3BUY*2;Jy=?s&s7i35xmwySTMN6D zN~sw5ML@myGP7fC=FP&z^fg24kW%CK=vK+Ja{=nuDNE7uZQOTUsM5d0ObmDVq&X}8=N%5Y3*Y~+h);;C5D@4Kty!-j*F zU$w1r*~-yLRZ+unJHD}HSp~|dqC$(CM;jwnGg#(+MZt~FmMTsQ49RjR6xx~NEP;CccyocUZ% z7!*J4cS=QFE&SrbLMl$;3YC0N>a1T$X$_%{06m?JARP{(XIm9q2iDAOi<+mRu9i{S zLB$m5HY)j`;bgobnHdFSqg}8nY&@~4GHt7>Lh3S3(jM0npy8}pj;7!vZm-j3xw2&2 zCB5ScZaA0BVyw*UV@S=%`G(&Wx!&ig{QXCR7a(Z z7(IVg<(8_XBmgg$(KSV`>16$vkhh|13!E0o>bg+9&HA*xn76l59a8SNl+2)l!TCW= z2)?7rZ#8#SVdAuYMd+%ot;N2BY*WV86dKZ!xym4BO^oej|$9aJxTlN#MM5^{m zYJ~_T2`T|4K_#pts03H&d4-&1PUZ@QQ}s@oiI_Zd-t0=Zw84ize_!fv!EA?_3ZIsf zIqTN$&(j%R#O#Pa{*VRnPC@U&$$ZYNnA34tg~<{AM)^+wZTL>X>6bzePlEixBn|Dz zC-oSbg2>BOd=Fw4WX~bZs2S+%?L?fl$(~NknjPIoR`Z*7sa(2UiOj5j6G^YEUFOx= z|86X^FIfx7?fzoD=x~2&RFK*%ZSP>GJGy^@j~^u``-(lRm#rXePXW07-jaxGCF5$7 z$Sl)A06d+9k1!mM%-+LV2l(DAGp--8v^OVR&GNdQ6Hg?>Z3Xk3R@Zaz!oeLAdI}q0;b`yO~l2}M%djMi`jGwTh$`S)Q*4p zZdaQ-(8_h=AQ21Z!(#-lDU#1S&}z*?AXlmYh3>mv9qrdswQ_h2uQ{C4#&l%#S z-ISAWnVaUD^={JDsK>)So~F6i@S6#pN-Nj*nUERm;Y|8IU!(X8ubB<@(5aINX z5IUt+u5YDGP@10}M@ANh^0=%VPBfCn?M&8KyT3)wUScQNy^DKuomwl`wKplZ!J54@ z$lOBgRhaQarSa(Hrg&R*UUF7zmN!wuUcC6i+a@<&TrcLQz^2)1MCUZJwGk`nwMx^R zA#3{)Vxf0()d?HV%;$om^lP-Tk23}xiks)H5j7Fy?H9cCysZ;z<+?tb2w9B=JU)7o z*BBa(lCVA2pvUOl5$JS{&t!;&L!3{$e$Xkka@{cv%U{EsQCw_jEjK=vA>MM7GbvXl zP4k7s;Rxp=iz;5m=!A{WUI^nTVf5~Knr93d(=oy*uaI;?tz6$*LiWhxoX@+Q(%ROC zw=S1=%-1p_+p$h?F8$g|r)+!%Lw1jol#}16?I~Y`^U=$?J>`pXK6($>JYR@^PH{fv Iicu&0A6oz=;Q#;t literal 0 HcmV?d00001 diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/lib/Readme.txt b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/lib/Readme.txt new file mode 100644 index 00000000..ae00121f --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/lib/Readme.txt @@ -0,0 +1,6 @@ +These files are part of the AntTweakBar library. +http://www.antisphere.com/Wiki/tools:anttweakbar + +Copyright © 2005, 2006 Philippe Decaudin. +AntTweakBar is a free software released under the zlib license. +For conditions of distribution and use, see ../License.txt diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/lib/libAntTweakBar.so.ldd b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/lib/libAntTweakBar.so.ldd new file mode 100644 index 00000000..2ec35315 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/lib/libAntTweakBar.so.ldd @@ -0,0 +1,4 @@ + linux-gate.so.1 => (0x00d1e000) + libgcc_s.so.1 => /lib/libgcc_s.so.1 (0x00dcf000) + libc.so.6 => /lib/tls/libc.so.6 (0x00113000) + /lib/ld-linux.so.2 => /lib/ld-linux.so.2 (0x00773000) diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/AntPerfTimer.h b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/AntPerfTimer.h new file mode 100644 index 00000000..6d462cc4 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/AntPerfTimer.h @@ -0,0 +1,58 @@ +// --------------------------------------------------------------------------- +// +// @file AntPerfTimer.h +// @brief A performance (precision) timer for benchs +// @author Philippe Decaudin - http://www.antisphere.com +// @license This file is part of the AntTweakBar library. +// Copyright © 2005, 2006 Philippe Decaudin. +// For conditions of distribution and use, see License.txt +// +// notes: TAB=4 +// No cpp file is needed, everything is defined in this header +// +// --------------------------------------------------------------------------- + +#if !defined ANT_PERF_TIMER_INCLUDED +#define ANT_PERF_TIMER_INCLUDED + +#ifndef __cplusplus +# error This is a C++ header +#endif // __cplusplus + + +#if defined(WIN32) || defined(WIN64) || defined(_WIN32) || defined(_WIN64) + + #include + #include + + struct PerfTimer + { + __forceinline PerfTimer() { if( !QueryPerformanceFrequency(&Freq) ) MessageBox(NULL, _T("Precision timer not supported"), _T("Problem"), MB_ICONEXCLAMATION); Reset(); } + __forceinline void Reset() { QueryPerformanceCounter(&Start); } + __forceinline double GetTime() { if( QueryPerformanceCounter(&End) ) return ((double)End.QuadPart - (double)Start.QuadPart)/((double)Freq.QuadPart); else return 0; } + protected: + LARGE_INTEGER Start, End, Freq; + }; + +#else // !_WIN (-> LINUX) + + #include + #include + + struct PerfTimer + { + inline PerfTimer() { Reset(); } + inline void Reset() { gettimeofday(&Start, &TZ); } + inline double GetTime() { gettimeofday(&End,&TZ); + double t1 = (double)Start.tv_sec + (double)Start.tv_usec/(1000*1000); + double t2 = (double)End.tv_sec + (double)End.tv_usec/(1000*1000); + return t2-t1; } + protected: + struct timeval Start, End; + struct timezone TZ; + }; + +#endif // _WIN + + +#endif // ANT_PERF_TIMER_INCLUDED diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/AntTweakBar.rc b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/AntTweakBar.rc new file mode 100644 index 00000000..8ff7072f --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/AntTweakBar.rc @@ -0,0 +1,83 @@ +// 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 + +///////////////////////////////////////////////////////////////////////////// +// Français (France) resources + +#if !defined(AFX_RESOURCE_DLL) || defined(AFX_TARG_FRA) +#ifdef _WIN32 +//LANGUAGE LANG_FRENCH, SUBLANG_FRENCH +#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 + + +///////////////////////////////////////////////////////////////////////////// +// +// Cursor +// + +IDC_CURSOR1 CURSOR "res\\cur00013.cur" +IDC_CURSOR2 CURSOR "res\\cur00000.cur" +IDC_CURSOR3 CURSOR "res\\cur00001.cur" +IDC_CURSOR4 CURSOR "res\\cur00002.cur" +IDC_CURSOR5 CURSOR "res\\cur00003.cur" +IDC_CURSOR6 CURSOR "res\\cur00004.cur" +IDC_CURSOR7 CURSOR "res\\cur00005.cur" +IDC_CURSOR8 CURSOR "res\\cur00006.cur" +IDC_CURSOR9 CURSOR "res\\cur00007.cur" +IDC_CURSOR10 CURSOR "res\\cur00008.cur" +IDC_CURSOR11 CURSOR "res\\cur00009.cur" +IDC_CURSOR12 CURSOR "res\\cur00010.cur" +IDC_CURSOR13 CURSOR "res\\cur00011.cur" +IDC_CURSOR14 CURSOR "res\\cur00012.cur" +#endif // Français (France) resources +///////////////////////////////////////////////////////////////////////////// + + + +#ifndef APSTUDIO_INVOKED +///////////////////////////////////////////////////////////////////////////// +// +// Generated from the TEXTINCLUDE 3 resource. +// + + +///////////////////////////////////////////////////////////////////////////// +#endif // not APSTUDIO_INVOKED + diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/AntTweakBar.sln b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/AntTweakBar.sln new file mode 100644 index 00000000..6b93b89a --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/AntTweakBar.sln @@ -0,0 +1,29 @@ +Microsoft Visual Studio Solution File, Format Version 8.00 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "AntTweakBar", "AntTweakBar.vcproj", "{B99E1FA1-C30A-45F2-9D57-9E9C21B2DF42}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "TwAdvanced1", "..\examples\TwAdvanced1.vcproj", "{008D1CEC-1586-4C89-B524-DF15D9605163}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfiguration) = preSolution + Debug = Debug + Release = Release + EndGlobalSection + GlobalSection(ProjectConfiguration) = postSolution + {B99E1FA1-C30A-45F2-9D57-9E9C21B2DF42}.Debug.ActiveCfg = Debug|Win32 + {B99E1FA1-C30A-45F2-9D57-9E9C21B2DF42}.Debug.Build.0 = Debug|Win32 + {B99E1FA1-C30A-45F2-9D57-9E9C21B2DF42}.Release.ActiveCfg = Release|Win32 + {B99E1FA1-C30A-45F2-9D57-9E9C21B2DF42}.Release.Build.0 = Release|Win32 + {008D1CEC-1586-4C89-B524-DF15D9605163}.Debug.ActiveCfg = Debug|Win32 + {008D1CEC-1586-4C89-B524-DF15D9605163}.Debug.Build.0 = Debug|Win32 + {008D1CEC-1586-4C89-B524-DF15D9605163}.Release.ActiveCfg = Release|Win32 + {008D1CEC-1586-4C89-B524-DF15D9605163}.Release.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + EndGlobalSection + GlobalSection(ExtensibilityAddIns) = postSolution + EndGlobalSection +EndGlobal diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/AntTweakBar.vcproj b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/AntTweakBar.vcproj new file mode 100644 index 00000000..e713ebf3 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/AntTweakBar.vcproj @@ -0,0 +1,380 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/LoadOGL.cpp b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/LoadOGL.cpp new file mode 100644 index 00000000..3529da2d --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/LoadOGL.cpp @@ -0,0 +1,498 @@ +// --------------------------------------------------------------------------- +// +// @file LoadOGL.cpp +// @author Philippe Decaudin - http://www.antisphere.com +// @license This file is part of the AntTweakBar library. +// Copyright © 2005, 2006 Philippe Decaudin. +// For conditions of distribution and use, see License.txt +// +// note: TAB=4 +// +// --------------------------------------------------------------------------- + + +#include "TwPrecomp.h" + +#include "LoadOGL.h" + + +// --------------------------------------------------------------------------- + +#define ANT_NB_OGL_FUNC_MAX 512 + +struct COGLFuncRec +{ + const char * m_Name; + GL::PFNOpenGL * m_FuncPtr; + COGLFuncRec() : m_Name(NULL), m_FuncPtr(NULL) {} +}; +COGLFuncRec g_OGLFuncRec[ANT_NB_OGL_FUNC_MAX]; +int g_NbOGLFunc = 0; +#if defined(ANT_WINDOWS) +HMODULE g_OGLModule = NULL; +#endif + +// --------------------------------------------------------------------------- + +ANT_GL_IMPL(glAccum) +ANT_GL_IMPL(glAlphaFunc) +ANT_GL_IMPL(glAreTexturesResident) +ANT_GL_IMPL(glArrayElement) +ANT_GL_IMPL(glBegin) +ANT_GL_IMPL(glBindTexture) +ANT_GL_IMPL(glBitmap) +ANT_GL_IMPL(glBlendFunc) +ANT_GL_IMPL(glCallList) +ANT_GL_IMPL(glCallLists) +ANT_GL_IMPL(glClear) +ANT_GL_IMPL(glClearAccum) +ANT_GL_IMPL(glClearColor) +ANT_GL_IMPL(glClearDepth) +ANT_GL_IMPL(glClearIndex) +ANT_GL_IMPL(glClearStencil) +ANT_GL_IMPL(glClipPlane) +ANT_GL_IMPL(glColor3b) +ANT_GL_IMPL(glColor3bv) +ANT_GL_IMPL(glColor3d) +ANT_GL_IMPL(glColor3dv) +ANT_GL_IMPL(glColor3f) +ANT_GL_IMPL(glColor3fv) +ANT_GL_IMPL(glColor3i) +ANT_GL_IMPL(glColor3iv) +ANT_GL_IMPL(glColor3s) +ANT_GL_IMPL(glColor3sv) +ANT_GL_IMPL(glColor3ub) +ANT_GL_IMPL(glColor3ubv) +ANT_GL_IMPL(glColor3ui) +ANT_GL_IMPL(glColor3uiv) +ANT_GL_IMPL(glColor3us) +ANT_GL_IMPL(glColor3usv) +ANT_GL_IMPL(glColor4b) +ANT_GL_IMPL(glColor4bv) +ANT_GL_IMPL(glColor4d) +ANT_GL_IMPL(glColor4dv) +ANT_GL_IMPL(glColor4f) +ANT_GL_IMPL(glColor4fv) +ANT_GL_IMPL(glColor4i) +ANT_GL_IMPL(glColor4iv) +ANT_GL_IMPL(glColor4s) +ANT_GL_IMPL(glColor4sv) +ANT_GL_IMPL(glColor4ub) +ANT_GL_IMPL(glColor4ubv) +ANT_GL_IMPL(glColor4ui) +ANT_GL_IMPL(glColor4uiv) +ANT_GL_IMPL(glColor4us) +ANT_GL_IMPL(glColor4usv) +ANT_GL_IMPL(glColorMask) +ANT_GL_IMPL(glColorMaterial) +ANT_GL_IMPL(glColorPointer) +ANT_GL_IMPL(glCopyPixels) +ANT_GL_IMPL(glCopyTexImage1D) +ANT_GL_IMPL(glCopyTexImage2D) +ANT_GL_IMPL(glCopyTexSubImage1D) +ANT_GL_IMPL(glCopyTexSubImage2D) +ANT_GL_IMPL(glCullFace) +ANT_GL_IMPL(glDeleteLists) +ANT_GL_IMPL(glDeleteTextures) +ANT_GL_IMPL(glDepthFunc) +ANT_GL_IMPL(glDepthMask) +ANT_GL_IMPL(glDepthRange) +ANT_GL_IMPL(glDisable) +ANT_GL_IMPL(glDisableClientState) +ANT_GL_IMPL(glDrawArrays) +ANT_GL_IMPL(glDrawBuffer) +ANT_GL_IMPL(glDrawElements) +ANT_GL_IMPL(glDrawPixels) +ANT_GL_IMPL(glEdgeFlag) +ANT_GL_IMPL(glEdgeFlagPointer) +ANT_GL_IMPL(glEdgeFlagv) +ANT_GL_IMPL(glEnable) +ANT_GL_IMPL(glEnableClientState) +ANT_GL_IMPL(glEnd) +ANT_GL_IMPL(glEndList) +ANT_GL_IMPL(glEvalCoord1d) +ANT_GL_IMPL(glEvalCoord1dv) +ANT_GL_IMPL(glEvalCoord1f) +ANT_GL_IMPL(glEvalCoord1fv) +ANT_GL_IMPL(glEvalCoord2d) +ANT_GL_IMPL(glEvalCoord2dv) +ANT_GL_IMPL(glEvalCoord2f) +ANT_GL_IMPL(glEvalCoord2fv) +ANT_GL_IMPL(glEvalMesh1) +ANT_GL_IMPL(glEvalMesh2) +ANT_GL_IMPL(glEvalPoint1) +ANT_GL_IMPL(glEvalPoint2) +ANT_GL_IMPL(glFeedbackBuffer) +ANT_GL_IMPL(glFinish) +ANT_GL_IMPL(glFlush) +ANT_GL_IMPL(glFogf) +ANT_GL_IMPL(glFogfv) +ANT_GL_IMPL(glFogi) +ANT_GL_IMPL(glFogiv) +ANT_GL_IMPL(glFrontFace) +ANT_GL_IMPL(glFrustum) +ANT_GL_IMPL(glGenLists) +ANT_GL_IMPL(glGenTextures) +ANT_GL_IMPL(glGetBooleanv) +ANT_GL_IMPL(glGetClipPlane) +ANT_GL_IMPL(glGetDoublev) +ANT_GL_IMPL(glGetError) +ANT_GL_IMPL(glGetFloatv) +ANT_GL_IMPL(glGetIntegerv) +ANT_GL_IMPL(glGetLightfv) +ANT_GL_IMPL(glGetLightiv) +ANT_GL_IMPL(glGetMapdv) +ANT_GL_IMPL(glGetMapfv) +ANT_GL_IMPL(glGetMapiv) +ANT_GL_IMPL(glGetMaterialfv) +ANT_GL_IMPL(glGetMaterialiv) +ANT_GL_IMPL(glGetPixelMapfv) +ANT_GL_IMPL(glGetPixelMapuiv) +ANT_GL_IMPL(glGetPixelMapusv) +ANT_GL_IMPL(glGetPointerv) +ANT_GL_IMPL(glGetPolygonStipple) +ANT_GL_IMPL(glGetString) +ANT_GL_IMPL(glGetTexEnvfv) +ANT_GL_IMPL(glGetTexEnviv) +ANT_GL_IMPL(glGetTexGendv) +ANT_GL_IMPL(glGetTexGenfv) +ANT_GL_IMPL(glGetTexGeniv) +ANT_GL_IMPL(glGetTexImage) +ANT_GL_IMPL(glGetTexLevelParameterfv) +ANT_GL_IMPL(glGetTexLevelParameteriv) +ANT_GL_IMPL(glGetTexParameterfv) +ANT_GL_IMPL(glGetTexParameteriv) +ANT_GL_IMPL(glHint) +ANT_GL_IMPL(glIndexMask) +ANT_GL_IMPL(glIndexPointer) +ANT_GL_IMPL(glIndexd) +ANT_GL_IMPL(glIndexdv) +ANT_GL_IMPL(glIndexf) +ANT_GL_IMPL(glIndexfv) +ANT_GL_IMPL(glIndexi) +ANT_GL_IMPL(glIndexiv) +ANT_GL_IMPL(glIndexs) +ANT_GL_IMPL(glIndexsv) +ANT_GL_IMPL(glIndexub) +ANT_GL_IMPL(glIndexubv) +ANT_GL_IMPL(glInitNames) +ANT_GL_IMPL(glInterleavedArrays) +ANT_GL_IMPL(glIsEnabled) +ANT_GL_IMPL(glIsList) +ANT_GL_IMPL(glIsTexture) +ANT_GL_IMPL(glLightModelf) +ANT_GL_IMPL(glLightModelfv) +ANT_GL_IMPL(glLightModeli) +ANT_GL_IMPL(glLightModeliv) +ANT_GL_IMPL(glLightf) +ANT_GL_IMPL(glLightfv) +ANT_GL_IMPL(glLighti) +ANT_GL_IMPL(glLightiv) +ANT_GL_IMPL(glLineStipple) +ANT_GL_IMPL(glLineWidth) +ANT_GL_IMPL(glListBase) +ANT_GL_IMPL(glLoadIdentity) +ANT_GL_IMPL(glLoadMatrixd) +ANT_GL_IMPL(glLoadMatrixf) +ANT_GL_IMPL(glLoadName) +ANT_GL_IMPL(glLogicOp) +ANT_GL_IMPL(glMap1d) +ANT_GL_IMPL(glMap1f) +ANT_GL_IMPL(glMap2d) +ANT_GL_IMPL(glMap2f) +ANT_GL_IMPL(glMapGrid1d) +ANT_GL_IMPL(glMapGrid1f) +ANT_GL_IMPL(glMapGrid2d) +ANT_GL_IMPL(glMapGrid2f) +ANT_GL_IMPL(glMaterialf) +ANT_GL_IMPL(glMaterialfv) +ANT_GL_IMPL(glMateriali) +ANT_GL_IMPL(glMaterialiv) +ANT_GL_IMPL(glMatrixMode) +ANT_GL_IMPL(glMultMatrixd) +ANT_GL_IMPL(glMultMatrixf) +ANT_GL_IMPL(glNewList) +ANT_GL_IMPL(glNormal3b) +ANT_GL_IMPL(glNormal3bv) +ANT_GL_IMPL(glNormal3d) +ANT_GL_IMPL(glNormal3dv) +ANT_GL_IMPL(glNormal3f) +ANT_GL_IMPL(glNormal3fv) +ANT_GL_IMPL(glNormal3i) +ANT_GL_IMPL(glNormal3iv) +ANT_GL_IMPL(glNormal3s) +ANT_GL_IMPL(glNormal3sv) +ANT_GL_IMPL(glNormalPointer) +ANT_GL_IMPL(glOrtho) +ANT_GL_IMPL(glPassThrough) +ANT_GL_IMPL(glPixelMapfv) +ANT_GL_IMPL(glPixelMapuiv) +ANT_GL_IMPL(glPixelMapusv) +ANT_GL_IMPL(glPixelStoref) +ANT_GL_IMPL(glPixelStorei) +ANT_GL_IMPL(glPixelTransferf) +ANT_GL_IMPL(glPixelTransferi) +ANT_GL_IMPL(glPixelZoom) +ANT_GL_IMPL(glPointSize) +ANT_GL_IMPL(glPolygonMode) +ANT_GL_IMPL(glPolygonOffset) +ANT_GL_IMPL(glPolygonStipple) +ANT_GL_IMPL(glPopAttrib) +ANT_GL_IMPL(glPopClientAttrib) +ANT_GL_IMPL(glPopMatrix) +ANT_GL_IMPL(glPopName) +ANT_GL_IMPL(glPrioritizeTextures) +ANT_GL_IMPL(glPushAttrib) +ANT_GL_IMPL(glPushClientAttrib) +ANT_GL_IMPL(glPushMatrix) +ANT_GL_IMPL(glPushName) +ANT_GL_IMPL(glRasterPos2d) +ANT_GL_IMPL(glRasterPos2dv) +ANT_GL_IMPL(glRasterPos2f) +ANT_GL_IMPL(glRasterPos2fv) +ANT_GL_IMPL(glRasterPos2i) +ANT_GL_IMPL(glRasterPos2iv) +ANT_GL_IMPL(glRasterPos2s) +ANT_GL_IMPL(glRasterPos2sv) +ANT_GL_IMPL(glRasterPos3d) +ANT_GL_IMPL(glRasterPos3dv) +ANT_GL_IMPL(glRasterPos3f) +ANT_GL_IMPL(glRasterPos3fv) +ANT_GL_IMPL(glRasterPos3i) +ANT_GL_IMPL(glRasterPos3iv) +ANT_GL_IMPL(glRasterPos3s) +ANT_GL_IMPL(glRasterPos3sv) +ANT_GL_IMPL(glRasterPos4d) +ANT_GL_IMPL(glRasterPos4dv) +ANT_GL_IMPL(glRasterPos4f) +ANT_GL_IMPL(glRasterPos4fv) +ANT_GL_IMPL(glRasterPos4i) +ANT_GL_IMPL(glRasterPos4iv) +ANT_GL_IMPL(glRasterPos4s) +ANT_GL_IMPL(glRasterPos4sv) +ANT_GL_IMPL(glReadBuffer) +ANT_GL_IMPL(glReadPixels) +ANT_GL_IMPL(glRectd) +ANT_GL_IMPL(glRectdv) +ANT_GL_IMPL(glRectf) +ANT_GL_IMPL(glRectfv) +ANT_GL_IMPL(glRecti) +ANT_GL_IMPL(glRectiv) +ANT_GL_IMPL(glRects) +ANT_GL_IMPL(glRectsv) +ANT_GL_IMPL(glRenderMode) +ANT_GL_IMPL(glRotated) +ANT_GL_IMPL(glRotatef) +ANT_GL_IMPL(glScaled) +ANT_GL_IMPL(glScalef) +ANT_GL_IMPL(glScissor) +ANT_GL_IMPL(glSelectBuffer) +ANT_GL_IMPL(glShadeModel) +ANT_GL_IMPL(glStencilFunc) +ANT_GL_IMPL(glStencilMask) +ANT_GL_IMPL(glStencilOp) +ANT_GL_IMPL(glTexCoord1d) +ANT_GL_IMPL(glTexCoord1dv) +ANT_GL_IMPL(glTexCoord1f) +ANT_GL_IMPL(glTexCoord1fv) +ANT_GL_IMPL(glTexCoord1i) +ANT_GL_IMPL(glTexCoord1iv) +ANT_GL_IMPL(glTexCoord1s) +ANT_GL_IMPL(glTexCoord1sv) +ANT_GL_IMPL(glTexCoord2d) +ANT_GL_IMPL(glTexCoord2dv) +ANT_GL_IMPL(glTexCoord2f) +ANT_GL_IMPL(glTexCoord2fv) +ANT_GL_IMPL(glTexCoord2i) +ANT_GL_IMPL(glTexCoord2iv) +ANT_GL_IMPL(glTexCoord2s) +ANT_GL_IMPL(glTexCoord2sv) +ANT_GL_IMPL(glTexCoord3d) +ANT_GL_IMPL(glTexCoord3dv) +ANT_GL_IMPL(glTexCoord3f) +ANT_GL_IMPL(glTexCoord3fv) +ANT_GL_IMPL(glTexCoord3i) +ANT_GL_IMPL(glTexCoord3iv) +ANT_GL_IMPL(glTexCoord3s) +ANT_GL_IMPL(glTexCoord3sv) +ANT_GL_IMPL(glTexCoord4d) +ANT_GL_IMPL(glTexCoord4dv) +ANT_GL_IMPL(glTexCoord4f) +ANT_GL_IMPL(glTexCoord4fv) +ANT_GL_IMPL(glTexCoord4i) +ANT_GL_IMPL(glTexCoord4iv) +ANT_GL_IMPL(glTexCoord4s) +ANT_GL_IMPL(glTexCoord4sv) +ANT_GL_IMPL(glTexCoordPointer) +ANT_GL_IMPL(glTexEnvf) +ANT_GL_IMPL(glTexEnvfv) +ANT_GL_IMPL(glTexEnvi) +ANT_GL_IMPL(glTexEnviv) +ANT_GL_IMPL(glTexGend) +ANT_GL_IMPL(glTexGendv) +ANT_GL_IMPL(glTexGenf) +ANT_GL_IMPL(glTexGenfv) +ANT_GL_IMPL(glTexGeni) +ANT_GL_IMPL(glTexGeniv) +ANT_GL_IMPL(glTexImage1D) +ANT_GL_IMPL(glTexImage2D) +ANT_GL_IMPL(glTexParameterf) +ANT_GL_IMPL(glTexParameterfv) +ANT_GL_IMPL(glTexParameteri) +ANT_GL_IMPL(glTexParameteriv) +ANT_GL_IMPL(glTexSubImage1D) +ANT_GL_IMPL(glTexSubImage2D) +ANT_GL_IMPL(glTranslated) +ANT_GL_IMPL(glTranslatef) +ANT_GL_IMPL(glVertex2d) +ANT_GL_IMPL(glVertex2dv) +ANT_GL_IMPL(glVertex2f) +ANT_GL_IMPL(glVertex2fv) +ANT_GL_IMPL(glVertex2i) +ANT_GL_IMPL(glVertex2iv) +ANT_GL_IMPL(glVertex2s) +ANT_GL_IMPL(glVertex2sv) +ANT_GL_IMPL(glVertex3d) +ANT_GL_IMPL(glVertex3dv) +ANT_GL_IMPL(glVertex3f) +ANT_GL_IMPL(glVertex3fv) +ANT_GL_IMPL(glVertex3i) +ANT_GL_IMPL(glVertex3iv) +ANT_GL_IMPL(glVertex3s) +ANT_GL_IMPL(glVertex3sv) +ANT_GL_IMPL(glVertex4d) +ANT_GL_IMPL(glVertex4dv) +ANT_GL_IMPL(glVertex4f) +ANT_GL_IMPL(glVertex4fv) +ANT_GL_IMPL(glVertex4i) +ANT_GL_IMPL(glVertex4iv) +ANT_GL_IMPL(glVertex4s) +ANT_GL_IMPL(glVertex4sv) +ANT_GL_IMPL(glVertexPointer) +ANT_GL_IMPL(glViewport) +#if defined(ANT_WINDOWS) +ANT_GL_IMPL(wglGetProcAddress) +#endif + +namespace GL { PFNGLGetProcAddress _glGetProcAddress = NULL; } + +// --------------------------------------------------------------------------- + +#if defined(ANT_WINDOWS) + + // --------------------------------------------------------------------------- + + int LoadOpenGL() + { + if( g_OGLModule!=NULL ) + { + return 1; // "OpenGL library already loaded" + } + + g_OGLModule = LoadLibrary("OPENGL32.DLL"); + if( g_OGLModule ) + { + // Info(VERB_LOW, "Load %d OpenGL functions", g_NbOGLFunc); + + int Res = 1; + for(int i=0; i0); + *(g_OGLFuncRec[i].m_FuncPtr) = reinterpret_cast(GetProcAddress(g_OGLModule, g_OGLFuncRec[i].m_Name)); + if( *(g_OGLFuncRec[i].m_FuncPtr)==NULL ) + Res = 0; // Error("cannot find OpenGL function"); + + } + + _glGetProcAddress = reinterpret_cast(_wglGetProcAddress); + if( _glGetProcAddress==NULL ) + Res = 0; + + return Res; + } + else + { + // InternDisplayLastErrorWIN("Cannot load opengl32 DLL", false); + return 0; // cannot load DLL + } + } + + // --------------------------------------------------------------------------- + + int UnloadOpenGL() + { + if( g_OGLModule==NULL ) + { + return 1; // "OpenGL library not loaded" + } + + // Info(VERB_LOW, "Unload %d OpenGL functions", g_NbOGLFunc); + for(int i=0; i0); + *(g_OGLFuncRec[i].m_FuncPtr) = NULL; + } + if( FreeLibrary(g_OGLModule) ) + { + // Info(VERB_LOW, "OpenGL library unloaded"); + g_OGLModule = NULL; + return 1; + } + else + { + // InternDisplayLastErrorWIN("Cannot unload opengl32 DLL", false); + return 0; // cannot unload opengl32.dll + } + } + + // --------------------------------------------------------------------------- + + namespace GL + { + + PFNOpenGL Record(const char *_FuncName, PFNOpenGL *_FuncPtr) + { + if( g_NbOGLFunc>=ANT_NB_OGL_FUNC_MAX ) + { + fprintf(stderr, "Too many OpenGL functions declared. Change ANT_NB_OGL_FUNC_MAX."); + exit(-1); + } + + g_OGLFuncRec[g_NbOGLFunc].m_Name = _FuncName; + g_OGLFuncRec[g_NbOGLFunc].m_FuncPtr = _FuncPtr; + ++g_NbOGLFunc; + + return NULL; + } + + } // namespace GL + + // --------------------------------------------------------------------------- + +#endif // defined(ANT_WINDOWS) + +// --------------------------------------------------------------------------- + +#if defined(ANT_UNIX) + + int LoadOpenGL() + { + _glGetProcAddress = reinterpret_cast(glXGetProcAddressARB); + + return 1; // "OpenGL library is statically linked" + } + + int UnloadOpenGL() + { + return 1; // "OpenGL library is statically linked" + } + +#endif // defined(ANT_UNIX) + +// --------------------------------------------------------------------------- diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/LoadOGL.h b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/LoadOGL.h new file mode 100644 index 00000000..a963b991 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/LoadOGL.h @@ -0,0 +1,393 @@ +// --------------------------------------------------------------------------- +// +// @file LoadOGL.h +// @brief OpenGL declarations for dynamic loading +// @author Philippe Decaudin - http://www.antisphere.com +// @license This file is part of the AntTweakBar library. +// Copyright © 2005, 2006 Philippe Decaudin. +// For conditions of distribution and use, see License.txt +// +// notes: Private header +// TAB=4 +// +// --------------------------------------------------------------------------- + + +#if !defined ANT_LOAD_OGL_INCLUDED +#define ANT_LOAD_OGL_INCLUDED + + +#define ANT_GL_DECL(_Ret, _Fct, _Params) \ + extern "C" { typedef _Ret (APIENTRY* PFN##_Fct)_Params; } \ + namespace GL { extern PFN##_Fct _##_Fct; } \ + using GL::_##_Fct; + +#if defined(ANT_WINDOWS) +# define ANT_GL_IMPL(_Fct) \ + namespace GL { PFN##_Fct _##_Fct = (PFN##_Fct)Record(#_Fct, (PFNOpenGL*)(&_##_Fct)); } +#elif defined(ANT_UNIX) +# define ANT_GL_IMPL(_Fct) \ + namespace GL { PFN##_Fct _##_Fct = _Fct; } +# if !defined(APIENTRY) +# define APIENTRY +# endif +#endif + + +int LoadOpenGL(); +int UnloadOpenGL(); + +namespace GL +{ + extern "C" { typedef void (APIENTRY* PFNOpenGL)(); } + PFNOpenGL Record(const char *_FuncName, PFNOpenGL *_FuncPtr); + + extern "C" { typedef PFNOpenGL (APIENTRY *PFNGLGetProcAddress)(const char *); } + extern PFNGLGetProcAddress _glGetProcAddress; +} +using GL::_glGetProcAddress; + + +ANT_GL_DECL(void, glAccum, (GLenum op, GLfloat value)) +ANT_GL_DECL(void, glAlphaFunc, (GLenum func, GLclampf ref)) +ANT_GL_DECL(GLboolean, glAreTexturesResident, (GLsizei n, const GLuint *textures, GLboolean *residences)) +ANT_GL_DECL(void, glArrayElement, (GLint i)) +ANT_GL_DECL(void, glBegin, (GLenum mode)) +ANT_GL_DECL(void, glBindTexture, (GLenum target, GLuint texture)) +ANT_GL_DECL(void, glBitmap, (GLsizei width, GLsizei height, GLfloat xorig, GLfloat yorig, GLfloat xmove, GLfloat ymove, const GLubyte *bitmap)) +ANT_GL_DECL(void, glBlendFunc, (GLenum sfactor, GLenum dfactor)) +ANT_GL_DECL(void, glCallList, (GLuint list)) +ANT_GL_DECL(void, glCallLists, (GLsizei n, GLenum type, const GLvoid *lists)) +ANT_GL_DECL(void, glClear, (GLbitfield mask)) +ANT_GL_DECL(void, glClearAccum, (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)) +ANT_GL_DECL(void, glClearColor, (GLclampf red, GLclampf green, GLclampf blue, GLclampf alpha)) +ANT_GL_DECL(void, glClearDepth, (GLclampd depth)) +ANT_GL_DECL(void, glClearIndex, (GLfloat c)) +ANT_GL_DECL(void, glClearStencil, (GLint s)) +ANT_GL_DECL(void, glClipPlane, (GLenum plane, const GLdouble *equation)) +ANT_GL_DECL(void, glColor3b, (GLbyte red, GLbyte green, GLbyte blue)) +ANT_GL_DECL(void, glColor3bv, (const GLbyte *v)) +ANT_GL_DECL(void, glColor3d, (GLdouble red, GLdouble green, GLdouble blue)) +ANT_GL_DECL(void, glColor3dv, (const GLdouble *v)) +ANT_GL_DECL(void, glColor3f, (GLfloat red, GLfloat green, GLfloat blue)) +ANT_GL_DECL(void, glColor3fv, (const GLfloat *v)) +ANT_GL_DECL(void, glColor3i, (GLint red, GLint green, GLint blue)) +ANT_GL_DECL(void, glColor3iv, (const GLint *v)) +ANT_GL_DECL(void, glColor3s, (GLshort red, GLshort green, GLshort blue)) +ANT_GL_DECL(void, glColor3sv, (const GLshort *v)) +ANT_GL_DECL(void, glColor3ub, (GLubyte red, GLubyte green, GLubyte blue)) +ANT_GL_DECL(void, glColor3ubv, (const GLubyte *v)) +ANT_GL_DECL(void, glColor3ui, (GLuint red, GLuint green, GLuint blue)) +ANT_GL_DECL(void, glColor3uiv, (const GLuint *v)) +ANT_GL_DECL(void, glColor3us, (GLushort red, GLushort green, GLushort blue)) +ANT_GL_DECL(void, glColor3usv, (const GLushort *v)) +ANT_GL_DECL(void, glColor4b, (GLbyte red, GLbyte green, GLbyte blue, GLbyte alpha)) +ANT_GL_DECL(void, glColor4bv, (const GLbyte *v)) +ANT_GL_DECL(void, glColor4d, (GLdouble red, GLdouble green, GLdouble blue, GLdouble alpha)) +ANT_GL_DECL(void, glColor4dv, (const GLdouble *v)) +ANT_GL_DECL(void, glColor4f, (GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha)) +ANT_GL_DECL(void, glColor4fv, (const GLfloat *v)) +ANT_GL_DECL(void, glColor4i, (GLint red, GLint green, GLint blue, GLint alpha)) +ANT_GL_DECL(void, glColor4iv, (const GLint *v)) +ANT_GL_DECL(void, glColor4s, (GLshort red, GLshort green, GLshort blue, GLshort alpha)) +ANT_GL_DECL(void, glColor4sv, (const GLshort *v)) +ANT_GL_DECL(void, glColor4ub, (GLubyte red, GLubyte green, GLubyte blue, GLubyte alpha)) +ANT_GL_DECL(void, glColor4ubv, (const GLubyte *v)) +ANT_GL_DECL(void, glColor4ui, (GLuint red, GLuint green, GLuint blue, GLuint alpha)) +ANT_GL_DECL(void, glColor4uiv, (const GLuint *v)) +ANT_GL_DECL(void, glColor4us, (GLushort red, GLushort green, GLushort blue, GLushort alpha)) +ANT_GL_DECL(void, glColor4usv, (const GLushort *v)) +ANT_GL_DECL(void, glColorMask, (GLboolean red, GLboolean green, GLboolean blue, GLboolean alpha)) +ANT_GL_DECL(void, glColorMaterial, (GLenum face, GLenum mode)) +ANT_GL_DECL(void, glColorPointer, (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)) +ANT_GL_DECL(void, glCopyPixels, (GLint x, GLint y, GLsizei width, GLsizei height, GLenum type)) +ANT_GL_DECL(void, glCopyTexImage1D, (GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLint border)) +ANT_GL_DECL(void, glCopyTexImage2D, (GLenum target, GLint level, GLenum internalFormat, GLint x, GLint y, GLsizei width, GLsizei height, GLint border)) +ANT_GL_DECL(void, glCopyTexSubImage1D, (GLenum target, GLint level, GLint xoffset, GLint x, GLint y, GLsizei width)) +ANT_GL_DECL(void, glCopyTexSubImage2D, (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLint x, GLint y, GLsizei width, GLsizei height)) +ANT_GL_DECL(void, glCullFace, (GLenum mode)) +ANT_GL_DECL(void, glDeleteLists, (GLuint list, GLsizei range)) +ANT_GL_DECL(void, glDeleteTextures, (GLsizei n, const GLuint *textures)) +ANT_GL_DECL(void, glDepthFunc, (GLenum func)) +ANT_GL_DECL(void, glDepthMask, (GLboolean flag)) +ANT_GL_DECL(void, glDepthRange, (GLclampd zNear, GLclampd zFar)) +ANT_GL_DECL(void, glDisable, (GLenum cap)) +ANT_GL_DECL(void, glDisableClientState, (GLenum array)) +ANT_GL_DECL(void, glDrawArrays, (GLenum mode, GLint first, GLsizei count)) +ANT_GL_DECL(void, glDrawBuffer, (GLenum mode)) +ANT_GL_DECL(void, glDrawElements, (GLenum mode, GLsizei count, GLenum type, const GLvoid *indices)) +ANT_GL_DECL(void, glDrawPixels, (GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)) +ANT_GL_DECL(void, glEdgeFlag, (GLboolean flag)) +ANT_GL_DECL(void, glEdgeFlagPointer, (GLsizei stride, const void *pointer)) +ANT_GL_DECL(void, glEdgeFlagv, (const GLboolean *flag)) +ANT_GL_DECL(void, glEnable, (GLenum cap)) +ANT_GL_DECL(void, glEnableClientState, (GLenum array)) +ANT_GL_DECL(void, glEnd, (void)) +ANT_GL_DECL(void, glEndList, (void)) +ANT_GL_DECL(void, glEvalCoord1d, (GLdouble u)) +ANT_GL_DECL(void, glEvalCoord1dv, (const GLdouble *u)) +ANT_GL_DECL(void, glEvalCoord1f, (GLfloat u)) +ANT_GL_DECL(void, glEvalCoord1fv, (const GLfloat *u)) +ANT_GL_DECL(void, glEvalCoord2d, (GLdouble u, GLdouble v)) +ANT_GL_DECL(void, glEvalCoord2dv, (const GLdouble *u)) +ANT_GL_DECL(void, glEvalCoord2f, (GLfloat u, GLfloat v)) +ANT_GL_DECL(void, glEvalCoord2fv, (const GLfloat *u)) +ANT_GL_DECL(void, glEvalMesh1, (GLenum mode, GLint i1, GLint i2)) +ANT_GL_DECL(void, glEvalMesh2, (GLenum mode, GLint i1, GLint i2, GLint j1, GLint j2)) +ANT_GL_DECL(void, glEvalPoint1, (GLint i)) +ANT_GL_DECL(void, glEvalPoint2, (GLint i, GLint j)) +ANT_GL_DECL(void, glFeedbackBuffer, (GLsizei size, GLenum type, GLfloat *buffer)) +ANT_GL_DECL(void, glFinish, (void)) +ANT_GL_DECL(void, glFlush, (void)) +ANT_GL_DECL(void, glFogf, (GLenum pname, GLfloat param)) +ANT_GL_DECL(void, glFogfv, (GLenum pname, const GLfloat *params)) +ANT_GL_DECL(void, glFogi, (GLenum pname, GLint param)) +ANT_GL_DECL(void, glFogiv, (GLenum pname, const GLint *params)) +ANT_GL_DECL(void, glFrontFace, (GLenum mode)) +ANT_GL_DECL(void, glFrustum, (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)) +ANT_GL_DECL(GLuint, glGenLists, (GLsizei range)) +ANT_GL_DECL(void, glGenTextures, (GLsizei n, GLuint *textures)) +ANT_GL_DECL(void, glGetBooleanv, (GLenum pname, GLboolean *params)) +ANT_GL_DECL(void, glGetClipPlane, (GLenum plane, GLdouble *equation)) +ANT_GL_DECL(void, glGetDoublev, (GLenum pname, GLdouble *params)) +ANT_GL_DECL(GLenum, glGetError, (void)) +ANT_GL_DECL(void, glGetFloatv, (GLenum pname, GLfloat *params)) +ANT_GL_DECL(void, glGetIntegerv, (GLenum pname, GLint *params)) +ANT_GL_DECL(void, glGetLightfv, (GLenum light, GLenum pname, GLfloat *params)) +ANT_GL_DECL(void, glGetLightiv, (GLenum light, GLenum pname, GLint *params)) +ANT_GL_DECL(void, glGetMapdv, (GLenum target, GLenum query, GLdouble *v)) +ANT_GL_DECL(void, glGetMapfv, (GLenum target, GLenum query, GLfloat *v)) +ANT_GL_DECL(void, glGetMapiv, (GLenum target, GLenum query, GLint *v)) +ANT_GL_DECL(void, glGetMaterialfv, (GLenum face, GLenum pname, GLfloat *params)) +ANT_GL_DECL(void, glGetMaterialiv, (GLenum face, GLenum pname, GLint *params)) +ANT_GL_DECL(void, glGetPixelMapfv, (GLenum map, GLfloat *values)) +ANT_GL_DECL(void, glGetPixelMapuiv, (GLenum map, GLuint *values)) +ANT_GL_DECL(void, glGetPixelMapusv, (GLenum map, GLushort *values)) +ANT_GL_DECL(void, glGetPointerv, (GLenum pname, GLvoid* *params)) +ANT_GL_DECL(void, glGetPolygonStipple, (GLubyte *mask)) +ANT_GL_DECL(const GLubyte *, glGetString, (GLenum name)) +ANT_GL_DECL(void, glGetTexEnvfv, (GLenum target, GLenum pname, GLfloat *params)) +ANT_GL_DECL(void, glGetTexEnviv, (GLenum target, GLenum pname, GLint *params)) +ANT_GL_DECL(void, glGetTexGendv, (GLenum coord, GLenum pname, GLdouble *params)) +ANT_GL_DECL(void, glGetTexGenfv, (GLenum coord, GLenum pname, GLfloat *params)) +ANT_GL_DECL(void, glGetTexGeniv, (GLenum coord, GLenum pname, GLint *params)) +ANT_GL_DECL(void, glGetTexImage, (GLenum target, GLint level, GLenum format, GLenum type, GLvoid *pixels)) +ANT_GL_DECL(void, glGetTexLevelParameterfv, (GLenum target, GLint level, GLenum pname, GLfloat *params)) +ANT_GL_DECL(void, glGetTexLevelParameteriv, (GLenum target, GLint level, GLenum pname, GLint *params)) +ANT_GL_DECL(void, glGetTexParameterfv, (GLenum target, GLenum pname, GLfloat *params)) +ANT_GL_DECL(void, glGetTexParameteriv, (GLenum target, GLenum pname, GLint *params)) +ANT_GL_DECL(void, glHint, (GLenum target, GLenum mode)) +ANT_GL_DECL(void, glIndexMask, (GLuint mask)) +ANT_GL_DECL(void, glIndexPointer, (GLenum type, GLsizei stride, const GLvoid *pointer)) +ANT_GL_DECL(void, glIndexd, (GLdouble c)) +ANT_GL_DECL(void, glIndexdv, (const GLdouble *c)) +ANT_GL_DECL(void, glIndexf, (GLfloat c)) +ANT_GL_DECL(void, glIndexfv, (const GLfloat *c)) +ANT_GL_DECL(void, glIndexi, (GLint c)) +ANT_GL_DECL(void, glIndexiv, (const GLint *c)) +ANT_GL_DECL(void, glIndexs, (GLshort c)) +ANT_GL_DECL(void, glIndexsv, (const GLshort *c)) +ANT_GL_DECL(void, glIndexub, (GLubyte c)) +ANT_GL_DECL(void, glIndexubv, (const GLubyte *c)) +ANT_GL_DECL(void, glInitNames, (void)) +ANT_GL_DECL(void, glInterleavedArrays, (GLenum format, GLsizei stride, const GLvoid *pointer)) +ANT_GL_DECL(GLboolean, glIsEnabled, (GLenum cap)) +ANT_GL_DECL(GLboolean, glIsList, (GLuint list)) +ANT_GL_DECL(GLboolean, glIsTexture, (GLuint texture)) +ANT_GL_DECL(void, glLightModelf, (GLenum pname, GLfloat param)) +ANT_GL_DECL(void, glLightModelfv, (GLenum pname, const GLfloat *params)) +ANT_GL_DECL(void, glLightModeli, (GLenum pname, GLint param)) +ANT_GL_DECL(void, glLightModeliv, (GLenum pname, const GLint *params)) +ANT_GL_DECL(void, glLightf, (GLenum light, GLenum pname, GLfloat param)) +ANT_GL_DECL(void, glLightfv, (GLenum light, GLenum pname, const GLfloat *params)) +ANT_GL_DECL(void, glLighti, (GLenum light, GLenum pname, GLint param)) +ANT_GL_DECL(void, glLightiv, (GLenum light, GLenum pname, const GLint *params)) +ANT_GL_DECL(void, glLineStipple, (GLint factor, GLushort pattern)) +ANT_GL_DECL(void, glLineWidth, (GLfloat width)) +ANT_GL_DECL(void, glListBase, (GLuint base)) +ANT_GL_DECL(void, glLoadIdentity, (void)) +ANT_GL_DECL(void, glLoadMatrixd, (const GLdouble *m)) +ANT_GL_DECL(void, glLoadMatrixf, (const GLfloat *m)) +ANT_GL_DECL(void, glLoadName, (GLuint name)) +ANT_GL_DECL(void, glLogicOp, (GLenum opcode)) +ANT_GL_DECL(void, glMap1d, (GLenum target, GLdouble u1, GLdouble u2, GLint stride, GLint order, const GLdouble *points)) +ANT_GL_DECL(void, glMap1f, (GLenum target, GLfloat u1, GLfloat u2, GLint stride, GLint order, const GLfloat *points)) +ANT_GL_DECL(void, glMap2d, (GLenum target, GLdouble u1, GLdouble u2, GLint ustride, GLint uorder, GLdouble v1, GLdouble v2, GLint vstride, GLint vorder, const GLdouble *points)) +ANT_GL_DECL(void, glMap2f, (GLenum target, GLfloat u1, GLfloat u2, GLint ustride, GLint uorder, GLfloat v1, GLfloat v2, GLint vstride, GLint vorder, const GLfloat *points)) +ANT_GL_DECL(void, glMapGrid1d, (GLint un, GLdouble u1, GLdouble u2)) +ANT_GL_DECL(void, glMapGrid1f, (GLint un, GLfloat u1, GLfloat u2)) +ANT_GL_DECL(void, glMapGrid2d, (GLint un, GLdouble u1, GLdouble u2, GLint vn, GLdouble v1, GLdouble v2)) +ANT_GL_DECL(void, glMapGrid2f, (GLint un, GLfloat u1, GLfloat u2, GLint vn, GLfloat v1, GLfloat v2)) +ANT_GL_DECL(void, glMaterialf, (GLenum face, GLenum pname, GLfloat param)) +ANT_GL_DECL(void, glMaterialfv, (GLenum face, GLenum pname, const GLfloat *params)) +ANT_GL_DECL(void, glMateriali, (GLenum face, GLenum pname, GLint param)) +ANT_GL_DECL(void, glMaterialiv, (GLenum face, GLenum pname, const GLint *params)) +ANT_GL_DECL(void, glMatrixMode, (GLenum mode)) +ANT_GL_DECL(void, glMultMatrixd, (const GLdouble *m)) +ANT_GL_DECL(void, glMultMatrixf, (const GLfloat *m)) +ANT_GL_DECL(void, glNewList, (GLuint list, GLenum mode)) +ANT_GL_DECL(void, glNormal3b, (GLbyte nx, GLbyte ny, GLbyte nz)) +ANT_GL_DECL(void, glNormal3bv, (const GLbyte *v)) +ANT_GL_DECL(void, glNormal3d, (GLdouble nx, GLdouble ny, GLdouble nz)) +ANT_GL_DECL(void, glNormal3dv, (const GLdouble *v)) +ANT_GL_DECL(void, glNormal3f, (GLfloat nx, GLfloat ny, GLfloat nz)) +ANT_GL_DECL(void, glNormal3fv, (const GLfloat *v)) +ANT_GL_DECL(void, glNormal3i, (GLint nx, GLint ny, GLint nz)) +ANT_GL_DECL(void, glNormal3iv, (const GLint *v)) +ANT_GL_DECL(void, glNormal3s, (GLshort nx, GLshort ny, GLshort nz)) +ANT_GL_DECL(void, glNormal3sv, (const GLshort *v)) +ANT_GL_DECL(void, glNormalPointer, (GLenum type, GLsizei stride, const GLvoid *pointer)) +ANT_GL_DECL(void, glOrtho, (GLdouble left, GLdouble right, GLdouble bottom, GLdouble top, GLdouble zNear, GLdouble zFar)) +ANT_GL_DECL(void, glPassThrough, (GLfloat token)) +ANT_GL_DECL(void, glPixelMapfv, (GLenum map, GLsizei mapsize, const GLfloat *values)) +ANT_GL_DECL(void, glPixelMapuiv, (GLenum map, GLsizei mapsize, const GLuint *values)) +ANT_GL_DECL(void, glPixelMapusv, (GLenum map, GLsizei mapsize, const GLushort *values)) +ANT_GL_DECL(void, glPixelStoref, (GLenum pname, GLfloat param)) +ANT_GL_DECL(void, glPixelStorei, (GLenum pname, GLint param)) +ANT_GL_DECL(void, glPixelTransferf, (GLenum pname, GLfloat param)) +ANT_GL_DECL(void, glPixelTransferi, (GLenum pname, GLint param)) +ANT_GL_DECL(void, glPixelZoom, (GLfloat xfactor, GLfloat yfactor)) +ANT_GL_DECL(void, glPointSize, (GLfloat size)) +ANT_GL_DECL(void, glPolygonMode, (GLenum face, GLenum mode)) +ANT_GL_DECL(void, glPolygonOffset, (GLfloat factor, GLfloat units)) +ANT_GL_DECL(void, glPolygonStipple, (const GLubyte *mask)) +ANT_GL_DECL(void, glPopAttrib, (void)) +ANT_GL_DECL(void, glPopClientAttrib, (void)) +ANT_GL_DECL(void, glPopMatrix, (void)) +ANT_GL_DECL(void, glPopName, (void)) +ANT_GL_DECL(void, glPrioritizeTextures, (GLsizei n, const GLuint *textures, const GLclampf *priorities)) +ANT_GL_DECL(void, glPushAttrib, (GLbitfield mask)) +ANT_GL_DECL(void, glPushClientAttrib, (GLbitfield mask)) +ANT_GL_DECL(void, glPushMatrix, (void)) +ANT_GL_DECL(void, glPushName, (GLuint name)) +ANT_GL_DECL(void, glRasterPos2d, (GLdouble x, GLdouble y)) +ANT_GL_DECL(void, glRasterPos2dv, (const GLdouble *v)) +ANT_GL_DECL(void, glRasterPos2f, (GLfloat x, GLfloat y)) +ANT_GL_DECL(void, glRasterPos2fv, (const GLfloat *v)) +ANT_GL_DECL(void, glRasterPos2i, (GLint x, GLint y)) +ANT_GL_DECL(void, glRasterPos2iv, (const GLint *v)) +ANT_GL_DECL(void, glRasterPos2s, (GLshort x, GLshort y)) +ANT_GL_DECL(void, glRasterPos2sv, (const GLshort *v)) +ANT_GL_DECL(void, glRasterPos3d, (GLdouble x, GLdouble y, GLdouble z)) +ANT_GL_DECL(void, glRasterPos3dv, (const GLdouble *v)) +ANT_GL_DECL(void, glRasterPos3f, (GLfloat x, GLfloat y, GLfloat z)) +ANT_GL_DECL(void, glRasterPos3fv, (const GLfloat *v)) +ANT_GL_DECL(void, glRasterPos3i, (GLint x, GLint y, GLint z)) +ANT_GL_DECL(void, glRasterPos3iv, (const GLint *v)) +ANT_GL_DECL(void, glRasterPos3s, (GLshort x, GLshort y, GLshort z)) +ANT_GL_DECL(void, glRasterPos3sv, (const GLshort *v)) +ANT_GL_DECL(void, glRasterPos4d, (GLdouble x, GLdouble y, GLdouble z, GLdouble w)) +ANT_GL_DECL(void, glRasterPos4dv, (const GLdouble *v)) +ANT_GL_DECL(void, glRasterPos4f, (GLfloat x, GLfloat y, GLfloat z, GLfloat w)) +ANT_GL_DECL(void, glRasterPos4fv, (const GLfloat *v)) +ANT_GL_DECL(void, glRasterPos4i, (GLint x, GLint y, GLint z, GLint w)) +ANT_GL_DECL(void, glRasterPos4iv, (const GLint *v)) +ANT_GL_DECL(void, glRasterPos4s, (GLshort x, GLshort y, GLshort z, GLshort w)) +ANT_GL_DECL(void, glRasterPos4sv, (const GLshort *v)) +ANT_GL_DECL(void, glReadBuffer, (GLenum mode)) +ANT_GL_DECL(void, glReadPixels, (GLint x, GLint y, GLsizei width, GLsizei height, GLenum format, GLenum type, GLvoid *pixels)) +ANT_GL_DECL(void, glRectd, (GLdouble x1, GLdouble y1, GLdouble x2, GLdouble y2)) +ANT_GL_DECL(void, glRectdv, (const GLdouble *v1, const GLdouble *v2)) +ANT_GL_DECL(void, glRectf, (GLfloat x1, GLfloat y1, GLfloat x2, GLfloat y2)) +ANT_GL_DECL(void, glRectfv, (const GLfloat *v1, const GLfloat *v2)) +ANT_GL_DECL(void, glRecti, (GLint x1, GLint y1, GLint x2, GLint y2)) +ANT_GL_DECL(void, glRectiv, (const GLint *v1, const GLint *v2)) +ANT_GL_DECL(void, glRects, (GLshort x1, GLshort y1, GLshort x2, GLshort y2)) +ANT_GL_DECL(void, glRectsv, (const GLshort *v1, const GLshort *v2)) +ANT_GL_DECL(GLint, glRenderMode, (GLenum mode)) +ANT_GL_DECL(void, glRotated, (GLdouble angle, GLdouble x, GLdouble y, GLdouble z)) +ANT_GL_DECL(void, glRotatef, (GLfloat angle, GLfloat x, GLfloat y, GLfloat z)) +ANT_GL_DECL(void, glScaled, (GLdouble x, GLdouble y, GLdouble z)) +ANT_GL_DECL(void, glScalef, (GLfloat x, GLfloat y, GLfloat z)) +ANT_GL_DECL(void, glScissor, (GLint x, GLint y, GLsizei width, GLsizei height)) +ANT_GL_DECL(void, glSelectBuffer, (GLsizei size, GLuint *buffer)) +ANT_GL_DECL(void, glShadeModel, (GLenum mode)) +ANT_GL_DECL(void, glStencilFunc, (GLenum func, GLint ref, GLuint mask)) +ANT_GL_DECL(void, glStencilMask, (GLuint mask)) +ANT_GL_DECL(void, glStencilOp, (GLenum fail, GLenum zfail, GLenum zpass)) +ANT_GL_DECL(void, glTexCoord1d, (GLdouble s)) +ANT_GL_DECL(void, glTexCoord1dv, (const GLdouble *v)) +ANT_GL_DECL(void, glTexCoord1f, (GLfloat s)) +ANT_GL_DECL(void, glTexCoord1fv, (const GLfloat *v)) +ANT_GL_DECL(void, glTexCoord1i, (GLint s)) +ANT_GL_DECL(void, glTexCoord1iv, (const GLint *v)) +ANT_GL_DECL(void, glTexCoord1s, (GLshort s)) +ANT_GL_DECL(void, glTexCoord1sv, (const GLshort *v)) +ANT_GL_DECL(void, glTexCoord2d, (GLdouble s, GLdouble t)) +ANT_GL_DECL(void, glTexCoord2dv, (const GLdouble *v)) +ANT_GL_DECL(void, glTexCoord2f, (GLfloat s, GLfloat t)) +ANT_GL_DECL(void, glTexCoord2fv, (const GLfloat *v)) +ANT_GL_DECL(void, glTexCoord2i, (GLint s, GLint t)) +ANT_GL_DECL(void, glTexCoord2iv, (const GLint *v)) +ANT_GL_DECL(void, glTexCoord2s, (GLshort s, GLshort t)) +ANT_GL_DECL(void, glTexCoord2sv, (const GLshort *v)) +ANT_GL_DECL(void, glTexCoord3d, (GLdouble s, GLdouble t, GLdouble r)) +ANT_GL_DECL(void, glTexCoord3dv, (const GLdouble *v)) +ANT_GL_DECL(void, glTexCoord3f, (GLfloat s, GLfloat t, GLfloat r)) +ANT_GL_DECL(void, glTexCoord3fv, (const GLfloat *v)) +ANT_GL_DECL(void, glTexCoord3i, (GLint s, GLint t, GLint r)) +ANT_GL_DECL(void, glTexCoord3iv, (const GLint *v)) +ANT_GL_DECL(void, glTexCoord3s, (GLshort s, GLshort t, GLshort r)) +ANT_GL_DECL(void, glTexCoord3sv, (const GLshort *v)) +ANT_GL_DECL(void, glTexCoord4d, (GLdouble s, GLdouble t, GLdouble r, GLdouble q)) +ANT_GL_DECL(void, glTexCoord4dv, (const GLdouble *v)) +ANT_GL_DECL(void, glTexCoord4f, (GLfloat s, GLfloat t, GLfloat r, GLfloat q)) +ANT_GL_DECL(void, glTexCoord4fv, (const GLfloat *v)) +ANT_GL_DECL(void, glTexCoord4i, (GLint s, GLint t, GLint r, GLint q)) +ANT_GL_DECL(void, glTexCoord4iv, (const GLint *v)) +ANT_GL_DECL(void, glTexCoord4s, (GLshort s, GLshort t, GLshort r, GLshort q)) +ANT_GL_DECL(void, glTexCoord4sv, (const GLshort *v)) +ANT_GL_DECL(void, glTexCoordPointer, (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)) +ANT_GL_DECL(void, glTexEnvf, (GLenum target, GLenum pname, GLfloat param)) +ANT_GL_DECL(void, glTexEnvfv, (GLenum target, GLenum pname, const GLfloat *params)) +ANT_GL_DECL(void, glTexEnvi, (GLenum target, GLenum pname, GLint param)) +ANT_GL_DECL(void, glTexEnviv, (GLenum target, GLenum pname, const GLint *params)) +ANT_GL_DECL(void, glTexGend, (GLenum coord, GLenum pname, GLdouble param)) +ANT_GL_DECL(void, glTexGendv, (GLenum coord, GLenum pname, const GLdouble *params)) +ANT_GL_DECL(void, glTexGenf, (GLenum coord, GLenum pname, GLfloat param)) +ANT_GL_DECL(void, glTexGenfv, (GLenum coord, GLenum pname, const GLfloat *params)) +ANT_GL_DECL(void, glTexGeni, (GLenum coord, GLenum pname, GLint param)) +ANT_GL_DECL(void, glTexGeniv, (GLenum coord, GLenum pname, const GLint *params)) +ANT_GL_DECL(void, glTexImage1D, (GLenum target, GLint level, GLint internalformat, GLsizei width, GLint border, GLenum format, GLenum type, const GLvoid *pixels)) +ANT_GL_DECL(void, glTexImage2D, (GLenum target, GLint level, GLint internalformat, GLsizei width, GLsizei height, GLint border, GLenum format, GLenum type, const GLvoid *pixels)) +ANT_GL_DECL(void, glTexParameterf, (GLenum target, GLenum pname, GLfloat param)) +ANT_GL_DECL(void, glTexParameterfv, (GLenum target, GLenum pname, const GLfloat *params)) +ANT_GL_DECL(void, glTexParameteri, (GLenum target, GLenum pname, GLint param)) +ANT_GL_DECL(void, glTexParameteriv, (GLenum target, GLenum pname, const GLint *params)) +ANT_GL_DECL(void, glTexSubImage1D, (GLenum target, GLint level, GLint xoffset, GLsizei width, GLenum format, GLenum type, const GLvoid *pixels)) +ANT_GL_DECL(void, glTexSubImage2D, (GLenum target, GLint level, GLint xoffset, GLint yoffset, GLsizei width, GLsizei height, GLenum format, GLenum type, const GLvoid *pixels)) +ANT_GL_DECL(void, glTranslated, (GLdouble x, GLdouble y, GLdouble z)) +ANT_GL_DECL(void, glTranslatef, (GLfloat x, GLfloat y, GLfloat z)) +ANT_GL_DECL(void, glVertex2d, (GLdouble x, GLdouble y)) +ANT_GL_DECL(void, glVertex2dv, (const GLdouble *v)) +ANT_GL_DECL(void, glVertex2f, (GLfloat x, GLfloat y)) +ANT_GL_DECL(void, glVertex2fv, (const GLfloat *v)) +ANT_GL_DECL(void, glVertex2i, (GLint x, GLint y)) +ANT_GL_DECL(void, glVertex2iv, (const GLint *v)) +ANT_GL_DECL(void, glVertex2s, (GLshort x, GLshort y)) +ANT_GL_DECL(void, glVertex2sv, (const GLshort *v)) +ANT_GL_DECL(void, glVertex3d, (GLdouble x, GLdouble y, GLdouble z)) +ANT_GL_DECL(void, glVertex3dv, (const GLdouble *v)) +ANT_GL_DECL(void, glVertex3f, (GLfloat x, GLfloat y, GLfloat z)) +ANT_GL_DECL(void, glVertex3fv, (const GLfloat *v)) +ANT_GL_DECL(void, glVertex3i, (GLint x, GLint y, GLint z)) +ANT_GL_DECL(void, glVertex3iv, (const GLint *v)) +ANT_GL_DECL(void, glVertex3s, (GLshort x, GLshort y, GLshort z)) +ANT_GL_DECL(void, glVertex3sv, (const GLshort *v)) +ANT_GL_DECL(void, glVertex4d, (GLdouble x, GLdouble y, GLdouble z, GLdouble w)) +ANT_GL_DECL(void, glVertex4dv, (const GLdouble *v)) +ANT_GL_DECL(void, glVertex4f, (GLfloat x, GLfloat y, GLfloat z, GLfloat w)) +ANT_GL_DECL(void, glVertex4fv, (const GLfloat *v)) +ANT_GL_DECL(void, glVertex4i, (GLint x, GLint y, GLint z, GLint w)) +ANT_GL_DECL(void, glVertex4iv, (const GLint *v)) +ANT_GL_DECL(void, glVertex4s, (GLshort x, GLshort y, GLshort z, GLshort w)) +ANT_GL_DECL(void, glVertex4sv, (const GLshort *v)) +ANT_GL_DECL(void, glVertexPointer, (GLint size, GLenum type, GLsizei stride, const GLvoid *pointer)) +ANT_GL_DECL(void, glViewport, (GLint x, GLint y, GLsizei width, GLsizei height)) + +#ifdef ANT_WINDOWS +ANT_GL_DECL(PROC, wglGetProcAddress, (LPCSTR)) +#endif + + +#endif // !defined ANT_LOAD_OGL_INCLUDED diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/Makefile b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/Makefile new file mode 100644 index 00000000..bddb7a2a --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/Makefile @@ -0,0 +1,98 @@ +####### Compiler, tools and options + +#---- MinGW +#MINGWFLAGS = -mno-cygwin +#SO_EXT = .dll +#---- LINUX +SO_EXT = .so + +#---- Release +CXXCFG = -O3 +LFLAGS = -Wl,-s +OUT_DIR = ../lib +#---- Debug +#CXXCFG = -g -D_DEBUG +#LFLAGS = +#OUT_DIR = ../lib/debug + + +CXX = gcc +#CXXFLAGS = $(CXXCFG) $(MINGWFLAGS) -pipe -Wall -fomit-frame-pointer -mcpu=pentiumpro -march=i586 -ffast-math -fno-strength-reduce -fpic -D_UNIX -D__PLACEMENT_NEW_INLINE +CXXFLAGS = $(CXXCFG) $(MINGWFLAGS) -Wall -ffast-math -mcpu=i386 -march=i386 -fPIC -D_UNIX -D__PLACEMENT_NEW_INLINE +INCPATH = -I/usr/X11R6/include -I/usr/include -I../include +LINK = gcc +#LIBS = -L/usr/X11R6/lib -L. -lglfw -lGL -lGLU -lX11 -lXxf86vm -lXext -lpthread -lm +#LIBS = -L/usr/X11R6/lib -lGL -lX11 -lXxf86vm -lXext -lpthread -lm +LIBS = +AR = ar cqs +RANLIB = +TAR = tar -cf +GZIP = gzip -9f +COPY = cp -f +COPY_FILE = $(COPY) -p +COPY_DIR = $(COPY) -pR +DEL_FILE = rm -f +SYMLINK = ln -sf +DEL_DIR = rmdir +MOVE = mv +NO_STDERR = 2> /dev/null + + +####### Files + + +# name of the application: +TARGET = AntTweakBar + +# source files without extension: +SRC_FILES = TwColors.cpp TwFonts.cpp TwOpenGL.cpp TwBar.cpp TwMgr.cpp TwPrecomp.cpp LoadOGL.cpp TwEventGLFW.c TwEventGLUT.c TwEventSDL.c + +# build object list from source files +OBJS_1 = $(SRC_FILES:.c=.o) +OBJS = $(OBJS_1:.cpp=.o) + + +####### Build rules + + +#first: depend all +first: all + +all: Makefile $(TARGET) + +# append dependencies to this Makefile +#depend: +# @echo "==== Make dependencies =====" +# makedepend -Y +# makedepend -a -Y -- $(CXXFLAGS) $(INCPATH) -- $(SRC_FILES) $(NO_STDERR) + +$(TARGET): $(OBJS) + @echo "===== Link $@ =====" + $(LINK) $(LFLAGS) -shared -Wl,-soname,lib$(TARGET)$(SO_EXT) -o $(OUT_DIR)/lib$(TARGET)$(SO_EXT) $(OBJS) $(LIBS) + +.cpp.o: + @echo "===== Compile $< =====" + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $< + +.c.o: + @echo "===== Compile $< =====" + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $< + +clean: + @echo "===== Clean =====" + -$(DEL_FILE) *.o + -$(DEL_FILE) *~ core *.core *.stackdump + + +####### DEPENDENCIES + +TwColors.o: TwPrecomp.h TwColors.h +TwFonts.o: TwPrecomp.h ../include/AntTweakBar.h TwFonts.h TwMgr.h TwColors.h TwGraph.h AntPerfTimer.h +TwOpenGL.o: TwPrecomp.h ../include/AntTweakBar.h TwOpenGL.h LoadOGL.h TwGraph.h TwColors.h TwFonts.h TwMgr.h AntPerfTimer.h +TwBar.o: TwPrecomp.h ../include/AntTweakBar.h TwBar.h TwMgr.h TwColors.h TwFonts.h TwGraph.h AntPerfTimer.h +TwMgr.o: TwPrecomp.h ../include/AntTweakBar.h TwMgr.h TwColors.h TwFonts.h TwGraph.h AntPerfTimer.h TwBar.h TwOpenGL.h res/TwXCursors.h +TwPrecomp.o: TwPrecomp.h +LoadOGL.o: TwPrecomp.h LoadOGL.h +TwEventGLFW.o: ../include/AntTweakBar.h +TwEventGLUT.o: ../include/AntTweakBar.h +TwEventSDL.o: ../include/AntTweakBar.h diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/Makefile.x86_64 b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/Makefile.x86_64 new file mode 100644 index 00000000..e237e0ac --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/Makefile.x86_64 @@ -0,0 +1,97 @@ +####### Compiler, tools and options + +#---- MinGW +#MINGWFLAGS = -mno-cygwin +#SO_EXT = .dll +#---- LINUX +SO_EXT = .so + +#---- Release +CXXCFG = -O3 +LFLAGS = -Wl,-s +OUT_DIR = ../lib +#---- Debug +#CXXCFG = -g -D_DEBUG +#LFLAGS = +#OUT_DIR = ../lib/debug + + +CXX = gcc -fPIC +#CXXFLAGS = $(CXXCFG) $(MINGWFLAGS) -pipe -Wall -fomit-frame-pointer -mcpu=pentiumpro -march=i586 -ffast-math -fno-strength-reduce -fpic -D_UNIX -D__PLACEMENT_NEW_INLINE +CXXFLAGS = $(CXXCFG) $(MINGWFLAGS) -Wall -ffast-math -D_UNIX -D__PLACEMENT_NEW_INLINE +INCPATH = -I/usr/include -I/usr/include -I../include +LINK = gcc -fPIC +#LIBS = -L/usr/lib64 -L. -lGL -lGLU -lX11 -lXxf86vm -lXext -lpthread -lm +#LIBS = -L/usr/lib -lGL -lX11 -lXxf86vm -lXext -lpthread -lm +LIBS = +AR = ar cqs +RANLIB = +TAR = tar -cf +GZIP = gzip -9f +COPY = cp -f +COPY_FILE = $(COPY) -p +COPY_DIR = $(COPY) -pR +DEL_FILE = rm -f +SYMLINK = ln -sf +DEL_DIR = rmdir +MOVE = mv +NO_STDERR = 2> /dev/null + + +####### Files + + +# name of the application: +TARGET = AntTweakBar + +# source files without extension: +SRC_FILES = TwColors.cpp TwFonts.cpp TwOpenGL.cpp TwBar.cpp TwMgr.cpp TwPrecomp.cpp LoadOGL.cpp TwEventGLFW.c TwEventGLUT.c TwEventSDL.c + +# build object list from source files +OBJS_1 = $(SRC_FILES:.c=.o) +OBJS = $(OBJS_1:.cpp=.o) + + +####### Build rules + +#first: depend all +first: all + +all: Makefile $(TARGET) + +# append dependencies to this Makefile +#depend: +# @echo "==== Make dependencies =====" +# makedepend -Y +# makedepend -a -Y -- $(CXXFLAGS) $(INCPATH) -- $(SRC_FILES) $(NO_STDERR) + +$(TARGET): $(OBJS) + @echo "===== Link $@ =====" + $(LINK) $(LFLAGS) -shared -Wl,-soname,lib$(TARGET)$(SO_EXT) -o $(OUT_DIR)/lib$(TARGET)$(SO_EXT) $(OBJS) $(LIBS) + +.cpp.o: + @echo "===== Compile $< =====" + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $< + +.c.o: + @echo "===== Compile $< =====" + $(CXX) -c $(CXXFLAGS) $(INCPATH) -o $@ $< + +clean: + @echo "===== Clean =====" + -$(DEL_FILE) *.o + -$(DEL_FILE) *~ core *.core *.stackdump + + +####### DEPENDENCIES + +TwColors.o: TwPrecomp.h TwColors.h +TwFonts.o: TwPrecomp.h ../include/AntTweakBar.h TwFonts.h TwMgr.h TwColors.h TwGraph.h AntPerfTimer.h +TwOpenGL.o: TwPrecomp.h ../include/AntTweakBar.h TwOpenGL.h LoadOGL.h TwGraph.h TwColors.h TwFonts.h TwMgr.h AntPerfTimer.h +TwBar.o: TwPrecomp.h ../include/AntTweakBar.h TwBar.h TwMgr.h TwColors.h TwFonts.h TwGraph.h AntPerfTimer.h +TwMgr.o: TwPrecomp.h ../include/AntTweakBar.h TwMgr.h TwColors.h TwFonts.h TwGraph.h AntPerfTimer.h TwBar.h TwOpenGL.h res/TwXCursors.h +TwPrecomp.o: TwPrecomp.h +LoadOGL.o: TwPrecomp.h LoadOGL.h +TwEventGLFW.o: ../include/AntTweakBar.h +TwEventGLUT.o: ../include/AntTweakBar.h +TwEventSDL.o: ../include/AntTweakBar.h diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/TwBar.cpp b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/TwBar.cpp new file mode 100644 index 00000000..fdfc3c71 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/TwBar.cpp @@ -0,0 +1,4841 @@ +// --------------------------------------------------------------------------- +// +// @file TwBar.cpp +// @author Philippe Decaudin - http://www.antisphere.com +// @license This file is part of the AntTweakBar library. +// Copyright © 2005, 2006 Philippe Decaudin. +// For conditions of distribution and use, see License.txt +// +// note: TAB=4 +// +// --------------------------------------------------------------------------- + + +#include "TwPrecomp.h" + +#include +#include "TwMgr.h" +#include "TwBar.h" +#include "TwColors.h" + +using namespace std; + +extern const char *g_ErrNotFound; +const char *g_ErrUnknownAttrib = "Unknown attribute"; +const char *g_ErrNotGroup = "Value is not a group"; +const char *g_ErrNoValue = "Value required"; +const char *g_ErrBadValue = "Bad value"; +const char *g_ErrUnknownType = "Unknown type"; +const char *g_ErrNotEnum = "Must be of type Enum"; + +#undef PERF // comment to print benchs +#define PERF(cmd) + + +PerfTimer g_BarTimer; + +#define ANT_SET_CURSOR(_Name) g_TwMgr->SetCursor(g_TwMgr->m_Cursor##_Name) +#define ANT_SET_ROTO_CURSOR(_Num) g_TwMgr->SetCursor(g_TwMgr->m_RotoCursors[_Num]) + +#if !defined(ANT_WINDOWS) +# define _stricmp strcasecmp +# define _strdup strdup +#endif // defined(ANT_WINDOWS) + +#if !defined(M_PI) +# define M_PI 3.1415926535897932384626433832795 +#endif // !defined(M_PI) + +const float FLOAT_MAX = 3.0e+38f; +const double DOUBLE_MAX = 1.0e+308; +const double DOUBLE_EPS = 1.0e-307; + + +// --------------------------------------------------------------------------- + +CTwVarAtom::CTwVarAtom() +{ + m_Type = TW_TYPE_UNDEF; + m_Ptr = NULL; + m_SetCallback = NULL; + m_GetCallback = NULL; + m_ButtonCallback = NULL; + m_ClientData = NULL; + m_ReadOnly = false; + m_NoSlider = false; + m_KeyIncr[0] = 0; + m_KeyIncr[1] = 0; + m_KeyDecr[0] = 0; + m_KeyDecr[1] = 0; + memset(&m_Val, 0, sizeof(UVal)); +} + +CTwVarAtom::~CTwVarAtom() +{ + if( m_Type==TW_TYPE_BOOL8 || m_Type==TW_TYPE_BOOL16 || m_Type==TW_TYPE_BOOL32 || m_Type==TW_TYPE_BOOLCPP ) + { + if( m_Val.m_Bool.m_FreeTrueString && m_Val.m_Bool.m_TrueString!=NULL ) + { + free(m_Val.m_Bool.m_TrueString); + m_Val.m_Bool.m_TrueString = NULL; + } + if( m_Val.m_Bool.m_FreeFalseString && m_Val.m_Bool.m_FalseString!=NULL ) + { + free(m_Val.m_Bool.m_FalseString); + m_Val.m_Bool.m_FalseString = NULL; + } + } + /* + else if( m_Type==TW_TYPE_ENUM8 || m_Type==TW_TYPE_ENUM16 || m_Type==TW_TYPE_ENUM32 ) + { + if( m_Val.m_Enum.m_Entries!=NULL ) + { + delete m_Val.m_Enum.m_Entries; + m_Val.m_Enum.m_Entries = NULL; + } + } + */ +} + +// --------------------------------------------------------------------------- + +void CTwVarAtom::ValueToString(std::string *_Str) const +{ + assert(_Str!=NULL); + static const char *ErrStr = "unreachable"; + char Tmp[1024]; + if( m_Type==TW_TYPE_UNDEF || m_Type==TW_TYPE_HELP_ATOM || m_Type==TW_TYPE_HELP_GRP || m_Type==TW_TYPE_BUTTON ) // has no value + { + *_Str = ""; + return; + } + else if( m_Type==TW_TYPE_HELP_HEADER ) + { + *_Str = "KEY+ KEY-"; + return; + } + else if( m_Type==TW_TYPE_SHORTCUT ) // special case for help bar: display shortcut + { + *_Str = ""; + if( m_ReadOnly && m_Val.m_Shortcut.m_Incr[0]==0 && m_Val.m_Shortcut.m_Decr[0]==0 ) + (*_Str) = "(read only)"; + else + { + if( m_Val.m_Shortcut.m_Incr[0]>0 ) + TwGetKeyString(_Str, m_Val.m_Shortcut.m_Incr[0], m_Val.m_Shortcut.m_Incr[1]); + else + (*_Str) += "(none)"; + if( m_Val.m_Shortcut.m_Decr[0]>0 ) + { + (*_Str) += " "; + TwGetKeyString(_Str, m_Val.m_Shortcut.m_Decr[0], m_Val.m_Shortcut.m_Decr[1]); + } + } + return; + } + else if( m_Type==TW_TYPE_HELP_STRUCT ) + { + int idx = m_Val.m_HelpStruct.m_StructType - TW_TYPE_STRUCT_BASE; + if( idx>=0 && idx<(int)g_TwMgr->m_Structs.size() ) + { + if( g_TwMgr->m_Structs[idx].m_Name.length()>0 ) + (*_Str) = '{' + g_TwMgr->m_Structs[idx].m_Name + '}'; + else + (*_Str) = "{struct}"; + } + return; + } + if( m_Ptr==NULL && m_GetCallback==NULL ) + { + *_Str = ErrStr; + return; + } + bool UseGet = (m_GetCallback!=NULL); + switch( m_Type ) + { + case TW_TYPE_BOOLCPP: + { + bool Val = 0; + if( UseGet ) + m_GetCallback(&Val, m_ClientData); + else + Val = *(bool *)m_Ptr; + if( Val ) + *_Str = (m_Val.m_Bool.m_TrueString!=NULL) ? m_Val.m_Bool.m_TrueString : "ON"; + else + *_Str = (m_Val.m_Bool.m_FalseString!=NULL) ? m_Val.m_Bool.m_FalseString : "OFF"; + } + break; + case TW_TYPE_BOOL8: + { + char Val = 0; + if( UseGet ) + m_GetCallback(&Val, m_ClientData); + else + Val = *(char *)m_Ptr; + if( Val ) + *_Str = (m_Val.m_Bool.m_TrueString!=NULL) ? m_Val.m_Bool.m_TrueString : "ON"; + else + *_Str = (m_Val.m_Bool.m_FalseString!=NULL) ? m_Val.m_Bool.m_FalseString : "OFF"; + } + break; + case TW_TYPE_BOOL16: + { + short Val = 0; + if( UseGet ) + m_GetCallback(&Val, m_ClientData); + else + Val = *(short *)m_Ptr; + if( Val ) + *_Str = (m_Val.m_Bool.m_TrueString!=NULL) ? m_Val.m_Bool.m_TrueString : "ON"; + else + *_Str = (m_Val.m_Bool.m_FalseString!=NULL) ? m_Val.m_Bool.m_FalseString : "OFF"; + } + break; + case TW_TYPE_BOOL32: + { + int Val = 0; + if( UseGet ) + m_GetCallback(&Val, m_ClientData); + else + Val = *(int *)m_Ptr; + if( Val ) + *_Str = (m_Val.m_Bool.m_TrueString!=NULL) ? m_Val.m_Bool.m_TrueString : "ON"; + else + *_Str = (m_Val.m_Bool.m_FalseString!=NULL) ? m_Val.m_Bool.m_FalseString : "OFF"; + } + break; + case TW_TYPE_CHAR: + { + unsigned char Val = 0; + if( UseGet ) + m_GetCallback(&Val, m_ClientData); + else + Val = *(unsigned char *)m_Ptr; + if( Val!=0 ) + { + int d = Val; + if( m_Val.m_Char.m_Hexa ) + sprintf(Tmp, "%c (0x%.2X)", Val, d); + else + sprintf(Tmp, "%c (%d)", Val, d); + *_Str = Tmp; + } + else + *_Str = " (0)"; + } + break; + case TW_TYPE_INT8: + { + signed char Val = 0; + if( UseGet ) + m_GetCallback(&Val, m_ClientData); + else + Val = *(signed char *)m_Ptr; + int d = Val; + if( m_Val.m_Int8.m_Hexa ) + sprintf(Tmp, "0x%.2X", d&0xff); + else + sprintf(Tmp, "%d", d); + *_Str = Tmp; + } + break; + case TW_TYPE_UINT8: + { + unsigned char Val = 0; + if( UseGet ) + m_GetCallback(&Val, m_ClientData); + else + Val = *(unsigned char *)m_Ptr; + unsigned int d = Val; + if( m_Val.m_UInt8.m_Hexa ) + sprintf(Tmp, "0x%.2X", d); + else + sprintf(Tmp, "%u", d); + *_Str = Tmp; + } + break; + case TW_TYPE_INT16: + { + short Val = 0; + if( UseGet ) + m_GetCallback(&Val, m_ClientData); + else + Val = *(short *)m_Ptr; + int d = Val; + if( m_Val.m_Int16.m_Hexa ) + sprintf(Tmp, "0x%.4X", d&0xffff); + else + sprintf(Tmp, "%d", d); + *_Str = Tmp; + } + break; + case TW_TYPE_UINT16: + { + unsigned short Val = 0; + if( UseGet ) + m_GetCallback(&Val, m_ClientData); + else + Val = *(unsigned short *)m_Ptr; + unsigned int d = Val; + if( m_Val.m_UInt16.m_Hexa ) + sprintf(Tmp, "0x%.4X", d); + else + sprintf(Tmp, "%u", d); + *_Str = Tmp; + } + break; + case TW_TYPE_INT32: + { + int Val = 0; + if( UseGet ) + m_GetCallback(&Val, m_ClientData); + else + Val = *(int *)m_Ptr; + if( m_Val.m_Int32.m_Hexa ) + sprintf(Tmp, "0x%.8X", Val); + else + sprintf(Tmp, "%d", Val); + *_Str = Tmp; + } + break; + case TW_TYPE_UINT32: + { + unsigned int Val = 0; + if( UseGet ) + m_GetCallback(&Val, m_ClientData); + else + Val = *(unsigned int *)m_Ptr; + if( m_Val.m_UInt32.m_Hexa ) + sprintf(Tmp, "0x%.8X", Val); + else + sprintf(Tmp, "%u", Val); + *_Str = Tmp; + } + break; + case TW_TYPE_FLOAT: + { + float Val = 0; + if( UseGet ) + m_GetCallback(&Val, m_ClientData); + else + Val = *(float *)m_Ptr; + if( m_Val.m_Float32.m_Precision<0 ) + sprintf(Tmp, "%g", Val); + else + { + char Fmt[32]; + sprintf(Fmt, "%%.%df", (int)m_Val.m_Float32.m_Precision); + sprintf(Tmp, Fmt, Val); + } + *_Str = Tmp; + } + break; + case TW_TYPE_DOUBLE: + { + double Val = 0; + if( UseGet ) + m_GetCallback(&Val, m_ClientData); + else + Val = *(double *)m_Ptr; + if( m_Val.m_Float64.m_Precision<0 ) + sprintf(Tmp, "%lg", Val); + else + { + char Fmt[128]; + sprintf(Fmt, "%%.%dlf", (int)m_Val.m_Float64.m_Precision); + sprintf(Tmp, Fmt, Val); + } + *_Str = Tmp; + } + break; + /* + case TW_TYPE_ENUM8: + case TW_TYPE_ENUM16: + case TW_TYPE_ENUM32: + { + unsigned int d = 0; + if( m_Type==TW_TYPE_ENUM8 ) + { + unsigned char Val = 0; + if( UseGet ) + m_GetCallback(&Val, m_ClientData); + else + Val = *(unsigned char *)m_Ptr; + d = Val; + } + else if( m_Type==TW_TYPE_ENUM16 ) + { + unsigned short Val = 0; + if( UseGet ) + m_GetCallback(&Val, m_ClientData); + else + Val = *(unsigned short *)m_Ptr; + d = Val; + } + else + { + assert(m_Type==TW_TYPE_ENUM32); + unsigned int Val = 0; + if( UseGet ) + m_GetCallback(&Val, m_ClientData); + else + Val = *(unsigned int *)m_Ptr; + d = Val; + } + bool Found = false; + if( m_Val.m_Enum.m_Entries!=NULL ) + { + UVal::CEnumVal::CEntries::iterator It = m_Val.m_Enum.m_Entries->find(d); + if( It!=m_Val.m_Enum.m_Entries->end() ) + { + *_Str = It->second; + Found = true; + } + } + if( !Found ) + { + sprintf(Tmp, "%u", d); + *_Str = Tmp; + } + } + break; + */ + default: + if( m_Type>=TW_TYPE_ENUM_BASE && m_Typem_Enums.size() ) + { + unsigned int Val = 0; + if( UseGet ) + m_GetCallback(&Val, m_ClientData); + else + Val = *(unsigned int *)m_Ptr; + + CTwMgr::CEnum& e = g_TwMgr->m_Enums[m_Type-TW_TYPE_ENUM_BASE]; + CTwMgr::CEnum::CEntries::iterator It = e.m_Entries.find(Val); + if( It!=e.m_Entries.end() ) + *_Str = It->second; + else + { + sprintf(Tmp, "%u", Val); + *_Str = Tmp; + } + } + else + *_Str = "unknown type"; + } +} + +// --------------------------------------------------------------------------- + +double CTwVarAtom::ValueToDouble() const +{ + if( m_Ptr==NULL && m_GetCallback==NULL ) + return 0; // unreachable + bool UseGet = (m_GetCallback!=NULL); + switch( m_Type ) + { + case TW_TYPE_BOOLCPP: + { + bool Val = 0; + if( UseGet ) + m_GetCallback(&Val, m_ClientData); + else + Val = *(bool *)m_Ptr; + if( Val ) + return 1; + else + return 0; + } + break; + case TW_TYPE_BOOL8: + { + char Val = 0; + if( UseGet ) + m_GetCallback(&Val, m_ClientData); + else + Val = *(char *)m_Ptr; + if( Val ) + return 1; + else + return 0; + } + break; + case TW_TYPE_BOOL16: + { + short Val = 0; + if( UseGet ) + m_GetCallback(&Val, m_ClientData); + else + Val = *(short *)m_Ptr; + if( Val ) + return 1; + else + return 0; + } + break; + case TW_TYPE_BOOL32: + { + int Val = 0; + if( UseGet ) + m_GetCallback(&Val, m_ClientData); + else + Val = *(int *)m_Ptr; + if( Val ) + return 1; + else + return 0; + } + break; + case TW_TYPE_CHAR: + { + unsigned char Val = 0; + if( UseGet ) + m_GetCallback(&Val, m_ClientData); + else + Val = *(unsigned char *)m_Ptr; + return Val; + } + break; + case TW_TYPE_INT8: + { + signed char Val = 0; + if( UseGet ) + m_GetCallback(&Val, m_ClientData); + else + Val = *(signed char *)m_Ptr; + int d = Val; + return d; + } + break; + case TW_TYPE_UINT8: + { + unsigned char Val = 0; + if( UseGet ) + m_GetCallback(&Val, m_ClientData); + else + Val = *(unsigned char *)m_Ptr; + unsigned int d = Val; + return d; + } + break; + case TW_TYPE_INT16: + { + short Val = 0; + if( UseGet ) + m_GetCallback(&Val, m_ClientData); + else + Val = *(short *)m_Ptr; + int d = Val; + return d; + } + break; + case TW_TYPE_UINT16: + { + unsigned short Val = 0; + if( UseGet ) + m_GetCallback(&Val, m_ClientData); + else + Val = *(unsigned short *)m_Ptr; + unsigned int d = Val; + return d; + } + break; + case TW_TYPE_INT32: + { + int Val = 0; + if( UseGet ) + m_GetCallback(&Val, m_ClientData); + else + Val = *(int *)m_Ptr; + return Val; + } + break; + case TW_TYPE_UINT32: + { + unsigned int Val = 0; + if( UseGet ) + m_GetCallback(&Val, m_ClientData); + else + Val = *(unsigned int *)m_Ptr; + return Val; + } + break; + case TW_TYPE_FLOAT: + { + float Val = 0; + if( UseGet ) + m_GetCallback(&Val, m_ClientData); + else + Val = *(float *)m_Ptr; + return Val; + } + break; + case TW_TYPE_DOUBLE: + { + double Val = 0; + if( UseGet ) + m_GetCallback(&Val, m_ClientData); + else + Val = *(double *)m_Ptr; + return Val; + } + break; + /* + case TW_TYPE_ENUM8: + case TW_TYPE_ENUM16: + case TW_TYPE_ENUM32: + { + unsigned int d = 0; + if( m_Type==TW_TYPE_ENUM8 ) + { + unsigned char Val = 0; + if( UseGet ) + m_GetCallback(&Val, m_ClientData); + else + Val = *(unsigned char *)m_Ptr; + d = Val; + } + else if( m_Type==TW_TYPE_ENUM16 ) + { + unsigned short Val = 0; + if( UseGet ) + m_GetCallback(&Val, m_ClientData); + else + Val = *(unsigned short *)m_Ptr; + d = Val; + } + else + { + assert(m_Type==TW_TYPE_ENUM32); + unsigned int Val = 0; + if( UseGet ) + m_GetCallback(&Val, m_ClientData); + else + Val = *(unsigned int *)m_Ptr; + d = Val; + } + return d; + } + break; + */ + default: + if( m_Type>=TW_TYPE_ENUM_BASE && m_Typem_Enums.size() ) + { + unsigned int Val = 0; + if( UseGet ) + m_GetCallback(&Val, m_ClientData); + else + Val = *(unsigned int *)m_Ptr; + return Val; + } + else + return 0; // unknown type + } +} + +// --------------------------------------------------------------------------- + +void CTwVarAtom::ValueFromDouble(double _Val) +{ + if( m_Ptr==NULL && m_SetCallback==NULL ) + return; // unreachable + bool UseSet = (m_SetCallback!=NULL); + switch( m_Type ) + { + case TW_TYPE_BOOLCPP: + { + bool Val = (_Val!=0); + if( UseSet ) + m_SetCallback(&Val, m_ClientData); + else + *(bool*)m_Ptr = Val; + } + break; + case TW_TYPE_BOOL8: + { + char Val = (_Val!=0) ? 1 : 0; + if( UseSet ) + m_SetCallback(&Val, m_ClientData); + else + *(char*)m_Ptr = Val; + } + break; + case TW_TYPE_BOOL16: + { + short Val = (_Val!=0) ? 1 : 0; + if( UseSet ) + m_SetCallback(&Val, m_ClientData); + else + *(short*)m_Ptr = Val; + } + break; + case TW_TYPE_BOOL32: + { + int Val = (_Val!=0) ? 1 : 0; + if( UseSet ) + m_SetCallback(&Val, m_ClientData); + else + *(int*)m_Ptr = Val; + } + break; + case TW_TYPE_CHAR: + { + unsigned char Val = (unsigned char)_Val; + if( UseSet ) + m_SetCallback(&Val, m_ClientData); + else + *(unsigned char*)m_Ptr = Val; + } + break; + case TW_TYPE_INT8: + { + signed char Val = (signed char)_Val; + if( UseSet ) + m_SetCallback(&Val, m_ClientData); + else + *(signed char*)m_Ptr = Val; + } + break; + case TW_TYPE_UINT8: + //case TW_TYPE_ENUM8: + { + unsigned char Val = (unsigned char)_Val; + if( UseSet ) + m_SetCallback(&Val, m_ClientData); + else + *(unsigned char*)m_Ptr = Val; + } + break; + case TW_TYPE_INT16: + { + short Val = (short)_Val; + if( UseSet ) + m_SetCallback(&Val, m_ClientData); + else + *(short*)m_Ptr = Val; + } + break; + case TW_TYPE_UINT16: + //case TW_TYPE_ENUM16: + { + unsigned short Val = (unsigned short)_Val; + if( UseSet ) + m_SetCallback(&Val, m_ClientData); + else + *(unsigned short*)m_Ptr = Val; + } + break; + case TW_TYPE_INT32: + { + int Val = (int)_Val; + if( UseSet ) + m_SetCallback(&Val, m_ClientData); + else + *(int*)m_Ptr = Val; + } + break; + case TW_TYPE_UINT32: + //case TW_TYPE_ENUM32: + { + unsigned int Val = (unsigned int)_Val; + if( UseSet ) + m_SetCallback(&Val, m_ClientData); + else + *(unsigned int*)m_Ptr = Val; + } + break; + case TW_TYPE_FLOAT: + { + float Val = (float)_Val; + if( UseSet ) + m_SetCallback(&Val, m_ClientData); + else + *(float*)m_Ptr = Val; + } + break; + case TW_TYPE_DOUBLE: + { + double Val = (double)_Val; + if( UseSet ) + m_SetCallback(&Val, m_ClientData); + else + *(double*)m_Ptr = Val; + } + break; + default: + if( m_Type>=TW_TYPE_ENUM_BASE && m_Typem_Enums.size() ) + { + unsigned int Val = (unsigned int)_Val; + if( UseSet ) + m_SetCallback(&Val, m_ClientData); + else + *(unsigned int*)m_Ptr = Val; + } + } +} + +// --------------------------------------------------------------------------- + +void CTwVarAtom::MinMaxStepToDouble(double *_Min, double *_Max, double *_Step) const +{ + double max = DOUBLE_MAX; + double min = -DOUBLE_MAX; + double step = 1; + + switch( m_Type ) + { + case TW_TYPE_BOOLCPP: + case TW_TYPE_BOOL8: + case TW_TYPE_BOOL16: + case TW_TYPE_BOOL32: + min = 0; + max = 1; + step = 1; + break; + case TW_TYPE_CHAR: + min = (double)m_Val.m_Char.m_Min; + max = (double)m_Val.m_Char.m_Max; + step = (double)m_Val.m_Char.m_Step; + break; + case TW_TYPE_INT8: + min = (double)m_Val.m_Int8.m_Min; + max = (double)m_Val.m_Int8.m_Max; + step = (double)m_Val.m_Int8.m_Step; + break; + case TW_TYPE_UINT8: + min = (double)m_Val.m_UInt8.m_Min; + max = (double)m_Val.m_UInt8.m_Max; + step = (double)m_Val.m_UInt8.m_Step; + break; + case TW_TYPE_INT16: + min = (double)m_Val.m_Int16.m_Min; + max = (double)m_Val.m_Int16.m_Max; + step = (double)m_Val.m_Int16.m_Step; + break; + case TW_TYPE_UINT16: + min = (double)m_Val.m_UInt16.m_Min; + max = (double)m_Val.m_UInt16.m_Max; + step = (double)m_Val.m_UInt16.m_Step; + break; + case TW_TYPE_INT32: + min = (double)m_Val.m_Int32.m_Min; + max = (double)m_Val.m_Int32.m_Max; + step = (double)m_Val.m_Int32.m_Step; + break; + case TW_TYPE_UINT32: + min = (double)m_Val.m_UInt32.m_Min; + max = (double)m_Val.m_UInt32.m_Max; + step = (double)m_Val.m_UInt32.m_Step; + break; + case TW_TYPE_FLOAT: + min = (double)m_Val.m_Float32.m_Min; + max = (double)m_Val.m_Float32.m_Max; + step = (double)m_Val.m_Float32.m_Step; + break; + case TW_TYPE_DOUBLE: + min = m_Val.m_Float64.m_Min; + max = m_Val.m_Float64.m_Max; + step = m_Val.m_Float64.m_Step; + break; + default: + {} // nothing + } + + if( _Min!=NULL ) + *_Min = min; + if( _Max!=NULL ) + *_Max = max; + if( _Step!=NULL ) + *_Step = step; +} + +// --------------------------------------------------------------------------- + +const CTwVar *CTwVarAtom::Find(const char *_Name, CTwVarGroup **_Parent, int *_Index) const +{ + if( strcmp(_Name, m_Name.c_str())==0 ) + { + if( _Parent!=NULL ) + *_Parent = NULL; + if( _Index!=NULL ) + *_Index = -1; + return this; + } + else + return NULL; +} + +// --------------------------------------------------------------------------- + +enum EVarAttribs +{ + V_LABEL = 1, + V_HELP, + V_GROUP, + V_SHOW, + V_HIDE, + V_READONLY, + V_READWRITE, + V_ENDTAG +}; + +int CTwVar::HasAttrib(const char *_Attrib, bool *_HasValue) const +{ + *_HasValue = true; + if( _stricmp(_Attrib, "label")==0 ) + return V_LABEL; + else if( _stricmp(_Attrib, "help")==0 ) + return V_HELP; + else if( _stricmp(_Attrib, "group")==0 ) + return V_GROUP; + + *_HasValue = false; + if( _stricmp(_Attrib, "show")==0 ) + return V_SHOW; + else if( _stricmp(_Attrib, "hide")==0 ) + return V_HIDE; + if( _stricmp(_Attrib, "readonly")==0 ) + return V_READONLY; + else if( _stricmp(_Attrib, "readwrite")==0 ) + return V_READWRITE; + + return 0; // not found +} + +int CTwVar::SetAttrib(int _AttribID, const char *_Value, TwBar *_Bar, struct CTwVarGroup *_VarParent, int _VarIndex) +{ + switch( _AttribID ) + { + /* + case V_LABEL: + if( _Value && strlen(_Value)>0 ) + { + m_Label = _Value; + _Bar->NotUpToDate(); + return 1; + } + else + { + g_TwMgr->SetLastError(g_ErrNoValue); + return 0; + } + */ + case V_LABEL: + case V_HELP: + if( _Value && strlen(_Value)>0 ) + { + /* + if( IsGroup() && static_cast(this)->m_StructValuePtr!=NULL ) + { + int Idx = static_cast(this)->m_StructType-TW_TYPE_STRUCT_BASE; + if( Idx>=0 && Idx<(int)g_TwMgr->m_Structs.size() ) + if( _AttribID==V_LABEL ) + g_TwMgr->m_Structs[Idx].m_Label = _Value; + else // V_HELP + g_TwMgr->m_Structs[Idx].m_Help = _Value; + } + else + */ + { + CTwVarGroup *Parent = NULL; + CTwVar *ThisVar = _Bar->Find(m_Name.c_str(), &Parent); + if( this==ThisVar && Parent!=NULL && Parent->m_StructValuePtr!=NULL ) + { + int Idx = Parent->m_StructType-TW_TYPE_STRUCT_BASE; + if( Idx>=0 && Idx<(int)g_TwMgr->m_Structs.size() ) + { + size_t nl = m_Name.length(); + for( size_t im=0; imm_Structs[Idx].m_Members.size(); ++im ) + { + size_t ml = g_TwMgr->m_Structs[Idx].m_Members[im].m_Name.length(); + if( nl>=ml && strcmp(g_TwMgr->m_Structs[Idx].m_Members[im].m_Name.c_str(), m_Name.c_str()+(nl-ml))==0 ) + { + if( _AttribID==V_LABEL ) + g_TwMgr->m_Structs[Idx].m_Members[im].m_Label = _Value; + else // V_HELP + g_TwMgr->m_Structs[Idx].m_Members[im].m_Help = _Value; + break; + } + } + } + } + else + { + if( _AttribID==V_LABEL ) + m_Label = _Value; + else // V_HELP + m_Help = _Value; + } + } + _Bar->NotUpToDate(); + return 1; + } + else + { + g_TwMgr->SetLastError(g_ErrNoValue); + return 0; + } + case V_GROUP: + { + CTwVarGroup *Grp = NULL; + if( _Value==NULL || strlen(_Value)<=0 ) + Grp = &(_Bar->m_VarRoot); + else + { + CTwVar *v = _Bar->Find(_Value, NULL, NULL); + if( v && !v->IsGroup() ) + { + g_TwMgr->SetLastError(g_ErrNotGroup); + return 0; + } + Grp = static_cast(v); + if( Grp==NULL ) + { + Grp = new CTwVarGroup; + Grp->m_Name = _Value; + Grp->m_Open = true; + Grp->m_SummaryCallback = NULL; + Grp->m_SummaryClientData = NULL; + Grp->m_StructValuePtr = NULL; + if( g_TwMgr->m_HelpBar ) + Grp->m_Color = g_TwMgr->m_HelpBar->m_ColGrpText; + else + Grp->m_Color = COLOR32_WHITE; + _Bar->m_VarRoot.m_Vars.push_back(Grp); + } + } + Grp->m_Vars.push_back(this); + if( _VarParent!=NULL && _VarIndex>=0 ) + { + _VarParent->m_Vars.erase(_VarParent->m_Vars.begin()+_VarIndex); + if( _VarParent!=&(_Bar->m_VarRoot) && _VarParent->m_Vars.size()<=0 ) + TwRemoveVar(_Bar, _VarParent->m_Name.c_str()); + } + _Bar->NotUpToDate(); + return 1; + } + case V_SHOW: + if( !m_Visible ) + { + m_Visible = true; + _Bar->NotUpToDate(); + } + return 1; + case V_HIDE: + if( m_Visible ) + { + m_Visible = false; + _Bar->NotUpToDate(); + } + return 1; + case V_READONLY: + SetReadOnly(true); + _Bar->NotUpToDate(); + return 1; + case V_READWRITE: + SetReadOnly(false); + _Bar->NotUpToDate(); + return 1; + default: + g_TwMgr->SetLastError(g_ErrUnknownAttrib); + return 0; + } +} + +// --------------------------------------------------------------------------- + +enum EVarAtomAttribs +{ + VA_KEY_INCR = V_ENDTAG+1, + VA_KEY_DECR, + VA_MIN, + VA_MAX, + VA_STEP, + VA_PRECISION, + VA_HEXA, + VA_DECIMAL, + VA_TRUE, + VA_FALSE, + VA_VAL, +}; + +int CTwVarAtom::HasAttrib(const char *_Attrib, bool *_HasValue) const +{ + *_HasValue = true; + if( _stricmp(_Attrib, "keyincr")==0 || _stricmp(_Attrib, "key")==0 ) + return VA_KEY_INCR; + else if( _stricmp(_Attrib, "keydecr")==0 ) + return VA_KEY_DECR; + else if( _stricmp(_Attrib, "min")==0 ) + return VA_MIN; + else if( _stricmp(_Attrib, "max")==0 ) + return VA_MAX; + else if( _stricmp(_Attrib, "step")==0 ) + return VA_STEP; + else if( _stricmp(_Attrib, "precision")==0 ) + return VA_PRECISION; + else if( _stricmp(_Attrib, "hexa")==0 ) + { + *_HasValue = false; + return VA_HEXA; + } + else if( _stricmp(_Attrib, "decimal")==0 ) + { + *_HasValue = false; + return VA_DECIMAL; + } + else if( _stricmp(_Attrib, "true")==0 ) + return VA_TRUE; + else if( _stricmp(_Attrib, "false")==0 ) + return VA_FALSE; + else if( _stricmp(_Attrib, "val")==0 ) + return VA_VAL; + + return CTwVar::HasAttrib(_Attrib, _HasValue); +} + +int CTwVarAtom::SetAttrib(int _AttribID, const char *_Value, TwBar *_Bar, struct CTwVarGroup *_VarParent, int _VarIndex) +{ + switch( _AttribID ) + { + case VA_KEY_INCR: + { + int Key = 0; + int Mod = 0; + if( TwGetKeyCode(&Key, &Mod, _Value) ) + { + m_KeyIncr[0] = Key; + m_KeyIncr[1] = Mod; + return 1; + } + else + return 0; + } + case VA_KEY_DECR: + { + int Key = 0; + int Mod = 0; + if( TwGetKeyCode(&Key, &Mod, _Value) ) + { + m_KeyDecr[0] = Key; + m_KeyDecr[1] = Mod; + return 1; + } + else + return 0; + } + case VA_TRUE: + if( (m_Type==TW_TYPE_BOOL8 || m_Type==TW_TYPE_BOOL16 || m_Type==TW_TYPE_BOOL32 || m_Type==TW_TYPE_BOOLCPP) && _Value!=NULL ) + { + if( m_Val.m_Bool.m_FreeTrueString && m_Val.m_Bool.m_TrueString!=NULL ) + free(m_Val.m_Bool.m_TrueString); + m_Val.m_Bool.m_TrueString = _strdup(_Value); + m_Val.m_Bool.m_FreeTrueString = true; + return 1; + } + else + return 0; + case VA_FALSE: + if( (m_Type==TW_TYPE_BOOL8 || m_Type==TW_TYPE_BOOL16 || m_Type==TW_TYPE_BOOL32 || m_Type==TW_TYPE_BOOLCPP) && _Value!=NULL ) + { + if( m_Val.m_Bool.m_FreeFalseString && m_Val.m_Bool.m_FalseString!=NULL ) + free(m_Val.m_Bool.m_FalseString); + m_Val.m_Bool.m_FalseString = _strdup(_Value); + m_Val.m_Bool.m_FreeFalseString = true; + return 1; + } + else + return 0; + case VA_MIN: + case VA_MAX: + case VA_STEP: + if( _Value && strlen(_Value)>0 ) + { + void *Ptr = NULL; + const char *Fmt = NULL; + int d = 0; + unsigned int u = 0; + int Num = (_AttribID==VA_STEP) ? 2 : ((_AttribID==VA_MAX) ? 1 : 0); + switch( m_Type ) + { + case TW_TYPE_CHAR: + //Ptr = (&m_Val.m_Char.m_Min) + Num; + //Fmt = "%c"; + Ptr = &u; + Fmt = "%u"; + break; + case TW_TYPE_INT16: + Ptr = (&m_Val.m_Int16.m_Min) + Num; + Fmt = "%hd"; + break; + case TW_TYPE_INT32: + Ptr = (&m_Val.m_Int32.m_Min) + Num; + Fmt = "%d"; + break; + case TW_TYPE_UINT16: + Ptr = (&m_Val.m_UInt16.m_Min) + Num; + Fmt = "%hu"; + break; + case TW_TYPE_UINT32: + Ptr = (&m_Val.m_UInt32.m_Min) + Num; + Fmt = "%u"; + break; + case TW_TYPE_FLOAT: + Ptr = (&m_Val.m_Float32.m_Min) + Num; + Fmt = "%f"; + break; + case TW_TYPE_DOUBLE: + Ptr = (&m_Val.m_Float64.m_Min) + Num; + Fmt = "%lf"; + break; + case TW_TYPE_INT8: + Ptr = &d; + Fmt = "%d"; + break; + case TW_TYPE_UINT8: + Ptr = &u; + Fmt = "%u"; + break; + default: + g_TwMgr->SetLastError(g_ErrUnknownType); + return 0; + } + + if( Fmt!=NULL && Ptr!=NULL && sscanf(_Value, Fmt, Ptr)==1 ) + { + if( m_Type==TW_TYPE_CHAR ) + *((&m_Val.m_Char.m_Min)+Num) = (unsigned char)(u); + else if( m_Type==TW_TYPE_INT8 ) + *((&m_Val.m_Int8.m_Min)+Num) = (signed char)(d); + else if( m_Type==TW_TYPE_UINT8 ) + *((&m_Val.m_UInt8.m_Min)+Num) = (unsigned char)(u); + + // set precision + if( _AttribID==VA_STEP && ((m_Type==TW_TYPE_FLOAT && m_Val.m_Float32.m_Precision<0) || (m_Type==TW_TYPE_DOUBLE && m_Val.m_Float64.m_Precision<0)) ) + { + double Step = fabs( (m_Type==TW_TYPE_FLOAT) ? m_Val.m_Float32.m_Step : m_Val.m_Float64.m_Step ); + signed char *Precision = (m_Type==TW_TYPE_FLOAT) ? &m_Val.m_Float32.m_Precision : &m_Val.m_Float64.m_Precision; + if( Step>=1 ) + *Precision = 0; + else if( Step>=0.1 ) + *Precision = 1; + else if( Step>=0.01 ) + *Precision = 2; + else if( Step>=0.001 ) + *Precision = 3; + else if( Step>=0.0001 ) + *Precision = 4; + else if( Step>=0.00001 ) + *Precision = 5; + else if( Step>=0.000001 ) + *Precision = 6; + else if( Step>=0.0000001 ) + *Precision = 7; + else if( Step>=0.00000001 ) + *Precision = 8; + else if( Step>=0.000000001 ) + *Precision = 9; + else if( Step>=0.0000000001 ) + *Precision = 10; + else if( Step>=0.00000000001 ) + *Precision = 11; + else if( Step>=0.000000000001 ) + *Precision = 12; + else + *Precision = -1; + } + + return 1; + } + else + { + g_TwMgr->SetLastError(g_ErrBadValue); + return 0; + } + } + else + { + g_TwMgr->SetLastError(g_ErrNoValue); + return 0; + } + case VA_PRECISION: + if( _Value && strlen(_Value)>0 ) + { + int Precision = 0; + if( sscanf(_Value, "%d", &Precision)==1 && Precision>-128 && Precision<128 ) + { + if( m_Type==TW_TYPE_FLOAT ) + m_Val.m_Float32.m_Precision = (signed char)Precision; + else if ( m_Type==TW_TYPE_DOUBLE ) + m_Val.m_Float64.m_Precision = (signed char)Precision; + return 1; + } + else + { + g_TwMgr->SetLastError(g_ErrBadValue); + return 0; + } + } + else + { + g_TwMgr->SetLastError(g_ErrNoValue); + return 0; + } + case VA_HEXA: + case VA_DECIMAL: + { + bool hexa = (_AttribID==VA_HEXA); + switch( m_Type ) + { + case TW_TYPE_CHAR: + m_Val.m_Char.m_Hexa = hexa; + return 1; + case TW_TYPE_INT8: + m_Val.m_Int8.m_Hexa = hexa; + return 1; + case TW_TYPE_INT16: + m_Val.m_Int16.m_Hexa = hexa; + return 1; + case TW_TYPE_INT32: + m_Val.m_Int32.m_Hexa = hexa; + return 1; + case TW_TYPE_UINT8: + m_Val.m_UInt8.m_Hexa = hexa; + return 1; + case TW_TYPE_UINT16: + m_Val.m_UInt16.m_Hexa = hexa; + return 1; + case TW_TYPE_UINT32: + m_Val.m_UInt32.m_Hexa = hexa; + return 1; + default: + return 0; + } + } + case VA_VAL: + if( _Value && strlen(_Value)>0 && m_Type>=TW_TYPE_ENUM_BASE && m_Typem_Enums.size() ) + { + const char *s = _Value; + int n = 0, i = 0; + unsigned int u; + bool Cont; + do + { + Cont = false; + i = 0; + char Sep; + n = sscanf(s, "%u %c%n", &u, &Sep, &i); + if( n==2 && i>0 && ( Sep=='<' || Sep=='{' || Sep=='[' || Sep=='(' ) ) + { + if( Sep=='<' ) // Change to closing separator + Sep = '>'; + else if( Sep=='{' ) + Sep = '}'; + else if( Sep=='[' ) + Sep = ']'; + else if( Sep=='(' ) + Sep = ')'; + s += i; + i = 0; + while( s[i]!=Sep && s[i]!=0 ) + ++i; + if( s[i]==Sep ) + { + //if( m_Val.m_Enum.m_Entries==NULL ) + // m_Val.m_Enum.m_Entries = new UVal::CEnumVal::CEntries; + //UVal::CEnumVal::CEntries::value_type v(u, ""); + CTwMgr::CEnum::CEntries::value_type v(u, ""); + if( i>0 ) + v.second.assign(s, i); + //m_Val.m_Enum.m_Entries->insert(v); + pair ret; + ret = g_TwMgr->m_Enums[m_Type-TW_TYPE_ENUM_BASE].m_Entries.insert(v); + if( !ret.second ) // force overwrite if element already exists + { + g_TwMgr->m_Enums[m_Type-TW_TYPE_ENUM_BASE].m_Entries.erase(ret.first); + g_TwMgr->m_Enums[m_Type-TW_TYPE_ENUM_BASE].m_Entries.insert(v); + } + + s += i+1; + i = 0; + n = sscanf(s, " ,%n", &i); + if( n==0 && i>=1 ) + { + s += i; + Cont = true; + } + } + else + { + g_TwMgr->SetLastError(g_ErrBadValue); + return 0; + } + } + else + { + g_TwMgr->SetLastError(g_ErrBadValue); + return 0; + } + } while( Cont ); + return 1; + } + else + { + g_TwMgr->SetLastError(g_ErrNoValue); + return 0; + } + break; + default: + return CTwVar::SetAttrib(_AttribID, _Value, _Bar, _VarParent, _VarIndex); + } +} + +// --------------------------------------------------------------------------- + +void CTwVarAtom::Increment(int _Step) +{ + if( _Step==0 ) + return; + switch( m_Type ) + { + case TW_TYPE_BOOL8: + { + char v = false; + if( m_Ptr!=NULL ) + v = *((char *)m_Ptr); + else if( m_GetCallback!=NULL ) + m_GetCallback(&v, m_ClientData); + if( v ) + v = false; + else + v = true; + if( m_Ptr!=NULL ) + *((char *)m_Ptr) = v; + else if( m_SetCallback!=NULL ) + m_SetCallback(&v, m_ClientData); + } + break; + case TW_TYPE_BOOL16: + { + short v = false; + if( m_Ptr!=NULL ) + v = *((short *)m_Ptr); + else if( m_GetCallback!=NULL ) + m_GetCallback(&v, m_ClientData); + if( v ) + v = false; + else + v = true; + if( m_Ptr!=NULL ) + *((short *)m_Ptr) = v; + else if( m_SetCallback!=NULL ) + m_SetCallback(&v, m_ClientData); + } + break; + case TW_TYPE_BOOL32: + { + int v = false; + if( m_Ptr!=NULL ) + v = *((int *)m_Ptr); + else if( m_GetCallback!=NULL ) + m_GetCallback(&v, m_ClientData); + if( v ) + v = false; + else + v = true; + if( m_Ptr!=NULL ) + *((int *)m_Ptr) = v; + else if( m_SetCallback!=NULL ) + m_SetCallback(&v, m_ClientData); + } + break; + case TW_TYPE_BOOLCPP: + { + bool v = false; + if( m_Ptr!=NULL ) + v = *((bool *)m_Ptr); + else if( m_GetCallback!=NULL ) + m_GetCallback(&v, m_ClientData); + if( v ) + v = false; + else + v = true; + if( m_Ptr!=NULL ) + *((bool *)m_Ptr) = v; + else if( m_SetCallback!=NULL ) + m_SetCallback(&v, m_ClientData); + } + break; + case TW_TYPE_CHAR: + { + unsigned char v = 0; + if( m_Ptr!=NULL ) + v = *((unsigned char *)m_Ptr); + else if( m_GetCallback!=NULL ) + m_GetCallback(&v, m_ClientData); + int iv = _Step*(int)m_Val.m_Char.m_Step + (int)v; + if( ivm_Val.m_Char.m_Max ) + iv = m_Val.m_Char.m_Max; + if( iv<0 ) + iv = 0; + else if( iv>0xff ) + iv = 0xff; + v = (unsigned char)iv; + if( m_Ptr!=NULL ) + *((unsigned char *)m_Ptr) = v; + else if( m_SetCallback!=NULL ) + m_SetCallback(&v, m_ClientData); + } + break; + case TW_TYPE_INT8: + { + signed char v = 0; + if( m_Ptr!=NULL ) + v = *((signed char *)m_Ptr); + else if( m_GetCallback!=NULL ) + m_GetCallback(&v, m_ClientData); + int iv = _Step*(int)m_Val.m_Int8.m_Step + (int)v; + if( ivm_Val.m_Int8.m_Max ) + iv = m_Val.m_Int8.m_Max; + v = (signed char)iv; + if( m_Ptr!=NULL ) + *((signed char *)m_Ptr) = v; + else if( m_SetCallback!=NULL ) + m_SetCallback(&v, m_ClientData); + } + break; + case TW_TYPE_UINT8: + { + unsigned char v = 0; + if( m_Ptr!=NULL ) + v = *((unsigned char *)m_Ptr); + else if( m_GetCallback!=NULL ) + m_GetCallback(&v, m_ClientData); + int iv = _Step*(int)m_Val.m_UInt8.m_Step + (int)v; + if( ivm_Val.m_UInt8.m_Max ) + iv = m_Val.m_UInt8.m_Max; + if( iv<0 ) + iv = 0; + else if( iv>0xff ) + iv = 0xff; + v = (unsigned char)iv; + if( m_Ptr!=NULL ) + *((unsigned char *)m_Ptr) = v; + else if( m_SetCallback!=NULL ) + m_SetCallback(&v, m_ClientData); + } + break; + case TW_TYPE_INT16: + { + short v = 0; + if( m_Ptr!=NULL ) + v = *((short *)m_Ptr); + else if( m_GetCallback!=NULL ) + m_GetCallback(&v, m_ClientData); + int iv = _Step*(int)m_Val.m_Int16.m_Step + (int)v; + if( ivm_Val.m_Int16.m_Max ) + iv = m_Val.m_Int16.m_Max; + v = (short)iv; + if( m_Ptr!=NULL ) + *((short *)m_Ptr) = v; + else if( m_SetCallback!=NULL ) + m_SetCallback(&v, m_ClientData); + } + break; + case TW_TYPE_UINT16: + { + unsigned short v = 0; + if( m_Ptr!=NULL ) + v = *((unsigned short *)m_Ptr); + else if( m_GetCallback!=NULL ) + m_GetCallback(&v, m_ClientData); + int iv = _Step*(int)m_Val.m_UInt16.m_Step + (int)v; + if( ivm_Val.m_UInt16.m_Max ) + iv = m_Val.m_UInt16.m_Max; + if( iv<0 ) + iv = 0; + else if( iv>0xffff ) + iv = 0xffff; + v = (unsigned short)iv; + if( m_Ptr!=NULL ) + *((unsigned short *)m_Ptr) = v; + else if( m_SetCallback!=NULL ) + m_SetCallback(&v, m_ClientData); + } + break; + case TW_TYPE_INT32: + { + int v = 0; + if( m_Ptr!=NULL ) + v = *((int *)m_Ptr); + else if( m_GetCallback!=NULL ) + m_GetCallback(&v, m_ClientData); + double dv = (double)_Step*(double)m_Val.m_Int32.m_Step + (double)v; + if( dv>(double)0x7fffffff ) + v = 0x7fffffff; + else if( dv<(double)(-0x7fffffff-1) ) + v = -0x7fffffff-1; + else + v = _Step*m_Val.m_Int32.m_Step + v; + if( vm_Val.m_Int32.m_Max ) + v = m_Val.m_Int32.m_Max; + if( m_Ptr!=NULL ) + *((int *)m_Ptr) = v; + else if( m_SetCallback!=NULL ) + m_SetCallback(&v, m_ClientData); + } + break; + case TW_TYPE_UINT32: + { + unsigned int v = 0; + if( m_Ptr!=NULL ) + v = *((unsigned int *)m_Ptr); + else if( m_GetCallback!=NULL ) + m_GetCallback(&v, m_ClientData); + double dv = (double)_Step*(double)m_Val.m_UInt32.m_Step + (double)v; + if( dv>(double)0xffffffff ) + v = 0xffffffff; + else if( dv<0 ) + v = 0; + else + v = _Step*m_Val.m_UInt32.m_Step + v; + if( vm_Val.m_UInt32.m_Max ) + v = m_Val.m_UInt32.m_Max; + if( m_Ptr!=NULL ) + *((unsigned int *)m_Ptr) = v; + else if( m_SetCallback!=NULL ) + m_SetCallback(&v, m_ClientData); + } + break; + case TW_TYPE_FLOAT: + { + float v = 0; + if( m_Ptr!=NULL ) + v = *((float *)m_Ptr); + else if( m_GetCallback!=NULL ) + m_GetCallback(&v, m_ClientData); + v += _Step*m_Val.m_Float32.m_Step; + if( vm_Val.m_Float32.m_Max ) + v = m_Val.m_Float32.m_Max; + if( m_Ptr!=NULL ) + *((float *)m_Ptr) = v; + else if( m_SetCallback!=NULL ) + m_SetCallback(&v, m_ClientData); + } + break; + case TW_TYPE_DOUBLE: + { + double v = 0; + if( m_Ptr!=NULL ) + v = *((double *)m_Ptr); + else if( m_GetCallback!=NULL ) + m_GetCallback(&v, m_ClientData); + v += _Step*m_Val.m_Float64.m_Step; + if( vm_Val.m_Float64.m_Max ) + v = m_Val.m_Float64.m_Max; + if( m_Ptr!=NULL ) + *((double *)m_Ptr) = v; + else if( m_SetCallback!=NULL ) + m_SetCallback(&v, m_ClientData); + } + break; + /* + case TW_TYPE_ENUM8: + { + assert(_Step==1 || _Step==-1); + unsigned char v = 0; + if( m_Ptr!=NULL ) + v = *((unsigned char *)m_Ptr); + else if( m_GetCallback!=NULL ) + m_GetCallback(&v, m_ClientData); + if( m_Val.m_Enum.m_Entries!=NULL ) + { + UVal::CEnumVal::CEntries::iterator It = m_Val.m_Enum.m_Entries->find(v); + if( It==m_Val.m_Enum.m_Entries->end() ) + It = m_Val.m_Enum.m_Entries->begin(); + else if( _Step==1 ) + { + ++It; + if( It==m_Val.m_Enum.m_Entries->end() ) + It = m_Val.m_Enum.m_Entries->begin(); + } + else if( _Step==-1 ) + { + if( It==m_Val.m_Enum.m_Entries->begin() ) + It = m_Val.m_Enum.m_Entries->end(); + if( It!=m_Val.m_Enum.m_Entries->begin() ) + --It; + } + if( It != m_Val.m_Enum.m_Entries->end() ) + { + v = (unsigned char)(It->first); + if( m_Ptr!=NULL ) + *((unsigned char *)m_Ptr) = v; + else if( m_SetCallback!=NULL ) + m_SetCallback(&v, m_ClientData); + } + } + } + break; + case TW_TYPE_ENUM16: + { + assert(_Step==1 || _Step==-1); + unsigned short v = 0; + if( m_Ptr!=NULL ) + v = *((unsigned short *)m_Ptr); + else if( m_GetCallback!=NULL ) + m_GetCallback(&v, m_ClientData); + if( m_Val.m_Enum.m_Entries!=NULL ) + { + UVal::CEnumVal::CEntries::iterator It = m_Val.m_Enum.m_Entries->find(v); + if( It==m_Val.m_Enum.m_Entries->end() ) + It = m_Val.m_Enum.m_Entries->begin(); + else if( _Step==1 ) + { + ++It; + if( It==m_Val.m_Enum.m_Entries->end() ) + It = m_Val.m_Enum.m_Entries->begin(); + } + else if( _Step==-1 ) + { + if( It==m_Val.m_Enum.m_Entries->begin() ) + It = m_Val.m_Enum.m_Entries->end(); + if( It!=m_Val.m_Enum.m_Entries->begin() ) + --It; + } + if( It != m_Val.m_Enum.m_Entries->end() ) + { + v = (unsigned short)(It->first); + if( m_Ptr!=NULL ) + *((unsigned short *)m_Ptr) = v; + else if( m_SetCallback!=NULL ) + m_SetCallback(&v, m_ClientData); + } + } + } + break; + case TW_TYPE_ENUM32: + { + assert(_Step==1 || _Step==-1); + unsigned int v = 0; + if( m_Ptr!=NULL ) + v = *((unsigned int *)m_Ptr); + else if( m_GetCallback!=NULL ) + m_GetCallback(&v, m_ClientData); + if( m_Val.m_Enum.m_Entries!=NULL ) + { + UVal::CEnumVal::CEntries::iterator It = m_Val.m_Enum.m_Entries->find(v); + if( It==m_Val.m_Enum.m_Entries->end() ) + It = m_Val.m_Enum.m_Entries->begin(); + else if( _Step==1 ) + { + ++It; + if( It==m_Val.m_Enum.m_Entries->end() ) + It = m_Val.m_Enum.m_Entries->begin(); + } + else if( _Step==-1 ) + { + if( It==m_Val.m_Enum.m_Entries->begin() ) + It = m_Val.m_Enum.m_Entries->end(); + if( It!=m_Val.m_Enum.m_Entries->begin() ) + --It; + } + if( It!=m_Val.m_Enum.m_Entries->end() ) + { + v = (unsigned int)(It->first); + if( m_Ptr!=NULL ) + *((unsigned int *)m_Ptr) = v; + else if( m_SetCallback!=NULL ) + m_SetCallback(&v, m_ClientData); + } + } + } + break; + */ + default: + if( m_Type==TW_TYPE_BUTTON ) + { + if( m_ButtonCallback!=NULL ) + m_ButtonCallback(m_ClientData); + } + else if( m_Type>=TW_TYPE_ENUM_BASE && m_Typem_Enums.size() ) + { + assert(_Step==1 || _Step==-1); + unsigned int v = 0; + if( m_Ptr!=NULL ) + v = *((unsigned int *)m_Ptr); + else if( m_GetCallback!=NULL ) + m_GetCallback(&v, m_ClientData); + CTwMgr::CEnum& e = g_TwMgr->m_Enums[m_Type-TW_TYPE_ENUM_BASE]; + CTwMgr::CEnum::CEntries::iterator It = e.m_Entries.find(v); + if( It==e.m_Entries.end() ) + It = e.m_Entries.begin(); + else if( _Step==1 ) + { + ++It; + if( It==e.m_Entries.end() ) + It = e.m_Entries.begin(); + } + else if( _Step==-1 ) + { + if( It==e.m_Entries.begin() ) + It = e.m_Entries.end(); + if( It!=e.m_Entries.begin() ) + --It; + } + if( It!=e.m_Entries.end() ) + { + v = (unsigned int)(It->first); + if( m_Ptr!=NULL ) + *((unsigned int *)m_Ptr) = v; + else if( m_SetCallback!=NULL ) + m_SetCallback(&v, m_ClientData); + } + } + else + fprintf(stderr, "CTwVarAtom::Increment : unknown or unimplemented type\n"); + } +} + +// --------------------------------------------------------------------------- + +void CTwVarAtom::SetDefaults() +{ + switch( m_Type ) + { + case TW_TYPE_BOOL8: + case TW_TYPE_BOOL16: + case TW_TYPE_BOOL32: + case TW_TYPE_BOOLCPP: + m_NoSlider = true; + break; + case TW_TYPE_CHAR: + m_Val.m_Char.m_Max = 0xff; + m_Val.m_Char.m_Min = 0; + m_Val.m_Char.m_Step = 1; + m_Val.m_Char.m_Precision = -1; + m_Val.m_Char.m_Hexa = false; + break; + case TW_TYPE_INT8: + m_Val.m_Int8.m_Max = 0x7f; + m_Val.m_Int8.m_Min = -m_Val.m_Int8.m_Max-1; + m_Val.m_Int8.m_Step = 1; + m_Val.m_Int8.m_Precision = -1; + m_Val.m_Int8.m_Hexa = false; + break; + case TW_TYPE_UINT8: + m_Val.m_UInt8.m_Max = 0xff; + m_Val.m_UInt8.m_Min = 0; + m_Val.m_UInt8.m_Step = 1; + m_Val.m_UInt8.m_Precision = -1; + m_Val.m_UInt8.m_Hexa = false; + break; + case TW_TYPE_INT16: + m_Val.m_Int16.m_Max = 0x7fff; + m_Val.m_Int16.m_Min = -m_Val.m_Int16.m_Max-1; + m_Val.m_Int16.m_Step = 1; + m_Val.m_Int16.m_Precision = -1; + m_Val.m_Int16.m_Hexa = false; + break; + case TW_TYPE_UINT16: + m_Val.m_UInt16.m_Max = 0xffff; + m_Val.m_UInt16.m_Min = 0; + m_Val.m_UInt16.m_Step = 1; + m_Val.m_UInt16.m_Precision = -1; + m_Val.m_UInt16.m_Hexa = false; + break; + case TW_TYPE_INT32: + m_Val.m_Int32.m_Max = 0x7fffffff; + m_Val.m_Int32.m_Min = -m_Val.m_Int32.m_Max-1; + m_Val.m_Int32.m_Step = 1; + m_Val.m_Int32.m_Precision = -1; + m_Val.m_Int32.m_Hexa = false; + break; + case TW_TYPE_UINT32: + m_Val.m_UInt32.m_Max = 0xffffffff; + m_Val.m_UInt32.m_Min = 0; + m_Val.m_UInt32.m_Step = 1; + m_Val.m_UInt32.m_Precision = -1; + m_Val.m_UInt32.m_Hexa = false; + break; + case TW_TYPE_FLOAT: + m_Val.m_Float32.m_Max = FLOAT_MAX; + m_Val.m_Float32.m_Min = -FLOAT_MAX; + m_Val.m_Float32.m_Step = 1; + m_Val.m_Float32.m_Precision = -1; + m_Val.m_Float32.m_Hexa = false; + break; + case TW_TYPE_DOUBLE: + m_Val.m_Float64.m_Max = DOUBLE_MAX; + m_Val.m_Float64.m_Min = -DOUBLE_MAX; + m_Val.m_Float64.m_Step = 1; + m_Val.m_Float64.m_Precision = -1; + m_Val.m_Float64.m_Hexa = false; + break; + /* + case TW_TYPE_ENUM8: + case TW_TYPE_ENUM16: + case TW_TYPE_ENUM32: + m_NoSlider = true; + break; + */ + default: + {} // nothing + } + + // special types + if( m_Type==TW_TYPE_BUTTON || (m_Type>=TW_TYPE_ENUM_BASE && m_Typem_Enums.size()) ) + m_NoSlider = true; +} + +// --------------------------------------------------------------------------- + +/* +int CTwVarAtom::DefineEnum(const TwEnumVal *_EnumValues, unsigned int _NbValues) +{ + assert(_EnumValues!=NULL); + if( m_Type!=TW_TYPE_ENUM8 && m_Type!=TW_TYPE_ENUM16 && m_Type!=TW_TYPE_ENUM32 ) + { + g_TwMgr->SetLastError(g_ErrNotEnum); + return 0; + } + if( m_Val.m_Enum.m_Entries==NULL ) + m_Val.m_Enum.m_Entries = new UVal::CEnumVal::CEntries; + for(unsigned int i=0; i<_NbValues; ++i) + { + UVal::CEnumVal::CEntries::value_type Entry(_EnumValues[i].Value, (_EnumValues[i].Label!=NULL)?_EnumValues[i].Label:""); + pair Result = m_Val.m_Enum.m_Entries->insert(Entry); + if( !Result.second ) + (Result.first)->second = Entry.second; + } + return 1; +} +*/ + +// --------------------------------------------------------------------------- + +enum EVarGroupAttribs +{ + VG_OPEN = V_ENDTAG+1, + VG_CLOSE, + VG_TYPEID, // used internally for structs + VG_VALPTR, // used internally for structs + VG_ALPHA, // tw_type_color* only + VG_NOALPHA, // tw_type_color* only + VG_HLS, // tw_type_color* only + VG_RGB, // tw_type_color* only + VG_ORDER, // tw_type_color* only +}; + +int CTwVarGroup::HasAttrib(const char *_Attrib, bool *_HasValue) const +{ + *_HasValue = false; + if( _stricmp(_Attrib, "open")==0 ) + return VG_OPEN; + else if( _stricmp(_Attrib, "close")==0 ) + return VG_CLOSE; + else if( _stricmp(_Attrib, "typeid")==0 ) + { + *_HasValue = true; + return VG_TYPEID; + } + else if( _stricmp(_Attrib, "valptr")==0 ) + { + *_HasValue = true; + return VG_VALPTR; + } + else if( _stricmp(_Attrib, "alpha")==0 ) + return VG_ALPHA; + else if( _stricmp(_Attrib, "noalpha")==0 ) + return VG_NOALPHA; + else if( _stricmp(_Attrib, "hls")==0 ) + return VG_HLS; + else if( _stricmp(_Attrib, "rgb")==0 ) + return VG_RGB; + else if( _stricmp(_Attrib, "order")==0 ) + { + *_HasValue = true; + return VG_ORDER; + } + + return CTwVar::HasAttrib(_Attrib, _HasValue); +} + +int CTwVarGroup::SetAttrib(int _AttribID, const char *_Value, TwBar *_Bar, struct CTwVarGroup *_VarParent, int _VarIndex) +{ + switch( _AttribID ) + { + case VG_OPEN: + if( !m_Open ) + { + m_Open = true; + _Bar->NotUpToDate(); + } + return 1; + case VG_CLOSE: + if( m_Open ) + { + m_Open = false; + _Bar->NotUpToDate(); + } + return 1; + case VG_TYPEID: + { + int type = TW_TYPE_UNDEF; + if( _Value!=NULL && sscanf(_Value, "%d", &type)==1 ) + { + int idx = type - TW_TYPE_STRUCT_BASE; + if( idx>=0 && idx<(int)g_TwMgr->m_Structs.size() ) + { + m_SummaryCallback = g_TwMgr->m_Structs[idx].m_SummaryCallback; + m_SummaryClientData = g_TwMgr->m_Structs[idx].m_SummaryClientData; + m_StructType = (TwType)type; + return 1; + } + } + return 0; + } + case VG_VALPTR: + { + void *structValuePtr = NULL; + if( _Value!=NULL && sscanf(_Value, "%p", &structValuePtr)==1 ) + { + m_StructValuePtr = structValuePtr; + m_Color = _Bar->m_ColStructText; + return 1; + } + return 0; + } + case VG_ALPHA: + if( m_SummaryCallback==CColorExt::SummaryCB && m_StructValuePtr!=NULL ) // is tw_type_color? + if( static_cast(m_StructValuePtr)->m_CanHaveAlpha ) + { + static_cast(m_StructValuePtr)->m_HasAlpha = true; + _Bar->NotUpToDate(); + return 1; + } + return 0; + case VG_NOALPHA: + if( m_SummaryCallback==CColorExt::SummaryCB && m_StructValuePtr!=NULL ) // is tw_type_color? + { + static_cast(m_StructValuePtr)->m_HasAlpha = false; + _Bar->NotUpToDate(); + return 1; + } + else + return 0; + case VG_HLS: + if( m_SummaryCallback==CColorExt::SummaryCB && m_StructValuePtr!=NULL ) // is tw_type_color? + { + static_cast(m_StructValuePtr)->m_HLS = true; + _Bar->NotUpToDate(); + return 1; + } + else + return 0; + case VG_RGB: + if( m_SummaryCallback==CColorExt::SummaryCB && m_StructValuePtr!=NULL ) // is tw_type_color? + { + static_cast(m_StructValuePtr)->m_HLS = false; + _Bar->NotUpToDate(); + return 1; + } + else + return 0; + case VG_ORDER: + if( m_SummaryCallback==CColorExt::SummaryCB && m_StructValuePtr!=NULL ) // is tw_type_color? + { + if( _Value!=NULL ) + { + if( _stricmp(_Value, "ogl")==0 ) + static_cast(m_StructValuePtr)->m_OGL = true; + else if( _stricmp(_Value, "dx")==0 ) + static_cast(m_StructValuePtr)->m_OGL = false; + else + return 0; + return 1; + } + return 0; + } + else + return 0; + default: + return CTwVar::SetAttrib(_AttribID, _Value, _Bar, _VarParent, _VarIndex); + } +} + +// --------------------------------------------------------------------------- + +const CTwVar *CTwVarGroup::Find(const char *_Name, CTwVarGroup **_Parent, int *_Index) const +{ + if( strcmp(_Name, m_Name.c_str())==0 ) + { + if( _Parent!=NULL ) + *_Parent = NULL; + if( _Index!=NULL ) + *_Index = -1; + return this; + } + else + { + const CTwVar *v; + for( size_t i=0; iFind(_Name, _Parent, _Index); + if( v!=NULL ) + { + if( _Parent!=NULL && *_Parent==NULL ) + { + *_Parent = const_cast(this); + if( _Index!=NULL ) + *_Index = (int)i; + } + return v; + } + } + return NULL; + } +} + +// --------------------------------------------------------------------------- + +size_t CTwVar::GetDataSize(TwType _Type) +{ + switch( _Type ) + { + case TW_TYPE_BOOLCPP: + return sizeof(bool); + case TW_TYPE_BOOL8: + case TW_TYPE_CHAR: + case TW_TYPE_INT8: + case TW_TYPE_UINT8: + //case TW_TYPE_ENUM8: + return 1; + case TW_TYPE_BOOL16: + case TW_TYPE_INT16: + case TW_TYPE_UINT16: + //case TW_TYPE_ENUM16: + return 2; + case TW_TYPE_BOOL32: + case TW_TYPE_INT32: + case TW_TYPE_UINT32: + case TW_TYPE_FLOAT: + //case TW_TYPE_ENUM32: + return 4; + case TW_TYPE_DOUBLE: + return 8; + default: + if( g_TwMgr && _Type>=TW_TYPE_STRUCT_BASE && _Typem_Structs.size() ) + { + const CTwMgr::CStruct& s = g_TwMgr->m_Structs[_Type-TW_TYPE_STRUCT_BASE]; + return s.m_Size; + /* + size_t size = 0; + for( size_t i=0; i=TW_TYPE_ENUM_BASE && _Typem_Enums.size() ) + return 4; + else // includes TW_TYPE_BUTTON + return 0; + } +} + +// --------------------------------------------------------------------------- + +CTwBar::CTwBar(const char *_Name) +{ + assert(g_TwMgr!=NULL && g_TwMgr->m_Graph!=NULL); + + m_Name = _Name; + m_Visible = true; + m_VarRoot.m_IsRoot = true; + m_VarRoot.m_Open = true; + m_VarRoot.m_SummaryCallback = NULL; + m_VarRoot.m_SummaryClientData = NULL; + m_VarRoot.m_StructValuePtr = NULL; + + m_UpToDate = false; + int n = (int)g_TwMgr->m_Bars.size(); + m_PosX = 24*n-8; + m_PosY = 24*n-8; + m_Width = 200; + m_Height = 320; + int cr, cg, cb; + ColorHLSToRGBi(g_TwMgr->m_BarInitColorHue%256, 127, 255, &cr, &cg, &cb); + g_TwMgr->m_BarInitColorHue -= 16; + if( g_TwMgr->m_BarInitColorHue<0 ) + g_TwMgr->m_BarInitColorHue += 256; + m_Color = Color32FromARGBi(0xf0, cr, cg, cb); + //m_Color = 0xd7008f8f; + m_Font = g_TwMgr->m_CurrentFont; + //m_Font = g_DefaultNormalFont; + //m_Font = g_DefaultSmallFont; + //m_Font = g_DefaultLargeFont; + m_TitleWidth = 0; + m_Sep = 1; + m_ValuesWidth = 10*(m_Font->m_CharHeight/2); // about 10 characters + m_NbHierLines = 0; + m_NbDisplayedLines = 0; + m_FirstLine = 0; + m_LastUpdateTime = 0; + m_UpdatePeriod = 2; + m_ScrollYW = 0; + m_ScrollYH = 0; + m_ScrollY0 = 0; + m_ScrollY1 = 0; + + m_DrawHandles = false; + m_DrawIncrDecrBtn = false; + m_DrawClickBtn = false; + m_MouseDrag = false; + m_MouseDragVar = false; + m_MouseDragTitle = false; + m_MouseDragScroll = false; + m_MouseDragResizeUR = false; + m_MouseDragResizeUL = false; + m_MouseDragResizeLR = false; + m_MouseDragResizeLL = false; + m_MouseDragValWidth = false; + m_MouseOriginX = 0; + m_MouseOriginY = 0; + m_VarHasBeenIncr = true; + m_FirstLine0 = 0; + m_HighlightedLine = -1; + m_HighlightedLinePrev = -1; + m_HighlightIncrBtn = false; + m_HighlightDecrBtn = false; + m_HighlightClickBtn = false; + m_HighlightTitle = false; + m_HighlightScroll = false; + m_HighlightUpScroll = false; + m_HighlightDnScroll = false; + m_HighlightMinimize = false; + m_HighlightFont = false; + m_HighlightValWidth = false; + + m_IsMinimized = false; + m_MinNumber = 0; + m_MinPosX = 0; + m_MinPosY = 0; + m_HighlightMaximize = false; + m_IsHelpBar = false; + m_IsPopupList = false; + m_VarEnumLinkedToPopupList = NULL; + m_BarLinkedToPopupList = NULL; + + m_TitleTextObj = g_TwMgr->m_Graph->NewTextObj(); + m_LabelsTextObj = g_TwMgr->m_Graph->NewTextObj(); + m_ValuesTextObj = g_TwMgr->m_Graph->NewTextObj(); + m_ShortcutTextObj = g_TwMgr->m_Graph->NewTextObj(); + m_ShortcutLine = -1; + + m_RotoMinRadius = 24; + m_RotoNbSubdiv = 256; // number of steps for one turn + + UpdateColors(); + NotUpToDate(); +} + +// --------------------------------------------------------------------------- + +CTwBar::~CTwBar() +{ + if( m_IsMinimized ) + g_TwMgr->Maximize(this); + if( m_TitleTextObj ) + g_TwMgr->m_Graph->DeleteTextObj(m_TitleTextObj); + if( m_LabelsTextObj ) + g_TwMgr->m_Graph->DeleteTextObj(m_LabelsTextObj); + if( m_ValuesTextObj ) + g_TwMgr->m_Graph->DeleteTextObj(m_ValuesTextObj); + if( m_ShortcutTextObj ) + g_TwMgr->m_Graph->DeleteTextObj(m_ShortcutTextObj); +} + +// --------------------------------------------------------------------------- + +const CTwVar *CTwBar::Find(const char *_Name, CTwVarGroup **_Parent, int *_Index) const +{ + return m_VarRoot.Find(_Name, _Parent, _Index); +} + +CTwVar *CTwBar::Find(const char *_Name, CTwVarGroup **_Parent, int *_Index) +{ + return const_cast(const_cast(this)->Find(_Name, _Parent, _Index)); +} + +// --------------------------------------------------------------------------- + +enum EBarAttribs +{ + BAR_LABEL = 1, + BAR_HELP, + BAR_COLOR, + BAR_SHOW, + BAR_HIDE, + BAR_ICONIFY, + BAR_SIZE, + BAR_POSITION, + BAR_REFRESH, + BAR_FONT_SIZE, + BAR_VALUES_WIDTH, +}; + +int CTwBar::HasAttrib(const char *_Attrib, bool *_HasValue) const +{ + *_HasValue = true; + if( _stricmp(_Attrib, "label")==0 ) + return BAR_LABEL; + else if( _stricmp(_Attrib, "help")==0 ) + return BAR_HELP; + else if( _stricmp(_Attrib, "color")==0 ) + return BAR_COLOR; + else if( _stricmp(_Attrib, "size")==0 ) + return BAR_SIZE; + else if( _stricmp(_Attrib, "position")==0 ) + return BAR_POSITION; + else if( _stricmp(_Attrib, "refresh")==0 ) + return BAR_REFRESH; + else if( _stricmp(_Attrib, "fontsize")==0 ) + return BAR_FONT_SIZE; + else if( _stricmp(_Attrib, "valueswidth")==0 ) + return BAR_VALUES_WIDTH; + + *_HasValue = false; + if( _stricmp(_Attrib, "show")==0 ) + return BAR_SHOW; + else if( _stricmp(_Attrib, "hide")==0 ) + return BAR_HIDE; + else if( _stricmp(_Attrib, "iconify")==0 ) + return BAR_ICONIFY; + + return 0; // not found +} + +int CTwBar::SetAttrib(int _AttribID, const char *_Value) +{ + switch( _AttribID ) + { + case BAR_LABEL: + if( _Value && strlen(_Value)>0 ) + { + m_Label = _Value; + NotUpToDate(); + return 1; + } + else + { + g_TwMgr->SetLastError(g_ErrNoValue); + return 0; + } + case BAR_HELP: + if( _Value && strlen(_Value)>0 ) + { + m_Help = _Value; + NotUpToDate(); + return 1; + } + else + { + g_TwMgr->SetLastError(g_ErrNoValue); + return 0; + } + case BAR_COLOR: + if( _Value && strlen(_Value)>0 ) + { + int v0, v1, v2, v3; + int n = sscanf(_Value, "%d%d%d%d", &v0, &v1, &v2, &v3); + color32 c; + if( n==3 ) + c = Color32FromARGBi(255, v0, v1, v2); + else if( n==4 ) + c = Color32FromARGBi(v0, v1, v2, v3); + else + { + g_TwMgr->SetLastError(g_ErrBadValue); + return 0; + } + m_Color = c; + NotUpToDate(); + return 1; + } + else + { + g_TwMgr->SetLastError(g_ErrNoValue); + return 0; + } + case BAR_SIZE: + if( _Value && strlen(_Value)>0 ) + { + int sx, sy; + int n = sscanf(_Value, "%d%d", &sx, &sy); + if( n==2 && sx>0 && sy>0 ) + { + m_Width = sx; + m_Height = sy; + NotUpToDate(); + return 1; + } + else + { + g_TwMgr->SetLastError(g_ErrBadValue); + return 0; + } + } + else + { + g_TwMgr->SetLastError(g_ErrNoValue); + return 0; + } + case BAR_POSITION: + if( _Value && strlen(_Value)>0 ) + { + int x, y; + int n = sscanf(_Value, "%d%d", &x, &y); + if( n==2 && x>=0 && y>=0 ) + { + m_PosX = x; + m_PosY = y; + NotUpToDate(); + return 1; + } + else + { + g_TwMgr->SetLastError(g_ErrBadValue); + return 0; + } + } + else + { + g_TwMgr->SetLastError(g_ErrNoValue); + return 0; + } + case BAR_REFRESH: + if( _Value && strlen(_Value)>0 ) + { + float r; + int n = sscanf(_Value, "%f", &r); + if( n==1 && r>=0 ) + { + m_UpdatePeriod = r; + return 1; + } + else + { + g_TwMgr->SetLastError(g_ErrBadValue); + return 0; + } + } + else + { + g_TwMgr->SetLastError(g_ErrNoValue); + return 0; + } + case BAR_FONT_SIZE: + if( _Value && strlen(_Value)>0 ) + { + int s; + int n = sscanf(_Value, "%d", &s); + if( n==1 && s>=1 && s<=3 ) + { + if( s==1 ) + g_TwMgr->SetFont(g_DefaultSmallFont, true); + else if( s==2 ) + g_TwMgr->SetFont(g_DefaultNormalFont, true); + else if( s==3 ) + g_TwMgr->SetFont(g_DefaultLargeFont, true); + return 1; + } + else + { + g_TwMgr->SetLastError(g_ErrBadValue); + return 0; + } + } + else + { + g_TwMgr->SetLastError(g_ErrNoValue); + return 0; + } + case BAR_VALUES_WIDTH: + if( _Value && strlen(_Value)>0 ) + { + int w; + int n = sscanf(_Value, "%d", &w); + if( n==1 && w>0 ) + { + m_ValuesWidth = w; + NotUpToDate(); + return 1; + } + else + { + g_TwMgr->SetLastError(g_ErrBadValue); + return 0; + } + } + else + { + g_TwMgr->SetLastError(g_ErrNoValue); + return 0; + } + case BAR_SHOW: + TwSetBarState(this, TW_STATE_SHOWN); + return 1; + case BAR_HIDE: + TwSetBarState(this, TW_STATE_HIDDEN); + return 1; + case BAR_ICONIFY: + TwSetBarState(this, TW_STATE_ICONIFIED); + return 1; + default: + g_TwMgr->SetLastError(g_ErrUnknownAttrib); + return 0; + } +} + +// --------------------------------------------------------------------------- + +void CTwBar::NotUpToDate() +{ + m_UpToDate = false; +} + +// --------------------------------------------------------------------------- + +void CTwBar::UpdateColors() +{ + float a, r, g, b, h, l, s; + Color32ToARGBf(m_Color, &a, &r, &g, &b); + ColorRGBToHLSf(r, g, b, &h, &l, &s); + if( s>0.8f ) + s = 0.8f; + + ColorHLSToRGBf(h, 0.78f, s, &r, &g, &b); + m_ColBg = Color32FromARGBf(a, r, g, b); + ColorHLSToRGBf(h, 0.70f, s, &r, &g, &b); + m_ColBg1 = Color32FromARGBf(a, r, g, b); + ColorHLSToRGBf(h, 0.62f, s, &r, &g, &b); + m_ColBg2 = Color32FromARGBf(a, r, g, b); + + ColorHLSToRGBf(h, 0.8f, s, &r, &g, &b); + m_ColHighBg = Color32FromARGBf(a, r, g, b); + //m_ColHighBg = Color32FromARGBf(a, 0.95f, 0.95f, 0.2f); + + m_ColLabelText = COLOR32_BLACK; + m_ColStructText = 0xff005000; + + ColorHLSToRGBf(h, 0.9f, s, &r, &g, &b); + m_ColValBg = Color32FromARGBf(a, r, g, b); + m_ColStructBg = Color32FromARGBf(0.7f*a, r, g, b); + + //m_ColValText = COLOR32_BLACK; + m_ColValText = 0xff000080; + m_ColValTextRO = 0xff505050; + //m_ColValMin = 0xff800000; + //m_ColValMax = 0xff800000; + m_ColValMin = 0xff0000f0; + m_ColValMax = 0xff0000f0; + + ColorHLSToRGBf(h, 0.4f, s, &r, &g, &b); + m_ColTitleBg = Color32FromARGBf(a, r, g, b); + m_ColTitleText = COLOR32_WHITE; + m_ColTitleShadow = COLOR32_BLACK; + ColorHLSToRGBf(h, 0.2f, s, &r, &g, &b); + m_ColTitleHighBg = Color32FromARGBf(a, r, g, b); + + ColorHLSToRGBf(h, 0.8f, s, &r, &g, &b); + m_ColLine = Color32FromARGBf(1, r, g, b); // 0xfff0f0f0; + m_ColLineShadow = COLOR32_BLACK; + m_ColUnderline = 0xff202000; + ColorHLSToRGBf(h, 0.3f, s, &r, &g, &b); + m_ColBtn = Color32FromARGBf(0.6f*a, r, g, b); + ColorHLSToRGBf(h, 0.1f, s, &r, &g, &b); + m_ColHighBtn = Color32FromARGBf(0.6f*a, r, g, b); + + ColorHLSToRGBf(h, 0.4f, s, &r, &g, &b); + m_ColGrpBg = Color32FromARGBf(a, r, g, b); + m_ColGrpText = COLOR32_WHITE; + + ColorHLSToRGBf(h, 0.75f, s, &r, &g, &b); + m_ColHelpBg = Color32FromARGBf(a, r, g, b); + m_ColHelpText = Color32FromARGBf(1, 0, 0.4f, 0); + + ColorHLSToRGBf(h, 0.45f, s, &r, &g, &b); + m_ColHierBg = Color32FromARGBf(0.75f*a, r, g, b); + + m_ColShortcutText = 0xfff0f0f0; + m_ColShortcutBg = Color32FromARGBf(0.5f*a, 0.1f, 0.1f, 0.1f); + m_ColInfoText = Color32FromARGBf(1.0f, 0.7f, 0.7f, 0.7f); + + m_ColRoto = Color32FromARGBf(1, 0.75f, 0.75f, 0.75f); + m_ColRotoVal = Color32FromARGBf(1, 1.0f, 0.2f, 0.2f); + m_ColRotoBound = Color32FromARGBf(1, 0.4f, 0.4f, 0.4f); +} + +// --------------------------------------------------------------------------- + +CTwVarGroup::~CTwVarGroup() +{ + for( vector::iterator it= m_Vars.begin(); it!=m_Vars.end(); ++it ) + if( *it != NULL ) + { + CTwVar *Var = *it; + delete Var; + *it = NULL; + } +} + +// --------------------------------------------------------------------------- + +static inline int IncrBtnWidth(int _CharHeight) +{ + return ((2*_CharHeight)/3+2)&0xfffe; // force even value +} + +// --------------------------------------------------------------------------- + +void CTwBar::BrowseHierarchy(int *_CurrLine, int _CurrLevel, const CTwVar *_Var, int _First, int _Last) +{ + assert(_Var!=NULL); + if( !_Var->m_IsRoot ) + { + if( (*_CurrLine)>=_First && (*_CurrLine)<=_Last ) + { + CHierTag Tag; + Tag.m_Level = _CurrLevel; + Tag.m_Var = const_cast(_Var); + Tag.m_Closing = false; + m_HierTags.push_back(Tag); + } + *_CurrLine += 1; + } + else + { + *_CurrLine = 0; + _CurrLevel = -1; + m_HierTags.resize(0); + } + + if( _Var->IsGroup() ) + { + const CTwVarGroup *Grp = static_cast(_Var); + if( Grp->m_Open ) + for( vector::const_iterator it=Grp->m_Vars.begin(); it!=Grp->m_Vars.end(); ++it ) + if( (*it)->m_Visible ) + BrowseHierarchy(_CurrLine, _CurrLevel+1, *it, _First, _Last); + if( m_HierTags.size()>0 ) + m_HierTags[m_HierTags.size()-1].m_Closing = true; + } +} + +// --------------------------------------------------------------------------- + +void CTwBar::ListLabels(vector& _Labels, vector& _Colors, const CTexFont *_Font, int _AtomWidthMax, int _GroupWidthMax) +{ + const int NbEtc = 2; + string ValStr; + int Len, i, x, Etc; + const unsigned char *Text; + unsigned char ch; + int WidthMax; + + int nh = (int)m_HierTags.size(); + for( int h=0; hm_Label.length(); + if( Len>0 ) + Text = (const unsigned char *)(m_HierTags[h].m_Var->m_Label.c_str()); + else + { + Text = (const unsigned char *)(m_HierTags[h].m_Var->m_Name.c_str()); + Len = (int)m_HierTags[h].m_Var->m_Name.length(); + } + x = 0; + Etc = 0; + _Labels.push_back(""); // add a new text line + _Colors.push_back(m_HierTags[h].m_Var->m_Color); + string& CurrentLabel = _Labels[_Labels.size()-1]; + if( m_HierTags[h].m_Var->IsGroup() && static_cast(m_HierTags[h].m_Var)->m_SummaryCallback==NULL ) + WidthMax = _GroupWidthMax; + else if( !m_HierTags[h].m_Var->IsGroup() && static_cast(m_HierTags[h].m_Var)->m_Type==TW_TYPE_BUTTON ) + WidthMax = _GroupWidthMax - 2*IncrBtnWidth(m_Font->m_CharHeight); + else + WidthMax = _AtomWidthMax; + for( i=0; im_CharWidth[(int)' ']; + } + for( i=0; im_CharWidth[(int)ch]; + if( Etc>0 ) + { + ++Etc; + if( Etc>NbEtc ) + break; + } + else if( im_CharWidth[(int)'.']>=WidthMax && !(m_HierTags[h].m_Var->m_DontClip)) + Etc = 1; + } + } +} + +// --------------------------------------------------------------------------- + +void CTwBar::ListValues(vector& _Values, vector& _Colors, vector& _BgColors, const CTexFont *_Font, int _WidthMax) +{ + CTwFPU fpu; // force fpu precision + + const int NbEtc = 2; + const CTwVarAtom *Atom = NULL; + string ValStr; + int Len, i, x, Etc; + const unsigned char *Text; + unsigned char ch; + bool ReadOnly; + bool IsMax; + bool IsMin; + size_t SummaryMaxLength = max(_WidthMax/_Font->m_CharWidth[(int)'I'], 4); + static vector Summary; + Summary.resize(SummaryMaxLength+32); + + int nh = (int)m_HierTags.size(); + for( int h=0; hIsGroup() || m_IsHelpBar + || (m_HierTags[h].m_Var->IsGroup() && static_cast(m_HierTags[h].m_Var)->m_SummaryCallback!=NULL) ) + { + ReadOnly = true; + IsMax = false; + IsMin = false; + if( !m_HierTags[h].m_Var->IsGroup() ) + { + Atom = static_cast(m_HierTags[h].m_Var); + Atom->ValueToString(&ValStr); + if( !m_IsHelpBar || (Atom->m_Type==TW_TYPE_SHORTCUT && (Atom->m_Val.m_Shortcut.m_Incr[0]>0 || Atom->m_Val.m_Shortcut.m_Decr[0]>0)) ) + ReadOnly = Atom->m_ReadOnly; + if( !Atom->m_NoSlider ) + { + double v, vmin, vmax; + v = Atom->ValueToDouble(); + Atom->MinMaxStepToDouble(&vmin, &vmax, NULL); + IsMax = (v>=vmax); + IsMin = (v<=vmin); + } + } + else if(m_HierTags[h].m_Var->IsGroup() && static_cast(m_HierTags[h].m_Var)->m_SummaryCallback!=NULL) + { + const CTwVarGroup *Grp = static_cast(m_HierTags[h].m_Var); + Summary[0] = '\0'; + if( Grp->m_SummaryCallback==CTwMgr::CStruct::DefaultSummary ) + Grp->m_SummaryCallback(&Summary[0], SummaryMaxLength, Grp, Grp->m_SummaryClientData); + else + Grp->m_SummaryCallback(&Summary[0], SummaryMaxLength, Grp->m_StructValuePtr, Grp->m_SummaryClientData); + ValStr = (const char *)(&Summary[0]); + } + else + ValStr = ""; // is a group in the help bar + Len = (int)ValStr.length(); + Text = (const unsigned char *)(ValStr.c_str()); + x = 0; + Etc = 0; + _Values.push_back(""); // add a new text line + if( ReadOnly || (IsMin && IsMax) ) + _Colors.push_back(m_ColValTextRO); + else if( IsMin ) + _Colors.push_back(m_ColValMin); + else if( IsMax ) + _Colors.push_back(m_ColValMax); + else + _Colors.push_back(m_ColValText); + if( m_HierTags[h].m_Var->IsGroup() ) + { + const CTwVarGroup *Grp = static_cast(m_HierTags[h].m_Var); + // if typecolor set bgcolor + if( Grp->m_SummaryCallback==CColorExt::SummaryCB ) + _BgColors.push_back(0xff000000); + else + _BgColors.push_back(m_ColStructBg); + } + else + _BgColors.push_back(m_ColValBg); + + string& CurrentValue = _Values[_Values.size()-1]; + int wmax = _WidthMax; + if( m_HighlightedLine==h && m_DrawIncrDecrBtn ) + wmax -= 2*IncrBtnWidth(m_Font->m_CharHeight); + for( i=0; im_CharWidth[(int)ch]; + if( Etc>0 ) + { + ++Etc; + if( Etc>NbEtc ) + break; + } + else if( im_CharWidth[(int)'.']>=wmax ) + Etc = 1; + } + } + else + { + _Values.push_back(""); // add a new empty line + _Colors.push_back(COLOR32_BLACK); + _BgColors.push_back(0x00000000); + } +} + +// --------------------------------------------------------------------------- + +static int ClampText(string& _Text, const CTexFont *_Font, int _WidthMax) +{ + int Len = (int)_Text.length(); + unsigned char ch; + int Width = 0; + int i; + for( i=0; im_CharWidth[(int)'.']>=_WidthMax ) + break; + Width += _Font->m_CharWidth[ch]; + } + if( im_CharWidth[(int)'.']; + } + return Width; +} + +// --------------------------------------------------------------------------- + +void CTwBar::Update() +{ + assert(m_UpToDate==false); + assert(m_Font); + ITwGraph *Gr = g_TwMgr->m_Graph; + + bool DoEndDraw = false; + if( !Gr->IsDrawing() ) + { + Gr->BeginDraw(g_TwMgr->m_WndWidth, g_TwMgr->m_WndHeight); + DoEndDraw = true; + } + + int PrevPosY = m_PosY; + int vpx, vpy, vpw, vph; + vpx = 0; + vpy = 0; + vpw = g_TwMgr->m_WndWidth; + vph = g_TwMgr->m_WndHeight; + if( !m_IsMinimized && vpw>0 && vph>0 ) + { + bool Modif = false; + if( m_Width>vpw ) + { + m_Width = vpw; + Modif = true; + } + if( m_Width<8*m_Font->m_CharHeight ) + { + m_Width = 8*m_Font->m_CharHeight; + Modif = true; + } + if( m_Height>vph ) + { + m_Height = vph; + Modif = true; + } + if( m_Height<5*m_Font->m_CharHeight ) + { + m_Height = 5*m_Font->m_CharHeight; + Modif = true; + } + if( m_PosX+m_Width>vpx+vpw ) + m_PosX = vpx+vpw-m_Width; + if( m_PosXvpy+vph ) + m_PosY = vpy+vph-m_Height; + if( m_PosYm_CharHeight ) + { + m_ValuesWidth = 2*m_Font->m_CharHeight; + Modif = true; + } + if( m_ValuesWidth>m_Width-4*m_Font->m_CharHeight ) + { + m_ValuesWidth = m_Width-4*m_Font->m_CharHeight; + Modif = true; + } + if( Modif && m_IsHelpBar ) + { + g_TwMgr->m_HelpBarNotUpToDate = true; + g_TwMgr->m_KeyPressedBuildText = true; + g_TwMgr->m_InfoBuildText = true; + } + } + + UpdateColors(); + + // update geometry relatively to (m_PosX, m_PosY) + if( !m_IsPopupList ) + { + //m_VarX0 = 2*m_Font->m_CharHeight+m_Sep; + m_VarX0 = m_Font->m_CharHeight+m_Sep; + //m_VarX2 = m_Width - 4; + m_VarX2 = m_Width - m_Font->m_CharHeight - m_Sep-2; + m_VarX1 = m_VarX2 - m_ValuesWidth; + } + else + { + //m_VarX0 = m_Font->m_CharHeight+6+m_Sep; + m_VarX0 = 2; + //m_VarX2 = m_Width - 4; + m_VarX2 = m_Width - m_Font->m_CharHeight - m_Sep-2; + m_VarX1 = m_VarX2; + } + if( m_VarX1m_VarX2 ) + m_VarX1 = m_VarX2; + if( !m_IsPopupList ) + { + m_VarY0 = m_Font->m_CharHeight+2+m_Sep+6; + m_VarY1 = m_Height-m_Font->m_CharHeight-2-m_Sep; + m_VarY2 = m_Height-1; + } + else + { + m_VarY0 = 4; + m_VarY1 = m_Height-2-m_Sep; + m_VarY2 = m_Height-1; + } + + int NbLines = (m_VarY1-m_VarY0+1)/(m_Font->m_CharHeight+m_Sep); + if( NbLines<= 0 ) + NbLines = 1; + if( !m_IsMinimized ) + { + int LineNum = 0; + BrowseHierarchy(&LineNum, 0, &m_VarRoot, m_FirstLine, m_FirstLine+NbLines); // add a dummy tag at the end to avoid wrong 'tag-closing' problems + if( (int)m_HierTags.size()>NbLines ) + m_HierTags.resize(NbLines); // remove the last dummy tag + m_NbHierLines = LineNum; + m_NbDisplayedLines = (int)m_HierTags.size(); + } + + // scroll bar + int y0 = m_PosY+m_VarY0; + int y1 = m_PosY+m_VarY1; + int x0 = m_PosX+2; + int x1 = m_PosX+m_Font->m_CharHeight-2; + if( ((x0+x1)&1)==1 ) + x1 += 1; + int w = x1-x0+1; + int h = y1-y0-2*w; + int hscr = (m_NbHierLines>0) ? ((h*m_NbDisplayedLines)/m_NbHierLines) : h; + if( hscr<=4 ) + hscr = 4; + if( hscr>h ) + hscr = h; + int yscr = (m_NbHierLines>0) ? ((h*m_FirstLine)/m_NbHierLines) : 0; + if( yscr<=0 ) + yscr = 0; + if( yscr>h-4 ) + yscr = h-4; + if( yscr+hscr>h ) + hscr = h-yscr; + if( hscr>h ) + hscr = h; + if( hscr<=4 ) + hscr = 4; + m_ScrollYW = w; + m_ScrollYH = h; + m_ScrollY0 = y0+w+yscr; + m_ScrollY1 = y0+w+yscr+hscr; + + // Build title + string Title; + if( m_Label.size()>0 ) + Title = m_Label; + else + Title = m_Name; + m_TitleWidth = ClampText(Title, m_Font, (!m_IsMinimized)?(m_Width-5*m_Font->m_CharHeight):(16*m_Font->m_CharHeight)); + Gr->BuildText(m_TitleTextObj, &Title, NULL, NULL, 1, m_Font, 0, 0); + + if( !m_IsMinimized ) + { + // Build labels + vector Labels; + vector Colors; + ListLabels(Labels, Colors, m_Font, m_VarX1-m_VarX0, m_VarX2-m_VarX0); + Gr->BuildText(m_LabelsTextObj, &(Labels[0]), &(Colors[0]), NULL, (int)Labels.size(), m_Font, 1, 0); + + // Should draw click button? + m_DrawClickBtn = ( m_VarX2-m_VarX1>4*IncrBtnWidth(m_Font->m_CharHeight) + && m_HighlightedLine>=0 && m_HighlightedLine<(int)m_HierTags.size() + && m_HierTags[m_HighlightedLine].m_Var!=NULL + && !m_HierTags[m_HighlightedLine].m_Var->IsGroup() + && !static_cast(m_HierTags[m_HighlightedLine].m_Var)->m_ReadOnly + && ( static_cast(m_HierTags[m_HighlightedLine].m_Var)->m_Type==TW_TYPE_BUTTON )); + // || static_cast(m_HierTags[m_HighlightedLine].m_Var)->m_Type==TW_TYPE_BOOLCPP + // || static_cast(m_HierTags[m_HighlightedLine].m_Var)->m_Type==TW_TYPE_BOOL8 + // || static_cast(m_HierTags[m_HighlightedLine].m_Var)->m_Type==TW_TYPE_BOOL16 + // || static_cast(m_HierTags[m_HighlightedLine].m_Var)->m_Type==TW_TYPE_BOOL32 )); + + // Should draw [-/+] button? + m_DrawIncrDecrBtn = ( m_VarX2-m_VarX1>4*IncrBtnWidth(m_Font->m_CharHeight) + && m_HighlightedLine>=0 && m_HighlightedLine<(int)m_HierTags.size() + && m_HierTags[m_HighlightedLine].m_Var!=NULL + && !m_HierTags[m_HighlightedLine].m_Var->IsGroup() + && static_cast(m_HierTags[m_HighlightedLine].m_Var)->m_Type!=TW_TYPE_BUTTON + && !static_cast(m_HierTags[m_HighlightedLine].m_Var)->m_ReadOnly + && !static_cast(m_HierTags[m_HighlightedLine].m_Var)->m_NoSlider ); + + // Build values + vector& Values = Labels; // reuse + Values.resize(0); + Colors.resize(0); + vector BgColors; + ListValues(Values, Colors, BgColors, m_Font, m_VarX2-m_VarX1); + assert(BgColors.size()==Values.size()); + Gr->BuildText(m_ValuesTextObj, &(Values[0]), &(Colors[0]), &(BgColors[0]), (int)Values.size(), m_Font, 1, m_VarX2-m_VarX1); + + // Build key shortcut text + string Shortcut; + m_ShortcutLine = -1; + if( m_HighlightedLine>=0 && m_HighlightedLine<(int)m_HierTags.size() && m_HierTags[m_HighlightedLine].m_Var!=NULL && !m_HierTags[m_HighlightedLine].m_Var->IsGroup() ) + { + const CTwVarAtom *Atom = static_cast(m_HierTags[m_HighlightedLine].m_Var); + if( Atom->m_KeyIncr[0]>0 || Atom->m_KeyDecr[0]>0 ) + { + if( Atom->m_KeyIncr[0]>0 && Atom->m_KeyDecr[0]>0 ) + Shortcut = "Keys: "; + else + Shortcut = "Key: "; + if( Atom->m_KeyIncr[0]>0 ) + TwGetKeyString(&Shortcut, Atom->m_KeyIncr[0], Atom->m_KeyIncr[1]); + else + Shortcut += "(none)"; + if( Atom->m_KeyDecr[0]>0 ) + { + Shortcut += " "; + TwGetKeyString(&Shortcut, Atom->m_KeyDecr[0], Atom->m_KeyDecr[1]); + } + m_ShortcutLine = m_HighlightedLine; + } + } + ClampText(Shortcut, m_Font, m_Width-3*m_Font->m_CharHeight); + Gr->BuildText(m_ShortcutTextObj, &Shortcut, NULL, NULL, 1, m_Font, 0, 0); + } + + if( DoEndDraw ) + Gr->EndDraw(); + + m_UpToDate = true; + m_LastUpdateTime = float(g_BarTimer.GetTime()); +} + +// --------------------------------------------------------------------------- + +void CTwBar::DrawHierHandle() +{ + assert(m_Font); + ITwGraph *Gr = g_TwMgr->m_Graph; + + //int x0 = m_PosX+m_Font->m_CharHeight+1; + int x0 = m_PosX+2; + int x2 = m_PosX+m_VarX0-5; + if( (x2-x0)&1 ) + --x2; + int x1 = (x0+x2)/2; + int w = x2-x0+1; + int y0 = m_PosY+m_VarY0; + int y1; + int dh0 = (m_Font->m_CharHeight+m_Sep-1-w)/2; + if( dh0<0 ) + dh0 = 0; + int dh1 = dh0+w-1; + int i, h=0; + + if( !m_IsPopupList ) + { + CTwVarGroup *Grp; + int nh = (int)m_HierTags.size(); + for( h=0; hm_CharHeight+m_Sep-1; + if( m_HierTags[h].m_Var->IsGroup() ) + Grp = static_cast(m_HierTags[h].m_Var); + else + Grp = NULL; + + if( Grp ) + { + Gr->DrawLine(x2+1,y0+dh0+1,x2+1,y0+dh1+1, m_ColLineShadow); + Gr->DrawLine(x0+1,y0+dh1+1,x2+2,y0+dh1+1, m_ColLineShadow); + if( Grp->m_Open ) + { + Gr->DrawLine(x1,y0+dh1, x1,y1+1, m_ColLine); + Gr->DrawLine(x1+1,y0+dh1, x1+1,y1+1, m_ColLineShadow); + } + } + + if( m_HierTags[h].m_Level>0 ) + { + if( Grp!=NULL ) + { + Gr->DrawLine(x1,y0, x1,y0+dh0, m_ColLine); + Gr->DrawLine(x1+1,y0, x1+1,y0+dh0, m_ColLineShadow); + } + + if( !m_HierTags[h].m_Closing && Grp==NULL ) + { + Gr->DrawLine(x1,y0, x1,y1+1, m_ColLine); + Gr->DrawLine(x1+1,y0, x1+1,y1+1, m_ColLineShadow); + } + + if( m_HierTags[h].m_Closing && Grp==NULL ) + { + Gr->DrawLine(x1,y0+dh0+w/2, x2+2,y0+dh0+w/2, m_ColLine); + Gr->DrawLine(x1+1,y0+dh0+w/2+1, x2+3,y0+dh0+w/2+1, m_ColLineShadow); + Gr->DrawLine(x1,y0, x1,y0+dh0+w/2, m_ColLine); + Gr->DrawLine(x1+1,y0, x1+1,y0+dh0+w/2, m_ColLineShadow); + if( m_HierTags[h].m_Level!=1 && h+1DrawLine(x1,y0+dh0+w/2+2, x1,y1+1, m_ColLine); + Gr->DrawLine(x1+1,y0+dh0+w/2+3, x1+1,y1+1, m_ColLineShadow); + } + } + } + + if( Grp ) + { + //Gr->DrawRect(x0+1,y0+dh0+1,x2-1,y0+dh1-1, (h==m_HighlightedLine) ? m_ColHighBtn : m_ColBtn); + Gr->DrawRect(x0,y0+dh0,x2,y0+dh1, (h==m_HighlightedLine) ? m_ColHighBtn : m_ColBtn); + if( m_DrawHandles ) + { + Gr->DrawLine(x0,y0+dh0,x2,y0+dh0, m_ColLine); + Gr->DrawLine(x2,y0+dh0,x2,y0+dh1+1, m_ColLine); + Gr->DrawLine(x2,y0+dh1,x0,y0+dh1, m_ColLine); + Gr->DrawLine(x0,y0+dh1,x0,y0+dh0, m_ColLine); + } + + Gr->DrawLine(x0+2,y0+dh0+w/2, x2-1,y0+dh0+w/2, m_ColTitleText); + if( !Grp->m_Open ) + Gr->DrawLine(x1,y0+dh0+2, x1,y0+dh1-1, m_ColTitleText); + + if( m_ColGrpBg!=0 && Grp->m_StructValuePtr==NULL ) + { + color32 cb = (Grp->m_StructType==TW_TYPE_HELP_STRUCT) ? m_ColStructBg : m_ColGrpBg; + //int decal = m_Font->m_CharHeight/2-2+2*m_HierTags[h].m_Level; + //if( decal>m_Font->m_CharHeight-3 ) + // decal = m_Font->m_CharHeight-3; + int margin = m_Font->m_CharWidth[(int)' ']*m_HierTags[h].m_Level; + //Gr->DrawRect(m_PosX+m_VarX0+margin, y0+decal, m_PosX+m_VarX2, y0+m_Font->m_CharHeight-1, cb); + Gr->DrawRect(m_PosX+m_VarX0+margin-1, y0+1, m_PosX+m_VarX2, y0+m_Font->m_CharHeight, cb);// m_ColHierBg); + //Gr->DrawRect(m_PosX+m_VarX0-4, y0+m_Font->m_CharHeight/2-1, m_PosX+m_VarX0+margin-2, y0+m_Font->m_CharHeight/2, m_ColHierBg); + } + } + else if( static_cast(m_HierTags[h].m_Var)->m_Type==TW_TYPE_HELP_GRP && m_ColHelpBg!=0 ) + Gr->DrawRect(m_PosX+m_VarX0+m_HierTags[h].m_Var->m_LeftMargin, y0+m_HierTags[h].m_Var->m_TopMargin, m_PosX+m_VarX2, y0+m_Font->m_CharHeight-1, m_ColHelpBg); + else if( static_cast(m_HierTags[h].m_Var)->m_Type==TW_TYPE_HELP_HEADER && m_ColHelpBg!=0 ) + Gr->DrawRect(m_PosX+m_VarX0+m_HierTags[h].m_Var->m_LeftMargin, y0+m_HierTags[h].m_Var->m_TopMargin, m_PosX+m_VarX2, y0+m_Font->m_CharHeight-1, m_ColHelpBg); + /* + else if( static_cast(m_HierTags[h].m_Var)->m_Type==TW_TYPE_BUTTON && m_ColBtn!=0 ) + { + // draw button + int cbx0 = m_PosX+m_VarX2-2*bw+bw/2, cby0 = y0+2, cbx1 = m_PosX+m_VarX2-2-bw/2, cby1 = y0+m_Font->m_CharHeight-4; + if( m_HighlightClickBtn ) + { + Gr->DrawRect(cbx0+2, cby0+2, cbx1+2, cby1+2, m_ColBtn); + Gr->DrawLine(cbx0+3, cby1+3, cbx1+4, cby1+3, 0x7F000000); + Gr->DrawLine(cbx1+3, cby0+3, cbx1+3, cby1+3, 0x7F000000); + } + else + { + Gr->DrawRect(cbx0+3, cby1+1, cbx1+3, cby1+3, 0x7F000000); + Gr->DrawRect(cbx1+1, cby0+3, cbx1+3, cby1, 0x7F000000); + Gr->DrawRect(cbx0, cby0, cbx1, cby1, m_ColBtn); + } + } + */ + + y0 = y1+1; + } + } + + if( m_NbDisplayedLinesm_CharHeight-2; + x0 = m_PosX + m_VarX2+4; + x1 = x0 + m_Font->m_CharHeight-4; + if( ((x0+x1)&1)==1 ) + x1 += 1; + w = m_ScrollYW; + h = m_ScrollYH; + + Gr->DrawRect(x0+2,y0+w, x1-2,y1-1-w, (m_ColBg&0xffffff)|0x3f000000); + if( m_DrawHandles || m_IsPopupList ) + { + // scroll handle shadow lines + Gr->DrawLine(x1-1,m_ScrollY0+1, x1-1,m_ScrollY1+1, m_ColLineShadow); + Gr->DrawLine(x0+2,m_ScrollY1+1, x1,m_ScrollY1+1, m_ColLineShadow); + + // up & down arrow + for( i=0; i<(x1-x0-2)/2; ++i ) + { + Gr->DrawLine(x0+2+i,y0+w-2*i, x1-i,y0+w-2*i, m_ColLineShadow); + Gr->DrawLine(x0+1+i,y0+w-1-2*i, x1-1-i,y0+w-1-2*i, m_HighlightUpScroll?m_ColBtn:m_ColLine); + + Gr->DrawLine(x0+2+i,y1-w+2+2*i, x1-i,y1-w+2+2*i, m_ColLineShadow); + Gr->DrawLine(x0+1+i,y1-w+1+2*i, x1-1-i,y1-w+1+2*i, m_HighlightDnScroll?m_ColBtn:m_ColLine); + } + + // middle lines + Gr->DrawLine((x0+x1)/2-1,y0+w, (x0+x1)/2-1,m_ScrollY0, m_ColLine); + Gr->DrawLine((x0+x1)/2,y0+w, (x0+x1)/2,m_ScrollY0, m_ColLine); + Gr->DrawLine((x0+x1)/2+1,y0+w, (x0+x1)/2+1,m_ScrollY0, m_ColLineShadow); + Gr->DrawLine((x0+x1)/2-1,m_ScrollY1, (x0+x1)/2-1,y1-w+1, m_ColLine); + Gr->DrawLine((x0+x1)/2,m_ScrollY1, (x0+x1)/2,y1-w+1, m_ColLine); + Gr->DrawLine((x0+x1)/2+1,m_ScrollY1, (x0+x1)/2+1,y1-w+1, m_ColLineShadow); + // scroll handle lines + Gr->DrawRect(x0+2,m_ScrollY0+1, x1-3,m_ScrollY1-1, m_HighlightScroll?m_ColHighBtn:m_ColBtn); + Gr->DrawLine(x1-2,m_ScrollY0, x1-2,m_ScrollY1, m_ColLine); + Gr->DrawLine(x0+1,m_ScrollY0, x0+1,m_ScrollY1, m_ColLine); + Gr->DrawLine(x0+1,m_ScrollY1, x1-1,m_ScrollY1, m_ColLine); + Gr->DrawLine(x0+1,m_ScrollY0, x1-2,m_ScrollY0, m_ColLine); + } + else + Gr->DrawRect(x0+3,m_ScrollY0+1, x1-3,m_ScrollY1-1, (m_ColBtn&0xffffff)|0x3f000000); + } + + if( m_DrawHandles && !m_IsPopupList ) + { + // Draw resize handles + // lower-left + Gr->DrawLine(m_PosX+3, m_PosY+m_Height-m_Font->m_CharHeight+3, m_PosX+3, m_PosY+m_Height-4, m_ColLine); + Gr->DrawLine(m_PosX+4, m_PosY+m_Height-m_Font->m_CharHeight+4, m_PosX+4, m_PosY+m_Height-3, m_ColLineShadow); + Gr->DrawLine(m_PosX+3, m_PosY+m_Height-4, m_PosX+m_Font->m_CharHeight-4, m_PosY+m_Height-4, m_ColLine); + Gr->DrawLine(m_PosX+4, m_PosY+m_Height-3, m_PosX+m_Font->m_CharHeight-3, m_PosY+m_Height-3, m_ColLineShadow); + // lower-right + Gr->DrawLine(m_PosX+m_Width-4, m_PosY+m_Height-m_Font->m_CharHeight+3, m_PosX+m_Width-4, m_PosY+m_Height-4, m_ColLine); + Gr->DrawLine(m_PosX+m_Width-3, m_PosY+m_Height-m_Font->m_CharHeight+4, m_PosX+m_Width-3, m_PosY+m_Height-3, m_ColLineShadow); + Gr->DrawLine(m_PosX+m_Width-4, m_PosY+m_Height-4, m_PosX+m_Width-m_Font->m_CharHeight+3, m_PosY+m_Height-4, m_ColLine); + Gr->DrawLine(m_PosX+m_Width-3, m_PosY+m_Height-3, m_PosX+m_Width-m_Font->m_CharHeight+4, m_PosY+m_Height-3, m_ColLineShadow); + // upper-left + Gr->DrawLine(m_PosX+3, m_PosY+m_Font->m_CharHeight-4, m_PosX+3, m_PosY+3, m_ColLine); + Gr->DrawLine(m_PosX+4, m_PosY+m_Font->m_CharHeight-3, m_PosX+4, m_PosY+4, m_ColLineShadow); + Gr->DrawLine(m_PosX+3, m_PosY+3, m_PosX+m_Font->m_CharHeight-4, m_PosY+3, m_ColLine); + Gr->DrawLine(m_PosX+4, m_PosY+4, m_PosX+m_Font->m_CharHeight-3, m_PosY+4, m_ColLineShadow); + // upper-right + Gr->DrawLine(m_PosX+m_Width-4, m_PosY+3, m_PosX+m_Width-m_Font->m_CharHeight+3, m_PosY+3, m_ColLine); + Gr->DrawLine(m_PosX+m_Width-3, m_PosY+4, m_PosX+m_Width-m_Font->m_CharHeight+4, m_PosY+4, m_ColLineShadow); + Gr->DrawLine(m_PosX+m_Width-4, m_PosY+m_Font->m_CharHeight-4, m_PosX+m_Width-4, m_PosY+3, m_ColLine); + Gr->DrawLine(m_PosX+m_Width-3, m_PosY+m_Font->m_CharHeight-3, m_PosX+m_Width-3, m_PosY+4, m_ColLineShadow); + + // Draw minimize button + int xm = m_PosX+m_Width-2*m_Font->m_CharHeight, wm=m_Font->m_CharHeight-6; + wm = (wm<6) ? 6 : wm; + Gr->DrawRect(xm+1, m_PosY+4, xm+wm-1, m_PosY+3+wm, m_HighlightMinimize?m_ColHighBtn:m_ColBtn); + Gr->DrawLine(xm, m_PosY+3, xm+wm, m_PosY+3, m_ColLine); + Gr->DrawLine(xm+wm, m_PosY+3, xm+wm, m_PosY+3+wm, m_ColLine); + Gr->DrawLine(xm+wm, m_PosY+3+wm, xm, m_PosY+3+wm, m_ColLine); + Gr->DrawLine(xm, m_PosY+3+wm, xm, m_PosY+3, m_ColLine); + Gr->DrawLine(xm+wm+1, m_PosY+4, xm+wm+1, m_PosY+4+wm, m_ColLineShadow); + Gr->DrawLine(xm+wm+1, m_PosY+4+wm, xm, m_PosY+4+wm, m_ColLineShadow); + Gr->DrawLine(xm+wm/3+((wm<9)?1:0), m_PosY+4+wm/3-((wm<9)?0:1), xm+wm/2+1, m_PosY+2+wm, m_ColTitleText, true); + Gr->DrawLine(xm+wm-wm/3+((wm<9)?0:1), m_PosY+4+wm/3-((wm<9)?0:1), xm+wm/2, m_PosY+2+wm, m_ColTitleText, true); + + // Draw font button + xm = m_PosX+m_Font->m_CharHeight+2; + Gr->DrawRect(xm+1, m_PosY+4, xm+wm-1, m_PosY+3+wm, m_HighlightFont?m_ColHighBtn:m_ColBtn); + Gr->DrawLine(xm, m_PosY+3, xm+wm, m_PosY+3, m_ColLine); + Gr->DrawLine(xm+wm, m_PosY+3, xm+wm, m_PosY+3+wm, m_ColLine); + Gr->DrawLine(xm+wm, m_PosY+3+wm, xm, m_PosY+3+wm, m_ColLine); + Gr->DrawLine(xm, m_PosY+3+wm, xm, m_PosY+3, m_ColLine); + Gr->DrawLine(xm+wm+1, m_PosY+4, xm+wm+1, m_PosY+4+wm, m_ColLineShadow); + Gr->DrawLine(xm+wm+1, m_PosY+4+wm, xm, m_PosY+4+wm, m_ColLineShadow); + Gr->DrawLine(xm+wm/2-wm/6, m_PosY+3+wm/3, xm+wm/2+wm/6+1, m_PosY+3+wm/3, m_ColTitleText); + Gr->DrawLine(xm+wm/2-wm/6, m_PosY+3+wm/3, xm+wm/2-wm/6, m_PosY+4+wm-wm/3+(wm>11?1:0), m_ColTitleText); + Gr->DrawLine(xm+wm/2-wm/6, m_PosY+3+wm/2+(wm>11?1:0), xm+wm/2+wm/6, m_PosY+3+wm/2+(wm>11?1:0), m_ColTitleText); + } +} + +// --------------------------------------------------------------------------- + +void CTwBar::Draw() +{ + PERF( PerfTimer Timer; double DT; ) + + assert(m_Font); + ITwGraph *Gr = g_TwMgr->m_Graph; + + if( float(g_BarTimer.GetTime())>m_LastUpdateTime+m_UpdatePeriod ) + NotUpToDate(); + + if( m_HighlightedLine!=m_HighlightedLinePrev ) + { + m_HighlightedLinePrev = m_HighlightedLine; + NotUpToDate(); + } + + if( m_IsHelpBar && g_TwMgr->m_HelpBarNotUpToDate ) + g_TwMgr->UpdateHelpBar(); + + if( !m_UpToDate ) + Update(); + + if( !m_IsMinimized ) + { + int y = m_PosY+1; + + // Draw title + if( !m_IsPopupList ) + { + PERF( Timer.Reset(); ) + Gr->DrawRect(m_PosX, m_PosY, m_PosX+m_Width-1, m_PosY+m_Font->m_CharHeight, (m_HighlightTitle||m_MouseDragTitle) ? m_ColTitleHighBg : m_ColTitleBg); + if( m_ColTitleShadow!=0 ) + Gr->DrawText(m_TitleTextObj, m_PosX+(m_Width-m_TitleWidth)/2+1, m_PosY+1, m_ColTitleShadow, 0); + Gr->DrawText(m_TitleTextObj, m_PosX+(m_Width-m_TitleWidth)/2, m_PosY, m_ColTitleText, 0); + y = m_PosY+m_Font->m_CharHeight+1; + Gr->DrawLine(m_PosX, y, m_PosX+m_Width-1, y, m_ColTitleShadow); + y++; + PERF( DT = Timer.GetTime(); printf("Title=%.4fms ", 1000.0*DT); ) + } + + // Draw background + PERF( Timer.Reset(); ) + //Gr->DrawRect(m_PosX, y, m_PosX+m_Width-1, m_PosY+m_Height-1, m_ColBg); + Gr->DrawRect(m_PosX, y, m_PosX+m_Width-1, m_PosY+m_Height-1, m_ColBg2, m_ColBg1, m_ColBg1, m_ColBg); + Gr->DrawRect(m_PosX, y, m_PosX+m_VarX0-5, m_PosY+m_Height-1, m_ColHierBg); + Gr->DrawRect(m_PosX+m_VarX2+3, y, m_PosX+m_Width-1, m_PosY+m_Height-1, m_ColHierBg); + // Draw highlighted line + if( m_HighlightedLine>=0 && m_HighlightedLine<(int)m_HierTags.size() && m_HierTags[m_HighlightedLine].m_Var!=NULL + && (m_HierTags[m_HighlightedLine].m_Var->IsGroup() || (!static_cast(m_HierTags[m_HighlightedLine].m_Var)->m_ReadOnly && !m_IsHelpBar)) ) + { + int y0 = m_PosY + m_VarY0 + m_HighlightedLine*(m_Font->m_CharHeight+m_Sep); + Gr->DrawRect(m_PosX+m_VarX0, y0, m_PosX+m_VarX2, y0+m_Font->m_CharHeight-1, m_ColHighBg); + int eps = (g_TwMgr->m_GraphAPI==TW_OPENGL) ? 1 : 0; + Gr->DrawLine(m_PosX+m_VarX0, y0+m_Font->m_CharHeight+eps, m_PosX+m_VarX2, y0+m_Font->m_CharHeight+eps, m_ColUnderline); + } + int dshad = 3; // bar shadows + color32 cshad = (((m_Color>>24)/2)<<24) & 0xFF000000; + Gr->DrawRect(m_PosX, m_PosY+m_Height, m_PosX+dshad, m_PosY+m_Height+dshad, 0, cshad, 0, 0); + Gr->DrawRect(m_PosX+dshad+1, m_PosY+m_Height, m_PosX+m_Width-1, m_PosY+m_Height+dshad, cshad, cshad, 0, 0); + Gr->DrawRect(m_PosX+m_Width, m_PosY+m_Height, m_PosX+m_Width+dshad, m_PosY+m_Height+dshad, cshad, 0, 0, 0); + Gr->DrawRect(m_PosX+m_Width, m_PosY, m_PosX+m_Width+dshad, m_PosY+dshad, 0, 0, cshad, 0); + Gr->DrawRect(m_PosX+m_Width, m_PosY+dshad+1, m_PosX+m_Width+dshad, m_PosY+m_Height-1, cshad, 0, cshad, 0); + color32 clight = 0x5FFFFFFF; + Gr->DrawLine(m_PosX, m_PosY, m_PosX, m_PosY+m_Height, clight); + Gr->DrawLine(m_PosX, m_PosY, m_PosX+m_Width, m_PosY, clight); + PERF( DT = Timer.GetTime(); printf("Bg=%.4fms ", 1000.0*DT); ) + + // Draw hierarchy handle + PERF( Timer.Reset(); ) + DrawHierHandle(); + PERF( DT = Timer.GetTime(); printf("Handles=%.4fms ", 1000.0*DT); ) + + // Draw labels + PERF( Timer.Reset(); ) + Gr->DrawText(m_LabelsTextObj, m_PosX+m_VarX0, m_PosY+m_VarY0, 0 /*m_ColLabelText*/, 0); + PERF( DT = Timer.GetTime(); printf("Labels=%.4fms ", 1000.0*DT); ) + + // Draw values + if( !m_IsPopupList ) + { + PERF( Timer.Reset(); ) + Gr->DrawText(m_ValuesTextObj, m_PosX+m_VarX1, m_PosY+m_VarY0, 0 /*m_ColValText*/, 0 /*m_ColValBg*/); + PERF( DT = Timer.GetTime(); printf("Values=%.4fms ", 1000.0*DT); ) + } + + // Draw preview for color values and draw buttons + int h, nh = (int)m_HierTags.size(); + int yh = m_PosY+m_VarY0; + int bw = IncrBtnWidth(m_Font->m_CharHeight); + for( h=0; hIsGroup() ) + { + const CTwVarGroup * Grp = static_cast(m_HierTags[h].m_Var); + if( Grp->m_SummaryCallback==CColorExt::SummaryCB && Grp->m_StructValuePtr!=NULL ) + { + // draw color value + int ydecal = (g_TwMgr->m_GraphAPI==TW_OPENGL) ? 1 : 0; + const int checker = 8; + for( int c=0; cDrawRect(m_PosX+m_VarX1+(c*(m_VarX2-m_VarX1))/checker, yh+1+ydecal+((c%2)*(m_Font->m_CharHeight-2))/2, m_PosX+m_VarX1-1+((c+1)*(m_VarX2-m_VarX1))/checker, yh+ydecal+(((c%2)+1)*(m_Font->m_CharHeight-2))/2, 0xffffffff); + Gr->DrawRect(m_PosX+m_VarX1, yh+1+ydecal, m_PosX+m_VarX2-1, yh+ydecal+m_Font->m_CharHeight-2, 0xbfffffff); + const CColorExt *colExt = static_cast(Grp->m_StructValuePtr); + color32 col = Color32FromARGBi((colExt->m_HasAlpha ? colExt->A : 255), colExt->R, colExt->G, colExt->B); + if( col!=0 ) + Gr->DrawRect(m_PosX+m_VarX1, yh+1+ydecal, m_PosX+m_VarX2-1, yh+ydecal+m_Font->m_CharHeight-2, col); + /* + Gr->DrawLine(m_PosX+m_VarX1-1, yh, m_PosX+m_VarX2+1, yh, 0xff000000); + Gr->DrawLine(m_PosX+m_VarX1-1, yh+m_Font->m_CharHeight, m_PosX+m_VarX2+1, yh+m_Font->m_CharHeight, 0xff000000); + Gr->DrawLine(m_PosX+m_VarX1-1, yh, m_PosX+m_VarX1-1, yh+m_Font->m_CharHeight, 0xff000000); + Gr->DrawLine(m_PosX+m_VarX2, yh, m_PosX+m_VarX2, yh+m_Font->m_CharHeight, 0xff000000); + */ + } + } + else if( static_cast(m_HierTags[h].m_Var)->m_Type==TW_TYPE_BUTTON && !m_IsPopupList ) + { + // draw button + int cbx0 = m_PosX+m_VarX2-2*bw+bw/2, cby0 = yh+2, cbx1 = m_PosX+m_VarX2-2-bw/2, cby1 = yh+m_Font->m_CharHeight-4; + if( !static_cast(m_HierTags[h].m_Var)->m_ReadOnly ) + { + if( m_HighlightClickBtn && h==m_HighlightedLine ) + { + Gr->DrawRect(cbx0+2, cby0+2, cbx1+2, cby1+2, m_ColHighBtn); + Gr->DrawLine(cbx0+3, cby1+3, cbx1+4, cby1+3, 0xAF000000); + Gr->DrawLine(cbx1+3, cby0+3, cbx1+3, cby1+3, 0xAF000000); + } + else + { + Gr->DrawRect(cbx0+3, cby1+1, cbx1+3, cby1+3, (h==m_HighlightedLine)?0xAF000000:0x7F000000); + Gr->DrawRect(cbx1+1, cby0+3, cbx1+3, cby1, (h==m_HighlightedLine)?0xAF000000:0x7F000000); + Gr->DrawRect(cbx0, cby0, cbx1, cby1, (h==m_HighlightedLine)?m_ColHighBtn:m_ColBtn); + } + } + } + yh += m_Font->m_CharHeight+m_Sep; + } + + if( m_DrawHandles && !m_IsPopupList ) + { + // Draw -/+/click buttons + if( (m_DrawIncrDecrBtn || m_DrawClickBtn) && m_HighlightedLine>=0 && m_HighlightedLine<(int)m_HierTags.size() ) + { + int y0 = m_PosY + m_VarY0 + m_HighlightedLine*(m_Font->m_CharHeight+m_Sep); + if( m_DrawIncrDecrBtn ) + { + Gr->DrawRect(m_PosX+m_VarX2-2*bw+1, y0+1, m_PosX+m_VarX2-bw-1, y0+m_Font->m_CharHeight-2, m_HighlightDecrBtn?m_ColHighBtn:m_ColBtn); + Gr->DrawRect(m_PosX+m_VarX2-bw+1, y0+1, m_PosX+m_VarX2-1, y0+m_Font->m_CharHeight-2, m_HighlightIncrBtn?m_ColHighBtn:m_ColBtn); + // [-] + Gr->DrawLine(m_PosX+m_VarX2-2*bw+3, y0+m_Font->m_CharHeight/2, m_PosX+m_VarX2-bw-2, y0+m_Font->m_CharHeight/2, m_ColTitleText); + // [+] + Gr->DrawLine(m_PosX+m_VarX2-bw+3, y0+m_Font->m_CharHeight/2, m_PosX+m_VarX2-2, y0+m_Font->m_CharHeight/2, m_ColTitleText); + Gr->DrawLine(m_PosX+m_VarX2-bw/2, y0+m_Font->m_CharHeight/2-bw/2+2, m_PosX+m_VarX2-bw/2, y0+m_Font->m_CharHeight/2+bw/2-1, m_ColTitleText); + + // [o] rotoslider + //Gr->DrawRect(m_PosX+m_VarX2-3*bw+1, y0+1, m_PosX+m_VarX2-2*bw-1, y0+m_Font->m_CharHeight-2, (!m_HighlightDecrBtn && !m_HighlightIncrBtn)?m_ColHighBtn:m_ColBtn); + //Gr->DrawLine(m_PosX+m_VarX2-3*bw+bw/2-0, y0+m_Font->m_CharHeight/2-1, m_PosX+m_VarX2-3*bw+bw/2+1, y0+m_Font->m_CharHeight/2-1, m_ColTitleText); + //Gr->DrawLine(m_PosX+m_VarX2-3*bw+bw/2-1, y0+m_Font->m_CharHeight/2+0, m_PosX+m_VarX2-3*bw+bw/2+2, y0+m_Font->m_CharHeight/2+0, m_ColTitleText); + //Gr->DrawLine(m_PosX+m_VarX2-3*bw+bw/2-1, y0+m_Font->m_CharHeight/2+1, m_PosX+m_VarX2-3*bw+bw/2+2, y0+m_Font->m_CharHeight/2+1, m_ColTitleText); + //Gr->DrawLine(m_PosX+m_VarX2-3*bw+bw/2-0, y0+m_Font->m_CharHeight/2+2, m_PosX+m_VarX2-3*bw+bw/2+1, y0+m_Font->m_CharHeight/2+2, m_ColTitleText); + } + } + + // Draw value width slider + if( !m_HighlightValWidth ) + { + Gr->DrawRect(m_PosX+m_VarX1-2, m_PosY+m_VarY0-8, m_PosX+m_VarX1-1, m_PosY+m_VarY0-4, m_ColTitleText); + Gr->DrawLine(m_PosX+m_VarX1-1, m_PosY+m_VarY0-3, m_PosX+m_VarX1, m_PosY+m_VarY0-3, m_ColLineShadow); + Gr->DrawLine(m_PosX+m_VarX1, m_PosY+m_VarY0-3, m_PosX+m_VarX1, m_PosY+m_VarY0-8, m_ColLineShadow); + } + else + { + Gr->DrawRect(m_PosX+m_VarX1-2, m_PosY+m_VarY0-8, m_PosX+m_VarX1-1, m_PosY+m_VarY1, m_ColTitleText); + Gr->DrawLine(m_PosX+m_VarX1-1, m_PosY+m_VarY1+1, m_PosX+m_VarX1, m_PosY+m_VarY1+1, m_ColLineShadow); + Gr->DrawLine(m_PosX+m_VarX1, m_PosY+m_VarY1+1, m_PosX+m_VarX1, m_PosY+m_VarY0-8, m_ColLineShadow); + } + } + + // Draw key shortcut text + if( m_HighlightedLine>=0 && m_HighlightedLine==m_ShortcutLine && !m_IsPopupList ) + { + PERF( Timer.Reset(); ) + Gr->DrawRect(m_PosX+m_Font->m_CharHeight-2, m_PosY+m_VarY1+1, m_PosX+m_Width-m_Font->m_CharHeight-2, m_PosY+m_VarY1+1+m_Font->m_CharHeight, m_ColShortcutBg); + Gr->DrawText(m_ShortcutTextObj, m_PosX+m_Font->m_CharHeight, m_PosY+m_VarY1+1, m_ColShortcutText, 0); + PERF( DT = Timer.GetTime(); printf("Shortcut=%.4fms ", 1000.0*DT); ) + } + else if( m_IsHelpBar ) + { + if( g_TwMgr->m_KeyPressedTextObj && g_TwMgr->m_KeyPressedStr.size()>0 ) // Draw key pressed + { + if( g_TwMgr->m_KeyPressedBuildText ) + { + string Str = g_TwMgr->m_KeyPressedStr; + ClampText(Str, m_Font, m_Width-2*m_Font->m_CharHeight); + g_TwMgr->m_Graph->BuildText(g_TwMgr->m_KeyPressedTextObj, &Str, NULL, NULL, 1, g_TwMgr->m_HelpBar->m_Font, 0, 0); + g_TwMgr->m_KeyPressedBuildText = false; + g_TwMgr->m_KeyPressedTime = (float)g_BarTimer.GetTime(); + } + if( (float)g_BarTimer.GetTime()>g_TwMgr->m_KeyPressedTime+1.0f ) // draw key pressed at least 1 second + g_TwMgr->m_KeyPressedStr = ""; + PERF( Timer.Reset(); ) + Gr->DrawRect(m_PosX+m_Font->m_CharHeight-2, m_PosY+m_VarY1+1, m_PosX+m_Width-m_Font->m_CharHeight-2, m_PosY+m_VarY1+1+m_Font->m_CharHeight, m_ColShortcutBg); + Gr->DrawText(g_TwMgr->m_KeyPressedTextObj, m_PosX+m_Font->m_CharHeight, m_PosY+m_VarY1+1, m_ColShortcutText, 0); + PERF( DT = Timer.GetTime(); printf("KeyPressed=%.4fms ", 1000.0*DT); ) + } + else + { + if( g_TwMgr->m_InfoBuildText ) + { + string Info = "> AntTweakBar"; + //string Info = "> AntTweakBar - www.antisphere.com"; + char Ver[64]; + sprintf(Ver, " (v%d.%02d)", TW_VERSION/100, TW_VERSION%100); + Info += Ver; + ClampText(Info, m_Font, m_Width-2*m_Font->m_CharHeight); + g_TwMgr->m_Graph->BuildText(g_TwMgr->m_InfoTextObj, &Info, NULL, NULL, 1, g_TwMgr->m_HelpBar->m_Font, 0, 0); + g_TwMgr->m_InfoBuildText = false; + } + PERF( Timer.Reset(); ) + Gr->DrawRect(m_PosX+m_Font->m_CharHeight-2, m_PosY+m_VarY1+1, m_PosX+m_Width-m_Font->m_CharHeight-2, m_PosY+m_VarY1+1+m_Font->m_CharHeight, m_ColShortcutBg); + Gr->DrawText(g_TwMgr->m_InfoTextObj, m_PosX+m_Font->m_CharHeight, m_PosY+m_VarY1+1, m_ColInfoText, 0); + PERF( DT = Timer.GetTime(); printf("Info=%.4fms ", 1000.0*DT); ) + } + } + + if( !m_IsPopupList ) + { + // Draw RotoSlider + RotoDraw(); + } + + if( g_TwMgr->m_PopupBar!=NULL && this!=g_TwMgr->m_PopupBar ) + { + // darken bar if a popup bar is displayed + Gr->DrawRect(m_PosX, m_PosY, m_PosX+m_Width-1, m_PosY+m_Height-1, 0x1F000000); + } + + } + else // minimized + { + int vpx, vpy, vpw, vph; + vpx = 0; + vpy = 0; + vpw = g_TwMgr->m_WndWidth; + vph = g_TwMgr->m_WndHeight; + int n = vph/m_Font->m_CharHeight-1; + if( n<1 ) + n = 1; + m_MinPosY = vph-((m_MinNumber%n)+1)*m_Font->m_CharHeight; + m_MinPosX = (m_MinNumber/n)*m_Font->m_CharHeight; + + if( m_HighlightMaximize ) + { + // Draw title + Gr->DrawRect(m_MinPosX, m_MinPosY, m_MinPosX+m_TitleWidth+2*m_Font->m_CharHeight, m_MinPosY+m_Font->m_CharHeight, m_ColTitleBg); + if( m_ColTitleShadow!=0 ) + Gr->DrawText(m_TitleTextObj, m_MinPosX+(3*m_Font->m_CharHeight)/2, m_MinPosY+1, m_ColTitleShadow, 0); + Gr->DrawText(m_TitleTextObj, m_MinPosX+(3*m_Font->m_CharHeight)/2, m_MinPosY, m_ColTitleText, 0); + } + + if( !m_IsHelpBar ) + { + // Draw maximize button + int xm = m_MinPosX+2, wm=m_Font->m_CharHeight-6; + wm = (wm<6) ? 6 : wm; + Gr->DrawRect(xm+1, m_MinPosY+4, xm+wm-1, m_MinPosY+3+wm, m_HighlightMaximize?m_ColHighBtn:m_ColBtn); + Gr->DrawLine(xm, m_MinPosY+3, xm+wm, m_MinPosY+3, m_ColLine); + Gr->DrawLine(xm+wm, m_MinPosY+3, xm+wm, m_MinPosY+3+wm, m_ColLine); + Gr->DrawLine(xm+wm, m_MinPosY+3+wm, xm, m_MinPosY+3+wm, m_ColLine); + Gr->DrawLine(xm, m_MinPosY+3+wm, xm, m_MinPosY+3, m_ColLine); + Gr->DrawLine(xm+wm+1, m_MinPosY+4, xm+wm+1, m_MinPosY+4+wm, m_ColLineShadow); + Gr->DrawLine(xm+wm+1, m_MinPosY+4+wm, xm, m_MinPosY+4+wm, m_ColLineShadow); + Gr->DrawLine(xm+wm/3, m_MinPosY+3+wm-wm/3, xm+wm/2+1, m_MinPosY+5, m_ColTitleText, true); + Gr->DrawLine(xm+wm-wm/3+1, m_MinPosY+3+wm-wm/3, xm+wm/2, m_MinPosY+5, m_ColTitleText, true); + } + else + { + // Draw help button + int xm = m_MinPosX+2, wm=m_Font->m_CharHeight-6; + wm = (wm<6) ? 6 : wm; + Gr->DrawRect(xm+1, m_MinPosY+4, xm+wm-1, m_MinPosY+3+wm, m_HighlightMaximize?m_ColHighBtn:m_ColBtn); + Gr->DrawLine(xm, m_MinPosY+3, xm+wm, m_MinPosY+3, m_ColLine); + Gr->DrawLine(xm+wm, m_MinPosY+3, xm+wm, m_MinPosY+3+wm, m_ColLine); + Gr->DrawLine(xm+wm, m_MinPosY+3+wm, xm, m_MinPosY+3+wm, m_ColLine); + Gr->DrawLine(xm, m_MinPosY+3+wm, xm, m_MinPosY+3, m_ColLine); + Gr->DrawLine(xm+wm+1, m_MinPosY+4, xm+wm+1, m_MinPosY+4+wm, m_ColLineShadow); + Gr->DrawLine(xm+wm+1, m_MinPosY+4+wm, xm, m_MinPosY+4+wm, m_ColLineShadow); + Gr->DrawLine(xm+wm/2-wm/6, m_MinPosY+3+wm/4, xm+wm-wm/3, m_MinPosY+3+wm/4, m_ColTitleText); + Gr->DrawLine(xm+wm-wm/3, m_MinPosY+3+wm/4, xm+wm-wm/3, m_MinPosY+3+wm/2, m_ColTitleText); + Gr->DrawLine(xm+wm-wm/3, m_MinPosY+3+wm/2, xm+wm/2, m_MinPosY+3+wm/2, m_ColTitleText); + Gr->DrawLine(xm+wm/2, m_MinPosY+3+wm/2, xm+wm/2, m_MinPosY+3+wm-wm/4, m_ColTitleText); + Gr->DrawLine(xm+wm/2, m_MinPosY+3+wm-wm/4+1, xm+wm/2, m_MinPosY+3+wm-wm/4+2, m_ColTitleText); + } + } +} + +// --------------------------------------------------------------------------- + +bool CTwBar::MouseMotion(int _X, int _Y) +{ + assert(g_TwMgr->m_Graph && g_TwMgr->m_WndHeight>0 && g_TwMgr->m_WndWidth>0); + if( !m_UpToDate ) + Update(); + + bool Handled = false; + if( !m_IsMinimized ) + { + bool InBar = (_X>=m_PosX && _X=m_PosY && _Ym_Bars.size(); ++ib ) + if( g_TwMgr->m_Bars[ib]!=NULL ) + { + g_TwMgr->m_Bars[ib]->m_DrawHandles = false; + g_TwMgr->m_Bars[ib]->m_HighlightTitle = false; + } + m_DrawHandles = InBar; + + if( !m_MouseDrag ) + { + Handled = InBar; + m_HighlightedLine = -1; + m_HighlightIncrBtn = false; + m_HighlightDecrBtn = false; + m_HighlightClickBtn = false; + m_HighlightTitle = false; + m_HighlightScroll = false; + m_HighlightUpScroll = false; + m_HighlightDnScroll = false; + m_HighlightMinimize = false; + m_HighlightFont = false; + m_HighlightValWidth = false; + //if( InBar && _X>m_PosX+m_Font->m_CharHeight+1 && _X=m_PosY+m_VarY0 && _Ym_PosX+2 && _X=m_PosY+m_VarY0 && _Ym_CharHeight+m_Sep); + if( m_HighlightedLine>=(int)m_HierTags.size() ) + m_HighlightedLine = -1; + if( m_HighlightedLine<0 || m_HierTags[m_HighlightedLine].m_Var==NULL || m_HierTags[m_HighlightedLine].m_Var->IsGroup() ) + ANT_SET_CURSOR(Arrow); + else + { + if( !m_HierTags[m_HighlightedLine].m_Var->IsGroup() && static_cast(m_HierTags[m_HighlightedLine].m_Var)->m_NoSlider ) + { + if( static_cast(m_HierTags[m_HighlightedLine].m_Var)->m_ReadOnly && !m_IsHelpBar ) + ANT_SET_CURSOR(No); //(Arrow); + else + ANT_SET_CURSOR(Arrow); + } + else if( m_DrawIncrDecrBtn && _X>=m_PosX+m_VarX2-IncrBtnWidth(m_Font->m_CharHeight) ) // [+] button + { + m_HighlightIncrBtn = true; + ANT_SET_CURSOR(Arrow); + } + else if( m_DrawIncrDecrBtn && _X>=m_PosX+m_VarX2-2*IncrBtnWidth(m_Font->m_CharHeight) ) // [-] button + { + m_HighlightDecrBtn = true; + ANT_SET_CURSOR(Arrow); + } + else if( !m_HierTags[m_HighlightedLine].m_Var->IsGroup() && static_cast(m_HierTags[m_HighlightedLine].m_Var)->m_ReadOnly ) + { + if( !m_IsHelpBar ) + ANT_SET_CURSOR(No); + else + ANT_SET_CURSOR(Arrow); + } + else + ANT_SET_CURSOR(Point); + //ANT_SET_CURSOR(WE); + } + } + else if( InBar && !m_IsPopupList && _X>=m_PosX+2*m_Font->m_CharHeight && _Xm_CharHeight && _Ym_CharHeight ) + { + m_HighlightTitle = true; + ANT_SET_CURSOR(Move); + } + else if ( InBar && !m_IsPopupList && _X>=m_PosX+m_VarX1-3 && _Xm_PosY+m_Font->m_CharHeight && _Y=m_PosX && _Xm_CharHeight && _Y>=m_ScrollY0 && _Y=m_PosX+m_VarX2+2 && _X=m_ScrollY0 && _Y=m_PosX+m_VarX2+2 && _X=m_PosY+m_VarY0 && _Y=m_PosX+m_VarX2+2 && _X=m_ScrollY1 && _Y=m_PosX && _Xm_CharHeight && _Y>=m_PosY && _Ym_CharHeight ) + ANT_SET_CURSOR(TopLeft); + else if( InBar && !m_IsPopupList && _X>=m_PosX && _Xm_CharHeight && _Y>=m_PosY+m_Height-m_Font->m_CharHeight && _Y=m_PosX+m_Width-m_Font->m_CharHeight && _X=m_PosY && _Ym_CharHeight ) + ANT_SET_CURSOR(TopRight); + else if( InBar && !m_IsPopupList && _X>=m_PosX+m_Width-m_Font->m_CharHeight && _X=m_PosY+m_Height-m_Font->m_CharHeight && _Y=m_PosX+m_Font->m_CharHeight && _Xm_CharHeight && _Ym_CharHeight ) + { + m_HighlightFont = true; + ANT_SET_CURSOR(Arrow); + } + else if( InBar && !m_IsPopupList && _X>=m_PosX+m_Width-2*m_Font->m_CharHeight && _Xm_CharHeight && _Ym_CharHeight ) + { + m_HighlightMinimize = true; + ANT_SET_CURSOR(Arrow); + } + else if( m_IsHelpBar && InBar && _X>=m_PosX+m_VarX0 && _Xm_CharHeight && _Y>m_PosY+m_Height-m_Font->m_CharHeight && _Y=0 && m_HighlightedLine<(int)m_HierTags.size() && m_HierTags[m_HighlightedLine].m_Var && !m_HierTags[m_HighlightedLine].m_Var->IsGroup() ) + { + /* + CTwVarAtom *Var = static_cast(m_HierTags[m_HighlightedLine].m_Var); + int Delta = _X-m_MouseOriginX; + if( Delta!=0 ) + { + if( !Var->m_NoSlider && !Var->m_ReadOnly ) + { + Var->Increment(Delta); + NotUpToDate(); + } + m_VarHasBeenIncr = true; + } + m_MouseOriginX = _X; + m_MouseOriginY = _Y; + if( !Var->m_NoSlider && !Var->m_ReadOnly ) + ANT_SET_CURSOR(Center); + //ANT_SET_CURSOR(WE); + else + ANT_SET_CURSOR(Arrow); + Handled = true; + */ + + // move rotoslider + if( !static_cast(m_HierTags[m_HighlightedLine].m_Var)->m_NoSlider ) + RotoOnMouseMove(_X, _Y); + + if( static_cast(m_HierTags[m_HighlightedLine].m_Var)->m_ReadOnly ) + ANT_SET_CURSOR(No); + else if( static_cast(m_HierTags[m_HighlightedLine].m_Var)->m_NoSlider ) + ANT_SET_CURSOR(Arrow); + m_VarHasBeenIncr = true; + Handled = true; + m_DrawHandles = true; + } + else if( m_MouseDragTitle ) + { + int y = m_PosY; + m_PosX += _X-m_MouseOriginX; + m_PosY += _Y-m_MouseOriginY; + m_MouseOriginX = _X; + m_MouseOriginY = _Y; + int vpx, vpy, vpw, vph; + vpx = 0; + vpy = 0; + vpw = g_TwMgr->m_WndWidth; + vph = g_TwMgr->m_WndHeight; + if( m_PosX+m_Width>vpx+vpw ) + m_PosX = vpx+vpw-m_Width; + if( m_PosXvpy+vph ) + m_PosY = vpy+vph-m_Height; + if( m_PosYm_HelpBarNotUpToDate = true; + ANT_SET_CURSOR(WE); + Handled = true; + m_DrawHandles = true; + } + else if( m_MouseDragScroll ) + { + if( m_ScrollYH>0 ) + { + int dl = ((_Y-m_MouseOriginY)*m_NbHierLines)/m_ScrollYH; + if( m_FirstLine0+dl<0 ) + m_FirstLine = 0; + else if( m_FirstLine0+dl+m_NbDisplayedLines>m_NbHierLines ) + m_FirstLine = m_NbHierLines-m_NbDisplayedLines; + else + m_FirstLine = m_FirstLine0+dl; + NotUpToDate(); + } + ANT_SET_CURSOR(NS); + Handled = true; + m_DrawHandles = true; + } + else if( m_MouseDragResizeUL ) + { + m_PosX += _X-m_MouseOriginX; + m_PosY += _Y-m_MouseOriginY; + m_Width -= _X-m_MouseOriginX; + m_Height -= _Y-m_MouseOriginY; + m_MouseOriginX = _X; + m_MouseOriginY = _Y; + ANT_SET_CURSOR(TopLeft); + NotUpToDate(); + if( m_IsHelpBar ) + { + g_TwMgr->m_HelpBarNotUpToDate = true; + g_TwMgr->m_HelpBarUpdateNow = true; + } + g_TwMgr->m_KeyPressedBuildText = true; + g_TwMgr->m_InfoBuildText = true; + Handled = true; + m_DrawHandles = true; + } + else if( m_MouseDragResizeUR ) + { + m_PosY += _Y-m_MouseOriginY; + m_Width += _X-m_MouseOriginX; + m_Height -= _Y-m_MouseOriginY; + m_MouseOriginX = _X; + m_MouseOriginY = _Y; + ANT_SET_CURSOR(TopRight); + NotUpToDate(); + if( m_IsHelpBar ) + { + g_TwMgr->m_HelpBarNotUpToDate = true; + g_TwMgr->m_HelpBarUpdateNow = true; + } + g_TwMgr->m_KeyPressedBuildText = true; + g_TwMgr->m_InfoBuildText = true; + Handled = true; + m_DrawHandles = true; + } + else if( m_MouseDragResizeLL ) + { + m_PosX += _X-m_MouseOriginX; + m_Width -= _X-m_MouseOriginX; + m_Height += _Y-m_MouseOriginY; + m_MouseOriginX = _X; + m_MouseOriginY = _Y; + ANT_SET_CURSOR(BottomLeft); + NotUpToDate(); + if( m_IsHelpBar ) + { + g_TwMgr->m_HelpBarNotUpToDate = true; + g_TwMgr->m_HelpBarUpdateNow = true; + } + g_TwMgr->m_KeyPressedBuildText = true; + g_TwMgr->m_InfoBuildText = true; + Handled = true; + m_DrawHandles = true; + } + else if( m_MouseDragResizeLR ) + { + m_Width += _X-m_MouseOriginX; + m_Height += _Y-m_MouseOriginY; + m_MouseOriginX = _X; + m_MouseOriginY = _Y; + ANT_SET_CURSOR(BottomRight); + NotUpToDate(); + if( m_IsHelpBar ) + { + g_TwMgr->m_HelpBarNotUpToDate = true; + g_TwMgr->m_HelpBarUpdateNow = true; + } + g_TwMgr->m_KeyPressedBuildText = true; + g_TwMgr->m_InfoBuildText = true; + Handled = true; + m_DrawHandles = true; + } + //else if( InBar ) + // ANT_SET_CURSOR(Arrow); + } + } + else // minimized + { + if( _X>=m_MinPosX+2 && _Xm_CharHeight && _Y>m_MinPosY && _Ym_CharHeight-2 ) + { + m_HighlightMaximize = true; + if( !m_IsHelpBar ) + ANT_SET_CURSOR(Arrow); + else + ANT_SET_CURSOR(Help); + Handled = true; + } + else + m_HighlightMaximize = false; + } + + return Handled; +} + +// --------------------------------------------------------------------------- + +#ifdef ANT_WINDOWS +# pragma optimize("", off) +// disable optimizations because the conversion of Enum from unsigned int to double is not always exact if optimized and GraphAPI=DirectX ! +#endif +static void ANT_CALL PopupCallback(void *_ClientData) +{ + if( g_TwMgr!=NULL && g_TwMgr->m_PopupBar!=NULL ) + { + unsigned int Enum = *(unsigned int *)&_ClientData; + CTwVarAtom *Var = g_TwMgr->m_PopupBar->m_VarEnumLinkedToPopupList; + CTwBar *Bar = g_TwMgr->m_PopupBar->m_BarLinkedToPopupList; + if( Bar!=NULL && Var!=NULL && !Var->m_ReadOnly && (Var->m_Type>=TW_TYPE_ENUM_BASE && Var->m_Type<=TW_TYPE_ENUM_BASE+(int)g_TwMgr->m_Enums.size()) ) + { + Var->ValueFromDouble(Enum); + Bar->UnHighlightLine(); + Bar->NotUpToDate(); + } + TwDeleteBar(g_TwMgr->m_PopupBar); + g_TwMgr->m_PopupBar = NULL; + } +} +#ifdef ANT_WINDOWS +# pragma optimize("", on) +#endif + +// --------------------------------------------------------------------------- + +bool CTwBar::MouseButton(ETwMouseButtonID _Button, bool _Pressed, int _X, int _Y) +{ + assert(g_TwMgr->m_Graph && g_TwMgr->m_WndHeight>0 && g_TwMgr->m_WndWidth>0); + bool Handled = false; + if( !m_UpToDate ) + Update(); + + if( !m_IsMinimized ) + { + Handled = (_X>=m_PosX && _X=m_PosY && _Y=0 && m_HighlightedLine<(int)m_HierTags.size() && m_HierTags[m_HighlightedLine].m_Var ) + { + if( m_HierTags[m_HighlightedLine].m_Var->IsGroup() ) + { + if( _Pressed && !g_TwMgr->m_IsRepeatingMousePressed ) + { + CTwVarGroup *Grp = static_cast(m_HierTags[m_HighlightedLine].m_Var); + Grp->m_Open = !Grp->m_Open; + NotUpToDate(); + ANT_SET_CURSOR(Arrow); + } + } + else if( _Pressed && m_HighlightIncrBtn ) + { + static_cast(m_HierTags[m_HighlightedLine].m_Var)->Increment(1); + NotUpToDate(); + } + else if( _Pressed && m_HighlightDecrBtn ) + { + static_cast(m_HierTags[m_HighlightedLine].m_Var)->Increment(-1); + NotUpToDate(); + } + else if( _Pressed && !m_MouseDrag ) + { + m_MouseDrag = true; + m_MouseDragVar = true; + m_MouseOriginX = _X; + m_MouseOriginY = _Y; + m_VarHasBeenIncr = false; + CTwVarAtom * Var = static_cast(m_HierTags[m_HighlightedLine].m_Var); + if( !Var->m_NoSlider && !Var->m_ReadOnly ) + { + // begin rotoslider + RotoOnLButtonDown(_X, _Y); + m_MouseDrag = true; + m_MouseDragVar = true; + } + else if( (Var->m_Type==TW_TYPE_BOOL8 || Var->m_Type==TW_TYPE_BOOL16 || Var->m_Type==TW_TYPE_BOOL32 || Var->m_Type==TW_TYPE_BOOLCPP) && !Var->m_ReadOnly ) + { + Var->Increment(1); + //m_HighlightClickBtn = true; + m_VarHasBeenIncr = true; + m_MouseDragVar = false; + m_MouseDrag = false; + NotUpToDate(); + } + else if( Var->m_Type==TW_TYPE_BUTTON && !Var->m_ReadOnly ) + { + m_HighlightClickBtn = true; + m_MouseDragVar = false; + m_MouseDrag = false; + } + //else if( (Var->m_Type==TW_TYPE_ENUM8 || Var->m_Type==TW_TYPE_ENUM16 || Var->m_Type==TW_TYPE_ENUM32) && !Var->m_ReadOnly ) + else if( (Var->m_Type>=TW_TYPE_ENUM_BASE && Var->m_Type<=TW_TYPE_ENUM_BASE+(int)g_TwMgr->m_Enums.size()) && !Var->m_ReadOnly && !g_TwMgr->m_IsRepeatingMousePressed ) + { + m_MouseDragVar = false; + m_MouseDrag = false; + if( g_TwMgr->m_PopupBar!=NULL ) + { + TwDeleteBar(g_TwMgr->m_PopupBar); + g_TwMgr->m_PopupBar = NULL; + } + // popup list + CTwMgr::CEnum& e = g_TwMgr->m_Enums[Var->m_Type-TW_TYPE_ENUM_BASE]; + g_TwMgr->m_PopupBar = TwNewBar("~ Enum Popup ~"); + g_TwMgr->m_PopupBar->m_IsPopupList = true; + g_TwMgr->m_PopupBar->m_Color = m_Color; + g_TwMgr->m_PopupBar->m_PosX = m_PosX + m_VarX1 - 2; + g_TwMgr->m_PopupBar->m_PosY = m_PosY + m_VarY0 + (m_HighlightedLine+1)*(m_Font->m_CharHeight+m_Sep); + g_TwMgr->m_PopupBar->m_Width = m_Width - 2*m_Font->m_CharHeight; + int popHeight0 = (int)e.m_Entries.size()*(m_Font->m_CharHeight+m_Sep) + m_Font->m_CharHeight/2+2; + int popHeight = popHeight0; + if( g_TwMgr->m_PopupBar->m_PosY+popHeight+2 > g_TwMgr->m_WndHeight ) + popHeight = g_TwMgr->m_WndHeight-g_TwMgr->m_PopupBar->m_PosY-2; + if( popHeightm_WndHeight/2 ) + popHeight = min(popHeight0, g_TwMgr->m_WndHeight/2); + if( popHeight<3*(m_Font->m_CharHeight+m_Sep) ) + popHeight = 3*(m_Font->m_CharHeight+m_Sep); + g_TwMgr->m_PopupBar->m_Height = popHeight; + g_TwMgr->m_PopupBar->m_VarEnumLinkedToPopupList = Var; + g_TwMgr->m_PopupBar->m_BarLinkedToPopupList = this; + for( CTwMgr::CEnum::CEntries::iterator It=e.m_Entries.begin(); It!=e.m_Entries.end(); ++It ) + { + char ID[64]; + sprintf(ID, "%u", It->first); + //ultoa(It->first, ID, 10); + TwAddButton(g_TwMgr->m_PopupBar, ID, PopupCallback, *(void**)&(It->first), NULL); + CTwVar *Btn = g_TwMgr->m_PopupBar->Find(ID); + if( Btn!=NULL ) + Btn->m_Label = It->second.c_str(); + } + g_TwMgr->m_HelpBarNotUpToDate = false; + } + else if( Var->m_ReadOnly ) + ANT_SET_CURSOR(No); + else + ANT_SET_CURSOR(Arrow); + } + else if ( !_Pressed && m_MouseDragVar ) + { + m_MouseDrag = false; + m_MouseDragVar = false; + if( !Handled ) + m_DrawHandles = false; + Handled = true; + // end rotoslider + RotoOnLButtonUp(_X, _Y); + + /* Incr/decr on right or left click + if( !m_VarHasBeenIncr && !static_cast(m_HierTags[m_HighlightedLine].m_Var)->m_ReadOnly ) + { + if( _Button==TW_MOUSE_LEFT ) + static_cast(m_HierTags[m_HighlightedLine].m_Var)->Increment(-1); + else if( _Button==TW_MOUSE_RIGHT ) + static_cast(m_HierTags[m_HighlightedLine].m_Var)->Increment(1); + NotUpToDate(); + } + */ + + if( static_cast(m_HierTags[m_HighlightedLine].m_Var)->m_ReadOnly ) + ANT_SET_CURSOR(No); + else + ANT_SET_CURSOR(Arrow); + } + else if( !_Pressed && m_HighlightClickBtn ) // a button variable is activated + { + m_HighlightClickBtn = false; + m_MouseDragVar = false; + m_MouseDrag = false; + Handled = true; + NotUpToDate(); + CTwVarAtom * Var = static_cast(m_HierTags[m_HighlightedLine].m_Var); + if( !Var->m_ReadOnly && Var->m_Type==TW_TYPE_BUTTON && Var->m_ButtonCallback!=NULL ) + Var->m_ButtonCallback(Var->m_ClientData); + } + else if( !_Pressed ) + { + m_MouseDragVar = false; + m_MouseDrag = false; + } + } + else if( _Pressed && !m_MouseDrag && !m_IsPopupList && _Button==TW_MOUSE_LEFT && _X>=m_PosX+2*m_Font->m_CharHeight && _Xm_CharHeight && _Y>=m_PosY && _Ym_CharHeight ) + { + m_MouseDrag = true; + m_MouseDragTitle = true; + m_MouseOriginX = _X; + m_MouseOriginY = _Y; + m_HighlightTitle = true; + ANT_SET_CURSOR(Move); + } + else if( !_Pressed && m_MouseDragTitle ) + { + m_MouseDrag = false; + m_MouseDragTitle = false; + ANT_SET_CURSOR(Arrow); + } + else if ( _Pressed && !m_MouseDrag && !m_IsPopupList && _Button==TW_MOUSE_LEFT && _X>=m_PosX+m_VarX1-3 && _Xm_PosY+m_Font->m_CharHeight && _Y=m_PosX+m_VarX2+2 && _X=m_ScrollY0 && _Y=m_PosX+m_VarX2+2 && _X=m_PosY+m_VarY0 && _Y0 ) + { + --m_FirstLine; + NotUpToDate(); + } + } + else if( _Pressed && _Button==TW_MOUSE_LEFT && _X>=m_PosX+m_VarX2+2 && _X=m_ScrollY1 && _Y=m_PosX && _Xm_CharHeight && _Y>=m_PosY && _Ym_CharHeight ) + { + m_MouseDrag = true; + m_MouseDragResizeUL = true; + m_MouseOriginX = _X; + m_MouseOriginY = _Y; + ANT_SET_CURSOR(TopLeft); + } + else if( !_Pressed && m_MouseDragResizeUL ) + { + m_MouseDrag = false; + m_MouseDragResizeUL = false; + ANT_SET_CURSOR(Arrow); + } + else if( _Pressed && !m_MouseDrag && !m_IsPopupList && _Button==TW_MOUSE_LEFT && _X>=m_PosX+m_Width-m_Font->m_CharHeight && _X=m_PosY && _Ym_CharHeight ) + { + m_MouseDrag = true; + m_MouseDragResizeUR = true; + m_MouseOriginX = _X; + m_MouseOriginY = _Y; + ANT_SET_CURSOR(TopRight); + } + else if( !_Pressed && m_MouseDragResizeUR ) + { + m_MouseDrag = false; + m_MouseDragResizeUR = false; + ANT_SET_CURSOR(Arrow); + } + else if( _Pressed && !m_MouseDrag && !m_IsPopupList && _Button==TW_MOUSE_LEFT && _X>=m_PosX && _Xm_CharHeight && _Y>=m_PosY+m_Height-m_Font->m_CharHeight && _Y=m_PosX+m_Width-m_Font->m_CharHeight && _X=m_PosY+m_Height-m_Font->m_CharHeight && _Y=m_PosX+m_Font->m_CharHeight && _Xm_CharHeight && _Y>m_PosY && _Ym_CharHeight ) + { + // change font + if( _Button==TW_MOUSE_LEFT ) + { + if( m_Font==g_DefaultSmallFont ) + g_TwMgr->SetFont(g_DefaultNormalFont, true); + else if( m_Font==g_DefaultNormalFont ) + g_TwMgr->SetFont(g_DefaultLargeFont, true); + else if( m_Font==g_DefaultLargeFont ) + g_TwMgr->SetFont(g_DefaultSmallFont, true); + else + g_TwMgr->SetFont(g_DefaultNormalFont, true); + } + else if( _Button==TW_MOUSE_RIGHT ) + { + if( m_Font==g_DefaultSmallFont ) + g_TwMgr->SetFont(g_DefaultLargeFont, true); + else if( m_Font==g_DefaultNormalFont ) + g_TwMgr->SetFont(g_DefaultSmallFont, true); + else if( m_Font==g_DefaultLargeFont ) + g_TwMgr->SetFont(g_DefaultNormalFont, true); + else + g_TwMgr->SetFont(g_DefaultNormalFont, true); + } + + ANT_SET_CURSOR(Arrow); + } + else if( _Pressed && !m_IsPopupList && _Button==TW_MOUSE_LEFT && _X>=m_PosX+m_Width-2*m_Font->m_CharHeight && _Xm_CharHeight && _Y>m_PosY && _Ym_CharHeight ) + { + // minimize + g_TwMgr->Minimize(this); + ANT_SET_CURSOR(Arrow); + } + else if( m_IsHelpBar && _Pressed && !g_TwMgr->m_IsRepeatingMousePressed && _X>=m_PosX+m_VarX0 && _Xm_CharHeight && _Y>m_PosY+m_Height-m_Font->m_CharHeight && _YMaximize(this); + ANT_SET_CURSOR(Arrow); + Handled = true; + } + } + + return Handled; +} + + +// --------------------------------------------------------------------------- + +bool CTwBar::MouseWheel(int _Pos, int _PrevPos, int _MouseX, int _MouseY) +{ + assert(g_TwMgr->m_Graph && g_TwMgr->m_WndHeight>0 && g_TwMgr->m_WndWidth>0); + if( !m_UpToDate ) + Update(); + + bool Handled = false; + if( !m_IsMinimized && _MouseX>=m_PosX && _MouseX=m_PosY && _MouseY_PrevPos && m_FirstLine>0 ) + { + --m_FirstLine; + NotUpToDate(); + } + else if( _Pos<_PrevPos && m_FirstLine' ' && _Key<256 ) // don't test SHIFT if _Key is a common key + Mask &= ~TW_KMOD_SHIFT; + + // don't test KMOD_NUM and KMOD_CAPS modifiers coming from SDL + Mask &= ~(0x1000); // 0x1000 is the KMOD_NUM value defined in SDL_keysym.h + Mask &= ~(0x2000); // 0x2000 is the KMOD_CAPS value defined in SDL_keysym.h + + // complete partial modifiers comming from SDL + if( _Modifiers & TW_KMOD_SHIFT ) + _Modifiers |= TW_KMOD_SHIFT; + if( _Modifiers & TW_KMOD_CTRL ) + _Modifiers |= TW_KMOD_CTRL; + if( _Modifiers & TW_KMOD_ALT ) + _Modifiers |= TW_KMOD_ALT; + if( _Modifiers & TW_KMOD_META ) + _Modifiers |= TW_KMOD_META; + + for(size_t i=0; iIsGroup() ) + { + Atom = static_cast(m_Vars[i])->FindShortcut(_Key, _Modifiers, _DoIncr); + if( Atom!=NULL ) + return Atom; + } + else + { + Atom = static_cast(m_Vars[i]); + if( Atom->m_KeyIncr[0]==_Key && (Atom->m_KeyIncr[1]&Mask)==(_Modifiers&Mask) ) + { + if( _DoIncr!=NULL ) + *_DoIncr = true; + return Atom; + } + else if( Atom->m_KeyDecr[0]==_Key && (Atom->m_KeyDecr[1]&Mask)==(_Modifiers&Mask) ) + { + if( _DoIncr!=NULL ) + *_DoIncr = false; + return Atom; + } + } + } + return NULL; +} + +bool CTwBar::KeyPressed(int _Key, int _Modifiers) +{ + assert(g_TwMgr->m_Graph && g_TwMgr->m_WndHeight>0 && g_TwMgr->m_WndWidth>0); + bool Handled = false; + if( !m_UpToDate ) + Update(); + + if( _Key>0 && _Key0 && _Key<32 ) + _Key += 'a'-1; + + // PAD translation (for SDL keysym) + if( _Key>=256 && _Key<=272 ) // 256=SDLK_KP0 ... 272=SDLK_KP_EQUALS + { + bool Num = ((_Modifiers&TW_KMOD_SHIFT) && !(_Modifiers&0x1000)) || (!(_Modifiers&TW_KMOD_SHIFT) && (_Modifiers&0x1000)); // 0x1000 is SDL's KMOD_NUM + _Modifiers &= ~TW_KMOD_SHIFT; // remove shift modifier + if( _Key==266 ) // SDLK_KP_PERIOD + _Key = Num ? '.' : TW_KEY_DELETE; + else if( _Key==267 ) // SDLK_KP_DIVIDE + _Key = '/'; + else if( _Key==268 ) // SDLK_KP_MULTIPLY + _Key = '*'; + else if( _Key==269 ) // SDLK_KP_MINUS + _Key = '-'; + else if( _Key==270 ) // SDLK_KP_PLUS + _Key = '+'; + else if( _Key==271 ) // SDLK_KP_ENTER + _Key = TW_KEY_RETURN; + else if( _Key==272 ) // SDLK_KP_EQUALS + _Key = '='; + else if( Num ) // num SDLK_KP0..9 + _Key += '0' - 256; + else if( _Key==256 ) // non-num SDLK_KP01 + _Key = TW_KEY_INSERT; + else if( _Key==257 ) // non-num SDLK_KP1 + _Key = TW_KEY_END; + else if( _Key==258 ) // non-num SDLK_KP2 + _Key = TW_KEY_DOWN; + else if( _Key==259 ) // non-num SDLK_KP3 + _Key = TW_KEY_PAGE_DOWN; + else if( _Key==260 ) // non-num SDLK_KP4 + _Key = TW_KEY_LEFT; + else if( _Key==262 ) // non-num SDLK_KP6 + _Key = TW_KEY_RIGHT; + else if( _Key==263 ) // non-num SDLK_KP7 + _Key = TW_KEY_HOME; + else if( _Key==264 ) // non-num SDLK_KP8 + _Key = TW_KEY_UP; + else if( _Key==265 ) // non-num SDLK_KP9 + _Key = TW_KEY_PAGE_UP; + } + */ + + /* + string Str; + TwGetKeyString(&Str, _Key, _Modifiers); + printf("key: %d 0x%04xd %s\n", _Key, _Modifiers, Str.c_str()); + */ + bool DoIncr = true; + CTwVarAtom *Atom = m_VarRoot.FindShortcut(_Key, _Modifiers, &DoIncr); + if( Atom!=NULL && Atom->m_Visible ) + { + if( !Atom->m_ReadOnly ) + Atom->Increment( DoIncr ? +1 : -1 ); + NotUpToDate(); + Show(Atom); + Handled = true; + } + } + return Handled; +} + +// --------------------------------------------------------------------------- + +bool CTwBar::Show(CTwVar *_Var) +{ + if( _Var==NULL || !_Var->m_Visible ) + return false; + if( !m_UpToDate ) + Update(); + + if( OpenHier(&m_VarRoot, _Var) ) + { + if( !m_UpToDate ) + Update(); + int l = LineInHier(&m_VarRoot, _Var); + if( l>=0 ) + { + int NbLines = (m_VarY1-m_VarY0+1)/(m_Font->m_CharHeight+m_Sep); + if( NbLines<= 0 ) + NbLines = 1; + if( l=m_FirstLine+NbLines ) + { + m_FirstLine = l-NbLines/2; + if( m_FirstLine<0 ) + m_FirstLine = 0; + NotUpToDate(); + Update(); + if( m_NbDisplayedLinesm_Vars.size(); ++i) + if( _Root->m_Vars[i]!=NULL ) + { + if( _Var==_Root->m_Vars[i] + || (_Root->m_Vars[i]->IsGroup() && OpenHier(static_cast(_Root->m_Vars[i]), _Var)) ) + { + _Root->m_Open = true; + NotUpToDate(); + return true; + } + } + return false; +} + +// --------------------------------------------------------------------------- + +int CTwBar::LineInHier(CTwVarGroup *_Root, CTwVar *_Var) +{ + assert( _Root!=NULL ); + int l = 0; + for(size_t i=0; i<_Root->m_Vars.size(); ++i) + if( _Root->m_Vars[i]!=NULL && _Root->m_Vars[i]->m_Visible ) + { + if( _Var==_Root->m_Vars[i] ) + return l; + else if( _Root->m_Vars[i]->IsGroup() && static_cast(_Root->m_Vars[i])->m_Open ) + { + ++l; + int ll = LineInHier(static_cast(_Root->m_Vars[i]), _Var); + if( ll>=0 ) + return l+ll; + else + l += -ll-2; + } + ++l; + } + return -l-1; +} + +// --------------------------------------------------------------------------- + +static void DrawArc(int _X, int _Y, int _Radius, float _StartAngleDeg, float _EndAngleDeg, color32 _Color) // angles in degree +{ + ITwGraph *Gr = g_TwMgr->m_Graph; + if( Gr==NULL || !Gr->IsDrawing() || _Radius==0 || _StartAngleDeg==_EndAngleDeg ) + return; + + float startAngle = (float)M_PI*_StartAngleDeg/180; + float endAngle = (float)M_PI*_EndAngleDeg/180; + float stepAngle = 8/(float)_Radius; // segment length = 8 pixels + if( stepAngle>(float)M_PI/4 ) + stepAngle = (float)M_PI/4; + bool fullCircle = fabsf(endAngle-startAngle)>=2.0f*(float)M_PI+fabsf(stepAngle); + int numSteps; + if( fullCircle ) + { + numSteps = int((2.0f*(float)M_PI)/stepAngle); + startAngle = 0; + endAngle = 2.0f*(float)M_PI; + } + else + numSteps = int(fabsf(endAngle-startAngle)/stepAngle); + if( startAngle>endAngle ) + stepAngle = -stepAngle; + + int x0 = int(_X + _Radius * cosf(startAngle) + 0.5f); + int y0 = int(_Y - _Radius * sinf(startAngle) + 0.5f); + int x1, y1; + float angle = startAngle+stepAngle; + + for( int i=0; iDrawLine(x0, y0, x1, y1, _Color, true); + x0 = x1; + y0 = y1; + } + + if( fullCircle ) + { + x1 = int(_X + _Radius * cosf(startAngle) + 0.5f); + y1 = int(_Y - _Radius * sinf(startAngle) + 0.5f); + } + else + { + x1 = int(_X + _Radius * cosf(endAngle) + 0.5f); + y1 = int(_Y - _Radius * sinf(endAngle) + 0.5f); + } + Gr->DrawLine(x0, y0, x1, y1, _Color, true); +} + +// --------------------------------------------------------------------------- + +CTwBar::CRotoSlider::CRotoSlider() +{ + m_Var = NULL; + m_Active = false; + m_ActiveMiddle = false; + m_Subdiv = 256; // will be recalculate in RotoOnLButtonDown +} + +void CTwBar::RotoDraw() +{ + ITwGraph *Gr = g_TwMgr->m_Graph; + if( Gr==NULL || !Gr->IsDrawing() ) + return; + + if( m_Roto.m_Active ) + { + DrawArc(m_Roto.m_Origin.x, m_Roto.m_Origin.y, 32, 0, 360, m_ColRoto); + DrawArc(m_Roto.m_Origin.x+1, m_Roto.m_Origin.y, 32, 0, 360, m_ColRoto); + DrawArc(m_Roto.m_Origin.x, m_Roto.m_Origin.y+1, 32, 0, 360, m_ColRoto); + + if( m_Roto.m_HasPrevious ) + { + double varMax = RotoGetMax(); + double varMin = RotoGetMin(); + double varStep = RotoGetStep(); + if( varMax-DOUBLE_MAX && fabs(varStep)>DOUBLE_EPS && m_Roto.m_Subdiv>0 ) + { + double dtMax = 360.0*(varMax-m_Roto.m_ValueAngle0)/((double)m_Roto.m_Subdiv*varStep);//+2; + double dtMin = 360.0*(varMin-m_Roto.m_ValueAngle0)/((double)m_Roto.m_Subdiv*varStep);//-2; + + if( dtMax>=0 && dtMax<360 && dtMin<=0 && dtMin>-360 && fabs(dtMax-dtMin)<=360 ) + { + int x1, y1, x2, y2; + double da = 2.0*M_PI/m_Roto.m_Subdiv; + + x1 = m_Roto.m_Origin.x + (int)(40*cos(-M_PI*(m_Roto.m_Angle0+dtMax)/180-da)); + y1 = m_Roto.m_Origin.y + (int)(40*sin(-M_PI*(m_Roto.m_Angle0+dtMax)/180-da)+0.5); + x2 = m_Roto.m_Origin.x + (int)(40*cos(-M_PI*(m_Roto.m_Angle0+dtMax-10)/180-da)); + y2 = m_Roto.m_Origin.y + (int)(40*sin(-M_PI*(m_Roto.m_Angle0+dtMax-10)/180-da)+0.5); + Gr->DrawLine(m_Roto.m_Origin.x, m_Roto.m_Origin.y, x1, y1, m_ColRotoBound, true); + Gr->DrawLine(m_Roto.m_Origin.x+1, m_Roto.m_Origin.y, x1+1, y1, m_ColRotoBound, true); + Gr->DrawLine(m_Roto.m_Origin.x, m_Roto.m_Origin.y+1, x1, y1+1, m_ColRotoBound, true); + Gr->DrawLine(x1, y1, x2, y2, m_ColRotoBound, true); + Gr->DrawLine(x1+1, y1, x2+1, y2, m_ColRotoBound, true); + Gr->DrawLine(x1, y1+1, x2, y2+1, m_ColRotoBound, true); + + x1 = m_Roto.m_Origin.x + (int)(40*cos(-M_PI*(m_Roto.m_Angle0+dtMin)/180+da)); + y1 = m_Roto.m_Origin.y + (int)(40*sin(-M_PI*(m_Roto.m_Angle0+dtMin)/180+da)+0.5); + x2 = m_Roto.m_Origin.x + (int)(40*cos(-M_PI*(m_Roto.m_Angle0+dtMin+10)/180+da)); + y2 = m_Roto.m_Origin.y + (int)(40*sin(-M_PI*(m_Roto.m_Angle0+dtMin+10)/180+da)+0.5); + Gr->DrawLine(m_Roto.m_Origin.x, m_Roto.m_Origin.y, x1, y1, m_ColRotoBound, true); + Gr->DrawLine(m_Roto.m_Origin.x+1, m_Roto.m_Origin.y, x1+1, y1, m_ColRotoBound, true); + Gr->DrawLine(m_Roto.m_Origin.x, m_Roto.m_Origin.y+1, x1, y1+1, m_ColRotoBound, true); + Gr->DrawLine(x1, y1, x2, y2, m_ColRotoBound, true); + Gr->DrawLine(x1+1, y1, x2+1, y2, m_ColRotoBound, true); + Gr->DrawLine(x1, y1+1, x2, y2+1, m_ColRotoBound, true); + } + } + } + + Gr->DrawLine(m_Roto.m_Origin.x+1, m_Roto.m_Origin.y, m_Roto.m_Current.x+1, m_Roto.m_Current.y, m_ColRotoVal, true); + Gr->DrawLine(m_Roto.m_Origin.x, m_Roto.m_Origin.y+1, m_Roto.m_Current.x, m_Roto.m_Current.y+1, m_ColRotoVal, true); + Gr->DrawLine(m_Roto.m_Origin.x, m_Roto.m_Origin.y, m_Roto.m_Current.x, m_Roto.m_Current.y, m_ColRotoVal, true); + + if( fabs(m_Roto.m_AngleDT)>=1 ) + { + DrawArc(m_Roto.m_Origin.x, m_Roto.m_Origin.y, 32, float(m_Roto.m_Angle0), float(m_Roto.m_Angle0+m_Roto.m_AngleDT-1), m_ColRotoVal); + DrawArc(m_Roto.m_Origin.x+1, m_Roto.m_Origin.y, 32, float(m_Roto.m_Angle0), float(m_Roto.m_Angle0+m_Roto.m_AngleDT-1), m_ColRotoVal); + DrawArc(m_Roto.m_Origin.x, m_Roto.m_Origin.y+1, 32, float(m_Roto.m_Angle0), float(m_Roto.m_Angle0+m_Roto.m_AngleDT-1), m_ColRotoVal); + } + } +} + +double CTwBar::RotoGetValue() const +{ + assert(m_Roto.m_Var!=NULL); + return m_Roto.m_Var->ValueToDouble(); +} + +void CTwBar::RotoSetValue(double _Val) +{ + assert(m_Roto.m_Var!=NULL); + if( _Val!=m_Roto.m_CurrentValue ) + { + m_Roto.m_CurrentValue = _Val; + m_Roto.m_Var->ValueFromDouble(_Val); + NotUpToDate(); + } +} + +double CTwBar::RotoGetMin() const +{ + assert(m_Roto.m_Var!=NULL); + double min = -DOUBLE_MAX; + m_Roto.m_Var->MinMaxStepToDouble(&min, NULL, NULL); + return min; +} + +double CTwBar::RotoGetMax() const +{ + assert(m_Roto.m_Var!=NULL); + double max = DOUBLE_MAX; + m_Roto.m_Var->MinMaxStepToDouble(NULL, &max, NULL); + return max; +} + +double CTwBar::RotoGetStep() const +{ + assert(m_Roto.m_Var!=NULL); + double step = 1; + m_Roto.m_Var->MinMaxStepToDouble(NULL, NULL, &step); + return step; +} + +double CTwBar::RotoGetSteppedValue() const +{ + double d = m_Roto.m_PreciseValue-m_Roto.m_Value0; + double n = int(d/RotoGetStep()); + return m_Roto.m_Value0 + RotoGetStep()*n; +} + +void CTwBar::RotoOnMouseMove(int _X, int _Y) +{ + CPoint p(_X, _Y); + if( m_Roto.m_Active ) + { + m_Roto.m_Current = p; + RotoSetValue(RotoGetSteppedValue()); + //DrawManip(); + + int ti = -1; + double t = 0; + float r = sqrtf(float( (m_Roto.m_Current.x-m_Roto.m_Origin.x)*(m_Roto.m_Current.x-m_Roto.m_Origin.x) + + (m_Roto.m_Current.y-m_Roto.m_Origin.y)*(m_Roto.m_Current.y-m_Roto.m_Origin.y))); + if( r>m_RotoMinRadius ) + { + t = - atan2(double(m_Roto.m_Current.y-m_Roto.m_Origin.y), double(m_Roto.m_Current.x-m_Roto.m_Origin.x)); + ti = (int((t/(2.0*M_PI)+1.0)*NB_ROTO_CURSORS+0.5)) % NB_ROTO_CURSORS; + if( m_Roto.m_HasPrevious ) + { + CPoint v0 = m_Roto.m_Previous-m_Roto.m_Origin; + CPoint v1 = m_Roto.m_Current-m_Roto.m_Origin; + double l0 = sqrt(double(v0.x*v0.x+v0.y*v0.y)); + double l1 = sqrt(double(v1.x*v1.x+v1.y*v1.y)); + double dt = acos(max(-1+1.0e-30,min(1-1.0e-30,double(v0.x*v1.x+v0.y*v1.y)/(l0*l1)))); + if( v0.x*v1.y-v0.y*v1.x>0 ) + dt = - dt; + double preciseInc = double(m_Roto.m_Subdiv) * dt/(2.0*M_PI) * RotoGetStep(); + if( preciseInc>RotoGetStep() || preciseInc<-RotoGetStep() ) + { + m_Roto.m_PreciseValue += preciseInc; + if( m_Roto.m_PreciseValue>RotoGetMax() ) + { + m_Roto.m_PreciseValue = RotoGetMax(); + m_Roto.m_Value0 = RotoGetMax(); + + double da = 360*(RotoGetMax()-m_Roto.m_ValueAngle0)/(double(m_Roto.m_Subdiv)*RotoGetStep()); + m_Roto.m_Angle0 = ((int((t/(2.0*M_PI)+1.0)*360.0+0.5)) % 360) - da; + m_Roto.m_AngleDT = da; + } + else if( m_Roto.m_PreciseValue=0 && ti=0 && m_HighlightedLine<(int)m_HierTags.size() && m_HierTags[m_HighlightedLine].m_Var && !m_HierTags[m_HighlightedLine].m_Var->IsGroup() ) + { + m_Roto.m_Var = static_cast(m_HierTags[m_HighlightedLine].m_Var); + int y = m_PosY + m_VarY0 + m_HighlightedLine*(m_Font->m_CharHeight+m_Sep) + m_Font->m_CharHeight/2; + m_Roto.m_Origin = CPoint(p.x, y); //r.CenterPoint().y); + m_Roto.m_Current = p; + m_Roto.m_Active = true; + m_Roto.m_HasPrevious = false; + m_Roto.m_Angle0 = 0; + m_Roto.m_AngleDT = 0; + //SetCapture(); + + m_Roto.m_Value0 = RotoGetValue(); + m_Roto.m_CurrentValue = m_Roto.m_Value0; + m_Roto.m_ValueAngle0 = m_Roto.m_Value0; + m_Roto.m_PreciseValue = m_Roto.m_Value0; + //RotoSetValue(RotoGetSteppedValue()); Not here + //DrawManip(); + + m_Roto.m_Subdiv = m_RotoNbSubdiv; + // re-adjust m_Subdiv if needed: + double min=-DOUBLE_MAX, max=DOUBLE_MAX, step=1; + m_Roto.m_Var->MinMaxStepToDouble(&min, &max, &step); + if( fabs(step)>0 && min>-DOUBLE_MAX && maxRedrawWindow(); + } +} + +void CTwBar::RotoOnMButtonDown(int _X, int _Y) +{ + if( !m_Roto.m_Active ) + { + m_Roto.m_ActiveMiddle = true; + RotoOnLButtonDown(_X, _Y); + } +} + +void CTwBar::RotoOnMButtonUp(int _X, int _Y) +{ + if( m_Roto.m_ActiveMiddle ) + { + m_Roto.m_ActiveMiddle = false; + RotoOnLButtonUp(_X, _Y); + } +} + + diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/TwBar.h b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/TwBar.h new file mode 100644 index 00000000..bef32cee --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/TwBar.h @@ -0,0 +1,337 @@ +// --------------------------------------------------------------------------- +// +// @file TwBar.h +// @brief Tweak bar manager. +// @author Philippe Decaudin - http://www.antisphere.com +// @license This file is part of the AntTweakBar library. +// Copyright © 2005, 2006 Philippe Decaudin. +// For conditions of distribution and use, see License.txt +// +// notes: Private header +// TAB=4 +// +// --------------------------------------------------------------------------- + + +#if !defined ANT_TW_BAR_INCLUDED +#define ANT_TW_BAR_INCLUDED + +#include +#include "TwColors.h" + +#define ANT_TWEAK_BAR_DLL "AntTweakBar" + + +// --------------------------------------------------------------------------- + +struct CTwVar +{ + std::string m_Name; + std::string m_Label; + std::string m_Help; + bool m_IsRoot; + bool m_DontClip; + bool m_Visible; + signed short m_LeftMargin; + signed short m_TopMargin; + color32 m_Color; + + virtual bool IsGroup() const = 0; + virtual const CTwVar * Find(const char *_Name, struct CTwVarGroup **_Parent, int *_Index) const = 0; + virtual int HasAttrib(const char *_Attrib, bool *_HasValue) const; + virtual int SetAttrib(int _AttribID, const char *_Value, TwBar *_Bar, struct CTwVarGroup *_VarParent, int _VarIndex); + virtual void SetReadOnly(bool _ReadOnly) = 0; + CTwVar() { m_IsRoot = false; m_DontClip = false; m_Visible = true; m_LeftMargin = 0; m_TopMargin = 0; m_Color = COLOR32_BLACK; } + virtual ~CTwVar() {} + + static size_t GetDataSize(TwType _Type); +}; + + +struct CTwVarAtom : CTwVar +{ + ETwType m_Type; + void * m_Ptr; + TwSetVarCallback m_SetCallback; + TwGetVarCallback m_GetCallback; + TwButtonCallback m_ButtonCallback; + void * m_ClientData; + bool m_ReadOnly; + bool m_NoSlider; + int m_KeyIncr[2]; // [0]=key_code [1]=modifiers + int m_KeyDecr[2]; // [0]=key_code [1]=modifiers + + template struct TVal + { + _T m_Min; + _T m_Max; + _T m_Step; + signed char m_Precision; + bool m_Hexa; + }; + union UVal + { + TVal m_Char; + TVal m_Int8; + TVal m_UInt8; + TVal m_Int16; + TValm_UInt16; + TVal m_Int32; + TVal m_UInt32; + TVal m_Float32; + TVal m_Float64; + struct CBoolVal + { + char * m_TrueString; + char * m_FalseString; + bool m_FreeTrueString; + bool m_FreeFalseString; + } m_Bool; + struct CEnumVal // empty -> enum entries are deduced from m_Type + { + //typedef std::map CEntries; + //CEntries * m_Entries; + } m_Enum; + struct CShortcutVal + { + int m_Incr[2]; + int m_Decr[2]; + } m_Shortcut; + struct CHelpStruct + { + int m_StructType; + } m_HelpStruct; + }; + UVal m_Val; + + virtual bool IsGroup() const { return false; } + virtual void ValueToString(std::string *_Str) const; + virtual double ValueToDouble() const; + virtual void ValueFromDouble(double _Val); + virtual void MinMaxStepToDouble(double *_Min, double *_Max, double *_Step) const; + virtual const CTwVar * Find(const char *_Name, struct CTwVarGroup **_Parent, int *_Index) const; + virtual int HasAttrib(const char *_Attrib, bool *_HasValue) const; + virtual int SetAttrib(int _AttribID, const char *_Value, TwBar *_Bar, struct CTwVarGroup *_VarParent, int _VarIndex); + virtual void Increment(int _Step); + virtual void SetDefaults(); + virtual void SetReadOnly(bool _ReadOnly) { if(_ReadOnly || m_SetCallback || m_Ptr) m_ReadOnly=_ReadOnly; } + //virtual int DefineEnum(const TwEnumVal *_EnumValues, unsigned int _NbValues); + CTwVarAtom(); + virtual ~CTwVarAtom(); +}; + + +struct CTwVarGroup : CTwVar +{ + std::vector m_Vars; + bool m_Open; + TwSummaryCallback m_SummaryCallback; + void * m_SummaryClientData; + void * m_StructValuePtr; + TwType m_StructType; + + virtual bool IsGroup() const { return true; } + virtual const CTwVar * Find(const char *_Name, CTwVarGroup **_Parent, int *_Index) const; + virtual int HasAttrib(const char *_Attrib, bool *_HasValue) const; + virtual int SetAttrib(int _AttribID, const char *_Value, TwBar *_Bar, struct CTwVarGroup *_VarParent, int _VarIndex); + virtual CTwVarAtom * FindShortcut(int _Key, int _Modifiers, bool *_DoIncr); + virtual void SetReadOnly(bool _ReadOnly) { for(size_t i=0; iSetReadOnly(_ReadOnly); } + CTwVarGroup() { m_Open=false; m_StructType=TW_TYPE_UNDEF; m_SummaryCallback=NULL; m_SummaryClientData=NULL; m_StructValuePtr=NULL; } + virtual ~CTwVarGroup(); +}; + +// --------------------------------------------------------------------------- + +struct CTwBar +{ + std::string m_Name; + std::string m_Label; + std::string m_Help; + bool m_Visible; + int m_PosX; + int m_PosY; + int m_Width; + int m_Height; + color32 m_Color; + const CTexFont * m_Font; + int m_ValuesWidth; + int m_Sep; + int m_FirstLine; + float m_UpdatePeriod; + bool m_IsHelpBar; + int m_MinNumber; // accessed by TwDeleteBar + bool m_IsPopupList; + CTwVarAtom * m_VarEnumLinkedToPopupList; + CTwBar * m_BarLinkedToPopupList; + + CTwVarGroup m_VarRoot; + + void NotUpToDate(); + void Draw(); + const CTwVar * Find(const char *_Name, CTwVarGroup **_Parent=NULL, int *_Index=NULL) const; + CTwVar * Find(const char *_Name, CTwVarGroup **_Parent=NULL, int *_Index=NULL); + int HasAttrib(const char *_Attrib, bool *_HasValue) const; + int SetAttrib(int _AttribID, const char *_Value); + bool MouseMotion(int _X, int _Y); + bool MouseButton(ETwMouseButtonID _Button, bool _Pressed, int _X, int _Y); + bool MouseWheel(int _Pos, int _PrevPos, int _MouseX, int _MouseY); + bool KeyPressed(int _Key, int _Modifiers); + bool IsMinimized() const { return m_IsMinimized; } + bool Show(CTwVar *_Var); // display the line associated to _Var + bool OpenHier(CTwVarGroup *_Root, CTwVar *_Var); // open a hierarchy if it contains _Var + int LineInHier(CTwVarGroup *_Root, CTwVar *_Var); // returns the number of the line associated to _Var + void UnHighlightLine() { m_HighlightedLine = -1; NotUpToDate(); } // used by PopupCallback + CTwBar(const char *_Name); + ~CTwBar(); + + color32 m_ColBg, m_ColBg1, m_ColBg2; + color32 m_ColHighBg; + color32 m_ColLabelText; + color32 m_ColStructText; + color32 m_ColValBg; + color32 m_ColValText; + color32 m_ColValTextRO; + color32 m_ColValMin; + color32 m_ColValMax; + color32 m_ColStructBg; + color32 m_ColTitleBg; + color32 m_ColTitleHighBg; + color32 m_ColTitleText; + color32 m_ColTitleShadow; + color32 m_ColLine; + color32 m_ColLineShadow; + color32 m_ColUnderline; + color32 m_ColBtn; + color32 m_ColHighBtn; + color32 m_ColGrpBg; + color32 m_ColGrpText; + color32 m_ColHierBg; + color32 m_ColShortcutText; + color32 m_ColShortcutBg; + color32 m_ColInfoText; + color32 m_ColHelpBg; + color32 m_ColHelpText; + color32 m_ColRoto; + color32 m_ColRotoVal; + color32 m_ColRotoBound; + void UpdateColors(); + +protected: + int m_TitleWidth; + int m_VarX0; + int m_VarX1; + int m_VarX2; + int m_VarY0; + int m_VarY1; + int m_VarY2; + int m_ScrollYW; + int m_ScrollYH; + int m_ScrollY0; + int m_ScrollY1; + int m_NbHierLines; + int m_NbDisplayedLines; + bool m_UpToDate; + float m_LastUpdateTime; + void Update(); + + bool m_MouseDrag; + bool m_MouseDragVar; + bool m_MouseDragTitle; + bool m_MouseDragScroll; + bool m_MouseDragResizeUR; + bool m_MouseDragResizeUL; + bool m_MouseDragResizeLR; + bool m_MouseDragResizeLL; + bool m_MouseDragValWidth; + int m_MouseOriginX; + int m_MouseOriginY; + bool m_VarHasBeenIncr; + int m_FirstLine0; + int m_HighlightedLine; + int m_HighlightedLinePrev; + bool m_HighlightIncrBtn; + bool m_HighlightDecrBtn; + bool m_HighlightClickBtn; + bool m_HighlightTitle; + bool m_HighlightScroll; + bool m_HighlightUpScroll; + bool m_HighlightDnScroll; + bool m_HighlightMinimize; + bool m_HighlightFont; + bool m_HighlightValWidth; + bool m_DrawHandles; + + bool m_IsMinimized; + int m_MinPosX; + int m_MinPosY; + bool m_HighlightMaximize; + bool m_DrawIncrDecrBtn; + bool m_DrawClickBtn; + + struct CHierTag + { + CTwVar * m_Var; + int m_Level; + bool m_Closing; + }; + std::vector m_HierTags; + void BrowseHierarchy(int *_LineNum, int _CurrLevel, const CTwVar *_Var, int _First, int _Last); + void * m_TitleTextObj; + void * m_LabelsTextObj; + void * m_ValuesTextObj; + void * m_ShortcutTextObj; + int m_ShortcutLine; + void ListLabels(std::vector& _Labels, std::vector& _Colors, const CTexFont *_Font, int _AtomWidthMax, int _GroupWidthMax); + void ListValues(std::vector& _Values, std::vector& _Colors, std::vector& _BgColors, const CTexFont *_Font, int _WidthMax); + void DrawHierHandle(); + + // RotoSlider + struct CPoint + { + int x, y; + CPoint() {} + CPoint(int _X, int _Y):x(_X), y(_Y) {} + const CPoint operator+ (const CPoint& p) const { return CPoint(x+p.x, y+p.y); } + const CPoint operator- (const CPoint& p) const { return CPoint(x-p.x, y-p.y); } + }; + struct CRotoSlider + { + CRotoSlider(); + CTwVarAtom * m_Var; + double m_PreciseValue; + double m_CurrentValue; + double m_Value0; + double m_ValueAngle0; + bool m_Active; + bool m_ActiveMiddle; + CPoint m_Origin; + CPoint m_Current; + bool m_HasPrevious; + CPoint m_Previous; + double m_Angle0; + double m_AngleDT; + int m_Subdiv; + }; + CRotoSlider m_Roto; + int m_RotoMinRadius; + int m_RotoNbSubdiv; // number of steps for one turn + void RotoDraw(); + void RotoOnMouseMove(int _X, int _Y); + void RotoOnLButtonDown(int _X, int _Y); + void RotoOnLButtonUp(int _X, int _Y); + void RotoOnMButtonDown(int _X, int _Y); + void RotoOnMButtonUp(int _X, int _Y); + double RotoGetValue() const; + void RotoSetValue(double _Val); + double RotoGetMin() const; + double RotoGetMax() const; + double RotoGetStep() const; + double RotoGetSteppedValue() const; + + friend struct CTwMgr; +}; + +// --------------------------------------------------------------------------- + + +#endif // !defined ANT_TW_BAR_INCLUDED diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/TwColors.cpp b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/TwColors.cpp new file mode 100644 index 00000000..1fd9dd1c --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/TwColors.cpp @@ -0,0 +1,161 @@ +// --------------------------------------------------------------------------- +// +// @file TwColors.cpp +// @author Philippe Decaudin - http://www.antisphere.com +// @license This file is part of the AntTweakBar library. +// Copyright © 2005, 2006 Philippe Decaudin. +// For conditions of distribution and use, see License.txt +// +// note: TAB=4 +// +// --------------------------------------------------------------------------- + + +#include "TwPrecomp.h" + +#include "TwColors.h" + + +typedef float float32; +typedef int int32; + + +void ColorRGBToHLSf(float32 _R, float32 _G, float32 _B, float32 *_Hue, float32 *_Light, float32 *_Saturation) +{ + // Compute HLS from RGB. The r,g,b triplet is between [0,1], + // hue is between [0,360], light and saturation are [0,1]. + + float32 rnorm, gnorm, bnorm, minval, maxval, msum, mdiff, r, g, b; + r = g = b = 0; + if(_R>0) r = _R; if(r>1) r = 1; + if(_G>0) g = _G; if(g>1) g = 1; + if(_B>0) b = _B; if(b>1) b = 1; + + minval = r; + if(gmaxval) maxval = g; + if(b>maxval) maxval = b; + + rnorm = gnorm = bnorm = 0; + mdiff = maxval - minval; + msum = maxval + minval; + float32 l = 0.5f * msum; + if(_Light) + *_Light = l; + if(maxval!=minval) + { + rnorm = (maxval - r)/mdiff; + gnorm = (maxval - g)/mdiff; + bnorm = (maxval - b)/mdiff; + } + else + { + if(_Saturation) + *_Saturation = 0; + if(_Hue) + *_Hue = 0; + return; + } + + if(_Saturation) + { + if(l<0.5f) + *_Saturation = mdiff/msum; + else + *_Saturation = mdiff/(2.0f - msum); + } + + if(_Hue) + { + if(r==maxval) + *_Hue = 60.0f * (6.0f + bnorm - gnorm); + else if(g==maxval) + *_Hue = 60.0f * (2.0f + rnorm - bnorm); + else + *_Hue = 60.0f * (4.0f + gnorm - rnorm); + + if(*_Hue>360.0f) + *_Hue -= 360.0f; + } +} + + +void ColorRGBToHLSi(int32 _R, int32 _G, int32 _B, int32 *_Hue, int32 *_Light, int32 *_Saturation) +{ + float32 h, l, s; + ColorRGBToHLSf((1.0f/255.0f)*float32(_R), (1.0f/255.0f)*float32(_G), (1.0f/255.0f)*float32(_B), &h, &l, &s); + if(_Hue) *_Hue = (int32)TClamp(h*(256.0f/360.0f), 0.0f, 255.0f); + if(_Light) *_Light = (int32)TClamp(l*256.0f, 0.0f, 255.0f); + if(_Saturation) *_Saturation= (int32)TClamp(s*256.0f, 0.0f, 255.0f); +} + + +void ColorHLSToRGBf(float32 _Hue, float32 _Light, float32 _Saturation, float32 *_R, float32 *_G, float32 *_B) +{ + // Compute RGB from HLS. The light and saturation are between [0,1] + // and hue is between [0,360]. The returned r,g,b triplet is between [0,1]. + + // a local auxiliary function + struct CLocal + { + static float32 HLSToRGB(float32 _Rn1, float32 _Rn2, float32 _Huei) + { + float32 hue = _Huei; + if(hue>360) hue = hue - 360; + if(hue<0) hue = hue + 360; + if(hue<60 ) return _Rn1 + (_Rn2-_Rn1)*hue/60; + if(hue<180) return _Rn2; + if(hue<240) return _Rn1 + (_Rn2-_Rn1)*(240-hue)/60; + return _Rn1; + } + }; + + float32 rh, rl, rs, rm1, rm2; + rh = rl = rs = 0; + if(_Hue>0) rh = _Hue; if(rh>360) rh = 360; + if(_Light>0) rl = _Light; if(rl>1) rl = 1; + if(_Saturation>0) rs = _Saturation; if(rs>1) rs = 1; + + if(rl<=0.5f) + rm2 = rl*(1.0f + rs); + else + rm2 = rl + rs - rl*rs; + rm1 = 2.0f*rl - rm2; + + if(!rs) + { + if(_R) *_R = rl; + if(_G) *_G = rl; + if(_B) *_B = rl; + } + else + { + if(_R) *_R = CLocal::HLSToRGB(rm1, rm2, rh+120); + if(_G) *_G = CLocal::HLSToRGB(rm1, rm2, rh); + if(_B) *_B = CLocal::HLSToRGB(rm1, rm2, rh-120); + } +} + + +void ColorHLSToRGBi(int32 _Hue, int32 _Light, int32 _Saturation, int32 *_R, int32 *_G, int32 *_B) +{ + float32 r, g, b; + ColorHLSToRGBf((360.0f/255.0f)*float32(_Hue), (1.0f/255.0f)*float32(_Light), (1.0f/255.0f)*float32(_Saturation), &r, &g, &b); + if(_R) *_R = (int32)TClamp(r*256.0f, 0.0f, 255.0f); + if(_G) *_G = (int32)TClamp(g*256.0f, 0.0f, 255.0f); + if(_B) *_B = (int32)TClamp(b*256.0f, 0.0f, 255.0f); +} + + +color32 ColorBlend(color32 _Color1, color32 _Color2, float32 _S) +{ + float32 a1, r1, g1, b1, a2, r2, g2, b2; + Color32ToARGBf(_Color1, &a1, &r1, &g1, &b1); + Color32ToARGBf(_Color2, &a2, &r2, &g2, &b2); + float32 t = 1.0f-_S; + return Color32FromARGBf(t*a1+_S*a2, t*r1+_S*r2, t*g1+_S*g2, t*b1+_S*b2); +} + + diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/TwColors.h b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/TwColors.h new file mode 100644 index 00000000..48aca540 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/TwColors.h @@ -0,0 +1,81 @@ +// --------------------------------------------------------------------------- +// +// @file TwColors.h +// @brief Color conversions +// @author Philippe Decaudin - http://www.antisphere.com +// @license This file is part of the AntTweakBar library. +// Copyright © 2005, 2006 Philippe Decaudin. +// For conditions of distribution and use, see License.txt +// +// notes: Private header +// TAB=4 +// +// --------------------------------------------------------------------------- + + +#if !defined ANT_TW_COLORS_INCLUDED +#define ANT_TW_COLORS_INCLUDED + + +// --------------------------------------------------------------------------- + + +typedef unsigned int color32; + + +const color32 COLOR32_BLACK = 0xff000000; ///< Black color +const color32 COLOR32_WHITE = 0xffffffff; ///< White color +const color32 COLOR32_RED = 0xffff0000; ///< Red color +const color32 COLOR32_GREEN = 0xff00ff00; ///< Green color +const color32 COLOR32_BLUE = 0xff0000ff; ///< Blue color + + +template inline const _T& TClamp(const _T& _X, const _T& _Limit1, const _T& _Limit2) +{ + if( _Limit1<_Limit2 ) + return (_X<=_Limit1) ? _Limit1 : ( (_X>=_Limit2) ? _Limit2 : _X ); + else + return (_X<=_Limit2) ? _Limit2 : ( (_X>=_Limit1) ? _Limit1 : _X ); +} + +inline color32 Color32FromARGBi(int _A, int _R, int _G, int _B) +{ + return (((color32)TClamp(_A, 0, 255))<<24) | (((color32)TClamp(_R, 0, 255))<<16) | (((color32)TClamp(_G, 0, 255))<<8) | ((color32)TClamp(_B, 0, 255)); +} + +inline color32 Color32FromARGBf(float _A, float _R, float _G, float _B) +{ + return (((color32)TClamp(_A*256.0f, 0.0f, 255.0f))<<24) | (((color32)TClamp(_R*256.0f, 0.0f, 255.0f))<<16) | (((color32)TClamp(_G*256.0f, 0.0f, 255.0f))<<8) | ((color32)TClamp(_B*256.0f, 0.0f, 255.0f)); +} + +inline void Color32ToARGBi(color32 _Color, int *_A, int *_R, int *_G, int *_B) +{ + if(_A) *_A = (_Color>>24)&0xff; + if(_R) *_R = (_Color>>16)&0xff; + if(_G) *_G = (_Color>>8)&0xff; + if(_B) *_B = _Color&0xff; +} + +inline void Color32ToARGBf(color32 _Color, float *_A, float *_R, float *_G, float *_B) +{ + if(_A) *_A = (1.0f/255.0f)*float((_Color>>24)&0xff); + if(_R) *_R = (1.0f/255.0f)*float((_Color>>16)&0xff); + if(_G) *_G = (1.0f/255.0f)*float((_Color>>8)&0xff); + if(_B) *_B = (1.0f/255.0f)*float(_Color&0xff); +} + +void ColorRGBToHLSf(float _R, float _G, float _B, float *_Hue, float *_Light, float *_Saturation); + +void ColorRGBToHLSi(int _R, int _G, int _B, int *_Hue, int *_Light, int *_Saturation); + +void ColorHLSToRGBf(float _Hue, float _Light, float _Saturation, float *_R, float *_G, float *_B); + +void ColorHLSToRGBi(int _Hue, int _Light, int _Saturation, int *_R, int *_G, int *_B); + +color32 ColorBlend(color32 _Color1, color32 _Color2, float _S); + + +// --------------------------------------------------------------------------- + + +#endif // !defined ANT_TW_COLORS_INCLUDED diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/TwDirect3D9.cpp b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/TwDirect3D9.cpp new file mode 100644 index 00000000..6188bcc8 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/TwDirect3D9.cpp @@ -0,0 +1,674 @@ +// --------------------------------------------------------------------------- +// +// @file TwDirect3D9.cpp +// @author Philippe Decaudin - http://www.antisphere.com +// @license This file is part of the AntTweakBar library. +// Copyright © 2005, 2006 Philippe Decaudin. +// For conditions of distribution and use, see License.txt +// +// note: TAB=4 +// +// --------------------------------------------------------------------------- + + +#include "TwPrecomp.h" +#include "TwDirect3D9.h" +#include "TwMgr.h" + +#include +#ifdef _DEBUG + #include + #pragma comment(lib, "dxerr9") +#endif // _DEBUG + + +using namespace std; + +const char *g_ErrCantLoadD3D9 = "Cannot load Direct3D9 library dynamically"; +const char *g_ErrCantUnloadD3D9 = "Cannot unload Direct3D9 library"; + + +// --------------------------------------------------------------------------- + +static IDirect3DTexture9 *BindFont(IDirect3DDevice9 *_Dev, const CTexFont *_Font) +{ + assert(_Font!=NULL); + + IDirect3DTexture9 *Tex = NULL; + HRESULT hr = _Dev->CreateTexture(_Font->m_TexWidth, _Font->m_TexHeight, 1, 0, D3DFMT_A8R8G8B8, D3DPOOL_MANAGED, &Tex, NULL); + if( FAILED(hr) ) + return NULL; + + D3DLOCKED_RECT r; + hr = Tex->LockRect(0, &r, NULL, 0); + if( SUCCEEDED(hr) ) + { + color32 *p = static_cast(r.pBits); + for( int i=0; i<_Font->m_TexWidth*_Font->m_TexHeight; ++i, ++p ) + *p = 0x00ffffff | (((color32)(_Font->m_TexBytes[i]))<<24); + Tex->UnlockRect(0); + } + return Tex; +} + +// --------------------------------------------------------------------------- + +static void UnbindFont(IDirect3DDevice9 *_Dev, IDirect3DTexture9 *_Tex) +{ + (void)_Dev; + + if( _Tex ) + _Tex->Release(); +} + +// --------------------------------------------------------------------------- + +struct CState +{ + // viewport + D3DVIEWPORT9 m_Vp; + + // render states + DWORD m_Z; + DWORD m_CullMode; + DWORD m_AlphaTest; + DWORD m_AlphaBlend; + DWORD m_BlendOp; + DWORD m_SrcBlend; + DWORD m_DstBlend; + DWORD m_ClipPlane; + DWORD m_FillMode; + DWORD m_LastPixel; + DWORD m_Fog; + DWORD m_Stencil; + DWORD m_ColorWrite; + DWORD m_Scissor; + DWORD m_SeparateAlphaBlend; + DWORD m_AntiAliasedLine; + + // primitive + DWORD m_FVF; + IDirect3DVertexBuffer9 *m_StreamData; + IDirect3DVertexShader9 *m_VertexShader; + UINT m_StreamOffset; + UINT m_StreamStride; + + // texture + IDirect3DBaseTexture9 *m_Tex; + IDirect3DPixelShader9 *m_PixelShader; + + // texture stage states + DWORD m_ColorOp; + DWORD m_ColorArg1; + DWORD m_ColorArg2; + DWORD m_AlphaOp; + DWORD m_AlphaArg1; + DWORD m_TexCoordIndex; + DWORD m_TexTransfFlags; + DWORD m_AddressU; + DWORD m_AddressV; + DWORD m_MinFilter; + DWORD m_MagFilter; + DWORD m_MipFilter; + + // DeviceCaps (filled by constructor) + D3DCAPS9 m_Caps; + + void Save(); + void Restore(); + CState(IDirect3DDevice9 *_Dev); +private: + IDirect3DDevice9 *m_D3DDev; +}; + +CState::CState(IDirect3DDevice9 *_Dev) +{ + ZeroMemory(this, sizeof(CState)); + m_D3DDev = _Dev; + + m_D3DDev->GetDeviceCaps(&m_Caps); +} + +void CState::Save() +{ + // viewport + m_D3DDev->GetViewport(&m_Vp); + + // render states + m_D3DDev->GetRenderState(D3DRS_ZENABLE, &m_Z); + m_D3DDev->GetRenderState(D3DRS_CULLMODE, &m_CullMode); + m_D3DDev->GetRenderState(D3DRS_ALPHATESTENABLE, &m_AlphaTest); + m_D3DDev->GetRenderState(D3DRS_ALPHABLENDENABLE, &m_AlphaBlend); + m_D3DDev->GetRenderState(D3DRS_BLENDOP, &m_BlendOp); + m_D3DDev->GetRenderState(D3DRS_SRCBLEND, &m_SrcBlend); + m_D3DDev->GetRenderState(D3DRS_DESTBLEND, &m_DstBlend); + m_D3DDev->GetRenderState(D3DRS_CLIPPLANEENABLE, &m_ClipPlane); + m_D3DDev->GetRenderState(D3DRS_FILLMODE, &m_FillMode); + m_D3DDev->GetRenderState(D3DRS_LASTPIXEL, &m_LastPixel); + m_D3DDev->GetRenderState(D3DRS_FOGENABLE, &m_Fog); + m_D3DDev->GetRenderState(D3DRS_STENCILENABLE, &m_Stencil); + m_D3DDev->GetRenderState(D3DRS_COLORWRITEENABLE, &m_ColorWrite); + m_D3DDev->GetRenderState(D3DRS_SCISSORTESTENABLE, &m_Scissor); + if( m_Caps.PrimitiveMiscCaps & D3DPMISCCAPS_SEPARATEALPHABLEND ) + m_D3DDev->GetRenderState(D3DRS_SEPARATEALPHABLENDENABLE, &m_SeparateAlphaBlend); + //if( m_Caps.LineCaps & D3DLINECAPS_ANTIALIAS ) + m_D3DDev->GetRenderState(D3DRS_ANTIALIASEDLINEENABLE, &m_AntiAliasedLine); + + // primitive + m_D3DDev->GetFVF(&m_FVF); + m_D3DDev->GetStreamSource(0, &m_StreamData, &m_StreamOffset, &m_StreamStride); + m_D3DDev->GetVertexShader(&m_VertexShader); + + // texture + m_D3DDev->GetTexture(0, &m_Tex); + m_D3DDev->GetPixelShader(&m_PixelShader); + + // texture stage states + m_D3DDev->GetTextureStageState(0, D3DTSS_COLOROP, &m_ColorOp); + m_D3DDev->GetTextureStageState(0, D3DTSS_COLORARG1, &m_ColorArg1); + m_D3DDev->GetTextureStageState(0, D3DTSS_COLORARG2, &m_ColorArg2); + m_D3DDev->GetTextureStageState(0, D3DTSS_ALPHAOP, &m_AlphaOp); + m_D3DDev->GetTextureStageState(0, D3DTSS_ALPHAARG1, &m_AlphaArg1); + m_D3DDev->GetTextureStageState(0, D3DTSS_TEXCOORDINDEX, &m_TexCoordIndex); + m_D3DDev->GetTextureStageState(0, D3DTSS_TEXTURETRANSFORMFLAGS, &m_TexTransfFlags); + m_D3DDev->GetSamplerState(0, D3DSAMP_ADDRESSU, &m_AddressU); + m_D3DDev->GetSamplerState(0, D3DSAMP_ADDRESSV, &m_AddressV); + m_D3DDev->GetSamplerState(0, D3DSAMP_MAGFILTER, &m_MagFilter); + m_D3DDev->GetSamplerState(0, D3DSAMP_MINFILTER, &m_MinFilter); + m_D3DDev->GetSamplerState(0, D3DSAMP_MIPFILTER, &m_MipFilter); +} + +void CState::Restore() +{ + // viewport + m_D3DDev->SetViewport(&m_Vp); + + // render states + m_D3DDev->SetRenderState(D3DRS_ZENABLE, m_Z); + m_D3DDev->SetRenderState(D3DRS_CULLMODE, m_CullMode); + m_D3DDev->SetRenderState(D3DRS_ALPHATESTENABLE, m_AlphaTest); + m_D3DDev->SetRenderState(D3DRS_ALPHABLENDENABLE, m_AlphaBlend); + m_D3DDev->SetRenderState(D3DRS_BLENDOP, m_BlendOp); + m_D3DDev->SetRenderState(D3DRS_SRCBLEND, m_SrcBlend); + m_D3DDev->SetRenderState(D3DRS_DESTBLEND, m_DstBlend); + m_D3DDev->SetRenderState(D3DRS_CLIPPLANEENABLE, m_ClipPlane); + m_D3DDev->SetRenderState(D3DRS_FILLMODE, m_FillMode); + m_D3DDev->SetRenderState(D3DRS_LASTPIXEL, m_LastPixel); + m_D3DDev->SetRenderState(D3DRS_FOGENABLE, m_Fog); + m_D3DDev->SetRenderState(D3DRS_STENCILENABLE, m_Stencil); + m_D3DDev->SetRenderState(D3DRS_COLORWRITEENABLE, m_ColorWrite); + m_D3DDev->SetRenderState(D3DRS_SCISSORTESTENABLE, m_Scissor); + if( m_Caps.PrimitiveMiscCaps & D3DPMISCCAPS_SEPARATEALPHABLEND ) + m_D3DDev->SetRenderState(D3DRS_SEPARATEALPHABLENDENABLE, m_SeparateAlphaBlend); + //if( m_Caps.LineCaps & D3DLINECAPS_ANTIALIAS ) + m_D3DDev->SetRenderState(D3DRS_ANTIALIASEDLINEENABLE, m_AntiAliasedLine); + + // primitive + m_D3DDev->SetFVF(m_FVF); + m_D3DDev->SetStreamSource(0, m_StreamData, m_StreamOffset, m_StreamStride); + if( m_StreamData ) + m_StreamData->Release(); + m_D3DDev->SetVertexShader(m_VertexShader); + if( m_VertexShader ) + m_VertexShader->Release(); + + // texture + m_D3DDev->SetTexture(0, m_Tex); + if( m_Tex ) + m_Tex->Release(); + m_D3DDev->SetPixelShader(m_PixelShader); + if( m_PixelShader ) + m_PixelShader->Release(); + + // texture stage states + m_D3DDev->SetTextureStageState(0, D3DTSS_COLOROP, m_ColorOp); + m_D3DDev->SetTextureStageState(0, D3DTSS_COLORARG1, m_ColorArg1); + m_D3DDev->SetTextureStageState(0, D3DTSS_COLORARG2, m_ColorArg2); + m_D3DDev->SetTextureStageState(0, D3DTSS_ALPHAOP, m_AlphaOp); + m_D3DDev->SetTextureStageState(0, D3DTSS_ALPHAARG1, m_AlphaArg1); + m_D3DDev->SetTextureStageState(0, D3DTSS_TEXCOORDINDEX, m_TexCoordIndex); + m_D3DDev->SetTextureStageState(0, D3DTSS_TEXTURETRANSFORMFLAGS, m_TexTransfFlags); + m_D3DDev->SetSamplerState(0, D3DSAMP_ADDRESSU, m_AddressU); + m_D3DDev->SetSamplerState(0, D3DSAMP_ADDRESSV, m_AddressV); + m_D3DDev->SetSamplerState(0, D3DSAMP_MAGFILTER, m_MagFilter); + m_D3DDev->SetSamplerState(0, D3DSAMP_MINFILTER, m_MinFilter); + m_D3DDev->SetSamplerState(0, D3DSAMP_MIPFILTER, m_MipFilter); +} + +// --------------------------------------------------------------------------- + +int CTwGraphDirect3D9::Init() +{ + assert(g_TwMgr->m_Device!=NULL); + + m_D3DDev = static_cast(g_TwMgr->m_Device); + m_Drawing = false; + m_FontTex = NULL; + m_FontD3DTex = NULL; + D3DDEVICE_CREATION_PARAMETERS cp; + m_D3DDev->GetCreationParameters(&cp); + m_PureDevice = ( cp.BehaviorFlags & D3DCREATE_PUREDEVICE ) ? true : false; + m_WndWidth = 0; + m_WndHeight = 0; + m_State = new CState(m_D3DDev); + + return 1; +} + +// --------------------------------------------------------------------------- + +int CTwGraphDirect3D9::Shut() +{ + assert(m_Drawing==false); + + UnbindFont(m_D3DDev, m_FontD3DTex); + m_FontD3DTex = NULL; + delete m_State; + m_State = NULL; + m_D3DDev = NULL; + + return 1; +} + +// --------------------------------------------------------------------------- + +void CTwGraphDirect3D9::BeginDraw(int _WndWidth, int _WndHeight) +{ + assert(m_Drawing==false && _WndWidth>0 && _WndHeight>0); + m_Drawing = true; + + m_WndWidth = _WndWidth; + m_WndHeight = _WndHeight; + + // save context + if( !m_PureDevice ) + m_State->Save(); + + if( m_WndWidth>0 && m_WndHeight>0 ) + { + D3DVIEWPORT9 Vp; + Vp.X = 0; + Vp.Y = 0; + Vp.Width = m_WndWidth; + Vp.Height = m_WndHeight; + Vp.MinZ = 0; + Vp.MaxZ = 1; + m_D3DDev->SetViewport(&Vp); + + //D3DMATRIX Transfo = { 2.0f/_WndWidth,0,0,0, 0,2.0f/_WndHeight,0,0, 0,0,-1,0, 0,0,0,1 }; + //m_D3DDev->SetTransform(D3DTS_PROJECTION, &Transfo); + } + // const D3DMATRIX id = { 1,0,0,0, 0,1,0,0, 0,0,1,0, 0,0,0,1 }; + // m_D3DDev->SetTransform(D3DTS_VIEW, &id); + // m_D3DDev->SetTransform(D3DTS_WORLD, &id); + // m_D3DDev->SetTransform(D3DTS_TEXTURE0, &id); + + m_D3DDev->SetRenderState(D3DRS_ZENABLE, D3DZB_FALSE); + m_D3DDev->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE); + m_D3DDev->SetRenderState(D3DRS_ALPHATESTENABLE, FALSE); + m_D3DDev->SetRenderState(D3DRS_ALPHABLENDENABLE, TRUE); + m_D3DDev->SetRenderState(D3DRS_BLENDOP, D3DBLENDOP_ADD); + m_D3DDev->SetRenderState(D3DRS_SRCBLEND, D3DBLEND_SRCALPHA); + m_D3DDev->SetRenderState(D3DRS_DESTBLEND, D3DBLEND_INVSRCALPHA); + m_D3DDev->SetRenderState(D3DRS_CLIPPLANEENABLE, 0); + m_D3DDev->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID); + m_D3DDev->SetRenderState(D3DRS_LASTPIXEL, FALSE); + m_D3DDev->SetRenderState(D3DRS_FOGENABLE, FALSE); + m_D3DDev->SetRenderState(D3DRS_STENCILENABLE, FALSE); + m_D3DDev->SetRenderState(D3DRS_COLORWRITEENABLE, 0x0000000F); + m_D3DDev->SetRenderState(D3DRS_SCISSORTESTENABLE, FALSE); + if( m_State->m_Caps.PrimitiveMiscCaps & D3DPMISCCAPS_SEPARATEALPHABLEND ) + m_D3DDev->SetRenderState(D3DRS_SEPARATEALPHABLENDENABLE, FALSE); + //if( m_State->m_Caps.LineCaps & D3DLINECAPS_ANTIALIAS ) + m_D3DDev->SetRenderState(D3DRS_ANTIALIASEDLINEENABLE, FALSE); + + m_D3DDev->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE); + m_D3DDev->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE); + m_D3DDev->SetTextureStageState(0, D3DTSS_COLORARG2, D3DTA_DIFFUSE); + m_D3DDev->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1); + m_D3DDev->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE); + m_D3DDev->SetTextureStageState(0, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_PASSTHRU); + m_D3DDev->SetTextureStageState(0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_DISABLE); + m_D3DDev->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_CLAMP); + m_D3DDev->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_CLAMP); + m_D3DDev->SetSamplerState(0, D3DSAMP_MAGFILTER, D3DTEXF_POINT); + m_D3DDev->SetSamplerState(0, D3DSAMP_MINFILTER, D3DTEXF_POINT); + m_D3DDev->SetSamplerState(0, D3DSAMP_MIPFILTER, D3DTEXF_NONE); + + m_D3DDev->SetVertexShader(NULL); + m_D3DDev->SetPixelShader(NULL); +} + +// --------------------------------------------------------------------------- + +void CTwGraphDirect3D9::EndDraw() +{ + assert(m_Drawing==true); + m_Drawing = false; + + // restore context + if( !m_PureDevice ) + m_State->Restore(); + + /* + _glPolygonMode(GL_FRONT, m_PrevPolygonMode[0]); + _glPolygonMode(GL_BACK, m_PrevPolygonMode[1]); + _glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, m_PrevTexEnv); + _glLineWidth(m_PrevLineWidth); + _glMatrixMode(GL_PROJECTION); + _glPopMatrix(); + _glMatrixMode(GL_MODELVIEW); + _glPopMatrix(); + _glMatrixMode(GL_TEXTURE); + _glPopMatrix(); + _glPopClientAttrib(); + _glPopAttrib(); + */ +} + +// --------------------------------------------------------------------------- + +bool CTwGraphDirect3D9::IsDrawing() +{ + return m_Drawing; +} + +// --------------------------------------------------------------------------- + +void CTwGraphDirect3D9::Restore() +{ + + UnbindFont(m_D3DDev, m_FontD3DTex); + m_FontD3DTex = NULL; + + m_FontTex = NULL; +} + + +// --------------------------------------------------------------------------- + +void CTwGraphDirect3D9::DrawLine(int _X0, int _Y0, int _X1, int _Y1, color32 _Color0, color32 _Color1, bool _AntiAliased) +{ + assert(m_Drawing==true); + + struct CVtx + { + float m_Pos[4]; + DWORD m_Color; + }; + CVtx p[2]; + + p[0].m_Pos[0] = (float)_X0; + p[0].m_Pos[1] = (float)_Y0; + p[0].m_Pos[2] = 0; + p[0].m_Pos[3] = 0; + p[0].m_Color = _Color0; + + p[1].m_Pos[0] = (float)_X1; + p[1].m_Pos[1] = (float)_Y1; + p[1].m_Pos[2] = 0; + p[1].m_Pos[3] = 0; + p[1].m_Color = _Color1; + + //if( m_State->m_Caps.LineCaps & D3DLINECAPS_ANTIALIAS ) + m_D3DDev->SetRenderState(D3DRS_ANTIALIASEDLINEENABLE, (_AntiAliased ? TRUE : FALSE)); + m_D3DDev->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_DISABLE); + m_D3DDev->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_DISABLE); + m_D3DDev->SetFVF(D3DFVF_XYZRHW|D3DFVF_DIFFUSE); + m_D3DDev->DrawPrimitiveUP(D3DPT_LINELIST, 1, p, sizeof(CVtx)); + //if( m_State->m_Caps.LineCaps & D3DLINECAPS_ANTIALIAS ) + m_D3DDev->SetRenderState(D3DRS_ANTIALIASEDLINEENABLE, FALSE); +} + +// --------------------------------------------------------------------------- + +void CTwGraphDirect3D9::DrawRect(int _X0, int _Y0, int _X1, int _Y1, color32 _Color00, color32 _Color10, color32 _Color01, color32 _Color11) +{ + assert(m_Drawing==true); + + // border adjustment + if(_X0<_X1) + ++_X1; + else if(_X0>_X1) + ++_X0; + if(_Y0<_Y1) + ++_Y1; + else if(_Y0>_Y1) + ++_Y0; + + struct CVtx + { + float m_Pos[4]; + DWORD m_Color; + }; + CVtx p[4]; + + p[0].m_Pos[0] = (float)_X1; + p[0].m_Pos[1] = (float)_Y0; + p[0].m_Pos[2] = 0; + p[0].m_Pos[3] = 1; + p[0].m_Color = _Color10; + + p[1].m_Pos[0] = (float)_X0; + p[1].m_Pos[1] = (float)_Y0; + p[1].m_Pos[2] = 0; + p[1].m_Pos[3] = 1; + p[1].m_Color = _Color00; + + p[2].m_Pos[0] = (float)_X1; + p[2].m_Pos[1] = (float)_Y1; + p[2].m_Pos[2] = 0; + p[2].m_Pos[3] = 1; + p[2].m_Color = _Color11; + + p[3].m_Pos[0] = (float)_X0; + p[3].m_Pos[1] = (float)_Y1; + p[3].m_Pos[2] = 0; + p[3].m_Pos[3] = 1; + p[3].m_Color = _Color01; + + m_D3DDev->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_DISABLE); + m_D3DDev->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_DISABLE); + m_D3DDev->SetFVF(D3DFVF_XYZRHW|D3DFVF_DIFFUSE); + m_D3DDev->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP, 2, p, sizeof(CVtx)); +} + +// --------------------------------------------------------------------------- + +void *CTwGraphDirect3D9::NewTextObj() +{ + return new CTextObj; +} + +// --------------------------------------------------------------------------- + +void CTwGraphDirect3D9::DeleteTextObj(void *_TextObj) +{ + assert(_TextObj!=NULL); + delete static_cast(_TextObj); +} + +// --------------------------------------------------------------------------- + +void CTwGraphDirect3D9::BuildText(void *_TextObj, const std::string *_TextLines, color32 *_LineColors, color32 *_LineBgColors, int _NbLines, const CTexFont *_Font, int _Sep, int _BgWidth) +{ + assert(m_Drawing==true); + assert(_TextObj!=NULL); + assert(_Font!=NULL); + + if( _Font != m_FontTex ) + { + UnbindFont(m_D3DDev, m_FontD3DTex); + m_FontD3DTex = BindFont(m_D3DDev, _Font); + m_FontTex = _Font; + } + + CTextObj *TextObj = static_cast(_TextObj); + TextObj->m_TextVerts.resize(0); + TextObj->m_BgVerts.resize(0); + TextObj->m_LineColors = (_LineColors!=NULL); + TextObj->m_LineBgColors = (_LineBgColors!=NULL); + + int x, x1, y, y1, i, Len; + unsigned char ch; + const unsigned char *Text; + color32 LineColor = COLOR32_RED; + CTextVtx Vtx; + Vtx.m_Pos[2] = 0; + Vtx.m_Pos[3] = 1; + CBgVtx BgVtx; + BgVtx.m_Pos[2] = 0; + BgVtx.m_Pos[3] = 1; + for( int Line=0; Line<_NbLines; ++Line ) + { + x = 0; + y = Line * (_Font->m_CharHeight+_Sep); + y1 = y+_Font->m_CharHeight; + Len = (int)_TextLines[Line].length(); + Text = (const unsigned char *)(_TextLines[Line].c_str()); + if( _LineColors!=NULL ) + LineColor = _LineColors[Line]; + + for( i=0; im_CharWidth[ch]; + + Vtx.m_Color = LineColor; + + Vtx.m_Pos[0] = (float)x; + Vtx.m_Pos[1] = (float)y; + Vtx.m_UV [0] = _Font->m_CharU0[ch]; + Vtx.m_UV [1] = _Font->m_CharV0[ch]; + TextObj->m_TextVerts.push_back(Vtx); + + Vtx.m_Pos[0] = (float)x1; + Vtx.m_Pos[1] = (float)y; + Vtx.m_UV [0] = _Font->m_CharU1[ch]; + Vtx.m_UV [1] = _Font->m_CharV0[ch]; + TextObj->m_TextVerts.push_back(Vtx); + + Vtx.m_Pos[0] = (float)x; + Vtx.m_Pos[1] = (float)y1; + Vtx.m_UV [0] = _Font->m_CharU0[ch]; + Vtx.m_UV [1] = _Font->m_CharV1[ch]; + TextObj->m_TextVerts.push_back(Vtx); + + Vtx.m_Pos[0] = (float)x1; + Vtx.m_Pos[1] = (float)y; + Vtx.m_UV [0] = _Font->m_CharU1[ch]; + Vtx.m_UV [1] = _Font->m_CharV0[ch]; + TextObj->m_TextVerts.push_back(Vtx); + + Vtx.m_Pos[0] = (float)x1; + Vtx.m_Pos[1] = (float)y1; + Vtx.m_UV [0] = _Font->m_CharU1[ch]; + Vtx.m_UV [1] = _Font->m_CharV1[ch]; + TextObj->m_TextVerts.push_back(Vtx); + + Vtx.m_Pos[0] = (float)x; + Vtx.m_Pos[1] = (float)y1; + Vtx.m_UV [0] = _Font->m_CharU0[ch]; + Vtx.m_UV [1] = _Font->m_CharV1[ch]; + TextObj->m_TextVerts.push_back(Vtx); + + x = x1; + } + if( _BgWidth>0 && Len>0 ) + { + if( _LineBgColors!=NULL ) + BgVtx.m_Color = _LineBgColors[Line]; + else + BgVtx.m_Color = COLOR32_BLACK; + + BgVtx.m_Pos[0] = -1; + BgVtx.m_Pos[1] = (float)y; + TextObj->m_BgVerts.push_back(BgVtx); + + BgVtx.m_Pos[0] = (float)(_BgWidth+1); + BgVtx.m_Pos[1] = (float)y; + TextObj->m_BgVerts.push_back(BgVtx); + + BgVtx.m_Pos[0] = -1; + BgVtx.m_Pos[1] = (float)y1; + TextObj->m_BgVerts.push_back(BgVtx); + + BgVtx.m_Pos[0] = (float)(_BgWidth+1); + BgVtx.m_Pos[1] = (float)y; + TextObj->m_BgVerts.push_back(BgVtx); + + BgVtx.m_Pos[0] = (float)(_BgWidth+1); + BgVtx.m_Pos[1] = (float)y1; + TextObj->m_BgVerts.push_back(BgVtx); + + BgVtx.m_Pos[0] = -1; + BgVtx.m_Pos[1] = (float)y1; + TextObj->m_BgVerts.push_back(BgVtx); + } + } + +} + +// --------------------------------------------------------------------------- + +void CTwGraphDirect3D9::DrawText(void *_TextObj, int _X, int _Y, color32 _Color, color32 _BgColor) +{ + assert(m_Drawing==true); + assert(_TextObj!=NULL); + CTextObj *TextObj = static_cast(_TextObj); + float x = (float)_X; + float y = (float)_Y; + + int nv = (int)TextObj->m_TextVerts.size(); + if( nv<4 ) + return; // no character to draw + + int i; + int nb = (int)TextObj->m_BgVerts.size(); + + if( nb>=4 ) + { + for( i=0; im_BgVerts[i].m_Pos[0] += x; + TextObj->m_BgVerts[i].m_Pos[1] += y; + if( _BgColor!=0 || !TextObj->m_LineBgColors ) + TextObj->m_BgVerts[i].m_Color = _BgColor; + } + + m_D3DDev->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_DISABLE); + m_D3DDev->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_DISABLE); + m_D3DDev->SetFVF(D3DFVF_XYZRHW|D3DFVF_DIFFUSE); + m_D3DDev->DrawPrimitiveUP(D3DPT_TRIANGLELIST, nb/3, &(TextObj->m_BgVerts[0]), sizeof(CBgVtx)); + + for( i=0; im_BgVerts[i].m_Pos[0] -= x; + TextObj->m_BgVerts[i].m_Pos[1] -= y; + } + } + + for( i=0; im_TextVerts[i].m_Pos[0] += x; + TextObj->m_TextVerts[i].m_Pos[1] += y; + } + if( _Color!=0 || !TextObj->m_LineColors ) + for( i=0; im_TextVerts[i].m_Color = _Color; + + m_D3DDev->SetTexture(0, m_FontD3DTex); + m_D3DDev->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_MODULATE); + m_D3DDev->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1); + m_D3DDev->SetFVF(D3DFVF_XYZRHW|D3DFVF_DIFFUSE|D3DFVF_TEX1|D3DFVF_TEXCOORDSIZE2(0)); + m_D3DDev->DrawPrimitiveUP(D3DPT_TRIANGLELIST, nv/3, &(TextObj->m_TextVerts[0]), sizeof(CTextVtx)); + + for( i=0; im_TextVerts[i].m_Pos[0] -= x; + TextObj->m_TextVerts[i].m_Pos[1] -= y; + } + +} + +// --------------------------------------------------------------------------- diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/TwDirect3D9.h b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/TwDirect3D9.h new file mode 100644 index 00000000..785c42b7 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/TwDirect3D9.h @@ -0,0 +1,77 @@ +// --------------------------------------------------------------------------- +// +// @file TwDirect3D9.h +// @brief Direct3D9 graph functions +// @author Philippe Decaudin - http://www.antisphere.com +// @license This file is part of the AntTweakBar library. +// Copyright © 2005, 2006 Philippe Decaudin. +// For conditions of distribution and use, see License.txt +// +// notes: Private header +// TAB=4 +// +// --------------------------------------------------------------------------- + + +#if !defined ANT_TW_DIRECT3D9_INCLUDED +#define ANT_TW_DIRECT3D9_INCLUDED + +#include "TwGraph.h" + +// --------------------------------------------------------------------------- + +class CTwGraphDirect3D9 : public ITwGraph +{ +public: + virtual int Init(); + virtual int Shut(); + virtual void BeginDraw(int _WndWidth, int _WndHeight); + virtual void EndDraw(); + virtual bool IsDrawing(); + virtual void Restore(); + virtual void DrawLine(int _X0, int _Y0, int _X1, int _Y1, color32 _Color0, color32 _Color1, bool _AntiAliased=false); + virtual void DrawLine(int _X0, int _Y0, int _X1, int _Y1, color32 _Color, bool _AntiAliased=false) { DrawLine(_X0, _Y0, _X1, _Y1, _Color, _Color, _AntiAliased); } + virtual void DrawRect(int _X0, int _Y0, int _X1, int _Y1, color32 _Color00, color32 _Color10, color32 _Color01, color32 _Color11); + virtual void DrawRect(int _X0, int _Y0, int _X1, int _Y1, color32 _Color) { DrawRect(_X0, _Y0, _X1, _Y1, _Color, _Color, _Color, _Color); } + + virtual void * NewTextObj(); + virtual void DeleteTextObj(void *_TextObj); + virtual void BuildText(void *_TextObj, const std::string *_TextLines, color32 *_LineColors, color32 *_LineBgColors, int _NbLines, const CTexFont *_Font, int _Sep, int _BgWidth); + virtual void DrawText(void *_TextObj, int _X, int _Y, color32 _Color, color32 _BgColor); + +protected: + struct IDirect3DDevice9 * m_D3DDev; + bool m_Drawing; + const CTexFont * m_FontTex; + struct IDirect3DTexture9 * m_FontD3DTex; + bool m_PureDevice; + int m_WndWidth; + int m_WndHeight; + + struct CTextVtx + { + float m_Pos[4]; + color32 m_Color; + float m_UV[2]; + }; + struct CBgVtx + { + float m_Pos[4]; + color32 m_Color; + }; + + struct CTextObj + { + std::vector m_TextVerts; + std::vector m_BgVerts; + bool m_LineColors; + bool m_LineBgColors; + }; + + struct CState * m_State; +}; + +// --------------------------------------------------------------------------- + + +#endif // !defined ANT_TW_DIRECT3D9_INCLUDED diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/TwEventGLFW.c b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/TwEventGLFW.c new file mode 100644 index 00000000..d1158bfc --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/TwEventGLFW.c @@ -0,0 +1,191 @@ +// --------------------------------------------------------------------------- +// +// @file TwEventGLFW.c +// @brief Helper: +// translate and re-send mouse and keyboard events +// from GLFW event callbacks to AntTweakBar +// +// @author Philippe Decaudin - http://www.antisphere.com +// @date 2006/05/10 +// @license This file is part of the AntTweakBar library. +// Copyright © 2005, 2006 Philippe Decaudin. +// For conditions of distribution and use, see License.txt +// +// note: TAB=4 +// +// --------------------------------------------------------------------------- + +#include +#include + + +int TW_CALL TwEventMouseButtonGLFW(int glfwButton, int glfwAction) +{ + int handled = 0; + TwMouseAction action = (glfwAction==GLFW_PRESS) ? TW_MOUSE_PRESSED : TW_MOUSE_RELEASED; + + if( glfwButton==GLFW_MOUSE_BUTTON_LEFT ) + handled = TwMouseButton(action, TW_MOUSE_LEFT); + else if( glfwButton==GLFW_MOUSE_BUTTON_RIGHT ) + handled = TwMouseButton(action, TW_MOUSE_RIGHT); + else if( glfwButton==GLFW_MOUSE_BUTTON_MIDDLE ) + handled = TwMouseButton(action, TW_MOUSE_MIDDLE); + + return handled; +} + + +int g_KMod = 0; + + +int TW_CALL TwEventKeyGLFW(int glfwKey, int glfwAction) +{ + int handled = 0; + + // Register of modifiers state + if( glfwAction==GLFW_PRESS ) + { + switch( glfwKey ) + { + case GLFW_KEY_LSHIFT: + case GLFW_KEY_RSHIFT: + g_KMod |= TW_KMOD_SHIFT; + break; + case GLFW_KEY_LCTRL: + case GLFW_KEY_RCTRL: + g_KMod |= TW_KMOD_CTRL; + break; + case GLFW_KEY_LALT: + case GLFW_KEY_RALT: + g_KMod |= TW_KMOD_ALT; + break; + } + } + else + { + switch( glfwKey ) + { + case GLFW_KEY_LSHIFT: + case GLFW_KEY_RSHIFT: + g_KMod &= ~TW_KMOD_SHIFT; + break; + case GLFW_KEY_LCTRL: + case GLFW_KEY_RCTRL: + g_KMod &= ~TW_KMOD_CTRL; + break; + case GLFW_KEY_LALT: + case GLFW_KEY_RALT: + g_KMod &= ~TW_KMOD_ALT; + break; + } + } + + // Process key pressed + if( glfwAction==GLFW_PRESS ) + { + int mod = g_KMod; + int testkp = ((mod&TW_KMOD_CTRL) || (mod&TW_KMOD_ALT)) ? 1 : 0; + + if( (mod&TW_KMOD_CTRL) && glfwKey>0 && glfwKey=GLFW_KEY_SPECIAL ) + { + int k = 0; + + if( glfwKey>=GLFW_KEY_F1 && glfwKey<=GLFW_KEY_F15 ) + k = TW_KEY_F1 + (glfwKey-GLFW_KEY_F1); + else if( testkp && glfwKey>=GLFW_KEY_KP_0 && glfwKey<=GLFW_KEY_KP_9 ) + k = '0' + (glfwKey-GLFW_KEY_KP_0); + else + { + switch( glfwKey ) + { + case GLFW_KEY_ESC: + k = TW_KEY_ESCAPE; + break; + case GLFW_KEY_UP: + k = TW_KEY_UP; + break; + case GLFW_KEY_DOWN: + k = TW_KEY_DOWN; + break; + case GLFW_KEY_LEFT: + k = TW_KEY_LEFT; + break; + case GLFW_KEY_RIGHT: + k = TW_KEY_RIGHT; + break; + case GLFW_KEY_TAB: + k = TW_KEY_TAB; + break; + case GLFW_KEY_ENTER: + k = TW_KEY_RETURN; + break; + case GLFW_KEY_BACKSPACE: + k = TW_KEY_BACKSPACE; + break; + case GLFW_KEY_INSERT: + k = TW_KEY_INSERT; + break; + case GLFW_KEY_DEL: + k = TW_KEY_DELETE; + break; + case GLFW_KEY_PAGEUP: + k = TW_KEY_PAGE_UP; + break; + case GLFW_KEY_PAGEDOWN: + k = TW_KEY_PAGE_DOWN; + break; + case GLFW_KEY_HOME: + k = TW_KEY_HOME; + break; + case GLFW_KEY_END: + k = TW_KEY_END; + break; + case GLFW_KEY_KP_ENTER: + k = TW_KEY_RETURN; + break; + case GLFW_KEY_KP_DIVIDE: + if( testkp ) + k = '/'; + break; + case GLFW_KEY_KP_MULTIPLY: + if( testkp ) + k = '*'; + break; + case GLFW_KEY_KP_SUBTRACT: + if( testkp ) + k = '-'; + break; + case GLFW_KEY_KP_ADD: + if( testkp ) + k = '+'; + break; + case GLFW_KEY_KP_DECIMAL: + if( testkp ) + k = '.'; + break; + case GLFW_KEY_KP_EQUAL: + if( testkp ) + k = '='; + break; + } + } + + if( k>0 ) + handled = TwKeyPressed(k, mod); + } + } + + return handled; +} + + +int TW_CALL TwEventCharGLFW(int glfwChar, int glfwAction) +{ + if( glfwAction==GLFW_PRESS && (glfwChar & 0xff00)==0 ) + return TwKeyPressed(glfwChar, g_KMod); + else + return 0; +} + diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/TwEventGLUT.c b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/TwEventGLUT.c new file mode 100644 index 00000000..4e28b82f --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/TwEventGLUT.c @@ -0,0 +1,148 @@ +// --------------------------------------------------------------------------- +// +// @file TwEventGLUT.c +// @brief Helper: +// translate and re-send mouse and keyboard events +// from GLUT event callbacks to AntTweakBar +// +// @author Philippe Decaudin - http://www.antisphere.com +// @date 2006/05/10 +// @license This file is part of the AntTweakBar library. +// Copyright © 2005, 2006 Philippe Decaudin. +// For conditions of distribution and use, see License.txt +// +// note: TAB=4 +// +// --------------------------------------------------------------------------- + + +#define GLUT_NO_LIB_PRAGMA // we do not want to force linkage with glut +#ifdef _MSC_VER +# pragma warning(disable: 4505) // glut generates 'unreferenced function' warnings +# pragma warning(disable: 4100) // unreferenced parameter +#endif // _MSC_VER +#include + +#include + + +int TW_GLUT_CALL TwEventMouseButtonGLUT(int glutButton, int glutState, int mouseX, int mouseY) +{ + TwMouseAction action = (glutState==GLUT_DOWN) ? TW_MOUSE_PRESSED : TW_MOUSE_RELEASED; + + switch( glutButton ) + { + case GLUT_LEFT_BUTTON: + return TwMouseButton(action, TW_MOUSE_LEFT); + case GLUT_RIGHT_BUTTON: + return TwMouseButton(action, TW_MOUSE_RIGHT); + case GLUT_MIDDLE_BUTTON: + return TwMouseButton(action, TW_MOUSE_MIDDLE); + default: + return 0; + } +} + +int TW_GLUT_CALL TwEventMouseMotionGLUT(int mouseX, int mouseY) +{ + return TwMouseMotion(mouseX, mouseY); +} + + +// GLUT does not send modifiers state to 'Key' and 'Special' callbacks, +// and we cannot call glutGetModifiers here because we do not want to link +// AntTweakBar with glut, so the following function is used to store +// a pointer to the glutGetModifiers function of the calling application. +// It must be called at initialisation of the application. + +int (TW_CALL *g_GLUTGetModifiers)(void) = NULL; + +int TW_CALL TwGLUTModifiersFunc(int (TW_CALL *glutGetModifiersFunc)(void)) +{ + g_GLUTGetModifiers = glutGetModifiersFunc; + return (g_GLUTGetModifiers==NULL) ? 0 : 1; +} + + +int TW_GLUT_CALL TwEventKeyboardGLUT(unsigned char glutKey, int mouseX, int mouseY) +{ + int kmod = 0; + + if( g_GLUTGetModifiers!=NULL ) + { + int glutMod = g_GLUTGetModifiers(); + + if( glutMod&GLUT_ACTIVE_SHIFT ) + kmod |= TW_KMOD_SHIFT; + if( glutMod&GLUT_ACTIVE_CTRL ) + kmod |= TW_KMOD_CTRL; + if( glutMod&GLUT_ACTIVE_ALT ) + kmod |= TW_KMOD_ALT; + } + + if( (kmod&TW_KMOD_CTRL) && (glutKey>0 && glutKey<27) ) // CTRL special case + glutKey += 'a'-1; + + return TwKeyPressed((int)glutKey, kmod); +} + + +int TW_GLUT_CALL TwEventSpecialGLUT(int glutKey, int mouseX, int mouseY) +{ + int k = 0, kmod = 0; + + if( g_GLUTGetModifiers!=NULL ) + { + int glutMod = g_GLUTGetModifiers(); + + if( glutMod&GLUT_ACTIVE_SHIFT ) + kmod |= TW_KMOD_SHIFT; + if( glutMod&GLUT_ACTIVE_CTRL ) + kmod |= TW_KMOD_CTRL; + if( glutMod&GLUT_ACTIVE_ALT ) + kmod |= TW_KMOD_ALT; + } + + if( glutKey>=GLUT_KEY_F1 && glutKey<=GLUT_KEY_F12 ) + k = TW_KEY_F1 + (glutKey-GLUT_KEY_F1); + else + { + switch( glutKey ) + { + case GLUT_KEY_LEFT: + k = TW_KEY_LEFT; + break; + case GLUT_KEY_UP: + k = TW_KEY_UP; + break; + case GLUT_KEY_RIGHT: + k = TW_KEY_RIGHT; + break; + case GLUT_KEY_DOWN: + k = TW_KEY_DOWN; + break; + case GLUT_KEY_PAGE_UP: + k = TW_KEY_PAGE_UP; + break; + case GLUT_KEY_PAGE_DOWN: + k = TW_KEY_PAGE_DOWN; + break; + case GLUT_KEY_HOME: + k = TW_KEY_HOME; + break; + case GLUT_KEY_END: + k = TW_KEY_END; + break; + case GLUT_KEY_INSERT: + k = TW_KEY_INSERT; + break; + } + } + + if( k>0 && k +#include + + +// TwEventSDL returns zero if msg has not been handled, +// and a non-zero value if it has been handled by the AntTweakBar library. +int TW_CALL TwEventSDL(const void *sdlEvent) +{ + int handled = 0; + const SDL_Event *event = (const SDL_Event *)sdlEvent; + + if( event==NULL ) + return 0; + + switch( event->type ) + { + case SDL_KEYDOWN: + if ( event->key.keysym.unicode!=0 && (event->key.keysym.unicode & 0xFF00)==0 ) + { + if( (event->key.keysym.unicode & 0xFF)<32 && (event->key.keysym.unicode & 0xFF)!=event->key.keysym.sym ) + handled = TwKeyPressed((event->key.keysym.unicode & 0xFF)+'a'-1, event->key.keysym.mod); + else + handled = TwKeyPressed(event->key.keysym.unicode & 0xFF, event->key.keysym.mod); + } + else + handled = TwKeyPressed(event->key.keysym.sym, event->key.keysym.mod); + break; + case SDL_MOUSEMOTION: + handled = TwMouseMotion(event->motion.x, event->motion.y); + break; + case SDL_MOUSEBUTTONUP: + case SDL_MOUSEBUTTONDOWN: + if( event->type==SDL_MOUSEBUTTONDOWN && (event->button.button==4 || event->button.button==5) ) // mouse wheel + { + static int s_WheelPos = 0; + if( event->button.button==4 ) + ++s_WheelPos; + else + --s_WheelPos; + handled = TwMouseWheel(s_WheelPos); + } + else + handled = TwMouseButton((event->type==SDL_MOUSEBUTTONUP)?TW_MOUSE_RELEASED:TW_MOUSE_PRESSED, (TwMouseButtonID)event->button.button); + break; + case SDL_VIDEORESIZE: + // tell the new size to TweakBar + TwWindowSize(event->resize.w, event->resize.h); + // do not set 'handled', SDL_VIDEORESIZE may be also processed by the calling application + break; + } + + return handled; +} diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/TwEventWin32.c b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/TwEventWin32.c new file mode 100644 index 00000000..3c39f77f --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/TwEventWin32.c @@ -0,0 +1,188 @@ +// --------------------------------------------------------------------------- +// +// @file TwEventWin32.c +// @brief Helper: +// translate and re-send mouse and keyboard events +// from Win32 message proc to AntTweakBar +// +// @author Philippe Decaudin - http://www.antisphere.com +// @date 2006/05/10 +// @license This file is part of the AntTweakBar library. +// Copyright © 2005, 2006 Philippe Decaudin. +// For conditions of distribution and use, see License.txt +// +// note: TAB=4 +// +// --------------------------------------------------------------------------- + +#include + +#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers +#include + +// Mouse wheel support +#if !defined WM_MOUSEWHEEL +# define WM_MOUSEWHEEL 0x020A +#endif // WM_MOUSEWHEEL +#if !defined WHEEL_DELTA +#define WHEEL_DELTA 120 +#endif // WHEEL_DELTA + + +// TwEventWin32 returns zero if msg has not been handled, +// and a non-zero value if it has been handled by the AntTweakBar library. +int TW_CALL TwEventWin32(void *wnd, unsigned int msg, unsigned int _W64 wParam, int _W64 lParam) +{ + int handled = 0; + switch( msg ) + { + case WM_MOUSEMOVE: + // send signed! mouse coordinates + handled = TwMouseMotion((short)LOWORD(lParam), (short)HIWORD(lParam)); + break; + case WM_LBUTTONDOWN: + SetCapture(wnd); + handled = TwMouseButton(TW_MOUSE_PRESSED, TW_MOUSE_LEFT); + break; + case WM_LBUTTONUP: + ReleaseCapture(); + handled = TwMouseButton(TW_MOUSE_RELEASED, TW_MOUSE_LEFT); + break; + case WM_MBUTTONDOWN: + SetCapture(wnd); + handled = TwMouseButton(TW_MOUSE_PRESSED, TW_MOUSE_MIDDLE); + break; + case WM_MBUTTONUP: + ReleaseCapture(); + handled = TwMouseButton(TW_MOUSE_RELEASED, TW_MOUSE_MIDDLE); + break; + case WM_RBUTTONDOWN: + SetCapture(wnd); + handled = TwMouseButton(TW_MOUSE_PRESSED, TW_MOUSE_RIGHT); + break; + case WM_RBUTTONUP: + ReleaseCapture(); + handled = TwMouseButton(TW_MOUSE_RELEASED, TW_MOUSE_RIGHT); + break; + case WM_CHAR: + case WM_SYSCHAR: + { + int key = (int)(wParam&0xff); + int kmod = 0; + + if( GetAsyncKeyState(VK_SHIFT)<0 ) + kmod |= TW_KMOD_SHIFT; + if( GetAsyncKeyState(VK_CONTROL)<0 ) + { + kmod |= TW_KMOD_CTRL; + if( key>0 && key<27 ) + key += 'a'-1; + } + if( GetAsyncKeyState(VK_MENU)<0 ) + kmod |= TW_KMOD_ALT; + if( key>0 && key<256 ) + handled = TwKeyPressed(key, kmod); + } + break; + case WM_KEYDOWN: + case WM_SYSKEYDOWN: + { + int kmod = 0; + int testkp = 0; + int k = 0; + + if( GetAsyncKeyState(VK_SHIFT)<0 ) + kmod |= TW_KMOD_SHIFT; + if( GetAsyncKeyState(VK_CONTROL)<0 ) + { + kmod |= TW_KMOD_CTRL; + testkp = 1; + } + if( GetAsyncKeyState(VK_MENU)<0 ) + { + kmod |= TW_KMOD_ALT; + testkp = 1; + } + if( wParam>=VK_F1 && wParam<=VK_F15 ) + k = TW_KEY_F1 + ((int)wParam-VK_F1); + else if( testkp && wParam>=VK_NUMPAD0 && wParam<=VK_NUMPAD9 ) + k = '0' + ((int)wParam-VK_NUMPAD0); + else + { + switch( wParam ) + { + case VK_UP: + k = TW_KEY_UP; + break; + case VK_DOWN: + k = TW_KEY_DOWN; + break; + case VK_LEFT: + k = TW_KEY_LEFT; + break; + case VK_RIGHT: + k = TW_KEY_RIGHT; + break; + case VK_INSERT: + k = TW_KEY_INSERT; + break; + case VK_DELETE: + k = TW_KEY_DELETE; + break; + case VK_PRIOR: + k = TW_KEY_PAGE_UP; + break; + case VK_NEXT: + k = TW_KEY_PAGE_DOWN; + break; + case VK_HOME: + k = TW_KEY_HOME; + break; + case VK_END: + k = TW_KEY_END; + break; + case VK_DIVIDE: + if( testkp ) + k = '/'; + break; + case VK_MULTIPLY: + if( testkp ) + k = '*'; + break; + case VK_SUBTRACT: + if( testkp ) + k = '-'; + break; + case VK_ADD: + if( testkp ) + k = '+'; + break; + case VK_DECIMAL: + if( testkp ) + k = '.'; + break; + default: + if( (kmod&TW_KMOD_CTRL) && (kmod&TW_KMOD_ALT) ) + k = MapVirtualKey( (UINT)wParam, 2 ) & 0x0000FFFF; + } + } + if( k!=0 ) + handled = TwKeyPressed(k, kmod); + } + break; + case WM_MOUSEWHEEL: + { + static int s_WheelPos = 0; + s_WheelPos += ((short)HIWORD(wParam))/WHEEL_DELTA; + handled = TwMouseWheel(s_WheelPos); + } + break; + case WM_SIZE: + // tell the new size to TweakBar + TwWindowSize(LOWORD(lParam), HIWORD(lParam)); + // do not set 'handled', WM_SIZE may be also processed by the calling application + break; + } + + return handled; +} diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/TwFonts.cpp b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/TwFonts.cpp new file mode 100644 index 00000000..036c4690 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/TwFonts.cpp @@ -0,0 +1,3935 @@ +// --------------------------------------------------------------------------- +// +// @file TwFonts.cpp +// @author Philippe Decaudin - http://www.antisphere.com +// @license This file is part of the AntTweakBar library. +// Copyright © 2005, 2006 Philippe Decaudin. +// For conditions of distribution and use, see License.txt +// +// note: TAB=4 +// +// --------------------------------------------------------------------------- + + +#include "TwPrecomp.h" +#include "TwMgr.h" +#include "TwFonts.h" + + +// --------------------------------------------------------------------------- + +CTexFont::CTexFont() +{ + for( int i=0; i<256; ++i ) + { + m_CharU0[i] = 0; + m_CharU1[i] = 0; + m_CharV0[i] = 0; + m_CharV1[i] = 0; + m_CharWidth[i] = 0; + } + m_TexWidth = 0; + m_TexHeight = 0; + m_TexBytes = NULL; + m_NbCharRead = 0; + m_CharHeight = 0; +} + +// --------------------------------------------------------------------------- + +CTexFont::~CTexFont() +{ + if( m_TexBytes ) + delete m_TexBytes; + m_TexBytes = NULL; + m_TexWidth = 0; + m_TexHeight = 0; + m_NbCharRead = 0; +} + +// --------------------------------------------------------------------------- + +static int NextPow2(int _n) +{ + int r = 1; + while( r<_n ) + r *= 2; + return r; +} + +// --------------------------------------------------------------------------- + +const char *g_ErrBadFontHeight = "Cannot determine font height while reading font bitmap (check first pixel column)"; + +CTexFont *TwGenerateFont(const unsigned char *_Bitmap, int _BmWidth, int _BmHeight) +{ + // find height of the font + int x, y; + int h = 0, hh = 0; + int r, NbRow = 0; + for( y=0; y<_BmHeight; ++y ) + if( _Bitmap[y*_BmWidth]==0 ) + { + if( (hh<=0 && h<=0) || (h!=hh && h>0 && hh>0) ) + { + g_TwMgr->SetLastError(g_ErrBadFontHeight); + return NULL; + } + else if( h<=0 ) + h = hh; + else if( hh<=0 ) + break; + hh = 0; + ++NbRow; + } + else + ++hh; + + // find width and position of each character + int w = 0; + int x0[224], y0[224], x1[224], y1[224]; + int ch = 32; + int start; + for( r=0; rlmax ) + lmax = l; + } + // A little empty margin is added between chars to avoid artefact when antialiasing is on + const int MARGIN_X = 2; + const int MARGIN_Y = 2; + lmax += 16*MARGIN_X; + // - Second, build the texture + CTexFont *TexFont = new CTexFont; + TexFont->m_NbCharRead = ch-32; + TexFont->m_CharHeight = h; + TexFont->m_TexWidth = NextPow2(lmax); + TexFont->m_TexHeight = NextPow2(14*(h+MARGIN_Y)); + TexFont->m_TexBytes = new unsigned char[TexFont->m_TexWidth*TexFont->m_TexHeight]; + memset(TexFont->m_TexBytes, 0, TexFont->m_TexWidth*TexFont->m_TexHeight); + int xx; + float du = 0.4f; + float dv = 0.4f; + assert( g_TwMgr!=NULL ); + if( g_TwMgr ) + { + if( g_TwMgr->m_GraphAPI==TW_OPENGL ) + { + du = 0; + dv = 0; + } + else // texel alignement for D3D + { + du = 0.5f; + dv = 0.5f; + } + } + float alpha; + for( r=0; r<14; ++r ) + for( xx=0, ch=r*16; ch<(r+1)*16; ++ch ) + if( y1[ch]-y0[ch]==h-1 ) + { + for( y=0; ym_TexBytes[(xx+x-x0[ch])+(r*(h+MARGIN_Y)+y)*TexFont->m_TexWidth] = (unsigned char)(alpha*256.0f); + } + TexFont->m_CharU0[ch+32] = (float(xx)+du)/float(TexFont->m_TexWidth); + xx += x1[ch]-x0[ch]+1; + TexFont->m_CharU1[ch+32] = (float(xx)+du)/float(TexFont->m_TexWidth); + TexFont->m_CharV0[ch+32] = (float(r*(h+MARGIN_Y))+dv)/float(TexFont->m_TexHeight); + TexFont->m_CharV1[ch+32] = (float(r*(h+MARGIN_Y)+h)+dv)/float(TexFont->m_TexHeight); + TexFont->m_CharWidth[ch+32] = x1[ch]-x0[ch]+1; + xx += MARGIN_X; + } + + return TexFont; +} + +// --------------------------------------------------------------------------- + +CTexFont *g_DefaultSmallFont = NULL; +CTexFont *g_DefaultNormalFont = NULL; +CTexFont *g_DefaultLargeFont = NULL; + +// Small font +const int FONT0_BM_W = 211; +const int FONT0_BM_H = 84; +static const unsigned char s_Font0[] = +{ + 127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0, + 0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,255,0,0,0,255,255,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127, + 0,0,0,0,255,0,255,0,255,0,0,0,255,0,0,255,0,0,0,255,0,0,0,0,255,255,0,0, + 0,255,0,0,0,0,255,255,0,0,0,255,0,0,255,0,0,255,0,0,255,0,255,0,255,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,255,0,0,0,255,0,0,255,255, + 255,0,0,255,255,255,0,0,0,0,0,255,0,255,255,255,255,0,0,255,255,0,0,255, + 255,255,255,0,0,255,255,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,127,0,0,0,0,255,0,255,0,255,0,0,0,255,0,0,255,0,0,255,255,255,255, + 0,255,0,0,255,0,255,0,0,0,0,255,0,0,255,0,0,255,0,255,0,0,0,0,255,0,0,255, + 255,255,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,255,0,255, + 255,0,0,0,0,0,255,0,0,0,0,255,0,0,0,255,255,0,255,0,0,0,0,255,0,0,0,0,0, + 0,0,255,0,255,0,0,255,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127, + 0,0,0,0,255,0,0,0,0,0,0,255,255,255,255,255,255,255,0,255,0,0,0,255,0,0, + 255,0,255,0,0,0,0,255,0,0,255,0,0,0,0,255,0,0,0,0,255,0,255,0,255,0,255, + 0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,255,0,0,255,0,0,0, + 0,0,255,0,0,0,0,255,0,0,255,0,255,0,255,0,0,0,0,255,0,0,0,0,0,0,255,0,0, + 255,0,0,255,0,255,0,0,255,0,0,255,0,0,255,0,0,0,0,0,255,255,0,0,0,0,0,0, + 0,0,0,255,255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 127,0,0,0,0,255,0,0,0,0,0,0,0,255,0,255,0,0,0,255,255,0,0,0,0,255,255,0, + 255,0,255,255,0,0,0,255,255,0,255,0,0,0,255,0,0,0,0,255,0,0,0,255,0,0,0, + 0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,255,0,0,255, + 0,0,0,0,255,0,0,0,255,255,0,0,255,0,0,255,0,255,255,255,0,0,255,255,255, + 0,0,0,0,255,0,0,0,255,255,0,0,0,255,255,255,0,0,255,0,0,255,0,0,0,255,255, + 0,0,0,255,255,255,255,255,255,0,0,0,0,255,255,0,0,0,0,255,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,255,0,0,0,0,0,255,255,255,255,255, + 255,0,0,0,255,255,0,0,0,0,0,255,0,255,0,0,255,0,255,0,0,255,0,0,0,0,255, + 0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,255,255,0,0,0,0,0,255,0, + 0,255,0,0,255,0,0,255,0,0,0,255,0,0,0,0,0,0,255,0,255,255,255,255,255,0, + 0,0,255,0,255,0,0,255,0,0,255,0,0,0,255,0,0,255,0,0,0,0,255,0,0,0,0,0,0, + 0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0, + 255,0,255,0,0,0,0,255,0,255,0,0,255,0,255,0,0,255,255,0,0,0,255,0,0,0,0, + 255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,255,0,0,255,0,0,255,0, + 0,255,0,0,255,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,255,0,255,0, + 0,255,0,0,255,0,0,0,255,0,0,255,0,0,0,0,255,0,0,255,0,0,255,0,0,0,255,255, + 0,0,0,255,255,255,255,255,255,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,255,0,0,0,0,0,0,255,0,0,255,0,0,255, + 255,255,255,0,0,0,0,255,0,0,0,255,255,0,0,0,255,255,0,0,255,0,0,255,0,0, + 0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,255,0,255,0,0,0,0,255, + 255,0,0,255,255,255,0,255,255,255,255,0,255,255,255,0,0,0,0,0,255,0,255, + 255,255,0,0,0,255,255,0,0,255,0,0,0,0,0,255,255,0,0,0,255,255,0,0,0,255, + 0,0,255,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,0,255,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,127,127,0,127,0,127,127,127, + 0,127,127,127,127,127,127,0,127,127,127,127,127,0,127,127,127,127,127,127, + 127,127,127,0,127,127,127,127,127,0,127,0,127,127,0,127,127,127,0,127,127, + 127,127,127,0,127,127,127,127,127,127,0,127,127,0,127,127,127,0,127,0,127, + 127,127,0,127,127,127,127,0,127,127,127,0,127,127,127,127,0,127,127,127, + 127,0,127,127,127,127,0,127,127,127,127,0,127,127,127,127,0,127,127,127, + 127,0,127,127,127,127,0,127,127,127,127,0,127,127,0,127,127,0,127,127,127, + 127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,127,127,0,127,127, + 127,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,255,0,0,0,255,255,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,255,255,255,0,0,0,0,0, + 255,255,0,0,0,255,255,255,0,0,0,0,0,255,255,255,0,0,255,255,255,255,0,0, + 0,255,255,255,255,255,0,255,255,255,255,255,0,0,0,255,255,255,0,0,255,0, + 0,0,0,255,0,255,255,255,0,0,255,255,0,255,0,0,0,255,0,255,0,0,0,255,255, + 0,0,0,255,255,0,255,0,0,0,0,255,0,0,0,255,255,255,0,0,0,255,255,255,255, + 0,0,0,0,255,255,255,0,0,0,255,255,255,255,0,0,0,255,255,255,255,0,255,255, + 255,255,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,255,0,0,255,0, + 255,0,0,255,0,255,0,0,0,255,0,255,255,255,255,0,255,0,0,255,0,0,0,0,255, + 0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,255,0, + 0,0,255,0,0,0,0,255,255,0,0,0,255,0,0,255,0,0,0,255,0,0,0,255,0,255,0,0, + 0,255,0,0,255,0,0,0,0,0,255,0,0,0,0,0,0,255,0,0,0,255,0,255,0,0,0,0,255, + 0,0,255,0,0,0,0,255,0,255,0,0,255,0,0,255,0,0,0,255,255,0,0,0,255,255,0, + 255,255,0,0,0,255,0,0,255,0,0,0,255,0,0,255,0,0,0,255,0,0,255,0,0,0,255, + 0,0,255,0,0,0,255,0,255,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,255,0,255,0, + 0,0,0,255,0,255,0,0,255,0,0,255,0,255,0,0,255,0,0,255,0,255,0,0,0,0,0,255, + 0,255,0,0,0,255,0,0,0,255,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,127,255,0,0,255,255,0,255,0,0,255,0,0,255,0,0,255,0,0,255, + 0,0,255,0,0,0,0,0,0,255,0,0,0,0,255,0,255,0,0,0,0,0,255,0,0,0,0,0,255,0, + 0,0,0,0,0,255,0,0,0,0,255,0,0,255,0,0,0,0,255,0,255,0,255,0,0,0,255,0,0, + 0,255,0,255,0,255,0,255,0,255,0,255,0,0,255,0,255,0,0,0,0,0,255,0,255,0, + 0,0,255,0,255,0,0,0,0,0,255,0,255,0,0,0,255,0,255,0,0,0,0,0,0,0,255,0,0, + 0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,255,0,255,0,255,0,255,0,0,255,255, + 0,0,0,255,0,255,0,0,0,0,255,0,0,255,0,0,0,255,0,0,0,255,0,255,0,0,0,255, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,255,0,255,0,255,0,255, + 0,0,255,0,0,255,0,0,255,255,255,255,0,0,255,0,0,0,0,0,0,255,0,0,0,0,255, + 0,255,255,255,255,0,0,255,255,255,255,0,0,255,0,0,255,255,255,0,255,255, + 255,255,255,255,0,0,255,0,0,0,0,255,0,255,255,0,0,0,0,255,0,0,0,255,0,255, + 0,255,0,255,0,255,0,0,255,0,255,0,255,0,0,0,0,0,255,0,255,0,0,0,255,0,255, + 0,0,0,0,0,255,0,255,255,255,255,0,0,0,255,255,255,0,0,0,0,255,0,0,0,255, + 0,0,0,0,255,0,0,255,0,0,255,0,0,255,0,255,0,255,0,255,0,0,255,255,0,0,0, + 0,255,0,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,255,0,255,0,255,0,255,0,255,255,255, + 255,255,255,0,255,0,0,0,255,0,255,0,0,0,0,0,0,255,0,0,0,0,255,0,255,0,0, + 0,0,0,255,0,0,0,0,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,0,255,0,0,0,0,255, + 0,255,0,255,0,0,0,255,0,0,0,255,0,0,255,0,0,255,0,255,0,0,0,255,255,0,255, + 0,0,0,0,0,255,0,255,255,255,255,0,0,255,0,0,0,0,0,255,0,255,0,255,0,0,0, + 0,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,0,255,0,0,255,0,0,255,0,0,255,0,255, + 0,255,0,255,0,0,255,255,0,0,0,0,255,0,0,0,0,255,0,0,0,255,0,0,0,255,0,0, + 0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,255, + 0,0,255,255,255,0,0,255,0,0,0,0,255,0,255,0,0,0,255,0,0,255,0,0,0,255,0, + 255,0,0,0,255,0,0,255,0,0,0,0,0,255,0,0,0,0,0,0,255,0,0,0,255,0,255,0,0, + 0,0,255,0,0,255,0,0,0,0,255,0,255,0,0,255,0,0,255,0,0,0,255,0,0,255,0,0, + 255,0,255,0,0,0,0,255,0,0,255,0,0,0,255,0,0,255,0,0,0,0,0,0,255,0,0,0,255, + 0,0,255,0,0,255,0,0,0,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,0,255,0,0,0,255, + 255,0,0,0,0,255,0,0,0,255,0,0,255,0,0,255,0,0,0,255,0,0,0,255,0,0,0,0,255, + 0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,127,0,255,0,0,0,0,0,0,255,0,0,0,0,255,0,255,255,255,255,0,0,0,0,255, + 255,255,0,0,255,255,255,255,0,0,0,255,255,255,255,255,0,255,0,0,0,0,0,0, + 0,255,255,255,255,0,255,0,0,0,0,255,0,255,255,255,0,255,255,0,0,255,0,0, + 0,255,0,255,255,255,255,255,0,0,0,0,0,255,0,255,0,0,0,0,255,0,0,0,255,255, + 255,0,0,0,255,0,0,0,0,0,0,0,255,255,255,0,0,0,255,0,0,0,255,0,255,255,255, + 255,0,0,0,0,255,0,0,0,0,255,255,255,255,0,0,0,0,255,255,0,0,0,0,255,0,0, + 0,255,0,0,255,0,0,255,0,0,0,255,0,0,0,255,255,255,255,0,255,0,0,0,0,255, + 0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0, + 0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0, + 0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255, + 0,0,0,0,0,255,255,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127, + 0,127,127,127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,127,127, + 0,127,127,127,127,127,0,127,127,127,127,127,0,127,127,127,127,127,127,0, + 127,127,127,127,127,127,0,127,127,127,0,127,127,127,0,127,127,127,127,127, + 0,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,0, + 127,127,127,127,127,127,127,0,127,127,127,127,127,0,127,127,127,127,127, + 127,127,0,127,127,127,127,127,0,127,127,127,127,127,0,127,127,127,127,127, + 0,127,127,127,127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,127, + 127,127,0,127,127,127,127,0,127,127,127,127,127,0,127,127,127,127,0,127, + 127,0,127,127,127,0,127,127,0,127,127,127,127,127,0,127,127,127,127,127, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,127,255,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0, + 0,0,255,0,0,0,0,0,0,0,255,255,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,255,0,0,0, + 0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,255,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,255,0,0,0,0,0,0,0,255,0,0, + 0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0, + 255,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255, + 255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127, + 0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,255,0,0,0,0, + 0,0,0,255,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,255, + 0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,127,0,0,0,0,0,255,255,0,0,255,255,255,0,0,0,255,255,0,0,255, + 255,255,0,0,255,255,0,0,255,255,255,0,255,255,255,0,255,255,255,0,0,255, + 0,255,255,0,255,0,0,255,0,255,0,255,255,255,0,255,255,0,0,255,255,255,0, + 0,0,255,255,0,0,255,255,255,0,0,0,255,255,255,0,255,0,255,255,255,255,0, + 255,255,0,255,0,0,255,0,255,0,0,0,255,0,255,0,0,255,0,0,255,0,255,0,255, + 0,255,0,0,0,255,0,255,255,255,0,0,255,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0, + 0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127, + 0,0,0,0,0,0,0,255,0,255,0,0,255,0,255,0,0,0,255,0,0,255,0,255,0,0,255,0, + 255,0,0,255,0,0,255,0,255,0,0,255,0,255,0,0,255,0,255,0,255,0,0,255,0,255, + 0,0,255,0,0,255,0,255,0,0,255,0,255,0,0,255,0,255,0,0,255,0,255,0,0,255, + 0,255,255,0,255,0,0,0,255,0,0,255,0,0,255,0,0,255,0,255,0,0,255,0,0,255, + 0,0,255,0,0,255,0,0,0,255,0,255,0,0,0,0,255,0,0,255,0,0,0,255,0,0,0,255, + 0,0,0,255,255,0,0,255,0,0,255,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,255,255,255,0,255,0,0,255,0,255,0,0,0,255, + 0,0,255,0,255,255,255,255,0,255,0,0,255,0,0,255,0,255,0,0,255,0,255,0,0, + 255,0,255,255,0,0,0,255,0,255,0,0,255,0,0,255,0,255,0,0,255,0,255,0,0,255, + 0,255,0,0,255,0,255,0,0,255,0,255,0,0,0,255,0,0,255,0,0,255,0,0,255,0,0, + 255,0,255,0,0,255,0,255,0,255,0,255,0,0,255,0,0,0,255,0,255,0,0,0,255,0, + 0,255,0,0,0,0,255,0,0,0,0,255,0,255,0,0,255,255,0,0,0,255,0,0,0,0,0,255, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,255,0,0,255,0, + 255,0,0,255,0,255,0,0,0,255,0,0,255,0,255,0,0,0,0,255,0,0,255,0,0,255,0, + 255,0,0,255,0,255,0,0,255,0,255,0,255,0,0,255,0,255,0,0,255,0,0,255,0,255, + 0,0,255,0,255,0,0,255,0,255,0,0,255,0,255,0,0,255,0,255,0,0,0,0,255,0,255, + 0,0,255,0,0,255,0,0,255,0,255,0,0,0,255,255,0,255,255,0,0,0,255,0,0,0,255, + 0,255,0,0,255,0,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0, + 0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0, + 255,255,255,0,255,255,255,0,0,0,255,255,0,0,255,255,255,0,0,255,255,255, + 0,255,0,0,0,255,255,255,0,255,0,0,255,0,255,0,0,255,0,255,0,0,255,0,255, + 0,255,0,0,255,0,0,255,0,255,0,0,255,0,0,255,255,0,0,255,255,255,0,0,0,255, + 255,255,0,255,0,0,255,255,255,0,0,255,0,0,255,255,255,0,0,0,255,0,0,0,0, + 255,0,0,0,255,0,0,255,0,255,0,0,0,255,0,0,0,255,255,255,0,0,255,0,0,0,255, + 0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0, + 0,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,255,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255, + 0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,127,127,0,127,127, + 127,127,0,127,127,127,127,0,127,127,127,0,127,127,127,127,0,127,127,127, + 127,0,127,127,0,127,127,127,127,0,127,127,127,127,0,127,0,127,127,0,127, + 127,127,127,0,127,0,127,127,127,127,127,127,127,0,127,127,127,127,0,127, + 127,127,127,0,127,127,127,127,0,127,127,127,127,0,127,127,0,127,127,127, + 0,127,127,0,127,127,127,127,0,127,127,127,127,127,0,127,127,127,127,127, + 127,127,0,127,127,127,0,127,127,127,127,127,0,127,127,127,0,127,127,127, + 0,127,127,127,0,127,127,127,0,127,127,127,127,127,127,0,127,127,127,127, + 127,127,127,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0, + 0,0,255,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,255,0,0,255,255,0,255,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,255,255,0,255,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,127,0,255,255,255,0,0,255,255,255,255,255,255,255,0,0,0,0, + 0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,255,0,255, + 0,0,255,255,0,0,0,255,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,255,255,255, + 255,255,255,255,0,0,255,255,255,255,255,255,255,0,255,255,255,255,0,0,255, + 255,255,255,255,255,255,0,0,255,255,255,255,255,255,255,0,255,0,0,255,255, + 0,255,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,255,255, + 255,255,0,255,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255, + 255,255,255,0,0,255,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,127,255,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0, + 0,0,0,0,0,0,0,0,255,255,255,255,255,0,255,255,255,255,255,0,0,0,0,0,0,255, + 0,0,255,0,255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0, + 255,0,0,0,0,0,255,0,0,0,0,255,0,0,255,0,0,0,0,0,255,0,0,255,0,0,0,0,0,255, + 0,0,255,255,0,0,255,0,255,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,255,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0, + 0,0,0,0,255,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,127,255,255,255,255,0,0,255,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,0,0,0,255,0,0,255,0, + 255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,255,0,255,0,0,0,255,0,0,0,0,0,255,0,0, + 0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,0,0,255,0,0,255,0,0,0,0,0,255,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0, + 0,255,0,255,0,255,255,255,0,255,0,0,0,255,255,0,255,255,0,0,0,255,0,0,0, + 0,0,255,0,255,255,255,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,127,255,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,255,255,255,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,255, + 255,0,255,0,255,255,0,255,255,0,0,0,255,255,255,0,0,255,0,0,255,0,0,0,255, + 255,255,255,0,0,255,0,0,0,0,0,255,0,0,255,0,0,0,0,255,0,0,0,0,0,255,0,0, + 255,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,255,0,0,255,0,0, + 255,0,0,255,0,0,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,127,255,255,255,255,0,0,255,0,0,0,0,0,255,0,0,0, + 0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,0,0,0, + 0,0,0,255,0,255,0,0,255,0,0,255,0,0,0,0,0,255,0,255,0,0,255,0,0,0,255,0, + 0,0,0,0,255,0,0,0,0,0,255,0,0,255,0,0,0,0,255,0,0,0,0,0,255,0,0,255,0,0, + 0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,255,255,255,255,0,255, + 255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0, + 255,0,0,255,255,255,255,0,0,255,0,0,0,0,0,255,0,0,255,0,0,0,0,255,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,255,0,0,0,0,0,255,0,0,0, + 0,0,255,0,0,255,0,0,255,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0, + 255,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,255,0,0,255,0,0,0,0,0,255,0,0,255, + 0,255,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,0,0,0, + 0,255,0,0,255,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,255,0, + 0,255,0,0,0,0,0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,255,255,255,0,0,255,255,255,255,255, + 255,255,0,0,255,0,255,0,0,0,0,255,0,255,0,255,0,255,0,255,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,255,0,255,255,0,0,255,255,255,255, + 0,0,0,0,0,0,255,255,255,255,255,255,255,0,0,255,255,255,255,255,255,255, + 0,255,255,255,255,0,0,255,255,255,255,255,255,255,0,0,255,255,255,255,255, + 255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,255,255,0,255,255,255,0,0,255, + 255,255,255,255,255,255,0,255,255,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,255, + 0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,127,127,127,127,0,127,127,127,127,127,127,127,127, + 0,127,0,127,127,127,127,0,127,127,127,127,0,127,127,127,127,127,0,127,127, + 127,127,127,0,127,127,127,127,127,0,127,127,127,127,0,127,127,127,127,127, + 127,127,127,127,127,127,127,0,127,127,127,127,127,0,127,127,0,127,127,127, + 127,127,127,127,127,0,127,127,127,127,127,127,127,127,0,127,127,127,127, + 0,127,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,127,0,127, + 0,127,0,127,127,127,0,127,127,127,0,127,127,127,0,127,127,127,127,0,127, + 127,127,127,127,127,127,0,127,127,127,127,0,127,127,127,127,127,127,127, + 0,127,127,127,0,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127, + 127,127,127,127,0,127,127,127,0,127,127,127,127,127,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,255,0,0,0,255,0,0,0,0,255,255,0,0, + 0,0,0,0,0,255,0,0,0,255,0,255,0,0,255,255,255,0,0,255,0,255,0,0,0,255,255, + 255,255,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255, + 0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,255,255,0,255,255,255,0,0,255, + 0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,255,0,0,0, + 0,0,0,0,0,255,0,0,255,0,0,0,0,0,255,0,0,0,255,0,0,0,255,255,255,0,0,255, + 0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,255, + 0,0,0,255,0,0,255,0,255,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255, + 0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0, + 0,255,0,255,0,0,0,0,255,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255, + 255,0,255,0,0,0,0,0,0,0,0,0,0,255,255,0,255,0,0,255,0,0,0,0,0,0,255,255, + 0,255,0,0,0,0,0,255,255,0,0,255,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,127,0,0,0,0,0,255,0,0,255,255,255,0,0,255,0,0,0,0,255,255,255, + 0,0,0,255,0,255,0,0,255,0,255,0,0,0,0,0,0,0,0,0,255,0,0,255,255,0,0,255, + 255,0,255,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,255,255,255,0,0,255, + 0,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,255,0, + 0,255,0,255,255,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,255,0,255,0,255, + 0,0,0,255,0,255,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,255,0,255,0,0,0,0,0, + 255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,255,0,255,0,255,0,0,255,255,255,0,0,0, + 255,0,255,0,0,0,0,255,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,255,0,255,0,0, + 0,0,255,0,255,255,0,255,0,255,0,0,0,255,255,255,255,255,0,0,0,0,255,0,255, + 0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,0,0,255,255,255,0, + 255,255,0,0,0,0,0,0,255,0,0,255,0,255,255,0,255,0,0,255,0,0,0,0,0,0,0,255, + 255,255,0,255,255,0,0,0,255,0,255,0,0,255,255,0,0,255,255,0,0,0,255,0,255, + 0,255,255,0,0,255,255,0,255,0,255,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0, + 0,0,0,255,0,255,0,255,0,0,0,255,0,0,0,0,255,255,255,0,0,0,255,255,255,0, + 0,0,0,255,0,0,255,0,0,0,0,0,0,255,0,255,0,0,0,0,255,0,0,0,0,255,0,255,0, + 0,0,0,0,0,0,255,0,255,255,0,255,0,255,255,255,0,0,255,0,0,0,0,0,0,0,0,0, + 0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,255,0,255,0,0, + 255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,255,0,255,0,255,0,0, + 0,0,255,0,0,0,0,255,0,0,0,255,0,255,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127, + 0,0,0,0,0,255,0,255,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0, + 255,0,0,255,255,255,0,0,0,0,0,0,255,0,0,255,255,0,0,255,0,0,0,0,0,255,0, + 255,0,0,0,0,0,0,255,0,0,0,0,255,0,255,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0, + 0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,255,0,255,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,255,0,255,255,255,255,0, + 0,0,255,0,0,0,255,0,0,0,0,255,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 127,0,0,0,0,0,255,0,0,255,255,255,0,255,255,255,255,0,0,0,0,0,0,0,0,0,255, + 0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,255,255, + 255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,255,0,255,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,255,0,0, + 0,255,255,255,0,0,255,0,0,0,0,255,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0, + 0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255, + 0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,255,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,255,255,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,127,127,127,0,127,0,127,127,127,127,0,127, + 127,127,127,0,127,127,127,127,127,0,127,127,127,127,127,0,127,0,127,127, + 127,127,0,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,0, + 127,127,127,127,0,127,127,127,127,127,127,0,127,127,0,127,127,127,127,127, + 127,127,0,127,127,127,127,0,127,127,127,127,0,127,127,127,127,127,0,127, + 127,127,127,0,127,127,127,0,127,127,127,0,127,127,127,127,0,127,127,127, + 127,0,127,127,127,0,127,127,127,0,127,127,127,0,127,127,127,127,0,127,127, + 127,127,0,127,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127, + 127,0,127,127,127,127,127,127,127,0,127,127,127,127,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0, + 0,0,255,0,0,0,0,0,255,0,0,0,0,0,0,255,0,255,0,0,0,255,0,255,255,0,0,0,255, + 0,0,255,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0, + 0,0,0,255,0,0,0,0,255,0,255,0,0,0,255,0,255,0,0,0,255,0,0,0,255,0,0,255, + 0,255,0,255,0,255,0,0,0,0,0,0,0,0,0,255,0,255,255,0,0,0,0,0,255,0,0,0,0, + 0,0,0,255,0,0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,255,255,0,0,0,0,255,0,255, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,0, + 255,0,255,0,0,0,255,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255, + 0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,127,0,0, + 255,255,0,0,0,0,0,255,255,0,0,0,0,0,255,255,0,0,0,0,0,255,255,0,0,0,0,0, + 255,255,0,0,0,0,0,255,255,0,0,0,0,0,255,255,255,255,255,0,0,0,255,255,255, + 0,0,255,255,255,255,255,0,255,255,255,255,255,0,255,255,255,255,255,0,255, + 255,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255, + 0,255,255,255,255,0,0,0,255,0,0,0,0,255,0,0,0,255,255,255,0,0,0,0,0,255, + 255,255,0,0,0,0,0,255,255,255,0,0,0,0,0,255,255,255,0,0,0,0,0,255,255,255, + 0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,255,0,255,0,0,0,0,255,0,255,0,0,0, + 0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,255,0,255,0,0,0,0, + 255,0,0,255,0,127,0,0,255,255,0,0,0,0,0,255,255,0,0,0,0,0,255,255,0,0,0, + 0,0,255,255,0,0,0,0,0,255,255,0,0,0,0,0,255,255,0,0,0,0,255,0,255,0,0,0, + 0,0,255,0,0,0,255,0,255,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0, + 0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,255,0,0,0,255,0,0,255,255,0, + 0,0,255,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0, + 255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0, + 255,0,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0, + 0,255,0,255,0,0,255,255,255,0,0,255,0,0,255,0,127,0,255,0,0,255,0,0,0,255, + 0,0,255,0,0,0,255,0,0,255,0,0,0,255,0,0,255,0,0,0,255,0,0,255,0,0,0,255, + 0,0,255,0,0,0,255,0,255,0,0,0,0,255,0,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0, + 0,0,255,0,0,0,0,0,255,0,0,0,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0, + 255,0,0,0,0,255,0,255,0,255,0,0,255,0,255,0,0,0,0,0,255,0,255,0,0,0,0,0, + 255,0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,0,255, + 0,0,0,255,0,255,0,0,0,255,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,255, + 0,0,0,0,255,0,255,0,0,0,0,255,0,0,255,0,255,0,0,255,0,0,255,0,255,0,255, + 0,0,127,0,255,0,0,255,0,0,0,255,0,0,255,0,0,0,255,0,0,255,0,0,0,255,0,0, + 255,0,0,0,255,0,0,255,0,0,0,255,0,0,255,0,0,0,255,0,255,255,255,255,0,255, + 0,0,0,0,0,0,255,255,255,255,0,0,255,255,255,255,0,0,255,255,255,255,0,0, + 255,255,255,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,255,255,255, + 0,0,255,0,255,0,0,255,0,255,0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,255, + 0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,0,0,255,0,255,0, + 0,255,0,0,255,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0, + 255,0,255,0,0,0,0,255,0,0,0,255,0,0,0,255,0,0,255,0,255,0,0,255,0,127,255, + 255,255,255,255,255,0,255,255,255,255,255,255,0,255,255,255,255,255,255, + 0,255,255,255,255,255,255,0,255,255,255,255,255,255,0,255,255,255,255,255, + 255,0,0,255,255,255,0,0,0,0,255,0,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0, + 255,0,0,0,0,0,255,0,0,0,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,255, + 0,0,0,0,255,0,255,0,0,0,255,255,0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,255, + 0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,0,0,0,255, + 0,0,0,255,0,255,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0, + 0,0,255,0,255,0,0,0,0,255,0,0,0,255,0,0,0,255,0,0,255,0,255,0,0,255,0,127, + 255,0,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0, + 255,0,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,255,0,0,0,0,0,255,0,0,0,255, + 0,255,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,0,255,0,0,0,255, + 0,0,0,255,0,0,0,255,0,0,255,0,0,0,255,0,0,255,0,0,0,0,255,0,0,255,0,0,0, + 255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255, + 0,0,0,255,0,0,0,0,255,0,255,0,0,0,255,0,0,0,255,0,0,255,0,0,0,0,255,0,255, + 0,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,0,0,255,0,0,0,255,255, + 255,0,0,255,0,0,255,0,127,255,0,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0, + 0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,255, + 255,255,255,0,0,0,255,255,255,0,0,255,255,255,255,255,0,255,255,255,255, + 255,0,255,255,255,255,255,0,255,255,255,255,255,0,255,255,255,0,255,255, + 255,0,255,255,255,0,255,255,255,0,255,255,255,255,0,0,0,255,0,0,0,0,255, + 0,0,0,255,255,255,0,0,0,0,0,255,255,255,0,0,0,0,0,255,255,255,0,0,0,0,0, + 255,255,255,0,0,0,0,0,255,255,255,0,0,0,0,255,0,0,0,255,0,255,0,255,255, + 255,0,0,0,0,255,255,255,255,0,0,0,255,255,255,255,0,0,0,255,255,255,255, + 0,0,0,255,255,255,255,0,0,0,0,255,0,0,0,255,0,0,0,0,255,0,255,0,0,127,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,127,127,127, + 127,127,0,127,127,127,127,127,127,0,127,127,127,127,127,127,0,127,127,127, + 127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,127,127,0,127,127, + 127,127,127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,127,0,127, + 127,127,127,127,0,127,127,127,127,127,0,127,127,127,127,127,0,127,127,127, + 0,127,127,127,0,127,127,127,0,127,127,127,0,127,127,127,127,127,127,0,127, + 127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127, + 127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127, + 127,127,127,127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,127, + 127,127,0,127,127,127,127,127,127,0,127,127,127,127,127,127,0,127,127,127, + 127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,127,0,127,127,127, + 127,0,127,127,127,127,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,127,0,255,0,0,0,0,0,0,255,0,0,0,255,0,0,255,255,0,255,0, + 0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,255,0,0, + 0,255,0,0,0,0,0,0,0,255,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,255,255,0,255, + 0,0,255,0,0,0,0,0,0,255,0,0,0,255,0,0,255,255,0,255,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255, + 0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,255, + 0,0,0,0,255,0,0,0,255,0,255,0,255,0,255,255,0,0,255,0,255,0,0,255,0,255, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,255,0,255,0,0,255,0, + 255,0,0,255,0,255,0,255,0,255,255,0,255,0,0,255,255,0,255,0,255,255,0,0, + 0,255,0,0,0,0,255,0,0,0,255,0,255,0,255,0,255,255,0,255,0,0,255,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,255,0,255,0,0,255,0,255,0, + 0,0,255,0,0,0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,127,0,255,255,0,0,0,255,255,0,0,0,255,255,0,0,0,255,255,0,0,0,255, + 255,0,0,0,255,255,0,0,255,255,255,0,255,255,0,0,0,255,255,0,0,255,255,0, + 0,0,255,255,0,0,0,255,255,0,0,0,255,255,0,0,0,255,0,255,0,0,255,0,0,255, + 0,0,0,0,255,0,255,255,255,0,0,0,255,255,0,0,0,255,255,0,0,0,255,255,0,0, + 0,255,255,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,255,0,0,255, + 0,255,0,0,255,0,255,0,0,255,0,255,0,0,255,0,255,0,0,0,255,0,255,255,255, + 0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,255,0,0,0, + 0,255,0,0,0,0,255,0,0,0,0,255,0,0,0,0,255,0,0,0,0,255,0,0,0,0,255,0,0,255, + 0,255,0,0,0,255,0,0,255,0,255,0,0,255,0,255,0,0,255,0,255,0,0,255,0,0,255, + 0,255,0,0,255,0,0,255,0,0,255,255,255,0,255,0,0,255,0,255,0,0,255,0,255, + 0,0,255,0,255,0,0,255,0,255,0,0,255,0,255,0,0,255,0,0,255,255,255,255,255, + 0,255,0,0,255,255,0,255,0,0,255,0,255,0,0,255,0,255,0,0,255,0,255,0,0,255, + 0,0,255,0,255,0,0,255,0,0,255,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,127,0,255,255,255,0,0,255,255,255,0,0,255,255,255,0,0,255,255,255, + 0,0,255,255,255,0,0,255,255,255,0,0,255,255,255,255,255,255,0,255,0,0,0, + 255,255,255,255,0,255,255,255,255,0,255,255,255,255,0,255,255,255,255,0, + 0,255,0,255,0,0,255,0,0,255,0,255,0,0,255,0,255,0,0,255,0,255,0,0,255,0, + 255,0,0,255,0,255,0,0,255,0,255,0,0,255,0,255,0,0,255,0,0,0,0,0,0,0,0,255, + 0,255,0,255,0,255,0,0,255,0,255,0,0,255,0,255,0,0,255,0,255,0,0,255,0,0, + 255,0,255,0,0,255,0,0,255,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,127,255,0,0,255,0,255,0,0,255,0,255,0,0,255,0,255,0,0,255,0,255,0,0, + 255,0,255,0,0,255,0,255,0,0,255,0,0,0,0,255,0,0,0,255,0,0,0,0,255,0,0,0, + 0,255,0,0,0,0,255,0,0,0,0,0,255,0,255,0,0,255,0,0,255,0,255,0,0,255,0,255, + 0,0,255,0,255,0,0,255,0,255,0,0,255,0,255,0,0,255,0,255,0,0,255,0,255,0, + 0,255,0,0,0,0,255,0,0,0,255,255,0,0,255,0,255,0,0,255,0,255,0,0,255,0,255, + 0,0,255,0,255,0,0,255,0,0,255,0,255,0,0,255,0,0,255,0,0,255,0,255,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,255,255,255,0,0,255,255,255,0,0,255, + 255,255,0,0,255,255,255,0,0,255,255,255,0,0,255,255,255,0,0,255,255,0,255, + 255,255,0,0,255,255,0,0,255,255,255,0,0,255,255,255,0,0,255,255,255,0,0, + 255,255,255,0,0,255,0,255,0,0,255,0,0,255,0,0,255,255,0,0,255,0,0,255,0, + 0,255,255,0,0,0,255,255,0,0,0,255,255,0,0,0,255,255,0,0,0,255,255,0,0,0, + 0,0,0,0,0,0,0,255,255,255,0,0,0,255,255,255,0,0,255,255,255,0,0,255,255, + 255,0,0,255,255,255,0,0,0,255,0,0,0,255,255,255,0,0,0,0,255,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,255,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,127,127,127,0,127,127,127,127,0,127,127, + 127,127,0,127,127,127,127,0,127,127,127,127,0,127,127,127,127,0,127,127, + 127,127,127,127,127,0,127,127,127,0,127,127,127,127,0,127,127,127,127,0, + 127,127,127,127,0,127,127,127,127,0,127,127,0,127,0,127,127,0,127,127,0, + 127,127,127,127,0,127,127,127,127,0,127,127,127,127,0,127,127,127,127,0, + 127,127,127,127,0,127,127,127,127,0,127,127,127,127,0,127,127,127,127,127, + 127,0,127,127,127,127,127,0,127,127,127,127,0,127,127,127,127,0,127,127, + 127,127,0,127,127,127,127,0,127,127,127,127,127,0,127,127,127,127,0,127, + 127,127,127,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +}; + + +// Normal font +const int FONT1_BM_W = 253; +const int FONT1_BM_H = 106; +static const unsigned char s_Font1[] = +{ + 127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,255, + 0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,255,0,0,0,255,0,255,0,0,0,0, + 0,255,0,255,0,0,0,0,0,255,0,0,0,0,255,255,0,0,0,0,255,0,0,0,0,0,255,255, + 255,0,0,0,0,0,255,0,0,0,255,0,0,0,0,255,0,0,0,255,0,255,0,255,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,255,255,255,0,0,0,0,0, + 255,0,0,0,0,255,255,255,255,0,0,0,255,255,255,255,0,0,0,0,0,0,255,0,0,255, + 255,255,255,255,255,0,0,0,255,255,255,0,0,255,255,255,255,255,255,0,0,255, + 255,255,255,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,127,0,0,0,0,0,0,255,0,0,0,255,0,255,0,0,0,0,0,255,0,255,0,0,0,0,255,255, + 255,0,0,255,0,0,255,0,0,255,0,0,0,0,0,255,0,0,0,255,0,0,0,0,255,0,0,0,255, + 0,0,0,0,255,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,255,0,0,255,0,0,0,0,255,0,0,255,255,255,0,0,0,255,0,0,0,0,255,0, + 255,0,0,0,0,255,0,0,0,0,255,255,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0, + 0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,127,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255, + 0,0,255,0,255,0,255,0,255,0,0,255,0,0,255,0,0,0,0,0,255,0,0,0,255,0,0,0, + 0,0,0,0,255,0,0,0,0,0,0,255,0,0,255,0,255,0,255,0,0,0,0,255,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0, + 0,0,255,0,0,0,0,0,0,255,0,0,0,255,0,255,0,0,255,0,0,0,0,0,0,255,0,0,0,0, + 0,0,0,0,0,0,255,0,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,0,255,0,0,0,255, + 0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,255, + 0,0,0,0,255,0,255,0,0,0,255,0,0,255,0,255,0,0,0,0,0,0,0,255,0,255,0,0,0, + 0,0,0,0,0,255,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,255,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0, + 0,255,0,0,0,0,0,0,255,0,0,255,0,0,255,0,0,255,255,255,255,255,0,0,255,255, + 255,255,255,0,0,0,0,0,0,255,0,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,0,255, + 0,0,0,255,0,0,0,0,0,0,255,255,0,0,0,0,255,255,255,255,255,255,0,0,0,0,255, + 255,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,255,0,0, + 0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,255,255,0,0,0,0,255,255,0,0,255,0,0, + 255,255,0,0,0,255,255,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,0,255,0,0,0,0,0, + 0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0, + 255,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,255,255,255,0,0,255,0,0,0,255, + 0,0,0,0,0,0,0,255,0,255,0,0,0,0,255,0,0,0,0,255,0,0,0,0,255,255,255,255, + 0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,255,255,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0, + 0,0,0,0,255,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,255,255,0, + 0,0,0,0,0,0,255,0,255,0,0,255,0,255,0,0,255,0,0,255,0,0,0,0,0,255,0,0,0, + 0,0,0,255,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,0,0,0,0,0,255,255, + 255,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,255,255, + 0,0,0,0,0,0,0,0,255,0,255,255,255,255,255,255,0,0,0,0,0,0,255,0,255,0,0, + 0,0,255,0,0,0,0,255,0,0,0,255,0,0,0,0,255,0,0,255,255,255,255,255,0,0,0, + 0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,255,255,255,255,255,255,0,0,0,0,0,0,0, + 0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,255,0,0,0,0, + 0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,0,255,0,0,255, + 0,255,0,0,0,255,255,0,0,0,0,0,0,255,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0, + 0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,255,0,0,0, + 0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,0,0,255, + 0,255,0,0,0,0,255,0,0,0,255,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,255,0,0, + 0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0, + 0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,255,0,255,0,0,0,0,0,255,0,255,0,255,0,0,0,0,0,255,0,0,255,0,0,255,0,255, + 0,0,0,255,255,0,0,0,0,0,0,255,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255, + 0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,0,255,0,0,0,0, + 255,0,0,0,255,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,255,0,0,255,0,0,0,0, + 255,0,255,0,0,0,0,255,0,0,0,255,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,255,0, + 0,0,255,0,0,0,255,0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,255,0,0,0,0,0, + 0,0,0,0,255,0,255,0,0,0,0,0,0,255,255,255,0,0,0,0,0,255,0,0,0,0,255,255, + 0,0,0,255,255,255,0,0,255,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0, + 0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,255,255,255, + 255,0,0,0,255,255,255,255,255,0,255,255,255,255,255,255,0,0,255,255,255, + 255,0,0,0,0,0,0,255,0,0,0,255,255,255,255,0,0,0,255,255,255,255,0,0,0,255, + 0,0,0,0,0,0,255,255,255,255,0,0,0,255,255,255,0,0,0,0,255,0,0,0,255,0,0, + 0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,255,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0, + 0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0, + 0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,127,127,127,0, + 127,127,127,0,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127, + 127,127,127,127,0,127,127,127,127,127,127,127,127,127,127,127,0,127,127, + 127,127,127,127,127,0,127,127,127,0,127,127,127,0,127,127,127,127,0,127, + 127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,0,127,127,127, + 127,0,127,127,127,0,127,127,127,127,0,127,127,127,127,127,127,0,127,127, + 127,127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,127,127,0,127, + 127,127,127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,127,127, + 0,127,127,127,127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,127, + 127,0,127,127,0,127,127,127,127,0,127,127,127,127,127,127,127,127,0,127, + 127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,127,0,127,127, + 127,127,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,255,0,0,0,0,0,255,255,255,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,255, + 255,255,255,0,0,0,0,0,0,0,255,0,0,0,0,255,255,255,255,255,0,0,0,0,255,255, + 255,255,0,255,255,255,255,255,0,0,0,255,255,255,255,255,255,0,255,255,255, + 255,255,0,0,0,255,255,255,255,0,0,255,0,0,0,0,0,255,0,255,255,255,0,0,255, + 255,255,0,255,0,0,0,0,255,0,255,0,0,0,0,0,255,255,0,0,0,0,255,255,0,255, + 255,0,0,0,0,255,0,0,0,255,255,255,255,0,0,0,255,255,255,255,255,0,0,0,0, + 255,255,255,255,0,0,0,255,255,255,255,0,0,0,0,255,255,255,255,0,0,255,255, + 255,255,255,255,255,0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,255,0,0,0, + 0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,0,255,0,255,255,255,255, + 255,255,0,0,255,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,255,255,0,0,0,0,255,255,0,0, + 0,0,255,0,255,0,0,0,255,0,0,0,0,255,0,0,255,0,0,0,0,0,255,0,0,0,0,255,0, + 0,255,0,0,0,0,0,0,255,0,0,0,0,0,0,255,0,0,0,0,255,0,255,0,0,0,0,0,255,0, + 0,255,0,0,0,0,0,255,0,255,0,0,0,255,0,0,255,0,0,0,0,0,255,255,0,0,0,0,255, + 255,0,255,255,0,0,0,0,255,0,0,255,0,0,0,0,255,0,0,255,0,0,0,0,255,0,0,255, + 0,0,0,0,255,0,0,255,0,0,0,255,0,0,255,0,0,0,0,255,0,0,0,0,255,0,0,0,0,255, + 0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,255,0,0,0,0,255,0,0,0,0,255,0,0,255, + 0,0,255,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,255,0,0,0, + 0,0,0,255,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,127,0,255,0,255,255,255,255,0,255,0,0,0,0,255,0,255,0,0,0,255,0,0, + 0,0,255,0,255,0,0,0,0,0,0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,0,255,0,0,0, + 0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,0,255,0,0,255,0,0,0,0,0,255,0,255,0,0, + 255,0,0,0,255,0,0,0,0,0,255,0,255,0,0,255,0,255,0,255,0,255,0,0,0,255,0, + 255,0,0,0,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,0,0,255,0,255,0,0,0, + 255,0,0,255,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,255,0,0,255,0,0, + 0,255,0,0,0,255,0,0,255,0,255,0,0,255,0,0,0,255,0,0,255,0,0,0,255,0,0,0, + 255,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,255,0,0,0,255,0,0, + 0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,255,0,255,0,0, + 0,255,0,0,255,0,0,0,255,0,255,0,0,0,255,0,0,0,0,255,0,255,0,0,0,0,0,0,255, + 0,0,0,0,0,255,0,255,0,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0, + 0,0,0,255,0,0,255,0,0,0,0,0,255,0,255,0,255,0,0,0,0,255,0,0,0,0,0,255,0, + 255,0,0,255,0,255,0,255,0,255,0,0,0,255,0,255,0,0,0,0,0,0,255,0,255,0,0, + 0,0,255,0,255,0,0,0,0,0,0,255,0,255,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0, + 255,0,0,0,0,255,0,0,0,0,0,255,0,0,255,0,0,0,255,0,0,0,255,0,0,255,0,255, + 0,0,255,0,0,0,0,255,255,0,0,0,0,0,255,0,255,0,0,0,0,0,0,255,0,0,0,0,255, + 0,0,0,0,255,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,127,255,0,255,0,0,0,255,0,0,255,0,0,255,0,0,0,255, + 0,0,255,255,255,255,255,0,0,255,0,0,0,0,0,0,255,0,0,0,0,0,255,0,255,255, + 255,255,255,255,0,255,255,255,255,255,0,255,0,0,0,255,255,255,0,255,255, + 255,255,255,255,255,0,0,255,0,0,0,0,0,255,0,255,255,0,0,0,0,0,255,0,0,0, + 0,0,255,0,255,0,0,255,0,255,0,255,0,0,255,0,0,255,0,255,0,0,0,0,0,0,255, + 0,255,0,0,0,0,255,0,255,0,0,0,0,0,0,255,0,255,255,255,255,0,0,0,0,255,255, + 255,255,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,255,0,0,255,0,0,0,255,0,0,0, + 255,0,0,255,0,255,0,0,255,0,0,0,0,255,255,0,0,0,0,0,0,255,0,0,0,0,0,0,255, + 0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,255,0,255,0,0,0,255,0,0,255,0,0,255, + 0,0,0,255,0,0,255,0,0,0,0,255,0,255,0,0,0,0,0,0,255,0,0,0,0,0,255,0,255, + 0,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,0,255, + 0,0,0,0,0,255,0,255,0,255,0,0,0,0,255,0,0,0,0,0,255,0,0,255,255,0,0,255, + 0,255,0,0,0,255,0,255,0,255,0,0,0,0,0,0,255,0,255,255,255,255,255,0,0,255, + 0,0,0,0,0,0,255,0,255,0,0,255,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,255, + 0,0,0,0,0,255,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,255,0,255,0,0,0,0, + 255,255,0,0,0,0,0,0,255,0,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,255,0,0, + 0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,127,255,0,255,0,0,0,255,0,0,255,0,0,255,255,255,255,255,0,0,255,0,0,0, + 0,255,0,255,0,0,0,0,0,0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,0,255,0,0,0,0, + 0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,0,255,0,0,0,0,0,255,0,255,0,0, + 255,0,0,0,255,0,0,0,0,0,255,0,0,255,255,0,0,255,0,255,0,0,0,255,0,255,0, + 255,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,255,0,0,0,0,0,0,255,0,255,0,0,0,255, + 0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,255,0,0,0,255,0,255, + 0,0,0,0,0,255,255,0,0,0,255,255,0,0,0,0,255,0,0,255,0,0,0,0,0,255,0,0,0, + 0,0,255,0,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,255,0,255,255,255,255, + 255,255,0,0,255,0,0,0,0,0,255,0,255,0,0,0,0,255,0,0,255,0,0,0,0,0,255,0, + 0,0,0,255,0,0,255,0,0,0,0,0,0,255,0,0,0,0,0,0,255,0,0,0,0,255,0,255,0,0, + 0,0,0,255,0,0,255,0,0,0,0,0,255,0,255,0,0,0,255,0,0,255,0,0,0,0,0,255,0, + 0,0,0,0,0,255,0,255,0,0,0,0,255,255,0,0,255,0,0,0,0,255,0,0,255,0,0,0,0, + 0,0,0,255,0,0,0,0,255,0,0,255,0,0,0,255,0,0,255,0,0,0,0,255,0,0,0,0,255, + 0,0,0,0,0,255,0,0,0,255,0,0,0,0,255,0,255,0,0,0,0,0,255,0,0,0,0,0,255,0, + 0,0,0,255,0,0,255,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,0, + 255,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,127,0,255,255,0,0,0,0,0,0,0,0,255,0,0,0,0,0,255,0,255,255,255, + 255,255,0,0,0,0,255,255,255,255,0,255,255,255,255,255,0,0,0,255,255,255, + 255,255,255,0,255,0,0,0,0,0,0,0,255,255,255,255,255,0,255,0,0,0,0,0,255, + 0,255,255,255,0,255,255,255,0,0,255,0,0,0,0,255,0,255,255,255,255,255,0, + 255,0,0,0,0,0,0,255,0,255,0,0,0,0,255,255,0,0,0,255,255,255,255,0,0,0,255, + 0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,255,0,0,0,0,255,0,0,255,255,255,255, + 0,0,0,0,0,255,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,255,0,0,0,0,0,0,255,0, + 0,0,0,0,255,0,0,0,255,0,0,0,0,255,0,0,0,0,255,0,0,0,0,255,255,255,255,255, + 255,0,0,255,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,255,255,255,255,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0,0,0,0,255,0,0, + 255,255,255,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,127,127,127,127,127,127,127,127,127,127,0,127,127,127, + 127,127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,127,127,0,127, + 127,127,127,127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,127, + 0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127, + 0,127,127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,127,0,127, + 127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127, + 127,127,127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,127,127, + 127,127,0,127,127,127,127,127,127,0,127,127,127,127,127,127,0,127,127,127, + 127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127, + 127,0,127,127,127,127,127,127,127,127,127,127,127,0,127,127,127,127,127, + 127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,0,127,127,127, + 127,0,127,127,127,127,0,127,127,127,127,0,127,127,127,127,127,127,127,127, + 0,127,127,127,127,127,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,255, + 0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0, + 0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0, + 0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,255, + 0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,127,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,255,0,0,0, + 0,0,0,255,0,0,255,0,255,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127, + 0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0, + 0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0, + 0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,255, + 0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,255,255,255,0,0,255,0,255,255, + 255,0,0,0,255,255,255,255,0,0,255,255,255,255,255,0,0,255,255,255,255,0, + 0,255,255,255,255,0,255,255,255,255,255,0,255,0,255,255,255,0,0,255,0,255, + 255,0,255,0,0,0,255,0,255,0,255,255,255,255,0,255,255,255,0,0,255,0,255, + 255,255,0,0,0,255,255,255,255,0,0,255,0,255,255,255,0,0,0,255,255,255,255, + 255,0,255,0,255,0,0,255,255,255,0,255,255,255,255,0,255,0,0,0,0,255,0,255, + 0,0,0,255,0,255,0,0,0,255,0,0,0,255,0,255,0,0,0,255,0,255,0,0,0,255,0,255, + 255,255,255,0,0,0,255,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0, + 0,0,0,0,0,0,255,0,255,255,0,0,0,255,0,255,0,0,0,0,0,255,0,0,0,0,255,0,255, + 0,0,0,0,255,0,0,255,0,0,255,0,0,0,0,255,0,255,255,0,0,0,255,0,255,0,0,255, + 0,255,0,0,255,0,0,255,0,255,0,0,0,255,0,0,0,255,0,255,255,0,0,0,255,0,255, + 0,0,0,0,255,0,255,255,0,0,0,255,0,255,0,0,0,0,255,0,255,255,0,0,255,0,0, + 0,0,0,255,0,0,0,255,0,0,0,0,255,0,255,0,0,0,255,0,255,0,0,0,255,0,0,0,255, + 0,0,255,0,255,0,0,255,0,0,0,255,0,0,0,0,255,0,0,0,255,0,0,0,0,0,255,0,0, + 0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,255,0,255, + 0,0,0,0,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,0,255,0,0,255,0,0,0,0,255, + 0,255,0,0,0,0,255,0,255,0,0,255,0,255,0,255,0,0,0,255,0,255,0,0,0,255,0, + 0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0, + 0,0,255,0,255,0,0,0,255,0,0,0,0,0,255,0,0,0,255,0,0,0,0,255,0,0,255,0,255, + 0,0,0,255,0,255,0,255,0,255,0,0,0,255,0,255,0,0,0,255,0,255,0,0,0,0,255, + 0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,255,255,0,0,0,255,0,0,0, + 255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0, + 0,255,255,255,255,0,255,0,0,0,0,255,0,255,0,0,0,0,0,255,0,0,0,0,255,0,255, + 255,255,255,255,255,0,0,255,0,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,255, + 0,0,255,0,255,255,0,0,0,0,255,0,255,0,0,0,255,0,0,0,255,0,255,0,0,0,0,255, + 0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255, + 255,0,0,0,255,0,0,0,255,0,0,0,0,255,0,0,255,0,255,0,0,0,255,0,255,0,255, + 0,255,0,0,0,0,255,0,0,0,0,255,0,255,0,0,0,255,0,0,0,255,255,0,0,0,0,0,0, + 255,0,0,0,0,0,255,255,0,0,255,0,0,255,0,0,255,0,0,0,255,0,0,0,0,0,0,0,255, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,255,0,0,0,255,0,255,0, + 0,0,0,255,0,255,0,0,0,0,0,255,0,0,0,0,255,0,255,0,0,0,0,0,0,0,255,0,0,255, + 0,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,255,0,255,0,255,0,0,0,255,0,255, + 0,0,0,255,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255, + 0,255,0,0,0,0,255,0,255,0,0,0,0,0,0,255,0,0,255,0,0,0,255,0,0,0,0,255,0, + 0,255,0,255,0,0,0,255,0,255,0,255,0,255,0,0,0,255,0,255,0,0,0,255,0,255, + 0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,255,0,0,0,255, + 255,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127, + 0,0,0,0,0,0,255,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,0,255,0,0,0,255, + 255,0,255,0,0,0,0,255,0,0,255,0,0,255,0,0,0,255,255,0,255,0,0,0,0,255,0, + 255,0,0,255,0,255,0,0,255,0,0,255,0,255,0,0,0,255,0,0,0,255,0,255,0,0,0, + 0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,255,255,0,255,0,0, + 0,0,0,0,255,0,0,255,0,0,0,255,0,0,0,255,255,0,0,0,255,0,0,0,0,0,255,0,0, + 0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,255,0,0,0,0,0, + 255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,255,255,255,255,0,255,255, + 255,255,255,0,0,0,255,255,255,255,0,0,255,255,255,0,255,0,0,255,255,255, + 255,0,0,0,255,0,0,0,255,255,255,0,255,0,255,0,0,0,0,255,0,255,0,0,255,0, + 255,0,0,0,255,0,255,0,255,0,0,0,255,0,0,0,255,0,255,0,0,0,0,255,0,0,255, + 255,255,255,0,0,255,255,255,255,255,0,0,0,255,255,255,0,255,0,255,0,0,0, + 255,255,255,0,0,0,0,255,255,0,0,255,255,255,0,255,0,0,0,255,0,0,0,0,0,255, + 0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,255,255,255,0,0,0,255, + 0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255, + 255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0, + 0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0, + 255,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,127,127,127,127,0,127,127,127,127,127,0, + 127,127,127,127,127,127,0,127,127,127,127,127,0,127,127,127,127,127,127, + 0,127,127,127,127,127,127,0,127,127,127,0,127,127,127,127,127,127,0,127, + 127,127,127,127,127,0,127,0,127,127,0,127,127,127,127,127,0,127,0,127,127, + 127,127,127,127,127,127,127,0,127,127,127,127,127,127,0,127,127,127,127, + 127,127,0,127,127,127,127,127,127,0,127,127,127,127,127,127,0,127,127,127, + 0,127,127,127,127,0,127,127,127,127,0,127,127,127,127,127,127,0,127,127, + 127,127,127,0,127,127,127,127,127,127,127,127,127,0,127,127,127,127,127, + 0,127,127,127,127,127,0,127,127,127,127,0,127,127,127,127,127,0,127,127, + 127,127,0,127,127,127,127,127,0,127,127,127,127,127,127,127,127,127,0,127, + 127,127,127,127,127,127,127,127,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,255,0,0,255,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,255,0, + 0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,255,0,255, + 0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255, + 255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,127,0,0,255, + 255,255,255,0,0,0,255,255,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,255, + 255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,255,0,0,0,0, + 255,0,0,255,0,0,0,255,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,255,255,255, + 0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255,255,0,0,0,255,255,255, + 255,255,255,255,255,255,0,255,255,255,255,255,255,0,0,0,255,255,255,255, + 255,255,255,255,255,0,0,0,255,255,255,255,255,255,255,255,255,0,255,0,0, + 0,255,0,255,0,255,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,255,0,255,255,0,0,0,255,255,255,0,255,0,0,0,255,0,0,255,255, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,255, + 255,0,0,255,255,0,0,255,0,0,0,0,0,255,0,127,0,255,0,0,0,0,0,0,0,255,0,0, + 0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255, + 255,255,255,255,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,255,0,0,255,0,0, + 255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,255,0, + 0,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0, + 0,255,0,0,0,255,0,0,0,0,0,0,0,255,0,0,255,0,255,0,0,0,255,0,255,0,255,0, + 255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 255,0,0,255,255,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,255,0,0,127,255,0,0,0,0, + 0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0, + 0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,255, + 0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0, + 0,0,255,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255, + 0,255,0,255,0,0,255,255,255,0,0,255,0,0,0,0,255,255,255,255,0,255,255,255, + 0,0,0,0,255,0,0,0,0,0,0,0,255,0,255,255,255,255,0,0,255,0,0,0,255,0,0,127, + 255,255,255,255,255,255,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,255,0,0,0,0,0,0, + 0,0,0,0,255,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,255, + 0,0,255,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,255,0, + 0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,255,0,255,0,0,0,0,0,0,255,0,0,255,0,0, + 0,0,255,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,255,0,255, + 0,0,0,127,255,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,255,255, + 255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,255,0,0,0, + 0,0,0,0,0,0,0,0,255,255,0,0,255,0,0,255,255,0,0,0,255,255,0,0,0,255,255, + 255,255,0,0,0,255,0,0,0,255,0,0,0,0,0,255,255,255,255,255,0,0,0,255,0,0, + 0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,255,0,0, + 0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0, + 0,0,0,0,0,0,255,0,255,0,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,255, + 0,0,0,255,0,0,0,0,0,255,0,0,0,0,127,255,255,255,255,255,255,0,0,0,255,0, + 0,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,255,0,0,0,0,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255, + 0,0,255,0,255,0,0,255,0,0,0,0,0,0,255,0,0,255,0,0,0,255,0,0,0,0,0,255,0, + 0,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,255,0,0,0,0,0,0, + 0,255,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255, + 255,255,255,0,255,255,255,255,255,0,255,255,255,255,255,255,255,255,255, + 255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,0,255, + 0,255,0,0,0,0,255,255,255,255,255,0,0,0,255,0,0,0,0,0,0,0,255,0,0,255,0, + 0,0,0,0,0,255,0,0,0,0,127,255,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0, + 0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0, + 255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,255,0,255,0,0,255,0,0,0, + 0,0,0,255,0,0,0,255,0,0,255,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,0,0, + 0,255,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0, + 0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255, + 0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0, + 0,0,255,0,0,0,0,127,0,255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,255,0, + 0,0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0, + 255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,255,0,255,0,0,255,0,255, + 0,0,0,0,255,0,0,0,0,255,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,0, + 0,0,255,0,255,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0, + 0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0, + 0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0, + 0,0,255,0,0,0,0,127,0,0,255,255,255,255,0,0,0,255,255,255,255,255,255,255, + 255,255,0,0,255,0,0,0,255,0,0,0,0,0,255,0,255,0,0,255,0,0,255,0,0,255,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,255,0, + 0,0,255,255,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,255,255,255,255,255, + 255,255,255,255,0,0,0,255,255,255,255,255,255,255,255,255,0,255,255,255, + 255,255,255,0,0,0,255,255,255,255,255,255,255,255,255,0,0,0,255,255,255, + 255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255, + 255,255,0,0,0,0,0,0,0,0,255,255,255,255,0,255,255,255,255,0,0,0,255,255, + 255,255,255,255,255,255,255,0,255,255,255,255,0,0,0,0,255,0,0,0,0,127,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,255,0,0,0,0,0,255,0,255, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127, + 127,127,127,0,127,127,0,127,127,127,127,127,127,0,127,127,127,127,0,127, + 127,127,127,127,127,127,127,127,0,127,127,127,127,127,127,0,127,127,127, + 127,127,127,0,127,127,127,127,127,0,127,127,127,127,127,127,127,127,127, + 127,127,127,127,127,127,127,127,0,127,127,127,127,127,127,0,127,127,127, + 127,0,127,127,127,127,127,127,127,127,127,127,127,0,127,127,127,127,127, + 127,127,127,127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,127, + 127,127,127,127,127,127,0,127,127,127,127,127,127,127,127,127,127,127,0, + 127,127,0,127,127,0,127,127,127,127,0,127,127,127,127,0,127,127,127,127, + 0,127,127,127,127,127,0,127,127,127,127,127,127,127,127,127,127,127,0,127, + 127,127,127,127,127,0,127,127,127,127,127,127,127,127,127,127,0,127,127, + 127,127,0,127,127,127,127,0,127,127,127,127,127,127,127,127,127,127,0,127, + 127,127,127,127,127,127,127,127,127,127,0,127,127,127,127,0,127,127,127, + 127,127,127,127,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,255,0,0,0, + 0,0,255,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,255,0,0,0,0,0,255,0,0, + 255,0,0,0,0,255,255,255,255,0,0,255,0,0,255,0,0,0,0,0,255,255,255,255,0, + 0,0,0,0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255, + 255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,255, + 255,255,0,0,0,255,255,255,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,255,255, + 255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,255,255,0,0,0,0,0,0, + 0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,255,255, + 255,0,0,0,0,255,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0, + 0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255, + 0,0,0,0,255,255,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,255,255,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,255, + 0,0,0,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255, + 255,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,255,0,0,0,255,0,0, + 0,0,0,0,0,0,0,255,255,0,0,0,255,0,0,0,0,0,0,255,255,0,0,0,0,255,0,0,0,0, + 0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,127,0,0,0,0,0,255,0,0,0,0,255,255,255,255,0,0,255,0,0,0,0, + 0,255,0,0,0,0,255,0,0,0,255,0,255,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0, + 0,0,0,0,0,255,0,0,255,255,0,0,255,0,0,0,0,255,255,255,0,0,0,255,0,0,255, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,255,255,0,0,255,0,0,0,0,0,0,0,0, + 0,0,255,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,255,255,0,0,0,0,0, + 0,0,0,0,255,0,0,0,0,255,0,255,255,255,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,255,0,0,255,0,0,0,255,0,255,0,0,255,0,0,0,0,0,255,0,0,0,255,0,0,0, + 0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,255,255,0,0,0,255,0,0,0,0,0,0,0,255, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,255,0,0, + 0,255,0,255,0,0,0,0,255,0,0,0,0,0,0,255,255,255,255,0,0,0,0,255,0,255,0, + 0,0,0,255,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,255,0,0,255, + 0,0,255,0,0,255,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255, + 0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,0,255,0,0,0,0,0,0,255, + 0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,255,255,255,255,0,255, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,255,0,0,255,0,0,255,0,0, + 0,0,255,0,0,255,0,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,255,0,255, + 0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127, + 0,0,0,0,0,255,0,0,0,255,0,255,0,0,0,0,255,0,0,0,0,0,0,255,0,0,255,0,0,0, + 0,0,255,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0, + 0,0,0,255,0,0,255,0,0,255,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 255,0,0,255,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255, + 255,255,255,0,0,255,255,255,255,0,0,255,255,255,0,0,0,0,0,0,0,0,0,255,0, + 0,0,0,255,0,0,255,255,255,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,255,255, + 0,255,0,0,0,255,0,0,0,255,0,0,255,0,0,0,255,0,0,255,0,0,255,255,0,0,0,0, + 255,0,0,255,0,255,255,255,0,0,0,0,0,0,255,0,255,0,0,255,255,0,0,0,255,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,255,0,0, + 0,255,0,255,0,0,0,255,255,255,255,255,0,0,0,255,0,0,255,0,0,0,255,255,255, + 255,255,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0, + 0,255,0,0,0,255,255,255,0,255,0,0,255,0,0,0,0,255,255,255,255,255,255,255, + 0,255,255,255,0,255,0,0,255,255,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255, + 0,0,0,0,255,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,0, + 0,0,0,255,0,0,255,0,0,0,0,0,255,0,0,255,0,255,0,0,0,0,0,0,0,255,0,0,0,0, + 255,0,0,255,255,255,0,255,0,0,255,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,255,0,0,0,255,0,255,0,0,0,0, + 255,0,0,0,0,0,0,255,255,255,255,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,255, + 0,0,255,0,0,0,0,0,0,0,0,255,0,0,255,0,0,255,0,0,255,0,0,0,0,0,0,0,0,255, + 0,0,255,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,255,0,0,255,0,0,255,0,0,255,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,255,0,0,0,0,255,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,255,0,0,255,0,0,255,0,0,0,0,0, + 0,255,0,0,0,0,255,0,0,0,0,0,0,255,0,0,255,0,0,255,0,255,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,255,0,0,0,255,0,255, + 0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0, + 0,255,255,0,0,0,0,0,0,0,0,0,0,255,0,0,255,255,0,0,255,0,0,0,0,0,0,0,0,0, + 0,255,0,0,255,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,255,0,255,0,0,0,255,255,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,255,255,255,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,255,0,0,0,0,255,0,255,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,255,0,0,255, + 255,255,255,255,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,255,0,0,255,255,255, + 255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127, + 0,0,0,0,0,255,0,0,0,0,255,255,255,255,0,255,255,255,255,255,255,0,0,0,0, + 0,0,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,255, + 255,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0, + 0,0,0,0,255,255,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255,0,255,0,0,0, + 0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,255,0,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,255,255,255,255,0,0,0,0,255, + 0,0,0,0,0,0,255,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,255,255, + 255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0, + 0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,255, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,255,255, + 255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0, + 0,0,255,0,255,0,0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127, + 127,127,0,127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,127,127, + 0,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,0, + 127,127,127,127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,127, + 127,127,127,127,127,0,127,127,127,127,127,0,127,127,127,127,127,127,127, + 0,127,127,127,127,127,127,127,0,127,127,127,0,127,127,127,127,127,127,127, + 127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,127,0,127,127,127, + 127,127,127,127,0,127,127,127,127,127,0,127,127,127,127,127,0,127,127,127, + 127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,0,127,127, + 127,0,127,127,127,127,127,127,0,127,127,127,127,127,0,127,127,127,127,127, + 0,127,127,127,127,127,127,0,127,127,127,127,127,127,127,127,127,127,127, + 0,127,127,127,127,127,127,127,127,127,127,127,0,127,127,127,127,127,127, + 127,127,127,127,127,0,127,127,127,127,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,127,0,0,255,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,255,255, + 0,0,0,0,0,255,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,255,0,0,0,0,255,255,0, + 0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,255,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,255,255,0,255,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,255, + 255,0,0,0,0,0,0,0,255,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,255,255,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,127,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,255,0,0,255,0,0,0, + 255,0,255,255,0,0,0,0,255,0,0,0,255,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,255,0,0,0,0,255,0,0,255,0, + 0,0,255,0,0,255,0,0,0,255,0,0,0,255,0,0,255,0,0,255,255,0,255,0,0,0,0,0, + 0,0,0,0,0,255,0,255,255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,0,0, + 0,255,0,0,255,0,0,0,0,0,255,0,255,255,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,255, + 0,0,255,0,0,0,255,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,255,0,0,0,0,0,0,0,255,0, + 0,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0, + 0,0,0,0,0,0,255,255,255,255,255,255,255,0,0,0,255,255,255,255,0,255,255, + 255,255,255,255,0,255,255,255,255,255,255,0,255,255,255,255,255,255,0,255, + 255,255,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255,0,255,255, + 255,0,0,255,255,255,255,0,0,0,255,255,0,0,0,0,255,0,0,0,255,255,255,255, + 0,0,0,0,0,255,255,255,255,0,0,0,0,0,255,255,255,255,0,0,0,0,0,255,255,255, + 255,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,255,255, + 0,255,0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,255, + 0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,0,255,0,0,0,255,0,0,0, + 0,0,0,0,0,0,0,0,127,0,0,255,0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,255, + 0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,0, + 255,0,255,0,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,0,255,0,0,0,0,0,0,255, + 0,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255, + 0,0,0,255,0,0,255,255,0,0,0,0,255,0,0,255,0,0,0,0,255,0,0,0,255,0,0,0,0, + 255,0,0,0,255,0,0,0,0,255,0,0,0,255,0,0,0,0,255,0,0,0,255,0,0,0,0,255,0, + 0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,255,0,0,0,0,0,255,0,255,0,0,0, + 0,0,255,0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,0,255,0,0,0,255,0,0,255, + 0,0,0,0,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,127,0,0,255,0,255,0,0,0, + 0,0,255,0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,255, + 0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,0,255,0,0,0,0,0,255,0,0,0,0,0,0,255, + 0,0,0,0,0,0,255,0,0,0,0,0,0,255,0,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0, + 255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,0,255,0,255,0,255,0,0,0,255,0,255, + 0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,255,0,255,0,0,0, + 0,0,0,255,0,255,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,0,255, + 0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,255,0,0,0, + 0,0,255,0,0,255,0,0,0,255,0,0,255,255,255,255,255,0,0,255,0,0,0,255,0,0, + 0,0,0,0,0,0,0,0,0,127,0,0,255,0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,255,0, + 255,0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,255,0,0,0,0, + 0,255,0,0,255,0,0,0,0,0,255,0,0,0,0,0,0,255,0,0,0,0,0,0,255,0,0,0,0,0,0, + 255,0,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0, + 0,255,0,0,0,0,255,0,255,0,255,0,0,0,255,0,255,0,0,0,0,0,0,255,0,255,0,0, + 0,0,0,0,255,0,255,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,255,0,255,0,0,0,0,0, + 0,255,0,0,0,255,0,0,0,255,0,0,255,0,0,0,255,0,0,255,0,255,0,0,0,0,0,255, + 0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,0,0,255,0, + 255,0,0,0,255,0,0,0,0,255,0,255,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,127,0, + 255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255, + 0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,0,255,0,0,255,255,255,255, + 255,0,255,0,0,0,0,0,0,255,255,255,255,255,255,0,255,255,255,255,255,255, + 0,255,255,255,255,255,255,0,255,255,255,255,255,255,0,0,255,0,0,0,255,0, + 0,0,255,0,0,0,255,0,0,255,255,255,255,0,0,255,0,255,0,0,255,0,0,255,0,255, + 0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,255,0,255,0,0,0, + 0,0,0,255,0,255,0,0,0,0,0,0,255,0,0,0,0,255,0,255,0,0,0,255,0,0,255,0,0, + 0,255,0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,255, + 0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,255,0,0,0,0,255,0,255,0,0,0,255,0,0,0, + 0,0,0,0,0,0,0,0,127,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0, + 255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255, + 255,255,255,255,0,0,0,0,0,255,0,0,0,0,0,0,255,0,0,0,0,0,0,255,0,0,0,0,0, + 0,255,0,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0, + 0,0,255,0,0,0,0,255,0,255,0,0,0,255,0,255,0,255,0,0,0,0,0,0,255,0,255,0, + 0,0,0,0,0,255,0,255,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,255,0,255,0,0,0,0, + 0,0,255,0,0,0,0,0,255,0,0,0,0,255,0,0,255,0,0,0,255,0,255,0,0,0,0,0,255, + 0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,0,0,0,255, + 0,0,0,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,127,0,255, + 255,255,255,255,0,0,0,255,255,255,255,255,0,0,0,255,255,255,255,255,0,0, + 0,255,255,255,255,255,0,0,0,255,255,255,255,255,0,0,0,255,255,255,255,255, + 0,0,0,255,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,0,255,0,0,0,0,0,0,255,0,0,0, + 0,0,0,255,0,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255, + 0,0,0,255,0,0,0,0,255,0,255,0,0,0,255,0,255,0,255,0,0,0,0,0,0,255,0,255, + 0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,255,0,255,0,0,0,0,0,0,255,0,255,0,0,0, + 0,0,0,255,0,0,0,0,255,0,255,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,0, + 255,0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,0,0,0, + 255,0,0,0,0,255,255,255,255,255,0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0, + 127,255,0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,255,0,0, + 0,0,0,255,0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,0,255,0,0,0,255,0,0, + 0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,0,255,0,0,0,0,0,0,255,0,0,0,0,0,0,255, + 0,0,0,0,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0, + 255,0,0,0,0,255,255,0,0,255,0,0,0,0,255,0,0,0,255,0,0,0,0,255,0,0,0,255, + 0,0,0,0,255,0,0,0,255,0,0,0,0,255,0,0,0,255,0,0,0,0,255,0,0,0,0,255,0,0, + 0,255,0,0,0,255,0,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0, + 0,255,0,0,0,255,0,0,0,255,0,0,0,255,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0, + 0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,127,255,0,0,0,0,0,255,0,255,0,0,0, + 0,0,255,0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,255,0,0,0,0,0,255,0,255, + 0,0,0,0,0,255,0,255,0,0,0,0,255,255,255,255,255,0,0,0,255,255,255,255,0, + 255,255,255,255,255,255,0,255,255,255,255,255,255,0,255,255,255,255,255, + 255,0,255,255,255,255,255,255,0,255,255,255,0,255,255,255,0,255,255,255, + 0,255,255,255,0,0,255,255,255,255,0,0,0,255,0,0,0,0,255,255,0,0,0,255,255, + 255,255,0,0,0,0,0,255,255,255,255,0,0,0,0,0,255,255,255,255,0,0,0,0,0,255, + 255,255,255,0,0,0,0,0,255,255,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255, + 255,255,255,0,0,0,0,0,255,255,255,0,0,0,0,0,255,255,255,0,0,0,0,0,255,255, + 255,0,0,0,0,0,255,255,255,0,0,0,0,0,0,255,0,0,0,0,255,0,0,0,0,0,0,255,0, + 255,255,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,127,127,127,127,127, + 127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127, + 127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127, + 127,127,0,127,127,127,127,127,127,127,127,127,127,0,127,127,127,127,127, + 127,0,127,127,127,127,127,127,0,127,127,127,127,127,127,0,127,127,127,127, + 127,127,0,127,127,127,127,127,127,0,127,127,127,0,127,127,127,0,127,127, + 127,0,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127, + 127,0,127,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,127, + 0,127,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,127,0,127, + 127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,127,0,127,127, + 127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127, + 127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127, + 0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,0,127,127,127,127, + 127,127,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,255,0,0,0,0,0,0,255,0,0, + 0,0,255,255,0,0,0,255,255,0,255,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,0,255,255,0,0, + 0,0,0,0,0,0,0,0,255,0,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0, + 255,0,0,255,0,0,0,0,0,0,0,0,0,255,0,0,0,0,255,255,0,0,0,0,0,255,255,0,255, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0, + 0,255,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,255,0,0,0,0,255,0,0,0,0,255, + 0,0,255,0,255,0,255,255,0,0,0,255,0,0,255,0,0,255,0,0,255,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,255,0,0,255,0,0, + 0,255,0,0,255,0,0,0,255,0,255,0,255,0,255,255,0,255,0,0,255,0,255,0,0,0, + 255,0,255,255,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,255,0,0,255,0,0,0,255, + 0,255,255,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 255,0,0,0,0,0,0,255,0,0,0,0,255,0,0,255,0,0,0,255,0,0,255,0,0,0,0,255,0, + 0,0,255,0,0,0,0,0,0,0,255,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,255,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 127,0,255,255,255,0,0,0,255,255,255,0,0,0,255,255,255,0,0,0,255,255,255, + 0,0,0,255,255,255,0,0,0,255,255,255,0,0,0,255,255,255,0,0,255,255,0,0,0, + 0,255,255,255,255,0,0,255,255,255,255,0,0,0,255,255,255,255,0,0,0,255,255, + 255,255,0,0,0,255,255,255,255,0,0,0,255,0,255,0,0,255,0,0,255,0,0,255,255, + 0,255,0,0,255,0,255,255,255,0,0,0,255,255,255,255,0,0,0,255,255,255,255, + 0,0,0,255,255,255,255,0,0,0,255,255,255,255,0,0,0,255,255,255,255,0,0,0, + 0,0,0,255,0,0,0,0,0,0,255,255,255,255,0,0,255,0,0,0,0,255,0,255,0,0,0,0, + 255,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,255,0,255,0,255,255, + 255,0,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,255,0,0,0,0,0, + 255,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,255, + 255,0,0,255,0,0,255,0,0,0,0,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,255,0, + 0,0,0,255,0,255,0,0,0,0,255,0,0,255,0,255,0,0,255,0,0,255,0,0,0,0,0,0,255, + 0,255,255,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255, + 0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,255, + 0,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255, + 0,255,0,0,0,255,0,255,255,0,0,0,255,0,255,0,0,0,255,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,127,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0, + 255,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,255,0,255,0,0,0,0,0,255,0,0,0,0, + 255,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,0,255,0,255, + 0,0,255,0,0,255,0,0,255,255,255,255,255,0,255,0,0,0,0,255,0,255,0,0,0,0, + 255,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0, + 255,0,0,0,0,0,0,0,0,0,0,255,0,0,0,255,0,255,0,255,0,0,0,0,255,0,255,0,0, + 0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,0,255,0,255,0,0,255,0,0,0, + 0,255,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,255,255,255,255,0,0, + 255,255,255,255,0,0,255,255,255,255,0,0,255,255,255,255,0,0,255,255,255, + 255,0,0,255,255,255,255,0,0,255,255,255,255,255,255,255,255,255,0,255,0, + 0,0,0,0,255,255,255,255,255,255,0,255,255,255,255,255,255,0,255,255,255, + 255,255,255,0,255,255,255,255,255,255,0,0,255,0,255,0,0,255,0,0,255,0,255, + 0,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,255, + 0,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,0,255,255,255,255,255, + 255,255,0,255,0,0,255,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,255, + 0,0,0,0,255,0,255,0,0,0,0,255,0,0,255,0,255,0,0,255,0,0,0,0,255,0,0,255, + 0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,255,0,0,0,255,0,255,0,0,0,255,0,255, + 0,0,0,255,0,255,0,0,0,255,0,255,0,0,0,255,0,255,0,0,0,255,0,255,0,0,0,255, + 0,0,0,0,0,0,255,0,0,0,0,0,255,0,0,0,0,0,0,255,0,0,0,0,0,0,255,0,0,0,0,0, + 0,255,0,0,0,0,0,0,0,255,0,255,0,0,255,0,0,255,0,255,0,0,0,0,255,0,255,0, + 0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,255,0, + 0,0,0,255,0,255,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,255,0,255,0,0,0,255,0,255, + 0,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,0,255, + 0,255,0,0,255,0,0,0,0,255,0,0,255,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,255, + 0,0,0,255,0,255,0,0,0,255,0,255,0,0,0,255,0,255,0,0,0,255,0,255,0,0,0,255, + 0,255,0,0,0,255,0,255,0,0,0,255,255,0,0,0,255,0,255,0,0,0,0,0,255,0,0,0, + 0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,0,255,0,255, + 0,0,255,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0, + 255,0,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0,255,0,0,0,0,255,0, + 0,0,0,0,255,0,0,0,0,0,255,0,0,0,255,0,0,255,0,0,0,255,255,0,255,0,0,0,255, + 255,0,255,0,0,0,255,255,0,255,0,0,0,255,255,0,0,0,255,0,0,0,255,0,0,0,0, + 255,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,255,255,255,255,0,0,255, + 255,255,255,0,0,255,255,255,255,0,0,255,255,255,255,0,0,255,255,255,255, + 0,0,255,255,255,255,0,0,255,255,255,0,0,255,255,255,0,0,0,255,255,255,255, + 0,0,255,255,255,255,0,0,0,255,255,255,255,0,0,0,255,255,255,255,0,0,0,255, + 255,255,255,0,0,0,255,0,255,0,0,255,0,0,255,0,0,255,255,255,255,0,0,255, + 0,0,0,0,255,0,0,255,255,255,255,0,0,0,255,255,255,255,0,0,0,255,255,255, + 255,0,0,0,255,255,255,255,0,0,0,255,255,255,255,0,0,0,0,0,0,255,0,0,0,0, + 0,255,255,255,255,0,0,0,0,255,255,255,0,255,0,0,255,255,255,0,255,0,0,255, + 255,255,0,255,0,0,255,255,255,0,255,0,0,0,255,0,0,0,255,255,255,255,255, + 0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,255,0,0, + 0,255,0,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,255,0,0,0,0,255,0,0,0,0,0,0,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127, + 127,127,127,127,0,127,127,127,127,127,0,127,127,127,127,127,0,127,127,127, + 127,127,0,127,127,127,127,127,0,127,127,127,127,127,0,127,127,127,127,127, + 127,127,127,127,127,0,127,127,127,127,127,0,127,127,127,127,127,127,0,127, + 127,127,127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,127,127, + 0,127,127,0,127,0,127,127,0,127,127,0,127,127,127,127,127,127,0,127,127, + 127,127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,127,127,0,127, + 127,127,127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,127,127, + 0,127,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127, + 127,127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,127,127,0,127, + 127,127,127,127,127,0,127,127,127,127,127,0,127,127,127,127,127,127,0,127, + 127,127,127,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +}; + +// Normal font anti-aliased +const int FONT1AA_BM_W = 264; +const int FONT1AA_BM_H = 106; +static const unsigned char s_Font1AA[] = +{ + 127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0, + 59,241,97,206,166,0,0,0,0,0,0,0,0,0,0,0,0,0,168,34,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,89,251,89,0,0,89,255,125,89,255,125,0,0,0,0, + 7,199,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,138,166, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,138,225,21,59,238,42, + 206,125,0,0,0,0,7,199,34,89,166,0,0,0,0,168,34,0,0,0,175,255,255,166,0, + 0,7,202,89,0,0,0,0,59,245,255,251,89,0,0,0,59,238,34,0,12,232,89,0,0,89, + 247,34,0,59,245,206,199,124,255,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,7,202,89,0,12,235,255,247,34,0,0,0,0,12,232,89,0,0,12,235, + 255,255,251,89,0,7,206,255,255,255,125,0,0,0,0,138,251,89,0,0,59,245,255, + 255,255,251,89,0,0,89,255,255,166,0,89,255,255,255,255,255,201,0,0,59,245, + 255,255,125,0,0,12,235,255,247,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,89,255,255,255,247,34,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,127,0,0,0,0,0,138,225,21,59,238,34,175,125,0,0,0,0,59,192,0,172, + 89,0,0,59,245,255,255,251,89,89,247,34,12,228,34,0,138,166,0,0,0,0,12,235, + 125,0,175,225,21,0,0,59,238,34,0,138,201,0,0,0,0,175,166,0,0,0,89,255,201, + 0,0,0,0,0,0,7,202,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,59,215,21,0,175, + 166,0,138,201,0,0,7,206,255,251,89,0,0,59,192,0,0,138,247,34,59,192,0,0, + 89,251,89,0,0,59,245,251,89,0,0,59,241,89,0,0,0,0,0,89,247,34,0,0,0,0,0, + 0,0,7,206,166,0,7,206,125,0,89,247,34,7,206,166,0,138,225,21,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,12,232,89,0,0,0,0,0,0,0,0,0,0,0,175,166,0,0,0,0,0, + 0,0,89,125,0,0,175,201,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,138,225,21,12,206, + 21,175,125,0,0,89,255,255,255,255,255,255,166,59,241,89,168,34,138,125, + 89,225,21,7,202,89,12,228,34,0,0,0,0,12,232,89,0,138,201,0,0,0,12,206,21, + 7,202,89,0,0,0,0,59,215,21,59,245,206,199,124,255,125,0,0,0,0,7,202,89, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,138,166,0,12,232,89,0,59,238,34,0,0, + 0,59,241,89,0,0,0,0,0,0,59,241,89,0,0,0,0,59,241,89,0,12,232,132,241,89, + 0,0,59,241,89,0,0,0,0,7,206,125,0,0,0,0,0,0,0,0,89,247,34,0,12,232,89,0, + 12,232,89,59,241,89,0,59,241,89,0,138,247,34,0,0,138,247,34,0,0,0,0,0,12, + 235,247,34,0,0,0,0,0,0,0,0,0,0,0,0,0,138,255,166,0,0,0,0,0,0,0,0,0,138, + 225,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,138,225,21,0,0,0,0,0,0,0,0,0,172, + 89,59,192,0,0,59,238,34,168,34,0,0,89,247,34,12,228,34,138,166,0,0,0,0, + 0,0,138,251,159,247,34,0,0,0,0,0,0,59,238,34,0,0,0,0,7,202,89,0,0,7,199, + 34,0,0,0,0,0,0,7,202,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,202,89,0,59, + 241,89,0,59,241,89,0,0,0,59,241,89,0,0,0,0,0,0,89,247,34,0,0,0,0,138,201, + 0,7,206,125,59,241,89,0,0,59,245,255,255,251,89,0,12,235,255,255,255,125, + 0,0,0,0,7,206,166,0,0,0,175,251,89,138,201,0,59,241,89,0,12,235,125,0,138, + 247,34,0,0,138,247,34,0,0,0,59,245,247,34,0,0,0,0,7,206,255,255,255,255, + 255,255,125,0,0,0,0,138,255,201,0,0,0,0,0,0,89,251,89,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 127,0,0,0,0,0,138,201,0,0,0,0,0,0,0,0,0,12,206,21,138,125,0,0,7,206,255, + 247,34,0,0,0,175,255,255,166,59,215,21,175,255,255,125,0,0,138,171,206, + 166,0,175,201,0,0,0,0,89,201,0,0,0,0,0,0,175,125,0,0,0,0,0,0,0,0,12,235, + 255,255,255,255,255,255,125,0,0,0,0,138,255,255,251,89,0,0,0,0,0,59,215, + 21,0,59,241,89,0,59,241,89,0,0,0,59,241,89,0,0,0,0,0,12,235,166,0,0,0,138, + 255,255,125,0,175,201,0,59,241,89,0,0,0,0,0,0,175,247,34,59,241,89,0,89, + 247,34,0,0,0,89,247,34,0,0,0,89,255,255,255,125,0,12,235,166,0,59,245,125, + 0,0,0,0,0,0,0,0,0,0,0,175,225,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,89,251,89,0,0,7,206,225,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,89,201, + 0,0,0,0,0,0,0,12,235,255,255,255,255,255,225,21,0,0,0,175,255,251,89,0, + 0,0,0,0,175,125,89,225,21,59,238,34,89,225,21,12,235,166,175,166,0,0,0, + 0,89,201,0,0,0,0,0,0,175,125,0,0,0,0,0,0,0,0,0,0,0,7,202,89,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,138,166,0,0,59,241,89,0,59,241,89,0,0,0,59,241,89, + 0,0,0,0,12,235,166,0,0,0,0,0,0,59,241,97,206,255,255,255,255,255,125,0, + 0,0,0,0,59,241,89,59,238,34,0,12,235,125,0,0,12,235,125,0,0,0,12,232,89, + 0,59,245,125,0,89,255,255,232,241,89,0,0,0,0,0,0,0,0,0,0,0,0,59,245,247, + 34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,138,255,201,0,0,0,0,7,206,125,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,138,125,12,206,21, + 0,0,0,0,0,168,34,175,166,0,0,0,0,59,215,21,138,201,0,12,228,34,138,225, + 21,0,12,235,251,89,0,0,0,0,59,215,21,0,0,0,0,12,232,89,0,0,0,0,0,0,0,0, + 0,0,0,7,202,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,202,89,0,0,12,232,89,0, + 59,238,34,0,0,0,59,241,89,0,0,0,12,235,166,0,0,0,0,0,0,0,12,235,125,0,0, + 0,59,241,89,0,0,0,0,0,0,59,241,89,12,232,89,0,12,232,89,0,0,138,225,21, + 0,0,0,59,238,34,0,7,206,166,0,0,0,0,89,225,21,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,12,235,247,34,0,0,7,206,255,255,255,255,255,255,125,0,0,138,255,166,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,138,225,21,0,0,0,0, + 0,0,0,0,172,89,89,166,0,0,0,89,166,0,168,42,206,125,0,0,0,7,202,89,0,89, + 225,21,59,238,34,89,251,89,0,0,175,255,201,0,0,0,0,7,202,89,0,0,0,0,59, + 215,21,0,0,0,0,0,0,0,0,0,0,0,7,202,89,0,0,0,0,138,247,34,0,0,0,0,0,7,206, + 201,0,12,228,34,0,0,0,175,166,0,138,201,0,0,0,0,59,241,89,0,0,12,235,166, + 0,0,0,0,89,166,0,0,89,251,89,0,0,0,59,241,89,0,0,59,192,0,0,175,225,21, + 0,175,201,0,138,225,21,0,12,235,125,0,0,0,0,12,235,166,0,59,241,89,0,0, + 0,7,206,166,0,0,138,247,34,0,0,59,245,125,0,0,0,0,0,0,0,12,232,89,0,0,0, + 0,0,0,0,0,0,0,0,175,166,0,0,0,0,0,0,0,0,7,206,166,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 127,0,0,0,0,0,138,225,21,0,0,0,0,0,0,0,12,206,21,138,125,0,0,0,12,235,255, + 255,255,166,0,0,0,0,138,201,0,0,0,175,255,255,125,0,0,138,255,255,255,125, + 12,235,247,0,0,0,0,138,201,0,0,0,0,175,166,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,7,206,166,0,0,0,0,0,0,7,206,201,0,89,201,0,0,0,0,12,235,255,247, + 34,0,0,7,206,255,255,255,225,21,89,255,255,255,255,255,166,59,245,255,255, + 251,89,0,0,0,0,59,241,89,0,0,12,235,255,255,225,21,0,0,12,235,255,251,89, + 0,0,175,225,21,0,0,0,0,0,59,245,255,255,125,0,0,89,255,255,166,0,0,0,138, + 247,34,0,0,138,225,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,7,206,166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,168,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,12,232,89,0,0,59,238,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,59,241,89,0,0,0,0,0,0,0,0,0,0,175,125,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,206,125, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,168,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,89, + 255,125,89,255,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,89,201,0,0,0,0, + 0,0,0,0,0,0,12,228,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,228,34,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 127,127,127,127,0,127,127,0,127,127,127,127,127,0,127,127,127,127,127,127, + 127,127,0,127,127,127,127,127,127,0,127,127,127,127,127,127,127,127,127, + 127,127,127,0,127,127,127,127,127,127,127,127,0,127,127,0,127,127,127,127, + 0,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127, + 127,127,0,127,127,127,0,127,127,127,127,0,127,127,127,0,127,127,127,127, + 0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,0,127,127,127,127, + 127,127,0,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127, + 127,127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,127,127,127, + 0,127,127,127,127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,0, + 127,127,127,127,127,0,127,127,127,127,127,127,127,127,0,127,127,127,127, + 127,127,127,127,127,0,127,127,127,127,127,127,127,127,0,127,127,127,127, + 127,127,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,12,235,255,255,125,138,166,0,0,0,89,255,255,247, + 34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,89,255,255, + 255,255,166,0,0,0,0,0,12,235,225,21,0,0,59,245,255,255,255,251,89,0,0,0, + 59,245,255,255,251,89,59,245,255,255,255,247,34,0,0,59,245,255,255,255, + 255,127,81,245,255,255,255,255,127,0,0,59,245,255,255,255,166,0,59,241, + 89,0,0,0,59,241,89,89,255,255,255,125,7,206,255,251,89,59,241,89,0,0,89, + 255,166,59,241,89,0,0,0,0,59,245,225,21,0,0,7,206,251,89,59,245,247,34, + 0,0,59,241,89,0,0,138,255,255,255,166,0,0,59,245,255,255,255,225,21,0,0, + 0,138,255,255,255,166,0,0,59,245,255,255,255,251,89,0,0,0,59,245,255,255, + 201,89,255,255,255,255,255,255,255,125,59,241,89,0,0,0,59,241,97,206,166, + 0,0,0,0,175,201,175,201,0,0,7,206,201,0,0,0,175,171,206,225,21,0,0,59,245, + 166,245,125,0,0,0,89,251,89,89,255,255,255,255,255,127,0,228,34,0,0,59, + 215,21,0,0,0,0,12,228,34,0,0,0,59,245,201,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,127,0,0,175,225,21,0,0,0,175,225,21,0,0,0,89,232,241,89,0,0,59, + 241,89,0,0,138,225,21,0,89,255,125,0,0,59,192,59,241,89,0,0,175,251,89, + 0,59,241,89,0,0,0,0,59,241,89,0,0,0,0,0,89,255,125,0,0,7,199,34,59,241, + 89,0,0,0,59,241,89,0,59,241,89,0,0,0,59,241,89,59,241,89,0,59,241,89,0, + 59,241,89,0,0,0,0,59,245,255,125,0,0,89,255,251,89,59,245,255,201,0,0,59, + 241,89,0,138,251,89,0,12,235,166,0,59,241,89,0,7,206,225,21,0,138,251,89, + 0,12,235,166,0,59,241,89,0,0,138,247,34,0,12,235,125,0,7,176,21,0,0,59, + 241,89,0,0,0,59,241,89,0,0,0,59,241,89,138,225,21,0,0,12,235,125,89,225, + 21,0,59,245,247,34,0,12,232,89,12,235,166,0,7,206,166,0,89,247,34,0,7,206, + 125,0,0,0,0,0,7,206,166,12,228,34,0,0,7,202,89,0,0,0,0,12,228,34,0,0,12, + 235,133,206,166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,138,201,0,138, + 255,255,255,125,138,166,0,0,7,206,166,175,166,0,0,59,241,89,0,0,89,247, + 34,7,206,166,0,0,0,0,0,59,241,89,0,0,0,175,225,21,59,241,89,0,0,0,0,59, + 241,89,0,0,0,0,7,206,166,0,0,0,0,0,0,59,241,89,0,0,0,59,241,89,0,59,241, + 89,0,0,0,59,241,89,59,241,89,59,241,89,0,0,59,241,89,0,0,0,0,59,241,159, + 225,21,0,175,166,241,89,59,241,132,241,89,0,59,241,89,12,235,166,0,0,0, + 89,247,34,59,241,89,0,0,89,247,34,12,235,166,0,0,0,89,247,34,59,241,89, + 0,0,59,241,89,0,59,238,34,0,0,0,0,0,0,59,241,89,0,0,0,59,241,89,0,0,0,59, + 241,89,59,241,89,0,0,89,225,21,59,241,89,0,89,206,202,89,0,59,238,34,0, + 89,251,89,138,225,21,0,0,175,201,0,138,225,21,0,0,0,0,0,175,225,21,12,228, + 34,0,0,0,138,166,0,0,0,0,12,228,34,0,7,206,166,0,12,235,125,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,127,7,202,89,89,225,21,7,206,125,12,206,21,0,59,238, + 34,89,247,34,0,59,241,89,0,0,175,201,0,59,241,89,0,0,0,0,0,59,241,89,0, + 0,0,59,241,89,59,241,89,0,0,0,0,59,241,89,0,0,0,0,59,241,89,0,0,0,0,0,0, + 59,241,89,0,0,0,59,241,89,0,59,241,89,0,0,0,59,241,89,59,241,102,232,89, + 0,0,0,59,241,89,0,0,0,0,59,241,102,232,89,59,215,81,241,89,59,241,89,138, + 225,21,59,241,89,59,241,89,0,0,0,59,241,89,59,241,89,0,7,206,201,0,59,241, + 89,0,0,0,59,241,89,59,241,89,0,0,175,201,0,0,12,235,166,0,0,0,0,0,0,59, + 241,89,0,0,0,59,241,89,0,0,0,59,241,89,7,206,166,0,0,175,166,0,7,206,125, + 0,175,125,175,166,0,138,201,0,0,0,175,255,251,89,0,0,0,59,245,166,241,89, + 0,0,0,0,0,89,247,34,0,12,228,34,0,0,0,89,201,0,0,0,0,12,228,34,12,235,201, + 0,0,0,59,245,166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,59,215,21,175,125, + 0,7,206,125,7,199,34,0,138,201,0,12,235,125,0,59,245,255,255,255,247,34, + 0,59,241,89,0,0,0,0,0,59,241,89,0,0,0,59,241,89,59,245,255,255,255,255, + 127,59,245,255,255,255,255,127,59,241,89,0,0,0,0,0,0,59,245,255,255,255, + 255,255,251,89,0,59,241,89,0,0,0,59,241,89,59,245,255,247,34,0,0,0,59,241, + 89,0,0,0,0,59,241,89,138,201,175,166,59,241,89,59,241,89,12,235,125,59, + 241,89,59,241,89,0,0,0,12,235,125,59,245,255,255,255,201,0,0,59,241,89, + 0,0,0,12,235,125,59,245,255,255,255,125,0,0,0,0,59,245,255,255,125,0,0, + 0,59,241,89,0,0,0,59,241,89,0,0,0,59,241,89,0,138,225,21,59,241,89,0,0, + 175,201,7,202,89,89,201,0,175,166,0,0,0,12,235,166,0,0,0,0,0,138,255,166, + 0,0,0,0,0,59,245,125,0,0,12,228,34,0,0,0,12,228,34,0,0,0,12,228,34,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,59,215,21,175,125,0,7, + 206,125,7,199,34,7,206,125,0,0,175,201,0,59,241,89,0,0,89,247,34,59,241, + 89,0,0,0,0,0,59,241,89,0,0,0,59,241,89,59,241,89,0,0,0,0,59,241,89,0,0, + 0,0,59,241,89,0,59,245,255,251,89,59,241,89,0,0,0,59,241,89,0,59,241,89, + 0,0,0,59,241,89,59,241,89,175,225,21,0,0,59,241,89,0,0,0,0,59,241,89,12, + 235,247,34,59,241,89,59,241,89,0,89,247,94,241,89,59,241,89,0,0,0,59,241, + 89,59,241,89,0,0,0,0,0,59,241,89,0,0,0,59,241,89,59,241,89,12,235,166,0, + 0,0,0,0,0,0,138,251,89,0,0,59,241,89,0,0,0,59,241,89,0,0,0,59,241,89,0, + 12,232,89,138,225,21,0,0,89,225,81,215,21,12,228,47,232,89,0,0,0,175,255, + 251,89,0,0,0,0,59,241,89,0,0,0,0,7,206,201,0,0,0,12,228,34,0,0,0,0,175, + 125,0,0,0,12,228,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127, + 12,228,34,89,201,0,7,206,125,59,215,21,59,245,255,255,255,255,247,34,59, + 241,89,0,0,59,241,89,7,206,166,0,0,0,0,0,59,241,89,0,0,0,138,225,21,59, + 241,89,0,0,0,0,59,241,89,0,0,0,0,7,206,166,0,0,0,59,241,89,59,241,89,0, + 0,0,59,241,89,0,59,241,89,0,0,0,59,241,89,59,241,89,7,206,201,0,0,59,241, + 89,0,0,0,0,59,241,89,0,175,166,0,59,241,89,59,241,89,0,7,206,200,241,89, + 12,235,166,0,0,0,89,247,34,59,241,89,0,0,0,0,0,12,235,166,0,0,0,89,247, + 34,59,241,89,0,59,245,125,0,0,0,0,0,0,12,232,89,0,0,59,241,89,0,0,0,12, + 232,89,0,0,0,59,238,34,0,0,175,171,206,166,0,0,0,12,232,159,201,0,7,202, + 132,215,21,0,0,89,247,34,175,225,21,0,0,0,59,241,89,0,0,0,0,138,225,21, + 0,0,0,12,228,34,0,0,0,0,89,201,0,0,0,12,228,34,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,138,201,7,206,255,251,226,255,255,166,0, + 138,201,0,0,0,12,235,125,59,241,89,0,0,138,247,34,0,89,255,125,0,0,59,192, + 59,241,89,0,0,138,251,89,0,59,241,89,0,0,0,0,59,241,89,0,0,0,0,0,89,255, + 125,0,0,59,241,89,59,241,89,0,0,0,59,241,89,0,59,241,89,0,0,0,89,247,34, + 59,241,89,0,12,235,166,0,59,241,89,0,0,0,0,59,241,89,0,0,0,0,59,241,89, + 59,241,89,0,0,59,245,251,89,0,138,251,89,0,59,245,166,0,59,241,89,0,0,0, + 0,0,0,138,251,89,0,59,245,166,0,59,241,89,0,0,138,251,89,0,89,166,0,0,89, + 247,34,0,0,59,241,89,0,0,0,0,138,225,21,0,7,206,166,0,0,0,89,255,251,89, + 0,0,0,7,206,255,125,0,0,138,255,201,0,0,12,235,125,0,12,235,166,0,0,0,59, + 241,89,0,0,0,89,251,89,0,0,0,0,12,228,34,0,0,0,0,12,228,34,0,0,12,228,34, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,7,206,225,21,0, + 0,0,0,0,0,7,206,125,0,0,0,0,175,201,59,245,255,255,255,247,34,0,0,0,59, + 245,255,255,251,89,59,245,255,255,255,225,21,0,0,59,245,255,255,255,255, + 127,81,241,89,0,0,0,0,0,0,59,245,255,255,255,201,0,59,241,89,0,0,0,59,241, + 89,89,255,255,255,138,235,255,255,125,0,59,241,89,0,0,89,255,201,59,245, + 255,255,255,255,166,59,241,89,0,0,0,0,59,241,89,59,241,89,0,0,0,175,251, + 89,0,0,138,255,255,255,166,0,0,59,241,89,0,0,0,0,0,0,0,138,255,255,255, + 166,0,0,59,241,89,0,0,0,175,251,89,12,235,255,255,251,89,0,0,0,59,241,89, + 0,0,0,0,0,59,245,255,251,89,0,0,0,0,12,235,201,0,0,0,0,0,138,251,89,0,0, + 89,255,125,0,7,206,225,21,0,0,89,255,125,0,0,59,241,89,0,0,0,175,255,255, + 255,255,255,127,0,228,34,0,0,0,0,0,175,125,0,0,12,228,34,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,89,255,255,255,255,125,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,59,241,89,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12, + 228,34,0,0,0,0,0,89,201,0,0,12,228,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,138,255,255,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,235,255,255,125,0,0,0,12,228, + 124,255,255,247,34,0,0,0,0,0,0,0,0,0,245,255,255,255,255,255,255,0,0,0, + 0,0,0,0,0,0,0,127,127,127,127,127,127,127,127,127,127,127,0,127,127,127, + 127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127, + 127,0,127,127,127,127,127,127,127,127,0,127,127,127,127,127,127,0,127,127, + 127,127,127,127,0,127,127,127,127,127,127,127,127,0,127,127,127,127,127, + 127,127,127,0,127,127,127,127,0,127,127,127,127,0,127,127,127,127,127,127, + 127,0,127,127,127,127,127,127,0,127,127,127,127,127,127,127,127,127,0,127, + 127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,127,0,127,127, + 127,127,127,127,127,0,127,127,127,127,127,127,127,127,0,127,127,127,127, + 127,127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,127,127,127, + 0,127,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127, + 127,127,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127, + 127,127,127,127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,0,127, + 127,127,127,0,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127, + 127,127,127,127,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,127,0,89,255,125,0,0,0,0,0,0,0,0,0,0,59,241,89,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,59,241,89,0,0,0,0,0,0,0,0,89,255,255,166,0,0,0,0,0, + 0,0,59,241,89,0,0,0,0,0,0,0,0,0,0,0,59,241,89,0,0,0,0,59,241,89,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,175,255,201,0,12,228, + 34,0,0,89,255,247,34,0,0,0,0,0,0,0,0,0,0,0,0,0,89,255,255,255,255,255,255, + 255,255,255,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,59,241,89,0,0,0,0,0,0,0,0, + 0,59,241,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,59,241,89,0,0,0,0,0,0,0,12,235, + 125,0,0,0,0,0,0,0,0,0,59,241,89,0,0,0,0,59,241,89,0,89,251,89,59,241,89, + 0,0,0,0,59,241,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,59,241,89,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,89,225,21,0,0,12,228,34,0,0,0,0,138,201,0,0,0,0,0,0,0,0,0,0,0,0, + 0,89,166,0,0,0,0,0,0,0,138,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,59,241,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,59,241,89,0,0,0,0,0, + 0,0,59,241,89,0,0,0,0,0,0,0,0,0,59,241,89,0,0,0,0,0,0,0,0,0,0,0,59,241, + 89,0,0,0,0,59,241,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,59,241,89,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,138,166,0,0,0,12,228,34,0,0,0,0,89,225,21,0,0,0,0,0,0,0,0,0, + 0,0,0,89,166,0,0,0,0,0,0,0,138,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0, + 0,0,7,206,255,255,255,125,0,59,241,194,255,251,89,0,0,7,206,255,255,201, + 0,12,235,255,255,251,89,0,12,235,255,251,89,7,206,255,255,247,34,0,12,235, + 255,255,251,89,59,241,194,255,255,125,0,59,241,89,89,255,251,89,59,241, + 89,0,138,251,89,59,241,89,59,241,159,255,255,125,89,255,255,166,0,59,241, + 194,255,255,125,0,0,0,12,235,255,247,34,0,59,241,194,255,255,125,0,0,12, + 235,255,255,251,89,59,241,159,255,201,0,138,255,255,247,34,206,255,255, + 255,166,59,241,89,0,59,241,97,206,166,0,0,12,235,125,175,201,0,7,206,166, + 0,7,206,133,206,225,21,0,89,255,255,166,0,0,12,235,125,138,255,255,255, + 255,166,0,0,138,166,0,0,0,12,228,34,0,0,0,0,89,225,21,0,0,0,0,0,0,0,0,0, + 0,0,0,89,166,0,0,0,0,0,0,0,138,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0, + 0,0,0,0,0,0,89,247,34,59,245,166,0,138,225,21,7,206,201,0,0,0,7,206,166, + 0,59,241,89,7,206,125,0,89,225,21,59,241,89,0,0,7,206,166,0,59,241,89,59, + 245,166,0,89,247,34,59,241,89,0,59,241,89,59,241,89,138,225,21,0,59,241, + 89,59,245,201,0,89,255,201,0,89,247,34,59,245,166,0,89,247,34,0,7,206,166, + 0,138,225,21,59,245,166,0,138,247,34,7,206,166,0,59,241,89,59,245,201,0, + 0,59,238,34,0,130,34,59,241,89,0,0,59,241,89,0,59,241,89,89,247,34,0,89, + 247,34,138,225,21,12,235,225,21,12,232,89,7,206,166,12,235,125,89,247,34, + 0,89,247,34,0,0,0,89,247,34,0,0,138,166,0,0,0,12,228,34,0,0,0,0,89,225, + 21,0,0,7,206,247,34,0,0,89,201,0,0,89,166,0,0,0,0,0,0,0,138,125,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,59,241,89,59,241,89,0,59,241,89, + 59,241,89,0,0,0,59,241,89,0,59,241,89,59,238,34,0,59,238,34,59,241,89,0, + 0,59,241,89,0,59,241,89,59,241,89,0,59,241,89,59,241,89,0,59,241,89,59, + 241,159,201,0,0,0,59,241,89,59,241,89,0,59,241,89,0,59,241,89,59,241,89, + 0,59,241,89,0,59,241,89,0,59,241,89,59,241,89,0,59,241,89,59,241,89,0,59, + 241,89,59,241,89,0,0,59,241,89,0,0,0,59,241,89,0,0,59,241,89,0,59,241,89, + 12,235,125,0,175,166,0,59,238,34,89,171,202,89,89,225,21,0,59,241,226,201, + 0,12,235,125,0,175,166,0,0,0,12,235,125,0,0,59,238,34,0,0,0,12,228,34,0, + 0,0,0,7,206,125,0,7,202,89,12,235,166,0,175,125,0,0,89,166,0,0,0,0,0,0, + 0,138,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,89,255,255,255,251, + 89,59,241,89,0,59,241,89,59,238,34,0,0,0,59,238,34,0,59,241,89,59,245,255, + 255,255,251,0,59,241,89,0,0,59,238,34,0,59,241,89,59,241,89,0,59,241,89, + 59,241,89,0,59,241,89,59,245,255,225,21,0,0,59,241,89,59,241,89,0,59,241, + 89,0,59,241,89,59,241,89,0,59,241,89,0,59,238,34,0,12,232,89,59,241,89, + 0,12,232,89,59,238,34,0,59,241,89,59,241,89,0,0,0,175,255,255,201,0,59, + 241,89,0,0,59,241,89,0,59,241,89,0,175,201,12,232,89,0,7,206,125,172,89, + 138,166,138,201,0,0,0,138,247,34,0,0,175,201,12,232,89,0,0,7,206,166,0, + 0,175,225,21,0,0,0,0,12,228,34,0,0,0,0,0,0,175,225,34,206,21,0,0,175,255, + 166,0,0,0,89,166,0,0,0,0,0,0,0,138,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0, + 0,0,0,0,59,241,89,0,59,241,89,59,241,89,0,59,238,34,59,241,89,0,0,0,59, + 241,89,0,59,241,89,59,238,34,0,0,0,0,59,241,89,0,0,59,241,89,0,59,241,89, + 59,241,89,0,59,241,89,59,241,89,0,59,241,89,59,241,97,206,201,0,0,59,241, + 89,59,241,89,0,59,241,89,0,59,241,89,59,241,89,0,59,241,89,0,59,241,89, + 0,59,241,89,59,241,89,0,59,241,89,59,241,89,0,59,241,89,59,241,89,0,0,0, + 0,0,59,245,125,59,241,89,0,0,59,241,89,0,59,241,89,0,59,238,124,225,21, + 0,0,175,176,206,21,59,215,187,125,0,0,59,245,255,201,0,0,89,247,124,225, + 21,0,0,138,225,21,0,0,0,59,241,89,0,0,0,12,228,34,0,0,0,0,12,235,125,0, + 0,0,0,0,0,0,0,0,0,0,0,89,166,0,0,0,0,0,0,0,138,125,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,127,0,0,0,0,0,0,0,89,247,34,0,89,251,89,59,241,89,0,175,201,0,7,206,201, + 0,0,0,7,206,166,0,138,251,89,7,206,166,0,7,199,34,59,241,89,0,0,7,206,166, + 0,138,251,89,59,241,89,0,59,241,89,59,241,89,0,59,241,89,59,241,89,12,235, + 166,0,59,241,89,59,241,89,0,59,241,89,0,59,241,89,59,241,89,0,59,241,89, + 0,7,206,166,0,138,225,21,59,241,89,0,138,225,21,7,206,166,0,89,251,89,59, + 241,89,0,0,89,125,0,12,232,89,12,232,89,0,12,12,235,125,0,175,251,89,0, + 7,206,255,125,0,0,0,89,255,201,0,7,206,247,34,0,7,206,166,59,245,125,0, + 7,206,255,125,0,0,59,241,89,0,0,0,0,0,138,166,0,0,0,12,228,34,0,0,0,0,89, + 225,21,0,0,0,0,0,0,0,0,0,0,0,0,89,166,0,0,0,0,0,0,0,138,125,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,127,0,0,0,0,0,0,0,0,175,255,255,232,241,89,59,245,255,255,247, + 34,0,0,12,235,255,255,201,0,59,245,255,200,241,89,0,12,235,255,251,89,0, + 59,241,89,0,0,0,12,235,255,200,241,89,59,241,89,0,59,241,89,59,241,89,0, + 59,241,89,59,241,89,0,59,245,201,59,241,89,59,241,89,0,59,241,89,0,59,241, + 89,59,241,89,0,59,241,89,0,0,12,235,255,247,34,0,59,245,166,255,247,34, + 0,0,59,245,255,166,241,89,59,241,89,0,0,59,245,255,255,166,0,0,138,255, + 255,125,0,89,255,255,166,241,89,0,0,138,247,34,0,0,0,59,245,125,0,0,138, + 225,21,7,206,225,21,0,138,251,0,0,138,247,34,0,0,175,255,255,255,255,166, + 0,0,138,166,0,0,0,12,228,34,0,0,0,0,89,225,21,0,0,0,0,0,0,0,0,0,0,0,0,89, + 255,255,255,255,255,255,255,255,255,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,138,225,21,0,0,0,0,0,0,0,0,0,0,0,89,247,34,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,59,241, + 89,0,0,0,0,0,0,0,0,59,241,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,232,89,0,0,0,0,0, + 0,0,0,0,0,0,138,201,0,0,0,12,228,34,0,0,0,0,138,201,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,166,255,255,247,34,0,0,0,0,0,0,0,0,0,0,0,255,255,125,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,59,241,89,0, + 0,0,0,0,0,0,0,59,241,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,138,225,21,0,0,0,0,0,0,0, + 0,0,0,0,7,206,255,201,0,12,228,34,0,0,89,255,251,89,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,127,127,127,127, + 127,0,127,127,127,127,127,127,0,127,127,127,127,127,127,0,127,127,127,127, + 127,0,127,127,127,127,127,127,0,127,127,127,127,127,127,0,127,127,127,127, + 0,127,127,127,127,127,127,0,127,127,127,127,127,127,0,127,127,0,127,127, + 127,0,127,127,127,127,127,127,0,127,127,0,127,127,127,127,127,127,127,127, + 127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,0,127,127, + 127,127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,0,127,127,127, + 127,127,0,127,127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,127, + 127,0,127,127,127,127,127,127,127,127,127,0,127,127,127,127,127,0,127,127, + 127,127,127,127,0,127,127,127,127,127,0,127,127,127,127,127,127,0,127,127, + 127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,127,0,127, + 127,127,127,127,127,127,127,127,127,127,127,127,127,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,89,247,34,138,201,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,235,125,59,238,34,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 89,255,225,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,12,235,251,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,59,238,34,138,201,0,0, + 0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,199,34,0,0,0,0,0,7,199,34,0,0,0,0, + 138,255,201,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,251,89,0,0,138,255,251,97,206,201, + 0,0,138,251,102,235,201,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,89,255,201,12,228,34,0,0,0,0,0,0,0,0,0,0,0,0,7,206,166,12,232,89,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,175,166,12,235,127, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,175,255,255,255,225,21,59,245,255, + 255,255,255,255,125,0,0,0,0,0,0,0,7,206,255,247,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,7,199,34,0,0,0,0,0,7,199,34,0,0,0,138,225,21,175,166,0,0,175, + 255,255,166,0,0,7,202,89,0,0,0,0,0,0,0,0,0,0,59,245,255,255,201,0,0,0,0, + 0,0,0,0,59,245,255,255,255,255,255,255,255,255,125,0,59,245,255,255,255, + 255,255,125,0,0,89,255,255,255,255,255,225,21,59,245,255,255,255,255,255, + 125,0,0,0,59,245,255,255,255,255,255,125,7,206,166,0,0,175,171,206,166, + 89,247,34,0,175,201,59,241,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,12,228,34,175,255,125,0,0,89,255,255,255,125,175,251,89,89,255,125, + 0,7,206,255,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,59,245,255,255, + 255,255,255,125,0,0,7,206,255,125,59,245,125,0,0,0,89,251,89,0,0,0,0,0, + 0,0,127,7,206,225,21,0,0,0,0,59,115,0,0,0,0,59,115,0,0,0,0,0,0,0,175,201, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,59,245,255,255,255,255,125,0,59,245, + 255,255,255,255,125,0,0,0,0,0,0,0,89,247,34,12,228,34,0,138,166,0,0,0,0, + 0,0,0,0,0,0,12,235,125,0,7,176,21,0,0,0,0,0,0,138,251,89,0,0,138,201,0, + 0,0,0,0,0,59,115,0,0,0,0,59,115,0,0,0,0,0,0,7,206,166,0,59,115,0,0,0,0, + 59,115,0,0,0,59,115,0,0,0,0,59,115,0,89,201,0,12,232,89,89,201,7,202,89, + 12,232,89,138,201,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,7,199,34,0,172,132,196,199,163,125,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,59,115,0,0,0,0,59,115,0,0,0,0,0,0,0,89,247, + 34,0,7,206,125,0,0,0,0,0,0,0,0,127,89,247,34,0,0,0,0,0,59,115,0,0,0,0,59, + 115,0,0,0,0,0,0,7,206,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,199, + 34,0,0,0,0,0,7,199,34,0,0,0,0,0,0,0,0,0,89,225,21,7,202,89,12,228,34,0, + 0,0,0,0,0,0,0,0,0,59,238,34,0,0,0,0,0,0,0,130,34,59,241,89,0,0,0,138,201, + 0,0,0,0,0,0,59,115,0,0,0,0,59,115,0,0,0,0,0,0,175,225,21,0,59,115,0,0,0, + 0,59,115,0,0,0,59,115,0,0,0,0,59,115,0,12,228,34,59,192,0,12,228,34,138, + 166,59,215,21,175,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,7,199,34,0,172,89,175,166,138,125,0,138,255,255,247,34, + 12,146,0,0,0,0,89,255,255,255,125,12,235,255,255,125,0,0,0,59,115,0,0,0, + 0,59,115,0,138,255,255,255,255,127,0,175,201,0,138,225,21,0,0,0,0,0,0,0, + 0,127,245,255,255,255,255,255,125,0,59,115,0,0,0,0,59,115,0,0,0,0,0,0,12, + 232,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,199,34,0,0,0,0,0,7,199, + 34,0,0,0,0,0,0,0,0,0,89,247,34,12,228,34,138,166,0,0,0,0,0,0,0,0,0,0,0, + 12,235,166,0,0,0,0,0,0,175,225,21,138,225,21,0,0,0,138,201,0,0,0,0,0,0, + 59,115,0,0,0,0,59,115,0,0,0,0,0,89,247,34,0,0,59,115,0,0,0,0,59,115,0,0, + 0,59,115,0,0,0,0,59,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,138,255,166, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,199,34,0,172, + 89,0,0,138,125,59,238,34,0,130,34,7,206,201,0,0,59,241,89,0,12,235,255, + 125,0,59,241,89,0,0,59,115,0,0,0,0,59,115,0,0,0,0,89,247,34,0,59,245,166, + 241,89,0,0,0,0,0,0,0,0,0,127,138,225,21,0,0,0,0,0,59,115,0,0,0,0,59,115, + 0,0,0,0,0,89,255,255,255,247,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,199, + 34,0,0,0,0,0,7,199,34,0,0,0,0,0,0,0,0,0,0,175,255,255,166,59,215,21,175, + 255,255,125,0,89,255,255,201,0,0,0,59,245,255,255,125,0,12,235,166,0,0, + 138,225,21,0,0,0,138,255,255,255,255,247,34,0,59,115,0,0,0,0,59,115,0,0, + 0,0,59,245,125,0,0,0,59,115,0,0,0,0,59,115,0,0,0,59,115,0,0,0,0,59,115, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,59,245,255,251,102,0,255,255,255,255, + 255,0,245,255,255,255,255,255,255,255,255,255,255,127,21,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,59,241,89,0,0,0,0,0,138,247,34,138,201,0,0,0,175, + 201,0,0,0,175,166,0,0,59,115,0,0,0,0,59,115,0,0,0,12,235,125,0,0,0,138, + 255,166,0,0,0,0,0,0,0,0,0,0,127,245,255,255,255,255,225,21,0,59,115,0,0, + 0,0,59,115,0,0,0,0,0,0,89,225,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,7,199,34,0,0,0,59,245,255,255,255,255,125,0,0,0,0,0,0,0,0,0,0,0,0,175, + 125,89,225,21,59,238,47,232,89,7,206,125,0,0,0,0,0,138,251,89,12,235,166, + 0,0,138,225,21,0,0,0,138,201,0,0,0,0,0,0,59,115,0,0,0,0,59,115,0,0,0,7, + 206,201,0,0,0,0,59,115,0,0,0,0,59,115,0,0,0,59,115,0,0,0,0,59,115,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,59,245,255,251,89,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,175,255,255,201,0, + 0,0,138,247,34,175,201,0,0,0,138,255,255,255,255,255,166,0,0,59,115,0,0, + 0,0,59,115,0,0,7,206,166,0,0,0,0,59,241,89,0,0,0,0,0,0,0,0,0,0,127,89,251, + 89,0,0,0,0,0,59,115,0,0,0,0,59,115,0,0,0,0,0,0,138,201,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,7,199,34,0,0,0,0,0,7,199,34,0,0,0,0,0,0,0,0,0, + 0,0,0,0,59,215,21,138,201,0,12,228,47,228,34,0,175,166,0,0,0,0,0,12,232, + 89,0,0,175,225,21,59,241,89,0,0,0,138,201,0,0,0,0,0,0,59,115,0,0,0,0,59, + 115,0,0,0,138,225,21,0,0,0,0,59,115,0,0,0,0,59,115,0,0,0,59,115,0,0,0,0, + 59,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,138,255,166,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,59, + 245,125,7,206,201,0,0,138,201,0,0,0,175,201,0,0,0,0,0,0,0,59,115,0,0,0, + 0,59,115,0,0,138,225,21,0,0,0,0,59,241,89,0,0,0,0,0,0,0,0,0,0,127,7,206, + 247,34,0,0,0,0,59,115,0,0,0,0,59,115,0,59,245,125,0,0,175,166,0,0,0,59, + 245,125,175,225,29,206,166,0,89,247,34,7,206,166,0,0,0,7,199,34,0,0,0,0, + 0,7,199,34,0,0,0,0,0,0,0,0,0,0,0,0,7,202,89,0,89,225,21,59,238,47,232,89, + 7,206,125,0,89,166,0,0,89,247,34,0,0,0,130,34,0,138,255,125,0,0,138,201, + 0,0,0,0,0,0,59,115,0,0,0,0,59,115,0,0,89,251,89,0,0,0,0,0,59,115,0,0,0, + 0,59,115,0,0,0,59,115,0,0,0,0,59,115,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,89,125,0,12,232,89,12,146,0,0,0,59,241,89,0,12,235,247, + 34,0,0,89,125,0,0,59,115,0,0,0,0,59,115,0,59,241,89,0,0,0,0,0,59,241,89, + 0,0,0,0,0,0,0,0,0,0,127,0,0,175,255,255,255,225,21,59,245,255,255,255,255, + 255,125,0,138,225,21,0,12,235,125,0,0,0,138,225,34,235,125,7,206,166,0, + 89,247,34,7,206,166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 138,201,0,0,0,175,255,255,125,0,89,255,255,201,0,0,12,235,255,255,251,89, + 0,0,0,0,0,0,0,0,89,255,255,255,255,255,255,255,255,255,125,0,59,245,255, + 255,255,255,255,125,0,0,175,255,255,255,255,255,247,34,59,245,255,255,255, + 255,255,125,0,0,0,59,245,255,255,255,255,255,125,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,59,245,255,255,166,0,0,0,0,0,0,0,89,255,255, + 255,125,59,245,255,255,201,0,0,0,59,245,255,255,255,255,255,125,0,175,255, + 255,255,255,127,0,0,59,241,89,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,175,166,0,255,255,201,0,0,0,0,175,166,59,238,34,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,228,34,0,0, + 0,0,0,0,0,12,228,34,138,166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,127,127, + 127,127,127,127,0,127,127,127,127,127,127,127,127,0,127,127,0,127,127,127, + 127,127,127,0,127,127,127,127,127,0,127,127,127,127,127,127,127,127,127, + 0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127, + 127,127,0,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127, + 127,127,0,127,127,127,127,127,127,127,0,127,127,127,0,127,127,127,127,127, + 127,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,127,127,0, + 127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,127,127,0,127, + 127,127,127,127,127,127,127,127,0,127,127,0,127,127,0,127,127,127,127,0, + 127,127,127,127,127,0,127,127,127,127,127,0,127,127,127,127,127,0,127,127, + 127,127,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127, + 127,127,127,127,127,127,127,127,127,0,127,127,127,127,127,0,127,127,127, + 127,0,127,127,127,127,127,127,127,127,127,127,127,127,0,127,127,127,127, + 127,127,127,127,127,0,127,127,127,127,127,0,127,127,127,127,127,127,127, + 0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,245,255,255,255,255,255, + 251,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,12,228,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,89,255,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,138,225,21, + 0,0,0,138,125,0,0,0,0,59,245,255,255,125,0,0,0,0,0,0,0,0,138,225,21,0,0, + 175,166,0,12,228,34,0,0,59,245,255,255,247,34,0,89,225,29,206,166,0,0,0, + 0,0,89,255,255,255,255,125,0,0,0,7,206,255,255,247,34,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,89,255,255,255,255,125,0,0,0,0,0,0,0, + 0,0,0,0,0,138,255,255,166,0,0,0,0,7,202,89,0,0,0,0,0,12,235,255,125,0,0, + 175,255,255,225,21,0,0,0,12,235,125,0,0,0,0,0,0,0,0,0,0,0,138,255,255,255, + 255,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,228,34,0,0,89,255,255,225,21,0,0, + 0,0,0,0,0,0,0,0,0,138,166,0,0,0,89,225,21,0,0,0,0,0,138,166,0,0,0,89,225, + 21,0,0,0,12,235,255,255,166,0,0,7,206,125,0,0,0,0,0,0,89,247,34,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,138,225,21,0,0,0,138,125,0,0,0,12, + 235,125,0,59,115,0,0,0,0,0,0,0,0,7,206,125,0,59,215,21,0,12,228,34,0,12, + 235,125,0,0,168,34,0,0,0,0,0,0,0,0,0,0,175,225,21,0,0,0,175,225,21,0,0, + 0,0,0,138,166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,175,225, + 21,0,0,0,175,225,21,0,0,0,0,0,0,0,0,0,59,238,34,7,206,125,0,0,0,7,202,89, + 0,0,0,0,7,199,34,59,238,34,0,0,0,7,202,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,89,255,255,255,125,175,125,0,0,0,0,0,0,0,0,0,0,0,0,0,138,255,247,34,0, + 59,241,89,0,175,201,0,0,0,0,0,0,0,0,0,7,206,255,166,0,0,12,232,89,0,0,0, + 0,7,206,255,166,0,0,12,232,89,0,0,0,0,0,0,0,59,215,21,0,89,201,0,0,0,0, + 0,0,0,89,247,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,7, + 206,255,255,251,89,0,59,241,89,0,0,0,138,201,0,0,0,138,201,0,0,89,225,21, + 175,125,0,0,12,228,34,0,12,235,125,0,0,0,0,0,0,0,0,0,0,0,0,0,138,166,0, + 89,255,255,247,34,89,201,0,0,89,255,255,255,166,0,0,0,0,168,34,7,151,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,138,166,7,206,255,255,225,21,89,201,0,0,0, + 0,0,0,0,0,0,89,166,0,0,138,166,0,0,0,7,202,89,0,0,0,0,0,0,0,59,238,34,0, + 7,206,255,125,0,0,0,0,0,0,0,0,0,59,238,34,0,0,175,166,0,175,255,255,255, + 125,175,125,0,138,247,34,0,0,0,0,0,0,0,0,0,0,12,228,34,0,89,201,0,0,89, + 225,0,81,115,0,134,89,0,0,0,0,0,138,166,0,0,138,166,0,0,0,0,0,0,0,138,166, + 0,0,138,166,0,0,0,0,0,0,59,245,247,34,0,12,232,89,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,89,201,0,7,206,201,138,125, + 138,125,0,59,241,89,0,0,0,0,175,255,255,255,225,21,0,0,7,206,166,215,21, + 0,0,12,228,34,0,0,138,255,255,251,89,0,0,0,0,0,0,0,0,0,12,206,21,59,241, + 89,0,134,89,0,172,89,59,238,34,0,138,166,0,0,7,206,201,12,235,125,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,12,206,21,7,202,89,12,235,125,0,172,89,0,0,0,0, + 0,0,0,0,59,238,34,7,206,125,12,235,255,255,255,255,255,255,125,0,0,0,12, + 235,125,0,0,0,0,7,206,125,0,0,0,0,0,0,0,0,59,238,34,0,0,175,166,0,175,255, + 255,255,125,175,125,0,138,247,34,0,0,0,0,0,0,0,0,0,0,12,228,34,0,89,201, + 0,0,89,225,0,29,206,166,59,245,125,0,0,0,0,138,166,0,12,228,34,0,175,225, + 21,0,0,0,138,166,0,12,228,42,206,255,255,166,0,0,0,0,12,228,34,138,166, + 0,89,247,34,0,0,0,0,59,238,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0, + 0,0,138,201,0,59,241,89,138,125,0,0,59,245,255,255,255,125,0,0,138,166, + 0,89,201,0,0,0,0,89,255,125,0,0,0,0,0,0,0,7,206,125,0,138,251,89,0,0,0, + 0,0,0,0,0,89,166,0,138,201,0,0,0,0,0,89,166,59,215,21,0,175,166,0,59,245, + 125,89,251,89,0,0,12,235,255,255,255,255,255,255,125,138,255,255,251,89, + 127,166,0,7,202,89,12,232,89,0,89,166,0,0,0,0,0,0,0,0,0,138,255,255,166, + 0,0,0,0,7,202,89,0,0,0,0,0,59,241,89,0,0,0,0,0,7,206,125,0,0,0,0,0,0,0, + 0,59,238,34,0,0,175,166,0,89,255,255,255,125,175,125,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,12,228,34,0,59,241,89,0,175,201,0,0,0,175,201,7,206,201,0,0,0, + 138,166,0,175,166,0,138,200,215,21,0,0,0,138,166,0,175,166,7,151,0,89,247, + 34,0,0,0,59,238,47,228,34,59,219,209,34,0,0,0,89,255,125,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,138,225,21,59,238,34,138,125,0,0,0,59, + 241,89,0,0,0,0,138,166,0,89,201,0,0,59,245,255,255,255,255,125,0,0,0,0, + 0,59,238,34,0,7,206,125,0,0,0,0,0,0,0,0,89,166,0,138,201,0,0,0,0,0,89,166, + 0,175,255,255,223,166,0,12,235,125,59,241,89,0,0,0,0,0,0,0,0,0,175,125, + 0,0,0,0,0,138,125,0,7,206,255,255,125,0,0,59,157,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,7,202,89,0,0,0,0,7,206,255,255,255,166,7,206,255,255,201,0, + 0,0,0,0,0,0,0,0,59,238,34,0,0,175,166,0,0,89,255,255,125,175,125,0,0,0, + 0,0,0,0,0,0,0,0,0,0,89,255,255,251,89,0,89,255,255,225,21,0,0,0,175,225, + 29,206,166,0,0,0,138,166,59,215,21,59,215,81,215,21,0,0,0,138,166,59,215, + 21,0,0,0,89,225,21,59,245,255,255,125,138,166,7,202,97,199,34,0,0,89,251, + 89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,138,225,21,59,241, + 89,138,125,0,0,0,89,247,34,0,0,0,0,175,255,255,255,225,21,0,0,0,12,232, + 89,0,0,0,12,228,34,0,12,235,225,21,59,215,21,0,0,0,0,0,0,0,0,12,206,21, + 59,241,89,0,134,89,0,172,89,0,0,0,0,0,0,0,0,7,206,201,12,235,125,0,0,0, + 0,0,0,0,0,175,125,0,0,0,0,0,12,206,21,7,202,89,7,206,125,0,172,89,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,202,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,59,238,34,0,0,175,166,0,0,0,0,175,125,175,125,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,206,166,59,245,125,0,0,0,0,0,0, + 175,125,12,228,34,59,215,21,0,0,0,0,0,175,125,0,0,0,12,232,89,0,0,0,0,0, + 59,238,34,175,125,7,199,34,0,0,175,201,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,127,0,0,0,0,0,138,225,21,7,206,201,138,125,138,125,7,202,89,0,0,0, + 0,138,201,0,0,0,138,166,0,0,0,12,232,89,0,0,0,12,228,34,0,0,0,175,255,255, + 166,0,0,0,0,0,0,0,0,0,0,138,166,0,89,255,255,247,34,89,201,0,0,0,0,0,0, + 0,0,0,0,0,168,34,7,151,0,0,0,0,0,0,0,0,175,125,0,0,0,0,0,0,138,166,7,202, + 89,0,89,247,124,201,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,235,255,255,255,255, + 255,255,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,59,245,125,0,7,206, + 166,0,0,0,0,175,125,175,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,59,115,0,134,89,0,0,0,0,0,0,59,215,21,59,245,255,255,255,225,21,0, + 0,0,59,215,21,0,0,59,238,34,0,0,0,0,0,0,175,125,7,206,255,255,255,251,89, + 0,138,247,34,0,59,157,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,138,225, + 21,0,7,206,255,255,251,89,138,255,255,255,255,255,166,0,0,0,0,0,0,0,0,0, + 0,12,232,89,0,0,0,12,228,34,0,0,0,0,0,59,241,89,0,0,0,0,0,0,0,0,0,0,175, + 225,21,0,0,0,175,225,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,175,225,21,0,0,0,175,225,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,59,238,198, + 255,251,194,166,0,0,0,0,175,125,175,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,206,125,0,0,0,0,89,225,21,0,0,0, + 7,206,125,0,0,12,235,255,255,255,166,0,0,0,89,225,21,0,0,0,12,228,34,0, + 0,0,175,255,255,255,166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0, + 0,0,0,0,138,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,228, + 34,0,7,176,21,0,89,247,34,0,0,0,0,0,0,0,0,0,0,0,89,255,255,255,255,125, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,89, + 255,255,255,255,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,59,238,34,0,0,0,0,0,0,0,0,175, + 125,175,125,0,0,0,0,0,0,0,0,59,215,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0, + 0,0,0,0,0,0,0,138,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 12,228,34,0,7,206,255,255,251,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,59,238,34,0,0,0,0,0,0,0,0,175,125,175,125, + 0,0,0,0,0,0,59,245,251,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,127,127,0,127,127, + 127,0,127,127,127,127,127,127,0,127,127,127,127,127,127,0,127,127,127,127, + 127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,0,127,127,127,127, + 127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,127,127,127,127, + 127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127, + 127,127,127,127,127,127,127,0,127,127,127,127,0,127,127,127,127,127,127, + 127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127, + 0,127,127,127,127,127,127,127,127,127,0,127,127,127,127,127,127,0,127,127, + 127,127,127,127,0,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127, + 127,127,127,127,127,127,0,127,127,127,127,0,127,127,127,127,127,127,0,127, + 127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127, + 127,127,127,127,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127, + 127,127,127,127,127,0,127,127,127,127,127,127,127,127,127,127,127,127,0, + 127,127,127,127,127,127,127,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,89, + 255,125,0,0,0,0,0,0,12,235,201,0,0,0,0,12,235,251,89,0,0,0,0,175,255,125, + 89,201,0,0,0,0,0,0,0,0,0,0,0,59,245,247,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,89,255,125,0,0,0,0,0,0,138,251,89,0,0,0,12,235,251, + 89,0,0,0,0,0,0,0,0,7,206,225,21,0,0,0,89,255,125,0,89,255,225,21,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,12,235,247,34,172,89,0,0,0,0,7,206,225,21,0,0, + 0,0,0,0,0,89,255,125,0,0,0,0,0,0,89,255,225,21,0,0,0,0,12,235,247,34,172, + 89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,89, + 255,125,0,0,0,0,0,0,0,7,206,225,21,0,0,0,0,89,255,225,21,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,89,255,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0, + 0,89,247,34,0,0,0,0,0,175,166,0,0,0,0,7,206,125,59,241,89,0,0,89,201,12, + 235,247,34,0,0,7,206,166,59,241,89,0,0,12,228,34,59,215,21,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,59,238,34,0,0,0,0,89,247,34,0,0,0,7, + 206,125,59,241,89,0,7,206,166,59,238,34,0,0,175,166,0,0,59,241,89,0,89, + 247,34,138,201,59,238,34,138,201,0,0,0,0,0,0,0,0,0,0,0,175,125,89,255,201, + 0,0,0,0,0,0,0,175,201,0,0,0,0,0,0,12,232,89,0,0,0,0,0,0,59,238,34,138,225, + 21,0,0,0,175,125,89,255,201,0,0,0,0,59,238,34,138,201,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,89,247,34,0,0,0,0,0,0,138,201,0,0,0,0, + 0,59,238,34,138,225,21,0,0,0,59,238,34,138,201,0,0,0,0,12,232,89,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,228,34,59,215,21,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,235,255,255,125,0, + 0,0,0,127,0,0,12,235,225,21,0,0,0,0,12,235,225,21,0,0,0,0,12,235,225,21, + 0,0,0,0,12,235,225,21,0,0,0,0,12,235,225,21,0,0,0,0,12,235,225,21,0,0,0, + 0,0,175,255,255,255,255,255,255,255,166,0,0,138,255,255,255,251,89,59,245, + 255,255,255,255,127,81,245,255,255,255,255,225,21,59,245,255,255,255,255, + 127,81,245,255,255,255,255,127,111,255,255,255,125,89,255,255,255,125,89, + 255,255,255,125,89,255,255,255,125,7,206,255,255,255,255,125,0,0,59,245, + 247,34,0,0,59,241,89,0,0,0,138,255,255,255,166,0,0,0,0,138,255,255,255, + 166,0,0,0,0,0,138,255,255,255,166,0,0,0,0,138,255,255,255,166,0,0,0,0,138, + 255,255,255,166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,138,255,255,255,210,235,166, + 59,241,89,0,0,0,59,241,89,59,241,89,0,0,0,59,241,89,59,241,89,0,0,0,59, + 241,89,59,241,89,0,0,0,59,241,132,245,125,0,0,0,89,251,89,12,232,89,0,0, + 0,0,7,206,166,0,89,251,89,0,0,0,127,0,0,89,232,241,89,0,0,0,0,89,232,241, + 89,0,0,0,0,89,232,241,89,0,0,0,0,89,232,241,89,0,0,0,0,89,232,241,89,0, + 0,0,0,89,232,241,89,0,0,0,0,12,232,89,89,225,21,0,0,0,0,0,175,247,34,0, + 0,59,192,59,241,89,0,0,0,0,59,241,89,0,0,0,0,0,59,241,89,0,0,0,0,59,241, + 89,0,0,0,0,0,59,241,89,0,0,59,241,89,0,0,59,241,89,0,0,59,241,89,0,7,206, + 166,0,0,59,245,201,0,59,245,255,201,0,0,59,241,89,0,0,138,251,89,0,12,235, + 166,0,0,138,251,89,0,12,235,166,0,0,0,138,251,89,0,12,235,166,0,0,138,251, + 89,0,12,235,166,0,0,138,251,89,0,12,235,166,0,0,0,138,166,0,0,0,12,228, + 34,0,0,175,247,34,0,0,175,225,21,59,241,89,0,0,0,59,241,89,59,241,89,0, + 0,0,59,241,89,59,241,89,0,0,0,59,241,89,59,241,89,0,0,0,59,241,89,89,247, + 34,0,7,206,125,0,12,232,89,0,0,0,0,59,241,89,0,12,232,89,0,0,0,127,0,7, + 206,166,175,166,0,0,0,7,206,166,175,166,0,0,0,7,206,166,175,166,0,0,0,7, + 206,166,175,166,0,0,0,7,206,166,175,166,0,0,0,0,175,166,175,166,0,0,0,0, + 138,225,21,89,225,21,0,0,0,0,59,241,89,0,0,0,0,0,59,241,89,0,0,0,0,59,241, + 89,0,0,0,0,0,59,241,89,0,0,0,0,59,241,89,0,0,0,0,0,59,241,89,0,0,59,241, + 89,0,0,59,241,89,0,0,59,241,89,0,7,206,166,0,0,0,59,245,125,59,241,132, + 241,89,0,59,241,89,0,12,235,166,0,0,0,89,247,34,12,235,166,0,0,0,89,247, + 34,0,12,235,166,0,0,0,89,247,34,12,235,166,0,0,0,89,247,34,12,235,166,0, + 0,0,89,247,34,0,0,12,235,125,0,12,235,125,0,0,59,241,89,0,0,138,176,235, + 166,59,241,89,0,0,0,59,241,89,59,241,89,0,0,0,59,241,89,59,241,89,0,0,0, + 59,241,89,59,241,89,0,0,0,59,241,89,0,175,201,0,138,225,21,0,12,235,255, + 255,255,225,21,59,238,34,0,138,225,21,0,0,0,127,0,59,238,34,89,247,34,0, + 0,59,238,34,89,247,34,0,0,59,238,34,89,247,34,0,0,59,238,34,89,247,34,0, + 0,59,238,34,89,247,34,0,0,59,241,89,89,225,21,0,0,7,206,125,0,89,225,21, + 0,0,0,0,138,225,21,0,0,0,0,0,59,241,89,0,0,0,0,59,241,89,0,0,0,0,0,59,241, + 89,0,0,0,0,59,241,89,0,0,0,0,0,59,241,89,0,0,59,241,89,0,0,59,241,89,0, + 0,59,241,89,0,7,206,166,0,0,0,7,206,166,59,241,89,138,225,21,59,241,89, + 0,59,241,89,0,0,0,59,241,89,59,241,89,0,0,0,59,241,89,0,59,241,89,0,0,0, + 59,241,89,59,241,89,0,0,0,59,241,89,59,241,89,0,0,0,59,241,89,0,0,0,12, + 235,138,235,125,0,0,0,138,225,21,0,59,215,21,175,201,59,241,89,0,0,0,59, + 241,89,59,241,89,0,0,0,59,241,89,59,241,89,0,0,0,59,241,89,59,241,89,0, + 0,0,59,241,89,0,59,245,166,241,89,0,0,12,232,89,0,0,175,225,59,238,47,235, + 225,21,0,0,0,0,127,0,138,201,0,12,235,125,0,0,138,201,0,12,235,125,0,0, + 138,201,0,12,235,125,0,0,138,201,0,12,235,125,0,0,138,201,0,12,235,125, + 0,0,138,225,21,12,235,125,0,0,89,247,34,0,89,255,255,255,255,251,89,138, + 225,21,0,0,0,0,0,59,245,255,255,255,255,127,59,245,255,255,255,255,166, + 0,59,245,255,255,255,255,127,59,245,255,255,255,255,127,0,59,241,89,0,0, + 59,241,89,0,0,59,241,89,0,0,59,241,89,7,206,255,255,255,166,0,0,175,201, + 59,241,89,12,235,125,59,241,89,0,59,241,89,0,0,0,12,235,125,59,241,89,0, + 0,0,12,235,125,0,59,241,89,0,0,0,12,235,125,59,241,89,0,0,0,12,235,125, + 59,241,89,0,0,0,12,235,125,0,0,0,0,12,235,125,0,0,0,0,138,225,21,7,199, + 34,0,138,225,81,241,89,0,0,0,59,241,89,59,241,89,0,0,0,59,241,89,59,241, + 89,0,0,0,59,241,89,59,241,89,0,0,0,59,241,89,0,0,138,255,166,0,0,0,12,232, + 89,0,0,89,247,59,238,34,0,59,245,125,0,0,0,127,7,206,125,0,0,175,201,0, + 7,206,125,0,0,175,201,0,7,206,125,0,0,175,201,0,7,206,125,0,0,175,201,0, + 7,206,125,0,0,175,201,0,7,206,125,0,0,175,201,0,7,206,255,255,255,255,225, + 21,0,0,0,0,138,225,21,0,0,0,0,0,59,241,89,0,0,0,0,59,241,89,0,0,0,0,0,59, + 241,89,0,0,0,0,59,241,89,0,0,0,0,0,59,241,89,0,0,59,241,89,0,0,59,241,89, + 0,0,59,241,89,0,7,206,166,0,0,0,7,206,166,59,241,89,0,89,247,94,241,89, + 0,59,241,89,0,0,0,59,241,89,59,241,89,0,0,0,59,241,89,0,59,241,89,0,0,0, + 59,241,89,59,241,89,0,0,0,59,241,89,59,241,89,0,0,0,59,241,89,0,0,0,12, + 235,138,235,125,0,0,0,138,225,21,175,125,0,0,175,201,59,241,89,0,0,0,59, + 241,89,59,241,89,0,0,0,59,241,89,59,241,89,0,0,0,59,241,89,59,241,89,0, + 0,0,59,241,89,0,0,59,241,89,0,0,0,12,232,89,0,7,206,201,59,238,34,0,0,138, + 201,0,0,0,127,59,245,255,255,255,255,247,34,59,245,255,255,255,255,247, + 34,59,245,255,255,255,255,247,34,59,245,255,255,255,255,247,34,59,245,255, + 255,255,255,247,34,59,245,255,255,255,255,247,34,59,241,89,0,0,89,225,21, + 0,0,0,0,59,241,89,0,0,0,0,0,59,241,89,0,0,0,0,59,241,89,0,0,0,0,0,59,241, + 89,0,0,0,0,59,241,89,0,0,0,0,0,59,241,89,0,0,59,241,89,0,0,59,241,89,0, + 0,59,241,89,0,7,206,166,0,0,0,59,241,89,59,241,89,0,7,206,200,241,89,0, + 12,235,166,0,0,0,89,247,34,12,235,166,0,0,0,89,247,34,0,12,235,166,0,0, + 0,89,247,34,12,235,166,0,0,0,89,247,34,12,235,166,0,0,0,89,247,34,0,0,12, + 235,125,0,12,235,125,0,0,59,241,159,166,0,0,12,235,166,12,232,89,0,0,0, + 59,238,34,12,232,89,0,0,0,59,238,34,12,232,89,0,0,0,59,238,34,12,232,89, + 0,0,0,59,238,34,0,0,59,241,89,0,0,0,12,235,255,255,255,201,0,59,238,34, + 0,0,138,201,0,0,0,127,138,201,0,0,0,12,235,125,138,201,0,0,0,12,235,125, + 138,201,0,0,0,12,235,125,138,201,0,0,0,12,235,125,138,201,0,0,0,12,235, + 125,138,201,0,0,0,12,235,125,175,201,0,0,0,89,225,21,0,0,0,0,0,175,247, + 34,0,0,59,192,59,241,89,0,0,0,0,59,241,89,0,0,0,0,0,59,241,89,0,0,0,0,59, + 241,89,0,0,0,0,0,59,241,89,0,0,59,241,89,0,0,59,241,89,0,0,59,241,89,0, + 7,206,166,0,0,59,245,201,0,59,241,89,0,0,59,245,251,89,0,0,138,251,89,0, + 59,245,166,0,0,138,251,89,0,59,245,166,0,0,0,138,251,89,0,59,245,166,0, + 0,138,251,89,0,59,245,166,0,0,138,251,89,0,59,245,166,0,0,0,138,166,0,0, + 0,12,228,34,0,0,175,247,34,0,7,206,225,21,0,138,225,21,0,7,206,166,0,0, + 138,225,21,0,7,206,166,0,0,138,225,21,0,7,206,166,0,0,138,225,21,0,7,206, + 166,0,0,0,59,241,89,0,0,0,12,232,89,0,0,0,0,59,238,34,0,12,235,125,0,0, + 0,127,206,125,0,0,0,0,175,206,206,125,0,0,0,0,175,206,206,125,0,0,0,0,175, + 206,206,125,0,0,0,0,175,206,206,125,0,0,0,0,175,206,206,125,0,0,0,0,175, + 232,245,125,0,0,0,89,255,255,255,255,255,166,0,0,138,255,255,255,251,89, + 59,245,255,255,255,255,127,81,245,255,255,255,255,225,21,59,245,255,255, + 255,255,127,81,245,255,255,255,255,127,111,255,255,255,125,89,255,255,255, + 125,89,255,255,255,125,89,255,255,255,125,7,206,255,255,255,255,125,0,0, + 59,241,89,0,0,0,175,251,89,0,0,0,138,255,255,255,166,0,0,0,0,138,255,255, + 255,166,0,0,0,0,0,138,255,255,255,166,0,0,0,0,138,255,255,255,166,0,0,0, + 0,138,255,255,255,166,0,0,0,0,0,0,0,0,0,0,0,0,0,7,202,194,255,255,255,201, + 0,0,0,0,59,245,255,251,89,0,0,0,0,59,245,255,251,89,0,0,0,0,59,245,255, + 251,89,0,0,0,0,59,245,255,251,89,0,0,0,0,59,241,89,0,0,0,12,232,89,0,0, + 0,0,59,238,47,235,255,166,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,12,228,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,138, + 166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,235,255,166,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,127,127,127,127,127,127,0,127,127,127, + 127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127, + 127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127, + 127,127,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127, + 127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127, + 127,0,127,127,127,127,127,127,0,127,127,127,127,0,127,127,127,127,0,127, + 127,127,127,0,127,127,127,127,0,127,127,127,127,127,127,127,127,0,127,127, + 127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,127,0,127,127, + 127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,127,0,127,127, + 127,127,127,127,127,127,0,127,127,127,127,127,127,127,127,127,0,127,127, + 127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,127,0,127,127, + 127,127,127,127,127,127,0,127,127,127,127,127,127,127,127,0,127,127,127, + 127,127,127,127,127,0,127,127,127,127,127,127,127,127,0,127,127,127,127, + 127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,0, + 0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,235,255,201,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,7,206, + 225,21,0,0,0,0,0,12,235,201,0,0,0,138,255,201,0,0,0,59,245,225,29,202,89, + 0,0,0,0,0,0,0,0,138,166,7,202,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 7,206,225,21,0,0,0,0,0,12,235,201,0,0,0,89,255,225,21,0,0,0,0,0,0,0,0,175, + 247,34,0,12,235,255,255,166,0,0,0,0,0,0,0,0,0,0,0,0,59,245,225,29,202,89, + 0,0,138,251,89,0,0,0,0,0,7,206,225,21,0,0,0,89,255,225,21,0,0,59,245,225, + 29,202,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,206,225, + 21,0,0,0,0,0,89,255,125,0,0,0,89,255,225,21,0,0,0,0,0,0,0,0,0,0,0,0,138, + 251,89,0,59,238,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,175, + 166,0,0,0,0,7,206,166,0,0,0,89,225,21,175,201,0,7,202,89,138,255,166,0, + 0,89,247,34,175,166,0,0,138,166,7,202,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,7,206,166,0,0,0,0,0,175,166,0,0,0,89,247,34,138,201,0,0,89,247, + 34,175,201,0,0,138,201,0,175,200,215,34,235,247,47,232,0,138,255,225,111, + 225,21,0,0,172,89,138,255,166,0,0,0,0,89,225,21,0,0,0,0,175,201,0,0,0,0, + 89,247,34,138,201,0,0,172,89,138,255,166,0,0,59,238,34,138,201,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,175,166,0,0,0,0,59,241,89,0,0,0,89, + 247,34,138,201,0,0,0,59,238,34,138,201,0,0,0,89,247,34,0,0,59,238,34,0, + 0,0,0,0,138,225,29,206,166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,235,255,201,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,206,225,21,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,12,235,166,0,0,0,0,0,0,0,0,89,166,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,59,238,34,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,7,206,255,255,255,125,0,7,206,255,255,255, + 125,0,7,206,255,255,255,125,0,7,206,255,255,255,125,0,7,206,255,255,255, + 125,0,12,235,255,255,251,89,0,12,235,255,255,251,89,59,245,255,166,0,0, + 59,245,255,255,201,0,12,235,255,251,89,0,0,12,235,255,251,89,0,0,12,235, + 255,251,89,0,0,12,235,255,251,89,0,59,238,34,59,238,34,59,238,34,59,238, + 34,0,59,241,89,175,225,21,0,59,241,194,255,255,125,0,0,12,235,255,247,34, + 0,0,12,235,255,247,34,0,0,0,12,235,255,247,34,0,0,12,235,255,247,34,0,0, + 12,235,255,247,34,0,0,0,0,0,12,235,166,0,0,0,0,7,206,255,255,225,21,0,59, + 241,89,0,59,241,89,59,241,89,0,59,241,89,59,241,89,0,59,241,89,0,59,241, + 89,0,59,241,97,206,166,0,0,12,235,125,59,238,163,255,255,201,7,206,166, + 0,0,12,235,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,89,247,34,0,0,0,0,89,247, + 34,0,0,0,0,89,247,34,0,0,0,0,89,247,34,0,0,0,0,89,247,34,0,0,0,0,138,225, + 21,0,0,0,0,89,255,225,21,0,138,201,59,245,125,0,0,0,7,206,125,0,89,225, + 21,7,206,125,0,89,225,21,7,206,125,0,89,225,21,7,206,125,0,89,225,21,59, + 238,34,59,238,34,59,238,34,59,238,34,0,0,0,0,12,235,125,0,59,245,166,0, + 89,247,34,7,206,166,0,138,225,21,7,206,166,0,138,225,21,0,7,206,166,0,138, + 225,21,7,206,166,0,138,225,21,7,206,166,0,138,225,21,0,0,0,0,0,0,0,0,0, + 0,12,232,89,0,138,251,89,0,59,241,89,0,59,241,89,59,241,89,0,59,241,89, + 59,241,89,0,59,241,89,0,59,241,89,0,59,241,89,89,247,34,0,89,247,34,59, + 245,166,0,7,206,166,89,247,34,0,89,247,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0, + 59,241,89,0,0,0,0,59,241,89,0,0,0,0,59,241,89,0,0,0,0,59,241,89,0,0,0,0, + 59,241,89,0,0,0,0,59,238,34,0,0,0,0,12,232,89,0,0,59,238,127,225,21,0,0, + 0,59,238,34,0,59,238,34,59,238,34,0,59,238,34,59,238,34,0,59,238,34,59, + 238,34,0,59,238,34,59,238,34,59,238,34,59,238,34,59,238,34,0,138,255,255, + 255,255,201,0,59,241,89,0,59,241,89,59,241,89,0,59,241,89,59,241,89,0,59, + 241,89,0,59,241,89,0,59,241,89,59,241,89,0,59,241,89,59,241,89,0,59,241, + 89,0,12,235,255,255,255,255,255,255,166,138,201,0,59,157,175,201,0,59,241, + 89,0,59,241,89,59,241,89,0,59,241,89,59,241,89,0,59,241,89,0,59,241,89, + 0,59,241,89,12,235,125,0,175,166,0,59,238,34,0,0,138,225,34,235,125,0,175, + 166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,127,0,89,255,255,255,251,89,0,89,255,255,255,251, + 89,0,89,255,255,255,251,89,0,89,255,255,255,251,89,0,89,255,255,255,251, + 89,0,138,255,255,255,247,34,0,175,255,255,255,255,255,255,255,255,251,127, + 201,0,0,0,0,59,245,255,255,255,251,89,59,245,255,255,255,251,89,59,245, + 255,255,255,251,89,59,245,255,255,255,251,89,59,238,34,59,238,34,59,238, + 34,59,238,34,138,247,34,0,0,138,201,0,59,241,89,0,59,241,89,59,238,34,0, + 12,232,89,59,238,34,0,12,232,89,0,59,238,34,0,12,232,89,59,238,34,0,12, + 232,89,59,238,34,0,12,232,89,0,0,0,0,0,0,0,0,0,0,175,201,7,176,21,138,201, + 0,59,241,89,0,59,241,89,59,241,89,0,59,241,89,59,241,89,0,59,241,89,0,59, + 241,89,0,59,241,89,0,175,201,12,232,89,0,59,238,34,0,0,138,225,21,175,201, + 12,232,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,59,241,89,0,59,241,89,59,241,89,0,59, + 241,89,59,241,89,0,59,241,89,59,241,89,0,59,241,89,59,241,89,0,59,241,89, + 138,247,34,0,59,238,34,138,225,21,0,12,232,89,0,0,0,0,138,201,0,0,0,0,59, + 238,34,0,0,0,0,59,238,34,0,0,0,0,59,238,34,0,0,0,0,59,238,34,0,0,0,0,59, + 238,34,59,238,34,59,238,34,59,238,34,175,201,0,0,0,138,166,0,59,241,89, + 0,59,241,89,59,241,89,0,59,241,89,59,241,89,0,59,241,89,0,59,241,89,0,59, + 241,89,59,241,89,0,59,241,89,59,241,89,0,59,241,89,0,0,0,0,12,235,166,0, + 0,0,138,201,134,89,0,175,166,0,59,241,89,0,59,241,89,59,241,89,0,59,241, + 89,59,241,89,0,59,241,89,0,59,241,89,0,59,241,89,0,89,247,124,225,21,0, + 59,238,34,0,0,138,201,0,89,247,124,225,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,89,247, + 34,0,89,251,89,89,247,34,0,89,251,89,89,247,34,0,89,251,89,89,247,34,0, + 89,251,89,89,247,34,0,89,251,89,175,201,0,0,175,247,34,175,201,0,0,59,245, + 225,21,0,7,199,94,245,125,0,0,0,7,206,166,0,7,199,34,7,206,166,0,7,199, + 34,7,206,166,0,7,199,34,7,206,166,0,7,199,34,59,238,34,59,238,34,59,238, + 34,59,238,34,138,247,34,0,12,232,89,0,59,241,89,0,59,241,89,7,206,166,0, + 138,225,21,7,206,166,0,138,225,21,0,7,206,166,0,138,225,21,7,206,166,0, + 138,225,21,7,206,166,0,138,225,21,0,0,0,0,12,235,166,0,0,0,59,245,166,0, + 59,241,89,0,12,235,125,0,175,251,89,12,235,125,0,175,251,89,12,235,125, + 0,175,251,89,0,12,235,125,0,175,251,89,0,7,206,255,125,0,0,59,238,34,0, + 12,235,125,0,7,206,255,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,175,255,255,232, + 241,89,0,175,255,255,232,241,89,0,175,255,255,232,241,89,0,175,255,255, + 232,241,89,0,175,255,255,232,241,89,12,235,255,255,166,238,34,12,235,255, + 255,225,21,89,255,255,251,89,0,89,255,255,255,201,0,12,235,255,251,89,0, + 0,12,235,255,251,89,0,0,12,235,255,251,89,0,0,12,235,255,251,89,0,59,238, + 34,59,238,34,59,238,34,59,238,34,0,138,255,255,255,125,0,0,59,241,89,0, + 59,241,89,0,12,235,255,247,34,0,0,12,235,255,247,34,0,0,0,12,235,255,247, + 34,0,0,12,235,255,247,34,0,0,12,235,255,247,34,0,0,0,0,0,0,0,0,0,0,0,7, + 206,255,255,225,21,0,0,0,89,255,255,166,241,89,0,89,255,255,166,241,89, + 0,89,255,255,166,241,89,0,0,89,255,255,166,241,89,0,0,138,247,34,0,0,59, + 245,166,255,255,166,0,0,0,138,247,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,59,215,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,138,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,232,89,0,0,0,59,238,34,0,0,0,0,0, + 12,232,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,12,235,255,125,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,138,225,21,0,0,0,59,238,34,0,0,0,0,0,138,225,21,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,127,127,127,127,127,127,0,127,127,127,127,127,127,0,127,127, + 127,127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,127,127,0,127, + 127,127,127,127,127,0,127,127,127,127,127,127,127,127,127,127,0,127,127, + 127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,127,127,0,127,127, + 127,127,127,127,0,127,127,127,127,127,127,0,127,127,0,127,127,0,127,127, + 0,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,0,127, + 127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127, + 127,0,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127, + 127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127, + 127,0,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127, + 127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,127,127,0,127,127, + 127,127,127,127,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 +}; + + +// Large font anti-aliased +const int FONT2AA_BM_W = 276; +const int FONT2AA_BM_H = 120; +static const unsigned char s_Font2AA[] = +{ + 127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,59,245,125,175,225,21, + 0,0,0,0,0,0,0,0,0,0,0,0,0,138,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,59,241,89,0,0,12,235,201,89,255,166,0,0,0,0,0,172,89,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,89,225,21,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,138,247,34,0,12, + 232,89,138,225,21,0,0,0,0,138,125,7,199,34,0,0,0,0,138,125,0,0,0,0,138, + 255,255,201,0,0,0,59,215,21,0,0,0,0,59,245,255,255,166,0,0,0,59,241,89, + 0,7,206,201,0,0,89,251,89,0,59,215,21,172,89,59,192,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,175,166,0,0,138,255,251,89,0,0,0,0,0, + 138,201,0,0,0,7,206,255,255,255,166,0,0,7,206,255,255,255,201,0,0,0,0,0, + 0,138,251,89,0,0,175,255,255,255,255,225,21,0,0,12,235,255,255,125,89,255, + 255,255,255,255,251,89,0,12,235,255,255,225,21,0,0,59,245,255,255,166,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,59,245,255,255,251,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,89,247, + 34,0,12,232,89,138,201,0,0,0,0,7,202,89,59,215,21,0,0,12,235,255,255,255, + 166,0,59,241,89,12,235,125,0,0,172,89,0,0,0,0,7,206,166,0,89,251,89,0,0, + 12,228,34,0,89,247,34,0,0,0,175,201,0,0,89,251,191,194,247,34,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,232,89,0,175,201,0,12,235, + 125,0,0,138,255,255,201,0,0,0,12,182,0,0,59,245,125,0,12,206,21,0,12,235, + 166,0,0,0,0,89,255,251,89,0,0,175,201,0,0,0,0,0,0,89,255,125,0,0,0,0,0, + 0,0,0,89,251,89,12,235,166,0,7,206,201,0,59,245,125,0,12,235,166,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,89,166,0,0,138,251,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,89,247,34,0,12, + 228,34,89,201,0,0,0,0,12,206,21,89,166,0,0,12,235,125,138,125,59,192,0, + 89,247,34,7,206,166,0,89,201,0,0,0,0,0,12,235,125,0,12,232,89,0,0,12,228, + 34,0,175,201,0,0,0,0,59,241,89,0,0,7,206,166,0,0,0,0,0,0,0,138,166,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,89,225,21,59,241,89,0,0,138,225,21,0, + 0,0,175,201,0,0,0,0,0,0,0,7,206,201,0,0,0,0,0,0,175,201,0,0,0,59,241,132, + 241,89,0,0,175,201,0,0,0,0,0,7,206,166,0,0,0,0,0,0,0,0,7,206,201,0,59,241, + 89,0,0,138,225,21,138,225,21,0,0,138,225,21,89,255,125,0,0,89,255,125,0, + 0,0,0,0,0,0,0,138,225,21,0,0,0,0,0,0,0,0,0,0,0,138,201,0,0,0,0,0,0,0,0, + 0,0,0,59,241,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,89,247,34,0,0,0,0,0,0,0, + 0,89,255,255,255,255,255,255,255,125,59,238,34,138,125,0,0,0,89,247,34, + 7,206,166,7,202,89,0,0,0,0,0,0,175,225,21,138,225,21,0,0,0,0,0,12,235,125, + 0,0,0,0,7,206,125,0,89,251,191,194,247,34,0,0,0,0,0,138,166,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,138,166,0,89,247,34,0,0,89,247,34,0,0,0,175,201, + 0,0,0,0,0,0,0,12,235,166,0,0,0,0,0,59,245,125,0,0,12,235,125,59,241,89, + 0,0,175,201,0,0,0,0,0,59,241,89,0,0,0,0,0,0,0,0,89,247,34,0,12,235,201, + 0,0,175,201,0,138,225,21,0,0,89,247,34,89,255,125,0,0,89,255,125,0,0,0, + 0,0,12,235,255,225,21,0,0,0,0,0,0,0,0,0,0,0,0,0,175,255,251,89,0,0,0,0, + 0,0,0,0,138,247,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,89,247,34,0,0,0,0,0, + 0,0,0,0,0,175,125,7,199,34,0,0,12,235,166,138,125,0,0,0,59,241,89,12,235, + 125,89,201,12,235,255,251,89,0,0,7,206,255,166,0,59,241,89,0,0,0,59,238, + 34,0,0,0,0,0,175,166,59,215,21,172,89,59,192,0,0,0,0,0,138,166,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,206,125,0,138,247,34,0,0,89,247,34,0,0,0, + 175,201,0,0,0,0,0,0,0,89,251,89,0,0,0,89,255,247,34,0,0,7,206,166,0,59, + 241,89,0,0,175,255,255,255,225,21,0,89,251,226,255,255,247,34,0,0,0,7,206, + 166,0,0,0,12,235,255,255,201,0,0,89,255,125,0,0,138,247,34,0,0,0,0,0,0, + 0,0,0,0,0,89,255,255,166,0,0,0,0,0,175,255,255,255,255,255,255,225,21,0, + 0,0,0,59,245,255,201,0,0,0,0,0,175,251,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0, + 0,0,89,225,21,0,0,0,0,0,0,0,0,0,7,199,34,59,215,21,0,0,0,59,245,255,255, + 201,0,0,0,138,255,255,201,12,228,34,175,166,0,138,201,0,12,235,125,89,255, + 125,59,241,89,0,0,0,59,238,34,0,0,0,0,0,138,201,0,0,0,172,89,0,0,0,7,206, + 255,255,255,255,255,255,247,34,0,0,0,0,89,255,255,255,166,0,0,0,0,0,59, + 238,34,0,138,247,34,0,0,89,247,34,0,0,0,175,201,0,0,0,0,0,0,59,245,166, + 0,0,0,0,0,0,12,235,166,0,138,201,0,0,59,241,89,0,0,0,0,0,12,235,201,0,138, + 251,89,0,0,175,225,21,0,0,89,247,34,0,0,7,206,166,0,175,255,166,0,0,89, + 255,255,255,223,247,34,0,0,0,0,0,0,0,0,0,0,175,247,34,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,7,206,225,21,0,0,175,225,21,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,127,0,0,0,0,0,59,215,21,0,0,0,0,0,0,0,12,235,255,255,255,255,255,255, + 166,0,0,0,0,138,125,175,225,21,0,0,0,0,0,138,166,7,206,125,0,89,247,34, + 138,225,21,0,89,255,166,215,21,0,0,0,59,238,34,0,0,0,0,0,138,201,0,0,0, + 0,0,0,0,0,0,0,0,0,138,166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,138,201,0, + 0,89,247,34,0,0,89,247,34,0,0,0,175,201,0,0,0,0,0,12,235,201,0,0,0,0,0, + 0,0,0,138,225,21,175,255,255,255,255,255,255,125,0,0,0,0,0,138,247,34,89, + 247,34,0,0,59,241,89,0,7,206,166,0,0,0,138,247,34,0,0,138,247,34,0,0,0, + 0,0,138,225,21,0,0,0,0,0,0,0,0,0,0,0,89,255,255,166,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,59,245,255,201,0,0,0,0,175,201,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,89,166,0,175,125,0,0,0,0,0,0,138, + 125,89,247,34,0,0,0,0,12,228,34,7,206,125,0,89,247,34,138,247,34,0,0,89, + 255,166,0,0,0,0,59,238,34,0,0,0,0,0,175,166,0,0,0,0,0,0,0,0,0,0,0,0,138, + 166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,206,125,0,0,59,241,89,0,0,138,225, + 21,0,0,0,175,201,0,0,0,0,12,235,201,0,0,0,0,0,0,0,0,0,138,225,21,0,0,0, + 0,59,241,89,0,0,0,0,0,0,138,225,21,59,241,89,0,0,59,241,89,0,89,247,34, + 0,0,0,138,247,34,0,0,89,251,89,0,0,0,0,7,206,166,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,12,235,255,225,21,0,0,175,255,255,255,255,255,255,225,21,0,0,175, + 255,251,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,89,247, + 34,0,0,0,0,0,0,0,0,0,175,125,7,199,34,0,0,0,89,201,0,138,125,175,201,0, + 0,0,0,0,138,166,0,0,175,166,0,138,201,0,89,255,166,0,0,89,255,255,125,0, + 0,0,12,235,125,0,0,0,0,7,206,125,0,0,0,0,0,0,0,0,0,0,0,0,138,166,0,0,0, + 0,0,138,255,125,0,0,0,0,0,0,175,247,34,59,238,34,0,0,0,175,201,0,12,235, + 125,0,0,0,0,175,201,0,0,0,12,235,166,0,0,0,0,0,89,166,0,0,59,245,166,0, + 0,0,0,0,59,241,89,0,59,215,21,0,12,235,166,0,7,206,201,0,0,175,225,21,7, + 206,166,0,0,0,0,59,245,166,0,7,206,225,21,0,0,0,0,175,225,21,0,89,255,125, + 0,0,12,235,201,0,0,0,0,0,0,0,0,138,225,21,0,0,0,0,0,0,0,0,0,0,0,138,201, + 0,0,0,0,0,0,0,0,0,175,225,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,89,247, + 34,0,0,0,0,0,0,0,0,7,199,34,59,215,21,0,0,0,12,235,255,255,255,201,0,0, + 0,0,0,59,215,21,0,0,12,235,255,251,89,0,0,89,255,255,255,201,0,89,255,0, + 0,0,0,175,201,0,0,0,0,59,238,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,175, + 201,0,0,0,0,0,0,0,175,247,34,138,201,0,0,0,0,0,138,255,251,89,0,0,0,138, + 255,255,255,255,166,0,89,255,255,255,255,255,247,34,12,235,255,255,255, + 166,0,0,0,0,0,0,59,241,89,0,12,235,255,255,255,166,0,0,0,7,206,255,255, + 225,21,0,138,247,34,0,0,0,0,0,59,245,255,255,201,0,0,0,175,255,255,201, + 0,0,0,89,255,125,0,0,89,251,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,175,225,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,138,125,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,89,247,34,0,0,0,175,201,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,232,89,0,0,0,0,0,0,0,0,0,0,175,125, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,175,201,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,138,125,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,206,201,0,0,89,251,89,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,89,201,0,0,0,0,0,0,0,0,0,0,12,232,89, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,232,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,201,0,0,201,201,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,127,127,0,127,127,127, + 127,0,127,127,127,127,127,0,127,127,127,127,127,127,127,127,127,0,127,127, + 127,127,127,127,127,0,127,127,127,127,127,127,127,127,127,127,127,127,127, + 0,127,127,127,127,127,127,127,127,0,127,127,0,127,127,127,127,0,127,127, + 127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,127, + 127,0,127,127,127,0,127,127,127,127,0,127,127,127,0,127,127,127,127,0,127, + 127,127,127,127,127,127,127,0,127,127,127,127,127,127,0,127,127,127,127, + 127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127, + 0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127, + 127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127, + 0,127,127,127,0,127,127,127,127,127,0,127,127,127,127,127,127,127,127,127, + 0,127,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,127,127, + 0,127,127,127,127,127,127,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,206,255,255, + 201,0,138,201,0,0,0,0,89,255,255,255,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,127,0,0,0,0,175,255,255,255,247,34,0,0,0,0,0,7,206,251,89,0,0,12,0, + 235,255,255,255,255,201,0,0,0,0,59,245,255,255,255,201,12,0,235,255,255, + 255,255,166,0,0,0,12,235,255,255,255,255,255,127,12,235,255,255,255,255, + 251,89,0,0,12,235,255,255,255,251,89,12,235,166,0,0,0,12,235,125,89,255, + 255,255,201,0,0,175,255,255,225,21,12,235,166,0,0,7,206,251,102,0,235,166, + 0,0,0,0,12,235,251,89,0,0,0,89,255,225,21,12,235,251,89,0,0,12,235,125, + 0,0,0,138,255,255,166,0,0,0,12,235,255,255,255,251,89,0,0,0,0,175,255,255, + 201,0,0,0,12,235,255,255,255,251,89,0,0,0,12,235,255,255,255,247,47,235, + 255,255,255,255,255,255,255,138,0,235,125,0,0,0,59,245,133,206,166,0,0, + 0,0,59,245,255,133,201,0,0,0,138,251,89,0,0,12,235,133,206,247,34,0,0,0, + 175,229,216,225,21,0,0,0,138,247,124,255,255,255,255,255,255,125,7,206, + 125,0,0,0,59,238,34,0,0,0,0,0,12,235,125,0,0,0,0,175,247,34,0,0,0,0,0,0, + 0,0,0,0,127,0,0,59,245,166,0,0,0,59,245,166,0,0,0,0,59,245,255,166,0,0, + 12,0,235,166,0,0,59,245,125,0,0,138,255,125,0,0,7,202,102,0,235,166,0,0, + 59,245,225,21,0,12,235,166,0,0,0,0,0,12,235,166,0,0,0,0,0,0,89,255,166, + 0,0,0,89,127,12,235,166,0,0,0,12,235,125,0,12,235,125,0,0,0,0,0,138,225, + 21,12,235,166,0,7,206,225,21,12,0,235,166,0,0,0,0,12,235,255,166,0,0,7, + 206,255,225,21,12,235,255,201,0,0,12,235,125,0,59,245,166,0,0,138,251,89, + 0,12,235,166,0,0,138,251,89,0,89,255,125,0,0,89,255,125,0,12,235,166,0, + 0,138,251,89,0,12,235,166,0,0,7,202,89,0,0,0,138,225,21,0,0,12,0,235,125, + 0,0,0,59,245,125,138,225,21,0,0,0,138,225,151,34,247,34,0,0,175,255,125, + 0,0,89,247,34,12,235,166,0,0,89,247,34,59,245,125,0,0,59,245,125,0,0,0, + 0,0,138,247,34,7,206,125,0,0,0,7,206,125,0,0,0,0,0,12,235,125,0,0,0,138, + 225,187,201,0,0,0,0,0,0,0,0,0,0,127,0,12,232,89,0,0,0,0,0,12,232,89,0,0, + 0,138,225,151,225,21,0,12,0,235,166,0,0,12,235,166,0,12,235,166,0,0,0,0, + 0,12,0,235,166,0,0,0,12,235,166,0,12,235,166,0,0,0,0,0,12,235,166,0,0,0, + 0,0,12,235,166,0,0,0,0,0,0,12,235,166,0,0,0,12,235,125,0,12,235,125,0,0, + 0,0,0,138,225,21,12,235,166,0,175,225,21,0,12,0,235,166,0,0,0,0,12,235, + 166,238,34,0,59,215,187,225,21,12,235,166,245,125,0,12,235,125,12,235,125, + 0,0,0,0,138,247,34,12,235,166,0,0,12,235,166,12,235,125,0,0,0,0,138,247, + 34,12,235,166,0,0,12,235,166,0,89,247,34,0,0,0,0,0,0,0,0,138,225,21,0,0, + 12,0,235,125,0,0,0,59,245,125,59,241,89,0,0,7,206,166,59,0,241,89,0,12, + 232,194,201,0,0,138,225,21,0,89,251,89,12,235,166,0,0,138,247,34,7,206, + 201,0,0,0,0,0,59,245,125,0,7,206,125,0,0,0,0,138,201,0,0,0,0,0,12,235,125, + 0,0,59,241,89,12,235,166,0,0,0,0,0,0,0,0,0,127,0,175,166,0,59,245,255,255, + 247,34,138,201,0,0,7,206,166,59,241,89,0,12,0,235,166,0,0,89,251,89,0,89, + 247,34,0,0,0,0,0,12,0,235,166,0,0,0,0,138,225,21,12,235,166,0,0,0,0,0,12, + 235,166,0,0,0,0,0,89,247,34,0,0,0,0,0,0,12,235,166,0,0,0,12,235,125,0,12, + 235,125,0,0,0,0,0,138,225,21,12,235,166,175,247,34,0,0,12,0,235,166,0,0, + 0,0,12,235,133,206,166,0,175,166,175,225,21,12,235,125,138,225,21,12,235, + 125,89,247,34,0,0,0,0,59,245,125,12,235,166,0,0,12,235,166,89,247,34,0, + 0,0,0,59,245,125,12,235,166,0,0,12,235,125,0,89,255,125,0,0,0,0,0,0,0,0, + 138,225,21,0,0,12,0,235,125,0,0,0,59,245,125,7,206,201,0,0,59,241,89,7, + 0,206,166,0,59,215,111,225,21,7,206,166,0,0,0,175,225,187,225,21,0,0,12, + 235,166,89,247,34,0,0,0,0,7,206,201,0,0,7,206,125,0,0,0,0,89,225,21,0,0, + 0,0,12,235,125,0,12,235,166,0,0,59,241,89,0,0,0,0,0,0,0,0,127,0,202,89, + 12,235,125,0,12,228,34,59,215,0,0,59,241,89,7,206,166,0,12,0,235,255,255, + 255,255,166,0,0,138,225,21,0,0,0,0,0,12,0,235,166,0,0,0,0,89,247,34,12, + 235,255,255,255,255,247,34,12,235,255,255,255,255,247,0,163,225,21,0,0, + 0,0,0,0,12,235,255,255,255,255,255,255,125,0,12,235,125,0,0,0,0,0,138,225, + 21,12,235,255,247,34,0,0,0,12,0,235,166,0,0,0,0,12,235,125,89,225,34,228, + 34,175,225,21,12,235,125,12,235,125,12,235,125,138,225,21,0,0,0,0,12,235, + 166,12,235,166,0,0,175,247,34,138,225,21,0,0,0,0,12,235,166,12,235,166, + 0,0,175,225,21,0,0,175,255,255,225,21,0,0,0,0,0,138,225,21,0,0,12,0,235, + 125,0,0,0,59,245,125,0,138,247,34,0,138,225,21,0,0,175,201,0,138,201,12, + 232,89,12,235,125,0,0,0,12,235,251,89,0,0,0,0,89,255,255,125,0,0,0,0,0, + 138,247,34,0,0,7,206,125,0,0,0,0,12,232,89,0,0,0,0,12,235,125,7,206,201, + 0,0,0,0,138,251,89,0,0,0,0,0,0,0,127,7,228,34,89,225,21,0,12,228,34,12, + 228,0,0,138,225,21,0,138,225,21,12,0,235,166,0,0,12,235,201,0,138,225,21, + 0,0,0,0,0,12,0,235,166,0,0,0,0,89,247,34,12,235,166,0,0,0,0,0,12,235,166, + 0,0,0,0,0,138,225,21,0,12,235,255,255,127,12,235,166,0,0,0,12,235,125,0, + 12,235,125,0,0,0,0,0,138,225,21,12,235,229,216,225,21,0,0,12,0,235,166, + 0,0,0,0,12,235,125,12,235,223,201,0,175,225,21,12,235,125,0,138,225,34, + 235,125,138,225,21,0,0,0,0,12,235,166,12,235,255,255,255,247,34,0,138,225, + 21,0,0,0,0,12,235,166,12,235,255,255,255,166,0,0,0,0,0,0,89,255,255,247, + 34,0,0,0,138,225,21,0,0,12,0,235,125,0,0,0,59,245,125,0,59,245,125,7,206, + 166,0,0,0,89,247,34,175,125,7,206,125,89,247,34,0,0,0,12,235,251,89,0,0, + 0,0,7,206,225,21,0,0,0,0,59,245,125,0,0,0,7,206,125,0,0,0,0,0,175,166,0, + 0,0,0,12,235,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,12,228,34,89,225, + 21,0,12,228,34,59,215,0,7,206,255,255,255,255,251,89,12,0,235,166,0,0,0, + 138,247,0,124,247,34,0,0,0,0,0,12,0,235,166,0,0,0,0,138,225,21,12,235,166, + 0,0,0,0,0,12,235,166,0,0,0,0,0,89,247,34,0,0,0,0,175,127,12,235,166,0,0, + 0,12,235,125,0,12,235,125,0,0,0,0,0,138,225,21,12,235,166,59,245,201,0, + 0,12,0,235,166,0,0,0,0,12,235,125,0,138,251,89,0,175,225,21,12,235,125, + 0,12,235,138,235,125,89,247,34,0,0,0,0,59,245,125,12,235,166,0,0,0,0,0, + 89,247,34,0,0,0,0,59,245,125,12,235,166,0,175,247,34,0,0,0,0,0,0,0,59,245, + 166,0,0,0,138,225,21,0,0,12,0,235,125,0,0,0,59,241,89,0,7,206,201,59,241, + 89,0,0,0,59,241,102,232,89,0,138,201,138,225,21,0,0,0,175,201,175,225,21, + 0,0,0,0,175,225,21,0,0,0,7,206,201,0,0,0,0,7,206,125,0,0,0,0,0,89,225,21, + 0,0,0,12,235,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,12,232,89,59,241, + 89,0,89,247,34,89,201,0,59,241,89,0,0,7,206,166,12,0,235,166,0,0,0,138, + 225,0,81,245,166,0,0,0,0,0,12,0,235,166,0,0,0,12,235,166,0,12,235,166,0, + 0,0,0,0,12,235,166,0,0,0,0,0,12,235,166,0,0,0,0,175,127,12,235,166,0,0, + 0,12,235,125,0,12,235,125,0,0,0,0,0,138,225,21,12,235,166,0,89,255,166, + 0,12,0,235,166,0,0,0,0,12,235,125,0,12,182,0,0,175,225,21,12,235,125,0, + 0,138,232,245,125,12,235,125,0,0,0,0,138,247,34,12,235,166,0,0,0,0,0,12, + 235,125,0,0,0,0,138,247,34,12,235,166,0,7,206,225,21,0,0,0,0,0,0,12,235, + 166,0,0,0,138,225,21,0,0,12,0,235,166,0,0,0,89,251,89,0,0,138,247,163,225, + 21,0,0,0,7,206,200,215,21,0,89,225,187,166,0,0,0,89,251,89,12,235,166,0, + 0,0,0,175,225,21,0,0,0,138,247,34,0,0,0,0,7,206,125,0,0,0,0,0,12,232,89, + 0,0,0,12,235,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,12,175,166,0,89, + 255,255,210,235,255,255,125,0,138,225,21,0,0,0,138,247,47,0,235,166,0,0, + 59,245,166,0,0,138,255,125,0,0,7,202,102,0,235,166,0,0,12,235,225,21,0, + 12,235,166,0,0,0,0,0,12,235,166,0,0,0,0,0,0,138,255,125,0,0,0,175,127,12, + 235,166,0,0,0,12,235,125,0,12,235,125,0,0,0,0,7,206,201,0,12,235,166,0, + 0,138,255,125,12,0,235,166,0,0,0,12,0,235,125,0,0,0,0,0,175,225,21,12,235, + 125,0,0,12,235,255,125,0,89,255,125,0,0,89,251,89,0,12,235,166,0,0,0,0, + 0,0,89,255,125,0,0,89,255,125,0,12,235,166,0,0,12,235,201,0,138,166,0,0, + 0,138,251,89,0,0,0,138,225,21,0,0,0,0,138,247,34,0,7,206,225,21,0,0,12, + 235,255,166,0,0,0,0,0,175,255,201,0,0,12,235,255,125,0,0,12,235,166,0,0, + 138,251,89,0,0,0,175,225,21,0,0,89,251,89,0,0,0,0,0,7,206,125,0,0,0,0,0, + 0,175,166,0,0,0,12,235,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,59,241, + 89,0,0,0,0,0,0,0,0,7,206,166,0,0,0,0,59,245,138,0,235,255,255,255,255,125, + 0,0,0,0,59,245,255,255,255,201,12,0,235,255,255,255,255,166,0,0,0,12,235, + 255,255,255,255,255,127,12,235,166,0,0,0,0,0,0,0,59,245,255,255,255,225, + 21,12,235,166,0,0,0,12,235,125,89,255,255,255,210,127,235,255,255,225,21, + 0,12,235,166,0,0,0,175,255,127,0,235,255,255,255,247,47,0,235,125,0,0,0, + 0,0,175,225,21,12,235,125,0,0,0,138,255,125,0,0,0,175,255,255,201,0,0,0, + 12,235,166,0,0,0,0,0,0,0,0,175,255,255,201,0,0,0,12,235,166,0,0,0,89,255, + 225,34,235,255,255,255,247,34,0,0,0,0,138,225,21,0,0,0,0,0,138,255,255, + 255,201,0,0,0,0,0,175,251,89,0,0,0,0,0,89,255,166,0,0,7,206,247,34,0,7, + 206,225,21,0,0,7,206,225,21,0,0,175,225,21,0,0,138,255,255,255,255,255, + 255,166,7,206,125,0,0,0,0,0,0,138,201,0,0,0,12,235,125,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,127,0,0,89,255,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,175,201,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,7,206,125,0,0,0,0,0,0,59,238,34,0,0,12,235,125,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,127,0,0,0,7,206,255,255,255,225,21,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,89,251,89,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,7,206,125,0,0,0,0,0,0,7,206,125,0,0,12,235,125,0,0,0, + 0,0,0,0,0,0,0,245,255,255,255,255,255,255,127,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,138, + 255,255,166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,206,255,255,201,0,0,0,0,0,0,89,89,255,255, + 255,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,127,127,127,127,127,127, + 127,127,127,127,127,0,127,127,127,127,127,127,127,127,0,127,127,127,127, + 127,127,127,127,0,127,127,127,127,127,127,127,127,0,127,127,127,127,127, + 127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127, + 127,0,127,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,127, + 0,127,127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,127,127,127, + 127,0,127,127,127,127,127,127,0,127,127,127,127,127,127,127,127,127,127, + 0,127,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,127,127, + 0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,127,127,0,127, + 127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127, + 127,127,127,127,127,0,127,127,127,127,127,127,127,127,0,127,127,127,127, + 127,127,127,127,0,127,127,127,127,127,127,127,127,127,127,127,127,0,127, + 127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127, + 127,127,127,0,127,127,127,127,127,0,127,127,127,127,127,0,127,127,127,127, + 127,0,127,127,127,127,127,127,127,127,0,127,127,127,127,127,127,0,127,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,59,245,166,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,89,247,34,0,0,0,0,0,0,0,0,0,0,12,235, + 125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,138,225,21,0,0,0,0,0,0,0,0,0,12,235, + 255,247,0,0,0,0,0,0,0,12,12,235,125,0,0,0,0,0,0,0,0,0,0,0,0,12,235,125, + 0,0,0,0,0,12,235,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,138,255,251,89,0,7,206,125,0,89,255,251,89, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,89,255,255,255,255,255,255,255,255,255,255, + 125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,127,0,0,7,206,125,0,0,0,0,0,0,0,0,0,0,12,235,125,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,138,225,21,0,0,0,0,0,0,0,0,0,175,201,0,0,0,0,0,0, + 0,0,0,12,12,235,125,0,0,0,0,0,59,245,102,0,89,247,34,12,235,125,0,0,0,0, + 0,12,235,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,235,125,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,59,241,89,0,0,0,7,206,125,0,0,0,138,225,21,0, + 0,0,0,0,0,0,0,0,0,0,0,0,89,201,0,0,0,0,0,0,0,0,175,125,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,12,235,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,138, + 225,21,0,0,0,0,0,0,0,12,0,235,125,0,0,0,0,0,0,0,0,0,0,12,235,125,0,0,0, + 0,0,0,0,0,0,0,0,0,12,235,125,0,0,0,0,0,12,235,125,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,12,235,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,89,247,34, + 0,0,0,7,206,125,0,0,0,59,238,34,0,0,0,0,0,0,0,0,0,0,0,0,0,89,201,0,0,0, + 0,0,0,0,0,175,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,12,235,255,255,255,166,0,12, + 235,166,245,255,247,34,0,0,12,235,255,255,247,34,0,34,235,255,255,255,225, + 21,0,12,235,255,255,225,29,0,206,255,255,255,127,0,12,235,255,255,255,225, + 21,12,235,138,235,255,247,34,0,12,235,102,175,255,247,34,12,235,125,0,59, + 245,201,0,12,235,125,12,0,235,166,245,255,225,29,206,255,251,89,0,12,235, + 138,235,255,247,34,0,0,12,235,255,255,201,0,0,12,235,166,245,255,251,89, + 0,0,12,235,255,255,255,225,21,12,235,138,235,247,127,34,138,255,255,255, + 206,0,206,255,255,255,201,59,241,89,0,0,89,247,42,206,201,0,0,0,138,225, + 187,201,0,0,138,225,21,0,59,241,187,226,247,34,0,7,206,206,206,201,0,0, + 0,138,225,151,255,255,255,255,247,0,0,89,247,34,0,0,0,7,206,125,0,0,0,59, + 238,34,0,0,0,0,0,0,0,0,0,0,0,0,0,89,201,0,0,0,0,0,0,0,0,175,125,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127, + 0,0,0,0,0,0,0,0,12,206,21,0,59,245,125,12,235,247,34,0,138,225,21,12,235, + 166,0,0,134,102,0,235,166,0,0,138,225,21,12,235,125,0,0,175,201,12,0,235, + 125,0,0,12,235,166,0,0,138,225,21,12,235,247,34,0,175,201,0,12,235,102, + 0,89,247,34,12,235,125,12,235,166,0,0,12,235,125,12,0,235,225,21,12,235, + 251,89,0,175,201,0,12,235,247,34,0,175,201,0,12,235,166,0,7,206,201,0,12, + 235,225,21,0,175,225,21,12,235,166,0,0,138,225,21,12,235,247,34,0,0,89, + 247,34,0,12,206,34,0,235,125,0,0,59,241,89,0,0,89,247,34,89,247,34,0,7, + 206,166,138,225,21,7,206,251,89,0,89,225,138,34,235,201,0,138,225,21,89, + 247,34,0,7,206,166,0,0,0,7,206,166,0,0,89,225,21,0,0,0,7,206,125,0,0,0, + 59,241,89,0,0,0,0,138,251,89,0,0,7,202,89,0,89,201,0,0,0,0,0,0,0,0,175, + 125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,7,206,102,12,235,125,0,0,59,241,89, + 138,225,21,0,0,0,34,89,225,21,0,0,138,225,21,89,225,21,0,0,89,247,47,0, + 235,125,0,0,89,225,21,0,0,138,225,21,12,235,125,0,0,89,247,34,12,235,102, + 0,89,247,34,12,235,138,235,166,0,0,0,12,235,125,12,0,235,125,0,7,206,166, + 0,0,138,225,21,12,235,125,0,0,89,247,34,138,225,21,0,0,59,238,34,12,235, + 125,0,0,59,241,89,89,225,21,0,0,138,225,21,12,235,125,0,0,0,138,225,21, + 0,0,0,12,0,235,125,0,0,59,241,89,0,0,89,247,34,12,235,125,0,59,241,89,59, + 238,34,12,228,198,166,0,175,166,59,0,89,251,132,241,89,0,12,235,125,0,59, + 238,34,0,0,0,138,225,21,0,12,235,166,0,0,0,0,7,206,125,0,0,0,0,175,201, + 0,0,0,138,166,12,235,166,0,12,232,89,0,89,201,0,0,0,0,0,0,0,0,175,125,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,127,0,0,0,0,0,0,0,0,0,59,245,255,255,255,102,12,235,125,0,0,12,235, + 125,175,201,0,0,0,0,0,175,201,0,0,0,138,225,21,175,255,255,255,255,255, + 247,47,0,235,125,0,0,175,201,0,0,0,138,225,21,12,235,125,0,0,89,247,34, + 12,235,102,0,89,247,34,12,235,255,225,21,0,0,0,12,235,125,12,0,235,125, + 0,7,206,166,0,0,138,225,21,12,235,125,0,0,89,247,34,175,201,0,0,0,12,232, + 89,12,235,125,0,0,12,235,125,175,201,0,0,0,138,225,21,12,235,125,0,0,0, + 59,245,255,247,34,0,12,0,235,125,0,0,59,241,89,0,0,89,247,34,0,175,201, + 0,138,201,0,12,235,125,89,201,89,225,29,206,125,12,0,0,175,255,166,0,0, + 0,175,201,0,138,201,0,0,0,89,251,89,0,138,247,34,0,0,0,0,0,7,206,125,0, + 0,0,0,0,89,255,125,7,202,89,0,89,251,89,89,201,0,0,89,201,0,0,0,0,0,0,0, + 0,175,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,89,255,166,0,7,206,102,12,235,125,0, + 0,12,235,125,175,201,0,0,0,0,0,175,201,0,0,0,138,225,21,175,201,0,0,0,0, + 0,12,0,235,125,0,0,175,201,0,0,0,138,225,21,12,235,125,0,0,89,247,34,12, + 235,102,0,89,247,34,12,235,138,235,201,0,0,0,12,235,125,12,0,235,125,0, + 7,206,166,0,0,138,225,21,12,235,125,0,0,89,247,34,175,201,0,0,0,12,232, + 89,12,235,125,0,0,12,235,125,175,201,0,0,0,138,225,21,12,235,125,0,0,0, + 0,0,138,255,255,201,12,0,235,125,0,0,59,241,89,0,0,89,247,34,0,89,247,42, + 206,125,0,0,175,166,175,125,12,232,102,232,89,0,0,0,175,255,201,0,0,0,89, + 247,47,235,125,0,0,12,235,166,0,0,0,12,235,125,0,0,0,0,7,206,125,0,0,0, + 0,138,201,0,0,12,232,89,0,0,59,245,225,21,0,0,89,201,0,0,0,0,0,0,0,0,175, + 125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,127,0,0,0,0,0,0,0,0,175,201,0,0,7,206,102,12,235,125,0,0,59,241, + 89,138,225,21,0,0,0,34,89,225,21,0,0,138,225,21,138,247,34,0,0,0,0,12,0, + 235,125,0,0,138,225,21,0,0,138,225,21,12,235,125,0,0,89,247,34,12,235,102, + 0,89,247,34,12,235,125,59,245,125,0,0,12,235,125,12,0,235,125,0,7,206,166, + 0,0,138,225,21,12,235,125,0,0,89,247,34,138,225,21,0,0,89,247,34,12,235, + 125,0,0,59,241,89,138,225,21,0,0,138,225,21,12,235,125,0,0,0,0,0,0,0,89, + 247,47,0,235,125,0,0,59,241,89,0,0,89,247,34,0,12,235,166,238,34,0,0,138, + 210,228,34,0,175,166,215,21,0,0,89,251,159,251,89,0,0,12,235,191,247,34, + 0,0,175,225,21,0,0,0,0,138,225,21,0,0,0,7,206,125,0,0,0,12,232,89,0,0,0, + 0,0,0,0,0,0,0,0,0,0,89,201,0,0,0,0,0,0,0,0,175,125,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0, + 0,0,0,138,225,21,0,138,255,102,12,235,125,0,7,206,201,0,12,235,166,0,0, + 134,132,0,245,125,0,59,245,225,21,12,235,201,0,0,12,206,34,0,235,125,0, + 0,59,245,125,0,12,235,225,21,12,235,125,0,0,89,247,34,12,235,102,0,89,247, + 34,12,235,125,0,138,251,89,0,12,235,125,12,0,235,125,0,7,206,166,0,0,138, + 225,21,12,235,125,0,0,89,247,34,12,235,166,0,7,206,201,0,12,235,125,0,7, + 206,201,0,59,245,125,0,12,235,225,21,12,235,125,0,0,0,138,125,0,0,138,225, + 29,0,206,166,0,0,7,206,166,0,59,245,247,34,0,0,175,255,201,0,0,0,59,245, + 225,21,0,89,255,201,0,0,12,235,166,0,175,225,21,0,0,138,255,166,0,0,89, + 251,89,0,0,0,0,0,89,247,34,0,0,0,7,206,125,0,0,0,59,238,34,0,0,0,0,0,0, + 0,0,0,0,0,0,0,89,201,0,0,0,0,0,0,0,0,175,125,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0, + 7,206,255,255,171,206,102,12,232,226,255,255,225,21,0,0,12,235,255,255, + 247,34,0,89,255,255,247,163,225,21,0,7,206,255,255,247,34,12,0,235,125, + 0,0,0,89,255,255,247,163,225,21,12,235,125,0,0,89,247,34,12,235,102,0,89, + 247,34,12,235,125,0,0,175,251,34,0,235,125,12,0,235,125,0,7,206,166,0,0, + 138,225,21,12,235,125,0,0,89,247,34,0,12,235,255,255,201,0,0,12,235,255, + 255,255,225,21,0,0,89,255,255,247,163,225,21,12,235,125,0,0,0,89,255,255, + 255,247,34,0,0,89,255,255,127,0,59,245,255,225,111,247,34,0,0,59,245,125, + 0,0,0,12,235,166,0,0,59,245,125,7,0,206,225,21,0,12,235,201,0,0,59,241, + 89,0,0,175,255,255,255,255,247,0,0,89,247,34,0,0,0,7,206,125,0,0,0,59,238, + 34,0,0,0,0,0,0,0,0,0,0,0,0,0,89,255,255,255,255,255,255,255,255,255,255, + 125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,138,201,0,0,0,0,0, + 0,0,0,0,0,0,0,0,89,247,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,235,125,0,0,0,0,0,0,0,0,0,0,138,225, + 21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,138,225,21,0,0,0,0,0,0,0,0,0,0,89, + 247,34,0,0,0,7,206,125,0,0,0,59,238,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,199,34,0,12, + 232,89,0,0,0,0,0,0,0,0,0,0,0,0,0,138,225,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,235,125,0,0,0,0, + 0,0,0,0,0,0,138,225,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,206,166,0,0,0, + 0,0,0,0,0,0,0,0,12,235,125,0,0,0,7,206,125,0,0,0,138,225,21,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,12,235,255,247,34,0,0,0,0,0,0,0,0,0,0,0,0,0,255,251,89,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,12,235,125,0,0,0,0,0,0,0,0,0,0,138,225,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,89,247,34,0,0,0,0,0,0,0,0,0,0,0,0,89,255,251,89,0,7,206,125,0,89,255, + 247,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127, + 127,127,127,127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,127, + 127,127,0,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127, + 127,127,127,127,127,0,127,127,127,127,0,127,127,127,127,127,127,127,0,127, + 127,127,127,127,127,127,0,127,127,0,127,127,127,0,127,127,127,127,127,127, + 127,0,127,127,127,0,127,127,127,127,127,127,127,127,127,127,127,0,127,127, + 127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127, + 127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,0,127,127,127, + 127,127,127,0,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127, + 127,127,127,0,127,127,127,127,127,127,127,127,127,127,0,127,127,127,127, + 127,127,0,127,127,127,127,127,127,0,127,127,127,127,127,0,127,127,127,127, + 127,127,127,0,127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,127, + 127,127,127,127,127,0,127,127,127,127,127,127,127,127,127,127,127,127,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,206,125,0,175,166,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,206,125,0,175, + 166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,59,245,225,21,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,206,255,125,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,206,255,125,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,175,166,0,138,201,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,175,166,0,138,201,0,7,206,166,12,235, + 125,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,175,125,0,0,0,0,0,175,125, + 0,0,0,0,0,175,171,206,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,89,255,125,0, + 31,206,130,255,166,175,247,34,0,0,89,255,125,175,247,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,59,245,247,34,138,166,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,59,241,132,238,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,59,241,132,238,34,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0, + 59,245,255,255,255,125,0,12,235,255,255,255,255,255,225,21,0,0,0,0,0,0, + 0,0,175,255,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,175,125,0,0,0, + 0,0,175,125,0,0,0,0,89,225,21,59,238,34,0,0,138,255,255,201,0,0,0,59,215, + 21,0,0,0,0,0,0,0,0,0,12,235,255,255,255,247,34,0,0,0,0,0,0,0,12,235,255, + 255,255,255,255,255,255,255,251,89,0,12,235,255,255,255,255,255,225,21, + 0,89,255,255,255,255,255,255,125,0,12,235,255,255,255,255,255,225,21,0, + 0,12,235,255,255,255,255,255,225,21,7,206,201,0,50,206,56,255,201,12,235, + 125,0,0,138,225,29,206,166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,7,202,89,89,255,225,21,0,89,255,255,255,225,81,245,201,0,138,251, + 89,0,0,138,255,166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,235,255,255, + 255,255,255,225,21,0,0,0,138,255,166,7,206,225,21,0,0,0,138,247,34,0,0, + 0,0,127,0,89,255,125,0,0,0,0,0,12,146,0,0,0,0,0,144,21,0,0,0,0,0,0,0,89, + 247,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,175,125,0,0,0,0,0,175, + 125,0,0,0,0,0,0,0,0,0,0,0,59,241,89,12,235,125,0,0,172,89,0,0,0,0,0,0,0, + 0,0,12,235,166,0,0,7,202,89,0,0,0,0,0,0,89,255,201,0,0,12,235,125,0,0,0, + 0,0,0,12,146,0,0,0,0,0,144,21,0,0,0,0,0,0,138,247,34,0,12,146,0,0,0,0,0, + 144,21,0,0,12,146,0,0,0,0,0,144,21,0,89,225,21,71,157,22,191,225,21,175, + 201,0,7,206,125,59,238,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,175,125,0,59,196,199,47,206,184,89,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,146,0,0,0,0,0,144,21,0,0,0,0, + 0,0,0,59,245,125,0,0,59,245,125,0,0,0,0,0,127,12,235,166,0,0,0,0,0,0,12, + 146,0,0,0,0,0,144,21,0,0,0,0,0,0,0,175,201,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,12,235,255,255,255,255,127,34,235,255,255,255,255,225,21,0, + 0,0,0,0,0,0,0,89,247,34,7,206,166,0,89,201,0,0,0,0,0,0,0,0,0,0,89,247,34, + 0,0,0,0,0,0,0,0,59,115,12,235,166,0,0,0,12,235,125,0,0,0,0,0,0,12,146,0, + 0,0,0,0,144,21,0,0,0,0,0,59,245,125,0,0,12,146,0,0,0,0,0,144,21,0,0,12, + 146,0,0,0,0,0,144,21,0,7,202,89,117,104,0,29,202,89,59,215,21,59,215,21, + 138,201,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,175,125,0,59,192,89,223,125,172,89,0,138,255,255,255,201,12,182, + 0,0,0,0,0,175,255,255,125,0,89,255,255,247,34,0,0,12,146,0,0,0,0,0,144, + 21,0,138,255,255,255,255,247,34,138,247,34,7,206,201,0,0,0,0,0,0,127,89, + 251,89,0,0,0,0,0,0,12,146,0,0,0,0,0,144,21,0,0,0,0,0,0,7,206,166,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,175,125,0,0,0,0,0,175,125,0,0,0, + 0,0,0,0,0,0,0,0,89,247,34,7,206,166,7,202,89,0,0,0,0,0,0,0,0,0,0,89,255, + 125,0,0,0,0,0,0,0,89,255,125,89,247,34,0,0,0,12,235,125,0,0,0,0,0,0,12, + 146,0,0,0,0,0,144,21,0,0,0,0,7,206,201,0,0,0,12,146,0,0,0,0,0,144,21,0, + 0,12,146,0,0,0,0,0,144,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,59,245, + 255,201,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,175, + 125,0,59,192,12,228,34,172,89,89,247,34,0,12,206,29,206,201,0,0,7,206,166, + 0,7,206,255,225,21,0,89,247,34,0,12,146,0,0,0,0,0,144,21,0,0,0,0,7,206, + 166,0,12,235,166,89,247,34,0,0,0,0,0,0,127,245,255,255,255,255,255,201, + 0,0,12,146,0,0,0,0,0,144,21,0,0,0,0,0,59,245,255,255,255,127,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,175,125,0,0,0,0,0,175,125,0,0,0,0,0,0,0, + 0,0,0,0,59,241,89,12,235,125,89,201,12,235,255,251,89,0,89,255,255,225, + 21,0,175,255,255,225,21,0,0,0,89,251,89,0,138,225,21,0,0,0,12,235,255,255, + 255,255,225,21,0,12,146,0,0,0,0,0,144,21,0,0,0,0,138,247,34,0,0,0,12,146, + 0,0,0,0,0,144,21,0,0,12,146,0,0,0,0,0,144,21,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,12,235,255,255,255,166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,175,125,0,59,192,0,0,0,172,89,138,225,21,0,0,0, + 0,7,206,225,21,138,225,21,0,0,89,251,89,0,0,12,235,125,0,12,146,0,0,0,0, + 0,144,21,0,0,0,0,138,225,21,0,0,89,255,255,125,0,0,0,0,0,0,0,127,138,225, + 21,0,0,0,0,0,0,12,146,0,0,0,0,0,144,21,0,0,0,0,0,0,59,241,89,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,175,125,0,0,12,235,255,255,255,255, + 225,21,0,0,0,0,0,0,0,0,0,138,255,255,201,12,228,34,175,166,0,138,201,7, + 206,125,7,206,166,0,0,0,89,255,255,247,34,59,241,89,0,0,138,225,21,0,0, + 0,12,235,125,0,0,0,0,0,0,12,146,0,0,0,0,0,144,21,0,0,0,59,245,125,0,0,0, + 0,12,146,0,0,0,0,0,144,21,0,0,12,146,0,0,0,0,0,144,21,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,59,245,255,255,255,207,235,255,255,255,255,255,255, + 207,235,255,255,255,255,255,255,255,255,255,255,255,225,21,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,59,245,255,247,34,0,0,0,0,175,166,175,201,0,0,0, + 59,245,255,255,255,255,255,125,0,12,146,0,0,0,0,0,144,21,0,0,0,89,251,89, + 0,0,0,7,206,225,21,0,0,0,0,0,0,0,127,245,255,255,255,255,255,125,0,0,12, + 146,0,0,0,0,0,144,21,0,0,0,0,0,0,59,241,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,175,125,0,0,0,0,0,175,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,138,166,7,206,125,0,89,247,94,241,89,0,138,201,0,0,0,0,0,59,245,166, + 0,89,251,89,0,89,247,34,0,0,0,12,235,125,0,0,0,0,0,0,12,146,0,0,0,0,0,144, + 21,0,0,7,206,201,0,0,0,0,0,12,146,0,0,0,0,0,144,21,0,0,12,146,0,0,0,0,0, + 144,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,235,255,255,255,166,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,138,255,255,201,0,7,206,225,21,175,201,0,0,0,59,241,89,0,0,0,0, + 0,0,12,146,0,0,0,0,0,144,21,0,0,12,235,166,0,0,0,0,0,175,225,21,0,0,0,0, + 0,0,0,127,89,255,125,0,0,0,0,0,0,12,146,0,0,0,0,0,144,21,0,0,0,0,0,0,89, + 247,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,175,125,0,0,0,0,0, + 175,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,228,34,7,206,125,0,89,247,94,241, + 89,0,138,201,0,0,0,0,0,12,235,166,0,0,89,255,125,12,235,166,0,0,0,12,235, + 125,0,0,0,0,0,0,12,146,0,0,0,0,0,144,21,0,0,138,247,34,0,0,0,0,0,12,146, + 0,0,0,0,0,144,21,0,0,12,146,0,0,0,0,0,144,21,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,59,245,255,201,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,89,247,42,206,201,0,0,89, + 225,21,0,0,89,255,125,0,0,0,0,0,0,12,146,0,0,0,0,0,144,21,0,0,175,225,21, + 0,0,0,0,0,175,225,21,0,0,0,0,0,0,0,127,0,175,251,89,0,0,0,0,0,12,146,0, + 0,0,0,0,144,21,0,59,245,166,0,0,138,225,21,0,0,0,59,245,166,138,251,89, + 7,206,201,0,12,235,125,0,59,241,89,0,0,0,175,125,0,0,0,0,0,175,125,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,138,166,0,0,175,166,0,138,201,7,206,125,7,206, + 166,138,166,0,0,0,138,251,89,0,0,0,59,115,0,89,255,201,0,0,12,235,125,0, + 0,0,0,0,0,12,146,0,0,0,0,0,144,21,0,89,251,89,0,0,0,0,0,0,12,146,0,0,0, + 0,0,144,21,0,0,12,146,0,0,0,0,0,144,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,138,125,0,0,138,225,34,182,0,0,0,7,206,166,0, + 7,206,255,247,34,0,0,175,125,0,12,146,0,0,0,0,0,144,21,0,89,251,89,0,0, + 0,0,0,0,175,225,21,0,0,0,0,0,0,0,127,0,0,138,255,255,255,255,125,0,12,235, + 255,255,255,255,255,225,21,0,138,247,34,0,7,206,166,0,0,0,0,89,247,34,175, + 201,0,7,206,201,0,12,235,125,0,59,241,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,59,215,21,0,0,12,235,255,251,89,0,89,255,255,225, + 21,12,235,255,255,255,247,34,0,0,0,0,0,0,0,0,12,235,255,255,255,255,255, + 255,255,255,251,89,0,12,235,255,255,255,255,255,225,21,0,138,255,255,255, + 255,255,255,166,0,12,235,255,255,255,255,255,225,21,0,0,12,235,255,255, + 255,255,255,225,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,89,255,255,255,247,34,0,0,0,0,0,0,0,175,255,255,125,0,138,255,255, + 255,125,0,0,12,235,255,255,255,255,255,225,21,0,175,255,255,255,255,247, + 0,0,0,175,225,21,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,175,166,0,255,255,201,0,0,0,0,0,175,166,12,232,89,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12, + 228,34,0,0,0,0,0,0,0,0,12,232,89,59,215,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 127,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,127,0,127, + 127,127,0,127,127,127,127,127,127,0,127,127,127,127,127,127,0,127,127,127, + 127,127,127,127,127,127,127,127,0,127,127,127,127,127,0,127,127,127,127, + 127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127, + 127,127,127,127,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127, + 0,127,127,127,127,0,127,127,127,127,127,127,127,127,127,127,127,127,127, + 0,127,127,127,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127, + 127,0,127,127,127,127,127,127,127,127,127,127,0,127,127,127,127,127,127, + 127,127,0,127,127,127,0,127,127,0,127,127,127,127,127,0,127,127,127,127, + 127,0,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127, + 127,127,127,127,127,127,127,127,0,127,127,127,127,127,127,0,127,127,127, + 127,127,127,127,127,127,127,127,0,127,127,127,127,127,0,127,127,127,127, + 0,127,127,127,127,127,127,127,127,127,127,127,127,127,0,127,127,127,127, + 127,127,127,127,127,0,127,127,127,127,127,0,127,127,127,127,127,127,127, + 127,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,245,255,255,255,255,255,255,225,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,235,225,21,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,7,206,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,89,247,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,89,247, + 34,0,0,0,0,59,192,0,0,0,0,0,7,206,255,255,225,21,0,0,0,0,0,0,0,0,138,247, + 34,0,0,89,251,89,0,7,206,125,0,0,7,206,255,255,255,166,0,89,251,89,138, + 247,34,0,0,0,0,7,206,255,255,255,247,34,0,0,0,0,175,255,255,251,89,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,206,255,255,255,247, + 34,0,0,0,0,0,0,0,0,0,0,0,0,89,255,255,247,34,0,0,0,0,0,0,0,0,0,0,0,0,12, + 235,255,247,34,0,0,7,206,255,251,89,0,0,7,206,125,0,0,0,0,0,0,0,0,0,0,0, + 0,89,255,255,255,255,225,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,202,89,0,0,0, + 59,245,255,247,34,0,0,0,0,0,0,0,0,0,0,0,89,201,0,0,0,0,175,166,0,0,0,0, + 0,0,89,201,0,0,0,0,175,166,0,0,0,0,0,59,245,255,201,0,0,0,59,241,89,0,0, + 0,0,0,59,245,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,89,247,34, + 0,0,0,0,59,192,0,0,0,0,0,175,201,0,0,144,21,0,0,0,0,0,0,0,0,7,206,166,0, + 7,206,166,0,0,7,206,125,0,7,206,201,0,0,89,166,0,0,0,0,0,0,0,0,0,0,89,255, + 125,0,0,0,59,245,166,0,0,0,0,0,0,12,206,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,89,255,125,0,0,0,59,245,166,0,0,0,0,0,0,0,0,0,0,59, + 241,89,0,138,201,0,0,0,0,0,138,166,0,0,0,0,0,168,34,7,206,166,0,0,172,89, + 0,175,166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,89,255,255,255,166,89,225,21, + 0,0,0,0,0,0,0,0,0,0,0,0,0,89,255,251,89,0,0,12,235,125,0,138,225,21,0,0, + 0,0,0,0,0,0,7,206,255,201,0,0,0,89,225,21,0,0,0,0,7,206,255,201,0,0,0,89, + 225,21,0,0,0,0,12,206,21,12,235,125,0,0,175,166,0,0,0,0,0,0,59,245,125, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,175,255,255,255, + 166,0,0,12,235,125,0,0,0,0,89,225,21,0,0,12,232,89,0,89,247,34,89,247,34, + 0,0,7,206,125,0,12,235,125,0,0,0,0,0,0,0,0,0,0,0,0,0,89,225,21,0,0,0,0, + 0,7,206,125,0,0,7,206,255,255,247,34,0,0,0,85,89,0,85,89,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,89,225,21,0,0,0,0,0,7,206,125,0,0,0,0,0,0,0,0,0,89,201, + 0,0,12,228,34,0,0,0,0,138,166,0,0,0,0,0,0,0,7,206,125,0,0,7,206,255,166, + 0,0,0,0,0,0,0,0,0,12,235,125,0,0,89,247,34,175,255,255,255,166,89,225,21, + 0,89,255,125,0,0,0,0,0,0,0,0,0,0,7,202,89,0,0,89,225,21,0,12,232,89,59, + 115,0,59,115,0,0,0,0,0,89,201,0,0,7,206,125,0,0,0,0,0,0,0,89,201,0,0,7, + 206,125,0,0,0,0,0,0,0,0,12,232,89,0,59,238,34,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,89,225,21,0,0,138,247,94,192,12,182, + 0,0,12,235,125,0,0,0,0,0,175,255,255,255,255,166,0,0,7,206,171,206,166, + 0,0,0,7,206,125,0,7,206,251,89,0,0,0,0,0,0,0,0,0,0,0,7,202,89,0,59,245, + 255,255,201,0,12,228,34,12,235,166,0,12,228,34,0,0,138,251,89,138,247,34, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,202,89,0,138,255,255,255,125,0,12,228,34, + 0,0,0,0,0,0,0,0,59,241,89,0,138,201,0,0,0,0,0,138,166,0,0,0,0,0,0,0,175, + 201,0,0,0,0,0,0,175,201,0,0,0,0,0,0,0,0,12,235,125,0,0,89,247,34,175,255, + 255,255,166,89,225,21,0,89,255,125,0,0,0,0,0,0,0,0,0,0,7,202,89,0,0,138, + 225,21,0,12,235,125,12,235,166,59,245,166,0,0,0,0,89,201,0,0,89,225,21, + 0,0,0,0,0,0,0,89,201,0,0,89,225,21,0,0,0,0,0,0,12,235,255,125,0,0,175,125, + 0,0,0,0,0,0,0,12,235,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,89, + 225,21,0,12,235,125,59,192,0,0,0,0,12,235,125,0,0,0,0,0,59,215,21,59,238, + 34,0,0,0,89,255,247,34,0,0,0,7,206,125,0,0,7,206,255,255,247,34,0,0,0,0, + 0,0,0,0,59,192,0,12,235,166,0,7,176,21,0,175,125,59,238,34,0,12,228,34, + 0,138,247,34,138,247,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,59,192,0,0,138, + 201,0,89,247,34,0,175,125,0,0,0,0,0,0,0,0,0,89,255,255,225,21,0,7,206,255, + 255,255,255,255,255,247,34,0,12,235,125,0,0,0,7,176,21,0,175,201,0,0,0, + 0,0,0,0,0,12,235,125,0,0,89,247,34,89,255,255,255,166,89,225,21,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,7,202,89,0,0,89,225,21,0,12,232,89,0,12,235,166,12, + 235,166,0,0,0,89,201,0,7,206,125,0,12,235,166,0,0,0,0,89,201,0,7,206,125, + 89,255,255,255,125,0,0,0,0,7,206,125,89,225,21,0,138,225,21,0,0,0,138,255, + 125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,89,247,34,0,59,241,89,59, + 192,0,0,0,12,235,255,255,255,225,21,0,0,138,166,0,7,202,89,0,0,0,7,206, + 166,0,0,0,0,0,0,0,0,7,206,125,0,12,235,201,0,0,0,0,0,0,0,0,89,166,0,89, + 247,34,0,0,0,0,0,89,166,12,232,89,0,138,247,34,89,247,34,59,238,34,0,0, + 12,235,255,255,255,255,255,255,247,34,89,255,255,255,166,89,166,0,0,138, + 201,0,138,225,21,0,89,166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,138,166, + 0,0,0,0,7,206,255,255,255,247,34,0,59,245,255,247,34,0,0,0,0,0,0,0,0,12, + 235,125,0,0,89,247,34,0,89,255,255,166,89,225,21,0,0,0,0,0,0,0,0,0,0,0, + 0,0,89,255,255,255,166,0,12,235,125,0,138,225,21,0,0,12,235,125,12,235, + 125,0,0,89,201,0,89,201,0,7,206,223,166,0,0,0,0,89,201,0,89,201,0,89,125, + 0,138,225,21,12,182,0,7,206,133,206,125,0,89,232,215,21,0,7,206,247,34, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,89,247,34,0,59,241,89,59, + 192,0,0,0,0,12,235,125,0,0,0,0,0,59,215,21,59,238,34,0,59,245,255,255,255, + 255,225,21,0,0,0,0,0,59,241,89,0,0,138,225,21,0,0,0,0,0,0,0,89,166,0,89, + 247,34,0,0,0,0,0,89,166,0,138,255,255,176,228,34,0,138,247,34,138,247,34, + 0,0,0,0,0,0,0,0,59,238,34,0,0,0,0,0,89,166,0,0,138,255,255,225,21,0,0,89, + 166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,138,166,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,235,125,0,0,89,247,34,0,0,0,138,166,89,225, + 21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,59,245,255,247,34,0,0,12,235, + 166,12,235,166,0,0,0,0,0,12,232,89,0,175,166,138,166,0,0,0,0,0,0,12,232, + 89,0,0,0,0,138,201,0,0,89,255,255,201,89,225,21,89,225,81,215,21,0,138, + 247,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,89,247,34,0,12,235, + 125,59,192,0,0,0,0,59,241,89,0,0,0,0,0,175,255,255,255,255,166,0,0,0,7, + 206,166,0,0,0,0,7,206,125,0,12,235,201,0,7,206,166,0,0,0,0,0,0,0,0,59,192, + 0,12,235,166,0,7,176,21,0,175,125,0,0,0,0,0,0,0,0,0,138,251,89,138,247, + 34,0,0,0,0,0,0,0,59,238,34,0,0,0,0,0,59,192,0,0,138,201,59,245,166,0,0, + 175,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,138,166,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,235,125,0,0,89,247,34,0,0,0,138,166, + 89,225,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,235,166, + 59,245,166,0,0,0,0,0,0,138,201,0,138,201,0,138,166,0,0,0,0,0,0,138,201, + 0,0,0,0,89,247,34,0,0,0,0,0,7,206,125,59,238,34,59,215,21,0,175,225,21, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,89,247,34,0,0,175,225,81, + 192,12,182,0,7,206,125,0,0,0,0,0,89,225,21,0,0,12,232,89,0,0,7,206,166, + 0,0,0,0,7,206,125,0,0,59,245,255,255,166,0,0,0,0,0,0,0,0,0,7,202,89,0,59, + 245,255,255,166,0,12,228,34,0,0,0,0,0,0,0,0,0,0,85,89,0,85,89,0,0,0,0,0, + 0,0,59,238,34,0,0,0,0,0,7,202,89,0,138,201,0,59,245,225,34,228,34,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,7,206,255,255,255,255,255,255,247,34,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,235,201,0,0,175,247,34,0,0,0,138,166, + 89,225,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,59,115,0, + 59,115,0,0,0,0,0,0,12,232,89,0,175,255,255,255,255,201,0,0,0,0,12,232,89, + 0,0,0,138,201,0,0,0,0,0,0,0,89,201,0,89,255,255,255,255,247,34,138,251, + 89,0,7,176,21,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,138,247,34,0,0,0, + 175,255,255,255,166,0,89,255,255,255,255,255,247,34,0,0,0,0,0,0,0,0,0,0, + 7,206,166,0,0,0,0,7,206,125,0,0,0,0,0,138,255,166,0,0,0,0,0,0,0,0,0,89, + 225,21,0,0,0,0,0,7,206,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,59,238,34,0,0,0,0,0,0,89,225,21,0,0,0,0,0,7,206,125,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,12,235,191,255,255,166,238,34,0,0,0,138,166,89,225,21,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,175,201,0,0, + 0,0,0,138,166,0,0,0,0,0,175,201,0,0,0,89,255,255,255,255,125,0,0,0,12,232, + 89,0,0,0,0,59,215,21,0,0,138,255,255,255,225,21,0,0,0,0,0,0,0,0,0,0,0,0, + 0,127,0,0,0,0,0,0,0,0,0,0,0,0,59,192,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,7,206,125,0,0,0,0,0,0,175,201,0,0,0,0,0,0,0,0,0,0, + 89,255,125,0,0,0,59,245,166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,89,255,125,0,0,0,59,245,166,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,12,235,125,0,0,0,0,0,0,0,0,138,166,89,225,21,0,0,0,0,0,0,0,0,0,175, + 125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,59,192,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,206,125,0,7,199,34, + 0,12,235,125,0,0,0,0,0,0,0,0,0,0,0,7,206,255,255,255,247,34,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,206,255,255, + 255,247,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,235,125,0,0,0,0,0,0,0,0,138,166, + 89,225,21,0,0,0,0,0,0,0,0,7,202,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,7,206,125,0,7,206,255,255,255,166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,235,125,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,12,235,255,201,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127, + 127,127,0,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127, + 127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127, + 127,0,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127, + 0,127,127,127,127,127,127,127,127,127,127,127,127,0,127,127,127,127,127, + 127,0,127,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,127, + 0,127,127,127,127,0,127,127,127,127,127,127,127,127,127,127,127,127,0,127, + 127,127,127,127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,127, + 127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,0,127, + 127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127, + 127,127,0,127,127,127,127,127,0,127,127,127,127,127,127,0,127,127,127,127, + 127,0,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127, + 127,127,127,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,127, + 127,127,127,127,127,0,127,127,127,127,127,127,127,127,127,127,127,127,127, + 0,127,127,127,127,127,127,127,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,138,225, + 21,0,0,0,0,0,12,235,125,0,0,0,0,19,172,255,190,11,0,0,0,0,138,255,201,7, + 202,89,0,0,0,0,0,0,0,0,0,0,7,206,255,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,59,138,225,21,0,0,0,0,0,0,59,245,201,0,0,0,19,172, + 255,190,11,0,0,0,0,0,0,0,0,0,7,206,225,21,0,0,0,59,245,201,19,172,255,190, + 11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,235,251,89,89,201,0,0,0,0,0,175, + 201,0,0,0,0,0,0,0,0,7,206,225,21,0,0,0,0,0,19,172,255,190,11,0,0,0,0,0, + 175,255,166,12,228,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,89,255,125,0,0,0,0,0,0,0,12,175,247,34,0,0,0,19,172,255, + 190,11,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,175,247,34,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,127,0,0,0,7,206,125,0,0,0,0,0,138,201,0,0,0,0,0,136,190, + 45,196,145,0,0,0,59,215,21,175,255,166,0,0,0,175,225,29,206,166,0,0,7,202, + 89,7,202,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,209,125, + 0,0,0,0,0,0,138,225,21,0,0,0,136,190,45,196,145,0,0,0,175,225,29,206,166, + 0,0,12,235,125,0,0,12,138,225,21,136,190,45,196,145,159,251,89,138,247, + 34,0,0,0,0,0,0,0,0,0,0,0,175,125,59,245,247,34,0,0,0,0,0,12,232,89,0,0, + 0,0,0,0,0,175,166,0,0,0,0,0,0,12,136,190,45,196,145,0,0,0,0,138,166,12, + 235,255,125,0,0,0,0,7,206,166,12,235,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,12,232,89,0,0,0,0,0,0,138,201,0,0,0,0,0,136,190,45, + 196,145,34,0,0,0,89,251,89,138,247,34,0,0,0,0,0,138,201,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,202,89,7,202,89,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,89,255, + 255,125,0,0,0,0,127,0,0,7,206,251,89,0,0,0,0,7,206,251,89,0,0,0,0,7,206, + 251,89,0,0,0,0,0,7,206,251,89,0,0,0,0,7,206,251,89,0,0,0,0,12,235,255,125, + 0,0,0,0,0,89,255,255,255,255,255,255,255,255,125,0,0,0,59,245,255,255,255, + 201,12,235,255,255,255,255,255,125,12,235,255,255,255,255,255,125,12,235, + 255,255,255,255,255,125,12,235,255,255,255,255,255,125,89,255,255,255,201, + 89,255,255,255,201,89,255,255,255,201,89,255,255,255,201,0,175,255,255, + 255,255,201,0,0,0,12,235,251,89,0,0,12,235,125,0,0,0,138,255,255,166,0, + 0,0,0,0,0,138,255,255,166,0,0,0,0,0,0,138,255,255,166,0,0,0,0,0,0,138,255, + 255,166,0,0,0,0,0,0,138,255,255,166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,138, + 255,255,201,89,251,89,12,235,125,0,0,0,59,245,125,12,235,125,0,0,0,59,245, + 125,12,235,125,0,0,0,59,245,125,12,235,125,0,0,0,59,245,125,7,206,225,21, + 0,0,0,138,247,0,235,166,0,0,0,0,0,0,138,225,21,7,206,166,0,0,0,127,0,0, + 59,245,255,166,0,0,0,0,59,245,255,166,0,0,0,0,59,245,255,166,0,0,0,0,0, + 59,245,255,166,0,0,0,0,59,245,255,166,0,0,0,0,59,245,255,166,0,0,0,0,0, + 175,201,7,206,166,0,0,0,0,0,0,0,138,255,125,0,0,7,202,102,235,166,0,0,0, + 0,0,12,235,166,0,0,0,0,0,12,235,166,0,0,0,0,0,12,235,166,0,0,0,0,0,0,12, + 235,125,0,0,12,235,125,0,0,12,235,125,0,0,12,235,125,0,0,175,201,0,0,7, + 206,251,89,0,12,235,255,201,0,0,12,235,125,0,59,245,166,0,0,138,251,89, + 0,0,59,245,166,0,0,138,251,89,0,0,59,245,166,0,0,138,251,89,0,0,59,245, + 166,0,0,138,251,89,0,0,59,245,166,0,0,138,251,89,0,0,0,0,0,0,0,0,0,0,0, + 0,59,245,166,0,0,89,255,166,0,12,235,125,0,0,0,59,245,125,12,235,125,0, + 0,0,59,245,125,12,235,125,0,0,0,59,245,125,12,235,125,0,0,0,59,245,125, + 0,59,245,125,0,0,59,245,125,12,235,166,0,0,0,0,0,12,235,125,0,0,175,201, + 0,0,0,127,0,0,138,225,151,225,21,0,0,0,138,225,151,225,21,0,0,0,138,225, + 151,225,21,0,0,0,0,138,225,151,225,21,0,0,0,138,225,151,225,21,0,0,0,138, + 225,151,225,21,0,0,0,59,241,89,7,206,166,0,0,0,0,0,0,12,235,166,0,0,0,0, + 0,12,235,166,0,0,0,0,0,12,235,166,0,0,0,0,0,12,235,166,0,0,0,0,0,12,235, + 166,0,0,0,0,0,0,12,235,125,0,0,12,235,125,0,0,12,235,125,0,0,12,235,125, + 0,0,175,201,0,0,0,0,175,225,21,12,235,166,245,125,0,12,235,125,12,235,125, + 0,0,0,0,138,247,34,12,235,125,0,0,0,0,138,247,34,12,235,125,0,0,0,0,138, + 247,34,12,235,125,0,0,0,0,138,247,34,12,235,125,0,0,0,0,138,247,34,0,138, + 225,21,0,0,0,175,201,0,12,235,125,0,0,7,202,159,247,34,12,235,125,0,0,0, + 59,245,125,12,235,125,0,0,0,59,245,125,12,235,125,0,0,0,59,245,125,12,235, + 125,0,0,0,59,245,125,0,0,138,247,34,7,206,201,0,12,235,255,255,255,251, + 89,0,12,235,125,0,12,235,125,0,0,0,127,0,7,206,166,59,241,89,0,0,7,206, + 166,59,241,89,0,0,7,206,166,59,241,89,0,0,0,7,206,166,59,241,89,0,0,7,206, + 166,59,241,89,0,0,7,206,166,59,241,89,0,0,0,138,225,21,7,206,166,0,0,0, + 0,0,0,89,247,34,0,0,0,0,0,12,235,166,0,0,0,0,0,12,235,166,0,0,0,0,0,12, + 235,166,0,0,0,0,0,12,235,166,0,0,0,0,0,0,12,235,125,0,0,12,235,125,0,0, + 12,235,125,0,0,12,235,125,0,0,175,201,0,0,0,0,59,241,89,12,235,125,138, + 225,21,12,235,125,89,247,34,0,0,0,0,59,245,125,89,247,34,0,0,0,0,59,245, + 125,89,247,34,0,0,0,0,59,245,125,89,247,34,0,0,0,0,59,245,125,89,247,34, + 0,0,0,0,59,245,125,0,0,175,225,21,0,175,225,21,0,89,247,34,0,0,138,166, + 12,235,125,12,235,125,0,0,0,59,245,125,12,235,125,0,0,0,59,245,125,12,235, + 125,0,0,0,59,245,125,12,235,125,0,0,0,59,245,125,0,0,12,235,166,89,247, + 34,0,12,235,166,0,0,138,251,89,12,235,133,206,255,125,0,0,0,0,127,0,59, + 241,89,7,206,166,0,0,59,241,89,7,206,166,0,0,59,241,89,7,206,166,0,0,0, + 59,241,89,7,206,166,0,0,59,241,89,7,206,166,0,0,59,241,89,7,206,166,0,0, + 12,235,125,0,7,206,255,255,255,255,247,34,0,138,225,21,0,0,0,0,0,12,235, + 255,255,255,255,247,34,12,235,255,255,255,255,247,34,12,235,255,255,255, + 255,247,34,12,235,255,255,255,255,247,34,0,12,235,125,0,0,12,235,125,0, + 0,12,235,125,0,0,12,235,125,0,206,255,255,255,247,34,0,12,235,125,12,235, + 125,12,235,125,12,235,125,138,225,21,0,0,0,0,12,235,166,138,225,21,0,0, + 0,0,12,235,166,138,225,21,0,0,0,0,12,235,166,138,225,21,0,0,0,0,12,235, + 166,138,225,21,0,0,0,0,12,235,166,0,0,0,175,225,187,225,21,0,0,138,225, + 21,0,59,215,21,7,206,166,12,235,125,0,0,0,59,245,125,12,235,125,0,0,0,59, + 245,125,12,235,125,0,0,0,59,245,125,12,235,125,0,0,0,59,245,125,0,0,0,89, + 255,255,125,0,0,12,235,166,0,0,12,235,166,12,235,125,0,7,206,201,0,0,0, + 127,0,138,225,21,0,138,225,21,0,138,225,21,0,138,225,21,0,138,225,21,0, + 138,225,21,0,0,138,225,21,0,138,225,21,0,138,225,21,0,138,225,21,0,138, + 225,21,0,138,225,21,0,89,255,255,255,255,255,166,0,0,0,0,0,0,138,225,21, + 0,0,0,0,0,12,235,166,0,0,0,0,0,12,235,166,0,0,0,0,0,12,235,166,0,0,0,0, + 0,12,235,166,0,0,0,0,0,0,12,235,125,0,0,12,235,125,0,0,12,235,125,0,0,12, + 235,125,0,0,175,201,0,0,0,0,12,235,125,12,235,125,0,138,225,34,235,125, + 138,225,21,0,0,0,0,12,235,166,138,225,21,0,0,0,0,12,235,166,138,225,21, + 0,0,0,0,12,235,166,138,225,21,0,0,0,0,12,235,166,138,225,21,0,0,0,0,12, + 235,166,0,0,0,0,175,225,21,0,0,0,138,225,21,7,202,89,0,7,206,166,12,235, + 125,0,0,0,59,245,125,12,235,125,0,0,0,59,245,125,12,235,125,0,0,0,59,245, + 125,12,235,125,0,0,0,59,245,125,0,0,0,7,206,225,21,0,0,12,235,166,0,0,12, + 235,166,12,235,125,0,0,59,241,89,0,0,127,7,206,255,255,255,255,251,89,7, + 206,255,255,255,255,251,89,7,206,255,255,255,255,251,89,0,7,206,255,255, + 255,255,251,89,7,206,255,255,255,255,251,89,7,206,255,255,255,255,251,89, + 7,206,166,0,0,7,206,166,0,0,0,0,0,0,89,247,34,0,0,0,0,0,12,235,166,0,0, + 0,0,0,12,235,166,0,0,0,0,0,12,235,166,0,0,0,0,0,12,235,166,0,0,0,0,0,0, + 12,235,125,0,0,12,235,125,0,0,12,235,125,0,0,12,235,125,0,0,175,201,0,0, + 0,0,59,241,89,12,235,125,0,12,235,138,235,125,89,247,34,0,0,0,0,59,245, + 125,89,247,34,0,0,0,0,59,245,125,89,247,34,0,0,0,0,59,245,125,89,247,34, + 0,0,0,0,59,245,125,89,247,34,0,0,0,0,59,245,125,0,0,0,175,225,187,225,21, + 0,0,138,247,34,175,125,0,0,12,235,125,12,235,125,0,0,0,59,241,89,12,235, + 125,0,0,0,59,241,89,12,235,125,0,0,0,59,241,89,12,235,125,0,0,0,59,241, + 89,0,0,0,0,175,225,21,0,0,12,235,166,0,0,175,247,34,12,235,125,0,0,12,235, + 125,0,0,127,59,241,89,0,0,7,206,166,59,241,89,0,0,7,206,166,59,241,89,0, + 0,7,206,166,0,59,241,89,0,0,7,206,166,59,241,89,0,0,7,206,166,59,241,89, + 0,0,7,206,166,59,241,89,0,0,7,206,166,0,0,0,0,0,0,59,245,166,0,0,0,0,0, + 12,235,166,0,0,0,0,0,12,235,166,0,0,0,0,0,12,235,166,0,0,0,0,0,12,235,166, + 0,0,0,0,0,0,12,235,125,0,0,12,235,125,0,0,12,235,125,0,0,12,235,125,0,0, + 175,201,0,0,0,0,175,225,21,12,235,125,0,0,138,232,245,125,12,235,125,0, + 0,0,0,138,247,34,12,235,125,0,0,0,0,138,247,34,12,235,125,0,0,0,0,138,247, + 34,12,235,125,0,0,0,0,138,247,34,12,235,125,0,0,0,0,138,247,34,0,0,175, + 225,21,0,175,225,21,0,59,245,191,201,0,0,0,89,225,21,12,235,166,0,0,0,89, + 251,89,12,235,166,0,0,0,89,251,89,12,235,166,0,0,0,89,251,89,12,235,166, + 0,0,0,89,251,89,0,0,0,0,175,225,21,0,0,12,235,255,255,255,247,34,0,12,235, + 125,0,0,59,241,89,0,0,127,138,225,21,0,0,0,138,247,163,225,21,0,0,0,138, + 247,163,225,21,0,0,0,138,247,34,138,225,21,0,0,0,138,247,163,225,21,0,0, + 0,138,247,163,225,21,0,0,0,138,247,198,225,21,0,0,7,206,166,0,0,0,0,0,0, + 0,138,255,125,0,0,7,202,102,235,166,0,0,0,0,0,12,235,166,0,0,0,0,0,12,235, + 166,0,0,0,0,0,12,235,166,0,0,0,0,0,0,12,235,125,0,0,12,235,125,0,0,12,235, + 125,0,0,12,235,125,0,0,175,201,0,0,7,206,251,89,0,12,235,125,0,0,12,235, + 255,125,0,89,255,125,0,0,89,251,89,0,0,89,255,125,0,0,89,251,89,0,0,89, + 255,125,0,0,89,251,89,0,0,89,255,125,0,0,89,251,89,0,0,89,255,125,0,0,89, + 251,89,0,0,138,225,21,0,0,0,175,201,0,0,138,251,89,0,0,89,251,89,0,0,138, + 247,34,0,7,206,225,21,0,138,247,34,0,7,206,225,21,0,138,247,34,0,7,206, + 225,21,0,138,247,34,0,7,206,225,21,0,0,0,0,175,225,21,0,0,12,235,166,0, + 0,0,0,0,12,235,125,0,0,175,225,21,0,0,127,206,166,0,0,0,0,59,245,255,166, + 0,0,0,0,59,245,255,166,0,0,0,0,59,245,133,206,166,0,0,0,0,59,245,255,166, + 0,0,0,0,59,245,255,166,0,0,0,0,59,245,255,125,0,0,0,7,206,255,255,255,255, + 255,125,0,0,0,59,245,255,255,255,201,12,235,255,255,255,255,255,125,12, + 235,255,255,255,255,255,125,12,235,255,255,255,255,255,125,12,235,255,255, + 255,255,255,125,89,255,255,255,201,89,255,255,255,201,89,255,255,255,201, + 89,255,255,255,201,0,175,255,255,255,255,225,21,0,0,12,235,125,0,0,0,138, + 255,125,0,0,0,175,255,255,201,0,0,0,0,0,0,175,255,255,201,0,0,0,0,0,0,175, + 255,255,201,0,0,0,0,0,0,175,255,255,201,0,0,0,0,0,0,175,255,255,201,0,0, + 0,0,0,0,0,0,0,0,0,0,0,7,202,97,206,255,255,201,0,0,0,0,0,138,255,255,255, + 201,0,0,0,0,138,255,255,255,201,0,0,0,0,138,255,255,255,201,0,0,0,0,138, + 255,255,255,201,0,0,0,0,0,0,175,225,21,0,0,12,235,166,0,0,0,0,0,12,235, + 133,206,255,225,21,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,138,166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,138,166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,175,166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,206,255,225,21, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,127,127,127,127, + 127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,127, + 0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127, + 127,127,127,127,0,127,127,127,127,127,127,127,127,127,127,127,127,127,0, + 127,127,127,127,127,127,127,127,0,127,127,127,127,127,127,0,127,127,127, + 127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127, + 127,0,127,127,127,127,0,127,127,127,127,0,127,127,127,127,0,127,127,127, + 127,0,127,127,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127, + 127,0,127,127,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127, + 127,127,0,127,127,127,127,127,127,127,127,127,0,127,127,127,127,127,127, + 127,127,127,0,127,127,127,127,127,127,127,127,127,0,127,127,127,127,127, + 127,127,127,127,0,127,127,127,127,127,127,127,127,127,0,127,127,127,127, + 127,127,127,127,0,127,127,127,127,127,127,127,127,0,127,127,127,127,127, + 127,127,127,0,127,127,127,127,127,127,127,127,0,127,127,127,127,127,127, + 127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,127, + 0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,7,206,225,21, + 0,0,0,0,0,12,235,225,21,0,0,89,255,225,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,7,206,255,247,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,206,247, + 34,0,0,0,0,0,0,0,138,251,89,0,0,59,245,247,34,0,0,0,0,0,0,0,0,0,175,247, + 34,0,0,175,0,255,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,206,225,21, + 0,0,0,0,0,0,0,138,255,125,0,0,0,12,235,251,89,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,138,251,89,0,0,0,0,0,0, + 7,206,225,21,0,0,0,7,206,251,89,0,0,0,0,0,0,0,0,0,0,0,0,0,59,245,166,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,59,241,89,0,0,0,0, + 0,89,247,34,0,0,7,206,138,235,125,0,0,89,255,225,21,175,125,0,0,0,0,0,0, + 0,0,0,138,201,0,138,201,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12, + 235,125,0,0,0,0,0,0,12,235,125,0,0,0,175,171,206,166,0,0,0,0,0,0,0,0,0, + 7,206,166,0,59,245,255,166,238,0,0,0,0,0,0,0,0,0,0,0,0,7,206,255,125,59, + 215,21,0,0,59,241,89,0,0,0,0,0,0,7,206,166,0,0,0,0,138,201,175,201,0,0, + 0,12,235,251,89,89,201,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,7,206,166,0,0,0,0,0,0,89,247,34,0,0,0,0,89,225,151,201,0,0,0,0, + 0,0,0,0,0,0,0,0,0,175,201,0,12,235,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,127,0,0,0,138,201,0,0,0,0,7,206,125,0,0,0,138,201,0,89,225,21, + 12,228,34,138,255,201,0,0,0,138,247,34,175,225,21,0,138,201,0,138,201,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,89,225,21,0,0,0,0,0,89,225, + 21,0,0,89,247,34,59,241,89,0,59,241,89,89,247,34,0,0,89,225,21,175,127, + 215,21,206,247,42,206,0,138,255,247,42,206,125,0,0,138,166,12,235,251,89, + 0,0,0,0,138,201,0,0,0,0,0,0,89,225,21,0,0,0,59,241,89,12,235,125,0,0,175, + 125,59,245,247,34,0,0,12,235,125,89,251,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,59,238,34,0,0,0,0,0,175,166,0,0,0,0,12,232,89,7,206,125,0, + 0,12,235,166,59,245,125,0,0,0,59,238,34,0,12,235,125,0,0,0,0,0,0,89,247, + 34,138,225,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,206,255,247,34,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,175,251,89,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,199,34,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,12,235,125,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,12,235,255,255,255,166,0,12,235,255, + 255,255,166,0,12,235,255,255,255,166,0,12,235,255,255,255,166,0,0,12,235, + 255,255,255,166,0,12,235,255,255,255,166,0,12,235,255,255,255,166,0,175, + 255,255,125,0,0,12,235,255,255,125,0,0,12,235,255,255,225,21,0,0,12,235, + 255,255,225,21,0,12,235,255,255,225,21,0,12,235,255,255,225,21,0,12,235, + 125,12,235,125,12,235,125,12,235,125,0,12,235,125,89,251,89,0,12,235,138, + 235,255,247,34,0,0,12,235,255,255,201,0,0,0,12,235,255,255,201,0,0,0,12, + 235,255,255,201,0,0,0,12,235,255,255,201,0,0,0,12,235,255,255,201,0,0,0, + 0,0,0,175,247,34,0,0,0,12,235,255,255,255,166,0,59,241,89,0,0,89,247,34, + 59,241,89,0,0,89,247,34,59,241,89,0,0,89,247,34,59,241,89,0,0,89,247,42, + 206,201,0,0,0,138,232,245,166,245,255,251,89,7,206,201,0,0,0,138,225,21, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,127,12,206,21,0,59,245,125,12,206,21,0,59,245,125,12,206, + 21,0,59,245,125,12,206,21,0,59,245,125,0,12,206,21,0,59,245,125,12,206, + 21,0,59,245,125,12,206,21,0,12,235,255,125,0,7,206,166,12,235,166,0,0,172, + 102,0,235,125,0,0,175,201,0,12,235,125,0,0,175,201,12,235,125,0,0,175,201, + 12,235,125,0,0,175,201,0,12,235,125,12,235,125,12,235,125,12,235,125,0, + 0,0,0,0,175,201,0,12,235,247,34,0,175,201,0,12,235,166,0,7,206,201,0,12, + 235,166,0,7,206,201,0,12,235,166,0,7,206,201,0,12,235,166,0,7,206,201,0, + 12,235,166,0,7,206,201,0,0,0,0,0,175,247,34,0,0,12,235,166,0,12,235,201, + 0,59,241,89,0,0,89,247,34,59,241,89,0,0,89,247,34,59,241,89,0,0,89,247, + 34,59,241,89,0,0,89,247,34,89,247,34,0,7,206,176,235,225,21,0,175,225,21, + 89,247,34,0,7,206,166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,7,206,166,0,0,0,0,7, + 206,166,0,0,0,0,7,206,166,0,0,0,0,7,206,166,0,0,0,0,0,7,206,166,0,0,0,0, + 7,206,166,0,0,0,0,0,175,201,0,0,0,89,225,138,225,21,0,0,0,0,89,225,21,0, + 0,89,247,34,89,225,21,0,0,89,247,124,225,21,0,0,89,247,124,225,21,0,0,89, + 247,34,12,235,125,12,235,125,12,235,125,12,235,125,0,89,255,255,255,255, + 247,34,12,235,125,0,0,89,247,34,138,225,21,0,0,59,238,34,138,225,21,0,0, + 59,238,34,138,225,21,0,0,59,238,34,138,225,21,0,0,59,238,34,138,225,21, + 0,0,59,238,34,0,0,0,0,0,0,0,0,0,138,225,21,0,172,132,238,34,59,241,89,0, + 0,89,247,34,59,241,89,0,0,89,247,34,59,241,89,0,0,89,247,34,59,241,89,0, + 0,89,247,34,12,235,125,0,59,238,47,235,125,0,0,59,241,89,12,235,125,0,59, + 238,34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,59,245,255,255,255,166,0,59,245,255,255, + 255,166,0,59,245,255,255,255,166,0,59,245,255,255,255,166,0,0,59,245,255, + 255,255,166,0,59,245,255,255,255,166,0,89,255,255,255,255,255,255,255,255, + 255,247,175,201,0,0,0,0,0,175,255,255,255,255,255,247,34,175,255,255,255, + 255,255,247,198,255,255,255,255,255,247,198,255,255,255,255,255,247,34, + 12,235,125,12,235,125,12,235,125,12,235,125,89,251,89,0,0,59,241,89,12, + 235,125,0,0,89,247,34,175,201,0,0,0,12,232,89,175,201,0,0,0,12,232,89,175, + 201,0,0,0,12,232,89,175,201,0,0,0,12,232,89,175,201,0,0,0,12,232,89,7,206, + 255,255,255,255,255,255,251,226,201,0,89,166,12,232,89,59,241,89,0,0,89, + 247,34,59,241,89,0,0,89,247,34,59,241,89,0,0,89,247,34,59,241,89,0,0,89, + 247,34,0,175,201,0,138,201,12,235,125,0,0,12,235,125,0,175,201,0,138,201, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,127,89,255,166,0,7,206,166,89,255,166,0,7,206,166,89, + 255,166,0,7,206,166,89,255,166,0,7,206,166,0,89,255,166,0,7,206,166,89, + 255,166,0,7,206,166,138,255,125,0,0,175,201,0,0,0,0,0,175,201,0,0,0,0,0, + 175,201,0,0,0,0,0,0,175,201,0,0,0,0,0,175,201,0,0,0,0,0,175,201,0,0,0,0, + 0,0,12,235,125,12,235,125,12,235,125,12,235,125,175,201,0,0,0,59,241,89, + 12,235,125,0,0,89,247,34,175,201,0,0,0,12,232,89,175,201,0,0,0,12,232,89, + 175,201,0,0,0,12,232,89,175,201,0,0,0,12,232,89,175,201,0,0,0,12,232,89, + 0,0,0,0,0,0,0,0,0,175,201,7,176,21,12,232,89,59,241,89,0,0,89,247,34,59, + 241,89,0,0,89,247,34,59,241,89,0,0,89,247,34,59,241,89,0,0,89,247,34,0, + 89,247,47,235,125,12,235,125,0,0,12,235,125,0,89,247,47,235,125,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,127,175,201,0,0,7,206,166,175,201,0,0,7,206,166,175,201,0,0, + 7,206,166,175,201,0,0,7,206,166,0,175,201,0,0,7,206,166,175,201,0,0,7,206, + 166,175,201,0,0,0,138,225,21,0,0,0,0,138,225,21,0,0,0,0,138,247,34,0,0, + 0,0,0,138,247,34,0,0,0,0,138,247,34,0,0,0,0,138,247,34,0,0,0,0,0,12,235, + 125,12,235,125,12,235,125,12,235,125,175,201,0,0,0,89,247,34,12,235,125, + 0,0,89,247,34,138,225,21,0,0,89,247,34,138,225,21,0,0,89,247,34,138,225, + 21,0,0,89,247,34,138,225,21,0,0,89,247,34,138,225,21,0,0,89,247,34,0,0, + 0,0,175,247,34,0,0,138,225,151,125,0,89,247,34,59,241,89,0,0,89,247,34, + 59,241,89,0,0,89,247,34,59,241,89,0,0,89,247,34,59,241,89,0,0,89,247,34, + 0,12,235,191,247,34,12,235,125,0,0,59,241,89,0,12,235,191,247,34,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,127,138,225,21,0,138,255,166,138,225,21,0,138,255,166,138, + 225,21,0,138,255,166,138,225,21,0,138,255,166,0,138,225,21,0,138,255,166, + 138,225,21,0,138,255,166,89,247,34,0,89,255,255,166,0,0,12,206,12,235,166, + 0,0,127,102,0,235,201,0,0,12,206,21,12,235,201,0,0,12,206,34,235,201,0, + 0,12,206,34,235,201,0,0,12,206,21,12,235,125,12,235,125,12,235,125,12,235, + 125,89,255,125,0,7,206,166,0,12,235,125,0,0,89,247,34,12,235,166,0,7,206, + 201,0,12,235,166,0,7,206,201,0,12,235,166,0,7,206,201,0,12,235,166,0,7, + 206,201,0,12,235,166,0,7,206,201,0,0,0,0,0,175,247,34,0,0,12,235,201,0, + 7,206,201,0,7,206,166,0,59,245,247,34,7,206,166,0,59,245,247,34,7,206,166, + 0,59,245,247,34,7,206,166,0,59,245,247,34,0,0,138,255,166,0,12,235,125, + 0,7,206,201,0,0,0,138,255,166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,7,206,255,255,171, + 206,166,7,206,255,255,171,206,166,7,206,255,255,171,206,166,7,206,255,255, + 171,206,166,0,7,206,255,255,171,206,166,7,206,255,255,171,206,166,0,89, + 255,255,201,0,0,175,255,255,247,34,0,12,235,255,255,166,0,0,7,206,255,255, + 247,34,0,0,7,206,255,255,247,34,0,7,206,255,255,247,34,0,7,206,255,255, + 247,34,0,12,235,125,12,235,125,12,235,125,12,235,125,0,89,255,255,255,201, + 0,0,12,235,125,0,0,89,247,34,0,12,235,255,255,201,0,0,0,12,235,255,255, + 201,0,0,0,12,235,255,255,201,0,0,0,12,235,255,255,201,0,0,0,12,235,255, + 255,201,0,0,0,0,0,0,0,0,0,0,0,7,206,255,255,255,201,0,0,0,59,245,255,225, + 111,247,34,0,59,245,255,225,111,247,34,0,59,245,255,225,111,247,34,0,59, + 245,255,225,111,247,34,0,0,59,241,89,0,12,235,255,255,255,225,21,0,0,0, + 59,241,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,175,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,138,125,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,138,225,21,0,12,235,125,0,0,0,0,0,0,0, + 138,225,21,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,7,202,89,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,7,206,166,0,0,12,235,125,0,0,0,0,0,0,7,206, + 166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 12,235,255,166,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,89,247,34,0,0,12,235,125,0,0,0,0,0,0,89,247, + 34,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,127,127,127,127,127,127,0,127,127,127,127, + 127,127,0,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127, + 127,127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,127,127,127, + 127,127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,127,127,127, + 0,127,127,127,127,127,127,0,127,127,127,127,127,127,0,127,127,127,127,127, + 127,127,0,127,127,0,127,127,0,127,127,0,127,127,0,127,127,127,127,127,127, + 127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127, + 127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127, + 127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,127, + 0,127,127,127,127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127, + 127,127,127,127,0,127,127,127,127,127,127,127,0,127,127,127,127,127,127, + 127,0,127,127,127,127,127,127,0,127,127,127,127,127,127,0,127,127,127,127, + 127,127,127,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, + 0,0,0 +}; + + +void TwGenerateDefaultFonts() +{ + g_DefaultSmallFont = TwGenerateFont(s_Font0, FONT0_BM_W, FONT0_BM_H); + assert(g_DefaultSmallFont && g_DefaultSmallFont->m_NbCharRead==224); + g_DefaultNormalFont = TwGenerateFont(s_Font1AA, FONT1AA_BM_W, FONT1AA_BM_H); + assert(g_DefaultNormalFont && g_DefaultNormalFont->m_NbCharRead==224); + g_DefaultLargeFont = TwGenerateFont(s_Font2AA, FONT2AA_BM_W, FONT2AA_BM_H); + assert(g_DefaultLargeFont && g_DefaultLargeFont->m_NbCharRead==224); +} + +// --------------------------------------------------------------------------- + +void TwDeleteDefaultFonts() +{ + delete g_DefaultSmallFont; + g_DefaultSmallFont = NULL; + delete g_DefaultNormalFont; + g_DefaultNormalFont = NULL; + delete g_DefaultLargeFont; + g_DefaultLargeFont = NULL; +} + +// --------------------------------------------------------------------------- diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/TwFonts.h b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/TwFonts.h new file mode 100644 index 00000000..79500c60 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/TwFonts.h @@ -0,0 +1,67 @@ +// --------------------------------------------------------------------------- +// +// @file TwFonts.h +// @brief Bitmaps fonts +// @author Philippe Decaudin - http://www.antisphere.com +// @license This file is part of the AntTweakBar library. +// Copyright © 2005, 2006 Philippe Decaudin. +// For conditions of distribution and use, see License.txt +// +// notes: Private header +// TAB=4 +// +// --------------------------------------------------------------------------- + + +#if !defined ANT_TW_FONTS_INCLUDED +#define ANT_TW_FONTS_INCLUDED + +//#include + +/* +A source bitmap includes 224 characters starting from ascii char 32 (i.e. space) to ascii char 255: + + !"#$%&'()*+,-./0123456789:;<=>? +@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_ +`abcdefghijklmnopqrstuvwxyz{|}~ +€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ + ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ +ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞß +àáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ + +First column of a source bitmap is a delimiter with color=zero at the end of each line of characters. +Last row of a line of characters is a delimiter with color=zero at the last pixel of each character. + +*/ + + +struct CTexFont +{ + unsigned char * m_TexBytes; + int m_TexWidth; // power of 2 + int m_TexHeight; // power of 2 + float m_CharU0[256]; + float m_CharV0[256]; + float m_CharU1[256]; + float m_CharV1[256]; + int m_CharWidth[256]; + int m_CharHeight; + int m_NbCharRead; + + CTexFont(); + ~CTexFont(); +}; + + +CTexFont *TwGenerateFont(const unsigned char *_Bitmap, int _BmWidth, int _BmHeight); + + +extern CTexFont *g_DefaultSmallFont; +extern CTexFont *g_DefaultNormalFont; +extern CTexFont *g_DefaultLargeFont; + +void TwGenerateDefaultFonts(); +void TwDeleteDefaultFonts(); + + +#endif // !defined ANT_TW_FONTS_INCLUDED diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/TwGraph.h b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/TwGraph.h new file mode 100644 index 00000000..e16f2056 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/TwGraph.h @@ -0,0 +1,54 @@ +// --------------------------------------------------------------------------- +// +// @file TwGraph.h +// @brief ITwGraph pure interface +// @author Philippe Decaudin - http://www.antisphere.com +// @license This file is part of the AntTweakBar library. +// Copyright © 2005, 2006 Philippe Decaudin. +// For conditions of distribution and use, see License.txt +// +// notes: Private header +// TAB=4 +// +// --------------------------------------------------------------------------- + + +#if !defined ANT_TW_GRAPH_INCLUDED +#define ANT_TW_GRAPH_INCLUDED + +#include "TwColors.h" +#include "TwFonts.h" + + +// --------------------------------------------------------------------------- + +#ifdef DrawText // DirectX redefines 'DrawText' !! +# undef DrawText +#endif // DrawText + +class ITwGraph +{ +public: + virtual int Init() = 0; + virtual int Shut() = 0; + virtual void BeginDraw(int _WndWidth, int _WndHeight) = 0; + virtual void EndDraw() = 0; + virtual bool IsDrawing() = 0; + virtual void Restore() = 0; + virtual void DrawLine(int _X0, int _Y0, int _X1, int _Y1, color32 _Color0, color32 _Color1, bool _AntiAliased=false) = 0; + virtual void DrawLine(int _X0, int _Y0, int _X1, int _Y1, color32 _Color, bool _AntiAliased=false) = 0; + + virtual void DrawRect(int _X0, int _Y0, int _X1, int _Y1, color32 _Color00, color32 _Color10, color32 _Color01, color32 _Color11) = 0; + virtual void DrawRect(int _X0, int _Y0, int _X1, int _Y1, color32 _Color) = 0; + + virtual void * NewTextObj() = 0; + virtual void DeleteTextObj(void *_TextObj) = 0; + virtual void BuildText(void *_TextObj, const std::string *_TextLines, color32 *_LineColors, color32 *_LineBgColors, int _NbLines, const CTexFont *_Font, int _Sep, int _BgWidth) = 0; + virtual void DrawText(void *_TextObj, int _X, int _Y, color32 _Color, color32 _BgColor) = 0; + + virtual ~ITwGraph() {} // required by gcc +}; + +// --------------------------------------------------------------------------- + +#endif // ANT_TW_GRAPH_INCLUDED diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/TwMgr.cpp b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/TwMgr.cpp new file mode 100644 index 00000000..9f7980fe --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/TwMgr.cpp @@ -0,0 +1,3265 @@ +// --------------------------------------------------------------------------- +// +// @file TwMgr.cpp +// @author Philippe Decaudin - http://www.antisphere.com +// @license This file is part of the AntTweakBar library. +// Copyright © 2005, 2006 Philippe Decaudin. +// For conditions of distribution and use, see License.txt +// +// note: TAB=4 +// +// --------------------------------------------------------------------------- + + +#include "TwPrecomp.h" + +#include +#include "TwMgr.h" +#include "TwBar.h" +#include "TwFonts.h" +#include "TwOpenGL.h" +#ifdef ANT_WINDOWS +# include "TwDirect3D9.h" +# include "resource.h" +# ifdef _DEBUG +# include +# endif // _DEBUG +#endif // ANT_WINDOWS + +using namespace std; + + +CTwMgr *g_TwMgr = NULL; +bool g_BreakOnError = false; +TwErrorHandler g_ErrorHandler = NULL; +int g_TabLength = 4; +CTwBar * const TW_GLOBAL_BAR = (CTwBar *)(-1); +int g_InitWndWidth = -1; +int g_InitWndHeight = -1; + +extern const char *g_ErrUnknownAttrib; +extern const char *g_ErrNoValue; +extern const char *g_ErrBadValue; +const char *g_ErrInit = "Already initialized"; +const char *g_ErrShut = "Already shutdown"; +const char *g_ErrNotInit = "Not initialized"; +const char *g_ErrUnknownAPI = "Unsupported graph API"; +const char *g_ErrBadDevice = "Invalid graph device"; +const char *g_ErrBadParam = "Invalid parameter"; +const char *g_ErrExist = "Exists already"; +const char *g_ErrNotFound = "Not found"; +const char *g_ErrNthToDo = "Nothing to do"; +const char *g_ErrBadWndSize = "Bad window size"; +const char *g_ErrOffset = "Offset larger than StructSize"; +const char *g_ErrDelStruct = "Cannot delete a struct member"; +const char *g_ErrNoBackQuote= "Name cannot include back-quote"; +char g_ErrParse[512]; + +void ANT_CALL TwGlobalError(const char *_ErrorMessage); + +#if defined(_UNIX) +#define _stricmp strcasecmp +#define _strdup strdup +#endif + + +// --------------------------------------------------------------------------- + +// a static global object to verify that Tweakbar module has been properly terminated (in debug mode only) +#ifdef _DEBUG +static struct CTwVerif +{ + ~CTwVerif() + { + if( g_TwMgr!=NULL ) + g_TwMgr->SetLastError("Tweak bar module has not been terminated properly: call TwTerminate()\n"); + } +} s_Verif; +#endif // _DEBUG + +// --------------------------------------------------------------------------- + +void CColorExt::RGB2HLS() +{ + float fH = 0, fL = 0, fS = 0; + ColorRGBToHLSf((float)R/255.0f, (float)G/255.0f, (float)B/255.0f, &fH, &fL, &fS); + H = (int)fH; + if( H>=360 ) + H -= 360; + else if( H<0 ) + H += 360; + L = (int)(255.0f*fL + 0.5f); + if( L<0 ) + L = 0; + else if( L>255 ) + L = 255; + S = (int)(255.0f*fS + 0.5f); + if( S<0 ) + S = 0; + else if( S>255 ) + S = 255; +} + +void CColorExt::HLS2RGB() +{ + float fR = 0, fG = 0, fB = 0; + ColorHLSToRGBf((float)H, (float)L/255.0f, (float)S/255.0f, &fR, &fG, &fB); + R = (int)(255.0f*fR + 0.5f); + if( R<0 ) + R = 0; + else if( R>255 ) + R = 255; + G = (int)(255.0f*fG + 0.5f); + if( G<0 ) + G = 0; + else if( G>255 ) + G = 255; + B = (int)(255.0f*fB + 0.5f); + if( B<0 ) + B = 0; + else if( B>255 ) + B = 255; +} + +void ANT_CALL CColorExt::InitColor32CB(void *_ExtValue, void *_ClientData) +{ + CColorExt *ext = static_cast(_ExtValue); + if( ext ) + { + ext->m_IsColorF = false; + ext->R = 0; + ext->G = 0; + ext->B = 0; + ext->H = 0; + ext->L = 0; + ext->S = 0; + ext->A = 255; + ext->m_HLS = false; + ext->m_HasAlpha = false; + ext->m_CanHaveAlpha = true; + if( g_TwMgr && g_TwMgr->m_GraphAPI!=TW_OPENGL ) + ext->m_OGL = false; + else + ext->m_OGL = true; + ext->m_PrevConvertedColor = Color32FromARGBi(ext->A, ext->R, ext->G, ext->B); + ext->m_StructProxy = (CTwMgr::CStructProxy *)_ClientData; + } +} + +void ANT_CALL CColorExt::InitColor3FCB(void *_ExtValue, void *_ClientData) +{ + InitColor32CB(_ExtValue, _ClientData); + CColorExt *ext = static_cast(_ExtValue); + if( ext ) + { + ext->m_IsColorF = true; + ext->m_HasAlpha = false; + ext->m_CanHaveAlpha = false; + } +} + +void ANT_CALL CColorExt::InitColor4FCB(void *_ExtValue, void *_ClientData) +{ + InitColor32CB(_ExtValue, _ClientData); + CColorExt *ext = static_cast(_ExtValue); + if( ext ) + { + ext->m_IsColorF = true; + ext->m_HasAlpha = true; + ext->m_CanHaveAlpha = true; + } +} + +void ANT_CALL CColorExt::CopyVarFromExtCB(void *_VarValue, const void *_ExtValue, unsigned int _ExtMemberIndex, void *_ClientData) +{ + unsigned int *var32 = static_cast(_VarValue); + float *varF = static_cast(_VarValue); + CColorExt *ext = (CColorExt *)(_ExtValue); + CTwMgr::CMemberProxy *mProxy = static_cast(_ClientData); + if( _VarValue && ext ) + { + if( ext->m_HasAlpha && mProxy && mProxy->m_StructProxy && mProxy->m_StructProxy->m_Type==g_TwMgr->m_TypeColor3F ) + ext->m_HasAlpha = false; + + // Synchronize HLS and RGB + if( _ExtMemberIndex>=0 && _ExtMemberIndex<=2 ) + ext->RGB2HLS(); + else if( _ExtMemberIndex>=3 && _ExtMemberIndex<=5 ) + ext->HLS2RGB(); + else if( mProxy && _ExtMemberIndex==7 && mProxy->m_VarParent ) + { + assert( mProxy->m_VarParent->m_Vars.size()==8 ); + if( mProxy->m_VarParent->m_Vars[0]->m_Visible != !ext->m_HLS + || mProxy->m_VarParent->m_Vars[1]->m_Visible != !ext->m_HLS + || mProxy->m_VarParent->m_Vars[2]->m_Visible != !ext->m_HLS + || mProxy->m_VarParent->m_Vars[3]->m_Visible != ext->m_HLS + || mProxy->m_VarParent->m_Vars[4]->m_Visible != ext->m_HLS + || mProxy->m_VarParent->m_Vars[5]->m_Visible != ext->m_HLS ) + { + mProxy->m_VarParent->m_Vars[0]->m_Visible = !ext->m_HLS; + mProxy->m_VarParent->m_Vars[1]->m_Visible = !ext->m_HLS; + mProxy->m_VarParent->m_Vars[2]->m_Visible = !ext->m_HLS; + mProxy->m_VarParent->m_Vars[3]->m_Visible = ext->m_HLS; + mProxy->m_VarParent->m_Vars[4]->m_Visible = ext->m_HLS; + mProxy->m_VarParent->m_Vars[5]->m_Visible = ext->m_HLS; + mProxy->m_Bar->NotUpToDate(); + } + if( mProxy->m_VarParent->m_Vars[6]->m_Visible != ext->m_HasAlpha ) + { + mProxy->m_VarParent->m_Vars[6]->m_Visible = ext->m_HasAlpha; + mProxy->m_Bar->NotUpToDate(); + } + if( static_cast(mProxy->m_VarParent->m_Vars[7])->m_ReadOnly ) + { + static_cast(mProxy->m_VarParent->m_Vars[7])->m_ReadOnly = false; + mProxy->m_Bar->NotUpToDate(); + } + } + // Convert to color32 + color32 col = Color32FromARGBi((ext->m_HasAlpha ? ext->A : 255), ext->R, ext->G, ext->B); + if( ext->m_OGL && !ext->m_IsColorF ) + col = (col&0xff00ff00) | (unsigned char)(col>>16) | (((unsigned char)(col))<<16); + if( ext->m_IsColorF ) + Color32ToARGBf(col, (ext->m_HasAlpha ? varF+3 : NULL), varF+0, varF+1, varF+2); + else + { + if( ext->m_HasAlpha ) + *var32 = col; + else + *var32 = ((*var32)&0xff000000) | (col&0x00ffffff); + } + ext->m_PrevConvertedColor = col; + } +} + +void ANT_CALL CColorExt::CopyVarToExtCB(const void *_VarValue, void *_ExtValue, unsigned int _ExtMemberIndex, void *_ClientData) +{ + const unsigned int *var32 = static_cast(_VarValue); + const float *varF = static_cast(_VarValue); + CColorExt *ext = static_cast(_ExtValue); + CTwMgr::CMemberProxy *mProxy = static_cast(_ClientData); + if( _VarValue && ext ) + { + if( ext->m_HasAlpha && mProxy && mProxy->m_StructProxy && mProxy->m_StructProxy->m_Type==g_TwMgr->m_TypeColor3F ) + ext->m_HasAlpha = false; + + if( mProxy && _ExtMemberIndex==7 && mProxy->m_VarParent ) + { + assert( mProxy->m_VarParent->m_Vars.size()==8 ); + if( mProxy->m_VarParent->m_Vars[0]->m_Visible != !ext->m_HLS + || mProxy->m_VarParent->m_Vars[1]->m_Visible != !ext->m_HLS + || mProxy->m_VarParent->m_Vars[2]->m_Visible != !ext->m_HLS + || mProxy->m_VarParent->m_Vars[3]->m_Visible != ext->m_HLS + || mProxy->m_VarParent->m_Vars[4]->m_Visible != ext->m_HLS + || mProxy->m_VarParent->m_Vars[5]->m_Visible != ext->m_HLS ) + { + mProxy->m_VarParent->m_Vars[0]->m_Visible = !ext->m_HLS; + mProxy->m_VarParent->m_Vars[1]->m_Visible = !ext->m_HLS; + mProxy->m_VarParent->m_Vars[2]->m_Visible = !ext->m_HLS; + mProxy->m_VarParent->m_Vars[3]->m_Visible = ext->m_HLS; + mProxy->m_VarParent->m_Vars[4]->m_Visible = ext->m_HLS; + mProxy->m_VarParent->m_Vars[5]->m_Visible = ext->m_HLS; + mProxy->m_Bar->NotUpToDate(); + } + if( mProxy->m_VarParent->m_Vars[6]->m_Visible != ext->m_HasAlpha ) + { + mProxy->m_VarParent->m_Vars[6]->m_Visible = ext->m_HasAlpha; + mProxy->m_Bar->NotUpToDate(); + } + if( static_cast(mProxy->m_VarParent->m_Vars[7])->m_ReadOnly ) + { + static_cast(mProxy->m_VarParent->m_Vars[7])->m_ReadOnly = false; + mProxy->m_Bar->NotUpToDate(); + } + } + color32 col; + if( ext->m_IsColorF ) + col = Color32FromARGBf((ext->m_HasAlpha ? varF[3] : 1), varF[0], varF[1], varF[2]); + else + col = *var32; + if( ext->m_OGL && !ext->m_IsColorF ) + col = (col&0xff00ff00) | (unsigned char)(col>>16) | (((unsigned char)(col))<<16); + Color32ToARGBi(col, (ext->m_HasAlpha ? &ext->A : NULL), &ext->R, &ext->G, &ext->B); + if( (col & 0x00ffffff)!=(ext->m_PrevConvertedColor & 0x00ffffff) ) + ext->RGB2HLS(); + ext->m_PrevConvertedColor = col; + } +} + +void ANT_CALL CColorExt::SummaryCB(char *_SummaryString, size_t /*_SummaryMaxLength*/, const void *_ExtValue, void * /*_ClientData*/) +{ + // copy var + CColorExt *ext = (CColorExt *)(_ExtValue); + if( ext && ext->m_StructProxy && ext->m_StructProxy->m_StructData ) + { + if( ext->m_StructProxy->m_StructGetCallback ) + ext->m_StructProxy->m_StructGetCallback(ext->m_StructProxy->m_StructData, ext->m_StructProxy->m_StructClientData); + //if( *(unsigned int *)(ext->m_StructProxy->m_StructData)!=ext->m_PrevConvertedColor ) + CopyVarToExtCB(ext->m_StructProxy->m_StructData, ext, 99, NULL); + } + + //unsigned int col = 0; + //CopyVar32FromExtCB(&col, _ExtValue, 99, _ClientData); + //_snprintf(_SummaryString, _SummaryMaxLength, "0x%.8X", col); + //(void) _SummaryMaxLength, _ExtValue, _ClientData; + _SummaryString[0] = ' '; // required to force background color for this value + _SummaryString[1] = '\0'; +} + +void CColorExt::CreateTypes() +{ + if( g_TwMgr==NULL ) + return; + TwStructMember ColorExtMembers[] = { { "Red", TW_TYPE_INT32, offsetof(CColorExt, R), "min=0 max=255" }, + { "Green", TW_TYPE_INT32, offsetof(CColorExt, G), "min=0 max=255" }, + { "Blue", TW_TYPE_INT32, offsetof(CColorExt, B), "min=0 max=255" }, + { "Hue", TW_TYPE_INT32, offsetof(CColorExt, H), "hide min=0 max=359" }, + { "Lightness", TW_TYPE_INT32, offsetof(CColorExt, L), "hide min=0 max=255" }, + { "Saturation", TW_TYPE_INT32, offsetof(CColorExt, S), "hide min=0 max=255" }, + { "Alpha", TW_TYPE_INT32, offsetof(CColorExt, A), "hide min=0 max=255" }, + { "Mode", TW_TYPE_BOOLCPP, offsetof(CColorExt, m_HLS), "true='HLS' false='RGB' readwrite" } }; + g_TwMgr->m_TypeColor32 = TwDefineStructExt("COLOR32", ColorExtMembers, 8, sizeof(unsigned int), sizeof(CColorExt), CColorExt::InitColor32CB, CColorExt::CopyVarFromExtCB, CColorExt::CopyVarToExtCB, CColorExt::SummaryCB, CTwMgr::CStruct::s_PassProxyAsClientData); + g_TwMgr->m_TypeColor3F = TwDefineStructExt("COLOR3F", ColorExtMembers, 8, 3*sizeof(float), sizeof(CColorExt), CColorExt::InitColor3FCB, CColorExt::CopyVarFromExtCB, CColorExt::CopyVarToExtCB, CColorExt::SummaryCB, CTwMgr::CStruct::s_PassProxyAsClientData); + g_TwMgr->m_TypeColor4F = TwDefineStructExt("COLOR4F", ColorExtMembers, 8, 4*sizeof(float), sizeof(CColorExt), CColorExt::InitColor4FCB, CColorExt::CopyVarFromExtCB, CColorExt::CopyVarToExtCB, CColorExt::SummaryCB, CTwMgr::CStruct::s_PassProxyAsClientData); +} + + +// --------------------------------------------------------------------------- + +static int TwCreateGraph(ETwGraphAPI _GraphAPI) +{ + assert( g_TwMgr!=NULL && g_TwMgr->m_Graph==NULL ); + + switch( _GraphAPI ) + { + case TW_OPENGL: + g_TwMgr->m_Graph = new CTwGraphOpenGL; + break; + case TW_DIRECT3D9: + #ifdef ANT_WINDOWS + if( g_TwMgr->m_Device!=NULL ) + g_TwMgr->m_Graph = new CTwGraphDirect3D9; + else + { + g_TwMgr->SetLastError(g_ErrBadDevice); + return 0; + } + #endif // ANT_WINDOWS + break; + } + + if( g_TwMgr->m_Graph==NULL ) + { + g_TwMgr->SetLastError(g_ErrUnknownAPI); + return 0; + } + else + return g_TwMgr->m_Graph->Init(); +} + +// --------------------------------------------------------------------------- + +int ANT_CALL TwInit(ETwGraphAPI _GraphAPI, void *_Device) +{ +#if defined(_DEBUG) && defined(ANT_WINDOWS) + _CrtSetDbgFlag(_CRTDBG_LEAK_CHECK_DF|_CrtSetDbgFlag(_CRTDBG_LEAK_CHECK_DF)); +#endif + + if( g_TwMgr!=NULL ) + { + g_TwMgr->SetLastError(g_ErrInit); + return 0; + } + + g_TwMgr = new CTwMgr(_GraphAPI, _Device); + + TwGenerateDefaultFonts(); + g_TwMgr->m_CurrentFont = g_DefaultNormalFont; + + int Res = TwCreateGraph(_GraphAPI); + + if( Res ) + { + g_TwMgr->m_KeyPressedTextObj = g_TwMgr->m_Graph->NewTextObj(); + g_TwMgr->m_InfoTextObj = g_TwMgr->m_Graph->NewTextObj(); + + g_TwMgr->m_HelpBar = TwNewBar("TW_HELP"); + if( g_TwMgr->m_HelpBar ) + { + g_TwMgr->m_HelpBar->m_Label = "~ Help & Shortcuts ~"; + g_TwMgr->m_HelpBar->m_PosX = 32; + g_TwMgr->m_HelpBar->m_PosY = 32; + g_TwMgr->m_HelpBar->m_Width = 400; + g_TwMgr->m_HelpBar->m_Height = 200; + g_TwMgr->m_HelpBar->m_ValuesWidth = 12*(g_TwMgr->m_HelpBar->m_Font->m_CharHeight/2); + g_TwMgr->m_HelpBar->m_Color = 0xd7ffffff; + g_TwMgr->m_HelpBar->m_IsHelpBar = true; + g_TwMgr->Minimize(g_TwMgr->m_HelpBar); + } + else + { + TwTerminate(); + Res = 0; + } + } + + if( Res ) + CColorExt::CreateTypes(); + + return Res; +} + +// --------------------------------------------------------------------------- + +int ANT_CALL TwTerminate() +{ + if( g_TwMgr==NULL ) + { + //TwGlobalError(g_ErrShut); -> not an error + return 0; // already shutdown + } + + TwDeleteAllBars(); + if( g_TwMgr->m_CursorsCreated ) + g_TwMgr->FreeCursors(); + + int Res = 1; + if( g_TwMgr->m_Graph ) + { + if( g_TwMgr->m_KeyPressedTextObj ) + { + g_TwMgr->m_Graph->DeleteTextObj(g_TwMgr->m_KeyPressedTextObj); + g_TwMgr->m_KeyPressedTextObj = NULL; + } + if( g_TwMgr->m_InfoTextObj ) + { + g_TwMgr->m_Graph->DeleteTextObj(g_TwMgr->m_InfoTextObj); + g_TwMgr->m_InfoTextObj = NULL; + } + Res = g_TwMgr->m_Graph->Shut(); + delete g_TwMgr->m_Graph; + g_TwMgr->m_Graph = NULL; + } + + TwDeleteDefaultFonts(); + + delete g_TwMgr; + g_TwMgr = NULL; + + return Res; +} + +// --------------------------------------------------------------------------- + +int ANT_CALL TwDraw() +{ + PERF( PerfTimer Timer; double DT; ) + //CTwFPU fpu; // fpu precision only forced in update (do not modif dx draw calls) + + if( g_TwMgr==NULL || g_TwMgr->m_Graph==NULL ) + { + TwGlobalError(g_ErrNotInit); + return 0; // not initialized + } + + assert(g_TwMgr->m_Bars.size()==g_TwMgr->m_Order.size()); + + // Create cursors + #if defined(ANT_WINDOWS) + if( !g_TwMgr->m_CursorsCreated ) + g_TwMgr->CreateCursors(); + #elif defined(ANT_UNIX) + if( !g_TwMgr->m_CurrentXDisplay ) + g_TwMgr->m_CurrentXDisplay = glXGetCurrentDisplay(); + if( !g_TwMgr->m_CurrentXWindow ) + g_TwMgr->m_CurrentXWindow = glXGetCurrentDrawable(); + if( g_TwMgr->m_CurrentXDisplay && !g_TwMgr->m_CursorsCreated ) + g_TwMgr->CreateCursors(); + #endif // defined(ANT_UNIX) + + // Autorepeat TW_MOUSE_PRESSED + double RepeatDT = g_TwMgr->m_Timer.GetTime() - g_TwMgr->m_LastMousePressedTime; + if( fabs(RepeatDT)>2.0*g_TwMgr->m_RepeatMousePressedDelay + || abs(g_TwMgr->m_LastMousePressedPosition[0]-g_TwMgr->m_LastMouseX)>4 + || abs(g_TwMgr->m_LastMousePressedPosition[1]-g_TwMgr->m_LastMouseY)>4 ) + { + g_TwMgr->m_CanRepeatMousePressed = false; + g_TwMgr->m_IsRepeatingMousePressed = false; + } + if( g_TwMgr->m_CanRepeatMousePressed ) + { + if( (!g_TwMgr->m_IsRepeatingMousePressed && RepeatDT>g_TwMgr->m_RepeatMousePressedDelay) + || (g_TwMgr->m_IsRepeatingMousePressed && RepeatDT>g_TwMgr->m_RepeatMousePressedPeriod) ) + { + g_TwMgr->m_IsRepeatingMousePressed = true; + g_TwMgr->m_LastMousePressedTime = g_TwMgr->m_Timer.GetTime(); + TwMouseButton(TW_MOUSE_PRESSED, g_TwMgr->m_LastMousePressedButtonID); + } + } + + + if( g_TwMgr->m_WndWidth<0 || g_TwMgr->m_WndHeight<0 ) + { + g_TwMgr->SetLastError(g_ErrBadWndSize); + return 0; + } + else if( g_TwMgr->m_WndWidth==0 || g_TwMgr->m_WndHeight==0 ) // probably iconified + return 1; // nothing to do + + // count number of bars to draw + size_t i, idx; + int Nb = 0; + for( i=0; im_Bars.size(); ++i ) + if( g_TwMgr->m_Bars[i]!=NULL && g_TwMgr->m_Bars[i]->m_Visible ) + ++Nb; + + if( Nb>0 ) + { + PERF( Timer.Reset(); ) + g_TwMgr->m_Graph->BeginDraw(g_TwMgr->m_WndWidth, g_TwMgr->m_WndHeight); + PERF( DT = Timer.GetTime(); printf("\nBegin=%.4fms ", 1000.0*DT); ) + + PERF( Timer.Reset(); ) + for( i=0; im_Bars.size(); ++i ) + { + idx = g_TwMgr->m_Order[i]; + if( g_TwMgr->m_Bars[idx]->m_Visible ) + { + g_TwMgr->m_Bars[idx]->Draw(); + } + } + PERF( DT = Timer.GetTime(); printf("Draw=%.4fms ", 1000.0*DT); ) + + PERF( Timer.Reset(); ) + g_TwMgr->m_Graph->EndDraw(); + PERF( DT = Timer.GetTime(); printf("End=%.4fms\n", 1000.0*DT); ) + } + + return 1; +} + +// --------------------------------------------------------------------------- + +int ANT_CALL TwWindowSize(int _Width, int _Height) +{ + g_InitWndWidth = _Width; + g_InitWndHeight = _Height; + + if( g_TwMgr==NULL || g_TwMgr->m_Graph==NULL ) + { + //TwGlobalError(g_ErrNotInit); -> not an error here + return 0; // not initialized + } + + if( _Width<0 || _Height<0 ) + { + g_TwMgr->SetLastError(g_ErrBadWndSize); + return 0; + } + + g_TwMgr->m_WndWidth = _Width; + g_TwMgr->m_WndHeight = _Height; + g_TwMgr->m_Graph->Restore(); + for( std::vector::iterator it=g_TwMgr->m_Bars.begin(); it!=g_TwMgr->m_Bars.end(); ++it ) + (*it)->NotUpToDate(); + return 1; +} + +// --------------------------------------------------------------------------- + +CTwMgr::CTwMgr(ETwGraphAPI _GraphAPI, void *_Device) +{ + m_GraphAPI = _GraphAPI; + m_Device = _Device; + m_LastError = NULL; + m_CurrentDbgFile = ""; + m_CurrentDbgLine = 0; + m_Graph = NULL; + m_WndWidth = g_InitWndWidth; + m_WndHeight = g_InitWndHeight; + m_CurrentFont = NULL; // set after by TwIntialize + m_NbMinimizedBars = 0; + m_HelpBar = NULL; + m_HelpBarNotUpToDate = true; + m_HelpBarUpdateNow = false; + m_LastHelpUpdateTime = 0; + m_LastMouseX = -1; + m_LastMouseY = -1; + m_LastMouseWheelPos = 0; + m_KeyPressedTextObj = NULL; + m_KeyPressedBuildText = false; + m_KeyPressedTime = 0; + m_InfoTextObj = NULL; + m_InfoBuildText = true; + m_BarInitColorHue = 155; + m_PopupBar = NULL; + m_TypeColor32 = TW_TYPE_UNDEF; + m_TypeColor3F = TW_TYPE_UNDEF; + m_TypeColor4F = TW_TYPE_UNDEF; + m_LastMousePressedTime = 0; + m_LastMousePressedButtonID = TW_MOUSE_MIDDLE; + m_LastMousePressedPosition[0] = -1000; + m_LastMousePressedPosition[1] = -1000; + m_RepeatMousePressedDelay = 0.5; + m_RepeatMousePressedPeriod = 0.1; + m_CanRepeatMousePressed = false; + m_IsRepeatingMousePressed = false; + + m_CursorsCreated = false; + #if defined(ANT_UNIX) + m_CurrentXDisplay = NULL; + m_CurrentXWindow = 0; + #endif // defined(ANT_UNIX) +} + +// --------------------------------------------------------------------------- + +CTwMgr::~CTwMgr() +{ +} + +// --------------------------------------------------------------------------- + +int CTwMgr::FindBar(const char *_Name) const +{ + if( _Name==NULL || strlen(_Name)<=0 ) + return -1; + int i; + for( i=0; i<(int)m_Bars.size(); ++i ) + if( m_Bars[i]!=NULL && strcmp(_Name, m_Bars[i]->m_Name.c_str())==0 ) + return i; + return -1; +} + + +// --------------------------------------------------------------------------- + +enum EMgrAttribs +{ + MGR_HELP = 1, +}; + +int CTwMgr::HasAttrib(const char *_Attrib, bool *_HasValue) const +{ + *_HasValue = true; + if( _stricmp(_Attrib, "help")==0 ) + return MGR_HELP; + + *_HasValue = false; + return 0; // not found +} + +int CTwMgr::SetAttrib(int _AttribID, const char *_Value) +{ + switch( _AttribID ) + { + case MGR_HELP: + if( _Value && strlen(_Value)>0 ) + { + m_Help = _Value; + m_HelpBarNotUpToDate = true; + return 1; + } + else + { + g_TwMgr->SetLastError(g_ErrNoValue); + return 0; + } + default: + g_TwMgr->SetLastError(g_ErrUnknownAttrib); + return 0; + } +} + +// --------------------------------------------------------------------------- + +void CTwMgr::Minimize(TwBar *_Bar) +{ + assert(m_Graph!=NULL && _Bar!=NULL); + assert(m_Bars.size()==m_MinOccupied.size()); + if( _Bar->m_IsMinimized ) + return; + size_t i = m_NbMinimizedBars; + m_NbMinimizedBars++; + for( i=0; im_MinNumber = (int)i; + _Bar->m_IsMinimized = true; + _Bar->NotUpToDate(); +} + +// --------------------------------------------------------------------------- + +void CTwMgr::Maximize(TwBar *_Bar) +{ + assert(m_Graph!=NULL && _Bar!=NULL); + assert(m_Bars.size()==m_MinOccupied.size()); + if( !_Bar->m_IsMinimized ) + return; + --m_NbMinimizedBars; + if( m_NbMinimizedBars<0 ) + m_NbMinimizedBars = 0; + if( _Bar->m_MinNumber>=0 && _Bar->m_MinNumber<(int)m_MinOccupied.size() ) + m_MinOccupied[_Bar->m_MinNumber] = false; + _Bar->m_IsMinimized = false; + _Bar->NotUpToDate(); + if( _Bar->m_IsHelpBar ) + m_HelpBarNotUpToDate = true; +} + +// --------------------------------------------------------------------------- + +void CTwMgr::Hide(TwBar *_Bar) +{ + assert(m_Graph!=NULL && _Bar!=NULL); + if( !_Bar->m_Visible ) + return; + _Bar->m_Visible = false; + if( !_Bar->m_IsHelpBar ) + m_HelpBarNotUpToDate = true; +} + +// --------------------------------------------------------------------------- + +void CTwMgr::Unhide(TwBar *_Bar) +{ + assert(m_Graph!=NULL && _Bar!=NULL); + if( _Bar->m_Visible ) + return; + _Bar->m_Visible = true; + _Bar->NotUpToDate(); + if( !_Bar->m_IsHelpBar ) + m_HelpBarNotUpToDate = true; +} + +// --------------------------------------------------------------------------- + +void CTwMgr::SetFont(const CTexFont *_Font, bool _ResizeBars) +{ + assert(m_Graph!=NULL); + assert(_Font!=NULL); + + m_CurrentFont = _Font; + + for( int i=0; i<(int)m_Bars.size(); ++i ) + if( m_Bars[i]!=NULL ) + { + int fh = m_Bars[i]->m_Font->m_CharHeight; + m_Bars[i]->m_Font = _Font; + if( _ResizeBars ) + { + m_Bars[i]->m_PosX += (3*(fh-_Font->m_CharHeight))/2; + m_Bars[i]->m_PosY += (fh-_Font->m_CharHeight)/2; + m_Bars[i]->m_Width = (m_Bars[i]->m_Width*_Font->m_CharHeight)/fh; + m_Bars[i]->m_Height = (m_Bars[i]->m_Height*_Font->m_CharHeight)/fh; + m_Bars[i]->m_ValuesWidth = (m_Bars[i]->m_ValuesWidth*_Font->m_CharHeight)/fh; + } + m_Bars[i]->NotUpToDate(); + } + + if( g_TwMgr->m_HelpBar!=NULL ) + g_TwMgr->m_HelpBar->Update(); + g_TwMgr->m_InfoBuildText = true; + g_TwMgr->m_KeyPressedBuildText = true; + m_HelpBarNotUpToDate = true; +} + +// --------------------------------------------------------------------------- + +void ANT_CALL TwGlobalError(const char *_ErrorMessage) // to be called when g_TwMgr is not created +{ + if( g_ErrorHandler==NULL ) + { + fprintf(stderr, "ERROR(AntTweakBar) >> %s\n", _ErrorMessage); + #ifdef ANT_WINDOWS + OutputDebugString("ERROR(AntTweakBar) >> "); + OutputDebugString(_ErrorMessage); + OutputDebugString("\n"); + #endif // ANT_WINDOWS + } + else + g_ErrorHandler(_ErrorMessage); + + if( g_BreakOnError ) + abort(); +} + +// --------------------------------------------------------------------------- + +void CTwMgr::SetLastError(const char *_ErrorMessage) // _ErrorMessage must be a static string +{ + m_LastError = _ErrorMessage; + + if( g_ErrorHandler==NULL ) + { + if( m_CurrentDbgFile!=NULL && strlen(m_CurrentDbgFile)>0 && m_CurrentDbgLine>0 ) + fprintf(stderr, "%s(%d): ", m_CurrentDbgFile, m_CurrentDbgLine); + fprintf(stderr, "ERROR(AntTweakBar) >> %s\n", m_LastError); + #ifdef ANT_WINDOWS + if( m_CurrentDbgFile!=NULL && strlen(m_CurrentDbgFile)>0 && m_CurrentDbgLine>0 ) + { + OutputDebugString(m_CurrentDbgFile); + char sl[32]; + sprintf(sl, "(%d): ", m_CurrentDbgLine); + OutputDebugString(sl); + } + OutputDebugString("ERROR(AntTweakBar) >> "); + OutputDebugString(m_LastError); + OutputDebugString("\n"); + #endif // ANT_WINDOWS + } + else + g_ErrorHandler(_ErrorMessage); + + if( g_BreakOnError ) + abort(); +} + +// --------------------------------------------------------------------------- + +const char *CTwMgr::GetLastError() +{ + const char *Err = m_LastError; + m_LastError = NULL; + return Err; +} + +// --------------------------------------------------------------------------- + +const char *CTwMgr::CheckLastError() const +{ + return m_LastError; +} + +// --------------------------------------------------------------------------- + +void CTwMgr::SetCurrentDbgParams(const char *dbgFile, int dbgLine) +{ + m_CurrentDbgFile = dbgFile; + m_CurrentDbgLine = dbgLine; +} + +// --------------------------------------------------------------------------- + +int ANT_CALL __TwDbg(const char *dbgFile, int dbgLine) +{ + if( g_TwMgr!=NULL ) + g_TwMgr->SetCurrentDbgParams(dbgFile, dbgLine); + return 0; // always returns zero +} + +// --------------------------------------------------------------------------- + +void ANT_CALL TwHandleErrors(TwErrorHandler _ErrorHandler, int _BreakOnError) +{ + g_ErrorHandler = _ErrorHandler; + g_BreakOnError = (_BreakOnError) ? true : false; +} + +// --------------------------------------------------------------------------- + +const char *ANT_CALL TwGetLastError() +{ + if( g_TwMgr==NULL ) + { + TwGlobalError(g_ErrNotInit); + return g_ErrNotInit; + } + else + return g_TwMgr->GetLastError(); +} + +// --------------------------------------------------------------------------- + +TwBar *ANT_CALL TwNewBar(const char *_Name) +{ + if( g_TwMgr==NULL || g_TwMgr->m_Graph==NULL ) + { + TwGlobalError(g_ErrNotInit); + return NULL; // not initialized + } + + if( _Name==NULL || strlen(_Name)<=0 ) + { + g_TwMgr->SetLastError(g_ErrBadParam); + return NULL; + } + if( g_TwMgr->FindBar(_Name)>=0 ) + { + g_TwMgr->SetLastError(g_ErrExist); + return NULL; + } + + if( strstr(_Name, "`")!=NULL ) + { + g_TwMgr->SetLastError(g_ErrNoBackQuote); + return NULL; + } + + if( g_TwMgr->m_PopupBar!=NULL ) // delete popup bar if it exists + { + TwDeleteBar(g_TwMgr->m_PopupBar); + g_TwMgr->m_PopupBar = NULL; + } + + TwBar *Bar = new CTwBar(_Name); + g_TwMgr->m_Bars.push_back(Bar); + g_TwMgr->m_Order.push_back((int)g_TwMgr->m_Bars.size()-1); + g_TwMgr->m_MinOccupied.push_back(false); + g_TwMgr->m_HelpBarNotUpToDate = true; + + return Bar; +} + +// --------------------------------------------------------------------------- + +int ANT_CALL TwDeleteBar(TwBar *_Bar) +{ + if( g_TwMgr==NULL ) + { + TwGlobalError(g_ErrNotInit); + return 0; // not initialized + } + if( _Bar==NULL ) + { + g_TwMgr->SetLastError(g_ErrBadParam); + return 0; + } + vector::iterator BarIt; + int i = 0; + for( BarIt=g_TwMgr->m_Bars.begin(); BarIt!=g_TwMgr->m_Bars.end(); ++BarIt, ++i ) + if( (*BarIt)==_Bar ) + break; + if( BarIt==g_TwMgr->m_Bars.end() ) + { + g_TwMgr->SetLastError(g_ErrNotFound); + return 0; + } + + if( g_TwMgr->m_PopupBar!=NULL && _Bar!=g_TwMgr->m_PopupBar ) // delete popup bar first if it exists + { + TwDeleteBar(g_TwMgr->m_PopupBar); + g_TwMgr->m_PopupBar = NULL; + } + + // force bar to un-minimize + g_TwMgr->Maximize(_Bar); + // find an empty MinOccupied + vector::iterator itm; + int j = 0; + for( itm=g_TwMgr->m_MinOccupied.begin(); itm!=g_TwMgr->m_MinOccupied.end(); ++itm, ++j) + if( (*itm)==false ) + break; + assert( itm!=g_TwMgr->m_MinOccupied.end() ); + // shift MinNumbers and erase the empty MinOccupied + for( size_t k=0; km_Bars.size(); ++k ) + if( g_TwMgr->m_Bars[k]!=NULL && g_TwMgr->m_Bars[k]->m_MinNumber>j ) + g_TwMgr->m_Bars[k]->m_MinNumber -= 1; + g_TwMgr->m_MinOccupied.erase(itm); + // erase _Bar order + vector::iterator BarOrderIt = g_TwMgr->m_Order.end(); + for(vector::iterator it=g_TwMgr->m_Order.begin(); it!=g_TwMgr->m_Order.end(); ++it ) + if( (*it)==i ) + BarOrderIt = it; + else if( (*it)>i ) + (*it) -= 1; + assert( BarOrderIt!=g_TwMgr->m_Order.end() ); + g_TwMgr->m_Order.erase(BarOrderIt); + + // erase & delete _Bar + g_TwMgr->m_Bars.erase(BarIt); + delete _Bar; + + g_TwMgr->m_HelpBarNotUpToDate = true; + return 1; +} + +// --------------------------------------------------------------------------- + +int ANT_CALL TwDeleteAllBars() +{ + if( g_TwMgr==NULL ) + { + TwGlobalError(g_ErrNotInit); + return 0; // not initialized + } + + int n = 0; + for( size_t i=0; im_Bars.size(); ++i ) + if( g_TwMgr->m_Bars[i]!=NULL ) + { + ++n; + delete g_TwMgr->m_Bars[i]; + g_TwMgr->m_Bars[i] = NULL; + } + g_TwMgr->m_Bars.clear(); + g_TwMgr->m_Order.clear(); + g_TwMgr->m_MinOccupied.clear(); + g_TwMgr->m_HelpBarNotUpToDate = true; + + if( n==0 ) + { + g_TwMgr->SetLastError(g_ErrNthToDo); + return 0; + } + else + return 1; +} + +// --------------------------------------------------------------------------- + +int ANT_CALL TwSetTopBar(const TwBar *_Bar) +{ + if( g_TwMgr==NULL ) + { + TwGlobalError(g_ErrNotInit); + return 0; // not initialized + } + if( _Bar==NULL ) + { + g_TwMgr->SetLastError(g_ErrBadParam); + return 0; + } + + int i = -1, iOrder; + for( iOrder=0; iOrder<(int)g_TwMgr->m_Bars.size(); ++iOrder ) + { + i = g_TwMgr->m_Order[iOrder]; + assert( i>=0 && i<(int)g_TwMgr->m_Bars.size() ); + if( g_TwMgr->m_Bars[i]==_Bar ) + break; + } + if( i<0 || iOrder>=(int)g_TwMgr->m_Bars.size() ) // bar not found + { + g_TwMgr->SetLastError(g_ErrNotFound); + return 0; + } + + for( int j=iOrder; j<(int)g_TwMgr->m_Bars.size()-1; ++j ) + g_TwMgr->m_Order[j] = g_TwMgr->m_Order[j+1]; + g_TwMgr->m_Order[(int)g_TwMgr->m_Bars.size()-1] = i; + + if( g_TwMgr->m_PopupBar!=NULL && _Bar!=g_TwMgr->m_PopupBar ) + TwSetTopBar(g_TwMgr->m_PopupBar); + + return 1; +} + +// --------------------------------------------------------------------------- + +TwBar * ANT_CALL TwGetTopBar() +{ + if( g_TwMgr==NULL ) + { + TwGlobalError(g_ErrNotInit); + return NULL; // not initialized + } + + if( g_TwMgr->m_Bars.size()>0 && g_TwMgr->m_PopupBar==NULL ) + return g_TwMgr->m_Bars[g_TwMgr->m_Order[ g_TwMgr->m_Bars.size()-1 ]]; + else if( g_TwMgr->m_Bars.size()>1 && g_TwMgr->m_PopupBar!=NULL ) + return g_TwMgr->m_Bars[g_TwMgr->m_Order[ g_TwMgr->m_Bars.size()-2 ]]; + else + return NULL; +} + +// --------------------------------------------------------------------------- + +int ANT_CALL TwSetBarState(TwBar *_Bar, TwState _State) +{ + if( g_TwMgr==NULL ) + { + TwGlobalError(g_ErrNotInit); + return 0; // not initialized + } + if( _Bar==NULL ) + { + g_TwMgr->SetLastError(g_ErrBadParam); + return 0; + } + + switch( _State ) + { + case TW_STATE_SHOWN: + g_TwMgr->Unhide(_Bar); + return 1; + case TW_STATE_ICONIFIED: + g_TwMgr->Unhide(_Bar); + g_TwMgr->Minimize(_Bar); + return 1; + case TW_STATE_HIDDEN: + g_TwMgr->Maximize(_Bar); + g_TwMgr->Hide(_Bar); + return 1; + default: + g_TwMgr->SetLastError(g_ErrBadParam); + return 0; + } +} + +// --------------------------------------------------------------------------- + +TwState ANT_CALL TwGetBarState(const TwBar *_Bar) +{ + if( g_TwMgr==NULL ) + { + TwGlobalError(g_ErrNotInit); + return TW_STATE_ERROR; // not initialized + } + if( _Bar==NULL ) + { + g_TwMgr->SetLastError(g_ErrBadParam); + return TW_STATE_ERROR; + } + + if( !_Bar->m_Visible ) + return TW_STATE_HIDDEN; + else if( _Bar->IsMinimized() ) + return TW_STATE_ICONIFIED; + else + return TW_STATE_SHOWN; +} + +// --------------------------------------------------------------------------- + +const char * ANT_CALL TwGetBarName(TwBar *_Bar) +{ + if( g_TwMgr==NULL ) + { + TwGlobalError(g_ErrNotInit); + return NULL; // not initialized + } + if( _Bar==NULL ) + { + g_TwMgr->SetLastError(g_ErrBadParam); + return NULL; + } + + return _Bar->m_Name.c_str(); +} + +// --------------------------------------------------------------------------- + +static int s_PassProxy = 0; +void *CTwMgr::CStruct::s_PassProxyAsClientData = &s_PassProxy; // special tag + +CTwMgr::CStructProxy::CStructProxy() +{ + memset(this, 0, sizeof(*this)); +} + +CTwMgr::CStructProxy::~CStructProxy() +{ + if( m_StructData!=NULL && m_DeleteStructData ) + delete[] (char*)m_StructData; + if( m_StructExtData!=NULL ) + delete[] (char*)m_StructExtData; + memset(this, 0, sizeof(*this)); +} + +CTwMgr::CMemberProxy::CMemberProxy() +{ + memset(this, 0, sizeof(*this)); +} + +CTwMgr::CMemberProxy::~CMemberProxy() +{ + memset(this, 0, sizeof(*this)); +} + +void ANT_CALL CTwMgr::CMemberProxy::SetCB(const void *_Value, void *_ClientData) +{ + if( _ClientData && _Value ) + { + const CMemberProxy *mProxy = static_cast(_ClientData); + if( g_TwMgr && mProxy ) + { + const CStructProxy *sProxy = mProxy->m_StructProxy; + if( sProxy && sProxy->m_StructData && sProxy->m_Type>=TW_TYPE_STRUCT_BASE && sProxy->m_Typem_Structs.size() ) + { + CTwMgr::CStruct& s = g_TwMgr->m_Structs[sProxy->m_Type-TW_TYPE_STRUCT_BASE]; + if( mProxy->m_MemberIndex>=0 && mProxy->m_MemberIndex<(int)s.m_Members.size() ) + { + CTwMgr::CStructMember& m = s.m_Members[mProxy->m_MemberIndex]; + if( m.m_Size>0 && m.m_Type!=TW_TYPE_BUTTON ) + { + if( s.m_IsExt ) + { + memcpy((char *)sProxy->m_StructExtData + m.m_Offset, _Value, m.m_Size); + if( s.m_CopyVarFromExtCallback && sProxy->m_StructExtData ) + s.m_CopyVarFromExtCallback(sProxy->m_StructData, sProxy->m_StructExtData, mProxy->m_MemberIndex, (s.m_ExtClientData==s.s_PassProxyAsClientData) ? _ClientData : s.m_ExtClientData); + } + else + memcpy((char *)sProxy->m_StructData + m.m_Offset, _Value, m.m_Size); + if( sProxy->m_StructSetCallback ) + sProxy->m_StructSetCallback(sProxy->m_StructData, sProxy->m_StructClientData); + } + } + } + } + } +} + +void ANT_CALL CTwMgr::CMemberProxy::GetCB(void *_Value, void *_ClientData) +{ + if( _ClientData && _Value ) + { + const CMemberProxy *mProxy = static_cast(_ClientData); + if( g_TwMgr && mProxy ) + { + const CStructProxy *sProxy = mProxy->m_StructProxy; + if( sProxy && sProxy->m_StructData && sProxy->m_Type>=TW_TYPE_STRUCT_BASE && sProxy->m_Typem_Structs.size() ) + { + CTwMgr::CStruct& s = g_TwMgr->m_Structs[sProxy->m_Type-TW_TYPE_STRUCT_BASE]; + if( mProxy->m_MemberIndex>=0 && mProxy->m_MemberIndex<(int)s.m_Members.size() ) + { + CTwMgr::CStructMember& m = s.m_Members[mProxy->m_MemberIndex]; + if( m.m_Size>0 && m.m_Type!=TW_TYPE_BUTTON ) + { + if( sProxy->m_StructGetCallback ) + sProxy->m_StructGetCallback(sProxy->m_StructData, sProxy->m_StructClientData); + if( s.m_IsExt ) + { + if( s.m_CopyVarToExtCallback && sProxy->m_StructExtData ) + s.m_CopyVarToExtCallback(sProxy->m_StructData, sProxy->m_StructExtData, mProxy->m_MemberIndex, (s.m_ExtClientData==s.s_PassProxyAsClientData) ? _ClientData : s.m_ExtClientData); + memcpy(_Value, (char *)sProxy->m_StructExtData + m.m_Offset, m.m_Size); + } + else + memcpy(_Value, (char *)sProxy->m_StructData + m.m_Offset, m.m_Size); + } + } + } + } + } +} + +// --------------------------------------------------------------------------- + +static int AddVar(TwBar *_Bar, const char *_Name, ETwType _Type, void *_VarPtr, bool _ReadOnly, TwSetVarCallback _SetCallback, TwGetVarCallback _GetCallback, TwButtonCallback _ButtonCallback, void *_ClientData, const char *_Def) +{ + CTwFPU fpu; // force fpu precision + + if( g_TwMgr==NULL ) + { + TwGlobalError(g_ErrNotInit); + return 0; // not initialized + } + if( _Bar==NULL || _Name==NULL || strlen(_Name)==0 || (_VarPtr==NULL && _GetCallback==NULL && _Type!=TW_TYPE_BUTTON) ) + { + g_TwMgr->SetLastError(g_ErrBadParam); + return 0; + } + if( _Bar->Find(_Name)!=NULL ) + { + g_TwMgr->SetLastError(g_ErrExist); + return 0; + } + + if( strstr(_Name, "`")!=NULL ) + { + g_TwMgr->SetLastError(g_ErrNoBackQuote); + return 0; + } + + if( _VarPtr==NULL && _Type!=TW_TYPE_BUTTON && _GetCallback!=NULL && _SetCallback==NULL ) + _ReadOnly = true; // force readonly in this case + + // Convert color types + if( _Type==TW_TYPE_COLOR32 ) + _Type = g_TwMgr->m_TypeColor32; + else if( _Type==TW_TYPE_COLOR3F ) + _Type = g_TwMgr->m_TypeColor3F; + else if( _Type==TW_TYPE_COLOR4F ) + _Type = g_TwMgr->m_TypeColor4F; + + if( _Type=TW_TYPE_ENUM_BASE && _Typem_Enums.size()) ) + { + CTwVarAtom *Var = new CTwVarAtom; + Var->m_Name = _Name; + Var->m_Ptr = _VarPtr; + Var->m_Type = _Type; + if( _VarPtr!=NULL ) + { + assert( _GetCallback==NULL && _SetCallback==NULL && _ButtonCallback==NULL ); + + Var->m_ReadOnly = _ReadOnly; + Var->m_GetCallback = NULL; + Var->m_SetCallback = NULL; + Var->m_ButtonCallback = NULL; + Var->m_ClientData = NULL; + } + else + { + assert( _GetCallback!=NULL || _Type==TW_TYPE_BUTTON ); + + Var->m_GetCallback = _GetCallback; + Var->m_SetCallback = _SetCallback; + Var->m_ButtonCallback = _ButtonCallback; + Var->m_ClientData = _ClientData; + if( _Type!=TW_TYPE_BUTTON ) + Var->m_ReadOnly = (_SetCallback==NULL || _ReadOnly); + else + Var->m_ReadOnly = (_ButtonCallback==NULL); + } + Var->m_Color = _Bar->m_ColLabelText; + Var->SetDefaults(); + + _Bar->m_VarRoot.m_Vars.push_back(Var); + _Bar->NotUpToDate(); + g_TwMgr->m_HelpBarNotUpToDate = true; + + if( _Def!=NULL && strlen(_Def)>0 ) + { + string d = '`' + _Bar->m_Name + "`/`" + _Name + "` " + _Def; + return TwDefine(d.c_str()); + } + else + return 1; + } + else if(_Type>=TW_TYPE_STRUCT_BASE && _Typem_Structs.size()) + { + CTwMgr::CStruct& s = g_TwMgr->m_Structs[_Type-TW_TYPE_STRUCT_BASE]; + CTwMgr::CStructProxy *sProxy = NULL; + void *vPtr; + if( !s.m_IsExt ) + { + if( _VarPtr!=NULL ) + vPtr = _VarPtr; + else + { + assert( _GetCallback!=NULL || _SetCallback!=NULL ); + assert( s.m_Size>0 ); + vPtr = new char[s.m_Size]; + memset(vPtr, 0, s.m_Size); + // create a new StructProxy + g_TwMgr->m_StructProxies.push_back(CTwMgr::CStructProxy()); + sProxy = &(g_TwMgr->m_StructProxies.back()); + sProxy->m_Type = _Type; + sProxy->m_StructData = vPtr; + sProxy->m_DeleteStructData = true; + sProxy->m_StructSetCallback = _SetCallback; + sProxy->m_StructGetCallback = _GetCallback; + sProxy->m_StructClientData = _ClientData; + } + } + else // s.m_IsExt + { + assert( s.m_Size>0 && s.m_ClientStructSize>0 ); + vPtr = new char[s.m_Size]; // will be m_StructExtData + memset(vPtr, 0, s.m_Size); + // create a new StructProxy + g_TwMgr->m_StructProxies.push_back(CTwMgr::CStructProxy()); + sProxy = &(g_TwMgr->m_StructProxies.back()); + sProxy->m_Type = _Type; + sProxy->m_StructExtData = vPtr; + sProxy->m_StructSetCallback = _SetCallback; + sProxy->m_StructGetCallback = _GetCallback; + sProxy->m_StructClientData = _ClientData; + if( _VarPtr!=NULL ) + { + sProxy->m_StructData = _VarPtr; + sProxy->m_DeleteStructData = false; + } + else + { + sProxy->m_StructData = new char[s.m_ClientStructSize]; + memset(sProxy->m_StructData, 0, s.m_ClientStructSize); + sProxy->m_DeleteStructData = true; + } + _VarPtr = NULL; // force use of TwAddVarCB for members + + // init m_StructExtdata + if( s.m_ExtClientData==CTwMgr::CStruct::s_PassProxyAsClientData ) + s.m_StructExtInitCallback(sProxy->m_StructExtData, sProxy); + else + s.m_StructExtInitCallback(sProxy->m_StructExtData, s.m_ExtClientData); + } + for( int i=0; i<(int)s.m_Members.size(); ++i ) + { + CTwMgr::CStructMember& m = s.m_Members[i]; + string name = string(_Name) + '.' + m.m_Name; + const char *access = ""; + if( _ReadOnly ) + access = "readonly "; + string def = "label=`" + m.m_Name + "` group=`" + _Name + "` " + access; // + m.m_DefString; // member def must be done after group def + if( _VarPtr!=NULL ) + { + if( TwAddVarRW(_Bar, name.c_str(), m.m_Type, (char*)vPtr+m.m_Offset, def.c_str())==0 ) + return 0; + } + else + { + assert( sProxy!=NULL ); + // create a new MemberProxy + g_TwMgr->m_MemberProxies.push_back(CTwMgr::CMemberProxy()); + CTwMgr::CMemberProxy& mProxy = g_TwMgr->m_MemberProxies.back(); + mProxy.m_StructProxy = sProxy; + mProxy.m_MemberIndex = i; + if( TwAddVarCB(_Bar, name.c_str(), m.m_Type, CTwMgr::CMemberProxy::SetCB, CTwMgr::CMemberProxy::GetCB, &mProxy, def.c_str())==0 ) + return 0; + mProxy.m_Var = _Bar->Find(name.c_str(), &mProxy.m_VarParent, NULL); + mProxy.m_Bar = _Bar; + } + } + char structInfo[64]; + sprintf(structInfo, "typeid=%d valptr=%p close ", _Type, vPtr); + string grpDef = '`' + _Bar->m_Name + "`/`" + _Name + "` " + structInfo; + if( _Def!=NULL && strlen(_Def)>0 ) + grpDef += _Def; + if( TwDefine(grpDef.c_str()) ) + { + for( int i=0; i<(int)s.m_Members.size(); ++i ) + { + CTwMgr::CStructMember& m = s.m_Members[i]; + if( m.m_DefString.length()>0 ) + { + string memberDef = '`' + _Bar->m_Name + "`/`" + _Name + '.' + m.m_Name + "` " + m.m_DefString; + if( !TwDefine(memberDef.c_str()) ) + return 0; + } + } + return 1; + } + else + return 0; + } + else + { + g_TwMgr->SetLastError(g_ErrNotFound); + return 0; + } +} + +// --------------------------------------------------------------------------- + +int ANT_CALL TwAddVarRW(TwBar *_Bar, const char *_Name, ETwType _Type, void *_Var, const char *_Def) +{ + return AddVar(_Bar, _Name, _Type, _Var, false, NULL, NULL, NULL, NULL, _Def); +} + +// --------------------------------------------------------------------------- + +int ANT_CALL TwAddVarRO(TwBar *_Bar, const char *_Name, ETwType _Type, const void *_Var, const char *_Def) +{ + return AddVar(_Bar, _Name, _Type, const_cast(_Var), true, NULL, NULL, NULL, NULL, _Def); +} + +// --------------------------------------------------------------------------- + +int ANT_CALL TwAddVarCB(TwBar *_Bar, const char *_Name, ETwType _Type, TwSetVarCallback _SetCallback, TwGetVarCallback _GetCallback, void *_ClientData, const char *_Def) +{ + return AddVar(_Bar, _Name, _Type, NULL, false, _SetCallback, _GetCallback, NULL, _ClientData, _Def); +} + +// --------------------------------------------------------------------------- + +int ANT_CALL TwAddButton(TwBar *_Bar, const char *_Name, TwButtonCallback _Callback, void *_ClientData, const char *_Def) +{ + return AddVar(_Bar, _Name, TW_TYPE_BUTTON, NULL, false, NULL, NULL, _Callback, _ClientData, _Def); +} + +// --------------------------------------------------------------------------- + +int ANT_CALL TwRemoveVar(TwBar *_Bar, const char *_Name) +{ + if( g_TwMgr==NULL ) + { + TwGlobalError(g_ErrNotInit); + return 0; // not initialized + } + if( _Bar==NULL || _Name==NULL || strlen(_Name)==0 ) + { + g_TwMgr->SetLastError(g_ErrBadParam); + return 0; + } + + if( g_TwMgr->m_PopupBar!=NULL && _Bar!=g_TwMgr->m_PopupBar ) // delete popup bar first if it exists + { + TwDeleteBar(g_TwMgr->m_PopupBar); + g_TwMgr->m_PopupBar = NULL; + } + + CTwVarGroup *Parent = NULL; + int Index = -1; + CTwVar *Var = _Bar->Find(_Name, &Parent, &Index); + if( Var!=NULL && Parent!=NULL && Index>=0 ) + { + if( Parent->m_StructValuePtr!=NULL ) + { + g_TwMgr->SetLastError(g_ErrDelStruct); + return 0; + } + + delete Var; + Parent->m_Vars.erase(Parent->m_Vars.begin()+Index); + if( Parent!=&(_Bar->m_VarRoot) && Parent->m_Vars.size()<=0 ) + TwRemoveVar(_Bar, Parent->m_Name.c_str()); + _Bar->NotUpToDate(); + if( _Bar!=g_TwMgr->m_HelpBar ) + g_TwMgr->m_HelpBarNotUpToDate = true; + return 1; + } + + g_TwMgr->SetLastError(g_ErrNotFound); + return 0; +} + +// --------------------------------------------------------------------------- + +int ANT_CALL TwRemoveAllVars(TwBar *_Bar) +{ + if( g_TwMgr==NULL ) + { + TwGlobalError(g_ErrNotInit); + return 0; // not initialized + } + if( _Bar==NULL ) + { + g_TwMgr->SetLastError(g_ErrBadParam); + return 0; + } + + if( g_TwMgr->m_PopupBar!=NULL && _Bar!=g_TwMgr->m_PopupBar ) // delete popup bar first if it exists + { + TwDeleteBar(g_TwMgr->m_PopupBar); + g_TwMgr->m_PopupBar = NULL; + } + + for( vector::iterator it=_Bar->m_VarRoot.m_Vars.begin(); it!=_Bar->m_VarRoot.m_Vars.end(); ++it ) + if( *it != NULL ) + { + delete *it; + *it = NULL; + } + _Bar->m_VarRoot.m_Vars.resize(0); + _Bar->NotUpToDate(); + g_TwMgr->m_HelpBarNotUpToDate = true; + return 1; +} + +// --------------------------------------------------------------------------- + +int ParseToken(string& _Token, const char *_Def, int& Line, int& Column, bool _KeepQuotes, bool _EndCR, char _Sep1='\0', char _Sep2='\0') +{ + const char *Cur = _Def; + _Token = ""; + // skip spaces + while( *Cur==' ' || *Cur=='\t' || *Cur=='\r' || *Cur=='\n' ) + { + if( *Cur=='\n' && _EndCR ) + return (int)(Cur-_Def); // a CR has been found + ++Cur; + if( *Cur=='\n' ) + { + ++Line; + Column = 1; + } + else if( *Cur=='\t' ) + Column += g_TabLength; + else if( *Cur!='\r' ) + ++Column; + } + // read token + int QuoteLine=0, QuoteColumn=0; + const char *QuoteCur; + char Quote = 0; + bool AddChar; + while( (Quote==0 && (*Cur!='\0' && *Cur!=' ' && *Cur!='\t' && *Cur!='\r' && *Cur!='\n' && *Cur!=_Sep1 && *Cur!=_Sep2)) + || (Quote!=0 && (*Cur!='\0' /* && *Cur!='\r' && *Cur!='\n' */)) ) // allow multi-line strings + { + AddChar = true; + if( Quote==0 && (*Cur=='\'' || *Cur=='\"' || *Cur=='`') ) + { + Quote = *Cur; + QuoteLine = Line; + QuoteColumn = Column; + QuoteCur = Cur; + AddChar = _KeepQuotes; + } + else if ( Quote!=0 && *Cur==Quote ) + { + Quote = 0; + AddChar = _KeepQuotes; + } + + if( AddChar ) + _Token += *Cur; + ++Cur; + if( *Cur=='\t' ) + Column += g_TabLength; + else if( *Cur=='\n' ) + { + ++Line; + Column = 1; + } + else + ++Column; + } + + if( Quote!=0 ) + { + Line = QuoteLine; + Column = QuoteColumn; + return -(int)(Cur-_Def); // unclosed quote + } + else + { + if( *Cur=='\n' ) + { + ++Line; + Column = 1; + } + else if( *Cur=='\t' ) + Column += g_TabLength; + else if( *Cur!='\r' && *Cur!='\0' ) + ++Column; + return (int)(Cur-_Def); + } +} + +// --------------------------------------------------------------------------- + +int GetBarVarFromString(CTwBar **_Bar, CTwVar **_Var, CTwVarGroup **_VarParent, int *_VarIndex, const char *_Str) +{ + *_Bar = NULL; + *_Var = NULL; + *_VarParent = NULL; + *_VarIndex = -1; + vector Names; + string Token; + const char *Cur =_Str; + int l=1, c=1, p=1; + while( *Cur!='\0' && p>0 && Names.size()<=3 ) + { + p = ParseToken(Token, Cur, l, c, false, true, '/', '\\'); + if( p>0 && Token.size()>0 ) + { + Names.push_back(Token); + Cur += p + ((Cur[p]!='\0')?1:0); + } + } + if( p<=0 || (Names.size()!=1 && Names.size()!=2) ) + return 0; // parse error + int BarIdx = g_TwMgr->FindBar(Names[0].c_str()); + if( BarIdx<0 ) + { + if( Names.size()==1 && _stricmp(Names[0].c_str(), "global")==0 ) + { + *_Bar = TW_GLOBAL_BAR; + return +3; // 'GLOBAL' found + } + else + return -1; // bar not found + } + *_Bar = g_TwMgr->m_Bars[BarIdx]; + if( Names.size()==1 ) + return 1; // bar found, no var name parsed + *_Var = (*_Bar)->Find(Names[1].c_str(), _VarParent, _VarIndex); + if( *_Var==NULL ) + return -2; // var not found + return 2; // bar and var found +} + +// --------------------------------------------------------------------------- + +int BarVarHasAttrib(CTwBar *_Bar, CTwVar *_Var, const char *_Attrib, bool *_HasValue) +{ + assert(_Bar!=NULL && _HasValue!=NULL && _Attrib!=NULL && strlen(_Attrib)>0); + *_HasValue = false; + if( _Bar==TW_GLOBAL_BAR ) + { + assert( _Var==NULL ); + return g_TwMgr->HasAttrib(_Attrib, _HasValue); + } + else if( _Var==NULL ) + return _Bar->HasAttrib(_Attrib, _HasValue); + else + return _Var->HasAttrib(_Attrib, _HasValue); +} + +// --------------------------------------------------------------------------- + +int BarVarSetAttrib(CTwBar *_Bar, CTwVar *_Var, CTwVarGroup *_VarParent, int _VarIndex, int _AttribID, const char *_Value) +{ + assert(_Bar!=NULL && _AttribID>0); + + /* don't delete popupbar here: if any attrib is changed every frame by the app, popup will not work anymore. + if( g_TwMgr->m_PopupBar!=NULL && _Bar!=g_TwMgr->m_PopupBar && g_TwMgr->m_PopupBar->m_BarLinkedToPopupList==_Bar ) // delete popup bar first if it exists + { + TwDeleteBar(g_TwMgr->m_PopupBar); + g_TwMgr->m_PopupBar = NULL; + } + */ + + if( _Bar==TW_GLOBAL_BAR ) + { + assert( _Var==NULL ); + return g_TwMgr->SetAttrib(_AttribID, _Value); + } + else if( _Var==NULL ) + return _Bar->SetAttrib(_AttribID, _Value); + else + return _Var->SetAttrib(_AttribID, _Value, _Bar, _VarParent, _VarIndex); +} + +// --------------------------------------------------------------------------- + +int ANT_CALL TwDefine(const char *_Def) +{ + CTwFPU fpu; // force fpu precision + + if( g_TwMgr==NULL ) + { + TwGlobalError(g_ErrNotInit); + return 0; // not initialized + } + if( _Def==NULL ) + { + g_TwMgr->SetLastError(g_ErrBadParam); + return 0; + } + + int Line = 1; + int Column = 1; + const char *Cur = _Def; + enum EState { PARSE_NAME, PARSE_ATTRIB }; + EState State = PARSE_NAME; + string Token; + string Value; + CTwBar *Bar = NULL; + CTwVar *Var = NULL; + CTwVarGroup *VarParent = NULL; + int VarIndex = -1; + int p; + while( *Cur!='\0' ) + { + const char *PrevCur = Cur; + p = ParseToken(Token, Cur, Line, Column, (State==PARSE_NAME), (State==PARSE_ATTRIB), (State==PARSE_ATTRIB)?'=':'\0'); + if( p<=0 || Token.size()<=0 ) + { + if( p>0 && Cur[p]=='\0' ) + { + Cur += p; + continue; + } + sprintf(g_ErrParse, "Parsing error in def string, line %d column %d [%-16s...]", Line, Column, (p<0)?(Cur-p):PrevCur); + g_TwMgr->SetLastError(g_ErrParse); + return 0; + } + char CurSep = Cur[p]; + Cur += p + ((CurSep!='\0')?1:0); + + if( State==PARSE_NAME ) + { + int Err = GetBarVarFromString(&Bar, &Var, &VarParent, &VarIndex, Token.c_str()); + if( Err<=0 ) + { + if( Err==-1 ) + sprintf(g_ErrParse, "Parsing error in def string: Bar not found line %d column %d [%-16s...]", Line, Column, Token.c_str()); + else if( Err==-2 ) + sprintf(g_ErrParse, "Parsing error in def string: Variable not found line %d column %d [%-16s...]", Line, Column, Token.c_str()); + else + sprintf(g_ErrParse, "Parsing error in def string, line %d column %d [%-16s...]", Line, Column, Token.c_str()); + g_TwMgr->SetLastError(g_ErrParse); + return 0; + } + State = PARSE_ATTRIB; + } + else // State==PARSE_ATTRIB + { + assert(State==PARSE_ATTRIB); + assert(Bar!=NULL); + + bool HasValue = false; + Value = ""; + int AttribID = BarVarHasAttrib(Bar, Var, Token.c_str(), &HasValue); + if( AttribID<=0 ) + { + sprintf(g_ErrParse, "Parsing error in def string: Unknown attribute line %d column %d [%-16s...]", Line, Column, Token.c_str()); + g_TwMgr->SetLastError(g_ErrParse); + return 0; + } + if( HasValue ) + { + if( CurSep!='=' ) + { + string EqualStr; + p = ParseToken(EqualStr, Cur, Line, Column, true, true, '='); + CurSep = Cur[p]; + if( p<0 || EqualStr.size()>0 || CurSep!='=' ) + { + sprintf(g_ErrParse, "Parsing error in def string: '=' not found while reading attribute value line %d column %d [%-16s...]", Line, Column, Token.c_str()); + g_TwMgr->SetLastError(g_ErrParse); + return 0; + } + Cur += p + 1; + } + p = ParseToken(Value, Cur, Line, Column, false, true); + if( p<=0 ) + { + sprintf(g_ErrParse, "Parsing error in def string: can't read attribute value line %d column %d [%-16s...]", Line, Column, Token.c_str()); + g_TwMgr->SetLastError(g_ErrParse); + return 0; + } + CurSep = Cur[p]; + Cur += p + ((CurSep!='\0')?1:0); + } + if( BarVarSetAttrib(Bar, Var, VarParent, VarIndex, AttribID, HasValue?Value.c_str():NULL)==0 ) + { + if( g_TwMgr->CheckLastError()==NULL || strlen(g_TwMgr->CheckLastError())<=0 ) + sprintf(g_ErrParse, "Parsing error in def string: wrong attribute value line %d column %d [%-16s...]", Line, Column, Token.c_str()); + else + sprintf(g_ErrParse, "%s line %d column %d [%-16s...]", g_TwMgr->CheckLastError(), Line, Column, Token.c_str()); + g_TwMgr->SetLastError(g_ErrParse); + return 0; + } + // sweep spaces to detect next attrib + while( *Cur==' ' || *Cur=='\t' || *Cur=='\r' ) + { + ++Cur; + if( *Cur=='\t' ) + Column += g_TabLength; + else if( *Cur!='\r' ) + ++Column; + } + if( *Cur=='\n' ) // new line detected + { + ++Line; + Column = 1; + State = PARSE_NAME; + } + } + } + + g_TwMgr->m_HelpBarNotUpToDate = true; + return 1; +} + +// --------------------------------------------------------------------------- + +TwType ANT_CALL TwDefineEnum(const char *_Name, const TwEnumVal *_EnumValues, unsigned int _NbValues) +{ + CTwFPU fpu; // force fpu precision + + if( g_TwMgr==NULL ) + { + TwGlobalError(g_ErrNotInit); + return TW_TYPE_UNDEF; // not initialized + } + if( _EnumValues==NULL && _NbValues!=0 ) + { + g_TwMgr->SetLastError(g_ErrBadParam); + return TW_TYPE_UNDEF; + } + + if( g_TwMgr->m_PopupBar!=NULL ) // delete popup bar first if it exists + { + TwDeleteBar(g_TwMgr->m_PopupBar); + g_TwMgr->m_PopupBar = NULL; + } + + size_t enumIndex = g_TwMgr->m_Enums.size(); + if( _Name!=NULL && strlen(_Name)>0 ) + for( size_t j=0; jm_Enums.size(); ++j ) + if( strcmp(_Name, g_TwMgr->m_Enums[j].m_Name.c_str())==0 ) + { + enumIndex = j; + break; + } + if( enumIndex==g_TwMgr->m_Enums.size() ) + g_TwMgr->m_Enums.push_back(CTwMgr::CEnum()); + assert( enumIndex>=0 && enumIndexm_Enums.size() ); + CTwMgr::CEnum& e = g_TwMgr->m_Enums[enumIndex]; + if( _Name!=NULL && strlen(_Name)>0 ) + e.m_Name = _Name; + else + e.m_Name = ""; + e.m_Entries.clear(); + for(unsigned int i=0; i<_NbValues; ++i) + { + CTwMgr::CEnum::CEntries::value_type Entry(_EnumValues[i].Value, (_EnumValues[i].Label!=NULL)?_EnumValues[i].Label:""); + pair Result = e.m_Entries.insert(Entry); + if( !Result.second ) + (Result.first)->second = Entry.second; + } + + return TwType( TW_TYPE_ENUM_BASE + enumIndex ); +} + +// --------------------------------------------------------------------------- + +void ANT_CALL CTwMgr::CStruct::DefaultSummary(char *_SummaryString, size_t _SummaryMaxLength, const void *_Value, void *_ClientData) +{ + const CTwVarGroup *varGroup = static_cast(_Value); // special case + if( _SummaryString && _SummaryMaxLength>0 ) + _SummaryString[0] = '\0'; + size_t structIndex = (size_t)(_ClientData); + if( g_TwMgr && _SummaryString && _SummaryMaxLength>2 + && varGroup && static_cast(varGroup)->IsGroup() + && structIndex>=0 && structIndex<=g_TwMgr->m_Structs.size() ) + { + // return g_TwMgr->m_Structs[structIndex].m_Name.c_str(); + CTwMgr::CStruct& s = g_TwMgr->m_Structs[structIndex]; + _SummaryString[0] = '{'; + _SummaryString[1] = '\0'; + bool separator = false; + for( size_t i=0; im_Name + '.' + s.m_Members[i].m_Name; + const CTwVar *var = varGroup->Find(varName.c_str(), NULL, NULL); + if( var ) + { + if( var->IsGroup() ) + { + const CTwVarGroup *grp = static_cast(var); + if( grp->m_SummaryCallback!=NULL ) + { + size_t l = strlen(_SummaryString); + if( separator ) + { + _SummaryString[l++] = ','; + _SummaryString[l++] = '\0'; + } + if( grp->m_SummaryCallback==CTwMgr::CStruct::DefaultSummary ) + grp->m_SummaryCallback(_SummaryString+l, _SummaryMaxLength-l, grp, grp->m_SummaryClientData); + else + grp->m_SummaryCallback(_SummaryString+l, _SummaryMaxLength-l, grp->m_StructValuePtr, grp->m_SummaryClientData); + separator = true; + } + } + else + { + size_t l = strlen(_SummaryString); + if( separator ) + { + _SummaryString[l++] = ','; + _SummaryString[l++] = '\0'; + } + string valString; + const CTwVarAtom *atom = static_cast(var); + atom->ValueToString(&valString); + strncat(_SummaryString, valString.c_str(), _SummaryMaxLength-l); + separator = true; + } + if( strlen(_SummaryString)>_SummaryMaxLength-2 ) + break; + } + } + size_t l = strlen(_SummaryString); + if( l>_SummaryMaxLength-2 ) + { + _SummaryString[_SummaryMaxLength-2] = '.'; + _SummaryString[_SummaryMaxLength-1] = '.'; + _SummaryString[_SummaryMaxLength+0] = '\0'; + } + else + { + _SummaryString[l+0] = '}'; + _SummaryString[l+1] = '\0'; + } + } +} + +// --------------------------------------------------------------------------- + +TwType ANT_CALL TwDefineStruct(const char *_StructName, const TwStructMember *_StructMembers, unsigned int _NbMembers, size_t _StructSize, TwSummaryCallback _SummaryCallback, void *_SummaryClientData) +{ + CTwFPU fpu; // force fpu precision + + if( g_TwMgr==NULL ) + { + TwGlobalError(g_ErrNotInit); + return TW_TYPE_UNDEF; // not initialized + } + if( _StructMembers==NULL || _NbMembers==0 || _StructSize==0 ) + { + g_TwMgr->SetLastError(g_ErrBadParam); + return TW_TYPE_UNDEF; + } + + if( _StructName!=NULL && strlen(_StructName)>0 ) + for( size_t j=0; jm_Structs.size(); ++j ) + if( strcmp(_StructName, g_TwMgr->m_Structs[j].m_Name.c_str())==0 ) + { + g_TwMgr->SetLastError(g_ErrExist); + return TW_TYPE_UNDEF; + } + + size_t structIndex = g_TwMgr->m_Structs.size(); + CTwMgr::CStruct s; + s.m_Size = _StructSize; + if( _StructName!=NULL && strlen(_StructName)>0 ) + s.m_Name = _StructName; + else + s.m_Name = ""; + s.m_Members.resize(_NbMembers); + if( _SummaryCallback!=NULL ) + { + s.m_SummaryCallback = _SummaryCallback; + s.m_SummaryClientData = _SummaryClientData; + } + else + { + s.m_SummaryCallback = CTwMgr::CStruct::DefaultSummary; + s.m_SummaryClientData = (void *)(structIndex); + } + for( unsigned int i=0; i<_NbMembers; ++i ) + { + CTwMgr::CStructMember& m = s.m_Members[i]; + if( _StructMembers[i].Name!=NULL ) + m.m_Name = _StructMembers[i].Name; + else + { + char name[16]; + sprintf(name, "%u", i); + m.m_Name = name; + } + m.m_Type = _StructMembers[i].Type; + m.m_Size = 0; // to avoid endless recursivity in GetDataSize + m.m_Size = CTwVar::GetDataSize(m.m_Type); + if( _StructMembers[i].Offset<_StructSize ) + m.m_Offset = _StructMembers[i].Offset; + else + { + g_TwMgr->SetLastError(g_ErrOffset); + return TW_TYPE_UNDEF; + } + if( _StructMembers[i].DefString!=NULL && strlen(_StructMembers[i].DefString)>0 ) + m.m_DefString = _StructMembers[i].DefString; + else + m.m_DefString = ""; + } + + g_TwMgr->m_Structs.push_back(s); + assert( g_TwMgr->m_Structs.size()==structIndex+1 ); + return TwType( TW_TYPE_STRUCT_BASE + structIndex ); +} + +// --------------------------------------------------------------------------- + +TwType ANT_CALL TwDefineStructExt(const char *_StructName, const TwStructMember *_StructExtMembers, unsigned int _NbExtMembers, size_t _StructSize, size_t _StructExtSize, TwStructExtInitCallback _StructExtInitCallback, TwCopyVarFromExtCallback _CopyVarFromExtCallback, TwCopyVarToExtCallback _CopyVarToExtCallback, TwSummaryCallback _SummaryCallback, void *_ClientData) +{ + CTwFPU fpu; // force fpu precision + + if( g_TwMgr==NULL ) + { + TwGlobalError(g_ErrNotInit); + return TW_TYPE_UNDEF; // not initialized + } + if( _StructSize==0 || _StructExtInitCallback==NULL || _CopyVarFromExtCallback==NULL || _CopyVarToExtCallback==NULL ) + { + g_TwMgr->SetLastError(g_ErrBadParam); + return TW_TYPE_UNDEF; + } + TwType type = TwDefineStruct(_StructName, _StructExtMembers, _NbExtMembers, _StructExtSize, _SummaryCallback, _ClientData); + if( type>=TW_TYPE_STRUCT_BASE && typem_Structs.size() ) + { + CTwMgr::CStruct& s = g_TwMgr->m_Structs[type-TW_TYPE_STRUCT_BASE]; + s.m_IsExt = true; + s.m_ClientStructSize = _StructSize; + s.m_StructExtInitCallback = _StructExtInitCallback; + s.m_CopyVarFromExtCallback = _CopyVarFromExtCallback; + s.m_CopyVarToExtCallback = _CopyVarToExtCallback; + s.m_ExtClientData = _ClientData; + } + return type; +} + + +// --------------------------------------------------------------------------- + +bool TwGetKeyCode(int *_Code, int *_Modif, const char *_String) +{ + assert(_Code!=NULL && _Modif!=NULL); + bool Ok = true; + *_Modif = TW_KMOD_NONE; + *_Code = 0; + size_t Start = strlen(_String)-1; + if( Start<0 ) + return false; + while( Start>0 && _String[Start-1]!='+' ) + --Start; + while( _String[Start]==' ' || _String[Start]=='\t' ) + ++Start; + char *CodeStr = _strdup(_String+Start); + for( size_t i=strlen(CodeStr)-1; i>=0; ++i ) + if( CodeStr[i]==' ' || CodeStr[i]=='\t' ) + CodeStr[i] = '\0'; + else + break; + + /* + if( strstr(_String, "SHIFT")!=NULL || strstr(_String, "shift")!=NULL ) + *_Modif |= TW_KMOD_SHIFT; + if( strstr(_String, "CTRL")!=NULL || strstr(_String, "ctrl")!=NULL ) + *_Modif |= TW_KMOD_CTRL; + if( strstr(_String, "META")!=NULL || strstr(_String, "meta")!=NULL ) + *_Modif |= TW_KMOD_META; + + if( strstr(_String, "ALTGR")!=NULL || strstr(_String, "altgr")!=NULL ) + ((void)(0)); // *_Modif |= TW_KMOD_ALTGR; + else // ALT and ALTGR are exclusive + if( strstr(_String, "ALT")!=NULL || strstr(_String, "alt")!=NULL ) + *_Modif |= TW_KMOD_ALT; + */ + char *up = _strdup(_String); + // _strupr(up); + for( char *upch=up; *upch!='\0'; ++upch ) + *upch = (char)toupper(*upch); + if( strstr(up, "SHIFT")!=NULL ) + *_Modif |= TW_KMOD_SHIFT; + if( strstr(up, "CTRL")!=NULL ) + *_Modif |= TW_KMOD_CTRL; + if( strstr(up, "META")!=NULL ) + *_Modif |= TW_KMOD_META; + + if( strstr(up, "ALTGR")!=NULL ) + ((void)(0)); // *_Modif |= TW_KMOD_ALTGR; + else // ALT and ALTGR are exclusive + if( strstr(up, "ALT")!=NULL ) + *_Modif |= TW_KMOD_ALT; + free(up); + + if( strlen(CodeStr)==1 ) + *_Code = (unsigned char)(CodeStr[0]); + else if( _stricmp(CodeStr, "backspace")==0 || _stricmp(CodeStr, "bs")==0 ) + *_Code = TW_KEY_BACKSPACE; + else if( _stricmp(CodeStr, "tab")==0 ) + *_Code = TW_KEY_TAB; + else if( _stricmp(CodeStr, "clear")==0 || _stricmp(CodeStr, "clr")==0 ) + *_Code = TW_KEY_CLEAR; + else if( _stricmp(CodeStr, "return")==0 || _stricmp(CodeStr, "ret")==0 ) + *_Code = TW_KEY_RETURN; + else if( _stricmp(CodeStr, "pause")==0 ) + *_Code = TW_KEY_PAUSE; + else if( _stricmp(CodeStr, "escape")==0 || _stricmp(CodeStr, "esc")==0 ) + *_Code = TW_KEY_ESCAPE; + else if( _stricmp(CodeStr, "space")==0 ) + *_Code = TW_KEY_SPACE; + else if( _stricmp(CodeStr, "delete")==0 || _stricmp(CodeStr, "del")==0 ) + *_Code = TW_KEY_DELETE; + /* + else if( strlen(CodeStr)==4 && CodeStr[3]>='0' && CodeStr[3]<='9' && (strstr(CodeStr, "pad")==CodeStr || strstr(CodeStr, "PAD")==CodeStr) ) + *_Code = TW_KEY_PAD_0 + CodeStr[3]-'0'; + else if( _stricmp(CodeStr, "pad.")==0 ) + *_Code = TW_KEY_PAD_PERIOD; + else if( _stricmp(CodeStr, "pad/")==0 ) + *_Code = TW_KEY_PAD_DIVIDE; + else if( _stricmp(CodeStr, "pad*")==0 ) + *_Code = TW_KEY_PAD_MULTIPLY; + else if( _stricmp(CodeStr, "pad+")==0 ) + *_Code = TW_KEY_PAD_PLUS; + else if( _stricmp(CodeStr, "pad-")==0 ) + *_Code = TW_KEY_PAD_MINUS; + else if( _stricmp(CodeStr, "padenter")==0 ) + *_Code = TW_KEY_PAD_ENTER; + else if( _stricmp(CodeStr, "pad=")==0 ) + *_Code = TW_KEY_PAD_EQUALS; + */ + else if( _stricmp(CodeStr, "up")==0 ) + *_Code = TW_KEY_UP; + else if( _stricmp(CodeStr, "down")==0 ) + *_Code = TW_KEY_DOWN; + else if( _stricmp(CodeStr, "right")==0 ) + *_Code = TW_KEY_RIGHT; + else if( _stricmp(CodeStr, "left")==0 ) + *_Code = TW_KEY_LEFT; + else if( _stricmp(CodeStr, "insert")==0 || _stricmp(CodeStr, "ins")==0 ) + *_Code = TW_KEY_INSERT; + else if( _stricmp(CodeStr, "home")==0 ) + *_Code = TW_KEY_HOME; + else if( _stricmp(CodeStr, "end")==0 ) + *_Code = TW_KEY_END; + else if( _stricmp(CodeStr, "pgup")==0 ) + *_Code = TW_KEY_PAGE_UP; + else if( _stricmp(CodeStr, "pgdown")==0 ) + *_Code = TW_KEY_PAGE_DOWN; + else if( (strlen(CodeStr)==2 || strlen(CodeStr)==3) && (CodeStr[0]=='f' || CodeStr[0]=='F') ) + { + int n = 0; + if( sscanf(CodeStr+1, "%d", &n)==1 && n>0 && n<16 ) + *_Code = TW_KEY_F1 + n-1; + else + Ok = false; + } + + free(CodeStr); + return Ok; +} + +bool TwGetKeyString(std::string *_String, int _Code, int _Modif) +{ + assert(_String!=NULL); + bool Ok = true; + if( _Modif & TW_KMOD_SHIFT ) + *_String += "SHIFT+"; + if( _Modif & TW_KMOD_CTRL ) + *_String += "CTRL+"; + if ( _Modif & TW_KMOD_ALT ) + *_String += "ALT+"; + if ( _Modif & TW_KMOD_META ) + *_String += "META+"; + // if ( _Modif & TW_KMOD_ALTGR ) + // *_String += "ALTGR+"; + switch( _Code ) + { + case TW_KEY_BACKSPACE: + *_String += "BackSpace"; + break; + case TW_KEY_TAB: + *_String += "Tab"; + break; + case TW_KEY_CLEAR: + *_String += "Clear"; + break; + case TW_KEY_RETURN: + *_String += "Return"; + break; + case TW_KEY_PAUSE: + *_String += "Pause"; + break; + case TW_KEY_ESCAPE: + *_String += "Esc"; + break; + case TW_KEY_SPACE: + *_String += "Space"; + break; + case TW_KEY_DELETE: + *_String += "Delete"; + break; + /* + case TW_KEY_PAD_0: + *_String += "PAD0"; + break; + case TW_KEY_PAD_1: + *_String += "PAD1"; + break; + case TW_KEY_PAD_2: + *_String += "PAD2"; + break; + case TW_KEY_PAD_3: + *_String += "PAD3"; + break; + case TW_KEY_PAD_4: + *_String += "PAD4"; + break; + case TW_KEY_PAD_5: + *_String += "PAD5"; + break; + case TW_KEY_PAD_6: + *_String += "PAD6"; + break; + case TW_KEY_PAD_7: + *_String += "PAD7"; + break; + case TW_KEY_PAD_8: + *_String += "PAD8"; + break; + case TW_KEY_PAD_9: + *_String += "PAD9"; + break; + case TW_KEY_PAD_PERIOD: + *_String += "PAD."; + break; + case TW_KEY_PAD_DIVIDE: + *_String += "PAD/"; + break; + case TW_KEY_PAD_MULTIPLY: + *_String += "PAD*"; + break; + case TW_KEY_PAD_MINUS: + *_String += "PAD-"; + break; + case TW_KEY_PAD_PLUS: + *_String += "PAD+"; + break; + case TW_KEY_PAD_ENTER: + *_String += "PADEnter"; + break; + case TW_KEY_PAD_EQUALS: + *_String += "PAD="; + break; + */ + case TW_KEY_UP: + *_String += "Up"; + break; + case TW_KEY_DOWN: + *_String += "Down"; + break; + case TW_KEY_RIGHT: + *_String += "Right"; + break; + case TW_KEY_LEFT: + *_String += "Left"; + break; + case TW_KEY_INSERT: + *_String += "Insert"; + break; + case TW_KEY_HOME: + *_String += "Home"; + break; + case TW_KEY_END: + *_String += "End"; + break; + case TW_KEY_PAGE_UP: + *_String += "PgUp"; + break; + case TW_KEY_PAGE_DOWN: + *_String += "PgDown"; + break; + case TW_KEY_F1: + *_String += "F1"; + break; + case TW_KEY_F2: + *_String += "F2"; + break; + case TW_KEY_F3: + *_String += "F3"; + break; + case TW_KEY_F4: + *_String += "F4"; + break; + case TW_KEY_F5: + *_String += "F5"; + break; + case TW_KEY_F6: + *_String += "F6"; + break; + case TW_KEY_F7: + *_String += "F7"; + break; + case TW_KEY_F8: + *_String += "F8"; + break; + case TW_KEY_F9: + *_String += "F9"; + break; + case TW_KEY_F10: + *_String += "F10"; + break; + case TW_KEY_F11: + *_String += "F11"; + break; + case TW_KEY_F12: + *_String += "F12"; + break; + case TW_KEY_F13: + *_String += "F13"; + break; + case TW_KEY_F14: + *_String += "F14"; + break; + case TW_KEY_F15: + *_String += "F15"; + break; + default: + if( _Code>0 && _Code<256 ) + *_String += char(_Code); + else + { + *_String += "Unknown"; + Ok = false; + } + } + return Ok; +} + +// --------------------------------------------------------------------------- + +const int TW_MOUSE_NOMOTION = -1; +ETwMouseAction TW_MOUSE_MOTION = (ETwMouseAction)(-2); +ETwMouseAction TW_MOUSE_WHEEL = (ETwMouseAction)(-3); +ETwMouseButtonID TW_MOUSE_NA = (ETwMouseButtonID)(-1); + +static int TwMouseEvent(ETwMouseAction _EventType, TwMouseButtonID _Button, int _MouseX, int _MouseY, int _WheelPos) +{ + CTwFPU fpu; // force fpu precision + + if( g_TwMgr==NULL || g_TwMgr->m_Graph==NULL ) + { + // TwGlobalError(g_ErrNotInit); -> not an error here + return 0; // not initialized + } + if( g_TwMgr->m_WndHeight<=0 || g_TwMgr->m_WndWidth<=0 ) + { + //g_TwMgr->SetLastError(g_ErrBadWndSize); // not an error, windows not yet ready. + return 0; + } + + if( _MouseX==TW_MOUSE_NOMOTION ) + _MouseX = g_TwMgr->m_LastMouseX; + else + g_TwMgr->m_LastMouseX = _MouseX; + if( _MouseY==TW_MOUSE_NOMOTION ) + _MouseY = g_TwMgr->m_LastMouseY; + else + g_TwMgr->m_LastMouseY = _MouseY; + + // for autorepeat + if( (!g_TwMgr->m_IsRepeatingMousePressed || !g_TwMgr->m_CanRepeatMousePressed) && _EventType==TW_MOUSE_PRESSED ) + { + g_TwMgr->m_LastMousePressedTime = g_TwMgr->m_Timer.GetTime(); + g_TwMgr->m_LastMousePressedButtonID = _Button; + g_TwMgr->m_LastMousePressedPosition[0] = _MouseX; + g_TwMgr->m_LastMousePressedPosition[1] = _MouseY; + g_TwMgr->m_CanRepeatMousePressed = true; + g_TwMgr->m_IsRepeatingMousePressed = false; + } + else if( _EventType==TW_MOUSE_RELEASED || _EventType==TW_MOUSE_WHEEL ) + { + g_TwMgr->m_CanRepeatMousePressed = false; + g_TwMgr->m_IsRepeatingMousePressed = false; + } + + bool Handled = false; + bool wasPopup = (g_TwMgr->m_PopupBar!=NULL); + CTwBar *Bar = NULL; + int i; + for( i=((int)g_TwMgr->m_Bars.size())-1; i>=0; --i ) + { + Bar = g_TwMgr->m_Bars[g_TwMgr->m_Order[i]]; + if( Bar!=NULL && Bar->m_Visible ) + { + if( _EventType==TW_MOUSE_MOTION ) + Handled = Bar->MouseMotion(_MouseX, _MouseY); + else if( _EventType==TW_MOUSE_PRESSED || _EventType==TW_MOUSE_RELEASED ) + Handled = Bar->MouseButton(_Button, (_EventType==TW_MOUSE_PRESSED), _MouseX, _MouseY); + else if( _EventType==TW_MOUSE_WHEEL ) + { + if( abs(_WheelPos-g_TwMgr->m_LastMouseWheelPos)<4 ) // avoid crazy wheel positions + Handled = Bar->MouseWheel(_WheelPos, g_TwMgr->m_LastMouseWheelPos, _MouseX, _MouseY); + } + if( Handled ) + break; + } + } + + /* + if( i>=0 && Bar!=NULL && Handled && (_EventType==TW_MOUSE_PRESSED || Bar->IsMinimized()) && i!=((int)g_TwMgr->m_Bars.size())-1 ) + { + int iOrder = g_TwMgr->m_Order[i]; + for( int j=i; j<(int)g_TwMgr->m_Bars.size()-1; ++j ) + g_TwMgr->m_Order[j] = g_TwMgr->m_Order[j+1]; + g_TwMgr->m_Order[(int)g_TwMgr->m_Bars.size()-1] = iOrder; + } + */ + if( _EventType==TW_MOUSE_PRESSED || (Bar!=NULL && Bar->IsMinimized() && Handled) ) + { + if( wasPopup && Bar!=g_TwMgr->m_PopupBar && g_TwMgr->m_PopupBar!=NULL ) // delete popup + { + TwDeleteBar(g_TwMgr->m_PopupBar); + g_TwMgr->m_PopupBar = NULL; + } + + if( i>=0 && Bar!=NULL && Handled && !wasPopup ) + TwSetTopBar(Bar); + } + + if( _EventType==TW_MOUSE_WHEEL ) + g_TwMgr->m_LastMouseWheelPos = _WheelPos; + + return Handled ? 1 : 0; +} + +int ANT_CALL TwMouseButton(ETwMouseAction _EventType, TwMouseButtonID _Button) +{ + return TwMouseEvent(_EventType, _Button, TW_MOUSE_NOMOTION, TW_MOUSE_NOMOTION, 0); +} + +int ANT_CALL TwMouseMotion(int _MouseX, int _MouseY) +{ + return TwMouseEvent(TW_MOUSE_MOTION, TW_MOUSE_NA, _MouseX, _MouseY, 0); +} + +int ANT_CALL TwMouseWheel(int _Pos) +{ + return TwMouseEvent(TW_MOUSE_WHEEL, TW_MOUSE_NA, TW_MOUSE_NOMOTION, TW_MOUSE_NOMOTION, _Pos); +} + +// --------------------------------------------------------------------------- + +static int TranslateKey(int _Key, int _Modifiers) +{ + // CTRL special cases +// if( (_Modifiers&TW_KMOD_CTRL) && !(_Modifiers&TW_KMOD_ALT || _Modifiers&TW_KMOD_META) && _Key>0 && _Key<32 ) +// _Key += 'a'-1; + if( (_Modifiers&TW_KMOD_CTRL) ) + { + if( _Key>='a' && _Key<='z' && ( ((_Modifiers&0x2000) && !(_Modifiers&TW_KMOD_SHIFT)) || (!(_Modifiers&0x2000) && (_Modifiers&TW_KMOD_SHIFT)) )) // 0x2000 is SDL's KMOD_CAPS + _Key += 'A'-'a'; + else if ( _Key>='A' && _Key<='Z' && ( ((_Modifiers&0x2000) && (_Modifiers&TW_KMOD_SHIFT)) || (!(_Modifiers&0x2000) && !(_Modifiers&TW_KMOD_SHIFT)) )) // 0x2000 is SDL's KMOD_CAPS + _Key += 'a'-'A'; + } + + // PAD translation (for SDL keysym) + if( _Key>=256 && _Key<=272 ) // 256=SDLK_KP0 ... 272=SDLK_KP_EQUALS + { + //bool Num = ((_Modifiers&TW_KMOD_SHIFT) && !(_Modifiers&0x1000)) || (!(_Modifiers&TW_KMOD_SHIFT) && (_Modifiers&0x1000)); // 0x1000 is SDL's KMOD_NUM + //_Modifiers &= ~TW_KMOD_SHIFT; // remove shift modifier + bool Num = (!(_Modifiers&TW_KMOD_SHIFT) && (_Modifiers&0x1000)); // 0x1000 is SDL's KMOD_NUM + if( _Key==266 ) // SDLK_KP_PERIOD + _Key = Num ? '.' : TW_KEY_DELETE; + else if( _Key==267 ) // SDLK_KP_DIVIDE + _Key = '/'; + else if( _Key==268 ) // SDLK_KP_MULTIPLY + _Key = '*'; + else if( _Key==269 ) // SDLK_KP_MINUS + _Key = '-'; + else if( _Key==270 ) // SDLK_KP_PLUS + _Key = '+'; + else if( _Key==271 ) // SDLK_KP_ENTER + _Key = TW_KEY_RETURN; + else if( _Key==272 ) // SDLK_KP_EQUALS + _Key = '='; + else if( Num ) // num SDLK_KP0..9 + _Key += '0' - 256; + else if( _Key==256 ) // non-num SDLK_KP01 + _Key = TW_KEY_INSERT; + else if( _Key==257 ) // non-num SDLK_KP1 + _Key = TW_KEY_END; + else if( _Key==258 ) // non-num SDLK_KP2 + _Key = TW_KEY_DOWN; + else if( _Key==259 ) // non-num SDLK_KP3 + _Key = TW_KEY_PAGE_DOWN; + else if( _Key==260 ) // non-num SDLK_KP4 + _Key = TW_KEY_LEFT; + else if( _Key==262 ) // non-num SDLK_KP6 + _Key = TW_KEY_RIGHT; + else if( _Key==263 ) // non-num SDLK_KP7 + _Key = TW_KEY_HOME; + else if( _Key==264 ) // non-num SDLK_KP8 + _Key = TW_KEY_UP; + else if( _Key==265 ) // non-num SDLK_KP9 + _Key = TW_KEY_PAGE_UP; + } + return _Key; +} + +// --------------------------------------------------------------------------- + +int ANT_CALL TwKeyPressed(int _Key, int _Modifiers) +{ + CTwFPU fpu; // force fpu precision + + if( g_TwMgr==NULL || g_TwMgr->m_Graph==NULL ) + { + // TwGlobalError(g_ErrNotInit); -> not an error here + return 0; // not initialized + } + if( g_TwMgr->m_WndHeight<=0 || g_TwMgr->m_WndWidth<=0 ) + { + //g_TwMgr->SetLastError(g_ErrBadWndSize); // not an error, windows not yet ready. + return 0; + } + + /* + // Test for TwDeleteBar + if( _Key>='0' && _Key<='9' ) + { + int n = _Key-'0'; + if( (int)g_TwMgr->m_Bars.size()>n && g_TwMgr->m_Bars[n]!=NULL ) + { + printf("Delete %s\n", g_TwMgr->m_Bars[n]->m_Name.c_str()); + TwDeleteBar(g_TwMgr->m_Bars[n]); + } + else + printf("can't delete %d\n", n); + return 1; + } + */ + + //char s[256]; + //sprintf(s, "twkeypressed k=%d m=%x\n", _Key, _Modifiers); + //OutputDebugString(s); + + _Key = TranslateKey(_Key, _Modifiers); + if( _Key>' ' && _Key<256 ) // don't test SHIFT if _Key is a common key + _Modifiers &= ~TW_KMOD_SHIFT; + // complete partial modifiers comming from SDL + if( _Modifiers & TW_KMOD_SHIFT ) + _Modifiers |= TW_KMOD_SHIFT; + if( _Modifiers & TW_KMOD_CTRL ) + _Modifiers |= TW_KMOD_CTRL; + if( _Modifiers & TW_KMOD_ALT ) + _Modifiers |= TW_KMOD_ALT; + if( _Modifiers & TW_KMOD_META ) + _Modifiers |= TW_KMOD_META; + + bool Handled = false; + CTwBar *Bar = NULL; + //int Order = 0; + int i; + if( _Key>0 && _Keym_LastMouseX; + int MouseY = g_TwMgr->m_LastMouseY; + for( i=((int)g_TwMgr->m_Bars.size())-1; i>=0 && !Handled; --i ) + { + Bar = g_TwMgr->m_Bars[g_TwMgr->m_Order[i]]; + if( Bar!=NULL && Bar->m_Visible && !Bar->IsMinimized() && MouseX>=Bar->m_PosX && MouseXm_PosX+Bar->m_Width && MouseY>=Bar->m_PosY && MouseYm_PosY+Bar->m_Height ) + Handled = Bar->KeyPressed(_Key, _Modifiers); + } + + // If not handled, send it to non-iconified bars in the right order + for( i=((int)g_TwMgr->m_Bars.size())-1; i>=0 && !Handled; --i ) + { + Bar = g_TwMgr->m_Bars[g_TwMgr->m_Order[i]]; + /* + for( size_t j=0; jm_Bars.size(); ++j ) + if( g_TwMgr->m_Order[j]==i ) + { + Bar = g_TwMgr->m_Bars[j]; + break; + } + Order = i; + */ + + if( Bar!=NULL && Bar->m_Visible && !Bar->IsMinimized() ) + Handled = Bar->KeyPressed(_Key, _Modifiers); + } + + // If not handled, send it to iconified bars in the right order + for( i=((int)g_TwMgr->m_Bars.size())-1; i>=0 && !Handled; --i ) + { + Bar = g_TwMgr->m_Bars[g_TwMgr->m_Order[i]]; + if( Bar!=NULL && Bar->m_Visible && Bar->IsMinimized() ) + Handled = Bar->KeyPressed(_Key, _Modifiers); + } + + if( g_TwMgr->m_HelpBar!=NULL && g_TwMgr->m_Graph ) + { + string Str; + TwGetKeyString(&Str, _Key, _Modifiers); + char Msg[256]; + sprintf(Msg, "Key pressed: %s", Str.c_str()); + g_TwMgr->m_KeyPressedStr = Msg; + g_TwMgr->m_KeyPressedBuildText = true; + // OutputDebugString(Msg); + } + } + + if( Handled && Bar!=g_TwMgr->m_PopupBar && g_TwMgr->m_PopupBar!=NULL ) // delete popup + { + TwDeleteBar(g_TwMgr->m_PopupBar); + g_TwMgr->m_PopupBar = NULL; + } + + if( Handled && Bar!=NULL && Bar!=g_TwMgr->m_PopupBar ) + TwSetTopBar(Bar); + + return Handled ? 1 : 0; +} + +// --------------------------------------------------------------------------- + +struct StructCompare : public binary_function +{ + bool operator()(const TwType& _Left, const TwType& _Right) const + { + assert( g_TwMgr!=NULL ); + int i0 = _Left-TW_TYPE_STRUCT_BASE; + int i1 = _Right-TW_TYPE_STRUCT_BASE; + if( i0>=0 && i0<(int)g_TwMgr->m_Structs.size() && i1>=0 && i1<(int)g_TwMgr->m_Structs.size() ) + return g_TwMgr->m_Structs[i0].m_Name < g_TwMgr->m_Structs[i1].m_Name; + else + return false; + } +}; + +typedef set StructSet; + +static void InsertUsedStructs(StructSet& _Set, const CTwVarGroup *_Grp) +{ + assert( g_TwMgr!=NULL && _Grp!=NULL ); + + for( size_t i=0; i<_Grp->m_Vars.size(); ++i ) + if( _Grp->m_Vars[i]!=NULL && _Grp->m_Vars[i]->m_Visible && _Grp->m_Vars[i]->IsGroup() ) + { + const CTwVarGroup *SubGrp = static_cast(_Grp->m_Vars[i]); + if( SubGrp->m_StructValuePtr!=NULL && SubGrp->m_StructType>=TW_TYPE_STRUCT_BASE && SubGrp->m_StructTypem_Structs.size() && g_TwMgr->m_Structs[SubGrp->m_StructType-TW_TYPE_STRUCT_BASE].m_Name.length()>0 ) + _Set.insert(SubGrp->m_StructType); + InsertUsedStructs(_Set, SubGrp); + } +} + +static void SplitString(vector& _OutSplits, const char *_String, int _Width, const CTexFont *_Font) +{ + assert( _Font!=NULL && _String!=NULL ); + _OutSplits.resize(0); + int l = (int)strlen(_String); + if( l==0 ) + { + _String = " "; + l = 1; + } + + if( _String!=NULL && l>0 && _Width>0 ) + { + int w = 0; + int i = 0; + int First = 0; + int Last = 0; + bool PrevNotBlank = true; + unsigned char c; + bool Tab = false, CR = false; + string Split; + const string TabString(g_TabLength, ' '); + + while( im_CharWidth[(int)' ']; + Tab = true; + } + else if( c=='\n' ) + { + w += _Width+1; // force split + Last = i; + CR = true; + } + else + w += _Font->m_CharWidth[(int)c]; + if( w>_Width || i==l-1 ) + { + if( Last<=First || i==l-1 ) + Last = i; + if( Tab ) + { + Split.resize(0); + for(int k=0; km_HelpBar!=NULL); + assert( _String!=NULL ); + int n = 0; + const CTexFont *Font = g_TwMgr->m_HelpBar->m_Font; + assert(Font!=NULL); + string Decal; + for( int s=0; s<_Level; ++s ) + Decal += ' '; + int DecalWidth = (_Level+2)*Font->m_CharWidth[(int)' ']; + + if( _Width>DecalWidth ) + { + vector Split; + SplitString(Split, _String, _Width-DecalWidth, Font); + for( int i=0; i<(int)Split.size(); ++i ) + { + CTwVarAtom *Var = new CTwVarAtom; + Var->m_Name = Decal + Split[i]; + Var->m_Ptr = NULL; + if( _Type==TW_TYPE_HELP_HEADER ) + Var->m_ReadOnly = false; + else + Var->m_ReadOnly = true; + Var->m_NoSlider = true; + Var->m_DontClip = true; + Var->m_Type = _Type; + Var->m_LeftMargin = (signed short)(_Level*Font->m_CharWidth[(int)' ']); + Var->m_TopMargin = (signed short)(-g_TwMgr->m_HelpBar->m_Sep); + //Var->m_TopMargin = 1; + Var->m_Color = g_TwMgr->m_HelpBar->m_ColHelpText; + Var->SetDefaults(); + _Grp->m_Vars.push_back(Var); + ++n; + } + } + return n; +} + +static int AppendHelp(CTwVarGroup *_Grp, const CTwVarGroup *_ToAppend, int _Level, int _Width) +{ + assert( _Grp!=NULL ); + assert( _ToAppend!=NULL ); + int n = 0; + string Decal; + for( int s=0; s<_Level; ++s ) + Decal += ' '; + + if( _ToAppend->m_Help.size()>0 ) + n += AppendHelpString(_Grp, _ToAppend->m_Help.c_str(), _Level, _Width, TW_TYPE_HELP_GRP); + + for( size_t i=0; i<_ToAppend->m_Vars.size(); ++i ) + if( _ToAppend->m_Vars[i]!=NULL && _ToAppend->m_Vars[i]->m_Visible ) + { + CTwVarAtom *Var = new CTwVarAtom; + Var->m_Name = Decal; + if( _ToAppend->m_Vars[i]->m_Label.size()>0 ) + Var->m_Name += _ToAppend->m_Vars[i]->m_Label; + else + Var->m_Name += _ToAppend->m_Vars[i]->m_Name; + Var->m_Ptr = NULL; + if( _ToAppend->m_Vars[i]->IsGroup() && static_cast(_ToAppend->m_Vars[i])->m_StructValuePtr!=NULL ) + { // That's a struct var + Var->m_Type = TW_TYPE_HELP_STRUCT; + Var->m_Val.m_HelpStruct.m_StructType = static_cast(_ToAppend->m_Vars[i])->m_StructType; + Var->m_ReadOnly = true; + Var->m_NoSlider = true; + } + else if( !_ToAppend->m_Vars[i]->IsGroup() ) + { + Var->m_Type = TW_TYPE_SHORTCUT; + Var->m_Val.m_Shortcut.m_Incr[0] = static_cast(_ToAppend->m_Vars[i])->m_KeyIncr[0]; + Var->m_Val.m_Shortcut.m_Incr[1] = static_cast(_ToAppend->m_Vars[i])->m_KeyIncr[1]; + Var->m_Val.m_Shortcut.m_Decr[0] = static_cast(_ToAppend->m_Vars[i])->m_KeyDecr[0]; + Var->m_Val.m_Shortcut.m_Decr[1] = static_cast(_ToAppend->m_Vars[i])->m_KeyDecr[1]; + Var->m_ReadOnly = static_cast(_ToAppend->m_Vars[i])->m_ReadOnly; + Var->m_NoSlider = true; + } + else + { + Var->m_Type = TW_TYPE_HELP_GRP; + Var->m_DontClip = true; + Var->m_LeftMargin = (signed short)((_Level+1)*g_TwMgr->m_HelpBar->m_Font->m_CharWidth[(int)' ']); + //Var->m_TopMargin = (signed short)(g_TwMgr->m_HelpBar->m_Font->m_CharHeight/2-2+2*(_Level-1)); + Var->m_TopMargin = 2; + if( Var->m_TopMargin>g_TwMgr->m_HelpBar->m_Font->m_CharHeight-3 ) + Var->m_TopMargin = (signed short)(g_TwMgr->m_HelpBar->m_Font->m_CharHeight-3); + Var->m_ReadOnly = true; + } + Var->SetDefaults(); + _Grp->m_Vars.push_back(Var); + ++n; + if( _ToAppend->m_Vars[i]->IsGroup() && static_cast(_ToAppend->m_Vars[i])->m_StructValuePtr==NULL ) + n += AppendHelp(_Grp, static_cast(_ToAppend->m_Vars[i]), _Level+1, _Width); + else if( _ToAppend->m_Vars[i]->m_Help.length()>0 ) + n += AppendHelpString(_Grp, _ToAppend->m_Vars[i]->m_Help.c_str(), _Level+1, _Width, TW_TYPE_HELP_ATOM); + } + return n; +} + + +static void CopyHierarchy(CTwVarGroup *dst, const CTwVarGroup *src) +{ + if( dst==NULL || src==NULL ) + return; + + dst->m_Name = src->m_Name; + dst->m_Open = src->m_Open; + dst->m_Visible = src->m_Visible; + dst->m_Color = src->m_Color; + dst->m_DontClip = src->m_DontClip; + dst->m_IsRoot = src->m_IsRoot; + dst->m_LeftMargin = src->m_LeftMargin; + dst->m_TopMargin = src->m_TopMargin; + + dst->m_Vars.resize(src->m_Vars.size()); + for(size_t i=0; im_Vars.size(); ++i) + if( src->m_Vars[i]!=NULL && src->m_Vars[i]->IsGroup() ) + { + CTwVarGroup *grp = new CTwVarGroup; + CopyHierarchy(grp, static_cast(src->m_Vars[i])); + dst->m_Vars[i] = grp; + } + else + dst->m_Vars[i] = NULL; +} + +// copy the 'open' flag from original hierarchy to current hierarchy +static void SynchroHierarchy(CTwVarGroup *cur, const CTwVarGroup *orig) +{ + if( cur==NULL || orig==NULL ) + return; + + if( strcmp(cur->m_Name.c_str(), orig->m_Name.c_str())==0 ) + cur->m_Open = orig->m_Open; + + size_t j = 0; + while( jm_Vars.size() && (orig->m_Vars[j]==NULL || !orig->m_Vars[j]->IsGroup()) ) + ++j; + + for(size_t i=0; im_Vars.size(); ++i) + if( cur->m_Vars[i]!=NULL && cur->m_Vars[i]->IsGroup() && jm_Vars.size() && orig->m_Vars[j]!=NULL && orig->m_Vars[j]->IsGroup() ) + { + CTwVarGroup *curGrp = static_cast(cur->m_Vars[i]); + const CTwVarGroup *origGrp = static_cast(orig->m_Vars[j]); + if( strcmp(curGrp->m_Name.c_str(), origGrp->m_Name.c_str())==0 ) + { + curGrp->m_Open = origGrp->m_Open; + + SynchroHierarchy(curGrp, origGrp); + + ++j; + while( jm_Vars.size() && (orig->m_Vars[j]==NULL || !orig->m_Vars[j]->IsGroup()) ) + ++j; + } + } +} + + +void CTwMgr::UpdateHelpBar() +{ + if( m_HelpBar==NULL || m_HelpBar->IsMinimized() ) + return; + if( !m_HelpBarUpdateNow && (float)m_Timer.GetTime()m_VarRoot); + + TwRemoveAllVars(m_HelpBar); + + if( m_HelpBar->m_UpToDate ) + m_HelpBar->Update(); + + if( m_Help.size()>0 ) + AppendHelpString(&(m_HelpBar->m_VarRoot), m_Help.c_str(), 0, m_HelpBar->m_VarX2-m_HelpBar->m_VarX0, TW_TYPE_HELP_ATOM); + if( m_HelpBar->m_Help.size()>0 ) + AppendHelpString(&(m_HelpBar->m_VarRoot), m_HelpBar->m_Help.c_str(), 0, m_HelpBar->m_VarX2-m_HelpBar->m_VarX0, TW_TYPE_HELP_ATOM); + AppendHelpString(&(m_HelpBar->m_VarRoot), "", 0, m_HelpBar->m_VarX2-m_HelpBar->m_VarX0, TW_TYPE_HELP_HEADER); + + for( size_t ib=0; ibm_IsHelpBar) && m_Bars[ib]!=m_PopupBar && m_Bars[ib]->m_Visible ) + { + // Create a group + CTwVarGroup *Grp = new CTwVarGroup; + Grp->m_SummaryCallback = NULL; + Grp->m_SummaryClientData = NULL; + Grp->m_StructValuePtr = NULL; + if( m_Bars[ib]->m_Label.size()<=0 ) + Grp->m_Name = m_Bars[ib]->m_Name; + else + Grp->m_Name = m_Bars[ib]->m_Label; + Grp->m_Open = true; + Grp->m_Color = m_HelpBar->m_ColGrpText; + m_HelpBar->m_VarRoot.m_Vars.push_back(Grp); + if( m_Bars[ib]->m_Help.size()>0 ) + AppendHelpString(Grp, m_Bars[ib]->m_Help.c_str(), 0, m_HelpBar->m_VarX2-m_HelpBar->m_VarX0, TW_TYPE_HELP_GRP); + + // Append variables (recursive) + AppendHelp(Grp, &(m_Bars[ib]->m_VarRoot), 1, m_HelpBar->m_VarX2-m_HelpBar->m_VarX0); + + // Append structures + StructSet UsedStructs; + InsertUsedStructs(UsedStructs, &(m_Bars[ib]->m_VarRoot)); + CTwVarGroup *StructGrp = NULL; + for( StructSet::iterator it=UsedStructs.begin(); it!=UsedStructs.end(); ++it ) + { + int idx = (*it) - TW_TYPE_STRUCT_BASE; + if( idx>=0 && idx<(int)g_TwMgr->m_Structs.size() && g_TwMgr->m_Structs[idx].m_Name.length()>0 ) + { + if( StructGrp==NULL ) + { + StructGrp = new CTwVarGroup; + StructGrp->m_StructType = TW_TYPE_HELP_STRUCT; // a special line background color will be used + StructGrp->m_Name = "Structures"; + StructGrp->m_Open = false; + StructGrp->m_Color = m_HelpBar->m_ColStructText; + Grp->m_Vars.push_back(StructGrp); + } + CTwVarAtom *Var = new CTwVarAtom; + Var->m_Ptr = NULL; + Var->m_Type = TW_TYPE_HELP_GRP; + Var->m_DontClip = true; + Var->m_LeftMargin = (signed short)(2*g_TwMgr->m_HelpBar->m_Font->m_CharWidth[(int)' ']); + Var->m_TopMargin = 2; + Var->m_ReadOnly = true; + Var->m_NoSlider = true; + Var->m_Name = '{'+g_TwMgr->m_Structs[idx].m_Name+'}'; + StructGrp->m_Vars.push_back(Var); + if( g_TwMgr->m_Structs[idx].m_Help.size()>0 ) + AppendHelpString(StructGrp, g_TwMgr->m_Structs[idx].m_Help.c_str(), 2, m_HelpBar->m_VarX2-m_HelpBar->m_VarX0-2*Var->m_LeftMargin, TW_TYPE_HELP_GRP); + + // Append struct members + for( size_t im=0; imm_Structs[idx].m_Members.size(); ++im ) + { + CTwVarAtom *Var = new CTwVarAtom; + Var->m_Ptr = NULL; + Var->m_Type = TW_TYPE_SHORTCUT; + Var->m_Val.m_Shortcut.m_Incr[0] = 0; + Var->m_Val.m_Shortcut.m_Incr[1] = 0; + Var->m_Val.m_Shortcut.m_Decr[0] = 0; + Var->m_Val.m_Shortcut.m_Decr[1] = 0; + Var->m_ReadOnly = false; + Var->m_NoSlider = true; + if( g_TwMgr->m_Structs[idx].m_Members[im].m_Label.length()>0 ) + Var->m_Name = " "+g_TwMgr->m_Structs[idx].m_Members[im].m_Label; + else + Var->m_Name = " "+g_TwMgr->m_Structs[idx].m_Members[im].m_Name; + StructGrp->m_Vars.push_back(Var); + if( g_TwMgr->m_Structs[idx].m_Members[im].m_Help.size()>0 ) + AppendHelpString(StructGrp, g_TwMgr->m_Structs[idx].m_Members[im].m_Help.c_str(), 3, m_HelpBar->m_VarX2-m_HelpBar->m_VarX0-4*Var->m_LeftMargin, TW_TYPE_HELP_ATOM); + } + } + } + } + + // Append RotoSlider + CTwVarGroup *RotoGrp = new CTwVarGroup; + RotoGrp->m_SummaryCallback = NULL; + RotoGrp->m_SummaryClientData = NULL; + RotoGrp->m_StructValuePtr = NULL; + RotoGrp->m_Name = "RotoSlider"; + RotoGrp->m_Open = false; + RotoGrp->m_Color = m_HelpBar->m_ColGrpText; + m_HelpBar->m_VarRoot.m_Vars.push_back(RotoGrp); + AppendHelpString(RotoGrp, "The RotoSlider allows rapid editing of numerical values.", 0, m_HelpBar->m_VarX2-m_HelpBar->m_VarX0, TW_TYPE_HELP_ATOM); + AppendHelpString(RotoGrp, "To modify a numerical value, click on it, then move the mouse outside of the grey circle while keeping the mouse button pressed, and turn around the circle to increase or decrease the numerical value.", 0, m_HelpBar->m_VarX2-m_HelpBar->m_VarX0, TW_TYPE_HELP_ATOM); + AppendHelpString(RotoGrp, "The two grey lines depict the min and max bounds.", 0, m_HelpBar->m_VarX2-m_HelpBar->m_VarX0, TW_TYPE_HELP_ATOM); + AppendHelpString(RotoGrp, "Moving the mouse far form the circle allows precise increase or decrease, while moving near the circle allows fast increase or decrease.", 0, m_HelpBar->m_VarX2-m_HelpBar->m_VarX0, TW_TYPE_HELP_ATOM); + + SynchroHierarchy(&m_HelpBar->m_VarRoot, &prevHierarchy); + + m_HelpBarNotUpToDate = false; +} + +// --------------------------------------------------------------------------- + +#if defined(ANT_WINDOWS) + +void CTwMgr::CreateCursors() +{ + if( m_CursorsCreated ) + return; + m_CursorArrow = ::LoadCursor(NULL ,MAKEINTRESOURCE(IDC_ARROW)); + m_CursorMove = ::LoadCursor(NULL ,MAKEINTRESOURCE(IDC_SIZEALL)); + m_CursorWE = ::LoadCursor(NULL ,MAKEINTRESOURCE(IDC_SIZEWE)); + m_CursorNS = ::LoadCursor(NULL ,MAKEINTRESOURCE(IDC_SIZENS)); + m_CursorTopRight = ::LoadCursor(NULL ,MAKEINTRESOURCE(IDC_SIZENESW)); + m_CursorTopLeft = ::LoadCursor(NULL ,MAKEINTRESOURCE(IDC_SIZENWSE)); + m_CursorBottomLeft = ::LoadCursor(NULL ,MAKEINTRESOURCE(IDC_SIZENESW)); + m_CursorBottomRight = ::LoadCursor(NULL ,MAKEINTRESOURCE(IDC_SIZENWSE)); + m_CursorHelp = ::LoadCursor(NULL ,MAKEINTRESOURCE(IDC_HELP)); + m_CursorCross = ::LoadCursor(NULL ,MAKEINTRESOURCE(IDC_CROSS)); + m_CursorUpArrow = ::LoadCursor(NULL ,MAKEINTRESOURCE(IDC_UPARROW)); + m_CursorNo = ::LoadCursor(NULL ,MAKEINTRESOURCE(IDC_NO)); + #ifdef IDC_HAND + m_CursorHand = ::LoadCursor(NULL ,MAKEINTRESOURCE(IDC_HAND)); + #else + m_CursorHand = ::LoadCursor(NULL ,MAKEINTRESOURCE(IDC_UPARROW)); + #endif + int cur; + HMODULE hdll = GetModuleHandle(ANT_TWEAK_BAR_DLL); + m_CursorCenter = ::LoadCursor(hdll, MAKEINTRESOURCE(IDC_CURSOR1+0)); + if( m_CursorCenter==NULL ) + m_CursorCenter = ::LoadCursor(NULL ,MAKEINTRESOURCE(IDC_CROSS)); + m_CursorPoint = ::LoadCursor(hdll, MAKEINTRESOURCE(IDC_CURSOR1+1)); + if( m_CursorPoint==NULL ) + m_CursorPoint = ::LoadCursor(NULL ,MAKEINTRESOURCE(IDC_CROSS)); + + for( cur=0; curerror_code, err->request_code); + // No exit! + return 0 ; +} + +static void IgnoreXErrors() +{ + if( g_TwMgr!=NULL && g_TwMgr->m_CurrentXDisplay==glXGetCurrentDisplay() ) + { + XFlush(g_TwMgr->m_CurrentXDisplay); + XSync(g_TwMgr->m_CurrentXDisplay, False); + } + s_PrevErrorHandler = XSetErrorHandler(InactiveErrorHandler); +} + +static void RestoreXErrors() +{ + if( g_TwMgr!=NULL && g_TwMgr->m_CurrentXDisplay==glXGetCurrentDisplay() ) + { + XFlush(g_TwMgr->m_CurrentXDisplay); + XSync(g_TwMgr->m_CurrentXDisplay, False); + } + XSetErrorHandler(s_PrevErrorHandler); +} + +CTwMgr::CCursor CTwMgr::PixmapCursor(int _CurIdx) +{ + if( !m_CurrentXDisplay || !m_CurrentXWindow ) + return XC_left_ptr; + + IgnoreXErrors(); + + XColor black, white, exact; + Colormap colmap = DefaultColormap(m_CurrentXDisplay, DefaultScreen(m_CurrentXDisplay)); + Status s1 = XAllocNamedColor(m_CurrentXDisplay, colmap, "black", &black, &exact); + Status s2 = XAllocNamedColor(m_CurrentXDisplay, colmap, "white", &white, &exact); + if( s1==0 || s2==0 ) + return XC_left_ptr; // cannot allocate colors! + int x, y; + unsigned int mask[32]; + unsigned int pict[32]; + for( y=0; y<32; ++y ) + { + mask[y] = pict[y] = 0; + for( x=0; x<32; ++x ) + { + mask[y] |= (((unsigned int)(g_CurMask[_CurIdx][x+y*32]))<m_CurrentXDisplay ) + { + Window wnd = glXGetCurrentDrawable(); + if( wnd!=g_TwMgr->m_CurrentXWindow ) + { + FreeCursors(); + g_TwMgr->m_CurrentXWindow = wnd; + CreateCursors(); + // now _Cursor is not a valid cursor ID. + } + else + { + IgnoreXErrors(); + XDefineCursor(m_CurrentXDisplay, m_CurrentXWindow, _Cursor); + RestoreXErrors(); + } + } + } +} + +#endif //defined(ANT_UNIX) + +// --------------------------------------------------------------------------- diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/TwMgr.h b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/TwMgr.h new file mode 100644 index 00000000..efc3023e --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/TwMgr.h @@ -0,0 +1,309 @@ +// --------------------------------------------------------------------------- +// +// @file TwMgr.h +// @brief Tweak bar manager. +// @author Philippe Decaudin - http://www.antisphere.com +// @license This file is part of the AntTweakBar library. +// Copyright © 2005, 2006 Philippe Decaudin. +// For conditions of distribution and use, see License.txt +// +// notes: Private header +// TAB=4 +// +// --------------------------------------------------------------------------- + + +#if !defined ANT_TW_MGR_INCLUDED +#define ANT_TW_MGR_INCLUDED + +#include +#define ANT_CALL TW_CALL + +#include "TwColors.h" +#include "TwFonts.h" +#include "TwGraph.h" +#include "AntPerfTimer.h" + + +//#define BENCH // uncomment to activate bench + +#ifdef BENCH +# define PERF(cmd) cmd +#else // BENCH +# define PERF(cmd) +#endif // BENCH + +const int NB_ROTO_CURSORS = 12; + + +// --------------------------------------------------------------------------- +// API unexposed by AntTweakBar.h +// --------------------------------------------------------------------------- + +// bar states -> use TwDefine instead +typedef enum ETwState +{ + TW_STATE_SHOWN = 1, + TW_STATE_ICONIFIED = 2, + TW_STATE_HIDDEN = 3, + TW_STATE_ERROR = 0 +} TwState; +/*ANT_TWEAK_BAR_API*/ int ANT_CALL TwSetBarState(TwBar *bar, TwState state); +/*ANT_TWEAK_BAR_API*/ TwState ANT_CALL TwGetBarState(const TwBar *bar); +// var states -> use TwDefine instead: show/hide/iconify implemented only as string commands +//ANT_TWEAK_BAR_API int ANT_CALL TwSetVarState(TwBar *bar, const char *name, TwState state); +//ANT_TWEAK_BAR_API TwState ANT_CALL TwGetVarState(const TwBar *bar, const char *name); + +typedef void (ANT_CALL *TwStructExtInitCallback)(void *structExtValue, void *clientData); +typedef void (ANT_CALL *TwCopyVarFromExtCallback)(void *structValue, const void *structExtValue, unsigned int structExtMemberIndex, void *clientData); +typedef void (ANT_CALL *TwCopyVarToExtCallback)(const void *structValue, void *structExtValue, unsigned int structExtMemberIndex, void *clientData); +/*ANT_TWEAK_BAR_API*/ TwType ANT_CALL TwDefineStructExt(const char *name, const TwStructMember *structExtMembers, unsigned int nbExtMembers, size_t structSize, size_t structExtSize, TwStructExtInitCallback structExtInitCallback, TwCopyVarFromExtCallback copyVarFromExtCallback, TwCopyVarToExtCallback copyVarToExtCallback, TwSummaryCallback summaryCallback, void *clientData); + + +// --------------------------------------------------------------------------- +// AntTweakBar Manager +// --------------------------------------------------------------------------- + +struct CTwMgr +{ + ETwGraphAPI m_GraphAPI; + void * m_Device; + class ITwGraph * m_Graph; + int m_WndWidth; + int m_WndHeight; + const CTexFont * m_CurrentFont; + + std::vector m_Bars; + std::vector m_Order; + + std::vector m_MinOccupied; + void Minimize(TwBar *_Bar); + void Maximize(TwBar *_Bar); + void Hide(TwBar *_Bar); + void Unhide(TwBar *_Bar); + void SetFont(const CTexFont *_Font, bool _ResizeBars); + int m_LastMouseX; + int m_LastMouseY; + int m_LastMouseWheelPos; + + std::string m_Help; + TwBar * m_HelpBar; + float m_LastHelpUpdateTime; + void UpdateHelpBar(); + bool m_HelpBarNotUpToDate; + bool m_HelpBarUpdateNow; + void * m_KeyPressedTextObj; + bool m_KeyPressedBuildText; + std::string m_KeyPressedStr; + float m_KeyPressedTime; + void * m_InfoTextObj; + bool m_InfoBuildText; + int m_BarInitColorHue; + int FindBar(const char *_Name) const; + int HasAttrib(const char *_Attrib, bool *_HasValue) const; + int SetAttrib(int _AttribID, const char *_Value); + void SetLastError(const char *_StaticErrorMesssage); // _StaticErrorMesssage must be a static string + const char * GetLastError(); // returns a static string describing the error, and set LastError to NULL + const char * CheckLastError() const; // returns the LastError, but does not set it to NULL + void SetCurrentDbgParams(const char *file, int line); + TwBar * m_PopupBar; + CTwMgr(ETwGraphAPI _GraphAPI, void *_Device); + ~CTwMgr(); + + struct CStructMember + { + std::string m_Name; + std::string m_Label; + TwType m_Type; + size_t m_Offset; + std::string m_DefString; + size_t m_Size; + std::string m_Help; + }; + struct CStruct + { + std::string m_Name; + std::vector m_Members; + size_t m_Size; + TwSummaryCallback m_SummaryCallback; + void * m_SummaryClientData; + std::string m_Help; + bool m_IsExt; + size_t m_ClientStructSize; + TwStructExtInitCallback m_StructExtInitCallback; + TwCopyVarFromExtCallback m_CopyVarFromExtCallback; + TwCopyVarToExtCallback m_CopyVarToExtCallback; + void * m_ExtClientData; + CStruct() : m_IsExt(false), m_StructExtInitCallback(NULL), m_CopyVarFromExtCallback(NULL), m_CopyVarToExtCallback(NULL), m_ExtClientData(NULL) {} + static void ANT_CALL DefaultSummary(char *_SummaryString, size_t _SummaryMaxLength, const void *_Value, void *_ClientData); + static void * s_PassProxyAsClientData; + }; + std::vector m_Structs; + + // followings are used for TwAddVarCB( ... StructType ... ) + struct CStructProxy + { + TwType m_Type; + void * m_StructData; + bool m_DeleteStructData; + void * m_StructExtData; + TwSetVarCallback m_StructSetCallback; + TwGetVarCallback m_StructGetCallback; + void * m_StructClientData; + CStructProxy(); + ~CStructProxy(); + }; + struct CMemberProxy + { + CStructProxy * m_StructProxy; + int m_MemberIndex; + struct CTwVar * m_Var; + struct CTwVarGroup * m_VarParent; + CTwBar * m_Bar; + CMemberProxy(); + ~CMemberProxy(); + static void ANT_CALL SetCB(const void *_Value, void *_ClientData); + static void ANT_CALL GetCB(void *_Value, void *_ClientData); + }; + std::list m_StructProxies; // elements should not move + std::list m_MemberProxies; // elements should not move + + struct CEnum + { + std::string m_Name; + typedef std::map CEntries; + CEntries m_Entries; + }; + std::vector m_Enums; + + TwType m_TypeColor32; + TwType m_TypeColor3F; + TwType m_TypeColor4F; + + PerfTimer m_Timer; + double m_LastMousePressedTime; + TwMouseButtonID m_LastMousePressedButtonID; + int m_LastMousePressedPosition[2]; + double m_RepeatMousePressedDelay; + double m_RepeatMousePressedPeriod; + bool m_CanRepeatMousePressed; + bool m_IsRepeatingMousePressed; + + #if defined(ANT_WINDOWS) + typedef HCURSOR CCursor; + #elif defined(ANT_UNIX) + typedef Cursor CCursor; + CCursor PixmapCursor(int _CurIdx); + Display * m_CurrentXDisplay; + Window m_CurrentXWindow; + #endif // defined(ANT_UNIX) + bool m_CursorsCreated; + void CreateCursors(); + void FreeCursors(); + void SetCursor(CCursor _Cursor); + CCursor m_CursorArrow; + CCursor m_CursorMove; + CCursor m_CursorWE; + CCursor m_CursorNS; + CCursor m_CursorTopLeft; + CCursor m_CursorTopRight; + CCursor m_CursorBottomLeft; + CCursor m_CursorBottomRight; + CCursor m_CursorHelp; + CCursor m_CursorHand; + CCursor m_CursorCross; + CCursor m_CursorUpArrow; + CCursor m_CursorNo; + CCursor m_RotoCursors[NB_ROTO_CURSORS]; + CCursor m_CursorCenter; + CCursor m_CursorPoint; + +protected: + int m_NbMinimizedBars; + const char * m_LastError; + const char * m_CurrentDbgFile; + int m_CurrentDbgLine; +}; + +extern CTwMgr *g_TwMgr; + + +// --------------------------------------------------------------------------- +// Extra functions and twtypes +// --------------------------------------------------------------------------- + + +bool TwGetKeyCode(int *_Code, int *_Modif, const char *_String); +bool TwGetKeyString(std::string *_String, int _Code, int _Modif); + +const ETwType TW_TYPE_SHORTCUT = ETwType(0xfff1); +const ETwType TW_TYPE_HELP_GRP = ETwType(0xfff2); +const ETwType TW_TYPE_HELP_ATOM = ETwType(0xfff3); +const ETwType TW_TYPE_HELP_HEADER = ETwType(0xfff4); +const ETwType TW_TYPE_HELP_STRUCT = ETwType(0xfff5); +const ETwType TW_TYPE_BUTTON = ETwType(0xfff6); +const ETwType TW_TYPE_STRUCT_BASE = ETwType(0x10000000); +const ETwType TW_TYPE_ENUM_BASE = ETwType(0x20000000); + + +// --------------------------------------------------------------------------- +// Color struct ext +// --------------------------------------------------------------------------- + + +struct CColorExt +{ + int R, G, B; + int H, L, S; + int A; + bool m_HLS, m_HasAlpha, m_OGL; + bool m_CanHaveAlpha; + bool m_IsColorF; + unsigned int m_PrevConvertedColor; + CTwMgr::CStructProxy*m_StructProxy; + void RGB2HLS(); + void HLS2RGB(); + static void ANT_CALL InitColor32CB(void *_ExtValue, void *_ClientData); + static void ANT_CALL InitColor3FCB(void *_ExtValue, void *_ClientData); + static void ANT_CALL InitColor4FCB(void *_ExtValue, void *_ClientData); + static void ANT_CALL CopyVarFromExtCB(void *_VarValue, const void *_ExtValue, unsigned int _ExtMemberIndex, void *_ClientData); + static void ANT_CALL CopyVarToExtCB(const void *_VarValue, void *_ExtValue, unsigned int _ExtMemberIndex, void *_ClientData); + static void ANT_CALL SummaryCB(char *_SummaryString, size_t _SummaryMaxLength, const void *_ExtValue, void *_ClientData); + static void CreateTypes(); +}; + + +// --------------------------------------------------------------------------- +// CTwFPU objects set and restore the fpu precision if needed. +// (could be usefull because DirectX changes it and AntTweakBar requires default double precision) +// --------------------------------------------------------------------------- + +struct CTwFPU +{ + CTwFPU() + { + #ifdef ANT_WINDOWS + state0 = _controlfp(0, 0); + if( (state0&MCW_PC)==_PC_24 ) // we need at least _PC_53 + _controlfp(_PC_53, MCW_PC); + #else + state0 = 0; + #endif + } + ~CTwFPU() + { + #ifdef ANT_WINDOWS + if( (state0&MCW_PC)==_PC_24 ) + _controlfp(_PC_24, MCW_PC); + #else + state0 = 0; + #endif + } +private: + unsigned int state0; +}; + +// --------------------------------------------------------------------------- + + +#endif // !defined ANT_TW_MGR_INCLUDED diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/TwOpenGL.cpp b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/TwOpenGL.cpp new file mode 100644 index 00000000..c002c84c --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/TwOpenGL.cpp @@ -0,0 +1,574 @@ +// --------------------------------------------------------------------------- +// +// @file TwOpenGL.cpp +// @author Philippe Decaudin - http://www.antisphere.com +// @license This file is part of the AntTweakBar library. +// Copyright © 2005, 2006 Philippe Decaudin. +// For conditions of distribution and use, see License.txt +// +// note: TAB=4 +// +// --------------------------------------------------------------------------- + + +#include "TwPrecomp.h" +#include "LoadOGL.h" +#include "TwOpenGL.h" +#include "TwMgr.h" + +using namespace std; + +const char *g_ErrCantLoadOGL = "Cannot load OpenGL library dynamically"; +const char *g_ErrCantUnloadOGL = "Cannot unload OpenGL library"; + +GLuint g_SmallFontTexID = 0; +GLuint g_NormalFontTexID = 0; +GLuint g_LargeFontTexID = 0; + +// --------------------------------------------------------------------------- +// Extensions + +typedef void (APIENTRY * PFNGLBindBufferARB)(GLenum target, GLuint buffer); +typedef void (APIENTRY * PFNGLBindProgramARB)(GLenum target, GLuint program); +typedef GLuint (APIENTRY * PFNGLGetHandleARB)(GLenum pname); +typedef void (APIENTRY * PFNGLUseProgramObjectARB)(GLuint programObj); +PFNGLBindBufferARB _glBindBufferARB = NULL; +PFNGLBindProgramARB _glBindProgramARB = NULL; +PFNGLGetHandleARB _glGetHandleARB = NULL; +PFNGLUseProgramObjectARB _glUseProgramObjectARB = NULL; +#ifndef GL_ARRAY_BUFFER_ARB +# define GL_ARRAY_BUFFER_ARB 0x8892 +#endif +#ifndef GL_ELEMENT_ARRAY_BUFFER_ARB +# define GL_ELEMENT_ARRAY_BUFFER_ARB 0x8893 +#endif +#ifndef GL_ARRAY_BUFFER_BINDING_ARB +# define GL_ARRAY_BUFFER_BINDING_ARB 0x8894 +#endif +#ifndef GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB +# define GL_ELEMENT_ARRAY_BUFFER_BINDING_ARB 0x8895 +#endif +#ifndef GL_VERTEX_PROGRAM_ARB +# define GL_VERTEX_PROGRAM_ARB 0x8620 +#endif +#ifndef GL_FRAGMENT_PROGRAM_ARB +# define GL_FRAGMENT_PROGRAM_ARB 0x8804 +#endif +#ifndef GL_PROGRAM_OBJECT_ARB +# define GL_PROGRAM_OBJECT_ARB 0x8B40 +#endif + +// --------------------------------------------------------------------------- + +static GLuint BindFont(const CTexFont *_Font) +{ + GLuint TexID = 0; + _glGenTextures(1, &TexID); + _glBindTexture(GL_TEXTURE_2D, TexID); + _glPixelStorei(GL_UNPACK_SWAP_BYTES, GL_FALSE); + _glPixelStorei(GL_UNPACK_LSB_FIRST, GL_FALSE); + _glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); + _glPixelStorei(GL_UNPACK_SKIP_ROWS, 0); + _glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0); + _glPixelStorei(GL_UNPACK_ALIGNMENT, 1); + _glPixelTransferf(GL_ALPHA_SCALE, 1); + _glPixelTransferf(GL_ALPHA_BIAS, 0); + _glPixelTransferf(GL_RED_BIAS, 1); + _glPixelTransferf(GL_GREEN_BIAS, 1); + _glPixelTransferf(GL_BLUE_BIAS, 1); + _glTexImage2D(GL_TEXTURE_2D, 0, 4, _Font->m_TexWidth, _Font->m_TexHeight, 0, GL_ALPHA, GL_UNSIGNED_BYTE, _Font->m_TexBytes); + _glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP); + _glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP); + _glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER,GL_NEAREST); + _glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER,GL_NEAREST); + _glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); + _glBindTexture(GL_TEXTURE_2D, 0); + _glPixelTransferf(GL_ALPHA_BIAS, 0); + _glPixelTransferf(GL_RED_BIAS, 0); + _glPixelTransferf(GL_GREEN_BIAS, 0); + _glPixelTransferf(GL_BLUE_BIAS, 0); + + return TexID; +} + +static void UnbindFont(GLuint _FontTexID) +{ + if( _FontTexID>0 ) + _glDeleteTextures(1, &_FontTexID); +} + +// --------------------------------------------------------------------------- + +int CTwGraphOpenGL::Init() +{ + if( LoadOpenGL()==0 ) + { + g_TwMgr->SetLastError(g_ErrCantLoadOGL); + return 0; + } + + m_Drawing = false; + m_FontTexID = 0; + m_FontTex = NULL; + m_MaxClipPlanes = -1; + + // Get extensions + _glBindBufferARB = reinterpret_cast(_glGetProcAddress("glBindBufferARB")); + _glBindProgramARB = reinterpret_cast(_glGetProcAddress("glBindProgramARB")); + _glGetHandleARB = reinterpret_cast(_glGetProcAddress("glGetHandleARB")); + _glUseProgramObjectARB = reinterpret_cast(_glGetProcAddress("glUseProgramObjectARB")); + + return 1; +} + +// --------------------------------------------------------------------------- + +int CTwGraphOpenGL::Shut() +{ + assert(m_Drawing==false); + + UnbindFont(m_FontTexID); + + int Res = 1; + if( UnloadOpenGL()==0 ) + { + g_TwMgr->SetLastError(g_ErrCantUnloadOGL); + Res = 0; + } + + return Res; +} + +// --------------------------------------------------------------------------- + +void CTwGraphOpenGL::BeginDraw(int _WndWidth, int _WndHeight) +{ + assert(m_Drawing==false && _WndWidth>0 && _WndHeight>0); + m_Drawing = true; + +#ifdef _DEBUG + { + int err=0; + char msg[128]; + while( (err=_glGetError())!=0 ) + { + sprintf(msg, "Before BeginDraw GL_ERROR=0x%x\n", err); + #ifdef ANT_WINDOWS + OutputDebugString(msg); + #endif + fprintf(stderr, msg); + } + } +#endif + + _glPushAttrib(GL_ALL_ATTRIB_BITS); + _glPushClientAttrib(GL_CLIENT_ALL_ATTRIB_BITS); + _glMatrixMode(GL_TEXTURE); + _glPushMatrix(); + _glLoadIdentity(); + _glMatrixMode(GL_MODELVIEW); + _glPushMatrix(); + _glLoadIdentity(); + _glMatrixMode(GL_PROJECTION); + _glPushMatrix(); + GLint Vp[4]; + _glGetIntegerv(GL_VIEWPORT, Vp); + /* + if( _WndWidth>0 && _WndHeight>0 ) + { + Vp[0] = 0; + Vp[1] = 0; + Vp[2] = _WndWidth; + Vp[3] = _WndHeight; + _glViewport(Vp[0], Vp[1], Vp[2], Vp[3]); + } + _glLoadIdentity(); + //_glOrtho(Vp[0], Vp[0]+Vp[2]-1, Vp[1]+Vp[3]-1, Vp[1], -1, 1); // Doesn't work + _glOrtho(Vp[0], Vp[0]+Vp[2], Vp[1]+Vp[3], Vp[1], -1, 1); + */ + if( _WndWidth>0 && _WndHeight>0 ) + { + Vp[0] = 0; + Vp[1] = 0; + Vp[2] = _WndWidth-1; + Vp[3] = _WndHeight-1; + _glViewport(Vp[0], Vp[1], Vp[2], Vp[3]); + } + _glLoadIdentity(); + _glOrtho(Vp[0], Vp[0]+Vp[2], Vp[1]+Vp[3], Vp[1], -1, 1); + + _glGetFloatv(GL_LINE_WIDTH, &m_PrevLineWidth); + _glDisable(GL_POLYGON_STIPPLE); + _glLineWidth(1); + _glDisable(GL_LINE_SMOOTH); + _glDisable(GL_LINE_STIPPLE); + _glDisable(GL_CULL_FACE); + _glDisable(GL_DEPTH_TEST); + _glDisable(GL_LIGHTING); + _glEnable(GL_BLEND); + _glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + _glGetTexEnviv(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, &m_PrevTexEnv); + _glTexEnvi(GL_TEXTURE_ENV, GL_TEXTURE_ENV_MODE, GL_MODULATE); + _glGetIntegerv(GL_POLYGON_MODE, m_PrevPolygonMode); + _glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); + _glDisable(GL_ALPHA_TEST); + //_glEnable(GL_ALPHA_TEST); + //_glAlphaFunc(GL_GREATER, 0); + _glDisable(GL_FOG); + _glDisable(GL_LOGIC_OP); + _glDisable(GL_SCISSOR_TEST); + if( m_MaxClipPlanes<0 ) + { + _glGetIntegerv(GL_MAX_CLIP_PLANES, &m_MaxClipPlanes); + if( m_MaxClipPlanes<0 || m_MaxClipPlanes>255 ) + m_MaxClipPlanes = 6; + } + for( int i=0; i_X1) + ++_X0; + if(_Y0<_Y1) + ++_Y1; + else if(_Y0>_Y1) + ++_Y0; + */ + const GLfloat dx = +0.0f; + //GLfloat dy = -0.2f; + const GLfloat dy = -0.5f; + if( _AntiAliased ) + _glEnable(GL_LINE_SMOOTH); + else + _glDisable(GL_LINE_SMOOTH); + _glDisable(GL_TEXTURE_2D); + _glMatrixMode(GL_MODELVIEW); + _glLoadIdentity(); + _glBegin(GL_LINES); + _glColor4ub(GLubyte(_Color0>>16), GLubyte(_Color0>>8), GLubyte(_Color0), GLubyte(_Color0>>24)); + _glVertex2f((GLfloat)_X0+dx, (GLfloat)_Y0+dy); + _glColor4ub(GLubyte(_Color1>>16), GLubyte(_Color1>>8), GLubyte(_Color1), GLubyte(_Color1>>24)); + _glVertex2f((GLfloat)_X1+dx, (GLfloat)_Y1+dy); + //_glVertex2i(_X0, _Y0); + //_glVertex2i(_X1, _Y1); + _glEnd(); + _glDisable(GL_LINE_SMOOTH); +} + +// --------------------------------------------------------------------------- + +void CTwGraphOpenGL::DrawRect(int _X0, int _Y0, int _X1, int _Y1, color32 _Color00, color32 _Color10, color32 _Color01, color32 _Color11) +{ + assert(m_Drawing==true); + + /* + // border adjustment + if(_X0<_X1) + ++_X1; + else if(_X0>_X1) + ++_X0; + if(_Y0<_Y1) + ++_Y1; + else if(_Y0>_Y1) + ++_Y0; + */ + // border adjustment + if(_X0<_X1) + ++_X1; + else if(_X0>_X1) + ++_X0; + if(_Y0<_Y1) + --_Y0; + else if(_Y0>_Y1) + --_Y1; + const GLfloat dx = +0.0f; + const GLfloat dy = +0.0f; + + _glDisable(GL_TEXTURE_2D); + _glMatrixMode(GL_MODELVIEW); + _glLoadIdentity(); + //GLubyte r = GLubyte(_Color>>16); + //GLubyte g = GLubyte(_Color>>8); + //GLubyte b = GLubyte(_Color); + //GLubyte a = GLubyte(_Color>>24); + //_glColor4ub(GLubyte(_Color>>16), GLubyte(_Color>>8), GLubyte(_Color), GLubyte(_Color>>24)); + //_glColor4ub(r, g, b, a); + _glBegin(GL_QUADS); + _glColor4ub(GLubyte(_Color00>>16), GLubyte(_Color00>>8), GLubyte(_Color00), GLubyte(_Color00>>24)); + _glVertex2f((GLfloat)_X0+dx, (GLfloat)_Y0+dy); + _glColor4ub(GLubyte(_Color10>>16), GLubyte(_Color10>>8), GLubyte(_Color10), GLubyte(_Color10>>24)); + _glVertex2f((GLfloat)_X1+dx, (GLfloat)_Y0+dy); + _glColor4ub(GLubyte(_Color11>>16), GLubyte(_Color11>>8), GLubyte(_Color11), GLubyte(_Color11>>24)); + _glVertex2f((GLfloat)_X1+dx, (GLfloat)_Y1+dy); + _glColor4ub(GLubyte(_Color01>>16), GLubyte(_Color01>>8), GLubyte(_Color01), GLubyte(_Color01>>24)); + _glVertex2f((GLfloat)_X0+dx, (GLfloat)_Y1+dy); + _glEnd(); +} + +// --------------------------------------------------------------------------- + +void *CTwGraphOpenGL::NewTextObj() +{ + return new CTextObj; +} + +// --------------------------------------------------------------------------- + +void CTwGraphOpenGL::DeleteTextObj(void *_TextObj) +{ + assert(_TextObj!=NULL); + delete static_cast(_TextObj); +} + +// --------------------------------------------------------------------------- + +void CTwGraphOpenGL::BuildText(void *_TextObj, const std::string *_TextLines, color32 *_LineColors, color32 *_LineBgColors, int _NbLines, const CTexFont *_Font, int _Sep, int _BgWidth) +{ + assert(m_Drawing==true); + assert(_TextObj!=NULL); + assert(_Font!=NULL); + + if( _Font != m_FontTex ) + { + UnbindFont(m_FontTexID); + m_FontTexID = BindFont(_Font); + m_FontTex = _Font; + } + CTextObj *TextObj = static_cast(_TextObj); + TextObj->m_TextVerts.resize(0); + TextObj->m_TextUVs.resize(0); + TextObj->m_BgVerts.resize(0); + TextObj->m_Colors.resize(0); + TextObj->m_BgColors.resize(0); + + int x, x1, y, y1, i, Len; + unsigned char ch; + const unsigned char *Text; + color32 LineColor = COLOR32_RED; + for( int Line=0; Line<_NbLines; ++Line ) + { + x = 0; + y = Line * (_Font->m_CharHeight+_Sep); + y1 = y+_Font->m_CharHeight; + Len = (int)_TextLines[Line].length(); + Text = (const unsigned char *)(_TextLines[Line].c_str()); + if( _LineColors!=NULL ) + LineColor = (_LineColors[Line]&0xff00ff00) | GLubyte(_LineColors[Line]>>16) | (GLubyte(_LineColors[Line])<<16); + + for( i=0; im_CharWidth[ch]; + + TextObj->m_TextVerts.push_back(Vec2(x , y )); + TextObj->m_TextVerts.push_back(Vec2(x1, y )); + TextObj->m_TextVerts.push_back(Vec2(x , y1)); + TextObj->m_TextVerts.push_back(Vec2(x1, y )); + TextObj->m_TextVerts.push_back(Vec2(x1, y1)); + TextObj->m_TextVerts.push_back(Vec2(x , y1)); + + TextObj->m_TextUVs.push_back(Vec2(_Font->m_CharU0[ch], _Font->m_CharV0[ch])); + TextObj->m_TextUVs.push_back(Vec2(_Font->m_CharU1[ch], _Font->m_CharV0[ch])); + TextObj->m_TextUVs.push_back(Vec2(_Font->m_CharU0[ch], _Font->m_CharV1[ch])); + TextObj->m_TextUVs.push_back(Vec2(_Font->m_CharU1[ch], _Font->m_CharV0[ch])); + TextObj->m_TextUVs.push_back(Vec2(_Font->m_CharU1[ch], _Font->m_CharV1[ch])); + TextObj->m_TextUVs.push_back(Vec2(_Font->m_CharU0[ch], _Font->m_CharV1[ch])); + + if( _LineColors!=NULL ) + { + TextObj->m_Colors.push_back(LineColor); + TextObj->m_Colors.push_back(LineColor); + TextObj->m_Colors.push_back(LineColor); + TextObj->m_Colors.push_back(LineColor); + TextObj->m_Colors.push_back(LineColor); + TextObj->m_Colors.push_back(LineColor); + } + + x = x1; + } + if( _BgWidth>0 && Len>0 ) + { + TextObj->m_BgVerts.push_back(Vec2(-1 , y )); + TextObj->m_BgVerts.push_back(Vec2(_BgWidth+1, y )); + TextObj->m_BgVerts.push_back(Vec2(-1 , y1)); + TextObj->m_BgVerts.push_back(Vec2(_BgWidth+1, y )); + TextObj->m_BgVerts.push_back(Vec2(_BgWidth+1, y1)); + TextObj->m_BgVerts.push_back(Vec2(-1 , y1)); + + if( _LineBgColors!=NULL ) + { + color32 LineBgColor = (_LineBgColors[Line]&0xff00ff00) | GLubyte(_LineBgColors[Line]>>16) | (GLubyte(_LineBgColors[Line])<<16); + TextObj->m_BgColors.push_back(LineBgColor); + TextObj->m_BgColors.push_back(LineBgColor); + TextObj->m_BgColors.push_back(LineBgColor); + TextObj->m_BgColors.push_back(LineBgColor); + TextObj->m_BgColors.push_back(LineBgColor); + TextObj->m_BgColors.push_back(LineBgColor); + } + } + } +} + +// --------------------------------------------------------------------------- + +void CTwGraphOpenGL::DrawText(void *_TextObj, int _X, int _Y, color32 _Color, color32 _BgColor) +{ + assert(m_Drawing==true); + assert(_TextObj!=NULL); + CTextObj *TextObj = static_cast(_TextObj); + + if( TextObj->m_TextVerts.size()<4 ) + return; // no character to draw + + _glMatrixMode(GL_MODELVIEW); + _glLoadIdentity(); + _glTranslatef((GLfloat)_X, (GLfloat)_Y, 0); + _glEnableClientState(GL_VERTEX_ARRAY); + if( (_BgColor!=0 || TextObj->m_BgColors.size()==TextObj->m_BgVerts.size()) && TextObj->m_BgVerts.size()>=4 ) + { + _glDisable(GL_TEXTURE_2D); + _glVertexPointer(2, GL_FLOAT, 0, &(TextObj->m_BgVerts[0])); + if( TextObj->m_BgColors.size()==TextObj->m_BgVerts.size() && _BgColor==0 ) + { + _glEnableClientState(GL_COLOR_ARRAY); + _glColorPointer(4, GL_UNSIGNED_BYTE, 0, &(TextObj->m_BgColors[0])); + } + else + { + _glDisableClientState(GL_COLOR_ARRAY); + _glColor4ub(GLubyte(_BgColor>>16), GLubyte(_BgColor>>8), GLubyte(_BgColor), GLubyte(_BgColor>>24)); + } + _glDrawArrays(GL_TRIANGLES, 0, (int)TextObj->m_BgVerts.size()); + } + _glEnable(GL_TEXTURE_2D); + _glBindTexture(GL_TEXTURE_2D, m_FontTexID); + _glEnableClientState(GL_TEXTURE_COORD_ARRAY); + _glVertexPointer(2, GL_FLOAT, 0, &(TextObj->m_TextVerts[0])); + _glTexCoordPointer(2, GL_FLOAT, 0, &(TextObj->m_TextUVs[0])); + if( TextObj->m_Colors.size()==TextObj->m_TextVerts.size() && _Color==0 ) + { + _glEnableClientState(GL_COLOR_ARRAY); + _glColorPointer(4, GL_UNSIGNED_BYTE, 0, &(TextObj->m_Colors[0])); + } + else + { + _glDisableClientState(GL_COLOR_ARRAY); + _glColor4ub(GLubyte(_Color>>16), GLubyte(_Color>>8), GLubyte(_Color), GLubyte(_Color>>24)); + } + + _glDrawArrays(GL_TRIANGLES, 0, (int)TextObj->m_TextVerts.size()); + + _glDisableClientState(GL_VERTEX_ARRAY); + _glDisableClientState(GL_TEXTURE_COORD_ARRAY); + _glDisableClientState(GL_COLOR_ARRAY); +} + +// --------------------------------------------------------------------------- diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/TwOpenGL.h b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/TwOpenGL.h new file mode 100644 index 00000000..af02ed0d --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/TwOpenGL.h @@ -0,0 +1,72 @@ +// --------------------------------------------------------------------------- +// +// @file TwOpenGL.h +// @brief OpenGL graph functions +// @author Philippe Decaudin - http://www.antisphere.com +// @license This file is part of the AntTweakBar library. +// Copyright © 2005, 2006 Philippe Decaudin. +// For conditions of distribution and use, see License.txt +// +// notes: Private header +// TAB=4 +// +// --------------------------------------------------------------------------- + + +#if !defined ANT_TW_OPENGL_INCLUDED +#define ANT_TW_OPENGL_INCLUDED + +#include "TwGraph.h" + +// --------------------------------------------------------------------------- + +class CTwGraphOpenGL : public ITwGraph +{ +public: + virtual int Init(); + virtual int Shut(); + virtual void BeginDraw(int _WndWidth, int _WndHeight); + virtual void EndDraw(); + virtual bool IsDrawing(); + virtual void Restore(); + virtual void DrawLine(int _X0, int _Y0, int _X1, int _Y1, color32 _Color0, color32 _Color1, bool _AntiAliased=false); + virtual void DrawLine(int _X0, int _Y0, int _X1, int _Y1, color32 _Color, bool _AntiAliased=false) { DrawLine(_X0, _Y0, _X1, _Y1, _Color, _Color, _AntiAliased); } + virtual void DrawRect(int _X0, int _Y0, int _X1, int _Y1, color32 _Color00, color32 _Color10, color32 _Color01, color32 _Color11); + virtual void DrawRect(int _X0, int _Y0, int _X1, int _Y1, color32 _Color) { DrawRect(_X0, _Y0, _X1, _Y1, _Color, _Color, _Color, _Color); } + + + virtual void * NewTextObj(); + virtual void DeleteTextObj(void *_TextObj); + virtual void BuildText(void *_TextObj, const std::string *_TextLines, color32 *_LineColors, color32 *_LineBgColors, int _NbLines, const CTexFont *_Font, int _Sep, int _BgWidth); + virtual void DrawText(void *_TextObj, int _X, int _Y, color32 _Color, color32 _BgColor); + +protected: + bool m_Drawing; + GLuint m_FontTexID; + const CTexFont * m_FontTex; + GLfloat m_PrevLineWidth; + GLint m_PrevTexEnv; + GLint m_PrevPolygonMode[2]; + GLint m_MaxClipPlanes; + GLint m_PrevTexture; + GLint m_PrevArrayBufferARB; + GLint m_PrevElementArrayBufferARB; + GLboolean m_PrevVertexProgramARB; + GLboolean m_PrevFragmentProgramARB; + GLuint m_PrevProgramObjectARB; + + struct Vec2 { GLfloat x, y; Vec2(){} Vec2(GLfloat _X, GLfloat _Y):x(_X),y(_Y){} Vec2(int _X, int _Y):x(GLfloat(_X)),y(GLfloat(_Y)){} }; + struct CTextObj + { + std::vector m_TextVerts; + std::vector m_TextUVs; + std::vector m_BgVerts; + std::vectorm_Colors; + std::vectorm_BgColors; + }; +}; + +// --------------------------------------------------------------------------- + + +#endif // !defined ANT_TW_OPENGL_INCLUDED diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/TwPrecomp.cpp b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/TwPrecomp.cpp new file mode 100644 index 00000000..6c9502e2 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/TwPrecomp.cpp @@ -0,0 +1 @@ +#include "TwPrecomp.h" diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/TwPrecomp.h b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/TwPrecomp.h new file mode 100644 index 00000000..c1e517a4 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/TwPrecomp.h @@ -0,0 +1,65 @@ +// --------------------------------------------------------------------------- +// +// @file TwPrecomp.h +// @brief Precompiled header +// @author Philippe Decaudin - http://www.antisphere.com +// @license This file is part of the AntTweakBar library. +// Copyright © 2005, 2006 Philippe Decaudin. +// For conditions of distribution and use, see License.txt +// +// notes: Private header +// TAB=4 +// +// --------------------------------------------------------------------------- + + +#if !defined ANT_TW_PRECOMP_INCLUDED +#define ANT_TW_PRECOMP_INCLUDED + + +#if defined _MSC_VER +# pragma warning(disable: 4514) // unreferenced inline function has been removed +# pragma warning(disable: 4710) // function not inlined +# pragma warning(disable: 4786) // template name truncated +# pragma warning(disable: 4530) // exceptions not handled +# define _CRT_SECURE_NO_DEPRECATE // visual 8 secure crt warning +#endif + +#include +#include +#include +#include + +#if defined(_MSC_VER) && _MSC_VER<=1200 +# pragma warning(push, 3) +#endif +#include +#include +#include +#include +#include +#if defined(_MSC_VER) && _MSC_VER<=1200 +# pragma warning(pop) +#endif +#if defined(_UNIX) +# define ANT_UNIX +# include +# include +# undef _WIN32 +# undef WIN32 +# undef _WIN64 +# undef WIN64 +# undef _WINDOWS +# undef ANT_WINDOWS +#elif defined(_WINDOWS) || defined(WIN32) || defined(WIN64) || defined(_WIN32) || defined(_WIN64) +# define ANT_WINDOWS +# define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers +# include +# include +#endif // defined _WINDOWS + +#include // must be included after windows.h +#define ANT_OGL_HEADER_INCLUDED + + +#endif // !defined ANT_TW_PRECOMP_INCLUDED diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/res/FontChars.txt b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/res/FontChars.txt new file mode 100644 index 00000000..70e53937 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/res/FontChars.txt @@ -0,0 +1,232 @@ + !"#$%&'()*+,-./0123456789:;<=>? +@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_ +`abcdefghijklmnopqrstuvwxyz{|}~ +€‚ƒ„…†‡ˆ‰Š‹ŒŽ‘’“”•–—˜™š›œžŸ + ¡¢£¤¥¦§¨©ª«¬­®¯°±²³´µ¶·¸¹º»¼½¾¿ +ÀÁÂÃÄÅÆÇÈÉÊËÌÍÎÏÐÑÒÓÔÕÖרÙÚÛÜÝÞß +àáâãäåæçèéêëìíîïðñòóôõö÷øùúûüýþÿ + +032 +033 ! +034 " +035 # +036 $ +037 % +038 & +039 ' +040 ( +041 ) +042 * +043 + +044 , +045 - +046 . +047 / +048 0 +049 1 +050 2 +051 3 +052 4 +053 5 +054 6 +055 7 +056 8 +057 9 +058 : +059 ; +060 < +061 = +062 > +063 ? +064 @ +065 A +066 B +067 C +068 D +069 E +070 F +071 G +072 H +073 I +074 J +075 K +076 L +077 M +078 N +079 O +080 P +081 Q +082 R +083 S +084 T +085 U +086 V +087 W +088 X +089 Y +090 Z +091 [ +092 \ +093 ] +094 ^ +095 _ +096 ` +097 a +098 b +099 c +100 d +101 e +102 f +103 g +104 h +105 i +106 j +107 k +108 l +109 m +110 n +111 o +112 p +113 q +114 r +115 s +116 t +117 u +118 v +119 w +120 x +121 y +122 z +123 { +124 | +125 } +126 ~ +127  +128 € +129 +130 ‚ +131 ƒ +132 „ +133 … +134 † +135 ‡ +136 ˆ +137 ‰ +138 Š +139 ‹ +140 Œ +141 +142 Ž +143 +144 +145 ‘ +146 ’ +147 “ +148 ” +149 • +150 – +151 — +152 ˜ +153 ™ +154 š +155 › +156 œ +157 +158 ž +159 Ÿ +160   +161 ¡ +162 ¢ +163 £ +164 ¤ +165 ¥ +166 ¦ +167 § +168 ¨ +169 © +170 ª +171 « +172 ¬ +173 ­ +174 ® +175 ¯ +176 ° +177 ± +178 ² +179 ³ +180 ´ +181 µ +182 ¶ +183 · +184 ¸ +185 ¹ +186 º +187 » +188 ¼ +189 ½ +190 ¾ +191 ¿ +192 À +193 Á +194  +195 à +196 Ä +197 Å +198 Æ +199 Ç +200 È +201 É +202 Ê +203 Ë +204 Ì +205 Í +206 Î +207 Ï +208 Ð +209 Ñ +210 Ò +211 Ó +212 Ô +213 Õ +214 Ö +215 × +216 Ø +217 Ù +218 Ú +219 Û +220 Ü +221 Ý +222 Þ +223 ß +224 à +225 á +226 â +227 ã +228 ä +229 å +230 æ +231 ç +232 è +233 é +234 ê +235 ë +236 ì +237 í +238 î +239 ï +240 ð +241 ñ +242 ò +243 ó +244 ô +245 õ +246 ö +247 ÷ +248 ø +249 ù +250 ú +251 û +252 ü +253 ý +254 þ +255 ÿ \ No newline at end of file diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/res/FontLargeAA.pgm b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/res/FontLargeAA.pgm new file mode 100644 index 00000000..ee35d38f --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/res/FontLargeAA.pgm @@ -0,0 +1,1197 @@ +P2 +# Created by Paint Shop Pro +276 120 +255 +127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 59 245 125 175 225 21 +0 0 0 0 0 0 0 0 0 0 0 0 0 138 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 59 241 89 0 0 12 235 201 89 255 166 0 0 0 0 0 172 89 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 89 225 21 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 138 247 34 0 12 +232 89 138 225 21 0 0 0 0 138 125 7 199 34 0 0 0 0 138 125 0 0 0 0 138 +255 255 201 0 0 0 59 215 21 0 0 0 0 59 245 255 255 166 0 0 0 59 241 89 +0 7 206 201 0 0 89 251 89 0 59 215 21 172 89 59 192 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 175 166 0 0 138 255 251 89 0 0 0 0 0 +138 201 0 0 0 7 206 255 255 255 166 0 0 7 206 255 255 255 201 0 0 0 0 0 +0 138 251 89 0 0 175 255 255 255 255 225 21 0 0 12 235 255 255 125 89 255 +255 255 255 255 251 89 0 12 235 255 255 225 21 0 0 59 245 255 255 166 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 59 245 255 255 251 89 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 89 247 +34 0 12 232 89 138 201 0 0 0 0 7 202 89 59 215 21 0 0 12 235 255 255 255 +166 0 59 241 89 12 235 125 0 0 172 89 0 0 0 0 7 206 166 0 89 251 89 0 0 +12 228 34 0 89 247 34 0 0 0 175 201 0 0 89 251 191 194 247 34 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 232 89 0 175 201 0 12 235 +125 0 0 138 255 255 201 0 0 0 12 182 0 0 59 245 125 0 12 206 21 0 12 235 +166 0 0 0 0 89 255 251 89 0 0 175 201 0 0 0 0 0 0 89 255 125 0 0 0 0 0 +0 0 0 89 251 89 12 235 166 0 7 206 201 0 59 245 125 0 12 235 166 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 89 166 0 0 138 251 89 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 89 247 34 0 12 +228 34 89 201 0 0 0 0 12 206 21 89 166 0 0 12 235 125 138 125 59 192 0 +89 247 34 7 206 166 0 89 201 0 0 0 0 0 12 235 125 0 12 232 89 0 0 12 228 +34 0 175 201 0 0 0 0 59 241 89 0 0 7 206 166 0 0 0 0 0 0 0 138 166 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 89 225 21 59 241 89 0 0 138 225 21 0 +0 0 175 201 0 0 0 0 0 0 0 7 206 201 0 0 0 0 0 0 175 201 0 0 0 59 241 132 +241 89 0 0 175 201 0 0 0 0 0 7 206 166 0 0 0 0 0 0 0 0 7 206 201 0 59 241 +89 0 0 138 225 21 138 225 21 0 0 138 225 21 89 255 125 0 0 89 255 125 0 +0 0 0 0 0 0 0 138 225 21 0 0 0 0 0 0 0 0 0 0 0 138 201 0 0 0 0 0 0 0 0 +0 0 0 59 241 89 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 89 247 34 0 0 0 0 0 0 0 +0 89 255 255 255 255 255 255 255 125 59 238 34 138 125 0 0 0 89 247 34 +7 206 166 7 202 89 0 0 0 0 0 0 175 225 21 138 225 21 0 0 0 0 0 12 235 125 +0 0 0 0 7 206 125 0 89 251 191 194 247 34 0 0 0 0 0 138 166 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 138 166 0 89 247 34 0 0 89 247 34 0 0 0 175 201 +0 0 0 0 0 0 0 12 235 166 0 0 0 0 0 59 245 125 0 0 12 235 125 59 241 89 +0 0 175 201 0 0 0 0 0 59 241 89 0 0 0 0 0 0 0 0 89 247 34 0 12 235 201 +0 0 175 201 0 138 225 21 0 0 89 247 34 89 255 125 0 0 89 255 125 0 0 0 +0 0 12 235 255 225 21 0 0 0 0 0 0 0 0 0 0 0 0 0 175 255 251 89 0 0 0 0 +0 0 0 0 138 247 34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 89 247 34 0 0 0 0 0 +0 0 0 0 0 175 125 7 199 34 0 0 12 235 166 138 125 0 0 0 59 241 89 12 235 +125 89 201 12 235 255 251 89 0 0 7 206 255 166 0 59 241 89 0 0 0 59 238 +34 0 0 0 0 0 175 166 59 215 21 172 89 59 192 0 0 0 0 0 138 166 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 206 125 0 138 247 34 0 0 89 247 34 0 0 0 +175 201 0 0 0 0 0 0 0 89 251 89 0 0 0 89 255 247 34 0 0 7 206 166 0 59 +241 89 0 0 175 255 255 255 225 21 0 89 251 226 255 255 247 34 0 0 0 7 206 +166 0 0 0 12 235 255 255 201 0 0 89 255 125 0 0 138 247 34 0 0 0 0 0 0 +0 0 0 0 0 89 255 255 166 0 0 0 0 0 175 255 255 255 255 255 255 225 21 0 +0 0 0 59 245 255 201 0 0 0 0 0 175 251 89 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 +0 0 89 225 21 0 0 0 0 0 0 0 0 0 7 199 34 59 215 21 0 0 0 59 245 255 255 +201 0 0 0 138 255 255 201 12 228 34 175 166 0 138 201 0 12 235 125 89 255 +125 59 241 89 0 0 0 59 238 34 0 0 0 0 0 138 201 0 0 0 172 89 0 0 0 7 206 +255 255 255 255 255 255 247 34 0 0 0 0 89 255 255 255 166 0 0 0 0 0 59 +238 34 0 138 247 34 0 0 89 247 34 0 0 0 175 201 0 0 0 0 0 0 59 245 166 +0 0 0 0 0 0 12 235 166 0 138 201 0 0 59 241 89 0 0 0 0 0 12 235 201 0 138 +251 89 0 0 175 225 21 0 0 89 247 34 0 0 7 206 166 0 175 255 166 0 0 89 +255 255 255 223 247 34 0 0 0 0 0 0 0 0 0 0 175 247 34 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 7 206 225 21 0 0 175 225 21 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 127 0 0 0 0 0 59 215 21 0 0 0 0 0 0 0 12 235 255 255 255 255 255 255 +166 0 0 0 0 138 125 175 225 21 0 0 0 0 0 138 166 7 206 125 0 89 247 34 +138 225 21 0 89 255 166 215 21 0 0 0 59 238 34 0 0 0 0 0 138 201 0 0 0 +0 0 0 0 0 0 0 0 0 138 166 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 138 201 0 +0 89 247 34 0 0 89 247 34 0 0 0 175 201 0 0 0 0 0 12 235 201 0 0 0 0 0 +0 0 0 138 225 21 175 255 255 255 255 255 255 125 0 0 0 0 0 138 247 34 89 +247 34 0 0 59 241 89 0 7 206 166 0 0 0 138 247 34 0 0 138 247 34 0 0 0 +0 0 138 225 21 0 0 0 0 0 0 0 0 0 0 0 89 255 255 166 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 59 245 255 201 0 0 0 0 175 201 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 89 166 0 175 125 0 0 0 0 0 0 138 +125 89 247 34 0 0 0 0 12 228 34 7 206 125 0 89 247 34 138 247 34 0 0 89 +255 166 0 0 0 0 59 238 34 0 0 0 0 0 175 166 0 0 0 0 0 0 0 0 0 0 0 0 138 +166 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 206 125 0 0 59 241 89 0 0 138 225 +21 0 0 0 175 201 0 0 0 0 12 235 201 0 0 0 0 0 0 0 0 0 138 225 21 0 0 0 +0 59 241 89 0 0 0 0 0 0 138 225 21 59 241 89 0 0 59 241 89 0 89 247 34 +0 0 0 138 247 34 0 0 89 251 89 0 0 0 0 7 206 166 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 12 235 255 225 21 0 0 175 255 255 255 255 255 255 225 21 0 0 175 +255 251 89 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 89 247 +34 0 0 0 0 0 0 0 0 0 175 125 7 199 34 0 0 0 89 201 0 138 125 175 201 0 +0 0 0 0 138 166 0 0 175 166 0 138 201 0 89 255 166 0 0 89 255 255 125 0 +0 0 12 235 125 0 0 0 0 7 206 125 0 0 0 0 0 0 0 0 0 0 0 0 138 166 0 0 0 +0 0 138 255 125 0 0 0 0 0 0 175 247 34 59 238 34 0 0 0 175 201 0 12 235 +125 0 0 0 0 175 201 0 0 0 12 235 166 0 0 0 0 0 89 166 0 0 59 245 166 0 +0 0 0 0 59 241 89 0 59 215 21 0 12 235 166 0 7 206 201 0 0 175 225 21 7 +206 166 0 0 0 0 59 245 166 0 7 206 225 21 0 0 0 0 175 225 21 0 89 255 125 +0 0 12 235 201 0 0 0 0 0 0 0 0 138 225 21 0 0 0 0 0 0 0 0 0 0 0 138 201 +0 0 0 0 0 0 0 0 0 175 225 21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 89 247 +34 0 0 0 0 0 0 0 0 7 199 34 59 215 21 0 0 0 12 235 255 255 255 201 0 0 +0 0 0 59 215 21 0 0 12 235 255 251 89 0 0 89 255 255 255 201 0 89 255 0 +0 0 0 175 201 0 0 0 0 59 238 34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 175 +201 0 0 0 0 0 0 0 175 247 34 138 201 0 0 0 0 0 138 255 251 89 0 0 0 138 +255 255 255 255 166 0 89 255 255 255 255 255 247 34 12 235 255 255 255 +166 0 0 0 0 0 0 59 241 89 0 12 235 255 255 255 166 0 0 0 7 206 255 255 +225 21 0 138 247 34 0 0 0 0 0 59 245 255 255 201 0 0 0 175 255 255 201 +0 0 0 89 255 125 0 0 89 251 89 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 175 225 21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 138 125 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 89 247 34 0 0 0 175 201 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 232 89 0 0 0 0 0 0 0 0 0 0 175 125 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 175 201 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 138 125 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 206 201 0 0 89 251 89 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 89 201 0 0 0 0 0 0 0 0 0 0 12 232 89 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 232 89 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 201 0 0 201 201 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 127 127 0 127 127 127 +127 0 127 127 127 127 127 0 127 127 127 127 127 127 127 127 127 0 127 127 +127 127 127 127 127 0 127 127 127 127 127 127 127 127 127 127 127 127 127 +0 127 127 127 127 127 127 127 127 0 127 127 0 127 127 127 127 0 127 127 +127 127 0 127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 127 +127 0 127 127 127 0 127 127 127 127 0 127 127 127 0 127 127 127 127 0 127 +127 127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 +127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 +0 127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 +127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 +0 127 127 127 0 127 127 127 127 127 0 127 127 127 127 127 127 127 127 127 +0 127 127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 127 127 +0 127 127 127 127 127 127 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 206 255 255 +201 0 138 201 0 0 0 0 89 255 255 255 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 127 0 0 0 0 175 255 255 255 247 34 0 0 0 0 0 7 206 251 89 0 0 12 0 +235 255 255 255 255 201 0 0 0 0 59 245 255 255 255 201 12 0 235 255 255 +255 255 166 0 0 0 12 235 255 255 255 255 255 127 12 235 255 255 255 255 +251 89 0 0 12 235 255 255 255 251 89 12 235 166 0 0 0 12 235 125 89 255 +255 255 201 0 0 175 255 255 225 21 12 235 166 0 0 7 206 251 102 0 235 166 +0 0 0 0 12 235 251 89 0 0 0 89 255 225 21 12 235 251 89 0 0 12 235 125 +0 0 0 138 255 255 166 0 0 0 12 235 255 255 255 251 89 0 0 0 0 175 255 255 +201 0 0 0 12 235 255 255 255 251 89 0 0 0 12 235 255 255 255 247 47 235 +255 255 255 255 255 255 255 138 0 235 125 0 0 0 59 245 133 206 166 0 0 +0 0 59 245 255 133 201 0 0 0 138 251 89 0 0 12 235 133 206 247 34 0 0 0 +175 229 216 225 21 0 0 0 138 247 124 255 255 255 255 255 255 125 7 206 +125 0 0 0 59 238 34 0 0 0 0 0 12 235 125 0 0 0 0 175 247 34 0 0 0 0 0 0 +0 0 0 0 127 0 0 59 245 166 0 0 0 59 245 166 0 0 0 0 59 245 255 166 0 0 +12 0 235 166 0 0 59 245 125 0 0 138 255 125 0 0 7 202 102 0 235 166 0 0 +59 245 225 21 0 12 235 166 0 0 0 0 0 12 235 166 0 0 0 0 0 0 89 255 166 +0 0 0 89 127 12 235 166 0 0 0 12 235 125 0 12 235 125 0 0 0 0 0 138 225 +21 12 235 166 0 7 206 225 21 12 0 235 166 0 0 0 0 12 235 255 166 0 0 7 +206 255 225 21 12 235 255 201 0 0 12 235 125 0 59 245 166 0 0 138 251 89 +0 12 235 166 0 0 138 251 89 0 89 255 125 0 0 89 255 125 0 12 235 166 0 +0 138 251 89 0 12 235 166 0 0 7 202 89 0 0 0 138 225 21 0 0 12 0 235 125 +0 0 0 59 245 125 138 225 21 0 0 0 138 225 151 34 247 34 0 0 175 255 125 +0 0 89 247 34 12 235 166 0 0 89 247 34 59 245 125 0 0 59 245 125 0 0 0 +0 0 138 247 34 7 206 125 0 0 0 7 206 125 0 0 0 0 0 12 235 125 0 0 0 138 +225 187 201 0 0 0 0 0 0 0 0 0 0 127 0 12 232 89 0 0 0 0 0 12 232 89 0 0 +0 138 225 151 225 21 0 12 0 235 166 0 0 12 235 166 0 12 235 166 0 0 0 0 +0 12 0 235 166 0 0 0 12 235 166 0 12 235 166 0 0 0 0 0 12 235 166 0 0 0 +0 0 12 235 166 0 0 0 0 0 0 12 235 166 0 0 0 12 235 125 0 12 235 125 0 0 +0 0 0 138 225 21 12 235 166 0 175 225 21 0 12 0 235 166 0 0 0 0 12 235 +166 238 34 0 59 215 187 225 21 12 235 166 245 125 0 12 235 125 12 235 125 +0 0 0 0 138 247 34 12 235 166 0 0 12 235 166 12 235 125 0 0 0 0 138 247 +34 12 235 166 0 0 12 235 166 0 89 247 34 0 0 0 0 0 0 0 0 138 225 21 0 0 +12 0 235 125 0 0 0 59 245 125 59 241 89 0 0 7 206 166 59 0 241 89 0 12 +232 194 201 0 0 138 225 21 0 89 251 89 12 235 166 0 0 138 247 34 7 206 +201 0 0 0 0 0 59 245 125 0 7 206 125 0 0 0 0 138 201 0 0 0 0 0 12 235 125 +0 0 59 241 89 12 235 166 0 0 0 0 0 0 0 0 0 127 0 175 166 0 59 245 255 255 +247 34 138 201 0 0 7 206 166 59 241 89 0 12 0 235 166 0 0 89 251 89 0 89 +247 34 0 0 0 0 0 12 0 235 166 0 0 0 0 138 225 21 12 235 166 0 0 0 0 0 12 +235 166 0 0 0 0 0 89 247 34 0 0 0 0 0 0 12 235 166 0 0 0 12 235 125 0 12 +235 125 0 0 0 0 0 138 225 21 12 235 166 175 247 34 0 0 12 0 235 166 0 0 +0 0 12 235 133 206 166 0 175 166 175 225 21 12 235 125 138 225 21 12 235 +125 89 247 34 0 0 0 0 59 245 125 12 235 166 0 0 12 235 166 89 247 34 0 +0 0 0 59 245 125 12 235 166 0 0 12 235 125 0 89 255 125 0 0 0 0 0 0 0 0 +138 225 21 0 0 12 0 235 125 0 0 0 59 245 125 7 206 201 0 0 59 241 89 7 +0 206 166 0 59 215 111 225 21 7 206 166 0 0 0 175 225 187 225 21 0 0 12 +235 166 89 247 34 0 0 0 0 7 206 201 0 0 7 206 125 0 0 0 0 89 225 21 0 0 +0 0 12 235 125 0 12 235 166 0 0 59 241 89 0 0 0 0 0 0 0 0 127 0 202 89 +12 235 125 0 12 228 34 59 215 0 0 59 241 89 7 206 166 0 12 0 235 255 255 +255 255 166 0 0 138 225 21 0 0 0 0 0 12 0 235 166 0 0 0 0 89 247 34 12 +235 255 255 255 255 247 34 12 235 255 255 255 255 247 0 163 225 21 0 0 +0 0 0 0 12 235 255 255 255 255 255 255 125 0 12 235 125 0 0 0 0 0 138 225 +21 12 235 255 247 34 0 0 0 12 0 235 166 0 0 0 0 12 235 125 89 225 34 228 +34 175 225 21 12 235 125 12 235 125 12 235 125 138 225 21 0 0 0 0 12 235 +166 12 235 166 0 0 175 247 34 138 225 21 0 0 0 0 12 235 166 12 235 166 +0 0 175 225 21 0 0 175 255 255 225 21 0 0 0 0 0 138 225 21 0 0 12 0 235 +125 0 0 0 59 245 125 0 138 247 34 0 138 225 21 0 0 175 201 0 138 201 12 +232 89 12 235 125 0 0 0 12 235 251 89 0 0 0 0 89 255 255 125 0 0 0 0 0 +138 247 34 0 0 7 206 125 0 0 0 0 12 232 89 0 0 0 0 12 235 125 7 206 201 +0 0 0 0 138 251 89 0 0 0 0 0 0 0 127 7 228 34 89 225 21 0 12 228 34 12 +228 0 0 138 225 21 0 138 225 21 12 0 235 166 0 0 12 235 201 0 138 225 21 +0 0 0 0 0 12 0 235 166 0 0 0 0 89 247 34 12 235 166 0 0 0 0 0 12 235 166 +0 0 0 0 0 138 225 21 0 12 235 255 255 127 12 235 166 0 0 0 12 235 125 0 +12 235 125 0 0 0 0 0 138 225 21 12 235 229 216 225 21 0 0 12 0 235 166 +0 0 0 0 12 235 125 12 235 223 201 0 175 225 21 12 235 125 0 138 225 34 +235 125 138 225 21 0 0 0 0 12 235 166 12 235 255 255 255 247 34 0 138 225 +21 0 0 0 0 12 235 166 12 235 255 255 255 166 0 0 0 0 0 0 89 255 255 247 +34 0 0 0 138 225 21 0 0 12 0 235 125 0 0 0 59 245 125 0 59 245 125 7 206 +166 0 0 0 89 247 34 175 125 7 206 125 89 247 34 0 0 0 12 235 251 89 0 0 +0 0 7 206 225 21 0 0 0 0 59 245 125 0 0 0 7 206 125 0 0 0 0 0 175 166 0 +0 0 0 12 235 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 12 228 34 89 225 +21 0 12 228 34 59 215 0 7 206 255 255 255 255 251 89 12 0 235 166 0 0 0 +138 247 0 124 247 34 0 0 0 0 0 12 0 235 166 0 0 0 0 138 225 21 12 235 166 +0 0 0 0 0 12 235 166 0 0 0 0 0 89 247 34 0 0 0 0 175 127 12 235 166 0 0 +0 12 235 125 0 12 235 125 0 0 0 0 0 138 225 21 12 235 166 59 245 201 0 +0 12 0 235 166 0 0 0 0 12 235 125 0 138 251 89 0 175 225 21 12 235 125 +0 12 235 138 235 125 89 247 34 0 0 0 0 59 245 125 12 235 166 0 0 0 0 0 +89 247 34 0 0 0 0 59 245 125 12 235 166 0 175 247 34 0 0 0 0 0 0 0 59 245 +166 0 0 0 138 225 21 0 0 12 0 235 125 0 0 0 59 241 89 0 7 206 201 59 241 +89 0 0 0 59 241 102 232 89 0 138 201 138 225 21 0 0 0 175 201 175 225 21 +0 0 0 0 175 225 21 0 0 0 7 206 201 0 0 0 0 7 206 125 0 0 0 0 0 89 225 21 +0 0 0 12 235 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 12 232 89 59 241 +89 0 89 247 34 89 201 0 59 241 89 0 0 7 206 166 12 0 235 166 0 0 0 138 +225 0 81 245 166 0 0 0 0 0 12 0 235 166 0 0 0 12 235 166 0 12 235 166 0 +0 0 0 0 12 235 166 0 0 0 0 0 12 235 166 0 0 0 0 175 127 12 235 166 0 0 +0 12 235 125 0 12 235 125 0 0 0 0 0 138 225 21 12 235 166 0 89 255 166 +0 12 0 235 166 0 0 0 0 12 235 125 0 12 182 0 0 175 225 21 12 235 125 0 +0 138 232 245 125 12 235 125 0 0 0 0 138 247 34 12 235 166 0 0 0 0 0 12 +235 125 0 0 0 0 138 247 34 12 235 166 0 7 206 225 21 0 0 0 0 0 0 12 235 +166 0 0 0 138 225 21 0 0 12 0 235 166 0 0 0 89 251 89 0 0 138 247 163 225 +21 0 0 0 7 206 200 215 21 0 89 225 187 166 0 0 0 89 251 89 12 235 166 0 +0 0 0 175 225 21 0 0 0 138 247 34 0 0 0 0 7 206 125 0 0 0 0 0 12 232 89 +0 0 0 12 235 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 12 175 166 0 89 +255 255 210 235 255 255 125 0 138 225 21 0 0 0 138 247 47 0 235 166 0 0 +59 245 166 0 0 138 255 125 0 0 7 202 102 0 235 166 0 0 12 235 225 21 0 +12 235 166 0 0 0 0 0 12 235 166 0 0 0 0 0 0 138 255 125 0 0 0 175 127 12 +235 166 0 0 0 12 235 125 0 12 235 125 0 0 0 0 7 206 201 0 12 235 166 0 +0 138 255 125 12 0 235 166 0 0 0 12 0 235 125 0 0 0 0 0 175 225 21 12 235 +125 0 0 12 235 255 125 0 89 255 125 0 0 89 251 89 0 12 235 166 0 0 0 0 +0 0 89 255 125 0 0 89 255 125 0 12 235 166 0 0 12 235 201 0 138 166 0 0 +0 138 251 89 0 0 0 138 225 21 0 0 0 0 138 247 34 0 7 206 225 21 0 0 12 +235 255 166 0 0 0 0 0 175 255 201 0 0 12 235 255 125 0 0 12 235 166 0 0 +138 251 89 0 0 0 175 225 21 0 0 89 251 89 0 0 0 0 0 7 206 125 0 0 0 0 0 +0 175 166 0 0 0 12 235 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 59 241 +89 0 0 0 0 0 0 0 0 7 206 166 0 0 0 0 59 245 138 0 235 255 255 255 255 125 +0 0 0 0 59 245 255 255 255 201 12 0 235 255 255 255 255 166 0 0 0 12 235 +255 255 255 255 255 127 12 235 166 0 0 0 0 0 0 0 59 245 255 255 255 225 +21 12 235 166 0 0 0 12 235 125 89 255 255 255 210 127 235 255 255 225 21 +0 12 235 166 0 0 0 175 255 127 0 235 255 255 255 247 47 0 235 125 0 0 0 +0 0 175 225 21 12 235 125 0 0 0 138 255 125 0 0 0 175 255 255 201 0 0 0 +12 235 166 0 0 0 0 0 0 0 0 175 255 255 201 0 0 0 12 235 166 0 0 0 89 255 +225 34 235 255 255 255 247 34 0 0 0 0 138 225 21 0 0 0 0 0 138 255 255 +255 201 0 0 0 0 0 175 251 89 0 0 0 0 0 89 255 166 0 0 7 206 247 34 0 7 +206 225 21 0 0 7 206 225 21 0 0 175 225 21 0 0 138 255 255 255 255 255 +255 166 7 206 125 0 0 0 0 0 0 138 201 0 0 0 12 235 125 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 127 0 0 89 255 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 175 201 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 7 206 125 0 0 0 0 0 0 59 238 34 0 0 12 235 125 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 127 0 0 0 7 206 255 255 255 225 21 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 89 251 89 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 7 206 125 0 0 0 0 0 0 7 206 125 0 0 12 235 125 0 0 0 +0 0 0 0 0 0 0 245 255 255 255 255 255 255 127 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 138 +255 255 166 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 206 255 255 201 0 0 0 0 0 0 89 89 255 255 +255 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 127 127 127 127 127 127 +127 127 127 127 127 0 127 127 127 127 127 127 127 127 0 127 127 127 127 +127 127 127 127 0 127 127 127 127 127 127 127 127 0 127 127 127 127 127 +127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 127 127 127 +127 0 127 127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 127 +0 127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 127 +127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 127 127 127 127 +0 127 127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 127 127 +0 127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 127 127 0 127 +127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 +127 127 127 127 127 0 127 127 127 127 127 127 127 127 0 127 127 127 127 +127 127 127 127 0 127 127 127 127 127 127 127 127 127 127 127 127 0 127 +127 127 127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 127 +127 127 127 0 127 127 127 127 127 0 127 127 127 127 127 0 127 127 127 127 +127 0 127 127 127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 59 245 166 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 89 247 34 0 0 0 0 0 0 0 0 0 0 12 235 +125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 138 225 21 0 0 0 0 0 0 0 0 0 12 235 +255 247 0 0 0 0 0 0 0 12 12 235 125 0 0 0 0 0 0 0 0 0 0 0 0 12 235 125 +0 0 0 0 0 12 235 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 138 255 251 89 0 7 206 125 0 89 255 251 89 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 89 255 255 255 255 255 255 255 255 255 255 +125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 127 0 0 7 206 125 0 0 0 0 0 0 0 0 0 0 12 235 125 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 138 225 21 0 0 0 0 0 0 0 0 0 175 201 0 0 0 0 0 0 +0 0 0 12 12 235 125 0 0 0 0 0 59 245 102 0 89 247 34 12 235 125 0 0 0 0 +0 12 235 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 235 125 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 59 241 89 0 0 0 7 206 125 0 0 0 138 225 21 0 +0 0 0 0 0 0 0 0 0 0 0 0 89 201 0 0 0 0 0 0 0 0 175 125 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 12 235 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 138 +225 21 0 0 0 0 0 0 0 12 0 235 125 0 0 0 0 0 0 0 0 0 0 12 235 125 0 0 0 +0 0 0 0 0 0 0 0 0 12 235 125 0 0 0 0 0 12 235 125 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 12 235 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 89 247 34 +0 0 0 7 206 125 0 0 0 59 238 34 0 0 0 0 0 0 0 0 0 0 0 0 0 89 201 0 0 0 +0 0 0 0 0 175 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 12 235 255 255 255 166 0 12 +235 166 245 255 247 34 0 0 12 235 255 255 247 34 0 34 235 255 255 255 225 +21 0 12 235 255 255 225 29 0 206 255 255 255 127 0 12 235 255 255 255 225 +21 12 235 138 235 255 247 34 0 12 235 102 175 255 247 34 12 235 125 0 59 +245 201 0 12 235 125 12 0 235 166 245 255 225 29 206 255 251 89 0 12 235 +138 235 255 247 34 0 0 12 235 255 255 201 0 0 12 235 166 245 255 251 89 +0 0 12 235 255 255 255 225 21 12 235 138 235 247 127 34 138 255 255 255 +206 0 206 255 255 255 201 59 241 89 0 0 89 247 42 206 201 0 0 0 138 225 +187 201 0 0 138 225 21 0 59 241 187 226 247 34 0 7 206 206 206 201 0 0 +0 138 225 151 255 255 255 255 247 0 0 89 247 34 0 0 0 7 206 125 0 0 0 59 +238 34 0 0 0 0 0 0 0 0 0 0 0 0 0 89 201 0 0 0 0 0 0 0 0 175 125 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 +0 0 0 0 0 0 0 0 12 206 21 0 59 245 125 12 235 247 34 0 138 225 21 12 235 +166 0 0 134 102 0 235 166 0 0 138 225 21 12 235 125 0 0 175 201 12 0 235 +125 0 0 12 235 166 0 0 138 225 21 12 235 247 34 0 175 201 0 12 235 102 +0 89 247 34 12 235 125 12 235 166 0 0 12 235 125 12 0 235 225 21 12 235 +251 89 0 175 201 0 12 235 247 34 0 175 201 0 12 235 166 0 7 206 201 0 12 +235 225 21 0 175 225 21 12 235 166 0 0 138 225 21 12 235 247 34 0 0 89 +247 34 0 12 206 34 0 235 125 0 0 59 241 89 0 0 89 247 34 89 247 34 0 7 +206 166 138 225 21 7 206 251 89 0 89 225 138 34 235 201 0 138 225 21 89 +247 34 0 7 206 166 0 0 0 7 206 166 0 0 89 225 21 0 0 0 7 206 125 0 0 0 +59 241 89 0 0 0 0 138 251 89 0 0 7 202 89 0 89 201 0 0 0 0 0 0 0 0 175 +125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 7 206 102 12 235 125 0 0 59 241 89 +138 225 21 0 0 0 34 89 225 21 0 0 138 225 21 89 225 21 0 0 89 247 47 0 +235 125 0 0 89 225 21 0 0 138 225 21 12 235 125 0 0 89 247 34 12 235 102 +0 89 247 34 12 235 138 235 166 0 0 0 12 235 125 12 0 235 125 0 7 206 166 +0 0 138 225 21 12 235 125 0 0 89 247 34 138 225 21 0 0 59 238 34 12 235 +125 0 0 59 241 89 89 225 21 0 0 138 225 21 12 235 125 0 0 0 138 225 21 +0 0 0 12 0 235 125 0 0 59 241 89 0 0 89 247 34 12 235 125 0 59 241 89 59 +238 34 12 228 198 166 0 175 166 59 0 89 251 132 241 89 0 12 235 125 0 59 +238 34 0 0 0 138 225 21 0 12 235 166 0 0 0 0 7 206 125 0 0 0 0 175 201 +0 0 0 138 166 12 235 166 0 12 232 89 0 89 201 0 0 0 0 0 0 0 0 175 125 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 127 0 0 0 0 0 0 0 0 0 59 245 255 255 255 102 12 235 125 0 0 12 235 +125 175 201 0 0 0 0 0 175 201 0 0 0 138 225 21 175 255 255 255 255 255 +247 47 0 235 125 0 0 175 201 0 0 0 138 225 21 12 235 125 0 0 89 247 34 +12 235 102 0 89 247 34 12 235 255 225 21 0 0 0 12 235 125 12 0 235 125 +0 7 206 166 0 0 138 225 21 12 235 125 0 0 89 247 34 175 201 0 0 0 12 232 +89 12 235 125 0 0 12 235 125 175 201 0 0 0 138 225 21 12 235 125 0 0 0 +59 245 255 247 34 0 12 0 235 125 0 0 59 241 89 0 0 89 247 34 0 175 201 +0 138 201 0 12 235 125 89 201 89 225 29 206 125 12 0 0 175 255 166 0 0 +0 175 201 0 138 201 0 0 0 89 251 89 0 138 247 34 0 0 0 0 0 7 206 125 0 +0 0 0 0 89 255 125 7 202 89 0 89 251 89 89 201 0 0 89 201 0 0 0 0 0 0 0 +0 175 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 89 255 166 0 7 206 102 12 235 125 0 +0 12 235 125 175 201 0 0 0 0 0 175 201 0 0 0 138 225 21 175 201 0 0 0 0 +0 12 0 235 125 0 0 175 201 0 0 0 138 225 21 12 235 125 0 0 89 247 34 12 +235 102 0 89 247 34 12 235 138 235 201 0 0 0 12 235 125 12 0 235 125 0 +7 206 166 0 0 138 225 21 12 235 125 0 0 89 247 34 175 201 0 0 0 12 232 +89 12 235 125 0 0 12 235 125 175 201 0 0 0 138 225 21 12 235 125 0 0 0 +0 0 138 255 255 201 12 0 235 125 0 0 59 241 89 0 0 89 247 34 0 89 247 42 +206 125 0 0 175 166 175 125 12 232 102 232 89 0 0 0 175 255 201 0 0 0 89 +247 47 235 125 0 0 12 235 166 0 0 0 12 235 125 0 0 0 0 7 206 125 0 0 0 +0 138 201 0 0 12 232 89 0 0 59 245 225 21 0 0 89 201 0 0 0 0 0 0 0 0 175 +125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 127 0 0 0 0 0 0 0 0 175 201 0 0 7 206 102 12 235 125 0 0 59 241 +89 138 225 21 0 0 0 34 89 225 21 0 0 138 225 21 138 247 34 0 0 0 0 12 0 +235 125 0 0 138 225 21 0 0 138 225 21 12 235 125 0 0 89 247 34 12 235 102 +0 89 247 34 12 235 125 59 245 125 0 0 12 235 125 12 0 235 125 0 7 206 166 +0 0 138 225 21 12 235 125 0 0 89 247 34 138 225 21 0 0 89 247 34 12 235 +125 0 0 59 241 89 138 225 21 0 0 138 225 21 12 235 125 0 0 0 0 0 0 0 89 +247 47 0 235 125 0 0 59 241 89 0 0 89 247 34 0 12 235 166 238 34 0 0 138 +210 228 34 0 175 166 215 21 0 0 89 251 159 251 89 0 0 12 235 191 247 34 +0 0 175 225 21 0 0 0 0 138 225 21 0 0 0 7 206 125 0 0 0 12 232 89 0 0 0 +0 0 0 0 0 0 0 0 0 0 89 201 0 0 0 0 0 0 0 0 175 125 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 +0 0 0 138 225 21 0 138 255 102 12 235 125 0 7 206 201 0 12 235 166 0 0 +134 132 0 245 125 0 59 245 225 21 12 235 201 0 0 12 206 34 0 235 125 0 +0 59 245 125 0 12 235 225 21 12 235 125 0 0 89 247 34 12 235 102 0 89 247 +34 12 235 125 0 138 251 89 0 12 235 125 12 0 235 125 0 7 206 166 0 0 138 +225 21 12 235 125 0 0 89 247 34 12 235 166 0 7 206 201 0 12 235 125 0 7 +206 201 0 59 245 125 0 12 235 225 21 12 235 125 0 0 0 138 125 0 0 138 225 +29 0 206 166 0 0 7 206 166 0 59 245 247 34 0 0 175 255 201 0 0 0 59 245 +225 21 0 89 255 201 0 0 12 235 166 0 175 225 21 0 0 138 255 166 0 0 89 +251 89 0 0 0 0 0 89 247 34 0 0 0 7 206 125 0 0 0 59 238 34 0 0 0 0 0 0 +0 0 0 0 0 0 0 89 201 0 0 0 0 0 0 0 0 175 125 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 +7 206 255 255 171 206 102 12 232 226 255 255 225 21 0 0 12 235 255 255 +247 34 0 89 255 255 247 163 225 21 0 7 206 255 255 247 34 12 0 235 125 +0 0 0 89 255 255 247 163 225 21 12 235 125 0 0 89 247 34 12 235 102 0 89 +247 34 12 235 125 0 0 175 251 34 0 235 125 12 0 235 125 0 7 206 166 0 0 +138 225 21 12 235 125 0 0 89 247 34 0 12 235 255 255 201 0 0 12 235 255 +255 255 225 21 0 0 89 255 255 247 163 225 21 12 235 125 0 0 0 89 255 255 +255 247 34 0 0 89 255 255 127 0 59 245 255 225 111 247 34 0 0 59 245 125 +0 0 0 12 235 166 0 0 59 245 125 7 0 206 225 21 0 12 235 201 0 0 59 241 +89 0 0 175 255 255 255 255 247 0 0 89 247 34 0 0 0 7 206 125 0 0 0 59 238 +34 0 0 0 0 0 0 0 0 0 0 0 0 0 89 255 255 255 255 255 255 255 255 255 255 +125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 138 201 0 0 0 0 0 +0 0 0 0 0 0 0 0 89 247 34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 235 125 0 0 0 0 0 0 0 0 0 0 138 225 +21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 138 225 21 0 0 0 0 0 0 0 0 0 0 89 +247 34 0 0 0 7 206 125 0 0 0 59 238 34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 199 34 0 12 +232 89 0 0 0 0 0 0 0 0 0 0 0 0 0 138 225 21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 235 125 0 0 0 0 +0 0 0 0 0 0 138 225 21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 206 166 0 0 0 +0 0 0 0 0 0 0 0 12 235 125 0 0 0 7 206 125 0 0 0 138 225 21 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 12 235 255 247 34 0 0 0 0 0 0 0 0 0 0 0 0 0 255 251 89 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 12 235 125 0 0 0 0 0 0 0 0 0 0 138 225 21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 89 247 34 0 0 0 0 0 0 0 0 0 0 0 0 89 255 251 89 0 7 206 125 0 89 255 +247 34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 +127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 +127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 +127 127 127 127 127 0 127 127 127 127 0 127 127 127 127 127 127 127 0 127 +127 127 127 127 127 127 0 127 127 0 127 127 127 0 127 127 127 127 127 127 +127 0 127 127 127 0 127 127 127 127 127 127 127 127 127 127 127 0 127 127 +127 127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 127 127 +127 127 0 127 127 127 127 127 127 127 0 127 127 127 127 127 0 127 127 127 +127 127 127 0 127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 +127 127 127 0 127 127 127 127 127 127 127 127 127 127 0 127 127 127 127 +127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 0 127 127 127 127 +127 127 127 0 127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 +127 127 127 127 127 0 127 127 127 127 127 127 127 127 127 127 127 127 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 206 125 0 175 166 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 206 125 0 175 +166 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 59 245 225 21 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 206 255 125 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 206 255 125 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 175 166 0 138 201 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 175 166 0 138 201 0 7 206 166 12 235 +125 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 175 125 0 0 0 0 0 175 125 +0 0 0 0 0 175 171 206 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 89 255 125 0 +31 206 130 255 166 175 247 34 0 0 89 255 125 175 247 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 59 245 247 34 138 166 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 59 241 132 238 34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 59 241 132 238 34 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 +59 245 255 255 255 125 0 12 235 255 255 255 255 255 225 21 0 0 0 0 0 0 +0 0 175 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 175 125 0 0 0 +0 0 175 125 0 0 0 0 89 225 21 59 238 34 0 0 138 255 255 201 0 0 0 59 215 +21 0 0 0 0 0 0 0 0 0 12 235 255 255 255 247 34 0 0 0 0 0 0 0 12 235 255 +255 255 255 255 255 255 255 251 89 0 12 235 255 255 255 255 255 225 21 +0 89 255 255 255 255 255 255 125 0 12 235 255 255 255 255 255 225 21 0 +0 12 235 255 255 255 255 255 225 21 7 206 201 0 50 206 56 255 201 12 235 +125 0 0 138 225 29 206 166 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 7 202 89 89 255 225 21 0 89 255 255 255 225 81 245 201 0 138 251 +89 0 0 138 255 166 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 235 255 255 +255 255 255 225 21 0 0 0 138 255 166 7 206 225 21 0 0 0 138 247 34 0 0 +0 0 127 0 89 255 125 0 0 0 0 0 12 146 0 0 0 0 0 144 21 0 0 0 0 0 0 0 89 +247 34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 175 125 0 0 0 0 0 175 +125 0 0 0 0 0 0 0 0 0 0 0 59 241 89 12 235 125 0 0 172 89 0 0 0 0 0 0 0 +0 0 12 235 166 0 0 7 202 89 0 0 0 0 0 0 89 255 201 0 0 12 235 125 0 0 0 +0 0 0 12 146 0 0 0 0 0 144 21 0 0 0 0 0 0 138 247 34 0 12 146 0 0 0 0 0 +144 21 0 0 12 146 0 0 0 0 0 144 21 0 89 225 21 71 157 22 191 225 21 175 +201 0 7 206 125 59 238 34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 175 125 0 59 196 199 47 206 184 89 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 146 0 0 0 0 0 144 21 0 0 0 0 +0 0 0 59 245 125 0 0 59 245 125 0 0 0 0 0 127 12 235 166 0 0 0 0 0 0 12 +146 0 0 0 0 0 144 21 0 0 0 0 0 0 0 175 201 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 12 235 255 255 255 255 127 34 235 255 255 255 255 225 21 0 +0 0 0 0 0 0 0 89 247 34 7 206 166 0 89 201 0 0 0 0 0 0 0 0 0 0 89 247 34 +0 0 0 0 0 0 0 0 59 115 12 235 166 0 0 0 12 235 125 0 0 0 0 0 0 12 146 0 +0 0 0 0 144 21 0 0 0 0 0 59 245 125 0 0 12 146 0 0 0 0 0 144 21 0 0 12 +146 0 0 0 0 0 144 21 0 7 202 89 117 104 0 29 202 89 59 215 21 59 215 21 +138 201 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 175 125 0 59 192 89 223 125 172 89 0 138 255 255 255 201 12 182 +0 0 0 0 0 175 255 255 125 0 89 255 255 247 34 0 0 12 146 0 0 0 0 0 144 +21 0 138 255 255 255 255 247 34 138 247 34 7 206 201 0 0 0 0 0 0 127 89 +251 89 0 0 0 0 0 0 12 146 0 0 0 0 0 144 21 0 0 0 0 0 0 7 206 166 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 175 125 0 0 0 0 0 175 125 0 0 0 +0 0 0 0 0 0 0 0 89 247 34 7 206 166 7 202 89 0 0 0 0 0 0 0 0 0 0 89 255 +125 0 0 0 0 0 0 0 89 255 125 89 247 34 0 0 0 12 235 125 0 0 0 0 0 0 12 +146 0 0 0 0 0 144 21 0 0 0 0 7 206 201 0 0 0 12 146 0 0 0 0 0 144 21 0 +0 12 146 0 0 0 0 0 144 21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 59 245 +255 201 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 175 +125 0 59 192 12 228 34 172 89 89 247 34 0 12 206 29 206 201 0 0 7 206 166 +0 7 206 255 225 21 0 89 247 34 0 12 146 0 0 0 0 0 144 21 0 0 0 0 7 206 +166 0 12 235 166 89 247 34 0 0 0 0 0 0 127 245 255 255 255 255 255 201 +0 0 12 146 0 0 0 0 0 144 21 0 0 0 0 0 59 245 255 255 255 127 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 175 125 0 0 0 0 0 175 125 0 0 0 0 0 0 0 +0 0 0 0 59 241 89 12 235 125 89 201 12 235 255 251 89 0 89 255 255 225 +21 0 175 255 255 225 21 0 0 0 89 251 89 0 138 225 21 0 0 0 12 235 255 255 +255 255 225 21 0 12 146 0 0 0 0 0 144 21 0 0 0 0 138 247 34 0 0 0 12 146 +0 0 0 0 0 144 21 0 0 12 146 0 0 0 0 0 144 21 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 12 235 255 255 255 166 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 175 125 0 59 192 0 0 0 172 89 138 225 21 0 0 0 +0 7 206 225 21 138 225 21 0 0 89 251 89 0 0 12 235 125 0 12 146 0 0 0 0 +0 144 21 0 0 0 0 138 225 21 0 0 89 255 255 125 0 0 0 0 0 0 0 127 138 225 +21 0 0 0 0 0 0 12 146 0 0 0 0 0 144 21 0 0 0 0 0 0 59 241 89 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 175 125 0 0 12 235 255 255 255 255 +225 21 0 0 0 0 0 0 0 0 0 138 255 255 201 12 228 34 175 166 0 138 201 7 +206 125 7 206 166 0 0 0 89 255 255 247 34 59 241 89 0 0 138 225 21 0 0 +0 12 235 125 0 0 0 0 0 0 12 146 0 0 0 0 0 144 21 0 0 0 59 245 125 0 0 0 +0 12 146 0 0 0 0 0 144 21 0 0 12 146 0 0 0 0 0 144 21 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 59 245 255 255 255 207 235 255 255 255 255 255 255 +207 235 255 255 255 255 255 255 255 255 255 255 255 225 21 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 59 245 255 247 34 0 0 0 0 175 166 175 201 0 0 0 +59 245 255 255 255 255 255 125 0 12 146 0 0 0 0 0 144 21 0 0 0 89 251 89 +0 0 0 7 206 225 21 0 0 0 0 0 0 0 127 245 255 255 255 255 255 125 0 0 12 +146 0 0 0 0 0 144 21 0 0 0 0 0 0 59 241 89 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 175 125 0 0 0 0 0 175 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 138 166 7 206 125 0 89 247 94 241 89 0 138 201 0 0 0 0 0 59 245 166 +0 89 251 89 0 89 247 34 0 0 0 12 235 125 0 0 0 0 0 0 12 146 0 0 0 0 0 144 +21 0 0 7 206 201 0 0 0 0 0 12 146 0 0 0 0 0 144 21 0 0 12 146 0 0 0 0 0 +144 21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 235 255 255 255 166 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 138 255 255 201 0 7 206 225 21 175 201 0 0 0 59 241 89 0 0 0 0 +0 0 12 146 0 0 0 0 0 144 21 0 0 12 235 166 0 0 0 0 0 175 225 21 0 0 0 0 +0 0 0 127 89 255 125 0 0 0 0 0 0 12 146 0 0 0 0 0 144 21 0 0 0 0 0 0 89 +247 34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 175 125 0 0 0 0 0 +175 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 228 34 7 206 125 0 89 247 94 241 +89 0 138 201 0 0 0 0 0 12 235 166 0 0 89 255 125 12 235 166 0 0 0 12 235 +125 0 0 0 0 0 0 12 146 0 0 0 0 0 144 21 0 0 138 247 34 0 0 0 0 0 12 146 +0 0 0 0 0 144 21 0 0 12 146 0 0 0 0 0 144 21 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 59 245 255 201 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 89 247 42 206 201 0 0 89 +225 21 0 0 89 255 125 0 0 0 0 0 0 12 146 0 0 0 0 0 144 21 0 0 175 225 21 +0 0 0 0 0 175 225 21 0 0 0 0 0 0 0 127 0 175 251 89 0 0 0 0 0 12 146 0 +0 0 0 0 144 21 0 59 245 166 0 0 138 225 21 0 0 0 59 245 166 138 251 89 +7 206 201 0 12 235 125 0 59 241 89 0 0 0 175 125 0 0 0 0 0 175 125 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 138 166 0 0 175 166 0 138 201 7 206 125 7 206 +166 138 166 0 0 0 138 251 89 0 0 0 59 115 0 89 255 201 0 0 12 235 125 0 +0 0 0 0 0 12 146 0 0 0 0 0 144 21 0 89 251 89 0 0 0 0 0 0 12 146 0 0 0 +0 0 144 21 0 0 12 146 0 0 0 0 0 144 21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 138 125 0 0 138 225 34 182 0 0 0 7 206 166 0 +7 206 255 247 34 0 0 175 125 0 12 146 0 0 0 0 0 144 21 0 89 251 89 0 0 +0 0 0 0 175 225 21 0 0 0 0 0 0 0 127 0 0 138 255 255 255 255 125 0 12 235 +255 255 255 255 255 225 21 0 138 247 34 0 7 206 166 0 0 0 0 89 247 34 175 +201 0 7 206 201 0 12 235 125 0 59 241 89 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 59 215 21 0 0 12 235 255 251 89 0 89 255 255 225 +21 12 235 255 255 255 247 34 0 0 0 0 0 0 0 0 12 235 255 255 255 255 255 +255 255 255 251 89 0 12 235 255 255 255 255 255 225 21 0 138 255 255 255 +255 255 255 166 0 12 235 255 255 255 255 255 225 21 0 0 12 235 255 255 +255 255 255 225 21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 89 255 255 255 247 34 0 0 0 0 0 0 0 175 255 255 125 0 138 255 255 +255 125 0 0 12 235 255 255 255 255 255 225 21 0 175 255 255 255 255 247 +0 0 0 175 225 21 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 175 166 0 255 255 201 0 0 0 0 0 175 166 12 232 89 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 +228 34 0 0 0 0 0 0 0 0 12 232 89 59 215 21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +127 127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 127 0 127 +127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 +127 127 127 127 127 127 127 127 0 127 127 127 127 127 0 127 127 127 127 +127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 +127 127 127 127 127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 +0 127 127 127 127 0 127 127 127 127 127 127 127 127 127 127 127 127 127 +0 127 127 127 127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 +127 0 127 127 127 127 127 127 127 127 127 127 0 127 127 127 127 127 127 +127 127 0 127 127 127 0 127 127 0 127 127 127 127 127 0 127 127 127 127 +127 0 127 127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 127 +127 127 127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 +127 127 127 127 127 127 127 127 0 127 127 127 127 127 0 127 127 127 127 +0 127 127 127 127 127 127 127 127 127 127 127 127 127 0 127 127 127 127 +127 127 127 127 127 0 127 127 127 127 127 0 127 127 127 127 127 127 127 +127 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 245 255 255 255 255 255 255 225 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 235 225 21 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 7 206 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 89 247 34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 89 247 +34 0 0 0 0 59 192 0 0 0 0 0 7 206 255 255 225 21 0 0 0 0 0 0 0 0 138 247 +34 0 0 89 251 89 0 7 206 125 0 0 7 206 255 255 255 166 0 89 251 89 138 +247 34 0 0 0 0 7 206 255 255 255 247 34 0 0 0 0 175 255 255 251 89 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 206 255 255 255 247 +34 0 0 0 0 0 0 0 0 0 0 0 0 89 255 255 247 34 0 0 0 0 0 0 0 0 0 0 0 0 12 +235 255 247 34 0 0 7 206 255 251 89 0 0 7 206 125 0 0 0 0 0 0 0 0 0 0 0 +0 89 255 255 255 255 225 21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 202 89 0 0 0 +59 245 255 247 34 0 0 0 0 0 0 0 0 0 0 0 89 201 0 0 0 0 175 166 0 0 0 0 +0 0 89 201 0 0 0 0 175 166 0 0 0 0 0 59 245 255 201 0 0 0 59 241 89 0 0 +0 0 0 59 245 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 89 247 34 +0 0 0 0 59 192 0 0 0 0 0 175 201 0 0 144 21 0 0 0 0 0 0 0 0 7 206 166 0 +7 206 166 0 0 7 206 125 0 7 206 201 0 0 89 166 0 0 0 0 0 0 0 0 0 0 89 255 +125 0 0 0 59 245 166 0 0 0 0 0 0 12 206 21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 89 255 125 0 0 0 59 245 166 0 0 0 0 0 0 0 0 0 0 59 +241 89 0 138 201 0 0 0 0 0 138 166 0 0 0 0 0 168 34 7 206 166 0 0 172 89 +0 175 166 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 89 255 255 255 166 89 225 21 +0 0 0 0 0 0 0 0 0 0 0 0 0 89 255 251 89 0 0 12 235 125 0 138 225 21 0 0 +0 0 0 0 0 0 7 206 255 201 0 0 0 89 225 21 0 0 0 0 7 206 255 201 0 0 0 89 +225 21 0 0 0 0 12 206 21 12 235 125 0 0 175 166 0 0 0 0 0 0 59 245 125 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 175 255 255 255 +166 0 0 12 235 125 0 0 0 0 89 225 21 0 0 12 232 89 0 89 247 34 89 247 34 +0 0 7 206 125 0 12 235 125 0 0 0 0 0 0 0 0 0 0 0 0 0 89 225 21 0 0 0 0 +0 7 206 125 0 0 7 206 255 255 247 34 0 0 0 85 89 0 85 89 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 89 225 21 0 0 0 0 0 7 206 125 0 0 0 0 0 0 0 0 0 89 201 +0 0 12 228 34 0 0 0 0 138 166 0 0 0 0 0 0 0 7 206 125 0 0 7 206 255 166 +0 0 0 0 0 0 0 0 0 12 235 125 0 0 89 247 34 175 255 255 255 166 89 225 21 +0 89 255 125 0 0 0 0 0 0 0 0 0 0 7 202 89 0 0 89 225 21 0 12 232 89 59 +115 0 59 115 0 0 0 0 0 89 201 0 0 7 206 125 0 0 0 0 0 0 0 89 201 0 0 7 +206 125 0 0 0 0 0 0 0 0 12 232 89 0 59 238 34 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 89 225 21 0 0 138 247 94 192 12 182 +0 0 12 235 125 0 0 0 0 0 175 255 255 255 255 166 0 0 7 206 171 206 166 +0 0 0 7 206 125 0 7 206 251 89 0 0 0 0 0 0 0 0 0 0 0 7 202 89 0 59 245 +255 255 201 0 12 228 34 12 235 166 0 12 228 34 0 0 138 251 89 138 247 34 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 202 89 0 138 255 255 255 125 0 12 228 34 +0 0 0 0 0 0 0 0 59 241 89 0 138 201 0 0 0 0 0 138 166 0 0 0 0 0 0 0 175 +201 0 0 0 0 0 0 175 201 0 0 0 0 0 0 0 0 12 235 125 0 0 89 247 34 175 255 +255 255 166 89 225 21 0 89 255 125 0 0 0 0 0 0 0 0 0 0 7 202 89 0 0 138 +225 21 0 12 235 125 12 235 166 59 245 166 0 0 0 0 89 201 0 0 89 225 21 +0 0 0 0 0 0 0 89 201 0 0 89 225 21 0 0 0 0 0 0 12 235 255 125 0 0 175 125 +0 0 0 0 0 0 0 12 235 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 89 +225 21 0 12 235 125 59 192 0 0 0 0 12 235 125 0 0 0 0 0 59 215 21 59 238 +34 0 0 0 89 255 247 34 0 0 0 7 206 125 0 0 7 206 255 255 247 34 0 0 0 0 +0 0 0 0 59 192 0 12 235 166 0 7 176 21 0 175 125 59 238 34 0 12 228 34 +0 138 247 34 138 247 34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 59 192 0 0 138 +201 0 89 247 34 0 175 125 0 0 0 0 0 0 0 0 0 89 255 255 225 21 0 7 206 255 +255 255 255 255 255 247 34 0 12 235 125 0 0 0 7 176 21 0 175 201 0 0 0 +0 0 0 0 0 12 235 125 0 0 89 247 34 89 255 255 255 166 89 225 21 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 7 202 89 0 0 89 225 21 0 12 232 89 0 12 235 166 12 +235 166 0 0 0 89 201 0 7 206 125 0 12 235 166 0 0 0 0 89 201 0 7 206 125 +89 255 255 255 125 0 0 0 0 7 206 125 89 225 21 0 138 225 21 0 0 0 138 255 +125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 89 247 34 0 59 241 89 59 +192 0 0 0 12 235 255 255 255 225 21 0 0 138 166 0 7 202 89 0 0 0 7 206 +166 0 0 0 0 0 0 0 0 7 206 125 0 12 235 201 0 0 0 0 0 0 0 0 89 166 0 89 +247 34 0 0 0 0 0 89 166 12 232 89 0 138 247 34 89 247 34 59 238 34 0 0 +12 235 255 255 255 255 255 255 247 34 89 255 255 255 166 89 166 0 0 138 +201 0 138 225 21 0 89 166 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 138 166 +0 0 0 0 7 206 255 255 255 247 34 0 59 245 255 247 34 0 0 0 0 0 0 0 0 12 +235 125 0 0 89 247 34 0 89 255 255 166 89 225 21 0 0 0 0 0 0 0 0 0 0 0 +0 0 89 255 255 255 166 0 12 235 125 0 138 225 21 0 0 12 235 125 12 235 +125 0 0 89 201 0 89 201 0 7 206 223 166 0 0 0 0 89 201 0 89 201 0 89 125 +0 138 225 21 12 182 0 7 206 133 206 125 0 89 232 215 21 0 7 206 247 34 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 89 247 34 0 59 241 89 59 +192 0 0 0 0 12 235 125 0 0 0 0 0 59 215 21 59 238 34 0 59 245 255 255 255 +255 225 21 0 0 0 0 0 59 241 89 0 0 138 225 21 0 0 0 0 0 0 0 89 166 0 89 +247 34 0 0 0 0 0 89 166 0 138 255 255 176 228 34 0 138 247 34 138 247 34 +0 0 0 0 0 0 0 0 59 238 34 0 0 0 0 0 89 166 0 0 138 255 255 225 21 0 0 89 +166 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 138 166 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 235 125 0 0 89 247 34 0 0 0 138 166 89 225 +21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 59 245 255 247 34 0 0 12 235 +166 12 235 166 0 0 0 0 0 12 232 89 0 175 166 138 166 0 0 0 0 0 0 12 232 +89 0 0 0 0 138 201 0 0 89 255 255 201 89 225 21 89 225 81 215 21 0 138 +247 34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 89 247 34 0 12 235 +125 59 192 0 0 0 0 59 241 89 0 0 0 0 0 175 255 255 255 255 166 0 0 0 7 +206 166 0 0 0 0 7 206 125 0 12 235 201 0 7 206 166 0 0 0 0 0 0 0 0 59 192 +0 12 235 166 0 7 176 21 0 175 125 0 0 0 0 0 0 0 0 0 138 251 89 138 247 +34 0 0 0 0 0 0 0 59 238 34 0 0 0 0 0 59 192 0 0 138 201 59 245 166 0 0 +175 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 138 166 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 235 125 0 0 89 247 34 0 0 0 138 166 +89 225 21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 235 166 +59 245 166 0 0 0 0 0 0 138 201 0 138 201 0 138 166 0 0 0 0 0 0 138 201 +0 0 0 0 89 247 34 0 0 0 0 0 7 206 125 59 238 34 59 215 21 0 175 225 21 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 89 247 34 0 0 175 225 81 +192 12 182 0 7 206 125 0 0 0 0 0 89 225 21 0 0 12 232 89 0 0 7 206 166 +0 0 0 0 7 206 125 0 0 59 245 255 255 166 0 0 0 0 0 0 0 0 0 7 202 89 0 59 +245 255 255 166 0 12 228 34 0 0 0 0 0 0 0 0 0 0 85 89 0 85 89 0 0 0 0 0 +0 0 59 238 34 0 0 0 0 0 7 202 89 0 138 201 0 59 245 225 34 228 34 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 7 206 255 255 255 255 255 255 247 34 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 235 201 0 0 175 247 34 0 0 0 138 166 +89 225 21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 59 115 0 +59 115 0 0 0 0 0 0 12 232 89 0 175 255 255 255 255 201 0 0 0 0 12 232 89 +0 0 0 138 201 0 0 0 0 0 0 0 89 201 0 89 255 255 255 255 247 34 138 251 +89 0 7 176 21 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 138 247 34 0 0 0 +175 255 255 255 166 0 89 255 255 255 255 255 247 34 0 0 0 0 0 0 0 0 0 0 +7 206 166 0 0 0 0 7 206 125 0 0 0 0 0 138 255 166 0 0 0 0 0 0 0 0 0 89 +225 21 0 0 0 0 0 7 206 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 59 238 34 0 0 0 0 0 0 89 225 21 0 0 0 0 0 7 206 125 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 12 235 191 255 255 166 238 34 0 0 0 138 166 89 225 21 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 175 201 0 0 +0 0 0 138 166 0 0 0 0 0 175 201 0 0 0 89 255 255 255 255 125 0 0 0 12 232 +89 0 0 0 0 59 215 21 0 0 138 255 255 255 225 21 0 0 0 0 0 0 0 0 0 0 0 0 +0 127 0 0 0 0 0 0 0 0 0 0 0 0 59 192 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 7 206 125 0 0 0 0 0 0 175 201 0 0 0 0 0 0 0 0 0 0 +89 255 125 0 0 0 59 245 166 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 89 255 125 0 0 0 59 245 166 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 12 235 125 0 0 0 0 0 0 0 0 138 166 89 225 21 0 0 0 0 0 0 0 0 0 175 +125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 59 192 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 206 125 0 7 199 34 +0 12 235 125 0 0 0 0 0 0 0 0 0 0 0 7 206 255 255 255 247 34 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 206 255 255 +255 247 34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 235 125 0 0 0 0 0 0 0 0 138 166 +89 225 21 0 0 0 0 0 0 0 0 7 202 89 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 7 206 125 0 7 206 255 255 255 166 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 235 125 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 12 235 255 201 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 +127 127 0 127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 127 +127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 +127 0 127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 127 127 127 +0 127 127 127 127 127 127 127 127 127 127 127 127 0 127 127 127 127 127 +127 0 127 127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 127 +0 127 127 127 127 0 127 127 127 127 127 127 127 127 127 127 127 127 0 127 +127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 +127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 127 127 0 127 +127 127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 127 127 +127 127 0 127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 +127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 +127 127 127 127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 127 +127 127 127 127 127 0 127 127 127 127 127 127 127 127 127 127 127 127 127 +0 127 127 127 127 127 127 127 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 138 225 +21 0 0 0 0 0 12 235 125 0 0 0 0 19 172 255 190 11 0 0 0 0 138 255 201 7 +202 89 0 0 0 0 0 0 0 0 0 0 7 206 255 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 59 138 225 21 0 0 0 0 0 0 59 245 201 0 0 0 19 172 +255 190 11 0 0 0 0 0 0 0 0 0 7 206 225 21 0 0 0 59 245 201 19 172 255 190 +11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 235 251 89 89 201 0 0 0 0 0 175 +201 0 0 0 0 0 0 0 0 7 206 225 21 0 0 0 0 0 19 172 255 190 11 0 0 0 0 0 +175 255 166 12 228 34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 89 255 125 0 0 0 0 0 0 0 12 175 247 34 0 0 0 19 172 255 +190 11 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 175 247 34 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 127 0 0 0 7 206 125 0 0 0 0 0 138 201 0 0 0 0 0 136 190 +45 196 145 0 0 0 59 215 21 175 255 166 0 0 0 175 225 29 206 166 0 0 7 202 +89 7 202 89 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 209 125 +0 0 0 0 0 0 138 225 21 0 0 0 136 190 45 196 145 0 0 0 175 225 29 206 166 +0 0 12 235 125 0 0 12 138 225 21 136 190 45 196 145 159 251 89 138 247 +34 0 0 0 0 0 0 0 0 0 0 0 175 125 59 245 247 34 0 0 0 0 0 12 232 89 0 0 +0 0 0 0 0 175 166 0 0 0 0 0 0 12 136 190 45 196 145 0 0 0 0 138 166 12 +235 255 125 0 0 0 0 7 206 166 12 235 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 12 232 89 0 0 0 0 0 0 138 201 0 0 0 0 0 136 190 45 +196 145 34 0 0 0 89 251 89 138 247 34 0 0 0 0 0 138 201 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 202 89 7 202 89 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 89 255 +255 125 0 0 0 0 127 0 0 7 206 251 89 0 0 0 0 7 206 251 89 0 0 0 0 7 206 +251 89 0 0 0 0 0 7 206 251 89 0 0 0 0 7 206 251 89 0 0 0 0 12 235 255 125 +0 0 0 0 0 89 255 255 255 255 255 255 255 255 125 0 0 0 59 245 255 255 255 +201 12 235 255 255 255 255 255 125 12 235 255 255 255 255 255 125 12 235 +255 255 255 255 255 125 12 235 255 255 255 255 255 125 89 255 255 255 201 +89 255 255 255 201 89 255 255 255 201 89 255 255 255 201 0 175 255 255 +255 255 201 0 0 0 12 235 251 89 0 0 12 235 125 0 0 0 138 255 255 166 0 +0 0 0 0 0 138 255 255 166 0 0 0 0 0 0 138 255 255 166 0 0 0 0 0 0 138 255 +255 166 0 0 0 0 0 0 138 255 255 166 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 138 +255 255 201 89 251 89 12 235 125 0 0 0 59 245 125 12 235 125 0 0 0 59 245 +125 12 235 125 0 0 0 59 245 125 12 235 125 0 0 0 59 245 125 7 206 225 21 +0 0 0 138 247 0 235 166 0 0 0 0 0 0 138 225 21 7 206 166 0 0 0 127 0 0 +59 245 255 166 0 0 0 0 59 245 255 166 0 0 0 0 59 245 255 166 0 0 0 0 0 +59 245 255 166 0 0 0 0 59 245 255 166 0 0 0 0 59 245 255 166 0 0 0 0 0 +175 201 7 206 166 0 0 0 0 0 0 0 138 255 125 0 0 7 202 102 235 166 0 0 0 +0 0 12 235 166 0 0 0 0 0 12 235 166 0 0 0 0 0 12 235 166 0 0 0 0 0 0 12 +235 125 0 0 12 235 125 0 0 12 235 125 0 0 12 235 125 0 0 175 201 0 0 7 +206 251 89 0 12 235 255 201 0 0 12 235 125 0 59 245 166 0 0 138 251 89 +0 0 59 245 166 0 0 138 251 89 0 0 59 245 166 0 0 138 251 89 0 0 59 245 +166 0 0 138 251 89 0 0 59 245 166 0 0 138 251 89 0 0 0 0 0 0 0 0 0 0 0 +0 59 245 166 0 0 89 255 166 0 12 235 125 0 0 0 59 245 125 12 235 125 0 +0 0 59 245 125 12 235 125 0 0 0 59 245 125 12 235 125 0 0 0 59 245 125 +0 59 245 125 0 0 59 245 125 12 235 166 0 0 0 0 0 12 235 125 0 0 175 201 +0 0 0 127 0 0 138 225 151 225 21 0 0 0 138 225 151 225 21 0 0 0 138 225 +151 225 21 0 0 0 0 138 225 151 225 21 0 0 0 138 225 151 225 21 0 0 0 138 +225 151 225 21 0 0 0 59 241 89 7 206 166 0 0 0 0 0 0 12 235 166 0 0 0 0 +0 12 235 166 0 0 0 0 0 12 235 166 0 0 0 0 0 12 235 166 0 0 0 0 0 12 235 +166 0 0 0 0 0 0 12 235 125 0 0 12 235 125 0 0 12 235 125 0 0 12 235 125 +0 0 175 201 0 0 0 0 175 225 21 12 235 166 245 125 0 12 235 125 12 235 125 +0 0 0 0 138 247 34 12 235 125 0 0 0 0 138 247 34 12 235 125 0 0 0 0 138 +247 34 12 235 125 0 0 0 0 138 247 34 12 235 125 0 0 0 0 138 247 34 0 138 +225 21 0 0 0 175 201 0 12 235 125 0 0 7 202 159 247 34 12 235 125 0 0 0 +59 245 125 12 235 125 0 0 0 59 245 125 12 235 125 0 0 0 59 245 125 12 235 +125 0 0 0 59 245 125 0 0 138 247 34 7 206 201 0 12 235 255 255 255 251 +89 0 12 235 125 0 12 235 125 0 0 0 127 0 7 206 166 59 241 89 0 0 7 206 +166 59 241 89 0 0 7 206 166 59 241 89 0 0 0 7 206 166 59 241 89 0 0 7 206 +166 59 241 89 0 0 7 206 166 59 241 89 0 0 0 138 225 21 7 206 166 0 0 0 +0 0 0 89 247 34 0 0 0 0 0 12 235 166 0 0 0 0 0 12 235 166 0 0 0 0 0 12 +235 166 0 0 0 0 0 12 235 166 0 0 0 0 0 0 12 235 125 0 0 12 235 125 0 0 +12 235 125 0 0 12 235 125 0 0 175 201 0 0 0 0 59 241 89 12 235 125 138 +225 21 12 235 125 89 247 34 0 0 0 0 59 245 125 89 247 34 0 0 0 0 59 245 +125 89 247 34 0 0 0 0 59 245 125 89 247 34 0 0 0 0 59 245 125 89 247 34 +0 0 0 0 59 245 125 0 0 175 225 21 0 175 225 21 0 89 247 34 0 0 138 166 +12 235 125 12 235 125 0 0 0 59 245 125 12 235 125 0 0 0 59 245 125 12 235 +125 0 0 0 59 245 125 12 235 125 0 0 0 59 245 125 0 0 12 235 166 89 247 +34 0 12 235 166 0 0 138 251 89 12 235 133 206 255 125 0 0 0 0 127 0 59 +241 89 7 206 166 0 0 59 241 89 7 206 166 0 0 59 241 89 7 206 166 0 0 0 +59 241 89 7 206 166 0 0 59 241 89 7 206 166 0 0 59 241 89 7 206 166 0 0 +12 235 125 0 7 206 255 255 255 255 247 34 0 138 225 21 0 0 0 0 0 12 235 +255 255 255 255 247 34 12 235 255 255 255 255 247 34 12 235 255 255 255 +255 247 34 12 235 255 255 255 255 247 34 0 12 235 125 0 0 12 235 125 0 +0 12 235 125 0 0 12 235 125 0 206 255 255 255 247 34 0 12 235 125 12 235 +125 12 235 125 12 235 125 138 225 21 0 0 0 0 12 235 166 138 225 21 0 0 +0 0 12 235 166 138 225 21 0 0 0 0 12 235 166 138 225 21 0 0 0 0 12 235 +166 138 225 21 0 0 0 0 12 235 166 0 0 0 175 225 187 225 21 0 0 138 225 +21 0 59 215 21 7 206 166 12 235 125 0 0 0 59 245 125 12 235 125 0 0 0 59 +245 125 12 235 125 0 0 0 59 245 125 12 235 125 0 0 0 59 245 125 0 0 0 89 +255 255 125 0 0 12 235 166 0 0 12 235 166 12 235 125 0 7 206 201 0 0 0 +127 0 138 225 21 0 138 225 21 0 138 225 21 0 138 225 21 0 138 225 21 0 +138 225 21 0 0 138 225 21 0 138 225 21 0 138 225 21 0 138 225 21 0 138 +225 21 0 138 225 21 0 89 255 255 255 255 255 166 0 0 0 0 0 0 138 225 21 +0 0 0 0 0 12 235 166 0 0 0 0 0 12 235 166 0 0 0 0 0 12 235 166 0 0 0 0 +0 12 235 166 0 0 0 0 0 0 12 235 125 0 0 12 235 125 0 0 12 235 125 0 0 12 +235 125 0 0 175 201 0 0 0 0 12 235 125 12 235 125 0 138 225 34 235 125 +138 225 21 0 0 0 0 12 235 166 138 225 21 0 0 0 0 12 235 166 138 225 21 +0 0 0 0 12 235 166 138 225 21 0 0 0 0 12 235 166 138 225 21 0 0 0 0 12 +235 166 0 0 0 0 175 225 21 0 0 0 138 225 21 7 202 89 0 7 206 166 12 235 +125 0 0 0 59 245 125 12 235 125 0 0 0 59 245 125 12 235 125 0 0 0 59 245 +125 12 235 125 0 0 0 59 245 125 0 0 0 7 206 225 21 0 0 12 235 166 0 0 12 +235 166 12 235 125 0 0 59 241 89 0 0 127 7 206 255 255 255 255 251 89 7 +206 255 255 255 255 251 89 7 206 255 255 255 255 251 89 0 7 206 255 255 +255 255 251 89 7 206 255 255 255 255 251 89 7 206 255 255 255 255 251 89 +7 206 166 0 0 7 206 166 0 0 0 0 0 0 89 247 34 0 0 0 0 0 12 235 166 0 0 +0 0 0 12 235 166 0 0 0 0 0 12 235 166 0 0 0 0 0 12 235 166 0 0 0 0 0 0 +12 235 125 0 0 12 235 125 0 0 12 235 125 0 0 12 235 125 0 0 175 201 0 0 +0 0 59 241 89 12 235 125 0 12 235 138 235 125 89 247 34 0 0 0 0 59 245 +125 89 247 34 0 0 0 0 59 245 125 89 247 34 0 0 0 0 59 245 125 89 247 34 +0 0 0 0 59 245 125 89 247 34 0 0 0 0 59 245 125 0 0 0 175 225 187 225 21 +0 0 138 247 34 175 125 0 0 12 235 125 12 235 125 0 0 0 59 241 89 12 235 +125 0 0 0 59 241 89 12 235 125 0 0 0 59 241 89 12 235 125 0 0 0 59 241 +89 0 0 0 0 175 225 21 0 0 12 235 166 0 0 175 247 34 12 235 125 0 0 12 235 +125 0 0 127 59 241 89 0 0 7 206 166 59 241 89 0 0 7 206 166 59 241 89 0 +0 7 206 166 0 59 241 89 0 0 7 206 166 59 241 89 0 0 7 206 166 59 241 89 +0 0 7 206 166 59 241 89 0 0 7 206 166 0 0 0 0 0 0 59 245 166 0 0 0 0 0 +12 235 166 0 0 0 0 0 12 235 166 0 0 0 0 0 12 235 166 0 0 0 0 0 12 235 166 +0 0 0 0 0 0 12 235 125 0 0 12 235 125 0 0 12 235 125 0 0 12 235 125 0 0 +175 201 0 0 0 0 175 225 21 12 235 125 0 0 138 232 245 125 12 235 125 0 +0 0 0 138 247 34 12 235 125 0 0 0 0 138 247 34 12 235 125 0 0 0 0 138 247 +34 12 235 125 0 0 0 0 138 247 34 12 235 125 0 0 0 0 138 247 34 0 0 175 +225 21 0 175 225 21 0 59 245 191 201 0 0 0 89 225 21 12 235 166 0 0 0 89 +251 89 12 235 166 0 0 0 89 251 89 12 235 166 0 0 0 89 251 89 12 235 166 +0 0 0 89 251 89 0 0 0 0 175 225 21 0 0 12 235 255 255 255 247 34 0 12 235 +125 0 0 59 241 89 0 0 127 138 225 21 0 0 0 138 247 163 225 21 0 0 0 138 +247 163 225 21 0 0 0 138 247 34 138 225 21 0 0 0 138 247 163 225 21 0 0 +0 138 247 163 225 21 0 0 0 138 247 198 225 21 0 0 7 206 166 0 0 0 0 0 0 +0 138 255 125 0 0 7 202 102 235 166 0 0 0 0 0 12 235 166 0 0 0 0 0 12 235 +166 0 0 0 0 0 12 235 166 0 0 0 0 0 0 12 235 125 0 0 12 235 125 0 0 12 235 +125 0 0 12 235 125 0 0 175 201 0 0 7 206 251 89 0 12 235 125 0 0 12 235 +255 125 0 89 255 125 0 0 89 251 89 0 0 89 255 125 0 0 89 251 89 0 0 89 +255 125 0 0 89 251 89 0 0 89 255 125 0 0 89 251 89 0 0 89 255 125 0 0 89 +251 89 0 0 138 225 21 0 0 0 175 201 0 0 138 251 89 0 0 89 251 89 0 0 138 +247 34 0 7 206 225 21 0 138 247 34 0 7 206 225 21 0 138 247 34 0 7 206 +225 21 0 138 247 34 0 7 206 225 21 0 0 0 0 175 225 21 0 0 12 235 166 0 +0 0 0 0 12 235 125 0 0 175 225 21 0 0 127 206 166 0 0 0 0 59 245 255 166 +0 0 0 0 59 245 255 166 0 0 0 0 59 245 133 206 166 0 0 0 0 59 245 255 166 +0 0 0 0 59 245 255 166 0 0 0 0 59 245 255 125 0 0 0 7 206 255 255 255 255 +255 125 0 0 0 59 245 255 255 255 201 12 235 255 255 255 255 255 125 12 +235 255 255 255 255 255 125 12 235 255 255 255 255 255 125 12 235 255 255 +255 255 255 125 89 255 255 255 201 89 255 255 255 201 89 255 255 255 201 +89 255 255 255 201 0 175 255 255 255 255 225 21 0 0 12 235 125 0 0 0 138 +255 125 0 0 0 175 255 255 201 0 0 0 0 0 0 175 255 255 201 0 0 0 0 0 0 175 +255 255 201 0 0 0 0 0 0 175 255 255 201 0 0 0 0 0 0 175 255 255 201 0 0 +0 0 0 0 0 0 0 0 0 0 0 7 202 97 206 255 255 201 0 0 0 0 0 138 255 255 255 +201 0 0 0 0 138 255 255 255 201 0 0 0 0 138 255 255 255 201 0 0 0 0 138 +255 255 255 201 0 0 0 0 0 0 175 225 21 0 0 12 235 166 0 0 0 0 0 12 235 +133 206 255 225 21 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 138 166 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 138 166 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 175 166 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 206 255 225 21 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 127 127 127 127 +127 127 0 127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 127 +0 127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 +127 127 127 127 0 127 127 127 127 127 127 127 127 127 127 127 127 127 0 +127 127 127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 +127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 127 127 127 +127 0 127 127 127 127 0 127 127 127 127 0 127 127 127 127 0 127 127 127 +127 0 127 127 127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 +127 0 127 127 127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 +127 127 0 127 127 127 127 127 127 127 127 127 0 127 127 127 127 127 127 +127 127 127 0 127 127 127 127 127 127 127 127 127 0 127 127 127 127 127 +127 127 127 127 0 127 127 127 127 127 127 127 127 127 0 127 127 127 127 +127 127 127 127 0 127 127 127 127 127 127 127 127 0 127 127 127 127 127 +127 127 127 0 127 127 127 127 127 127 127 127 0 127 127 127 127 127 127 +127 127 0 127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 127 +0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 7 206 225 21 +0 0 0 0 0 12 235 225 21 0 0 89 255 225 21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 7 206 255 247 34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 206 247 +34 0 0 0 0 0 0 0 138 251 89 0 0 59 245 247 34 0 0 0 0 0 0 0 0 0 175 247 +34 0 0 175 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 206 225 21 +0 0 0 0 0 0 0 138 255 125 0 0 0 12 235 251 89 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 138 251 89 0 0 0 0 0 0 +7 206 225 21 0 0 0 7 206 251 89 0 0 0 0 0 0 0 0 0 0 0 0 0 59 245 166 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 59 241 89 0 0 0 0 +0 89 247 34 0 0 7 206 138 235 125 0 0 89 255 225 21 175 125 0 0 0 0 0 0 +0 0 0 138 201 0 138 201 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 +235 125 0 0 0 0 0 0 12 235 125 0 0 0 175 171 206 166 0 0 0 0 0 0 0 0 0 +7 206 166 0 59 245 255 166 238 0 0 0 0 0 0 0 0 0 0 0 0 7 206 255 125 59 +215 21 0 0 59 241 89 0 0 0 0 0 0 7 206 166 0 0 0 0 138 201 175 201 0 0 +0 12 235 251 89 89 201 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 7 206 166 0 0 0 0 0 0 89 247 34 0 0 0 0 89 225 151 201 0 0 0 0 +0 0 0 0 0 0 0 0 0 175 201 0 12 235 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 127 0 0 0 138 201 0 0 0 0 7 206 125 0 0 0 138 201 0 89 225 21 +12 228 34 138 255 201 0 0 0 138 247 34 175 225 21 0 138 201 0 138 201 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 89 225 21 0 0 0 0 0 89 225 +21 0 0 89 247 34 59 241 89 0 59 241 89 89 247 34 0 0 89 225 21 175 127 +215 21 206 247 42 206 0 138 255 247 42 206 125 0 0 138 166 12 235 251 89 +0 0 0 0 138 201 0 0 0 0 0 0 89 225 21 0 0 0 59 241 89 12 235 125 0 0 175 +125 59 245 247 34 0 0 12 235 125 89 251 89 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 59 238 34 0 0 0 0 0 175 166 0 0 0 0 12 232 89 7 206 125 0 +0 12 235 166 59 245 125 0 0 0 59 238 34 0 12 235 125 0 0 0 0 0 0 89 247 +34 138 225 21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 206 255 247 34 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 175 251 89 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 199 34 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 235 125 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 12 235 255 255 255 166 0 12 235 255 +255 255 166 0 12 235 255 255 255 166 0 12 235 255 255 255 166 0 0 12 235 +255 255 255 166 0 12 235 255 255 255 166 0 12 235 255 255 255 166 0 175 +255 255 125 0 0 12 235 255 255 125 0 0 12 235 255 255 225 21 0 0 12 235 +255 255 225 21 0 12 235 255 255 225 21 0 12 235 255 255 225 21 0 12 235 +125 12 235 125 12 235 125 12 235 125 0 12 235 125 89 251 89 0 12 235 138 +235 255 247 34 0 0 12 235 255 255 201 0 0 0 12 235 255 255 201 0 0 0 12 +235 255 255 201 0 0 0 12 235 255 255 201 0 0 0 12 235 255 255 201 0 0 0 +0 0 0 175 247 34 0 0 0 12 235 255 255 255 166 0 59 241 89 0 0 89 247 34 +59 241 89 0 0 89 247 34 59 241 89 0 0 89 247 34 59 241 89 0 0 89 247 42 +206 201 0 0 0 138 232 245 166 245 255 251 89 7 206 201 0 0 0 138 225 21 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 127 12 206 21 0 59 245 125 12 206 21 0 59 245 125 12 206 +21 0 59 245 125 12 206 21 0 59 245 125 0 12 206 21 0 59 245 125 12 206 +21 0 59 245 125 12 206 21 0 12 235 255 125 0 7 206 166 12 235 166 0 0 172 +102 0 235 125 0 0 175 201 0 12 235 125 0 0 175 201 12 235 125 0 0 175 201 +12 235 125 0 0 175 201 0 12 235 125 12 235 125 12 235 125 12 235 125 0 +0 0 0 0 175 201 0 12 235 247 34 0 175 201 0 12 235 166 0 7 206 201 0 12 +235 166 0 7 206 201 0 12 235 166 0 7 206 201 0 12 235 166 0 7 206 201 0 +12 235 166 0 7 206 201 0 0 0 0 0 175 247 34 0 0 12 235 166 0 12 235 201 +0 59 241 89 0 0 89 247 34 59 241 89 0 0 89 247 34 59 241 89 0 0 89 247 +34 59 241 89 0 0 89 247 34 89 247 34 0 7 206 176 235 225 21 0 175 225 21 +89 247 34 0 7 206 166 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 7 206 166 0 0 0 0 7 +206 166 0 0 0 0 7 206 166 0 0 0 0 7 206 166 0 0 0 0 0 7 206 166 0 0 0 0 +7 206 166 0 0 0 0 0 175 201 0 0 0 89 225 138 225 21 0 0 0 0 89 225 21 0 +0 89 247 34 89 225 21 0 0 89 247 124 225 21 0 0 89 247 124 225 21 0 0 89 +247 34 12 235 125 12 235 125 12 235 125 12 235 125 0 89 255 255 255 255 +247 34 12 235 125 0 0 89 247 34 138 225 21 0 0 59 238 34 138 225 21 0 0 +59 238 34 138 225 21 0 0 59 238 34 138 225 21 0 0 59 238 34 138 225 21 +0 0 59 238 34 0 0 0 0 0 0 0 0 0 138 225 21 0 172 132 238 34 59 241 89 0 +0 89 247 34 59 241 89 0 0 89 247 34 59 241 89 0 0 89 247 34 59 241 89 0 +0 89 247 34 12 235 125 0 59 238 47 235 125 0 0 59 241 89 12 235 125 0 59 +238 34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 59 245 255 255 255 166 0 59 245 255 255 +255 166 0 59 245 255 255 255 166 0 59 245 255 255 255 166 0 0 59 245 255 +255 255 166 0 59 245 255 255 255 166 0 89 255 255 255 255 255 255 255 255 +255 247 175 201 0 0 0 0 0 175 255 255 255 255 255 247 34 175 255 255 255 +255 255 247 198 255 255 255 255 255 247 198 255 255 255 255 255 247 34 +12 235 125 12 235 125 12 235 125 12 235 125 89 251 89 0 0 59 241 89 12 +235 125 0 0 89 247 34 175 201 0 0 0 12 232 89 175 201 0 0 0 12 232 89 175 +201 0 0 0 12 232 89 175 201 0 0 0 12 232 89 175 201 0 0 0 12 232 89 7 206 +255 255 255 255 255 255 251 226 201 0 89 166 12 232 89 59 241 89 0 0 89 +247 34 59 241 89 0 0 89 247 34 59 241 89 0 0 89 247 34 59 241 89 0 0 89 +247 34 0 175 201 0 138 201 12 235 125 0 0 12 235 125 0 175 201 0 138 201 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 127 89 255 166 0 7 206 166 89 255 166 0 7 206 166 89 +255 166 0 7 206 166 89 255 166 0 7 206 166 0 89 255 166 0 7 206 166 89 +255 166 0 7 206 166 138 255 125 0 0 175 201 0 0 0 0 0 175 201 0 0 0 0 0 +175 201 0 0 0 0 0 0 175 201 0 0 0 0 0 175 201 0 0 0 0 0 175 201 0 0 0 0 +0 0 12 235 125 12 235 125 12 235 125 12 235 125 175 201 0 0 0 59 241 89 +12 235 125 0 0 89 247 34 175 201 0 0 0 12 232 89 175 201 0 0 0 12 232 89 +175 201 0 0 0 12 232 89 175 201 0 0 0 12 232 89 175 201 0 0 0 12 232 89 +0 0 0 0 0 0 0 0 0 175 201 7 176 21 12 232 89 59 241 89 0 0 89 247 34 59 +241 89 0 0 89 247 34 59 241 89 0 0 89 247 34 59 241 89 0 0 89 247 34 0 +89 247 47 235 125 12 235 125 0 0 12 235 125 0 89 247 47 235 125 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 127 175 201 0 0 7 206 166 175 201 0 0 7 206 166 175 201 0 0 +7 206 166 175 201 0 0 7 206 166 0 175 201 0 0 7 206 166 175 201 0 0 7 206 +166 175 201 0 0 0 138 225 21 0 0 0 0 138 225 21 0 0 0 0 138 247 34 0 0 +0 0 0 138 247 34 0 0 0 0 138 247 34 0 0 0 0 138 247 34 0 0 0 0 0 12 235 +125 12 235 125 12 235 125 12 235 125 175 201 0 0 0 89 247 34 12 235 125 +0 0 89 247 34 138 225 21 0 0 89 247 34 138 225 21 0 0 89 247 34 138 225 +21 0 0 89 247 34 138 225 21 0 0 89 247 34 138 225 21 0 0 89 247 34 0 0 +0 0 175 247 34 0 0 138 225 151 125 0 89 247 34 59 241 89 0 0 89 247 34 +59 241 89 0 0 89 247 34 59 241 89 0 0 89 247 34 59 241 89 0 0 89 247 34 +0 12 235 191 247 34 12 235 125 0 0 59 241 89 0 12 235 191 247 34 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 127 138 225 21 0 138 255 166 138 225 21 0 138 255 166 138 +225 21 0 138 255 166 138 225 21 0 138 255 166 0 138 225 21 0 138 255 166 +138 225 21 0 138 255 166 89 247 34 0 89 255 255 166 0 0 12 206 12 235 166 +0 0 127 102 0 235 201 0 0 12 206 21 12 235 201 0 0 12 206 34 235 201 0 +0 12 206 34 235 201 0 0 12 206 21 12 235 125 12 235 125 12 235 125 12 235 +125 89 255 125 0 7 206 166 0 12 235 125 0 0 89 247 34 12 235 166 0 7 206 +201 0 12 235 166 0 7 206 201 0 12 235 166 0 7 206 201 0 12 235 166 0 7 +206 201 0 12 235 166 0 7 206 201 0 0 0 0 0 175 247 34 0 0 12 235 201 0 +7 206 201 0 7 206 166 0 59 245 247 34 7 206 166 0 59 245 247 34 7 206 166 +0 59 245 247 34 7 206 166 0 59 245 247 34 0 0 138 255 166 0 12 235 125 +0 7 206 201 0 0 0 138 255 166 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 7 206 255 255 171 +206 166 7 206 255 255 171 206 166 7 206 255 255 171 206 166 7 206 255 255 +171 206 166 0 7 206 255 255 171 206 166 7 206 255 255 171 206 166 0 89 +255 255 201 0 0 175 255 255 247 34 0 12 235 255 255 166 0 0 7 206 255 255 +247 34 0 0 7 206 255 255 247 34 0 7 206 255 255 247 34 0 7 206 255 255 +247 34 0 12 235 125 12 235 125 12 235 125 12 235 125 0 89 255 255 255 201 +0 0 12 235 125 0 0 89 247 34 0 12 235 255 255 201 0 0 0 12 235 255 255 +201 0 0 0 12 235 255 255 201 0 0 0 12 235 255 255 201 0 0 0 12 235 255 +255 201 0 0 0 0 0 0 0 0 0 0 0 7 206 255 255 255 201 0 0 0 59 245 255 225 +111 247 34 0 59 245 255 225 111 247 34 0 59 245 255 225 111 247 34 0 59 +245 255 225 111 247 34 0 0 59 241 89 0 12 235 255 255 255 225 21 0 0 0 +59 241 89 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 175 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 138 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 138 225 21 0 12 235 125 0 0 0 0 0 0 0 +138 225 21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 7 202 89 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 206 166 0 0 12 235 125 0 0 0 0 0 0 7 206 +166 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +12 235 255 166 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 89 247 34 0 0 12 235 125 0 0 0 0 0 0 89 247 +34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 127 127 127 127 127 0 127 127 127 127 +127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 +127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 127 +127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 127 +0 127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 +127 127 0 127 127 0 127 127 0 127 127 0 127 127 0 127 127 127 127 127 127 +127 0 127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 +127 127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 127 127 +127 127 0 127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 127 +0 127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 +127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 127 127 127 +127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 +127 127 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/res/FontNormal.pgm b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/res/FontNormal.pgm new file mode 100644 index 00000000..f05e8313 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/res/FontNormal.pgm @@ -0,0 +1,895 @@ +P2 +# Created by Paint Shop Pro +253 106 +255 +127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 255 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 255 0 0 255 +0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 255 0 0 0 255 0 255 0 0 0 0 +0 255 0 255 0 0 0 0 0 255 0 0 0 0 255 255 0 0 0 0 255 0 0 0 0 0 255 255 +255 0 0 0 0 0 255 0 0 0 255 0 0 0 0 255 0 0 0 255 0 255 0 255 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 255 255 255 255 0 0 0 0 0 +255 0 0 0 0 255 255 255 255 0 0 0 255 255 255 255 0 0 0 0 0 0 255 0 0 255 +255 255 255 255 255 0 0 0 255 255 255 0 0 255 255 255 255 255 255 0 0 255 +255 255 255 0 0 0 255 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 127 0 0 0 0 0 0 255 0 0 0 255 0 255 0 0 0 0 0 255 0 255 0 0 0 0 255 255 +255 0 0 255 0 0 255 0 0 255 0 0 0 0 0 255 0 0 0 255 0 0 0 0 255 0 0 0 255 +0 0 0 0 255 0 0 0 0 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 255 0 0 255 0 0 0 0 255 0 0 255 255 255 0 0 0 255 0 0 0 0 255 0 +255 0 0 0 0 255 0 0 0 0 255 255 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 +0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 255 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 127 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 255 255 255 255 255 255 +0 0 255 0 255 0 255 0 255 0 0 255 0 0 255 0 0 0 0 0 255 0 0 0 255 0 0 0 +0 0 0 0 255 0 0 0 0 0 0 255 0 0 255 0 255 0 255 0 0 0 0 255 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 0 0 +0 0 255 0 0 0 0 0 0 255 0 0 0 255 0 255 0 0 255 0 0 0 0 0 0 255 0 0 0 0 +0 0 0 0 0 0 255 0 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 0 255 0 0 0 255 +0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 255 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 255 0 255 +0 0 0 0 255 0 255 0 0 0 255 0 0 255 0 255 0 0 0 0 0 0 0 255 0 255 0 0 0 +0 0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 255 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 0 0 0 +0 255 0 0 0 0 0 0 255 0 0 255 0 0 255 0 0 255 255 255 255 255 0 0 255 255 +255 255 255 0 0 0 0 0 0 255 0 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 0 255 +0 0 0 255 0 0 0 0 0 0 255 255 0 0 0 0 255 255 255 255 255 255 0 0 0 0 255 +255 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 255 0 0 +0 0 0 0 0 0 0 0 255 0 255 0 0 0 0 0 255 255 0 0 0 0 255 255 0 0 255 0 0 +255 255 0 0 0 255 255 0 0 0 255 0 0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 0 0 +0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 255 0 0 0 0 +255 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 255 255 255 0 0 255 0 0 0 255 +0 0 0 0 0 0 0 255 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 255 255 255 +0 0 255 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 255 255 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 255 255 0 0 0 0 0 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 +0 0 0 0 255 0 0 0 0 0 0 0 0 255 255 255 255 255 255 0 0 0 0 0 255 255 0 +0 0 0 0 0 0 255 0 255 0 0 255 0 255 0 0 255 0 0 255 0 0 0 0 0 255 0 0 0 +0 0 0 255 0 0 0 0 0 0 0 0 255 255 255 255 255 255 255 0 0 0 0 0 255 255 +255 0 0 0 0 0 0 255 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 0 255 255 +0 0 0 0 0 0 0 0 255 0 255 255 255 255 255 255 0 0 0 0 0 0 255 0 255 0 0 +0 0 255 0 0 0 0 255 0 0 0 255 0 0 0 0 255 0 0 255 255 255 255 255 0 0 0 +0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 255 255 255 255 255 255 0 0 0 0 0 0 0 +0 255 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 255 0 0 0 0 +0 0 0 0 0 0 255 0 255 0 0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 0 255 0 0 255 +0 255 0 0 0 255 255 0 0 0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 +0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 255 0 0 0 0 255 0 0 0 +0 255 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 0 0 0 255 +0 255 0 0 0 0 255 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 0 0 255 0 0 +0 0 0 0 0 0 0 0 0 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 0 +0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 255 0 255 0 0 0 0 0 255 0 255 0 255 0 0 0 0 0 255 0 0 255 0 0 255 0 255 +0 0 0 255 255 0 0 0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 255 +0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 0 255 0 0 0 0 +255 0 0 0 255 0 0 0 0 0 0 255 0 0 0 0 255 0 0 0 0 0 255 0 0 255 0 0 0 0 +255 0 255 0 0 0 0 255 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 0 255 0 +0 0 255 0 0 0 255 0 0 0 0 0 0 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 255 0 0 0 0 0 +0 0 0 0 255 0 255 0 0 0 0 0 0 255 255 255 0 0 0 0 0 255 0 0 0 0 255 255 +0 0 0 255 255 255 0 0 255 0 0 0 0 0 0 255 0 0 0 0 255 0 0 0 0 0 0 0 0 0 +0 0 0 255 0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 255 0 0 0 0 255 255 255 +255 0 0 0 255 255 255 255 255 0 255 255 255 255 255 255 0 0 255 255 255 +255 0 0 0 0 0 0 255 0 0 0 255 255 255 255 0 0 0 255 255 255 255 0 0 0 255 +0 0 0 0 0 0 255 255 255 255 0 0 0 255 255 255 0 0 0 0 255 0 0 0 255 0 0 +0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 255 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 +0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 255 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 255 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 +0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 127 127 127 0 +127 127 127 0 127 127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 +127 127 127 127 0 127 127 127 127 127 127 127 127 127 127 127 0 127 127 +127 127 127 127 127 0 127 127 127 0 127 127 127 0 127 127 127 127 0 127 +127 127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 0 127 127 127 +127 0 127 127 127 0 127 127 127 127 0 127 127 127 127 127 127 0 127 127 +127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 +127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 +0 127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 +127 0 127 127 0 127 127 127 127 0 127 127 127 127 127 127 127 127 0 127 +127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 127 0 127 127 +127 127 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 0 255 0 0 0 0 0 255 255 255 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 255 +255 255 255 0 0 0 0 0 0 0 255 0 0 0 0 255 255 255 255 255 0 0 0 0 255 255 +255 255 0 255 255 255 255 255 0 0 0 255 255 255 255 255 255 0 255 255 255 +255 255 0 0 0 255 255 255 255 0 0 255 0 0 0 0 0 255 0 255 255 255 0 0 255 +255 255 0 255 0 0 0 0 255 0 255 0 0 0 0 0 255 255 0 0 0 0 255 255 0 255 +255 0 0 0 0 255 0 0 0 255 255 255 255 0 0 0 255 255 255 255 255 0 0 0 0 +255 255 255 255 0 0 0 255 255 255 255 0 0 0 0 255 255 255 255 0 0 255 255 +255 255 255 255 255 0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 255 0 0 0 +0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 0 255 0 255 255 255 255 +255 255 0 0 255 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 255 255 0 0 0 0 255 255 0 0 +0 0 255 0 255 0 0 0 255 0 0 0 0 255 0 0 255 0 0 0 0 0 255 0 0 0 0 255 0 +0 255 0 0 0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 0 255 0 255 0 0 0 0 0 255 0 +0 255 0 0 0 0 0 255 0 255 0 0 0 255 0 0 255 0 0 0 0 0 255 255 0 0 0 0 255 +255 0 255 255 0 0 0 0 255 0 0 255 0 0 0 0 255 0 0 255 0 0 0 0 255 0 0 255 +0 0 0 0 255 0 0 255 0 0 0 255 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 +0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 255 0 0 0 0 255 0 0 0 0 255 0 0 255 +0 0 255 0 0 0 255 0 0 0 255 0 0 0 0 0 0 0 255 0 0 255 0 0 0 0 255 0 0 0 +0 0 0 255 0 0 0 0 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 127 0 255 0 255 255 255 255 0 255 0 0 0 0 255 0 255 0 0 0 255 0 0 +0 0 255 0 255 0 0 0 0 0 0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 0 255 0 0 0 +0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 0 255 0 0 255 0 0 0 0 0 255 0 255 0 0 +255 0 0 0 255 0 0 0 0 0 255 0 255 0 0 255 0 255 0 255 0 255 0 0 0 255 0 +255 0 0 0 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 0 0 255 0 255 0 0 0 +255 0 0 255 0 0 0 0 0 0 0 0 0 255 0 0 0 0 255 0 0 0 0 0 255 0 0 255 0 0 +0 255 0 0 0 255 0 0 255 0 255 0 0 255 0 0 0 255 0 0 255 0 0 0 255 0 0 0 +255 0 0 0 0 0 0 255 0 0 0 255 0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 255 0 0 +0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 255 0 255 0 0 +0 255 0 0 255 0 0 0 255 0 255 0 0 0 255 0 0 0 0 255 0 255 0 0 0 0 0 0 255 +0 0 0 0 0 255 0 255 0 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 +0 0 0 255 0 0 255 0 0 0 0 0 255 0 255 0 255 0 0 0 0 255 0 0 0 0 0 255 0 +255 0 0 255 0 255 0 255 0 255 0 0 0 255 0 255 0 0 0 0 0 0 255 0 255 0 0 +0 0 255 0 255 0 0 0 0 0 0 255 0 255 0 0 0 255 0 0 255 0 0 0 0 0 0 0 0 0 +255 0 0 0 0 255 0 0 0 0 0 255 0 0 255 0 0 0 255 0 0 0 255 0 0 255 0 255 +0 0 255 0 0 0 0 255 255 0 0 0 0 0 255 0 255 0 0 0 0 0 0 255 0 0 0 0 255 +0 0 0 0 255 0 0 0 0 0 0 255 0 0 255 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 127 255 0 255 0 0 0 255 0 0 255 0 0 255 0 0 0 255 +0 0 255 255 255 255 255 0 0 255 0 0 0 0 0 0 255 0 0 0 0 0 255 0 255 255 +255 255 255 255 0 255 255 255 255 255 0 255 0 0 0 255 255 255 0 255 255 +255 255 255 255 255 0 0 255 0 0 0 0 0 255 0 255 255 0 0 0 0 0 255 0 0 0 +0 0 255 0 255 0 0 255 0 255 0 255 0 0 255 0 0 255 0 255 0 0 0 0 0 0 255 +0 255 0 0 0 0 255 0 255 0 0 0 0 0 0 255 0 255 255 255 255 0 0 0 0 255 255 +255 255 0 0 0 0 0 255 0 0 0 0 255 0 0 0 0 0 255 0 0 255 0 0 0 255 0 0 0 +255 0 0 255 0 255 0 0 255 0 0 0 0 255 255 0 0 0 0 0 0 255 0 0 0 0 0 0 255 +0 0 0 0 0 255 0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 255 0 255 0 0 0 255 0 0 255 0 0 255 +0 0 0 255 0 0 255 0 0 0 0 255 0 255 0 0 0 0 0 0 255 0 0 0 0 0 255 0 255 +0 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 0 255 +0 0 0 0 0 255 0 255 0 255 0 0 0 0 255 0 0 0 0 0 255 0 0 255 255 0 0 255 +0 255 0 0 0 255 0 255 0 255 0 0 0 0 0 0 255 0 255 255 255 255 255 0 0 255 +0 0 0 0 0 0 255 0 255 0 0 255 0 0 0 0 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 +0 0 0 0 0 255 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 255 0 255 0 0 0 0 +255 255 0 0 0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 0 255 0 0 +0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 127 255 0 255 0 0 0 255 0 0 255 0 0 255 255 255 255 255 0 0 255 0 0 0 +0 255 0 255 0 0 0 0 0 0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 0 255 0 0 0 0 +0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 0 255 0 0 0 0 0 255 0 255 0 0 +255 0 0 0 255 0 0 0 0 0 255 0 0 255 255 0 0 255 0 255 0 0 0 255 0 255 0 +255 0 0 0 0 0 0 255 0 255 0 0 0 0 0 0 255 0 0 0 0 0 0 255 0 255 0 0 0 255 +0 0 0 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 0 255 0 0 0 255 0 255 +0 0 0 0 0 255 255 0 0 0 255 255 0 0 0 0 255 0 0 255 0 0 0 0 0 255 0 0 0 +0 0 255 0 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 255 0 255 255 255 255 +255 255 0 0 255 0 0 0 0 0 255 0 255 0 0 0 0 255 0 0 255 0 0 0 0 0 255 0 +0 0 0 255 0 0 255 0 0 0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 0 255 0 255 0 0 +0 0 0 255 0 0 255 0 0 0 0 0 255 0 255 0 0 0 255 0 0 255 0 0 0 0 0 255 0 +0 0 0 0 0 255 0 255 0 0 0 0 255 255 0 0 255 0 0 0 0 255 0 0 255 0 0 0 0 +0 0 0 255 0 0 0 0 255 0 0 255 0 0 0 255 0 0 255 0 0 0 0 255 0 0 0 0 255 +0 0 0 0 0 255 0 0 0 255 0 0 0 0 255 0 255 0 0 0 0 0 255 0 0 0 0 0 255 0 +0 0 0 255 0 0 255 0 0 0 0 0 255 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 0 +255 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 127 0 255 255 0 0 0 0 0 0 0 0 255 0 0 0 0 0 255 0 255 255 255 +255 255 0 0 0 0 255 255 255 255 0 255 255 255 255 255 0 0 0 255 255 255 +255 255 255 0 255 0 0 0 0 0 0 0 255 255 255 255 255 0 255 0 0 0 0 0 255 +0 255 255 255 0 255 255 255 0 0 255 0 0 0 0 255 0 255 255 255 255 255 0 +255 0 0 0 0 0 0 255 0 255 0 0 0 0 255 255 0 0 0 255 255 255 255 0 0 0 255 +0 0 0 0 0 0 0 0 255 255 255 255 0 0 0 255 0 0 0 0 255 0 0 255 255 255 255 +0 0 0 0 0 255 0 0 0 0 0 0 255 255 255 0 0 0 0 0 0 255 0 0 0 0 0 0 255 0 +0 0 0 0 255 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 255 255 255 255 +255 0 0 255 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 255 255 255 255 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 0 255 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 0 0 0 0 255 0 0 +255 255 255 0 0 0 0 0 0 0 0 0 0 255 255 255 255 255 255 255 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 127 127 127 127 127 127 127 127 127 127 0 127 127 127 +127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 +127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 +0 127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 +0 127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 0 127 +127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 +127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 +127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 +127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 127 127 127 +127 0 127 127 127 127 127 127 127 127 127 127 127 0 127 127 127 127 127 +127 0 127 127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 +127 0 127 127 127 127 0 127 127 127 127 0 127 127 127 127 127 127 127 127 +0 127 127 127 127 127 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 255 +0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 +0 0 0 0 0 0 255 255 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 +0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 0 0 0 255 +0 0 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 127 0 255 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 255 0 0 0 +0 0 0 255 0 0 255 0 255 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +255 255 255 255 255 255 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 +0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 +0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 +0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 255 +0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 255 255 255 0 0 255 0 255 255 +255 0 0 0 255 255 255 255 0 0 255 255 255 255 255 0 0 255 255 255 255 0 +0 255 255 255 255 0 255 255 255 255 255 0 255 0 255 255 255 0 0 255 0 255 +255 0 255 0 0 0 255 0 255 0 255 255 255 255 0 255 255 255 0 0 255 0 255 +255 255 0 0 0 255 255 255 255 0 0 255 0 255 255 255 0 0 0 255 255 255 255 +255 0 255 0 255 0 0 255 255 255 0 255 255 255 255 0 255 0 0 0 0 255 0 255 +0 0 0 255 0 255 0 0 0 255 0 0 0 255 0 255 0 0 0 255 0 255 0 0 0 255 0 255 +255 255 255 0 0 0 255 0 0 0 0 0 255 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 +0 0 0 0 0 0 255 0 255 255 0 0 0 255 0 255 0 0 0 0 0 255 0 0 0 0 255 0 255 +0 0 0 0 255 0 0 255 0 0 255 0 0 0 0 255 0 255 255 0 0 0 255 0 255 0 0 255 +0 255 0 0 255 0 0 255 0 255 0 0 0 255 0 0 0 255 0 255 255 0 0 0 255 0 255 +0 0 0 0 255 0 255 255 0 0 0 255 0 255 0 0 0 0 255 0 255 255 0 0 255 0 0 +0 0 0 255 0 0 0 255 0 0 0 0 255 0 255 0 0 0 255 0 255 0 0 0 255 0 0 0 255 +0 0 255 0 255 0 0 255 0 0 0 255 0 0 0 0 255 0 0 0 255 0 0 0 0 0 255 0 0 +0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 255 0 255 0 0 0 0 255 0 255 +0 0 0 0 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 0 255 0 0 255 0 0 0 0 255 +0 255 0 0 0 0 255 0 255 0 0 255 0 255 0 255 0 0 0 255 0 255 0 0 0 255 0 +0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 +0 0 255 0 255 0 0 0 255 0 0 0 0 0 255 0 0 0 255 0 0 0 0 255 0 0 255 0 255 +0 0 0 255 0 255 0 255 0 255 0 0 0 255 0 255 0 0 0 255 0 255 0 0 0 0 255 +0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 255 0 0 0 0 0 255 255 0 0 0 255 0 0 0 +255 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 +0 255 255 255 255 0 255 0 0 0 0 255 0 255 0 0 0 0 0 255 0 0 0 0 255 0 255 +255 255 255 255 255 0 0 255 0 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 255 +0 0 255 0 255 255 0 0 0 0 255 0 255 0 0 0 255 0 0 0 255 0 255 0 0 0 0 255 +0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 +255 0 0 0 255 0 0 0 255 0 0 0 0 255 0 0 255 0 255 0 0 0 255 0 255 0 255 +0 255 0 0 0 0 255 0 0 0 0 255 0 255 0 0 0 255 0 0 0 255 255 0 0 0 0 0 0 +255 0 0 0 0 0 255 255 0 0 255 0 0 255 0 0 255 0 0 0 255 0 0 0 0 0 0 0 255 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 255 0 0 0 255 0 255 0 +0 0 0 255 0 255 0 0 0 0 0 255 0 0 0 0 255 0 255 0 0 0 0 0 0 0 255 0 0 255 +0 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 255 0 255 0 255 0 0 0 255 0 255 +0 0 0 255 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 +0 255 0 0 0 0 255 0 255 0 0 0 0 0 0 255 0 0 255 0 0 0 255 0 0 0 0 255 0 +0 255 0 255 0 0 0 255 0 255 0 255 0 255 0 0 0 255 0 255 0 0 0 255 0 255 +0 0 0 255 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 255 +255 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 +0 0 0 0 0 0 255 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 0 255 0 0 0 255 +255 0 255 0 0 0 0 255 0 0 255 0 0 255 0 0 0 255 255 0 255 0 0 0 0 255 0 +255 0 0 255 0 255 0 0 255 0 0 255 0 255 0 0 0 255 0 0 0 255 0 255 0 0 0 +0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 255 255 0 255 0 0 +0 0 0 0 255 0 0 255 0 0 0 255 0 0 0 255 255 0 0 0 255 0 0 0 0 0 255 0 0 +0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 0 0 255 0 0 0 0 0 0 255 0 0 0 0 0 +255 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 255 255 255 255 0 255 255 +255 255 255 0 0 0 255 255 255 255 0 0 255 255 255 0 255 0 0 255 255 255 +255 0 0 0 255 0 0 0 255 255 255 0 255 0 255 0 0 0 0 255 0 255 0 0 255 0 +255 0 0 0 255 0 255 0 255 0 0 0 255 0 0 0 255 0 255 0 0 0 0 255 0 0 255 +255 255 255 0 0 255 255 255 255 255 0 0 0 255 255 255 0 255 0 255 0 0 0 +255 255 255 0 0 0 0 255 255 0 0 255 255 255 0 255 0 0 0 255 0 0 0 0 0 255 +0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 255 255 255 255 0 0 0 255 +0 0 0 0 0 255 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 255 255 +255 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 255 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 255 255 255 255 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 +0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 255 255 0 0 0 +255 0 0 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 127 127 127 127 0 127 127 127 127 127 0 +127 127 127 127 127 127 0 127 127 127 127 127 0 127 127 127 127 127 127 +0 127 127 127 127 127 127 0 127 127 127 0 127 127 127 127 127 127 0 127 +127 127 127 127 127 0 127 0 127 127 0 127 127 127 127 127 0 127 0 127 127 +127 127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 +127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 +0 127 127 127 127 0 127 127 127 127 0 127 127 127 127 127 127 0 127 127 +127 127 127 0 127 127 127 127 127 127 127 127 127 0 127 127 127 127 127 +0 127 127 127 127 127 0 127 127 127 127 0 127 127 127 127 127 0 127 127 +127 127 0 127 127 127 127 127 0 127 127 127 127 127 127 127 127 127 0 127 +127 127 127 127 127 127 127 127 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 255 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 255 0 0 255 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 255 0 +0 0 0 0 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 255 0 255 0 255 +0 0 0 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 +255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 255 0 0 0 0 0 0 0 0 0 127 0 0 255 +255 255 255 0 0 0 255 255 255 255 255 255 255 255 255 0 0 0 0 0 0 0 0 255 +255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 0 +255 0 0 255 0 0 0 255 255 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 255 255 255 255 +0 0 0 0 0 0 0 0 0 255 255 255 255 255 255 255 255 255 0 0 0 255 255 255 +255 255 255 255 255 255 0 255 255 255 255 255 255 0 0 0 255 255 255 255 +255 255 255 255 255 0 0 0 255 255 255 255 255 255 255 255 255 0 255 0 0 +0 255 0 255 0 255 0 0 0 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 255 0 255 255 0 0 0 255 255 255 0 255 0 0 0 255 0 0 255 255 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 255 255 255 255 255 +255 0 0 255 255 0 0 255 0 0 0 0 0 255 0 127 0 255 0 0 0 0 0 0 0 255 0 0 +0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 +255 255 255 255 0 0 255 255 255 255 255 0 0 0 0 0 0 0 0 255 0 0 255 0 0 +255 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 255 0 +0 0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 255 0 0 0 0 0 0 +0 255 0 0 0 255 0 0 0 0 0 0 0 255 0 0 255 0 255 0 0 0 255 0 255 0 255 0 +255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +255 0 0 255 255 0 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 255 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 255 0 0 127 255 0 0 0 0 +0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 255 0 0 255 0 +0 255 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 255 0 255 0 0 0 0 0 255 +0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 255 0 0 0 0 0 +0 0 255 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 255 +0 255 0 255 0 0 255 255 255 0 0 255 0 0 0 0 255 255 255 255 0 255 255 255 +0 0 0 0 255 0 0 0 0 0 0 0 255 0 255 255 255 255 0 0 255 0 0 0 255 0 0 127 +255 255 255 255 255 255 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 0 0 0 +0 0 0 0 255 0 0 255 0 255 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 255 +0 0 255 0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 255 0 +0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 255 0 0 255 0 0 0 255 0 255 0 0 0 0 0 0 255 0 0 255 0 0 +0 0 255 0 0 0 255 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 255 0 0 0 255 0 255 +0 0 0 127 255 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 0 0 255 255 +255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 +0 0 0 0 0 0 0 0 255 255 0 0 255 0 0 255 255 0 0 0 255 255 0 0 0 255 255 +255 255 0 0 0 255 0 0 0 255 0 0 0 0 0 255 255 255 255 255 0 0 0 255 0 0 +0 0 0 0 0 255 0 0 0 255 0 0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 255 0 0 +0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 255 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 +0 0 0 0 0 0 255 0 255 0 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 0 0 0 0 255 +0 0 0 255 0 0 0 0 0 255 0 0 0 0 127 255 255 255 255 255 255 0 0 0 255 0 +0 0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 255 0 0 0 0 255 255 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 255 +0 0 255 0 255 0 0 255 0 0 0 0 0 0 255 0 0 255 0 0 0 255 0 0 0 0 0 255 0 +0 0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 255 0 0 0 0 0 0 255 0 0 0 0 0 0 +0 255 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 +255 255 255 0 255 255 255 255 255 0 255 255 255 255 255 255 255 255 255 +255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 0 0 0 0 0 255 +0 255 0 0 0 0 255 255 255 255 255 0 0 0 255 0 0 0 0 0 0 0 255 0 0 255 0 +0 0 0 0 0 255 0 0 0 0 127 255 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 +0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 +255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 255 0 0 255 0 255 0 0 255 0 0 0 +0 0 0 255 0 0 0 255 0 0 255 0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 0 0 +0 255 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 255 0 0 0 0 0 0 +0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 255 +0 0 255 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 255 0 0 0 0 +0 0 255 0 0 0 0 127 0 255 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 255 0 +0 0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 +255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 255 0 0 255 0 255 0 0 255 0 255 +0 0 0 0 255 0 0 0 0 255 0 0 255 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 0 +0 0 255 0 255 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 255 0 0 0 0 0 +0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 255 0 +0 0 255 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 255 0 0 0 0 0 +0 0 255 0 0 0 0 127 0 0 255 255 255 255 0 0 0 255 255 255 255 255 255 255 +255 255 0 0 255 0 0 0 255 0 0 0 0 0 255 0 255 0 0 255 0 0 255 0 0 255 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 255 255 0 +0 0 255 255 0 0 0 255 255 255 255 0 0 0 0 0 0 0 0 0 255 255 255 255 255 +255 255 255 255 0 0 0 255 255 255 255 255 255 255 255 255 0 255 255 255 +255 255 255 0 0 0 255 255 255 255 255 255 255 255 255 0 0 0 255 255 255 +255 255 255 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 +255 255 0 0 0 0 0 0 0 0 255 255 255 255 0 255 255 255 255 0 0 0 255 255 +255 255 255 255 255 255 255 0 255 255 255 255 0 0 0 0 255 0 0 0 0 127 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 255 255 0 0 0 0 0 255 0 255 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 +127 127 127 0 127 127 0 127 127 127 127 127 127 0 127 127 127 127 0 127 +127 127 127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 +127 127 127 0 127 127 127 127 127 0 127 127 127 127 127 127 127 127 127 +127 127 127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 +127 0 127 127 127 127 127 127 127 127 127 127 127 0 127 127 127 127 127 +127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 +127 127 127 127 127 127 0 127 127 127 127 127 127 127 127 127 127 127 0 +127 127 0 127 127 0 127 127 127 127 0 127 127 127 127 0 127 127 127 127 +0 127 127 127 127 127 0 127 127 127 127 127 127 127 127 127 127 127 0 127 +127 127 127 127 127 0 127 127 127 127 127 127 127 127 127 127 0 127 127 +127 127 0 127 127 127 127 0 127 127 127 127 127 127 127 127 127 127 0 127 +127 127 127 127 127 127 127 127 127 127 0 127 127 127 127 0 127 127 127 +127 127 127 127 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 255 255 255 255 255 255 255 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 255 0 0 0 +0 0 255 0 0 0 0 0 255 255 255 255 0 0 0 0 0 0 0 0 255 0 0 0 0 0 255 0 0 +255 0 0 0 0 255 255 255 255 0 0 255 0 0 255 0 0 0 0 0 255 255 255 255 0 +0 0 0 0 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 +255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 0 0 0 0 0 0 0 0 0 0 0 255 +255 255 0 0 0 255 255 255 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 255 255 255 +255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 255 255 255 0 0 0 0 0 0 +0 0 0 0 0 255 0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 0 255 0 0 0 0 0 255 255 +255 0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 +0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 +0 0 0 0 255 255 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 255 255 0 0 0 0 255 255 0 0 0 0 0 0 0 0 0 0 255 0 0 255 0 0 0 0 255 +0 0 0 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 +255 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 0 0 255 0 0 0 255 0 0 +0 0 0 0 0 0 0 255 255 0 0 0 255 0 0 0 0 0 0 255 255 0 0 0 0 255 0 0 0 0 +0 0 0 0 255 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 127 0 0 0 0 0 255 0 0 0 0 255 255 255 255 0 0 255 0 0 0 0 +0 255 0 0 0 0 255 0 0 0 255 0 255 0 0 0 0 255 0 0 0 255 0 0 0 0 0 0 0 0 +0 0 0 0 0 255 0 0 255 255 0 0 255 0 0 0 0 255 255 255 0 0 0 255 0 0 255 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 255 255 255 0 0 255 0 0 0 0 0 0 0 0 +0 0 255 0 0 255 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 255 255 0 0 0 0 0 +0 0 0 0 255 0 0 0 0 255 0 255 255 255 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 255 0 0 255 0 0 0 255 0 255 0 0 255 0 0 0 0 0 255 0 0 0 255 0 0 0 +0 0 0 0 255 0 0 0 255 0 0 0 0 0 0 0 255 255 0 0 0 255 0 0 0 0 0 0 0 255 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 255 0 0 +0 255 0 255 0 0 0 0 255 0 0 0 0 0 0 255 255 255 255 0 0 0 0 255 0 255 0 +0 0 0 255 0 0 0 0 255 255 0 0 0 0 0 0 0 0 0 0 255 0 0 255 0 0 255 0 0 255 +0 0 255 0 0 255 0 0 255 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 255 +0 0 255 0 0 255 0 0 0 0 0 0 0 0 0 0 255 255 0 0 0 0 0 255 0 0 0 0 0 0 255 +0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 255 0 0 0 0 255 0 255 255 255 255 0 255 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 255 0 0 0 255 0 0 255 0 0 255 0 0 +0 0 255 0 0 255 0 0 0 0 0 0 0 0 255 0 0 0 255 0 0 0 0 0 0 0 0 0 255 0 255 +0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 +0 0 0 0 0 255 0 0 0 255 0 255 0 0 0 0 255 0 0 0 0 0 0 255 0 0 255 0 0 0 +0 0 255 0 0 0 0 0 0 0 0 0 255 0 0 255 0 0 0 0 0 0 0 0 0 255 0 0 255 0 0 +0 0 0 255 0 0 255 0 0 255 0 255 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +255 0 0 255 0 0 255 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 255 +255 255 255 0 0 255 255 255 255 0 0 255 255 255 0 0 0 0 0 0 0 0 0 255 0 +0 0 0 255 0 0 255 255 255 0 255 0 0 255 0 0 0 0 0 0 0 0 0 0 0 255 255 255 +0 255 0 0 0 255 0 0 0 255 0 0 255 0 0 0 255 0 0 255 0 0 255 255 0 0 0 0 +255 0 0 255 0 255 255 255 0 0 0 0 0 0 255 0 255 0 0 255 255 0 0 0 255 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 255 0 0 +0 255 0 255 0 0 0 255 255 255 255 255 0 0 0 255 0 0 255 0 0 0 255 255 255 +255 255 0 0 0 0 0 0 0 255 0 0 0 255 0 0 0 0 0 0 0 0 255 0 0 255 0 0 0 0 +0 255 0 0 0 255 255 255 0 255 0 0 255 0 0 0 0 255 255 255 255 255 255 255 +0 255 255 255 0 255 0 0 255 255 255 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 255 +0 0 0 0 255 0 255 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 0 +0 0 0 255 0 0 255 0 0 0 0 0 255 0 0 255 0 255 0 0 0 0 0 0 0 255 0 0 0 0 +255 0 0 255 255 255 0 255 0 0 255 0 255 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 255 0 0 0 255 0 255 0 0 0 0 +255 0 0 0 0 0 0 255 255 255 255 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 255 +0 0 255 0 0 0 0 0 0 0 0 255 0 0 255 0 0 255 0 0 255 0 0 0 0 0 0 0 0 255 +0 0 255 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 255 0 0 255 0 0 255 0 0 255 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 255 0 0 255 0 0 0 0 0 255 0 0 255 0 0 255 0 0 0 0 0 +0 255 0 0 0 0 255 0 0 0 0 0 0 255 0 0 255 0 0 255 0 255 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 255 0 0 0 255 0 255 +0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 +0 255 255 0 0 0 0 0 0 0 0 0 0 255 0 0 255 255 0 0 255 0 0 0 0 0 0 0 0 0 +0 255 0 0 255 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 255 0 255 0 0 0 255 255 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 255 255 255 255 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 255 255 0 0 0 0 255 0 255 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 255 0 0 0 0 0 0 255 0 0 255 +255 255 255 255 0 0 0 0 0 255 0 0 0 255 0 0 0 0 0 0 0 255 0 0 255 255 255 +255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 +0 0 0 0 0 255 0 0 0 0 255 255 255 255 0 255 255 255 255 255 255 0 0 0 0 +0 0 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 255 +255 0 0 0 0 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 +0 0 0 0 255 255 0 0 0 0 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 255 0 255 0 0 0 +0 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 255 0 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 255 255 255 255 0 0 0 0 255 +0 0 0 0 0 0 255 0 0 255 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 255 255 +255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 255 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 255 0 255 0 0 0 +0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 255 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 255 255 255 +255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 +0 0 255 0 255 0 0 0 0 0 0 0 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 +127 127 0 127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 +0 127 127 127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 0 +127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 +127 127 127 127 127 0 127 127 127 127 127 0 127 127 127 127 127 127 127 +0 127 127 127 127 127 127 127 0 127 127 127 0 127 127 127 127 127 127 127 +127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 0 127 127 127 +127 127 127 127 0 127 127 127 127 127 0 127 127 127 127 127 0 127 127 127 +127 127 0 127 127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 +127 0 127 127 127 127 127 127 0 127 127 127 127 127 0 127 127 127 127 127 +0 127 127 127 127 127 127 0 127 127 127 127 127 127 127 127 127 127 127 +0 127 127 127 127 127 127 127 127 127 127 127 0 127 127 127 127 127 127 +127 127 127 127 127 0 127 127 127 127 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 127 0 0 255 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 255 255 +0 0 0 0 0 255 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 255 0 0 0 0 255 255 0 +0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 255 0 0 255 255 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 255 255 0 255 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 255 +255 0 0 0 0 0 0 0 255 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 255 255 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 127 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 0 0 255 0 0 255 0 0 0 +255 0 255 255 0 0 0 0 255 0 0 0 255 0 0 0 0 255 0 255 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 0 255 0 0 255 0 +0 0 255 0 0 255 0 0 0 255 0 0 0 255 0 0 255 0 0 255 255 0 255 0 0 0 0 0 +0 0 0 0 0 255 0 255 255 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 0 0 +0 255 0 0 255 0 0 0 0 0 255 0 255 255 0 0 0 0 0 255 0 0 255 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 0 0 255 +0 0 255 0 0 0 255 0 0 0 255 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 255 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 255 0 0 0 0 0 0 0 255 0 +0 0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 +0 0 0 0 0 0 255 255 255 255 255 255 255 0 0 0 255 255 255 255 0 255 255 +255 255 255 255 0 255 255 255 255 255 255 0 255 255 255 255 255 255 0 255 +255 255 255 255 255 0 255 255 255 0 255 255 255 0 255 255 255 0 255 255 +255 0 0 255 255 255 255 0 0 0 255 255 0 0 0 0 255 0 0 0 255 255 255 255 +0 0 0 0 0 255 255 255 255 0 0 0 0 0 255 255 255 255 0 0 0 0 0 255 255 255 +255 0 0 0 0 0 255 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 255 +0 255 0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 255 +0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 0 255 0 0 0 255 0 0 0 +0 0 0 0 0 0 0 0 127 0 0 255 0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 255 +0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 0 +255 0 255 0 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 0 0 0 255 +0 0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 255 +0 0 0 255 0 0 255 255 0 0 0 0 255 0 0 255 0 0 0 0 255 0 0 0 255 0 0 0 0 +255 0 0 0 255 0 0 0 0 255 0 0 0 255 0 0 0 0 255 0 0 0 255 0 0 0 0 255 0 +0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 255 0 0 255 0 0 0 0 0 255 0 255 0 0 0 +0 0 255 0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 0 255 0 0 0 255 0 0 255 +0 0 0 0 0 0 255 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 127 0 0 255 0 255 0 0 0 +0 0 255 0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 255 +0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 0 255 0 0 0 0 0 255 0 0 0 0 0 0 255 +0 0 0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 +255 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 0 255 0 255 0 255 0 0 0 255 0 255 +0 0 0 0 0 0 255 0 255 0 0 0 0 0 0 255 0 255 0 0 0 0 0 0 255 0 255 0 0 0 +0 0 0 255 0 255 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 255 0 255 +0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 255 0 0 0 +0 0 255 0 0 255 0 0 0 255 0 0 255 255 255 255 255 0 0 255 0 0 0 255 0 0 +0 0 0 0 0 0 0 0 0 127 0 0 255 0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 +255 0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 255 0 0 0 0 +0 255 0 0 255 0 0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 0 0 0 +255 0 0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 255 0 0 +0 255 0 0 0 0 255 0 255 0 255 0 0 0 255 0 255 0 0 0 0 0 0 255 0 255 0 0 +0 0 0 0 255 0 255 0 0 0 0 0 0 255 0 255 0 0 0 0 0 0 255 0 255 0 0 0 0 0 +0 255 0 0 0 255 0 0 0 255 0 0 255 0 0 0 255 0 0 255 0 255 0 0 0 0 0 255 +0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 0 0 255 0 +255 0 0 0 255 0 0 0 0 255 0 255 0 255 255 0 0 0 0 0 0 0 0 0 0 0 0 127 0 +255 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 255 +0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 0 255 0 0 255 255 255 255 +255 0 255 0 0 0 0 0 0 255 255 255 255 255 255 0 255 255 255 255 255 255 +0 255 255 255 255 255 255 0 255 255 255 255 255 255 0 0 255 0 0 0 255 0 +0 0 255 0 0 0 255 0 0 255 255 255 255 0 0 255 0 255 0 0 255 0 0 255 0 255 +0 0 0 0 0 0 255 0 255 0 0 0 0 0 0 255 0 255 0 0 0 0 0 0 255 0 255 0 0 0 +0 0 0 255 0 255 0 0 0 0 0 0 255 0 0 0 0 255 0 255 0 0 0 255 0 0 255 0 0 +0 255 0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 255 +0 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 255 0 0 0 255 0 0 0 +0 0 0 0 0 0 0 0 127 0 255 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 +255 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 255 +255 255 255 255 0 0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 0 0 +0 255 0 0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 255 0 +0 0 255 0 0 0 0 255 0 255 0 0 0 255 0 255 0 255 0 0 0 0 0 0 255 0 255 0 +0 0 0 0 0 255 0 255 0 0 0 0 0 0 255 0 255 0 0 0 0 0 0 255 0 255 0 0 0 0 +0 0 255 0 0 0 0 0 255 0 0 0 0 255 0 0 255 0 0 0 255 0 255 0 0 0 0 0 255 +0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 0 0 0 255 +0 0 0 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 127 0 255 +255 255 255 255 0 0 0 255 255 255 255 255 0 0 0 255 255 255 255 255 0 0 +0 255 255 255 255 255 0 0 0 255 255 255 255 255 0 0 0 255 255 255 255 255 +0 0 0 255 0 0 0 255 0 0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 +0 0 0 255 0 0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 255 +0 0 0 255 0 0 0 0 255 0 255 0 0 0 255 0 255 0 255 0 0 0 0 0 0 255 0 255 +0 0 0 0 0 0 255 0 255 0 0 0 0 0 0 255 0 255 0 0 0 0 0 0 255 0 255 0 0 0 +0 0 0 255 0 0 0 0 255 0 255 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 0 +255 0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 0 0 0 +255 0 0 0 0 255 255 255 255 255 0 0 255 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 +127 255 0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 255 0 0 +0 0 0 255 0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 0 255 0 0 0 255 0 0 +0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 0 0 0 255 +0 0 0 0 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 255 0 0 +255 0 0 0 0 255 255 0 0 255 0 0 0 0 255 0 0 0 255 0 0 0 0 255 0 0 0 255 +0 0 0 0 255 0 0 0 255 0 0 0 0 255 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 +0 255 0 0 0 255 0 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 255 0 0 +0 255 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 0 0 255 0 0 0 0 255 0 0 0 0 0 +0 255 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 127 255 0 0 0 0 0 255 0 255 0 0 0 +0 0 255 0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 255 +0 0 0 0 0 255 0 255 0 0 0 0 255 255 255 255 255 0 0 0 255 255 255 255 0 +255 255 255 255 255 255 0 255 255 255 255 255 255 0 255 255 255 255 255 +255 0 255 255 255 255 255 255 0 255 255 255 0 255 255 255 0 255 255 255 +0 255 255 255 0 0 255 255 255 255 0 0 0 255 0 0 0 0 255 255 0 0 0 255 255 +255 255 0 0 0 0 0 255 255 255 255 0 0 0 0 0 255 255 255 255 0 0 0 0 0 255 +255 255 255 0 0 0 0 0 255 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 +255 255 255 0 0 0 0 0 255 255 255 0 0 0 0 0 255 255 255 0 0 0 0 0 255 255 +255 0 0 0 0 0 255 255 255 0 0 0 0 0 0 255 0 0 0 0 255 0 0 0 0 0 0 255 0 +255 255 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 127 127 127 127 127 +127 0 127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 +127 127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 127 127 +127 127 0 127 127 127 127 127 127 127 127 127 127 0 127 127 127 127 127 +127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 +127 127 0 127 127 127 127 127 127 0 127 127 127 0 127 127 127 0 127 127 +127 0 127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 127 127 127 +127 0 127 127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 127 +0 127 127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 127 0 127 +127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 127 0 127 127 +127 127 127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 127 +127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 +0 127 127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 +127 127 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 255 0 0 0 0 0 0 255 0 0 +0 0 255 255 0 0 0 255 255 0 255 0 0 0 0 0 0 0 0 255 0 0 255 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 0 255 255 0 0 +0 0 0 0 0 0 0 0 255 0 0 0 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 0 +255 0 0 255 0 0 0 0 0 0 0 0 0 255 0 0 0 0 255 255 0 0 0 0 0 255 255 0 255 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 +0 255 0 0 0 0 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 255 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 255 0 0 0 0 255 0 0 0 0 255 +0 0 255 0 255 0 255 255 0 0 0 255 0 0 255 0 0 255 0 0 255 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 0 255 0 0 255 0 0 +0 255 0 0 255 0 0 0 255 0 255 0 255 0 255 255 0 255 0 0 255 0 255 0 0 0 +255 0 255 255 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 255 0 0 255 0 0 0 255 +0 255 255 0 0 0 255 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +255 0 0 0 0 0 0 255 0 0 0 0 255 0 0 255 0 0 0 255 0 0 255 0 0 0 0 255 0 +0 0 255 0 0 0 0 0 0 0 255 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +127 0 255 255 255 0 0 0 255 255 255 0 0 0 255 255 255 0 0 0 255 255 255 +0 0 0 255 255 255 0 0 0 255 255 255 0 0 0 255 255 255 0 0 255 255 0 0 0 +0 255 255 255 255 0 0 255 255 255 255 0 0 0 255 255 255 255 0 0 0 255 255 +255 255 0 0 0 255 255 255 255 0 0 0 255 0 255 0 0 255 0 0 255 0 0 255 255 +0 255 0 0 255 0 255 255 255 0 0 0 255 255 255 255 0 0 0 255 255 255 255 +0 0 0 255 255 255 255 0 0 0 255 255 255 255 0 0 0 255 255 255 255 0 0 0 +0 0 0 255 0 0 0 0 0 0 255 255 255 255 0 0 255 0 0 0 0 255 0 255 0 0 0 0 +255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 255 0 255 0 255 255 +255 0 0 255 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 255 0 0 0 0 0 +255 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 0 255 +255 0 0 255 0 0 255 0 0 0 0 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 255 0 +0 0 0 255 0 255 0 0 0 0 255 0 0 255 0 255 0 0 255 0 0 255 0 0 0 0 0 0 255 +0 255 255 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 +0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 255 +0 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 +0 255 0 0 0 255 0 255 255 0 0 0 255 0 255 0 0 0 255 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 127 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 0 +255 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 255 0 255 0 0 0 0 0 255 0 0 0 0 +255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 0 255 0 255 +0 0 255 0 0 255 0 0 255 255 255 255 255 0 255 0 0 0 0 255 0 255 0 0 0 0 +255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 +255 0 0 0 0 0 0 0 0 0 0 255 0 0 0 255 0 255 0 255 0 0 0 0 255 0 255 0 0 +0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 0 255 0 255 0 0 255 0 0 0 +0 255 0 0 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 255 255 255 255 0 0 +255 255 255 255 0 0 255 255 255 255 0 0 255 255 255 255 0 0 255 255 255 +255 0 0 255 255 255 255 0 0 255 255 255 255 255 255 255 255 255 0 255 0 +0 0 0 0 255 255 255 255 255 255 0 255 255 255 255 255 255 0 255 255 255 +255 255 255 0 255 255 255 255 255 255 0 0 255 0 255 0 0 255 0 0 255 0 255 +0 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 255 +0 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 0 255 255 255 255 255 +255 255 0 255 0 0 255 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 255 +0 0 0 0 255 0 255 0 0 0 0 255 0 0 255 0 255 0 0 255 0 0 0 0 255 0 0 255 +0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 255 0 0 0 255 0 255 0 0 0 255 0 255 +0 0 0 255 0 255 0 0 0 255 0 255 0 0 0 255 0 255 0 0 0 255 0 255 0 0 0 255 +0 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 0 0 +0 255 0 0 0 0 0 0 0 255 0 255 0 0 255 0 0 255 0 255 0 0 0 0 255 0 255 0 +0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 255 0 +0 0 0 255 0 255 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 255 0 255 0 0 0 255 0 255 +0 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 0 255 +0 255 0 0 255 0 0 0 0 255 0 0 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 255 +0 0 0 255 0 255 0 0 0 255 0 255 0 0 0 255 0 255 0 0 0 255 0 255 0 0 0 255 +0 255 0 0 0 255 0 255 0 0 0 255 255 0 0 0 255 0 255 0 0 0 0 0 255 0 0 0 +0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 0 255 0 255 +0 0 255 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 +255 0 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 +0 0 0 0 255 0 0 0 0 0 255 0 0 0 255 0 0 255 0 0 0 255 255 0 255 0 0 0 255 +255 0 255 0 0 0 255 255 0 255 0 0 0 255 255 0 0 0 255 0 0 0 255 0 0 0 0 +255 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 255 255 255 255 0 0 255 +255 255 255 0 0 255 255 255 255 0 0 255 255 255 255 0 0 255 255 255 255 +0 0 255 255 255 255 0 0 255 255 255 0 0 255 255 255 0 0 0 255 255 255 255 +0 0 255 255 255 255 0 0 0 255 255 255 255 0 0 0 255 255 255 255 0 0 0 255 +255 255 255 0 0 0 255 0 255 0 0 255 0 0 255 0 0 255 255 255 255 0 0 255 +0 0 0 0 255 0 0 255 255 255 255 0 0 0 255 255 255 255 0 0 0 255 255 255 +255 0 0 0 255 255 255 255 0 0 0 255 255 255 255 0 0 0 0 0 0 255 0 0 0 0 +0 255 255 255 255 0 0 0 0 255 255 255 0 255 0 0 255 255 255 0 255 0 0 255 +255 255 0 255 0 0 255 255 255 0 255 0 0 0 255 0 0 0 255 255 255 255 255 +0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 +0 255 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 255 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 +127 127 127 127 0 127 127 127 127 127 0 127 127 127 127 127 0 127 127 127 +127 127 0 127 127 127 127 127 0 127 127 127 127 127 0 127 127 127 127 127 +127 127 127 127 127 0 127 127 127 127 127 0 127 127 127 127 127 127 0 127 +127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 +0 127 127 0 127 0 127 127 0 127 127 0 127 127 127 127 127 127 0 127 127 +127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 +127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 +0 127 127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 +127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 +127 127 127 127 127 0 127 127 127 127 127 0 127 127 127 127 127 127 0 127 +127 127 127 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/res/FontNormalAA.pgm b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/res/FontNormalAA.pgm new file mode 100644 index 00000000..34cff308 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/res/FontNormalAA.pgm @@ -0,0 +1,1012 @@ +P2 +# Created by Paint Shop Pro +264 106 +255 +127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 +59 241 97 206 166 0 0 0 0 0 0 0 0 0 0 0 0 0 168 34 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 89 251 89 0 0 89 255 125 89 255 125 0 0 0 0 +7 199 34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 138 166 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 138 225 21 59 238 42 +206 125 0 0 0 0 7 199 34 89 166 0 0 0 0 168 34 0 0 0 175 255 255 166 0 +0 7 202 89 0 0 0 0 59 245 255 251 89 0 0 0 59 238 34 0 12 232 89 0 0 89 +247 34 0 59 245 206 199 124 255 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 7 202 89 0 12 235 255 247 34 0 0 0 0 12 232 89 0 0 12 235 +255 255 251 89 0 7 206 255 255 255 125 0 0 0 0 138 251 89 0 0 59 245 255 +255 255 251 89 0 0 89 255 255 166 0 89 255 255 255 255 255 201 0 0 59 245 +255 255 125 0 0 12 235 255 247 34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 89 255 255 255 247 34 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 127 0 0 0 0 0 138 225 21 59 238 34 175 125 0 0 0 0 59 192 0 172 +89 0 0 59 245 255 255 251 89 89 247 34 12 228 34 0 138 166 0 0 0 0 12 235 +125 0 175 225 21 0 0 59 238 34 0 138 201 0 0 0 0 175 166 0 0 0 89 255 201 +0 0 0 0 0 0 7 202 89 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 59 215 21 0 175 +166 0 138 201 0 0 7 206 255 251 89 0 0 59 192 0 0 138 247 34 59 192 0 0 +89 251 89 0 0 59 245 251 89 0 0 59 241 89 0 0 0 0 0 89 247 34 0 0 0 0 0 +0 0 7 206 166 0 7 206 125 0 89 247 34 7 206 166 0 138 225 21 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 12 232 89 0 0 0 0 0 0 0 0 0 0 0 175 166 0 0 0 0 0 +0 0 89 125 0 0 175 201 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 138 225 21 12 206 +21 175 125 0 0 89 255 255 255 255 255 255 166 59 241 89 168 34 138 125 +89 225 21 7 202 89 12 228 34 0 0 0 0 12 232 89 0 138 201 0 0 0 12 206 21 +7 202 89 0 0 0 0 59 215 21 59 245 206 199 124 255 125 0 0 0 0 7 202 89 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 138 166 0 12 232 89 0 59 238 34 0 0 +0 59 241 89 0 0 0 0 0 0 59 241 89 0 0 0 0 59 241 89 0 12 232 132 241 89 +0 0 59 241 89 0 0 0 0 7 206 125 0 0 0 0 0 0 0 0 89 247 34 0 12 232 89 0 +12 232 89 59 241 89 0 59 241 89 0 138 247 34 0 0 138 247 34 0 0 0 0 0 12 +235 247 34 0 0 0 0 0 0 0 0 0 0 0 0 0 138 255 166 0 0 0 0 0 0 0 0 0 138 +225 21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 138 225 21 0 0 0 0 0 0 0 0 0 172 +89 59 192 0 0 59 238 34 168 34 0 0 89 247 34 12 228 34 138 166 0 0 0 0 +0 0 138 251 159 247 34 0 0 0 0 0 0 59 238 34 0 0 0 0 7 202 89 0 0 7 199 +34 0 0 0 0 0 0 7 202 89 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 202 89 0 59 +241 89 0 59 241 89 0 0 0 59 241 89 0 0 0 0 0 0 89 247 34 0 0 0 0 138 201 +0 7 206 125 59 241 89 0 0 59 245 255 255 251 89 0 12 235 255 255 255 125 +0 0 0 0 7 206 166 0 0 0 175 251 89 138 201 0 59 241 89 0 12 235 125 0 138 +247 34 0 0 138 247 34 0 0 0 59 245 247 34 0 0 0 0 7 206 255 255 255 255 +255 255 125 0 0 0 0 138 255 201 0 0 0 0 0 0 89 251 89 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +127 0 0 0 0 0 138 201 0 0 0 0 0 0 0 0 0 12 206 21 138 125 0 0 7 206 255 +247 34 0 0 0 175 255 255 166 59 215 21 175 255 255 125 0 0 138 171 206 +166 0 175 201 0 0 0 0 89 201 0 0 0 0 0 0 175 125 0 0 0 0 0 0 0 0 12 235 +255 255 255 255 255 255 125 0 0 0 0 138 255 255 251 89 0 0 0 0 0 59 215 +21 0 59 241 89 0 59 241 89 0 0 0 59 241 89 0 0 0 0 0 12 235 166 0 0 0 138 +255 255 125 0 175 201 0 59 241 89 0 0 0 0 0 0 175 247 34 59 241 89 0 89 +247 34 0 0 0 89 247 34 0 0 0 89 255 255 255 125 0 12 235 166 0 59 245 125 +0 0 0 0 0 0 0 0 0 0 0 175 225 21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 89 251 89 0 0 7 206 225 21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 89 201 +0 0 0 0 0 0 0 12 235 255 255 255 255 255 225 21 0 0 0 175 255 251 89 0 +0 0 0 0 175 125 89 225 21 59 238 34 89 225 21 12 235 166 175 166 0 0 0 +0 89 201 0 0 0 0 0 0 175 125 0 0 0 0 0 0 0 0 0 0 0 7 202 89 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 138 166 0 0 59 241 89 0 59 241 89 0 0 0 59 241 89 +0 0 0 0 12 235 166 0 0 0 0 0 0 59 241 97 206 255 255 255 255 255 125 0 +0 0 0 0 59 241 89 59 238 34 0 12 235 125 0 0 12 235 125 0 0 0 12 232 89 +0 59 245 125 0 89 255 255 232 241 89 0 0 0 0 0 0 0 0 0 0 0 0 59 245 247 +34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 138 255 201 0 0 0 0 7 206 125 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 138 125 12 206 21 +0 0 0 0 0 168 34 175 166 0 0 0 0 59 215 21 138 201 0 12 228 34 138 225 +21 0 12 235 251 89 0 0 0 0 59 215 21 0 0 0 0 12 232 89 0 0 0 0 0 0 0 0 +0 0 0 7 202 89 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 202 89 0 0 12 232 89 0 +59 238 34 0 0 0 59 241 89 0 0 0 12 235 166 0 0 0 0 0 0 0 12 235 125 0 0 +0 59 241 89 0 0 0 0 0 0 59 241 89 12 232 89 0 12 232 89 0 0 138 225 21 +0 0 0 59 238 34 0 7 206 166 0 0 0 0 89 225 21 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 12 235 247 34 0 0 7 206 255 255 255 255 255 255 125 0 0 138 255 166 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 138 225 21 0 0 0 0 +0 0 0 0 172 89 89 166 0 0 0 89 166 0 168 42 206 125 0 0 0 7 202 89 0 89 +225 21 59 238 34 89 251 89 0 0 175 255 201 0 0 0 0 7 202 89 0 0 0 0 59 +215 21 0 0 0 0 0 0 0 0 0 0 0 7 202 89 0 0 0 0 138 247 34 0 0 0 0 0 7 206 +201 0 12 228 34 0 0 0 175 166 0 138 201 0 0 0 0 59 241 89 0 0 12 235 166 +0 0 0 0 89 166 0 0 89 251 89 0 0 0 59 241 89 0 0 59 192 0 0 175 225 21 +0 175 201 0 138 225 21 0 12 235 125 0 0 0 0 12 235 166 0 59 241 89 0 0 +0 7 206 166 0 0 138 247 34 0 0 59 245 125 0 0 0 0 0 0 0 12 232 89 0 0 0 +0 0 0 0 0 0 0 0 175 166 0 0 0 0 0 0 0 0 7 206 166 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +127 0 0 0 0 0 138 225 21 0 0 0 0 0 0 0 12 206 21 138 125 0 0 0 12 235 255 +255 255 166 0 0 0 0 138 201 0 0 0 175 255 255 125 0 0 138 255 255 255 125 +12 235 247 0 0 0 0 138 201 0 0 0 0 175 166 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 7 206 166 0 0 0 0 0 0 7 206 201 0 89 201 0 0 0 0 12 235 255 247 +34 0 0 7 206 255 255 255 225 21 89 255 255 255 255 255 166 59 245 255 255 +251 89 0 0 0 0 59 241 89 0 0 12 235 255 255 225 21 0 0 12 235 255 251 89 +0 0 175 225 21 0 0 0 0 0 59 245 255 255 125 0 0 89 255 255 166 0 0 0 138 +247 34 0 0 138 225 21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 7 206 166 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 168 34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 12 232 89 0 0 59 238 34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 59 241 89 0 0 0 0 0 0 0 0 0 0 175 125 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 206 125 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 168 34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 89 +255 125 89 255 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 89 201 0 0 0 0 +0 0 0 0 0 0 12 228 34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 228 34 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +127 127 127 127 0 127 127 0 127 127 127 127 127 0 127 127 127 127 127 127 +127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 127 127 127 +127 127 127 0 127 127 127 127 127 127 127 127 0 127 127 0 127 127 127 127 +0 127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 127 127 127 +127 127 0 127 127 127 0 127 127 127 127 0 127 127 127 0 127 127 127 127 +0 127 127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 +127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 +127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 127 +0 127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 0 +127 127 127 127 127 0 127 127 127 127 127 127 127 127 0 127 127 127 127 +127 127 127 127 127 0 127 127 127 127 127 127 127 127 0 127 127 127 127 +127 127 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 12 235 255 255 125 138 166 0 0 0 89 255 255 247 +34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 89 255 255 +255 255 166 0 0 0 0 0 12 235 225 21 0 0 59 245 255 255 255 251 89 0 0 0 +59 245 255 255 251 89 59 245 255 255 255 247 34 0 0 59 245 255 255 255 +255 127 81 245 255 255 255 255 127 0 0 59 245 255 255 255 166 0 59 241 +89 0 0 0 59 241 89 89 255 255 255 125 7 206 255 251 89 59 241 89 0 0 89 +255 166 59 241 89 0 0 0 0 59 245 225 21 0 0 7 206 251 89 59 245 247 34 +0 0 59 241 89 0 0 138 255 255 255 166 0 0 59 245 255 255 255 225 21 0 0 +0 138 255 255 255 166 0 0 59 245 255 255 255 251 89 0 0 0 59 245 255 255 +201 89 255 255 255 255 255 255 255 125 59 241 89 0 0 0 59 241 97 206 166 +0 0 0 0 175 201 175 201 0 0 7 206 201 0 0 0 175 171 206 225 21 0 0 59 245 +166 245 125 0 0 0 89 251 89 89 255 255 255 255 255 127 0 228 34 0 0 59 +215 21 0 0 0 0 12 228 34 0 0 0 59 245 201 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 127 0 0 175 225 21 0 0 0 175 225 21 0 0 0 89 232 241 89 0 0 59 +241 89 0 0 138 225 21 0 89 255 125 0 0 59 192 59 241 89 0 0 175 251 89 +0 59 241 89 0 0 0 0 59 241 89 0 0 0 0 0 89 255 125 0 0 7 199 34 59 241 +89 0 0 0 59 241 89 0 59 241 89 0 0 0 59 241 89 59 241 89 0 59 241 89 0 +59 241 89 0 0 0 0 59 245 255 125 0 0 89 255 251 89 59 245 255 201 0 0 59 +241 89 0 138 251 89 0 12 235 166 0 59 241 89 0 7 206 225 21 0 138 251 89 +0 12 235 166 0 59 241 89 0 0 138 247 34 0 12 235 125 0 7 176 21 0 0 59 +241 89 0 0 0 59 241 89 0 0 0 59 241 89 138 225 21 0 0 12 235 125 89 225 +21 0 59 245 247 34 0 12 232 89 12 235 166 0 7 206 166 0 89 247 34 0 7 206 +125 0 0 0 0 0 7 206 166 12 228 34 0 0 7 202 89 0 0 0 0 12 228 34 0 0 12 +235 133 206 166 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 138 201 0 138 +255 255 255 125 138 166 0 0 7 206 166 175 166 0 0 59 241 89 0 0 89 247 +34 7 206 166 0 0 0 0 0 59 241 89 0 0 0 175 225 21 59 241 89 0 0 0 0 59 +241 89 0 0 0 0 7 206 166 0 0 0 0 0 0 59 241 89 0 0 0 59 241 89 0 59 241 +89 0 0 0 59 241 89 59 241 89 59 241 89 0 0 59 241 89 0 0 0 0 59 241 159 +225 21 0 175 166 241 89 59 241 132 241 89 0 59 241 89 12 235 166 0 0 0 +89 247 34 59 241 89 0 0 89 247 34 12 235 166 0 0 0 89 247 34 59 241 89 +0 0 59 241 89 0 59 238 34 0 0 0 0 0 0 59 241 89 0 0 0 59 241 89 0 0 0 59 +241 89 59 241 89 0 0 89 225 21 59 241 89 0 89 206 202 89 0 59 238 34 0 +89 251 89 138 225 21 0 0 175 201 0 138 225 21 0 0 0 0 0 175 225 21 12 228 +34 0 0 0 138 166 0 0 0 0 12 228 34 0 7 206 166 0 12 235 125 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 127 7 202 89 89 225 21 7 206 125 12 206 21 0 59 238 +34 89 247 34 0 59 241 89 0 0 175 201 0 59 241 89 0 0 0 0 0 59 241 89 0 +0 0 59 241 89 59 241 89 0 0 0 0 59 241 89 0 0 0 0 59 241 89 0 0 0 0 0 0 +59 241 89 0 0 0 59 241 89 0 59 241 89 0 0 0 59 241 89 59 241 102 232 89 +0 0 0 59 241 89 0 0 0 0 59 241 102 232 89 59 215 81 241 89 59 241 89 138 +225 21 59 241 89 59 241 89 0 0 0 59 241 89 59 241 89 0 7 206 201 0 59 241 +89 0 0 0 59 241 89 59 241 89 0 0 175 201 0 0 12 235 166 0 0 0 0 0 0 59 +241 89 0 0 0 59 241 89 0 0 0 59 241 89 7 206 166 0 0 175 166 0 7 206 125 +0 175 125 175 166 0 138 201 0 0 0 175 255 251 89 0 0 0 59 245 166 241 89 +0 0 0 0 0 89 247 34 0 12 228 34 0 0 0 89 201 0 0 0 0 12 228 34 12 235 201 +0 0 0 59 245 166 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 59 215 21 175 125 +0 7 206 125 7 199 34 0 138 201 0 12 235 125 0 59 245 255 255 255 247 34 +0 59 241 89 0 0 0 0 0 59 241 89 0 0 0 59 241 89 59 245 255 255 255 255 +127 59 245 255 255 255 255 127 59 241 89 0 0 0 0 0 0 59 245 255 255 255 +255 255 251 89 0 59 241 89 0 0 0 59 241 89 59 245 255 247 34 0 0 0 59 241 +89 0 0 0 0 59 241 89 138 201 175 166 59 241 89 59 241 89 12 235 125 59 +241 89 59 241 89 0 0 0 12 235 125 59 245 255 255 255 201 0 0 59 241 89 +0 0 0 12 235 125 59 245 255 255 255 125 0 0 0 0 59 245 255 255 125 0 0 +0 59 241 89 0 0 0 59 241 89 0 0 0 59 241 89 0 138 225 21 59 241 89 0 0 +175 201 7 202 89 89 201 0 175 166 0 0 0 12 235 166 0 0 0 0 0 138 255 166 +0 0 0 0 0 59 245 125 0 0 12 228 34 0 0 0 12 228 34 0 0 0 12 228 34 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 59 215 21 175 125 0 7 +206 125 7 199 34 7 206 125 0 0 175 201 0 59 241 89 0 0 89 247 34 59 241 +89 0 0 0 0 0 59 241 89 0 0 0 59 241 89 59 241 89 0 0 0 0 59 241 89 0 0 +0 0 59 241 89 0 59 245 255 251 89 59 241 89 0 0 0 59 241 89 0 59 241 89 +0 0 0 59 241 89 59 241 89 175 225 21 0 0 59 241 89 0 0 0 0 59 241 89 12 +235 247 34 59 241 89 59 241 89 0 89 247 94 241 89 59 241 89 0 0 0 59 241 +89 59 241 89 0 0 0 0 0 59 241 89 0 0 0 59 241 89 59 241 89 12 235 166 0 +0 0 0 0 0 0 138 251 89 0 0 59 241 89 0 0 0 59 241 89 0 0 0 59 241 89 0 +12 232 89 138 225 21 0 0 89 225 81 215 21 12 228 47 232 89 0 0 0 175 255 +251 89 0 0 0 0 59 241 89 0 0 0 0 7 206 201 0 0 0 12 228 34 0 0 0 0 175 +125 0 0 0 12 228 34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 +12 228 34 89 201 0 7 206 125 59 215 21 59 245 255 255 255 255 247 34 59 +241 89 0 0 59 241 89 7 206 166 0 0 0 0 0 59 241 89 0 0 0 138 225 21 59 +241 89 0 0 0 0 59 241 89 0 0 0 0 7 206 166 0 0 0 59 241 89 59 241 89 0 +0 0 59 241 89 0 59 241 89 0 0 0 59 241 89 59 241 89 7 206 201 0 0 59 241 +89 0 0 0 0 59 241 89 0 175 166 0 59 241 89 59 241 89 0 7 206 200 241 89 +12 235 166 0 0 0 89 247 34 59 241 89 0 0 0 0 0 12 235 166 0 0 0 89 247 +34 59 241 89 0 59 245 125 0 0 0 0 0 0 12 232 89 0 0 59 241 89 0 0 0 12 +232 89 0 0 0 59 238 34 0 0 175 171 206 166 0 0 0 12 232 159 201 0 7 202 +132 215 21 0 0 89 247 34 175 225 21 0 0 0 59 241 89 0 0 0 0 138 225 21 +0 0 0 12 228 34 0 0 0 0 89 201 0 0 0 12 228 34 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 138 201 7 206 255 251 226 255 255 166 0 +138 201 0 0 0 12 235 125 59 241 89 0 0 138 247 34 0 89 255 125 0 0 59 192 +59 241 89 0 0 138 251 89 0 59 241 89 0 0 0 0 59 241 89 0 0 0 0 0 89 255 +125 0 0 59 241 89 59 241 89 0 0 0 59 241 89 0 59 241 89 0 0 0 89 247 34 +59 241 89 0 12 235 166 0 59 241 89 0 0 0 0 59 241 89 0 0 0 0 59 241 89 +59 241 89 0 0 59 245 251 89 0 138 251 89 0 59 245 166 0 59 241 89 0 0 0 +0 0 0 138 251 89 0 59 245 166 0 59 241 89 0 0 138 251 89 0 89 166 0 0 89 +247 34 0 0 59 241 89 0 0 0 0 138 225 21 0 7 206 166 0 0 0 89 255 251 89 +0 0 0 7 206 255 125 0 0 138 255 201 0 0 12 235 125 0 12 235 166 0 0 0 59 +241 89 0 0 0 89 251 89 0 0 0 0 12 228 34 0 0 0 0 12 228 34 0 0 12 228 34 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 7 206 225 21 0 +0 0 0 0 0 7 206 125 0 0 0 0 175 201 59 245 255 255 255 247 34 0 0 0 59 +245 255 255 251 89 59 245 255 255 255 225 21 0 0 59 245 255 255 255 255 +127 81 241 89 0 0 0 0 0 0 59 245 255 255 255 201 0 59 241 89 0 0 0 59 241 +89 89 255 255 255 138 235 255 255 125 0 59 241 89 0 0 89 255 201 59 245 +255 255 255 255 166 59 241 89 0 0 0 0 59 241 89 59 241 89 0 0 0 175 251 +89 0 0 138 255 255 255 166 0 0 59 241 89 0 0 0 0 0 0 0 138 255 255 255 +166 0 0 59 241 89 0 0 0 175 251 89 12 235 255 255 251 89 0 0 0 59 241 89 +0 0 0 0 0 59 245 255 251 89 0 0 0 0 12 235 201 0 0 0 0 0 138 251 89 0 0 +89 255 125 0 7 206 225 21 0 0 89 255 125 0 0 59 241 89 0 0 0 175 255 255 +255 255 255 127 0 228 34 0 0 0 0 0 175 125 0 0 12 228 34 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 89 255 255 255 255 125 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 59 241 89 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 +228 34 0 0 0 0 0 89 201 0 0 12 228 34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 138 255 255 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 235 255 255 125 0 0 0 12 228 +124 255 255 247 34 0 0 0 0 0 0 0 0 0 245 255 255 255 255 255 255 0 0 0 +0 0 0 0 0 0 0 127 127 127 127 127 127 127 127 127 127 127 0 127 127 127 +127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 127 127 127 +127 0 127 127 127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 +127 127 127 127 0 127 127 127 127 127 127 127 127 0 127 127 127 127 127 +127 127 127 0 127 127 127 127 0 127 127 127 127 0 127 127 127 127 127 127 +127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 127 127 127 0 127 +127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 127 0 127 127 +127 127 127 127 127 0 127 127 127 127 127 127 127 127 0 127 127 127 127 +127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 127 +0 127 127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 +127 127 127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 0 127 +127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 0 127 +127 127 127 0 127 127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 +127 127 127 127 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 127 0 89 255 125 0 0 0 0 0 0 0 0 0 0 59 241 89 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 59 241 89 0 0 0 0 0 0 0 0 89 255 255 166 0 0 0 0 0 +0 0 59 241 89 0 0 0 0 0 0 0 0 0 0 0 59 241 89 0 0 0 0 59 241 89 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 175 255 201 0 12 228 +34 0 0 89 255 247 34 0 0 0 0 0 0 0 0 0 0 0 0 0 89 255 255 255 255 255 255 +255 255 255 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 59 241 89 0 0 0 0 0 0 0 0 +0 59 241 89 0 0 0 0 0 0 0 0 0 0 0 0 0 0 59 241 89 0 0 0 0 0 0 0 12 235 +125 0 0 0 0 0 0 0 0 0 59 241 89 0 0 0 0 59 241 89 0 89 251 89 59 241 89 +0 0 0 0 59 241 89 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 59 241 89 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 89 225 21 0 0 12 228 34 0 0 0 0 138 201 0 0 0 0 0 0 0 0 0 0 0 0 +0 89 166 0 0 0 0 0 0 0 138 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 59 241 89 0 0 0 0 0 0 0 0 0 0 0 0 0 0 59 241 89 0 0 0 0 0 +0 0 59 241 89 0 0 0 0 0 0 0 0 0 59 241 89 0 0 0 0 0 0 0 0 0 0 0 59 241 +89 0 0 0 0 59 241 89 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 59 241 89 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 138 166 0 0 0 12 228 34 0 0 0 0 89 225 21 0 0 0 0 0 0 0 0 0 +0 0 0 89 166 0 0 0 0 0 0 0 138 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 +0 0 7 206 255 255 255 125 0 59 241 194 255 251 89 0 0 7 206 255 255 201 +0 12 235 255 255 251 89 0 12 235 255 251 89 7 206 255 255 247 34 0 12 235 +255 255 251 89 59 241 194 255 255 125 0 59 241 89 89 255 251 89 59 241 +89 0 138 251 89 59 241 89 59 241 159 255 255 125 89 255 255 166 0 59 241 +194 255 255 125 0 0 0 12 235 255 247 34 0 59 241 194 255 255 125 0 0 12 +235 255 255 251 89 59 241 159 255 201 0 138 255 255 247 34 206 255 255 +255 166 59 241 89 0 59 241 97 206 166 0 0 12 235 125 175 201 0 7 206 166 +0 7 206 133 206 225 21 0 89 255 255 166 0 0 12 235 125 138 255 255 255 +255 166 0 0 138 166 0 0 0 12 228 34 0 0 0 0 89 225 21 0 0 0 0 0 0 0 0 0 +0 0 0 89 166 0 0 0 0 0 0 0 138 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 +0 0 0 0 0 0 89 247 34 59 245 166 0 138 225 21 7 206 201 0 0 0 7 206 166 +0 59 241 89 7 206 125 0 89 225 21 59 241 89 0 0 7 206 166 0 59 241 89 59 +245 166 0 89 247 34 59 241 89 0 59 241 89 59 241 89 138 225 21 0 59 241 +89 59 245 201 0 89 255 201 0 89 247 34 59 245 166 0 89 247 34 0 7 206 166 +0 138 225 21 59 245 166 0 138 247 34 7 206 166 0 59 241 89 59 245 201 0 +0 59 238 34 0 130 34 59 241 89 0 0 59 241 89 0 59 241 89 89 247 34 0 89 +247 34 138 225 21 12 235 225 21 12 232 89 7 206 166 12 235 125 89 247 34 +0 89 247 34 0 0 0 89 247 34 0 0 138 166 0 0 0 12 228 34 0 0 0 0 89 225 +21 0 0 7 206 247 34 0 0 89 201 0 0 89 166 0 0 0 0 0 0 0 138 125 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 59 241 89 59 241 89 0 59 241 89 +59 241 89 0 0 0 59 241 89 0 59 241 89 59 238 34 0 59 238 34 59 241 89 0 +0 59 241 89 0 59 241 89 59 241 89 0 59 241 89 59 241 89 0 59 241 89 59 +241 159 201 0 0 0 59 241 89 59 241 89 0 59 241 89 0 59 241 89 59 241 89 +0 59 241 89 0 59 241 89 0 59 241 89 59 241 89 0 59 241 89 59 241 89 0 59 +241 89 59 241 89 0 0 59 241 89 0 0 0 59 241 89 0 0 59 241 89 0 59 241 89 +12 235 125 0 175 166 0 59 238 34 89 171 202 89 89 225 21 0 59 241 226 201 +0 12 235 125 0 175 166 0 0 0 12 235 125 0 0 59 238 34 0 0 0 12 228 34 0 +0 0 0 7 206 125 0 7 202 89 12 235 166 0 175 125 0 0 89 166 0 0 0 0 0 0 +0 138 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 89 255 255 255 251 +89 59 241 89 0 59 241 89 59 238 34 0 0 0 59 238 34 0 59 241 89 59 245 255 +255 255 251 0 59 241 89 0 0 59 238 34 0 59 241 89 59 241 89 0 59 241 89 +59 241 89 0 59 241 89 59 245 255 225 21 0 0 59 241 89 59 241 89 0 59 241 +89 0 59 241 89 59 241 89 0 59 241 89 0 59 238 34 0 12 232 89 59 241 89 +0 12 232 89 59 238 34 0 59 241 89 59 241 89 0 0 0 175 255 255 201 0 59 +241 89 0 0 59 241 89 0 59 241 89 0 175 201 12 232 89 0 7 206 125 172 89 +138 166 138 201 0 0 0 138 247 34 0 0 175 201 12 232 89 0 0 7 206 166 0 +0 175 225 21 0 0 0 0 12 228 34 0 0 0 0 0 0 175 225 34 206 21 0 0 175 255 +166 0 0 0 89 166 0 0 0 0 0 0 0 138 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 +0 0 0 0 59 241 89 0 59 241 89 59 241 89 0 59 238 34 59 241 89 0 0 0 59 +241 89 0 59 241 89 59 238 34 0 0 0 0 59 241 89 0 0 59 241 89 0 59 241 89 +59 241 89 0 59 241 89 59 241 89 0 59 241 89 59 241 97 206 201 0 0 59 241 +89 59 241 89 0 59 241 89 0 59 241 89 59 241 89 0 59 241 89 0 59 241 89 +0 59 241 89 59 241 89 0 59 241 89 59 241 89 0 59 241 89 59 241 89 0 0 0 +0 0 59 245 125 59 241 89 0 0 59 241 89 0 59 241 89 0 59 238 124 225 21 +0 0 175 176 206 21 59 215 187 125 0 0 59 245 255 201 0 0 89 247 124 225 +21 0 0 138 225 21 0 0 0 59 241 89 0 0 0 12 228 34 0 0 0 0 12 235 125 0 +0 0 0 0 0 0 0 0 0 0 0 89 166 0 0 0 0 0 0 0 138 125 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 127 0 0 0 0 0 0 0 89 247 34 0 89 251 89 59 241 89 0 175 201 0 7 206 201 +0 0 0 7 206 166 0 138 251 89 7 206 166 0 7 199 34 59 241 89 0 0 7 206 166 +0 138 251 89 59 241 89 0 59 241 89 59 241 89 0 59 241 89 59 241 89 12 235 +166 0 59 241 89 59 241 89 0 59 241 89 0 59 241 89 59 241 89 0 59 241 89 +0 7 206 166 0 138 225 21 59 241 89 0 138 225 21 7 206 166 0 89 251 89 59 +241 89 0 0 89 125 0 12 232 89 12 232 89 0 12 12 235 125 0 175 251 89 0 +7 206 255 125 0 0 0 89 255 201 0 7 206 247 34 0 7 206 166 59 245 125 0 +7 206 255 125 0 0 59 241 89 0 0 0 0 0 138 166 0 0 0 12 228 34 0 0 0 0 89 +225 21 0 0 0 0 0 0 0 0 0 0 0 0 89 166 0 0 0 0 0 0 0 138 125 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 127 0 0 0 0 0 0 0 0 175 255 255 232 241 89 59 245 255 255 247 +34 0 0 12 235 255 255 201 0 59 245 255 200 241 89 0 12 235 255 251 89 0 +59 241 89 0 0 0 12 235 255 200 241 89 59 241 89 0 59 241 89 59 241 89 0 +59 241 89 59 241 89 0 59 245 201 59 241 89 59 241 89 0 59 241 89 0 59 241 +89 59 241 89 0 59 241 89 0 0 12 235 255 247 34 0 59 245 166 255 247 34 +0 0 59 245 255 166 241 89 59 241 89 0 0 59 245 255 255 166 0 0 138 255 +255 125 0 89 255 255 166 241 89 0 0 138 247 34 0 0 0 59 245 125 0 0 138 +225 21 7 206 225 21 0 138 251 0 0 138 247 34 0 0 175 255 255 255 255 166 +0 0 138 166 0 0 0 12 228 34 0 0 0 0 89 225 21 0 0 0 0 0 0 0 0 0 0 0 0 89 +255 255 255 255 255 255 255 255 255 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 138 225 21 0 0 0 0 0 0 0 0 0 0 0 89 247 34 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 59 241 +89 0 0 0 0 0 0 0 0 59 241 89 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 232 89 0 0 0 0 0 +0 0 0 0 0 0 138 201 0 0 0 12 228 34 0 0 0 0 138 201 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 166 255 255 247 34 0 0 0 0 0 0 0 0 0 0 0 255 255 125 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 59 241 89 0 +0 0 0 0 0 0 0 59 241 89 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 138 225 21 0 0 0 0 0 0 0 +0 0 0 0 7 206 255 201 0 12 228 34 0 0 89 255 251 89 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 127 127 127 127 +127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 +127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 +0 127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 0 127 127 +127 0 127 127 127 127 127 127 0 127 127 0 127 127 127 127 127 127 127 127 +127 127 0 127 127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 +127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 0 127 127 127 +127 127 0 127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 +127 0 127 127 127 127 127 127 127 127 127 0 127 127 127 127 127 0 127 127 +127 127 127 127 0 127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 +127 0 127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 127 0 127 +127 127 127 127 127 127 127 127 127 127 127 127 127 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 89 247 34 138 201 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 235 125 59 238 34 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +89 255 225 21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 12 235 251 89 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 59 238 34 138 201 0 0 +0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 199 34 0 0 0 0 0 7 199 34 0 0 0 0 +138 255 201 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 251 89 0 0 138 255 251 97 206 201 +0 0 138 251 102 235 201 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 89 255 201 12 228 34 0 0 0 0 0 0 0 0 0 0 0 0 7 206 166 12 232 89 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 175 166 12 235 127 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 175 255 255 255 225 21 59 245 255 +255 255 255 255 125 0 0 0 0 0 0 0 7 206 255 247 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 7 199 34 0 0 0 0 0 7 199 34 0 0 0 138 225 21 175 166 0 0 175 +255 255 166 0 0 7 202 89 0 0 0 0 0 0 0 0 0 0 59 245 255 255 201 0 0 0 0 +0 0 0 0 59 245 255 255 255 255 255 255 255 255 125 0 59 245 255 255 255 +255 255 125 0 0 89 255 255 255 255 255 225 21 59 245 255 255 255 255 255 +125 0 0 0 59 245 255 255 255 255 255 125 7 206 166 0 0 175 171 206 166 +89 247 34 0 175 201 59 241 89 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 12 228 34 175 255 125 0 0 89 255 255 255 125 175 251 89 89 255 125 +0 7 206 255 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 59 245 255 255 +255 255 255 125 0 0 7 206 255 125 59 245 125 0 0 0 89 251 89 0 0 0 0 0 +0 0 127 7 206 225 21 0 0 0 0 59 115 0 0 0 0 59 115 0 0 0 0 0 0 0 175 201 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 59 245 255 255 255 255 125 0 59 245 +255 255 255 255 125 0 0 0 0 0 0 0 89 247 34 12 228 34 0 138 166 0 0 0 0 +0 0 0 0 0 0 12 235 125 0 7 176 21 0 0 0 0 0 0 138 251 89 0 0 138 201 0 +0 0 0 0 0 59 115 0 0 0 0 59 115 0 0 0 0 0 0 7 206 166 0 59 115 0 0 0 0 +59 115 0 0 0 59 115 0 0 0 0 59 115 0 89 201 0 12 232 89 89 201 7 202 89 +12 232 89 138 201 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 7 199 34 0 172 132 196 199 163 125 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 59 115 0 0 0 0 59 115 0 0 0 0 0 0 0 89 247 +34 0 7 206 125 0 0 0 0 0 0 0 0 127 89 247 34 0 0 0 0 0 59 115 0 0 0 0 59 +115 0 0 0 0 0 0 7 206 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 199 +34 0 0 0 0 0 7 199 34 0 0 0 0 0 0 0 0 0 89 225 21 7 202 89 12 228 34 0 +0 0 0 0 0 0 0 0 0 59 238 34 0 0 0 0 0 0 0 130 34 59 241 89 0 0 0 138 201 +0 0 0 0 0 0 59 115 0 0 0 0 59 115 0 0 0 0 0 0 175 225 21 0 59 115 0 0 0 +0 59 115 0 0 0 59 115 0 0 0 0 59 115 0 12 228 34 59 192 0 12 228 34 138 +166 59 215 21 175 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 7 199 34 0 172 89 175 166 138 125 0 138 255 255 247 34 +12 146 0 0 0 0 89 255 255 255 125 12 235 255 255 125 0 0 0 59 115 0 0 0 +0 59 115 0 138 255 255 255 255 127 0 175 201 0 138 225 21 0 0 0 0 0 0 0 +0 127 245 255 255 255 255 255 125 0 59 115 0 0 0 0 59 115 0 0 0 0 0 0 12 +232 89 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 199 34 0 0 0 0 0 7 199 +34 0 0 0 0 0 0 0 0 0 89 247 34 12 228 34 138 166 0 0 0 0 0 0 0 0 0 0 0 +12 235 166 0 0 0 0 0 0 175 225 21 138 225 21 0 0 0 138 201 0 0 0 0 0 0 +59 115 0 0 0 0 59 115 0 0 0 0 0 89 247 34 0 0 59 115 0 0 0 0 59 115 0 0 +0 59 115 0 0 0 0 59 115 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 138 255 166 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 199 34 0 172 +89 0 0 138 125 59 238 34 0 130 34 7 206 201 0 0 59 241 89 0 12 235 255 +125 0 59 241 89 0 0 59 115 0 0 0 0 59 115 0 0 0 0 89 247 34 0 59 245 166 +241 89 0 0 0 0 0 0 0 0 0 127 138 225 21 0 0 0 0 0 59 115 0 0 0 0 59 115 +0 0 0 0 0 89 255 255 255 247 34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 199 +34 0 0 0 0 0 7 199 34 0 0 0 0 0 0 0 0 0 0 175 255 255 166 59 215 21 175 +255 255 125 0 89 255 255 201 0 0 0 59 245 255 255 125 0 12 235 166 0 0 +138 225 21 0 0 0 138 255 255 255 255 247 34 0 59 115 0 0 0 0 59 115 0 0 +0 0 59 245 125 0 0 0 59 115 0 0 0 0 59 115 0 0 0 59 115 0 0 0 0 59 115 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 59 245 255 251 102 0 255 255 255 255 +255 0 245 255 255 255 255 255 255 255 255 255 255 127 21 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 59 241 89 0 0 0 0 0 138 247 34 138 201 0 0 0 175 +201 0 0 0 175 166 0 0 59 115 0 0 0 0 59 115 0 0 0 12 235 125 0 0 0 138 +255 166 0 0 0 0 0 0 0 0 0 0 127 245 255 255 255 255 225 21 0 59 115 0 0 +0 0 59 115 0 0 0 0 0 0 89 225 21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 7 199 34 0 0 0 59 245 255 255 255 255 125 0 0 0 0 0 0 0 0 0 0 0 0 175 +125 89 225 21 59 238 47 232 89 7 206 125 0 0 0 0 0 138 251 89 12 235 166 +0 0 138 225 21 0 0 0 138 201 0 0 0 0 0 0 59 115 0 0 0 0 59 115 0 0 0 7 +206 201 0 0 0 0 59 115 0 0 0 0 59 115 0 0 0 59 115 0 0 0 0 59 115 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 59 245 255 251 89 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 175 255 255 201 0 +0 0 138 247 34 175 201 0 0 0 138 255 255 255 255 255 166 0 0 59 115 0 0 +0 0 59 115 0 0 7 206 166 0 0 0 0 59 241 89 0 0 0 0 0 0 0 0 0 0 127 89 251 +89 0 0 0 0 0 59 115 0 0 0 0 59 115 0 0 0 0 0 0 138 201 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 7 199 34 0 0 0 0 0 7 199 34 0 0 0 0 0 0 0 0 0 +0 0 0 0 59 215 21 138 201 0 12 228 47 228 34 0 175 166 0 0 0 0 0 12 232 +89 0 0 175 225 21 59 241 89 0 0 0 138 201 0 0 0 0 0 0 59 115 0 0 0 0 59 +115 0 0 0 138 225 21 0 0 0 0 59 115 0 0 0 0 59 115 0 0 0 59 115 0 0 0 0 +59 115 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 138 255 166 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 59 +245 125 7 206 201 0 0 138 201 0 0 0 175 201 0 0 0 0 0 0 0 59 115 0 0 0 +0 59 115 0 0 138 225 21 0 0 0 0 59 241 89 0 0 0 0 0 0 0 0 0 0 127 7 206 +247 34 0 0 0 0 59 115 0 0 0 0 59 115 0 59 245 125 0 0 175 166 0 0 0 59 +245 125 175 225 29 206 166 0 89 247 34 7 206 166 0 0 0 7 199 34 0 0 0 0 +0 7 199 34 0 0 0 0 0 0 0 0 0 0 0 0 7 202 89 0 89 225 21 59 238 47 232 89 +7 206 125 0 89 166 0 0 89 247 34 0 0 0 130 34 0 138 255 125 0 0 138 201 +0 0 0 0 0 0 59 115 0 0 0 0 59 115 0 0 89 251 89 0 0 0 0 0 59 115 0 0 0 +0 59 115 0 0 0 59 115 0 0 0 0 59 115 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 89 125 0 12 232 89 12 146 0 0 0 59 241 89 0 12 235 247 +34 0 0 89 125 0 0 59 115 0 0 0 0 59 115 0 59 241 89 0 0 0 0 0 59 241 89 +0 0 0 0 0 0 0 0 0 0 127 0 0 175 255 255 255 225 21 59 245 255 255 255 255 +255 125 0 138 225 21 0 12 235 125 0 0 0 138 225 34 235 125 7 206 166 0 +89 247 34 7 206 166 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +138 201 0 0 0 175 255 255 125 0 89 255 255 201 0 0 12 235 255 255 251 89 +0 0 0 0 0 0 0 0 89 255 255 255 255 255 255 255 255 255 125 0 59 245 255 +255 255 255 255 125 0 0 175 255 255 255 255 255 247 34 59 245 255 255 255 +255 255 125 0 0 0 59 245 255 255 255 255 255 125 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 59 245 255 255 166 0 0 0 0 0 0 0 89 255 255 +255 125 59 245 255 255 201 0 0 0 59 245 255 255 255 255 255 125 0 175 255 +255 255 255 127 0 0 59 241 89 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 175 166 0 255 255 201 0 0 0 0 175 166 59 238 34 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 228 34 0 0 +0 0 0 0 0 12 228 34 138 166 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 127 127 +127 127 127 127 0 127 127 127 127 127 127 127 127 0 127 127 0 127 127 127 +127 127 127 0 127 127 127 127 127 0 127 127 127 127 127 127 127 127 127 +0 127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 +127 127 0 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 127 +127 127 0 127 127 127 127 127 127 127 0 127 127 127 0 127 127 127 127 127 +127 127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 127 127 0 +127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 127 127 0 127 +127 127 127 127 127 127 127 127 0 127 127 0 127 127 0 127 127 127 127 0 +127 127 127 127 127 0 127 127 127 127 127 0 127 127 127 127 127 0 127 127 +127 127 127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 0 127 +127 127 127 127 127 127 127 127 127 0 127 127 127 127 127 0 127 127 127 +127 0 127 127 127 127 127 127 127 127 127 127 127 127 0 127 127 127 127 +127 127 127 127 127 0 127 127 127 127 127 0 127 127 127 127 127 127 127 +0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 245 255 255 255 255 255 +251 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 12 228 34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 89 255 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 138 225 21 +0 0 0 138 125 0 0 0 0 59 245 255 255 125 0 0 0 0 0 0 0 0 138 225 21 0 0 +175 166 0 12 228 34 0 0 59 245 255 255 247 34 0 89 225 29 206 166 0 0 0 +0 0 89 255 255 255 255 125 0 0 0 7 206 255 255 247 34 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 89 255 255 255 255 125 0 0 0 0 0 0 0 +0 0 0 0 0 138 255 255 166 0 0 0 0 7 202 89 0 0 0 0 0 12 235 255 125 0 0 +175 255 255 225 21 0 0 0 12 235 125 0 0 0 0 0 0 0 0 0 0 0 138 255 255 255 +255 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 228 34 0 0 89 255 255 225 21 0 0 +0 0 0 0 0 0 0 0 0 138 166 0 0 0 89 225 21 0 0 0 0 0 138 166 0 0 0 89 225 +21 0 0 0 12 235 255 255 166 0 0 7 206 125 0 0 0 0 0 0 89 247 34 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 138 225 21 0 0 0 138 125 0 0 0 12 +235 125 0 59 115 0 0 0 0 0 0 0 0 7 206 125 0 59 215 21 0 12 228 34 0 12 +235 125 0 0 168 34 0 0 0 0 0 0 0 0 0 0 175 225 21 0 0 0 175 225 21 0 0 +0 0 0 138 166 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 175 225 +21 0 0 0 175 225 21 0 0 0 0 0 0 0 0 0 59 238 34 7 206 125 0 0 0 7 202 89 +0 0 0 0 7 199 34 59 238 34 0 0 0 7 202 89 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 89 255 255 255 125 175 125 0 0 0 0 0 0 0 0 0 0 0 0 0 138 255 247 34 0 +59 241 89 0 175 201 0 0 0 0 0 0 0 0 0 7 206 255 166 0 0 12 232 89 0 0 0 +0 7 206 255 166 0 0 12 232 89 0 0 0 0 0 0 0 59 215 21 0 89 201 0 0 0 0 +0 0 0 89 247 34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 7 +206 255 255 251 89 0 59 241 89 0 0 0 138 201 0 0 0 138 201 0 0 89 225 21 +175 125 0 0 12 228 34 0 12 235 125 0 0 0 0 0 0 0 0 0 0 0 0 0 138 166 0 +89 255 255 247 34 89 201 0 0 89 255 255 255 166 0 0 0 0 168 34 7 151 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 138 166 7 206 255 255 225 21 89 201 0 0 0 +0 0 0 0 0 0 89 166 0 0 138 166 0 0 0 7 202 89 0 0 0 0 0 0 0 59 238 34 0 +7 206 255 125 0 0 0 0 0 0 0 0 0 59 238 34 0 0 175 166 0 175 255 255 255 +125 175 125 0 138 247 34 0 0 0 0 0 0 0 0 0 0 12 228 34 0 89 201 0 0 89 +225 0 81 115 0 134 89 0 0 0 0 0 138 166 0 0 138 166 0 0 0 0 0 0 0 138 166 +0 0 138 166 0 0 0 0 0 0 59 245 247 34 0 12 232 89 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 89 201 0 7 206 201 138 125 +138 125 0 59 241 89 0 0 0 0 175 255 255 255 225 21 0 0 7 206 166 215 21 +0 0 12 228 34 0 0 138 255 255 251 89 0 0 0 0 0 0 0 0 0 12 206 21 59 241 +89 0 134 89 0 172 89 59 238 34 0 138 166 0 0 7 206 201 12 235 125 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 12 206 21 7 202 89 12 235 125 0 172 89 0 0 0 0 +0 0 0 0 59 238 34 7 206 125 12 235 255 255 255 255 255 255 125 0 0 0 12 +235 125 0 0 0 0 7 206 125 0 0 0 0 0 0 0 0 59 238 34 0 0 175 166 0 175 255 +255 255 125 175 125 0 138 247 34 0 0 0 0 0 0 0 0 0 0 12 228 34 0 89 201 +0 0 89 225 0 29 206 166 59 245 125 0 0 0 0 138 166 0 12 228 34 0 175 225 +21 0 0 0 138 166 0 12 228 42 206 255 255 166 0 0 0 0 12 228 34 138 166 +0 89 247 34 0 0 0 0 59 238 34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 +0 0 138 201 0 59 241 89 138 125 0 0 59 245 255 255 255 125 0 0 138 166 +0 89 201 0 0 0 0 89 255 125 0 0 0 0 0 0 0 7 206 125 0 138 251 89 0 0 0 +0 0 0 0 0 89 166 0 138 201 0 0 0 0 0 89 166 59 215 21 0 175 166 0 59 245 +125 89 251 89 0 0 12 235 255 255 255 255 255 255 125 138 255 255 251 89 +127 166 0 7 202 89 12 232 89 0 89 166 0 0 0 0 0 0 0 0 0 138 255 255 166 +0 0 0 0 7 202 89 0 0 0 0 0 59 241 89 0 0 0 0 0 7 206 125 0 0 0 0 0 0 0 +0 59 238 34 0 0 175 166 0 89 255 255 255 125 175 125 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 12 228 34 0 59 241 89 0 175 201 0 0 0 175 201 7 206 201 0 0 0 +138 166 0 175 166 0 138 200 215 21 0 0 0 138 166 0 175 166 7 151 0 89 247 +34 0 0 0 59 238 47 228 34 59 219 209 34 0 0 0 89 255 125 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 138 225 21 59 238 34 138 125 0 0 0 59 +241 89 0 0 0 0 138 166 0 89 201 0 0 59 245 255 255 255 255 125 0 0 0 0 +0 59 238 34 0 7 206 125 0 0 0 0 0 0 0 0 89 166 0 138 201 0 0 0 0 0 89 166 +0 175 255 255 223 166 0 12 235 125 59 241 89 0 0 0 0 0 0 0 0 0 175 125 +0 0 0 0 0 138 125 0 7 206 255 255 125 0 0 59 157 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 7 202 89 0 0 0 0 7 206 255 255 255 166 7 206 255 255 201 0 +0 0 0 0 0 0 0 0 59 238 34 0 0 175 166 0 0 89 255 255 125 175 125 0 0 0 +0 0 0 0 0 0 0 0 0 0 89 255 255 251 89 0 89 255 255 225 21 0 0 0 175 225 +29 206 166 0 0 0 138 166 59 215 21 59 215 81 215 21 0 0 0 138 166 59 215 +21 0 0 0 89 225 21 59 245 255 255 125 138 166 7 202 97 199 34 0 0 89 251 +89 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 138 225 21 59 241 +89 138 125 0 0 0 89 247 34 0 0 0 0 175 255 255 255 225 21 0 0 0 12 232 +89 0 0 0 12 228 34 0 12 235 225 21 59 215 21 0 0 0 0 0 0 0 0 12 206 21 +59 241 89 0 134 89 0 172 89 0 0 0 0 0 0 0 0 7 206 201 12 235 125 0 0 0 +0 0 0 0 0 175 125 0 0 0 0 0 12 206 21 7 202 89 7 206 125 0 172 89 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 202 89 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 59 238 34 0 0 175 166 0 0 0 0 175 125 175 125 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 206 166 59 245 125 0 0 0 0 0 0 +175 125 12 228 34 59 215 21 0 0 0 0 0 175 125 0 0 0 12 232 89 0 0 0 0 0 +59 238 34 175 125 7 199 34 0 0 175 201 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 127 0 0 0 0 0 138 225 21 7 206 201 138 125 138 125 7 202 89 0 0 0 +0 138 201 0 0 0 138 166 0 0 0 12 232 89 0 0 0 12 228 34 0 0 0 175 255 255 +166 0 0 0 0 0 0 0 0 0 0 138 166 0 89 255 255 247 34 89 201 0 0 0 0 0 0 +0 0 0 0 0 168 34 7 151 0 0 0 0 0 0 0 0 175 125 0 0 0 0 0 0 138 166 7 202 +89 0 89 247 124 201 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 235 255 255 255 255 +255 255 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 59 245 125 0 7 206 +166 0 0 0 0 175 125 175 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 59 115 0 134 89 0 0 0 0 0 0 59 215 21 59 245 255 255 255 225 21 0 +0 0 59 215 21 0 0 59 238 34 0 0 0 0 0 0 175 125 7 206 255 255 255 251 89 +0 138 247 34 0 59 157 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 138 225 +21 0 7 206 255 255 251 89 138 255 255 255 255 255 166 0 0 0 0 0 0 0 0 0 +0 12 232 89 0 0 0 12 228 34 0 0 0 0 0 59 241 89 0 0 0 0 0 0 0 0 0 0 175 +225 21 0 0 0 175 225 21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 175 225 21 0 0 0 175 225 21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 59 238 198 +255 251 194 166 0 0 0 0 175 125 175 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 206 125 0 0 0 0 89 225 21 0 0 0 +7 206 125 0 0 12 235 255 255 255 166 0 0 0 89 225 21 0 0 0 12 228 34 0 +0 0 175 255 255 255 166 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 +0 0 0 0 138 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 228 +34 0 7 176 21 0 89 247 34 0 0 0 0 0 0 0 0 0 0 0 89 255 255 255 255 125 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 89 +255 255 255 255 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 59 238 34 0 0 0 0 0 0 0 0 175 +125 175 125 0 0 0 0 0 0 0 0 59 215 21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 +0 0 0 0 0 0 0 138 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +12 228 34 0 7 206 255 255 251 89 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 59 238 34 0 0 0 0 0 0 0 0 175 125 175 125 +0 0 0 0 0 0 59 245 251 89 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 127 127 0 127 127 +127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 +127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 0 127 127 127 127 +127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 127 127 +127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 127 0 127 +127 127 127 127 127 127 127 0 127 127 127 127 0 127 127 127 127 127 127 +127 127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 127 127 +0 127 127 127 127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 +127 127 127 127 0 127 127 127 127 127 0 127 127 127 127 127 127 127 0 127 +127 127 127 127 127 127 0 127 127 127 127 0 127 127 127 127 127 127 0 127 +127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 127 0 127 +127 127 127 127 127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 +127 127 127 127 127 0 127 127 127 127 127 127 127 127 127 127 127 127 0 +127 127 127 127 127 127 127 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 89 +255 125 0 0 0 0 0 0 12 235 201 0 0 0 0 12 235 251 89 0 0 0 0 175 255 125 +89 201 0 0 0 0 0 0 0 0 0 0 0 59 245 247 34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 89 255 125 0 0 0 0 0 0 138 251 89 0 0 0 12 235 251 +89 0 0 0 0 0 0 0 0 7 206 225 21 0 0 0 89 255 125 0 89 255 225 21 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 12 235 247 34 172 89 0 0 0 0 7 206 225 21 0 0 +0 0 0 0 0 89 255 125 0 0 0 0 0 0 89 255 225 21 0 0 0 0 12 235 247 34 172 +89 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 89 +255 125 0 0 0 0 0 0 0 7 206 225 21 0 0 0 0 89 255 225 21 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 89 255 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 +0 89 247 34 0 0 0 0 0 175 166 0 0 0 0 7 206 125 59 241 89 0 0 89 201 12 +235 247 34 0 0 7 206 166 59 241 89 0 0 12 228 34 59 215 21 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 59 238 34 0 0 0 0 89 247 34 0 0 0 7 +206 125 59 241 89 0 7 206 166 59 238 34 0 0 175 166 0 0 59 241 89 0 89 +247 34 138 201 59 238 34 138 201 0 0 0 0 0 0 0 0 0 0 0 175 125 89 255 201 +0 0 0 0 0 0 0 175 201 0 0 0 0 0 0 12 232 89 0 0 0 0 0 0 59 238 34 138 225 +21 0 0 0 175 125 89 255 201 0 0 0 0 59 238 34 138 201 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 89 247 34 0 0 0 0 0 0 138 201 0 0 0 0 +0 59 238 34 138 225 21 0 0 0 59 238 34 138 201 0 0 0 0 12 232 89 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 228 34 59 215 21 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 235 255 255 125 0 +0 0 0 127 0 0 12 235 225 21 0 0 0 0 12 235 225 21 0 0 0 0 12 235 225 21 +0 0 0 0 12 235 225 21 0 0 0 0 12 235 225 21 0 0 0 0 12 235 225 21 0 0 0 +0 0 175 255 255 255 255 255 255 255 166 0 0 138 255 255 255 251 89 59 245 +255 255 255 255 127 81 245 255 255 255 255 225 21 59 245 255 255 255 255 +127 81 245 255 255 255 255 127 111 255 255 255 125 89 255 255 255 125 89 +255 255 255 125 89 255 255 255 125 7 206 255 255 255 255 125 0 0 59 245 +247 34 0 0 59 241 89 0 0 0 138 255 255 255 166 0 0 0 0 138 255 255 255 +166 0 0 0 0 0 138 255 255 255 166 0 0 0 0 138 255 255 255 166 0 0 0 0 138 +255 255 255 166 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 138 255 255 255 210 235 166 +59 241 89 0 0 0 59 241 89 59 241 89 0 0 0 59 241 89 59 241 89 0 0 0 59 +241 89 59 241 89 0 0 0 59 241 132 245 125 0 0 0 89 251 89 12 232 89 0 0 +0 0 7 206 166 0 89 251 89 0 0 0 127 0 0 89 232 241 89 0 0 0 0 89 232 241 +89 0 0 0 0 89 232 241 89 0 0 0 0 89 232 241 89 0 0 0 0 89 232 241 89 0 +0 0 0 89 232 241 89 0 0 0 0 12 232 89 89 225 21 0 0 0 0 0 175 247 34 0 +0 59 192 59 241 89 0 0 0 0 59 241 89 0 0 0 0 0 59 241 89 0 0 0 0 59 241 +89 0 0 0 0 0 59 241 89 0 0 59 241 89 0 0 59 241 89 0 0 59 241 89 0 7 206 +166 0 0 59 245 201 0 59 245 255 201 0 0 59 241 89 0 0 138 251 89 0 12 235 +166 0 0 138 251 89 0 12 235 166 0 0 0 138 251 89 0 12 235 166 0 0 138 251 +89 0 12 235 166 0 0 138 251 89 0 12 235 166 0 0 0 138 166 0 0 0 12 228 +34 0 0 175 247 34 0 0 175 225 21 59 241 89 0 0 0 59 241 89 59 241 89 0 +0 0 59 241 89 59 241 89 0 0 0 59 241 89 59 241 89 0 0 0 59 241 89 89 247 +34 0 7 206 125 0 12 232 89 0 0 0 0 59 241 89 0 12 232 89 0 0 0 127 0 7 +206 166 175 166 0 0 0 7 206 166 175 166 0 0 0 7 206 166 175 166 0 0 0 7 +206 166 175 166 0 0 0 7 206 166 175 166 0 0 0 0 175 166 175 166 0 0 0 0 +138 225 21 89 225 21 0 0 0 0 59 241 89 0 0 0 0 0 59 241 89 0 0 0 0 59 241 +89 0 0 0 0 0 59 241 89 0 0 0 0 59 241 89 0 0 0 0 0 59 241 89 0 0 59 241 +89 0 0 59 241 89 0 0 59 241 89 0 7 206 166 0 0 0 59 245 125 59 241 132 +241 89 0 59 241 89 0 12 235 166 0 0 0 89 247 34 12 235 166 0 0 0 89 247 +34 0 12 235 166 0 0 0 89 247 34 12 235 166 0 0 0 89 247 34 12 235 166 0 +0 0 89 247 34 0 0 12 235 125 0 12 235 125 0 0 59 241 89 0 0 138 176 235 +166 59 241 89 0 0 0 59 241 89 59 241 89 0 0 0 59 241 89 59 241 89 0 0 0 +59 241 89 59 241 89 0 0 0 59 241 89 0 175 201 0 138 225 21 0 12 235 255 +255 255 225 21 59 238 34 0 138 225 21 0 0 0 127 0 59 238 34 89 247 34 0 +0 59 238 34 89 247 34 0 0 59 238 34 89 247 34 0 0 59 238 34 89 247 34 0 +0 59 238 34 89 247 34 0 0 59 241 89 89 225 21 0 0 7 206 125 0 89 225 21 +0 0 0 0 138 225 21 0 0 0 0 0 59 241 89 0 0 0 0 59 241 89 0 0 0 0 0 59 241 +89 0 0 0 0 59 241 89 0 0 0 0 0 59 241 89 0 0 59 241 89 0 0 59 241 89 0 +0 59 241 89 0 7 206 166 0 0 0 7 206 166 59 241 89 138 225 21 59 241 89 +0 59 241 89 0 0 0 59 241 89 59 241 89 0 0 0 59 241 89 0 59 241 89 0 0 0 +59 241 89 59 241 89 0 0 0 59 241 89 59 241 89 0 0 0 59 241 89 0 0 0 12 +235 138 235 125 0 0 0 138 225 21 0 59 215 21 175 201 59 241 89 0 0 0 59 +241 89 59 241 89 0 0 0 59 241 89 59 241 89 0 0 0 59 241 89 59 241 89 0 +0 0 59 241 89 0 59 245 166 241 89 0 0 12 232 89 0 0 175 225 59 238 47 235 +225 21 0 0 0 0 127 0 138 201 0 12 235 125 0 0 138 201 0 12 235 125 0 0 +138 201 0 12 235 125 0 0 138 201 0 12 235 125 0 0 138 201 0 12 235 125 +0 0 138 225 21 12 235 125 0 0 89 247 34 0 89 255 255 255 255 251 89 138 +225 21 0 0 0 0 0 59 245 255 255 255 255 127 59 245 255 255 255 255 166 +0 59 245 255 255 255 255 127 59 245 255 255 255 255 127 0 59 241 89 0 0 +59 241 89 0 0 59 241 89 0 0 59 241 89 7 206 255 255 255 166 0 0 175 201 +59 241 89 12 235 125 59 241 89 0 59 241 89 0 0 0 12 235 125 59 241 89 0 +0 0 12 235 125 0 59 241 89 0 0 0 12 235 125 59 241 89 0 0 0 12 235 125 +59 241 89 0 0 0 12 235 125 0 0 0 0 12 235 125 0 0 0 0 138 225 21 7 199 +34 0 138 225 81 241 89 0 0 0 59 241 89 59 241 89 0 0 0 59 241 89 59 241 +89 0 0 0 59 241 89 59 241 89 0 0 0 59 241 89 0 0 138 255 166 0 0 0 12 232 +89 0 0 89 247 59 238 34 0 59 245 125 0 0 0 127 7 206 125 0 0 175 201 0 +7 206 125 0 0 175 201 0 7 206 125 0 0 175 201 0 7 206 125 0 0 175 201 0 +7 206 125 0 0 175 201 0 7 206 125 0 0 175 201 0 7 206 255 255 255 255 225 +21 0 0 0 0 138 225 21 0 0 0 0 0 59 241 89 0 0 0 0 59 241 89 0 0 0 0 0 59 +241 89 0 0 0 0 59 241 89 0 0 0 0 0 59 241 89 0 0 59 241 89 0 0 59 241 89 +0 0 59 241 89 0 7 206 166 0 0 0 7 206 166 59 241 89 0 89 247 94 241 89 +0 59 241 89 0 0 0 59 241 89 59 241 89 0 0 0 59 241 89 0 59 241 89 0 0 0 +59 241 89 59 241 89 0 0 0 59 241 89 59 241 89 0 0 0 59 241 89 0 0 0 12 +235 138 235 125 0 0 0 138 225 21 175 125 0 0 175 201 59 241 89 0 0 0 59 +241 89 59 241 89 0 0 0 59 241 89 59 241 89 0 0 0 59 241 89 59 241 89 0 +0 0 59 241 89 0 0 59 241 89 0 0 0 12 232 89 0 7 206 201 59 238 34 0 0 138 +201 0 0 0 127 59 245 255 255 255 255 247 34 59 245 255 255 255 255 247 +34 59 245 255 255 255 255 247 34 59 245 255 255 255 255 247 34 59 245 255 +255 255 255 247 34 59 245 255 255 255 255 247 34 59 241 89 0 0 89 225 21 +0 0 0 0 59 241 89 0 0 0 0 0 59 241 89 0 0 0 0 59 241 89 0 0 0 0 0 59 241 +89 0 0 0 0 59 241 89 0 0 0 0 0 59 241 89 0 0 59 241 89 0 0 59 241 89 0 +0 59 241 89 0 7 206 166 0 0 0 59 241 89 59 241 89 0 7 206 200 241 89 0 +12 235 166 0 0 0 89 247 34 12 235 166 0 0 0 89 247 34 0 12 235 166 0 0 +0 89 247 34 12 235 166 0 0 0 89 247 34 12 235 166 0 0 0 89 247 34 0 0 12 +235 125 0 12 235 125 0 0 59 241 159 166 0 0 12 235 166 12 232 89 0 0 0 +59 238 34 12 232 89 0 0 0 59 238 34 12 232 89 0 0 0 59 238 34 12 232 89 +0 0 0 59 238 34 0 0 59 241 89 0 0 0 12 235 255 255 255 201 0 59 238 34 +0 0 138 201 0 0 0 127 138 201 0 0 0 12 235 125 138 201 0 0 0 12 235 125 +138 201 0 0 0 12 235 125 138 201 0 0 0 12 235 125 138 201 0 0 0 12 235 +125 138 201 0 0 0 12 235 125 175 201 0 0 0 89 225 21 0 0 0 0 0 175 247 +34 0 0 59 192 59 241 89 0 0 0 0 59 241 89 0 0 0 0 0 59 241 89 0 0 0 0 59 +241 89 0 0 0 0 0 59 241 89 0 0 59 241 89 0 0 59 241 89 0 0 59 241 89 0 +7 206 166 0 0 59 245 201 0 59 241 89 0 0 59 245 251 89 0 0 138 251 89 0 +59 245 166 0 0 138 251 89 0 59 245 166 0 0 0 138 251 89 0 59 245 166 0 +0 138 251 89 0 59 245 166 0 0 138 251 89 0 59 245 166 0 0 0 138 166 0 0 +0 12 228 34 0 0 175 247 34 0 7 206 225 21 0 138 225 21 0 7 206 166 0 0 +138 225 21 0 7 206 166 0 0 138 225 21 0 7 206 166 0 0 138 225 21 0 7 206 +166 0 0 0 59 241 89 0 0 0 12 232 89 0 0 0 0 59 238 34 0 12 235 125 0 0 +0 127 206 125 0 0 0 0 175 206 206 125 0 0 0 0 175 206 206 125 0 0 0 0 175 +206 206 125 0 0 0 0 175 206 206 125 0 0 0 0 175 206 206 125 0 0 0 0 175 +232 245 125 0 0 0 89 255 255 255 255 255 166 0 0 138 255 255 255 251 89 +59 245 255 255 255 255 127 81 245 255 255 255 255 225 21 59 245 255 255 +255 255 127 81 245 255 255 255 255 127 111 255 255 255 125 89 255 255 255 +125 89 255 255 255 125 89 255 255 255 125 7 206 255 255 255 255 125 0 0 +59 241 89 0 0 0 175 251 89 0 0 0 138 255 255 255 166 0 0 0 0 138 255 255 +255 166 0 0 0 0 0 138 255 255 255 166 0 0 0 0 138 255 255 255 166 0 0 0 +0 138 255 255 255 166 0 0 0 0 0 0 0 0 0 0 0 0 0 7 202 194 255 255 255 201 +0 0 0 0 59 245 255 251 89 0 0 0 0 59 245 255 251 89 0 0 0 0 59 245 255 +251 89 0 0 0 0 59 245 255 251 89 0 0 0 0 59 241 89 0 0 0 12 232 89 0 0 +0 0 59 238 47 235 255 166 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 12 228 34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 138 +166 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 235 255 166 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 127 127 127 127 127 127 0 127 127 127 +127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 127 127 127 +127 0 127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 +127 127 127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 0 127 +127 127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 127 127 +127 0 127 127 127 127 127 127 0 127 127 127 127 0 127 127 127 127 0 127 +127 127 127 0 127 127 127 127 0 127 127 127 127 127 127 127 127 0 127 127 +127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 127 0 127 127 +127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 127 0 127 127 +127 127 127 127 127 127 0 127 127 127 127 127 127 127 127 127 0 127 127 +127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 127 0 127 127 +127 127 127 127 127 127 0 127 127 127 127 127 127 127 127 0 127 127 127 +127 127 127 127 127 0 127 127 127 127 127 127 127 127 0 127 127 127 127 +127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 127 0 0 +0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 235 255 201 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 7 206 +225 21 0 0 0 0 0 12 235 201 0 0 0 138 255 201 0 0 0 59 245 225 29 202 89 +0 0 0 0 0 0 0 0 138 166 7 202 89 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +7 206 225 21 0 0 0 0 0 12 235 201 0 0 0 89 255 225 21 0 0 0 0 0 0 0 0 175 +247 34 0 12 235 255 255 166 0 0 0 0 0 0 0 0 0 0 0 0 59 245 225 29 202 89 +0 0 138 251 89 0 0 0 0 0 7 206 225 21 0 0 0 89 255 225 21 0 0 59 245 225 +29 202 89 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 206 225 +21 0 0 0 0 0 89 255 125 0 0 0 89 255 225 21 0 0 0 0 0 0 0 0 0 0 0 0 138 +251 89 0 59 238 34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 175 +166 0 0 0 0 7 206 166 0 0 0 89 225 21 175 201 0 7 202 89 138 255 166 0 +0 89 247 34 175 166 0 0 138 166 7 202 89 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 7 206 166 0 0 0 0 0 175 166 0 0 0 89 247 34 138 201 0 0 89 247 +34 175 201 0 0 138 201 0 175 200 215 34 235 247 47 232 0 138 255 225 111 +225 21 0 0 172 89 138 255 166 0 0 0 0 89 225 21 0 0 0 0 175 201 0 0 0 0 +89 247 34 138 201 0 0 172 89 138 255 166 0 0 59 238 34 138 201 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 175 166 0 0 0 0 59 241 89 0 0 0 89 +247 34 138 201 0 0 0 59 238 34 138 201 0 0 0 89 247 34 0 0 59 238 34 0 +0 0 0 0 138 225 29 206 166 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 235 255 201 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 7 206 225 21 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 12 235 166 0 0 0 0 0 0 0 0 89 166 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 59 238 34 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 7 206 255 255 255 125 0 7 206 255 255 255 +125 0 7 206 255 255 255 125 0 7 206 255 255 255 125 0 7 206 255 255 255 +125 0 12 235 255 255 251 89 0 12 235 255 255 251 89 59 245 255 166 0 0 +59 245 255 255 201 0 12 235 255 251 89 0 0 12 235 255 251 89 0 0 12 235 +255 251 89 0 0 12 235 255 251 89 0 59 238 34 59 238 34 59 238 34 59 238 +34 0 59 241 89 175 225 21 0 59 241 194 255 255 125 0 0 12 235 255 247 34 +0 0 12 235 255 247 34 0 0 0 12 235 255 247 34 0 0 12 235 255 247 34 0 0 +12 235 255 247 34 0 0 0 0 0 12 235 166 0 0 0 0 7 206 255 255 225 21 0 59 +241 89 0 59 241 89 59 241 89 0 59 241 89 59 241 89 0 59 241 89 0 59 241 +89 0 59 241 97 206 166 0 0 12 235 125 59 238 163 255 255 201 7 206 166 +0 0 12 235 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 89 247 34 0 0 0 0 89 247 +34 0 0 0 0 89 247 34 0 0 0 0 89 247 34 0 0 0 0 89 247 34 0 0 0 0 138 225 +21 0 0 0 0 89 255 225 21 0 138 201 59 245 125 0 0 0 7 206 125 0 89 225 +21 7 206 125 0 89 225 21 7 206 125 0 89 225 21 7 206 125 0 89 225 21 59 +238 34 59 238 34 59 238 34 59 238 34 0 0 0 0 12 235 125 0 59 245 166 0 +89 247 34 7 206 166 0 138 225 21 7 206 166 0 138 225 21 0 7 206 166 0 138 +225 21 7 206 166 0 138 225 21 7 206 166 0 138 225 21 0 0 0 0 0 0 0 0 0 +0 12 232 89 0 138 251 89 0 59 241 89 0 59 241 89 59 241 89 0 59 241 89 +59 241 89 0 59 241 89 0 59 241 89 0 59 241 89 89 247 34 0 89 247 34 59 +245 166 0 7 206 166 89 247 34 0 89 247 34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 +59 241 89 0 0 0 0 59 241 89 0 0 0 0 59 241 89 0 0 0 0 59 241 89 0 0 0 0 +59 241 89 0 0 0 0 59 238 34 0 0 0 0 12 232 89 0 0 59 238 127 225 21 0 0 +0 59 238 34 0 59 238 34 59 238 34 0 59 238 34 59 238 34 0 59 238 34 59 +238 34 0 59 238 34 59 238 34 59 238 34 59 238 34 59 238 34 0 138 255 255 +255 255 201 0 59 241 89 0 59 241 89 59 241 89 0 59 241 89 59 241 89 0 59 +241 89 0 59 241 89 0 59 241 89 59 241 89 0 59 241 89 59 241 89 0 59 241 +89 0 12 235 255 255 255 255 255 255 166 138 201 0 59 157 175 201 0 59 241 +89 0 59 241 89 59 241 89 0 59 241 89 59 241 89 0 59 241 89 0 59 241 89 +0 59 241 89 12 235 125 0 175 166 0 59 238 34 0 0 138 225 34 235 125 0 175 +166 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 127 0 89 255 255 255 251 89 0 89 255 255 255 251 +89 0 89 255 255 255 251 89 0 89 255 255 255 251 89 0 89 255 255 255 251 +89 0 138 255 255 255 247 34 0 175 255 255 255 255 255 255 255 255 251 127 +201 0 0 0 0 59 245 255 255 255 251 89 59 245 255 255 255 251 89 59 245 +255 255 255 251 89 59 245 255 255 255 251 89 59 238 34 59 238 34 59 238 +34 59 238 34 138 247 34 0 0 138 201 0 59 241 89 0 59 241 89 59 238 34 0 +12 232 89 59 238 34 0 12 232 89 0 59 238 34 0 12 232 89 59 238 34 0 12 +232 89 59 238 34 0 12 232 89 0 0 0 0 0 0 0 0 0 0 175 201 7 176 21 138 201 +0 59 241 89 0 59 241 89 59 241 89 0 59 241 89 59 241 89 0 59 241 89 0 59 +241 89 0 59 241 89 0 175 201 12 232 89 0 59 238 34 0 0 138 225 21 175 201 +12 232 89 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 59 241 89 0 59 241 89 59 241 89 0 59 +241 89 59 241 89 0 59 241 89 59 241 89 0 59 241 89 59 241 89 0 59 241 89 +138 247 34 0 59 238 34 138 225 21 0 12 232 89 0 0 0 0 138 201 0 0 0 0 59 +238 34 0 0 0 0 59 238 34 0 0 0 0 59 238 34 0 0 0 0 59 238 34 0 0 0 0 59 +238 34 59 238 34 59 238 34 59 238 34 175 201 0 0 0 138 166 0 59 241 89 +0 59 241 89 59 241 89 0 59 241 89 59 241 89 0 59 241 89 0 59 241 89 0 59 +241 89 59 241 89 0 59 241 89 59 241 89 0 59 241 89 0 0 0 0 12 235 166 0 +0 0 138 201 134 89 0 175 166 0 59 241 89 0 59 241 89 59 241 89 0 59 241 +89 59 241 89 0 59 241 89 0 59 241 89 0 59 241 89 0 89 247 124 225 21 0 +59 238 34 0 0 138 201 0 89 247 124 225 21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 89 247 +34 0 89 251 89 89 247 34 0 89 251 89 89 247 34 0 89 251 89 89 247 34 0 +89 251 89 89 247 34 0 89 251 89 175 201 0 0 175 247 34 175 201 0 0 59 245 +225 21 0 7 199 94 245 125 0 0 0 7 206 166 0 7 199 34 7 206 166 0 7 199 +34 7 206 166 0 7 199 34 7 206 166 0 7 199 34 59 238 34 59 238 34 59 238 +34 59 238 34 138 247 34 0 12 232 89 0 59 241 89 0 59 241 89 7 206 166 0 +138 225 21 7 206 166 0 138 225 21 0 7 206 166 0 138 225 21 7 206 166 0 +138 225 21 7 206 166 0 138 225 21 0 0 0 0 12 235 166 0 0 0 59 245 166 0 +59 241 89 0 12 235 125 0 175 251 89 12 235 125 0 175 251 89 12 235 125 +0 175 251 89 0 12 235 125 0 175 251 89 0 7 206 255 125 0 0 59 238 34 0 +12 235 125 0 7 206 255 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 175 255 255 232 +241 89 0 175 255 255 232 241 89 0 175 255 255 232 241 89 0 175 255 255 +232 241 89 0 175 255 255 232 241 89 12 235 255 255 166 238 34 12 235 255 +255 225 21 89 255 255 251 89 0 89 255 255 255 201 0 12 235 255 251 89 0 +0 12 235 255 251 89 0 0 12 235 255 251 89 0 0 12 235 255 251 89 0 59 238 +34 59 238 34 59 238 34 59 238 34 0 138 255 255 255 125 0 0 59 241 89 0 +59 241 89 0 12 235 255 247 34 0 0 12 235 255 247 34 0 0 0 12 235 255 247 +34 0 0 12 235 255 247 34 0 0 12 235 255 247 34 0 0 0 0 0 0 0 0 0 0 0 7 +206 255 255 225 21 0 0 0 89 255 255 166 241 89 0 89 255 255 166 241 89 +0 89 255 255 166 241 89 0 0 89 255 255 166 241 89 0 0 138 247 34 0 0 59 +245 166 255 255 166 0 0 0 138 247 34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 59 215 34 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 138 125 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 12 232 89 0 0 0 59 238 34 0 0 0 0 0 +12 232 89 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 12 235 255 125 21 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 138 225 21 0 0 0 59 238 34 0 0 0 0 0 138 225 21 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 +127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 +127 127 127 127 127 0 127 127 127 127 127 127 127 127 127 127 0 127 127 +127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 +127 127 127 127 0 127 127 127 127 127 127 0 127 127 0 127 127 0 127 127 +0 127 127 0 127 127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 +127 127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 127 127 +127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 +127 127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 127 127 +127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 +127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 +127 127 127 127 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/res/FontSmall.pgm b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/res/FontSmall.pgm new file mode 100644 index 00000000..482ac79f --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/res/FontSmall.pgm @@ -0,0 +1,603 @@ +P2 +# Created by Paint Shop Pro +211 84 +255 +127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 +0 0 0 0 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 255 0 0 0 255 255 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 +0 0 0 0 255 0 255 0 255 0 0 0 255 0 0 255 0 0 0 255 0 0 0 0 255 255 0 0 +0 255 0 0 0 0 255 255 0 0 0 255 0 0 255 0 0 255 0 0 255 0 255 0 255 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 255 255 0 0 0 255 0 0 255 255 +255 0 0 255 255 255 0 0 0 0 0 255 0 255 255 255 255 0 0 255 255 0 0 255 +255 255 255 0 0 255 255 0 0 0 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 127 0 0 0 0 255 0 255 0 255 0 0 0 255 0 0 255 0 0 255 255 255 255 +0 255 0 0 255 0 255 0 0 0 0 255 0 0 255 0 0 255 0 255 0 0 0 0 255 0 0 255 +255 255 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 255 0 0 255 0 255 +255 0 0 0 0 0 255 0 0 0 0 255 0 0 0 255 255 0 255 0 0 0 0 255 0 0 0 0 0 +0 0 255 0 255 0 0 255 0 255 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 +0 0 0 0 255 0 0 0 0 0 0 255 255 255 255 255 255 255 0 255 0 0 0 255 0 0 +255 0 255 0 0 0 0 255 0 0 255 0 0 0 0 255 0 0 0 0 255 0 255 0 255 0 255 +0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 255 0 0 255 0 0 255 0 0 0 +0 0 255 0 0 0 0 255 0 0 255 0 255 0 255 0 0 0 0 255 0 0 0 0 0 0 255 0 0 +255 0 0 255 0 255 0 0 255 0 0 255 0 0 255 0 0 0 0 0 255 255 0 0 0 0 0 0 +0 0 0 255 255 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +127 0 0 0 0 255 0 0 0 0 0 0 0 255 0 255 0 0 0 255 255 0 0 0 0 255 255 0 +255 0 255 255 0 0 0 255 255 0 255 0 0 0 255 0 0 0 0 255 0 0 0 255 0 0 0 +0 255 255 255 255 255 0 0 0 0 0 0 0 0 0 0 0 255 0 0 255 0 0 255 0 0 255 +0 0 0 0 255 0 0 0 255 255 0 0 255 0 0 255 0 255 255 255 0 0 255 255 255 +0 0 0 0 255 0 0 0 255 255 0 0 0 255 255 255 0 0 255 0 0 255 0 0 0 255 255 +0 0 0 255 255 255 255 255 255 0 0 0 0 255 255 0 0 0 0 255 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 255 0 0 0 0 0 255 255 255 255 255 +255 0 0 0 255 255 0 0 0 0 0 255 0 255 0 0 255 0 255 0 0 255 0 0 0 0 255 +0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 255 255 0 0 0 0 0 255 0 +0 255 0 0 255 0 0 255 0 0 0 255 0 0 0 0 0 0 255 0 255 255 255 255 255 0 +0 0 255 0 255 0 0 255 0 0 255 0 0 0 255 0 0 255 0 0 0 0 255 0 0 0 0 0 0 +0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 255 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 255 0 0 255 0 0 0 0 +255 0 255 0 0 0 0 255 0 255 0 0 255 0 255 0 0 255 255 0 0 0 255 0 0 0 0 +255 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 255 0 0 0 0 0 255 0 0 255 0 0 255 0 +0 255 0 0 255 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 255 0 +0 255 0 0 255 0 0 0 255 0 0 255 0 0 0 0 255 0 0 255 0 0 255 0 0 0 255 255 +0 0 0 255 255 255 255 255 255 0 0 0 0 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 255 0 0 0 0 0 0 255 0 0 255 0 0 255 +255 255 255 0 0 0 0 255 0 0 0 255 255 0 0 0 255 255 0 0 255 0 0 255 0 0 +0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 255 0 255 0 0 0 0 255 +255 0 0 255 255 255 0 255 255 255 255 0 255 255 255 0 0 0 0 0 255 0 255 +255 255 0 0 0 255 255 0 0 255 0 0 0 0 0 255 255 0 0 0 255 255 0 0 0 255 +0 0 255 0 0 0 0 0 255 255 0 0 0 0 0 0 0 0 0 255 255 0 0 0 0 0 255 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 255 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 127 127 0 127 0 127 127 127 +0 127 127 127 127 127 127 0 127 127 127 127 127 0 127 127 127 127 127 127 +127 127 127 0 127 127 127 127 127 0 127 0 127 127 0 127 127 127 0 127 127 +127 127 127 0 127 127 127 127 127 127 0 127 127 0 127 127 127 0 127 0 127 +127 127 0 127 127 127 127 0 127 127 127 0 127 127 127 127 0 127 127 127 +127 0 127 127 127 127 0 127 127 127 127 0 127 127 127 127 0 127 127 127 +127 0 127 127 127 127 0 127 127 127 127 0 127 127 0 127 127 0 127 127 127 +127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 +127 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 0 255 0 0 0 255 255 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 255 255 255 0 0 0 0 0 +255 255 0 0 0 255 255 255 0 0 0 0 0 255 255 255 0 0 255 255 255 255 0 0 +0 255 255 255 255 255 0 255 255 255 255 255 0 0 0 255 255 255 0 0 255 0 +0 0 0 255 0 255 255 255 0 0 255 255 0 255 0 0 0 255 0 255 0 0 0 255 255 +0 0 0 255 255 0 255 0 0 0 0 255 0 0 0 255 255 255 0 0 0 255 255 255 255 +0 0 0 0 255 255 255 0 0 0 255 255 255 255 0 0 0 255 255 255 255 0 255 255 +255 255 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 255 0 0 255 0 +255 0 0 255 0 255 0 0 0 255 0 255 255 255 255 0 255 0 0 255 0 0 0 0 255 +0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 255 0 +0 0 255 0 0 0 0 255 255 0 0 0 255 0 0 255 0 0 0 255 0 0 0 255 0 255 0 0 +0 255 0 0 255 0 0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 255 0 255 0 0 0 0 255 +0 0 255 0 0 0 0 255 0 255 0 0 255 0 0 255 0 0 0 255 255 0 0 0 255 255 0 +255 255 0 0 0 255 0 0 255 0 0 0 255 0 0 255 0 0 0 255 0 0 255 0 0 0 255 +0 0 255 0 0 0 255 0 255 0 0 0 0 0 0 0 255 0 0 0 255 0 0 0 0 255 0 255 0 +0 0 0 255 0 255 0 0 255 0 0 255 0 255 0 0 255 0 0 255 0 255 0 0 0 0 0 255 +0 255 0 0 0 255 0 0 0 255 0 0 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 127 255 0 0 255 255 0 255 0 0 255 0 0 255 0 0 255 0 0 255 +0 0 255 0 0 0 0 0 0 255 0 0 0 0 255 0 255 0 0 0 0 0 255 0 0 0 0 0 255 0 +0 0 0 0 0 255 0 0 0 0 255 0 0 255 0 0 0 0 255 0 255 0 255 0 0 0 255 0 0 +0 255 0 255 0 255 0 255 0 255 0 255 0 0 255 0 255 0 0 0 0 0 255 0 255 0 +0 0 255 0 255 0 0 0 0 0 255 0 255 0 0 0 255 0 255 0 0 0 0 0 0 0 255 0 0 +0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 255 0 255 0 255 0 255 0 0 255 255 +0 0 0 255 0 255 0 0 0 0 255 0 0 255 0 0 0 255 0 0 0 255 0 255 0 0 0 255 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 255 0 255 0 255 0 255 +0 0 255 0 0 255 0 0 255 255 255 255 0 0 255 0 0 0 0 0 0 255 0 0 0 0 255 +0 255 255 255 255 0 0 255 255 255 255 0 0 255 0 0 255 255 255 0 255 255 +255 255 255 255 0 0 255 0 0 0 0 255 0 255 255 0 0 0 0 255 0 0 0 255 0 255 +0 255 0 255 0 255 0 0 255 0 255 0 255 0 0 0 0 0 255 0 255 0 0 0 255 0 255 +0 0 0 0 0 255 0 255 255 255 255 0 0 0 255 255 255 0 0 0 0 255 0 0 0 255 +0 0 0 0 255 0 0 255 0 0 255 0 0 255 0 255 0 255 0 255 0 0 255 255 0 0 0 +0 255 0 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 255 0 255 0 255 0 255 0 255 255 255 +255 255 255 0 255 0 0 0 255 0 255 0 0 0 0 0 0 255 0 0 0 0 255 0 255 0 0 +0 0 0 255 0 0 0 0 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 0 255 0 0 0 0 255 +0 255 0 255 0 0 0 255 0 0 0 255 0 0 255 0 0 255 0 255 0 0 0 255 255 0 255 +0 0 0 0 0 255 0 255 255 255 255 0 0 255 0 0 0 0 0 255 0 255 0 255 0 0 0 +0 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 0 255 0 0 255 0 0 255 0 0 255 0 255 +0 255 0 255 0 0 255 255 0 0 0 0 255 0 0 0 0 255 0 0 0 255 0 0 0 255 0 0 +0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 255 +0 0 255 255 255 0 0 255 0 0 0 0 255 0 255 0 0 0 255 0 0 255 0 0 0 255 0 +255 0 0 0 255 0 0 255 0 0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 255 0 255 0 0 +0 0 255 0 0 255 0 0 0 0 255 0 255 0 0 255 0 0 255 0 0 0 255 0 0 255 0 0 +255 0 255 0 0 0 0 255 0 0 255 0 0 0 255 0 0 255 0 0 0 0 0 0 255 0 0 0 255 +0 0 255 0 0 255 0 0 0 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 0 255 0 0 0 255 +255 0 0 0 0 255 0 0 0 255 0 0 255 0 0 255 0 0 0 255 0 0 0 255 0 0 0 0 255 +0 0 0 255 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 127 0 255 0 0 0 0 0 0 255 0 0 0 0 255 0 255 255 255 255 0 0 0 0 255 +255 255 0 0 255 255 255 255 0 0 0 255 255 255 255 255 0 255 0 0 0 0 0 0 +0 255 255 255 255 0 255 0 0 0 0 255 0 255 255 255 0 255 255 0 0 255 0 0 +0 255 0 255 255 255 255 255 0 0 0 0 0 255 0 255 0 0 0 0 255 0 0 0 255 255 +255 0 0 0 255 0 0 0 0 0 0 0 255 255 255 0 0 0 255 0 0 0 255 0 255 255 255 +255 0 0 0 0 255 0 0 0 0 255 255 255 255 0 0 0 0 255 255 0 0 0 0 255 0 0 +0 255 0 0 255 0 0 255 0 0 0 255 0 0 0 255 255 255 255 0 255 0 0 0 0 255 +0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 +0 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 +0 255 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 +0 0 0 0 0 255 255 0 0 0 0 0 0 0 255 255 255 255 255 255 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 127 127 127 127 127 127 127 0 127 127 127 127 127 127 +0 127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 +0 127 127 127 127 127 0 127 127 127 127 127 0 127 127 127 127 127 127 0 +127 127 127 127 127 127 0 127 127 127 0 127 127 127 0 127 127 127 127 127 +0 127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 127 127 127 0 +127 127 127 127 127 127 127 0 127 127 127 127 127 0 127 127 127 127 127 +127 127 0 127 127 127 127 127 0 127 127 127 127 127 0 127 127 127 127 127 +0 127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 +127 127 0 127 127 127 127 0 127 127 127 127 127 0 127 127 127 127 0 127 +127 0 127 127 127 0 127 127 0 127 127 127 127 127 0 127 127 127 127 127 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 127 255 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 +0 0 255 0 0 0 0 0 0 0 255 255 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 255 0 0 0 +0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 255 0 0 255 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 255 0 0 0 0 0 0 0 255 0 0 +0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 255 0 0 +255 0 255 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 0 0 0 0 0 0 0 255 +255 255 255 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 +0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 0 +0 0 0 255 0 0 0 0 0 0 0 0 0 255 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 255 0 0 0 255 +0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 127 0 0 0 0 0 255 255 0 0 255 255 255 0 0 0 255 255 0 0 255 +255 255 0 0 255 255 0 0 255 255 255 0 255 255 255 0 255 255 255 0 0 255 +0 255 255 0 255 0 0 255 0 255 0 255 255 255 0 255 255 0 0 255 255 255 0 +0 0 255 255 0 0 255 255 255 0 0 0 255 255 255 0 255 0 255 255 255 255 0 +255 255 0 255 0 0 255 0 255 0 0 0 255 0 255 0 0 255 0 0 255 0 255 0 255 +0 255 0 0 0 255 0 255 255 255 0 0 255 0 0 0 255 0 0 0 255 0 0 0 0 0 0 0 +0 0 0 255 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 +0 0 0 0 0 0 0 255 0 255 0 0 255 0 255 0 0 0 255 0 0 255 0 255 0 0 255 0 +255 0 0 255 0 0 255 0 255 0 0 255 0 255 0 0 255 0 255 0 255 0 0 255 0 255 +0 0 255 0 0 255 0 255 0 0 255 0 255 0 0 255 0 255 0 0 255 0 255 0 0 255 +0 255 255 0 255 0 0 0 255 0 0 255 0 0 255 0 0 255 0 255 0 0 255 0 0 255 +0 0 255 0 0 255 0 0 0 255 0 255 0 0 0 0 255 0 0 255 0 0 0 255 0 0 0 255 +0 0 0 255 255 0 0 255 0 0 255 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 255 255 255 0 255 0 0 255 0 255 0 0 0 255 +0 0 255 0 255 255 255 255 0 255 0 0 255 0 0 255 0 255 0 0 255 0 255 0 0 +255 0 255 255 0 0 0 255 0 255 0 0 255 0 0 255 0 255 0 0 255 0 255 0 0 255 +0 255 0 0 255 0 255 0 0 255 0 255 0 0 0 255 0 0 255 0 0 255 0 0 255 0 0 +255 0 255 0 0 255 0 255 0 255 0 255 0 0 255 0 0 0 255 0 255 0 0 0 255 0 +0 255 0 0 0 0 255 0 0 0 0 255 0 255 0 0 255 255 0 0 0 255 0 0 0 0 0 255 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 255 0 0 255 0 +255 0 0 255 0 255 0 0 0 255 0 0 255 0 255 0 0 0 0 255 0 0 255 0 0 255 0 +255 0 0 255 0 255 0 0 255 0 255 0 255 0 0 255 0 255 0 0 255 0 0 255 0 255 +0 0 255 0 255 0 0 255 0 255 0 0 255 0 255 0 0 255 0 255 0 0 0 0 255 0 255 +0 0 255 0 0 255 0 0 255 0 255 0 0 0 255 255 0 255 255 0 0 0 255 0 0 0 255 +0 255 0 0 255 0 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 0 0 0 0 0 0 0 255 0 +0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 +255 255 255 0 255 255 255 0 0 0 255 255 0 0 255 255 255 0 0 255 255 255 +0 255 0 0 0 255 255 255 0 255 0 0 255 0 255 0 0 255 0 255 0 0 255 0 255 +0 255 0 0 255 0 0 255 0 255 0 0 255 0 0 255 255 0 0 255 255 255 0 0 0 255 +255 255 0 255 0 0 255 255 255 0 0 255 0 0 255 255 255 0 0 0 255 0 0 0 0 +255 0 0 0 255 0 0 255 0 255 0 0 0 255 0 0 0 255 255 255 0 0 255 0 0 0 255 +0 0 0 255 0 0 0 0 0 0 0 0 0 0 255 255 255 255 255 255 255 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 +0 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 0 0 0 0 0 0 0 0 0 255 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 +0 0 0 0 0 0 0 0 0 0 255 0 0 255 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 127 127 0 127 127 +127 127 0 127 127 127 127 0 127 127 127 0 127 127 127 127 0 127 127 127 +127 0 127 127 0 127 127 127 127 0 127 127 127 127 0 127 0 127 127 0 127 +127 127 127 0 127 0 127 127 127 127 127 127 127 0 127 127 127 127 0 127 +127 127 127 0 127 127 127 127 0 127 127 127 127 0 127 127 0 127 127 127 +0 127 127 0 127 127 127 127 0 127 127 127 127 127 0 127 127 127 127 127 +127 127 0 127 127 127 0 127 127 127 127 127 0 127 127 127 0 127 127 127 +0 127 127 127 0 127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 +127 127 127 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 +0 0 255 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 255 0 0 255 255 0 255 0 0 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 255 255 0 255 0 0 0 0 0 0 0 0 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 127 0 255 255 255 0 0 255 255 255 255 255 255 255 0 0 0 0 +0 0 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 255 0 255 +0 0 255 255 0 0 0 255 0 0 0 0 0 0 0 255 255 255 255 0 0 0 0 0 255 255 255 +255 255 255 255 0 0 255 255 255 255 255 255 255 0 255 255 255 255 0 0 255 +255 255 255 255 255 255 0 0 255 255 255 255 255 255 255 0 255 0 0 255 255 +0 255 0 0 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 255 255 255 +255 255 0 255 0 255 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 255 +255 255 255 0 0 255 0 0 255 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 127 255 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 0 +0 0 0 0 0 0 0 0 255 255 255 255 255 0 255 255 255 255 255 0 0 0 0 0 0 255 +0 0 255 0 255 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 255 0 0 0 255 0 0 0 0 0 +255 0 0 0 0 0 255 0 0 0 0 255 0 0 255 0 0 0 0 0 255 0 0 255 0 0 0 0 0 255 +0 0 255 255 0 0 255 0 255 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 255 0 0 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 +0 0 0 0 255 0 0 0 0 0 0 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 127 255 255 255 255 0 0 255 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 0 0 0 0 255 0 0 255 0 +255 0 0 0 0 0 0 0 255 0 0 0 0 0 0 255 0 255 0 0 0 255 0 0 0 0 0 255 0 0 +0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 0 0 255 0 0 255 0 0 0 0 0 255 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 +0 255 0 255 0 255 255 255 0 255 0 0 0 255 255 0 255 255 0 0 0 255 0 0 0 +0 0 255 0 255 255 255 0 0 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 127 255 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 255 255 255 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 255 255 255 255 255 0 0 0 0 0 0 0 255 +255 0 255 0 255 255 0 255 255 0 0 0 255 255 255 0 0 255 0 0 255 0 0 0 255 +255 255 255 0 0 255 0 0 0 0 0 255 0 0 255 0 0 0 0 255 0 0 0 0 0 255 0 0 +255 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 255 0 255 0 0 255 0 0 +255 0 0 255 0 0 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 127 255 255 255 255 0 0 255 0 0 0 0 0 255 0 0 0 +0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 0 0 0 0 +0 0 0 255 0 255 0 0 255 0 0 255 0 0 0 0 0 255 0 255 0 0 255 0 0 0 255 0 +0 0 0 0 255 0 0 0 0 0 255 0 0 255 0 0 0 0 255 0 0 0 0 0 255 0 0 255 0 0 +0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 0 255 255 255 255 0 255 +255 255 255 255 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 255 0 +255 0 0 255 255 255 255 0 0 255 0 0 0 0 0 255 0 0 255 0 0 0 0 255 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 255 0 0 0 0 0 255 0 0 0 +0 0 255 0 0 255 0 0 255 0 0 0 255 0 255 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 +255 0 0 0 0 0 0 0 0 0 0 0 255 0 255 0 0 255 0 0 255 0 0 0 0 0 255 0 0 255 +0 255 0 0 0 255 0 0 0 0 0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 0 0 0 +0 255 0 0 255 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 255 0 0 255 0 +0 255 0 0 0 0 0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 255 255 255 0 0 255 255 255 255 255 +255 255 0 0 255 0 255 0 0 0 0 255 0 255 0 255 0 255 0 255 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 255 255 0 255 255 0 0 255 255 255 255 +0 0 0 0 0 0 255 255 255 255 255 255 255 0 0 255 255 255 255 255 255 255 +0 255 255 255 255 0 0 255 255 255 255 255 255 255 0 0 255 255 255 255 255 +255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 255 255 255 0 0 0 0 0 255 255 0 255 255 255 0 0 255 +255 255 255 255 255 255 0 255 255 255 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 255 255 +0 0 0 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 127 127 127 127 0 127 127 127 127 127 127 127 127 +0 127 0 127 127 127 127 0 127 127 127 127 0 127 127 127 127 127 0 127 127 +127 127 127 0 127 127 127 127 127 0 127 127 127 127 0 127 127 127 127 127 +127 127 127 127 127 127 127 0 127 127 127 127 127 0 127 127 0 127 127 127 +127 127 127 127 127 0 127 127 127 127 127 127 127 127 0 127 127 127 127 +0 127 127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 127 0 127 +0 127 0 127 127 127 0 127 127 127 0 127 127 127 0 127 127 127 127 0 127 +127 127 127 127 127 127 0 127 127 127 127 0 127 127 127 127 127 127 127 +0 127 127 127 0 127 127 0 127 127 127 127 127 127 127 0 127 127 127 127 +127 127 127 127 0 127 127 127 0 127 127 127 127 127 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 255 255 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 255 0 0 0 255 0 0 0 0 255 255 0 0 +0 0 0 0 0 255 0 0 0 255 0 255 0 0 255 255 255 0 0 255 0 255 0 0 0 255 255 +255 255 0 0 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 255 +0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 255 255 255 0 255 255 255 0 0 255 +0 0 0 0 0 0 0 0 255 255 255 0 0 0 0 0 0 0 0 0 0 0 255 0 0 255 255 0 0 0 +0 0 0 0 0 255 0 0 255 0 0 0 0 0 255 0 0 0 255 0 0 0 255 255 255 0 0 255 +0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 255 0 0 0 255 0 0 0 255 +0 0 0 255 0 0 255 0 255 0 0 255 0 255 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 255 +0 0 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 255 0 0 0 0 0 +0 255 0 255 0 0 0 0 255 0 0 0 0 0 0 255 0 0 255 0 0 0 0 0 0 0 0 0 0 0 255 +255 0 255 0 0 0 0 0 0 0 0 0 0 255 255 0 255 0 0 255 0 0 0 0 0 0 255 255 +0 255 0 0 0 0 0 255 255 0 0 255 0 0 0 0 0 255 0 0 255 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 127 0 0 0 0 0 255 0 0 255 255 255 0 0 255 0 0 0 0 255 255 255 +0 0 0 255 0 255 0 0 255 0 255 0 0 0 0 0 0 0 0 0 255 0 0 255 255 0 0 255 +255 0 255 0 0 255 0 255 0 0 0 0 0 0 0 0 0 0 0 255 0 255 255 255 0 0 255 +0 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 255 0 0 0 0 0 255 0 +0 255 0 255 255 0 255 0 0 0 0 0 0 0 0 0 0 0 255 0 255 0 0 255 0 255 0 255 +0 0 0 255 0 255 0 0 0 0 0 0 255 0 0 255 0 0 0 0 0 0 255 0 255 0 0 0 0 0 +255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 255 0 255 0 255 0 0 255 255 255 0 0 0 +255 0 255 0 0 0 0 255 0 0 0 0 0 255 255 255 0 0 0 0 0 0 0 255 0 255 0 0 +0 0 255 0 255 255 0 255 0 255 0 0 0 255 255 255 255 255 0 0 0 0 255 0 255 +0 0 255 0 255 0 0 0 0 0 0 0 0 0 0 255 255 255 255 255 0 0 255 255 255 0 +255 255 0 0 0 0 0 0 255 0 0 255 0 255 255 0 255 0 0 255 0 0 0 0 0 0 0 255 +255 255 0 255 255 0 0 0 255 0 255 0 0 255 255 0 0 255 255 0 0 0 255 0 255 +0 255 255 0 0 255 255 0 255 0 255 255 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 +0 0 0 255 0 255 0 255 0 0 0 255 0 0 0 0 255 255 255 0 0 0 255 255 255 0 +0 0 0 255 0 0 255 0 0 0 0 0 0 255 0 255 0 0 0 0 255 0 0 0 0 255 0 255 0 +0 0 0 0 0 0 255 0 255 255 0 255 0 255 255 255 0 0 255 0 0 0 0 0 0 0 0 0 +0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 255 0 0 255 0 255 0 0 +255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 255 0 0 0 255 0 255 0 255 0 0 +0 0 255 0 0 0 0 255 0 0 0 255 0 255 0 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 +0 0 0 0 0 255 0 255 0 255 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 +255 0 0 255 255 255 0 0 0 0 0 0 255 0 0 255 255 0 0 255 0 0 0 0 0 255 0 +255 0 0 0 0 0 0 255 0 0 0 0 255 0 255 0 0 255 0 255 0 0 0 0 0 0 0 0 0 0 +0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 255 0 0 255 0 255 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 255 0 0 0 0 255 0 255 255 255 255 0 +0 0 255 0 0 0 255 0 0 0 0 255 0 255 255 255 255 255 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +127 0 0 0 0 0 255 0 0 255 255 255 0 255 255 255 255 0 0 0 0 0 0 0 0 0 255 +0 0 0 255 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 255 255 255 +255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 255 0 0 255 0 255 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 255 0 0 0 255 0 0 +0 255 255 255 0 0 255 0 0 0 0 255 0 0 255 255 255 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 +0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 255 +0 0 0 0 0 0 0 0 255 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 255 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 255 0 255 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 255 255 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 127 127 127 0 127 0 127 127 127 127 0 127 +127 127 127 0 127 127 127 127 127 0 127 127 127 127 127 0 127 0 127 127 +127 127 0 127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 0 +127 127 127 127 0 127 127 127 127 127 127 0 127 127 0 127 127 127 127 127 +127 127 0 127 127 127 127 0 127 127 127 127 0 127 127 127 127 127 0 127 +127 127 127 0 127 127 127 0 127 127 127 0 127 127 127 127 0 127 127 127 +127 0 127 127 127 0 127 127 127 0 127 127 127 0 127 127 127 127 0 127 127 +127 127 0 127 127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 +127 0 127 127 127 127 127 127 127 0 127 127 127 127 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 +0 0 255 0 0 0 0 0 255 0 0 0 0 0 0 255 0 255 0 0 0 255 0 255 255 0 0 0 255 +0 0 255 0 0 0 0 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 +0 0 0 255 0 0 0 0 255 0 255 0 0 0 255 0 255 0 0 0 255 0 0 0 255 0 0 255 +0 255 0 255 0 255 0 0 0 0 0 0 0 0 0 255 0 255 255 0 0 0 0 0 255 0 0 0 0 +0 0 0 255 0 0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 255 255 0 0 0 0 255 0 255 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 0 0 +255 0 255 0 0 0 255 0 0 255 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 +0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 255 0 0 127 0 0 +255 255 0 0 0 0 0 255 255 0 0 0 0 0 255 255 0 0 0 0 0 255 255 0 0 0 0 0 +255 255 0 0 0 0 0 255 255 0 0 0 0 0 255 255 255 255 255 0 0 0 255 255 255 +0 0 255 255 255 255 255 0 255 255 255 255 255 0 255 255 255 255 255 0 255 +255 255 255 255 0 255 255 255 0 255 255 255 0 255 255 255 0 255 255 255 +0 255 255 255 255 0 0 0 255 0 0 0 0 255 0 0 0 255 255 255 0 0 0 0 0 255 +255 255 0 0 0 0 0 255 255 255 0 0 0 0 0 255 255 255 0 0 0 0 0 255 255 255 +0 0 0 0 0 0 0 0 0 0 0 0 255 255 255 0 255 0 255 0 0 0 0 255 0 255 0 0 0 +0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 255 0 255 0 0 0 0 +255 0 0 255 0 127 0 0 255 255 0 0 0 0 0 255 255 0 0 0 0 0 255 255 0 0 0 +0 0 255 255 0 0 0 0 0 255 255 0 0 0 0 0 255 255 0 0 0 0 255 0 255 0 0 0 +0 0 255 0 0 0 255 0 255 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 +0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 255 0 0 255 0 0 0 255 0 0 255 255 0 +0 0 255 0 0 255 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 +255 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 0 0 0 0 0 0 0 255 0 0 0 255 0 0 +255 0 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 +0 255 0 255 0 0 255 255 255 0 0 255 0 0 255 0 127 0 255 0 0 255 0 0 0 255 +0 0 255 0 0 0 255 0 0 255 0 0 0 255 0 0 255 0 0 0 255 0 0 255 0 0 0 255 +0 0 255 0 0 0 255 0 255 0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 +0 0 255 0 0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 255 0 0 +255 0 0 0 0 255 0 255 0 255 0 0 255 0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 +255 0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 0 255 +0 0 0 255 0 255 0 0 0 255 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 255 +0 0 0 0 255 0 255 0 0 0 0 255 0 0 255 0 255 0 0 255 0 0 255 0 255 0 255 +0 0 127 0 255 0 0 255 0 0 0 255 0 0 255 0 0 0 255 0 0 255 0 0 0 255 0 0 +255 0 0 0 255 0 0 255 0 0 0 255 0 0 255 0 0 0 255 0 255 255 255 255 0 255 +0 0 0 0 0 0 255 255 255 255 0 0 255 255 255 255 0 0 255 255 255 255 0 0 +255 255 255 255 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 255 0 0 255 255 255 +0 0 255 0 255 0 0 255 0 255 0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 255 +0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 0 0 255 0 255 0 +0 255 0 0 255 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 +255 0 255 0 0 0 0 255 0 0 0 255 0 0 0 255 0 0 255 0 255 0 0 255 0 127 255 +255 255 255 255 255 0 255 255 255 255 255 255 0 255 255 255 255 255 255 +0 255 255 255 255 255 255 0 255 255 255 255 255 255 0 255 255 255 255 255 +255 0 0 255 255 255 0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 0 +255 0 0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 255 0 0 255 +0 0 0 0 255 0 255 0 0 0 255 255 0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 255 +0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 255 0 0 0 0 255 +0 0 0 255 0 255 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 +0 0 255 0 255 0 0 0 0 255 0 0 0 255 0 0 0 255 0 0 255 0 255 0 0 255 0 127 +255 0 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 +255 0 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 255 0 0 0 0 0 255 0 0 0 255 +0 255 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 255 +0 0 0 255 0 0 0 255 0 0 255 0 0 0 255 0 0 255 0 0 0 0 255 0 0 255 0 0 0 +255 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 255 0 0 0 255 +0 0 0 255 0 0 0 0 255 0 255 0 0 0 255 0 0 0 255 0 0 255 0 0 0 0 255 0 255 +0 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 0 0 255 0 0 0 255 255 +255 0 0 255 0 0 255 0 127 255 0 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 +0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 0 0 255 0 255 0 0 255 +255 255 255 0 0 0 255 255 255 0 0 255 255 255 255 255 0 255 255 255 255 +255 0 255 255 255 255 255 0 255 255 255 255 255 0 255 255 255 0 255 255 +255 0 255 255 255 0 255 255 255 0 255 255 255 255 0 0 0 255 0 0 0 0 255 +0 0 0 255 255 255 0 0 0 0 0 255 255 255 0 0 0 0 0 255 255 255 0 0 0 0 0 +255 255 255 0 0 0 0 0 255 255 255 0 0 0 0 255 0 0 0 255 0 255 0 255 255 +255 0 0 0 0 255 255 255 255 0 0 0 255 255 255 255 0 0 0 255 255 255 255 +0 0 0 255 255 255 255 0 0 0 0 255 0 0 0 255 0 0 0 0 255 0 255 0 0 127 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 127 127 127 +127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 +127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 +127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 0 127 +127 127 127 127 0 127 127 127 127 127 0 127 127 127 127 127 0 127 127 127 +0 127 127 127 0 127 127 127 0 127 127 127 0 127 127 127 127 127 127 0 127 +127 127 127 127 127 0 127 127 127 127 127 127 127 0 127 127 127 127 127 +127 127 0 127 127 127 127 127 127 127 0 127 127 127 127 127 127 127 0 127 +127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 +127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 127 0 127 127 127 +127 127 127 0 127 127 127 127 127 127 0 127 127 127 127 127 0 127 127 127 +127 0 127 127 127 127 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 127 0 255 0 0 0 0 0 0 255 0 0 0 255 0 0 255 255 0 255 0 +0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 255 0 0 +0 255 0 0 0 0 0 0 0 255 0 0 0 255 0 255 0 0 0 0 0 0 0 0 0 255 255 0 255 +0 0 255 0 0 0 0 0 0 255 0 0 0 255 0 0 255 255 0 255 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 255 0 0 0 255 0 0 0 0 0 0 0 0 0 0 255 +0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 255 +0 0 0 0 255 0 0 0 255 0 255 0 255 0 255 255 0 0 255 0 255 0 0 255 0 255 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 255 0 0 0 255 0 255 0 0 255 0 +255 0 0 255 0 255 0 255 0 255 255 0 255 0 0 255 255 0 255 0 255 255 0 0 +0 255 0 0 0 0 255 0 0 0 255 0 255 0 255 0 255 255 0 255 0 0 255 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 255 0 0 0 255 0 255 0 0 255 0 255 0 +0 0 255 0 0 0 255 0 0 0 0 0 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 255 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 127 0 255 255 0 0 0 255 255 0 0 0 255 255 0 0 0 255 255 0 0 0 255 +255 0 0 0 255 255 0 0 255 255 255 0 255 255 0 0 0 255 255 0 0 255 255 0 +0 0 255 255 0 0 0 255 255 0 0 0 255 255 0 0 0 255 0 255 0 0 255 0 0 255 +0 0 0 0 255 0 255 255 255 0 0 0 255 255 0 0 0 255 255 0 0 0 255 255 0 0 +0 255 255 0 0 0 255 255 0 0 0 0 0 0 0 0 0 0 255 255 255 0 0 255 0 0 255 +0 255 0 0 255 0 255 0 0 255 0 255 0 0 255 0 255 0 0 0 255 0 255 255 255 +0 0 255 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 255 0 0 0 +0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 0 0 255 0 0 255 +0 255 0 0 0 255 0 0 255 0 255 0 0 255 0 255 0 0 255 0 255 0 0 255 0 0 255 +0 255 0 0 255 0 0 255 0 0 255 255 255 0 255 0 0 255 0 255 0 0 255 0 255 +0 0 255 0 255 0 0 255 0 255 0 0 255 0 255 0 0 255 0 0 255 255 255 255 255 +0 255 0 0 255 255 0 255 0 0 255 0 255 0 0 255 0 255 0 0 255 0 255 0 0 255 +0 0 255 0 255 0 0 255 0 0 255 0 0 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 127 0 255 255 255 0 0 255 255 255 0 0 255 255 255 0 0 255 255 255 +0 0 255 255 255 0 0 255 255 255 0 0 255 255 255 255 255 255 0 255 0 0 0 +255 255 255 255 0 255 255 255 255 0 255 255 255 255 0 255 255 255 255 0 +0 255 0 255 0 0 255 0 0 255 0 255 0 0 255 0 255 0 0 255 0 255 0 0 255 0 +255 0 0 255 0 255 0 0 255 0 255 0 0 255 0 255 0 0 255 0 0 0 0 0 0 0 0 255 +0 255 0 255 0 255 0 0 255 0 255 0 0 255 0 255 0 0 255 0 255 0 0 255 0 0 +255 0 255 0 0 255 0 0 255 0 0 255 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 127 255 0 0 255 0 255 0 0 255 0 255 0 0 255 0 255 0 0 255 0 255 0 0 +255 0 255 0 0 255 0 255 0 0 255 0 0 0 0 255 0 0 0 255 0 0 0 0 255 0 0 0 +0 255 0 0 0 0 255 0 0 0 0 0 255 0 255 0 0 255 0 0 255 0 255 0 0 255 0 255 +0 0 255 0 255 0 0 255 0 255 0 0 255 0 255 0 0 255 0 255 0 0 255 0 255 0 +0 255 0 0 0 0 255 0 0 0 255 255 0 0 255 0 255 0 0 255 0 255 0 0 255 0 255 +0 0 255 0 255 0 0 255 0 0 255 0 255 0 0 255 0 0 255 0 0 255 0 255 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 255 255 255 0 0 255 255 255 0 0 255 +255 255 0 0 255 255 255 0 0 255 255 255 0 0 255 255 255 0 0 255 255 0 255 +255 255 0 0 255 255 0 0 255 255 255 0 0 255 255 255 0 0 255 255 255 0 0 +255 255 255 0 0 255 0 255 0 0 255 0 0 255 0 0 255 255 0 0 255 0 0 255 0 +0 255 255 0 0 0 255 255 0 0 0 255 255 0 0 0 255 255 0 0 0 255 255 0 0 0 +0 0 0 0 0 0 0 255 255 255 0 0 0 255 255 255 0 0 255 255 255 0 0 255 255 +255 0 0 255 255 255 0 0 0 255 0 0 0 255 255 255 0 0 0 0 255 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 255 0 0 0 0 0 0 255 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 255 0 0 0 0 255 0 0 0 0 0 255 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 127 127 127 127 0 127 127 127 127 0 127 127 +127 127 0 127 127 127 127 0 127 127 127 127 0 127 127 127 127 0 127 127 +127 127 127 127 127 0 127 127 127 0 127 127 127 127 0 127 127 127 127 0 +127 127 127 127 0 127 127 127 127 0 127 127 0 127 0 127 127 0 127 127 0 +127 127 127 127 0 127 127 127 127 0 127 127 127 127 0 127 127 127 127 0 +127 127 127 127 0 127 127 127 127 0 127 127 127 127 0 127 127 127 127 127 +127 0 127 127 127 127 127 0 127 127 127 127 0 127 127 127 127 0 127 127 +127 127 0 127 127 127 127 0 127 127 127 127 127 0 127 127 127 127 0 127 +127 127 127 127 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 +0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/res/TwXCursors.h b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/res/TwXCursors.h new file mode 100644 index 00000000..7f82c4f7 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/res/TwXCursors.h @@ -0,0 +1,909 @@ +// --------------------------------------------------------------------------- +// +// @file TwXCursors.h +// @brief Bitmaps data for X cursors +// @author Philippe Decaudin - http://www.antisphere.com +// @license This file is part of the AntTweakBar library. +// Copyright © 2005, 2006 Philippe Decaudin. +// For conditions of distribution and use, see License.txt +// +// note: TAB=4 +// +// --------------------------------------------------------------------------- + + +static int g_CurHot[][2] = +{ + {16, 15}, // curs00 + {16, 15}, // curs01 + {16, 15}, // curs02 + {16, 15}, // curs03 + {16, 15}, // curs04 + {16, 15}, // curs05 + {16, 15}, // curs06 + {16, 15}, // curs07 + {16, 15}, // curs08 + {16, 15}, // curs09 + {16, 15}, // curs10 + {16, 15}, // curs11 + {16, 15}, // curs12 + {16, 15} // curs13 +}; + + +static bool g_CurPict[][32*32] = +{ + { // curs00 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { // curs01 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, + 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { // curs02 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { // curs03 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, + 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { // curs04 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, + 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, + 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { // curs05 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, + 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, + 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { // curs06 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { // curs07 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { // curs08 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { // curs09 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { // curs10 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { // curs11 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { // curs12 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, + 1, 1, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, + 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { // curs13 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + } +}; + + +static bool g_CurMask[][32*32] = +{ + { // mask00 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, + 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 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, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { // mask01 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, + 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, + 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { // mask02 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, + 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { // mask03 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { // mask04 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { // mask05 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 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, 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, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, + 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, + 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { // mask06 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, + 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, + 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { // mask07 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, + 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, + 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, + 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { // mask08 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, + 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, + 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { // mask09 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, + 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, + 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + }, + { // mask10 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, + 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0 + }, + { // mask11 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, + 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, + 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 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, 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, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, + 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { // mask12 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 0, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, + 1, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + }, + { // mask13 + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 1, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, + 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 1, + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, + 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1, + 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 1, 1, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 + } +}; diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/res/cur00000.cur b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/res/cur00000.cur new file mode 100644 index 0000000000000000000000000000000000000000..46c0fbcfe06a5e9a43bf303352a79c5fa5069632 GIT binary patch literal 326 zcmaJ*F%E)25S#-O8>3Xl3a+%Yv>*{*1~K-&$@mfc0i^|DoPmN0<}$mtyEA(SBnXHR z$Z)_V07n34Q7u$r&@q}ZP9ae;4U*GkEv7B7JL!>)7Ry;_=lu;lVuNQk)3y7aTW7s} usr)O@AC}PTl>B_j*N-gvnt53dWqup3`Q;`Hp$Fjr9T<^{F#m@Egrn!!mi=v@fJ55? zH7YzEa0BolEFludC+oA{T)|Js%xnwfFQg)60%E?|y1dMx3(44yk>$5hQ z=MsPOj6DnbHb_=8A4Ue~O5A}pEZ%Sj2Q~CCz>_^6GaY@SIu)v8rTRq|Vt=9MlaK1} TMcFlsp@O5+afde=J`bg18WxrOV!+9<0zpJy?4JuTZFWD1v01v_xF?hxh+y7Bc~h z!F$L#QW`h|H$_L>6{9bzU3@jG5s4C!wQTeZ$_pGy(`Q%fuct@;a&_U{K6hBJ2m9Y9 zr!CPyNImAi^bec#7I}^$-5@e_p&I+Th}X;ryQyWGKgBGeT6Rt937SA6&0;2f0WoNE Ao&W#< literal 0 HcmV?d00001 diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/res/cur00005.cur b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/res/cur00005.cur new file mode 100644 index 0000000000000000000000000000000000000000..8e2142ebc032dab4efdb8fee230c16ed760634b5 GIT binary patch literal 326 zcmZvWJr06E6oh91!&WXfwrpu>X$QxmFpQ8&r=zS)?&Ah~%{V@wl0KsctKg)Ur}|v1wq}9yZBFPDy5M zbg`pV&bB4|lm3yE{1C9vc?M>iQ RFjn&{?qXK!$S>cF`~Y7~a!&vN literal 0 HcmV?d00001 diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/res/cur00006.cur b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/res/cur00006.cur new file mode 100644 index 0000000000000000000000000000000000000000..02f5aad32e222c0986d3ee0fece0715a47be991d GIT binary patch literal 326 zcmY+8%?ZLl5QX2y9C8qnlL!jgqenZ?UaY_h60iVUu#^Q4mSJEk2wrj!pKn}4^ex}~ zF*7?r1_$qf3MIAE~rDN!B)jT>4v0-Tqi=q*pl%it~&4_j)~Z-HW)kdS(8IKVfjlr V&*CQHo$QsUDXhONYYjI1(Ho$ebOHbX literal 0 HcmV?d00001 diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/res/cur00007.cur b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/res/cur00007.cur new file mode 100644 index 0000000000000000000000000000000000000000..59d9b7d6d2ba6411ee1c0ea3859799c4cfb249dd GIT binary patch literal 326 zcmZ9GI}(CG5JY>>&~h;`Az%XoLvJ7fhcZ$!uHrE~%HDv~fTHbLRH~S*H=nMl-T?|2 zVgyPATnsn@I15Q=gz0&7InSw3aXd)Qjk3wbaD&+sA)VB>qRGq-owmN%OC}N6mJ2?+ z{@eN2Mw-)RU&tT&$FKI#4ICeX=sDguOgphRrf`r}iCX%VoK}oA`3?&{uXlW=bXM6f M`^uk_U@r!K09kNuLI3~& literal 0 HcmV?d00001 diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/res/cur00008.cur b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/res/cur00008.cur new file mode 100644 index 0000000000000000000000000000000000000000..0785b19f11f97f0211bd1e4e2158d3e6199bfdc6 GIT binary patch literal 326 zcmYk1O^U)m5QSg2E?fw4CBg{Fa+cmeujC05m;-o)IZA^Ik72+Q$ZWC@pI=1-Q_WYe zew%J7E2(Lul`8F$w3hS@lyrc^3F}7xb{Pr6Y`=r>QzNuKcjUct`c=-2G=~L^6%eML zd2~)b5&5i87d5Gc&~YtR<6*%UEa79k!5;omwyn#icG*@Q9x%ZDWZ$m#g+an+Wj|{6 b(1|hMk9XmL~W_ZJxC&i7gT(sSD4!I2*~&oxks|5tun;rX?Ixl6gj2WK~*V zhhYh$J=o&%bOU{0VB)^s-sO*^w)$|+r8nPwo&49W=}Aq{y$ou(upXHF$|^paNQZ^A TlWvZ+V_kJL&dtPI?7w;d-B)kB literal 0 HcmV?d00001 diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/res/cur00010.cur b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/res/cur00010.cur new file mode 100644 index 0000000000000000000000000000000000000000..bb8b5f0a6d2026a8353572b98ce08569aba3d0fa GIT binary patch literal 326 zcmah@OA5j;5PcJ+WFZ(3#6_W5y37sg!3r(ZgQY8%UZK$5p$O7(lC)44;tTIH!!Q{@ zfnY6QaD*e^4B#r17H&e47tlmaqQn9Nm^p=SHBv^_z`W+g(#ESFyBTw3 zb4NbA0EY~4Y4E?w4O={Qc3;L84B}A^3q?wg8k$^;G z!0ZLlgA@Js;oUpUiCl^CB&&Z|bU?n1gG|HJUcV(`Qh>blSyE X!^Uv~C%dz1Skin5IWrOpWO2AIOIw@d11#CV34AgR|QWC-tu?l?}R) z3y<0?sg|70hDCG19x3>S-#9ppTc?2<8r4u?P<_peJrT@FH8$U-4InmyE)|nE-1)cF P%=?599m@_^JfQjpiz0Q= literal 0 HcmV?d00001 diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/res/cur00013.cur b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/AntTweakBar/src/res/cur00013.cur new file mode 100644 index 0000000000000000000000000000000000000000..16356062761e23c7b2b3c6c6dd4e5f11ede2cb48 GIT binary patch literal 326 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]SJT>Wkr;OLp=_&Frf*cJIf7^8Ml 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

c4`kj?D)9v?U=fq{k6>h!ZphtFD2sFZLR+L1m7P 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

U>d?rn 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 J|8pAnzW^c=Jb(ZI literal 0 HcmV?d00001 diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/BipartiteBoxPruning.cpp b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/BipartiteBoxPruning.cpp new file mode 100644 index 00000000..87d9886b --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/BipartiteBoxPruning.cpp @@ -0,0 +1,165 @@ +/* +CDTestFramework http://codercorner.com +Copyright (c) 2007-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#include "stdafx.h" +#include "BipartiteBoxPruning.h" +#include "RenderingHelpers.h" +#include "GLFontRenderer.h" + +BipartiteBoxPruningTest::BipartiteBoxPruningTest() : + mBar (null), + mNbBoxes (0), + mBoxes (null), + mBoxPtrs (null), + mBoxTime (null), + mSpeed (0.0f), + mAmplitude (100.0f) +{ +} + +BipartiteBoxPruningTest::~BipartiteBoxPruningTest() +{ + DELETEARRAY(mBoxTime); + DELETEARRAY(mBoxPtrs); + DELETEARRAY(mBoxes); +} + +void BipartiteBoxPruningTest::Init() +{ + mNbBoxes = 1024; + mBoxes = new AABB[mNbBoxes]; + mBoxPtrs = new const AABB*[mNbBoxes]; + mBoxTime = new float[mNbBoxes]; + for(udword i=0;i buffer; +int sizes[2]; +btScalar scales[2]; +btScalar offsets[2]; +btScalar wtrs[16]; +btVector3 eye; +btVector3 neardist; +btScalar ocarea; +btScalar qrarea; +GLuint texture; + OcclusionBuffer() + { + initialized=false; + neardist=btVector3(2,2,2); + ocarea=(btScalar)0; + qrarea=(btScalar)0; + } +void setup(int w,int h) + { + initialized=true; + sizes[0]=w; + sizes[1]=h; + scales[0]=w/2; + scales[1]=h/2; + offsets[0]=scales[0]+0.5; + offsets[1]=scales[1]+0.5; + glGenTextures(1,&texture); + clear(); + } +void clear() + { + buffer.resize(0); + buffer.resize(sizes[0]*sizes[1],0); + } +void initialize() + { + if(!initialized) + { + setup(128,128); + } + GLint v[4]; + GLdouble m[16],p[16]; + glGetIntegerv(GL_VIEWPORT,v); + glGetDoublev(GL_MODELVIEW_MATRIX,m); + glGetDoublev(GL_PROJECTION_MATRIX,p); + for(int i=0;i<16;++i) wtrs[i]=p[i]; + clear(); + } +void drawBuffer( btScalar l,btScalar t, + btScalar r,btScalar b) + { + btAlignedObjectArray data; + data.resize(buffer.size()); + for(int i=0;i +static int clip(const btVector4* pi,btVector4* po) + { + btScalar s[NP]; + int m=0; + for(int i=0;i0)&&(t<1)) + { + po[n][0] = a[0]+(b[0]-a[0])*t; + po[n][1] = a[1]+(b[1]-a[1])*t; + po[n][2] = a[2]+(b[2]-a[2])*t; + po[n][3] = a[3]+(b[3]-a[3])*t; + ++n; + } + if(s[j]>0) po[n++]=b; + } + return(n); + } + for(int i=0;i +inline bool draw( const btVector4& a, + const btVector4& b, + const btVector4& c, + const btScalar minarea) + { + const btScalar a2=cross(b-a,c-a)[2]; + if(a2>0) + { + if(a20) + { + const int dx[]={ y[0]-y[1], + y[1]-y[2], + y[2]-y[0]}; + const int dy[]={ x[1]-x[0]-dx[0]*width, + x[2]-x[1]-dx[1]*width, + x[0]-x[2]-dx[2]*width}; + const int a=x[2]*y[0]+x[0]*y[1]-x[2]*y[1]-x[0]*y[2]+x[1]*y[2]-x[1]*y[0]; + const btScalar ia=1/(btScalar)a; + const btScalar dzx=ia*(y[2]*(z[1]-z[0])+y[1]*(z[0]-z[2])+y[0]*(z[2]-z[1])); + const btScalar dzy=ia*(x[2]*(z[0]-z[1])+x[0]*(z[1]-z[2])+x[1]*(z[2]-z[0]))-(dzx*width); + int c[]={ miy*x[1]+mix*y[0]-x[1]*y[0]-mix*y[1]+x[0]*y[1]-miy*x[0], + miy*x[2]+mix*y[1]-x[2]*y[1]-mix*y[2]+x[1]*y[2]-miy*x[1], + miy*x[0]+mix*y[2]-x[0]*y[2]-mix*y[0]+x[2]*y[0]-miy*x[2]}; + btScalar v=ia*((z[2]*c[0])+(z[0]*c[1])+(z[1]*c[2])); + btScalar* scan=&buffer[miy*sizes[1]]; + for(int iy=miy;iy=0)&&(c[1]>=0)&&(c[2]>=0)) + { + if(POLICY::Process(scan[ix],v)) return(true); + } + c[0]+=dx[0];c[1]+=dx[1];c[2]+=dx[2];v+=dzx; + } + c[0]+=dy[0];c[1]+=dy[1];c[2]+=dy[2];v+=dzy; + scan+=sizes[0]; + } + } + } + return(false); + } +template +inline bool clipDraw( const btVector4* p, + btScalar minarea) + { + btVector4 o[NP*2]; + const int n=clip(p,o); + bool earlyexit=false; + project(o,n); + for(int i=2;i(o[0],o[i-1],o[i],minarea); + } + return(earlyexit); + } +void appendOccluder( const btVector3& a, + const btVector3& b, + const btVector3& c) + { + const btVector4 p[]={transform(a),transform(b),transform(c)}; + clipDraw<3,WriteOCL>(p,ocarea); + } +void appendOccluder( const btVector3& a, + const btVector3& b, + const btVector3& c, + const btVector3& d) + { + const btVector4 p[]={transform(a),transform(b),transform(c),transform(d)}; + clipDraw<4,WriteOCL>(p,ocarea); + } +void appendOccluder( const btVector3& c, + const btVector3& e) + { + const btVector4 x[]={ transform(btVector3(c[0]-e[0],c[1]-e[1],c[2]-e[2])), + transform(btVector3(c[0]+e[0],c[1]-e[1],c[2]-e[2])), + transform(btVector3(c[0]+e[0],c[1]+e[1],c[2]-e[2])), + transform(btVector3(c[0]-e[0],c[1]+e[1],c[2]-e[2])), + transform(btVector3(c[0]-e[0],c[1]-e[1],c[2]+e[2])), + transform(btVector3(c[0]+e[0],c[1]-e[1],c[2]+e[2])), + transform(btVector3(c[0]+e[0],c[1]+e[1],c[2]+e[2])), + transform(btVector3(c[0]-e[0],c[1]+e[1],c[2]+e[2]))}; + static const int d[]={ 1,0,3,2, + 4,5,6,7, + 4,7,3,0, + 6,5,1,2, + 7,6,2,3, + 5,4,0,1}; + for(int i=0;i<(sizeof(d)/sizeof(d[0]));) + { + const btVector4 p[]={ x[d[i++]], + x[d[i++]], + x[d[i++]], + x[d[i++]]}; + clipDraw<4,WriteOCL>(p,ocarea); + } + } +inline bool queryOccluder( const btVector3& a, + const btVector3& b, + const btVector3& c) + { + const btVector4 p[]={transform(a),transform(b),transform(c)}; + return(clipDraw<3,QueryOCL>(p,qrarea)); + } +inline bool queryOccluder( const btVector3& a, + const btVector3& b, + const btVector3& c, + const btVector3& d) + { + const btVector4 p[]={transform(a),transform(b),transform(c),transform(d)}; + return(clipDraw<4,QueryOCL>(p,qrarea)); + } +inline bool queryOccluder( const btVector3& c, + const btVector3& e) + { + const btVector4 x[]={ transform(btVector3(c[0]-e[0],c[1]-e[1],c[2]-e[2])), + transform(btVector3(c[0]+e[0],c[1]-e[1],c[2]-e[2])), + transform(btVector3(c[0]+e[0],c[1]+e[1],c[2]-e[2])), + transform(btVector3(c[0]-e[0],c[1]+e[1],c[2]-e[2])), + transform(btVector3(c[0]-e[0],c[1]-e[1],c[2]+e[2])), + transform(btVector3(c[0]+e[0],c[1]-e[1],c[2]+e[2])), + transform(btVector3(c[0]+e[0],c[1]+e[1],c[2]+e[2])), + transform(btVector3(c[0]-e[0],c[1]+e[1],c[2]+e[2]))}; + for(int i=0;i<8;++i) + { + if((x[i][2]+x[i][3])<=0) return(true); + } + static const int d[]={ 1,0,3,2, + 4,5,6,7, + 4,7,3,0, + 6,5,1,2, + 7,6,2,3, + 5,4,0,1}; + for(int i=0;i<(sizeof(d)/sizeof(d[0]));) + { + const btVector4 p[]={ x[d[i++]], + x[d[i++]], + x[d[i++]], + x[d[i++]]}; + if(clipDraw<4,QueryOCL>(p,qrarea)) return(true); + } + return(false); + } +}; + +OcclusionBuffer ocb; + +BulletSAPCompleteBoxPruningTest::BulletSAPCompleteBoxPruningTest(int numBoxes,int method) : + mBar (null), + mNbBoxes (numBoxes), + mBoxes (null), + mBoxPtrs (null), + mBoxTime (null), + mAmplitude (100.0f), + m_method(method) +{ + btVector3 aabbMin(-200,-200,-200); + btVector3 aabbMax(200,200,200); + + int maxNumBoxes = numBoxes; + m_isdbvt=false; + bool disableRaycastAccelerator = true; + switch (method) + { + case 1: + m_broadphase = new btAxisSweep3(aabbMin,aabbMax,maxNumBoxes,0,disableRaycastAccelerator); + methodname = "btAxisSweep3"; + break; + case 2: + m_broadphase = new btAxisSweep3(aabbMin,aabbMax,maxNumBoxes,new btNullPairCache(),disableRaycastAccelerator); + methodname = "btAxisSweep3+btNullPairCache"; + break; + case 3: + m_broadphase = new btAxisSweep3(aabbMin,aabbMax,maxNumBoxes,new btSortedOverlappingPairCache(),disableRaycastAccelerator); + methodname = "btAxisSweep3+btSortedOverlappingPairCache"; + break; + case 4: + m_broadphase = new btSimpleBroadphase(maxNumBoxes,new btSortedOverlappingPairCache()); + methodname = "btSimpleBroadphase+btSortedOverlappingPairCache"; + break; + case 5: + m_broadphase = new btSimpleBroadphase(maxNumBoxes,new btNullPairCache()); + methodname = "btSimpleBroadphase+btNullPairCache"; + break; + + case 6: + { + methodname = "btMultiSapBroadphase"; + btMultiSapBroadphase* multiSap = new btMultiSapBroadphase(maxNumBoxes); + m_broadphase = multiSap; + + btVector3 tmpAabbMin,tmpAabbMax; + + float numP = (float) numParts; + + for (int i=0;igetOverlappingPairCache(),disableRaycastAccelerator); + multiSap->getBroadphaseArray().push_back(childBp); + } + } + } + + // btAxisSweep3* childBp = new btAxisSweep3(aabbMin,aabbMax,maxNumBoxes,multiSap->getOverlappingPairCache()); + // multiSap->getBroadphaseArray().push_back(childBp); + multiSap->buildTree(aabbMin,aabbMax); + + } + break; + case 7: + { + btDbvtBroadphase* pbp=new btDbvtBroadphase(); + m_broadphase = pbp; + pbp->m_deferedcollide = true; /* Faster initialization, set to false after. */ + m_isdbvt = true; + methodname = "dynamic AABB tree, btDbvtBroadphase"; + } + break; + case 8: +// m_broadphase = new btAxisSweep3(aabbMin,aabbMax,maxNumBoxes); +// m_broadphase = new btSimpleBroadphase(maxNumBoxes,new btSortedOverlappingPairCache()); +// m_broadphase = new btCudaBroadphase(aabbMin, aabbMax, 8, 8, 8, 8192, 8192, 64, 16); +// m_broadphase = new btCudaBroadphase(aabbMin, aabbMax, 12, 12, 12, 8192, 8192, 64, 16); +// m_broadphase = new btCudaBroadphase(aabbMin, aabbMax, 16, 16, 16, 8192, 8192, 64, 16); +#ifdef USE_CUDA_BROADPHASE + m_broadphase = new btCudaBroadphase(aabbMin, aabbMax, 24, 24, 24,maxNumBoxes , maxNumBoxes, 64, 16); +// m_broadphase = new btCudaBroadphase(aabbMin, aabbMax, 32, 32, 32, 8192, 8192, 64, 16); + methodname = "btCudaBroadphase"; + break; + + case 9: + m_broadphase = new bt3DGridBroadphase(aabbMin, aabbMax, 24, 24, 24,maxNumBoxes , maxNumBoxes, 64, 16); + methodname = "bt3DGridBroadphase"; + break; +#endif //USE_CUDA_BROADPHASE + + default: + { + m_broadphase = new btAxisSweep3(aabbMin,aabbMax,numBoxes,new btNullPairCache()); + methodname = "btAxisSweep3+btNullPairCache"; + } + } +} + +BulletSAPCompleteBoxPruningTest::~BulletSAPCompleteBoxPruningTest() +{ + DELETEARRAY(mBoxTime); + DELETEARRAY(mBoxPtrs); + DELETEARRAY(mBoxes); + delete m_broadphase; +} + +void BulletSAPCompleteBoxPruningTest::Init() +{ + btClock clock; + m_firstTime = true; + SRand(0); + + + mBoxes = new AABB[mNbBoxes]; + mFlags = new bool[mNbBoxes]; + mBoxPtrs = new const AABB*[mNbBoxes]; + mBoxTime = new float[mNbBoxes]; + for(udword i=0;icreateProxy(aabbMin,aabbMax,shapeType,&mBoxes[i],1,1,0,0);//m_dispatcher); + m_proxies.push_back( proxy ); + + mBoxTime[i] = 2000.0f*UnitRandomFloat(); + } + printf("Initialization of %s with %u boxes: %ums\r\n",methodname,mNbBoxes,clock.getTimeMilliseconds()); +} + +void BulletSAPCompleteBoxPruningTest::Release() +{ + DELETEARRAY(mBoxTime); + DELETEARRAY(mBoxes); +} + +extern int doTree; +extern int percentUpdate; +extern float objectSpeed; +extern bool enableDraw; + +static void TW_CALL NormalMode(void* pdata) +{ +btDbvtBroadphase* pb=(btDbvtBroadphase*)pdata; +pb->m_deferedcollide = true; +} + +static void TW_CALL SlowSpeedMode(void* pdata) +{ +btDbvtBroadphase* pb=(btDbvtBroadphase*)pdata; +pb->m_deferedcollide = false; +} + +void BulletSAPCompleteBoxPruningTest::Select() +{ + // Create a tweak bar + { + mBar = TwNewBar("OPC_CompleteBoxPruning"); + TwAddVarRW(mBar, "Speed", TW_TYPE_FLOAT, &objectSpeed, " min=0.0 max=0.01 step=0.0001"); + TwAddVarRW(mBar, "Amplitude", TW_TYPE_FLOAT, &mAmplitude, " min=10.0 max=200.0 step=0.1"); + if(m_isdbvt) + { + btDbvtBroadphase* pbp=(btDbvtBroadphase*)m_broadphase; + TwAddVarRW(mBar, "Enable culling",TW_TYPE_BOOLCPP,&enableCulling,""); + TwAddVarRW(mBar, "Enable occlusion",TW_TYPE_BOOLCPP,&enableOcclusion,""); + TwAddVarRW(mBar, "Show culling",TW_TYPE_BOOLCPP,&showCulling,""); + TwAddVarRW(mBar, "Show occlusion",TW_TYPE_BOOLCPP,&showOcclusion,""); + TwAddVarRW(mBar, "Cull far plane",TW_TYPE_BOOLCPP,&cullFarPlane,""); + TwAddVarRW(mBar, "OC Min area",TW_TYPE_FLOAT,&ocb.ocarea,"min=0.0 max=1.0 step=0.001"); + TwAddVarRW(mBar, "QR Min area",TW_TYPE_FLOAT,&ocb.qrarea,"min=0.0 max=1.0 step=0.001"); + TwAddVarRW(mBar, "Dyn lkhd",TW_TYPE_INT32,&pbp->m_sets[0].m_lkhd,"min=-1 max=32"); + TwAddVarRW(mBar, "Fix lkhd",TW_TYPE_INT32,&pbp->m_sets[1].m_lkhd,"min=-1 max=32"); + TwAddVarRW(mBar, "Dyn opt/f(%)",TW_TYPE_INT32,&pbp->m_dupdates,"min=0 max=100"); + TwAddVarRW(mBar, "Fix opt/f(%)",TW_TYPE_INT32,&pbp->m_fupdates,"min=0 max=100"); + TwAddVarRW(mBar, "Cln opt/f(%)",TW_TYPE_INT32,&pbp->m_cupdates,"min=0 max=100"); + TwAddVarRW(mBar, "Prediction",TW_TYPE_FLOAT,&pbp->m_prediction,"min=0.0 max=2.0 step=0.1"); + TwAddVarRW(mBar, "Defered collide",TW_TYPE_BOOLCPP,&pbp->m_deferedcollide,""); + TwAddVarRO(mBar, "Dyn leafs",TW_TYPE_INT32,&pbp->m_sets[0].m_leaves,""); + TwAddVarRO(mBar, "Fix leafs",TW_TYPE_INT32,&pbp->m_sets[1].m_leaves,""); + TwAddVarRO(mBar, "Updates ratio",TW_TYPE_FLOAT,&pbp->m_updates_ratio,""); + TwAddVarRO(mBar, "Visible",TW_TYPE_INT32,&visiblecount,""); + TwAddButton(mBar,"Normal mode",&NormalMode,m_broadphase,""); + TwAddButton(mBar,"Slow speed mode",&SlowSpeedMode,m_broadphase,""); + } + } + printf("SubMethod: %s\r\n",methodname); +} + +void BulletSAPCompleteBoxPruningTest::Deselect() +{ + if(mBar) + { + TwDeleteBar(mBar); + mBar = null; + } +} + +bool BulletSAPCompleteBoxPruningTest::UpdateBoxes(int numBoxes) +{ + static bool once=true; + + for(udword i=0;i<(udword)numBoxes;i++) + { + mBoxTime[i] += objectSpeed; + + Point Center,Extents; + mBoxes[i].GetExtents(Extents); + + Center.x = cosf(mBoxTime[i]*2.17f)*mAmplitude + sinf(mBoxTime[i])*mAmplitude*0.5f; + Center.y = cosf(mBoxTime[i]*1.38f)*mAmplitude + sinf(mBoxTime[i]*mAmplitude); + Center.z = sinf(mBoxTime[i]*0.777f)*mAmplitude; + + mBoxes[i].SetCenterExtents(Center, Extents); + } + return true; +} + +void BulletSAPCompleteBoxPruningTest::PerformTest() +{ + int numUpdatedBoxes = (mNbBoxes*percentUpdate)/100; + if (m_firstTime) + { + numUpdatedBoxes = mNbBoxes; + } + mProfiler.Start(); + UpdateBoxes(numUpdatedBoxes); + + + mPairs.ResetPairs(); + + //CompleteBoxPruning(mNbBoxes, mBoxPtrs, mPairs, Axes(AXES_XZY)); + ///add batch query? + + + for (int i=0;iGetCenter(Center); + mBoxPtrs[i]->GetExtents(Extents); + btVector3 aabbMin(Center.x-Extents.x,Center.y-Extents.y,Center.z-Extents.z); + btVector3 aabbMax(Center.x+Extents.x,Center.y+Extents.y,Center.z+Extents.z); + m_broadphase->setAabb(m_proxies[i],aabbMin,aabbMax,0);//m_dispatcher); + } + +#ifndef BT_NO_PROFILE + if(sBulletProfilerToggle) + { + CProfileManager::Reset(); + } +#endif //BT_NO_PROFILE + + m_broadphase->calculateOverlappingPairs(0); + +#ifndef BT_NO_PROFILE + if(sBulletProfilerToggle) + { + CProfileManager::Increment_Frame_Counter(); + CProfileManager::dumpAll(); + } +#endif //BT_NO_PROFILE + + + mProfiler.End(); + mProfiler.Accum(); + + if (m_firstTime) + { + //initialization messes up timings + m_firstTime = false; + if(m_isdbvt) + { + ((btDbvtBroadphase*)m_broadphase)->m_deferedcollide=false; + } + mProfiler.Reset(); + } + + #if 0 + { + int missedpairs=0; + for(int i=0;iaabb,pb->aabb)) + { + btDbvtProxy* spa=pa; + btDbvtProxy* spb=pb; + if(spa>spb) btSwap(spa,spb); + if(!m_broadphase->getOverlappingPairCache()->findPair(spa,spb)) + { + ++missedpairs; + printf("Cannot find %i,%i\r\n",i,j); + } + } + } + } + if(missedpairs>0) printf("Missed pairs: %u\r\n",missedpairs); + } + #endif + +// printf("%d pairs colliding\r ", mPairs.GetNbPairs()); + + ZeroMemory(mFlags,sizeof(bool)*mNbBoxes); + + btOverlappingPairCache* pairCache = m_broadphase->getOverlappingPairCache(); + const btBroadphasePair* pairPtr = pairCache->getOverlappingPairArrayPtr(); + + for(udword i=0;i<(udword)pairCache->getNumOverlappingPairs();i++) + { +// Flags[pairPtr[i].m_pProxy0->getUid()-1] = true; +// Flags[pairPtr[i].m_pProxy1->getUid()-1] = true; + int j; + j=((AABB*)pairPtr[i].m_pProxy0->m_clientObject)-mBoxes; + mFlags[j] = true; + j=((AABB*)pairPtr[i].m_pProxy1->m_clientObject)-mBoxes; + mFlags[j] = true; + } + + if(enableDraw) + { + btVector3 aabbMin(-200,-200,-200); + btVector3 aabbMax(200,200,200); + + btVector3 tmpAabbMin,tmpAabbMax; + glDisable(GL_DEPTH_TEST); + + + float numP = (float) numParts; + + for (int i=0;igetOverlappingPairCache()->getNumOverlappingPairs()); + +// m_broadphase)->printStats(); + + GLFontRenderer::print(10.0f, 10.0f, 0.02f, Buffer); +} + +// +static void DrawVolume(const btDbvtVolume& volume,const btVector3& color) +{ +const btVector3 mins=volume.Mins(); +const btVector3 maxs=volume.Maxs(); +glColor3f(color.x(),color.y(),color.z()); +glVertex3f(mins.x(),mins.y(),mins.z()); +glVertex3f(maxs.x(),mins.y(),mins.z()); + +glVertex3f(maxs.x(),mins.y(),mins.z()); +glVertex3f(maxs.x(),maxs.y(),mins.z()); + +glVertex3f(maxs.x(),maxs.y(),mins.z()); +glVertex3f(mins.x(),maxs.y(),mins.z()); + +glVertex3f(mins.x(),maxs.y(),mins.z()); +glVertex3f(mins.x(),mins.y(),mins.z()); + +glVertex3f(mins.x(),mins.y(),maxs.z()); +glVertex3f(maxs.x(),mins.y(),maxs.z()); + +glVertex3f(maxs.x(),mins.y(),maxs.z()); +glVertex3f(maxs.x(),maxs.y(),maxs.z()); + +glVertex3f(maxs.x(),maxs.y(),maxs.z()); +glVertex3f(mins.x(),maxs.y(),maxs.z()); + +glVertex3f(mins.x(),maxs.y(),maxs.z()); +glVertex3f(mins.x(),mins.y(),maxs.z()); + +glVertex3f(mins.x(),mins.y(),mins.z()); +glVertex3f(mins.x(),mins.y(),maxs.z()); + +glVertex3f(maxs.x(),mins.y(),mins.z()); +glVertex3f(maxs.x(),mins.y(),maxs.z()); + +glVertex3f(maxs.x(),maxs.y(),mins.z()); +glVertex3f(maxs.x(),maxs.y(),maxs.z()); + +glVertex3f(mins.x(),maxs.y(),mins.z()); +glVertex3f(mins.x(),maxs.y(),maxs.z()); +} + +// +void BulletSAPCompleteBoxPruningTest::RenderAll() +{ +OBB CurrentBox; +CurrentBox.mRot.Identity(); +for(udword i=0;iqueryOccluder(node->volume.Center(),node->volume.Extents())); + } + void Process(const btDbvtNode* node,btScalar depth) + { + Process(node); + } + void Process(const btDbvtNode* leaf) + { + btBroadphaseProxy* proxy=(btBroadphaseProxy*)leaf->data; + int i=((AABB*)proxy->m_clientObject)-self->mBoxes; + if(self->mFlags[i]) glColor3f(1.0f, 0.0f, 0.0f); + else glColor3f(0.0f, 1.0f, 0.0f); + self->mBoxes[i].GetCenter(box.mCenter); + self->mBoxes[i].GetExtents(box.mExtents); + DrawOBB(box);drawn++; + if(ocb) + { + ocb->appendOccluder(btVector3(box.mCenter.x,box.mCenter.y,box.mCenter.z), + btVector3(box.mExtents.x,box.mExtents.y,box.mExtents.z)); + } + } + } srenderer; + srenderer.self=this; + srenderer.ocb=0; + if(enableOcclusion) + { + srenderer.ocb=&ocb; + btDbvt::collideOCL(pbp->m_sets[1].m_root,planes_n,planes_o,dir,acplanes,srenderer); + btDbvt::collideOCL(pbp->m_sets[0].m_root,planes_n,planes_o,dir,acplanes,srenderer); + } + else + { + btDbvt::collideKDOP(pbp->m_sets[1].m_root,planes_n,planes_o,acplanes,srenderer); + btDbvt::collideKDOP(pbp->m_sets[0].m_root,planes_n,planes_o,acplanes,srenderer); + } + visiblecount=srenderer.drawn; + if(showOcclusion&&enableOcclusion) + { + const btScalar ratio=((float)glutGet(GLUT_WINDOW_HEIGHT))/((float)glutGet(GLUT_WINDOW_WIDTH)); + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glOrtho(-1,1,-1,1,-1,1); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + const float mm[]={ 1,0,0,0, + 0,1,0,0, + 0,0,0,1, + 0,0,0,1}; + glMultMatrixf(mm); + glDisable(GL_DEPTH_TEST); + glDisable(GL_LIGHTING); + const float size=0.6f; + const float orgx=0.3f; + const float orgy=0.25f; + const float left=orgx; + const float right=orgx+size; + const float top=orgy+size; + const float bottom=orgy; + ocb.drawBuffer(left,bottom,right,top); + } + if(showCulling) + { + const btScalar ratio=((float)glutGet(GLUT_WINDOW_HEIGHT))/((float)glutGet(GLUT_WINDOW_WIDTH)); + static const float scale=0.004; + + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + glOrtho(-1,1,-1*ratio,1*ratio,-1,1); + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + const float mm[]={ 1,0,0,0, + 0,0,1,0, + 0,1,0,0, + 0,0,0,1}; + glMultMatrixf(mm); + glScalef(scale,scale,scale); + + glDisable(GL_DEPTH_TEST); + glDisable(GL_LIGHTING); + + glBegin(GL_LINES); + glColor4f(1,1,1,1); + + struct DebugRenderer : btDbvt::ICollide + { + OcclusionBuffer* ocb; + int sid; + bool AllLeafs(const btDbvtNode* node) + { + Process(node); + return(false); + } + bool Descent(const btDbvtNode* node) + { + return(ocb->queryOccluder(node->volume.Center(),node->volume.Extents())); + } + void Process(const btDbvtNode* node,btScalar depth) + { + Process(node); + } + void Process(const btDbvtNode* node) + { + if(ocb) + { + ocb->appendOccluder(node->volume.Center(),node->volume.Extents()); + } + if(sid>=0) + { + const float f=sid/1023.; + DrawVolume(node->volume,btVector3(1,f,f)); + sid=(sid+1)%1024; + } + else + { + if(node->isinternal()) + DrawVolume(node->volume,btVector3(0,1,0)); + else + DrawVolume(node->volume,btVector3(1,0,1)); + } + } + } drenderer; + if(enableOcclusion) + { + drenderer.ocb=&ocb; + drenderer.sid=0; + ocb.clear(); + btDbvt::collideOCL(pbp->m_sets[1].m_root,planes_n,planes_o,dir,acplanes,drenderer); + btDbvt::collideOCL(pbp->m_sets[0].m_root,planes_n,planes_o,dir,acplanes,drenderer); + } + else + { + drenderer.ocb=0; + drenderer.sid=-1; + btDbvt::collideKDOP(pbp->m_sets[1].m_root,planes_n,planes_o,acplanes,drenderer); + btDbvt::collideKDOP(pbp->m_sets[0].m_root,planes_n,planes_o,acplanes,drenderer); + } + glEnd(); + + glBegin(GL_LINES); + glColor4f(1,1,1,1); + glVertex3f(eye.x(),eye.y(),eye.z()); + glVertex3f(x00.x(),x00.y(),x00.z()); + glVertex3f(eye.x(),eye.y(),eye.z()); + glVertex3f(x10.x(),x10.y(),x10.z()); + glVertex3f(eye.x(),eye.y(),eye.z()); + glVertex3f(x01.x(),x01.y(),x01.z()); + glVertex3f(eye.x(),eye.y(),eye.z()); + glVertex3f(x11.x(),x11.y(),x11.z()); + + glVertex3f(x00.x(),x00.y(),x00.z()); + glVertex3f(x10.x(),x10.y(),x10.z()); + + glVertex3f(x10.x(),x10.y(),x10.z()); + glVertex3f(x11.x(),x11.y(),x11.z()); + + glVertex3f(x11.x(),x11.y(),x11.z()); + glVertex3f(x01.x(),x01.y(),x01.z()); + + glVertex3f(x01.x(),x01.y(),x01.z()); + glVertex3f(x00.x(),x00.y(),x00.z()); + glEnd(); + } + } +} + +void BulletSAPCompleteBoxPruningTest::KeyboardCallback(unsigned char key, int x, int y) +{ + switch (key) + { + case 'p': + case 'P': + sBulletProfilerToggle = !sBulletProfilerToggle; + break; + default : break; + } +} + +void BulletSAPCompleteBoxPruningTest::MouseCallback(int button, int state, int x, int y) +{ +} + +void BulletSAPCompleteBoxPruningTest::MotionCallback(int x, int y) +{ +} diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/BulletSAPCompleteBoxPruningTest.h b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/BulletSAPCompleteBoxPruningTest.h new file mode 100644 index 00000000..e944d19c --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/BulletSAPCompleteBoxPruningTest.h @@ -0,0 +1,65 @@ +/* +BulletSAPCompleteBoxPruningTest, Copyright (c) 2008 Erwin Coumans +Part of: +CDTestFramework http://codercorner.com +Copyright (c) 2007-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef BULLET_SAP_COMPLETEBOXPRUNING_H +#define BULLET_SAP_COMPLETEBOXPRUNING_H + +#include "LinearMath/btAlignedObjectArray.h" + +#include "CollisionTest.h" +#include "Profiling.h" + + class BulletSAPCompleteBoxPruningTest : public CollisionTest + { + public: + BulletSAPCompleteBoxPruningTest(int numBoxes,int method); + virtual ~BulletSAPCompleteBoxPruningTest(); + + virtual void Init(); + virtual void Release(); + virtual void PerformTest(); + void RenderAll(); + void Render(); + virtual void Select(); + virtual void Deselect(); + virtual void KeyboardCallback(unsigned char key, int x, int y); + virtual void MouseCallback(int button, int state, int x, int y); + virtual void MotionCallback(int x, int y); + + TwBar* mBar; //!< AntTweakBar + Profiler mProfiler; + + class btBroadphaseInterface* m_broadphase; + bool m_isdbvt; + btAlignedObjectArray m_proxies; + + udword mNbBoxes; + AABB* mBoxes; + bool* mFlags; + const char* methodname; + const AABB** mBoxPtrs; + Pairs mPairs; + float* mBoxTime; + float mAmplitude; + bool m_firstTime; + int m_method; + + private: + bool UpdateBoxes(int numBoxes); + }; + +#endif // BULLET_SAP_COMPLETEBOXPRUNING_H diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/CDTestFramework.cpp b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/CDTestFramework.cpp new file mode 100644 index 00000000..6ac43091 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/CDTestFramework.cpp @@ -0,0 +1,444 @@ +/* +CDTestFramework http://codercorner.com +Copyright (c) 2007-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#include "stdafx.h" + +#include "CollisionTest.h" +#include "SphereMeshQuery.h" +#include "OBBMeshQuery.h" +#include "CapsuleMeshQuery.h" +#include "CompleteBoxPruning.h" +#include "BulletSAPCompleteBoxPruningTest.h" +#include "BulletSAPCompleteBoxPruningTest.h" +#include "BipartiteBoxPruning.h" +#include "OpcodeArraySAPTest.h" +#include "RenderingHelpers.h" +#include "Terrain.h" +#include "Camera.h" +#include "GLFontRenderer.h" +#include "BulletCollision/BroadphaseCollision/btDbvtBroadphase.h" +#include "LinearMath/btQuickprof.h" + +#define NUM_SAP_BOXES 8192 +//#define NUM_SAP_BOXES 16384 +//#define NUM_SAP_BOXES 1024 + +int percentUpdate = 100; +//float objectSpeed = 0.005f; +float objectSpeed = 0.01f; +bool enableDraw = true; + +//Broadphase comparison +//Static case (updating 10% of objects to same position ( -> no swaps) +//number of objects //OPCODE BoxPruning / Bullet SAP / Bullet MultiSAP +//1024 0.35ms, 0.03ms, 0.15ms +//8192 21ms, 0.2ms, 5ms +//16384 92ms , 0.5ms, 28ms + +//Dynamic case, 10% objects are moving as fast as this testbed allows (0.01?) +//number of objects //OPCODE BoxPruning / Bullet SAP / Bullet MultiSAP +//1024 0.35ms, 0.2ms, 0.25ms +//8192 21ms , 15ms , 13ms +//16384 92ms, 80ms, 49ms + + +#define WINDOW_WIDTH 1024 +#define WINDOW_HEIGHT 768 + +static int gMouseX = 0; +static int gMouseY = 0; +static int gButton = 0; + +static TwBar* gMainBar = null; +enum TestIndex +{ +// TEST_SPHERE_MESH_QUERY, +// TEST_OBB_MESH_QUERY, +// TEST_CAPSULE_MESH_QUERY, +// TEST_COMPLETE_BOX_PRUNING=0, + TEST_COMPLETE_BOX_PRUNING_8192, +// TEST_BULLET_SAP_1024, +// TEST_BULLET_SAP_8192, +// TEST_BULLET_SAP_SORTEDPAIRS_8192, +// TEST_BULLET_MULTISAP_8192, +// TEST_BIPARTITE_BOX_PRUNING, + TEST_DBVT_8192, + TEST_BULLET_CUDA_8192, + TEST_BULLET_3DGRID_8192, + TEST_OPCODE_ARRAY_SAP, + MAX_NB_TESTS +}; + +//static int gTest = TEST_DBVT_8192;//TEST_BULLET_MULTISAP_8192; +//static int gSelectedTest = TEST_DBVT_8192;//TEST_BULLET_MULTISAP_8192; +static int gTest = TEST_BULLET_CUDA_8192; +static int gSelectedTest = TEST_BULLET_CUDA_8192; +static CollisionTest* gCollisionTests[MAX_NB_TESTS]; + +static GLFontRenderer gFnt; + +///////////////// + +static void KeyboardCallback(unsigned char key, int x, int y) +{ + switch (key) + { + case 27: exit(0); break; + + case '+': + { + if(gTest!=MAX_NB_TESTS-1) + { + gCollisionTests[gTest]->Deselect(); + gTest++; + gSelectedTest++; + gCollisionTests[gTest]->Select(); + } + } + break; + + case '-': + { + if(gTest) + { + gCollisionTests[gTest]->Deselect(); + gTest--; + gSelectedTest--; + gCollisionTests[gTest]->Select(); + } + } + break; + + case 101: MoveCameraForward(); break; + case 103: MoveCameraBackward(); break; + case 100: MoveCameraRight(); break; + case 102: MoveCameraLeft(); break; + default: gCollisionTests[gTest]->KeyboardCallback(key, x, y); break; + } + + TwEventKeyboardGLUT(key, x, y); +} + +static void ArrowKeyCallback(int key, int x, int y) +{ + KeyboardCallback(key, x, y); + + TwEventSpecialGLUT(key, x, y); +} + +static void MouseCallback(int button, int state, int x, int y) +{ + gButton = button; + gMouseX = x; + gMouseY = y; + + if(!TwEventMouseButtonGLUT(button, state, x, y)) + { + gCollisionTests[gTest]->MouseCallback(button, state, x, y); + } +} + +static void MotionCallback(int x, int y) +{ + if(!TwEventMouseMotionGLUT(x, y)) + { + if(gButton==2) + { + int dx = gMouseX - x; + int dy = gMouseY - y; + + RotateCamera(dx, dy); + + gMouseX = x; + gMouseY = y; + } + else + gCollisionTests[gTest]->MotionCallback(x, y); + } +} + +static void RenderCallback() +{ + // Clear buffers + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + // Setup camera + glMatrixMode(GL_PROJECTION); + SetupCameraMatrix(); + + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + + glEnable(GL_LIGHTING); + + if(0 /*gRenderWireframe*/) + glPolygonMode(GL_FRONT_AND_BACK, GL_LINE); + else + glPolygonMode(GL_FRONT_AND_BACK, GL_FILL); + + gCollisionTests[gTest]->PerformTest(); + + // Draw tweak bars + TwDraw(); + + glutSwapBuffers(); + glutPostRedisplay(); + + if(gSelectedTest!=gTest) + { + gCollisionTests[gTest]->Deselect(); + gTest = gSelectedTest; + gCollisionTests[gTest]->Select(); + } +} + +static void ReshapeCallback(int width, int height) +{ + glViewport(0, 0, width, height); + + // Send the new window size to AntTweakBar + TwWindowSize(width, height); +} + +static void IdleCallback() +{ + glutPostRedisplay(); +} + +static void Terminate() +{ + ReleaseTerrain(); + + for(int i=0;iRelease(); + DELETESINGLE(gCollisionTests[i]); + } + + if(gMainBar) + { + TwDeleteBar(gMainBar); + gMainBar = null; + } + + TwTerminate(); +} + +int main(int argc, char** argv) +{ + { + ::SetPriorityClass(::GetCurrentProcess(),REALTIME_PRIORITY_CLASS); + /*btDbvt::benchmark(); + exit(0);*/ + } + // Initialize AntTweakBar + // (note that AntTweakBar could also be intialize after GLUT, no matter) + if(!TwInit(TW_OPENGL, NULL)) + { + // A fatal error occured + fprintf(stderr, "AntTweakBar initialization failed: %s\n", TwGetLastError()); + } + + // Initialize Glut + glutInit(&argc, argv); + glutInitWindowSize(WINDOW_WIDTH, WINDOW_HEIGHT); + glutInitDisplayMode(GLUT_RGB | GLUT_DOUBLE | GLUT_DEPTH); + int mainHandle = glutCreateWindow("CD Test Framework"); + +/* HWND hWnd; + hWnd = FindWindow("GLUT", "CD Test Framework"); + RECT Rect; + GetWindowRect(hWnd, &Rect); +*/ + glutCreateMenu(NULL); + glutSetWindow(mainHandle); + glutDisplayFunc(RenderCallback); + glutReshapeFunc(ReshapeCallback); + glutIdleFunc(IdleCallback); + glutKeyboardFunc(KeyboardCallback); + glutSpecialFunc(ArrowKeyCallback); + glutMouseFunc(MouseCallback); + glutMotionFunc(MotionCallback); + atexit(Terminate); // Called after glutMainLoop ends + + glutPassiveMotionFunc((GLUTmousemotionfun)TwEventMouseMotionGLUT); + TwGLUTModifiersFunc(glutGetModifiers); + + // Setup default render states + glClearColor(0.3f, 0.4f, 0.5f, 1.0); + glEnable(GL_DEPTH_TEST); + glEnable(GL_COLOR_MATERIAL); + glEnable(GL_CULL_FACE); + glDepthFunc(GL_LEQUAL); + + // Setup lighting + glEnable(GL_LIGHTING); + float AmbientColor[] = { 0.0f, 0.1f, 0.2f, 0.0f }; glLightfv(GL_LIGHT0, GL_AMBIENT, AmbientColor); + float DiffuseColor[] = { 1.0f, 1.0f, 1.0f, 0.0f }; glLightfv(GL_LIGHT0, GL_DIFFUSE, DiffuseColor); + float SpecularColor[] = { 0.0f, 0.0f, 0.0f, 0.0f }; glLightfv(GL_LIGHT0, GL_SPECULAR, SpecularColor); + float Position[] = { -10.0f, 1000.0f, -4.0f, 1.0f }; glLightfv(GL_LIGHT0, GL_POSITION, Position); + glEnable(GL_LIGHT0); + + gFnt.init(); + gFnt.setScreenResolution(WINDOW_WIDTH, WINDOW_HEIGHT); + gFnt.setColor(1.0f, 1.0f, 1.0f, 1.0f); + + CreateTerrain(); + + // Create main tweak bar + { + gMainBar = TwNewBar("CollisionTests"); + TwEnumVal testEV[MAX_NB_TESTS] = { +// {TEST_SPHERE_MESH_QUERY, "Sphere-mesh query"}, +// {TEST_OBB_MESH_QUERY, "OBB-mesh query"}, +// {TEST_CAPSULE_MESH_QUERY, "Capsule-mesh query"}, +// {TEST_COMPLETE_BOX_PRUNING, "OPCODE SAP 1024"}, + {TEST_COMPLETE_BOX_PRUNING_8192, "OPCODE BOX PRUNING 8192"}, +// {TEST_BULLET_SAP_1024, "Bullet SAP HASHPAIR 1024"}, +// {TEST_BULLET_SAP_8192, "Bullet SAP HASHPAIR 8192"}, +// {TEST_BULLET_SAP_SORTEDPAIRS_8192, "Bullet SAP SORTEDPAIR 8192"}, +// {TEST_BULLET_MULTISAP_8192, "Bullet MultiSAP 8192"}, +// {TEST_BIPARTITE_BOX_PRUNING, "Bipartite box pruning"}, + {TEST_DBVT_8192, "Bullet DBVT 8192"}, + {TEST_BULLET_CUDA_8192, "Bullet CUDA 8192"}, + {TEST_BULLET_3DGRID_8192, "Bullet 3D Grid 8192"}, + {TEST_OPCODE_ARRAY_SAP, "OPCODE ARRAY SAP"}, + }; + TwType testType = TwDefineEnum("CollisionTest", testEV, MAX_NB_TESTS); + TwAddVarRW(gMainBar, "CollisionTests", testType, &gSelectedTest, ""); + TwAddVarRW(gMainBar, "% of updates",TW_TYPE_INT32,&percentUpdate,"min=0 max=100"); + TwAddVarRW(gMainBar, "Draw",TW_TYPE_BOOLCPP,&enableDraw,""); + } + + // Create tests + gTest = 0; +// gCollisionTests[TEST_SPHERE_MESH_QUERY] = new SphereMeshQuery; +// gCollisionTests[TEST_OBB_MESH_QUERY] = new OBBMeshQuery; +// gCollisionTests[TEST_CAPSULE_MESH_QUERY] = new CapsuleMeshQuery; +// gCollisionTests[TEST_COMPLETE_BOX_PRUNING] = new CompleteBoxPruningTest(NUM_SAP_BOXES); + // gCollisionTests[TEST_COMPLETE_BOX_PRUNING_8192] = new CompleteBoxPruningTest(NUM_SAP_BOXES); + gCollisionTests[TEST_COMPLETE_BOX_PRUNING_8192] = new CompleteBoxPruningTest(NUM_SAP_BOXES); +// gCollisionTests[TEST_BULLET_SAP_1024] = new BulletSAPCompleteBoxPruningTest(NUM_SAP_BOXES,1); +// gCollisionTests[TEST_BULLET_SAP_8192] = new BulletSAPCompleteBoxPruningTest(NUM_SAP_BOXES,1); +// gCollisionTests[TEST_BULLET_SAP_SORTEDPAIRS_8192] = new BulletSAPCompleteBoxPruningTest(NUM_SAP_BOXES,3); +// gCollisionTests[TEST_BULLET_MULTISAP_8192] = new BulletSAPCompleteBoxPruningTest(NUM_SAP_BOXES,6); +// gCollisionTests[TEST_BIPARTITE_BOX_PRUNING] = new BipartiteBoxPruningTest; + gCollisionTests[TEST_DBVT_8192] = new BulletSAPCompleteBoxPruningTest(NUM_SAP_BOXES,7); + gCollisionTests[TEST_BULLET_CUDA_8192] = new BulletSAPCompleteBoxPruningTest(NUM_SAP_BOXES,8); + gCollisionTests[TEST_BULLET_3DGRID_8192] = new BulletSAPCompleteBoxPruningTest(NUM_SAP_BOXES,9); + gCollisionTests[TEST_OPCODE_ARRAY_SAP] = new OpcodeArraySAPTest(NUM_SAP_BOXES); + + for(int i=0;iInit(); + gCollisionTests[gTest]->Select(); + + // + MotionCallback(0,0); + + // Run + glutMainLoop(); + + return 0; +} + + +#ifdef OLDIES + +#include "btBulletCollisionCommon.h" + +class BulletMeshInterface : public btStridingMeshInterface +{ + public: + /// get read and write access to a subpart of a triangle mesh + /// this subpart has a continuous array of vertices and indices + /// in this way the mesh can be handled as chunks of memory with striding + /// very similar to OpenGL vertexarray support + /// make a call to unLockVertexBase when the read and write access is finished + virtual void getLockedVertexIndexBase(unsigned char **vertexbase, int& numverts,PHY_ScalarType& type, int& stride,unsigned char **indexbase,int & indexstride,int& numfaces,PHY_ScalarType& indicestype,int subpart=0) + { + numverts = gTerrainData->nbVerts; + (*vertexbase) = (unsigned char *)gTerrainData->verts; + type = PHY_FLOAT; + stride = sizeof(Point); + + numfaces = gTerrainData->nbFaces; + (*indexbase) = (unsigned char *)gTerrainData->faces; + indicestype = PHY_INTEGER; + indexstride = 3*sizeof(udword); // ?? + } + + virtual void getLockedReadOnlyVertexIndexBase(const unsigned char **vertexbase, int& numverts,PHY_ScalarType& type, int& stride,const unsigned char **indexbase,int & indexstride,int& numfaces,PHY_ScalarType& indicestype,int subpart=0) const + { + numverts = gTerrainData->nbVerts; + (*vertexbase) = (unsigned char *)gTerrainData->verts; + type = PHY_FLOAT; + stride = sizeof(Point); + + numfaces = gTerrainData->nbFaces; + (*indexbase) = (unsigned char *)gTerrainData->faces; + indicestype = PHY_INTEGER; + indexstride = 3*sizeof(udword); // ?? + } + + /// unLockVertexBase finishes the access to a subpart of the triangle mesh + /// make a call to unLockVertexBase when the read and write access (using getLockedVertexIndexBase) is finished + virtual void unLockVertexBase(int subpart) + { + } + + virtual void unLockReadOnlyVertexBase(int subpart) const + { + } + + + /// getNumSubParts returns the number of seperate subparts + /// each subpart has a continuous array of vertices and indices + virtual int getNumSubParts() const + { + return 1; + } + + virtual void preallocateVertices(int numverts) + { + } + virtual void preallocateIndices(int numindices) + { + } +}; + +void BuildBulletTree() +{ +/* BulletMeshInterface btMeshInterface; + + btOptimizedBvh* btTree = new btOptimizedBvh; + btTree->build(&btMeshInterface, true); + + + struct MyNodeOverlapCallback : public btNodeOverlapCallback + { + virtual void processNode(int nodeSubPart, int nodeTriangleIndex) + { + } + }; + + MyNodeOverlapCallback myNodeCallback(callback,m_meshInterface); + + m_bvh->reportAabbOverlappingNodex(&myNodeCallback,aabbMin,aabbMax); +*/ + + +} + +#endif \ No newline at end of file diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/CDTestFramework.h b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/CDTestFramework.h new file mode 100644 index 00000000..b803cb38 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/CDTestFramework.h @@ -0,0 +1,20 @@ +/* +CDTestFramework http://codercorner.com +Copyright (c) 2007-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + + +#ifndef CDTESTFRAMEWORK_H +#define CDTESTFRAMEWORK_H + +#endif // CDTESTFRAMEWORK_H diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/CDTestFramework.sln b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/CDTestFramework.sln new file mode 100644 index 00000000..7f094335 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/CDTestFramework.sln @@ -0,0 +1,78 @@ +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "CDTestFramework", "CDTestFramework.vcproj", "{0565DB39-45CC-416E-B549-BFC24F2666D1}" + ProjectSection(ProjectDependencies) = postProject + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} = {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} + {DBE44CA3-2912-4441-8D99-AA2242688AD2} = {DBE44CA3-2912-4441-8D99-AA2242688AD2} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Opcode", "Opcode\Opcode.vcproj", "{DBE44CA3-2912-4441-8D99-AA2242688AD2}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libbulletmath", "..\..\msvc\8\libbulletmath.vcproj", "{7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libbulletcollision", "..\..\msvc\8\libbulletcollision.vcproj", "{6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + DebugDll|Win32 = DebugDll|Win32 + DebugDoublePrecision|Win32 = DebugDoublePrecision|Win32 + Release|Win32 = Release|Win32 + ReleaseDll|Win32 = ReleaseDll|Win32 + ReleaseDoublePrecision|Win32 = ReleaseDoublePrecision|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {0565DB39-45CC-416E-B549-BFC24F2666D1}.Debug|Win32.ActiveCfg = Debug|Win32 + {0565DB39-45CC-416E-B549-BFC24F2666D1}.Debug|Win32.Build.0 = Debug|Win32 + {0565DB39-45CC-416E-B549-BFC24F2666D1}.DebugDll|Win32.ActiveCfg = Debug|Win32 + {0565DB39-45CC-416E-B549-BFC24F2666D1}.DebugDll|Win32.Build.0 = Debug|Win32 + {0565DB39-45CC-416E-B549-BFC24F2666D1}.DebugDoublePrecision|Win32.ActiveCfg = Debug|Win32 + {0565DB39-45CC-416E-B549-BFC24F2666D1}.DebugDoublePrecision|Win32.Build.0 = Debug|Win32 + {0565DB39-45CC-416E-B549-BFC24F2666D1}.Release|Win32.ActiveCfg = Release|Win32 + {0565DB39-45CC-416E-B549-BFC24F2666D1}.Release|Win32.Build.0 = Release|Win32 + {0565DB39-45CC-416E-B549-BFC24F2666D1}.ReleaseDll|Win32.ActiveCfg = Release|Win32 + {0565DB39-45CC-416E-B549-BFC24F2666D1}.ReleaseDll|Win32.Build.0 = Release|Win32 + {0565DB39-45CC-416E-B549-BFC24F2666D1}.ReleaseDoublePrecision|Win32.ActiveCfg = Release|Win32 + {0565DB39-45CC-416E-B549-BFC24F2666D1}.ReleaseDoublePrecision|Win32.Build.0 = Release|Win32 + {DBE44CA3-2912-4441-8D99-AA2242688AD2}.Debug|Win32.ActiveCfg = Debug|Win32 + {DBE44CA3-2912-4441-8D99-AA2242688AD2}.Debug|Win32.Build.0 = Debug|Win32 + {DBE44CA3-2912-4441-8D99-AA2242688AD2}.DebugDll|Win32.ActiveCfg = Debug|Win32 + {DBE44CA3-2912-4441-8D99-AA2242688AD2}.DebugDll|Win32.Build.0 = Debug|Win32 + {DBE44CA3-2912-4441-8D99-AA2242688AD2}.DebugDoublePrecision|Win32.ActiveCfg = Debug|Win32 + {DBE44CA3-2912-4441-8D99-AA2242688AD2}.DebugDoublePrecision|Win32.Build.0 = Debug|Win32 + {DBE44CA3-2912-4441-8D99-AA2242688AD2}.Release|Win32.ActiveCfg = Release|Win32 + {DBE44CA3-2912-4441-8D99-AA2242688AD2}.Release|Win32.Build.0 = Release|Win32 + {DBE44CA3-2912-4441-8D99-AA2242688AD2}.ReleaseDll|Win32.ActiveCfg = Release|Win32 + {DBE44CA3-2912-4441-8D99-AA2242688AD2}.ReleaseDll|Win32.Build.0 = Release|Win32 + {DBE44CA3-2912-4441-8D99-AA2242688AD2}.ReleaseDoublePrecision|Win32.ActiveCfg = Release|Win32 + {DBE44CA3-2912-4441-8D99-AA2242688AD2}.ReleaseDoublePrecision|Win32.Build.0 = Release|Win32 + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.Debug|Win32.ActiveCfg = Debug|Win32 + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.Debug|Win32.Build.0 = Debug|Win32 + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.DebugDll|Win32.ActiveCfg = DebugDll|Win32 + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.DebugDll|Win32.Build.0 = DebugDll|Win32 + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.DebugDoublePrecision|Win32.ActiveCfg = DebugDoublePrecision|Win32 + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.DebugDoublePrecision|Win32.Build.0 = DebugDoublePrecision|Win32 + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.Release|Win32.ActiveCfg = Release|Win32 + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.Release|Win32.Build.0 = Release|Win32 + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.ReleaseDll|Win32.ActiveCfg = ReleaseDll|Win32 + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.ReleaseDll|Win32.Build.0 = ReleaseDll|Win32 + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.ReleaseDoublePrecision|Win32.ActiveCfg = ReleaseDoublePrecision|Win32 + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.ReleaseDoublePrecision|Win32.Build.0 = ReleaseDoublePrecision|Win32 + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.Debug|Win32.ActiveCfg = Debug|Win32 + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.Debug|Win32.Build.0 = Debug|Win32 + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.DebugDll|Win32.ActiveCfg = DebugDll|Win32 + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.DebugDll|Win32.Build.0 = DebugDll|Win32 + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.DebugDoublePrecision|Win32.ActiveCfg = DebugDoublePrecision|Win32 + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.DebugDoublePrecision|Win32.Build.0 = DebugDoublePrecision|Win32 + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.Release|Win32.ActiveCfg = Release|Win32 + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.Release|Win32.Build.0 = Release|Win32 + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.ReleaseDll|Win32.ActiveCfg = ReleaseDll|Win32 + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.ReleaseDll|Win32.Build.0 = ReleaseDll|Win32 + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.ReleaseDoublePrecision|Win32.ActiveCfg = ReleaseDoublePrecision|Win32 + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.ReleaseDoublePrecision|Win32.Build.0 = ReleaseDoublePrecision|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/CDTestFramework.txt b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/CDTestFramework.txt new file mode 100644 index 00000000..6ff06a0e --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/CDTestFramework.txt @@ -0,0 +1,31 @@ + +CD Test Framework +================= + +This is a very small app used to test various collision detection (CD) algorithms. +It will be first used as a demo/sample for Opcode 1.3 (a lot of people requested this), +and then I will also include benchmarks against competing libraries (Bullet, GIMPACT, etc). + +Update April 2, 2008 +Erwin Coumans added Bullet support for broadphase test (SAP, MultiSAP, other tests follow) +This CDTestFramework is now included in Bullet/Extras under the ZLib license. + +Current version includes tests for: +- sphere vs mesh queries +- OBB vs mesh queries +- capsule vs mesh queries +- complete box pruning +- bipartite box pruning + + +Pierre Terdiman +March 16, 2007 + +External libs used: + +Opcode 1.3 (http://www.codercorner.com/Opcode.htm) +AntTweakBar (http://www.antisphere.com/Wiki/tools:anttweakbar) +Bullet Physics Library (http://bulletphysics.com) + +Contact email: +pierre@codercorner.com \ No newline at end of file diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/CDTestFramework.vcproj b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/CDTestFramework.vcproj new file mode 100644 index 00000000..a3bf879a --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/CDTestFramework.vcproj @@ -0,0 +1,365 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Camera.cpp b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Camera.cpp new file mode 100644 index 00000000..21ee7278 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Camera.cpp @@ -0,0 +1,156 @@ +/* +CDTestFramework http://codercorner.com +Copyright (c) 2007-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#include "stdafx.h" +#include "Camera.h" + +static const float gCamSpeed = 1.0f; +//static Point gEye(3.0616338f, 1.1985892f, 2.5769043f); +//static Point gDir(-0.66853905,-0.14004262,-0.73037237); +static Point gEye(240, 205, 205); +static Point gDir(-1,-1,-1); +static Point gN; +static float gFOV = 60.0f; + +const Point& GetCameraPos() +{ + return gEye; +} + +const Point& GetCameraDir() +{ + return gDir; +} + +void MoveCameraForward() +{ + gEye += gDir * gCamSpeed; +} + +void MoveCameraBackward() +{ + gEye -= gDir * gCamSpeed; +} + +void MoveCameraRight() +{ + gEye -= gN * gCamSpeed; +} + +void MoveCameraLeft() +{ + gEye += gN * gCamSpeed; +} + + static const float NxPiF32 = 3.141592653589793f; + + float degToRad(float a) + { + return (float)0.01745329251994329547 * a; + } + + class NxQuat + { + public: + NxQuat(){} + + NxQuat(const float angle, const Point & axis) + { + x = axis.x; + y = axis.y; + z = axis.z; + + const float i_length = 1.0f / sqrtf( x*x + y*y + z*z ); + x = x * i_length; + y = y * i_length; + z = z * i_length; + + float Half = degToRad(angle * 0.5f); + + w = cosf(Half); + const float sin_theta_over_two = sinf(Half ); + x = x * sin_theta_over_two; + y = y * sin_theta_over_two; + z = z * sin_theta_over_two; + } + + void NxQuat::multiply(const NxQuat& left, const Point& right) + { + float a,b,c,d; + + a = - left.x*right.x - left.y*right.y - left.z *right.z; + b = left.w*right.x + left.y*right.z - right.y*left.z; + c = left.w*right.y + left.z*right.x - right.z*left.x; + d = left.w*right.z + left.x*right.y - right.x*left.y; + + w = a; + x = b; + y = c; + z = d; + } + + void NxQuat::rotate(Point & v) const + { + NxQuat myInverse; + myInverse.x = -x; + myInverse.y = -y; + myInverse.z = -z; + myInverse.w = w; + + NxQuat left; + left.multiply(*this,v); + v.x = left.w*myInverse.x + myInverse.w*left.x + left.y*myInverse.z - myInverse.y*left.z; + v.y = left.w*myInverse.y + myInverse.w*left.y + left.z*myInverse.x - myInverse.z*left.x; + v.z = left.w*myInverse.z + myInverse.w*left.z + left.x*myInverse.y - myInverse.x*left.y; + } + + float x,y,z,w; + }; + +void RotateCamera(int dx, int dy) +{ + gDir = gDir.Normalize(); + gN = gDir ^ Point(0,1,0); + + NxQuat qx(NxPiF32 * dx * 20/ 180.0f, Point(0,1,0)); + qx.rotate(gDir); + NxQuat qy(NxPiF32 * dy * 20/ 180.0f, gN); + qy.rotate(gDir); +} + +void SetupCameraMatrix() +{ + glLoadIdentity(); + gluPerspective(gFOV, ((float)glutGet(GLUT_WINDOW_WIDTH))/((float)glutGet(GLUT_WINDOW_HEIGHT)), 1.0f, 10000.0f); + gluLookAt(gEye.x, gEye.y, gEye.z, gEye.x + gDir.x, gEye.y + gDir.y, gEye.z + gDir.z, 0.0f, 1.0f, 0.0f); +} + +Point ComputeWorldRay(int xs, int ys) +{ + GLint viewPort[4]; + GLdouble modelMatrix[16]; + GLdouble projMatrix[16]; + glGetIntegerv(GL_VIEWPORT, viewPort); + glGetDoublev(GL_MODELVIEW_MATRIX, modelMatrix); + glGetDoublev(GL_PROJECTION_MATRIX, projMatrix); + ys = viewPort[3] - ys - 1; + GLdouble wx0, wy0, wz0; + gluUnProject((GLdouble) xs, (GLdouble) ys, 0.0, modelMatrix, projMatrix, viewPort, &wx0, &wy0, &wz0); + GLdouble wx1, wy1, wz1; + gluUnProject((GLdouble) xs, (GLdouble) ys, 1.0, modelMatrix, projMatrix, viewPort, &wx1, &wy1, &wz1); + Point tmp(float(wx1-wx0), float(wy1-wy0), float(wz1-wz0)); + tmp.Normalize(); + return tmp; +} diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Camera.h b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Camera.h new file mode 100644 index 00000000..0696e689 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Camera.h @@ -0,0 +1,32 @@ +/* +CDTestFramework http://codercorner.com +Copyright (c) 2007-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + + +#ifndef CAMERA_H +#define CAMERA_H + + const Point& GetCameraPos(); + const Point& GetCameraDir(); + void RotateCamera(int dx, int dy); + + void MoveCameraForward(); + void MoveCameraBackward(); + void MoveCameraRight(); + void MoveCameraLeft(); + + void SetupCameraMatrix(); + Point ComputeWorldRay(int xs, int ys); + +#endif // CAMERA_H diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/CapsuleMeshQuery.cpp b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/CapsuleMeshQuery.cpp new file mode 100644 index 00000000..b1a62090 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/CapsuleMeshQuery.cpp @@ -0,0 +1,127 @@ +/* +CDTestFramework http://codercorner.com +Copyright (c) 2007-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + + +#include "stdafx.h" +#include "IceHelpers.h" +#include "RenderingHelpers.h" +#include "Terrain.h" +#include "CapsuleMeshQuery.h" +#include "Camera.h" +#include "GLFontRenderer.h" + +CapsuleMeshQuery::CapsuleMeshQuery() : + mBar (null), + mDist (0.0f), + mValidHit (false) +{ +} + +CapsuleMeshQuery::~CapsuleMeshQuery() +{ +} + +void CapsuleMeshQuery::Init() +{ + mP0 = Point(0.0f, -4.0f, 0.0f); + mP1 = Point(0.0f, 4.0f, 0.0f); + + Matrix3x3 MX,MY; + RotX(MX, 45.0f); + RotY(MY, 45.0f); + + mWorld = MX * MY; + mWorld.SetTrans(0.0f, 4.0f, 0.0f); +} + +void CapsuleMeshQuery::Release() +{ +} + +void CapsuleMeshQuery::PerformTest() +{ + RenderTerrain(); + + mCapsule.mP0 = mP0 * mWorld; + mCapsule.mP1 = mP1 * mWorld; + mCapsule.mRadius = 1.0f; + DrawCapsule(mWorld, mP0, mP1, 1.0f); + + const Model* TM = GetTerrainModel(); + if(TM) + { + LSSCollider Collider; + + mProfiler.Start(); + bool Status = Collider.Collide(mCache, mCapsule, *TM, null, null); + mProfiler.End(); + mProfiler.Accum(); + + if(Status) + { + if(Collider.GetContactStatus()) + { + udword NbTris = Collider.GetNbTouchedPrimitives(); + const udword* Indices = Collider.GetTouchedPrimitives(); + + RenderTerrainTriangles(NbTris, Indices); + } + } + } + + // Raycast hit + if(mValidHit) + { + Point wp = mLocalHit + (Point)mWorld.GetTrans(); + DrawLine(wp, wp + Point(1.0f, 0.0f, 0.0f), Point(1,0,0), 1.0f); + DrawLine(wp, wp + Point(0.0f, 1.0f, 0.0f), Point(0,1,0), 1.0f); + DrawLine(wp, wp + Point(0.0f, 0.0f, 1.0f), Point(0,0,1), 1.0f); + } + + char Buffer[4096]; + sprintf(Buffer, "Capsule-mesh query = %5.1f us (%d cycles)\n", mProfiler.mMsTime, mProfiler.mCycles); + GLFontRenderer::print(10.0f, 10.0f, 0.02f, Buffer); +} + +void CapsuleMeshQuery::KeyboardCallback(unsigned char key, int x, int y) +{ +} + +void CapsuleMeshQuery::MouseCallback(int button, int state, int x, int y) +{ + mValidHit = false; + if(!button && !state) + { + Point Dir = ComputeWorldRay(x, y); + + float s[2]; + if(RayCapsuleOverlap(GetCameraPos(), Dir, mCapsule, s)) + { + mValidHit = true; + mDist = s[0]; + Point hit = GetCameraPos() + Dir * mDist; + mLocalHit = hit - (Point)mWorld.GetTrans(); + } + } +} + +void CapsuleMeshQuery::MotionCallback(int x, int y) +{ + if(mValidHit) + { + Point Dir = ComputeWorldRay(x, y); + mWorld.SetTrans(GetCameraPos() + Dir*mDist - mLocalHit); + } +} diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/CapsuleMeshQuery.h b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/CapsuleMeshQuery.h new file mode 100644 index 00000000..590e3695 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/CapsuleMeshQuery.h @@ -0,0 +1,49 @@ +/* +CDTestFramework http://codercorner.com +Copyright (c) 2007-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef CAPSULEMESHQUERY_H +#define CAPSULEMESHQUERY_H + +#include "CollisionTest.h" +#include "Profiling.h" + + class CapsuleMeshQuery : public CollisionTest + { + public: + CapsuleMeshQuery(); + virtual ~CapsuleMeshQuery(); + + virtual void Init(); + virtual void Release(); + virtual void PerformTest(); + virtual void KeyboardCallback(unsigned char key, int x, int y); + virtual void MouseCallback(int button, int state, int x, int y); + virtual void MotionCallback(int x, int y); + + TwBar* mBar; //!< AntTweakBar + Profiler mProfiler; + + Point mP0; + Point mP1; + Matrix4x4 mWorld; + LSS mCapsule; + LSSCache mCache; + + float mDist; + Point mLocalHit; + bool mValidHit; + }; + +#endif // CAPSULEMESHQUERY_H diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/CollisionTest.cpp b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/CollisionTest.cpp new file mode 100644 index 00000000..e487154a --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/CollisionTest.cpp @@ -0,0 +1,38 @@ +/* +CDTestFramework http://codercorner.com +Copyright (c) 2007-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#include "stdafx.h" +#include "CollisionTest.h" + +OpcodeSettings::OpcodeSettings() : + mPrimitiveTests (true), + mFirstContact (false), + mUseCache (false) +{ +} + +void OpcodeSettings::AddToTweakBar(TwBar* tbar) +{ + TwAddVarRW(tbar, "Primitive tests", TW_TYPE_BOOLCPP, &mPrimitiveTests, " group='Opcode' "); + TwAddVarRW(tbar, "First contact", TW_TYPE_BOOLCPP, &mFirstContact, " group='Opcode' "); + TwAddVarRW(tbar, "Temporal coherence", TW_TYPE_BOOLCPP, &mUseCache, " group='Opcode' "); +} + +void OpcodeSettings::SetupCollider(Collider& collider) const +{ + collider.SetFirstContact(mFirstContact); + collider.SetPrimitiveTests(mPrimitiveTests); + collider.SetTemporalCoherence(mUseCache); +} \ No newline at end of file diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/CollisionTest.h b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/CollisionTest.h new file mode 100644 index 00000000..addef25c --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/CollisionTest.h @@ -0,0 +1,50 @@ +/* +CDTestFramework http://codercorner.com +Copyright (c) 2007-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + + +#ifndef COLLISIONTEST_H +#define COLLISIONTEST_H + + class CollisionTest + { + public: + + CollisionTest() {} + virtual ~CollisionTest() {} + + virtual void Init() = 0; + virtual void Release() = 0; + virtual void PerformTest() = 0; + virtual void Select() {} + virtual void Deselect() {} + virtual void KeyboardCallback(unsigned char key, int x, int y) {} + virtual void MouseCallback(int button, int state, int x, int y) {} + virtual void MotionCallback(int x, int y) {} + }; + + class OpcodeSettings + { + public: + OpcodeSettings(); + + void AddToTweakBar(TwBar* tbar); + void SetupCollider(Collider& collider) const; + + bool mPrimitiveTests; + bool mFirstContact; + bool mUseCache; + }; + +#endif // COLLISIONTEST_H diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/CompleteBoxPruning.cpp b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/CompleteBoxPruning.cpp new file mode 100644 index 00000000..9f0c1b21 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/CompleteBoxPruning.cpp @@ -0,0 +1,168 @@ +/* +CDTestFramework http://codercorner.com +Copyright (c) 2007-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#include "stdafx.h" +#include "CompleteBoxPruning.h" +#include "RenderingHelpers.h" +#include "GLFontRenderer.h" + +CompleteBoxPruningTest::CompleteBoxPruningTest(int numBoxes) : + mBar (null), + mNbBoxes (numBoxes), + mBoxes (null), + mBoxPtrs (null), + mBoxTime (null), + mSpeed (0.005f), + mAmplitude (100.0f) +{ +} + +CompleteBoxPruningTest::~CompleteBoxPruningTest() +{ + DELETEARRAY(mBoxTime); + DELETEARRAY(mBoxPtrs); + DELETEARRAY(mBoxes); +} + +void CompleteBoxPruningTest::Init() +{ + m_firstTime = true; + + SRand(0); + mBoxes = new AABB[mNbBoxes]; + mBoxPtrs = new const AABB*[mNbBoxes]; + mBoxTime = new float[mNbBoxes]; + for(udword i=0;i +#include +#include +#include + +#include "GLFontData.h" +#include "GLFontRenderer.h" + +bool GLFontRenderer::m_isInit=false; +unsigned int GLFontRenderer::m_textureObject=0; +int GLFontRenderer::m_screenWidth=640; +int GLFontRenderer::m_screenHeight=480; +float GLFontRenderer::m_color[4]={1.0f, 1.0f, 1.0f, 1.0f}; + +bool GLFontRenderer::init() +{ + glGenTextures(1, &m_textureObject); + if(m_textureObject == 0) return false; + + glBindTexture(GL_TEXTURE_2D, m_textureObject); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR); + glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); + + // expand to rgba + unsigned char* pNewSource = new unsigned char[OGL_FONT_TEXTURE_WIDTH*OGL_FONT_TEXTURE_HEIGHT*4]; + for(int i=0;i 0) + { + glBlendFunc(GL_SRC_ALPHA,GL_ONE_MINUS_SRC_ALPHA); + glDisable(GL_DEPTH_TEST); + glDisable(GL_LIGHTING); + + glEnable(GL_TEXTURE_2D); + glBindTexture(GL_TEXTURE_2D, m_textureObject); + + + if(doOrthoProj) + { + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glLoadIdentity(); + glOrtho(0, m_screenWidth, 0, m_screenHeight, -1, 1); + } + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + glLoadIdentity(); + + glEnable(GL_BLEND); + + glColor4f(m_color[0], m_color[1], m_color[2], m_color[3]); + + const float glyphHeightUV = ((float)OGL_FONT_CHARS_PER_COL)/OGL_FONT_TEXTURE_HEIGHT*2-0.01f; + + float translate = 0.0f; + + float* pVertList = new float[num*3*6]; + float* pTextureCoordList = new float[num*2*6]; + int vertIndex = 0; + int textureCoordIndex = 0; + + float translateDown = 0.0f; + unsigned int count = 0; + + for(unsigned int i=0;iRB6|uMTbzJ;*3;m zO46G^Z*PYU((G2ZXk)tC)v8tN8r&AsQkfRx8f(!60tU>wcbx2Qz^n!w&HMR0=iWOr zNecM-{qYZJ@11+kdCqg5^PK0L^PJ~A=iJbT+qDu+(>%B)CN!-Zzx=C}`)l9E5k2R^ zAI#AXo%NH8x{Fr--^8;+|XYtoqokcinY&yy~O3Ro#=gtLpZfY{oC2_>7DED$!=jFC(-baFKENQz`Kx@6NA!-Sl#? zHls|_4*a@U+ezR}CE7wiA13`ZmuQt&ObUA=ub}g=B4AqR%j36gjw9ydciH7)S#7$V z1XY^0{_=Y^+#0`C(>{Ga;#qd*a)9t#i~pA^Fm2aui~tY9_Ah_zzglqT@_RmY&&TjC zWks1K&oF-T{%VQup4&Fw4Zz=CjR^37nP}^$z||r2&A&G}@FoY||*&85;5}k_fZTXZp4qp<%sgSo60oMRYPc)({)@!J<%cyrn3R3}(Zz zmvXP6kx1<2+-uZoi2W}28XOPD#&WNr(Marn-PcCV#(M&I@uINWFAAsqqA=Po3ZJ|b z+1U7EMu*M1@^GVOhK9{Zpur3doAthk1bf30=#fBgWTK*161WAE^tpn`Yp!4lyIU{? z>=sM`y9JZi|5$g-tM&FueR!olT6*mI7&k-Xx%wEF`WUzC!?Uy}^G-7e5LF%HPIYAU zrmPk(Go#sox`6f4uQV-FytK!(v*~sIB)@>Fe<#1uRFI|}EpryI>PL%=kPq1}?b%V> z))T)GVM|Z#m}^9{W^mLDWvlDGTWZYcs9EPVL!%`tJXZ&^O^X>2%r25JGvYHn+l=6t z-ZZAg=RQkn$NE3SY&}&H{S@3!IHGU%7Wp6gZ?+9ctW^pt zlC-5^Gdcp!=vI*#8ZlO&CE?YFS0iYVzm}c`e=WVq()>HCnLKJ$N4<&S%&*O$bw`g6 z$;?RkfTwuyg3Y}}fnN>%{&iDC28<)+7Lcu?3} z>_F)zAn5mbtzSO}0}vRWA6t-irPpJuJlB&SZ>L`E^;r8<@>lbtCnfhHImBT~=BvG4 z>o%1<`(*IXGo9M;HB3|tqJcrc0(M1vjk3W=Ngy*TRmxuqB>NRuZi>vE=iTQRm(Geq3rO=bB9wR(IbD^Ex0>paGa zO5wk!!46;SX8bXgFNjb59%LgL-(izEKDitp!7 zW(MM)TX)(Foi;*)X0+dk4m}qf99ZWAc2@+@?hIeCT@4|h^;TrTN*o9VCgt6$aQ8WR zBfcQ-<0}4ylXu{`b;r%X{lD(8SKzeQ-OqU5E4rU- z?p1X^^Q8M}Exvwpr2!k{q9o;S<#{H?%v z(i9R77D&$yx0`Vn+v#^ReQ>NgIGQL;n|xu1d%Bp|J!W)_y=@PA+cEaG(hDfkRxPfs z_a!c{3lkhO>Z+V>0cp_G=Vva;t1ZMk-3CS$^t1IIV^yW#_k1)w7J~Prb%U^5Mo@`e_Ld9WdArZk@1^t z{N>1`9**!;+j4`M-tX#Wp}j`iICDP2 z`$T-MqS{RI6;-xnabuC4bukz}jPS3w}BYThylM&asQ zgL*USD($3Ye6=(Fk9AKJ)E`h32 zLs2P;jzbw4BEcxO;=k%aLSCbOc~YWB7!Bu?P9IgfU81Ow2^I?T zr0!11Yq?&tR=Q7B8Ql%0srC3h@{Mn!w0T^PfMq>ffx(H~7Dlr!;hsqZS zC(+3#qggzovHasK0zsHZL~SpRtt~;)B1QSqo^%#?&Cq-#W`Ys)8pMrWgIF7^g)^BP zlLrwL$WhRz`q}j7Nf5>(f9v1lDHR;UU8X@}G7TC-_g@{&Hq~J~P9#Z9Fr)K98U<(sbdkIUn^!wz>flnxIasPl z`ugZdgJsA-v}b68o{3Q11M=SbQnxN-q5Jo!`kI1$tmbDhxDdHT7o*E>dnC9KY}JRdidyz#SPYD zKO-DW2R(XIk2}}|fD@rPHev?YgNYC3EMwK7!<gNOae_mec%K^%>_e(peQlLsHG~j!^_aeP)U%qi?EX@IKJi%~E>(+x6DYr7Q|Z|Op=HxW z@8Xfpx!b6#7r+|{D8#Ihr)YPoZmm2K&3btvsTav%jpedGst;*byRl(DWoD^@ z@;Uuw&Z?q44c6JJF4*sf4jbr#IbWxYLB5vutFvA1cBub)k*f_xhN3>n|3! zok9vlGn_wOkLKOdq~n|I63uyis)QT<*T*cJWWPI^lasgsn!TX;!#2&cUmvqg^Fo{E zxvx(%ILY~bxy{MaX{bU_j#tU(zJ|_Gv;7wxMGGP6t$g1MJYj&s(oEypiRsX2C3RfB080^9xxW_ zm{ge*IwyoS+Z|DXX(?BHn<~LKi7H`}lW#J(4-6uo+z#ieM5ef}@1-1`>=`)KQqj&b;1?jnD5I^-9)$RAb6`xZ&z6>_mT*U*@mK(i)Fl9j+% zxTD(lz}B-+87xEw^JtPo5JZ-@SC>Boi)V4>_RL)2H2{YMusCy5dKL9(pp0XlF{C9x z;0W{sNNULmn9Fiv79Exb55&XO!SW_W0Ibl+W6bnCz`{KXeO+X6Jbehg0>#C(}(}XRqi0Tw=Lr)~$p#?f{{SMdJ3$?&${C*GDyYZZxE-L+Z{!KUA zIs#NzrCN$^J@Hw)y<}~vj2(c6KrPie`4dLLmMAK19P=kj#M}~)M$Ovq0%V?pVbzRQ zCRgrwE2K7TRiCiY7Bs`pZBgZFLW|DoC!saH{LMf7Y|$&`AIziXt4Gttzx!wNg#JRw z@Ag4eh8@P45J9UM7e>N}GhQ96Y(nogF6wMK1%6x_%4o?6v)CvyX*cnh4PGPS&7{mA zRB}Zy%tR6Ee|rnc^dU@v86SeWN^__5nXp6Nv0U7|r3XzTH}v72x+NO@+-&}CcFN1=avp!}nOiJ?4*fB_@-awiK$SKx9atj`y)bF9n^eXCCM}*OY4J2kOWdStoJZ1FAzYC-B)*_a)nBLn}un1xm6^G*%l zY7K-upUOL_1mT^+rw@7BdJ-#h4EM~!NJdd~X;4U}%5T7#B(f$Hwo5c52EOWie4+~H z<9m(vpv0@?MJ|v{mM~G3^T>F832S*lYZePy0h5%{`i7Y#1HmH25OgH4{I36z-OCj8 ze!K3K-Y;{G^zk1&E^lt9oDEyGDhRV{R2dbX(T_+!pVyc35&BQd$OsxmY^?`fHLVY6 z86?nE_v=mlP&O*qWH6XNJ{PKj8SK-oi?E2IH}$RaKZs0ZG(WjxNB2rCFtH%H7eCOZ zIJ#k^l|Ftf{m*zqppxKz8KK6~?UELF>x%U8n#9=v@GvL@fMRsm8RC(q7VVchAIq!< zO8?{aMfxiWUL=sQ#kANHUfP$FZ)SI^)$(Or-BE$9OGIcjBoL zHiB_ZX&bD6OOdBgzOfFBabheXK=l9u(kF|w%uHkldQpC_|8XGfHAB66`c^1M(236V zKlm1c279rX+KdIn}8_8)H+d{{&Dz&3{d+-S}bmE$##O2LRPiXNA8CX}e zJqVk@iECCACC<}>$BXsgiQ?v_V_Kp&6+FybGv4!0>Ca3U(ZjGO7{PA6sas3jF2)o# zV-E3LUGSyq?5@d|s+F!mY_?`}(1>_w%ME1>x;X^QVjmV20vPl7jCGmZi}V8W+RbWB zuRMpfd1y6@0efxqpcy>4!@E87Ei-!PnprHyw^$4W))#FLeUqW9q!DW+ z?PB!k{S!uTzZu$Zg!U~xr8n)kNy+%`D+5q^x5D0}}?P1iOrA`%+kO+K~qoJY`^;CCk&Tu-2n)VU3b8 zm8|orffB5%lyMJ{D;97VlV%DnZj=(6IUf&76p@D3H`F`QEXISXh&i@w!;HU9@E&(H;B&Zk^v+=!(@i*1B8R(bUZ6X=R zi`l_DT1MNa_?9F9+Q)UxNBFMA-)#e+m9*WHgFst(o8HEx#kwFZZa%_jE%D7%+eSXH zfU{M*>0p2*YH6VR$5mZ1I#4vM)F47^&`A%i52W2 zirK2|!cuNkhr!x)>XcPEXw-RRG|564R@GRI!Hw0p6u+sqFfcB#Ww32EUd$x#ki?D; z@J#?9k0=@6SuzEH7TmEa2Lahc$(R%+BT|%%(NeONd{8A5IZZOa?BLz#sKs4B!n>A; zh_t>XS2B@S8J5_xosvy2tt}V=H8eg~U?XVsEb064n`&E*9OgR$y9_U82k#WvtN4~A zfD%}~i@*v11@>=p5K3SfgOV~0O3G*{=@LGul1fM4!2q+3ccX1F?)nkl*)CDEBI-TU z3oQGvGj{sTy~TMwdn05v)wU35%N-G2fETlkcZ%rS_|`!HC8B&65fuQ6=*2k*C8CT$ z@t6k1W3&`+J|9%^l!!9GO!96dD{OrOYl^6Jl=?~ZL+mICpEkh? z)}oHzR9iXF`y6=<;KfYxPI>k7O#qa<@?GRr04T3>au7;h8G~XHDT>KxDW;bXs+dY% z8DMtsZghBX*N^b7CH_w2mFkOKOp#Ynh+bb_^`~I%hpmj0 zb{8DqThDm7S29i>RSva^b4%!lH+wfz#m_`2_QrJ^Ge2CMWk`h*EaS zyD3ZQ`=Q{IDfi+x)iwfR#>H0QH99Q3m~FgMe%p~tdau9d@2=AJ|?F67i>Tf47AP$pu?yW;(PZofMFr8onhw;EmXk;Y z9kAfNHcvBo3wk9o`E2~A+WJwrF)|rGWo@VNVkUWKgZnw(1VA-7zDt7>05-T&ISAF@ z7y~8~DVWS?VRA1Y@CPQV2FC!igLk9j1n&9~-nGP1X>jKQR9Gn5eIuk!cvYYstIp$k z#IY>b;WyQG95_ZDf$71E*~U8s=7)UiAb=7WzKg&J00rjp9E1`W#-J=rgR(GM%F@jT zRTd>M3^0?t8_7es>qmHJ=fOU5k~qA9Vf;0#R2BPXh(oIFAhNNXsyl!eGs!!v?(2LL z09AE-m#Py0R^8Wf5UT1JgW?h?ipyvz?mj-K;;O1+fZ4&j(XkhIDDFr2t919FRNEfB z43jL(rjonyVs`M(zU&|QmL!1c%lJ;R6af3Of5<_ozKlsh7Sn(%MhjW(d{AVmzKj88 z8}CNjPTZHC)Q|8NWWl6-8WvtHfholh=FY!Cx;NO6CpAsg4B0f7K;R&wLt2~@4py>E zINXlzO1Hr-L!6T4ya@*zF(w?+8^ZRPZ$##VBQz`~AyM#P!pVEj8Ze__!ZCdxY!5Ib zC%qJRHjPF2O|@+YD+ZlPX~m1#!888ZZyAqz z&SriK-vmH4bG}P67XUW%59c6MGiMCSMx-bkqor&&@3{|dd9t2xbZOef8up^sS;>B#^owB)Or zPvSS#wg5RCbR@M3FJ_W=O6rAt696Ttd>2U-07~jxa}Y{W8H17%DN4#{DQP7i@aO6h z3@|%*H#*93*N^b7B`yRi_*_$!F7oUEsp>rFll z-pgAclzPoZ#KC!?lfSUIal^q}qk?als>Vud-2nj6w@TUK>_zrN>m`&P^4J$p4-xTx z{xNP?`NJ#R$N*DB(7W`M3VG@FQ;Y$u5r(yCghCU+_%xDY<%vxfcJz;$#0a|?_p6j} zO~c-=(sG}-w$86@c?UDA_qL?@#!TplN?&@I*pn;g!XSzSo=lx!@RV?K5Cib4-{&dX zf?Z17C8IT=;<@<(%i{TNkDXoW_Y0pln>ea&H07x%CDHOvdHt6@)d#B=}r z{I|qgoi{J`tZhZfuuz|MQfGQpEWDOLbA=b)mh?XbZC(i2F<*hZwpzdS!OV?qXx0ro z6idp48hF(r=kq%iY2(%P9<<;Jc?)K%>%3duYYHGt^IZ6@gP%%hYyv*k$}PRPOC=mL zrEa<8FxJId)@vA{$pX0Tb&*?yfV`k4_3mcYRQxuU6a(W8yf@5v^E>JDy z(MRSxQOV#i{BE}+8k~JwGBgbLy`6YVMu*{3+>R$0#?Ma7#Cra$Zv%VE$*t7V>5t%W zv7r9-k;q-;Q5n*KgWQUZs@WUjzE!zdPQxIkk?td0i>2%#9Qj#~Glx<;#m z78e5Hcsa6lDdckz8Uy?Sut~6K9@;}GTc1?;=pwA4a#Py4I5;lC>KJ5WZf86AMfd2k zU3>^-g(u+W?I%^|lKuSS(*OLq|Ha?hhT)y!wviU9}s7pmJ%`dhDH{|a`#SOw=U zriK{MubXY3Kv*00x84FJ3qV*;#Y5XEf9r9eNy0zb_1KOL45oCljpGT6&b zLD9a2Ai9OcCR1s`}RMF<@iC#(~)Bm|Ld_E9Wm+pr^#j$l6C5EqcFKW4&1q=>?b#&B1IZiJ^I2Mu-(#v9D zTK|K6$W4PkSdPK0NMKAglT`kRpuvIB-%4O9<#s$M=WUPw!G{Fq5Z0hS9-&nV9Xj?^ z%*~UHR-nxI5#X?r0boaJ#Y&{rGB?0!dTJB|K+9a&SbC5`fIN))Smh06A1y}H(>_*JCydYyF7z#ZAoyD>cN1t~{>Wx|) zT1Qq!(Hi<5p%bC#dr_fYIBaL&It#I3h!I}sJo}9BV&^$vgqIKl6L+<$ZYE;Q|FBc$ zRNY2J4a&P8PpMJ@Nl*x+Y31~#@V8@ry)%T#FWbHb{W8>KY+-qN0bpb;v@(p+lI9A~#rFD%x5URdOO&T3)yo zBM;(@9Ry}kY)z~b&!Ts=9BoC+)nyzg64)6dBMM>J%P@+A`YRzVaQXFGpb6IoT<^!F z#&{X8d^e-xCXEk$jWoiwLvfmpjte zGAx%gz_3NQ<&x6=pROcWE-7Er%qA}>?f>afkeEwa#USip&riC5VHm#hlX7t&{k?*u ziy8Fg!lX+WCOvbG;42Z9Y071}jPG~mk-D4#YxC%=Wxxk=DOU2mIxj^%1Kw$;;C@!0 zQMV*B5BuRDHk>*{7H4L6%G`+4$#Pb!SNn7WyxVX+itF3Bj^pabHG*pb*Et`=WE|Hu zxUR?bQCtaJ2CgsQ`Wmi(!_|vx5Z8a<`ZF#cMBqGJoHlz(XUz1THEXu7Y>q!L_v~}d z`+xYayyD!PHZA&kfqe29Oj|ymxk=>nKKv+7Hj8jxPY6{xEh3pU3{Y~jO~jJ*YNrsH zq|`VmL?CD9r4VU+)s>585yju;WT!>sa3Cio+e8RYhWP zKCR}-b>+?>Bp&VDs1|rTuB&j><6493c3k)2+JWnza2>#P7}rm5J&)_Zabk?c`an<6w9@ko2pTKnwuKyo|3xdY}yoNfS7B9}+Ev!m4Q`zL7VpghUw|cdusB;W^ zHH>Y0TmZ8o%aDinB1AD;sjnyfioeDV4h1nU6efudTfg`pnT2DfE&1=2{L9rGYy)(- zRH+0ZRZ0|4JlOk?bMz+svE7_({~#peBo4-4F|d_{KN0Ka>t#HdF8zqt!k`KDpW7Ls zx2@rF2S>4Sv@9rW<3O?ts9`PH16#y?0>pOQAmT*U@-wyLP9ttF(viT#g;P_fT4(J;^m1I8`KB=8 z_8t;tmXRvX3U?I|Ld6L$Nx7;K`n5{cr2C*%DR*1S-^iKv7k%^}h2@j>7d`d?2|a_8 z;FgD1vJY|6{-WzRFNu!aF3hI}cvx7EDaAVw<4&b5CO;ER{^VCt zRgSZw+GW(Adv$gh^*g(aPG`=CfzlR;sBARqH+ODhmC6kC4emACxz62dbozDn8l67# zUZc|mdyOzT?E~dd5beE2rwjHPou0hc=ybteqtlc38rjJ0y+(z|vDe5(p4)4L>Gv=c zQfy@UYxf#$?k^grz{#v(|NHD_f^9`qRyElpgDFnL zy65wZLRTy@k8MTHj%8;XO~eJjwxZxDw)MfkHf&js*eJz_>Kp)YZM~xX^|usFAtWum zr%MRtD5J9bV!Y%S292?Z^)b*bl*%#(_5ejkOK74T#U3E=Dt4S>(_5va?jE3BF4D}u zNOA8#rzqxjn6gKC7RUHxr+)CSWu%!ra{c+|{ZoFw>X`7 z;A5gL-i05OR(fJAaLE34+n;}QCh|c$F7W3EUe}*ryrTuc@#h!!1@tyKe}2Hb{`|HR zHDVoq{!y6SAOv>4^yde>>(4)m4ob!5{P`2GR4RY|JMfg}&!3U*ak4-Ebu?^-Mr?n6 zkuJ<^#h)L2z_6bFs5<$t!vEl(*--|E>CZndyy+Mg-V6mwF*MMhA7@()Vlg?0ZFoai zMuwC6v$C`>DE|D(eMj&YvHLSQG_eDe(wDAs*pRG87A; zAnXJP>jhy?3Sm7qVX{mwhD&TW(3=iB&QlbM9AR=`0@pl8^S2gs6Da*F+*84BjRbMa zz#$xpfK}mjGE6T3cqBA_NglTl2qYd zslqQZR8`?#5VjA5eNhPG$d#+Y-Pr8!oC=_-&{IIz&+vApD&&-!gna|QsbKp!x&^7i zon~k!tI#xq?Wzh*sluI7g*zCks&FR=YX@OFgfLoYNSLa^Rx{daM4R=dW@pWs(Ncx7 zW{m}uY3na@F-Xc>Ab?Q2K|Ae~Ve6Yrecb1+X8-gfSjEN_#C12W599g+uK#yevu|Cm z1zyFq;Grj$4Vno>c|n{g0!zhcF7(`XA(WYFPi-vOoH9_Ie%H z;|JaqYQwxVyFWotV&zJH(R(#m$7FCrV0Jy73j%36zgomEu^o2-5sXNd9_2Uq0{C;-mIROFtr36YMAbl1_0K*G_}Vz&`Z=|24!We6M9 z8mFVED4j$KQq(5MP!llF#YIRz?Qo5mhOKiPGO(iWwYes6%5j`s!X%cBfn|+Y>GJ7N z1!P?P4YZd$u7IK7N>Ro~sfTIOmGAdLEUGu)x=joG2-o}Yt|ZM7vDg1Ca{rWELMZe8 zl>VdFXjojs@usm#NSt+5Et{FgnRs6;GglZHs{Wbdn#tM+*RQ4E28RQu_ht=LYv*Mq4qq^dT&TC;x+wt29(ApG6|@ z`U(6H@_&&yA97a?^4~rskX`ucTsEU5klu;7&gFdC#-}BGg2Rp0c_p9j;?rV2ZNO79 zIEpj1hOq>RMP$fcCy&g7okkAU#p1KQ2>*?3l*lTy_w?mV1$m_}Lo#T=!hwO#IgU@A z$BW*=KA9!qq#I8Eo-7h`ss01ePZG=NT$2n90o9-!2;dOHweTqPiX9l9aE8)O+kKV0rIkGk-tBOoM(rf3At|y@<0J{-?Yd_ zZj{oI^2=TWxpxZk@2Z40TfEaE|N9*BKG+P;MEO}$kl$2*{H$q_Uy(!psnGX?pz1<2=2i~Rf?^0lvl z+&=~Ri!yRLa_*lN`Qr+PY?GKrMsl{zm^IkS%=0JqarEUt45ejX`elq__LhGc@XT*8#ZNzuG|2J$_&Jjt&6rXfHHu!l*O@Ub!{#X% z*2afjAWlK3PO=EV5sCDoWweV^?k=W4!hvGEdubhRhG!F@I*+?G>L%)qQ2_(_HiVX*=-j7ZJ|4m4N~eng1Hi35v*-SD>JA&pIMq0iM( zar>j`;=rQlAvv+?Fwf#Uu*g1=`>^BQ*WQ48$EmBw}5om!v^mv)yHScmHexX!y< z3&e5NY{L1dxPFG`FXH!~aTR}33;Ye#qzmx-PFyQ-{T;52xatv(1;97v?)`rc_18L@ zzmc3hec<0SxQ224H?C8;^8J62{~Mw4uYvL8Y1_8Gz2s&#!vK6+=m}GE5IU3wk5{gm zr%L&@8*1!hvqa{TO{ahNb@VM&j12Z~`Z@LHtPvcJ?F10#eG?U7naEi&?S3>#XmRR9 zU`!EgGqrt^XeUv_Ai)KI#Ijg3(oa-W3Ke}g&V{FxmjVN6voU7QwsYyr<&un^Mg}(` zOE@>e!Keq;^OZnl6}{VTld4nc;PnkuCdj&h)s)Em+1;E8<;!{};bukUJf zL`%%W_fNV3X6+Y0Id7_z;Y@_tidn`exVTpw=5N?JSsL@1mXU5ER!aq#A`!V>!wj|f z*|96V!1%B45>nHbK@)C#7Y!3w*8Svz(y$%pBpAYcW^q>!(!p~aPOezpE8`nIpNhMV z^QnyYqc0RktbhEhVC*`90KJBH_k_Q+%FI3zjZVkz5k^*ZDKRuHhu z45=UaXx4ke! z_Q4GKl$arpvl3jx?QxUttI|y;ZjO!5M2#%4OFe}*Tgqa+1n8Q?7Vrw@2+T)l+`{J$ z=;L-bsKyABz7~ofj>+jkxm}{?;i3?}K(hg1a!| zRs?qm!TW^ZFEdmTyblEL2f<$!f@w3!v3n1W$uUB^aqz5`cwcM{iTmDSAr2PLidwW? zc;J=A7BFJDqWa0wF~~s?EI721;e!C;uWC~}1l1@N+*L_xqgJO#7(FxFapERz=YNmG zHfc*<%R^%6rV4D7zXb8UaQX#f^2oP?QVpX(lp{XXxJIv}GpXFPy z8J6|h<|BO3;*0E9?ijnzj)sZ7N|&T4LNoS?F+xjxAKOCtK(0Ic&KaQ2sWCb>;aNYz zyOy}<$jzr%7=hd&QkWIZAND;wOkcN%sl0VUh2$VUhj_WO&=h za}a97B4dhm@gV`_jFw$)>-nH4R~r@?pbnie+ScM(Kf=3E{`|E|JPo_0Y4hwHhEa1I&PE(3+9)*(M+(lrj+flqb&UeM-jbdz|m%>bVvrJ=+4 zmWAAtxaDH5K2{7fbk{hv< zB5q-O0bzFR$E#7X5HO}3x6!p2kD0fsWaM+Il#%L*aeR_*sJZ5H+J_?+SA|#?w8Cdw z(reIH!T%hS=79e}I2TaoggN*v&6<6@7sF^buOd#`%{gylz!E05 zKGEqzNM?O!fIlDV^zx^nvz$M+^KbJ`V9NZhObRns+0);aaRy%6Np55=?qr!V=XXkB zA#3=)&L--7$1Y);le5(xHJ^; zW&FN^>p5Ja&qwr{E0HBm)a~>z>l;#~dD^Px>4 z%XCoFx`;~JzfDE!k10<|;#6}=urewogL2o*tCE_rg7}4W&_T&DkK_he+`dQ0w zC+>&zMZ2F3b`QR%Z%J{$`ro@XEsVWZmq|?U(6hlqcFeO96FT0KmZ;FdXM+drs2+*J z)-fS%qMcO3%3Z)~^4#Hf;yk+yeE`I^$|*I5iCANi_2@DYGQ}}AnQc7)R{|$hI0YZ$ z&x|iL1t0S-#3zK&|71HGN8xq_(q9lVCI8c}k$?{9qt zXk*%i&K?pth{cNX-snlTA6V(;#|`5n)LSzc@0H$~5xsRp^w!@pROziFQ2IupxBgc2 z)?tIf&CYP zUF6Kg-iPgS*v=>BvGW?ev0Vy##2VR5uJ|wu$KD)n;9~cYDkb}*BgtF(%*kKP26&ZB zB<9ABld=C&C5*)~_bOYeI~lJJm0*y8UV_85F+0qf6%zU)kN1bVkoCdmDr=TWpe)Wq zx5+x2)Ur-Pg1n&_==eleTx}qOQt{7sN`?qmyP{UJM{@Svb;BOPh5XOVX9|YShd$LI zI+)BtKA}?EOS-_Xk1R};j=+l0+-C1=pwk5oLjMf5zySq58M+{B@#IKa46n3C?yv<( zb&U3b1MgK_NWxc-FKXSPVuOD?n#fzfb1&d(Q&z${gP9wL zReO2yu4|YSIJg%b6oZr7H4n{0R1LRe*Dubo9*9@Tv2ZkE16XdB|4s} zTYx}ztvO|GGJdFYaDsw85MNdE;$9SAn28dzh=;LCgpAKVV-@BeDm-AUT9T>d8@9nf zKJC4gfWqEN5T*83LT(ojjqI)DG51izMp*9Z`7Ad(kg(;i5+3Ar{~WJkIN8S8_;K0e zERQ!=1}C1Khx>)c2CLMDE7+^Y4iE5Z;D(T52S{KRNa#La)mYvdA4clB#T+On!LKI# zb{qZ@Is_;O0<3P|OZ^YZm>3;_GXA!mntYd<$652UvX(BAfz=mrSK~?xDjiDUXxOTV2|q-s zPFu(lD=jbJ$0kl~1zWKgZt`_Lf5%btX!;4pN;vd*>@=p1|1E^Mtj4BOhb?B^!t^7E zqcfN3z?j>c@rYf%UT#sPCftg)D|!P7ki)gbJPA8OW{snOqMuo+v>hiorYw_^t5F$> z^sqGZ;BaOhy|~mw;1JpW*gO_DHxbD0&;rX%I4k113)kmx{Ro#+e|k+Vm61fLbpt4i zef@zVloKIvJ-ZF>d-0CKA|PUAH-Inp7u}rcsSW!qqT~y#g4Vr3KCDxS>LLOsCwoXb zD1#7rQ)D{9F3s9 zsbfU<=cOK{legHA)Ugrpo5shSVC0s4JbUCT+k5n;J@~YCI|3cjqbtjgO+0> zkarA-eGCfjIXdJqw_iECB!CnDk~fy^Ma=%Zm}O^-S$@Wt+9@%ZU;<})9Ylv?5BMEv zoS9c2pGBQdt`Bdc7b{9g7Ar#67~{!j7{!IO`H-v1$aBGfU7vz!Txxc%)GU^;_7W2H z>&Vy0vS;zx=9*@y-LYr!{b>6cAJdU}wx~wU*SdR5%FpndC@~|M3uf6zpJ_b4mf+PL-;&pVy`mrSKMSvBM z#}lmZP;WoJX1uNse)^GtU_XQtGh&GEKycK4!YVm(5?FvRMxgp!D0zapfy{`WXc)kk zvvXLSr>R&3%EkhyJS^!eQHQEJWlI9Ig;BUn%lEs-)BO4;E7<5{$HSf@&urjm1l#+i+0 zi+WpR9kxTEZvbvq<7~tgSzob3iD5?LIe?zoINNH^!!QfbfyTLwUhBR*4Cesa-#7;p zZpgzhr_s~sYb-Fwd}jc^Kv(#0wfc z*6(FCppse>-UGnkLnzl>P~rlfOMm8lu5>Si-MSD{qruYMcpR*0XTTf;46MuA(OO>g zb^={OAUpEc8z-eb#ekmYk6I@shF^alSck8%X9tD`E?9|fJylwdJ8Fm1gRa$hhB|1J zg(d1nCkhVg6>B7DtpqjyFjczVecIqY#oVWj?$ajqbZx3M?uKo4!?w6#&F)jH8@t_o z+UY*EyKuYQr`>Ms9ye^S8@A7V+V4IcaN!QRVTatOZu^NmIgDrFNe>=UrN96-bpC(7K+7k5*tnl{ZRBxCZyaTn~{<9c04rU{0 zptv80AaZArcc7?$m4{K_D1>Q@hYmtU#$_v-)Hrsd2H_tnB#+|_df^9Nk!iCUeg1egCx{LFIobv0kfF0e82qokE*rF}c{K_v>(ef}ilcII1y))noge|`TNq(zAF^5fiiIN)0X}EnTHMKgF z^(UW3H2gaNBbJsv@lfmoSV^$28vB%z-vR(Si$x)Bc!q9jpGQWs%y9ue4u`!GfAWXG z@GR6{IQ50R{l1oGgMEO2(DeJ-pFjF6KZ2UO?FNcOBI@ahw zaI8Nx_WV(FVEv(Sh~p_t?grLDI~(m!oDjWlOdiGv!4Qmv!~LP*fuPkNvY2qBKQw}b zpLY@t3zz^9-Xa7aMxeX(hx!MCgZ-gFCWPKKgoNvzg#7|00E8bT1RsVt$4W-~vEZzB zH&`$tQ2^3cL#IlgJB>;v@=z&F#)lSok?KL&sL=te_o!aeZvG$js-6-iHU-MQ5$)Uo zWq*jeWP>Fr`amn!2R`ygHX-zZR@jY|v3+{1Pb-9H zZlC8UL54BXf|%#G&t4ze=W^VnecmaE3fm{}|0~46)jy|e|IpIT(Edltfd4RVs{OwK z{K|sC^_n4Io$h=0|M@kUBdyD`N1=5Y+lS8p|NS$-)08qD{s#--asDRcBW%5d1vxN5 zwgzIU90#Ye{&6NOP9*s%FhOWIgG6Y=TheD>6SufT?3Abx9z2Kf0*C7Y!zf(<#?>jC zvL)Y(jqbEKZ4Eb;*i%$ku8{=e`KTnxGRc@EK^P41NP>DC)3#PX2f-=4G|QXC5S|T~ z;beZUL?yFZ%ndwYmkXZjIr%AYQGonJgyCxOnmA}S^(E{zQ2jF-c#_R!Fi|QySKR`! zXBTJSKMX_oM)spl)I#LWBix+M9V4u?FAi#9>)YZOjMBrPs`v+f2>)m{e!IiIahrW2 zq&!PAJ5cMhmV6KbhHtSJQg7qO2n+lX2mh!&aYbiLKO8L1pjrBGxEa6I97Gt8HWTh; zwJkV>65VYUr}^STr_t=u7cm}=!uVhE6qrx`#^*lEJ*s23&olI%HbP51HS+KYQFr(ieVH0_b~Kv zs%M>rROs`RV+QcGjLb*#yeXz((ZV((G-DjbY6hes)(HcU{rLS{=ppwJ=TicVQUvv* z`C8l_eD6fX7KA-l+RaH4^rnsxG;2<@^Mb6YLBnM#u@ZgR?{5asuB#Ais!VI&6x!_wpxF^fo&DMvPLkFXFB1GJAa!GPm zSuHC!Nf79v_-t;Hn9T3Vz4hSXfO1=PQ2v13=OUral;S1Jw@r_?nM2s?;Z<}O;mc5Y z6iG@U8l;x=DT)R>I|j=Rq83fboO-_Ge@D-fcbr<1Y^`9DlB0Gh=WoY1oKT3PFV0YC6$_J|796T0lwuYm)v6L}q}0vt znBss<>CSHpr8s{^q=S@BPU+Bt{1xv!?KY)O>GLawnV~*ZndWbsw(^7^C-EDrJVBeQ zymS?^N&gN^NI!{N?BKa@J}++cNTWt8EN(2eA7iTR$I&K}ZIt6M%{dO7r?JF=Q{4sO z>=4oS*-2m>2$mTfNsKsl&0O|H*M!h=gl-hf6t36D?4*O82VGn_#uuixC9!EsGTDP- zMP8Rcl0yWF6lz^ULw-tm24={#J~%Zht(>`V2fJ^ZVn- zO*iKs#Tl_ayV_PPWXMaX(eU-p*uls+`E(m+yiMYKM`(F9bZXadvV!>KL;s)y)%g1J zsEmy_#Om=7>pmY7$m?z)1<+;H;S4J9_aBx(nN`B-Ou)ujR-c5rvqY2^+}sW(*lJ~* zr-_HHcVaC*9NUN-tlPmRShO?!R0{x)_1iZ_-xim?uP9Oq>APuK`j#mA^cuQAqU?0( z=BjmXnZ{xW{;cIi2HI(nY`&~*ITE1_QNez3S8XV)HVpGOHLq$S;o-c-2` zo^|ilP)D#*`9ELf{%)9oGRr%c^XEOC-5?}$dFNsNyrZ*+KUJN_`D3r;L11Gi@NWGV z1U!E&?<+v|4P1wC{Tr@hxK85gn{+ASl>QbQBc}JFy{ajI8^;IK=VW_p!73i&-KK!C zp8p(ek?wZR2I<>^j5k+Ih0+w1mY9O1MuVS-m zKj_K22!u}&sFsJ13&?}x5rHFBB1;nXe)15$Rk1Ms7KiUk!p_?BLiENvk#1?vUOKKr zJ1&nkgJ~*0V%`6!NKd}lB7gd`74c*goMuiwZuQ4DRYF2qWQOa>yc^838M$%?R_|1= zW&^FYfnZ02I|j`Q5GrKgI3|d^cwft(l>Lqa_re8)DFWT+W_Mfuxbe|)a=f@=SW{b^+Q!^xhIj3@J@Nm7sc zZW(D6BDUB>C|K4P)P2+!!==9XV9F<#Szlg83R-m))vl_0VYh7cs~s)c==O zk1I@E)cK2qiRI_+6f{Do{9JGUi-g0?9SOB$uo?X_TM`;nA9~{ktN9#hO8MO{$6M+P z`cUy7`p@sFg)xI)q=&K{rH12lw%p}%X(>2{K@<9;?HL6JMvigH5tG9dj5sV9)CL+2b~D6rqOz?yaafV) zjwiOTIuE7`lFr@;lS}8&GwRUe7+prI>zCx{8L6&Yn4@QjL(f8Jyn@%(XKUzJsl{uA zsjN%aSrgXahR)Ss3#zsrKatoH+*uQyOauCCUre0M&XWwKl|%z64pdsK{cGII>_u8` zcZpb8IlEMbKNyEsB?U`pSq`o!C zaQh%!Xhmk-eD#q5GqTCR?p4^p;!98}xZL4b4J|ns(J;C0G*xd%4du*A{FIe<5{ zOPwiiu~RZHI<6tFDwVRl!TN7(io`roSalAIj8D4=lYyq5WV2q-0KJoZW1W4pG6_dK zNV5C5jTm{jLdQZdx$Qh&NmBY=atlGq?GL6vIE?x=Lc)2HA1ZmRv1&b974kOf)@Jb8 z3`pgAa2pl}xM(ksC(7(vc|vTlfu=L^qQJ4hJ(5lPD-^(=U{bvrKv zJM6p=tjBpFw&TtV!A>|Y1nYHP2que*2#`!=mkD18)}Ie1&B*~9a$*QJ?7R@0<-9P{ z5$Ar9;Hytcu-@E>{TE!+Y#i!g)ah-YQ9RJ2caqWW*s~uHlu?~1*JAPdpk%i5BH{n zB~1{QgG|42$7&$ZGB4o365HDuJ{9FH$USVGQi5zf)eCyDdw>fWXYj(8wq9!0?v;{F z8E;=}4p{*@+&N@ITY;|yO73c@VEEA&iyI_O*y>tN@%MHy9$#Ma zSa)B;0FMOdDjC}JhGH~_qyMd%gP>FsEN~!84s=R(R>4Vrx%uQsCC<*@FJqM5^?zES z!m)4MON#-9`!&%fx#6>+liNQr$Xa`4)nASyWcx#h2X{?4R$I0|ANB}&k$Ju`3*VLD zniZ^lv@lInEJvq+*(Eo0Ls=>l@n)sdXq+nDh`|sK6iu@j^~)nJoQa?!pZX4lReL`x z4xv~K>C3kgP#>aYFX#Vin;UX7(6IH(adOTnh<)VYv2yOy75#*xtcgwp$3QlXYVnI? z&27ExlA$Uw+F(76Y*A12(?Y!peXvWwc?9_e$GXCDX`#> z(*%~Yz@1SuvfkjKIdC@bK|W3p4!iytNU1KR-jlGu-#|?xB_YBpsB_%6gN_SZe->bz z=guC^p=C@0%VoC^%R`TuZVoS)gxpuftv(E`idg$^Re}TzIIfPOm-4izdcb}Sn6@Z^ zV(6$2!kCgOrRBoSywcfsR35hexJ+P?ceQ*b0zTlMh0TBpj`b@$&UW<3)hFzKXi;q5 z_IDiB28+wFB3d2tV&Rd4$hf(^6IE4XUAag9^3_i=FEalZbrw$b2c6tg+TQKR=EBm<;0yoG}2dP2IH06CamY zmJ*X(C3GVfTWBbMlGxe*%DCxJasTTQ>rq?c>`au&lwp0ILUU6S6@HkGV{SvA_!;g{v10EFHZ299S zQoJRJvoS)5ov~e#!s<2`yWu3`iHGeVM{;xH4RcT%pe5G>$TbsC0+rLX>{?=eBLR1O zD$d|LzZhb$gfFTJmMgqSK4pl(JYW>#mCO(2qmLYDrWrn@e|NvfQ=hBCUBqhF0zNsm zo3DzY>eG);l?bfS-j0|?yTwPWJGV(B;*Fo4`hO5?hj?u}5rg|xun zgtMXu^_^Vec`9UYE(CKc!aS4h%>8zLbJXi5`xUA>V{f%z@d0bTHrTINAmQtK z?bmbEE2j5S>T>mZiTzrkUZD?2?78Z7W;cx`wrkK6?>mYE_HmuS^$f0;aCuNa=i#~( zS2eCxxITm{hU;Ej58&#+wGY>KaoH^^*Po3nzgZ4$!KQepQ$m*LNpWlh55?>U|J~E* zdVlxzkK^!$g&OYvUIar(-vYos89ZI|Wbo;#CxgG{98bR*pAR}mNsx(s;&2WkpzC95UxvpMB(c5RT;s)^v@ZL)JHwsZywEZ+x*k%Bh!Tbr+B0xS1tWTiSCn4 z>V5JNNpz~n8X5HIPvJu%eVMIj0yxErZ6TE1fsZKsN9K+vgTLT>S_Nm;J{jz%SFy@E z6M8cE46PITF%R^u%-=p49LxiL7fM-`1FmubfscoE4QI-p3_cIDrJdf*Cj9~iXP$N8 z9)L+pg?-?~)=xGrw8EE(!bz1Gr|vW^eKvwY~ns>O6C4l6Z^2EL;@clzvDO}It`VFozTr-Yq zfqA$V;<^ggb-1FqHsHE<(v|D4F~D_M=z*N^dAj#4(2iwbMSs-Ev+lzdn?4UFdGAXP$xk$ZcSg@@$ zEBK(_2W4oPD9>Tbv=Nsv245O)us)=4cS-AP4AkZ(w7Q>8*KfE+d~k{L&jsCMw* z!v~B`zo__uZ3eW&(F?#XcFrh=NeWGJU`0-cL4LN*Lo+gFmayOw;nI_O%@8$Cee=*K24lw)J zQU8!Dw$)Sx#&4XVi|ELX1n$o$>j|88MU7B-a$znYo*rs3-y9} z68X=wf2@X#=d@4TenEK)TSZFzSyyg#J_->MLGi#cu!Ice?3JZSt!xplDXBwkOV7EO zM<+xeRp?)FT1I)qs#Fp{bB^V+pSk0A9A}cr>BiVEK^p;kEY^b5)~^+p@+a20{!gzF zSok;a*PPcfFU%)b$1^xvBlzm14(I6ACzA3I(ll%+dPvS`X zRf*xxnNQb(Xg46{ln!*!h%U0#%;Sg0e z2<_88a>YF(j`9ob0^Nlg(|rxrz<`n?%-Cqxhw(=2`eFk-qKd}^(44Skr^#3FO=mQ@ zRcbdwz^Lbjq|Ror&ZrBRWqc5cmxm@CICH*T7!$sEVs(+uY%!#S&fV;g(0RFsworl? zCnKV(BeB2Xc_j`<7h`e?j_$w2=BS93(?TXx$!xxqiJ;b}bUY4TcIb9pJAJyp^-mOfF2{e18CfK%QqwCu)$D>P{R?f)0kL_ zv5qPRk^P9uEwJ3)m-!OoKqIPtrO+6>1@60=6us7Ar7-tDu9XUjgGGCJnJ6w$S^3Nn*V+ z5BI545QU$R6&Pu#~!iWr}TC?P|b@Av{4?`cTNJVkSm!imEyZ z9{Q8bbMe>DnsXas0kV85l+AOA5EC&}2M+h?r^$1A_zBNv|Du5Bir+c$-2)qbj@`ES z>c?QqAG3pfYD$X%z}`~qx~tn)+tw*HzPf$E4aCU-RN-t{t!=%; zF+#;DFcM*`h&!lKE8ACtsd*+zsh`RuK7fO*GO#~jRb*`vwk({ZFQ)o2Xq%(x*l3}~ zh!P{;NAjpMRylEIf!!opNXYTzq?v1yhQ;V`=7@+bqjdr4p_1WEM|U z975aWVK~8&rKcVv>>pl2LIWSi%nN|cEet&o%${^$0qCWDU3J6Wd*2Vr@O7e{r*M>I zKMv2xysz7fQ;RaS-D|KZHFI_M!mr}zitg>-C=O&6b=QK{%!2N~ZxMJw_p(`dJGZ-M z34Z))P3ymYF5R2T`5ItdfvXC|C7cPNI%xz$0K3t+N^Y;xbSZ znzDWPRtBRj2GdbvE;j@*B9LOW;&eMA$5*(3e|%AJR7?^O=tb0@DvkV&P&xev{Iq+! zs(arBBSMwG^s{~Hde>U-dN)KLY|Y<8jpAhj#oh z=Enxi*KtF-ralrz7)ifmN&jUeX>Skvd>3v6ACNbGJNjU2PDeU=A*AL;A8gIl22#lg zwKe|$zlfpZ%5BXb?4iW8p#egT$l7%oWKHP~I&*TzzVE6!%&Xxn{HF|g1fmc@hqje;n*7!TUYGNy-A z!+pPPPgjL)Puyh@a{rzsg;uj~1QIzv#fs>Z9oc3Nw&Pg0=#TBJwyG zcv_1C)Eg|AM{tS(3VDHYJtle-1;Jl|Lh%wFi3cC2;Nm!r?3@9&Z4XER)`%@w0p+F? zf|3p>&l*rdeRczRGaBfBhNfvCnI12KZO@Ur40J#rP;vo`294Bv zC^h?JoIde7q{0G`Iq}5*Mu}N*u7C(@7?~_B)m+^_LxUl4IG*;_e}V)<;ji(e>?Fy5 zio#3rv>%~svg{jR=?HG8?;0Nb`Q~^`4QUv-CX0YCCNLZ*G z`eX<3qnPsTruH{Y_AhWvehVjI;}USmxDs%kK=>96T_!WnCs?>dp8X{y|0m*J!lmN6 z`fZ4Maj|s&lLJcrKc1IPxv_A`phn9(@YakHC*c0O{~wh6vWhV$SQ5FlpoGyjO!1RM z;}6iE##Va99sC3H>lfpDh@XgW9fD9Qg5@c#E6{8W(~4NaG4navbmiX|Clgz*I%xLY z44Kjt!!nTBi_+SU6i>`5!(g=-|5C(y#e_HnrTkSkZ{YM9bO)vQRW@DdlQS7>GK6!W z7}IPe^Nb1g=CJykyZvemN4~@a^d&nVI%y(AVMYd!q%X5~e3zY;H zKI)gur|7EmKt&#=T(|m=ftn$E9_h40`gT(85|>Wvsd_wPmoTA2BD;UR|8jJq@?@Y{ryUP{CntCCk%(qY*rS z^0*Z^DmOTHETprs*g^FdV)IrcyQ-h6+MP)Z{A44+CA&;=;hg9_e1JQhWz6+KMy^~Twy`kO2^1L}J&kJ9hhf+}e)Aq{Ov4%7W<|!Hh&O{ zRrWppE=D z#pJfFAS|8C1@;hovOr^!gU9-PY!;;Qp|t}^DoWoBW4U#=?I$#_12bBGUjGqWZoToL z$xcpcA3;nTzNWKdE7~CN)%*Mu21%)|ZEk~rPuJG9LG-R`_qRd*q-$&1AUV;snzli@ zdD^f?MAzlIut;0ogUS6q+c`VFqVxW0w!7F>n6?!a{yE-$WoaeWup z4{(XN8gNOt_T$1?f?zX~k|*Pjr=S1XU&^>tYub35eZs^^>9LxK^CPrMiR~M}NJD$h zX#2QPbF4pPvhnGIeev-rDxoUD1Zox&`_ifXFrkvsQ~IO*f_ln`@|3jQWZcStJ%ZIL zdSPD=zGe)pMbx%n;$Un3D}_~&WLk!3tU`U%PzlF$M&H5I$#!p$n2CJ8p=CpniKe@W zfk;mv%eqro^PxFLC;6XYl0SvhdT_=IsgaXwvdWPEgWxE z>(S7RK@#cIPYp5{Yd*H8m@O)X^nZKKpxoDtEF<)WC~OqH{{u~X481WUkBxK%AiCp1VzoLHyvzf{53`JP>B9sZyM_@uUFxO%DQH8C5u&{~ zj0ZsbWt<{7q!(DRVZ{mwyaR0o`hVkN#^Rn-c9;z*mBFh@FSU*25FKnr`_E{Ocv;bc zC>7-x88?X@uq&&tT3%dk)K>&GFd~vf{HVCIW8$dAvHly^mx1x8Gt)`eRH24gt@1m` zxPfN3Xv2W0*yxaKoukjw>8FeO3CyT1u7duF2)R{QXvM6JG(%Csa=m(b+ zgyCZ668*2}x9YhDhw_v3aHD($`>{xp&s*anl;V@OD z_)P+qMplxjQ##+*J;ufgM-I*QgYf8-u*o|C84zAzO(l>q+%GZr$mJ)Ez?bo2I`$!K z%uq3kwFPB0Rj4u(d!opPV1lMte@3BH>_cOV4G)KPoiG%Y%MaBdVO^jC1JNNEq`~?d zaM8|UC_1QhRh@ve3Xrg&xaBzRa`}4(60C-f^@1@EkgLSrF{m+xX1iSe;pJ(&MtnNL zIuCn!$eZFmXVu}xt#bMMMtb;bJQkT%{Ob4G>C=x5HsS+Fb*Qx{2p!`GV-mH;6XAQ& zM2T|wM`IFo#S?YK6Jd`X3LBQLJ+c z1}T~}?Jz8$Wi;~$9yYR($2r4)&Xw~=uo;srkBt0KtQs>7vy;?m^PkGX3UVWPtZqi-e~*U$r%;#0`iO8KHwq!Aw_6`8{eP+?ZbXHWMn zBiVlyLU0aMfrteZsa}ok>2MA&7oTDWR%HvN;0{@$dBQ>*)o9y2K{~%lxKRPY@LHix z0vxsghtltqvucQ0;?jZ{BxPp;oR;>(q~>%C%qFPjqhMBw*ko{uS&E%fSb0y~rG}A} z!BY`OdxmH*`whWEGa+8}G+V7fj~c@eM<+!ww6#oQ2@NdgiHj}=AC(sjb`#x4KCo!) z2cV%mO*-;Rk-IL2+~~XsWAnl=<7<%fv(fOMAcs+w%1+2ZZy7KB4wf%odKe#^*1mZ; zaseavNM15HtRF=-*ceAK!@8Fu?;vV^Xf_VY0_VYO2oVB?kB-hlBV>+~5fVL23o}?h z^(};uHw~mgZ&PVbI~{9yquVF#F9TBG6C$7yS_Cyf>0CBMoiL|@bBZcngGA2=okteJ z(NJW-@QOtxB3b)@U=yj(^l}=&R~i}ew~|re{YRq>TUjygFjn!{kp{s5RP}UFkg0*~ z1f`!r=Jx84K6@E@wLW_x`*pG3BKBLxe%<(0;qSquPD>{d5R4YoFy4=U7!J2>OQCfe zf33xSbCTJ)Jz1mw0p&?@{6)~ zfs%3R{wYS-d%5lO5uaYa5{mx%=NxAH8fr8q_nH9go6x9ETPr=)JJwV|h#s+sOJ$LF zF1QD8wx19m=Sxvvg@D&9-8W?Ns87OKuNPfcf>e>66NRP*8O!(kNN|dzUs2Mq6iE>8 zMpYn&SJv93kNY)?&t4lK$VH1R_Kn{}(mG0tM!;&nBcyU}weR{-(8=tVK^NzFprOLC zjVbECGw=+uXz`g>O6|6+er$u)7u*YkvA>jc6-$N>!>5cy5IzW+1$F=tBc+0Ge#%_naV((Fp1N2k=JmlgZfJb*E3SkqOU7x z>(>=@4i&V9&()ppi{o|Csy+jukhhO?{W!wbIVf5y)x%ged;5+cC`JccOFrr+(0D=` z?zR1d%npFfvp6oy8)zJ=R0}icskqzOX={EGkw(MWxXe@OR=??B+;tl3aw^H2Yu2gTyVuX|A*^NPW6u&-sH z9CQ@3SUIZEQSUMU6t(rTj=Wi^2Ij_wW8iggBAg<6lA zj?t8n^dpcIQxKykwf{K?&(*`&W(h)Oj;S=y*ct=C$x(o59yL6X0Tes1cDZa^kWM=) zJ@`hodTJgTHV9_*=C&)1y}sl#e^?#7>Upzm*8w>+>y40VIr@=Ol-SE>lr$d||Bkr` zVh^zVR@t2qOzB%hLGFv))*F ztT&b_BvK0hOw$s;T3s7(XUO5~y`-C%6~@>F$_ZICoU=>iKr&Qsl)tQ$?u(e1o66vH zWurMDLS*y!5}Y-&#b(1y0aUzT77OoWeV6C}?z5yw9?$JTfzQ+QXqzEvOx9vK! z1?R+g)C>dp)E$I-kXvhP)x+$5Q0mLkZi&j{OQJY94{RVJa9WD(e~EU>mjMwx+>nl)P#Jw| zXf0Qqu0t?VV|^N1-&>9gsCkmcQw3;uJk9M!lC9#@r_JIbICK(Hn!sF`O#Y22SbWdT z7b6?4S1)1^8YoUTcbaA*3OjepBan^*ZdSqovxc&CfawHiVn+fNBu$_`9EtLx5e*7p zD+-km$jfbK^V%p80j76PZo51Bht-^Nn<rusTc_1Q<5(djSMihka@435-=sL+L)A1UY5mIS9*dI4RE4Lk)f_wXb zok=Ox@e-Ch=~r2zuL>(qQZ<;AHCd3$1i|-J%H5$}US5&K5AL-fMwk>FwSlbO zhFmXf62tX=lu%Wm?!qX?;D~9y4D}hvZdjxAN)F>;C&7yAd&pZbCa3-SSAQxT?71^o zY`yr^pGxzR*-|P&?i^aZKh}DfJg3@I2@%Oh*U3G|hze-`>Q93`mV@#zrlT{z4VLJ+ z`)@7PH*x}Z+iinK{P9 z!hJ0R;?(>F+wmfJ)h|FmkjrhvwhTZYaZeVFXNxM;m5B4o5!T?ph4X^(>g@Dxm?9_n z7v>d+wrVhBbWALxxR8iS(T>SUN>Lv3dx{ZhqhDlxEH9JY%R3G^W|$%L?z9QA*wG6 z@5kreN=f(k{DUQqob2ft*8Zjj0aTm%jIP^E;#U|@unj>w*?oN8bC?U6WG4>vC{m6B zsvZQ;yMcEU-(MkmEWTx5i?4nOz8eWNcn#otFX1cT{R;T%!1rBD1^+#KXO0D`P92Ny zX8<%7-$xO`=!^Dl6)K`MPE_3pe+J0;#pylgFB&Uq3_IqFtB=|QbTB20O5m|AK)tA-MQ(?AM2q7-F0+(zErvAi6^R>;)P~hna8l(jpy|{Eo0cW{CQ}%#f_sTRP8>qb&He-SqP7r7Acz|^RAq6$29|rG+{#vPig2|W7+U?qMdj9}OBM(+z zBF*NvRAbE>rZfWt#v)!viT-S4vdn;$5nO)=6JoG=2HUU+Lg%glaywoHA|Shv25{ry zVIQwBxlms~CqNJ9)Khqje4?JJu!{WmBjqDArZvck45VKaQz{qHr#xo*pus@!z=og z12u(r9Hyxs4)>AW3}ZHJyOZ2%i3?Oy=YmPC<4c0$Ta$vJ;P{f}{ojqWLmze^`OeUR^a3We@O7I47N+qZD_0AnSmgT`^x# zanf`WM;^aLDMiEj4hxzRvzuHj_0O|C(w@5?(z@S-EQc)zD%6{i4q1IB2-4C$B-cto zz2fuIz8oxYsGa5>&#TEmOHC&xO_-Y7o?m0N{idA&E+TlAPPe)N133hGi{{ClVp2!) zJf+l(R9hwn-DaiC+-jFY2BBN|-2H%7-;Mf&6|AMpLYo<##gGlvpdHCwf~CV;ESFdd ziHZy5TJDa`iG#;G%<~GR3u_uC$YI}_$7%&r3&01nqLi2!$+Un3#!ZgEC{uGB-*VP{fWdTrHPyWq#Ufe2o)5a59X4h$>XH zgL0_Dl;gkGY$C#30AVcilpmRqp{0E*2C`~(F{VauM{`DKZ5e3HW*^}O-_w!@-^&-R4HgLTP+`^TIqHd`)t6JPet_zPjBd3Y9w~dJ z2Mwh9(gyOv5~}92a*bVCtH;|0N{*=p& z!Q@gb%g#AUhlxgJl0aJ3zhjV*_Sv<`Mi^QY3w{xjQbH;!PKLGReZo!nEf(hDw@#dd zgvbtIn!21pfUgQ&%oquU#fGj;7!#DhV8UXo8jDD4i!NNl_!*D-#&o#0b$cv>9(6t= zhP`%mct;n8Fbo_v8op>G^$M{L$OaIfNxBY$8M(HtYsxFXTTGYB7DADeW(ft$u4x?~ zbWLq7G1pReXqyW*RlT|tjiaR=cvZSP+5Hh?I5Y;RYoymUAud6jAieeg9un8_=(v^==qukitZp7YO|^`twC^N6gmAO^@5lil zJ4vg8o%Ip$dFmmM$E%GaRV z2xQpe+OZOEa=}@oSJvXl9~YVP0}cIV{hfM~AFLC5)HlEpLKOI0Qb+nyCj-;)y1sw_ zjKtNf(yk|zX6|udDuf85gc{oTC@2(+z9ioak?Y?_;|h+v-i7*!17f-t5P+bI<}es3 zPMYn;i%FVI1%MoA=Q7*_X{1}~Of14Ltzl7KidL+CRx&KvouT#V;K8_Tx3%d!6>VLz z)Sj-X#%u#mbkN{2xvgAiua<|Uj-l+$*3cI=`Hk=G=P-^d+ssA4jJBGNziogN*F&}z zrsqh%QOUfK{APHDXwPZY*#YPoYpmjy(0T55>HOji7T@B#eyEYOq5Avc*y5Lx!xtn2s@Yv^rZ_f~b`7#S9UPqYS zs7+Vy=w;C?@&yBLif5QV2+RSBmv7?&%Z+DFzKsto=OLd!aY#9E)&zClySC;gd<3#} z`JN-3Vm%V5MGigy0L!@m04(R6%X#tMAjk)TwwBw5L#=pTKil7k_4@cYeSuZV)$uo_ zsI4d^L%V?`vX79NQh7PNzf2`N_Nmg$5Kn<5btsS&D9VB8x?hJ=f=ZZ8UZXi(cInAhs$B!F?6MD+Ej1F9 z+5MZB!k?scFE`9W;4erQzekFXwO0LY7NoBo>2s5*C$m-$4>Z*FIe(}(LGEG+v%8dK z6HZqs*qx94p^IpegU2STo<_aInMh^Yz)9cd(^+?6U5cd91ysD96dRwWPN$Fh1}0I? zU#%?sF(qysQp%=CAM~S(gwAodN#`7muT>Fej#1nww>xsZrENF!}k{12wGb-t12=}JWGmgrK~9RZCN}k zPLcn$8R;SVMX!WtiAO#t z)dpcAA+I>c$>XxoJ-&n;Y-pHUE)6fBotJ;ek>NvNGl#FrKjZ_Od0R6LGK6Wvm*~G=27br|Zii1ON#AWxul799Se?zD!RP{MG~0Npq5KYsIZ9E$js6BXGIhQ&>RzajzbzS46Pw7Q zxhY-!zCz4)JbIBa4Jz}S40{7-XQ0F`e8Y!h`W(@@xEhvO7-uNP3f6GL$VaH>W6?fE zTF&c%MS(4xo=E)~ldi-=B8^#<7E~DKNL&A)T`uHvkGHg=J@qa{dkXs&f3KaUxVx3+ z95%;c*mLm#7bmszw}U(vd|c=gn`JZj0?e&!4v*qO>=kVcA(IZ}7pAok@1EbdP${)b zWf5I!J&nD;y3#s?Tc>NNA2*P&b?6IS$KtKiuOff~6A7$R)(?eQCx%?*PHQ4r??AwB`1`k#{iUT(x* z9&1SF?o^iDI3($e^;j*}oK-R}1ZwQy6exdca77;L><;0_+YPA@Os6I_5=yif%#| z3M?~IH)N~tz>=Xr(M^#)vSonH-BR3a3fn2SFAA3OVoO#Zn9{F<$F+FjGQOjPm10c&+6z$}1RoFv?v<_8O}U z%5MbQ!6?5GTnN||yG0xdi1smG9U1L@M1&<$-vNU2QPvL>j*fPWTS;ORCT?Za5XYzF zk5Kq^qA(JG4zW>=IF-$u5~c9+Q5443T}z-SV+gE18=<6v95CK`WtFE|Ox{gQxHhfc z;kcBwmix&@$x4lQ9t|!dnves zWc^hC!=xtHl~O*C+*!)?R)VXT1=RW`7(rvE(|s$P@AI=(UlX{Qqv`yuBRQs3LbJH zymQXZ4VJ(bE0_$uoEOrXG)gah!M7Z5{4)&^^6QY9K(??MB82OFW~I<^H?cX^B}CEl zjG|u{caqAQus-)X8Ir;{vgWlt>_!l4TaZ6n zsg^y&v)P(|gFNyUUioQ;0}q|q9g><6idaIuR?A-JIT&56zg4z@v2h-3xF&x!w_$Q6 z*yNW`0<k^!dH8Nmu_eXgAB3^!a&z|t!r zMI2Inad6iGR#Wj1tDjEZ*%(=O)PQoclc6n4?pq342iVIE(*s-hzB$OudYT-Ow!&^F zN!kie)mC}2Gh%Cg2c^?gd9{_=kbDNlK7-Qd8KGfI=wqv8qg`_9khs8gHR)V5*9%U~&Y%Og7h~6(oJnC<61i`Rh6?8Z%AKa3opx;&v`CHE-iLSW0 zfP3g=su=Xm37v(kau{`_5D()P@$EnXRfO^rBD}L}y;aKBA%73?+E>ml*dv7krB<52 zOZdQQ{szkpB^<_KUU`UGPhh+@U!9NbY-rs#z(rlFmseI?jpHu?Fff6AHTxKNO53hu zH@GvDCdxzmiegI@VtBBP0gd57u3FAl9;1Q5`4!eFawn}TW+>d0)+x^L`egHj8!BL? zBYm4QDTPq!WANyE9f>W2{zWDMri99TyYtNYrNNBm<6;i_&PsEw-)R!Lr6t;+^Q-mC z$!a_iGlYg|%bH(hwf*=pWT)vktR=$u$ig6q{JPha2YKh<`Yj4~6Uc8E)Y z#p$gHvc-9LW45z@!}Za${p;a2D3F_%BqqE33zJO3xxi9F^*f;bQa)hGE>FjYq6WNl z&M^dI=+65v^y&+?q3ZRw^#u*l`vcMYGIp;GgS{(gN6Ou02w+wR*-gWgNto3%OqqnK zO~aH)nA9{(nS@lg{*HdLI`>Ts9xy*>8s-;6)wxe!K&cRAdT0FWxcB*aASJXS|+2%2Xq52w!B~(p)Gx+eDG9Pkxf+n;pw0X1jO5G;b{(}B9nNM zkqs7dNdU(T6>$0sWQwHE3?#HcVrYVSuG4FGF&Ora)I)NmUy4tXUnueD0U zy6{a{EM*CEl=&NE>+=B&&hVZoH9XIm#EJE0^f$Tad0urPx4z z%B49uC^t+hsOTj90%ZnWtdO>rALA1kzrf#PB!{vnuyjaXZN}m6)wu6RAla|R!qD>~?KD|=?wUNJu1;;9-iY7Ms2DvcPEf;3E)y>gFF=xim zM5BDwr1=C}Pu4pj`G}>%IlO_#2>;_vAoXA;Rh|e>SP9aH7U>+n?uIi@!B2emOh{5Y zU#3W@k6UMzdM%bNJ*%aE2HHlJq9S@b?hnx2grB*%+_+{PfqpMJSYmE1H3v%)0JgO> zLF%wboecP)IB?kg#nZA>W>}X=oe6}(Z{w-98)-_AqLgB`#bc2F4SeraTrc2y7T1%w z9>?_vu5GyFqMx1$6g_+jcNKRP_tUta#=Rf+e%#OEeiru#?h)Lva(H-1;S{O^*qKFQ zl+dZb{kVp3*=GTEF;8Yr+o`mppN*17LxAHLYJe26w2E*eTLDJtpEW}Nw2Nn+qGKS| zX5lOPU=OJ5z$0MA>f@YIAK6qNn}7>aP~z>aczzn!VO+ry%d8`Z-;IVmDhFU^0hzhD=Hpt3s|eRJ zTq|&W7Z>Q92|8!uo`E~e8-ALOI}90qYR8@8t+-op=W*w8=Wyr7){8+OKj5|EdKA~Q z1UptQB^H!^R6VeFly+1dplnEEgpH{;kJ?LaCMG|J(G+GYI~^EIgj;<$yGX5{jNz#t zIzq2-gGXOLF>r~AbYLekpaw&`@xmb!Wn9kbK64;xWi8`F)m;F&gVF<{Fdi)Tvy>=} zL0~HDPM7=eQm7kT(5empp6D*S9#886MNPLwoPVj{^;1~Ox@PJ&Bh2kYcC;m6&mP_UsZ{@~Y zj`6nGc*`^1ZZzIp#@j68t;l$rY`nP(sJH}{qX3V35gv=Yq@)?4Dkfib1Ms4OE_VRi zE9ZcKPF|P^j-{l4%&i-~l+I0BH&Z&7wQ-ud1W7whG&{hmh~^*J`j5HDQ5)dHP3K-k zz`Dsz=MLb$F-=8HA~BC&B&J)ZiTs-2rHRJTc0R0bVh`3ZQ*Axq#tLl`O?y)0+YMeR z^24nwB-Mcx-R`-ta;o;gbqr?H{AqLWCKo&o3JWk2d&f6Py$;*JV2!d0Dp9+7Ek4q6 z+zSIByD$!sK8n;VNJ;Z2O>rbwlM3j2rb_rOfKWa1ZQC|l7vrP0hkr{Cs>3*mqlRy~ zKs;*WoR}qs)t6AIk^lo{7%`LdmB#7495~1OVYLdn!L&BQ+jeyg6y0w2L&?0Rmey)af%&KZ;4VUGQF& zhTn^}U65V%@~I(kSyUF30G0_&=LpY@@Rda0x4p;};@p-laAEWs!cem7$Uu?D?5`zk zhE1*IL#@RZ4Qws~Hxfc9<>L(ZRD{it8~yQ47=J=*j^$Ls{;=)E;&HQzt?Z-NL}rHx z<`p-QWn#XM?HUqGuxH~TSQ4?_Q?News8dei4I9T$vQ&A)ko0* z?V_qe2r~bkGP8|T1j_&2{AtXE%s^RVc^LLw#DsG<}a|q`vWXon3kXTI2gV!$U>7;ABfW` znG6%R*1&>p_!55(jL!?vv@fIw&4np$>x{I65Dc^%&+%C>+p<;jILF= za0qE{f)RBVtT%O7bmImKrUdP8N}*0rvqNE}a5(;SG5!QEFf6tLVkI;NEWIK8mXjdg zUM^4Dj^bD2&!@YqQIKP@>ij}jRHgm`j+bEc%R14ws;jHqK3%_=r2u)atwu*nS2Jjp zS;Bz<_adp-MvJ(bRj8^iUHeDWO3(kp@rmMuI{8=kfFk}k68xVGKfhSx>RwqqsV?xV zS_Jm|k$zt}1PhU#zXyIsCI-Je`P#j>b+pjtdDAb03NdqsKRA5ua3~ncvb|&5-QM&8 z2WgW0uBBTF+x1!h8$Q#s-}p|?-=m*Lz#rL%|9<%5;lBp|iVp{SM`3aJ)ZtU(_FayP z8bZzV>_6EZR$s)EHgK~0WOvW!VRlo)$6xywl;-#!>35*zd-!z;yiwHTuyHq^NZbc< zgnRa1DRD|Pv6dW7{a)ybKpp@6?1Y+OCGCHW(R^zR_PG7war=dYo?fhB=&z@}XXwNS zFud;V>F-hB3-w$)*%KxWeba{~v})&ZL zXkARFcWWu}V3;e?Zg|?G4HpY4HrQjDQObMW6?dt>{uYhx)|17Nx~4`RgtGK}-!Q~8 zOe#vOa;^R8AKRJ-@Y$zbwwBN7ZWgYR>NwNW*!%b%-sRKVx5xw{Eb+%A2c&@5+$KEy|8y zGK1K0dB$xmI!q3>*vSg?u^fghj61cPr3*SvCpw5J_8c>VwklCGXoYLi65CYtodFl; z5Yl`JK5Qd>$S5a(2g~_ZUQ37MrkGz%P?yG`<~LebLqNCO>cA$sVxAe_YCO*ILaDlR zvOr_J8x(lz65vc`R~wCz(Y&CgMoae{%%XbYvlwKlP*$^e7eoy?cM_)ojXQgKg+z#= zqf*U<2P41IaiBH>Qbec*Yq`3n<<N_fvWC6RWJNRK>8S{I?=ZYDF6t} zmEe?Ai!e`8d0~24nJ^J=wiYjWX>eT(qmFCX&vEigh7`sPx|g>Q(n zm^JA?@J6&O?zJfsjU*gxnCtB$af6KD-3JxUuM`y?*7^cf{e7Qdx~1&bvh2HJ+52tE zF~ku5eFyNMZ~@ARZ0KEmZ7kDm!Z-aF>IH}Y!UMuY|AmdVmM18@{374?3zm1t-uF}E z!O_=3QHyUD)BRh`^TqL{rAX%o-TNLu1UcGa+!~03J(&YVh2RyhR*Fv(OT+doZbho# zboA0v;9u}?8klLDu!DYfbNQ#_x z3LOnWoy8{*WPZCk;_yC?utzEUVF#+$rMyN?2%QH4jS-vj z2EySv6!bUs9l_6NY>e*`8iG^J0U~atg|cG%5q4vs^cd?}+8b}`Ebb=o+6|I=H>@$$ z6ydLBwq_M!eLM=Nc7s*$wz8~IUt|Uxh@bjC0c}`8As%DBIv0+0V0$okp!gy$OtI}T z9l@v>!Iz@N?E4E*^S%=>DvKbtZzo=N^b#dt@XQWc6s`UX-xcBZte>#L*sF_hgM?k8 zc<7hQFd(Oc3*na$A07$(&=OaaeOoptU8gvOVB4` z5jhe}t|q*GM%H;^8Yf1RnH$v(v++C=nT>y$9qN0S zWn-s}BR9?eQ2Y8pdyIT0p(a@TW=HX-IUGE7GB<;*#hO+YO+j_hVHpXDMpyua&+sI2Ck)j{RHglI0`An;JZX= z`Mid0gz|Z`7e6-Ne1f$L4x_+!Xjc0g2ldXN+>zQT;^`Ec+KWu+*{_%P!*V)_VsI*8 z@!7}ja#us2(;leWr*bNw4DBxf zn2nd>2)<88Y0$BK5r2M;2u#H^By!=s!<>UCsj(Z|=|~48*9;AWUBYz(on|2kRWVOX zhlK=t%+^u{!U;kuLLI0cR3sGjz1iZaZ1LatBL99EOOw78`;Yrdwt}gPK9R*)rI&=~;}e7`voJx{%BgZ2bsw zBHHTC zB>in95pqTv668pJ0ez>@v%3hu44fRmiCC+Jl7T}YNoi#$gw|*J?*$6HF5L?hT#4i4 z@ltzMQ-~qZi#4bLt>Hy2NoH_!2U_$k%b+lo;Yvss@`4tyt~X)VKI(09Gf>4sb{5p@ z9amr?VfP}Z1o&WTD@+&Ao=TQF2OD0a7|*OZ(yZ1 zP7asR=3%M*9~jG9Nw5%+V4^++^1$c^t&Fb>EFvrGB>!^GrP*jh)i^xz8i!y1Qt5)F z;TQS>B8@(I8-TDzidx%E-)8EuTjU5MJS-<>C{Q5(2o52WVH{6NG&xD?G^#}kXE`J5 zK7^i(169Eg8mck^+|Wi%2kik;92HF56{R>)cQ|l^V1>1DKs-hMHqvvCJI{=DlLBrK z=9sMH%}}-KdyCpyaW511*pMZ^rdO!N;Gva) z#@PLlqW*;vGoepm)K5@8LKjhJOwDNc2@1VG3f8hHtcloTCSv%;_6GDcKo=Kze0)sg zWB4xVrQqxHr|ko;E=-3zqt^il4Ynl*9Zj1MLu4*P1PtUQ0;0-lAIhyh`w?>aEO2W; z+d8+@cy_EsdF8>-#|bh=E(!_h_uauQ!Ds?j04Nukj64YPO_h2IzwR7>PvruH}F^RNF31cbX!p;yZQvQL@ z4R(8Lr?xZkI97Bp=EyycEk0Jb!1%!8KbIihQuhpRhOd2N)rIbIUA3F?&I3@;4enFM zBl*)1UuIpzI!H^V<&ktyM+REy1(Mj_9BfojF;8N{C>kjdC0AE}_Mr}oVQ)U$?7BsW zmi0N%V>P3P7tW8K{%fq1UYUCi$F~lIBq0Y28*I?CVb2nccSNsgOSNk#6q37vPy$5z zsyP}ZCZtB9M0?Jo{vPnW-V!JKX2UiRYb~%q&U7;<27>_FL}d(uq=+Q53k-&3SayOP zE|F9YGZNM$3+d?_lA0uBlnKmEvIG;FJk5ng+#dSTmdMi<(hL1)3*>1<^g=({9QC)K z(4eYsAO>EYNEstuSfF_2>Dn}TS{|jOAD=neiq-o+Kn9WbN*B!HRfcQbH$luw^?5{i z`?~OqO`1JodVcwk09m8@OA5zU*x;))g+X-9!_+5|iUttj#Hq4p1wyc+A+UUfc$@55 z*;%r38(?6k1H#2yV8LEwvF})hA4|yD)i_7tZX<(pk6UWDN^25eNHCdF$OV+7&~o1S zM#G0%Lcm6-vF}f%@58nT1F61YC3@8{$iXMl-O3kbam%tjnnX&)qjU?3K5xWR~VtM4EPTh|y!Np<=xmPq}Z zfKaU#%w{}}(n9jl`Zfl2KbHMQK($*v6o09IfyKUp0DV_F%4DQ*tIr^$-tI6*Gu3Zn z=~iYDqtPvGSEiKo7LNaj292Sv&Ni;sjUHn6?P6XtxYS2JyDI6?abbaAF7>D>1ORrNW=&PN*T65B+-lx`Q8)2A&jgrv3UDAPYQ;XJlM4t! z-gF_qs#<*mCr`_&x7fe9K$uyjT964Fw*pBl`AkY)4Fvb6f~q8hwp`4cF7B_<84{}P z&xj99BXEIhSJ!qXl0OVos>#s*RE)(w2iWg+qv^0J#Pq>xa0l(A4lH;SFyvwE6$8^k z+geFCQi)xK<$#7}PFAv9t6Tlfb5tmJy21>}`*_tKrh-S)lZiC|D-IzAUrF(wPZ1Bn@0F!YgQGlw^VjKE3}=|I__Hq@SqRGeZfOpC9O9_#Vqfw6CTiptVVuY^Ip8ydK z((S3Ngt&Y@G@Ytb6K<+f5C75VGEjU9vnngA$g4#bQt9tta2k&nyZXtWsGq?33ps#+ zj#VJ^!dfMJzv3_)d zt#ZKnZX$pkhW#4UL-4K?a~n|MfwRjYGPArDCB)*k*gAN47H&MWjH&$|^)CnpqiFT^ ze4m`!>}OK`*>KT=gEmI{{{ZT6xl@IHxRbtmM{=@;AW=P zZ6XF@7{|VN&?6t&ZNhlChm;qy-hPeLuflZ0pjJr7oyR-xd|OOS?bMP}|EgL1hv2rY zR!DXJO|$}v*`yJ$1k>u8flm7>2APAgmVuFnK5apH*7jt792#Z`K7pzDIJjA3_5IJ>kEy3eV zs{|ynU#?j%B+dHW(5$yR{yUm=I?woPHS6{sM1HMi9kYU=TQ9V2`#mZWpS3-_gC5!) zeazCbhTlVDo6qcgzqWC9{sMAYwh+az?Yi6n!*0^AM|JDfQN8*~NQn%+`k!F%cqO$uTXB&>2||v?yo2X_)6q83g&rF` z=cVB61JVKg*oT8hThgBsGfSjlOXCEEdk!K`aeN6Jo+F^)E7ZCns;3;p89UG>(g_>` zmJVRb!sn}f)5(oS_JL!)Zv7T@6^s|ac`x6Ti8wGZlS$=zi&_*7mcHPyd;XIsA6o&% zKly8g?8N6_>UCwc8J`K)0yc2&GW-g_Vh46I*u=uMqAO*8bvO2Ceb{0bW-P@biC5Dx zsFAEi91nku*tJftSf_i*Z^8kc()ujk8FtKbE@ueaaH@E0OI-Nl+;;f8k6L_L1?J_s%u9n&;;4&o~ygmRI337c>~&VG0BZ8=%)n)N!0h5$7c=SIO)EFvGo40)^< zcFZWPcmm$}eF>}NK_BnMn#}or1KdEvP7fm|XNQ9wjjYS0EVJnjnBi^iWi`*_B$$P% z)@(19jgx!O)BNC}VVPW(L`NW(CD>ksp|HK_BYi6jB{h99#YRHC_NEJT31c_TTYToeyO36gVadjH|9yi{3!HUZ&ZxH`jTb&L z(SWn>w8~rU$3BJ~XzZw7lRx##RBWi!UDy$c{li$0JjewmV9UGi5Fx*{25w}ut|#6b zW4VD`VdTI*VoKsi*3mQlEEVhJ-C{V>;A?w%x_=29j`~ zYByAcO7RJIwTeNXMm6juA+xinT~HPECpr&cj}9Tc+%=n;aj1`*^#=L|DcL95UhLV8 zoPJEIHWUNSIE6{h_u;DfCDTG;SN2c?*JeQK6BZ{rk3k@SJ;N)xKt^3)C9mC~yktf) zY_pROg!(3jdQ(%okRTQ2Ngt-tHb8sJ>zD-Wmi_X(A#HkUk7AvO&15UNCYYB1p@TS$ zuiTpYMjdtvvgUAz#HPIFQw)!WGP7){HY{WWn_)2Hj2X=Qb6c5Nu$8&Su$37GN~53nTuTg0!EnNCa%6MVDo36Wx6Ane z>F2}Wx`Z?Fea8iCI~(wba)n|NOCVve8ahLt-`8u`!yQ&A!5%pZ^yMzW>1BMti?4YN^e zjsNHN$(!y3({=^>O2-iYf^Ks3^1-sT$uxtGv+9xwg=&Zni`8clU2zJa4_Ww2e zWP1g^V%R6QyT8^xIRjCs2THts4xY6uD z?;pbTCax2>PT@L@>nyHhD%JlM`(*lX88lCTwI(xDpHR?qH;x%IvGX=?o+Y6EojDy zP%MGroq1Jd{aIw#O{_2(CEttn5@vorFpbh^GpnmB>-&*_;?}S@Tk}k$g+v4Km`>om zJRLg{$?*`}zClgy1p}A9gJNkB2hZ`DF@HlyMZSp)Kz;8aFI#XPV?eMYZ$|?%1&STj z-~|aB4jy3|jb7dbiKauJTu+NRxO6z>eBajmII@ug32rJ};baY|Z(yQE@#KB*3{J9r zZ4y}9uuKIe@8$@RYfiz3yHE$t^MvsQ@V7CzD0Ddr%c2Y{i4-y%ymvbXg_{P7(>TGE z-JT;2*2~uGY&J*J}=N@M$ ztM2P%b?iq_^30l>Y(gJ3n}jy|$(G}JEk z55A_2klF=A+|i1fVAJj*I<*CU={>BOV1>StH3EUdqIw#|d5q=(nbkck#@0;R;J{$+ zBpB2LvS1g62|RHJ85SFKHyQ$jd6cK`H^{(R!XtRdugQqFgbc_En5`=g;2G5tGK`i0 z9S+G7CJE3|V}yl#ga`}C$PLiaz#|#8N@@pD zr~pYwx)FnxN~I;?fpXuWORCZ!q~q%dnG@}7@S3y@#fD=7(N*0>UCj;CFHq}{K}R@D zp?GapbsKfFXk=HEl(Z7>Or!+V)8IMId1ed5Bzb2D9AayhKBNiMe z&fGzni275b4Z|oXD-=QR`yEo!aRR@>J-=pD?*nC00Mgd-C_agH4rwA*3$&dGt!)dG z#(fV^*1@fXO7T87YiW;0(XF6}Gh5({Y+u56nmf@*rhF=*Oehy(I%fR1y!1mB4v|X0z!@eKlv9gk=;7f^j zUs!ZI!?tEJ=s|<9kb5kQ39p>LWK6g!-VAUQgwerZkheO&=7e!roYBn)HpU=_ynsd= z{cUu$&D0c$#Kt$@Cd&7MRNrPpP_#QQi+*k>(AYh;J3}pHe681cL70cZ)POZ+__>OL zNB44SB1YqT;gZJ3v>4#DT8?^@+jYn)Vg16pF(`CKu0%KW>|`~epAzgK?k2U6JdDjyW) z1}n_qe<68>J;Zru=SCc@H5B}}dL-bt6C4+IxBsKC(4TL@nG}$Chv6z}h+7xJB;A>q ziGl-llY1wTK&2r|*(D(F9y{Kjddj<#O7xU=7XWP5VYpHX%E=uDhPj%@iFDuob z;clc2EFhTBQqHD3Mt=qgq6ZC*KewYZngp9lf+zJg{Pb<3W##KSDy6IglRYh)Ac80E zS(?pKOOas_#t`&Oi0ZT71l6U;#j$~hS>TXpV{_+7at3MMlMr8EHw{#ZQzSJ_u$BoH zh&$TIcs<-Uk^ORzF^1bF&~x<&#Zi6H0xKl;?gwHEif$IACXSlcMk@Cg+5s)Pk@&;;VPpI*n^KGp2kO7 zw>zlXGY9r22zDdNK~aFMedK?FB2BKsLJ(k&c3YGxQlxO*)euNRqQP3cJ=o1)!_>7n%+^x{+rureYqICqeDcDN<2HQOEuI}^9zO@zlz=InYW#X$?d z0>;V0)%gXqcSD$<=E70|C4pqD ziM4*1&XDUQi0`-k0@2KF2l{Xb2)Gxun_7;GKZLL{VembL`wN=52||iB(R8+E7jHow^)oRAoX_fH{JlC1$|$8Aj?S}_U=!!T3{+xo zy@D=nf;jGuN1~;WKWCcD`riRT$S&VUB~EfnVNN{`LzO_1Y#}wK)(2A^`LEbXv)Y(B zR>HE38RXkugqM=)GWa(Vvde_5GGSVoa8((zpH40lf8eugS9K;)>(laCQ}x;E`$2+TYhZtigp=@5vIo^ub3bYYt2M zErIf0WjS9>+rjLW_<7o`-p!0^GT<+im|VMh5A>PRBHrtTv1&nHDRqcccw$E=36*&$ zXura?KQC*kOyLiA8PKY(cU{T$YM`izGYhjJCtD0GJE+$J1dYhD~Deod*6jP25EV*fLc9ZF2(;yAVMSoPRl8-2K0n7W z9{`P)!YafJ&nuk`IM8M&yV&Y1wyz6fYZ`^wTDAiP8aw~RmspFDQe39)gMm+!E_?A9 z$k7UoN(&V8S|`rtu7*V>*l?>p@)3YOixR=+R{PyZ;>U>$34p;Wc&=fV}O?tR_Yll*bd?q{m&d_U)Ve*ZpI zW!~-6_;6LVSxb06Z#^43cH+Xp#9g_RRtc7#$IZa*-0=voG82egLN6@YWgb`>ILDlF zyh=j?4rSF<$n-LQTgq;vbWPM^(buk5bTTpfq>{CSTn^pkHKp1 zlt*FBW3ZP>Y&YxleJQ*AOqrpr>*Gm9`#9{5<2YkIIC9-DmYt8Cb;X)WV)(uLcJs;4 z%M;Gq^vtAo=x7F*trhGn_jOt@SUy1$U9wb1f1I%mjgvT=ahLOJBpnr~;|WL_GG3Y= zym;TdT7Tum`-8!Y_vf`w#_*bTqB92XJ#g=R=EeJW^Wy!Vn-}k=ru5?d<5yn1pA25S zKN!4t|9$V_ZTosQO6DR_1MiGN;~ndycyBhUV%z22Jn#8G{*U;R3|{g- zh+i9c$$#RbiC3^8_#$5W&o#kyFnrlRp4%2^;(NR15V%i>QN%vDaSQ*v_`ANS|iJpc8q2^L(`rbXV6Lg<6{F3wR`#*Pt|B{wcJK zY~lb6o)}$b>-n6M)y7`@&a1D|bI3>WKhzmvy1 zKF&vXe#nu?yW@A4Ud)%7wB|nc5(We>xAGlJW<0#(Z4(doj~#0X zNdFt>O(-@=zVNWmzG-6YI62)oc_T`LcTYTFonDFHH+THiVBe``{4R-@dnAn3Y%9#@}=u1r+%^b z(Npg|u>QMjD@`T#KF05Rf3p62@84BO?1D@qIq^8lm4j^JCC_9&doc@rZ*fVZ=kK~` zfEO!&^lk6t0i3Cy@4lva+ie%!*3e_F7d3dQnLSfp5#Q)D_wVMfhDMh^#i^zi4_5Jt znx-W@XnM^}%iDNGR&vKz&iwxS&$=kVD+zfe<6b^>wd)Ouss5?v-Y0maaB}_6v=zMV zU{jfN^}w$FrGLEL@fZ;bTe$A6m+p3UXm z+iqpwo=s%`-8|L4i?3GGId5ySw#u^Gu5CZynLCzT=-GB{<3YaUjT^mRq{sMk^w=@< z&>X?~#j!j3-?;SH6$9_%!3U0rZv4ZK(FO5@o_8fLXM6V5<2PVbKYaJnhTx3|=A(x?N-}l|>ku!zn&R>l0~&8Bv%Kvoo~7yMDH>90>8n9f ze2@j(JCy4jeMLRb=y3#xFBnn)4DaWi9$wYM!%fCRzB=Ca&^*5*@4iM7ZJa#D#OYNV zC)e=fz(3)w)sC;%1~Gcx>K@oHfztZEbN5>hDKEAsZC-2*@^OrOyv*d|M$+tx#M0$F zn5oDdr64?wlZ`h$Nt>m#{?q|}EFGh?-=Gq5^c6=Bzx99~ypw~iOM54-NjrQ%^!9zb z-?~g8(S+o99vi#i%eb4^-dMh3-SB~3&~?2|*JIu~JkdI4BSZtmJv zCpZoZ!qM+l@|lyD{DX3@`+Jp)vBox;Cpo{edn~tb-Jt^g<4zNW+i!mxzx9+tm!|u^ zv6?31ZsDy9sKAC-Zg)J)Oi1)ZGTVIBk%GQ5Z+Uv zC#iUO>nCo5$%en90>Q|*we;lfZ9b!;TbU9U8dqrWyzLPVyzm6V_68H-MW(E0ZLja> z@86a>Yy15>`d_ha)47VlwHcn0Q##OgX^)?F>K!~I^#fJtcT1N(*{kFyT@A|#9yWZ6|vMa}zvmd90dL9kbg`>O+2>cYh z@OO9v3s?d#zG6-CL*Px|d*Ex}24LFdO`5?@y?4{aQ}ef*12g70&FT9`Zn*oM`?o!E z&;D)y1|9{Efd)7Legc-jqH9->a4e_{)Kz!4YQNr!XHs zi8;fL6GkRZcO=;VhW<7C-!PClpodmRILG(#Iil^2+{Kqh&uQ_wQ;k`JubF@4Dvc z-Ctfa`0w9%T(h}D%*USG_|5&#ERwlR&V_SQkqqT&{a-Ghe-$0XBNte~=Qz^#u6I4X zEwyH3*O_C_7D$rg!c58S6GLc;-jE2o%w^#~R^B5WeMIJAS_Vt!s$(4R^D_acyB2FB{y^ z+iyz%yMJ?FJj0jCHtIOdT8`7?mwv``00ZvGa{nRc*Y>@#zw(BD-n`*m zmKtE@YTq{qpV?bRN0Xm|{KJkiuqNYOdK5`Ly!4NDVi5e*h=?&^@SV&Zo2UBDUbExZ z`9A7P&%T6%$j3Y~b~2s&*}1+QFU0bBXJ694gBRitOx!VW%p*I#KgHK(_Elfx-^(2UDeG_*`_xG{=mUQ2Z?!A2AbLpmNfT%A={C+E+ zmaOK?M_kw0kGMWLwU?tm_R!D7xn}YEqKkKI3?_mHrc49)Q5L!nan@H4n~ZGy$|)m^ zoZqB}&OLkH`y^h`bpd1AlQ|a4lJMRK6YJ;C+RnP;Qexv*_nozEaBR~BOZ!oB(qE&G z(ez9By+ObEgzQp^n>F0fkiH8Auh^^2LJsrpUwLx^Q-@P7ZXBFrWsmd!*WpeJhU@96 z6Zb2C_OK-JXIbz}|Dua|7bd^hA7}E+kN51#4c@pt`Sjl8*s;`&yS63S;q{Lm9x%@Y zS(`t`W+Fe(H~H-`ol}DIN7e??Kxp+zYn6CR3Y)qy{CVB z;-R1JeQ>}INU`MYh4&(vcyQp}2PYnSX8pGqr?#!{J%C{1p=Z0S_a5j!{d*G+{pv95 zqon_kv2Og5Nyy|r9_(bUec@noW+42Tm`Q{`2WFCEYatx{`-3xSer-z}Jv=zI_G>!7 zeEQz8*PiRpq>r6?t~s+j$lL9QpiCtCm(pB$2=YO`(7-c__V=&Wf13xXrDP&~P)Y~@ zO48?QzjI8kPcyQImre>?JT`InfIdBJR4q;1&9GZH+mFBQLA@_{igE8z*FAKqb7+|; zNp$qE@i?DmHF5p-cICNCJwR{_R=sI|<%-!LMh$?+ozb+P)W`$kc*2H9ojb zZk~VP*t!dMocQ7snQw16{afC5`Zz6We)R9!@PO++aB8@WqGNg-7kwv7iI1In#hRJK zd&Z8Rd@rx4zNk?oChwYf?3n|47XtZu;?vuBLW5U!H#Evd^6Y_GB$Mo%exH^CX=3B# zJimB=r!`18eL@*&aBmnD5tD=sw1a zdmec2QxEV;n2$u{`aWIafujnLmbi+%!n@#bp5)?*zrs5u!n2|d{~mbZ#AAmJ{4?R5 z>9gk%h#9Ypxf7d<&wQGq+{ZhQw+-@zHxs^e@{_;=A(&jiY#c z$$s;DU*i`%Ds-3gVqCEspKJ&mehd9uA$e!Hf=Dvs8w|Y#1pm5q*P0;Dv53c7` z9D_U*0p*}|@iyLV!v~JWj=Aqun^}av@4bo7sD;xDhO7;50{RR$YCz%S;mAe}BdN%% zoPPGeB6l<_KU|W4277>(Gs$hQBkhf>Bbi0yHDkXqkzMB98^H$_Pd(Fr z#r#MvaJ^zsP})#Y^)gBd!{r4t)Z&}#&%x{vd7BCR#U zV6niik6z7D_U^?|vr)k7e#ZKzoPCWiwROy_=rGF-7llrlQonY$7QuFJvX{;N-pBg- zpP9Ip@!jdX$@if@!*g!fFW7y-AnRXu5>6I45Dm@HK~44Zg=5+4gQ!|i(rQMiy}fG7 zo`6W^1EywKFWBzLuD;!IGMg0zhFyfG7WQmFena9J`j7LVME;wfD7hl)(;LO(PcbxvM>mJh@ z!^pY3hvxV-yWWx5IH8w^X=!@r#)%WY zh_&sDS#RMZj~DQHnzML!^?~1oe5OBg&isy3BxV8U#IxQou;Y1W_3t>=26flk10RB9 zmVH=dIe6E$LAKdxf0~?V(MJt0{xFu=F44A@lq}G2;fsZ5wP*AM{oS=y=;?A z>^=Cl!t$#dH$86hky$G}?Lj>%x2@GT@!_ZXmbW){%=2b}KDJSow=?$~basCBx^0O* zU*mG79M`_&>1~gBJ5oB_-MAAq2+ewtk?wrRUd{?^&D}MxpfyN5v$%#{b@6H5$uq`+ z#^Xl8|3blUzH7%%Ca!thQEPYq8s-r9JKo25)z$qkSzcb_oa=ZzLiD`SVOX(ldn#qso`jkyqzlgnq zAFaP@gm-ssukU(G-_-U;cD-fo$gT^HS$fgPGe3S23)KS-*~$crk2`qFJK5;mb*(-4 zZRUxC7yW&iK87jtQc*+CORu5RAN>2p3;X%1FIySLI;qEr6TAjSj2zV(`+aZc$&~(y z`nq%Wj=gL*(}e3bPdMK0*G^nDxci!?ZoBQaM$Xf7WsyDOgG_|O-q-2*&; z!i&E(-8%EWD*n7o{+#;8?BdvytWAFLTU5-&i8}`xpXC?V?7p#oTay{s4tgruLcd#0T-&o?L(T#!0Q~==la7Bxy(OEnm(3?YqB{)|ud!9`neJ>&9M; z|0iGY#_YkX)@JYjSYO|x*%rSR`L#cL=Z<49-0?4b_w>$U-vg9g*K)^pB%o(dUDuVFKtmDc*m#;el<5qYg37_L zJ^DD_tG|9PgM&l70Wau8q1a)>#f)Zl4F2$mGoOZdK=0E!^KM>8wV}Cl$K}s#8#G^- zKk6(#+40U5C%0>efwQai>0j+5KfP@OFSNb)^1-LKt@p+TCbkc*x%cwKTb3Rhx$g1} zKjr&Vs)~d}U%E8|9d!bDr!||GwQbMFc52%OGyG}oZ48XOWO?1jZ#J346BlAe=y&P+ zwq_cs%>_E{wEFd->%=n;_WxsauS^P-U-Aw5 z2BQ1_oBxt2uyv`=nfXbd^9}GVa6fngT#x-nz}vwz_pjl48sI>K!x<10mlIh${59Z$ z0yqY|56FD_XMIiul))(YEszCiuogVt>~reiyTAvt;B%k?#=&30c{A6|;Mc(^;CPS# zzx-*R^9Wc3KDZUk!T%PxA3O@41cOiF4!j0z1#bs8!~Fy(gDb$hfeT*Cd)rcA09=M2 zPd!T9uup+wKK@IEylb{T)1Tq=k5$1vdcptbDjDs7&H25O;GPoUl3;Z*9 z6g&wWbQ}lH0Gq*^z-id0z(LaWDewsR0r0`!fG>hS0iOUL2ggVc<~0ZUoZluc9|0c+ z74T^=PF|M4W#G5Km$1uleJMx*2Rwn>I`{#&1AG~L5ln*{K^csIw}Y($ZcgKR99RpU z;uRTn@B{D-a0}Q2Jn#|lKJaF+84Q7wz%k%y!txN<5B>(oe3r8ISKu390r2h+=Sk3Q z)ZYmalk=}{w>)w3`Vr*LL~r+L9SY*Ytd7~Zr(x%mn(^rKzR*?yPJxrez=jNikjI82$^$5@U8qZ5iw*5_} zjk@l5$TF9K=auig_2!$(=Gz=hw=s&RcfRDq$kS=35#mk9ll=akcFpc+{qq6ukaOD^d$-zQ;Oo#zXGqN zv$RF@6>NN!evxt{%iL^)S1roQG3ngRTa57Bw4ufFoKLjjPV;){wA@nBo;#e(rVcPYtiTuhv)$!x5v}ID9h{+}Ykn(@ii=d$o7^O;PZ-a&F9keha{h<*Xus4J z+He`N{^YzUkL_KVINnTzcLoPrSK}>2cu89cV)eBmyhL(!ed!x{x#cHr+;htv*E>T! z!k344aLbl04}pVLo$=R}lfZ)bmf)FoF5T+c&P_*nVZDeePkw|K=6@Wo5#fdTAID2h z5f9I6dLD0l>(O3kqr4vFvl!up;fpJul?X2kUmR~1o^9u-m1>MJ;}TWZr3>$rEZ+2bZwF={Sqk+Ch zxAf*!;Z^fz9Ct>(YU+=4S!4RL+#K?zQ>-dXYMm5z+wQnNKXQx6>#p^KDSt%n8F>qN z7|uTA0z+9}e?TtvN#y*Hk!+3mCAoEzDrKOJCZvHH%zEactKwn_tCM_1JJ$kPi$D7_a1y z4Tni5(~ry`S7D$?#FmG7JdTlakFmLr5SQC*W<#DR?3#qRiK zkdq%uGB2zT3Tx1x`TUg072we_d5-yGEv3t*i|bn(<^k}M$?@d)(AMj(4=g*=&sgSa z@FvUoe0kEAGo_IenNQ3kzyAXaJWA=)HW^uWJ{Zef175l`Q>)FC(u!Yud}#A2`A0U~ zCg_2lxNv9SRcCC+AU&#MHax!1kK8cwdNP?#rIX1z7Bb>>*N<}BKN8EDIR9$!vaXx< z)2jQ&~V<;hf0U0$5~ z1?0GPx6Z}Oo5-nW4DoLo>(cMyK`!~nCjXhp-#Hg2&mcGB)>Zs3AXj6j`Cwf5O31I@ zgLynY{i?|AxX4Ta73bJ;Gb?{8)q1s}l4_0o>n>l5@Jf|R0+R|7)98zgi(Q=MoSOrG zi%wU)FuHR?$ZfoO`qdjZW7`AAcN`x$xl!bY_#vZu zW7}2T+4YhN@=75s3zI+H?a2)CCM~5*)39tG(H-A;czt~XiDcScDHn0=X;b>hN}0p; zDcr{7Qh#E`!D>-#=Y+M=vD;r4o-s#g$4B8^fBn{>8XnOVwbMlvQ$kwgB z`;R)jV7@syY2y|fkHr5O#DmC0^UKCJa7cb;;L(l_l)Z5D9iJ}4@TjM?7L}*f!(R{H zK>6ldRmXziya`{sp4xIU15bH&Bz+4ed`4TSE;ha`g^y}<^R0LGOqcYu@{N}3OZ$7~ zM;;#YCTn`cw**h=;@7H`UimQ%uVk99L}GIfeLlRf-3-&Y-9MVXU9NKt`HNwu(=)!w zKQ;CJvqYq4`eorMvZ_mF@P;RG^`i(+>2f4qMLg!tGNHb>`a27+JSm@hhi@^^H+}?t z&ZkYfC|Sa3SZq9o;FZ0b|MJ$)t`yT)UIAXxNz!Wc=9S?w2}_y=E6Crte5=7DJxr1) zebvS~c3scsM{XXu(IH(DVcL4y?O8+q6-$o8Kv6o{;|p8AlAob}s=G`<>aN=0K$nkS zW*sbpyp%8lh@R!508j0W0eWQO%0*fJF$q;lh4~%Ft66>8Tv!?Z#qs71Z(u;gUizBw z5{ZMAN`5F6rdOQ4)MsrwmpwxGTzCgPH*=)?9))M?X|0$xsS?enc0H}aV^K|}XL+21 zN0O*}>gx;i#nqQOJd>|*l&|gn+2(8Fznk)9G$Kmg_n6#_{DDH8-L$ca@?1Z# z$}LEr$~mSpyuOcBu7!N8a?OyMt?h;j_(BHrW$h3A-Xb#W%I^{!-Z!|&Nn=J zqr9{EC%NI|8pxl^{4nu9ln;lJhX(q(=GoSt4Dw1IL*-hFl@Lw00`fy%I?}xbO&yG4ji%ziw^)7+qa%);B7v%58XOR+ZO$ zJjuGPB*Sjec{c8AA>ciL&2PupDfys}}% z^G4w%lbe#C^Xe<}jyQc)cuIy!rKP0=W8!#o@ZRyI_CFDorgnecICJ@%tIOZ)_@VJ^ z(u7~Stg-D>;tOk%^Vh@S+Jrj~YM=}XUL?qSx^NfPyj=~ z0d?w}52isG41+94fhO%!<9gh4odFdv3i2Qg98jmto&!}-0tJu(NzkN!n+G*e1_dw# z9I!}VKMN|L2(lmrT8xDjz$~bMBFKUyXfST{!89m=JV=8U7D zgDgma7Hd31&d&g?Kc~lppHp_JtjyZU= z%-^_!$@v}MuuZhuw)XiX%d2?>8CJBPQMzcnk<2Z?OVZXKa`e|4`P(^uP3Btg z!u|PhgFY^N=|7L~f(^|$UOvj}kuIeuuSdE}M|nNc#fL``P$5`3h!hvTMqA&?L8Lfd z@=Meo#uw>yedQpM#s{_>I6gly)PpE5*bs{26{EbO&5<}>CCbaV#+NwWEWB~gJEU_J zz4C1_%IlFI&R<0I^~jH*D6dC;6yRm@sqyQnoC>0h(z(5!XX|Ad-bZvEY0s6Bafum| zz)t3B$Upvx>#yzW8+TH{fseTS@*})n>CuStdX(ejU$*^qdZb%6%IlGC#VD^wx>ewr z*6g6kStXlEmv+6i^?O!4mN+Q!EUOt>SNh5>nOlS>W0sqHgwOe(Vf|)#GdQRdm(D{` zUXOGsM0q{@Ek}7h(xnE^8^42wkCyKfw&_#&+U>kemw9->@_JW!QkhETnr;794kX3J zGx=95=`kK2Y>eY&qr4vJQH=6>q(>#n>yaL_@N^!@97yU>ju+vX_0%WZ3!sWeyB^wd z;{0{k-lbO#B*nEmLs4GEOqM0q{hyKw-~DxdRFUXT1} zMtME*BQ+cGw?}@s@WS>kZ1R-Oc7EL+uZ+UuJW}-_2oEI1`%jPPR-Tj4ZlDQdptDi?| z_ZtiFRzHu_=CuNSk8W{Y-<2Qn{-*ziF*%1%bOuHFU`KM&BP4Tq0$H;vA#v57VG~jvO*V)9vSXx*A;JZ~N1p;hce2tI4e`N8S0dfSmn83SyWQrNru4;S9`<6F0mQ>Y|YUZ8`zVdFQ7{I_o@nk|CxfKr^E3Ou)bYpr^7 zIUybGdM16z+$?evVhwtNflp_+EpGwdO?y6|8xtN|pA??DFFh^fb&6j)r4vf_h?4T9 zdpwc)%8Gw02_^pm9=dEgx$roj!~rFpP_kQ8ZGB1u%NvDv$ZXdfGU2l2K;e=}=Bmh} z^Iq919op&bx+Wdq#gB93f^i@6;QTZ3&_KL_;lTdL*>AR*YT}QGFOtG zn`Zsln>0hRww>{kT{1TfPkX4eJp%)qY`If;=pI-2EB@9Urw9QP=Wj#)%4o5~GqkRB zk{#{;*Gzvr?#c5W>7IqBQb3$f>s7Cd(ihBEKeE8e7kYk*j{nPWr8T)pP5< zjJ!$16PTuW;@Eb@@x%6F8eZQ3=b6l|r&!(PUpDlE(nqocrc0l~ZNt@ocPQL24i5Ol zmAmBM+j(O!bCf5svZPSNFF7Z*5|H&n*gGpi%nT{fpx&-^%bz zo*hA7&4w?cEj~ZyP56Q*ReGdL)ABga)IQJ@7vI!BnDP=7tJUM{!c(%;IFUKo!{1SO zIyYv_DXZ(N!dq!ag9A-*?b)3Cm0_mTs~ptfsl0rWn9y_>6Bpma?Y2MCM3b53s=N$5 z%}0;K8-^F2X9^EA#rf;OGmB+M2;WSoFLIzMPTvB&AXS1^D89V3Eg9%Dpe%1_+u2IAu`sU$Lw+>D63im;qsIlQ|hWa*bCExS*?A!Om%ZpaOhDa+% zn=}`({ebJE=X~k$;HAyECK>?Z4aKYzbn|A6zH~-%Wv|U*=}{Ee_d))Fn=3befRjz( z^C@xZ)`U0trZ=6T^G&yIK@ld7m)b}C#`hd|-0|5$bVoxO?yTOS|0@h-lz*E>{;+V(GV&n3BXSf4={zle zR&ql2QGayj`qDEO=sC}6ADEI~?fJ1SUv+poFBLs76~{~5W!mws^HS}4kwI=(Ic<1s z`{NK6--M@t+?l=rn2O{1@JO!noXCNxI9>x@ z`?QpP*|y4_Dlu4{E>zMUVwaP^V7LfhrgUE=U6hEYf}z{|q_TDky;h7y=Ghq&zz}f2BIANtPyt1d1xe6k{4@`08gGGNkO2u$XAC(9s$dkjAO)I?x#vL* zltBRu0S7EH|Cj|8Py|_!1P$hEK9~k2kOyhdV&1v{W`GBZzy)dGfJNr>bD#=JAP>@@ z#d^mAm;oLb23e2-E!Kh-zznE>QQ(3!a6p|kG9OHXGAMu{-~f-bS84grG&RCdXB~46 zOoI|AfFa<3Mb>!dKviqPpa3!;2^y@6&x0A@fg*508noCWSOBx23QC{=G9Ur!?3v7g zDi{SWNP#AMO!J@y%Af#-fCCoUZ<_@bPy|_!1P%5leJ~A5AP>@@#XjvKm<1J31X+*- z4feEsFbzr|57MB;-u?oZ0ToaLS&#$`&O!KK8k9gDq(O`GAPZmycwiW0Kmycfh$pCm zQQ(3UXp-*p;L6B(sp0vsJT%XDmUq6fvs~DA!*ktYt;QgzV5Mq1gLOe!xQ&}W7>I+^7Abr6;Y{09zi||SeyyUCo!Bk3eOwDz^)0U@= zogJUG#|M^|Zu9Km6l>}0=H=VGv@55WI9^G-%KXgqm|fpqYpKCs-j^FrMZF#<;`qidC=4TqL&qc@cR!a1>WwYHeQ6@;Be+^(=o) z@zR8hr}*VxB)wdRdXZW%?@7A$xX10hsIz=Jxh(S0YPFQCr-P?f^T;?>R=JrdFE|$=Ua)UT+h9y? zA<7FY0)y=OMT4i0e8vS=n`uNWX}U>()AWu4ra`q_Z5k?mRr(ezjXLwO^g(!*!cc zeL)M><{9<;aoyAp7$cw%a4yQ)D^EMiW!-fx&rqG9hKkqeZ`~b@>I=$c9Ix8JbB)Jw zyg7IoN|fR}89aERe29ckj&pT*pYke>3f+J6hMbghs;4%+Ge6R~#6M}>czo;7kZNrb zhHd{k)4A?uB0Oiv&?4(c_FnaRxPxb3oE2ODJ9w-6I}_#gXipY8cxe-$IDcF4=mp$# z+DW(j0n>iD8fT>cneQ|?FYumE4><3f;cRstGJRoZy0H!j?`6lGus*-_&MlI4%SR)6 z@@To!*%GU#0fCi;vpn&5&KCTLB*Zf*Inp(>0XW+_K~_ zWfV@q8sC>c(+Wr0t;diEAN`Yzl z*n<~vum;B%uk?|waF1t#{ zEIhS6gx&m=KBZM>`@=*99)|>4dNq#1+F3t*w}QN?45`|@P?@qub+P8oAfL^o#0w z-YIz`-CfC@`xvhT0~V!Qr+eBzPmfBT+2@#A0@Id8ipS8W;Wc3(tZGOa*-_&nrA zqDaQNO0P)xxbxhaLzY&q`q-*fB86N%C3N@aSqvs^f?%7t^k+}rtf zoIH)ZWaoXR{CDd2T^G5;^RuhOA9-+G$g~li?iv3W|80S2mrJ5UK9u|J5b{!wbj%}HHj)yO`P5L|2vF6Sr4_8g%+&84(%-7=bspckrq;lYz z2>0<fP$y;_h*`yJ_!KlYpwjo%J}A z%fojax^6}_?euQPw~U3X59a%JX_99I=JFx z;faAEs$xZX=GGOjX!RM3c6g;n{<&@i`DN47w-)I`RTjJZff?j4eff#W#OTeJN!D53 zc>YDEr3~21tpLNY2bi5dF3m=fCq}e1!>@bI%U}h zHQ<3Fa6uY4piW))K@E7I2r?iEnzV}xU=~zC2^2sEBtesYV*$*9Dky;h$bbZB(7(=u z8TGSZ6u2M_98hPRF$bnW2^2sEBterg*@DJxpbAQ$05Tv6nv7ZJ!3?N?QIH2iAORYT z?dQP^sDM$B2SXqM8q9s>K@F5a0mNp@|7Ob!;YflebJ7LPYe5y1Kpv!l1M1Atea+K> z2a3Q2Y2bjm)<{4Ncv{Z@S&#xP)_E4e9GC_rPyj<90qU%K&4DTy1ujT|ChLUrpa#mI z0EU1A7Fjc$1r;!=^;3`nP1cs@K}~DSU>IaT0@PVwp957e3i4nGIAD=Ih*?n4UIcJK z8aQB){h3)%0i(bLDbQpeYXQsv4-A70NPs$fc|NEC4-A70NPq_Wpgx!eS02@G)^^h5 zdzJd<)5v8Cg*x6Y#c8yo~s#gm9D`tE4<=$KCe-C zOYk(`5y^NO_-os%u%BTaD9TGi!bo4F9p$=)68X0EvbVo^ z>)ED_>})6NZWj6B`?CtSz`8GT+dr~FYrToI$L;u)qr4$Yj0;aK%1f`#n~(5%r9(5y zb63}wdYm#S!vsIrhKWrt7oLf4nb%5;uC8wso@2>pSO89Fot!oe^)#_UOLq~-!f5N+PaR*x8Vq{SAKX= zp1Zof8F)o{dcF4f@O4R*D_dU|;C)Q9QfH@^U~c*`R4R>aIS$KTCf9<;`?$*t1ABb$ zhWh`+3U8%6Yy8k%U-MC3P@cu>%n#~+l$VBpiQ`R2cwzd*@%#uc*tUz+*MK)maTZF} z+t_-U{He-Si}@C_vVeDZe4Shto{W8x&~C^mjoa;~94B){c;P%h+~AeI&iyebSLxu{ z4Jh$C_3{3<4xaTljVQSv%vK&XqfO_RBIF+jfR8ovU^5ju*w~>*mdO z@a%cxIDO4dUUD^ksh=?~{=|)Z_@@2ko4EXS;f-&}<$jjSZ5fv`jQs6v*LV&dUeNwg zQEQ@^_OG43vZ4L!zD}2XFOq>UHwc3Q?TC8F)-uH*YbKwvUQ;<_F12eOrL1{a)?( zzSYYUlOc9|rPbz1XS+o^2%kqXc!ImV@!P3aE_n|A=Mi3zKH_zjYtBD+@{X75IDO?# zo=L|zUaf<-dOI`U$xE;1ZxbHBu_hQ+EIN1Y&r%+5bJwc@UnA zxSi!Yopa&8(L2p~o^!nSo9wl3b?$I-h8@o@!OuA_^Gt~S z>xb2lDeM0XKU$d(+^vUd}nsh@<5}=_ixPd8_JE`qtc8~r#@DBf8j%11} z`ya?>^XYWcWkXrk7=^1_PpU+>i)`;oQi_pl6|KfYT<-npw}^ThfW@^}vjJiG5) zG5OXRp1Qk;Je*(0)$11WqGIgUl@P|L{C2kItb_kj^*?Do_7oRy7rD|`8_;s!84l_{ za-K^uL75)4{wO@1<)ZF-R*$wY&0eyYal9FLW}eCDJuY4g$WdXG#L1h;&3^R1-fF_y z8Qx?r`E0u!dkO?b<)*Vxiu0HH4=>oiVCUZw2e!D4cEgHDC2Ki`=&fr@z?6=j$*$-d$mK5j>GFho`USdeUbqlKJC{*Dfb& zvt3u1fyeX6=DF%<_&d{?@vreWoR>sL854~l0?Rl{!s$cKa=j3WepJv*SB2M}cUqpx zcxOC#{t=#XLgTAj__vpTVZ{-*lb^}e;cK7S7^^n6-%mPy=6x30PoE5Uhx^a^2Rzzi z`=n+MeMNYow_d=DYu_sJ7ZZ7%MQnMTg?IJ^=6x1+5{S;j!^d;5fxn8g88pI+%V%dz zUu52E0~p5}g4dc<2(MrHo>QE^1$Z5k)K$V)Hu_j)qA-U0opJuw;Nhp{r@^V@`1sDl zv-|X4^lowOK7H}9eR?zAW!&cGn()&OqbYiol8tt3c}Vy5CH>4`#)qTusZDguSkjIs z^T=Dy>gPE}k>fg}ey{C5)KPaU$UQZ21WN5**oWwz|L%{*(r#-5UtVAo=g#`XJ^(yaX-}l5zeUSSm<@fSEnZ&*p1#YI zABy`fPvDULX*SfS4gMbb7U5C$)nWAHIRlgfYwGDhUwb?lwsUoN2%h3A)63riJiJvB z^5zI@;`%+_IkL)pT5epohCG`7%6psduFsF0FZZ_GI4U=`pEluj;kk9>ho1v5<)5~@ z?m9>H#he3>+(&=SO(RFYO&Nx1cwzkL9KXSUmqu<3{7#w|`WPZXKb#CV02aHx*Mmx)CCby{Ym1a5)2&g=_$KiG! zmss1!`GCT~p@Tz1s$-FQ$Q@%u&DYSz zbEoBxbb(=z1u4)Z9zK``Wl#V^AORZW^*opX6;K3OkOU3tfe)rtZ$KWTL5uca0nCD` z+6GVn8IS;rw2!l(0*W9DlAuAq;)7{W0(p=IE&A7aPy=O907Jk5i;OvDK?M{+1|&e8 zG1wfaf>GdtG;ly&<5(~a%Af!;AOY%(-RD3RjA|SYQlP~gXA#VSDi{TMFa#V>XYS{N zX;20QkO2u$XFfa!!kqZeyiOC2GAMu{g$dMIx0nM}FbeV@1zN1@EP^>O4Mss841ok_ zunsm4W`GBVK^CMyi#5STFb67N7z_aiEV52I3o4)pvLFfStQXILDi{SWNP#Bn?DL=o z%Af#-fCCoUbC?AcPy{YWf(CmuK9~k2kOyhdVy|ie%m5DzgA7Q3I{S8WpbAET3sRuT zKIc5Bfift7A>e>T_IzhS1r&h`(xAnj_yU*#9vB80@RyNu0&~>8QYnSme8$Mg$i991 zoRN{BaHx%Vp80LsRafKT{4uH@_TP`3W#?f>BUAl*n7bbZ65qH|TXmfI6}r#l%DC_H zFEzNHBkmX}=Lq0jg&ecill zCvPy7iPu+z_g(g4U+tCsEBz7wQvcQ7`TmBYeA61AZHILylgU-!r&7-HvXe63=d&tZaA(WFzK4JOUFXg3eocISG*{98W+zMf z6<5`tI+lK5#W;(LFx8LRbT-cTwsQ#=`CPST@C67Wbz*JN=^1|CoOc z`d;XXYumqe{~?<~uKXO_ZzOawYCk*uFXZNq=w7Xl9lgf6ZynM7TH;OTv5NoM=k+D; z@|T-E}8Z%9U~F`H}^Uq;l`b2Ngll!=Gl74<)a;HZ*uTwEHMZWNQkiYyZ7VA6xoyMJf@66{y zu86yp?!o+U?lFY|u1dAdCw>^?yVEgz^(ivq+jKRz{NZ^R_$3>t6iU z;rdM;I4`0F+2E|yzm*iIJMH?{-9D;+E9QoAzjt}> z@+ICS-cIj)@70H1eMl{$YU{e?b<0Y*BqN3jJCW-Z=NwBf3|s-rX++ z(O3MRgZr>ukMlqIg1+SVq5b>or7UwHhtYX=|7^!E1$de*4IW&(xVC(C_7|x?tthXi zi>*v4sJF`7&T%8{KkhQEOe<9!%nYVRra#cSw4^dp_v_@ijfdP=cbX5#lyb9jhk0S^ z*xAA6Na+KaOOwyVT?2R3#VcR``YRV>zw44tY5lFVSg9;Vp7W8vzOVHl7rDw}v0g8# zm2b~eYRG-Jh`hO&Dix7woGe(QbgH=?a%qz33&406{hklp8uH^-%xkWC5_8r0Vq3r3 z_0p!hZ}j>8eanvp(}4K#Wm7y2wlQkoY!9Wo%wGAMdLi@A)^sK_-HOCpavQHK@>Z*u zNv$FuMs6l=spVx;P;jZVQ6GZ-Am2FuD1R17Tx{FvW8{RR?$+dwabxA}but%u&GnIQ z^fE;^nJ-i-yAq$`i|&>DTdQs|Q&jISb9i|v=IYWLD3-rUdmApLd)-Z))R$c2>7Q-Q zB~?3W^H1S(;bn4Jc*jwAC_=H{eJLVuIirjD?0h60<=)4A-Sv>$@V_z15t)SkRVr^x z_6~n3SHqo|d<9{$;pfKWAMZayzWLgH`_^qZ@9Ky5-Sv_2rkM|kVDh26+_d1^?otf< z%hykgbhrC2*H!r#dXcT)%c2CD~7Pzb7E}1-U=ZEGoAKH1|0EJloNBRp_`WN8^ zvGEmhrMlu1j7PZhWa~PcdacLS+#%%mTx)xD`D5#g^3g*F>pjS+PsXHJ1(7Ktky#7c z{gCxB@?HA9{!<25Sg(a3O34>_MP)a-unx$Yn`bp z9TnbmE`2ij_!!f>)aH@L_Q_Y9-kthL2YBj%&+=dH{!Vd(fBQ4~C%%H)$uH(g@FQz# zq8a}?dE_^|$okf*ym{%%n&i(MJjfNM(x7L=S;?n* zw7zwQkD>+7wij!>a~aWG%1WR8cPV%0dh$T+N4tC~T{F2+>38hExOKwS+|_Uwzy4+Y z=?ow1UhpI9LQ)%>&WTg|k~YV}zmH{p)V!xCeq8=#;CB||X#FznI4(H{1@Er?-@RwC z)m*%1zg!$vU*Yi{aCr5m%|H8>RI=Ta(;kOwuSV(Txw9SqJC5}Bp{bqD+`y~DYsY^z z|I@idx-YrOtSffsqsFPL=VJzUVW?H^HgB@!E@)>I2#oKJ!i%g=8C$g{o%zN354^Z? z6qYeL>?}{R$>ip67hPMDZJholytwjaOQJ7lvHDXl?pPNxytsN(fam+3GRfpeyWdQj z@kJT=vcK$0f#R+_vqnzRxoPCr@4wP~yIA_$?j787?gM$V8K$_sHk(#MyPW7=`fBbX z{8TEL%w*E(Vvz$&zSY^8KfDLzH0f3OXq&_Jns(pl&A?YYe0nYQV4J8V!3Z4NcKkZa zqnj(@E?ip*=Peo^YbdEn4FNaxt$}G#=lSeeEk>f9311q(>h4zy+7?-?wk?g#O80@-TPRT;gUIsx zhO&1!UEK9v|B4T18Fz!kJnmnw^qj@r`K-5@G$=ate*aWw+^I9^ud@zus-hR0E)Cp; zIj#1(dzDb`R6aY?)6J#NV7!poILpdY^OD&I=VDi$aA#+tro7N*m2$(l3+tG!&(*&w z?pEg6vFlv6kLwI)DK{_wV%B$>W_@S%^5VRN_HuCF;9WP}dDA_Z#VZ%DY;JCDu5YSu z@&|o0@{nJh{&~49?v|+zZ4=kdr*kEEeu;G_f1h`k^Ihj4XJ_u`dY7}$W0kg!>X`Ch z$W7yJ^R>)v`a=`1e?j^?OtfDh;f-P4M?3~p;lJhjGPS7vPqeuDlzu7sF?)W~tUG4* zHupA_n{`&c!ga^E@U!lLyRQ7lo&6WiG~(LzD(-r(H^sNt^K!@dnl$y>vEr9+SHV|{ zpYyUvd0Po#-8oYHvbZCh4bPMxJz$@AX+m2jtaPwijax{kuBLTAgH?quBD4DQy| zPi(h3DCBN-Q78rjKmTuUuFC+ML2AAtt=`@w;<8QFH6?Shwl#KW8Vy zpu5bFSK)8#lLp2=FAwV1$hB;8Kej3_1FxuQ2unPJYx|k%+j`ioZ`kO27(Wl)uk9`k zwd4Ht;Ef-;i)ww>p@Y6}rYv#18F>B7zWOQC%icccQb+5oFQT1Yhn+P_%kFS2m~fzf z-6@;a22Q?H9{in>MWL-*;%W@MhqtKeeXSVj0YgQLMkpYZ>Oh@HQ(cjTu=r zJw13n(}-e`cM)Wg=#C$s%ov{4u6!2S<*(*0AUBzTt>V{~d%ntF6M0y!Bx{eWTvz2O z`3f5^vudMAVWg+CJf(9Pc$HF#PqbMbYels6fbkj6zasa1Q$i>tGR30r8Isc;pM~Qn z-z~#u$)-p{5g6R6!eZk1GtwW_kIs15@#P}&&82JWkNNw&eg1y`34h$#?2Pd5TCUcp zJ?Shbg^DFN=-aY<7zg)EL)CP6B^KzM2a$bs*(wuC` zyW2b3+sN;-)8MVK-!>-`5~i)NQ8Mj?tMW05yEAyM@C;L)k7J$SI7Tr${i9*qHo>NS zP_AqMa96`!wYs>n|8Db9V#S~FE^^-|N4zjSSLy%Y1xlSY{1DoP^M9}6d>Kf9x^#jH zD1a2GlU_ckf+BE13bZI^i(n2^!6{o==9>mZFa(;6jpu*|@*oA8%olu6 z10E=XEO5XgbEg_8g91o_CiBaAFbzr|4^p71`8}wB0vG}gSY-WS7F576$bbZ>vmP@G zJWv4by!g-il_4BS(9l{MsDM%6f+VPG?GRMJD9D2}aKJq4tTUhjiogYF;DANepl3h@ zjDkEE0tv9dy8JXKf-GpUZ!rhTAPZXT}+qO8){1#oe zzvC!#9ls=%`;Xs0Z_D^4(}CP^-oEFum3zt6UM^<(l4>&=TtA3g>CyGw@3>*h@7?!F zbFZuJ#ZSMwFR5#WYi960TmCrp#FqUZ{)-&`-to6z`l7jaoV>zuhwSC&?U~svx_+oTN=NA z`xeKV%O#C!Vh2-uL^r=M*2wCylO@3Ey_??jy~_k&e$l_Icc-j344k$Ju)> zGdj@aTK^o!`sX;}$X@=4r})hV@$tDH&;0^dg-PL49$@7t&%$so{QS!uek<*zSK*aj zdrbvlNUelPIu$SJiRzO*Vc8Sz&zR z9?$3%UttQ|8GGp!PkQA}dZj1Sn|z&(hw@Brl_$ST`3=)n`4FbD>~*hrj^a+&a&WD1 zRr-hdfXI>GO5-q3#GeiLK3DmnbhYW|IMMb`ZbNx+^@H&34S0JszOADt&Yz*z+jvP9 z)vIuYdZkZtwWlt8!lHIyug(8?lbI_h*@tfBkJ3k1g-P~;c=Cs^7=J_mH3zN`9+emIRIcP!`LFQVs~vZzena8D-Q-;u zUge$YY#5KQo`mgi=&$lyyf8drm}IYd6SljGtKwzT%g*s#{FOfnj}7Czsh6QUUBmJu zx$;2n$p>?lTiL4|hUsO~;qZ3brnhM~OuB2$ZVvy$^icn$xT-(XHM9@YN%PKZ)|TS} zSA|RA4#O|~$`{>-?M2X5nD$5Ell}kK@lZaO2+ya^`0pl7CO`MbraY)!Q23PZx~d+l zoV?@{_nI^d`|qHCH}*CiH<)r~-7yxRJ-`b`?S#ss{1Gqg=XF(j$zEkoJf(x&DZbL9 ztNfR}{1-3u_XSdZR$tPV3)62J|7>}gH*r$<`=I&obY0*YmPe&`SkI&*EXT4}`m3zS zf0YaQuY6EBQa*(BN#VEUYC5Q^VIREuIH0>cDZJ7nd+F70`J=eXU)2MJL*+){lK=Xx ztNhk)#Urd=Vf;=ezD?q*be21%v-B#R#R=MLlg^5((pmOOXYrKIa;K|}`@Nvn9BN;c4hoyn zMF{UDm%ZBA=h6<>&ava$d9HHzT=dI7m1FT0-l#wFH z6j!B>?xk1lMHzXhQ)y~-rcA%6dzH~Xc+>E7o#84y(kDIAr+Y+3-#qfLeCw*RBOT(Z zyh*3rsJ?{d=(3=HQ27#1ZbGO$$X@9$p2DYoS!GsN>C{zmke$*^_X-c;TDg~8>m?1s zr}P;<*S4!lW0eo-Rr%0W{gHI(YSZhr#vk$IpW0jWnXCBWy~>;9Du23$<1LGE-_IBa=+ggRo{KhivJ(q4L$2SItyDc`Ha@A+I8xZ3nk zKVb7IybsHP@<-uS7<5%Wm(R2LT?ww!Tvex(Z}zJ3ki8G{QSOz$$~);+8PRWD6)*i( zyu?$w$(^lB)21B=?ZrIL*{j&TaY_9xO9w;2D8#-I#5w0*D!|;dq zVLqu{R=O$-VVZ`&6&~3sJWAiN?#UmylfPko2=yy{Qm*zlX&<;M9?DmHb)4{C;SKGT zPwKCA4S7~>*Yl>)BfT@hbuPHh|G&^LJ*~ifB4_ooTJT>k|CEnmJD_WLuX^VO;a=n# z=4Y7x$}gp>z1n)Dbk)7CCjNo@#FilbTqTn`d$sBAVz06wdtH_Ps%wNNoU^;CYXr&k zBf9ZIX0{@ld#DgYf#nb%CpND}46qIN??0 zRpF7lR=`iZ!S*lWhwYWU+Htq|w%t1XK5WmVZwNiQW`k=!xDIpej#qde#=~CQ`6E4* z!2NV^o#7hxV@eCvPsK}arB8XGaI1dms`4RwaRk}P9d;}02(}&VoL7k_opPi2Nsq2! zy_Y}HHdf&X+v6~NCn(K?3m*J|yz#x3$k`7NHxpxmjQw(&a8lv{7BZEvewL;wG) zrw?gt;$ZVGwO8rYB>c+v>20f*m*gb|<<8cJIs8>Uoad@=q%N@Y4{^eL z3jGh$S^c>3Px)cv^1pYzQR|B?;SBq&&VDDXPj;TvfTwu1xGKD=@46}u-StCd45}H= z>1x|IyY3Ly54p4HH*ean)EnFFNEnXpc0>M`;OXjd#edhfJDTrv-Xdskr8|1B^w+(( zLU=DdwLsr&aP@=hg4J*08Rl~sUK@X#?@r!^C&^WDlYWImhK*J59?l6-G_3GJEOc{9DIlL&IbDY;JOf8>s+JZ zBCdPIPhM!p<SN7pma?LB|;O|F=@=a}~%4&G8epmG~w3j~(_{zT)SGBKUJByWB z?^gb5-lO(j^<8q+2VK<{*#6}aGk#XRk)5qSc5PE}{J+`z_V~D}YX6-FX()k?h%klH zo|acYTBZ+Rs6fx84^n8$(6ltlqccq=4@fi9JlYgWdnly_MTiBx;USCyhKJk$icygMzTdUanK?6^lv@~@psbQFeMLJUE7*H}KtAea-devt zcV#~Ax|DJ(ryjrbJp}F1_B;0%jy*Oo_53^iK|h!m=zQr1=1+V7-FC2E`d|m`833k# zT)(=QZGz(v=jVS{d*QiW<1ZtC(Z-NM@%{TVF>!De;8Q%E#ptUj@LBDAa6SL((lwmzXq0Rzg7dga?H~m ze`qgh>hY#i5984{`x#IFG9UVz;}CWl@7LmS#HYd^8eq}`=FyY1x$ZYFXuU3j?6hJ%gFsV>SfGx2Ys%-@AGi# z;dvB&!g-bXP)_?p=gf!k%G3}>*uif+)X{NLPjXHV*Rhf3_u8ZAv;nK`M3_jurFnvIMXfvXZ zeEDd%T<*Bw($r%)`nnvPbZ{@QTTa(rV(NFt2g;`${t*wqTYjFWk>92DxY^y$ae(76 z^{~CO{}WT6Zw0>>f%*c@&ChF(*ACY{%10naoN%xO%zEJZn|9z#sDkIrTrcbPG9Xy* zr7EQll8WfYjSwUX`NBJm%wTTjD?XF2Fs=0m?yAN@)@IQJ0KuZ*WZ$Vb1@4%Qzr{mOLC zPhLIrE92=`#?!Clryk}@zY^20jHhiZ2mMN#eq}oSN=&~pp8lXd6ixam#u@Pg;>9oY zEA!>}Lw@?zk#qd%zOSLj9r~5!q+fM89#89GzOG-@#oDi7VET0k7@_)JHwk$8yrQy1bdYE%H$> z?cn=H<|^zrfxCez$9kp?z)teAUP)88n=gFi?%DF57g7!?_v<`_w$o0Qhxs!f_)YS4 z^Dm^bYVB_yFv$bY0S~ava9m;g@XgfYnoFA=n(xJTd1#(zBxYs!g`S-N5;%D^I%GLo@$w4^8f_>!HaX#JP?)eb7UTemOVEj4uN@wBeiwxb3|mhaT|I^hc@e$F)A% z6Y$Vd-yWLz`>~Jo+Slu$#eVF^+;q|dIkZpqHJSW+JT&=-b7)i6`^KCW%IyuM2G-ul^2!M~k&kF0rJJHCDB4q4NV7H*buKKtGkEMG`te~5Cl zbJs0*2!8kO?@IY8&vFuTElj;^f37~3zj}>+pT7Z^>*`_PyW-DDdmyI&Z+Xp@_H}j5 z_XXGf{yP%CWYsrh9X#oRFN$6Nb+%ummke5jA@`~G!}vVS9{Ul~vT>3jw%zBXsP(65BwlDkV{ z)&t{N4)Sr0e$Z2&6+7qr{C2UE<)M8nCo#*-cA~LAG!1dpHHE&bkGRQXyCrt}TcQ@< z1G?`xY4;Bv`+kV~&p*HUU8(P;j)ju{r8mDL?;aA<|BPq($p_p|In+--^{}6Ef7S`T zyZ+K+vVUFnyC%{5r@MBF-e1*^6F(f(cC`4Pn0gscz2u`_%26-%xO!92J95%{@=gme z+sE?07i1iGCHxtwM`Df(jCaR@U`&q#l@6{3X8o`ph+(o~J+j`|PKXN;XF2>`z-KMo z0lT`*hd*5{?cu%hvNTP*-E;@rJCl1;AXLxnEquv#}V@Bc1$_8 zW1T^CDPt&o26jl_3Mn51e??UM5G{Mc8| zbA$%bTk*5&Meov;6GiT~8Gu9;8|B<1Tqc#&hEr`d;?g_w;+qw|-WaM|&wp ze^C!H^)jCMupCpazeCEwdNyH?`SMlLpL|2QUK$>nA@&`7N2%aHzj>E4uACtCd+E&& zN_!;Meus_Z=g4JoDofVi)tFox#!VVmC468PD;Nd~BbTqaUb;n0guC z)Nz8`$GQ3PeeXfoe|Q_)#Q?^uC#AgCzwv-c+Kn#+Ust2{e-gN7(Hr9TBi~;q<*I(} z1Zm&I9Jd+Iadz>Hr=&h!dS-^$_4zmJr5&{wepdR^7dpGdeqxk6#CZDm(b21gP_E{AbVp zrOY?P?3avZe&l0*l%t=ihnRX9&wR+|=1a_SF`j-RAN`=^=%06`-ah{i%kj_Y(w)hw0QyewU_RH{HQD`8duyeErOK5c%=F?or?h>n`!r_}|Qz zah){va-CnC5{{q^?BBuRvD+~7}v=-P0aSd zcs))>#J*X7{kZgFVzy^u`lavs{6Z z*R8}{?{b_VW_w~h^C2HG<)BY6`CXdpT&8m!OU!jE<%y|}@hk`VST5>g|Kd8EnCoZ8 zb3IKyuCFOaOg)TeeUK0BAw)TjbJRmjy^LqQM^HY#SDXai6rCo1#%{+%lyd1CqWYff z*u~qWd=)>FdkR_CR5t7Su6A$(@bbPhq~0`E%BAgNJ}vs^7&k~gF1dGy)MM?bcS=1H zvs{d4xyVPqQI7K^^$@!>(^+ovv)q)YKZ#jB#F%?f>(edYn1sn?G^pp=)IvI@&%%+H>FJU&&o2G3%f4 z+;=o}Tr1-U!+7c?AM>Fc^VND>z1ly+$d~W)j{>{(m|L&(Gsj!E ze!e(iQM$e$s&u;6*N`aG&qaBnZrXKPUyEOZqZ=Lo>4{&bz*^cQ~jdi?0`GUp+ z6)w&4R6Ftw4(oqLGbQLywmX>Z$uo20!Bj0;G6JL0>~NP8n@`(QllhkR^Dlw-Tn zdblrNCH^?7^BSqQPYv?ip*B=?@f}jHSN!f9($0uEjxwI}2Kl%Sq8!&nTF*d*YaicF zPr}~YZwpDeHCD={4}bm=DaU1-J}2_+g}2K1{e{l2$oNgH*Mql8eUp#vlyV%WsfU<; z3b*O;HUb>pG*0xs^vq82&*B+t#Xq0_havvC{kCt4e~9TH#?wFKW4S3u|7bn&t|4@$p(Rv0dT>JhfX;Po)fgSQb zzYY6Yo`&|Z+V4QchbQQ9hwYepul(dK;`qN`Bv7dja^_??04!eLQfZ_!;ctXJVHB@xT&U zcQT!JY>E!aI_I|=FPHkGKF+fhKl{A+kNI$&p)tlgq_ZA$etfT&`6)$xjAuTq2c9qb z*5mx;DLoErtkgNnKJXC_0RQIeL9w5h`Cf3vR?&Cx9X}QQA8#=r zr&P=5770G)dwM>7>?J*){;Kg#v6q2ABc%Guvjj!*NbeE>Sgrm=LaF>IVz`e$e4h0bhFaPW9@B`=S&CWNIpKAy64Lb6b z4z32?^_NjOpCiV2zw_>IRmyodF=;pbptj@Xe9+}1&2;Lu9DQ95PCB?3xbnpxnk-*) zk&JWwVKBXHSzc{!YnCGNC$8^v0 zT$<;-><6@?+Tm{i{>knepP=4%mj6uhCq_H%XS|D<&V5BE_}3m;T)}c(QdJ}U-=(iU z;t$e4-FW8H2Y%My0Pwx%Z;^497*UFtpO*3CrxRyO`j*$xKC17@f@;D`lZH75z`)?UveDz zYx@gg$LCh-`mjhw;pZe9V_}%!+!5-SbiA>$jAICM|-G;n0gt{{K&_1J^v>B zf5eH$Abp_Xg+lt1-uk1z4VNJf2$&;&sjhJrv5%8G4r7xdZ3T``+(oP$Pm5vZ*7us9ZaXJvW~Jn>0;5-gN3AAIjO!c>34;#``k9zIfI1 zG7eIICG-*}fOE^w@=*`t;Ww=3UIE7X&Rb5$zCH&J0K4VUSo>qd(eLVG(f(Ecy8iw` zr~dm8Kf3i>V&`ioa!$U!V)pFcO8cq)!OPO0h?yVjrF4s~7r%qUz?Cl^F71n$e8lXB z{XckA>V4i{ibU^EC!QmC`m7q!zv0~VqMw*@)Sq%$&-Uov&rpu~-20hGY`L`C|GK6_+AZ&6D5vjh{1uF+Uh**?%Fz#Q{_>tG>^b?; zqr@I!&U3_+`{fIIocrPg{dZ|rovQB<9$BEr#nUd+ zA*No&GavHNKb@8{{sCX}mi}HFG3_CyJ;lG)`QG!GwqyD%eZLVexJ~@H=BpFM?#dT$ z7e5ly9>y~t@-bh^(GKb%re4M~AJ-oLwNC#B_WFnXq*+gYys<{|oAuYnB>&Nm>v3Rv zP>%yFR}bXbkNSY$S+gbvY(Z;~moVxF>i_{Qq{%QKF}=?#puDN}B7H@Be}R z^5Y&s|BW8Xvs}~%y9Lv3#3qSX=e@(*x}F5B1P5%#VIy{wEpQ9{PpxY#-z!X8DQ9 z$8mAM(W|cGx%I1(?^j3P5j~wxT`Bx7P5&C;BMty_9ZY?hbC7AmpG&XU(JcA#e3bky zO+8^pU&O%)2V1}xAH|*zPOcVtV#+ffqSDWM9ex}5$oGFP_E?=fcU0>8Ki@3;E?tq@ zO+WQt_dQF-Ve+%Rv)shACj~uxpMM1S;mR73*Z26GZ}mNXZait`NBO`u?H|*@Vc?0| z{wC}EORB!ZzwuD<{@l;X{rp)AE2KRT^POnM^L(Ft+-Lsq%3n%5CFVYt=^PKedN|)O zp8I9Sb6-w=>S4azFB5Y-Vm$kUdmm03<(71w6OfPXmGNvh)W>pBKl($z#@+plM}Kf= zzvyNEaO6Tv2Y<-nH(5UDvx%W!28z0GM?6dcB|J{)GEkx1RbC z&-sDzYrgs=@hj&E?n8`UyeNJpre7IPe~^!UEjfI(_?4J`Wjg)p)kD8Bo_=LK{Yrl7 zVZQV$G5yMT`jzt&#}CrarH~$ zSBKwZ`RG?-`jzqYtE-3kx_%vmzvx$EyY_1jFwRS4ye8&&XZ+$XG7c`f=LYdh@vna+ zI9l{E8As2Wa~b+N&S&qvmh(i#rU!2o{H@3DllWZ=9*}w1tB-!AK0TlON-*^?p8BYV z`dCitBc?vayZVS(Pki6V_gVekQ3Eh_ay+GPSx(Awd?3wwp|3R$&uaCU$acWf)H#pX0zF?4!R^z(5C{10GPi&FJ^}Q;|X+-{buJ zKc1KMm@iuBYx!JX=$^-xR`7k)2xz`{dCK4KlD{uu;yt_f@AOyvs!23^p?`z_;b46bRXujWd zL;qSiuStUDds=h0?iBtJ(0sq@{;h+euN3bOJ@-y!McLM8B|Qk5?@#^mg|b#a)-*De|KZeepG45&k~hZ#}kS zYQ^>&9@6QcslWEr2SvZ(+zZv!-7n?q0L^=?zke7P{$9`rwauznc;8*3Zy0pEU}{Cx zJvT}ILEL}vzUY}NcM5+e=x@F}6L&lhi2h2P_s?53v*OHeJ|ObFpdWhlbol>ULU-W& z{d>1guef+dueJ{~&+Y9;b$jW>dGpehCm{c?3jYvjo_{~`^39?@i1XZv&9f_J{_R0Y zkAUVmH2u&1(+isC&1W9`tfY^CUb=Du^mhqej`K{O_a3(NZpps^G}ABKe2d82pl{mV z8#<^hDEWq<*?UyZuY%W6(GB|2UMqJu31B z)|cEDOrN?<${PXw_YYr0ej9{NUeEgYPUy~UCyG4-pt=5Bch2Kd{?Y9m@4ggzDs_VB zvoX)x$DCQQ?#4%iZs=rt()&}m%LFL@^aU&4pE^;(pd75za3bQ+M*#Ex8oJNO6FQWd zXW3>X+100#P7?Qp?*9fs(8Q^SX?MX6E7jH2m9i{E@?n3-FCOu3)<=XGxk(M{}r3cgL zrjakbI-PFhmG40M5Nk^%!+Fc^$S0DCyz+fWPnq}!I4B?cWp?>2b10K;GCjL|mN}YE zH;sJh{##uArj;)}i1dhMC+T0N=jLCXNza>qM>;)!{@t1My!rPb-8RgKWm%DI`%F_Q zlppCs$wc`OY@>e(nFs&(4e6<5#IVg|Ui>Wx`BJ*|XD8exwI|zVh+~Zz*}f(b3@<2k5Sl|4ZO& zT7c&*Rn8bZ)a4mh7!@+Te9pK+zFd6`9=?6$+vVjmn1#+aS6?6atW9;xm!DsEF4wz! z*w!=l$(R~Sfv+=cggcRzuRWB08SA>;+qP}n-GLELKOA>5dKi~7%e{P#L&%qHSIP`~ z`3%bH{{@%J*WuxF{gF>!(!*z%qE5!eTzv!JdwI!{6)S4rQenrweDyE_zR@KMUS6Pj zoJyG;;QQaj9W%<$nj-C%b(ML1p(N7ZTCl0SoSk(a{mRbp?X#Z_d-?dH37&lI!*^Rc zU$w7%gC0J&{pQmb@$wmxZQgu4!Iw%}aE_^R<`t9UdN0x!oO|l?<&`gse73(-Xb|bk zjz8tS%7F!W(?_)YpT|n~-H!je6b>h8A;(pMe)vDzl4bzuDTPS`k+hF($$4zr7iPL? zn~Y<6M&7isR5KGu$Gn9UolYM8m?q`BkZw6K9M9Y_4M7`V_9DF;Ps8x=u+yxhU3uEQ z$#yzOJ=UIWwu=AZF{Z8NA?l}KlsB1K~Fuq|A*5T8X8lc ze#H6*>7}Kk(5&lF*Ms~&Lew+HzdP~XT{0nO;IEd2~4qq>l`kn9u@wK7{qiSnJbnq?b3X*zsE^Ed^xjSD`+n8L-eCS#t^3P50 zM!Md=<@awN()Io+fBA-x{@WcpcDxDu^7(HR>98Mp%4+)e%iFVhON_JURuKh^I z{uk+%BaZ^f!?u~-PE4~Jd^#6X+HQ6}XlF>5a*UBr66vX~h?z_#^7_eUIxMI}+VZsn6Y1`$1KUw{`I2UY>D*_HA#WkwwvdR2 z{v+roX)9%#Nu=vhTGw-Cd@xPcgN^iL5GzP;e!Zym`83ssjs0w z8DK&^P)Bw-OtT#6HvGWH7A@M=Ts@WG8|^d=U*~9^c4M0fq`Uhr=8>I`3Uwj!2n~Xd+qsmf3^!w-zke#C>?aatt87DzaA2!<(T!@iF9Y5lec_5NI%!y@tu3_ z`AUWR|C>3kXSWw$XaIbs!pxgY<>|+kIf8Txs|8fEq-W1-IQP64<;1xnAExQ?gp{n! z%mC6MEo%d&X?a=CfJ&NSq+^I6zh^y`S??s6E~$F0lPzzWT}ZbL&YO|E{i+w~TsM!E zK8SQQBE#q!$typi<-79F7byRI(y!4L^R-j#e~|9;jdq3c&$(%Pc0WP+DeuG9cMSUz zNFRZDW2JXd9tGeQD$@@#{_RCN*9BviAL*6_dBgC?!%%rlbA;&*#koY!C$4_e^!30# zC!OP(C*4*Uw*pAl^{dl#`^eO980mV~quYkAUq>PKJqe^I&7?$7R?CyLY_^{+>ZkPv zrXoh;Ay0NY$3B?(aJC{dnegP}8v>tcOLE@%ReclpTVLpIYsUJX{VBUXRmed4f>Tbp zxaS+2^Y%*<=>{hP>;Md%jkLRrz0N)WeBtmYKHU97g&GU=Yv?=mI1Fm4I?UDPS1BvH{(I4nQ>^2=D_& z(QbwSeSmI22cQ}d1o#1?=vPC4K0r6115gbJ0{nncj5|YsUO*Qh0SE&E03Tok4%79avJ0R}(;QaDTL z19SsA0M&pXzz-P3dD9S}56}%r04f0nU=(L@gMc1DCm;d{0(^jBoLky}Za@N12`~T( zFod()UO*=x0tfZ-^puqaM@v>sC0p7QS&`X;5$wbyxU z(AKKKIIFMcTfc+ z&;0V`-$VVY7vTSO)}TFP57@iyC+(;08u)**t!#?Y@BFTZwwv>U8ESxBiL6+a+B338 zre2q3dG$HHjPtfqkx&x+laWi*vON!Lc`_A?e<`B}ob>z<8vF>klhhYl+Ui0eDc;l<+JN0pS%tEw^Nz^phN5Ixb;W6OR?Pf+M{}4ta49LPph-h z8rNC2XwY?(Tkas_I|At^q15i(CE(Zf;t28_IG1l*Wk>O@JXe2dAZ72x??k{J^&rc=MJ241Vzaf?9;@F9Sv4pzANF6aZL-@}AQafA zTy{I5e72o|P{TguedvGVWPL{)^2zt?Q@$AEYyzX8e)7o=L;h@4hn_eYyruZ<^#T0= zA6QdF0pL zK;Z8OSnsQ6!0qs(d^M_GoeSs2xRZ)~hCXJc_ZDpV>|e&)=U* z|Fh8d0cHSx=GlP+dbVFafj|PZ#DCz_*P+1K?K=^wg#5Tv0cKA3Q)CyJC6N-NEHKIE z_XkS@WglQhz`ET=QI|yxb3ei zG`OF7N_{1fB3sY*8GAB%{Ex6)A8k+ma%J>H_EV2C3#@VIrF`<)(*r$*Iw>_N7@X8l zQd_dKXlGGBKK6C^%#SRJoEV%mDLC$Bh0QJHKQ5YR2j}Ci&iMX8 z9obJkA62ixzWwx%x$kfAfQ*F6RnAs*rYg~WtS@v^8IlC^!SW2dz@7yil`^s{zRyHKlK!2b}X>j z@08e+t0%didJ5phNzP1_&z@oE8E2ItCv;?t#^X|xgTc~BaRga=KZq#~mQ6YvBZ;i( zkD_7D87Xim@Mxj$Z+k`pkpRvD@#BxE(ukUnvdSV>@fNE%VwFU!!id68LB!xsDpIs3 zC0dTa@9cKh6Y7Az52jdw5{2!8uT1&NRB4%-FsjP@su({3h0(qcKh#H0;YV5gU1;!! zBz0!?k08*V2mUp^6h?!TT=VKRex&Uk_s`j@^%kcT$GCj9`@5k3+?xJfyHbfj z(C;tB7*nR#o_f5|?TT|((&V~z1pNL&Rf?SyTIDoVGD{U5t_sGhbvLQb?dryzsthgH zPyrl|`qYhnwFEn1%$?`)~DP2%jTXKBi5${i$S~hiCK6zgr`CiC(s@+)q z&Q=`3W+Sv)byB&kYq>|nW9z1Uv+-$2JiNC6I302;nJo0LaD~}hEEW5ppgeXzg?_)5$6$!CF2pMUW5Lw`uSVd`c( zW}9*91vnDwfn0FG)~#Fjde6v!oxV_t`8x}9>L{eRUb{&-R6oZ15jAO&!q6HiQs+%n zJ7-#34Qs1uU6-=92CS_+Ct5cutJD2K7%}I~RMGt@uWu*5-?LlvOZ{ic8xj9TkRGgEQ*zj( zVA~&dUH92#X9p9JMJLMEmcsz&Iy^SO#81cqzpWoer$Zpbm(F-&lSaDP3;qdqkqcbMr)L{+*w!+@HJI@4`5|2{Gdc@srFSI!p()qs4SR8Ok;*pW_A1^BSe zIJW70wO_g*=XgU95^b9-c<6Iy9JTehu0jLgXBwXZ2ZWGcc>f*g*ICcln<7Dj<<$LK z<^@}!|NEcBd2m3lTT9D|i;Bxig$ShdJd!=$7@;8ez4p0AGP{g@QqPF7%?9v~E7SUY z0mH@!Aw(G(E!#z|{%-K^*%jraHtDeKyY^5o`7-sx7$Y=5yVd@jt9!>i$|g;j4lm!;%5W-w7HXBJ@!9QxGT~6*sX|||PaPKI&(Y=T=vpv#y2*T3c9OP@ckZ+?}0)R$ck*!O^s=LY(7EY7E+I7iHU zcw&95Md{pr!g?@69n42XoKOCHjkiQPzkDC$$2uqH*qLpw85#xuSm(s~{967D_+PRk z{Z`(ebuU@*yVW1{Y5(DS<(CXqLq6@th<;K|dDs`7{_M;vw%HB-cT-WDr&i54x9U(0 zs#ewU#L#xVHC>=B>iujr2|>^QFSDOUwrb}7X*KP z|JA2!F(uO8ewS&d4UnIw-nKFP8j;96dkdrj7$tf7;-1e4F2ph-pn~S$KUMs5eWI81;3rY6}zpx$kO`RzH!0_xFr4lKbXD z2IQgt!=Xx~Tj<{*w8&}d49x43Wc(lt^CLL(8T8@2AN-?w_|N*y448N3yumU-hPuID zQc_&TX~-7{ppBU6`H$mIZv75W|6UW4ZD;Fe`LzB~@b4K-`4d>s25~+x2_td|MmDS~ ztODD@tGaeVpNr`7XV-5cRQ_YkXDPQO5aay7-1~eNrpnx&Z7=QvApgMxJ5Xf#$Eni8 zRB@Rq@vFk1DnKtyu_6kv`Ae!I>|#sRVP$GkiP}8DqB^;Y$kx{t>Vdw3>y-RhMW3~b z7U9P(S!9+h!B3>@RQwoz{NNND4&{&kgUy>oAI~zf_4S2Dsn1gSrwFE)swkpL4EYJD zGMwQ1mA_Pe%2c43OJ$r_K$F&$t*V|w~-RG|VTzp;e zb;Y~N_BiYQ%(~AVZ>-P|}4&uBZRbayt`*DIy zKV+|q;0M~FHxudKx%U&U9qhNd9$Y^pLMh1aU+($q!T2fq*?yhN=9iC9e(EUtGk*s8 zGqsaH$CXBoD~_CqpTfwg@)InG;3uF`BhLGY93!&J(;G@cU)K3%+AEp$y3;IV9LtuE zghn9$!IZ#ZPR*vIUS%GdX$5T5H12&q(A^|YyX*`FeujAnCk{_z^cd^obPE|1v-1yx z5|GbxzKoLU{dG3K3iXm-&IQroa(?E0m>Z)R_U@N%d*}|Opij;`Cq>F4Wi~(aY>Ynq zL_BAnv?pJ`3=HP9Mtm)^lujc_N_%n*!%pcGc*GE{WP7f(6#3A~oSKRV35B%rBXJx@qFCjD*xLa83t(cp293FFS19u3gtX?QFAU-goS< zwIzX2HTZe4iPIB>nJj`a58(t_l^$O?#_I8%Z803`1i$+}jElJ@E6MQL3g;w!;PYzB zW~1 zRlB6TvhK3R!FyOfsq64LPi;o+=!a|2?D577r69k@+G9sdmQ{ODyob8H7N7anmb84n z{Ec5hK5GTrfmM)xh_m~F8H#}4t=kvV9(MyDUEf`h2RG)*08dOx%gTyNN{WiaMa)n4 zQ+c<{RA|S8!msUN`z7G9ElhBZmOVLglAuD>$-1hKCld4#&aZ{d4{9A%t`>s5ROL5~I5 z>me1g!CzbohDgM9Dt+ZE#iq3c_T=)9fPe4unKtr9{wier2JZ!(y=C)@sH}dwKUrg( z>6`37?A!_JSj*27Mw9oO;KY+}J~Sa8z^gGWsw}GXtzS{VDwt>$+^jlm^|GmUMpS=5 z_4`!RuV#OsCYMQ@p{~q&w>xA(Pci!UJoSqGq`fV&ErQ87H4b@C#+x^7I19j~cw|m$ zibXE{aIEs&_nGwP0QB(PBK={H`xx^3nA(!sk}9>_Pewkwzl1}+A>6O!@3}Kzn4X6hA0Rvb!bpxsae!vjck)41_Kq+7V>ud{P0u;c;{=)(U04eOPx&UE- z50JuMv=?9j!hit42S{O$o&+QS0e}Jw;vAz35C#~45uEe%0xW0&3JW4Y$N=Vy&(5mPN5>TYF0^+!AYzHMfD` zf`!YMEnG5t7W0jL602(9)vM22a$!Yi$?D35q44Ueg-aIBU$GDtu3o*g>f-s!S9s$o z=i2(G@`AM84JQ}mwDpmBTMAF#*)a8M|2^T^b4|+Z+4H|!D6dC);%=M2flWbb#7UR2 zu>?yJ6s`!5=k$OIli4T_hO5Vwsxt$DRpD`<4VeZ@BMlKec#j~_fu|H4 z3I{^G$1lZ)B>uihvuei~aFaTjnpAmnds7pFw2*XaZl+v~pDOURv^Tdku8kS7mX>&n zfqfGeGAou`SXHHCNUEyE%g*zVYQcp|LyMPXVwRr~m=!#9{B)zeIl87PX0*kP#^%Ph z#%NRHRWYL>7EOp6MZPo1*Boy%V$JdP`Uayl5v_?Cb;!FZzM;`07;S5eH)rI|7*npb zt#%)Br&BJ0W@4;wY-wwcHW_v8%{A0*)I^(_Bm>$tXH5O8lsle?L29Z0}?Iq`j+Tgqb=65wy``8=Kpt86c)MR;&HF zw6Ufo-WsoKGcImyWmV1piF>(6CZ75L5ooEK|b5^Ze@p((A8h2x3#gi?sp^s2_@+V}>w6vI@sK2{O$2&wkgSj+5L zGisZfl$v?mMax3Vh!-zgggl5jXwE#YO5#^t_ZK53CX>CoQO)yLRo|)>c)E=Tu`U9)p36c+}F)Tsl?fLCZQupVhZ%{6jXpw>~ zjkeU#s70|gE$vSGI6vAfLF7aI3VNwiK^OG^n$^q3Q&502%>bDfW&sue zRse1V?{+{3;0nNJ0487#>cI~v2Gk;tKf}+bAl?rc4;Y0HQ-A@$!+<1U2VfhZ1JDHE z6ZjMK0m6XG0Zo8SfX@NC0rvtP20RXU4)ANhtAKX^3OWu491l1fa6Vuf;{AXR;MYF` zUIsi5umKMO?ge}qupMv}U_ABUne|$sx)fz;23!T`1l$hTgt|-sY5~gu_aiO(Ta4(=6@Hs#SpboGCuz&!WX~2gAN&tTzhCJYTz>ff51MC1;fM&qu zfF*#l0p)8@xq_vw^{b+dZHwY9OSxi5G{r7la|MURafO)rOLg*RzvVN)X} zdWo2;G_fLHRnroSVGg;3<<%lmhUyHxB;H&POD?AGHHQ;(X(mRr9;4Q+m)5!}lxBpT50jd@^*Wurg zU7jiBidaV*^lzfSYp#@a!qQlCJN|aLqa_pd1vg(|7>C&jYsp#?A=Or}xETuwSV5{7 zO^&{wCZSryD^;PxZa=d#w=(03hXj4 z)MVP6Bebv?O)u7}{wNk{HaG4Baxajr0zB5L z&Rek9al$d`iugvI$Q0D<6ekAmTG*kcl5(25>+ItgM|We((Ap4hs>NxZj&V7<6*qiP z%SuqI7B5@6REDclRDDx>RiYt=N<5L_i`t{L=rGG<*U+j?@Wd@>iEgNB+lUeED8?>} zZE%=z?gx7Q#wM(QQQZ?r$r8N^4rs2&8hOb|r*wxRt)j7QZ4}GfA0sRkRn-=6i8bPO zp}q+gF2UvW)McO+u8%fh+-aDl9ssp8 znm7-OQm}qUQwSA8LlyS1F|Pd)ULI$6tyBL^U9ieghEoNWm^)X6^8xX#)C$f?=)a}W zD`S{xS}>5~9G)?7z7v5lbai%2+Rv+Ke`9PzBF_E9XUL_8#x%!;;f2f2!-04IBWd&2Q5rgkq=C9Xevc$r^pLtfb)#^yxVUT8h ztk{@{sjyCs;-n{`=i>hPs2)!fMKnKGXbRf-l9m0^oVo!BdLf2Es2VnjPdSHV>T8iN( zfFFmR8z2w9LEr>1UW!nIKSO*cWbQ>8cueqiq1*=Y!xgqb7ips~282AuQ0tb-i2p|dFgUBy{yiMd8z6W9Ck%T?hpx%>!#eg+{F93Q0{eVHh{{Y?v z6pv!>4mc5THXsa$0uq32fG+{=0em0uG~ju_9{}$FivL!q4hNhBI2W)2Py=WMYzN!~ zxC3w>pbzjg;Magx0DlD({~h~Uz*NBLfC~U?0PTS7fd2s85BNUdS-`IW!+`ezU&M!9NPsk$_VGa{=cARs)&=+W~h09sxWJ7y`TnDEzQceH?HcU^buhX8;xgRsb3R@EjUUfhtl5DZV3HiZ|KDV>MNVH|h?< zdeDbk-ox?!#u2!EJ`$@(znX||Q5=I?|6}oH#uQ~>WSfR}JdVeD^F;gwmU7%dvFYPMX=UfqiS$x9#eIy z9&ge&sw>o$xKCM&l~Wum({-vvwc=L2U9HDTs=duw-K<_sLQm-2n61L8Jr^>#Y04z% zZI&lV(l~?7uQ2C0teos~SvW9*B`7&!Nx~esf!OFqRJE^RoF?1aqTKB}q+VomYK`LB zp+#79+>%&xeOrSk0@IaCx3{&$n{jl#2-hXTp?Be!owKrbW4-y$k0&cQ)}9G=Zqjt%Uba~tl(q~Pi5lF zOnNJ?d9dBMa6Q&DI1v_>j<#4cSBF*Y2`+hYy31&6Mr&f{$8p5aSaW4s!y;U}Ij10G za`SS{b7?($i=K26mfm!p8=3Y17+`K=T_bn9qSQS(5vmgFC$G7rJ^tk3Mq{0Os6p|? zIO$5;ySN^=Losalm&Xz~-4Kmzi0Odi!nDJf=pMc3y`AWkw#(ZOY*Ddh#S%O_T2_0E z+RJ0eTMiY{CbGs6MXvc9_(RdXP5JV}?CB0?voKs42ys5DkTTsUWq1xAY zs0G-#*F+m)wYbjI3dsY*Tlb2@{mWi)&KXHMs}YUBx;+TtHU|=WwFXA!HU`G!v;{_angU5rOVDI?Ly$OW2UsHg zfA}>0L-}qjDDd5QiN5=$iE|1wVbasrHn!GGufr*9?ew)6wA$BBZ<&s%11}a#pFVT; z^qI2))6YDeKl7&t1JfH@xkimXATl<{WxUbYYAipmB1Ai~b=5?h`3^&CtPL-2VBV#^xSsY6 z)L%31PIxeu&U3uTqfI*bjBQJXXWzDD_~eQS3kkd;v2PQ^2Jbp+uF)EA$3jGx0Shk{ z!znuav=&!4#u_J87e)IaTSqN!KAcxVGK%(7Hj`OHv=#4mxFt}^sid{Iv}oBlgEfF> zi$*Tq?$DhM{(KJYrWZQ#1r9E9@bwPf=HTKn;@$MEPWp8Y&ZW7FDFhq@C;{LtEbL|U zcNND2^ZnT}z@dP{0Q|lPk0d?@C<5?Zk-8|(O=|f%6q-N4&T$Q0UoXjkhaWKwG8k=X&O4P}_Agy?1it(+{wYcxY zyB%2F$Ks$N!INIl%{6#SqNRQfAxhpBtXgqtrkdLM?hmdt5hpDexL#k{soHqEoD|pM zfTscRn9=nmC{B6T$ZZQS4-N4|+dB}|s-iXcYk4&_l1H>D(ZIkt=bk-vGcbLz7E3b& z@1!K~;up=VMdNI1U^CI}rq#f)AkMC9(LTt}E(wWxzP+RU7RL))(o=D@w?39hQ7X%q z9trXE7~b37)UePgY`@dbUFwGQ*42bIYRn;xyj`z_NOVomE~Jf+SvfCi?|47h_}V*2T4 zWDTJEAwSDA04JuOappfOADliDqqZKv6VuNMX34XCpIV@Sb;Jjx%DPQ0KiSaje(ro- zT`kUCtAVSZ74DE!!;4oA1@x7BKR|}ni|1ds4Dk#Dsp+j7n`?}?oHWV{W3BGy%UH9~ zSjFBTim6L@iRa% z1v#k?2#=BvDXT%L7C}9`tlQ2Dp6jmT{w74XjZ1?i|wJ%F$|(wBcmPu-@DS_+0m$NCU?kv6fRY zLV-i`ID4xFx`lA9J=g8G*;BiL<$^vZ!K|WXJ*N=+B}ALJe{=HOFB$JR>z)YcCgcpX zu*I#jbV97(NKVHb7vQGJF_j zI%OC~e)90q{l#m~N86$$`Fn3U>UHxW_U6Md^Cx!uDS2F5iAnQem^|bsCLR8AiTKle z^3(GW7GFAHH~tAvyc@S)ywshe*Q<*!S2M$&G%na(i%!8Bsl8^grpb;GP%(v0Uiku)(MhWRibh6xOlpLX&gFT=#lhhbvo zPn`@i?KcnoeqIhd0onzoxnbgY5RtrG`+#h7aCeU1qa#7Ehkgo=C{d^68Yf{=w z+gS#d z8;%K>1PB2t0P_J001E+&0OtWJ0gD0W113CL&*Z-Z|q}J;5+A;%y02 zer{-0@c-0dO1Cy4p=1+%B(m&b#ZKNyngl|4fuHIp9O^{}=gS&m$7v^_OzgMJDX!VYsgDMAPMG z*yXRQTO{Gxv#Y?fNO%~ApB?@Z`W#{F@w&Pa6S^eKy3k>_9(Dg@obIa@>U1Jxs~mne zEcPRQwxfTt6Q=&j&>403r#NBqGkjK>pJC`0{-5l=RKh>mZ6M!Eg@<8RzqVnv@MznX zWQ7$T#uM|o{kFx>vqXIBhEeAz%VHB4ZFdRkW3fqIZZ8?_hOGT49tEaVWzv`y1IKsKY18F{qng_Fbs_PyH~>G zcf&3}ZE*P+cKO}1liv+fo)6p84;L?aLR0Q|c-uLQ*KtZA9r-@u@Gw^TFsB>Jr)4>Y zpdX%-853?39`d1WrS<7BX=|QyM#4R4>qnoj%*i_6*thJgIn!sQ52zD3XUP)gW^1m2 z>xgD8!P!u zGEcfbeaZax?uoLmPI5Na$e4Ssh3?KR!wkdc;#-oqZNpAfU$@DoG7-mpCk_N>jEAhd z52pPe0~9cTr;xuae9s4n>pHIeiUEvwd5C4d=id7nQM_Tj7GL(lL4Gq%R`69XXQRnw z49_Z^LyG2D4BrxzuZgCQnNKy=U>n~YPakY#?dVrD@LQ!kPm%h-7TIWyZ7^yYVl`Ka z9@!nwo)P$z(VoC}BxA-#oS$RkU8~P7GH18WUVR^XblhWl-ZFQ$`L*qGe(2b%waicn zzQ0Zb@B%x^$|F#G8xG$S#BoneG!b3H`z^dGE}pN$*GjN0cg~+2L$pFUc1)j5&QLtL z$9EQ3Se{C{`}L1Jvs|`v$&$T1D4DxQooLG+;Vaf@)-~~5C}^IJc7vkes8-He4V**h zLsqYLX&YiNj#?TM?f6Ct?&G~2d5&7yIGlFGyX1VWh$^KGId3s*r#PnOkm#2lmSY-G5iU*hK|-flbkvT;wAJ9dKuy5v0An zUpX9LI^cl=9ys8E10Fcwfdd{m;DG}kIN*T;9ys8E10Fcwfdd{m;DG}kIN*T;9ys8E z10Fcwfdd{m;DG}kIN*T;9ys8E10Fcwfdd}+|J?(8Hz4J_zcRQ?ztb|N%@<~;`*Y~w zkCGo#@&A2-anLRNYQbI)-*;dni^%UGxbNB&Ibpuz<_8=E;CF#b0Q}AazyILA2S>~} zV!lJiv_k-VM~-pSOIc#RU&lQ7?giucj@{u7Fn%h4@qCw`bjYFSJ9HSBGJMCLe0%Rzn%K%4(hd*1>ORk^miKvLR!%t6QdsHCW< znCpJOprN8tp;Dq@VNzkT3paR4QBlXVoJwmfswqi9*@i|1Wi}=yniiQQDZe3-VOnBh zQet7A=bJ$z+wI-I|Fh3IyW_%_Z_S!D_+8%jd7k%OYi1TTw~Nt|=a<09^DY?qJF8#= zU@tU3ei1F{UmlG7e;Z)ryfJigh~KNrtNx3Uu>y}I%z67PTr{9O6W z-+LU3Is8XIF7*A%pI@H82&2CAL%w_c_x!Z{3yZ0rf5<0e{hpsouMfwZ{QtfMVFJia zdZfK#E4_H}()X`iY`zb;-UGAG9)B zf83%aFFkPt-+P1BhnD!T8!d^=RJ0w?>SzfTgrFs0QdJ#nC+}6tL)#r~8d?%#F=*$Y z<5?mwWB6CIXh}i$_ z?f->7kU0nn4)ITU9wsVz@q>%6Z=RU-M*=%9<_FqEYifuKP|*vr{cQoxe`npHb>V@h zfAxFOPk}?x&27o=Jb!5O`LE;rkJi?%?M5A2dt&YFzy0?Yyy$<$SUA|&Lw6hsr|vv- z-y!zb=kKqqt~rnQo-GLU%z-mvjt1M|i&QjP5)V3B5)VAuUTCAxlK6>0OXkIi_Byl< zw1hKkXbCTdpe6Cw^m(wI@NEOyo@ndQk~pkG8;>j5Zf-Z?s;tebDBhjX>)`>*;A}utZn_EFKmMi-yUtC|EeG3(N)!g@wQ#C8!F19Pb8_N%0ffwWkM+bKBd-pXz@Ba{bc|Y1~ySyL2quu5Gh=%r;_OqYL z>2zs7-1m0Zz<$W~J>4JU$^MI{%J+7EcmK`N;q@<+qz@|CwDb9C(fcM}=zFZ&W4ClY zxg>hVQwLYyc-=LR4tV*6==0liV@@q<|M;TCZ$@v|KVARP#ZkTHyt_a8fn7E3ud?@y z-1=m}P~Xz&xAs>aJ(pgSHOzPTvFh{B|9Eo2#<4fP_~ooG%D){j#I>kjOr*W@#>UO| zFLsvw5OZ=v#o2QwKOa4J^+&_+E`M*;b?Z0hcKu@Ah_-ikw#{7h(9BtTVsA(a@uMr%@vcI1{vpT58S zlJBe?`=jpedNi@~8y}ys_OM!?LPn3<CFxt?GNXdX(XtdcN|J z$BO8)>!@$5#!Oi;*P3$c#CI0FGCr&QTX$LqzZvpq>$jg++VRI2E5geEO3Cm4^}>RI z*8IX3YketMBlaD>)tox7b$OqJ*-I|2T4b#HLG3zsYTp}~(n9_Ehd-7Vk9>Lyb>W~^ zwLCGj`zt5DcxZhqZI^5Kur{whGgJEP29=xP{G`uk>^GxUPEyt{d%JYPq5Q?`*OstH zQ(q0+Fm6rE#5e3weMi*}7WrGoZ{9n-@8c6g@=B}Uo&V#BT|HkozI@VzRr>b$CB3`c zJm&7ZE-ZQc<<_40VYP#+*X;ddcgW%Om4C`k55#-@nTr?W$CG!h{_9(O%>V55(PQwr z6)+NIEqih0<4ezx;{-D`7wOZ4Sa@z9S_4{LH^9izk^?YZ_5shBs<$bQ1TnQ z_zd_`wAi5lxde3qz5WKj2?_%*DX)7v<@HRb^8J=UZSrPNCHWb6Jdeuvx~NV0#N0Rr z+eBIqS`W3Y#6#_Zm2C22-%IV?=A}wX^05!wmQU@19oR+MP1N39o3KyXZB+GvZPbAS zyQt%^0|)lP4p66$AE1sOuZA6`&YeC^oj!ehkVu%xp@UDFZ_3YB4LnPO~wY^=p&UU-K zbNc~ZBHFcMTDR`ePi!a3V*B=yk$6dz-5$XT0y|)^9Qcc3|Bmh3J9_bfM_2y-?+)gd z^Fg3{Pe{Oi`!5BskKo^)kVu>s4vU6e###J@zrSTu6#fx#^*8v9-QR_?uBihk&vaPE z04ie=LuE{5DA#m`a%V6&Mjk8FJYv%o%9Wu|o_Px8g=I_~hGWBUY#7cRhGWC1d>1)3 z8plTCywQ}`HJZwIkESxFkHc|T#yC7Tj&jc%M|oW1@ccMDHwlj?;qfHOHE$~Ac1^`T z%smwxFqJCtPQ~#650rSPV?P7uWPlsM2jGNl-~^8woB&?f-FGVSPLH6yNx{d;#?T`#Lp>ccQy0MrcL=c z7T}gkyi!uK30wmMzqI6-1A8}7)vyD5OVE~3yP7#?*REaQAJ|@SPc>-?_w2=ffP<== zd8oP?JVXq9beh=d056>eFJ0y)KR;dNs9(n39~+wy^?&H?N*w;p$4eJ4&R*_Yvufe|5^t!5!>jVUhBfF{9>?DVC#C#0v(#TPj*Uc9v36#VJ-)6yKbJ5n9$s9`sZ z%NTk~SoHOd(f0oR@4tUxyZ&Kzdu+RQQ#o#F_v;4_?tW7SXTN*isBZBC0%M5`vv){r z*Dm9RZi8>QYe2urj_x;iNS`(O);pS?k8U4kAFyz#JY{M2vUb_7Wv=?}SA+_bRWIrRiM;M0T-y)~B_@6GH_|SvXCd9|zF)ia4fBEv$|N71!+WCLS;DB|% zx&4lp|I<@`^N%+_LDUI8wFW66Q7I(T45Grr1CL0aN%Gu3^oEf~qh6OxKR_>_AEmwY zOY|0cC;bV1gs!8{(*qfWiDf1*_b@XV7n8%jz`n%3!R}-$*e}>~Y&(wU3b|9@Xz!4{8qk#Kg6Hl&+@H=Fkyhe31fum!mGl2!f|1U7$c^Lh2pznx%jDAEq*Ef zD0Y^5NCPENijl@kcS*A(m$XV+BfTlTC;ce3k=x4MeQUup!ULas*oB@zw`L|Y_cLB*9rG8qh<}5x6pjcti(YYt zG(Z`wFp8ikih&+4RMsk=D&y6B^;LDhIncV#nqiUaM)*fPgf;Ncw=>(BlWYOEntwo; zD9TbVxsx(TU8yDMV~nH5Z1Vp`Q&c&c+h~>vW4~pqxLiJuFW?LLBEFdKByTuk}q0@b5#R(8-|hMq9I|shA0v&nPRwT4ohm=Wr!+|7r5mMj(j+NWnj_odS8MyjT8O zJ}+O8gOqEOYn8T282Y|S$x+@?-c{aHK2|=YgN12RgG3hs$+&i~1;iyndfPTYpS{ zQeUqZ>F? z``Lr+I&K5^68AFq8uteG9HReK{&jvI{~3RbKgYKfx(n9}k}wq5n<(5P%z_^;5ta*& z2|2=Ap+wj&d?*|ejtbX`Vd7Bn7IC6@rre2t<*_kBvTqGt&_G% zW$@A_cznmreXAdbzt`Iv-Hj-NH5B8ZaSmVG*U{`@_A#SO-Zab!K--z-e4wq{^q9|^Z}`{Z zd#puUtE1J+8emPg=3^ba)&^^{Rf4tHVZCo10UDpRejw|S9l(-n=x%gRx;NdA9!TFn zv$RO7v`G)6M_`R^rpM8@(Ua(V==!OHArYuWBxEH|CY;kIx)xmJ7_-yP_2kUxdl?*#M}g*ah~ zkSDw%oDk}SGeQL7X_`1kTn!}XCEXyUOY@{0=|iCIVd)F$l++;gmIuim`3<>L?yR_# zHD#=XaV%zefk14f_6+_mL9 z1EmK6pDiHscwq9qK;!xRL%f@R2A;ir?c5bdSDH-+*~61DhSxkLV4+mo`Q_ z%;J9IGvgcM8q*069%+s>V=!wIFmD-Fw&k(b!B1bd&R9)k?s6%r5ltJqJ>7%uLrb(l z$J0~cgG=ccAcL3rkZHvxvJWH9gYjXc)3{Quk?RV+n#^bL&+)JDNBKrR9G*2)7%5ak zO`R2*gdnk#I8Yn`tX?24!`Qrt;MWnshcK$^q|Q0%*Nf+8}L~N+h4OLwa92 zB%PMdO6Q=lE=sNBHu9h4c5(+f0K9r85Q|TG> zgNV7+^b2$WVy+ZO`7PZ@2Qk+&oteJO4UEhTXQqPr)0qdEY|P4f<^yIwbBOtd`JTC+ z9m?IzWx$`ZxhJ_i?i21i_>YYr4Fx)ve;S@~t*`>?`+@j9@Jo}1ONr7H>0U(JgVHj@ z+Y8cqsaV(?-xm=ySYQMJYR7L@g7Z z28z8VyeYgZd@R%m4Z;PXjc7+q4HPwTxR@Yr5R2e(rHG+U@U`L6lTtPCEL5iD74kEf z(_?ZYyr>QQsH@T+n%z`JKubeDWRoWBMrl4gCWh z%(R0~ip-77EzBe)i+O~3mD$1^Wkgm3e~)70*$M0&?A>e{7>NvHiz}HxojR= zz!tLY;iE4hiZ60~_&&n^zYY}4`5oND}MYlpNeIg%_56RW?QF*sg4uw|% zF0E2Nf!B3}svfMRYBRMp+9qv??$b9JCC2+k1u}s%#sp}WbSRc`^OSkse9(FXoS8 zeH(egTiOBbuy$1YO1no-(;w8A>TZ3No}+Knw?Vtr>EVWscv%WXn-6~4iE$n?Y*1=3 zCRHC87eR(uSc}EXa%ic1<|XE3rkL4^@s%;VnZ3*>%t7WFb|f2zb;)2qWFxqN+>PMs zG_Eb*fsaBSkcm90n-DI{fPb$LIzqiK7k7wz#G_&#X#ldKf$}itV<)2g4IhW3(~XSZ=H`o-zhO z*9Moqu_Hlv9}=uS`B4bz?LDt_i+2LM#s5t;bT8>p?o-Uogv`R3H+VNY6_5xcS3we z3rWI!Fyo6tv9MLx0d71iTqpJvb42?Dy?6=Z- z&e~*^S|3;+TL-Kv>np+qxKYT5rZsJ&JJU`?-9RX_XxfEJLualxR?5IyP2`ffd$@Gu zC-b;P+$!!_t{58Y1LSnke2r8G&I*#l1_OP^h{@t#kad0rzWYfGL54O)nveQP zK63fK$jjXFD&Wi*Wi09>Pb)*!c&u+Ulwy+pmhLmkjl+np?~K-FiMh?}jJxq3$C|B& zuHH_@i<`g-(U7{(I(k3zDEl;4;3C%vm7ej^1nG98`zHDV9=Km{XdQD0Xb(lI%ouKBS>hYaly^aHWuGK!!DuD-IBcm&VO5KO-AOf+o z5S1A>FyI;EZDWTq49Y6SywBW&^|4#Mtyt?;YpQj>wa6;4-muP-zD5U8IcVC_gP^O% zLuD+0s#-`l~g^ z%7X8^tgi$4VSEr33EsB*y*-?cpoh}a>F4P@XrDs52yC;3_CW*viLoPB?7}#KXB$!H zIKX_toMO%)?%M*hW7%Z*QziQidp-9sx0&0+?d87q`%fpnCw~J}^EmjDdq;yt$sBZNMwFnt|h5D7+M(e2c zM#er~yA#T2A*w)YkdxGC-)I-K{>apa0X-`99ze(YjRnRU%wMH>i-*d3P8AT zh>Ae%CyW`un85aZh_3TY5Zi`r$4)|Syb3w-090_MW0kh@JNP|_kwbhfe-f3(^Y}ve zYlKdybq$x3pyV#fJrxOke;jJ=6zU9z)Nj=YR1>mwm%bc~vl5CvNB087^7I0|P`?A5 z^RThrpwff-qjr-*J2b>O+}`%2iO9hxi`I3BkGM0T zd!|cEz=8$Pm+wg<qHyWR)Ulz}LskNx9@W>in!1oHRNsG|q^i0e`8F<$L-c3Qw z6@zgb3

%!OVi6`^+k{$#hye*2-n&0SRkKysZqPPM`^)qoCCf*(tPV7Bv&F#r5ahm*7%7d~xQtbe=3<~d;!vMV;1ancAWjOGidjhKGLgju*kC#4 zWF_Z8Ex`+Qp2rnnhKk?|TR0zbz%p((R}P-9;40xAH7%-jjhID>zmi2F_(*sV&GWp> z>wGk3ITk(~51&fpllWvlg-^x2Ut*eU-o-D+Dy)RRN;3ZlPS*2mh^v zYOE1z{S}dVWDm#BCXtdtq)^Ew*(Hb61=Y=PDME@wg)>3Qlst&#Dk(&cLUl7s&Xdbg z4R-QHUVD(9_NE@vgy2@1gt4UHL^*MFye5v!E2Nmb%kfl*S!fU){_$l=Uep3=B^$;UcLjF1 z{Mb>aI55HlMAh#{k18Vsl@Nj*c~DjjK#my1lgBEC0>t1-gQ#@GQwW&w5^mJd4n}8E z5KYBQRdX~YK|$sDQN!U!Mi-)@95reOygC6$Ovc#2M}Xxr1rI!}!av41_=M*&X2jvj zhNpRiJXSCf%#bXnKrg1r>Bv&%U`?}S7j%nTUJ2yPfqu!wDi_Fwa*o<<>W(+rA%p=5!S%# zP9R^d2d*~)^C&e0l@}Z8=nl1u>Quwk2sKiTLaxQDvZ|xD9;3zr7vr&tmAF1u18h8j z45l8;)CixYv=A*+vuSqCp>@%m$TcIhNG(dE!4oq0G8$FJSon3kmY^kqIg+&$ zIDNc$95+_PYQnHkS>rH8> zM;blN+5EpEGj&h@}bT^^05?}Xh#ya#H&3}RTV({DD>O| zMHK=)l?i{Y<(%lb8|uD^=l!u7;I#zwz6`pU2iE2RHv@U48%$Ouhd|jRH0PBeP#FnV z#AYU9vjVXhg`Ru;ap^=>84b3Mg#wO8geDqExEh~gq=LWGp^4`Jld_SEEl1|r@-Bt~ zqtGY{Au!?Dz)k1$|H4QVA<*&^JQ)P%H2m0ngPE!ltY@nkU9;&|%SxpqnBY#dnm7o?? zf(FD^1oGoRpL~e1axM!wXB}S%ogam)P)7!5L$*fLy%+IS2S#s_B7j~==%E)1z7U$L z3Epah8c##4WkF>ZLQ&Tu-ke~QLY0T+D%NzMLIt?P3Gb>fBH%Nm_vMH!8>)IvFryEv zS5C$d57Izw}(f!CVAY)){S4xOC@ZJh-@?S+Q+f#<5Am79QGPH18sIyec}OtMhP@Indu z^m6FKI^>r&j35e;7Ki9cLqxfeYZfAM$`LJfh!C6q>a>m+NWuuS;Okzjkq;xS0z)=o zv`%1&4lhrFXJ^5iz3^ZkMqUL^Z6f1O4knlW!JAHaqz*4kg6CynMZNy@Bz~2Giby6@ zbquOL3H}*L;L?zfR{8NI)32Qip`C45!36&rx{zD*K*w^~jn(lfg=!k|g>wJ8ka~>= zh@F5j>4@MgM5)`<5sh)A0)-@!_*4>Npb#tKLtUl`*|LrCLESb1?`+VwS2#37qg1m zQg*pZ} zNFl0x<^L&OwKCX$Kg2J6sur`s`>Tin=4wEc@$jerPNt&!by+c@E(F!2I8+6^{)(vs z@t1_Wp%6Ji6A&W~vqo6Cwz*uJ!;k2){XyohJBk zuNV>71b)`xrCEqNA0jSL|HuTJ6az^bpg?(WN2b39QsJ*D22(PY-T_=s@aLpHpkfp4 z1Rj#C)C(Ubbr6!Dk-W4JtliKeKlAykJx#@Ne&n3rlkM0ZyJE1jrSBmpHaWvHRQv!;*;eV&Y5HWjm#4&5~ek&umw*mBI> zN>q(<;FGyP+ycyG5meb0_-839w7W5{`=EI$|1C9%-(OKk(vzW8Qh}=JSkF1Y*6iQ7 zLQn)O+5*fi1=H;Y^6mq3RATjO5bY-r@Ac4WjqnA^2r)tpn_)K`xZBuigrnXZ33R5B zp~$~m4SC>45y0v^phg4~hnKKWQ848O=7j)%vw(O_epTuP6E%TDQ&2CfMMjnae5>GW z@D3NWT?o9w1*CAGa+-%qMHKu$59`nS5zPi1%Yx5W!Q&IKQnhLnyu1v#RVGFl1sLnid4bjLcP?-%{4A_Bi zcLM4_Rp@0BP__>D6{n$xRTi}`n542)6j-VddLs(lRET*>fZ8E-9viA1Nx;@BsNf`U zbQQ9>B;<0WPfqYt5>&7c^W_9zXQ5X%e}$A_Md^QZMeyGrd#-bQ5n`nv&g$i)sT51ID;iSPOxU<6lTtHce)2VVO>a~@qg~EaDt?-$G zxTn!y>70Xl<}b5}OSuF^x1t<4FB%#uprFWuR#X)lqPJ@hdxWziaOHbnz)0wD*xZqzNuu>jsBE|5uGGvSuehpHGSP1aC16Ly=aP5o#w^hJ?o&EE2 wv|I`Vz_6}vS7+er3|yUot21zQ2CmM))fu=t16OC@>I__+fvYp{2bzKZ1z>%CAOHXW literal 0 HcmV?d00001 diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/History.txt b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/History.txt new file mode 100644 index 00000000..b0f93f24 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/History.txt @@ -0,0 +1,11 @@ + +========================= + +V 1.0 - March 16, 2007 + + - sphere vs mesh queries + - OBB vs mesh queries + - capsule vs mesh queries + - complete box pruning + - bipartite box pruning + diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/IceHelpers.cpp b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/IceHelpers.cpp new file mode 100644 index 00000000..1e2c4220 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/IceHelpers.cpp @@ -0,0 +1,358 @@ +/* +CDTestFramework http://codercorner.com +Copyright (c) 2007-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#include "stdafx.h" +#include "IceHelpers.h" + +// Misc functions borrowed & adapted from ICE + +void RotX(Matrix3x3& m, float angle) +{ + float Cos = cosf(angle); + float Sin = sinf(angle); + m.Identity(); + m.m[1][1] = m.m[2][2] = Cos; + m.m[2][1] = -Sin; + m.m[1][2] = Sin; +} + +void RotY(Matrix3x3& m, float angle) +{ + float Cos = cosf(angle); + float Sin = sinf(angle); + m.Identity(); + m.m[0][0] = m.m[2][2] = Cos; + m.m[2][0] = Sin; + m.m[0][2] = -Sin; +} + +void RotZ(Matrix3x3& m, float angle) +{ + float Cos = cosf(angle); + float Sin = sinf(angle); + m.Identity(); + m.m[0][0] = m.m[1][1] = Cos; + m.m[1][0] = -Sin; + m.m[0][1] = Sin; +} + +bool SegmentSphere(const Point& origin, const Point& dir, float length, const Point& center, float radius, float& dist, Point& hit_pos) +{ + // get the offset vector + Point offset = center - origin; + + // get the distance along the ray to the center point of the sphere + float ray_dist = dir | offset; + + // get the squared distances + float off2 = offset | offset; + float rd2 = radius * radius; + if(off2 <= rd2) + { + // we're in the sphere + hit_pos = origin; + dist = 0.0f; + return true; + } + + if(ray_dist <= 0 || (ray_dist - length) > radius) + { + // moving away from object or too far away + return false; + } + + // find hit distance squared + float d = rd2 - (off2 - ray_dist * ray_dist); + if(d<0.0f) + { + // ray passes by sphere without hitting + return false; + } + + // get the distance along the ray + dist = ray_dist - sqrtf(d); + if(dist > length) + { + // hit point beyond length + return false; + } + + // sort out the details + hit_pos = origin + dir * dist; + return true; +} + +bool /*Ctc::*/RayAABB2(const Point& min, const Point& max, const Point& origin, const Point& dir, Point& coord) +{ + BOOL Inside = TRUE; + Point MaxT; + MaxT.x=MaxT.y=MaxT.z=-1.0f; + + // Find candidate planes. + for(udword i=0;i<3;i++) + { + if(origin[i] < min[i]) + { + coord[i] = min[i]; + Inside = FALSE; + + // Calculate T distances to candidate planes + if(IR(dir[i])) MaxT[i] = (min[i] - origin[i]) / dir[i]; + } + else if(origin[i] > max[i]) + { + coord[i] = max[i]; + Inside = FALSE; + + // Calculate T distances to candidate planes + if(IR(dir[i])) MaxT[i] = (max[i] - origin[i]) / dir[i]; + } + } + + // Ray origin inside bounding box + if(Inside) + { + coord = origin; + return true; + } + + // Get largest of the maxT's for final choice of intersection + udword WhichPlane = 0; + if(MaxT[1] > MaxT[WhichPlane]) WhichPlane = 1; + if(MaxT[2] > MaxT[WhichPlane]) WhichPlane = 2; + + // Check final candidate actually inside box + if(IR(MaxT[WhichPlane])&0x80000000) return false; + + for(udword i=0;i<3;i++) + { + if(i!=WhichPlane) + { + coord[i] = origin[i] + MaxT[WhichPlane] * dir[i]; +#ifdef RAYAABB_EPSILON + if(coord[i] < min[i] - RAYAABB_EPSILON || coord[i] > max[i] + RAYAABB_EPSILON) return false; +#else + if(coord[i] < min[i] || coord[i] > max[i]) return false; +#endif + } + } + return true; // ray hits box +} + +static const bool gNormalize = true; + +udword /*Ctc::*/RayCapsuleOverlap(const Point& origin, const Point& dir, const LSS& capsule, float s[2]) +{ + // set up quadratic Q(t) = a*t^2 + 2*b*t + c + Point kU, kV, kW, capsDir; + capsule.ComputeDirection(capsDir); + kW = capsDir; + + float fWLength = kW.Magnitude(); + kW.Normalize(); + + // generate orthonormal basis + + float fInvLength; + if ( fabsf(kW.x) >= fabsf(kW.y) ) + { + // W.x or W.z is the largest magnitude component, swap them + fInvLength = 1.0f/sqrtf(kW.x*kW.x + kW.z*kW.z); + kU.x = -kW.z*fInvLength; + kU.y = 0.0f; + kU.z = +kW.x*fInvLength; + } + else + { + // W.y or W.z is the largest magnitude component, swap them + fInvLength = 1.0f/sqrtf(kW.y*kW.y + kW.z*kW.z); + kU.x = 0.0f; + kU.y = +kW.z*fInvLength; + kU.z = -kW.y*fInvLength; + } + kV = kW^kU; +kU.Normalize(); + if(gNormalize) + kV.Normalize(); + + // compute intersection + + Point kD(kU|dir, kV|dir, kW|dir); + float fDLength = kD.Magnitude(); + kD.Normalize(); + + float fInvDLength = 1.0f/fDLength; + Point kDiff = origin - capsule.mP0; + Point kP(kU|kDiff, kV|kDiff, kW|kDiff); + float fRadiusSqr = capsule.mRadius*capsule.mRadius; + + float fInv, fA, fB, fC, fDiscr, fRoot, fT, fTmp; + + // Is the velocity parallel to the capsule direction? (or zero) + if ( fabsf(kD.z) >= 1.0f - FLT_EPSILON || fDLength < FLT_EPSILON ) + { + + float fAxisDir = dir|capsDir; + + fDiscr = fRadiusSqr - kP.x*kP.x - kP.y*kP.y; + if ( fAxisDir < 0 && fDiscr >= 0.0f ) + { + // Velocity anti-parallel to the capsule direction + fRoot = sqrtf(fDiscr); + s[0] = (kP.z + fRoot)*fInvDLength; + s[1] = -(fWLength - kP.z + fRoot)*fInvDLength; + return 2; + } + else if ( fAxisDir > 0 && fDiscr >= 0.0f ) + { + // Velocity parallel to the capsule direction + fRoot = sqrtf(fDiscr); + s[0] = -(kP.z + fRoot)*fInvDLength; + s[1] = (fWLength - kP.z + fRoot)*fInvDLength; + return 2; + } + else + { + // sphere heading wrong direction, or no velocity at all + return 0; + } + } + + // test intersection with infinite cylinder + fA = kD.x*kD.x + kD.y*kD.y; + fB = kP.x*kD.x + kP.y*kD.y; + fC = kP.x*kP.x + kP.y*kP.y - fRadiusSqr; + fDiscr = fB*fB - fA*fC; + if ( fDiscr < 0.0f ) + { + // line does not intersect infinite cylinder + return 0; + } + + int iQuantity = 0; + + if ( fDiscr > 0.0f ) + { + // line intersects infinite cylinder in two places + fRoot = sqrtf(fDiscr); + fInv = 1.0f/fA; + fT = (-fB - fRoot)*fInv; + fTmp = kP.z + fT*kD.z; + if ( 0.0f <= fTmp && fTmp <= fWLength ) + s[iQuantity++] = fT*fInvDLength; + + fT = (-fB + fRoot)*fInv; + fTmp = kP.z + fT*kD.z; + if ( 0.0f <= fTmp && fTmp <= fWLength ) + s[iQuantity++] = fT*fInvDLength; + + if ( iQuantity == 2 ) + { + // line intersects capsule wall in two places + return 2; + } + } + else + { + // line is tangent to infinite cylinder + fT = -fB/fA; + fTmp = kP.z + fT*kD.z; + if ( 0.0f <= fTmp && fTmp <= fWLength ) + { + s[0] = fT*fInvDLength; + return 1; + } + } + + // test intersection with bottom hemisphere + // fA = 1 + fB += kP.z*kD.z; + fC += kP.z*kP.z; + fDiscr = fB*fB - fC; + if ( fDiscr > 0.0f ) + { + fRoot = sqrtf(fDiscr); + fT = -fB - fRoot; + fTmp = kP.z + fT*kD.z; + if ( fTmp <= 0.0f ) + { + s[iQuantity++] = fT*fInvDLength; + if ( iQuantity == 2 ) + return 2; + } + + fT = -fB + fRoot; + fTmp = kP.z + fT*kD.z; + if ( fTmp <= 0.0f ) + { + s[iQuantity++] = fT*fInvDLength; + if ( iQuantity == 2 ) + return 2; + } + } + else if ( fDiscr == 0.0f ) + { + fT = -fB; + fTmp = kP.z + fT*kD.z; + if ( fTmp <= 0.0f ) + { + s[iQuantity++] = fT*fInvDLength; + if ( iQuantity == 2 ) + return 2; + } + } + + // test intersection with top hemisphere + // fA = 1 + fB -= kD.z*fWLength; + fC += fWLength*(fWLength - 2.0f*kP.z); + + fDiscr = fB*fB - fC; + if ( fDiscr > 0.0f ) + { + fRoot = sqrtf(fDiscr); + fT = -fB - fRoot; + fTmp = kP.z + fT*kD.z; + if ( fTmp >= fWLength ) + { + s[iQuantity++] = fT*fInvDLength; + if ( iQuantity == 2 ) + return 2; + } + + fT = -fB + fRoot; + fTmp = kP.z + fT*kD.z; + if ( fTmp >= fWLength ) + { + s[iQuantity++] = fT*fInvDLength; + if ( iQuantity == 2 ) + return 2; + } + } + else if ( fDiscr == 0.0f ) + { + fT = -fB; + fTmp = kP.z + fT*kD.z; + if ( fTmp >= fWLength ) + { + s[iQuantity++] = fT*fInvDLength; + if ( iQuantity == 2 ) + return 2; + } + } + + return iQuantity; +} + diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/IceHelpers.h b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/IceHelpers.h new file mode 100644 index 00000000..0d260d50 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/IceHelpers.h @@ -0,0 +1,41 @@ +/* +CDTestFramework http://codercorner.com +Copyright (c) 2007-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ +#ifndef ICEHELPERS_H +#define ICEHELPERS_H + + void RotX(Matrix3x3& m, float angle); + void RotY(Matrix3x3& m, float angle); + void RotZ(Matrix3x3& m, float angle); + + udword RayCapsuleOverlap(const Point& origin, const Point& dir, const LSS& capsule, float s[2]); + bool SegmentSphere(const Point& origin, const Point& dir, float length, const Point& center, float radius, float& dist, Point& hit_pos); + bool RayAABB2(const Point& min, const Point& max, const Point& origin, const Point& dir, Point& coord); + + inline_ bool RayOBB(const Point& origin, const Point& dir, const OBB& box, float& dist, Point& hit_pos) + { + Point LocalOrigin = box.mRot * (origin - box.mCenter); + Point LocalDir = box.mRot * dir; + + Point LocalImpact; + if(RayAABB2(-box.mExtents, box.mExtents, LocalOrigin, LocalDir, LocalImpact)) + { + dist = LocalImpact.Distance(LocalOrigin); + hit_pos = LocalImpact * box.mRot + box.mCenter; + return true; + } + return false; + } + +#endif // ICEHELPERS_H diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/License.txt b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/License.txt new file mode 100644 index 00000000..290add70 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/License.txt @@ -0,0 +1,49 @@ + +//////////////////////////////////////////////////////////////////////////////////////////////// +//CDTestFramework re-distributed under the ZLib license with permission of Pierre Terdiman +//////////////////////////////////////////////////////////////////////////////////////////////// + +/* +CDTestFramework http://codercorner.com +Copyright (c) 2007-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +//////////////////////////////////////////////////////////////////////////////////////////////// +DbvtTest.* and btDbvt.* are distributed under the ZLIb license, Copyright Nathanael Presson +//////////////////////////////////////////////////////////////////////////////////////////////// + +//////////////////////////////////////////////////////////////////////////////////////////////// +BulletSAPCompleteBoxPruningTest.* distributed under the ZLib license, Copyright Erwin Coumans +//////////////////////////////////////////////////////////////////////////////////////////////// + + +//////////////////////////////////////////////////////////////////////////////////////////////// +//ICE and OPCODE 1.3 re-distributed under the ZLib license with permission of Pierre Terdiman +//////////////////////////////////////////////////////////////////////////////////////////////// + +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ \ No newline at end of file diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/License.txt.bak b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/License.txt.bak new file mode 100644 index 00000000..e69de29b diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/OBBMeshQuery.cpp b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/OBBMeshQuery.cpp new file mode 100644 index 00000000..2bf7371d --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/OBBMeshQuery.cpp @@ -0,0 +1,157 @@ +/* +CDTestFramework http://codercorner.com +Copyright (c) 2007-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#include "stdafx.h" +#include "OBBMeshQuery.h" +#include "Terrain.h" +#include "IceHelpers.h" +#include "RenderingHelpers.h" +#include "Camera.h" +#include "GLFontRenderer.h" + +OBBMeshQuery::OBBMeshQuery() : + mBar (null), + mAngleX (0.0f), + mAngleY (0.0f), + mAngleZ (0.0f), + mDist (0.0f), + mValidHit (false) +{ +} + +OBBMeshQuery::~OBBMeshQuery() +{ +} + +void OBBMeshQuery::Init() +{ + mBox.mCenter = Point(0.0f, 0.0f, 0.0f); + mBox.mExtents = Point(1.0f, 1.0f, 1.0f); + mBox.mRot.Identity(); +} + +void OBBMeshQuery::Release() +{ + Deselect(); +} + +void OBBMeshQuery::Select() +{ + // Create a tweak bar + { + mBar = TwNewBar("OBBMeshQuery"); + TwAddVarRW(mBar, "Extents.x", TW_TYPE_FLOAT, &mBox.mExtents.x, " min=0.01 max=200.0 step=0.05 group='Extents' "); + TwAddVarRW(mBar, "Extents.y", TW_TYPE_FLOAT, &mBox.mExtents.y, " min=0.01 max=200.0 step=0.05 group='Extents' "); + TwAddVarRW(mBar, "Extents.z", TW_TYPE_FLOAT, &mBox.mExtents.z, " min=0.01 max=200.0 step=0.05 group='Extents' "); + TwAddVarRW(mBar, "Rot.x", TW_TYPE_FLOAT, &mAngleX, " min=0.0 max=6.28 step=0.01 group='Rotation' "); + TwAddVarRW(mBar, "Rot.y", TW_TYPE_FLOAT, &mAngleY, " min=0.0 max=6.28 step=0.01 group='Rotation' "); + TwAddVarRW(mBar, "Rot.z", TW_TYPE_FLOAT, &mAngleZ, " min=0.0 max=6.28 step=0.01 group='Rotation' "); + + mSettings.AddToTweakBar(mBar); + +// mProfiler.AddToTweakBar(mBar); + } +} + +void OBBMeshQuery::Deselect() +{ + if(mBar) + { + TwDeleteBar(mBar); + mBar = null; + } +} + +void OBBMeshQuery::PerformTest() +{ + RenderTerrain(); + + Matrix3x3 MX,MY,MZ; + RotX(MX, mAngleX); + RotY(MY, mAngleY); + RotY(MZ, mAngleZ); + mBox.mRot = MX * MY * MZ; + + DrawOBB(mBox); + + const Model* TM = GetTerrainModel(); + if(TM) + { + OBBCollider Collider; + mSettings.SetupCollider(Collider); + + mProfiler.Start(); + bool Status = Collider.Collide(mCache, mBox, *TM, null, null); + mProfiler.End(); + mProfiler.Accum(); + + if(Status) + { + if(Collider.GetContactStatus()) + { + udword NbTris = Collider.GetNbTouchedPrimitives(); + const udword* Indices = Collider.GetTouchedPrimitives(); + + RenderTerrainTriangles(NbTris, Indices); + } + } + } + + // Raycast hit + if(mValidHit) + { + Point wp = mLocalHit + mBox.mCenter; + DrawLine(wp, wp + Point(1.0f, 0.0f, 0.0f), Point(1,0,0), 1.0f); + DrawLine(wp, wp + Point(0.0f, 1.0f, 0.0f), Point(0,1,0), 1.0f); + DrawLine(wp, wp + Point(0.0f, 0.0f, 1.0f), Point(0,0,1), 1.0f); + } + + char Buffer[4096]; + sprintf(Buffer, "OBB-mesh query = %5.1f us (%d cycles)\n", mProfiler.mMsTime, mProfiler.mCycles); + GLFontRenderer::print(10.0f, 10.0f, 0.02f, Buffer); +} + +void OBBMeshQuery::KeyboardCallback(unsigned char key, int x, int y) +{ +} + +void OBBMeshQuery::MouseCallback(int button, int state, int x, int y) +{ + mValidHit = false; + if(!button && !state) + { + Point Dir = ComputeWorldRay(x, y); + + float d; + Point hit; + if(RayOBB(GetCameraPos(), Dir, mBox, d, hit)) + { + mValidHit = true; + mDist = d; + mLocalHit = hit - mBox.mCenter; + } + } +} + +void OBBMeshQuery::MotionCallback(int x, int y) +{ + if(mValidHit) + { + Point Dir = ComputeWorldRay(x, y); + mBox.mCenter = GetCameraPos() + Dir*mDist - mLocalHit; + } +} + + diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/OBBMeshQuery.h b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/OBBMeshQuery.h new file mode 100644 index 00000000..e274691d --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/OBBMeshQuery.h @@ -0,0 +1,53 @@ +/* +CDTestFramework http://codercorner.com +Copyright (c) 2007-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef OBBMESHQUERY_H +#define OBBMESHQUERY_H + +#include "CollisionTest.h" +#include "Profiling.h" + + class OBBMeshQuery : public CollisionTest + { + public: + OBBMeshQuery(); + virtual ~OBBMeshQuery(); + + virtual void Init(); + virtual void Release(); + virtual void PerformTest(); + virtual void Select(); + virtual void Deselect(); + virtual void KeyboardCallback(unsigned char key, int x, int y); + virtual void MouseCallback(int button, int state, int x, int y); + virtual void MotionCallback(int x, int y); + + TwBar* mBar; //!< AntTweakBar + OBB mBox; + + float mAngleX; + float mAngleY; + float mAngleZ; + + OBBCache mCache; + OpcodeSettings mSettings; + Profiler mProfiler; + + float mDist; + Point mLocalHit; + bool mValidHit; + }; + +#endif // OBBMESHQUERY_H diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceAABB.cpp b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceAABB.cpp new file mode 100644 index 00000000..7ea20f2e --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceAABB.cpp @@ -0,0 +1,422 @@ +/* + * ICE OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains AABB-related code. + * \file IceAABB.cpp + * \author Pierre Terdiman + * \date January, 29, 2000 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * AABB class. + * \class AABB + * \author Pierre Terdiman + * \version 1.0 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Precompiled Header +#include "Stdafx.h" + +using namespace Opcode; + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Computes the sum of two AABBs. + * \param aabb [in] the other AABB + * \return Self-Reference + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +AABB& AABB::Add(const AABB& aabb) +{ + // Compute new min & max values + Point Min; GetMin(Min); + Point Tmp; aabb.GetMin(Tmp); + Min.Min(Tmp); + + Point Max; GetMax(Max); + aabb.GetMax(Tmp); + Max.Max(Tmp); + + // Update this + SetMinMax(Min, Max); + return *this; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Makes a cube from the AABB. + * \param cube [out] the cube AABB + * \return cube edge length + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +float AABB::MakeCube(AABB& cube) const +{ + Point Ext; GetExtents(Ext); + float Max = Ext.Max(); + + Point Cnt; GetCenter(Cnt); + cube.SetCenterExtents(Cnt, Point(Max, Max, Max)); + return Max; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Makes a sphere from the AABB. + * \param sphere [out] sphere containing the AABB + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void AABB::MakeSphere(Sphere& sphere) const +{ + GetExtents(sphere.mCenter); + sphere.mRadius = sphere.mCenter.Magnitude() * 1.00001f; // To make sure sphere::Contains(*this) succeeds + GetCenter(sphere.mCenter); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Checks a box is inside another box. + * \param box [in] the other AABB + * \return true if current box is inside input box + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool AABB::IsInside(const AABB& box) const +{ + if(box.GetMin(0)>GetMin(0)) return false; + if(box.GetMin(1)>GetMin(1)) return false; + if(box.GetMin(2)>GetMin(2)) return false; + if(box.GetMax(0) max.x) ? 2 : 0) // 2 = right + + ((local_eye.y < min.y) ? 4 : 0) // 4 = bottom + + ((local_eye.y > max.y) ? 8 : 0) // 8 = top + + ((local_eye.z < min.z) ? 16 : 0) // 16 = front + + ((local_eye.z > max.z) ? 32 : 0); // 32 = back + + // Look up number of vertices in outline + num = (sdword)gIndexList[pos][7]; + // Zero indicates invalid case + if(!num) return null; + + return &gIndexList[pos][0]; +} + +// calculateBoxArea: computes the screen-projected 2D area of an oriented 3D bounding box + +//const Point& eye, //eye point (in bbox object coordinates) +//const AABB& box, //3d bbox +//const Matrix4x4& mat, //free transformation for bbox +//float width, float height, int& num) +float AABB::ComputeBoxArea(const Point& eye, const Matrix4x4& mat, float width, float height, sdword& num) const +{ + const sbyte* Outline = ComputeOutline(eye, num); + if(!Outline) return -1.0f; + + // Compute box vertices + Point vertexBox[8], dst[8]; + ComputePoints(vertexBox); + + // Transform all outline corners into 2D screen space + for(sdword i=0;i max.x) max.x = p.x; + if(p.x < min.x) min.x = p.x; + + if(p.y > max.y) max.y = p.y; + if(p.y < min.y) min.y = p.y; + + if(p.z > max.z) max.z = p.z; + if(p.z < min.z) min.z = p.z; + } + + // Forward declarations + class Sphere; + +//! Declarations of type-independent methods (most of them implemented in the .cpp) +#define AABB_COMMON_METHODS \ + AABB& Add(const AABB& aabb); \ + AABB& Sub(const AABB& aabb); \ + float MakeCube(AABB& cube) const; \ + void MakeSphere(Sphere& sphere) const; \ + const sbyte* ComputeOutline(const Point& local_eye, sdword& num) const; \ + float ComputeBoxArea(const Point& eye, const Matrix4x4& mat, float width, float height, sdword& num) const; \ + bool IsInside(const AABB& box) const; \ + bool ComputePlanes(Plane* planes) const; \ + bool ComputePoints(Point* pts) const; \ + const Point* GetVertexNormals() const; \ + const udword* GetEdges() const; \ + const Point* GetEdgeNormals() const; \ + inline_ BOOL ContainsPoint(const Point& p) const \ + { \ + if(p.x > GetMax(0) || p.x < GetMin(0)) return FALSE; \ + if(p.y > GetMax(1) || p.y < GetMin(1)) return FALSE; \ + if(p.z > GetMax(2) || p.z < GetMin(2)) return FALSE; \ + return TRUE; \ + } + + enum AABBType + { + AABB_RENDER = 0, //!< AABB used for rendering. Not visible == not rendered. + AABB_UPDATE = 1, //!< AABB used for dynamic updates. Not visible == not updated. + + AABB_FORCE_DWORD = 0x7fffffff, + }; + +#ifdef USE_MINMAX + + struct ICEMATHS_API ShadowAABB + { + Point mMin; + Point mMax; + }; + + class ICEMATHS_API AABB : public Allocateable + { + public: + //! Constructor + inline_ AABB() {} + //! Destructor + inline_ ~AABB() {} + + //! Type-independent methods + AABB_COMMON_METHODS; + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Setups an AABB from min & max vectors. + * \param min [in] the min point + * \param max [in] the max point + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + void SetMinMax(const Point& min, const Point& max) { mMin = min; mMax = max; } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Setups an AABB from center & extents vectors. + * \param c [in] the center point + * \param e [in] the extents vector + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + void SetCenterExtents(const Point& c, const Point& e) { mMin = c - e; mMax = c + e; } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Setups an empty AABB. + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + void SetEmpty() { Point p(MIN_FLOAT, MIN_FLOAT, MIN_FLOAT); mMin = -p; mMax = p;} + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Setups a point AABB. + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + void SetPoint(const Point& pt) { mMin = mMax = pt; } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Gets the size of the AABB. The size is defined as the longest extent. + * \return the size of the AABB + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + float GetSize() const { Point e; GetExtents(e); return e.Max(); } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Extends the AABB. + * \param p [in] the next point + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ void Extend(const Point& p) { ComputeMinMax(p, mMin, mMax); } + + // Data access + + //! Get min point of the box + inline_ void GetMin(Point& min) const { min = mMin; } + //! Get max point of the box + inline_ void GetMax(Point& max) const { max = mMax; } + + //! Get component of the box's min point along a given axis + inline_ float GetMin(udword axis) const { return mMin[axis]; } + //! Get component of the box's max point along a given axis + inline_ float GetMax(udword axis) const { return mMax[axis]; } + + //! Get box center + inline_ void GetCenter(Point& center) const { center = (mMax + mMin)*0.5f; } + //! Get box extents + inline_ void GetExtents(Point& extents) const { extents = (mMax - mMin)*0.5f; } + + //! Get component of the box's center along a given axis + inline_ float GetCenter(udword axis) const { return (mMax[axis] + mMin[axis])*0.5f; } + //! Get component of the box's extents along a given axis + inline_ float GetExtents(udword axis) const { return (mMax[axis] - mMin[axis])*0.5f; } + + //! Get box diagonal + inline_ void GetDiagonal(Point& diagonal) const { diagonal = mMax - mMin; } + inline_ float GetWidth() const { return mMax.x - mMin.x; } + inline_ float GetHeight() const { return mMax.y - mMin.y; } + inline_ float GetDepth() const { return mMax.z - mMin.z; } + + //! Volume + inline_ float GetVolume() const { return GetWidth() * GetHeight() * GetDepth(); } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Computes the intersection between two AABBs. + * \param a [in] the other AABB + * \return true on intersection + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ BOOL Intersect(const AABB& a) const + { + if(mMax.x < a.mMin.x + || a.mMax.x < mMin.x + || mMax.y < a.mMin.y + || a.mMax.y < mMin.y + || mMax.z < a.mMin.z + || a.mMax.z < mMin.z) return FALSE; + + return TRUE; + } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Computes the 1D-intersection between two AABBs, on a given axis. + * \param a [in] the other AABB + * \param axis [in] the axis (0, 1, 2) + * \return true on intersection + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ BOOL Intersect(const AABB& a, udword axis) const + { + if(mMax[axis] < a.mMin[axis] || a.mMax[axis] < mMin[axis]) return FALSE; + return TRUE; + } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Recomputes the AABB after an arbitrary transform by a 4x4 matrix. + * Original code by Charles Bloom on the GD-Algorithm list. (I slightly modified it) + * \param mtx [in] the transform matrix + * \param aabb [out] the transformed AABB [can be *this] + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ void Rotate(const Matrix4x4& mtx, AABB& aabb) const + { + // The three edges transformed: you can efficiently transform an X-only vector + // by just getting the "X" column of the matrix + Point vx,vy,vz; + mtx.GetRow(0, vx); vx *= (mMax.x - mMin.x); + mtx.GetRow(1, vy); vy *= (mMax.y - mMin.y); + mtx.GetRow(2, vz); vz *= (mMax.z - mMin.z); + + // Transform the min point + aabb.mMin = aabb.mMax = mMin * mtx; + + // Take the transformed min & axes and find new extents + // Using CPU code in the right place is faster... + if(IS_NEGATIVE_FLOAT(vx.x)) aabb.mMin.x += vx.x; else aabb.mMax.x += vx.x; + if(IS_NEGATIVE_FLOAT(vx.y)) aabb.mMin.y += vx.y; else aabb.mMax.y += vx.y; + if(IS_NEGATIVE_FLOAT(vx.z)) aabb.mMin.z += vx.z; else aabb.mMax.z += vx.z; + if(IS_NEGATIVE_FLOAT(vy.x)) aabb.mMin.x += vy.x; else aabb.mMax.x += vy.x; + if(IS_NEGATIVE_FLOAT(vy.y)) aabb.mMin.y += vy.y; else aabb.mMax.y += vy.y; + if(IS_NEGATIVE_FLOAT(vy.z)) aabb.mMin.z += vy.z; else aabb.mMax.z += vy.z; + if(IS_NEGATIVE_FLOAT(vz.x)) aabb.mMin.x += vz.x; else aabb.mMax.x += vz.x; + if(IS_NEGATIVE_FLOAT(vz.y)) aabb.mMin.y += vz.y; else aabb.mMax.y += vz.y; + if(IS_NEGATIVE_FLOAT(vz.z)) aabb.mMin.z += vz.z; else aabb.mMax.z += vz.z; + } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Checks the AABB is valid. + * \return true if the box is valid + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ BOOL IsValid() const + { + // Consistency condition for (Min, Max) boxes: min < max + if(mMin.x > mMax.x) return FALSE; + if(mMin.y > mMax.y) return FALSE; + if(mMin.z > mMax.z) return FALSE; + return TRUE; + } + + //! Operator for AABB *= float. Scales the extents, keeps same center. + inline_ AABB& operator*=(float s) + { + Point Center; GetCenter(Center); + Point Extents; GetExtents(Extents); + SetCenterExtents(Center, Extents * s); + return *this; + } + + //! Operator for AABB /= float. Scales the extents, keeps same center. + inline_ AABB& operator/=(float s) + { + Point Center; GetCenter(Center); + Point Extents; GetExtents(Extents); + SetCenterExtents(Center, Extents / s); + return *this; + } + + //! Operator for AABB += Point. Translates the box. + inline_ AABB& operator+=(const Point& trans) + { + mMin+=trans; + mMax+=trans; + return *this; + } + private: + Point mMin; //!< Min point + Point mMax; //!< Max point + }; + +#else + + class ICEMATHS_API AABB + { + public: + //! Constructor + inline_ AABB() {} + //! Destructor + inline_ ~AABB() {} + + //! Type-independent methods + AABB_COMMON_METHODS; + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Setups an AABB from min & max vectors. + * \param min [in] the min point + * \param max [in] the max point + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + void SetMinMax(const Point& min, const Point& max) { mCenter = (max + min)*0.5f; mExtents = (max - min)*0.5f; } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Setups an AABB from center & extents vectors. + * \param c [in] the center point + * \param e [in] the extents vector + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + void SetCenterExtents(const Point& c, const Point& e) { mCenter = c; mExtents = e; } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Setups an empty AABB. + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + void SetEmpty() { mCenter.Zero(); mExtents.Set(MIN_FLOAT, MIN_FLOAT, MIN_FLOAT);} + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Setups a point AABB. + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + void SetPoint(const Point& pt) { mCenter = pt; mExtents.Zero(); } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Gets the size of the AABB. The size is defined as the longest extent. + * \return the size of the AABB + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + float GetSize() const { return mExtents.Max(); } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Extends the AABB. + * \param p [in] the next point + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + void Extend(const Point& p) + { + Point Max = mCenter + mExtents; + Point Min = mCenter - mExtents; + + if(p.x > Max.x) Max.x = p.x; + if(p.x < Min.x) Min.x = p.x; + + if(p.y > Max.y) Max.y = p.y; + if(p.y < Min.y) Min.y = p.y; + + if(p.z > Max.z) Max.z = p.z; + if(p.z < Min.z) Min.z = p.z; + + SetMinMax(Min, Max); + } + // Data access + + //! Get min point of the box + inline_ void GetMin(Point& min) const { min = mCenter - mExtents; } + //! Get max point of the box + inline_ void GetMax(Point& max) const { max = mCenter + mExtents; } + + //! Get component of the box's min point along a given axis + inline_ float GetMin(udword axis) const { return mCenter[axis] - mExtents[axis]; } + //! Get component of the box's max point along a given axis + inline_ float GetMax(udword axis) const { return mCenter[axis] + mExtents[axis]; } + + //! Get box center + inline_ void GetCenter(Point& center) const { center = mCenter; } + //! Get box extents + inline_ void GetExtents(Point& extents) const { extents = mExtents; } + + //! Get component of the box's center along a given axis + inline_ float GetCenter(udword axis) const { return mCenter[axis]; } + //! Get component of the box's extents along a given axis + inline_ float GetExtents(udword axis) const { return mExtents[axis]; } + + //! Get box diagonal + inline_ void GetDiagonal(Point& diagonal) const { diagonal = mExtents * 2.0f; } + inline_ float GetWidth() const { return mExtents.x * 2.0f; } + inline_ float GetHeight() const { return mExtents.y * 2.0f; } + inline_ float GetDepth() const { return mExtents.z * 2.0f; } + + //! Volume + inline_ float GetVolume() const { return mExtents.x * mExtents.y * mExtents.z * 8.0f; } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Computes the intersection between two AABBs. + * \param a [in] the other AABB + * \return true on intersection + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ BOOL Intersect(const AABB& a) const + { + float tx = mCenter.x - a.mCenter.x; float ex = a.mExtents.x + mExtents.x; if(AIR(tx) > IR(ex)) return FALSE; + float ty = mCenter.y - a.mCenter.y; float ey = a.mExtents.y + mExtents.y; if(AIR(ty) > IR(ey)) return FALSE; + float tz = mCenter.z - a.mCenter.z; float ez = a.mExtents.z + mExtents.z; if(AIR(tz) > IR(ez)) return FALSE; + return TRUE; + } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * The standard intersection method from Gamasutra. Just here to check its speed against the one above. + * \param a [in] the other AABB + * \return true on intersection + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ bool GomezIntersect(const AABB& a) + { + Point T = mCenter - a.mCenter; // Vector from A to B + return ((fabsf(T.x) <= (a.mExtents.x + mExtents.x)) + && (fabsf(T.y) <= (a.mExtents.y + mExtents.y)) + && (fabsf(T.z) <= (a.mExtents.z + mExtents.z))); + } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Computes the 1D-intersection between two AABBs, on a given axis. + * \param a [in] the other AABB + * \param axis [in] the axis (0, 1, 2) + * \return true on intersection + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ BOOL Intersect(const AABB& a, udword axis) const + { + float t = mCenter[axis] - a.mCenter[axis]; + float e = a.mExtents[axis] + mExtents[axis]; + if(AIR(t) > IR(e)) return FALSE; + return TRUE; + } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Recomputes the AABB after an arbitrary transform by a 4x4 matrix. + * \param mtx [in] the transform matrix + * \param aabb [out] the transformed AABB [can be *this] + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ void Rotate(const Matrix4x4& mtx, AABB& aabb) const + { + // Compute new center + aabb.mCenter = mCenter * mtx; + + // Compute new extents. FPU code & CPU code have been interleaved for improved performance. + Point Ex(mtx.m[0][0] * mExtents.x, mtx.m[0][1] * mExtents.x, mtx.m[0][2] * mExtents.x); + IR(Ex.x)&=0x7fffffff; IR(Ex.y)&=0x7fffffff; IR(Ex.z)&=0x7fffffff; + + Point Ey(mtx.m[1][0] * mExtents.y, mtx.m[1][1] * mExtents.y, mtx.m[1][2] * mExtents.y); + IR(Ey.x)&=0x7fffffff; IR(Ey.y)&=0x7fffffff; IR(Ey.z)&=0x7fffffff; + + Point Ez(mtx.m[2][0] * mExtents.z, mtx.m[2][1] * mExtents.z, mtx.m[2][2] * mExtents.z); + IR(Ez.x)&=0x7fffffff; IR(Ez.y)&=0x7fffffff; IR(Ez.z)&=0x7fffffff; + + aabb.mExtents.x = Ex.x + Ey.x + Ez.x; + aabb.mExtents.y = Ex.y + Ey.y + Ez.y; + aabb.mExtents.z = Ex.z + Ey.z + Ez.z; + } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Checks the AABB is valid. + * \return true if the box is valid + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ BOOL IsValid() const + { + // Consistency condition for (Center, Extents) boxes: Extents >= 0 + if(IS_NEGATIVE_FLOAT(mExtents.x)) return FALSE; + if(IS_NEGATIVE_FLOAT(mExtents.y)) return FALSE; + if(IS_NEGATIVE_FLOAT(mExtents.z)) return FALSE; + return TRUE; + } + + //! Operator for AABB *= float. Scales the extents, keeps same center. + inline_ AABB& operator*=(float s) { mExtents*=s; return *this; } + + //! Operator for AABB /= float. Scales the extents, keeps same center. + inline_ AABB& operator/=(float s) { mExtents/=s; return *this; } + + //! Operator for AABB += Point. Translates the box. + inline_ AABB& operator+=(const Point& trans) + { + mCenter+=trans; + return *this; + } + private: + Point mCenter; //!< AABB Center + Point mExtents; //!< x, y and z extents + }; + +#endif + + //! Computes the AABB around a set of vertices + inline_ void ComputeAABB(AABB& aabb, const Point* list, udword nb_pts) + { + if(list) + { + Point Maxi(MIN_FLOAT, MIN_FLOAT, MIN_FLOAT); + Point Mini(MAX_FLOAT, MAX_FLOAT, MAX_FLOAT); + while(nb_pts--) + { +// _prefetch(list+1); // off by one ? + ComputeMinMax(*list++, Mini, Maxi); + } + aabb.SetMinMax(Mini, Maxi); + } + } + + //! Computes the AABB around a set of vertices after transform by a matrix + inline_ void ComputeAABB(AABB& aabb, const Point* list, udword nb_pts, const Matrix4x4& world) + { + if(list) + { + Point Maxi(MIN_FLOAT, MIN_FLOAT, MIN_FLOAT); + Point Mini(MAX_FLOAT, MAX_FLOAT, MAX_FLOAT); + while(nb_pts--) + { +// _prefetch(list+1); // off by one ? + ComputeMinMax((*list++)*world, Mini, Maxi); + } + aabb.SetMinMax(Mini, Maxi); + } + } + +#endif // ICEAABB_H diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceAllocator.cpp b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceAllocator.cpp new file mode 100644 index 00000000..2b8abe86 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceAllocator.cpp @@ -0,0 +1,805 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains an allocator base class. + * \file IceAllocator.cpp + * \author Pierre Terdiman + * \date December, 19, 2003 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Precompiled Header +#include "StdAfx.h" +#include + +using namespace Opcode; + +//#define ZERO_OVERHEAD_RELEASE +#define NEW_CODE +// For some reason dmalloc seems a lot slower than the system malloc? +//#define USE_DMALLOC + +#ifdef USE_DMALLOC + #include "dmalloc.h" + #define LOCAL_MALLOC dlmalloc + #define LOCAL_FREE dlfree +#else + #define LOCAL_MALLOC ::malloc + #define LOCAL_FREE ::free +#endif + + +// WARNING: this makes allocations a lot slower. Only use when tracking memory leaks. +//#define ALLOC_STRINGS + +// ### doesn't seem that useful +//#define FAST_BUFFER_SIZE 256*1024 + +#define DEBUG_IDENTIFIER 0xBeefBabe +#define DEBUG_DEALLOCATED 0xDeadDead + +#ifdef ALLOC_STRINGS +static const char* AllocString(const char* str) +{ + if(!str) return null; + char* mem = (char*)LOCAL_MALLOC(strlen(str)+1); + strcpy(mem, str); + return mem; +} + +static void FreeString(const char* str) +{ + if(str) LOCAL_FREE((void*)str); +} + +#endif + + class DefaultAllocator : public Allocator + { + public: + DefaultAllocator(); + virtual ~DefaultAllocator(); + + void reset(); + + override(Allocator) void* malloc(size_t size, MemoryType type); + override(Allocator) void* mallocDebug(size_t size, const char* filename, udword line, const char* class_name, MemoryType type); + override(Allocator) void* realloc(void* memory, size_t size); + override(Allocator) void* shrink(void* memory, size_t size); + override(Allocator) void free(void* memory); + + void DumpCurrentMemoryState() const; + + void** mMemBlockList; + udword mMemBlockListSize; +#ifdef NEW_CODE + udword mFirstFree; +#else + udword mMemBlockFirstFree; +#endif + udword mMemBlockUsed; + + sdword mNbAllocatedBytes; + sdword mHighWaterMark; + sdword mTotalNbAllocs; + sdword mNbAllocs; + sdword mNbReallocs; +#ifdef FAST_BUFFER_SIZE + udword mNbFastBytes; + udword mFastBufferOffset; + ubyte* mFastBuffer; +#endif + }; + +#define MEMBLOCKSTART 64 + + struct DebugBlock + { + udword mCheckValue; +#ifdef FAST_BUFFER_SIZE + MemoryType mType; +#endif + udword mSize; + const char* mFilename; + udword mLine; + udword mSlotIndex; + const char* mClassName; + }; + +#ifndef FAST_BUFFER_SIZE + ICE_COMPILE_TIME_ASSERT(sizeof(DebugBlock)==24); // Prevents surprises..... +#endif + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DefaultAllocator::DefaultAllocator() : mNbAllocatedBytes(0), mHighWaterMark(0), mTotalNbAllocs(0), mNbAllocs(0), mNbReallocs(0) +{ + mMemBlockList = null; + +#ifdef _DEBUG + // Initialize the Memory blocks list (DEBUG mode only) + mMemBlockList = (void**)LOCAL_MALLOC(MEMBLOCKSTART*sizeof(void*)); + ZeroMemory(mMemBlockList, MEMBLOCKSTART*sizeof(void*)); + mMemBlockListSize = MEMBLOCKSTART; +#ifdef NEW_CODE + mFirstFree = INVALID_ID; +#else + mMemBlockFirstFree = 0; +#endif + mMemBlockUsed = 0; +#endif + + +#ifdef FAST_BUFFER_SIZE + mNbFastBytes = 0; + mFastBufferOffset = 0; + mFastBuffer = (ubyte*)LOCAL_MALLOC(FAST_BUFFER_SIZE); +#endif +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +DefaultAllocator::~DefaultAllocator() +{ +#ifdef FAST_BUFFER_SIZE + mNbFastBytes = 0; + mFastBufferOffset = 0; + if(mFastBuffer) LOCAL_FREE(mFastBuffer); + mFastBuffer = null; +#endif + +#ifdef _DEBUG + + // Ok, it is a bad idea to use _F() here, because it internally uses the allocator (for the log string). So let's use good old C style here. + char Buffer[4096]; + + if(mNbAllocatedBytes) + { + sprintf(Buffer, "Memory leak detected: %d bytes non released\n", mNbAllocatedBytes); +// IceTrace(Buffer); +// IceTrace(_F("Memory leak detected: %d bytes non released\n", mNbAllocatedBytes)); + } + if(mNbAllocs) + { + sprintf(Buffer, "Remaining allocs: %d\n", mNbAllocs); +// IceTrace(Buffer); +// IceTrace(_F("Remaining allocs: %d\n", mNbAllocs)); + } +// IceTrace(_F("Nb alloc: %d\n", mTotalNbAllocs)); + sprintf(Buffer, "Total nb alloc: %d\n", mTotalNbAllocs); +// IceTrace(Buffer); + +// IceTrace(_F("Nb realloc: %d\n", mNbReallocs)); + sprintf(Buffer, "Nb realloc: %d\n", mNbReallocs); +// IceTrace(Buffer); + +// IceTrace(_F("High water mark: %d Kb\n", mHighWaterMark/1024)); + sprintf(Buffer, "High water mark: %d Kb\n", mHighWaterMark/1024); +// IceTrace(Buffer); + + // Scanning for memory leaks + if(mMemBlockList && mNbAllocs) + { + udword NbLeaks = 0; +// IceTrace("\n\n ICE Message Memory leaks detected :\n\n"); + +#ifdef NEW_CODE + for(udword i=0; imSize, DB->mClassName, DB->mFilename, DB->mLine)); + sprintf(Buffer, " Address 0x%.8X, %d bytes (%s), allocated in: %s(%d):\n\n", DB+1, DB->mSize, DB->mClassName, DB->mFilename, DB->mLine); +// IceTrace(Buffer); + + NbLeaks++; +// Free(cur+4); + } +#else + for(udword i=0, j=0; imSize, DB->mClassName, DB->mFilename, DB->mLine)); + sprintf(Buffer, " Address 0x%.8X, %d bytes (%s), allocated in: %s(%d):\n\n", DB+1, DB->mSize, DB->mClassName, DB->mFilename, DB->mLine); + IceTrace(Buffer); + + NbLeaks++; +// Free(cur+4); + } +#endif +// IceTrace(_F("\n Dump complete (%d leaks)\n\n", NbLeaks)); + sprintf(Buffer, "\n Dump complete (%d leaks)\n\n", NbLeaks); +// IceTrace(Buffer); + } + // Free the Memory Block list + if(mMemBlockList) LOCAL_FREE(mMemBlockList); + mMemBlockList = null; +#endif +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +void DefaultAllocator::reset() +{ + mNbAllocatedBytes = 0; + mHighWaterMark = 0; + mNbAllocs = 0; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +void* DefaultAllocator::malloc(udword size, MemoryType type) +{ +// return ::malloc(size); + +#ifdef _DEBUG + return mallocDebug(size, null, 0, "Undefined", type); +#endif + + if(!size) + { +#ifdef _DEBUG +// IceTrace("Warning: trying to allocate 0 bytes\n"); +#endif + return null; + } + + mTotalNbAllocs++; + mNbAllocs++; + + mNbAllocatedBytes+=size; + if(mNbAllocatedBytes>mHighWaterMark) mHighWaterMark = mNbAllocatedBytes; + +#ifdef ZERO_OVERHEAD_RELEASE + return LOCAL_MALLOC(size); +#else + void* ptr = (void*)LOCAL_MALLOC(size+8); + udword* blockStart = (udword*)ptr; + blockStart[0] = DEBUG_IDENTIFIER; + blockStart[1] = size; + return ((udword*)ptr)+2; +#endif +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +void* DefaultAllocator::mallocDebug(size_t size, const char* filename, udword line, const char* class_name, MemoryType type) +{ +#ifdef _DEBUG + if(!size) + { +// IceTrace("Warning: trying to allocate 0 bytes\n"); + return null; + } + + // Catch improper use of alloc macro... + if(0 && class_name) + { + const char* c = class_name; + while(*c) + { + if(*c==']' || *c=='[') + { + int stop=0; + } + c++; + } + } + + // Make sure size is even + if(size&1) size++; + +#ifdef FAST_BUFFER_SIZE + // Allocate one debug block in front of each real allocation + void* ptr = null; + if(type==MEMORY_TEMP) + { + udword NeededSize = size + sizeof(DebugBlock); + if(mFastBufferOffset + NeededSize <= FAST_BUFFER_SIZE) + { + ptr = mFastBuffer + mFastBufferOffset; + mFastBufferOffset += NeededSize; + mNbFastBytes += NeededSize; + } + } + + if(!ptr) + { + ptr = (void*)LOCAL_MALLOC(size + sizeof(DebugBlock)); + type = MEMORY_PERSISTENT; + } +#else + // Allocate one debug block in front of each real allocation + void* ptr = (void*)LOCAL_MALLOC(size + sizeof(DebugBlock)); +#endif + ASSERT(IS_ALIGNED_2(udword(ptr))); + + // Fill debug block + DebugBlock* DB = (DebugBlock*)ptr; + DB->mCheckValue = DEBUG_IDENTIFIER; +#ifdef FAST_BUFFER_SIZE + DB->mType = type; +#endif + DB->mSize = size; + DB->mLine = line; + DB->mSlotIndex = INVALID_ID; +#ifdef ALLOC_STRINGS + DB->mFilename = AllocString(filename); + DB->mClassName = AllocString(class_name); +#else + DB->mFilename = filename; + DB->mClassName = class_name; +#endif + + // Update global stats + mTotalNbAllocs++; + mNbAllocs++; + mNbAllocatedBytes += size; + if(mNbAllocatedBytes>mHighWaterMark) + mHighWaterMark = mNbAllocatedBytes; + + // Insert the allocated block in the debug memory block list + if(mMemBlockList) + { +#ifdef NEW_CODE + if(mFirstFree!=INVALID_ID) + { + // Recycle old location + + udword NextFree = udword(mMemBlockList[mFirstFree]); + if(NextFree!=INVALID_ID) NextFree>>=1; + + mMemBlockList[mFirstFree] = ptr; + DB->mSlotIndex = mFirstFree; + + mFirstFree = NextFree; + } + else + { + if(mMemBlockUsed==mMemBlockListSize) + { + // Allocate a bigger block + void** tps = (void**)LOCAL_MALLOC((mMemBlockListSize+MEMBLOCKSTART)*sizeof(void*)); + // Copy already used part + CopyMemory(tps, mMemBlockList, mMemBlockListSize*sizeof(void*)); + // Initialize remaining part + void* Next = tps + mMemBlockListSize; + ZeroMemory(Next, MEMBLOCKSTART*sizeof(void*)); + + // Free previous memory, setup new pointer + LOCAL_FREE(mMemBlockList); + mMemBlockList = tps; + // Setup new size + mMemBlockListSize += MEMBLOCKSTART; + } + + mMemBlockList[mMemBlockUsed] = ptr; + DB->mSlotIndex = mMemBlockUsed++; + } +#else + // Store allocated pointer in first free slot + mMemBlockList[mMemBlockFirstFree] = ptr; + DB->mSlotIndex = mMemBlockFirstFree; + + // Count number of used slots + mMemBlockUsed++; + + // Resize if needed + if(mMemBlockUsed==mMemBlockListSize) + { + // Allocate a bigger block + void** tps = (void**)LOCAL_MALLOC((mMemBlockListSize+MEMBLOCKSTART)*sizeof(void*)); + // Copy already used part + CopyMemory(tps, mMemBlockList, mMemBlockListSize*sizeof(void*)); + // Initialize remaining part + void* Next = tps + mMemBlockListSize; + ZeroMemory(Next, MEMBLOCKSTART*sizeof(void*)); + + // Free previous memory, setup new pointer + LOCAL_FREE(mMemBlockList); + mMemBlockList = tps; + // -1 because we'll do a ++ just afterwards + mMemBlockFirstFree = mMemBlockListSize-1; + // Setup new size + mMemBlockListSize += MEMBLOCKSTART; + } + + // Look for first free ### recode this ugly thing + while(mMemBlockList[++mMemBlockFirstFree] && (mMemBlockFirstFreemCheckValue!=DEBUG_IDENTIFIER) + { + // Not a valid memory block + return null; + } + if(size>DB->mSize) + { + // New size should be smaller! + return null; + } + + // Try to shrink the block + void* Reduced = _expand(SystemPointer, size + sizeof(DebugBlock)); + if(!Reduced) return null; + + if(Reduced!=SystemPointer) + { + // Should not be possible?! + } + + // Update stats + mNbAllocatedBytes -= DB->mSize; + mNbAllocatedBytes += size; + // Setup new size + DB->mSize = size; + + return memory; // The pointer should not have changed! +#else + // Release codepath + udword* SystemPointer = ((udword*)memory)-2; + if(SystemPointer[0]!=DEBUG_IDENTIFIER) + { + // Not a valid memory block + return null; + } + if(size>SystemPointer[1]) + { + // New size should be smaller! + return null; + } + + // Try to shrink the block + void* Reduced = _expand(SystemPointer, size+8); + if(!Reduced) return null; + + if(Reduced!=SystemPointer) + { + // Should not be possible?! + } + + // Update stats + mNbAllocatedBytes -= SystemPointer[1]; + mNbAllocatedBytes += size; + // Setup new size + SystemPointer[1] = size; + + return memory; // The pointer should not have changed! +#endif +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +void* DefaultAllocator::realloc(void* memory, udword size) +{ +// return ::realloc(memory, size); + + ASSERT(0); + return null; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +void DefaultAllocator::free(void* memory) +{ + if(!memory) + { +#ifdef _DEBUG +// IceTrace("Warning: trying to free null pointer\n"); +#endif + return; + } + +#ifdef _DEBUG + DebugBlock* DB = ((DebugBlock*)memory)-1; + +// DebugBlock TmpDB = *DB; // Keep a local copy to have readable data when ::free() fails! + + // Check we allocated it + if(DB->mCheckValue!=DEBUG_IDENTIFIER) + { +// IceTrace("Error: free unknown memory!!\n"); + // ### should we really continue?? + return; + } + + // Update global stats + mNbAllocatedBytes -= DB->mSize; + mNbAllocs--; + +#ifdef NEW_CODE + // Remove the block from the Memory block list + if(mMemBlockList) + { + udword FreeSlot = DB->mSlotIndex; + ASSERT(mMemBlockList[FreeSlot]==DB); + + udword NextFree = mFirstFree; + if(NextFree!=INVALID_ID) + { + NextFree<<=1; + NextFree|=1; + } + + mMemBlockList[FreeSlot] = (void*)NextFree; + mFirstFree = FreeSlot; + } +#else + udword MemBlockFirstFree = DB->mSlotIndex; // The slot we are in + udword Line = DB->mLine; + const char* File = DB->mFilename; + + // Remove the block from the Memory block list + if(mMemBlockList) + { + ASSERT(mMemBlockList[MemBlockFirstFree]==DB); + mMemBlockList[MemBlockFirstFree] = null; + mMemBlockUsed--; + } +#endif + +#ifdef ALLOC_STRINGS + FreeString(DB->mClassName); + FreeString(DB->mFilename); +#endif + +#ifdef FAST_BUFFER_SIZE + if(DB->mType==MEMORY_TEMP) + { + mNbFastBytes -= DB->mSize + sizeof(DebugBlock); + if(mNbFastBytes==0) + { + mFastBufferOffset = 0; + } + return; + } +#endif + + // ### should be useless since we'll release the memory just afterwards + DB->mCheckValue = DEBUG_DEALLOCATED; + DB->mSize = 0; + DB->mClassName = null; + DB->mFilename = null; + DB->mSlotIndex = INVALID_ID; + DB->mLine = INVALID_ID; + + LOCAL_FREE(DB); +#else + // Release codepath + #ifdef ZERO_OVERHEAD_RELEASE + +// mNbAllocatedBytes -= ptr[1]; // ### use _msize() ? + mNbAllocs--; + LOCAL_FREE(memory); + + #else + + udword* ptr = ((udword*)memory)-2; + if(ptr[0]!=DEBUG_IDENTIFIER) + { + #ifdef _DEBUG + IceTrace("Error: free unknown memory!!\n"); + #endif + } + mNbAllocatedBytes -= ptr[1]; + if(mNbAllocatedBytes<0) + { + #ifdef _DEBUG + IceTrace(_F("Oops (%d)\n", ptr[1])); + #endif + } + mNbAllocs--; + ptr[0]=DEBUG_DEALLOCATED; + ptr[1]=0; + LOCAL_FREE(ptr); + + #endif +#endif +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +inline_ bool ValidAddress(const void* addy) +{ +#ifdef NEW_CODE + return (addy && !(udword(addy)&1)); +#else + return addy!=null; +#endif +} + +void DefaultAllocator::DumpCurrentMemoryState() const +{ +#ifdef _DEBUG + // Scanning for memory leaks + if(mMemBlockList && mMemBlockUsed) + { +// IceTrace("\n\n----ALLOCATOR MEMORY DUMP:\n\n"); + + // We can't just use the "const char*" stored in the debug blocks because they're not guaranteed to + // be unique for similar strings. For example if a Container is allocated from two different DLLs, + // the "Container" character string will be duplicated (one per DLL). So we need to group similar + // strings together using the actual characters, not just the string address. We also have to do this + // without allocating any new memory, since it would add new entries to the memory debug structure. + // + // The good news is that we don't care about speed too much in this function, since it's not supposed + // to be called all the time. + + struct Local + { + struct TmpStruct + { + const char* mName; + udword mSize; + }; + static int SortCB(const void* elem1, const void* elem2) + { + const TmpStruct* s1 = (const TmpStruct*)elem1; + const TmpStruct* s2 = (const TmpStruct*)elem2; + return strcmp(s1->mName, s2->mName); + } + }; + + Local::TmpStruct* SortedStrings = (Local::TmpStruct*)LOCAL_MALLOC(sizeof(Local::TmpStruct)*mMemBlockListSize); + udword NbStrings = 0; + udword TotalSize = 0; + for(udword i=0;imClassName) + { + SortedStrings[NbStrings].mName = DB->mClassName; // Memory by class +// SortedStrings[NbStrings].mName = DB->mFilename; // Memory by file + SortedStrings[NbStrings].mSize = DB->mSize; + TotalSize += DB->mSize; + NbStrings++; + } + } + } + qsort(SortedStrings, NbStrings, sizeof(Local::TmpStruct), Local::SortCB); + + // Strings are now sorted. They might still be duplicated, i.e. we may have two strings for the same + // class. So now we parse the list and collect used memory for all classes. Then we sort this again, + // to report results in order of increasing memory. + + udword NbClasses=0; + udword* Classes = (udword*)LOCAL_MALLOC(sizeof(udword)*NbStrings); + udword* Sizes = (udword*)LOCAL_MALLOC(sizeof(udword)*NbStrings); + + udword CurrentSize = SortedStrings[0].mSize; + const char* CurrentClass = SortedStrings[0].mName; + for(udword i=1;i<=NbStrings;i++) // One more time on purpose + { + const char* Current = null; + if(i!=NbStrings) + { + Current = SortedStrings[i].mName; + } + + if(Current && strcmp(Current, CurrentClass)==0) + { + // Same class + CurrentSize += SortedStrings[i].mSize; + } + else + { + // New class + + // Store previous class + if(CurrentClass) + { + Classes[NbClasses] = (udword)CurrentClass; // We can store this pointer now because it's unique in our new array + Sizes[NbClasses++] = CurrentSize; + } + + // Next one + if(Current) + { + CurrentClass = Current; + CurrentSize = SortedStrings[i].mSize; + } + } + } + + udword* Ranks0 = (udword*)LOCAL_MALLOC(sizeof(udword)*NbClasses); + udword* Ranks1 = (udword*)LOCAL_MALLOC(sizeof(udword)*NbClasses); + + StackRadixSort(RS, Ranks0, Ranks1); + const udword* Sorted = RS.Sort(Sizes, NbClasses).GetRanks(); + for(udword i=0;iDumpCurrentMemoryState(); +} + +void InitDefaultAllocator() +{ +// gDefault = ::new DefaultAllocator; +} + +void ReleaseDefaultAllocator() +{ +// if(gDefault) ::delete gDefault; +// gDefault = null; +} diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceAllocator.h b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceAllocator.h new file mode 100644 index 00000000..694d542c --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceAllocator.h @@ -0,0 +1,52 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains an allocator base class. + * \file IceAllocator.h + * \author Pierre Terdiman + * \date December, 19, 2003 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef ICEALLOCATOR_H +#define ICEALLOCATOR_H + + enum MemoryType + { + MEMORY_PERSISTENT, + MEMORY_TEMP, + }; + + class ICECORE_API Allocator + { + public: + virtual void* malloc(size_t size, MemoryType type) = 0; + virtual void* mallocDebug(size_t size, const char* filename, udword line, const char* class_name, MemoryType type) = 0; + virtual void* realloc(void* memory, size_t size) = 0; + virtual void* shrink(void* memory, size_t size) = 0; + virtual void free(void* memory) = 0; + }; + + FUNCTION ICECORE_API Allocator* GetAllocator(); + FUNCTION ICECORE_API bool SetAllocator(Allocator& allocator); + FUNCTION ICECORE_API void DumpMemory(); + + class ICECORE_API Allocateable + { + public: +#ifdef DONT_TRACK_MEMORY_LEAKS + inline_ void* operator new (size_t size, MemoryType type) { return GetAllocator()->malloc(size, type); } + inline_ void* operator new (size_t size, const char * filename, int line, const char* class_name, MemoryType type) { return GetAllocator()->mallocDebug(size, filename, line, class_name, type); } + inline_ void* operator new[] (size_t size, MemoryType type) { return GetAllocator()->malloc(size, type); } + inline_ void* operator new[] (size_t size, const char * filename, int line, const char* class_name, MemoryType type) { return GetAllocator()->mallocDebug(size, filename, line, class_name, type); } + inline_ void operator delete (void* p) { GetAllocator()->free(p); } + inline_ void operator delete (void* p, MemoryType) { GetAllocator()->free(p); } + inline_ void operator delete (void* p, const char*, int, const char*, MemoryType) { GetAllocator()->free(p); } + inline_ void operator delete[] (void* p) { GetAllocator()->free(p); } + inline_ void operator delete[] (void* p, MemoryType) { GetAllocator()->free(p); } + inline_ void operator delete[] (void* p, const char*, int, const char*, MemoryType) { GetAllocator()->free(p); } +#endif + }; + +#endif // ICEALLOCATOR_H diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceAssert.h b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceAssert.h new file mode 100644 index 00000000..386ec13b --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceAssert.h @@ -0,0 +1,48 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains custom assertion code. + * \file IceAssert.h + * \author Pierre Terdiman + * \date January, 14, 2001 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef ICEASSERT_H +#define ICEASSERT_H + +// Leave the {} so that you can write this kind of things safely in release mode: +// if(condition) ASSERT() + +#ifndef ASSERT + #if defined( _DEBUG ) + FUNCTION ICECORE_API bool CustomAssertFunction(int, char*, int, char*, bool&); + + //! Custom ASSERT function. Various usages: + //! ASSERT(condition) + //! ASSERT(!"Not implemented") + //! ASSERT(condition && "error text") + #define ASSERT(exp) \ + { \ + static bool IgnoreAlways = false; \ + if(!IgnoreAlways) \ + { \ + if(CustomAssertFunction((int)(exp), #exp, __LINE__, __FILE__, IgnoreAlways)) \ + { \ + _asm { int 3 } \ + } \ + } \ + } + #else + #define ASSERT(exp) {} + #endif +#endif + +#ifndef assert + #define assert ASSERT +#endif + + #define ICE_COMPILE_TIME_ASSERT(exp) extern char ICE_Dummy[ (exp) ? 1 : -1 ] + +#endif // ICEASSERT_H diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceAxes.h b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceAxes.h new file mode 100644 index 00000000..37032dc8 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceAxes.h @@ -0,0 +1,70 @@ +/* + * ICE / OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains axes definition. + * \file IceAxes.h + * \author Pierre Terdiman + * \date January, 29, 2000 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef __ICEAXES_H__ +#define __ICEAXES_H__ + + enum PointComponent + { + _X = 0, + _Y = 1, + _Z = 2, + _W = 3, + + _FORCE_DWORD = 0x7fffffff + }; + + enum AxisOrder + { + AXES_XYZ = (_X)|(_Y<<2)|(_Z<<4), + AXES_XZY = (_X)|(_Z<<2)|(_Y<<4), + AXES_YXZ = (_Y)|(_X<<2)|(_Z<<4), + AXES_YZX = (_Y)|(_Z<<2)|(_X<<4), + AXES_ZXY = (_Z)|(_X<<2)|(_Y<<4), + AXES_ZYX = (_Z)|(_Y<<2)|(_X<<4), + + AXES_FORCE_DWORD = 0x7fffffff + }; + + class ICEMATHS_API Axes + { + public: + + inline_ Axes(AxisOrder order) + { + mAxis0 = (order ) & 3; + mAxis1 = (order>>2) & 3; + mAxis2 = (order>>4) & 3; + } + inline_ ~Axes() {} + + udword mAxis0; + udword mAxis1; + udword mAxis2; + }; + +#endif // __ICEAXES_H__ diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceBitArray.cpp b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceBitArray.cpp new file mode 100644 index 00000000..1ec64c3b --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceBitArray.cpp @@ -0,0 +1,73 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code for bit arrays. + * \file IceBitArray.cpp + * \author Pierre Terdiman + * \date February, 5, 2000 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * A simple array of bits stored as bytes. + * + * \class Container + * \author Pierre Terdiman + * \version 1.0 + * \date February, 5, 2000 +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Precompiled Header +#include "StdAfx.h" + +using namespace Opcode; + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Constructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +BitArray::BitArray() : mSize(0), mBits(null) +{ +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Constructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +BitArray::BitArray(udword nb_bits) : mSize(0), mBits(null) +{ + Init(nb_bits); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Destructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +BitArray::~BitArray() +{ + ICE_FREE(mBits); + mSize = 0; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Initializes the bit array for a given number of entries + * \param nb_bits [in] max number of entries in the array + * \return true if success + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool BitArray::Init(udword nb_bits) +{ + mSize = BitsToDwords(nb_bits); + // Get ram for n bits + ICE_FREE(mBits); + mBits = (udword*)ICE_ALLOC(sizeof(udword)*mSize); + // Set all bits to 0 + ClearAll(); + return true; +} diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceBitArray.h b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceBitArray.h new file mode 100644 index 00000000..60c60be4 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceBitArray.h @@ -0,0 +1,82 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code for bit arrays. + * \file IceBitArray.h + * \author Pierre Terdiman + * \date February, 5, 2000 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef ICEBITARRAY_H +#define ICEBITARRAY_H + + inline_ udword BitsToBytes(udword nb_bits) + { + return (nb_bits>>3) + ((nb_bits&7) ? 1 : 0); + } + + inline_ udword BitsToDwords(udword nb_bits) + { + return (nb_bits>>5) + ((nb_bits&31) ? 1 : 0); + } + + // Use that one instead of an array of bools. Takes less ram, nearly as fast [no bounds checkings and so on]. + class ICECORE_API BitArray + { + public: + //! Constructor + BitArray(); + BitArray(udword nb_bits); + //! Destructor + ~BitArray(); + + bool Init(udword nb_bits); + + // Data management + inline_ void SetBit(udword bit_number) { mBits[bit_number>>5] |= 1<<(bit_number&31); } + inline_ void ClearBit(udword bit_number) { mBits[bit_number>>5] &= ~(1<<(bit_number&31)); } + inline_ void ToggleBit(udword bit_number) { mBits[bit_number>>5] ^= 1<<(bit_number&31); } + + inline_ void ClearAll() { ZeroMemory(mBits, mSize*4); } + inline_ void SetAll() { FillMemory(mBits, mSize*4, 0xff); } + + // Data access + inline_ BOOL IsSet(udword bit_number) const { return mBits[bit_number>>5] & (1<<(bit_number&31)); } + + inline_ const udword* GetBits() const { return mBits; } + inline_ udword GetSize() const { return mSize; } + + protected: + udword* mBits; //!< Array of bits + udword mSize; //!< Size of the array in dwords + }; + + // - We consider square symmetric N*N matrices + // - A N*N symmetric matrix has N(N+1)/2 elements + // - A boolean version needs N(N+1)/16 bytes + // N NbBits NbBytes + // 4 10 - + // 8 36 4.5 + // 16 136 17 <= the one we select + // 32 528 66 + static ubyte BitMasks[] = { 0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80 }; + static ubyte NegBitMasks[] = { 0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xBF, 0x7F }; + class ICECORE_API BoolSquareSymmetricMatrix16 + { + public: + inline_ udword Index(udword x, udword y) const { if(x>y) Swap(x,y); return x + (y ? ((y-1)*y)>>1 : 0); } + + inline_ void Set(udword x, udword y) { udword i = Index(x, y); mBits[i>>3] |= BitMasks[i&7]; } + inline_ void Clear(udword x, udword y) { udword i = Index(x, y); mBits[i>>3] &= NegBitMasks[i&7]; } + inline_ void Toggle(udword x, udword y) { udword i = Index(x, y); mBits[i>>3] ^= BitMasks[i&7]; } + inline_ bool IsSet(udword x, udword y) const { udword i = Index(x, y); return (mBits[i>>3] & BitMasks[i&7])!=0; } + + inline_ void ClearAll() { ZeroMemory(mBits, 17); } + inline_ void SetAll() { FillMemory(mBits, 17, 0xff); } + + ubyte mBits[17]; + }; + +#endif // ICEBITARRAY_H diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceBoundingSphere.h b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceBoundingSphere.h new file mode 100644 index 00000000..053f0075 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceBoundingSphere.h @@ -0,0 +1,158 @@ +/* + * ICE / OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code to compute the minimal bounding sphere. + * \file IceBoundingSphere.h + * \author Pierre Terdiman + * \date January, 29, 2000 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef __ICEBOUNDINGSPHERE_H__ +#define __ICEBOUNDINGSPHERE_H__ + + enum BSphereMethod + { + BS_NONE, + BS_GEMS, + BS_MINIBALL, + + BS_FORCE_DWORD = 0x7fffffff + }; + + class ICEMATHS_API Sphere + { + public: + //! Constructor + inline_ Sphere() {} + //! Constructor + inline_ Sphere(const Point& center, float radius) : mCenter(center), mRadius(radius) {} + //! Constructor + Sphere(udword nb_verts, const Point* verts); + //! Copy constructor + inline_ Sphere(const Sphere& sphere) : mCenter(sphere.mCenter), mRadius(sphere.mRadius) {} + //! Destructor + inline_ ~Sphere() {} + + BSphereMethod Compute(udword nb_verts, const Point* verts); + bool FastCompute(udword nb_verts, const Point* verts); + + // Access methods + inline_ const Point& GetCenter() const { return mCenter; } + inline_ float GetRadius() const { return mRadius; } + + inline_ const Point& Center() const { return mCenter; } + inline_ float Radius() const { return mRadius; } + + inline_ Sphere& Set(const Point& center, float radius) { mCenter = center; mRadius = radius; return *this; } + inline_ Sphere& SetCenter(const Point& center) { mCenter = center; return *this; } + inline_ Sphere& SetRadius(float radius) { mRadius = radius; return *this; } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Tests if a point is contained within the sphere. + * \param p [in] the point to test + * \return true if inside the sphere + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ bool Contains(const Point& p) const + { + return mCenter.SquareDistance(p) <= mRadius*mRadius; + } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Tests if a sphere is contained within the sphere. + * \param sphere [in] the sphere to test + * \return true if inside the sphere + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ bool Contains(const Sphere& sphere) const + { + // If our radius is the smallest, we can't possibly contain the other sphere + if(mRadius < sphere.mRadius) return false; + // So r is always positive or null now + float r = mRadius - sphere.mRadius; + return mCenter.SquareDistance(sphere.mCenter) <= r*r; + } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Tests if a box is contained within the sphere. + * \param aabb [in] the box to test + * \return true if inside the sphere + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ BOOL Contains(const AABB& aabb) const + { + // I assume if all 8 box vertices are inside the sphere, so does the whole box. + // Sounds ok but maybe there's a better way? + float R2 = mRadius * mRadius; +#ifdef USE_MIN_MAX + const Point& Max = ((ShadowAABB&)&aabb).mMax; + const Point& Min = ((ShadowAABB&)&aabb).mMin; +#else + Point Max; aabb.GetMax(Max); + Point Min; aabb.GetMin(Min); +#endif + Point p; + p.x=Max.x; p.y=Max.y; p.z=Max.z; if(mCenter.SquareDistance(p)>=R2) return FALSE; + p.x=Min.x; if(mCenter.SquareDistance(p)>=R2) return FALSE; + p.x=Max.x; p.y=Min.y; if(mCenter.SquareDistance(p)>=R2) return FALSE; + p.x=Min.x; if(mCenter.SquareDistance(p)>=R2) return FALSE; + p.x=Max.x; p.y=Max.y; p.z=Min.z; if(mCenter.SquareDistance(p)>=R2) return FALSE; + p.x=Min.x; if(mCenter.SquareDistance(p)>=R2) return FALSE; + p.x=Max.x; p.y=Min.y; if(mCenter.SquareDistance(p)>=R2) return FALSE; + p.x=Min.x; if(mCenter.SquareDistance(p)>=R2) return FALSE; + + return TRUE; + } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Tests if the sphere intersects another sphere + * \param sphere [in] the other sphere + * \return true if spheres overlap + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ bool Intersect(const Sphere& sphere) const + { + float r = mRadius + sphere.mRadius; + return mCenter.SquareDistance(sphere.mCenter) <= r*r; + } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Checks the sphere is valid. + * \return true if the box is valid + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ BOOL IsValid() const + { + // Consistency condition for spheres: Radius >= 0.0f + if(mRadius < 0.0f) return FALSE; + return TRUE; + } + public: + Point mCenter; //!< Sphere center + float mRadius; //!< Sphere radius + }; + +#endif // __ICEBOUNDINGSPHERE_H__ diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceContainer.cpp b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceContainer.cpp new file mode 100644 index 00000000..2c3e9ac8 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceContainer.cpp @@ -0,0 +1,423 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains a simple container class. + * \file IceContainer.cpp + * \author Pierre Terdiman + * \date February, 5, 2000 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains a list of 32-bits values. + * Use this class when you need to store an unknown number of values. The list is automatically + * resized and can contains 32-bits entities (dwords or floats) + * + * \class Container + * \author Pierre Terdiman + * \version 1.0 + * \date 08.15.98 +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Precompiled Header +#include "StdAfx.h" + +using namespace Opcode; + +// Static members +#ifdef CONTAINER_STATS +udword Container::mNbContainers = 0; +udword Container::mUsedRam = 0; +LinkedList Container::mContainers; +#endif + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Constructor. No entries allocated there. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +Container::Container() : mMaxNbEntries(0), mCurNbEntries(0), mEntries(null), mGrowthFactor(2.0f) +{ +#ifdef CONTAINER_STATS + mNbContainers++; + mUsedRam+=sizeof(Container); + mContainers.AddElem(this); +#endif +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Constructor. Also allocates a given number of entries. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +Container::Container(udword size, float growth_factor) : mMaxNbEntries(0), mCurNbEntries(0), mEntries(null) +{ + SetGrowthFactor(growth_factor); +#ifdef CONTAINER_STATS + mNbContainers++; + mUsedRam+=sizeof(Container); + mContainers.AddElem(this); +#endif + SetSize(size); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Copy constructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +Container::Container(const Container& object) : mMaxNbEntries(0), mCurNbEntries(0), mEntries(null), mGrowthFactor(2.0f) +{ +#ifdef CONTAINER_STATS + mNbContainers++; + mUsedRam+=sizeof(Container); + mContainers.AddElem(this); +#endif + *this = object; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Destructor. Frees everything and leaves. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +Container::~Container() +{ + Empty(); +#ifdef CONTAINER_STATS + mNbContainers--; + mUsedRam-=GetUsedRam(); + mContainers.RemElem(this); +#endif +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Initializes the container so that it uses an external memory buffer. The container doesn't own the memory, resizing is disabled. + * \param max_entries [in] max number of entries in the container + * \param entries [in] external memory buffer + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void Container::InitSharedBuffers(udword max_entries, udword* entries) +{ + Empty(); // Make sure everything has been released + mMaxNbEntries = max_entries; + mEntries = entries; + mGrowthFactor = -1.0f; // Negative growth ==> resize is disabled +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Clears the container. All stored values are deleted, and it frees used ram. + * \see Reset() + * \return Self-Reference + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +Container& Container::Empty() +{ +#ifdef CONTAINER_STATS + mUsedRam-=mMaxNbEntries*sizeof(udword); +#endif + if(mGrowthFactor>=0.0f) ICE_FREE(mEntries); // Release memory if we own it + mCurNbEntries = mMaxNbEntries = 0; + return *this; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Resizes the container. + * \param needed [in] assume the container can be added at least "needed" values + * \return true if success. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool Container::Resize(udword needed) +{ + // Check growth is allowed + if(mGrowthFactor<=0.0f) + { + ASSERT(!"Invalid operation - trying to resize a static buffer!"); + return false; + } + +#ifdef CONTAINER_STATS + // Subtract previous amount of bytes + mUsedRam-=mMaxNbEntries*sizeof(udword); +#endif + + // Get more entries + mMaxNbEntries = mMaxNbEntries ? udword(float(mMaxNbEntries)*mGrowthFactor) : 2; // Default nb Entries = 2 + if(mMaxNbEntriesshrink(mEntries, sizeof(udword)*mCurNbEntries)) + return false; + +#ifdef CONTAINER_STATS + // Subtract previous amount of bytes + mUsedRam-=mMaxNbEntries*sizeof(udword); +#endif + + // Get just enough entries + mMaxNbEntries = mCurNbEntries; + +#ifdef CONTAINER_STATS + // Add current amount of bytes + mUsedRam+=mMaxNbEntries*sizeof(udword); +#endif + + return true; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Checks whether the container already contains a given value. + * \param entry [in] the value to look for in the container + * \param location [out] a possible pointer to store the entry location + * \see Add(udword entry) + * \see Add(float entry) + * \see Empty() + * \return true if the value has been found in the container, else false. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool Container::Contains(udword entry, udword* location) const +{ + // Look for the entry + for(udword i=0;imMaxNbEntries) Resize(nb); + + // Add new entry + CopyMemory(&mEntries[mCurNbEntries], entries, nb*sizeof(udword)); + mCurNbEntries += nb; + } + return *this; + } + + inline_ Container& Add(const Container& container) + { + return Add(container.GetEntries(), container.GetNbEntries()); + } + + inline_ udword* Reserve(udword nb) + { + // Resize if needed + if(mCurNbEntries+nb>mMaxNbEntries) Resize(nb); + + // We expect the user to fill reserved memory with 'nb' udwords + udword* Reserved = &mEntries[mCurNbEntries]; + + // Meanwhile, we do as if it had been filled + mCurNbEntries += nb; + + // This is mainly used to avoid the copy when possible + return Reserved; + } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * A O(1) method to add a value in the container. The container is automatically resized if needed. + * The method is inline, not the resize. The call overhead happens on resizes only, which is not a problem since the resizing operation + * costs a lot more than the call overhead... + * + * \param entry [in] a float to store in the container + * \see Add(udword entry) + * \see Empty() + * \see Contains(udword entry) + * \return Self-Reference + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ Container& Add(float entry) + { + // Resize if needed + if(mCurNbEntries==mMaxNbEntries) Resize(); + + // Add new entry + mEntries[mCurNbEntries++] = IR(entry); + return *this; + } + + inline_ Container& Add(const float* entries, udword nb) + { + // Resize if needed + if(mCurNbEntries+nb>mMaxNbEntries) Resize(nb); + + // Add new entry + CopyMemory(&mEntries[mCurNbEntries], entries, nb*sizeof(float)); + mCurNbEntries+=nb; + return *this; + } + + //! Add unique [slow] + inline_ Container& AddUnique(udword entry) + { + if(!Contains(entry)) Add(entry); + return *this; + } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Clears the container. All stored values are deleted, and it frees used ram. + * \see Reset() + * \return Self-Reference + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + Container& Empty(); + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Resets the container. Stored values are discarded but the buffer is kept so that further calls don't need resizing again. + * That's a kind of temporal coherence. + * \see Empty() + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ void Reset() + { + // Avoid the write if possible + // ### CMOV + if(mCurNbEntries) mCurNbEntries = 0; + } + + // HANDLE WITH CARE - I hope you know what you're doing + inline_ void ForceSize(udword size) + { + mCurNbEntries = size; + } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Sets the initial size of the container. If it already contains something, it's discarded. + * \param nb [in] Number of entries + * \return true if success + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + bool SetSize(udword nb); + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Refits the container and get rid of unused bytes. + * \return true if success + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + bool Refit(); + + bool Shrink(); + + // Checks whether the container already contains a given value. + bool Contains(udword entry, udword* location=null) const; + // Deletes an entry - doesn't preserve insertion order. + bool Delete(udword entry); + // Deletes an entry - does preserve insertion order. + bool DeleteKeepingOrder(udword entry); + //! Deletes the very last entry. + inline_ void DeleteLastEntry() { if(mCurNbEntries) mCurNbEntries--; } + //! Deletes the entry whose index is given + inline_ void DeleteIndex(udword index) { mEntries[index] = mEntries[--mCurNbEntries]; } + + // Helpers + Container& FindNext(udword& entry, FindMode find_mode=FIND_CLAMP); + Container& FindPrev(udword& entry, FindMode find_mode=FIND_CLAMP); + // Data access. + inline_ udword GetNbEntries() const { return mCurNbEntries; } //!< Returns the current number of entries. + inline_ udword GetMaxNbEntries() const { return mMaxNbEntries; } //!< Returns max number of entries before resizing. + inline_ udword GetEntry(udword i) const { return mEntries[i]; } //!< Returns ith entry. + inline_ udword* GetEntries() const { return mEntries; } //!< Returns the list of entries. + + inline_ udword GetFirst() const { return mEntries[0]; } + inline_ udword GetLast() const { return mEntries[mCurNbEntries-1]; } + + // Growth control + float GetGrowthFactor() const; //!< Returns the growth factor + void SetGrowthFactor(float growth); //!< Sets the growth factor + inline_ bool IsFull() const { return mCurNbEntries==mMaxNbEntries; } //!< Checks the container is full + inline_ BOOL IsNotEmpty() const { return mCurNbEntries; } //!< Checks the container is empty + + //! Read-access as an array + inline_ udword operator[](udword i) const { ASSERT(i>=0 && i=0 && i>31); + return (float&)y; + } + + //! Computes 1.0f / sqrtf(x). + inline_ float frsqrt(float f) + { + float x = f * 0.5f; + udword y = 0x5f3759df - ((udword&)f >> 1); + // Iteration... + (float&)y = (float&)y * ( 1.5f - ( x * (float&)y * (float&)y ) ); + // Result + return (float&)y; + } + + //! Computes 1.0f / sqrtf(x). Comes from NVIDIA. + inline_ float InvSqrt(const float& x) + { + udword tmp = (udword(IEEE_1_0 << 1) + IEEE_1_0 - *(udword*)&x) >> 1; + float y = *(float*)&tmp; + return y * (1.47f - 0.47f * x * y * y); + } + + //! Computes 1.0f / sqrtf(x). Comes from Quake3. Looks like the first one I had above. + //! See http://www.magic-software.com/3DGEDInvSqrt.html + inline_ float RSqrt(float number) + { + long i; + float x2, y; + const float threehalfs = 1.5f; + + x2 = number * 0.5f; + y = number; + i = * (long *) &y; + i = 0x5f3759df - (i >> 1); + y = * (float *) &i; + y = y * (threehalfs - (x2 * y * y)); + + return y; + } + + //! TO BE DOCUMENTED + inline_ float fsqrt(float f) + { + udword y = ( ( (sdword&)f - 0x3f800000 ) >> 1 ) + 0x3f800000; + // Iteration...? + // (float&)y = (3.0f - ((float&)y * (float&)y) / f) * (float&)y * 0.5f; + // Result + return (float&)y; + } + + //! Returns the float ranged espilon value. + inline_ float fepsilon(float f) + { + udword b = (udword&)f & 0xff800000; + udword a = b | 0x00000001; + (float&)a -= (float&)b; + // Result + return (float&)a; + } + + //! Is the float valid ? + inline_ bool IsNAN(float value) { return (IR(value)&0x7f800000) == 0x7f800000; } + inline_ bool IsIndeterminate(float value) { return IR(value) == 0xffc00000; } + inline_ bool IsPlusInf(float value) { return IR(value) == 0x7f800000; } + inline_ bool IsMinusInf(float value) { return IR(value) == 0xff800000; } + + inline_ bool IsValidFloat(float value) + { + if(IsNAN(value)) return false; + if(IsIndeterminate(value)) return false; + if(IsPlusInf(value)) return false; + if(IsMinusInf(value)) return false; + return true; + } + + #define CHECK_VALID_FLOAT(x) ASSERT(IsValidFloat(x)); + +/* + //! FPU precision setting function. + inline_ void SetFPU() + { + // This function evaluates whether the floating-point + // control word is set to single precision/round to nearest/ + // exceptions disabled. If these conditions don't hold, the + // function changes the control word to set them and returns + // TRUE, putting the old control word value in the passback + // location pointed to by pwOldCW. + { + uword wTemp, wSave; + + __asm fstcw wSave + if (wSave & 0x300 || // Not single mode + 0x3f != (wSave & 0x3f) || // Exceptions enabled + wSave & 0xC00) // Not round to nearest mode + { + __asm + { + mov ax, wSave + and ax, not 300h ;; single mode + or ax, 3fh ;; disable all exceptions + and ax, not 0xC00 ;; round to nearest mode + mov wTemp, ax + fldcw wTemp + } + } + } + } +*/ + //! This function computes the slowest possible floating-point value (you can also directly use FLT_EPSILON) + inline_ float ComputeFloatEpsilon() + { + float f = 1.0f; + ((udword&)f)^=1; + return f - 1.0f; // You can check it's the same as FLT_EPSILON + } + + inline_ bool IsFloatZero(float x, float epsilon=1e-6f) + { + return x*x < epsilon; + } + + #define FCOMI_ST0 _asm _emit 0xdb _asm _emit 0xf0 + #define FCOMIP_ST0 _asm _emit 0xdf _asm _emit 0xf0 + #define FCMOVB_ST0 _asm _emit 0xda _asm _emit 0xc0 + #define FCMOVNB_ST0 _asm _emit 0xdb _asm _emit 0xc0 + + #define FCOMI_ST1 _asm _emit 0xdb _asm _emit 0xf1 + #define FCOMIP_ST1 _asm _emit 0xdf _asm _emit 0xf1 + #define FCMOVB_ST1 _asm _emit 0xda _asm _emit 0xc1 + #define FCMOVNB_ST1 _asm _emit 0xdb _asm _emit 0xc1 + + #define FCOMI_ST2 _asm _emit 0xdb _asm _emit 0xf2 + #define FCOMIP_ST2 _asm _emit 0xdf _asm _emit 0xf2 + #define FCMOVB_ST2 _asm _emit 0xda _asm _emit 0xc2 + #define FCMOVNB_ST2 _asm _emit 0xdb _asm _emit 0xc2 + + #define FCOMI_ST3 _asm _emit 0xdb _asm _emit 0xf3 + #define FCOMIP_ST3 _asm _emit 0xdf _asm _emit 0xf3 + #define FCMOVB_ST3 _asm _emit 0xda _asm _emit 0xc3 + #define FCMOVNB_ST3 _asm _emit 0xdb _asm _emit 0xc3 + + #define FCOMI_ST4 _asm _emit 0xdb _asm _emit 0xf4 + #define FCOMIP_ST4 _asm _emit 0xdf _asm _emit 0xf4 + #define FCMOVB_ST4 _asm _emit 0xda _asm _emit 0xc4 + #define FCMOVNB_ST4 _asm _emit 0xdb _asm _emit 0xc4 + + #define FCOMI_ST5 _asm _emit 0xdb _asm _emit 0xf5 + #define FCOMIP_ST5 _asm _emit 0xdf _asm _emit 0xf5 + #define FCMOVB_ST5 _asm _emit 0xda _asm _emit 0xc5 + #define FCMOVNB_ST5 _asm _emit 0xdb _asm _emit 0xc5 + + #define FCOMI_ST6 _asm _emit 0xdb _asm _emit 0xf6 + #define FCOMIP_ST6 _asm _emit 0xdf _asm _emit 0xf6 + #define FCMOVB_ST6 _asm _emit 0xda _asm _emit 0xc6 + #define FCMOVNB_ST6 _asm _emit 0xdb _asm _emit 0xc6 + + #define FCOMI_ST7 _asm _emit 0xdb _asm _emit 0xf7 + #define FCOMIP_ST7 _asm _emit 0xdf _asm _emit 0xf7 + #define FCMOVB_ST7 _asm _emit 0xda _asm _emit 0xc7 + #define FCMOVNB_ST7 _asm _emit 0xdb _asm _emit 0xc7 + + //! A global function to find MAX(a,b) using FCOMI/FCMOV + inline_ float FCMax2(float a, float b) + { + float Res; + _asm fld [a] + _asm fld [b] + FCOMI_ST1 + FCMOVB_ST1 + _asm fstp [Res] + _asm fcomp + return Res; + } + + //! A global function to find MIN(a,b) using FCOMI/FCMOV + inline_ float FCMin2(float a, float b) + { + float Res; + _asm fld [a] + _asm fld [b] + FCOMI_ST1 + FCMOVNB_ST1 + _asm fstp [Res] + _asm fcomp + return Res; + } + + //! A global function to find MAX(a,b,c) using FCOMI/FCMOV + inline_ float FCMax3(float a, float b, float c) + { + float Res; + _asm fld [a] + _asm fld [b] + _asm fld [c] + FCOMI_ST1 + FCMOVB_ST1 + FCOMI_ST2 + FCMOVB_ST2 + _asm fstp [Res] + _asm fcompp + return Res; + } + + //! A global function to find MIN(a,b,c) using FCOMI/FCMOV + inline_ float FCMin3(float a, float b, float c) + { + float Res; + _asm fld [a] + _asm fld [b] + _asm fld [c] + FCOMI_ST1 + FCMOVNB_ST1 + FCOMI_ST2 + FCMOVNB_ST2 + _asm fstp [Res] + _asm fcompp + return Res; + } + + //! A global function to find MAX(a,b,c,d) using FCOMI/FCMOV + inline_ float FCMax4(float a, float b, float c, float d) + { + float Res; + _asm fld [a] + _asm fld [b] + _asm fld [c] + _asm fld [d] + FCOMI_ST1 + FCMOVB_ST1 + FCOMI_ST2 + FCMOVB_ST2 + FCOMI_ST3 + FCMOVB_ST3 + _asm fstp [Res] + _asm fcompp + _asm fcomp + return Res; + } + + //! A global function to find MIN(a,b,c,d) using FCOMI/FCMOV + inline_ float FCMin4(float a, float b, float c, float d) + { + float Res; + _asm fld [a] + _asm fld [b] + _asm fld [c] + _asm fld [d] + FCOMI_ST1 + FCMOVNB_ST1 + FCOMI_ST2 + FCMOVNB_ST2 + FCOMI_ST3 + FCMOVNB_ST3 + _asm fstp [Res] + _asm fcompp + _asm fcomp + return Res; + } + + inline_ int ConvertToSortable(float f) + { + int& Fi = (int&)f; + int Fmask = (Fi>>31); + Fi ^= Fmask; + Fmask &= ~(1<<31); + Fi -= Fmask; + return Fi; + } + + inline_ udword EncodeFloat(const float val) + { + // We may need to check on -0 and 0 + // But it should make no practical difference. + udword ir = IR(val); + + if(ir & 0x80000000) //negative? + ir = ~ir;//reverse sequence of negative numbers + else + ir |= 0x80000000; // flip sign + + return ir; + } + + inline_ float DecodeFloat(udword ir) + { + udword rv; + + if(ir & 0x80000000) //positive? + rv = ir & ~0x80000000; //flip sign + else + rv = ~ir; //undo reversal + + return FR(rv); + } + + enum FPUMode + { + FPU_FLOOR = 0, + FPU_CEIL = 1, + FPU_BEST = 2, + + FPU_FORCE_DWORD = 0x7fffffff + }; + + FUNCTION ICECORE_API FPUMode GetFPUMode(); + FUNCTION ICECORE_API void SaveFPU(); + FUNCTION ICECORE_API void RestoreFPU(); + FUNCTION ICECORE_API void SetFPUFloorMode(); + FUNCTION ICECORE_API void SetFPUCeilMode(); + FUNCTION ICECORE_API void SetFPUBestMode(); + + FUNCTION ICECORE_API void SetFPUPrecision24(); + FUNCTION ICECORE_API void SetFPUPrecision53(); + FUNCTION ICECORE_API void SetFPUPrecision64(); + FUNCTION ICECORE_API void SetFPURoundingChop(); + FUNCTION ICECORE_API void SetFPURoundingUp(); + FUNCTION ICECORE_API void SetFPURoundingDown(); + FUNCTION ICECORE_API void SetFPURoundingNear(); + + FUNCTION ICECORE_API int intChop(const float& f); + FUNCTION ICECORE_API int intFloor(const float& f); + FUNCTION ICECORE_API int intCeil(const float& f); + + inline_ sdword MyFloor(float f) + { + return (sdword)f - (IR(f)>>31); + } + + class ICECORE_API FPUGuard + { + public: + FPUGuard(); + ~FPUGuard(); + private: + uword mControlWord; + }; + +#endif // ICEFPU_H diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceHPoint.cpp b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceHPoint.cpp new file mode 100644 index 00000000..32d8e59b --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceHPoint.cpp @@ -0,0 +1,87 @@ +/* + * ICE / OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code for homogeneous points. + * \file IceHPoint.cpp + * \author Pierre Terdiman + * \date April, 4, 2000 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Homogeneous point. + * + * Use it: + * - for clipping in homogeneous space (standard way) + * - to differentiate between points (w=1) and vectors (w=0). + * - in some cases you can also use it instead of Point for padding reasons. + * + * \class HPoint + * \author Pierre Terdiman + * \version 1.0 + * \warning No cross-product in 4D. + * \warning HPoint *= Matrix3x3 doesn't exist, the matrix is first casted to a 4x4 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Precompiled Header +#include "Stdafx.h" + +using namespace Opcode; + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Point Mul = HPoint * Matrix3x3; +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +Point HPoint::operator*(const Matrix3x3& mat) const +{ + return Point( + x * mat.m[0][0] + y * mat.m[1][0] + z * mat.m[2][0], + x * mat.m[0][1] + y * mat.m[1][1] + z * mat.m[2][1], + x * mat.m[0][2] + y * mat.m[1][2] + z * mat.m[2][2] ); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// HPoint Mul = HPoint * Matrix4x4; +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +HPoint HPoint::operator*(const Matrix4x4& mat) const +{ + return HPoint( + x * mat.m[0][0] + y * mat.m[1][0] + z * mat.m[2][0] + w * mat.m[3][0], + x * mat.m[0][1] + y * mat.m[1][1] + z * mat.m[2][1] + w * mat.m[3][1], + x * mat.m[0][2] + y * mat.m[1][2] + z * mat.m[2][2] + w * mat.m[3][2], + x * mat.m[0][3] + y * mat.m[1][3] + z * mat.m[2][3] + w * mat.m[3][3]); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// HPoint *= Matrix4x4 +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +HPoint& HPoint::operator*=(const Matrix4x4& mat) +{ + float xp = x * mat.m[0][0] + y * mat.m[1][0] + z * mat.m[2][0] + w * mat.m[3][0]; + float yp = x * mat.m[0][1] + y * mat.m[1][1] + z * mat.m[2][1] + w * mat.m[3][1]; + float zp = x * mat.m[0][2] + y * mat.m[1][2] + z * mat.m[2][2] + w * mat.m[3][2]; + float wp = x * mat.m[0][3] + y * mat.m[1][3] + z * mat.m[2][3] + w * mat.m[3][3]; + + x = xp; y = yp; z = zp; w = wp; + + return *this; +} + + diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceHPoint.h b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceHPoint.h new file mode 100644 index 00000000..b35ac9e6 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceHPoint.h @@ -0,0 +1,173 @@ +/* + * ICE / OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code for homogeneous points. + * \file IceHPoint.h + * \author Pierre Terdiman + * \date April, 4, 2000 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef __ICEHPOINT_H__ +#define __ICEHPOINT_H__ + + class ICEMATHS_API HPoint : public Point + { + public: + + //! Empty constructor + inline_ HPoint() {} + //! Constructor from floats + inline_ HPoint(float _x, float _y, float _z, float _w=0.0f) : Point(_x, _y, _z), w(_w) {} + //! Constructor from array + inline_ HPoint(const float f[4]) : Point(f), w(f[3]) {} + //! Constructor from a Point + inline_ HPoint(const Point& p, float _w=0.0f) : Point(p), w(_w) {} + //! Destructor + inline_ ~HPoint() {} + + //! Clear the point + inline_ HPoint& Zero() { x = y = z = w = 0.0f; return *this; } + + //! Assignment from values + inline_ HPoint& Set(float _x, float _y, float _z, float _w ) { x = _x; y = _y; z = _z; w = _w; return *this; } + //! Assignment from array + inline_ HPoint& Set(const float f[4]) { x = f[_X]; y = f[_Y]; z = f[_Z]; w = f[_W]; return *this; } + //! Assignment from another h-point + inline_ HPoint& Set(const HPoint& src) { x = src.x; y = src.y; z = src.z; w = src.w; return *this; } + + //! Add a vector + inline_ HPoint& Add(float _x, float _y, float _z, float _w ) { x += _x; y += _y; z += _z; w += _w; return *this; } + //! Add a vector + inline_ HPoint& Add(const float f[4]) { x += f[_X]; y += f[_Y]; z += f[_Z]; w += f[_W]; return *this; } + + //! Subtract a vector + inline_ HPoint& Sub(float _x, float _y, float _z, float _w ) { x -= _x; y -= _y; z -= _z; w -= _w; return *this; } + //! Subtract a vector + inline_ HPoint& Sub(const float f[4]) { x -= f[_X]; y -= f[_Y]; z -= f[_Z]; w -= f[_W]; return *this; } + + //! Multiplies by a scalar + inline_ HPoint& Mul(float s) { x *= s; y *= s; z *= s; w *= s; return *this; } + + //! Returns MIN(x, y, z, w); + float Min() const { return MIN(x, MIN(y, MIN(z, w))); } + //! Returns MAX(x, y, z, w); + float Max() const { return MAX(x, MAX(y, MAX(z, w))); } + //! Sets each element to be componentwise minimum + HPoint& Min(const HPoint& p) { x = MIN(x, p.x); y = MIN(y, p.y); z = MIN(z, p.z); w = MIN(w, p.w); return *this; } + //! Sets each element to be componentwise maximum + HPoint& Max(const HPoint& p) { x = MAX(x, p.x); y = MAX(y, p.y); z = MAX(z, p.z); w = MAX(w, p.w); return *this; } + + //! Computes square magnitude + inline_ float SquareMagnitude() const { return x*x + y*y + z*z + w*w; } + //! Computes magnitude + inline_ float Magnitude() const { return sqrtf(x*x + y*y + z*z + w*w); } + + //! Normalize the vector + inline_ HPoint& Normalize() + { + float M = Magnitude(); + if(M) + { + M = 1.0f / M; + x *= M; + y *= M; + z *= M; + w *= M; + } + return *this; + } + + // Arithmetic operators + //! Operator for HPoint Negate = - HPoint; + inline_ HPoint operator-() const { return HPoint(-x, -y, -z, -w); } + + //! Operator for HPoint Plus = HPoint + HPoint; + inline_ HPoint operator+(const HPoint& p) const { return HPoint(x + p.x, y + p.y, z + p.z, w + p.w); } + //! Operator for HPoint Minus = HPoint - HPoint; + inline_ HPoint operator-(const HPoint& p) const { return HPoint(x - p.x, y - p.y, z - p.z, w - p.w); } + + //! Operator for HPoint Mul = HPoint * HPoint; + inline_ HPoint operator*(const HPoint& p) const { return HPoint(x * p.x, y * p.y, z * p.z, w * p.w); } + //! Operator for HPoint Scale = HPoint * float; + inline_ HPoint operator*(float s) const { return HPoint(x * s, y * s, z * s, w * s); } + //! Operator for HPoint Scale = float * HPoint; + inline_ friend HPoint operator*(float s, const HPoint& p) { return HPoint(s * p.x, s * p.y, s * p.z, s * p.w); } + + //! Operator for HPoint Div = HPoint / HPoint; + inline_ HPoint operator/(const HPoint& p) const { return HPoint(x / p.x, y / p.y, z / p.z, w / p.w); } + //! Operator for HPoint Scale = HPoint / float; + inline_ HPoint operator/(float s) const { s = 1.0f / s; return HPoint(x * s, y * s, z * s, w * s); } + //! Operator for HPoint Scale = float / HPoint; + inline_ friend HPoint operator/(float s, const HPoint& p) { return HPoint(s / p.x, s / p.y, s / p.z, s / p.w); } + + //! Operator for float DotProd = HPoint | HPoint; + inline_ float operator|(const HPoint& p) const { return x*p.x + y*p.y + z*p.z + w*p.w; } + // No cross-product in 4D + + //! Operator for HPoint += HPoint; + inline_ HPoint& operator+=(const HPoint& p) { x += p.x; y += p.y; z += p.z; w += p.w; return *this; } + //! Operator for HPoint += float; + inline_ HPoint& operator+=(float s) { x += s; y += s; z += s; w += s; return *this; } + + //! Operator for HPoint -= HPoint; + inline_ HPoint& operator-=(const HPoint& p) { x -= p.x; y -= p.y; z -= p.z; w -= p.w; return *this; } + //! Operator for HPoint -= float; + inline_ HPoint& operator-=(float s) { x -= s; y -= s; z -= s; w -= s; return *this; } + + //! Operator for HPoint *= HPoint; + inline_ HPoint& operator*=(const HPoint& p) { x *= p.x; y *= p.y; z *= p.z; w *= p.w; return *this; } + //! Operator for HPoint *= float; + inline_ HPoint& operator*=(float s) { x*=s; y*=s; z*=s; w*=s; return *this; } + + //! Operator for HPoint /= HPoint; + inline_ HPoint& operator/=(const HPoint& p) { x /= p.x; y /= p.y; z /= p.z; w /= p.w; return *this; } + //! Operator for HPoint /= float; + inline_ HPoint& operator/=(float s) { s = 1.0f / s; x*=s; y*=s; z*=s; w*=s; return *this; } + + // Arithmetic operators + + //! Operator for Point Mul = HPoint * Matrix3x3; + Point operator*(const Matrix3x3& mat) const; + //! Operator for HPoint Mul = HPoint * Matrix4x4; + HPoint operator*(const Matrix4x4& mat) const; + + // HPoint *= Matrix3x3 doesn't exist, the matrix is first casted to a 4x4 + //! Operator for HPoint *= Matrix4x4 + HPoint& operator*=(const Matrix4x4& mat); + + // Logical operators + + //! Operator for "if(HPoint==HPoint)" + inline_ bool operator==(const HPoint& p) const { return ( (x==p.x)&&(y==p.y)&&(z==p.z)&&(w==p.w)); } + //! Operator for "if(HPoint!=HPoint)" + inline_ bool operator!=(const HPoint& p) const { return ( (x!=p.x)||(y!=p.y)||(z!=p.z)||(w!=p.w)); } + + // Cast operators + + //! Cast a HPoint to a Point. w is discarded. + inline_ operator Point() const { return Point(x, y, z); } + + public: + float w; + }; + +#endif // __ICEHPOINT_H__ + diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceHashing.h b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceHashing.h new file mode 100644 index 00000000..45160f80 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceHashing.h @@ -0,0 +1,78 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains hashing code. + * \file IceHashing.h + * \author Pierre Terdiman + * \date May, 08, 1999 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef ICEHASHING_H +#define ICEHASHING_H + + #define HashSize(n) ((udword)1<<(n)) + #define HashMask(n) (HashSize(n)-1) + + ICECORE_API udword Hash(const char* str); + ICECORE_API udword Hash(ubyte* k, udword length, udword initval); + + // Bob Jenkin's hash + inline_ unsigned int Hash32Bits_0(unsigned int key) + { + key += (key << 12); + key ^= (key >> 22); + key += (key << 4); + key ^= (key >> 9); + key += (key << 10); + key ^= (key >> 2); + key += (key << 7); + key ^= (key >> 12); + return key; + } + + // Thomas Wang's hash + inline_ int Hash32Bits_1(int key) + { + key += ~(key << 15); + key ^= (key >> 10); + key += (key << 3); + key ^= (key >> 6); + key += ~(key << 11); + key ^= (key >> 16); + return key; + } + + // Thomas Wang's hash + inline_ __int64 Hash64Bits_0(__int64 key) + { + key += ~(key << 32); + key ^= (key >> 22); + key += ~(key << 13); + key ^= (key >> 8); + key += (key << 3); + key ^= (key >> 15); + key += ~(key << 27); + key ^= (key >> 31); + return key; + } + + inline_ __int64 Hash64Bits_1(__int64 key) + { + __int64 c1 = 0x6e5ea73858134343L; + __int64 c2 = 0xb34e8f99a2ec9ef5L; + key ^= ((c1 ^ key) >> 32); + key *= c1; + key ^= ((c2 ^ key) >> 31); + key *= c2; + key ^= ((c1 ^ key) >> 32); + return key; + } + + inline_ udword Hash(udword id0, udword id1) + { + return Hash32Bits_1( (id0&0xffff)|(id1<<16) ); + } + +#endif // ICEHASHING_H diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceIndexedTriangle.cpp b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceIndexedTriangle.cpp new file mode 100644 index 00000000..4657f08f --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceIndexedTriangle.cpp @@ -0,0 +1,564 @@ +/* + * ICE / OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains a handy indexed triangle class. + * \file IceIndexedTriangle.cpp + * \author Pierre Terdiman + * \date January, 17, 2000 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Precompiled Header +#include "Stdafx.h" + +using namespace Opcode; + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains an indexed triangle class. + * + * \class Triangle + * \author Pierre Terdiman + * \version 1.0 + * \date 08.15.98 +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Flips the winding order. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void IndexedTriangle::Flip() +{ + Swap(mVRef[1], mVRef[2]); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Computes the triangle area. + * \param verts [in] the list of indexed vertices + * \return the area + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +float IndexedTriangle::Area(const Point* verts) const +{ + if(!verts) return 0.0f; + const Point& p0 = verts[0]; + const Point& p1 = verts[1]; + const Point& p2 = verts[2]; + return ((p0-p1)^(p0-p2)).Magnitude() * 0.5f; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Computes the triangle perimeter. + * \param verts [in] the list of indexed vertices + * \return the perimeter + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +float IndexedTriangle::Perimeter(const Point* verts) const +{ + if(!verts) return 0.0f; + const Point& p0 = verts[0]; + const Point& p1 = verts[1]; + const Point& p2 = verts[2]; + return p0.Distance(p1) + + p0.Distance(p2) + + p1.Distance(p2); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Computes the triangle compacity. + * \param verts [in] the list of indexed vertices + * \return the compacity + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +float IndexedTriangle::Compacity(const Point* verts) const +{ + if(!verts) return 0.0f; + float P = Perimeter(verts); + if(P==0.0f) return 0.0f; + return (4.0f*PI*Area(verts)/(P*P)); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Computes the triangle normal. + * \param verts [in] the list of indexed vertices + * \param normal [out] the computed normal + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void IndexedTriangle::Normal(const Point* verts, Point& normal) const +{ + if(!verts) return; + + const Point& p0 = verts[mVRef[0]]; + const Point& p1 = verts[mVRef[1]]; + const Point& p2 = verts[mVRef[2]]; + normal = ((p2-p1)^(p0-p1)).Normalize(); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Computes the triangle denormalized normal. + * \param verts [in] the list of indexed vertices + * \param normal [out] the computed normal + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void IndexedTriangle::DenormalizedNormal(const Point* verts, Point& normal) const +{ + if(!verts) return; + + const Point& p0 = verts[mVRef[0]]; + const Point& p1 = verts[mVRef[1]]; + const Point& p2 = verts[mVRef[2]]; + normal = ((p2-p1)^(p0-p1)); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Computes the triangle center. + * \param verts [in] the list of indexed vertices + * \param center [out] the computed center + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void IndexedTriangle::Center(const Point* verts, Point& center) const +{ + if(!verts) return; + + const Point& p0 = verts[mVRef[0]]; + const Point& p1 = verts[mVRef[1]]; + const Point& p2 = verts[mVRef[2]]; + center = (p0+p1+p2)*INV3; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Computes the centered normal + * \param verts [in] the list of indexed vertices + * \param normal [out] the computed centered normal + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void IndexedTriangle::CenteredNormal(const Point* verts, Point& normal) const +{ + if(!verts) return; + + const Point& p0 = verts[mVRef[0]]; + const Point& p1 = verts[mVRef[1]]; + const Point& p2 = verts[mVRef[2]]; + Point Center = (p0+p1+p2)*INV3; + normal = Center + ((p2-p1)^(p0-p1)).Normalize(); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Computes a random point within the triangle. + * \param verts [in] the list of indexed vertices + * \param normal [out] the computed centered normal + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void IndexedTriangle::RandomPoint(const Point* verts, Point& random) const +{ + if(!verts) return; + + // Random barycentric coords + float Alpha = UnitRandomFloat(); + float Beta = UnitRandomFloat(); + float Gamma = UnitRandomFloat(); + float OneOverTotal = 1.0f / (Alpha + Beta + Gamma); + Alpha *= OneOverTotal; + Beta *= OneOverTotal; + Gamma *= OneOverTotal; + + const Point& p0 = verts[mVRef[0]]; + const Point& p1 = verts[mVRef[1]]; + const Point& p2 = verts[mVRef[2]]; + random = Alpha*p0 + Beta*p1 + Gamma*p2; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Computes backface culling. + * \param verts [in] the list of indexed vertices + * \param source [in] source point (in local space) from which culling must be computed + * \return true if the triangle is visible from the source point + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool IndexedTriangle::IsVisible(const Point* verts, const Point& source) const +{ + // Checkings + if(!verts) return false; + + const Point& p0 = verts[mVRef[0]]; + const Point& p1 = verts[mVRef[1]]; + const Point& p2 = verts[mVRef[2]]; + + // Compute denormalized normal + Point Normal = (p2 - p1)^(p0 - p1); + + // Backface culling + return (Normal | source) >= 0.0f; + +// Same as: +// Plane PL(verts[mVRef[0]], verts[mVRef[1]], verts[mVRef[2]]); +// return PL.Distance(source) > PL.d; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Computes backface culling. + * \param verts [in] the list of indexed vertices + * \param source [in] source point (in local space) from which culling must be computed + * \return true if the triangle is visible from the source point + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool IndexedTriangle::BackfaceCulling(const Point* verts, const Point& source) const +{ + // Checkings + if(!verts) return false; + + const Point& p0 = verts[mVRef[0]]; + const Point& p1 = verts[mVRef[1]]; + const Point& p2 = verts[mVRef[2]]; + + // Compute base +// Point Base = (p0 + p1 + p2)*INV3; + + // Compute denormalized normal + Point Normal = (p2 - p1)^(p0 - p1); + + // Backface culling +// return (Normal | (source - Base)) >= 0.0f; + return (Normal | (source - p0)) >= 0.0f; + +// Same as: (but a bit faster) +// Plane PL(verts[mVRef[0]], verts[mVRef[1]], verts[mVRef[2]]); +// return PL.Distance(source)>0.0f; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Computes the occlusion potential of the triangle. + * \param verts [in] the list of indexed vertices + * \param source [in] source point (in local space) from which occlusion potential must be computed + * \return the occlusion potential + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +float IndexedTriangle::ComputeOcclusionPotential(const Point* verts, const Point& view) const +{ + if(!verts) return 0.0f; + // Occlusion potential: -(A * (N|V) / d^2) + // A = polygon area + // N = polygon normal + // V = view vector + // d = distance viewpoint-center of polygon + + float A = Area(verts); + Point N; Normal(verts, N); + Point C; Center(verts, C); + float d = view.Distance(C); + return -(A*(N|view))/(d*d); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Replaces a vertex reference with another one. + * \param oldref [in] the vertex reference to replace + * \param newref [in] the new vertex reference + * \return true if success, else false if the input vertex reference doesn't belong to the triangle + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool IndexedTriangle::ReplaceVertex(udword oldref, udword newref) +{ + if(mVRef[0]==oldref) { mVRef[0] = newref; return true; } + else if(mVRef[1]==oldref) { mVRef[1] = newref; return true; } + else if(mVRef[2]==oldref) { mVRef[2] = newref; return true; } + return false; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Checks whether the triangle is degenerate or not. A degenerate triangle has two common vertex references. This is a zero-area triangle. + * \return true if the triangle is degenerate + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool IndexedTriangle::IsDegenerate() const +{ + if(mVRef[0]==mVRef[1]) return true; + if(mVRef[1]==mVRef[2]) return true; + if(mVRef[2]==mVRef[0]) return true; + return false; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Checks whether the input vertex reference belongs to the triangle or not. + * \param ref [in] the vertex reference to look for + * \return true if the triangle contains the vertex reference + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool IndexedTriangle::HasVertex(udword ref) const +{ + if(mVRef[0]==ref) return true; + if(mVRef[1]==ref) return true; + if(mVRef[2]==ref) return true; + return false; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Checks whether the input vertex reference belongs to the triangle or not. + * \param ref [in] the vertex reference to look for + * \param index [out] the corresponding index in the triangle + * \return true if the triangle contains the vertex reference + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool IndexedTriangle::HasVertex(udword ref, udword* index) const +{ + if(mVRef[0]==ref) { *index = 0; return true; } + if(mVRef[1]==ref) { *index = 1; return true; } + if(mVRef[2]==ref) { *index = 2; return true; } + return false; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Finds an edge in a tri, given two vertex references. + * \param vref0 [in] the edge's first vertex reference + * \param vref1 [in] the edge's second vertex reference + * \return the edge number between 0 and 2, or 0xff if input refs are wrong. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +ubyte IndexedTriangle::FindEdge(udword vref0, udword vref1) const +{ + if(mVRef[0]==vref0 && mVRef[1]==vref1) return 0; + else if(mVRef[0]==vref1 && mVRef[1]==vref0) return 0; + else if(mVRef[0]==vref0 && mVRef[2]==vref1) return 1; + else if(mVRef[0]==vref1 && mVRef[2]==vref0) return 1; + else if(mVRef[1]==vref0 && mVRef[2]==vref1) return 2; + else if(mVRef[1]==vref1 && mVRef[2]==vref0) return 2; + return 0xff; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Gets the last reference given the first two. + * \param vref0 [in] the first vertex reference + * \param vref1 [in] the second vertex reference + * \return the last reference, or INVALID_ID if input refs are wrong. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +udword IndexedTriangle::OppositeVertex(udword vref0, udword vref1) const +{ + if(mVRef[0]==vref0 && mVRef[1]==vref1) return mVRef[2]; + else if(mVRef[0]==vref1 && mVRef[1]==vref0) return mVRef[2]; + else if(mVRef[0]==vref0 && mVRef[2]==vref1) return mVRef[1]; + else if(mVRef[0]==vref1 && mVRef[2]==vref0) return mVRef[1]; + else if(mVRef[1]==vref0 && mVRef[2]==vref1) return mVRef[0]; + else if(mVRef[1]==vref1 && mVRef[2]==vref0) return mVRef[0]; + return INVALID_ID; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Gets the three sorted vertex references according to an edge number. + * edgenb = 0 => edge 0-1, returns references 0, 1, 2 + * edgenb = 1 => edge 0-2, returns references 0, 2, 1 + * edgenb = 2 => edge 1-2, returns references 1, 2, 0 + * + * \param edgenb [in] the edge number, 0, 1 or 2 + * \param vref0 [out] the returned first vertex reference + * \param vref1 [out] the returned second vertex reference + * \param vref2 [out] the returned third vertex reference + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void IndexedTriangle::GetVRefs(ubyte edgenb, udword& vref0, udword& vref1, udword& vref2) const +{ + if(edgenb==0) + { + vref0 = mVRef[0]; + vref1 = mVRef[1]; + vref2 = mVRef[2]; + } + else if(edgenb==1) + { + vref0 = mVRef[0]; + vref1 = mVRef[2]; + vref2 = mVRef[1]; + } + else if(edgenb==2) + { + vref0 = mVRef[1]; + vref1 = mVRef[2]; + vref2 = mVRef[0]; + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Computes the triangle's smallest edge length. + * \param verts [in] the list of indexed vertices + * \return the smallest edge length + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +float IndexedTriangle::MinEdgeLength(const Point* verts) const +{ + if(!verts) return 0.0f; + + float Min = MAX_FLOAT; + float Length01 = verts[0].Distance(verts[1]); + float Length02 = verts[0].Distance(verts[2]); + float Length12 = verts[1].Distance(verts[2]); + if(Length01 < Min) Min = Length01; + if(Length02 < Min) Min = Length02; + if(Length12 < Min) Min = Length12; + return Min; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Computes the triangle's largest edge length. + * \param verts [in] the list of indexed vertices + * \return the largest edge length + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +float IndexedTriangle::MaxEdgeLength(const Point* verts) const +{ + if(!verts) return 0.0f; + + float Max = MIN_FLOAT; + float Length01 = verts[0].Distance(verts[1]); + float Length02 = verts[0].Distance(verts[2]); + float Length12 = verts[1].Distance(verts[2]); + if(Length01 > Max) Max = Length01; + if(Length02 > Max) Max = Length02; + if(Length12 > Max) Max = Length12; + return Max; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Computes a point on the triangle according to the stabbing information. + * \param verts [in] the list of indexed vertices + * \param u,v [in] point's barycentric coordinates + * \param pt [out] point on triangle + * \param nearvtx [out] index of nearest vertex + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void IndexedTriangle::ComputePoint(const Point* verts, float u, float v, Point& pt, udword* nearvtx) const +{ + // Checkings + if(!verts) return; + + // Get face in local or global space + const Point& p0 = verts[mVRef[0]]; + const Point& p1 = verts[mVRef[1]]; + const Point& p2 = verts[mVRef[2]]; + + // Compute point coordinates + pt = (1.0f - u - v)*p0 + u*p1 + v*p2; + + // Compute nearest vertex if needed + if(nearvtx) + { + // Compute distance vector + Point d(p0.SquareDistance(pt), // Distance^2 from vertex 0 to point on the face + p1.SquareDistance(pt), // Distance^2 from vertex 1 to point on the face + p2.SquareDistance(pt)); // Distance^2 from vertex 2 to point on the face + + // Get smallest distance + *nearvtx = mVRef[d.SmallestAxis()]; + } +} + + //************************************** + // Angle between two vectors (in radians) + // we use this formula + // uv = |u||v| cos(u,v) + // u ^ v = w + // |w| = |u||v| |sin(u,v)| + //************************************** + float Angle(const Point& u, const Point& v) + { + float NormU = u.Magnitude(); // |u| + float NormV = v.Magnitude(); // |v| + float Product = NormU*NormV; // |u||v| + if(Product==0.0f) return 0.0f; + float OneOverProduct = 1.0f / Product; + + // Cosinus + float Cosinus = (u|v) * OneOverProduct; + + // Sinus + Point w = u^v; + float NormW = w.Magnitude(); + + float AbsSinus = NormW * OneOverProduct; + + // Remove degeneracy + if(AbsSinus > 1.0f) AbsSinus = 1.0f; + if(AbsSinus < -1.0f) AbsSinus = -1.0f; + + if(Cosinus>=0.0f) return asinf(AbsSinus); + else return (PI-asinf(AbsSinus)); + } + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Computes the angle between two triangles. + * \param tri [in] the other triangle + * \param verts [in] the list of indexed vertices + * \return the angle in radians + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +float IndexedTriangle::Angle(const IndexedTriangle& tri, const Point* verts) const +{ + // Checkings + if(!verts) return 0.0f; + + // Compute face normals + Point n0, n1; + Normal(verts, n0); + tri.Normal(verts, n1); + + // Compute angle + float dp = n0|n1; + if(dp>1.0f) return 0.0f; + if(dp<-1.0f) return PI; + return acosf(dp); + +// return ::Angle(n0,n1); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Checks a triangle is the same as another one. + * \param tri [in] the other triangle + * \return true if same triangle + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool IndexedTriangle::Equal(const IndexedTriangle& tri) const +{ + // Test all vertex references + return (HasVertex(tri.mVRef[0]) && + HasVertex(tri.mVRef[1]) && + HasVertex(tri.mVRef[2])); +} diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceIndexedTriangle.h b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceIndexedTriangle.h new file mode 100644 index 00000000..3317a9b2 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceIndexedTriangle.h @@ -0,0 +1,84 @@ +/* + * ICE / OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains a handy indexed triangle class. + * \file IceIndexedTriangle.h + * \author Pierre Terdiman + * \date January, 17, 2000 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef __ICEINDEXEDTRIANGLE_H__ +#define __ICEINDEXEDTRIANGLE_H__ + + // Forward declarations + enum CubeIndex; + + // An indexed triangle class. + class ICEMATHS_API IndexedTriangle + { + public: + //! Constructor + inline_ IndexedTriangle() {} + //! Constructor + inline_ IndexedTriangle(udword r0, udword r1, udword r2) { mVRef[0]=r0; mVRef[1]=r1; mVRef[2]=r2; } + //! Copy constructor + inline_ IndexedTriangle(const IndexedTriangle& triangle) + { + mVRef[0] = triangle.mVRef[0]; + mVRef[1] = triangle.mVRef[1]; + mVRef[2] = triangle.mVRef[2]; + } + //! Destructor + inline_ ~IndexedTriangle() {} + //! Vertex-references + udword mVRef[3]; + + // Methods + void Flip(); + float Area(const Point* verts) const; + float Perimeter(const Point* verts) const; + float Compacity(const Point* verts) const; + void Normal(const Point* verts, Point& normal) const; + void DenormalizedNormal(const Point* verts, Point& normal) const; + void Center(const Point* verts, Point& center) const; + void CenteredNormal(const Point* verts, Point& normal) const; + void RandomPoint(const Point* verts, Point& random) const; + bool IsVisible(const Point* verts, const Point& source) const; + bool BackfaceCulling(const Point* verts, const Point& source) const; + float ComputeOcclusionPotential(const Point* verts, const Point& view) const; + bool ReplaceVertex(udword oldref, udword newref); + bool IsDegenerate() const; + bool HasVertex(udword ref) const; + bool HasVertex(udword ref, udword* index) const; + ubyte FindEdge(udword vref0, udword vref1) const; + udword OppositeVertex(udword vref0, udword vref1) const; + inline_ udword OppositeVertex(ubyte edgenb) const { return mVRef[2-edgenb]; } + void GetVRefs(ubyte edgenb, udword& vref0, udword& vref1, udword& vref2) const; + float MinEdgeLength(const Point* verts) const; + float MaxEdgeLength(const Point* verts) const; + void ComputePoint(const Point* verts, float u, float v, Point& pt, udword* nearvtx=null) const; + float Angle(const IndexedTriangle& tri, const Point* verts) const; + inline_ Plane PlaneEquation(const Point* verts) const { return Plane(verts[mVRef[0]], verts[mVRef[1]], verts[mVRef[2]]); } + bool Equal(const IndexedTriangle& tri) const; + CubeIndex ComputeCubeIndex(const Point* verts) const; + }; + +#endif // __ICEINDEXEDTRIANGLE_H__ diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceLSS.h b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceLSS.h new file mode 100644 index 00000000..d9816d55 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceLSS.h @@ -0,0 +1,91 @@ +/* + * ICE / OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code for line-swept spheres. + * \file IceLSS.h + * \author Pierre Terdiman + * \date April, 4, 2000 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef __ICELSS_H__ +#define __ICELSS_H__ + + class ICEMATHS_API LSS : public Segment + { + public: + //! Constructor + inline_ LSS() {} + //! Constructor + inline_ LSS(const Segment& seg, float radius) : Segment(seg), mRadius(radius) {} + //! Destructor + inline_ ~LSS() {} + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Computes an OBB surrounding the LSS. + * \param box [out] the OBB + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + void ComputeOBB(OBB& box); + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Tests if a point is contained within the LSS. + * \param pt [in] the point to test + * \return true if inside the LSS + * \warning point and LSS must be in same space + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ bool Contains(const Point& pt) const { return SquareDistance(pt) <= mRadius*mRadius; } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Tests if a sphere is contained within the LSS. + * \param sphere [in] the sphere to test + * \return true if inside the LSS + * \warning sphere and LSS must be in same space + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ bool Contains(const Sphere& sphere) + { + float d = mRadius - sphere.mRadius; + if(d>=0.0f) return SquareDistance(sphere.mCenter) <= d*d; + else return false; + } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Tests if an LSS is contained within the LSS. + * \param lss [in] the LSS to test + * \return true if inside the LSS + * \warning both LSS must be in same space + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ bool Contains(const LSS& lss) + { + // We check the LSS contains the two spheres at the start and end of the sweep + return Contains(Sphere(lss.mP0, lss.mRadius)) && Contains(Sphere(lss.mP0, lss.mRadius)); + } + + float mRadius; //!< Sphere radius + }; + +#endif // __ICELSS_H__ diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceMatrix3x3.cpp b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceMatrix3x3.cpp new file mode 100644 index 00000000..8a981b5c --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceMatrix3x3.cpp @@ -0,0 +1,64 @@ +/* + * ICE / OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code for 3x3 matrices. + * \file IceMatrix3x3.cpp + * \author Pierre Terdiman + * \date April, 4, 2000 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * 3x3 matrix. + * DirectX-compliant, ie row-column order, ie m[Row][Col]. + * Same as: + * m11 m12 m13 first row. + * m21 m22 m23 second row. + * m31 m32 m33 third row. + * Stored in memory as m11 m12 m13 m21... + * + * Multiplication rules: + * + * [x'y'z'] = [xyz][M] + * + * x' = x*m11 + y*m21 + z*m31 + * y' = x*m12 + y*m22 + z*m32 + * z' = x*m13 + y*m23 + z*m33 + * + * \class Matrix3x3 + * \author Pierre Terdiman + * \version 1.0 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Precompiled Header +#include "Stdafx.h" + +using namespace Opcode; + +// Cast operator +Matrix3x3::operator Matrix4x4() const +{ + return Matrix4x4( + m[0][0], m[0][1], m[0][2], 0.0f, + m[1][0], m[1][1], m[1][2], 0.0f, + m[2][0], m[2][1], m[2][2], 0.0f, + 0.0f, 0.0f, 0.0f, 1.0f); +} diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceMatrix3x3.h b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceMatrix3x3.h new file mode 100644 index 00000000..a2da08a1 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceMatrix3x3.h @@ -0,0 +1,512 @@ +/* + * ICE / OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code for 3x3 matrices. + * \file IceMatrix3x3.h + * \author Pierre Terdiman + * \date April, 4, 2000 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef __ICEMATRIX3X3_H__ +#define __ICEMATRIX3X3_H__ + + // Forward declarations + class Quat; + + #define MATRIX3X3_EPSILON (1.0e-7f) + + class ICEMATHS_API Matrix3x3 + { + public: + //! Empty constructor + inline_ Matrix3x3() {} + //! Constructor from 9 values + inline_ Matrix3x3(float m00, float m01, float m02, float m10, float m11, float m12, float m20, float m21, float m22) + { + m[0][0] = m00; m[0][1] = m01; m[0][2] = m02; + m[1][0] = m10; m[1][1] = m11; m[1][2] = m12; + m[2][0] = m20; m[2][1] = m21; m[2][2] = m22; + } + //! Copy constructor + inline_ Matrix3x3(const Matrix3x3& mat) { CopyMemory(m, &mat.m, 9*sizeof(float)); } + //! Destructor + inline_ ~Matrix3x3() {} + + //! Assign values + inline_ void Set(float m00, float m01, float m02, float m10, float m11, float m12, float m20, float m21, float m22) + { + m[0][0] = m00; m[0][1] = m01; m[0][2] = m02; + m[1][0] = m10; m[1][1] = m11; m[1][2] = m12; + m[2][0] = m20; m[2][1] = m21; m[2][2] = m22; + } + + //! Sets the scale from a Point. The point is put on the diagonal. + inline_ void SetScale(const Point& p) { m[0][0] = p.x; m[1][1] = p.y; m[2][2] = p.z; } + + //! Sets the scale from floats. Values are put on the diagonal. + inline_ void SetScale(float sx, float sy, float sz) { m[0][0] = sx; m[1][1] = sy; m[2][2] = sz; } + + //! Scales from a Point. Each row is multiplied by a component. + inline_ void Scale(const Point& p) + { + m[0][0] *= p.x; m[0][1] *= p.x; m[0][2] *= p.x; + m[1][0] *= p.y; m[1][1] *= p.y; m[1][2] *= p.y; + m[2][0] *= p.z; m[2][1] *= p.z; m[2][2] *= p.z; + } + + //! Scales from floats. Each row is multiplied by a value. + inline_ void Scale(float sx, float sy, float sz) + { + m[0][0] *= sx; m[0][1] *= sx; m[0][2] *= sx; + m[1][0] *= sy; m[1][1] *= sy; m[1][2] *= sy; + m[2][0] *= sz; m[2][1] *= sz; m[2][2] *= sz; + } + + //! Copy from a Matrix3x3 + inline_ void Copy(const Matrix3x3& source) { CopyMemory(m, source.m, 9*sizeof(float)); } + + // Row-column access + //! Returns a row. + inline_ void GetRow(const udword r, Point& p) const { p.x = m[r][0]; p.y = m[r][1]; p.z = m[r][2]; } + //! Returns a row. + inline_ const Point& GetRow(const udword r) const { return *(const Point*)&m[r][0]; } + //! Returns a row. + inline_ Point& GetRow(const udword r) { return *(Point*)&m[r][0]; } + //! Sets a row. + inline_ void SetRow(const udword r, const Point& p) { m[r][0] = p.x; m[r][1] = p.y; m[r][2] = p.z; } + //! Returns a column. + inline_ void GetCol(const udword c, Point& p) const { p.x = m[0][c]; p.y = m[1][c]; p.z = m[2][c]; } + //! Sets a column. + inline_ void SetCol(const udword c, const Point& p) { m[0][c] = p.x; m[1][c] = p.y; m[2][c] = p.z; } + + //! Computes the trace. The trace is the sum of the 3 diagonal components. + inline_ float Trace() const { return m[0][0] + m[1][1] + m[2][2]; } + //! Clears the matrix. + inline_ void Zero() { ZeroMemory(&m, sizeof(m)); } + //! Sets the identity matrix. + inline_ void Identity() { Zero(); m[0][0] = m[1][1] = m[2][2] = 1.0f; } + //! Checks for identity + inline_ bool IsIdentity() const + { + if(IR(m[0][0])!=IEEE_1_0) return false; + if(IR(m[0][1])!=0) return false; + if(IR(m[0][2])!=0) return false; + + if(IR(m[1][0])!=0) return false; + if(IR(m[1][1])!=IEEE_1_0) return false; + if(IR(m[1][2])!=0) return false; + + if(IR(m[2][0])!=0) return false; + if(IR(m[2][1])!=0) return false; + if(IR(m[2][2])!=IEEE_1_0) return false; + + return true; + } + + //! Checks matrix validity + inline_ BOOL IsValid() const + { + for(udword j=0;j<3;j++) + { + for(udword i=0;i<3;i++) + { + if(!IsValidFloat(m[j][i])) return FALSE; + } + } + return TRUE; + } + + //! Makes a skew-symmetric matrix (a.k.a. Star(*) Matrix) + //! [ 0.0 -a.z a.y ] + //! [ a.z 0.0 -a.x ] + //! [ -a.y a.x 0.0 ] + //! This is also called a "cross matrix" since for any vectors A and B, + //! A^B = Skew(A) * B = - B * Skew(A); + inline_ void SkewSymmetric(const Point& a) + { + m[0][0] = 0.0f; + m[0][1] = -a.z; + m[0][2] = a.y; + + m[1][0] = a.z; + m[1][1] = 0.0f; + m[1][2] = -a.x; + + m[2][0] = -a.y; + m[2][1] = a.x; + m[2][2] = 0.0f; + } + + //! Negates the matrix + inline_ void Neg() + { + m[0][0] = -m[0][0]; m[0][1] = -m[0][1]; m[0][2] = -m[0][2]; + m[1][0] = -m[1][0]; m[1][1] = -m[1][1]; m[1][2] = -m[1][2]; + m[2][0] = -m[2][0]; m[2][1] = -m[2][1]; m[2][2] = -m[2][2]; + } + + //! Neg from another matrix + inline_ void Neg(const Matrix3x3& mat) + { + m[0][0] = -mat.m[0][0]; m[0][1] = -mat.m[0][1]; m[0][2] = -mat.m[0][2]; + m[1][0] = -mat.m[1][0]; m[1][1] = -mat.m[1][1]; m[1][2] = -mat.m[1][2]; + m[2][0] = -mat.m[2][0]; m[2][1] = -mat.m[2][1]; m[2][2] = -mat.m[2][2]; + } + + //! Add another matrix + inline_ void Add(const Matrix3x3& mat) + { + m[0][0] += mat.m[0][0]; m[0][1] += mat.m[0][1]; m[0][2] += mat.m[0][2]; + m[1][0] += mat.m[1][0]; m[1][1] += mat.m[1][1]; m[1][2] += mat.m[1][2]; + m[2][0] += mat.m[2][0]; m[2][1] += mat.m[2][1]; m[2][2] += mat.m[2][2]; + } + + //! Sub another matrix + inline_ void Sub(const Matrix3x3& mat) + { + m[0][0] -= mat.m[0][0]; m[0][1] -= mat.m[0][1]; m[0][2] -= mat.m[0][2]; + m[1][0] -= mat.m[1][0]; m[1][1] -= mat.m[1][1]; m[1][2] -= mat.m[1][2]; + m[2][0] -= mat.m[2][0]; m[2][1] -= mat.m[2][1]; m[2][2] -= mat.m[2][2]; + } + //! Mac + inline_ void Mac(const Matrix3x3& a, const Matrix3x3& b, float s) + { + m[0][0] = a.m[0][0] + b.m[0][0] * s; + m[0][1] = a.m[0][1] + b.m[0][1] * s; + m[0][2] = a.m[0][2] + b.m[0][2] * s; + + m[1][0] = a.m[1][0] + b.m[1][0] * s; + m[1][1] = a.m[1][1] + b.m[1][1] * s; + m[1][2] = a.m[1][2] + b.m[1][2] * s; + + m[2][0] = a.m[2][0] + b.m[2][0] * s; + m[2][1] = a.m[2][1] + b.m[2][1] * s; + m[2][2] = a.m[2][2] + b.m[2][2] * s; + } + //! Mac + inline_ void Mac(const Matrix3x3& a, float s) + { + m[0][0] += a.m[0][0] * s; m[0][1] += a.m[0][1] * s; m[0][2] += a.m[0][2] * s; + m[1][0] += a.m[1][0] * s; m[1][1] += a.m[1][1] * s; m[1][2] += a.m[1][2] * s; + m[2][0] += a.m[2][0] * s; m[2][1] += a.m[2][1] * s; m[2][2] += a.m[2][2] * s; + } + + //! this = A * s + inline_ void Mult(const Matrix3x3& a, float s) + { + m[0][0] = a.m[0][0] * s; m[0][1] = a.m[0][1] * s; m[0][2] = a.m[0][2] * s; + m[1][0] = a.m[1][0] * s; m[1][1] = a.m[1][1] * s; m[1][2] = a.m[1][2] * s; + m[2][0] = a.m[2][0] * s; m[2][1] = a.m[2][1] * s; m[2][2] = a.m[2][2] * s; + } + + inline_ void Add(const Matrix3x3& a, const Matrix3x3& b) + { + m[0][0] = a.m[0][0] + b.m[0][0]; m[0][1] = a.m[0][1] + b.m[0][1]; m[0][2] = a.m[0][2] + b.m[0][2]; + m[1][0] = a.m[1][0] + b.m[1][0]; m[1][1] = a.m[1][1] + b.m[1][1]; m[1][2] = a.m[1][2] + b.m[1][2]; + m[2][0] = a.m[2][0] + b.m[2][0]; m[2][1] = a.m[2][1] + b.m[2][1]; m[2][2] = a.m[2][2] + b.m[2][2]; + } + + inline_ void Sub(const Matrix3x3& a, const Matrix3x3& b) + { + m[0][0] = a.m[0][0] - b.m[0][0]; m[0][1] = a.m[0][1] - b.m[0][1]; m[0][2] = a.m[0][2] - b.m[0][2]; + m[1][0] = a.m[1][0] - b.m[1][0]; m[1][1] = a.m[1][1] - b.m[1][1]; m[1][2] = a.m[1][2] - b.m[1][2]; + m[2][0] = a.m[2][0] - b.m[2][0]; m[2][1] = a.m[2][1] - b.m[2][1]; m[2][2] = a.m[2][2] - b.m[2][2]; + } + + //! this = a * b + inline_ void Mult(const Matrix3x3& a, const Matrix3x3& b) + { + m[0][0] = a.m[0][0] * b.m[0][0] + a.m[0][1] * b.m[1][0] + a.m[0][2] * b.m[2][0]; + m[0][1] = a.m[0][0] * b.m[0][1] + a.m[0][1] * b.m[1][1] + a.m[0][2] * b.m[2][1]; + m[0][2] = a.m[0][0] * b.m[0][2] + a.m[0][1] * b.m[1][2] + a.m[0][2] * b.m[2][2]; + m[1][0] = a.m[1][0] * b.m[0][0] + a.m[1][1] * b.m[1][0] + a.m[1][2] * b.m[2][0]; + m[1][1] = a.m[1][0] * b.m[0][1] + a.m[1][1] * b.m[1][1] + a.m[1][2] * b.m[2][1]; + m[1][2] = a.m[1][0] * b.m[0][2] + a.m[1][1] * b.m[1][2] + a.m[1][2] * b.m[2][2]; + m[2][0] = a.m[2][0] * b.m[0][0] + a.m[2][1] * b.m[1][0] + a.m[2][2] * b.m[2][0]; + m[2][1] = a.m[2][0] * b.m[0][1] + a.m[2][1] * b.m[1][1] + a.m[2][2] * b.m[2][1]; + m[2][2] = a.m[2][0] * b.m[0][2] + a.m[2][1] * b.m[1][2] + a.m[2][2] * b.m[2][2]; + } + + //! this = transpose(a) * b + inline_ void MultAtB(const Matrix3x3& a, const Matrix3x3& b) + { + m[0][0] = a.m[0][0] * b.m[0][0] + a.m[1][0] * b.m[1][0] + a.m[2][0] * b.m[2][0]; + m[0][1] = a.m[0][0] * b.m[0][1] + a.m[1][0] * b.m[1][1] + a.m[2][0] * b.m[2][1]; + m[0][2] = a.m[0][0] * b.m[0][2] + a.m[1][0] * b.m[1][2] + a.m[2][0] * b.m[2][2]; + m[1][0] = a.m[0][1] * b.m[0][0] + a.m[1][1] * b.m[1][0] + a.m[2][1] * b.m[2][0]; + m[1][1] = a.m[0][1] * b.m[0][1] + a.m[1][1] * b.m[1][1] + a.m[2][1] * b.m[2][1]; + m[1][2] = a.m[0][1] * b.m[0][2] + a.m[1][1] * b.m[1][2] + a.m[2][1] * b.m[2][2]; + m[2][0] = a.m[0][2] * b.m[0][0] + a.m[1][2] * b.m[1][0] + a.m[2][2] * b.m[2][0]; + m[2][1] = a.m[0][2] * b.m[0][1] + a.m[1][2] * b.m[1][1] + a.m[2][2] * b.m[2][1]; + m[2][2] = a.m[0][2] * b.m[0][2] + a.m[1][2] * b.m[1][2] + a.m[2][2] * b.m[2][2]; + } + + //! this = a * transpose(b) + inline_ void MultABt(const Matrix3x3& a, const Matrix3x3& b) + { + m[0][0] = a.m[0][0] * b.m[0][0] + a.m[0][1] * b.m[0][1] + a.m[0][2] * b.m[0][2]; + m[0][1] = a.m[0][0] * b.m[1][0] + a.m[0][1] * b.m[1][1] + a.m[0][2] * b.m[1][2]; + m[0][2] = a.m[0][0] * b.m[2][0] + a.m[0][1] * b.m[2][1] + a.m[0][2] * b.m[2][2]; + m[1][0] = a.m[1][0] * b.m[0][0] + a.m[1][1] * b.m[0][1] + a.m[1][2] * b.m[0][2]; + m[1][1] = a.m[1][0] * b.m[1][0] + a.m[1][1] * b.m[1][1] + a.m[1][2] * b.m[1][2]; + m[1][2] = a.m[1][0] * b.m[2][0] + a.m[1][1] * b.m[2][1] + a.m[1][2] * b.m[2][2]; + m[2][0] = a.m[2][0] * b.m[0][0] + a.m[2][1] * b.m[0][1] + a.m[2][2] * b.m[0][2]; + m[2][1] = a.m[2][0] * b.m[1][0] + a.m[2][1] * b.m[1][1] + a.m[2][2] * b.m[1][2]; + m[2][2] = a.m[2][0] * b.m[2][0] + a.m[2][1] * b.m[2][1] + a.m[2][2] * b.m[2][2]; + } + + //! Makes a rotation matrix mapping vector "from" to vector "to". + Matrix3x3& FromTo(const Point& from, const Point& to); + + //! Set a rotation matrix around the X axis. + //! 1 0 0 + //! RX = 0 cx sx + //! 0 -sx cx + void RotX(float angle); + //! Set a rotation matrix around the Y axis. + //! cy 0 -sy + //! RY = 0 1 0 + //! sy 0 cy + void RotY(float angle); + //! Set a rotation matrix around the Z axis. + //! cz sz 0 + //! RZ = -sz cz 0 + //! 0 0 1 + void RotZ(float angle); + //! cy sx.sy -sy.cx + //! RY.RX 0 cx sx + //! sy -sx.cy cx.cy + void RotYX(float y, float x); + + //! Make a rotation matrix about an arbitrary axis + Matrix3x3& Rot(float angle, const Point& axis); + + //! Transpose the matrix. + void Transpose() + { + IR(m[1][0]) ^= IR(m[0][1]); IR(m[0][1]) ^= IR(m[1][0]); IR(m[1][0]) ^= IR(m[0][1]); + IR(m[2][0]) ^= IR(m[0][2]); IR(m[0][2]) ^= IR(m[2][0]); IR(m[2][0]) ^= IR(m[0][2]); + IR(m[2][1]) ^= IR(m[1][2]); IR(m[1][2]) ^= IR(m[2][1]); IR(m[2][1]) ^= IR(m[1][2]); + } + + //! this = Transpose(a) + void Transpose(const Matrix3x3& a) + { + m[0][0] = a.m[0][0]; m[0][1] = a.m[1][0]; m[0][2] = a.m[2][0]; + m[1][0] = a.m[0][1]; m[1][1] = a.m[1][1]; m[1][2] = a.m[2][1]; + m[2][0] = a.m[0][2]; m[2][1] = a.m[1][2]; m[2][2] = a.m[2][2]; + } + + //! Compute the determinant of the matrix. We use the rule of Sarrus. + float Determinant() const + { + return (m[0][0]*m[1][1]*m[2][2] + m[0][1]*m[1][2]*m[2][0] + m[0][2]*m[1][0]*m[2][1]) + - (m[2][0]*m[1][1]*m[0][2] + m[2][1]*m[1][2]*m[0][0] + m[2][2]*m[1][0]*m[0][1]); + } +/* + //! Compute a cofactor. Used for matrix inversion. + float CoFactor(ubyte row, ubyte column) const + { + static sdword gIndex[3+2] = { 0, 1, 2, 0, 1 }; + return (m[gIndex[row+1]][gIndex[column+1]]*m[gIndex[row+2]][gIndex[column+2]] - m[gIndex[row+2]][gIndex[column+1]]*m[gIndex[row+1]][gIndex[column+2]]); + } +*/ + //! Invert the matrix. Determinant must be different from zero, else matrix can't be inverted. + Matrix3x3& Invert() + { + float Det = Determinant(); // Must be !=0 + float OneOverDet = 1.0f / Det; + + Matrix3x3 Temp; + Temp.m[0][0] = +(m[1][1] * m[2][2] - m[2][1] * m[1][2]) * OneOverDet; + Temp.m[1][0] = -(m[1][0] * m[2][2] - m[2][0] * m[1][2]) * OneOverDet; + Temp.m[2][0] = +(m[1][0] * m[2][1] - m[2][0] * m[1][1]) * OneOverDet; + Temp.m[0][1] = -(m[0][1] * m[2][2] - m[2][1] * m[0][2]) * OneOverDet; + Temp.m[1][1] = +(m[0][0] * m[2][2] - m[2][0] * m[0][2]) * OneOverDet; + Temp.m[2][1] = -(m[0][0] * m[2][1] - m[2][0] * m[0][1]) * OneOverDet; + Temp.m[0][2] = +(m[0][1] * m[1][2] - m[1][1] * m[0][2]) * OneOverDet; + Temp.m[1][2] = -(m[0][0] * m[1][2] - m[1][0] * m[0][2]) * OneOverDet; + Temp.m[2][2] = +(m[0][0] * m[1][1] - m[1][0] * m[0][1]) * OneOverDet; + + *this = Temp; + + return *this; + } + + Matrix3x3& Normalize(); + + //! this = exp(a) + Matrix3x3& Exp(const Matrix3x3& a); + +void FromQuat(const Quat &q); +void FromQuatL2(const Quat &q, float l2); + + // Arithmetic operators + //! Operator for Matrix3x3 Plus = Matrix3x3 + Matrix3x3; + inline_ Matrix3x3 operator+(const Matrix3x3& mat) const + { + return Matrix3x3( + m[0][0] + mat.m[0][0], m[0][1] + mat.m[0][1], m[0][2] + mat.m[0][2], + m[1][0] + mat.m[1][0], m[1][1] + mat.m[1][1], m[1][2] + mat.m[1][2], + m[2][0] + mat.m[2][0], m[2][1] + mat.m[2][1], m[2][2] + mat.m[2][2]); + } + + //! Operator for Matrix3x3 Minus = Matrix3x3 - Matrix3x3; + inline_ Matrix3x3 operator-(const Matrix3x3& mat) const + { + return Matrix3x3( + m[0][0] - mat.m[0][0], m[0][1] - mat.m[0][1], m[0][2] - mat.m[0][2], + m[1][0] - mat.m[1][0], m[1][1] - mat.m[1][1], m[1][2] - mat.m[1][2], + m[2][0] - mat.m[2][0], m[2][1] - mat.m[2][1], m[2][2] - mat.m[2][2]); + } + + //! Operator for Matrix3x3 Mul = Matrix3x3 * Matrix3x3; + inline_ Matrix3x3 operator*(const Matrix3x3& mat) const + { + return Matrix3x3( + m[0][0]*mat.m[0][0] + m[0][1]*mat.m[1][0] + m[0][2]*mat.m[2][0], + m[0][0]*mat.m[0][1] + m[0][1]*mat.m[1][1] + m[0][2]*mat.m[2][1], + m[0][0]*mat.m[0][2] + m[0][1]*mat.m[1][2] + m[0][2]*mat.m[2][2], + + m[1][0]*mat.m[0][0] + m[1][1]*mat.m[1][0] + m[1][2]*mat.m[2][0], + m[1][0]*mat.m[0][1] + m[1][1]*mat.m[1][1] + m[1][2]*mat.m[2][1], + m[1][0]*mat.m[0][2] + m[1][1]*mat.m[1][2] + m[1][2]*mat.m[2][2], + + m[2][0]*mat.m[0][0] + m[2][1]*mat.m[1][0] + m[2][2]*mat.m[2][0], + m[2][0]*mat.m[0][1] + m[2][1]*mat.m[1][1] + m[2][2]*mat.m[2][1], + m[2][0]*mat.m[0][2] + m[2][1]*mat.m[1][2] + m[2][2]*mat.m[2][2]); + } + + //! Operator for Point Mul = Matrix3x3 * Point; + inline_ Point operator*(const Point& v) const { return Point(GetRow(0)|v, GetRow(1)|v, GetRow(2)|v); } + + //! Operator for Matrix3x3 Mul = Matrix3x3 * float; + inline_ Matrix3x3 operator*(float s) const + { + return Matrix3x3( + m[0][0]*s, m[0][1]*s, m[0][2]*s, + m[1][0]*s, m[1][1]*s, m[1][2]*s, + m[2][0]*s, m[2][1]*s, m[2][2]*s); + } + + //! Operator for Matrix3x3 Mul = float * Matrix3x3; + inline_ friend Matrix3x3 operator*(float s, const Matrix3x3& mat) + { + return Matrix3x3( + s*mat.m[0][0], s*mat.m[0][1], s*mat.m[0][2], + s*mat.m[1][0], s*mat.m[1][1], s*mat.m[1][2], + s*mat.m[2][0], s*mat.m[2][1], s*mat.m[2][2]); + } + + //! Operator for Matrix3x3 Div = Matrix3x3 / float; + inline_ Matrix3x3 operator/(float s) const + { + if (s) s = 1.0f / s; + return Matrix3x3( + m[0][0]*s, m[0][1]*s, m[0][2]*s, + m[1][0]*s, m[1][1]*s, m[1][2]*s, + m[2][0]*s, m[2][1]*s, m[2][2]*s); + } + + //! Operator for Matrix3x3 Div = float / Matrix3x3; + inline_ friend Matrix3x3 operator/(float s, const Matrix3x3& mat) + { + return Matrix3x3( + s/mat.m[0][0], s/mat.m[0][1], s/mat.m[0][2], + s/mat.m[1][0], s/mat.m[1][1], s/mat.m[1][2], + s/mat.m[2][0], s/mat.m[2][1], s/mat.m[2][2]); + } + + //! Operator for Matrix3x3 += Matrix3x3 + inline_ Matrix3x3& operator+=(const Matrix3x3& mat) + { + m[0][0] += mat.m[0][0]; m[0][1] += mat.m[0][1]; m[0][2] += mat.m[0][2]; + m[1][0] += mat.m[1][0]; m[1][1] += mat.m[1][1]; m[1][2] += mat.m[1][2]; + m[2][0] += mat.m[2][0]; m[2][1] += mat.m[2][1]; m[2][2] += mat.m[2][2]; + return *this; + } + + //! Operator for Matrix3x3 -= Matrix3x3 + inline_ Matrix3x3& operator-=(const Matrix3x3& mat) + { + m[0][0] -= mat.m[0][0]; m[0][1] -= mat.m[0][1]; m[0][2] -= mat.m[0][2]; + m[1][0] -= mat.m[1][0]; m[1][1] -= mat.m[1][1]; m[1][2] -= mat.m[1][2]; + m[2][0] -= mat.m[2][0]; m[2][1] -= mat.m[2][1]; m[2][2] -= mat.m[2][2]; + return *this; + } + + //! Operator for Matrix3x3 *= Matrix3x3 + inline_ Matrix3x3& operator*=(const Matrix3x3& mat) + { + Point TempRow; + + GetRow(0, TempRow); + m[0][0] = TempRow.x*mat.m[0][0] + TempRow.y*mat.m[1][0] + TempRow.z*mat.m[2][0]; + m[0][1] = TempRow.x*mat.m[0][1] + TempRow.y*mat.m[1][1] + TempRow.z*mat.m[2][1]; + m[0][2] = TempRow.x*mat.m[0][2] + TempRow.y*mat.m[1][2] + TempRow.z*mat.m[2][2]; + + GetRow(1, TempRow); + m[1][0] = TempRow.x*mat.m[0][0] + TempRow.y*mat.m[1][0] + TempRow.z*mat.m[2][0]; + m[1][1] = TempRow.x*mat.m[0][1] + TempRow.y*mat.m[1][1] + TempRow.z*mat.m[2][1]; + m[1][2] = TempRow.x*mat.m[0][2] + TempRow.y*mat.m[1][2] + TempRow.z*mat.m[2][2]; + + GetRow(2, TempRow); + m[2][0] = TempRow.x*mat.m[0][0] + TempRow.y*mat.m[1][0] + TempRow.z*mat.m[2][0]; + m[2][1] = TempRow.x*mat.m[0][1] + TempRow.y*mat.m[1][1] + TempRow.z*mat.m[2][1]; + m[2][2] = TempRow.x*mat.m[0][2] + TempRow.y*mat.m[1][2] + TempRow.z*mat.m[2][2]; + return *this; + } + + //! Operator for Matrix3x3 *= float + inline_ Matrix3x3& operator*=(float s) + { + m[0][0] *= s; m[0][1] *= s; m[0][2] *= s; + m[1][0] *= s; m[1][1] *= s; m[1][2] *= s; + m[2][0] *= s; m[2][1] *= s; m[2][2] *= s; + return *this; + } + + //! Operator for Matrix3x3 /= float + inline_ Matrix3x3& operator/=(float s) + { + if (s) s = 1.0f / s; + m[0][0] *= s; m[0][1] *= s; m[0][2] *= s; + m[1][0] *= s; m[1][1] *= s; m[1][2] *= s; + m[2][0] *= s; m[2][1] *= s; m[2][2] *= s; + return *this; + } + + // Cast operators + //! Cast a Matrix3x3 to a Matrix4x4. + operator Matrix4x4() const; + //! Cast a Matrix3x3 to a Quat. + operator Quat() const; + + inline_ const Point& operator[](int row) const { return *(const Point*)&m[row][0]; } + inline_ Point& operator[](int row) { return *(Point*)&m[row][0]; } + + public: + + float m[3][3]; + }; + +#endif // __ICEMATRIX3X3_H__ + diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceMatrix4x4.cpp b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceMatrix4x4.cpp new file mode 100644 index 00000000..7e10f453 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceMatrix4x4.cpp @@ -0,0 +1,152 @@ +/* + * ICE / OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code for 4x4 matrices. + * \file IceMatrix4x4.cpp + * \author Pierre Terdiman + * \date April, 4, 2000 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * 4x4 matrix. + * DirectX-compliant, ie row-column order, ie m[Row][Col]. + * Same as: + * m11 m12 m13 m14 first row. + * m21 m22 m23 m24 second row. + * m31 m32 m33 m34 third row. + * m41 m42 m43 m44 fourth row. + * Translation is (m41, m42, m43), (m14, m24, m34, m44) = (0, 0, 0, 1). + * Stored in memory as m11 m12 m13 m14 m21... + * + * Multiplication rules: + * + * [x'y'z'1] = [xyz1][M] + * + * x' = x*m11 + y*m21 + z*m31 + m41 + * y' = x*m12 + y*m22 + z*m32 + m42 + * z' = x*m13 + y*m23 + z*m33 + m43 + * 1' = 0 + 0 + 0 + m44 + * + * \class Matrix4x4 + * \author Pierre Terdiman + * \version 1.0 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Precompiled Header +#include "Stdafx.h" + +using namespace Opcode; + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Inverts a PR matrix. (which only contains a rotation and a translation) + * This is faster and less subject to FPU errors than the generic inversion code. + * + * \relates Matrix4x4 + * \fn InvertPRMatrix(Matrix4x4& dest, const Matrix4x4& src) + * \param dest [out] destination matrix + * \param src [in] source matrix + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +ICEMATHS_API void IceMaths::InvertPRMatrix(Matrix4x4& dest, const Matrix4x4& src) +{ + dest.m[0][0] = src.m[0][0]; + dest.m[1][0] = src.m[0][1]; + dest.m[2][0] = src.m[0][2]; + dest.m[3][0] = -(src.m[3][0]*src.m[0][0] + src.m[3][1]*src.m[0][1] + src.m[3][2]*src.m[0][2]); + + dest.m[0][1] = src.m[1][0]; + dest.m[1][1] = src.m[1][1]; + dest.m[2][1] = src.m[1][2]; + dest.m[3][1] = -(src.m[3][0]*src.m[1][0] + src.m[3][1]*src.m[1][1] + src.m[3][2]*src.m[1][2]); + + dest.m[0][2] = src.m[2][0]; + dest.m[1][2] = src.m[2][1]; + dest.m[2][2] = src.m[2][2]; + dest.m[3][2] = -(src.m[3][0]*src.m[2][0] + src.m[3][1]*src.m[2][1] + src.m[3][2]*src.m[2][2]); + + dest.m[0][3] = 0.0f; + dest.m[1][3] = 0.0f; + dest.m[2][3] = 0.0f; + dest.m[3][3] = 1.0f; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Compute the cofactor of the Matrix at a specified location +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +float Matrix4x4::CoFactor(udword row, udword col) const +{ + return (( m[(row+1)&3][(col+1)&3]*m[(row+2)&3][(col+2)&3]*m[(row+3)&3][(col+3)&3] + + m[(row+1)&3][(col+2)&3]*m[(row+2)&3][(col+3)&3]*m[(row+3)&3][(col+1)&3] + + m[(row+1)&3][(col+3)&3]*m[(row+2)&3][(col+1)&3]*m[(row+3)&3][(col+2)&3]) + - (m[(row+3)&3][(col+1)&3]*m[(row+2)&3][(col+2)&3]*m[(row+1)&3][(col+3)&3] + + m[(row+3)&3][(col+2)&3]*m[(row+2)&3][(col+3)&3]*m[(row+1)&3][(col+1)&3] + + m[(row+3)&3][(col+3)&3]*m[(row+2)&3][(col+1)&3]*m[(row+1)&3][(col+2)&3])) * ((row + col) & 1 ? -1.0f : +1.0f); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Compute the determinant of the Matrix +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +float Matrix4x4::Determinant() const +{ + return m[0][0] * CoFactor(0, 0) + + m[0][1] * CoFactor(0, 1) + + m[0][2] * CoFactor(0, 2) + + m[0][3] * CoFactor(0, 3); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Compute the inverse of the matrix +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +Matrix4x4& Matrix4x4::Invert() +{ + float Det = Determinant(); + Matrix4x4 Temp; + + if(fabsf(Det) < MATRIX4X4_EPSILON) + return *this; // The matrix is not invertible! Singular case! + + float IDet = 1.0f / Det; + + Temp.m[0][0] = CoFactor(0,0) * IDet; + Temp.m[1][0] = CoFactor(0,1) * IDet; + Temp.m[2][0] = CoFactor(0,2) * IDet; + Temp.m[3][0] = CoFactor(0,3) * IDet; + Temp.m[0][1] = CoFactor(1,0) * IDet; + Temp.m[1][1] = CoFactor(1,1) * IDet; + Temp.m[2][1] = CoFactor(1,2) * IDet; + Temp.m[3][1] = CoFactor(1,3) * IDet; + Temp.m[0][2] = CoFactor(2,0) * IDet; + Temp.m[1][2] = CoFactor(2,1) * IDet; + Temp.m[2][2] = CoFactor(2,2) * IDet; + Temp.m[3][2] = CoFactor(2,3) * IDet; + Temp.m[0][3] = CoFactor(3,0) * IDet; + Temp.m[1][3] = CoFactor(3,1) * IDet; + Temp.m[2][3] = CoFactor(3,2) * IDet; + Temp.m[3][3] = CoFactor(3,3) * IDet; + + *this = Temp; + + return *this; +} + + diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceMatrix4x4.h b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceMatrix4x4.h new file mode 100644 index 00000000..8abc2a72 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceMatrix4x4.h @@ -0,0 +1,471 @@ +/* + * ICE / OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code for 4x4 matrices. + * \file IceMatrix4x4.h + * \author Pierre Terdiman + * \date April, 4, 2000 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef __ICEMATRIX4X4_H__ +#define __ICEMATRIX4X4_H__ + + // Forward declarations + class PRS; + class PR; + + #define MATRIX4X4_EPSILON (1.0e-7f) + + class ICEMATHS_API Matrix4x4 + { +// void LUBackwardSubstitution( sdword *indx, float* b ); +// void LUDecomposition( sdword* indx, float* d ); + + public: + //! Empty constructor. + inline_ Matrix4x4() {} + //! Constructor from 16 values + inline_ Matrix4x4( float m00, float m01, float m02, float m03, + float m10, float m11, float m12, float m13, + float m20, float m21, float m22, float m23, + float m30, float m31, float m32, float m33) + { + m[0][0] = m00; m[0][1] = m01; m[0][2] = m02; m[0][3] = m03; + m[1][0] = m10; m[1][1] = m11; m[1][2] = m12; m[1][3] = m13; + m[2][0] = m20; m[2][1] = m21; m[2][2] = m22; m[2][3] = m23; + m[3][0] = m30; m[3][1] = m31; m[3][2] = m32; m[3][3] = m33; + } + //! Copy constructor + inline_ Matrix4x4(const Matrix4x4& mat) { CopyMemory(m, &mat.m, 16*sizeof(float)); } + //! Destructor. + inline_ ~Matrix4x4() {} + + //! Assign values (rotation only) + inline_ Matrix4x4& Set( float m00, float m01, float m02, + float m10, float m11, float m12, + float m20, float m21, float m22) + { + m[0][0] = m00; m[0][1] = m01; m[0][2] = m02; + m[1][0] = m10; m[1][1] = m11; m[1][2] = m12; + m[2][0] = m20; m[2][1] = m21; m[2][2] = m22; + return *this; + } + //! Assign values + inline_ Matrix4x4& Set( float m00, float m01, float m02, float m03, + float m10, float m11, float m12, float m13, + float m20, float m21, float m22, float m23, + float m30, float m31, float m32, float m33) + { + m[0][0] = m00; m[0][1] = m01; m[0][2] = m02; m[0][3] = m03; + m[1][0] = m10; m[1][1] = m11; m[1][2] = m12; m[1][3] = m13; + m[2][0] = m20; m[2][1] = m21; m[2][2] = m22; m[2][3] = m23; + m[3][0] = m30; m[3][1] = m31; m[3][2] = m32; m[3][3] = m33; + return *this; + } + + //! Copy from a Matrix4x4 + inline_ void Copy(const Matrix4x4& source) { CopyMemory(m, source.m, 16*sizeof(float)); } + + // Row-column access + //! Returns a row. + inline_ void GetRow(const udword r, HPoint& p) const { p.x=m[r][0]; p.y=m[r][1]; p.z=m[r][2]; p.w=m[r][3]; } + //! Returns a row. + inline_ void GetRow(const udword r, Point& p) const { p.x=m[r][0]; p.y=m[r][1]; p.z=m[r][2]; } + //! Returns a row. + inline_ const HPoint& GetRow(const udword r) const { return *(const HPoint*)&m[r][0]; } + //! Returns a row. + inline_ HPoint& GetRow(const udword r) { return *(HPoint*)&m[r][0]; } + //! Sets a row. + inline_ void SetRow(const udword r, const HPoint& p) { m[r][0]=p.x; m[r][1]=p.y; m[r][2]=p.z; m[r][3]=p.w; } + //! Sets a row. + inline_ void SetRow(const udword r, const Point& p) { m[r][0]=p.x; m[r][1]=p.y; m[r][2]=p.z; m[r][3]= (r!=3) ? 0.0f : 1.0f; } + //! Returns a column. + inline_ void GetCol(const udword c, HPoint& p) const { p.x=m[0][c]; p.y=m[1][c]; p.z=m[2][c]; p.w=m[3][c]; } + //! Returns a column. + inline_ void GetCol(const udword c, Point& p) const { p.x=m[0][c]; p.y=m[1][c]; p.z=m[2][c]; } + //! Sets a column. + inline_ void SetCol(const udword c, const HPoint& p) { m[0][c]=p.x; m[1][c]=p.y; m[2][c]=p.z; m[3][c]=p.w; } + //! Sets a column. + inline_ void SetCol(const udword c, const Point& p) { m[0][c]=p.x; m[1][c]=p.y; m[2][c]=p.z; m[3][c]= (c!=3) ? 0.0f : 1.0f; } + + // Translation + //! Returns the translation part of the matrix. + inline_ const HPoint& GetTrans() const { return GetRow(3); } + //! Gets the translation part of the matrix + inline_ void GetTrans(Point& p) const { p.x=m[3][0]; p.y=m[3][1]; p.z=m[3][2]; } + //! Sets the translation part of the matrix, from a Point. + inline_ void SetTrans(const Point& p) { m[3][0]=p.x; m[3][1]=p.y; m[3][2]=p.z; } + //! Sets the translation part of the matrix, from a HPoint. + inline_ void SetTrans(const HPoint& p) { m[3][0]=p.x; m[3][1]=p.y; m[3][2]=p.z; m[3][3]=p.w; } + //! Sets the translation part of the matrix, from floats. + inline_ void SetTrans(float tx, float ty, float tz) { m[3][0]=tx; m[3][1]=ty; m[3][2]=tz; } + + // Scale + //! Sets the scale from a Point. The point is put on the diagonal. + inline_ void SetScale(const Point& p) { m[0][0]=p.x; m[1][1]=p.y; m[2][2]=p.z; } + //! Sets the scale from floats. Values are put on the diagonal. + inline_ void SetScale(float sx, float sy, float sz) { m[0][0]=sx; m[1][1]=sy; m[2][2]=sz; } + //! Scales from a Point. Each row is multiplied by a component. + void Scale(const Point& p) + { + m[0][0] *= p.x; m[1][0] *= p.y; m[2][0] *= p.z; + m[0][1] *= p.x; m[1][1] *= p.y; m[2][1] *= p.z; + m[0][2] *= p.x; m[1][2] *= p.y; m[2][2] *= p.z; + } + //! Scales from floats. Each row is multiplied by a value. + void Scale(float sx, float sy, float sz) + { + m[0][0] *= sx; m[1][0] *= sy; m[2][0] *= sz; + m[0][1] *= sx; m[1][1] *= sy; m[2][1] *= sz; + m[0][2] *= sx; m[1][2] *= sy; m[2][2] *= sz; + } +/* + //! Returns a row. + inline_ HPoint GetRow(const udword row) const { return mRow[row]; } + //! Sets a row. + inline_ Matrix4x4& SetRow(const udword row, const HPoint& p) { mRow[row] = p; return *this; } + //! Sets a row. + Matrix4x4& SetRow(const udword row, const Point& p) + { + m[row][0] = p.x; + m[row][1] = p.y; + m[row][2] = p.z; + m[row][3] = (row != 3) ? 0.0f : 1.0f; + return *this; + } + //! Returns a column. + HPoint GetCol(const udword col) const + { + HPoint Res; + Res.x = m[0][col]; + Res.y = m[1][col]; + Res.z = m[2][col]; + Res.w = m[3][col]; + return Res; + } + //! Sets a column. + Matrix4x4& SetCol(const udword col, const HPoint& p) + { + m[0][col] = p.x; + m[1][col] = p.y; + m[2][col] = p.z; + m[3][col] = p.w; + return *this; + } + //! Sets a column. + Matrix4x4& SetCol(const udword col, const Point& p) + { + m[0][col] = p.x; + m[1][col] = p.y; + m[2][col] = p.z; + m[3][col] = (col != 3) ? 0.0f : 1.0f; + return *this; + } +*/ + //! Computes the trace. The trace is the sum of the 4 diagonal components. + inline_ float Trace() const { return m[0][0] + m[1][1] + m[2][2] + m[3][3]; } + //! Computes the trace of the upper 3x3 matrix. + inline_ float Trace3x3() const { return m[0][0] + m[1][1] + m[2][2]; } + //! Clears the matrix. + inline_ void Zero() { ZeroMemory(&m, sizeof(m)); } + //! Sets the identity matrix. + inline_ void Identity() { Zero(); m[0][0] = m[1][1] = m[2][2] = m[3][3] = 1.0f; } + //! Checks for identity + inline_ bool IsIdentity() const + { + if(IR(m[0][0])!=IEEE_1_0) return false; + if(IR(m[0][1])!=0) return false; + if(IR(m[0][2])!=0) return false; + if(IR(m[0][3])!=0) return false; + + if(IR(m[1][0])!=0) return false; + if(IR(m[1][1])!=IEEE_1_0) return false; + if(IR(m[1][2])!=0) return false; + if(IR(m[1][3])!=0) return false; + + if(IR(m[2][0])!=0) return false; + if(IR(m[2][1])!=0) return false; + if(IR(m[2][2])!=IEEE_1_0) return false; + if(IR(m[2][3])!=0) return false; + + if(IR(m[3][0])!=0) return false; + if(IR(m[3][1])!=0) return false; + if(IR(m[3][2])!=0) return false; + if(IR(m[3][3])!=IEEE_1_0) return false; + return true; + } + + //! Checks matrix validity + inline_ BOOL IsValid() const + { + for(udword j=0;j<4;j++) + { + for(udword i=0;i<4;i++) + { + if(!IsValidFloat(m[j][i])) return FALSE; + } + } + return TRUE; + } + + //! Sets a rotation matrix around the X axis. + void RotX(float angle) { float Cos = cosf(angle), Sin = sinf(angle); Identity(); m[1][1] = m[2][2] = Cos; m[2][1] = -Sin; m[1][2] = Sin; } + //! Sets a rotation matrix around the Y axis. + void RotY(float angle) { float Cos = cosf(angle), Sin = sinf(angle); Identity(); m[0][0] = m[2][2] = Cos; m[2][0] = Sin; m[0][2] = -Sin; } + //! Sets a rotation matrix around the Z axis. + void RotZ(float angle) { float Cos = cosf(angle), Sin = sinf(angle); Identity(); m[0][0] = m[1][1] = Cos; m[1][0] = -Sin; m[0][1] = Sin; } + + //! Makes a rotation matrix about an arbitrary axis + Matrix4x4& Rot(float angle, Point& p1, Point& p2); + + //! Transposes the matrix. + void Transpose() + { + IR(m[1][0]) ^= IR(m[0][1]); IR(m[0][1]) ^= IR(m[1][0]); IR(m[1][0]) ^= IR(m[0][1]); + IR(m[2][0]) ^= IR(m[0][2]); IR(m[0][2]) ^= IR(m[2][0]); IR(m[2][0]) ^= IR(m[0][2]); + IR(m[3][0]) ^= IR(m[0][3]); IR(m[0][3]) ^= IR(m[3][0]); IR(m[3][0]) ^= IR(m[0][3]); + IR(m[1][2]) ^= IR(m[2][1]); IR(m[2][1]) ^= IR(m[1][2]); IR(m[1][2]) ^= IR(m[2][1]); + IR(m[1][3]) ^= IR(m[3][1]); IR(m[3][1]) ^= IR(m[1][3]); IR(m[1][3]) ^= IR(m[3][1]); + IR(m[2][3]) ^= IR(m[3][2]); IR(m[3][2]) ^= IR(m[2][3]); IR(m[2][3]) ^= IR(m[3][2]); + } + + //! Computes a cofactor. Used for matrix inversion. + float CoFactor(udword row, udword col) const; + //! Computes the determinant of the matrix. + float Determinant() const; + //! Inverts the matrix. Determinant must be different from zero, else matrix can't be inverted. + Matrix4x4& Invert(); +// Matrix& ComputeAxisMatrix(Point& axis, float angle); + + // Cast operators + //! Casts a Matrix4x4 to a Matrix3x3. + inline_ operator Matrix3x3() const + { + return Matrix3x3( + m[0][0], m[0][1], m[0][2], + m[1][0], m[1][1], m[1][2], + m[2][0], m[2][1], m[2][2]); + } + //! Casts a Matrix4x4 to a Quat. + operator Quat() const; + //! Casts a Matrix4x4 to a PR. + operator PR() const; + + // Arithmetic operators + //! Operator for Matrix4x4 Plus = Matrix4x4 + Matrix4x4; + inline_ Matrix4x4 operator+(const Matrix4x4& mat) const + { + return Matrix4x4( + m[0][0]+mat.m[0][0], m[0][1]+mat.m[0][1], m[0][2]+mat.m[0][2], m[0][3]+mat.m[0][3], + m[1][0]+mat.m[1][0], m[1][1]+mat.m[1][1], m[1][2]+mat.m[1][2], m[1][3]+mat.m[1][3], + m[2][0]+mat.m[2][0], m[2][1]+mat.m[2][1], m[2][2]+mat.m[2][2], m[2][3]+mat.m[2][3], + m[3][0]+mat.m[3][0], m[3][1]+mat.m[3][1], m[3][2]+mat.m[3][2], m[3][3]+mat.m[3][3]); + } + + //! Operator for Matrix4x4 Minus = Matrix4x4 - Matrix4x4; + inline_ Matrix4x4 operator-(const Matrix4x4& mat) const + { + return Matrix4x4( + m[0][0]-mat.m[0][0], m[0][1]-mat.m[0][1], m[0][2]-mat.m[0][2], m[0][3]-mat.m[0][3], + m[1][0]-mat.m[1][0], m[1][1]-mat.m[1][1], m[1][2]-mat.m[1][2], m[1][3]-mat.m[1][3], + m[2][0]-mat.m[2][0], m[2][1]-mat.m[2][1], m[2][2]-mat.m[2][2], m[2][3]-mat.m[2][3], + m[3][0]-mat.m[3][0], m[3][1]-mat.m[3][1], m[3][2]-mat.m[3][2], m[3][3]-mat.m[3][3]); + } + + //! Operator for Matrix4x4 Mul = Matrix4x4 * Matrix4x4; + inline_ Matrix4x4 operator*(const Matrix4x4& mat) const + { + return Matrix4x4( + m[0][0]*mat.m[0][0] + m[0][1]*mat.m[1][0] + m[0][2]*mat.m[2][0] + m[0][3]*mat.m[3][0], + m[0][0]*mat.m[0][1] + m[0][1]*mat.m[1][1] + m[0][2]*mat.m[2][1] + m[0][3]*mat.m[3][1], + m[0][0]*mat.m[0][2] + m[0][1]*mat.m[1][2] + m[0][2]*mat.m[2][2] + m[0][3]*mat.m[3][2], + m[0][0]*mat.m[0][3] + m[0][1]*mat.m[1][3] + m[0][2]*mat.m[2][3] + m[0][3]*mat.m[3][3], + + m[1][0]*mat.m[0][0] + m[1][1]*mat.m[1][0] + m[1][2]*mat.m[2][0] + m[1][3]*mat.m[3][0], + m[1][0]*mat.m[0][1] + m[1][1]*mat.m[1][1] + m[1][2]*mat.m[2][1] + m[1][3]*mat.m[3][1], + m[1][0]*mat.m[0][2] + m[1][1]*mat.m[1][2] + m[1][2]*mat.m[2][2] + m[1][3]*mat.m[3][2], + m[1][0]*mat.m[0][3] + m[1][1]*mat.m[1][3] + m[1][2]*mat.m[2][3] + m[1][3]*mat.m[3][3], + + m[2][0]*mat.m[0][0] + m[2][1]*mat.m[1][0] + m[2][2]*mat.m[2][0] + m[2][3]*mat.m[3][0], + m[2][0]*mat.m[0][1] + m[2][1]*mat.m[1][1] + m[2][2]*mat.m[2][1] + m[2][3]*mat.m[3][1], + m[2][0]*mat.m[0][2] + m[2][1]*mat.m[1][2] + m[2][2]*mat.m[2][2] + m[2][3]*mat.m[3][2], + m[2][0]*mat.m[0][3] + m[2][1]*mat.m[1][3] + m[2][2]*mat.m[2][3] + m[2][3]*mat.m[3][3], + + m[3][0]*mat.m[0][0] + m[3][1]*mat.m[1][0] + m[3][2]*mat.m[2][0] + m[3][3]*mat.m[3][0], + m[3][0]*mat.m[0][1] + m[3][1]*mat.m[1][1] + m[3][2]*mat.m[2][1] + m[3][3]*mat.m[3][1], + m[3][0]*mat.m[0][2] + m[3][1]*mat.m[1][2] + m[3][2]*mat.m[2][2] + m[3][3]*mat.m[3][2], + m[3][0]*mat.m[0][3] + m[3][1]*mat.m[1][3] + m[3][2]*mat.m[2][3] + m[3][3]*mat.m[3][3]); + } + + //! Operator for HPoint Mul = Matrix4x4 * HPoint; + inline_ HPoint operator*(const HPoint& v) const { return HPoint(GetRow(0)|v, GetRow(1)|v, GetRow(2)|v, GetRow(3)|v); } + + //! Operator for Point Mul = Matrix4x4 * Point; + inline_ Point operator*(const Point& v) const + { + return Point( m[0][0]*v.x + m[0][1]*v.y + m[0][2]*v.z + m[0][3], + m[1][0]*v.x + m[1][1]*v.y + m[1][2]*v.z + m[1][3], + m[2][0]*v.x + m[2][1]*v.y + m[2][2]*v.z + m[2][3] ); + } + + //! Operator for Matrix4x4 Scale = Matrix4x4 * float; + inline_ Matrix4x4 operator*(float s) const + { + return Matrix4x4( + m[0][0]*s, m[0][1]*s, m[0][2]*s, m[0][3]*s, + m[1][0]*s, m[1][1]*s, m[1][2]*s, m[1][3]*s, + m[2][0]*s, m[2][1]*s, m[2][2]*s, m[2][3]*s, + m[3][0]*s, m[3][1]*s, m[3][2]*s, m[3][3]*s); + } + + //! Operator for Matrix4x4 Scale = float * Matrix4x4; + inline_ friend Matrix4x4 operator*(float s, const Matrix4x4& mat) + { + return Matrix4x4( + s*mat.m[0][0], s*mat.m[0][1], s*mat.m[0][2], s*mat.m[0][3], + s*mat.m[1][0], s*mat.m[1][1], s*mat.m[1][2], s*mat.m[1][3], + s*mat.m[2][0], s*mat.m[2][1], s*mat.m[2][2], s*mat.m[2][3], + s*mat.m[3][0], s*mat.m[3][1], s*mat.m[3][2], s*mat.m[3][3]); + } + + //! Operator for Matrix4x4 Div = Matrix4x4 / float; + inline_ Matrix4x4 operator/(float s) const + { + if(s) s = 1.0f / s; + + return Matrix4x4( + m[0][0]*s, m[0][1]*s, m[0][2]*s, m[0][3]*s, + m[1][0]*s, m[1][1]*s, m[1][2]*s, m[1][3]*s, + m[2][0]*s, m[2][1]*s, m[2][2]*s, m[2][3]*s, + m[3][0]*s, m[3][1]*s, m[3][2]*s, m[3][3]*s); + } + + //! Operator for Matrix4x4 Div = float / Matrix4x4; + inline_ friend Matrix4x4 operator/(float s, const Matrix4x4& mat) + { + return Matrix4x4( + s/mat.m[0][0], s/mat.m[0][1], s/mat.m[0][2], s/mat.m[0][3], + s/mat.m[1][0], s/mat.m[1][1], s/mat.m[1][2], s/mat.m[1][3], + s/mat.m[2][0], s/mat.m[2][1], s/mat.m[2][2], s/mat.m[2][3], + s/mat.m[3][0], s/mat.m[3][1], s/mat.m[3][2], s/mat.m[3][3]); + } + + //! Operator for Matrix4x4 += Matrix4x4; + inline_ Matrix4x4& operator+=(const Matrix4x4& mat) + { + m[0][0]+=mat.m[0][0]; m[0][1]+=mat.m[0][1]; m[0][2]+=mat.m[0][2]; m[0][3]+=mat.m[0][3]; + m[1][0]+=mat.m[1][0]; m[1][1]+=mat.m[1][1]; m[1][2]+=mat.m[1][2]; m[1][3]+=mat.m[1][3]; + m[2][0]+=mat.m[2][0]; m[2][1]+=mat.m[2][1]; m[2][2]+=mat.m[2][2]; m[2][3]+=mat.m[2][3]; + m[3][0]+=mat.m[3][0]; m[3][1]+=mat.m[3][1]; m[3][2]+=mat.m[3][2]; m[3][3]+=mat.m[3][3]; + return *this; + } + + //! Operator for Matrix4x4 -= Matrix4x4; + inline_ Matrix4x4& operator-=(const Matrix4x4& mat) + { + m[0][0]-=mat.m[0][0]; m[0][1]-=mat.m[0][1]; m[0][2]-=mat.m[0][2]; m[0][3]-=mat.m[0][3]; + m[1][0]-=mat.m[1][0]; m[1][1]-=mat.m[1][1]; m[1][2]-=mat.m[1][2]; m[1][3]-=mat.m[1][3]; + m[2][0]-=mat.m[2][0]; m[2][1]-=mat.m[2][1]; m[2][2]-=mat.m[2][2]; m[2][3]-=mat.m[2][3]; + m[3][0]-=mat.m[3][0]; m[3][1]-=mat.m[3][1]; m[3][2]-=mat.m[3][2]; m[3][3]-=mat.m[3][3]; + return *this; + } + + //! Operator for Matrix4x4 *= Matrix4x4; + Matrix4x4& operator*=(const Matrix4x4& mat) + { + HPoint TempRow; + + GetRow(0, TempRow); + m[0][0] = TempRow.x*mat.m[0][0] + TempRow.y*mat.m[1][0] + TempRow.z*mat.m[2][0] + TempRow.w*mat.m[3][0]; + m[0][1] = TempRow.x*mat.m[0][1] + TempRow.y*mat.m[1][1] + TempRow.z*mat.m[2][1] + TempRow.w*mat.m[3][1]; + m[0][2] = TempRow.x*mat.m[0][2] + TempRow.y*mat.m[1][2] + TempRow.z*mat.m[2][2] + TempRow.w*mat.m[3][2]; + m[0][3] = TempRow.x*mat.m[0][3] + TempRow.y*mat.m[1][3] + TempRow.z*mat.m[2][3] + TempRow.w*mat.m[3][3]; + + GetRow(1, TempRow); + m[1][0] = TempRow.x*mat.m[0][0] + TempRow.y*mat.m[1][0] + TempRow.z*mat.m[2][0] + TempRow.w*mat.m[3][0]; + m[1][1] = TempRow.x*mat.m[0][1] + TempRow.y*mat.m[1][1] + TempRow.z*mat.m[2][1] + TempRow.w*mat.m[3][1]; + m[1][2] = TempRow.x*mat.m[0][2] + TempRow.y*mat.m[1][2] + TempRow.z*mat.m[2][2] + TempRow.w*mat.m[3][2]; + m[1][3] = TempRow.x*mat.m[0][3] + TempRow.y*mat.m[1][3] + TempRow.z*mat.m[2][3] + TempRow.w*mat.m[3][3]; + + GetRow(2, TempRow); + m[2][0] = TempRow.x*mat.m[0][0] + TempRow.y*mat.m[1][0] + TempRow.z*mat.m[2][0] + TempRow.w*mat.m[3][0]; + m[2][1] = TempRow.x*mat.m[0][1] + TempRow.y*mat.m[1][1] + TempRow.z*mat.m[2][1] + TempRow.w*mat.m[3][1]; + m[2][2] = TempRow.x*mat.m[0][2] + TempRow.y*mat.m[1][2] + TempRow.z*mat.m[2][2] + TempRow.w*mat.m[3][2]; + m[2][3] = TempRow.x*mat.m[0][3] + TempRow.y*mat.m[1][3] + TempRow.z*mat.m[2][3] + TempRow.w*mat.m[3][3]; + + GetRow(3, TempRow); + m[3][0] = TempRow.x*mat.m[0][0] + TempRow.y*mat.m[1][0] + TempRow.z*mat.m[2][0] + TempRow.w*mat.m[3][0]; + m[3][1] = TempRow.x*mat.m[0][1] + TempRow.y*mat.m[1][1] + TempRow.z*mat.m[2][1] + TempRow.w*mat.m[3][1]; + m[3][2] = TempRow.x*mat.m[0][2] + TempRow.y*mat.m[1][2] + TempRow.z*mat.m[2][2] + TempRow.w*mat.m[3][2]; + m[3][3] = TempRow.x*mat.m[0][3] + TempRow.y*mat.m[1][3] + TempRow.z*mat.m[2][3] + TempRow.w*mat.m[3][3]; + + return *this; + } + + //! Operator for Matrix4x4 *= float; + inline_ Matrix4x4& operator*=(float s) + { + m[0][0]*=s; m[0][1]*=s; m[0][2]*=s; m[0][3]*=s; + m[1][0]*=s; m[1][1]*=s; m[1][2]*=s; m[1][3]*=s; + m[2][0]*=s; m[2][1]*=s; m[2][2]*=s; m[2][3]*=s; + m[3][0]*=s; m[3][1]*=s; m[3][2]*=s; m[3][3]*=s; + return *this; + } + + //! Operator for Matrix4x4 /= float; + inline_ Matrix4x4& operator/=(float s) + { + if(s) s = 1.0f / s; + m[0][0]*=s; m[0][1]*=s; m[0][2]*=s; m[0][3]*=s; + m[1][0]*=s; m[1][1]*=s; m[1][2]*=s; m[1][3]*=s; + m[2][0]*=s; m[2][1]*=s; m[2][2]*=s; m[2][3]*=s; + m[3][0]*=s; m[3][1]*=s; m[3][2]*=s; m[3][3]*=s; + return *this; + } + + inline_ const HPoint& operator[](int row) const { return *(const HPoint*)&m[row][0]; } + inline_ HPoint& operator[](int row) { return *(HPoint*)&m[row][0]; } + + public: + + float m[4][4]; + }; + + //! Quickly rotates & translates a vector, using the 4x3 part of a 4x4 matrix + inline_ void TransformPoint4x3(Point& dest, const Point& source, const Matrix4x4& rot) + { + dest.x = rot.m[3][0] + source.x * rot.m[0][0] + source.y * rot.m[1][0] + source.z * rot.m[2][0]; + dest.y = rot.m[3][1] + source.x * rot.m[0][1] + source.y * rot.m[1][1] + source.z * rot.m[2][1]; + dest.z = rot.m[3][2] + source.x * rot.m[0][2] + source.y * rot.m[1][2] + source.z * rot.m[2][2]; + } + + //! Quickly rotates a vector, using the 3x3 part of a 4x4 matrix + inline_ void TransformPoint3x3(Point& dest, const Point& source, const Matrix4x4& rot) + { + dest.x = source.x * rot.m[0][0] + source.y * rot.m[1][0] + source.z * rot.m[2][0]; + dest.y = source.x * rot.m[0][1] + source.y * rot.m[1][1] + source.z * rot.m[2][1]; + dest.z = source.x * rot.m[0][2] + source.y * rot.m[1][2] + source.z * rot.m[2][2]; + } + + ICEMATHS_API void InvertPRMatrix(Matrix4x4& dest, const Matrix4x4& src); + +#endif // __ICEMATRIX4X4_H__ + diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceMemoryMacros.h b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceMemoryMacros.h new file mode 100644 index 00000000..3f249751 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceMemoryMacros.h @@ -0,0 +1,180 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains all memory macros. + * \file IceMemoryMacros.h + * \author Pierre Terdiman + * \date April, 4, 2000 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef ICEMEMORYMACROS_H +#define ICEMEMORYMACROS_H + +#undef ZeroMemory +#undef CopyMemory +#undef MoveMemory +#undef FillMemory + + //! Clears a buffer. + //! \param addr [in] buffer address + //! \param size [in] buffer length + //! \see FillMemory + //! \see StoreDwords + //! \see CopyMemory + //! \see MoveMemory + inline_ void ZeroMemory(void* addr, regsize size) { memset(addr, 0, size); } + + //! Fills a buffer with a given byte. + //! \param addr [in] buffer address + //! \param size [in] buffer length + //! \param val [in] the byte value + //! \see StoreDwords + //! \see ZeroMemory + //! \see CopyMemory + //! \see MoveMemory + inline_ void FillMemory(void* dest, regsize size, ubyte val) { memset(dest, val, size); } + + //! Fills a buffer with a given dword. + //! \param addr [in] buffer address + //! \param nb [in] number of dwords to write + //! \param value [in] the dword value + //! \see FillMemory + //! \see ZeroMemory + //! \see CopyMemory + //! \see MoveMemory + //! \warning writes nb*4 bytes ! + inline_ void StoreDwords(udword* dest, udword nb, udword value) + { + // The asm code below **SHOULD** be equivalent to one of those C versions + // or the other if your compiled is good: (checked on VC++ 6.0) + // + // 1) while(nb--) *dest++ = value; + // + // 2) for(udword i=0;iRelease(); (x) = null; } + + //! Safe ICE-style release + #define SAFE_DESTRUCT(x) if (x) { (x)->SelfDestruct(); (x) = null; } + +#ifdef ICEERROR_H + //! Standard alloc checking. HANDLE WITH CARE. Relies on strict coding rules. Probably shouldn't be used outside of ICE. + #define CHECKALLOC(x) if(!x) return SetIceError("Out of memory.", EC_OUT_OF_MEMORY); +#else + #define CHECKALLOC(x) if(!x) return false; +#endif + + //! Standard allocation cycle + #define SAFE_ALLOC(ptr, type, count) DELETEARRAY(ptr); ptr = new type[count]; CHECKALLOC(ptr); + #define SAFE_ICE_ALLOC(ptr, type, count) DELETEARRAY(ptr); ptr = ICE_NEW(type)[count]; CHECKALLOC(ptr); + + //! Don't use inline for alloca !!! +#ifdef WIN32 + #define StackAlloc(x) _alloca(x) +#elif LINUX + #define StackAlloc(x) alloca(x) +#elif defined(__APPLE__) + #define StackAlloc(x) alloca(x) +#elif defined(_XBOX) + #define StackAlloc(x) _alloca(x) +#endif + +#ifdef _DEBUG +// #define ICE_ALLOC_TMP(x) GetAllocator()->mallocDebug(x, __FILE__, __LINE__, #x, MEMORY_TEMP) +// #define ICE_ALLOC(x) GetAllocator()->mallocDebug(x, __FILE__, __LINE__, #x, MEMORY_PERSISTENT) + #define ICE_ALLOC_TMP(x) GetAllocator()->mallocDebug(x, __FILE__, __LINE__, "(undefined)", MEMORY_TEMP) + #define ICE_ALLOC(x) GetAllocator()->mallocDebug(x, __FILE__, __LINE__, "(undefined)", MEMORY_PERSISTENT) + #define ICE_ALLOC_TMP2(x, y) GetAllocator()->mallocDebug(x, __FILE__, __LINE__, #y, MEMORY_TEMP) + #define ICE_ALLOC2(x, y) GetAllocator()->mallocDebug(x, __FILE__, __LINE__, #y, MEMORY_PERSISTENT) +#else + #define ICE_ALLOC_TMP(x) GetAllocator()->malloc(x, MEMORY_TEMP) + #define ICE_ALLOC(x) GetAllocator()->malloc(x, MEMORY_PERSISTENT) +#endif + #define ICE_FREE(x) if(x) { GetAllocator()->free(x); x = null; } + +#ifdef DONT_TRACK_MEMORY_LEAKS + #ifdef _DEBUG + #define ICE_NEW_TMP(x) new(__FILE__, __LINE__, #x, MEMORY_TEMP) x + #define ICE_NEW(x) new(__FILE__, __LINE__, #x, MEMORY_PERSISTENT) x + #else + #define ICE_NEW_TMP(x) new(MEMORY_TEMP) x + #define ICE_NEW(x) new(MEMORY_PERSISTENT) x + #endif +#else + #define ICE_NEW_TMP(x) new x + #define ICE_NEW(x) new x +#endif + +#endif // ICEMEMORYMACROS_H diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceOBB.cpp b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceOBB.cpp new file mode 100644 index 00000000..79563218 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceOBB.cpp @@ -0,0 +1,339 @@ +/* + * ICE / OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains OBB-related code. + * \file IceOBB.cpp + * \author Pierre Terdiman + * \date January, 29, 2000 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * An Oriented Bounding Box (OBB). + * \class OBB + * \author Pierre Terdiman + * \version 1.0 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Precompiled Header +#include "Stdafx.h" + +using namespace Opcode; + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Tests if a point is contained within the OBB. + * \param p [in] the world point to test + * \return true if inside the OBB + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool OBB::ContainsPoint(const Point& p) const +{ + // Point in OBB test using lazy evaluation and early exits + + // Translate to box space + Point RelPoint = p - mCenter; + + // Point * mRot maps from box space to world space + // mRot * Point maps from world space to box space (what we need here) + + float f = mRot.m[0][0] * RelPoint.x + mRot.m[0][1] * RelPoint.y + mRot.m[0][2] * RelPoint.z; + if(f >= mExtents.x || f <= -mExtents.x) return false; + + f = mRot.m[1][0] * RelPoint.x + mRot.m[1][1] * RelPoint.y + mRot.m[1][2] * RelPoint.z; + if(f >= mExtents.y || f <= -mExtents.y) return false; + + f = mRot.m[2][0] * RelPoint.x + mRot.m[2][1] * RelPoint.y + mRot.m[2][2] * RelPoint.z; + if(f >= mExtents.z || f <= -mExtents.z) return false; + return true; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Builds an OBB from an AABB and a world transform. + * \param aabb [in] the aabb + * \param mat [in] the world transform + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void OBB::Create(const AABB& aabb, const Matrix4x4& mat) +{ + // Note: must be coherent with Rotate() + + aabb.GetCenter(mCenter); + aabb.GetExtents(mExtents); + // Here we have the same as OBB::Rotate(mat) where the obb is (mCenter, mExtents, Identity). + + // So following what's done in Rotate: + // - x-form the center + mCenter *= mat; + // - combine rotation with identity, i.e. just use given matrix + mRot = mat; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Computes the obb planes. + * \param planes [out] 6 box planes + * \return true if success + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool OBB::ComputePlanes(Plane* planes) const +{ + // Checkings + if(!planes) return false; + + Point Axis0 = mRot[0]; + Point Axis1 = mRot[1]; + Point Axis2 = mRot[2]; + + // Writes normals + planes[0].n = Axis0; + planes[1].n = -Axis0; + planes[2].n = Axis1; + planes[3].n = -Axis1; + planes[4].n = Axis2; + planes[5].n = -Axis2; + + // Compute a point on each plane + Point p0 = mCenter + Axis0 * mExtents.x; + Point p1 = mCenter - Axis0 * mExtents.x; + Point p2 = mCenter + Axis1 * mExtents.y; + Point p3 = mCenter - Axis1 * mExtents.y; + Point p4 = mCenter + Axis2 * mExtents.z; + Point p5 = mCenter - Axis2 * mExtents.z; + + // Compute d + planes[0].d = -(planes[0].n|p0); + planes[1].d = -(planes[1].n|p1); + planes[2].d = -(planes[2].n|p2); + planes[3].d = -(planes[3].n|p3); + planes[4].d = -(planes[4].n|p4); + planes[5].d = -(planes[5].n|p5); + + return true; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Computes the obb points. + * \param pts [out] 8 box points + * \return true if success + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool OBB::ComputePoints(Point* pts) const +{ + // Checkings + if(!pts) return false; + + Point Axis0 = mRot[0]; + Point Axis1 = mRot[1]; + Point Axis2 = mRot[2]; + + Axis0 *= mExtents.x; + Axis1 *= mExtents.y; + Axis2 *= mExtents.z; + + // 7+------+6 0 = --- + // /| /| 1 = +-- + // / | / | 2 = ++- + // / 4+---/--+5 3 = -+- + // 3+------+2 / y z 4 = --+ + // | / | / | / 5 = +-+ + // |/ |/ |/ 6 = +++ + // 0+------+1 *---x 7 = -++ + + pts[0] = mCenter - Axis0 - Axis1 - Axis2; + pts[1] = mCenter + Axis0 - Axis1 - Axis2; + pts[2] = mCenter + Axis0 + Axis1 - Axis2; + pts[3] = mCenter - Axis0 + Axis1 - Axis2; + pts[4] = mCenter - Axis0 - Axis1 + Axis2; + pts[5] = mCenter + Axis0 - Axis1 + Axis2; + pts[6] = mCenter + Axis0 + Axis1 + Axis2; + pts[7] = mCenter - Axis0 + Axis1 + Axis2; + + return true; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Computes vertex normals. + * \param pts [out] 8 box points + * \return true if success + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool OBB::ComputeVertexNormals(Point* pts) const +{ + static float VertexNormals[] = + { + -INVSQRT3, -INVSQRT3, -INVSQRT3, + INVSQRT3, -INVSQRT3, -INVSQRT3, + INVSQRT3, INVSQRT3, -INVSQRT3, + -INVSQRT3, INVSQRT3, -INVSQRT3, + -INVSQRT3, -INVSQRT3, INVSQRT3, + INVSQRT3, -INVSQRT3, INVSQRT3, + INVSQRT3, INVSQRT3, INVSQRT3, + -INVSQRT3, INVSQRT3, INVSQRT3 + }; + + if(!pts) return false; + + const Point* VN = (const Point*)VertexNormals; + for(udword i=0;i<8;i++) + { + pts[i] = VN[i] * mRot; + } + + return true; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Returns edges. + * \return 24 indices (12 edges) indexing the list returned by ComputePoints() + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +const udword* OBB::GetEdges() const +{ + static udword Indices[] = { + 0, 1, 1, 2, 2, 3, 3, 0, + 7, 6, 6, 5, 5, 4, 4, 7, + 1, 5, 6, 2, + 3, 7, 4, 0 + }; + return Indices; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Returns local edge normals. + * \return edge normals in local space + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +const Point* OBB::GetLocalEdgeNormals() const +{ + static float EdgeNormals[] = + { + 0, -INVSQRT2, -INVSQRT2, // 0-1 + INVSQRT2, 0, -INVSQRT2, // 1-2 + 0, INVSQRT2, -INVSQRT2, // 2-3 + -INVSQRT2, 0, -INVSQRT2, // 3-0 + + 0, INVSQRT2, INVSQRT2, // 7-6 + INVSQRT2, 0, INVSQRT2, // 6-5 + 0, -INVSQRT2, INVSQRT2, // 5-4 + -INVSQRT2, 0, INVSQRT2, // 4-7 + + INVSQRT2, -INVSQRT2, 0, // 1-5 + INVSQRT2, INVSQRT2, 0, // 6-2 + -INVSQRT2, INVSQRT2, 0, // 3-7 + -INVSQRT2, -INVSQRT2, 0 // 4-0 + }; + return (const Point*)EdgeNormals; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Returns world edge normal + * \param edge_index [in] 0 <= edge index < 12 + * \param world_normal [out] edge normal in world space + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void OBB::ComputeWorldEdgeNormal(udword edge_index, Point& world_normal) const +{ + ASSERT(edge_index<12); + world_normal = GetLocalEdgeNormals()[edge_index] * mRot; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Computes an LSS surrounding the OBB. + * \param lss [out] the LSS + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void OBB::ComputeLSS(LSS& lss) const +{ + Point Axis0 = mRot[0]; + Point Axis1 = mRot[1]; + Point Axis2 = mRot[2]; + + switch(mExtents.LargestAxis()) + { + case 0: + lss.mRadius = (mExtents.y + mExtents.z)*0.5f; + lss.mP0 = mCenter + Axis0 * (mExtents.x - lss.mRadius); + lss.mP1 = mCenter - Axis0 * (mExtents.x - lss.mRadius); + break; + case 1: + lss.mRadius = (mExtents.x + mExtents.z)*0.5f; + lss.mP0 = mCenter + Axis1 * (mExtents.y - lss.mRadius); + lss.mP1 = mCenter - Axis1 * (mExtents.y - lss.mRadius); + break; + case 2: + lss.mRadius = (mExtents.x + mExtents.y)*0.5f; + lss.mP0 = mCenter + Axis2 * (mExtents.z - lss.mRadius); + lss.mP1 = mCenter - Axis2 * (mExtents.z - lss.mRadius); + break; + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Checks the OBB is inside another OBB. + * \param box [in] the other OBB + * \return TRUE if we're inside the other box + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +BOOL OBB::IsInside(const OBB& box) const +{ + // Make a 4x4 from the box & inverse it + Matrix4x4 M0Inv; + { + Matrix4x4 M0 = box.mRot; + M0.SetTrans(box.mCenter); + InvertPRMatrix(M0Inv, M0); + } + + // With our inversed 4x4, create box1 in space of box0 + OBB _1in0; + Rotate(M0Inv, _1in0); + + // This should cancel out box0's rotation, i.e. it's now an AABB. + // => Center(0,0,0), Rot(identity) + + // The two boxes are in the same space so now we can compare them. + + // Create the AABB of (box1 in space of box0) + const Matrix3x3& mtx = _1in0.mRot; + + float f = fabsf(mtx.m[0][0] * mExtents.x) + fabsf(mtx.m[1][0] * mExtents.y) + fabsf(mtx.m[2][0] * mExtents.z) - box.mExtents.x; + if(f > _1in0.mCenter.x) return FALSE; + if(-f < _1in0.mCenter.x) return FALSE; + + f = fabsf(mtx.m[0][1] * mExtents.x) + fabsf(mtx.m[1][1] * mExtents.y) + fabsf(mtx.m[2][1] * mExtents.z) - box.mExtents.y; + if(f > _1in0.mCenter.y) return FALSE; + if(-f < _1in0.mCenter.y) return FALSE; + + f = fabsf(mtx.m[0][2] * mExtents.x) + fabsf(mtx.m[1][2] * mExtents.y) + fabsf(mtx.m[2][2] * mExtents.z) - box.mExtents.z; + if(f > _1in0.mCenter.z) return FALSE; + if(-f < _1in0.mCenter.z) return FALSE; + + return TRUE; +} diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceOBB.h b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceOBB.h new file mode 100644 index 00000000..28ad400b --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceOBB.h @@ -0,0 +1,193 @@ +/* + * ICE / OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains OBB-related code. (oriented bounding box) + * \file IceOBB.h + * \author Pierre Terdiman + * \date January, 13, 2000 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef __ICEOBB_H__ +#define __ICEOBB_H__ + + // Forward declarations + class LSS; + + class ICEMATHS_API OBB + { + public: + //! Constructor + inline_ OBB() {} + //! Constructor + inline_ OBB(const Point& center, const Point& extents, const Matrix3x3& rot) : mCenter(center), mExtents(extents), mRot(rot) {} + //! Destructor + inline_ ~OBB() {} + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Setups an empty OBB. + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + void SetEmpty() + { + mCenter.Zero(); + mExtents.Set(MIN_FLOAT, MIN_FLOAT, MIN_FLOAT); + mRot.Identity(); + } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Tests if a point is contained within the OBB. + * \param p [in] the world point to test + * \return true if inside the OBB + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + bool ContainsPoint(const Point& p) const; + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Builds an OBB from an AABB and a world transform. + * \param aabb [in] the aabb + * \param mat [in] the world transform + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + void Create(const AABB& aabb, const Matrix4x4& mat); + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Recomputes the OBB after an arbitrary transform by a 4x4 matrix. + * \param mtx [in] the transform matrix + * \param obb [out] the transformed OBB + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ void Rotate(const Matrix4x4& mtx, OBB& obb) const + { + // The extents remain constant + obb.mExtents = mExtents; + // The center gets x-formed + obb.mCenter = mCenter * mtx; + // Combine rotations + obb.mRot = mRot * Matrix3x3(mtx); + } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Checks the OBB is valid. + * \return true if the box is valid + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ BOOL IsValid() const + { + // Consistency condition for (Center, Extents) boxes: Extents >= 0.0f + if(mExtents.x < 0.0f) return FALSE; + if(mExtents.y < 0.0f) return FALSE; + if(mExtents.z < 0.0f) return FALSE; + return TRUE; + } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Computes the obb planes. + * \param planes [out] 6 box planes + * \return true if success + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + bool ComputePlanes(Plane* planes) const; + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Computes the obb points. + * \param pts [out] 8 box points + * \return true if success + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + bool ComputePoints(Point* pts) const; + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Computes vertex normals. + * \param pts [out] 8 box points + * \return true if success + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + bool ComputeVertexNormals(Point* pts) const; + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Returns edges. + * \return 24 indices (12 edges) indexing the list returned by ComputePoints() + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + const udword* GetEdges() const; + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Returns local edge normals. + * \return edge normals in local space + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + const Point* GetLocalEdgeNormals() const; + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Returns world edge normal + * \param edge_index [in] 0 <= edge index < 12 + * \param world_normal [out] edge normal in world space + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + void ComputeWorldEdgeNormal(udword edge_index, Point& world_normal) const; + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Computes an LSS surrounding the OBB. + * \param lss [out] the LSS + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + void ComputeLSS(LSS& lss) const; + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Checks the OBB is inside another OBB. + * \param box [in] the other OBB + * \return TRUE if we're inside the other box + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + BOOL IsInside(const OBB& box) const; + + inline_ const Point& GetCenter() const { return mCenter; } + inline_ const Point& GetExtents() const { return mExtents; } + inline_ const Matrix3x3& GetRot() const { return mRot; } + + inline_ void GetRotatedExtents(Matrix3x3& extents) const + { + extents = mRot; + extents.Scale(mExtents); + } + + Point mCenter; //!< B for Box + Point mExtents; //!< B for Bounding + Matrix3x3 mRot; //!< O for Oriented + + // Orientation is stored in row-major format, + // i.e. rows = eigen vectors of the covariance matrix + }; + +#endif // __ICEOBB_H__ diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IcePairs.h b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IcePairs.h new file mode 100644 index 00000000..6817c336 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IcePairs.h @@ -0,0 +1,61 @@ +/* + * ICE / OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains a simple pair class. + * \file IcePairs.h + * \author Pierre Terdiman + * \date January, 13, 2003 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef __ICEPAIRS_H__ +#define __ICEPAIRS_H__ + + //! A generic couple structure + struct ICECORE_API Pair + { + inline_ Pair() {} + inline_ Pair(udword i0, udword i1) : id0(i0), id1(i1) {} + + udword id0; //!< First index of the pair + udword id1; //!< Second index of the pair + }; + + class ICECORE_API Pairs : private Container + { + public: + // Constructor / Destructor + Pairs() {} + ~Pairs() {} + + inline_ udword GetNbPairs() const { return GetNbEntries()>>1; } + inline_ const Pair* GetPairs() const { return (const Pair*)GetEntries(); } + inline_ const Pair* GetPair(udword i) const { return (const Pair*)&GetEntries()[i+i]; } + + inline_ BOOL HasPairs() const { return IsNotEmpty(); } + + inline_ void ResetPairs() { Reset(); } + inline_ void DeleteLastPair() { DeleteLastEntry(); DeleteLastEntry(); } + + inline_ void AddPair(const Pair& p) { Add(p.id0).Add(p.id1); } + inline_ void AddPair(udword id0, udword id1) { Add(id0).Add(id1); } + }; + +#endif // __ICEPAIRS_H__ diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IcePlane.cpp b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IcePlane.cpp new file mode 100644 index 00000000..b7fe6523 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IcePlane.cpp @@ -0,0 +1,61 @@ +/* + * ICE / OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code for planes. + * \file IcePlane.cpp + * \author Pierre Terdiman + * \date April, 4, 2000 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Plane class. + * \class Plane + * \author Pierre Terdiman + * \version 1.0 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Precompiled Header +#include "Stdafx.h" + +using namespace Opcode; + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Computes the plane equation from 3 points. + * \param p0 [in] first point + * \param p1 [in] second point + * \param p2 [in] third point + * \return Self-reference + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +Plane& Plane::Set(const Point& p0, const Point& p1, const Point& p2) +{ + Point Edge0 = p1 - p0; + Point Edge1 = p2 - p0; + + n = Edge0 ^ Edge1; + n.Normalize(); + + d = -(p0 | n); + + return *this; +} diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IcePlane.h b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IcePlane.h new file mode 100644 index 00000000..1f3669bd --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IcePlane.h @@ -0,0 +1,129 @@ +/* + * ICE / OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code for planes. + * \file IcePlane.h + * \author Pierre Terdiman + * \date April, 4, 2000 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef __ICEPLANE_H__ +#define __ICEPLANE_H__ + + #define PLANE_EPSILON (1.0e-7f) + + class ICEMATHS_API Plane + { + public: + //! Constructor + inline_ Plane() { } + //! Constructor from a normal and a distance + inline_ Plane(float nx, float ny, float nz, float d) { Set(nx, ny, nz, d); } + //! Constructor from a point on the plane and a normal + inline_ Plane(const Point& p, const Point& n) { Set(p, n); } + //! Constructor from three points + inline_ Plane(const Point& p0, const Point& p1, const Point& p2) { Set(p0, p1, p2); } + //! Constructor from a normal and a distance + inline_ Plane(const Point& _n, float _d) { n = _n; d = _d; } + //! Copy constructor + inline_ Plane(const Plane& plane) : n(plane.n), d(plane.d) { } + //! Destructor + inline_ ~Plane() { } + + inline_ Plane& Zero() { n.Zero(); d = 0.0f; return *this; } + inline_ Plane& Set(float nx, float ny, float nz, float _d) { n.Set(nx, ny, nz); d = _d; return *this; } + inline_ Plane& Set(const Point& p, const Point& _n) { n = _n; d = - p | _n; return *this; } + Plane& Set(const Point& p0, const Point& p1, const Point& p2); + + inline_ float Distance(const Point& p) const { return (p | n) + d; } + inline_ bool Belongs(const Point& p) const { return fabsf(Distance(p)) < PLANE_EPSILON; } + + inline_ void Normalize() + { + float Denom = 1.0f / n.Magnitude(); + n.x *= Denom; + n.y *= Denom; + n.z *= Denom; + d *= Denom; + } + public: + // Members + Point n; //!< The normal to the plane + float d; //!< The distance from the origin + + // Cast operators + inline_ operator Point() const { return n; } + inline_ operator HPoint() const { return HPoint(n, d); } + + // Arithmetic operators + inline_ Plane operator*(const Matrix4x4& m) const + { + // Old code from Irion. Kept for reference. + Plane Ret(*this); + return Ret *= m; + } + + inline_ Plane& operator*=(const Matrix4x4& m) + { + // Old code from Irion. Kept for reference. + Point n2 = HPoint(n, 0.0f) * m; + d = -((Point) (HPoint( -d*n, 1.0f ) * m) | n2); + n = n2; + return *this; + } + }; + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Transforms a plane by a 4x4 matrix. Same as Plane * Matrix4x4 operator, but faster. + * \param transformed [out] transformed plane + * \param plane [in] source plane + * \param transform [in] transform matrix + * \warning the plane normal must be unit-length + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ void TransformPlane(Plane& transformed, const Plane& plane, const Matrix4x4& transform) + { + // Rotate the normal using the rotation part of the 4x4 matrix + transformed.n = plane.n * Matrix3x3(transform); + + // Compute new d + transformed.d = plane.d - (Point(transform.GetTrans())|transformed.n); + } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Transforms a plane by a 4x4 matrix. Same as Plane * Matrix4x4 operator, but faster. + * \param plane [in/out] source plane (transformed on return) + * \param transform [in] transform matrix + * \warning the plane normal must be unit-length + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ void TransformPlane(Plane& plane, const Matrix4x4& transform) + { + // Rotate the normal using the rotation part of the 4x4 matrix + plane.n *= Matrix3x3(transform); + + // Compute new d + plane.d -= Point(transform.GetTrans())|plane.n; + } + +#endif // __ICEPLANE_H__ diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IcePoint.cpp b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IcePoint.cpp new file mode 100644 index 00000000..5fcbd523 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IcePoint.cpp @@ -0,0 +1,209 @@ +/* + * ICE / OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code for 3D vectors. + * \file IcePoint.cpp + * \author Pierre Terdiman + * \date April, 4, 2000 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * 3D point. + * + * The name is "Point" instead of "Vector" since a vector is N-dimensional, whereas a point is an implicit "vector of dimension 3". + * So the choice was between "Point" and "Vector3", the first one looked better (IMHO). + * + * Some people, then, use a typedef to handle both points & vectors using the same class: typedef Point Vector3; + * This is bad since it opens the door to a lot of confusion while reading the code. I know it may sounds weird but check this out: + * + * \code + * Point P0,P1 = some 3D points; + * Point Delta = P1 - P0; + * \endcode + * + * This compiles fine, although you should have written: + * + * \code + * Point P0,P1 = some 3D points; + * Vector3 Delta = P1 - P0; + * \endcode + * + * Subtle things like this are not caught at compile-time, and when you find one in the code, you never know whether it's a mistake + * from the author or something you don't get. + * + * One way to handle it at compile-time would be to use different classes for Point & Vector3, only overloading operator "-" for vectors. + * But then, you get a lot of redundant code in thoses classes, and basically it's really a lot of useless work. + * + * Another way would be to use homogeneous points: w=1 for points, w=0 for vectors. That's why the HPoint class exists. Now, to store + * your model's vertices and in most cases, you really want to use Points to save ram. + * + * \class Point + * \author Pierre Terdiman + * \version 1.0 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Precompiled Header +#include "Stdafx.h" + +using namespace Opcode; + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Creates a positive unit random vector. + * \return Self-reference + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +Point& Point::PositiveUnitRandomVector() +{ + x = UnitRandomFloat(); + y = UnitRandomFloat(); + z = UnitRandomFloat(); + Normalize(); + return *this; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Creates a unit random vector. + * \return Self-reference + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +Point& Point::UnitRandomVector() +{ + x = UnitRandomFloat() - 0.5f; + y = UnitRandomFloat() - 0.5f; + z = UnitRandomFloat() - 0.5f; + Normalize(); + return *this; +} + +// Cast operator +// WARNING: not inlined +Point::operator HPoint() const { return HPoint(x, y, z, 0.0f); } + +Point& Point::Refract(const Point& eye, const Point& n, float refractindex, Point& refracted) +{ + // Point EyePt = eye position + // Point p = current vertex + // Point n = vertex normal + // Point rv = refracted vector + // Eye vector - doesn't need to be normalized + Point Env; + Env.x = eye.x - x; + Env.y = eye.y - y; + Env.z = eye.z - z; + + float NDotE = n|Env; + float NDotN = n|n; + NDotE /= refractindex; + + // Refracted vector + refracted = n*NDotE - Env*NDotN; + + return *this; +} + +Point& Point::ProjectToPlane(const Plane& p) +{ + *this-= (p.d + (*this|p.n))*p.n; + return *this; +} + +void Point::ProjectToScreen(float halfrenderwidth, float halfrenderheight, const Matrix4x4& mat, HPoint& projected) const +{ + projected = HPoint(x, y, z, 1.0f) * mat; + projected.w = 1.0f / projected.w; + + projected.x*=projected.w; + projected.y*=projected.w; + projected.z*=projected.w; + + projected.x *= halfrenderwidth; projected.x += halfrenderwidth; + projected.y *= -halfrenderheight; projected.y += halfrenderheight; +} + +void Point::SetNotUsed() +{ + // We use a particular integer pattern : 0xffffffff everywhere. This is a NAN. + IR(x) = 0xffffffff; + IR(y) = 0xffffffff; + IR(z) = 0xffffffff; +} + +BOOL Point::IsNotUsed() const +{ + if(IR(x)!=0xffffffff) return FALSE; + if(IR(y)!=0xffffffff) return FALSE; + if(IR(z)!=0xffffffff) return FALSE; + return TRUE; +} + +Point& Point::Mult(const Matrix3x3& mat, const Point& a) +{ + x = a.x * mat.m[0][0] + a.y * mat.m[0][1] + a.z * mat.m[0][2]; + y = a.x * mat.m[1][0] + a.y * mat.m[1][1] + a.z * mat.m[1][2]; + z = a.x * mat.m[2][0] + a.y * mat.m[2][1] + a.z * mat.m[2][2]; + return *this; +} + +Point& Point::Mult2(const Matrix3x3& mat1, const Point& a1, const Matrix3x3& mat2, const Point& a2) +{ + x = a1.x * mat1.m[0][0] + a1.y * mat1.m[0][1] + a1.z * mat1.m[0][2] + a2.x * mat2.m[0][0] + a2.y * mat2.m[0][1] + a2.z * mat2.m[0][2]; + y = a1.x * mat1.m[1][0] + a1.y * mat1.m[1][1] + a1.z * mat1.m[1][2] + a2.x * mat2.m[1][0] + a2.y * mat2.m[1][1] + a2.z * mat2.m[1][2]; + z = a1.x * mat1.m[2][0] + a1.y * mat1.m[2][1] + a1.z * mat1.m[2][2] + a2.x * mat2.m[2][0] + a2.y * mat2.m[2][1] + a2.z * mat2.m[2][2]; + return *this; +} + +Point& Point::Mac(const Matrix3x3& mat, const Point& a) +{ + x += a.x * mat.m[0][0] + a.y * mat.m[0][1] + a.z * mat.m[0][2]; + y += a.x * mat.m[1][0] + a.y * mat.m[1][1] + a.z * mat.m[1][2]; + z += a.x * mat.m[2][0] + a.y * mat.m[2][1] + a.z * mat.m[2][2]; + return *this; +} + +Point& Point::TransMult(const Matrix3x3& mat, const Point& a) +{ + x = a.x * mat.m[0][0] + a.y * mat.m[1][0] + a.z * mat.m[2][0]; + y = a.x * mat.m[0][1] + a.y * mat.m[1][1] + a.z * mat.m[2][1]; + z = a.x * mat.m[0][2] + a.y * mat.m[1][2] + a.z * mat.m[2][2]; + return *this; +} + +Point& Point::Transform(const Point& r, const Matrix3x3& rotpos, const Point& linpos) +{ + x = r.x * rotpos.m[0][0] + r.y * rotpos.m[0][1] + r.z * rotpos.m[0][2] + linpos.x; + y = r.x * rotpos.m[1][0] + r.y * rotpos.m[1][1] + r.z * rotpos.m[1][2] + linpos.y; + z = r.x * rotpos.m[2][0] + r.y * rotpos.m[2][1] + r.z * rotpos.m[2][2] + linpos.z; + return *this; +} + +Point& Point::InvTransform(const Point& r, const Matrix3x3& rotpos, const Point& linpos) +{ + float sx = r.x - linpos.x; + float sy = r.y - linpos.y; + float sz = r.z - linpos.z; + x = sx * rotpos.m[0][0] + sy * rotpos.m[1][0] + sz * rotpos.m[2][0]; + y = sx * rotpos.m[0][1] + sy * rotpos.m[1][1] + sz * rotpos.m[2][1]; + z = sx * rotpos.m[0][2] + sy * rotpos.m[1][2] + sz * rotpos.m[2][2]; + return *this; +} diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IcePoint.h b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IcePoint.h new file mode 100644 index 00000000..a5b372b5 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IcePoint.h @@ -0,0 +1,544 @@ +/* + * ICE / OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code for 3D vectors. + * \file IcePoint.h + * \author Pierre Terdiman + * \date April, 4, 2000 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef __ICEPOINT_H__ +#define __ICEPOINT_H__ + + // Forward declarations + class HPoint; + class Plane; + class Matrix3x3; + class Matrix4x4; + + #define CROSS2D(a, b) (a.x*b.y - b.x*a.y) + + const float EPSILON2 = 1.0e-20f; + + class ICEMATHS_API Point + { + public: + + //! Empty constructor + inline_ Point() {} + //! Constructor from a single float +// inline_ Point(float val) : x(val), y(val), z(val) {} +// Removed since it introduced the nasty "Point T = *Matrix4x4.GetTrans();" bug....... + //! Constructor from floats + inline_ Point(float _x, float _y, float _z) : x(_x), y(_y), z(_z) {} + //! Constructor from array + inline_ Point(const float f[3]) : x(f[_X]), y(f[_Y]), z(f[_Z]) {} + //! Copy constructor + inline_ Point(const Point& p) : x(p.x), y(p.y), z(p.z) {} + //! Destructor + inline_ ~Point() {} + + //! Clears the vector + inline_ Point& Zero() { x = y = z = 0.0f; return *this; } + + //! + infinity + inline_ Point& SetPlusInfinity() { x = y = z = MAX_FLOAT; return *this; } + //! - infinity + inline_ Point& SetMinusInfinity() { x = y = z = MIN_FLOAT; return *this; } + + //! Sets positive unit random vector + Point& PositiveUnitRandomVector(); + //! Sets unit random vector + Point& UnitRandomVector(); + + //! Assignment from values + inline_ Point& Set(float _x, float _y, float _z) { x = _x; y = _y; z = _z; return *this; } + //! Assignment from array + inline_ Point& Set(const float f[3]) { x = f[_X]; y = f[_Y]; z = f[_Z]; return *this; } + //! Assignment from another point + inline_ Point& Set(const Point& src) { x = src.x; y = src.y; z = src.z; return *this; } + + //! Adds a vector + inline_ Point& Add(const Point& p) { x += p.x; y += p.y; z += p.z; return *this; } + //! Adds a vector + inline_ Point& Add(float _x, float _y, float _z) { x += _x; y += _y; z += _z; return *this; } + //! Adds a vector + inline_ Point& Add(const float f[3]) { x += f[_X]; y += f[_Y]; z += f[_Z]; return *this; } + //! Adds vectors + inline_ Point& Add(const Point& p, const Point& q) { x = p.x+q.x; y = p.y+q.y; z = p.z+q.z; return *this; } + + //! Subtracts a vector + inline_ Point& Sub(const Point& p) { x -= p.x; y -= p.y; z -= p.z; return *this; } + //! Subtracts a vector + inline_ Point& Sub(float _x, float _y, float _z) { x -= _x; y -= _y; z -= _z; return *this; } + //! Subtracts a vector + inline_ Point& Sub(const float f[3]) { x -= f[_X]; y -= f[_Y]; z -= f[_Z]; return *this; } + //! Subtracts vectors + inline_ Point& Sub(const Point& p, const Point& q) { x = p.x-q.x; y = p.y-q.y; z = p.z-q.z; return *this; } + + //! this = -this + inline_ Point& Neg() { x = -x; y = -y; z = -z; return *this; } + //! this = -a + inline_ Point& Neg(const Point& a) { x = -a.x; y = -a.y; z = -a.z; return *this; } + + //! Multiplies by a scalar + inline_ Point& Mult(float s) { x *= s; y *= s; z *= s; return *this; } + + //! this = a * scalar + inline_ Point& Mult(const Point& a, float scalar) + { + x = a.x * scalar; + y = a.y * scalar; + z = a.z * scalar; + return *this; + } + + //! this = a + b * scalar + inline_ Point& Mac(const Point& a, const Point& b, float scalar) + { + x = a.x + b.x * scalar; + y = a.y + b.y * scalar; + z = a.z + b.z * scalar; + return *this; + } + + //! this = this + a * scalar + inline_ Point& Mac(const Point& a, float scalar) + { + x += a.x * scalar; + y += a.y * scalar; + z += a.z * scalar; + return *this; + } + + //! this = a - b * scalar + inline_ Point& Msc(const Point& a, const Point& b, float scalar) + { + x = a.x - b.x * scalar; + y = a.y - b.y * scalar; + z = a.z - b.z * scalar; + return *this; + } + + //! this = this - a * scalar + inline_ Point& Msc(const Point& a, float scalar) + { + x -= a.x * scalar; + y -= a.y * scalar; + z -= a.z * scalar; + return *this; + } + + //! this = a + b * scalarb + c * scalarc + inline_ Point& Mac2(const Point& a, const Point& b, float scalarb, const Point& c, float scalarc) + { + x = a.x + b.x * scalarb + c.x * scalarc; + y = a.y + b.y * scalarb + c.y * scalarc; + z = a.z + b.z * scalarb + c.z * scalarc; + return *this; + } + + //! this = a - b * scalarb - c * scalarc + inline_ Point& Msc2(const Point& a, const Point& b, float scalarb, const Point& c, float scalarc) + { + x = a.x - b.x * scalarb - c.x * scalarc; + y = a.y - b.y * scalarb - c.y * scalarc; + z = a.z - b.z * scalarb - c.z * scalarc; + return *this; + } + + //! this = mat * a + inline_ Point& Mult(const Matrix3x3& mat, const Point& a); + + //! this = mat1 * a1 + mat2 * a2 + inline_ Point& Mult2(const Matrix3x3& mat1, const Point& a1, const Matrix3x3& mat2, const Point& a2); + + //! this = this + mat * a + inline_ Point& Mac(const Matrix3x3& mat, const Point& a); + + //! this = transpose(mat) * a + inline_ Point& TransMult(const Matrix3x3& mat, const Point& a); + + //! Linear interpolate between two vectors: this = a + t * (b - a) + inline_ Point& Lerp(const Point& a, const Point& b, float t) + { + x = a.x + t * (b.x - a.x); + y = a.y + t * (b.y - a.y); + z = a.z + t * (b.z - a.z); + return *this; + } + + //! Hermite interpolate between p1 and p2. p0 and p3 are used for finding gradient at p1 and p2. + //! this = p0 * (2t^2 - t^3 - t)/2 + //! + p1 * (3t^3 - 5t^2 + 2)/2 + //! + p2 * (4t^2 - 3t^3 + t)/2 + //! + p3 * (t^3 - t^2)/2 + inline_ Point& Herp(const Point& p0, const Point& p1, const Point& p2, const Point& p3, float t) + { + float t2 = t * t; + float t3 = t2 * t; + float kp0 = (2.0f * t2 - t3 - t) * 0.5f; + float kp1 = (3.0f * t3 - 5.0f * t2 + 2.0f) * 0.5f; + float kp2 = (4.0f * t2 - 3.0f * t3 + t) * 0.5f; + float kp3 = (t3 - t2) * 0.5f; + x = p0.x * kp0 + p1.x * kp1 + p2.x * kp2 + p3.x * kp3; + y = p0.y * kp0 + p1.y * kp1 + p2.y * kp2 + p3.y * kp3; + z = p0.z * kp0 + p1.z * kp1 + p2.z * kp2 + p3.z * kp3; + return *this; + } + + //! this = rotpos * r + linpos + inline_ Point& Transform(const Point& r, const Matrix3x3& rotpos, const Point& linpos); + + //! this = trans(rotpos) * (r - linpos) + inline_ Point& InvTransform(const Point& r, const Matrix3x3& rotpos, const Point& linpos); + + //! Returns MIN(x, y, z); + inline_ float Min() const { return MIN(x, MIN(y, z)); } + //! Returns MAX(x, y, z); + inline_ float Max() const { return MAX(x, MAX(y, z)); } + //! Sets each element to be componentwise minimum + inline_ Point& Min(const Point& p) { x = MIN(x, p.x); y = MIN(y, p.y); z = MIN(z, p.z); return *this; } + //! Sets each element to be componentwise maximum + inline_ Point& Max(const Point& p) { x = MAX(x, p.x); y = MAX(y, p.y); z = MAX(z, p.z); return *this; } + + //! Clamps each element + inline_ Point& Clamp(float min, float max) + { + if(xmax) x=max; + if(ymax) y=max; + if(zmax) z=max; + return *this; + } + + //! Computes square magnitude + inline_ float SquareMagnitude() const { return x*x + y*y + z*z; } + //! Computes magnitude + inline_ float Magnitude() const { return sqrtf(x*x + y*y + z*z); } + //! Computes volume + inline_ float Volume() const { return x * y * z; } + + //! Checks the point is near zero + inline_ bool ApproxZero() const { return SquareMagnitude() < EPSILON2; } + + //! Tests for exact zero vector + inline_ BOOL IsZero() const + { + if(IR(x) || IR(y) || IR(z)) return FALSE; + return TRUE; + } + + //! Checks point validity + inline_ BOOL IsValid() const + { + if(!IsValidFloat(x)) return FALSE; + if(!IsValidFloat(y)) return FALSE; + if(!IsValidFloat(z)) return FALSE; + return TRUE; + } + + //! Slighty moves the point + void Tweak(udword coord_mask, udword tweak_mask) + { + if(coord_mask&1) { udword Dummy = IR(x); Dummy^=tweak_mask; x = FR(Dummy); } + if(coord_mask&2) { udword Dummy = IR(y); Dummy^=tweak_mask; y = FR(Dummy); } + if(coord_mask&4) { udword Dummy = IR(z); Dummy^=tweak_mask; z = FR(Dummy); } + } + + #define TWEAKMASK 0x3fffff + #define TWEAKNOTMASK ~TWEAKMASK + //! Slighty moves the point out + inline_ void TweakBigger() + { + udword Dummy = (IR(x)&TWEAKNOTMASK); if(!IS_NEGATIVE_FLOAT(x)) Dummy+=TWEAKMASK+1; x = FR(Dummy); + Dummy = (IR(y)&TWEAKNOTMASK); if(!IS_NEGATIVE_FLOAT(y)) Dummy+=TWEAKMASK+1; y = FR(Dummy); + Dummy = (IR(z)&TWEAKNOTMASK); if(!IS_NEGATIVE_FLOAT(z)) Dummy+=TWEAKMASK+1; z = FR(Dummy); + } + + //! Slighty moves the point in + inline_ void TweakSmaller() + { + udword Dummy = (IR(x)&TWEAKNOTMASK); if(IS_NEGATIVE_FLOAT(x)) Dummy+=TWEAKMASK+1; x = FR(Dummy); + Dummy = (IR(y)&TWEAKNOTMASK); if(IS_NEGATIVE_FLOAT(y)) Dummy+=TWEAKMASK+1; y = FR(Dummy); + Dummy = (IR(z)&TWEAKNOTMASK); if(IS_NEGATIVE_FLOAT(z)) Dummy+=TWEAKMASK+1; z = FR(Dummy); + } + + //! Normalizes the vector + inline_ Point& Normalize() + { + float M = x*x + y*y + z*z; + if(M) + { + M = 1.0f / sqrtf(M); + x *= M; + y *= M; + z *= M; + } + return *this; + } + + //! Sets vector length + inline_ Point& SetLength(float length) + { + float NewLength = length / Magnitude(); + x *= NewLength; + y *= NewLength; + z *= NewLength; + return *this; + } + + //! Clamps vector length + inline_ Point& ClampLength(float limit_length) + { + if(limit_length>=0.0f) // Magnitude must be positive + { + float CurrentSquareLength = SquareMagnitude(); + + if(CurrentSquareLength > limit_length * limit_length) + { + float Coeff = limit_length / sqrtf(CurrentSquareLength); + x *= Coeff; + y *= Coeff; + z *= Coeff; + } + } + return *this; + } + + //! Computes distance to another point + inline_ float Distance(const Point& b) const + { + return sqrtf((x - b.x)*(x - b.x) + (y - b.y)*(y - b.y) + (z - b.z)*(z - b.z)); + } + + //! Computes square distance to another point + inline_ float SquareDistance(const Point& b) const + { + return ((x - b.x)*(x - b.x) + (y - b.y)*(y - b.y) + (z - b.z)*(z - b.z)); + } + + //! Dot product dp = this|a + inline_ float Dot(const Point& p) const { return p.x * x + p.y * y + p.z * z; } + + //! Cross product this = a x b + inline_ Point& Cross(const Point& a, const Point& b) + { + x = a.y * b.z - a.z * b.y; + y = a.z * b.x - a.x * b.z; + z = a.x * b.y - a.y * b.x; + return *this; + } + + //! Vector code ( bitmask = sign(z) | sign(y) | sign(x) ) + inline_ udword VectorCode() const + { + return (IR(x)>>31) | ((IR(y)&SIGN_BITMASK)>>30) | ((IR(z)&SIGN_BITMASK)>>29); + } + + //! Returns largest axis + inline_ PointComponent LargestAxis() const + { + const float* Vals = &x; + PointComponent m = _X; + if(Vals[_Y] > Vals[m]) m = _Y; + if(Vals[_Z] > Vals[m]) m = _Z; + return m; + } + + //! Returns closest axis + inline_ PointComponent ClosestAxis() const + { + const float* Vals = &x; + PointComponent m = _X; + if(AIR(Vals[_Y]) > AIR(Vals[m])) m = _Y; + if(AIR(Vals[_Z]) > AIR(Vals[m])) m = _Z; + return m; + } + + //! Returns smallest axis + inline_ PointComponent SmallestAxis() const + { + const float* Vals = &x; + PointComponent m = _X; + if(Vals[_Y] < Vals[m]) m = _Y; + if(Vals[_Z] < Vals[m]) m = _Z; + return m; + } + + //! Refracts the point + Point& Refract(const Point& eye, const Point& n, float refractindex, Point& refracted); + + //! Projects the point onto a plane + Point& ProjectToPlane(const Plane& p); + + //! Projects the point onto the screen + void ProjectToScreen(float halfrenderwidth, float halfrenderheight, const Matrix4x4& mat, HPoint& projected) const; + + //! Unfolds the point onto a plane according to edge(a,b) + Point& Unfold(Plane& p, Point& a, Point& b); + + //! Hash function from Ville Miettinen + inline_ udword GetHashValue() const + { + const udword* h = (const udword*)(this); + udword f = (h[0]+h[1]*11-(h[2]*17)) & 0x7fffffff; // avoid problems with +-0 + return (f>>22)^(f>>12)^(f); + } + + //! Stuff magic values in the point, marking it as explicitely not used. + void SetNotUsed(); + //! Checks the point is marked as not used + BOOL IsNotUsed() const; + + // Arithmetic operators + + //! Unary operator for Point Negate = - Point + inline_ Point operator-() const { return Point(-x, -y, -z); } + + //! Operator for Point Plus = Point + Point. + inline_ Point operator+(const Point& p) const { return Point(x + p.x, y + p.y, z + p.z); } + //! Operator for Point Minus = Point - Point. + inline_ Point operator-(const Point& p) const { return Point(x - p.x, y - p.y, z - p.z); } + + //! Operator for Point Mul = Point * Point. + inline_ Point operator*(const Point& p) const { return Point(x * p.x, y * p.y, z * p.z); } + //! Operator for Point Scale = Point * float. + inline_ Point operator*(float s) const { return Point(x * s, y * s, z * s ); } + //! Operator for Point Scale = float * Point. + inline_ friend Point operator*(float s, const Point& p) { return Point(s * p.x, s * p.y, s * p.z); } + + //! Operator for Point Div = Point / Point. + inline_ Point operator/(const Point& p) const { return Point(x / p.x, y / p.y, z / p.z); } + //! Operator for Point Scale = Point / float. + inline_ Point operator/(float s) const { s = 1.0f / s; return Point(x * s, y * s, z * s); } + //! Operator for Point Scale = float / Point. + inline_ friend Point operator/(float s, const Point& p) { return Point(s / p.x, s / p.y, s / p.z); } + + //! Operator for float DotProd = Point | Point. + inline_ float operator|(const Point& p) const { return x*p.x + y*p.y + z*p.z; } + //! Operator for Point VecProd = Point ^ Point. + inline_ Point operator^(const Point& p) const + { + return Point( + y * p.z - z * p.y, + z * p.x - x * p.z, + x * p.y - y * p.x ); + } + + //! Operator for Point += Point. + inline_ Point& operator+=(const Point& p) { x += p.x; y += p.y; z += p.z; return *this; } + //! Operator for Point += float. + inline_ Point& operator+=(float s) { x += s; y += s; z += s; return *this; } + + //! Operator for Point -= Point. + inline_ Point& operator-=(const Point& p) { x -= p.x; y -= p.y; z -= p.z; return *this; } + //! Operator for Point -= float. + inline_ Point& operator-=(float s) { x -= s; y -= s; z -= s; return *this; } + + //! Operator for Point *= Point. + inline_ Point& operator*=(const Point& p) { x *= p.x; y *= p.y; z *= p.z; return *this; } + //! Operator for Point *= float. + inline_ Point& operator*=(float s) { x *= s; y *= s; z *= s; return *this; } + + //! Operator for Point /= Point. + inline_ Point& operator/=(const Point& p) { x /= p.x; y /= p.y; z /= p.z; return *this; } + //! Operator for Point /= float. + inline_ Point& operator/=(float s) { s = 1.0f/s; x *= s; y *= s; z *= s; return *this; } + + // Logical operators + + //! Operator for "if(Point==Point)" + inline_ bool operator==(const Point& p) const { return ( (IR(x)==IR(p.x))&&(IR(y)==IR(p.y))&&(IR(z)==IR(p.z))); } + //! Operator for "if(Point!=Point)" + inline_ bool operator!=(const Point& p) const { return ( (IR(x)!=IR(p.x))||(IR(y)!=IR(p.y))||(IR(z)!=IR(p.z))); } + + // Arithmetic operators + + //! Operator for Point Mul = Point * Matrix3x3. + inline_ Point operator*(const Matrix3x3& mat) const + { + class ShadowMatrix3x3{ public: float m[3][3]; }; // To allow inlining + const ShadowMatrix3x3* Mat = (const ShadowMatrix3x3*)&mat; + + return Point( + x * Mat->m[0][0] + y * Mat->m[1][0] + z * Mat->m[2][0], + x * Mat->m[0][1] + y * Mat->m[1][1] + z * Mat->m[2][1], + x * Mat->m[0][2] + y * Mat->m[1][2] + z * Mat->m[2][2] ); + } + + //! Operator for Point Mul = Point * Matrix4x4. + inline_ Point operator*(const Matrix4x4& mat) const + { + class ShadowMatrix4x4{ public: float m[4][4]; }; // To allow inlining + const ShadowMatrix4x4* Mat = (const ShadowMatrix4x4*)&mat; + + return Point( + x * Mat->m[0][0] + y * Mat->m[1][0] + z * Mat->m[2][0] + Mat->m[3][0], + x * Mat->m[0][1] + y * Mat->m[1][1] + z * Mat->m[2][1] + Mat->m[3][1], + x * Mat->m[0][2] + y * Mat->m[1][2] + z * Mat->m[2][2] + Mat->m[3][2]); + } + + //! Operator for Point *= Matrix3x3. + inline_ Point& operator*=(const Matrix3x3& mat) + { + class ShadowMatrix3x3{ public: float m[3][3]; }; // To allow inlining + const ShadowMatrix3x3* Mat = (const ShadowMatrix3x3*)&mat; + + float xp = x * Mat->m[0][0] + y * Mat->m[1][0] + z * Mat->m[2][0]; + float yp = x * Mat->m[0][1] + y * Mat->m[1][1] + z * Mat->m[2][1]; + float zp = x * Mat->m[0][2] + y * Mat->m[1][2] + z * Mat->m[2][2]; + + x = xp; y = yp; z = zp; + + return *this; + } + + //! Operator for Point *= Matrix4x4. + inline_ Point& operator*=(const Matrix4x4& mat) + { + class ShadowMatrix4x4{ public: float m[4][4]; }; // To allow inlining + const ShadowMatrix4x4* Mat = (const ShadowMatrix4x4*)&mat; + + float xp = x * Mat->m[0][0] + y * Mat->m[1][0] + z * Mat->m[2][0] + Mat->m[3][0]; + float yp = x * Mat->m[0][1] + y * Mat->m[1][1] + z * Mat->m[2][1] + Mat->m[3][1]; + float zp = x * Mat->m[0][2] + y * Mat->m[1][2] + z * Mat->m[2][2] + Mat->m[3][2]; + + x = xp; y = yp; z = zp; + + return *this; + } + + // Cast operators + + //! Cast a Point to a HPoint. w is set to zero. + operator HPoint() const; + + inline_ operator const float*() const { return &x; } + inline_ operator float*() { return &x; } + + public: + float x, y, z; + }; + + FUNCTION ICEMATHS_API void Normalize1(Point& a); + FUNCTION ICEMATHS_API void Normalize2(Point& a); + +#endif //__ICEPOINT_H__ diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IcePreprocessor.h b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IcePreprocessor.h new file mode 100644 index 00000000..f02501ab --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IcePreprocessor.h @@ -0,0 +1,158 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains preprocessor stuff. This should be the first included header. + * \file IcePreprocessor.h + * \author Pierre Terdiman + * \date April, 4, 2000 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef ICEPREPROCESSOR_H +#define ICEPREPROCESSOR_H + + // Check platform + #if defined( _WIN32 ) || defined( WIN32 ) + #pragma message("Compiling on Windows...") + #define PLATFORM_WINDOWS + #else + #pragma message("Compiling on unknown platform...") + #endif + + // Check compiler + #if defined(_MSC_VER) + #pragma message("Compiling with VC++...") + #define COMPILER_VISUAL_CPP + + #if _MSC_VER > 1300 + #pragma message("Compiling with VC7") + #define COMPILER_VC7 + #else + #pragma message("Compiling with VC6") + #define COMPILER_VC6 + #endif + #else + #pragma message("Compiling with unknown compiler...") + #endif + + // Check compiler options. If this file is included in user-apps, this + // shouldn't be needed, so that they can use what they like best. + #ifndef ICE_DONT_CHECK_COMPILER_OPTIONS + #ifdef COMPILER_VISUAL_CPP + #if defined(_CHAR_UNSIGNED) + #endif + + #if defined(_CPPRTTI) + #error Please disable RTTI... + #endif + + #if defined(_CPPUNWIND) + #error Please disable exceptions... + #endif + + #if defined(_MT) + // Multithreading + #endif + #endif + #endif + + // Check debug mode + #ifdef DEBUG // May be defined instead of _DEBUG. Let's fix it. + #ifndef _DEBUG + #define _DEBUG + #endif + #endif + + #ifdef _DEBUG + // Here you may define items for debug builds + #endif + + #ifndef THIS_FILE + #define THIS_FILE __FILE__ + #endif + + #ifndef ICE_NO_DLL + #ifdef ICECORE_EXPORTS + #define ICECORE_API __declspec(dllexport) + #else + #define ICECORE_API __declspec(dllimport) + #endif + #else + #define ICECORE_API + #endif + + #define FUNCTION extern "C" + + // Cosmetic stuff [mainly useful with multiple inheritance] + #define override(base_class) virtual + + // Our own inline keyword, so that: + // - we can switch to __forceinline to check it's really better or not + // - we can remove __forceinline if the compiler doesn't support it +// #define inline_ __forceinline +// #define inline_ inline + + // Contributed by Bruce Mitchener + #if defined(COMPILER_VISUAL_CPP) + #define inline_ __forceinline +// #define inline_ inline + #elif defined(__GNUC__) && __GNUC__ < 3 + #define inline_ inline + #elif defined(__GNUC__) + #define inline_ inline __attribute__ ((always_inline)) + #else + #define inline_ inline + #endif + + // Down the hatch + #pragma inline_depth( 255 ) + + #ifdef COMPILER_VISUAL_CPP + #pragma intrinsic(memcmp) + #pragma intrinsic(memcpy) + #pragma intrinsic(memset) + #pragma intrinsic(strcat) + #pragma intrinsic(strcmp) + #pragma intrinsic(strcpy) + #pragma intrinsic(strlen) + #pragma intrinsic(abs) + #pragma intrinsic(labs) + #endif + + // ANSI compliance + #ifdef _DEBUG + // Remove painful warning in debug + inline_ bool ReturnsFalse(){ return false; } + #define for if(ReturnsFalse()){} else for + #else + #define for if(0){} else for + #endif + + // Don't override new/delete + #define DEFAULT_NEWDELETE + #define DONT_TRACK_MEMORY_LEAKS + + //! Macro used to give me a clue when it crashes in release and only the assembly is available + #define INCLUDE_GUARDIANS + #ifdef INCLUDE_GUARDIANS + #define GUARD(x) \ + { \ + static const char guard_text[] = x; \ + _asm push eax \ + _asm nop \ + _asm nop \ + _asm nop \ + _asm nop \ + _asm lea eax, guard_text \ + _asm nop \ + _asm nop \ + _asm nop \ + _asm nop \ + _asm pop eax \ + } + #else + #define GUARD(x) + #endif + +#endif // ICEPREPROCESSOR_H diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceRandom.cpp b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceRandom.cpp new file mode 100644 index 00000000..93bdd133 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceRandom.cpp @@ -0,0 +1,52 @@ +/* + * ICE / OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code for random generators. + * \file IceRandom.cpp + * \author Pierre Terdiman + * \date August, 9, 2001 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Precompiled Header +#include "Stdafx.h" + +using namespace Opcode; + +void IceCore:: SRand(udword seed) +{ + srand(seed); +} + +udword IceCore::Rand() +{ + return rand(); +} + + +static BasicRandom gRandomGenerator(42); + +udword IceCore::GetRandomIndex(udword max_index) +{ + // We don't use rand() since it's limited to RAND_MAX + udword Index = gRandomGenerator.Randomize(); + return Index % max_index; +} + + diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceRandom.h b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceRandom.h new file mode 100644 index 00000000..67c3a9b7 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceRandom.h @@ -0,0 +1,58 @@ +/* + * ICE / OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code for random generators. + * \file IceRandom.h + * \author Pierre Terdiman + * \date August, 9, 2001 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef __ICERANDOM_H__ +#define __ICERANDOM_H__ + + FUNCTION ICECORE_API void SRand(udword seed); + FUNCTION ICECORE_API udword Rand(); + + //! Returns a unit random floating-point value + inline_ float UnitRandomFloat() { return float(Rand()) * ONE_OVER_RAND_MAX; } + + //! Returns a random index so that 0<= index < max_index + ICECORE_API udword GetRandomIndex(udword max_index); + + class ICECORE_API BasicRandom + { + public: + + //! Constructor + inline_ BasicRandom(udword seed=0) : mRnd(seed) {} + //! Destructor + inline_ ~BasicRandom() {} + + inline_ void SetSeed(udword seed) { mRnd = seed; } + inline_ udword GetCurrentValue() const { return mRnd; } + inline_ udword Randomize() { mRnd = mRnd * 2147001325 + 715136305; return mRnd; } + + private: + udword mRnd; + }; + +#endif // __ICERANDOM_H__ + diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceRay.cpp b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceRay.cpp new file mode 100644 index 00000000..ce93b913 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceRay.cpp @@ -0,0 +1,100 @@ +/* + * ICE / OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code for rays. + * \file IceRay.cpp + * \author Pierre Terdiman + * \date April, 4, 2000 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Ray class. + * A ray is a half-line P(t) = mOrig + mDir * t, with 0 <= t <= +infinity + * \class Ray + * \author Pierre Terdiman + * \version 1.0 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/* + O = Origin = impact point + i = normalized vector along the x axis + j = normalized vector along the y axis = actually the normal vector in O + D = Direction vector, norm |D| = 1 + N = Projection of D on y axis, norm |N| = normal reaction + T = Projection of D on x axis, norm |T| = tangential reaction + R = Reflexion vector + + ^y + | + | + | + _ _ _| _ _ _ + * * *| + \ | / + \ |N / | + R\ | /D + \ | / | + \ | / + _________\|/______*_______>x + O T + + Let define theta = angle between D and N. Then cos(theta) = |N| / |D| = |N| since D is normalized. + + j|D = |j|*|D|*cos(theta) => |N| = j|D + + Then we simply have: + + D = N + T + + To compute tangential reaction : + + T = D - N + + To compute reflexion vector : + + R = N - T = N - (D-N) = 2*N - D +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Precompiled Header +#include "Stdafx.h" + +using namespace Opcode; + +float Ray::SquareDistance(const Point& point, float* t) const +{ + Point Diff = point - mOrig; + float fT = Diff | mDir; + + if(fT<=0.0f) + { + fT = 0.0f; + } + else + { + fT /= mDir.SquareMagnitude(); + Diff -= fT*mDir; + } + + if(t) *t = fT; + + return Diff.SquareMagnitude(); +} diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceRay.h b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceRay.h new file mode 100644 index 00000000..7ea57730 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceRay.h @@ -0,0 +1,114 @@ +/* + * ICE / OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code for rays. + * \file IceRay.h + * \author Pierre Terdiman + * \date April, 4, 2000 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef __ICERAY_H__ +#define __ICERAY_H__ + + class ICEMATHS_API Ray + { + public: + //! Constructor + inline_ Ray() {} + //! Constructor + inline_ Ray(const Point& orig, const Point& dir) : mOrig(orig), mDir(dir) {} + //! Copy constructor + inline_ Ray(const Ray& ray) : mOrig(ray.mOrig), mDir(ray.mDir) {} + //! Destructor + inline_ ~Ray() {} + + float SquareDistance(const Point& point, float* t=null) const; + inline_ float Distance(const Point& point, float* t=null) const { return sqrtf(SquareDistance(point, t)); } + + Point mOrig; //!< Ray origin + Point mDir; //!< Normalized direction + }; + + inline_ void ComputeReflexionVector(Point& reflected, const Point& incoming_dir, const Point& outward_normal) + { + reflected = incoming_dir - outward_normal * 2.0f * (incoming_dir|outward_normal); + } + + inline_ void ComputeReflexionVector(Point& reflected, const Point& source, const Point& impact, const Point& normal) + { + Point V = impact - source; + reflected = V - normal * 2.0f * (V|normal); + } + + inline_ void DecomposeVector(Point& normal_compo, Point& tangent_compo, const Point& outward_dir, const Point& outward_normal) + { + normal_compo = outward_normal * (outward_dir|outward_normal); + tangent_compo = outward_dir - normal_compo; + } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Transforms a direction vector from world space to local space + * \param local_dir [out] direction vector in local space + * \param world_dir [in] direction vector in world space + * \param world [in] world transform + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ void ComputeLocalDirection(Point& local_dir, const Point& world_dir, const Matrix4x4& world) + { + // Get world direction back in local space +// Matrix3x3 InvWorld = world; +// local_dir = InvWorld * world_dir; + local_dir = Matrix3x3(world) * world_dir; + } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Transforms a position vector from world space to local space + * \param local_pt [out] position vector in local space + * \param world_pt [in] position vector in world space + * \param world [in] world transform + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ void ComputeLocalPoint(Point& local_pt, const Point& world_pt, const Matrix4x4& world) + { + // Get world vertex back in local space + Matrix4x4 InvWorld = world; + InvWorld.Invert(); + local_pt = world_pt * InvWorld; + } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Transforms a ray from world space to local space + * \param local_ray [out] ray in local space + * \param world_ray [in] ray in world space + * \param world [in] world transform + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ void ComputeLocalRay(Ray& local_ray, const Ray& world_ray, const Matrix4x4& world) + { + // Get world ray back in local space + ComputeLocalDirection(local_ray.mDir, world_ray.mDir, world); + ComputeLocalPoint(local_ray.mOrig, world_ray.mOrig, world); + } + +#endif // __ICERAY_H__ diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceRevisitedRadix.cpp b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceRevisitedRadix.cpp new file mode 100644 index 00000000..3cb3aacc --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceRevisitedRadix.cpp @@ -0,0 +1,592 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains source code from the article "Radix Sort Revisited". + * \file IceRevisitedRadix.cpp + * \author Pierre Terdiman + * \date April, 4, 2000 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Revisited Radix Sort. + * This is my new radix routine: + * - it uses indices and doesn't recopy the values anymore, hence wasting less ram + * - it creates all the histograms in one run instead of four + * - it sorts words faster than dwords and bytes faster than words + * - it correctly sorts negative floating-point values by patching the offsets + * - it automatically takes advantage of temporal coherence + * - multiple keys support is a side effect of temporal coherence + * - it may be worth recoding in asm... (mainly to use FCOMI, FCMOV, etc) [it's probably memory-bound anyway] + * + * History: + * - 08.15.98: very first version + * - 04.04.00: recoded for the radix article + * - 12.xx.00: code lifting + * - 09.18.01: faster CHECK_PASS_VALIDITY thanks to Mark D. Shattuck (who provided other tips, not included here) + * - 10.11.01: added local ram support + * - 01.20.02: bugfix! In very particular cases the last pass was skipped in the float code-path, leading to incorrect sorting...... + * - 01.02.02: - "mIndices" renamed => "mRanks". That's a rank sorter after all. + * - ranks are not "reset" anymore, but implicit on first calls + * - 07.05.02: offsets rewritten with one less indirection. + * - 11.03.02: "bool" replaced with RadixHint enum + * - 07.15.04: stack-based radix added + * - we want to use the radix sort but without making it static, and without allocating anything. + * - we internally allocate two arrays of ranks. Each of them has N udwords to sort N values. + * - 1Mb/2/sizeof(udword) = 131072 values max, at the same time. + * - 09.22.04: - adapted to MacOS by Chris Lamb + * - 01.12.06: - added optimizations suggested by Kyle Hubert + * + * \class RadixSort + * \author Pierre Terdiman + * \version 1.5 + * \date August, 15, 1998 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/* +To do: + - add an offset parameter between two input values (avoid some data recopy sometimes) + - unroll ? asm ? + - prefetch stuff the day I have a P3 + - make a version with 16-bits indices ? +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Precompiled Header +#include "StdAfx.h" + +using namespace Opcode; + +#define INVALIDATE_RANKS mCurrentSize|=0x80000000 +#define VALIDATE_RANKS mCurrentSize&=0x7fffffff +#define CURRENT_SIZE (mCurrentSize&0x7fffffff) +#define INVALID_RANKS (mCurrentSize&0x80000000) + +#define CHECK_RESIZE(n) \ + if(n!=mPreviousSize) \ + { \ + if(n>mCurrentSize) Resize(n); \ + else ResetRanks(); \ + mPreviousSize = n; \ + } + +#if defined(__APPLE__) || defined(_XBOX) + #define H0_OFFSET 768 + #define H1_OFFSET 512 + #define H2_OFFSET 256 + #define H3_OFFSET 0 + #define BYTES_INC (3-j) +#else + #define H0_OFFSET 0 + #define H1_OFFSET 256 + #define H2_OFFSET 512 + #define H3_OFFSET 768 + #define BYTES_INC j +#endif + +#define CREATE_HISTOGRAMS(type, buffer) \ + /* Clear counters/histograms */ \ + ZeroMemory(mHistogram, 256*4*sizeof(udword)); \ + \ + /* Prepare to count */ \ + const ubyte* p = (const ubyte*)input; \ + const ubyte* pe = &p[nb*4]; \ + udword* h0= &mHistogram[H0_OFFSET]; /* Histogram for first pass (LSB) */ \ + udword* h1= &mHistogram[H1_OFFSET]; /* Histogram for second pass */ \ + udword* h2= &mHistogram[H2_OFFSET]; /* Histogram for third pass */ \ + udword* h3= &mHistogram[H3_OFFSET]; /* Histogram for last pass (MSB) */ \ + \ + bool AlreadySorted = true; /* Optimism... */ \ + \ + if(INVALID_RANKS) \ + { \ + /* Prepare for temporal coherence */ \ + type* Running = (type*)buffer; \ + type PrevVal = *Running; \ + \ + while(p!=pe) \ + { \ + /* Read input buffer in previous sorted order */ \ + type Val = *Running++; \ + /* Check whether already sorted or not */ \ + if(ValCurSize) Resize(nb); + mCurrentSize = nb; + INVALIDATE_RANKS; + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Main sort routine. + * This one is for integer values. After the call, mRanks contains a list of indices in sorted order, i.e. in the order you may process your data. + * \param input [in] a list of integer values to sort + * \param nb [in] number of values to sort, must be < 2^31 + * \param hint [in] RADIX_SIGNED to handle negative values, RADIX_UNSIGNED if you know your input buffer only contains positive values + * \return Self-Reference + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +RadixSort& RadixSort::Sort(const udword* input, udword nb, RadixHint hint) +{ + // Checkings + if(!input || !nb || nb&0x80000000) return *this; + + // Stats + mTotalCalls++; + + // Resize lists if needed + CheckResize(nb); + +#ifdef RADIX_LOCAL_RAM + // Allocate histograms & offsets on the stack + udword mHistogram[256*4]; +// udword mOffset[256]; + udword* mLink[256]; +#endif + + // Create histograms (counters). Counters for all passes are created in one run. + // Pros: read input buffer once instead of four times + // Cons: mHistogram is 4Kb instead of 1Kb + // We must take care of signed/unsigned values for temporal coherence.... I just + // have 2 code paths even if just a single opcode changes. Self-modifying code, someone? + if(hint==RADIX_UNSIGNED) { CREATE_HISTOGRAMS(udword, input); } + else { CREATE_HISTOGRAMS(sdword, input); } +/* + // Compute #negative values involved if needed + udword NbNegativeValues = 0; + if(hint==RADIX_SIGNED) + { + // An efficient way to compute the number of negatives values we'll have to deal with is simply to sum the 128 + // last values of the last histogram. Last histogram because that's the one for the Most Significant Byte, + // responsible for the sign. 128 last values because the 128 first ones are related to positive numbers. + udword* h3= &mHistogram[768]; + for(udword i=128;i<256;i++) NbNegativeValues += h3[i]; // 768 for last histogram, 128 for negative part + } +*/ + // Radix sort, j is the pass number (0=LSB, 3=MSB) + for(udword j=0;j<4;j++) + { + CHECK_PASS_VALIDITY(j); + + // Sometimes the fourth (negative) pass is skipped because all numbers are negative and the MSB is 0xFF (for example). This is + // not a problem, numbers are correctly sorted anyway. + if(PerformPass) + { + // Should we care about negative values? + if(j!=3 || hint==RADIX_UNSIGNED) + { + // Here we deal with positive values only + + // Create offsets +// mOffset[0] = 0; +// for(udword i=1;i<256;i++) mOffset[i] = mOffset[i-1] + CurCount[i-1]; + mLink[0] = mRanks2; + for(udword i=1;i<256;i++) mLink[i] = mLink[i-1] + CurCount[i-1]; + } + else + { + // This is a special case to correctly handle negative integers. They're sorted in the right order but at the wrong place. +/* + // Create biased offsets, in order for negative numbers to be sorted as well +// mOffset[0] = NbNegativeValues; // First positive number takes place after the negative ones +// for(udword i=1;i<128;i++) mOffset[i] = mOffset[i-1] + CurCount[i-1]; // 1 to 128 for positive numbers + mLink[0] = &mRanks2[NbNegativeValues]; // First positive number takes place after the negative ones + for(udword i=1;i<128;i++) mLink[i] = mLink[i-1] + CurCount[i-1]; // 1 to 128 for positive numbers + + // Fixing the wrong place for negative values +// mOffset[128] = 0; +// for(i=129;i<256;i++) mOffset[i] = mOffset[i-1] + CurCount[i-1]; + mLink[128] = mRanks2; + for(udword i=129;i<256;i++) mLink[i] = mLink[i-1] + CurCount[i-1]; +*/ + +// From Kyle Hubert: + +//mOffset[128] = 0; +mLink[128] = mRanks2; +//for(i=129;i<256;i++) mOffset[i] = mOffset[i-1] + CurCount[i-1]; +for(udword i=129;i<256;i++) mLink[i] = mLink[i-1] + CurCount[i-1]; + +//mOffset[0] = mOffset[255] + CurCount[255]; +mLink[0] = mLink[255] + CurCount[255]; +//for(i=1;i<128;i++) mOffset[i] = mOffset[i-1] + CurCount[i-1]; +for(udword i=1;i<128;i++) mLink[i] = mLink[i-1] + CurCount[i-1]; + + + } + + // Perform Radix Sort + const ubyte* InputBytes = (const ubyte*)input; + InputBytes += BYTES_INC; + if(INVALID_RANKS) + { +// for(udword i=0;i127;i--) mOffset[i] = mOffset[i+1] + CurCount[i]; +for(udword i=254;i>127;i--) mLink[i] = mLink[i+1] + CurCount[i]; +//mOffset[0] = mOffset[128] + CurCount[128]; +mLink[0] = mLink[128] + CurCount[128]; +//for(udword i=1;i<128;i++) mOffset[i] = mOffset[i-1] + CurCount[i-1]; +for(udword i=1;i<128;i++) mLink[i] = mLink[i-1] + CurCount[i-1]; + + // Perform Radix Sort + if(INVALID_RANKS) + { + for(udword i=0;i>24; // Radix byte, same as above. AND is useless here (udword). + // ### cmp to be killed. Not good. Later. +// if(Radix<128) mRanks2[mOffset[Radix]++] = i; // Number is positive, same as above +// else mRanks2[--mOffset[Radix]] = i; // Number is negative, flip the sorting order + if(Radix<128) *mLink[Radix]++ = i; // Number is positive, same as above + else *(--mLink[Radix]) = i; // Number is negative, flip the sorting order + } + VALIDATE_RANKS; + } + else + { + for(udword i=0;i>24; // Radix byte, same as above. AND is useless here (udword). + // ### cmp to be killed. Not good. Later. +// if(Radix<128) mRanks2[mOffset[Radix]++] = mRanks[i]; // Number is positive, same as above +// else mRanks2[--mOffset[Radix]] = mRanks[i]; // Number is negative, flip the sorting order + if(Radix<128) *mLink[Radix]++ = mRanks[i]; // Number is positive, same as above + else *(--mLink[Radix]) = mRanks[i]; // Number is negative, flip the sorting order + } + } + // Swap pointers for next pass. Valid indices - the most recent ones - are in mRanks after the swap. + udword* Tmp = mRanks; + mRanks = mRanks2; + mRanks2 = Tmp; + } + else + { + // The pass is useless, yet we still have to reverse the order of current list if all values are negative. + if(UniqueVal>=128) + { + if(INVALID_RANKS) + { + // ###Possible? + for(udword i=0;i=SqrLen) + { + fT = 1.0f; + Diff -= Dir; + } + else + { + fT /= SqrLen; + Diff -= fT*Dir; + } + } + + if(t) *t = fT; + + return Diff.SquareMagnitude(); +} diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceSegment.h b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceSegment.h new file mode 100644 index 00000000..6764c0c4 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceSegment.h @@ -0,0 +1,71 @@ +/* + * ICE / OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code for segments. + * \file IceSegment.h + * \author Pierre Terdiman + * \date April, 4, 2000 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef __ICESEGMENT_H__ +#define __ICESEGMENT_H__ + + class ICEMATHS_API Segment + { + public: + //! Constructor + inline_ Segment() {} + //! Constructor + inline_ Segment(const Point& p0, const Point& p1) : mP0(p0), mP1(p1) {} + //! Copy constructor + inline_ Segment(const Segment& seg) : mP0(seg.mP0), mP1(seg.mP1) {} + //! Destructor + inline_ ~Segment() {} + + inline_ const Point& GetOrigin() const { return mP0; } + inline_ Point ComputeDirection() const { return mP1 - mP0; } + inline_ void ComputeDirection(Point& dir) const { dir = mP1 - mP0; } + inline_ float ComputeLength() const { return mP1.Distance(mP0); } + inline_ float ComputeSquareLength() const { return mP1.SquareDistance(mP0); } + + inline_ void SetOriginDirection(const Point& origin, const Point& direction) + { + mP0 = mP1 = origin; + mP1 += direction; + } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Computes a point on the segment + * \param pt [out] point on segment + * \param t [in] point's parameter [t=0 => pt = mP0, t=1 => pt = mP1] + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ void ComputePoint(Point& pt, float t) const { pt = mP0 + t * (mP1 - mP0); } + + float SquareDistance(const Point& point, float* t=null) const; + inline_ float Distance(const Point& point, float* t=null) const { return sqrtf(SquareDistance(point, t)); } + + Point mP0; //!< Start of segment + Point mP1; //!< End of segment + }; + +#endif // __ICESEGMENT_H__ diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceTriangle.cpp b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceTriangle.cpp new file mode 100644 index 00000000..d95174d6 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceTriangle.cpp @@ -0,0 +1,302 @@ +/* + * ICE / OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains a handy triangle class. + * \file IceTriangle.cpp + * \author Pierre Terdiman + * \date January, 17, 2000 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Precompiled Header +#include "Stdafx.h" + +using namespace Opcode; + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains a triangle class. + * + * \class Tri + * \author Pierre Terdiman + * \version 1.0 + * \date 08.15.98 +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +static sdword VPlaneSideEps(const Point& v, const Plane& plane, float epsilon) +{ + // Compute distance from current vertex to the plane + float Dist = plane.Distance(v); + // Compute side: + // 1 = the vertex is on the positive side of the plane + // -1 = the vertex is on the negative side of the plane + // 0 = the vertex is on the plane (within epsilon) + return Dist > epsilon ? 1 : Dist < -epsilon ? -1 : 0; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Flips the winding order. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void Triangle::Flip() +{ + Point Tmp = mVerts[1]; + mVerts[1] = mVerts[2]; + mVerts[2] = Tmp; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Computes the triangle area. + * \return the area + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +float Triangle::Area() const +{ + const Point& p0 = mVerts[0]; + const Point& p1 = mVerts[1]; + const Point& p2 = mVerts[2]; + return ((p0 - p1)^(p0 - p2)).Magnitude() * 0.5f; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Computes the triangle perimeter. + * \return the perimeter + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +float Triangle::Perimeter() const +{ + const Point& p0 = mVerts[0]; + const Point& p1 = mVerts[1]; + const Point& p2 = mVerts[2]; + return p0.Distance(p1) + + p0.Distance(p2) + + p1.Distance(p2); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Computes the triangle compacity. + * \return the compacity + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +float Triangle::Compacity() const +{ + float P = Perimeter(); + if(P==0.0f) return 0.0f; + return (4.0f*PI*Area()/(P*P)); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Computes the triangle normal. + * \param normal [out] the computed normal + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void Triangle::Normal(Point& normal) const +{ + const Point& p0 = mVerts[0]; + const Point& p1 = mVerts[1]; + const Point& p2 = mVerts[2]; + normal = ((p0 - p1)^(p0 - p2)).Normalize(); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Computes the triangle denormalized normal. + * \param normal [out] the computed normal + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void Triangle::DenormalizedNormal(Point& normal) const +{ + const Point& p0 = mVerts[0]; + const Point& p1 = mVerts[1]; + const Point& p2 = mVerts[2]; + normal = ((p0 - p1)^(p0 - p2)); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Computes the triangle center. + * \param center [out] the computed center + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void Triangle::Center(Point& center) const +{ + const Point& p0 = mVerts[0]; + const Point& p1 = mVerts[1]; + const Point& p2 = mVerts[2]; + center = (p0 + p1 + p2)*INV3; +} + +PartVal Triangle::TestAgainstPlane(const Plane& plane, float epsilon) const +{ + bool Pos = false, Neg = false; + + // Loop through all vertices + for(udword i=0;i<3;i++) + { + // Compute side: + sdword Side = VPlaneSideEps(mVerts[i], plane, epsilon); + + if (Side < 0) Neg = true; + else if (Side > 0) Pos = true; + } + + if (!Pos && !Neg) return TRI_ON_PLANE; + else if (Pos && Neg) return TRI_INTERSECT; + else if (Pos && !Neg) return TRI_PLUS_SPACE; + else if (!Pos && Neg) return TRI_MINUS_SPACE; + + // What?! + return TRI_FORCEDWORD; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Computes the triangle moment. + * \param m [out] the moment + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/* +void Triangle::ComputeMoment(Moment& m) +{ + // Compute the area of the triangle + m.mArea = Area(); + + // Compute the centroid + Center(m.mCentroid); + + // Second-order components. Handle zero-area faces. + Point& p = mVerts[0]; + Point& q = mVerts[1]; + Point& r = mVerts[2]; + if(m.mArea==0.0f) + { + // This triangle has zero area. The second order components would be eliminated with the usual formula, so, for the + // sake of robustness we use an alternative form. These are the centroid and second-order components of the triangle's vertices. + m.mCovariance.m[0][0] = (p.x*p.x + q.x*q.x + r.x*r.x); + m.mCovariance.m[0][1] = (p.x*p.y + q.x*q.y + r.x*r.y); + m.mCovariance.m[0][2] = (p.x*p.z + q.x*q.z + r.x*r.z); + m.mCovariance.m[1][1] = (p.y*p.y + q.y*q.y + r.y*r.y); + m.mCovariance.m[1][2] = (p.y*p.z + q.y*q.z + r.y*r.z); + m.mCovariance.m[2][2] = (p.z*p.z + q.z*q.z + r.z*r.z); + m.mCovariance.m[2][1] = m.mCovariance.m[1][2]; + m.mCovariance.m[1][0] = m.mCovariance.m[0][1]; + m.mCovariance.m[2][0] = m.mCovariance.m[0][2]; + } + else + { + const float OneOverTwelve = 1.0f / 12.0f; + m.mCovariance.m[0][0] = m.mArea * (9.0f * m.mCentroid.x*m.mCentroid.x + p.x*p.x + q.x*q.x + r.x*r.x) * OneOverTwelve; + m.mCovariance.m[0][1] = m.mArea * (9.0f * m.mCentroid.x*m.mCentroid.y + p.x*p.y + q.x*q.y + r.x*r.y) * OneOverTwelve; + m.mCovariance.m[1][1] = m.mArea * (9.0f * m.mCentroid.y*m.mCentroid.y + p.y*p.y + q.y*q.y + r.y*r.y) * OneOverTwelve; + m.mCovariance.m[0][2] = m.mArea * (9.0f * m.mCentroid.x*m.mCentroid.z + p.x*p.z + q.x*q.z + r.x*r.z) * OneOverTwelve; + m.mCovariance.m[1][2] = m.mArea * (9.0f * m.mCentroid.y*m.mCentroid.z + p.y*p.z + q.y*q.z + r.y*r.z) * OneOverTwelve; + m.mCovariance.m[2][2] = m.mArea * (9.0f * m.mCentroid.z*m.mCentroid.z + p.z*p.z + q.z*q.z + r.z*r.z) * OneOverTwelve; + m.mCovariance.m[2][1] = m.mCovariance.m[1][2]; + m.mCovariance.m[1][0] = m.mCovariance.m[0][1]; + m.mCovariance.m[2][0] = m.mCovariance.m[0][2]; + } +} +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Computes the triangle's smallest edge length. + * \return the smallest edge length + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +float Triangle::MinEdgeLength() const +{ + float Min = MAX_FLOAT; + float Length01 = mVerts[0].Distance(mVerts[1]); + float Length02 = mVerts[0].Distance(mVerts[2]); + float Length12 = mVerts[1].Distance(mVerts[2]); + if(Length01 < Min) Min = Length01; + if(Length02 < Min) Min = Length02; + if(Length12 < Min) Min = Length12; + return Min; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Computes the triangle's largest edge length. + * \return the largest edge length + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +float Triangle::MaxEdgeLength() const +{ + float Max = MIN_FLOAT; + float Length01 = mVerts[0].Distance(mVerts[1]); + float Length02 = mVerts[0].Distance(mVerts[2]); + float Length12 = mVerts[1].Distance(mVerts[2]); + if(Length01 > Max) Max = Length01; + if(Length02 > Max) Max = Length02; + if(Length12 > Max) Max = Length12; + return Max; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Computes a point on the triangle according to the stabbing information. + * \param u,v [in] point's barycentric coordinates + * \param pt [out] point on triangle + * \param nearvtx [out] index of nearest vertex + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void Triangle::ComputePoint(float u, float v, Point& pt, udword* nearvtx) const +{ + // Compute point coordinates + pt = (1.0f - u - v)*mVerts[0] + u*mVerts[1] + v*mVerts[2]; + + // Compute nearest vertex if needed + if(nearvtx) + { + // Compute distance vector + Point d(mVerts[0].SquareDistance(pt), // Distance^2 from vertex 0 to point on the face + mVerts[1].SquareDistance(pt), // Distance^2 from vertex 1 to point on the face + mVerts[2].SquareDistance(pt)); // Distance^2 from vertex 2 to point on the face + + // Get smallest distance + *nearvtx = d.SmallestAxis(); + } +} + +void Triangle::Inflate(float fat_coeff, bool constant_border) +{ + // Compute triangle center + Point TriangleCenter; + Center(TriangleCenter); + + // Don't normalize? + // Normalize => add a constant border, regardless of triangle size + // Don't => add more to big triangles + for(udword i=0;i<3;i++) + { + Point v = mVerts[i] - TriangleCenter; + + if(constant_border) v.Normalize(); + + mVerts[i] += v * fat_coeff; + } +} diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceTriangle.h b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceTriangle.h new file mode 100644 index 00000000..99a6467f --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceTriangle.h @@ -0,0 +1,84 @@ +/* + * ICE / OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains a handy triangle class. + * \file IceTriangle.h + * \author Pierre Terdiman + * \date January, 17, 2000 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef __ICETRIANGLE_H__ +#define __ICETRIANGLE_H__ + + // Forward declarations + class Moment; + + // Partitioning values + enum PartVal + { + TRI_MINUS_SPACE = 0, //!< Triangle is in the negative space + TRI_PLUS_SPACE = 1, //!< Triangle is in the positive space + TRI_INTERSECT = 2, //!< Triangle intersects plane + TRI_ON_PLANE = 3, //!< Triangle and plane are coplanar + + TRI_FORCEDWORD = 0x7fffffff + }; + + // A triangle class. + class ICEMATHS_API Triangle + { + public: + //! Constructor + inline_ Triangle() {} + //! Constructor + inline_ Triangle(const Point& p0, const Point& p1, const Point& p2) { mVerts[0]=p0; mVerts[1]=p1; mVerts[2]=p2; } + //! Copy constructor + inline_ Triangle(const Triangle& triangle) + { + mVerts[0] = triangle.mVerts[0]; + mVerts[1] = triangle.mVerts[1]; + mVerts[2] = triangle.mVerts[2]; + } + //! Destructor + inline_ ~Triangle() {} + //! Vertices + Point mVerts[3]; + + // Methods + void Flip(); + float Area() const; + float Perimeter() const; + float Compacity() const; + void Normal(Point& normal) const; + void DenormalizedNormal(Point& normal) const; + void Center(Point& center) const; + inline_ Plane PlaneEquation() const { return Plane(mVerts[0], mVerts[1], mVerts[2]); } + + PartVal TestAgainstPlane(const Plane& plane, float epsilon) const; +// float Distance(Point& cp, Point& cq, Tri& tri); + void ComputeMoment(Moment& m); + float MinEdgeLength() const; + float MaxEdgeLength() const; + void ComputePoint(float u, float v, Point& pt, udword* nearvtx=null) const; + void Inflate(float fat_coeff, bool constant_border); + }; + +#endif // __ICETRIANGLE_H__ diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceTrilist.h b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceTrilist.h new file mode 100644 index 00000000..73d23b59 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceTrilist.h @@ -0,0 +1,77 @@ +/* + * ICE / OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code for a triangle container. + * \file IceTrilist.h + * \author Pierre Terdiman + * \date April, 4, 2000 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef __ICETRILIST_H__ +#define __ICETRILIST_H__ + + class ICEMATHS_API TriList : public Container + { + public: + // Constructor / Destructor + TriList() {} + ~TriList() {} + + inline_ udword GetNbTriangles() const { return GetNbEntries()/9; } + inline_ Triangle* GetTriangles() const { return (Triangle*)GetEntries(); } + + void AddTri(const Triangle& tri) + { + Add(tri.mVerts[0].x).Add(tri.mVerts[0].y).Add(tri.mVerts[0].z); + Add(tri.mVerts[1].x).Add(tri.mVerts[1].y).Add(tri.mVerts[1].z); + Add(tri.mVerts[2].x).Add(tri.mVerts[2].y).Add(tri.mVerts[2].z); + } + + void AddTri(const Point& p0, const Point& p1, const Point& p2) + { + Add(p0.x).Add(p0.y).Add(p0.z); + Add(p1.x).Add(p1.y).Add(p1.z); + Add(p2.x).Add(p2.y).Add(p2.z); + } + }; + + class ICEMATHS_API TriangleList : public Container + { + public: + // Constructor / Destructor + TriangleList() {} + ~TriangleList() {} + + inline_ udword GetNbTriangles() const { return GetNbEntries()/3; } + inline_ IndexedTriangle* GetTriangles() const { return (IndexedTriangle*)GetEntries();} + + void AddTriangle(const IndexedTriangle& tri) + { + Add(tri.mVRef[0]).Add(tri.mVRef[1]).Add(tri.mVRef[2]); + } + + void AddTriangle(udword vref0, udword vref1, udword vref2) + { + Add(vref0).Add(vref1).Add(vref2); + } + }; + +#endif //__ICETRILIST_H__ diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceTypes.h b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceTypes.h new file mode 100644 index 00000000..9316d8d5 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/IceTypes.h @@ -0,0 +1,181 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains custom types. + * \file IceTypes.h + * \author Pierre Terdiman + * \date April, 4, 2000 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef ICETYPES_H +#define ICETYPES_H + + #define USE_HANDLE_MANAGER + + // Constants +#ifndef PI + #define PI 3.1415926535897932384626433832795028841971693993751f //!< PI +#endif + #define HALFPI 1.57079632679489661923f //!< 0.5 * PI + #define TWOPI 6.28318530717958647692f //!< 2.0 * PI + #define INVPI 0.31830988618379067154f //!< 1.0 / PI + + #define RADTODEG 57.2957795130823208768f //!< 180.0 / PI, convert radians to degrees + #define DEGTORAD 0.01745329251994329577f //!< PI / 180.0, convert degrees to radians + + #define EXP 2.71828182845904523536f //!< e + #define INVLOG2 3.32192809488736234787f //!< 1.0 / log10(2) + #define LN2 0.693147180559945f //!< ln(2) + #define INVLN2 1.44269504089f //!< 1.0f / ln(2) + + #define INV3 0.33333333333333333333f //!< 1/3 + #define INV6 0.16666666666666666666f //!< 1/6 + #define INV7 0.14285714285714285714f //!< 1/7 + #define INV9 0.11111111111111111111f //!< 1/9 + #define INV255 0.00392156862745098039f //!< 1/255 + + #define SQRT2 1.41421356237f //!< sqrt(2) + #define INVSQRT2 0.707106781188f //!< 1 / sqrt(2) + + #define SQRT3 1.73205080757f //!< sqrt(3) + #define INVSQRT3 0.577350269189f //!< 1 / sqrt(3) + + #define null 0 //!< our own NULL pointer + + // Custom types used in ICE + typedef signed char sbyte; //!< sizeof(sbyte) must be 1 + typedef unsigned char ubyte; //!< sizeof(ubyte) must be 1 + typedef signed short sword; //!< sizeof(sword) must be 2 + typedef unsigned short uword; //!< sizeof(uword) must be 2 + typedef signed int sdword; //!< sizeof(sdword) must be 4 + typedef unsigned int udword; //!< sizeof(udword) must be 4 +#ifdef WIN32 + typedef signed __int64 sqword; //!< sizeof(sqword) must be 8 + typedef unsigned __int64 uqword; //!< sizeof(uqword) must be 8 +#elif LINUX + typedef signed long long sqword; //!< sizeof(sqword) must be 8 + typedef unsigned long long uqword; //!< sizeof(uqword) must be 8 +#elif defined(__APPLE__) + typedef signed long long sqword; //!< sizeof(sqword) must be 8 + typedef unsigned long long uqword; //!< sizeof(uqword) must be 8 +#elif defined(_XBOX) + typedef signed __int64 sqword; //!< sizeof(sqword) must be 8 + typedef unsigned __int64 uqword; //!< sizeof(uqword) must be 8 +#endif + typedef float float32; //!< sizeof(float32) must be 4 + typedef double float64; //!< sizeof(float64) must be 8 + typedef size_t regsize; //!< sizeof(regsize) must be sizeof(void*) + + // For test purpose you can force one of those: +// typedef udword regsize; +// typedef uqword regsize; + + ICE_COMPILE_TIME_ASSERT(sizeof(bool)==1); // ...otherwise things might fail with VC++ 4.2 ! + ICE_COMPILE_TIME_ASSERT(sizeof(ubyte)==1); + ICE_COMPILE_TIME_ASSERT(sizeof(sbyte)==1); + ICE_COMPILE_TIME_ASSERT(sizeof(sword)==2); + ICE_COMPILE_TIME_ASSERT(sizeof(uword)==2); + ICE_COMPILE_TIME_ASSERT(sizeof(udword)==4); + ICE_COMPILE_TIME_ASSERT(sizeof(sdword)==4); + ICE_COMPILE_TIME_ASSERT(sizeof(uqword)==8); + ICE_COMPILE_TIME_ASSERT(sizeof(sqword)==8); + ICE_COMPILE_TIME_ASSERT(sizeof(float32)==4); + ICE_COMPILE_TIME_ASSERT(sizeof(float64)==8); + ICE_COMPILE_TIME_ASSERT(sizeof(regsize)==sizeof(void*)); + + //! TO BE DOCUMENTED + #define DECLARE_ICE_HANDLE(name) struct name##__ { int unused; }; typedef struct name##__ *name + + typedef udword DynID; //!< Dynamic identifier +#ifdef USE_HANDLE_MANAGER + typedef udword KID; //!< Kernel ID +// DECLARE_ICE_HANDLE(KID); +#else + typedef uword KID; //!< Kernel ID +#endif + #define INVALID_ID 0xffffffff //!< Invalid dword ID (counterpart of null pointers) +#ifdef USE_HANDLE_MANAGER + #define INVALID_KID 0xffffffff //!< Invalid Kernel ID +#else + #define INVALID_KID 0xffff //!< Invalid Kernel ID +#endif + #define INVALID_NUMBER 0xDEADBEEF //!< Standard junk value + + // Define BOOL if needed + #ifndef BOOL + typedef int BOOL; //!< Another boolean type. + #endif + + //! Union of a float and a sdword + typedef union { + float f; //!< The float + sdword d; //!< The integer + }scell; + + //! Union of a float and a udword + typedef union { + float f; //!< The float + udword d; //!< The integer + }ucell; + + // Type ranges + #define MAX_SBYTE 0x7f //!< max possible sbyte value + #define MIN_SBYTE 0x80 //!< min possible sbyte value + #define MAX_UBYTE 0xff //!< max possible ubyte value + #define MIN_UBYTE 0x00 //!< min possible ubyte value + #define MAX_SWORD 0x7fff //!< max possible sword value + #define MIN_SWORD 0x8000 //!< min possible sword value + #define MAX_UWORD 0xffff //!< max possible uword value + #define MIN_UWORD 0x0000 //!< min possible uword value + #define MAX_SDWORD 0x7fffffff //!< max possible sdword value + #define MIN_SDWORD 0x80000000 //!< min possible sdword value + #define MAX_UDWORD 0xffffffff //!< max possible udword value + #define MIN_UDWORD 0x00000000 //!< min possible udword value + #define MAX_FLOAT FLT_MAX //!< max possible float value + #define MIN_FLOAT (-FLT_MAX) //!< min possible loat value + #define IEEE_1_0 0x3f800000 //!< integer representation of 1.0 + #define IEEE_255_0 0x437f0000 //!< integer representation of 255.0 + #define IEEE_MAX_FLOAT 0x7f7fffff //!< integer representation of MAX_FLOAT + #define IEEE_MIN_FLOAT 0xff7fffff //!< integer representation of MIN_FLOAT + #define IEEE_UNDERFLOW_LIMIT 0x1a000000 + + #define ONE_OVER_RAND_MAX (1.0f / float(RAND_MAX)) //!< Inverse of the max possible value returned by rand() + + typedef void** VTABLE; //!< A V-Table. + + #undef MIN + #undef MAX + #define MIN(a, b) ((a) < (b) ? (a) : (b)) //!< Returns the min value between a and b + #define MAX(a, b) ((a) > (b) ? (a) : (b)) //!< Returns the max value between a and b + #define MAXMAX(a,b,c) ((a) > (b) ? MAX (a,c) : MAX (b,c)) //!< Returns the max value between a, b and c + + template inline_ const T& TMin (const T& a, const T& b) { return b < a ? b : a; } + template inline_ const T& TMax (const T& a, const T& b) { return a < b ? b : a; } + template inline_ void TSetMin (T& a, const T& b) { if(a>b) a = b; } + template inline_ void TSetMax (T& a, const T& b) { if(a> 1) & 0x55555555) | ((n << 1) & 0xaaaaaaaa); + n = ((n >> 2) & 0x33333333) | ((n << 2) & 0xcccccccc); + n = ((n >> 4) & 0x0f0f0f0f) | ((n << 4) & 0xf0f0f0f0); + n = ((n >> 8) & 0x00ff00ff) | ((n << 8) & 0xff00ff00); + n = ((n >> 16) & 0x0000ffff) | ((n << 16) & 0xffff0000); + // Etc for larger integers (64 bits in Java) + // NOTE: the >> operation must be unsigned! (>>> in java) + } + + //! Count the number of '1' bits in a 32 bit word (from Steve Baker's Cute Code Collection) + inline_ udword CountBits(udword n) + { + // This relies of the fact that the count of n bits can NOT overflow + // an n bit integer. EG: 1 bit count takes a 1 bit integer, 2 bit counts + // 2 bit integer, 3 bit count requires only a 2 bit integer. + // So we add all bit pairs, then each nible, then each byte etc... + n = (n & 0x55555555) + ((n & 0xaaaaaaaa) >> 1); + n = (n & 0x33333333) + ((n & 0xcccccccc) >> 2); + n = (n & 0x0f0f0f0f) + ((n & 0xf0f0f0f0) >> 4); + n = (n & 0x00ff00ff) + ((n & 0xff00ff00) >> 8); + n = (n & 0x0000ffff) + ((n & 0xffff0000) >> 16); + // Etc for larger integers (64 bits in Java) + // NOTE: the >> operation must be unsigned! (>>> in java) + return n; + } + + //! Even faster? + inline_ udword CountBits2(udword bits) + { + bits = bits - ((bits >> 1) & 0x55555555); + bits = ((bits >> 2) & 0x33333333) + (bits & 0x33333333); + bits = ((bits >> 4) + bits) & 0x0F0F0F0F; + return (bits * 0x01010101) >> 24; + } + + // "Population Count (Ones Count) + // The population count of a binary integer value x is the number of one bits in the value. Although many machines have + // single instructions for this, the single instructions are usually microcoded loops that test a bit per cycle; a log-time + // algorithm coded in C is often faster. The following code uses a variable-precision SWAR algorithm to perform a tree + // reduction adding the bits in a 32-bit value:" + inline_ udword ones32(udword x) + { + /* 32-bit recursive reduction using SWAR... + but first step is mapping 2-bit values + into sum of 2 1-bit values in sneaky way + */ + x -= ((x >> 1) & 0x55555555); + x = (((x >> 2) & 0x33333333) + (x & 0x33333333)); + x = (((x >> 4) + x) & 0x0f0f0f0f); + x += (x >> 8); + x += (x >> 16); + return (x & 0x0000003f); + // "It is worthwhile noting that the SWAR population count algorithm given above can be improved upon for the case of + // counting the population of multi-word bit sets. How? The last few steps in the reduction are using only a portion + // of the SWAR width to produce their results; thus, it would be possible to combine these steps across multiple words + // being reduced. One additional note: the AMD Athlon optimization guidelines suggest a very similar algorithm that + // replaces the last three lines with return((x * 0x01010101) >> 24);. For the Athlon (which has a very fast integer + // multiply), I would have expected AMD's code to be faster... but it is actually 6% slower according to my benchmarks + // using a 1.2GHz Athlon (a Thunderbird). Why? Well, it so happens that GCC doesn't use a multiply instruction - it + // writes out the equivalent shift and add sequence!" + } + + // "Trailing Zero Count + // Given the Least Significant 1 Bit and Population Count (Ones Count) algorithms, it is trivial to combine them to + // construct a trailing zero count (as pointed-out by Joe Bowbeer):" + inline_ udword tzc(sdword x) + { + return(ones32((x & -x) - 1)); + } + + //! Spread out bits. EG 00001111 -> 0101010101 + //! 00001010 -> 0100010000 + //! This is used to interleave two integers to produce a `Morton Key' + //! used in Space Filling Curves (See DrDobbs Journal, July 1999) + //! Order is important. + inline_ void SpreadBits(udword& n) + { + n = ( n & 0x0000ffff) | (( n & 0xffff0000) << 16); + n = ( n & 0x000000ff) | (( n & 0x0000ff00) << 8); + n = ( n & 0x000f000f) | (( n & 0x00f000f0) << 4); + n = ( n & 0x03030303) | (( n & 0x0c0c0c0c) << 2); + n = ( n & 0x11111111) | (( n & 0x22222222) << 1); + } + + // "Next Largest Power of 2 + // Given a binary integer value x, the next largest power of 2 can be computed by a SWAR algorithm + // that recursively "folds" the upper bits into the lower bits. This process yields a bit vector with + // the same most significant 1 as x, but all 1's below it. Adding 1 to that value yields the next + // largest power of 2. For a 32-bit value:" + inline_ udword NextPowerOfTwo(udword x) + { + x |= (x >> 1); + x |= (x >> 2); + x |= (x >> 4); + x |= (x >> 8); + x |= (x >> 16); + return x+1; + } + + //! Test to see if a number is an exact power of two (from Steve Baker's Cute Code Collection) + inline_ bool IsPowerOfTwo(udword n) { return ((n&(n-1))==0); } + + //! Zero the least significant '1' bit in a word. (from Steve Baker's Cute Code Collection) + inline_ void ZeroLeastSetBit(udword& n) { n&=(n-1); } + + //! Set the least significant N bits in a word. (from Steve Baker's Cute Code Collection) + inline_ void SetLeastNBits(udword& x, udword n) { x|=~(~0<> 31; return (x^y)-y; } + + // "Integer Minimum or Maximum + // Given 2's complement integer values x and y, the minimum can be computed without any branches as + // x+(((y-x)>>(WORDBITS-1))&(y-x)). + // Logically, this works because the shift by (WORDBITS-1) replicates the sign bit to create a mask + // -- be aware, however, that the C language does not require that shifts are signed even if their + // operands are signed, so there is a potential portability problem. Additionally, one might think + // that a shift by any number greater than or equal to WORDBITS would have the same effect, but many + // instruction sets have shifts that behave strangely when such shift distances are specified. + // Of course, maximum can be computed using the same trick: + // x-(((x-y)>>(WORDBITS-1))&(x-y))." + + //!< Alternative min function + inline_ sdword min_(sdword a, sdword b) { sdword delta = b-a; return a + (delta&(delta>>31)); } + //!< Alternative max function + inline_ sdword max_(sdword a, sdword b) { sdword delta = a-b; return a - (delta&(delta>>31)); } + + // "Integer Selection + // A branchless, lookup-free, alternative to code like if (a> (WORDBITS-1)) & (c^d)) ^ d). + // This code assumes that the shift is signed, which, of course, C does not promise." + inline_ sdword IntegerSelection(sdword a, sdword b, sdword c, sdword d) + { + return ((((a-b)>>31) & (c^d)) ^ d); + } + + // Determine if one of the bytes in a 4 byte word is zero + inline_ BOOL HasNullByte(udword x) { return ((x + 0xfefefeff) & (~x) & 0x80808080); } + + // To find the smallest 1 bit in a word EG: ~~~~~~10---0 => 0----010---0 + inline_ udword LowestOneBit(udword w) { return ((w) & (~(w)+1)); } +// inline_ udword LowestOneBit_(udword w) { return ((w) & (-(w))); } + + // "Most Significant 1 Bit + // Given a binary integer value x, the most significant 1 bit (highest numbered element of a bit set) + // can be computed using a SWAR algorithm that recursively "folds" the upper bits into the lower bits. + // This process yields a bit vector with the same most significant 1 as x, but all 1's below it. + // Bitwise AND of the original value with the complement of the "folded" value shifted down by one + // yields the most significant bit. For a 32-bit value:" + inline_ udword msb32(udword x) + { + x |= (x >> 1); + x |= (x >> 2); + x |= (x >> 4); + x |= (x >> 8); + x |= (x >> 16); + return (x & ~(x >> 1)); + } + + // "Gray Code Conversion + // A Gray code is any binary coding sequence in which only a single bit position changes as we move from one value to the next. + // There are many such codes, but the traditional one is computed such that the Kth Gray code is K^(K>>1). + // + // The well-known algorithm for conversion from Gray to binary is a linear sequence of XORs that makes it seem each bit must be + // dealt with separately. Fortunately, that is equivalent to a parallel prefix XOR that can be computed using SWAR techniques + // in log time. For 32-bit Gray code values produced as described above, the conversion from Gray code back to unsigned binary is:" + inline_ udword g2b(udword gray) + { + gray ^= (gray >> 16); + gray ^= (gray >> 8); + gray ^= (gray >> 4); + gray ^= (gray >> 2); + gray ^= (gray >> 1); + return gray; + } + + /* + "Just call it repeatedly with various input values and always with the same variable as "memory". + The sharpness determines the degree of filtering, where 0 completely filters out the input, and 1 + does no filtering at all. + + I seem to recall from college that this is called an IIR (Infinite Impulse Response) filter. As opposed + to the more typical FIR (Finite Impulse Response). + + Also, I'd say that you can make more intelligent and interesting filters than this, for example filters + that remove wrong responses from the mouse because it's being moved too fast. You'd want such a filter + to be applied before this one, of course." + + (JCAB on Flipcode) + */ + inline_ float FeedbackFilter(float val, float& memory, float sharpness) + { + ASSERT(sharpness>=0.0f && sharpness<=1.0f && "Invalid sharpness value in feedback filter"); + if(sharpness<0.0f) sharpness = 0.0f; + else if(sharpness>1.0f) sharpness = 1.0f; + return memory = val * sharpness + memory * (1.0f - sharpness); + } + + //! "If you can guarantee that your input domain (i.e. value of x) is slightly + //! limited (abs(x) must be < ((1<<31u)-32767)), then you can use the + //! following code to clamp the resulting value into [-32768,+32767] range:" + inline_ int ClampToInt16(int x) + { +// ASSERT(abs(x) < (int)((1<<31u)-32767)); + + int delta = 32767 - x; + x += (delta>>31) & delta; + delta = x + 32768; + x -= (delta>>31) & delta; + return x; + } + + // Generic functions + template inline_ void TSwap(Type& a, Type& b) { const Type c = a; a = b; b = c; } + template inline_ Type TClamp(const Type& x, const Type& lo, const Type& hi) { return ((xhi) ? hi : x); } + + template inline_ void TSort(Type& a, Type& b) + { + if(a>b) TSwap(a, b); + } + + template inline_ void TSort(Type& a, Type& b, Type& c) + { + if(a>b) TSwap(a, b); + if(b>c) TSwap(b, c); + if(a>b) TSwap(a, b); + if(b>c) TSwap(b, c); + } + + // Prevent nasty user-manipulations (strategy borrowed from Charles Bloom) +// #define PREVENT_COPY(curclass) void operator = (const curclass& object) { ASSERT(!"Bad use of operator ="); } + // ... actually this is better ! + #define PREVENT_COPY(cur_class) private: cur_class(const cur_class& object); cur_class& operator=(const cur_class& object); + + //! TO BE DOCUMENTED + #define OFFSET_OF(Class, Member) (size_t)&(((Class*)0)->Member) + + //! TO BE DOCUMENTED + #if !defined(_XBOX) + // Already defined on Xbox. + #define ARRAYSIZE(p) (sizeof(p)/sizeof(p[0])) + #endif + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Returns the alignment of the input address. + * \fn Alignment() + * \param address [in] address to check + * \return the best alignment (e.g. 1 for odd addresses, etc) + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + FUNCTION ICECORE_API udword Alignment(udword address); + + #define IS_ALIGNED_2(x) ((x&1)==0) + #define IS_ALIGNED_4(x) ((x&3)==0) + #define IS_ALIGNED_8(x) ((x&7)==0) + + // Updates a pointer with "stride" bytes + inline_ void UpdatePtr(void*& ptr, udword stride) { ptr = ((ubyte*)ptr) + stride; } + + // From Jon Watte IIRC + inline_ void _prefetch(void const* ptr) { (void)*(char const volatile *)ptr; } + + // Compute implicit coords from an index: + // The idea is to get back 2D coords from a 1D index. + // For example: + // + // 0 1 2 ... nbu-1 + // nbu nbu+1 i ... + // + // We have i, we're looking for the equivalent (u=2, v=1) location. + // i = u + v*nbu + // <=> i/nbu = u/nbu + v + // Since 0 <= u < nbu, u/nbu = 0 (integer) + // Hence: v = i/nbu + // Then we simply put it back in the original equation to compute u = i - v*nbu + inline_ void Compute2DCoords(udword& u, udword& v, udword i, udword nbu) + { + v = i / nbu; + u = i - (v * nbu); + } + + // In 3D: i = u + v*nbu + w*nbu*nbv + // <=> i/(nbu*nbv) = u/(nbu*nbv) + v/nbv + w + // u/(nbu*nbv) is null since u/nbu was null already. + // v/nbv is null as well for the same reason. + // Hence w = i/(nbu*nbv) + // Then we're left with a 2D problem: i' = i - w*nbu*nbv = u + v*nbu + inline_ void Compute3DCoords(udword& u, udword& v, udword& w, udword i, udword nbu, udword nbu_nbv) + { + w = i / (nbu_nbv); + Compute2DCoords(u, v, i - (w * nbu_nbv), nbu); + } + + // Calling fsincos instead of fsin+fcos. Twice faster. + inline_ void FSinCos(float& c, float& s, float f) + { + float LocalCos, LocalSin; + float Local = f; +#ifdef WIN32 + _asm fld Local + _asm fsincos + _asm fstp LocalCos + _asm fstp LocalSin +#elif LINUX + asm("fld Local\n\t" + "fsincos\n\t" + "fstp LocalCos\n\t" + "fstp LocalSin\n\t" + ); +#endif + c = LocalCos; + s = LocalSin; + } + + // Modulo3 macros. See http://www.codercorner.com/Modulo3.htm + #define GET_NEXT_INDICES(i, j, k) \ + k = 0x01000201; \ + k>>=(i<<3); \ + j = k & 0xff; \ + k>>=8; \ + k&=0xff; + + #define GET_NEXT_INDICES2(i, j, k) \ + j = ( 9 >> (i<<1)) & 3; \ + k = (18 >> (i<<1)) & 3; + + // 0=>1, 1=>2, 2=>0 + inline_ udword Modulo3(udword i) + { + ASSERT(i==0 || i==1 || i==2); + return (9 >> (i << 1)) & 3; + } + +#endif // ICEUTILS_H diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/_IceAABB.h b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/_IceAABB.h new file mode 100644 index 00000000..23375fa7 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/_IceAABB.h @@ -0,0 +1,522 @@ +/* + * ICE / OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains AABB-related code. (axis-aligned bounding box) + * \file IceAABB.h + * \author Pierre Terdiman + * \date January, 13, 2000 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef __ICEAABB_H__ +#define __ICEAABB_H__ + + // Forward declarations + class Sphere; + +//! Declarations of type-independent methods (most of them implemented in the .cpp) +#define AABB_COMMON_METHODS \ + AABB& Add(const AABB& aabb); \ + float MakeCube(AABB& cube) const; \ + void MakeSphere(Sphere& sphere) const; \ + const sbyte* ComputeOutline(const Point& local_eye, sdword& num) const; \ + float ComputeBoxArea(const Point& eye, const Matrix4x4& mat, float width, float height, sdword& num) const; \ + bool IsInside(const AABB& box) const; \ + bool ComputePlanes(Plane* planes) const; \ + bool ComputePoints(Point* pts) const; \ + const Point* GetVertexNormals() const; \ + const udword* GetEdges() const; \ + const Point* GetEdgeNormals() const; \ + inline_ BOOL ContainsPoint(const Point& p) const \ + { \ + if(p.x > GetMax(0) || p.x < GetMin(0)) return FALSE; \ + if(p.y > GetMax(1) || p.y < GetMin(1)) return FALSE; \ + if(p.z > GetMax(2) || p.z < GetMin(2)) return FALSE; \ + return TRUE; \ + } + + enum AABBType + { + AABB_RENDER = 0, //!< AABB used for rendering. Not visible == not rendered. + AABB_UPDATE = 1, //!< AABB used for dynamic updates. Not visible == not updated. + + AABB_FORCE_DWORD = 0x7fffffff, + }; + +#ifdef USE_MINMAX + + struct ICEMATHS_API ShadowAABB + { + Point mMin; + Point mMax; + }; + + class ICEMATHS_API AABB + { + public: + //! Constructor + inline_ AABB() {} + //! Destructor + inline_ ~AABB() {} + + //! Type-independent methods + AABB_COMMON_METHODS; + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Setups an AABB from min & max vectors. + * \param min [in] the min point + * \param max [in] the max point + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + void SetMinMax(const Point& min, const Point& max) { mMin = min; mMax = max; } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Setups an AABB from center & extents vectors. + * \param c [in] the center point + * \param e [in] the extents vector + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + void SetCenterExtents(const Point& c, const Point& e) { mMin = c - e; mMax = c + e; } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Setups an empty AABB. + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + void SetEmpty() { Point p(MIN_FLOAT, MIN_FLOAT, MIN_FLOAT); mMin = -p; mMax = p;} + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Setups a point AABB. + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + void SetPoint(const Point& pt) { mMin = mMax = pt; } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Gets the size of the AABB. The size is defined as the longest extent. + * \return the size of the AABB + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + float GetSize() const { Point e; GetExtents(e); return e.Max(); } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Extends the AABB. + * \param p [in] the next point + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + void Extend(const Point& p) + { + if(p.x > mMax.x) mMax.x = p.x; + if(p.x < mMin.x) mMin.x = p.x; + + if(p.y > mMax.y) mMax.y = p.y; + if(p.y < mMin.y) mMin.y = p.y; + + if(p.z > mMax.z) mMax.z = p.z; + if(p.z < mMin.z) mMin.z = p.z; + } + // Data access + + //! Get min point of the box + inline_ void GetMin(Point& min) const { min = mMin; } + //! Get max point of the box + inline_ void GetMax(Point& max) const { max = mMax; } + + //! Get component of the box's min point along a given axis + inline_ float GetMin(udword axis) const { return mMin[axis]; } + //! Get component of the box's max point along a given axis + inline_ float GetMax(udword axis) const { return mMax[axis]; } + + //! Get box center + inline_ void GetCenter(Point& center) const { center = (mMax + mMin)*0.5f; } + //! Get box extents + inline_ void GetExtents(Point& extents) const { extents = (mMax - mMin)*0.5f; } + + //! Get component of the box's center along a given axis + inline_ float GetCenter(udword axis) const { return (mMax[axis] + mMin[axis])*0.5f; } + //! Get component of the box's extents along a given axis + inline_ float GetExtents(udword axis) const { return (mMax[axis] - mMin[axis])*0.5f; } + + //! Get box diagonal + inline_ void GetDiagonal(Point& diagonal) const { diagonal = mMax - mMin; } + inline_ float GetWidth() const { return mMax.x - mMin.x; } + inline_ float GetHeight() const { return mMax.y - mMin.y; } + inline_ float GetDepth() const { return mMax.z - mMin.z; } + + //! Volume + inline_ float GetVolume() const { return GetWidth() * GetHeight() * GetDepth(); } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Computes the intersection between two AABBs. + * \param a [in] the other AABB + * \return true on intersection + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ BOOL Intersect(const AABB& a) const + { + if(mMax.x < a.mMin.x + || a.mMax.x < mMin.x + || mMax.y < a.mMin.y + || a.mMax.y < mMin.y + || mMax.z < a.mMin.z + || a.mMax.z < mMin.z) return FALSE; + + return TRUE; + } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Computes the 1D-intersection between two AABBs, on a given axis. + * \param a [in] the other AABB + * \param axis [in] the axis (0, 1, 2) + * \return true on intersection + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ BOOL Intersect(const AABB& a, udword axis) const + { + if(mMax[axis] < a.mMin[axis] || a.mMax[axis] < mMin[axis]) return FALSE; + return TRUE; + } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Recomputes the AABB after an arbitrary transform by a 4x4 matrix. + * Original code by Charles Bloom on the GD-Algorithm list. (I slightly modified it) + * \param mtx [in] the transform matrix + * \param aabb [out] the transformed AABB [can be *this] + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ void Rotate(const Matrix4x4& mtx, AABB& aabb) const + { + // The three edges transformed: you can efficiently transform an X-only vector + // by just getting the "X" column of the matrix + Point vx,vy,vz; + mtx.GetRow(0, vx); vx *= (mMax.x - mMin.x); + mtx.GetRow(1, vy); vy *= (mMax.y - mMin.y); + mtx.GetRow(2, vz); vz *= (mMax.z - mMin.z); + + // Transform the min point + aabb.mMin = aabb.mMax = mMin * mtx; + + // Take the transformed min & axes and find new extents + // Using CPU code in the right place is faster... + if(IS_NEGATIVE_FLOAT(vx.x)) aabb.mMin.x += vx.x; else aabb.mMax.x += vx.x; + if(IS_NEGATIVE_FLOAT(vx.y)) aabb.mMin.y += vx.y; else aabb.mMax.y += vx.y; + if(IS_NEGATIVE_FLOAT(vx.z)) aabb.mMin.z += vx.z; else aabb.mMax.z += vx.z; + if(IS_NEGATIVE_FLOAT(vy.x)) aabb.mMin.x += vy.x; else aabb.mMax.x += vy.x; + if(IS_NEGATIVE_FLOAT(vy.y)) aabb.mMin.y += vy.y; else aabb.mMax.y += vy.y; + if(IS_NEGATIVE_FLOAT(vy.z)) aabb.mMin.z += vy.z; else aabb.mMax.z += vy.z; + if(IS_NEGATIVE_FLOAT(vz.x)) aabb.mMin.x += vz.x; else aabb.mMax.x += vz.x; + if(IS_NEGATIVE_FLOAT(vz.y)) aabb.mMin.y += vz.y; else aabb.mMax.y += vz.y; + if(IS_NEGATIVE_FLOAT(vz.z)) aabb.mMin.z += vz.z; else aabb.mMax.z += vz.z; + } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Checks the AABB is valid. + * \return true if the box is valid + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ BOOL IsValid() const + { + // Consistency condition for (Min, Max) boxes: min < max + if(mMin.x > mMax.x) return FALSE; + if(mMin.y > mMax.y) return FALSE; + if(mMin.z > mMax.z) return FALSE; + return TRUE; + } + + //! Operator for AABB *= float. Scales the extents, keeps same center. + inline_ AABB& operator*=(float s) + { + Point Center; GetCenter(Center); + Point Extents; GetExtents(Extents); + SetCenterExtents(Center, Extents * s); + return *this; + } + + //! Operator for AABB /= float. Scales the extents, keeps same center. + inline_ AABB& operator/=(float s) + { + Point Center; GetCenter(Center); + Point Extents; GetExtents(Extents); + SetCenterExtents(Center, Extents / s); + return *this; + } + + //! Operator for AABB += Point. Translates the box. + inline_ AABB& operator+=(const Point& trans) + { + mMin+=trans; + mMax+=trans; + return *this; + } + private: + Point mMin; //!< Min point + Point mMax; //!< Max point + }; + +#else + + class ICEMATHS_API AABB + { + public: + //! Constructor + inline_ AABB() {} + //! Destructor + inline_ ~AABB() {} + + //! Type-independent methods + AABB_COMMON_METHODS; + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Setups an AABB from min & max vectors. + * \param min [in] the min point + * \param max [in] the max point + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + void SetMinMax(const Point& min, const Point& max) { mCenter = (max + min)*0.5f; mExtents = (max - min)*0.5f; } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Setups an AABB from center & extents vectors. + * \param c [in] the center point + * \param e [in] the extents vector + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + void SetCenterExtents(const Point& c, const Point& e) { mCenter = c; mExtents = e; } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Setups an empty AABB. + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + void SetEmpty() { mCenter.Zero(); mExtents.Set(MIN_FLOAT, MIN_FLOAT, MIN_FLOAT);} + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Setups a point AABB. + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + void SetPoint(const Point& pt) { mCenter = pt; mExtents.Zero(); } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Gets the size of the AABB. The size is defined as the longest extent. + * \return the size of the AABB + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + float GetSize() const { return mExtents.Max(); } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Extends the AABB. + * \param p [in] the next point + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + void Extend(const Point& p) + { + Point Max = mCenter + mExtents; + Point Min = mCenter - mExtents; + + if(p.x > Max.x) Max.x = p.x; + if(p.x < Min.x) Min.x = p.x; + + if(p.y > Max.y) Max.y = p.y; + if(p.y < Min.y) Min.y = p.y; + + if(p.z > Max.z) Max.z = p.z; + if(p.z < Min.z) Min.z = p.z; + + SetMinMax(Min, Max); + } + // Data access + + //! Get min point of the box + inline_ void GetMin(Point& min) const { min = mCenter - mExtents; } + //! Get max point of the box + inline_ void GetMax(Point& max) const { max = mCenter + mExtents; } + + //! Get component of the box's min point along a given axis + inline_ float GetMin(udword axis) const { return mCenter[axis] - mExtents[axis]; } + //! Get component of the box's max point along a given axis + inline_ float GetMax(udword axis) const { return mCenter[axis] + mExtents[axis]; } + + //! Get box center + inline_ void GetCenter(Point& center) const { center = mCenter; } + //! Get box extents + inline_ void GetExtents(Point& extents) const { extents = mExtents; } + + //! Get component of the box's center along a given axis + inline_ float GetCenter(udword axis) const { return mCenter[axis]; } + //! Get component of the box's extents along a given axis + inline_ float GetExtents(udword axis) const { return mExtents[axis]; } + + //! Get box diagonal + inline_ void GetDiagonal(Point& diagonal) const { diagonal = mExtents * 2.0f; } + inline_ float GetWidth() const { return mExtents.x * 2.0f; } + inline_ float GetHeight() const { return mExtents.y * 2.0f; } + inline_ float GetDepth() const { return mExtents.z * 2.0f; } + + //! Volume + inline_ float GetVolume() const { return mExtents.x * mExtents.y * mExtents.z * 8.0f; } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Computes the intersection between two AABBs. + * \param a [in] the other AABB + * \return true on intersection + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ BOOL Intersect(const AABB& a) const + { + float tx = mCenter.x - a.mCenter.x; float ex = a.mExtents.x + mExtents.x; if(AIR(tx) > IR(ex)) return FALSE; + float ty = mCenter.y - a.mCenter.y; float ey = a.mExtents.y + mExtents.y; if(AIR(ty) > IR(ey)) return FALSE; + float tz = mCenter.z - a.mCenter.z; float ez = a.mExtents.z + mExtents.z; if(AIR(tz) > IR(ez)) return FALSE; + return TRUE; + } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * The standard intersection method from Gamasutra. Just here to check its speed against the one above. + * \param a [in] the other AABB + * \return true on intersection + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ bool GomezIntersect(const AABB& a) + { + Point T = mCenter - a.mCenter; // Vector from A to B + return ((fabsf(T.x) <= (a.mExtents.x + mExtents.x)) + && (fabsf(T.y) <= (a.mExtents.y + mExtents.y)) + && (fabsf(T.z) <= (a.mExtents.z + mExtents.z))); + } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Computes the 1D-intersection between two AABBs, on a given axis. + * \param a [in] the other AABB + * \param axis [in] the axis (0, 1, 2) + * \return true on intersection + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ BOOL Intersect(const AABB& a, udword axis) const + { + float t = mCenter[axis] - a.mCenter[axis]; + float e = a.mExtents[axis] + mExtents[axis]; + if(AIR(t) > IR(e)) return FALSE; + return TRUE; + } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Recomputes the AABB after an arbitrary transform by a 4x4 matrix. + * \param mtx [in] the transform matrix + * \param aabb [out] the transformed AABB [can be *this] + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ void Rotate(const Matrix4x4& mtx, AABB& aabb) const + { + // Compute new center + aabb.mCenter = mCenter * mtx; + + // Compute new extents. FPU code & CPU code have been interleaved for improved performance. + Point Ex(mtx.m[0][0] * mExtents.x, mtx.m[0][1] * mExtents.x, mtx.m[0][2] * mExtents.x); + IR(Ex.x)&=0x7fffffff; IR(Ex.y)&=0x7fffffff; IR(Ex.z)&=0x7fffffff; + + Point Ey(mtx.m[1][0] * mExtents.y, mtx.m[1][1] * mExtents.y, mtx.m[1][2] * mExtents.y); + IR(Ey.x)&=0x7fffffff; IR(Ey.y)&=0x7fffffff; IR(Ey.z)&=0x7fffffff; + + Point Ez(mtx.m[2][0] * mExtents.z, mtx.m[2][1] * mExtents.z, mtx.m[2][2] * mExtents.z); + IR(Ez.x)&=0x7fffffff; IR(Ez.y)&=0x7fffffff; IR(Ez.z)&=0x7fffffff; + + aabb.mExtents.x = Ex.x + Ey.x + Ez.x; + aabb.mExtents.y = Ex.y + Ey.y + Ez.y; + aabb.mExtents.z = Ex.z + Ey.z + Ez.z; + } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Checks the AABB is valid. + * \return true if the box is valid + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ BOOL IsValid() const + { + // Consistency condition for (Center, Extents) boxes: Extents >= 0 + if(IS_NEGATIVE_FLOAT(mExtents.x)) return FALSE; + if(IS_NEGATIVE_FLOAT(mExtents.y)) return FALSE; + if(IS_NEGATIVE_FLOAT(mExtents.z)) return FALSE; + return TRUE; + } + + //! Operator for AABB *= float. Scales the extents, keeps same center. + inline_ AABB& operator*=(float s) { mExtents*=s; return *this; } + + //! Operator for AABB /= float. Scales the extents, keeps same center. + inline_ AABB& operator/=(float s) { mExtents/=s; return *this; } + + //! Operator for AABB += Point. Translates the box. + inline_ AABB& operator+=(const Point& trans) + { + mCenter+=trans; + return *this; + } + private: + Point mCenter; //!< AABB Center + Point mExtents; //!< x, y and z extents + }; + +#endif + + inline_ void ComputeMinMax(const Point& p, Point& min, Point& max) + { + if(p.x > max.x) max.x = p.x; + if(p.x < min.x) min.x = p.x; + + if(p.y > max.y) max.y = p.y; + if(p.y < min.y) min.y = p.y; + + if(p.z > max.z) max.z = p.z; + if(p.z < min.z) min.z = p.z; + } + + inline_ void ComputeAABB(AABB& aabb, const Point* list, udword nb_pts) + { + if(list) + { + Point Maxi(MIN_FLOAT, MIN_FLOAT, MIN_FLOAT); + Point Mini(MAX_FLOAT, MAX_FLOAT, MAX_FLOAT); + while(nb_pts--) + { +// _prefetch(list+1); // off by one ? + ComputeMinMax(*list++, Mini, Maxi); + } + aabb.SetMinMax(Mini, Maxi); + } + } + +#endif // __ICEAABB_H__ diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/_IceContainer.cpp b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/_IceContainer.cpp new file mode 100644 index 00000000..b5b67343 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/_IceContainer.cpp @@ -0,0 +1,361 @@ +/* + * ICE / OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains a simple container class. + * \file IceContainer.cpp + * \author Pierre Terdiman + * \date February, 5, 2000 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains a list of 32-bits values. + * Use this class when you need to store an unknown number of values. The list is automatically + * resized and can contains 32-bits entities (dwords or floats) + * + * \class Container + * \author Pierre Terdiman + * \version 1.0 + * \date 08.15.98 +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Precompiled Header +#include "Stdafx.h" + +using namespace IceCore; + +// Static members +#ifdef CONTAINER_STATS +udword Container::mNbContainers = 0; +udword Container::mUsedRam = 0; +#endif + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Constructor. No entries allocated there. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +Container::Container() : mMaxNbEntries(0), mCurNbEntries(0), mEntries(null), mGrowthFactor(2.0f) +{ +#ifdef CONTAINER_STATS + mNbContainers++; + mUsedRam+=sizeof(Container); +#endif +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Constructor. Also allocates a given number of entries. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +Container::Container(udword size, float growth_factor) : mMaxNbEntries(0), mCurNbEntries(0), mEntries(null), mGrowthFactor(growth_factor) +{ +#ifdef CONTAINER_STATS + mNbContainers++; + mUsedRam+=sizeof(Container); +#endif + SetSize(size); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Copy constructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +Container::Container(const Container& object) : mMaxNbEntries(0), mCurNbEntries(0), mEntries(null), mGrowthFactor(2.0f) +{ +#ifdef CONTAINER_STATS + mNbContainers++; + mUsedRam+=sizeof(Container); +#endif + *this = object; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Destructor. Frees everything and leaves. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +Container::~Container() +{ + Empty(); +#ifdef CONTAINER_STATS + mNbContainers--; + mUsedRam-=GetUsedRam(); +#endif +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Clears the container. All stored values are deleted, and it frees used ram. + * \see Reset() + * \return Self-Reference + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +Container& Container::Empty() +{ +#ifdef CONTAINER_STATS + mUsedRam-=mMaxNbEntries*sizeof(udword); +#endif + DELETEARRAY(mEntries); + mCurNbEntries = mMaxNbEntries = 0; + return *this; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Resizes the container. + * \param needed [in] assume the container can be added at least "needed" values + * \return true if success. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool Container::Resize(udword needed) +{ +#ifdef CONTAINER_STATS + // Subtract previous amount of bytes + mUsedRam-=mMaxNbEntries*sizeof(udword); +#endif + + // Get more entries + mMaxNbEntries = mMaxNbEntries ? udword(float(mMaxNbEntries)*mGrowthFactor) : 2; // Default nb Entries = 2 + if(mMaxNbEntriesmMaxNbEntries) Resize(nb); + + // Add new entry + CopyMemory(&mEntries[mCurNbEntries], entries, nb*sizeof(udword)); + mCurNbEntries+=nb; + return *this; + } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * A O(1) method to add a value in the container. The container is automatically resized if needed. + * The method is inline, not the resize. The call overhead happens on resizes only, which is not a problem since the resizing operation + * costs a lot more than the call overhead... + * + * \param entry [in] a float to store in the container + * \see Add(udword entry) + * \see Empty() + * \see Contains(udword entry) + * \return Self-Reference + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ Container& Add(float entry) + { + // Resize if needed + if(mCurNbEntries==mMaxNbEntries) Resize(); + + // Add new entry + mEntries[mCurNbEntries++] = IR(entry); + return *this; + } + + inline_ Container& Add(const float* entries, udword nb) + { + // Resize if needed + if(mCurNbEntries+nb>mMaxNbEntries) Resize(nb); + + // Add new entry + CopyMemory(&mEntries[mCurNbEntries], entries, nb*sizeof(float)); + mCurNbEntries+=nb; + return *this; + } + + //! Add unique [slow] + inline_ Container& AddUnique(udword entry) + { + if(!Contains(entry)) Add(entry); + return *this; + } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Clears the container. All stored values are deleted, and it frees used ram. + * \see Reset() + * \return Self-Reference + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + Container& Empty(); + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Resets the container. Stored values are discarded but the buffer is kept so that further calls don't need resizing again. + * That's a kind of temporal coherence. + * \see Empty() + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ void Reset() + { + // Avoid the write if possible + // ### CMOV + if(mCurNbEntries) mCurNbEntries = 0; + } + + // HANDLE WITH CARE + inline_ void ForceSize(udword size) + { + mCurNbEntries = size; + } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Sets the initial size of the container. If it already contains something, it's discarded. + * \param nb [in] Number of entries + * \return true if success + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + bool SetSize(udword nb); + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Refits the container and get rid of unused bytes. + * \return true if success + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + bool Refit(); + + // Checks whether the container already contains a given value. + bool Contains(udword entry, udword* location=null) const; + // Deletes an entry - doesn't preserve insertion order. + bool Delete(udword entry); + // Deletes an entry - does preserve insertion order. + bool DeleteKeepingOrder(udword entry); + //! Deletes the very last entry. + inline_ void DeleteLastEntry() { if(mCurNbEntries) mCurNbEntries--; } + //! Deletes the entry whose index is given + inline_ void DeleteIndex(udword index) { mEntries[index] = mEntries[--mCurNbEntries]; } + + // Helpers + Container& FindNext(udword& entry, FindMode find_mode=FIND_CLAMP); + Container& FindPrev(udword& entry, FindMode find_mode=FIND_CLAMP); + // Data access. + inline_ udword GetNbEntries() const { return mCurNbEntries; } //!< Returns the current number of entries. + inline_ udword GetEntry(udword i) const { return mEntries[i]; } //!< Returns ith entry + inline_ udword* GetEntries() const { return mEntries; } //!< Returns the list of entries. + + inline_ udword GetFirst() const { return mEntries[0]; } + inline_ udword GetLast() const { return mEntries[mCurNbEntries-1]; } + + // Growth control + inline_ float GetGrowthFactor() const { return mGrowthFactor; } //!< Returns the growth factor + inline_ void SetGrowthFactor(float growth) { mGrowthFactor = growth; } //!< Sets the growth factor + inline_ bool IsFull() const { return mCurNbEntries==mMaxNbEntries; } //!< Checks the container is full + inline_ BOOL IsNotEmpty() const { return mCurNbEntries; } //!< Checks the container is empty + + //! Read-access as an array + inline_ udword operator[](udword i) const { ASSERT(i>=0 && i=0 && i>31); + return (float&)y; + } + + //! Computes 1.0f / sqrtf(x). + inline_ float frsqrt(float f) + { + float x = f * 0.5f; + udword y = 0x5f3759df - ((udword&)f >> 1); + // Iteration... + (float&)y = (float&)y * ( 1.5f - ( x * (float&)y * (float&)y ) ); + // Result + return (float&)y; + } + + //! Computes 1.0f / sqrtf(x). Comes from NVIDIA. + inline_ float InvSqrt(const float& x) + { + udword tmp = (udword(IEEE_1_0 << 1) + IEEE_1_0 - *(udword*)&x) >> 1; + float y = *(float*)&tmp; + return y * (1.47f - 0.47f * x * y * y); + } + + //! Computes 1.0f / sqrtf(x). Comes from Quake3. Looks like the first one I had above. + //! See http://www.magic-software.com/3DGEDInvSqrt.html + inline_ float RSqrt(float number) + { + long i; + float x2, y; + const float threehalfs = 1.5f; + + x2 = number * 0.5f; + y = number; + i = * (long *) &y; + i = 0x5f3759df - (i >> 1); + y = * (float *) &i; + y = y * (threehalfs - (x2 * y * y)); + + return y; + } + + //! TO BE DOCUMENTED + inline_ float fsqrt(float f) + { + udword y = ( ( (sdword&)f - 0x3f800000 ) >> 1 ) + 0x3f800000; + // Iteration...? + // (float&)y = (3.0f - ((float&)y * (float&)y) / f) * (float&)y * 0.5f; + // Result + return (float&)y; + } + + //! Returns the float ranged espilon value. + inline_ float fepsilon(float f) + { + udword b = (udword&)f & 0xff800000; + udword a = b | 0x00000001; + (float&)a -= (float&)b; + // Result + return (float&)a; + } + + //! Is the float valid ? + inline_ bool IsNAN(float value) { return (IR(value)&0x7f800000) == 0x7f800000; } + inline_ bool IsIndeterminate(float value) { return IR(value) == 0xffc00000; } + inline_ bool IsPlusInf(float value) { return IR(value) == 0x7f800000; } + inline_ bool IsMinusInf(float value) { return IR(value) == 0xff800000; } + + inline_ bool IsValidFloat(float value) + { + if(IsNAN(value)) return false; + if(IsIndeterminate(value)) return false; + if(IsPlusInf(value)) return false; + if(IsMinusInf(value)) return false; + return true; + } + + #define CHECK_VALID_FLOAT(x) ASSERT(IsValidFloat(x)); + +/* + //! FPU precision setting function. + inline_ void SetFPU() + { + // This function evaluates whether the floating-point + // control word is set to single precision/round to nearest/ + // exceptions disabled. If these conditions don't hold, the + // function changes the control word to set them and returns + // TRUE, putting the old control word value in the passback + // location pointed to by pwOldCW. + { + uword wTemp, wSave; + + __asm fstcw wSave + if (wSave & 0x300 || // Not single mode + 0x3f != (wSave & 0x3f) || // Exceptions enabled + wSave & 0xC00) // Not round to nearest mode + { + __asm + { + mov ax, wSave + and ax, not 300h ;; single mode + or ax, 3fh ;; disable all exceptions + and ax, not 0xC00 ;; round to nearest mode + mov wTemp, ax + fldcw wTemp + } + } + } + } +*/ + //! This function computes the slowest possible floating-point value (you can also directly use FLT_EPSILON) + inline_ float ComputeFloatEpsilon() + { + float f = 1.0f; + ((udword&)f)^=1; + return f - 1.0f; // You can check it's the same as FLT_EPSILON + } + + inline_ bool IsFloatZero(float x, float epsilon=1e-6f) + { + return x*x < epsilon; + } + + #define FCOMI_ST0 _asm _emit 0xdb _asm _emit 0xf0 + #define FCOMIP_ST0 _asm _emit 0xdf _asm _emit 0xf0 + #define FCMOVB_ST0 _asm _emit 0xda _asm _emit 0xc0 + #define FCMOVNB_ST0 _asm _emit 0xdb _asm _emit 0xc0 + + #define FCOMI_ST1 _asm _emit 0xdb _asm _emit 0xf1 + #define FCOMIP_ST1 _asm _emit 0xdf _asm _emit 0xf1 + #define FCMOVB_ST1 _asm _emit 0xda _asm _emit 0xc1 + #define FCMOVNB_ST1 _asm _emit 0xdb _asm _emit 0xc1 + + #define FCOMI_ST2 _asm _emit 0xdb _asm _emit 0xf2 + #define FCOMIP_ST2 _asm _emit 0xdf _asm _emit 0xf2 + #define FCMOVB_ST2 _asm _emit 0xda _asm _emit 0xc2 + #define FCMOVNB_ST2 _asm _emit 0xdb _asm _emit 0xc2 + + #define FCOMI_ST3 _asm _emit 0xdb _asm _emit 0xf3 + #define FCOMIP_ST3 _asm _emit 0xdf _asm _emit 0xf3 + #define FCMOVB_ST3 _asm _emit 0xda _asm _emit 0xc3 + #define FCMOVNB_ST3 _asm _emit 0xdb _asm _emit 0xc3 + + #define FCOMI_ST4 _asm _emit 0xdb _asm _emit 0xf4 + #define FCOMIP_ST4 _asm _emit 0xdf _asm _emit 0xf4 + #define FCMOVB_ST4 _asm _emit 0xda _asm _emit 0xc4 + #define FCMOVNB_ST4 _asm _emit 0xdb _asm _emit 0xc4 + + #define FCOMI_ST5 _asm _emit 0xdb _asm _emit 0xf5 + #define FCOMIP_ST5 _asm _emit 0xdf _asm _emit 0xf5 + #define FCMOVB_ST5 _asm _emit 0xda _asm _emit 0xc5 + #define FCMOVNB_ST5 _asm _emit 0xdb _asm _emit 0xc5 + + #define FCOMI_ST6 _asm _emit 0xdb _asm _emit 0xf6 + #define FCOMIP_ST6 _asm _emit 0xdf _asm _emit 0xf6 + #define FCMOVB_ST6 _asm _emit 0xda _asm _emit 0xc6 + #define FCMOVNB_ST6 _asm _emit 0xdb _asm _emit 0xc6 + + #define FCOMI_ST7 _asm _emit 0xdb _asm _emit 0xf7 + #define FCOMIP_ST7 _asm _emit 0xdf _asm _emit 0xf7 + #define FCMOVB_ST7 _asm _emit 0xda _asm _emit 0xc7 + #define FCMOVNB_ST7 _asm _emit 0xdb _asm _emit 0xc7 + + //! A global function to find MAX(a,b) using FCOMI/FCMOV + inline_ float FCMax2(float a, float b) + { + float Res; + _asm fld [a] + _asm fld [b] + FCOMI_ST1 + FCMOVB_ST1 + _asm fstp [Res] + _asm fcomp + return Res; + } + + //! A global function to find MIN(a,b) using FCOMI/FCMOV + inline_ float FCMin2(float a, float b) + { + float Res; + _asm fld [a] + _asm fld [b] + FCOMI_ST1 + FCMOVNB_ST1 + _asm fstp [Res] + _asm fcomp + return Res; + } + + //! A global function to find MAX(a,b,c) using FCOMI/FCMOV + inline_ float FCMax3(float a, float b, float c) + { + float Res; + _asm fld [a] + _asm fld [b] + _asm fld [c] + FCOMI_ST1 + FCMOVB_ST1 + FCOMI_ST2 + FCMOVB_ST2 + _asm fstp [Res] + _asm fcompp + return Res; + } + + //! A global function to find MIN(a,b,c) using FCOMI/FCMOV + inline_ float FCMin3(float a, float b, float c) + { + float Res; + _asm fld [a] + _asm fld [b] + _asm fld [c] + FCOMI_ST1 + FCMOVNB_ST1 + FCOMI_ST2 + FCMOVNB_ST2 + _asm fstp [Res] + _asm fcompp + return Res; + } + + inline_ int ConvertToSortable(float f) + { + int& Fi = (int&)f; + int Fmask = (Fi>>31); + Fi ^= Fmask; + Fmask &= ~(1<<31); + Fi -= Fmask; + return Fi; + } + + enum FPUMode + { + FPU_FLOOR = 0, + FPU_CEIL = 1, + FPU_BEST = 2, + + FPU_FORCE_DWORD = 0x7fffffff + }; + + FUNCTION ICECORE_API FPUMode GetFPUMode(); + FUNCTION ICECORE_API void SaveFPU(); + FUNCTION ICECORE_API void RestoreFPU(); + FUNCTION ICECORE_API void SetFPUFloorMode(); + FUNCTION ICECORE_API void SetFPUCeilMode(); + FUNCTION ICECORE_API void SetFPUBestMode(); + + FUNCTION ICECORE_API void SetFPUPrecision24(); + FUNCTION ICECORE_API void SetFPUPrecision53(); + FUNCTION ICECORE_API void SetFPUPrecision64(); + FUNCTION ICECORE_API void SetFPURoundingChop(); + FUNCTION ICECORE_API void SetFPURoundingUp(); + FUNCTION ICECORE_API void SetFPURoundingDown(); + FUNCTION ICECORE_API void SetFPURoundingNear(); + + FUNCTION ICECORE_API int intChop(const float& f); + FUNCTION ICECORE_API int intFloor(const float& f); + FUNCTION ICECORE_API int intCeil(const float& f); + +#endif // __ICEFPU_H__ diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/_IceMemoryMacros.h b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/_IceMemoryMacros.h new file mode 100644 index 00000000..c1867dcc --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/_IceMemoryMacros.h @@ -0,0 +1,121 @@ +/* + * ICE / OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains all memory macros. + * \file IceMemoryMacros.h + * \author Pierre Terdiman + * \date April, 4, 2000 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef __ICEMEMORYMACROS_H__ +#define __ICEMEMORYMACROS_H__ + +#undef ZeroMemory +#undef CopyMemory +#undef MoveMemory +#undef FillMemory + + //! Clears a buffer. + //! \param addr [in] buffer address + //! \param size [in] buffer length + //! \see FillMemory + //! \see StoreDwords + //! \see CopyMemory + //! \see MoveMemory + inline_ void ZeroMemory(void* addr, udword size) { memset(addr, 0, size); } + + //! Fills a buffer with a given byte. + //! \param addr [in] buffer address + //! \param size [in] buffer length + //! \param val [in] the byte value + //! \see StoreDwords + //! \see ZeroMemory + //! \see CopyMemory + //! \see MoveMemory + inline_ void FillMemory(void* dest, udword size, ubyte val) { memset(dest, val, size); } + + //! Fills a buffer with a given dword. + //! \param addr [in] buffer address + //! \param nb [in] number of dwords to write + //! \param value [in] the dword value + //! \see FillMemory + //! \see ZeroMemory + //! \see CopyMemory + //! \see MoveMemory + //! \warning writes nb*4 bytes ! + inline_ void StoreDwords(udword* dest, udword nb, udword value) + { + // The asm code below **SHOULD** be equivalent to one of those C versions + // or the other if your compiled is good: (checked on VC++ 6.0) + // + // 1) while(nb--) *dest++ = value; + // + // 2) for(udword i=0;iRelease(); (x) = null; } //!< Safe D3D-style release + #define SAFE_DESTRUCT(x) if (x) { (x)->SelfDestruct(); (x) = null; } //!< Safe ICE-style release + +#ifdef __ICEERROR_H__ + #define CHECKALLOC(x) if(!x) return SetIceError("Out of memory.", EC_OUT_OF_MEMORY); //!< Standard alloc checking. HANDLE WITH CARE. +#else + #define CHECKALLOC(x) if(!x) return false; +#endif + + //! Standard allocation cycle + #define SAFE_ALLOC(ptr, type, count) DELETEARRAY(ptr); ptr = new type[count]; CHECKALLOC(ptr); + +#endif // __ICEMEMORYMACROS_H__ diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/_IcePreprocessor.h b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/_IcePreprocessor.h new file mode 100644 index 00000000..80193437 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/_IcePreprocessor.h @@ -0,0 +1,144 @@ +/* + * ICE / OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains preprocessor stuff. This should be the first included header. + * \file IcePreprocessor.h + * \author Pierre Terdiman + * \date April, 4, 2000 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef __ICEPREPROCESSOR_H__ +#define __ICEPREPROCESSOR_H__ + + // Check platform + #if defined( _WIN32 ) || defined( WIN32 ) + #pragma message("Compiling on Windows...") + #define PLATFORM_WINDOWS + #else + #pragma message("Compiling on unknown platform...") + #endif + + // Check compiler + #if defined(_MSC_VER) + #pragma message("Compiling with VC++...") + #define COMPILER_VISUAL_CPP + #else + #pragma message("Compiling with unknown compiler...") + #endif + + // Check compiler options. If this file is included in user-apps, this + // shouldn't be needed, so that they can use what they like best. + #ifndef ICE_DONT_CHECK_COMPILER_OPTIONS + #ifdef COMPILER_VISUAL_CPP + #if defined(_CHAR_UNSIGNED) + #endif + + #if defined(_CPPRTTI) + #error Please disable RTTI... + #endif + + #if defined(_CPPUNWIND) + #error Please disable exceptions... + #endif + + #if defined(_MT) + // Multithreading + #endif + #endif + #endif + + // Check debug mode + #ifdef DEBUG // May be defined instead of _DEBUG. Let's fix it. + #ifndef _DEBUG + #define _DEBUG + #endif + #endif + + #ifdef _DEBUG + // Here you may define items for debug builds + #endif + + #ifndef THIS_FILE + #define THIS_FILE __FILE__ + #endif + + #ifndef ICE_NO_DLL + #ifdef ICECORE_EXPORTS + #define ICECORE_API __declspec(dllexport) + #else + #define ICECORE_API __declspec(dllimport) + #endif + #else + #define ICECORE_API + #endif + + // Don't override new/delete +// #define DEFAULT_NEWDELETE + #define DONT_TRACK_MEMORY_LEAKS + + #define FUNCTION extern "C" + + // Cosmetic stuff [mainly useful with multiple inheritance] + #define override(base_class) virtual + + // Our own inline keyword, so that: + // - we can switch to __forceinline to check it's really better or not + // - we can remove __forceinline if the compiler doesn't support it +// #define inline_ __forceinline +// #define inline_ inline + + // Contributed by Bruce Mitchener + #if defined(COMPILER_VISUAL_CPP) + #define inline_ __forceinline +// #define inline_ inline + #elif defined(__GNUC__) && __GNUC__ < 3 + #define inline_ inline + #elif defined(__GNUC__) + #define inline_ inline __attribute__ ((always_inline)) + #else + #define inline_ inline + #endif + + // Down the hatch + #pragma inline_depth( 255 ) + + #ifdef COMPILER_VISUAL_CPP + #pragma intrinsic(memcmp) + #pragma intrinsic(memcpy) + #pragma intrinsic(memset) + #pragma intrinsic(strcat) + #pragma intrinsic(strcmp) + #pragma intrinsic(strcpy) + #pragma intrinsic(strlen) + #pragma intrinsic(abs) + #pragma intrinsic(labs) + #endif + + // ANSI compliance + #ifdef _DEBUG + // Remove painful warning in debug + inline_ bool __False__(){ return false; } + #define for if(__False__()){} else for + #else + #define for if(0){} else for + #endif + +#endif // __ICEPREPROCESSOR_H__ diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/_IceRevisitedRadix.cpp b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/_IceRevisitedRadix.cpp new file mode 100644 index 00000000..15e2468a --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Ice/_IceRevisitedRadix.cpp @@ -0,0 +1,536 @@ +/* + * ICE / OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains source code from the article "Radix Sort Revisited". + * \file IceRevisitedRadix.cpp + * \author Pierre Terdiman + * \date April, 4, 2000 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Revisited Radix Sort. + * This is my new radix routine: + * - it uses indices and doesn't recopy the values anymore, hence wasting less ram + * - it creates all the histograms in one run instead of four + * - it sorts words faster than dwords and bytes faster than words + * - it correctly sorts negative floating-point values by patching the offsets + * - it automatically takes advantage of temporal coherence + * - multiple keys support is a side effect of temporal coherence + * - it may be worth recoding in asm... (mainly to use FCOMI, FCMOV, etc) [it's probably memory-bound anyway] + * + * History: + * - 08.15.98: very first version + * - 04.04.00: recoded for the radix article + * - 12.xx.00: code lifting + * - 09.18.01: faster CHECK_PASS_VALIDITY thanks to Mark D. Shattuck (who provided other tips, not included here) + * - 10.11.01: added local ram support + * - 01.20.02: bugfix! In very particular cases the last pass was skipped in the float code-path, leading to incorrect sorting...... + * - 01.02.02: - "mIndices" renamed => "mRanks". That's a rank sorter after all. + * - ranks are not "reset" anymore, but implicit on first calls + * - 07.05.02: - offsets rewritten with one less indirection. + * - 11.03.02: - "bool" replaced with RadixHint enum + * + * \class RadixSort + * \author Pierre Terdiman + * \version 1.4 + * \date August, 15, 1998 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/* +To do: + - add an offset parameter between two input values (avoid some data recopy sometimes) + - unroll ? asm ? + - 11 bits trick & 3 passes as Michael did + - prefetch stuff the day I have a P3 + - make a version with 16-bits indices ? +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Precompiled Header +#include "Stdafx.h" + +using namespace IceCore; + +#define INVALIDATE_RANKS mCurrentSize|=0x80000000 +#define VALIDATE_RANKS mCurrentSize&=0x7fffffff +#define CURRENT_SIZE (mCurrentSize&0x7fffffff) +#define INVALID_RANKS (mCurrentSize&0x80000000) + +#define CHECK_RESIZE(n) \ + if(n!=mPreviousSize) \ + { \ + if(n>mCurrentSize) Resize(n); \ + else ResetRanks(); \ + mPreviousSize = n; \ + } + +#define CREATE_HISTOGRAMS(type, buffer) \ + /* Clear counters/histograms */ \ + ZeroMemory(mHistogram, 256*4*sizeof(udword)); \ + \ + /* Prepare to count */ \ + ubyte* p = (ubyte*)input; \ + ubyte* pe = &p[nb*4]; \ + udword* h0= &mHistogram[0]; /* Histogram for first pass (LSB) */ \ + udword* h1= &mHistogram[256]; /* Histogram for second pass */ \ + udword* h2= &mHistogram[512]; /* Histogram for third pass */ \ + udword* h3= &mHistogram[768]; /* Histogram for last pass (MSB) */ \ + \ + bool AlreadySorted = true; /* Optimism... */ \ + \ + if(INVALID_RANKS) \ + { \ + /* Prepare for temporal coherence */ \ + type* Running = (type*)buffer; \ + type PrevVal = *Running; \ + \ + while(p!=pe) \ + { \ + /* Read input buffer in previous sorted order */ \ + type Val = *Running++; \ + /* Check whether already sorted or not */ \ + if(ValCurSize) Resize(nb); + mCurrentSize = nb; + INVALIDATE_RANKS; + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Main sort routine. + * This one is for integer values. After the call, mRanks contains a list of indices in sorted order, i.e. in the order you may process your data. + * \param input [in] a list of integer values to sort + * \param nb [in] number of values to sort, must be < 2^31 + * \param hint [in] RADIX_SIGNED to handle negative values, RADIX_UNSIGNED if you know your input buffer only contains positive values + * \return Self-Reference + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +RadixSort& RadixSort::Sort(const udword* input, udword nb, RadixHint hint) +{ + // Checkings + if(!input || !nb || nb&0x80000000) return *this; + + // Stats + mTotalCalls++; + + // Resize lists if needed + CheckResize(nb); + +#ifdef RADIX_LOCAL_RAM + // Allocate histograms & offsets on the stack + udword mHistogram[256*4]; +// udword mOffset[256]; + udword* mLink[256]; +#endif + + // Create histograms (counters). Counters for all passes are created in one run. + // Pros: read input buffer once instead of four times + // Cons: mHistogram is 4Kb instead of 1Kb + // We must take care of signed/unsigned values for temporal coherence.... I just + // have 2 code paths even if just a single opcode changes. Self-modifying code, someone? + if(hint==RADIX_UNSIGNED) { CREATE_HISTOGRAMS(udword, input); } + else { CREATE_HISTOGRAMS(sdword, input); } + + // Compute #negative values involved if needed + udword NbNegativeValues = 0; + if(hint==RADIX_SIGNED) + { + // An efficient way to compute the number of negatives values we'll have to deal with is simply to sum the 128 + // last values of the last histogram. Last histogram because that's the one for the Most Significant Byte, + // responsible for the sign. 128 last values because the 128 first ones are related to positive numbers. + udword* h3= &mHistogram[768]; + for(udword i=128;i<256;i++) NbNegativeValues += h3[i]; // 768 for last histogram, 128 for negative part + } + + // Radix sort, j is the pass number (0=LSB, 3=MSB) + for(udword j=0;j<4;j++) + { + CHECK_PASS_VALIDITY(j); + + // Sometimes the fourth (negative) pass is skipped because all numbers are negative and the MSB is 0xFF (for example). This is + // not a problem, numbers are correctly sorted anyway. + if(PerformPass) + { + // Should we care about negative values? + if(j!=3 || hint==RADIX_UNSIGNED) + { + // Here we deal with positive values only + + // Create offsets +// mOffset[0] = 0; +// for(udword i=1;i<256;i++) mOffset[i] = mOffset[i-1] + CurCount[i-1]; + mLink[0] = mRanks2; + for(udword i=1;i<256;i++) mLink[i] = mLink[i-1] + CurCount[i-1]; + } + else + { + // This is a special case to correctly handle negative integers. They're sorted in the right order but at the wrong place. + + // Create biased offsets, in order for negative numbers to be sorted as well +// mOffset[0] = NbNegativeValues; // First positive number takes place after the negative ones + mLink[0] = &mRanks2[NbNegativeValues]; // First positive number takes place after the negative ones +// for(udword i=1;i<128;i++) mOffset[i] = mOffset[i-1] + CurCount[i-1]; // 1 to 128 for positive numbers + for(udword i=1;i<128;i++) mLink[i] = mLink[i-1] + CurCount[i-1]; // 1 to 128 for positive numbers + + // Fixing the wrong place for negative values +// mOffset[128] = 0; + mLink[128] = mRanks2; +// for(i=129;i<256;i++) mOffset[i] = mOffset[i-1] + CurCount[i-1]; + for(udword i=129;i<256;i++) mLink[i] = mLink[i-1] + CurCount[i-1]; + } + + // Perform Radix Sort + ubyte* InputBytes = (ubyte*)input; + InputBytes += j; + if(INVALID_RANKS) + { +// for(udword i=0;i>24; // Radix byte, same as above. AND is useless here (udword). + // ### cmp to be killed. Not good. Later. +// if(Radix<128) mRanks2[mOffset[Radix]++] = i; // Number is positive, same as above +// else mRanks2[--mOffset[Radix]] = i; // Number is negative, flip the sorting order + if(Radix<128) *mLink[Radix]++ = i; // Number is positive, same as above + else *(--mLink[Radix]) = i; // Number is negative, flip the sorting order + } + VALIDATE_RANKS; + } + else + { + for(udword i=0;i>24; // Radix byte, same as above. AND is useless here (udword). + // ### cmp to be killed. Not good. Later. +// if(Radix<128) mRanks2[mOffset[Radix]++] = mRanks[i]; // Number is positive, same as above +// else mRanks2[--mOffset[Radix]] = mRanks[i]; // Number is negative, flip the sorting order + if(Radix<128) *mLink[Radix]++ = mRanks[i]; // Number is positive, same as above + else *(--mLink[Radix]) = mRanks[i]; // Number is negative, flip the sorting order + } + } + // Swap pointers for next pass. Valid indices - the most recent ones - are in mRanks after the swap. + udword* Tmp = mRanks; mRanks = mRanks2; mRanks2 = Tmp; + } + else + { + // The pass is useless, yet we still have to reverse the order of current list if all values are negative. + if(UniqueVal>=128) + { + if(INVALID_RANKS) + { + // ###Possible? + for(udword i=0;i (b) ? (a) : (b)) //!< Returns the max value between a and b + #define MAXMAX(a,b,c) ((a) > (b) ? MAX (a,c) : MAX (b,c)) //!< Returns the max value between a, b and c + + template inline_ const T& TMin (const T& a, const T& b) { return b < a ? b : a; } + template inline_ const T& TMax (const T& a, const T& b) { return a < b ? b : a; } + template inline_ void TSetMin (T& a, const T& b) { if(a>b) a = b; } + template inline_ void TSetMax (T& a, const T& b) { if(a> 1) & 0x55555555) | ((n << 1) & 0xaaaaaaaa); + n = ((n >> 2) & 0x33333333) | ((n << 2) & 0xcccccccc); + n = ((n >> 4) & 0x0f0f0f0f) | ((n << 4) & 0xf0f0f0f0); + n = ((n >> 8) & 0x00ff00ff) | ((n << 8) & 0xff00ff00); + n = ((n >> 16) & 0x0000ffff) | ((n << 16) & 0xffff0000); + // Etc for larger intergers (64 bits in Java) + // NOTE: the >> operation must be unsigned! (>>> in java) + } + + //! Count the number of '1' bits in a 32 bit word (from Steve Baker's Cute Code Collection) + inline_ udword CountBits(udword n) + { + // This relies of the fact that the count of n bits can NOT overflow + // an n bit interger. EG: 1 bit count takes a 1 bit interger, 2 bit counts + // 2 bit interger, 3 bit count requires only a 2 bit interger. + // So we add all bit pairs, then each nible, then each byte etc... + n = (n & 0x55555555) + ((n & 0xaaaaaaaa) >> 1); + n = (n & 0x33333333) + ((n & 0xcccccccc) >> 2); + n = (n & 0x0f0f0f0f) + ((n & 0xf0f0f0f0) >> 4); + n = (n & 0x00ff00ff) + ((n & 0xff00ff00) >> 8); + n = (n & 0x0000ffff) + ((n & 0xffff0000) >> 16); + // Etc for larger intergers (64 bits in Java) + // NOTE: the >> operation must be unsigned! (>>> in java) + return n; + } + + //! Even faster? + inline_ udword CountBits2(udword bits) + { + bits = bits - ((bits >> 1) & 0x55555555); + bits = ((bits >> 2) & 0x33333333) + (bits & 0x33333333); + bits = ((bits >> 4) + bits) & 0x0F0F0F0F; + return (bits * 0x01010101) >> 24; + } + + //! Spread out bits. EG 00001111 -> 0101010101 + //! 00001010 -> 0100010000 + //! This is used to interleve to intergers to produce a `Morten Key' + //! used in Space Filling Curves (See DrDobbs Journal, July 1999) + //! Order is important. + inline_ void SpreadBits(udword& n) + { + n = ( n & 0x0000ffff) | (( n & 0xffff0000) << 16); + n = ( n & 0x000000ff) | (( n & 0x0000ff00) << 8); + n = ( n & 0x000f000f) | (( n & 0x00f000f0) << 4); + n = ( n & 0x03030303) | (( n & 0x0c0c0c0c) << 2); + n = ( n & 0x11111111) | (( n & 0x22222222) << 1); + } + + // Next Largest Power of 2 + // Given a binary integer value x, the next largest power of 2 can be computed by a SWAR algorithm + // that recursively "folds" the upper bits into the lower bits. This process yields a bit vector with + // the same most significant 1 as x, but all 1's below it. Adding 1 to that value yields the next + // largest power of 2. For a 32-bit value: + inline_ udword nlpo2(udword x) + { + x |= (x >> 1); + x |= (x >> 2); + x |= (x >> 4); + x |= (x >> 8); + x |= (x >> 16); + return x+1; + } + + //! Test to see if a number is an exact power of two (from Steve Baker's Cute Code Collection) + inline_ bool IsPowerOfTwo(udword n) { return ((n&(n-1))==0); } + + //! Zero the least significant '1' bit in a word. (from Steve Baker's Cute Code Collection) + inline_ void ZeroLeastSetBit(udword& n) { n&=(n-1); } + + //! Set the least significant N bits in a word. (from Steve Baker's Cute Code Collection) + inline_ void SetLeastNBits(udword& x, udword n) { x|=~(~0<> 31; return (x^y)-y; } + + //!< Alternative min function + inline_ sdword min_(sdword a, sdword b) { sdword delta = b-a; return a + (delta&(delta>>31)); } + + // Determine if one of the bytes in a 4 byte word is zero + inline_ BOOL HasNullByte(udword x) { return ((x + 0xfefefeff) & (~x) & 0x80808080); } + + // To find the smallest 1 bit in a word EG: ~~~~~~10---0 => 0----010---0 + inline_ udword LowestOneBit(udword w) { return ((w) & (~(w)+1)); } +// inline_ udword LowestOneBit_(udword w) { return ((w) & (-(w))); } + + // Most Significant 1 Bit + // Given a binary integer value x, the most significant 1 bit (highest numbered element of a bit set) + // can be computed using a SWAR algorithm that recursively "folds" the upper bits into the lower bits. + // This process yields a bit vector with the same most significant 1 as x, but all 1's below it. + // Bitwise AND of the original value with the complement of the "folded" value shifted down by one + // yields the most significant bit. For a 32-bit value: + inline_ udword msb32(udword x) + { + x |= (x >> 1); + x |= (x >> 2); + x |= (x >> 4); + x |= (x >> 8); + x |= (x >> 16); + return (x & ~(x >> 1)); + } + + /* + "Just call it repeatedly with various input values and always with the same variable as "memory". + The sharpness determines the degree of filtering, where 0 completely filters out the input, and 1 + does no filtering at all. + + I seem to recall from college that this is called an IIR (Infinite Impulse Response) filter. As opposed + to the more typical FIR (Finite Impulse Response). + + Also, I'd say that you can make more intelligent and interesting filters than this, for example filters + that remove wrong responses from the mouse because it's being moved too fast. You'd want such a filter + to be applied before this one, of course." + + (JCAB on Flipcode) + */ + inline_ float FeedbackFilter(float val, float& memory, float sharpness) + { + ASSERT(sharpness>=0.0f && sharpness<=1.0f && "Invalid sharpness value in feedback filter"); + if(sharpness<0.0f) sharpness = 0.0f; + else if(sharpness>1.0f) sharpness = 1.0f; + return memory = val * sharpness + memory * (1.0f - sharpness); + } + + //! If you can guarantee that your input domain (i.e. value of x) is slightly + //! limited (abs(x) must be < ((1<<31u)-32767)), then you can use the + //! following code to clamp the resulting value into [-32768,+32767] range: + inline_ int ClampToInt16(int x) + { +// ASSERT(abs(x) < (int)((1<<31u)-32767)); + + int delta = 32767 - x; + x += (delta>>31) & delta; + delta = x + 32768; + x -= (delta>>31) & delta; + return x; + } + + // Generic functions + template inline_ void TSwap(Type& a, Type& b) { const Type c = a; a = b; b = c; } + template inline_ Type TClamp(const Type& x, const Type& lo, const Type& hi) { return ((xhi) ? hi : x); } + + template inline_ void TSort(Type& a, Type& b) + { + if(a>b) TSwap(a, b); + } + + template inline_ void TSort(Type& a, Type& b, Type& c) + { + if(a>b) TSwap(a, b); + if(b>c) TSwap(b, c); + if(a>b) TSwap(a, b); + if(b>c) TSwap(b, c); + } + + // Prevent nasty user-manipulations (strategy borrowed from Charles Bloom) +// #define PREVENT_COPY(curclass) void operator = (const curclass& object) { ASSERT(!"Bad use of operator ="); } + // ... actually this is better ! + #define PREVENT_COPY(cur_class) private: cur_class(const cur_class& object); cur_class& operator=(const cur_class& object); + + //! TO BE DOCUMENTED + #define OFFSET_OF(Class, Member) (size_t)&(((Class*)0)->Member) + //! TO BE DOCUMENTED + #define ARRAYSIZE(p) (sizeof(p)/sizeof(p[0])) + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Returns the alignment of the input address. + * \fn Alignment() + * \param address [in] address to check + * \return the best alignment (e.g. 1 for odd addresses, etc) + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + FUNCTION ICECORE_API udword Alignment(udword address); + + #define IS_ALIGNED_2(x) ((x&1)==0) + #define IS_ALIGNED_4(x) ((x&3)==0) + #define IS_ALIGNED_8(x) ((x&7)==0) + + inline_ void _prefetch(void const* ptr) { (void)*(char const volatile *)ptr; } + + // Compute implicit coords from an index: + // The idea is to get back 2D coords from a 1D index. + // For example: + // + // 0 1 2 ... nbu-1 + // nbu nbu+1 i ... + // + // We have i, we're looking for the equivalent (u=2, v=1) location. + // i = u + v*nbu + // <=> i/nbu = u/nbu + v + // Since 0 <= u < nbu, u/nbu = 0 (integer) + // Hence: v = i/nbu + // Then we simply put it back in the original equation to compute u = i - v*nbu + inline_ void Compute2DCoords(udword& u, udword& v, udword i, udword nbu) + { + v = i / nbu; + u = i - (v * nbu); + } + + // In 3D: i = u + v*nbu + w*nbu*nbv + // <=> i/(nbu*nbv) = u/(nbu*nbv) + v/nbv + w + // u/(nbu*nbv) is null since u/nbu was null already. + // v/nbv is null as well for the same reason. + // Hence w = i/(nbu*nbv) + // Then we're left with a 2D problem: i' = i - w*nbu*nbv = u + v*nbu + inline_ void Compute3DCoords(udword& u, udword& v, udword& w, udword i, udword nbu, udword nbu_nbv) + { + w = i / (nbu_nbv); + Compute2DCoords(u, v, i - (w * nbu_nbv), nbu); + } + +#endif // __ICEUTILS_H__ diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_AABBCollider.cpp b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_AABBCollider.cpp new file mode 100644 index 00000000..568fd6b6 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_AABBCollider.cpp @@ -0,0 +1,705 @@ +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code for an AABB collider. + * \file OPC_AABBCollider.cpp + * \author Pierre Terdiman + * \date January, 1st, 2002 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains an AABB-vs-tree collider. + * + * \class AABBCollider + * \author Pierre Terdiman + * \version 1.3 + * \date January, 1st, 2002 +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Precompiled Header +#include "Stdafx.h" + +using namespace Opcode; + +#include "OPC_BoxBoxOverlap.h" +#include "OPC_TriBoxOverlap.h" + +#define SET_CONTACT(prim_index, flag) \ + /* Set contact status */ \ + mFlags |= flag; \ + mTouchedPrimitives->Add(prim_index); + +//! AABB-triangle test +#define AABB_PRIM(prim_index, flag) \ + /* Request vertices from the app */ \ + VertexPointers VP; mIMesh->GetTriangle(VP, prim_index);\ + mLeafVerts[0] = *VP.Vertex[0]; \ + mLeafVerts[1] = *VP.Vertex[1]; \ + mLeafVerts[2] = *VP.Vertex[2]; \ + /* Perform triangle-box overlap test */ \ + if(TriBoxOverlap()) \ + { \ + SET_CONTACT(prim_index, flag) \ + } + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Constructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +AABBCollider::AABBCollider() +{ +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Destructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +AABBCollider::~AABBCollider() +{ +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Generic collision query for generic OPCODE models. After the call, access the results: + * - with GetContactStatus() + * - with GetNbTouchedPrimitives() + * - with GetTouchedPrimitives() + * + * \param cache [in/out] a box cache + * \param box [in] collision AABB in world space + * \param model [in] Opcode model to collide with + * \return true if success + * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool AABBCollider::Collide(AABBCache& cache, const CollisionAABB& box, const Model& model) +{ + // Checkings + if(!Setup(&model)) return false; + + // Init collision query + if(InitQuery(cache, box)) return true; + + if(!model.HasLeafNodes()) + { + if(model.IsQuantized()) + { + const AABBQuantizedNoLeafTree* Tree = (const AABBQuantizedNoLeafTree*)model.GetTree(); + + // Setup dequantization coeffs + mCenterCoeff = Tree->mCenterCoeff; + mExtentsCoeff = Tree->mExtentsCoeff; + + // Perform collision query + if(SkipPrimitiveTests()) _CollideNoPrimitiveTest(Tree->GetNodes()); + else _Collide(Tree->GetNodes()); + } + else + { + const AABBNoLeafTree* Tree = (const AABBNoLeafTree*)model.GetTree(); + + // Perform collision query + if(SkipPrimitiveTests()) _CollideNoPrimitiveTest(Tree->GetNodes()); + else _Collide(Tree->GetNodes()); + } + } + else + { + if(model.IsQuantized()) + { + const AABBQuantizedTree* Tree = (const AABBQuantizedTree*)model.GetTree(); + + // Setup dequantization coeffs + mCenterCoeff = Tree->mCenterCoeff; + mExtentsCoeff = Tree->mExtentsCoeff; + + // Perform collision query + if(SkipPrimitiveTests()) _CollideNoPrimitiveTest(Tree->GetNodes()); + else _Collide(Tree->GetNodes()); + } + else + { + const AABBCollisionTree* Tree = (const AABBCollisionTree*)model.GetTree(); + + // Perform collision query + if(SkipPrimitiveTests()) _CollideNoPrimitiveTest(Tree->GetNodes()); + else _Collide(Tree->GetNodes()); + } + } + return true; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Initializes a collision query : + * - reset stats & contact status + * - check temporal coherence + * + * \param cache [in/out] a box cache + * \param box [in] AABB in world space + * \return TRUE if we can return immediately + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +BOOL AABBCollider::InitQuery(AABBCache& cache, const CollisionAABB& box) +{ + // 1) Call the base method + VolumeCollider::InitQuery(); + + // 2) Keep track of the query box + mBox = box; + + // 3) Setup destination pointer + mTouchedPrimitives = &cache.TouchedPrimitives; + + // 4) Special case: 1-triangle meshes [Opcode 1.3] + if(mCurrentModel && mCurrentModel->HasSingleNode()) + { + if(!SkipPrimitiveTests()) + { + // We simply perform the BV-Prim overlap test each time. We assume single triangle has index 0. + mTouchedPrimitives->Reset(); + + // Perform overlap test between the unique triangle and the box (and set contact status if needed) + AABB_PRIM(udword(0), OPC_CONTACT) + + // Return immediately regardless of status + return TRUE; + } + } + + // 5) Check temporal coherence : + if(TemporalCoherenceEnabled()) + { + // Here we use temporal coherence + // => check results from previous frame before performing the collision query + if(FirstContactEnabled()) + { + // We're only interested in the first contact found => test the unique previously touched face + if(mTouchedPrimitives->GetNbEntries()) + { + // Get index of previously touched face = the first entry in the array + udword PreviouslyTouchedFace = mTouchedPrimitives->GetEntry(0); + + // Then reset the array: + // - if the overlap test below is successful, the index we'll get added back anyway + // - if it isn't, then the array should be reset anyway for the normal query + mTouchedPrimitives->Reset(); + + // Perform overlap test between the cached triangle and the box (and set contact status if needed) + AABB_PRIM(PreviouslyTouchedFace, OPC_TEMPORAL_CONTACT) + + // Return immediately if possible + if(GetContactStatus()) return TRUE; + } + // else no face has been touched during previous query + // => we'll have to perform a normal query + } + else + { + // We're interested in all contacts =>test the new real box N(ew) against the previous fat box P(revious): + if(IsCacheValid(cache) && mBox.IsInside(cache.FatBox)) + { + // - if N is included in P, return previous list + // => we simply leave the list (mTouchedFaces) unchanged + + // Set contact status if needed + if(mTouchedPrimitives->GetNbEntries()) mFlags |= OPC_TEMPORAL_CONTACT; + + // In any case we don't need to do a query + return TRUE; + } + else + { + // - else do the query using a fat N + + // Reset cache since we'll about to perform a real query + mTouchedPrimitives->Reset(); + + // Make a fat box so that coherence will work for subsequent frames + mBox.mExtents *= cache.FatCoeff; + + // Update cache with query data (signature for cached faces) + cache.FatBox = mBox; + } + } + } + else + { + // Here we don't use temporal coherence => do a normal query + mTouchedPrimitives->Reset(); + } + + // 5) Precompute min & max bounds if needed + mMin = box.mCenter - box.mExtents; + mMax = box.mCenter + box.mExtents; + + return FALSE; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Collision query for vanilla AABB trees. + * \param cache [in/out] a box cache + * \param box [in] collision AABB in world space + * \param tree [in] AABB tree + * \return true if success + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool AABBCollider::Collide(AABBCache& cache, const CollisionAABB& box, const AABBTree* tree) +{ + // This is typically called for a scene tree, full of -AABBs-, not full of triangles. + // So we don't really have "primitives" to deal with. Hence it doesn't work with + // "FirstContact" + "TemporalCoherence". + ASSERT( !(FirstContactEnabled() && TemporalCoherenceEnabled()) ); + + // Checkings + if(!tree) return false; + + // Init collision query + if(InitQuery(cache, box)) return true; + + // Perform collision query + _Collide(tree); + + return true; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Checks the AABB completely contains the box. In which case we can end the query sooner. + * \param bc [in] box center + * \param be [in] box extents + * \return true if the AABB contains the whole box + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +inline_ BOOL AABBCollider::AABBContainsBox(const Point& bc, const Point& be) +{ + if(mMin.x > bc.x - be.x) return FALSE; + if(mMin.y > bc.y - be.y) return FALSE; + if(mMin.z > bc.z - be.z) return FALSE; + + if(mMax.x < bc.x + be.x) return FALSE; + if(mMax.y < bc.y + be.y) return FALSE; + if(mMax.z < bc.z + be.z) return FALSE; + + return TRUE; +} + +#define TEST_BOX_IN_AABB(center, extents) \ + if(AABBContainsBox(center, extents)) \ + { \ + /* Set contact status */ \ + mFlags |= OPC_CONTACT; \ + _Dump(node); \ + return; \ + } + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for normal AABB trees. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void AABBCollider::_Collide(const AABBCollisionNode* node) +{ + // Perform AABB-AABB overlap test + if(!AABBAABBOverlap(node->mAABB.mExtents, node->mAABB.mCenter)) return; + + TEST_BOX_IN_AABB(node->mAABB.mCenter, node->mAABB.mExtents) + + if(node->IsLeaf()) + { + AABB_PRIM(node->GetPrimitive(), OPC_CONTACT) + } + else + { + _Collide(node->GetPos()); + + if(ContactFound()) return; + + _Collide(node->GetNeg()); + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for normal AABB trees, without primitive tests. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void AABBCollider::_CollideNoPrimitiveTest(const AABBCollisionNode* node) +{ + // Perform AABB-AABB overlap test + if(!AABBAABBOverlap(node->mAABB.mExtents, node->mAABB.mCenter)) return; + + TEST_BOX_IN_AABB(node->mAABB.mCenter, node->mAABB.mExtents) + + if(node->IsLeaf()) + { + SET_CONTACT(node->GetPrimitive(), OPC_CONTACT) + } + else + { + _CollideNoPrimitiveTest(node->GetPos()); + + if(ContactFound()) return; + + _CollideNoPrimitiveTest(node->GetNeg()); + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for quantized AABB trees. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void AABBCollider::_Collide(const AABBQuantizedNode* node) +{ + // Dequantize box + const QuantizedAABB& Box = node->mAABB; + const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); + const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); + + // Perform AABB-AABB overlap test + if(!AABBAABBOverlap(Extents, Center)) return; + + TEST_BOX_IN_AABB(Center, Extents) + + if(node->IsLeaf()) + { + AABB_PRIM(node->GetPrimitive(), OPC_CONTACT) + } + else + { + _Collide(node->GetPos()); + + if(ContactFound()) return; + + _Collide(node->GetNeg()); + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for quantized AABB trees, without primitive tests. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void AABBCollider::_CollideNoPrimitiveTest(const AABBQuantizedNode* node) +{ + // Dequantize box + const QuantizedAABB& Box = node->mAABB; + const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); + const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); + + // Perform AABB-AABB overlap test + if(!AABBAABBOverlap(Extents, Center)) return; + + TEST_BOX_IN_AABB(Center, Extents) + + if(node->IsLeaf()) + { + SET_CONTACT(node->GetPrimitive(), OPC_CONTACT) + } + else + { + _CollideNoPrimitiveTest(node->GetPos()); + + if(ContactFound()) return; + + _CollideNoPrimitiveTest(node->GetNeg()); + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for no-leaf AABB trees. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void AABBCollider::_Collide(const AABBNoLeafNode* node) +{ + // Perform AABB-AABB overlap test + if(!AABBAABBOverlap(node->mAABB.mExtents, node->mAABB.mCenter)) return; + + TEST_BOX_IN_AABB(node->mAABB.mCenter, node->mAABB.mExtents) + + if(node->HasPosLeaf()) { AABB_PRIM(node->GetPosPrimitive(), OPC_CONTACT) } + else _Collide(node->GetPos()); + + if(ContactFound()) return; + + if(node->HasNegLeaf()) { AABB_PRIM(node->GetNegPrimitive(), OPC_CONTACT) } + else _Collide(node->GetNeg()); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for no-leaf AABB trees, without primitive tests. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void AABBCollider::_CollideNoPrimitiveTest(const AABBNoLeafNode* node) +{ + // Perform AABB-AABB overlap test + if(!AABBAABBOverlap(node->mAABB.mExtents, node->mAABB.mCenter)) return; + + TEST_BOX_IN_AABB(node->mAABB.mCenter, node->mAABB.mExtents) + + if(node->HasPosLeaf()) { SET_CONTACT(node->GetPosPrimitive(), OPC_CONTACT) } + else _CollideNoPrimitiveTest(node->GetPos()); + + if(ContactFound()) return; + + if(node->HasNegLeaf()) { SET_CONTACT(node->GetNegPrimitive(), OPC_CONTACT) } + else _CollideNoPrimitiveTest(node->GetNeg()); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for quantized no-leaf AABB trees. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void AABBCollider::_Collide(const AABBQuantizedNoLeafNode* node) +{ + // Dequantize box + const QuantizedAABB& Box = node->mAABB; + const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); + const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); + + // Perform AABB-AABB overlap test + if(!AABBAABBOverlap(Extents, Center)) return; + + TEST_BOX_IN_AABB(Center, Extents) + + if(node->HasPosLeaf()) { AABB_PRIM(node->GetPosPrimitive(), OPC_CONTACT) } + else _Collide(node->GetPos()); + + if(ContactFound()) return; + + if(node->HasNegLeaf()) { AABB_PRIM(node->GetNegPrimitive(), OPC_CONTACT) } + else _Collide(node->GetNeg()); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for quantized no-leaf AABB trees, without primitive tests. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void AABBCollider::_CollideNoPrimitiveTest(const AABBQuantizedNoLeafNode* node) +{ + // Dequantize box + const QuantizedAABB& Box = node->mAABB; + const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); + const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); + + // Perform AABB-AABB overlap test + if(!AABBAABBOverlap(Extents, Center)) return; + + TEST_BOX_IN_AABB(Center, Extents) + + if(node->HasPosLeaf()) { SET_CONTACT(node->GetPosPrimitive(), OPC_CONTACT) } + else _CollideNoPrimitiveTest(node->GetPos()); + + if(ContactFound()) return; + + if(node->HasNegLeaf()) { SET_CONTACT(node->GetNegPrimitive(), OPC_CONTACT) } + else _CollideNoPrimitiveTest(node->GetNeg()); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for vanilla AABB trees. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void AABBCollider::_Collide(const AABBTreeNode* node) +{ + // Perform AABB-AABB overlap test + Point Center, Extents; + node->GetAABB()->GetCenter(Center); + node->GetAABB()->GetExtents(Extents); + if(!AABBAABBOverlap(Center, Extents)) return; + + if(node->IsLeaf() || AABBContainsBox(Center, Extents)) + { + mFlags |= OPC_CONTACT; + mTouchedPrimitives->Add(node->GetPrimitives(), node->GetNbPrimitives()); + } + else + { + _Collide(node->GetPos()); + _Collide(node->GetNeg()); + } +} + + + + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Constructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +HybridAABBCollider::HybridAABBCollider() +{ +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Destructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +HybridAABBCollider::~HybridAABBCollider() +{ +} + +bool HybridAABBCollider::Collide(AABBCache& cache, const CollisionAABB& box, const HybridModel& model) +{ + // We don't want primitive tests here! + mFlags |= OPC_NO_PRIMITIVE_TESTS; + + // Checkings + if(!Setup(&model)) return false; + + // Init collision query + if(InitQuery(cache, box)) return true; + + // Special case for 1-leaf trees + if(mCurrentModel && mCurrentModel->HasSingleNode()) + { + // Here we're supposed to perform a normal query, except our tree has a single node, i.e. just a few triangles + udword Nb = mIMesh->GetNbTriangles(); + + // Loop through all triangles + for(udword i=0;imCenterCoeff; + mExtentsCoeff = Tree->mExtentsCoeff; + + // Perform collision query - we don't want primitive tests here! + _CollideNoPrimitiveTest(Tree->GetNodes()); + } + else + { + const AABBNoLeafTree* Tree = (const AABBNoLeafTree*)model.GetTree(); + + // Perform collision query - we don't want primitive tests here! + _CollideNoPrimitiveTest(Tree->GetNodes()); + } + } + else + { + if(model.IsQuantized()) + { + const AABBQuantizedTree* Tree = (const AABBQuantizedTree*)model.GetTree(); + + // Setup dequantization coeffs + mCenterCoeff = Tree->mCenterCoeff; + mExtentsCoeff = Tree->mExtentsCoeff; + + // Perform collision query - we don't want primitive tests here! + _CollideNoPrimitiveTest(Tree->GetNodes()); + } + else + { + const AABBCollisionTree* Tree = (const AABBCollisionTree*)model.GetTree(); + + // Perform collision query - we don't want primitive tests here! + _CollideNoPrimitiveTest(Tree->GetNodes()); + } + } + + // We only have a list of boxes so far + if(GetContactStatus()) + { + // Reset contact status, since it currently only reflects collisions with leaf boxes + Collider::InitQuery(); + + // Change dest container so that we can use built-in overlap tests and get collided primitives + cache.TouchedPrimitives.Reset(); + mTouchedPrimitives = &cache.TouchedPrimitives; + + // Read touched leaf boxes + udword Nb = mTouchedBoxes.GetNbEntries(); + const udword* Touched = mTouchedBoxes.GetEntries(); + + const LeafTriangles* LT = model.GetLeafTriangles(); + const udword* Indices = model.GetIndices(); + + // Loop through touched leaves + while(Nb--) + { + const LeafTriangles& CurrentLeaf = LT[*Touched++]; + + // Each leaf box has a set of triangles + udword NbTris = CurrentLeaf.GetNbTriangles(); + if(Indices) + { + const udword* T = &Indices[CurrentLeaf.GetTriangleIndex()]; + + // Loop through triangles and test each of them + while(NbTris--) + { + udword TriangleIndex = *T++; + AABB_PRIM(TriangleIndex, OPC_CONTACT) + } + } + else + { + udword BaseIndex = CurrentLeaf.GetTriangleIndex(); + + // Loop through triangles and test each of them + while(NbTris--) + { + udword TriangleIndex = BaseIndex++; + AABB_PRIM(TriangleIndex, OPC_CONTACT) + } + } + } + } + + return true; +} diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_AABBCollider.h b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_AABBCollider.h new file mode 100644 index 00000000..ca8aee98 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_AABBCollider.h @@ -0,0 +1,106 @@ +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code for an AABB collider. + * \file OPC_AABBCollider.h + * \author Pierre Terdiman + * \date January, 1st, 2002 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef __OPC_AABBCOLLIDER_H__ +#define __OPC_AABBCOLLIDER_H__ + + struct OPCODE_API AABBCache : VolumeCache + { + AABBCache() : FatCoeff(1.1f) + { + FatBox.mCenter.Zero(); + FatBox.mExtents.Zero(); + } + + // Cached faces signature + CollisionAABB FatBox; //!< Box used when performing the query resulting in cached faces + // User settings + float FatCoeff; //!< mRadius2 multiplier used to create a fat sphere + }; + + class OPCODE_API AABBCollider : public VolumeCollider + { + public: + // Constructor / Destructor + AABBCollider(); + virtual ~AABBCollider(); + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Generic collision query for generic OPCODE models. After the call, access the results: + * - with GetContactStatus() + * - with GetNbTouchedPrimitives() + * - with GetTouchedPrimitives() + * + * \param cache [in/out] a box cache + * \param box [in] collision AABB in world space + * \param model [in] Opcode model to collide with + * \return true if success + * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only. + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + bool Collide(AABBCache& cache, const CollisionAABB& box, const Model& model); + // + bool Collide(AABBCache& cache, const CollisionAABB& box, const AABBTree* tree); + protected: + CollisionAABB mBox; //!< Query box in (center, extents) form + Point mMin; //!< Query box min point + Point mMax; //!< Query box max point + // Leaf description + Point mLeafVerts[3]; //!< Triangle vertices + // Internal methods + void _Collide(const AABBCollisionNode* node); + void _Collide(const AABBNoLeafNode* node); + void _Collide(const AABBQuantizedNode* node); + void _Collide(const AABBQuantizedNoLeafNode* node); + void _Collide(const AABBTreeNode* node); + void _CollideNoPrimitiveTest(const AABBCollisionNode* node); + void _CollideNoPrimitiveTest(const AABBNoLeafNode* node); + void _CollideNoPrimitiveTest(const AABBQuantizedNode* node); + void _CollideNoPrimitiveTest(const AABBQuantizedNoLeafNode* node); + // Overlap tests + inline_ BOOL AABBContainsBox(const Point& bc, const Point& be); + inline_ BOOL AABBAABBOverlap(const Point& b, const Point& Pb); + inline_ BOOL TriBoxOverlap(); + // Init methods + BOOL InitQuery(AABBCache& cache, const CollisionAABB& box); + }; + + class OPCODE_API HybridAABBCollider : public AABBCollider + { + public: + // Constructor / Destructor + HybridAABBCollider(); + virtual ~HybridAABBCollider(); + + bool Collide(AABBCache& cache, const CollisionAABB& box, const HybridModel& model); + protected: + Container mTouchedBoxes; + }; + +#endif // __OPC_AABBCOLLIDER_H__ diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_AABBTree.cpp b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_AABBTree.cpp new file mode 100644 index 00000000..bb692bb7 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_AABBTree.cpp @@ -0,0 +1,582 @@ +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code for a versatile AABB tree. + * \file OPC_AABBTree.cpp + * \author Pierre Terdiman + * \date March, 20, 2001 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains a generic AABB tree node. + * + * \class AABBTreeNode + * \author Pierre Terdiman + * \version 1.3 + * \date March, 20, 2001 +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains a generic AABB tree. + * This is a vanilla AABB tree, without any particular optimization. It contains anonymous references to + * user-provided primitives, which can theoretically be anything - triangles, boxes, etc. Each primitive + * is surrounded by an AABB, regardless of the primitive's nature. When the primitive is a triangle, the + * resulting tree can be converted into an optimized tree. If the primitive is a box, the resulting tree + * can be used for culling - VFC or occlusion -, assuming you cull on a mesh-by-mesh basis (modern way). + * + * \class AABBTree + * \author Pierre Terdiman + * \version 1.3 + * \date March, 20, 2001 +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Precompiled Header +#include "Stdafx.h" + +using namespace Opcode; + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Constructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +AABBTreeNode::AABBTreeNode() : + mPos (null), +#ifndef OPC_NO_NEG_VANILLA_TREE + mNeg (null), +#endif + mNbPrimitives (0), + mNodePrimitives (null) +{ +#ifdef OPC_USE_TREE_COHERENCE + mBitmask = 0; +#endif +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Destructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +AABBTreeNode::~AABBTreeNode() +{ + // Opcode 1.3: + const AABBTreeNode* Pos = GetPos(); + const AABBTreeNode* Neg = GetNeg(); +#ifndef OPC_NO_NEG_VANILLA_TREE + if(!(mPos&1)) DELETESINGLE(Pos); + if(!(mNeg&1)) DELETESINGLE(Neg); +#else + if(!(mPos&1)) DELETEARRAY(Pos); +#endif + mNodePrimitives = null; // This was just a shortcut to the global list => no release + mNbPrimitives = 0; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Splits the node along a given axis. + * The list of indices is reorganized according to the split values. + * \param axis [in] splitting axis index + * \param builder [in] the tree builder + * \return the number of primitives assigned to the first child + * \warning this method reorganizes the internal list of primitives + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +udword AABBTreeNode::Split(udword axis, AABBTreeBuilder* builder) +{ + // Get node split value + float SplitValue = builder->GetSplittingValue(mNodePrimitives, mNbPrimitives, mBV, axis); + + udword NbPos = 0; + // Loop through all node-related primitives. Their indices range from mNodePrimitives[0] to mNodePrimitives[mNbPrimitives-1]. + // Those indices map the global list in the tree builder. + for(udword i=0;iGetSplittingValue(Index, axis); + + // Reorganize the list of indices in this order: positive - negative. + if(PrimitiveValue > SplitValue) + { + // Swap entries + udword Tmp = mNodePrimitives[i]; + mNodePrimitives[i] = mNodePrimitives[NbPos]; + mNodePrimitives[NbPos] = Tmp; + // Count primitives assigned to positive space + NbPos++; + } + } + return NbPos; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Subdivides the node. + * + * N + * / \ + * / \ + * N/2 N/2 + * / \ / \ + * N/4 N/4 N/4 N/4 + * (etc) + * + * A well-balanced tree should have a O(log n) depth. + * A degenerate tree would have a O(n) depth. + * Note a perfectly-balanced tree is not well-suited to collision detection anyway. + * + * \param builder [in] the tree builder + * \return true if success + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool AABBTreeNode::Subdivide(AABBTreeBuilder* builder) +{ + // Checkings + if(!builder) return false; + + // Stop subdividing if we reach a leaf node. This is always performed here, + // else we could end in trouble if user overrides this. + if(mNbPrimitives==1) return true; + + // Let the user validate the subdivision + if(!builder->ValidateSubdivision(mNodePrimitives, mNbPrimitives, mBV)) return true; + + bool ValidSplit = true; // Optimism... + udword NbPos; + if(builder->mSettings.mRules & SPLIT_LARGEST_AXIS) + { + // Find the largest axis to split along + Point Extents; mBV.GetExtents(Extents); // Box extents + udword Axis = Extents.LargestAxis(); // Index of largest axis + + // Split along the axis + NbPos = Split(Axis, builder); + + // Check split validity + if(!NbPos || NbPos==mNbPrimitives) ValidSplit = false; + } + else if(builder->mSettings.mRules & SPLIT_SPLATTER_POINTS) + { + // Compute the means + Point Means(0.0f, 0.0f, 0.0f); + for(udword i=0;iGetSplittingValue(Index, 0); + Means.y+=builder->GetSplittingValue(Index, 1); + Means.z+=builder->GetSplittingValue(Index, 2); + } + Means/=float(mNbPrimitives); + + // Compute variances + Point Vars(0.0f, 0.0f, 0.0f); + for(udword i=0;iGetSplittingValue(Index, 0); + float Cy = builder->GetSplittingValue(Index, 1); + float Cz = builder->GetSplittingValue(Index, 2); + Vars.x += (Cx - Means.x)*(Cx - Means.x); + Vars.y += (Cy - Means.y)*(Cy - Means.y); + Vars.z += (Cz - Means.z)*(Cz - Means.z); + } + Vars/=float(mNbPrimitives-1); + + // Choose axis with greatest variance + udword Axis = Vars.LargestAxis(); + + // Split along the axis + NbPos = Split(Axis, builder); + + // Check split validity + if(!NbPos || NbPos==mNbPrimitives) ValidSplit = false; + } + else if(builder->mSettings.mRules & SPLIT_BALANCED) + { + // Test 3 axis, take the best + float Results[3]; + NbPos = Split(0, builder); Results[0] = float(NbPos)/float(mNbPrimitives); + NbPos = Split(1, builder); Results[1] = float(NbPos)/float(mNbPrimitives); + NbPos = Split(2, builder); Results[2] = float(NbPos)/float(mNbPrimitives); + Results[0]-=0.5f; Results[0]*=Results[0]; + Results[1]-=0.5f; Results[1]*=Results[1]; + Results[2]-=0.5f; Results[2]*=Results[2]; + udword Min=0; + if(Results[1]mSettings.mRules & SPLIT_BEST_AXIS) + { + // Test largest, then middle, then smallest axis... + + // Sort axis + Point Extents; mBV.GetExtents(Extents); // Box extents + udword SortedAxis[] = { 0, 1, 2 }; + float* Keys = (float*)&Extents.x; + for(udword j=0;j<3;j++) + { + for(udword i=0;i<2;i++) + { + if(Keys[SortedAxis[i]]mSettings.mRules & SPLIT_FIFTY) + { + // Don't even bother splitting (mainly a performance test) + NbPos = mNbPrimitives>>1; + } + else return false; // Unknown splitting rules + + // Check the subdivision has been successful + if(!ValidSplit) + { + // Here, all boxes lie in the same sub-space. Two strategies: + // - if the tree *must* be complete, make an arbitrary 50-50 split + // - else stop subdividing +// if(builder->mSettings.mRules&SPLIT_COMPLETE) + if(builder->mSettings.mLimit==1) + { + builder->IncreaseNbInvalidSplits(); + NbPos = mNbPrimitives>>1; + } + else return true; + } + + // Now create children and assign their pointers. + if(builder->mNodeBase) + { + // We use a pre-allocated linear pool for complete trees [Opcode 1.3] + AABBTreeNode* Pool = (AABBTreeNode*)builder->mNodeBase; + udword Count = builder->GetCount() - 1; // Count begins to 1... + // Set last bit to tell it shouldn't be freed ### pretty ugly, find a better way. Maybe one bit in mNbPrimitives + ASSERT(!(udword(&Pool[Count+0])&1)); + ASSERT(!(udword(&Pool[Count+1])&1)); + mPos = udword(&Pool[Count+0])|1; +#ifndef OPC_NO_NEG_VANILLA_TREE + mNeg = udword(&Pool[Count+1])|1; +#endif + } + else + { + // Non-complete trees and/or Opcode 1.2 allocate nodes on-the-fly +#ifndef OPC_NO_NEG_VANILLA_TREE + mPos = (udword)new AABBTreeNode; CHECKALLOC(mPos); + mNeg = (udword)new AABBTreeNode; CHECKALLOC(mNeg); +#else + AABBTreeNode* PosNeg = new AABBTreeNode[2]; + CHECKALLOC(PosNeg); + mPos = (udword)PosNeg; +#endif + } + + // Update stats + builder->IncreaseCount(2); + + // Assign children + AABBTreeNode* Pos = (AABBTreeNode*)GetPos(); + AABBTreeNode* Neg = (AABBTreeNode*)GetNeg(); + Pos->mNodePrimitives = &mNodePrimitives[0]; + Pos->mNbPrimitives = NbPos; + Neg->mNodePrimitives = &mNodePrimitives[NbPos]; + Neg->mNbPrimitives = mNbPrimitives - NbPos; + + return true; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive hierarchy building in a top-down fashion. + * \param builder [in] the tree builder + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void AABBTreeNode::_BuildHierarchy(AABBTreeBuilder* builder) +{ + // 1) Compute the global box for current node. The box is stored in mBV. + builder->ComputeGlobalBox(mNodePrimitives, mNbPrimitives, mBV); + + // 2) Subdivide current node + Subdivide(builder); + + // 3) Recurse + AABBTreeNode* Pos = (AABBTreeNode*)GetPos(); + AABBTreeNode* Neg = (AABBTreeNode*)GetNeg(); + if(Pos) Pos->_BuildHierarchy(builder); + if(Neg) Neg->_BuildHierarchy(builder); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Refits the tree (top-down). + * \param builder [in] the tree builder + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void AABBTreeNode::_Refit(AABBTreeBuilder* builder) +{ + // 1) Recompute the new global box for current node + builder->ComputeGlobalBox(mNodePrimitives, mNbPrimitives, mBV); + + // 2) Recurse + AABBTreeNode* Pos = (AABBTreeNode*)GetPos(); + AABBTreeNode* Neg = (AABBTreeNode*)GetNeg(); + if(Pos) Pos->_Refit(builder); + if(Neg) Neg->_Refit(builder); +} + + + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Constructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +AABBTree::AABBTree() : mIndices(null), mTotalNbNodes(0), mPool(null) +{ +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Destructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +AABBTree::~AABBTree() +{ + Release(); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Releases the tree. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void AABBTree::Release() +{ + DELETEARRAY(mPool); + DELETEARRAY(mIndices); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Builds a generic AABB tree from a tree builder. + * \param builder [in] the tree builder + * \return true if success + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool AABBTree::Build(AABBTreeBuilder* builder) +{ + // Checkings + if(!builder || !builder->mNbPrimitives) return false; + + // Release previous tree + Release(); + + // Init stats + builder->SetCount(1); + builder->SetNbInvalidSplits(0); + + // Initialize indices. This list will be modified during build. + mIndices = new udword[builder->mNbPrimitives]; + CHECKALLOC(mIndices); + // Identity permutation + for(udword i=0;imNbPrimitives;i++) mIndices[i] = i; + + // Setup initial node. Here we have a complete permutation of the app's primitives. + mNodePrimitives = mIndices; + mNbPrimitives = builder->mNbPrimitives; + + // Use a linear array for complete trees (since we can predict the final number of nodes) [Opcode 1.3] +// if(builder->mRules&SPLIT_COMPLETE) + if(builder->mSettings.mLimit==1) + { + // Allocate a pool of nodes + mPool = new AABBTreeNode[builder->mNbPrimitives*2 - 1]; + + builder->mNodeBase = mPool; // ### ugly ! + } + + // Build the hierarchy + _BuildHierarchy(builder); + + // Get back total number of nodes + mTotalNbNodes = builder->GetCount(); + + // For complete trees, check the correct number of nodes has been created [Opcode 1.3] + if(mPool) ASSERT(mTotalNbNodes==builder->mNbPrimitives*2 - 1); + + return true; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Computes the depth of the tree. + * A well-balanced tree should have a log(n) depth. A degenerate tree O(n) depth. + * \return depth of the tree + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +udword AABBTree::ComputeDepth() const +{ + return Walk(null, null); // Use the walking code without callback +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Walks the tree, calling the user back for each node. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +udword AABBTree::Walk(WalkingCallback callback, void* user_data) const +{ + // Call it without callback to compute max depth + udword MaxDepth = 0; + udword CurrentDepth = 0; + + struct Local + { + static void _Walk(const AABBTreeNode* current_node, udword& max_depth, udword& current_depth, WalkingCallback callback, void* user_data) + { + // Checkings + if(!current_node) return; + // Entering a new node => increase depth + current_depth++; + // Keep track of max depth + if(current_depth>max_depth) max_depth = current_depth; + + // Callback + if(callback && !(callback)(current_node, current_depth, user_data)) return; + + // Recurse + if(current_node->GetPos()) { _Walk(current_node->GetPos(), max_depth, current_depth, callback, user_data); current_depth--; } + if(current_node->GetNeg()) { _Walk(current_node->GetNeg(), max_depth, current_depth, callback, user_data); current_depth--; } + } + }; + Local::_Walk(this, MaxDepth, CurrentDepth, callback, user_data); + return MaxDepth; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Refits the tree in a top-down way. + * \param builder [in] the tree builder + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool AABBTree::Refit(AABBTreeBuilder* builder) +{ + if(!builder) return false; + _Refit(builder); + return true; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Refits the tree in a bottom-up way. + * \param builder [in] the tree builder + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool AABBTree::Refit2(AABBTreeBuilder* builder) +{ + // Checkings + if(!builder) return false; + + ASSERT(mPool); + + // Bottom-up update + Point Min,Max; + Point Min_,Max_; + udword Index = mTotalNbNodes; + while(Index--) + { + AABBTreeNode& Current = mPool[Index]; + + if(Current.IsLeaf()) + { + builder->ComputeGlobalBox(Current.GetPrimitives(), Current.GetNbPrimitives(), *(AABB*)Current.GetAABB()); + } + else + { + Current.GetPos()->GetAABB()->GetMin(Min); + Current.GetPos()->GetAABB()->GetMax(Max); + + Current.GetNeg()->GetAABB()->GetMin(Min_); + Current.GetNeg()->GetAABB()->GetMax(Max_); + + Min.Min(Min_); + Max.Max(Max_); + + ((AABB*)Current.GetAABB())->SetMinMax(Min, Max); + } + } + return true; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Computes the number of bytes used by the tree. + * \return number of bytes used + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +udword AABBTree::GetUsedBytes() const +{ + udword TotalSize = mTotalNbNodes*GetNodeSize(); + if(mIndices) TotalSize+=mNbPrimitives*sizeof(udword); + return TotalSize; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Checks the tree is a complete tree or not. + * A complete tree is made of 2*N-1 nodes, where N is the number of primitives in the tree. + * \return true for complete trees + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool AABBTree::IsComplete() const +{ + return (GetNbNodes()==GetNbPrimitives()*2-1); +} diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_AABBTree.h b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_AABBTree.h new file mode 100644 index 00000000..c63bfa30 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_AABBTree.h @@ -0,0 +1,146 @@ +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code for a versatile AABB tree. + * \file OPC_AABBTree.h + * \author Pierre Terdiman + * \date March, 20, 2001 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef __OPC_AABBTREE_H__ +#define __OPC_AABBTREE_H__ + +#ifdef OPC_NO_NEG_VANILLA_TREE + //! TO BE DOCUMENTED + #define IMPLEMENT_TREE(base_class, volume) \ + public: \ + /* Constructor / Destructor */ \ + base_class(); \ + ~base_class(); \ + /* Data access */ \ + inline_ const volume* Get##volume() const { return &mBV; } \ + /* Clear the last bit */ \ + inline_ const base_class* GetPos() const { return (const base_class*)(mPos&~1); } \ + inline_ const base_class* GetNeg() const { const base_class* P = GetPos(); return P ? P+1 : null;} \ + \ + /* We don't need to test both nodes since we can't have one without the other */ \ + inline_ bool IsLeaf() const { return !GetPos(); } \ + \ + /* Stats */ \ + inline_ udword GetNodeSize() const { return SIZEOFOBJECT; } \ + protected: \ + /* Tree-independent data */ \ + /* Following data always belong to the BV-tree, regardless of what the tree actually contains.*/ \ + /* Whatever happens we need the two children and the enclosing volume.*/ \ + volume mBV; /* Global bounding-volume enclosing all the node-related primitives */ \ + udword mPos; /* "Positive" & "Negative" children */ +#else + //! TO BE DOCUMENTED + #define IMPLEMENT_TREE(base_class, volume) \ + public: \ + /* Constructor / Destructor */ \ + base_class(); \ + ~base_class(); \ + /* Data access */ \ + inline_ const volume* Get##volume() const { return &mBV; } \ + /* Clear the last bit */ \ + inline_ const base_class* GetPos() const { return (const base_class*)(mPos&~1); } \ + inline_ const base_class* GetNeg() const { return (const base_class*)(mNeg&~1); } \ + \ +/* inline_ bool IsLeaf() const { return (!GetPos() && !GetNeg()); } */ \ + /* We don't need to test both nodes since we can't have one without the other */ \ + inline_ bool IsLeaf() const { return !GetPos(); } \ + \ + /* Stats */ \ + inline_ udword GetNodeSize() const { return SIZEOFOBJECT; } \ + protected: \ + /* Tree-independent data */ \ + /* Following data always belong to the BV-tree, regardless of what the tree actually contains.*/ \ + /* Whatever happens we need the two children and the enclosing volume.*/ \ + volume mBV; /* Global bounding-volume enclosing all the node-related primitives */ \ + udword mPos; /* "Positive" child */ \ + udword mNeg; /* "Negative" child */ +#endif + + typedef void (*CullingCallback) (udword nb_primitives, udword* node_primitives, BOOL need_clipping, void* user_data); + + class OPCODE_API AABBTreeNode + { + IMPLEMENT_TREE(AABBTreeNode, AABB) + public: + // Data access + inline_ const udword* GetPrimitives() const { return mNodePrimitives; } + inline_ udword GetNbPrimitives() const { return mNbPrimitives; } + + protected: + // Tree-dependent data + udword* mNodePrimitives; //!< Node-related primitives (shortcut to a position in mIndices below) + udword mNbPrimitives; //!< Number of primitives for this node + // Internal methods + udword Split(udword axis, AABBTreeBuilder* builder); + bool Subdivide(AABBTreeBuilder* builder); + void _BuildHierarchy(AABBTreeBuilder* builder); + void _Refit(AABBTreeBuilder* builder); + }; + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * User-callback, called for each node by the walking code. + * \param current [in] current node + * \param depth [in] current node's depth + * \param user_data [in] user-defined data + * \return true to recurse through children, else false to bypass them + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + typedef bool (*WalkingCallback) (const AABBTreeNode* current, udword depth, void* user_data); + + class OPCODE_API AABBTree : public AABBTreeNode + { + public: + // Constructor / Destructor + AABBTree(); + ~AABBTree(); + // Build + bool Build(AABBTreeBuilder* builder); + void Release(); + + // Data access + inline_ const udword* GetIndices() const { return mIndices; } //!< Catch the indices + inline_ udword GetNbNodes() const { return mTotalNbNodes; } //!< Catch the number of nodes + + // Infos + bool IsComplete() const; + // Stats + udword ComputeDepth() const; + udword GetUsedBytes() const; + udword Walk(WalkingCallback callback, void* user_data) const; + + bool Refit(AABBTreeBuilder* builder); + bool Refit2(AABBTreeBuilder* builder); + private: + udword* mIndices; //!< Indices in the app list. Indices are reorganized during build (permutation). + AABBTreeNode* mPool; //!< Linear pool of nodes for complete trees. Null otherwise. [Opcode 1.3] + // Stats + udword mTotalNbNodes; //!< Number of nodes in the tree. + }; + +#endif // __OPC_AABBTREE_H__ diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_ArraySAP.cpp b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_ArraySAP.cpp new file mode 100644 index 00000000..14f16c72 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_ArraySAP.cpp @@ -0,0 +1,1221 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/* + * OPCODE - Optimized Collision Detection + * Copyright (C) 2001 Pierre Terdiman + * Homepage: http://www.codercorner.com/Opcode.htm + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains an array-based version of the sweep-and-prune algorithm + * \file OPC_ArraySAP.cpp + * \author Pierre Terdiman + * \date December, 2, 2007 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Precompiled Header +#include "StdAfx.h" + +using namespace Opcode; + +//#include "SAP_Utils.h" + +#define INVALID_USER_ID 0xffff + +inline_ void Sort(uword& id0, uword& id1) { if(id0>id1) TSwap(id0, id1); } +inline_ void Sort(uword& id0, uword& id1, const void*& obj0, const void*& obj1) { if(id0>id1) { TSwap(id0, id1); TSwap(obj0, obj1); } } + + + struct Opcode::IAABB : public Allocateable + { + udword mMinX; + udword mMinY; + udword mMinZ; + udword mMaxX; + udword mMaxY; + udword mMaxZ; + + inline_ udword GetMin(udword i) const { return (&mMinX)[i]; } + inline_ udword GetMax(udword i) const { return (&mMaxX)[i]; } + }; + + + +/* + - already sorted for batch create? + - better axis selection batch create +*/ + +//#define USE_WORDS // Use words or dwords for box indices. Words save memory but seriously limit the max number of objects in the SAP. +#define USE_PREFETCH +#define USE_INTEGERS +#define PAIR_USER_DATA +#define USE_OVERLAP_TEST_ON_REMOVES // "Useless" but faster overall because seriously reduces number of calls (from ~10000 to ~3 sometimes!) +#define RELEASE_ON_RESET // Release memory instead of just doing a reset + +#include "OPC_ArraySAP.h" + +//#include "SAP_PairManager.h" +//#include "SAP_PairManager.cpp" + + +inline_ udword Hash(uword id0, uword id1) { return Hash32Bits_1( udword(id0)|(udword(id1)<<16) ); } +inline_ bool DifferentPair(const ASAP_Pair& p, uword id0, uword id1) { return (id0!=p.id0) || (id1!=p.id1); } + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +ASAP_PairManager::ASAP_PairManager() : + mHashSize (0), + mMask (0), + mHashTable (null), + mNext (null), + mNbActivePairs (0), + mActivePairs (null) +{ +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +ASAP_PairManager::~ASAP_PairManager() +{ + Purge(); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +void ASAP_PairManager::Purge() +{ + ICE_FREE(mNext); + ICE_FREE(mActivePairs); + ICE_FREE(mHashTable); + mHashSize = 0; + mMask = 0; + mNbActivePairs = 0; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +const ASAP_Pair* ASAP_PairManager::FindPair(uword id0, uword id1) const +{ + if(!mHashTable) return null; // Nothing has been allocated yet + + // Order the ids + Sort(id0, id1); + + // Compute hash value for this pair + udword HashValue = Hash(id0, id1) & mMask; + + // Look for it in the table + udword Offset = mHashTable[HashValue]; + while(Offset!=INVALID_ID && DifferentPair(mActivePairs[Offset], id0, id1)) + { + ASSERT(mActivePairs[Offset].id0!=INVALID_USER_ID); + Offset = mNext[Offset]; // Better to have a separate array for this + } + if(Offset==INVALID_ID) return null; + ASSERT(Offset the pair is persistent + return &mActivePairs[Offset]; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +// Internal version saving hash computation +inline_ ASAP_Pair* ASAP_PairManager::FindPair(uword id0, uword id1, udword hash_value) const +{ + if(!mHashTable) return null; // Nothing has been allocated yet + + // Look for it in the table + udword Offset = mHashTable[hash_value]; + while(Offset!=INVALID_ID && DifferentPair(mActivePairs[Offset], id0, id1)) + { + ASSERT(mActivePairs[Offset].id0!=INVALID_USER_ID); + Offset = mNext[Offset]; // Better to have a separate array for this + } + if(Offset==INVALID_ID) return null; + ASSERT(Offset the pair is persistent + return &mActivePairs[Offset]; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +const ASAP_Pair* ASAP_PairManager::AddPair(uword id0, uword id1, const void* object0, const void* object1) +{ + // Order the ids + Sort(id0, id1, object0, object1); + + udword HashValue = Hash(id0, id1) & mMask; + + ASAP_Pair* P = FindPair(id0, id1, HashValue); + if(P) + { + return P; // Persistent pair + } + + // This is a new pair + if(mNbActivePairs >= mHashSize) + { + // Get more entries + mHashSize = NextPowerOfTwo(mNbActivePairs+1); + mMask = mHashSize-1; + + ReallocPairs(); + + // Recompute hash value with new hash size + HashValue = Hash(id0, id1) & mMask; + } + + ASAP_Pair* p = &mActivePairs[mNbActivePairs]; + p->id0 = id0; // ### CMOVs would be nice here + p->id1 = id1; + p->object0 = object0; + p->object1 = object1; + + mNext[mNbActivePairs] = mHashTable[HashValue]; + mHashTable[HashValue] = mNbActivePairs++; + return p; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +void ASAP_PairManager::RemovePair(uword id0, uword id1, udword hash_value, udword pair_index) +{ + // Walk the hash table to fix mNext + udword Offset = mHashTable[hash_value]; + ASSERT(Offset!=INVALID_ID); + + udword Previous=INVALID_ID; + while(Offset!=pair_index) + { + Previous = Offset; + Offset = mNext[Offset]; + } + + // Let us go/jump us + if(Previous!=INVALID_ID) + { + ASSERT(mNext[Previous]==pair_index); + mNext[Previous] = mNext[pair_index]; + } + // else we were the first + else mHashTable[hash_value] = mNext[pair_index]; + // we're now free to reuse mNext[PairIndex] without breaking the list + +#ifdef _DEBUG + mNext[pair_index]=INVALID_ID; +#endif + // Invalidate entry + + // Fill holes + if(1) + { + // 1) Remove last pair + const udword LastPairIndex = mNbActivePairs-1; + if(LastPairIndex==pair_index) + { + mNbActivePairs--; + } + else + { + const ASAP_Pair* Last = &mActivePairs[LastPairIndex]; + const udword LastHashValue = Hash(Last->id0, Last->id1) & mMask; + + // Walk the hash table to fix mNext + udword Offset = mHashTable[LastHashValue]; + ASSERT(Offset!=INVALID_ID); + + udword Previous=INVALID_ID; + while(Offset!=LastPairIndex) + { + Previous = Offset; + Offset = mNext[Offset]; + } + + // Let us go/jump us + if(Previous!=INVALID_ID) + { + ASSERT(mNext[Previous]==LastPairIndex); + mNext[Previous] = mNext[LastPairIndex]; + } + // else we were the first + else mHashTable[LastHashValue] = mNext[LastPairIndex]; + // we're now free to reuse mNext[LastPairIndex] without breaking the list + +#ifdef _DEBUG + mNext[LastPairIndex]=INVALID_ID; +#endif + + // Don't invalidate entry since we're going to shrink the array + + // 2) Re-insert in free slot + mActivePairs[pair_index] = mActivePairs[LastPairIndex]; +#ifdef _DEBUG + ASSERT(mNext[pair_index]==INVALID_ID); +#endif + mNext[pair_index] = mHashTable[LastHashValue]; + mHashTable[LastHashValue] = pair_index; + + mNbActivePairs--; + } + } +} + +bool ASAP_PairManager::RemovePair(uword id0, uword id1) +{ + // Order the ids + Sort(id0, id1); + + const udword HashValue = Hash(id0, id1) & mMask; + const ASAP_Pair* P = FindPair(id0, id1, HashValue); + if(!P) return false; + ASSERT(P->id0==id0); + ASSERT(P->id1==id1); + + RemovePair(id0, id1, HashValue, GetPairIndex(P)); + + ShrinkMemory(); + return true; +} + +bool ASAP_PairManager::RemovePairs(const BitArray& array) +{ + udword i=0; + while(i only less efficient but still ok + for(udword i=0;i>2; } + }; + + class Opcode::ASAP_Box : public Allocateable + { + public: + inline_ ASAP_Box() {} + inline_ ~ASAP_Box() {} + + IndexType mMin[3]; + IndexType mMax[3]; + void* mObject; + udword mGUID; + + inline_ ValType GetMaxValue(udword i, const ASAP_EndPoint* base) const + { + return base[mMax[i]].mValue; + } + + inline_ ValType GetMinValue(udword i, const ASAP_EndPoint* base) const + { + return base[mMin[i]].mValue; + } +#ifdef _DEBUG + bool HasBeenInserted() const + { + assert(mMin[0]!=INVALID_INDEX); + assert(mMax[0]!=INVALID_INDEX); + assert(mMin[1]!=INVALID_INDEX); + assert(mMax[1]!=INVALID_INDEX); + assert(mMin[2]!=INVALID_INDEX); + assert(mMax[2]!=INVALID_INDEX); + return true; + } +#endif + }; + +inline_ BOOL Intersect1D_Min(const SAP_AABB& a, const ASAP_Box& b, const ASAP_EndPoint* const base, udword axis) +{ + if(b.GetMaxValue(axis, base) < a.GetMin(axis)) + return FALSE; + return TRUE; +} + +inline_ BOOL Intersect2D(const ASAP_Box& c, const ASAP_Box& b, udword axis1, udword axis2) +{ + if( b.mMax[axis1] < c.mMin[axis1] || c.mMax[axis1] < b.mMin[axis1] + || b.mMax[axis2] < c.mMin[axis2] || c.mMax[axis2] < b.mMin[axis2]) return FALSE; + return TRUE; +} + + +ArraySAP::ArraySAP() +{ + mNbBoxes = 0; + mMaxNbBoxes = 0; + mBoxes = null; + mEndPoints[0] = mEndPoints[1] = mEndPoints[2] = null; + mFirstFree = INVALID_ID; +} + +ArraySAP::~ArraySAP() +{ + mNbBoxes = 0; + mMaxNbBoxes = 0; + DELETEARRAY(mBoxes); + for(udword i=0;i<3;i++) + { + DELETEARRAY(mEndPoints[i]); + } +} + +void ArraySAP::ResizeBoxArray() +{ + const udword NewMaxBoxes = mMaxNbBoxes ? mMaxNbBoxes*2 : 64; + + ASAP_Box* NewBoxes = ICE_NEW_TMP(ASAP_Box)[NewMaxBoxes]; + const udword NbSentinels=2; + ASAP_EndPoint* NewEndPointsX = ICE_NEW_TMP(ASAP_EndPoint)[NewMaxBoxes*2+NbSentinels]; + ASAP_EndPoint* NewEndPointsY = ICE_NEW_TMP(ASAP_EndPoint)[NewMaxBoxes*2+NbSentinels]; + ASAP_EndPoint* NewEndPointsZ = ICE_NEW_TMP(ASAP_EndPoint)[NewMaxBoxes*2+NbSentinels]; + + if(mNbBoxes) + { + CopyMemory(NewBoxes, mBoxes, sizeof(ASAP_Box)*mNbBoxes); + CopyMemory(NewEndPointsX, mEndPoints[0], sizeof(ASAP_EndPoint)*(mNbBoxes*2+NbSentinels)); + CopyMemory(NewEndPointsY, mEndPoints[1], sizeof(ASAP_EndPoint)*(mNbBoxes*2+NbSentinels)); + CopyMemory(NewEndPointsZ, mEndPoints[2], sizeof(ASAP_EndPoint)*(mNbBoxes*2+NbSentinels)); + } + else + { + // Initialize sentinels +#ifdef USE_INTEGERS + const udword Min = EncodeFloat(MIN_FLOAT); + const udword Max = EncodeFloat(MAX_FLOAT); +#else + const float Min = MIN_FLOAT; + const float Max = MAX_FLOAT; +#endif + NewEndPointsX[0].SetData(Min, INVALID_INDEX, FALSE); + NewEndPointsX[1].SetData(Max, INVALID_INDEX, TRUE); + NewEndPointsY[0].SetData(Min, INVALID_INDEX, FALSE); + NewEndPointsY[1].SetData(Max, INVALID_INDEX, TRUE); + NewEndPointsZ[0].SetData(Min, INVALID_INDEX, FALSE); + NewEndPointsZ[1].SetData(Max, INVALID_INDEX, TRUE); + } + DELETEARRAY(mBoxes); + DELETEARRAY(mEndPoints[2]); + DELETEARRAY(mEndPoints[1]); + DELETEARRAY(mEndPoints[0]); + mBoxes = NewBoxes; + mEndPoints[0] = NewEndPointsX; + mEndPoints[1] = NewEndPointsY; + mEndPoints[2] = NewEndPointsZ; + + mMaxNbBoxes = NewMaxBoxes; +} + +inline_ BOOL Intersect(const IAABB& a, const IAABB& b, udword axis) +{ + if(b.GetMax(axis) < a.GetMin(axis) || a.GetMax(axis) < b.GetMin(axis)) return FALSE; + return TRUE; +} + +// ### TODO: the sorts here might be useless, as the values have been sorted already +bool ArraySAP::CompleteBoxPruning2(udword nb, const IAABB* array, const Axes& axes, const CreateData* batched) +{ + // Checkings + if(!nb || !array) return false; + + // Catch axes + const udword Axis0 = axes.mAxis0; + const udword Axis1 = axes.mAxis1; + const udword Axis2 = axes.mAxis2; + + // Allocate some temporary data + udword* PosList = (udword*)ICE_ALLOC_TMP(sizeof(udword)*(nb+1)); + + // 1) Build main list using the primary axis + for(udword i=0;iSort(PosList, nb, RADIX_SIGNED).GetRanks(); + const udword* Sorted = RS->Sort(PosList, nb, RADIX_UNSIGNED).GetRanks(); + + // 3) Prune the list + const udword* const LastSorted = &Sorted[nb]; + const udword* RunningAddress = Sorted; + udword Index0, Index1; + while(RunningAddressmObject, Box1->mObject, Box0->mGUID, Box1->mGUID); + } + } + } + } + } + + ICE_FREE(PosList); + return true; +} + +bool ArraySAP::BipartiteBoxPruning2(udword nb0, const IAABB* array0, udword nb1, const IAABB* array1, const Axes& axes, const CreateData* batched, const udword* box_indices) +{ + // Checkings + if(!nb0 || !array0 || !nb1 || !array1) return false; + + // Catch axes + const udword Axis0 = axes.mAxis0; + const udword Axis1 = axes.mAxis1; + const udword Axis2 = axes.mAxis2; + + // Allocate some temporary data + udword* MinPosList0 = (udword*)ICE_ALLOC_TMP(sizeof(udword)*nb0); + udword* MinPosList1 = (udword*)ICE_ALLOC_TMP(sizeof(udword)*nb1); + + // 1) Build main lists using the primary axis + for(udword i=0;iSort(MinPosList0, nb0, RADIX_UNSIGNED).GetRanks(); + const udword* Sorted1 = RS1->Sort(MinPosList1, nb1, RADIX_UNSIGNED).GetRanks(); + + // 3) Prune the lists + udword Index0, Index1; + + const udword* const LastSorted0 = &Sorted0[nb0]; + const udword* const LastSorted1 = &Sorted1[nb1]; + const udword* RunningAddress0 = Sorted0; + const udword* RunningAddress1 = Sorted1; + + while(RunningAddress1mObject, Box1->mObject, Box0->mGUID, Box1->mGUID); + } + } + } + } + + //// + + while(RunningAddress0mObject, Box1->mObject, Box0->mGUID, Box1->mGUID); + } + } + + } + } + + ICE_FREE(MinPosList0); + ICE_FREE(MinPosList1); + return true; +} + +udword ArraySAP::AddObject(void* object, uword guid, const AABB& box) +{ + assert(!(size_t(object)&3)); // We will use the 2 LSBs + +#ifdef _DEBUG + int a = sizeof(ASAP_Box); // 32 + int b = sizeof(ASAP_EndPoint); // 8 +#endif + + udword BoxIndex; + if(mFirstFree!=INVALID_ID) + { + BoxIndex = mFirstFree; + mFirstFree = mBoxes[BoxIndex].mGUID; + } + else + { + if(mNbBoxes==mMaxNbBoxes) + ResizeBoxArray(); + BoxIndex = mNbBoxes; + } + + ASAP_Box* Box = &mBoxes[BoxIndex]; + // Initialize box + Box->mObject = object; + Box->mGUID = guid; + for(udword i=0;i<3;i++) + { + Box->mMin[i] = INVALID_INDEX; + Box->mMax[i] = INVALID_INDEX; + } + + mNbBoxes++; + + CreateData* CD = (CreateData*)mCreated.Reserve(sizeof(CreateData)/sizeof(udword)); + CD->mHandle = BoxIndex; + CD->mBox = box; + + return BoxIndex; +} + +void ArraySAP::InsertEndPoints(udword axis, const ASAP_EndPoint* end_points, udword nb_endpoints) +{ + ASAP_EndPoint* const BaseEP = mEndPoints[axis]; + + const udword OldSize = mNbBoxes*2 - nb_endpoints; + const udword NewSize = mNbBoxes*2; + + BaseEP[NewSize + 1] = BaseEP[OldSize + 1]; + + sdword WriteIdx = NewSize; + udword CurrInsIdx = 0; + + const ASAP_EndPoint* First = &BaseEP[0]; + const ASAP_EndPoint* Current = &BaseEP[OldSize]; + while(Current>=First) + { + const ASAP_EndPoint& Src = *Current; + const ASAP_EndPoint& Ins = end_points[CurrInsIdx]; + + // We need to make sure we insert maxs before mins to handle exactly equal endpoints correctly + const bool ShouldInsert = Ins.IsMax() ? (Src.mValue <= Ins.mValue) : (Src.mValue < Ins.mValue); + + const ASAP_EndPoint& Moved = ShouldInsert ? Ins : Src; + BaseEP[WriteIdx] = Moved; + mBoxes[Moved.GetOwner()].mMin[axis + Moved.IsMax()] = WriteIdx--; + + if(ShouldInsert) + { + CurrInsIdx++; + if(CurrInsIdx >= nb_endpoints) + break;//we just inserted the last endpoint + } + else + { + Current--; + } + } +} + +void ArraySAP::BatchCreate() +{ + udword NbBatched = mCreated.GetNbEntries(); + if(!NbBatched) return; // Early-exit if no object has been created + NbBatched /= sizeof(CreateData)/sizeof(udword); + const CreateData* Batched = (const CreateData*)mCreated.GetEntries(); + mCreated.Reset(); + + { + const udword NbEndPoints = NbBatched*2; + ASAP_EndPoint* NewEPSorted = ICE_NEW_TMP(ASAP_EndPoint)[NbEndPoints]; + ASAP_EndPoint* Buffer = (ASAP_EndPoint*)ICE_ALLOC_TMP(sizeof(ASAP_EndPoint)*NbEndPoints); + RadixSort RS; + + for(udword Axis=0;Axis<3;Axis++) + { + for(udword i=0;iHasBeenInserted()); + } + for(udword i=0;imMin[0]; + NewBoxes[i].mMaxX = Box->mMax[0]; + NewBoxes[i].mMinY = Box->mMin[1]; + NewBoxes[i].mMaxY = Box->mMax[1]; + NewBoxes[i].mMinZ = Box->mMin[2]; + NewBoxes[i].mMaxZ = Box->mMax[2]; + } + + CompleteBoxPruning2(NbBatched, NewBoxes, Axes(AXES_XZY), Batched); + + // the old boxes are not the first ones in the array + + const udword NbOldBoxes = mNbBoxes - NbBatched; + if(NbOldBoxes) + { + IAABB* OldBoxes = ICE_NEW_TMP(IAABB)[NbOldBoxes]; + udword* OldBoxesIndices = (udword*)ICE_ALLOC_TMP(sizeof(udword)*NbOldBoxes); + udword Offset=0; + udword i=0; + while(imMin[0]; + OldBoxes[i].mMaxX = Box->mMax[0]; + OldBoxes[i].mMinY = Box->mMin[1]; + OldBoxes[i].mMaxY = Box->mMax[1]; + OldBoxes[i].mMinZ = Box->mMin[2]; + OldBoxes[i].mMaxZ = Box->mMax[2]; + Offset++; + i++; + } + assert(i==NbOldBoxes); + + BipartiteBoxPruning2(NbBatched, NewBoxes, NbOldBoxes, OldBoxes, Axes(AXES_XZY), Batched, OldBoxesIndices); + + ICE_FREE(OldBoxesIndices); + DELETEARRAY(OldBoxes); + } + DELETEARRAY(NewBoxes); + } +#ifdef RELEASE_ON_RESET + mCreated.Empty(); +#endif +} + +void ArraySAP::BatchRemove() +{ + udword NbRemoved = mRemoved.GetNbEntries(); + if(!NbRemoved) return; // Early-exit if no object has been removed + const udword* Removed = mRemoved.GetEntries(); + mRemoved.Reset(); + + for(udword Axis=0;Axis<3;Axis++) + { + ASAP_EndPoint* const BaseEP = mEndPoints[Axis]; + udword MinMinIndex = MAX_UDWORD; + for(udword i=0;imMin[Axis]; + assert(MinIndexmMax[Axis]; + assert(MaxIndexmMin[Axis + BaseEP[DestIndex].IsMax()] = DestIndex; + } + } + DestIndex++; + ReadIndex++; + } + } + } + + BitArray BA(65536); + const udword Saved = NbRemoved; + while(NbRemoved--) + { + udword Index = *Removed++; + assert(IndexmGUID < 65536); + BA.SetBit(Object->mGUID); + + Object->mGUID = mFirstFree; + mFirstFree = Index; + } + mNbBoxes -= Saved; + mPairs.RemovePairs(BA); + +#ifdef RELEASE_ON_RESET + mRemoved.Empty(); +#endif +} + +bool ArraySAP::RemoveObject(udword handle) +{ + mRemoved.Add(handle); + return true; +} + +#ifdef USE_INTEGERS +bool ArraySAP::UpdateObject(udword handle, const AABB& box_) +#else +bool ArraySAP::UpdateObject(udword handle, const AABB& box) +#endif +{ + const ASAP_Box* Object = mBoxes + handle; + assert(Object->HasBeenInserted()); + const void* UserObject = Object->mObject; + const udword UserGUID = Object->mGUID; + +#ifdef USE_INTEGERS + IAABB box; + box.mMinX = EncodeFloat(box_.GetMin(0)); + box.mMinY = EncodeFloat(box_.GetMin(1)); + box.mMinZ = EncodeFloat(box_.GetMin(2)); + box.mMaxX = EncodeFloat(box_.GetMax(0)); + box.mMaxY = EncodeFloat(box_.GetMax(1)); + box.mMaxZ = EncodeFloat(box_.GetMax(2)); +#endif + + for(udword Axis=0;Axis<3;Axis++) + { + const udword Axis1 = (1 << Axis) & 3; + const udword Axis2 = (1 << Axis1) & 3; + + ASAP_EndPoint* const BaseEP = mEndPoints[Axis]; + + // Update min + { + ASAP_EndPoint* CurrentMin = BaseEP + Object->mMin[Axis]; + ASSERT(!CurrentMin->IsMax()); + + const ValType Limit = box.GetMin(Axis); + if(Limit < CurrentMin->mValue) + { + CurrentMin->mValue = Limit; + + // Min is moving left: + ASAP_EndPoint Saved = *CurrentMin; + udword EPIndex = (size_t(CurrentMin) - size_t(BaseEP))/sizeof(ASAP_EndPoint); + const udword SavedIndex = EPIndex; + + while((--CurrentMin)->mValue > Limit) + { +#ifdef USE_PREFETCH + _prefetch(CurrentMin-1); +#endif + ASAP_Box* id1 = mBoxes + CurrentMin->GetOwner(); + const BOOL IsMax = CurrentMin->IsMax(); + if(IsMax) + { + // Our min passed a max => start overlap + if(Object!=id1 + && Intersect2D(*Object, *id1, Axis1, Axis2) + && Intersect1D_Min(box, *id1, BaseEP, Axis) + ) + AddPair(UserObject, id1->mObject, UserGUID, id1->mGUID); + } + + id1->mMin[Axis + IsMax] = EPIndex--; + *(CurrentMin+1) = *CurrentMin; + } + + if(SavedIndex!=EPIndex) + { + mBoxes[Saved.GetOwner()].mMin[Axis + Saved.IsMax()] = EPIndex; + BaseEP[EPIndex] = Saved; + } + } + else if(Limit > CurrentMin->mValue) + { + CurrentMin->mValue = Limit; + + // Min is moving right: + ASAP_EndPoint Saved = *CurrentMin; + udword EPIndex = (size_t(CurrentMin) - size_t(BaseEP))/sizeof(ASAP_EndPoint); + const udword SavedIndex = EPIndex; + + while((++CurrentMin)->mValue < Limit) + { +#ifdef USE_PREFETCH + _prefetch(CurrentMin+1); +#endif + ASAP_Box* id1 = mBoxes + CurrentMin->GetOwner(); + const BOOL IsMax = CurrentMin->IsMax(); + if(IsMax) + { + // Our min passed a max => stop overlap + if(Object!=id1 +#ifdef USE_OVERLAP_TEST_ON_REMOVES + && Intersect2D(*Object, *id1, Axis1, Axis2) +#endif + ) + RemovePair(UserObject, id1->mObject, UserGUID, id1->mGUID); + } + + id1->mMin[Axis + IsMax] = EPIndex++; + *(CurrentMin-1) = *CurrentMin; + } + + if(SavedIndex!=EPIndex) + { + mBoxes[Saved.GetOwner()].mMin[Axis + Saved.IsMax()] = EPIndex; + BaseEP[EPIndex] = Saved; + } + } + } + + // Update max + { + ASAP_EndPoint* CurrentMax = BaseEP + Object->mMax[Axis]; + ASSERT(CurrentMax->IsMax()); + + const ValType Limit = box.GetMax(Axis); + if(Limit > CurrentMax->mValue) + { + CurrentMax->mValue = Limit; + + // Max is moving right: + ASAP_EndPoint Saved = *CurrentMax; + udword EPIndex = (size_t(CurrentMax) - size_t(BaseEP))/sizeof(ASAP_EndPoint); + const udword SavedIndex = EPIndex; + + while((++CurrentMax)->mValue < Limit) + { +#ifdef USE_PREFETCH + _prefetch(CurrentMax+1); +#endif + ASAP_Box* id1 = mBoxes + CurrentMax->GetOwner(); + const BOOL IsMax = CurrentMax->IsMax(); + if(!IsMax) + { + // Our max passed a min => start overlap + if(Object!=id1 + && Intersect2D(*Object, *id1, Axis1, Axis2) + && Intersect1D_Min(box, *id1, BaseEP, Axis) + ) + AddPair(UserObject, id1->mObject, UserGUID, id1->mGUID); + } + + id1->mMin[Axis + IsMax] = EPIndex++; + *(CurrentMax-1) = *CurrentMax; + } + + if(SavedIndex!=EPIndex) + { + mBoxes[Saved.GetOwner()].mMin[Axis + Saved.IsMax()] = EPIndex; + BaseEP[EPIndex] = Saved; + } + } + else if(Limit < CurrentMax->mValue) + { + CurrentMax->mValue = Limit; + + // Max is moving left: + ASAP_EndPoint Saved = *CurrentMax; + udword EPIndex = (size_t(CurrentMax) - size_t(BaseEP))/sizeof(ASAP_EndPoint); + const udword SavedIndex = EPIndex; + + while((--CurrentMax)->mValue > Limit) + { +#ifdef USE_PREFETCH + _prefetch(CurrentMax-1); +#endif + ASAP_Box* id1 = mBoxes + CurrentMax->GetOwner(); + const BOOL IsMax = CurrentMax->IsMax(); + if(!IsMax) + { + // Our max passed a min => stop overlap + if(Object!=id1 +#ifdef USE_OVERLAP_TEST_ON_REMOVES + && Intersect2D(*Object, *id1, Axis1, Axis2) +#endif + ) + RemovePair(UserObject, id1->mObject, UserGUID, id1->mGUID); + } + + id1->mMin[Axis + IsMax] = EPIndex--; + *(CurrentMax+1) = *CurrentMax; + } + + if(SavedIndex!=EPIndex) + { + mBoxes[Saved.GetOwner()].mMin[Axis + Saved.IsMax()] = EPIndex; + BaseEP[EPIndex] = Saved; + } + } + } + } + return true; +} + +udword ArraySAP::DumpPairs(SAP_CreatePair create_cb, SAP_DeletePair delete_cb, void* cb_user_data, ASAP_Pair** pairs) +{ + BatchCreate(); + + const udword* Entries = mData.GetEntries(); + const udword* Last = Entries + mData.GetNbEntries(); + mData.Reset(); + + udword* ToRemove = (udword*)Entries; + while(Entries!=Last) + { + const udword ID = *Entries++; + ASAP_Pair* UP = mPairs.mActivePairs + ID; + + { + ASSERT(UP->IsInArray()); + if(UP->IsRemoved()) + { + // No need to call "ClearInArray" in this case, since the pair will get removed anyway + + // Remove + if(delete_cb && !UP->IsNew()) + { +#ifdef PAIR_USER_DATA + (delete_cb)(UP->GetObject0(), UP->GetObject1(), cb_user_data, UP->userData); +#else + (delete_cb)(UP->GetObject0(), UP->GetObject1(), cb_user_data, null); +#endif + } + + *ToRemove++ = udword(UP->id0)<<16|UP->id1; + } + else + { + UP->ClearInArray(); + // Add => already there... Might want to create user data, though + if(UP->IsNew()) + { + if(create_cb) + { +#ifdef PAIR_USER_DATA + UP->userData = (create_cb)(UP->GetObject0(), UP->GetObject1(), cb_user_data); +#else + (create_cb)(UP->GetObject0(), UP->GetObject1(), cb_user_data); +#endif + } + UP->ClearNew(); + } + } + } + } + + // #### try batch removal here + Entries = mData.GetEntries(); + while(Entries!=ToRemove) + { + const udword ID = *Entries++; + const udword id0 = ID>>16; + const udword id1 = ID&0xffff; + bool Status = mPairs.RemovePair(id0, id1); + ASSERT(Status); + } + +#ifdef RELEASE_ON_RESET + mData.Empty(); +#endif + + BatchRemove(); + + if(pairs) *pairs = mPairs.mActivePairs; + + return mPairs.mNbActivePairs; +} diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_ArraySAP.h b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_ArraySAP.h new file mode 100644 index 00000000..db355718 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_ArraySAP.h @@ -0,0 +1,159 @@ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/* + * OPCODE - Optimized Collision Detection + * Copyright (C) 2001 Pierre Terdiman + * Homepage: http://www.codercorner.com/Opcode.htm + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains an array-based version of the sweep-and-prune algorithm + * \file OPC_ArraySAP.h + * \author Pierre Terdiman + * \date December, 2, 2007 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef OPC_ARRAYSAP_H +#define OPC_ARRAYSAP_H + +#pragma pack(1) + struct OPCODE_API ASAP_Pair + { + uword id0; + uword id1; + const void* object0; + const void* object1; +//#ifdef PAIR_USER_DATA + void* userData; +//#endif + inline_ const void* GetObject0() const { return (const void*)(size_t(object0) & ~3); } + inline_ const void* GetObject1() const { return (const void*)(size_t(object1) & ~3); } + inline_ size_t IsInArray() const { return size_t(object0) & 1; } + inline_ size_t IsRemoved() const { return size_t(object1) & 1; } + inline_ size_t IsNew() const { return size_t(object0) & 2; } + private: + inline_ void SetInArray() { object0 = (const void*)(size_t(object0) | 1); } + inline_ void SetRemoved() { object1 = (const void*)(size_t(object1) | 1); } + inline_ void SetNew() { object0 = (const void*)(size_t(object0) | 2); } + inline_ void ClearInArray() { object0 = (const void*)(size_t(object0) & ~1); } + inline_ void ClearRemoved() { object1 = (const void*)(size_t(object1) & ~1); } + inline_ void ClearNew() { object0 = (const void*)(size_t(object0) & ~2); } + + friend class ArraySAP; + }; +#pragma pack() + + class OPCODE_API ASAP_PairManager + { + public: + ASAP_PairManager(); + ~ASAP_PairManager(); + + void Purge(); + void ShrinkMemory(); + + const ASAP_Pair* AddPair (uword id0, uword id1, const void* object0, const void* object1); + bool RemovePair (uword id0, uword id1); + bool RemovePairs (const BitArray& array); + const ASAP_Pair* FindPair (uword id0, uword id1) const; + inline_ udword GetPairIndex(const ASAP_Pair* pair) const + { + return ((udword)((size_t(pair) - size_t(mActivePairs)))/sizeof(ASAP_Pair)); + } + + udword mHashSize; + udword mMask; + udword mNbActivePairs; + udword* mHashTable; + udword* mNext; + ASAP_Pair* mActivePairs; + inline_ ASAP_Pair* FindPair(uword id0, uword id1, udword hash_value) const; + void RemovePair(uword id0, uword id1, udword hash_value, udword pair_index); + void ReallocPairs(); + }; + + typedef void* (*SAP_CreatePair)(const void* object0, const void* object1, void* user_data); + typedef void (*SAP_DeletePair)(const void* object0, const void* object1, void* user_data, void* pair_user_data); + + // Forward declarations + class ASAP_EndPoint; + class ASAP_Box; + struct IAABB; + struct CreateData; + + class OPCODE_API ArraySAP : public Allocateable + { + public: + ArraySAP(); + ~ArraySAP(); + + udword AddObject(void* object, uword guid, const AABB& box); + bool RemoveObject(udword handle); + bool UpdateObject(udword handle, const AABB& box); + + udword DumpPairs(SAP_CreatePair create_cb, SAP_DeletePair delete_cb, void* cb_user_data, ASAP_Pair** pairs=null); + private: + Container mData; + ASAP_PairManager mPairs; + + inline_ void AddPair(const void* object0, const void* object1, uword id0, uword id1) + { + ASSERT(object0); + ASAP_Pair* UP = (ASAP_Pair*)mPairs.AddPair(id0, id1, null, null); + ASSERT(UP); + + if(UP->object0) + { + // Persistent pair + } + else + { + // New pair + ASSERT(!(int(object0)&1)); + ASSERT(!(int(object1)&1)); + UP->object0 = object0; + UP->object1 = object1; + UP->SetInArray(); + mData.Add(mPairs.GetPairIndex(UP)); + UP->SetNew(); + } + UP->ClearRemoved(); + } + + inline_ void RemovePair(const void* object0, const void* object1, uword id0, uword id1) + { + ASAP_Pair* UP = (ASAP_Pair*)mPairs.FindPair(id0, id1); + if(UP) + { + if(!UP->IsInArray()) + { + UP->SetInArray(); + mData.Add(mPairs.GetPairIndex(UP)); + } + UP->SetRemoved(); + } + } + + udword mNbBoxes; + udword mMaxNbBoxes; + ASAP_Box* mBoxes; + ASAP_EndPoint* mEndPoints[3]; + udword mFirstFree; + + void ResizeBoxArray(); + // For batch creation + Container mCreated; + void BatchCreate(); + void InsertEndPoints(udword axis, const ASAP_EndPoint* end_points, udword nb_endpoints); + bool CompleteBoxPruning2(udword nb, const IAABB* array, const Axes& axes, const CreateData* batched); + bool BipartiteBoxPruning2(udword nb0, const IAABB* array0, udword nb1, const IAABB* array1, const Axes& axes, const CreateData* batched, const udword* box_indices); + // For batch removal + Container mRemoved; + void BatchRemove(); + }; + +#endif // OPC_ARRAYSAP_H diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_BaseModel.cpp b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_BaseModel.cpp new file mode 100644 index 00000000..bdb2ae8e --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_BaseModel.cpp @@ -0,0 +1,147 @@ +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains base model interface. + * \file OPC_BaseModel.cpp + * \author Pierre Terdiman + * \date May, 18, 2003 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * The base class for collision models. + * + * \class BaseModel + * \author Pierre Terdiman + * \version 1.3 + * \date May, 18, 2003 +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Precompiled Header +#include "Stdafx.h" + +using namespace Opcode; + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Constructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +OPCODECREATE::OPCODECREATE() +{ + mIMesh = null; + mSettings.mRules = SPLIT_SPLATTER_POINTS | SPLIT_GEOM_CENTER; + mSettings.mLimit = 1; // Mandatory for complete trees + mNoLeaf = true; + mQuantized = true; +#ifdef __MESHMERIZER_H__ + mCollisionHull = false; +#endif // __MESHMERIZER_H__ + mKeepOriginal = false; + mCanRemap = false; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Constructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +BaseModel::BaseModel() : mIMesh(null), mModelCode(0), mSource(null), mTree(null) +{ +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Destructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +BaseModel::~BaseModel() +{ + ReleaseBase(); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Releases everything. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void BaseModel::ReleaseBase() +{ + DELETESINGLE(mSource); + DELETESINGLE(mTree); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Creates an optimized tree according to user-settings, and setups mModelCode. + * \param no_leaf [in] true for "no leaf" tree + * \param quantized [in] true for quantized tree + * \return true if success + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool BaseModel::CreateTree(bool no_leaf, bool quantized) +{ + DELETESINGLE(mTree); + + // Setup model code + if(no_leaf) mModelCode |= OPC_NO_LEAF; + else mModelCode &= ~OPC_NO_LEAF; + + if(quantized) mModelCode |= OPC_QUANTIZED; + else mModelCode &= ~OPC_QUANTIZED; + + // Create the correct class + if(mModelCode & OPC_NO_LEAF) + { + if(mModelCode & OPC_QUANTIZED) mTree = new AABBQuantizedNoLeafTree; + else mTree = new AABBNoLeafTree; + } + else + { + if(mModelCode & OPC_QUANTIZED) mTree = new AABBQuantizedTree; + else mTree = new AABBCollisionTree; + } + CHECKALLOC(mTree); + + return true; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Refits the collision model. This can be used to handle dynamic meshes. Usage is: + * 1. modify your mesh vertices (keep the topology constant!) + * 2. refit the tree (call this method) + * \return true if success + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool BaseModel::Refit() +{ + // Refit the optimized tree + return mTree->Refit(mIMesh); + +// Old code kept for reference : refit the source tree then rebuild ! +// if(!mSource) return false; +// // Ouch... +// mSource->Refit(&mTB); +// // Ouch... +// return mTree->Build(mSource); +} diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_BaseModel.h b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_BaseModel.h new file mode 100644 index 00000000..905fc92a --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_BaseModel.h @@ -0,0 +1,184 @@ +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains base model interface. + * \file OPC_BaseModel.h + * \author Pierre Terdiman + * \date May, 18, 2003 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef __OPC_BASEMODEL_H__ +#define __OPC_BASEMODEL_H__ + + //! Model creation structure + struct OPCODE_API OPCODECREATE + { + //! Constructor + OPCODECREATE(); + + MeshInterface* mIMesh; //!< Mesh interface (access to triangles & vertices) (*) + BuildSettings mSettings; //!< Builder's settings + bool mNoLeaf; //!< true => discard leaf nodes (else use a normal tree) + bool mQuantized; //!< true => quantize the tree (else use a normal tree) +#ifdef __MESHMERIZER_H__ + bool mCollisionHull; //!< true => use convex hull + GJK +#endif // __MESHMERIZER_H__ + bool mKeepOriginal; //!< true => keep a copy of the original tree (debug purpose) + bool mCanRemap; //!< true => allows OPCODE to reorganize client arrays + + // (*) This pointer is saved internally and used by OPCODE until collision structures are released, + // so beware of the object's lifetime. + }; + + enum ModelFlag + { + OPC_QUANTIZED = (1<<0), //!< Compressed/uncompressed tree + OPC_NO_LEAF = (1<<1), //!< Leaf/NoLeaf tree + OPC_SINGLE_NODE = (1<<2) //!< Special case for 1-node models + }; + + class OPCODE_API BaseModel + { + public: + // Constructor/Destructor + BaseModel(); + virtual ~BaseModel(); + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Builds a collision model. + * \param create [in] model creation structure + * \return true if success + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + virtual bool Build(const OPCODECREATE& create) = 0; + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Gets the number of bytes used by the tree. + * \return amount of bytes used + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + virtual udword GetUsedBytes() const = 0; + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Refits the collision model. This can be used to handle dynamic meshes. Usage is: + * 1. modify your mesh vertices (keep the topology constant!) + * 2. refit the tree (call this method) + * \return true if success + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + virtual bool Refit(); + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Gets the source tree. + * \return generic tree + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ const AABBTree* GetSourceTree() const { return mSource; } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Gets the tree. + * \return the collision tree + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ const AABBOptimizedTree* GetTree() const { return mTree; } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Gets the tree. + * \return the collision tree + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ AABBOptimizedTree* GetTree() { return mTree; } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Gets the number of nodes in the tree. + * Should be 2*N-1 for normal trees and N-1 for optimized ones. + * \return number of nodes + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ udword GetNbNodes() const { return mTree->GetNbNodes(); } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Checks whether the tree has leaf nodes or not. + * \return true if the tree has leaf nodes (normal tree), else false (optimized tree) + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ BOOL HasLeafNodes() const { return !(mModelCode & OPC_NO_LEAF); } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Checks whether the tree is quantized or not. + * \return true if the tree is quantized + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ BOOL IsQuantized() const { return mModelCode & OPC_QUANTIZED; } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Checks whether the model has a single node or not. This special case must be handled separately. + * \return true if the model has only 1 node + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ BOOL HasSingleNode() const { return mModelCode & OPC_SINGLE_NODE; } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Gets the model's code. + * \return model's code + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ udword GetModelCode() const { return mModelCode; } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Gets the mesh interface. + * \return mesh interface + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ const MeshInterface* GetMeshInterface() const { return mIMesh; } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Sets the mesh interface. + * \param imesh [in] mesh interface + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ void SetMeshInterface(const MeshInterface* imesh) { mIMesh = imesh; } + + protected: + const MeshInterface* mIMesh; //!< User-defined mesh interface + udword mModelCode; //!< Model code = combination of ModelFlag(s) + AABBTree* mSource; //!< Original source tree + AABBOptimizedTree* mTree; //!< Optimized tree owned by the model + // Internal methods + void ReleaseBase(); + bool CreateTree(bool no_leaf, bool quantized); + }; + +#endif //__OPC_BASEMODEL_H__ \ No newline at end of file diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_BoxBoxOverlap.h b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_BoxBoxOverlap.h new file mode 100644 index 00000000..63aa87ec --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_BoxBoxOverlap.h @@ -0,0 +1,139 @@ +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * OBB-OBB overlap test using the separating axis theorem. + * - original code by Gomez / Gamasutra (similar to Gottschalk's one in RAPID) + * - optimized for AABB trees by computing the rotation matrix once (SOLID-fashion) + * - the fabs matrix is precomputed as well and epsilon-tweaked (RAPID-style, we found this almost mandatory) + * - Class III axes can be disabled... (SOLID & Intel fashion) + * - ...or enabled to perform some profiling + * - CPU comparisons used when appropriate + * - lazy evaluation sometimes saves some work in case of early exits (unlike SOLID) + * + * \param ea [in] extents from box A + * \param ca [in] center from box A + * \param eb [in] extents from box B + * \param cb [in] center from box B + * \return true if boxes overlap + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +inline_ BOOL AABBTreeCollider::BoxBoxOverlap(const Point& ea, const Point& ca, const Point& eb, const Point& cb) +{ + // Stats + mNbBVBVTests++; + + float t,t2; + + // Class I : A's basis vectors + float Tx = (mR1to0.m[0][0]*cb.x + mR1to0.m[1][0]*cb.y + mR1to0.m[2][0]*cb.z) + mT1to0.x - ca.x; + t = ea.x + eb.x*mAR.m[0][0] + eb.y*mAR.m[1][0] + eb.z*mAR.m[2][0]; + if(GREATER(Tx, t)) return FALSE; + + float Ty = (mR1to0.m[0][1]*cb.x + mR1to0.m[1][1]*cb.y + mR1to0.m[2][1]*cb.z) + mT1to0.y - ca.y; + t = ea.y + eb.x*mAR.m[0][1] + eb.y*mAR.m[1][1] + eb.z*mAR.m[2][1]; + if(GREATER(Ty, t)) return FALSE; + + float Tz = (mR1to0.m[0][2]*cb.x + mR1to0.m[1][2]*cb.y + mR1to0.m[2][2]*cb.z) + mT1to0.z - ca.z; + t = ea.z + eb.x*mAR.m[0][2] + eb.y*mAR.m[1][2] + eb.z*mAR.m[2][2]; + if(GREATER(Tz, t)) return FALSE; + + // Class II : B's basis vectors + t = Tx*mR1to0.m[0][0] + Ty*mR1to0.m[0][1] + Tz*mR1to0.m[0][2]; t2 = ea.x*mAR.m[0][0] + ea.y*mAR.m[0][1] + ea.z*mAR.m[0][2] + eb.x; + if(GREATER(t, t2)) return FALSE; + + t = Tx*mR1to0.m[1][0] + Ty*mR1to0.m[1][1] + Tz*mR1to0.m[1][2]; t2 = ea.x*mAR.m[1][0] + ea.y*mAR.m[1][1] + ea.z*mAR.m[1][2] + eb.y; + if(GREATER(t, t2)) return FALSE; + + t = Tx*mR1to0.m[2][0] + Ty*mR1to0.m[2][1] + Tz*mR1to0.m[2][2]; t2 = ea.x*mAR.m[2][0] + ea.y*mAR.m[2][1] + ea.z*mAR.m[2][2] + eb.z; + if(GREATER(t, t2)) return FALSE; + + // Class III : 9 cross products + // Cool trick: always perform the full test for first level, regardless of settings. + // That way pathological cases (such as the pencils scene) are quickly rejected anyway ! + if(mFullBoxBoxTest || mNbBVBVTests==1) + { + t = Tz*mR1to0.m[0][1] - Ty*mR1to0.m[0][2]; t2 = ea.y*mAR.m[0][2] + ea.z*mAR.m[0][1] + eb.y*mAR.m[2][0] + eb.z*mAR.m[1][0]; if(GREATER(t, t2)) return FALSE; // L = A0 x B0 + t = Tz*mR1to0.m[1][1] - Ty*mR1to0.m[1][2]; t2 = ea.y*mAR.m[1][2] + ea.z*mAR.m[1][1] + eb.x*mAR.m[2][0] + eb.z*mAR.m[0][0]; if(GREATER(t, t2)) return FALSE; // L = A0 x B1 + t = Tz*mR1to0.m[2][1] - Ty*mR1to0.m[2][2]; t2 = ea.y*mAR.m[2][2] + ea.z*mAR.m[2][1] + eb.x*mAR.m[1][0] + eb.y*mAR.m[0][0]; if(GREATER(t, t2)) return FALSE; // L = A0 x B2 + t = Tx*mR1to0.m[0][2] - Tz*mR1to0.m[0][0]; t2 = ea.x*mAR.m[0][2] + ea.z*mAR.m[0][0] + eb.y*mAR.m[2][1] + eb.z*mAR.m[1][1]; if(GREATER(t, t2)) return FALSE; // L = A1 x B0 + t = Tx*mR1to0.m[1][2] - Tz*mR1to0.m[1][0]; t2 = ea.x*mAR.m[1][2] + ea.z*mAR.m[1][0] + eb.x*mAR.m[2][1] + eb.z*mAR.m[0][1]; if(GREATER(t, t2)) return FALSE; // L = A1 x B1 + t = Tx*mR1to0.m[2][2] - Tz*mR1to0.m[2][0]; t2 = ea.x*mAR.m[2][2] + ea.z*mAR.m[2][0] + eb.x*mAR.m[1][1] + eb.y*mAR.m[0][1]; if(GREATER(t, t2)) return FALSE; // L = A1 x B2 + t = Ty*mR1to0.m[0][0] - Tx*mR1to0.m[0][1]; t2 = ea.x*mAR.m[0][1] + ea.y*mAR.m[0][0] + eb.y*mAR.m[2][2] + eb.z*mAR.m[1][2]; if(GREATER(t, t2)) return FALSE; // L = A2 x B0 + t = Ty*mR1to0.m[1][0] - Tx*mR1to0.m[1][1]; t2 = ea.x*mAR.m[1][1] + ea.y*mAR.m[1][0] + eb.x*mAR.m[2][2] + eb.z*mAR.m[0][2]; if(GREATER(t, t2)) return FALSE; // L = A2 x B1 + t = Ty*mR1to0.m[2][0] - Tx*mR1to0.m[2][1]; t2 = ea.x*mAR.m[2][1] + ea.y*mAR.m[2][0] + eb.x*mAR.m[1][2] + eb.y*mAR.m[0][2]; if(GREATER(t, t2)) return FALSE; // L = A2 x B2 + } + return TRUE; +} + +//! A dedicated version when one box is constant +inline_ BOOL OBBCollider::BoxBoxOverlap(const Point& extents, const Point& center) +{ + // Stats + mNbVolumeBVTests++; + + float t,t2; + + // Class I : A's basis vectors + float Tx = mTBoxToModel.x - center.x; t = extents.x + mBBx1; if(GREATER(Tx, t)) return FALSE; + float Ty = mTBoxToModel.y - center.y; t = extents.y + mBBy1; if(GREATER(Ty, t)) return FALSE; + float Tz = mTBoxToModel.z - center.z; t = extents.z + mBBz1; if(GREATER(Tz, t)) return FALSE; + + // Class II : B's basis vectors + t = Tx*mRBoxToModel.m[0][0] + Ty*mRBoxToModel.m[0][1] + Tz*mRBoxToModel.m[0][2]; + t2 = extents.x*mAR.m[0][0] + extents.y*mAR.m[0][1] + extents.z*mAR.m[0][2] + mBoxExtents.x; + if(GREATER(t, t2)) return FALSE; + + t = Tx*mRBoxToModel.m[1][0] + Ty*mRBoxToModel.m[1][1] + Tz*mRBoxToModel.m[1][2]; + t2 = extents.x*mAR.m[1][0] + extents.y*mAR.m[1][1] + extents.z*mAR.m[1][2] + mBoxExtents.y; + if(GREATER(t, t2)) return FALSE; + + t = Tx*mRBoxToModel.m[2][0] + Ty*mRBoxToModel.m[2][1] + Tz*mRBoxToModel.m[2][2]; + t2 = extents.x*mAR.m[2][0] + extents.y*mAR.m[2][1] + extents.z*mAR.m[2][2] + mBoxExtents.z; + if(GREATER(t, t2)) return FALSE; + + // Class III : 9 cross products + // Cool trick: always perform the full test for first level, regardless of settings. + // That way pathological cases (such as the pencils scene) are quickly rejected anyway ! + if(mFullBoxBoxTest || mNbVolumeBVTests==1) + { + t = Tz*mRBoxToModel.m[0][1] - Ty*mRBoxToModel.m[0][2]; t2 = extents.y*mAR.m[0][2] + extents.z*mAR.m[0][1] + mBB_1; if(GREATER(t, t2)) return FALSE; // L = A0 x B0 + t = Tz*mRBoxToModel.m[1][1] - Ty*mRBoxToModel.m[1][2]; t2 = extents.y*mAR.m[1][2] + extents.z*mAR.m[1][1] + mBB_2; if(GREATER(t, t2)) return FALSE; // L = A0 x B1 + t = Tz*mRBoxToModel.m[2][1] - Ty*mRBoxToModel.m[2][2]; t2 = extents.y*mAR.m[2][2] + extents.z*mAR.m[2][1] + mBB_3; if(GREATER(t, t2)) return FALSE; // L = A0 x B2 + t = Tx*mRBoxToModel.m[0][2] - Tz*mRBoxToModel.m[0][0]; t2 = extents.x*mAR.m[0][2] + extents.z*mAR.m[0][0] + mBB_4; if(GREATER(t, t2)) return FALSE; // L = A1 x B0 + t = Tx*mRBoxToModel.m[1][2] - Tz*mRBoxToModel.m[1][0]; t2 = extents.x*mAR.m[1][2] + extents.z*mAR.m[1][0] + mBB_5; if(GREATER(t, t2)) return FALSE; // L = A1 x B1 + t = Tx*mRBoxToModel.m[2][2] - Tz*mRBoxToModel.m[2][0]; t2 = extents.x*mAR.m[2][2] + extents.z*mAR.m[2][0] + mBB_6; if(GREATER(t, t2)) return FALSE; // L = A1 x B2 + t = Ty*mRBoxToModel.m[0][0] - Tx*mRBoxToModel.m[0][1]; t2 = extents.x*mAR.m[0][1] + extents.y*mAR.m[0][0] + mBB_7; if(GREATER(t, t2)) return FALSE; // L = A2 x B0 + t = Ty*mRBoxToModel.m[1][0] - Tx*mRBoxToModel.m[1][1]; t2 = extents.x*mAR.m[1][1] + extents.y*mAR.m[1][0] + mBB_8; if(GREATER(t, t2)) return FALSE; // L = A2 x B1 + t = Ty*mRBoxToModel.m[2][0] - Tx*mRBoxToModel.m[2][1]; t2 = extents.x*mAR.m[2][1] + extents.y*mAR.m[2][0] + mBB_9; if(GREATER(t, t2)) return FALSE; // L = A2 x B2 + } + return TRUE; +} + +//! A special version for 2 axis-aligned boxes +inline_ BOOL AABBCollider::AABBAABBOverlap(const Point& extents, const Point& center) +{ + // Stats + mNbVolumeBVTests++; + + float tx = mBox.mCenter.x - center.x; float ex = extents.x + mBox.mExtents.x; if(GREATER(tx, ex)) return FALSE; + float ty = mBox.mCenter.y - center.y; float ey = extents.y + mBox.mExtents.y; if(GREATER(ty, ey)) return FALSE; + float tz = mBox.mCenter.z - center.z; float ez = extents.z + mBox.mExtents.z; if(GREATER(tz, ez)) return FALSE; + + return TRUE; +} diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_BoxPruning.cpp b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_BoxPruning.cpp new file mode 100644 index 00000000..7d4f50dd --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_BoxPruning.cpp @@ -0,0 +1,376 @@ +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code for box pruning. + * \file IceBoxPruning.cpp + * \author Pierre Terdiman + * \date January, 29, 2000 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/* +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + You could use a complex sweep-and-prune as implemented in I-Collide. + You could use a complex hashing scheme as implemented in V-Clip or recently in ODE it seems. + You could use a "Recursive Dimensional Clustering" algorithm as implemented in GPG2. + + Or you could use this. + Faster ? I don't know. Probably not. It would be a shame. But who knows ? + Easier ? Definitely. Enjoy the sheer simplicity. +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +*/ + + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Precompiled Header +#include "Stdafx.h" + +using namespace Opcode; + + inline_ void FindRunningIndex(udword& index, float* array, udword* sorted, int last, float max) + { + int First=index; + while(First<=last) + { + index = (First+last)>>1; + + if(max>array[sorted[index]]) First = index+1; + else last = index-1; + } + } +// ### could be log(n) ! +// and maybe use cmp integers + +// InsertionSort has better coherence, RadixSort is better for one-shot queries. +#define PRUNING_SORTER RadixSort +//#define PRUNING_SORTER InsertionSort + +// Static for coherence +static PRUNING_SORTER* gCompletePruningSorter = null; +static PRUNING_SORTER* gBipartitePruningSorter0 = null; +static PRUNING_SORTER* gBipartitePruningSorter1 = null; +inline_ PRUNING_SORTER* GetCompletePruningSorter() +{ + if(!gCompletePruningSorter) gCompletePruningSorter = ICE_NEW(PRUNING_SORTER); + return gCompletePruningSorter; +} +inline_ PRUNING_SORTER* GetBipartitePruningSorter0() +{ + if(!gBipartitePruningSorter0) gBipartitePruningSorter0 = ICE_NEW(PRUNING_SORTER); + return gBipartitePruningSorter0; +} +inline_ PRUNING_SORTER* GetBipartitePruningSorter1() +{ + if(!gBipartitePruningSorter1) gBipartitePruningSorter1 = ICE_NEW(PRUNING_SORTER); + return gBipartitePruningSorter1; +} +void ReleasePruningSorters() +{ + DELETESINGLE(gBipartitePruningSorter1); + DELETESINGLE(gBipartitePruningSorter0); + DELETESINGLE(gCompletePruningSorter); +} + + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Bipartite box pruning. Returns a list of overlapping pairs of boxes, each box of the pair belongs to a different set. + * \param nb0 [in] number of boxes in the first set + * \param array0 [in] array of boxes for the first set + * \param nb1 [in] number of boxes in the second set + * \param array1 [in] array of boxes for the second set + * \param pairs [out] array of overlapping pairs + * \param axes [in] projection order (0,2,1 is often best) + * \return true if success. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool Opcode::BipartiteBoxPruning(udword nb0, const AABB** array0, udword nb1, const AABB** array1, Pairs& pairs, const Axes& axes) +{ + // Checkings + if(!nb0 || !array0 || !nb1 || !array1) return false; + + // Catch axes + udword Axis0 = axes.mAxis0; + udword Axis1 = axes.mAxis1; + udword Axis2 = axes.mAxis2; + + // Allocate some temporary data + float* MinPosList0 = new float[nb0]; + float* MinPosList1 = new float[nb1]; + + // 1) Build main lists using the primary axis + for(udword i=0;iGetMin(Axis0); + for(udword i=0;iGetMin(Axis0); + + // 2) Sort the lists + PRUNING_SORTER* RS0 = GetBipartitePruningSorter0(); + PRUNING_SORTER* RS1 = GetBipartitePruningSorter1(); + const udword* Sorted0 = RS0->Sort(MinPosList0, nb0).GetRanks(); + const udword* Sorted1 = RS1->Sort(MinPosList1, nb1).GetRanks(); + + // 3) Prune the lists + udword Index0, Index1; + + const udword* const LastSorted0 = &Sorted0[nb0]; + const udword* const LastSorted1 = &Sorted1[nb1]; + const udword* RunningAddress0 = Sorted0; + const udword* RunningAddress1 = Sorted1; + + while(RunningAddress1GetMax(Axis0)) + { + if(array0[Index0]->Intersect(*array1[Index1], Axis1)) + { + if(array0[Index0]->Intersect(*array1[Index1], Axis2)) + { + pairs.AddPair(Index0, Index1); + } + } + } + } + + //// + + while(RunningAddress0GetMax(Axis0)) + { + if(array0[Index1]->Intersect(*array1[Index0], Axis1)) + { + if(array0[Index1]->Intersect(*array1[Index0], Axis2)) + { + pairs.AddPair(Index1, Index0); + } + } + + } + } + + DELETEARRAY(MinPosList1); + DELETEARRAY(MinPosList0); + + return true; +} + +#define ORIGINAL_VERSION +//#define JOAKIM + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Complete box pruning. Returns a list of overlapping pairs of boxes, each box of the pair belongs to the same set. + * \param nb [in] number of boxes + * \param array [in] array of boxes + * \param pairs [out] array of overlapping pairs + * \param axes [in] projection order (0,2,1 is often best) + * \return true if success. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool Opcode::CompleteBoxPruning(udword nb, const AABB** array, Pairs& pairs, const Axes& axes) +{ + // Checkings + if(!nb || !array) return false; + + // Catch axes + udword Axis0 = axes.mAxis0; + udword Axis1 = axes.mAxis1; + udword Axis2 = axes.mAxis2; + +#ifdef ORIGINAL_VERSION + // Allocate some temporary data +// float* PosList = new float[nb]; + float* PosList = new float[nb+1]; + + // 1) Build main list using the primary axis + for(udword i=0;iGetMin(Axis0); +PosList[nb++] = MAX_FLOAT; + + // 2) Sort the list + PRUNING_SORTER* RS = GetCompletePruningSorter(); + const udword* Sorted = RS->Sort(PosList, nb).GetRanks(); + + // 3) Prune the list + const udword* const LastSorted = &Sorted[nb]; + const udword* RunningAddress = Sorted; + udword Index0, Index1; + while(RunningAddressGetMax(Axis0)) + while(PosList[Index1 = *RunningAddress2++]<=array[Index0]->GetMax(Axis0)) + { +// if(Index0!=Index1) +// { + if(array[Index0]->Intersect(*array[Index1], Axis1)) + { + if(array[Index0]->Intersect(*array[Index1], Axis2)) + { + pairs.AddPair(Index0, Index1); + } + } +// } + } + } + } + + DELETEARRAY(PosList); +#endif + +#ifdef JOAKIM + // Allocate some temporary data +// float* PosList = new float[nb]; + float* MinList = new float[nb+1]; + + // 1) Build main list using the primary axis + for(udword i=0;iGetMin(Axis0); + MinList[nb] = MAX_FLOAT; + + // 2) Sort the list + PRUNING_SORTER* RS = GetCompletePruningSorter(); + udword* Sorted = RS->Sort(MinList, nb+1).GetRanks(); + + // 3) Prune the list +// const udword* const LastSorted = &Sorted[nb]; +// const udword* const LastSorted = &Sorted[nb-1]; + const udword* RunningAddress = Sorted; + udword Index0, Index1; + +// while(RunningAddressGetMax(Axis0)) + +// float CurrentMin = array[Index0]->GetMin(Axis0); + float CurrentMax = array[Index0]->GetMax(Axis0); + + while(MinList[Index1 = *RunningAddress2] <= CurrentMax) +// while(PosList[Index1 = *RunningAddress] <= CurrentMax) + { +// if(Index0!=Index1) +// { + if(array[Index0]->Intersect(*array[Index1], Axis1)) + { + if(array[Index0]->Intersect(*array[Index1], Axis2)) + { + pairs.AddPair(Index0, Index1); + } + } +// } + + RunningAddress2++; +// RunningAddress++; + } + } + } + + DELETEARRAY(MinList); +#endif + + return true; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Brute-force versions are kept: +// - to check the optimized versions return the correct list of intersections +// - to check the speed of the optimized code against the brute-force one +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Brute-force bipartite box pruning. Returns a list of overlapping pairs of boxes, each box of the pair belongs to a different set. + * \param nb0 [in] number of boxes in the first set + * \param array0 [in] array of boxes for the first set + * \param nb1 [in] number of boxes in the second set + * \param array1 [in] array of boxes for the second set + * \param pairs [out] array of overlapping pairs + * \return true if success. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool Opcode::BruteForceBipartiteBoxTest(udword nb0, const AABB** array0, udword nb1, const AABB** array1, Pairs& pairs) +{ + // Checkings + if(!nb0 || !array0 || !nb1 || !array1) return false; + + // Brute-force nb0*nb1 overlap tests + for(udword i=0;iIntersect(*array1[j])) pairs.AddPair(i, j); + } + } + return true; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Complete box pruning. Returns a list of overlapping pairs of boxes, each box of the pair belongs to the same set. + * \param nb [in] number of boxes + * \param array [in] array of boxes + * \param pairs [out] array of overlapping pairs + * \return true if success. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool Opcode::BruteForceCompleteBoxTest(udword nb, const AABB** array, Pairs& pairs) +{ + // Checkings + if(!nb || !array) return false; + + // Brute-force n(n-1)/2 overlap tests + for(udword i=0;iIntersect(*array[j])) pairs.AddPair(i, j); + } + } + return true; +} diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_BoxPruning.h b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_BoxPruning.h new file mode 100644 index 00000000..163fe4e1 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_BoxPruning.h @@ -0,0 +1,40 @@ +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code for box pruning. + * \file IceBoxPruning.h + * \author Pierre Terdiman + * \date January, 29, 2000 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef __OPC_BOXPRUNING_H__ +#define __OPC_BOXPRUNING_H__ + + // Optimized versions + FUNCTION OPCODE_API bool CompleteBoxPruning(udword nb, const AABB** array, Pairs& pairs, const Axes& axes); + FUNCTION OPCODE_API bool BipartiteBoxPruning(udword nb0, const AABB** array0, udword nb1, const AABB** array1, Pairs& pairs, const Axes& axes); + + // Brute-force versions + FUNCTION OPCODE_API bool BruteForceCompleteBoxTest(udword nb, const AABB** array, Pairs& pairs); + FUNCTION OPCODE_API bool BruteForceBipartiteBoxTest(udword nb0, const AABB** array0, udword nb1, const AABB** array1, Pairs& pairs); + +#endif //__OPC_BOXPRUNING_H__ \ No newline at end of file diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_Collider.cpp b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_Collider.cpp new file mode 100644 index 00000000..bd62aec9 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_Collider.cpp @@ -0,0 +1,63 @@ +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains base collider class. + * \file OPC_Collider.cpp + * \author Pierre Terdiman + * \date June, 2, 2001 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains the abstract class for colliders. + * + * \class Collider + * \author Pierre Terdiman + * \version 1.3 + * \date June, 2, 2001 +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Precompiled Header +#include "Stdafx.h" + +using namespace Opcode; + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Constructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +Collider::Collider() : + mFlags (0), + mCurrentModel (null), + mIMesh (null) +{ +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Destructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +Collider::~Collider() +{ +} diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_Collider.h b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_Collider.h new file mode 100644 index 00000000..594109b3 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_Collider.h @@ -0,0 +1,185 @@ +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains base collider class. + * \file OPC_Collider.h + * \author Pierre Terdiman + * \date June, 2, 2001 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef __OPC_COLLIDER_H__ +#define __OPC_COLLIDER_H__ + + enum CollisionFlag + { + OPC_FIRST_CONTACT = (1<<0), //!< Report all contacts (false) or only first one (true) + OPC_TEMPORAL_COHERENCE = (1<<1), //!< Use temporal coherence or not + OPC_CONTACT = (1<<2), //!< Final contact status after a collision query + OPC_TEMPORAL_HIT = (1<<3), //!< There has been an early exit due to temporal coherence + OPC_NO_PRIMITIVE_TESTS = (1<<4), //!< Keep or discard primitive-bv tests in leaf nodes (volume-mesh queries) + + OPC_CONTACT_FOUND = OPC_FIRST_CONTACT | OPC_CONTACT, + OPC_TEMPORAL_CONTACT = OPC_TEMPORAL_HIT | OPC_CONTACT, + + OPC_FORCE_DWORD = 0x7fffffff + }; + + class OPCODE_API Collider + { + public: + // Constructor / Destructor + Collider(); + virtual ~Collider(); + + // Collision report + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Gets the last collision status after a collision query. + * \return true if a collision occured + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ BOOL GetContactStatus() const { return mFlags & OPC_CONTACT; } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Gets the "first contact" mode. + * \return true if "first contact" mode is on + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ BOOL FirstContactEnabled() const { return mFlags & OPC_FIRST_CONTACT; } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Gets the temporal coherence mode. + * \return true if temporal coherence is on + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ BOOL TemporalCoherenceEnabled() const { return mFlags & OPC_TEMPORAL_COHERENCE; } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Checks a first contact has already been found. + * \return true if a first contact has been found and we can stop a query + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ BOOL ContactFound() const { return (mFlags&OPC_CONTACT_FOUND)==OPC_CONTACT_FOUND; } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Checks there's been an early exit due to temporal coherence; + * \return true if a temporal hit has occured + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ BOOL TemporalHit() const { return mFlags & OPC_TEMPORAL_HIT; } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Checks primitive tests are enabled; + * \return true if primitive tests must be skipped + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ BOOL SkipPrimitiveTests() const { return mFlags & OPC_NO_PRIMITIVE_TESTS; } + + // Settings + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Reports all contacts (false) or first contact only (true) + * \param flag [in] true for first contact, false for all contacts + * \see SetTemporalCoherence(bool flag) + * \see ValidateSettings() + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ void SetFirstContact(bool flag) + { + if(flag) mFlags |= OPC_FIRST_CONTACT; + else mFlags &= ~OPC_FIRST_CONTACT; + } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Enable/disable temporal coherence. + * \param flag [in] true to enable temporal coherence, false to discard it + * \see SetFirstContact(bool flag) + * \see ValidateSettings() + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ void SetTemporalCoherence(bool flag) + { + if(flag) mFlags |= OPC_TEMPORAL_COHERENCE; + else mFlags &= ~OPC_TEMPORAL_COHERENCE; + } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Enable/disable primitive tests. + * \param flag [in] true to enable primitive tests, false to discard them + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ void SetPrimitiveTests(bool flag) + { + if(!flag) mFlags |= OPC_NO_PRIMITIVE_TESTS; + else mFlags &= ~OPC_NO_PRIMITIVE_TESTS; + } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Validates current settings. You should call this method after all the settings / callbacks have been defined for a collider. + * \return null if everything is ok, else a string describing the problem + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + virtual const char* ValidateSettings() = 0; + + protected: + udword mFlags; //!< Bit flags + const BaseModel* mCurrentModel; //!< Current model for collision query (owner of touched faces) + // User mesh interface + const MeshInterface* mIMesh; //!< User-defined mesh interface + + // Internal methods + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Setups current collision model + * \param model [in] current collision model + * \return TRUE if success + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ BOOL Setup(const BaseModel* model) + { + // Keep track of current model + mCurrentModel = model; + if(!mCurrentModel) return FALSE; + + mIMesh = model->GetMeshInterface(); + return mIMesh!=null; + } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Initializes a query + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + virtual inline_ void InitQuery() { mFlags &= ~OPC_TEMPORAL_CONTACT; } + }; + +#endif // __OPC_COLLIDER_H__ diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_Common.cpp b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_Common.cpp new file mode 100644 index 00000000..4f1a2503 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_Common.cpp @@ -0,0 +1,57 @@ +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains common classes & defs used in OPCODE. + * \file OPC_Common.cpp + * \author Pierre Terdiman + * \date March, 20, 2001 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * An AABB dedicated to collision detection. + * We don't use the generic AABB class included in ICE, since it can be a Min/Max or a Center/Extents one (depends + * on compilation flags). Since the Center/Extents model is more efficient in collision detection, it was worth + * using an extra special class. + * + * \class CollisionAABB + * \author Pierre Terdiman + * \version 1.3 + * \date March, 20, 2001 +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * A quantized AABB. + * Center/Extent model, using 16-bits integers. + * + * \class QuantizedAABB + * \author Pierre Terdiman + * \version 1.3 + * \date March, 20, 2001 +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Precompiled Header +#include "Stdafx.h" + +using namespace Opcode; diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_Common.h b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_Common.h new file mode 100644 index 00000000..9510668c --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_Common.h @@ -0,0 +1,110 @@ +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains common classes & defs used in OPCODE. + * \file OPC_Common.h + * \author Pierre Terdiman + * \date March, 20, 2001 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef __OPC_COMMON_H__ +#define __OPC_COMMON_H__ + +// [GOTTFRIED]: Just a small change for readability. +#ifdef OPC_CPU_COMPARE + #define GREATER(x, y) AIR(x) > IR(y) +#else + #define GREATER(x, y) fabsf(x) > (y) +#endif + + class OPCODE_API CollisionAABB + { + public: + //! Constructor + inline_ CollisionAABB() {} + //! Constructor + inline_ CollisionAABB(const AABB& b) { b.GetCenter(mCenter); b.GetExtents(mExtents); } + //! Destructor + inline_ ~CollisionAABB() {} + + //! Get min point of the box + inline_ void GetMin(Point& min) const { min = mCenter - mExtents; } + //! Get max point of the box + inline_ void GetMax(Point& max) const { max = mCenter + mExtents; } + + //! Get component of the box's min point along a given axis + inline_ float GetMin(udword axis) const { return mCenter[axis] - mExtents[axis]; } + //! Get component of the box's max point along a given axis + inline_ float GetMax(udword axis) const { return mCenter[axis] + mExtents[axis]; } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Setups an AABB from min & max vectors. + * \param min [in] the min point + * \param max [in] the max point + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ void SetMinMax(const Point& min, const Point& max) { mCenter = (max + min)*0.5f; mExtents = (max - min)*0.5f; } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Checks a box is inside another box. + * \param box [in] the other box + * \return true if current box is inside input box + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ BOOL IsInside(const CollisionAABB& box) const + { + if(box.GetMin(0)>GetMin(0)) return FALSE; + if(box.GetMin(1)>GetMin(1)) return FALSE; + if(box.GetMin(2)>GetMin(2)) return FALSE; + if(box.GetMax(0)IsValid()) return false; + + // Look for degenerate faces. + udword NbDegenerate = create.mIMesh->CheckTopology(); + if(NbDegenerate) Log("OPCODE WARNING: found %d degenerate faces in model! Collision might report wrong results!\n", NbDegenerate); + // We continue nonetheless.... + + Release(); // Make sure previous tree has been discarded + + // 1-1) Setup mesh interface automatically + SetMeshInterface(create.mIMesh); + + bool Status = false; + AABBTree* LeafTree = null; + Internal Data; + + // 2) Build a generic AABB Tree. + mSource = new AABBTree; + CHECKALLOC(mSource); + + // 2-1) Setup a builder. Our primitives here are triangles from input mesh, + // so we use an AABBTreeOfTrianglesBuilder..... + { + AABBTreeOfTrianglesBuilder TB; + TB.mIMesh = create.mIMesh; + TB.mNbPrimitives = create.mIMesh->GetNbTriangles(); + TB.mSettings = create.mSettings; + TB.mSettings.mLimit = 16; // ### Hardcoded, but maybe we could let the user choose 8 / 16 / 32 ... + if(!mSource->Build(&TB)) goto FreeAndExit; + } + + // 2-2) Here's the trick : create *another* AABB tree using the leaves of the first one (which are boxes, this time) + struct Local + { + // A callback to count leaf nodes + static bool CountLeaves(const AABBTreeNode* current, udword depth, void* user_data) + { + if(current->IsLeaf()) + { + Internal* Data = (Internal*)user_data; + Data->mNbLeaves++; + } + return true; + } + + // A callback to setup leaf nodes in our internal structures + static bool SetupLeafData(const AABBTreeNode* current, udword depth, void* user_data) + { + if(current->IsLeaf()) + { + Internal* Data = (Internal*)user_data; + + // Get current leaf's box + Data->mLeaves[Data->mNbLeaves] = *current->GetAABB(); + + // Setup leaf data + udword Index = (udword(current->GetPrimitives()) - udword(Data->mBase))/sizeof(udword); + Data->mTriangles[Data->mNbLeaves].SetData(current->GetNbPrimitives(), Index); + + Data->mNbLeaves++; + } + return true; + } + }; + + // Walk the tree & count number of leaves + Data.mNbLeaves = 0; + mSource->Walk(Local::CountLeaves, &Data); + mNbLeaves = Data.mNbLeaves; // Keep track of it + + // Special case for 1-leaf meshes + if(mNbLeaves==1) + { + mModelCode |= OPC_SINGLE_NODE; + Status = true; + goto FreeAndExit; + } + + // Allocate our structures + Data.mLeaves = new AABB[Data.mNbLeaves]; CHECKALLOC(Data.mLeaves); + mTriangles = new LeafTriangles[Data.mNbLeaves]; CHECKALLOC(mTriangles); + + // Walk the tree again & setup leaf data + Data.mTriangles = mTriangles; + Data.mBase = mSource->GetIndices(); + Data.mNbLeaves = 0; // Reset for incoming walk + mSource->Walk(Local::SetupLeafData, &Data); + + // Handle source indices + { + bool MustKeepIndices = true; + if(create.mCanRemap) + { + // We try to get rid of source indices (saving more ram!) by reorganizing triangle arrays... + // Remap can fail when we use callbacks => keep track of indices in that case (it still + // works, only using more memory) + if(create.mIMesh->RemapClient(mSource->GetNbPrimitives(), mSource->GetIndices())) + { + MustKeepIndices = false; + } + } + + if(MustKeepIndices) + { + // Keep track of source indices (from vanilla tree) + mNbPrimitives = mSource->GetNbPrimitives(); + mIndices = new udword[mNbPrimitives]; + CopyMemory(mIndices, mSource->GetIndices(), mNbPrimitives*sizeof(udword)); + } + } + + // Now, create our optimized tree using previous leaf nodes + LeafTree = new AABBTree; + CHECKALLOC(LeafTree); + { + AABBTreeOfAABBsBuilder TB; // Now using boxes ! + TB.mSettings = create.mSettings; + TB.mSettings.mLimit = 1; // We now want a complete tree so that we can "optimize" it + TB.mNbPrimitives = Data.mNbLeaves; + TB.mAABBArray = Data.mLeaves; + if(!LeafTree->Build(&TB)) goto FreeAndExit; + } + + // 3) Create an optimized tree according to user-settings + if(!CreateTree(create.mNoLeaf, create.mQuantized)) goto FreeAndExit; + + // 3-2) Create optimized tree + if(!mTree->Build(LeafTree)) goto FreeAndExit; + + // Finally ok... + Status = true; + +FreeAndExit: // Allow me this one... + DELETESINGLE(LeafTree); + + // 3-3) Delete generic tree if needed + if(!create.mKeepOriginal) DELETESINGLE(mSource); + + return Status; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Gets the number of bytes used by the tree. + * \return amount of bytes used + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +udword HybridModel::GetUsedBytes() const +{ + udword UsedBytes = 0; + if(mTree) UsedBytes += mTree->GetUsedBytes(); + if(mIndices) UsedBytes += mNbPrimitives * sizeof(udword); // mIndices + if(mTriangles) UsedBytes += mNbLeaves * sizeof(LeafTriangles); // mTriangles + return UsedBytes; +} + +inline_ void ComputeMinMax_HM(Point& min, Point& max, const VertexPointers& vp) +{ + // Compute triangle's AABB = a leaf box +#ifdef OPC_USE_FCOMI // a 15% speedup on my machine, not much + min.x = FCMin3(vp.Vertex[0]->x, vp.Vertex[1]->x, vp.Vertex[2]->x); + max.x = FCMax3(vp.Vertex[0]->x, vp.Vertex[1]->x, vp.Vertex[2]->x); + + min.y = FCMin3(vp.Vertex[0]->y, vp.Vertex[1]->y, vp.Vertex[2]->y); + max.y = FCMax3(vp.Vertex[0]->y, vp.Vertex[1]->y, vp.Vertex[2]->y); + + min.z = FCMin3(vp.Vertex[0]->z, vp.Vertex[1]->z, vp.Vertex[2]->z); + max.z = FCMax3(vp.Vertex[0]->z, vp.Vertex[1]->z, vp.Vertex[2]->z); +#else + min = *vp.Vertex[0]; + max = *vp.Vertex[0]; + min.Min(*vp.Vertex[1]); + max.Max(*vp.Vertex[1]); + min.Min(*vp.Vertex[2]); + max.Max(*vp.Vertex[2]); +#endif +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Refits the collision model. This can be used to handle dynamic meshes. Usage is: + * 1. modify your mesh vertices (keep the topology constant!) + * 2. refit the tree (call this method) + * \return true if success + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool HybridModel::Refit() +{ + if(!mIMesh) return false; + if(!mTree) return false; + + if(IsQuantized()) return false; + if(HasLeafNodes()) return false; + + const LeafTriangles* LT = GetLeafTriangles(); + const udword* Indices = GetIndices(); + + // Bottom-up update + VertexPointers VP; + Point Min,Max; + Point Min_,Max_; + udword Index = mTree->GetNbNodes(); + AABBNoLeafNode* Nodes = (AABBNoLeafNode*)((AABBNoLeafTree*)mTree)->GetNodes(); + while(Index--) + { + AABBNoLeafNode& Current = Nodes[Index]; + + if(Current.HasPosLeaf()) + { + const LeafTriangles& CurrentLeaf = LT[Current.GetPosPrimitive()]; + + Min.SetPlusInfinity(); + Max.SetMinusInfinity(); + + Point TmpMin, TmpMax; + + // Each leaf box has a set of triangles + udword NbTris = CurrentLeaf.GetNbTriangles(); + if(Indices) + { + const udword* T = &Indices[CurrentLeaf.GetTriangleIndex()]; + + // Loop through triangles and test each of them + while(NbTris--) + { + mIMesh->GetTriangle(VP, *T++); + ComputeMinMax_HM(TmpMin, TmpMax, VP); + Min.Min(TmpMin); + Max.Max(TmpMax); + } + } + else + { + udword BaseIndex = CurrentLeaf.GetTriangleIndex(); + + // Loop through triangles and test each of them + while(NbTris--) + { + mIMesh->GetTriangle(VP, BaseIndex++); + ComputeMinMax_HM(TmpMin, TmpMax, VP); + Min.Min(TmpMin); + Max.Max(TmpMax); + } + } + } + else + { + const CollisionAABB& CurrentBox = Current.GetPos()->mAABB; + CurrentBox.GetMin(Min); + CurrentBox.GetMax(Max); + } + + if(Current.HasNegLeaf()) + { + const LeafTriangles& CurrentLeaf = LT[Current.GetNegPrimitive()]; + + Min_.SetPlusInfinity(); + Max_.SetMinusInfinity(); + + Point TmpMin, TmpMax; + + // Each leaf box has a set of triangles + udword NbTris = CurrentLeaf.GetNbTriangles(); + if(Indices) + { + const udword* T = &Indices[CurrentLeaf.GetTriangleIndex()]; + + // Loop through triangles and test each of them + while(NbTris--) + { + mIMesh->GetTriangle(VP, *T++); + ComputeMinMax_HM(TmpMin, TmpMax, VP); + Min_.Min(TmpMin); + Max_.Max(TmpMax); + } + } + else + { + udword BaseIndex = CurrentLeaf.GetTriangleIndex(); + + // Loop through triangles and test each of them + while(NbTris--) + { + mIMesh->GetTriangle(VP, BaseIndex++); + ComputeMinMax_HM(TmpMin, TmpMax, VP); + Min_.Min(TmpMin); + Max_.Max(TmpMax); + } + } + } + else + { + const CollisionAABB& CurrentBox = Current.GetNeg()->mAABB; + CurrentBox.GetMin(Min_); + CurrentBox.GetMax(Max_); + } +#ifdef OPC_USE_FCOMI + Min.x = FCMin2(Min.x, Min_.x); + Max.x = FCMax2(Max.x, Max_.x); + Min.y = FCMin2(Min.y, Min_.y); + Max.y = FCMax2(Max.y, Max_.y); + Min.z = FCMin2(Min.z, Min_.z); + Max.z = FCMax2(Max.z, Max_.z); +#else + Min.Min(Min_); + Max.Max(Max_); +#endif + Current.mAABB.SetMinMax(Min, Max); + } + return true; +} diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_HybridModel.h b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_HybridModel.h new file mode 100644 index 00000000..117b9c39 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_HybridModel.h @@ -0,0 +1,115 @@ +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code for hybrid models. + * \file OPC_HybridModel.h + * \author Pierre Terdiman + * \date May, 18, 2003 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef __OPC_HYBRIDMODEL_H__ +#define __OPC_HYBRIDMODEL_H__ + + //! Leaf descriptor + struct LeafTriangles + { + udword Data; //!< Packed data + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Gets number of triangles in the leaf. + * \return number of triangles N, with 0 < N <= 16 + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ udword GetNbTriangles() const { return (Data & 15)+1; } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Gets triangle index for this leaf. Indexed model's array of indices retrieved with HybridModel::GetIndices() + * \return triangle index + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ udword GetTriangleIndex() const { return Data>>4; } + inline_ void SetData(udword nb, udword index) { ASSERT(nb>0 && nb<=16); nb--; Data = (index<<4)|(nb&15); } + }; + + class OPCODE_API HybridModel : public BaseModel + { + public: + // Constructor/Destructor + HybridModel(); + virtual ~HybridModel(); + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Builds a collision model. + * \param create [in] model creation structure + * \return true if success + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + override(BaseModel) bool Build(const OPCODECREATE& create); + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Gets the number of bytes used by the tree. + * \return amount of bytes used + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + override(BaseModel) udword GetUsedBytes() const; + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Refits the collision model. This can be used to handle dynamic meshes. Usage is: + * 1. modify your mesh vertices (keep the topology constant!) + * 2. refit the tree (call this method) + * \return true if success + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + override(BaseModel) bool Refit(); + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Gets array of triangles. + * \return array of triangles + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ const LeafTriangles* GetLeafTriangles() const { return mTriangles; } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Gets array of indices. + * \return array of indices + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ const udword* GetIndices() const { return mIndices; } + + private: + udword mNbLeaves; //!< Number of leaf nodes in the model + LeafTriangles* mTriangles; //!< Array of mNbLeaves leaf descriptors + udword mNbPrimitives; //!< Number of primitives in the model + udword* mIndices; //!< Array of primitive indices + + // Internal methods + void Release(); + }; + +#endif // __OPC_HYBRIDMODEL_H__ diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_IceHook.h b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_IceHook.h new file mode 100644 index 00000000..4666d44e --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_IceHook.h @@ -0,0 +1,92 @@ +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +// Should be included by Opcode.h if needed + + #define ICE_DONT_CHECK_COMPILER_OPTIONS + + // From Windows... + typedef int BOOL; + #ifndef FALSE + #define FALSE 0 + #endif + + #ifndef TRUE + #define TRUE 1 + #endif + + #include + #include + #include + #include + #include + #include + + #ifndef ASSERT + #define ASSERT(exp) {} + #endif + #define ICE_COMPILE_TIME_ASSERT(exp) extern char ICE_Dummy[ (exp) ? 1 : -1 ] + + #define Log {} + #define SetIceError false + #define EC_OUTOFMEMORY "Out of memory" + + #include ".\Ice\IcePreprocessor.h" + + #undef ICECORE_API + #define ICECORE_API OPCODE_API + + #include ".\Ice\IceTypes.h" + #include ".\Ice\IceFPU.h" + #include ".\Ice\IceMemoryMacros.h" + + namespace Opcode + { + namespace IceCore + { + #include ".\Ice\IceAllocator.h" + #include ".\Ice\IceUtils.h" + #include ".\Ice\IceBitArray.h" + #include ".\Ice\IceContainer.h" + #include ".\Ice\IcePairs.h" + #include ".\Ice\IceRevisitedRadix.h" + #include ".\Ice\IceRandom.h" + #include ".\Ice\IceHashing.h" + } + using namespace IceCore; + + #define ICEMATHS_API OPCODE_API + namespace IceMaths + { + #include ".\Ice\IceAxes.h" + #include ".\Ice\IcePoint.h" + #include ".\Ice\IceHPoint.h" + #include ".\Ice\IceMatrix3x3.h" + #include ".\Ice\IceMatrix4x4.h" + #include ".\Ice\IcePlane.h" + #include ".\Ice\IceRay.h" + #include ".\Ice\IceIndexedTriangle.h" + #include ".\Ice\IceTriangle.h" + #include ".\Ice\IceTriList.h" + #include ".\Ice\IceAABB.h" + #include ".\Ice\IceOBB.h" + #include ".\Ice\IceBoundingSphere.h" + #include ".\Ice\IceSegment.h" + #include ".\Ice\IceLSS.h" + } + using namespace IceMaths; +} diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_LSSAABBOverlap.h b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_LSSAABBOverlap.h new file mode 100644 index 00000000..6e8e4777 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_LSSAABBOverlap.h @@ -0,0 +1,539 @@ +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +// Following code from Magic-Software (http://www.magic-software.com/) +// A bit modified for Opcode + +inline_ float OPC_PointAABBSqrDist(const Point& point, const Point& center, const Point& extents) +{ + // Compute coordinates of point in box coordinate system + Point Closest = point - center; + + float SqrDistance = 0.0f; + + if(Closest.x < -extents.x) + { + float Delta = Closest.x + extents.x; + SqrDistance += Delta*Delta; + } + else if(Closest.x > extents.x) + { + float Delta = Closest.x - extents.x; + SqrDistance += Delta*Delta; + } + + if(Closest.y < -extents.y) + { + float Delta = Closest.y + extents.y; + SqrDistance += Delta*Delta; + } + else if(Closest.y > extents.y) + { + float Delta = Closest.y - extents.y; + SqrDistance += Delta*Delta; + } + + if(Closest.z < -extents.z) + { + float Delta = Closest.z + extents.z; + SqrDistance += Delta*Delta; + } + else if(Closest.z > extents.z) + { + float Delta = Closest.z - extents.z; + SqrDistance += Delta*Delta; + } + return SqrDistance; +} + +static void Face(int i0, int i1, int i2, Point& rkPnt, const Point& rkDir, const Point& extents, const Point& rkPmE, float* pfLParam, float& rfSqrDistance) +{ + Point kPpE; + float fLSqr, fInv, fTmp, fParam, fT, fDelta; + + kPpE[i1] = rkPnt[i1] + extents[i1]; + kPpE[i2] = rkPnt[i2] + extents[i2]; + if(rkDir[i0]*kPpE[i1] >= rkDir[i1]*rkPmE[i0]) + { + if(rkDir[i0]*kPpE[i2] >= rkDir[i2]*rkPmE[i0]) + { + // v[i1] >= -e[i1], v[i2] >= -e[i2] (distance = 0) + if(pfLParam) + { + rkPnt[i0] = extents[i0]; + fInv = 1.0f/rkDir[i0]; + rkPnt[i1] -= rkDir[i1]*rkPmE[i0]*fInv; + rkPnt[i2] -= rkDir[i2]*rkPmE[i0]*fInv; + *pfLParam = -rkPmE[i0]*fInv; + } + } + else + { + // v[i1] >= -e[i1], v[i2] < -e[i2] + fLSqr = rkDir[i0]*rkDir[i0] + rkDir[i2]*rkDir[i2]; + fTmp = fLSqr*kPpE[i1] - rkDir[i1]*(rkDir[i0]*rkPmE[i0] + rkDir[i2]*kPpE[i2]); + if(fTmp <= 2.0f*fLSqr*extents[i1]) + { + fT = fTmp/fLSqr; + fLSqr += rkDir[i1]*rkDir[i1]; + fTmp = kPpE[i1] - fT; + fDelta = rkDir[i0]*rkPmE[i0] + rkDir[i1]*fTmp + rkDir[i2]*kPpE[i2]; + fParam = -fDelta/fLSqr; + rfSqrDistance += rkPmE[i0]*rkPmE[i0] + fTmp*fTmp + kPpE[i2]*kPpE[i2] + fDelta*fParam; + + if(pfLParam) + { + *pfLParam = fParam; + rkPnt[i0] = extents[i0]; + rkPnt[i1] = fT - extents[i1]; + rkPnt[i2] = -extents[i2]; + } + } + else + { + fLSqr += rkDir[i1]*rkDir[i1]; + fDelta = rkDir[i0]*rkPmE[i0] + rkDir[i1]*rkPmE[i1] + rkDir[i2]*kPpE[i2]; + fParam = -fDelta/fLSqr; + rfSqrDistance += rkPmE[i0]*rkPmE[i0] + rkPmE[i1]*rkPmE[i1] + kPpE[i2]*kPpE[i2] + fDelta*fParam; + + if(pfLParam) + { + *pfLParam = fParam; + rkPnt[i0] = extents[i0]; + rkPnt[i1] = extents[i1]; + rkPnt[i2] = -extents[i2]; + } + } + } + } + else + { + if ( rkDir[i0]*kPpE[i2] >= rkDir[i2]*rkPmE[i0] ) + { + // v[i1] < -e[i1], v[i2] >= -e[i2] + fLSqr = rkDir[i0]*rkDir[i0] + rkDir[i1]*rkDir[i1]; + fTmp = fLSqr*kPpE[i2] - rkDir[i2]*(rkDir[i0]*rkPmE[i0] + rkDir[i1]*kPpE[i1]); + if(fTmp <= 2.0f*fLSqr*extents[i2]) + { + fT = fTmp/fLSqr; + fLSqr += rkDir[i2]*rkDir[i2]; + fTmp = kPpE[i2] - fT; + fDelta = rkDir[i0]*rkPmE[i0] + rkDir[i1]*kPpE[i1] + rkDir[i2]*fTmp; + fParam = -fDelta/fLSqr; + rfSqrDistance += rkPmE[i0]*rkPmE[i0] + kPpE[i1]*kPpE[i1] + fTmp*fTmp + fDelta*fParam; + + if(pfLParam) + { + *pfLParam = fParam; + rkPnt[i0] = extents[i0]; + rkPnt[i1] = -extents[i1]; + rkPnt[i2] = fT - extents[i2]; + } + } + else + { + fLSqr += rkDir[i2]*rkDir[i2]; + fDelta = rkDir[i0]*rkPmE[i0] + rkDir[i1]*kPpE[i1] + rkDir[i2]*rkPmE[i2]; + fParam = -fDelta/fLSqr; + rfSqrDistance += rkPmE[i0]*rkPmE[i0] + kPpE[i1]*kPpE[i1] + rkPmE[i2]*rkPmE[i2] + fDelta*fParam; + + if(pfLParam) + { + *pfLParam = fParam; + rkPnt[i0] = extents[i0]; + rkPnt[i1] = -extents[i1]; + rkPnt[i2] = extents[i2]; + } + } + } + else + { + // v[i1] < -e[i1], v[i2] < -e[i2] + fLSqr = rkDir[i0]*rkDir[i0]+rkDir[i2]*rkDir[i2]; + fTmp = fLSqr*kPpE[i1] - rkDir[i1]*(rkDir[i0]*rkPmE[i0] + rkDir[i2]*kPpE[i2]); + if(fTmp >= 0.0f) + { + // v[i1]-edge is closest + if ( fTmp <= 2.0f*fLSqr*extents[i1] ) + { + fT = fTmp/fLSqr; + fLSqr += rkDir[i1]*rkDir[i1]; + fTmp = kPpE[i1] - fT; + fDelta = rkDir[i0]*rkPmE[i0] + rkDir[i1]*fTmp + rkDir[i2]*kPpE[i2]; + fParam = -fDelta/fLSqr; + rfSqrDistance += rkPmE[i0]*rkPmE[i0] + fTmp*fTmp + kPpE[i2]*kPpE[i2] + fDelta*fParam; + + if(pfLParam) + { + *pfLParam = fParam; + rkPnt[i0] = extents[i0]; + rkPnt[i1] = fT - extents[i1]; + rkPnt[i2] = -extents[i2]; + } + } + else + { + fLSqr += rkDir[i1]*rkDir[i1]; + fDelta = rkDir[i0]*rkPmE[i0] + rkDir[i1]*rkPmE[i1] + rkDir[i2]*kPpE[i2]; + fParam = -fDelta/fLSqr; + rfSqrDistance += rkPmE[i0]*rkPmE[i0] + rkPmE[i1]*rkPmE[i1] + kPpE[i2]*kPpE[i2] + fDelta*fParam; + + if(pfLParam) + { + *pfLParam = fParam; + rkPnt[i0] = extents[i0]; + rkPnt[i1] = extents[i1]; + rkPnt[i2] = -extents[i2]; + } + } + return; + } + + fLSqr = rkDir[i0]*rkDir[i0] + rkDir[i1]*rkDir[i1]; + fTmp = fLSqr*kPpE[i2] - rkDir[i2]*(rkDir[i0]*rkPmE[i0] + rkDir[i1]*kPpE[i1]); + if(fTmp >= 0.0f) + { + // v[i2]-edge is closest + if(fTmp <= 2.0f*fLSqr*extents[i2]) + { + fT = fTmp/fLSqr; + fLSqr += rkDir[i2]*rkDir[i2]; + fTmp = kPpE[i2] - fT; + fDelta = rkDir[i0]*rkPmE[i0] + rkDir[i1]*kPpE[i1] + rkDir[i2]*fTmp; + fParam = -fDelta/fLSqr; + rfSqrDistance += rkPmE[i0]*rkPmE[i0] + kPpE[i1]*kPpE[i1] + fTmp*fTmp + fDelta*fParam; + + if(pfLParam) + { + *pfLParam = fParam; + rkPnt[i0] = extents[i0]; + rkPnt[i1] = -extents[i1]; + rkPnt[i2] = fT - extents[i2]; + } + } + else + { + fLSqr += rkDir[i2]*rkDir[i2]; + fDelta = rkDir[i0]*rkPmE[i0] + rkDir[i1]*kPpE[i1] + rkDir[i2]*rkPmE[i2]; + fParam = -fDelta/fLSqr; + rfSqrDistance += rkPmE[i0]*rkPmE[i0] + kPpE[i1]*kPpE[i1] + rkPmE[i2]*rkPmE[i2] + fDelta*fParam; + + if(pfLParam) + { + *pfLParam = fParam; + rkPnt[i0] = extents[i0]; + rkPnt[i1] = -extents[i1]; + rkPnt[i2] = extents[i2]; + } + } + return; + } + + // (v[i1],v[i2])-corner is closest + fLSqr += rkDir[i2]*rkDir[i2]; + fDelta = rkDir[i0]*rkPmE[i0] + rkDir[i1]*kPpE[i1] + rkDir[i2]*kPpE[i2]; + fParam = -fDelta/fLSqr; + rfSqrDistance += rkPmE[i0]*rkPmE[i0] + kPpE[i1]*kPpE[i1] + kPpE[i2]*kPpE[i2] + fDelta*fParam; + + if(pfLParam) + { + *pfLParam = fParam; + rkPnt[i0] = extents[i0]; + rkPnt[i1] = -extents[i1]; + rkPnt[i2] = -extents[i2]; + } + } + } +} + +static void CaseNoZeros(Point& rkPnt, const Point& rkDir, const Point& extents, float* pfLParam, float& rfSqrDistance) +{ + Point kPmE(rkPnt.x - extents.x, rkPnt.y - extents.y, rkPnt.z - extents.z); + + float fProdDxPy, fProdDyPx, fProdDzPx, fProdDxPz, fProdDzPy, fProdDyPz; + + fProdDxPy = rkDir.x*kPmE.y; + fProdDyPx = rkDir.y*kPmE.x; + if(fProdDyPx >= fProdDxPy) + { + fProdDzPx = rkDir.z*kPmE.x; + fProdDxPz = rkDir.x*kPmE.z; + if(fProdDzPx >= fProdDxPz) + { + // line intersects x = e0 + Face(0, 1, 2, rkPnt, rkDir, extents, kPmE, pfLParam, rfSqrDistance); + } + else + { + // line intersects z = e2 + Face(2, 0, 1, rkPnt, rkDir, extents, kPmE, pfLParam, rfSqrDistance); + } + } + else + { + fProdDzPy = rkDir.z*kPmE.y; + fProdDyPz = rkDir.y*kPmE.z; + if(fProdDzPy >= fProdDyPz) + { + // line intersects y = e1 + Face(1, 2, 0, rkPnt, rkDir, extents, kPmE, pfLParam, rfSqrDistance); + } + else + { + // line intersects z = e2 + Face(2, 0, 1, rkPnt, rkDir, extents, kPmE, pfLParam, rfSqrDistance); + } + } +} + +static void Case0(int i0, int i1, int i2, Point& rkPnt, const Point& rkDir, const Point& extents, float* pfLParam, float& rfSqrDistance) +{ + float fPmE0 = rkPnt[i0] - extents[i0]; + float fPmE1 = rkPnt[i1] - extents[i1]; + float fProd0 = rkDir[i1]*fPmE0; + float fProd1 = rkDir[i0]*fPmE1; + float fDelta, fInvLSqr, fInv; + + if(fProd0 >= fProd1) + { + // line intersects P[i0] = e[i0] + rkPnt[i0] = extents[i0]; + + float fPpE1 = rkPnt[i1] + extents[i1]; + fDelta = fProd0 - rkDir[i0]*fPpE1; + if(fDelta >= 0.0f) + { + fInvLSqr = 1.0f/(rkDir[i0]*rkDir[i0] + rkDir[i1]*rkDir[i1]); + rfSqrDistance += fDelta*fDelta*fInvLSqr; + if(pfLParam) + { + rkPnt[i1] = -extents[i1]; + *pfLParam = -(rkDir[i0]*fPmE0+rkDir[i1]*fPpE1)*fInvLSqr; + } + } + else + { + if(pfLParam) + { + fInv = 1.0f/rkDir[i0]; + rkPnt[i1] -= fProd0*fInv; + *pfLParam = -fPmE0*fInv; + } + } + } + else + { + // line intersects P[i1] = e[i1] + rkPnt[i1] = extents[i1]; + + float fPpE0 = rkPnt[i0] + extents[i0]; + fDelta = fProd1 - rkDir[i1]*fPpE0; + if(fDelta >= 0.0f) + { + fInvLSqr = 1.0f/(rkDir[i0]*rkDir[i0] + rkDir[i1]*rkDir[i1]); + rfSqrDistance += fDelta*fDelta*fInvLSqr; + if(pfLParam) + { + rkPnt[i0] = -extents[i0]; + *pfLParam = -(rkDir[i0]*fPpE0+rkDir[i1]*fPmE1)*fInvLSqr; + } + } + else + { + if(pfLParam) + { + fInv = 1.0f/rkDir[i1]; + rkPnt[i0] -= fProd1*fInv; + *pfLParam = -fPmE1*fInv; + } + } + } + + if(rkPnt[i2] < -extents[i2]) + { + fDelta = rkPnt[i2] + extents[i2]; + rfSqrDistance += fDelta*fDelta; + rkPnt[i2] = -extents[i2]; + } + else if ( rkPnt[i2] > extents[i2] ) + { + fDelta = rkPnt[i2] - extents[i2]; + rfSqrDistance += fDelta*fDelta; + rkPnt[i2] = extents[i2]; + } +} + +static void Case00(int i0, int i1, int i2, Point& rkPnt, const Point& rkDir, const Point& extents, float* pfLParam, float& rfSqrDistance) +{ + float fDelta; + + if(pfLParam) + *pfLParam = (extents[i0] - rkPnt[i0])/rkDir[i0]; + + rkPnt[i0] = extents[i0]; + + if(rkPnt[i1] < -extents[i1]) + { + fDelta = rkPnt[i1] + extents[i1]; + rfSqrDistance += fDelta*fDelta; + rkPnt[i1] = -extents[i1]; + } + else if(rkPnt[i1] > extents[i1]) + { + fDelta = rkPnt[i1] - extents[i1]; + rfSqrDistance += fDelta*fDelta; + rkPnt[i1] = extents[i1]; + } + + if(rkPnt[i2] < -extents[i2]) + { + fDelta = rkPnt[i2] + extents[i2]; + rfSqrDistance += fDelta*fDelta; + rkPnt[i1] = -extents[i2]; + } + else if(rkPnt[i2] > extents[i2]) + { + fDelta = rkPnt[i2] - extents[i2]; + rfSqrDistance += fDelta*fDelta; + rkPnt[i2] = extents[i2]; + } +} + +static void Case000(Point& rkPnt, const Point& extents, float& rfSqrDistance) +{ + float fDelta; + + if(rkPnt.x < -extents.x) + { + fDelta = rkPnt.x + extents.x; + rfSqrDistance += fDelta*fDelta; + rkPnt.x = -extents.x; + } + else if(rkPnt.x > extents.x) + { + fDelta = rkPnt.x - extents.x; + rfSqrDistance += fDelta*fDelta; + rkPnt.x = extents.x; + } + + if(rkPnt.y < -extents.y) + { + fDelta = rkPnt.y + extents.y; + rfSqrDistance += fDelta*fDelta; + rkPnt.y = -extents.y; + } + else if(rkPnt.y > extents.y) + { + fDelta = rkPnt.y - extents.y; + rfSqrDistance += fDelta*fDelta; + rkPnt.y = extents.y; + } + + if(rkPnt.z < -extents.z) + { + fDelta = rkPnt.z + extents.z; + rfSqrDistance += fDelta*fDelta; + rkPnt.z = -extents.z; + } + else if(rkPnt.z > extents.z) + { + fDelta = rkPnt.z - extents.z; + rfSqrDistance += fDelta*fDelta; + rkPnt.z = extents.z; + } +} + +static float SqrDistance(const Ray& rkLine, const Point& center, const Point& extents, float* pfLParam) +{ + // compute coordinates of line in box coordinate system + Point kDiff = rkLine.mOrig - center; + Point kPnt = kDiff; + Point kDir = rkLine.mDir; + + // Apply reflections so that direction vector has nonnegative components. + bool bReflect[3]; + for(int i=0;i<3;i++) + { + if(kDir[i]<0.0f) + { + kPnt[i] = -kPnt[i]; + kDir[i] = -kDir[i]; + bReflect[i] = true; + } + else + { + bReflect[i] = false; + } + } + + float fSqrDistance = 0.0f; + + if(kDir.x>0.0f) + { + if(kDir.y>0.0f) + { + if(kDir.z>0.0f) CaseNoZeros(kPnt, kDir, extents, pfLParam, fSqrDistance); // (+,+,+) + else Case0(0, 1, 2, kPnt, kDir, extents, pfLParam, fSqrDistance); // (+,+,0) + } + else + { + if(kDir.z>0.0f) Case0(0, 2, 1, kPnt, kDir, extents, pfLParam, fSqrDistance); // (+,0,+) + else Case00(0, 1, 2, kPnt, kDir, extents, pfLParam, fSqrDistance); // (+,0,0) + } + } + else + { + if(kDir.y>0.0f) + { + if(kDir.z>0.0f) Case0(1, 2, 0, kPnt, kDir, extents, pfLParam, fSqrDistance); // (0,+,+) + else Case00(1, 0, 2, kPnt, kDir, extents, pfLParam, fSqrDistance); // (0,+,0) + } + else + { + if(kDir.z>0.0f) Case00(2, 0, 1, kPnt, kDir, extents, pfLParam, fSqrDistance); // (0,0,+) + else + { + Case000(kPnt, extents, fSqrDistance); // (0,0,0) + if(pfLParam) *pfLParam = 0.0f; + } + } + } + return fSqrDistance; +} + +inline_ float OPC_SegmentOBBSqrDist(const Segment& segment, const Point& c0, const Point& e0) +{ + float fLP; + float fSqrDistance = SqrDistance(Ray(segment.GetOrigin(), segment.ComputeDirection()), c0, e0, &fLP); + if(fLP>=0.0f) + { + if(fLP<=1.0f) return fSqrDistance; + else return OPC_PointAABBSqrDist(segment.mP1, c0, e0); + } + else return OPC_PointAABBSqrDist(segment.mP0, c0, e0); +} + +inline_ BOOL LSSCollider::LSSAABBOverlap(const Point& center, const Point& extents) +{ + // Stats + mNbVolumeBVTests++; + + float s2 = OPC_SegmentOBBSqrDist(mSeg, center, extents); + if(s2Add(prim_index); + +//! LSS-triangle overlap test +#define LSS_PRIM(prim_index, flag) \ + /* Request vertices from the app */ \ + VertexPointers VP; mIMesh->GetTriangle(VP, prim_index); \ + \ + /* Perform LSS-tri overlap test */ \ + if(LSSTriOverlap(*VP.Vertex[0], *VP.Vertex[1], *VP.Vertex[2])) \ + { \ + SET_CONTACT(prim_index, flag) \ + } + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Constructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +LSSCollider::LSSCollider() +{ +// mCenter.Zero(); +// mRadius2 = 0.0f; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Destructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +LSSCollider::~LSSCollider() +{ +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Generic collision query for generic OPCODE models. After the call, access the results: + * - with GetContactStatus() + * - with GetNbTouchedPrimitives() + * - with GetTouchedPrimitives() + * + * \param cache [in/out] an lss cache + * \param lss [in] collision lss in local space + * \param model [in] Opcode model to collide with + * \param worldl [in] lss world matrix, or null + * \param worldm [in] model's world matrix, or null + * \return true if success + * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool LSSCollider::Collide(LSSCache& cache, const LSS& lss, const Model& model, const Matrix4x4* worldl, const Matrix4x4* worldm) +{ + // Checkings + if(!Setup(&model)) return false; + + // Init collision query + if(InitQuery(cache, lss, worldl, worldm)) return true; + + if(!model.HasLeafNodes()) + { + if(model.IsQuantized()) + { + const AABBQuantizedNoLeafTree* Tree = (const AABBQuantizedNoLeafTree*)model.GetTree(); + + // Setup dequantization coeffs + mCenterCoeff = Tree->mCenterCoeff; + mExtentsCoeff = Tree->mExtentsCoeff; + + // Perform collision query + if(SkipPrimitiveTests()) _CollideNoPrimitiveTest(Tree->GetNodes()); + else _Collide(Tree->GetNodes()); + } + else + { + const AABBNoLeafTree* Tree = (const AABBNoLeafTree*)model.GetTree(); + + // Perform collision query + if(SkipPrimitiveTests()) _CollideNoPrimitiveTest(Tree->GetNodes()); + else _Collide(Tree->GetNodes()); + } + } + else + { + if(model.IsQuantized()) + { + const AABBQuantizedTree* Tree = (const AABBQuantizedTree*)model.GetTree(); + + // Setup dequantization coeffs + mCenterCoeff = Tree->mCenterCoeff; + mExtentsCoeff = Tree->mExtentsCoeff; + + // Perform collision query + if(SkipPrimitiveTests()) _CollideNoPrimitiveTest(Tree->GetNodes()); + else _Collide(Tree->GetNodes()); + } + else + { + const AABBCollisionTree* Tree = (const AABBCollisionTree*)model.GetTree(); + + // Perform collision query + if(SkipPrimitiveTests()) _CollideNoPrimitiveTest(Tree->GetNodes()); + else _Collide(Tree->GetNodes()); + } + } + + return true; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Initializes a collision query : + * - reset stats & contact status + * - setup matrices + * - check temporal coherence + * + * \param cache [in/out] an lss cache + * \param lss [in] lss in local space + * \param worldl [in] lss world matrix, or null + * \param worldm [in] model's world matrix, or null + * \return TRUE if we can return immediately + * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +BOOL LSSCollider::InitQuery(LSSCache& cache, const LSS& lss, const Matrix4x4* worldl, const Matrix4x4* worldm) +{ + // 1) Call the base method + VolumeCollider::InitQuery(); + + // 2) Compute LSS in model space: + // - Precompute R^2 + mRadius2 = lss.mRadius * lss.mRadius; + // - Compute segment + mSeg.mP0 = lss.mP0; + mSeg.mP1 = lss.mP1; + // -> to world space + if(worldl) + { + mSeg.mP0 *= *worldl; + mSeg.mP1 *= *worldl; + } + // -> to model space + if(worldm) + { + // Invert model matrix + Matrix4x4 InvWorldM; + InvertPRMatrix(InvWorldM, *worldm); + + mSeg.mP0 *= InvWorldM; + mSeg.mP1 *= InvWorldM; + } + + // 3) Setup destination pointer + mTouchedPrimitives = &cache.TouchedPrimitives; + + // 4) Special case: 1-triangle meshes [Opcode 1.3] + if(mCurrentModel && mCurrentModel->HasSingleNode()) + { + if(!SkipPrimitiveTests()) + { + // We simply perform the BV-Prim overlap test each time. We assume single triangle has index 0. + mTouchedPrimitives->Reset(); + + // Perform overlap test between the unique triangle and the LSS (and set contact status if needed) + LSS_PRIM(udword(0), OPC_CONTACT) + + // Return immediately regardless of status + return TRUE; + } + } + + // 5) Check temporal coherence : + if(TemporalCoherenceEnabled()) + { + // Here we use temporal coherence + // => check results from previous frame before performing the collision query + if(FirstContactEnabled()) + { + // We're only interested in the first contact found => test the unique previously touched face + if(mTouchedPrimitives->GetNbEntries()) + { + // Get index of previously touched face = the first entry in the array + udword PreviouslyTouchedFace = mTouchedPrimitives->GetEntry(0); + + // Then reset the array: + // - if the overlap test below is successful, the index we'll get added back anyway + // - if it isn't, then the array should be reset anyway for the normal query + mTouchedPrimitives->Reset(); + + // Perform overlap test between the cached triangle and the LSS (and set contact status if needed) + LSS_PRIM(PreviouslyTouchedFace, OPC_TEMPORAL_CONTACT) + + // Return immediately if possible + if(GetContactStatus()) return TRUE; + } + // else no face has been touched during previous query + // => we'll have to perform a normal query + } + else + { + // We're interested in all contacts =>test the new real LSS N(ew) against the previous fat LSS P(revious): + + // ### rewrite this + + LSS Test(mSeg, lss.mRadius); // in model space + LSS Previous(cache.Previous, sqrtf(cache.Previous.mRadius)); + +// if(cache.Previous.Contains(Test)) + if(IsCacheValid(cache) && Previous.Contains(Test)) + { + // - if N is included in P, return previous list + // => we simply leave the list (mTouchedFaces) unchanged + + // Set contact status if needed + if(mTouchedPrimitives->GetNbEntries()) mFlags |= OPC_TEMPORAL_CONTACT; + + // In any case we don't need to do a query + return TRUE; + } + else + { + // - else do the query using a fat N + + // Reset cache since we'll about to perform a real query + mTouchedPrimitives->Reset(); + + // Make a fat sphere so that coherence will work for subsequent frames + mRadius2 *= cache.FatCoeff; +// mRadius2 = (lss.mRadius * cache.FatCoeff)*(lss.mRadius * cache.FatCoeff); + + + // Update cache with query data (signature for cached faces) + cache.Previous.mP0 = mSeg.mP0; + cache.Previous.mP1 = mSeg.mP1; + cache.Previous.mRadius = mRadius2; + } + } + } + else + { + // Here we don't use temporal coherence => do a normal query + mTouchedPrimitives->Reset(); + } + + return FALSE; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Collision query for vanilla AABB trees. + * \param cache [in/out] an lss cache + * \param lss [in] collision lss in world space + * \param tree [in] AABB tree + * \return true if success + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool LSSCollider::Collide(LSSCache& cache, const LSS& lss, const AABBTree* tree) +{ + // This is typically called for a scene tree, full of -AABBs-, not full of triangles. + // So we don't really have "primitives" to deal with. Hence it doesn't work with + // "FirstContact" + "TemporalCoherence". + ASSERT( !(FirstContactEnabled() && TemporalCoherenceEnabled()) ); + + // Checkings + if(!tree) return false; + + // Init collision query + if(InitQuery(cache, lss)) return true; + + // Perform collision query + _Collide(tree); + + return true; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Checks the LSS completely contains the box. In which case we can end the query sooner. + * \param bc [in] box center + * \param be [in] box extents + * \return true if the LSS contains the whole box + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +inline_ BOOL LSSCollider::LSSContainsBox(const Point& bc, const Point& be) +{ + // Not implemented + return FALSE; +} + +#define TEST_BOX_IN_LSS(center, extents) \ + if(LSSContainsBox(center, extents)) \ + { \ + /* Set contact status */ \ + mFlags |= OPC_CONTACT; \ + _Dump(node); \ + return; \ + } + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for normal AABB trees. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void LSSCollider::_Collide(const AABBCollisionNode* node) +{ + // Perform LSS-AABB overlap test + if(!LSSAABBOverlap(node->mAABB.mCenter, node->mAABB.mExtents)) return; + + TEST_BOX_IN_LSS(node->mAABB.mCenter, node->mAABB.mExtents) + + if(node->IsLeaf()) + { + LSS_PRIM(node->GetPrimitive(), OPC_CONTACT) + } + else + { + _Collide(node->GetPos()); + + if(ContactFound()) return; + + _Collide(node->GetNeg()); + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for normal AABB trees, without primitive tests. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void LSSCollider::_CollideNoPrimitiveTest(const AABBCollisionNode* node) +{ + // Perform LSS-AABB overlap test + if(!LSSAABBOverlap(node->mAABB.mCenter, node->mAABB.mExtents)) return; + + TEST_BOX_IN_LSS(node->mAABB.mCenter, node->mAABB.mExtents) + + if(node->IsLeaf()) + { + SET_CONTACT(node->GetPrimitive(), OPC_CONTACT) + } + else + { + _CollideNoPrimitiveTest(node->GetPos()); + + if(ContactFound()) return; + + _CollideNoPrimitiveTest(node->GetNeg()); + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for quantized AABB trees. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void LSSCollider::_Collide(const AABBQuantizedNode* node) +{ + // Dequantize box + const QuantizedAABB& Box = node->mAABB; + const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); + const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); + + // Perform LSS-AABB overlap test + if(!LSSAABBOverlap(Center, Extents)) return; + + TEST_BOX_IN_LSS(Center, Extents) + + if(node->IsLeaf()) + { + LSS_PRIM(node->GetPrimitive(), OPC_CONTACT) + } + else + { + _Collide(node->GetPos()); + + if(ContactFound()) return; + + _Collide(node->GetNeg()); + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for quantized AABB trees, without primitive tests. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void LSSCollider::_CollideNoPrimitiveTest(const AABBQuantizedNode* node) +{ + // Dequantize box + const QuantizedAABB& Box = node->mAABB; + const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); + const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); + + // Perform LSS-AABB overlap test + if(!LSSAABBOverlap(Center, Extents)) return; + + TEST_BOX_IN_LSS(Center, Extents) + + if(node->IsLeaf()) + { + SET_CONTACT(node->GetPrimitive(), OPC_CONTACT) + } + else + { + _CollideNoPrimitiveTest(node->GetPos()); + + if(ContactFound()) return; + + _CollideNoPrimitiveTest(node->GetNeg()); + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for no-leaf AABB trees. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void LSSCollider::_Collide(const AABBNoLeafNode* node) +{ + // Perform LSS-AABB overlap test + if(!LSSAABBOverlap(node->mAABB.mCenter, node->mAABB.mExtents)) return; + + TEST_BOX_IN_LSS(node->mAABB.mCenter, node->mAABB.mExtents) + + if(node->HasPosLeaf()) { LSS_PRIM(node->GetPosPrimitive(), OPC_CONTACT) } + else _Collide(node->GetPos()); + + if(ContactFound()) return; + + if(node->HasNegLeaf()) { LSS_PRIM(node->GetNegPrimitive(), OPC_CONTACT) } + else _Collide(node->GetNeg()); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for no-leaf AABB trees, without primitive tests. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void LSSCollider::_CollideNoPrimitiveTest(const AABBNoLeafNode* node) +{ + // Perform LSS-AABB overlap test + if(!LSSAABBOverlap(node->mAABB.mCenter, node->mAABB.mExtents)) return; + + TEST_BOX_IN_LSS(node->mAABB.mCenter, node->mAABB.mExtents) + + if(node->HasPosLeaf()) { SET_CONTACT(node->GetPosPrimitive(), OPC_CONTACT) } + else _CollideNoPrimitiveTest(node->GetPos()); + + if(ContactFound()) return; + + if(node->HasNegLeaf()) { SET_CONTACT(node->GetNegPrimitive(), OPC_CONTACT) } + else _CollideNoPrimitiveTest(node->GetNeg()); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for quantized no-leaf AABB trees. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void LSSCollider::_Collide(const AABBQuantizedNoLeafNode* node) +{ + // Dequantize box + const QuantizedAABB& Box = node->mAABB; + const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); + const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); + + // Perform LSS-AABB overlap test + if(!LSSAABBOverlap(Center, Extents)) return; + + TEST_BOX_IN_LSS(Center, Extents) + + if(node->HasPosLeaf()) { LSS_PRIM(node->GetPosPrimitive(), OPC_CONTACT) } + else _Collide(node->GetPos()); + + if(ContactFound()) return; + + if(node->HasNegLeaf()) { LSS_PRIM(node->GetNegPrimitive(), OPC_CONTACT) } + else _Collide(node->GetNeg()); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for quantized no-leaf AABB trees, without primitive tests. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void LSSCollider::_CollideNoPrimitiveTest(const AABBQuantizedNoLeafNode* node) +{ + // Dequantize box + const QuantizedAABB& Box = node->mAABB; + const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); + const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); + + // Perform LSS-AABB overlap test + if(!LSSAABBOverlap(Center, Extents)) return; + + TEST_BOX_IN_LSS(Center, Extents) + + if(node->HasPosLeaf()) { SET_CONTACT(node->GetPosPrimitive(), OPC_CONTACT) } + else _CollideNoPrimitiveTest(node->GetPos()); + + if(ContactFound()) return; + + if(node->HasNegLeaf()) { SET_CONTACT(node->GetNegPrimitive(), OPC_CONTACT) } + else _CollideNoPrimitiveTest(node->GetNeg()); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for vanilla AABB trees. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void LSSCollider::_Collide(const AABBTreeNode* node) +{ + // Perform LSS-AABB overlap test + Point Center, Extents; + node->GetAABB()->GetCenter(Center); + node->GetAABB()->GetExtents(Extents); + if(!LSSAABBOverlap(Center, Extents)) return; + + if(node->IsLeaf() || LSSContainsBox(Center, Extents)) + { + mFlags |= OPC_CONTACT; + mTouchedPrimitives->Add(node->GetPrimitives(), node->GetNbPrimitives()); + } + else + { + _Collide(node->GetPos()); + _Collide(node->GetNeg()); + } +} + + + + + + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Constructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +HybridLSSCollider::HybridLSSCollider() +{ +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Destructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +HybridLSSCollider::~HybridLSSCollider() +{ +} + +bool HybridLSSCollider::Collide(LSSCache& cache, const LSS& lss, const HybridModel& model, const Matrix4x4* worldl, const Matrix4x4* worldm) +{ + // We don't want primitive tests here! + mFlags |= OPC_NO_PRIMITIVE_TESTS; + + // Checkings + if(!Setup(&model)) return false; + + // Init collision query + if(InitQuery(cache, lss, worldl, worldm)) return true; + + // Special case for 1-leaf trees + if(mCurrentModel && mCurrentModel->HasSingleNode()) + { + // Here we're supposed to perform a normal query, except our tree has a single node, i.e. just a few triangles + udword Nb = mIMesh->GetNbTriangles(); + + // Loop through all triangles + for(udword i=0;imCenterCoeff; + mExtentsCoeff = Tree->mExtentsCoeff; + + // Perform collision query - we don't want primitive tests here! + _CollideNoPrimitiveTest(Tree->GetNodes()); + } + else + { + const AABBNoLeafTree* Tree = (const AABBNoLeafTree*)model.GetTree(); + + // Perform collision query - we don't want primitive tests here! + _CollideNoPrimitiveTest(Tree->GetNodes()); + } + } + else + { + if(model.IsQuantized()) + { + const AABBQuantizedTree* Tree = (const AABBQuantizedTree*)model.GetTree(); + + // Setup dequantization coeffs + mCenterCoeff = Tree->mCenterCoeff; + mExtentsCoeff = Tree->mExtentsCoeff; + + // Perform collision query - we don't want primitive tests here! + _CollideNoPrimitiveTest(Tree->GetNodes()); + } + else + { + const AABBCollisionTree* Tree = (const AABBCollisionTree*)model.GetTree(); + + // Perform collision query - we don't want primitive tests here! + _CollideNoPrimitiveTest(Tree->GetNodes()); + } + } + + // We only have a list of boxes so far + if(GetContactStatus()) + { + // Reset contact status, since it currently only reflects collisions with leaf boxes + Collider::InitQuery(); + + // Change dest container so that we can use built-in overlap tests and get collided primitives + cache.TouchedPrimitives.Reset(); + mTouchedPrimitives = &cache.TouchedPrimitives; + + // Read touched leaf boxes + udword Nb = mTouchedBoxes.GetNbEntries(); + const udword* Touched = mTouchedBoxes.GetEntries(); + + const LeafTriangles* LT = model.GetLeafTriangles(); + const udword* Indices = model.GetIndices(); + + // Loop through touched leaves + while(Nb--) + { + const LeafTriangles& CurrentLeaf = LT[*Touched++]; + + // Each leaf box has a set of triangles + udword NbTris = CurrentLeaf.GetNbTriangles(); + if(Indices) + { + const udword* T = &Indices[CurrentLeaf.GetTriangleIndex()]; + + // Loop through triangles and test each of them + while(NbTris--) + { + udword TriangleIndex = *T++; + LSS_PRIM(TriangleIndex, OPC_CONTACT) + } + } + else + { + udword BaseIndex = CurrentLeaf.GetTriangleIndex(); + + // Loop through triangles and test each of them + while(NbTris--) + { + udword TriangleIndex = BaseIndex++; + LSS_PRIM(TriangleIndex, OPC_CONTACT) + } + } + } + } + + return true; +} diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_LSSCollider.h b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_LSSCollider.h new file mode 100644 index 00000000..43921b30 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_LSSCollider.h @@ -0,0 +1,108 @@ +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code for an LSS collider. + * \file OPC_LSSCollider.h + * \author Pierre Terdiman + * \date December, 28, 2002 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef __OPC_LSSCOLLIDER_H__ +#define __OPC_LSSCOLLIDER_H__ + + struct OPCODE_API LSSCache : VolumeCache + { + LSSCache() + { + Previous.mP0 = Point(0.0f, 0.0f, 0.0f); + Previous.mP1 = Point(0.0f, 0.0f, 0.0f); + Previous.mRadius = 0.0f; + FatCoeff = 1.1f; + } + + // Cached faces signature + LSS Previous; //!< LSS used when performing the query resulting in cached faces + // User settings + float FatCoeff; //!< mRadius2 multiplier used to create a fat LSS + }; + + class OPCODE_API LSSCollider : public VolumeCollider + { + public: + // Constructor / Destructor + LSSCollider(); + virtual ~LSSCollider(); + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Generic collision query for generic OPCODE models. After the call, access the results: + * - with GetContactStatus() + * - with GetNbTouchedPrimitives() + * - with GetTouchedPrimitives() + * + * \param cache [in/out] an lss cache + * \param lss [in] collision lss in local space + * \param model [in] Opcode model to collide with + * \param worldl [in] lss world matrix, or null + * \param worldm [in] model's world matrix, or null + * \return true if success + * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only. + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + bool Collide(LSSCache& cache, const LSS& lss, const Model& model, const Matrix4x4* worldl=null, const Matrix4x4* worldm=null); + // + bool Collide(LSSCache& cache, const LSS& lss, const AABBTree* tree); + protected: + // LSS in model space + Segment mSeg; //!< Segment + float mRadius2; //!< LSS radius squared + // Internal methods + void _Collide(const AABBCollisionNode* node); + void _Collide(const AABBNoLeafNode* node); + void _Collide(const AABBQuantizedNode* node); + void _Collide(const AABBQuantizedNoLeafNode* node); + void _Collide(const AABBTreeNode* node); + void _CollideNoPrimitiveTest(const AABBCollisionNode* node); + void _CollideNoPrimitiveTest(const AABBNoLeafNode* node); + void _CollideNoPrimitiveTest(const AABBQuantizedNode* node); + void _CollideNoPrimitiveTest(const AABBQuantizedNoLeafNode* node); + // Overlap tests + inline_ BOOL LSSContainsBox(const Point& bc, const Point& be); + inline_ BOOL LSSAABBOverlap(const Point& center, const Point& extents); + inline_ BOOL LSSTriOverlap(const Point& vert0, const Point& vert1, const Point& vert2); + // Init methods + BOOL InitQuery(LSSCache& cache, const LSS& lss, const Matrix4x4* worldl=null, const Matrix4x4* worldm=null); + }; + + class OPCODE_API HybridLSSCollider : public LSSCollider + { + public: + // Constructor / Destructor + HybridLSSCollider(); + virtual ~HybridLSSCollider(); + + bool Collide(LSSCache& cache, const LSS& lss, const HybridModel& model, const Matrix4x4* worldl=null, const Matrix4x4* worldm=null); + protected: + Container mTouchedBoxes; + }; + +#endif // __OPC_LSSCOLLIDER_H__ diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_LSSTriOverlap.h b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_LSSTriOverlap.h new file mode 100644 index 00000000..b6171a86 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_LSSTriOverlap.h @@ -0,0 +1,696 @@ +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +// Following code from Magic-Software (http://www.magic-software.com/) +// A bit modified for Opcode + +static const float gs_fTolerance = 1e-05f; + +static float OPC_PointTriangleSqrDist(const Point& point, const Point& p0, const Point& p1, const Point& p2) +{ + // Hook + Point TriEdge0 = p1 - p0; + Point TriEdge1 = p2 - p0; + + Point kDiff = p0 - point; + float fA00 = TriEdge0.SquareMagnitude(); + float fA01 = TriEdge0 | TriEdge1; + float fA11 = TriEdge1.SquareMagnitude(); + float fB0 = kDiff | TriEdge0; + float fB1 = kDiff | TriEdge1; + float fC = kDiff.SquareMagnitude(); + float fDet = fabsf(fA00*fA11 - fA01*fA01); + float fS = fA01*fB1-fA11*fB0; + float fT = fA01*fB0-fA00*fB1; + float fSqrDist; + + if(fS + fT <= fDet) + { + if(fS < 0.0f) + { + if(fT < 0.0f) // region 4 + { + if(fB0 < 0.0f) + { + if(-fB0 >= fA00) fSqrDist = fA00+2.0f*fB0+fC; + else fSqrDist = fB0*(-fB0/fA00)+fC; + } + else + { + if(fB1 >= 0.0f) fSqrDist = fC; + else if(-fB1 >= fA11) fSqrDist = fA11+2.0f*fB1+fC; + else fSqrDist = fB1*(-fB1/fA11)+fC; + } + } + else // region 3 + { + if(fB1 >= 0.0f) fSqrDist = fC; + else if(-fB1 >= fA11) fSqrDist = fA11+2.0f*fB1+fC; + else fSqrDist = fB1*(-fB1/fA11)+fC; + } + } + else if(fT < 0.0f) // region 5 + { + if(fB0 >= 0.0f) fSqrDist = fC; + else if(-fB0 >= fA00) fSqrDist = fA00+2.0f*fB0+fC; + else fSqrDist = fB0*(-fB0/fA00)+fC; + } + else // region 0 + { + // minimum at interior point + if(fDet==0.0f) + { + fSqrDist = MAX_FLOAT; + } + else + { + float fInvDet = 1.0f/fDet; + fS *= fInvDet; + fT *= fInvDet; + fSqrDist = fS*(fA00*fS+fA01*fT+2.0f*fB0) + fT*(fA01*fS+fA11*fT+2.0f*fB1)+fC; + } + } + } + else + { + float fTmp0, fTmp1, fNumer, fDenom; + + if(fS < 0.0f) // region 2 + { + fTmp0 = fA01 + fB0; + fTmp1 = fA11 + fB1; + if(fTmp1 > fTmp0) + { + fNumer = fTmp1 - fTmp0; + fDenom = fA00-2.0f*fA01+fA11; + if(fNumer >= fDenom) + { + fSqrDist = fA00+2.0f*fB0+fC; + } + else + { + fS = fNumer/fDenom; + fT = 1.0f - fS; + fSqrDist = fS*(fA00*fS+fA01*fT+2.0f*fB0) + fT*(fA01*fS+fA11*fT+2.0f*fB1)+fC; + } + } + else + { + if(fTmp1 <= 0.0f) fSqrDist = fA11+2.0f*fB1+fC; + else if(fB1 >= 0.0f) fSqrDist = fC; + else fSqrDist = fB1*(-fB1/fA11)+fC; + } + } + else if(fT < 0.0f) // region 6 + { + fTmp0 = fA01 + fB1; + fTmp1 = fA00 + fB0; + if(fTmp1 > fTmp0) + { + fNumer = fTmp1 - fTmp0; + fDenom = fA00-2.0f*fA01+fA11; + if(fNumer >= fDenom) + { + fSqrDist = fA11+2.0f*fB1+fC; + } + else + { + fT = fNumer/fDenom; + fS = 1.0f - fT; + fSqrDist = fS*(fA00*fS+fA01*fT+2.0f*fB0) + fT*(fA01*fS+fA11*fT+2.0f*fB1)+fC; + } + } + else + { + if(fTmp1 <= 0.0f) fSqrDist = fA00+2.0f*fB0+fC; + else if(fB0 >= 0.0f) fSqrDist = fC; + else fSqrDist = fB0*(-fB0/fA00)+fC; + } + } + else // region 1 + { + fNumer = fA11 + fB1 - fA01 - fB0; + if(fNumer <= 0.0f) + { + fSqrDist = fA11+2.0f*fB1+fC; + } + else + { + fDenom = fA00-2.0f*fA01+fA11; + if(fNumer >= fDenom) + { + fSqrDist = fA00+2.0f*fB0+fC; + } + else + { + fS = fNumer/fDenom; + fT = 1.0f - fS; + fSqrDist = fS*(fA00*fS+fA01*fT+2.0f*fB0) + fT*(fA01*fS+fA11*fT+2.0f*fB1)+fC; + } + } + } + } + return fabsf(fSqrDist); +} + +static float OPC_SegmentSegmentSqrDist(const Segment& rkSeg0, const Segment& rkSeg1) +{ + // Hook + Point rkSeg0Direction = rkSeg0.ComputeDirection(); + Point rkSeg1Direction = rkSeg1.ComputeDirection(); + + Point kDiff = rkSeg0.mP0 - rkSeg1.mP0; + float fA00 = rkSeg0Direction.SquareMagnitude(); + float fA01 = -rkSeg0Direction.Dot(rkSeg1Direction); + float fA11 = rkSeg1Direction.SquareMagnitude(); + float fB0 = kDiff.Dot(rkSeg0Direction); + float fC = kDiff.SquareMagnitude(); + float fDet = fabsf(fA00*fA11-fA01*fA01); + + float fB1, fS, fT, fSqrDist, fTmp; + + if(fDet>=gs_fTolerance) + { + // line segments are not parallel + fB1 = -kDiff.Dot(rkSeg1Direction); + fS = fA01*fB1-fA11*fB0; + fT = fA01*fB0-fA00*fB1; + + if(fS >= 0.0f) + { + if(fS <= fDet) + { + if(fT >= 0.0f) + { + if(fT <= fDet) // region 0 (interior) + { + // minimum at two interior points of 3D lines + float fInvDet = 1.0f/fDet; + fS *= fInvDet; + fT *= fInvDet; + fSqrDist = fS*(fA00*fS+fA01*fT+2.0f*fB0) + fT*(fA01*fS+fA11*fT+2.0f*fB1)+fC; + } + else // region 3 (side) + { + fTmp = fA01+fB0; + if(fTmp>=0.0f) fSqrDist = fA11+2.0f*fB1+fC; + else if(-fTmp>=fA00) fSqrDist = fA00+fA11+fC+2.0f*(fB1+fTmp); + else fSqrDist = fTmp*(-fTmp/fA00)+fA11+2.0f*fB1+fC; + } + } + else // region 7 (side) + { + if(fB0>=0.0f) fSqrDist = fC; + else if(-fB0>=fA00) fSqrDist = fA00+2.0f*fB0+fC; + else fSqrDist = fB0*(-fB0/fA00)+fC; + } + } + else + { + if ( fT >= 0.0 ) + { + if ( fT <= fDet ) // region 1 (side) + { + fTmp = fA01+fB1; + if(fTmp>=0.0f) fSqrDist = fA00+2.0f*fB0+fC; + else if(-fTmp>=fA11) fSqrDist = fA00+fA11+fC+2.0f*(fB0+fTmp); + else fSqrDist = fTmp*(-fTmp/fA11)+fA00+2.0f*fB0+fC; + } + else // region 2 (corner) + { + fTmp = fA01+fB0; + if ( -fTmp <= fA00 ) + { + if(fTmp>=0.0f) fSqrDist = fA11+2.0f*fB1+fC; + else fSqrDist = fTmp*(-fTmp/fA00)+fA11+2.0f*fB1+fC; + } + else + { + fTmp = fA01+fB1; + if(fTmp>=0.0f) fSqrDist = fA00+2.0f*fB0+fC; + else if(-fTmp>=fA11) fSqrDist = fA00+fA11+fC+2.0f*(fB0+fTmp); + else fSqrDist = fTmp*(-fTmp/fA11)+fA00+2.0f*fB0+fC; + } + } + } + else // region 8 (corner) + { + if ( -fB0 < fA00 ) + { + if(fB0>=0.0f) fSqrDist = fC; + else fSqrDist = fB0*(-fB0/fA00)+fC; + } + else + { + fTmp = fA01+fB1; + if(fTmp>=0.0f) fSqrDist = fA00+2.0f*fB0+fC; + else if(-fTmp>=fA11) fSqrDist = fA00+fA11+fC+2.0f*(fB0+fTmp); + else fSqrDist = fTmp*(-fTmp/fA11)+fA00+2.0f*fB0+fC; + } + } + } + } + else + { + if ( fT >= 0.0f ) + { + if ( fT <= fDet ) // region 5 (side) + { + if(fB1>=0.0f) fSqrDist = fC; + else if(-fB1>=fA11) fSqrDist = fA11+2.0f*fB1+fC; + else fSqrDist = fB1*(-fB1/fA11)+fC; + } + else // region 4 (corner) + { + fTmp = fA01+fB0; + if ( fTmp < 0.0f ) + { + if(-fTmp>=fA00) fSqrDist = fA00+fA11+fC+2.0f*(fB1+fTmp); + else fSqrDist = fTmp*(-fTmp/fA00)+fA11+2.0f*fB1+fC; + } + else + { + if(fB1>=0.0f) fSqrDist = fC; + else if(-fB1>=fA11) fSqrDist = fA11+2.0f*fB1+fC; + else fSqrDist = fB1*(-fB1/fA11)+fC; + } + } + } + else // region 6 (corner) + { + if ( fB0 < 0.0f ) + { + if(-fB0>=fA00) fSqrDist = fA00+2.0f*fB0+fC; + else fSqrDist = fB0*(-fB0/fA00)+fC; + } + else + { + if(fB1>=0.0f) fSqrDist = fC; + else if(-fB1>=fA11) fSqrDist = fA11+2.0f*fB1+fC; + else fSqrDist = fB1*(-fB1/fA11)+fC; + } + } + } + } + else + { + // line segments are parallel + if ( fA01 > 0.0f ) + { + // direction vectors form an obtuse angle + if ( fB0 >= 0.0f ) + { + fSqrDist = fC; + } + else if ( -fB0 <= fA00 ) + { + fSqrDist = fB0*(-fB0/fA00)+fC; + } + else + { + fB1 = -kDiff.Dot(rkSeg1Direction); + fTmp = fA00+fB0; + if ( -fTmp >= fA01 ) + { + fSqrDist = fA00+fA11+fC+2.0f*(fA01+fB0+fB1); + } + else + { + fT = -fTmp/fA01; + fSqrDist = fA00+2.0f*fB0+fC+fT*(fA11*fT+2.0f*(fA01+fB1)); + } + } + } + else + { + // direction vectors form an acute angle + if ( -fB0 >= fA00 ) + { + fSqrDist = fA00+2.0f*fB0+fC; + } + else if ( fB0 <= 0.0f ) + { + fSqrDist = fB0*(-fB0/fA00)+fC; + } + else + { + fB1 = -kDiff.Dot(rkSeg1Direction); + if ( fB0 >= -fA01 ) + { + fSqrDist = fA11+2.0f*fB1+fC; + } + else + { + fT = -fB0/fA01; + fSqrDist = fC+fT*(2.0f*fB1+fA11*fT); + } + } + } + } + return fabsf(fSqrDist); +} + +inline_ float OPC_SegmentRaySqrDist(const Segment& rkSeg0, const Ray& rkSeg1) +{ + return OPC_SegmentSegmentSqrDist(rkSeg0, Segment(rkSeg1.mOrig, rkSeg1.mOrig + rkSeg1.mDir)); +} + +static float OPC_SegmentTriangleSqrDist(const Segment& segment, const Point& p0, const Point& p1, const Point& p2) +{ + // Hook + const Point TriEdge0 = p1 - p0; + const Point TriEdge1 = p2 - p0; + + const Point& rkSegOrigin = segment.GetOrigin(); + Point rkSegDirection = segment.ComputeDirection(); + + Point kDiff = p0 - rkSegOrigin; + float fA00 = rkSegDirection.SquareMagnitude(); + float fA01 = -rkSegDirection.Dot(TriEdge0); + float fA02 = -rkSegDirection.Dot(TriEdge1); + float fA11 = TriEdge0.SquareMagnitude(); + float fA12 = TriEdge0.Dot(TriEdge1); + float fA22 = TriEdge1.Dot(TriEdge1); + float fB0 = -kDiff.Dot(rkSegDirection); + float fB1 = kDiff.Dot(TriEdge0); + float fB2 = kDiff.Dot(TriEdge1); + float fCof00 = fA11*fA22-fA12*fA12; + float fCof01 = fA02*fA12-fA01*fA22; + float fCof02 = fA01*fA12-fA02*fA11; + float fDet = fA00*fCof00+fA01*fCof01+fA02*fCof02; + + Ray kTriSeg; + Point kPt; + float fSqrDist, fSqrDist0; + + if(fabsf(fDet)>=gs_fTolerance) + { + float fCof11 = fA00*fA22-fA02*fA02; + float fCof12 = fA02*fA01-fA00*fA12; + float fCof22 = fA00*fA11-fA01*fA01; + float fInvDet = 1.0f/fDet; + float fRhs0 = -fB0*fInvDet; + float fRhs1 = -fB1*fInvDet; + float fRhs2 = -fB2*fInvDet; + + float fR = fCof00*fRhs0+fCof01*fRhs1+fCof02*fRhs2; + float fS = fCof01*fRhs0+fCof11*fRhs1+fCof12*fRhs2; + float fT = fCof02*fRhs0+fCof12*fRhs1+fCof22*fRhs2; + + if ( fR < 0.0f ) + { + if ( fS+fT <= 1.0f ) + { + if ( fS < 0.0f ) + { + if ( fT < 0.0f ) // region 4m + { + // min on face s=0 or t=0 or r=0 + kTriSeg.mOrig = p0; + kTriSeg.mDir = TriEdge1; + fSqrDist = OPC_SegmentRaySqrDist(segment, kTriSeg); + kTriSeg.mOrig = p0; + kTriSeg.mDir = TriEdge0; + fSqrDist0 = OPC_SegmentRaySqrDist(segment, kTriSeg); + if(fSqrDist0 1 + { + if ( fS+fT <= 1.0f ) + { + if ( fS < 0.0f ) + { + if ( fT < 0.0f ) // region 4p + { + // min on face s=0 or t=0 or r=1 + kTriSeg.mOrig = p0; + kTriSeg.mDir = TriEdge1; + fSqrDist = OPC_SegmentRaySqrDist(segment, kTriSeg); + kTriSeg.mOrig = p0; + kTriSeg.mDir = TriEdge0; + fSqrDist0 = OPC_SegmentRaySqrDist(segment, kTriSeg); + if(fSqrDist0GetTriangle(triangle_index); + * // Setup pointers to vertices for the collision system + * triangle.Vertex[0] = MyMesh->GetVertex(Tri->mVRef[0]); + * triangle.Vertex[1] = MyMesh->GetVertex(Tri->mVRef[1]); + * triangle.Vertex[2] = MyMesh->GetVertex(Tri->mVRef[2]); + * } + * + * // Setup callbacks + * MeshInterface0->SetCallback(ColCallback, udword(Mesh0)); + * MeshInterface1->SetCallback(ColCallback, udword(Mesh1)); + * \endcode + * + * Of course, you should make this callback as fast as possible. And you're also not supposed + * to modify the geometry *after* the collision trees have been built. The alternative was to + * store the geometry & topology in the collision system as well (as in RAPID) but we have found + * this approach to waste a lot of ram in many cases. + * + * + * POINTERS: + * + * If you're internally using the following canonical structures: + * - a vertex made of three 32-bits floating point values + * - a triangle made of three 32-bits integer vertex references + * ...then you may want to use pointers instead of callbacks. This is the same, except OPCODE will directly + * use provided pointers to access the topology and geometry, without using a callback. It might be faster, + * but probably not as safe. Pointers have been introduced in OPCODE 1.2. + * + * Ex: + * + * \code + * // Setup pointers + * MeshInterface0->SetPointers(Mesh0->GetFaces(), Mesh0->GetVerts()); + * MeshInterface1->SetPointers(Mesh1->GetFaces(), Mesh1->GetVerts()); + * \endcode + * + * + * STRIDES: + * + * If your vertices are D3D-like entities interleaving a position, a normal and/or texture coordinates + * (i.e. if your vertices are FVFs), you might want to use a vertex stride to skip extra data OPCODE + * doesn't need. Using a stride shouldn't be notably slower than not using it, but it might increase + * cache misses. Please also note that you *shouldn't* read from AGP or video-memory buffers ! + * + * + * In any case, compilation flags are here to select callbacks/pointers/strides at compile time, so + * choose what's best for your application. All of this has been wrapped into this MeshInterface. + * + * \class MeshInterface + * \author Pierre Terdiman + * \version 1.3 + * \date November, 27, 2002 +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Precompiled Header +#include "Stdafx.h" + +using namespace Opcode; + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Constructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +MeshInterface::MeshInterface() : +#ifdef OPC_USE_CALLBACKS + mUserData (null), + mObjCallback (null), +#else + mTris (null), + mVerts (null), + #ifdef OPC_USE_STRIDE + mTriStride (sizeof(IndexedTriangle)), + mVertexStride (sizeof(Point)), + #endif +#endif + mNbTris (0), + mNbVerts (0) +{ +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Destructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +MeshInterface::~MeshInterface() +{ +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Checks the mesh interface is valid, i.e. things have been setup correctly. + * \return true if valid + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool MeshInterface::IsValid() const +{ + if(!mNbTris || !mNbVerts) return false; +#ifdef OPC_USE_CALLBACKS + if(!mObjCallback) return false; +#else + if(!mTris || !mVerts) return false; +#endif + return true; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Checks the mesh itself is valid. + * Currently we only look for degenerate faces. + * \return number of degenerate faces + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +udword MeshInterface::CheckTopology() const +{ + // Check topology. If the model contains degenerate faces, collision report can be wrong in some cases. + // e.g. it happens with the standard MAX teapot. So clean your meshes first... If you don't have a mesh cleaner + // you can try this: www.codercorner.com/Consolidation.zip + + udword NbDegenerate = 0; + + VertexPointers VP; + + // Using callbacks, we don't have access to vertex indices. Nevertheless we still can check for + // redundant vertex pointers, which cover all possibilities (callbacks/pointers/strides). + for(udword i=0;i= 0.0f; + } + }; + +#ifdef OPC_USE_CALLBACKS + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * User-callback, called by OPCODE to request vertices from the app. + * \param triangle_index [in] face index for which the system is requesting the vertices + * \param triangle [out] triangle's vertices (must be provided by the user) + * \param user_data [in] user-defined data from SetCallback() + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + typedef void (*RequestCallback) (udword triangle_index, VertexPointers& triangle, void* user_data); +#endif + + class OPCODE_API MeshInterface + { + public: + // Constructor / Destructor + MeshInterface(); + ~MeshInterface(); + // Common settings + inline_ udword GetNbTriangles() const { return mNbTris; } + inline_ udword GetNbVertices() const { return mNbVerts; } + inline_ void SetNbTriangles(udword nb) { mNbTris = nb; } + inline_ void SetNbVertices(udword nb) { mNbVerts = nb; } + +#ifdef OPC_USE_CALLBACKS + // Callback settings + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Callback control: setups object callback. Must provide triangle-vertices for a given triangle index. + * \param callback [in] user-defined callback + * \param user_data [in] user-defined data + * \return true if success + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + bool SetCallback(RequestCallback callback, void* user_data); + inline_ void* GetUserData() const { return mUserData; } + inline_ RequestCallback GetCallback() const { return mObjCallback; } +#else + // Pointers settings + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Pointers control: setups object pointers. Must provide access to faces and vertices for a given object. + * \param tris [in] pointer to triangles + * \param verts [in] pointer to vertices + * \return true if success + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + bool SetPointers(const IndexedTriangle* tris, const Point* verts); + inline_ const IndexedTriangle* GetTris() const { return mTris; } + inline_ const Point* GetVerts() const { return mVerts; } + + #ifdef OPC_USE_STRIDE + // Strides settings + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Strides control + * \param tri_stride [in] size of a triangle in bytes. The first sizeof(IndexedTriangle) bytes are used to get vertex indices. + * \param vertex_stride [in] size of a vertex in bytes. The first sizeof(Point) bytes are used to get vertex position. + * \return true if success + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + bool SetStrides(udword tri_stride=sizeof(IndexedTriangle), udword vertex_stride=sizeof(Point)); + inline_ udword GetTriStride() const { return mTriStride; } + inline_ udword GetVertexStride() const { return mVertexStride; } + #endif +#endif + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Fetches a triangle given a triangle index. + * \param vp [out] required triangle's vertex pointers + * \param index [in] triangle index + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ void GetTriangle(VertexPointers& vp, udword index) const + { +#ifdef OPC_USE_CALLBACKS + (mObjCallback)(index, vp, mUserData); +#else + #ifdef OPC_USE_STRIDE + const IndexedTriangle* T = (const IndexedTriangle*)(((ubyte*)mTris) + index * mTriStride); + vp.Vertex[0] = (const Point*)(((ubyte*)mVerts) + T->mVRef[0] * mVertexStride); + vp.Vertex[1] = (const Point*)(((ubyte*)mVerts) + T->mVRef[1] * mVertexStride); + vp.Vertex[2] = (const Point*)(((ubyte*)mVerts) + T->mVRef[2] * mVertexStride); + #else + const IndexedTriangle* T = &mTris[index]; + vp.Vertex[0] = &mVerts[T->mVRef[0]]; + vp.Vertex[1] = &mVerts[T->mVRef[1]]; + vp.Vertex[2] = &mVerts[T->mVRef[2]]; + #endif +#endif + } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Remaps client's mesh according to a permutation. + * \param nb_indices [in] number of indices in the permutation (will be checked against number of triangles) + * \param permutation [in] list of triangle indices + * \return true if success + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ bool RemapClient(udword nb_indices, const udword* permutation) const; + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Checks the mesh interface is valid, i.e. things have been setup correctly. + * \return true if valid + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + bool IsValid() const; + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Checks the mesh itself is valid. + * Currently we only look for degenerate faces. + * \return number of degenerate faces + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + udword CheckTopology() const; + private: + + udword mNbTris; //!< Number of triangles in the input model + udword mNbVerts; //!< Number of vertices in the input model +#ifdef OPC_USE_CALLBACKS + // User callback + void* mUserData; //!< User-defined data sent to callback + RequestCallback mObjCallback; //!< Object callback +#else + // User pointers + const IndexedTriangle* mTris; //!< Array of indexed triangles + const Point* mVerts; //!< Array of vertices + #ifdef OPC_USE_STRIDE + udword mTriStride; //!< Possible triangle stride in bytes [Opcode 1.3] + udword mVertexStride; //!< Possible vertex stride in bytes [Opcode 1.3] + #endif +#endif + }; + +#endif //__OPC_MESHINTERFACE_H__ \ No newline at end of file diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_Model.cpp b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_Model.cpp new file mode 100644 index 00000000..f8c4c877 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_Model.cpp @@ -0,0 +1,231 @@ +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code for OPCODE models. + * \file OPC_Model.cpp + * \author Pierre Terdiman + * \date March, 20, 2001 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * The main collision wrapper, for all trees. Supported trees are: + * - Normal trees (2*N-1 nodes, full size) + * - No-leaf trees (N-1 nodes, full size) + * - Quantized trees (2*N-1 nodes, half size) + * - Quantized no-leaf trees (N-1 nodes, half size) + * + * Usage: + * + * 1) Create a static mesh interface using callbacks or pointers. (see OPC_MeshInterface.cpp). + * Keep it around in your app, since a pointer to this interface is saved internally and + * used until you release the collision structures. + * + * 2) Build a Model using a creation structure: + * + * \code + * Model Sample; + * + * OPCODECREATE OPCC; + * OPCC.IMesh = ...; + * OPCC.Rules = ...; + * OPCC.NoLeaf = ...; + * OPCC.Quantized = ...; + * OPCC.KeepOriginal = ...; + * bool Status = Sample.Build(OPCC); + * \endcode + * + * 3) Create a tree collider and set it up: + * + * \code + * AABBTreeCollider TC; + * TC.SetFirstContact(...); + * TC.SetFullBoxBoxTest(...); + * TC.SetFullPrimBoxTest(...); + * TC.SetTemporalCoherence(...); + * \endcode + * + * 4) Perform a collision query + * + * \code + * // Setup cache + * static BVTCache ColCache; + * ColCache.Model0 = &Model0; + * ColCache.Model1 = &Model1; + * + * // Collision query + * bool IsOk = TC.Collide(ColCache, World0, World1); + * + * // Get collision status => if true, objects overlap + * BOOL Status = TC.GetContactStatus(); + * + * // Number of colliding pairs and list of pairs + * udword NbPairs = TC.GetNbPairs(); + * const Pair* p = TC.GetPairs() + * \endcode + * + * 5) Stats + * + * \code + * Model0.GetUsedBytes() = number of bytes used for this collision tree + * TC.GetNbBVBVTests() = number of BV-BV overlap tests performed during last query + * TC.GetNbPrimPrimTests() = number of Triangle-Triangle overlap tests performed during last query + * TC.GetNbBVPrimTests() = number of Triangle-BV overlap tests performed during last query + * \endcode + * + * \class Model + * \author Pierre Terdiman + * \version 1.3 + * \date March, 20, 2001 +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Precompiled Header +#include "Stdafx.h" + +using namespace Opcode; + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Constructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +Model::Model() +{ +#ifdef __MESHMERIZER_H__ // Collision hulls only supported within ICE ! + mHull = null; +#endif // __MESHMERIZER_H__ +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Destructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +Model::~Model() +{ + Release(); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Releases the model. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void Model::Release() +{ + ReleaseBase(); +#ifdef __MESHMERIZER_H__ // Collision hulls only supported within ICE ! + DELETESINGLE(mHull); +#endif // __MESHMERIZER_H__ +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Builds a collision model. + * \param create [in] model creation structure + * \return true if success + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool Model::Build(const OPCODECREATE& create) +{ + // 1) Checkings + if(!create.mIMesh || !create.mIMesh->IsValid()) return false; + + // For this model, we only support complete trees + if(create.mSettings.mLimit!=1) return SetIceError("OPCODE WARNING: supports complete trees only! Use mLimit = 1.\n", null); + + // Look for degenerate faces. + udword NbDegenerate = create.mIMesh->CheckTopology(); + if(NbDegenerate) Log("OPCODE WARNING: found %d degenerate faces in model! Collision might report wrong results!\n", NbDegenerate); + // We continue nonetheless.... + + Release(); // Make sure previous tree has been discarded [Opcode 1.3, thanks Adam] + + // 1-1) Setup mesh interface automatically [Opcode 1.3] + SetMeshInterface(create.mIMesh); + + // Special case for 1-triangle meshes [Opcode 1.3] + udword NbTris = create.mIMesh->GetNbTriangles(); + if(NbTris==1) + { + // We don't need to actually create a tree here, since we'll only have a single triangle to deal with anyway. + // It's a waste to use a "model" for this but at least it will work. + mModelCode |= OPC_SINGLE_NODE; + return true; + } + + // 2) Build a generic AABB Tree. + mSource = new AABBTree; + CHECKALLOC(mSource); + + // 2-1) Setup a builder. Our primitives here are triangles from input mesh, + // so we use an AABBTreeOfTrianglesBuilder..... + { + AABBTreeOfTrianglesBuilder TB; + TB.mIMesh = create.mIMesh; + TB.mSettings = create.mSettings; + TB.mNbPrimitives = NbTris; + if(!mSource->Build(&TB)) return false; + } + + // 3) Create an optimized tree according to user-settings + if(!CreateTree(create.mNoLeaf, create.mQuantized)) return false; + + // 3-2) Create optimized tree + if(!mTree->Build(mSource)) return false; + + // 3-3) Delete generic tree if needed + if(!create.mKeepOriginal) DELETESINGLE(mSource); + +#ifdef __MESHMERIZER_H__ + // 4) Convex hull + if(create.mCollisionHull) + { + // Create hull + mHull = new CollisionHull; + CHECKALLOC(mHull); + + CONVEXHULLCREATE CHC; + // ### doesn't work with strides + CHC.NbVerts = create.mIMesh->GetNbVertices(); + CHC.Vertices = create.mIMesh->GetVerts(); + CHC.UnifyNormals = true; + CHC.ReduceVertices = true; + CHC.WordFaces = false; + mHull->Compute(CHC); + } +#endif // __MESHMERIZER_H__ + + return true; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Gets the number of bytes used by the tree. + * \return amount of bytes used + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +udword Model::GetUsedBytes() const +{ + if(!mTree) return 0; + return mTree->GetUsedBytes(); +} diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_Model.h b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_Model.h new file mode 100644 index 00000000..0124135d --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_Model.h @@ -0,0 +1,74 @@ +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code for OPCODE models. + * \file OPC_Model.h + * \author Pierre Terdiman + * \date March, 20, 2001 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef __OPC_MODEL_H__ +#define __OPC_MODEL_H__ + + class OPCODE_API Model : public BaseModel + { + public: + // Constructor/Destructor + Model(); + virtual ~Model(); + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Builds a collision model. + * \param create [in] model creation structure + * \return true if success + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + override(BaseModel) bool Build(const OPCODECREATE& create); + +#ifdef __MESHMERIZER_H__ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Gets the collision hull. + * \return the collision hull if it exists + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ const CollisionHull* GetHull() const { return mHull; } +#endif // __MESHMERIZER_H__ + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Gets the number of bytes used by the tree. + * \return amount of bytes used + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + override(BaseModel) udword GetUsedBytes() const; + + private: +#ifdef __MESHMERIZER_H__ + CollisionHull* mHull; //!< Possible convex hull +#endif // __MESHMERIZER_H__ + // Internal methods + void Release(); + }; + +#endif //__OPC_MODEL_H__ \ No newline at end of file diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_OBBCollider.cpp b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_OBBCollider.cpp new file mode 100644 index 00000000..99302400 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_OBBCollider.cpp @@ -0,0 +1,776 @@ +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code for an OBB collider. + * \file OPC_OBBCollider.cpp + * \author Pierre Terdiman + * \date January, 1st, 2002 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains an OBB-vs-tree collider. + * + * \class OBBCollider + * \author Pierre Terdiman + * \version 1.3 + * \date January, 1st, 2002 +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Precompiled Header +#include "Stdafx.h" + +using namespace Opcode; + +#include "OPC_BoxBoxOverlap.h" +#include "OPC_TriBoxOverlap.h" + +#define SET_CONTACT(prim_index, flag) \ + /* Set contact status */ \ + mFlags |= flag; \ + mTouchedPrimitives->Add(prim_index); + +//! OBB-triangle test +#define OBB_PRIM(prim_index, flag) \ + /* Request vertices from the app */ \ + VertexPointers VP; mIMesh->GetTriangle(VP, prim_index); \ + /* Transform them in a common space */ \ + TransformPoint(mLeafVerts[0], *VP.Vertex[0], mRModelToBox, mTModelToBox); \ + TransformPoint(mLeafVerts[1], *VP.Vertex[1], mRModelToBox, mTModelToBox); \ + TransformPoint(mLeafVerts[2], *VP.Vertex[2], mRModelToBox, mTModelToBox); \ + /* Perform triangle-box overlap test */ \ + if(TriBoxOverlap()) \ + { \ + SET_CONTACT(prim_index, flag) \ + } + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Constructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +OBBCollider::OBBCollider() : mFullBoxBoxTest(true) +{ +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Destructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +OBBCollider::~OBBCollider() +{ +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Validates current settings. You should call this method after all the settings and callbacks have been defined. + * \return null if everything is ok, else a string describing the problem + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +const char* OBBCollider::ValidateSettings() +{ + if(TemporalCoherenceEnabled() && !FirstContactEnabled()) return "Temporal coherence only works with ""First contact"" mode!"; + + return VolumeCollider::ValidateSettings(); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Generic collision query for generic OPCODE models. After the call, access the results: + * - with GetContactStatus() + * - with GetNbTouchedPrimitives() + * - with GetTouchedPrimitives() + * + * \param cache [in/out] a box cache + * \param box [in] collision OBB in local space + * \param model [in] Opcode model to collide with + * \param worldb [in] OBB's world matrix, or null + * \param worldm [in] model's world matrix, or null + * \return true if success + * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool OBBCollider::Collide(OBBCache& cache, const OBB& box, const Model& model, const Matrix4x4* worldb, const Matrix4x4* worldm) +{ + // Checkings + if(!Setup(&model)) return false; + + // Init collision query + if(InitQuery(cache, box, worldb, worldm)) return true; + + if(!model.HasLeafNodes()) + { + if(model.IsQuantized()) + { + const AABBQuantizedNoLeafTree* Tree = (const AABBQuantizedNoLeafTree*)model.GetTree(); + + // Setup dequantization coeffs + mCenterCoeff = Tree->mCenterCoeff; + mExtentsCoeff = Tree->mExtentsCoeff; + + // Perform collision query + if(SkipPrimitiveTests()) _CollideNoPrimitiveTest(Tree->GetNodes()); + else _Collide(Tree->GetNodes()); + } + else + { + const AABBNoLeafTree* Tree = (const AABBNoLeafTree*)model.GetTree(); + + // Perform collision query + if(SkipPrimitiveTests()) _CollideNoPrimitiveTest(Tree->GetNodes()); + else _Collide(Tree->GetNodes()); + } + } + else + { + if(model.IsQuantized()) + { + const AABBQuantizedTree* Tree = (const AABBQuantizedTree*)model.GetTree(); + + // Setup dequantization coeffs + mCenterCoeff = Tree->mCenterCoeff; + mExtentsCoeff = Tree->mExtentsCoeff; + + // Perform collision query + if(SkipPrimitiveTests()) _CollideNoPrimitiveTest(Tree->GetNodes()); + else _Collide(Tree->GetNodes()); + } + else + { + const AABBCollisionTree* Tree = (const AABBCollisionTree*)model.GetTree(); + + // Perform collision query + if(SkipPrimitiveTests()) _CollideNoPrimitiveTest(Tree->GetNodes()); + else _Collide(Tree->GetNodes()); + } + } + + return true; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Initializes a collision query : + * - reset stats & contact status + * - setup matrices + * - check temporal coherence + * + * \param cache [in/out] a box cache + * \param box [in] obb in local space + * \param worldb [in] obb's world matrix, or null + * \param worldm [in] model's world matrix, or null + * \return TRUE if we can return immediately + * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +BOOL OBBCollider::InitQuery(OBBCache& cache, const OBB& box, const Matrix4x4* worldb, const Matrix4x4* worldm) +{ + // 1) Call the base method + VolumeCollider::InitQuery(); + + // 2) Compute obb in world space + mBoxExtents = box.mExtents; + + Matrix4x4 WorldB; + + if(worldb) + { + WorldB = Matrix4x4( box.mRot * Matrix3x3(*worldb) ); + WorldB.SetTrans(box.mCenter * *worldb); + } + else + { + WorldB = box.mRot; + WorldB.SetTrans(box.mCenter); + } + + // Setup matrices + Matrix4x4 InvWorldB; + InvertPRMatrix(InvWorldB, WorldB); + + if(worldm) + { + Matrix4x4 InvWorldM; + InvertPRMatrix(InvWorldM, *worldm); + + Matrix4x4 WorldBtoM = WorldB * InvWorldM; + Matrix4x4 WorldMtoB = *worldm * InvWorldB; + + mRModelToBox = WorldMtoB; WorldMtoB.GetTrans(mTModelToBox); + mRBoxToModel = WorldBtoM; WorldBtoM.GetTrans(mTBoxToModel); + } + else + { + mRModelToBox = InvWorldB; InvWorldB.GetTrans(mTModelToBox); + mRBoxToModel = WorldB; WorldB.GetTrans(mTBoxToModel); + } + + // 3) Setup destination pointer + mTouchedPrimitives = &cache.TouchedPrimitives; + + // 4) Special case: 1-triangle meshes [Opcode 1.3] + if(mCurrentModel && mCurrentModel->HasSingleNode()) + { + if(!SkipPrimitiveTests()) + { + // We simply perform the BV-Prim overlap test each time. We assume single triangle has index 0. + mTouchedPrimitives->Reset(); + + // Perform overlap test between the unique triangle and the box (and set contact status if needed) + OBB_PRIM(udword(0), OPC_CONTACT) + + // Return immediately regardless of status + return TRUE; + } + } + + // 5) Check temporal coherence: + if(TemporalCoherenceEnabled()) + { + // Here we use temporal coherence + // => check results from previous frame before performing the collision query + if(FirstContactEnabled()) + { + // We're only interested in the first contact found => test the unique previously touched face + if(mTouchedPrimitives->GetNbEntries()) + { + // Get index of previously touched face = the first entry in the array + udword PreviouslyTouchedFace = mTouchedPrimitives->GetEntry(0); + + // Then reset the array: + // - if the overlap test below is successful, the index we'll get added back anyway + // - if it isn't, then the array should be reset anyway for the normal query + mTouchedPrimitives->Reset(); + + // Perform overlap test between the cached triangle and the box (and set contact status if needed) + OBB_PRIM(PreviouslyTouchedFace, OPC_TEMPORAL_CONTACT) + + // Return immediately if possible + if(GetContactStatus()) return TRUE; + } + // else no face has been touched during previous query + // => we'll have to perform a normal query + } + else + { + // ### rewrite this + OBB TestBox(mTBoxToModel, mBoxExtents, mRBoxToModel); + + // We're interested in all contacts =>test the new real box N(ew) against the previous fat box P(revious): + if(IsCacheValid(cache) && TestBox.IsInside(cache.FatBox)) + { + // - if N is included in P, return previous list + // => we simply leave the list (mTouchedFaces) unchanged + + // Set contact status if needed + if(mTouchedPrimitives->GetNbEntries()) mFlags |= OPC_TEMPORAL_CONTACT; + + // In any case we don't need to do a query + return TRUE; + } + else + { + // - else do the query using a fat N + + // Reset cache since we'll about to perform a real query + mTouchedPrimitives->Reset(); + + // Make a fat box so that coherence will work for subsequent frames + TestBox.mExtents *= cache.FatCoeff; + mBoxExtents *= cache.FatCoeff; + + // Update cache with query data (signature for cached faces) + cache.FatBox = TestBox; + } + } + } + else + { + // Here we don't use temporal coherence => do a normal query + mTouchedPrimitives->Reset(); + } + + // Now we can precompute box-box data + + // Precompute absolute box-to-model rotation matrix + for(udword i=0;i<3;i++) + { + for(udword j=0;j<3;j++) + { + // Epsilon value prevents floating-point inaccuracies (strategy borrowed from RAPID) + mAR.m[i][j] = 1e-6f + fabsf(mRBoxToModel.m[i][j]); + } + } + + // Precompute bounds for box-in-box test + mB0 = mBoxExtents - mTModelToBox; + mB1 = - mBoxExtents - mTModelToBox; + + // Precompute box-box data - Courtesy of Erwin de Vries + mBBx1 = mBoxExtents.x*mAR.m[0][0] + mBoxExtents.y*mAR.m[1][0] + mBoxExtents.z*mAR.m[2][0]; + mBBy1 = mBoxExtents.x*mAR.m[0][1] + mBoxExtents.y*mAR.m[1][1] + mBoxExtents.z*mAR.m[2][1]; + mBBz1 = mBoxExtents.x*mAR.m[0][2] + mBoxExtents.y*mAR.m[1][2] + mBoxExtents.z*mAR.m[2][2]; + + mBB_1 = mBoxExtents.y*mAR.m[2][0] + mBoxExtents.z*mAR.m[1][0]; + mBB_2 = mBoxExtents.x*mAR.m[2][0] + mBoxExtents.z*mAR.m[0][0]; + mBB_3 = mBoxExtents.x*mAR.m[1][0] + mBoxExtents.y*mAR.m[0][0]; + mBB_4 = mBoxExtents.y*mAR.m[2][1] + mBoxExtents.z*mAR.m[1][1]; + mBB_5 = mBoxExtents.x*mAR.m[2][1] + mBoxExtents.z*mAR.m[0][1]; + mBB_6 = mBoxExtents.x*mAR.m[1][1] + mBoxExtents.y*mAR.m[0][1]; + mBB_7 = mBoxExtents.y*mAR.m[2][2] + mBoxExtents.z*mAR.m[1][2]; + mBB_8 = mBoxExtents.x*mAR.m[2][2] + mBoxExtents.z*mAR.m[0][2]; + mBB_9 = mBoxExtents.x*mAR.m[1][2] + mBoxExtents.y*mAR.m[0][2]; + + return FALSE; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Checks the OBB completely contains the box. In which case we can end the query sooner. + * \param bc [in] box center + * \param be [in] box extents + * \return true if the OBB contains the whole box + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +inline_ BOOL OBBCollider::OBBContainsBox(const Point& bc, const Point& be) +{ + // I assume if all 8 box vertices are inside the OBB, so does the whole box. + // Sounds ok but maybe there's a better way? +/* +#define TEST_PT(a,b,c) \ + p.x=a; p.y=b; p.z=c; p+=bc; \ + f = p.x * mRModelToBox.m[0][0] + p.y * mRModelToBox.m[1][0] + p.z * mRModelToBox.m[2][0]; if(f>mB0.x || fmB0.y || fmB0.z || f NCx-NEx) return FALSE; + + float NCy = bc.x * mRModelToBox.m[0][1] + bc.y * mRModelToBox.m[1][1] + bc.z * mRModelToBox.m[2][1]; + float NEy = fabsf(mRModelToBox.m[0][1] * be.x) + fabsf(mRModelToBox.m[1][1] * be.y) + fabsf(mRModelToBox.m[2][1] * be.z); + + if(mB0.y < NCy+NEy) return FALSE; + if(mB1.y > NCy-NEy) return FALSE; + + float NCz = bc.x * mRModelToBox.m[0][2] + bc.y * mRModelToBox.m[1][2] + bc.z * mRModelToBox.m[2][2]; + float NEz = fabsf(mRModelToBox.m[0][2] * be.x) + fabsf(mRModelToBox.m[1][2] * be.y) + fabsf(mRModelToBox.m[2][2] * be.z); + + if(mB0.z < NCz+NEz) return FALSE; + if(mB1.z > NCz-NEz) return FALSE; + + return TRUE; +} + +#define TEST_BOX_IN_OBB(center, extents) \ + if(OBBContainsBox(center, extents)) \ + { \ + /* Set contact status */ \ + mFlags |= OPC_CONTACT; \ + _Dump(node); \ + return; \ + } + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for normal AABB trees. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void OBBCollider::_Collide(const AABBCollisionNode* node) +{ + // Perform OBB-AABB overlap test + if(!BoxBoxOverlap(node->mAABB.mExtents, node->mAABB.mCenter)) return; + + TEST_BOX_IN_OBB(node->mAABB.mCenter, node->mAABB.mExtents) + + if(node->IsLeaf()) + { + OBB_PRIM(node->GetPrimitive(), OPC_CONTACT) + } + else + { + _Collide(node->GetPos()); + + if(ContactFound()) return; + + _Collide(node->GetNeg()); + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for normal AABB trees, without primitive tests. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void OBBCollider::_CollideNoPrimitiveTest(const AABBCollisionNode* node) +{ + // Perform OBB-AABB overlap test + if(!BoxBoxOverlap(node->mAABB.mExtents, node->mAABB.mCenter)) return; + + TEST_BOX_IN_OBB(node->mAABB.mCenter, node->mAABB.mExtents) + + if(node->IsLeaf()) + { + SET_CONTACT(node->GetPrimitive(), OPC_CONTACT) + } + else + { + _CollideNoPrimitiveTest(node->GetPos()); + + if(ContactFound()) return; + + _CollideNoPrimitiveTest(node->GetNeg()); + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for quantized AABB trees. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void OBBCollider::_Collide(const AABBQuantizedNode* node) +{ + // Dequantize box + const QuantizedAABB& Box = node->mAABB; + const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); + const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); + + // Perform OBB-AABB overlap test + if(!BoxBoxOverlap(Extents, Center)) return; + + TEST_BOX_IN_OBB(Center, Extents) + + if(node->IsLeaf()) + { + OBB_PRIM(node->GetPrimitive(), OPC_CONTACT) + } + else + { + _Collide(node->GetPos()); + + if(ContactFound()) return; + + _Collide(node->GetNeg()); + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for quantized AABB trees, without primitive tests. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void OBBCollider::_CollideNoPrimitiveTest(const AABBQuantizedNode* node) +{ + // Dequantize box + const QuantizedAABB& Box = node->mAABB; + const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); + const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); + + // Perform OBB-AABB overlap test + if(!BoxBoxOverlap(Extents, Center)) return; + + TEST_BOX_IN_OBB(Center, Extents) + + if(node->IsLeaf()) + { + SET_CONTACT(node->GetPrimitive(), OPC_CONTACT) + } + else + { + _CollideNoPrimitiveTest(node->GetPos()); + + if(ContactFound()) return; + + _CollideNoPrimitiveTest(node->GetNeg()); + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for no-leaf AABB trees. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void OBBCollider::_Collide(const AABBNoLeafNode* node) +{ + // Perform OBB-AABB overlap test + if(!BoxBoxOverlap(node->mAABB.mExtents, node->mAABB.mCenter)) return; + + TEST_BOX_IN_OBB(node->mAABB.mCenter, node->mAABB.mExtents) + + if(node->HasPosLeaf()) { OBB_PRIM(node->GetPosPrimitive(), OPC_CONTACT) } + else _Collide(node->GetPos()); + + if(ContactFound()) return; + + if(node->HasNegLeaf()) { OBB_PRIM(node->GetNegPrimitive(), OPC_CONTACT) } + else _Collide(node->GetNeg()); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for no-leaf AABB trees, without primitive tests. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void OBBCollider::_CollideNoPrimitiveTest(const AABBNoLeafNode* node) +{ + // Perform OBB-AABB overlap test + if(!BoxBoxOverlap(node->mAABB.mExtents, node->mAABB.mCenter)) return; + + TEST_BOX_IN_OBB(node->mAABB.mCenter, node->mAABB.mExtents) + + if(node->HasPosLeaf()) { SET_CONTACT(node->GetPosPrimitive(), OPC_CONTACT) } + else _CollideNoPrimitiveTest(node->GetPos()); + + if(ContactFound()) return; + + if(node->HasNegLeaf()) { SET_CONTACT(node->GetNegPrimitive(), OPC_CONTACT) } + else _CollideNoPrimitiveTest(node->GetNeg()); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for quantized no-leaf AABB trees. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void OBBCollider::_Collide(const AABBQuantizedNoLeafNode* node) +{ + // Dequantize box + const QuantizedAABB& Box = node->mAABB; + const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); + const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); + + // Perform OBB-AABB overlap test + if(!BoxBoxOverlap(Extents, Center)) return; + + TEST_BOX_IN_OBB(Center, Extents) + + if(node->HasPosLeaf()) { OBB_PRIM(node->GetPosPrimitive(), OPC_CONTACT) } + else _Collide(node->GetPos()); + + if(ContactFound()) return; + + if(node->HasNegLeaf()) { OBB_PRIM(node->GetNegPrimitive(), OPC_CONTACT) } + else _Collide(node->GetNeg()); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for quantized no-leaf AABB trees, without primitive tests. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void OBBCollider::_CollideNoPrimitiveTest(const AABBQuantizedNoLeafNode* node) +{ + // Dequantize box + const QuantizedAABB& Box = node->mAABB; + const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); + const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); + + // Perform OBB-AABB overlap test + if(!BoxBoxOverlap(Extents, Center)) return; + + TEST_BOX_IN_OBB(Center, Extents) + + if(node->HasPosLeaf()) { SET_CONTACT(node->GetPosPrimitive(), OPC_CONTACT) } + else _CollideNoPrimitiveTest(node->GetPos()); + + if(ContactFound()) return; + + if(node->HasNegLeaf()) { SET_CONTACT(node->GetNegPrimitive(), OPC_CONTACT) } + else _CollideNoPrimitiveTest(node->GetNeg()); +} + + + + + + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Constructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +HybridOBBCollider::HybridOBBCollider() +{ +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Destructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +HybridOBBCollider::~HybridOBBCollider() +{ +} + +bool HybridOBBCollider::Collide(OBBCache& cache, const OBB& box, const HybridModel& model, const Matrix4x4* worldb, const Matrix4x4* worldm) +{ + // We don't want primitive tests here! + mFlags |= OPC_NO_PRIMITIVE_TESTS; + + // Checkings + if(!Setup(&model)) return false; + + // Init collision query + if(InitQuery(cache, box, worldb, worldm)) return true; + + // Special case for 1-leaf trees + if(mCurrentModel && mCurrentModel->HasSingleNode()) + { + // Here we're supposed to perform a normal query, except our tree has a single node, i.e. just a few triangles + udword Nb = mIMesh->GetNbTriangles(); + + // Loop through all triangles + for(udword i=0;imCenterCoeff; + mExtentsCoeff = Tree->mExtentsCoeff; + + // Perform collision query - we don't want primitive tests here! + _CollideNoPrimitiveTest(Tree->GetNodes()); + } + else + { + const AABBNoLeafTree* Tree = (const AABBNoLeafTree*)model.GetTree(); + + // Perform collision query - we don't want primitive tests here! + _CollideNoPrimitiveTest(Tree->GetNodes()); + } + } + else + { + if(model.IsQuantized()) + { + const AABBQuantizedTree* Tree = (const AABBQuantizedTree*)model.GetTree(); + + // Setup dequantization coeffs + mCenterCoeff = Tree->mCenterCoeff; + mExtentsCoeff = Tree->mExtentsCoeff; + + // Perform collision query - we don't want primitive tests here! + _CollideNoPrimitiveTest(Tree->GetNodes()); + } + else + { + const AABBCollisionTree* Tree = (const AABBCollisionTree*)model.GetTree(); + + // Perform collision query - we don't want primitive tests here! + _CollideNoPrimitiveTest(Tree->GetNodes()); + } + } + + // We only have a list of boxes so far + if(GetContactStatus()) + { + // Reset contact status, since it currently only reflects collisions with leaf boxes + Collider::InitQuery(); + + // Change dest container so that we can use built-in overlap tests and get collided primitives + cache.TouchedPrimitives.Reset(); + mTouchedPrimitives = &cache.TouchedPrimitives; + + // Read touched leaf boxes + udword Nb = mTouchedBoxes.GetNbEntries(); + const udword* Touched = mTouchedBoxes.GetEntries(); + + const LeafTriangles* LT = model.GetLeafTriangles(); + const udword* Indices = model.GetIndices(); + + // Loop through touched leaves + while(Nb--) + { + const LeafTriangles& CurrentLeaf = LT[*Touched++]; + + // Each leaf box has a set of triangles + udword NbTris = CurrentLeaf.GetNbTriangles(); + if(Indices) + { + const udword* T = &Indices[CurrentLeaf.GetTriangleIndex()]; + + // Loop through triangles and test each of them + while(NbTris--) + { + udword TriangleIndex = *T++; + OBB_PRIM(TriangleIndex, OPC_CONTACT) + } + } + else + { + udword BaseIndex = CurrentLeaf.GetTriangleIndex(); + + // Loop through triangles and test each of them + while(NbTris--) + { + udword TriangleIndex = BaseIndex++; + OBB_PRIM(TriangleIndex, OPC_CONTACT) + } + } + } + } + + return true; +} diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_OBBCollider.h b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_OBBCollider.h new file mode 100644 index 00000000..58272cd2 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_OBBCollider.h @@ -0,0 +1,151 @@ +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code for an OBB collider. + * \file OPC_OBBCollider.h + * \author Pierre Terdiman + * \date January, 1st, 2002 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef __OPC_OBBCOLLIDER_H__ +#define __OPC_OBBCOLLIDER_H__ + + struct OPCODE_API OBBCache : VolumeCache + { + OBBCache() : FatCoeff(1.1f) + { + FatBox.mCenter.Zero(); + FatBox.mExtents.Zero(); + FatBox.mRot.Identity(); + } + + // Cached faces signature + OBB FatBox; //!< Box used when performing the query resulting in cached faces + // User settings + float FatCoeff; //!< extents multiplier used to create a fat box + }; + + class OPCODE_API OBBCollider : public VolumeCollider + { + public: + // Constructor / Destructor + OBBCollider(); + virtual ~OBBCollider(); + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Generic collision query for generic OPCODE models. After the call, access the results: + * - with GetContactStatus() + * - with GetNbTouchedPrimitives() + * - with GetTouchedPrimitives() + * + * \param cache [in/out] a box cache + * \param box [in] collision OBB in local space + * \param model [in] Opcode model to collide with + * \param worldb [in] OBB's world matrix, or null + * \param worldm [in] model's world matrix, or null + * \return true if success + * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only. + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + bool Collide(OBBCache& cache, const OBB& box, const Model& model, const Matrix4x4* worldb=null, const Matrix4x4* worldm=null); + + // Settings + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Settings: select between full box-box tests or "SAT-lite" tests (where Class III axes are discarded) + * \param flag [in] true for full tests, false for coarse tests + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ void SetFullBoxBoxTest(bool flag) { mFullBoxBoxTest = flag; } + + // Settings + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Validates current settings. You should call this method after all the settings and callbacks have been defined for a collider. + * \return null if everything is ok, else a string describing the problem + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + override(Collider) const char* ValidateSettings(); + + protected: + // Precomputed data + Matrix3x3 mAR; //!< Absolute rotation matrix + Matrix3x3 mRModelToBox; //!< Rotation from model space to obb space + Matrix3x3 mRBoxToModel; //!< Rotation from obb space to model space + Point mTModelToBox; //!< Translation from model space to obb space + Point mTBoxToModel; //!< Translation from obb space to model space + + Point mBoxExtents; + Point mB0; //!< - mTModelToBox + mBoxExtents + Point mB1; //!< - mTModelToBox - mBoxExtents + + float mBBx1; + float mBBy1; + float mBBz1; + + float mBB_1; + float mBB_2; + float mBB_3; + float mBB_4; + float mBB_5; + float mBB_6; + float mBB_7; + float mBB_8; + float mBB_9; + + // Leaf description + Point mLeafVerts[3]; //!< Triangle vertices + // Settings + bool mFullBoxBoxTest; //!< Perform full BV-BV tests (true) or SAT-lite tests (false) + // Internal methods + void _Collide(const AABBCollisionNode* node); + void _Collide(const AABBNoLeafNode* node); + void _Collide(const AABBQuantizedNode* node); + void _Collide(const AABBQuantizedNoLeafNode* node); + void _CollideNoPrimitiveTest(const AABBCollisionNode* node); + void _CollideNoPrimitiveTest(const AABBNoLeafNode* node); + void _CollideNoPrimitiveTest(const AABBQuantizedNode* node); + void _CollideNoPrimitiveTest(const AABBQuantizedNoLeafNode* node); + // Overlap tests + inline_ BOOL OBBContainsBox(const Point& bc, const Point& be); + inline_ BOOL BoxBoxOverlap(const Point& extents, const Point& center); + inline_ BOOL TriBoxOverlap(); + // Init methods + BOOL InitQuery(OBBCache& cache, const OBB& box, const Matrix4x4* worldb=null, const Matrix4x4* worldm=null); + }; + + class OPCODE_API HybridOBBCollider : public OBBCollider + { + public: + // Constructor / Destructor + HybridOBBCollider(); + virtual ~HybridOBBCollider(); + + bool Collide(OBBCache& cache, const OBB& box, const HybridModel& model, const Matrix4x4* worldb=null, const Matrix4x4* worldm=null); + protected: + Container mTouchedBoxes; + }; + +#endif // __OPC_OBBCOLLIDER_H__ diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_OptimizedTree.cpp b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_OptimizedTree.cpp new file mode 100644 index 00000000..59eb5622 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_OptimizedTree.cpp @@ -0,0 +1,791 @@ +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code for optimized trees. Implements 4 trees: + * - normal + * - no leaf + * - quantized + * - no leaf / quantized + * + * \file OPC_OptimizedTree.cpp + * \author Pierre Terdiman + * \date March, 20, 2001 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * A standard AABB tree. + * + * \class AABBCollisionTree + * \author Pierre Terdiman + * \version 1.3 + * \date March, 20, 2001 +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * A no-leaf AABB tree. + * + * \class AABBNoLeafTree + * \author Pierre Terdiman + * \version 1.3 + * \date March, 20, 2001 +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * A quantized AABB tree. + * + * \class AABBQuantizedTree + * \author Pierre Terdiman + * \version 1.3 + * \date March, 20, 2001 +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * A quantized no-leaf AABB tree. + * + * \class AABBQuantizedNoLeafTree + * \author Pierre Terdiman + * \version 1.3 + * \date March, 20, 2001 +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Precompiled Header +#include "Stdafx.h" + +using namespace Opcode; + +//! Compilation flag: +//! - true to fix quantized boxes (i.e. make sure they enclose the original ones) +//! - false to see the effects of quantization errors (faster, but wrong results in some cases) +static bool gFixQuantized = true; + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Builds an implicit tree from a standard one. An implicit tree is a complete tree (2*N-1 nodes) whose negative + * box pointers and primitive pointers have been made implicit, hence packing 3 pointers in one. + * + * Layout for implicit trees: + * Node: + * - box + * - data (32-bits value) + * + * if data's LSB = 1 => remaining bits are a primitive pointer + * else remaining bits are a P-node pointer, and N = P + 1 + * + * \relates AABBCollisionNode + * \fn _BuildCollisionTree(AABBCollisionNode* linear, const udword box_id, udword& current_id, const AABBTreeNode* current_node) + * \param linear [in] base address of destination nodes + * \param box_id [in] index of destination node + * \param current_id [in] current running index + * \param current_node [in] current node from input tree + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +static void _BuildCollisionTree(AABBCollisionNode* linear, const udword box_id, udword& current_id, const AABBTreeNode* current_node) +{ + // Current node from input tree is "current_node". Must be flattened into "linear[boxid]". + + // Store the AABB + current_node->GetAABB()->GetCenter(linear[box_id].mAABB.mCenter); + current_node->GetAABB()->GetExtents(linear[box_id].mAABB.mExtents); + // Store remaining info + if(current_node->IsLeaf()) + { + // The input tree must be complete => i.e. one primitive/leaf + ASSERT(current_node->GetNbPrimitives()==1); + // Get the primitive index from the input tree + udword PrimitiveIndex = current_node->GetPrimitives()[0]; + // Setup box data as the primitive index, marked as leaf + linear[box_id].mData = (PrimitiveIndex<<1)|1; + } + else + { + // To make the negative one implicit, we must store P and N in successive order + udword PosID = current_id++; // Get a new id for positive child + udword NegID = current_id++; // Get a new id for negative child + // Setup box data as the forthcoming new P pointer + linear[box_id].mData = (udword)&linear[PosID]; + // Make sure it's not marked as leaf + ASSERT(!(linear[box_id].mData&1)); + // Recurse with new IDs + _BuildCollisionTree(linear, PosID, current_id, current_node->GetPos()); + _BuildCollisionTree(linear, NegID, current_id, current_node->GetNeg()); + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Builds a "no-leaf" tree from a standard one. This is a tree whose leaf nodes have been removed. + * + * Layout for no-leaf trees: + * + * Node: + * - box + * - P pointer => a node (LSB=0) or a primitive (LSB=1) + * - N pointer => a node (LSB=0) or a primitive (LSB=1) + * + * \relates AABBNoLeafNode + * \fn _BuildNoLeafTree(AABBNoLeafNode* linear, const udword box_id, udword& current_id, const AABBTreeNode* current_node) + * \param linear [in] base address of destination nodes + * \param box_id [in] index of destination node + * \param current_id [in] current running index + * \param current_node [in] current node from input tree + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +static void _BuildNoLeafTree(AABBNoLeafNode* linear, const udword box_id, udword& current_id, const AABBTreeNode* current_node) +{ + const AABBTreeNode* P = current_node->GetPos(); + const AABBTreeNode* N = current_node->GetNeg(); + // Leaf nodes here?! + ASSERT(P); + ASSERT(N); + // Internal node => keep the box + current_node->GetAABB()->GetCenter(linear[box_id].mAABB.mCenter); + current_node->GetAABB()->GetExtents(linear[box_id].mAABB.mExtents); + + if(P->IsLeaf()) + { + // The input tree must be complete => i.e. one primitive/leaf + ASSERT(P->GetNbPrimitives()==1); + // Get the primitive index from the input tree + udword PrimitiveIndex = P->GetPrimitives()[0]; + // Setup prev box data as the primitive index, marked as leaf + linear[box_id].mPosData = (PrimitiveIndex<<1)|1; + } + else + { + // Get a new id for positive child + udword PosID = current_id++; + // Setup box data + linear[box_id].mPosData = (udword)&linear[PosID]; + // Make sure it's not marked as leaf + ASSERT(!(linear[box_id].mPosData&1)); + // Recurse + _BuildNoLeafTree(linear, PosID, current_id, P); + } + + if(N->IsLeaf()) + { + // The input tree must be complete => i.e. one primitive/leaf + ASSERT(N->GetNbPrimitives()==1); + // Get the primitive index from the input tree + udword PrimitiveIndex = N->GetPrimitives()[0]; + // Setup prev box data as the primitive index, marked as leaf + linear[box_id].mNegData = (PrimitiveIndex<<1)|1; + } + else + { + // Get a new id for negative child + udword NegID = current_id++; + // Setup box data + linear[box_id].mNegData = (udword)&linear[NegID]; + // Make sure it's not marked as leaf + ASSERT(!(linear[box_id].mNegData&1)); + // Recurse + _BuildNoLeafTree(linear, NegID, current_id, N); + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Constructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +AABBCollisionTree::AABBCollisionTree() : mNodes(null) +{ +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Destructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +AABBCollisionTree::~AABBCollisionTree() +{ + DELETEARRAY(mNodes); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Builds the collision tree from a generic AABB tree. + * \param tree [in] generic AABB tree + * \return true if success + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool AABBCollisionTree::Build(AABBTree* tree) +{ + // Checkings + if(!tree) return false; + // Check the input tree is complete + udword NbTriangles = tree->GetNbPrimitives(); + udword NbNodes = tree->GetNbNodes(); + if(NbNodes!=NbTriangles*2-1) return false; + + // Get nodes + if(mNbNodes!=NbNodes) // Same number of nodes => keep moving + { + mNbNodes = NbNodes; + DELETEARRAY(mNodes); + mNodes = new AABBCollisionNode[mNbNodes]; + CHECKALLOC(mNodes); + } + + // Build the tree + udword CurID = 1; + _BuildCollisionTree(mNodes, 0, CurID, tree); + ASSERT(CurID==mNbNodes); + + return true; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Refits the collision tree after vertices have been modified. + * \param mesh_interface [in] mesh interface for current model + * \return true if success + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool AABBCollisionTree::Refit(const MeshInterface* mesh_interface) +{ + ASSERT(!"Not implemented since AABBCollisionTrees have twice as more nodes to refit as AABBNoLeafTrees!"); + return false; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Walks the tree and call the user back for each node. + * \param callback [in] walking callback + * \param user_data [in] callback's user data + * \return true if success + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool AABBCollisionTree::Walk(GenericWalkingCallback callback, void* user_data) const +{ + if(!callback) return false; + + struct Local + { + static void _Walk(const AABBCollisionNode* current_node, GenericWalkingCallback callback, void* user_data) + { + if(!current_node || !(callback)(current_node, user_data)) return; + + if(!current_node->IsLeaf()) + { + _Walk(current_node->GetPos(), callback, user_data); + _Walk(current_node->GetNeg(), callback, user_data); + } + } + }; + Local::_Walk(mNodes, callback, user_data); + return true; +} + + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Constructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +AABBNoLeafTree::AABBNoLeafTree() : mNodes(null) +{ +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Destructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +AABBNoLeafTree::~AABBNoLeafTree() +{ + DELETEARRAY(mNodes); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Builds the collision tree from a generic AABB tree. + * \param tree [in] generic AABB tree + * \return true if success + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool AABBNoLeafTree::Build(AABBTree* tree) +{ + // Checkings + if(!tree) return false; + // Check the input tree is complete + udword NbTriangles = tree->GetNbPrimitives(); + udword NbNodes = tree->GetNbNodes(); + if(NbNodes!=NbTriangles*2-1) return false; + + // Get nodes + if(mNbNodes!=NbTriangles-1) // Same number of nodes => keep moving + { + mNbNodes = NbTriangles-1; + DELETEARRAY(mNodes); + mNodes = new AABBNoLeafNode[mNbNodes]; + CHECKALLOC(mNodes); + } + + // Build the tree + udword CurID = 1; + _BuildNoLeafTree(mNodes, 0, CurID, tree); + ASSERT(CurID==mNbNodes); + + return true; +} + +inline_ void ComputeMinMax_OT(Point& min, Point& max, const VertexPointers& vp) +{ + // Compute triangle's AABB = a leaf box +#ifdef OPC_USE_FCOMI // a 15% speedup on my machine, not much + min.x = FCMin3(vp.Vertex[0]->x, vp.Vertex[1]->x, vp.Vertex[2]->x); + max.x = FCMax3(vp.Vertex[0]->x, vp.Vertex[1]->x, vp.Vertex[2]->x); + + min.y = FCMin3(vp.Vertex[0]->y, vp.Vertex[1]->y, vp.Vertex[2]->y); + max.y = FCMax3(vp.Vertex[0]->y, vp.Vertex[1]->y, vp.Vertex[2]->y); + + min.z = FCMin3(vp.Vertex[0]->z, vp.Vertex[1]->z, vp.Vertex[2]->z); + max.z = FCMax3(vp.Vertex[0]->z, vp.Vertex[1]->z, vp.Vertex[2]->z); +#else + min = *vp.Vertex[0]; + max = *vp.Vertex[0]; + min.Min(*vp.Vertex[1]); + max.Max(*vp.Vertex[1]); + min.Min(*vp.Vertex[2]); + max.Max(*vp.Vertex[2]); +#endif +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Refits the collision tree after vertices have been modified. + * \param mesh_interface [in] mesh interface for current model + * \return true if success + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool AABBNoLeafTree::Refit(const MeshInterface* mesh_interface) +{ + // Checkings + if(!mesh_interface) return false; + + // Bottom-up update + VertexPointers VP; + Point Min,Max; + Point Min_,Max_; + udword Index = mNbNodes; + while(Index--) + { + AABBNoLeafNode& Current = mNodes[Index]; + + if(Current.HasPosLeaf()) + { + mesh_interface->GetTriangle(VP, Current.GetPosPrimitive()); + ComputeMinMax_OT(Min, Max, VP); + } + else + { + const CollisionAABB& CurrentBox = Current.GetPos()->mAABB; + CurrentBox.GetMin(Min); + CurrentBox.GetMax(Max); + } + + if(Current.HasNegLeaf()) + { + mesh_interface->GetTriangle(VP, Current.GetNegPrimitive()); + ComputeMinMax_OT(Min_, Max_, VP); + } + else + { + const CollisionAABB& CurrentBox = Current.GetNeg()->mAABB; + CurrentBox.GetMin(Min_); + CurrentBox.GetMax(Max_); + } +#ifdef OPC_USE_FCOMI + Min.x = FCMin2(Min.x, Min_.x); + Max.x = FCMax2(Max.x, Max_.x); + Min.y = FCMin2(Min.y, Min_.y); + Max.y = FCMax2(Max.y, Max_.y); + Min.z = FCMin2(Min.z, Min_.z); + Max.z = FCMax2(Max.z, Max_.z); +#else + Min.Min(Min_); + Max.Max(Max_); +#endif + Current.mAABB.SetMinMax(Min, Max); + } + return true; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Walks the tree and call the user back for each node. + * \param callback [in] walking callback + * \param user_data [in] callback's user data + * \return true if success + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool AABBNoLeafTree::Walk(GenericWalkingCallback callback, void* user_data) const +{ + if(!callback) return false; + + struct Local + { + static void _Walk(const AABBNoLeafNode* current_node, GenericWalkingCallback callback, void* user_data) + { + if(!current_node || !(callback)(current_node, user_data)) return; + + if(!current_node->HasPosLeaf()) _Walk(current_node->GetPos(), callback, user_data); + if(!current_node->HasNegLeaf()) _Walk(current_node->GetNeg(), callback, user_data); + } + }; + Local::_Walk(mNodes, callback, user_data); + return true; +} + +// Quantization notes: +// - We could use the highest bits of mData to store some more quantized bits. Dequantization code +// would be slightly more complex, but number of overlap tests would be reduced (and anyhow those +// bits are currently wasted). Of course it's not possible if we move to 16 bits mData. +// - Something like "16 bits floats" could be tested, to bypass the int-to-float conversion. +// - A dedicated BV-BV test could be used, dequantizing while testing for overlap. (i.e. it's some +// lazy-dequantization which may save some work in case of early exits). At the very least some +// muls could be saved by precomputing several more matrices. But maybe not worth the pain. +// - Do we need to dequantize anyway? Not doing the extents-related muls only implies the box has +// been scaled, for example. +// - The deeper we move into the hierarchy, the smaller the extents should be. May not need a fixed +// number of quantization bits. Even better, could probably be best delta-encoded. + + +// Find max values. Some people asked why I wasn't simply using the first node. Well, I can't. +// I'm not looking for (min, max) values like in a standard AABB, I'm looking for the extremal +// centers/extents in order to quantize them. The first node would only give a single center and +// a single extents. While extents would be the biggest, the center wouldn't. +#define FIND_MAX_VALUES \ + /* Get max values */ \ + Point CMax(MIN_FLOAT, MIN_FLOAT, MIN_FLOAT); \ + Point EMax(MIN_FLOAT, MIN_FLOAT, MIN_FLOAT); \ + for(udword i=0;iCMax.x) CMax.x = fabsf(Nodes[i].mAABB.mCenter.x); \ + if(fabsf(Nodes[i].mAABB.mCenter.y)>CMax.y) CMax.y = fabsf(Nodes[i].mAABB.mCenter.y); \ + if(fabsf(Nodes[i].mAABB.mCenter.z)>CMax.z) CMax.z = fabsf(Nodes[i].mAABB.mCenter.z); \ + if(fabsf(Nodes[i].mAABB.mExtents.x)>EMax.x) EMax.x = fabsf(Nodes[i].mAABB.mExtents.x); \ + if(fabsf(Nodes[i].mAABB.mExtents.y)>EMax.y) EMax.y = fabsf(Nodes[i].mAABB.mExtents.y); \ + if(fabsf(Nodes[i].mAABB.mExtents.z)>EMax.z) EMax.z = fabsf(Nodes[i].mAABB.mExtents.z); \ + } + +#define INIT_QUANTIZATION \ + udword nbc=15; /* Keep one bit for sign */ \ + udword nbe=15; /* Keep one bit for fix */ \ + if(!gFixQuantized) nbe++; \ + \ + /* Compute quantization coeffs */ \ + Point CQuantCoeff, EQuantCoeff; \ + CQuantCoeff.x = CMax.x!=0.0f ? float((1<Min[j]) mNodes[i].mAABB.mExtents[j]++; \ + else FixMe=false; \ + /* Prevent wrapping */ \ + if(!mNodes[i].mAABB.mExtents[j]) \ + { \ + mNodes[i].mAABB.mExtents[j]=0xffff; \ + FixMe=false; \ + } \ + }while(FixMe); \ + } \ + } + +#define REMAP_DATA(member) \ + /* Fix data */ \ + Data = Nodes[i].member; \ + if(!(Data&1)) \ + { \ + /* Compute box number */ \ + udword Nb = (Data - udword(Nodes))/Nodes[i].GetNodeSize(); \ + Data = udword(&mNodes[Nb]); \ + } \ + /* ...remapped */ \ + mNodes[i].member = Data; + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Constructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +AABBQuantizedTree::AABBQuantizedTree() : mNodes(null) +{ +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Destructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +AABBQuantizedTree::~AABBQuantizedTree() +{ + DELETEARRAY(mNodes); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Builds the collision tree from a generic AABB tree. + * \param tree [in] generic AABB tree + * \return true if success + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool AABBQuantizedTree::Build(AABBTree* tree) +{ + // Checkings + if(!tree) return false; + // Check the input tree is complete + udword NbTriangles = tree->GetNbPrimitives(); + udword NbNodes = tree->GetNbNodes(); + if(NbNodes!=NbTriangles*2-1) return false; + + // Get nodes + mNbNodes = NbNodes; + DELETEARRAY(mNodes); + AABBCollisionNode* Nodes = new AABBCollisionNode[mNbNodes]; + CHECKALLOC(Nodes); + + // Build the tree + udword CurID = 1; + _BuildCollisionTree(Nodes, 0, CurID, tree); + + // Quantize + { + mNodes = new AABBQuantizedNode[mNbNodes]; + CHECKALLOC(mNodes); + + // Get max values + FIND_MAX_VALUES + + // Quantization + INIT_QUANTIZATION + + // Quantize + udword Data; + for(udword i=0;iIsLeaf()) + { + _Walk(current_node->GetPos(), callback, user_data); + _Walk(current_node->GetNeg(), callback, user_data); + } + } + }; + Local::_Walk(mNodes, callback, user_data); + return true; +} + + + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Constructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +AABBQuantizedNoLeafTree::AABBQuantizedNoLeafTree() : mNodes(null) +{ +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Destructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +AABBQuantizedNoLeafTree::~AABBQuantizedNoLeafTree() +{ + DELETEARRAY(mNodes); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Builds the collision tree from a generic AABB tree. + * \param tree [in] generic AABB tree + * \return true if success + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool AABBQuantizedNoLeafTree::Build(AABBTree* tree) +{ + // Checkings + if(!tree) return false; + // Check the input tree is complete + udword NbTriangles = tree->GetNbPrimitives(); + udword NbNodes = tree->GetNbNodes(); + if(NbNodes!=NbTriangles*2-1) return false; + + // Get nodes + mNbNodes = NbTriangles-1; + DELETEARRAY(mNodes); + AABBNoLeafNode* Nodes = new AABBNoLeafNode[mNbNodes]; + CHECKALLOC(Nodes); + + // Build the tree + udword CurID = 1; + _BuildNoLeafTree(Nodes, 0, CurID, tree); + ASSERT(CurID==mNbNodes); + + // Quantize + { + mNodes = new AABBQuantizedNoLeafNode[mNbNodes]; + CHECKALLOC(mNodes); + + // Get max values + FIND_MAX_VALUES + + // Quantization + INIT_QUANTIZATION + + // Quantize + udword Data; + for(udword i=0;iHasPosLeaf()) _Walk(current_node->GetPos(), callback, user_data); + if(!current_node->HasNegLeaf()) _Walk(current_node->GetNeg(), callback, user_data); + } + }; + Local::_Walk(mNodes, callback, user_data); + return true; +} diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_OptimizedTree.h b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_OptimizedTree.h new file mode 100644 index 00000000..e25db74a --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_OptimizedTree.h @@ -0,0 +1,215 @@ +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code for optimized trees. + * \file OPC_OptimizedTree.h + * \author Pierre Terdiman + * \date March, 20, 2001 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef __OPC_OPTIMIZEDTREE_H__ +#define __OPC_OPTIMIZEDTREE_H__ + + //! Common interface for a node of an implicit tree + #define IMPLEMENT_IMPLICIT_NODE(base_class, volume) \ + public: \ + /* Constructor / Destructor */ \ + inline_ base_class() : mData(0) {} \ + inline_ ~base_class() {} \ + /* Leaf test */ \ + inline_ BOOL IsLeaf() const { return mData&1; } \ + /* Data access */ \ + inline_ const base_class* GetPos() const { return (base_class*)mData; } \ + inline_ const base_class* GetNeg() const { return ((base_class*)mData)+1; } \ + inline_ udword GetPrimitive() const { return (mData>>1); } \ + /* Stats */ \ + inline_ udword GetNodeSize() const { return SIZEOFOBJECT; } \ + \ + volume mAABB; \ + udword mData; + + //! Common interface for a node of a no-leaf tree + #define IMPLEMENT_NOLEAF_NODE(base_class, volume) \ + public: \ + /* Constructor / Destructor */ \ + inline_ base_class() : mPosData(0), mNegData(0) {} \ + inline_ ~base_class() {} \ + /* Leaf tests */ \ + inline_ BOOL HasPosLeaf() const { return mPosData&1; } \ + inline_ BOOL HasNegLeaf() const { return mNegData&1; } \ + /* Data access */ \ + inline_ const base_class* GetPos() const { return (base_class*)mPosData; } \ + inline_ const base_class* GetNeg() const { return (base_class*)mNegData; } \ + inline_ udword GetPosPrimitive() const { return (mPosData>>1); } \ + inline_ udword GetNegPrimitive() const { return (mNegData>>1); } \ + /* Stats */ \ + inline_ udword GetNodeSize() const { return SIZEOFOBJECT; } \ + \ + volume mAABB; \ + udword mPosData; \ + udword mNegData; + + class OPCODE_API AABBCollisionNode + { + IMPLEMENT_IMPLICIT_NODE(AABBCollisionNode, CollisionAABB) + + inline_ float GetVolume() const { return mAABB.mExtents.x * mAABB.mExtents.y * mAABB.mExtents.z; } + inline_ float GetSize() const { return mAABB.mExtents.SquareMagnitude(); } + inline_ udword GetRadius() const + { + udword* Bits = (udword*)&mAABB.mExtents.x; + udword Max = Bits[0]; + if(Bits[1]>Max) Max = Bits[1]; + if(Bits[2]>Max) Max = Bits[2]; + return Max; + } + + // NB: using the square-magnitude or the true volume of the box, seems to yield better results + // (assuming UNC-like informed traversal methods). I borrowed this idea from PQP. The usual "size" + // otherwise, is the largest box extent. In SOLID that extent is computed on-the-fly each time it's + // needed (the best approach IMHO). In RAPID the rotation matrix is permuted so that Extent[0] is + // always the greatest, which saves looking for it at runtime. On the other hand, it yields matrices + // whose determinant is not 1, i.e. you can't encode them anymore as unit quaternions. Not a very + // good strategy. + }; + + class OPCODE_API AABBQuantizedNode + { + IMPLEMENT_IMPLICIT_NODE(AABBQuantizedNode, QuantizedAABB) + + inline_ uword GetSize() const + { + const uword* Bits = mAABB.mExtents; + uword Max = Bits[0]; + if(Bits[1]>Max) Max = Bits[1]; + if(Bits[2]>Max) Max = Bits[2]; + return Max; + } + // NB: for quantized nodes I don't feel like computing a square-magnitude with integers all + // over the place.......! + }; + + class OPCODE_API AABBNoLeafNode + { + IMPLEMENT_NOLEAF_NODE(AABBNoLeafNode, CollisionAABB) + }; + + class OPCODE_API AABBQuantizedNoLeafNode + { + IMPLEMENT_NOLEAF_NODE(AABBQuantizedNoLeafNode, QuantizedAABB) + }; + + //! Common interface for a collision tree + #define IMPLEMENT_COLLISION_TREE(base_class, node) \ + public: \ + /* Constructor / Destructor */ \ + base_class(); \ + virtual ~base_class(); \ + /* Builds from a standard tree */ \ + override(AABBOptimizedTree) bool Build(AABBTree* tree); \ + /* Refits the tree */ \ + override(AABBOptimizedTree) bool Refit(const MeshInterface* mesh_interface); \ + /* Walks the tree */ \ + override(AABBOptimizedTree) bool Walk(GenericWalkingCallback callback, void* user_data) const; \ + /* Data access */ \ + inline_ const node* GetNodes() const { return mNodes; } \ + /* Stats */ \ + override(AABBOptimizedTree) udword GetUsedBytes() const { return mNbNodes*sizeof(node); } \ + private: \ + node* mNodes; + + typedef bool (*GenericWalkingCallback) (const void* current, void* user_data); + + class OPCODE_API AABBOptimizedTree + { + public: + // Constructor / Destructor + AABBOptimizedTree() : + mNbNodes (0) + {} + virtual ~AABBOptimizedTree() {} + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Builds the collision tree from a generic AABB tree. + * \param tree [in] generic AABB tree + * \return true if success + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + virtual bool Build(AABBTree* tree) = 0; + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Refits the collision tree after vertices have been modified. + * \param mesh_interface [in] mesh interface for current model + * \return true if success + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + virtual bool Refit(const MeshInterface* mesh_interface) = 0; + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Walks the tree and call the user back for each node. + * \param callback [in] walking callback + * \param user_data [in] callback's user data + * \return true if success + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + virtual bool Walk(GenericWalkingCallback callback, void* user_data) const = 0; + + // Data access + virtual udword GetUsedBytes() const = 0; + inline_ udword GetNbNodes() const { return mNbNodes; } + + protected: + udword mNbNodes; + }; + + class OPCODE_API AABBCollisionTree : public AABBOptimizedTree + { + IMPLEMENT_COLLISION_TREE(AABBCollisionTree, AABBCollisionNode) + }; + + class OPCODE_API AABBNoLeafTree : public AABBOptimizedTree + { + IMPLEMENT_COLLISION_TREE(AABBNoLeafTree, AABBNoLeafNode) + }; + + class OPCODE_API AABBQuantizedTree : public AABBOptimizedTree + { + IMPLEMENT_COLLISION_TREE(AABBQuantizedTree, AABBQuantizedNode) + + public: + Point mCenterCoeff; + Point mExtentsCoeff; + }; + + class OPCODE_API AABBQuantizedNoLeafTree : public AABBOptimizedTree + { + IMPLEMENT_COLLISION_TREE(AABBQuantizedNoLeafTree, AABBQuantizedNoLeafNode) + + public: + Point mCenterCoeff; + Point mExtentsCoeff; + }; + +#endif // __OPC_OPTIMIZEDTREE_H__ diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_Picking.cpp b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_Picking.cpp new file mode 100644 index 00000000..02a9ed70 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_Picking.cpp @@ -0,0 +1,191 @@ +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code to perform "picking". + * \file OPC_Picking.cpp + * \author Pierre Terdiman + * \date March, 20, 2001 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Precompiled Header +#include "Stdafx.h" + +using namespace Opcode; + +#ifdef OPC_RAYHIT_CALLBACK + +/* + Possible RayCollider usages: + - boolean query (shadow feeler) + - closest hit + - all hits + - number of intersection (boolean) + +*/ + +bool Opcode::SetupAllHits(RayCollider& collider, CollisionFaces& contacts) +{ + struct Local + { + static void AllContacts(const CollisionFace& hit, void* user_data) + { + CollisionFaces* CF = (CollisionFaces*)user_data; + CF->AddFace(hit); + } + }; + + collider.SetFirstContact(false); + collider.SetHitCallback(Local::AllContacts); + collider.SetUserData(&contacts); + return true; +} + +bool Opcode::SetupClosestHit(RayCollider& collider, CollisionFace& closest_contact) +{ + struct Local + { + static void ClosestContact(const CollisionFace& hit, void* user_data) + { + CollisionFace* CF = (CollisionFace*)user_data; + if(hit.mDistancemDistance) *CF = hit; + } + }; + + collider.SetFirstContact(false); + collider.SetHitCallback(Local::ClosestContact); + collider.SetUserData(&closest_contact); + closest_contact.mDistance = MAX_FLOAT; + return true; +} + +bool Opcode::SetupShadowFeeler(RayCollider& collider) +{ + collider.SetFirstContact(true); + collider.SetHitCallback(null); + return true; +} + +bool Opcode::SetupInOutTest(RayCollider& collider) +{ + collider.SetFirstContact(false); + collider.SetHitCallback(null); + // Results with collider.GetNbIntersections() + return true; +} + +bool Opcode::Picking( +CollisionFace& picked_face, +const Ray& world_ray, const Model& model, const Matrix4x4* world, +float min_dist, float max_dist, const Point& view_point, CullModeCallback callback, void* user_data) +{ + struct Local + { + struct CullData + { + CollisionFace* Closest; + float MinLimit; + CullModeCallback Callback; + void* UserData; + Point ViewPoint; + const MeshInterface* IMesh; + }; + + // Called for each stabbed face + static void RenderCullingCallback(const CollisionFace& hit, void* user_data) + { + CullData* Data = (CullData*)user_data; + + // Discard face if we already have a closer hit + if(hit.mDistance>=Data->Closest->mDistance) return; + + // Discard face if hit point is smaller than min limit. This mainly happens when the face is in front + // of the near clip plane (or straddles it). If we keep the face nonetheless, the user can select an + // object that he may not even be able to see, which is very annoying. + if(hit.mDistance<=Data->MinLimit) return; + + // This is the index of currently stabbed triangle. + udword StabbedFaceIndex = hit.mFaceID; + + // We may keep it or not, depending on backface culling + bool KeepIt = true; + + // Catch *render* cull mode for this face + CullMode CM = (Data->Callback)(StabbedFaceIndex, Data->UserData); + + if(CM!=CULLMODE_NONE) // Don't even compute culling for double-sided triangles + { + // Compute backface culling for current face + + VertexPointers VP; + Data->IMesh->GetTriangle(VP, StabbedFaceIndex); + if(VP.BackfaceCulling(Data->ViewPoint)) + { + if(CM==CULLMODE_CW) KeepIt = false; + } + else + { + if(CM==CULLMODE_CCW) KeepIt = false; + } + } + + if(KeepIt) *Data->Closest = hit; + } + }; + + RayCollider RC; + RC.SetMaxDist(max_dist); + RC.SetTemporalCoherence(false); + RC.SetCulling(false); // We need all faces since some of them can be double-sided + RC.SetFirstContact(false); + RC.SetHitCallback(Local::RenderCullingCallback); + + picked_face.mFaceID = INVALID_ID; + picked_face.mDistance = MAX_FLOAT; + picked_face.mU = 0.0f; + picked_face.mV = 0.0f; + + Local::CullData Data; + Data.Closest = &picked_face; + Data.MinLimit = min_dist; + Data.Callback = callback; + Data.UserData = user_data; + Data.ViewPoint = view_point; + Data.IMesh = model.GetMeshInterface(); + + if(world) + { + // Get matrices + Matrix4x4 InvWorld; + InvertPRMatrix(InvWorld, *world); + + // Compute camera position in mesh space + Data.ViewPoint *= InvWorld; + } + + RC.SetUserData(&Data); + if(RC.Collide(world_ray, model, world)) + { + return picked_face.mFaceID!=INVALID_ID; + } + return false; +} + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_Picking.h b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_Picking.h new file mode 100644 index 00000000..5c69f5d4 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_Picking.h @@ -0,0 +1,54 @@ +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code to perform "picking". + * \file OPC_Picking.h + * \author Pierre Terdiman + * \date March, 20, 2001 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef __OPC_PICKING_H__ +#define __OPC_PICKING_H__ + +#ifdef OPC_RAYHIT_CALLBACK + + enum CullMode + { + CULLMODE_NONE = 0, + CULLMODE_CW = 1, + CULLMODE_CCW = 2 + }; + + typedef CullMode (*CullModeCallback)(udword triangle_index, void* user_data); + + OPCODE_API bool SetupAllHits (RayCollider& collider, CollisionFaces& contacts); + OPCODE_API bool SetupClosestHit (RayCollider& collider, CollisionFace& closest_contact); + OPCODE_API bool SetupShadowFeeler (RayCollider& collider); + OPCODE_API bool SetupInOutTest (RayCollider& collider); + + OPCODE_API bool Picking( + CollisionFace& picked_face, + const Ray& world_ray, const Model& model, const Matrix4x4* world, + float min_dist, float max_dist, const Point& view_point, CullModeCallback callback, void* user_data); +#endif + +#endif //__OPC_PICKING_H__ \ No newline at end of file diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_PlanesAABBOverlap.h b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_PlanesAABBOverlap.h new file mode 100644 index 00000000..21ab91c7 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_PlanesAABBOverlap.h @@ -0,0 +1,67 @@ +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Planes-AABB overlap test. + * - original code by Ville Miettinen, from Umbra/dPVS (released on the GD-Algorithms mailing list) + * - almost used "as-is", I even left the comments (hence the frustum-related notes) + * + * \param center [in] box center + * \param extents [in] box extents + * \param out_clip_mask [out] bitmask for active planes + * \param in_clip_mask [in] bitmask for active planes + * \return TRUE if boxes overlap planes + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +inline_ BOOL PlanesCollider::PlanesAABBOverlap(const Point& center, const Point& extents, udword& out_clip_mask, udword in_clip_mask) +{ + // Stats + mNbVolumeBVTests++; + + const Plane* p = mPlanes; + + // Evaluate through all active frustum planes. We determine the relation + // between the AABB and a plane by using the concept of "near" and "far" + // vertices originally described by Zhang (and later by Möller). Our + // variant here uses 3 fabs ops, 6 muls, 7 adds and two floating point + // comparisons per plane. The routine early-exits if the AABB is found + // to be outside any of the planes. The loop also constructs a new output + // clip mask. Most FPUs have a native single-cycle fabsf() operation. + + udword Mask = 1; // current mask index (1,2,4,8,..) + udword TmpOutClipMask = 0; // initialize output clip mask into empty. + + while(Mask<=in_clip_mask) // keep looping while we have active planes left... + { + if(in_clip_mask & Mask) // if clip plane is active, process it.. + { + float NP = extents.x*fabsf(p->n.x) + extents.y*fabsf(p->n.y) + extents.z*fabsf(p->n.z); // ### fabsf could be precomputed + float MP = center.x*p->n.x + center.y*p->n.y + center.z*p->n.z + p->d; + + if(NP < MP) // near vertex behind the clip plane... + return FALSE; // .. so there is no intersection.. + if((-NP) < MP) // near and far vertices on different sides of plane.. + TmpOutClipMask |= Mask; // .. so update the clip mask... + } + Mask+=Mask; // mk = (1<Add(prim_index); + +//! Planes-triangle test +#define PLANES_PRIM(prim_index, flag) \ + /* Request vertices from the app */ \ + mIMesh->GetTriangle(mVP, prim_index); \ + /* Perform triangle-box overlap test */ \ + if(PlanesTriOverlap(clip_mask)) \ + { \ + SET_CONTACT(prim_index, flag) \ + } + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Constructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +PlanesCollider::PlanesCollider() : + mPlanes (null), + mNbPlanes (0) +{ +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Destructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +PlanesCollider::~PlanesCollider() +{ + DELETEARRAY(mPlanes); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Validates current settings. You should call this method after all the settings and callbacks have been defined. + * \return null if everything is ok, else a string describing the problem + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +const char* PlanesCollider::ValidateSettings() +{ + if(TemporalCoherenceEnabled() && !FirstContactEnabled()) return "Temporal coherence only works with ""First contact"" mode!"; + + return VolumeCollider::ValidateSettings(); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Generic collision query for generic OPCODE models. After the call, access the results: + * - with GetContactStatus() + * - with GetNbTouchedPrimitives() + * - with GetTouchedPrimitives() + * + * \param cache [in/out] a planes cache + * \param planes [in] list of planes in world space + * \param nb_planes [in] number of planes + * \param model [in] Opcode model to collide with + * \param worldm [in] model's world matrix, or null + * \return true if success + * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool PlanesCollider::Collide(PlanesCache& cache, const Plane* planes, udword nb_planes, const Model& model, const Matrix4x4* worldm) +{ + // Checkings + if(!Setup(&model)) return false; + + // Init collision query + if(InitQuery(cache, planes, nb_planes, worldm)) return true; + + udword PlaneMask = (1<mCenterCoeff; + mExtentsCoeff = Tree->mExtentsCoeff; + + // Perform collision query + if(SkipPrimitiveTests()) _CollideNoPrimitiveTest(Tree->GetNodes(), PlaneMask); + else _Collide(Tree->GetNodes(), PlaneMask); + } + else + { + const AABBNoLeafTree* Tree = (const AABBNoLeafTree*)model.GetTree(); + + // Perform collision query + if(SkipPrimitiveTests()) _CollideNoPrimitiveTest(Tree->GetNodes(), PlaneMask); + else _Collide(Tree->GetNodes(), PlaneMask); + } + } + else + { + if(model.IsQuantized()) + { + const AABBQuantizedTree* Tree = (const AABBQuantizedTree*)model.GetTree(); + + // Setup dequantization coeffs + mCenterCoeff = Tree->mCenterCoeff; + mExtentsCoeff = Tree->mExtentsCoeff; + + // Perform collision query + if(SkipPrimitiveTests()) _CollideNoPrimitiveTest(Tree->GetNodes(), PlaneMask); + else _Collide(Tree->GetNodes(), PlaneMask); + } + else + { + const AABBCollisionTree* Tree = (const AABBCollisionTree*)model.GetTree(); + + // Perform collision query + if(SkipPrimitiveTests()) _CollideNoPrimitiveTest(Tree->GetNodes(), PlaneMask); + else _Collide(Tree->GetNodes(), PlaneMask); + } + } + return true; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Initializes a collision query : + * - reset stats & contact status + * - compute planes in model space + * - check temporal coherence + * + * \param cache [in/out] a planes cache + * \param planes [in] list of planes + * \param nb_planes [in] number of planes + * \param worldm [in] model's world matrix, or null + * \return TRUE if we can return immediately + * \warning SCALE NOT SUPPORTED. The matrix must contain rotation & translation parts only. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +BOOL PlanesCollider::InitQuery(PlanesCache& cache, const Plane* planes, udword nb_planes, const Matrix4x4* worldm) +{ + // 1) Call the base method + VolumeCollider::InitQuery(); + + // 2) Compute planes in model space + if(nb_planes>mNbPlanes) + { + DELETEARRAY(mPlanes); + mPlanes = new Plane[nb_planes]; + } + mNbPlanes = nb_planes; + + if(worldm) + { + Matrix4x4 InvWorldM; + InvertPRMatrix(InvWorldM, *worldm); + +// for(udword i=0;iHasSingleNode()) + { + if(!SkipPrimitiveTests()) + { + // We simply perform the BV-Prim overlap test each time. We assume single triangle has index 0. + mTouchedPrimitives->Reset(); + + // Perform overlap test between the unique triangle and the planes (and set contact status if needed) + udword clip_mask = (1< check results from previous frame before performing the collision query + if(FirstContactEnabled()) + { + // We're only interested in the first contact found => test the unique previously touched face + if(mTouchedPrimitives->GetNbEntries()) + { + // Get index of previously touched face = the first entry in the array + udword PreviouslyTouchedFace = mTouchedPrimitives->GetEntry(0); + + // Then reset the array: + // - if the overlap test below is successful, the index we'll get added back anyway + // - if it isn't, then the array should be reset anyway for the normal query + mTouchedPrimitives->Reset(); + + // Perform overlap test between the cached triangle and the planes (and set contact status if needed) + udword clip_mask = (1< we'll have to perform a normal query + } + else mTouchedPrimitives->Reset(); + } + else + { + // Here we don't use temporal coherence => do a normal query + mTouchedPrimitives->Reset(); + } + + return FALSE; +} + +#define TEST_CLIP_MASK \ + /* If the box is completely included, so are its children. We don't need to do extra tests, we */ \ + /* can immediately output a list of visible children. Those ones won't need to be clipped. */ \ + if(!OutClipMask) \ + { \ + /* Set contact status */ \ + mFlags |= OPC_CONTACT; \ + _Dump(node); \ + return; \ + } + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for normal AABB trees. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void PlanesCollider::_Collide(const AABBCollisionNode* node, udword clip_mask) +{ + // Test the box against the planes. If the box is completely culled, so are its children, hence we exit. + udword OutClipMask; + if(!PlanesAABBOverlap(node->mAABB.mCenter, node->mAABB.mExtents, OutClipMask, clip_mask)) return; + + TEST_CLIP_MASK + + // Else the box straddles one or several planes, so we need to recurse down the tree. + if(node->IsLeaf()) + { + PLANES_PRIM(node->GetPrimitive(), OPC_CONTACT) + } + else + { + _Collide(node->GetPos(), OutClipMask); + + if(ContactFound()) return; + + _Collide(node->GetNeg(), OutClipMask); + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for normal AABB trees. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void PlanesCollider::_CollideNoPrimitiveTest(const AABBCollisionNode* node, udword clip_mask) +{ + // Test the box against the planes. If the box is completely culled, so are its children, hence we exit. + udword OutClipMask; + if(!PlanesAABBOverlap(node->mAABB.mCenter, node->mAABB.mExtents, OutClipMask, clip_mask)) return; + + TEST_CLIP_MASK + + // Else the box straddles one or several planes, so we need to recurse down the tree. + if(node->IsLeaf()) + { + SET_CONTACT(node->GetPrimitive(), OPC_CONTACT) + } + else + { + _CollideNoPrimitiveTest(node->GetPos(), OutClipMask); + + if(ContactFound()) return; + + _CollideNoPrimitiveTest(node->GetNeg(), OutClipMask); + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for quantized AABB trees. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void PlanesCollider::_Collide(const AABBQuantizedNode* node, udword clip_mask) +{ + // Dequantize box + const QuantizedAABB& Box = node->mAABB; + const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); + const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); + + // Test the box against the planes. If the box is completely culled, so are its children, hence we exit. + udword OutClipMask; + if(!PlanesAABBOverlap(Center, Extents, OutClipMask, clip_mask)) return; + + TEST_CLIP_MASK + + // Else the box straddles one or several planes, so we need to recurse down the tree. + if(node->IsLeaf()) + { + PLANES_PRIM(node->GetPrimitive(), OPC_CONTACT) + } + else + { + _Collide(node->GetPos(), OutClipMask); + + if(ContactFound()) return; + + _Collide(node->GetNeg(), OutClipMask); + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for quantized AABB trees. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void PlanesCollider::_CollideNoPrimitiveTest(const AABBQuantizedNode* node, udword clip_mask) +{ + // Dequantize box + const QuantizedAABB& Box = node->mAABB; + const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); + const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); + + // Test the box against the planes. If the box is completely culled, so are its children, hence we exit. + udword OutClipMask; + if(!PlanesAABBOverlap(Center, Extents, OutClipMask, clip_mask)) return; + + TEST_CLIP_MASK + + // Else the box straddles one or several planes, so we need to recurse down the tree. + if(node->IsLeaf()) + { + SET_CONTACT(node->GetPrimitive(), OPC_CONTACT) + } + else + { + _CollideNoPrimitiveTest(node->GetPos(), OutClipMask); + + if(ContactFound()) return; + + _CollideNoPrimitiveTest(node->GetNeg(), OutClipMask); + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for no-leaf AABB trees. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void PlanesCollider::_Collide(const AABBNoLeafNode* node, udword clip_mask) +{ + // Test the box against the planes. If the box is completely culled, so are its children, hence we exit. + udword OutClipMask; + if(!PlanesAABBOverlap(node->mAABB.mCenter, node->mAABB.mExtents, OutClipMask, clip_mask)) return; + + TEST_CLIP_MASK + + // Else the box straddles one or several planes, so we need to recurse down the tree. + if(node->HasPosLeaf()) { PLANES_PRIM(node->GetPosPrimitive(), OPC_CONTACT) } + else _Collide(node->GetPos(), OutClipMask); + + if(ContactFound()) return; + + if(node->HasNegLeaf()) { PLANES_PRIM(node->GetNegPrimitive(), OPC_CONTACT) } + else _Collide(node->GetNeg(), OutClipMask); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for no-leaf AABB trees. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void PlanesCollider::_CollideNoPrimitiveTest(const AABBNoLeafNode* node, udword clip_mask) +{ + // Test the box against the planes. If the box is completely culled, so are its children, hence we exit. + udword OutClipMask; + if(!PlanesAABBOverlap(node->mAABB.mCenter, node->mAABB.mExtents, OutClipMask, clip_mask)) return; + + TEST_CLIP_MASK + + // Else the box straddles one or several planes, so we need to recurse down the tree. + if(node->HasPosLeaf()) { SET_CONTACT(node->GetPosPrimitive(), OPC_CONTACT) } + else _CollideNoPrimitiveTest(node->GetPos(), OutClipMask); + + if(ContactFound()) return; + + if(node->HasNegLeaf()) { SET_CONTACT(node->GetNegPrimitive(), OPC_CONTACT) } + else _CollideNoPrimitiveTest(node->GetNeg(), OutClipMask); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for quantized no-leaf AABB trees. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void PlanesCollider::_Collide(const AABBQuantizedNoLeafNode* node, udword clip_mask) +{ + // Dequantize box + const QuantizedAABB& Box = node->mAABB; + const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); + const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); + + // Test the box against the planes. If the box is completely culled, so are its children, hence we exit. + udword OutClipMask; + if(!PlanesAABBOverlap(Center, Extents, OutClipMask, clip_mask)) return; + + TEST_CLIP_MASK + + // Else the box straddles one or several planes, so we need to recurse down the tree. + if(node->HasPosLeaf()) { PLANES_PRIM(node->GetPosPrimitive(), OPC_CONTACT) } + else _Collide(node->GetPos(), OutClipMask); + + if(ContactFound()) return; + + if(node->HasNegLeaf()) { PLANES_PRIM(node->GetNegPrimitive(), OPC_CONTACT) } + else _Collide(node->GetNeg(), OutClipMask); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for quantized no-leaf AABB trees. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void PlanesCollider::_CollideNoPrimitiveTest(const AABBQuantizedNoLeafNode* node, udword clip_mask) +{ + // Dequantize box + const QuantizedAABB& Box = node->mAABB; + const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); + const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); + + // Test the box against the planes. If the box is completely culled, so are its children, hence we exit. + udword OutClipMask; + if(!PlanesAABBOverlap(Center, Extents, OutClipMask, clip_mask)) return; + + TEST_CLIP_MASK + + // Else the box straddles one or several planes, so we need to recurse down the tree. + if(node->HasPosLeaf()) { SET_CONTACT(node->GetPosPrimitive(), OPC_CONTACT) } + else _CollideNoPrimitiveTest(node->GetPos(), OutClipMask); + + if(ContactFound()) return; + + if(node->HasNegLeaf()) { SET_CONTACT(node->GetNegPrimitive(), OPC_CONTACT) } + else _CollideNoPrimitiveTest(node->GetNeg(), OutClipMask); +} + + + + + + + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Constructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +HybridPlanesCollider::HybridPlanesCollider() +{ +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Destructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +HybridPlanesCollider::~HybridPlanesCollider() +{ +} + +bool HybridPlanesCollider::Collide(PlanesCache& cache, const Plane* planes, udword nb_planes, const HybridModel& model, const Matrix4x4* worldm) +{ + // We don't want primitive tests here! + mFlags |= OPC_NO_PRIMITIVE_TESTS; + + // Checkings + if(!Setup(&model)) return false; + + // Init collision query + if(InitQuery(cache, planes, nb_planes, worldm)) return true; + + // Special case for 1-leaf trees + if(mCurrentModel && mCurrentModel->HasSingleNode()) + { + // Here we're supposed to perform a normal query, except our tree has a single node, i.e. just a few triangles + udword Nb = mIMesh->GetNbTriangles(); + + // Loop through all triangles + udword clip_mask = (1<mCenterCoeff; + mExtentsCoeff = Tree->mExtentsCoeff; + + // Perform collision query - we don't want primitive tests here! + _CollideNoPrimitiveTest(Tree->GetNodes(), PlaneMask); + } + else + { + const AABBNoLeafTree* Tree = (const AABBNoLeafTree*)model.GetTree(); + + // Perform collision query - we don't want primitive tests here! + _CollideNoPrimitiveTest(Tree->GetNodes(), PlaneMask); + } + } + else + { + if(model.IsQuantized()) + { + const AABBQuantizedTree* Tree = (const AABBQuantizedTree*)model.GetTree(); + + // Setup dequantization coeffs + mCenterCoeff = Tree->mCenterCoeff; + mExtentsCoeff = Tree->mExtentsCoeff; + + // Perform collision query - we don't want primitive tests here! + _CollideNoPrimitiveTest(Tree->GetNodes(), PlaneMask); + } + else + { + const AABBCollisionTree* Tree = (const AABBCollisionTree*)model.GetTree(); + + // Perform collision query - we don't want primitive tests here! + _CollideNoPrimitiveTest(Tree->GetNodes(), PlaneMask); + } + } + + // We only have a list of boxes so far + if(GetContactStatus()) + { + // Reset contact status, since it currently only reflects collisions with leaf boxes + Collider::InitQuery(); + + // Change dest container so that we can use built-in overlap tests and get collided primitives + cache.TouchedPrimitives.Reset(); + mTouchedPrimitives = &cache.TouchedPrimitives; + + // Read touched leaf boxes + udword Nb = mTouchedBoxes.GetNbEntries(); + const udword* Touched = mTouchedBoxes.GetEntries(); + + const LeafTriangles* LT = model.GetLeafTriangles(); + const udword* Indices = model.GetIndices(); + + // Loop through touched leaves + udword clip_mask = (1<Distance(*mVP.Vertex[0]); + float d1 = p->Distance(*mVP.Vertex[1]); + float d2 = p->Distance(*mVP.Vertex[2]); + if(d0>0.0f && d1>0.0f && d2>0.0f) return FALSE; +// if(!(IR(d0)&SIGN_BITMASK) && !(IR(d1)&SIGN_BITMASK) && !(IR(d2)&SIGN_BITMASK)) return FALSE; + } + Mask+=Mask; + p++; + } +/* + for(udword i=0;i<6;i++) + { + float d0 = p[i].Distance(mLeafVerts[0]); + float d1 = p[i].Distance(mLeafVerts[1]); + float d2 = p[i].Distance(mLeafVerts[2]); + if(d0>0.0f && d1>0.0f && d2>0.0f) return false; + } +*/ + return TRUE; +} diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_RayAABBOverlap.h b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_RayAABBOverlap.h new file mode 100644 index 00000000..0d2639c6 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_RayAABBOverlap.h @@ -0,0 +1,81 @@ +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + + +// Opcode 1.1: ray-AABB overlap tests based on Woo's code +// Opcode 1.2: ray-AABB overlap tests based on the separating axis theorem +// +// The point of intersection is not computed anymore. The distance to impact is not needed anymore +// since we now have two different queries for segments or rays. + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Computes a segment-AABB overlap test using the separating axis theorem. Segment is cached within the class. + * \param center [in] AABB center + * \param extents [in] AABB extents + * \return true on overlap + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +inline_ BOOL RayCollider::SegmentAABBOverlap(const Point& center, const Point& extents) +{ + // Stats + mNbRayBVTests++; + + float Dx = mData2.x - center.x; if(fabsf(Dx) > extents.x + mFDir.x) return FALSE; + float Dy = mData2.y - center.y; if(fabsf(Dy) > extents.y + mFDir.y) return FALSE; + float Dz = mData2.z - center.z; if(fabsf(Dz) > extents.z + mFDir.z) return FALSE; + + float f; + f = mData.y * Dz - mData.z * Dy; if(fabsf(f) > extents.y*mFDir.z + extents.z*mFDir.y) return FALSE; + f = mData.z * Dx - mData.x * Dz; if(fabsf(f) > extents.x*mFDir.z + extents.z*mFDir.x) return FALSE; + f = mData.x * Dy - mData.y * Dx; if(fabsf(f) > extents.x*mFDir.y + extents.y*mFDir.x) return FALSE; + + return TRUE; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Computes a ray-AABB overlap test using the separating axis theorem. Ray is cached within the class. + * \param center [in] AABB center + * \param extents [in] AABB extents + * \return true on overlap + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +inline_ BOOL RayCollider::RayAABBOverlap(const Point& center, const Point& extents) +{ + // Stats + mNbRayBVTests++; + +// float Dx = mOrigin.x - center.x; if(fabsf(Dx) > extents.x && Dx*mDir.x>=0.0f) return FALSE; +// float Dy = mOrigin.y - center.y; if(fabsf(Dy) > extents.y && Dy*mDir.y>=0.0f) return FALSE; +// float Dz = mOrigin.z - center.z; if(fabsf(Dz) > extents.z && Dz*mDir.z>=0.0f) return FALSE; + + float Dx = mOrigin.x - center.x; if(GREATER(Dx, extents.x) && Dx*mDir.x>=0.0f) return FALSE; + float Dy = mOrigin.y - center.y; if(GREATER(Dy, extents.y) && Dy*mDir.y>=0.0f) return FALSE; + float Dz = mOrigin.z - center.z; if(GREATER(Dz, extents.z) && Dz*mDir.z>=0.0f) return FALSE; + +// float Dx = mOrigin.x - center.x; if(GREATER(Dx, extents.x) && ((SIR(Dx)-1)^SIR(mDir.x))>=0.0f) return FALSE; +// float Dy = mOrigin.y - center.y; if(GREATER(Dy, extents.y) && ((SIR(Dy)-1)^SIR(mDir.y))>=0.0f) return FALSE; +// float Dz = mOrigin.z - center.z; if(GREATER(Dz, extents.z) && ((SIR(Dz)-1)^SIR(mDir.z))>=0.0f) return FALSE; + + float f; + f = mDir.y * Dz - mDir.z * Dy; if(fabsf(f) > extents.y*mFDir.z + extents.z*mFDir.y) return FALSE; + f = mDir.z * Dx - mDir.x * Dz; if(fabsf(f) > extents.x*mFDir.z + extents.z*mFDir.x) return FALSE; + f = mDir.x * Dy - mDir.y * Dx; if(fabsf(f) > extents.x*mFDir.y + extents.y*mFDir.x) return FALSE; + + return TRUE; +} diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_RayCollider.cpp b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_RayCollider.cpp new file mode 100644 index 00000000..07ceb32b --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_RayCollider.cpp @@ -0,0 +1,771 @@ +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code for a ray collider. + * \file OPC_RayCollider.cpp + * \author Pierre Terdiman + * \date June, 2, 2001 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains a ray-vs-tree collider. + * This class performs a stabbing query on an AABB tree, i.e. does a ray-mesh collision. + * + * HIGHER DISTANCE BOUND: + * + * If P0 and P1 are two 3D points, let's define: + * - d = distance between P0 and P1 + * - Origin = P0 + * - Direction = (P1 - P0) / d = normalized direction vector + * - A parameter t such as a point P on the line (P0,P1) is P = Origin + t * Direction + * - t = 0 --> P = P0 + * - t = d --> P = P1 + * + * Then we can define a general "ray" as: + * + * struct Ray + * { + * Point Origin; + * Point Direction; + * }; + * + * But it actually maps three different things: + * - a segment, when 0 <= t <= d + * - a half-line, when 0 <= t < +infinity, or -infinity < t <= d + * - a line, when -infinity < t < +infinity + * + * In Opcode, we support segment queries, which yield half-line queries by setting d = +infinity. + * We don't support line-queries. If you need them, shift the origin along the ray by an appropriate margin. + * + * In short, the lower bound is always 0, and you can setup the higher bound "d" with RayCollider::SetMaxDist(). + * + * Query |segment |half-line |line + * --------|-------------------|---------------|---------------- + * Usages |-shadow feelers |-raytracing |- + * |-sweep tests |-in/out tests | + * + * FIRST CONTACT: + * + * - You can setup "first contact" mode or "all contacts" mode with RayCollider::SetFirstContact(). + * - In "first contact" mode we return as soon as the ray hits one face. If can be useful e.g. for shadow feelers, where + * you want to know whether the path to the light is free or not (a boolean answer is enough). + * - In "all contacts" mode we return all faces hit by the ray. + * + * TEMPORAL COHERENCE: + * + * - You can enable or disable temporal coherence with RayCollider::SetTemporalCoherence(). + * - It currently only works in "first contact" mode. + * - If temporal coherence is enabled, the previously hit triangle is cached during the first query. Then, next queries + * start by colliding the ray against the cached triangle. If they still collide, we return immediately. + * + * CLOSEST HIT: + * + * - You can enable or disable "closest hit" with RayCollider::SetClosestHit(). + * - It currently only works in "all contacts" mode. + * - If closest hit is enabled, faces are sorted by distance on-the-fly and the closest one only is reported. + * + * BACKFACE CULLING: + * + * - You can enable or disable backface culling with RayCollider::SetCulling(). + * - If culling is enabled, ray will not hit back faces (only front faces). + * + * + * + * \class RayCollider + * \author Pierre Terdiman + * \version 1.3 + * \date June, 2, 2001 +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * This class describes a face hit by a ray or segment. + * This is a particular class dedicated to stabbing queries. + * + * \class CollisionFace + * \author Pierre Terdiman + * \version 1.3 + * \date March, 20, 2001 +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * This class is a dedicated collection of CollisionFace. + * + * \class CollisionFaces + * \author Pierre Terdiman + * \version 1.3 + * \date March, 20, 2001 +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Precompiled Header +#include "Stdafx.h" + +using namespace Opcode; + +#include "OPC_RayAABBOverlap.h" +#include "OPC_RayTriOverlap.h" + +#define SET_CONTACT(prim_index, flag) \ + mNbIntersections++; \ + /* Set contact status */ \ + mFlags |= flag; \ + /* In any case the contact has been found and recorded in mStabbedFace */ \ + mStabbedFace.mFaceID = prim_index; + +#ifdef OPC_RAYHIT_CALLBACK + + #define HANDLE_CONTACT(prim_index, flag) \ + SET_CONTACT(prim_index, flag) \ + \ + if(mHitCallback) (mHitCallback)(mStabbedFace, mUserData); + + #define UPDATE_CACHE \ + if(cache && GetContactStatus()) \ + { \ + *cache = mStabbedFace.mFaceID; \ + } +#else + + #define HANDLE_CONTACT(prim_index, flag) \ + SET_CONTACT(prim_index, flag) \ + \ + /* Now we can also record it in mStabbedFaces if available */ \ + if(mStabbedFaces) \ + { \ + /* If we want all faces or if that's the first one we hit */ \ + if(!mClosestHit || !mStabbedFaces->GetNbFaces()) \ + { \ + mStabbedFaces->AddFace(mStabbedFace); \ + } \ + else \ + { \ + /* We only keep closest hit */ \ + CollisionFace* Current = const_cast(mStabbedFaces->GetFaces()); \ + if(Current && mStabbedFace.mDistancemDistance) \ + { \ + *Current = mStabbedFace; \ + } \ + } \ + } + + #define UPDATE_CACHE \ + if(cache && GetContactStatus() && mStabbedFaces) \ + { \ + const CollisionFace* Current = mStabbedFaces->GetFaces(); \ + if(Current) *cache = Current->mFaceID; \ + else *cache = INVALID_ID; \ + } +#endif + +#define SEGMENT_PRIM(prim_index, flag) \ + /* Request vertices from the app */ \ + VertexPointers VP; mIMesh->GetTriangle(VP, prim_index); \ + \ + /* Perform ray-tri overlap test and return */ \ + if(RayTriOverlap(*VP.Vertex[0], *VP.Vertex[1], *VP.Vertex[2])) \ + { \ + /* Intersection point is valid if dist < segment's length */ \ + /* We know dist>0 so we can use integers */ \ + if(IR(mStabbedFace.mDistance)GetTriangle(VP, prim_index); \ + \ + /* Perform ray-tri overlap test and return */ \ + if(RayTriOverlap(*VP.Vertex[0], *VP.Vertex[1], *VP.Vertex[2])) \ + { \ + HANDLE_CONTACT(prim_index, flag) \ + } + + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Constructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +RayCollider::RayCollider() : + mNbRayBVTests (0), + mNbRayPrimTests (0), + mNbIntersections (0), + mCulling (true), +#ifdef OPC_RAYHIT_CALLBACK + mHitCallback (null), + mUserData (0), +#else + mClosestHit (false), + mStabbedFaces (null), +#endif + mMaxDist (MAX_FLOAT) +{ +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Destructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +RayCollider::~RayCollider() +{ +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Validates current settings. You should call this method after all the settings and callbacks have been defined. + * \return null if everything is ok, else a string describing the problem + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +const char* RayCollider::ValidateSettings() +{ + if(mMaxDist<0.0f) return "Higher distance bound must be positive!"; + if(TemporalCoherenceEnabled() && !FirstContactEnabled()) return "Temporal coherence only works with ""First contact"" mode!"; +#ifndef OPC_RAYHIT_CALLBACK + if(mClosestHit && FirstContactEnabled()) return "Closest hit doesn't work with ""First contact"" mode!"; + if(TemporalCoherenceEnabled() && mClosestHit) return "Temporal coherence can't guarantee to report closest hit!"; +#endif + if(SkipPrimitiveTests()) return "SkipPrimitiveTests not possible for RayCollider ! (not implemented)"; + return null; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Generic stabbing query for generic OPCODE models. After the call, access the results: + * - with GetContactStatus() + * - in the user-provided destination array + * + * \param world_ray [in] stabbing ray in world space + * \param model [in] Opcode model to collide with + * \param world [in] model's world matrix, or null + * \param cache [in] a possibly cached face index, or null + * \return true if success + * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool RayCollider::Collide(const Ray& world_ray, const Model& model, const Matrix4x4* world, udword* cache) +{ + // Checkings + if(!Setup(&model)) return false; + + // Init collision query + if(InitQuery(world_ray, world, cache)) return true; + + if(!model.HasLeafNodes()) + { + if(model.IsQuantized()) + { + const AABBQuantizedNoLeafTree* Tree = (const AABBQuantizedNoLeafTree*)model.GetTree(); + + // Setup dequantization coeffs + mCenterCoeff = Tree->mCenterCoeff; + mExtentsCoeff = Tree->mExtentsCoeff; + + // Perform stabbing query + if(IR(mMaxDist)!=IEEE_MAX_FLOAT) _SegmentStab(Tree->GetNodes()); + else _RayStab(Tree->GetNodes()); + } + else + { + const AABBNoLeafTree* Tree = (const AABBNoLeafTree*)model.GetTree(); + + // Perform stabbing query + if(IR(mMaxDist)!=IEEE_MAX_FLOAT) _SegmentStab(Tree->GetNodes()); + else _RayStab(Tree->GetNodes()); + } + } + else + { + if(model.IsQuantized()) + { + const AABBQuantizedTree* Tree = (const AABBQuantizedTree*)model.GetTree(); + + // Setup dequantization coeffs + mCenterCoeff = Tree->mCenterCoeff; + mExtentsCoeff = Tree->mExtentsCoeff; + + // Perform stabbing query + if(IR(mMaxDist)!=IEEE_MAX_FLOAT) _SegmentStab(Tree->GetNodes()); + else _RayStab(Tree->GetNodes()); + } + else + { + const AABBCollisionTree* Tree = (const AABBCollisionTree*)model.GetTree(); + + // Perform stabbing query + if(IR(mMaxDist)!=IEEE_MAX_FLOAT) _SegmentStab(Tree->GetNodes()); + else _RayStab(Tree->GetNodes()); + } + } + + // Update cache if needed + UPDATE_CACHE + return true; +} + + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Initializes a stabbing query : + * - reset stats & contact status + * - compute ray in local space + * - check temporal coherence + * + * \param world_ray [in] stabbing ray in world space + * \param world [in] object's world matrix, or null + * \param face_id [in] index of previously stabbed triangle + * \return TRUE if we can return immediately + * \warning SCALE NOT SUPPORTED. The matrix must contain rotation & translation parts only. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +BOOL RayCollider::InitQuery(const Ray& world_ray, const Matrix4x4* world, udword* face_id) +{ + // Reset stats & contact status + Collider::InitQuery(); + mNbRayBVTests = 0; + mNbRayPrimTests = 0; + mNbIntersections = 0; +#ifndef OPC_RAYHIT_CALLBACK + if(mStabbedFaces) mStabbedFaces->Reset(); +#endif + + // Compute ray in local space + // The (Origin/Dir) form is needed for the ray-triangle test anyway (even for segment tests) + if(world) + { + Matrix3x3 InvWorld = *world; + mDir = InvWorld * world_ray.mDir; + + Matrix4x4 World; + InvertPRMatrix(World, *world); + mOrigin = world_ray.mOrig * World; + } + else + { + mDir = world_ray.mDir; + mOrigin = world_ray.mOrig; + } + + // 4) Special case: 1-triangle meshes [Opcode 1.3] + if(mCurrentModel && mCurrentModel->HasSingleNode()) + { + // We simply perform the BV-Prim overlap test each time. We assume single triangle has index 0. + if(!SkipPrimitiveTests()) + { + // Perform overlap test between the unique triangle and the ray (and set contact status if needed) + SEGMENT_PRIM(udword(0), OPC_CONTACT) + + // Return immediately regardless of status + return TRUE; + } + } + + // Check temporal coherence : + + // Test previously colliding primitives first + if(TemporalCoherenceEnabled() && FirstContactEnabled() && face_id && *face_id!=INVALID_ID) + { +#ifdef OLD_CODE +#ifndef OPC_RAYHIT_CALLBACK + if(!mClosestHit) +#endif + { + // Request vertices from the app + VertexPointers VP; + mIMesh->GetTriangle(VP, *face_id); + // Perform ray-cached tri overlap test + if(RayTriOverlap(*VP.Vertex[0], *VP.Vertex[1], *VP.Vertex[2])) + { + // Intersection point is valid if: + // - distance is positive (else it can just be a face behind the orig point) + // - distance is smaller than a given max distance (useful for shadow feelers) +// if(mStabbedFace.mDistance>0.0f && mStabbedFace.mDistanceAddFace(mStabbedFace); +#endif + return TRUE; + } + } + } +#else + // New code + // We handle both Segment/ray queries with the same segment code, and a possible infinite limit + SEGMENT_PRIM(*face_id, OPC_TEMPORAL_CONTACT) + + // Return immediately if possible + if(GetContactStatus()) return TRUE; +#endif + } + + // Precompute data (moved after temporal coherence since only needed for ray-AABB) + if(IR(mMaxDist)!=IEEE_MAX_FLOAT) + { + // For Segment-AABB overlap + mData = 0.5f * mDir * mMaxDist; + mData2 = mOrigin + mData; + + // Precompute mFDir; + mFDir.x = fabsf(mData.x); + mFDir.y = fabsf(mData.y); + mFDir.z = fabsf(mData.z); + } + else + { + // For Ray-AABB overlap +// udword x = SIR(mDir.x)-1; +// udword y = SIR(mDir.y)-1; +// udword z = SIR(mDir.z)-1; +// mData.x = FR(x); +// mData.y = FR(y); +// mData.z = FR(z); + + // Precompute mFDir; + mFDir.x = fabsf(mDir.x); + mFDir.y = fabsf(mDir.y); + mFDir.z = fabsf(mDir.z); + } + + return FALSE; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Stabbing query for vanilla AABB trees. + * \param world_ray [in] stabbing ray in world space + * \param tree [in] AABB tree + * \param box_indices [out] indices of stabbed boxes + * \return true if success + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool RayCollider::Collide(const Ray& world_ray, const AABBTree* tree, Container& box_indices) +{ + // ### bad design here + + // This is typically called for a scene tree, full of -AABBs-, not full of triangles. + // So we don't really have "primitives" to deal with. Hence it doesn't work with + // "FirstContact" + "TemporalCoherence". + ASSERT( !(FirstContactEnabled() && TemporalCoherenceEnabled()) ); + + // Checkings + if(!tree) return false; + + // Init collision query + // Basically this is only called to initialize precomputed data + if(InitQuery(world_ray)) return true; + + // Perform stabbing query + if(IR(mMaxDist)!=IEEE_MAX_FLOAT) _SegmentStab(tree, box_indices); + else _RayStab(tree, box_indices); + + return true; +} + + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive stabbing query for normal AABB trees. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void RayCollider::_SegmentStab(const AABBCollisionNode* node) +{ + // Perform Segment-AABB overlap test + if(!SegmentAABBOverlap(node->mAABB.mCenter, node->mAABB.mExtents)) return; + + if(node->IsLeaf()) + { + SEGMENT_PRIM(node->GetPrimitive(), OPC_CONTACT) + } + else + { + _SegmentStab(node->GetPos()); + + if(ContactFound()) return; + + _SegmentStab(node->GetNeg()); + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive stabbing query for quantized AABB trees. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void RayCollider::_SegmentStab(const AABBQuantizedNode* node) +{ + // Dequantize box + const QuantizedAABB& Box = node->mAABB; + const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); + const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); + + // Perform Segment-AABB overlap test + if(!SegmentAABBOverlap(Center, Extents)) return; + + if(node->IsLeaf()) + { + SEGMENT_PRIM(node->GetPrimitive(), OPC_CONTACT) + } + else + { + _SegmentStab(node->GetPos()); + + if(ContactFound()) return; + + _SegmentStab(node->GetNeg()); + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive stabbing query for no-leaf AABB trees. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void RayCollider::_SegmentStab(const AABBNoLeafNode* node) +{ + // Perform Segment-AABB overlap test + if(!SegmentAABBOverlap(node->mAABB.mCenter, node->mAABB.mExtents)) return; + + if(node->HasPosLeaf()) + { + SEGMENT_PRIM(node->GetPosPrimitive(), OPC_CONTACT) + } + else _SegmentStab(node->GetPos()); + + if(ContactFound()) return; + + if(node->HasNegLeaf()) + { + SEGMENT_PRIM(node->GetNegPrimitive(), OPC_CONTACT) + } + else _SegmentStab(node->GetNeg()); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive stabbing query for quantized no-leaf AABB trees. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void RayCollider::_SegmentStab(const AABBQuantizedNoLeafNode* node) +{ + // Dequantize box + const QuantizedAABB& Box = node->mAABB; + const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); + const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); + + // Perform Segment-AABB overlap test + if(!SegmentAABBOverlap(Center, Extents)) return; + + if(node->HasPosLeaf()) + { + SEGMENT_PRIM(node->GetPosPrimitive(), OPC_CONTACT) + } + else _SegmentStab(node->GetPos()); + + if(ContactFound()) return; + + if(node->HasNegLeaf()) + { + SEGMENT_PRIM(node->GetNegPrimitive(), OPC_CONTACT) + } + else _SegmentStab(node->GetNeg()); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive stabbing query for vanilla AABB trees. + * \param node [in] current collision node + * \param box_indices [out] indices of stabbed boxes + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void RayCollider::_SegmentStab(const AABBTreeNode* node, Container& box_indices) +{ + // Test the box against the segment + Point Center, Extents; + node->GetAABB()->GetCenter(Center); + node->GetAABB()->GetExtents(Extents); + if(!SegmentAABBOverlap(Center, Extents)) return; + + if(node->IsLeaf()) + { + box_indices.Add(node->GetPrimitives(), node->GetNbPrimitives()); + } + else + { + _SegmentStab(node->GetPos(), box_indices); + _SegmentStab(node->GetNeg(), box_indices); + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive stabbing query for normal AABB trees. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void RayCollider::_RayStab(const AABBCollisionNode* node) +{ + // Perform Ray-AABB overlap test + if(!RayAABBOverlap(node->mAABB.mCenter, node->mAABB.mExtents)) return; + + if(node->IsLeaf()) + { + RAY_PRIM(node->GetPrimitive(), OPC_CONTACT) + } + else + { + _RayStab(node->GetPos()); + + if(ContactFound()) return; + + _RayStab(node->GetNeg()); + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive stabbing query for quantized AABB trees. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void RayCollider::_RayStab(const AABBQuantizedNode* node) +{ + // Dequantize box + const QuantizedAABB& Box = node->mAABB; + const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); + const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); + + // Perform Ray-AABB overlap test + if(!RayAABBOverlap(Center, Extents)) return; + + if(node->IsLeaf()) + { + RAY_PRIM(node->GetPrimitive(), OPC_CONTACT) + } + else + { + _RayStab(node->GetPos()); + + if(ContactFound()) return; + + _RayStab(node->GetNeg()); + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive stabbing query for no-leaf AABB trees. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void RayCollider::_RayStab(const AABBNoLeafNode* node) +{ + // Perform Ray-AABB overlap test + if(!RayAABBOverlap(node->mAABB.mCenter, node->mAABB.mExtents)) return; + + if(node->HasPosLeaf()) + { + RAY_PRIM(node->GetPosPrimitive(), OPC_CONTACT) + } + else _RayStab(node->GetPos()); + + if(ContactFound()) return; + + if(node->HasNegLeaf()) + { + RAY_PRIM(node->GetNegPrimitive(), OPC_CONTACT) + } + else _RayStab(node->GetNeg()); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive stabbing query for quantized no-leaf AABB trees. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void RayCollider::_RayStab(const AABBQuantizedNoLeafNode* node) +{ + // Dequantize box + const QuantizedAABB& Box = node->mAABB; + const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); + const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); + + // Perform Ray-AABB overlap test + if(!RayAABBOverlap(Center, Extents)) return; + + if(node->HasPosLeaf()) + { + RAY_PRIM(node->GetPosPrimitive(), OPC_CONTACT) + } + else _RayStab(node->GetPos()); + + if(ContactFound()) return; + + if(node->HasNegLeaf()) + { + RAY_PRIM(node->GetNegPrimitive(), OPC_CONTACT) + } + else _RayStab(node->GetNeg()); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive stabbing query for vanilla AABB trees. + * \param node [in] current collision node + * \param box_indices [out] indices of stabbed boxes + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void RayCollider::_RayStab(const AABBTreeNode* node, Container& box_indices) +{ + // Test the box against the ray + Point Center, Extents; + node->GetAABB()->GetCenter(Center); + node->GetAABB()->GetExtents(Extents); + if(!RayAABBOverlap(Center, Extents)) return; + + if(node->IsLeaf()) + { + mFlags |= OPC_CONTACT; + box_indices.Add(node->GetPrimitives(), node->GetNbPrimitives()); + } + else + { + _RayStab(node->GetPos(), box_indices); + _RayStab(node->GetNeg(), box_indices); + } +} diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_RayCollider.h b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_RayCollider.h new file mode 100644 index 00000000..d347b18a --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_RayCollider.h @@ -0,0 +1,234 @@ +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code for a ray collider. + * \file OPC_RayCollider.h + * \author Pierre Terdiman + * \date June, 2, 2001 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef __OPC_RAYCOLLIDER_H__ +#define __OPC_RAYCOLLIDER_H__ + + class OPCODE_API CollisionFace + { + public: + //! Constructor + inline_ CollisionFace() {} + //! Destructor + inline_ ~CollisionFace() {} + + udword mFaceID; //!< Index of touched face + float mDistance; //!< Distance from collider to hitpoint + float mU, mV; //!< Impact barycentric coordinates + }; + + class OPCODE_API CollisionFaces : private Container + { + public: + //! Constructor + CollisionFaces() {} + //! Destructor + ~CollisionFaces() {} + + inline_ udword GetNbFaces() const { return GetNbEntries()>>2; } + inline_ const CollisionFace* GetFaces() const { return (const CollisionFace*)GetEntries(); } + + inline_ void Reset() { Container::Reset(); } + + inline_ void AddFace(const CollisionFace& face) { Add(face.mFaceID).Add(face.mDistance).Add(face.mU).Add(face.mV); } + }; + +#ifdef OPC_RAYHIT_CALLBACK + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * User-callback, called by OPCODE to record a hit. + * \param hit [in] current hit + * \param user_data [in] user-defined data from SetCallback() + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + typedef void (*HitCallback) (const CollisionFace& hit, void* user_data); +#endif + + class OPCODE_API RayCollider : public Collider + { + public: + // Constructor / Destructor + RayCollider(); + virtual ~RayCollider(); + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Generic stabbing query for generic OPCODE models. After the call, access the results: + * - with GetContactStatus() + * - in the user-provided destination array + * + * \param world_ray [in] stabbing ray in world space + * \param model [in] Opcode model to collide with + * \param world [in] model's world matrix, or null + * \param cache [in] a possibly cached face index, or null + * \return true if success + * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only. + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + bool Collide(const Ray& world_ray, const Model& model, const Matrix4x4* world=null, udword* cache=null); + // + bool Collide(const Ray& world_ray, const AABBTree* tree, Container& box_indices); + // Settings + +#ifndef OPC_RAYHIT_CALLBACK + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Settings: enable or disable "closest hit" mode. + * \param flag [in] true to report closest hit only + * \see SetCulling(bool flag) + * \see SetMaxDist(float max_dist) + * \see SetDestination(StabbedFaces* sf) + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ void SetClosestHit(bool flag) { mClosestHit = flag; } +#endif + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Settings: enable or disable backface culling. + * \param flag [in] true to enable backface culling + * \see SetClosestHit(bool flag) + * \see SetMaxDist(float max_dist) + * \see SetDestination(StabbedFaces* sf) + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ void SetCulling(bool flag) { mCulling = flag; } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Settings: sets the higher distance bound. + * \param max_dist [in] higher distance bound. Default = maximal value, for ray queries (else segment) + * \see SetClosestHit(bool flag) + * \see SetCulling(bool flag) + * \see SetDestination(StabbedFaces* sf) + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ void SetMaxDist(float max_dist=MAX_FLOAT) { mMaxDist = max_dist; } + +#ifdef OPC_RAYHIT_CALLBACK + inline_ void SetHitCallback(HitCallback cb) { mHitCallback = cb; } + inline_ void SetUserData(void* user_data) { mUserData = user_data; } +#else + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Settings: sets the destination array for stabbed faces. + * \param cf [in] destination array, filled during queries + * \see SetClosestHit(bool flag) + * \see SetCulling(bool flag) + * \see SetMaxDist(float max_dist) + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ void SetDestination(CollisionFaces* cf) { mStabbedFaces = cf; } +#endif + // Stats + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Stats: gets the number of Ray-BV overlap tests after a collision query. + * \see GetNbRayPrimTests() + * \see GetNbIntersections() + * \return the number of Ray-BV tests performed during last query + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ udword GetNbRayBVTests() const { return mNbRayBVTests; } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Stats: gets the number of Ray-Triangle overlap tests after a collision query. + * \see GetNbRayBVTests() + * \see GetNbIntersections() + * \return the number of Ray-Triangle tests performed during last query + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ udword GetNbRayPrimTests() const { return mNbRayPrimTests; } + + // In-out test + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Stats: gets the number of intersection found after a collision query. Can be used for in/out tests. + * \see GetNbRayBVTests() + * \see GetNbRayPrimTests() + * \return the number of valid intersections during last query + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ udword GetNbIntersections() const { return mNbIntersections; } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Validates current settings. You should call this method after all the settings and callbacks have been defined for a collider. + * \return null if everything is ok, else a string describing the problem + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + override(Collider) const char* ValidateSettings(); + + protected: + // Ray in local space + Point mOrigin; //!< Ray origin + Point mDir; //!< Ray direction (normalized) + Point mFDir; //!< fabsf(mDir) + Point mData, mData2; + // Stabbed faces + CollisionFace mStabbedFace; //!< Current stabbed face +#ifdef OPC_RAYHIT_CALLBACK + HitCallback mHitCallback; //!< Callback used to record a hit + void* mUserData; //!< User-defined data +#else + CollisionFaces* mStabbedFaces; //!< List of stabbed faces +#endif + // Stats + udword mNbRayBVTests; //!< Number of Ray-BV tests + udword mNbRayPrimTests; //!< Number of Ray-Primitive tests + // In-out test + udword mNbIntersections; //!< Number of valid intersections + // Dequantization coeffs + Point mCenterCoeff; + Point mExtentsCoeff; + // Settings + float mMaxDist; //!< Valid segment on the ray +#ifndef OPC_RAYHIT_CALLBACK + bool mClosestHit; //!< Report closest hit only +#endif + bool mCulling; //!< Stab culled faces or not + // Internal methods + void _SegmentStab(const AABBCollisionNode* node); + void _SegmentStab(const AABBNoLeafNode* node); + void _SegmentStab(const AABBQuantizedNode* node); + void _SegmentStab(const AABBQuantizedNoLeafNode* node); + void _SegmentStab(const AABBTreeNode* node, Container& box_indices); + void _RayStab(const AABBCollisionNode* node); + void _RayStab(const AABBNoLeafNode* node); + void _RayStab(const AABBQuantizedNode* node); + void _RayStab(const AABBQuantizedNoLeafNode* node); + void _RayStab(const AABBTreeNode* node, Container& box_indices); + // Overlap tests + inline_ BOOL RayAABBOverlap(const Point& center, const Point& extents); + inline_ BOOL SegmentAABBOverlap(const Point& center, const Point& extents); + inline_ BOOL RayTriOverlap(const Point& vert0, const Point& vert1, const Point& vert2); + // Init methods + BOOL InitQuery(const Ray& world_ray, const Matrix4x4* world=null, udword* face_id=null); + }; + +#endif // __OPC_RAYCOLLIDER_H__ diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_RayTriOverlap.h b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_RayTriOverlap.h new file mode 100644 index 00000000..11f21214 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_RayTriOverlap.h @@ -0,0 +1,106 @@ +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#define LOCAL_EPSILON 0.000001f + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Computes a ray-triangle intersection test. + * Original code from Tomas Möller's "Fast Minimum Storage Ray-Triangle Intersection". + * It's been optimized a bit with integer code, and modified to return a non-intersection if distance from + * ray origin to triangle is negative. + * + * \param vert0 [in] triangle vertex + * \param vert1 [in] triangle vertex + * \param vert2 [in] triangle vertex + * \return true on overlap. mStabbedFace is filled with relevant info. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +inline_ BOOL RayCollider::RayTriOverlap(const Point& vert0, const Point& vert1, const Point& vert2) +{ + // Stats + mNbRayPrimTests++; + + // Find vectors for two edges sharing vert0 + Point edge1 = vert1 - vert0; + Point edge2 = vert2 - vert0; + + // Begin calculating determinant - also used to calculate U parameter + Point pvec = mDir^edge2; + + // If determinant is near zero, ray lies in plane of triangle + float det = edge1|pvec; + + if(mCulling) + { + if(det 0. So we can use integer cmp. + + // Calculate distance from vert0 to ray origin + Point tvec = mOrigin - vert0; + + // Calculate U parameter and test bounds + mStabbedFace.mU = tvec|pvec; +// if(IR(u)&0x80000000 || u>det) return FALSE; + if(IS_NEGATIVE_FLOAT(mStabbedFace.mU) || IR(mStabbedFace.mU)>IR(det)) return FALSE; + + // Prepare to test V parameter + Point qvec = tvec^edge1; + + // Calculate V parameter and test bounds + mStabbedFace.mV = mDir|qvec; + if(IS_NEGATIVE_FLOAT(mStabbedFace.mV) || mStabbedFace.mU+mStabbedFace.mV>det) return FALSE; + + // Calculate t, scale parameters, ray intersects triangle + mStabbedFace.mDistance = edge2|qvec; + // Det > 0 so we can early exit here + // Intersection point is valid if distance is positive (else it can just be a face behind the orig point) + if(IS_NEGATIVE_FLOAT(mStabbedFace.mDistance)) return FALSE; + // Else go on + float OneOverDet = 1.0f / det; + mStabbedFace.mDistance *= OneOverDet; + mStabbedFace.mU *= OneOverDet; + mStabbedFace.mV *= OneOverDet; + } + else + { + // the non-culling branch + if(det>-LOCAL_EPSILON && det1.0f) return FALSE; + if(IS_NEGATIVE_FLOAT(mStabbedFace.mU) || IR(mStabbedFace.mU)>IEEE_1_0) return FALSE; + + // prepare to test V parameter + Point qvec = tvec^edge1; + + // Calculate V parameter and test bounds + mStabbedFace.mV = (mDir|qvec) * OneOverDet; + if(IS_NEGATIVE_FLOAT(mStabbedFace.mV) || mStabbedFace.mU+mStabbedFace.mV>1.0f) return FALSE; + + // Calculate t, ray intersects triangle + mStabbedFace.mDistance = (edge2|qvec) * OneOverDet; + // Intersection point is valid if distance is positive (else it can just be a face behind the orig point) + if(IS_NEGATIVE_FLOAT(mStabbedFace.mDistance)) return FALSE; + } + return TRUE; +} diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_Settings.h b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_Settings.h new file mode 100644 index 00000000..1074a0dc --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_Settings.h @@ -0,0 +1,58 @@ +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains compilation flags. + * \file OPC_Settings.h + * \author Pierre Terdiman + * \date May, 12, 2001 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef __OPC_SETTINGS_H__ +#define __OPC_SETTINGS_H__ + + //! Use CPU comparisons (comment that line to use standard FPU compares) + #define OPC_CPU_COMPARE + + //! Use FCOMI / FCMOV on Pentium-Pro based processors (comment that line to use plain C++) + #define OPC_USE_FCOMI + + //! Use epsilon value in tri-tri overlap test + #define OPC_TRITRI_EPSILON_TEST + + //! Use tree-coherence or not [not implemented yet] +// #define OPC_USE_TREE_COHERENCE + + //! Use callbacks or direct pointers. Using callbacks might be a bit slower (but probably not much) +// #define OPC_USE_CALLBACKS + + //! Support triangle and vertex strides or not. Using strides might be a bit slower (but probably not much) +// #define OPC_USE_STRIDE + + //! Discard negative pointer in vanilla trees + #define OPC_NO_NEG_VANILLA_TREE + + //! Use a callback in the ray collider + #define OPC_RAYHIT_CALLBACK + + // NB: no compilation flag to enable/disable stats since they're actually needed in the box/box overlap test + +#endif //__OPC_SETTINGS_H__ \ No newline at end of file diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_SphereAABBOverlap.h b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_SphereAABBOverlap.h new file mode 100644 index 00000000..acc97abd --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_SphereAABBOverlap.h @@ -0,0 +1,145 @@ +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Sphere-AABB overlap test, based on Jim Arvo's code. + * \param center [in] box center + * \param extents [in] box extents + * \return TRUE on overlap + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +inline_ BOOL SphereCollider::SphereAABBOverlap(const Point& center, const Point& extents) +{ + // Stats + mNbVolumeBVTests++; + + float d = 0.0f; + + //find the square of the distance + //from the sphere to the box +#ifdef OLDIES + for(udword i=0;i<3;i++) + { + float tmp = mCenter[i] - center[i]; + float s = tmp + extents[i]; + + if(s<0.0f) d += s*s; + else + { + s = tmp - extents[i]; + if(s>0.0f) d += s*s; + } + } +#endif + +//#ifdef NEW_TEST + +// float tmp = mCenter.x - center.x; +// float s = tmp + extents.x; + + float tmp,s; + + tmp = mCenter.x - center.x; + s = tmp + extents.x; + + if(s<0.0f) + { + d += s*s; + if(d>mRadius2) return FALSE; + } + else + { + s = tmp - extents.x; + if(s>0.0f) + { + d += s*s; + if(d>mRadius2) return FALSE; + } + } + + tmp = mCenter.y - center.y; + s = tmp + extents.y; + + if(s<0.0f) + { + d += s*s; + if(d>mRadius2) return FALSE; + } + else + { + s = tmp - extents.y; + if(s>0.0f) + { + d += s*s; + if(d>mRadius2) return FALSE; + } + } + + tmp = mCenter.z - center.z; + s = tmp + extents.z; + + if(s<0.0f) + { + d += s*s; + if(d>mRadius2) return FALSE; + } + else + { + s = tmp - extents.z; + if(s>0.0f) + { + d += s*s; + if(d>mRadius2) return FALSE; + } + } +//#endif + +#ifdef OLDIES +// Point Min = center - extents; +// Point Max = center + extents; + + float d = 0.0f; + + //find the square of the distance + //from the sphere to the box + for(udword i=0;i<3;i++) + { +float Min = center[i] - extents[i]; + +// if(mCenter[i]Max[i]) + if(mCenter[i]>Max) + { + float s = mCenter[i] - Max; + d += s*s; + } + } + } +#endif + return d <= mRadius2; +} diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_SphereCollider.cpp b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_SphereCollider.cpp new file mode 100644 index 00000000..485bd00d --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_SphereCollider.cpp @@ -0,0 +1,735 @@ +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code for a sphere collider. + * \file OPC_SphereCollider.cpp + * \author Pierre Terdiman + * \date June, 2, 2001 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains a sphere-vs-tree collider. + * This class performs a collision test between a sphere and an AABB tree. You can use this to do a standard player vs world collision, + * in a Nettle/Telemachos way. It doesn't suffer from all reported bugs in those two classic codes - the "new" one by Paul Nettle is a + * debuggued version I think. Collision response can be driven by reported collision data - it works extremely well for me. In sake of + * efficiency, all meshes (that is, all AABB trees) should of course also be kept in an extra hierarchical structure (octree, whatever). + * + * \class SphereCollider + * \author Pierre Terdiman + * \version 1.3 + * \date June, 2, 2001 +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Precompiled Header +#include "Stdafx.h" + +using namespace Opcode; + +#include "OPC_SphereAABBOverlap.h" +#include "OPC_SphereTriOverlap.h" + +#define SET_CONTACT(prim_index, flag) \ + /* Set contact status */ \ + mFlags |= flag; \ + mTouchedPrimitives->Add(prim_index); + +//! Sphere-triangle overlap test +#define SPHERE_PRIM(prim_index, flag) \ + /* Request vertices from the app */ \ + VertexPointers VP; mIMesh->GetTriangle(VP, prim_index); \ + \ + /* Perform sphere-tri overlap test */ \ + if(SphereTriOverlap(*VP.Vertex[0], *VP.Vertex[1], *VP.Vertex[2])) \ + { \ + SET_CONTACT(prim_index, flag) \ + } + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Constructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +SphereCollider::SphereCollider() +{ + mCenter.Zero(); + mRadius2 = 0.0f; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Destructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +SphereCollider::~SphereCollider() +{ +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Generic collision query for generic OPCODE models. After the call, access the results: + * - with GetContactStatus() + * - with GetNbTouchedPrimitives() + * - with GetTouchedPrimitives() + * + * \param cache [in/out] a sphere cache + * \param sphere [in] collision sphere in local space + * \param model [in] Opcode model to collide with + * \param worlds [in] sphere's world matrix, or null + * \param worldm [in] model's world matrix, or null + * \return true if success + * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool SphereCollider::Collide(SphereCache& cache, const Sphere& sphere, const Model& model, const Matrix4x4* worlds, const Matrix4x4* worldm) +{ + // Checkings + if(!Setup(&model)) return false; + + // Init collision query + if(InitQuery(cache, sphere, worlds, worldm)) return true; + + if(!model.HasLeafNodes()) + { + if(model.IsQuantized()) + { + const AABBQuantizedNoLeafTree* Tree = (const AABBQuantizedNoLeafTree*)model.GetTree(); + + // Setup dequantization coeffs + mCenterCoeff = Tree->mCenterCoeff; + mExtentsCoeff = Tree->mExtentsCoeff; + + // Perform collision query + if(SkipPrimitiveTests()) _CollideNoPrimitiveTest(Tree->GetNodes()); + else _Collide(Tree->GetNodes()); + } + else + { + const AABBNoLeafTree* Tree = (const AABBNoLeafTree*)model.GetTree(); + + // Perform collision query + if(SkipPrimitiveTests()) _CollideNoPrimitiveTest(Tree->GetNodes()); + else _Collide(Tree->GetNodes()); + } + } + else + { + if(model.IsQuantized()) + { + const AABBQuantizedTree* Tree = (const AABBQuantizedTree*)model.GetTree(); + + // Setup dequantization coeffs + mCenterCoeff = Tree->mCenterCoeff; + mExtentsCoeff = Tree->mExtentsCoeff; + + // Perform collision query + if(SkipPrimitiveTests()) _CollideNoPrimitiveTest(Tree->GetNodes()); + else _Collide(Tree->GetNodes()); + } + else + { + const AABBCollisionTree* Tree = (const AABBCollisionTree*)model.GetTree(); + + // Perform collision query + if(SkipPrimitiveTests()) _CollideNoPrimitiveTest(Tree->GetNodes()); + else _Collide(Tree->GetNodes()); + } + } + return true; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Initializes a collision query : + * - reset stats & contact status + * - setup matrices + * - check temporal coherence + * + * \param cache [in/out] a sphere cache + * \param sphere [in] sphere in local space + * \param worlds [in] sphere's world matrix, or null + * \param worldm [in] model's world matrix, or null + * \return TRUE if we can return immediately + * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +BOOL SphereCollider::InitQuery(SphereCache& cache, const Sphere& sphere, const Matrix4x4* worlds, const Matrix4x4* worldm) +{ + // 1) Call the base method + VolumeCollider::InitQuery(); + + // 2) Compute sphere in model space: + // - Precompute R^2 + mRadius2 = sphere.mRadius * sphere.mRadius; + // - Compute center position + mCenter = sphere.mCenter; + // -> to world space + if(worlds) mCenter *= *worlds; + // -> to model space + if(worldm) + { + // Invert model matrix + Matrix4x4 InvWorldM; + InvertPRMatrix(InvWorldM, *worldm); + + mCenter *= InvWorldM; + } + + // 3) Setup destination pointer + mTouchedPrimitives = &cache.TouchedPrimitives; + + // 4) Special case: 1-triangle meshes [Opcode 1.3] + if(mCurrentModel && mCurrentModel->HasSingleNode()) + { + if(!SkipPrimitiveTests()) + { + // We simply perform the BV-Prim overlap test each time. We assume single triangle has index 0. + mTouchedPrimitives->Reset(); + + // Perform overlap test between the unique triangle and the sphere (and set contact status if needed) + SPHERE_PRIM(udword(0), OPC_CONTACT) + + // Return immediately regardless of status + return TRUE; + } + } + + // 5) Check temporal coherence : + if(TemporalCoherenceEnabled()) + { + // Here we use temporal coherence + // => check results from previous frame before performing the collision query + if(FirstContactEnabled()) + { + // We're only interested in the first contact found => test the unique previously touched face + if(mTouchedPrimitives->GetNbEntries()) + { + // Get index of previously touched face = the first entry in the array + udword PreviouslyTouchedFace = mTouchedPrimitives->GetEntry(0); + + // Then reset the array: + // - if the overlap test below is successful, the index we'll get added back anyway + // - if it isn't, then the array should be reset anyway for the normal query + mTouchedPrimitives->Reset(); + + // Perform overlap test between the cached triangle and the sphere (and set contact status if needed) + SPHERE_PRIM(PreviouslyTouchedFace, OPC_TEMPORAL_CONTACT) + + // Return immediately if possible + if(GetContactStatus()) return TRUE; + } + // else no face has been touched during previous query + // => we'll have to perform a normal query + } + else + { + // We're interested in all contacts =>test the new real sphere N(ew) against the previous fat sphere P(revious): + float r = sqrtf(cache.FatRadius2) - sphere.mRadius; + if(IsCacheValid(cache) && cache.Center.SquareDistance(mCenter) < r*r) + { + // - if N is included in P, return previous list + // => we simply leave the list (mTouchedFaces) unchanged + + // Set contact status if needed + if(mTouchedPrimitives->GetNbEntries()) mFlags |= OPC_TEMPORAL_CONTACT; + + // In any case we don't need to do a query + return TRUE; + } + else + { + // - else do the query using a fat N + + // Reset cache since we'll about to perform a real query + mTouchedPrimitives->Reset(); + + // Make a fat sphere so that coherence will work for subsequent frames + mRadius2 *= cache.FatCoeff; +// mRadius2 = (sphere.mRadius * cache.FatCoeff)*(sphere.mRadius * cache.FatCoeff); + + // Update cache with query data (signature for cached faces) + cache.Center = mCenter; + cache.FatRadius2 = mRadius2; + } + } + } + else + { + // Here we don't use temporal coherence => do a normal query + mTouchedPrimitives->Reset(); + } + + return FALSE; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Collision query for vanilla AABB trees. + * \param cache [in/out] a sphere cache + * \param sphere [in] collision sphere in world space + * \param tree [in] AABB tree + * \return true if success + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool SphereCollider::Collide(SphereCache& cache, const Sphere& sphere, const AABBTree* tree) +{ + // This is typically called for a scene tree, full of -AABBs-, not full of triangles. + // So we don't really have "primitives" to deal with. Hence it doesn't work with + // "FirstContact" + "TemporalCoherence". + ASSERT( !(FirstContactEnabled() && TemporalCoherenceEnabled()) ); + + // Checkings + if(!tree) return false; + + // Init collision query + if(InitQuery(cache, sphere)) return true; + + // Perform collision query + _Collide(tree); + + return true; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Checks the sphere completely contains the box. In which case we can end the query sooner. + * \param bc [in] box center + * \param be [in] box extents + * \return true if the sphere contains the whole box + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +inline_ BOOL SphereCollider::SphereContainsBox(const Point& bc, const Point& be) +{ + // I assume if all 8 box vertices are inside the sphere, so does the whole box. + // Sounds ok but maybe there's a better way? + Point p; + p.x=bc.x+be.x; p.y=bc.y+be.y; p.z=bc.z+be.z; if(mCenter.SquareDistance(p)>=mRadius2) return FALSE; + p.x=bc.x-be.x; if(mCenter.SquareDistance(p)>=mRadius2) return FALSE; + p.x=bc.x+be.x; p.y=bc.y-be.y; if(mCenter.SquareDistance(p)>=mRadius2) return FALSE; + p.x=bc.x-be.x; if(mCenter.SquareDistance(p)>=mRadius2) return FALSE; + p.x=bc.x+be.x; p.y=bc.y+be.y; p.z=bc.z-be.z; if(mCenter.SquareDistance(p)>=mRadius2) return FALSE; + p.x=bc.x-be.x; if(mCenter.SquareDistance(p)>=mRadius2) return FALSE; + p.x=bc.x+be.x; p.y=bc.y-be.y; if(mCenter.SquareDistance(p)>=mRadius2) return FALSE; + p.x=bc.x-be.x; if(mCenter.SquareDistance(p)>=mRadius2) return FALSE; + + return TRUE; +} + +#define TEST_BOX_IN_SPHERE(center, extents) \ + if(SphereContainsBox(center, extents)) \ + { \ + /* Set contact status */ \ + mFlags |= OPC_CONTACT; \ + _Dump(node); \ + return; \ + } + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for normal AABB trees. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void SphereCollider::_Collide(const AABBCollisionNode* node) +{ + // Perform Sphere-AABB overlap test + if(!SphereAABBOverlap(node->mAABB.mCenter, node->mAABB.mExtents)) return; + + TEST_BOX_IN_SPHERE(node->mAABB.mCenter, node->mAABB.mExtents) + + if(node->IsLeaf()) + { + SPHERE_PRIM(node->GetPrimitive(), OPC_CONTACT) + } + else + { + _Collide(node->GetPos()); + + if(ContactFound()) return; + + _Collide(node->GetNeg()); + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for normal AABB trees, without primitive tests. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void SphereCollider::_CollideNoPrimitiveTest(const AABBCollisionNode* node) +{ + // Perform Sphere-AABB overlap test + if(!SphereAABBOverlap(node->mAABB.mCenter, node->mAABB.mExtents)) return; + + TEST_BOX_IN_SPHERE(node->mAABB.mCenter, node->mAABB.mExtents) + + if(node->IsLeaf()) + { + SET_CONTACT(node->GetPrimitive(), OPC_CONTACT) + } + else + { + _CollideNoPrimitiveTest(node->GetPos()); + + if(ContactFound()) return; + + _CollideNoPrimitiveTest(node->GetNeg()); + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for quantized AABB trees. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void SphereCollider::_Collide(const AABBQuantizedNode* node) +{ + // Dequantize box + const QuantizedAABB& Box = node->mAABB; + const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); + const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); + + // Perform Sphere-AABB overlap test + if(!SphereAABBOverlap(Center, Extents)) return; + + TEST_BOX_IN_SPHERE(Center, Extents) + + if(node->IsLeaf()) + { + SPHERE_PRIM(node->GetPrimitive(), OPC_CONTACT) + } + else + { + _Collide(node->GetPos()); + + if(ContactFound()) return; + + _Collide(node->GetNeg()); + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for quantized AABB trees, without primitive tests. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void SphereCollider::_CollideNoPrimitiveTest(const AABBQuantizedNode* node) +{ + // Dequantize box + const QuantizedAABB& Box = node->mAABB; + const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); + const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); + + // Perform Sphere-AABB overlap test + if(!SphereAABBOverlap(Center, Extents)) return; + + TEST_BOX_IN_SPHERE(Center, Extents) + + if(node->IsLeaf()) + { + SET_CONTACT(node->GetPrimitive(), OPC_CONTACT) + } + else + { + _CollideNoPrimitiveTest(node->GetPos()); + + if(ContactFound()) return; + + _CollideNoPrimitiveTest(node->GetNeg()); + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for no-leaf AABB trees. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void SphereCollider::_Collide(const AABBNoLeafNode* node) +{ + // Perform Sphere-AABB overlap test + if(!SphereAABBOverlap(node->mAABB.mCenter, node->mAABB.mExtents)) return; + + TEST_BOX_IN_SPHERE(node->mAABB.mCenter, node->mAABB.mExtents) + + if(node->HasPosLeaf()) { SPHERE_PRIM(node->GetPosPrimitive(), OPC_CONTACT) } + else _Collide(node->GetPos()); + + if(ContactFound()) return; + + if(node->HasNegLeaf()) { SPHERE_PRIM(node->GetNegPrimitive(), OPC_CONTACT) } + else _Collide(node->GetNeg()); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for no-leaf AABB trees, without primitive tests. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void SphereCollider::_CollideNoPrimitiveTest(const AABBNoLeafNode* node) +{ + // Perform Sphere-AABB overlap test + if(!SphereAABBOverlap(node->mAABB.mCenter, node->mAABB.mExtents)) return; + + TEST_BOX_IN_SPHERE(node->mAABB.mCenter, node->mAABB.mExtents) + + if(node->HasPosLeaf()) { SET_CONTACT(node->GetPosPrimitive(), OPC_CONTACT) } + else _CollideNoPrimitiveTest(node->GetPos()); + + if(ContactFound()) return; + + if(node->HasNegLeaf()) { SET_CONTACT(node->GetNegPrimitive(), OPC_CONTACT) } + else _CollideNoPrimitiveTest(node->GetNeg()); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for quantized no-leaf AABB trees. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void SphereCollider::_Collide(const AABBQuantizedNoLeafNode* node) +{ + // Dequantize box + const QuantizedAABB& Box = node->mAABB; + const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); + const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); + + // Perform Sphere-AABB overlap test + if(!SphereAABBOverlap(Center, Extents)) return; + + TEST_BOX_IN_SPHERE(Center, Extents) + + if(node->HasPosLeaf()) { SPHERE_PRIM(node->GetPosPrimitive(), OPC_CONTACT) } + else _Collide(node->GetPos()); + + if(ContactFound()) return; + + if(node->HasNegLeaf()) { SPHERE_PRIM(node->GetNegPrimitive(), OPC_CONTACT) } + else _Collide(node->GetNeg()); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for quantized no-leaf AABB trees, without primitive tests. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void SphereCollider::_CollideNoPrimitiveTest(const AABBQuantizedNoLeafNode* node) +{ + // Dequantize box + const QuantizedAABB& Box = node->mAABB; + const Point Center(float(Box.mCenter[0]) * mCenterCoeff.x, float(Box.mCenter[1]) * mCenterCoeff.y, float(Box.mCenter[2]) * mCenterCoeff.z); + const Point Extents(float(Box.mExtents[0]) * mExtentsCoeff.x, float(Box.mExtents[1]) * mExtentsCoeff.y, float(Box.mExtents[2]) * mExtentsCoeff.z); + + // Perform Sphere-AABB overlap test + if(!SphereAABBOverlap(Center, Extents)) return; + + TEST_BOX_IN_SPHERE(Center, Extents) + + if(node->HasPosLeaf()) { SET_CONTACT(node->GetPosPrimitive(), OPC_CONTACT) } + else _CollideNoPrimitiveTest(node->GetPos()); + + if(ContactFound()) return; + + if(node->HasNegLeaf()) { SET_CONTACT(node->GetNegPrimitive(), OPC_CONTACT) } + else _CollideNoPrimitiveTest(node->GetNeg()); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for vanilla AABB trees. + * \param node [in] current collision node + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void SphereCollider::_Collide(const AABBTreeNode* node) +{ + // Perform Sphere-AABB overlap test + Point Center, Extents; + node->GetAABB()->GetCenter(Center); + node->GetAABB()->GetExtents(Extents); + if(!SphereAABBOverlap(Center, Extents)) return; + + if(node->IsLeaf() || SphereContainsBox(Center, Extents)) + { + mFlags |= OPC_CONTACT; + mTouchedPrimitives->Add(node->GetPrimitives(), node->GetNbPrimitives()); + } + else + { + _Collide(node->GetPos()); + _Collide(node->GetNeg()); + } +} + + + + + + + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Constructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +HybridSphereCollider::HybridSphereCollider() +{ +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Destructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +HybridSphereCollider::~HybridSphereCollider() +{ +} + +bool HybridSphereCollider::Collide(SphereCache& cache, const Sphere& sphere, const HybridModel& model, const Matrix4x4* worlds, const Matrix4x4* worldm) +{ + // We don't want primitive tests here! + mFlags |= OPC_NO_PRIMITIVE_TESTS; + + // Checkings + if(!Setup(&model)) return false; + + // Init collision query + if(InitQuery(cache, sphere, worlds, worldm)) return true; + + // Special case for 1-leaf trees + if(mCurrentModel && mCurrentModel->HasSingleNode()) + { + // Here we're supposed to perform a normal query, except our tree has a single node, i.e. just a few triangles + udword Nb = mIMesh->GetNbTriangles(); + + // Loop through all triangles + for(udword i=0;imCenterCoeff; + mExtentsCoeff = Tree->mExtentsCoeff; + + // Perform collision query - we don't want primitive tests here! + _CollideNoPrimitiveTest(Tree->GetNodes()); + } + else + { + const AABBNoLeafTree* Tree = (const AABBNoLeafTree*)model.GetTree(); + + // Perform collision query - we don't want primitive tests here! + _CollideNoPrimitiveTest(Tree->GetNodes()); + } + } + else + { + if(model.IsQuantized()) + { + const AABBQuantizedTree* Tree = (const AABBQuantizedTree*)model.GetTree(); + + // Setup dequantization coeffs + mCenterCoeff = Tree->mCenterCoeff; + mExtentsCoeff = Tree->mExtentsCoeff; + + // Perform collision query - we don't want primitive tests here! + _CollideNoPrimitiveTest(Tree->GetNodes()); + } + else + { + const AABBCollisionTree* Tree = (const AABBCollisionTree*)model.GetTree(); + + // Perform collision query - we don't want primitive tests here! + _CollideNoPrimitiveTest(Tree->GetNodes()); + } + } + + // We only have a list of boxes so far + if(GetContactStatus()) + { + // Reset contact status, since it currently only reflects collisions with leaf boxes + Collider::InitQuery(); + + // Change dest container so that we can use built-in overlap tests and get collided primitives + cache.TouchedPrimitives.Reset(); + mTouchedPrimitives = &cache.TouchedPrimitives; + + // Read touched leaf boxes + udword Nb = mTouchedBoxes.GetNbEntries(); + const udword* Touched = mTouchedBoxes.GetEntries(); + + const LeafTriangles* LT = model.GetLeafTriangles(); + const udword* Indices = model.GetIndices(); + + // Loop through touched leaves + while(Nb--) + { + const LeafTriangles& CurrentLeaf = LT[*Touched++]; + + // Each leaf box has a set of triangles + udword NbTris = CurrentLeaf.GetNbTriangles(); + if(Indices) + { + const udword* T = &Indices[CurrentLeaf.GetTriangleIndex()]; + + // Loop through triangles and test each of them + while(NbTris--) + { + udword TriangleIndex = *T++; + SPHERE_PRIM(TriangleIndex, OPC_CONTACT) + } + } + else + { + udword BaseIndex = CurrentLeaf.GetTriangleIndex(); + + // Loop through triangles and test each of them + while(NbTris--) + { + udword TriangleIndex = BaseIndex++; + SPHERE_PRIM(TriangleIndex, OPC_CONTACT) + } + } + } + } + + return true; +} diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_SphereCollider.h b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_SphereCollider.h new file mode 100644 index 00000000..d4aa861e --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_SphereCollider.h @@ -0,0 +1,105 @@ +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code for a sphere collider. + * \file OPC_SphereCollider.h + * \author Pierre Terdiman + * \date June, 2, 2001 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef __OPC_SPHERECOLLIDER_H__ +#define __OPC_SPHERECOLLIDER_H__ + + struct OPCODE_API SphereCache : VolumeCache + { + SphereCache() : Center(0.0f,0.0f,0.0f), FatRadius2(0.0f), FatCoeff(1.1f) {} + ~SphereCache() {} + + // Cached faces signature + Point Center; //!< Sphere used when performing the query resulting in cached faces + float FatRadius2; //!< Sphere used when performing the query resulting in cached faces + // User settings + float FatCoeff; //!< mRadius2 multiplier used to create a fat sphere + }; + + class OPCODE_API SphereCollider : public VolumeCollider + { + public: + // Constructor / Destructor + SphereCollider(); + virtual ~SphereCollider(); + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Generic collision query for generic OPCODE models. After the call, access the results: + * - with GetContactStatus() + * - with GetNbTouchedPrimitives() + * - with GetTouchedPrimitives() + * + * \param cache [in/out] a sphere cache + * \param sphere [in] collision sphere in local space + * \param model [in] Opcode model to collide with + * \param worlds [in] sphere's world matrix, or null + * \param worldm [in] model's world matrix, or null + * \return true if success + * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only. + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + bool Collide(SphereCache& cache, const Sphere& sphere, const Model& model, const Matrix4x4* worlds=null, const Matrix4x4* worldm=null); + + // + bool Collide(SphereCache& cache, const Sphere& sphere, const AABBTree* tree); + protected: + // Sphere in model space + Point mCenter; //!< Sphere center + float mRadius2; //!< Sphere radius squared + // Internal methods + void _Collide(const AABBCollisionNode* node); + void _Collide(const AABBNoLeafNode* node); + void _Collide(const AABBQuantizedNode* node); + void _Collide(const AABBQuantizedNoLeafNode* node); + void _Collide(const AABBTreeNode* node); + void _CollideNoPrimitiveTest(const AABBCollisionNode* node); + void _CollideNoPrimitiveTest(const AABBNoLeafNode* node); + void _CollideNoPrimitiveTest(const AABBQuantizedNode* node); + void _CollideNoPrimitiveTest(const AABBQuantizedNoLeafNode* node); + // Overlap tests + inline_ BOOL SphereContainsBox(const Point& bc, const Point& be); + inline_ BOOL SphereAABBOverlap(const Point& center, const Point& extents); + BOOL SphereTriOverlap(const Point& vert0, const Point& vert1, const Point& vert2); + // Init methods + BOOL InitQuery(SphereCache& cache, const Sphere& sphere, const Matrix4x4* worlds=null, const Matrix4x4* worldm=null); + }; + + class OPCODE_API HybridSphereCollider : public SphereCollider + { + public: + // Constructor / Destructor + HybridSphereCollider(); + virtual ~HybridSphereCollider(); + + bool Collide(SphereCache& cache, const Sphere& sphere, const HybridModel& model, const Matrix4x4* worlds=null, const Matrix4x4* worldm=null); + protected: + Container mTouchedBoxes; + }; + +#endif // __OPC_SPHERECOLLIDER_H__ diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_SphereTriOverlap.h b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_SphereTriOverlap.h new file mode 100644 index 00000000..4542e511 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_SphereTriOverlap.h @@ -0,0 +1,203 @@ +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +// This is collision detection. If you do another distance test for collision *response*, +// if might be useful to simply *skip* the test below completely, and report a collision. +// - if sphere-triangle overlap, result is ok +// - if they don't, we'll discard them during collision response with a similar test anyway +// Overall this approach should run faster. + +// Original code by David Eberly in Magic. +BOOL SphereCollider::SphereTriOverlap(const Point& vert0, const Point& vert1, const Point& vert2) +{ + // Stats + mNbVolumePrimTests++; + + // Early exit if one of the vertices is inside the sphere + Point kDiff = vert2 - mCenter; + float fC = kDiff.SquareMagnitude(); + if(fC <= mRadius2) return TRUE; + + kDiff = vert1 - mCenter; + fC = kDiff.SquareMagnitude(); + if(fC <= mRadius2) return TRUE; + + kDiff = vert0 - mCenter; + fC = kDiff.SquareMagnitude(); + if(fC <= mRadius2) return TRUE; + + // Else do the full distance test + Point TriEdge0 = vert1 - vert0; + Point TriEdge1 = vert2 - vert0; + +//Point kDiff = vert0 - mCenter; + float fA00 = TriEdge0.SquareMagnitude(); + float fA01 = TriEdge0 | TriEdge1; + float fA11 = TriEdge1.SquareMagnitude(); + float fB0 = kDiff | TriEdge0; + float fB1 = kDiff | TriEdge1; +//float fC = kDiff.SquareMagnitude(); + float fDet = fabsf(fA00*fA11 - fA01*fA01); + float u = fA01*fB1-fA11*fB0; + float v = fA01*fB0-fA00*fB1; + float SqrDist; + + if(u + v <= fDet) + { + if(u < 0.0f) + { + if(v < 0.0f) // region 4 + { + if(fB0 < 0.0f) + { +// v = 0.0f; + if(-fB0>=fA00) { /*u = 1.0f;*/ SqrDist = fA00+2.0f*fB0+fC; } + else { u = -fB0/fA00; SqrDist = fB0*u+fC; } + } + else + { +// u = 0.0f; + if(fB1>=0.0f) { /*v = 0.0f;*/ SqrDist = fC; } + else if(-fB1>=fA11) { /*v = 1.0f;*/ SqrDist = fA11+2.0f*fB1+fC; } + else { v = -fB1/fA11; SqrDist = fB1*v+fC; } + } + } + else // region 3 + { +// u = 0.0f; + if(fB1>=0.0f) { /*v = 0.0f;*/ SqrDist = fC; } + else if(-fB1>=fA11) { /*v = 1.0f;*/ SqrDist = fA11+2.0f*fB1+fC; } + else { v = -fB1/fA11; SqrDist = fB1*v+fC; } + } + } + else if(v < 0.0f) // region 5 + { +// v = 0.0f; + if(fB0>=0.0f) { /*u = 0.0f;*/ SqrDist = fC; } + else if(-fB0>=fA00) { /*u = 1.0f;*/ SqrDist = fA00+2.0f*fB0+fC; } + else { u = -fB0/fA00; SqrDist = fB0*u+fC; } + } + else // region 0 + { + // minimum at interior point + if(fDet==0.0f) + { +// u = 0.0f; +// v = 0.0f; + SqrDist = MAX_FLOAT; + } + else + { + float fInvDet = 1.0f/fDet; + u *= fInvDet; + v *= fInvDet; + SqrDist = u*(fA00*u+fA01*v+2.0f*fB0) + v*(fA01*u+fA11*v+2.0f*fB1)+fC; + } + } + } + else + { + float fTmp0, fTmp1, fNumer, fDenom; + + if(u < 0.0f) // region 2 + { + fTmp0 = fA01 + fB0; + fTmp1 = fA11 + fB1; + if(fTmp1 > fTmp0) + { + fNumer = fTmp1 - fTmp0; + fDenom = fA00-2.0f*fA01+fA11; + if(fNumer >= fDenom) + { +// u = 1.0f; +// v = 0.0f; + SqrDist = fA00+2.0f*fB0+fC; + } + else + { + u = fNumer/fDenom; + v = 1.0f - u; + SqrDist = u*(fA00*u+fA01*v+2.0f*fB0) + v*(fA01*u+fA11*v+2.0f*fB1)+fC; + } + } + else + { +// u = 0.0f; + if(fTmp1 <= 0.0f) { /*v = 1.0f;*/ SqrDist = fA11+2.0f*fB1+fC; } + else if(fB1 >= 0.0f) { /*v = 0.0f;*/ SqrDist = fC; } + else { v = -fB1/fA11; SqrDist = fB1*v+fC; } + } + } + else if(v < 0.0f) // region 6 + { + fTmp0 = fA01 + fB1; + fTmp1 = fA00 + fB0; + if(fTmp1 > fTmp0) + { + fNumer = fTmp1 - fTmp0; + fDenom = fA00-2.0f*fA01+fA11; + if(fNumer >= fDenom) + { +// v = 1.0f; +// u = 0.0f; + SqrDist = fA11+2.0f*fB1+fC; + } + else + { + v = fNumer/fDenom; + u = 1.0f - v; + SqrDist = u*(fA00*u+fA01*v+2.0f*fB0) + v*(fA01*u+fA11*v+2.0f*fB1)+fC; + } + } + else + { +// v = 0.0f; + if(fTmp1 <= 0.0f) { /*u = 1.0f;*/ SqrDist = fA00+2.0f*fB0+fC; } + else if(fB0 >= 0.0f) { /*u = 0.0f;*/ SqrDist = fC; } + else { u = -fB0/fA00; SqrDist = fB0*u+fC; } + } + } + else // region 1 + { + fNumer = fA11 + fB1 - fA01 - fB0; + if(fNumer <= 0.0f) + { +// u = 0.0f; +// v = 1.0f; + SqrDist = fA11+2.0f*fB1+fC; + } + else + { + fDenom = fA00-2.0f*fA01+fA11; + if(fNumer >= fDenom) + { +// u = 1.0f; +// v = 0.0f; + SqrDist = fA00+2.0f*fB0+fC; + } + else + { + u = fNumer/fDenom; + v = 1.0f - u; + SqrDist = u*(fA00*u+fA01*v+2.0f*fB0) + v*(fA01*u+fA11*v+2.0f*fB1)+fC; + } + } + } + } + + return fabsf(SqrDist) < mRadius2; +} diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_SweepAndPrune.cpp b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_SweepAndPrune.cpp new file mode 100644 index 00000000..89280768 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_SweepAndPrune.cpp @@ -0,0 +1,673 @@ +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains an implementation of the sweep-and-prune algorithm (moved from Z-Collide) + * \file OPC_SweepAndPrune.cpp + * \author Pierre Terdiman + * \date January, 29, 2000 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Precompiled Header +#include "Stdafx.h" + +using namespace Opcode; + +inline_ void Sort(udword& id0, udword& id1) +{ + if(id0>id1) Swap(id0, id1); +} + + class Opcode::SAP_Element + { + public: + inline_ SAP_Element() {} + inline_ SAP_Element(udword id, SAP_Element* next) : mID(id), mNext(next) {} + inline_ ~SAP_Element() {} + + udword mID; + SAP_Element* mNext; + }; + + class Opcode::SAP_Box + { + public: + SAP_EndPoint* Min[3]; + SAP_EndPoint* Max[3]; + }; + + class Opcode::SAP_EndPoint + { + public: + float Value; // Min or Max value + SAP_EndPoint* Previous; // Previous EndPoint whose Value is smaller than ours (or null) + SAP_EndPoint* Next; // Next EndPoint whose Value is greater than ours (or null) + udword Data; // Parent box ID *2 | MinMax flag + + inline_ void SetData(udword box_id, BOOL is_max) { Data = (box_id<<1)|is_max; } + inline_ BOOL IsMax() const { return Data & 1; } + inline_ udword GetBoxID() const { return Data>>1; } + + inline_ void InsertAfter(SAP_EndPoint* element) + { + if(this!=element && this!=element->Next) + { + // Remove + if(Previous) Previous->Next = Next; + if(Next) Next->Previous = Previous; + + // Insert + Next = element->Next; + if(Next) Next->Previous = this; + + element->Next = this; + Previous = element; + } + } + + inline_ void InsertBefore(SAP_EndPoint* element) + { + if(this!=element && this!=element->Previous) + { + // Remove + if(Previous) Previous->Next = Next; + if(Next) Next->Previous = Previous; + + // Insert + Previous = element->Previous; + element->Previous = this; + + Next = element; + if(Previous) Previous->Next = this; + } + } + }; + + + + + + + + + + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Constructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +SAP_PairData::SAP_PairData() : + mNbElements (0), + mNbUsedElements (0), + mElementPool (null), + mFirstFree (null), + mNbObjects (0), + mArray (null) +{ +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Destructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +SAP_PairData::~SAP_PairData() +{ + Release(); +} + +void SAP_PairData::Release() +{ + mNbElements = 0; + mNbUsedElements = 0; + mNbObjects = 0; + DELETEARRAY(mElementPool); + DELETEARRAY(mArray); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Initializes. + * \param nb_objects [in] + * \return true if success + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool SAP_PairData::Init(udword nb_objects) +{ + // Make sure everything has been released + Release(); + if(!nb_objects) return false; + + mArray = new SAP_Element*[nb_objects]; + CHECKALLOC(mArray); + ZeroMemory(mArray, nb_objects*sizeof(SAP_Element*)); + mNbObjects = nb_objects; + + return true; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Remaps a pointer when pool gets resized. + * \param element [in/out] remapped element + * \param delta [in] offset in bytes + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +inline_ void Remap(SAP_Element*& element, udword delta) +{ + if(element) element = (SAP_Element*)(udword(element) + delta); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Gets a free element in the pool. + * \param id [in] element id + * \param next [in] next element + * \param remap [out] possible remapping offset + * \return the new element + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +SAP_Element* SAP_PairData::GetFreeElem(udword id, SAP_Element* next, udword* remap) +{ + if(remap) *remap = 0; + + SAP_Element* FreeElem; + if(mFirstFree) + { + // Recycle + FreeElem = mFirstFree; + mFirstFree = mFirstFree->mNext; // First free = next free (or null) + } + else + { + if(mNbUsedElements==mNbElements) + { + // Resize + mNbElements = mNbElements ? (mNbElements<<1) : 2; + + SAP_Element* NewElems = new SAP_Element[mNbElements]; + + if(mNbUsedElements) CopyMemory(NewElems, mElementPool, mNbUsedElements*sizeof(SAP_Element)); + + // Remap everything + { + udword Delta = udword(NewElems) - udword(mElementPool); + + for(udword i=0;imID = id; + FreeElem->mNext = next; + + return FreeElem; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Frees an element of the pool. + * \param elem [in] element to free/recycle + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +inline_ void SAP_PairData::FreeElem(SAP_Element* elem) +{ + elem->mNext = mFirstFree; // Next free + mFirstFree = elem; +} + +// Add a pair to the set. +void SAP_PairData::AddPair(udword id1, udword id2) +{ + // Order the ids + Sort(id1, id2); + + ASSERT(id1=mNbObjects) return; + + // Select the right list from "mArray". + SAP_Element* Current = mArray[id1]; + + if(!Current) + { + // Empty slot => create new element + mArray[id1] = GetFreeElem(id2, null); + } + else if(Current->mID>id2) + { + // The list is not empty but all elements are greater than id2 => insert id2 in the front. + mArray[id1] = GetFreeElem(id2, mArray[id1]); + } + else + { + // Else find the correct location in the sorted list (ascending order) and insert id2 there. + while(Current->mNext) + { + if(Current->mNext->mID > id2) break; + + Current = Current->mNext; + } + + if(Current->mID==id2) return; // The pair already exists + +// Current->mNext = GetFreeElem(id2, Current->mNext); + udword Delta; + SAP_Element* E = GetFreeElem(id2, Current->mNext, &Delta); + if(Delta) Remap(Current, Delta); + Current->mNext = E; + } +} + +// Delete a pair from the set. +void SAP_PairData::RemovePair(udword id1, udword id2) +{ + // Order the ids. + Sort(id1, id2); + + // Exit if the pair doesn't exist in the set + if(id1>=mNbObjects) return; + + // Otherwise, select the correct list. + SAP_Element* Current = mArray[id1]; + + // If this list is empty, the pair doesn't exist. + if(!Current) return; + + // Otherwise, if id2 is the first element, delete it. + if(Current->mID==id2) + { + mArray[id1] = Current->mNext; + FreeElem(Current); + } + else + { + // If id2 is not the first element, start traversing the sorted list. + while(Current->mNext) + { + // If we have moved too far away without hitting id2, then the pair doesn't exist + if(Current->mNext->mID > id2) return; + + // Otherwise, delete id2. + if(Current->mNext->mID == id2) + { + SAP_Element* Temp = Current->mNext; + Current->mNext = Temp->mNext; + FreeElem(Temp); + return; + } + Current = Current->mNext; + } + } +} + +void SAP_PairData::DumpPairs(Pairs& pairs) const +{ + // ### Ugly and slow + for(udword i=0;imIDmID); + Current = Current->mNext; + } + } +} + +void SAP_PairData::DumpPairs(PairCallback callback, void* user_data) const +{ + if(!callback) return; + + // ### Ugly and slow + for(udword i=0;imIDmID, user_data)) return; + Current = Current->mNext; + } + } +} + + + + + + + + + + + + + + + + + + + + + + + + + + + + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Constructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +SweepAndPrune::SweepAndPrune() +{ +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Destructor. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +SweepAndPrune::~SweepAndPrune() +{ +} + +void SweepAndPrune::GetPairs(Pairs& pairs) const +{ + mPairs.DumpPairs(pairs); +} + +void SweepAndPrune::GetPairs(PairCallback callback, void* user_data) const +{ + mPairs.DumpPairs(callback, user_data); +} + +bool SweepAndPrune::Init(udword nb_objects, const AABB** boxes) +{ + // 1) Create sorted lists + mNbObjects = nb_objects; + + mBoxes = new SAP_Box[nb_objects]; +// for(udword i=0;iGetMin(Axis); + Data[i*2+1] = boxes[i]->GetMax(Axis); + } + RadixSort RS; + const udword* Sorted = RS.Sort(Data, nb_objects*2).GetRanks(); + + SAP_EndPoint* PreviousEndPoint = null; + + for(udword i=0;i>1; + + ASSERT(BoxIndexValue = SortedCoord; +// CurrentEndPoint->IsMax = SortedIndex&1; // ### could be implicit ? +// CurrentEndPoint->ID = BoxIndex; // ### could be implicit ? + CurrentEndPoint->SetData(BoxIndex, SortedIndex&1); // ### could be implicit ? + CurrentEndPoint->Previous = PreviousEndPoint; + CurrentEndPoint->Next = null; + if(PreviousEndPoint) PreviousEndPoint->Next = CurrentEndPoint; + + if(CurrentEndPoint->IsMax()) mBoxes[BoxIndex].Max[Axis] = CurrentEndPoint; + else mBoxes[BoxIndex].Min[Axis] = CurrentEndPoint; + + PreviousEndPoint = CurrentEndPoint; + } + } + + DELETEARRAY(Data); + + CheckListsIntegrity(); + + // 2) Quickly find starting pairs + + mPairs.Init(nb_objects); + + { + Pairs P; + CompleteBoxPruning(nb_objects, boxes, P, Axes(AXES_XZY)); + for(udword i=0;iid0; + udword id1 = PP->id1; + + if(id0!=id1 && boxes[id0]->Intersect(*boxes[id1])) + { + mPairs.AddPair(id0, id1); + } + else ASSERT(0); + } + } + + return true; +} + +bool SweepAndPrune::CheckListsIntegrity() +{ + for(udword Axis=0;Axis<3;Axis++) + { + // Find list head + SAP_EndPoint* Current = mList[Axis]; + while(Current->Previous) Current = Current->Previous; + + udword Nb = 0; + + SAP_EndPoint* Previous = null; + while(Current) + { + Nb++; + + if(Previous) + { + ASSERT(Previous->Value <= Current->Value); + if(Previous->Value > Current->Value) return false; + } + + ASSERT(Current->Previous==Previous); + if(Current->Previous!=Previous) return false; + + Previous = Current; + Current = Current->Next; + } + + ASSERT(Nb==mNbObjects*2); + } + return true; +} + +inline_ BOOL Intersect(const AABB& a, const SAP_Box& b) +{ + if(b.Max[0]->Value < a.GetMin(0) || a.GetMax(0) < b.Min[0]->Value + || b.Max[1]->Value < a.GetMin(1) || a.GetMax(1) < b.Min[1]->Value + || b.Max[2]->Value < a.GetMin(2) || a.GetMax(2) < b.Min[2]->Value) return FALSE; + + return TRUE; +} + + + +bool SweepAndPrune::UpdateObject(udword i, const AABB& box) +{ + for(udword Axis=0;Axis<3;Axis++) + { +// udword Base = (udword)&mList[Axis][0]; + + // Update min + { + SAP_EndPoint* const CurrentMin = mBoxes[i].Min[Axis]; + ASSERT(!CurrentMin->IsMax()); + + const float Limit = box.GetMin(Axis); + if(Limit == CurrentMin->Value) + { + } + else if(Limit < CurrentMin->Value) + { + CurrentMin->Value = Limit; + + // Min is moving left: + SAP_EndPoint* NewPos = CurrentMin; + ASSERT(NewPos); + + SAP_EndPoint* tmp; + while((tmp = NewPos->Previous) && tmp->Value > Limit) + { + NewPos = tmp; + + if(NewPos->IsMax()) + { + // Our min passed a max => start overlap + //udword SortedIndex = (udword(CurrentMin) - Base)/sizeof(NS_EndPoint); + const udword id0 = CurrentMin->GetBoxID(); + const udword id1 = NewPos->GetBoxID(); + + if(id0!=id1 && Intersect(box, mBoxes[id1])) mPairs.AddPair(id0, id1); + } + } + + CurrentMin->InsertBefore(NewPos); + } + else// if(Limit > CurrentMin->Value) + { + CurrentMin->Value = Limit; + + // Min is moving right: + SAP_EndPoint* NewPos = CurrentMin; + ASSERT(NewPos); + + SAP_EndPoint* tmp; + while((tmp = NewPos->Next) && tmp->Value < Limit) + { + NewPos = tmp; + + if(NewPos->IsMax()) + { + // Our min passed a max => stop overlap + const udword id0 = CurrentMin->GetBoxID(); + const udword id1 = NewPos->GetBoxID(); + + if(id0!=id1) mPairs.RemovePair(id0, id1); + } + } + + CurrentMin->InsertAfter(NewPos); + } + } + + // Update max + { + SAP_EndPoint* const CurrentMax = mBoxes[i].Max[Axis]; + ASSERT(CurrentMax->IsMax()); + + const float Limit = box.GetMax(Axis); + if(Limit == CurrentMax->Value) + { + } + else if(Limit > CurrentMax->Value) + { + CurrentMax->Value = Limit; + + // Max is moving right: + SAP_EndPoint* NewPos = CurrentMax; + ASSERT(NewPos); + + SAP_EndPoint* tmp; + while((tmp = NewPos->Next) && tmp->Value < Limit) + { + NewPos = tmp; + + if(!NewPos->IsMax()) + { + // Our max passed a min => start overlap + const udword id0 = CurrentMax->GetBoxID(); + const udword id1 = NewPos->GetBoxID(); + + if(id0!=id1 && Intersect(box, mBoxes[id1])) mPairs.AddPair(id0, id1); + } + } + + CurrentMax->InsertAfter(NewPos); + } + else// if(Limit < CurrentMax->Value) + { + CurrentMax->Value = Limit; + + // Max is moving left: + SAP_EndPoint* NewPos = CurrentMax; + ASSERT(NewPos); + + SAP_EndPoint* tmp; + while((tmp = NewPos->Previous) && tmp->Value > Limit) + { + NewPos = tmp; + + if(!NewPos->IsMax()) + { + // Our max passed a min => stop overlap + const udword id0 = CurrentMax->GetBoxID(); + const udword id1 = NewPos->GetBoxID(); + + if(id0!=id1) mPairs.RemovePair(id0, id1); + } + } + + CurrentMax->InsertBefore(NewPos); + } + } + } + + return true; +} diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_SweepAndPrune.h b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_SweepAndPrune.h new file mode 100644 index 00000000..0221d286 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_SweepAndPrune.h @@ -0,0 +1,95 @@ +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains an implementation of the sweep-and-prune algorithm (moved from Z-Collide) + * \file OPC_SweepAndPrune.h + * \author Pierre Terdiman + * \date January, 29, 2000 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef __OPC_SWEEPANDPRUNE_H__ +#define __OPC_SWEEPANDPRUNE_H__ + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * User-callback, called by OPCODE for each colliding pairs. + * \param id0 [in] id of colliding object + * \param id1 [in] id of colliding object + * \param user_data [in] user-defined data + * \return TRUE to continue enumeration + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + typedef BOOL (*PairCallback) (udword id0, udword id1, void* user_data); + + class SAP_Element; + class SAP_EndPoint; + class SAP_Box; + + class OPCODE_API SAP_PairData + { + public: + SAP_PairData(); + ~SAP_PairData(); + + bool Init(udword nb_objects); + + void AddPair(udword id1, udword id2); + void RemovePair(udword id1, udword id2); + + void DumpPairs(Pairs& pairs) const; + void DumpPairs(PairCallback callback, void* user_data) const; + private: + udword mNbElements; //!< Total number of elements in the pool + udword mNbUsedElements; //!< Number of used elements + SAP_Element* mElementPool; //!< Array of mNbElements elements + SAP_Element* mFirstFree; //!< First free element in the pool + + udword mNbObjects; //!< Max number of objects we can handle + SAP_Element** mArray; //!< Pointers to pool + // Internal methods + SAP_Element* GetFreeElem(udword id, SAP_Element* next, udword* remap=null); + inline_ void FreeElem(SAP_Element* elem); + void Release(); + }; + + class OPCODE_API SweepAndPrune + { + public: + SweepAndPrune(); + ~SweepAndPrune(); + + bool Init(udword nb_objects, const AABB** boxes); + bool UpdateObject(udword i, const AABB& box); + + void GetPairs(Pairs& pairs) const; + void GetPairs(PairCallback callback, void* user_data) const; + private: + SAP_PairData mPairs; + + udword mNbObjects; + SAP_Box* mBoxes; + SAP_EndPoint* mList[3]; + // Internal methods + bool CheckListsIntegrity(); + }; + +#endif //__OPC_SWEEPANDPRUNE_H__ \ No newline at end of file diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_TreeBuilders.cpp b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_TreeBuilders.cpp new file mode 100644 index 00000000..7fbb4e3f --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_TreeBuilders.cpp @@ -0,0 +1,264 @@ +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code for tree builders. + * \file OPC_TreeBuilders.cpp + * \author Pierre Terdiman + * \date March, 20, 2001 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * A builder for AABB-trees of vertices. + * + * \class AABBTreeOfVerticesBuilder + * \author Pierre Terdiman + * \version 1.3 + * \date March, 20, 2001 +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * A builder for AABB-trees of AABBs. + * + * \class AABBTreeOfAABBsBuilder + * \author Pierre Terdiman + * \version 1.3 + * \date March, 20, 2001 +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * A builder for AABB-trees of triangles. + * + * \class AABBTreeOfTrianglesBuilder + * \author Pierre Terdiman + * \version 1.3 + * \date March, 20, 2001 +*/ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Precompiled Header +#include "Stdafx.h" + +using namespace Opcode; + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Computes the AABB of a set of primitives. + * \param primitives [in] list of indices of primitives + * \param nb_prims [in] number of indices + * \param global_box [out] global AABB enclosing the set of input primitives + * \return true if success + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool AABBTreeOfAABBsBuilder::ComputeGlobalBox(const udword* primitives, udword nb_prims, AABB& global_box) const +{ + // Checkings + if(!primitives || !nb_prims) return false; + + // Initialize global box + global_box = mAABBArray[primitives[0]]; + + // Loop through boxes + for(udword i=1;iGetTriangle(VP, *primitives++); + // Update global box + Min.Min(*VP.Vertex[0]).Min(*VP.Vertex[1]).Min(*VP.Vertex[2]); + Max.Max(*VP.Vertex[0]).Max(*VP.Vertex[1]).Max(*VP.Vertex[2]); + } + global_box.SetMinMax(Min, Max); + return true; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Computes the splitting value along a given axis for a given primitive. + * \param index [in] index of the primitive to split + * \param axis [in] axis index (0,1,2) + * \return splitting value + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +float AABBTreeOfTrianglesBuilder::GetSplittingValue(udword index, udword axis) const +{ +/* // Compute center of triangle + Point Center; + mTriList[index].Center(mVerts, Center); + // Return value + return Center[axis];*/ + + // Compute correct component from center of triangle +// return (mVerts[mTriList[index].mVRef[0]][axis] +// +mVerts[mTriList[index].mVRef[1]][axis] +// +mVerts[mTriList[index].mVRef[2]][axis])*INV3; + + VertexPointers VP; + mIMesh->GetTriangle(VP, index); + + // Compute correct component from center of triangle + return ((*VP.Vertex[0])[axis] + +(*VP.Vertex[1])[axis] + +(*VP.Vertex[2])[axis])*INV3; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Computes the splitting value along a given axis for a given node. + * \param primitives [in] list of indices of primitives + * \param nb_prims [in] number of indices + * \param global_box [in] global AABB enclosing the set of input primitives + * \param axis [in] axis index (0,1,2) + * \return splitting value + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +float AABBTreeOfTrianglesBuilder::GetSplittingValue(const udword* primitives, udword nb_prims, const AABB& global_box, udword axis) const +{ + if(mSettings.mRules&SPLIT_GEOM_CENTER) + { + // Loop through triangles + float SplitValue = 0.0f; + VertexPointers VP; + for(udword i=0;iGetTriangle(VP, primitives[i]); + // Update split value + SplitValue += (*VP.Vertex[0])[axis]; + SplitValue += (*VP.Vertex[1])[axis]; + SplitValue += (*VP.Vertex[2])[axis]; + } + return SplitValue / float(nb_prims*3); + } + else return AABBTreeBuilder::GetSplittingValue(primitives, nb_prims, global_box, axis); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Computes the AABB of a set of primitives. + * \param primitives [in] list of indices of primitives + * \param nb_prims [in] number of indices + * \param global_box [out] global AABB enclosing the set of input primitives + * \return true if success + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool AABBTreeOfVerticesBuilder::ComputeGlobalBox(const udword* primitives, udword nb_prims, AABB& global_box) const +{ + // Checkings + if(!primitives || !nb_prims) return false; + + // Initialize global box + global_box.SetEmpty(); + + // Loop through vertices + for(udword i=0;iHasLeafNodes()!=cache.Model1->HasLeafNodes()) return false; + if(cache.Model0->IsQuantized()!=cache.Model1->IsQuantized()) return false; + + /* + + Rules: + - perform hull test + - when hulls collide, disable hull test + - if meshes overlap, reset countdown + - if countdown reaches 0, enable hull test + + */ + +#ifdef __MESHMERIZER_H__ + // Handle hulls + if(cache.HullTest) + { + if(cache.Model0->GetHull() && cache.Model1->GetHull()) + { + struct Local + { + static Point* SVCallback(const Point& sv, udword& previndex, udword user_data) + { + CollisionHull* Hull = (CollisionHull*)user_data; + previndex = Hull->ComputeSupportingVertex(sv, previndex); + return (Point*)&Hull->GetVerts()[previndex]; + } + }; + + bool Collide; + + if(0) + { + static GJKEngine GJK; + static bool GJKInitDone=false; + if(!GJKInitDone) + { + GJK.Enable(GJK_BACKUP_PROCEDURE); + GJK.Enable(GJK_DEGENERATE); + GJK.Enable(GJK_HILLCLIMBING); + GJKInitDone = true; + } + GJK.SetCallbackObj0(Local::SVCallback); + GJK.SetCallbackObj1(Local::SVCallback); + GJK.SetUserData0(udword(cache.Model0->GetHull())); + GJK.SetUserData1(udword(cache.Model1->GetHull())); + Collide = GJK.Collide(*world0, *world1, &cache.SepVector); + } + else + { + static SVEngine SVE; + SVE.SetCallbackObj0(Local::SVCallback); + SVE.SetCallbackObj1(Local::SVCallback); + SVE.SetUserData0(udword(cache.Model0->GetHull())); + SVE.SetUserData1(udword(cache.Model1->GetHull())); + Collide = SVE.Collide(*world0, *world1, &cache.SepVector); + } + + if(!Collide) + { + // Reset stats & contact status + mFlags &= ~OPC_CONTACT; + mNbBVBVTests = 0; + mNbPrimPrimTests = 0; + mNbBVPrimTests = 0; + mPairs.Reset(); + return true; + } + } + } + + // Here, hulls collide + cache.HullTest = false; +#endif // __MESHMERIZER_H__ + + // Checkings + if(!Setup(cache.Model0->GetMeshInterface(), cache.Model1->GetMeshInterface())) return false; + + // Simple double-dispatch + bool Status; + if(!cache.Model0->HasLeafNodes()) + { + if(cache.Model0->IsQuantized()) + { + const AABBQuantizedNoLeafTree* T0 = (const AABBQuantizedNoLeafTree*)cache.Model0->GetTree(); + const AABBQuantizedNoLeafTree* T1 = (const AABBQuantizedNoLeafTree*)cache.Model1->GetTree(); + Status = Collide(T0, T1, world0, world1, &cache); + } + else + { + const AABBNoLeafTree* T0 = (const AABBNoLeafTree*)cache.Model0->GetTree(); + const AABBNoLeafTree* T1 = (const AABBNoLeafTree*)cache.Model1->GetTree(); + Status = Collide(T0, T1, world0, world1, &cache); + } + } + else + { + if(cache.Model0->IsQuantized()) + { + const AABBQuantizedTree* T0 = (const AABBQuantizedTree*)cache.Model0->GetTree(); + const AABBQuantizedTree* T1 = (const AABBQuantizedTree*)cache.Model1->GetTree(); + Status = Collide(T0, T1, world0, world1, &cache); + } + else + { + const AABBCollisionTree* T0 = (const AABBCollisionTree*)cache.Model0->GetTree(); + const AABBCollisionTree* T1 = (const AABBCollisionTree*)cache.Model1->GetTree(); + Status = Collide(T0, T1, world0, world1, &cache); + } + } + +#ifdef __MESHMERIZER_H__ + if(Status) + { + // Reset counter as long as overlap occurs + if(GetContactStatus()) cache.ResetCountDown(); + + // Enable hull test again when counter reaches zero + cache.CountDown--; + if(!cache.CountDown) + { + cache.ResetCountDown(); + cache.HullTest = true; + } + } +#endif + return Status; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Initializes a collision query : + * - reset stats & contact status + * - setup matrices + * + * \param world0 [in] world matrix for first object + * \param world1 [in] world matrix for second object + * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void AABBTreeCollider::InitQuery(const Matrix4x4* world0, const Matrix4x4* world1) +{ + // Reset stats & contact status + Collider::InitQuery(); + mNbBVBVTests = 0; + mNbPrimPrimTests = 0; + mNbBVPrimTests = 0; + mPairs.Reset(); + + // Setup matrices + Matrix4x4 InvWorld0, InvWorld1; + if(world0) InvertPRMatrix(InvWorld0, *world0); + else InvWorld0.Identity(); + + if(world1) InvertPRMatrix(InvWorld1, *world1); + else InvWorld1.Identity(); + + Matrix4x4 World0to1 = world0 ? (*world0 * InvWorld1) : InvWorld1; + Matrix4x4 World1to0 = world1 ? (*world1 * InvWorld0) : InvWorld0; + + mR0to1 = World0to1; World0to1.GetTrans(mT0to1); + mR1to0 = World1to0; World1to0.GetTrans(mT1to0); + + // Precompute absolute 1-to-0 rotation matrix + for(udword i=0;i<3;i++) + { + for(udword j=0;j<3;j++) + { + // Epsilon value prevents floating-point inaccuracies (strategy borrowed from RAPID) + mAR.m[i][j] = 1e-6f + fabsf(mR1to0.m[i][j]); + } + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Takes advantage of temporal coherence. + * \param cache [in] cache for a pair of previously colliding primitives + * \return true if we can return immediately + * \warning only works for "First Contact" mode + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool AABBTreeCollider::CheckTemporalCoherence(Pair* cache) +{ + // Checkings + if(!cache) return false; + + // Test previously colliding primitives first + if(TemporalCoherenceEnabled() && FirstContactEnabled()) + { + PrimTest(cache->id0, cache->id1); + if(GetContactStatus()) return true; + } + return false; +} + +#define UPDATE_CACHE \ + if(cache && GetContactStatus()) \ + { \ + cache->id0 = mPairs.GetEntry(0); \ + cache->id1 = mPairs.GetEntry(1); \ + } + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Collision query for normal AABB trees. + * \param tree0 [in] AABB tree from first object + * \param tree1 [in] AABB tree from second object + * \param world0 [in] world matrix for first object + * \param world1 [in] world matrix for second object + * \param cache [in/out] cache for a pair of previously colliding primitives + * \return true if success + * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool AABBTreeCollider::Collide(const AABBCollisionTree* tree0, const AABBCollisionTree* tree1, const Matrix4x4* world0, const Matrix4x4* world1, Pair* cache) +{ + // Init collision query + InitQuery(world0, world1); + + // Check previous state + if(CheckTemporalCoherence(cache)) return true; + + // Perform collision query + _Collide(tree0->GetNodes(), tree1->GetNodes()); + + UPDATE_CACHE + + return true; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Collision query for no-leaf AABB trees. + * \param tree0 [in] AABB tree from first object + * \param tree1 [in] AABB tree from second object + * \param world0 [in] world matrix for first object + * \param world1 [in] world matrix for second object + * \param cache [in/out] cache for a pair of previously colliding primitives + * \return true if success + * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool AABBTreeCollider::Collide(const AABBNoLeafTree* tree0, const AABBNoLeafTree* tree1, const Matrix4x4* world0, const Matrix4x4* world1, Pair* cache) +{ + // Init collision query + InitQuery(world0, world1); + + // Check previous state + if(CheckTemporalCoherence(cache)) return true; + + // Perform collision query + _Collide(tree0->GetNodes(), tree1->GetNodes()); + + UPDATE_CACHE + + return true; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Collision query for quantized AABB trees. + * \param tree0 [in] AABB tree from first object + * \param tree1 [in] AABB tree from second object + * \param world0 [in] world matrix for first object + * \param world1 [in] world matrix for second object + * \param cache [in/out] cache for a pair of previously colliding primitives + * \return true if success + * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool AABBTreeCollider::Collide(const AABBQuantizedTree* tree0, const AABBQuantizedTree* tree1, const Matrix4x4* world0, const Matrix4x4* world1, Pair* cache) +{ + // Init collision query + InitQuery(world0, world1); + + // Check previous state + if(CheckTemporalCoherence(cache)) return true; + + // Setup dequantization coeffs + mCenterCoeff0 = tree0->mCenterCoeff; + mExtentsCoeff0 = tree0->mExtentsCoeff; + mCenterCoeff1 = tree1->mCenterCoeff; + mExtentsCoeff1 = tree1->mExtentsCoeff; + + // Dequantize box A + const AABBQuantizedNode* N0 = tree0->GetNodes(); + const Point a(float(N0->mAABB.mExtents[0]) * mExtentsCoeff0.x, float(N0->mAABB.mExtents[1]) * mExtentsCoeff0.y, float(N0->mAABB.mExtents[2]) * mExtentsCoeff0.z); + const Point Pa(float(N0->mAABB.mCenter[0]) * mCenterCoeff0.x, float(N0->mAABB.mCenter[1]) * mCenterCoeff0.y, float(N0->mAABB.mCenter[2]) * mCenterCoeff0.z); + // Dequantize box B + const AABBQuantizedNode* N1 = tree1->GetNodes(); + const Point b(float(N1->mAABB.mExtents[0]) * mExtentsCoeff1.x, float(N1->mAABB.mExtents[1]) * mExtentsCoeff1.y, float(N1->mAABB.mExtents[2]) * mExtentsCoeff1.z); + const Point Pb(float(N1->mAABB.mCenter[0]) * mCenterCoeff1.x, float(N1->mAABB.mCenter[1]) * mCenterCoeff1.y, float(N1->mAABB.mCenter[2]) * mCenterCoeff1.z); + + // Perform collision query + _Collide(N0, N1, a, Pa, b, Pb); + + UPDATE_CACHE + + return true; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Collision query for quantized no-leaf AABB trees. + * \param tree0 [in] AABB tree from first object + * \param tree1 [in] AABB tree from second object + * \param world0 [in] world matrix for first object + * \param world1 [in] world matrix for second object + * \param cache [in/out] cache for a pair of previously colliding primitives + * \return true if success + * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only. + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +bool AABBTreeCollider::Collide(const AABBQuantizedNoLeafTree* tree0, const AABBQuantizedNoLeafTree* tree1, const Matrix4x4* world0, const Matrix4x4* world1, Pair* cache) +{ + // Init collision query + InitQuery(world0, world1); + + // Check previous state + if(CheckTemporalCoherence(cache)) return true; + + // Setup dequantization coeffs + mCenterCoeff0 = tree0->mCenterCoeff; + mExtentsCoeff0 = tree0->mExtentsCoeff; + mCenterCoeff1 = tree1->mCenterCoeff; + mExtentsCoeff1 = tree1->mExtentsCoeff; + + // Perform collision query + _Collide(tree0->GetNodes(), tree1->GetNodes()); + + UPDATE_CACHE + + return true; +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Standard trees +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +// The normal AABB tree can use 2 different descent rules (with different performances) +//#define ORIGINAL_CODE //!< UNC-like descent rules +#define ALTERNATIVE_CODE //!< Alternative descent rules + +#ifdef ORIGINAL_CODE +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for normal AABB trees. + * \param b0 [in] collision node from first tree + * \param b1 [in] collision node from second tree + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void AABBTreeCollider::_Collide(const AABBCollisionNode* b0, const AABBCollisionNode* b1) +{ + // Perform BV-BV overlap test + if(!BoxBoxOverlap(b0->mAABB.mExtents, b0->mAABB.mCenter, b1->mAABB.mExtents, b1->mAABB.mCenter)) return; + + if(b0->IsLeaf() && b1->IsLeaf()) { PrimTest(b0->GetPrimitive(), b1->GetPrimitive()); return; } + + if(b1->IsLeaf() || (!b0->IsLeaf() && (b0->GetSize() > b1->GetSize()))) + { + _Collide(b0->GetNeg(), b1); + if(ContactFound()) return; + _Collide(b0->GetPos(), b1); + } + else + { + _Collide(b0, b1->GetNeg()); + if(ContactFound()) return; + _Collide(b0, b1->GetPos()); + } +} +#endif + +#ifdef ALTERNATIVE_CODE +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for normal AABB trees. + * \param b0 [in] collision node from first tree + * \param b1 [in] collision node from second tree + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void AABBTreeCollider::_Collide(const AABBCollisionNode* b0, const AABBCollisionNode* b1) +{ + // Perform BV-BV overlap test + if(!BoxBoxOverlap(b0->mAABB.mExtents, b0->mAABB.mCenter, b1->mAABB.mExtents, b1->mAABB.mCenter)) + { + return; + } + + if(b0->IsLeaf()) + { + if(b1->IsLeaf()) + { + PrimTest(b0->GetPrimitive(), b1->GetPrimitive()); + } + else + { + _Collide(b0, b1->GetNeg()); + if(ContactFound()) return; + _Collide(b0, b1->GetPos()); + } + } + else if(b1->IsLeaf()) + { + _Collide(b0->GetNeg(), b1); + if(ContactFound()) return; + _Collide(b0->GetPos(), b1); + } + else + { + _Collide(b0->GetNeg(), b1->GetNeg()); + if(ContactFound()) return; + _Collide(b0->GetNeg(), b1->GetPos()); + if(ContactFound()) return; + _Collide(b0->GetPos(), b1->GetNeg()); + if(ContactFound()) return; + _Collide(b0->GetPos(), b1->GetPos()); + } +} +#endif + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// No-leaf trees +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Leaf-leaf test for two primitive indices. + * \param id0 [in] index from first leaf-triangle + * \param id1 [in] index from second leaf-triangle + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void AABBTreeCollider::PrimTest(udword id0, udword id1) +{ + // Request vertices from the app + VertexPointers VP0; + VertexPointers VP1; + mIMesh0->GetTriangle(VP0, id0); + mIMesh1->GetTriangle(VP1, id1); + + // Transform from space 1 to space 0 + Point u0,u1,u2; + TransformPoint(u0, *VP1.Vertex[0], mR1to0, mT1to0); + TransformPoint(u1, *VP1.Vertex[1], mR1to0, mT1to0); + TransformPoint(u2, *VP1.Vertex[2], mR1to0, mT1to0); + + // Perform triangle-triangle overlap test + if(TriTriOverlap(*VP0.Vertex[0], *VP0.Vertex[1], *VP0.Vertex[2], u0, u1, u2)) + { + // Keep track of colliding pairs + mPairs.Add(id0).Add(id1); + // Set contact status + mFlags |= OPC_CONTACT; + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Leaf-leaf test for a previously fetched triangle from tree A (in B's space) and a new leaf from B. + * \param id1 [in] leaf-triangle index from tree B + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +inline_ void AABBTreeCollider::PrimTestTriIndex(udword id1) +{ + // Request vertices from the app + VertexPointers VP; + mIMesh1->GetTriangle(VP, id1); + + // Perform triangle-triangle overlap test + if(TriTriOverlap(mLeafVerts[0], mLeafVerts[1], mLeafVerts[2], *VP.Vertex[0], *VP.Vertex[1], *VP.Vertex[2])) + { + // Keep track of colliding pairs + mPairs.Add(mLeafIndex).Add(id1); + // Set contact status + mFlags |= OPC_CONTACT; + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Leaf-leaf test for a previously fetched triangle from tree B (in A's space) and a new leaf from A. + * \param id0 [in] leaf-triangle index from tree A + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +inline_ void AABBTreeCollider::PrimTestIndexTri(udword id0) +{ + // Request vertices from the app + VertexPointers VP; + mIMesh0->GetTriangle(VP, id0); + + // Perform triangle-triangle overlap test + if(TriTriOverlap(mLeafVerts[0], mLeafVerts[1], mLeafVerts[2], *VP.Vertex[0], *VP.Vertex[1], *VP.Vertex[2])) + { + // Keep track of colliding pairs + mPairs.Add(id0).Add(mLeafIndex); + // Set contact status + mFlags |= OPC_CONTACT; + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision of a leaf node from A and a branch from B. + * \param b [in] collision node from second tree + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void AABBTreeCollider::_CollideTriBox(const AABBNoLeafNode* b) +{ + // Perform triangle-box overlap test + if(!TriBoxOverlap(b->mAABB.mCenter, b->mAABB.mExtents)) return; + + // Keep same triangle, deal with first child + if(b->HasPosLeaf()) PrimTestTriIndex(b->GetPosPrimitive()); + else _CollideTriBox(b->GetPos()); + + if(ContactFound()) return; + + // Keep same triangle, deal with second child + if(b->HasNegLeaf()) PrimTestTriIndex(b->GetNegPrimitive()); + else _CollideTriBox(b->GetNeg()); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision of a leaf node from B and a branch from A. + * \param b [in] collision node from first tree + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void AABBTreeCollider::_CollideBoxTri(const AABBNoLeafNode* b) +{ + // Perform triangle-box overlap test + if(!TriBoxOverlap(b->mAABB.mCenter, b->mAABB.mExtents)) return; + + // Keep same triangle, deal with first child + if(b->HasPosLeaf()) PrimTestIndexTri(b->GetPosPrimitive()); + else _CollideBoxTri(b->GetPos()); + + if(ContactFound()) return; + + // Keep same triangle, deal with second child + if(b->HasNegLeaf()) PrimTestIndexTri(b->GetNegPrimitive()); + else _CollideBoxTri(b->GetNeg()); +} + +//! Request triangle vertices from the app and transform them +#define FETCH_LEAF(prim_index, imesh, rot, trans) \ + mLeafIndex = prim_index; \ + /* Request vertices from the app */ \ + VertexPointers VP; imesh->GetTriangle(VP, prim_index); \ + /* Transform them in a common space */ \ + TransformPoint(mLeafVerts[0], *VP.Vertex[0], rot, trans); \ + TransformPoint(mLeafVerts[1], *VP.Vertex[1], rot, trans); \ + TransformPoint(mLeafVerts[2], *VP.Vertex[2], rot, trans); + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for no-leaf AABB trees. + * \param a [in] collision node from first tree + * \param b [in] collision node from second tree + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void AABBTreeCollider::_Collide(const AABBNoLeafNode* a, const AABBNoLeafNode* b) +{ + // Perform BV-BV overlap test + if(!BoxBoxOverlap(a->mAABB.mExtents, a->mAABB.mCenter, b->mAABB.mExtents, b->mAABB.mCenter)) return; + + // Catch leaf status + BOOL BHasPosLeaf = b->HasPosLeaf(); + BOOL BHasNegLeaf = b->HasNegLeaf(); + + if(a->HasPosLeaf()) + { + FETCH_LEAF(a->GetPosPrimitive(), mIMesh0, mR0to1, mT0to1) + + if(BHasPosLeaf) PrimTestTriIndex(b->GetPosPrimitive()); + else _CollideTriBox(b->GetPos()); + + if(ContactFound()) return; + + if(BHasNegLeaf) PrimTestTriIndex(b->GetNegPrimitive()); + else _CollideTriBox(b->GetNeg()); + } + else + { + if(BHasPosLeaf) + { + FETCH_LEAF(b->GetPosPrimitive(), mIMesh1, mR1to0, mT1to0) + + _CollideBoxTri(a->GetPos()); + } + else _Collide(a->GetPos(), b->GetPos()); + + if(ContactFound()) return; + + if(BHasNegLeaf) + { + FETCH_LEAF(b->GetNegPrimitive(), mIMesh1, mR1to0, mT1to0) + + _CollideBoxTri(a->GetPos()); + } + else _Collide(a->GetPos(), b->GetNeg()); + } + + if(ContactFound()) return; + + if(a->HasNegLeaf()) + { + FETCH_LEAF(a->GetNegPrimitive(), mIMesh0, mR0to1, mT0to1) + + if(BHasPosLeaf) PrimTestTriIndex(b->GetPosPrimitive()); + else _CollideTriBox(b->GetPos()); + + if(ContactFound()) return; + + if(BHasNegLeaf) PrimTestTriIndex(b->GetNegPrimitive()); + else _CollideTriBox(b->GetNeg()); + } + else + { + if(BHasPosLeaf) + { + // ### That leaf has possibly already been fetched + FETCH_LEAF(b->GetPosPrimitive(), mIMesh1, mR1to0, mT1to0) + + _CollideBoxTri(a->GetNeg()); + } + else _Collide(a->GetNeg(), b->GetPos()); + + if(ContactFound()) return; + + if(BHasNegLeaf) + { + // ### That leaf has possibly already been fetched + FETCH_LEAF(b->GetNegPrimitive(), mIMesh1, mR1to0, mT1to0) + + _CollideBoxTri(a->GetNeg()); + } + else _Collide(a->GetNeg(), b->GetNeg()); + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Quantized trees +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for quantized AABB trees. + * \param b0 [in] collision node from first tree + * \param b1 [in] collision node from second tree + * \param a [in] extent from box A + * \param Pa [in] center from box A + * \param b [in] extent from box B + * \param Pb [in] center from box B + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void AABBTreeCollider::_Collide(const AABBQuantizedNode* b0, const AABBQuantizedNode* b1, const Point& a, const Point& Pa, const Point& b, const Point& Pb) +{ + // Perform BV-BV overlap test + if(!BoxBoxOverlap(a, Pa, b, Pb)) return; + + if(b0->IsLeaf() && b1->IsLeaf()) { PrimTest(b0->GetPrimitive(), b1->GetPrimitive()); return; } + + if(b1->IsLeaf() || (!b0->IsLeaf() && (b0->GetSize() > b1->GetSize()))) + { + // Dequantize box + const QuantizedAABB* Box = &b0->GetNeg()->mAABB; + const Point negPa(float(Box->mCenter[0]) * mCenterCoeff0.x, float(Box->mCenter[1]) * mCenterCoeff0.y, float(Box->mCenter[2]) * mCenterCoeff0.z); + const Point nega(float(Box->mExtents[0]) * mExtentsCoeff0.x, float(Box->mExtents[1]) * mExtentsCoeff0.y, float(Box->mExtents[2]) * mExtentsCoeff0.z); + _Collide(b0->GetNeg(), b1, nega, negPa, b, Pb); + + if(ContactFound()) return; + + // Dequantize box + Box = &b0->GetPos()->mAABB; + const Point posPa(float(Box->mCenter[0]) * mCenterCoeff0.x, float(Box->mCenter[1]) * mCenterCoeff0.y, float(Box->mCenter[2]) * mCenterCoeff0.z); + const Point posa(float(Box->mExtents[0]) * mExtentsCoeff0.x, float(Box->mExtents[1]) * mExtentsCoeff0.y, float(Box->mExtents[2]) * mExtentsCoeff0.z); + _Collide(b0->GetPos(), b1, posa, posPa, b, Pb); + } + else + { + // Dequantize box + const QuantizedAABB* Box = &b1->GetNeg()->mAABB; + const Point negPb(float(Box->mCenter[0]) * mCenterCoeff1.x, float(Box->mCenter[1]) * mCenterCoeff1.y, float(Box->mCenter[2]) * mCenterCoeff1.z); + const Point negb(float(Box->mExtents[0]) * mExtentsCoeff1.x, float(Box->mExtents[1]) * mExtentsCoeff1.y, float(Box->mExtents[2]) * mExtentsCoeff1.z); + _Collide(b0, b1->GetNeg(), a, Pa, negb, negPb); + + if(ContactFound()) return; + + // Dequantize box + Box = &b1->GetPos()->mAABB; + const Point posPb(float(Box->mCenter[0]) * mCenterCoeff1.x, float(Box->mCenter[1]) * mCenterCoeff1.y, float(Box->mCenter[2]) * mCenterCoeff1.z); + const Point posb(float(Box->mExtents[0]) * mExtentsCoeff1.x, float(Box->mExtents[1]) * mExtentsCoeff1.y, float(Box->mExtents[2]) * mExtentsCoeff1.z); + _Collide(b0, b1->GetPos(), a, Pa, posb, posPb); + } +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Quantized no-leaf trees +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision of a leaf node from A and a quantized branch from B. + * \param leaf [in] leaf triangle from first tree + * \param b [in] collision node from second tree + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void AABBTreeCollider::_CollideTriBox(const AABBQuantizedNoLeafNode* b) +{ + // Dequantize box + const QuantizedAABB* bb = &b->mAABB; + const Point Pb(float(bb->mCenter[0]) * mCenterCoeff1.x, float(bb->mCenter[1]) * mCenterCoeff1.y, float(bb->mCenter[2]) * mCenterCoeff1.z); + const Point eb(float(bb->mExtents[0]) * mExtentsCoeff1.x, float(bb->mExtents[1]) * mExtentsCoeff1.y, float(bb->mExtents[2]) * mExtentsCoeff1.z); + + // Perform triangle-box overlap test + if(!TriBoxOverlap(Pb, eb)) return; + + if(b->HasPosLeaf()) PrimTestTriIndex(b->GetPosPrimitive()); + else _CollideTriBox(b->GetPos()); + + if(ContactFound()) return; + + if(b->HasNegLeaf()) PrimTestTriIndex(b->GetNegPrimitive()); + else _CollideTriBox(b->GetNeg()); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision of a leaf node from B and a quantized branch from A. + * \param b [in] collision node from first tree + * \param leaf [in] leaf triangle from second tree + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void AABBTreeCollider::_CollideBoxTri(const AABBQuantizedNoLeafNode* b) +{ + // Dequantize box + const QuantizedAABB* bb = &b->mAABB; + const Point Pa(float(bb->mCenter[0]) * mCenterCoeff0.x, float(bb->mCenter[1]) * mCenterCoeff0.y, float(bb->mCenter[2]) * mCenterCoeff0.z); + const Point ea(float(bb->mExtents[0]) * mExtentsCoeff0.x, float(bb->mExtents[1]) * mExtentsCoeff0.y, float(bb->mExtents[2]) * mExtentsCoeff0.z); + + // Perform triangle-box overlap test + if(!TriBoxOverlap(Pa, ea)) return; + + if(b->HasPosLeaf()) PrimTestIndexTri(b->GetPosPrimitive()); + else _CollideBoxTri(b->GetPos()); + + if(ContactFound()) return; + + if(b->HasNegLeaf()) PrimTestIndexTri(b->GetNegPrimitive()); + else _CollideBoxTri(b->GetNeg()); +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Recursive collision query for quantized no-leaf AABB trees. + * \param a [in] collision node from first tree + * \param b [in] collision node from second tree + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +void AABBTreeCollider::_Collide(const AABBQuantizedNoLeafNode* a, const AABBQuantizedNoLeafNode* b) +{ + // Dequantize box A + const QuantizedAABB* ab = &a->mAABB; + const Point Pa(float(ab->mCenter[0]) * mCenterCoeff0.x, float(ab->mCenter[1]) * mCenterCoeff0.y, float(ab->mCenter[2]) * mCenterCoeff0.z); + const Point ea(float(ab->mExtents[0]) * mExtentsCoeff0.x, float(ab->mExtents[1]) * mExtentsCoeff0.y, float(ab->mExtents[2]) * mExtentsCoeff0.z); + // Dequantize box B + const QuantizedAABB* bb = &b->mAABB; + const Point Pb(float(bb->mCenter[0]) * mCenterCoeff1.x, float(bb->mCenter[1]) * mCenterCoeff1.y, float(bb->mCenter[2]) * mCenterCoeff1.z); + const Point eb(float(bb->mExtents[0]) * mExtentsCoeff1.x, float(bb->mExtents[1]) * mExtentsCoeff1.y, float(bb->mExtents[2]) * mExtentsCoeff1.z); + + // Perform BV-BV overlap test + if(!BoxBoxOverlap(ea, Pa, eb, Pb)) return; + + // Catch leaf status + BOOL BHasPosLeaf = b->HasPosLeaf(); + BOOL BHasNegLeaf = b->HasNegLeaf(); + + if(a->HasPosLeaf()) + { + FETCH_LEAF(a->GetPosPrimitive(), mIMesh0, mR0to1, mT0to1) + + if(BHasPosLeaf) PrimTestTriIndex(b->GetPosPrimitive()); + else _CollideTriBox(b->GetPos()); + + if(ContactFound()) return; + + if(BHasNegLeaf) PrimTestTriIndex(b->GetNegPrimitive()); + else _CollideTriBox(b->GetNeg()); + } + else + { + if(BHasPosLeaf) + { + FETCH_LEAF(b->GetPosPrimitive(), mIMesh1, mR1to0, mT1to0) + + _CollideBoxTri(a->GetPos()); + } + else _Collide(a->GetPos(), b->GetPos()); + + if(ContactFound()) return; + + if(BHasNegLeaf) + { + FETCH_LEAF(b->GetNegPrimitive(), mIMesh1, mR1to0, mT1to0) + + _CollideBoxTri(a->GetPos()); + } + else _Collide(a->GetPos(), b->GetNeg()); + } + + if(ContactFound()) return; + + if(a->HasNegLeaf()) + { + FETCH_LEAF(a->GetNegPrimitive(), mIMesh0, mR0to1, mT0to1) + + if(BHasPosLeaf) PrimTestTriIndex(b->GetPosPrimitive()); + else _CollideTriBox(b->GetPos()); + + if(ContactFound()) return; + + if(BHasNegLeaf) PrimTestTriIndex(b->GetNegPrimitive()); + else _CollideTriBox(b->GetNeg()); + } + else + { + if(BHasPosLeaf) + { + // ### That leaf has possibly already been fetched + FETCH_LEAF(b->GetPosPrimitive(), mIMesh1, mR1to0, mT1to0) + + _CollideBoxTri(a->GetNeg()); + } + else _Collide(a->GetNeg(), b->GetPos()); + + if(ContactFound()) return; + + if(BHasNegLeaf) + { + // ### That leaf has possibly already been fetched + FETCH_LEAF(b->GetNegPrimitive(), mIMesh1, mR1to0, mT1to0) + + _CollideBoxTri(a->GetNeg()); + } + else _Collide(a->GetNeg(), b->GetNeg()); + } +} diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_TreeCollider.h b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_TreeCollider.h new file mode 100644 index 00000000..f0d731d8 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_TreeCollider.h @@ -0,0 +1,253 @@ +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains code for a tree collider. + * \file OPC_TreeCollider.h + * \author Pierre Terdiman + * \date March, 20, 2001 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef __OPC_TREECOLLIDER_H__ +#define __OPC_TREECOLLIDER_H__ + + //! This structure holds cached information used by the algorithm. + //! Two model pointers and two colliding primitives are cached. Model pointers are assigned + //! to their respective meshes, and the pair of colliding primitives is used for temporal + //! coherence. That is, in case temporal coherence is enabled, those two primitives are + //! tested for overlap before everything else. If they still collide, we're done before + //! even entering the recursive collision code. + struct OPCODE_API BVTCache : Pair + { + //! Constructor + inline_ BVTCache() + { + ResetCache(); + ResetCountDown(); + } + + void ResetCache() + { + Model0 = null; + Model1 = null; + id0 = 0; + id1 = 1; +#ifdef __MESHMERIZER_H__ // Collision hulls only supported within ICE ! + HullTest = true; + SepVector.pid = 0; + SepVector.qid = 0; + SepVector.SV = Point(1.0f, 0.0f, 0.0f); +#endif // __MESHMERIZER_H__ + } + + inline_ void ResetCountDown() + { +#ifdef __MESHMERIZER_H__ // Collision hulls only supported within ICE ! + CountDown = 50; +#endif // __MESHMERIZER_H__ + } + + const Model* Model0; //!< Model for first object + const Model* Model1; //!< Model for second object + +#ifdef __MESHMERIZER_H__ // Collision hulls only supported within ICE ! + SVCache SepVector; + udword CountDown; + bool HullTest; +#endif // __MESHMERIZER_H__ + }; + + class OPCODE_API AABBTreeCollider : public Collider + { + public: + // Constructor / Destructor + AABBTreeCollider(); + virtual ~AABBTreeCollider(); + // Generic collision query + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Generic collision query for generic OPCODE models. After the call, access the results with: + * - GetContactStatus() + * - GetNbPairs() + * - GetPairs() + * + * \param cache [in] collision cache for model pointers and a colliding pair of primitives + * \param world0 [in] world matrix for first object, or null + * \param world1 [in] world matrix for second object, or null + * \return true if success + * \warning SCALE NOT SUPPORTED. The matrices must contain rotation & translation parts only. + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + bool Collide(BVTCache& cache, const Matrix4x4* world0=null, const Matrix4x4* world1=null); + + // Collision queries + bool Collide(const AABBCollisionTree* tree0, const AABBCollisionTree* tree1, const Matrix4x4* world0=null, const Matrix4x4* world1=null, Pair* cache=null); + bool Collide(const AABBNoLeafTree* tree0, const AABBNoLeafTree* tree1, const Matrix4x4* world0=null, const Matrix4x4* world1=null, Pair* cache=null); + bool Collide(const AABBQuantizedTree* tree0, const AABBQuantizedTree* tree1, const Matrix4x4* world0=null, const Matrix4x4* world1=null, Pair* cache=null); + bool Collide(const AABBQuantizedNoLeafTree* tree0, const AABBQuantizedNoLeafTree* tree1, const Matrix4x4* world0=null, const Matrix4x4* world1=null, Pair* cache=null); + // Settings + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Settings: selects between full box-box tests or "SAT-lite" tests (where Class III axes are discarded) + * \param flag [in] true for full tests, false for coarse tests + * \see SetFullPrimBoxTest(bool flag) + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ void SetFullBoxBoxTest(bool flag) { mFullBoxBoxTest = flag; } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Settings: selects between full triangle-box tests or "SAT-lite" tests (where Class III axes are discarded) + * \param flag [in] true for full tests, false for coarse tests + * \see SetFullBoxBoxTest(bool flag) + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ void SetFullPrimBoxTest(bool flag) { mFullPrimBoxTest = flag; } + + // Stats + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Stats: gets the number of BV-BV overlap tests after a collision query. + * \see GetNbPrimPrimTests() + * \see GetNbBVPrimTests() + * \return the number of BV-BV tests performed during last query + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ udword GetNbBVBVTests() const { return mNbBVBVTests; } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Stats: gets the number of Triangle-Triangle overlap tests after a collision query. + * \see GetNbBVBVTests() + * \see GetNbBVPrimTests() + * \return the number of Triangle-Triangle tests performed during last query + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ udword GetNbPrimPrimTests() const { return mNbPrimPrimTests; } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Stats: gets the number of BV-Triangle overlap tests after a collision query. + * \see GetNbBVBVTests() + * \see GetNbPrimPrimTests() + * \return the number of BV-Triangle tests performed during last query + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ udword GetNbBVPrimTests() const { return mNbBVPrimTests; } + + // Data access + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Gets the number of contacts after a collision query. + * \see GetContactStatus() + * \see GetPairs() + * \return the number of contacts / colliding pairs. + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ udword GetNbPairs() const { return mPairs.GetNbEntries()>>1; } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Gets the pairs of colliding triangles after a collision query. + * \see GetContactStatus() + * \see GetNbPairs() + * \return the list of colliding pairs (triangle indices) + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ const Pair* GetPairs() const { return (const Pair*)mPairs.GetEntries(); } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Validates current settings. You should call this method after all the settings and callbacks have been defined for a collider. + * \return null if everything is ok, else a string describing the problem + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + override(Collider) const char* ValidateSettings(); + + protected: + // Colliding pairs + Container mPairs; //!< Pairs of colliding primitives + // User mesh interfaces + const MeshInterface* mIMesh0; //!< User-defined mesh interface for object0 + const MeshInterface* mIMesh1; //!< User-defined mesh interface for object1 + // Stats + udword mNbBVBVTests; //!< Number of BV-BV tests + udword mNbPrimPrimTests; //!< Number of Primitive-Primitive tests + udword mNbBVPrimTests; //!< Number of BV-Primitive tests + // Precomputed data + Matrix3x3 mAR; //!< Absolute rotation matrix + Matrix3x3 mR0to1; //!< Rotation from object0 to object1 + Matrix3x3 mR1to0; //!< Rotation from object1 to object0 + Point mT0to1; //!< Translation from object0 to object1 + Point mT1to0; //!< Translation from object1 to object0 + // Dequantization coeffs + Point mCenterCoeff0; + Point mExtentsCoeff0; + Point mCenterCoeff1; + Point mExtentsCoeff1; + // Leaf description + Point mLeafVerts[3]; //!< Triangle vertices + udword mLeafIndex; //!< Triangle index + // Settings + bool mFullBoxBoxTest; //!< Perform full BV-BV tests (true) or SAT-lite tests (false) + bool mFullPrimBoxTest; //!< Perform full Primitive-BV tests (true) or SAT-lite tests (false) + // Internal methods + + // Standard AABB trees + void _Collide(const AABBCollisionNode* b0, const AABBCollisionNode* b1); + // Quantized AABB trees + void _Collide(const AABBQuantizedNode* b0, const AABBQuantizedNode* b1, const Point& a, const Point& Pa, const Point& b, const Point& Pb); + // No-leaf AABB trees + void _CollideTriBox(const AABBNoLeafNode* b); + void _CollideBoxTri(const AABBNoLeafNode* b); + void _Collide(const AABBNoLeafNode* a, const AABBNoLeafNode* b); + // Quantized no-leaf AABB trees + void _CollideTriBox(const AABBQuantizedNoLeafNode* b); + void _CollideBoxTri(const AABBQuantizedNoLeafNode* b); + void _Collide(const AABBQuantizedNoLeafNode* a, const AABBQuantizedNoLeafNode* b); + // Overlap tests + void PrimTest(udword id0, udword id1); + inline_ void PrimTestTriIndex(udword id1); + inline_ void PrimTestIndexTri(udword id0); + + inline_ BOOL BoxBoxOverlap(const Point& ea, const Point& ca, const Point& eb, const Point& cb); + inline_ BOOL TriBoxOverlap(const Point& center, const Point& extents); + inline_ BOOL TriTriOverlap(const Point& V0, const Point& V1, const Point& V2, const Point& U0, const Point& U1, const Point& U2); + // Init methods + void InitQuery(const Matrix4x4* world0=null, const Matrix4x4* world1=null); + bool CheckTemporalCoherence(Pair* cache); + + inline_ BOOL Setup(const MeshInterface* mi0, const MeshInterface* mi1) + { + mIMesh0 = mi0; + mIMesh1 = mi1; + + if(!mIMesh0 || !mIMesh1) return FALSE; + + return TRUE; + } + }; + +#endif // __OPC_TREECOLLIDER_H__ diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_TriBoxOverlap.h b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_TriBoxOverlap.h new file mode 100644 index 00000000..a9ac2be6 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_TriBoxOverlap.h @@ -0,0 +1,356 @@ +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + + +//! This macro quickly finds the min & max values among 3 variables +#define FINDMINMAX(x0, x1, x2, min, max) \ + min = max = x0; \ + if(x1max) max=x1; \ + if(x2max) max=x2; + +//! TO BE DOCUMENTED +inline_ BOOL planeBoxOverlap(const Point& normal, const float d, const Point& maxbox) +{ + Point vmin, vmax; + for(udword q=0;q<=2;q++) + { + if(normal[q]>0.0f) { vmin[q]=-maxbox[q]; vmax[q]=maxbox[q]; } + else { vmin[q]=maxbox[q]; vmax[q]=-maxbox[q]; } + } + if((normal|vmin)+d>0.0f) return FALSE; + if((normal|vmax)+d>=0.0f) return TRUE; + + return FALSE; +} + +//! TO BE DOCUMENTED +#define AXISTEST_X01(a, b, fa, fb) \ + min = a*v0.y - b*v0.z; \ + max = a*v2.y - b*v2.z; \ + if(min>max) {const float tmp=max; max=min; min=tmp; } \ + rad = fa * extents.y + fb * extents.z; \ + if(min>rad || max<-rad) return FALSE; + +//! TO BE DOCUMENTED +#define AXISTEST_X2(a, b, fa, fb) \ + min = a*v0.y - b*v0.z; \ + max = a*v1.y - b*v1.z; \ + if(min>max) {const float tmp=max; max=min; min=tmp; } \ + rad = fa * extents.y + fb * extents.z; \ + if(min>rad || max<-rad) return FALSE; + +//! TO BE DOCUMENTED +#define AXISTEST_Y02(a, b, fa, fb) \ + min = b*v0.z - a*v0.x; \ + max = b*v2.z - a*v2.x; \ + if(min>max) {const float tmp=max; max=min; min=tmp; } \ + rad = fa * extents.x + fb * extents.z; \ + if(min>rad || max<-rad) return FALSE; + +//! TO BE DOCUMENTED +#define AXISTEST_Y1(a, b, fa, fb) \ + min = b*v0.z - a*v0.x; \ + max = b*v1.z - a*v1.x; \ + if(min>max) {const float tmp=max; max=min; min=tmp; } \ + rad = fa * extents.x + fb * extents.z; \ + if(min>rad || max<-rad) return FALSE; + +//! TO BE DOCUMENTED +#define AXISTEST_Z12(a, b, fa, fb) \ + min = a*v1.x - b*v1.y; \ + max = a*v2.x - b*v2.y; \ + if(min>max) {const float tmp=max; max=min; min=tmp; } \ + rad = fa * extents.x + fb * extents.y; \ + if(min>rad || max<-rad) return FALSE; + +//! TO BE DOCUMENTED +#define AXISTEST_Z0(a, b, fa, fb) \ + min = a*v0.x - b*v0.y; \ + max = a*v1.x - b*v1.y; \ + if(min>max) {const float tmp=max; max=min; min=tmp; } \ + rad = fa * extents.x + fb * extents.y; \ + if(min>rad || max<-rad) return FALSE; + +// compute triangle edges +// - edges lazy evaluated to take advantage of early exits +// - fabs precomputed (half less work, possible since extents are always >0) +// - customized macros to take advantage of the null component +// - axis vector discarded, possibly saves useless movs +#define IMPLEMENT_CLASS3_TESTS \ + float rad; \ + float min, max; \ + \ + const float fey0 = fabsf(e0.y); \ + const float fez0 = fabsf(e0.z); \ + AXISTEST_X01(e0.z, e0.y, fez0, fey0); \ + const float fex0 = fabsf(e0.x); \ + AXISTEST_Y02(e0.z, e0.x, fez0, fex0); \ + AXISTEST_Z12(e0.y, e0.x, fey0, fex0); \ + \ + const float fey1 = fabsf(e1.y); \ + const float fez1 = fabsf(e1.z); \ + AXISTEST_X01(e1.z, e1.y, fez1, fey1); \ + const float fex1 = fabsf(e1.x); \ + AXISTEST_Y02(e1.z, e1.x, fez1, fex1); \ + AXISTEST_Z0(e1.y, e1.x, fey1, fex1); \ + \ + const Point e2 = mLeafVerts[0] - mLeafVerts[2]; \ + const float fey2 = fabsf(e2.y); \ + const float fez2 = fabsf(e2.z); \ + AXISTEST_X2(e2.z, e2.y, fez2, fey2); \ + const float fex2 = fabsf(e2.x); \ + AXISTEST_Y1(e2.z, e2.x, fez2, fex2); \ + AXISTEST_Z12(e2.y, e2.x, fey2, fex2); + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Triangle-Box overlap test using the separating axis theorem. + * This is the code from Tomas Möller, a bit optimized: + * - with some more lazy evaluation (faster path on PC) + * - with a tiny bit of assembly + * - with "SAT-lite" applied if needed + * - and perhaps with some more minor modifs... + * + * \param center [in] box center + * \param extents [in] box extents + * \return true if triangle & box overlap + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +inline_ BOOL AABBTreeCollider::TriBoxOverlap(const Point& center, const Point& extents) +{ + // Stats + mNbBVPrimTests++; + + // use separating axis theorem to test overlap between triangle and box + // need to test for overlap in these directions: + // 1) the {x,y,z}-directions (actually, since we use the AABB of the triangle + // we do not even need to test these) + // 2) normal of the triangle + // 3) crossproduct(edge from tri, {x,y,z}-directin) + // this gives 3x3=9 more tests + + // move everything so that the boxcenter is in (0,0,0) + Point v0, v1, v2; + v0.x = mLeafVerts[0].x - center.x; + v1.x = mLeafVerts[1].x - center.x; + v2.x = mLeafVerts[2].x - center.x; + + // First, test overlap in the {x,y,z}-directions +#ifdef OPC_USE_FCOMI + // find min, max of the triangle in x-direction, and test for overlap in X + if(FCMin3(v0.x, v1.x, v2.x)>extents.x) return FALSE; + if(FCMax3(v0.x, v1.x, v2.x)<-extents.x) return FALSE; + + // same for Y + v0.y = mLeafVerts[0].y - center.y; + v1.y = mLeafVerts[1].y - center.y; + v2.y = mLeafVerts[2].y - center.y; + + if(FCMin3(v0.y, v1.y, v2.y)>extents.y) return FALSE; + if(FCMax3(v0.y, v1.y, v2.y)<-extents.y) return FALSE; + + // same for Z + v0.z = mLeafVerts[0].z - center.z; + v1.z = mLeafVerts[1].z - center.z; + v2.z = mLeafVerts[2].z - center.z; + + if(FCMin3(v0.z, v1.z, v2.z)>extents.z) return FALSE; + if(FCMax3(v0.z, v1.z, v2.z)<-extents.z) return FALSE; +#else + float min,max; + // Find min, max of the triangle in x-direction, and test for overlap in X + FINDMINMAX(v0.x, v1.x, v2.x, min, max); + if(min>extents.x || max<-extents.x) return FALSE; + + // Same for Y + v0.y = mLeafVerts[0].y - center.y; + v1.y = mLeafVerts[1].y - center.y; + v2.y = mLeafVerts[2].y - center.y; + + FINDMINMAX(v0.y, v1.y, v2.y, min, max); + if(min>extents.y || max<-extents.y) return FALSE; + + // Same for Z + v0.z = mLeafVerts[0].z - center.z; + v1.z = mLeafVerts[1].z - center.z; + v2.z = mLeafVerts[2].z - center.z; + + FINDMINMAX(v0.z, v1.z, v2.z, min, max); + if(min>extents.z || max<-extents.z) return FALSE; +#endif + // 2) Test if the box intersects the plane of the triangle + // compute plane equation of triangle: normal*x+d=0 + // ### could be precomputed since we use the same leaf triangle several times + const Point e0 = v1 - v0; + const Point e1 = v2 - v1; + const Point normal = e0 ^ e1; + const float d = -normal|v0; + if(!planeBoxOverlap(normal, d, extents)) return FALSE; + + // 3) "Class III" tests + if(mFullPrimBoxTest) + { + IMPLEMENT_CLASS3_TESTS + } + return TRUE; +} + +//! A dedicated version where the box is constant +inline_ BOOL OBBCollider::TriBoxOverlap() +{ + // Stats + mNbVolumePrimTests++; + + // Hook + const Point& extents = mBoxExtents; + const Point& v0 = mLeafVerts[0]; + const Point& v1 = mLeafVerts[1]; + const Point& v2 = mLeafVerts[2]; + + // use separating axis theorem to test overlap between triangle and box + // need to test for overlap in these directions: + // 1) the {x,y,z}-directions (actually, since we use the AABB of the triangle + // we do not even need to test these) + // 2) normal of the triangle + // 3) crossproduct(edge from tri, {x,y,z}-directin) + // this gives 3x3=9 more tests + + // Box center is already in (0,0,0) + + // First, test overlap in the {x,y,z}-directions +#ifdef OPC_USE_FCOMI + // find min, max of the triangle in x-direction, and test for overlap in X + if(FCMin3(v0.x, v1.x, v2.x)>mBoxExtents.x) return FALSE; + if(FCMax3(v0.x, v1.x, v2.x)<-mBoxExtents.x) return FALSE; + + if(FCMin3(v0.y, v1.y, v2.y)>mBoxExtents.y) return FALSE; + if(FCMax3(v0.y, v1.y, v2.y)<-mBoxExtents.y) return FALSE; + + if(FCMin3(v0.z, v1.z, v2.z)>mBoxExtents.z) return FALSE; + if(FCMax3(v0.z, v1.z, v2.z)<-mBoxExtents.z) return FALSE; +#else + float min,max; + // Find min, max of the triangle in x-direction, and test for overlap in X + FINDMINMAX(v0.x, v1.x, v2.x, min, max); + if(min>mBoxExtents.x || max<-mBoxExtents.x) return FALSE; + + FINDMINMAX(v0.y, v1.y, v2.y, min, max); + if(min>mBoxExtents.y || max<-mBoxExtents.y) return FALSE; + + FINDMINMAX(v0.z, v1.z, v2.z, min, max); + if(min>mBoxExtents.z || max<-mBoxExtents.z) return FALSE; +#endif + // 2) Test if the box intersects the plane of the triangle + // compute plane equation of triangle: normal*x+d=0 + // ### could be precomputed since we use the same leaf triangle several times + const Point e0 = v1 - v0; + const Point e1 = v2 - v1; + const Point normal = e0 ^ e1; + const float d = -normal|v0; + if(!planeBoxOverlap(normal, d, mBoxExtents)) return FALSE; + + // 3) "Class III" tests - here we always do full tests since the box is a primitive (not a BV) + { + IMPLEMENT_CLASS3_TESTS + } + return TRUE; +} + +//! ...and another one, jeez +inline_ BOOL AABBCollider::TriBoxOverlap() +{ + // Stats + mNbVolumePrimTests++; + + // Hook + const Point& center = mBox.mCenter; + const Point& extents = mBox.mExtents; + + // use separating axis theorem to test overlap between triangle and box + // need to test for overlap in these directions: + // 1) the {x,y,z}-directions (actually, since we use the AABB of the triangle + // we do not even need to test these) + // 2) normal of the triangle + // 3) crossproduct(edge from tri, {x,y,z}-directin) + // this gives 3x3=9 more tests + + // move everything so that the boxcenter is in (0,0,0) + Point v0, v1, v2; + v0.x = mLeafVerts[0].x - center.x; + v1.x = mLeafVerts[1].x - center.x; + v2.x = mLeafVerts[2].x - center.x; + + // First, test overlap in the {x,y,z}-directions +#ifdef OPC_USE_FCOMI + // find min, max of the triangle in x-direction, and test for overlap in X + if(FCMin3(v0.x, v1.x, v2.x)>extents.x) return FALSE; + if(FCMax3(v0.x, v1.x, v2.x)<-extents.x) return FALSE; + + // same for Y + v0.y = mLeafVerts[0].y - center.y; + v1.y = mLeafVerts[1].y - center.y; + v2.y = mLeafVerts[2].y - center.y; + + if(FCMin3(v0.y, v1.y, v2.y)>extents.y) return FALSE; + if(FCMax3(v0.y, v1.y, v2.y)<-extents.y) return FALSE; + + // same for Z + v0.z = mLeafVerts[0].z - center.z; + v1.z = mLeafVerts[1].z - center.z; + v2.z = mLeafVerts[2].z - center.z; + + if(FCMin3(v0.z, v1.z, v2.z)>extents.z) return FALSE; + if(FCMax3(v0.z, v1.z, v2.z)<-extents.z) return FALSE; +#else + float min,max; + // Find min, max of the triangle in x-direction, and test for overlap in X + FINDMINMAX(v0.x, v1.x, v2.x, min, max); + if(min>extents.x || max<-extents.x) return FALSE; + + // Same for Y + v0.y = mLeafVerts[0].y - center.y; + v1.y = mLeafVerts[1].y - center.y; + v2.y = mLeafVerts[2].y - center.y; + + FINDMINMAX(v0.y, v1.y, v2.y, min, max); + if(min>extents.y || max<-extents.y) return FALSE; + + // Same for Z + v0.z = mLeafVerts[0].z - center.z; + v1.z = mLeafVerts[1].z - center.z; + v2.z = mLeafVerts[2].z - center.z; + + FINDMINMAX(v0.z, v1.z, v2.z, min, max); + if(min>extents.z || max<-extents.z) return FALSE; +#endif + // 2) Test if the box intersects the plane of the triangle + // compute plane equation of triangle: normal*x+d=0 + // ### could be precomputed since we use the same leaf triangle several times + const Point e0 = v1 - v0; + const Point e1 = v2 - v1; + const Point normal = e0 ^ e1; + const float d = -normal|v0; + if(!planeBoxOverlap(normal, d, extents)) return FALSE; + + // 3) "Class III" tests - here we always do full tests since the box is a primitive (not a BV) + { + IMPLEMENT_CLASS3_TESTS + } + return TRUE; +} diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_TriTriOverlap.h b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_TriTriOverlap.h new file mode 100644 index 00000000..d1968e54 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_TriTriOverlap.h @@ -0,0 +1,295 @@ +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +//! if OPC_TRITRI_EPSILON_TEST is true then we do a check (if |dv|b) \ + { \ + const float c=a; \ + a=b; \ + b=c; \ + } + +//! Edge to edge test based on Franlin Antonio's gem: "Faster Line Segment Intersection", in Graphics Gems III, pp. 199-202 +#define EDGE_EDGE_TEST(V0, U0, U1) \ + Bx = U0[i0] - U1[i0]; \ + By = U0[i1] - U1[i1]; \ + Cx = V0[i0] - U0[i0]; \ + Cy = V0[i1] - U0[i1]; \ + f = Ay*Bx - Ax*By; \ + d = By*Cx - Bx*Cy; \ + if((f>0.0f && d>=0.0f && d<=f) || (f<0.0f && d<=0.0f && d>=f)) \ + { \ + const float e=Ax*Cy - Ay*Cx; \ + if(f>0.0f) \ + { \ + if(e>=0.0f && e<=f) return TRUE; \ + } \ + else \ + { \ + if(e<=0.0f && e>=f) return TRUE; \ + } \ + } + +//! TO BE DOCUMENTED +#define EDGE_AGAINST_TRI_EDGES(V0, V1, U0, U1, U2) \ +{ \ + float Bx,By,Cx,Cy,d,f; \ + const float Ax = V1[i0] - V0[i0]; \ + const float Ay = V1[i1] - V0[i1]; \ + /* test edge U0,U1 against V0,V1 */ \ + EDGE_EDGE_TEST(V0, U0, U1); \ + /* test edge U1,U2 against V0,V1 */ \ + EDGE_EDGE_TEST(V0, U1, U2); \ + /* test edge U2,U1 against V0,V1 */ \ + EDGE_EDGE_TEST(V0, U2, U0); \ +} + +//! TO BE DOCUMENTED +#define POINT_IN_TRI(V0, U0, U1, U2) \ +{ \ + /* is T1 completly inside T2? */ \ + /* check if V0 is inside tri(U0,U1,U2) */ \ + float a = U1[i1] - U0[i1]; \ + float b = -(U1[i0] - U0[i0]); \ + float c = -a*U0[i0] - b*U0[i1]; \ + float d0 = a*V0[i0] + b*V0[i1] + c; \ + \ + a = U2[i1] - U1[i1]; \ + b = -(U2[i0] - U1[i0]); \ + c = -a*U1[i0] - b*U1[i1]; \ + const float d1 = a*V0[i0] + b*V0[i1] + c; \ + \ + a = U0[i1] - U2[i1]; \ + b = -(U0[i0] - U2[i0]); \ + c = -a*U2[i0] - b*U2[i1]; \ + const float d2 = a*V0[i0] + b*V0[i1] + c; \ + if(d0*d1>0.0f) \ + { \ + if(d0*d2>0.0f) return TRUE; \ + } \ +} + +//! TO BE DOCUMENTED +BOOL CoplanarTriTri(const Point& n, const Point& v0, const Point& v1, const Point& v2, const Point& u0, const Point& u1, const Point& u2) +{ + float A[3]; + short i0,i1; + /* first project onto an axis-aligned plane, that maximizes the area */ + /* of the triangles, compute indices: i0,i1. */ + A[0] = fabsf(n[0]); + A[1] = fabsf(n[1]); + A[2] = fabsf(n[2]); + if(A[0]>A[1]) + { + if(A[0]>A[2]) + { + i0=1; /* A[0] is greatest */ + i1=2; + } + else + { + i0=0; /* A[2] is greatest */ + i1=1; + } + } + else /* A[0]<=A[1] */ + { + if(A[2]>A[1]) + { + i0=0; /* A[2] is greatest */ + i1=1; + } + else + { + i0=0; /* A[1] is greatest */ + i1=2; + } + } + + /* test all edges of triangle 1 against the edges of triangle 2 */ + EDGE_AGAINST_TRI_EDGES(v0, v1, u0, u1, u2); + EDGE_AGAINST_TRI_EDGES(v1, v2, u0, u1, u2); + EDGE_AGAINST_TRI_EDGES(v2, v0, u0, u1, u2); + + /* finally, test if tri1 is totally contained in tri2 or vice versa */ + POINT_IN_TRI(v0, u0, u1, u2); + POINT_IN_TRI(u0, v0, v1, v2); + + return FALSE; +} + +//! TO BE DOCUMENTED +#define NEWCOMPUTE_INTERVALS(VV0, VV1, VV2, D0, D1, D2, D0D1, D0D2, A, B, C, X0, X1) \ +{ \ + if(D0D1>0.0f) \ + { \ + /* here we know that D0D2<=0.0 */ \ + /* that is D0, D1 are on the same side, D2 on the other or on the plane */ \ + A=VV2; B=(VV0 - VV2)*D2; C=(VV1 - VV2)*D2; X0=D2 - D0; X1=D2 - D1; \ + } \ + else if(D0D2>0.0f) \ + { \ + /* here we know that d0d1<=0.0 */ \ + A=VV1; B=(VV0 - VV1)*D1; C=(VV2 - VV1)*D1; X0=D1 - D0; X1=D1 - D2; \ + } \ + else if(D1*D2>0.0f || D0!=0.0f) \ + { \ + /* here we know that d0d1<=0.0 or that D0!=0.0 */ \ + A=VV0; B=(VV1 - VV0)*D0; C=(VV2 - VV0)*D0; X0=D0 - D1; X1=D0 - D2; \ + } \ + else if(D1!=0.0f) \ + { \ + A=VV1; B=(VV0 - VV1)*D1; C=(VV2 - VV1)*D1; X0=D1 - D0; X1=D1 - D2; \ + } \ + else if(D2!=0.0f) \ + { \ + A=VV2; B=(VV0 - VV2)*D2; C=(VV1 - VV2)*D2; X0=D2 - D0; X1=D2 - D1; \ + } \ + else \ + { \ + /* triangles are coplanar */ \ + return CoplanarTriTri(N1, V0, V1, V2, U0, U1, U2); \ + } \ +} + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Triangle/triangle intersection test routine, + * by Tomas Moller, 1997. + * See article "A Fast Triangle-Triangle Intersection Test", + * Journal of Graphics Tools, 2(2), 1997 + * + * Updated June 1999: removed the divisions -- a little faster now! + * Updated October 1999: added {} to CROSS and SUB macros + * + * int NoDivTriTriIsect(float V0[3],float V1[3],float V2[3], + * float U0[3],float U1[3],float U2[3]) + * + * \param V0 [in] triangle 0, vertex 0 + * \param V1 [in] triangle 0, vertex 1 + * \param V2 [in] triangle 0, vertex 2 + * \param U0 [in] triangle 1, vertex 0 + * \param U1 [in] triangle 1, vertex 1 + * \param U2 [in] triangle 1, vertex 2 + * \return true if triangles overlap + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +inline_ BOOL AABBTreeCollider::TriTriOverlap(const Point& V0, const Point& V1, const Point& V2, const Point& U0, const Point& U1, const Point& U2) +{ + // Stats + mNbPrimPrimTests++; + + // Compute plane equation of triangle(V0,V1,V2) + Point E1 = V1 - V0; + Point E2 = V2 - V0; + const Point N1 = E1 ^ E2; + const float d1 =-N1 | V0; + // Plane equation 1: N1.X+d1=0 + + // Put U0,U1,U2 into plane equation 1 to compute signed distances to the plane + float du0 = (N1|U0) + d1; + float du1 = (N1|U1) + d1; + float du2 = (N1|U2) + d1; + + // Coplanarity robustness check +#ifdef OPC_TRITRI_EPSILON_TEST + if(fabsf(du0)0.0f && du0du2>0.0f) // same sign on all of them + not equal 0 ? + return FALSE; // no intersection occurs + + // Compute plane of triangle (U0,U1,U2) + E1 = U1 - U0; + E2 = U2 - U0; + const Point N2 = E1 ^ E2; + const float d2=-N2 | U0; + // plane equation 2: N2.X+d2=0 + + // put V0,V1,V2 into plane equation 2 + float dv0 = (N2|V0) + d2; + float dv1 = (N2|V1) + d2; + float dv2 = (N2|V2) + d2; + +#ifdef OPC_TRITRI_EPSILON_TEST + if(fabsf(dv0)0.0f && dv0dv2>0.0f) // same sign on all of them + not equal 0 ? + return FALSE; // no intersection occurs + + // Compute direction of intersection line + const Point D = N1^N2; + + // Compute and index to the largest component of D + float max=fabsf(D[0]); + short index=0; + float bb=fabsf(D[1]); + float cc=fabsf(D[2]); + if(bb>max) max=bb,index=1; + if(cc>max) max=cc,index=2; + + // This is the simplified projection onto L + const float vp0 = V0[index]; + const float vp1 = V1[index]; + const float vp2 = V2[index]; + + const float up0 = U0[index]; + const float up1 = U1[index]; + const float up2 = U2[index]; + + // Compute interval for triangle 1 + float a,b,c,x0,x1; + NEWCOMPUTE_INTERVALS(vp0,vp1,vp2,dv0,dv1,dv2,dv0dv1,dv0dv2,a,b,c,x0,x1); + + // Compute interval for triangle 2 + float d,e,f,y0,y1; + NEWCOMPUTE_INTERVALS(up0,up1,up2,du0,du1,du2,du0du1,du0du2,d,e,f,y0,y1); + + const float xx=x0*x1; + const float yy=y0*y1; + const float xxyy=xx*yy; + + float isect1[2], isect2[2]; + + float tmp=a*xxyy; + isect1[0]=tmp+b*x1*yy; + isect1[1]=tmp+c*x0*yy; + + tmp=d*xxyy; + isect2[0]=tmp+e*xx*y1; + isect2[1]=tmp+f*xx*y0; + + SORT(isect1[0],isect1[1]); + SORT(isect2[0],isect2[1]); + + if(isect1[1]HasPosLeaf()) mTouchedPrimitives->Add(node->GetPosPrimitive()); \ + else _Dump(node->GetPos()); \ + \ + if(ContactFound()) return; \ + \ + if(node->HasNegLeaf()) mTouchedPrimitives->Add(node->GetNegPrimitive()); \ + else _Dump(node->GetNeg()); \ +} + +#define IMPLEMENT_LEAFDUMP(type) \ +void VolumeCollider::_Dump(const type* node) \ +{ \ + if(node->IsLeaf()) \ + { \ + mTouchedPrimitives->Add(node->GetPrimitive()); \ + } \ + else \ + { \ + _Dump(node->GetPos()); \ + \ + if(ContactFound()) return; \ + \ + _Dump(node->GetNeg()); \ + } \ +} + +IMPLEMENT_NOLEAFDUMP(AABBNoLeafNode) +IMPLEMENT_NOLEAFDUMP(AABBQuantizedNoLeafNode) + +IMPLEMENT_LEAFDUMP(AABBCollisionNode) +IMPLEMENT_LEAFDUMP(AABBQuantizedNode) diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_VolumeCollider.h b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_VolumeCollider.h new file mode 100644 index 00000000..e0eb6267 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/OPC_VolumeCollider.h @@ -0,0 +1,147 @@ +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Contains base volume collider class. + * \file OPC_VolumeCollider.h + * \author Pierre Terdiman + * \date June, 2, 2001 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef __OPC_VOLUMECOLLIDER_H__ +#define __OPC_VOLUMECOLLIDER_H__ + + struct OPCODE_API VolumeCache + { + VolumeCache() : Model(null) {} + ~VolumeCache() {} + + Container TouchedPrimitives; //!< Indices of touched primitives + const BaseModel* Model; //!< Owner + }; + + class OPCODE_API VolumeCollider : public Collider + { + public: + // Constructor / Destructor + VolumeCollider(); + virtual ~VolumeCollider() = 0; + + // Collision report + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Gets the number of touched primitives after a collision query. + * \see GetContactStatus() + * \see GetTouchedPrimitives() + * \return the number of touched primitives + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ udword GetNbTouchedPrimitives() const { return mTouchedPrimitives ? mTouchedPrimitives->GetNbEntries() : 0; } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Gets the list of touched primitives after a collision query. + * \see GetContactStatus() + * \see GetNbTouchedPrimitives() + * \return the list of touched primitives (primitive indices) + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ const udword* GetTouchedPrimitives() const { return mTouchedPrimitives ? mTouchedPrimitives->GetEntries() : null; } + + // Stats + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Stats: gets the number of Volume-BV overlap tests after a collision query. + * \see GetNbVolumePrimTests() + * \return the number of Volume-BV tests performed during last query + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ udword GetNbVolumeBVTests() const { return mNbVolumeBVTests; } + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Stats: gets the number of Volume-Triangle overlap tests after a collision query. + * \see GetNbVolumeBVTests() + * \return the number of Volume-Triangle tests performed during last query + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + inline_ udword GetNbVolumePrimTests() const { return mNbVolumePrimTests; } + + // Settings + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Validates current settings. You should call this method after all the settings / callbacks have been defined for a collider. + * \return null if everything is ok, else a string describing the problem + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + override(Collider) const char* ValidateSettings(); + + protected: + // Touched primitives + Container* mTouchedPrimitives; //!< List of touched primitives + + // Dequantization coeffs + Point mCenterCoeff; + Point mExtentsCoeff; + // Stats + udword mNbVolumeBVTests; //!< Number of Volume-BV tests + udword mNbVolumePrimTests; //!< Number of Volume-Primitive tests + // Internal methods + void _Dump(const AABBCollisionNode* node); + void _Dump(const AABBNoLeafNode* node); + void _Dump(const AABBQuantizedNode* node); + void _Dump(const AABBQuantizedNoLeafNode* node); + + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + /** + * Initializes a query + */ + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + override(Collider) inline_ void InitQuery() + { + // Reset stats & contact status + mNbVolumeBVTests = 0; + mNbVolumePrimTests = 0; + Collider::InitQuery(); + } + + inline_ BOOL IsCacheValid(VolumeCache& cache) + { + // We're going to do a volume-vs-model query. + if(cache.Model!=mCurrentModel) + { + // Cached list was for another model so we can't keep it + // Keep track of new owner and reset cache + cache.Model = mCurrentModel; + return FALSE; + } + else + { + // Same models, no problem + return TRUE; + } + } + }; + +#endif // __OPC_VOLUMECOLLIDER_H__ diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Opcode.cpp b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Opcode.cpp new file mode 100644 index 00000000..68511a63 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Opcode.cpp @@ -0,0 +1,74 @@ +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Main file for Opcode.dll. + * \file Opcode.cpp + * \author Pierre Terdiman + * \date March, 20, 2001 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/* + Finding a good name is difficult! + Here's the draft for this lib.... Spooky, uh? + + VOID? Very Optimized Interference Detection + ZOID? Zappy's Optimized Interference Detection + CID? Custom/Clever Interference Detection + AID / ACID! Accurate Interference Detection + QUID? Quick Interference Detection + RIDE? Realtime Interference DEtection + WIDE? Wicked Interference DEtection (....) + GUID! + KID ! k-dop interference detection :) + OPCODE! OPtimized COllision DEtection +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Precompiled Header +#include "Stdafx.h" + +bool Opcode::InitOpcode() +{ + Log("// Initializing OPCODE\n\n"); +// LogAPIInfo(); + return true; +} + +void ReleasePruningSorters(); +bool Opcode::CloseOpcode() +{ + Log("// Closing OPCODE\n\n"); + + ReleasePruningSorters(); + + return true; +} + +#ifdef ICE_MAIN + +void ModuleAttach(HINSTANCE hinstance) +{ +} + +void ModuleDetach() +{ +} + +#endif \ No newline at end of file diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Opcode.dsp b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Opcode.dsp new file mode 100644 index 00000000..ddadef62 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Opcode.dsp @@ -0,0 +1,517 @@ +# Microsoft Developer Studio Project File - Name="Opcode" - Package Owner=<4> +# Microsoft Developer Studio Generated Build File, Format Version 6.00 +# ** DO NOT EDIT ** + +# TARGTYPE "Win32 (x86) Dynamic-Link Library" 0x0102 + +CFG=Opcode - Win32 Debug +!MESSAGE This is not a valid makefile. To build this project using NMAKE, +!MESSAGE use the Export Makefile command and run +!MESSAGE +!MESSAGE NMAKE /f "Opcode.mak". +!MESSAGE +!MESSAGE You can specify a configuration when running NMAKE +!MESSAGE by defining the macro CFG on the command line. For example: +!MESSAGE +!MESSAGE NMAKE /f "Opcode.mak" CFG="Opcode - Win32 Debug" +!MESSAGE +!MESSAGE Possible choices for configuration are: +!MESSAGE +!MESSAGE "Opcode - Win32 Release" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE "Opcode - Win32 Debug" (based on "Win32 (x86) Dynamic-Link Library") +!MESSAGE + +# Begin Project +# PROP AllowPerConfigDependencies 0 +# PROP Scc_ProjName "" +# PROP Scc_LocalPath "" +CPP=cl.exe +MTL=midl.exe +RSC=rc.exe + +!IF "$(CFG)" == "Opcode - Win32 Release" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 0 +# PROP BASE Output_Dir "Release" +# PROP BASE Intermediate_Dir "Release" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 0 +# PROP Output_Dir "Release" +# PROP Intermediate_Dir "Release" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MT /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "OPCODE_EXPORTS" /Yu"stdafx.h" /FD /c +# ADD CPP /nologo /MD /W3 /O2 /D "WIN32" /D "NDEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "OPCODE_EXPORTS" /Yu"stdafx.h" /FD /QIfist /c +# ADD BASE MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "NDEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x40c /d "NDEBUG" +# ADD RSC /l 0x40c /d "NDEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /machine:I386 +# ADD LINK32 /nologo /dll /machine:I386 +# SUBTRACT LINK32 /debug + +!ELSEIF "$(CFG)" == "Opcode - Win32 Debug" + +# PROP BASE Use_MFC 0 +# PROP BASE Use_Debug_Libraries 1 +# PROP BASE Output_Dir "Debug" +# PROP BASE Intermediate_Dir "Debug" +# PROP BASE Target_Dir "" +# PROP Use_MFC 0 +# PROP Use_Debug_Libraries 1 +# PROP Output_Dir "Debug" +# PROP Intermediate_Dir "Debug" +# PROP Ignore_Export_Lib 0 +# PROP Target_Dir "" +# ADD BASE CPP /nologo /MTd /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "OPCODE_EXPORTS" /Yu"stdafx.h" /FD /GZ /c +# ADD CPP /nologo /MTd /W3 /Gm /Zi /Od /D "WIN32" /D "_DEBUG" /D "_WINDOWS" /D "_MBCS" /D "_USRDLL" /D "OPCODE_EXPORTS" /FR /Yu"stdafx.h" /FD /GZ /QIfist /c +# ADD BASE MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD MTL /nologo /D "_DEBUG" /mktyplib203 /win32 +# ADD BASE RSC /l 0x40c /d "_DEBUG" +# ADD RSC /l 0x40c /d "_DEBUG" +BSC32=bscmake.exe +# ADD BASE BSC32 /nologo +# ADD BSC32 /nologo +LINK32=link.exe +# ADD BASE LINK32 kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib /nologo /dll /debug /machine:I386 /pdbtype:sept +# ADD LINK32 /nologo /dll /incremental:no /debug /machine:I386 /out:"Debug\Opcode_D.dll" /pdbtype:sept + +!ENDIF + +# Begin Target + +# Name "Opcode - Win32 Release" +# Name "Opcode - Win32 Debug" +# Begin Group "API" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\OPC_BaseModel.cpp +# End Source File +# Begin Source File + +SOURCE=.\OPC_BaseModel.h +# End Source File +# Begin Source File + +SOURCE=.\OPC_HybridModel.cpp +# End Source File +# Begin Source File + +SOURCE=.\OPC_HybridModel.h +# End Source File +# Begin Source File + +SOURCE=.\OPC_IceHook.h +# End Source File +# Begin Source File + +SOURCE=.\OPC_Model.cpp +# End Source File +# Begin Source File + +SOURCE=.\OPC_Model.h +# End Source File +# Begin Source File + +SOURCE=.\OPC_Settings.h +# End Source File +# Begin Source File + +SOURCE=.\Opcode.cpp +# End Source File +# Begin Source File + +SOURCE=.\Opcode.h +# End Source File +# Begin Source File + +SOURCE=.\StdAfx.cpp +# ADD CPP /Yc"stdafx.h" +# End Source File +# Begin Source File + +SOURCE=.\StdAfx.h +# End Source File +# End Group +# Begin Group "Trees" + +# PROP Default_Filter "" +# Begin Group "Collision queries" + +# PROP Default_Filter "" +# Begin Group "Base colliders" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\OPC_Collider.cpp +# End Source File +# Begin Source File + +SOURCE=.\OPC_Collider.h +# End Source File +# Begin Source File + +SOURCE=.\OPC_VolumeCollider.cpp +# End Source File +# Begin Source File + +SOURCE=.\OPC_VolumeCollider.h +# End Source File +# End Group +# Begin Group "Standard colliders" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\OPC_AABBCollider.cpp +# End Source File +# Begin Source File + +SOURCE=.\OPC_AABBCollider.h +# End Source File +# Begin Source File + +SOURCE=.\OPC_LSSCollider.cpp +# End Source File +# Begin Source File + +SOURCE=.\OPC_LSSCollider.h +# End Source File +# Begin Source File + +SOURCE=.\OPC_OBBCollider.cpp +# End Source File +# Begin Source File + +SOURCE=.\OPC_OBBCollider.h +# End Source File +# Begin Source File + +SOURCE=.\OPC_PlanesCollider.cpp +# End Source File +# Begin Source File + +SOURCE=.\OPC_PlanesCollider.h +# End Source File +# Begin Source File + +SOURCE=.\OPC_RayCollider.cpp +# End Source File +# Begin Source File + +SOURCE=.\OPC_RayCollider.h +# End Source File +# Begin Source File + +SOURCE=.\OPC_SphereCollider.cpp +# End Source File +# Begin Source File + +SOURCE=.\OPC_SphereCollider.h +# End Source File +# Begin Source File + +SOURCE=.\OPC_TreeCollider.cpp +# End Source File +# Begin Source File + +SOURCE=.\OPC_TreeCollider.h +# End Source File +# End Group +# End Group +# Begin Source File + +SOURCE=.\OPC_AABBTree.cpp +# End Source File +# Begin Source File + +SOURCE=.\OPC_AABBTree.h +# End Source File +# Begin Source File + +SOURCE=.\OPC_Common.cpp +# End Source File +# Begin Source File + +SOURCE=.\OPC_Common.h +# End Source File +# Begin Source File + +SOURCE=.\OPC_MeshInterface.cpp +# End Source File +# Begin Source File + +SOURCE=.\OPC_MeshInterface.h +# End Source File +# Begin Source File + +SOURCE=.\OPC_OptimizedTree.cpp +# End Source File +# Begin Source File + +SOURCE=.\OPC_OptimizedTree.h +# End Source File +# Begin Source File + +SOURCE=.\OPC_TreeBuilders.cpp +# End Source File +# Begin Source File + +SOURCE=.\OPC_TreeBuilders.h +# End Source File +# End Group +# Begin Group "Overlap tests" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\OPC_BoxBoxOverlap.h +# End Source File +# Begin Source File + +SOURCE=.\OPC_LSSAABBOverlap.h +# End Source File +# Begin Source File + +SOURCE=.\OPC_LSSTriOverlap.h +# End Source File +# Begin Source File + +SOURCE=.\OPC_PlanesAABBOverlap.h +# End Source File +# Begin Source File + +SOURCE=.\OPC_PlanesTriOverlap.h +# End Source File +# Begin Source File + +SOURCE=.\OPC_RayAABBOverlap.h +# End Source File +# Begin Source File + +SOURCE=.\OPC_RayTriOverlap.h +# End Source File +# Begin Source File + +SOURCE=.\OPC_SphereAABBOverlap.h +# End Source File +# Begin Source File + +SOURCE=.\OPC_SphereTriOverlap.h +# End Source File +# Begin Source File + +SOURCE=.\OPC_TriBoxOverlap.h +# End Source File +# Begin Source File + +SOURCE=.\OPC_TriTriOverlap.h +# End Source File +# End Group +# Begin Group "SweepAndPrune" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\OPC_BoxPruning.cpp +# End Source File +# Begin Source File + +SOURCE=.\OPC_BoxPruning.h +# End Source File +# Begin Source File + +SOURCE=.\OPC_SweepAndPrune.cpp +# End Source File +# Begin Source File + +SOURCE=.\OPC_SweepAndPrune.h +# End Source File +# End Group +# Begin Group "Usages" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\OPC_Picking.cpp +# End Source File +# Begin Source File + +SOURCE=.\OPC_Picking.h +# End Source File +# End Group +# Begin Group "Ice" + +# PROP Default_Filter "" +# Begin Source File + +SOURCE=.\Ice\IceAABB.cpp +# End Source File +# Begin Source File + +SOURCE=.\Ice\IceAABB.h +# End Source File +# Begin Source File + +SOURCE=.\Ice\IceAxes.h +# End Source File +# Begin Source File + +SOURCE=.\Ice\IceBoundingSphere.h +# End Source File +# Begin Source File + +SOURCE=.\Ice\IceContainer.cpp +# End Source File +# Begin Source File + +SOURCE=.\Ice\IceContainer.h +# End Source File +# Begin Source File + +SOURCE=.\Ice\IceFPU.h +# End Source File +# Begin Source File + +SOURCE=.\Ice\IceHPoint.cpp +# End Source File +# Begin Source File + +SOURCE=.\Ice\IceHPoint.h +# End Source File +# Begin Source File + +SOURCE=.\Ice\IceIndexedTriangle.cpp +# End Source File +# Begin Source File + +SOURCE=.\Ice\IceIndexedTriangle.h +# End Source File +# Begin Source File + +SOURCE=.\Ice\IceLSS.h +# End Source File +# Begin Source File + +SOURCE=.\Ice\IceMatrix3x3.cpp +# End Source File +# Begin Source File + +SOURCE=.\Ice\IceMatrix3x3.h +# End Source File +# Begin Source File + +SOURCE=.\Ice\IceMatrix4x4.cpp +# End Source File +# Begin Source File + +SOURCE=.\Ice\IceMatrix4x4.h +# End Source File +# Begin Source File + +SOURCE=.\Ice\IceMemoryMacros.h +# End Source File +# Begin Source File + +SOURCE=.\Ice\IceOBB.cpp +# End Source File +# Begin Source File + +SOURCE=.\Ice\IceOBB.h +# End Source File +# Begin Source File + +SOURCE=.\Ice\IcePairs.h +# End Source File +# Begin Source File + +SOURCE=.\Ice\IcePlane.cpp +# End Source File +# Begin Source File + +SOURCE=.\Ice\IcePlane.h +# End Source File +# Begin Source File + +SOURCE=.\Ice\IcePoint.cpp +# End Source File +# Begin Source File + +SOURCE=.\Ice\IcePoint.h +# End Source File +# Begin Source File + +SOURCE=.\Ice\IcePreprocessor.h +# End Source File +# Begin Source File + +SOURCE=.\Ice\IceRandom.cpp +# End Source File +# Begin Source File + +SOURCE=.\Ice\IceRandom.h +# End Source File +# Begin Source File + +SOURCE=.\Ice\IceRay.cpp +# End Source File +# Begin Source File + +SOURCE=.\Ice\IceRay.h +# End Source File +# Begin Source File + +SOURCE=.\Ice\IceRevisitedRadix.cpp +# End Source File +# Begin Source File + +SOURCE=.\Ice\IceRevisitedRadix.h +# End Source File +# Begin Source File + +SOURCE=.\Ice\IceSegment.cpp +# End Source File +# Begin Source File + +SOURCE=.\Ice\IceSegment.h +# End Source File +# Begin Source File + +SOURCE=.\Ice\IceTriangle.cpp +# End Source File +# Begin Source File + +SOURCE=.\Ice\IceTriangle.h +# End Source File +# Begin Source File + +SOURCE=.\Ice\IceTrilist.h +# End Source File +# Begin Source File + +SOURCE=.\Ice\IceTypes.h +# End Source File +# Begin Source File + +SOURCE=.\Ice\IceUtils.cpp +# End Source File +# Begin Source File + +SOURCE=.\Ice\IceUtils.h +# End Source File +# End Group +# Begin Source File + +SOURCE=.\ReadMe.txt +# End Source File +# End Target +# End Project diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Opcode.dsw b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Opcode.dsw new file mode 100644 index 00000000..bc37a2ce --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Opcode.dsw @@ -0,0 +1,29 @@ +Microsoft Developer Studio Workspace File, Format Version 6.00 +# WARNING: DO NOT EDIT OR DELETE THIS WORKSPACE FILE! + +############################################################################### + +Project: "Opcode"=.\Opcode.dsp - Package Owner=<4> + +Package=<5> +{{{ +}}} + +Package=<4> +{{{ +}}} + +############################################################################### + +Global: + +Package=<5> +{{{ +}}} + +Package=<3> +{{{ +}}} + +############################################################################### + diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Opcode.h b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Opcode.h new file mode 100644 index 00000000..094b5794 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Opcode.h @@ -0,0 +1,99 @@ +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +/** + * Main file for Opcode.dll. + * \file Opcode.h + * \author Pierre Terdiman + * \date March, 20, 2001 + */ +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Include Guard +#ifndef __OPCODE_H__ +#define __OPCODE_H__ + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Compilation messages +#if defined(OPCODE_EXPORTS) + #pragma message("Compiling OPCODE") +#elif !defined(OPCODE_EXPORTS) + #pragma message("Using OPCODE") + /////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// + // Automatic linking + #ifndef BAN_OPCODE_AUTOLINK + #ifdef _DEBUG + #pragma comment(lib, "Opcode_D.lib") + #else + #pragma comment(lib, "Opcode.lib") + #endif + #endif +#endif + +/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// +// Preprocessor +#ifndef ICE_NO_DLL + #ifdef OPCODE_EXPORTS + #define OPCODE_API __declspec(dllexport) + #else + #define OPCODE_API __declspec(dllimport) + #endif +#else + #define OPCODE_API +#endif + + #include "OPC_IceHook.h" + + namespace Opcode + { + // Bulk-of-the-work + #include "OPC_Settings.h" + #include "OPC_Common.h" + #include "OPC_MeshInterface.h" + // Builders + #include "OPC_TreeBuilders.h" + // Trees + #include "OPC_AABBTree.h" + #include "OPC_OptimizedTree.h" + // Models + #include "OPC_BaseModel.h" + #include "OPC_Model.h" + #include "OPC_HybridModel.h" + // Colliders + #include "OPC_Collider.h" + #include "OPC_VolumeCollider.h" + #include "OPC_TreeCollider.h" + #include "OPC_RayCollider.h" + #include "OPC_SphereCollider.h" + #include "OPC_OBBCollider.h" + #include "OPC_AABBCollider.h" + #include "OPC_LSSCollider.h" + #include "OPC_PlanesCollider.h" + // Usages + #include "OPC_Picking.h" + // Sweep-and-prune + #include "OPC_BoxPruning.h" + #include "OPC_SweepAndPrune.h" + #include "OPC_ArraySAP.h" + + FUNCTION OPCODE_API bool InitOpcode(); + FUNCTION OPCODE_API bool CloseOpcode(); + } + +#endif // __OPCODE_H__ diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Opcode.sln b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Opcode.sln new file mode 100644 index 00000000..269cc7db --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Opcode.sln @@ -0,0 +1,21 @@ +Microsoft Visual Studio Solution File, Format Version 8.00 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "Opcode", "Opcode.vcproj", "{4B23B91D-D4D6-4ED6-9583-FE6CC3730F51}" + ProjectSection(ProjectDependencies) = postProject + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfiguration) = preSolution + Debug = Debug + Release = Release + EndGlobalSection + GlobalSection(ProjectConfiguration) = postSolution + {4B23B91D-D4D6-4ED6-9583-FE6CC3730F51}.Debug.ActiveCfg = Debug|Win32 + {4B23B91D-D4D6-4ED6-9583-FE6CC3730F51}.Debug.Build.0 = Debug|Win32 + {4B23B91D-D4D6-4ED6-9583-FE6CC3730F51}.Release.ActiveCfg = Release|Win32 + {4B23B91D-D4D6-4ED6-9583-FE6CC3730F51}.Release.Build.0 = Release|Win32 + EndGlobalSection + GlobalSection(ExtensibilityGlobals) = postSolution + EndGlobalSection + GlobalSection(ExtensibilityAddIns) = postSolution + EndGlobalSection +EndGlobal diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Opcode.vcproj b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Opcode.vcproj new file mode 100644 index 00000000..892cf839 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/Opcode.vcproj @@ -0,0 +1,1416 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/ReadMe.txt b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/ReadMe.txt new file mode 100644 index 00000000..01ad45bd --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/ReadMe.txt @@ -0,0 +1,188 @@ +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + + + OPCODE distribution 1.3 (june 2003) + ----------------------- + + New in Opcode 1.3: + - fixed the divide by 0 bug that was happening when all centers where located on a coordinate axis (thanks to Jorrit T) + - linearized "complete" vanilla AABB trees + - ANSI-compliant "for" loops (for the ones porting it to Linux...) + - callbacks & pointers moved to mesh interface + - support for triangle & vertex strides + - optimized the sphere-triangle overlap code a bit + - dynamic trees (refit) + - more builders + - ValidateSubdivision in builders + - LSS collider + - primitive-bv tests can now be skipped in most volume queries + - temporal coherence now also works for airborne objects + - temporal coherence completed for boxes / all contacts, LSS, etc + - ray-collider now uses a callback + - some common "usages" have been introduced (only picking for now) + - SPLIT_COMPLETE removed (now implicitely using mLimit = 1) + - hybrid collision models + - sweep-and-prune code added, moved from my old Z-Collide lib + - it now works with meshes made of only 1 triangle (except in mesh-mesh case!) + + Disclaimer: + + - I forced myself to actually *do* the release today no matter what. Else it would never have been done. That's + why the code may not be very polished. I also removed a *lot* of things (more usages, distance queries, etc...) + that weren't ready for prime-time (or that were linked to too many of my supporting libs) + + - Some comments may also be obsolete here and there. The old User Manual for Opcode 1.2 may not fit version 1.3 + either, since there's a new "mesh interface" to support strides, etc. + + - Everything in the "Ice" directory has been hacked out of my engine and edited until everything compiled. Don't + expect anything out there to be cute or something. In particular, some CPP files are not even included when not + needed, so you can expect some linker errors if you try messing around with them... + + Otherwise, it should be just like previous version, only better. In particular, hybrid models can be very + memory-friendly (sometimes using like 10 times less ram than the best trees from version 1.2). The possible + speed hit is often invisible (if it even exists), especially using temporal coherence in "all contacts" mode. + (Admittedly, this depends on your particular usage pattern / what you do on collided triangles). + + The sweep-and-prune code is similar to the "vanilla" version found in V-Collide (but that one's better IMHO...) + The simple "radix" version is often just as good, see for yourself. + + OPCODE distribution 1.2 (august 2002) + ----------------------- + + New in Opcode 1.2: + - new VolumeCollider base class + - simplified callback setup + - you can now use callbacks or pointers (setup at compile time) + - destination array not needed anymore in the RayCollider (faster in-out tests) + - renamed classes: AABBRayCollider => RayCollider, AABBSphereCollider => SphereCollider + - the sphere query now only returns a list of faces (extra info discarded). On the other hand it's a lot faster. + - OBB, AABB and planes queries. Original OBB and AABB queries contributed by Erwin de Vries. + - cosmetic changes in OPC_BoxBoxOverlap.h contributed by Gottfried Chen + - some inlining problems fixed + - faster ray-mesh tests using the separating axis theorem + - new split value in AABB tree construction (contributed by Igor Kravtchenko). Provides faster queries most of the time. + - improved temporal coherence for sphere & AABB queries (works in "All contacts" mode) + + Notes: + + - Everything in the "Ice code" directory (in VC++) is basically copy-pasted from my engine, with a lot + of code removed until there was no link error anymore. Don't expect those files to be cute or anything, + they've never been meant to be released and they're often updated/modified/messy. + - Some experimental features have been removed as well. Else I would never have released the 1.2... + - Not as polished/optimal as I would like it to be, but that's life. I promised myself to release it + before october 2002 (one YEAR later ?!).... That's the only reason why it's there. + - Some people reported ColDet was faster. Uh, come on. They were using Opcode in + "All contacts" mode whereas ColDet was doing "first contact"... + + OPCODE distribution 1.1 (october 2001) + ----------------------- + + New in Opcode 1.1: + - stabbing queries + - sphere queries + - abtract base class for colliders + - settings validation methods + - compilation flags now grouped in OPC_Settings.h + - smaller files, new VC++ virtual dirs (cleaner) + + Notes: + + - "override(baseclass)" is a personal cosmetic thing. It's the same as "virtual", but provides more info. + - I code in 1600*1200, so some lines may look a bit long.. + - This version is not as polished as the previous one due to lack of time. The stabbing & sphere queries + can still be optimized: for example by trying other atomic overlap tests. I'm using my first ray-AABB + code, but the newer one seems better. Tim Schröder's one is good as well. See: www.codercorner.com/RayAABB.cpp + - The trees can easily be compressed even more, I save this for later (lack of time, lack of time!) + - I removed various tests before releasing this one: + - a separation line, a.k.a. "front" in QuickCD, because gains were unclear + - distance queries in a PQP style, because it was way too slow + - support for deformable models, too slow as well + - You can easily use Opcode to do your player-vs-world collision detection, in a Nettle/Telemachos way. + If someone out there wants to donate some art / level for the cause, I'd be glad to release a demo. (current + demo uses copyrighted art I'm not allowed to spread) + - Sorry for the lack of real docs and/or solid examples. I just don't have enough time. + + OPCODE distribution 1.0 (march 2001) + ----------------------- + + - First release + + =============================================================================== + + WHAT ? + + OPCODE means OPtimized COllision DEtection. + So this is a collision detection package similar to RAPID. Here's a + quick list of features: + + - C++ interface, developed for Windows systems using VC++ 6.0 + - Works on arbitrary meshes (convex or non-convex), even polygon soups + - Current implementation uses AABB-trees + - Introduces Primitive-BV overlap tests during recursive collision queries (whereas + standard libraries only rely on Primitive-Primitive and BV-BV tests) + - Introduces no-leaf trees, i.e. collision trees whose leaf nodes have been removed + - Supports collision queries on quantized trees (decompressed on-the-fly) + - Supports "first contact" or "all contacts" modes (à la RAPID) + - Uses temporal coherence for "first contact" mode (~10 to 20 times faster, useful + in rigid body simulation during bisection) + - Memory footprint is 7.2 times smaller than RAPID's one, which is ideal for console + games with limited ram (actually, if you use the unmodified RAPID code using double + precision, it's more like 13 times smaller...) + - And yet it often runs faster than RAPID (according to RDTSC, sometimes more than 5 + times faster when objects are deeply overlapping) + - Performance is usually close to RAPID's one in close-proximity situations + - Stabbing, planes & volume queries (sphere, AABB, OBB, LSS) + - Sweep-and-prune + - Now works with deformable meshes + - Hybrid trees + + + What it can be used for: + - standard mesh-mesh collision detection (similar to RAPID, SOLID, QuickCD, PQP, ColDet...) + - N-body collisions (similar to V-Collide) + - camera-vs-world collisions (similar to Telemachos/Paul Nettle/Stan Melax articles) + - shadow feelers to speed up lightmap computations + - in-out tests to speed up voxelization processes + - picking + - rigid body simulation + - view frustum culling + - etc + + WHY ? + + - Because RAPID uses too many bytes. + - Because the idea was nice... + + WHEN ? + + It's been coded in march 2001 following a thread on the GD-Algorithms list. + + GDAlgorithms-list mailing list + GDAlgorithms-list@lists.sourceforge.net + http://lists.sourceforge.net/lists/listinfo/gdalgorithms-list + + WHO ? + + Pierre Terdiman + June, 1, 2003 + + p.terdiman@wanadoo.fr + p.terdiman@codercorner.com + + http://www.codercorner.com + http://www.codercorner.com/Opcode.htm diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/StdAfx.cpp b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/StdAfx.cpp new file mode 100644 index 00000000..632a7405 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/StdAfx.cpp @@ -0,0 +1,19 @@ +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +//#define ICE_MAIN +#include "Stdafx.h" diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/StdAfx.h b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/StdAfx.h new file mode 100644 index 00000000..4b30a04c --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Opcode/StdAfx.h @@ -0,0 +1,33 @@ +/* + * OPCODE - Optimized Collision Detection + * http://www.codercorner.com/Opcode.htm + * + * Copyright (c) 2001-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#if !defined(AFX_STDAFX_H__EFB95044_1D31_11D5_8B0F_0050BAC83302__INCLUDED_) +#define AFX_STDAFX_H__EFB95044_1D31_11D5_8B0F_0050BAC83302__INCLUDED_ + +#if _MSC_VER > 1000 +#pragma once +#endif // _MSC_VER > 1000 + +// Insert your headers here +#define WIN32_LEAN_AND_MEAN // Exclude rarely-used stuff from Windows headers + +#include "Opcode.h" + +//{{AFX_INSERT_LOCATION}} +// Microsoft Visual C++ will insert additional declarations immediately before the previous line. + +#endif // !defined(AFX_STDAFX_H__EFB95044_1D31_11D5_8B0F_0050BAC83302__INCLUDED_) diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/OpcodeArraySAPTest.cpp b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/OpcodeArraySAPTest.cpp new file mode 100644 index 00000000..bfea3280 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/OpcodeArraySAPTest.cpp @@ -0,0 +1,215 @@ +/* +CDTestFramework http://codercorner.com +Copyright (c) 2007-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#include "stdafx.h" +#include "OpcodeArraySAPTest.h" +#include "RenderingHelpers.h" +#include "GLFontRenderer.h" + +static udword gNbCreatedPairs; +static udword gNbDeletedPairs; +static udword gTotalNbPairs; + +static void* CBData = (void*)0x12345678; +static void* PairUserData = (void*)0xDeadDead; + +static void* CreatePairCB(const void* object0, const void* object1, void* user_data) +{ + assert(user_data==CBData); + + gNbCreatedPairs++; + return PairUserData; +} + +static void DeletePairCB(const void* object0, const void* object1, void* user_data, void* pair_user_data) +{ + assert(user_data==CBData); + assert(pair_user_data==PairUserData); + + gNbDeletedPairs++; +} + +OpcodeArraySAPTest::OpcodeArraySAPTest(int numBoxes) : + mBar (null), + mNbBoxes (numBoxes), + mBoxes (null), + mHandles (null), + mBoxTime (null), + mAmplitude (100.0f) +{ +} + +OpcodeArraySAPTest::~OpcodeArraySAPTest() +{ + Release(); +} + +void OpcodeArraySAPTest::Init() +{ + m_firstTime = true; + + SRand(0); + mBoxes = new AABB[mNbBoxes]; + mBoxTime = new float[mNbBoxes]; + mHandles = new void*[mNbBoxes]; + for(udword i=0;i +#include "GL/glut.h" + +#include "RenderingHelpers.h" + +//////////////////////// + +void DrawLine(const Point& p0, const Point& p1, const Point& color, float line_width) +{ + glDisable(GL_LIGHTING); + glLineWidth(line_width); + glColor4f(color.x, color.y, color.z, 1.0f); + Point tmp[] = {p0, p1}; + glEnableClientState(GL_VERTEX_ARRAY); + glVertexPointer(3, GL_FLOAT, sizeof(Point), &tmp[0].x); + glDrawArrays(GL_LINES, 0, 2); + glDisableClientState(GL_VERTEX_ARRAY); + glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + glEnable(GL_LIGHTING); +} + +void DrawTriangle(const Point& p0, const Point& p1, const Point& p2, const Point& color) +{ +// glDisable(GL_LIGHTING); + glColor4f(color.x, color.y, color.z, 1.0f); + Point tmp[] = {p0, p1, p2}; + glEnableClientState(GL_VERTEX_ARRAY); + glVertexPointer(3, GL_FLOAT, sizeof(Point), &tmp[0].x); + glDrawArrays(GL_TRIANGLES, 0, 3); + glDisableClientState(GL_VERTEX_ARRAY); +// glColor4f(1.0f, 1.0f, 1.0f, 1.0f); +// glEnable(GL_LIGHTING); +} + + +//////////////////////// + +static void SetupGLMatrix(const Point& pos) +{ + float glmat[16]; //4x4 column major matrix for OpenGL. + glmat[0] = 1.0f; + glmat[1] = 0.0f; + glmat[2] = 0.0f; + glmat[3] = 0.0f; + + glmat[4] = 0.0f; + glmat[5] = 1.0f; + glmat[6] = 0.0f; + glmat[7] = 0.0f; + + glmat[8] = 0.0f; + glmat[9] = 0.0f; + glmat[10] = 1.0f; + glmat[11] = 0.0f; + + glmat[12] = pos.x; + glmat[13] = pos.y; + glmat[14] = pos.z; + glmat[15] = 1.0f; + + glMultMatrixf(glmat); +} + +void SetupGLMatrix(const Point& pos, const Matrix3x3& rot) +{ + float glmat[16]; //4x4 column major matrix for OpenGL. + glmat[0] = rot.m[0][0]; + glmat[1] = rot.m[0][1]; + glmat[2] = rot.m[0][2]; + glmat[3] = 0.0f; + + glmat[4] = rot.m[1][0]; + glmat[5] = rot.m[1][1]; + glmat[6] = rot.m[1][2]; + glmat[7] = 0.0f; + + glmat[8] = rot.m[2][0]; + glmat[9] = rot.m[2][1]; + glmat[10] = rot.m[2][2]; + glmat[11] = 0.0f; + + glmat[12] = pos.x; + glmat[13] = pos.y; + glmat[14] = pos.z; + glmat[15] = 1.0f; + + glMultMatrixf(glmat); +} + +void SetupGLMatrix(const Matrix4x4& world) +{ + SetupGLMatrix(world.GetTrans(), world); +} + +//////////////////////// + +static void RenderSphere(float radius) +{ + glutSolidSphere(radius, 12, 12); // Radius / slices / stacks +} + +void DrawSphere(const Sphere& sphere) +{ + glPushMatrix(); + SetupGLMatrix(sphere.mCenter); + RenderSphere(sphere.mRadius); + glPopMatrix(); +} + +//////////////////////// + +static void RenderBox(int size) +{ + glutSolidCube(size); +} + +void DrawOBB(const OBB& obb) +{ + glPushMatrix(); + SetupGLMatrix(obb.mCenter, obb.mRot); + glScalef(obb.mExtents.x, obb.mExtents.y, obb.mExtents.z); + RenderBox(2); + glPopMatrix(); +} + +//////////////////////// + +static float gCylinderData[]={ + 1.0f,0.0f,1.0f,1.0f,0.0f,1.0f,1.0f,0.0f,0.0f,1.0f,0.0f,0.0f, + 0.866025f,0.500000f,1.0f,0.866025f,0.500000f,1.0f,0.866025f,0.500000f,0.0f,0.866025f,0.500000f,0.0f, + 0.500000f,0.866025f,1.0f,0.500000f,0.866025f,1.0f,0.500000f,0.866025f,0.0f,0.500000f,0.866025f,0.0f, + -0.0f,1.0f,1.0f,-0.0f,1.0f,1.0f,-0.0f,1.0f,0.0f,-0.0f,1.0f,0.0f, + -0.500000f,0.866025f,1.0f,-0.500000f,0.866025f,1.0f,-0.500000f,0.866025f,0.0f,-0.500000f,0.866025f,0.0f, + -0.866025f,0.500000f,1.0f,-0.866025f,0.500000f,1.0f,-0.866025f,0.500000f,0.0f,-0.866025f,0.500000f,0.0f, + -1.0f,-0.0f,1.0f,-1.0f,-0.0f,1.0f,-1.0f,-0.0f,0.0f,-1.0f,-0.0f,0.0f, + -0.866025f,-0.500000f,1.0f,-0.866025f,-0.500000f,1.0f,-0.866025f,-0.500000f,0.0f,-0.866025f,-0.500000f,0.0f, + -0.500000f,-0.866025f,1.0f,-0.500000f,-0.866025f,1.0f,-0.500000f,-0.866025f,0.0f,-0.500000f,-0.866025f,0.0f, + 0.0f,-1.0f,1.0f,0.0f,-1.0f,1.0f,0.0f,-1.0f,0.0f,0.0f,-1.0f,0.0f, + 0.500000f,-0.866025f,1.0f,0.500000f,-0.866025f,1.0f,0.500000f,-0.866025f,0.0f,0.500000f,-0.866025f,0.0f, + 0.866026f,-0.500000f,1.0f,0.866026f,-0.500000f,1.0f,0.866026f,-0.500000f,0.0f,0.866026f,-0.500000f,0.0f, + 1.0f,0.0f,1.0f,1.0f,0.0f,1.0f,1.0f,0.0f,0.0f,1.0f,0.0f,0.0f +}; + +static float gCylinderDataCapsTop[]={ + 0.866026f,-0.500000f,1.000000f,0.000000f,1.000000f,1.000000f, + 0.000000f,1.000000f,1.000000f,0.000000f,1.000000f,1.000000f, + 0.500000f,-0.866025f,1.000000f,0.000000f,1.000000f,1.000000f, + 0.500000f,-0.866025f,1.000000f,0.000000f,1.000000f,1.000000f, + 0.000000f,1.000000f,1.000000f,0.000000f,1.000000f,1.000000f, + 0.000000f,-1.000000f,1.000000f,0.000000f,1.000000f,1.000000f, + 0.000000f,-1.000000f,1.000000f,0.000000f,1.000000f,1.000000f, + 0.000000f,1.000000f,1.000000f,0.000000f,1.000000f,1.000000f, + -0.500000f,-0.866025f,1.000000f,0.000000f,1.000000f,1.000000f, + -0.500000f,-0.866025f,1.000000f,0.000000f,1.000000f,1.000000f, + 0.000000f,1.000000f,1.000000f,0.000000f,1.000000f,1.000000f, + -0.866025f,-0.500000f,1.000000f,0.000000f,1.000000f,1.000000f, + -0.866025f,-0.500000f,1.000000f,0.000000f,1.000000f,1.000000f, + 0.000000f,1.000000f,1.000000f,0.000000f,1.000000f,1.000000f, + -1.000000f,-0.000000f,1.000000f,0.000000f,1.000000f,1.000000f, + -1.000000f,-0.000000f,1.000000f,0.000000f,1.000000f,1.000000f, + 0.000000f,1.000000f,1.000000f,0.000000f,1.000000f,1.000000f, + -0.866025f,0.500000f,1.000000f,0.000000f,1.000000f,1.000000f, + -0.866025f,0.500000f,1.000000f,0.000000f,1.000000f,1.000000f, + 0.000000f,1.000000f,1.000000f,0.000000f,1.000000f,1.000000f, + -0.500000f,0.866025f,1.000000f,0.000000f,1.000000f,1.000000f, + -0.500000f,0.866025f,1.000000f,0.000000f,1.000000f,1.000000f, + 0.000000f,1.000000f,1.000000f,0.000000f,1.000000f,1.000000f, + -0.000000f,1.000000f,1.000000f,0.000000f,1.000000f,1.000000f, + -0.000000f,1.000000f,1.000000f,0.000000f,1.000000f,1.000000f, + 0.000000f,1.000000f,1.000000f,0.000000f,1.000000f,1.000000f, + 0.500000f,0.866025f,1.000000f,0.000000f,1.000000f,1.000000f, + 0.500000f,0.866025f,1.000000f,0.000000f,1.000000f,1.000000f, + 0.000000f,1.000000f,1.000000f,0.000000f,1.000000f,1.000000f, + 0.866025f,0.500000f,1.000000f,0.000000f,1.000000f,1.000000f, + 0.866025f,0.500000f,1.000000f,0.000000f,1.000000f,1.000000f, + 0.000000f,1.000000f,1.000000f,0.000000f,1.000000f,1.000000f, + 1.000000f,0.000000f,1.000000f,0.000000f,1.000000f,1.000000f, + 1.000000f,0.000000f,1.000000f,0.000000f,1.000000f,1.000000f, + 0.000000f,1.000000f,1.000000f,0.000000f,1.000000f,1.000000f, + 0.866026f,-0.500000f,1.000000f,0.000000f,1.000000f,1.000000f, +}; + +static float gCylinderDataCapsBottom[]={ + 1.000000f,0.000000f,0.000000f,0.000000f,-1.000000f,0.000000f, + 0.000000f,0.000000f,0.000000f,0.000000f,-1.000000f,0.000000f, + 0.866025f,0.500000f,0.000000f,0.000000f,-1.000000f,0.000000f, + 0.866025f,0.500000f,0.000000f,0.000000f,-1.000000f,0.000000f, + 0.000000f,0.000000f,0.000000f,0.000000f,-1.000000f,0.000000f, + 0.500000f,0.866025f,0.000000f,0.000000f,-1.000000f,0.000000f, + 0.500000f,0.866025f,0.000000f,0.000000f,-1.000000f,0.000000f, + 0.000000f,0.000000f,0.000000f,0.000000f,-1.000000f,0.000000f, + -0.000000f,1.000000f,0.000000f,0.000000f,-1.000000f,0.000000f, + -0.000000f,1.000000f,0.000000f,0.000000f,-1.000000f,0.000000f, + 0.000000f,0.000000f,0.000000f,0.000000f,-1.000000f,0.000000f, + -0.500000f,0.866025f,0.000000f,0.000000f,-1.000000f,0.000000f, + -0.500000f,0.866025f,0.000000f,0.000000f,-1.000000f,0.000000f, + 0.000000f,0.000000f,0.000000f,0.000000f,-1.000000f,0.000000f, + -0.866025f,0.500000f,0.000000f,0.000000f,-1.000000f,0.000000f, + -0.866025f,0.500000f,0.000000f,0.000000f,-1.000000f,0.000000f, + 0.000000f,0.000000f,0.000000f,0.000000f,-1.000000f,0.000000f, + -1.000000f,-0.000000f,0.000000f,0.000000f,-1.000000f,0.000000f, + -1.000000f,-0.000000f,0.000000f,0.000000f,-1.000000f,0.000000f, + 0.000000f,0.000000f,0.000000f,0.000000f,-1.000000f,0.000000f, + -0.866025f,-0.500000f,0.000000f,0.000000f,-1.000000f,0.000000f, + -0.866025f,-0.500000f,0.000000f,0.000000f,-1.000000f,0.000000f, + 0.000000f,0.000000f,0.000000f,0.000000f,-1.000000f,0.000000f, + -0.500000f,-0.866025f,0.000000f,0.000000f,-1.000000f,0.000000f, + -0.500000f,-0.866025f,0.000000f,0.000000f,-1.000000f,0.000000f, + 0.000000f,0.000000f,0.000000f,0.000000f,-1.000000f,0.000000f, + 0.000000f,-1.000000f,0.000000f,0.000000f,-1.000000f,0.000000f, + 0.000000f,-1.000000f,0.000000f,0.000000f,-1.000000f,0.000000f, + 0.000000f,0.000000f,0.000000f,0.000000f,-1.000000f,0.000000f, + 0.500000f,-0.866025f,0.000000f,0.000000f,-1.000000f,0.000000f, + 0.500000f,-0.866025f,0.000000f,0.000000f,-1.000000f,0.000000f, + 0.000000f,0.000000f,0.000000f,0.000000f,-1.000000f,0.000000f, + 0.866026f,-0.500000f,0.000000f,0.000000f,-1.000000f,0.000000f, + 0.866026f,-0.500000f,0.000000f,0.000000f,-1.000000f,0.000000f, + 0.000000f,0.000000f,0.000000f,0.000000f,-1.000000f,0.000000f, + 1.000000f,0.000000f,0.000000f,0.000000f,-1.000000f,0.000000f, +}; + +static void RenderCylinder() +{ + glEnableClientState(GL_VERTEX_ARRAY); + glEnableClientState(GL_NORMAL_ARRAY); + glVertexPointer(3, GL_FLOAT, 2*3*sizeof(float), gCylinderData); + glNormalPointer(GL_FLOAT, 2*3*sizeof(float), gCylinderData+3); + glDrawArrays(GL_TRIANGLE_STRIP, 0, 13*2); + + glVertexPointer(3, GL_FLOAT, 2*3*sizeof(float), gCylinderDataCapsTop); + glNormalPointer(GL_FLOAT, 2*3*sizeof(float), gCylinderDataCapsTop+3); + glDrawArrays(GL_TRIANGLES, 0, 36); + + glVertexPointer(3, GL_FLOAT, 2*3*sizeof(float), gCylinderDataCapsBottom); + glNormalPointer(GL_FLOAT, 2*3*sizeof(float), gCylinderDataCapsBottom+3); + glDrawArrays(GL_TRIANGLES, 0, 36); + + glDisableClientState(GL_VERTEX_ARRAY); + glDisableClientState(GL_NORMAL_ARRAY); +} + +void DrawCapsule(const Matrix4x4& world, const Point& p0, const Point& p1, float r) +{ + const float h = p0.Distance(p1); + + glPushMatrix(); + SetupGLMatrix(world); + + glPushMatrix(); + glTranslatef(0.0f, h*0.5f, 0.0f); + RenderSphere(r); + glPopMatrix(); + + glPushMatrix(); + glTranslatef(0.0f,-h*0.5f, 0.0f); + RenderSphere(r); + glPopMatrix(); + + glPushMatrix(); + glTranslatef(0.0f,h*0.5f, 0.0f); + glScalef(r,h,r); + glRotatef(90.0f,1.0f,0.0f,0.0f); + RenderCylinder(); + glPopMatrix(); + + glPopMatrix(); +} + + + +#ifdef TOSEE +#include "NxPhysics.h" +#include "DrawObjects.h" + +#include + +static float gPlaneData[]={ + -1.0f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, + 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, -1.0f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f, + 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, 1.0f, 0.0f, -1.0f, 0.0f, 1.0f, 0.0f +}; + + +static void RenderPlane() +{ + glEnableClientState(GL_VERTEX_ARRAY); + glEnableClientState(GL_NORMAL_ARRAY); + glVertexPointer(3, GL_FLOAT, 2*3*sizeof(float), gPlaneData); + glNormalPointer(GL_FLOAT, 2*3*sizeof(float), gPlaneData+3); + glDrawArrays(GL_TRIANGLES, 0, 6); + glDisableClientState(GL_VERTEX_ARRAY); + glDisableClientState(GL_NORMAL_ARRAY); +} + +void SetupGLMatrix(const NxVec3& pos, const NxMat33& orient) +{ + float glmat[16]; //4x4 column major matrix for OpenGL. + orient.getColumnMajorStride4(&(glmat[0])); + pos.get(&(glmat[12])); + + //clear the elements we don't need: + glmat[3] = glmat[7] = glmat[11] = 0.0f; + glmat[15] = 1.0f; + + glMultMatrixf(&(glmat[0])); +} + +void DrawLine(const NxVec3& p0, const NxVec3& p1, const NxVec3& color, float lineWidth) +{ + glDisable(GL_LIGHTING); + glLineWidth(lineWidth); + glColor4f(color.x, color.y, color.z, 1.0f); + NxVec3 av3LineEndpoints[] = {p0, p1}; + glEnableClientState(GL_VERTEX_ARRAY); + glVertexPointer(3, GL_FLOAT, sizeof(NxVec3), &av3LineEndpoints[0].x); + glDrawArrays(GL_LINES, 0, 2); + glDisableClientState(GL_VERTEX_ARRAY); + glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + glEnable(GL_LIGHTING); +} + +void DrawTriangle(const NxVec3& p0, const NxVec3& p1, const NxVec3& p2, const NxVec3& color) +{ + glDisable(GL_LIGHTING); + glColor4f(color.x, color.y, color.z, 1.0f); + NxVec3 av3LineEndpoints[] = {p0, p1, p2}; + glEnableClientState(GL_VERTEX_ARRAY); + glVertexPointer(3, GL_FLOAT, sizeof(NxVec3), &av3LineEndpoints[0].x); + glDrawArrays(GL_TRIANGLES, 0, 3); + glDisableClientState(GL_VERTEX_ARRAY); + glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + glEnable(GL_LIGHTING); +} + +void DrawCircle(NxU32 nbSegments, const NxMat34& matrix, const NxVec3& color, const NxF32 radius, const bool semicircle) +{ + NxF32 step = NxTwoPiF32/NxF32(nbSegments); + NxU32 segs = nbSegments; + if(semicircle) + { + segs /= 2; + } + + for(NxU32 i=0;igetGlobalPose(); + NxPlaneShape* planeShape = plane->isPlane(); + NxPlane p = planeShape->getPlane(); + pose.t.x += p.d; + pose.t.y += p.d; + pose.t.z += p.d; + + glPushMatrix(); + glDisable(GL_LIGHTING); + glColor4f(0.1f, 0.2f, 0.3f, 1.0f); + pose.t.y -= 0.1f; + SetupGLMatrix(pose.t, pose.M); + glScalef(1024,0,1024); + RenderPlane(); + glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + glEnable(GL_LIGHTING); + glPopMatrix(); +} + +void DrawWireBox(const NxBox& obb, const NxVec3& color, float lineWidth) +{ + // Compute obb vertices + NxVec3 pp[8]; + NxComputeBoxPoints(obb, pp); + + // Draw all lines + const NxU32* Indices = NxGetBoxEdges(); + for(NxU32 i=0;i<12;i++) + { + NxU32 VRef0 = *Indices++; + NxU32 VRef1 = *Indices++; + DrawLine(pp[VRef0], pp[VRef1], color, lineWidth); + } +} + +void DrawWireBox(NxShape* box, const NxVec3& color, float lineWidth) +{ + NxBox obb; + box->isBox()->getWorldOBB(obb); + + DrawWireBox(obb, color, lineWidth); +} + + +void DrawWireSphere(NxShape* sphere, const NxVec3& color) +{ + NxMat34 pose = sphere->getGlobalPose(); + + glPushMatrix(); + NxReal r = sphere->isSphere()->getRadius(); + + NxVec3 c0; pose.M.getColumn(0, c0); + NxVec3 c1; pose.M.getColumn(1, c1); + NxVec3 c2; pose.M.getColumn(2, c2); + DrawCircle(20, pose, color, r); + + pose.M.setColumn(0, c1); + pose.M.setColumn(1, c2); + pose.M.setColumn(2, c0); + DrawCircle(20, pose, color, r); + + pose.M.setColumn(0, c2); + pose.M.setColumn(1, c0); + pose.M.setColumn(2, c1); + DrawCircle(20, pose, color, r); + + glPopMatrix(); +} + +void DrawSphere(NxShape* sphere) +{ + NxMat34 pose = sphere->getGlobalPose(); + + glPushMatrix(); + SetupGLMatrix(pose.t, pose.M); + NxReal r = sphere->isSphere()->getRadius(); + glScalef(r,r,r); + RenderSphere(); + glPopMatrix(); +} + +void DrawWireCapsule(NxShape* capsule, const NxVec3& color) +{ + NxMat34 pose = capsule->getGlobalPose(); + + NxReal r = capsule->isCapsule()->getRadius(); + NxReal h = capsule->isCapsule()->getHeight(); + + NxSegment SG; + pose.M.getColumn(1, SG.p1); + SG.p1 *= 0.5f*h; + SG.p0 = -SG.p1; + SG.p0 += pose.t; + SG.p1 += pose.t; + + NxVec3 c0; pose.M.getColumn(0, c0); + NxVec3 c1; pose.M.getColumn(1, c1); + NxVec3 c2; pose.M.getColumn(2, c2); + DrawLine(SG.p0 + c0*r, SG.p1 + c0*r, color); + DrawLine(SG.p0 - c0*r, SG.p1 - c0*r, color); + DrawLine(SG.p0 + c2*r, SG.p1 + c2*r, color); + DrawLine(SG.p0 - c2*r, SG.p1 - c2*r, color); + + pose.M.setColumn(0, -c1); + pose.M.setColumn(1, -c0); + pose.M.setColumn(2, c2); + pose.t = SG.p0; + DrawCircle(20, pose, color, r, true); //halfcircle -- flipped + + pose.M.setColumn(0, c1); + pose.M.setColumn(1, -c0); + pose.M.setColumn(2, c2); + pose.t = SG.p1; + DrawCircle(20, pose, color, r, true); + + pose.M.setColumn(0, -c1); + pose.M.setColumn(1, c2); + pose.M.setColumn(2, c0); + pose.t = SG.p0; + DrawCircle(20, pose, color, r, true);//halfcircle -- good + + pose.M.setColumn(0, c1); + pose.M.setColumn(1, c2); + pose.M.setColumn(2, c0); + pose.t = SG.p1; + DrawCircle(20, pose, color, r, true); + + pose.M.setColumn(0, c2); + pose.M.setColumn(1, c0); + pose.M.setColumn(2, c1); + pose.t = SG.p0; + DrawCircle(20, pose, color, r); //full circle + pose.t = SG.p1; + DrawCircle(20, pose, color, r); +} + +static void computeBasis(const NxVec3& dir, NxVec3& right, NxVec3& up) +{ + // Derive two remaining vectors + if(fabsf(dir.y)>0.9999f) right = NxVec3(1.0f, 0.0f, 0.0f); + else right = (NxVec3(0.0f, 1.0f, 0.0f) ^ dir); + right.normalize(); + up = dir ^ right; +} + +void DrawWireCapsule(const NxCapsule& capsule, const NxVec3& color) +{ + NxReal r = capsule.radius; + NxVec3 dir = capsule.p0 - capsule.p1; + NxReal h = dir.magnitude(); + NxMat34 pose; + pose.t = (capsule.p0 + capsule.p1)*0.5f; + + if(h!=0.0f) + { + dir/=h; + NxVec3 right, up; + computeBasis(dir, right, up); + pose.M.setColumn(0, right); + pose.M.setColumn(1, dir); + pose.M.setColumn(2, up); + } + else + { + pose.M.id(); + } + +// NxMat34 pose = capsule->getGlobalPose(); +// const NxReal & r = capsule->isCapsule()->getRadius(); +// const NxReal & h = capsule->isCapsule()->getHeight(); + + + + NxSegment SG; + pose.M.getColumn(1, SG.p1); + SG.p1 *= 0.5f*h; + SG.p0 = -SG.p1; + SG.p0 += pose.t; + SG.p1 += pose.t; + + NxVec3 c0; pose.M.getColumn(0, c0); + NxVec3 c1; pose.M.getColumn(1, c1); + NxVec3 c2; pose.M.getColumn(2, c2); + DrawLine(SG.p0 + c0*r, SG.p1 + c0*r, color); + DrawLine(SG.p0 - c0*r, SG.p1 - c0*r, color); + DrawLine(SG.p0 + c2*r, SG.p1 + c2*r, color); + DrawLine(SG.p0 - c2*r, SG.p1 - c2*r, color); + + pose.M.setColumn(0, -c1); + pose.M.setColumn(1, -c0); + pose.M.setColumn(2, c2); + pose.t = SG.p0; + DrawCircle(20, pose, color, r, true); //halfcircle -- flipped + + pose.M.setColumn(0, c1); + pose.M.setColumn(1, -c0); + pose.M.setColumn(2, c2); + pose.t = SG.p1; + DrawCircle(20, pose, color, r, true); + + pose.M.setColumn(0, -c1); + pose.M.setColumn(1, c2); + pose.M.setColumn(2, c0); + pose.t = SG.p0; + DrawCircle(20, pose, color, r, true);//halfcircle -- good + + pose.M.setColumn(0, c1); + pose.M.setColumn(1, c2); + pose.M.setColumn(2, c0); + pose.t = SG.p1; + DrawCircle(20, pose, color, r, true); + + pose.M.setColumn(0, c2); + pose.M.setColumn(1, c0); + pose.M.setColumn(2, c1); + pose.t = SG.p0; + DrawCircle(20, pose, color, r); //full circle + pose.t = SG.p1; + DrawCircle(20, pose, color, r); +} + +void DrawCapsule(const NxVec3& color, NxF32 r, NxF32 h) +{ + glColor4f(color.x, color.y, color.z, 1.0f); + + glPushMatrix(); + glTranslatef(0.0f, h*0.5f, 0.0f); + glScalef(r,r,r); + RenderSphere(); + glPopMatrix(); + + glPushMatrix(); + glTranslatef(0.0f,-h*0.5f, 0.0f); + glScalef(r,r,r); + RenderSphere(); + glPopMatrix(); + + glPushMatrix(); + glTranslatef(0.0f,h*0.5f, 0.0f); + glScalef(r,h,r); + glRotatef(90.0f,1.0f,0.0f,0.0f); + RenderCylinder(); + glPopMatrix(); +} + +typedef NxVec3 Point; +typedef struct _Triangle { NxU32 p0; NxU32 p1; NxU32 p2; } Triangle; + +void DrawWireConvex(NxShape* mesh, const NxVec3& color) +{ + if(mesh->userData == NULL) return; + + NxMat34 pose = mesh->getGlobalPose(); + + NxConvexMeshDesc meshDesc = *((NxConvexMeshDesc*)(mesh->userData)); +// mesh->isConvexMesh()->getConvexMesh().saveToDesc(meshDesc); + + NxU32 nbVerts = meshDesc.numVertices; + NxU32 nbTriangles = meshDesc.numTriangles; + + Point* points = (Point *)meshDesc.points; + Triangle* triangles = (Triangle *)meshDesc.triangles; + + glPushMatrix(); + + float glmat[16]; //4x4 column major matrix for OpenGL. + pose.M.getColumnMajorStride4(&(glmat[0])); + pose.t.get(&(glmat[12])); + + //clear the elements we don't need: + glmat[3] = glmat[7] = glmat[11] = 0.0f; + glmat[15] = 1.0f; + + glMultMatrixf(&(glmat[0])); + + while(nbTriangles--) + { + DrawLine(points[triangles->p0], points[triangles->p1], color); + DrawLine(points[triangles->p1], points[triangles->p2], color); + DrawLine(points[triangles->p2], points[triangles->p0], color); + triangles++; + } + + glPopMatrix(); +} + +void DrawTriangleList(int iTriangleCount, Triangle *pTriangles, Point *pPoints) +{ + static int iBufferSize=0; + static float *pfVertexBuffer=NULL; + static float *pfNormalBuffer=NULL; + + if(iBufferSize < iTriangleCount*3) + { + iBufferSize=3*iTriangleCount; + + delete[] pfVertexBuffer; + pfVertexBuffer = new float[iBufferSize*3]; + + delete[] pfNormalBuffer; + pfNormalBuffer = new float[iBufferSize*3]; + } + + float *pfDestinationVertex=pfVertexBuffer; + float *pfDestinationNormal=pfNormalBuffer; + + for(int iTriangle=0; iTrianglep0].x; + *pfDestinationVertex++=pPoints[pTriangles->p0].y; + *pfDestinationVertex++=pPoints[pTriangles->p0].z; + *pfDestinationVertex++=pPoints[pTriangles->p1].x; + *pfDestinationVertex++=pPoints[pTriangles->p1].y; + *pfDestinationVertex++=pPoints[pTriangles->p1].z; + *pfDestinationVertex++=pPoints[pTriangles->p2].x; + *pfDestinationVertex++=pPoints[pTriangles->p2].y; + *pfDestinationVertex++=pPoints[pTriangles->p2].z; + + NxVec3 edge1 = pPoints[pTriangles->p1] - pPoints[pTriangles->p0]; + NxVec3 edge2 = pPoints[pTriangles->p2] - pPoints[pTriangles->p0]; + NxVec3 normal = edge1.cross(edge2); + normal.normalize(); + + *pfDestinationNormal++=normal.x; + *pfDestinationNormal++=normal.y; + *pfDestinationNormal++=normal.z; + *pfDestinationNormal++=normal.x; + *pfDestinationNormal++=normal.y; + *pfDestinationNormal++=normal.z; + *pfDestinationNormal++=normal.x; + *pfDestinationNormal++=normal.y; + *pfDestinationNormal++=normal.z; + + pTriangles++; + } + + glEnableClientState(GL_VERTEX_ARRAY); + glVertexPointer(3, GL_FLOAT, 0, pfVertexBuffer); + glEnableClientState(GL_NORMAL_ARRAY); + glNormalPointer(GL_FLOAT, 0, pfNormalBuffer); + + glDrawArrays(GL_TRIANGLES, 0, 3*iTriangleCount); + + glDisableClientState(GL_VERTEX_ARRAY); + glDisableClientState(GL_NORMAL_ARRAY); + +} + +void DrawConvex(NxShape* mesh) +{ + NxConvexMeshDesc meshDesc; + + // SRM : Please note that I looked into a crash issue posed by + // one of our customers, and this code (i.e. reinterpreting the + // NxShape's userData as an NxConvexMeshDesc * was crashing because + // in the SampleRaycastCar demo, it sets that pointer equal to the + // NxWheel because that is used in NxVehicle::handleContactPair(). Thus + // in order to allow this code not to crash on the PS3, we should + // simply force the shape to save its description here. + mesh->isConvexMesh()->getConvexMesh().saveToDesc(meshDesc); + /** + if(mesh->userData != NULL) + { + meshDesc = *((NxConvexMeshDesc*)(mesh->userData)); + } else { + mesh->isConvexMesh()->getConvexMesh().saveToDesc(meshDesc); + } + **/ + + NxMat34 pose = mesh->getGlobalPose(); + + NxU32 nbVerts = meshDesc.numVertices; + NxU32 nbTriangles = meshDesc.numTriangles; + + Point* points = (Point *)meshDesc.points; + Triangle* triangles = (Triangle *)meshDesc.triangles; + + glPushMatrix(); + + float glmat[16]; //4x4 column major matrix for OpenGL. + pose.M.getColumnMajorStride4(&(glmat[0])); + pose.t.get(&(glmat[12])); + + //clear the elements we don't need: + glmat[3] = glmat[7] = glmat[11] = 0.0f; + glmat[15] = 1.0f; + + glMultMatrixf(&(glmat[0])); + + DrawTriangleList(nbTriangles, triangles, points); + + glPopMatrix(); +} + +void DrawWireMesh(NxShape* mesh, const NxVec3& color) +{ + if(mesh->userData == NULL) return; + + NxMat34 pose = mesh->getGlobalPose(); + + NxTriangleMeshDesc meshDesc = *((NxTriangleMeshDesc*)(mesh->userData)); +// mesh->isTriangleMesh()->getTriangleMesh().saveToDesc(meshDesc); + + NxU32 nbVerts = meshDesc.numVertices; + NxU32 nbTriangles = meshDesc.numTriangles; + + Point* points = (Point *)meshDesc.points; + Triangle* triangles = (Triangle *)meshDesc.triangles; + + glPushMatrix(); + + float glmat[16]; //4x4 column major matrix for OpenGL. + pose.M.getColumnMajorStride4(&(glmat[0])); + pose.t.get(&(glmat[12])); + + //clear the elements we don't need: + glmat[3] = glmat[7] = glmat[11] = 0.0f; + glmat[15] = 1.0f; + + glMultMatrixf(&(glmat[0])); + + while(nbTriangles--) + { + DrawLine(points[triangles->p0], points[triangles->p1], color); + DrawLine(points[triangles->p1], points[triangles->p2], color); + DrawLine(points[triangles->p2], points[triangles->p0], color); + triangles++; + } + + glPopMatrix(); +} + +void DrawMesh(NxShape* mesh) +{ + if(mesh->userData == NULL) return; + + NxMat34 pose = mesh->getGlobalPose(); + + NxTriangleMeshDesc meshDesc = *((NxTriangleMeshDesc*)(mesh->userData)); +// mesh->isTriangleMesh()->getTriangleMesh().saveToDesc(meshDesc); + + NxU32 nbVerts = meshDesc.numVertices; + NxU32 nbTriangles = meshDesc.numTriangles; + + Point* points = (Point *)meshDesc.points; + Triangle* triangles = (Triangle *)meshDesc.triangles; + + glPushMatrix(); + + float glmat[16]; //4x4 column major matrix for OpenGL. + pose.M.getColumnMajorStride4(&(glmat[0])); + pose.t.get(&(glmat[12])); + + //clear the elements we don't need: + glmat[3] = glmat[7] = glmat[11] = 0.0f; + glmat[15] = 1.0f; + + glMultMatrixf(&(glmat[0])); + + if(meshDesc.heightFieldVerticalAxis != NX_NOT_HEIGHTFIELD) + { + glDisable(GL_LIGHT0); + glEnable(GL_LIGHT1); + } + + DrawTriangleList(nbTriangles, triangles, points); + + if(meshDesc.heightFieldVerticalAxis != NX_NOT_HEIGHTFIELD) + { + glDisable(GL_LIGHT1); + glEnable(GL_LIGHT0); + } + + glPopMatrix(); +} + +void DrawWheelShape(NxShape* wheel) +{ + if(wheel->is(NX_SHAPE_WHEEL) != NULL) + { + NxWheelShape* wheelShape = (NxWheelShape*)wheel; + glPushMatrix(); + + float glmat[16]; + wheel->getGlobalPose().getColumnMajor44(glmat); + + NxWheelShapeDesc wheelShapeDesc; + + float r = wheelShape->getRadius(); + float a = wheelShape->getSteerAngle(); + + glMultMatrixf(&(glmat[0])); + glTranslatef(-r/2,0,0); + glRotatef(90,0,1,0); + glRotatef(NxMath::radToDeg(a),0,1,0); + + glScalef(r, r, r); + RenderCylinder(); + glPopMatrix(); + } +} + +void DrawArrow(const NxVec3& posA, const NxVec3& posB, const NxVec3& color) +{ + NxVec3 vec = posB - posA; + NxVec3 t0, t1, t2; + NxNormalToTangents(vec, t1, t2); + + t0 = posB - posA; + t0.normalize(); + + NxVec3 lobe1 = posB - t0*0.15 + t1 * 0.15; + NxVec3 lobe2 = posB - t0*0.15 - t1 * 0.15; + NxVec3 lobe3 = posB - t0*0.15 + t2 * 0.15; + NxVec3 lobe4 = posB - t0*0.15 - t2 * 0.15; + + NxVec3 v3ArrowShape[] = { + NxVec3(posA), NxVec3(posB), + NxVec3(posB), NxVec3(lobe1), + NxVec3(posB), NxVec3(lobe2), + NxVec3(posB), NxVec3(lobe3), + NxVec3(posB), NxVec3(lobe4), + }; + + glDisable(GL_LIGHTING); + glLineWidth(3.0f); + glColor4f(color.x,color.y,color.z,1.0f); + glEnableClientState(GL_VERTEX_ARRAY); + glVertexPointer(3, GL_FLOAT, sizeof(NxVec3), &v3ArrowShape[0].x); + glDrawArrays(GL_LINES, 0, sizeof(v3ArrowShape)/sizeof(NxVec3)); + glDisableClientState(GL_VERTEX_ARRAY); + glColor4f(1.0f,1.0f,1.0f,1.0f); +} + +void DrawContactPoint(const NxVec3& pos, const NxReal radius, const NxVec3& color) +{ + NxMat34 pose; + pose.t = pos; + + NxVec3 c0; pose.M.getColumn(0, c0); + NxVec3 c1; pose.M.getColumn(1, c1); + NxVec3 c2; pose.M.getColumn(2, c2); + DrawCircle(20, pose, color, radius); + + pose.M.setColumn(0, c1); + pose.M.setColumn(1, c2); + pose.M.setColumn(2, c0); + DrawCircle(20, pose, color, radius); + + pose.M.setColumn(0, c2); + pose.M.setColumn(1, c0); + pose.M.setColumn(2, c1); + DrawCircle(20, pose, color, radius); +} + +void DrawWireShape(NxShape *shape, const NxVec3& color) +{ + switch(shape->getType()) + { + case NX_SHAPE_PLANE: + DrawWirePlane(shape, color); + break; + case NX_SHAPE_BOX: + DrawWireBox(shape, color); + break; + case NX_SHAPE_SPHERE: + DrawWireSphere(shape, color); + break; + case NX_SHAPE_CAPSULE: + DrawWireCapsule(shape, color); + break; + case NX_SHAPE_CONVEX: + DrawWireConvex(shape, color); + break; + case NX_SHAPE_MESH: + DrawWireMesh(shape, color); + break; + } +} + +void DrawShape(NxShape* shape) +{ + switch(shape->getType()) + { + case NX_SHAPE_PLANE: + DrawPlane(shape); + break; + case NX_SHAPE_BOX: + DrawBox(shape); + break; + case NX_SHAPE_SPHERE: + DrawSphere(shape); + break; + case NX_SHAPE_CAPSULE: + DrawCapsule(shape); + break; + case NX_SHAPE_CONVEX: + DrawConvex(shape); + break; + case NX_SHAPE_MESH: + DrawMesh(shape); + break; + case NX_SHAPE_WHEEL: + DrawWheelShape(shape); + break; + } +} + +void DrawActor(NxActor* actor, NxActor* gSelectedActor) +{ + NxShape*const* shapes = actor->getShapes(); + NxU32 nShapes = actor->getNbShapes(); + if (actor == gSelectedActor) + { + while (nShapes--) + { + DrawWireShape(shapes[nShapes], NxVec3(1,1,1)); + } + } + nShapes = actor->getNbShapes(); + while (nShapes--) + { + DrawShape(shapes[nShapes]); + } +} + +void DrawWireActor(NxActor* actor) +{ + NxShape*const* shapes = actor->getShapes(); + NxU32 nShapes = actor->getNbShapes(); + nShapes = actor->getNbShapes(); + while (nShapes--) + { + DrawWireShape(shapes[nShapes], NxVec3(1,1,1)); + } +} + +static void DrawActorShadow(NxActor* actor, const float* ShadowMat) +{ + glPushMatrix(); + glMultMatrixf(ShadowMat); + + glDisable(GL_LIGHTING); + glColor4f(0.05f, 0.1f, 0.15f, 1.0f); + + NxShape*const* shapes = actor->getShapes(); + NxU32 nShapes = actor->getNbShapes(); + while (nShapes--) + { + switch(shapes[nShapes]->getType()) + { + case NX_SHAPE_BOX: + DrawBox(shapes[nShapes]); + break; + case NX_SHAPE_SPHERE: + DrawSphere(shapes[nShapes]); + break; + case NX_SHAPE_CAPSULE: + DrawCapsule(shapes[nShapes]); + break; + case NX_SHAPE_CONVEX: + DrawConvex(shapes[nShapes]); + break; + } + } + + glColor4f(1.0f, 1.0f, 1.0f, 1.0f); + glEnable(GL_LIGHTING); + + glPopMatrix(); +} + + +void DrawActorShadow(NxActor* actor) +{ + const static float ShadowMat[]={ 1,0,0,0, 0,0,0,0, 0,0,1,0, 0,0,0,1 }; + DrawActorShadow(actor, ShadowMat); +} + +void DrawActorShadow2(NxActor* actor) +{ + const static float ShadowMat[]={ 1,0,0,0, 1,0,-0.2,0, 0,0,1,0, 0,0,0,1 }; + DrawActorShadow(actor, ShadowMat); +} + +void DrawActorShadowZUp(NxActor* actor) +{ + const static float ShadowMat[]={ 1,0,0,0, 0,1,0,0, 0,0,0,0, 0,0,0,1 }; + DrawActorShadow(actor, ShadowMat); +} + +void DrawCloth(NxCloth *cloth, bool shadows) +{ + NxMeshData meshData = cloth->getMeshData(); + + NxU32 numVertices = *meshData.numVerticesPtr; + NxU32 numTriangles = *meshData.numIndicesPtr / 3; + + glEnableClientState(GL_VERTEX_ARRAY); + glEnableClientState(GL_NORMAL_ARRAY); + glVertexPointer(3, GL_FLOAT, 0, meshData.verticesPosBegin); + glNormalPointer(GL_FLOAT, 0, meshData.verticesNormalBegin); + +#ifdef __CELLOS_LV2__ + glDrawRangeElements(GL_TRIANGLES, 0, numVertices-1, 3*numTriangles, GL_UNSIGNED_INT, meshData.indicesBegin); +#else + glDrawElements(GL_TRIANGLES, 3*numTriangles, GL_UNSIGNED_INT, meshData.indicesBegin); +#endif + + if (shadows) { + const static float ShadowMat[]={ 1,0,0,0, 0,0,0,0, 0,0,1,0, 0,0,0,1 }; + glPushMatrix(); + glMultMatrixf(ShadowMat); + glDisable(GL_LIGHTING); + glColor4f(0.05f, 0.1f, 0.15f,1.0f); + +#ifdef __CELLOS_LV2__ + glDrawRangeElements(GL_TRIANGLES, 0, numVertices-1, 3*numTriangles, GL_UNSIGNED_INT, meshData.indicesBegin); +#else + glDrawElements(GL_TRIANGLES, 3*numTriangles, GL_UNSIGNED_INT, meshData.indicesBegin); +#endif + + glColor4f(1.0f, 1.0f, 1.0f,1.0f); + glEnable(GL_LIGHTING); + glPopMatrix(); + } + + glDisableClientState(GL_VERTEX_ARRAY); + glDisableClientState(GL_NORMAL_ARRAY); +} + +#ifdef WIN32 +#include +typedef BOOL (APIENTRY *PFNWGLSWAPINTERVALFARPROC)( int ); +PFNWGLSWAPINTERVALFARPROC wglSwapIntervalEXT = 0; +int vsyncState = 1; +#endif + +void toggleVSync() +{ +#ifdef WIN32 + if (wglSwapIntervalEXT == NULL) + { + const char* extensions = (const char*)glGetString(GL_EXTENSIONS); + if (strstr(extensions, "WGL_EXT_swap_control") != 0) + { + wglSwapIntervalEXT = (PFNWGLSWAPINTERVALFARPROC)wglGetProcAddress( "wglSwapIntervalEXT" ); + } + } + if (wglSwapIntervalEXT != NULL) + { + vsyncState = 1 - vsyncState; + wglSwapIntervalEXT(vsyncState); + } +#endif +} +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/RenderingHelpers.h b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/RenderingHelpers.h new file mode 100644 index 00000000..24dcfb7a --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/RenderingHelpers.h @@ -0,0 +1,26 @@ +/* +CDTestFramework http://codercorner.com +Copyright (c) 2007-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ +#ifndef RENDERINGHELPERS_H +#define RENDERINGHELPERS_H + +#include "Opcode.h" + + void DrawLine(const Point& p0, const Point& p1, const Point& color, float line_width); + void DrawTriangle(const Point& p0, const Point& p1, const Point& p2, const Point& color); + void DrawSphere(const Sphere& sphere); + void DrawOBB(const OBB& obb); + void DrawCapsule(const Matrix4x4& world, const Point& p0, const Point& p1, float r); + +#endif // RENDERINGHELPERS_H diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/SphereMeshQuery.cpp b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/SphereMeshQuery.cpp new file mode 100644 index 00000000..e78eadb0 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/SphereMeshQuery.cpp @@ -0,0 +1,141 @@ +/* +CDTestFramework http://codercorner.com +Copyright (c) 2007-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#include "stdafx.h" +#include "RenderingHelpers.h" +#include "IceHelpers.h" +#include "SphereMeshQuery.h" +#include "Terrain.h" +#include "Profiling.h" +#include "Camera.h" +#include "GLFontRenderer.h" + +SphereMeshQuery::SphereMeshQuery() : + mBar (null), + mDist (0.0f), + mValidHit (false) +{ +} + +SphereMeshQuery::~SphereMeshQuery() +{ +} + +void SphereMeshQuery::Init() +{ + mSphere.mCenter = Point(0.0f, 0.0f, 0.0f); + mSphere.mRadius = 1.0f; +} + +void SphereMeshQuery::Release() +{ + Deselect(); +} + +void SphereMeshQuery::Select() +{ + // Create a tweak bar + { + mBar = TwNewBar("SphereMeshQuery"); + TwAddVarRW(mBar, "Radius", TW_TYPE_FLOAT, &mSphere.mRadius, " min=0.01 max=200.0 step=0.05"); + + mSettings.AddToTweakBar(mBar); +// mProfiler.AddToTweakBar(mBar); + } +} + +void SphereMeshQuery::Deselect() +{ + if(mBar) + { + TwDeleteBar(mBar); + mBar = null; + } +} + +void SphereMeshQuery::PerformTest() +{ + RenderTerrain(); + + DrawSphere(mSphere); + + // OPCODE query + const Model* TM = GetTerrainModel(); + if(TM) + { + SphereCollider Collider; + mSettings.SetupCollider(Collider); + + mProfiler.Start(); + bool Status = Collider.Collide(mCache, mSphere, *TM, null, null); + mProfiler.End(); + mProfiler.Accum(); + + if(Status) + { + if(Collider.GetContactStatus()) + { + udword NbTris = Collider.GetNbTouchedPrimitives(); + const udword* Indices = Collider.GetTouchedPrimitives(); + + RenderTerrainTriangles(NbTris, Indices); + } + } + } + + // Raycast hit + if(mValidHit) + { + Point wp = mLocalHit + mSphere.mCenter; + DrawLine(wp, wp + Point(1.0f, 0.0f, 0.0f), Point(1,0,0), 1.0f); + DrawLine(wp, wp + Point(0.0f, 1.0f, 0.0f), Point(0,1,0), 1.0f); + DrawLine(wp, wp + Point(0.0f, 0.0f, 1.0f), Point(0,0,1), 1.0f); + } + + char Buffer[4096]; + sprintf(Buffer, "Sphere-mesh query = %5.1f us (%d cycles)\n", mProfiler.mMsTime, mProfiler.mCycles); + GLFontRenderer::print(10.0f, 10.0f, 0.02f, Buffer); +} + +void SphereMeshQuery::KeyboardCallback(unsigned char key, int x, int y) +{ +} + +void SphereMeshQuery::MouseCallback(int button, int state, int x, int y) +{ + mValidHit = false; + if(!button && !state) + { + Point Dir = ComputeWorldRay(x, y); + + float d; + Point hit; + if(SegmentSphere(GetCameraPos(), Dir, 10000.0f, mSphere.mCenter, mSphere.mRadius, d, hit)) + { + mValidHit = true; + mDist = d; + mLocalHit = hit - mSphere.mCenter; + } + } +} + +void SphereMeshQuery::MotionCallback(int x, int y) +{ + if(mValidHit) + { + Point Dir = ComputeWorldRay(x, y); + mSphere.mCenter = GetCameraPos() + Dir*mDist - mLocalHit; + } +} diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/SphereMeshQuery.h b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/SphereMeshQuery.h new file mode 100644 index 00000000..e03eee7c --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/SphereMeshQuery.h @@ -0,0 +1,48 @@ +/* +CDTestFramework http://codercorner.com +Copyright (c) 2007-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ +#ifndef SPHEREMESHQUERY_H +#define SPHEREMESHQUERY_H + +#include "CollisionTest.h" +#include "Profiling.h" + + class SphereMeshQuery : public CollisionTest + { + public: + SphereMeshQuery(); + virtual ~SphereMeshQuery(); + + virtual void Init(); + virtual void Release(); + virtual void PerformTest(); + virtual void Select(); + virtual void Deselect(); + virtual void KeyboardCallback(unsigned char key, int x, int y); + virtual void MouseCallback(int button, int state, int x, int y); + virtual void MotionCallback(int x, int y); + + TwBar* mBar; //!< AntTweakBar + Sphere mSphere; + + SphereCache mCache; + OpcodeSettings mSettings; + Profiler mProfiler; + + float mDist; + Point mLocalHit; + bool mValidHit; + }; + +#endif // SPHEREMESHQUERY_H diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Terrain.cpp b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Terrain.cpp new file mode 100644 index 00000000..c849ce3f --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Terrain.cpp @@ -0,0 +1,470 @@ +/* +CDTestFramework http://codercorner.com +Copyright (c) 2007-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ +#include "stdafx.h" +#include "Terrain.h" + +inline float NxAngle(const Point& v0, const Point& v1) + { + float cos = v0|v1; // |v0|*|v1|*Cos(Angle) + float sin = (v0^v1).Magnitude(); // |v0|*|v1|*Sin(Angle) + return ::atan2(sin, cos); + } + +static float computeAngle(const Point* verts, const udword* refs, udword vref) +{ + udword e0=0,e2=0; + if(vref==refs[0]) + { + e0 = 2; + e2 = 1; + } + else if(vref==refs[1]) + { + e0 = 2; + e2 = 0; + } + else if(vref==refs[2]) + { + e0 = 0; + e2 = 1; + } + else + { + assert(0); + } + Point edge0 = verts[refs[e0]] - verts[vref]; + Point edge1 = verts[refs[e2]] - verts[vref]; + + return NxAngle(edge0, edge1); +} +static bool buildSmoothNormals( + udword nbTris, udword nbVerts, + const Point* verts, + const udword* dFaces, const uword* wFaces, + Point* normals, + bool flip) + { + // Checkings + if(!verts || !normals || !nbTris || !nbVerts) return false; + + // Get correct destination buffers + // - if available, write directly to user-provided buffers + // - else get some ram and keep track of it + Point* FNormals = new Point[nbTris]; + if(!FNormals) return false; + + // Compute face normals + udword c = (flip!=0); + for(udword i=0;i>=1; + if(!currentSize) return; + + // Compute new heights + float v0 = (value * float(rand()-RAND_MAX_OVER_TWO) * ONE_OVER_RAND_MAX); + float v1 = (value * float(rand()-RAND_MAX_OVER_TWO) * ONE_OVER_RAND_MAX); + float v2 = (value * float(rand()-RAND_MAX_OVER_TWO) * ONE_OVER_RAND_MAX); + float v3 = (value * float(rand()-RAND_MAX_OVER_TWO) * ONE_OVER_RAND_MAX); + float v4 = (value * float(rand()-RAND_MAX_OVER_TWO) * ONE_OVER_RAND_MAX); + + udword x1 = (x0+currentSize) % initSize; + udword x2 = (x0+currentSize+currentSize) % initSize; + udword y1 = (y0+currentSize) % initSize; + udword y2 = (y0+currentSize+currentSize) % initSize; + + if(!done[x1 + y0*initSize]) field[x1 + y0*initSize].y = v0 + 0.5f * (field[x0 + y0*initSize].y + field[x2 + y0*initSize].y); + if(!done[x0 + y1*initSize]) field[x0 + y1*initSize].y = v1 + 0.5f * (field[x0 + y0*initSize].y + field[x0 + y2*initSize].y); + if(!done[x2 + y1*initSize]) field[x2 + y1*initSize].y = v2 + 0.5f * (field[x2 + y0*initSize].y + field[x2 + y2*initSize].y); + if(!done[x1 + y2*initSize]) field[x1 + y2*initSize].y = v3 + 0.5f * (field[x0 + y2*initSize].y + field[x2 + y2*initSize].y); + if(!done[x1 + y1*initSize]) field[x1 + y1*initSize].y = v4 + 0.5f * (field[x0 + y1*initSize].y + field[x2 + y1*initSize].y); + + done[x1 + y0*initSize] = true; + done[x0 + y1*initSize] = true; + done[x2 + y1*initSize] = true; + done[x1 + y2*initSize] = true; + done[x1 + y1*initSize] = true; + + // Recurse through 4 corners + value *= 0.5f; + _Compute(done, field, x0, y0, currentSize, value, initSize); + _Compute(done, field, x0, y1, currentSize, value, initSize); + _Compute(done, field, x1, y0, currentSize, value, initSize); + _Compute(done, field, x1, y1, currentSize, value, initSize); + } + }; + + // Fractalize + srand(42); + bool* done = new bool[nbVerts]; + memset(done,0,nbVerts*sizeof(bool)); + verts[0].y = 10.0f; + verts[size-1].y = 10.0f; + verts[size*(size-1)].y = 10.0f; + verts[nbVerts-1].y = 10.0f; + Local::_Compute(done, verts, 0, 0, size, chaos, size); + for(udword i=0;iinit(TERRAIN_SIZE, TERRAIN_OFFSET, TERRAIN_WIDTH, TERRAIN_CHAOS); + + // Build OPCODE model + + gMeshInterface.SetNbTriangles(gTerrainData->nbFaces); + gMeshInterface.SetNbVertices(gTerrainData->nbVerts); + gMeshInterface.SetPointers((const IndexedTriangle*)gTerrainData->faces, gTerrainData->verts); + + OPCODECREATE Create; + Create.mIMesh = &gMeshInterface; + Create.mSettings.mLimit = 1; + Create.mSettings.mRules = SPLIT_SPLATTER_POINTS|SPLIT_GEOM_CENTER; + Create.mNoLeaf = true; + Create.mQuantized = true; + Create.mKeepOriginal = false; + Create.mCanRemap = false; + + gOpcodeModel = new Model; + if(!gOpcodeModel->Build(Create)) + { + } +} + +void RenderTerrain() +{ + if(gTerrainData) + renderTerrain(*gTerrainData, true); +} + +void RenderTerrainTriangles(udword nbTriangles, const udword* indices) +{ + if(gTerrainData) + renderTerrainTriangles(*gTerrainData, nbTriangles, indices); +} diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Terrain.h b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Terrain.h new file mode 100644 index 00000000..3f5f6f23 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/Terrain.h @@ -0,0 +1,47 @@ +/* +CDTestFramework http://codercorner.com +Copyright (c) 2007-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ +#ifndef TERRAIN_H +#define TERRAIN_H + + class TerrainData + { + public: + TerrainData(); + ~TerrainData(); + + void init(udword size, float offset, float width, float chaos, bool flat=false, const Point* pos=NULL); + void release(); + + udword size; + udword nbVerts; + udword nbFaces; + float offset; + float width; + float chaos; + Point* verts; + Point* colors; + Point* normals; + udword* faces; + }; + + void CreateTerrain(); + void ReleaseTerrain(); + + void RenderTerrain(); + void RenderTerrainTriangles(udword nbTriangles, const udword* indices); + + const Model* GetTerrainModel(); + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/convex1.bin b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/convex1.bin new file mode 100644 index 0000000000000000000000000000000000000000..c7958bd36d37a97a119dfc3b285a8174d94740a0 GIT binary patch literal 2924 zcmYjRYfO~a7X8FwUD`M#wdshO`2$$ zs@L1g1!;fSq$;As*3S8;HGSDyQz|r2Ypd1PTJKHlBR8?uyH}mvX!3>QI&1H}_Bwmd zZbeay@{}#C+MqVw>$UM&WOh03{%g_d(`QoT3y*eV6 z-0Tq_r%#IC91Y@8W{|k{-eciYXcO+APKjS^cJa{jknk*iBG!GLA}oVJBINKLp)2bb zF~^VFY#x_IiN^)uxMKaA(|6rpa_q^lgOWLmA0udQdGZW4F~q7 zNY+;UpjP%=IO2eQaGFaKCG;aUd(A-!{ovd(2T15gY;ew`gnnqyef(HLKeVN~->)I>x9EjEN00n=uat~Re$!nO-${OJ z`|-z;XQ0Y^Qt}M%&o^j1+kD0h;|va;`K^(YX8^T$HjtBN2DNTP7*(EOoO!nSj2UJQ z&b({L$vcQzyqn0$JBwPpJK*q6A(nRy9Nt013i^%KDatgL>2#of`_(@$`VEIw8#JAw zbJe>IB=?C^{)MWyqNw_7K-~>Sk9P?%5K=?8CO0FYGdyR`0_skvJ-JW5a0%SmUMBB1 zoEc1tqMa`VI%lqrZwGNs6W@=}Fkhha=KJ|m2F;B!)YI*Q0H6U20)rfc>IrS6Og&9N zgF_aEBEwsh!JlqAj{pq|k685j)2E`1cwf^^Qwo$Vj*ME;E%oQQKl()?G&*K!EOBM4 zlUqN53~}ao3wfYrVn`e6XgZrj1dC)udyLswMg$Z@NvW z*GU7=F9}WF4KyP&E4z~-uTdvg>2}|CpgGHyugHBCtxXX6pG2U!dHDsGh)4cv)UiC= z1q~}#tuD-Wa>uFaKmYQ#sJNum*_UPxjyaEw)G1|a)~_1K5a&8oe4p}0{}0tR)zsQ2>3_?K_XXY9ih$PDH#8RCZyDx_*ae-^ z)ZEhg1*wNR>R40H0o~lTr5)2W?dLjjR8eTA3EjGFd&eMg;rdPDZtVbf$Ii}O{Zy^R ziMDwe=)I>e4AHqMBRhJAeh+U~qlZSsCwugSyM`@t_t2}Kd8;M#EugRO5pctnwi&aG z6U4nr+@`X!_^P|WJ-2qu_MVwQynOoNKJ(UU>VbRB@pYMI3QZm#`i){@heqVSP~dYr zch2+oi6UMO@iXXe%CD}3&yTYN1o=G-Z`Ud)zw6n(=G>*=FIXBA92!XZwF2VD(zoXT z@bJY;($$C<;*PZxn$g4hY&XIqqhnK3qLQdy#6Hv6UkPu10=_x7AR#&4nO}MxE<8Kd z2|RK6GHY5=8s$%Y_Nn8)1Gi;lm#q`as9q-Fk@WXzBl2hFtSBkY^75I2ZyM^KwgS)F zWM5gBkNz$6kyh>1X5?8_wXvvlbzbTWGx?y!lP>#rz}J*lZf;-u)iXckxsJK#?#Ccc z#fIvZ=JljSg&yd7XA=CH9lPopYx^iZtLN6)Zz7mk43LidT5sGf!au6g zYeq$J(|Z_a&Ga@+t2(Mztye144Z#5QNE@uJFD1P zOIz6a+EDKq+*PewX|HW;Xl`A1Sb#cL<6 zh}&LYx2tpR9Ix3OhhFpG9<;dGh}%)KDKFO?H-Fwviql;G?Q1EaxQS5QZ85knicrP6 Swe8S;;=d*6L(O?x(f$twJl7Kd literal 0 HcmV?d00001 diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/stdafx.cpp b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/stdafx.cpp new file mode 100644 index 00000000..b4e1e25c --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/stdafx.cpp @@ -0,0 +1,23 @@ +/* +CDTestFramework http://codercorner.com +Copyright (c) 2007-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +// stdafx.cpp : source file that includes just the standard includes +// CDTestFramework.pch will be the pre-compiled header +// stdafx.obj will contain the pre-compiled type information + +#include "stdafx.h" + +// TODO: reference any additional headers you need in STDAFX.H +// and not in this file diff --git a/BulletPhysics/bulletTrunk/Extras/CDTestFramework/stdafx.h b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/stdafx.h new file mode 100644 index 00000000..64535de0 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CDTestFramework/stdafx.h @@ -0,0 +1,23 @@ +/* +CDTestFramework http://codercorner.com +Copyright (c) 2007-2008 Pierre Terdiman, pierre@codercorner.com + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#include +#include // For _alloca +#include +#include "GL/glut.h" +#include "AntTweakBar.h" + +#include "Opcode.h" +using namespace Opcode; diff --git a/BulletPhysics/bulletTrunk/Extras/CMakeLists.txt b/BulletPhysics/bulletTrunk/Extras/CMakeLists.txt new file mode 100644 index 00000000..9ccdb3c4 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CMakeLists.txt @@ -0,0 +1 @@ +SUBDIRS( glui iff ConvexDecomposition BulletColladaConverter LibXML COLLADA_DOM GIMPACTUtils ) diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/CMakeLists.txt b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/CMakeLists.txt new file mode 100644 index 00000000..4c0d40e5 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/CMakeLists.txt @@ -0,0 +1,213 @@ +INCLUDE_DIRECTORIES( +${BULLET_PHYSICS_SOURCE_DIR}/Extras/LibXML/include ${BULLET_PHYSICS_SOURCE_DIR}/Extras/COLLADA_DOM/include ${BULLET_PHYSICS_SOURCE_DIR}/Extras/COLLADA_DOM/include/1.4 +) + +ADD_DEFINITIONS( -D_CRT_SECURE_NO_WARNINGS) +ADD_DEFINITIONS( -D_CRT_SECURE_NO_DEPRECATE) + + +ADD_LIBRARY(ColladaDom + src/1.4/dom/domAccessor.cpp + src/1.4/dom/domAnimation.cpp + src/1.4/dom/domAnimation_clip.cpp + src/1.4/dom/domAsset.cpp + src/1.4/dom/domBind_material.cpp + src/1.4/dom/domBool_array.cpp + src/1.4/dom/domBox.cpp + src/1.4/dom/domCamera.cpp + src/1.4/dom/domCapsule.cpp + src/1.4/dom/domCg_connect_param.cpp + src/1.4/dom/domCg_newarray_type.cpp + src/1.4/dom/domCg_newparam.cpp + src/1.4/dom/domCg_param_type.cpp + src/1.4/dom/domCg_sampler1D.cpp + src/1.4/dom/domCg_sampler2D.cpp + src/1.4/dom/domCg_sampler3D.cpp + src/1.4/dom/domCg_samplerCUBE.cpp + src/1.4/dom/domCg_samplerDEPTH.cpp + src/1.4/dom/domCg_samplerRECT.cpp + src/1.4/dom/domCg_setarray_type.cpp + src/1.4/dom/domCg_setparam.cpp + src/1.4/dom/domCg_setparam_simple.cpp + src/1.4/dom/domCg_setuser_type.cpp + src/1.4/dom/domCg_surface_type.cpp + src/1.4/dom/domChannel.cpp + src/1.4/dom/domCOLLADA.cpp + src/1.4/dom/domCommon_color_or_texture_type.cpp + src/1.4/dom/domCommon_float_or_param_type.cpp + src/1.4/dom/domCommon_newparam_type.cpp + src/1.4/dom/domCommon_transparent_type.cpp + src/1.4/dom/domConstants.cpp + src/1.4/dom/domController.cpp + src/1.4/dom/domConvex_mesh.cpp + src/1.4/dom/domCylinder.cpp + src/1.4/dom/domEffect.cpp + src/1.4/dom/domEllipsoid.cpp + src/1.4/dom/domExtra.cpp + src/1.4/dom/domFloat_array.cpp + src/1.4/dom/domForce_field.cpp + src/1.4/dom/domFx_annotate_common.cpp + src/1.4/dom/domFx_annotate_type_common.cpp + src/1.4/dom/domFx_basic_type_common.cpp + src/1.4/dom/domFx_clearcolor_common.cpp + src/1.4/dom/domFx_cleardepth_common.cpp + src/1.4/dom/domFx_clearstencil_common.cpp + src/1.4/dom/domFx_code_profile.cpp + src/1.4/dom/domFx_colortarget_common.cpp + src/1.4/dom/domFx_depthtarget_common.cpp + src/1.4/dom/domFx_include_common.cpp + src/1.4/dom/domFx_newparam_common.cpp + src/1.4/dom/domFx_profile_abstract.cpp + src/1.4/dom/domFx_sampler1D_common.cpp + src/1.4/dom/domFx_sampler2D_common.cpp + src/1.4/dom/domFx_sampler3D_common.cpp + src/1.4/dom/domFx_samplerCUBE_common.cpp + src/1.4/dom/domFx_samplerDEPTH_common.cpp + src/1.4/dom/domFx_samplerRECT_common.cpp + src/1.4/dom/domFx_stenciltarget_common.cpp + src/1.4/dom/domFx_surface_common.cpp + src/1.4/dom/domFx_surface_format_hint_common.cpp + src/1.4/dom/domFx_surface_init_common.cpp + src/1.4/dom/domFx_surface_init_cube_common.cpp + src/1.4/dom/domFx_surface_init_from_common.cpp + src/1.4/dom/domFx_surface_init_planar_common.cpp + src/1.4/dom/domFx_surface_init_volume_common.cpp + src/1.4/dom/domGeometry.cpp + src/1.4/dom/domGl_hook_abstract.cpp + src/1.4/dom/domGl_pipeline_settings.cpp + src/1.4/dom/domGl_sampler1D.cpp + src/1.4/dom/domGl_sampler2D.cpp + src/1.4/dom/domGl_sampler3D.cpp + src/1.4/dom/domGl_samplerCUBE.cpp + src/1.4/dom/domGl_samplerDEPTH.cpp + src/1.4/dom/domGl_samplerRECT.cpp + src/1.4/dom/domGles_basic_type_common.cpp + src/1.4/dom/domGles_newparam.cpp + src/1.4/dom/domGles_pipeline_settings.cpp + src/1.4/dom/domGles_sampler_state.cpp + src/1.4/dom/domGles_texcombiner_argumentAlpha_type.cpp + src/1.4/dom/domGles_texcombiner_argumentRGB_type.cpp + src/1.4/dom/domGles_texcombiner_command_type.cpp + src/1.4/dom/domGles_texcombiner_commandAlpha_type.cpp + src/1.4/dom/domGles_texcombiner_commandRGB_type.cpp + src/1.4/dom/domGles_texenv_command_type.cpp + src/1.4/dom/domGles_texture_constant_type.cpp + src/1.4/dom/domGles_texture_pipeline.cpp + src/1.4/dom/domGles_texture_unit.cpp + src/1.4/dom/domGlsl_newarray_type.cpp + src/1.4/dom/domGlsl_newparam.cpp + src/1.4/dom/domGlsl_param_type.cpp + src/1.4/dom/domGlsl_setarray_type.cpp + src/1.4/dom/domGlsl_setparam.cpp + src/1.4/dom/domGlsl_setparam_simple.cpp + src/1.4/dom/domGlsl_surface_type.cpp + src/1.4/dom/domIDREF_array.cpp + src/1.4/dom/domImage.cpp + src/1.4/dom/domInputGlobal.cpp + src/1.4/dom/domInputLocal.cpp + src/1.4/dom/domInputLocalOffset.cpp + src/1.4/dom/domInstance_camera.cpp + src/1.4/dom/domInstance_controller.cpp + src/1.4/dom/domInstance_effect.cpp + src/1.4/dom/domInstance_force_field.cpp + src/1.4/dom/domInstance_geometry.cpp + src/1.4/dom/domInstance_light.cpp + src/1.4/dom/domInstance_material.cpp + src/1.4/dom/domInstance_node.cpp + src/1.4/dom/domInstance_physics_material.cpp + src/1.4/dom/domInstance_physics_model.cpp + src/1.4/dom/domInstance_rigid_body.cpp + src/1.4/dom/domInstance_rigid_constraint.cpp + src/1.4/dom/domInstanceWithExtra.cpp + src/1.4/dom/domInt_array.cpp + src/1.4/dom/domLibrary_animation_clips.cpp + src/1.4/dom/domLibrary_animations.cpp + src/1.4/dom/domLibrary_cameras.cpp + src/1.4/dom/domLibrary_controllers.cpp + src/1.4/dom/domLibrary_effects.cpp + src/1.4/dom/domLibrary_force_fields.cpp + src/1.4/dom/domLibrary_geometries.cpp + src/1.4/dom/domLibrary_images.cpp + src/1.4/dom/domLibrary_lights.cpp + src/1.4/dom/domLibrary_materials.cpp + src/1.4/dom/domLibrary_nodes.cpp + src/1.4/dom/domLibrary_physics_materials.cpp + src/1.4/dom/domLibrary_physics_models.cpp + src/1.4/dom/domLibrary_physics_scenes.cpp + src/1.4/dom/domLibrary_visual_scenes.cpp + src/1.4/dom/domLight.cpp + src/1.4/dom/domLines.cpp + src/1.4/dom/domLinestrips.cpp + src/1.4/dom/domLookat.cpp + src/1.4/dom/domMaterial.cpp + src/1.4/dom/domMatrix.cpp + src/1.4/dom/domMesh.cpp + src/1.4/dom/domMorph.cpp + src/1.4/dom/domName_array.cpp + src/1.4/dom/domNode.cpp + src/1.4/dom/domP.cpp + src/1.4/dom/domParam.cpp + src/1.4/dom/domPhysics_material.cpp + src/1.4/dom/domPhysics_model.cpp + src/1.4/dom/domPhysics_scene.cpp + src/1.4/dom/domPlane.cpp + src/1.4/dom/domPolygons.cpp + src/1.4/dom/domPolylist.cpp + src/1.4/dom/domProfile_CG.cpp + src/1.4/dom/domProfile_COMMON.cpp + src/1.4/dom/domProfile_GLES.cpp + src/1.4/dom/domProfile_GLSL.cpp + src/1.4/dom/domRigid_body.cpp + src/1.4/dom/domRigid_constraint.cpp + src/1.4/dom/domRotate.cpp + src/1.4/dom/domSampler.cpp + src/1.4/dom/domScale.cpp + src/1.4/dom/domSkew.cpp + src/1.4/dom/domSkin.cpp + src/1.4/dom/domSource.cpp + src/1.4/dom/domSphere.cpp + src/1.4/dom/domSpline.cpp + src/1.4/dom/domTapered_capsule.cpp + src/1.4/dom/domTapered_cylinder.cpp + src/1.4/dom/domTargetableFloat.cpp + src/1.4/dom/domTargetableFloat3.cpp + src/1.4/dom/domTechnique.cpp + src/1.4/dom/domTranslate.cpp + src/1.4/dom/domTriangles.cpp + src/1.4/dom/domTrifans.cpp + src/1.4/dom/domTristrips.cpp + src/1.4/dom/domTypes.cpp + src/1.4/dom/domVertices.cpp + src/1.4/dom/domVisual_scene.cpp + src/dae/dae.cpp + src/dae/daeArray.cpp + src/dae/daeAtomicType.cpp + src/dae/daeDocument.cpp + src/dae/daeDom.cpp + src/dae/daeElement.cpp + src/dae/daeError.cpp + src/dae/daeErrorHandler.cpp + src/dae/daeIDRef.cpp + src/dae/daeMemorySystem.cpp + src/dae/daeMetaAny.cpp + src/dae/daeMetaAttribute.cpp + src/dae/daeMetaChoice.cpp + src/dae/daeMetaCMPolicy.cpp + src/dae/daeMetaElement.cpp + src/dae/daeMetaElementAttribute.cpp + src/dae/daeMetaGroup.cpp + src/dae/daeMetaSequence.cpp + src/dae/daeSIDResolver.cpp + src/dae/daeStringRef.cpp + src/dae/daeStringTable.cpp + src/dae/daeURI.cpp + src/dae/domAny.cpp + src/modules/LIBXMLPlugin/daeLIBXMLPlugin.cpp + src/modules/LIBXMLPlugin/daeLIBXMLResolver.cpp + src/modules/stdErrPlugin/stdErrPlugin.cpp + src/modules/STLDatabase/daeSTLDatabase.cpp +) + +IF (BUILD_SHARED_LIBS) + TARGET_LINK_LIBRARIES(ColladaDom XML) +ENDIF (BUILD_SHARED_LIBS) diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/Jamfile b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/Jamfile new file mode 100644 index 00000000..6d3afbd5 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/Jamfile @@ -0,0 +1,38 @@ +SubDir TOP Extras COLLADA_DOM ; + + +#IncludeDir Extras/COLLADA_DOM/include ; +#IncludeDir Extras/COLLADA_DOM/include/1.4 ; +#IncludeDir Extras/LibXML/include ; + +Library colladadom : + [ Wildcard src/dae : *.h *.cpp ] + [ Wildcard src/1.4/dom : *.h *.cpp ] + [ Wildcard src/modules/LIBXMLPlugin : *.h *.cpp ] + [ Wildcard src/modules/stdErrPlugin : *.h *.cpp ] + [ Wildcard src/modules/STLDatabase : *.h *.cpp ] +: noinstall + + ; + +CFlags colladadom : +[ FIncludes $(TOP)/Extras/COLLADA_DOM/include ] +[ FIncludes $(TOP)/Extras/COLLADA_DOM/include/1.4 ] +[ FIncludes $(TOP)/Extras/LibXML/include ] +; + + + MsvcIncDirs colladadom : "../../Extras/Demos/OpenGL" + "../../Extras/COLLADA_DOM/include" + "../../Extras/COLLADA_DOM/include/1.4" + "../../Extras/LibXML" + "../../Extras/LibXML/include" ; + +MsvcGenConfig colladadom.INCDIRS : $(TOP)/Extras/COLLADA_DOM/include ; +MsvcGenConfig colladadom.CFLAGS : $(TOP)/Extras/COLLADA_DOM/include ; + +LibDepends colladadom : libxml ; + + +InstallHeader [ Wildcard *.h ] : COLLADA_DOM ; + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domAccessor.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domAccessor.h new file mode 100644 index 00000000..6e389cf5 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domAccessor.h @@ -0,0 +1,164 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domAccessor_h__ +#define __domAccessor_h__ + +#include +#include + +#include + +/** + * The accessor element declares an access pattern to one of the array elements: + * float_array, int_array, Name_array, bool_array, and IDREF_array. The accessor + * element describes access to arrays that are organized in either an interleaved + * or non-interleaved manner, depending on the offset and stride attributes. + */ +class domAccessor : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::ACCESSOR; } +protected: // Attributes +/** + * The count attribute indicates the number of times the array is accessed. + * Required attribute. + */ + domUint attrCount; +/** + * The offset attribute indicates the index of the first value to be read + * from the array. The default value is 0. Optional attribute. + */ + domUint attrOffset; +/** + * The source attribute indicates the location of the array to access using + * a URL expression. Required attribute. + */ + xsAnyURI attrSource; +/** + * The stride attribute indicates number of values to be considered a unit + * during each access to the array. The default value is 1, indicating that + * a single value is accessed. Optional attribute. + */ + domUint attrStride; + +protected: // Element +/** + * The accessor element may have any number of param elements. @see domParam + */ + domParam_Array elemParam_array; + +public: //Accessors and Mutators + /** + * Gets the count attribute. + * @return Returns a domUint of the count attribute. + */ + domUint getCount() const { return attrCount; } + /** + * Sets the count attribute. + * @param atCount The new value for the count attribute. + */ + void setCount( domUint atCount ) { attrCount = atCount; + _validAttributeArray[0] = true; } + + /** + * Gets the offset attribute. + * @return Returns a domUint of the offset attribute. + */ + domUint getOffset() const { return attrOffset; } + /** + * Sets the offset attribute. + * @param atOffset The new value for the offset attribute. + */ + void setOffset( domUint atOffset ) { attrOffset = atOffset; + _validAttributeArray[1] = true; } + + /** + * Gets the source attribute. + * @return Returns a xsAnyURI reference of the source attribute. + */ + xsAnyURI &getSource() { return attrSource; } + /** + * Gets the source attribute. + * @return Returns a constant xsAnyURI reference of the source attribute. + */ + const xsAnyURI &getSource() const { return attrSource; } + /** + * Sets the source attribute. + * @param atSource The new value for the source attribute. + */ + void setSource( const xsAnyURI &atSource ) { attrSource = atSource; + _validAttributeArray[2] = true; } + + /** + * Gets the stride attribute. + * @return Returns a domUint of the stride attribute. + */ + domUint getStride() const { return attrStride; } + /** + * Sets the stride attribute. + * @param atStride The new value for the stride attribute. + */ + void setStride( domUint atStride ) { attrStride = atStride; + _validAttributeArray[3] = true; } + + /** + * Gets the param element array. + * @return Returns a reference to the array of param elements. + */ + domParam_Array &getParam_array() { return elemParam_array; } + /** + * Gets the param element array. + * @return Returns a constant reference to the array of param elements. + */ + const domParam_Array &getParam_array() const { return elemParam_array; } +protected: + /** + * Constructor + */ + domAccessor() : attrCount(), attrOffset(), attrSource(), attrStride(), elemParam_array() {} + /** + * Destructor + */ + virtual ~domAccessor() {} + /** + * Copy Constructor + */ + domAccessor( const domAccessor &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domAccessor &operator=( const domAccessor &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domAnimation.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domAnimation.h new file mode 100644 index 00000000..f796c270 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domAnimation.h @@ -0,0 +1,218 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domAnimation_h__ +#define __domAnimation_h__ + +#include +#include + +#include +#include +#include +#include +#include +#include + +/** + * The animation element categorizes the declaration of animation information. + * The animation hierarchy contains elements that describe the animation’s + * key-frame data and sampler functions, ordered in such a way to group together + * animations that should be executed together. + */ +class domAnimation : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::ANIMATION; } +protected: // Attributes +/** + * The id attribute is a text string containing the unique identifier of + * this element. This value must be unique within the instance document. + * Optional attribute. + */ + xsID attrId; +/** + * The name attribute is the text string name of this element. Optional attribute. + */ + xsNCName attrName; + +protected: // Elements +/** + * The animation element may contain an asset element. @see domAsset + */ + domAssetRef elemAsset; +/** + * The animation element may contain any number of source elements. @see + * domSource + */ + domSource_Array elemSource_array; +/** + * The animation element may contain any number of sampler elements. @see + * domSampler + */ + domSampler_Array elemSampler_array; +/** + * The animation element may contain any number of channel elements. @see + * domChannel + */ + domChannel_Array elemChannel_array; +/** + * The animation may be hierarchical and may contain any number of other + * animation elements. @see domAnimation + */ + domAnimation_Array elemAnimation_array; +/** + * The extra element may appear any number of times. @see domExtra + */ + domExtra_Array elemExtra_array; + /** + * Used to preserve order in elements that do not specify strict sequencing of sub-elements. + */ + daeElementRefArray _contents; + /** + * Used to preserve order in elements that have a complex content model. + */ + daeUIntArray _contentsOrder; + + +public: //Accessors and Mutators + /** + * Gets the id attribute. + * @return Returns a xsID of the id attribute. + */ + xsID getId() const { return attrId; } + /** + * Sets the id attribute. + * @param atId The new value for the id attribute. + */ + void setId( xsID atId ) { *(daeStringRef*)&attrId = atId; + _validAttributeArray[0] = true; } + + /** + * Gets the name attribute. + * @return Returns a xsNCName of the name attribute. + */ + xsNCName getName() const { return attrName; } + /** + * Sets the name attribute. + * @param atName The new value for the name attribute. + */ + void setName( xsNCName atName ) { *(daeStringRef*)&attrName = atName; + _validAttributeArray[1] = true; } + + /** + * Gets the asset element. + * @return a daeSmartRef to the asset element. + */ + const domAssetRef getAsset() const { return elemAsset; } + /** + * Gets the source element array. + * @return Returns a reference to the array of source elements. + */ + domSource_Array &getSource_array() { return elemSource_array; } + /** + * Gets the source element array. + * @return Returns a constant reference to the array of source elements. + */ + const domSource_Array &getSource_array() const { return elemSource_array; } + /** + * Gets the sampler element array. + * @return Returns a reference to the array of sampler elements. + */ + domSampler_Array &getSampler_array() { return elemSampler_array; } + /** + * Gets the sampler element array. + * @return Returns a constant reference to the array of sampler elements. + */ + const domSampler_Array &getSampler_array() const { return elemSampler_array; } + /** + * Gets the channel element array. + * @return Returns a reference to the array of channel elements. + */ + domChannel_Array &getChannel_array() { return elemChannel_array; } + /** + * Gets the channel element array. + * @return Returns a constant reference to the array of channel elements. + */ + const domChannel_Array &getChannel_array() const { return elemChannel_array; } + /** + * Gets the animation element array. + * @return Returns a reference to the array of animation elements. + */ + domAnimation_Array &getAnimation_array() { return elemAnimation_array; } + /** + * Gets the animation element array. + * @return Returns a constant reference to the array of animation elements. + */ + const domAnimation_Array &getAnimation_array() const { return elemAnimation_array; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } + /** + * Gets the _contents array. + * @return Returns a reference to the _contents element array. + */ + daeElementRefArray &getContents() { return _contents; } + /** + * Gets the _contents array. + * @return Returns a constant reference to the _contents element array. + */ + const daeElementRefArray &getContents() const { return _contents; } + +protected: + /** + * Constructor + */ + domAnimation() : attrId(), attrName(), elemAsset(), elemSource_array(), elemSampler_array(), elemChannel_array(), elemAnimation_array(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domAnimation() {} + /** + * Copy Constructor + */ + domAnimation( const domAnimation &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domAnimation &operator=( const domAnimation &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domAnimation_clip.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domAnimation_clip.h new file mode 100644 index 00000000..e8e81644 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domAnimation_clip.h @@ -0,0 +1,187 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domAnimation_clip_h__ +#define __domAnimation_clip_h__ + +#include +#include + +#include +#include +#include + +/** + * The animation_clip element defines a section of the animation curves to + * be used together as an animation clip. + */ +class domAnimation_clip : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::ANIMATION_CLIP; } +protected: // Attributes +/** + * The id attribute is a text string containing the unique identifier of + * this element. This value must be unique within the instance document. + * Optional attribute. + */ + xsID attrId; +/** + * The name attribute is the text string name of this element. Optional attribute. + */ + xsNCName attrName; +/** + * The start attribute is the time in seconds of the beginning of the clip. + * This time is the same as that used in the key-frame data and is used to + * determine which set of key-frames will be included in the clip. The start + * time does not specify when the clip will be played. If the time falls + * between two keyframes of a referenced animation, an interpolated value + * should be used. The default value is 0.0. Optional attribute. + */ + xsDouble attrStart; +/** + * The end attribute is the time in seconds of the end of the clip. This + * is used in the same way as the start time. If end is not specified, the + * value is taken to be the end time of the longest animation. Optional + * attribute. + */ + xsDouble attrEnd; + +protected: // Elements +/** + * The animation_clip element may contain an asset element. @see domAsset + */ + domAssetRef elemAsset; +/** + * The animation_clip must instance at least one animation element. @see domInstance_animation + */ + domInstanceWithExtra_Array elemInstance_animation_array; +/** + * The extra element may appear any number of times. @see domExtra + */ + domExtra_Array elemExtra_array; + +public: //Accessors and Mutators + /** + * Gets the id attribute. + * @return Returns a xsID of the id attribute. + */ + xsID getId() const { return attrId; } + /** + * Sets the id attribute. + * @param atId The new value for the id attribute. + */ + void setId( xsID atId ) { *(daeStringRef*)&attrId = atId; + _validAttributeArray[0] = true; } + + /** + * Gets the name attribute. + * @return Returns a xsNCName of the name attribute. + */ + xsNCName getName() const { return attrName; } + /** + * Sets the name attribute. + * @param atName The new value for the name attribute. + */ + void setName( xsNCName atName ) { *(daeStringRef*)&attrName = atName; + _validAttributeArray[1] = true; } + + /** + * Gets the start attribute. + * @return Returns a xsDouble of the start attribute. + */ + xsDouble getStart() const { return attrStart; } + /** + * Sets the start attribute. + * @param atStart The new value for the start attribute. + */ + void setStart( xsDouble atStart ) { attrStart = atStart; + _validAttributeArray[2] = true; } + + /** + * Gets the end attribute. + * @return Returns a xsDouble of the end attribute. + */ + xsDouble getEnd() const { return attrEnd; } + /** + * Sets the end attribute. + * @param atEnd The new value for the end attribute. + */ + void setEnd( xsDouble atEnd ) { attrEnd = atEnd; + _validAttributeArray[3] = true; } + + /** + * Gets the asset element. + * @return a daeSmartRef to the asset element. + */ + const domAssetRef getAsset() const { return elemAsset; } + /** + * Gets the instance_animation element array. + * @return Returns a reference to the array of instance_animation elements. + */ + domInstanceWithExtra_Array &getInstance_animation_array() { return elemInstance_animation_array; } + /** + * Gets the instance_animation element array. + * @return Returns a constant reference to the array of instance_animation elements. + */ + const domInstanceWithExtra_Array &getInstance_animation_array() const { return elemInstance_animation_array; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } +protected: + /** + * Constructor + */ + domAnimation_clip() : attrId(), attrName(), attrStart(), attrEnd(), elemAsset(), elemInstance_animation_array(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domAnimation_clip() {} + /** + * Copy Constructor + */ + domAnimation_clip( const domAnimation_clip &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domAnimation_clip &operator=( const domAnimation_clip &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domAsset.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domAsset.h new file mode 100644 index 00000000..e07e57cc --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domAsset.h @@ -0,0 +1,1235 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domAsset_h__ +#define __domAsset_h__ + +#include +#include + + +/** + * The asset element defines asset management information regarding its parent + * element. + */ +class domAsset : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::ASSET; } +public: + class domContributor; + + typedef daeSmartRef domContributorRef; + typedef daeTArray domContributor_Array; + +/** + * The contributor element defines authoring information for asset management + */ + class domContributor : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::CONTRIBUTOR; } + public: + class domAuthor; + + typedef daeSmartRef domAuthorRef; + typedef daeTArray domAuthor_Array; + +/** + * The author element contains a string with the author's name. There may + * be only one author element. + */ + class domAuthor : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::AUTHOR; } + + protected: // Value + /** + * The xsString value of the text data of this element. + */ + xsString _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return Returns a xsString of the value. + */ + xsString getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( xsString val ) { *(daeStringRef*)&_value = val; } + + protected: + /** + * Constructor + */ + domAuthor() : _value() {} + /** + * Destructor + */ + virtual ~domAuthor() {} + /** + * Copy Constructor + */ + domAuthor( const domAuthor &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domAuthor &operator=( const domAuthor &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domAuthoring_tool; + + typedef daeSmartRef domAuthoring_toolRef; + typedef daeTArray domAuthoring_tool_Array; + +/** + * The authoring_tool element contains a string with the authoring tool's + * name. There may be only one authoring_tool element. + */ + class domAuthoring_tool : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::AUTHORING_TOOL; } + + protected: // Value + /** + * The xsString value of the text data of this element. + */ + xsString _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return Returns a xsString of the value. + */ + xsString getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( xsString val ) { *(daeStringRef*)&_value = val; } + + protected: + /** + * Constructor + */ + domAuthoring_tool() : _value() {} + /** + * Destructor + */ + virtual ~domAuthoring_tool() {} + /** + * Copy Constructor + */ + domAuthoring_tool( const domAuthoring_tool &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domAuthoring_tool &operator=( const domAuthoring_tool &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domComments; + + typedef daeSmartRef domCommentsRef; + typedef daeTArray domComments_Array; + +/** + * The comments element contains a string with comments from this contributor. + * There may be only one comments element. + */ + class domComments : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::COMMENTS; } + + protected: // Value + /** + * The xsString value of the text data of this element. + */ + xsString _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return Returns a xsString of the value. + */ + xsString getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( xsString val ) { *(daeStringRef*)&_value = val; } + + protected: + /** + * Constructor + */ + domComments() : _value() {} + /** + * Destructor + */ + virtual ~domComments() {} + /** + * Copy Constructor + */ + domComments( const domComments &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domComments &operator=( const domComments &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domCopyright; + + typedef daeSmartRef domCopyrightRef; + typedef daeTArray domCopyright_Array; + +/** + * The copyright element contains a string with copyright information. There + * may be only one copyright element. + */ + class domCopyright : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::COPYRIGHT; } + + protected: // Value + /** + * The xsString value of the text data of this element. + */ + xsString _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return Returns a xsString of the value. + */ + xsString getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( xsString val ) { *(daeStringRef*)&_value = val; } + + protected: + /** + * Constructor + */ + domCopyright() : _value() {} + /** + * Destructor + */ + virtual ~domCopyright() {} + /** + * Copy Constructor + */ + domCopyright( const domCopyright &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domCopyright &operator=( const domCopyright &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domSource_data; + + typedef daeSmartRef domSource_dataRef; + typedef daeTArray domSource_data_Array; + +/** + * The source_data element contains a URI reference to the source data used + * for this asset. There may be only one source_data element. + */ + class domSource_data : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::SOURCE_DATA; } + + protected: // Value + /** + * The xsAnyURI value of the text data of this element. + */ + xsAnyURI _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return Returns a xsAnyURI of the value. + */ + xsAnyURI &getValue() { return _value; } + /** + * Gets the value of this element. + * @return Returns a constant xsAnyURI of the value. + */ + const xsAnyURI &getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( const xsAnyURI &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domSource_data() : _value() {} + /** + * Destructor + */ + virtual ~domSource_data() {} + /** + * Copy Constructor + */ + domSource_data( const domSource_data &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domSource_data &operator=( const domSource_data &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + + + protected: // Elements +/** + * The author element contains a string with the author's name. There may + * be only one author element. @see domAuthor + */ + domAuthorRef elemAuthor; +/** + * The authoring_tool element contains a string with the authoring tool's + * name. There may be only one authoring_tool element. @see domAuthoring_tool + */ + domAuthoring_toolRef elemAuthoring_tool; +/** + * The comments element contains a string with comments from this contributor. + * There may be only one comments element. @see domComments + */ + domCommentsRef elemComments; +/** + * The copyright element contains a string with copyright information. There + * may be only one copyright element. @see domCopyright + */ + domCopyrightRef elemCopyright; +/** + * The source_data element contains a URI reference to the source data used + * for this asset. There may be only one source_data element. @see domSource_data + */ + domSource_dataRef elemSource_data; + + public: //Accessors and Mutators + /** + * Gets the author element. + * @return a daeSmartRef to the author element. + */ + const domAuthorRef getAuthor() const { return elemAuthor; } + /** + * Gets the authoring_tool element. + * @return a daeSmartRef to the authoring_tool element. + */ + const domAuthoring_toolRef getAuthoring_tool() const { return elemAuthoring_tool; } + /** + * Gets the comments element. + * @return a daeSmartRef to the comments element. + */ + const domCommentsRef getComments() const { return elemComments; } + /** + * Gets the copyright element. + * @return a daeSmartRef to the copyright element. + */ + const domCopyrightRef getCopyright() const { return elemCopyright; } + /** + * Gets the source_data element. + * @return a daeSmartRef to the source_data element. + */ + const domSource_dataRef getSource_data() const { return elemSource_data; } + protected: + /** + * Constructor + */ + domContributor() : elemAuthor(), elemAuthoring_tool(), elemComments(), elemCopyright(), elemSource_data() {} + /** + * Destructor + */ + virtual ~domContributor() {} + /** + * Copy Constructor + */ + domContributor( const domContributor &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domContributor &operator=( const domContributor &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domCreated; + + typedef daeSmartRef domCreatedRef; + typedef daeTArray domCreated_Array; + +/** + * The created element contains the date and time that the parent element + * was created and is represented in an ISO 8601 format. The created element + * may appear zero or one time. + */ + class domCreated : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::CREATED; } + + protected: // Value + /** + * The xsDateTime value of the text data of this element. + */ + xsDateTime _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return Returns a xsDateTime of the value. + */ + xsDateTime getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( xsDateTime val ) { *(daeStringRef*)&_value = val; } + + protected: + /** + * Constructor + */ + domCreated() : _value() {} + /** + * Destructor + */ + virtual ~domCreated() {} + /** + * Copy Constructor + */ + domCreated( const domCreated &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domCreated &operator=( const domCreated &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domKeywords; + + typedef daeSmartRef domKeywordsRef; + typedef daeTArray domKeywords_Array; + +/** + * The keywords element contains a list of words used as search criteria for + * the parent element. The keywords element may appear zero or more times. + */ + class domKeywords : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::KEYWORDS; } + + protected: // Value + /** + * The xsString value of the text data of this element. + */ + xsString _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return Returns a xsString of the value. + */ + xsString getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( xsString val ) { *(daeStringRef*)&_value = val; } + + protected: + /** + * Constructor + */ + domKeywords() : _value() {} + /** + * Destructor + */ + virtual ~domKeywords() {} + /** + * Copy Constructor + */ + domKeywords( const domKeywords &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domKeywords &operator=( const domKeywords &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domModified; + + typedef daeSmartRef domModifiedRef; + typedef daeTArray domModified_Array; + +/** + * The modified element contains the date and time that the parent element + * was last modified and represented in an ISO 8601 format. The modified + * element may appear zero or one time. + */ + class domModified : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::MODIFIED; } + + protected: // Value + /** + * The xsDateTime value of the text data of this element. + */ + xsDateTime _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return Returns a xsDateTime of the value. + */ + xsDateTime getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( xsDateTime val ) { *(daeStringRef*)&_value = val; } + + protected: + /** + * Constructor + */ + domModified() : _value() {} + /** + * Destructor + */ + virtual ~domModified() {} + /** + * Copy Constructor + */ + domModified( const domModified &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domModified &operator=( const domModified &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domRevision; + + typedef daeSmartRef domRevisionRef; + typedef daeTArray domRevision_Array; + +/** + * The revision element contains the revision information for the parent element. + * The revision element may appear zero or one time. + */ + class domRevision : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::REVISION; } + + protected: // Value + /** + * The xsString value of the text data of this element. + */ + xsString _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return Returns a xsString of the value. + */ + xsString getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( xsString val ) { *(daeStringRef*)&_value = val; } + + protected: + /** + * Constructor + */ + domRevision() : _value() {} + /** + * Destructor + */ + virtual ~domRevision() {} + /** + * Copy Constructor + */ + domRevision( const domRevision &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domRevision &operator=( const domRevision &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domSubject; + + typedef daeSmartRef domSubjectRef; + typedef daeTArray domSubject_Array; + +/** + * The subject element contains a description of the topical subject of the + * parent element. The subject element may appear zero or one time. + */ + class domSubject : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::SUBJECT; } + + protected: // Value + /** + * The xsString value of the text data of this element. + */ + xsString _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return Returns a xsString of the value. + */ + xsString getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( xsString val ) { *(daeStringRef*)&_value = val; } + + protected: + /** + * Constructor + */ + domSubject() : _value() {} + /** + * Destructor + */ + virtual ~domSubject() {} + /** + * Copy Constructor + */ + domSubject( const domSubject &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domSubject &operator=( const domSubject &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domTitle; + + typedef daeSmartRef domTitleRef; + typedef daeTArray domTitle_Array; + +/** + * The title element contains the title information for the parent element. + * The title element may appear zero or one time. + */ + class domTitle : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::TITLE; } + + protected: // Value + /** + * The xsString value of the text data of this element. + */ + xsString _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return Returns a xsString of the value. + */ + xsString getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( xsString val ) { *(daeStringRef*)&_value = val; } + + protected: + /** + * Constructor + */ + domTitle() : _value() {} + /** + * Destructor + */ + virtual ~domTitle() {} + /** + * Copy Constructor + */ + domTitle( const domTitle &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domTitle &operator=( const domTitle &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domUnit; + + typedef daeSmartRef domUnitRef; + typedef daeTArray domUnit_Array; + +/** + * The unit element contains descriptive information about unit of measure. + * It has attributes for the name of the unit and the measurement with respect + * to the meter. The unit element may appear zero or one time. + */ + class domUnit : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::UNIT; } + protected: // Attributes +/** + * The meter attribute specifies the measurement with respect to the meter. + * The default value for the meter attribute is “1.0â€. + */ + domFloat attrMeter; +/** + * The name attribute specifies the name of the unit. The default value for + * the name attribute is “meterâ€. + */ + xsNMTOKEN attrName; + + + public: //Accessors and Mutators + /** + * Gets the meter attribute. + * @return Returns a domFloat of the meter attribute. + */ + domFloat getMeter() const { return attrMeter; } + /** + * Sets the meter attribute. + * @param atMeter The new value for the meter attribute. + */ + void setMeter( domFloat atMeter ) { attrMeter = atMeter; + _validAttributeArray[0] = true; } + + /** + * Gets the name attribute. + * @return Returns a xsNMTOKEN of the name attribute. + */ + xsNMTOKEN getName() const { return attrName; } + /** + * Sets the name attribute. + * @param atName The new value for the name attribute. + */ + void setName( xsNMTOKEN atName ) { *(daeStringRef*)&attrName = atName; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domUnit() : attrMeter(), attrName() {} + /** + * Destructor + */ + virtual ~domUnit() {} + /** + * Copy Constructor + */ + domUnit( const domUnit &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domUnit &operator=( const domUnit &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domUp_axis; + + typedef daeSmartRef domUp_axisRef; + typedef daeTArray domUp_axis_Array; + +/** + * The up_axis element contains descriptive information about coordinate system + * of the geometric data. All coordinates are right-handed by definition. + * This element specifies which axis is considered up. The default is the + * Y-axis. The up_axis element may appear zero or one time. + */ + class domUp_axis : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::UP_AXIS; } + + protected: // Value + /** + * The domUpAxisType value of the text data of this element. + */ + domUpAxisType _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a domUpAxisType of the value. + */ + domUpAxisType getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( domUpAxisType val ) { _value = val; } + + protected: + /** + * Constructor + */ + domUp_axis() : _value() {} + /** + * Destructor + */ + virtual ~domUp_axis() {} + /** + * Copy Constructor + */ + domUp_axis( const domUp_axis &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domUp_axis &operator=( const domUp_axis &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + + +protected: // Elements +/** + * The contributor element defines authoring information for asset management + * @see domContributor + */ + domContributor_Array elemContributor_array; +/** + * The created element contains the date and time that the parent element + * was created and is represented in an ISO 8601 format. The created element + * may appear zero or one time. @see domCreated + */ + domCreatedRef elemCreated; +/** + * The keywords element contains a list of words used as search criteria for + * the parent element. The keywords element may appear zero or more times. + * @see domKeywords + */ + domKeywordsRef elemKeywords; +/** + * The modified element contains the date and time that the parent element + * was last modified and represented in an ISO 8601 format. The modified + * element may appear zero or one time. @see domModified + */ + domModifiedRef elemModified; +/** + * The revision element contains the revision information for the parent element. + * The revision element may appear zero or one time. @see domRevision + */ + domRevisionRef elemRevision; +/** + * The subject element contains a description of the topical subject of the + * parent element. The subject element may appear zero or one time. @see + * domSubject + */ + domSubjectRef elemSubject; +/** + * The title element contains the title information for the parent element. + * The title element may appear zero or one time. @see domTitle + */ + domTitleRef elemTitle; +/** + * The unit element contains descriptive information about unit of measure. + * It has attributes for the name of the unit and the measurement with respect + * to the meter. The unit element may appear zero or one time. @see domUnit + */ + domUnitRef elemUnit; +/** + * The up_axis element contains descriptive information about coordinate system + * of the geometric data. All coordinates are right-handed by definition. + * This element specifies which axis is considered up. The default is the + * Y-axis. The up_axis element may appear zero or one time. @see domUp_axis + */ + domUp_axisRef elemUp_axis; + +public: //Accessors and Mutators + /** + * Gets the contributor element array. + * @return Returns a reference to the array of contributor elements. + */ + domContributor_Array &getContributor_array() { return elemContributor_array; } + /** + * Gets the contributor element array. + * @return Returns a constant reference to the array of contributor elements. + */ + const domContributor_Array &getContributor_array() const { return elemContributor_array; } + /** + * Gets the created element. + * @return a daeSmartRef to the created element. + */ + const domCreatedRef getCreated() const { return elemCreated; } + /** + * Gets the keywords element. + * @return a daeSmartRef to the keywords element. + */ + const domKeywordsRef getKeywords() const { return elemKeywords; } + /** + * Gets the modified element. + * @return a daeSmartRef to the modified element. + */ + const domModifiedRef getModified() const { return elemModified; } + /** + * Gets the revision element. + * @return a daeSmartRef to the revision element. + */ + const domRevisionRef getRevision() const { return elemRevision; } + /** + * Gets the subject element. + * @return a daeSmartRef to the subject element. + */ + const domSubjectRef getSubject() const { return elemSubject; } + /** + * Gets the title element. + * @return a daeSmartRef to the title element. + */ + const domTitleRef getTitle() const { return elemTitle; } + /** + * Gets the unit element. + * @return a daeSmartRef to the unit element. + */ + const domUnitRef getUnit() const { return elemUnit; } + /** + * Gets the up_axis element. + * @return a daeSmartRef to the up_axis element. + */ + const domUp_axisRef getUp_axis() const { return elemUp_axis; } +protected: + /** + * Constructor + */ + domAsset() : elemContributor_array(), elemCreated(), elemKeywords(), elemModified(), elemRevision(), elemSubject(), elemTitle(), elemUnit(), elemUp_axis() {} + /** + * Destructor + */ + virtual ~domAsset() {} + /** + * Copy Constructor + */ + domAsset( const domAsset &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domAsset &operator=( const domAsset &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domBind_material.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domBind_material.h new file mode 100644 index 00000000..8db3f836 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domBind_material.h @@ -0,0 +1,205 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domBind_material_h__ +#define __domBind_material_h__ + +#include +#include + +#include +#include +#include +#include + +/** + * Bind a specific material to a piece of geometry, binding varying and uniform + * parameters at the same time. + */ +class domBind_material : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::BIND_MATERIAL; } +public: + class domTechnique_common; + + typedef daeSmartRef domTechnique_commonRef; + typedef daeTArray domTechnique_common_Array; + +/** + * The technique_common element specifies the bind_material information for + * the common profile which all COLLADA implementations need to support. + */ + class domTechnique_common : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::TECHNIQUE_COMMON; } + + protected: // Element +/** + * The instance_material element specifies the information needed to bind + * a geometry to a material. This element must appear at least once. @see + * domInstance_material + */ + domInstance_material_Array elemInstance_material_array; + + public: //Accessors and Mutators + /** + * Gets the instance_material element array. + * @return Returns a reference to the array of instance_material elements. + */ + domInstance_material_Array &getInstance_material_array() { return elemInstance_material_array; } + /** + * Gets the instance_material element array. + * @return Returns a constant reference to the array of instance_material elements. + */ + const domInstance_material_Array &getInstance_material_array() const { return elemInstance_material_array; } + protected: + /** + * Constructor + */ + domTechnique_common() : elemInstance_material_array() {} + /** + * Destructor + */ + virtual ~domTechnique_common() {} + /** + * Copy Constructor + */ + domTechnique_common( const domTechnique_common &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domTechnique_common &operator=( const domTechnique_common &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + + +protected: // Elements +/** + * The bind_material element may contain any number of param elements. @see + * domParam + */ + domParam_Array elemParam_array; +/** + * The technique_common element specifies the bind_material information for + * the common profile which all COLLADA implementations need to support. + * @see domTechnique_common + */ + domTechnique_commonRef elemTechnique_common; +/** + * This element may contain any number of non-common profile techniques. + * @see domTechnique + */ + domTechnique_Array elemTechnique_array; +/** + * The extra element may appear any number of times. @see domExtra + */ + domExtra_Array elemExtra_array; + +public: //Accessors and Mutators + /** + * Gets the param element array. + * @return Returns a reference to the array of param elements. + */ + domParam_Array &getParam_array() { return elemParam_array; } + /** + * Gets the param element array. + * @return Returns a constant reference to the array of param elements. + */ + const domParam_Array &getParam_array() const { return elemParam_array; } + /** + * Gets the technique_common element. + * @return a daeSmartRef to the technique_common element. + */ + const domTechnique_commonRef getTechnique_common() const { return elemTechnique_common; } + /** + * Gets the technique element array. + * @return Returns a reference to the array of technique elements. + */ + domTechnique_Array &getTechnique_array() { return elemTechnique_array; } + /** + * Gets the technique element array. + * @return Returns a constant reference to the array of technique elements. + */ + const domTechnique_Array &getTechnique_array() const { return elemTechnique_array; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } +protected: + /** + * Constructor + */ + domBind_material() : elemParam_array(), elemTechnique_common(), elemTechnique_array(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domBind_material() {} + /** + * Copy Constructor + */ + domBind_material( const domBind_material &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domBind_material &operator=( const domBind_material &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domBool_array.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domBool_array.h new file mode 100644 index 00000000..1b2b2d41 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domBool_array.h @@ -0,0 +1,144 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domBool_array_h__ +#define __domBool_array_h__ + +#include +#include + + +/** + * The bool_array element declares the storage for a homogenous array of boolean + * values. + */ +class domBool_array : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::BOOL_ARRAY; } +protected: // Attributes +/** + * The id attribute is a text string containing the unique identifier of + * this element. This value must be unique within the instance document. + * Optional attribute. + */ + xsID attrId; +/** + * The name attribute is the text string name of this element. Optional attribute. + */ + xsNCName attrName; +/** + * The count attribute indicates the number of values in the array. Required + * attribute. + */ + domUint attrCount; + +protected: // Value + /** + * The domListOfBools value of the text data of this element. + */ + domListOfBools _value; + +public: //Accessors and Mutators + /** + * Gets the id attribute. + * @return Returns a xsID of the id attribute. + */ + xsID getId() const { return attrId; } + /** + * Sets the id attribute. + * @param atId The new value for the id attribute. + */ + void setId( xsID atId ) { *(daeStringRef*)&attrId = atId; + _validAttributeArray[0] = true; } + + /** + * Gets the name attribute. + * @return Returns a xsNCName of the name attribute. + */ + xsNCName getName() const { return attrName; } + /** + * Sets the name attribute. + * @param atName The new value for the name attribute. + */ + void setName( xsNCName atName ) { *(daeStringRef*)&attrName = atName; + _validAttributeArray[1] = true; } + + /** + * Gets the count attribute. + * @return Returns a domUint of the count attribute. + */ + domUint getCount() const { return attrCount; } + /** + * Sets the count attribute. + * @param atCount The new value for the count attribute. + */ + void setCount( domUint atCount ) { attrCount = atCount; + _validAttributeArray[2] = true; } + + /** + * Gets the _value array. + * @return Returns a domListOfBools reference of the _value array. + */ + domListOfBools &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domListOfBools reference of the _value array. + */ + const domListOfBools &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domListOfBools &val ) { _value = val; } + +protected: + /** + * Constructor + */ + domBool_array() : attrId(), attrName(), attrCount(), _value() {} + /** + * Destructor + */ + virtual ~domBool_array() {} + /** + * Copy Constructor + */ + domBool_array( const domBool_array &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domBool_array &operator=( const domBool_array &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domBox.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domBox.h new file mode 100644 index 00000000..ea1be916 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domBox.h @@ -0,0 +1,172 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domBox_h__ +#define __domBox_h__ + +#include +#include + +#include + +/** + * An axis-aligned, centered box primitive. + */ +class domBox : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::BOX; } +public: + class domHalf_extents; + + typedef daeSmartRef domHalf_extentsRef; + typedef daeTArray domHalf_extents_Array; + +/** + * 3 float values that represent the extents of the box + */ + class domHalf_extents : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::HALF_EXTENTS; } + + protected: // Value + /** + * The domFloat3 value of the text data of this element. + */ + domFloat3 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domFloat3 reference of the _value array. + */ + domFloat3 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domFloat3 reference of the _value array. + */ + const domFloat3 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domFloat3 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domHalf_extents() : _value() {} + /** + * Destructor + */ + virtual ~domHalf_extents() {} + /** + * Copy Constructor + */ + domHalf_extents( const domHalf_extents &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domHalf_extents &operator=( const domHalf_extents &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + + +protected: // Elements +/** + * 3 float values that represent the extents of the box @see domHalf_extents + */ + domHalf_extentsRef elemHalf_extents; +/** + * The extra element may appear any number of times. @see domExtra + */ + domExtra_Array elemExtra_array; + +public: //Accessors and Mutators + /** + * Gets the half_extents element. + * @return a daeSmartRef to the half_extents element. + */ + const domHalf_extentsRef getHalf_extents() const { return elemHalf_extents; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } +protected: + /** + * Constructor + */ + domBox() : elemHalf_extents(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domBox() {} + /** + * Copy Constructor + */ + domBox( const domBox &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domBox &operator=( const domBox &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCOLLADA.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCOLLADA.h new file mode 100644 index 00000000..e114e7f8 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCOLLADA.h @@ -0,0 +1,534 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domCOLLADA_h__ +#define __domCOLLADA_h__ + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/** + * The COLLADA element declares the root of the document that comprises some + * of the content in the COLLADA schema. + */ +class domCOLLADA : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::COLLADA; } +public: + class domScene; + + typedef daeSmartRef domSceneRef; + typedef daeTArray domScene_Array; + +/** + * The scene embodies the entire set of information that can be visualized + * from the contents of a COLLADA resource. The scene element declares the + * base of the scene hierarchy or scene graph. The scene contains elements + * that comprise much of the visual and transformational information content + * as created by the authoring tools. + */ + class domScene : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::SCENE; } + + protected: // Elements +/** + * The instance_physics_scene element declares the instantiation of a COLLADA + * physics_scene resource. The instance_physics_scene element may appear any + * number of times. @see domInstance_physics_scene + */ + domInstanceWithExtra_Array elemInstance_physics_scene_array; +/** + * The instance_visual_scene element declares the instantiation of a COLLADA + * visual_scene resource. The instance_visual_scene element may only appear + * once. @see domInstance_visual_scene + */ + domInstanceWithExtraRef elemInstance_visual_scene; +/** + * The extra element may appear any number of times. @see domExtra + */ + domExtra_Array elemExtra_array; + + public: //Accessors and Mutators + /** + * Gets the instance_physics_scene element array. + * @return Returns a reference to the array of instance_physics_scene elements. + */ + domInstanceWithExtra_Array &getInstance_physics_scene_array() { return elemInstance_physics_scene_array; } + /** + * Gets the instance_physics_scene element array. + * @return Returns a constant reference to the array of instance_physics_scene elements. + */ + const domInstanceWithExtra_Array &getInstance_physics_scene_array() const { return elemInstance_physics_scene_array; } + /** + * Gets the instance_visual_scene element. + * @return a daeSmartRef to the instance_visual_scene element. + */ + const domInstanceWithExtraRef getInstance_visual_scene() const { return elemInstance_visual_scene; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } + protected: + /** + * Constructor + */ + domScene() : elemInstance_physics_scene_array(), elemInstance_visual_scene(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domScene() {} + /** + * Copy Constructor + */ + domScene( const domScene &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domScene &operator=( const domScene &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + +protected: // Attributes + /** + * This element may specify its own xmlns. + */ + xsAnyURI attrXmlns; +/** + * The version attribute is the COLLADA schema revision with which the instance + * document conforms. Required Attribute. + */ + domVersionType attrVersion; +/** + * The xml:base attribute allows you to define the base URI for this COLLADA + * document. See http://www.w3.org/TR/xmlbase/ for more information. + */ + xsAnyURI attrXml_base; + +protected: // Elements +/** + * The COLLADA element must contain an asset element. @see domAsset + */ + domAssetRef elemAsset; +/** + * The COLLADA element may contain any number of library_animations elements. + * @see domLibrary_animations + */ + domLibrary_animations_Array elemLibrary_animations_array; +/** + * The COLLADA element may contain any number of library_animation_clips + * elements. @see domLibrary_animation_clips + */ + domLibrary_animation_clips_Array elemLibrary_animation_clips_array; +/** + * The COLLADA element may contain any number of library_cameras elements. + * @see domLibrary_cameras + */ + domLibrary_cameras_Array elemLibrary_cameras_array; +/** + * The COLLADA element may contain any number of library_controllerss elements. + * @see domLibrary_controllers + */ + domLibrary_controllers_Array elemLibrary_controllers_array; +/** + * The COLLADA element may contain any number of library_geometriess elements. + * @see domLibrary_geometries + */ + domLibrary_geometries_Array elemLibrary_geometries_array; +/** + * The COLLADA element may contain any number of library_effects elements. + * @see domLibrary_effects + */ + domLibrary_effects_Array elemLibrary_effects_array; +/** + * The COLLADA element may contain any number of library_force_fields elements. + * @see domLibrary_force_fields + */ + domLibrary_force_fields_Array elemLibrary_force_fields_array; +/** + * The COLLADA element may contain any number of library_images elements. + * @see domLibrary_images + */ + domLibrary_images_Array elemLibrary_images_array; +/** + * The COLLADA element may contain any number of library_lights elements. + * @see domLibrary_lights + */ + domLibrary_lights_Array elemLibrary_lights_array; +/** + * The COLLADA element may contain any number of library_materials elements. + * @see domLibrary_materials + */ + domLibrary_materials_Array elemLibrary_materials_array; +/** + * The COLLADA element may contain any number of library_nodes elements. + * @see domLibrary_nodes + */ + domLibrary_nodes_Array elemLibrary_nodes_array; +/** + * The COLLADA element may contain any number of library_materials elements. + * @see domLibrary_physics_materials + */ + domLibrary_physics_materials_Array elemLibrary_physics_materials_array; +/** + * The COLLADA element may contain any number of library_physics_models elements. + * @see domLibrary_physics_models + */ + domLibrary_physics_models_Array elemLibrary_physics_models_array; +/** + * The COLLADA element may contain any number of library_physics_scenes elements. + * @see domLibrary_physics_scenes + */ + domLibrary_physics_scenes_Array elemLibrary_physics_scenes_array; +/** + * The COLLADA element may contain any number of library_visual_scenes elements. + * @see domLibrary_visual_scenes + */ + domLibrary_visual_scenes_Array elemLibrary_visual_scenes_array; +/** + * The scene embodies the entire set of information that can be visualized + * from the contents of a COLLADA resource. The scene element declares the + * base of the scene hierarchy or scene graph. The scene contains elements + * that comprise much of the visual and transformational information content + * as created by the authoring tools. @see domScene + */ + domSceneRef elemScene; +/** + * The extra element may appear any number of times. @see domExtra + */ + domExtra_Array elemExtra_array; + /** + * Used to preserve order in elements that do not specify strict sequencing of sub-elements. + */ + daeElementRefArray _contents; + /** + * Used to preserve order in elements that have a complex content model. + */ + daeUIntArray _contentsOrder; + + +public: //Accessors and Mutators + /** + * Gets the xmlns attribute. + * @return Returns a xsAnyURI reference of the xmlns attribute. + */ + xsAnyURI &getXmlns() { return attrXmlns; } + /** + * Gets the xmlns attribute. + * @return Returns a constant xsAnyURI reference of the xmlns attribute. + */ + const xsAnyURI &getXmlns() const { return attrXmlns; } + /** + * Sets the xmlns attribute. + * @param xmlns The new value for the xmlns attribute. + */ + void setXmlns( const xsAnyURI &xmlns ) { attrXmlns = xmlns; + _validAttributeArray[0] = true; } + + /** + * Gets the version attribute. + * @return Returns a domVersionType of the version attribute. + */ + domVersionType getVersion() const { return attrVersion; } + /** + * Sets the version attribute. + * @param atVersion The new value for the version attribute. + */ + void setVersion( domVersionType atVersion ) { attrVersion = atVersion; + _validAttributeArray[1] = true; } + + /** + * Gets the xml_base attribute. + * @return Returns a xsAnyURI reference of the xml_base attribute. + */ + xsAnyURI &getXml_base() { return attrXml_base; } + /** + * Gets the xml_base attribute. + * @return Returns a constant xsAnyURI reference of the xml_base attribute. + */ + const xsAnyURI &getXml_base() const { return attrXml_base; } + /** + * Sets the xml_base attribute. + * @param atXml_base The new value for the xml_base attribute. + */ + void setXml_base( const xsAnyURI &atXml_base ) { attrXml_base = atXml_base; + _validAttributeArray[2] = true; } + + /** + * Gets the asset element. + * @return a daeSmartRef to the asset element. + */ + const domAssetRef getAsset() const { return elemAsset; } + /** + * Gets the library_animations element array. + * @return Returns a reference to the array of library_animations elements. + */ + domLibrary_animations_Array &getLibrary_animations_array() { return elemLibrary_animations_array; } + /** + * Gets the library_animations element array. + * @return Returns a constant reference to the array of library_animations elements. + */ + const domLibrary_animations_Array &getLibrary_animations_array() const { return elemLibrary_animations_array; } + /** + * Gets the library_animation_clips element array. + * @return Returns a reference to the array of library_animation_clips elements. + */ + domLibrary_animation_clips_Array &getLibrary_animation_clips_array() { return elemLibrary_animation_clips_array; } + /** + * Gets the library_animation_clips element array. + * @return Returns a constant reference to the array of library_animation_clips elements. + */ + const domLibrary_animation_clips_Array &getLibrary_animation_clips_array() const { return elemLibrary_animation_clips_array; } + /** + * Gets the library_cameras element array. + * @return Returns a reference to the array of library_cameras elements. + */ + domLibrary_cameras_Array &getLibrary_cameras_array() { return elemLibrary_cameras_array; } + /** + * Gets the library_cameras element array. + * @return Returns a constant reference to the array of library_cameras elements. + */ + const domLibrary_cameras_Array &getLibrary_cameras_array() const { return elemLibrary_cameras_array; } + /** + * Gets the library_controllers element array. + * @return Returns a reference to the array of library_controllers elements. + */ + domLibrary_controllers_Array &getLibrary_controllers_array() { return elemLibrary_controllers_array; } + /** + * Gets the library_controllers element array. + * @return Returns a constant reference to the array of library_controllers elements. + */ + const domLibrary_controllers_Array &getLibrary_controllers_array() const { return elemLibrary_controllers_array; } + /** + * Gets the library_geometries element array. + * @return Returns a reference to the array of library_geometries elements. + */ + domLibrary_geometries_Array &getLibrary_geometries_array() { return elemLibrary_geometries_array; } + /** + * Gets the library_geometries element array. + * @return Returns a constant reference to the array of library_geometries elements. + */ + const domLibrary_geometries_Array &getLibrary_geometries_array() const { return elemLibrary_geometries_array; } + /** + * Gets the library_effects element array. + * @return Returns a reference to the array of library_effects elements. + */ + domLibrary_effects_Array &getLibrary_effects_array() { return elemLibrary_effects_array; } + /** + * Gets the library_effects element array. + * @return Returns a constant reference to the array of library_effects elements. + */ + const domLibrary_effects_Array &getLibrary_effects_array() const { return elemLibrary_effects_array; } + /** + * Gets the library_force_fields element array. + * @return Returns a reference to the array of library_force_fields elements. + */ + domLibrary_force_fields_Array &getLibrary_force_fields_array() { return elemLibrary_force_fields_array; } + /** + * Gets the library_force_fields element array. + * @return Returns a constant reference to the array of library_force_fields elements. + */ + const domLibrary_force_fields_Array &getLibrary_force_fields_array() const { return elemLibrary_force_fields_array; } + /** + * Gets the library_images element array. + * @return Returns a reference to the array of library_images elements. + */ + domLibrary_images_Array &getLibrary_images_array() { return elemLibrary_images_array; } + /** + * Gets the library_images element array. + * @return Returns a constant reference to the array of library_images elements. + */ + const domLibrary_images_Array &getLibrary_images_array() const { return elemLibrary_images_array; } + /** + * Gets the library_lights element array. + * @return Returns a reference to the array of library_lights elements. + */ + domLibrary_lights_Array &getLibrary_lights_array() { return elemLibrary_lights_array; } + /** + * Gets the library_lights element array. + * @return Returns a constant reference to the array of library_lights elements. + */ + const domLibrary_lights_Array &getLibrary_lights_array() const { return elemLibrary_lights_array; } + /** + * Gets the library_materials element array. + * @return Returns a reference to the array of library_materials elements. + */ + domLibrary_materials_Array &getLibrary_materials_array() { return elemLibrary_materials_array; } + /** + * Gets the library_materials element array. + * @return Returns a constant reference to the array of library_materials elements. + */ + const domLibrary_materials_Array &getLibrary_materials_array() const { return elemLibrary_materials_array; } + /** + * Gets the library_nodes element array. + * @return Returns a reference to the array of library_nodes elements. + */ + domLibrary_nodes_Array &getLibrary_nodes_array() { return elemLibrary_nodes_array; } + /** + * Gets the library_nodes element array. + * @return Returns a constant reference to the array of library_nodes elements. + */ + const domLibrary_nodes_Array &getLibrary_nodes_array() const { return elemLibrary_nodes_array; } + /** + * Gets the library_physics_materials element array. + * @return Returns a reference to the array of library_physics_materials elements. + */ + domLibrary_physics_materials_Array &getLibrary_physics_materials_array() { return elemLibrary_physics_materials_array; } + /** + * Gets the library_physics_materials element array. + * @return Returns a constant reference to the array of library_physics_materials elements. + */ + const domLibrary_physics_materials_Array &getLibrary_physics_materials_array() const { return elemLibrary_physics_materials_array; } + /** + * Gets the library_physics_models element array. + * @return Returns a reference to the array of library_physics_models elements. + */ + domLibrary_physics_models_Array &getLibrary_physics_models_array() { return elemLibrary_physics_models_array; } + /** + * Gets the library_physics_models element array. + * @return Returns a constant reference to the array of library_physics_models elements. + */ + const domLibrary_physics_models_Array &getLibrary_physics_models_array() const { return elemLibrary_physics_models_array; } + /** + * Gets the library_physics_scenes element array. + * @return Returns a reference to the array of library_physics_scenes elements. + */ + domLibrary_physics_scenes_Array &getLibrary_physics_scenes_array() { return elemLibrary_physics_scenes_array; } + /** + * Gets the library_physics_scenes element array. + * @return Returns a constant reference to the array of library_physics_scenes elements. + */ + const domLibrary_physics_scenes_Array &getLibrary_physics_scenes_array() const { return elemLibrary_physics_scenes_array; } + /** + * Gets the library_visual_scenes element array. + * @return Returns a reference to the array of library_visual_scenes elements. + */ + domLibrary_visual_scenes_Array &getLibrary_visual_scenes_array() { return elemLibrary_visual_scenes_array; } + /** + * Gets the library_visual_scenes element array. + * @return Returns a constant reference to the array of library_visual_scenes elements. + */ + const domLibrary_visual_scenes_Array &getLibrary_visual_scenes_array() const { return elemLibrary_visual_scenes_array; } + /** + * Gets the scene element. + * @return a daeSmartRef to the scene element. + */ + const domSceneRef getScene() const { return elemScene; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } + /** + * Gets the _contents array. + * @return Returns a reference to the _contents element array. + */ + daeElementRefArray &getContents() { return _contents; } + /** + * Gets the _contents array. + * @return Returns a constant reference to the _contents element array. + */ + const daeElementRefArray &getContents() const { return _contents; } + +protected: + /** + * Constructor + */ + domCOLLADA() : attrVersion(), attrXml_base(), elemAsset(), elemLibrary_animations_array(), elemLibrary_animation_clips_array(), elemLibrary_cameras_array(), elemLibrary_controllers_array(), elemLibrary_geometries_array(), elemLibrary_effects_array(), elemLibrary_force_fields_array(), elemLibrary_images_array(), elemLibrary_lights_array(), elemLibrary_materials_array(), elemLibrary_nodes_array(), elemLibrary_physics_materials_array(), elemLibrary_physics_models_array(), elemLibrary_physics_scenes_array(), elemLibrary_visual_scenes_array(), elemScene(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domCOLLADA() {} + /** + * Copy Constructor + */ + domCOLLADA( const domCOLLADA &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domCOLLADA &operator=( const domCOLLADA &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCamera.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCamera.h new file mode 100644 index 00000000..a61681be --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCamera.h @@ -0,0 +1,694 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domCamera_h__ +#define __domCamera_h__ + +#include +#include + +#include +#include +#include +#include + +/** + * The camera element declares a view into the scene hierarchy or scene graph. + * The camera contains elements that describe the camera’s optics and imager. + */ +class domCamera : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::CAMERA; } +public: + class domOptics; + + typedef daeSmartRef domOpticsRef; + typedef daeTArray domOptics_Array; + +/** + * Optics represents the apparatus on a camera that projects the image onto + * the image sensor. + */ + class domOptics : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::OPTICS; } + public: + class domTechnique_common; + + typedef daeSmartRef domTechnique_commonRef; + typedef daeTArray domTechnique_common_Array; + +/** + * The technique_common element specifies the optics information for the common + * profile which all COLLADA implementations need to support. + */ + class domTechnique_common : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::TECHNIQUE_COMMON; } + public: + class domOrthographic; + + typedef daeSmartRef domOrthographicRef; + typedef daeTArray domOrthographic_Array; + +/** + * The orthographic element describes the field of view of an orthographic + * camera. + */ + class domOrthographic : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::ORTHOGRAPHIC; } + + protected: // Elements +/** + * The xmag element contains a floating point number describing the horizontal + * magnification of the view. @see domXmag + */ + domTargetableFloatRef elemXmag; +/** + * The ymag element contains a floating point number describing the vertical + * magnification of the view. It can also have a sid. @see domYmag + */ + domTargetableFloatRef elemYmag; +/** + * The aspect_ratio element contains a floating point number describing the + * aspect ratio of the field of view. If the aspect_ratio element is not + * present the aspect ratio is to be calculated from the xmag or ymag elements + * and the current viewport. @see domAspect_ratio + */ + domTargetableFloatRef elemAspect_ratio; +/** + * The znear element contains a floating point number that describes the distance + * to the near clipping plane. The znear element must occur exactly once. + * @see domZnear + */ + domTargetableFloatRef elemZnear; +/** + * The zfar element contains a floating point number that describes the distance + * to the far clipping plane. The zfar element must occur exactly once. @see + * domZfar + */ + domTargetableFloatRef elemZfar; + /** + * Used to preserve order in elements that do not specify strict sequencing of sub-elements. + */ + daeElementRefArray _contents; + /** + * Used to preserve order in elements that have a complex content model. + */ + daeUIntArray _contentsOrder; + + + public: //Accessors and Mutators + /** + * Gets the xmag element. + * @return a daeSmartRef to the xmag element. + */ + const domTargetableFloatRef getXmag() const { return elemXmag; } + /** + * Gets the ymag element. + * @return a daeSmartRef to the ymag element. + */ + const domTargetableFloatRef getYmag() const { return elemYmag; } + /** + * Gets the aspect_ratio element. + * @return a daeSmartRef to the aspect_ratio element. + */ + const domTargetableFloatRef getAspect_ratio() const { return elemAspect_ratio; } + /** + * Gets the znear element. + * @return a daeSmartRef to the znear element. + */ + const domTargetableFloatRef getZnear() const { return elemZnear; } + /** + * Gets the zfar element. + * @return a daeSmartRef to the zfar element. + */ + const domTargetableFloatRef getZfar() const { return elemZfar; } + /** + * Gets the _contents array. + * @return Returns a reference to the _contents element array. + */ + daeElementRefArray &getContents() { return _contents; } + /** + * Gets the _contents array. + * @return Returns a constant reference to the _contents element array. + */ + const daeElementRefArray &getContents() const { return _contents; } + + protected: + /** + * Constructor + */ + domOrthographic() : elemXmag(), elemYmag(), elemAspect_ratio(), elemZnear(), elemZfar() {} + /** + * Destructor + */ + virtual ~domOrthographic() {} + /** + * Copy Constructor + */ + domOrthographic( const domOrthographic &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domOrthographic &operator=( const domOrthographic &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domPerspective; + + typedef daeSmartRef domPerspectiveRef; + typedef daeTArray domPerspective_Array; + +/** + * The perspective element describes the optics of a perspective camera. + */ + class domPerspective : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::PERSPECTIVE; } + + protected: // Elements +/** + * The xfov element contains a floating point number describing the horizontal + * field of view in degrees. @see domXfov + */ + domTargetableFloatRef elemXfov; +/** + * The yfov element contains a floating point number describing the verticle + * field of view in degrees. @see domYfov + */ + domTargetableFloatRef elemYfov; +/** + * The aspect_ratio element contains a floating point number describing the + * aspect ratio of the field of view. If the aspect_ratio element is not + * present the aspect ratio is to be calculated from the xfov or yfov elements + * and the current viewport. @see domAspect_ratio + */ + domTargetableFloatRef elemAspect_ratio; +/** + * The znear element contains a floating point number that describes the distance + * to the near clipping plane. The znear element must occur exactly once. + * @see domZnear + */ + domTargetableFloatRef elemZnear; +/** + * The zfar element contains a floating point number that describes the distance + * to the far clipping plane. The zfar element must occur exactly once. @see + * domZfar + */ + domTargetableFloatRef elemZfar; + /** + * Used to preserve order in elements that do not specify strict sequencing of sub-elements. + */ + daeElementRefArray _contents; + /** + * Used to preserve order in elements that have a complex content model. + */ + daeUIntArray _contentsOrder; + + + public: //Accessors and Mutators + /** + * Gets the xfov element. + * @return a daeSmartRef to the xfov element. + */ + const domTargetableFloatRef getXfov() const { return elemXfov; } + /** + * Gets the yfov element. + * @return a daeSmartRef to the yfov element. + */ + const domTargetableFloatRef getYfov() const { return elemYfov; } + /** + * Gets the aspect_ratio element. + * @return a daeSmartRef to the aspect_ratio element. + */ + const domTargetableFloatRef getAspect_ratio() const { return elemAspect_ratio; } + /** + * Gets the znear element. + * @return a daeSmartRef to the znear element. + */ + const domTargetableFloatRef getZnear() const { return elemZnear; } + /** + * Gets the zfar element. + * @return a daeSmartRef to the zfar element. + */ + const domTargetableFloatRef getZfar() const { return elemZfar; } + /** + * Gets the _contents array. + * @return Returns a reference to the _contents element array. + */ + daeElementRefArray &getContents() { return _contents; } + /** + * Gets the _contents array. + * @return Returns a constant reference to the _contents element array. + */ + const daeElementRefArray &getContents() const { return _contents; } + + protected: + /** + * Constructor + */ + domPerspective() : elemXfov(), elemYfov(), elemAspect_ratio(), elemZnear(), elemZfar() {} + /** + * Destructor + */ + virtual ~domPerspective() {} + /** + * Copy Constructor + */ + domPerspective( const domPerspective &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domPerspective &operator=( const domPerspective &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + + + protected: // Elements +/** + * The orthographic element describes the field of view of an orthographic + * camera. @see domOrthographic + */ + domOrthographicRef elemOrthographic; +/** + * The perspective element describes the optics of a perspective camera. @see + * domPerspective + */ + domPerspectiveRef elemPerspective; + /** + * Used to preserve order in elements that do not specify strict sequencing of sub-elements. + */ + daeElementRefArray _contents; + /** + * Used to preserve order in elements that have a complex content model. + */ + daeUIntArray _contentsOrder; + + + public: //Accessors and Mutators + /** + * Gets the orthographic element. + * @return a daeSmartRef to the orthographic element. + */ + const domOrthographicRef getOrthographic() const { return elemOrthographic; } + /** + * Gets the perspective element. + * @return a daeSmartRef to the perspective element. + */ + const domPerspectiveRef getPerspective() const { return elemPerspective; } + /** + * Gets the _contents array. + * @return Returns a reference to the _contents element array. + */ + daeElementRefArray &getContents() { return _contents; } + /** + * Gets the _contents array. + * @return Returns a constant reference to the _contents element array. + */ + const daeElementRefArray &getContents() const { return _contents; } + + protected: + /** + * Constructor + */ + domTechnique_common() : elemOrthographic(), elemPerspective() {} + /** + * Destructor + */ + virtual ~domTechnique_common() {} + /** + * Copy Constructor + */ + domTechnique_common( const domTechnique_common &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domTechnique_common &operator=( const domTechnique_common &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + + + protected: // Elements +/** + * The technique_common element specifies the optics information for the common + * profile which all COLLADA implementations need to support. @see domTechnique_common + */ + domTechnique_commonRef elemTechnique_common; +/** + * This element may contain any number of non-common profile techniques. + * @see domTechnique + */ + domTechnique_Array elemTechnique_array; +/** + * The extra element may appear any number of times. @see domExtra + */ + domExtra_Array elemExtra_array; + + public: //Accessors and Mutators + /** + * Gets the technique_common element. + * @return a daeSmartRef to the technique_common element. + */ + const domTechnique_commonRef getTechnique_common() const { return elemTechnique_common; } + /** + * Gets the technique element array. + * @return Returns a reference to the array of technique elements. + */ + domTechnique_Array &getTechnique_array() { return elemTechnique_array; } + /** + * Gets the technique element array. + * @return Returns a constant reference to the array of technique elements. + */ + const domTechnique_Array &getTechnique_array() const { return elemTechnique_array; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } + protected: + /** + * Constructor + */ + domOptics() : elemTechnique_common(), elemTechnique_array(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domOptics() {} + /** + * Copy Constructor + */ + domOptics( const domOptics &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domOptics &operator=( const domOptics &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domImager; + + typedef daeSmartRef domImagerRef; + typedef daeTArray domImager_Array; + +/** + * Imagers represent the image sensor of a camera (for example film or CCD). + */ + class domImager : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::IMAGER; } + + protected: // Elements +/** + * This element may contain any number of non-common profile techniques. + * There is no common technique for imager. @see domTechnique + */ + domTechnique_Array elemTechnique_array; +/** + * The extra element may appear any number of times. @see domExtra + */ + domExtra_Array elemExtra_array; + + public: //Accessors and Mutators + /** + * Gets the technique element array. + * @return Returns a reference to the array of technique elements. + */ + domTechnique_Array &getTechnique_array() { return elemTechnique_array; } + /** + * Gets the technique element array. + * @return Returns a constant reference to the array of technique elements. + */ + const domTechnique_Array &getTechnique_array() const { return elemTechnique_array; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } + protected: + /** + * Constructor + */ + domImager() : elemTechnique_array(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domImager() {} + /** + * Copy Constructor + */ + domImager( const domImager &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domImager &operator=( const domImager &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + +protected: // Attributes +/** + * The id attribute is a text string containing the unique identifier of + * this element. This value must be unique within the instance document. + * Optional attribute. + */ + xsID attrId; +/** + * The name attribute is the text string name of this element. Optional attribute. + */ + xsNCName attrName; + +protected: // Elements +/** + * The camera element may contain an asset element. @see domAsset + */ + domAssetRef elemAsset; +/** + * Optics represents the apparatus on a camera that projects the image onto + * the image sensor. @see domOptics + */ + domOpticsRef elemOptics; +/** + * Imagers represent the image sensor of a camera (for example film or CCD). + * @see domImager + */ + domImagerRef elemImager; +/** + * The extra element may appear any number of times. @see domExtra + */ + domExtra_Array elemExtra_array; + +public: //Accessors and Mutators + /** + * Gets the id attribute. + * @return Returns a xsID of the id attribute. + */ + xsID getId() const { return attrId; } + /** + * Sets the id attribute. + * @param atId The new value for the id attribute. + */ + void setId( xsID atId ) { *(daeStringRef*)&attrId = atId; + _validAttributeArray[0] = true; } + + /** + * Gets the name attribute. + * @return Returns a xsNCName of the name attribute. + */ + xsNCName getName() const { return attrName; } + /** + * Sets the name attribute. + * @param atName The new value for the name attribute. + */ + void setName( xsNCName atName ) { *(daeStringRef*)&attrName = atName; + _validAttributeArray[1] = true; } + + /** + * Gets the asset element. + * @return a daeSmartRef to the asset element. + */ + const domAssetRef getAsset() const { return elemAsset; } + /** + * Gets the optics element. + * @return a daeSmartRef to the optics element. + */ + const domOpticsRef getOptics() const { return elemOptics; } + /** + * Gets the imager element. + * @return a daeSmartRef to the imager element. + */ + const domImagerRef getImager() const { return elemImager; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } +protected: + /** + * Constructor + */ + domCamera() : attrId(), attrName(), elemAsset(), elemOptics(), elemImager(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domCamera() {} + /** + * Copy Constructor + */ + domCamera( const domCamera &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domCamera &operator=( const domCamera &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCapsule.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCapsule.h new file mode 100644 index 00000000..9b1efeb7 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCapsule.h @@ -0,0 +1,254 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domCapsule_h__ +#define __domCapsule_h__ + +#include +#include + +#include + +/** + * A capsule primitive that is centered on and aligned with the local Y axis. + */ +class domCapsule : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::CAPSULE; } +public: + class domHeight; + + typedef daeSmartRef domHeightRef; + typedef daeTArray domHeight_Array; + +/** + * A float value that represents the length of the line segment connecting + * the centers of the capping hemispheres. + */ + class domHeight : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::HEIGHT; } + + protected: // Value + /** + * The domFloat value of the text data of this element. + */ + domFloat _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a domFloat of the value. + */ + domFloat getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( domFloat val ) { _value = val; } + + protected: + /** + * Constructor + */ + domHeight() : _value() {} + /** + * Destructor + */ + virtual ~domHeight() {} + /** + * Copy Constructor + */ + domHeight( const domHeight &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domHeight &operator=( const domHeight &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domRadius; + + typedef daeSmartRef domRadiusRef; + typedef daeTArray domRadius_Array; + +/** + * Two float values that represent the radii of the capsule (it may be elliptical) + */ + class domRadius : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::RADIUS; } + + protected: // Value + /** + * The domFloat2 value of the text data of this element. + */ + domFloat2 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domFloat2 reference of the _value array. + */ + domFloat2 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domFloat2 reference of the _value array. + */ + const domFloat2 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domFloat2 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domRadius() : _value() {} + /** + * Destructor + */ + virtual ~domRadius() {} + /** + * Copy Constructor + */ + domRadius( const domRadius &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domRadius &operator=( const domRadius &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + + +protected: // Elements +/** + * A float value that represents the length of the line segment connecting + * the centers of the capping hemispheres. @see domHeight + */ + domHeightRef elemHeight; +/** + * Two float values that represent the radii of the capsule (it may be elliptical) + * @see domRadius + */ + domRadiusRef elemRadius; +/** + * The extra element may appear any number of times. @see domExtra + */ + domExtra_Array elemExtra_array; + +public: //Accessors and Mutators + /** + * Gets the height element. + * @return a daeSmartRef to the height element. + */ + const domHeightRef getHeight() const { return elemHeight; } + /** + * Gets the radius element. + * @return a daeSmartRef to the radius element. + */ + const domRadiusRef getRadius() const { return elemRadius; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } +protected: + /** + * Constructor + */ + domCapsule() : elemHeight(), elemRadius(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domCapsule() {} + /** + * Copy Constructor + */ + domCapsule( const domCapsule &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domCapsule &operator=( const domCapsule &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCg_connect_param.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCg_connect_param.h new file mode 100644 index 00000000..7165067f --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCg_connect_param.h @@ -0,0 +1,121 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domCg_connect_param_h__ +#define __domCg_connect_param_h__ + +#include +#include + + +/** + * Creates a symbolic connection between two previously defined parameters. + */ +class domCg_connect_param_complexType +{ +protected: // Attribute + domCg_identifier attrRef; + + +public: //Accessors and Mutators + /** + * Gets the ref attribute. + * @return Returns a domCg_identifier of the ref attribute. + */ + domCg_identifier getRef() const { return attrRef; } + /** + * Sets the ref attribute. + * @param atRef The new value for the ref attribute. + */ + void setRef( domCg_identifier atRef ) { attrRef = atRef; } + +protected: + /** + * Constructor + */ + domCg_connect_param_complexType() : attrRef() {} + /** + * Destructor + */ + virtual ~domCg_connect_param_complexType() {} + /** + * Copy Constructor + */ + domCg_connect_param_complexType( const domCg_connect_param_complexType &cpy ) { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domCg_connect_param_complexType &operator=( const domCg_connect_param_complexType &cpy ) { (void)cpy; return *this; } +}; + +/** + * An element of type domCg_connect_param_complexType. + */ +class domCg_connect_param : public daeElement, public domCg_connect_param_complexType +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::CG_CONNECT_PARAM; } + +public: //Accessors and Mutators + /** + * Gets the ref attribute. + * @return Returns a domCg_identifier of the ref attribute. + */ + domCg_identifier getRef() const { return attrRef; } + /** + * Sets the ref attribute. + * @param atRef The new value for the ref attribute. + */ + void setRef( domCg_identifier atRef ) { attrRef = atRef; + _validAttributeArray[0] = true; } + +protected: + /** + * Constructor + */ + domCg_connect_param() {} + /** + * Destructor + */ + virtual ~domCg_connect_param() {} + /** + * Copy Constructor + */ + domCg_connect_param( const domCg_connect_param &cpy ) : daeElement(), domCg_connect_param_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domCg_connect_param &operator=( const domCg_connect_param &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCg_newarray_type.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCg_newarray_type.h new file mode 100644 index 00000000..2fddb73b --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCg_newarray_type.h @@ -0,0 +1,200 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domCg_newarray_type_h__ +#define __domCg_newarray_type_h__ + +#include +#include + +#include +#include +#include +#include + +/** + * Creates a parameter of a one-dimensional array type. + */ +class domCg_newarray_type_complexType +{ +protected: // Attribute +/** + * The length attribute specifies the length of the array. + */ + xsPositiveInteger attrLength; + +protected: // Elements + domCg_param_type_Array elemCg_param_type_array; +/** + * Nested array elements allow you to create multidemensional arrays. @see + * domArray + */ + domCg_newarray_type_Array elemArray_array; +/** + * The usertype element allows you to create arrays of usertypes. @see domUsertype + */ + domCg_setuser_type_Array elemUsertype_array; + domCg_connect_param_Array elemConnect_param_array; + /** + * Used to preserve order in elements that do not specify strict sequencing of sub-elements. + */ + daeElementRefArray _contents; + /** + * Used to preserve order in elements that have a complex content model. + */ + daeUIntArray _contentsOrder; + + +public: //Accessors and Mutators + /** + * Gets the length attribute. + * @return Returns a xsPositiveInteger of the length attribute. + */ + xsPositiveInteger getLength() const { return attrLength; } + /** + * Sets the length attribute. + * @param atLength The new value for the length attribute. + */ + void setLength( xsPositiveInteger atLength ) { attrLength = atLength; } + + /** + * Gets the cg_param_type element array. + * @return Returns a reference to the array of cg_param_type elements. + */ + domCg_param_type_Array &getCg_param_type_array() { return elemCg_param_type_array; } + /** + * Gets the cg_param_type element array. + * @return Returns a constant reference to the array of cg_param_type elements. + */ + const domCg_param_type_Array &getCg_param_type_array() const { return elemCg_param_type_array; } + /** + * Gets the array element array. + * @return Returns a reference to the array of array elements. + */ + domCg_newarray_type_Array &getArray_array() { return elemArray_array; } + /** + * Gets the array element array. + * @return Returns a constant reference to the array of array elements. + */ + const domCg_newarray_type_Array &getArray_array() const { return elemArray_array; } + /** + * Gets the usertype element array. + * @return Returns a reference to the array of usertype elements. + */ + domCg_setuser_type_Array &getUsertype_array() { return elemUsertype_array; } + /** + * Gets the usertype element array. + * @return Returns a constant reference to the array of usertype elements. + */ + const domCg_setuser_type_Array &getUsertype_array() const { return elemUsertype_array; } + /** + * Gets the connect_param element array. + * @return Returns a reference to the array of connect_param elements. + */ + domCg_connect_param_Array &getConnect_param_array() { return elemConnect_param_array; } + /** + * Gets the connect_param element array. + * @return Returns a constant reference to the array of connect_param elements. + */ + const domCg_connect_param_Array &getConnect_param_array() const { return elemConnect_param_array; } + /** + * Gets the _contents array. + * @return Returns a reference to the _contents element array. + */ + daeElementRefArray &getContents() { return _contents; } + /** + * Gets the _contents array. + * @return Returns a constant reference to the _contents element array. + */ + const daeElementRefArray &getContents() const { return _contents; } + +protected: + /** + * Constructor + */ + domCg_newarray_type_complexType() : attrLength(), elemCg_param_type_array(), elemArray_array(), elemUsertype_array(), elemConnect_param_array() {} + /** + * Destructor + */ + virtual ~domCg_newarray_type_complexType() {} + /** + * Copy Constructor + */ + domCg_newarray_type_complexType( const domCg_newarray_type_complexType &cpy ) { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domCg_newarray_type_complexType &operator=( const domCg_newarray_type_complexType &cpy ) { (void)cpy; return *this; } +}; + +/** + * An element of type domCg_newarray_type_complexType. + */ +class domCg_newarray_type : public daeElement, public domCg_newarray_type_complexType +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::CG_NEWARRAY_TYPE; } + +public: //Accessors and Mutators + /** + * Gets the length attribute. + * @return Returns a xsPositiveInteger of the length attribute. + */ + xsPositiveInteger getLength() const { return attrLength; } + /** + * Sets the length attribute. + * @param atLength The new value for the length attribute. + */ + void setLength( xsPositiveInteger atLength ) { attrLength = atLength; + _validAttributeArray[0] = true; } + +protected: + /** + * Constructor + */ + domCg_newarray_type() {} + /** + * Destructor + */ + virtual ~domCg_newarray_type() {} + /** + * Copy Constructor + */ + domCg_newarray_type( const domCg_newarray_type &cpy ) : daeElement(), domCg_newarray_type_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domCg_newarray_type &operator=( const domCg_newarray_type &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCg_newparam.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCg_newparam.h new file mode 100644 index 00000000..08f35239 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCg_newparam.h @@ -0,0 +1,342 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domCg_newparam_h__ +#define __domCg_newparam_h__ + +#include +#include + +#include +#include +#include +#include + +/** + * Create a new, named param object in the CG Runtime, assign it a type, an + * initial value, and additional attributes at declaration time. + */ +class domCg_newparam_complexType +{ +public: + class domSemantic; + + typedef daeSmartRef domSemanticRef; + typedef daeTArray domSemantic_Array; + +/** + * The semantic element allows you to specify a semantic for this new param. + */ + class domSemantic : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::SEMANTIC; } + + protected: // Value + /** + * The xsNCName value of the text data of this element. + */ + xsNCName _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return Returns a xsNCName of the value. + */ + xsNCName getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( xsNCName val ) { *(daeStringRef*)&_value = val; } + + protected: + /** + * Constructor + */ + domSemantic() : _value() {} + /** + * Destructor + */ + virtual ~domSemantic() {} + /** + * Copy Constructor + */ + domSemantic( const domSemantic &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domSemantic &operator=( const domSemantic &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domModifier; + + typedef daeSmartRef domModifierRef; + typedef daeTArray domModifier_Array; + +/** + * The modifier element allows you to specify a modifier for this new param. + */ + class domModifier : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::MODIFIER; } + + protected: // Value + /** + * The domFx_modifier_enum_common value of the text data of this element. + */ + domFx_modifier_enum_common _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a domFx_modifier_enum_common of the value. + */ + domFx_modifier_enum_common getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( domFx_modifier_enum_common val ) { _value = val; } + + protected: + /** + * Constructor + */ + domModifier() : _value() {} + /** + * Destructor + */ + virtual ~domModifier() {} + /** + * Copy Constructor + */ + domModifier( const domModifier &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domModifier &operator=( const domModifier &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + +protected: // Attribute + domCg_identifier attrSid; + +protected: // Elements +/** + * The annotate element allows you to specify an annotation for this new param. + * @see domAnnotate + */ + domFx_annotate_common_Array elemAnnotate_array; +/** + * The semantic element allows you to specify a semantic for this new param. + * @see domSemantic + */ + domSemanticRef elemSemantic; +/** + * The modifier element allows you to specify a modifier for this new param. + * @see domModifier + */ + domModifierRef elemModifier; + domCg_param_typeRef elemCg_param_type; + domCg_setuser_typeRef elemUsertype; + domCg_newarray_typeRef elemArray; + /** + * Used to preserve order in elements that do not specify strict sequencing of sub-elements. + */ + daeElementRefArray _contents; + /** + * Used to preserve order in elements that have a complex content model. + */ + daeUIntArray _contentsOrder; + + +public: //Accessors and Mutators + /** + * Gets the sid attribute. + * @return Returns a domCg_identifier of the sid attribute. + */ + domCg_identifier getSid() const { return attrSid; } + /** + * Sets the sid attribute. + * @param atSid The new value for the sid attribute. + */ + void setSid( domCg_identifier atSid ) { attrSid = atSid; } + + /** + * Gets the annotate element array. + * @return Returns a reference to the array of annotate elements. + */ + domFx_annotate_common_Array &getAnnotate_array() { return elemAnnotate_array; } + /** + * Gets the annotate element array. + * @return Returns a constant reference to the array of annotate elements. + */ + const domFx_annotate_common_Array &getAnnotate_array() const { return elemAnnotate_array; } + /** + * Gets the semantic element. + * @return a daeSmartRef to the semantic element. + */ + const domSemanticRef getSemantic() const { return elemSemantic; } + /** + * Gets the modifier element. + * @return a daeSmartRef to the modifier element. + */ + const domModifierRef getModifier() const { return elemModifier; } + /** + * Gets the cg_param_type element. + * @return a daeSmartRef to the cg_param_type element. + */ + const domCg_param_typeRef getCg_param_type() const { return elemCg_param_type; } + /** + * Gets the usertype element. + * @return a daeSmartRef to the usertype element. + */ + const domCg_setuser_typeRef getUsertype() const { return elemUsertype; } + /** + * Gets the array element. + * @return a daeSmartRef to the array element. + */ + const domCg_newarray_typeRef getArray() const { return elemArray; } + /** + * Gets the _contents array. + * @return Returns a reference to the _contents element array. + */ + daeElementRefArray &getContents() { return _contents; } + /** + * Gets the _contents array. + * @return Returns a constant reference to the _contents element array. + */ + const daeElementRefArray &getContents() const { return _contents; } + +protected: + /** + * Constructor + */ + domCg_newparam_complexType() : attrSid(), elemAnnotate_array(), elemSemantic(), elemModifier(), elemCg_param_type(), elemUsertype(), elemArray() {} + /** + * Destructor + */ + virtual ~domCg_newparam_complexType() {} + /** + * Copy Constructor + */ + domCg_newparam_complexType( const domCg_newparam_complexType &cpy ) { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domCg_newparam_complexType &operator=( const domCg_newparam_complexType &cpy ) { (void)cpy; return *this; } +}; + +/** + * An element of type domCg_newparam_complexType. + */ +class domCg_newparam : public daeElement, public domCg_newparam_complexType +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::CG_NEWPARAM; } + +public: //Accessors and Mutators + /** + * Gets the sid attribute. + * @return Returns a domCg_identifier of the sid attribute. + */ + domCg_identifier getSid() const { return attrSid; } + /** + * Sets the sid attribute. + * @param atSid The new value for the sid attribute. + */ + void setSid( domCg_identifier atSid ) { attrSid = atSid; + _validAttributeArray[0] = true; } + +protected: + /** + * Constructor + */ + domCg_newparam() {} + /** + * Destructor + */ + virtual ~domCg_newparam() {} + /** + * Copy Constructor + */ + domCg_newparam( const domCg_newparam &cpy ) : daeElement(), domCg_newparam_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domCg_newparam &operator=( const domCg_newparam &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCg_param_type.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCg_param_type.h new file mode 100644 index 00000000..372daf65 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCg_param_type.h @@ -0,0 +1,8428 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domCg_param_type_h__ +#define __domCg_param_type_h__ + +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +/** + * A group that specifies the allowable types for CG profile parameters. + */ +class domCg_param_type : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::CG_PARAM_TYPE; } +public: + class domBool; + + typedef daeSmartRef domBoolRef; + typedef daeTArray domBool_Array; + + class domBool : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::BOOL; } + + protected: // Value + /** + * The domCg_bool value of the text data of this element. + */ + domCg_bool _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a domCg_bool of the value. + */ + domCg_bool getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( domCg_bool val ) { _value = val; } + + protected: + /** + * Constructor + */ + domBool() : _value() {} + /** + * Destructor + */ + virtual ~domBool() {} + /** + * Copy Constructor + */ + domBool( const domBool &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domBool &operator=( const domBool &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domBool1; + + typedef daeSmartRef domBool1Ref; + typedef daeTArray domBool1_Array; + + class domBool1 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::BOOL1; } + + protected: // Value + /** + * The domCg_bool1 value of the text data of this element. + */ + domCg_bool1 _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a domCg_bool1 of the value. + */ + domCg_bool1 getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( domCg_bool1 val ) { _value = val; } + + protected: + /** + * Constructor + */ + domBool1() : _value() {} + /** + * Destructor + */ + virtual ~domBool1() {} + /** + * Copy Constructor + */ + domBool1( const domBool1 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domBool1 &operator=( const domBool1 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domBool2; + + typedef daeSmartRef domBool2Ref; + typedef daeTArray domBool2_Array; + + class domBool2 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::BOOL2; } + + protected: // Value + /** + * The domCg_bool2 value of the text data of this element. + */ + domCg_bool2 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_bool2 reference of the _value array. + */ + domCg_bool2 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_bool2 reference of the _value array. + */ + const domCg_bool2 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_bool2 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domBool2() : _value() {} + /** + * Destructor + */ + virtual ~domBool2() {} + /** + * Copy Constructor + */ + domBool2( const domBool2 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domBool2 &operator=( const domBool2 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domBool3; + + typedef daeSmartRef domBool3Ref; + typedef daeTArray domBool3_Array; + + class domBool3 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::BOOL3; } + + protected: // Value + /** + * The domCg_bool3 value of the text data of this element. + */ + domCg_bool3 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_bool3 reference of the _value array. + */ + domCg_bool3 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_bool3 reference of the _value array. + */ + const domCg_bool3 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_bool3 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domBool3() : _value() {} + /** + * Destructor + */ + virtual ~domBool3() {} + /** + * Copy Constructor + */ + domBool3( const domBool3 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domBool3 &operator=( const domBool3 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domBool4; + + typedef daeSmartRef domBool4Ref; + typedef daeTArray domBool4_Array; + + class domBool4 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::BOOL4; } + + protected: // Value + /** + * The domCg_bool4 value of the text data of this element. + */ + domCg_bool4 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_bool4 reference of the _value array. + */ + domCg_bool4 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_bool4 reference of the _value array. + */ + const domCg_bool4 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_bool4 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domBool4() : _value() {} + /** + * Destructor + */ + virtual ~domBool4() {} + /** + * Copy Constructor + */ + domBool4( const domBool4 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domBool4 &operator=( const domBool4 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domBool1x1; + + typedef daeSmartRef domBool1x1Ref; + typedef daeTArray domBool1x1_Array; + + class domBool1x1 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::BOOL1X1; } + + protected: // Value + /** + * The domCg_bool1x1 value of the text data of this element. + */ + domCg_bool1x1 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_bool1x1 reference of the _value array. + */ + domCg_bool1x1 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_bool1x1 reference of the _value array. + */ + const domCg_bool1x1 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_bool1x1 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domBool1x1() : _value() {} + /** + * Destructor + */ + virtual ~domBool1x1() {} + /** + * Copy Constructor + */ + domBool1x1( const domBool1x1 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domBool1x1 &operator=( const domBool1x1 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domBool1x2; + + typedef daeSmartRef domBool1x2Ref; + typedef daeTArray domBool1x2_Array; + + class domBool1x2 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::BOOL1X2; } + + protected: // Value + /** + * The domCg_bool1x2 value of the text data of this element. + */ + domCg_bool1x2 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_bool1x2 reference of the _value array. + */ + domCg_bool1x2 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_bool1x2 reference of the _value array. + */ + const domCg_bool1x2 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_bool1x2 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domBool1x2() : _value() {} + /** + * Destructor + */ + virtual ~domBool1x2() {} + /** + * Copy Constructor + */ + domBool1x2( const domBool1x2 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domBool1x2 &operator=( const domBool1x2 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domBool1x3; + + typedef daeSmartRef domBool1x3Ref; + typedef daeTArray domBool1x3_Array; + + class domBool1x3 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::BOOL1X3; } + + protected: // Value + /** + * The domCg_bool1x3 value of the text data of this element. + */ + domCg_bool1x3 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_bool1x3 reference of the _value array. + */ + domCg_bool1x3 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_bool1x3 reference of the _value array. + */ + const domCg_bool1x3 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_bool1x3 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domBool1x3() : _value() {} + /** + * Destructor + */ + virtual ~domBool1x3() {} + /** + * Copy Constructor + */ + domBool1x3( const domBool1x3 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domBool1x3 &operator=( const domBool1x3 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domBool1x4; + + typedef daeSmartRef domBool1x4Ref; + typedef daeTArray domBool1x4_Array; + + class domBool1x4 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::BOOL1X4; } + + protected: // Value + /** + * The domCg_bool1x4 value of the text data of this element. + */ + domCg_bool1x4 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_bool1x4 reference of the _value array. + */ + domCg_bool1x4 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_bool1x4 reference of the _value array. + */ + const domCg_bool1x4 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_bool1x4 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domBool1x4() : _value() {} + /** + * Destructor + */ + virtual ~domBool1x4() {} + /** + * Copy Constructor + */ + domBool1x4( const domBool1x4 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domBool1x4 &operator=( const domBool1x4 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domBool2x1; + + typedef daeSmartRef domBool2x1Ref; + typedef daeTArray domBool2x1_Array; + + class domBool2x1 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::BOOL2X1; } + + protected: // Value + /** + * The domCg_bool2x1 value of the text data of this element. + */ + domCg_bool2x1 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_bool2x1 reference of the _value array. + */ + domCg_bool2x1 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_bool2x1 reference of the _value array. + */ + const domCg_bool2x1 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_bool2x1 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domBool2x1() : _value() {} + /** + * Destructor + */ + virtual ~domBool2x1() {} + /** + * Copy Constructor + */ + domBool2x1( const domBool2x1 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domBool2x1 &operator=( const domBool2x1 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domBool2x2; + + typedef daeSmartRef domBool2x2Ref; + typedef daeTArray domBool2x2_Array; + + class domBool2x2 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::BOOL2X2; } + + protected: // Value + /** + * The domCg_bool2x2 value of the text data of this element. + */ + domCg_bool2x2 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_bool2x2 reference of the _value array. + */ + domCg_bool2x2 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_bool2x2 reference of the _value array. + */ + const domCg_bool2x2 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_bool2x2 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domBool2x2() : _value() {} + /** + * Destructor + */ + virtual ~domBool2x2() {} + /** + * Copy Constructor + */ + domBool2x2( const domBool2x2 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domBool2x2 &operator=( const domBool2x2 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domBool2x3; + + typedef daeSmartRef domBool2x3Ref; + typedef daeTArray domBool2x3_Array; + + class domBool2x3 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::BOOL2X3; } + + protected: // Value + /** + * The domCg_bool2x3 value of the text data of this element. + */ + domCg_bool2x3 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_bool2x3 reference of the _value array. + */ + domCg_bool2x3 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_bool2x3 reference of the _value array. + */ + const domCg_bool2x3 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_bool2x3 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domBool2x3() : _value() {} + /** + * Destructor + */ + virtual ~domBool2x3() {} + /** + * Copy Constructor + */ + domBool2x3( const domBool2x3 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domBool2x3 &operator=( const domBool2x3 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domBool2x4; + + typedef daeSmartRef domBool2x4Ref; + typedef daeTArray domBool2x4_Array; + + class domBool2x4 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::BOOL2X4; } + + protected: // Value + /** + * The domCg_bool2x4 value of the text data of this element. + */ + domCg_bool2x4 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_bool2x4 reference of the _value array. + */ + domCg_bool2x4 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_bool2x4 reference of the _value array. + */ + const domCg_bool2x4 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_bool2x4 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domBool2x4() : _value() {} + /** + * Destructor + */ + virtual ~domBool2x4() {} + /** + * Copy Constructor + */ + domBool2x4( const domBool2x4 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domBool2x4 &operator=( const domBool2x4 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domBool3x1; + + typedef daeSmartRef domBool3x1Ref; + typedef daeTArray domBool3x1_Array; + + class domBool3x1 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::BOOL3X1; } + + protected: // Value + /** + * The domCg_bool3x1 value of the text data of this element. + */ + domCg_bool3x1 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_bool3x1 reference of the _value array. + */ + domCg_bool3x1 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_bool3x1 reference of the _value array. + */ + const domCg_bool3x1 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_bool3x1 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domBool3x1() : _value() {} + /** + * Destructor + */ + virtual ~domBool3x1() {} + /** + * Copy Constructor + */ + domBool3x1( const domBool3x1 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domBool3x1 &operator=( const domBool3x1 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domBool3x2; + + typedef daeSmartRef domBool3x2Ref; + typedef daeTArray domBool3x2_Array; + + class domBool3x2 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::BOOL3X2; } + + protected: // Value + /** + * The domCg_bool3x2 value of the text data of this element. + */ + domCg_bool3x2 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_bool3x2 reference of the _value array. + */ + domCg_bool3x2 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_bool3x2 reference of the _value array. + */ + const domCg_bool3x2 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_bool3x2 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domBool3x2() : _value() {} + /** + * Destructor + */ + virtual ~domBool3x2() {} + /** + * Copy Constructor + */ + domBool3x2( const domBool3x2 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domBool3x2 &operator=( const domBool3x2 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domBool3x3; + + typedef daeSmartRef domBool3x3Ref; + typedef daeTArray domBool3x3_Array; + + class domBool3x3 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::BOOL3X3; } + + protected: // Value + /** + * The domCg_bool3x3 value of the text data of this element. + */ + domCg_bool3x3 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_bool3x3 reference of the _value array. + */ + domCg_bool3x3 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_bool3x3 reference of the _value array. + */ + const domCg_bool3x3 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_bool3x3 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domBool3x3() : _value() {} + /** + * Destructor + */ + virtual ~domBool3x3() {} + /** + * Copy Constructor + */ + domBool3x3( const domBool3x3 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domBool3x3 &operator=( const domBool3x3 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domBool3x4; + + typedef daeSmartRef domBool3x4Ref; + typedef daeTArray domBool3x4_Array; + + class domBool3x4 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::BOOL3X4; } + + protected: // Value + /** + * The domCg_bool3x4 value of the text data of this element. + */ + domCg_bool3x4 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_bool3x4 reference of the _value array. + */ + domCg_bool3x4 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_bool3x4 reference of the _value array. + */ + const domCg_bool3x4 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_bool3x4 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domBool3x4() : _value() {} + /** + * Destructor + */ + virtual ~domBool3x4() {} + /** + * Copy Constructor + */ + domBool3x4( const domBool3x4 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domBool3x4 &operator=( const domBool3x4 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domBool4x1; + + typedef daeSmartRef domBool4x1Ref; + typedef daeTArray domBool4x1_Array; + + class domBool4x1 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::BOOL4X1; } + + protected: // Value + /** + * The domCg_bool4x1 value of the text data of this element. + */ + domCg_bool4x1 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_bool4x1 reference of the _value array. + */ + domCg_bool4x1 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_bool4x1 reference of the _value array. + */ + const domCg_bool4x1 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_bool4x1 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domBool4x1() : _value() {} + /** + * Destructor + */ + virtual ~domBool4x1() {} + /** + * Copy Constructor + */ + domBool4x1( const domBool4x1 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domBool4x1 &operator=( const domBool4x1 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domBool4x2; + + typedef daeSmartRef domBool4x2Ref; + typedef daeTArray domBool4x2_Array; + + class domBool4x2 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::BOOL4X2; } + + protected: // Value + /** + * The domCg_bool4x2 value of the text data of this element. + */ + domCg_bool4x2 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_bool4x2 reference of the _value array. + */ + domCg_bool4x2 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_bool4x2 reference of the _value array. + */ + const domCg_bool4x2 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_bool4x2 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domBool4x2() : _value() {} + /** + * Destructor + */ + virtual ~domBool4x2() {} + /** + * Copy Constructor + */ + domBool4x2( const domBool4x2 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domBool4x2 &operator=( const domBool4x2 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domBool4x3; + + typedef daeSmartRef domBool4x3Ref; + typedef daeTArray domBool4x3_Array; + + class domBool4x3 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::BOOL4X3; } + + protected: // Value + /** + * The domCg_bool4x3 value of the text data of this element. + */ + domCg_bool4x3 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_bool4x3 reference of the _value array. + */ + domCg_bool4x3 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_bool4x3 reference of the _value array. + */ + const domCg_bool4x3 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_bool4x3 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domBool4x3() : _value() {} + /** + * Destructor + */ + virtual ~domBool4x3() {} + /** + * Copy Constructor + */ + domBool4x3( const domBool4x3 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domBool4x3 &operator=( const domBool4x3 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domBool4x4; + + typedef daeSmartRef domBool4x4Ref; + typedef daeTArray domBool4x4_Array; + + class domBool4x4 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::BOOL4X4; } + + protected: // Value + /** + * The domCg_bool4x4 value of the text data of this element. + */ + domCg_bool4x4 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_bool4x4 reference of the _value array. + */ + domCg_bool4x4 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_bool4x4 reference of the _value array. + */ + const domCg_bool4x4 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_bool4x4 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domBool4x4() : _value() {} + /** + * Destructor + */ + virtual ~domBool4x4() {} + /** + * Copy Constructor + */ + domBool4x4( const domBool4x4 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domBool4x4 &operator=( const domBool4x4 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFloat; + + typedef daeSmartRef domFloatRef; + typedef daeTArray domFloat_Array; + + class domFloat : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FLOAT; } + + protected: // Value + /** + * The domCg_float value of the text data of this element. + */ + domCg_float _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a domCg_float of the value. + */ + domCg_float getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( domCg_float val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFloat() : _value() {} + /** + * Destructor + */ + virtual ~domFloat() {} + /** + * Copy Constructor + */ + domFloat( const domFloat &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFloat &operator=( const domFloat &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFloat1; + + typedef daeSmartRef domFloat1Ref; + typedef daeTArray domFloat1_Array; + + class domFloat1 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FLOAT1; } + + protected: // Value + /** + * The domCg_float1 value of the text data of this element. + */ + domCg_float1 _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a domCg_float1 of the value. + */ + domCg_float1 getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( domCg_float1 val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFloat1() : _value() {} + /** + * Destructor + */ + virtual ~domFloat1() {} + /** + * Copy Constructor + */ + domFloat1( const domFloat1 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFloat1 &operator=( const domFloat1 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFloat2; + + typedef daeSmartRef domFloat2Ref; + typedef daeTArray domFloat2_Array; + + class domFloat2 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FLOAT2; } + + protected: // Value + /** + * The domCg_float2 value of the text data of this element. + */ + domCg_float2 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_float2 reference of the _value array. + */ + domCg_float2 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_float2 reference of the _value array. + */ + const domCg_float2 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_float2 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFloat2() : _value() {} + /** + * Destructor + */ + virtual ~domFloat2() {} + /** + * Copy Constructor + */ + domFloat2( const domFloat2 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFloat2 &operator=( const domFloat2 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFloat3; + + typedef daeSmartRef domFloat3Ref; + typedef daeTArray domFloat3_Array; + + class domFloat3 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FLOAT3; } + + protected: // Value + /** + * The domCg_float3 value of the text data of this element. + */ + domCg_float3 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_float3 reference of the _value array. + */ + domCg_float3 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_float3 reference of the _value array. + */ + const domCg_float3 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_float3 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFloat3() : _value() {} + /** + * Destructor + */ + virtual ~domFloat3() {} + /** + * Copy Constructor + */ + domFloat3( const domFloat3 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFloat3 &operator=( const domFloat3 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFloat4; + + typedef daeSmartRef domFloat4Ref; + typedef daeTArray domFloat4_Array; + + class domFloat4 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FLOAT4; } + + protected: // Value + /** + * The domCg_float4 value of the text data of this element. + */ + domCg_float4 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_float4 reference of the _value array. + */ + domCg_float4 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_float4 reference of the _value array. + */ + const domCg_float4 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_float4 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFloat4() : _value() {} + /** + * Destructor + */ + virtual ~domFloat4() {} + /** + * Copy Constructor + */ + domFloat4( const domFloat4 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFloat4 &operator=( const domFloat4 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFloat1x1; + + typedef daeSmartRef domFloat1x1Ref; + typedef daeTArray domFloat1x1_Array; + + class domFloat1x1 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FLOAT1X1; } + + protected: // Value + /** + * The domCg_float1x1 value of the text data of this element. + */ + domCg_float1x1 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_float1x1 reference of the _value array. + */ + domCg_float1x1 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_float1x1 reference of the _value array. + */ + const domCg_float1x1 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_float1x1 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFloat1x1() : _value() {} + /** + * Destructor + */ + virtual ~domFloat1x1() {} + /** + * Copy Constructor + */ + domFloat1x1( const domFloat1x1 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFloat1x1 &operator=( const domFloat1x1 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFloat1x2; + + typedef daeSmartRef domFloat1x2Ref; + typedef daeTArray domFloat1x2_Array; + + class domFloat1x2 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FLOAT1X2; } + + protected: // Value + /** + * The domCg_float1x2 value of the text data of this element. + */ + domCg_float1x2 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_float1x2 reference of the _value array. + */ + domCg_float1x2 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_float1x2 reference of the _value array. + */ + const domCg_float1x2 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_float1x2 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFloat1x2() : _value() {} + /** + * Destructor + */ + virtual ~domFloat1x2() {} + /** + * Copy Constructor + */ + domFloat1x2( const domFloat1x2 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFloat1x2 &operator=( const domFloat1x2 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFloat1x3; + + typedef daeSmartRef domFloat1x3Ref; + typedef daeTArray domFloat1x3_Array; + + class domFloat1x3 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FLOAT1X3; } + + protected: // Value + /** + * The domCg_float1x3 value of the text data of this element. + */ + domCg_float1x3 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_float1x3 reference of the _value array. + */ + domCg_float1x3 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_float1x3 reference of the _value array. + */ + const domCg_float1x3 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_float1x3 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFloat1x3() : _value() {} + /** + * Destructor + */ + virtual ~domFloat1x3() {} + /** + * Copy Constructor + */ + domFloat1x3( const domFloat1x3 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFloat1x3 &operator=( const domFloat1x3 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFloat1x4; + + typedef daeSmartRef domFloat1x4Ref; + typedef daeTArray domFloat1x4_Array; + + class domFloat1x4 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FLOAT1X4; } + + protected: // Value + /** + * The domCg_float1x4 value of the text data of this element. + */ + domCg_float1x4 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_float1x4 reference of the _value array. + */ + domCg_float1x4 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_float1x4 reference of the _value array. + */ + const domCg_float1x4 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_float1x4 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFloat1x4() : _value() {} + /** + * Destructor + */ + virtual ~domFloat1x4() {} + /** + * Copy Constructor + */ + domFloat1x4( const domFloat1x4 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFloat1x4 &operator=( const domFloat1x4 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFloat2x1; + + typedef daeSmartRef domFloat2x1Ref; + typedef daeTArray domFloat2x1_Array; + + class domFloat2x1 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FLOAT2X1; } + + protected: // Value + /** + * The domCg_float2x1 value of the text data of this element. + */ + domCg_float2x1 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_float2x1 reference of the _value array. + */ + domCg_float2x1 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_float2x1 reference of the _value array. + */ + const domCg_float2x1 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_float2x1 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFloat2x1() : _value() {} + /** + * Destructor + */ + virtual ~domFloat2x1() {} + /** + * Copy Constructor + */ + domFloat2x1( const domFloat2x1 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFloat2x1 &operator=( const domFloat2x1 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFloat2x2; + + typedef daeSmartRef domFloat2x2Ref; + typedef daeTArray domFloat2x2_Array; + + class domFloat2x2 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FLOAT2X2; } + + protected: // Value + /** + * The domCg_float2x2 value of the text data of this element. + */ + domCg_float2x2 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_float2x2 reference of the _value array. + */ + domCg_float2x2 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_float2x2 reference of the _value array. + */ + const domCg_float2x2 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_float2x2 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFloat2x2() : _value() {} + /** + * Destructor + */ + virtual ~domFloat2x2() {} + /** + * Copy Constructor + */ + domFloat2x2( const domFloat2x2 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFloat2x2 &operator=( const domFloat2x2 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFloat2x3; + + typedef daeSmartRef domFloat2x3Ref; + typedef daeTArray domFloat2x3_Array; + + class domFloat2x3 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FLOAT2X3; } + + protected: // Value + /** + * The domCg_float2x3 value of the text data of this element. + */ + domCg_float2x3 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_float2x3 reference of the _value array. + */ + domCg_float2x3 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_float2x3 reference of the _value array. + */ + const domCg_float2x3 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_float2x3 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFloat2x3() : _value() {} + /** + * Destructor + */ + virtual ~domFloat2x3() {} + /** + * Copy Constructor + */ + domFloat2x3( const domFloat2x3 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFloat2x3 &operator=( const domFloat2x3 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFloat2x4; + + typedef daeSmartRef domFloat2x4Ref; + typedef daeTArray domFloat2x4_Array; + + class domFloat2x4 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FLOAT2X4; } + + protected: // Value + /** + * The domCg_float2x4 value of the text data of this element. + */ + domCg_float2x4 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_float2x4 reference of the _value array. + */ + domCg_float2x4 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_float2x4 reference of the _value array. + */ + const domCg_float2x4 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_float2x4 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFloat2x4() : _value() {} + /** + * Destructor + */ + virtual ~domFloat2x4() {} + /** + * Copy Constructor + */ + domFloat2x4( const domFloat2x4 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFloat2x4 &operator=( const domFloat2x4 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFloat3x1; + + typedef daeSmartRef domFloat3x1Ref; + typedef daeTArray domFloat3x1_Array; + + class domFloat3x1 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FLOAT3X1; } + + protected: // Value + /** + * The domCg_float3x1 value of the text data of this element. + */ + domCg_float3x1 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_float3x1 reference of the _value array. + */ + domCg_float3x1 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_float3x1 reference of the _value array. + */ + const domCg_float3x1 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_float3x1 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFloat3x1() : _value() {} + /** + * Destructor + */ + virtual ~domFloat3x1() {} + /** + * Copy Constructor + */ + domFloat3x1( const domFloat3x1 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFloat3x1 &operator=( const domFloat3x1 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFloat3x2; + + typedef daeSmartRef domFloat3x2Ref; + typedef daeTArray domFloat3x2_Array; + + class domFloat3x2 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FLOAT3X2; } + + protected: // Value + /** + * The domCg_float3x2 value of the text data of this element. + */ + domCg_float3x2 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_float3x2 reference of the _value array. + */ + domCg_float3x2 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_float3x2 reference of the _value array. + */ + const domCg_float3x2 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_float3x2 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFloat3x2() : _value() {} + /** + * Destructor + */ + virtual ~domFloat3x2() {} + /** + * Copy Constructor + */ + domFloat3x2( const domFloat3x2 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFloat3x2 &operator=( const domFloat3x2 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFloat3x3; + + typedef daeSmartRef domFloat3x3Ref; + typedef daeTArray domFloat3x3_Array; + + class domFloat3x3 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FLOAT3X3; } + + protected: // Value + /** + * The domCg_float3x3 value of the text data of this element. + */ + domCg_float3x3 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_float3x3 reference of the _value array. + */ + domCg_float3x3 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_float3x3 reference of the _value array. + */ + const domCg_float3x3 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_float3x3 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFloat3x3() : _value() {} + /** + * Destructor + */ + virtual ~domFloat3x3() {} + /** + * Copy Constructor + */ + domFloat3x3( const domFloat3x3 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFloat3x3 &operator=( const domFloat3x3 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFloat3x4; + + typedef daeSmartRef domFloat3x4Ref; + typedef daeTArray domFloat3x4_Array; + + class domFloat3x4 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FLOAT3X4; } + + protected: // Value + /** + * The domCg_float3x4 value of the text data of this element. + */ + domCg_float3x4 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_float3x4 reference of the _value array. + */ + domCg_float3x4 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_float3x4 reference of the _value array. + */ + const domCg_float3x4 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_float3x4 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFloat3x4() : _value() {} + /** + * Destructor + */ + virtual ~domFloat3x4() {} + /** + * Copy Constructor + */ + domFloat3x4( const domFloat3x4 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFloat3x4 &operator=( const domFloat3x4 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFloat4x1; + + typedef daeSmartRef domFloat4x1Ref; + typedef daeTArray domFloat4x1_Array; + + class domFloat4x1 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FLOAT4X1; } + + protected: // Value + /** + * The domCg_float4x1 value of the text data of this element. + */ + domCg_float4x1 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_float4x1 reference of the _value array. + */ + domCg_float4x1 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_float4x1 reference of the _value array. + */ + const domCg_float4x1 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_float4x1 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFloat4x1() : _value() {} + /** + * Destructor + */ + virtual ~domFloat4x1() {} + /** + * Copy Constructor + */ + domFloat4x1( const domFloat4x1 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFloat4x1 &operator=( const domFloat4x1 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFloat4x2; + + typedef daeSmartRef domFloat4x2Ref; + typedef daeTArray domFloat4x2_Array; + + class domFloat4x2 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FLOAT4X2; } + + protected: // Value + /** + * The domCg_float4x2 value of the text data of this element. + */ + domCg_float4x2 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_float4x2 reference of the _value array. + */ + domCg_float4x2 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_float4x2 reference of the _value array. + */ + const domCg_float4x2 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_float4x2 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFloat4x2() : _value() {} + /** + * Destructor + */ + virtual ~domFloat4x2() {} + /** + * Copy Constructor + */ + domFloat4x2( const domFloat4x2 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFloat4x2 &operator=( const domFloat4x2 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFloat4x3; + + typedef daeSmartRef domFloat4x3Ref; + typedef daeTArray domFloat4x3_Array; + + class domFloat4x3 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FLOAT4X3; } + + protected: // Value + /** + * The domCg_float4x3 value of the text data of this element. + */ + domCg_float4x3 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_float4x3 reference of the _value array. + */ + domCg_float4x3 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_float4x3 reference of the _value array. + */ + const domCg_float4x3 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_float4x3 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFloat4x3() : _value() {} + /** + * Destructor + */ + virtual ~domFloat4x3() {} + /** + * Copy Constructor + */ + domFloat4x3( const domFloat4x3 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFloat4x3 &operator=( const domFloat4x3 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFloat4x4; + + typedef daeSmartRef domFloat4x4Ref; + typedef daeTArray domFloat4x4_Array; + + class domFloat4x4 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FLOAT4X4; } + + protected: // Value + /** + * The domCg_float4x4 value of the text data of this element. + */ + domCg_float4x4 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_float4x4 reference of the _value array. + */ + domCg_float4x4 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_float4x4 reference of the _value array. + */ + const domCg_float4x4 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_float4x4 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFloat4x4() : _value() {} + /** + * Destructor + */ + virtual ~domFloat4x4() {} + /** + * Copy Constructor + */ + domFloat4x4( const domFloat4x4 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFloat4x4 &operator=( const domFloat4x4 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domInt; + + typedef daeSmartRef domIntRef; + typedef daeTArray domInt_Array; + + class domInt : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::INT; } + + protected: // Value + /** + * The domCg_int value of the text data of this element. + */ + domCg_int _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a domCg_int of the value. + */ + domCg_int getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( domCg_int val ) { _value = val; } + + protected: + /** + * Constructor + */ + domInt() : _value() {} + /** + * Destructor + */ + virtual ~domInt() {} + /** + * Copy Constructor + */ + domInt( const domInt &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domInt &operator=( const domInt &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domInt1; + + typedef daeSmartRef domInt1Ref; + typedef daeTArray domInt1_Array; + + class domInt1 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::INT1; } + + protected: // Value + /** + * The domCg_int1 value of the text data of this element. + */ + domCg_int1 _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a domCg_int1 of the value. + */ + domCg_int1 getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( domCg_int1 val ) { _value = val; } + + protected: + /** + * Constructor + */ + domInt1() : _value() {} + /** + * Destructor + */ + virtual ~domInt1() {} + /** + * Copy Constructor + */ + domInt1( const domInt1 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domInt1 &operator=( const domInt1 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domInt2; + + typedef daeSmartRef domInt2Ref; + typedef daeTArray domInt2_Array; + + class domInt2 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::INT2; } + + protected: // Value + /** + * The domCg_int2 value of the text data of this element. + */ + domCg_int2 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_int2 reference of the _value array. + */ + domCg_int2 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_int2 reference of the _value array. + */ + const domCg_int2 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_int2 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domInt2() : _value() {} + /** + * Destructor + */ + virtual ~domInt2() {} + /** + * Copy Constructor + */ + domInt2( const domInt2 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domInt2 &operator=( const domInt2 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domInt3; + + typedef daeSmartRef domInt3Ref; + typedef daeTArray domInt3_Array; + + class domInt3 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::INT3; } + + protected: // Value + /** + * The domCg_int3 value of the text data of this element. + */ + domCg_int3 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_int3 reference of the _value array. + */ + domCg_int3 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_int3 reference of the _value array. + */ + const domCg_int3 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_int3 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domInt3() : _value() {} + /** + * Destructor + */ + virtual ~domInt3() {} + /** + * Copy Constructor + */ + domInt3( const domInt3 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domInt3 &operator=( const domInt3 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domInt4; + + typedef daeSmartRef domInt4Ref; + typedef daeTArray domInt4_Array; + + class domInt4 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::INT4; } + + protected: // Value + /** + * The domCg_int4 value of the text data of this element. + */ + domCg_int4 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_int4 reference of the _value array. + */ + domCg_int4 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_int4 reference of the _value array. + */ + const domCg_int4 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_int4 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domInt4() : _value() {} + /** + * Destructor + */ + virtual ~domInt4() {} + /** + * Copy Constructor + */ + domInt4( const domInt4 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domInt4 &operator=( const domInt4 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domInt1x1; + + typedef daeSmartRef domInt1x1Ref; + typedef daeTArray domInt1x1_Array; + + class domInt1x1 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::INT1X1; } + + protected: // Value + /** + * The domCg_int1x1 value of the text data of this element. + */ + domCg_int1x1 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_int1x1 reference of the _value array. + */ + domCg_int1x1 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_int1x1 reference of the _value array. + */ + const domCg_int1x1 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_int1x1 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domInt1x1() : _value() {} + /** + * Destructor + */ + virtual ~domInt1x1() {} + /** + * Copy Constructor + */ + domInt1x1( const domInt1x1 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domInt1x1 &operator=( const domInt1x1 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domInt1x2; + + typedef daeSmartRef domInt1x2Ref; + typedef daeTArray domInt1x2_Array; + + class domInt1x2 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::INT1X2; } + + protected: // Value + /** + * The domCg_int1x2 value of the text data of this element. + */ + domCg_int1x2 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_int1x2 reference of the _value array. + */ + domCg_int1x2 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_int1x2 reference of the _value array. + */ + const domCg_int1x2 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_int1x2 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domInt1x2() : _value() {} + /** + * Destructor + */ + virtual ~domInt1x2() {} + /** + * Copy Constructor + */ + domInt1x2( const domInt1x2 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domInt1x2 &operator=( const domInt1x2 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domInt1x3; + + typedef daeSmartRef domInt1x3Ref; + typedef daeTArray domInt1x3_Array; + + class domInt1x3 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::INT1X3; } + + protected: // Value + /** + * The domCg_int1x3 value of the text data of this element. + */ + domCg_int1x3 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_int1x3 reference of the _value array. + */ + domCg_int1x3 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_int1x3 reference of the _value array. + */ + const domCg_int1x3 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_int1x3 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domInt1x3() : _value() {} + /** + * Destructor + */ + virtual ~domInt1x3() {} + /** + * Copy Constructor + */ + domInt1x3( const domInt1x3 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domInt1x3 &operator=( const domInt1x3 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domInt1x4; + + typedef daeSmartRef domInt1x4Ref; + typedef daeTArray domInt1x4_Array; + + class domInt1x4 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::INT1X4; } + + protected: // Value + /** + * The domCg_int1x4 value of the text data of this element. + */ + domCg_int1x4 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_int1x4 reference of the _value array. + */ + domCg_int1x4 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_int1x4 reference of the _value array. + */ + const domCg_int1x4 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_int1x4 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domInt1x4() : _value() {} + /** + * Destructor + */ + virtual ~domInt1x4() {} + /** + * Copy Constructor + */ + domInt1x4( const domInt1x4 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domInt1x4 &operator=( const domInt1x4 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domInt2x1; + + typedef daeSmartRef domInt2x1Ref; + typedef daeTArray domInt2x1_Array; + + class domInt2x1 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::INT2X1; } + + protected: // Value + /** + * The domCg_int2x1 value of the text data of this element. + */ + domCg_int2x1 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_int2x1 reference of the _value array. + */ + domCg_int2x1 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_int2x1 reference of the _value array. + */ + const domCg_int2x1 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_int2x1 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domInt2x1() : _value() {} + /** + * Destructor + */ + virtual ~domInt2x1() {} + /** + * Copy Constructor + */ + domInt2x1( const domInt2x1 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domInt2x1 &operator=( const domInt2x1 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domInt2x2; + + typedef daeSmartRef domInt2x2Ref; + typedef daeTArray domInt2x2_Array; + + class domInt2x2 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::INT2X2; } + + protected: // Value + /** + * The domCg_int2x2 value of the text data of this element. + */ + domCg_int2x2 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_int2x2 reference of the _value array. + */ + domCg_int2x2 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_int2x2 reference of the _value array. + */ + const domCg_int2x2 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_int2x2 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domInt2x2() : _value() {} + /** + * Destructor + */ + virtual ~domInt2x2() {} + /** + * Copy Constructor + */ + domInt2x2( const domInt2x2 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domInt2x2 &operator=( const domInt2x2 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domInt2x3; + + typedef daeSmartRef domInt2x3Ref; + typedef daeTArray domInt2x3_Array; + + class domInt2x3 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::INT2X3; } + + protected: // Value + /** + * The domCg_int2x3 value of the text data of this element. + */ + domCg_int2x3 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_int2x3 reference of the _value array. + */ + domCg_int2x3 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_int2x3 reference of the _value array. + */ + const domCg_int2x3 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_int2x3 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domInt2x3() : _value() {} + /** + * Destructor + */ + virtual ~domInt2x3() {} + /** + * Copy Constructor + */ + domInt2x3( const domInt2x3 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domInt2x3 &operator=( const domInt2x3 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domInt2x4; + + typedef daeSmartRef domInt2x4Ref; + typedef daeTArray domInt2x4_Array; + + class domInt2x4 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::INT2X4; } + + protected: // Value + /** + * The domCg_int2x4 value of the text data of this element. + */ + domCg_int2x4 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_int2x4 reference of the _value array. + */ + domCg_int2x4 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_int2x4 reference of the _value array. + */ + const domCg_int2x4 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_int2x4 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domInt2x4() : _value() {} + /** + * Destructor + */ + virtual ~domInt2x4() {} + /** + * Copy Constructor + */ + domInt2x4( const domInt2x4 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domInt2x4 &operator=( const domInt2x4 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domInt3x1; + + typedef daeSmartRef domInt3x1Ref; + typedef daeTArray domInt3x1_Array; + + class domInt3x1 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::INT3X1; } + + protected: // Value + /** + * The domCg_int3x1 value of the text data of this element. + */ + domCg_int3x1 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_int3x1 reference of the _value array. + */ + domCg_int3x1 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_int3x1 reference of the _value array. + */ + const domCg_int3x1 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_int3x1 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domInt3x1() : _value() {} + /** + * Destructor + */ + virtual ~domInt3x1() {} + /** + * Copy Constructor + */ + domInt3x1( const domInt3x1 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domInt3x1 &operator=( const domInt3x1 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domInt3x2; + + typedef daeSmartRef domInt3x2Ref; + typedef daeTArray domInt3x2_Array; + + class domInt3x2 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::INT3X2; } + + protected: // Value + /** + * The domCg_int3x2 value of the text data of this element. + */ + domCg_int3x2 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_int3x2 reference of the _value array. + */ + domCg_int3x2 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_int3x2 reference of the _value array. + */ + const domCg_int3x2 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_int3x2 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domInt3x2() : _value() {} + /** + * Destructor + */ + virtual ~domInt3x2() {} + /** + * Copy Constructor + */ + domInt3x2( const domInt3x2 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domInt3x2 &operator=( const domInt3x2 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domInt3x3; + + typedef daeSmartRef domInt3x3Ref; + typedef daeTArray domInt3x3_Array; + + class domInt3x3 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::INT3X3; } + + protected: // Value + /** + * The domCg_int3x3 value of the text data of this element. + */ + domCg_int3x3 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_int3x3 reference of the _value array. + */ + domCg_int3x3 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_int3x3 reference of the _value array. + */ + const domCg_int3x3 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_int3x3 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domInt3x3() : _value() {} + /** + * Destructor + */ + virtual ~domInt3x3() {} + /** + * Copy Constructor + */ + domInt3x3( const domInt3x3 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domInt3x3 &operator=( const domInt3x3 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domInt3x4; + + typedef daeSmartRef domInt3x4Ref; + typedef daeTArray domInt3x4_Array; + + class domInt3x4 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::INT3X4; } + + protected: // Value + /** + * The domCg_int3x4 value of the text data of this element. + */ + domCg_int3x4 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_int3x4 reference of the _value array. + */ + domCg_int3x4 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_int3x4 reference of the _value array. + */ + const domCg_int3x4 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_int3x4 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domInt3x4() : _value() {} + /** + * Destructor + */ + virtual ~domInt3x4() {} + /** + * Copy Constructor + */ + domInt3x4( const domInt3x4 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domInt3x4 &operator=( const domInt3x4 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domInt4x1; + + typedef daeSmartRef domInt4x1Ref; + typedef daeTArray domInt4x1_Array; + + class domInt4x1 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::INT4X1; } + + protected: // Value + /** + * The domCg_int4x1 value of the text data of this element. + */ + domCg_int4x1 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_int4x1 reference of the _value array. + */ + domCg_int4x1 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_int4x1 reference of the _value array. + */ + const domCg_int4x1 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_int4x1 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domInt4x1() : _value() {} + /** + * Destructor + */ + virtual ~domInt4x1() {} + /** + * Copy Constructor + */ + domInt4x1( const domInt4x1 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domInt4x1 &operator=( const domInt4x1 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domInt4x2; + + typedef daeSmartRef domInt4x2Ref; + typedef daeTArray domInt4x2_Array; + + class domInt4x2 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::INT4X2; } + + protected: // Value + /** + * The domCg_int4x2 value of the text data of this element. + */ + domCg_int4x2 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_int4x2 reference of the _value array. + */ + domCg_int4x2 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_int4x2 reference of the _value array. + */ + const domCg_int4x2 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_int4x2 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domInt4x2() : _value() {} + /** + * Destructor + */ + virtual ~domInt4x2() {} + /** + * Copy Constructor + */ + domInt4x2( const domInt4x2 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domInt4x2 &operator=( const domInt4x2 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domInt4x3; + + typedef daeSmartRef domInt4x3Ref; + typedef daeTArray domInt4x3_Array; + + class domInt4x3 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::INT4X3; } + + protected: // Value + /** + * The domCg_int4x3 value of the text data of this element. + */ + domCg_int4x3 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_int4x3 reference of the _value array. + */ + domCg_int4x3 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_int4x3 reference of the _value array. + */ + const domCg_int4x3 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_int4x3 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domInt4x3() : _value() {} + /** + * Destructor + */ + virtual ~domInt4x3() {} + /** + * Copy Constructor + */ + domInt4x3( const domInt4x3 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domInt4x3 &operator=( const domInt4x3 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domInt4x4; + + typedef daeSmartRef domInt4x4Ref; + typedef daeTArray domInt4x4_Array; + + class domInt4x4 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::INT4X4; } + + protected: // Value + /** + * The domCg_int4x4 value of the text data of this element. + */ + domCg_int4x4 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_int4x4 reference of the _value array. + */ + domCg_int4x4 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_int4x4 reference of the _value array. + */ + const domCg_int4x4 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_int4x4 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domInt4x4() : _value() {} + /** + * Destructor + */ + virtual ~domInt4x4() {} + /** + * Copy Constructor + */ + domInt4x4( const domInt4x4 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domInt4x4 &operator=( const domInt4x4 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domHalf; + + typedef daeSmartRef domHalfRef; + typedef daeTArray domHalf_Array; + + class domHalf : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::HALF; } + + protected: // Value + /** + * The domCg_half value of the text data of this element. + */ + domCg_half _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a domCg_half of the value. + */ + domCg_half getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( domCg_half val ) { _value = val; } + + protected: + /** + * Constructor + */ + domHalf() : _value() {} + /** + * Destructor + */ + virtual ~domHalf() {} + /** + * Copy Constructor + */ + domHalf( const domHalf &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domHalf &operator=( const domHalf &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domHalf1; + + typedef daeSmartRef domHalf1Ref; + typedef daeTArray domHalf1_Array; + + class domHalf1 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::HALF1; } + + protected: // Value + /** + * The domCg_half1 value of the text data of this element. + */ + domCg_half1 _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a domCg_half1 of the value. + */ + domCg_half1 getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( domCg_half1 val ) { _value = val; } + + protected: + /** + * Constructor + */ + domHalf1() : _value() {} + /** + * Destructor + */ + virtual ~domHalf1() {} + /** + * Copy Constructor + */ + domHalf1( const domHalf1 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domHalf1 &operator=( const domHalf1 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domHalf2; + + typedef daeSmartRef domHalf2Ref; + typedef daeTArray domHalf2_Array; + + class domHalf2 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::HALF2; } + + protected: // Value + /** + * The domCg_half2 value of the text data of this element. + */ + domCg_half2 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_half2 reference of the _value array. + */ + domCg_half2 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_half2 reference of the _value array. + */ + const domCg_half2 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_half2 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domHalf2() : _value() {} + /** + * Destructor + */ + virtual ~domHalf2() {} + /** + * Copy Constructor + */ + domHalf2( const domHalf2 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domHalf2 &operator=( const domHalf2 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domHalf3; + + typedef daeSmartRef domHalf3Ref; + typedef daeTArray domHalf3_Array; + + class domHalf3 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::HALF3; } + + protected: // Value + /** + * The domCg_half3 value of the text data of this element. + */ + domCg_half3 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_half3 reference of the _value array. + */ + domCg_half3 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_half3 reference of the _value array. + */ + const domCg_half3 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_half3 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domHalf3() : _value() {} + /** + * Destructor + */ + virtual ~domHalf3() {} + /** + * Copy Constructor + */ + domHalf3( const domHalf3 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domHalf3 &operator=( const domHalf3 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domHalf4; + + typedef daeSmartRef domHalf4Ref; + typedef daeTArray domHalf4_Array; + + class domHalf4 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::HALF4; } + + protected: // Value + /** + * The domCg_half4 value of the text data of this element. + */ + domCg_half4 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_half4 reference of the _value array. + */ + domCg_half4 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_half4 reference of the _value array. + */ + const domCg_half4 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_half4 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domHalf4() : _value() {} + /** + * Destructor + */ + virtual ~domHalf4() {} + /** + * Copy Constructor + */ + domHalf4( const domHalf4 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domHalf4 &operator=( const domHalf4 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domHalf1x1; + + typedef daeSmartRef domHalf1x1Ref; + typedef daeTArray domHalf1x1_Array; + + class domHalf1x1 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::HALF1X1; } + + protected: // Value + /** + * The domCg_half1x1 value of the text data of this element. + */ + domCg_half1x1 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_half1x1 reference of the _value array. + */ + domCg_half1x1 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_half1x1 reference of the _value array. + */ + const domCg_half1x1 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_half1x1 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domHalf1x1() : _value() {} + /** + * Destructor + */ + virtual ~domHalf1x1() {} + /** + * Copy Constructor + */ + domHalf1x1( const domHalf1x1 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domHalf1x1 &operator=( const domHalf1x1 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domHalf1x2; + + typedef daeSmartRef domHalf1x2Ref; + typedef daeTArray domHalf1x2_Array; + + class domHalf1x2 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::HALF1X2; } + + protected: // Value + /** + * The domCg_half1x2 value of the text data of this element. + */ + domCg_half1x2 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_half1x2 reference of the _value array. + */ + domCg_half1x2 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_half1x2 reference of the _value array. + */ + const domCg_half1x2 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_half1x2 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domHalf1x2() : _value() {} + /** + * Destructor + */ + virtual ~domHalf1x2() {} + /** + * Copy Constructor + */ + domHalf1x2( const domHalf1x2 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domHalf1x2 &operator=( const domHalf1x2 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domHalf1x3; + + typedef daeSmartRef domHalf1x3Ref; + typedef daeTArray domHalf1x3_Array; + + class domHalf1x3 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::HALF1X3; } + + protected: // Value + /** + * The domCg_half1x3 value of the text data of this element. + */ + domCg_half1x3 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_half1x3 reference of the _value array. + */ + domCg_half1x3 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_half1x3 reference of the _value array. + */ + const domCg_half1x3 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_half1x3 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domHalf1x3() : _value() {} + /** + * Destructor + */ + virtual ~domHalf1x3() {} + /** + * Copy Constructor + */ + domHalf1x3( const domHalf1x3 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domHalf1x3 &operator=( const domHalf1x3 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domHalf1x4; + + typedef daeSmartRef domHalf1x4Ref; + typedef daeTArray domHalf1x4_Array; + + class domHalf1x4 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::HALF1X4; } + + protected: // Value + /** + * The domCg_half1x4 value of the text data of this element. + */ + domCg_half1x4 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_half1x4 reference of the _value array. + */ + domCg_half1x4 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_half1x4 reference of the _value array. + */ + const domCg_half1x4 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_half1x4 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domHalf1x4() : _value() {} + /** + * Destructor + */ + virtual ~domHalf1x4() {} + /** + * Copy Constructor + */ + domHalf1x4( const domHalf1x4 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domHalf1x4 &operator=( const domHalf1x4 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domHalf2x1; + + typedef daeSmartRef domHalf2x1Ref; + typedef daeTArray domHalf2x1_Array; + + class domHalf2x1 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::HALF2X1; } + + protected: // Value + /** + * The domCg_half2x1 value of the text data of this element. + */ + domCg_half2x1 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_half2x1 reference of the _value array. + */ + domCg_half2x1 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_half2x1 reference of the _value array. + */ + const domCg_half2x1 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_half2x1 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domHalf2x1() : _value() {} + /** + * Destructor + */ + virtual ~domHalf2x1() {} + /** + * Copy Constructor + */ + domHalf2x1( const domHalf2x1 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domHalf2x1 &operator=( const domHalf2x1 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domHalf2x2; + + typedef daeSmartRef domHalf2x2Ref; + typedef daeTArray domHalf2x2_Array; + + class domHalf2x2 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::HALF2X2; } + + protected: // Value + /** + * The domCg_half2x2 value of the text data of this element. + */ + domCg_half2x2 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_half2x2 reference of the _value array. + */ + domCg_half2x2 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_half2x2 reference of the _value array. + */ + const domCg_half2x2 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_half2x2 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domHalf2x2() : _value() {} + /** + * Destructor + */ + virtual ~domHalf2x2() {} + /** + * Copy Constructor + */ + domHalf2x2( const domHalf2x2 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domHalf2x2 &operator=( const domHalf2x2 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domHalf2x3; + + typedef daeSmartRef domHalf2x3Ref; + typedef daeTArray domHalf2x3_Array; + + class domHalf2x3 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::HALF2X3; } + + protected: // Value + /** + * The domCg_half2x3 value of the text data of this element. + */ + domCg_half2x3 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_half2x3 reference of the _value array. + */ + domCg_half2x3 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_half2x3 reference of the _value array. + */ + const domCg_half2x3 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_half2x3 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domHalf2x3() : _value() {} + /** + * Destructor + */ + virtual ~domHalf2x3() {} + /** + * Copy Constructor + */ + domHalf2x3( const domHalf2x3 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domHalf2x3 &operator=( const domHalf2x3 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domHalf2x4; + + typedef daeSmartRef domHalf2x4Ref; + typedef daeTArray domHalf2x4_Array; + + class domHalf2x4 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::HALF2X4; } + + protected: // Value + /** + * The domCg_half2x4 value of the text data of this element. + */ + domCg_half2x4 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_half2x4 reference of the _value array. + */ + domCg_half2x4 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_half2x4 reference of the _value array. + */ + const domCg_half2x4 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_half2x4 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domHalf2x4() : _value() {} + /** + * Destructor + */ + virtual ~domHalf2x4() {} + /** + * Copy Constructor + */ + domHalf2x4( const domHalf2x4 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domHalf2x4 &operator=( const domHalf2x4 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domHalf3x1; + + typedef daeSmartRef domHalf3x1Ref; + typedef daeTArray domHalf3x1_Array; + + class domHalf3x1 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::HALF3X1; } + + protected: // Value + /** + * The domCg_half3x1 value of the text data of this element. + */ + domCg_half3x1 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_half3x1 reference of the _value array. + */ + domCg_half3x1 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_half3x1 reference of the _value array. + */ + const domCg_half3x1 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_half3x1 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domHalf3x1() : _value() {} + /** + * Destructor + */ + virtual ~domHalf3x1() {} + /** + * Copy Constructor + */ + domHalf3x1( const domHalf3x1 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domHalf3x1 &operator=( const domHalf3x1 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domHalf3x2; + + typedef daeSmartRef domHalf3x2Ref; + typedef daeTArray domHalf3x2_Array; + + class domHalf3x2 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::HALF3X2; } + + protected: // Value + /** + * The domCg_half3x2 value of the text data of this element. + */ + domCg_half3x2 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_half3x2 reference of the _value array. + */ + domCg_half3x2 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_half3x2 reference of the _value array. + */ + const domCg_half3x2 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_half3x2 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domHalf3x2() : _value() {} + /** + * Destructor + */ + virtual ~domHalf3x2() {} + /** + * Copy Constructor + */ + domHalf3x2( const domHalf3x2 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domHalf3x2 &operator=( const domHalf3x2 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domHalf3x3; + + typedef daeSmartRef domHalf3x3Ref; + typedef daeTArray domHalf3x3_Array; + + class domHalf3x3 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::HALF3X3; } + + protected: // Value + /** + * The domCg_half3x3 value of the text data of this element. + */ + domCg_half3x3 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_half3x3 reference of the _value array. + */ + domCg_half3x3 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_half3x3 reference of the _value array. + */ + const domCg_half3x3 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_half3x3 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domHalf3x3() : _value() {} + /** + * Destructor + */ + virtual ~domHalf3x3() {} + /** + * Copy Constructor + */ + domHalf3x3( const domHalf3x3 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domHalf3x3 &operator=( const domHalf3x3 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domHalf3x4; + + typedef daeSmartRef domHalf3x4Ref; + typedef daeTArray domHalf3x4_Array; + + class domHalf3x4 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::HALF3X4; } + + protected: // Value + /** + * The domCg_half3x4 value of the text data of this element. + */ + domCg_half3x4 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_half3x4 reference of the _value array. + */ + domCg_half3x4 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_half3x4 reference of the _value array. + */ + const domCg_half3x4 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_half3x4 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domHalf3x4() : _value() {} + /** + * Destructor + */ + virtual ~domHalf3x4() {} + /** + * Copy Constructor + */ + domHalf3x4( const domHalf3x4 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domHalf3x4 &operator=( const domHalf3x4 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domHalf4x1; + + typedef daeSmartRef domHalf4x1Ref; + typedef daeTArray domHalf4x1_Array; + + class domHalf4x1 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::HALF4X1; } + + protected: // Value + /** + * The domCg_half4x1 value of the text data of this element. + */ + domCg_half4x1 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_half4x1 reference of the _value array. + */ + domCg_half4x1 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_half4x1 reference of the _value array. + */ + const domCg_half4x1 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_half4x1 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domHalf4x1() : _value() {} + /** + * Destructor + */ + virtual ~domHalf4x1() {} + /** + * Copy Constructor + */ + domHalf4x1( const domHalf4x1 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domHalf4x1 &operator=( const domHalf4x1 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domHalf4x2; + + typedef daeSmartRef domHalf4x2Ref; + typedef daeTArray domHalf4x2_Array; + + class domHalf4x2 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::HALF4X2; } + + protected: // Value + /** + * The domCg_half4x2 value of the text data of this element. + */ + domCg_half4x2 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_half4x2 reference of the _value array. + */ + domCg_half4x2 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_half4x2 reference of the _value array. + */ + const domCg_half4x2 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_half4x2 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domHalf4x2() : _value() {} + /** + * Destructor + */ + virtual ~domHalf4x2() {} + /** + * Copy Constructor + */ + domHalf4x2( const domHalf4x2 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domHalf4x2 &operator=( const domHalf4x2 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domHalf4x3; + + typedef daeSmartRef domHalf4x3Ref; + typedef daeTArray domHalf4x3_Array; + + class domHalf4x3 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::HALF4X3; } + + protected: // Value + /** + * The domCg_half4x3 value of the text data of this element. + */ + domCg_half4x3 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_half4x3 reference of the _value array. + */ + domCg_half4x3 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_half4x3 reference of the _value array. + */ + const domCg_half4x3 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_half4x3 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domHalf4x3() : _value() {} + /** + * Destructor + */ + virtual ~domHalf4x3() {} + /** + * Copy Constructor + */ + domHalf4x3( const domHalf4x3 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domHalf4x3 &operator=( const domHalf4x3 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domHalf4x4; + + typedef daeSmartRef domHalf4x4Ref; + typedef daeTArray domHalf4x4_Array; + + class domHalf4x4 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::HALF4X4; } + + protected: // Value + /** + * The domCg_half4x4 value of the text data of this element. + */ + domCg_half4x4 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_half4x4 reference of the _value array. + */ + domCg_half4x4 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_half4x4 reference of the _value array. + */ + const domCg_half4x4 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_half4x4 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domHalf4x4() : _value() {} + /** + * Destructor + */ + virtual ~domHalf4x4() {} + /** + * Copy Constructor + */ + domHalf4x4( const domHalf4x4 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domHalf4x4 &operator=( const domHalf4x4 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFixed; + + typedef daeSmartRef domFixedRef; + typedef daeTArray domFixed_Array; + + class domFixed : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FIXED; } + + protected: // Value + /** + * The domCg_fixed value of the text data of this element. + */ + domCg_fixed _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a domCg_fixed of the value. + */ + domCg_fixed getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( domCg_fixed val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFixed() : _value() {} + /** + * Destructor + */ + virtual ~domFixed() {} + /** + * Copy Constructor + */ + domFixed( const domFixed &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFixed &operator=( const domFixed &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFixed1; + + typedef daeSmartRef domFixed1Ref; + typedef daeTArray domFixed1_Array; + + class domFixed1 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FIXED1; } + + protected: // Value + /** + * The domCg_fixed1 value of the text data of this element. + */ + domCg_fixed1 _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a domCg_fixed1 of the value. + */ + domCg_fixed1 getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( domCg_fixed1 val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFixed1() : _value() {} + /** + * Destructor + */ + virtual ~domFixed1() {} + /** + * Copy Constructor + */ + domFixed1( const domFixed1 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFixed1 &operator=( const domFixed1 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFixed2; + + typedef daeSmartRef domFixed2Ref; + typedef daeTArray domFixed2_Array; + + class domFixed2 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FIXED2; } + + protected: // Value + /** + * The domCg_fixed2 value of the text data of this element. + */ + domCg_fixed2 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_fixed2 reference of the _value array. + */ + domCg_fixed2 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_fixed2 reference of the _value array. + */ + const domCg_fixed2 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_fixed2 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFixed2() : _value() {} + /** + * Destructor + */ + virtual ~domFixed2() {} + /** + * Copy Constructor + */ + domFixed2( const domFixed2 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFixed2 &operator=( const domFixed2 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFixed3; + + typedef daeSmartRef domFixed3Ref; + typedef daeTArray domFixed3_Array; + + class domFixed3 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FIXED3; } + + protected: // Value + /** + * The domCg_fixed3 value of the text data of this element. + */ + domCg_fixed3 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_fixed3 reference of the _value array. + */ + domCg_fixed3 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_fixed3 reference of the _value array. + */ + const domCg_fixed3 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_fixed3 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFixed3() : _value() {} + /** + * Destructor + */ + virtual ~domFixed3() {} + /** + * Copy Constructor + */ + domFixed3( const domFixed3 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFixed3 &operator=( const domFixed3 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFixed4; + + typedef daeSmartRef domFixed4Ref; + typedef daeTArray domFixed4_Array; + + class domFixed4 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FIXED4; } + + protected: // Value + /** + * The domCg_fixed4 value of the text data of this element. + */ + domCg_fixed4 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_fixed4 reference of the _value array. + */ + domCg_fixed4 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_fixed4 reference of the _value array. + */ + const domCg_fixed4 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_fixed4 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFixed4() : _value() {} + /** + * Destructor + */ + virtual ~domFixed4() {} + /** + * Copy Constructor + */ + domFixed4( const domFixed4 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFixed4 &operator=( const domFixed4 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFixed1x1; + + typedef daeSmartRef domFixed1x1Ref; + typedef daeTArray domFixed1x1_Array; + + class domFixed1x1 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FIXED1X1; } + + protected: // Value + /** + * The domCg_fixed1x1 value of the text data of this element. + */ + domCg_fixed1x1 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_fixed1x1 reference of the _value array. + */ + domCg_fixed1x1 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_fixed1x1 reference of the _value array. + */ + const domCg_fixed1x1 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_fixed1x1 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFixed1x1() : _value() {} + /** + * Destructor + */ + virtual ~domFixed1x1() {} + /** + * Copy Constructor + */ + domFixed1x1( const domFixed1x1 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFixed1x1 &operator=( const domFixed1x1 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFixed1x2; + + typedef daeSmartRef domFixed1x2Ref; + typedef daeTArray domFixed1x2_Array; + + class domFixed1x2 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FIXED1X2; } + + protected: // Value + /** + * The domCg_fixed1x2 value of the text data of this element. + */ + domCg_fixed1x2 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_fixed1x2 reference of the _value array. + */ + domCg_fixed1x2 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_fixed1x2 reference of the _value array. + */ + const domCg_fixed1x2 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_fixed1x2 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFixed1x2() : _value() {} + /** + * Destructor + */ + virtual ~domFixed1x2() {} + /** + * Copy Constructor + */ + domFixed1x2( const domFixed1x2 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFixed1x2 &operator=( const domFixed1x2 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFixed1x3; + + typedef daeSmartRef domFixed1x3Ref; + typedef daeTArray domFixed1x3_Array; + + class domFixed1x3 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FIXED1X3; } + + protected: // Value + /** + * The domCg_fixed1x3 value of the text data of this element. + */ + domCg_fixed1x3 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_fixed1x3 reference of the _value array. + */ + domCg_fixed1x3 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_fixed1x3 reference of the _value array. + */ + const domCg_fixed1x3 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_fixed1x3 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFixed1x3() : _value() {} + /** + * Destructor + */ + virtual ~domFixed1x3() {} + /** + * Copy Constructor + */ + domFixed1x3( const domFixed1x3 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFixed1x3 &operator=( const domFixed1x3 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFixed1x4; + + typedef daeSmartRef domFixed1x4Ref; + typedef daeTArray domFixed1x4_Array; + + class domFixed1x4 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FIXED1X4; } + + protected: // Value + /** + * The domCg_fixed1x4 value of the text data of this element. + */ + domCg_fixed1x4 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_fixed1x4 reference of the _value array. + */ + domCg_fixed1x4 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_fixed1x4 reference of the _value array. + */ + const domCg_fixed1x4 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_fixed1x4 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFixed1x4() : _value() {} + /** + * Destructor + */ + virtual ~domFixed1x4() {} + /** + * Copy Constructor + */ + domFixed1x4( const domFixed1x4 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFixed1x4 &operator=( const domFixed1x4 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFixed2x1; + + typedef daeSmartRef domFixed2x1Ref; + typedef daeTArray domFixed2x1_Array; + + class domFixed2x1 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FIXED2X1; } + + protected: // Value + /** + * The domCg_fixed2x1 value of the text data of this element. + */ + domCg_fixed2x1 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_fixed2x1 reference of the _value array. + */ + domCg_fixed2x1 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_fixed2x1 reference of the _value array. + */ + const domCg_fixed2x1 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_fixed2x1 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFixed2x1() : _value() {} + /** + * Destructor + */ + virtual ~domFixed2x1() {} + /** + * Copy Constructor + */ + domFixed2x1( const domFixed2x1 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFixed2x1 &operator=( const domFixed2x1 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFixed2x2; + + typedef daeSmartRef domFixed2x2Ref; + typedef daeTArray domFixed2x2_Array; + + class domFixed2x2 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FIXED2X2; } + + protected: // Value + /** + * The domCg_fixed2x2 value of the text data of this element. + */ + domCg_fixed2x2 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_fixed2x2 reference of the _value array. + */ + domCg_fixed2x2 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_fixed2x2 reference of the _value array. + */ + const domCg_fixed2x2 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_fixed2x2 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFixed2x2() : _value() {} + /** + * Destructor + */ + virtual ~domFixed2x2() {} + /** + * Copy Constructor + */ + domFixed2x2( const domFixed2x2 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFixed2x2 &operator=( const domFixed2x2 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFixed2x3; + + typedef daeSmartRef domFixed2x3Ref; + typedef daeTArray domFixed2x3_Array; + + class domFixed2x3 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FIXED2X3; } + + protected: // Value + /** + * The domCg_fixed2x3 value of the text data of this element. + */ + domCg_fixed2x3 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_fixed2x3 reference of the _value array. + */ + domCg_fixed2x3 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_fixed2x3 reference of the _value array. + */ + const domCg_fixed2x3 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_fixed2x3 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFixed2x3() : _value() {} + /** + * Destructor + */ + virtual ~domFixed2x3() {} + /** + * Copy Constructor + */ + domFixed2x3( const domFixed2x3 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFixed2x3 &operator=( const domFixed2x3 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFixed2x4; + + typedef daeSmartRef domFixed2x4Ref; + typedef daeTArray domFixed2x4_Array; + + class domFixed2x4 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FIXED2X4; } + + protected: // Value + /** + * The domCg_fixed2x4 value of the text data of this element. + */ + domCg_fixed2x4 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_fixed2x4 reference of the _value array. + */ + domCg_fixed2x4 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_fixed2x4 reference of the _value array. + */ + const domCg_fixed2x4 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_fixed2x4 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFixed2x4() : _value() {} + /** + * Destructor + */ + virtual ~domFixed2x4() {} + /** + * Copy Constructor + */ + domFixed2x4( const domFixed2x4 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFixed2x4 &operator=( const domFixed2x4 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFixed3x1; + + typedef daeSmartRef domFixed3x1Ref; + typedef daeTArray domFixed3x1_Array; + + class domFixed3x1 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FIXED3X1; } + + protected: // Value + /** + * The domCg_fixed3x1 value of the text data of this element. + */ + domCg_fixed3x1 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_fixed3x1 reference of the _value array. + */ + domCg_fixed3x1 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_fixed3x1 reference of the _value array. + */ + const domCg_fixed3x1 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_fixed3x1 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFixed3x1() : _value() {} + /** + * Destructor + */ + virtual ~domFixed3x1() {} + /** + * Copy Constructor + */ + domFixed3x1( const domFixed3x1 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFixed3x1 &operator=( const domFixed3x1 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFixed3x2; + + typedef daeSmartRef domFixed3x2Ref; + typedef daeTArray domFixed3x2_Array; + + class domFixed3x2 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FIXED3X2; } + + protected: // Value + /** + * The domCg_fixed3x2 value of the text data of this element. + */ + domCg_fixed3x2 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_fixed3x2 reference of the _value array. + */ + domCg_fixed3x2 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_fixed3x2 reference of the _value array. + */ + const domCg_fixed3x2 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_fixed3x2 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFixed3x2() : _value() {} + /** + * Destructor + */ + virtual ~domFixed3x2() {} + /** + * Copy Constructor + */ + domFixed3x2( const domFixed3x2 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFixed3x2 &operator=( const domFixed3x2 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFixed3x3; + + typedef daeSmartRef domFixed3x3Ref; + typedef daeTArray domFixed3x3_Array; + + class domFixed3x3 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FIXED3X3; } + + protected: // Value + /** + * The domCg_fixed3x3 value of the text data of this element. + */ + domCg_fixed3x3 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_fixed3x3 reference of the _value array. + */ + domCg_fixed3x3 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_fixed3x3 reference of the _value array. + */ + const domCg_fixed3x3 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_fixed3x3 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFixed3x3() : _value() {} + /** + * Destructor + */ + virtual ~domFixed3x3() {} + /** + * Copy Constructor + */ + domFixed3x3( const domFixed3x3 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFixed3x3 &operator=( const domFixed3x3 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFixed3x4; + + typedef daeSmartRef domFixed3x4Ref; + typedef daeTArray domFixed3x4_Array; + + class domFixed3x4 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FIXED3X4; } + + protected: // Value + /** + * The domCg_fixed3x4 value of the text data of this element. + */ + domCg_fixed3x4 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_fixed3x4 reference of the _value array. + */ + domCg_fixed3x4 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_fixed3x4 reference of the _value array. + */ + const domCg_fixed3x4 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_fixed3x4 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFixed3x4() : _value() {} + /** + * Destructor + */ + virtual ~domFixed3x4() {} + /** + * Copy Constructor + */ + domFixed3x4( const domFixed3x4 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFixed3x4 &operator=( const domFixed3x4 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFixed4x1; + + typedef daeSmartRef domFixed4x1Ref; + typedef daeTArray domFixed4x1_Array; + + class domFixed4x1 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FIXED4X1; } + + protected: // Value + /** + * The domCg_fixed4x1 value of the text data of this element. + */ + domCg_fixed4x1 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_fixed4x1 reference of the _value array. + */ + domCg_fixed4x1 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_fixed4x1 reference of the _value array. + */ + const domCg_fixed4x1 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_fixed4x1 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFixed4x1() : _value() {} + /** + * Destructor + */ + virtual ~domFixed4x1() {} + /** + * Copy Constructor + */ + domFixed4x1( const domFixed4x1 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFixed4x1 &operator=( const domFixed4x1 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFixed4x2; + + typedef daeSmartRef domFixed4x2Ref; + typedef daeTArray domFixed4x2_Array; + + class domFixed4x2 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FIXED4X2; } + + protected: // Value + /** + * The domCg_fixed4x2 value of the text data of this element. + */ + domCg_fixed4x2 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_fixed4x2 reference of the _value array. + */ + domCg_fixed4x2 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_fixed4x2 reference of the _value array. + */ + const domCg_fixed4x2 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_fixed4x2 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFixed4x2() : _value() {} + /** + * Destructor + */ + virtual ~domFixed4x2() {} + /** + * Copy Constructor + */ + domFixed4x2( const domFixed4x2 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFixed4x2 &operator=( const domFixed4x2 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFixed4x3; + + typedef daeSmartRef domFixed4x3Ref; + typedef daeTArray domFixed4x3_Array; + + class domFixed4x3 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FIXED4X3; } + + protected: // Value + /** + * The domCg_fixed4x3 value of the text data of this element. + */ + domCg_fixed4x3 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_fixed4x3 reference of the _value array. + */ + domCg_fixed4x3 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_fixed4x3 reference of the _value array. + */ + const domCg_fixed4x3 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_fixed4x3 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFixed4x3() : _value() {} + /** + * Destructor + */ + virtual ~domFixed4x3() {} + /** + * Copy Constructor + */ + domFixed4x3( const domFixed4x3 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFixed4x3 &operator=( const domFixed4x3 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFixed4x4; + + typedef daeSmartRef domFixed4x4Ref; + typedef daeTArray domFixed4x4_Array; + + class domFixed4x4 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FIXED4X4; } + + protected: // Value + /** + * The domCg_fixed4x4 value of the text data of this element. + */ + domCg_fixed4x4 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domCg_fixed4x4 reference of the _value array. + */ + domCg_fixed4x4 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domCg_fixed4x4 reference of the _value array. + */ + const domCg_fixed4x4 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domCg_fixed4x4 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFixed4x4() : _value() {} + /** + * Destructor + */ + virtual ~domFixed4x4() {} + /** + * Copy Constructor + */ + domFixed4x4( const domFixed4x4 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFixed4x4 &operator=( const domFixed4x4 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domString; + + typedef daeSmartRef domStringRef; + typedef daeTArray domString_Array; + + class domString : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::STRING; } + + protected: // Value + /** + * The ::xsString value of the text data of this element. + */ + ::xsString _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return Returns a ::xsString of the value. + */ + ::xsString getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( ::xsString val ) { *(daeStringRef*)&_value = val; } + + protected: + /** + * Constructor + */ + domString() : _value() {} + /** + * Destructor + */ + virtual ~domString() {} + /** + * Copy Constructor + */ + domString( const domString &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domString &operator=( const domString &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domEnum; + + typedef daeSmartRef domEnumRef; + typedef daeTArray domEnum_Array; + + class domEnum : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::ENUM; } + + protected: // Value + /** + * The domGl_enumeration value of the text data of this element. + */ + domGl_enumeration _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a domGl_enumeration of the value. + */ + domGl_enumeration getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( domGl_enumeration val ) { _value = val; } + + protected: + /** + * Constructor + */ + domEnum() : _value() {} + /** + * Destructor + */ + virtual ~domEnum() {} + /** + * Copy Constructor + */ + domEnum( const domEnum &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domEnum &operator=( const domEnum &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + + +protected: // Elements + domBoolRef elemBool; + domBool1Ref elemBool1; + domBool2Ref elemBool2; + domBool3Ref elemBool3; + domBool4Ref elemBool4; + domBool1x1Ref elemBool1x1; + domBool1x2Ref elemBool1x2; + domBool1x3Ref elemBool1x3; + domBool1x4Ref elemBool1x4; + domBool2x1Ref elemBool2x1; + domBool2x2Ref elemBool2x2; + domBool2x3Ref elemBool2x3; + domBool2x4Ref elemBool2x4; + domBool3x1Ref elemBool3x1; + domBool3x2Ref elemBool3x2; + domBool3x3Ref elemBool3x3; + domBool3x4Ref elemBool3x4; + domBool4x1Ref elemBool4x1; + domBool4x2Ref elemBool4x2; + domBool4x3Ref elemBool4x3; + domBool4x4Ref elemBool4x4; + domFloatRef elemFloat; + domFloat1Ref elemFloat1; + domFloat2Ref elemFloat2; + domFloat3Ref elemFloat3; + domFloat4Ref elemFloat4; + domFloat1x1Ref elemFloat1x1; + domFloat1x2Ref elemFloat1x2; + domFloat1x3Ref elemFloat1x3; + domFloat1x4Ref elemFloat1x4; + domFloat2x1Ref elemFloat2x1; + domFloat2x2Ref elemFloat2x2; + domFloat2x3Ref elemFloat2x3; + domFloat2x4Ref elemFloat2x4; + domFloat3x1Ref elemFloat3x1; + domFloat3x2Ref elemFloat3x2; + domFloat3x3Ref elemFloat3x3; + domFloat3x4Ref elemFloat3x4; + domFloat4x1Ref elemFloat4x1; + domFloat4x2Ref elemFloat4x2; + domFloat4x3Ref elemFloat4x3; + domFloat4x4Ref elemFloat4x4; + domIntRef elemInt; + domInt1Ref elemInt1; + domInt2Ref elemInt2; + domInt3Ref elemInt3; + domInt4Ref elemInt4; + domInt1x1Ref elemInt1x1; + domInt1x2Ref elemInt1x2; + domInt1x3Ref elemInt1x3; + domInt1x4Ref elemInt1x4; + domInt2x1Ref elemInt2x1; + domInt2x2Ref elemInt2x2; + domInt2x3Ref elemInt2x3; + domInt2x4Ref elemInt2x4; + domInt3x1Ref elemInt3x1; + domInt3x2Ref elemInt3x2; + domInt3x3Ref elemInt3x3; + domInt3x4Ref elemInt3x4; + domInt4x1Ref elemInt4x1; + domInt4x2Ref elemInt4x2; + domInt4x3Ref elemInt4x3; + domInt4x4Ref elemInt4x4; + domHalfRef elemHalf; + domHalf1Ref elemHalf1; + domHalf2Ref elemHalf2; + domHalf3Ref elemHalf3; + domHalf4Ref elemHalf4; + domHalf1x1Ref elemHalf1x1; + domHalf1x2Ref elemHalf1x2; + domHalf1x3Ref elemHalf1x3; + domHalf1x4Ref elemHalf1x4; + domHalf2x1Ref elemHalf2x1; + domHalf2x2Ref elemHalf2x2; + domHalf2x3Ref elemHalf2x3; + domHalf2x4Ref elemHalf2x4; + domHalf3x1Ref elemHalf3x1; + domHalf3x2Ref elemHalf3x2; + domHalf3x3Ref elemHalf3x3; + domHalf3x4Ref elemHalf3x4; + domHalf4x1Ref elemHalf4x1; + domHalf4x2Ref elemHalf4x2; + domHalf4x3Ref elemHalf4x3; + domHalf4x4Ref elemHalf4x4; + domFixedRef elemFixed; + domFixed1Ref elemFixed1; + domFixed2Ref elemFixed2; + domFixed3Ref elemFixed3; + domFixed4Ref elemFixed4; + domFixed1x1Ref elemFixed1x1; + domFixed1x2Ref elemFixed1x2; + domFixed1x3Ref elemFixed1x3; + domFixed1x4Ref elemFixed1x4; + domFixed2x1Ref elemFixed2x1; + domFixed2x2Ref elemFixed2x2; + domFixed2x3Ref elemFixed2x3; + domFixed2x4Ref elemFixed2x4; + domFixed3x1Ref elemFixed3x1; + domFixed3x2Ref elemFixed3x2; + domFixed3x3Ref elemFixed3x3; + domFixed3x4Ref elemFixed3x4; + domFixed4x1Ref elemFixed4x1; + domFixed4x2Ref elemFixed4x2; + domFixed4x3Ref elemFixed4x3; + domFixed4x4Ref elemFixed4x4; + domCg_surface_typeRef elemSurface; + domCg_sampler1DRef elemSampler1D; + domCg_sampler2DRef elemSampler2D; + domCg_sampler3DRef elemSampler3D; + domCg_samplerRECTRef elemSamplerRECT; + domCg_samplerCUBERef elemSamplerCUBE; + domCg_samplerDEPTHRef elemSamplerDEPTH; + domStringRef elemString; + domEnumRef elemEnum; + /** + * Used to preserve order in elements that do not specify strict sequencing of sub-elements. + */ + daeElementRefArray _contents; + /** + * Used to preserve order in elements that have a complex content model. + */ + daeUIntArray _contentsOrder; + + +public: //Accessors and Mutators + /** + * Gets the bool element. + * @return a daeSmartRef to the bool element. + */ + const domBoolRef getBool() const { return elemBool; } + /** + * Gets the bool1 element. + * @return a daeSmartRef to the bool1 element. + */ + const domBool1Ref getBool1() const { return elemBool1; } + /** + * Gets the bool2 element. + * @return a daeSmartRef to the bool2 element. + */ + const domBool2Ref getBool2() const { return elemBool2; } + /** + * Gets the bool3 element. + * @return a daeSmartRef to the bool3 element. + */ + const domBool3Ref getBool3() const { return elemBool3; } + /** + * Gets the bool4 element. + * @return a daeSmartRef to the bool4 element. + */ + const domBool4Ref getBool4() const { return elemBool4; } + /** + * Gets the bool1x1 element. + * @return a daeSmartRef to the bool1x1 element. + */ + const domBool1x1Ref getBool1x1() const { return elemBool1x1; } + /** + * Gets the bool1x2 element. + * @return a daeSmartRef to the bool1x2 element. + */ + const domBool1x2Ref getBool1x2() const { return elemBool1x2; } + /** + * Gets the bool1x3 element. + * @return a daeSmartRef to the bool1x3 element. + */ + const domBool1x3Ref getBool1x3() const { return elemBool1x3; } + /** + * Gets the bool1x4 element. + * @return a daeSmartRef to the bool1x4 element. + */ + const domBool1x4Ref getBool1x4() const { return elemBool1x4; } + /** + * Gets the bool2x1 element. + * @return a daeSmartRef to the bool2x1 element. + */ + const domBool2x1Ref getBool2x1() const { return elemBool2x1; } + /** + * Gets the bool2x2 element. + * @return a daeSmartRef to the bool2x2 element. + */ + const domBool2x2Ref getBool2x2() const { return elemBool2x2; } + /** + * Gets the bool2x3 element. + * @return a daeSmartRef to the bool2x3 element. + */ + const domBool2x3Ref getBool2x3() const { return elemBool2x3; } + /** + * Gets the bool2x4 element. + * @return a daeSmartRef to the bool2x4 element. + */ + const domBool2x4Ref getBool2x4() const { return elemBool2x4; } + /** + * Gets the bool3x1 element. + * @return a daeSmartRef to the bool3x1 element. + */ + const domBool3x1Ref getBool3x1() const { return elemBool3x1; } + /** + * Gets the bool3x2 element. + * @return a daeSmartRef to the bool3x2 element. + */ + const domBool3x2Ref getBool3x2() const { return elemBool3x2; } + /** + * Gets the bool3x3 element. + * @return a daeSmartRef to the bool3x3 element. + */ + const domBool3x3Ref getBool3x3() const { return elemBool3x3; } + /** + * Gets the bool3x4 element. + * @return a daeSmartRef to the bool3x4 element. + */ + const domBool3x4Ref getBool3x4() const { return elemBool3x4; } + /** + * Gets the bool4x1 element. + * @return a daeSmartRef to the bool4x1 element. + */ + const domBool4x1Ref getBool4x1() const { return elemBool4x1; } + /** + * Gets the bool4x2 element. + * @return a daeSmartRef to the bool4x2 element. + */ + const domBool4x2Ref getBool4x2() const { return elemBool4x2; } + /** + * Gets the bool4x3 element. + * @return a daeSmartRef to the bool4x3 element. + */ + const domBool4x3Ref getBool4x3() const { return elemBool4x3; } + /** + * Gets the bool4x4 element. + * @return a daeSmartRef to the bool4x4 element. + */ + const domBool4x4Ref getBool4x4() const { return elemBool4x4; } + /** + * Gets the float element. + * @return a daeSmartRef to the float element. + */ + const domFloatRef getFloat() const { return elemFloat; } + /** + * Gets the float1 element. + * @return a daeSmartRef to the float1 element. + */ + const domFloat1Ref getFloat1() const { return elemFloat1; } + /** + * Gets the float2 element. + * @return a daeSmartRef to the float2 element. + */ + const domFloat2Ref getFloat2() const { return elemFloat2; } + /** + * Gets the float3 element. + * @return a daeSmartRef to the float3 element. + */ + const domFloat3Ref getFloat3() const { return elemFloat3; } + /** + * Gets the float4 element. + * @return a daeSmartRef to the float4 element. + */ + const domFloat4Ref getFloat4() const { return elemFloat4; } + /** + * Gets the float1x1 element. + * @return a daeSmartRef to the float1x1 element. + */ + const domFloat1x1Ref getFloat1x1() const { return elemFloat1x1; } + /** + * Gets the float1x2 element. + * @return a daeSmartRef to the float1x2 element. + */ + const domFloat1x2Ref getFloat1x2() const { return elemFloat1x2; } + /** + * Gets the float1x3 element. + * @return a daeSmartRef to the float1x3 element. + */ + const domFloat1x3Ref getFloat1x3() const { return elemFloat1x3; } + /** + * Gets the float1x4 element. + * @return a daeSmartRef to the float1x4 element. + */ + const domFloat1x4Ref getFloat1x4() const { return elemFloat1x4; } + /** + * Gets the float2x1 element. + * @return a daeSmartRef to the float2x1 element. + */ + const domFloat2x1Ref getFloat2x1() const { return elemFloat2x1; } + /** + * Gets the float2x2 element. + * @return a daeSmartRef to the float2x2 element. + */ + const domFloat2x2Ref getFloat2x2() const { return elemFloat2x2; } + /** + * Gets the float2x3 element. + * @return a daeSmartRef to the float2x3 element. + */ + const domFloat2x3Ref getFloat2x3() const { return elemFloat2x3; } + /** + * Gets the float2x4 element. + * @return a daeSmartRef to the float2x4 element. + */ + const domFloat2x4Ref getFloat2x4() const { return elemFloat2x4; } + /** + * Gets the float3x1 element. + * @return a daeSmartRef to the float3x1 element. + */ + const domFloat3x1Ref getFloat3x1() const { return elemFloat3x1; } + /** + * Gets the float3x2 element. + * @return a daeSmartRef to the float3x2 element. + */ + const domFloat3x2Ref getFloat3x2() const { return elemFloat3x2; } + /** + * Gets the float3x3 element. + * @return a daeSmartRef to the float3x3 element. + */ + const domFloat3x3Ref getFloat3x3() const { return elemFloat3x3; } + /** + * Gets the float3x4 element. + * @return a daeSmartRef to the float3x4 element. + */ + const domFloat3x4Ref getFloat3x4() const { return elemFloat3x4; } + /** + * Gets the float4x1 element. + * @return a daeSmartRef to the float4x1 element. + */ + const domFloat4x1Ref getFloat4x1() const { return elemFloat4x1; } + /** + * Gets the float4x2 element. + * @return a daeSmartRef to the float4x2 element. + */ + const domFloat4x2Ref getFloat4x2() const { return elemFloat4x2; } + /** + * Gets the float4x3 element. + * @return a daeSmartRef to the float4x3 element. + */ + const domFloat4x3Ref getFloat4x3() const { return elemFloat4x3; } + /** + * Gets the float4x4 element. + * @return a daeSmartRef to the float4x4 element. + */ + const domFloat4x4Ref getFloat4x4() const { return elemFloat4x4; } + /** + * Gets the int element. + * @return a daeSmartRef to the int element. + */ + const domIntRef getInt() const { return elemInt; } + /** + * Gets the int1 element. + * @return a daeSmartRef to the int1 element. + */ + const domInt1Ref getInt1() const { return elemInt1; } + /** + * Gets the int2 element. + * @return a daeSmartRef to the int2 element. + */ + const domInt2Ref getInt2() const { return elemInt2; } + /** + * Gets the int3 element. + * @return a daeSmartRef to the int3 element. + */ + const domInt3Ref getInt3() const { return elemInt3; } + /** + * Gets the int4 element. + * @return a daeSmartRef to the int4 element. + */ + const domInt4Ref getInt4() const { return elemInt4; } + /** + * Gets the int1x1 element. + * @return a daeSmartRef to the int1x1 element. + */ + const domInt1x1Ref getInt1x1() const { return elemInt1x1; } + /** + * Gets the int1x2 element. + * @return a daeSmartRef to the int1x2 element. + */ + const domInt1x2Ref getInt1x2() const { return elemInt1x2; } + /** + * Gets the int1x3 element. + * @return a daeSmartRef to the int1x3 element. + */ + const domInt1x3Ref getInt1x3() const { return elemInt1x3; } + /** + * Gets the int1x4 element. + * @return a daeSmartRef to the int1x4 element. + */ + const domInt1x4Ref getInt1x4() const { return elemInt1x4; } + /** + * Gets the int2x1 element. + * @return a daeSmartRef to the int2x1 element. + */ + const domInt2x1Ref getInt2x1() const { return elemInt2x1; } + /** + * Gets the int2x2 element. + * @return a daeSmartRef to the int2x2 element. + */ + const domInt2x2Ref getInt2x2() const { return elemInt2x2; } + /** + * Gets the int2x3 element. + * @return a daeSmartRef to the int2x3 element. + */ + const domInt2x3Ref getInt2x3() const { return elemInt2x3; } + /** + * Gets the int2x4 element. + * @return a daeSmartRef to the int2x4 element. + */ + const domInt2x4Ref getInt2x4() const { return elemInt2x4; } + /** + * Gets the int3x1 element. + * @return a daeSmartRef to the int3x1 element. + */ + const domInt3x1Ref getInt3x1() const { return elemInt3x1; } + /** + * Gets the int3x2 element. + * @return a daeSmartRef to the int3x2 element. + */ + const domInt3x2Ref getInt3x2() const { return elemInt3x2; } + /** + * Gets the int3x3 element. + * @return a daeSmartRef to the int3x3 element. + */ + const domInt3x3Ref getInt3x3() const { return elemInt3x3; } + /** + * Gets the int3x4 element. + * @return a daeSmartRef to the int3x4 element. + */ + const domInt3x4Ref getInt3x4() const { return elemInt3x4; } + /** + * Gets the int4x1 element. + * @return a daeSmartRef to the int4x1 element. + */ + const domInt4x1Ref getInt4x1() const { return elemInt4x1; } + /** + * Gets the int4x2 element. + * @return a daeSmartRef to the int4x2 element. + */ + const domInt4x2Ref getInt4x2() const { return elemInt4x2; } + /** + * Gets the int4x3 element. + * @return a daeSmartRef to the int4x3 element. + */ + const domInt4x3Ref getInt4x3() const { return elemInt4x3; } + /** + * Gets the int4x4 element. + * @return a daeSmartRef to the int4x4 element. + */ + const domInt4x4Ref getInt4x4() const { return elemInt4x4; } + /** + * Gets the half element. + * @return a daeSmartRef to the half element. + */ + const domHalfRef getHalf() const { return elemHalf; } + /** + * Gets the half1 element. + * @return a daeSmartRef to the half1 element. + */ + const domHalf1Ref getHalf1() const { return elemHalf1; } + /** + * Gets the half2 element. + * @return a daeSmartRef to the half2 element. + */ + const domHalf2Ref getHalf2() const { return elemHalf2; } + /** + * Gets the half3 element. + * @return a daeSmartRef to the half3 element. + */ + const domHalf3Ref getHalf3() const { return elemHalf3; } + /** + * Gets the half4 element. + * @return a daeSmartRef to the half4 element. + */ + const domHalf4Ref getHalf4() const { return elemHalf4; } + /** + * Gets the half1x1 element. + * @return a daeSmartRef to the half1x1 element. + */ + const domHalf1x1Ref getHalf1x1() const { return elemHalf1x1; } + /** + * Gets the half1x2 element. + * @return a daeSmartRef to the half1x2 element. + */ + const domHalf1x2Ref getHalf1x2() const { return elemHalf1x2; } + /** + * Gets the half1x3 element. + * @return a daeSmartRef to the half1x3 element. + */ + const domHalf1x3Ref getHalf1x3() const { return elemHalf1x3; } + /** + * Gets the half1x4 element. + * @return a daeSmartRef to the half1x4 element. + */ + const domHalf1x4Ref getHalf1x4() const { return elemHalf1x4; } + /** + * Gets the half2x1 element. + * @return a daeSmartRef to the half2x1 element. + */ + const domHalf2x1Ref getHalf2x1() const { return elemHalf2x1; } + /** + * Gets the half2x2 element. + * @return a daeSmartRef to the half2x2 element. + */ + const domHalf2x2Ref getHalf2x2() const { return elemHalf2x2; } + /** + * Gets the half2x3 element. + * @return a daeSmartRef to the half2x3 element. + */ + const domHalf2x3Ref getHalf2x3() const { return elemHalf2x3; } + /** + * Gets the half2x4 element. + * @return a daeSmartRef to the half2x4 element. + */ + const domHalf2x4Ref getHalf2x4() const { return elemHalf2x4; } + /** + * Gets the half3x1 element. + * @return a daeSmartRef to the half3x1 element. + */ + const domHalf3x1Ref getHalf3x1() const { return elemHalf3x1; } + /** + * Gets the half3x2 element. + * @return a daeSmartRef to the half3x2 element. + */ + const domHalf3x2Ref getHalf3x2() const { return elemHalf3x2; } + /** + * Gets the half3x3 element. + * @return a daeSmartRef to the half3x3 element. + */ + const domHalf3x3Ref getHalf3x3() const { return elemHalf3x3; } + /** + * Gets the half3x4 element. + * @return a daeSmartRef to the half3x4 element. + */ + const domHalf3x4Ref getHalf3x4() const { return elemHalf3x4; } + /** + * Gets the half4x1 element. + * @return a daeSmartRef to the half4x1 element. + */ + const domHalf4x1Ref getHalf4x1() const { return elemHalf4x1; } + /** + * Gets the half4x2 element. + * @return a daeSmartRef to the half4x2 element. + */ + const domHalf4x2Ref getHalf4x2() const { return elemHalf4x2; } + /** + * Gets the half4x3 element. + * @return a daeSmartRef to the half4x3 element. + */ + const domHalf4x3Ref getHalf4x3() const { return elemHalf4x3; } + /** + * Gets the half4x4 element. + * @return a daeSmartRef to the half4x4 element. + */ + const domHalf4x4Ref getHalf4x4() const { return elemHalf4x4; } + /** + * Gets the fixed element. + * @return a daeSmartRef to the fixed element. + */ + const domFixedRef getFixed() const { return elemFixed; } + /** + * Gets the fixed1 element. + * @return a daeSmartRef to the fixed1 element. + */ + const domFixed1Ref getFixed1() const { return elemFixed1; } + /** + * Gets the fixed2 element. + * @return a daeSmartRef to the fixed2 element. + */ + const domFixed2Ref getFixed2() const { return elemFixed2; } + /** + * Gets the fixed3 element. + * @return a daeSmartRef to the fixed3 element. + */ + const domFixed3Ref getFixed3() const { return elemFixed3; } + /** + * Gets the fixed4 element. + * @return a daeSmartRef to the fixed4 element. + */ + const domFixed4Ref getFixed4() const { return elemFixed4; } + /** + * Gets the fixed1x1 element. + * @return a daeSmartRef to the fixed1x1 element. + */ + const domFixed1x1Ref getFixed1x1() const { return elemFixed1x1; } + /** + * Gets the fixed1x2 element. + * @return a daeSmartRef to the fixed1x2 element. + */ + const domFixed1x2Ref getFixed1x2() const { return elemFixed1x2; } + /** + * Gets the fixed1x3 element. + * @return a daeSmartRef to the fixed1x3 element. + */ + const domFixed1x3Ref getFixed1x3() const { return elemFixed1x3; } + /** + * Gets the fixed1x4 element. + * @return a daeSmartRef to the fixed1x4 element. + */ + const domFixed1x4Ref getFixed1x4() const { return elemFixed1x4; } + /** + * Gets the fixed2x1 element. + * @return a daeSmartRef to the fixed2x1 element. + */ + const domFixed2x1Ref getFixed2x1() const { return elemFixed2x1; } + /** + * Gets the fixed2x2 element. + * @return a daeSmartRef to the fixed2x2 element. + */ + const domFixed2x2Ref getFixed2x2() const { return elemFixed2x2; } + /** + * Gets the fixed2x3 element. + * @return a daeSmartRef to the fixed2x3 element. + */ + const domFixed2x3Ref getFixed2x3() const { return elemFixed2x3; } + /** + * Gets the fixed2x4 element. + * @return a daeSmartRef to the fixed2x4 element. + */ + const domFixed2x4Ref getFixed2x4() const { return elemFixed2x4; } + /** + * Gets the fixed3x1 element. + * @return a daeSmartRef to the fixed3x1 element. + */ + const domFixed3x1Ref getFixed3x1() const { return elemFixed3x1; } + /** + * Gets the fixed3x2 element. + * @return a daeSmartRef to the fixed3x2 element. + */ + const domFixed3x2Ref getFixed3x2() const { return elemFixed3x2; } + /** + * Gets the fixed3x3 element. + * @return a daeSmartRef to the fixed3x3 element. + */ + const domFixed3x3Ref getFixed3x3() const { return elemFixed3x3; } + /** + * Gets the fixed3x4 element. + * @return a daeSmartRef to the fixed3x4 element. + */ + const domFixed3x4Ref getFixed3x4() const { return elemFixed3x4; } + /** + * Gets the fixed4x1 element. + * @return a daeSmartRef to the fixed4x1 element. + */ + const domFixed4x1Ref getFixed4x1() const { return elemFixed4x1; } + /** + * Gets the fixed4x2 element. + * @return a daeSmartRef to the fixed4x2 element. + */ + const domFixed4x2Ref getFixed4x2() const { return elemFixed4x2; } + /** + * Gets the fixed4x3 element. + * @return a daeSmartRef to the fixed4x3 element. + */ + const domFixed4x3Ref getFixed4x3() const { return elemFixed4x3; } + /** + * Gets the fixed4x4 element. + * @return a daeSmartRef to the fixed4x4 element. + */ + const domFixed4x4Ref getFixed4x4() const { return elemFixed4x4; } + /** + * Gets the surface element. + * @return a daeSmartRef to the surface element. + */ + const domCg_surface_typeRef getSurface() const { return elemSurface; } + /** + * Gets the sampler1D element. + * @return a daeSmartRef to the sampler1D element. + */ + const domCg_sampler1DRef getSampler1D() const { return elemSampler1D; } + /** + * Gets the sampler2D element. + * @return a daeSmartRef to the sampler2D element. + */ + const domCg_sampler2DRef getSampler2D() const { return elemSampler2D; } + /** + * Gets the sampler3D element. + * @return a daeSmartRef to the sampler3D element. + */ + const domCg_sampler3DRef getSampler3D() const { return elemSampler3D; } + /** + * Gets the samplerRECT element. + * @return a daeSmartRef to the samplerRECT element. + */ + const domCg_samplerRECTRef getSamplerRECT() const { return elemSamplerRECT; } + /** + * Gets the samplerCUBE element. + * @return a daeSmartRef to the samplerCUBE element. + */ + const domCg_samplerCUBERef getSamplerCUBE() const { return elemSamplerCUBE; } + /** + * Gets the samplerDEPTH element. + * @return a daeSmartRef to the samplerDEPTH element. + */ + const domCg_samplerDEPTHRef getSamplerDEPTH() const { return elemSamplerDEPTH; } + /** + * Gets the string element. + * @return a daeSmartRef to the string element. + */ + const domStringRef getString() const { return elemString; } + /** + * Gets the enum element. + * @return a daeSmartRef to the enum element. + */ + const domEnumRef getEnum() const { return elemEnum; } + /** + * Gets the _contents array. + * @return Returns a reference to the _contents element array. + */ + daeElementRefArray &getContents() { return _contents; } + /** + * Gets the _contents array. + * @return Returns a constant reference to the _contents element array. + */ + const daeElementRefArray &getContents() const { return _contents; } + +protected: + /** + * Constructor + */ + domCg_param_type() : elemBool(), elemBool1(), elemBool2(), elemBool3(), elemBool4(), elemBool1x1(), elemBool1x2(), elemBool1x3(), elemBool1x4(), elemBool2x1(), elemBool2x2(), elemBool2x3(), elemBool2x4(), elemBool3x1(), elemBool3x2(), elemBool3x3(), elemBool3x4(), elemBool4x1(), elemBool4x2(), elemBool4x3(), elemBool4x4(), elemFloat(), elemFloat1(), elemFloat2(), elemFloat3(), elemFloat4(), elemFloat1x1(), elemFloat1x2(), elemFloat1x3(), elemFloat1x4(), elemFloat2x1(), elemFloat2x2(), elemFloat2x3(), elemFloat2x4(), elemFloat3x1(), elemFloat3x2(), elemFloat3x3(), elemFloat3x4(), elemFloat4x1(), elemFloat4x2(), elemFloat4x3(), elemFloat4x4(), elemInt(), elemInt1(), elemInt2(), elemInt3(), elemInt4(), elemInt1x1(), elemInt1x2(), elemInt1x3(), elemInt1x4(), elemInt2x1(), elemInt2x2(), elemInt2x3(), elemInt2x4(), elemInt3x1(), elemInt3x2(), elemInt3x3(), elemInt3x4(), elemInt4x1(), elemInt4x2(), elemInt4x3(), elemInt4x4(), elemHalf(), elemHalf1(), elemHalf2(), elemHalf3(), elemHalf4(), elemHalf1x1(), elemHalf1x2(), elemHalf1x3(), elemHalf1x4(), elemHalf2x1(), elemHalf2x2(), elemHalf2x3(), elemHalf2x4(), elemHalf3x1(), elemHalf3x2(), elemHalf3x3(), elemHalf3x4(), elemHalf4x1(), elemHalf4x2(), elemHalf4x3(), elemHalf4x4(), elemFixed(), elemFixed1(), elemFixed2(), elemFixed3(), elemFixed4(), elemFixed1x1(), elemFixed1x2(), elemFixed1x3(), elemFixed1x4(), elemFixed2x1(), elemFixed2x2(), elemFixed2x3(), elemFixed2x4(), elemFixed3x1(), elemFixed3x2(), elemFixed3x3(), elemFixed3x4(), elemFixed4x1(), elemFixed4x2(), elemFixed4x3(), elemFixed4x4(), elemSurface(), elemSampler1D(), elemSampler2D(), elemSampler3D(), elemSamplerRECT(), elemSamplerCUBE(), elemSamplerDEPTH(), elemString(), elemEnum() {} + /** + * Destructor + */ + virtual ~domCg_param_type() {} + /** + * Copy Constructor + */ + domCg_param_type( const domCg_param_type &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domCg_param_type &operator=( const domCg_param_type &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCg_sampler1D.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCg_sampler1D.h new file mode 100644 index 00000000..5ff31651 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCg_sampler1D.h @@ -0,0 +1,90 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domCg_sampler1D_h__ +#define __domCg_sampler1D_h__ + +#include +#include + +#include + +class domCg_sampler1D_complexType : public domFx_sampler1D_common_complexType +{ + +protected: + /** + * Constructor + */ + domCg_sampler1D_complexType() {} + /** + * Destructor + */ + virtual ~domCg_sampler1D_complexType() {} + /** + * Copy Constructor + */ + domCg_sampler1D_complexType( const domCg_sampler1D_complexType &cpy ) : domFx_sampler1D_common_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domCg_sampler1D_complexType &operator=( const domCg_sampler1D_complexType &cpy ) { (void)cpy; return *this; } +}; + +/** + * An element of type domCg_sampler1D_complexType. + */ +class domCg_sampler1D : public daeElement, public domCg_sampler1D_complexType +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::CG_SAMPLER1D; } +protected: + /** + * Constructor + */ + domCg_sampler1D() {} + /** + * Destructor + */ + virtual ~domCg_sampler1D() {} + /** + * Copy Constructor + */ + domCg_sampler1D( const domCg_sampler1D &cpy ) : daeElement(), domCg_sampler1D_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domCg_sampler1D &operator=( const domCg_sampler1D &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCg_sampler2D.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCg_sampler2D.h new file mode 100644 index 00000000..187c8b54 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCg_sampler2D.h @@ -0,0 +1,90 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domCg_sampler2D_h__ +#define __domCg_sampler2D_h__ + +#include +#include + +#include + +class domCg_sampler2D_complexType : public domFx_sampler2D_common_complexType +{ + +protected: + /** + * Constructor + */ + domCg_sampler2D_complexType() {} + /** + * Destructor + */ + virtual ~domCg_sampler2D_complexType() {} + /** + * Copy Constructor + */ + domCg_sampler2D_complexType( const domCg_sampler2D_complexType &cpy ) : domFx_sampler2D_common_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domCg_sampler2D_complexType &operator=( const domCg_sampler2D_complexType &cpy ) { (void)cpy; return *this; } +}; + +/** + * An element of type domCg_sampler2D_complexType. + */ +class domCg_sampler2D : public daeElement, public domCg_sampler2D_complexType +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::CG_SAMPLER2D; } +protected: + /** + * Constructor + */ + domCg_sampler2D() {} + /** + * Destructor + */ + virtual ~domCg_sampler2D() {} + /** + * Copy Constructor + */ + domCg_sampler2D( const domCg_sampler2D &cpy ) : daeElement(), domCg_sampler2D_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domCg_sampler2D &operator=( const domCg_sampler2D &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCg_sampler3D.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCg_sampler3D.h new file mode 100644 index 00000000..64bbeff0 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCg_sampler3D.h @@ -0,0 +1,90 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domCg_sampler3D_h__ +#define __domCg_sampler3D_h__ + +#include +#include + +#include + +class domCg_sampler3D_complexType : public domFx_sampler3D_common_complexType +{ + +protected: + /** + * Constructor + */ + domCg_sampler3D_complexType() {} + /** + * Destructor + */ + virtual ~domCg_sampler3D_complexType() {} + /** + * Copy Constructor + */ + domCg_sampler3D_complexType( const domCg_sampler3D_complexType &cpy ) : domFx_sampler3D_common_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domCg_sampler3D_complexType &operator=( const domCg_sampler3D_complexType &cpy ) { (void)cpy; return *this; } +}; + +/** + * An element of type domCg_sampler3D_complexType. + */ +class domCg_sampler3D : public daeElement, public domCg_sampler3D_complexType +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::CG_SAMPLER3D; } +protected: + /** + * Constructor + */ + domCg_sampler3D() {} + /** + * Destructor + */ + virtual ~domCg_sampler3D() {} + /** + * Copy Constructor + */ + domCg_sampler3D( const domCg_sampler3D &cpy ) : daeElement(), domCg_sampler3D_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domCg_sampler3D &operator=( const domCg_sampler3D &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCg_samplerCUBE.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCg_samplerCUBE.h new file mode 100644 index 00000000..84f6062f --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCg_samplerCUBE.h @@ -0,0 +1,90 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domCg_samplerCUBE_h__ +#define __domCg_samplerCUBE_h__ + +#include +#include + +#include + +class domCg_samplerCUBE_complexType : public domFx_samplerCUBE_common_complexType +{ + +protected: + /** + * Constructor + */ + domCg_samplerCUBE_complexType() {} + /** + * Destructor + */ + virtual ~domCg_samplerCUBE_complexType() {} + /** + * Copy Constructor + */ + domCg_samplerCUBE_complexType( const domCg_samplerCUBE_complexType &cpy ) : domFx_samplerCUBE_common_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domCg_samplerCUBE_complexType &operator=( const domCg_samplerCUBE_complexType &cpy ) { (void)cpy; return *this; } +}; + +/** + * An element of type domCg_samplerCUBE_complexType. + */ +class domCg_samplerCUBE : public daeElement, public domCg_samplerCUBE_complexType +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::CG_SAMPLERCUBE; } +protected: + /** + * Constructor + */ + domCg_samplerCUBE() {} + /** + * Destructor + */ + virtual ~domCg_samplerCUBE() {} + /** + * Copy Constructor + */ + domCg_samplerCUBE( const domCg_samplerCUBE &cpy ) : daeElement(), domCg_samplerCUBE_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domCg_samplerCUBE &operator=( const domCg_samplerCUBE &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCg_samplerDEPTH.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCg_samplerDEPTH.h new file mode 100644 index 00000000..9801f621 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCg_samplerDEPTH.h @@ -0,0 +1,90 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domCg_samplerDEPTH_h__ +#define __domCg_samplerDEPTH_h__ + +#include +#include + +#include + +class domCg_samplerDEPTH_complexType : public domFx_samplerDEPTH_common_complexType +{ + +protected: + /** + * Constructor + */ + domCg_samplerDEPTH_complexType() {} + /** + * Destructor + */ + virtual ~domCg_samplerDEPTH_complexType() {} + /** + * Copy Constructor + */ + domCg_samplerDEPTH_complexType( const domCg_samplerDEPTH_complexType &cpy ) : domFx_samplerDEPTH_common_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domCg_samplerDEPTH_complexType &operator=( const domCg_samplerDEPTH_complexType &cpy ) { (void)cpy; return *this; } +}; + +/** + * An element of type domCg_samplerDEPTH_complexType. + */ +class domCg_samplerDEPTH : public daeElement, public domCg_samplerDEPTH_complexType +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::CG_SAMPLERDEPTH; } +protected: + /** + * Constructor + */ + domCg_samplerDEPTH() {} + /** + * Destructor + */ + virtual ~domCg_samplerDEPTH() {} + /** + * Copy Constructor + */ + domCg_samplerDEPTH( const domCg_samplerDEPTH &cpy ) : daeElement(), domCg_samplerDEPTH_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domCg_samplerDEPTH &operator=( const domCg_samplerDEPTH &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCg_samplerRECT.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCg_samplerRECT.h new file mode 100644 index 00000000..d9b19c1d --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCg_samplerRECT.h @@ -0,0 +1,90 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domCg_samplerRECT_h__ +#define __domCg_samplerRECT_h__ + +#include +#include + +#include + +class domCg_samplerRECT_complexType : public domFx_samplerRECT_common_complexType +{ + +protected: + /** + * Constructor + */ + domCg_samplerRECT_complexType() {} + /** + * Destructor + */ + virtual ~domCg_samplerRECT_complexType() {} + /** + * Copy Constructor + */ + domCg_samplerRECT_complexType( const domCg_samplerRECT_complexType &cpy ) : domFx_samplerRECT_common_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domCg_samplerRECT_complexType &operator=( const domCg_samplerRECT_complexType &cpy ) { (void)cpy; return *this; } +}; + +/** + * An element of type domCg_samplerRECT_complexType. + */ +class domCg_samplerRECT : public daeElement, public domCg_samplerRECT_complexType +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::CG_SAMPLERRECT; } +protected: + /** + * Constructor + */ + domCg_samplerRECT() {} + /** + * Destructor + */ + virtual ~domCg_samplerRECT() {} + /** + * Copy Constructor + */ + domCg_samplerRECT( const domCg_samplerRECT &cpy ) : daeElement(), domCg_samplerRECT_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domCg_samplerRECT &operator=( const domCg_samplerRECT &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCg_setarray_type.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCg_setarray_type.h new file mode 100644 index 00000000..d7c0ed41 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCg_setarray_type.h @@ -0,0 +1,188 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domCg_setarray_type_h__ +#define __domCg_setarray_type_h__ + +#include +#include + +#include +#include +#include + +/** + * Creates a parameter of a one-dimensional array type. + */ +class domCg_setarray_type_complexType +{ +protected: // Attribute +/** + * The length attribute specifies the length of the array. + */ + xsPositiveInteger attrLength; + +protected: // Elements + domCg_param_type_Array elemCg_param_type_array; +/** + * Nested array elements allow you to create multidemensional arrays. @see + * domArray + */ + domCg_setarray_type_Array elemArray_array; +/** + * The usertype element allows you to create arrays of usertypes. @see domUsertype + */ + domCg_setuser_type_Array elemUsertype_array; + /** + * Used to preserve order in elements that do not specify strict sequencing of sub-elements. + */ + daeElementRefArray _contents; + /** + * Used to preserve order in elements that have a complex content model. + */ + daeUIntArray _contentsOrder; + + +public: //Accessors and Mutators + /** + * Gets the length attribute. + * @return Returns a xsPositiveInteger of the length attribute. + */ + xsPositiveInteger getLength() const { return attrLength; } + /** + * Sets the length attribute. + * @param atLength The new value for the length attribute. + */ + void setLength( xsPositiveInteger atLength ) { attrLength = atLength; } + + /** + * Gets the cg_param_type element array. + * @return Returns a reference to the array of cg_param_type elements. + */ + domCg_param_type_Array &getCg_param_type_array() { return elemCg_param_type_array; } + /** + * Gets the cg_param_type element array. + * @return Returns a constant reference to the array of cg_param_type elements. + */ + const domCg_param_type_Array &getCg_param_type_array() const { return elemCg_param_type_array; } + /** + * Gets the array element array. + * @return Returns a reference to the array of array elements. + */ + domCg_setarray_type_Array &getArray_array() { return elemArray_array; } + /** + * Gets the array element array. + * @return Returns a constant reference to the array of array elements. + */ + const domCg_setarray_type_Array &getArray_array() const { return elemArray_array; } + /** + * Gets the usertype element array. + * @return Returns a reference to the array of usertype elements. + */ + domCg_setuser_type_Array &getUsertype_array() { return elemUsertype_array; } + /** + * Gets the usertype element array. + * @return Returns a constant reference to the array of usertype elements. + */ + const domCg_setuser_type_Array &getUsertype_array() const { return elemUsertype_array; } + /** + * Gets the _contents array. + * @return Returns a reference to the _contents element array. + */ + daeElementRefArray &getContents() { return _contents; } + /** + * Gets the _contents array. + * @return Returns a constant reference to the _contents element array. + */ + const daeElementRefArray &getContents() const { return _contents; } + +protected: + /** + * Constructor + */ + domCg_setarray_type_complexType() : attrLength(), elemCg_param_type_array(), elemArray_array(), elemUsertype_array() {} + /** + * Destructor + */ + virtual ~domCg_setarray_type_complexType() {} + /** + * Copy Constructor + */ + domCg_setarray_type_complexType( const domCg_setarray_type_complexType &cpy ) { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domCg_setarray_type_complexType &operator=( const domCg_setarray_type_complexType &cpy ) { (void)cpy; return *this; } +}; + +/** + * An element of type domCg_setarray_type_complexType. + */ +class domCg_setarray_type : public daeElement, public domCg_setarray_type_complexType +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::CG_SETARRAY_TYPE; } + +public: //Accessors and Mutators + /** + * Gets the length attribute. + * @return Returns a xsPositiveInteger of the length attribute. + */ + xsPositiveInteger getLength() const { return attrLength; } + /** + * Sets the length attribute. + * @param atLength The new value for the length attribute. + */ + void setLength( xsPositiveInteger atLength ) { attrLength = atLength; + _validAttributeArray[0] = true; } + +protected: + /** + * Constructor + */ + domCg_setarray_type() {} + /** + * Destructor + */ + virtual ~domCg_setarray_type() {} + /** + * Copy Constructor + */ + domCg_setarray_type( const domCg_setarray_type &cpy ) : daeElement(), domCg_setarray_type_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domCg_setarray_type &operator=( const domCg_setarray_type &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCg_setparam.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCg_setparam.h new file mode 100644 index 00000000..2f8c6172 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCg_setparam.h @@ -0,0 +1,194 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domCg_setparam_h__ +#define __domCg_setparam_h__ + +#include +#include + +#include +#include +#include +#include + +/** + * Assigns a new value to a previously defined parameter. + */ +class domCg_setparam_complexType +{ +protected: // Attributes + domCg_identifier attrRef; + xsNCName attrProgram; + +protected: // Elements + domCg_param_typeRef elemCg_param_type; + domCg_setuser_typeRef elemUsertype; + domCg_setarray_typeRef elemArray; + domCg_connect_paramRef elemConnect_param; + /** + * Used to preserve order in elements that do not specify strict sequencing of sub-elements. + */ + daeElementRefArray _contents; + /** + * Used to preserve order in elements that have a complex content model. + */ + daeUIntArray _contentsOrder; + + +public: //Accessors and Mutators + /** + * Gets the ref attribute. + * @return Returns a domCg_identifier of the ref attribute. + */ + domCg_identifier getRef() const { return attrRef; } + /** + * Sets the ref attribute. + * @param atRef The new value for the ref attribute. + */ + void setRef( domCg_identifier atRef ) { attrRef = atRef; } + + /** + * Gets the program attribute. + * @return Returns a xsNCName of the program attribute. + */ + xsNCName getProgram() const { return attrProgram; } + /** + * Sets the program attribute. + * @param atProgram The new value for the program attribute. + */ + void setProgram( xsNCName atProgram ) { *(daeStringRef*)&attrProgram = atProgram; } + + /** + * Gets the cg_param_type element. + * @return a daeSmartRef to the cg_param_type element. + */ + const domCg_param_typeRef getCg_param_type() const { return elemCg_param_type; } + /** + * Gets the usertype element. + * @return a daeSmartRef to the usertype element. + */ + const domCg_setuser_typeRef getUsertype() const { return elemUsertype; } + /** + * Gets the array element. + * @return a daeSmartRef to the array element. + */ + const domCg_setarray_typeRef getArray() const { return elemArray; } + /** + * Gets the connect_param element. + * @return a daeSmartRef to the connect_param element. + */ + const domCg_connect_paramRef getConnect_param() const { return elemConnect_param; } + /** + * Gets the _contents array. + * @return Returns a reference to the _contents element array. + */ + daeElementRefArray &getContents() { return _contents; } + /** + * Gets the _contents array. + * @return Returns a constant reference to the _contents element array. + */ + const daeElementRefArray &getContents() const { return _contents; } + +protected: + /** + * Constructor + */ + domCg_setparam_complexType() : attrRef(), attrProgram(), elemCg_param_type(), elemUsertype(), elemArray(), elemConnect_param() {} + /** + * Destructor + */ + virtual ~domCg_setparam_complexType() {} + /** + * Copy Constructor + */ + domCg_setparam_complexType( const domCg_setparam_complexType &cpy ) { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domCg_setparam_complexType &operator=( const domCg_setparam_complexType &cpy ) { (void)cpy; return *this; } +}; + +/** + * An element of type domCg_setparam_complexType. + */ +class domCg_setparam : public daeElement, public domCg_setparam_complexType +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::CG_SETPARAM; } + +public: //Accessors and Mutators + /** + * Gets the ref attribute. + * @return Returns a domCg_identifier of the ref attribute. + */ + domCg_identifier getRef() const { return attrRef; } + /** + * Sets the ref attribute. + * @param atRef The new value for the ref attribute. + */ + void setRef( domCg_identifier atRef ) { attrRef = atRef; + _validAttributeArray[0] = true; } + + /** + * Gets the program attribute. + * @return Returns a xsNCName of the program attribute. + */ + xsNCName getProgram() const { return attrProgram; } + /** + * Sets the program attribute. + * @param atProgram The new value for the program attribute. + */ + void setProgram( xsNCName atProgram ) { *(daeStringRef*)&attrProgram = atProgram; + _validAttributeArray[1] = true; } + +protected: + /** + * Constructor + */ + domCg_setparam() {} + /** + * Destructor + */ + virtual ~domCg_setparam() {} + /** + * Copy Constructor + */ + domCg_setparam( const domCg_setparam &cpy ) : daeElement(), domCg_setparam_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domCg_setparam &operator=( const domCg_setparam &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCg_setparam_simple.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCg_setparam_simple.h new file mode 100644 index 00000000..3cec00ed --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCg_setparam_simple.h @@ -0,0 +1,138 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domCg_setparam_simple_h__ +#define __domCg_setparam_simple_h__ + +#include +#include + +#include +#include + +class domCg_setparam_simple_complexType +{ +protected: // Attribute + domCg_identifier attrRef; + +protected: // Elements + domFx_annotate_common_Array elemAnnotate_array; + domCg_param_typeRef elemCg_param_type; + +public: //Accessors and Mutators + /** + * Gets the ref attribute. + * @return Returns a domCg_identifier of the ref attribute. + */ + domCg_identifier getRef() const { return attrRef; } + /** + * Sets the ref attribute. + * @param atRef The new value for the ref attribute. + */ + void setRef( domCg_identifier atRef ) { attrRef = atRef; } + + /** + * Gets the annotate element array. + * @return Returns a reference to the array of annotate elements. + */ + domFx_annotate_common_Array &getAnnotate_array() { return elemAnnotate_array; } + /** + * Gets the annotate element array. + * @return Returns a constant reference to the array of annotate elements. + */ + const domFx_annotate_common_Array &getAnnotate_array() const { return elemAnnotate_array; } + /** + * Gets the cg_param_type element. + * @return a daeSmartRef to the cg_param_type element. + */ + const domCg_param_typeRef getCg_param_type() const { return elemCg_param_type; } +protected: + /** + * Constructor + */ + domCg_setparam_simple_complexType() : attrRef(), elemAnnotate_array(), elemCg_param_type() {} + /** + * Destructor + */ + virtual ~domCg_setparam_simple_complexType() {} + /** + * Copy Constructor + */ + domCg_setparam_simple_complexType( const domCg_setparam_simple_complexType &cpy ) { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domCg_setparam_simple_complexType &operator=( const domCg_setparam_simple_complexType &cpy ) { (void)cpy; return *this; } +}; + +/** + * An element of type domCg_setparam_simple_complexType. + */ +class domCg_setparam_simple : public daeElement, public domCg_setparam_simple_complexType +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::CG_SETPARAM_SIMPLE; } + +public: //Accessors and Mutators + /** + * Gets the ref attribute. + * @return Returns a domCg_identifier of the ref attribute. + */ + domCg_identifier getRef() const { return attrRef; } + /** + * Sets the ref attribute. + * @param atRef The new value for the ref attribute. + */ + void setRef( domCg_identifier atRef ) { attrRef = atRef; + _validAttributeArray[0] = true; } + +protected: + /** + * Constructor + */ + domCg_setparam_simple() {} + /** + * Destructor + */ + virtual ~domCg_setparam_simple() {} + /** + * Copy Constructor + */ + domCg_setparam_simple( const domCg_setparam_simple &cpy ) : daeElement(), domCg_setparam_simple_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domCg_setparam_simple &operator=( const domCg_setparam_simple &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCg_setuser_type.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCg_setuser_type.h new file mode 100644 index 00000000..731e7b4e --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCg_setuser_type.h @@ -0,0 +1,233 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domCg_setuser_type_h__ +#define __domCg_setuser_type_h__ + +#include +#include + +#include +#include +#include +#include +#include + +/** + * Creates an instance of a structured class. + */ +class domCg_setuser_type_complexType +{ +protected: // Attributes + domCg_identifier attrName; +/** + * Reference a code or include element which defines the usertype + */ + xsNCName attrSource; + +protected: // Elements + domCg_param_type_Array elemCg_param_type_array; + domCg_setarray_type_Array elemArray_array; + domCg_setuser_type_Array elemUsertype_array; + domCg_connect_param_Array elemConnect_param_array; +/** + * Use a series of these to set the members by name. The ref attribute will + * be relative to the usertype you are in right now. @see domSetparam + */ + domCg_setparam_Array elemSetparam_array; + /** + * Used to preserve order in elements that do not specify strict sequencing of sub-elements. + */ + daeElementRefArray _contents; + /** + * Used to preserve order in elements that have a complex content model. + */ + daeUIntArray _contentsOrder; + + +public: //Accessors and Mutators + /** + * Gets the name attribute. + * @return Returns a domCg_identifier of the name attribute. + */ + domCg_identifier getName() const { return attrName; } + /** + * Sets the name attribute. + * @param atName The new value for the name attribute. + */ + void setName( domCg_identifier atName ) { attrName = atName; } + + /** + * Gets the source attribute. + * @return Returns a xsNCName of the source attribute. + */ + xsNCName getSource() const { return attrSource; } + /** + * Sets the source attribute. + * @param atSource The new value for the source attribute. + */ + void setSource( xsNCName atSource ) { *(daeStringRef*)&attrSource = atSource; } + + /** + * Gets the cg_param_type element array. + * @return Returns a reference to the array of cg_param_type elements. + */ + domCg_param_type_Array &getCg_param_type_array() { return elemCg_param_type_array; } + /** + * Gets the cg_param_type element array. + * @return Returns a constant reference to the array of cg_param_type elements. + */ + const domCg_param_type_Array &getCg_param_type_array() const { return elemCg_param_type_array; } + /** + * Gets the array element array. + * @return Returns a reference to the array of array elements. + */ + domCg_setarray_type_Array &getArray_array() { return elemArray_array; } + /** + * Gets the array element array. + * @return Returns a constant reference to the array of array elements. + */ + const domCg_setarray_type_Array &getArray_array() const { return elemArray_array; } + /** + * Gets the usertype element array. + * @return Returns a reference to the array of usertype elements. + */ + domCg_setuser_type_Array &getUsertype_array() { return elemUsertype_array; } + /** + * Gets the usertype element array. + * @return Returns a constant reference to the array of usertype elements. + */ + const domCg_setuser_type_Array &getUsertype_array() const { return elemUsertype_array; } + /** + * Gets the connect_param element array. + * @return Returns a reference to the array of connect_param elements. + */ + domCg_connect_param_Array &getConnect_param_array() { return elemConnect_param_array; } + /** + * Gets the connect_param element array. + * @return Returns a constant reference to the array of connect_param elements. + */ + const domCg_connect_param_Array &getConnect_param_array() const { return elemConnect_param_array; } + /** + * Gets the setparam element array. + * @return Returns a reference to the array of setparam elements. + */ + domCg_setparam_Array &getSetparam_array() { return elemSetparam_array; } + /** + * Gets the setparam element array. + * @return Returns a constant reference to the array of setparam elements. + */ + const domCg_setparam_Array &getSetparam_array() const { return elemSetparam_array; } + /** + * Gets the _contents array. + * @return Returns a reference to the _contents element array. + */ + daeElementRefArray &getContents() { return _contents; } + /** + * Gets the _contents array. + * @return Returns a constant reference to the _contents element array. + */ + const daeElementRefArray &getContents() const { return _contents; } + +protected: + /** + * Constructor + */ + domCg_setuser_type_complexType() : attrName(), attrSource(), elemCg_param_type_array(), elemArray_array(), elemUsertype_array(), elemConnect_param_array(), elemSetparam_array() {} + /** + * Destructor + */ + virtual ~domCg_setuser_type_complexType() {} + /** + * Copy Constructor + */ + domCg_setuser_type_complexType( const domCg_setuser_type_complexType &cpy ) { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domCg_setuser_type_complexType &operator=( const domCg_setuser_type_complexType &cpy ) { (void)cpy; return *this; } +}; + +/** + * An element of type domCg_setuser_type_complexType. + */ +class domCg_setuser_type : public daeElement, public domCg_setuser_type_complexType +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::CG_SETUSER_TYPE; } + +public: //Accessors and Mutators + /** + * Gets the name attribute. + * @return Returns a domCg_identifier of the name attribute. + */ + domCg_identifier getName() const { return attrName; } + /** + * Sets the name attribute. + * @param atName The new value for the name attribute. + */ + void setName( domCg_identifier atName ) { attrName = atName; + _validAttributeArray[0] = true; } + + /** + * Gets the source attribute. + * @return Returns a xsNCName of the source attribute. + */ + xsNCName getSource() const { return attrSource; } + /** + * Sets the source attribute. + * @param atSource The new value for the source attribute. + */ + void setSource( xsNCName atSource ) { *(daeStringRef*)&attrSource = atSource; + _validAttributeArray[1] = true; } + +protected: + /** + * Constructor + */ + domCg_setuser_type() {} + /** + * Destructor + */ + virtual ~domCg_setuser_type() {} + /** + * Copy Constructor + */ + domCg_setuser_type( const domCg_setuser_type &cpy ) : daeElement(), domCg_setuser_type_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domCg_setuser_type &operator=( const domCg_setuser_type &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCg_surface_type.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCg_surface_type.h new file mode 100644 index 00000000..88dbf7a9 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCg_surface_type.h @@ -0,0 +1,341 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domCg_surface_type_h__ +#define __domCg_surface_type_h__ + +#include +#include + +#include +#include +#include +#include +#include + +/** + * Declares a resource that can be used both as the source for texture samples + * and as the target of a rendering pass. + */ +class domCg_surface_type_complexType : public domFx_surface_common_complexType +{ +public: + class domGenerator; + + typedef daeSmartRef domGeneratorRef; + typedef daeTArray domGenerator_Array; + +/** + * A procedural surface generator for the cg profile. + */ + class domGenerator : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::GENERATOR; } + public: + class domName; + + typedef daeSmartRef domNameRef; + typedef daeTArray domName_Array; + +/** + * The entry symbol for the shader function. + */ + class domName : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::NAME; } + protected: // Attribute + xsNCName attrSource; + + protected: // Value + /** + * The xsNCName value of the text data of this element. + */ + xsNCName _value; + + public: //Accessors and Mutators + /** + * Gets the source attribute. + * @return Returns a xsNCName of the source attribute. + */ + xsNCName getSource() const { return attrSource; } + /** + * Sets the source attribute. + * @param atSource The new value for the source attribute. + */ + void setSource( xsNCName atSource ) { *(daeStringRef*)&attrSource = atSource; + _validAttributeArray[0] = true; } + + /** + * Gets the value of this element. + * @return Returns a xsNCName of the value. + */ + xsNCName getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( xsNCName val ) { *(daeStringRef*)&_value = val; } + + protected: + /** + * Constructor + */ + domName() : attrSource(), _value() {} + /** + * Destructor + */ + virtual ~domName() {} + /** + * Copy Constructor + */ + domName( const domName &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domName &operator=( const domName &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + + + protected: // Elements +/** + * The annotate element allows you to specify an annotation for this generator. + * @see domAnnotate + */ + domFx_annotate_common_Array elemAnnotate_array; +/** + * The code element allows you to embed cg sourcecode for the surface generator. + * @see domCode + */ + domFx_code_profile_Array elemCode_array; +/** + * The include element imports cg source code or precompiled binary shaders + * into the FX Runtime by referencing an external resource. @see domInclude + */ + domFx_include_common_Array elemInclude_array; +/** + * The entry symbol for the shader function. @see domName + */ + domNameRef elemName; +/** + * Assigns a new value to a previously defined parameter. @see domSetparam + */ + domCg_setparam_simple_Array elemSetparam_array; + /** + * Used to preserve order in elements that do not specify strict sequencing of sub-elements. + */ + daeElementRefArray _contents; + /** + * Used to preserve order in elements that have a complex content model. + */ + daeUIntArray _contentsOrder; + + + public: //Accessors and Mutators + /** + * Gets the annotate element array. + * @return Returns a reference to the array of annotate elements. + */ + domFx_annotate_common_Array &getAnnotate_array() { return elemAnnotate_array; } + /** + * Gets the annotate element array. + * @return Returns a constant reference to the array of annotate elements. + */ + const domFx_annotate_common_Array &getAnnotate_array() const { return elemAnnotate_array; } + /** + * Gets the code element array. + * @return Returns a reference to the array of code elements. + */ + domFx_code_profile_Array &getCode_array() { return elemCode_array; } + /** + * Gets the code element array. + * @return Returns a constant reference to the array of code elements. + */ + const domFx_code_profile_Array &getCode_array() const { return elemCode_array; } + /** + * Gets the include element array. + * @return Returns a reference to the array of include elements. + */ + domFx_include_common_Array &getInclude_array() { return elemInclude_array; } + /** + * Gets the include element array. + * @return Returns a constant reference to the array of include elements. + */ + const domFx_include_common_Array &getInclude_array() const { return elemInclude_array; } + /** + * Gets the name element. + * @return a daeSmartRef to the name element. + */ + const domNameRef getName() const { return elemName; } + /** + * Gets the setparam element array. + * @return Returns a reference to the array of setparam elements. + */ + domCg_setparam_simple_Array &getSetparam_array() { return elemSetparam_array; } + /** + * Gets the setparam element array. + * @return Returns a constant reference to the array of setparam elements. + */ + const domCg_setparam_simple_Array &getSetparam_array() const { return elemSetparam_array; } + /** + * Gets the _contents array. + * @return Returns a reference to the _contents element array. + */ + daeElementRefArray &getContents() { return _contents; } + /** + * Gets the _contents array. + * @return Returns a constant reference to the _contents element array. + */ + const daeElementRefArray &getContents() const { return _contents; } + + protected: + /** + * Constructor + */ + domGenerator() : elemAnnotate_array(), elemCode_array(), elemInclude_array(), elemName(), elemSetparam_array() {} + /** + * Destructor + */ + virtual ~domGenerator() {} + /** + * Copy Constructor + */ + domGenerator( const domGenerator &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domGenerator &operator=( const domGenerator &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + + +protected: // Element +/** + * A procedural surface generator for the cg profile. @see domGenerator + */ + domGeneratorRef elemGenerator; + +public: //Accessors and Mutators + /** + * Gets the generator element. + * @return a daeSmartRef to the generator element. + */ + const domGeneratorRef getGenerator() const { return elemGenerator; } +protected: + /** + * Constructor + */ + domCg_surface_type_complexType() : elemGenerator() {} + /** + * Destructor + */ + virtual ~domCg_surface_type_complexType() {} + /** + * Copy Constructor + */ + domCg_surface_type_complexType( const domCg_surface_type_complexType &cpy ) : domFx_surface_common_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domCg_surface_type_complexType &operator=( const domCg_surface_type_complexType &cpy ) { (void)cpy; return *this; } +}; + +/** + * An element of type domCg_surface_type_complexType. + */ +class domCg_surface_type : public daeElement, public domCg_surface_type_complexType +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::CG_SURFACE_TYPE; } +protected: + /** + * Constructor + */ + domCg_surface_type() {} + /** + * Destructor + */ + virtual ~domCg_surface_type() {} + /** + * Copy Constructor + */ + domCg_surface_type( const domCg_surface_type &cpy ) : daeElement(), domCg_surface_type_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domCg_surface_type &operator=( const domCg_surface_type &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domChannel.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domChannel.h new file mode 100644 index 00000000..5e936f56 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domChannel.h @@ -0,0 +1,112 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domChannel_h__ +#define __domChannel_h__ + +#include +#include + + +/** + * The channel element declares an output channel of an animation. + */ +class domChannel : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::CHANNEL; } +protected: // Attributes +/** + * The source attribute indicates the location of the sampler using a URL + * expression. The sampler must be declared within the same document. Required + * attribute. + */ + domURIFragmentType attrSource; +/** + * The target attribute indicates the location of the element bound to the + * output of the sampler. This text string is a path-name following a simple + * syntax described in Address Syntax. Required attribute. + */ + xsToken attrTarget; + + +public: //Accessors and Mutators + /** + * Gets the source attribute. + * @return Returns a domURIFragmentType reference of the source attribute. + */ + domURIFragmentType &getSource() { return attrSource; } + /** + * Gets the source attribute. + * @return Returns a constant domURIFragmentType reference of the source attribute. + */ + const domURIFragmentType &getSource() const { return attrSource; } + /** + * Sets the source attribute. + * @param atSource The new value for the source attribute. + */ + void setSource( const domURIFragmentType &atSource ) { attrSource = atSource; + _validAttributeArray[0] = true; } + + /** + * Gets the target attribute. + * @return Returns a xsToken of the target attribute. + */ + xsToken getTarget() const { return attrTarget; } + /** + * Sets the target attribute. + * @param atTarget The new value for the target attribute. + */ + void setTarget( xsToken atTarget ) { *(daeStringRef*)&attrTarget = atTarget; + _validAttributeArray[1] = true; } + +protected: + /** + * Constructor + */ + domChannel() : attrSource(), attrTarget() {} + /** + * Destructor + */ + virtual ~domChannel() {} + /** + * Copy Constructor + */ + domChannel( const domChannel &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domChannel &operator=( const domChannel &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCommon_color_or_texture_type.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCommon_color_or_texture_type.h new file mode 100644 index 00000000..af694519 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCommon_color_or_texture_type.h @@ -0,0 +1,369 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domCommon_color_or_texture_type_h__ +#define __domCommon_color_or_texture_type_h__ + +#include +#include + +#include + +class domCommon_color_or_texture_type_complexType +{ +public: + class domColor; + + typedef daeSmartRef domColorRef; + typedef daeTArray domColor_Array; + + class domColor : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::COLOR; } + protected: // Attribute + xsNCName attrSid; + + protected: // Value + /** + * The domFx_color_common value of the text data of this element. + */ + domFx_color_common _value; + + public: //Accessors and Mutators + /** + * Gets the sid attribute. + * @return Returns a xsNCName of the sid attribute. + */ + xsNCName getSid() const { return attrSid; } + /** + * Sets the sid attribute. + * @param atSid The new value for the sid attribute. + */ + void setSid( xsNCName atSid ) { *(daeStringRef*)&attrSid = atSid; + _validAttributeArray[0] = true; } + + /** + * Gets the _value array. + * @return Returns a domFx_color_common reference of the _value array. + */ + domFx_color_common &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domFx_color_common reference of the _value array. + */ + const domFx_color_common &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domFx_color_common &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domColor() : attrSid(), _value() {} + /** + * Destructor + */ + virtual ~domColor() {} + /** + * Copy Constructor + */ + domColor( const domColor &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domColor &operator=( const domColor &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domParam; + + typedef daeSmartRef domParamRef; + typedef daeTArray domParam_Array; + + class domParam : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::PARAM; } + protected: // Attribute + xsNCName attrRef; + + + public: //Accessors and Mutators + /** + * Gets the ref attribute. + * @return Returns a xsNCName of the ref attribute. + */ + xsNCName getRef() const { return attrRef; } + /** + * Sets the ref attribute. + * @param atRef The new value for the ref attribute. + */ + void setRef( xsNCName atRef ) { *(daeStringRef*)&attrRef = atRef; + _validAttributeArray[0] = true; } + + protected: + /** + * Constructor + */ + domParam() : attrRef() {} + /** + * Destructor + */ + virtual ~domParam() {} + /** + * Copy Constructor + */ + domParam( const domParam &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domParam &operator=( const domParam &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domTexture; + + typedef daeSmartRef domTextureRef; + typedef daeTArray domTexture_Array; + + class domTexture : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::TEXTURE; } + protected: // Attributes + xsNCName attrTexture; + xsNCName attrTexcoord; + + protected: // Element + domExtraRef elemExtra; + + public: //Accessors and Mutators + /** + * Gets the texture attribute. + * @return Returns a xsNCName of the texture attribute. + */ + xsNCName getTexture() const { return attrTexture; } + /** + * Sets the texture attribute. + * @param atTexture The new value for the texture attribute. + */ + void setTexture( xsNCName atTexture ) { *(daeStringRef*)&attrTexture = atTexture; + _validAttributeArray[0] = true; } + + /** + * Gets the texcoord attribute. + * @return Returns a xsNCName of the texcoord attribute. + */ + xsNCName getTexcoord() const { return attrTexcoord; } + /** + * Sets the texcoord attribute. + * @param atTexcoord The new value for the texcoord attribute. + */ + void setTexcoord( xsNCName atTexcoord ) { *(daeStringRef*)&attrTexcoord = atTexcoord; + _validAttributeArray[1] = true; } + + /** + * Gets the extra element. + * @return a daeSmartRef to the extra element. + */ + const domExtraRef getExtra() const { return elemExtra; } + protected: + /** + * Constructor + */ + domTexture() : attrTexture(), attrTexcoord(), elemExtra() {} + /** + * Destructor + */ + virtual ~domTexture() {} + /** + * Copy Constructor + */ + domTexture( const domTexture &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domTexture &operator=( const domTexture &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + + +protected: // Elements + domColorRef elemColor; + domParamRef elemParam; + domTextureRef elemTexture; + /** + * Used to preserve order in elements that do not specify strict sequencing of sub-elements. + */ + daeElementRefArray _contents; + /** + * Used to preserve order in elements that have a complex content model. + */ + daeUIntArray _contentsOrder; + + +public: //Accessors and Mutators + /** + * Gets the color element. + * @return a daeSmartRef to the color element. + */ + const domColorRef getColor() const { return elemColor; } + /** + * Gets the param element. + * @return a daeSmartRef to the param element. + */ + const domParamRef getParam() const { return elemParam; } + /** + * Gets the texture element. + * @return a daeSmartRef to the texture element. + */ + const domTextureRef getTexture() const { return elemTexture; } + /** + * Gets the _contents array. + * @return Returns a reference to the _contents element array. + */ + daeElementRefArray &getContents() { return _contents; } + /** + * Gets the _contents array. + * @return Returns a constant reference to the _contents element array. + */ + const daeElementRefArray &getContents() const { return _contents; } + +protected: + /** + * Constructor + */ + domCommon_color_or_texture_type_complexType() : elemColor(), elemParam(), elemTexture() {} + /** + * Destructor + */ + virtual ~domCommon_color_or_texture_type_complexType() {} + /** + * Copy Constructor + */ + domCommon_color_or_texture_type_complexType( const domCommon_color_or_texture_type_complexType &cpy ) { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domCommon_color_or_texture_type_complexType &operator=( const domCommon_color_or_texture_type_complexType &cpy ) { (void)cpy; return *this; } +}; + +/** + * An element of type domCommon_color_or_texture_type_complexType. + */ +class domCommon_color_or_texture_type : public daeElement, public domCommon_color_or_texture_type_complexType +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::COMMON_COLOR_OR_TEXTURE_TYPE; } +protected: + /** + * Constructor + */ + domCommon_color_or_texture_type() {} + /** + * Destructor + */ + virtual ~domCommon_color_or_texture_type() {} + /** + * Copy Constructor + */ + domCommon_color_or_texture_type( const domCommon_color_or_texture_type &cpy ) : daeElement(), domCommon_color_or_texture_type_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domCommon_color_or_texture_type &operator=( const domCommon_color_or_texture_type &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCommon_float_or_param_type.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCommon_float_or_param_type.h new file mode 100644 index 00000000..0422f589 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCommon_float_or_param_type.h @@ -0,0 +1,272 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domCommon_float_or_param_type_h__ +#define __domCommon_float_or_param_type_h__ + +#include +#include + + +class domCommon_float_or_param_type_complexType +{ +public: + class domFloat; + + typedef daeSmartRef domFloatRef; + typedef daeTArray domFloat_Array; + + class domFloat : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FLOAT; } + protected: // Attribute + xsNCName attrSid; + + protected: // Value + /** + * The ::domFloat value of the text data of this element. + */ + ::domFloat _value; + + public: //Accessors and Mutators + /** + * Gets the sid attribute. + * @return Returns a xsNCName of the sid attribute. + */ + xsNCName getSid() const { return attrSid; } + /** + * Sets the sid attribute. + * @param atSid The new value for the sid attribute. + */ + void setSid( xsNCName atSid ) { *(daeStringRef*)&attrSid = atSid; + _validAttributeArray[0] = true; } + + /** + * Gets the value of this element. + * @return a ::domFloat of the value. + */ + ::domFloat getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( ::domFloat val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFloat() : attrSid(), _value() {} + /** + * Destructor + */ + virtual ~domFloat() {} + /** + * Copy Constructor + */ + domFloat( const domFloat &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFloat &operator=( const domFloat &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domParam; + + typedef daeSmartRef domParamRef; + typedef daeTArray domParam_Array; + + class domParam : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::PARAM; } + protected: // Attribute + xsNCName attrRef; + + + public: //Accessors and Mutators + /** + * Gets the ref attribute. + * @return Returns a xsNCName of the ref attribute. + */ + xsNCName getRef() const { return attrRef; } + /** + * Sets the ref attribute. + * @param atRef The new value for the ref attribute. + */ + void setRef( xsNCName atRef ) { *(daeStringRef*)&attrRef = atRef; + _validAttributeArray[0] = true; } + + protected: + /** + * Constructor + */ + domParam() : attrRef() {} + /** + * Destructor + */ + virtual ~domParam() {} + /** + * Copy Constructor + */ + domParam( const domParam &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domParam &operator=( const domParam &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + + +protected: // Elements + domFloatRef elemFloat; + domParamRef elemParam; + /** + * Used to preserve order in elements that do not specify strict sequencing of sub-elements. + */ + daeElementRefArray _contents; + /** + * Used to preserve order in elements that have a complex content model. + */ + daeUIntArray _contentsOrder; + + +public: //Accessors and Mutators + /** + * Gets the float element. + * @return a daeSmartRef to the float element. + */ + const domFloatRef getFloat() const { return elemFloat; } + /** + * Gets the param element. + * @return a daeSmartRef to the param element. + */ + const domParamRef getParam() const { return elemParam; } + /** + * Gets the _contents array. + * @return Returns a reference to the _contents element array. + */ + daeElementRefArray &getContents() { return _contents; } + /** + * Gets the _contents array. + * @return Returns a constant reference to the _contents element array. + */ + const daeElementRefArray &getContents() const { return _contents; } + +protected: + /** + * Constructor + */ + domCommon_float_or_param_type_complexType() : elemFloat(), elemParam() {} + /** + * Destructor + */ + virtual ~domCommon_float_or_param_type_complexType() {} + /** + * Copy Constructor + */ + domCommon_float_or_param_type_complexType( const domCommon_float_or_param_type_complexType &cpy ) { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domCommon_float_or_param_type_complexType &operator=( const domCommon_float_or_param_type_complexType &cpy ) { (void)cpy; return *this; } +}; + +/** + * An element of type domCommon_float_or_param_type_complexType. + */ +class domCommon_float_or_param_type : public daeElement, public domCommon_float_or_param_type_complexType +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::COMMON_FLOAT_OR_PARAM_TYPE; } +protected: + /** + * Constructor + */ + domCommon_float_or_param_type() {} + /** + * Destructor + */ + virtual ~domCommon_float_or_param_type() {} + /** + * Copy Constructor + */ + domCommon_float_or_param_type( const domCommon_float_or_param_type &cpy ) : daeElement(), domCommon_float_or_param_type_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domCommon_float_or_param_type &operator=( const domCommon_float_or_param_type &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCommon_newparam_type.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCommon_newparam_type.h new file mode 100644 index 00000000..70da2346 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCommon_newparam_type.h @@ -0,0 +1,540 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domCommon_newparam_type_h__ +#define __domCommon_newparam_type_h__ + +#include +#include + +#include +#include + +class domCommon_newparam_type_complexType +{ +public: + class domSemantic; + + typedef daeSmartRef domSemanticRef; + typedef daeTArray domSemantic_Array; + + class domSemantic : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::SEMANTIC; } + + protected: // Value + /** + * The xsNCName value of the text data of this element. + */ + xsNCName _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return Returns a xsNCName of the value. + */ + xsNCName getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( xsNCName val ) { *(daeStringRef*)&_value = val; } + + protected: + /** + * Constructor + */ + domSemantic() : _value() {} + /** + * Destructor + */ + virtual ~domSemantic() {} + /** + * Copy Constructor + */ + domSemantic( const domSemantic &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domSemantic &operator=( const domSemantic &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFloat; + + typedef daeSmartRef domFloatRef; + typedef daeTArray domFloat_Array; + + class domFloat : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FLOAT; } + + protected: // Value + /** + * The ::domFloat value of the text data of this element. + */ + ::domFloat _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a ::domFloat of the value. + */ + ::domFloat getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( ::domFloat val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFloat() : _value() {} + /** + * Destructor + */ + virtual ~domFloat() {} + /** + * Copy Constructor + */ + domFloat( const domFloat &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFloat &operator=( const domFloat &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFloat2; + + typedef daeSmartRef domFloat2Ref; + typedef daeTArray domFloat2_Array; + + class domFloat2 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FLOAT2; } + + protected: // Value + /** + * The ::domFloat2 value of the text data of this element. + */ + ::domFloat2 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a ::domFloat2 reference of the _value array. + */ + ::domFloat2 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant ::domFloat2 reference of the _value array. + */ + const ::domFloat2 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const ::domFloat2 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFloat2() : _value() {} + /** + * Destructor + */ + virtual ~domFloat2() {} + /** + * Copy Constructor + */ + domFloat2( const domFloat2 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFloat2 &operator=( const domFloat2 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFloat3; + + typedef daeSmartRef domFloat3Ref; + typedef daeTArray domFloat3_Array; + + class domFloat3 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FLOAT3; } + + protected: // Value + /** + * The ::domFloat3 value of the text data of this element. + */ + ::domFloat3 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a ::domFloat3 reference of the _value array. + */ + ::domFloat3 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant ::domFloat3 reference of the _value array. + */ + const ::domFloat3 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const ::domFloat3 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFloat3() : _value() {} + /** + * Destructor + */ + virtual ~domFloat3() {} + /** + * Copy Constructor + */ + domFloat3( const domFloat3 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFloat3 &operator=( const domFloat3 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFloat4; + + typedef daeSmartRef domFloat4Ref; + typedef daeTArray domFloat4_Array; + + class domFloat4 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FLOAT4; } + + protected: // Value + /** + * The ::domFloat4 value of the text data of this element. + */ + ::domFloat4 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a ::domFloat4 reference of the _value array. + */ + ::domFloat4 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant ::domFloat4 reference of the _value array. + */ + const ::domFloat4 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const ::domFloat4 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFloat4() : _value() {} + /** + * Destructor + */ + virtual ~domFloat4() {} + /** + * Copy Constructor + */ + domFloat4( const domFloat4 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFloat4 &operator=( const domFloat4 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + +protected: // Attribute +/** + * The sid attribute is a text string value containing the sub-identifier + * of this element. This value must be unique within the scope of the parent + * element. Optional attribute. + */ + xsNCName attrSid; + +protected: // Elements + domSemanticRef elemSemantic; + domFloatRef elemFloat; + domFloat2Ref elemFloat2; + domFloat3Ref elemFloat3; + domFloat4Ref elemFloat4; + domFx_surface_commonRef elemSurface; + domFx_sampler2D_commonRef elemSampler2D; + /** + * Used to preserve order in elements that do not specify strict sequencing of sub-elements. + */ + daeElementRefArray _contents; + /** + * Used to preserve order in elements that have a complex content model. + */ + daeUIntArray _contentsOrder; + + +public: //Accessors and Mutators + /** + * Gets the sid attribute. + * @return Returns a xsNCName of the sid attribute. + */ + xsNCName getSid() const { return attrSid; } + /** + * Sets the sid attribute. + * @param atSid The new value for the sid attribute. + */ + void setSid( xsNCName atSid ) { *(daeStringRef*)&attrSid = atSid; } + + /** + * Gets the semantic element. + * @return a daeSmartRef to the semantic element. + */ + const domSemanticRef getSemantic() const { return elemSemantic; } + /** + * Gets the float element. + * @return a daeSmartRef to the float element. + */ + const domFloatRef getFloat() const { return elemFloat; } + /** + * Gets the float2 element. + * @return a daeSmartRef to the float2 element. + */ + const domFloat2Ref getFloat2() const { return elemFloat2; } + /** + * Gets the float3 element. + * @return a daeSmartRef to the float3 element. + */ + const domFloat3Ref getFloat3() const { return elemFloat3; } + /** + * Gets the float4 element. + * @return a daeSmartRef to the float4 element. + */ + const domFloat4Ref getFloat4() const { return elemFloat4; } + /** + * Gets the surface element. + * @return a daeSmartRef to the surface element. + */ + const domFx_surface_commonRef getSurface() const { return elemSurface; } + /** + * Gets the sampler2D element. + * @return a daeSmartRef to the sampler2D element. + */ + const domFx_sampler2D_commonRef getSampler2D() const { return elemSampler2D; } + /** + * Gets the _contents array. + * @return Returns a reference to the _contents element array. + */ + daeElementRefArray &getContents() { return _contents; } + /** + * Gets the _contents array. + * @return Returns a constant reference to the _contents element array. + */ + const daeElementRefArray &getContents() const { return _contents; } + +protected: + /** + * Constructor + */ + domCommon_newparam_type_complexType() : attrSid(), elemSemantic(), elemFloat(), elemFloat2(), elemFloat3(), elemFloat4(), elemSurface(), elemSampler2D() {} + /** + * Destructor + */ + virtual ~domCommon_newparam_type_complexType() {} + /** + * Copy Constructor + */ + domCommon_newparam_type_complexType( const domCommon_newparam_type_complexType &cpy ) { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domCommon_newparam_type_complexType &operator=( const domCommon_newparam_type_complexType &cpy ) { (void)cpy; return *this; } +}; + +/** + * An element of type domCommon_newparam_type_complexType. + */ +class domCommon_newparam_type : public daeElement, public domCommon_newparam_type_complexType +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::COMMON_NEWPARAM_TYPE; } + +public: //Accessors and Mutators + /** + * Gets the sid attribute. + * @return Returns a xsNCName of the sid attribute. + */ + xsNCName getSid() const { return attrSid; } + /** + * Sets the sid attribute. + * @param atSid The new value for the sid attribute. + */ + void setSid( xsNCName atSid ) { *(daeStringRef*)&attrSid = atSid; + _validAttributeArray[0] = true; } + +protected: + /** + * Constructor + */ + domCommon_newparam_type() {} + /** + * Destructor + */ + virtual ~domCommon_newparam_type() {} + /** + * Copy Constructor + */ + domCommon_newparam_type( const domCommon_newparam_type &cpy ) : daeElement(), domCommon_newparam_type_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domCommon_newparam_type &operator=( const domCommon_newparam_type &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCommon_transparent_type.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCommon_transparent_type.h new file mode 100644 index 00000000..53819a3a --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCommon_transparent_type.h @@ -0,0 +1,85 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domCommon_transparent_type_h__ +#define __domCommon_transparent_type_h__ + +#include +#include + +#include + +/** + * An element of type domCommon_transparent_type_complexType. + */ +class domCommon_transparent_type : public domCommon_color_or_texture_type +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::COMMON_TRANSPARENT_TYPE; } + +protected: // Attribute + domFx_opaque_enum attrOpaque; + +public: //Accessors and Mutators + /** + * Gets the opaque attribute. + * @return Returns a domFx_opaque_enum of the opaque attribute. + */ + domFx_opaque_enum getOpaque() const { return attrOpaque; } + /** + * Sets the opaque attribute. + * @param atOpaque The new value for the opaque attribute. + */ + void setOpaque( domFx_opaque_enum atOpaque ) { attrOpaque = atOpaque; + _validAttributeArray[0] = true; } + +protected: + /** + * Constructor + */ + domCommon_transparent_type() {} + /** + * Destructor + */ + virtual ~domCommon_transparent_type() {} + /** + * Copy Constructor + */ + domCommon_transparent_type( const domCommon_transparent_type &cpy ) : domCommon_color_or_texture_type() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domCommon_transparent_type &operator=( const domCommon_transparent_type &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domConstants.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domConstants.h new file mode 100644 index 00000000..15f05709 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domConstants.h @@ -0,0 +1,1093 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#ifndef __DOM_CONSTANTS_H__ +#define __DOM_CONSTANTS_H__ + +#include + +extern DLLSPEC daeString COLLADA_VERSION; +extern DLLSPEC daeString COLLADA_NAMESPACE; +extern DLLSPEC daeString COMMON_PROFILE_INPUT_BINORMAL; +extern DLLSPEC daeString COMMON_PROFILE_INPUT_COLOR; +extern DLLSPEC daeString COMMON_PROFILE_INPUT_CONTINUITY; +extern DLLSPEC daeString COMMON_PROFILE_INPUT_IMAGE; +extern DLLSPEC daeString COMMON_PROFILE_INPUT_IN_TANGENT; +extern DLLSPEC daeString COMMON_PROFILE_INPUT_INPUT; +extern DLLSPEC daeString COMMON_PROFILE_INPUT_INTERPOLATION; +extern DLLSPEC daeString COMMON_PROFILE_INPUT_INV_BIND_MATRIX; +extern DLLSPEC daeString COMMON_PROFILE_INPUT_JOINT; +extern DLLSPEC daeString COMMON_PROFILE_INPUT_LINEAR_STEPS; +extern DLLSPEC daeString COMMON_PROFILE_INPUT_MORPH_TARGET; +extern DLLSPEC daeString COMMON_PROFILE_INPUT_MORPH_WEIGHT; +extern DLLSPEC daeString COMMON_PROFILE_INPUT_NORMAL; +extern DLLSPEC daeString COMMON_PROFILE_INPUT_OUTPUT; +extern DLLSPEC daeString COMMON_PROFILE_INPUT_OUT_TANGENT; +extern DLLSPEC daeString COMMON_PROFILE_INPUT_POSITION; +extern DLLSPEC daeString COMMON_PROFILE_INPUT_TANGENT; +extern DLLSPEC daeString COMMON_PROFILE_INPUT_TEXBINORMAL; +extern DLLSPEC daeString COMMON_PROFILE_INPUT_TEXCOORD; +extern DLLSPEC daeString COMMON_PROFILE_INPUT_TEXTANGENT; +extern DLLSPEC daeString COMMON_PROFILE_INPUT_UV; +extern DLLSPEC daeString COMMON_PROFILE_INPUT_VERTEX; +extern DLLSPEC daeString COMMON_PROFILE_INPUT_WEIGHT; + +extern DLLSPEC daeString COMMON_PROFILE_PARAM_A; +extern DLLSPEC daeString COMMON_PROFILE_PARAM_ANGLE; +extern DLLSPEC daeString COMMON_PROFILE_PARAM_B; +extern DLLSPEC daeString COMMON_PROFILE_PARAM_DOUBLE_SIDED; +extern DLLSPEC daeString COMMON_PROFILE_PARAM_G; +extern DLLSPEC daeString COMMON_PROFILE_PARAM_P; +extern DLLSPEC daeString COMMON_PROFILE_PARAM_Q; +extern DLLSPEC daeString COMMON_PROFILE_PARAM_R; +extern DLLSPEC daeString COMMON_PROFILE_PARAM_S; +extern DLLSPEC daeString COMMON_PROFILE_PARAM_T; +extern DLLSPEC daeString COMMON_PROFILE_PARAM_TIME; +extern DLLSPEC daeString COMMON_PROFILE_PARAM_U; +extern DLLSPEC daeString COMMON_PROFILE_PARAM_V; +extern DLLSPEC daeString COMMON_PROFILE_PARAM_W; +extern DLLSPEC daeString COMMON_PROFILE_PARAM_X; +extern DLLSPEC daeString COMMON_PROFILE_PARAM_Y; +extern DLLSPEC daeString COMMON_PROFILE_PARAM_Z; + + +extern DLLSPEC daeString COLLADA_TYPE_INPUTGLOBAL; +extern DLLSPEC daeString COLLADA_TYPE_INPUTLOCAL; +extern DLLSPEC daeString COLLADA_TYPE_INPUTLOCALOFFSET; +extern DLLSPEC daeString COLLADA_TYPE_INSTANCEWITHEXTRA; +extern DLLSPEC daeString COLLADA_TYPE_TARGETABLEFLOAT; +extern DLLSPEC daeString COLLADA_TYPE_TARGETABLEFLOAT3; +extern DLLSPEC daeString COLLADA_TYPE_FX_SURFACE_FORMAT_HINT_COMMON; +extern DLLSPEC daeString COLLADA_TYPE_CHANNELS; +extern DLLSPEC daeString COLLADA_TYPE_RANGE; +extern DLLSPEC daeString COLLADA_TYPE_PRECISION; +extern DLLSPEC daeString COLLADA_TYPE_OPTION; +extern DLLSPEC daeString COLLADA_TYPE_FX_SURFACE_INIT_PLANAR_COMMON; +extern DLLSPEC daeString COLLADA_TYPE_ALL; +extern DLLSPEC daeString COLLADA_TYPE_FX_SURFACE_INIT_VOLUME_COMMON; +extern DLLSPEC daeString COLLADA_TYPE_PRIMARY; +extern DLLSPEC daeString COLLADA_TYPE_FX_SURFACE_INIT_CUBE_COMMON; +extern DLLSPEC daeString COLLADA_TYPE_ORDER; +extern DLLSPEC daeString COLLADA_TYPE_FACE; +extern DLLSPEC daeString COLLADA_TYPE_FX_SURFACE_INIT_FROM_COMMON; +extern DLLSPEC daeString COLLADA_TYPE_FX_SURFACE_COMMON; +extern DLLSPEC daeString COLLADA_TYPE_FORMAT; +extern DLLSPEC daeString COLLADA_TYPE_SIZE; +extern DLLSPEC daeString COLLADA_TYPE_VIEWPORT_RATIO; +extern DLLSPEC daeString COLLADA_TYPE_MIP_LEVELS; +extern DLLSPEC daeString COLLADA_TYPE_MIPMAP_GENERATE; +extern DLLSPEC daeString COLLADA_TYPE_FX_SAMPLER1D_COMMON; +extern DLLSPEC daeString COLLADA_TYPE_SOURCE; +extern DLLSPEC daeString COLLADA_TYPE_WRAP_S; +extern DLLSPEC daeString COLLADA_TYPE_MINFILTER; +extern DLLSPEC daeString COLLADA_TYPE_MAGFILTER; +extern DLLSPEC daeString COLLADA_TYPE_MIPFILTER; +extern DLLSPEC daeString COLLADA_TYPE_BORDER_COLOR; +extern DLLSPEC daeString COLLADA_TYPE_MIPMAP_MAXLEVEL; +extern DLLSPEC daeString COLLADA_TYPE_MIPMAP_BIAS; +extern DLLSPEC daeString COLLADA_TYPE_FX_SAMPLER2D_COMMON; +extern DLLSPEC daeString COLLADA_TYPE_WRAP_T; +extern DLLSPEC daeString COLLADA_TYPE_FX_SAMPLER3D_COMMON; +extern DLLSPEC daeString COLLADA_TYPE_WRAP_P; +extern DLLSPEC daeString COLLADA_TYPE_FX_SAMPLERCUBE_COMMON; +extern DLLSPEC daeString COLLADA_TYPE_FX_SAMPLERRECT_COMMON; +extern DLLSPEC daeString COLLADA_TYPE_FX_SAMPLERDEPTH_COMMON; +extern DLLSPEC daeString COLLADA_TYPE_FX_COLORTARGET_COMMON; +extern DLLSPEC daeString COLLADA_TYPE_FX_DEPTHTARGET_COMMON; +extern DLLSPEC daeString COLLADA_TYPE_FX_STENCILTARGET_COMMON; +extern DLLSPEC daeString COLLADA_TYPE_FX_CLEARCOLOR_COMMON; +extern DLLSPEC daeString COLLADA_TYPE_FX_CLEARDEPTH_COMMON; +extern DLLSPEC daeString COLLADA_TYPE_FX_CLEARSTENCIL_COMMON; +extern DLLSPEC daeString COLLADA_TYPE_FX_ANNOTATE_COMMON; +extern DLLSPEC daeString COLLADA_TYPE_FX_INCLUDE_COMMON; +extern DLLSPEC daeString COLLADA_TYPE_FX_NEWPARAM_COMMON; +extern DLLSPEC daeString COLLADA_TYPE_SEMANTIC; +extern DLLSPEC daeString COLLADA_TYPE_MODIFIER; +extern DLLSPEC daeString COLLADA_TYPE_FX_CODE_PROFILE; +extern DLLSPEC daeString COLLADA_TYPE_GL_SAMPLER1D; +extern DLLSPEC daeString COLLADA_TYPE_GL_SAMPLER2D; +extern DLLSPEC daeString COLLADA_TYPE_GL_SAMPLER3D; +extern DLLSPEC daeString COLLADA_TYPE_GL_SAMPLERCUBE; +extern DLLSPEC daeString COLLADA_TYPE_GL_SAMPLERRECT; +extern DLLSPEC daeString COLLADA_TYPE_GL_SAMPLERDEPTH; +extern DLLSPEC daeString COLLADA_TYPE_GLSL_NEWARRAY_TYPE; +extern DLLSPEC daeString COLLADA_TYPE_GLSL_SETARRAY_TYPE; +extern DLLSPEC daeString COLLADA_TYPE_GLSL_SURFACE_TYPE; +extern DLLSPEC daeString COLLADA_TYPE_GENERATOR; +extern DLLSPEC daeString COLLADA_TYPE_NAME; +extern DLLSPEC daeString COLLADA_TYPE_GLSL_NEWPARAM; +extern DLLSPEC daeString COLLADA_TYPE_GLSL_SETPARAM_SIMPLE; +extern DLLSPEC daeString COLLADA_TYPE_GLSL_SETPARAM; +extern DLLSPEC daeString COLLADA_TYPE_COMMON_FLOAT_OR_PARAM_TYPE; +extern DLLSPEC daeString COLLADA_TYPE_FLOAT; +extern DLLSPEC daeString COLLADA_TYPE_PARAM; +extern DLLSPEC daeString COLLADA_TYPE_COMMON_COLOR_OR_TEXTURE_TYPE; +extern DLLSPEC daeString COLLADA_TYPE_COLOR; +extern DLLSPEC daeString COLLADA_TYPE_TEXTURE; +extern DLLSPEC daeString COLLADA_TYPE_COMMON_TRANSPARENT_TYPE; +extern DLLSPEC daeString COLLADA_TYPE_COMMON_NEWPARAM_TYPE; +extern DLLSPEC daeString COLLADA_TYPE_FLOAT2; +extern DLLSPEC daeString COLLADA_TYPE_FLOAT3; +extern DLLSPEC daeString COLLADA_TYPE_FLOAT4; +extern DLLSPEC daeString COLLADA_TYPE_CG_SAMPLER1D; +extern DLLSPEC daeString COLLADA_TYPE_CG_SAMPLER2D; +extern DLLSPEC daeString COLLADA_TYPE_CG_SAMPLER3D; +extern DLLSPEC daeString COLLADA_TYPE_CG_SAMPLERCUBE; +extern DLLSPEC daeString COLLADA_TYPE_CG_SAMPLERRECT; +extern DLLSPEC daeString COLLADA_TYPE_CG_SAMPLERDEPTH; +extern DLLSPEC daeString COLLADA_TYPE_CG_CONNECT_PARAM; +extern DLLSPEC daeString COLLADA_TYPE_CG_NEWARRAY_TYPE; +extern DLLSPEC daeString COLLADA_TYPE_CG_SETARRAY_TYPE; +extern DLLSPEC daeString COLLADA_TYPE_CG_SETUSER_TYPE; +extern DLLSPEC daeString COLLADA_TYPE_CG_SURFACE_TYPE; +extern DLLSPEC daeString COLLADA_TYPE_CG_NEWPARAM; +extern DLLSPEC daeString COLLADA_TYPE_CG_SETPARAM_SIMPLE; +extern DLLSPEC daeString COLLADA_TYPE_CG_SETPARAM; +extern DLLSPEC daeString COLLADA_TYPE_GLES_TEXTURE_CONSTANT_TYPE; +extern DLLSPEC daeString COLLADA_TYPE_GLES_TEXENV_COMMAND_TYPE; +extern DLLSPEC daeString COLLADA_TYPE_GLES_TEXCOMBINER_ARGUMENTRGB_TYPE; +extern DLLSPEC daeString COLLADA_TYPE_GLES_TEXCOMBINER_ARGUMENTALPHA_TYPE; +extern DLLSPEC daeString COLLADA_TYPE_GLES_TEXCOMBINER_COMMANDRGB_TYPE; +extern DLLSPEC daeString COLLADA_TYPE_GLES_TEXCOMBINER_COMMANDALPHA_TYPE; +extern DLLSPEC daeString COLLADA_TYPE_GLES_TEXCOMBINER_COMMAND_TYPE; +extern DLLSPEC daeString COLLADA_TYPE_GLES_TEXTURE_PIPELINE; +extern DLLSPEC daeString COLLADA_TYPE_GLES_TEXTURE_UNIT; +extern DLLSPEC daeString COLLADA_TYPE_SURFACE; +extern DLLSPEC daeString COLLADA_TYPE_SAMPLER_STATE; +extern DLLSPEC daeString COLLADA_TYPE_TEXCOORD; +extern DLLSPEC daeString COLLADA_TYPE_GLES_SAMPLER_STATE; +extern DLLSPEC daeString COLLADA_TYPE_GLES_NEWPARAM; +extern DLLSPEC daeString COLLADA_TYPE_FX_SURFACE_INIT_COMMON; +extern DLLSPEC daeString COLLADA_TYPE_INIT_AS_NULL; +extern DLLSPEC daeString COLLADA_TYPE_INIT_AS_TARGET; +extern DLLSPEC daeString COLLADA_TYPE_FX_ANNOTATE_TYPE_COMMON; +extern DLLSPEC daeString COLLADA_TYPE_BOOL; +extern DLLSPEC daeString COLLADA_TYPE_BOOL2; +extern DLLSPEC daeString COLLADA_TYPE_BOOL3; +extern DLLSPEC daeString COLLADA_TYPE_BOOL4; +extern DLLSPEC daeString COLLADA_TYPE_INT; +extern DLLSPEC daeString COLLADA_TYPE_INT2; +extern DLLSPEC daeString COLLADA_TYPE_INT3; +extern DLLSPEC daeString COLLADA_TYPE_INT4; +extern DLLSPEC daeString COLLADA_TYPE_FLOAT2X2; +extern DLLSPEC daeString COLLADA_TYPE_FLOAT3X3; +extern DLLSPEC daeString COLLADA_TYPE_FLOAT4X4; +extern DLLSPEC daeString COLLADA_TYPE_STRING; +extern DLLSPEC daeString COLLADA_TYPE_FX_BASIC_TYPE_COMMON; +extern DLLSPEC daeString COLLADA_TYPE_FLOAT1X1; +extern DLLSPEC daeString COLLADA_TYPE_FLOAT1X2; +extern DLLSPEC daeString COLLADA_TYPE_FLOAT1X3; +extern DLLSPEC daeString COLLADA_TYPE_FLOAT1X4; +extern DLLSPEC daeString COLLADA_TYPE_FLOAT2X1; +extern DLLSPEC daeString COLLADA_TYPE_FLOAT2X3; +extern DLLSPEC daeString COLLADA_TYPE_FLOAT2X4; +extern DLLSPEC daeString COLLADA_TYPE_FLOAT3X1; +extern DLLSPEC daeString COLLADA_TYPE_FLOAT3X2; +extern DLLSPEC daeString COLLADA_TYPE_FLOAT3X4; +extern DLLSPEC daeString COLLADA_TYPE_FLOAT4X1; +extern DLLSPEC daeString COLLADA_TYPE_FLOAT4X2; +extern DLLSPEC daeString COLLADA_TYPE_FLOAT4X3; +extern DLLSPEC daeString COLLADA_TYPE_ENUM; +extern DLLSPEC daeString COLLADA_TYPE_GL_PIPELINE_SETTINGS; +extern DLLSPEC daeString COLLADA_TYPE_ALPHA_FUNC; +extern DLLSPEC daeString COLLADA_TYPE_FUNC; +extern DLLSPEC daeString COLLADA_TYPE_VALUE; +extern DLLSPEC daeString COLLADA_TYPE_BLEND_FUNC; +extern DLLSPEC daeString COLLADA_TYPE_SRC; +extern DLLSPEC daeString COLLADA_TYPE_DEST; +extern DLLSPEC daeString COLLADA_TYPE_BLEND_FUNC_SEPARATE; +extern DLLSPEC daeString COLLADA_TYPE_SRC_RGB; +extern DLLSPEC daeString COLLADA_TYPE_DEST_RGB; +extern DLLSPEC daeString COLLADA_TYPE_SRC_ALPHA; +extern DLLSPEC daeString COLLADA_TYPE_DEST_ALPHA; +extern DLLSPEC daeString COLLADA_TYPE_BLEND_EQUATION; +extern DLLSPEC daeString COLLADA_TYPE_BLEND_EQUATION_SEPARATE; +extern DLLSPEC daeString COLLADA_TYPE_RGB; +extern DLLSPEC daeString COLLADA_TYPE_ALPHA; +extern DLLSPEC daeString COLLADA_TYPE_COLOR_MATERIAL; +extern DLLSPEC daeString COLLADA_TYPE_MODE; +extern DLLSPEC daeString COLLADA_TYPE_CULL_FACE; +extern DLLSPEC daeString COLLADA_TYPE_DEPTH_FUNC; +extern DLLSPEC daeString COLLADA_TYPE_FOG_MODE; +extern DLLSPEC daeString COLLADA_TYPE_FOG_COORD_SRC; +extern DLLSPEC daeString COLLADA_TYPE_FRONT_FACE; +extern DLLSPEC daeString COLLADA_TYPE_LIGHT_MODEL_COLOR_CONTROL; +extern DLLSPEC daeString COLLADA_TYPE_LOGIC_OP; +extern DLLSPEC daeString COLLADA_TYPE_POLYGON_MODE; +extern DLLSPEC daeString COLLADA_TYPE_SHADE_MODEL; +extern DLLSPEC daeString COLLADA_TYPE_STENCIL_FUNC; +extern DLLSPEC daeString COLLADA_TYPE_REF; +extern DLLSPEC daeString COLLADA_TYPE_MASK; +extern DLLSPEC daeString COLLADA_TYPE_STENCIL_OP; +extern DLLSPEC daeString COLLADA_TYPE_FAIL; +extern DLLSPEC daeString COLLADA_TYPE_ZFAIL; +extern DLLSPEC daeString COLLADA_TYPE_ZPASS; +extern DLLSPEC daeString COLLADA_TYPE_STENCIL_FUNC_SEPARATE; +extern DLLSPEC daeString COLLADA_TYPE_FRONT; +extern DLLSPEC daeString COLLADA_TYPE_BACK; +extern DLLSPEC daeString COLLADA_TYPE_STENCIL_OP_SEPARATE; +extern DLLSPEC daeString COLLADA_TYPE_STENCIL_MASK_SEPARATE; +extern DLLSPEC daeString COLLADA_TYPE_LIGHT_ENABLE; +extern DLLSPEC daeString COLLADA_TYPE_LIGHT_AMBIENT; +extern DLLSPEC daeString COLLADA_TYPE_LIGHT_DIFFUSE; +extern DLLSPEC daeString COLLADA_TYPE_LIGHT_SPECULAR; +extern DLLSPEC daeString COLLADA_TYPE_LIGHT_POSITION; +extern DLLSPEC daeString COLLADA_TYPE_LIGHT_CONSTANT_ATTENUATION; +extern DLLSPEC daeString COLLADA_TYPE_LIGHT_LINEAR_ATTENUATION; +extern DLLSPEC daeString COLLADA_TYPE_LIGHT_QUADRATIC_ATTENUATION; +extern DLLSPEC daeString COLLADA_TYPE_LIGHT_SPOT_CUTOFF; +extern DLLSPEC daeString COLLADA_TYPE_LIGHT_SPOT_DIRECTION; +extern DLLSPEC daeString COLLADA_TYPE_LIGHT_SPOT_EXPONENT; +extern DLLSPEC daeString COLLADA_TYPE_TEXTURE1D; +extern DLLSPEC daeString COLLADA_TYPE_TEXTURE2D; +extern DLLSPEC daeString COLLADA_TYPE_TEXTURE3D; +extern DLLSPEC daeString COLLADA_TYPE_TEXTURECUBE; +extern DLLSPEC daeString COLLADA_TYPE_TEXTURERECT; +extern DLLSPEC daeString COLLADA_TYPE_TEXTUREDEPTH; +extern DLLSPEC daeString COLLADA_TYPE_TEXTURE1D_ENABLE; +extern DLLSPEC daeString COLLADA_TYPE_TEXTURE2D_ENABLE; +extern DLLSPEC daeString COLLADA_TYPE_TEXTURE3D_ENABLE; +extern DLLSPEC daeString COLLADA_TYPE_TEXTURECUBE_ENABLE; +extern DLLSPEC daeString COLLADA_TYPE_TEXTURERECT_ENABLE; +extern DLLSPEC daeString COLLADA_TYPE_TEXTUREDEPTH_ENABLE; +extern DLLSPEC daeString COLLADA_TYPE_TEXTURE_ENV_COLOR; +extern DLLSPEC daeString COLLADA_TYPE_TEXTURE_ENV_MODE; +extern DLLSPEC daeString COLLADA_TYPE_CLIP_PLANE; +extern DLLSPEC daeString COLLADA_TYPE_CLIP_PLANE_ENABLE; +extern DLLSPEC daeString COLLADA_TYPE_BLEND_COLOR; +extern DLLSPEC daeString COLLADA_TYPE_CLEAR_COLOR; +extern DLLSPEC daeString COLLADA_TYPE_CLEAR_STENCIL; +extern DLLSPEC daeString COLLADA_TYPE_CLEAR_DEPTH; +extern DLLSPEC daeString COLLADA_TYPE_COLOR_MASK; +extern DLLSPEC daeString COLLADA_TYPE_DEPTH_BOUNDS; +extern DLLSPEC daeString COLLADA_TYPE_DEPTH_MASK; +extern DLLSPEC daeString COLLADA_TYPE_DEPTH_RANGE; +extern DLLSPEC daeString COLLADA_TYPE_FOG_DENSITY; +extern DLLSPEC daeString COLLADA_TYPE_FOG_START; +extern DLLSPEC daeString COLLADA_TYPE_FOG_END; +extern DLLSPEC daeString COLLADA_TYPE_FOG_COLOR; +extern DLLSPEC daeString COLLADA_TYPE_LIGHT_MODEL_AMBIENT; +extern DLLSPEC daeString COLLADA_TYPE_LIGHTING_ENABLE; +extern DLLSPEC daeString COLLADA_TYPE_LINE_STIPPLE; +extern DLLSPEC daeString COLLADA_TYPE_LINE_WIDTH; +extern DLLSPEC daeString COLLADA_TYPE_MATERIAL_AMBIENT; +extern DLLSPEC daeString COLLADA_TYPE_MATERIAL_DIFFUSE; +extern DLLSPEC daeString COLLADA_TYPE_MATERIAL_EMISSION; +extern DLLSPEC daeString COLLADA_TYPE_MATERIAL_SHININESS; +extern DLLSPEC daeString COLLADA_TYPE_MATERIAL_SPECULAR; +extern DLLSPEC daeString COLLADA_TYPE_MODEL_VIEW_MATRIX; +extern DLLSPEC daeString COLLADA_TYPE_POINT_DISTANCE_ATTENUATION; +extern DLLSPEC daeString COLLADA_TYPE_POINT_FADE_THRESHOLD_SIZE; +extern DLLSPEC daeString COLLADA_TYPE_POINT_SIZE; +extern DLLSPEC daeString COLLADA_TYPE_POINT_SIZE_MIN; +extern DLLSPEC daeString COLLADA_TYPE_POINT_SIZE_MAX; +extern DLLSPEC daeString COLLADA_TYPE_POLYGON_OFFSET; +extern DLLSPEC daeString COLLADA_TYPE_PROJECTION_MATRIX; +extern DLLSPEC daeString COLLADA_TYPE_SCISSOR; +extern DLLSPEC daeString COLLADA_TYPE_STENCIL_MASK; +extern DLLSPEC daeString COLLADA_TYPE_ALPHA_TEST_ENABLE; +extern DLLSPEC daeString COLLADA_TYPE_AUTO_NORMAL_ENABLE; +extern DLLSPEC daeString COLLADA_TYPE_BLEND_ENABLE; +extern DLLSPEC daeString COLLADA_TYPE_COLOR_LOGIC_OP_ENABLE; +extern DLLSPEC daeString COLLADA_TYPE_COLOR_MATERIAL_ENABLE; +extern DLLSPEC daeString COLLADA_TYPE_CULL_FACE_ENABLE; +extern DLLSPEC daeString COLLADA_TYPE_DEPTH_BOUNDS_ENABLE; +extern DLLSPEC daeString COLLADA_TYPE_DEPTH_CLAMP_ENABLE; +extern DLLSPEC daeString COLLADA_TYPE_DEPTH_TEST_ENABLE; +extern DLLSPEC daeString COLLADA_TYPE_DITHER_ENABLE; +extern DLLSPEC daeString COLLADA_TYPE_FOG_ENABLE; +extern DLLSPEC daeString COLLADA_TYPE_LIGHT_MODEL_LOCAL_VIEWER_ENABLE; +extern DLLSPEC daeString COLLADA_TYPE_LIGHT_MODEL_TWO_SIDE_ENABLE; +extern DLLSPEC daeString COLLADA_TYPE_LINE_SMOOTH_ENABLE; +extern DLLSPEC daeString COLLADA_TYPE_LINE_STIPPLE_ENABLE; +extern DLLSPEC daeString COLLADA_TYPE_LOGIC_OP_ENABLE; +extern DLLSPEC daeString COLLADA_TYPE_MULTISAMPLE_ENABLE; +extern DLLSPEC daeString COLLADA_TYPE_NORMALIZE_ENABLE; +extern DLLSPEC daeString COLLADA_TYPE_POINT_SMOOTH_ENABLE; +extern DLLSPEC daeString COLLADA_TYPE_POLYGON_OFFSET_FILL_ENABLE; +extern DLLSPEC daeString COLLADA_TYPE_POLYGON_OFFSET_LINE_ENABLE; +extern DLLSPEC daeString COLLADA_TYPE_POLYGON_OFFSET_POINT_ENABLE; +extern DLLSPEC daeString COLLADA_TYPE_POLYGON_SMOOTH_ENABLE; +extern DLLSPEC daeString COLLADA_TYPE_POLYGON_STIPPLE_ENABLE; +extern DLLSPEC daeString COLLADA_TYPE_RESCALE_NORMAL_ENABLE; +extern DLLSPEC daeString COLLADA_TYPE_SAMPLE_ALPHA_TO_COVERAGE_ENABLE; +extern DLLSPEC daeString COLLADA_TYPE_SAMPLE_ALPHA_TO_ONE_ENABLE; +extern DLLSPEC daeString COLLADA_TYPE_SAMPLE_COVERAGE_ENABLE; +extern DLLSPEC daeString COLLADA_TYPE_SCISSOR_TEST_ENABLE; +extern DLLSPEC daeString COLLADA_TYPE_STENCIL_TEST_ENABLE; +extern DLLSPEC daeString COLLADA_TYPE_GLSL_PARAM_TYPE; +extern DLLSPEC daeString COLLADA_TYPE_CG_PARAM_TYPE; +extern DLLSPEC daeString COLLADA_TYPE_BOOL1; +extern DLLSPEC daeString COLLADA_TYPE_BOOL1X1; +extern DLLSPEC daeString COLLADA_TYPE_BOOL1X2; +extern DLLSPEC daeString COLLADA_TYPE_BOOL1X3; +extern DLLSPEC daeString COLLADA_TYPE_BOOL1X4; +extern DLLSPEC daeString COLLADA_TYPE_BOOL2X1; +extern DLLSPEC daeString COLLADA_TYPE_BOOL2X2; +extern DLLSPEC daeString COLLADA_TYPE_BOOL2X3; +extern DLLSPEC daeString COLLADA_TYPE_BOOL2X4; +extern DLLSPEC daeString COLLADA_TYPE_BOOL3X1; +extern DLLSPEC daeString COLLADA_TYPE_BOOL3X2; +extern DLLSPEC daeString COLLADA_TYPE_BOOL3X3; +extern DLLSPEC daeString COLLADA_TYPE_BOOL3X4; +extern DLLSPEC daeString COLLADA_TYPE_BOOL4X1; +extern DLLSPEC daeString COLLADA_TYPE_BOOL4X2; +extern DLLSPEC daeString COLLADA_TYPE_BOOL4X3; +extern DLLSPEC daeString COLLADA_TYPE_BOOL4X4; +extern DLLSPEC daeString COLLADA_TYPE_FLOAT1; +extern DLLSPEC daeString COLLADA_TYPE_INT1; +extern DLLSPEC daeString COLLADA_TYPE_INT1X1; +extern DLLSPEC daeString COLLADA_TYPE_INT1X2; +extern DLLSPEC daeString COLLADA_TYPE_INT1X3; +extern DLLSPEC daeString COLLADA_TYPE_INT1X4; +extern DLLSPEC daeString COLLADA_TYPE_INT2X1; +extern DLLSPEC daeString COLLADA_TYPE_INT2X2; +extern DLLSPEC daeString COLLADA_TYPE_INT2X3; +extern DLLSPEC daeString COLLADA_TYPE_INT2X4; +extern DLLSPEC daeString COLLADA_TYPE_INT3X1; +extern DLLSPEC daeString COLLADA_TYPE_INT3X2; +extern DLLSPEC daeString COLLADA_TYPE_INT3X3; +extern DLLSPEC daeString COLLADA_TYPE_INT3X4; +extern DLLSPEC daeString COLLADA_TYPE_INT4X1; +extern DLLSPEC daeString COLLADA_TYPE_INT4X2; +extern DLLSPEC daeString COLLADA_TYPE_INT4X3; +extern DLLSPEC daeString COLLADA_TYPE_INT4X4; +extern DLLSPEC daeString COLLADA_TYPE_HALF; +extern DLLSPEC daeString COLLADA_TYPE_HALF1; +extern DLLSPEC daeString COLLADA_TYPE_HALF2; +extern DLLSPEC daeString COLLADA_TYPE_HALF3; +extern DLLSPEC daeString COLLADA_TYPE_HALF4; +extern DLLSPEC daeString COLLADA_TYPE_HALF1X1; +extern DLLSPEC daeString COLLADA_TYPE_HALF1X2; +extern DLLSPEC daeString COLLADA_TYPE_HALF1X3; +extern DLLSPEC daeString COLLADA_TYPE_HALF1X4; +extern DLLSPEC daeString COLLADA_TYPE_HALF2X1; +extern DLLSPEC daeString COLLADA_TYPE_HALF2X2; +extern DLLSPEC daeString COLLADA_TYPE_HALF2X3; +extern DLLSPEC daeString COLLADA_TYPE_HALF2X4; +extern DLLSPEC daeString COLLADA_TYPE_HALF3X1; +extern DLLSPEC daeString COLLADA_TYPE_HALF3X2; +extern DLLSPEC daeString COLLADA_TYPE_HALF3X3; +extern DLLSPEC daeString COLLADA_TYPE_HALF3X4; +extern DLLSPEC daeString COLLADA_TYPE_HALF4X1; +extern DLLSPEC daeString COLLADA_TYPE_HALF4X2; +extern DLLSPEC daeString COLLADA_TYPE_HALF4X3; +extern DLLSPEC daeString COLLADA_TYPE_HALF4X4; +extern DLLSPEC daeString COLLADA_TYPE_FIXED; +extern DLLSPEC daeString COLLADA_TYPE_FIXED1; +extern DLLSPEC daeString COLLADA_TYPE_FIXED2; +extern DLLSPEC daeString COLLADA_TYPE_FIXED3; +extern DLLSPEC daeString COLLADA_TYPE_FIXED4; +extern DLLSPEC daeString COLLADA_TYPE_FIXED1X1; +extern DLLSPEC daeString COLLADA_TYPE_FIXED1X2; +extern DLLSPEC daeString COLLADA_TYPE_FIXED1X3; +extern DLLSPEC daeString COLLADA_TYPE_FIXED1X4; +extern DLLSPEC daeString COLLADA_TYPE_FIXED2X1; +extern DLLSPEC daeString COLLADA_TYPE_FIXED2X2; +extern DLLSPEC daeString COLLADA_TYPE_FIXED2X3; +extern DLLSPEC daeString COLLADA_TYPE_FIXED2X4; +extern DLLSPEC daeString COLLADA_TYPE_FIXED3X1; +extern DLLSPEC daeString COLLADA_TYPE_FIXED3X2; +extern DLLSPEC daeString COLLADA_TYPE_FIXED3X3; +extern DLLSPEC daeString COLLADA_TYPE_FIXED3X4; +extern DLLSPEC daeString COLLADA_TYPE_FIXED4X1; +extern DLLSPEC daeString COLLADA_TYPE_FIXED4X2; +extern DLLSPEC daeString COLLADA_TYPE_FIXED4X3; +extern DLLSPEC daeString COLLADA_TYPE_FIXED4X4; +extern DLLSPEC daeString COLLADA_TYPE_GLES_PIPELINE_SETTINGS; +extern DLLSPEC daeString COLLADA_TYPE_TEXTURE_PIPELINE; +extern DLLSPEC daeString COLLADA_TYPE_LIGHT_LINEAR_ATTENUTATION; +extern DLLSPEC daeString COLLADA_TYPE_TEXTURE_PIPELINE_ENABLE; +extern DLLSPEC daeString COLLADA_TYPE_GLES_BASIC_TYPE_COMMON; +extern DLLSPEC daeString COLLADA_TYPE_COLLADA; +extern DLLSPEC daeString COLLADA_TYPE_SCENE; +extern DLLSPEC daeString COLLADA_TYPE_IDREF_ARRAY; +extern DLLSPEC daeString COLLADA_TYPE_NAME_ARRAY; +extern DLLSPEC daeString COLLADA_TYPE_BOOL_ARRAY; +extern DLLSPEC daeString COLLADA_TYPE_FLOAT_ARRAY; +extern DLLSPEC daeString COLLADA_TYPE_INT_ARRAY; +extern DLLSPEC daeString COLLADA_TYPE_ACCESSOR; +extern DLLSPEC daeString COLLADA_TYPE_TECHNIQUE_COMMON; +extern DLLSPEC daeString COLLADA_TYPE_GEOMETRY; +extern DLLSPEC daeString COLLADA_TYPE_MESH; +extern DLLSPEC daeString COLLADA_TYPE_SPLINE; +extern DLLSPEC daeString COLLADA_TYPE_CONTROL_VERTICES; +extern DLLSPEC daeString COLLADA_TYPE_P; +extern DLLSPEC daeString COLLADA_TYPE_LINES; +extern DLLSPEC daeString COLLADA_TYPE_LINESTRIPS; +extern DLLSPEC daeString COLLADA_TYPE_POLYGONS; +extern DLLSPEC daeString COLLADA_TYPE_PH; +extern DLLSPEC daeString COLLADA_TYPE_H; +extern DLLSPEC daeString COLLADA_TYPE_POLYLIST; +extern DLLSPEC daeString COLLADA_TYPE_VCOUNT; +extern DLLSPEC daeString COLLADA_TYPE_TRIANGLES; +extern DLLSPEC daeString COLLADA_TYPE_TRIFANS; +extern DLLSPEC daeString COLLADA_TYPE_TRISTRIPS; +extern DLLSPEC daeString COLLADA_TYPE_VERTICES; +extern DLLSPEC daeString COLLADA_TYPE_LOOKAT; +extern DLLSPEC daeString COLLADA_TYPE_MATRIX; +extern DLLSPEC daeString COLLADA_TYPE_ROTATE; +extern DLLSPEC daeString COLLADA_TYPE_SCALE; +extern DLLSPEC daeString COLLADA_TYPE_SKEW; +extern DLLSPEC daeString COLLADA_TYPE_TRANSLATE; +extern DLLSPEC daeString COLLADA_TYPE_IMAGE; +extern DLLSPEC daeString COLLADA_TYPE_DATA; +extern DLLSPEC daeString COLLADA_TYPE_INIT_FROM; +extern DLLSPEC daeString COLLADA_TYPE_LIGHT; +extern DLLSPEC daeString COLLADA_TYPE_AMBIENT; +extern DLLSPEC daeString COLLADA_TYPE_DIRECTIONAL; +extern DLLSPEC daeString COLLADA_TYPE_POINT; +extern DLLSPEC daeString COLLADA_TYPE_SPOT; +extern DLLSPEC daeString COLLADA_TYPE_MATERIAL; +extern DLLSPEC daeString COLLADA_TYPE_CAMERA; +extern DLLSPEC daeString COLLADA_TYPE_OPTICS; +extern DLLSPEC daeString COLLADA_TYPE_ORTHOGRAPHIC; +extern DLLSPEC daeString COLLADA_TYPE_PERSPECTIVE; +extern DLLSPEC daeString COLLADA_TYPE_IMAGER; +extern DLLSPEC daeString COLLADA_TYPE_ANIMATION; +extern DLLSPEC daeString COLLADA_TYPE_ANIMATION_CLIP; +extern DLLSPEC daeString COLLADA_TYPE_CHANNEL; +extern DLLSPEC daeString COLLADA_TYPE_SAMPLER; +extern DLLSPEC daeString COLLADA_TYPE_CONTROLLER; +extern DLLSPEC daeString COLLADA_TYPE_SKIN; +extern DLLSPEC daeString COLLADA_TYPE_BIND_SHAPE_MATRIX; +extern DLLSPEC daeString COLLADA_TYPE_JOINTS; +extern DLLSPEC daeString COLLADA_TYPE_VERTEX_WEIGHTS; +extern DLLSPEC daeString COLLADA_TYPE_V; +extern DLLSPEC daeString COLLADA_TYPE_MORPH; +extern DLLSPEC daeString COLLADA_TYPE_TARGETS; +extern DLLSPEC daeString COLLADA_TYPE_ASSET; +extern DLLSPEC daeString COLLADA_TYPE_CONTRIBUTOR; +extern DLLSPEC daeString COLLADA_TYPE_AUTHOR; +extern DLLSPEC daeString COLLADA_TYPE_AUTHORING_TOOL; +extern DLLSPEC daeString COLLADA_TYPE_COMMENTS; +extern DLLSPEC daeString COLLADA_TYPE_COPYRIGHT; +extern DLLSPEC daeString COLLADA_TYPE_SOURCE_DATA; +extern DLLSPEC daeString COLLADA_TYPE_CREATED; +extern DLLSPEC daeString COLLADA_TYPE_KEYWORDS; +extern DLLSPEC daeString COLLADA_TYPE_MODIFIED; +extern DLLSPEC daeString COLLADA_TYPE_REVISION; +extern DLLSPEC daeString COLLADA_TYPE_SUBJECT; +extern DLLSPEC daeString COLLADA_TYPE_TITLE; +extern DLLSPEC daeString COLLADA_TYPE_UNIT; +extern DLLSPEC daeString COLLADA_TYPE_UP_AXIS; +extern DLLSPEC daeString COLLADA_TYPE_EXTRA; +extern DLLSPEC daeString COLLADA_TYPE_TECHNIQUE; +extern DLLSPEC daeString COLLADA_TYPE_NODE; +extern DLLSPEC daeString COLLADA_TYPE_VISUAL_SCENE; +extern DLLSPEC daeString COLLADA_TYPE_EVALUATE_SCENE; +extern DLLSPEC daeString COLLADA_TYPE_RENDER; +extern DLLSPEC daeString COLLADA_TYPE_LAYER; +extern DLLSPEC daeString COLLADA_TYPE_BIND_MATERIAL; +extern DLLSPEC daeString COLLADA_TYPE_INSTANCE_CAMERA; +extern DLLSPEC daeString COLLADA_TYPE_INSTANCE_CONTROLLER; +extern DLLSPEC daeString COLLADA_TYPE_SKELETON; +extern DLLSPEC daeString COLLADA_TYPE_INSTANCE_EFFECT; +extern DLLSPEC daeString COLLADA_TYPE_TECHNIQUE_HINT; +extern DLLSPEC daeString COLLADA_TYPE_SETPARAM; +extern DLLSPEC daeString COLLADA_TYPE_INSTANCE_FORCE_FIELD; +extern DLLSPEC daeString COLLADA_TYPE_INSTANCE_GEOMETRY; +extern DLLSPEC daeString COLLADA_TYPE_INSTANCE_LIGHT; +extern DLLSPEC daeString COLLADA_TYPE_INSTANCE_MATERIAL; +extern DLLSPEC daeString COLLADA_TYPE_BIND; +extern DLLSPEC daeString COLLADA_TYPE_BIND_VERTEX_INPUT; +extern DLLSPEC daeString COLLADA_TYPE_INSTANCE_NODE; +extern DLLSPEC daeString COLLADA_TYPE_INSTANCE_PHYSICS_MATERIAL; +extern DLLSPEC daeString COLLADA_TYPE_INSTANCE_PHYSICS_MODEL; +extern DLLSPEC daeString COLLADA_TYPE_INSTANCE_RIGID_BODY; +extern DLLSPEC daeString COLLADA_TYPE_ANGULAR_VELOCITY; +extern DLLSPEC daeString COLLADA_TYPE_VELOCITY; +extern DLLSPEC daeString COLLADA_TYPE_DYNAMIC; +extern DLLSPEC daeString COLLADA_TYPE_MASS_FRAME; +extern DLLSPEC daeString COLLADA_TYPE_SHAPE; +extern DLLSPEC daeString COLLADA_TYPE_HOLLOW; +extern DLLSPEC daeString COLLADA_TYPE_INSTANCE_RIGID_CONSTRAINT; +extern DLLSPEC daeString COLLADA_TYPE_LIBRARY_ANIMATIONS; +extern DLLSPEC daeString COLLADA_TYPE_LIBRARY_ANIMATION_CLIPS; +extern DLLSPEC daeString COLLADA_TYPE_LIBRARY_CAMERAS; +extern DLLSPEC daeString COLLADA_TYPE_LIBRARY_CONTROLLERS; +extern DLLSPEC daeString COLLADA_TYPE_LIBRARY_GEOMETRIES; +extern DLLSPEC daeString COLLADA_TYPE_LIBRARY_EFFECTS; +extern DLLSPEC daeString COLLADA_TYPE_LIBRARY_FORCE_FIELDS; +extern DLLSPEC daeString COLLADA_TYPE_LIBRARY_IMAGES; +extern DLLSPEC daeString COLLADA_TYPE_LIBRARY_LIGHTS; +extern DLLSPEC daeString COLLADA_TYPE_LIBRARY_MATERIALS; +extern DLLSPEC daeString COLLADA_TYPE_LIBRARY_NODES; +extern DLLSPEC daeString COLLADA_TYPE_LIBRARY_PHYSICS_MATERIALS; +extern DLLSPEC daeString COLLADA_TYPE_LIBRARY_PHYSICS_MODELS; +extern DLLSPEC daeString COLLADA_TYPE_LIBRARY_PHYSICS_SCENES; +extern DLLSPEC daeString COLLADA_TYPE_LIBRARY_VISUAL_SCENES; +extern DLLSPEC daeString COLLADA_TYPE_FX_PROFILE_ABSTRACT; +extern DLLSPEC daeString COLLADA_TYPE_EFFECT; +extern DLLSPEC daeString COLLADA_TYPE_GL_HOOK_ABSTRACT; +extern DLLSPEC daeString COLLADA_TYPE_PROFILE_GLSL; +extern DLLSPEC daeString COLLADA_TYPE_PASS; +extern DLLSPEC daeString COLLADA_TYPE_DRAW; +extern DLLSPEC daeString COLLADA_TYPE_SHADER; +extern DLLSPEC daeString COLLADA_TYPE_COMPILER_TARGET; +extern DLLSPEC daeString COLLADA_TYPE_COMPILER_OPTIONS; +extern DLLSPEC daeString COLLADA_TYPE_PROFILE_COMMON; +extern DLLSPEC daeString COLLADA_TYPE_CONSTANT; +extern DLLSPEC daeString COLLADA_TYPE_LAMBERT; +extern DLLSPEC daeString COLLADA_TYPE_PHONG; +extern DLLSPEC daeString COLLADA_TYPE_BLINN; +extern DLLSPEC daeString COLLADA_TYPE_PROFILE_CG; +extern DLLSPEC daeString COLLADA_TYPE_PROFILE_GLES; +extern DLLSPEC daeString COLLADA_TYPE_COLOR_TARGET; +extern DLLSPEC daeString COLLADA_TYPE_DEPTH_TARGET; +extern DLLSPEC daeString COLLADA_TYPE_STENCIL_TARGET; +extern DLLSPEC daeString COLLADA_TYPE_COLOR_CLEAR; +extern DLLSPEC daeString COLLADA_TYPE_DEPTH_CLEAR; +extern DLLSPEC daeString COLLADA_TYPE_STENCIL_CLEAR; +extern DLLSPEC daeString COLLADA_TYPE_BOX; +extern DLLSPEC daeString COLLADA_TYPE_HALF_EXTENTS; +extern DLLSPEC daeString COLLADA_TYPE_PLANE; +extern DLLSPEC daeString COLLADA_TYPE_EQUATION; +extern DLLSPEC daeString COLLADA_TYPE_SPHERE; +extern DLLSPEC daeString COLLADA_TYPE_RADIUS; +extern DLLSPEC daeString COLLADA_TYPE_ELLIPSOID; +extern DLLSPEC daeString COLLADA_TYPE_CYLINDER; +extern DLLSPEC daeString COLLADA_TYPE_HEIGHT; +extern DLLSPEC daeString COLLADA_TYPE_TAPERED_CYLINDER; +extern DLLSPEC daeString COLLADA_TYPE_RADIUS1; +extern DLLSPEC daeString COLLADA_TYPE_RADIUS2; +extern DLLSPEC daeString COLLADA_TYPE_CAPSULE; +extern DLLSPEC daeString COLLADA_TYPE_TAPERED_CAPSULE; +extern DLLSPEC daeString COLLADA_TYPE_CONVEX_MESH; +extern DLLSPEC daeString COLLADA_TYPE_FORCE_FIELD; +extern DLLSPEC daeString COLLADA_TYPE_PHYSICS_MATERIAL; +extern DLLSPEC daeString COLLADA_TYPE_PHYSICS_SCENE; +extern DLLSPEC daeString COLLADA_TYPE_RIGID_BODY; +extern DLLSPEC daeString COLLADA_TYPE_RIGID_CONSTRAINT; +extern DLLSPEC daeString COLLADA_TYPE_REF_ATTACHMENT; +extern DLLSPEC daeString COLLADA_TYPE_ATTACHMENT; +extern DLLSPEC daeString COLLADA_TYPE_ENABLED; +extern DLLSPEC daeString COLLADA_TYPE_INTERPENETRATE; +extern DLLSPEC daeString COLLADA_TYPE_LIMITS; +extern DLLSPEC daeString COLLADA_TYPE_SWING_CONE_AND_TWIST; +extern DLLSPEC daeString COLLADA_TYPE_LINEAR; +extern DLLSPEC daeString COLLADA_TYPE_SPRING; +extern DLLSPEC daeString COLLADA_TYPE_ANGULAR; +extern DLLSPEC daeString COLLADA_TYPE_PHYSICS_MODEL; + +extern DLLSPEC daeString COLLADA_ELEMENT_COLLADA; +extern DLLSPEC daeString COLLADA_ELEMENT_EXTRA; +extern DLLSPEC daeString COLLADA_ELEMENT_CHANNELS; +extern DLLSPEC daeString COLLADA_ELEMENT_RANGE; +extern DLLSPEC daeString COLLADA_ELEMENT_PRECISION; +extern DLLSPEC daeString COLLADA_ELEMENT_OPTION; +extern DLLSPEC daeString COLLADA_ELEMENT_ALL; +extern DLLSPEC daeString COLLADA_ELEMENT_PRIMARY; +extern DLLSPEC daeString COLLADA_ELEMENT_FACE; +extern DLLSPEC daeString COLLADA_ELEMENT_ORDER; +extern DLLSPEC daeString COLLADA_ELEMENT_FX_SURFACE_INIT_COMMON; +extern DLLSPEC daeString COLLADA_ELEMENT_FORMAT; +extern DLLSPEC daeString COLLADA_ELEMENT_FORMAT_HINT; +extern DLLSPEC daeString COLLADA_ELEMENT_SIZE; +extern DLLSPEC daeString COLLADA_ELEMENT_VIEWPORT_RATIO; +extern DLLSPEC daeString COLLADA_ELEMENT_MIP_LEVELS; +extern DLLSPEC daeString COLLADA_ELEMENT_MIPMAP_GENERATE; +extern DLLSPEC daeString COLLADA_ELEMENT_SOURCE; +extern DLLSPEC daeString COLLADA_ELEMENT_WRAP_S; +extern DLLSPEC daeString COLLADA_ELEMENT_MINFILTER; +extern DLLSPEC daeString COLLADA_ELEMENT_MAGFILTER; +extern DLLSPEC daeString COLLADA_ELEMENT_MIPFILTER; +extern DLLSPEC daeString COLLADA_ELEMENT_BORDER_COLOR; +extern DLLSPEC daeString COLLADA_ELEMENT_MIPMAP_MAXLEVEL; +extern DLLSPEC daeString COLLADA_ELEMENT_MIPMAP_BIAS; +extern DLLSPEC daeString COLLADA_ELEMENT_WRAP_T; +extern DLLSPEC daeString COLLADA_ELEMENT_WRAP_P; +extern DLLSPEC daeString COLLADA_ELEMENT_FX_ANNOTATE_TYPE_COMMON; +extern DLLSPEC daeString COLLADA_ELEMENT_ANNOTATE; +extern DLLSPEC daeString COLLADA_ELEMENT_SEMANTIC; +extern DLLSPEC daeString COLLADA_ELEMENT_MODIFIER; +extern DLLSPEC daeString COLLADA_ELEMENT_FX_BASIC_TYPE_COMMON; +extern DLLSPEC daeString COLLADA_ELEMENT_GLSL_PARAM_TYPE; +extern DLLSPEC daeString COLLADA_ELEMENT_ARRAY; +extern DLLSPEC daeString COLLADA_ELEMENT_GENERATOR; +extern DLLSPEC daeString COLLADA_ELEMENT_CODE; +extern DLLSPEC daeString COLLADA_ELEMENT_INCLUDE; +extern DLLSPEC daeString COLLADA_ELEMENT_NAME; +extern DLLSPEC daeString COLLADA_ELEMENT_SETPARAM; +extern DLLSPEC daeString COLLADA_ELEMENT_FLOAT; +extern DLLSPEC daeString COLLADA_ELEMENT_PARAM; +extern DLLSPEC daeString COLLADA_ELEMENT_COLOR; +extern DLLSPEC daeString COLLADA_ELEMENT_TEXTURE; +extern DLLSPEC daeString COLLADA_ELEMENT_FLOAT2; +extern DLLSPEC daeString COLLADA_ELEMENT_FLOAT3; +extern DLLSPEC daeString COLLADA_ELEMENT_FLOAT4; +extern DLLSPEC daeString COLLADA_ELEMENT_SURFACE; +extern DLLSPEC daeString COLLADA_ELEMENT_SAMPLER2D; +extern DLLSPEC daeString COLLADA_ELEMENT_CG_PARAM_TYPE; +extern DLLSPEC daeString COLLADA_ELEMENT_USERTYPE; +extern DLLSPEC daeString COLLADA_ELEMENT_CONNECT_PARAM; +extern DLLSPEC daeString COLLADA_ELEMENT_CONSTANT; +extern DLLSPEC daeString COLLADA_ELEMENT_ARGUMENT; +extern DLLSPEC daeString COLLADA_ELEMENT_rgb; +extern DLLSPEC daeString COLLADA_ELEMENT_ALPHA; +extern DLLSPEC daeString COLLADA_ELEMENT_TEXCOMBINER; +extern DLLSPEC daeString COLLADA_ELEMENT_TEXENV; +extern DLLSPEC daeString COLLADA_ELEMENT_SAMPLER_STATE; +extern DLLSPEC daeString COLLADA_ELEMENT_TEXCOORD; +extern DLLSPEC daeString COLLADA_ELEMENT_GLES_BASIC_TYPE_COMMON; +extern DLLSPEC daeString COLLADA_ELEMENT_INIT_AS_NULL; +extern DLLSPEC daeString COLLADA_ELEMENT_INIT_AS_TARGET; +extern DLLSPEC daeString COLLADA_ELEMENT_INIT_CUBE; +extern DLLSPEC daeString COLLADA_ELEMENT_INIT_VOLUME; +extern DLLSPEC daeString COLLADA_ELEMENT_INIT_PLANAR; +extern DLLSPEC daeString COLLADA_ELEMENT_INIT_FROM; +extern DLLSPEC daeString COLLADA_ELEMENT_BOOL; +extern DLLSPEC daeString COLLADA_ELEMENT_BOOL2; +extern DLLSPEC daeString COLLADA_ELEMENT_BOOL3; +extern DLLSPEC daeString COLLADA_ELEMENT_BOOL4; +extern DLLSPEC daeString COLLADA_ELEMENT_INT; +extern DLLSPEC daeString COLLADA_ELEMENT_INT2; +extern DLLSPEC daeString COLLADA_ELEMENT_INT3; +extern DLLSPEC daeString COLLADA_ELEMENT_INT4; +extern DLLSPEC daeString COLLADA_ELEMENT_FLOAT2X2; +extern DLLSPEC daeString COLLADA_ELEMENT_FLOAT3X3; +extern DLLSPEC daeString COLLADA_ELEMENT_FLOAT4X4; +extern DLLSPEC daeString COLLADA_ELEMENT_STRING; +extern DLLSPEC daeString COLLADA_ELEMENT_FLOAT1X1; +extern DLLSPEC daeString COLLADA_ELEMENT_FLOAT1X2; +extern DLLSPEC daeString COLLADA_ELEMENT_FLOAT1X3; +extern DLLSPEC daeString COLLADA_ELEMENT_FLOAT1X4; +extern DLLSPEC daeString COLLADA_ELEMENT_FLOAT2X1; +extern DLLSPEC daeString COLLADA_ELEMENT_FLOAT2X3; +extern DLLSPEC daeString COLLADA_ELEMENT_FLOAT2X4; +extern DLLSPEC daeString COLLADA_ELEMENT_FLOAT3X1; +extern DLLSPEC daeString COLLADA_ELEMENT_FLOAT3X2; +extern DLLSPEC daeString COLLADA_ELEMENT_FLOAT3X4; +extern DLLSPEC daeString COLLADA_ELEMENT_FLOAT4X1; +extern DLLSPEC daeString COLLADA_ELEMENT_FLOAT4X2; +extern DLLSPEC daeString COLLADA_ELEMENT_FLOAT4X3; +extern DLLSPEC daeString COLLADA_ELEMENT_SAMPLER1D; +extern DLLSPEC daeString COLLADA_ELEMENT_SAMPLER3D; +extern DLLSPEC daeString COLLADA_ELEMENT_SAMPLERCUBE; +extern DLLSPEC daeString COLLADA_ELEMENT_SAMPLERRECT; +extern DLLSPEC daeString COLLADA_ELEMENT_SAMPLERDEPTH; +extern DLLSPEC daeString COLLADA_ELEMENT_ENUM; +extern DLLSPEC daeString COLLADA_ELEMENT_ALPHA_FUNC; +extern DLLSPEC daeString COLLADA_ELEMENT_BLEND_FUNC; +extern DLLSPEC daeString COLLADA_ELEMENT_BLEND_FUNC_SEPARATE; +extern DLLSPEC daeString COLLADA_ELEMENT_BLEND_EQUATION; +extern DLLSPEC daeString COLLADA_ELEMENT_BLEND_EQUATION_SEPARATE; +extern DLLSPEC daeString COLLADA_ELEMENT_COLOR_MATERIAL; +extern DLLSPEC daeString COLLADA_ELEMENT_CULL_FACE; +extern DLLSPEC daeString COLLADA_ELEMENT_DEPTH_FUNC; +extern DLLSPEC daeString COLLADA_ELEMENT_FOG_MODE; +extern DLLSPEC daeString COLLADA_ELEMENT_FOG_COORD_SRC; +extern DLLSPEC daeString COLLADA_ELEMENT_FRONT_FACE; +extern DLLSPEC daeString COLLADA_ELEMENT_LIGHT_MODEL_COLOR_CONTROL; +extern DLLSPEC daeString COLLADA_ELEMENT_LOGIC_OP; +extern DLLSPEC daeString COLLADA_ELEMENT_POLYGON_MODE; +extern DLLSPEC daeString COLLADA_ELEMENT_SHADE_MODEL; +extern DLLSPEC daeString COLLADA_ELEMENT_STENCIL_FUNC; +extern DLLSPEC daeString COLLADA_ELEMENT_STENCIL_OP; +extern DLLSPEC daeString COLLADA_ELEMENT_STENCIL_FUNC_SEPARATE; +extern DLLSPEC daeString COLLADA_ELEMENT_STENCIL_OP_SEPARATE; +extern DLLSPEC daeString COLLADA_ELEMENT_STENCIL_MASK_SEPARATE; +extern DLLSPEC daeString COLLADA_ELEMENT_LIGHT_ENABLE; +extern DLLSPEC daeString COLLADA_ELEMENT_LIGHT_AMBIENT; +extern DLLSPEC daeString COLLADA_ELEMENT_LIGHT_DIFFUSE; +extern DLLSPEC daeString COLLADA_ELEMENT_LIGHT_SPECULAR; +extern DLLSPEC daeString COLLADA_ELEMENT_LIGHT_POSITION; +extern DLLSPEC daeString COLLADA_ELEMENT_LIGHT_CONSTANT_ATTENUATION; +extern DLLSPEC daeString COLLADA_ELEMENT_LIGHT_LINEAR_ATTENUATION; +extern DLLSPEC daeString COLLADA_ELEMENT_LIGHT_QUADRATIC_ATTENUATION; +extern DLLSPEC daeString COLLADA_ELEMENT_LIGHT_SPOT_CUTOFF; +extern DLLSPEC daeString COLLADA_ELEMENT_LIGHT_SPOT_DIRECTION; +extern DLLSPEC daeString COLLADA_ELEMENT_LIGHT_SPOT_EXPONENT; +extern DLLSPEC daeString COLLADA_ELEMENT_TEXTURE1D; +extern DLLSPEC daeString COLLADA_ELEMENT_TEXTURE2D; +extern DLLSPEC daeString COLLADA_ELEMENT_TEXTURE3D; +extern DLLSPEC daeString COLLADA_ELEMENT_TEXTURECUBE; +extern DLLSPEC daeString COLLADA_ELEMENT_TEXTURERECT; +extern DLLSPEC daeString COLLADA_ELEMENT_TEXTUREDEPTH; +extern DLLSPEC daeString COLLADA_ELEMENT_TEXTURE1D_ENABLE; +extern DLLSPEC daeString COLLADA_ELEMENT_TEXTURE2D_ENABLE; +extern DLLSPEC daeString COLLADA_ELEMENT_TEXTURE3D_ENABLE; +extern DLLSPEC daeString COLLADA_ELEMENT_TEXTURECUBE_ENABLE; +extern DLLSPEC daeString COLLADA_ELEMENT_TEXTURERECT_ENABLE; +extern DLLSPEC daeString COLLADA_ELEMENT_TEXTUREDEPTH_ENABLE; +extern DLLSPEC daeString COLLADA_ELEMENT_TEXTURE_ENV_COLOR; +extern DLLSPEC daeString COLLADA_ELEMENT_TEXTURE_ENV_MODE; +extern DLLSPEC daeString COLLADA_ELEMENT_CLIP_PLANE; +extern DLLSPEC daeString COLLADA_ELEMENT_CLIP_PLANE_ENABLE; +extern DLLSPEC daeString COLLADA_ELEMENT_BLEND_COLOR; +extern DLLSPEC daeString COLLADA_ELEMENT_CLEAR_COLOR; +extern DLLSPEC daeString COLLADA_ELEMENT_CLEAR_STENCIL; +extern DLLSPEC daeString COLLADA_ELEMENT_CLEAR_DEPTH; +extern DLLSPEC daeString COLLADA_ELEMENT_COLOR_MASK; +extern DLLSPEC daeString COLLADA_ELEMENT_DEPTH_BOUNDS; +extern DLLSPEC daeString COLLADA_ELEMENT_DEPTH_MASK; +extern DLLSPEC daeString COLLADA_ELEMENT_DEPTH_RANGE; +extern DLLSPEC daeString COLLADA_ELEMENT_FOG_DENSITY; +extern DLLSPEC daeString COLLADA_ELEMENT_FOG_START; +extern DLLSPEC daeString COLLADA_ELEMENT_FOG_END; +extern DLLSPEC daeString COLLADA_ELEMENT_FOG_COLOR; +extern DLLSPEC daeString COLLADA_ELEMENT_LIGHT_MODEL_AMBIENT; +extern DLLSPEC daeString COLLADA_ELEMENT_LIGHTING_ENABLE; +extern DLLSPEC daeString COLLADA_ELEMENT_LINE_STIPPLE; +extern DLLSPEC daeString COLLADA_ELEMENT_LINE_WIDTH; +extern DLLSPEC daeString COLLADA_ELEMENT_MATERIAL_AMBIENT; +extern DLLSPEC daeString COLLADA_ELEMENT_MATERIAL_DIFFUSE; +extern DLLSPEC daeString COLLADA_ELEMENT_MATERIAL_EMISSION; +extern DLLSPEC daeString COLLADA_ELEMENT_MATERIAL_SHININESS; +extern DLLSPEC daeString COLLADA_ELEMENT_MATERIAL_SPECULAR; +extern DLLSPEC daeString COLLADA_ELEMENT_MODEL_VIEW_MATRIX; +extern DLLSPEC daeString COLLADA_ELEMENT_POINT_DISTANCE_ATTENUATION; +extern DLLSPEC daeString COLLADA_ELEMENT_POINT_FADE_THRESHOLD_SIZE; +extern DLLSPEC daeString COLLADA_ELEMENT_POINT_SIZE; +extern DLLSPEC daeString COLLADA_ELEMENT_POINT_SIZE_MIN; +extern DLLSPEC daeString COLLADA_ELEMENT_POINT_SIZE_MAX; +extern DLLSPEC daeString COLLADA_ELEMENT_POLYGON_OFFSET; +extern DLLSPEC daeString COLLADA_ELEMENT_PROJECTION_MATRIX; +extern DLLSPEC daeString COLLADA_ELEMENT_SCISSOR; +extern DLLSPEC daeString COLLADA_ELEMENT_STENCIL_MASK; +extern DLLSPEC daeString COLLADA_ELEMENT_ALPHA_TEST_ENABLE; +extern DLLSPEC daeString COLLADA_ELEMENT_AUTO_NORMAL_ENABLE; +extern DLLSPEC daeString COLLADA_ELEMENT_BLEND_ENABLE; +extern DLLSPEC daeString COLLADA_ELEMENT_COLOR_LOGIC_OP_ENABLE; +extern DLLSPEC daeString COLLADA_ELEMENT_COLOR_MATERIAL_ENABLE; +extern DLLSPEC daeString COLLADA_ELEMENT_CULL_FACE_ENABLE; +extern DLLSPEC daeString COLLADA_ELEMENT_DEPTH_BOUNDS_ENABLE; +extern DLLSPEC daeString COLLADA_ELEMENT_DEPTH_CLAMP_ENABLE; +extern DLLSPEC daeString COLLADA_ELEMENT_DEPTH_TEST_ENABLE; +extern DLLSPEC daeString COLLADA_ELEMENT_DITHER_ENABLE; +extern DLLSPEC daeString COLLADA_ELEMENT_FOG_ENABLE; +extern DLLSPEC daeString COLLADA_ELEMENT_LIGHT_MODEL_LOCAL_VIEWER_ENABLE; +extern DLLSPEC daeString COLLADA_ELEMENT_LIGHT_MODEL_TWO_SIDE_ENABLE; +extern DLLSPEC daeString COLLADA_ELEMENT_LINE_SMOOTH_ENABLE; +extern DLLSPEC daeString COLLADA_ELEMENT_LINE_STIPPLE_ENABLE; +extern DLLSPEC daeString COLLADA_ELEMENT_LOGIC_OP_ENABLE; +extern DLLSPEC daeString COLLADA_ELEMENT_MULTISAMPLE_ENABLE; +extern DLLSPEC daeString COLLADA_ELEMENT_NORMALIZE_ENABLE; +extern DLLSPEC daeString COLLADA_ELEMENT_POINT_SMOOTH_ENABLE; +extern DLLSPEC daeString COLLADA_ELEMENT_POLYGON_OFFSET_FILL_ENABLE; +extern DLLSPEC daeString COLLADA_ELEMENT_POLYGON_OFFSET_LINE_ENABLE; +extern DLLSPEC daeString COLLADA_ELEMENT_POLYGON_OFFSET_POINT_ENABLE; +extern DLLSPEC daeString COLLADA_ELEMENT_POLYGON_SMOOTH_ENABLE; +extern DLLSPEC daeString COLLADA_ELEMENT_POLYGON_STIPPLE_ENABLE; +extern DLLSPEC daeString COLLADA_ELEMENT_RESCALE_NORMAL_ENABLE; +extern DLLSPEC daeString COLLADA_ELEMENT_SAMPLE_ALPHA_TO_COVERAGE_ENABLE; +extern DLLSPEC daeString COLLADA_ELEMENT_SAMPLE_ALPHA_TO_ONE_ENABLE; +extern DLLSPEC daeString COLLADA_ELEMENT_SAMPLE_COVERAGE_ENABLE; +extern DLLSPEC daeString COLLADA_ELEMENT_SCISSOR_TEST_ENABLE; +extern DLLSPEC daeString COLLADA_ELEMENT_STENCIL_TEST_ENABLE; +extern DLLSPEC daeString COLLADA_ELEMENT_GL_HOOK_ABSTRACT; +extern DLLSPEC daeString COLLADA_ELEMENT_FUNC; +extern DLLSPEC daeString COLLADA_ELEMENT_VALUE; +extern DLLSPEC daeString COLLADA_ELEMENT_SRC; +extern DLLSPEC daeString COLLADA_ELEMENT_DEST; +extern DLLSPEC daeString COLLADA_ELEMENT_SRC_RGB; +extern DLLSPEC daeString COLLADA_ELEMENT_DEST_RGB; +extern DLLSPEC daeString COLLADA_ELEMENT_SRC_ALPHA; +extern DLLSPEC daeString COLLADA_ELEMENT_DEST_ALPHA; +extern DLLSPEC daeString COLLADA_ELEMENT_RGB; +extern DLLSPEC daeString COLLADA_ELEMENT_MODE; +extern DLLSPEC daeString COLLADA_ELEMENT_REF; +extern DLLSPEC daeString COLLADA_ELEMENT_MASK; +extern DLLSPEC daeString COLLADA_ELEMENT_FAIL; +extern DLLSPEC daeString COLLADA_ELEMENT_ZFAIL; +extern DLLSPEC daeString COLLADA_ELEMENT_ZPASS; +extern DLLSPEC daeString COLLADA_ELEMENT_FRONT; +extern DLLSPEC daeString COLLADA_ELEMENT_BACK; +extern DLLSPEC daeString COLLADA_ELEMENT_BOOL1; +extern DLLSPEC daeString COLLADA_ELEMENT_BOOL1X1; +extern DLLSPEC daeString COLLADA_ELEMENT_BOOL1X2; +extern DLLSPEC daeString COLLADA_ELEMENT_BOOL1X3; +extern DLLSPEC daeString COLLADA_ELEMENT_BOOL1X4; +extern DLLSPEC daeString COLLADA_ELEMENT_BOOL2X1; +extern DLLSPEC daeString COLLADA_ELEMENT_BOOL2X2; +extern DLLSPEC daeString COLLADA_ELEMENT_BOOL2X3; +extern DLLSPEC daeString COLLADA_ELEMENT_BOOL2X4; +extern DLLSPEC daeString COLLADA_ELEMENT_BOOL3X1; +extern DLLSPEC daeString COLLADA_ELEMENT_BOOL3X2; +extern DLLSPEC daeString COLLADA_ELEMENT_BOOL3X3; +extern DLLSPEC daeString COLLADA_ELEMENT_BOOL3X4; +extern DLLSPEC daeString COLLADA_ELEMENT_BOOL4X1; +extern DLLSPEC daeString COLLADA_ELEMENT_BOOL4X2; +extern DLLSPEC daeString COLLADA_ELEMENT_BOOL4X3; +extern DLLSPEC daeString COLLADA_ELEMENT_BOOL4X4; +extern DLLSPEC daeString COLLADA_ELEMENT_FLOAT1; +extern DLLSPEC daeString COLLADA_ELEMENT_INT1; +extern DLLSPEC daeString COLLADA_ELEMENT_INT1X1; +extern DLLSPEC daeString COLLADA_ELEMENT_INT1X2; +extern DLLSPEC daeString COLLADA_ELEMENT_INT1X3; +extern DLLSPEC daeString COLLADA_ELEMENT_INT1X4; +extern DLLSPEC daeString COLLADA_ELEMENT_INT2X1; +extern DLLSPEC daeString COLLADA_ELEMENT_INT2X2; +extern DLLSPEC daeString COLLADA_ELEMENT_INT2X3; +extern DLLSPEC daeString COLLADA_ELEMENT_INT2X4; +extern DLLSPEC daeString COLLADA_ELEMENT_INT3X1; +extern DLLSPEC daeString COLLADA_ELEMENT_INT3X2; +extern DLLSPEC daeString COLLADA_ELEMENT_INT3X3; +extern DLLSPEC daeString COLLADA_ELEMENT_INT3X4; +extern DLLSPEC daeString COLLADA_ELEMENT_INT4X1; +extern DLLSPEC daeString COLLADA_ELEMENT_INT4X2; +extern DLLSPEC daeString COLLADA_ELEMENT_INT4X3; +extern DLLSPEC daeString COLLADA_ELEMENT_INT4X4; +extern DLLSPEC daeString COLLADA_ELEMENT_HALF; +extern DLLSPEC daeString COLLADA_ELEMENT_HALF1; +extern DLLSPEC daeString COLLADA_ELEMENT_HALF2; +extern DLLSPEC daeString COLLADA_ELEMENT_HALF3; +extern DLLSPEC daeString COLLADA_ELEMENT_HALF4; +extern DLLSPEC daeString COLLADA_ELEMENT_HALF1X1; +extern DLLSPEC daeString COLLADA_ELEMENT_HALF1X2; +extern DLLSPEC daeString COLLADA_ELEMENT_HALF1X3; +extern DLLSPEC daeString COLLADA_ELEMENT_HALF1X4; +extern DLLSPEC daeString COLLADA_ELEMENT_HALF2X1; +extern DLLSPEC daeString COLLADA_ELEMENT_HALF2X2; +extern DLLSPEC daeString COLLADA_ELEMENT_HALF2X3; +extern DLLSPEC daeString COLLADA_ELEMENT_HALF2X4; +extern DLLSPEC daeString COLLADA_ELEMENT_HALF3X1; +extern DLLSPEC daeString COLLADA_ELEMENT_HALF3X2; +extern DLLSPEC daeString COLLADA_ELEMENT_HALF3X3; +extern DLLSPEC daeString COLLADA_ELEMENT_HALF3X4; +extern DLLSPEC daeString COLLADA_ELEMENT_HALF4X1; +extern DLLSPEC daeString COLLADA_ELEMENT_HALF4X2; +extern DLLSPEC daeString COLLADA_ELEMENT_HALF4X3; +extern DLLSPEC daeString COLLADA_ELEMENT_HALF4X4; +extern DLLSPEC daeString COLLADA_ELEMENT_FIXED; +extern DLLSPEC daeString COLLADA_ELEMENT_FIXED1; +extern DLLSPEC daeString COLLADA_ELEMENT_FIXED2; +extern DLLSPEC daeString COLLADA_ELEMENT_FIXED3; +extern DLLSPEC daeString COLLADA_ELEMENT_FIXED4; +extern DLLSPEC daeString COLLADA_ELEMENT_FIXED1X1; +extern DLLSPEC daeString COLLADA_ELEMENT_FIXED1X2; +extern DLLSPEC daeString COLLADA_ELEMENT_FIXED1X3; +extern DLLSPEC daeString COLLADA_ELEMENT_FIXED1X4; +extern DLLSPEC daeString COLLADA_ELEMENT_FIXED2X1; +extern DLLSPEC daeString COLLADA_ELEMENT_FIXED2X2; +extern DLLSPEC daeString COLLADA_ELEMENT_FIXED2X3; +extern DLLSPEC daeString COLLADA_ELEMENT_FIXED2X4; +extern DLLSPEC daeString COLLADA_ELEMENT_FIXED3X1; +extern DLLSPEC daeString COLLADA_ELEMENT_FIXED3X2; +extern DLLSPEC daeString COLLADA_ELEMENT_FIXED3X3; +extern DLLSPEC daeString COLLADA_ELEMENT_FIXED3X4; +extern DLLSPEC daeString COLLADA_ELEMENT_FIXED4X1; +extern DLLSPEC daeString COLLADA_ELEMENT_FIXED4X2; +extern DLLSPEC daeString COLLADA_ELEMENT_FIXED4X3; +extern DLLSPEC daeString COLLADA_ELEMENT_FIXED4X4; +extern DLLSPEC daeString COLLADA_ELEMENT_TEXTURE_PIPELINE; +extern DLLSPEC daeString COLLADA_ELEMENT_LIGHT_LINEAR_ATTENUTATION; +extern DLLSPEC daeString COLLADA_ELEMENT_TEXTURE_PIPELINE_ENABLE; +extern DLLSPEC daeString COLLADA_ELEMENT_TEXTURE_UNIT; +extern DLLSPEC daeString COLLADA_ELEMENT_ASSET; +extern DLLSPEC daeString COLLADA_ELEMENT_LIBRARY_ANIMATIONS; +extern DLLSPEC daeString COLLADA_ELEMENT_LIBRARY_ANIMATION_CLIPS; +extern DLLSPEC daeString COLLADA_ELEMENT_LIBRARY_CAMERAS; +extern DLLSPEC daeString COLLADA_ELEMENT_LIBRARY_CONTROLLERS; +extern DLLSPEC daeString COLLADA_ELEMENT_LIBRARY_GEOMETRIES; +extern DLLSPEC daeString COLLADA_ELEMENT_LIBRARY_EFFECTS; +extern DLLSPEC daeString COLLADA_ELEMENT_LIBRARY_FORCE_FIELDS; +extern DLLSPEC daeString COLLADA_ELEMENT_LIBRARY_IMAGES; +extern DLLSPEC daeString COLLADA_ELEMENT_LIBRARY_LIGHTS; +extern DLLSPEC daeString COLLADA_ELEMENT_LIBRARY_MATERIALS; +extern DLLSPEC daeString COLLADA_ELEMENT_LIBRARY_NODES; +extern DLLSPEC daeString COLLADA_ELEMENT_LIBRARY_PHYSICS_MATERIALS; +extern DLLSPEC daeString COLLADA_ELEMENT_LIBRARY_PHYSICS_MODELS; +extern DLLSPEC daeString COLLADA_ELEMENT_LIBRARY_PHYSICS_SCENES; +extern DLLSPEC daeString COLLADA_ELEMENT_LIBRARY_VISUAL_SCENES; +extern DLLSPEC daeString COLLADA_ELEMENT_SCENE; +extern DLLSPEC daeString COLLADA_ELEMENT_INSTANCE_PHYSICS_SCENE; +extern DLLSPEC daeString COLLADA_ELEMENT_INSTANCE_VISUAL_SCENE; +extern DLLSPEC daeString COLLADA_ELEMENT_IDREF_ARRAY; +extern DLLSPEC daeString COLLADA_ELEMENT_NAME_ARRAY; +extern DLLSPEC daeString COLLADA_ELEMENT_BOOL_ARRAY; +extern DLLSPEC daeString COLLADA_ELEMENT_FLOAT_ARRAY; +extern DLLSPEC daeString COLLADA_ELEMENT_INT_ARRAY; +extern DLLSPEC daeString COLLADA_ELEMENT_TECHNIQUE_COMMON; +extern DLLSPEC daeString COLLADA_ELEMENT_TECHNIQUE; +extern DLLSPEC daeString COLLADA_ELEMENT_ACCESSOR; +extern DLLSPEC daeString COLLADA_ELEMENT_CONVEX_MESH; +extern DLLSPEC daeString COLLADA_ELEMENT_MESH; +extern DLLSPEC daeString COLLADA_ELEMENT_SPLINE; +extern DLLSPEC daeString COLLADA_ELEMENT_VERTICES; +extern DLLSPEC daeString COLLADA_ELEMENT_LINES; +extern DLLSPEC daeString COLLADA_ELEMENT_LINESTRIPS; +extern DLLSPEC daeString COLLADA_ELEMENT_POLYGONS; +extern DLLSPEC daeString COLLADA_ELEMENT_POLYLIST; +extern DLLSPEC daeString COLLADA_ELEMENT_TRIANGLES; +extern DLLSPEC daeString COLLADA_ELEMENT_TRIFANS; +extern DLLSPEC daeString COLLADA_ELEMENT_TRISTRIPS; +extern DLLSPEC daeString COLLADA_ELEMENT_CONTROL_VERTICES; +extern DLLSPEC daeString COLLADA_ELEMENT_INPUT; +extern DLLSPEC daeString COLLADA_ELEMENT_P; +extern DLLSPEC daeString COLLADA_ELEMENT_PH; +extern DLLSPEC daeString COLLADA_ELEMENT_H; +extern DLLSPEC daeString COLLADA_ELEMENT_VCOUNT; +extern DLLSPEC daeString COLLADA_ELEMENT_DATA; +extern DLLSPEC daeString COLLADA_ELEMENT_AMBIENT; +extern DLLSPEC daeString COLLADA_ELEMENT_DIRECTIONAL; +extern DLLSPEC daeString COLLADA_ELEMENT_POINT; +extern DLLSPEC daeString COLLADA_ELEMENT_SPOT; +extern DLLSPEC daeString COLLADA_ELEMENT_CONSTANT_ATTENUATION; +extern DLLSPEC daeString COLLADA_ELEMENT_LINEAR_ATTENUATION; +extern DLLSPEC daeString COLLADA_ELEMENT_QUADRATIC_ATTENUATION; +extern DLLSPEC daeString COLLADA_ELEMENT_FALLOFF_ANGLE; +extern DLLSPEC daeString COLLADA_ELEMENT_FALLOFF_EXPONENT; +extern DLLSPEC daeString COLLADA_ELEMENT_INSTANCE_EFFECT; +extern DLLSPEC daeString COLLADA_ELEMENT_OPTICS; +extern DLLSPEC daeString COLLADA_ELEMENT_IMAGER; +extern DLLSPEC daeString COLLADA_ELEMENT_ORTHOGRAPHIC; +extern DLLSPEC daeString COLLADA_ELEMENT_PERSPECTIVE; +extern DLLSPEC daeString COLLADA_ELEMENT_XMAG; +extern DLLSPEC daeString COLLADA_ELEMENT_YMAG; +extern DLLSPEC daeString COLLADA_ELEMENT_ASPECT_RATIO; +extern DLLSPEC daeString COLLADA_ELEMENT_ZNEAR; +extern DLLSPEC daeString COLLADA_ELEMENT_ZFAR; +extern DLLSPEC daeString COLLADA_ELEMENT_XFOV; +extern DLLSPEC daeString COLLADA_ELEMENT_YFOV; +extern DLLSPEC daeString COLLADA_ELEMENT_SAMPLER; +extern DLLSPEC daeString COLLADA_ELEMENT_CHANNEL; +extern DLLSPEC daeString COLLADA_ELEMENT_ANIMATION; +extern DLLSPEC daeString COLLADA_ELEMENT_INSTANCE_ANIMATION; +extern DLLSPEC daeString COLLADA_ELEMENT_SKIN; +extern DLLSPEC daeString COLLADA_ELEMENT_MORPH; +extern DLLSPEC daeString COLLADA_ELEMENT_BIND_SHAPE_MATRIX; +extern DLLSPEC daeString COLLADA_ELEMENT_JOINTS; +extern DLLSPEC daeString COLLADA_ELEMENT_VERTEX_WEIGHTS; +extern DLLSPEC daeString COLLADA_ELEMENT_V; +extern DLLSPEC daeString COLLADA_ELEMENT_TARGETS; +extern DLLSPEC daeString COLLADA_ELEMENT_CONTRIBUTOR; +extern DLLSPEC daeString COLLADA_ELEMENT_CREATED; +extern DLLSPEC daeString COLLADA_ELEMENT_KEYWORDS; +extern DLLSPEC daeString COLLADA_ELEMENT_MODIFIED; +extern DLLSPEC daeString COLLADA_ELEMENT_REVISION; +extern DLLSPEC daeString COLLADA_ELEMENT_SUBJECT; +extern DLLSPEC daeString COLLADA_ELEMENT_TITLE; +extern DLLSPEC daeString COLLADA_ELEMENT_UNIT; +extern DLLSPEC daeString COLLADA_ELEMENT_UP_AXIS; +extern DLLSPEC daeString COLLADA_ELEMENT_AUTHOR; +extern DLLSPEC daeString COLLADA_ELEMENT_AUTHORING_TOOL; +extern DLLSPEC daeString COLLADA_ELEMENT_COMMENTS; +extern DLLSPEC daeString COLLADA_ELEMENT_COPYRIGHT; +extern DLLSPEC daeString COLLADA_ELEMENT_SOURCE_DATA; +extern DLLSPEC daeString COLLADA_ELEMENT_LOOKAT; +extern DLLSPEC daeString COLLADA_ELEMENT_MATRIX; +extern DLLSPEC daeString COLLADA_ELEMENT_ROTATE; +extern DLLSPEC daeString COLLADA_ELEMENT_SCALE; +extern DLLSPEC daeString COLLADA_ELEMENT_SKEW; +extern DLLSPEC daeString COLLADA_ELEMENT_TRANSLATE; +extern DLLSPEC daeString COLLADA_ELEMENT_INSTANCE_CAMERA; +extern DLLSPEC daeString COLLADA_ELEMENT_INSTANCE_CONTROLLER; +extern DLLSPEC daeString COLLADA_ELEMENT_INSTANCE_GEOMETRY; +extern DLLSPEC daeString COLLADA_ELEMENT_INSTANCE_LIGHT; +extern DLLSPEC daeString COLLADA_ELEMENT_INSTANCE_NODE; +extern DLLSPEC daeString COLLADA_ELEMENT_NODE; +extern DLLSPEC daeString COLLADA_ELEMENT_EVALUATE_SCENE; +extern DLLSPEC daeString COLLADA_ELEMENT_RENDER; +extern DLLSPEC daeString COLLADA_ELEMENT_LAYER; +extern DLLSPEC daeString COLLADA_ELEMENT_INSTANCE_MATERIAL; +extern DLLSPEC daeString COLLADA_ELEMENT_SKELETON; +extern DLLSPEC daeString COLLADA_ELEMENT_BIND_MATERIAL; +extern DLLSPEC daeString COLLADA_ELEMENT_TECHNIQUE_HINT; +extern DLLSPEC daeString COLLADA_ELEMENT_BIND; +extern DLLSPEC daeString COLLADA_ELEMENT_BIND_VERTEX_INPUT; +extern DLLSPEC daeString COLLADA_ELEMENT_INSTANCE_FORCE_FIELD; +extern DLLSPEC daeString COLLADA_ELEMENT_INSTANCE_RIGID_BODY; +extern DLLSPEC daeString COLLADA_ELEMENT_INSTANCE_RIGID_CONSTRAINT; +extern DLLSPEC daeString COLLADA_ELEMENT_ANGULAR_VELOCITY; +extern DLLSPEC daeString COLLADA_ELEMENT_VELOCITY; +extern DLLSPEC daeString COLLADA_ELEMENT_DYNAMIC; +extern DLLSPEC daeString COLLADA_ELEMENT_MASS; +extern DLLSPEC daeString COLLADA_ELEMENT_MASS_FRAME; +extern DLLSPEC daeString COLLADA_ELEMENT_INERTIA; +extern DLLSPEC daeString COLLADA_ELEMENT_INSTANCE_PHYSICS_MATERIAL; +extern DLLSPEC daeString COLLADA_ELEMENT_PHYSICS_MATERIAL; +extern DLLSPEC daeString COLLADA_ELEMENT_SHAPE; +extern DLLSPEC daeString COLLADA_ELEMENT_HOLLOW; +extern DLLSPEC daeString COLLADA_ELEMENT_DENSITY; +extern DLLSPEC daeString COLLADA_ELEMENT_PLANE; +extern DLLSPEC daeString COLLADA_ELEMENT_BOX; +extern DLLSPEC daeString COLLADA_ELEMENT_SPHERE; +extern DLLSPEC daeString COLLADA_ELEMENT_CYLINDER; +extern DLLSPEC daeString COLLADA_ELEMENT_TAPERED_CYLINDER; +extern DLLSPEC daeString COLLADA_ELEMENT_CAPSULE; +extern DLLSPEC daeString COLLADA_ELEMENT_TAPERED_CAPSULE; +extern DLLSPEC daeString COLLADA_ELEMENT_ANIMATION_CLIP; +extern DLLSPEC daeString COLLADA_ELEMENT_CAMERA; +extern DLLSPEC daeString COLLADA_ELEMENT_CONTROLLER; +extern DLLSPEC daeString COLLADA_ELEMENT_GEOMETRY; +extern DLLSPEC daeString COLLADA_ELEMENT_EFFECT; +extern DLLSPEC daeString COLLADA_ELEMENT_FORCE_FIELD; +extern DLLSPEC daeString COLLADA_ELEMENT_IMAGE; +extern DLLSPEC daeString COLLADA_ELEMENT_LIGHT; +extern DLLSPEC daeString COLLADA_ELEMENT_MATERIAL; +extern DLLSPEC daeString COLLADA_ELEMENT_PHYSICS_MODEL; +extern DLLSPEC daeString COLLADA_ELEMENT_PHYSICS_SCENE; +extern DLLSPEC daeString COLLADA_ELEMENT_VISUAL_SCENE; +extern DLLSPEC daeString COLLADA_ELEMENT_NEWPARAM; +extern DLLSPEC daeString COLLADA_ELEMENT_FX_PROFILE_ABSTRACT; +extern DLLSPEC daeString COLLADA_ELEMENT_PROFILE_GLSL; +extern DLLSPEC daeString COLLADA_ELEMENT_PASS; +extern DLLSPEC daeString COLLADA_ELEMENT_COLOR_TARGET; +extern DLLSPEC daeString COLLADA_ELEMENT_DEPTH_TARGET; +extern DLLSPEC daeString COLLADA_ELEMENT_STENCIL_TARGET; +extern DLLSPEC daeString COLLADA_ELEMENT_COLOR_CLEAR; +extern DLLSPEC daeString COLLADA_ELEMENT_DEPTH_CLEAR; +extern DLLSPEC daeString COLLADA_ELEMENT_STENCIL_CLEAR; +extern DLLSPEC daeString COLLADA_ELEMENT_DRAW; +extern DLLSPEC daeString COLLADA_ELEMENT_GL_PIPELINE_SETTINGS; +extern DLLSPEC daeString COLLADA_ELEMENT_SHADER; +extern DLLSPEC daeString COLLADA_ELEMENT_COMPILER_TARGET; +extern DLLSPEC daeString COLLADA_ELEMENT_COMPILER_OPTIONS; +extern DLLSPEC daeString COLLADA_ELEMENT_PROFILE_COMMON; +extern DLLSPEC daeString COLLADA_ELEMENT_LAMBERT; +extern DLLSPEC daeString COLLADA_ELEMENT_PHONG; +extern DLLSPEC daeString COLLADA_ELEMENT_BLINN; +extern DLLSPEC daeString COLLADA_ELEMENT_EMISSION; +extern DLLSPEC daeString COLLADA_ELEMENT_REFLECTIVE; +extern DLLSPEC daeString COLLADA_ELEMENT_REFLECTIVITY; +extern DLLSPEC daeString COLLADA_ELEMENT_TRANSPARENT; +extern DLLSPEC daeString COLLADA_ELEMENT_TRANSPARENCY; +extern DLLSPEC daeString COLLADA_ELEMENT_INDEX_OF_REFRACTION; +extern DLLSPEC daeString COLLADA_ELEMENT_DIFFUSE; +extern DLLSPEC daeString COLLADA_ELEMENT_SPECULAR; +extern DLLSPEC daeString COLLADA_ELEMENT_SHININESS; +extern DLLSPEC daeString COLLADA_ELEMENT_PROFILE_CG; +extern DLLSPEC daeString COLLADA_ELEMENT_PROFILE_GLES; +extern DLLSPEC daeString COLLADA_ELEMENT_GLES_PIPELINE_SETTINGS; +extern DLLSPEC daeString COLLADA_ELEMENT_HALF_EXTENTS; +extern DLLSPEC daeString COLLADA_ELEMENT_EQUATION; +extern DLLSPEC daeString COLLADA_ELEMENT_RADIUS; +extern DLLSPEC daeString COLLADA_ELEMENT_HEIGHT; +extern DLLSPEC daeString COLLADA_ELEMENT_RADIUS1; +extern DLLSPEC daeString COLLADA_ELEMENT_RADIUS2; +extern DLLSPEC daeString COLLADA_ELEMENT_DYNAMIC_FRICTION; +extern DLLSPEC daeString COLLADA_ELEMENT_RESTITUTION; +extern DLLSPEC daeString COLLADA_ELEMENT_STATIC_FRICTION; +extern DLLSPEC daeString COLLADA_ELEMENT_INSTANCE_PHYSICS_MODEL; +extern DLLSPEC daeString COLLADA_ELEMENT_GRAVITY; +extern DLLSPEC daeString COLLADA_ELEMENT_TIME_STEP; +extern DLLSPEC daeString COLLADA_ELEMENT_REF_ATTACHMENT; +extern DLLSPEC daeString COLLADA_ELEMENT_ATTACHMENT; +extern DLLSPEC daeString COLLADA_ELEMENT_ENABLED; +extern DLLSPEC daeString COLLADA_ELEMENT_INTERPENETRATE; +extern DLLSPEC daeString COLLADA_ELEMENT_LIMITS; +extern DLLSPEC daeString COLLADA_ELEMENT_SPRING; +extern DLLSPEC daeString COLLADA_ELEMENT_SWING_CONE_AND_TWIST; +extern DLLSPEC daeString COLLADA_ELEMENT_LINEAR; +extern DLLSPEC daeString COLLADA_ELEMENT_MIN; +extern DLLSPEC daeString COLLADA_ELEMENT_MAX; +extern DLLSPEC daeString COLLADA_ELEMENT_ANGULAR; +extern DLLSPEC daeString COLLADA_ELEMENT_STIFFNESS; +extern DLLSPEC daeString COLLADA_ELEMENT_DAMPING; +extern DLLSPEC daeString COLLADA_ELEMENT_TARGET_VALUE; +extern DLLSPEC daeString COLLADA_ELEMENT_RIGID_BODY; +extern DLLSPEC daeString COLLADA_ELEMENT_RIGID_CONSTRAINT; + +#endif //__DOM_CONSTANTS_H__ + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domController.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domController.h new file mode 100644 index 00000000..6a453c3a --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domController.h @@ -0,0 +1,175 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domController_h__ +#define __domController_h__ + +#include +#include + +#include +#include +#include +#include + +/** + * The controller element categorizes the declaration of generic control information. + * A controller is a device or mechanism that manages and directs the operations + * of another object. + */ +class domController : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::CONTROLLER; } +protected: // Attributes +/** + * The id attribute is a text string containing the unique identifier of + * this element. This value must be unique within the instance document. + * Optional attribute. + */ + xsID attrId; +/** + * The name attribute is the text string name of this element. Optional attribute. + */ + xsNCName attrName; + +protected: // Elements +/** + * The controller element may contain an asset element. @see domAsset + */ + domAssetRef elemAsset; +/** + * The controller element may contain either a skin element or a morph element. + * @see domSkin + */ + domSkinRef elemSkin; +/** + * The controller element may contain either a skin element or a morph element. + * @see domMorph + */ + domMorphRef elemMorph; +/** + * The extra element may appear any number of times. @see domExtra + */ + domExtra_Array elemExtra_array; + /** + * Used to preserve order in elements that do not specify strict sequencing of sub-elements. + */ + daeElementRefArray _contents; + /** + * Used to preserve order in elements that have a complex content model. + */ + daeUIntArray _contentsOrder; + + +public: //Accessors and Mutators + /** + * Gets the id attribute. + * @return Returns a xsID of the id attribute. + */ + xsID getId() const { return attrId; } + /** + * Sets the id attribute. + * @param atId The new value for the id attribute. + */ + void setId( xsID atId ) { *(daeStringRef*)&attrId = atId; + _validAttributeArray[0] = true; } + + /** + * Gets the name attribute. + * @return Returns a xsNCName of the name attribute. + */ + xsNCName getName() const { return attrName; } + /** + * Sets the name attribute. + * @param atName The new value for the name attribute. + */ + void setName( xsNCName atName ) { *(daeStringRef*)&attrName = atName; + _validAttributeArray[1] = true; } + + /** + * Gets the asset element. + * @return a daeSmartRef to the asset element. + */ + const domAssetRef getAsset() const { return elemAsset; } + /** + * Gets the skin element. + * @return a daeSmartRef to the skin element. + */ + const domSkinRef getSkin() const { return elemSkin; } + /** + * Gets the morph element. + * @return a daeSmartRef to the morph element. + */ + const domMorphRef getMorph() const { return elemMorph; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } + /** + * Gets the _contents array. + * @return Returns a reference to the _contents element array. + */ + daeElementRefArray &getContents() { return _contents; } + /** + * Gets the _contents array. + * @return Returns a constant reference to the _contents element array. + */ + const daeElementRefArray &getContents() const { return _contents; } + +protected: + /** + * Constructor + */ + domController() : attrId(), attrName(), elemAsset(), elemSkin(), elemMorph(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domController() {} + /** + * Copy Constructor + */ + domController( const domController &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domController &operator=( const domController &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domConvex_mesh.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domConvex_mesh.h new file mode 100644 index 00000000..06b85b45 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domConvex_mesh.h @@ -0,0 +1,236 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domConvex_mesh_h__ +#define __domConvex_mesh_h__ + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/** + * The definition of the convex_mesh element is identical to the mesh element + * with the exception that instead of a complete description (source, vertices, + * polygons etc.), it may simply point to another geometry to derive its + * shape. The latter case means that the convex hull of that geometry should + * be computed and is indicated by the optional “convex_hull_of†attribute. + */ +class domConvex_mesh : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::CONVEX_MESH; } +protected: // Attribute +/** + * The convex_hull_of attribute is a URI string of geometry to compute the + * convex hull of. Optional attribute. + */ + xsAnyURI attrConvex_hull_of; + +protected: // Elements + domSource_Array elemSource_array; + domVerticesRef elemVertices; + domLines_Array elemLines_array; + domLinestrips_Array elemLinestrips_array; + domPolygons_Array elemPolygons_array; + domPolylist_Array elemPolylist_array; + domTriangles_Array elemTriangles_array; + domTrifans_Array elemTrifans_array; + domTristrips_Array elemTristrips_array; +/** + * The extra element may appear any number of times. @see domExtra + */ + domExtra_Array elemExtra_array; + /** + * Used to preserve order in elements that do not specify strict sequencing of sub-elements. + */ + daeElementRefArray _contents; + /** + * Used to preserve order in elements that have a complex content model. + */ + daeUIntArray _contentsOrder; + + +public: //Accessors and Mutators + /** + * Gets the convex_hull_of attribute. + * @return Returns a xsAnyURI reference of the convex_hull_of attribute. + */ + xsAnyURI &getConvex_hull_of() { return attrConvex_hull_of; } + /** + * Gets the convex_hull_of attribute. + * @return Returns a constant xsAnyURI reference of the convex_hull_of attribute. + */ + const xsAnyURI &getConvex_hull_of() const { return attrConvex_hull_of; } + /** + * Sets the convex_hull_of attribute. + * @param atConvex_hull_of The new value for the convex_hull_of attribute. + */ + void setConvex_hull_of( const xsAnyURI &atConvex_hull_of ) { attrConvex_hull_of = atConvex_hull_of; + _validAttributeArray[0] = true; } + + /** + * Gets the source element array. + * @return Returns a reference to the array of source elements. + */ + domSource_Array &getSource_array() { return elemSource_array; } + /** + * Gets the source element array. + * @return Returns a constant reference to the array of source elements. + */ + const domSource_Array &getSource_array() const { return elemSource_array; } + /** + * Gets the vertices element. + * @return a daeSmartRef to the vertices element. + */ + const domVerticesRef getVertices() const { return elemVertices; } + /** + * Gets the lines element array. + * @return Returns a reference to the array of lines elements. + */ + domLines_Array &getLines_array() { return elemLines_array; } + /** + * Gets the lines element array. + * @return Returns a constant reference to the array of lines elements. + */ + const domLines_Array &getLines_array() const { return elemLines_array; } + /** + * Gets the linestrips element array. + * @return Returns a reference to the array of linestrips elements. + */ + domLinestrips_Array &getLinestrips_array() { return elemLinestrips_array; } + /** + * Gets the linestrips element array. + * @return Returns a constant reference to the array of linestrips elements. + */ + const domLinestrips_Array &getLinestrips_array() const { return elemLinestrips_array; } + /** + * Gets the polygons element array. + * @return Returns a reference to the array of polygons elements. + */ + domPolygons_Array &getPolygons_array() { return elemPolygons_array; } + /** + * Gets the polygons element array. + * @return Returns a constant reference to the array of polygons elements. + */ + const domPolygons_Array &getPolygons_array() const { return elemPolygons_array; } + /** + * Gets the polylist element array. + * @return Returns a reference to the array of polylist elements. + */ + domPolylist_Array &getPolylist_array() { return elemPolylist_array; } + /** + * Gets the polylist element array. + * @return Returns a constant reference to the array of polylist elements. + */ + const domPolylist_Array &getPolylist_array() const { return elemPolylist_array; } + /** + * Gets the triangles element array. + * @return Returns a reference to the array of triangles elements. + */ + domTriangles_Array &getTriangles_array() { return elemTriangles_array; } + /** + * Gets the triangles element array. + * @return Returns a constant reference to the array of triangles elements. + */ + const domTriangles_Array &getTriangles_array() const { return elemTriangles_array; } + /** + * Gets the trifans element array. + * @return Returns a reference to the array of trifans elements. + */ + domTrifans_Array &getTrifans_array() { return elemTrifans_array; } + /** + * Gets the trifans element array. + * @return Returns a constant reference to the array of trifans elements. + */ + const domTrifans_Array &getTrifans_array() const { return elemTrifans_array; } + /** + * Gets the tristrips element array. + * @return Returns a reference to the array of tristrips elements. + */ + domTristrips_Array &getTristrips_array() { return elemTristrips_array; } + /** + * Gets the tristrips element array. + * @return Returns a constant reference to the array of tristrips elements. + */ + const domTristrips_Array &getTristrips_array() const { return elemTristrips_array; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } + /** + * Gets the _contents array. + * @return Returns a reference to the _contents element array. + */ + daeElementRefArray &getContents() { return _contents; } + /** + * Gets the _contents array. + * @return Returns a constant reference to the _contents element array. + */ + const daeElementRefArray &getContents() const { return _contents; } + +protected: + /** + * Constructor + */ + domConvex_mesh() : attrConvex_hull_of(), elemSource_array(), elemVertices(), elemLines_array(), elemLinestrips_array(), elemPolygons_array(), elemPolylist_array(), elemTriangles_array(), elemTrifans_array(), elemTristrips_array(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domConvex_mesh() {} + /** + * Copy Constructor + */ + domConvex_mesh( const domConvex_mesh &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domConvex_mesh &operator=( const domConvex_mesh &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCylinder.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCylinder.h new file mode 100644 index 00000000..905a36aa --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domCylinder.h @@ -0,0 +1,253 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domCylinder_h__ +#define __domCylinder_h__ + +#include +#include + +#include + +/** + * A cylinder primitive that is centered on, and aligned with. the local Y + * axis. + */ +class domCylinder : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::CYLINDER; } +public: + class domHeight; + + typedef daeSmartRef domHeightRef; + typedef daeTArray domHeight_Array; + +/** + * A float value that represents the length of the cylinder along the Y axis. + */ + class domHeight : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::HEIGHT; } + + protected: // Value + /** + * The domFloat value of the text data of this element. + */ + domFloat _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a domFloat of the value. + */ + domFloat getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( domFloat val ) { _value = val; } + + protected: + /** + * Constructor + */ + domHeight() : _value() {} + /** + * Destructor + */ + virtual ~domHeight() {} + /** + * Copy Constructor + */ + domHeight( const domHeight &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domHeight &operator=( const domHeight &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domRadius; + + typedef daeSmartRef domRadiusRef; + typedef daeTArray domRadius_Array; + +/** + * float2 values that represent the radii of the cylinder. + */ + class domRadius : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::RADIUS; } + + protected: // Value + /** + * The domFloat2 value of the text data of this element. + */ + domFloat2 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domFloat2 reference of the _value array. + */ + domFloat2 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domFloat2 reference of the _value array. + */ + const domFloat2 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domFloat2 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domRadius() : _value() {} + /** + * Destructor + */ + virtual ~domRadius() {} + /** + * Copy Constructor + */ + domRadius( const domRadius &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domRadius &operator=( const domRadius &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + + +protected: // Elements +/** + * A float value that represents the length of the cylinder along the Y axis. + * @see domHeight + */ + domHeightRef elemHeight; +/** + * float2 values that represent the radii of the cylinder. @see domRadius + */ + domRadiusRef elemRadius; +/** + * The extra element may appear any number of times. @see domExtra + */ + domExtra_Array elemExtra_array; + +public: //Accessors and Mutators + /** + * Gets the height element. + * @return a daeSmartRef to the height element. + */ + const domHeightRef getHeight() const { return elemHeight; } + /** + * Gets the radius element. + * @return a daeSmartRef to the radius element. + */ + const domRadiusRef getRadius() const { return elemRadius; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } +protected: + /** + * Constructor + */ + domCylinder() : elemHeight(), elemRadius(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domCylinder() {} + /** + * Copy Constructor + */ + domCylinder( const domCylinder &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domCylinder &operator=( const domCylinder &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domEffect.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domEffect.h new file mode 100644 index 00000000..64c02caa --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domEffect.h @@ -0,0 +1,215 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domEffect_h__ +#define __domEffect_h__ + +#include +#include + +#include +#include +#include +#include +#include +#include + +/** + * A self contained description of a shader effect. + */ +class domEffect : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::EFFECT; } +protected: // Attributes +/** + * The id attribute is a text string containing the unique identifier of + * this element. This value must be unique within the instance document. + * Optional attribute. + */ + xsID attrId; +/** + * The name attribute is the text string name of this element. Optional attribute. + */ + xsNCName attrName; + +protected: // Elements +/** + * The effect element may contain an asset element. @see domAsset + */ + domAssetRef elemAsset; +/** + * The annotate element allows you to specify an annotation on this effect. + * @see domAnnotate + */ + domFx_annotate_common_Array elemAnnotate_array; +/** + * The image element allows you to create image resources which can be shared + * by multipe profiles. @see domImage + */ + domImage_Array elemImage_array; +/** + * The newparam element allows you to create new effect parameters which can + * be shared by multipe profiles. @see domNewparam + */ + domFx_newparam_common_Array elemNewparam_array; +/** + * This is the substituion group hook which allows you to swap in other COLLADA + * FX profiles. @see domFx_profile_abstract + */ + domFx_profile_abstract_Array elemFx_profile_abstract_array; +/** + * The extra element may appear any number of times. @see domExtra + */ + domExtra_Array elemExtra_array; + /** + * Used to preserve order in elements that do not specify strict sequencing of sub-elements. + */ + daeElementRefArray _contents; + /** + * Used to preserve order in elements that have a complex content model. + */ + daeUIntArray _contentsOrder; + + +public: //Accessors and Mutators + /** + * Gets the id attribute. + * @return Returns a xsID of the id attribute. + */ + xsID getId() const { return attrId; } + /** + * Sets the id attribute. + * @param atId The new value for the id attribute. + */ + void setId( xsID atId ) { *(daeStringRef*)&attrId = atId; + _validAttributeArray[0] = true; } + + /** + * Gets the name attribute. + * @return Returns a xsNCName of the name attribute. + */ + xsNCName getName() const { return attrName; } + /** + * Sets the name attribute. + * @param atName The new value for the name attribute. + */ + void setName( xsNCName atName ) { *(daeStringRef*)&attrName = atName; + _validAttributeArray[1] = true; } + + /** + * Gets the asset element. + * @return a daeSmartRef to the asset element. + */ + const domAssetRef getAsset() const { return elemAsset; } + /** + * Gets the annotate element array. + * @return Returns a reference to the array of annotate elements. + */ + domFx_annotate_common_Array &getAnnotate_array() { return elemAnnotate_array; } + /** + * Gets the annotate element array. + * @return Returns a constant reference to the array of annotate elements. + */ + const domFx_annotate_common_Array &getAnnotate_array() const { return elemAnnotate_array; } + /** + * Gets the image element array. + * @return Returns a reference to the array of image elements. + */ + domImage_Array &getImage_array() { return elemImage_array; } + /** + * Gets the image element array. + * @return Returns a constant reference to the array of image elements. + */ + const domImage_Array &getImage_array() const { return elemImage_array; } + /** + * Gets the newparam element array. + * @return Returns a reference to the array of newparam elements. + */ + domFx_newparam_common_Array &getNewparam_array() { return elemNewparam_array; } + /** + * Gets the newparam element array. + * @return Returns a constant reference to the array of newparam elements. + */ + const domFx_newparam_common_Array &getNewparam_array() const { return elemNewparam_array; } + /** + * Gets the fx_profile_abstract element array. + * @return Returns a reference to the array of fx_profile_abstract elements. + */ + domFx_profile_abstract_Array &getFx_profile_abstract_array() { return elemFx_profile_abstract_array; } + /** + * Gets the fx_profile_abstract element array. + * @return Returns a constant reference to the array of fx_profile_abstract elements. + */ + const domFx_profile_abstract_Array &getFx_profile_abstract_array() const { return elemFx_profile_abstract_array; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } + /** + * Gets the _contents array. + * @return Returns a reference to the _contents element array. + */ + daeElementRefArray &getContents() { return _contents; } + /** + * Gets the _contents array. + * @return Returns a constant reference to the _contents element array. + */ + const daeElementRefArray &getContents() const { return _contents; } + +protected: + /** + * Constructor + */ + domEffect() : attrId(), attrName(), elemAsset(), elemAnnotate_array(), elemImage_array(), elemNewparam_array(), elemFx_profile_abstract_array(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domEffect() {} + /** + * Copy Constructor + */ + domEffect( const domEffect &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domEffect &operator=( const domEffect &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domElements.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domElements.h new file mode 100644 index 00000000..17dcf204 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domElements.h @@ -0,0 +1,871 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#ifndef __DOM_ELEMENTS_H__ +#define __DOM_ELEMENTS_H__ + +#include + +class domInputGlobal; + +typedef daeSmartRef domInputGlobalRef; +typedef daeTArray domInputGlobal_Array; + +class domInputLocal; + +typedef daeSmartRef domInputLocalRef; +typedef daeTArray domInputLocal_Array; + +class domInputLocalOffset; + +typedef daeSmartRef domInputLocalOffsetRef; +typedef daeTArray domInputLocalOffset_Array; + +class domInstanceWithExtra; + +typedef daeSmartRef domInstanceWithExtraRef; +typedef daeTArray domInstanceWithExtra_Array; + +class domTargetableFloat; + +typedef daeSmartRef domTargetableFloatRef; +typedef daeTArray domTargetableFloat_Array; + +class domTargetableFloat3; + +typedef daeSmartRef domTargetableFloat3Ref; +typedef daeTArray domTargetableFloat3_Array; + +class domFx_surface_format_hint_common; + +typedef daeSmartRef domFx_surface_format_hint_commonRef; +typedef daeTArray domFx_surface_format_hint_common_Array; + +class domFx_surface_init_planar_common; + +typedef daeSmartRef domFx_surface_init_planar_commonRef; +typedef daeTArray domFx_surface_init_planar_common_Array; + +class domFx_surface_init_volume_common; + +typedef daeSmartRef domFx_surface_init_volume_commonRef; +typedef daeTArray domFx_surface_init_volume_common_Array; + +class domFx_surface_init_cube_common; + +typedef daeSmartRef domFx_surface_init_cube_commonRef; +typedef daeTArray domFx_surface_init_cube_common_Array; + +class domFx_surface_init_from_common; + +typedef daeSmartRef domFx_surface_init_from_commonRef; +typedef daeTArray domFx_surface_init_from_common_Array; + +class domFx_surface_common; + +typedef daeSmartRef domFx_surface_commonRef; +typedef daeTArray domFx_surface_common_Array; + +class domFx_sampler1D_common; + +typedef daeSmartRef domFx_sampler1D_commonRef; +typedef daeTArray domFx_sampler1D_common_Array; + +class domFx_sampler2D_common; + +typedef daeSmartRef domFx_sampler2D_commonRef; +typedef daeTArray domFx_sampler2D_common_Array; + +class domFx_sampler3D_common; + +typedef daeSmartRef domFx_sampler3D_commonRef; +typedef daeTArray domFx_sampler3D_common_Array; + +class domFx_samplerCUBE_common; + +typedef daeSmartRef domFx_samplerCUBE_commonRef; +typedef daeTArray domFx_samplerCUBE_common_Array; + +class domFx_samplerRECT_common; + +typedef daeSmartRef domFx_samplerRECT_commonRef; +typedef daeTArray domFx_samplerRECT_common_Array; + +class domFx_samplerDEPTH_common; + +typedef daeSmartRef domFx_samplerDEPTH_commonRef; +typedef daeTArray domFx_samplerDEPTH_common_Array; + +class domFx_colortarget_common; + +typedef daeSmartRef domFx_colortarget_commonRef; +typedef daeTArray domFx_colortarget_common_Array; + +class domFx_depthtarget_common; + +typedef daeSmartRef domFx_depthtarget_commonRef; +typedef daeTArray domFx_depthtarget_common_Array; + +class domFx_stenciltarget_common; + +typedef daeSmartRef domFx_stenciltarget_commonRef; +typedef daeTArray domFx_stenciltarget_common_Array; + +class domFx_clearcolor_common; + +typedef daeSmartRef domFx_clearcolor_commonRef; +typedef daeTArray domFx_clearcolor_common_Array; + +class domFx_cleardepth_common; + +typedef daeSmartRef domFx_cleardepth_commonRef; +typedef daeTArray domFx_cleardepth_common_Array; + +class domFx_clearstencil_common; + +typedef daeSmartRef domFx_clearstencil_commonRef; +typedef daeTArray domFx_clearstencil_common_Array; + +class domFx_annotate_common; + +typedef daeSmartRef domFx_annotate_commonRef; +typedef daeTArray domFx_annotate_common_Array; + +class domFx_include_common; + +typedef daeSmartRef domFx_include_commonRef; +typedef daeTArray domFx_include_common_Array; + +class domFx_newparam_common; + +typedef daeSmartRef domFx_newparam_commonRef; +typedef daeTArray domFx_newparam_common_Array; + +class domFx_code_profile; + +typedef daeSmartRef domFx_code_profileRef; +typedef daeTArray domFx_code_profile_Array; + +class domGl_sampler1D; + +typedef daeSmartRef domGl_sampler1DRef; +typedef daeTArray domGl_sampler1D_Array; + +class domGl_sampler2D; + +typedef daeSmartRef domGl_sampler2DRef; +typedef daeTArray domGl_sampler2D_Array; + +class domGl_sampler3D; + +typedef daeSmartRef domGl_sampler3DRef; +typedef daeTArray domGl_sampler3D_Array; + +class domGl_samplerCUBE; + +typedef daeSmartRef domGl_samplerCUBERef; +typedef daeTArray domGl_samplerCUBE_Array; + +class domGl_samplerRECT; + +typedef daeSmartRef domGl_samplerRECTRef; +typedef daeTArray domGl_samplerRECT_Array; + +class domGl_samplerDEPTH; + +typedef daeSmartRef domGl_samplerDEPTHRef; +typedef daeTArray domGl_samplerDEPTH_Array; + +class domGlsl_newarray_type; + +typedef daeSmartRef domGlsl_newarray_typeRef; +typedef daeTArray domGlsl_newarray_type_Array; + +class domGlsl_setarray_type; + +typedef daeSmartRef domGlsl_setarray_typeRef; +typedef daeTArray domGlsl_setarray_type_Array; + +class domGlsl_surface_type; + +typedef daeSmartRef domGlsl_surface_typeRef; +typedef daeTArray domGlsl_surface_type_Array; + +class domGlsl_newparam; + +typedef daeSmartRef domGlsl_newparamRef; +typedef daeTArray domGlsl_newparam_Array; + +class domGlsl_setparam_simple; + +typedef daeSmartRef domGlsl_setparam_simpleRef; +typedef daeTArray domGlsl_setparam_simple_Array; + +class domGlsl_setparam; + +typedef daeSmartRef domGlsl_setparamRef; +typedef daeTArray domGlsl_setparam_Array; + +class domCommon_float_or_param_type; + +typedef daeSmartRef domCommon_float_or_param_typeRef; +typedef daeTArray domCommon_float_or_param_type_Array; + +class domCommon_color_or_texture_type; + +typedef daeSmartRef domCommon_color_or_texture_typeRef; +typedef daeTArray domCommon_color_or_texture_type_Array; + +class domCommon_transparent_type; + +typedef daeSmartRef domCommon_transparent_typeRef; +typedef daeTArray domCommon_transparent_type_Array; + +class domCommon_newparam_type; + +typedef daeSmartRef domCommon_newparam_typeRef; +typedef daeTArray domCommon_newparam_type_Array; + +class domCg_sampler1D; + +typedef daeSmartRef domCg_sampler1DRef; +typedef daeTArray domCg_sampler1D_Array; + +class domCg_sampler2D; + +typedef daeSmartRef domCg_sampler2DRef; +typedef daeTArray domCg_sampler2D_Array; + +class domCg_sampler3D; + +typedef daeSmartRef domCg_sampler3DRef; +typedef daeTArray domCg_sampler3D_Array; + +class domCg_samplerCUBE; + +typedef daeSmartRef domCg_samplerCUBERef; +typedef daeTArray domCg_samplerCUBE_Array; + +class domCg_samplerRECT; + +typedef daeSmartRef domCg_samplerRECTRef; +typedef daeTArray domCg_samplerRECT_Array; + +class domCg_samplerDEPTH; + +typedef daeSmartRef domCg_samplerDEPTHRef; +typedef daeTArray domCg_samplerDEPTH_Array; + +class domCg_connect_param; + +typedef daeSmartRef domCg_connect_paramRef; +typedef daeTArray domCg_connect_param_Array; + +class domCg_newarray_type; + +typedef daeSmartRef domCg_newarray_typeRef; +typedef daeTArray domCg_newarray_type_Array; + +class domCg_setarray_type; + +typedef daeSmartRef domCg_setarray_typeRef; +typedef daeTArray domCg_setarray_type_Array; + +class domCg_setuser_type; + +typedef daeSmartRef domCg_setuser_typeRef; +typedef daeTArray domCg_setuser_type_Array; + +class domCg_surface_type; + +typedef daeSmartRef domCg_surface_typeRef; +typedef daeTArray domCg_surface_type_Array; + +class domCg_newparam; + +typedef daeSmartRef domCg_newparamRef; +typedef daeTArray domCg_newparam_Array; + +class domCg_setparam_simple; + +typedef daeSmartRef domCg_setparam_simpleRef; +typedef daeTArray domCg_setparam_simple_Array; + +class domCg_setparam; + +typedef daeSmartRef domCg_setparamRef; +typedef daeTArray domCg_setparam_Array; + +class domGles_texture_constant_type; + +typedef daeSmartRef domGles_texture_constant_typeRef; +typedef daeTArray domGles_texture_constant_type_Array; + +class domGles_texenv_command_type; + +typedef daeSmartRef domGles_texenv_command_typeRef; +typedef daeTArray domGles_texenv_command_type_Array; + +class domGles_texcombiner_argumentRGB_type; + +typedef daeSmartRef domGles_texcombiner_argumentRGB_typeRef; +typedef daeTArray domGles_texcombiner_argumentRGB_type_Array; + +class domGles_texcombiner_argumentAlpha_type; + +typedef daeSmartRef domGles_texcombiner_argumentAlpha_typeRef; +typedef daeTArray domGles_texcombiner_argumentAlpha_type_Array; + +class domGles_texcombiner_commandRGB_type; + +typedef daeSmartRef domGles_texcombiner_commandRGB_typeRef; +typedef daeTArray domGles_texcombiner_commandRGB_type_Array; + +class domGles_texcombiner_commandAlpha_type; + +typedef daeSmartRef domGles_texcombiner_commandAlpha_typeRef; +typedef daeTArray domGles_texcombiner_commandAlpha_type_Array; + +class domGles_texcombiner_command_type; + +typedef daeSmartRef domGles_texcombiner_command_typeRef; +typedef daeTArray domGles_texcombiner_command_type_Array; + +class domGles_texture_pipeline; + +typedef daeSmartRef domGles_texture_pipelineRef; +typedef daeTArray domGles_texture_pipeline_Array; + +class domGles_texture_unit; + +typedef daeSmartRef domGles_texture_unitRef; +typedef daeTArray domGles_texture_unit_Array; + +class domGles_sampler_state; + +typedef daeSmartRef domGles_sampler_stateRef; +typedef daeTArray domGles_sampler_state_Array; + +class domGles_newparam; + +typedef daeSmartRef domGles_newparamRef; +typedef daeTArray domGles_newparam_Array; + +class domFx_surface_init_common; + +typedef daeSmartRef domFx_surface_init_commonRef; +typedef daeTArray domFx_surface_init_common_Array; + +class domFx_annotate_type_common; + +typedef daeSmartRef domFx_annotate_type_commonRef; +typedef daeTArray domFx_annotate_type_common_Array; + +class domFx_basic_type_common; + +typedef daeSmartRef domFx_basic_type_commonRef; +typedef daeTArray domFx_basic_type_common_Array; + +class domGl_pipeline_settings; + +typedef daeSmartRef domGl_pipeline_settingsRef; +typedef daeTArray domGl_pipeline_settings_Array; + +class domGlsl_param_type; + +typedef daeSmartRef domGlsl_param_typeRef; +typedef daeTArray domGlsl_param_type_Array; + +class domCg_param_type; + +typedef daeSmartRef domCg_param_typeRef; +typedef daeTArray domCg_param_type_Array; + +class domGles_pipeline_settings; + +typedef daeSmartRef domGles_pipeline_settingsRef; +typedef daeTArray domGles_pipeline_settings_Array; + +class domGles_basic_type_common; + +typedef daeSmartRef domGles_basic_type_commonRef; +typedef daeTArray domGles_basic_type_common_Array; + +class domCOLLADA; + +typedef daeSmartRef domCOLLADARef; +typedef daeTArray domCOLLADA_Array; + +class domIDREF_array; + +typedef daeSmartRef domIDREF_arrayRef; +typedef daeTArray domIDREF_array_Array; + +class domName_array; + +typedef daeSmartRef domName_arrayRef; +typedef daeTArray domName_array_Array; + +class domBool_array; + +typedef daeSmartRef domBool_arrayRef; +typedef daeTArray domBool_array_Array; + +class domFloat_array; + +typedef daeSmartRef domFloat_arrayRef; +typedef daeTArray domFloat_array_Array; + +class domInt_array; + +typedef daeSmartRef domInt_arrayRef; +typedef daeTArray domInt_array_Array; + +class domAccessor; + +typedef daeSmartRef domAccessorRef; +typedef daeTArray domAccessor_Array; + +class domParam; + +typedef daeSmartRef domParamRef; +typedef daeTArray domParam_Array; + +class domSource; + +typedef daeSmartRef domSourceRef; +typedef daeTArray domSource_Array; + +class domGeometry; + +typedef daeSmartRef domGeometryRef; +typedef daeTArray domGeometry_Array; + +class domMesh; + +typedef daeSmartRef domMeshRef; +typedef daeTArray domMesh_Array; + +class domSpline; + +typedef daeSmartRef domSplineRef; +typedef daeTArray domSpline_Array; + +class domP; + +typedef daeSmartRef domPRef; +typedef daeTArray domP_Array; + +class domLines; + +typedef daeSmartRef domLinesRef; +typedef daeTArray domLines_Array; + +class domLinestrips; + +typedef daeSmartRef domLinestripsRef; +typedef daeTArray domLinestrips_Array; + +class domPolygons; + +typedef daeSmartRef domPolygonsRef; +typedef daeTArray domPolygons_Array; + +class domPolylist; + +typedef daeSmartRef domPolylistRef; +typedef daeTArray domPolylist_Array; + +class domTriangles; + +typedef daeSmartRef domTrianglesRef; +typedef daeTArray domTriangles_Array; + +class domTrifans; + +typedef daeSmartRef domTrifansRef; +typedef daeTArray domTrifans_Array; + +class domTristrips; + +typedef daeSmartRef domTristripsRef; +typedef daeTArray domTristrips_Array; + +class domVertices; + +typedef daeSmartRef domVerticesRef; +typedef daeTArray domVertices_Array; + +class domLookat; + +typedef daeSmartRef domLookatRef; +typedef daeTArray domLookat_Array; + +class domMatrix; + +typedef daeSmartRef domMatrixRef; +typedef daeTArray domMatrix_Array; + +class domRotate; + +typedef daeSmartRef domRotateRef; +typedef daeTArray domRotate_Array; + +class domScale; + +typedef daeSmartRef domScaleRef; +typedef daeTArray domScale_Array; + +class domSkew; + +typedef daeSmartRef domSkewRef; +typedef daeTArray domSkew_Array; + +class domTranslate; + +typedef daeSmartRef domTranslateRef; +typedef daeTArray domTranslate_Array; + +class domImage; + +typedef daeSmartRef domImageRef; +typedef daeTArray domImage_Array; + +class domLight; + +typedef daeSmartRef domLightRef; +typedef daeTArray domLight_Array; + +class domMaterial; + +typedef daeSmartRef domMaterialRef; +typedef daeTArray domMaterial_Array; + +class domCamera; + +typedef daeSmartRef domCameraRef; +typedef daeTArray domCamera_Array; + +class domAnimation; + +typedef daeSmartRef domAnimationRef; +typedef daeTArray domAnimation_Array; + +class domAnimation_clip; + +typedef daeSmartRef domAnimation_clipRef; +typedef daeTArray domAnimation_clip_Array; + +class domChannel; + +typedef daeSmartRef domChannelRef; +typedef daeTArray domChannel_Array; + +class domSampler; + +typedef daeSmartRef domSamplerRef; +typedef daeTArray domSampler_Array; + +class domController; + +typedef daeSmartRef domControllerRef; +typedef daeTArray domController_Array; + +class domSkin; + +typedef daeSmartRef domSkinRef; +typedef daeTArray domSkin_Array; + +class domMorph; + +typedef daeSmartRef domMorphRef; +typedef daeTArray domMorph_Array; + +class domAsset; + +typedef daeSmartRef domAssetRef; +typedef daeTArray domAsset_Array; + +class domExtra; + +typedef daeSmartRef domExtraRef; +typedef daeTArray domExtra_Array; + +class domTechnique; + +typedef daeSmartRef domTechniqueRef; +typedef daeTArray domTechnique_Array; + +class domNode; + +typedef daeSmartRef domNodeRef; +typedef daeTArray domNode_Array; + +class domVisual_scene; + +typedef daeSmartRef domVisual_sceneRef; +typedef daeTArray domVisual_scene_Array; + +class domBind_material; + +typedef daeSmartRef domBind_materialRef; +typedef daeTArray domBind_material_Array; + +class domInstance_camera; + +typedef daeSmartRef domInstance_cameraRef; +typedef daeTArray domInstance_camera_Array; + +class domInstance_controller; + +typedef daeSmartRef domInstance_controllerRef; +typedef daeTArray domInstance_controller_Array; + +class domInstance_effect; + +typedef daeSmartRef domInstance_effectRef; +typedef daeTArray domInstance_effect_Array; + +class domInstance_force_field; + +typedef daeSmartRef domInstance_force_fieldRef; +typedef daeTArray domInstance_force_field_Array; + +class domInstance_geometry; + +typedef daeSmartRef domInstance_geometryRef; +typedef daeTArray domInstance_geometry_Array; + +class domInstance_light; + +typedef daeSmartRef domInstance_lightRef; +typedef daeTArray domInstance_light_Array; + +class domInstance_material; + +typedef daeSmartRef domInstance_materialRef; +typedef daeTArray domInstance_material_Array; + +class domInstance_node; + +typedef daeSmartRef domInstance_nodeRef; +typedef daeTArray domInstance_node_Array; + +class domInstance_physics_material; + +typedef daeSmartRef domInstance_physics_materialRef; +typedef daeTArray domInstance_physics_material_Array; + +class domInstance_physics_model; + +typedef daeSmartRef domInstance_physics_modelRef; +typedef daeTArray domInstance_physics_model_Array; + +class domInstance_rigid_body; + +typedef daeSmartRef domInstance_rigid_bodyRef; +typedef daeTArray domInstance_rigid_body_Array; + +class domInstance_rigid_constraint; + +typedef daeSmartRef domInstance_rigid_constraintRef; +typedef daeTArray domInstance_rigid_constraint_Array; + +class domLibrary_animations; + +typedef daeSmartRef domLibrary_animationsRef; +typedef daeTArray domLibrary_animations_Array; + +class domLibrary_animation_clips; + +typedef daeSmartRef domLibrary_animation_clipsRef; +typedef daeTArray domLibrary_animation_clips_Array; + +class domLibrary_cameras; + +typedef daeSmartRef domLibrary_camerasRef; +typedef daeTArray domLibrary_cameras_Array; + +class domLibrary_controllers; + +typedef daeSmartRef domLibrary_controllersRef; +typedef daeTArray domLibrary_controllers_Array; + +class domLibrary_geometries; + +typedef daeSmartRef domLibrary_geometriesRef; +typedef daeTArray domLibrary_geometries_Array; + +class domLibrary_effects; + +typedef daeSmartRef domLibrary_effectsRef; +typedef daeTArray domLibrary_effects_Array; + +class domLibrary_force_fields; + +typedef daeSmartRef domLibrary_force_fieldsRef; +typedef daeTArray domLibrary_force_fields_Array; + +class domLibrary_images; + +typedef daeSmartRef domLibrary_imagesRef; +typedef daeTArray domLibrary_images_Array; + +class domLibrary_lights; + +typedef daeSmartRef domLibrary_lightsRef; +typedef daeTArray domLibrary_lights_Array; + +class domLibrary_materials; + +typedef daeSmartRef domLibrary_materialsRef; +typedef daeTArray domLibrary_materials_Array; + +class domLibrary_nodes; + +typedef daeSmartRef domLibrary_nodesRef; +typedef daeTArray domLibrary_nodes_Array; + +class domLibrary_physics_materials; + +typedef daeSmartRef domLibrary_physics_materialsRef; +typedef daeTArray domLibrary_physics_materials_Array; + +class domLibrary_physics_models; + +typedef daeSmartRef domLibrary_physics_modelsRef; +typedef daeTArray domLibrary_physics_models_Array; + +class domLibrary_physics_scenes; + +typedef daeSmartRef domLibrary_physics_scenesRef; +typedef daeTArray domLibrary_physics_scenes_Array; + +class domLibrary_visual_scenes; + +typedef daeSmartRef domLibrary_visual_scenesRef; +typedef daeTArray domLibrary_visual_scenes_Array; + +class domFx_profile_abstract; + +typedef daeSmartRef domFx_profile_abstractRef; +typedef daeTArray domFx_profile_abstract_Array; + +class domEffect; + +typedef daeSmartRef domEffectRef; +typedef daeTArray domEffect_Array; + +class domGl_hook_abstract; + +typedef daeSmartRef domGl_hook_abstractRef; +typedef daeTArray domGl_hook_abstract_Array; + +class domProfile_GLSL; + +typedef daeSmartRef domProfile_GLSLRef; +typedef daeTArray domProfile_GLSL_Array; + +class domProfile_COMMON; + +typedef daeSmartRef domProfile_COMMONRef; +typedef daeTArray domProfile_COMMON_Array; + +class domProfile_CG; + +typedef daeSmartRef domProfile_CGRef; +typedef daeTArray domProfile_CG_Array; + +class domProfile_GLES; + +typedef daeSmartRef domProfile_GLESRef; +typedef daeTArray domProfile_GLES_Array; + +class domBox; + +typedef daeSmartRef domBoxRef; +typedef daeTArray domBox_Array; + +class domPlane; + +typedef daeSmartRef domPlaneRef; +typedef daeTArray domPlane_Array; + +class domSphere; + +typedef daeSmartRef domSphereRef; +typedef daeTArray domSphere_Array; + +class domEllipsoid; + +typedef daeSmartRef domEllipsoidRef; +typedef daeTArray domEllipsoid_Array; + +class domCylinder; + +typedef daeSmartRef domCylinderRef; +typedef daeTArray domCylinder_Array; + +class domTapered_cylinder; + +typedef daeSmartRef domTapered_cylinderRef; +typedef daeTArray domTapered_cylinder_Array; + +class domCapsule; + +typedef daeSmartRef domCapsuleRef; +typedef daeTArray domCapsule_Array; + +class domTapered_capsule; + +typedef daeSmartRef domTapered_capsuleRef; +typedef daeTArray domTapered_capsule_Array; + +class domConvex_mesh; + +typedef daeSmartRef domConvex_meshRef; +typedef daeTArray domConvex_mesh_Array; + +class domForce_field; + +typedef daeSmartRef domForce_fieldRef; +typedef daeTArray domForce_field_Array; + +class domPhysics_material; + +typedef daeSmartRef domPhysics_materialRef; +typedef daeTArray domPhysics_material_Array; + +class domPhysics_scene; + +typedef daeSmartRef domPhysics_sceneRef; +typedef daeTArray domPhysics_scene_Array; + +class domRigid_body; + +typedef daeSmartRef domRigid_bodyRef; +typedef daeTArray domRigid_body_Array; + +class domRigid_constraint; + +typedef daeSmartRef domRigid_constraintRef; +typedef daeTArray domRigid_constraint_Array; + +class domPhysics_model; + +typedef daeSmartRef domPhysics_modelRef; +typedef daeTArray domPhysics_model_Array; + + +#endif //__DOM_ELEMENTS_H__ + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domEllipsoid.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domEllipsoid.h new file mode 100644 index 00000000..29465264 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domEllipsoid.h @@ -0,0 +1,148 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domEllipsoid_h__ +#define __domEllipsoid_h__ + +#include +#include + + +class domEllipsoid : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::ELLIPSOID; } +public: + class domSize; + + typedef daeSmartRef domSizeRef; + typedef daeTArray domSize_Array; + + class domSize : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::SIZE; } + + protected: // Value + /** + * The domFloat3 value of the text data of this element. + */ + domFloat3 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domFloat3 reference of the _value array. + */ + domFloat3 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domFloat3 reference of the _value array. + */ + const domFloat3 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domFloat3 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domSize() : _value() {} + /** + * Destructor + */ + virtual ~domSize() {} + /** + * Copy Constructor + */ + domSize( const domSize &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domSize &operator=( const domSize &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + + +protected: // Element + domSizeRef elemSize; + +public: //Accessors and Mutators + /** + * Gets the size element. + * @return a daeSmartRef to the size element. + */ + const domSizeRef getSize() const { return elemSize; } +protected: + /** + * Constructor + */ + domEllipsoid() : elemSize() {} + /** + * Destructor + */ + virtual ~domEllipsoid() {} + /** + * Copy Constructor + */ + domEllipsoid( const domEllipsoid &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domEllipsoid &operator=( const domEllipsoid &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domExtra.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domExtra.h new file mode 100644 index 00000000..b5eab322 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domExtra.h @@ -0,0 +1,150 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domExtra_h__ +#define __domExtra_h__ + +#include +#include + +#include +#include + +/** + * The extra element declares additional information regarding its parent + * element. + */ +class domExtra : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::EXTRA; } +protected: // Attributes +/** + * The id attribute is a text string containing the unique identifier of + * this element. This value must be unique within the instance document. + * Optional attribute. + */ + xsID attrId; +/** + * The name attribute is the text string name of this element. Optional attribute. + */ + xsNCName attrName; +/** + * The type attribute indicates the type of the value data. This text string + * must be understood by the application. Optional attribute. + */ + xsNMTOKEN attrType; + +protected: // Elements +/** + * The extra element may contain an asset element. @see domAsset + */ + domAssetRef elemAsset; +/** + * This element must contain at least one non-common profile technique. + * @see domTechnique + */ + domTechnique_Array elemTechnique_array; + +public: //Accessors and Mutators + /** + * Gets the id attribute. + * @return Returns a xsID of the id attribute. + */ + xsID getId() const { return attrId; } + /** + * Sets the id attribute. + * @param atId The new value for the id attribute. + */ + void setId( xsID atId ) { *(daeStringRef*)&attrId = atId; + _validAttributeArray[0] = true; } + + /** + * Gets the name attribute. + * @return Returns a xsNCName of the name attribute. + */ + xsNCName getName() const { return attrName; } + /** + * Sets the name attribute. + * @param atName The new value for the name attribute. + */ + void setName( xsNCName atName ) { *(daeStringRef*)&attrName = atName; + _validAttributeArray[1] = true; } + + /** + * Gets the type attribute. + * @return Returns a xsNMTOKEN of the type attribute. + */ + xsNMTOKEN getType() const { return attrType; } + /** + * Sets the type attribute. + * @param atType The new value for the type attribute. + */ + void setType( xsNMTOKEN atType ) { *(daeStringRef*)&attrType = atType; + _validAttributeArray[2] = true; } + + /** + * Gets the asset element. + * @return a daeSmartRef to the asset element. + */ + const domAssetRef getAsset() const { return elemAsset; } + /** + * Gets the technique element array. + * @return Returns a reference to the array of technique elements. + */ + domTechnique_Array &getTechnique_array() { return elemTechnique_array; } + /** + * Gets the technique element array. + * @return Returns a constant reference to the array of technique elements. + */ + const domTechnique_Array &getTechnique_array() const { return elemTechnique_array; } +protected: + /** + * Constructor + */ + domExtra() : attrId(), attrName(), attrType(), elemAsset(), elemTechnique_array() {} + /** + * Destructor + */ + virtual ~domExtra() {} + /** + * Copy Constructor + */ + domExtra( const domExtra &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domExtra &operator=( const domExtra &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFloat_array.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFloat_array.h new file mode 100644 index 00000000..9fc1267d --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFloat_array.h @@ -0,0 +1,180 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domFloat_array_h__ +#define __domFloat_array_h__ + +#include +#include + + +/** + * The float_array element declares the storage for a homogenous array of + * floating point values. + */ +class domFloat_array : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FLOAT_ARRAY; } +protected: // Attributes +/** + * The id attribute is a text string containing the unique identifier of + * this element. This value must be unique within the instance document. + * Optional attribute. + */ + xsID attrId; +/** + * The name attribute is the text string name of this element. Optional attribute. + */ + xsNCName attrName; +/** + * The count attribute indicates the number of values in the array. Required + * attribute. + */ + domUint attrCount; +/** + * The digits attribute indicates the number of significant decimal digits + * of the float values that can be contained in the array. The default value + * is 6. Optional attribute. + */ + xsShort attrDigits; +/** + * The magnitude attribute indicates the largest exponent of the float values + * that can be contained in the array. The default value is 38. Optional + * attribute. + */ + xsShort attrMagnitude; + +protected: // Value + /** + * The domListOfFloats value of the text data of this element. + */ + domListOfFloats _value; + +public: //Accessors and Mutators + /** + * Gets the id attribute. + * @return Returns a xsID of the id attribute. + */ + xsID getId() const { return attrId; } + /** + * Sets the id attribute. + * @param atId The new value for the id attribute. + */ + void setId( xsID atId ) { *(daeStringRef*)&attrId = atId; + _validAttributeArray[0] = true; } + + /** + * Gets the name attribute. + * @return Returns a xsNCName of the name attribute. + */ + xsNCName getName() const { return attrName; } + /** + * Sets the name attribute. + * @param atName The new value for the name attribute. + */ + void setName( xsNCName atName ) { *(daeStringRef*)&attrName = atName; + _validAttributeArray[1] = true; } + + /** + * Gets the count attribute. + * @return Returns a domUint of the count attribute. + */ + domUint getCount() const { return attrCount; } + /** + * Sets the count attribute. + * @param atCount The new value for the count attribute. + */ + void setCount( domUint atCount ) { attrCount = atCount; + _validAttributeArray[2] = true; } + + /** + * Gets the digits attribute. + * @return Returns a xsShort of the digits attribute. + */ + xsShort getDigits() const { return attrDigits; } + /** + * Sets the digits attribute. + * @param atDigits The new value for the digits attribute. + */ + void setDigits( xsShort atDigits ) { attrDigits = atDigits; + _validAttributeArray[3] = true; } + + /** + * Gets the magnitude attribute. + * @return Returns a xsShort of the magnitude attribute. + */ + xsShort getMagnitude() const { return attrMagnitude; } + /** + * Sets the magnitude attribute. + * @param atMagnitude The new value for the magnitude attribute. + */ + void setMagnitude( xsShort atMagnitude ) { attrMagnitude = atMagnitude; + _validAttributeArray[4] = true; } + + /** + * Gets the _value array. + * @return Returns a domListOfFloats reference of the _value array. + */ + domListOfFloats &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domListOfFloats reference of the _value array. + */ + const domListOfFloats &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domListOfFloats &val ) { _value = val; } + +protected: + /** + * Constructor + */ + domFloat_array() : attrId(), attrName(), attrCount(), attrDigits(), attrMagnitude(), _value() {} + /** + * Destructor + */ + virtual ~domFloat_array() {} + /** + * Copy Constructor + */ + domFloat_array( const domFloat_array &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFloat_array &operator=( const domFloat_array &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domForce_field.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domForce_field.h new file mode 100644 index 00000000..ee0a4f7c --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domForce_field.h @@ -0,0 +1,148 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domForce_field_h__ +#define __domForce_field_h__ + +#include +#include + +#include +#include +#include + +/** + * A general container for force-fields. At the moment, it only has techniques + * and extra elements. + */ +class domForce_field : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FORCE_FIELD; } +protected: // Attributes +/** + * The id attribute is a text string containing the unique identifier of + * this element. This value must be unique within the instance document. + * Optional attribute. + */ + xsID attrId; +/** + * The name attribute is the text string name of this element. Optional attribute. + */ + xsNCName attrName; + +protected: // Elements +/** + * The force_field element may contain an asset element. @see domAsset + */ + domAssetRef elemAsset; +/** + * This element must contain at least one non-common profile technique. + * @see domTechnique + */ + domTechnique_Array elemTechnique_array; +/** + * The extra element may appear any number of times. @see domExtra + */ + domExtra_Array elemExtra_array; + +public: //Accessors and Mutators + /** + * Gets the id attribute. + * @return Returns a xsID of the id attribute. + */ + xsID getId() const { return attrId; } + /** + * Sets the id attribute. + * @param atId The new value for the id attribute. + */ + void setId( xsID atId ) { *(daeStringRef*)&attrId = atId; + _validAttributeArray[0] = true; } + + /** + * Gets the name attribute. + * @return Returns a xsNCName of the name attribute. + */ + xsNCName getName() const { return attrName; } + /** + * Sets the name attribute. + * @param atName The new value for the name attribute. + */ + void setName( xsNCName atName ) { *(daeStringRef*)&attrName = atName; + _validAttributeArray[1] = true; } + + /** + * Gets the asset element. + * @return a daeSmartRef to the asset element. + */ + const domAssetRef getAsset() const { return elemAsset; } + /** + * Gets the technique element array. + * @return Returns a reference to the array of technique elements. + */ + domTechnique_Array &getTechnique_array() { return elemTechnique_array; } + /** + * Gets the technique element array. + * @return Returns a constant reference to the array of technique elements. + */ + const domTechnique_Array &getTechnique_array() const { return elemTechnique_array; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } +protected: + /** + * Constructor + */ + domForce_field() : attrId(), attrName(), elemAsset(), elemTechnique_array(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domForce_field() {} + /** + * Copy Constructor + */ + domForce_field( const domForce_field &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domForce_field &operator=( const domForce_field &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_annotate_common.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_annotate_common.h new file mode 100644 index 00000000..9e8b0c6d --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_annotate_common.h @@ -0,0 +1,126 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domFx_annotate_common_h__ +#define __domFx_annotate_common_h__ + +#include +#include + +#include + +class domFx_annotate_common_complexType +{ +protected: // Attribute + xsNCName attrName; + +protected: // Element + domFx_annotate_type_commonRef elemFx_annotate_type_common; + +public: //Accessors and Mutators + /** + * Gets the name attribute. + * @return Returns a xsNCName of the name attribute. + */ + xsNCName getName() const { return attrName; } + /** + * Sets the name attribute. + * @param atName The new value for the name attribute. + */ + void setName( xsNCName atName ) { *(daeStringRef*)&attrName = atName; } + + /** + * Gets the fx_annotate_type_common element. + * @return a daeSmartRef to the fx_annotate_type_common element. + */ + const domFx_annotate_type_commonRef getFx_annotate_type_common() const { return elemFx_annotate_type_common; } +protected: + /** + * Constructor + */ + domFx_annotate_common_complexType() : attrName(), elemFx_annotate_type_common() {} + /** + * Destructor + */ + virtual ~domFx_annotate_common_complexType() {} + /** + * Copy Constructor + */ + domFx_annotate_common_complexType( const domFx_annotate_common_complexType &cpy ) { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFx_annotate_common_complexType &operator=( const domFx_annotate_common_complexType &cpy ) { (void)cpy; return *this; } +}; + +/** + * An element of type domFx_annotate_common_complexType. + */ +class domFx_annotate_common : public daeElement, public domFx_annotate_common_complexType +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FX_ANNOTATE_COMMON; } + +public: //Accessors and Mutators + /** + * Gets the name attribute. + * @return Returns a xsNCName of the name attribute. + */ + xsNCName getName() const { return attrName; } + /** + * Sets the name attribute. + * @param atName The new value for the name attribute. + */ + void setName( xsNCName atName ) { *(daeStringRef*)&attrName = atName; + _validAttributeArray[0] = true; } + +protected: + /** + * Constructor + */ + domFx_annotate_common() {} + /** + * Destructor + */ + virtual ~domFx_annotate_common() {} + /** + * Copy Constructor + */ + domFx_annotate_common( const domFx_annotate_common &cpy ) : daeElement(), domFx_annotate_common_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFx_annotate_common &operator=( const domFx_annotate_common &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_annotate_type_common.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_annotate_type_common.h new file mode 100644 index 00000000..87431c0d --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_annotate_type_common.h @@ -0,0 +1,1321 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domFx_annotate_type_common_h__ +#define __domFx_annotate_type_common_h__ + +#include +#include + + +/** + * A group that specifies the allowable types for an annotation. + */ +class domFx_annotate_type_common : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FX_ANNOTATE_TYPE_COMMON; } +public: + class domBool; + + typedef daeSmartRef domBoolRef; + typedef daeTArray domBool_Array; + + class domBool : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::BOOL; } + + protected: // Value + /** + * The ::domBool value of the text data of this element. + */ + ::domBool _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a ::domBool of the value. + */ + ::domBool getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( ::domBool val ) { _value = val; } + + protected: + /** + * Constructor + */ + domBool() : _value() {} + /** + * Destructor + */ + virtual ~domBool() {} + /** + * Copy Constructor + */ + domBool( const domBool &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domBool &operator=( const domBool &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domBool2; + + typedef daeSmartRef domBool2Ref; + typedef daeTArray domBool2_Array; + + class domBool2 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::BOOL2; } + + protected: // Value + /** + * The ::domBool2 value of the text data of this element. + */ + ::domBool2 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a ::domBool2 reference of the _value array. + */ + ::domBool2 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant ::domBool2 reference of the _value array. + */ + const ::domBool2 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const ::domBool2 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domBool2() : _value() {} + /** + * Destructor + */ + virtual ~domBool2() {} + /** + * Copy Constructor + */ + domBool2( const domBool2 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domBool2 &operator=( const domBool2 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domBool3; + + typedef daeSmartRef domBool3Ref; + typedef daeTArray domBool3_Array; + + class domBool3 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::BOOL3; } + + protected: // Value + /** + * The ::domBool3 value of the text data of this element. + */ + ::domBool3 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a ::domBool3 reference of the _value array. + */ + ::domBool3 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant ::domBool3 reference of the _value array. + */ + const ::domBool3 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const ::domBool3 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domBool3() : _value() {} + /** + * Destructor + */ + virtual ~domBool3() {} + /** + * Copy Constructor + */ + domBool3( const domBool3 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domBool3 &operator=( const domBool3 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domBool4; + + typedef daeSmartRef domBool4Ref; + typedef daeTArray domBool4_Array; + + class domBool4 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::BOOL4; } + + protected: // Value + /** + * The ::domBool4 value of the text data of this element. + */ + ::domBool4 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a ::domBool4 reference of the _value array. + */ + ::domBool4 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant ::domBool4 reference of the _value array. + */ + const ::domBool4 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const ::domBool4 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domBool4() : _value() {} + /** + * Destructor + */ + virtual ~domBool4() {} + /** + * Copy Constructor + */ + domBool4( const domBool4 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domBool4 &operator=( const domBool4 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domInt; + + typedef daeSmartRef domIntRef; + typedef daeTArray domInt_Array; + + class domInt : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::INT; } + + protected: // Value + /** + * The ::domInt value of the text data of this element. + */ + ::domInt _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a ::domInt of the value. + */ + ::domInt getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( ::domInt val ) { _value = val; } + + protected: + /** + * Constructor + */ + domInt() : _value() {} + /** + * Destructor + */ + virtual ~domInt() {} + /** + * Copy Constructor + */ + domInt( const domInt &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domInt &operator=( const domInt &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domInt2; + + typedef daeSmartRef domInt2Ref; + typedef daeTArray domInt2_Array; + + class domInt2 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::INT2; } + + protected: // Value + /** + * The ::domInt2 value of the text data of this element. + */ + ::domInt2 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a ::domInt2 reference of the _value array. + */ + ::domInt2 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant ::domInt2 reference of the _value array. + */ + const ::domInt2 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const ::domInt2 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domInt2() : _value() {} + /** + * Destructor + */ + virtual ~domInt2() {} + /** + * Copy Constructor + */ + domInt2( const domInt2 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domInt2 &operator=( const domInt2 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domInt3; + + typedef daeSmartRef domInt3Ref; + typedef daeTArray domInt3_Array; + + class domInt3 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::INT3; } + + protected: // Value + /** + * The ::domInt3 value of the text data of this element. + */ + ::domInt3 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a ::domInt3 reference of the _value array. + */ + ::domInt3 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant ::domInt3 reference of the _value array. + */ + const ::domInt3 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const ::domInt3 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domInt3() : _value() {} + /** + * Destructor + */ + virtual ~domInt3() {} + /** + * Copy Constructor + */ + domInt3( const domInt3 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domInt3 &operator=( const domInt3 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domInt4; + + typedef daeSmartRef domInt4Ref; + typedef daeTArray domInt4_Array; + + class domInt4 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::INT4; } + + protected: // Value + /** + * The ::domInt4 value of the text data of this element. + */ + ::domInt4 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a ::domInt4 reference of the _value array. + */ + ::domInt4 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant ::domInt4 reference of the _value array. + */ + const ::domInt4 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const ::domInt4 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domInt4() : _value() {} + /** + * Destructor + */ + virtual ~domInt4() {} + /** + * Copy Constructor + */ + domInt4( const domInt4 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domInt4 &operator=( const domInt4 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFloat; + + typedef daeSmartRef domFloatRef; + typedef daeTArray domFloat_Array; + + class domFloat : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FLOAT; } + + protected: // Value + /** + * The ::domFloat value of the text data of this element. + */ + ::domFloat _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a ::domFloat of the value. + */ + ::domFloat getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( ::domFloat val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFloat() : _value() {} + /** + * Destructor + */ + virtual ~domFloat() {} + /** + * Copy Constructor + */ + domFloat( const domFloat &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFloat &operator=( const domFloat &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFloat2; + + typedef daeSmartRef domFloat2Ref; + typedef daeTArray domFloat2_Array; + + class domFloat2 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FLOAT2; } + + protected: // Value + /** + * The ::domFloat2 value of the text data of this element. + */ + ::domFloat2 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a ::domFloat2 reference of the _value array. + */ + ::domFloat2 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant ::domFloat2 reference of the _value array. + */ + const ::domFloat2 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const ::domFloat2 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFloat2() : _value() {} + /** + * Destructor + */ + virtual ~domFloat2() {} + /** + * Copy Constructor + */ + domFloat2( const domFloat2 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFloat2 &operator=( const domFloat2 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFloat3; + + typedef daeSmartRef domFloat3Ref; + typedef daeTArray domFloat3_Array; + + class domFloat3 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FLOAT3; } + + protected: // Value + /** + * The ::domFloat3 value of the text data of this element. + */ + ::domFloat3 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a ::domFloat3 reference of the _value array. + */ + ::domFloat3 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant ::domFloat3 reference of the _value array. + */ + const ::domFloat3 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const ::domFloat3 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFloat3() : _value() {} + /** + * Destructor + */ + virtual ~domFloat3() {} + /** + * Copy Constructor + */ + domFloat3( const domFloat3 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFloat3 &operator=( const domFloat3 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFloat4; + + typedef daeSmartRef domFloat4Ref; + typedef daeTArray domFloat4_Array; + + class domFloat4 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FLOAT4; } + + protected: // Value + /** + * The ::domFloat4 value of the text data of this element. + */ + ::domFloat4 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a ::domFloat4 reference of the _value array. + */ + ::domFloat4 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant ::domFloat4 reference of the _value array. + */ + const ::domFloat4 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const ::domFloat4 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFloat4() : _value() {} + /** + * Destructor + */ + virtual ~domFloat4() {} + /** + * Copy Constructor + */ + domFloat4( const domFloat4 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFloat4 &operator=( const domFloat4 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFloat2x2; + + typedef daeSmartRef domFloat2x2Ref; + typedef daeTArray domFloat2x2_Array; + + class domFloat2x2 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FLOAT2X2; } + + protected: // Value + /** + * The ::domFloat2x2 value of the text data of this element. + */ + ::domFloat2x2 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a ::domFloat2x2 reference of the _value array. + */ + ::domFloat2x2 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant ::domFloat2x2 reference of the _value array. + */ + const ::domFloat2x2 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const ::domFloat2x2 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFloat2x2() : _value() {} + /** + * Destructor + */ + virtual ~domFloat2x2() {} + /** + * Copy Constructor + */ + domFloat2x2( const domFloat2x2 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFloat2x2 &operator=( const domFloat2x2 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFloat3x3; + + typedef daeSmartRef domFloat3x3Ref; + typedef daeTArray domFloat3x3_Array; + + class domFloat3x3 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FLOAT3X3; } + + protected: // Value + /** + * The ::domFloat3x3 value of the text data of this element. + */ + ::domFloat3x3 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a ::domFloat3x3 reference of the _value array. + */ + ::domFloat3x3 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant ::domFloat3x3 reference of the _value array. + */ + const ::domFloat3x3 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const ::domFloat3x3 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFloat3x3() : _value() {} + /** + * Destructor + */ + virtual ~domFloat3x3() {} + /** + * Copy Constructor + */ + domFloat3x3( const domFloat3x3 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFloat3x3 &operator=( const domFloat3x3 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFloat4x4; + + typedef daeSmartRef domFloat4x4Ref; + typedef daeTArray domFloat4x4_Array; + + class domFloat4x4 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FLOAT4X4; } + + protected: // Value + /** + * The ::domFloat4x4 value of the text data of this element. + */ + ::domFloat4x4 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a ::domFloat4x4 reference of the _value array. + */ + ::domFloat4x4 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant ::domFloat4x4 reference of the _value array. + */ + const ::domFloat4x4 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const ::domFloat4x4 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFloat4x4() : _value() {} + /** + * Destructor + */ + virtual ~domFloat4x4() {} + /** + * Copy Constructor + */ + domFloat4x4( const domFloat4x4 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFloat4x4 &operator=( const domFloat4x4 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domString; + + typedef daeSmartRef domStringRef; + typedef daeTArray domString_Array; + + class domString : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::STRING; } + + protected: // Value + /** + * The ::xsString value of the text data of this element. + */ + ::xsString _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return Returns a ::xsString of the value. + */ + ::xsString getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( ::xsString val ) { *(daeStringRef*)&_value = val; } + + protected: + /** + * Constructor + */ + domString() : _value() {} + /** + * Destructor + */ + virtual ~domString() {} + /** + * Copy Constructor + */ + domString( const domString &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domString &operator=( const domString &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + + +protected: // Elements + domBoolRef elemBool; + domBool2Ref elemBool2; + domBool3Ref elemBool3; + domBool4Ref elemBool4; + domIntRef elemInt; + domInt2Ref elemInt2; + domInt3Ref elemInt3; + domInt4Ref elemInt4; + domFloatRef elemFloat; + domFloat2Ref elemFloat2; + domFloat3Ref elemFloat3; + domFloat4Ref elemFloat4; + domFloat2x2Ref elemFloat2x2; + domFloat3x3Ref elemFloat3x3; + domFloat4x4Ref elemFloat4x4; + domStringRef elemString; + /** + * Used to preserve order in elements that do not specify strict sequencing of sub-elements. + */ + daeElementRefArray _contents; + /** + * Used to preserve order in elements that have a complex content model. + */ + daeUIntArray _contentsOrder; + + +public: //Accessors and Mutators + /** + * Gets the bool element. + * @return a daeSmartRef to the bool element. + */ + const domBoolRef getBool() const { return elemBool; } + /** + * Gets the bool2 element. + * @return a daeSmartRef to the bool2 element. + */ + const domBool2Ref getBool2() const { return elemBool2; } + /** + * Gets the bool3 element. + * @return a daeSmartRef to the bool3 element. + */ + const domBool3Ref getBool3() const { return elemBool3; } + /** + * Gets the bool4 element. + * @return a daeSmartRef to the bool4 element. + */ + const domBool4Ref getBool4() const { return elemBool4; } + /** + * Gets the int element. + * @return a daeSmartRef to the int element. + */ + const domIntRef getInt() const { return elemInt; } + /** + * Gets the int2 element. + * @return a daeSmartRef to the int2 element. + */ + const domInt2Ref getInt2() const { return elemInt2; } + /** + * Gets the int3 element. + * @return a daeSmartRef to the int3 element. + */ + const domInt3Ref getInt3() const { return elemInt3; } + /** + * Gets the int4 element. + * @return a daeSmartRef to the int4 element. + */ + const domInt4Ref getInt4() const { return elemInt4; } + /** + * Gets the float element. + * @return a daeSmartRef to the float element. + */ + const domFloatRef getFloat() const { return elemFloat; } + /** + * Gets the float2 element. + * @return a daeSmartRef to the float2 element. + */ + const domFloat2Ref getFloat2() const { return elemFloat2; } + /** + * Gets the float3 element. + * @return a daeSmartRef to the float3 element. + */ + const domFloat3Ref getFloat3() const { return elemFloat3; } + /** + * Gets the float4 element. + * @return a daeSmartRef to the float4 element. + */ + const domFloat4Ref getFloat4() const { return elemFloat4; } + /** + * Gets the float2x2 element. + * @return a daeSmartRef to the float2x2 element. + */ + const domFloat2x2Ref getFloat2x2() const { return elemFloat2x2; } + /** + * Gets the float3x3 element. + * @return a daeSmartRef to the float3x3 element. + */ + const domFloat3x3Ref getFloat3x3() const { return elemFloat3x3; } + /** + * Gets the float4x4 element. + * @return a daeSmartRef to the float4x4 element. + */ + const domFloat4x4Ref getFloat4x4() const { return elemFloat4x4; } + /** + * Gets the string element. + * @return a daeSmartRef to the string element. + */ + const domStringRef getString() const { return elemString; } + /** + * Gets the _contents array. + * @return Returns a reference to the _contents element array. + */ + daeElementRefArray &getContents() { return _contents; } + /** + * Gets the _contents array. + * @return Returns a constant reference to the _contents element array. + */ + const daeElementRefArray &getContents() const { return _contents; } + +protected: + /** + * Constructor + */ + domFx_annotate_type_common() : elemBool(), elemBool2(), elemBool3(), elemBool4(), elemInt(), elemInt2(), elemInt3(), elemInt4(), elemFloat(), elemFloat2(), elemFloat3(), elemFloat4(), elemFloat2x2(), elemFloat3x3(), elemFloat4x4(), elemString() {} + /** + * Destructor + */ + virtual ~domFx_annotate_type_common() {} + /** + * Copy Constructor + */ + domFx_annotate_type_common( const domFx_annotate_type_common &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFx_annotate_type_common &operator=( const domFx_annotate_type_common &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_basic_type_common.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_basic_type_common.h new file mode 100644 index 00000000..5a55a7a7 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_basic_type_common.h @@ -0,0 +1,2379 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domFx_basic_type_common_h__ +#define __domFx_basic_type_common_h__ + +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +/** + * A group that specifies the allowable types for effect scoped parameters. + */ +class domFx_basic_type_common : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FX_BASIC_TYPE_COMMON; } +public: + class domBool; + + typedef daeSmartRef domBoolRef; + typedef daeTArray domBool_Array; + + class domBool : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::BOOL; } + + protected: // Value + /** + * The ::domBool value of the text data of this element. + */ + ::domBool _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a ::domBool of the value. + */ + ::domBool getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( ::domBool val ) { _value = val; } + + protected: + /** + * Constructor + */ + domBool() : _value() {} + /** + * Destructor + */ + virtual ~domBool() {} + /** + * Copy Constructor + */ + domBool( const domBool &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domBool &operator=( const domBool &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domBool2; + + typedef daeSmartRef domBool2Ref; + typedef daeTArray domBool2_Array; + + class domBool2 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::BOOL2; } + + protected: // Value + /** + * The ::domBool2 value of the text data of this element. + */ + ::domBool2 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a ::domBool2 reference of the _value array. + */ + ::domBool2 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant ::domBool2 reference of the _value array. + */ + const ::domBool2 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const ::domBool2 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domBool2() : _value() {} + /** + * Destructor + */ + virtual ~domBool2() {} + /** + * Copy Constructor + */ + domBool2( const domBool2 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domBool2 &operator=( const domBool2 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domBool3; + + typedef daeSmartRef domBool3Ref; + typedef daeTArray domBool3_Array; + + class domBool3 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::BOOL3; } + + protected: // Value + /** + * The ::domBool3 value of the text data of this element. + */ + ::domBool3 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a ::domBool3 reference of the _value array. + */ + ::domBool3 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant ::domBool3 reference of the _value array. + */ + const ::domBool3 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const ::domBool3 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domBool3() : _value() {} + /** + * Destructor + */ + virtual ~domBool3() {} + /** + * Copy Constructor + */ + domBool3( const domBool3 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domBool3 &operator=( const domBool3 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domBool4; + + typedef daeSmartRef domBool4Ref; + typedef daeTArray domBool4_Array; + + class domBool4 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::BOOL4; } + + protected: // Value + /** + * The ::domBool4 value of the text data of this element. + */ + ::domBool4 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a ::domBool4 reference of the _value array. + */ + ::domBool4 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant ::domBool4 reference of the _value array. + */ + const ::domBool4 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const ::domBool4 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domBool4() : _value() {} + /** + * Destructor + */ + virtual ~domBool4() {} + /** + * Copy Constructor + */ + domBool4( const domBool4 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domBool4 &operator=( const domBool4 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domInt; + + typedef daeSmartRef domIntRef; + typedef daeTArray domInt_Array; + + class domInt : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::INT; } + + protected: // Value + /** + * The ::domInt value of the text data of this element. + */ + ::domInt _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a ::domInt of the value. + */ + ::domInt getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( ::domInt val ) { _value = val; } + + protected: + /** + * Constructor + */ + domInt() : _value() {} + /** + * Destructor + */ + virtual ~domInt() {} + /** + * Copy Constructor + */ + domInt( const domInt &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domInt &operator=( const domInt &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domInt2; + + typedef daeSmartRef domInt2Ref; + typedef daeTArray domInt2_Array; + + class domInt2 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::INT2; } + + protected: // Value + /** + * The ::domInt2 value of the text data of this element. + */ + ::domInt2 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a ::domInt2 reference of the _value array. + */ + ::domInt2 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant ::domInt2 reference of the _value array. + */ + const ::domInt2 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const ::domInt2 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domInt2() : _value() {} + /** + * Destructor + */ + virtual ~domInt2() {} + /** + * Copy Constructor + */ + domInt2( const domInt2 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domInt2 &operator=( const domInt2 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domInt3; + + typedef daeSmartRef domInt3Ref; + typedef daeTArray domInt3_Array; + + class domInt3 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::INT3; } + + protected: // Value + /** + * The ::domInt3 value of the text data of this element. + */ + ::domInt3 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a ::domInt3 reference of the _value array. + */ + ::domInt3 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant ::domInt3 reference of the _value array. + */ + const ::domInt3 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const ::domInt3 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domInt3() : _value() {} + /** + * Destructor + */ + virtual ~domInt3() {} + /** + * Copy Constructor + */ + domInt3( const domInt3 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domInt3 &operator=( const domInt3 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domInt4; + + typedef daeSmartRef domInt4Ref; + typedef daeTArray domInt4_Array; + + class domInt4 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::INT4; } + + protected: // Value + /** + * The ::domInt4 value of the text data of this element. + */ + ::domInt4 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a ::domInt4 reference of the _value array. + */ + ::domInt4 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant ::domInt4 reference of the _value array. + */ + const ::domInt4 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const ::domInt4 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domInt4() : _value() {} + /** + * Destructor + */ + virtual ~domInt4() {} + /** + * Copy Constructor + */ + domInt4( const domInt4 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domInt4 &operator=( const domInt4 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFloat; + + typedef daeSmartRef domFloatRef; + typedef daeTArray domFloat_Array; + + class domFloat : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FLOAT; } + + protected: // Value + /** + * The ::domFloat value of the text data of this element. + */ + ::domFloat _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a ::domFloat of the value. + */ + ::domFloat getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( ::domFloat val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFloat() : _value() {} + /** + * Destructor + */ + virtual ~domFloat() {} + /** + * Copy Constructor + */ + domFloat( const domFloat &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFloat &operator=( const domFloat &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFloat2; + + typedef daeSmartRef domFloat2Ref; + typedef daeTArray domFloat2_Array; + + class domFloat2 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FLOAT2; } + + protected: // Value + /** + * The ::domFloat2 value of the text data of this element. + */ + ::domFloat2 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a ::domFloat2 reference of the _value array. + */ + ::domFloat2 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant ::domFloat2 reference of the _value array. + */ + const ::domFloat2 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const ::domFloat2 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFloat2() : _value() {} + /** + * Destructor + */ + virtual ~domFloat2() {} + /** + * Copy Constructor + */ + domFloat2( const domFloat2 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFloat2 &operator=( const domFloat2 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFloat3; + + typedef daeSmartRef domFloat3Ref; + typedef daeTArray domFloat3_Array; + + class domFloat3 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FLOAT3; } + + protected: // Value + /** + * The ::domFloat3 value of the text data of this element. + */ + ::domFloat3 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a ::domFloat3 reference of the _value array. + */ + ::domFloat3 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant ::domFloat3 reference of the _value array. + */ + const ::domFloat3 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const ::domFloat3 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFloat3() : _value() {} + /** + * Destructor + */ + virtual ~domFloat3() {} + /** + * Copy Constructor + */ + domFloat3( const domFloat3 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFloat3 &operator=( const domFloat3 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFloat4; + + typedef daeSmartRef domFloat4Ref; + typedef daeTArray domFloat4_Array; + + class domFloat4 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FLOAT4; } + + protected: // Value + /** + * The ::domFloat4 value of the text data of this element. + */ + ::domFloat4 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a ::domFloat4 reference of the _value array. + */ + ::domFloat4 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant ::domFloat4 reference of the _value array. + */ + const ::domFloat4 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const ::domFloat4 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFloat4() : _value() {} + /** + * Destructor + */ + virtual ~domFloat4() {} + /** + * Copy Constructor + */ + domFloat4( const domFloat4 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFloat4 &operator=( const domFloat4 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFloat1x1; + + typedef daeSmartRef domFloat1x1Ref; + typedef daeTArray domFloat1x1_Array; + + class domFloat1x1 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FLOAT1X1; } + + protected: // Value + /** + * The ::domFloat value of the text data of this element. + */ + ::domFloat _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a ::domFloat of the value. + */ + ::domFloat getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( ::domFloat val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFloat1x1() : _value() {} + /** + * Destructor + */ + virtual ~domFloat1x1() {} + /** + * Copy Constructor + */ + domFloat1x1( const domFloat1x1 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFloat1x1 &operator=( const domFloat1x1 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFloat1x2; + + typedef daeSmartRef domFloat1x2Ref; + typedef daeTArray domFloat1x2_Array; + + class domFloat1x2 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FLOAT1X2; } + + protected: // Value + /** + * The ::domFloat2 value of the text data of this element. + */ + ::domFloat2 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a ::domFloat2 reference of the _value array. + */ + ::domFloat2 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant ::domFloat2 reference of the _value array. + */ + const ::domFloat2 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const ::domFloat2 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFloat1x2() : _value() {} + /** + * Destructor + */ + virtual ~domFloat1x2() {} + /** + * Copy Constructor + */ + domFloat1x2( const domFloat1x2 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFloat1x2 &operator=( const domFloat1x2 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFloat1x3; + + typedef daeSmartRef domFloat1x3Ref; + typedef daeTArray domFloat1x3_Array; + + class domFloat1x3 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FLOAT1X3; } + + protected: // Value + /** + * The ::domFloat3 value of the text data of this element. + */ + ::domFloat3 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a ::domFloat3 reference of the _value array. + */ + ::domFloat3 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant ::domFloat3 reference of the _value array. + */ + const ::domFloat3 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const ::domFloat3 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFloat1x3() : _value() {} + /** + * Destructor + */ + virtual ~domFloat1x3() {} + /** + * Copy Constructor + */ + domFloat1x3( const domFloat1x3 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFloat1x3 &operator=( const domFloat1x3 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFloat1x4; + + typedef daeSmartRef domFloat1x4Ref; + typedef daeTArray domFloat1x4_Array; + + class domFloat1x4 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FLOAT1X4; } + + protected: // Value + /** + * The ::domFloat4 value of the text data of this element. + */ + ::domFloat4 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a ::domFloat4 reference of the _value array. + */ + ::domFloat4 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant ::domFloat4 reference of the _value array. + */ + const ::domFloat4 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const ::domFloat4 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFloat1x4() : _value() {} + /** + * Destructor + */ + virtual ~domFloat1x4() {} + /** + * Copy Constructor + */ + domFloat1x4( const domFloat1x4 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFloat1x4 &operator=( const domFloat1x4 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFloat2x1; + + typedef daeSmartRef domFloat2x1Ref; + typedef daeTArray domFloat2x1_Array; + + class domFloat2x1 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FLOAT2X1; } + + protected: // Value + /** + * The ::domFloat2 value of the text data of this element. + */ + ::domFloat2 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a ::domFloat2 reference of the _value array. + */ + ::domFloat2 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant ::domFloat2 reference of the _value array. + */ + const ::domFloat2 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const ::domFloat2 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFloat2x1() : _value() {} + /** + * Destructor + */ + virtual ~domFloat2x1() {} + /** + * Copy Constructor + */ + domFloat2x1( const domFloat2x1 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFloat2x1 &operator=( const domFloat2x1 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFloat2x2; + + typedef daeSmartRef domFloat2x2Ref; + typedef daeTArray domFloat2x2_Array; + + class domFloat2x2 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FLOAT2X2; } + + protected: // Value + /** + * The ::domFloat2x2 value of the text data of this element. + */ + ::domFloat2x2 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a ::domFloat2x2 reference of the _value array. + */ + ::domFloat2x2 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant ::domFloat2x2 reference of the _value array. + */ + const ::domFloat2x2 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const ::domFloat2x2 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFloat2x2() : _value() {} + /** + * Destructor + */ + virtual ~domFloat2x2() {} + /** + * Copy Constructor + */ + domFloat2x2( const domFloat2x2 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFloat2x2 &operator=( const domFloat2x2 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFloat2x3; + + typedef daeSmartRef domFloat2x3Ref; + typedef daeTArray domFloat2x3_Array; + + class domFloat2x3 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FLOAT2X3; } + + protected: // Value + /** + * The ::domFloat2x3 value of the text data of this element. + */ + ::domFloat2x3 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a ::domFloat2x3 reference of the _value array. + */ + ::domFloat2x3 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant ::domFloat2x3 reference of the _value array. + */ + const ::domFloat2x3 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const ::domFloat2x3 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFloat2x3() : _value() {} + /** + * Destructor + */ + virtual ~domFloat2x3() {} + /** + * Copy Constructor + */ + domFloat2x3( const domFloat2x3 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFloat2x3 &operator=( const domFloat2x3 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFloat2x4; + + typedef daeSmartRef domFloat2x4Ref; + typedef daeTArray domFloat2x4_Array; + + class domFloat2x4 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FLOAT2X4; } + + protected: // Value + /** + * The ::domFloat2x4 value of the text data of this element. + */ + ::domFloat2x4 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a ::domFloat2x4 reference of the _value array. + */ + ::domFloat2x4 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant ::domFloat2x4 reference of the _value array. + */ + const ::domFloat2x4 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const ::domFloat2x4 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFloat2x4() : _value() {} + /** + * Destructor + */ + virtual ~domFloat2x4() {} + /** + * Copy Constructor + */ + domFloat2x4( const domFloat2x4 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFloat2x4 &operator=( const domFloat2x4 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFloat3x1; + + typedef daeSmartRef domFloat3x1Ref; + typedef daeTArray domFloat3x1_Array; + + class domFloat3x1 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FLOAT3X1; } + + protected: // Value + /** + * The ::domFloat3 value of the text data of this element. + */ + ::domFloat3 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a ::domFloat3 reference of the _value array. + */ + ::domFloat3 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant ::domFloat3 reference of the _value array. + */ + const ::domFloat3 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const ::domFloat3 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFloat3x1() : _value() {} + /** + * Destructor + */ + virtual ~domFloat3x1() {} + /** + * Copy Constructor + */ + domFloat3x1( const domFloat3x1 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFloat3x1 &operator=( const domFloat3x1 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFloat3x2; + + typedef daeSmartRef domFloat3x2Ref; + typedef daeTArray domFloat3x2_Array; + + class domFloat3x2 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FLOAT3X2; } + + protected: // Value + /** + * The ::domFloat3x2 value of the text data of this element. + */ + ::domFloat3x2 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a ::domFloat3x2 reference of the _value array. + */ + ::domFloat3x2 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant ::domFloat3x2 reference of the _value array. + */ + const ::domFloat3x2 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const ::domFloat3x2 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFloat3x2() : _value() {} + /** + * Destructor + */ + virtual ~domFloat3x2() {} + /** + * Copy Constructor + */ + domFloat3x2( const domFloat3x2 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFloat3x2 &operator=( const domFloat3x2 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFloat3x3; + + typedef daeSmartRef domFloat3x3Ref; + typedef daeTArray domFloat3x3_Array; + + class domFloat3x3 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FLOAT3X3; } + + protected: // Value + /** + * The ::domFloat3x3 value of the text data of this element. + */ + ::domFloat3x3 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a ::domFloat3x3 reference of the _value array. + */ + ::domFloat3x3 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant ::domFloat3x3 reference of the _value array. + */ + const ::domFloat3x3 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const ::domFloat3x3 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFloat3x3() : _value() {} + /** + * Destructor + */ + virtual ~domFloat3x3() {} + /** + * Copy Constructor + */ + domFloat3x3( const domFloat3x3 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFloat3x3 &operator=( const domFloat3x3 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFloat3x4; + + typedef daeSmartRef domFloat3x4Ref; + typedef daeTArray domFloat3x4_Array; + + class domFloat3x4 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FLOAT3X4; } + + protected: // Value + /** + * The ::domFloat3x4 value of the text data of this element. + */ + ::domFloat3x4 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a ::domFloat3x4 reference of the _value array. + */ + ::domFloat3x4 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant ::domFloat3x4 reference of the _value array. + */ + const ::domFloat3x4 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const ::domFloat3x4 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFloat3x4() : _value() {} + /** + * Destructor + */ + virtual ~domFloat3x4() {} + /** + * Copy Constructor + */ + domFloat3x4( const domFloat3x4 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFloat3x4 &operator=( const domFloat3x4 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFloat4x1; + + typedef daeSmartRef domFloat4x1Ref; + typedef daeTArray domFloat4x1_Array; + + class domFloat4x1 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FLOAT4X1; } + + protected: // Value + /** + * The ::domFloat4 value of the text data of this element. + */ + ::domFloat4 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a ::domFloat4 reference of the _value array. + */ + ::domFloat4 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant ::domFloat4 reference of the _value array. + */ + const ::domFloat4 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const ::domFloat4 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFloat4x1() : _value() {} + /** + * Destructor + */ + virtual ~domFloat4x1() {} + /** + * Copy Constructor + */ + domFloat4x1( const domFloat4x1 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFloat4x1 &operator=( const domFloat4x1 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFloat4x2; + + typedef daeSmartRef domFloat4x2Ref; + typedef daeTArray domFloat4x2_Array; + + class domFloat4x2 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FLOAT4X2; } + + protected: // Value + /** + * The ::domFloat4x2 value of the text data of this element. + */ + ::domFloat4x2 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a ::domFloat4x2 reference of the _value array. + */ + ::domFloat4x2 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant ::domFloat4x2 reference of the _value array. + */ + const ::domFloat4x2 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const ::domFloat4x2 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFloat4x2() : _value() {} + /** + * Destructor + */ + virtual ~domFloat4x2() {} + /** + * Copy Constructor + */ + domFloat4x2( const domFloat4x2 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFloat4x2 &operator=( const domFloat4x2 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFloat4x3; + + typedef daeSmartRef domFloat4x3Ref; + typedef daeTArray domFloat4x3_Array; + + class domFloat4x3 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FLOAT4X3; } + + protected: // Value + /** + * The ::domFloat4x3 value of the text data of this element. + */ + ::domFloat4x3 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a ::domFloat4x3 reference of the _value array. + */ + ::domFloat4x3 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant ::domFloat4x3 reference of the _value array. + */ + const ::domFloat4x3 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const ::domFloat4x3 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFloat4x3() : _value() {} + /** + * Destructor + */ + virtual ~domFloat4x3() {} + /** + * Copy Constructor + */ + domFloat4x3( const domFloat4x3 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFloat4x3 &operator=( const domFloat4x3 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFloat4x4; + + typedef daeSmartRef domFloat4x4Ref; + typedef daeTArray domFloat4x4_Array; + + class domFloat4x4 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FLOAT4X4; } + + protected: // Value + /** + * The ::domFloat4x4 value of the text data of this element. + */ + ::domFloat4x4 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a ::domFloat4x4 reference of the _value array. + */ + ::domFloat4x4 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant ::domFloat4x4 reference of the _value array. + */ + const ::domFloat4x4 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const ::domFloat4x4 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFloat4x4() : _value() {} + /** + * Destructor + */ + virtual ~domFloat4x4() {} + /** + * Copy Constructor + */ + domFloat4x4( const domFloat4x4 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFloat4x4 &operator=( const domFloat4x4 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domEnum; + + typedef daeSmartRef domEnumRef; + typedef daeTArray domEnum_Array; + + class domEnum : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::ENUM; } + + protected: // Value + /** + * The xsString value of the text data of this element. + */ + xsString _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return Returns a xsString of the value. + */ + xsString getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( xsString val ) { *(daeStringRef*)&_value = val; } + + protected: + /** + * Constructor + */ + domEnum() : _value() {} + /** + * Destructor + */ + virtual ~domEnum() {} + /** + * Copy Constructor + */ + domEnum( const domEnum &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domEnum &operator=( const domEnum &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + + +protected: // Elements + domBoolRef elemBool; + domBool2Ref elemBool2; + domBool3Ref elemBool3; + domBool4Ref elemBool4; + domIntRef elemInt; + domInt2Ref elemInt2; + domInt3Ref elemInt3; + domInt4Ref elemInt4; + domFloatRef elemFloat; + domFloat2Ref elemFloat2; + domFloat3Ref elemFloat3; + domFloat4Ref elemFloat4; + domFloat1x1Ref elemFloat1x1; + domFloat1x2Ref elemFloat1x2; + domFloat1x3Ref elemFloat1x3; + domFloat1x4Ref elemFloat1x4; + domFloat2x1Ref elemFloat2x1; + domFloat2x2Ref elemFloat2x2; + domFloat2x3Ref elemFloat2x3; + domFloat2x4Ref elemFloat2x4; + domFloat3x1Ref elemFloat3x1; + domFloat3x2Ref elemFloat3x2; + domFloat3x3Ref elemFloat3x3; + domFloat3x4Ref elemFloat3x4; + domFloat4x1Ref elemFloat4x1; + domFloat4x2Ref elemFloat4x2; + domFloat4x3Ref elemFloat4x3; + domFloat4x4Ref elemFloat4x4; + domFx_surface_commonRef elemSurface; + domFx_sampler1D_commonRef elemSampler1D; + domFx_sampler2D_commonRef elemSampler2D; + domFx_sampler3D_commonRef elemSampler3D; + domFx_samplerCUBE_commonRef elemSamplerCUBE; + domFx_samplerRECT_commonRef elemSamplerRECT; + domFx_samplerDEPTH_commonRef elemSamplerDEPTH; + domEnumRef elemEnum; + /** + * Used to preserve order in elements that do not specify strict sequencing of sub-elements. + */ + daeElementRefArray _contents; + /** + * Used to preserve order in elements that have a complex content model. + */ + daeUIntArray _contentsOrder; + + +public: //Accessors and Mutators + /** + * Gets the bool element. + * @return a daeSmartRef to the bool element. + */ + const domBoolRef getBool() const { return elemBool; } + /** + * Gets the bool2 element. + * @return a daeSmartRef to the bool2 element. + */ + const domBool2Ref getBool2() const { return elemBool2; } + /** + * Gets the bool3 element. + * @return a daeSmartRef to the bool3 element. + */ + const domBool3Ref getBool3() const { return elemBool3; } + /** + * Gets the bool4 element. + * @return a daeSmartRef to the bool4 element. + */ + const domBool4Ref getBool4() const { return elemBool4; } + /** + * Gets the int element. + * @return a daeSmartRef to the int element. + */ + const domIntRef getInt() const { return elemInt; } + /** + * Gets the int2 element. + * @return a daeSmartRef to the int2 element. + */ + const domInt2Ref getInt2() const { return elemInt2; } + /** + * Gets the int3 element. + * @return a daeSmartRef to the int3 element. + */ + const domInt3Ref getInt3() const { return elemInt3; } + /** + * Gets the int4 element. + * @return a daeSmartRef to the int4 element. + */ + const domInt4Ref getInt4() const { return elemInt4; } + /** + * Gets the float element. + * @return a daeSmartRef to the float element. + */ + const domFloatRef getFloat() const { return elemFloat; } + /** + * Gets the float2 element. + * @return a daeSmartRef to the float2 element. + */ + const domFloat2Ref getFloat2() const { return elemFloat2; } + /** + * Gets the float3 element. + * @return a daeSmartRef to the float3 element. + */ + const domFloat3Ref getFloat3() const { return elemFloat3; } + /** + * Gets the float4 element. + * @return a daeSmartRef to the float4 element. + */ + const domFloat4Ref getFloat4() const { return elemFloat4; } + /** + * Gets the float1x1 element. + * @return a daeSmartRef to the float1x1 element. + */ + const domFloat1x1Ref getFloat1x1() const { return elemFloat1x1; } + /** + * Gets the float1x2 element. + * @return a daeSmartRef to the float1x2 element. + */ + const domFloat1x2Ref getFloat1x2() const { return elemFloat1x2; } + /** + * Gets the float1x3 element. + * @return a daeSmartRef to the float1x3 element. + */ + const domFloat1x3Ref getFloat1x3() const { return elemFloat1x3; } + /** + * Gets the float1x4 element. + * @return a daeSmartRef to the float1x4 element. + */ + const domFloat1x4Ref getFloat1x4() const { return elemFloat1x4; } + /** + * Gets the float2x1 element. + * @return a daeSmartRef to the float2x1 element. + */ + const domFloat2x1Ref getFloat2x1() const { return elemFloat2x1; } + /** + * Gets the float2x2 element. + * @return a daeSmartRef to the float2x2 element. + */ + const domFloat2x2Ref getFloat2x2() const { return elemFloat2x2; } + /** + * Gets the float2x3 element. + * @return a daeSmartRef to the float2x3 element. + */ + const domFloat2x3Ref getFloat2x3() const { return elemFloat2x3; } + /** + * Gets the float2x4 element. + * @return a daeSmartRef to the float2x4 element. + */ + const domFloat2x4Ref getFloat2x4() const { return elemFloat2x4; } + /** + * Gets the float3x1 element. + * @return a daeSmartRef to the float3x1 element. + */ + const domFloat3x1Ref getFloat3x1() const { return elemFloat3x1; } + /** + * Gets the float3x2 element. + * @return a daeSmartRef to the float3x2 element. + */ + const domFloat3x2Ref getFloat3x2() const { return elemFloat3x2; } + /** + * Gets the float3x3 element. + * @return a daeSmartRef to the float3x3 element. + */ + const domFloat3x3Ref getFloat3x3() const { return elemFloat3x3; } + /** + * Gets the float3x4 element. + * @return a daeSmartRef to the float3x4 element. + */ + const domFloat3x4Ref getFloat3x4() const { return elemFloat3x4; } + /** + * Gets the float4x1 element. + * @return a daeSmartRef to the float4x1 element. + */ + const domFloat4x1Ref getFloat4x1() const { return elemFloat4x1; } + /** + * Gets the float4x2 element. + * @return a daeSmartRef to the float4x2 element. + */ + const domFloat4x2Ref getFloat4x2() const { return elemFloat4x2; } + /** + * Gets the float4x3 element. + * @return a daeSmartRef to the float4x3 element. + */ + const domFloat4x3Ref getFloat4x3() const { return elemFloat4x3; } + /** + * Gets the float4x4 element. + * @return a daeSmartRef to the float4x4 element. + */ + const domFloat4x4Ref getFloat4x4() const { return elemFloat4x4; } + /** + * Gets the surface element. + * @return a daeSmartRef to the surface element. + */ + const domFx_surface_commonRef getSurface() const { return elemSurface; } + /** + * Gets the sampler1D element. + * @return a daeSmartRef to the sampler1D element. + */ + const domFx_sampler1D_commonRef getSampler1D() const { return elemSampler1D; } + /** + * Gets the sampler2D element. + * @return a daeSmartRef to the sampler2D element. + */ + const domFx_sampler2D_commonRef getSampler2D() const { return elemSampler2D; } + /** + * Gets the sampler3D element. + * @return a daeSmartRef to the sampler3D element. + */ + const domFx_sampler3D_commonRef getSampler3D() const { return elemSampler3D; } + /** + * Gets the samplerCUBE element. + * @return a daeSmartRef to the samplerCUBE element. + */ + const domFx_samplerCUBE_commonRef getSamplerCUBE() const { return elemSamplerCUBE; } + /** + * Gets the samplerRECT element. + * @return a daeSmartRef to the samplerRECT element. + */ + const domFx_samplerRECT_commonRef getSamplerRECT() const { return elemSamplerRECT; } + /** + * Gets the samplerDEPTH element. + * @return a daeSmartRef to the samplerDEPTH element. + */ + const domFx_samplerDEPTH_commonRef getSamplerDEPTH() const { return elemSamplerDEPTH; } + /** + * Gets the enum element. + * @return a daeSmartRef to the enum element. + */ + const domEnumRef getEnum() const { return elemEnum; } + /** + * Gets the _contents array. + * @return Returns a reference to the _contents element array. + */ + daeElementRefArray &getContents() { return _contents; } + /** + * Gets the _contents array. + * @return Returns a constant reference to the _contents element array. + */ + const daeElementRefArray &getContents() const { return _contents; } + +protected: + /** + * Constructor + */ + domFx_basic_type_common() : elemBool(), elemBool2(), elemBool3(), elemBool4(), elemInt(), elemInt2(), elemInt3(), elemInt4(), elemFloat(), elemFloat2(), elemFloat3(), elemFloat4(), elemFloat1x1(), elemFloat1x2(), elemFloat1x3(), elemFloat1x4(), elemFloat2x1(), elemFloat2x2(), elemFloat2x3(), elemFloat2x4(), elemFloat3x1(), elemFloat3x2(), elemFloat3x3(), elemFloat3x4(), elemFloat4x1(), elemFloat4x2(), elemFloat4x3(), elemFloat4x4(), elemSurface(), elemSampler1D(), elemSampler2D(), elemSampler3D(), elemSamplerCUBE(), elemSamplerRECT(), elemSamplerDEPTH(), elemEnum() {} + /** + * Destructor + */ + virtual ~domFx_basic_type_common() {} + /** + * Copy Constructor + */ + domFx_basic_type_common( const domFx_basic_type_common &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFx_basic_type_common &operator=( const domFx_basic_type_common &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_clearcolor_common.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_clearcolor_common.h new file mode 100644 index 00000000..a557d9c3 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_clearcolor_common.h @@ -0,0 +1,139 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domFx_clearcolor_common_h__ +#define __domFx_clearcolor_common_h__ + +#include +#include + + +class domFx_clearcolor_common_complexType +{ +protected: // Attribute + xsNonNegativeInteger attrIndex; + +protected: // Value + /** + * The domFx_color_common value of the text data of this element. + */ + domFx_color_common _value; + +public: //Accessors and Mutators + /** + * Gets the index attribute. + * @return Returns a xsNonNegativeInteger of the index attribute. + */ + xsNonNegativeInteger getIndex() const { return attrIndex; } + /** + * Sets the index attribute. + * @param atIndex The new value for the index attribute. + */ + void setIndex( xsNonNegativeInteger atIndex ) { attrIndex = atIndex; } + + /** + * Gets the _value array. + * @return Returns a domFx_color_common reference of the _value array. + */ + domFx_color_common &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domFx_color_common reference of the _value array. + */ + const domFx_color_common &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domFx_color_common &val ) { _value = val; } + +protected: + /** + * Constructor + */ + domFx_clearcolor_common_complexType() : attrIndex(), _value() {} + /** + * Destructor + */ + virtual ~domFx_clearcolor_common_complexType() {} + /** + * Copy Constructor + */ + domFx_clearcolor_common_complexType( const domFx_clearcolor_common_complexType &cpy ) { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFx_clearcolor_common_complexType &operator=( const domFx_clearcolor_common_complexType &cpy ) { (void)cpy; return *this; } +}; + +/** + * An element of type domFx_clearcolor_common_complexType. + */ +class domFx_clearcolor_common : public daeElement, public domFx_clearcolor_common_complexType +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FX_CLEARCOLOR_COMMON; } + +public: //Accessors and Mutators + /** + * Gets the index attribute. + * @return Returns a xsNonNegativeInteger of the index attribute. + */ + xsNonNegativeInteger getIndex() const { return attrIndex; } + /** + * Sets the index attribute. + * @param atIndex The new value for the index attribute. + */ + void setIndex( xsNonNegativeInteger atIndex ) { attrIndex = atIndex; + _validAttributeArray[0] = true; } + +protected: + /** + * Constructor + */ + domFx_clearcolor_common() {} + /** + * Destructor + */ + virtual ~domFx_clearcolor_common() {} + /** + * Copy Constructor + */ + domFx_clearcolor_common( const domFx_clearcolor_common &cpy ) : daeElement(), domFx_clearcolor_common_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFx_clearcolor_common &operator=( const domFx_clearcolor_common &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_cleardepth_common.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_cleardepth_common.h new file mode 100644 index 00000000..d3e2e798 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_cleardepth_common.h @@ -0,0 +1,134 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domFx_cleardepth_common_h__ +#define __domFx_cleardepth_common_h__ + +#include +#include + + +class domFx_cleardepth_common_complexType +{ +protected: // Attribute + xsNonNegativeInteger attrIndex; + +protected: // Value + /** + * The domFloat value of the text data of this element. + */ + domFloat _value; + +public: //Accessors and Mutators + /** + * Gets the index attribute. + * @return Returns a xsNonNegativeInteger of the index attribute. + */ + xsNonNegativeInteger getIndex() const { return attrIndex; } + /** + * Sets the index attribute. + * @param atIndex The new value for the index attribute. + */ + void setIndex( xsNonNegativeInteger atIndex ) { attrIndex = atIndex; } + + /** + * Gets the value of this element. + * @return a domFloat of the value. + */ + domFloat getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( domFloat val ) { _value = val; } + +protected: + /** + * Constructor + */ + domFx_cleardepth_common_complexType() : attrIndex(), _value() {} + /** + * Destructor + */ + virtual ~domFx_cleardepth_common_complexType() {} + /** + * Copy Constructor + */ + domFx_cleardepth_common_complexType( const domFx_cleardepth_common_complexType &cpy ) { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFx_cleardepth_common_complexType &operator=( const domFx_cleardepth_common_complexType &cpy ) { (void)cpy; return *this; } +}; + +/** + * An element of type domFx_cleardepth_common_complexType. + */ +class domFx_cleardepth_common : public daeElement, public domFx_cleardepth_common_complexType +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FX_CLEARDEPTH_COMMON; } + +public: //Accessors and Mutators + /** + * Gets the index attribute. + * @return Returns a xsNonNegativeInteger of the index attribute. + */ + xsNonNegativeInteger getIndex() const { return attrIndex; } + /** + * Sets the index attribute. + * @param atIndex The new value for the index attribute. + */ + void setIndex( xsNonNegativeInteger atIndex ) { attrIndex = atIndex; + _validAttributeArray[0] = true; } + +protected: + /** + * Constructor + */ + domFx_cleardepth_common() {} + /** + * Destructor + */ + virtual ~domFx_cleardepth_common() {} + /** + * Copy Constructor + */ + domFx_cleardepth_common( const domFx_cleardepth_common &cpy ) : daeElement(), domFx_cleardepth_common_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFx_cleardepth_common &operator=( const domFx_cleardepth_common &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_clearstencil_common.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_clearstencil_common.h new file mode 100644 index 00000000..e40a073f --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_clearstencil_common.h @@ -0,0 +1,134 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domFx_clearstencil_common_h__ +#define __domFx_clearstencil_common_h__ + +#include +#include + + +class domFx_clearstencil_common_complexType +{ +protected: // Attribute + xsNonNegativeInteger attrIndex; + +protected: // Value + /** + * The xsByte value of the text data of this element. + */ + xsByte _value; + +public: //Accessors and Mutators + /** + * Gets the index attribute. + * @return Returns a xsNonNegativeInteger of the index attribute. + */ + xsNonNegativeInteger getIndex() const { return attrIndex; } + /** + * Sets the index attribute. + * @param atIndex The new value for the index attribute. + */ + void setIndex( xsNonNegativeInteger atIndex ) { attrIndex = atIndex; } + + /** + * Gets the value of this element. + * @return a xsByte of the value. + */ + xsByte getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( xsByte val ) { _value = val; } + +protected: + /** + * Constructor + */ + domFx_clearstencil_common_complexType() : attrIndex(), _value() {} + /** + * Destructor + */ + virtual ~domFx_clearstencil_common_complexType() {} + /** + * Copy Constructor + */ + domFx_clearstencil_common_complexType( const domFx_clearstencil_common_complexType &cpy ) { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFx_clearstencil_common_complexType &operator=( const domFx_clearstencil_common_complexType &cpy ) { (void)cpy; return *this; } +}; + +/** + * An element of type domFx_clearstencil_common_complexType. + */ +class domFx_clearstencil_common : public daeElement, public domFx_clearstencil_common_complexType +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FX_CLEARSTENCIL_COMMON; } + +public: //Accessors and Mutators + /** + * Gets the index attribute. + * @return Returns a xsNonNegativeInteger of the index attribute. + */ + xsNonNegativeInteger getIndex() const { return attrIndex; } + /** + * Sets the index attribute. + * @param atIndex The new value for the index attribute. + */ + void setIndex( xsNonNegativeInteger atIndex ) { attrIndex = atIndex; + _validAttributeArray[0] = true; } + +protected: + /** + * Constructor + */ + domFx_clearstencil_common() {} + /** + * Destructor + */ + virtual ~domFx_clearstencil_common() {} + /** + * Copy Constructor + */ + domFx_clearstencil_common( const domFx_clearstencil_common &cpy ) : daeElement(), domFx_clearstencil_common_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFx_clearstencil_common &operator=( const domFx_clearstencil_common &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_code_profile.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_code_profile.h new file mode 100644 index 00000000..40d435df --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_code_profile.h @@ -0,0 +1,143 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domFx_code_profile_h__ +#define __domFx_code_profile_h__ + +#include +#include + + +/** + * The fx_code_profile type allows you to specify an inline block of source + * code. + */ +class domFx_code_profile_complexType +{ +protected: // Attribute +/** + * The sid attribute is a text string value containing the sub-identifier + * of this element. This value must be unique within the scope of the parent + * element. Optional attribute. + */ + xsNCName attrSid; + +protected: // Value + /** + * The xsString value of the text data of this element. + */ + xsString _value; + +public: //Accessors and Mutators + /** + * Gets the sid attribute. + * @return Returns a xsNCName of the sid attribute. + */ + xsNCName getSid() const { return attrSid; } + /** + * Sets the sid attribute. + * @param atSid The new value for the sid attribute. + */ + void setSid( xsNCName atSid ) { *(daeStringRef*)&attrSid = atSid; } + + /** + * Gets the value of this element. + * @return Returns a xsString of the value. + */ + xsString getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( xsString val ) { *(daeStringRef*)&_value = val; } + +protected: + /** + * Constructor + */ + domFx_code_profile_complexType() : attrSid(), _value() {} + /** + * Destructor + */ + virtual ~domFx_code_profile_complexType() {} + /** + * Copy Constructor + */ + domFx_code_profile_complexType( const domFx_code_profile_complexType &cpy ) { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFx_code_profile_complexType &operator=( const domFx_code_profile_complexType &cpy ) { (void)cpy; return *this; } +}; + +/** + * An element of type domFx_code_profile_complexType. + */ +class domFx_code_profile : public daeElement, public domFx_code_profile_complexType +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FX_CODE_PROFILE; } + +public: //Accessors and Mutators + /** + * Gets the sid attribute. + * @return Returns a xsNCName of the sid attribute. + */ + xsNCName getSid() const { return attrSid; } + /** + * Sets the sid attribute. + * @param atSid The new value for the sid attribute. + */ + void setSid( xsNCName atSid ) { *(daeStringRef*)&attrSid = atSid; + _validAttributeArray[0] = true; } + +protected: + /** + * Constructor + */ + domFx_code_profile() {} + /** + * Destructor + */ + virtual ~domFx_code_profile() {} + /** + * Copy Constructor + */ + domFx_code_profile( const domFx_code_profile &cpy ) : daeElement(), domFx_code_profile_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFx_code_profile &operator=( const domFx_code_profile &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_colortarget_common.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_colortarget_common.h new file mode 100644 index 00000000..be3e1185 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_colortarget_common.h @@ -0,0 +1,206 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domFx_colortarget_common_h__ +#define __domFx_colortarget_common_h__ + +#include +#include + + +class domFx_colortarget_common_complexType +{ +protected: // Attributes + xsNonNegativeInteger attrIndex; + domFx_surface_face_enum attrFace; + xsNonNegativeInteger attrMip; + xsNonNegativeInteger attrSlice; + +protected: // Value + /** + * The xsNCName value of the text data of this element. + */ + xsNCName _value; + +public: //Accessors and Mutators + /** + * Gets the index attribute. + * @return Returns a xsNonNegativeInteger of the index attribute. + */ + xsNonNegativeInteger getIndex() const { return attrIndex; } + /** + * Sets the index attribute. + * @param atIndex The new value for the index attribute. + */ + void setIndex( xsNonNegativeInteger atIndex ) { attrIndex = atIndex; } + + /** + * Gets the face attribute. + * @return Returns a domFx_surface_face_enum of the face attribute. + */ + domFx_surface_face_enum getFace() const { return attrFace; } + /** + * Sets the face attribute. + * @param atFace The new value for the face attribute. + */ + void setFace( domFx_surface_face_enum atFace ) { attrFace = atFace; } + + /** + * Gets the mip attribute. + * @return Returns a xsNonNegativeInteger of the mip attribute. + */ + xsNonNegativeInteger getMip() const { return attrMip; } + /** + * Sets the mip attribute. + * @param atMip The new value for the mip attribute. + */ + void setMip( xsNonNegativeInteger atMip ) { attrMip = atMip; } + + /** + * Gets the slice attribute. + * @return Returns a xsNonNegativeInteger of the slice attribute. + */ + xsNonNegativeInteger getSlice() const { return attrSlice; } + /** + * Sets the slice attribute. + * @param atSlice The new value for the slice attribute. + */ + void setSlice( xsNonNegativeInteger atSlice ) { attrSlice = atSlice; } + + /** + * Gets the value of this element. + * @return Returns a xsNCName of the value. + */ + xsNCName getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( xsNCName val ) { *(daeStringRef*)&_value = val; } + +protected: + /** + * Constructor + */ + domFx_colortarget_common_complexType() : attrIndex(), attrFace(), attrMip(), attrSlice(), _value() {} + /** + * Destructor + */ + virtual ~domFx_colortarget_common_complexType() {} + /** + * Copy Constructor + */ + domFx_colortarget_common_complexType( const domFx_colortarget_common_complexType &cpy ) { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFx_colortarget_common_complexType &operator=( const domFx_colortarget_common_complexType &cpy ) { (void)cpy; return *this; } +}; + +/** + * An element of type domFx_colortarget_common_complexType. + */ +class domFx_colortarget_common : public daeElement, public domFx_colortarget_common_complexType +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FX_COLORTARGET_COMMON; } + +public: //Accessors and Mutators + /** + * Gets the index attribute. + * @return Returns a xsNonNegativeInteger of the index attribute. + */ + xsNonNegativeInteger getIndex() const { return attrIndex; } + /** + * Sets the index attribute. + * @param atIndex The new value for the index attribute. + */ + void setIndex( xsNonNegativeInteger atIndex ) { attrIndex = atIndex; + _validAttributeArray[0] = true; } + + /** + * Gets the face attribute. + * @return Returns a domFx_surface_face_enum of the face attribute. + */ + domFx_surface_face_enum getFace() const { return attrFace; } + /** + * Sets the face attribute. + * @param atFace The new value for the face attribute. + */ + void setFace( domFx_surface_face_enum atFace ) { attrFace = atFace; + _validAttributeArray[1] = true; } + + /** + * Gets the mip attribute. + * @return Returns a xsNonNegativeInteger of the mip attribute. + */ + xsNonNegativeInteger getMip() const { return attrMip; } + /** + * Sets the mip attribute. + * @param atMip The new value for the mip attribute. + */ + void setMip( xsNonNegativeInteger atMip ) { attrMip = atMip; + _validAttributeArray[2] = true; } + + /** + * Gets the slice attribute. + * @return Returns a xsNonNegativeInteger of the slice attribute. + */ + xsNonNegativeInteger getSlice() const { return attrSlice; } + /** + * Sets the slice attribute. + * @param atSlice The new value for the slice attribute. + */ + void setSlice( xsNonNegativeInteger atSlice ) { attrSlice = atSlice; + _validAttributeArray[3] = true; } + +protected: + /** + * Constructor + */ + domFx_colortarget_common() {} + /** + * Destructor + */ + virtual ~domFx_colortarget_common() {} + /** + * Copy Constructor + */ + domFx_colortarget_common( const domFx_colortarget_common &cpy ) : daeElement(), domFx_colortarget_common_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFx_colortarget_common &operator=( const domFx_colortarget_common &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_depthtarget_common.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_depthtarget_common.h new file mode 100644 index 00000000..277957af --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_depthtarget_common.h @@ -0,0 +1,206 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domFx_depthtarget_common_h__ +#define __domFx_depthtarget_common_h__ + +#include +#include + + +class domFx_depthtarget_common_complexType +{ +protected: // Attributes + xsNonNegativeInteger attrIndex; + domFx_surface_face_enum attrFace; + xsNonNegativeInteger attrMip; + xsNonNegativeInteger attrSlice; + +protected: // Value + /** + * The xsNCName value of the text data of this element. + */ + xsNCName _value; + +public: //Accessors and Mutators + /** + * Gets the index attribute. + * @return Returns a xsNonNegativeInteger of the index attribute. + */ + xsNonNegativeInteger getIndex() const { return attrIndex; } + /** + * Sets the index attribute. + * @param atIndex The new value for the index attribute. + */ + void setIndex( xsNonNegativeInteger atIndex ) { attrIndex = atIndex; } + + /** + * Gets the face attribute. + * @return Returns a domFx_surface_face_enum of the face attribute. + */ + domFx_surface_face_enum getFace() const { return attrFace; } + /** + * Sets the face attribute. + * @param atFace The new value for the face attribute. + */ + void setFace( domFx_surface_face_enum atFace ) { attrFace = atFace; } + + /** + * Gets the mip attribute. + * @return Returns a xsNonNegativeInteger of the mip attribute. + */ + xsNonNegativeInteger getMip() const { return attrMip; } + /** + * Sets the mip attribute. + * @param atMip The new value for the mip attribute. + */ + void setMip( xsNonNegativeInteger atMip ) { attrMip = atMip; } + + /** + * Gets the slice attribute. + * @return Returns a xsNonNegativeInteger of the slice attribute. + */ + xsNonNegativeInteger getSlice() const { return attrSlice; } + /** + * Sets the slice attribute. + * @param atSlice The new value for the slice attribute. + */ + void setSlice( xsNonNegativeInteger atSlice ) { attrSlice = atSlice; } + + /** + * Gets the value of this element. + * @return Returns a xsNCName of the value. + */ + xsNCName getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( xsNCName val ) { *(daeStringRef*)&_value = val; } + +protected: + /** + * Constructor + */ + domFx_depthtarget_common_complexType() : attrIndex(), attrFace(), attrMip(), attrSlice(), _value() {} + /** + * Destructor + */ + virtual ~domFx_depthtarget_common_complexType() {} + /** + * Copy Constructor + */ + domFx_depthtarget_common_complexType( const domFx_depthtarget_common_complexType &cpy ) { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFx_depthtarget_common_complexType &operator=( const domFx_depthtarget_common_complexType &cpy ) { (void)cpy; return *this; } +}; + +/** + * An element of type domFx_depthtarget_common_complexType. + */ +class domFx_depthtarget_common : public daeElement, public domFx_depthtarget_common_complexType +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FX_DEPTHTARGET_COMMON; } + +public: //Accessors and Mutators + /** + * Gets the index attribute. + * @return Returns a xsNonNegativeInteger of the index attribute. + */ + xsNonNegativeInteger getIndex() const { return attrIndex; } + /** + * Sets the index attribute. + * @param atIndex The new value for the index attribute. + */ + void setIndex( xsNonNegativeInteger atIndex ) { attrIndex = atIndex; + _validAttributeArray[0] = true; } + + /** + * Gets the face attribute. + * @return Returns a domFx_surface_face_enum of the face attribute. + */ + domFx_surface_face_enum getFace() const { return attrFace; } + /** + * Sets the face attribute. + * @param atFace The new value for the face attribute. + */ + void setFace( domFx_surface_face_enum atFace ) { attrFace = atFace; + _validAttributeArray[1] = true; } + + /** + * Gets the mip attribute. + * @return Returns a xsNonNegativeInteger of the mip attribute. + */ + xsNonNegativeInteger getMip() const { return attrMip; } + /** + * Sets the mip attribute. + * @param atMip The new value for the mip attribute. + */ + void setMip( xsNonNegativeInteger atMip ) { attrMip = atMip; + _validAttributeArray[2] = true; } + + /** + * Gets the slice attribute. + * @return Returns a xsNonNegativeInteger of the slice attribute. + */ + xsNonNegativeInteger getSlice() const { return attrSlice; } + /** + * Sets the slice attribute. + * @param atSlice The new value for the slice attribute. + */ + void setSlice( xsNonNegativeInteger atSlice ) { attrSlice = atSlice; + _validAttributeArray[3] = true; } + +protected: + /** + * Constructor + */ + domFx_depthtarget_common() {} + /** + * Destructor + */ + virtual ~domFx_depthtarget_common() {} + /** + * Copy Constructor + */ + domFx_depthtarget_common( const domFx_depthtarget_common &cpy ) : daeElement(), domFx_depthtarget_common_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFx_depthtarget_common &operator=( const domFx_depthtarget_common &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_include_common.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_include_common.h new file mode 100644 index 00000000..c9f7f685 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_include_common.h @@ -0,0 +1,167 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domFx_include_common_h__ +#define __domFx_include_common_h__ + +#include +#include + + +/** + * The include element is used to import source code or precompiled binary + * shaders into the FX Runtime by referencing an external resource. + */ +class domFx_include_common_complexType +{ +protected: // Attributes +/** + * The sid attribute is a text string value containing the sub-identifier + * of this element. This value must be unique within the scope of the parent + * element. Optional attribute. + */ + xsNCName attrSid; +/** + * The url attribute refers to resource. This may refer to a local resource + * using a relative URL fragment identifier that begins with the “#†+ * character. The url attribute may refer to an external resource using an + * absolute or relative URL. + */ + xsAnyURI attrUrl; + + +public: //Accessors and Mutators + /** + * Gets the sid attribute. + * @return Returns a xsNCName of the sid attribute. + */ + xsNCName getSid() const { return attrSid; } + /** + * Sets the sid attribute. + * @param atSid The new value for the sid attribute. + */ + void setSid( xsNCName atSid ) { *(daeStringRef*)&attrSid = atSid; } + + /** + * Gets the url attribute. + * @return Returns a xsAnyURI reference of the url attribute. + */ + xsAnyURI &getUrl() { return attrUrl; } + /** + * Gets the url attribute. + * @return Returns a constant xsAnyURI reference of the url attribute. + */ + const xsAnyURI &getUrl() const { return attrUrl; } + /** + * Sets the url attribute. + * @param atUrl The new value for the url attribute. + */ + void setUrl( const xsAnyURI &atUrl ) { attrUrl = atUrl; } + +protected: + /** + * Constructor + */ + domFx_include_common_complexType() : attrSid(), attrUrl() {} + /** + * Destructor + */ + virtual ~domFx_include_common_complexType() {} + /** + * Copy Constructor + */ + domFx_include_common_complexType( const domFx_include_common_complexType &cpy ) { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFx_include_common_complexType &operator=( const domFx_include_common_complexType &cpy ) { (void)cpy; return *this; } +}; + +/** + * An element of type domFx_include_common_complexType. + */ +class domFx_include_common : public daeElement, public domFx_include_common_complexType +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FX_INCLUDE_COMMON; } + +public: //Accessors and Mutators + /** + * Gets the sid attribute. + * @return Returns a xsNCName of the sid attribute. + */ + xsNCName getSid() const { return attrSid; } + /** + * Sets the sid attribute. + * @param atSid The new value for the sid attribute. + */ + void setSid( xsNCName atSid ) { *(daeStringRef*)&attrSid = atSid; + _validAttributeArray[0] = true; } + + /** + * Gets the url attribute. + * @return Returns a xsAnyURI reference of the url attribute. + */ + xsAnyURI &getUrl() { return attrUrl; } + /** + * Gets the url attribute. + * @return Returns a constant xsAnyURI reference of the url attribute. + */ + const xsAnyURI &getUrl() const { return attrUrl; } + /** + * Sets the url attribute. + * @param atUrl The new value for the url attribute. + */ + void setUrl( const xsAnyURI &atUrl ) { attrUrl = atUrl; + _validAttributeArray[1] = true; } + +protected: + /** + * Constructor + */ + domFx_include_common() {} + /** + * Destructor + */ + virtual ~domFx_include_common() {} + /** + * Copy Constructor + */ + domFx_include_common( const domFx_include_common &cpy ) : daeElement(), domFx_include_common_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFx_include_common &operator=( const domFx_include_common &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_newparam_common.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_newparam_common.h new file mode 100644 index 00000000..555cfbec --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_newparam_common.h @@ -0,0 +1,313 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domFx_newparam_common_h__ +#define __domFx_newparam_common_h__ + +#include +#include + +#include +#include + +/** + * This element creates a new, named param object in the FX Runtime, assigns + * it a type, an initial value, and additional attributes at declaration time. + */ +class domFx_newparam_common_complexType +{ +public: + class domSemantic; + + typedef daeSmartRef domSemanticRef; + typedef daeTArray domSemantic_Array; + +/** + * The semantic element allows you to specify a semantic for this new param. + */ + class domSemantic : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::SEMANTIC; } + + protected: // Value + /** + * The xsNCName value of the text data of this element. + */ + xsNCName _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return Returns a xsNCName of the value. + */ + xsNCName getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( xsNCName val ) { *(daeStringRef*)&_value = val; } + + protected: + /** + * Constructor + */ + domSemantic() : _value() {} + /** + * Destructor + */ + virtual ~domSemantic() {} + /** + * Copy Constructor + */ + domSemantic( const domSemantic &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domSemantic &operator=( const domSemantic &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domModifier; + + typedef daeSmartRef domModifierRef; + typedef daeTArray domModifier_Array; + +/** + * The modifier element allows you to specify a modifier for this new param. + */ + class domModifier : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::MODIFIER; } + + protected: // Value + /** + * The domFx_modifier_enum_common value of the text data of this element. + */ + domFx_modifier_enum_common _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a domFx_modifier_enum_common of the value. + */ + domFx_modifier_enum_common getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( domFx_modifier_enum_common val ) { _value = val; } + + protected: + /** + * Constructor + */ + domModifier() : _value() {} + /** + * Destructor + */ + virtual ~domModifier() {} + /** + * Copy Constructor + */ + domModifier( const domModifier &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domModifier &operator=( const domModifier &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + +protected: // Attribute +/** + * The sid attribute is a text string value containing the sub-identifier + * of this element. This value must be unique within the scope of the parent + * element. Optional attribute. + */ + xsNCName attrSid; + +protected: // Elements +/** + * The annotate element allows you to specify an annotation for this new param. + * @see domAnnotate + */ + domFx_annotate_common_Array elemAnnotate_array; +/** + * The semantic element allows you to specify a semantic for this new param. + * @see domSemantic + */ + domSemanticRef elemSemantic; +/** + * The modifier element allows you to specify a modifier for this new param. + * @see domModifier + */ + domModifierRef elemModifier; + domFx_basic_type_commonRef elemFx_basic_type_common; + +public: //Accessors and Mutators + /** + * Gets the sid attribute. + * @return Returns a xsNCName of the sid attribute. + */ + xsNCName getSid() const { return attrSid; } + /** + * Sets the sid attribute. + * @param atSid The new value for the sid attribute. + */ + void setSid( xsNCName atSid ) { *(daeStringRef*)&attrSid = atSid; } + + /** + * Gets the annotate element array. + * @return Returns a reference to the array of annotate elements. + */ + domFx_annotate_common_Array &getAnnotate_array() { return elemAnnotate_array; } + /** + * Gets the annotate element array. + * @return Returns a constant reference to the array of annotate elements. + */ + const domFx_annotate_common_Array &getAnnotate_array() const { return elemAnnotate_array; } + /** + * Gets the semantic element. + * @return a daeSmartRef to the semantic element. + */ + const domSemanticRef getSemantic() const { return elemSemantic; } + /** + * Gets the modifier element. + * @return a daeSmartRef to the modifier element. + */ + const domModifierRef getModifier() const { return elemModifier; } + /** + * Gets the fx_basic_type_common element. + * @return a daeSmartRef to the fx_basic_type_common element. + */ + const domFx_basic_type_commonRef getFx_basic_type_common() const { return elemFx_basic_type_common; } +protected: + /** + * Constructor + */ + domFx_newparam_common_complexType() : attrSid(), elemAnnotate_array(), elemSemantic(), elemModifier(), elemFx_basic_type_common() {} + /** + * Destructor + */ + virtual ~domFx_newparam_common_complexType() {} + /** + * Copy Constructor + */ + domFx_newparam_common_complexType( const domFx_newparam_common_complexType &cpy ) { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFx_newparam_common_complexType &operator=( const domFx_newparam_common_complexType &cpy ) { (void)cpy; return *this; } +}; + +/** + * An element of type domFx_newparam_common_complexType. + */ +class domFx_newparam_common : public daeElement, public domFx_newparam_common_complexType +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FX_NEWPARAM_COMMON; } + +public: //Accessors and Mutators + /** + * Gets the sid attribute. + * @return Returns a xsNCName of the sid attribute. + */ + xsNCName getSid() const { return attrSid; } + /** + * Sets the sid attribute. + * @param atSid The new value for the sid attribute. + */ + void setSid( xsNCName atSid ) { *(daeStringRef*)&attrSid = atSid; + _validAttributeArray[0] = true; } + +protected: + /** + * Constructor + */ + domFx_newparam_common() {} + /** + * Destructor + */ + virtual ~domFx_newparam_common() {} + /** + * Copy Constructor + */ + domFx_newparam_common( const domFx_newparam_common &cpy ) : daeElement(), domFx_newparam_common_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFx_newparam_common &operator=( const domFx_newparam_common &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_profile_abstract.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_profile_abstract.h new file mode 100644 index 00000000..d7e29d7d --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_profile_abstract.h @@ -0,0 +1,69 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domFx_profile_abstract_h__ +#define __domFx_profile_abstract_h__ + +#include +#include + + +/** + * The fx_profile_abstract element is only used as a substitution group hook + * for COLLADA FX profiles. + */ +class domFx_profile_abstract : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FX_PROFILE_ABSTRACT; } + +protected: + /** + * Constructor + */ + domFx_profile_abstract() {} + /** + * Destructor + */ + virtual ~domFx_profile_abstract() {} + /** + * Copy Constructor + */ + domFx_profile_abstract( const domFx_profile_abstract &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFx_profile_abstract &operator=( const domFx_profile_abstract &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_sampler1D_common.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_sampler1D_common.h new file mode 100644 index 00000000..ad398aca --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_sampler1D_common.h @@ -0,0 +1,698 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domFx_sampler1D_common_h__ +#define __domFx_sampler1D_common_h__ + +#include +#include + +#include + +/** + * A one-dimensional texture sampler. + */ +class domFx_sampler1D_common_complexType +{ +public: + class domSource; + + typedef daeSmartRef domSourceRef; + typedef daeTArray domSource_Array; + + class domSource : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::SOURCE; } + + protected: // Value + /** + * The xsNCName value of the text data of this element. + */ + xsNCName _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return Returns a xsNCName of the value. + */ + xsNCName getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( xsNCName val ) { *(daeStringRef*)&_value = val; } + + protected: + /** + * Constructor + */ + domSource() : _value() {} + /** + * Destructor + */ + virtual ~domSource() {} + /** + * Copy Constructor + */ + domSource( const domSource &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domSource &operator=( const domSource &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domWrap_s; + + typedef daeSmartRef domWrap_sRef; + typedef daeTArray domWrap_s_Array; + + class domWrap_s : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::WRAP_S; } + + protected: // Value + /** + * The domFx_sampler_wrap_common value of the text data of this element. + */ + domFx_sampler_wrap_common _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a domFx_sampler_wrap_common of the value. + */ + domFx_sampler_wrap_common getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( domFx_sampler_wrap_common val ) { _value = val; } + + protected: + /** + * Constructor + */ + domWrap_s() : _value() {} + /** + * Destructor + */ + virtual ~domWrap_s() {} + /** + * Copy Constructor + */ + domWrap_s( const domWrap_s &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domWrap_s &operator=( const domWrap_s &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domMinfilter; + + typedef daeSmartRef domMinfilterRef; + typedef daeTArray domMinfilter_Array; + + class domMinfilter : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::MINFILTER; } + + protected: // Value + /** + * The domFx_sampler_filter_common value of the text data of this element. + */ + domFx_sampler_filter_common _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a domFx_sampler_filter_common of the value. + */ + domFx_sampler_filter_common getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( domFx_sampler_filter_common val ) { _value = val; } + + protected: + /** + * Constructor + */ + domMinfilter() : _value() {} + /** + * Destructor + */ + virtual ~domMinfilter() {} + /** + * Copy Constructor + */ + domMinfilter( const domMinfilter &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domMinfilter &operator=( const domMinfilter &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domMagfilter; + + typedef daeSmartRef domMagfilterRef; + typedef daeTArray domMagfilter_Array; + + class domMagfilter : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::MAGFILTER; } + + protected: // Value + /** + * The domFx_sampler_filter_common value of the text data of this element. + */ + domFx_sampler_filter_common _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a domFx_sampler_filter_common of the value. + */ + domFx_sampler_filter_common getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( domFx_sampler_filter_common val ) { _value = val; } + + protected: + /** + * Constructor + */ + domMagfilter() : _value() {} + /** + * Destructor + */ + virtual ~domMagfilter() {} + /** + * Copy Constructor + */ + domMagfilter( const domMagfilter &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domMagfilter &operator=( const domMagfilter &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domMipfilter; + + typedef daeSmartRef domMipfilterRef; + typedef daeTArray domMipfilter_Array; + + class domMipfilter : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::MIPFILTER; } + + protected: // Value + /** + * The domFx_sampler_filter_common value of the text data of this element. + */ + domFx_sampler_filter_common _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a domFx_sampler_filter_common of the value. + */ + domFx_sampler_filter_common getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( domFx_sampler_filter_common val ) { _value = val; } + + protected: + /** + * Constructor + */ + domMipfilter() : _value() {} + /** + * Destructor + */ + virtual ~domMipfilter() {} + /** + * Copy Constructor + */ + domMipfilter( const domMipfilter &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domMipfilter &operator=( const domMipfilter &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domBorder_color; + + typedef daeSmartRef domBorder_colorRef; + typedef daeTArray domBorder_color_Array; + + class domBorder_color : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::BORDER_COLOR; } + + protected: // Value + /** + * The domFx_color_common value of the text data of this element. + */ + domFx_color_common _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domFx_color_common reference of the _value array. + */ + domFx_color_common &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domFx_color_common reference of the _value array. + */ + const domFx_color_common &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domFx_color_common &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domBorder_color() : _value() {} + /** + * Destructor + */ + virtual ~domBorder_color() {} + /** + * Copy Constructor + */ + domBorder_color( const domBorder_color &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domBorder_color &operator=( const domBorder_color &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domMipmap_maxlevel; + + typedef daeSmartRef domMipmap_maxlevelRef; + typedef daeTArray domMipmap_maxlevel_Array; + + class domMipmap_maxlevel : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::MIPMAP_MAXLEVEL; } + + protected: // Value + /** + * The xsUnsignedByte value of the text data of this element. + */ + xsUnsignedByte _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a xsUnsignedByte of the value. + */ + xsUnsignedByte getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( xsUnsignedByte val ) { _value = val; } + + protected: + /** + * Constructor + */ + domMipmap_maxlevel() : _value() {} + /** + * Destructor + */ + virtual ~domMipmap_maxlevel() {} + /** + * Copy Constructor + */ + domMipmap_maxlevel( const domMipmap_maxlevel &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domMipmap_maxlevel &operator=( const domMipmap_maxlevel &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domMipmap_bias; + + typedef daeSmartRef domMipmap_biasRef; + typedef daeTArray domMipmap_bias_Array; + + class domMipmap_bias : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::MIPMAP_BIAS; } + + protected: // Value + /** + * The xsFloat value of the text data of this element. + */ + xsFloat _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a xsFloat of the value. + */ + xsFloat getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( xsFloat val ) { _value = val; } + + protected: + /** + * Constructor + */ + domMipmap_bias() : _value() {} + /** + * Destructor + */ + virtual ~domMipmap_bias() {} + /** + * Copy Constructor + */ + domMipmap_bias( const domMipmap_bias &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domMipmap_bias &operator=( const domMipmap_bias &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + + +protected: // Elements + domSourceRef elemSource; + domWrap_sRef elemWrap_s; + domMinfilterRef elemMinfilter; + domMagfilterRef elemMagfilter; + domMipfilterRef elemMipfilter; + domBorder_colorRef elemBorder_color; + domMipmap_maxlevelRef elemMipmap_maxlevel; + domMipmap_biasRef elemMipmap_bias; + domExtra_Array elemExtra_array; + +public: //Accessors and Mutators + /** + * Gets the source element. + * @return a daeSmartRef to the source element. + */ + const domSourceRef getSource() const { return elemSource; } + /** + * Gets the wrap_s element. + * @return a daeSmartRef to the wrap_s element. + */ + const domWrap_sRef getWrap_s() const { return elemWrap_s; } + /** + * Gets the minfilter element. + * @return a daeSmartRef to the minfilter element. + */ + const domMinfilterRef getMinfilter() const { return elemMinfilter; } + /** + * Gets the magfilter element. + * @return a daeSmartRef to the magfilter element. + */ + const domMagfilterRef getMagfilter() const { return elemMagfilter; } + /** + * Gets the mipfilter element. + * @return a daeSmartRef to the mipfilter element. + */ + const domMipfilterRef getMipfilter() const { return elemMipfilter; } + /** + * Gets the border_color element. + * @return a daeSmartRef to the border_color element. + */ + const domBorder_colorRef getBorder_color() const { return elemBorder_color; } + /** + * Gets the mipmap_maxlevel element. + * @return a daeSmartRef to the mipmap_maxlevel element. + */ + const domMipmap_maxlevelRef getMipmap_maxlevel() const { return elemMipmap_maxlevel; } + /** + * Gets the mipmap_bias element. + * @return a daeSmartRef to the mipmap_bias element. + */ + const domMipmap_biasRef getMipmap_bias() const { return elemMipmap_bias; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } +protected: + /** + * Constructor + */ + domFx_sampler1D_common_complexType() : elemSource(), elemWrap_s(), elemMinfilter(), elemMagfilter(), elemMipfilter(), elemBorder_color(), elemMipmap_maxlevel(), elemMipmap_bias(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domFx_sampler1D_common_complexType() {} + /** + * Copy Constructor + */ + domFx_sampler1D_common_complexType( const domFx_sampler1D_common_complexType &cpy ) { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFx_sampler1D_common_complexType &operator=( const domFx_sampler1D_common_complexType &cpy ) { (void)cpy; return *this; } +}; + +/** + * An element of type domFx_sampler1D_common_complexType. + */ +class domFx_sampler1D_common : public daeElement, public domFx_sampler1D_common_complexType +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FX_SAMPLER1D_COMMON; } +protected: + /** + * Constructor + */ + domFx_sampler1D_common() {} + /** + * Destructor + */ + virtual ~domFx_sampler1D_common() {} + /** + * Copy Constructor + */ + domFx_sampler1D_common( const domFx_sampler1D_common &cpy ) : daeElement(), domFx_sampler1D_common_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFx_sampler1D_common &operator=( const domFx_sampler1D_common &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_sampler2D_common.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_sampler2D_common.h new file mode 100644 index 00000000..8b09caaf --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_sampler2D_common.h @@ -0,0 +1,771 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domFx_sampler2D_common_h__ +#define __domFx_sampler2D_common_h__ + +#include +#include + +#include + +/** + * A two-dimensional texture sampler. + */ +class domFx_sampler2D_common_complexType +{ +public: + class domSource; + + typedef daeSmartRef domSourceRef; + typedef daeTArray domSource_Array; + + class domSource : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::SOURCE; } + + protected: // Value + /** + * The xsNCName value of the text data of this element. + */ + xsNCName _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return Returns a xsNCName of the value. + */ + xsNCName getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( xsNCName val ) { *(daeStringRef*)&_value = val; } + + protected: + /** + * Constructor + */ + domSource() : _value() {} + /** + * Destructor + */ + virtual ~domSource() {} + /** + * Copy Constructor + */ + domSource( const domSource &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domSource &operator=( const domSource &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domWrap_s; + + typedef daeSmartRef domWrap_sRef; + typedef daeTArray domWrap_s_Array; + + class domWrap_s : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::WRAP_S; } + + protected: // Value + /** + * The domFx_sampler_wrap_common value of the text data of this element. + */ + domFx_sampler_wrap_common _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a domFx_sampler_wrap_common of the value. + */ + domFx_sampler_wrap_common getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( domFx_sampler_wrap_common val ) { _value = val; } + + protected: + /** + * Constructor + */ + domWrap_s() : _value() {} + /** + * Destructor + */ + virtual ~domWrap_s() {} + /** + * Copy Constructor + */ + domWrap_s( const domWrap_s &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domWrap_s &operator=( const domWrap_s &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domWrap_t; + + typedef daeSmartRef domWrap_tRef; + typedef daeTArray domWrap_t_Array; + + class domWrap_t : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::WRAP_T; } + + protected: // Value + /** + * The domFx_sampler_wrap_common value of the text data of this element. + */ + domFx_sampler_wrap_common _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a domFx_sampler_wrap_common of the value. + */ + domFx_sampler_wrap_common getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( domFx_sampler_wrap_common val ) { _value = val; } + + protected: + /** + * Constructor + */ + domWrap_t() : _value() {} + /** + * Destructor + */ + virtual ~domWrap_t() {} + /** + * Copy Constructor + */ + domWrap_t( const domWrap_t &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domWrap_t &operator=( const domWrap_t &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domMinfilter; + + typedef daeSmartRef domMinfilterRef; + typedef daeTArray domMinfilter_Array; + + class domMinfilter : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::MINFILTER; } + + protected: // Value + /** + * The domFx_sampler_filter_common value of the text data of this element. + */ + domFx_sampler_filter_common _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a domFx_sampler_filter_common of the value. + */ + domFx_sampler_filter_common getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( domFx_sampler_filter_common val ) { _value = val; } + + protected: + /** + * Constructor + */ + domMinfilter() : _value() {} + /** + * Destructor + */ + virtual ~domMinfilter() {} + /** + * Copy Constructor + */ + domMinfilter( const domMinfilter &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domMinfilter &operator=( const domMinfilter &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domMagfilter; + + typedef daeSmartRef domMagfilterRef; + typedef daeTArray domMagfilter_Array; + + class domMagfilter : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::MAGFILTER; } + + protected: // Value + /** + * The domFx_sampler_filter_common value of the text data of this element. + */ + domFx_sampler_filter_common _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a domFx_sampler_filter_common of the value. + */ + domFx_sampler_filter_common getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( domFx_sampler_filter_common val ) { _value = val; } + + protected: + /** + * Constructor + */ + domMagfilter() : _value() {} + /** + * Destructor + */ + virtual ~domMagfilter() {} + /** + * Copy Constructor + */ + domMagfilter( const domMagfilter &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domMagfilter &operator=( const domMagfilter &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domMipfilter; + + typedef daeSmartRef domMipfilterRef; + typedef daeTArray domMipfilter_Array; + + class domMipfilter : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::MIPFILTER; } + + protected: // Value + /** + * The domFx_sampler_filter_common value of the text data of this element. + */ + domFx_sampler_filter_common _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a domFx_sampler_filter_common of the value. + */ + domFx_sampler_filter_common getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( domFx_sampler_filter_common val ) { _value = val; } + + protected: + /** + * Constructor + */ + domMipfilter() : _value() {} + /** + * Destructor + */ + virtual ~domMipfilter() {} + /** + * Copy Constructor + */ + domMipfilter( const domMipfilter &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domMipfilter &operator=( const domMipfilter &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domBorder_color; + + typedef daeSmartRef domBorder_colorRef; + typedef daeTArray domBorder_color_Array; + + class domBorder_color : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::BORDER_COLOR; } + + protected: // Value + /** + * The domFx_color_common value of the text data of this element. + */ + domFx_color_common _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domFx_color_common reference of the _value array. + */ + domFx_color_common &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domFx_color_common reference of the _value array. + */ + const domFx_color_common &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domFx_color_common &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domBorder_color() : _value() {} + /** + * Destructor + */ + virtual ~domBorder_color() {} + /** + * Copy Constructor + */ + domBorder_color( const domBorder_color &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domBorder_color &operator=( const domBorder_color &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domMipmap_maxlevel; + + typedef daeSmartRef domMipmap_maxlevelRef; + typedef daeTArray domMipmap_maxlevel_Array; + + class domMipmap_maxlevel : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::MIPMAP_MAXLEVEL; } + + protected: // Value + /** + * The xsUnsignedByte value of the text data of this element. + */ + xsUnsignedByte _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a xsUnsignedByte of the value. + */ + xsUnsignedByte getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( xsUnsignedByte val ) { _value = val; } + + protected: + /** + * Constructor + */ + domMipmap_maxlevel() : _value() {} + /** + * Destructor + */ + virtual ~domMipmap_maxlevel() {} + /** + * Copy Constructor + */ + domMipmap_maxlevel( const domMipmap_maxlevel &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domMipmap_maxlevel &operator=( const domMipmap_maxlevel &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domMipmap_bias; + + typedef daeSmartRef domMipmap_biasRef; + typedef daeTArray domMipmap_bias_Array; + + class domMipmap_bias : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::MIPMAP_BIAS; } + + protected: // Value + /** + * The xsFloat value of the text data of this element. + */ + xsFloat _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a xsFloat of the value. + */ + xsFloat getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( xsFloat val ) { _value = val; } + + protected: + /** + * Constructor + */ + domMipmap_bias() : _value() {} + /** + * Destructor + */ + virtual ~domMipmap_bias() {} + /** + * Copy Constructor + */ + domMipmap_bias( const domMipmap_bias &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domMipmap_bias &operator=( const domMipmap_bias &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + + +protected: // Elements + domSourceRef elemSource; + domWrap_sRef elemWrap_s; + domWrap_tRef elemWrap_t; + domMinfilterRef elemMinfilter; + domMagfilterRef elemMagfilter; + domMipfilterRef elemMipfilter; + domBorder_colorRef elemBorder_color; + domMipmap_maxlevelRef elemMipmap_maxlevel; + domMipmap_biasRef elemMipmap_bias; + domExtra_Array elemExtra_array; + +public: //Accessors and Mutators + /** + * Gets the source element. + * @return a daeSmartRef to the source element. + */ + const domSourceRef getSource() const { return elemSource; } + /** + * Gets the wrap_s element. + * @return a daeSmartRef to the wrap_s element. + */ + const domWrap_sRef getWrap_s() const { return elemWrap_s; } + /** + * Gets the wrap_t element. + * @return a daeSmartRef to the wrap_t element. + */ + const domWrap_tRef getWrap_t() const { return elemWrap_t; } + /** + * Gets the minfilter element. + * @return a daeSmartRef to the minfilter element. + */ + const domMinfilterRef getMinfilter() const { return elemMinfilter; } + /** + * Gets the magfilter element. + * @return a daeSmartRef to the magfilter element. + */ + const domMagfilterRef getMagfilter() const { return elemMagfilter; } + /** + * Gets the mipfilter element. + * @return a daeSmartRef to the mipfilter element. + */ + const domMipfilterRef getMipfilter() const { return elemMipfilter; } + /** + * Gets the border_color element. + * @return a daeSmartRef to the border_color element. + */ + const domBorder_colorRef getBorder_color() const { return elemBorder_color; } + /** + * Gets the mipmap_maxlevel element. + * @return a daeSmartRef to the mipmap_maxlevel element. + */ + const domMipmap_maxlevelRef getMipmap_maxlevel() const { return elemMipmap_maxlevel; } + /** + * Gets the mipmap_bias element. + * @return a daeSmartRef to the mipmap_bias element. + */ + const domMipmap_biasRef getMipmap_bias() const { return elemMipmap_bias; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } +protected: + /** + * Constructor + */ + domFx_sampler2D_common_complexType() : elemSource(), elemWrap_s(), elemWrap_t(), elemMinfilter(), elemMagfilter(), elemMipfilter(), elemBorder_color(), elemMipmap_maxlevel(), elemMipmap_bias(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domFx_sampler2D_common_complexType() {} + /** + * Copy Constructor + */ + domFx_sampler2D_common_complexType( const domFx_sampler2D_common_complexType &cpy ) { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFx_sampler2D_common_complexType &operator=( const domFx_sampler2D_common_complexType &cpy ) { (void)cpy; return *this; } +}; + +/** + * An element of type domFx_sampler2D_common_complexType. + */ +class domFx_sampler2D_common : public daeElement, public domFx_sampler2D_common_complexType +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FX_SAMPLER2D_COMMON; } +protected: + /** + * Constructor + */ + domFx_sampler2D_common() {} + /** + * Destructor + */ + virtual ~domFx_sampler2D_common() {} + /** + * Copy Constructor + */ + domFx_sampler2D_common( const domFx_sampler2D_common &cpy ) : daeElement(), domFx_sampler2D_common_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFx_sampler2D_common &operator=( const domFx_sampler2D_common &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_sampler3D_common.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_sampler3D_common.h new file mode 100644 index 00000000..f96b59b1 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_sampler3D_common.h @@ -0,0 +1,844 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domFx_sampler3D_common_h__ +#define __domFx_sampler3D_common_h__ + +#include +#include + +#include + +/** + * A three-dimensional texture sampler. + */ +class domFx_sampler3D_common_complexType +{ +public: + class domSource; + + typedef daeSmartRef domSourceRef; + typedef daeTArray domSource_Array; + + class domSource : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::SOURCE; } + + protected: // Value + /** + * The xsNCName value of the text data of this element. + */ + xsNCName _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return Returns a xsNCName of the value. + */ + xsNCName getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( xsNCName val ) { *(daeStringRef*)&_value = val; } + + protected: + /** + * Constructor + */ + domSource() : _value() {} + /** + * Destructor + */ + virtual ~domSource() {} + /** + * Copy Constructor + */ + domSource( const domSource &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domSource &operator=( const domSource &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domWrap_s; + + typedef daeSmartRef domWrap_sRef; + typedef daeTArray domWrap_s_Array; + + class domWrap_s : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::WRAP_S; } + + protected: // Value + /** + * The domFx_sampler_wrap_common value of the text data of this element. + */ + domFx_sampler_wrap_common _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a domFx_sampler_wrap_common of the value. + */ + domFx_sampler_wrap_common getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( domFx_sampler_wrap_common val ) { _value = val; } + + protected: + /** + * Constructor + */ + domWrap_s() : _value() {} + /** + * Destructor + */ + virtual ~domWrap_s() {} + /** + * Copy Constructor + */ + domWrap_s( const domWrap_s &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domWrap_s &operator=( const domWrap_s &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domWrap_t; + + typedef daeSmartRef domWrap_tRef; + typedef daeTArray domWrap_t_Array; + + class domWrap_t : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::WRAP_T; } + + protected: // Value + /** + * The domFx_sampler_wrap_common value of the text data of this element. + */ + domFx_sampler_wrap_common _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a domFx_sampler_wrap_common of the value. + */ + domFx_sampler_wrap_common getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( domFx_sampler_wrap_common val ) { _value = val; } + + protected: + /** + * Constructor + */ + domWrap_t() : _value() {} + /** + * Destructor + */ + virtual ~domWrap_t() {} + /** + * Copy Constructor + */ + domWrap_t( const domWrap_t &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domWrap_t &operator=( const domWrap_t &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domWrap_p; + + typedef daeSmartRef domWrap_pRef; + typedef daeTArray domWrap_p_Array; + + class domWrap_p : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::WRAP_P; } + + protected: // Value + /** + * The domFx_sampler_wrap_common value of the text data of this element. + */ + domFx_sampler_wrap_common _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a domFx_sampler_wrap_common of the value. + */ + domFx_sampler_wrap_common getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( domFx_sampler_wrap_common val ) { _value = val; } + + protected: + /** + * Constructor + */ + domWrap_p() : _value() {} + /** + * Destructor + */ + virtual ~domWrap_p() {} + /** + * Copy Constructor + */ + domWrap_p( const domWrap_p &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domWrap_p &operator=( const domWrap_p &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domMinfilter; + + typedef daeSmartRef domMinfilterRef; + typedef daeTArray domMinfilter_Array; + + class domMinfilter : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::MINFILTER; } + + protected: // Value + /** + * The domFx_sampler_filter_common value of the text data of this element. + */ + domFx_sampler_filter_common _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a domFx_sampler_filter_common of the value. + */ + domFx_sampler_filter_common getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( domFx_sampler_filter_common val ) { _value = val; } + + protected: + /** + * Constructor + */ + domMinfilter() : _value() {} + /** + * Destructor + */ + virtual ~domMinfilter() {} + /** + * Copy Constructor + */ + domMinfilter( const domMinfilter &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domMinfilter &operator=( const domMinfilter &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domMagfilter; + + typedef daeSmartRef domMagfilterRef; + typedef daeTArray domMagfilter_Array; + + class domMagfilter : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::MAGFILTER; } + + protected: // Value + /** + * The domFx_sampler_filter_common value of the text data of this element. + */ + domFx_sampler_filter_common _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a domFx_sampler_filter_common of the value. + */ + domFx_sampler_filter_common getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( domFx_sampler_filter_common val ) { _value = val; } + + protected: + /** + * Constructor + */ + domMagfilter() : _value() {} + /** + * Destructor + */ + virtual ~domMagfilter() {} + /** + * Copy Constructor + */ + domMagfilter( const domMagfilter &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domMagfilter &operator=( const domMagfilter &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domMipfilter; + + typedef daeSmartRef domMipfilterRef; + typedef daeTArray domMipfilter_Array; + + class domMipfilter : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::MIPFILTER; } + + protected: // Value + /** + * The domFx_sampler_filter_common value of the text data of this element. + */ + domFx_sampler_filter_common _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a domFx_sampler_filter_common of the value. + */ + domFx_sampler_filter_common getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( domFx_sampler_filter_common val ) { _value = val; } + + protected: + /** + * Constructor + */ + domMipfilter() : _value() {} + /** + * Destructor + */ + virtual ~domMipfilter() {} + /** + * Copy Constructor + */ + domMipfilter( const domMipfilter &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domMipfilter &operator=( const domMipfilter &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domBorder_color; + + typedef daeSmartRef domBorder_colorRef; + typedef daeTArray domBorder_color_Array; + + class domBorder_color : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::BORDER_COLOR; } + + protected: // Value + /** + * The domFx_color_common value of the text data of this element. + */ + domFx_color_common _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domFx_color_common reference of the _value array. + */ + domFx_color_common &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domFx_color_common reference of the _value array. + */ + const domFx_color_common &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domFx_color_common &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domBorder_color() : _value() {} + /** + * Destructor + */ + virtual ~domBorder_color() {} + /** + * Copy Constructor + */ + domBorder_color( const domBorder_color &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domBorder_color &operator=( const domBorder_color &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domMipmap_maxlevel; + + typedef daeSmartRef domMipmap_maxlevelRef; + typedef daeTArray domMipmap_maxlevel_Array; + + class domMipmap_maxlevel : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::MIPMAP_MAXLEVEL; } + + protected: // Value + /** + * The xsUnsignedByte value of the text data of this element. + */ + xsUnsignedByte _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a xsUnsignedByte of the value. + */ + xsUnsignedByte getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( xsUnsignedByte val ) { _value = val; } + + protected: + /** + * Constructor + */ + domMipmap_maxlevel() : _value() {} + /** + * Destructor + */ + virtual ~domMipmap_maxlevel() {} + /** + * Copy Constructor + */ + domMipmap_maxlevel( const domMipmap_maxlevel &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domMipmap_maxlevel &operator=( const domMipmap_maxlevel &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domMipmap_bias; + + typedef daeSmartRef domMipmap_biasRef; + typedef daeTArray domMipmap_bias_Array; + + class domMipmap_bias : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::MIPMAP_BIAS; } + + protected: // Value + /** + * The xsFloat value of the text data of this element. + */ + xsFloat _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a xsFloat of the value. + */ + xsFloat getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( xsFloat val ) { _value = val; } + + protected: + /** + * Constructor + */ + domMipmap_bias() : _value() {} + /** + * Destructor + */ + virtual ~domMipmap_bias() {} + /** + * Copy Constructor + */ + domMipmap_bias( const domMipmap_bias &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domMipmap_bias &operator=( const domMipmap_bias &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + + +protected: // Elements + domSourceRef elemSource; + domWrap_sRef elemWrap_s; + domWrap_tRef elemWrap_t; + domWrap_pRef elemWrap_p; + domMinfilterRef elemMinfilter; + domMagfilterRef elemMagfilter; + domMipfilterRef elemMipfilter; + domBorder_colorRef elemBorder_color; + domMipmap_maxlevelRef elemMipmap_maxlevel; + domMipmap_biasRef elemMipmap_bias; + domExtra_Array elemExtra_array; + +public: //Accessors and Mutators + /** + * Gets the source element. + * @return a daeSmartRef to the source element. + */ + const domSourceRef getSource() const { return elemSource; } + /** + * Gets the wrap_s element. + * @return a daeSmartRef to the wrap_s element. + */ + const domWrap_sRef getWrap_s() const { return elemWrap_s; } + /** + * Gets the wrap_t element. + * @return a daeSmartRef to the wrap_t element. + */ + const domWrap_tRef getWrap_t() const { return elemWrap_t; } + /** + * Gets the wrap_p element. + * @return a daeSmartRef to the wrap_p element. + */ + const domWrap_pRef getWrap_p() const { return elemWrap_p; } + /** + * Gets the minfilter element. + * @return a daeSmartRef to the minfilter element. + */ + const domMinfilterRef getMinfilter() const { return elemMinfilter; } + /** + * Gets the magfilter element. + * @return a daeSmartRef to the magfilter element. + */ + const domMagfilterRef getMagfilter() const { return elemMagfilter; } + /** + * Gets the mipfilter element. + * @return a daeSmartRef to the mipfilter element. + */ + const domMipfilterRef getMipfilter() const { return elemMipfilter; } + /** + * Gets the border_color element. + * @return a daeSmartRef to the border_color element. + */ + const domBorder_colorRef getBorder_color() const { return elemBorder_color; } + /** + * Gets the mipmap_maxlevel element. + * @return a daeSmartRef to the mipmap_maxlevel element. + */ + const domMipmap_maxlevelRef getMipmap_maxlevel() const { return elemMipmap_maxlevel; } + /** + * Gets the mipmap_bias element. + * @return a daeSmartRef to the mipmap_bias element. + */ + const domMipmap_biasRef getMipmap_bias() const { return elemMipmap_bias; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } +protected: + /** + * Constructor + */ + domFx_sampler3D_common_complexType() : elemSource(), elemWrap_s(), elemWrap_t(), elemWrap_p(), elemMinfilter(), elemMagfilter(), elemMipfilter(), elemBorder_color(), elemMipmap_maxlevel(), elemMipmap_bias(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domFx_sampler3D_common_complexType() {} + /** + * Copy Constructor + */ + domFx_sampler3D_common_complexType( const domFx_sampler3D_common_complexType &cpy ) { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFx_sampler3D_common_complexType &operator=( const domFx_sampler3D_common_complexType &cpy ) { (void)cpy; return *this; } +}; + +/** + * An element of type domFx_sampler3D_common_complexType. + */ +class domFx_sampler3D_common : public daeElement, public domFx_sampler3D_common_complexType +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FX_SAMPLER3D_COMMON; } +protected: + /** + * Constructor + */ + domFx_sampler3D_common() {} + /** + * Destructor + */ + virtual ~domFx_sampler3D_common() {} + /** + * Copy Constructor + */ + domFx_sampler3D_common( const domFx_sampler3D_common &cpy ) : daeElement(), domFx_sampler3D_common_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFx_sampler3D_common &operator=( const domFx_sampler3D_common &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_samplerCUBE_common.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_samplerCUBE_common.h new file mode 100644 index 00000000..71d58c63 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_samplerCUBE_common.h @@ -0,0 +1,844 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domFx_samplerCUBE_common_h__ +#define __domFx_samplerCUBE_common_h__ + +#include +#include + +#include + +/** + * A texture sampler for cube maps. + */ +class domFx_samplerCUBE_common_complexType +{ +public: + class domSource; + + typedef daeSmartRef domSourceRef; + typedef daeTArray domSource_Array; + + class domSource : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::SOURCE; } + + protected: // Value + /** + * The xsNCName value of the text data of this element. + */ + xsNCName _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return Returns a xsNCName of the value. + */ + xsNCName getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( xsNCName val ) { *(daeStringRef*)&_value = val; } + + protected: + /** + * Constructor + */ + domSource() : _value() {} + /** + * Destructor + */ + virtual ~domSource() {} + /** + * Copy Constructor + */ + domSource( const domSource &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domSource &operator=( const domSource &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domWrap_s; + + typedef daeSmartRef domWrap_sRef; + typedef daeTArray domWrap_s_Array; + + class domWrap_s : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::WRAP_S; } + + protected: // Value + /** + * The domFx_sampler_wrap_common value of the text data of this element. + */ + domFx_sampler_wrap_common _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a domFx_sampler_wrap_common of the value. + */ + domFx_sampler_wrap_common getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( domFx_sampler_wrap_common val ) { _value = val; } + + protected: + /** + * Constructor + */ + domWrap_s() : _value() {} + /** + * Destructor + */ + virtual ~domWrap_s() {} + /** + * Copy Constructor + */ + domWrap_s( const domWrap_s &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domWrap_s &operator=( const domWrap_s &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domWrap_t; + + typedef daeSmartRef domWrap_tRef; + typedef daeTArray domWrap_t_Array; + + class domWrap_t : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::WRAP_T; } + + protected: // Value + /** + * The domFx_sampler_wrap_common value of the text data of this element. + */ + domFx_sampler_wrap_common _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a domFx_sampler_wrap_common of the value. + */ + domFx_sampler_wrap_common getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( domFx_sampler_wrap_common val ) { _value = val; } + + protected: + /** + * Constructor + */ + domWrap_t() : _value() {} + /** + * Destructor + */ + virtual ~domWrap_t() {} + /** + * Copy Constructor + */ + domWrap_t( const domWrap_t &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domWrap_t &operator=( const domWrap_t &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domWrap_p; + + typedef daeSmartRef domWrap_pRef; + typedef daeTArray domWrap_p_Array; + + class domWrap_p : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::WRAP_P; } + + protected: // Value + /** + * The domFx_sampler_wrap_common value of the text data of this element. + */ + domFx_sampler_wrap_common _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a domFx_sampler_wrap_common of the value. + */ + domFx_sampler_wrap_common getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( domFx_sampler_wrap_common val ) { _value = val; } + + protected: + /** + * Constructor + */ + domWrap_p() : _value() {} + /** + * Destructor + */ + virtual ~domWrap_p() {} + /** + * Copy Constructor + */ + domWrap_p( const domWrap_p &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domWrap_p &operator=( const domWrap_p &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domMinfilter; + + typedef daeSmartRef domMinfilterRef; + typedef daeTArray domMinfilter_Array; + + class domMinfilter : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::MINFILTER; } + + protected: // Value + /** + * The domFx_sampler_filter_common value of the text data of this element. + */ + domFx_sampler_filter_common _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a domFx_sampler_filter_common of the value. + */ + domFx_sampler_filter_common getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( domFx_sampler_filter_common val ) { _value = val; } + + protected: + /** + * Constructor + */ + domMinfilter() : _value() {} + /** + * Destructor + */ + virtual ~domMinfilter() {} + /** + * Copy Constructor + */ + domMinfilter( const domMinfilter &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domMinfilter &operator=( const domMinfilter &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domMagfilter; + + typedef daeSmartRef domMagfilterRef; + typedef daeTArray domMagfilter_Array; + + class domMagfilter : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::MAGFILTER; } + + protected: // Value + /** + * The domFx_sampler_filter_common value of the text data of this element. + */ + domFx_sampler_filter_common _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a domFx_sampler_filter_common of the value. + */ + domFx_sampler_filter_common getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( domFx_sampler_filter_common val ) { _value = val; } + + protected: + /** + * Constructor + */ + domMagfilter() : _value() {} + /** + * Destructor + */ + virtual ~domMagfilter() {} + /** + * Copy Constructor + */ + domMagfilter( const domMagfilter &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domMagfilter &operator=( const domMagfilter &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domMipfilter; + + typedef daeSmartRef domMipfilterRef; + typedef daeTArray domMipfilter_Array; + + class domMipfilter : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::MIPFILTER; } + + protected: // Value + /** + * The domFx_sampler_filter_common value of the text data of this element. + */ + domFx_sampler_filter_common _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a domFx_sampler_filter_common of the value. + */ + domFx_sampler_filter_common getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( domFx_sampler_filter_common val ) { _value = val; } + + protected: + /** + * Constructor + */ + domMipfilter() : _value() {} + /** + * Destructor + */ + virtual ~domMipfilter() {} + /** + * Copy Constructor + */ + domMipfilter( const domMipfilter &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domMipfilter &operator=( const domMipfilter &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domBorder_color; + + typedef daeSmartRef domBorder_colorRef; + typedef daeTArray domBorder_color_Array; + + class domBorder_color : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::BORDER_COLOR; } + + protected: // Value + /** + * The domFx_color_common value of the text data of this element. + */ + domFx_color_common _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domFx_color_common reference of the _value array. + */ + domFx_color_common &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domFx_color_common reference of the _value array. + */ + const domFx_color_common &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domFx_color_common &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domBorder_color() : _value() {} + /** + * Destructor + */ + virtual ~domBorder_color() {} + /** + * Copy Constructor + */ + domBorder_color( const domBorder_color &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domBorder_color &operator=( const domBorder_color &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domMipmap_maxlevel; + + typedef daeSmartRef domMipmap_maxlevelRef; + typedef daeTArray domMipmap_maxlevel_Array; + + class domMipmap_maxlevel : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::MIPMAP_MAXLEVEL; } + + protected: // Value + /** + * The xsUnsignedByte value of the text data of this element. + */ + xsUnsignedByte _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a xsUnsignedByte of the value. + */ + xsUnsignedByte getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( xsUnsignedByte val ) { _value = val; } + + protected: + /** + * Constructor + */ + domMipmap_maxlevel() : _value() {} + /** + * Destructor + */ + virtual ~domMipmap_maxlevel() {} + /** + * Copy Constructor + */ + domMipmap_maxlevel( const domMipmap_maxlevel &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domMipmap_maxlevel &operator=( const domMipmap_maxlevel &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domMipmap_bias; + + typedef daeSmartRef domMipmap_biasRef; + typedef daeTArray domMipmap_bias_Array; + + class domMipmap_bias : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::MIPMAP_BIAS; } + + protected: // Value + /** + * The xsFloat value of the text data of this element. + */ + xsFloat _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a xsFloat of the value. + */ + xsFloat getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( xsFloat val ) { _value = val; } + + protected: + /** + * Constructor + */ + domMipmap_bias() : _value() {} + /** + * Destructor + */ + virtual ~domMipmap_bias() {} + /** + * Copy Constructor + */ + domMipmap_bias( const domMipmap_bias &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domMipmap_bias &operator=( const domMipmap_bias &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + + +protected: // Elements + domSourceRef elemSource; + domWrap_sRef elemWrap_s; + domWrap_tRef elemWrap_t; + domWrap_pRef elemWrap_p; + domMinfilterRef elemMinfilter; + domMagfilterRef elemMagfilter; + domMipfilterRef elemMipfilter; + domBorder_colorRef elemBorder_color; + domMipmap_maxlevelRef elemMipmap_maxlevel; + domMipmap_biasRef elemMipmap_bias; + domExtra_Array elemExtra_array; + +public: //Accessors and Mutators + /** + * Gets the source element. + * @return a daeSmartRef to the source element. + */ + const domSourceRef getSource() const { return elemSource; } + /** + * Gets the wrap_s element. + * @return a daeSmartRef to the wrap_s element. + */ + const domWrap_sRef getWrap_s() const { return elemWrap_s; } + /** + * Gets the wrap_t element. + * @return a daeSmartRef to the wrap_t element. + */ + const domWrap_tRef getWrap_t() const { return elemWrap_t; } + /** + * Gets the wrap_p element. + * @return a daeSmartRef to the wrap_p element. + */ + const domWrap_pRef getWrap_p() const { return elemWrap_p; } + /** + * Gets the minfilter element. + * @return a daeSmartRef to the minfilter element. + */ + const domMinfilterRef getMinfilter() const { return elemMinfilter; } + /** + * Gets the magfilter element. + * @return a daeSmartRef to the magfilter element. + */ + const domMagfilterRef getMagfilter() const { return elemMagfilter; } + /** + * Gets the mipfilter element. + * @return a daeSmartRef to the mipfilter element. + */ + const domMipfilterRef getMipfilter() const { return elemMipfilter; } + /** + * Gets the border_color element. + * @return a daeSmartRef to the border_color element. + */ + const domBorder_colorRef getBorder_color() const { return elemBorder_color; } + /** + * Gets the mipmap_maxlevel element. + * @return a daeSmartRef to the mipmap_maxlevel element. + */ + const domMipmap_maxlevelRef getMipmap_maxlevel() const { return elemMipmap_maxlevel; } + /** + * Gets the mipmap_bias element. + * @return a daeSmartRef to the mipmap_bias element. + */ + const domMipmap_biasRef getMipmap_bias() const { return elemMipmap_bias; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } +protected: + /** + * Constructor + */ + domFx_samplerCUBE_common_complexType() : elemSource(), elemWrap_s(), elemWrap_t(), elemWrap_p(), elemMinfilter(), elemMagfilter(), elemMipfilter(), elemBorder_color(), elemMipmap_maxlevel(), elemMipmap_bias(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domFx_samplerCUBE_common_complexType() {} + /** + * Copy Constructor + */ + domFx_samplerCUBE_common_complexType( const domFx_samplerCUBE_common_complexType &cpy ) { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFx_samplerCUBE_common_complexType &operator=( const domFx_samplerCUBE_common_complexType &cpy ) { (void)cpy; return *this; } +}; + +/** + * An element of type domFx_samplerCUBE_common_complexType. + */ +class domFx_samplerCUBE_common : public daeElement, public domFx_samplerCUBE_common_complexType +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FX_SAMPLERCUBE_COMMON; } +protected: + /** + * Constructor + */ + domFx_samplerCUBE_common() {} + /** + * Destructor + */ + virtual ~domFx_samplerCUBE_common() {} + /** + * Copy Constructor + */ + domFx_samplerCUBE_common( const domFx_samplerCUBE_common &cpy ) : daeElement(), domFx_samplerCUBE_common_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFx_samplerCUBE_common &operator=( const domFx_samplerCUBE_common &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_samplerDEPTH_common.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_samplerDEPTH_common.h new file mode 100644 index 00000000..cf9ba77a --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_samplerDEPTH_common.h @@ -0,0 +1,474 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domFx_samplerDEPTH_common_h__ +#define __domFx_samplerDEPTH_common_h__ + +#include +#include + +#include + +/** + * A texture sampler for depth maps. + */ +class domFx_samplerDEPTH_common_complexType +{ +public: + class domSource; + + typedef daeSmartRef domSourceRef; + typedef daeTArray domSource_Array; + + class domSource : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::SOURCE; } + + protected: // Value + /** + * The xsNCName value of the text data of this element. + */ + xsNCName _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return Returns a xsNCName of the value. + */ + xsNCName getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( xsNCName val ) { *(daeStringRef*)&_value = val; } + + protected: + /** + * Constructor + */ + domSource() : _value() {} + /** + * Destructor + */ + virtual ~domSource() {} + /** + * Copy Constructor + */ + domSource( const domSource &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domSource &operator=( const domSource &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domWrap_s; + + typedef daeSmartRef domWrap_sRef; + typedef daeTArray domWrap_s_Array; + + class domWrap_s : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::WRAP_S; } + + protected: // Value + /** + * The domFx_sampler_wrap_common value of the text data of this element. + */ + domFx_sampler_wrap_common _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a domFx_sampler_wrap_common of the value. + */ + domFx_sampler_wrap_common getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( domFx_sampler_wrap_common val ) { _value = val; } + + protected: + /** + * Constructor + */ + domWrap_s() : _value() {} + /** + * Destructor + */ + virtual ~domWrap_s() {} + /** + * Copy Constructor + */ + domWrap_s( const domWrap_s &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domWrap_s &operator=( const domWrap_s &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domWrap_t; + + typedef daeSmartRef domWrap_tRef; + typedef daeTArray domWrap_t_Array; + + class domWrap_t : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::WRAP_T; } + + protected: // Value + /** + * The domFx_sampler_wrap_common value of the text data of this element. + */ + domFx_sampler_wrap_common _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a domFx_sampler_wrap_common of the value. + */ + domFx_sampler_wrap_common getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( domFx_sampler_wrap_common val ) { _value = val; } + + protected: + /** + * Constructor + */ + domWrap_t() : _value() {} + /** + * Destructor + */ + virtual ~domWrap_t() {} + /** + * Copy Constructor + */ + domWrap_t( const domWrap_t &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domWrap_t &operator=( const domWrap_t &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domMinfilter; + + typedef daeSmartRef domMinfilterRef; + typedef daeTArray domMinfilter_Array; + + class domMinfilter : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::MINFILTER; } + + protected: // Value + /** + * The domFx_sampler_filter_common value of the text data of this element. + */ + domFx_sampler_filter_common _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a domFx_sampler_filter_common of the value. + */ + domFx_sampler_filter_common getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( domFx_sampler_filter_common val ) { _value = val; } + + protected: + /** + * Constructor + */ + domMinfilter() : _value() {} + /** + * Destructor + */ + virtual ~domMinfilter() {} + /** + * Copy Constructor + */ + domMinfilter( const domMinfilter &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domMinfilter &operator=( const domMinfilter &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domMagfilter; + + typedef daeSmartRef domMagfilterRef; + typedef daeTArray domMagfilter_Array; + + class domMagfilter : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::MAGFILTER; } + + protected: // Value + /** + * The domFx_sampler_filter_common value of the text data of this element. + */ + domFx_sampler_filter_common _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a domFx_sampler_filter_common of the value. + */ + domFx_sampler_filter_common getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( domFx_sampler_filter_common val ) { _value = val; } + + protected: + /** + * Constructor + */ + domMagfilter() : _value() {} + /** + * Destructor + */ + virtual ~domMagfilter() {} + /** + * Copy Constructor + */ + domMagfilter( const domMagfilter &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domMagfilter &operator=( const domMagfilter &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + + +protected: // Elements + domSourceRef elemSource; + domWrap_sRef elemWrap_s; + domWrap_tRef elemWrap_t; + domMinfilterRef elemMinfilter; + domMagfilterRef elemMagfilter; + domExtra_Array elemExtra_array; + +public: //Accessors and Mutators + /** + * Gets the source element. + * @return a daeSmartRef to the source element. + */ + const domSourceRef getSource() const { return elemSource; } + /** + * Gets the wrap_s element. + * @return a daeSmartRef to the wrap_s element. + */ + const domWrap_sRef getWrap_s() const { return elemWrap_s; } + /** + * Gets the wrap_t element. + * @return a daeSmartRef to the wrap_t element. + */ + const domWrap_tRef getWrap_t() const { return elemWrap_t; } + /** + * Gets the minfilter element. + * @return a daeSmartRef to the minfilter element. + */ + const domMinfilterRef getMinfilter() const { return elemMinfilter; } + /** + * Gets the magfilter element. + * @return a daeSmartRef to the magfilter element. + */ + const domMagfilterRef getMagfilter() const { return elemMagfilter; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } +protected: + /** + * Constructor + */ + domFx_samplerDEPTH_common_complexType() : elemSource(), elemWrap_s(), elemWrap_t(), elemMinfilter(), elemMagfilter(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domFx_samplerDEPTH_common_complexType() {} + /** + * Copy Constructor + */ + domFx_samplerDEPTH_common_complexType( const domFx_samplerDEPTH_common_complexType &cpy ) { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFx_samplerDEPTH_common_complexType &operator=( const domFx_samplerDEPTH_common_complexType &cpy ) { (void)cpy; return *this; } +}; + +/** + * An element of type domFx_samplerDEPTH_common_complexType. + */ +class domFx_samplerDEPTH_common : public daeElement, public domFx_samplerDEPTH_common_complexType +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FX_SAMPLERDEPTH_COMMON; } +protected: + /** + * Constructor + */ + domFx_samplerDEPTH_common() {} + /** + * Destructor + */ + virtual ~domFx_samplerDEPTH_common() {} + /** + * Copy Constructor + */ + domFx_samplerDEPTH_common( const domFx_samplerDEPTH_common &cpy ) : daeElement(), domFx_samplerDEPTH_common_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFx_samplerDEPTH_common &operator=( const domFx_samplerDEPTH_common &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_samplerRECT_common.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_samplerRECT_common.h new file mode 100644 index 00000000..dfa2cd9f --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_samplerRECT_common.h @@ -0,0 +1,771 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domFx_samplerRECT_common_h__ +#define __domFx_samplerRECT_common_h__ + +#include +#include + +#include + +/** + * A two-dimensional texture sampler. + */ +class domFx_samplerRECT_common_complexType +{ +public: + class domSource; + + typedef daeSmartRef domSourceRef; + typedef daeTArray domSource_Array; + + class domSource : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::SOURCE; } + + protected: // Value + /** + * The xsNCName value of the text data of this element. + */ + xsNCName _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return Returns a xsNCName of the value. + */ + xsNCName getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( xsNCName val ) { *(daeStringRef*)&_value = val; } + + protected: + /** + * Constructor + */ + domSource() : _value() {} + /** + * Destructor + */ + virtual ~domSource() {} + /** + * Copy Constructor + */ + domSource( const domSource &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domSource &operator=( const domSource &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domWrap_s; + + typedef daeSmartRef domWrap_sRef; + typedef daeTArray domWrap_s_Array; + + class domWrap_s : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::WRAP_S; } + + protected: // Value + /** + * The domFx_sampler_wrap_common value of the text data of this element. + */ + domFx_sampler_wrap_common _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a domFx_sampler_wrap_common of the value. + */ + domFx_sampler_wrap_common getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( domFx_sampler_wrap_common val ) { _value = val; } + + protected: + /** + * Constructor + */ + domWrap_s() : _value() {} + /** + * Destructor + */ + virtual ~domWrap_s() {} + /** + * Copy Constructor + */ + domWrap_s( const domWrap_s &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domWrap_s &operator=( const domWrap_s &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domWrap_t; + + typedef daeSmartRef domWrap_tRef; + typedef daeTArray domWrap_t_Array; + + class domWrap_t : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::WRAP_T; } + + protected: // Value + /** + * The domFx_sampler_wrap_common value of the text data of this element. + */ + domFx_sampler_wrap_common _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a domFx_sampler_wrap_common of the value. + */ + domFx_sampler_wrap_common getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( domFx_sampler_wrap_common val ) { _value = val; } + + protected: + /** + * Constructor + */ + domWrap_t() : _value() {} + /** + * Destructor + */ + virtual ~domWrap_t() {} + /** + * Copy Constructor + */ + domWrap_t( const domWrap_t &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domWrap_t &operator=( const domWrap_t &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domMinfilter; + + typedef daeSmartRef domMinfilterRef; + typedef daeTArray domMinfilter_Array; + + class domMinfilter : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::MINFILTER; } + + protected: // Value + /** + * The domFx_sampler_filter_common value of the text data of this element. + */ + domFx_sampler_filter_common _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a domFx_sampler_filter_common of the value. + */ + domFx_sampler_filter_common getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( domFx_sampler_filter_common val ) { _value = val; } + + protected: + /** + * Constructor + */ + domMinfilter() : _value() {} + /** + * Destructor + */ + virtual ~domMinfilter() {} + /** + * Copy Constructor + */ + domMinfilter( const domMinfilter &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domMinfilter &operator=( const domMinfilter &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domMagfilter; + + typedef daeSmartRef domMagfilterRef; + typedef daeTArray domMagfilter_Array; + + class domMagfilter : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::MAGFILTER; } + + protected: // Value + /** + * The domFx_sampler_filter_common value of the text data of this element. + */ + domFx_sampler_filter_common _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a domFx_sampler_filter_common of the value. + */ + domFx_sampler_filter_common getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( domFx_sampler_filter_common val ) { _value = val; } + + protected: + /** + * Constructor + */ + domMagfilter() : _value() {} + /** + * Destructor + */ + virtual ~domMagfilter() {} + /** + * Copy Constructor + */ + domMagfilter( const domMagfilter &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domMagfilter &operator=( const domMagfilter &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domMipfilter; + + typedef daeSmartRef domMipfilterRef; + typedef daeTArray domMipfilter_Array; + + class domMipfilter : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::MIPFILTER; } + + protected: // Value + /** + * The domFx_sampler_filter_common value of the text data of this element. + */ + domFx_sampler_filter_common _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a domFx_sampler_filter_common of the value. + */ + domFx_sampler_filter_common getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( domFx_sampler_filter_common val ) { _value = val; } + + protected: + /** + * Constructor + */ + domMipfilter() : _value() {} + /** + * Destructor + */ + virtual ~domMipfilter() {} + /** + * Copy Constructor + */ + domMipfilter( const domMipfilter &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domMipfilter &operator=( const domMipfilter &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domBorder_color; + + typedef daeSmartRef domBorder_colorRef; + typedef daeTArray domBorder_color_Array; + + class domBorder_color : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::BORDER_COLOR; } + + protected: // Value + /** + * The domFx_color_common value of the text data of this element. + */ + domFx_color_common _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domFx_color_common reference of the _value array. + */ + domFx_color_common &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domFx_color_common reference of the _value array. + */ + const domFx_color_common &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domFx_color_common &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domBorder_color() : _value() {} + /** + * Destructor + */ + virtual ~domBorder_color() {} + /** + * Copy Constructor + */ + domBorder_color( const domBorder_color &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domBorder_color &operator=( const domBorder_color &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domMipmap_maxlevel; + + typedef daeSmartRef domMipmap_maxlevelRef; + typedef daeTArray domMipmap_maxlevel_Array; + + class domMipmap_maxlevel : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::MIPMAP_MAXLEVEL; } + + protected: // Value + /** + * The xsUnsignedByte value of the text data of this element. + */ + xsUnsignedByte _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a xsUnsignedByte of the value. + */ + xsUnsignedByte getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( xsUnsignedByte val ) { _value = val; } + + protected: + /** + * Constructor + */ + domMipmap_maxlevel() : _value() {} + /** + * Destructor + */ + virtual ~domMipmap_maxlevel() {} + /** + * Copy Constructor + */ + domMipmap_maxlevel( const domMipmap_maxlevel &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domMipmap_maxlevel &operator=( const domMipmap_maxlevel &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domMipmap_bias; + + typedef daeSmartRef domMipmap_biasRef; + typedef daeTArray domMipmap_bias_Array; + + class domMipmap_bias : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::MIPMAP_BIAS; } + + protected: // Value + /** + * The xsFloat value of the text data of this element. + */ + xsFloat _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a xsFloat of the value. + */ + xsFloat getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( xsFloat val ) { _value = val; } + + protected: + /** + * Constructor + */ + domMipmap_bias() : _value() {} + /** + * Destructor + */ + virtual ~domMipmap_bias() {} + /** + * Copy Constructor + */ + domMipmap_bias( const domMipmap_bias &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domMipmap_bias &operator=( const domMipmap_bias &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + + +protected: // Elements + domSourceRef elemSource; + domWrap_sRef elemWrap_s; + domWrap_tRef elemWrap_t; + domMinfilterRef elemMinfilter; + domMagfilterRef elemMagfilter; + domMipfilterRef elemMipfilter; + domBorder_colorRef elemBorder_color; + domMipmap_maxlevelRef elemMipmap_maxlevel; + domMipmap_biasRef elemMipmap_bias; + domExtra_Array elemExtra_array; + +public: //Accessors and Mutators + /** + * Gets the source element. + * @return a daeSmartRef to the source element. + */ + const domSourceRef getSource() const { return elemSource; } + /** + * Gets the wrap_s element. + * @return a daeSmartRef to the wrap_s element. + */ + const domWrap_sRef getWrap_s() const { return elemWrap_s; } + /** + * Gets the wrap_t element. + * @return a daeSmartRef to the wrap_t element. + */ + const domWrap_tRef getWrap_t() const { return elemWrap_t; } + /** + * Gets the minfilter element. + * @return a daeSmartRef to the minfilter element. + */ + const domMinfilterRef getMinfilter() const { return elemMinfilter; } + /** + * Gets the magfilter element. + * @return a daeSmartRef to the magfilter element. + */ + const domMagfilterRef getMagfilter() const { return elemMagfilter; } + /** + * Gets the mipfilter element. + * @return a daeSmartRef to the mipfilter element. + */ + const domMipfilterRef getMipfilter() const { return elemMipfilter; } + /** + * Gets the border_color element. + * @return a daeSmartRef to the border_color element. + */ + const domBorder_colorRef getBorder_color() const { return elemBorder_color; } + /** + * Gets the mipmap_maxlevel element. + * @return a daeSmartRef to the mipmap_maxlevel element. + */ + const domMipmap_maxlevelRef getMipmap_maxlevel() const { return elemMipmap_maxlevel; } + /** + * Gets the mipmap_bias element. + * @return a daeSmartRef to the mipmap_bias element. + */ + const domMipmap_biasRef getMipmap_bias() const { return elemMipmap_bias; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } +protected: + /** + * Constructor + */ + domFx_samplerRECT_common_complexType() : elemSource(), elemWrap_s(), elemWrap_t(), elemMinfilter(), elemMagfilter(), elemMipfilter(), elemBorder_color(), elemMipmap_maxlevel(), elemMipmap_bias(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domFx_samplerRECT_common_complexType() {} + /** + * Copy Constructor + */ + domFx_samplerRECT_common_complexType( const domFx_samplerRECT_common_complexType &cpy ) { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFx_samplerRECT_common_complexType &operator=( const domFx_samplerRECT_common_complexType &cpy ) { (void)cpy; return *this; } +}; + +/** + * An element of type domFx_samplerRECT_common_complexType. + */ +class domFx_samplerRECT_common : public daeElement, public domFx_samplerRECT_common_complexType +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FX_SAMPLERRECT_COMMON; } +protected: + /** + * Constructor + */ + domFx_samplerRECT_common() {} + /** + * Destructor + */ + virtual ~domFx_samplerRECT_common() {} + /** + * Copy Constructor + */ + domFx_samplerRECT_common( const domFx_samplerRECT_common &cpy ) : daeElement(), domFx_samplerRECT_common_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFx_samplerRECT_common &operator=( const domFx_samplerRECT_common &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_setparam_common.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_setparam_common.h new file mode 100644 index 00000000..41ff2415 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_setparam_common.h @@ -0,0 +1,122 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domFx_setparam_common_h__ +#define __domFx_setparam_common_h__ + +#include +#include + +#include +#include + +class domFx_setparam_common_complexType +{ +protected: // Attribute + xsNCName attrRef; + +protected: // Elements + domFx_annotate_common_Array elemAnnotate_array; + domFx_basic_type_commonRef elemFx_basic_type_common; + +public: //Accessors and Mutators + /** + * Gets the ref attribute. + * @return Returns a xsNCName of the ref attribute. + */ + xsNCName getRef() const { return attrRef; } + /** + * Sets the ref attribute. + * @param atRef The new value for the ref attribute. + */ + void setRef( xsNCName atRef ) { attrRef = atRef; } + + /** + * Gets the annotate element array. + * @return Returns a reference to the array of annotate elements. + */ + domFx_annotate_common_Array &getAnnotate_array() { return elemAnnotate_array; } + /** + * Gets the annotate element array. + * @return Returns a constant reference to the array of annotate elements. + */ + const domFx_annotate_common_Array &getAnnotate_array() const { return elemAnnotate_array; } + /** + * Gets the fx_basic_type_common element. + * @return a daeSmartRef to the fx_basic_type_common element. + */ + const domFx_basic_type_commonRef getFx_basic_type_common() const { return elemFx_basic_type_common; } +protected: + /** + * Constructor + */ + domFx_setparam_common_complexType() : attrRef(), elemAnnotate_array(), elemFx_basic_type_common() {} + /** + * Destructor + */ + virtual ~domFx_setparam_common_complexType() {} + /** + * Copy Constructor + */ + domFx_setparam_common_complexType( const domFx_setparam_common_complexType &cpy ) { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFx_setparam_common_complexType &operator=( const domFx_setparam_common_complexType &cpy ) { (void)cpy; return *this; } +}; + +/** + * An element of type domFx_setparam_common_complexType. + */ +class domFx_setparam_common : public daeElement, public domFx_setparam_common_complexType +{ +protected: + /** + * Constructor + */ + domFx_setparam_common() {} + /** + * Destructor + */ + virtual ~domFx_setparam_common() {} + /** + * Copy Constructor + */ + domFx_setparam_common( const domFx_setparam_common &cpy ) : daeElement(), domFx_setparam_common_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFx_setparam_common &operator=( const domFx_setparam_common &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_stenciltarget_common.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_stenciltarget_common.h new file mode 100644 index 00000000..e56c0297 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_stenciltarget_common.h @@ -0,0 +1,206 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domFx_stenciltarget_common_h__ +#define __domFx_stenciltarget_common_h__ + +#include +#include + + +class domFx_stenciltarget_common_complexType +{ +protected: // Attributes + xsNonNegativeInteger attrIndex; + domFx_surface_face_enum attrFace; + xsNonNegativeInteger attrMip; + xsNonNegativeInteger attrSlice; + +protected: // Value + /** + * The xsNCName value of the text data of this element. + */ + xsNCName _value; + +public: //Accessors and Mutators + /** + * Gets the index attribute. + * @return Returns a xsNonNegativeInteger of the index attribute. + */ + xsNonNegativeInteger getIndex() const { return attrIndex; } + /** + * Sets the index attribute. + * @param atIndex The new value for the index attribute. + */ + void setIndex( xsNonNegativeInteger atIndex ) { attrIndex = atIndex; } + + /** + * Gets the face attribute. + * @return Returns a domFx_surface_face_enum of the face attribute. + */ + domFx_surface_face_enum getFace() const { return attrFace; } + /** + * Sets the face attribute. + * @param atFace The new value for the face attribute. + */ + void setFace( domFx_surface_face_enum atFace ) { attrFace = atFace; } + + /** + * Gets the mip attribute. + * @return Returns a xsNonNegativeInteger of the mip attribute. + */ + xsNonNegativeInteger getMip() const { return attrMip; } + /** + * Sets the mip attribute. + * @param atMip The new value for the mip attribute. + */ + void setMip( xsNonNegativeInteger atMip ) { attrMip = atMip; } + + /** + * Gets the slice attribute. + * @return Returns a xsNonNegativeInteger of the slice attribute. + */ + xsNonNegativeInteger getSlice() const { return attrSlice; } + /** + * Sets the slice attribute. + * @param atSlice The new value for the slice attribute. + */ + void setSlice( xsNonNegativeInteger atSlice ) { attrSlice = atSlice; } + + /** + * Gets the value of this element. + * @return Returns a xsNCName of the value. + */ + xsNCName getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( xsNCName val ) { *(daeStringRef*)&_value = val; } + +protected: + /** + * Constructor + */ + domFx_stenciltarget_common_complexType() : attrIndex(), attrFace(), attrMip(), attrSlice(), _value() {} + /** + * Destructor + */ + virtual ~domFx_stenciltarget_common_complexType() {} + /** + * Copy Constructor + */ + domFx_stenciltarget_common_complexType( const domFx_stenciltarget_common_complexType &cpy ) { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFx_stenciltarget_common_complexType &operator=( const domFx_stenciltarget_common_complexType &cpy ) { (void)cpy; return *this; } +}; + +/** + * An element of type domFx_stenciltarget_common_complexType. + */ +class domFx_stenciltarget_common : public daeElement, public domFx_stenciltarget_common_complexType +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FX_STENCILTARGET_COMMON; } + +public: //Accessors and Mutators + /** + * Gets the index attribute. + * @return Returns a xsNonNegativeInteger of the index attribute. + */ + xsNonNegativeInteger getIndex() const { return attrIndex; } + /** + * Sets the index attribute. + * @param atIndex The new value for the index attribute. + */ + void setIndex( xsNonNegativeInteger atIndex ) { attrIndex = atIndex; + _validAttributeArray[0] = true; } + + /** + * Gets the face attribute. + * @return Returns a domFx_surface_face_enum of the face attribute. + */ + domFx_surface_face_enum getFace() const { return attrFace; } + /** + * Sets the face attribute. + * @param atFace The new value for the face attribute. + */ + void setFace( domFx_surface_face_enum atFace ) { attrFace = atFace; + _validAttributeArray[1] = true; } + + /** + * Gets the mip attribute. + * @return Returns a xsNonNegativeInteger of the mip attribute. + */ + xsNonNegativeInteger getMip() const { return attrMip; } + /** + * Sets the mip attribute. + * @param atMip The new value for the mip attribute. + */ + void setMip( xsNonNegativeInteger atMip ) { attrMip = atMip; + _validAttributeArray[2] = true; } + + /** + * Gets the slice attribute. + * @return Returns a xsNonNegativeInteger of the slice attribute. + */ + xsNonNegativeInteger getSlice() const { return attrSlice; } + /** + * Sets the slice attribute. + * @param atSlice The new value for the slice attribute. + */ + void setSlice( xsNonNegativeInteger atSlice ) { attrSlice = atSlice; + _validAttributeArray[3] = true; } + +protected: + /** + * Constructor + */ + domFx_stenciltarget_common() {} + /** + * Destructor + */ + virtual ~domFx_stenciltarget_common() {} + /** + * Copy Constructor + */ + domFx_stenciltarget_common( const domFx_stenciltarget_common &cpy ) : daeElement(), domFx_stenciltarget_common_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFx_stenciltarget_common &operator=( const domFx_stenciltarget_common &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_surface_common.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_surface_common.h new file mode 100644 index 00000000..6f0f6e3a --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_surface_common.h @@ -0,0 +1,638 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domFx_surface_common_h__ +#define __domFx_surface_common_h__ + +#include +#include + +#include +#include +#include + +/** + * The fx_surface_common type is used to declare a resource that can be used + * both as the source for texture samples and as the target of a rendering + * pass. + */ +class domFx_surface_common_complexType +{ +public: + class domFormat; + + typedef daeSmartRef domFormatRef; + typedef daeTArray domFormat_Array; + +/** + * Contains a string representing the profile and platform specific texel + * format that the author would like this surface to use. If this element + * is not specified then the application will use a common format R8G8B8A8 + * with linear color gradient, not sRGB. + */ + class domFormat : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FORMAT; } + + protected: // Value + /** + * The xsToken value of the text data of this element. + */ + xsToken _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return Returns a xsToken of the value. + */ + xsToken getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( xsToken val ) { *(daeStringRef*)&_value = val; } + + protected: + /** + * Constructor + */ + domFormat() : _value() {} + /** + * Destructor + */ + virtual ~domFormat() {} + /** + * Copy Constructor + */ + domFormat( const domFormat &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFormat &operator=( const domFormat &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domSize; + + typedef daeSmartRef domSizeRef; + typedef daeTArray domSize_Array; + +/** + * The surface should be sized to these exact dimensions + */ + class domSize : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::SIZE; } + + protected: // Value + /** + * The domInt3 value of the text data of this element. + */ + domInt3 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domInt3 reference of the _value array. + */ + domInt3 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domInt3 reference of the _value array. + */ + const domInt3 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domInt3 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domSize() : _value() {} + /** + * Destructor + */ + virtual ~domSize() {} + /** + * Copy Constructor + */ + domSize( const domSize &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domSize &operator=( const domSize &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domViewport_ratio; + + typedef daeSmartRef domViewport_ratioRef; + typedef daeTArray domViewport_ratio_Array; + +/** + * The surface should be sized to a dimension based on this ratio of the viewport's + * dimensions in pixels + */ + class domViewport_ratio : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::VIEWPORT_RATIO; } + + protected: // Value + /** + * The domFloat2 value of the text data of this element. + */ + domFloat2 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domFloat2 reference of the _value array. + */ + domFloat2 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domFloat2 reference of the _value array. + */ + const domFloat2 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domFloat2 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domViewport_ratio() : _value() {} + /** + * Destructor + */ + virtual ~domViewport_ratio() {} + /** + * Copy Constructor + */ + domViewport_ratio( const domViewport_ratio &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domViewport_ratio &operator=( const domViewport_ratio &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domMip_levels; + + typedef daeSmartRef domMip_levelsRef; + typedef daeTArray domMip_levels_Array; + +/** + * the surface should contain the following number of MIP levels. If this + * element is not present it is assumed that all miplevels exist until a dimension + * becomes 1 texel. To create a surface that has only one level of mip maps + * (mip=0) set this to 1. If the value is 0 the result is the same as if + * mip_levels was unspecified, all possible mip_levels will exist. + */ + class domMip_levels : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::MIP_LEVELS; } + + protected: // Value + /** + * The xsUnsignedInt value of the text data of this element. + */ + xsUnsignedInt _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a xsUnsignedInt of the value. + */ + xsUnsignedInt getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( xsUnsignedInt val ) { _value = val; } + + protected: + /** + * Constructor + */ + domMip_levels() : _value() {} + /** + * Destructor + */ + virtual ~domMip_levels() {} + /** + * Copy Constructor + */ + domMip_levels( const domMip_levels &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domMip_levels &operator=( const domMip_levels &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domMipmap_generate; + + typedef daeSmartRef domMipmap_generateRef; + typedef daeTArray domMipmap_generate_Array; + +/** + * By default it is assumed that mipmaps are supplied by the author so, if + * not all subsurfaces are initialized, it is invalid and will result in profile + * and platform specific behavior unless mipmap_generate is responsible for + * initializing the remainder of the sub-surfaces + */ + class domMipmap_generate : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::MIPMAP_GENERATE; } + + protected: // Value + /** + * The xsBoolean value of the text data of this element. + */ + xsBoolean _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a xsBoolean of the value. + */ + xsBoolean getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( xsBoolean val ) { _value = val; } + + protected: + /** + * Constructor + */ + domMipmap_generate() : _value() {} + /** + * Destructor + */ + virtual ~domMipmap_generate() {} + /** + * Copy Constructor + */ + domMipmap_generate( const domMipmap_generate &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domMipmap_generate &operator=( const domMipmap_generate &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + +protected: // Attribute +/** + * Specifying the type of a surface is mandatory though the type may be "UNTYPED". + * When a surface is typed as UNTYPED, it is said to be temporarily untyped + * and instead will be typed later by the context it is used in such as which + * samplers reference it in that are used in a particular technique or pass. + * If there is a type mismatch between what is set into it later and what + * the runtime decides the type should be the result in profile and platform + * specific behavior. + */ + domFx_surface_type_enum attrType; + +protected: // Elements +/** + * The common set of initalization options for surfaces. Choose which is + * appropriate for your surface based on the type attribute and other characteristics + * described by the annotation docs on the choiced child elements of this + * type. @see domFx_surface_init_common + */ + domFx_surface_init_commonRef elemFx_surface_init_common; +/** + * Contains a string representing the profile and platform specific texel + * format that the author would like this surface to use. If this element + * is not specified then the application will use a common format R8G8B8A8 + * with linear color gradient, not sRGB. @see domFormat + */ + domFormatRef elemFormat; +/** + * If the exact format cannot be resolved via the "format" element then the + * format_hint will describe the important features of the format so that + * the application may select a compatable or close format @see domFormat_hint + */ + domFx_surface_format_hint_commonRef elemFormat_hint; +/** + * The surface should be sized to these exact dimensions @see domSize + */ + domSizeRef elemSize; +/** + * The surface should be sized to a dimension based on this ratio of the viewport's + * dimensions in pixels @see domViewport_ratio + */ + domViewport_ratioRef elemViewport_ratio; +/** + * the surface should contain the following number of MIP levels. If this + * element is not present it is assumed that all miplevels exist until a dimension + * becomes 1 texel. To create a surface that has only one level of mip maps + * (mip=0) set this to 1. If the value is 0 the result is the same as if + * mip_levels was unspecified, all possible mip_levels will exist. @see domMip_levels + */ + domMip_levelsRef elemMip_levels; +/** + * By default it is assumed that mipmaps are supplied by the author so, if + * not all subsurfaces are initialized, it is invalid and will result in profile + * and platform specific behavior unless mipmap_generate is responsible for + * initializing the remainder of the sub-surfaces @see domMipmap_generate + */ + domMipmap_generateRef elemMipmap_generate; + domExtra_Array elemExtra_array; + /** + * Used to preserve order in elements that do not specify strict sequencing of sub-elements. + */ + daeElementRefArray _contents; + /** + * Used to preserve order in elements that have a complex content model. + */ + daeUIntArray _contentsOrder; + + +public: //Accessors and Mutators + /** + * Gets the type attribute. + * @return Returns a domFx_surface_type_enum of the type attribute. + */ + domFx_surface_type_enum getType() const { return attrType; } + /** + * Sets the type attribute. + * @param atType The new value for the type attribute. + */ + void setType( domFx_surface_type_enum atType ) { attrType = atType; } + + /** + * Gets the fx_surface_init_common element. + * @return a daeSmartRef to the fx_surface_init_common element. + */ + const domFx_surface_init_commonRef getFx_surface_init_common() const { return elemFx_surface_init_common; } + /** + * Gets the format element. + * @return a daeSmartRef to the format element. + */ + const domFormatRef getFormat() const { return elemFormat; } + /** + * Gets the format_hint element. + * @return a daeSmartRef to the format_hint element. + */ + const domFx_surface_format_hint_commonRef getFormat_hint() const { return elemFormat_hint; } + /** + * Gets the size element. + * @return a daeSmartRef to the size element. + */ + const domSizeRef getSize() const { return elemSize; } + /** + * Gets the viewport_ratio element. + * @return a daeSmartRef to the viewport_ratio element. + */ + const domViewport_ratioRef getViewport_ratio() const { return elemViewport_ratio; } + /** + * Gets the mip_levels element. + * @return a daeSmartRef to the mip_levels element. + */ + const domMip_levelsRef getMip_levels() const { return elemMip_levels; } + /** + * Gets the mipmap_generate element. + * @return a daeSmartRef to the mipmap_generate element. + */ + const domMipmap_generateRef getMipmap_generate() const { return elemMipmap_generate; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } + /** + * Gets the _contents array. + * @return Returns a reference to the _contents element array. + */ + daeElementRefArray &getContents() { return _contents; } + /** + * Gets the _contents array. + * @return Returns a constant reference to the _contents element array. + */ + const daeElementRefArray &getContents() const { return _contents; } + +protected: + /** + * Constructor + */ + domFx_surface_common_complexType() : attrType(), elemFx_surface_init_common(), elemFormat(), elemFormat_hint(), elemSize(), elemViewport_ratio(), elemMip_levels(), elemMipmap_generate(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domFx_surface_common_complexType() {} + /** + * Copy Constructor + */ + domFx_surface_common_complexType( const domFx_surface_common_complexType &cpy ) { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFx_surface_common_complexType &operator=( const domFx_surface_common_complexType &cpy ) { (void)cpy; return *this; } + +public: //Backwards Compatibility + typedef domFx_surface_init_from_common domInit_from; + typedef domFx_surface_init_from_commonRef domInit_fromRef; + typedef domFx_surface_init_from_common_Array domInit_from_Array; + + /** + * Gets the init_from element array. + * @return Returns a reference to the array of init_from elements. + */ + DLLSPEC domInit_from_Array &getInit_from_array(); + /** + * Gets the init_from element array. + * @return Returns a constant reference to the array of init_from elements. + */ + DLLSPEC const domInit_from_Array &getInit_from_array() const; + +private: + domInit_from_Array emptyArray; +}; + +/** + * An element of type domFx_surface_common_complexType. + */ +class domFx_surface_common : public daeElement, public domFx_surface_common_complexType +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FX_SURFACE_COMMON; } + +public: //Accessors and Mutators + /** + * Gets the type attribute. + * @return Returns a domFx_surface_type_enum of the type attribute. + */ + domFx_surface_type_enum getType() const { return attrType; } + /** + * Sets the type attribute. + * @param atType The new value for the type attribute. + */ + void setType( domFx_surface_type_enum atType ) { attrType = atType; + _validAttributeArray[0] = true; } + +protected: + /** + * Constructor + */ + domFx_surface_common() {} + /** + * Destructor + */ + virtual ~domFx_surface_common() {} + /** + * Copy Constructor + */ + domFx_surface_common( const domFx_surface_common &cpy ) : daeElement(), domFx_surface_common_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFx_surface_common &operator=( const domFx_surface_common &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_surface_format_hint_common.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_surface_format_hint_common.h new file mode 100644 index 00000000..e41189b7 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_surface_format_hint_common.h @@ -0,0 +1,448 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domFx_surface_format_hint_common_h__ +#define __domFx_surface_format_hint_common_h__ + +#include +#include + +#include + +/** + * If the exact format cannot be resolve via other methods then the format_hint + * will describe the important features of the format so that the application + * may select a compatable or close format + */ +class domFx_surface_format_hint_common_complexType +{ +public: + class domChannels; + + typedef daeSmartRef domChannelsRef; + typedef daeTArray domChannels_Array; + +/** + * The per-texel layout of the format. The length of the string indicate + * how many channels there are and the letter respresents the name of the + * channel. There are typically 0 to 4 channels. + */ + class domChannels : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::CHANNELS; } + + protected: // Value + /** + * The domFx_surface_format_hint_channels_enum value of the text data of this element. + */ + domFx_surface_format_hint_channels_enum _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a domFx_surface_format_hint_channels_enum of the value. + */ + domFx_surface_format_hint_channels_enum getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( domFx_surface_format_hint_channels_enum val ) { _value = val; } + + protected: + /** + * Constructor + */ + domChannels() : _value() {} + /** + * Destructor + */ + virtual ~domChannels() {} + /** + * Copy Constructor + */ + domChannels( const domChannels &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domChannels &operator=( const domChannels &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domRange; + + typedef daeSmartRef domRangeRef; + typedef daeTArray domRange_Array; + +/** + * Each channel represents a range of values. Some example ranges are signed + * or unsigned integers, or between between a clamped range such as 0.0f to + * 1.0f, or high dynamic range via floating point + */ + class domRange : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::RANGE; } + + protected: // Value + /** + * The domFx_surface_format_hint_range_enum value of the text data of this element. + */ + domFx_surface_format_hint_range_enum _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a domFx_surface_format_hint_range_enum of the value. + */ + domFx_surface_format_hint_range_enum getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( domFx_surface_format_hint_range_enum val ) { _value = val; } + + protected: + /** + * Constructor + */ + domRange() : _value() {} + /** + * Destructor + */ + virtual ~domRange() {} + /** + * Copy Constructor + */ + domRange( const domRange &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domRange &operator=( const domRange &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domPrecision; + + typedef daeSmartRef domPrecisionRef; + typedef daeTArray domPrecision_Array; + +/** + * Each channel of the texel has a precision. Typically these are all linked + * together. An exact format lay lower the precision of an individual channel + * but applying a higher precision by linking the channels together may still + * convey the same information. + */ + class domPrecision : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::PRECISION; } + + protected: // Value + /** + * The domFx_surface_format_hint_precision_enum value of the text data of this element. + */ + domFx_surface_format_hint_precision_enum _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a domFx_surface_format_hint_precision_enum of the value. + */ + domFx_surface_format_hint_precision_enum getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( domFx_surface_format_hint_precision_enum val ) { _value = val; } + + protected: + /** + * Constructor + */ + domPrecision() : _value() {} + /** + * Destructor + */ + virtual ~domPrecision() {} + /** + * Copy Constructor + */ + domPrecision( const domPrecision &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domPrecision &operator=( const domPrecision &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domOption; + + typedef daeSmartRef domOptionRef; + typedef daeTArray domOption_Array; + +/** + * Additional hints about data relationships and other things to help the + * application pick the best format. + */ + class domOption : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::OPTION; } + + protected: // Value + /** + * The domFx_surface_format_hint_option_enum value of the text data of this element. + */ + domFx_surface_format_hint_option_enum _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a domFx_surface_format_hint_option_enum of the value. + */ + domFx_surface_format_hint_option_enum getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( domFx_surface_format_hint_option_enum val ) { _value = val; } + + protected: + /** + * Constructor + */ + domOption() : _value() {} + /** + * Destructor + */ + virtual ~domOption() {} + /** + * Copy Constructor + */ + domOption( const domOption &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domOption &operator=( const domOption &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + + +protected: // Elements +/** + * The per-texel layout of the format. The length of the string indicate + * how many channels there are and the letter respresents the name of the + * channel. There are typically 0 to 4 channels. @see domChannels + */ + domChannelsRef elemChannels; +/** + * Each channel represents a range of values. Some example ranges are signed + * or unsigned integers, or between between a clamped range such as 0.0f to + * 1.0f, or high dynamic range via floating point @see domRange + */ + domRangeRef elemRange; +/** + * Each channel of the texel has a precision. Typically these are all linked + * together. An exact format lay lower the precision of an individual channel + * but applying a higher precision by linking the channels together may still + * convey the same information. @see domPrecision + */ + domPrecisionRef elemPrecision; +/** + * Additional hints about data relationships and other things to help the + * application pick the best format. @see domOption + */ + domOption_Array elemOption_array; + domExtra_Array elemExtra_array; + +public: //Accessors and Mutators + /** + * Gets the channels element. + * @return a daeSmartRef to the channels element. + */ + const domChannelsRef getChannels() const { return elemChannels; } + /** + * Gets the range element. + * @return a daeSmartRef to the range element. + */ + const domRangeRef getRange() const { return elemRange; } + /** + * Gets the precision element. + * @return a daeSmartRef to the precision element. + */ + const domPrecisionRef getPrecision() const { return elemPrecision; } + /** + * Gets the option element array. + * @return Returns a reference to the array of option elements. + */ + domOption_Array &getOption_array() { return elemOption_array; } + /** + * Gets the option element array. + * @return Returns a constant reference to the array of option elements. + */ + const domOption_Array &getOption_array() const { return elemOption_array; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } +protected: + /** + * Constructor + */ + domFx_surface_format_hint_common_complexType() : elemChannels(), elemRange(), elemPrecision(), elemOption_array(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domFx_surface_format_hint_common_complexType() {} + /** + * Copy Constructor + */ + domFx_surface_format_hint_common_complexType( const domFx_surface_format_hint_common_complexType &cpy ) { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFx_surface_format_hint_common_complexType &operator=( const domFx_surface_format_hint_common_complexType &cpy ) { (void)cpy; return *this; } +}; + +/** + * An element of type domFx_surface_format_hint_common_complexType. + */ +class domFx_surface_format_hint_common : public daeElement, public domFx_surface_format_hint_common_complexType +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FX_SURFACE_FORMAT_HINT_COMMON; } +protected: + /** + * Constructor + */ + domFx_surface_format_hint_common() {} + /** + * Destructor + */ + virtual ~domFx_surface_format_hint_common() {} + /** + * Copy Constructor + */ + domFx_surface_format_hint_common( const domFx_surface_format_hint_common &cpy ) : daeElement(), domFx_surface_format_hint_common_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFx_surface_format_hint_common &operator=( const domFx_surface_format_hint_common &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_surface_init_common.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_surface_init_common.h new file mode 100644 index 00000000..17027553 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_surface_init_common.h @@ -0,0 +1,278 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domFx_surface_init_common_h__ +#define __domFx_surface_init_common_h__ + +#include +#include + +#include +#include +#include +#include + +/** + * The common set of initalization options for surfaces. Choose which is + * appropriate for your surface based on type and other characteristics. described + * by the annotation docs on the child elements. + */ +class domFx_surface_init_common : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FX_SURFACE_INIT_COMMON; } +public: + class domInit_as_null; + + typedef daeSmartRef domInit_as_nullRef; + typedef daeTArray domInit_as_null_Array; + +/** + * This surface is intended to be initialized later externally by a "setparam" + * element. If it is used before being initialized there is profile and platform + * specific behavior. Most elements on the surface element containing this + * will be ignored including mip_levels, mipmap_generate, size, viewport_ratio, + * and format. + */ + class domInit_as_null : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::INIT_AS_NULL; } + + protected: + /** + * Constructor + */ + domInit_as_null() {} + /** + * Destructor + */ + virtual ~domInit_as_null() {} + /** + * Copy Constructor + */ + domInit_as_null( const domInit_as_null &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domInit_as_null &operator=( const domInit_as_null &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domInit_as_target; + + typedef daeSmartRef domInit_as_targetRef; + typedef daeTArray domInit_as_target_Array; + +/** + * Init as a target for depth, stencil, or color. It does not need image + * data. Surface should not have mipmap_generate when using this. + */ + class domInit_as_target : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::INIT_AS_TARGET; } + + protected: + /** + * Constructor + */ + domInit_as_target() {} + /** + * Destructor + */ + virtual ~domInit_as_target() {} + /** + * Copy Constructor + */ + domInit_as_target( const domInit_as_target &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domInit_as_target &operator=( const domInit_as_target &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + + +protected: // Elements +/** + * This surface is intended to be initialized later externally by a "setparam" + * element. If it is used before being initialized there is profile and platform + * specific behavior. Most elements on the surface element containing this + * will be ignored including mip_levels, mipmap_generate, size, viewport_ratio, + * and format. @see domInit_as_null + */ + domInit_as_nullRef elemInit_as_null; +/** + * Init as a target for depth, stencil, or color. It does not need image + * data. Surface should not have mipmap_generate when using this. @see domInit_as_target + */ + domInit_as_targetRef elemInit_as_target; +/** + * Init a CUBE from a compound image such as DDS @see domInit_cube + */ + domFx_surface_init_cube_commonRef elemInit_cube; +/** + * Init a 3D from a compound image such as DDS @see domInit_volume + */ + domFx_surface_init_volume_commonRef elemInit_volume; +/** + * Init a 1D,2D,RECT,DEPTH from a compound image such as DDS @see domInit_planar + */ + domFx_surface_init_planar_commonRef elemInit_planar; +/** + * Initialize the surface one sub-surface at a time by specifying combinations + * of mip, face, and slice which make sense for a particular surface type. + * Each sub-surface is initialized by a common 2D image, not a complex compound + * image such as DDS. If not all subsurfaces are initialized, it is invalid + * and will result in profile and platform specific behavior unless mipmap_generate + * is responsible for initializing the remainder of the sub-surfaces @see + * domInit_from + */ + domFx_surface_init_from_common_Array elemInit_from_array; + /** + * Used to preserve order in elements that do not specify strict sequencing of sub-elements. + */ + daeElementRefArray _contents; + /** + * Used to preserve order in elements that have a complex content model. + */ + daeUIntArray _contentsOrder; + + +public: //Accessors and Mutators + /** + * Gets the init_as_null element. + * @return a daeSmartRef to the init_as_null element. + */ + const domInit_as_nullRef getInit_as_null() const { return elemInit_as_null; } + /** + * Gets the init_as_target element. + * @return a daeSmartRef to the init_as_target element. + */ + const domInit_as_targetRef getInit_as_target() const { return elemInit_as_target; } + /** + * Gets the init_cube element. + * @return a daeSmartRef to the init_cube element. + */ + const domFx_surface_init_cube_commonRef getInit_cube() const { return elemInit_cube; } + /** + * Gets the init_volume element. + * @return a daeSmartRef to the init_volume element. + */ + const domFx_surface_init_volume_commonRef getInit_volume() const { return elemInit_volume; } + /** + * Gets the init_planar element. + * @return a daeSmartRef to the init_planar element. + */ + const domFx_surface_init_planar_commonRef getInit_planar() const { return elemInit_planar; } + /** + * Gets the init_from element array. + * @return Returns a reference to the array of init_from elements. + */ + domFx_surface_init_from_common_Array &getInit_from_array() { return elemInit_from_array; } + /** + * Gets the init_from element array. + * @return Returns a constant reference to the array of init_from elements. + */ + const domFx_surface_init_from_common_Array &getInit_from_array() const { return elemInit_from_array; } + /** + * Gets the _contents array. + * @return Returns a reference to the _contents element array. + */ + daeElementRefArray &getContents() { return _contents; } + /** + * Gets the _contents array. + * @return Returns a constant reference to the _contents element array. + */ + const daeElementRefArray &getContents() const { return _contents; } + +protected: + /** + * Constructor + */ + domFx_surface_init_common() : elemInit_as_null(), elemInit_as_target(), elemInit_cube(), elemInit_volume(), elemInit_planar(), elemInit_from_array() {} + /** + * Destructor + */ + virtual ~domFx_surface_init_common() {} + /** + * Copy Constructor + */ + domFx_surface_init_common( const domFx_surface_init_common &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFx_surface_init_common &operator=( const domFx_surface_init_common &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_surface_init_cube_common.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_surface_init_cube_common.h new file mode 100644 index 00000000..5c92f094 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_surface_init_cube_common.h @@ -0,0 +1,458 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domFx_surface_init_cube_common_h__ +#define __domFx_surface_init_cube_common_h__ + +#include +#include + + +class domFx_surface_init_cube_common_complexType +{ +public: + class domAll; + + typedef daeSmartRef domAllRef; + typedef daeTArray domAll_Array; + +/** + * Init the entire surface with one compound image such as DDS + */ + class domAll : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::ALL; } + protected: // Attribute + xsIDREF attrRef; + + + public: //Accessors and Mutators + /** + * Gets the ref attribute. + * @return Returns a xsIDREF reference of the ref attribute. + */ + xsIDREF &getRef() { return attrRef; } + /** + * Gets the ref attribute. + * @return Returns a constant xsIDREF reference of the ref attribute. + */ + const xsIDREF &getRef() const{ return attrRef; } + /** + * Sets the ref attribute. + * @param atRef The new value for the ref attribute. + */ + void setRef( const xsIDREF &atRef ) { attrRef = atRef; + _validAttributeArray[0] = true; } + + protected: + /** + * Constructor + */ + domAll() : attrRef() {} + /** + * Destructor + */ + virtual ~domAll() {} + /** + * Copy Constructor + */ + domAll( const domAll &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domAll &operator=( const domAll &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domPrimary; + + typedef daeSmartRef domPrimaryRef; + typedef daeTArray domPrimary_Array; + +/** + * Init all primary mip level 0 subsurfaces with one compound image such as + * DDS. Use of this element expects that the surface has element mip_levels=0 + * or mipmap_generate. + */ + class domPrimary : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::PRIMARY; } + public: + class domOrder; + + typedef daeSmartRef domOrderRef; + typedef daeTArray domOrder_Array; + +/** + * If the image dues not natively describe the face ordering then this series + * of order elements will describe which face the index belongs too + */ + class domOrder : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::ORDER; } + + protected: // Value + /** + * The domFx_surface_face_enum value of the text data of this element. + */ + domFx_surface_face_enum _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a domFx_surface_face_enum of the value. + */ + domFx_surface_face_enum getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( domFx_surface_face_enum val ) { _value = val; } + + protected: + /** + * Constructor + */ + domOrder() : _value() {} + /** + * Destructor + */ + virtual ~domOrder() {} + /** + * Copy Constructor + */ + domOrder( const domOrder &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domOrder &operator=( const domOrder &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + + protected: // Attribute + xsIDREF attrRef; + + protected: // Element +/** + * If the image dues not natively describe the face ordering then this series + * of order elements will describe which face the index belongs too @see domOrder + */ + domOrder_Array elemOrder_array; + + public: //Accessors and Mutators + /** + * Gets the ref attribute. + * @return Returns a xsIDREF reference of the ref attribute. + */ + xsIDREF &getRef() { return attrRef; } + /** + * Gets the ref attribute. + * @return Returns a constant xsIDREF reference of the ref attribute. + */ + const xsIDREF &getRef() const{ return attrRef; } + /** + * Sets the ref attribute. + * @param atRef The new value for the ref attribute. + */ + void setRef( const xsIDREF &atRef ) { attrRef = atRef; + _validAttributeArray[0] = true; } + + /** + * Gets the order element array. + * @return Returns a reference to the array of order elements. + */ + domOrder_Array &getOrder_array() { return elemOrder_array; } + /** + * Gets the order element array. + * @return Returns a constant reference to the array of order elements. + */ + const domOrder_Array &getOrder_array() const { return elemOrder_array; } + protected: + /** + * Constructor + */ + domPrimary() : attrRef(), elemOrder_array() {} + /** + * Destructor + */ + virtual ~domPrimary() {} + /** + * Copy Constructor + */ + domPrimary( const domPrimary &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domPrimary &operator=( const domPrimary &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFace; + + typedef daeSmartRef domFaceRef; + typedef daeTArray domFace_Array; + +/** + * Init each face mipchain with one compound image such as DDS + */ + class domFace : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FACE; } + protected: // Attribute + xsIDREF attrRef; + + + public: //Accessors and Mutators + /** + * Gets the ref attribute. + * @return Returns a xsIDREF reference of the ref attribute. + */ + xsIDREF &getRef() { return attrRef; } + /** + * Gets the ref attribute. + * @return Returns a constant xsIDREF reference of the ref attribute. + */ + const xsIDREF &getRef() const{ return attrRef; } + /** + * Sets the ref attribute. + * @param atRef The new value for the ref attribute. + */ + void setRef( const xsIDREF &atRef ) { attrRef = atRef; + _validAttributeArray[0] = true; } + + protected: + /** + * Constructor + */ + domFace() : attrRef() {} + /** + * Destructor + */ + virtual ~domFace() {} + /** + * Copy Constructor + */ + domFace( const domFace &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFace &operator=( const domFace &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + + +protected: // Elements +/** + * Init the entire surface with one compound image such as DDS @see domAll + */ + domAllRef elemAll; +/** + * Init all primary mip level 0 subsurfaces with one compound image such as + * DDS. Use of this element expects that the surface has element mip_levels=0 + * or mipmap_generate. @see domPrimary + */ + domPrimaryRef elemPrimary; +/** + * Init each face mipchain with one compound image such as DDS @see domFace + */ + domFace_Array elemFace_array; + /** + * Used to preserve order in elements that do not specify strict sequencing of sub-elements. + */ + daeElementRefArray _contents; + /** + * Used to preserve order in elements that have a complex content model. + */ + daeUIntArray _contentsOrder; + + +public: //Accessors and Mutators + /** + * Gets the all element. + * @return a daeSmartRef to the all element. + */ + const domAllRef getAll() const { return elemAll; } + /** + * Gets the primary element. + * @return a daeSmartRef to the primary element. + */ + const domPrimaryRef getPrimary() const { return elemPrimary; } + /** + * Gets the face element array. + * @return Returns a reference to the array of face elements. + */ + domFace_Array &getFace_array() { return elemFace_array; } + /** + * Gets the face element array. + * @return Returns a constant reference to the array of face elements. + */ + const domFace_Array &getFace_array() const { return elemFace_array; } + /** + * Gets the _contents array. + * @return Returns a reference to the _contents element array. + */ + daeElementRefArray &getContents() { return _contents; } + /** + * Gets the _contents array. + * @return Returns a constant reference to the _contents element array. + */ + const daeElementRefArray &getContents() const { return _contents; } + +protected: + /** + * Constructor + */ + domFx_surface_init_cube_common_complexType() : elemAll(), elemPrimary(), elemFace_array() {} + /** + * Destructor + */ + virtual ~domFx_surface_init_cube_common_complexType() {} + /** + * Copy Constructor + */ + domFx_surface_init_cube_common_complexType( const domFx_surface_init_cube_common_complexType &cpy ) { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFx_surface_init_cube_common_complexType &operator=( const domFx_surface_init_cube_common_complexType &cpy ) { (void)cpy; return *this; } +}; + +/** + * An element of type domFx_surface_init_cube_common_complexType. + */ +class domFx_surface_init_cube_common : public daeElement, public domFx_surface_init_cube_common_complexType +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FX_SURFACE_INIT_CUBE_COMMON; } +protected: + /** + * Constructor + */ + domFx_surface_init_cube_common() {} + /** + * Destructor + */ + virtual ~domFx_surface_init_cube_common() {} + /** + * Copy Constructor + */ + domFx_surface_init_cube_common( const domFx_surface_init_cube_common &cpy ) : daeElement(), domFx_surface_init_cube_common_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFx_surface_init_cube_common &operator=( const domFx_surface_init_cube_common &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_surface_init_from_common.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_surface_init_from_common.h new file mode 100644 index 00000000..4e4e36f1 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_surface_init_from_common.h @@ -0,0 +1,191 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domFx_surface_init_from_common_h__ +#define __domFx_surface_init_from_common_h__ + +#include +#include + + +/** + * This element is an IDREF which specifies the image to use to initialize + * a specific mip of a 1D or 2D surface, 3D slice, or Cube face. + */ +class domFx_surface_init_from_common_complexType +{ +protected: // Attributes + xsUnsignedInt attrMip; + xsUnsignedInt attrSlice; + domFx_surface_face_enum attrFace; + +protected: // Value + /** + * The xsIDREF value of the text data of this element. + */ + xsIDREF _value; + +public: //Accessors and Mutators + /** + * Gets the mip attribute. + * @return Returns a xsUnsignedInt of the mip attribute. + */ + xsUnsignedInt getMip() const { return attrMip; } + /** + * Sets the mip attribute. + * @param atMip The new value for the mip attribute. + */ + void setMip( xsUnsignedInt atMip ) { attrMip = atMip; } + + /** + * Gets the slice attribute. + * @return Returns a xsUnsignedInt of the slice attribute. + */ + xsUnsignedInt getSlice() const { return attrSlice; } + /** + * Sets the slice attribute. + * @param atSlice The new value for the slice attribute. + */ + void setSlice( xsUnsignedInt atSlice ) { attrSlice = atSlice; } + + /** + * Gets the face attribute. + * @return Returns a domFx_surface_face_enum of the face attribute. + */ + domFx_surface_face_enum getFace() const { return attrFace; } + /** + * Sets the face attribute. + * @param atFace The new value for the face attribute. + */ + void setFace( domFx_surface_face_enum atFace ) { attrFace = atFace; } + + /** + * Gets the value of this element. + * @return Returns a xsIDREF of the value. + */ + xsIDREF &getValue() { return _value; } + /** + * Gets the value of this element. + * @return Returns a constant xsIDREF of the value. + */ + const xsIDREF &getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( const xsIDREF &val ) { _value = val; } + +protected: + /** + * Constructor + */ + domFx_surface_init_from_common_complexType() : attrMip(), attrSlice(), attrFace(), _value() {} + /** + * Destructor + */ + virtual ~domFx_surface_init_from_common_complexType() {} + /** + * Copy Constructor + */ + domFx_surface_init_from_common_complexType( const domFx_surface_init_from_common_complexType &cpy ) { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFx_surface_init_from_common_complexType &operator=( const domFx_surface_init_from_common_complexType &cpy ) { (void)cpy; return *this; } +}; + +/** + * An element of type domFx_surface_init_from_common_complexType. + */ +class domFx_surface_init_from_common : public daeElement, public domFx_surface_init_from_common_complexType +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FX_SURFACE_INIT_FROM_COMMON; } + +public: //Accessors and Mutators + /** + * Gets the mip attribute. + * @return Returns a xsUnsignedInt of the mip attribute. + */ + xsUnsignedInt getMip() const { return attrMip; } + /** + * Sets the mip attribute. + * @param atMip The new value for the mip attribute. + */ + void setMip( xsUnsignedInt atMip ) { attrMip = atMip; + _validAttributeArray[0] = true; } + + /** + * Gets the slice attribute. + * @return Returns a xsUnsignedInt of the slice attribute. + */ + xsUnsignedInt getSlice() const { return attrSlice; } + /** + * Sets the slice attribute. + * @param atSlice The new value for the slice attribute. + */ + void setSlice( xsUnsignedInt atSlice ) { attrSlice = atSlice; + _validAttributeArray[1] = true; } + + /** + * Gets the face attribute. + * @return Returns a domFx_surface_face_enum of the face attribute. + */ + domFx_surface_face_enum getFace() const { return attrFace; } + /** + * Sets the face attribute. + * @param atFace The new value for the face attribute. + */ + void setFace( domFx_surface_face_enum atFace ) { attrFace = atFace; + _validAttributeArray[2] = true; } + +protected: + /** + * Constructor + */ + domFx_surface_init_from_common() {} + /** + * Destructor + */ + virtual ~domFx_surface_init_from_common() {} + /** + * Copy Constructor + */ + domFx_surface_init_from_common( const domFx_surface_init_from_common &cpy ) : daeElement(), domFx_surface_init_from_common_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFx_surface_init_from_common &operator=( const domFx_surface_init_from_common &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_surface_init_planar_common.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_surface_init_planar_common.h new file mode 100644 index 00000000..26dd6d42 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_surface_init_planar_common.h @@ -0,0 +1,179 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domFx_surface_init_planar_common_h__ +#define __domFx_surface_init_planar_common_h__ + +#include +#include + + +/** + * For 1D, 2D, RECT surface types + */ +class domFx_surface_init_planar_common_complexType +{ +public: + class domAll; + + typedef daeSmartRef domAllRef; + typedef daeTArray domAll_Array; + +/** + * Init the entire surface with one compound image such as DDS + */ + class domAll : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::ALL; } + protected: // Attribute + xsIDREF attrRef; + + + public: //Accessors and Mutators + /** + * Gets the ref attribute. + * @return Returns a xsIDREF reference of the ref attribute. + */ + xsIDREF &getRef() { return attrRef; } + /** + * Gets the ref attribute. + * @return Returns a constant xsIDREF reference of the ref attribute. + */ + const xsIDREF &getRef() const{ return attrRef; } + /** + * Sets the ref attribute. + * @param atRef The new value for the ref attribute. + */ + void setRef( const xsIDREF &atRef ) { attrRef = atRef; + _validAttributeArray[0] = true; } + + protected: + /** + * Constructor + */ + domAll() : attrRef() {} + /** + * Destructor + */ + virtual ~domAll() {} + /** + * Copy Constructor + */ + domAll( const domAll &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domAll &operator=( const domAll &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + + +protected: // Element +/** + * Init the entire surface with one compound image such as DDS @see domAll + */ + domAllRef elemAll; + +public: //Accessors and Mutators + /** + * Gets the all element. + * @return a daeSmartRef to the all element. + */ + const domAllRef getAll() const { return elemAll; } +protected: + /** + * Constructor + */ + domFx_surface_init_planar_common_complexType() : elemAll() {} + /** + * Destructor + */ + virtual ~domFx_surface_init_planar_common_complexType() {} + /** + * Copy Constructor + */ + domFx_surface_init_planar_common_complexType( const domFx_surface_init_planar_common_complexType &cpy ) { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFx_surface_init_planar_common_complexType &operator=( const domFx_surface_init_planar_common_complexType &cpy ) { (void)cpy; return *this; } +}; + +/** + * An element of type domFx_surface_init_planar_common_complexType. + */ +class domFx_surface_init_planar_common : public daeElement, public domFx_surface_init_planar_common_complexType +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FX_SURFACE_INIT_PLANAR_COMMON; } +protected: + /** + * Constructor + */ + domFx_surface_init_planar_common() {} + /** + * Destructor + */ + virtual ~domFx_surface_init_planar_common() {} + /** + * Copy Constructor + */ + domFx_surface_init_planar_common( const domFx_surface_init_planar_common &cpy ) : daeElement(), domFx_surface_init_planar_common_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFx_surface_init_planar_common &operator=( const domFx_surface_init_planar_common &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_surface_init_volume_common.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_surface_init_volume_common.h new file mode 100644 index 00000000..7ff0f7ba --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domFx_surface_init_volume_common.h @@ -0,0 +1,281 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domFx_surface_init_volume_common_h__ +#define __domFx_surface_init_volume_common_h__ + +#include +#include + + +class domFx_surface_init_volume_common_complexType +{ +public: + class domAll; + + typedef daeSmartRef domAllRef; + typedef daeTArray domAll_Array; + +/** + * Init the entire surface with one compound image such as DDS + */ + class domAll : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::ALL; } + protected: // Attribute + xsIDREF attrRef; + + + public: //Accessors and Mutators + /** + * Gets the ref attribute. + * @return Returns a xsIDREF reference of the ref attribute. + */ + xsIDREF &getRef() { return attrRef; } + /** + * Gets the ref attribute. + * @return Returns a constant xsIDREF reference of the ref attribute. + */ + const xsIDREF &getRef() const{ return attrRef; } + /** + * Sets the ref attribute. + * @param atRef The new value for the ref attribute. + */ + void setRef( const xsIDREF &atRef ) { attrRef = atRef; + _validAttributeArray[0] = true; } + + protected: + /** + * Constructor + */ + domAll() : attrRef() {} + /** + * Destructor + */ + virtual ~domAll() {} + /** + * Copy Constructor + */ + domAll( const domAll &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domAll &operator=( const domAll &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domPrimary; + + typedef daeSmartRef domPrimaryRef; + typedef daeTArray domPrimary_Array; + +/** + * Init mip level 0 of the surface with one compound image such as DDS. Use + * of this element expects that the surface has element mip_levels=0 or mipmap_generate. + */ + class domPrimary : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::PRIMARY; } + protected: // Attribute + xsIDREF attrRef; + + + public: //Accessors and Mutators + /** + * Gets the ref attribute. + * @return Returns a xsIDREF reference of the ref attribute. + */ + xsIDREF &getRef() { return attrRef; } + /** + * Gets the ref attribute. + * @return Returns a constant xsIDREF reference of the ref attribute. + */ + const xsIDREF &getRef() const{ return attrRef; } + /** + * Sets the ref attribute. + * @param atRef The new value for the ref attribute. + */ + void setRef( const xsIDREF &atRef ) { attrRef = atRef; + _validAttributeArray[0] = true; } + + protected: + /** + * Constructor + */ + domPrimary() : attrRef() {} + /** + * Destructor + */ + virtual ~domPrimary() {} + /** + * Copy Constructor + */ + domPrimary( const domPrimary &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domPrimary &operator=( const domPrimary &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + + +protected: // Elements +/** + * Init the entire surface with one compound image such as DDS @see domAll + */ + domAllRef elemAll; +/** + * Init mip level 0 of the surface with one compound image such as DDS. Use + * of this element expects that the surface has element mip_levels=0 or mipmap_generate. + * @see domPrimary + */ + domPrimaryRef elemPrimary; + /** + * Used to preserve order in elements that do not specify strict sequencing of sub-elements. + */ + daeElementRefArray _contents; + /** + * Used to preserve order in elements that have a complex content model. + */ + daeUIntArray _contentsOrder; + + +public: //Accessors and Mutators + /** + * Gets the all element. + * @return a daeSmartRef to the all element. + */ + const domAllRef getAll() const { return elemAll; } + /** + * Gets the primary element. + * @return a daeSmartRef to the primary element. + */ + const domPrimaryRef getPrimary() const { return elemPrimary; } + /** + * Gets the _contents array. + * @return Returns a reference to the _contents element array. + */ + daeElementRefArray &getContents() { return _contents; } + /** + * Gets the _contents array. + * @return Returns a constant reference to the _contents element array. + */ + const daeElementRefArray &getContents() const { return _contents; } + +protected: + /** + * Constructor + */ + domFx_surface_init_volume_common_complexType() : elemAll(), elemPrimary() {} + /** + * Destructor + */ + virtual ~domFx_surface_init_volume_common_complexType() {} + /** + * Copy Constructor + */ + domFx_surface_init_volume_common_complexType( const domFx_surface_init_volume_common_complexType &cpy ) { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFx_surface_init_volume_common_complexType &operator=( const domFx_surface_init_volume_common_complexType &cpy ) { (void)cpy; return *this; } +}; + +/** + * An element of type domFx_surface_init_volume_common_complexType. + */ +class domFx_surface_init_volume_common : public daeElement, public domFx_surface_init_volume_common_complexType +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FX_SURFACE_INIT_VOLUME_COMMON; } +protected: + /** + * Constructor + */ + domFx_surface_init_volume_common() {} + /** + * Destructor + */ + virtual ~domFx_surface_init_volume_common() {} + /** + * Copy Constructor + */ + domFx_surface_init_volume_common( const domFx_surface_init_volume_common &cpy ) : daeElement(), domFx_surface_init_volume_common_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFx_surface_init_volume_common &operator=( const domFx_surface_init_volume_common &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGeometry.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGeometry.h new file mode 100644 index 00000000..1b58f3d7 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGeometry.h @@ -0,0 +1,181 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domGeometry_h__ +#define __domGeometry_h__ + +#include +#include + +#include +#include +#include +#include +#include + +/** + * Geometry describes the visual shape and appearance of an object in the + * scene. The geometry element categorizes the declaration of geometric information. + * Geometry is a branch of mathematics that deals with the measurement, properties, + * and relationships of points, lines, angles, surfaces, and solids. + */ +class domGeometry : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::GEOMETRY; } +protected: // Attributes +/** + * The id attribute is a text string containing the unique identifier of + * this element. This value must be unique within the instance document. + * Optional attribute. + */ + xsID attrId; +/** + * The name attribute is the text string name of this element. Optional attribute. + */ + xsNCName attrName; + +protected: // Elements +/** + * The geometry element may contain an asset element. @see domAsset + */ + domAssetRef elemAsset; +/** + * The geometry element may contain only one mesh or convex_mesh. @see domConvex_mesh + */ + domConvex_meshRef elemConvex_mesh; +/** + * The geometry element may contain only one mesh or convex_mesh. @see domMesh + */ + domMeshRef elemMesh; + domSplineRef elemSpline; +/** + * The extra element may appear any number of times. @see domExtra + */ + domExtra_Array elemExtra_array; + /** + * Used to preserve order in elements that do not specify strict sequencing of sub-elements. + */ + daeElementRefArray _contents; + /** + * Used to preserve order in elements that have a complex content model. + */ + daeUIntArray _contentsOrder; + + +public: //Accessors and Mutators + /** + * Gets the id attribute. + * @return Returns a xsID of the id attribute. + */ + xsID getId() const { return attrId; } + /** + * Sets the id attribute. + * @param atId The new value for the id attribute. + */ + void setId( xsID atId ) { *(daeStringRef*)&attrId = atId; + _validAttributeArray[0] = true; } + + /** + * Gets the name attribute. + * @return Returns a xsNCName of the name attribute. + */ + xsNCName getName() const { return attrName; } + /** + * Sets the name attribute. + * @param atName The new value for the name attribute. + */ + void setName( xsNCName atName ) { *(daeStringRef*)&attrName = atName; + _validAttributeArray[1] = true; } + + /** + * Gets the asset element. + * @return a daeSmartRef to the asset element. + */ + const domAssetRef getAsset() const { return elemAsset; } + /** + * Gets the convex_mesh element. + * @return a daeSmartRef to the convex_mesh element. + */ + const domConvex_meshRef getConvex_mesh() const { return elemConvex_mesh; } + /** + * Gets the mesh element. + * @return a daeSmartRef to the mesh element. + */ + const domMeshRef getMesh() const { return elemMesh; } + /** + * Gets the spline element. + * @return a daeSmartRef to the spline element. + */ + const domSplineRef getSpline() const { return elemSpline; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } + /** + * Gets the _contents array. + * @return Returns a reference to the _contents element array. + */ + daeElementRefArray &getContents() { return _contents; } + /** + * Gets the _contents array. + * @return Returns a constant reference to the _contents element array. + */ + const daeElementRefArray &getContents() const { return _contents; } + +protected: + /** + * Constructor + */ + domGeometry() : attrId(), attrName(), elemAsset(), elemConvex_mesh(), elemMesh(), elemSpline(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domGeometry() {} + /** + * Copy Constructor + */ + domGeometry( const domGeometry &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domGeometry &operator=( const domGeometry &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGl_hook_abstract.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGl_hook_abstract.h new file mode 100644 index 00000000..6ab613db --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGl_hook_abstract.h @@ -0,0 +1,65 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domGl_hook_abstract_h__ +#define __domGl_hook_abstract_h__ + +#include +#include + + +class domGl_hook_abstract : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::GL_HOOK_ABSTRACT; } + +protected: + /** + * Constructor + */ + domGl_hook_abstract() {} + /** + * Destructor + */ + virtual ~domGl_hook_abstract() {} + /** + * Copy Constructor + */ + domGl_hook_abstract( const domGl_hook_abstract &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domGl_hook_abstract &operator=( const domGl_hook_abstract &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGl_pipeline_settings.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGl_pipeline_settings.h new file mode 100644 index 00000000..cfd867dd --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGl_pipeline_settings.h @@ -0,0 +1,12361 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domGl_pipeline_settings_h__ +#define __domGl_pipeline_settings_h__ + +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +/** + * A group that defines all of the renderstates used for the CG and GLSL profiles. + */ +class domGl_pipeline_settings : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::GL_PIPELINE_SETTINGS; } +public: + class domAlpha_func; + + typedef daeSmartRef domAlpha_funcRef; + typedef daeTArray domAlpha_func_Array; + + class domAlpha_func : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::ALPHA_FUNC; } + public: + class domFunc; + + typedef daeSmartRef domFuncRef; + typedef daeTArray domFunc_Array; + + class domFunc : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FUNC; } + protected: // Attributes + domGl_func_type attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domGl_func_type of the value attribute. + */ + domGl_func_type getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domGl_func_type atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domFunc() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domFunc() {} + /** + * Copy Constructor + */ + domFunc( const domFunc &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFunc &operator=( const domFunc &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domValue; + + typedef daeSmartRef domValueRef; + typedef daeTArray domValue_Array; + + class domValue : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::VALUE; } + protected: // Attributes + domGl_alpha_value_type attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domGl_alpha_value_type of the value attribute. + */ + domGl_alpha_value_type getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domGl_alpha_value_type atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domValue() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domValue() {} + /** + * Copy Constructor + */ + domValue( const domValue &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domValue &operator=( const domValue &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + + + protected: // Elements + domFuncRef elemFunc; + domValueRef elemValue; + + public: //Accessors and Mutators + /** + * Gets the func element. + * @return a daeSmartRef to the func element. + */ + const domFuncRef getFunc() const { return elemFunc; } + /** + * Gets the value element. + * @return a daeSmartRef to the value element. + */ + const domValueRef getValue() const { return elemValue; } + protected: + /** + * Constructor + */ + domAlpha_func() : elemFunc(), elemValue() {} + /** + * Destructor + */ + virtual ~domAlpha_func() {} + /** + * Copy Constructor + */ + domAlpha_func( const domAlpha_func &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domAlpha_func &operator=( const domAlpha_func &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domBlend_func; + + typedef daeSmartRef domBlend_funcRef; + typedef daeTArray domBlend_func_Array; + + class domBlend_func : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::BLEND_FUNC; } + public: + class domSrc; + + typedef daeSmartRef domSrcRef; + typedef daeTArray domSrc_Array; + + class domSrc : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::SRC; } + protected: // Attributes + domGl_blend_type attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domGl_blend_type of the value attribute. + */ + domGl_blend_type getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domGl_blend_type atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domSrc() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domSrc() {} + /** + * Copy Constructor + */ + domSrc( const domSrc &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domSrc &operator=( const domSrc &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domDest; + + typedef daeSmartRef domDestRef; + typedef daeTArray domDest_Array; + + class domDest : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::DEST; } + protected: // Attributes + domGl_blend_type attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domGl_blend_type of the value attribute. + */ + domGl_blend_type getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domGl_blend_type atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domDest() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domDest() {} + /** + * Copy Constructor + */ + domDest( const domDest &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domDest &operator=( const domDest &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + + + protected: // Elements + domSrcRef elemSrc; + domDestRef elemDest; + + public: //Accessors and Mutators + /** + * Gets the src element. + * @return a daeSmartRef to the src element. + */ + const domSrcRef getSrc() const { return elemSrc; } + /** + * Gets the dest element. + * @return a daeSmartRef to the dest element. + */ + const domDestRef getDest() const { return elemDest; } + protected: + /** + * Constructor + */ + domBlend_func() : elemSrc(), elemDest() {} + /** + * Destructor + */ + virtual ~domBlend_func() {} + /** + * Copy Constructor + */ + domBlend_func( const domBlend_func &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domBlend_func &operator=( const domBlend_func &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domBlend_func_separate; + + typedef daeSmartRef domBlend_func_separateRef; + typedef daeTArray domBlend_func_separate_Array; + + class domBlend_func_separate : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::BLEND_FUNC_SEPARATE; } + public: + class domSrc_rgb; + + typedef daeSmartRef domSrc_rgbRef; + typedef daeTArray domSrc_rgb_Array; + + class domSrc_rgb : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::SRC_RGB; } + protected: // Attributes + domGl_blend_type attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domGl_blend_type of the value attribute. + */ + domGl_blend_type getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domGl_blend_type atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domSrc_rgb() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domSrc_rgb() {} + /** + * Copy Constructor + */ + domSrc_rgb( const domSrc_rgb &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domSrc_rgb &operator=( const domSrc_rgb &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domDest_rgb; + + typedef daeSmartRef domDest_rgbRef; + typedef daeTArray domDest_rgb_Array; + + class domDest_rgb : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::DEST_RGB; } + protected: // Attributes + domGl_blend_type attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domGl_blend_type of the value attribute. + */ + domGl_blend_type getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domGl_blend_type atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domDest_rgb() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domDest_rgb() {} + /** + * Copy Constructor + */ + domDest_rgb( const domDest_rgb &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domDest_rgb &operator=( const domDest_rgb &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domSrc_alpha; + + typedef daeSmartRef domSrc_alphaRef; + typedef daeTArray domSrc_alpha_Array; + + class domSrc_alpha : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::SRC_ALPHA; } + protected: // Attributes + domGl_blend_type attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domGl_blend_type of the value attribute. + */ + domGl_blend_type getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domGl_blend_type atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domSrc_alpha() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domSrc_alpha() {} + /** + * Copy Constructor + */ + domSrc_alpha( const domSrc_alpha &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domSrc_alpha &operator=( const domSrc_alpha &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domDest_alpha; + + typedef daeSmartRef domDest_alphaRef; + typedef daeTArray domDest_alpha_Array; + + class domDest_alpha : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::DEST_ALPHA; } + protected: // Attributes + domGl_blend_type attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domGl_blend_type of the value attribute. + */ + domGl_blend_type getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domGl_blend_type atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domDest_alpha() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domDest_alpha() {} + /** + * Copy Constructor + */ + domDest_alpha( const domDest_alpha &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domDest_alpha &operator=( const domDest_alpha &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + + + protected: // Elements + domSrc_rgbRef elemSrc_rgb; + domDest_rgbRef elemDest_rgb; + domSrc_alphaRef elemSrc_alpha; + domDest_alphaRef elemDest_alpha; + + public: //Accessors and Mutators + /** + * Gets the src_rgb element. + * @return a daeSmartRef to the src_rgb element. + */ + const domSrc_rgbRef getSrc_rgb() const { return elemSrc_rgb; } + /** + * Gets the dest_rgb element. + * @return a daeSmartRef to the dest_rgb element. + */ + const domDest_rgbRef getDest_rgb() const { return elemDest_rgb; } + /** + * Gets the src_alpha element. + * @return a daeSmartRef to the src_alpha element. + */ + const domSrc_alphaRef getSrc_alpha() const { return elemSrc_alpha; } + /** + * Gets the dest_alpha element. + * @return a daeSmartRef to the dest_alpha element. + */ + const domDest_alphaRef getDest_alpha() const { return elemDest_alpha; } + protected: + /** + * Constructor + */ + domBlend_func_separate() : elemSrc_rgb(), elemDest_rgb(), elemSrc_alpha(), elemDest_alpha() {} + /** + * Destructor + */ + virtual ~domBlend_func_separate() {} + /** + * Copy Constructor + */ + domBlend_func_separate( const domBlend_func_separate &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domBlend_func_separate &operator=( const domBlend_func_separate &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domBlend_equation; + + typedef daeSmartRef domBlend_equationRef; + typedef daeTArray domBlend_equation_Array; + + class domBlend_equation : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::BLEND_EQUATION; } + protected: // Attributes + domGl_blend_equation_type attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domGl_blend_equation_type of the value attribute. + */ + domGl_blend_equation_type getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domGl_blend_equation_type atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domBlend_equation() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domBlend_equation() {} + /** + * Copy Constructor + */ + domBlend_equation( const domBlend_equation &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domBlend_equation &operator=( const domBlend_equation &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domBlend_equation_separate; + + typedef daeSmartRef domBlend_equation_separateRef; + typedef daeTArray domBlend_equation_separate_Array; + + class domBlend_equation_separate : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::BLEND_EQUATION_SEPARATE; } + public: + class domRgb; + + typedef daeSmartRef domRgbRef; + typedef daeTArray domRgb_Array; + + class domRgb : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::RGB; } + protected: // Attributes + domGl_blend_equation_type attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domGl_blend_equation_type of the value attribute. + */ + domGl_blend_equation_type getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domGl_blend_equation_type atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domRgb() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domRgb() {} + /** + * Copy Constructor + */ + domRgb( const domRgb &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domRgb &operator=( const domRgb &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domAlpha; + + typedef daeSmartRef domAlphaRef; + typedef daeTArray domAlpha_Array; + + class domAlpha : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::ALPHA; } + protected: // Attributes + domGl_blend_equation_type attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domGl_blend_equation_type of the value attribute. + */ + domGl_blend_equation_type getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domGl_blend_equation_type atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domAlpha() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domAlpha() {} + /** + * Copy Constructor + */ + domAlpha( const domAlpha &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domAlpha &operator=( const domAlpha &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + + + protected: // Elements + domRgbRef elemRgb; + domAlphaRef elemAlpha; + + public: //Accessors and Mutators + /** + * Gets the rgb element. + * @return a daeSmartRef to the rgb element. + */ + const domRgbRef getRgb() const { return elemRgb; } + /** + * Gets the alpha element. + * @return a daeSmartRef to the alpha element. + */ + const domAlphaRef getAlpha() const { return elemAlpha; } + protected: + /** + * Constructor + */ + domBlend_equation_separate() : elemRgb(), elemAlpha() {} + /** + * Destructor + */ + virtual ~domBlend_equation_separate() {} + /** + * Copy Constructor + */ + domBlend_equation_separate( const domBlend_equation_separate &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domBlend_equation_separate &operator=( const domBlend_equation_separate &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domColor_material; + + typedef daeSmartRef domColor_materialRef; + typedef daeTArray domColor_material_Array; + + class domColor_material : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::COLOR_MATERIAL; } + public: + class domFace; + + typedef daeSmartRef domFaceRef; + typedef daeTArray domFace_Array; + + class domFace : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FACE; } + protected: // Attributes + domGl_face_type attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domGl_face_type of the value attribute. + */ + domGl_face_type getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domGl_face_type atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domFace() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domFace() {} + /** + * Copy Constructor + */ + domFace( const domFace &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFace &operator=( const domFace &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domMode; + + typedef daeSmartRef domModeRef; + typedef daeTArray domMode_Array; + + class domMode : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::MODE; } + protected: // Attributes + domGl_material_type attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domGl_material_type of the value attribute. + */ + domGl_material_type getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domGl_material_type atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domMode() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domMode() {} + /** + * Copy Constructor + */ + domMode( const domMode &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domMode &operator=( const domMode &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + + + protected: // Elements + domFaceRef elemFace; + domModeRef elemMode; + + public: //Accessors and Mutators + /** + * Gets the face element. + * @return a daeSmartRef to the face element. + */ + const domFaceRef getFace() const { return elemFace; } + /** + * Gets the mode element. + * @return a daeSmartRef to the mode element. + */ + const domModeRef getMode() const { return elemMode; } + protected: + /** + * Constructor + */ + domColor_material() : elemFace(), elemMode() {} + /** + * Destructor + */ + virtual ~domColor_material() {} + /** + * Copy Constructor + */ + domColor_material( const domColor_material &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domColor_material &operator=( const domColor_material &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domCull_face; + + typedef daeSmartRef domCull_faceRef; + typedef daeTArray domCull_face_Array; + + class domCull_face : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::CULL_FACE; } + protected: // Attributes + domGl_face_type attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domGl_face_type of the value attribute. + */ + domGl_face_type getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domGl_face_type atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domCull_face() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domCull_face() {} + /** + * Copy Constructor + */ + domCull_face( const domCull_face &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domCull_face &operator=( const domCull_face &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domDepth_func; + + typedef daeSmartRef domDepth_funcRef; + typedef daeTArray domDepth_func_Array; + + class domDepth_func : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::DEPTH_FUNC; } + protected: // Attributes + domGl_func_type attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domGl_func_type of the value attribute. + */ + domGl_func_type getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domGl_func_type atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domDepth_func() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domDepth_func() {} + /** + * Copy Constructor + */ + domDepth_func( const domDepth_func &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domDepth_func &operator=( const domDepth_func &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFog_mode; + + typedef daeSmartRef domFog_modeRef; + typedef daeTArray domFog_mode_Array; + + class domFog_mode : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FOG_MODE; } + protected: // Attributes + domGl_fog_type attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domGl_fog_type of the value attribute. + */ + domGl_fog_type getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domGl_fog_type atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domFog_mode() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domFog_mode() {} + /** + * Copy Constructor + */ + domFog_mode( const domFog_mode &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFog_mode &operator=( const domFog_mode &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFog_coord_src; + + typedef daeSmartRef domFog_coord_srcRef; + typedef daeTArray domFog_coord_src_Array; + + class domFog_coord_src : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FOG_COORD_SRC; } + protected: // Attributes + domGl_fog_coord_src_type attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domGl_fog_coord_src_type of the value attribute. + */ + domGl_fog_coord_src_type getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domGl_fog_coord_src_type atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domFog_coord_src() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domFog_coord_src() {} + /** + * Copy Constructor + */ + domFog_coord_src( const domFog_coord_src &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFog_coord_src &operator=( const domFog_coord_src &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFront_face; + + typedef daeSmartRef domFront_faceRef; + typedef daeTArray domFront_face_Array; + + class domFront_face : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FRONT_FACE; } + protected: // Attributes + domGl_front_face_type attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domGl_front_face_type of the value attribute. + */ + domGl_front_face_type getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domGl_front_face_type atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domFront_face() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domFront_face() {} + /** + * Copy Constructor + */ + domFront_face( const domFront_face &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFront_face &operator=( const domFront_face &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domLight_model_color_control; + + typedef daeSmartRef domLight_model_color_controlRef; + typedef daeTArray domLight_model_color_control_Array; + + class domLight_model_color_control : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::LIGHT_MODEL_COLOR_CONTROL; } + protected: // Attributes + domGl_light_model_color_control_type attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domGl_light_model_color_control_type of the value attribute. + */ + domGl_light_model_color_control_type getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domGl_light_model_color_control_type atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domLight_model_color_control() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domLight_model_color_control() {} + /** + * Copy Constructor + */ + domLight_model_color_control( const domLight_model_color_control &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domLight_model_color_control &operator=( const domLight_model_color_control &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domLogic_op; + + typedef daeSmartRef domLogic_opRef; + typedef daeTArray domLogic_op_Array; + + class domLogic_op : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::LOGIC_OP; } + protected: // Attributes + domGl_logic_op_type attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domGl_logic_op_type of the value attribute. + */ + domGl_logic_op_type getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domGl_logic_op_type atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domLogic_op() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domLogic_op() {} + /** + * Copy Constructor + */ + domLogic_op( const domLogic_op &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domLogic_op &operator=( const domLogic_op &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domPolygon_mode; + + typedef daeSmartRef domPolygon_modeRef; + typedef daeTArray domPolygon_mode_Array; + + class domPolygon_mode : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::POLYGON_MODE; } + public: + class domFace; + + typedef daeSmartRef domFaceRef; + typedef daeTArray domFace_Array; + + class domFace : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FACE; } + protected: // Attributes + domGl_face_type attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domGl_face_type of the value attribute. + */ + domGl_face_type getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domGl_face_type atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domFace() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domFace() {} + /** + * Copy Constructor + */ + domFace( const domFace &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFace &operator=( const domFace &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domMode; + + typedef daeSmartRef domModeRef; + typedef daeTArray domMode_Array; + + class domMode : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::MODE; } + protected: // Attributes + domGl_polygon_mode_type attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domGl_polygon_mode_type of the value attribute. + */ + domGl_polygon_mode_type getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domGl_polygon_mode_type atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domMode() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domMode() {} + /** + * Copy Constructor + */ + domMode( const domMode &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domMode &operator=( const domMode &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + + + protected: // Elements + domFaceRef elemFace; + domModeRef elemMode; + + public: //Accessors and Mutators + /** + * Gets the face element. + * @return a daeSmartRef to the face element. + */ + const domFaceRef getFace() const { return elemFace; } + /** + * Gets the mode element. + * @return a daeSmartRef to the mode element. + */ + const domModeRef getMode() const { return elemMode; } + protected: + /** + * Constructor + */ + domPolygon_mode() : elemFace(), elemMode() {} + /** + * Destructor + */ + virtual ~domPolygon_mode() {} + /** + * Copy Constructor + */ + domPolygon_mode( const domPolygon_mode &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domPolygon_mode &operator=( const domPolygon_mode &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domShade_model; + + typedef daeSmartRef domShade_modelRef; + typedef daeTArray domShade_model_Array; + + class domShade_model : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::SHADE_MODEL; } + protected: // Attributes + domGl_shade_model_type attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domGl_shade_model_type of the value attribute. + */ + domGl_shade_model_type getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domGl_shade_model_type atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domShade_model() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domShade_model() {} + /** + * Copy Constructor + */ + domShade_model( const domShade_model &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domShade_model &operator=( const domShade_model &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domStencil_func; + + typedef daeSmartRef domStencil_funcRef; + typedef daeTArray domStencil_func_Array; + + class domStencil_func : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::STENCIL_FUNC; } + public: + class domFunc; + + typedef daeSmartRef domFuncRef; + typedef daeTArray domFunc_Array; + + class domFunc : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FUNC; } + protected: // Attributes + domGl_func_type attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domGl_func_type of the value attribute. + */ + domGl_func_type getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domGl_func_type atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domFunc() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domFunc() {} + /** + * Copy Constructor + */ + domFunc( const domFunc &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFunc &operator=( const domFunc &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domRef; + + typedef daeSmartRef domRefRef; + typedef daeTArray domRef_Array; + + class domRef : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::REF; } + protected: // Attributes + xsUnsignedByte attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a xsUnsignedByte of the value attribute. + */ + xsUnsignedByte getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( xsUnsignedByte atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domRef() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domRef() {} + /** + * Copy Constructor + */ + domRef( const domRef &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domRef &operator=( const domRef &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domMask; + + typedef daeSmartRef domMaskRef; + typedef daeTArray domMask_Array; + + class domMask : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::MASK; } + protected: // Attributes + xsUnsignedByte attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a xsUnsignedByte of the value attribute. + */ + xsUnsignedByte getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( xsUnsignedByte atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domMask() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domMask() {} + /** + * Copy Constructor + */ + domMask( const domMask &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domMask &operator=( const domMask &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + + + protected: // Elements + domFuncRef elemFunc; + domRefRef elemRef; + domMaskRef elemMask; + + public: //Accessors and Mutators + /** + * Gets the func element. + * @return a daeSmartRef to the func element. + */ + const domFuncRef getFunc() const { return elemFunc; } + /** + * Gets the ref element. + * @return a daeSmartRef to the ref element. + */ + const domRefRef getRef() const { return elemRef; } + /** + * Gets the mask element. + * @return a daeSmartRef to the mask element. + */ + const domMaskRef getMask() const { return elemMask; } + protected: + /** + * Constructor + */ + domStencil_func() : elemFunc(), elemRef(), elemMask() {} + /** + * Destructor + */ + virtual ~domStencil_func() {} + /** + * Copy Constructor + */ + domStencil_func( const domStencil_func &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domStencil_func &operator=( const domStencil_func &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domStencil_op; + + typedef daeSmartRef domStencil_opRef; + typedef daeTArray domStencil_op_Array; + + class domStencil_op : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::STENCIL_OP; } + public: + class domFail; + + typedef daeSmartRef domFailRef; + typedef daeTArray domFail_Array; + + class domFail : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FAIL; } + protected: // Attributes + domGl_stencil_op_type attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domGl_stencil_op_type of the value attribute. + */ + domGl_stencil_op_type getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domGl_stencil_op_type atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domFail() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domFail() {} + /** + * Copy Constructor + */ + domFail( const domFail &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFail &operator=( const domFail &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domZfail; + + typedef daeSmartRef domZfailRef; + typedef daeTArray domZfail_Array; + + class domZfail : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::ZFAIL; } + protected: // Attributes + domGl_stencil_op_type attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domGl_stencil_op_type of the value attribute. + */ + domGl_stencil_op_type getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domGl_stencil_op_type atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domZfail() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domZfail() {} + /** + * Copy Constructor + */ + domZfail( const domZfail &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domZfail &operator=( const domZfail &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domZpass; + + typedef daeSmartRef domZpassRef; + typedef daeTArray domZpass_Array; + + class domZpass : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::ZPASS; } + protected: // Attributes + domGl_stencil_op_type attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domGl_stencil_op_type of the value attribute. + */ + domGl_stencil_op_type getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domGl_stencil_op_type atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domZpass() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domZpass() {} + /** + * Copy Constructor + */ + domZpass( const domZpass &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domZpass &operator=( const domZpass &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + + + protected: // Elements + domFailRef elemFail; + domZfailRef elemZfail; + domZpassRef elemZpass; + + public: //Accessors and Mutators + /** + * Gets the fail element. + * @return a daeSmartRef to the fail element. + */ + const domFailRef getFail() const { return elemFail; } + /** + * Gets the zfail element. + * @return a daeSmartRef to the zfail element. + */ + const domZfailRef getZfail() const { return elemZfail; } + /** + * Gets the zpass element. + * @return a daeSmartRef to the zpass element. + */ + const domZpassRef getZpass() const { return elemZpass; } + protected: + /** + * Constructor + */ + domStencil_op() : elemFail(), elemZfail(), elemZpass() {} + /** + * Destructor + */ + virtual ~domStencil_op() {} + /** + * Copy Constructor + */ + domStencil_op( const domStencil_op &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domStencil_op &operator=( const domStencil_op &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domStencil_func_separate; + + typedef daeSmartRef domStencil_func_separateRef; + typedef daeTArray domStencil_func_separate_Array; + + class domStencil_func_separate : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::STENCIL_FUNC_SEPARATE; } + public: + class domFront; + + typedef daeSmartRef domFrontRef; + typedef daeTArray domFront_Array; + + class domFront : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FRONT; } + protected: // Attributes + domGl_func_type attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domGl_func_type of the value attribute. + */ + domGl_func_type getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domGl_func_type atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domFront() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domFront() {} + /** + * Copy Constructor + */ + domFront( const domFront &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFront &operator=( const domFront &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domBack; + + typedef daeSmartRef domBackRef; + typedef daeTArray domBack_Array; + + class domBack : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::BACK; } + protected: // Attributes + domGl_func_type attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domGl_func_type of the value attribute. + */ + domGl_func_type getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domGl_func_type atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domBack() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domBack() {} + /** + * Copy Constructor + */ + domBack( const domBack &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domBack &operator=( const domBack &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domRef; + + typedef daeSmartRef domRefRef; + typedef daeTArray domRef_Array; + + class domRef : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::REF; } + protected: // Attributes + xsUnsignedByte attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a xsUnsignedByte of the value attribute. + */ + xsUnsignedByte getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( xsUnsignedByte atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domRef() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domRef() {} + /** + * Copy Constructor + */ + domRef( const domRef &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domRef &operator=( const domRef &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domMask; + + typedef daeSmartRef domMaskRef; + typedef daeTArray domMask_Array; + + class domMask : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::MASK; } + protected: // Attributes + xsUnsignedByte attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a xsUnsignedByte of the value attribute. + */ + xsUnsignedByte getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( xsUnsignedByte atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domMask() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domMask() {} + /** + * Copy Constructor + */ + domMask( const domMask &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domMask &operator=( const domMask &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + + + protected: // Elements + domFrontRef elemFront; + domBackRef elemBack; + domRefRef elemRef; + domMaskRef elemMask; + + public: //Accessors and Mutators + /** + * Gets the front element. + * @return a daeSmartRef to the front element. + */ + const domFrontRef getFront() const { return elemFront; } + /** + * Gets the back element. + * @return a daeSmartRef to the back element. + */ + const domBackRef getBack() const { return elemBack; } + /** + * Gets the ref element. + * @return a daeSmartRef to the ref element. + */ + const domRefRef getRef() const { return elemRef; } + /** + * Gets the mask element. + * @return a daeSmartRef to the mask element. + */ + const domMaskRef getMask() const { return elemMask; } + protected: + /** + * Constructor + */ + domStencil_func_separate() : elemFront(), elemBack(), elemRef(), elemMask() {} + /** + * Destructor + */ + virtual ~domStencil_func_separate() {} + /** + * Copy Constructor + */ + domStencil_func_separate( const domStencil_func_separate &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domStencil_func_separate &operator=( const domStencil_func_separate &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domStencil_op_separate; + + typedef daeSmartRef domStencil_op_separateRef; + typedef daeTArray domStencil_op_separate_Array; + + class domStencil_op_separate : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::STENCIL_OP_SEPARATE; } + public: + class domFace; + + typedef daeSmartRef domFaceRef; + typedef daeTArray domFace_Array; + + class domFace : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FACE; } + protected: // Attributes + domGl_face_type attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domGl_face_type of the value attribute. + */ + domGl_face_type getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domGl_face_type atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domFace() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domFace() {} + /** + * Copy Constructor + */ + domFace( const domFace &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFace &operator=( const domFace &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFail; + + typedef daeSmartRef domFailRef; + typedef daeTArray domFail_Array; + + class domFail : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FAIL; } + protected: // Attributes + domGl_stencil_op_type attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domGl_stencil_op_type of the value attribute. + */ + domGl_stencil_op_type getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domGl_stencil_op_type atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domFail() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domFail() {} + /** + * Copy Constructor + */ + domFail( const domFail &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFail &operator=( const domFail &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domZfail; + + typedef daeSmartRef domZfailRef; + typedef daeTArray domZfail_Array; + + class domZfail : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::ZFAIL; } + protected: // Attributes + domGl_stencil_op_type attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domGl_stencil_op_type of the value attribute. + */ + domGl_stencil_op_type getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domGl_stencil_op_type atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domZfail() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domZfail() {} + /** + * Copy Constructor + */ + domZfail( const domZfail &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domZfail &operator=( const domZfail &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domZpass; + + typedef daeSmartRef domZpassRef; + typedef daeTArray domZpass_Array; + + class domZpass : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::ZPASS; } + protected: // Attributes + domGl_stencil_op_type attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domGl_stencil_op_type of the value attribute. + */ + domGl_stencil_op_type getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domGl_stencil_op_type atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domZpass() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domZpass() {} + /** + * Copy Constructor + */ + domZpass( const domZpass &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domZpass &operator=( const domZpass &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + + + protected: // Elements + domFaceRef elemFace; + domFailRef elemFail; + domZfailRef elemZfail; + domZpassRef elemZpass; + + public: //Accessors and Mutators + /** + * Gets the face element. + * @return a daeSmartRef to the face element. + */ + const domFaceRef getFace() const { return elemFace; } + /** + * Gets the fail element. + * @return a daeSmartRef to the fail element. + */ + const domFailRef getFail() const { return elemFail; } + /** + * Gets the zfail element. + * @return a daeSmartRef to the zfail element. + */ + const domZfailRef getZfail() const { return elemZfail; } + /** + * Gets the zpass element. + * @return a daeSmartRef to the zpass element. + */ + const domZpassRef getZpass() const { return elemZpass; } + protected: + /** + * Constructor + */ + domStencil_op_separate() : elemFace(), elemFail(), elemZfail(), elemZpass() {} + /** + * Destructor + */ + virtual ~domStencil_op_separate() {} + /** + * Copy Constructor + */ + domStencil_op_separate( const domStencil_op_separate &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domStencil_op_separate &operator=( const domStencil_op_separate &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domStencil_mask_separate; + + typedef daeSmartRef domStencil_mask_separateRef; + typedef daeTArray domStencil_mask_separate_Array; + + class domStencil_mask_separate : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::STENCIL_MASK_SEPARATE; } + public: + class domFace; + + typedef daeSmartRef domFaceRef; + typedef daeTArray domFace_Array; + + class domFace : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FACE; } + protected: // Attributes + domGl_face_type attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domGl_face_type of the value attribute. + */ + domGl_face_type getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domGl_face_type atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domFace() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domFace() {} + /** + * Copy Constructor + */ + domFace( const domFace &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFace &operator=( const domFace &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domMask; + + typedef daeSmartRef domMaskRef; + typedef daeTArray domMask_Array; + + class domMask : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::MASK; } + protected: // Attributes + xsUnsignedByte attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a xsUnsignedByte of the value attribute. + */ + xsUnsignedByte getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( xsUnsignedByte atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domMask() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domMask() {} + /** + * Copy Constructor + */ + domMask( const domMask &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domMask &operator=( const domMask &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + + + protected: // Elements + domFaceRef elemFace; + domMaskRef elemMask; + + public: //Accessors and Mutators + /** + * Gets the face element. + * @return a daeSmartRef to the face element. + */ + const domFaceRef getFace() const { return elemFace; } + /** + * Gets the mask element. + * @return a daeSmartRef to the mask element. + */ + const domMaskRef getMask() const { return elemMask; } + protected: + /** + * Constructor + */ + domStencil_mask_separate() : elemFace(), elemMask() {} + /** + * Destructor + */ + virtual ~domStencil_mask_separate() {} + /** + * Copy Constructor + */ + domStencil_mask_separate( const domStencil_mask_separate &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domStencil_mask_separate &operator=( const domStencil_mask_separate &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domLight_enable; + + typedef daeSmartRef domLight_enableRef; + typedef daeTArray domLight_enable_Array; + + class domLight_enable : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::LIGHT_ENABLE; } + protected: // Attributes + domBool attrValue; + xsNCName attrParam; + domGL_MAX_LIGHTS_index attrIndex; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domBool of the value attribute. + */ + domBool getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domBool atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + /** + * Gets the index attribute. + * @return Returns a domGL_MAX_LIGHTS_index of the index attribute. + */ + domGL_MAX_LIGHTS_index getIndex() const { return attrIndex; } + /** + * Sets the index attribute. + * @param atIndex The new value for the index attribute. + */ + void setIndex( domGL_MAX_LIGHTS_index atIndex ) { attrIndex = atIndex; + _validAttributeArray[2] = true; } + + protected: + /** + * Constructor + */ + domLight_enable() : attrValue(), attrParam(), attrIndex() {} + /** + * Destructor + */ + virtual ~domLight_enable() {} + /** + * Copy Constructor + */ + domLight_enable( const domLight_enable &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domLight_enable &operator=( const domLight_enable &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domLight_ambient; + + typedef daeSmartRef domLight_ambientRef; + typedef daeTArray domLight_ambient_Array; + + class domLight_ambient : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::LIGHT_AMBIENT; } + protected: // Attributes + domFloat4 attrValue; + xsNCName attrParam; + domGL_MAX_LIGHTS_index attrIndex; + + + public: //Accessors and Mutators + /** + * Gets the value array attribute. + * @return Returns a domFloat4 reference of the value array attribute. + */ + domFloat4 &getValue() { return attrValue; } + /** + * Gets the value array attribute. + * @return Returns a constant domFloat4 reference of the value array attribute. + */ + const domFloat4 &getValue() const { return attrValue; } + /** + * Sets the value array attribute. + * @param atValue The new value for the value array attribute. + */ + void setValue( const domFloat4 &atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + /** + * Gets the index attribute. + * @return Returns a domGL_MAX_LIGHTS_index of the index attribute. + */ + domGL_MAX_LIGHTS_index getIndex() const { return attrIndex; } + /** + * Sets the index attribute. + * @param atIndex The new value for the index attribute. + */ + void setIndex( domGL_MAX_LIGHTS_index atIndex ) { attrIndex = atIndex; + _validAttributeArray[2] = true; } + + protected: + /** + * Constructor + */ + domLight_ambient() : attrValue(), attrParam(), attrIndex() {} + /** + * Destructor + */ + virtual ~domLight_ambient() {} + /** + * Copy Constructor + */ + domLight_ambient( const domLight_ambient &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domLight_ambient &operator=( const domLight_ambient &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domLight_diffuse; + + typedef daeSmartRef domLight_diffuseRef; + typedef daeTArray domLight_diffuse_Array; + + class domLight_diffuse : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::LIGHT_DIFFUSE; } + protected: // Attributes + domFloat4 attrValue; + xsNCName attrParam; + domGL_MAX_LIGHTS_index attrIndex; + + + public: //Accessors and Mutators + /** + * Gets the value array attribute. + * @return Returns a domFloat4 reference of the value array attribute. + */ + domFloat4 &getValue() { return attrValue; } + /** + * Gets the value array attribute. + * @return Returns a constant domFloat4 reference of the value array attribute. + */ + const domFloat4 &getValue() const { return attrValue; } + /** + * Sets the value array attribute. + * @param atValue The new value for the value array attribute. + */ + void setValue( const domFloat4 &atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + /** + * Gets the index attribute. + * @return Returns a domGL_MAX_LIGHTS_index of the index attribute. + */ + domGL_MAX_LIGHTS_index getIndex() const { return attrIndex; } + /** + * Sets the index attribute. + * @param atIndex The new value for the index attribute. + */ + void setIndex( domGL_MAX_LIGHTS_index atIndex ) { attrIndex = atIndex; + _validAttributeArray[2] = true; } + + protected: + /** + * Constructor + */ + domLight_diffuse() : attrValue(), attrParam(), attrIndex() {} + /** + * Destructor + */ + virtual ~domLight_diffuse() {} + /** + * Copy Constructor + */ + domLight_diffuse( const domLight_diffuse &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domLight_diffuse &operator=( const domLight_diffuse &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domLight_specular; + + typedef daeSmartRef domLight_specularRef; + typedef daeTArray domLight_specular_Array; + + class domLight_specular : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::LIGHT_SPECULAR; } + protected: // Attributes + domFloat4 attrValue; + xsNCName attrParam; + domGL_MAX_LIGHTS_index attrIndex; + + + public: //Accessors and Mutators + /** + * Gets the value array attribute. + * @return Returns a domFloat4 reference of the value array attribute. + */ + domFloat4 &getValue() { return attrValue; } + /** + * Gets the value array attribute. + * @return Returns a constant domFloat4 reference of the value array attribute. + */ + const domFloat4 &getValue() const { return attrValue; } + /** + * Sets the value array attribute. + * @param atValue The new value for the value array attribute. + */ + void setValue( const domFloat4 &atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + /** + * Gets the index attribute. + * @return Returns a domGL_MAX_LIGHTS_index of the index attribute. + */ + domGL_MAX_LIGHTS_index getIndex() const { return attrIndex; } + /** + * Sets the index attribute. + * @param atIndex The new value for the index attribute. + */ + void setIndex( domGL_MAX_LIGHTS_index atIndex ) { attrIndex = atIndex; + _validAttributeArray[2] = true; } + + protected: + /** + * Constructor + */ + domLight_specular() : attrValue(), attrParam(), attrIndex() {} + /** + * Destructor + */ + virtual ~domLight_specular() {} + /** + * Copy Constructor + */ + domLight_specular( const domLight_specular &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domLight_specular &operator=( const domLight_specular &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domLight_position; + + typedef daeSmartRef domLight_positionRef; + typedef daeTArray domLight_position_Array; + + class domLight_position : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::LIGHT_POSITION; } + protected: // Attributes + domFloat4 attrValue; + xsNCName attrParam; + domGL_MAX_LIGHTS_index attrIndex; + + + public: //Accessors and Mutators + /** + * Gets the value array attribute. + * @return Returns a domFloat4 reference of the value array attribute. + */ + domFloat4 &getValue() { return attrValue; } + /** + * Gets the value array attribute. + * @return Returns a constant domFloat4 reference of the value array attribute. + */ + const domFloat4 &getValue() const { return attrValue; } + /** + * Sets the value array attribute. + * @param atValue The new value for the value array attribute. + */ + void setValue( const domFloat4 &atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + /** + * Gets the index attribute. + * @return Returns a domGL_MAX_LIGHTS_index of the index attribute. + */ + domGL_MAX_LIGHTS_index getIndex() const { return attrIndex; } + /** + * Sets the index attribute. + * @param atIndex The new value for the index attribute. + */ + void setIndex( domGL_MAX_LIGHTS_index atIndex ) { attrIndex = atIndex; + _validAttributeArray[2] = true; } + + protected: + /** + * Constructor + */ + domLight_position() : attrValue(), attrParam(), attrIndex() {} + /** + * Destructor + */ + virtual ~domLight_position() {} + /** + * Copy Constructor + */ + domLight_position( const domLight_position &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domLight_position &operator=( const domLight_position &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domLight_constant_attenuation; + + typedef daeSmartRef domLight_constant_attenuationRef; + typedef daeTArray domLight_constant_attenuation_Array; + + class domLight_constant_attenuation : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::LIGHT_CONSTANT_ATTENUATION; } + protected: // Attributes + domFloat attrValue; + xsNCName attrParam; + domGL_MAX_LIGHTS_index attrIndex; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domFloat of the value attribute. + */ + domFloat getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domFloat atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + /** + * Gets the index attribute. + * @return Returns a domGL_MAX_LIGHTS_index of the index attribute. + */ + domGL_MAX_LIGHTS_index getIndex() const { return attrIndex; } + /** + * Sets the index attribute. + * @param atIndex The new value for the index attribute. + */ + void setIndex( domGL_MAX_LIGHTS_index atIndex ) { attrIndex = atIndex; + _validAttributeArray[2] = true; } + + protected: + /** + * Constructor + */ + domLight_constant_attenuation() : attrValue(), attrParam(), attrIndex() {} + /** + * Destructor + */ + virtual ~domLight_constant_attenuation() {} + /** + * Copy Constructor + */ + domLight_constant_attenuation( const domLight_constant_attenuation &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domLight_constant_attenuation &operator=( const domLight_constant_attenuation &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domLight_linear_attenuation; + + typedef daeSmartRef domLight_linear_attenuationRef; + typedef daeTArray domLight_linear_attenuation_Array; + + class domLight_linear_attenuation : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::LIGHT_LINEAR_ATTENUATION; } + protected: // Attributes + domFloat attrValue; + xsNCName attrParam; + domGL_MAX_LIGHTS_index attrIndex; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domFloat of the value attribute. + */ + domFloat getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domFloat atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + /** + * Gets the index attribute. + * @return Returns a domGL_MAX_LIGHTS_index of the index attribute. + */ + domGL_MAX_LIGHTS_index getIndex() const { return attrIndex; } + /** + * Sets the index attribute. + * @param atIndex The new value for the index attribute. + */ + void setIndex( domGL_MAX_LIGHTS_index atIndex ) { attrIndex = atIndex; + _validAttributeArray[2] = true; } + + protected: + /** + * Constructor + */ + domLight_linear_attenuation() : attrValue(), attrParam(), attrIndex() {} + /** + * Destructor + */ + virtual ~domLight_linear_attenuation() {} + /** + * Copy Constructor + */ + domLight_linear_attenuation( const domLight_linear_attenuation &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domLight_linear_attenuation &operator=( const domLight_linear_attenuation &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domLight_quadratic_attenuation; + + typedef daeSmartRef domLight_quadratic_attenuationRef; + typedef daeTArray domLight_quadratic_attenuation_Array; + + class domLight_quadratic_attenuation : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::LIGHT_QUADRATIC_ATTENUATION; } + protected: // Attributes + domFloat attrValue; + xsNCName attrParam; + domGL_MAX_LIGHTS_index attrIndex; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domFloat of the value attribute. + */ + domFloat getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domFloat atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + /** + * Gets the index attribute. + * @return Returns a domGL_MAX_LIGHTS_index of the index attribute. + */ + domGL_MAX_LIGHTS_index getIndex() const { return attrIndex; } + /** + * Sets the index attribute. + * @param atIndex The new value for the index attribute. + */ + void setIndex( domGL_MAX_LIGHTS_index atIndex ) { attrIndex = atIndex; + _validAttributeArray[2] = true; } + + protected: + /** + * Constructor + */ + domLight_quadratic_attenuation() : attrValue(), attrParam(), attrIndex() {} + /** + * Destructor + */ + virtual ~domLight_quadratic_attenuation() {} + /** + * Copy Constructor + */ + domLight_quadratic_attenuation( const domLight_quadratic_attenuation &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domLight_quadratic_attenuation &operator=( const domLight_quadratic_attenuation &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domLight_spot_cutoff; + + typedef daeSmartRef domLight_spot_cutoffRef; + typedef daeTArray domLight_spot_cutoff_Array; + + class domLight_spot_cutoff : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::LIGHT_SPOT_CUTOFF; } + protected: // Attributes + domFloat attrValue; + xsNCName attrParam; + domGL_MAX_LIGHTS_index attrIndex; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domFloat of the value attribute. + */ + domFloat getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domFloat atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + /** + * Gets the index attribute. + * @return Returns a domGL_MAX_LIGHTS_index of the index attribute. + */ + domGL_MAX_LIGHTS_index getIndex() const { return attrIndex; } + /** + * Sets the index attribute. + * @param atIndex The new value for the index attribute. + */ + void setIndex( domGL_MAX_LIGHTS_index atIndex ) { attrIndex = atIndex; + _validAttributeArray[2] = true; } + + protected: + /** + * Constructor + */ + domLight_spot_cutoff() : attrValue(), attrParam(), attrIndex() {} + /** + * Destructor + */ + virtual ~domLight_spot_cutoff() {} + /** + * Copy Constructor + */ + domLight_spot_cutoff( const domLight_spot_cutoff &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domLight_spot_cutoff &operator=( const domLight_spot_cutoff &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domLight_spot_direction; + + typedef daeSmartRef domLight_spot_directionRef; + typedef daeTArray domLight_spot_direction_Array; + + class domLight_spot_direction : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::LIGHT_SPOT_DIRECTION; } + protected: // Attributes + domFloat3 attrValue; + xsNCName attrParam; + domGL_MAX_LIGHTS_index attrIndex; + + + public: //Accessors and Mutators + /** + * Gets the value array attribute. + * @return Returns a domFloat3 reference of the value array attribute. + */ + domFloat3 &getValue() { return attrValue; } + /** + * Gets the value array attribute. + * @return Returns a constant domFloat3 reference of the value array attribute. + */ + const domFloat3 &getValue() const { return attrValue; } + /** + * Sets the value array attribute. + * @param atValue The new value for the value array attribute. + */ + void setValue( const domFloat3 &atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + /** + * Gets the index attribute. + * @return Returns a domGL_MAX_LIGHTS_index of the index attribute. + */ + domGL_MAX_LIGHTS_index getIndex() const { return attrIndex; } + /** + * Sets the index attribute. + * @param atIndex The new value for the index attribute. + */ + void setIndex( domGL_MAX_LIGHTS_index atIndex ) { attrIndex = atIndex; + _validAttributeArray[2] = true; } + + protected: + /** + * Constructor + */ + domLight_spot_direction() : attrValue(), attrParam(), attrIndex() {} + /** + * Destructor + */ + virtual ~domLight_spot_direction() {} + /** + * Copy Constructor + */ + domLight_spot_direction( const domLight_spot_direction &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domLight_spot_direction &operator=( const domLight_spot_direction &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domLight_spot_exponent; + + typedef daeSmartRef domLight_spot_exponentRef; + typedef daeTArray domLight_spot_exponent_Array; + + class domLight_spot_exponent : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::LIGHT_SPOT_EXPONENT; } + protected: // Attributes + domFloat attrValue; + xsNCName attrParam; + domGL_MAX_LIGHTS_index attrIndex; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domFloat of the value attribute. + */ + domFloat getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domFloat atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + /** + * Gets the index attribute. + * @return Returns a domGL_MAX_LIGHTS_index of the index attribute. + */ + domGL_MAX_LIGHTS_index getIndex() const { return attrIndex; } + /** + * Sets the index attribute. + * @param atIndex The new value for the index attribute. + */ + void setIndex( domGL_MAX_LIGHTS_index atIndex ) { attrIndex = atIndex; + _validAttributeArray[2] = true; } + + protected: + /** + * Constructor + */ + domLight_spot_exponent() : attrValue(), attrParam(), attrIndex() {} + /** + * Destructor + */ + virtual ~domLight_spot_exponent() {} + /** + * Copy Constructor + */ + domLight_spot_exponent( const domLight_spot_exponent &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domLight_spot_exponent &operator=( const domLight_spot_exponent &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domTexture1D; + + typedef daeSmartRef domTexture1DRef; + typedef daeTArray domTexture1D_Array; + + class domTexture1D : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::TEXTURE1D; } + public: + class domParam; + + typedef daeSmartRef domParamRef; + typedef daeTArray domParam_Array; + + class domParam : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::PARAM; } + + protected: // Value + /** + * The xsNCName value of the text data of this element. + */ + xsNCName _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return Returns a xsNCName of the value. + */ + xsNCName getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( xsNCName val ) { *(daeStringRef*)&_value = val; } + + protected: + /** + * Constructor + */ + domParam() : _value() {} + /** + * Destructor + */ + virtual ~domParam() {} + /** + * Copy Constructor + */ + domParam( const domParam &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domParam &operator=( const domParam &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + + protected: // Attribute + domGL_MAX_TEXTURE_IMAGE_UNITS_index attrIndex; + + protected: // Elements + domGl_sampler1DRef elemValue; + domParamRef elemParam; + /** + * Used to preserve order in elements that do not specify strict sequencing of sub-elements. + */ + daeElementRefArray _contents; + /** + * Used to preserve order in elements that have a complex content model. + */ + daeUIntArray _contentsOrder; + + + public: //Accessors and Mutators + /** + * Gets the index attribute. + * @return Returns a domGL_MAX_TEXTURE_IMAGE_UNITS_index of the index attribute. + */ + domGL_MAX_TEXTURE_IMAGE_UNITS_index getIndex() const { return attrIndex; } + /** + * Sets the index attribute. + * @param atIndex The new value for the index attribute. + */ + void setIndex( domGL_MAX_TEXTURE_IMAGE_UNITS_index atIndex ) { attrIndex = atIndex; + _validAttributeArray[0] = true; } + + /** + * Gets the value element. + * @return a daeSmartRef to the value element. + */ + const domGl_sampler1DRef getValue() const { return elemValue; } + /** + * Gets the param element. + * @return a daeSmartRef to the param element. + */ + const domParamRef getParam() const { return elemParam; } + /** + * Gets the _contents array. + * @return Returns a reference to the _contents element array. + */ + daeElementRefArray &getContents() { return _contents; } + /** + * Gets the _contents array. + * @return Returns a constant reference to the _contents element array. + */ + const daeElementRefArray &getContents() const { return _contents; } + + protected: + /** + * Constructor + */ + domTexture1D() : attrIndex(), elemValue(), elemParam() {} + /** + * Destructor + */ + virtual ~domTexture1D() {} + /** + * Copy Constructor + */ + domTexture1D( const domTexture1D &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domTexture1D &operator=( const domTexture1D &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domTexture2D; + + typedef daeSmartRef domTexture2DRef; + typedef daeTArray domTexture2D_Array; + + class domTexture2D : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::TEXTURE2D; } + public: + class domParam; + + typedef daeSmartRef domParamRef; + typedef daeTArray domParam_Array; + + class domParam : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::PARAM; } + + protected: // Value + /** + * The xsNCName value of the text data of this element. + */ + xsNCName _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return Returns a xsNCName of the value. + */ + xsNCName getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( xsNCName val ) { *(daeStringRef*)&_value = val; } + + protected: + /** + * Constructor + */ + domParam() : _value() {} + /** + * Destructor + */ + virtual ~domParam() {} + /** + * Copy Constructor + */ + domParam( const domParam &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domParam &operator=( const domParam &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + + protected: // Attribute + domGL_MAX_TEXTURE_IMAGE_UNITS_index attrIndex; + + protected: // Elements + domGl_sampler2DRef elemValue; + domParamRef elemParam; + /** + * Used to preserve order in elements that do not specify strict sequencing of sub-elements. + */ + daeElementRefArray _contents; + /** + * Used to preserve order in elements that have a complex content model. + */ + daeUIntArray _contentsOrder; + + + public: //Accessors and Mutators + /** + * Gets the index attribute. + * @return Returns a domGL_MAX_TEXTURE_IMAGE_UNITS_index of the index attribute. + */ + domGL_MAX_TEXTURE_IMAGE_UNITS_index getIndex() const { return attrIndex; } + /** + * Sets the index attribute. + * @param atIndex The new value for the index attribute. + */ + void setIndex( domGL_MAX_TEXTURE_IMAGE_UNITS_index atIndex ) { attrIndex = atIndex; + _validAttributeArray[0] = true; } + + /** + * Gets the value element. + * @return a daeSmartRef to the value element. + */ + const domGl_sampler2DRef getValue() const { return elemValue; } + /** + * Gets the param element. + * @return a daeSmartRef to the param element. + */ + const domParamRef getParam() const { return elemParam; } + /** + * Gets the _contents array. + * @return Returns a reference to the _contents element array. + */ + daeElementRefArray &getContents() { return _contents; } + /** + * Gets the _contents array. + * @return Returns a constant reference to the _contents element array. + */ + const daeElementRefArray &getContents() const { return _contents; } + + protected: + /** + * Constructor + */ + domTexture2D() : attrIndex(), elemValue(), elemParam() {} + /** + * Destructor + */ + virtual ~domTexture2D() {} + /** + * Copy Constructor + */ + domTexture2D( const domTexture2D &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domTexture2D &operator=( const domTexture2D &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domTexture3D; + + typedef daeSmartRef domTexture3DRef; + typedef daeTArray domTexture3D_Array; + + class domTexture3D : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::TEXTURE3D; } + public: + class domParam; + + typedef daeSmartRef domParamRef; + typedef daeTArray domParam_Array; + + class domParam : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::PARAM; } + + protected: // Value + /** + * The xsNCName value of the text data of this element. + */ + xsNCName _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return Returns a xsNCName of the value. + */ + xsNCName getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( xsNCName val ) { *(daeStringRef*)&_value = val; } + + protected: + /** + * Constructor + */ + domParam() : _value() {} + /** + * Destructor + */ + virtual ~domParam() {} + /** + * Copy Constructor + */ + domParam( const domParam &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domParam &operator=( const domParam &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + + protected: // Attribute + domGL_MAX_TEXTURE_IMAGE_UNITS_index attrIndex; + + protected: // Elements + domGl_sampler3DRef elemValue; + domParamRef elemParam; + /** + * Used to preserve order in elements that do not specify strict sequencing of sub-elements. + */ + daeElementRefArray _contents; + /** + * Used to preserve order in elements that have a complex content model. + */ + daeUIntArray _contentsOrder; + + + public: //Accessors and Mutators + /** + * Gets the index attribute. + * @return Returns a domGL_MAX_TEXTURE_IMAGE_UNITS_index of the index attribute. + */ + domGL_MAX_TEXTURE_IMAGE_UNITS_index getIndex() const { return attrIndex; } + /** + * Sets the index attribute. + * @param atIndex The new value for the index attribute. + */ + void setIndex( domGL_MAX_TEXTURE_IMAGE_UNITS_index atIndex ) { attrIndex = atIndex; + _validAttributeArray[0] = true; } + + /** + * Gets the value element. + * @return a daeSmartRef to the value element. + */ + const domGl_sampler3DRef getValue() const { return elemValue; } + /** + * Gets the param element. + * @return a daeSmartRef to the param element. + */ + const domParamRef getParam() const { return elemParam; } + /** + * Gets the _contents array. + * @return Returns a reference to the _contents element array. + */ + daeElementRefArray &getContents() { return _contents; } + /** + * Gets the _contents array. + * @return Returns a constant reference to the _contents element array. + */ + const daeElementRefArray &getContents() const { return _contents; } + + protected: + /** + * Constructor + */ + domTexture3D() : attrIndex(), elemValue(), elemParam() {} + /** + * Destructor + */ + virtual ~domTexture3D() {} + /** + * Copy Constructor + */ + domTexture3D( const domTexture3D &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domTexture3D &operator=( const domTexture3D &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domTextureCUBE; + + typedef daeSmartRef domTextureCUBERef; + typedef daeTArray domTextureCUBE_Array; + + class domTextureCUBE : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::TEXTURECUBE; } + public: + class domParam; + + typedef daeSmartRef domParamRef; + typedef daeTArray domParam_Array; + + class domParam : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::PARAM; } + + protected: // Value + /** + * The xsNCName value of the text data of this element. + */ + xsNCName _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return Returns a xsNCName of the value. + */ + xsNCName getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( xsNCName val ) { *(daeStringRef*)&_value = val; } + + protected: + /** + * Constructor + */ + domParam() : _value() {} + /** + * Destructor + */ + virtual ~domParam() {} + /** + * Copy Constructor + */ + domParam( const domParam &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domParam &operator=( const domParam &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + + protected: // Attribute + domGL_MAX_TEXTURE_IMAGE_UNITS_index attrIndex; + + protected: // Elements + domGl_samplerCUBERef elemValue; + domParamRef elemParam; + /** + * Used to preserve order in elements that do not specify strict sequencing of sub-elements. + */ + daeElementRefArray _contents; + /** + * Used to preserve order in elements that have a complex content model. + */ + daeUIntArray _contentsOrder; + + + public: //Accessors and Mutators + /** + * Gets the index attribute. + * @return Returns a domGL_MAX_TEXTURE_IMAGE_UNITS_index of the index attribute. + */ + domGL_MAX_TEXTURE_IMAGE_UNITS_index getIndex() const { return attrIndex; } + /** + * Sets the index attribute. + * @param atIndex The new value for the index attribute. + */ + void setIndex( domGL_MAX_TEXTURE_IMAGE_UNITS_index atIndex ) { attrIndex = atIndex; + _validAttributeArray[0] = true; } + + /** + * Gets the value element. + * @return a daeSmartRef to the value element. + */ + const domGl_samplerCUBERef getValue() const { return elemValue; } + /** + * Gets the param element. + * @return a daeSmartRef to the param element. + */ + const domParamRef getParam() const { return elemParam; } + /** + * Gets the _contents array. + * @return Returns a reference to the _contents element array. + */ + daeElementRefArray &getContents() { return _contents; } + /** + * Gets the _contents array. + * @return Returns a constant reference to the _contents element array. + */ + const daeElementRefArray &getContents() const { return _contents; } + + protected: + /** + * Constructor + */ + domTextureCUBE() : attrIndex(), elemValue(), elemParam() {} + /** + * Destructor + */ + virtual ~domTextureCUBE() {} + /** + * Copy Constructor + */ + domTextureCUBE( const domTextureCUBE &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domTextureCUBE &operator=( const domTextureCUBE &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domTextureRECT; + + typedef daeSmartRef domTextureRECTRef; + typedef daeTArray domTextureRECT_Array; + + class domTextureRECT : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::TEXTURERECT; } + public: + class domParam; + + typedef daeSmartRef domParamRef; + typedef daeTArray domParam_Array; + + class domParam : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::PARAM; } + + protected: // Value + /** + * The xsNCName value of the text data of this element. + */ + xsNCName _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return Returns a xsNCName of the value. + */ + xsNCName getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( xsNCName val ) { *(daeStringRef*)&_value = val; } + + protected: + /** + * Constructor + */ + domParam() : _value() {} + /** + * Destructor + */ + virtual ~domParam() {} + /** + * Copy Constructor + */ + domParam( const domParam &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domParam &operator=( const domParam &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + + protected: // Attribute + domGL_MAX_TEXTURE_IMAGE_UNITS_index attrIndex; + + protected: // Elements + domGl_samplerRECTRef elemValue; + domParamRef elemParam; + /** + * Used to preserve order in elements that do not specify strict sequencing of sub-elements. + */ + daeElementRefArray _contents; + /** + * Used to preserve order in elements that have a complex content model. + */ + daeUIntArray _contentsOrder; + + + public: //Accessors and Mutators + /** + * Gets the index attribute. + * @return Returns a domGL_MAX_TEXTURE_IMAGE_UNITS_index of the index attribute. + */ + domGL_MAX_TEXTURE_IMAGE_UNITS_index getIndex() const { return attrIndex; } + /** + * Sets the index attribute. + * @param atIndex The new value for the index attribute. + */ + void setIndex( domGL_MAX_TEXTURE_IMAGE_UNITS_index atIndex ) { attrIndex = atIndex; + _validAttributeArray[0] = true; } + + /** + * Gets the value element. + * @return a daeSmartRef to the value element. + */ + const domGl_samplerRECTRef getValue() const { return elemValue; } + /** + * Gets the param element. + * @return a daeSmartRef to the param element. + */ + const domParamRef getParam() const { return elemParam; } + /** + * Gets the _contents array. + * @return Returns a reference to the _contents element array. + */ + daeElementRefArray &getContents() { return _contents; } + /** + * Gets the _contents array. + * @return Returns a constant reference to the _contents element array. + */ + const daeElementRefArray &getContents() const { return _contents; } + + protected: + /** + * Constructor + */ + domTextureRECT() : attrIndex(), elemValue(), elemParam() {} + /** + * Destructor + */ + virtual ~domTextureRECT() {} + /** + * Copy Constructor + */ + domTextureRECT( const domTextureRECT &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domTextureRECT &operator=( const domTextureRECT &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domTextureDEPTH; + + typedef daeSmartRef domTextureDEPTHRef; + typedef daeTArray domTextureDEPTH_Array; + + class domTextureDEPTH : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::TEXTUREDEPTH; } + public: + class domParam; + + typedef daeSmartRef domParamRef; + typedef daeTArray domParam_Array; + + class domParam : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::PARAM; } + + protected: // Value + /** + * The xsNCName value of the text data of this element. + */ + xsNCName _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return Returns a xsNCName of the value. + */ + xsNCName getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( xsNCName val ) { *(daeStringRef*)&_value = val; } + + protected: + /** + * Constructor + */ + domParam() : _value() {} + /** + * Destructor + */ + virtual ~domParam() {} + /** + * Copy Constructor + */ + domParam( const domParam &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domParam &operator=( const domParam &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + + protected: // Attribute + domGL_MAX_TEXTURE_IMAGE_UNITS_index attrIndex; + + protected: // Elements + domGl_samplerDEPTHRef elemValue; + domParamRef elemParam; + /** + * Used to preserve order in elements that do not specify strict sequencing of sub-elements. + */ + daeElementRefArray _contents; + /** + * Used to preserve order in elements that have a complex content model. + */ + daeUIntArray _contentsOrder; + + + public: //Accessors and Mutators + /** + * Gets the index attribute. + * @return Returns a domGL_MAX_TEXTURE_IMAGE_UNITS_index of the index attribute. + */ + domGL_MAX_TEXTURE_IMAGE_UNITS_index getIndex() const { return attrIndex; } + /** + * Sets the index attribute. + * @param atIndex The new value for the index attribute. + */ + void setIndex( domGL_MAX_TEXTURE_IMAGE_UNITS_index atIndex ) { attrIndex = atIndex; + _validAttributeArray[0] = true; } + + /** + * Gets the value element. + * @return a daeSmartRef to the value element. + */ + const domGl_samplerDEPTHRef getValue() const { return elemValue; } + /** + * Gets the param element. + * @return a daeSmartRef to the param element. + */ + const domParamRef getParam() const { return elemParam; } + /** + * Gets the _contents array. + * @return Returns a reference to the _contents element array. + */ + daeElementRefArray &getContents() { return _contents; } + /** + * Gets the _contents array. + * @return Returns a constant reference to the _contents element array. + */ + const daeElementRefArray &getContents() const { return _contents; } + + protected: + /** + * Constructor + */ + domTextureDEPTH() : attrIndex(), elemValue(), elemParam() {} + /** + * Destructor + */ + virtual ~domTextureDEPTH() {} + /** + * Copy Constructor + */ + domTextureDEPTH( const domTextureDEPTH &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domTextureDEPTH &operator=( const domTextureDEPTH &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domTexture1D_enable; + + typedef daeSmartRef domTexture1D_enableRef; + typedef daeTArray domTexture1D_enable_Array; + + class domTexture1D_enable : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::TEXTURE1D_ENABLE; } + protected: // Attributes + domBool attrValue; + xsNCName attrParam; + domGL_MAX_TEXTURE_IMAGE_UNITS_index attrIndex; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domBool of the value attribute. + */ + domBool getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domBool atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + /** + * Gets the index attribute. + * @return Returns a domGL_MAX_TEXTURE_IMAGE_UNITS_index of the index attribute. + */ + domGL_MAX_TEXTURE_IMAGE_UNITS_index getIndex() const { return attrIndex; } + /** + * Sets the index attribute. + * @param atIndex The new value for the index attribute. + */ + void setIndex( domGL_MAX_TEXTURE_IMAGE_UNITS_index atIndex ) { attrIndex = atIndex; + _validAttributeArray[2] = true; } + + protected: + /** + * Constructor + */ + domTexture1D_enable() : attrValue(), attrParam(), attrIndex() {} + /** + * Destructor + */ + virtual ~domTexture1D_enable() {} + /** + * Copy Constructor + */ + domTexture1D_enable( const domTexture1D_enable &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domTexture1D_enable &operator=( const domTexture1D_enable &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domTexture2D_enable; + + typedef daeSmartRef domTexture2D_enableRef; + typedef daeTArray domTexture2D_enable_Array; + + class domTexture2D_enable : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::TEXTURE2D_ENABLE; } + protected: // Attributes + domBool attrValue; + xsNCName attrParam; + domGL_MAX_TEXTURE_IMAGE_UNITS_index attrIndex; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domBool of the value attribute. + */ + domBool getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domBool atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + /** + * Gets the index attribute. + * @return Returns a domGL_MAX_TEXTURE_IMAGE_UNITS_index of the index attribute. + */ + domGL_MAX_TEXTURE_IMAGE_UNITS_index getIndex() const { return attrIndex; } + /** + * Sets the index attribute. + * @param atIndex The new value for the index attribute. + */ + void setIndex( domGL_MAX_TEXTURE_IMAGE_UNITS_index atIndex ) { attrIndex = atIndex; + _validAttributeArray[2] = true; } + + protected: + /** + * Constructor + */ + domTexture2D_enable() : attrValue(), attrParam(), attrIndex() {} + /** + * Destructor + */ + virtual ~domTexture2D_enable() {} + /** + * Copy Constructor + */ + domTexture2D_enable( const domTexture2D_enable &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domTexture2D_enable &operator=( const domTexture2D_enable &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domTexture3D_enable; + + typedef daeSmartRef domTexture3D_enableRef; + typedef daeTArray domTexture3D_enable_Array; + + class domTexture3D_enable : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::TEXTURE3D_ENABLE; } + protected: // Attributes + domBool attrValue; + xsNCName attrParam; + domGL_MAX_TEXTURE_IMAGE_UNITS_index attrIndex; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domBool of the value attribute. + */ + domBool getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domBool atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + /** + * Gets the index attribute. + * @return Returns a domGL_MAX_TEXTURE_IMAGE_UNITS_index of the index attribute. + */ + domGL_MAX_TEXTURE_IMAGE_UNITS_index getIndex() const { return attrIndex; } + /** + * Sets the index attribute. + * @param atIndex The new value for the index attribute. + */ + void setIndex( domGL_MAX_TEXTURE_IMAGE_UNITS_index atIndex ) { attrIndex = atIndex; + _validAttributeArray[2] = true; } + + protected: + /** + * Constructor + */ + domTexture3D_enable() : attrValue(), attrParam(), attrIndex() {} + /** + * Destructor + */ + virtual ~domTexture3D_enable() {} + /** + * Copy Constructor + */ + domTexture3D_enable( const domTexture3D_enable &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domTexture3D_enable &operator=( const domTexture3D_enable &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domTextureCUBE_enable; + + typedef daeSmartRef domTextureCUBE_enableRef; + typedef daeTArray domTextureCUBE_enable_Array; + + class domTextureCUBE_enable : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::TEXTURECUBE_ENABLE; } + protected: // Attributes + domBool attrValue; + xsNCName attrParam; + domGL_MAX_TEXTURE_IMAGE_UNITS_index attrIndex; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domBool of the value attribute. + */ + domBool getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domBool atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + /** + * Gets the index attribute. + * @return Returns a domGL_MAX_TEXTURE_IMAGE_UNITS_index of the index attribute. + */ + domGL_MAX_TEXTURE_IMAGE_UNITS_index getIndex() const { return attrIndex; } + /** + * Sets the index attribute. + * @param atIndex The new value for the index attribute. + */ + void setIndex( domGL_MAX_TEXTURE_IMAGE_UNITS_index atIndex ) { attrIndex = atIndex; + _validAttributeArray[2] = true; } + + protected: + /** + * Constructor + */ + domTextureCUBE_enable() : attrValue(), attrParam(), attrIndex() {} + /** + * Destructor + */ + virtual ~domTextureCUBE_enable() {} + /** + * Copy Constructor + */ + domTextureCUBE_enable( const domTextureCUBE_enable &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domTextureCUBE_enable &operator=( const domTextureCUBE_enable &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domTextureRECT_enable; + + typedef daeSmartRef domTextureRECT_enableRef; + typedef daeTArray domTextureRECT_enable_Array; + + class domTextureRECT_enable : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::TEXTURERECT_ENABLE; } + protected: // Attributes + domBool attrValue; + xsNCName attrParam; + domGL_MAX_TEXTURE_IMAGE_UNITS_index attrIndex; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domBool of the value attribute. + */ + domBool getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domBool atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + /** + * Gets the index attribute. + * @return Returns a domGL_MAX_TEXTURE_IMAGE_UNITS_index of the index attribute. + */ + domGL_MAX_TEXTURE_IMAGE_UNITS_index getIndex() const { return attrIndex; } + /** + * Sets the index attribute. + * @param atIndex The new value for the index attribute. + */ + void setIndex( domGL_MAX_TEXTURE_IMAGE_UNITS_index atIndex ) { attrIndex = atIndex; + _validAttributeArray[2] = true; } + + protected: + /** + * Constructor + */ + domTextureRECT_enable() : attrValue(), attrParam(), attrIndex() {} + /** + * Destructor + */ + virtual ~domTextureRECT_enable() {} + /** + * Copy Constructor + */ + domTextureRECT_enable( const domTextureRECT_enable &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domTextureRECT_enable &operator=( const domTextureRECT_enable &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domTextureDEPTH_enable; + + typedef daeSmartRef domTextureDEPTH_enableRef; + typedef daeTArray domTextureDEPTH_enable_Array; + + class domTextureDEPTH_enable : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::TEXTUREDEPTH_ENABLE; } + protected: // Attributes + domBool attrValue; + xsNCName attrParam; + domGL_MAX_TEXTURE_IMAGE_UNITS_index attrIndex; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domBool of the value attribute. + */ + domBool getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domBool atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + /** + * Gets the index attribute. + * @return Returns a domGL_MAX_TEXTURE_IMAGE_UNITS_index of the index attribute. + */ + domGL_MAX_TEXTURE_IMAGE_UNITS_index getIndex() const { return attrIndex; } + /** + * Sets the index attribute. + * @param atIndex The new value for the index attribute. + */ + void setIndex( domGL_MAX_TEXTURE_IMAGE_UNITS_index atIndex ) { attrIndex = atIndex; + _validAttributeArray[2] = true; } + + protected: + /** + * Constructor + */ + domTextureDEPTH_enable() : attrValue(), attrParam(), attrIndex() {} + /** + * Destructor + */ + virtual ~domTextureDEPTH_enable() {} + /** + * Copy Constructor + */ + domTextureDEPTH_enable( const domTextureDEPTH_enable &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domTextureDEPTH_enable &operator=( const domTextureDEPTH_enable &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domTexture_env_color; + + typedef daeSmartRef domTexture_env_colorRef; + typedef daeTArray domTexture_env_color_Array; + + class domTexture_env_color : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::TEXTURE_ENV_COLOR; } + protected: // Attributes + domFloat4 attrValue; + xsNCName attrParam; + domGL_MAX_TEXTURE_IMAGE_UNITS_index attrIndex; + + + public: //Accessors and Mutators + /** + * Gets the value array attribute. + * @return Returns a domFloat4 reference of the value array attribute. + */ + domFloat4 &getValue() { return attrValue; } + /** + * Gets the value array attribute. + * @return Returns a constant domFloat4 reference of the value array attribute. + */ + const domFloat4 &getValue() const { return attrValue; } + /** + * Sets the value array attribute. + * @param atValue The new value for the value array attribute. + */ + void setValue( const domFloat4 &atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + /** + * Gets the index attribute. + * @return Returns a domGL_MAX_TEXTURE_IMAGE_UNITS_index of the index attribute. + */ + domGL_MAX_TEXTURE_IMAGE_UNITS_index getIndex() const { return attrIndex; } + /** + * Sets the index attribute. + * @param atIndex The new value for the index attribute. + */ + void setIndex( domGL_MAX_TEXTURE_IMAGE_UNITS_index atIndex ) { attrIndex = atIndex; + _validAttributeArray[2] = true; } + + protected: + /** + * Constructor + */ + domTexture_env_color() : attrValue(), attrParam(), attrIndex() {} + /** + * Destructor + */ + virtual ~domTexture_env_color() {} + /** + * Copy Constructor + */ + domTexture_env_color( const domTexture_env_color &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domTexture_env_color &operator=( const domTexture_env_color &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domTexture_env_mode; + + typedef daeSmartRef domTexture_env_modeRef; + typedef daeTArray domTexture_env_mode_Array; + + class domTexture_env_mode : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::TEXTURE_ENV_MODE; } + protected: // Attributes + domString attrValue; + xsNCName attrParam; + domGL_MAX_TEXTURE_IMAGE_UNITS_index attrIndex; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domString of the value attribute. + */ + domString getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domString atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + /** + * Gets the index attribute. + * @return Returns a domGL_MAX_TEXTURE_IMAGE_UNITS_index of the index attribute. + */ + domGL_MAX_TEXTURE_IMAGE_UNITS_index getIndex() const { return attrIndex; } + /** + * Sets the index attribute. + * @param atIndex The new value for the index attribute. + */ + void setIndex( domGL_MAX_TEXTURE_IMAGE_UNITS_index atIndex ) { attrIndex = atIndex; + _validAttributeArray[2] = true; } + + protected: + /** + * Constructor + */ + domTexture_env_mode() : attrValue(), attrParam(), attrIndex() {} + /** + * Destructor + */ + virtual ~domTexture_env_mode() {} + /** + * Copy Constructor + */ + domTexture_env_mode( const domTexture_env_mode &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domTexture_env_mode &operator=( const domTexture_env_mode &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domClip_plane; + + typedef daeSmartRef domClip_planeRef; + typedef daeTArray domClip_plane_Array; + + class domClip_plane : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::CLIP_PLANE; } + protected: // Attributes + domFloat4 attrValue; + xsNCName attrParam; + domGL_MAX_CLIP_PLANES_index attrIndex; + + + public: //Accessors and Mutators + /** + * Gets the value array attribute. + * @return Returns a domFloat4 reference of the value array attribute. + */ + domFloat4 &getValue() { return attrValue; } + /** + * Gets the value array attribute. + * @return Returns a constant domFloat4 reference of the value array attribute. + */ + const domFloat4 &getValue() const { return attrValue; } + /** + * Sets the value array attribute. + * @param atValue The new value for the value array attribute. + */ + void setValue( const domFloat4 &atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + /** + * Gets the index attribute. + * @return Returns a domGL_MAX_CLIP_PLANES_index of the index attribute. + */ + domGL_MAX_CLIP_PLANES_index getIndex() const { return attrIndex; } + /** + * Sets the index attribute. + * @param atIndex The new value for the index attribute. + */ + void setIndex( domGL_MAX_CLIP_PLANES_index atIndex ) { attrIndex = atIndex; + _validAttributeArray[2] = true; } + + protected: + /** + * Constructor + */ + domClip_plane() : attrValue(), attrParam(), attrIndex() {} + /** + * Destructor + */ + virtual ~domClip_plane() {} + /** + * Copy Constructor + */ + domClip_plane( const domClip_plane &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domClip_plane &operator=( const domClip_plane &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domClip_plane_enable; + + typedef daeSmartRef domClip_plane_enableRef; + typedef daeTArray domClip_plane_enable_Array; + + class domClip_plane_enable : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::CLIP_PLANE_ENABLE; } + protected: // Attributes + domBool attrValue; + xsNCName attrParam; + domGL_MAX_CLIP_PLANES_index attrIndex; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domBool of the value attribute. + */ + domBool getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domBool atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + /** + * Gets the index attribute. + * @return Returns a domGL_MAX_CLIP_PLANES_index of the index attribute. + */ + domGL_MAX_CLIP_PLANES_index getIndex() const { return attrIndex; } + /** + * Sets the index attribute. + * @param atIndex The new value for the index attribute. + */ + void setIndex( domGL_MAX_CLIP_PLANES_index atIndex ) { attrIndex = atIndex; + _validAttributeArray[2] = true; } + + protected: + /** + * Constructor + */ + domClip_plane_enable() : attrValue(), attrParam(), attrIndex() {} + /** + * Destructor + */ + virtual ~domClip_plane_enable() {} + /** + * Copy Constructor + */ + domClip_plane_enable( const domClip_plane_enable &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domClip_plane_enable &operator=( const domClip_plane_enable &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domBlend_color; + + typedef daeSmartRef domBlend_colorRef; + typedef daeTArray domBlend_color_Array; + + class domBlend_color : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::BLEND_COLOR; } + protected: // Attributes + domFloat4 attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value array attribute. + * @return Returns a domFloat4 reference of the value array attribute. + */ + domFloat4 &getValue() { return attrValue; } + /** + * Gets the value array attribute. + * @return Returns a constant domFloat4 reference of the value array attribute. + */ + const domFloat4 &getValue() const { return attrValue; } + /** + * Sets the value array attribute. + * @param atValue The new value for the value array attribute. + */ + void setValue( const domFloat4 &atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domBlend_color() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domBlend_color() {} + /** + * Copy Constructor + */ + domBlend_color( const domBlend_color &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domBlend_color &operator=( const domBlend_color &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domClear_color; + + typedef daeSmartRef domClear_colorRef; + typedef daeTArray domClear_color_Array; + + class domClear_color : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::CLEAR_COLOR; } + protected: // Attributes + domFloat4 attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value array attribute. + * @return Returns a domFloat4 reference of the value array attribute. + */ + domFloat4 &getValue() { return attrValue; } + /** + * Gets the value array attribute. + * @return Returns a constant domFloat4 reference of the value array attribute. + */ + const domFloat4 &getValue() const { return attrValue; } + /** + * Sets the value array attribute. + * @param atValue The new value for the value array attribute. + */ + void setValue( const domFloat4 &atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domClear_color() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domClear_color() {} + /** + * Copy Constructor + */ + domClear_color( const domClear_color &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domClear_color &operator=( const domClear_color &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domClear_stencil; + + typedef daeSmartRef domClear_stencilRef; + typedef daeTArray domClear_stencil_Array; + + class domClear_stencil : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::CLEAR_STENCIL; } + protected: // Attributes + domInt attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domInt of the value attribute. + */ + domInt getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domInt atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domClear_stencil() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domClear_stencil() {} + /** + * Copy Constructor + */ + domClear_stencil( const domClear_stencil &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domClear_stencil &operator=( const domClear_stencil &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domClear_depth; + + typedef daeSmartRef domClear_depthRef; + typedef daeTArray domClear_depth_Array; + + class domClear_depth : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::CLEAR_DEPTH; } + protected: // Attributes + domFloat attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domFloat of the value attribute. + */ + domFloat getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domFloat atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domClear_depth() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domClear_depth() {} + /** + * Copy Constructor + */ + domClear_depth( const domClear_depth &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domClear_depth &operator=( const domClear_depth &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domColor_mask; + + typedef daeSmartRef domColor_maskRef; + typedef daeTArray domColor_mask_Array; + + class domColor_mask : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::COLOR_MASK; } + protected: // Attributes + domBool4 attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value array attribute. + * @return Returns a domBool4 reference of the value array attribute. + */ + domBool4 &getValue() { return attrValue; } + /** + * Gets the value array attribute. + * @return Returns a constant domBool4 reference of the value array attribute. + */ + const domBool4 &getValue() const { return attrValue; } + /** + * Sets the value array attribute. + * @param atValue The new value for the value array attribute. + */ + void setValue( const domBool4 &atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domColor_mask() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domColor_mask() {} + /** + * Copy Constructor + */ + domColor_mask( const domColor_mask &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domColor_mask &operator=( const domColor_mask &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domDepth_bounds; + + typedef daeSmartRef domDepth_boundsRef; + typedef daeTArray domDepth_bounds_Array; + + class domDepth_bounds : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::DEPTH_BOUNDS; } + protected: // Attributes + domFloat2 attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value array attribute. + * @return Returns a domFloat2 reference of the value array attribute. + */ + domFloat2 &getValue() { return attrValue; } + /** + * Gets the value array attribute. + * @return Returns a constant domFloat2 reference of the value array attribute. + */ + const domFloat2 &getValue() const { return attrValue; } + /** + * Sets the value array attribute. + * @param atValue The new value for the value array attribute. + */ + void setValue( const domFloat2 &atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domDepth_bounds() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domDepth_bounds() {} + /** + * Copy Constructor + */ + domDepth_bounds( const domDepth_bounds &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domDepth_bounds &operator=( const domDepth_bounds &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domDepth_mask; + + typedef daeSmartRef domDepth_maskRef; + typedef daeTArray domDepth_mask_Array; + + class domDepth_mask : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::DEPTH_MASK; } + protected: // Attributes + domBool attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domBool of the value attribute. + */ + domBool getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domBool atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domDepth_mask() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domDepth_mask() {} + /** + * Copy Constructor + */ + domDepth_mask( const domDepth_mask &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domDepth_mask &operator=( const domDepth_mask &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domDepth_range; + + typedef daeSmartRef domDepth_rangeRef; + typedef daeTArray domDepth_range_Array; + + class domDepth_range : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::DEPTH_RANGE; } + protected: // Attributes + domFloat2 attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value array attribute. + * @return Returns a domFloat2 reference of the value array attribute. + */ + domFloat2 &getValue() { return attrValue; } + /** + * Gets the value array attribute. + * @return Returns a constant domFloat2 reference of the value array attribute. + */ + const domFloat2 &getValue() const { return attrValue; } + /** + * Sets the value array attribute. + * @param atValue The new value for the value array attribute. + */ + void setValue( const domFloat2 &atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domDepth_range() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domDepth_range() {} + /** + * Copy Constructor + */ + domDepth_range( const domDepth_range &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domDepth_range &operator=( const domDepth_range &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFog_density; + + typedef daeSmartRef domFog_densityRef; + typedef daeTArray domFog_density_Array; + + class domFog_density : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FOG_DENSITY; } + protected: // Attributes + domFloat attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domFloat of the value attribute. + */ + domFloat getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domFloat atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domFog_density() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domFog_density() {} + /** + * Copy Constructor + */ + domFog_density( const domFog_density &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFog_density &operator=( const domFog_density &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFog_start; + + typedef daeSmartRef domFog_startRef; + typedef daeTArray domFog_start_Array; + + class domFog_start : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FOG_START; } + protected: // Attributes + domFloat attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domFloat of the value attribute. + */ + domFloat getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domFloat atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domFog_start() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domFog_start() {} + /** + * Copy Constructor + */ + domFog_start( const domFog_start &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFog_start &operator=( const domFog_start &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFog_end; + + typedef daeSmartRef domFog_endRef; + typedef daeTArray domFog_end_Array; + + class domFog_end : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FOG_END; } + protected: // Attributes + domFloat attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domFloat of the value attribute. + */ + domFloat getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domFloat atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domFog_end() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domFog_end() {} + /** + * Copy Constructor + */ + domFog_end( const domFog_end &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFog_end &operator=( const domFog_end &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFog_color; + + typedef daeSmartRef domFog_colorRef; + typedef daeTArray domFog_color_Array; + + class domFog_color : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FOG_COLOR; } + protected: // Attributes + domFloat4 attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value array attribute. + * @return Returns a domFloat4 reference of the value array attribute. + */ + domFloat4 &getValue() { return attrValue; } + /** + * Gets the value array attribute. + * @return Returns a constant domFloat4 reference of the value array attribute. + */ + const domFloat4 &getValue() const { return attrValue; } + /** + * Sets the value array attribute. + * @param atValue The new value for the value array attribute. + */ + void setValue( const domFloat4 &atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domFog_color() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domFog_color() {} + /** + * Copy Constructor + */ + domFog_color( const domFog_color &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFog_color &operator=( const domFog_color &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domLight_model_ambient; + + typedef daeSmartRef domLight_model_ambientRef; + typedef daeTArray domLight_model_ambient_Array; + + class domLight_model_ambient : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::LIGHT_MODEL_AMBIENT; } + protected: // Attributes + domFloat4 attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value array attribute. + * @return Returns a domFloat4 reference of the value array attribute. + */ + domFloat4 &getValue() { return attrValue; } + /** + * Gets the value array attribute. + * @return Returns a constant domFloat4 reference of the value array attribute. + */ + const domFloat4 &getValue() const { return attrValue; } + /** + * Sets the value array attribute. + * @param atValue The new value for the value array attribute. + */ + void setValue( const domFloat4 &atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domLight_model_ambient() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domLight_model_ambient() {} + /** + * Copy Constructor + */ + domLight_model_ambient( const domLight_model_ambient &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domLight_model_ambient &operator=( const domLight_model_ambient &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domLighting_enable; + + typedef daeSmartRef domLighting_enableRef; + typedef daeTArray domLighting_enable_Array; + + class domLighting_enable : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::LIGHTING_ENABLE; } + protected: // Attributes + domBool attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domBool of the value attribute. + */ + domBool getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domBool atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domLighting_enable() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domLighting_enable() {} + /** + * Copy Constructor + */ + domLighting_enable( const domLighting_enable &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domLighting_enable &operator=( const domLighting_enable &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domLine_stipple; + + typedef daeSmartRef domLine_stippleRef; + typedef daeTArray domLine_stipple_Array; + + class domLine_stipple : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::LINE_STIPPLE; } + protected: // Attributes + domInt2 attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value array attribute. + * @return Returns a domInt2 reference of the value array attribute. + */ + domInt2 &getValue() { return attrValue; } + /** + * Gets the value array attribute. + * @return Returns a constant domInt2 reference of the value array attribute. + */ + const domInt2 &getValue() const { return attrValue; } + /** + * Sets the value array attribute. + * @param atValue The new value for the value array attribute. + */ + void setValue( const domInt2 &atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domLine_stipple() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domLine_stipple() {} + /** + * Copy Constructor + */ + domLine_stipple( const domLine_stipple &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domLine_stipple &operator=( const domLine_stipple &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domLine_width; + + typedef daeSmartRef domLine_widthRef; + typedef daeTArray domLine_width_Array; + + class domLine_width : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::LINE_WIDTH; } + protected: // Attributes + domFloat attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domFloat of the value attribute. + */ + domFloat getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domFloat atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domLine_width() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domLine_width() {} + /** + * Copy Constructor + */ + domLine_width( const domLine_width &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domLine_width &operator=( const domLine_width &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domMaterial_ambient; + + typedef daeSmartRef domMaterial_ambientRef; + typedef daeTArray domMaterial_ambient_Array; + + class domMaterial_ambient : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::MATERIAL_AMBIENT; } + protected: // Attributes + domFloat4 attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value array attribute. + * @return Returns a domFloat4 reference of the value array attribute. + */ + domFloat4 &getValue() { return attrValue; } + /** + * Gets the value array attribute. + * @return Returns a constant domFloat4 reference of the value array attribute. + */ + const domFloat4 &getValue() const { return attrValue; } + /** + * Sets the value array attribute. + * @param atValue The new value for the value array attribute. + */ + void setValue( const domFloat4 &atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domMaterial_ambient() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domMaterial_ambient() {} + /** + * Copy Constructor + */ + domMaterial_ambient( const domMaterial_ambient &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domMaterial_ambient &operator=( const domMaterial_ambient &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domMaterial_diffuse; + + typedef daeSmartRef domMaterial_diffuseRef; + typedef daeTArray domMaterial_diffuse_Array; + + class domMaterial_diffuse : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::MATERIAL_DIFFUSE; } + protected: // Attributes + domFloat4 attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value array attribute. + * @return Returns a domFloat4 reference of the value array attribute. + */ + domFloat4 &getValue() { return attrValue; } + /** + * Gets the value array attribute. + * @return Returns a constant domFloat4 reference of the value array attribute. + */ + const domFloat4 &getValue() const { return attrValue; } + /** + * Sets the value array attribute. + * @param atValue The new value for the value array attribute. + */ + void setValue( const domFloat4 &atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domMaterial_diffuse() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domMaterial_diffuse() {} + /** + * Copy Constructor + */ + domMaterial_diffuse( const domMaterial_diffuse &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domMaterial_diffuse &operator=( const domMaterial_diffuse &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domMaterial_emission; + + typedef daeSmartRef domMaterial_emissionRef; + typedef daeTArray domMaterial_emission_Array; + + class domMaterial_emission : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::MATERIAL_EMISSION; } + protected: // Attributes + domFloat4 attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value array attribute. + * @return Returns a domFloat4 reference of the value array attribute. + */ + domFloat4 &getValue() { return attrValue; } + /** + * Gets the value array attribute. + * @return Returns a constant domFloat4 reference of the value array attribute. + */ + const domFloat4 &getValue() const { return attrValue; } + /** + * Sets the value array attribute. + * @param atValue The new value for the value array attribute. + */ + void setValue( const domFloat4 &atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domMaterial_emission() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domMaterial_emission() {} + /** + * Copy Constructor + */ + domMaterial_emission( const domMaterial_emission &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domMaterial_emission &operator=( const domMaterial_emission &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domMaterial_shininess; + + typedef daeSmartRef domMaterial_shininessRef; + typedef daeTArray domMaterial_shininess_Array; + + class domMaterial_shininess : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::MATERIAL_SHININESS; } + protected: // Attributes + domFloat attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domFloat of the value attribute. + */ + domFloat getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domFloat atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domMaterial_shininess() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domMaterial_shininess() {} + /** + * Copy Constructor + */ + domMaterial_shininess( const domMaterial_shininess &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domMaterial_shininess &operator=( const domMaterial_shininess &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domMaterial_specular; + + typedef daeSmartRef domMaterial_specularRef; + typedef daeTArray domMaterial_specular_Array; + + class domMaterial_specular : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::MATERIAL_SPECULAR; } + protected: // Attributes + domFloat4 attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value array attribute. + * @return Returns a domFloat4 reference of the value array attribute. + */ + domFloat4 &getValue() { return attrValue; } + /** + * Gets the value array attribute. + * @return Returns a constant domFloat4 reference of the value array attribute. + */ + const domFloat4 &getValue() const { return attrValue; } + /** + * Sets the value array attribute. + * @param atValue The new value for the value array attribute. + */ + void setValue( const domFloat4 &atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domMaterial_specular() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domMaterial_specular() {} + /** + * Copy Constructor + */ + domMaterial_specular( const domMaterial_specular &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domMaterial_specular &operator=( const domMaterial_specular &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domModel_view_matrix; + + typedef daeSmartRef domModel_view_matrixRef; + typedef daeTArray domModel_view_matrix_Array; + + class domModel_view_matrix : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::MODEL_VIEW_MATRIX; } + protected: // Attributes + domFloat4x4 attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value array attribute. + * @return Returns a domFloat4x4 reference of the value array attribute. + */ + domFloat4x4 &getValue() { return attrValue; } + /** + * Gets the value array attribute. + * @return Returns a constant domFloat4x4 reference of the value array attribute. + */ + const domFloat4x4 &getValue() const { return attrValue; } + /** + * Sets the value array attribute. + * @param atValue The new value for the value array attribute. + */ + void setValue( const domFloat4x4 &atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domModel_view_matrix() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domModel_view_matrix() {} + /** + * Copy Constructor + */ + domModel_view_matrix( const domModel_view_matrix &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domModel_view_matrix &operator=( const domModel_view_matrix &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domPoint_distance_attenuation; + + typedef daeSmartRef domPoint_distance_attenuationRef; + typedef daeTArray domPoint_distance_attenuation_Array; + + class domPoint_distance_attenuation : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::POINT_DISTANCE_ATTENUATION; } + protected: // Attributes + domFloat3 attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value array attribute. + * @return Returns a domFloat3 reference of the value array attribute. + */ + domFloat3 &getValue() { return attrValue; } + /** + * Gets the value array attribute. + * @return Returns a constant domFloat3 reference of the value array attribute. + */ + const domFloat3 &getValue() const { return attrValue; } + /** + * Sets the value array attribute. + * @param atValue The new value for the value array attribute. + */ + void setValue( const domFloat3 &atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domPoint_distance_attenuation() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domPoint_distance_attenuation() {} + /** + * Copy Constructor + */ + domPoint_distance_attenuation( const domPoint_distance_attenuation &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domPoint_distance_attenuation &operator=( const domPoint_distance_attenuation &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domPoint_fade_threshold_size; + + typedef daeSmartRef domPoint_fade_threshold_sizeRef; + typedef daeTArray domPoint_fade_threshold_size_Array; + + class domPoint_fade_threshold_size : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::POINT_FADE_THRESHOLD_SIZE; } + protected: // Attributes + domFloat attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domFloat of the value attribute. + */ + domFloat getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domFloat atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domPoint_fade_threshold_size() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domPoint_fade_threshold_size() {} + /** + * Copy Constructor + */ + domPoint_fade_threshold_size( const domPoint_fade_threshold_size &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domPoint_fade_threshold_size &operator=( const domPoint_fade_threshold_size &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domPoint_size; + + typedef daeSmartRef domPoint_sizeRef; + typedef daeTArray domPoint_size_Array; + + class domPoint_size : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::POINT_SIZE; } + protected: // Attributes + domFloat attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domFloat of the value attribute. + */ + domFloat getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domFloat atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domPoint_size() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domPoint_size() {} + /** + * Copy Constructor + */ + domPoint_size( const domPoint_size &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domPoint_size &operator=( const domPoint_size &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domPoint_size_min; + + typedef daeSmartRef domPoint_size_minRef; + typedef daeTArray domPoint_size_min_Array; + + class domPoint_size_min : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::POINT_SIZE_MIN; } + protected: // Attributes + domFloat attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domFloat of the value attribute. + */ + domFloat getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domFloat atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domPoint_size_min() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domPoint_size_min() {} + /** + * Copy Constructor + */ + domPoint_size_min( const domPoint_size_min &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domPoint_size_min &operator=( const domPoint_size_min &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domPoint_size_max; + + typedef daeSmartRef domPoint_size_maxRef; + typedef daeTArray domPoint_size_max_Array; + + class domPoint_size_max : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::POINT_SIZE_MAX; } + protected: // Attributes + domFloat attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domFloat of the value attribute. + */ + domFloat getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domFloat atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domPoint_size_max() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domPoint_size_max() {} + /** + * Copy Constructor + */ + domPoint_size_max( const domPoint_size_max &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domPoint_size_max &operator=( const domPoint_size_max &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domPolygon_offset; + + typedef daeSmartRef domPolygon_offsetRef; + typedef daeTArray domPolygon_offset_Array; + + class domPolygon_offset : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::POLYGON_OFFSET; } + protected: // Attributes + domFloat2 attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value array attribute. + * @return Returns a domFloat2 reference of the value array attribute. + */ + domFloat2 &getValue() { return attrValue; } + /** + * Gets the value array attribute. + * @return Returns a constant domFloat2 reference of the value array attribute. + */ + const domFloat2 &getValue() const { return attrValue; } + /** + * Sets the value array attribute. + * @param atValue The new value for the value array attribute. + */ + void setValue( const domFloat2 &atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domPolygon_offset() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domPolygon_offset() {} + /** + * Copy Constructor + */ + domPolygon_offset( const domPolygon_offset &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domPolygon_offset &operator=( const domPolygon_offset &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domProjection_matrix; + + typedef daeSmartRef domProjection_matrixRef; + typedef daeTArray domProjection_matrix_Array; + + class domProjection_matrix : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::PROJECTION_MATRIX; } + protected: // Attributes + domFloat4x4 attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value array attribute. + * @return Returns a domFloat4x4 reference of the value array attribute. + */ + domFloat4x4 &getValue() { return attrValue; } + /** + * Gets the value array attribute. + * @return Returns a constant domFloat4x4 reference of the value array attribute. + */ + const domFloat4x4 &getValue() const { return attrValue; } + /** + * Sets the value array attribute. + * @param atValue The new value for the value array attribute. + */ + void setValue( const domFloat4x4 &atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domProjection_matrix() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domProjection_matrix() {} + /** + * Copy Constructor + */ + domProjection_matrix( const domProjection_matrix &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domProjection_matrix &operator=( const domProjection_matrix &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domScissor; + + typedef daeSmartRef domScissorRef; + typedef daeTArray domScissor_Array; + + class domScissor : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::SCISSOR; } + protected: // Attributes + domInt4 attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value array attribute. + * @return Returns a domInt4 reference of the value array attribute. + */ + domInt4 &getValue() { return attrValue; } + /** + * Gets the value array attribute. + * @return Returns a constant domInt4 reference of the value array attribute. + */ + const domInt4 &getValue() const { return attrValue; } + /** + * Sets the value array attribute. + * @param atValue The new value for the value array attribute. + */ + void setValue( const domInt4 &atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domScissor() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domScissor() {} + /** + * Copy Constructor + */ + domScissor( const domScissor &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domScissor &operator=( const domScissor &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domStencil_mask; + + typedef daeSmartRef domStencil_maskRef; + typedef daeTArray domStencil_mask_Array; + + class domStencil_mask : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::STENCIL_MASK; } + protected: // Attributes + domInt attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domInt of the value attribute. + */ + domInt getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domInt atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domStencil_mask() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domStencil_mask() {} + /** + * Copy Constructor + */ + domStencil_mask( const domStencil_mask &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domStencil_mask &operator=( const domStencil_mask &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domAlpha_test_enable; + + typedef daeSmartRef domAlpha_test_enableRef; + typedef daeTArray domAlpha_test_enable_Array; + + class domAlpha_test_enable : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::ALPHA_TEST_ENABLE; } + protected: // Attributes + domBool attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domBool of the value attribute. + */ + domBool getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domBool atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domAlpha_test_enable() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domAlpha_test_enable() {} + /** + * Copy Constructor + */ + domAlpha_test_enable( const domAlpha_test_enable &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domAlpha_test_enable &operator=( const domAlpha_test_enable &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domAuto_normal_enable; + + typedef daeSmartRef domAuto_normal_enableRef; + typedef daeTArray domAuto_normal_enable_Array; + + class domAuto_normal_enable : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::AUTO_NORMAL_ENABLE; } + protected: // Attributes + domBool attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domBool of the value attribute. + */ + domBool getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domBool atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domAuto_normal_enable() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domAuto_normal_enable() {} + /** + * Copy Constructor + */ + domAuto_normal_enable( const domAuto_normal_enable &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domAuto_normal_enable &operator=( const domAuto_normal_enable &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domBlend_enable; + + typedef daeSmartRef domBlend_enableRef; + typedef daeTArray domBlend_enable_Array; + + class domBlend_enable : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::BLEND_ENABLE; } + protected: // Attributes + domBool attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domBool of the value attribute. + */ + domBool getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domBool atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domBlend_enable() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domBlend_enable() {} + /** + * Copy Constructor + */ + domBlend_enable( const domBlend_enable &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domBlend_enable &operator=( const domBlend_enable &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domColor_logic_op_enable; + + typedef daeSmartRef domColor_logic_op_enableRef; + typedef daeTArray domColor_logic_op_enable_Array; + + class domColor_logic_op_enable : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::COLOR_LOGIC_OP_ENABLE; } + protected: // Attributes + domBool attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domBool of the value attribute. + */ + domBool getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domBool atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domColor_logic_op_enable() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domColor_logic_op_enable() {} + /** + * Copy Constructor + */ + domColor_logic_op_enable( const domColor_logic_op_enable &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domColor_logic_op_enable &operator=( const domColor_logic_op_enable &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domColor_material_enable; + + typedef daeSmartRef domColor_material_enableRef; + typedef daeTArray domColor_material_enable_Array; + + class domColor_material_enable : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::COLOR_MATERIAL_ENABLE; } + protected: // Attributes + domBool attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domBool of the value attribute. + */ + domBool getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domBool atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domColor_material_enable() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domColor_material_enable() {} + /** + * Copy Constructor + */ + domColor_material_enable( const domColor_material_enable &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domColor_material_enable &operator=( const domColor_material_enable &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domCull_face_enable; + + typedef daeSmartRef domCull_face_enableRef; + typedef daeTArray domCull_face_enable_Array; + + class domCull_face_enable : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::CULL_FACE_ENABLE; } + protected: // Attributes + domBool attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domBool of the value attribute. + */ + domBool getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domBool atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domCull_face_enable() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domCull_face_enable() {} + /** + * Copy Constructor + */ + domCull_face_enable( const domCull_face_enable &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domCull_face_enable &operator=( const domCull_face_enable &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domDepth_bounds_enable; + + typedef daeSmartRef domDepth_bounds_enableRef; + typedef daeTArray domDepth_bounds_enable_Array; + + class domDepth_bounds_enable : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::DEPTH_BOUNDS_ENABLE; } + protected: // Attributes + domBool attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domBool of the value attribute. + */ + domBool getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domBool atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domDepth_bounds_enable() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domDepth_bounds_enable() {} + /** + * Copy Constructor + */ + domDepth_bounds_enable( const domDepth_bounds_enable &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domDepth_bounds_enable &operator=( const domDepth_bounds_enable &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domDepth_clamp_enable; + + typedef daeSmartRef domDepth_clamp_enableRef; + typedef daeTArray domDepth_clamp_enable_Array; + + class domDepth_clamp_enable : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::DEPTH_CLAMP_ENABLE; } + protected: // Attributes + domBool attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domBool of the value attribute. + */ + domBool getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domBool atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domDepth_clamp_enable() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domDepth_clamp_enable() {} + /** + * Copy Constructor + */ + domDepth_clamp_enable( const domDepth_clamp_enable &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domDepth_clamp_enable &operator=( const domDepth_clamp_enable &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domDepth_test_enable; + + typedef daeSmartRef domDepth_test_enableRef; + typedef daeTArray domDepth_test_enable_Array; + + class domDepth_test_enable : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::DEPTH_TEST_ENABLE; } + protected: // Attributes + domBool attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domBool of the value attribute. + */ + domBool getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domBool atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domDepth_test_enable() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domDepth_test_enable() {} + /** + * Copy Constructor + */ + domDepth_test_enable( const domDepth_test_enable &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domDepth_test_enable &operator=( const domDepth_test_enable &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domDither_enable; + + typedef daeSmartRef domDither_enableRef; + typedef daeTArray domDither_enable_Array; + + class domDither_enable : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::DITHER_ENABLE; } + protected: // Attributes + domBool attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domBool of the value attribute. + */ + domBool getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domBool atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domDither_enable() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domDither_enable() {} + /** + * Copy Constructor + */ + domDither_enable( const domDither_enable &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domDither_enable &operator=( const domDither_enable &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFog_enable; + + typedef daeSmartRef domFog_enableRef; + typedef daeTArray domFog_enable_Array; + + class domFog_enable : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FOG_ENABLE; } + protected: // Attributes + domBool attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domBool of the value attribute. + */ + domBool getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domBool atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domFog_enable() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domFog_enable() {} + /** + * Copy Constructor + */ + domFog_enable( const domFog_enable &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFog_enable &operator=( const domFog_enable &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domLight_model_local_viewer_enable; + + typedef daeSmartRef domLight_model_local_viewer_enableRef; + typedef daeTArray domLight_model_local_viewer_enable_Array; + + class domLight_model_local_viewer_enable : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::LIGHT_MODEL_LOCAL_VIEWER_ENABLE; } + protected: // Attributes + domBool attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domBool of the value attribute. + */ + domBool getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domBool atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domLight_model_local_viewer_enable() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domLight_model_local_viewer_enable() {} + /** + * Copy Constructor + */ + domLight_model_local_viewer_enable( const domLight_model_local_viewer_enable &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domLight_model_local_viewer_enable &operator=( const domLight_model_local_viewer_enable &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domLight_model_two_side_enable; + + typedef daeSmartRef domLight_model_two_side_enableRef; + typedef daeTArray domLight_model_two_side_enable_Array; + + class domLight_model_two_side_enable : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::LIGHT_MODEL_TWO_SIDE_ENABLE; } + protected: // Attributes + domBool attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domBool of the value attribute. + */ + domBool getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domBool atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domLight_model_two_side_enable() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domLight_model_two_side_enable() {} + /** + * Copy Constructor + */ + domLight_model_two_side_enable( const domLight_model_two_side_enable &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domLight_model_two_side_enable &operator=( const domLight_model_two_side_enable &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domLine_smooth_enable; + + typedef daeSmartRef domLine_smooth_enableRef; + typedef daeTArray domLine_smooth_enable_Array; + + class domLine_smooth_enable : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::LINE_SMOOTH_ENABLE; } + protected: // Attributes + domBool attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domBool of the value attribute. + */ + domBool getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domBool atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domLine_smooth_enable() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domLine_smooth_enable() {} + /** + * Copy Constructor + */ + domLine_smooth_enable( const domLine_smooth_enable &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domLine_smooth_enable &operator=( const domLine_smooth_enable &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domLine_stipple_enable; + + typedef daeSmartRef domLine_stipple_enableRef; + typedef daeTArray domLine_stipple_enable_Array; + + class domLine_stipple_enable : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::LINE_STIPPLE_ENABLE; } + protected: // Attributes + domBool attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domBool of the value attribute. + */ + domBool getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domBool atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domLine_stipple_enable() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domLine_stipple_enable() {} + /** + * Copy Constructor + */ + domLine_stipple_enable( const domLine_stipple_enable &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domLine_stipple_enable &operator=( const domLine_stipple_enable &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domLogic_op_enable; + + typedef daeSmartRef domLogic_op_enableRef; + typedef daeTArray domLogic_op_enable_Array; + + class domLogic_op_enable : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::LOGIC_OP_ENABLE; } + protected: // Attributes + domBool attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domBool of the value attribute. + */ + domBool getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domBool atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domLogic_op_enable() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domLogic_op_enable() {} + /** + * Copy Constructor + */ + domLogic_op_enable( const domLogic_op_enable &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domLogic_op_enable &operator=( const domLogic_op_enable &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domMultisample_enable; + + typedef daeSmartRef domMultisample_enableRef; + typedef daeTArray domMultisample_enable_Array; + + class domMultisample_enable : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::MULTISAMPLE_ENABLE; } + protected: // Attributes + domBool attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domBool of the value attribute. + */ + domBool getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domBool atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domMultisample_enable() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domMultisample_enable() {} + /** + * Copy Constructor + */ + domMultisample_enable( const domMultisample_enable &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domMultisample_enable &operator=( const domMultisample_enable &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domNormalize_enable; + + typedef daeSmartRef domNormalize_enableRef; + typedef daeTArray domNormalize_enable_Array; + + class domNormalize_enable : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::NORMALIZE_ENABLE; } + protected: // Attributes + domBool attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domBool of the value attribute. + */ + domBool getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domBool atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domNormalize_enable() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domNormalize_enable() {} + /** + * Copy Constructor + */ + domNormalize_enable( const domNormalize_enable &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domNormalize_enable &operator=( const domNormalize_enable &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domPoint_smooth_enable; + + typedef daeSmartRef domPoint_smooth_enableRef; + typedef daeTArray domPoint_smooth_enable_Array; + + class domPoint_smooth_enable : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::POINT_SMOOTH_ENABLE; } + protected: // Attributes + domBool attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domBool of the value attribute. + */ + domBool getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domBool atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domPoint_smooth_enable() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domPoint_smooth_enable() {} + /** + * Copy Constructor + */ + domPoint_smooth_enable( const domPoint_smooth_enable &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domPoint_smooth_enable &operator=( const domPoint_smooth_enable &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domPolygon_offset_fill_enable; + + typedef daeSmartRef domPolygon_offset_fill_enableRef; + typedef daeTArray domPolygon_offset_fill_enable_Array; + + class domPolygon_offset_fill_enable : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::POLYGON_OFFSET_FILL_ENABLE; } + protected: // Attributes + domBool attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domBool of the value attribute. + */ + domBool getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domBool atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domPolygon_offset_fill_enable() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domPolygon_offset_fill_enable() {} + /** + * Copy Constructor + */ + domPolygon_offset_fill_enable( const domPolygon_offset_fill_enable &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domPolygon_offset_fill_enable &operator=( const domPolygon_offset_fill_enable &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domPolygon_offset_line_enable; + + typedef daeSmartRef domPolygon_offset_line_enableRef; + typedef daeTArray domPolygon_offset_line_enable_Array; + + class domPolygon_offset_line_enable : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::POLYGON_OFFSET_LINE_ENABLE; } + protected: // Attributes + domBool attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domBool of the value attribute. + */ + domBool getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domBool atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domPolygon_offset_line_enable() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domPolygon_offset_line_enable() {} + /** + * Copy Constructor + */ + domPolygon_offset_line_enable( const domPolygon_offset_line_enable &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domPolygon_offset_line_enable &operator=( const domPolygon_offset_line_enable &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domPolygon_offset_point_enable; + + typedef daeSmartRef domPolygon_offset_point_enableRef; + typedef daeTArray domPolygon_offset_point_enable_Array; + + class domPolygon_offset_point_enable : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::POLYGON_OFFSET_POINT_ENABLE; } + protected: // Attributes + domBool attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domBool of the value attribute. + */ + domBool getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domBool atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domPolygon_offset_point_enable() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domPolygon_offset_point_enable() {} + /** + * Copy Constructor + */ + domPolygon_offset_point_enable( const domPolygon_offset_point_enable &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domPolygon_offset_point_enable &operator=( const domPolygon_offset_point_enable &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domPolygon_smooth_enable; + + typedef daeSmartRef domPolygon_smooth_enableRef; + typedef daeTArray domPolygon_smooth_enable_Array; + + class domPolygon_smooth_enable : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::POLYGON_SMOOTH_ENABLE; } + protected: // Attributes + domBool attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domBool of the value attribute. + */ + domBool getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domBool atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domPolygon_smooth_enable() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domPolygon_smooth_enable() {} + /** + * Copy Constructor + */ + domPolygon_smooth_enable( const domPolygon_smooth_enable &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domPolygon_smooth_enable &operator=( const domPolygon_smooth_enable &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domPolygon_stipple_enable; + + typedef daeSmartRef domPolygon_stipple_enableRef; + typedef daeTArray domPolygon_stipple_enable_Array; + + class domPolygon_stipple_enable : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::POLYGON_STIPPLE_ENABLE; } + protected: // Attributes + domBool attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domBool of the value attribute. + */ + domBool getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domBool atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domPolygon_stipple_enable() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domPolygon_stipple_enable() {} + /** + * Copy Constructor + */ + domPolygon_stipple_enable( const domPolygon_stipple_enable &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domPolygon_stipple_enable &operator=( const domPolygon_stipple_enable &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domRescale_normal_enable; + + typedef daeSmartRef domRescale_normal_enableRef; + typedef daeTArray domRescale_normal_enable_Array; + + class domRescale_normal_enable : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::RESCALE_NORMAL_ENABLE; } + protected: // Attributes + domBool attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domBool of the value attribute. + */ + domBool getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domBool atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domRescale_normal_enable() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domRescale_normal_enable() {} + /** + * Copy Constructor + */ + domRescale_normal_enable( const domRescale_normal_enable &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domRescale_normal_enable &operator=( const domRescale_normal_enable &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domSample_alpha_to_coverage_enable; + + typedef daeSmartRef domSample_alpha_to_coverage_enableRef; + typedef daeTArray domSample_alpha_to_coverage_enable_Array; + + class domSample_alpha_to_coverage_enable : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::SAMPLE_ALPHA_TO_COVERAGE_ENABLE; } + protected: // Attributes + domBool attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domBool of the value attribute. + */ + domBool getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domBool atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domSample_alpha_to_coverage_enable() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domSample_alpha_to_coverage_enable() {} + /** + * Copy Constructor + */ + domSample_alpha_to_coverage_enable( const domSample_alpha_to_coverage_enable &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domSample_alpha_to_coverage_enable &operator=( const domSample_alpha_to_coverage_enable &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domSample_alpha_to_one_enable; + + typedef daeSmartRef domSample_alpha_to_one_enableRef; + typedef daeTArray domSample_alpha_to_one_enable_Array; + + class domSample_alpha_to_one_enable : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::SAMPLE_ALPHA_TO_ONE_ENABLE; } + protected: // Attributes + domBool attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domBool of the value attribute. + */ + domBool getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domBool atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domSample_alpha_to_one_enable() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domSample_alpha_to_one_enable() {} + /** + * Copy Constructor + */ + domSample_alpha_to_one_enable( const domSample_alpha_to_one_enable &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domSample_alpha_to_one_enable &operator=( const domSample_alpha_to_one_enable &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domSample_coverage_enable; + + typedef daeSmartRef domSample_coverage_enableRef; + typedef daeTArray domSample_coverage_enable_Array; + + class domSample_coverage_enable : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::SAMPLE_COVERAGE_ENABLE; } + protected: // Attributes + domBool attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domBool of the value attribute. + */ + domBool getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domBool atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domSample_coverage_enable() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domSample_coverage_enable() {} + /** + * Copy Constructor + */ + domSample_coverage_enable( const domSample_coverage_enable &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domSample_coverage_enable &operator=( const domSample_coverage_enable &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domScissor_test_enable; + + typedef daeSmartRef domScissor_test_enableRef; + typedef daeTArray domScissor_test_enable_Array; + + class domScissor_test_enable : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::SCISSOR_TEST_ENABLE; } + protected: // Attributes + domBool attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domBool of the value attribute. + */ + domBool getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domBool atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domScissor_test_enable() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domScissor_test_enable() {} + /** + * Copy Constructor + */ + domScissor_test_enable( const domScissor_test_enable &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domScissor_test_enable &operator=( const domScissor_test_enable &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domStencil_test_enable; + + typedef daeSmartRef domStencil_test_enableRef; + typedef daeTArray domStencil_test_enable_Array; + + class domStencil_test_enable : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::STENCIL_TEST_ENABLE; } + protected: // Attributes + domBool attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domBool of the value attribute. + */ + domBool getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domBool atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domStencil_test_enable() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domStencil_test_enable() {} + /** + * Copy Constructor + */ + domStencil_test_enable( const domStencil_test_enable &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domStencil_test_enable &operator=( const domStencil_test_enable &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + + +protected: // Elements + domAlpha_funcRef elemAlpha_func; + domBlend_funcRef elemBlend_func; + domBlend_func_separateRef elemBlend_func_separate; + domBlend_equationRef elemBlend_equation; + domBlend_equation_separateRef elemBlend_equation_separate; + domColor_materialRef elemColor_material; + domCull_faceRef elemCull_face; + domDepth_funcRef elemDepth_func; + domFog_modeRef elemFog_mode; + domFog_coord_srcRef elemFog_coord_src; + domFront_faceRef elemFront_face; + domLight_model_color_controlRef elemLight_model_color_control; + domLogic_opRef elemLogic_op; + domPolygon_modeRef elemPolygon_mode; + domShade_modelRef elemShade_model; + domStencil_funcRef elemStencil_func; + domStencil_opRef elemStencil_op; + domStencil_func_separateRef elemStencil_func_separate; + domStencil_op_separateRef elemStencil_op_separate; + domStencil_mask_separateRef elemStencil_mask_separate; + domLight_enableRef elemLight_enable; + domLight_ambientRef elemLight_ambient; + domLight_diffuseRef elemLight_diffuse; + domLight_specularRef elemLight_specular; + domLight_positionRef elemLight_position; + domLight_constant_attenuationRef elemLight_constant_attenuation; + domLight_linear_attenuationRef elemLight_linear_attenuation; + domLight_quadratic_attenuationRef elemLight_quadratic_attenuation; + domLight_spot_cutoffRef elemLight_spot_cutoff; + domLight_spot_directionRef elemLight_spot_direction; + domLight_spot_exponentRef elemLight_spot_exponent; + domTexture1DRef elemTexture1D; + domTexture2DRef elemTexture2D; + domTexture3DRef elemTexture3D; + domTextureCUBERef elemTextureCUBE; + domTextureRECTRef elemTextureRECT; + domTextureDEPTHRef elemTextureDEPTH; + domTexture1D_enableRef elemTexture1D_enable; + domTexture2D_enableRef elemTexture2D_enable; + domTexture3D_enableRef elemTexture3D_enable; + domTextureCUBE_enableRef elemTextureCUBE_enable; + domTextureRECT_enableRef elemTextureRECT_enable; + domTextureDEPTH_enableRef elemTextureDEPTH_enable; + domTexture_env_colorRef elemTexture_env_color; + domTexture_env_modeRef elemTexture_env_mode; + domClip_planeRef elemClip_plane; + domClip_plane_enableRef elemClip_plane_enable; + domBlend_colorRef elemBlend_color; + domClear_colorRef elemClear_color; + domClear_stencilRef elemClear_stencil; + domClear_depthRef elemClear_depth; + domColor_maskRef elemColor_mask; + domDepth_boundsRef elemDepth_bounds; + domDepth_maskRef elemDepth_mask; + domDepth_rangeRef elemDepth_range; + domFog_densityRef elemFog_density; + domFog_startRef elemFog_start; + domFog_endRef elemFog_end; + domFog_colorRef elemFog_color; + domLight_model_ambientRef elemLight_model_ambient; + domLighting_enableRef elemLighting_enable; + domLine_stippleRef elemLine_stipple; + domLine_widthRef elemLine_width; + domMaterial_ambientRef elemMaterial_ambient; + domMaterial_diffuseRef elemMaterial_diffuse; + domMaterial_emissionRef elemMaterial_emission; + domMaterial_shininessRef elemMaterial_shininess; + domMaterial_specularRef elemMaterial_specular; + domModel_view_matrixRef elemModel_view_matrix; + domPoint_distance_attenuationRef elemPoint_distance_attenuation; + domPoint_fade_threshold_sizeRef elemPoint_fade_threshold_size; + domPoint_sizeRef elemPoint_size; + domPoint_size_minRef elemPoint_size_min; + domPoint_size_maxRef elemPoint_size_max; + domPolygon_offsetRef elemPolygon_offset; + domProjection_matrixRef elemProjection_matrix; + domScissorRef elemScissor; + domStencil_maskRef elemStencil_mask; + domAlpha_test_enableRef elemAlpha_test_enable; + domAuto_normal_enableRef elemAuto_normal_enable; + domBlend_enableRef elemBlend_enable; + domColor_logic_op_enableRef elemColor_logic_op_enable; + domColor_material_enableRef elemColor_material_enable; + domCull_face_enableRef elemCull_face_enable; + domDepth_bounds_enableRef elemDepth_bounds_enable; + domDepth_clamp_enableRef elemDepth_clamp_enable; + domDepth_test_enableRef elemDepth_test_enable; + domDither_enableRef elemDither_enable; + domFog_enableRef elemFog_enable; + domLight_model_local_viewer_enableRef elemLight_model_local_viewer_enable; + domLight_model_two_side_enableRef elemLight_model_two_side_enable; + domLine_smooth_enableRef elemLine_smooth_enable; + domLine_stipple_enableRef elemLine_stipple_enable; + domLogic_op_enableRef elemLogic_op_enable; + domMultisample_enableRef elemMultisample_enable; + domNormalize_enableRef elemNormalize_enable; + domPoint_smooth_enableRef elemPoint_smooth_enable; + domPolygon_offset_fill_enableRef elemPolygon_offset_fill_enable; + domPolygon_offset_line_enableRef elemPolygon_offset_line_enable; + domPolygon_offset_point_enableRef elemPolygon_offset_point_enable; + domPolygon_smooth_enableRef elemPolygon_smooth_enable; + domPolygon_stipple_enableRef elemPolygon_stipple_enable; + domRescale_normal_enableRef elemRescale_normal_enable; + domSample_alpha_to_coverage_enableRef elemSample_alpha_to_coverage_enable; + domSample_alpha_to_one_enableRef elemSample_alpha_to_one_enable; + domSample_coverage_enableRef elemSample_coverage_enable; + domScissor_test_enableRef elemScissor_test_enable; + domStencil_test_enableRef elemStencil_test_enable; + domGl_hook_abstractRef elemGl_hook_abstract; + /** + * Used to preserve order in elements that do not specify strict sequencing of sub-elements. + */ + daeElementRefArray _contents; + /** + * Used to preserve order in elements that have a complex content model. + */ + daeUIntArray _contentsOrder; + + +public: //Accessors and Mutators + /** + * Gets the alpha_func element. + * @return a daeSmartRef to the alpha_func element. + */ + const domAlpha_funcRef getAlpha_func() const { return elemAlpha_func; } + /** + * Gets the blend_func element. + * @return a daeSmartRef to the blend_func element. + */ + const domBlend_funcRef getBlend_func() const { return elemBlend_func; } + /** + * Gets the blend_func_separate element. + * @return a daeSmartRef to the blend_func_separate element. + */ + const domBlend_func_separateRef getBlend_func_separate() const { return elemBlend_func_separate; } + /** + * Gets the blend_equation element. + * @return a daeSmartRef to the blend_equation element. + */ + const domBlend_equationRef getBlend_equation() const { return elemBlend_equation; } + /** + * Gets the blend_equation_separate element. + * @return a daeSmartRef to the blend_equation_separate element. + */ + const domBlend_equation_separateRef getBlend_equation_separate() const { return elemBlend_equation_separate; } + /** + * Gets the color_material element. + * @return a daeSmartRef to the color_material element. + */ + const domColor_materialRef getColor_material() const { return elemColor_material; } + /** + * Gets the cull_face element. + * @return a daeSmartRef to the cull_face element. + */ + const domCull_faceRef getCull_face() const { return elemCull_face; } + /** + * Gets the depth_func element. + * @return a daeSmartRef to the depth_func element. + */ + const domDepth_funcRef getDepth_func() const { return elemDepth_func; } + /** + * Gets the fog_mode element. + * @return a daeSmartRef to the fog_mode element. + */ + const domFog_modeRef getFog_mode() const { return elemFog_mode; } + /** + * Gets the fog_coord_src element. + * @return a daeSmartRef to the fog_coord_src element. + */ + const domFog_coord_srcRef getFog_coord_src() const { return elemFog_coord_src; } + /** + * Gets the front_face element. + * @return a daeSmartRef to the front_face element. + */ + const domFront_faceRef getFront_face() const { return elemFront_face; } + /** + * Gets the light_model_color_control element. + * @return a daeSmartRef to the light_model_color_control element. + */ + const domLight_model_color_controlRef getLight_model_color_control() const { return elemLight_model_color_control; } + /** + * Gets the logic_op element. + * @return a daeSmartRef to the logic_op element. + */ + const domLogic_opRef getLogic_op() const { return elemLogic_op; } + /** + * Gets the polygon_mode element. + * @return a daeSmartRef to the polygon_mode element. + */ + const domPolygon_modeRef getPolygon_mode() const { return elemPolygon_mode; } + /** + * Gets the shade_model element. + * @return a daeSmartRef to the shade_model element. + */ + const domShade_modelRef getShade_model() const { return elemShade_model; } + /** + * Gets the stencil_func element. + * @return a daeSmartRef to the stencil_func element. + */ + const domStencil_funcRef getStencil_func() const { return elemStencil_func; } + /** + * Gets the stencil_op element. + * @return a daeSmartRef to the stencil_op element. + */ + const domStencil_opRef getStencil_op() const { return elemStencil_op; } + /** + * Gets the stencil_func_separate element. + * @return a daeSmartRef to the stencil_func_separate element. + */ + const domStencil_func_separateRef getStencil_func_separate() const { return elemStencil_func_separate; } + /** + * Gets the stencil_op_separate element. + * @return a daeSmartRef to the stencil_op_separate element. + */ + const domStencil_op_separateRef getStencil_op_separate() const { return elemStencil_op_separate; } + /** + * Gets the stencil_mask_separate element. + * @return a daeSmartRef to the stencil_mask_separate element. + */ + const domStencil_mask_separateRef getStencil_mask_separate() const { return elemStencil_mask_separate; } + /** + * Gets the light_enable element. + * @return a daeSmartRef to the light_enable element. + */ + const domLight_enableRef getLight_enable() const { return elemLight_enable; } + /** + * Gets the light_ambient element. + * @return a daeSmartRef to the light_ambient element. + */ + const domLight_ambientRef getLight_ambient() const { return elemLight_ambient; } + /** + * Gets the light_diffuse element. + * @return a daeSmartRef to the light_diffuse element. + */ + const domLight_diffuseRef getLight_diffuse() const { return elemLight_diffuse; } + /** + * Gets the light_specular element. + * @return a daeSmartRef to the light_specular element. + */ + const domLight_specularRef getLight_specular() const { return elemLight_specular; } + /** + * Gets the light_position element. + * @return a daeSmartRef to the light_position element. + */ + const domLight_positionRef getLight_position() const { return elemLight_position; } + /** + * Gets the light_constant_attenuation element. + * @return a daeSmartRef to the light_constant_attenuation element. + */ + const domLight_constant_attenuationRef getLight_constant_attenuation() const { return elemLight_constant_attenuation; } + /** + * Gets the light_linear_attenuation element. + * @return a daeSmartRef to the light_linear_attenuation element. + */ + const domLight_linear_attenuationRef getLight_linear_attenuation() const { return elemLight_linear_attenuation; } + /** + * Gets the light_quadratic_attenuation element. + * @return a daeSmartRef to the light_quadratic_attenuation element. + */ + const domLight_quadratic_attenuationRef getLight_quadratic_attenuation() const { return elemLight_quadratic_attenuation; } + /** + * Gets the light_spot_cutoff element. + * @return a daeSmartRef to the light_spot_cutoff element. + */ + const domLight_spot_cutoffRef getLight_spot_cutoff() const { return elemLight_spot_cutoff; } + /** + * Gets the light_spot_direction element. + * @return a daeSmartRef to the light_spot_direction element. + */ + const domLight_spot_directionRef getLight_spot_direction() const { return elemLight_spot_direction; } + /** + * Gets the light_spot_exponent element. + * @return a daeSmartRef to the light_spot_exponent element. + */ + const domLight_spot_exponentRef getLight_spot_exponent() const { return elemLight_spot_exponent; } + /** + * Gets the texture1D element. + * @return a daeSmartRef to the texture1D element. + */ + const domTexture1DRef getTexture1D() const { return elemTexture1D; } + /** + * Gets the texture2D element. + * @return a daeSmartRef to the texture2D element. + */ + const domTexture2DRef getTexture2D() const { return elemTexture2D; } + /** + * Gets the texture3D element. + * @return a daeSmartRef to the texture3D element. + */ + const domTexture3DRef getTexture3D() const { return elemTexture3D; } + /** + * Gets the textureCUBE element. + * @return a daeSmartRef to the textureCUBE element. + */ + const domTextureCUBERef getTextureCUBE() const { return elemTextureCUBE; } + /** + * Gets the textureRECT element. + * @return a daeSmartRef to the textureRECT element. + */ + const domTextureRECTRef getTextureRECT() const { return elemTextureRECT; } + /** + * Gets the textureDEPTH element. + * @return a daeSmartRef to the textureDEPTH element. + */ + const domTextureDEPTHRef getTextureDEPTH() const { return elemTextureDEPTH; } + /** + * Gets the texture1D_enable element. + * @return a daeSmartRef to the texture1D_enable element. + */ + const domTexture1D_enableRef getTexture1D_enable() const { return elemTexture1D_enable; } + /** + * Gets the texture2D_enable element. + * @return a daeSmartRef to the texture2D_enable element. + */ + const domTexture2D_enableRef getTexture2D_enable() const { return elemTexture2D_enable; } + /** + * Gets the texture3D_enable element. + * @return a daeSmartRef to the texture3D_enable element. + */ + const domTexture3D_enableRef getTexture3D_enable() const { return elemTexture3D_enable; } + /** + * Gets the textureCUBE_enable element. + * @return a daeSmartRef to the textureCUBE_enable element. + */ + const domTextureCUBE_enableRef getTextureCUBE_enable() const { return elemTextureCUBE_enable; } + /** + * Gets the textureRECT_enable element. + * @return a daeSmartRef to the textureRECT_enable element. + */ + const domTextureRECT_enableRef getTextureRECT_enable() const { return elemTextureRECT_enable; } + /** + * Gets the textureDEPTH_enable element. + * @return a daeSmartRef to the textureDEPTH_enable element. + */ + const domTextureDEPTH_enableRef getTextureDEPTH_enable() const { return elemTextureDEPTH_enable; } + /** + * Gets the texture_env_color element. + * @return a daeSmartRef to the texture_env_color element. + */ + const domTexture_env_colorRef getTexture_env_color() const { return elemTexture_env_color; } + /** + * Gets the texture_env_mode element. + * @return a daeSmartRef to the texture_env_mode element. + */ + const domTexture_env_modeRef getTexture_env_mode() const { return elemTexture_env_mode; } + /** + * Gets the clip_plane element. + * @return a daeSmartRef to the clip_plane element. + */ + const domClip_planeRef getClip_plane() const { return elemClip_plane; } + /** + * Gets the clip_plane_enable element. + * @return a daeSmartRef to the clip_plane_enable element. + */ + const domClip_plane_enableRef getClip_plane_enable() const { return elemClip_plane_enable; } + /** + * Gets the blend_color element. + * @return a daeSmartRef to the blend_color element. + */ + const domBlend_colorRef getBlend_color() const { return elemBlend_color; } + /** + * Gets the clear_color element. + * @return a daeSmartRef to the clear_color element. + */ + const domClear_colorRef getClear_color() const { return elemClear_color; } + /** + * Gets the clear_stencil element. + * @return a daeSmartRef to the clear_stencil element. + */ + const domClear_stencilRef getClear_stencil() const { return elemClear_stencil; } + /** + * Gets the clear_depth element. + * @return a daeSmartRef to the clear_depth element. + */ + const domClear_depthRef getClear_depth() const { return elemClear_depth; } + /** + * Gets the color_mask element. + * @return a daeSmartRef to the color_mask element. + */ + const domColor_maskRef getColor_mask() const { return elemColor_mask; } + /** + * Gets the depth_bounds element. + * @return a daeSmartRef to the depth_bounds element. + */ + const domDepth_boundsRef getDepth_bounds() const { return elemDepth_bounds; } + /** + * Gets the depth_mask element. + * @return a daeSmartRef to the depth_mask element. + */ + const domDepth_maskRef getDepth_mask() const { return elemDepth_mask; } + /** + * Gets the depth_range element. + * @return a daeSmartRef to the depth_range element. + */ + const domDepth_rangeRef getDepth_range() const { return elemDepth_range; } + /** + * Gets the fog_density element. + * @return a daeSmartRef to the fog_density element. + */ + const domFog_densityRef getFog_density() const { return elemFog_density; } + /** + * Gets the fog_start element. + * @return a daeSmartRef to the fog_start element. + */ + const domFog_startRef getFog_start() const { return elemFog_start; } + /** + * Gets the fog_end element. + * @return a daeSmartRef to the fog_end element. + */ + const domFog_endRef getFog_end() const { return elemFog_end; } + /** + * Gets the fog_color element. + * @return a daeSmartRef to the fog_color element. + */ + const domFog_colorRef getFog_color() const { return elemFog_color; } + /** + * Gets the light_model_ambient element. + * @return a daeSmartRef to the light_model_ambient element. + */ + const domLight_model_ambientRef getLight_model_ambient() const { return elemLight_model_ambient; } + /** + * Gets the lighting_enable element. + * @return a daeSmartRef to the lighting_enable element. + */ + const domLighting_enableRef getLighting_enable() const { return elemLighting_enable; } + /** + * Gets the line_stipple element. + * @return a daeSmartRef to the line_stipple element. + */ + const domLine_stippleRef getLine_stipple() const { return elemLine_stipple; } + /** + * Gets the line_width element. + * @return a daeSmartRef to the line_width element. + */ + const domLine_widthRef getLine_width() const { return elemLine_width; } + /** + * Gets the material_ambient element. + * @return a daeSmartRef to the material_ambient element. + */ + const domMaterial_ambientRef getMaterial_ambient() const { return elemMaterial_ambient; } + /** + * Gets the material_diffuse element. + * @return a daeSmartRef to the material_diffuse element. + */ + const domMaterial_diffuseRef getMaterial_diffuse() const { return elemMaterial_diffuse; } + /** + * Gets the material_emission element. + * @return a daeSmartRef to the material_emission element. + */ + const domMaterial_emissionRef getMaterial_emission() const { return elemMaterial_emission; } + /** + * Gets the material_shininess element. + * @return a daeSmartRef to the material_shininess element. + */ + const domMaterial_shininessRef getMaterial_shininess() const { return elemMaterial_shininess; } + /** + * Gets the material_specular element. + * @return a daeSmartRef to the material_specular element. + */ + const domMaterial_specularRef getMaterial_specular() const { return elemMaterial_specular; } + /** + * Gets the model_view_matrix element. + * @return a daeSmartRef to the model_view_matrix element. + */ + const domModel_view_matrixRef getModel_view_matrix() const { return elemModel_view_matrix; } + /** + * Gets the point_distance_attenuation element. + * @return a daeSmartRef to the point_distance_attenuation element. + */ + const domPoint_distance_attenuationRef getPoint_distance_attenuation() const { return elemPoint_distance_attenuation; } + /** + * Gets the point_fade_threshold_size element. + * @return a daeSmartRef to the point_fade_threshold_size element. + */ + const domPoint_fade_threshold_sizeRef getPoint_fade_threshold_size() const { return elemPoint_fade_threshold_size; } + /** + * Gets the point_size element. + * @return a daeSmartRef to the point_size element. + */ + const domPoint_sizeRef getPoint_size() const { return elemPoint_size; } + /** + * Gets the point_size_min element. + * @return a daeSmartRef to the point_size_min element. + */ + const domPoint_size_minRef getPoint_size_min() const { return elemPoint_size_min; } + /** + * Gets the point_size_max element. + * @return a daeSmartRef to the point_size_max element. + */ + const domPoint_size_maxRef getPoint_size_max() const { return elemPoint_size_max; } + /** + * Gets the polygon_offset element. + * @return a daeSmartRef to the polygon_offset element. + */ + const domPolygon_offsetRef getPolygon_offset() const { return elemPolygon_offset; } + /** + * Gets the projection_matrix element. + * @return a daeSmartRef to the projection_matrix element. + */ + const domProjection_matrixRef getProjection_matrix() const { return elemProjection_matrix; } + /** + * Gets the scissor element. + * @return a daeSmartRef to the scissor element. + */ + const domScissorRef getScissor() const { return elemScissor; } + /** + * Gets the stencil_mask element. + * @return a daeSmartRef to the stencil_mask element. + */ + const domStencil_maskRef getStencil_mask() const { return elemStencil_mask; } + /** + * Gets the alpha_test_enable element. + * @return a daeSmartRef to the alpha_test_enable element. + */ + const domAlpha_test_enableRef getAlpha_test_enable() const { return elemAlpha_test_enable; } + /** + * Gets the auto_normal_enable element. + * @return a daeSmartRef to the auto_normal_enable element. + */ + const domAuto_normal_enableRef getAuto_normal_enable() const { return elemAuto_normal_enable; } + /** + * Gets the blend_enable element. + * @return a daeSmartRef to the blend_enable element. + */ + const domBlend_enableRef getBlend_enable() const { return elemBlend_enable; } + /** + * Gets the color_logic_op_enable element. + * @return a daeSmartRef to the color_logic_op_enable element. + */ + const domColor_logic_op_enableRef getColor_logic_op_enable() const { return elemColor_logic_op_enable; } + /** + * Gets the color_material_enable element. + * @return a daeSmartRef to the color_material_enable element. + */ + const domColor_material_enableRef getColor_material_enable() const { return elemColor_material_enable; } + /** + * Gets the cull_face_enable element. + * @return a daeSmartRef to the cull_face_enable element. + */ + const domCull_face_enableRef getCull_face_enable() const { return elemCull_face_enable; } + /** + * Gets the depth_bounds_enable element. + * @return a daeSmartRef to the depth_bounds_enable element. + */ + const domDepth_bounds_enableRef getDepth_bounds_enable() const { return elemDepth_bounds_enable; } + /** + * Gets the depth_clamp_enable element. + * @return a daeSmartRef to the depth_clamp_enable element. + */ + const domDepth_clamp_enableRef getDepth_clamp_enable() const { return elemDepth_clamp_enable; } + /** + * Gets the depth_test_enable element. + * @return a daeSmartRef to the depth_test_enable element. + */ + const domDepth_test_enableRef getDepth_test_enable() const { return elemDepth_test_enable; } + /** + * Gets the dither_enable element. + * @return a daeSmartRef to the dither_enable element. + */ + const domDither_enableRef getDither_enable() const { return elemDither_enable; } + /** + * Gets the fog_enable element. + * @return a daeSmartRef to the fog_enable element. + */ + const domFog_enableRef getFog_enable() const { return elemFog_enable; } + /** + * Gets the light_model_local_viewer_enable element. + * @return a daeSmartRef to the light_model_local_viewer_enable element. + */ + const domLight_model_local_viewer_enableRef getLight_model_local_viewer_enable() const { return elemLight_model_local_viewer_enable; } + /** + * Gets the light_model_two_side_enable element. + * @return a daeSmartRef to the light_model_two_side_enable element. + */ + const domLight_model_two_side_enableRef getLight_model_two_side_enable() const { return elemLight_model_two_side_enable; } + /** + * Gets the line_smooth_enable element. + * @return a daeSmartRef to the line_smooth_enable element. + */ + const domLine_smooth_enableRef getLine_smooth_enable() const { return elemLine_smooth_enable; } + /** + * Gets the line_stipple_enable element. + * @return a daeSmartRef to the line_stipple_enable element. + */ + const domLine_stipple_enableRef getLine_stipple_enable() const { return elemLine_stipple_enable; } + /** + * Gets the logic_op_enable element. + * @return a daeSmartRef to the logic_op_enable element. + */ + const domLogic_op_enableRef getLogic_op_enable() const { return elemLogic_op_enable; } + /** + * Gets the multisample_enable element. + * @return a daeSmartRef to the multisample_enable element. + */ + const domMultisample_enableRef getMultisample_enable() const { return elemMultisample_enable; } + /** + * Gets the normalize_enable element. + * @return a daeSmartRef to the normalize_enable element. + */ + const domNormalize_enableRef getNormalize_enable() const { return elemNormalize_enable; } + /** + * Gets the point_smooth_enable element. + * @return a daeSmartRef to the point_smooth_enable element. + */ + const domPoint_smooth_enableRef getPoint_smooth_enable() const { return elemPoint_smooth_enable; } + /** + * Gets the polygon_offset_fill_enable element. + * @return a daeSmartRef to the polygon_offset_fill_enable element. + */ + const domPolygon_offset_fill_enableRef getPolygon_offset_fill_enable() const { return elemPolygon_offset_fill_enable; } + /** + * Gets the polygon_offset_line_enable element. + * @return a daeSmartRef to the polygon_offset_line_enable element. + */ + const domPolygon_offset_line_enableRef getPolygon_offset_line_enable() const { return elemPolygon_offset_line_enable; } + /** + * Gets the polygon_offset_point_enable element. + * @return a daeSmartRef to the polygon_offset_point_enable element. + */ + const domPolygon_offset_point_enableRef getPolygon_offset_point_enable() const { return elemPolygon_offset_point_enable; } + /** + * Gets the polygon_smooth_enable element. + * @return a daeSmartRef to the polygon_smooth_enable element. + */ + const domPolygon_smooth_enableRef getPolygon_smooth_enable() const { return elemPolygon_smooth_enable; } + /** + * Gets the polygon_stipple_enable element. + * @return a daeSmartRef to the polygon_stipple_enable element. + */ + const domPolygon_stipple_enableRef getPolygon_stipple_enable() const { return elemPolygon_stipple_enable; } + /** + * Gets the rescale_normal_enable element. + * @return a daeSmartRef to the rescale_normal_enable element. + */ + const domRescale_normal_enableRef getRescale_normal_enable() const { return elemRescale_normal_enable; } + /** + * Gets the sample_alpha_to_coverage_enable element. + * @return a daeSmartRef to the sample_alpha_to_coverage_enable element. + */ + const domSample_alpha_to_coverage_enableRef getSample_alpha_to_coverage_enable() const { return elemSample_alpha_to_coverage_enable; } + /** + * Gets the sample_alpha_to_one_enable element. + * @return a daeSmartRef to the sample_alpha_to_one_enable element. + */ + const domSample_alpha_to_one_enableRef getSample_alpha_to_one_enable() const { return elemSample_alpha_to_one_enable; } + /** + * Gets the sample_coverage_enable element. + * @return a daeSmartRef to the sample_coverage_enable element. + */ + const domSample_coverage_enableRef getSample_coverage_enable() const { return elemSample_coverage_enable; } + /** + * Gets the scissor_test_enable element. + * @return a daeSmartRef to the scissor_test_enable element. + */ + const domScissor_test_enableRef getScissor_test_enable() const { return elemScissor_test_enable; } + /** + * Gets the stencil_test_enable element. + * @return a daeSmartRef to the stencil_test_enable element. + */ + const domStencil_test_enableRef getStencil_test_enable() const { return elemStencil_test_enable; } + /** + * Gets the gl_hook_abstract element. + * @return a daeSmartRef to the gl_hook_abstract element. + */ + const domGl_hook_abstractRef getGl_hook_abstract() const { return elemGl_hook_abstract; } + /** + * Gets the _contents array. + * @return Returns a reference to the _contents element array. + */ + daeElementRefArray &getContents() { return _contents; } + /** + * Gets the _contents array. + * @return Returns a constant reference to the _contents element array. + */ + const daeElementRefArray &getContents() const { return _contents; } + +protected: + /** + * Constructor + */ + domGl_pipeline_settings() : elemAlpha_func(), elemBlend_func(), elemBlend_func_separate(), elemBlend_equation(), elemBlend_equation_separate(), elemColor_material(), elemCull_face(), elemDepth_func(), elemFog_mode(), elemFog_coord_src(), elemFront_face(), elemLight_model_color_control(), elemLogic_op(), elemPolygon_mode(), elemShade_model(), elemStencil_func(), elemStencil_op(), elemStencil_func_separate(), elemStencil_op_separate(), elemStencil_mask_separate(), elemLight_enable(), elemLight_ambient(), elemLight_diffuse(), elemLight_specular(), elemLight_position(), elemLight_constant_attenuation(), elemLight_linear_attenuation(), elemLight_quadratic_attenuation(), elemLight_spot_cutoff(), elemLight_spot_direction(), elemLight_spot_exponent(), elemTexture1D(), elemTexture2D(), elemTexture3D(), elemTextureCUBE(), elemTextureRECT(), elemTextureDEPTH(), elemTexture1D_enable(), elemTexture2D_enable(), elemTexture3D_enable(), elemTextureCUBE_enable(), elemTextureRECT_enable(), elemTextureDEPTH_enable(), elemTexture_env_color(), elemTexture_env_mode(), elemClip_plane(), elemClip_plane_enable(), elemBlend_color(), elemClear_color(), elemClear_stencil(), elemClear_depth(), elemColor_mask(), elemDepth_bounds(), elemDepth_mask(), elemDepth_range(), elemFog_density(), elemFog_start(), elemFog_end(), elemFog_color(), elemLight_model_ambient(), elemLighting_enable(), elemLine_stipple(), elemLine_width(), elemMaterial_ambient(), elemMaterial_diffuse(), elemMaterial_emission(), elemMaterial_shininess(), elemMaterial_specular(), elemModel_view_matrix(), elemPoint_distance_attenuation(), elemPoint_fade_threshold_size(), elemPoint_size(), elemPoint_size_min(), elemPoint_size_max(), elemPolygon_offset(), elemProjection_matrix(), elemScissor(), elemStencil_mask(), elemAlpha_test_enable(), elemAuto_normal_enable(), elemBlend_enable(), elemColor_logic_op_enable(), elemColor_material_enable(), elemCull_face_enable(), elemDepth_bounds_enable(), elemDepth_clamp_enable(), elemDepth_test_enable(), elemDither_enable(), elemFog_enable(), elemLight_model_local_viewer_enable(), elemLight_model_two_side_enable(), elemLine_smooth_enable(), elemLine_stipple_enable(), elemLogic_op_enable(), elemMultisample_enable(), elemNormalize_enable(), elemPoint_smooth_enable(), elemPolygon_offset_fill_enable(), elemPolygon_offset_line_enable(), elemPolygon_offset_point_enable(), elemPolygon_smooth_enable(), elemPolygon_stipple_enable(), elemRescale_normal_enable(), elemSample_alpha_to_coverage_enable(), elemSample_alpha_to_one_enable(), elemSample_coverage_enable(), elemScissor_test_enable(), elemStencil_test_enable(), elemGl_hook_abstract() {} + /** + * Destructor + */ + virtual ~domGl_pipeline_settings() {} + /** + * Copy Constructor + */ + domGl_pipeline_settings( const domGl_pipeline_settings &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domGl_pipeline_settings &operator=( const domGl_pipeline_settings &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGl_sampler1D.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGl_sampler1D.h new file mode 100644 index 00000000..84a08470 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGl_sampler1D.h @@ -0,0 +1,93 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domGl_sampler1D_h__ +#define __domGl_sampler1D_h__ + +#include +#include + +#include + +/** + * A one-dimensional texture sampler for the GLSL profile. + */ +class domGl_sampler1D_complexType : public domFx_sampler1D_common_complexType +{ + +protected: + /** + * Constructor + */ + domGl_sampler1D_complexType() {} + /** + * Destructor + */ + virtual ~domGl_sampler1D_complexType() {} + /** + * Copy Constructor + */ + domGl_sampler1D_complexType( const domGl_sampler1D_complexType &cpy ) : domFx_sampler1D_common_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domGl_sampler1D_complexType &operator=( const domGl_sampler1D_complexType &cpy ) { (void)cpy; return *this; } +}; + +/** + * An element of type domGl_sampler1D_complexType. + */ +class domGl_sampler1D : public daeElement, public domGl_sampler1D_complexType +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::GL_SAMPLER1D; } +protected: + /** + * Constructor + */ + domGl_sampler1D() {} + /** + * Destructor + */ + virtual ~domGl_sampler1D() {} + /** + * Copy Constructor + */ + domGl_sampler1D( const domGl_sampler1D &cpy ) : daeElement(), domGl_sampler1D_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domGl_sampler1D &operator=( const domGl_sampler1D &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGl_sampler2D.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGl_sampler2D.h new file mode 100644 index 00000000..38d356c5 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGl_sampler2D.h @@ -0,0 +1,93 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domGl_sampler2D_h__ +#define __domGl_sampler2D_h__ + +#include +#include + +#include + +/** + * A two-dimensional texture sampler for the GLSL profile. + */ +class domGl_sampler2D_complexType : public domFx_sampler2D_common_complexType +{ + +protected: + /** + * Constructor + */ + domGl_sampler2D_complexType() {} + /** + * Destructor + */ + virtual ~domGl_sampler2D_complexType() {} + /** + * Copy Constructor + */ + domGl_sampler2D_complexType( const domGl_sampler2D_complexType &cpy ) : domFx_sampler2D_common_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domGl_sampler2D_complexType &operator=( const domGl_sampler2D_complexType &cpy ) { (void)cpy; return *this; } +}; + +/** + * An element of type domGl_sampler2D_complexType. + */ +class domGl_sampler2D : public daeElement, public domGl_sampler2D_complexType +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::GL_SAMPLER2D; } +protected: + /** + * Constructor + */ + domGl_sampler2D() {} + /** + * Destructor + */ + virtual ~domGl_sampler2D() {} + /** + * Copy Constructor + */ + domGl_sampler2D( const domGl_sampler2D &cpy ) : daeElement(), domGl_sampler2D_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domGl_sampler2D &operator=( const domGl_sampler2D &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGl_sampler3D.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGl_sampler3D.h new file mode 100644 index 00000000..4724d022 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGl_sampler3D.h @@ -0,0 +1,93 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domGl_sampler3D_h__ +#define __domGl_sampler3D_h__ + +#include +#include + +#include + +/** + * A three-dimensional texture sampler for the GLSL profile. + */ +class domGl_sampler3D_complexType : public domFx_sampler3D_common_complexType +{ + +protected: + /** + * Constructor + */ + domGl_sampler3D_complexType() {} + /** + * Destructor + */ + virtual ~domGl_sampler3D_complexType() {} + /** + * Copy Constructor + */ + domGl_sampler3D_complexType( const domGl_sampler3D_complexType &cpy ) : domFx_sampler3D_common_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domGl_sampler3D_complexType &operator=( const domGl_sampler3D_complexType &cpy ) { (void)cpy; return *this; } +}; + +/** + * An element of type domGl_sampler3D_complexType. + */ +class domGl_sampler3D : public daeElement, public domGl_sampler3D_complexType +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::GL_SAMPLER3D; } +protected: + /** + * Constructor + */ + domGl_sampler3D() {} + /** + * Destructor + */ + virtual ~domGl_sampler3D() {} + /** + * Copy Constructor + */ + domGl_sampler3D( const domGl_sampler3D &cpy ) : daeElement(), domGl_sampler3D_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domGl_sampler3D &operator=( const domGl_sampler3D &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGl_samplerCUBE.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGl_samplerCUBE.h new file mode 100644 index 00000000..082fc0d5 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGl_samplerCUBE.h @@ -0,0 +1,93 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domGl_samplerCUBE_h__ +#define __domGl_samplerCUBE_h__ + +#include +#include + +#include + +/** + * A cube map texture sampler for the GLSL profile. + */ +class domGl_samplerCUBE_complexType : public domFx_samplerCUBE_common_complexType +{ + +protected: + /** + * Constructor + */ + domGl_samplerCUBE_complexType() {} + /** + * Destructor + */ + virtual ~domGl_samplerCUBE_complexType() {} + /** + * Copy Constructor + */ + domGl_samplerCUBE_complexType( const domGl_samplerCUBE_complexType &cpy ) : domFx_samplerCUBE_common_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domGl_samplerCUBE_complexType &operator=( const domGl_samplerCUBE_complexType &cpy ) { (void)cpy; return *this; } +}; + +/** + * An element of type domGl_samplerCUBE_complexType. + */ +class domGl_samplerCUBE : public daeElement, public domGl_samplerCUBE_complexType +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::GL_SAMPLERCUBE; } +protected: + /** + * Constructor + */ + domGl_samplerCUBE() {} + /** + * Destructor + */ + virtual ~domGl_samplerCUBE() {} + /** + * Copy Constructor + */ + domGl_samplerCUBE( const domGl_samplerCUBE &cpy ) : daeElement(), domGl_samplerCUBE_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domGl_samplerCUBE &operator=( const domGl_samplerCUBE &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGl_samplerDEPTH.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGl_samplerDEPTH.h new file mode 100644 index 00000000..11d95f7b --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGl_samplerDEPTH.h @@ -0,0 +1,93 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domGl_samplerDEPTH_h__ +#define __domGl_samplerDEPTH_h__ + +#include +#include + +#include + +/** + * A depth texture sampler for the GLSL profile. + */ +class domGl_samplerDEPTH_complexType : public domFx_samplerDEPTH_common_complexType +{ + +protected: + /** + * Constructor + */ + domGl_samplerDEPTH_complexType() {} + /** + * Destructor + */ + virtual ~domGl_samplerDEPTH_complexType() {} + /** + * Copy Constructor + */ + domGl_samplerDEPTH_complexType( const domGl_samplerDEPTH_complexType &cpy ) : domFx_samplerDEPTH_common_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domGl_samplerDEPTH_complexType &operator=( const domGl_samplerDEPTH_complexType &cpy ) { (void)cpy; return *this; } +}; + +/** + * An element of type domGl_samplerDEPTH_complexType. + */ +class domGl_samplerDEPTH : public daeElement, public domGl_samplerDEPTH_complexType +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::GL_SAMPLERDEPTH; } +protected: + /** + * Constructor + */ + domGl_samplerDEPTH() {} + /** + * Destructor + */ + virtual ~domGl_samplerDEPTH() {} + /** + * Copy Constructor + */ + domGl_samplerDEPTH( const domGl_samplerDEPTH &cpy ) : daeElement(), domGl_samplerDEPTH_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domGl_samplerDEPTH &operator=( const domGl_samplerDEPTH &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGl_samplerRECT.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGl_samplerRECT.h new file mode 100644 index 00000000..d4b09541 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGl_samplerRECT.h @@ -0,0 +1,93 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domGl_samplerRECT_h__ +#define __domGl_samplerRECT_h__ + +#include +#include + +#include + +/** + * A two-dimensional texture sampler for the GLSL profile. + */ +class domGl_samplerRECT_complexType : public domFx_samplerRECT_common_complexType +{ + +protected: + /** + * Constructor + */ + domGl_samplerRECT_complexType() {} + /** + * Destructor + */ + virtual ~domGl_samplerRECT_complexType() {} + /** + * Copy Constructor + */ + domGl_samplerRECT_complexType( const domGl_samplerRECT_complexType &cpy ) : domFx_samplerRECT_common_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domGl_samplerRECT_complexType &operator=( const domGl_samplerRECT_complexType &cpy ) { (void)cpy; return *this; } +}; + +/** + * An element of type domGl_samplerRECT_complexType. + */ +class domGl_samplerRECT : public daeElement, public domGl_samplerRECT_complexType +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::GL_SAMPLERRECT; } +protected: + /** + * Constructor + */ + domGl_samplerRECT() {} + /** + * Destructor + */ + virtual ~domGl_samplerRECT() {} + /** + * Copy Constructor + */ + domGl_samplerRECT( const domGl_samplerRECT &cpy ) : daeElement(), domGl_samplerRECT_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domGl_samplerRECT &operator=( const domGl_samplerRECT &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGles_basic_type_common.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGles_basic_type_common.h new file mode 100644 index 00000000..901f7541 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGles_basic_type_common.h @@ -0,0 +1,2358 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domGles_basic_type_common_h__ +#define __domGles_basic_type_common_h__ + +#include +#include + +#include +#include +#include +#include + +/** + * A group that defines the available variable types for GLES parameters. + */ +class domGles_basic_type_common : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::GLES_BASIC_TYPE_COMMON; } +public: + class domBool; + + typedef daeSmartRef domBoolRef; + typedef daeTArray domBool_Array; + + class domBool : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::BOOL; } + + protected: // Value + /** + * The ::domBool value of the text data of this element. + */ + ::domBool _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a ::domBool of the value. + */ + ::domBool getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( ::domBool val ) { _value = val; } + + protected: + /** + * Constructor + */ + domBool() : _value() {} + /** + * Destructor + */ + virtual ~domBool() {} + /** + * Copy Constructor + */ + domBool( const domBool &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domBool &operator=( const domBool &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domBool2; + + typedef daeSmartRef domBool2Ref; + typedef daeTArray domBool2_Array; + + class domBool2 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::BOOL2; } + + protected: // Value + /** + * The ::domBool2 value of the text data of this element. + */ + ::domBool2 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a ::domBool2 reference of the _value array. + */ + ::domBool2 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant ::domBool2 reference of the _value array. + */ + const ::domBool2 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const ::domBool2 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domBool2() : _value() {} + /** + * Destructor + */ + virtual ~domBool2() {} + /** + * Copy Constructor + */ + domBool2( const domBool2 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domBool2 &operator=( const domBool2 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domBool3; + + typedef daeSmartRef domBool3Ref; + typedef daeTArray domBool3_Array; + + class domBool3 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::BOOL3; } + + protected: // Value + /** + * The ::domBool3 value of the text data of this element. + */ + ::domBool3 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a ::domBool3 reference of the _value array. + */ + ::domBool3 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant ::domBool3 reference of the _value array. + */ + const ::domBool3 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const ::domBool3 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domBool3() : _value() {} + /** + * Destructor + */ + virtual ~domBool3() {} + /** + * Copy Constructor + */ + domBool3( const domBool3 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domBool3 &operator=( const domBool3 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domBool4; + + typedef daeSmartRef domBool4Ref; + typedef daeTArray domBool4_Array; + + class domBool4 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::BOOL4; } + + protected: // Value + /** + * The ::domBool4 value of the text data of this element. + */ + ::domBool4 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a ::domBool4 reference of the _value array. + */ + ::domBool4 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant ::domBool4 reference of the _value array. + */ + const ::domBool4 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const ::domBool4 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domBool4() : _value() {} + /** + * Destructor + */ + virtual ~domBool4() {} + /** + * Copy Constructor + */ + domBool4( const domBool4 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domBool4 &operator=( const domBool4 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domInt; + + typedef daeSmartRef domIntRef; + typedef daeTArray domInt_Array; + + class domInt : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::INT; } + + protected: // Value + /** + * The ::domInt value of the text data of this element. + */ + ::domInt _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a ::domInt of the value. + */ + ::domInt getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( ::domInt val ) { _value = val; } + + protected: + /** + * Constructor + */ + domInt() : _value() {} + /** + * Destructor + */ + virtual ~domInt() {} + /** + * Copy Constructor + */ + domInt( const domInt &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domInt &operator=( const domInt &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domInt2; + + typedef daeSmartRef domInt2Ref; + typedef daeTArray domInt2_Array; + + class domInt2 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::INT2; } + + protected: // Value + /** + * The ::domInt2 value of the text data of this element. + */ + ::domInt2 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a ::domInt2 reference of the _value array. + */ + ::domInt2 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant ::domInt2 reference of the _value array. + */ + const ::domInt2 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const ::domInt2 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domInt2() : _value() {} + /** + * Destructor + */ + virtual ~domInt2() {} + /** + * Copy Constructor + */ + domInt2( const domInt2 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domInt2 &operator=( const domInt2 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domInt3; + + typedef daeSmartRef domInt3Ref; + typedef daeTArray domInt3_Array; + + class domInt3 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::INT3; } + + protected: // Value + /** + * The ::domInt3 value of the text data of this element. + */ + ::domInt3 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a ::domInt3 reference of the _value array. + */ + ::domInt3 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant ::domInt3 reference of the _value array. + */ + const ::domInt3 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const ::domInt3 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domInt3() : _value() {} + /** + * Destructor + */ + virtual ~domInt3() {} + /** + * Copy Constructor + */ + domInt3( const domInt3 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domInt3 &operator=( const domInt3 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domInt4; + + typedef daeSmartRef domInt4Ref; + typedef daeTArray domInt4_Array; + + class domInt4 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::INT4; } + + protected: // Value + /** + * The ::domInt4 value of the text data of this element. + */ + ::domInt4 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a ::domInt4 reference of the _value array. + */ + ::domInt4 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant ::domInt4 reference of the _value array. + */ + const ::domInt4 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const ::domInt4 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domInt4() : _value() {} + /** + * Destructor + */ + virtual ~domInt4() {} + /** + * Copy Constructor + */ + domInt4( const domInt4 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domInt4 &operator=( const domInt4 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFloat; + + typedef daeSmartRef domFloatRef; + typedef daeTArray domFloat_Array; + + class domFloat : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FLOAT; } + + protected: // Value + /** + * The ::domFloat value of the text data of this element. + */ + ::domFloat _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a ::domFloat of the value. + */ + ::domFloat getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( ::domFloat val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFloat() : _value() {} + /** + * Destructor + */ + virtual ~domFloat() {} + /** + * Copy Constructor + */ + domFloat( const domFloat &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFloat &operator=( const domFloat &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFloat2; + + typedef daeSmartRef domFloat2Ref; + typedef daeTArray domFloat2_Array; + + class domFloat2 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FLOAT2; } + + protected: // Value + /** + * The ::domFloat2 value of the text data of this element. + */ + ::domFloat2 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a ::domFloat2 reference of the _value array. + */ + ::domFloat2 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant ::domFloat2 reference of the _value array. + */ + const ::domFloat2 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const ::domFloat2 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFloat2() : _value() {} + /** + * Destructor + */ + virtual ~domFloat2() {} + /** + * Copy Constructor + */ + domFloat2( const domFloat2 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFloat2 &operator=( const domFloat2 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFloat3; + + typedef daeSmartRef domFloat3Ref; + typedef daeTArray domFloat3_Array; + + class domFloat3 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FLOAT3; } + + protected: // Value + /** + * The ::domFloat3 value of the text data of this element. + */ + ::domFloat3 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a ::domFloat3 reference of the _value array. + */ + ::domFloat3 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant ::domFloat3 reference of the _value array. + */ + const ::domFloat3 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const ::domFloat3 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFloat3() : _value() {} + /** + * Destructor + */ + virtual ~domFloat3() {} + /** + * Copy Constructor + */ + domFloat3( const domFloat3 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFloat3 &operator=( const domFloat3 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFloat4; + + typedef daeSmartRef domFloat4Ref; + typedef daeTArray domFloat4_Array; + + class domFloat4 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FLOAT4; } + + protected: // Value + /** + * The ::domFloat4 value of the text data of this element. + */ + ::domFloat4 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a ::domFloat4 reference of the _value array. + */ + ::domFloat4 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant ::domFloat4 reference of the _value array. + */ + const ::domFloat4 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const ::domFloat4 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFloat4() : _value() {} + /** + * Destructor + */ + virtual ~domFloat4() {} + /** + * Copy Constructor + */ + domFloat4( const domFloat4 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFloat4 &operator=( const domFloat4 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFloat1x1; + + typedef daeSmartRef domFloat1x1Ref; + typedef daeTArray domFloat1x1_Array; + + class domFloat1x1 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FLOAT1X1; } + + protected: // Value + /** + * The ::domFloat value of the text data of this element. + */ + ::domFloat _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a ::domFloat of the value. + */ + ::domFloat getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( ::domFloat val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFloat1x1() : _value() {} + /** + * Destructor + */ + virtual ~domFloat1x1() {} + /** + * Copy Constructor + */ + domFloat1x1( const domFloat1x1 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFloat1x1 &operator=( const domFloat1x1 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFloat1x2; + + typedef daeSmartRef domFloat1x2Ref; + typedef daeTArray domFloat1x2_Array; + + class domFloat1x2 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FLOAT1X2; } + + protected: // Value + /** + * The ::domFloat2 value of the text data of this element. + */ + ::domFloat2 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a ::domFloat2 reference of the _value array. + */ + ::domFloat2 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant ::domFloat2 reference of the _value array. + */ + const ::domFloat2 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const ::domFloat2 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFloat1x2() : _value() {} + /** + * Destructor + */ + virtual ~domFloat1x2() {} + /** + * Copy Constructor + */ + domFloat1x2( const domFloat1x2 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFloat1x2 &operator=( const domFloat1x2 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFloat1x3; + + typedef daeSmartRef domFloat1x3Ref; + typedef daeTArray domFloat1x3_Array; + + class domFloat1x3 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FLOAT1X3; } + + protected: // Value + /** + * The ::domFloat3 value of the text data of this element. + */ + ::domFloat3 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a ::domFloat3 reference of the _value array. + */ + ::domFloat3 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant ::domFloat3 reference of the _value array. + */ + const ::domFloat3 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const ::domFloat3 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFloat1x3() : _value() {} + /** + * Destructor + */ + virtual ~domFloat1x3() {} + /** + * Copy Constructor + */ + domFloat1x3( const domFloat1x3 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFloat1x3 &operator=( const domFloat1x3 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFloat1x4; + + typedef daeSmartRef domFloat1x4Ref; + typedef daeTArray domFloat1x4_Array; + + class domFloat1x4 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FLOAT1X4; } + + protected: // Value + /** + * The ::domFloat4 value of the text data of this element. + */ + ::domFloat4 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a ::domFloat4 reference of the _value array. + */ + ::domFloat4 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant ::domFloat4 reference of the _value array. + */ + const ::domFloat4 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const ::domFloat4 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFloat1x4() : _value() {} + /** + * Destructor + */ + virtual ~domFloat1x4() {} + /** + * Copy Constructor + */ + domFloat1x4( const domFloat1x4 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFloat1x4 &operator=( const domFloat1x4 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFloat2x1; + + typedef daeSmartRef domFloat2x1Ref; + typedef daeTArray domFloat2x1_Array; + + class domFloat2x1 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FLOAT2X1; } + + protected: // Value + /** + * The ::domFloat2 value of the text data of this element. + */ + ::domFloat2 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a ::domFloat2 reference of the _value array. + */ + ::domFloat2 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant ::domFloat2 reference of the _value array. + */ + const ::domFloat2 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const ::domFloat2 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFloat2x1() : _value() {} + /** + * Destructor + */ + virtual ~domFloat2x1() {} + /** + * Copy Constructor + */ + domFloat2x1( const domFloat2x1 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFloat2x1 &operator=( const domFloat2x1 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFloat2x2; + + typedef daeSmartRef domFloat2x2Ref; + typedef daeTArray domFloat2x2_Array; + + class domFloat2x2 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FLOAT2X2; } + + protected: // Value + /** + * The ::domFloat2x2 value of the text data of this element. + */ + ::domFloat2x2 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a ::domFloat2x2 reference of the _value array. + */ + ::domFloat2x2 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant ::domFloat2x2 reference of the _value array. + */ + const ::domFloat2x2 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const ::domFloat2x2 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFloat2x2() : _value() {} + /** + * Destructor + */ + virtual ~domFloat2x2() {} + /** + * Copy Constructor + */ + domFloat2x2( const domFloat2x2 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFloat2x2 &operator=( const domFloat2x2 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFloat2x3; + + typedef daeSmartRef domFloat2x3Ref; + typedef daeTArray domFloat2x3_Array; + + class domFloat2x3 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FLOAT2X3; } + + protected: // Value + /** + * The ::domFloat2x3 value of the text data of this element. + */ + ::domFloat2x3 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a ::domFloat2x3 reference of the _value array. + */ + ::domFloat2x3 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant ::domFloat2x3 reference of the _value array. + */ + const ::domFloat2x3 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const ::domFloat2x3 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFloat2x3() : _value() {} + /** + * Destructor + */ + virtual ~domFloat2x3() {} + /** + * Copy Constructor + */ + domFloat2x3( const domFloat2x3 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFloat2x3 &operator=( const domFloat2x3 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFloat2x4; + + typedef daeSmartRef domFloat2x4Ref; + typedef daeTArray domFloat2x4_Array; + + class domFloat2x4 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FLOAT2X4; } + + protected: // Value + /** + * The ::domFloat2x4 value of the text data of this element. + */ + ::domFloat2x4 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a ::domFloat2x4 reference of the _value array. + */ + ::domFloat2x4 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant ::domFloat2x4 reference of the _value array. + */ + const ::domFloat2x4 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const ::domFloat2x4 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFloat2x4() : _value() {} + /** + * Destructor + */ + virtual ~domFloat2x4() {} + /** + * Copy Constructor + */ + domFloat2x4( const domFloat2x4 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFloat2x4 &operator=( const domFloat2x4 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFloat3x1; + + typedef daeSmartRef domFloat3x1Ref; + typedef daeTArray domFloat3x1_Array; + + class domFloat3x1 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FLOAT3X1; } + + protected: // Value + /** + * The ::domFloat3 value of the text data of this element. + */ + ::domFloat3 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a ::domFloat3 reference of the _value array. + */ + ::domFloat3 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant ::domFloat3 reference of the _value array. + */ + const ::domFloat3 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const ::domFloat3 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFloat3x1() : _value() {} + /** + * Destructor + */ + virtual ~domFloat3x1() {} + /** + * Copy Constructor + */ + domFloat3x1( const domFloat3x1 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFloat3x1 &operator=( const domFloat3x1 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFloat3x2; + + typedef daeSmartRef domFloat3x2Ref; + typedef daeTArray domFloat3x2_Array; + + class domFloat3x2 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FLOAT3X2; } + + protected: // Value + /** + * The ::domFloat3x2 value of the text data of this element. + */ + ::domFloat3x2 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a ::domFloat3x2 reference of the _value array. + */ + ::domFloat3x2 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant ::domFloat3x2 reference of the _value array. + */ + const ::domFloat3x2 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const ::domFloat3x2 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFloat3x2() : _value() {} + /** + * Destructor + */ + virtual ~domFloat3x2() {} + /** + * Copy Constructor + */ + domFloat3x2( const domFloat3x2 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFloat3x2 &operator=( const domFloat3x2 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFloat3x3; + + typedef daeSmartRef domFloat3x3Ref; + typedef daeTArray domFloat3x3_Array; + + class domFloat3x3 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FLOAT3X3; } + + protected: // Value + /** + * The ::domFloat3x3 value of the text data of this element. + */ + ::domFloat3x3 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a ::domFloat3x3 reference of the _value array. + */ + ::domFloat3x3 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant ::domFloat3x3 reference of the _value array. + */ + const ::domFloat3x3 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const ::domFloat3x3 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFloat3x3() : _value() {} + /** + * Destructor + */ + virtual ~domFloat3x3() {} + /** + * Copy Constructor + */ + domFloat3x3( const domFloat3x3 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFloat3x3 &operator=( const domFloat3x3 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFloat3x4; + + typedef daeSmartRef domFloat3x4Ref; + typedef daeTArray domFloat3x4_Array; + + class domFloat3x4 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FLOAT3X4; } + + protected: // Value + /** + * The ::domFloat3x4 value of the text data of this element. + */ + ::domFloat3x4 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a ::domFloat3x4 reference of the _value array. + */ + ::domFloat3x4 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant ::domFloat3x4 reference of the _value array. + */ + const ::domFloat3x4 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const ::domFloat3x4 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFloat3x4() : _value() {} + /** + * Destructor + */ + virtual ~domFloat3x4() {} + /** + * Copy Constructor + */ + domFloat3x4( const domFloat3x4 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFloat3x4 &operator=( const domFloat3x4 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFloat4x1; + + typedef daeSmartRef domFloat4x1Ref; + typedef daeTArray domFloat4x1_Array; + + class domFloat4x1 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FLOAT4X1; } + + protected: // Value + /** + * The ::domFloat4 value of the text data of this element. + */ + ::domFloat4 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a ::domFloat4 reference of the _value array. + */ + ::domFloat4 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant ::domFloat4 reference of the _value array. + */ + const ::domFloat4 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const ::domFloat4 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFloat4x1() : _value() {} + /** + * Destructor + */ + virtual ~domFloat4x1() {} + /** + * Copy Constructor + */ + domFloat4x1( const domFloat4x1 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFloat4x1 &operator=( const domFloat4x1 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFloat4x2; + + typedef daeSmartRef domFloat4x2Ref; + typedef daeTArray domFloat4x2_Array; + + class domFloat4x2 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FLOAT4X2; } + + protected: // Value + /** + * The ::domFloat4x2 value of the text data of this element. + */ + ::domFloat4x2 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a ::domFloat4x2 reference of the _value array. + */ + ::domFloat4x2 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant ::domFloat4x2 reference of the _value array. + */ + const ::domFloat4x2 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const ::domFloat4x2 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFloat4x2() : _value() {} + /** + * Destructor + */ + virtual ~domFloat4x2() {} + /** + * Copy Constructor + */ + domFloat4x2( const domFloat4x2 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFloat4x2 &operator=( const domFloat4x2 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFloat4x3; + + typedef daeSmartRef domFloat4x3Ref; + typedef daeTArray domFloat4x3_Array; + + class domFloat4x3 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FLOAT4X3; } + + protected: // Value + /** + * The ::domFloat4x3 value of the text data of this element. + */ + ::domFloat4x3 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a ::domFloat4x3 reference of the _value array. + */ + ::domFloat4x3 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant ::domFloat4x3 reference of the _value array. + */ + const ::domFloat4x3 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const ::domFloat4x3 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFloat4x3() : _value() {} + /** + * Destructor + */ + virtual ~domFloat4x3() {} + /** + * Copy Constructor + */ + domFloat4x3( const domFloat4x3 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFloat4x3 &operator=( const domFloat4x3 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFloat4x4; + + typedef daeSmartRef domFloat4x4Ref; + typedef daeTArray domFloat4x4_Array; + + class domFloat4x4 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FLOAT4X4; } + + protected: // Value + /** + * The ::domFloat4x4 value of the text data of this element. + */ + ::domFloat4x4 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a ::domFloat4x4 reference of the _value array. + */ + ::domFloat4x4 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant ::domFloat4x4 reference of the _value array. + */ + const ::domFloat4x4 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const ::domFloat4x4 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFloat4x4() : _value() {} + /** + * Destructor + */ + virtual ~domFloat4x4() {} + /** + * Copy Constructor + */ + domFloat4x4( const domFloat4x4 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFloat4x4 &operator=( const domFloat4x4 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domEnum; + + typedef daeSmartRef domEnumRef; + typedef daeTArray domEnum_Array; + + class domEnum : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::ENUM; } + + protected: // Value + /** + * The domGles_enumeration value of the text data of this element. + */ + domGles_enumeration _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a domGles_enumeration of the value. + */ + domGles_enumeration getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( domGles_enumeration val ) { _value = val; } + + protected: + /** + * Constructor + */ + domEnum() : _value() {} + /** + * Destructor + */ + virtual ~domEnum() {} + /** + * Copy Constructor + */ + domEnum( const domEnum &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domEnum &operator=( const domEnum &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + + +protected: // Elements + domBoolRef elemBool; + domBool2Ref elemBool2; + domBool3Ref elemBool3; + domBool4Ref elemBool4; + domIntRef elemInt; + domInt2Ref elemInt2; + domInt3Ref elemInt3; + domInt4Ref elemInt4; + domFloatRef elemFloat; + domFloat2Ref elemFloat2; + domFloat3Ref elemFloat3; + domFloat4Ref elemFloat4; + domFloat1x1Ref elemFloat1x1; + domFloat1x2Ref elemFloat1x2; + domFloat1x3Ref elemFloat1x3; + domFloat1x4Ref elemFloat1x4; + domFloat2x1Ref elemFloat2x1; + domFloat2x2Ref elemFloat2x2; + domFloat2x3Ref elemFloat2x3; + domFloat2x4Ref elemFloat2x4; + domFloat3x1Ref elemFloat3x1; + domFloat3x2Ref elemFloat3x2; + domFloat3x3Ref elemFloat3x3; + domFloat3x4Ref elemFloat3x4; + domFloat4x1Ref elemFloat4x1; + domFloat4x2Ref elemFloat4x2; + domFloat4x3Ref elemFloat4x3; + domFloat4x4Ref elemFloat4x4; + domFx_surface_commonRef elemSurface; + domGles_texture_pipelineRef elemTexture_pipeline; + domGles_sampler_stateRef elemSampler_state; + domGles_texture_unitRef elemTexture_unit; + domEnumRef elemEnum; + /** + * Used to preserve order in elements that do not specify strict sequencing of sub-elements. + */ + daeElementRefArray _contents; + /** + * Used to preserve order in elements that have a complex content model. + */ + daeUIntArray _contentsOrder; + + +public: //Accessors and Mutators + /** + * Gets the bool element. + * @return a daeSmartRef to the bool element. + */ + const domBoolRef getBool() const { return elemBool; } + /** + * Gets the bool2 element. + * @return a daeSmartRef to the bool2 element. + */ + const domBool2Ref getBool2() const { return elemBool2; } + /** + * Gets the bool3 element. + * @return a daeSmartRef to the bool3 element. + */ + const domBool3Ref getBool3() const { return elemBool3; } + /** + * Gets the bool4 element. + * @return a daeSmartRef to the bool4 element. + */ + const domBool4Ref getBool4() const { return elemBool4; } + /** + * Gets the int element. + * @return a daeSmartRef to the int element. + */ + const domIntRef getInt() const { return elemInt; } + /** + * Gets the int2 element. + * @return a daeSmartRef to the int2 element. + */ + const domInt2Ref getInt2() const { return elemInt2; } + /** + * Gets the int3 element. + * @return a daeSmartRef to the int3 element. + */ + const domInt3Ref getInt3() const { return elemInt3; } + /** + * Gets the int4 element. + * @return a daeSmartRef to the int4 element. + */ + const domInt4Ref getInt4() const { return elemInt4; } + /** + * Gets the float element. + * @return a daeSmartRef to the float element. + */ + const domFloatRef getFloat() const { return elemFloat; } + /** + * Gets the float2 element. + * @return a daeSmartRef to the float2 element. + */ + const domFloat2Ref getFloat2() const { return elemFloat2; } + /** + * Gets the float3 element. + * @return a daeSmartRef to the float3 element. + */ + const domFloat3Ref getFloat3() const { return elemFloat3; } + /** + * Gets the float4 element. + * @return a daeSmartRef to the float4 element. + */ + const domFloat4Ref getFloat4() const { return elemFloat4; } + /** + * Gets the float1x1 element. + * @return a daeSmartRef to the float1x1 element. + */ + const domFloat1x1Ref getFloat1x1() const { return elemFloat1x1; } + /** + * Gets the float1x2 element. + * @return a daeSmartRef to the float1x2 element. + */ + const domFloat1x2Ref getFloat1x2() const { return elemFloat1x2; } + /** + * Gets the float1x3 element. + * @return a daeSmartRef to the float1x3 element. + */ + const domFloat1x3Ref getFloat1x3() const { return elemFloat1x3; } + /** + * Gets the float1x4 element. + * @return a daeSmartRef to the float1x4 element. + */ + const domFloat1x4Ref getFloat1x4() const { return elemFloat1x4; } + /** + * Gets the float2x1 element. + * @return a daeSmartRef to the float2x1 element. + */ + const domFloat2x1Ref getFloat2x1() const { return elemFloat2x1; } + /** + * Gets the float2x2 element. + * @return a daeSmartRef to the float2x2 element. + */ + const domFloat2x2Ref getFloat2x2() const { return elemFloat2x2; } + /** + * Gets the float2x3 element. + * @return a daeSmartRef to the float2x3 element. + */ + const domFloat2x3Ref getFloat2x3() const { return elemFloat2x3; } + /** + * Gets the float2x4 element. + * @return a daeSmartRef to the float2x4 element. + */ + const domFloat2x4Ref getFloat2x4() const { return elemFloat2x4; } + /** + * Gets the float3x1 element. + * @return a daeSmartRef to the float3x1 element. + */ + const domFloat3x1Ref getFloat3x1() const { return elemFloat3x1; } + /** + * Gets the float3x2 element. + * @return a daeSmartRef to the float3x2 element. + */ + const domFloat3x2Ref getFloat3x2() const { return elemFloat3x2; } + /** + * Gets the float3x3 element. + * @return a daeSmartRef to the float3x3 element. + */ + const domFloat3x3Ref getFloat3x3() const { return elemFloat3x3; } + /** + * Gets the float3x4 element. + * @return a daeSmartRef to the float3x4 element. + */ + const domFloat3x4Ref getFloat3x4() const { return elemFloat3x4; } + /** + * Gets the float4x1 element. + * @return a daeSmartRef to the float4x1 element. + */ + const domFloat4x1Ref getFloat4x1() const { return elemFloat4x1; } + /** + * Gets the float4x2 element. + * @return a daeSmartRef to the float4x2 element. + */ + const domFloat4x2Ref getFloat4x2() const { return elemFloat4x2; } + /** + * Gets the float4x3 element. + * @return a daeSmartRef to the float4x3 element. + */ + const domFloat4x3Ref getFloat4x3() const { return elemFloat4x3; } + /** + * Gets the float4x4 element. + * @return a daeSmartRef to the float4x4 element. + */ + const domFloat4x4Ref getFloat4x4() const { return elemFloat4x4; } + /** + * Gets the surface element. + * @return a daeSmartRef to the surface element. + */ + const domFx_surface_commonRef getSurface() const { return elemSurface; } + /** + * Gets the texture_pipeline element. + * @return a daeSmartRef to the texture_pipeline element. + */ + const domGles_texture_pipelineRef getTexture_pipeline() const { return elemTexture_pipeline; } + /** + * Gets the sampler_state element. + * @return a daeSmartRef to the sampler_state element. + */ + const domGles_sampler_stateRef getSampler_state() const { return elemSampler_state; } + /** + * Gets the texture_unit element. + * @return a daeSmartRef to the texture_unit element. + */ + const domGles_texture_unitRef getTexture_unit() const { return elemTexture_unit; } + /** + * Gets the enum element. + * @return a daeSmartRef to the enum element. + */ + const domEnumRef getEnum() const { return elemEnum; } + /** + * Gets the _contents array. + * @return Returns a reference to the _contents element array. + */ + daeElementRefArray &getContents() { return _contents; } + /** + * Gets the _contents array. + * @return Returns a constant reference to the _contents element array. + */ + const daeElementRefArray &getContents() const { return _contents; } + +protected: + /** + * Constructor + */ + domGles_basic_type_common() : elemBool(), elemBool2(), elemBool3(), elemBool4(), elemInt(), elemInt2(), elemInt3(), elemInt4(), elemFloat(), elemFloat2(), elemFloat3(), elemFloat4(), elemFloat1x1(), elemFloat1x2(), elemFloat1x3(), elemFloat1x4(), elemFloat2x1(), elemFloat2x2(), elemFloat2x3(), elemFloat2x4(), elemFloat3x1(), elemFloat3x2(), elemFloat3x3(), elemFloat3x4(), elemFloat4x1(), elemFloat4x2(), elemFloat4x3(), elemFloat4x4(), elemSurface(), elemTexture_pipeline(), elemSampler_state(), elemTexture_unit(), elemEnum() {} + /** + * Destructor + */ + virtual ~domGles_basic_type_common() {} + /** + * Copy Constructor + */ + domGles_basic_type_common( const domGles_basic_type_common &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domGles_basic_type_common &operator=( const domGles_basic_type_common &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGles_newparam.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGles_newparam.h new file mode 100644 index 00000000..9bec7e8d --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGles_newparam.h @@ -0,0 +1,313 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domGles_newparam_h__ +#define __domGles_newparam_h__ + +#include +#include + +#include +#include + +/** + * Create a new, named param object in the GLES Runtime, assign it a type, + * an initial value, and additional attributes at declaration time. + */ +class domGles_newparam_complexType +{ +public: + class domSemantic; + + typedef daeSmartRef domSemanticRef; + typedef daeTArray domSemantic_Array; + +/** + * The semantic element allows you to specify a semantic for this new param. + */ + class domSemantic : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::SEMANTIC; } + + protected: // Value + /** + * The xsNCName value of the text data of this element. + */ + xsNCName _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return Returns a xsNCName of the value. + */ + xsNCName getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( xsNCName val ) { *(daeStringRef*)&_value = val; } + + protected: + /** + * Constructor + */ + domSemantic() : _value() {} + /** + * Destructor + */ + virtual ~domSemantic() {} + /** + * Copy Constructor + */ + domSemantic( const domSemantic &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domSemantic &operator=( const domSemantic &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domModifier; + + typedef daeSmartRef domModifierRef; + typedef daeTArray domModifier_Array; + +/** + * The modifier element allows you to specify a modifier for this new param. + */ + class domModifier : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::MODIFIER; } + + protected: // Value + /** + * The domFx_modifier_enum_common value of the text data of this element. + */ + domFx_modifier_enum_common _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a domFx_modifier_enum_common of the value. + */ + domFx_modifier_enum_common getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( domFx_modifier_enum_common val ) { _value = val; } + + protected: + /** + * Constructor + */ + domModifier() : _value() {} + /** + * Destructor + */ + virtual ~domModifier() {} + /** + * Copy Constructor + */ + domModifier( const domModifier &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domModifier &operator=( const domModifier &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + +protected: // Attribute +/** + * The sid attribute is a text string value containing the sub-identifier + * of this element. This value must be unique within the scope of the parent + * element. + */ + xsNCName attrSid; + +protected: // Elements +/** + * The annotate element allows you to specify an annotation for this new param. + * @see domAnnotate + */ + domFx_annotate_common_Array elemAnnotate_array; +/** + * The semantic element allows you to specify a semantic for this new param. + * @see domSemantic + */ + domSemanticRef elemSemantic; +/** + * The modifier element allows you to specify a modifier for this new param. + * @see domModifier + */ + domModifierRef elemModifier; + domGles_basic_type_commonRef elemGles_basic_type_common; + +public: //Accessors and Mutators + /** + * Gets the sid attribute. + * @return Returns a xsNCName of the sid attribute. + */ + xsNCName getSid() const { return attrSid; } + /** + * Sets the sid attribute. + * @param atSid The new value for the sid attribute. + */ + void setSid( xsNCName atSid ) { *(daeStringRef*)&attrSid = atSid; } + + /** + * Gets the annotate element array. + * @return Returns a reference to the array of annotate elements. + */ + domFx_annotate_common_Array &getAnnotate_array() { return elemAnnotate_array; } + /** + * Gets the annotate element array. + * @return Returns a constant reference to the array of annotate elements. + */ + const domFx_annotate_common_Array &getAnnotate_array() const { return elemAnnotate_array; } + /** + * Gets the semantic element. + * @return a daeSmartRef to the semantic element. + */ + const domSemanticRef getSemantic() const { return elemSemantic; } + /** + * Gets the modifier element. + * @return a daeSmartRef to the modifier element. + */ + const domModifierRef getModifier() const { return elemModifier; } + /** + * Gets the gles_basic_type_common element. + * @return a daeSmartRef to the gles_basic_type_common element. + */ + const domGles_basic_type_commonRef getGles_basic_type_common() const { return elemGles_basic_type_common; } +protected: + /** + * Constructor + */ + domGles_newparam_complexType() : attrSid(), elemAnnotate_array(), elemSemantic(), elemModifier(), elemGles_basic_type_common() {} + /** + * Destructor + */ + virtual ~domGles_newparam_complexType() {} + /** + * Copy Constructor + */ + domGles_newparam_complexType( const domGles_newparam_complexType &cpy ) { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domGles_newparam_complexType &operator=( const domGles_newparam_complexType &cpy ) { (void)cpy; return *this; } +}; + +/** + * An element of type domGles_newparam_complexType. + */ +class domGles_newparam : public daeElement, public domGles_newparam_complexType +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::GLES_NEWPARAM; } + +public: //Accessors and Mutators + /** + * Gets the sid attribute. + * @return Returns a xsNCName of the sid attribute. + */ + xsNCName getSid() const { return attrSid; } + /** + * Sets the sid attribute. + * @param atSid The new value for the sid attribute. + */ + void setSid( xsNCName atSid ) { *(daeStringRef*)&attrSid = atSid; + _validAttributeArray[0] = true; } + +protected: + /** + * Constructor + */ + domGles_newparam() {} + /** + * Destructor + */ + virtual ~domGles_newparam() {} + /** + * Copy Constructor + */ + domGles_newparam( const domGles_newparam &cpy ) : daeElement(), domGles_newparam_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domGles_newparam &operator=( const domGles_newparam &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGles_pipeline_settings.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGles_pipeline_settings.h new file mode 100644 index 00000000..d903bfd7 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGles_pipeline_settings.h @@ -0,0 +1,7233 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domGles_pipeline_settings_h__ +#define __domGles_pipeline_settings_h__ + +#include +#include + +#include + +/** + * A group that contains the renderstates available for the GLES profile. + */ +class domGles_pipeline_settings : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::GLES_PIPELINE_SETTINGS; } +public: + class domAlpha_func; + + typedef daeSmartRef domAlpha_funcRef; + typedef daeTArray domAlpha_func_Array; + + class domAlpha_func : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::ALPHA_FUNC; } + public: + class domFunc; + + typedef daeSmartRef domFuncRef; + typedef daeTArray domFunc_Array; + + class domFunc : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FUNC; } + protected: // Attributes + domGl_func_type attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domGl_func_type of the value attribute. + */ + domGl_func_type getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domGl_func_type atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domFunc() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domFunc() {} + /** + * Copy Constructor + */ + domFunc( const domFunc &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFunc &operator=( const domFunc &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domValue; + + typedef daeSmartRef domValueRef; + typedef daeTArray domValue_Array; + + class domValue : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::VALUE; } + protected: // Attributes + domGl_alpha_value_type attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domGl_alpha_value_type of the value attribute. + */ + domGl_alpha_value_type getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domGl_alpha_value_type atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domValue() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domValue() {} + /** + * Copy Constructor + */ + domValue( const domValue &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domValue &operator=( const domValue &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + + + protected: // Elements + domFuncRef elemFunc; + domValueRef elemValue; + + public: //Accessors and Mutators + /** + * Gets the func element. + * @return a daeSmartRef to the func element. + */ + const domFuncRef getFunc() const { return elemFunc; } + /** + * Gets the value element. + * @return a daeSmartRef to the value element. + */ + const domValueRef getValue() const { return elemValue; } + protected: + /** + * Constructor + */ + domAlpha_func() : elemFunc(), elemValue() {} + /** + * Destructor + */ + virtual ~domAlpha_func() {} + /** + * Copy Constructor + */ + domAlpha_func( const domAlpha_func &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domAlpha_func &operator=( const domAlpha_func &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domBlend_func; + + typedef daeSmartRef domBlend_funcRef; + typedef daeTArray domBlend_func_Array; + + class domBlend_func : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::BLEND_FUNC; } + public: + class domSrc; + + typedef daeSmartRef domSrcRef; + typedef daeTArray domSrc_Array; + + class domSrc : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::SRC; } + protected: // Attributes + domGl_blend_type attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domGl_blend_type of the value attribute. + */ + domGl_blend_type getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domGl_blend_type atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domSrc() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domSrc() {} + /** + * Copy Constructor + */ + domSrc( const domSrc &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domSrc &operator=( const domSrc &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domDest; + + typedef daeSmartRef domDestRef; + typedef daeTArray domDest_Array; + + class domDest : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::DEST; } + protected: // Attributes + domGl_blend_type attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domGl_blend_type of the value attribute. + */ + domGl_blend_type getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domGl_blend_type atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domDest() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domDest() {} + /** + * Copy Constructor + */ + domDest( const domDest &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domDest &operator=( const domDest &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + + + protected: // Elements + domSrcRef elemSrc; + domDestRef elemDest; + + public: //Accessors and Mutators + /** + * Gets the src element. + * @return a daeSmartRef to the src element. + */ + const domSrcRef getSrc() const { return elemSrc; } + /** + * Gets the dest element. + * @return a daeSmartRef to the dest element. + */ + const domDestRef getDest() const { return elemDest; } + protected: + /** + * Constructor + */ + domBlend_func() : elemSrc(), elemDest() {} + /** + * Destructor + */ + virtual ~domBlend_func() {} + /** + * Copy Constructor + */ + domBlend_func( const domBlend_func &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domBlend_func &operator=( const domBlend_func &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domClear_color; + + typedef daeSmartRef domClear_colorRef; + typedef daeTArray domClear_color_Array; + + class domClear_color : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::CLEAR_COLOR; } + protected: // Attributes + domFloat4 attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value array attribute. + * @return Returns a domFloat4 reference of the value array attribute. + */ + domFloat4 &getValue() { return attrValue; } + /** + * Gets the value array attribute. + * @return Returns a constant domFloat4 reference of the value array attribute. + */ + const domFloat4 &getValue() const { return attrValue; } + /** + * Sets the value array attribute. + * @param atValue The new value for the value array attribute. + */ + void setValue( const domFloat4 &atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domClear_color() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domClear_color() {} + /** + * Copy Constructor + */ + domClear_color( const domClear_color &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domClear_color &operator=( const domClear_color &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domClear_stencil; + + typedef daeSmartRef domClear_stencilRef; + typedef daeTArray domClear_stencil_Array; + + class domClear_stencil : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::CLEAR_STENCIL; } + protected: // Attributes + domInt attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domInt of the value attribute. + */ + domInt getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domInt atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domClear_stencil() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domClear_stencil() {} + /** + * Copy Constructor + */ + domClear_stencil( const domClear_stencil &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domClear_stencil &operator=( const domClear_stencil &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domClear_depth; + + typedef daeSmartRef domClear_depthRef; + typedef daeTArray domClear_depth_Array; + + class domClear_depth : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::CLEAR_DEPTH; } + protected: // Attributes + domFloat attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domFloat of the value attribute. + */ + domFloat getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domFloat atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domClear_depth() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domClear_depth() {} + /** + * Copy Constructor + */ + domClear_depth( const domClear_depth &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domClear_depth &operator=( const domClear_depth &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domClip_plane; + + typedef daeSmartRef domClip_planeRef; + typedef daeTArray domClip_plane_Array; + + class domClip_plane : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::CLIP_PLANE; } + protected: // Attributes + domBool4 attrValue; + xsNCName attrParam; + domGLES_MAX_CLIP_PLANES_index attrIndex; + + + public: //Accessors and Mutators + /** + * Gets the value array attribute. + * @return Returns a domBool4 reference of the value array attribute. + */ + domBool4 &getValue() { return attrValue; } + /** + * Gets the value array attribute. + * @return Returns a constant domBool4 reference of the value array attribute. + */ + const domBool4 &getValue() const { return attrValue; } + /** + * Sets the value array attribute. + * @param atValue The new value for the value array attribute. + */ + void setValue( const domBool4 &atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + /** + * Gets the index attribute. + * @return Returns a domGLES_MAX_CLIP_PLANES_index of the index attribute. + */ + domGLES_MAX_CLIP_PLANES_index getIndex() const { return attrIndex; } + /** + * Sets the index attribute. + * @param atIndex The new value for the index attribute. + */ + void setIndex( domGLES_MAX_CLIP_PLANES_index atIndex ) { attrIndex = atIndex; + _validAttributeArray[2] = true; } + + protected: + /** + * Constructor + */ + domClip_plane() : attrValue(), attrParam(), attrIndex() {} + /** + * Destructor + */ + virtual ~domClip_plane() {} + /** + * Copy Constructor + */ + domClip_plane( const domClip_plane &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domClip_plane &operator=( const domClip_plane &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domColor_mask; + + typedef daeSmartRef domColor_maskRef; + typedef daeTArray domColor_mask_Array; + + class domColor_mask : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::COLOR_MASK; } + protected: // Attributes + domBool4 attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value array attribute. + * @return Returns a domBool4 reference of the value array attribute. + */ + domBool4 &getValue() { return attrValue; } + /** + * Gets the value array attribute. + * @return Returns a constant domBool4 reference of the value array attribute. + */ + const domBool4 &getValue() const { return attrValue; } + /** + * Sets the value array attribute. + * @param atValue The new value for the value array attribute. + */ + void setValue( const domBool4 &atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domColor_mask() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domColor_mask() {} + /** + * Copy Constructor + */ + domColor_mask( const domColor_mask &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domColor_mask &operator=( const domColor_mask &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domCull_face; + + typedef daeSmartRef domCull_faceRef; + typedef daeTArray domCull_face_Array; + + class domCull_face : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::CULL_FACE; } + protected: // Attributes + domGl_face_type attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domGl_face_type of the value attribute. + */ + domGl_face_type getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domGl_face_type atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domCull_face() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domCull_face() {} + /** + * Copy Constructor + */ + domCull_face( const domCull_face &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domCull_face &operator=( const domCull_face &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domDepth_func; + + typedef daeSmartRef domDepth_funcRef; + typedef daeTArray domDepth_func_Array; + + class domDepth_func : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::DEPTH_FUNC; } + protected: // Attributes + domGl_func_type attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domGl_func_type of the value attribute. + */ + domGl_func_type getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domGl_func_type atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domDepth_func() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domDepth_func() {} + /** + * Copy Constructor + */ + domDepth_func( const domDepth_func &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domDepth_func &operator=( const domDepth_func &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domDepth_mask; + + typedef daeSmartRef domDepth_maskRef; + typedef daeTArray domDepth_mask_Array; + + class domDepth_mask : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::DEPTH_MASK; } + protected: // Attributes + domBool attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domBool of the value attribute. + */ + domBool getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domBool atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domDepth_mask() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domDepth_mask() {} + /** + * Copy Constructor + */ + domDepth_mask( const domDepth_mask &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domDepth_mask &operator=( const domDepth_mask &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domDepth_range; + + typedef daeSmartRef domDepth_rangeRef; + typedef daeTArray domDepth_range_Array; + + class domDepth_range : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::DEPTH_RANGE; } + protected: // Attributes + domFloat2 attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value array attribute. + * @return Returns a domFloat2 reference of the value array attribute. + */ + domFloat2 &getValue() { return attrValue; } + /** + * Gets the value array attribute. + * @return Returns a constant domFloat2 reference of the value array attribute. + */ + const domFloat2 &getValue() const { return attrValue; } + /** + * Sets the value array attribute. + * @param atValue The new value for the value array attribute. + */ + void setValue( const domFloat2 &atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domDepth_range() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domDepth_range() {} + /** + * Copy Constructor + */ + domDepth_range( const domDepth_range &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domDepth_range &operator=( const domDepth_range &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFog_color; + + typedef daeSmartRef domFog_colorRef; + typedef daeTArray domFog_color_Array; + + class domFog_color : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FOG_COLOR; } + protected: // Attributes + domFloat4 attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value array attribute. + * @return Returns a domFloat4 reference of the value array attribute. + */ + domFloat4 &getValue() { return attrValue; } + /** + * Gets the value array attribute. + * @return Returns a constant domFloat4 reference of the value array attribute. + */ + const domFloat4 &getValue() const { return attrValue; } + /** + * Sets the value array attribute. + * @param atValue The new value for the value array attribute. + */ + void setValue( const domFloat4 &atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domFog_color() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domFog_color() {} + /** + * Copy Constructor + */ + domFog_color( const domFog_color &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFog_color &operator=( const domFog_color &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFog_density; + + typedef daeSmartRef domFog_densityRef; + typedef daeTArray domFog_density_Array; + + class domFog_density : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FOG_DENSITY; } + protected: // Attributes + domFloat attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domFloat of the value attribute. + */ + domFloat getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domFloat atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domFog_density() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domFog_density() {} + /** + * Copy Constructor + */ + domFog_density( const domFog_density &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFog_density &operator=( const domFog_density &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFog_mode; + + typedef daeSmartRef domFog_modeRef; + typedef daeTArray domFog_mode_Array; + + class domFog_mode : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FOG_MODE; } + protected: // Attributes + domGl_fog_type attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domGl_fog_type of the value attribute. + */ + domGl_fog_type getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domGl_fog_type atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domFog_mode() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domFog_mode() {} + /** + * Copy Constructor + */ + domFog_mode( const domFog_mode &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFog_mode &operator=( const domFog_mode &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFog_start; + + typedef daeSmartRef domFog_startRef; + typedef daeTArray domFog_start_Array; + + class domFog_start : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FOG_START; } + protected: // Attributes + domFloat attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domFloat of the value attribute. + */ + domFloat getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domFloat atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domFog_start() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domFog_start() {} + /** + * Copy Constructor + */ + domFog_start( const domFog_start &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFog_start &operator=( const domFog_start &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFog_end; + + typedef daeSmartRef domFog_endRef; + typedef daeTArray domFog_end_Array; + + class domFog_end : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FOG_END; } + protected: // Attributes + domFloat attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domFloat of the value attribute. + */ + domFloat getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domFloat atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domFog_end() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domFog_end() {} + /** + * Copy Constructor + */ + domFog_end( const domFog_end &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFog_end &operator=( const domFog_end &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFront_face; + + typedef daeSmartRef domFront_faceRef; + typedef daeTArray domFront_face_Array; + + class domFront_face : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FRONT_FACE; } + protected: // Attributes + domGl_front_face_type attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domGl_front_face_type of the value attribute. + */ + domGl_front_face_type getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domGl_front_face_type atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domFront_face() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domFront_face() {} + /** + * Copy Constructor + */ + domFront_face( const domFront_face &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFront_face &operator=( const domFront_face &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domTexture_pipeline; + + typedef daeSmartRef domTexture_pipelineRef; + typedef daeTArray domTexture_pipeline_Array; + + class domTexture_pipeline : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::TEXTURE_PIPELINE; } + protected: // Attribute + xsNCName attrParam; + + protected: // Element + domGles_texture_pipelineRef elemValue; + + public: //Accessors and Mutators + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[0] = true; } + + /** + * Gets the value element. + * @return a daeSmartRef to the value element. + */ + const domGles_texture_pipelineRef getValue() const { return elemValue; } + protected: + /** + * Constructor + */ + domTexture_pipeline() : attrParam(), elemValue() {} + /** + * Destructor + */ + virtual ~domTexture_pipeline() {} + /** + * Copy Constructor + */ + domTexture_pipeline( const domTexture_pipeline &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domTexture_pipeline &operator=( const domTexture_pipeline &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domLogic_op; + + typedef daeSmartRef domLogic_opRef; + typedef daeTArray domLogic_op_Array; + + class domLogic_op : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::LOGIC_OP; } + protected: // Attributes + domGl_logic_op_type attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domGl_logic_op_type of the value attribute. + */ + domGl_logic_op_type getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domGl_logic_op_type atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domLogic_op() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domLogic_op() {} + /** + * Copy Constructor + */ + domLogic_op( const domLogic_op &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domLogic_op &operator=( const domLogic_op &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domLight_ambient; + + typedef daeSmartRef domLight_ambientRef; + typedef daeTArray domLight_ambient_Array; + + class domLight_ambient : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::LIGHT_AMBIENT; } + protected: // Attributes + domFloat4 attrValue; + xsNCName attrParam; + domGLES_MAX_LIGHTS_index attrIndex; + + + public: //Accessors and Mutators + /** + * Gets the value array attribute. + * @return Returns a domFloat4 reference of the value array attribute. + */ + domFloat4 &getValue() { return attrValue; } + /** + * Gets the value array attribute. + * @return Returns a constant domFloat4 reference of the value array attribute. + */ + const domFloat4 &getValue() const { return attrValue; } + /** + * Sets the value array attribute. + * @param atValue The new value for the value array attribute. + */ + void setValue( const domFloat4 &atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + /** + * Gets the index attribute. + * @return Returns a domGLES_MAX_LIGHTS_index of the index attribute. + */ + domGLES_MAX_LIGHTS_index getIndex() const { return attrIndex; } + /** + * Sets the index attribute. + * @param atIndex The new value for the index attribute. + */ + void setIndex( domGLES_MAX_LIGHTS_index atIndex ) { attrIndex = atIndex; + _validAttributeArray[2] = true; } + + protected: + /** + * Constructor + */ + domLight_ambient() : attrValue(), attrParam(), attrIndex() {} + /** + * Destructor + */ + virtual ~domLight_ambient() {} + /** + * Copy Constructor + */ + domLight_ambient( const domLight_ambient &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domLight_ambient &operator=( const domLight_ambient &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domLight_diffuse; + + typedef daeSmartRef domLight_diffuseRef; + typedef daeTArray domLight_diffuse_Array; + + class domLight_diffuse : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::LIGHT_DIFFUSE; } + protected: // Attributes + domFloat4 attrValue; + xsNCName attrParam; + domGLES_MAX_LIGHTS_index attrIndex; + + + public: //Accessors and Mutators + /** + * Gets the value array attribute. + * @return Returns a domFloat4 reference of the value array attribute. + */ + domFloat4 &getValue() { return attrValue; } + /** + * Gets the value array attribute. + * @return Returns a constant domFloat4 reference of the value array attribute. + */ + const domFloat4 &getValue() const { return attrValue; } + /** + * Sets the value array attribute. + * @param atValue The new value for the value array attribute. + */ + void setValue( const domFloat4 &atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + /** + * Gets the index attribute. + * @return Returns a domGLES_MAX_LIGHTS_index of the index attribute. + */ + domGLES_MAX_LIGHTS_index getIndex() const { return attrIndex; } + /** + * Sets the index attribute. + * @param atIndex The new value for the index attribute. + */ + void setIndex( domGLES_MAX_LIGHTS_index atIndex ) { attrIndex = atIndex; + _validAttributeArray[2] = true; } + + protected: + /** + * Constructor + */ + domLight_diffuse() : attrValue(), attrParam(), attrIndex() {} + /** + * Destructor + */ + virtual ~domLight_diffuse() {} + /** + * Copy Constructor + */ + domLight_diffuse( const domLight_diffuse &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domLight_diffuse &operator=( const domLight_diffuse &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domLight_specular; + + typedef daeSmartRef domLight_specularRef; + typedef daeTArray domLight_specular_Array; + + class domLight_specular : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::LIGHT_SPECULAR; } + protected: // Attributes + domFloat4 attrValue; + xsNCName attrParam; + domGLES_MAX_LIGHTS_index attrIndex; + + + public: //Accessors and Mutators + /** + * Gets the value array attribute. + * @return Returns a domFloat4 reference of the value array attribute. + */ + domFloat4 &getValue() { return attrValue; } + /** + * Gets the value array attribute. + * @return Returns a constant domFloat4 reference of the value array attribute. + */ + const domFloat4 &getValue() const { return attrValue; } + /** + * Sets the value array attribute. + * @param atValue The new value for the value array attribute. + */ + void setValue( const domFloat4 &atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + /** + * Gets the index attribute. + * @return Returns a domGLES_MAX_LIGHTS_index of the index attribute. + */ + domGLES_MAX_LIGHTS_index getIndex() const { return attrIndex; } + /** + * Sets the index attribute. + * @param atIndex The new value for the index attribute. + */ + void setIndex( domGLES_MAX_LIGHTS_index atIndex ) { attrIndex = atIndex; + _validAttributeArray[2] = true; } + + protected: + /** + * Constructor + */ + domLight_specular() : attrValue(), attrParam(), attrIndex() {} + /** + * Destructor + */ + virtual ~domLight_specular() {} + /** + * Copy Constructor + */ + domLight_specular( const domLight_specular &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domLight_specular &operator=( const domLight_specular &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domLight_position; + + typedef daeSmartRef domLight_positionRef; + typedef daeTArray domLight_position_Array; + + class domLight_position : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::LIGHT_POSITION; } + protected: // Attributes + domFloat4 attrValue; + xsNCName attrParam; + domGLES_MAX_LIGHTS_index attrIndex; + + + public: //Accessors and Mutators + /** + * Gets the value array attribute. + * @return Returns a domFloat4 reference of the value array attribute. + */ + domFloat4 &getValue() { return attrValue; } + /** + * Gets the value array attribute. + * @return Returns a constant domFloat4 reference of the value array attribute. + */ + const domFloat4 &getValue() const { return attrValue; } + /** + * Sets the value array attribute. + * @param atValue The new value for the value array attribute. + */ + void setValue( const domFloat4 &atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + /** + * Gets the index attribute. + * @return Returns a domGLES_MAX_LIGHTS_index of the index attribute. + */ + domGLES_MAX_LIGHTS_index getIndex() const { return attrIndex; } + /** + * Sets the index attribute. + * @param atIndex The new value for the index attribute. + */ + void setIndex( domGLES_MAX_LIGHTS_index atIndex ) { attrIndex = atIndex; + _validAttributeArray[2] = true; } + + protected: + /** + * Constructor + */ + domLight_position() : attrValue(), attrParam(), attrIndex() {} + /** + * Destructor + */ + virtual ~domLight_position() {} + /** + * Copy Constructor + */ + domLight_position( const domLight_position &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domLight_position &operator=( const domLight_position &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domLight_constant_attenuation; + + typedef daeSmartRef domLight_constant_attenuationRef; + typedef daeTArray domLight_constant_attenuation_Array; + + class domLight_constant_attenuation : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::LIGHT_CONSTANT_ATTENUATION; } + protected: // Attributes + domFloat attrValue; + xsNCName attrParam; + domGLES_MAX_LIGHTS_index attrIndex; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domFloat of the value attribute. + */ + domFloat getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domFloat atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + /** + * Gets the index attribute. + * @return Returns a domGLES_MAX_LIGHTS_index of the index attribute. + */ + domGLES_MAX_LIGHTS_index getIndex() const { return attrIndex; } + /** + * Sets the index attribute. + * @param atIndex The new value for the index attribute. + */ + void setIndex( domGLES_MAX_LIGHTS_index atIndex ) { attrIndex = atIndex; + _validAttributeArray[2] = true; } + + protected: + /** + * Constructor + */ + domLight_constant_attenuation() : attrValue(), attrParam(), attrIndex() {} + /** + * Destructor + */ + virtual ~domLight_constant_attenuation() {} + /** + * Copy Constructor + */ + domLight_constant_attenuation( const domLight_constant_attenuation &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domLight_constant_attenuation &operator=( const domLight_constant_attenuation &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domLight_linear_attenutation; + + typedef daeSmartRef domLight_linear_attenutationRef; + typedef daeTArray domLight_linear_attenutation_Array; + + class domLight_linear_attenutation : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::LIGHT_LINEAR_ATTENUTATION; } + protected: // Attributes + domFloat attrValue; + xsNCName attrParam; + domGLES_MAX_LIGHTS_index attrIndex; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domFloat of the value attribute. + */ + domFloat getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domFloat atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + /** + * Gets the index attribute. + * @return Returns a domGLES_MAX_LIGHTS_index of the index attribute. + */ + domGLES_MAX_LIGHTS_index getIndex() const { return attrIndex; } + /** + * Sets the index attribute. + * @param atIndex The new value for the index attribute. + */ + void setIndex( domGLES_MAX_LIGHTS_index atIndex ) { attrIndex = atIndex; + _validAttributeArray[2] = true; } + + protected: + /** + * Constructor + */ + domLight_linear_attenutation() : attrValue(), attrParam(), attrIndex() {} + /** + * Destructor + */ + virtual ~domLight_linear_attenutation() {} + /** + * Copy Constructor + */ + domLight_linear_attenutation( const domLight_linear_attenutation &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domLight_linear_attenutation &operator=( const domLight_linear_attenutation &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domLight_quadratic_attenuation; + + typedef daeSmartRef domLight_quadratic_attenuationRef; + typedef daeTArray domLight_quadratic_attenuation_Array; + + class domLight_quadratic_attenuation : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::LIGHT_QUADRATIC_ATTENUATION; } + protected: // Attributes + domFloat attrValue; + xsNCName attrParam; + domGLES_MAX_LIGHTS_index attrIndex; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domFloat of the value attribute. + */ + domFloat getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domFloat atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + /** + * Gets the index attribute. + * @return Returns a domGLES_MAX_LIGHTS_index of the index attribute. + */ + domGLES_MAX_LIGHTS_index getIndex() const { return attrIndex; } + /** + * Sets the index attribute. + * @param atIndex The new value for the index attribute. + */ + void setIndex( domGLES_MAX_LIGHTS_index atIndex ) { attrIndex = atIndex; + _validAttributeArray[2] = true; } + + protected: + /** + * Constructor + */ + domLight_quadratic_attenuation() : attrValue(), attrParam(), attrIndex() {} + /** + * Destructor + */ + virtual ~domLight_quadratic_attenuation() {} + /** + * Copy Constructor + */ + domLight_quadratic_attenuation( const domLight_quadratic_attenuation &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domLight_quadratic_attenuation &operator=( const domLight_quadratic_attenuation &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domLight_spot_cutoff; + + typedef daeSmartRef domLight_spot_cutoffRef; + typedef daeTArray domLight_spot_cutoff_Array; + + class domLight_spot_cutoff : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::LIGHT_SPOT_CUTOFF; } + protected: // Attributes + domFloat attrValue; + xsNCName attrParam; + domGLES_MAX_LIGHTS_index attrIndex; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domFloat of the value attribute. + */ + domFloat getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domFloat atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + /** + * Gets the index attribute. + * @return Returns a domGLES_MAX_LIGHTS_index of the index attribute. + */ + domGLES_MAX_LIGHTS_index getIndex() const { return attrIndex; } + /** + * Sets the index attribute. + * @param atIndex The new value for the index attribute. + */ + void setIndex( domGLES_MAX_LIGHTS_index atIndex ) { attrIndex = atIndex; + _validAttributeArray[2] = true; } + + protected: + /** + * Constructor + */ + domLight_spot_cutoff() : attrValue(), attrParam(), attrIndex() {} + /** + * Destructor + */ + virtual ~domLight_spot_cutoff() {} + /** + * Copy Constructor + */ + domLight_spot_cutoff( const domLight_spot_cutoff &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domLight_spot_cutoff &operator=( const domLight_spot_cutoff &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domLight_spot_direction; + + typedef daeSmartRef domLight_spot_directionRef; + typedef daeTArray domLight_spot_direction_Array; + + class domLight_spot_direction : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::LIGHT_SPOT_DIRECTION; } + protected: // Attributes + domFloat3 attrValue; + xsNCName attrParam; + domGLES_MAX_LIGHTS_index attrIndex; + + + public: //Accessors and Mutators + /** + * Gets the value array attribute. + * @return Returns a domFloat3 reference of the value array attribute. + */ + domFloat3 &getValue() { return attrValue; } + /** + * Gets the value array attribute. + * @return Returns a constant domFloat3 reference of the value array attribute. + */ + const domFloat3 &getValue() const { return attrValue; } + /** + * Sets the value array attribute. + * @param atValue The new value for the value array attribute. + */ + void setValue( const domFloat3 &atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + /** + * Gets the index attribute. + * @return Returns a domGLES_MAX_LIGHTS_index of the index attribute. + */ + domGLES_MAX_LIGHTS_index getIndex() const { return attrIndex; } + /** + * Sets the index attribute. + * @param atIndex The new value for the index attribute. + */ + void setIndex( domGLES_MAX_LIGHTS_index atIndex ) { attrIndex = atIndex; + _validAttributeArray[2] = true; } + + protected: + /** + * Constructor + */ + domLight_spot_direction() : attrValue(), attrParam(), attrIndex() {} + /** + * Destructor + */ + virtual ~domLight_spot_direction() {} + /** + * Copy Constructor + */ + domLight_spot_direction( const domLight_spot_direction &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domLight_spot_direction &operator=( const domLight_spot_direction &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domLight_spot_exponent; + + typedef daeSmartRef domLight_spot_exponentRef; + typedef daeTArray domLight_spot_exponent_Array; + + class domLight_spot_exponent : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::LIGHT_SPOT_EXPONENT; } + protected: // Attributes + domFloat attrValue; + xsNCName attrParam; + domGLES_MAX_LIGHTS_index attrIndex; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domFloat of the value attribute. + */ + domFloat getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domFloat atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + /** + * Gets the index attribute. + * @return Returns a domGLES_MAX_LIGHTS_index of the index attribute. + */ + domGLES_MAX_LIGHTS_index getIndex() const { return attrIndex; } + /** + * Sets the index attribute. + * @param atIndex The new value for the index attribute. + */ + void setIndex( domGLES_MAX_LIGHTS_index atIndex ) { attrIndex = atIndex; + _validAttributeArray[2] = true; } + + protected: + /** + * Constructor + */ + domLight_spot_exponent() : attrValue(), attrParam(), attrIndex() {} + /** + * Destructor + */ + virtual ~domLight_spot_exponent() {} + /** + * Copy Constructor + */ + domLight_spot_exponent( const domLight_spot_exponent &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domLight_spot_exponent &operator=( const domLight_spot_exponent &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domLight_model_ambient; + + typedef daeSmartRef domLight_model_ambientRef; + typedef daeTArray domLight_model_ambient_Array; + + class domLight_model_ambient : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::LIGHT_MODEL_AMBIENT; } + protected: // Attributes + domFloat4 attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value array attribute. + * @return Returns a domFloat4 reference of the value array attribute. + */ + domFloat4 &getValue() { return attrValue; } + /** + * Gets the value array attribute. + * @return Returns a constant domFloat4 reference of the value array attribute. + */ + const domFloat4 &getValue() const { return attrValue; } + /** + * Sets the value array attribute. + * @param atValue The new value for the value array attribute. + */ + void setValue( const domFloat4 &atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domLight_model_ambient() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domLight_model_ambient() {} + /** + * Copy Constructor + */ + domLight_model_ambient( const domLight_model_ambient &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domLight_model_ambient &operator=( const domLight_model_ambient &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domLine_width; + + typedef daeSmartRef domLine_widthRef; + typedef daeTArray domLine_width_Array; + + class domLine_width : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::LINE_WIDTH; } + protected: // Attributes + domFloat attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domFloat of the value attribute. + */ + domFloat getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domFloat atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domLine_width() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domLine_width() {} + /** + * Copy Constructor + */ + domLine_width( const domLine_width &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domLine_width &operator=( const domLine_width &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domMaterial_ambient; + + typedef daeSmartRef domMaterial_ambientRef; + typedef daeTArray domMaterial_ambient_Array; + + class domMaterial_ambient : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::MATERIAL_AMBIENT; } + protected: // Attributes + domFloat4 attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value array attribute. + * @return Returns a domFloat4 reference of the value array attribute. + */ + domFloat4 &getValue() { return attrValue; } + /** + * Gets the value array attribute. + * @return Returns a constant domFloat4 reference of the value array attribute. + */ + const domFloat4 &getValue() const { return attrValue; } + /** + * Sets the value array attribute. + * @param atValue The new value for the value array attribute. + */ + void setValue( const domFloat4 &atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domMaterial_ambient() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domMaterial_ambient() {} + /** + * Copy Constructor + */ + domMaterial_ambient( const domMaterial_ambient &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domMaterial_ambient &operator=( const domMaterial_ambient &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domMaterial_diffuse; + + typedef daeSmartRef domMaterial_diffuseRef; + typedef daeTArray domMaterial_diffuse_Array; + + class domMaterial_diffuse : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::MATERIAL_DIFFUSE; } + protected: // Attributes + domFloat4 attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value array attribute. + * @return Returns a domFloat4 reference of the value array attribute. + */ + domFloat4 &getValue() { return attrValue; } + /** + * Gets the value array attribute. + * @return Returns a constant domFloat4 reference of the value array attribute. + */ + const domFloat4 &getValue() const { return attrValue; } + /** + * Sets the value array attribute. + * @param atValue The new value for the value array attribute. + */ + void setValue( const domFloat4 &atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domMaterial_diffuse() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domMaterial_diffuse() {} + /** + * Copy Constructor + */ + domMaterial_diffuse( const domMaterial_diffuse &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domMaterial_diffuse &operator=( const domMaterial_diffuse &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domMaterial_emission; + + typedef daeSmartRef domMaterial_emissionRef; + typedef daeTArray domMaterial_emission_Array; + + class domMaterial_emission : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::MATERIAL_EMISSION; } + protected: // Attributes + domFloat4 attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value array attribute. + * @return Returns a domFloat4 reference of the value array attribute. + */ + domFloat4 &getValue() { return attrValue; } + /** + * Gets the value array attribute. + * @return Returns a constant domFloat4 reference of the value array attribute. + */ + const domFloat4 &getValue() const { return attrValue; } + /** + * Sets the value array attribute. + * @param atValue The new value for the value array attribute. + */ + void setValue( const domFloat4 &atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domMaterial_emission() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domMaterial_emission() {} + /** + * Copy Constructor + */ + domMaterial_emission( const domMaterial_emission &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domMaterial_emission &operator=( const domMaterial_emission &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domMaterial_shininess; + + typedef daeSmartRef domMaterial_shininessRef; + typedef daeTArray domMaterial_shininess_Array; + + class domMaterial_shininess : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::MATERIAL_SHININESS; } + protected: // Attributes + domFloat attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domFloat of the value attribute. + */ + domFloat getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domFloat atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domMaterial_shininess() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domMaterial_shininess() {} + /** + * Copy Constructor + */ + domMaterial_shininess( const domMaterial_shininess &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domMaterial_shininess &operator=( const domMaterial_shininess &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domMaterial_specular; + + typedef daeSmartRef domMaterial_specularRef; + typedef daeTArray domMaterial_specular_Array; + + class domMaterial_specular : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::MATERIAL_SPECULAR; } + protected: // Attributes + domFloat4 attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value array attribute. + * @return Returns a domFloat4 reference of the value array attribute. + */ + domFloat4 &getValue() { return attrValue; } + /** + * Gets the value array attribute. + * @return Returns a constant domFloat4 reference of the value array attribute. + */ + const domFloat4 &getValue() const { return attrValue; } + /** + * Sets the value array attribute. + * @param atValue The new value for the value array attribute. + */ + void setValue( const domFloat4 &atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domMaterial_specular() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domMaterial_specular() {} + /** + * Copy Constructor + */ + domMaterial_specular( const domMaterial_specular &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domMaterial_specular &operator=( const domMaterial_specular &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domModel_view_matrix; + + typedef daeSmartRef domModel_view_matrixRef; + typedef daeTArray domModel_view_matrix_Array; + + class domModel_view_matrix : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::MODEL_VIEW_MATRIX; } + protected: // Attributes + domFloat4x4 attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value array attribute. + * @return Returns a domFloat4x4 reference of the value array attribute. + */ + domFloat4x4 &getValue() { return attrValue; } + /** + * Gets the value array attribute. + * @return Returns a constant domFloat4x4 reference of the value array attribute. + */ + const domFloat4x4 &getValue() const { return attrValue; } + /** + * Sets the value array attribute. + * @param atValue The new value for the value array attribute. + */ + void setValue( const domFloat4x4 &atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domModel_view_matrix() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domModel_view_matrix() {} + /** + * Copy Constructor + */ + domModel_view_matrix( const domModel_view_matrix &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domModel_view_matrix &operator=( const domModel_view_matrix &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domPoint_distance_attenuation; + + typedef daeSmartRef domPoint_distance_attenuationRef; + typedef daeTArray domPoint_distance_attenuation_Array; + + class domPoint_distance_attenuation : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::POINT_DISTANCE_ATTENUATION; } + protected: // Attributes + domFloat3 attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value array attribute. + * @return Returns a domFloat3 reference of the value array attribute. + */ + domFloat3 &getValue() { return attrValue; } + /** + * Gets the value array attribute. + * @return Returns a constant domFloat3 reference of the value array attribute. + */ + const domFloat3 &getValue() const { return attrValue; } + /** + * Sets the value array attribute. + * @param atValue The new value for the value array attribute. + */ + void setValue( const domFloat3 &atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domPoint_distance_attenuation() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domPoint_distance_attenuation() {} + /** + * Copy Constructor + */ + domPoint_distance_attenuation( const domPoint_distance_attenuation &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domPoint_distance_attenuation &operator=( const domPoint_distance_attenuation &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domPoint_fade_threshold_size; + + typedef daeSmartRef domPoint_fade_threshold_sizeRef; + typedef daeTArray domPoint_fade_threshold_size_Array; + + class domPoint_fade_threshold_size : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::POINT_FADE_THRESHOLD_SIZE; } + protected: // Attributes + domFloat attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domFloat of the value attribute. + */ + domFloat getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domFloat atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domPoint_fade_threshold_size() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domPoint_fade_threshold_size() {} + /** + * Copy Constructor + */ + domPoint_fade_threshold_size( const domPoint_fade_threshold_size &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domPoint_fade_threshold_size &operator=( const domPoint_fade_threshold_size &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domPoint_size; + + typedef daeSmartRef domPoint_sizeRef; + typedef daeTArray domPoint_size_Array; + + class domPoint_size : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::POINT_SIZE; } + protected: // Attributes + domFloat attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domFloat of the value attribute. + */ + domFloat getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domFloat atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domPoint_size() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domPoint_size() {} + /** + * Copy Constructor + */ + domPoint_size( const domPoint_size &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domPoint_size &operator=( const domPoint_size &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domPoint_size_min; + + typedef daeSmartRef domPoint_size_minRef; + typedef daeTArray domPoint_size_min_Array; + + class domPoint_size_min : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::POINT_SIZE_MIN; } + protected: // Attributes + domFloat attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domFloat of the value attribute. + */ + domFloat getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domFloat atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domPoint_size_min() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domPoint_size_min() {} + /** + * Copy Constructor + */ + domPoint_size_min( const domPoint_size_min &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domPoint_size_min &operator=( const domPoint_size_min &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domPoint_size_max; + + typedef daeSmartRef domPoint_size_maxRef; + typedef daeTArray domPoint_size_max_Array; + + class domPoint_size_max : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::POINT_SIZE_MAX; } + protected: // Attributes + domFloat attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domFloat of the value attribute. + */ + domFloat getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domFloat atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domPoint_size_max() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domPoint_size_max() {} + /** + * Copy Constructor + */ + domPoint_size_max( const domPoint_size_max &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domPoint_size_max &operator=( const domPoint_size_max &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domPolygon_offset; + + typedef daeSmartRef domPolygon_offsetRef; + typedef daeTArray domPolygon_offset_Array; + + class domPolygon_offset : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::POLYGON_OFFSET; } + protected: // Attributes + domFloat2 attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value array attribute. + * @return Returns a domFloat2 reference of the value array attribute. + */ + domFloat2 &getValue() { return attrValue; } + /** + * Gets the value array attribute. + * @return Returns a constant domFloat2 reference of the value array attribute. + */ + const domFloat2 &getValue() const { return attrValue; } + /** + * Sets the value array attribute. + * @param atValue The new value for the value array attribute. + */ + void setValue( const domFloat2 &atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domPolygon_offset() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domPolygon_offset() {} + /** + * Copy Constructor + */ + domPolygon_offset( const domPolygon_offset &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domPolygon_offset &operator=( const domPolygon_offset &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domProjection_matrix; + + typedef daeSmartRef domProjection_matrixRef; + typedef daeTArray domProjection_matrix_Array; + + class domProjection_matrix : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::PROJECTION_MATRIX; } + protected: // Attributes + domFloat4x4 attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value array attribute. + * @return Returns a domFloat4x4 reference of the value array attribute. + */ + domFloat4x4 &getValue() { return attrValue; } + /** + * Gets the value array attribute. + * @return Returns a constant domFloat4x4 reference of the value array attribute. + */ + const domFloat4x4 &getValue() const { return attrValue; } + /** + * Sets the value array attribute. + * @param atValue The new value for the value array attribute. + */ + void setValue( const domFloat4x4 &atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domProjection_matrix() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domProjection_matrix() {} + /** + * Copy Constructor + */ + domProjection_matrix( const domProjection_matrix &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domProjection_matrix &operator=( const domProjection_matrix &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domScissor; + + typedef daeSmartRef domScissorRef; + typedef daeTArray domScissor_Array; + + class domScissor : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::SCISSOR; } + protected: // Attributes + domInt4 attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value array attribute. + * @return Returns a domInt4 reference of the value array attribute. + */ + domInt4 &getValue() { return attrValue; } + /** + * Gets the value array attribute. + * @return Returns a constant domInt4 reference of the value array attribute. + */ + const domInt4 &getValue() const { return attrValue; } + /** + * Sets the value array attribute. + * @param atValue The new value for the value array attribute. + */ + void setValue( const domInt4 &atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domScissor() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domScissor() {} + /** + * Copy Constructor + */ + domScissor( const domScissor &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domScissor &operator=( const domScissor &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domShade_model; + + typedef daeSmartRef domShade_modelRef; + typedef daeTArray domShade_model_Array; + + class domShade_model : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::SHADE_MODEL; } + protected: // Attributes + domGl_shade_model_type attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domGl_shade_model_type of the value attribute. + */ + domGl_shade_model_type getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domGl_shade_model_type atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domShade_model() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domShade_model() {} + /** + * Copy Constructor + */ + domShade_model( const domShade_model &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domShade_model &operator=( const domShade_model &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domStencil_func; + + typedef daeSmartRef domStencil_funcRef; + typedef daeTArray domStencil_func_Array; + + class domStencil_func : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::STENCIL_FUNC; } + public: + class domFunc; + + typedef daeSmartRef domFuncRef; + typedef daeTArray domFunc_Array; + + class domFunc : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FUNC; } + protected: // Attributes + domGl_func_type attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domGl_func_type of the value attribute. + */ + domGl_func_type getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domGl_func_type atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domFunc() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domFunc() {} + /** + * Copy Constructor + */ + domFunc( const domFunc &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFunc &operator=( const domFunc &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domRef; + + typedef daeSmartRef domRefRef; + typedef daeTArray domRef_Array; + + class domRef : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::REF; } + protected: // Attributes + xsUnsignedByte attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a xsUnsignedByte of the value attribute. + */ + xsUnsignedByte getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( xsUnsignedByte atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domRef() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domRef() {} + /** + * Copy Constructor + */ + domRef( const domRef &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domRef &operator=( const domRef &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domMask; + + typedef daeSmartRef domMaskRef; + typedef daeTArray domMask_Array; + + class domMask : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::MASK; } + protected: // Attributes + xsUnsignedByte attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a xsUnsignedByte of the value attribute. + */ + xsUnsignedByte getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( xsUnsignedByte atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domMask() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domMask() {} + /** + * Copy Constructor + */ + domMask( const domMask &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domMask &operator=( const domMask &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + + + protected: // Elements + domFuncRef elemFunc; + domRefRef elemRef; + domMaskRef elemMask; + + public: //Accessors and Mutators + /** + * Gets the func element. + * @return a daeSmartRef to the func element. + */ + const domFuncRef getFunc() const { return elemFunc; } + /** + * Gets the ref element. + * @return a daeSmartRef to the ref element. + */ + const domRefRef getRef() const { return elemRef; } + /** + * Gets the mask element. + * @return a daeSmartRef to the mask element. + */ + const domMaskRef getMask() const { return elemMask; } + protected: + /** + * Constructor + */ + domStencil_func() : elemFunc(), elemRef(), elemMask() {} + /** + * Destructor + */ + virtual ~domStencil_func() {} + /** + * Copy Constructor + */ + domStencil_func( const domStencil_func &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domStencil_func &operator=( const domStencil_func &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domStencil_mask; + + typedef daeSmartRef domStencil_maskRef; + typedef daeTArray domStencil_mask_Array; + + class domStencil_mask : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::STENCIL_MASK; } + protected: // Attributes + domInt attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domInt of the value attribute. + */ + domInt getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domInt atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domStencil_mask() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domStencil_mask() {} + /** + * Copy Constructor + */ + domStencil_mask( const domStencil_mask &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domStencil_mask &operator=( const domStencil_mask &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domStencil_op; + + typedef daeSmartRef domStencil_opRef; + typedef daeTArray domStencil_op_Array; + + class domStencil_op : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::STENCIL_OP; } + public: + class domFail; + + typedef daeSmartRef domFailRef; + typedef daeTArray domFail_Array; + + class domFail : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FAIL; } + protected: // Attributes + domGles_stencil_op_type attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domGles_stencil_op_type of the value attribute. + */ + domGles_stencil_op_type getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domGles_stencil_op_type atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domFail() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domFail() {} + /** + * Copy Constructor + */ + domFail( const domFail &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFail &operator=( const domFail &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domZfail; + + typedef daeSmartRef domZfailRef; + typedef daeTArray domZfail_Array; + + class domZfail : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::ZFAIL; } + protected: // Attributes + domGles_stencil_op_type attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domGles_stencil_op_type of the value attribute. + */ + domGles_stencil_op_type getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domGles_stencil_op_type atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domZfail() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domZfail() {} + /** + * Copy Constructor + */ + domZfail( const domZfail &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domZfail &operator=( const domZfail &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domZpass; + + typedef daeSmartRef domZpassRef; + typedef daeTArray domZpass_Array; + + class domZpass : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::ZPASS; } + protected: // Attributes + domGles_stencil_op_type attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domGles_stencil_op_type of the value attribute. + */ + domGles_stencil_op_type getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domGles_stencil_op_type atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domZpass() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domZpass() {} + /** + * Copy Constructor + */ + domZpass( const domZpass &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domZpass &operator=( const domZpass &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + + + protected: // Elements + domFailRef elemFail; + domZfailRef elemZfail; + domZpassRef elemZpass; + + public: //Accessors and Mutators + /** + * Gets the fail element. + * @return a daeSmartRef to the fail element. + */ + const domFailRef getFail() const { return elemFail; } + /** + * Gets the zfail element. + * @return a daeSmartRef to the zfail element. + */ + const domZfailRef getZfail() const { return elemZfail; } + /** + * Gets the zpass element. + * @return a daeSmartRef to the zpass element. + */ + const domZpassRef getZpass() const { return elemZpass; } + protected: + /** + * Constructor + */ + domStencil_op() : elemFail(), elemZfail(), elemZpass() {} + /** + * Destructor + */ + virtual ~domStencil_op() {} + /** + * Copy Constructor + */ + domStencil_op( const domStencil_op &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domStencil_op &operator=( const domStencil_op &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domAlpha_test_enable; + + typedef daeSmartRef domAlpha_test_enableRef; + typedef daeTArray domAlpha_test_enable_Array; + + class domAlpha_test_enable : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::ALPHA_TEST_ENABLE; } + protected: // Attributes + domBool attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domBool of the value attribute. + */ + domBool getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domBool atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domAlpha_test_enable() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domAlpha_test_enable() {} + /** + * Copy Constructor + */ + domAlpha_test_enable( const domAlpha_test_enable &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domAlpha_test_enable &operator=( const domAlpha_test_enable &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domBlend_enable; + + typedef daeSmartRef domBlend_enableRef; + typedef daeTArray domBlend_enable_Array; + + class domBlend_enable : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::BLEND_ENABLE; } + protected: // Attributes + domBool attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domBool of the value attribute. + */ + domBool getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domBool atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domBlend_enable() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domBlend_enable() {} + /** + * Copy Constructor + */ + domBlend_enable( const domBlend_enable &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domBlend_enable &operator=( const domBlend_enable &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domClip_plane_enable; + + typedef daeSmartRef domClip_plane_enableRef; + typedef daeTArray domClip_plane_enable_Array; + + class domClip_plane_enable : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::CLIP_PLANE_ENABLE; } + protected: // Attributes + domBool attrValue; + xsNCName attrParam; + domGLES_MAX_CLIP_PLANES_index attrIndex; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domBool of the value attribute. + */ + domBool getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domBool atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + /** + * Gets the index attribute. + * @return Returns a domGLES_MAX_CLIP_PLANES_index of the index attribute. + */ + domGLES_MAX_CLIP_PLANES_index getIndex() const { return attrIndex; } + /** + * Sets the index attribute. + * @param atIndex The new value for the index attribute. + */ + void setIndex( domGLES_MAX_CLIP_PLANES_index atIndex ) { attrIndex = atIndex; + _validAttributeArray[2] = true; } + + protected: + /** + * Constructor + */ + domClip_plane_enable() : attrValue(), attrParam(), attrIndex() {} + /** + * Destructor + */ + virtual ~domClip_plane_enable() {} + /** + * Copy Constructor + */ + domClip_plane_enable( const domClip_plane_enable &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domClip_plane_enable &operator=( const domClip_plane_enable &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domColor_logic_op_enable; + + typedef daeSmartRef domColor_logic_op_enableRef; + typedef daeTArray domColor_logic_op_enable_Array; + + class domColor_logic_op_enable : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::COLOR_LOGIC_OP_ENABLE; } + protected: // Attributes + domBool attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domBool of the value attribute. + */ + domBool getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domBool atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domColor_logic_op_enable() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domColor_logic_op_enable() {} + /** + * Copy Constructor + */ + domColor_logic_op_enable( const domColor_logic_op_enable &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domColor_logic_op_enable &operator=( const domColor_logic_op_enable &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domColor_material_enable; + + typedef daeSmartRef domColor_material_enableRef; + typedef daeTArray domColor_material_enable_Array; + + class domColor_material_enable : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::COLOR_MATERIAL_ENABLE; } + protected: // Attributes + domBool attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domBool of the value attribute. + */ + domBool getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domBool atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domColor_material_enable() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domColor_material_enable() {} + /** + * Copy Constructor + */ + domColor_material_enable( const domColor_material_enable &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domColor_material_enable &operator=( const domColor_material_enable &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domCull_face_enable; + + typedef daeSmartRef domCull_face_enableRef; + typedef daeTArray domCull_face_enable_Array; + + class domCull_face_enable : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::CULL_FACE_ENABLE; } + protected: // Attributes + domBool attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domBool of the value attribute. + */ + domBool getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domBool atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domCull_face_enable() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domCull_face_enable() {} + /** + * Copy Constructor + */ + domCull_face_enable( const domCull_face_enable &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domCull_face_enable &operator=( const domCull_face_enable &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domDepth_test_enable; + + typedef daeSmartRef domDepth_test_enableRef; + typedef daeTArray domDepth_test_enable_Array; + + class domDepth_test_enable : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::DEPTH_TEST_ENABLE; } + protected: // Attributes + domBool attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domBool of the value attribute. + */ + domBool getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domBool atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domDepth_test_enable() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domDepth_test_enable() {} + /** + * Copy Constructor + */ + domDepth_test_enable( const domDepth_test_enable &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domDepth_test_enable &operator=( const domDepth_test_enable &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domDither_enable; + + typedef daeSmartRef domDither_enableRef; + typedef daeTArray domDither_enable_Array; + + class domDither_enable : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::DITHER_ENABLE; } + protected: // Attributes + domBool attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domBool of the value attribute. + */ + domBool getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domBool atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domDither_enable() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domDither_enable() {} + /** + * Copy Constructor + */ + domDither_enable( const domDither_enable &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domDither_enable &operator=( const domDither_enable &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFog_enable; + + typedef daeSmartRef domFog_enableRef; + typedef daeTArray domFog_enable_Array; + + class domFog_enable : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FOG_ENABLE; } + protected: // Attributes + domBool attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domBool of the value attribute. + */ + domBool getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domBool atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domFog_enable() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domFog_enable() {} + /** + * Copy Constructor + */ + domFog_enable( const domFog_enable &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFog_enable &operator=( const domFog_enable &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domTexture_pipeline_enable; + + typedef daeSmartRef domTexture_pipeline_enableRef; + typedef daeTArray domTexture_pipeline_enable_Array; + + class domTexture_pipeline_enable : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::TEXTURE_PIPELINE_ENABLE; } + protected: // Attributes + domBool attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domBool of the value attribute. + */ + domBool getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domBool atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domTexture_pipeline_enable() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domTexture_pipeline_enable() {} + /** + * Copy Constructor + */ + domTexture_pipeline_enable( const domTexture_pipeline_enable &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domTexture_pipeline_enable &operator=( const domTexture_pipeline_enable &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domLight_enable; + + typedef daeSmartRef domLight_enableRef; + typedef daeTArray domLight_enable_Array; + + class domLight_enable : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::LIGHT_ENABLE; } + protected: // Attributes + domBool attrValue; + xsNCName attrParam; + domGLES_MAX_LIGHTS_index attrIndex; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domBool of the value attribute. + */ + domBool getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domBool atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + /** + * Gets the index attribute. + * @return Returns a domGLES_MAX_LIGHTS_index of the index attribute. + */ + domGLES_MAX_LIGHTS_index getIndex() const { return attrIndex; } + /** + * Sets the index attribute. + * @param atIndex The new value for the index attribute. + */ + void setIndex( domGLES_MAX_LIGHTS_index atIndex ) { attrIndex = atIndex; + _validAttributeArray[2] = true; } + + protected: + /** + * Constructor + */ + domLight_enable() : attrValue(), attrParam(), attrIndex() {} + /** + * Destructor + */ + virtual ~domLight_enable() {} + /** + * Copy Constructor + */ + domLight_enable( const domLight_enable &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domLight_enable &operator=( const domLight_enable &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domLighting_enable; + + typedef daeSmartRef domLighting_enableRef; + typedef daeTArray domLighting_enable_Array; + + class domLighting_enable : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::LIGHTING_ENABLE; } + protected: // Attributes + domBool attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domBool of the value attribute. + */ + domBool getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domBool atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domLighting_enable() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domLighting_enable() {} + /** + * Copy Constructor + */ + domLighting_enable( const domLighting_enable &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domLighting_enable &operator=( const domLighting_enable &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domLight_model_two_side_enable; + + typedef daeSmartRef domLight_model_two_side_enableRef; + typedef daeTArray domLight_model_two_side_enable_Array; + + class domLight_model_two_side_enable : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::LIGHT_MODEL_TWO_SIDE_ENABLE; } + protected: // Attributes + domBool attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domBool of the value attribute. + */ + domBool getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domBool atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domLight_model_two_side_enable() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domLight_model_two_side_enable() {} + /** + * Copy Constructor + */ + domLight_model_two_side_enable( const domLight_model_two_side_enable &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domLight_model_two_side_enable &operator=( const domLight_model_two_side_enable &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domLine_smooth_enable; + + typedef daeSmartRef domLine_smooth_enableRef; + typedef daeTArray domLine_smooth_enable_Array; + + class domLine_smooth_enable : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::LINE_SMOOTH_ENABLE; } + protected: // Attributes + domBool attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domBool of the value attribute. + */ + domBool getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domBool atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domLine_smooth_enable() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domLine_smooth_enable() {} + /** + * Copy Constructor + */ + domLine_smooth_enable( const domLine_smooth_enable &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domLine_smooth_enable &operator=( const domLine_smooth_enable &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domMultisample_enable; + + typedef daeSmartRef domMultisample_enableRef; + typedef daeTArray domMultisample_enable_Array; + + class domMultisample_enable : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::MULTISAMPLE_ENABLE; } + protected: // Attributes + domBool attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domBool of the value attribute. + */ + domBool getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domBool atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domMultisample_enable() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domMultisample_enable() {} + /** + * Copy Constructor + */ + domMultisample_enable( const domMultisample_enable &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domMultisample_enable &operator=( const domMultisample_enable &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domNormalize_enable; + + typedef daeSmartRef domNormalize_enableRef; + typedef daeTArray domNormalize_enable_Array; + + class domNormalize_enable : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::NORMALIZE_ENABLE; } + protected: // Attributes + domBool attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domBool of the value attribute. + */ + domBool getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domBool atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domNormalize_enable() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domNormalize_enable() {} + /** + * Copy Constructor + */ + domNormalize_enable( const domNormalize_enable &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domNormalize_enable &operator=( const domNormalize_enable &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domPoint_smooth_enable; + + typedef daeSmartRef domPoint_smooth_enableRef; + typedef daeTArray domPoint_smooth_enable_Array; + + class domPoint_smooth_enable : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::POINT_SMOOTH_ENABLE; } + protected: // Attributes + domBool attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domBool of the value attribute. + */ + domBool getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domBool atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domPoint_smooth_enable() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domPoint_smooth_enable() {} + /** + * Copy Constructor + */ + domPoint_smooth_enable( const domPoint_smooth_enable &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domPoint_smooth_enable &operator=( const domPoint_smooth_enable &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domPolygon_offset_fill_enable; + + typedef daeSmartRef domPolygon_offset_fill_enableRef; + typedef daeTArray domPolygon_offset_fill_enable_Array; + + class domPolygon_offset_fill_enable : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::POLYGON_OFFSET_FILL_ENABLE; } + protected: // Attributes + domBool attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domBool of the value attribute. + */ + domBool getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domBool atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domPolygon_offset_fill_enable() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domPolygon_offset_fill_enable() {} + /** + * Copy Constructor + */ + domPolygon_offset_fill_enable( const domPolygon_offset_fill_enable &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domPolygon_offset_fill_enable &operator=( const domPolygon_offset_fill_enable &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domRescale_normal_enable; + + typedef daeSmartRef domRescale_normal_enableRef; + typedef daeTArray domRescale_normal_enable_Array; + + class domRescale_normal_enable : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::RESCALE_NORMAL_ENABLE; } + protected: // Attributes + domBool attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domBool of the value attribute. + */ + domBool getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domBool atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domRescale_normal_enable() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domRescale_normal_enable() {} + /** + * Copy Constructor + */ + domRescale_normal_enable( const domRescale_normal_enable &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domRescale_normal_enable &operator=( const domRescale_normal_enable &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domSample_alpha_to_coverage_enable; + + typedef daeSmartRef domSample_alpha_to_coverage_enableRef; + typedef daeTArray domSample_alpha_to_coverage_enable_Array; + + class domSample_alpha_to_coverage_enable : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::SAMPLE_ALPHA_TO_COVERAGE_ENABLE; } + protected: // Attributes + domBool attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domBool of the value attribute. + */ + domBool getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domBool atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domSample_alpha_to_coverage_enable() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domSample_alpha_to_coverage_enable() {} + /** + * Copy Constructor + */ + domSample_alpha_to_coverage_enable( const domSample_alpha_to_coverage_enable &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domSample_alpha_to_coverage_enable &operator=( const domSample_alpha_to_coverage_enable &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domSample_alpha_to_one_enable; + + typedef daeSmartRef domSample_alpha_to_one_enableRef; + typedef daeTArray domSample_alpha_to_one_enable_Array; + + class domSample_alpha_to_one_enable : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::SAMPLE_ALPHA_TO_ONE_ENABLE; } + protected: // Attributes + domBool attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domBool of the value attribute. + */ + domBool getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domBool atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domSample_alpha_to_one_enable() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domSample_alpha_to_one_enable() {} + /** + * Copy Constructor + */ + domSample_alpha_to_one_enable( const domSample_alpha_to_one_enable &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domSample_alpha_to_one_enable &operator=( const domSample_alpha_to_one_enable &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domSample_coverage_enable; + + typedef daeSmartRef domSample_coverage_enableRef; + typedef daeTArray domSample_coverage_enable_Array; + + class domSample_coverage_enable : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::SAMPLE_COVERAGE_ENABLE; } + protected: // Attributes + domBool attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domBool of the value attribute. + */ + domBool getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domBool atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domSample_coverage_enable() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domSample_coverage_enable() {} + /** + * Copy Constructor + */ + domSample_coverage_enable( const domSample_coverage_enable &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domSample_coverage_enable &operator=( const domSample_coverage_enable &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domScissor_test_enable; + + typedef daeSmartRef domScissor_test_enableRef; + typedef daeTArray domScissor_test_enable_Array; + + class domScissor_test_enable : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::SCISSOR_TEST_ENABLE; } + protected: // Attributes + domBool attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domBool of the value attribute. + */ + domBool getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domBool atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domScissor_test_enable() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domScissor_test_enable() {} + /** + * Copy Constructor + */ + domScissor_test_enable( const domScissor_test_enable &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domScissor_test_enable &operator=( const domScissor_test_enable &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domStencil_test_enable; + + typedef daeSmartRef domStencil_test_enableRef; + typedef daeTArray domStencil_test_enable_Array; + + class domStencil_test_enable : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::STENCIL_TEST_ENABLE; } + protected: // Attributes + domBool attrValue; + xsNCName attrParam; + + + public: //Accessors and Mutators + /** + * Gets the value attribute. + * @return Returns a domBool of the value attribute. + */ + domBool getValue() const { return attrValue; } + /** + * Sets the value attribute. + * @param atValue The new value for the value attribute. + */ + void setValue( domBool atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domStencil_test_enable() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domStencil_test_enable() {} + /** + * Copy Constructor + */ + domStencil_test_enable( const domStencil_test_enable &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domStencil_test_enable &operator=( const domStencil_test_enable &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + + +protected: // Elements + domAlpha_funcRef elemAlpha_func; + domBlend_funcRef elemBlend_func; + domClear_colorRef elemClear_color; + domClear_stencilRef elemClear_stencil; + domClear_depthRef elemClear_depth; + domClip_planeRef elemClip_plane; + domColor_maskRef elemColor_mask; + domCull_faceRef elemCull_face; + domDepth_funcRef elemDepth_func; + domDepth_maskRef elemDepth_mask; + domDepth_rangeRef elemDepth_range; + domFog_colorRef elemFog_color; + domFog_densityRef elemFog_density; + domFog_modeRef elemFog_mode; + domFog_startRef elemFog_start; + domFog_endRef elemFog_end; + domFront_faceRef elemFront_face; + domTexture_pipelineRef elemTexture_pipeline; + domLogic_opRef elemLogic_op; + domLight_ambientRef elemLight_ambient; + domLight_diffuseRef elemLight_diffuse; + domLight_specularRef elemLight_specular; + domLight_positionRef elemLight_position; + domLight_constant_attenuationRef elemLight_constant_attenuation; + domLight_linear_attenutationRef elemLight_linear_attenutation; + domLight_quadratic_attenuationRef elemLight_quadratic_attenuation; + domLight_spot_cutoffRef elemLight_spot_cutoff; + domLight_spot_directionRef elemLight_spot_direction; + domLight_spot_exponentRef elemLight_spot_exponent; + domLight_model_ambientRef elemLight_model_ambient; + domLine_widthRef elemLine_width; + domMaterial_ambientRef elemMaterial_ambient; + domMaterial_diffuseRef elemMaterial_diffuse; + domMaterial_emissionRef elemMaterial_emission; + domMaterial_shininessRef elemMaterial_shininess; + domMaterial_specularRef elemMaterial_specular; + domModel_view_matrixRef elemModel_view_matrix; + domPoint_distance_attenuationRef elemPoint_distance_attenuation; + domPoint_fade_threshold_sizeRef elemPoint_fade_threshold_size; + domPoint_sizeRef elemPoint_size; + domPoint_size_minRef elemPoint_size_min; + domPoint_size_maxRef elemPoint_size_max; + domPolygon_offsetRef elemPolygon_offset; + domProjection_matrixRef elemProjection_matrix; + domScissorRef elemScissor; + domShade_modelRef elemShade_model; + domStencil_funcRef elemStencil_func; + domStencil_maskRef elemStencil_mask; + domStencil_opRef elemStencil_op; + domAlpha_test_enableRef elemAlpha_test_enable; + domBlend_enableRef elemBlend_enable; + domClip_plane_enableRef elemClip_plane_enable; + domColor_logic_op_enableRef elemColor_logic_op_enable; + domColor_material_enableRef elemColor_material_enable; + domCull_face_enableRef elemCull_face_enable; + domDepth_test_enableRef elemDepth_test_enable; + domDither_enableRef elemDither_enable; + domFog_enableRef elemFog_enable; + domTexture_pipeline_enableRef elemTexture_pipeline_enable; + domLight_enableRef elemLight_enable; + domLighting_enableRef elemLighting_enable; + domLight_model_two_side_enableRef elemLight_model_two_side_enable; + domLine_smooth_enableRef elemLine_smooth_enable; + domMultisample_enableRef elemMultisample_enable; + domNormalize_enableRef elemNormalize_enable; + domPoint_smooth_enableRef elemPoint_smooth_enable; + domPolygon_offset_fill_enableRef elemPolygon_offset_fill_enable; + domRescale_normal_enableRef elemRescale_normal_enable; + domSample_alpha_to_coverage_enableRef elemSample_alpha_to_coverage_enable; + domSample_alpha_to_one_enableRef elemSample_alpha_to_one_enable; + domSample_coverage_enableRef elemSample_coverage_enable; + domScissor_test_enableRef elemScissor_test_enable; + domStencil_test_enableRef elemStencil_test_enable; + /** + * Used to preserve order in elements that do not specify strict sequencing of sub-elements. + */ + daeElementRefArray _contents; + /** + * Used to preserve order in elements that have a complex content model. + */ + daeUIntArray _contentsOrder; + + +public: //Accessors and Mutators + /** + * Gets the alpha_func element. + * @return a daeSmartRef to the alpha_func element. + */ + const domAlpha_funcRef getAlpha_func() const { return elemAlpha_func; } + /** + * Gets the blend_func element. + * @return a daeSmartRef to the blend_func element. + */ + const domBlend_funcRef getBlend_func() const { return elemBlend_func; } + /** + * Gets the clear_color element. + * @return a daeSmartRef to the clear_color element. + */ + const domClear_colorRef getClear_color() const { return elemClear_color; } + /** + * Gets the clear_stencil element. + * @return a daeSmartRef to the clear_stencil element. + */ + const domClear_stencilRef getClear_stencil() const { return elemClear_stencil; } + /** + * Gets the clear_depth element. + * @return a daeSmartRef to the clear_depth element. + */ + const domClear_depthRef getClear_depth() const { return elemClear_depth; } + /** + * Gets the clip_plane element. + * @return a daeSmartRef to the clip_plane element. + */ + const domClip_planeRef getClip_plane() const { return elemClip_plane; } + /** + * Gets the color_mask element. + * @return a daeSmartRef to the color_mask element. + */ + const domColor_maskRef getColor_mask() const { return elemColor_mask; } + /** + * Gets the cull_face element. + * @return a daeSmartRef to the cull_face element. + */ + const domCull_faceRef getCull_face() const { return elemCull_face; } + /** + * Gets the depth_func element. + * @return a daeSmartRef to the depth_func element. + */ + const domDepth_funcRef getDepth_func() const { return elemDepth_func; } + /** + * Gets the depth_mask element. + * @return a daeSmartRef to the depth_mask element. + */ + const domDepth_maskRef getDepth_mask() const { return elemDepth_mask; } + /** + * Gets the depth_range element. + * @return a daeSmartRef to the depth_range element. + */ + const domDepth_rangeRef getDepth_range() const { return elemDepth_range; } + /** + * Gets the fog_color element. + * @return a daeSmartRef to the fog_color element. + */ + const domFog_colorRef getFog_color() const { return elemFog_color; } + /** + * Gets the fog_density element. + * @return a daeSmartRef to the fog_density element. + */ + const domFog_densityRef getFog_density() const { return elemFog_density; } + /** + * Gets the fog_mode element. + * @return a daeSmartRef to the fog_mode element. + */ + const domFog_modeRef getFog_mode() const { return elemFog_mode; } + /** + * Gets the fog_start element. + * @return a daeSmartRef to the fog_start element. + */ + const domFog_startRef getFog_start() const { return elemFog_start; } + /** + * Gets the fog_end element. + * @return a daeSmartRef to the fog_end element. + */ + const domFog_endRef getFog_end() const { return elemFog_end; } + /** + * Gets the front_face element. + * @return a daeSmartRef to the front_face element. + */ + const domFront_faceRef getFront_face() const { return elemFront_face; } + /** + * Gets the texture_pipeline element. + * @return a daeSmartRef to the texture_pipeline element. + */ + const domTexture_pipelineRef getTexture_pipeline() const { return elemTexture_pipeline; } + /** + * Gets the logic_op element. + * @return a daeSmartRef to the logic_op element. + */ + const domLogic_opRef getLogic_op() const { return elemLogic_op; } + /** + * Gets the light_ambient element. + * @return a daeSmartRef to the light_ambient element. + */ + const domLight_ambientRef getLight_ambient() const { return elemLight_ambient; } + /** + * Gets the light_diffuse element. + * @return a daeSmartRef to the light_diffuse element. + */ + const domLight_diffuseRef getLight_diffuse() const { return elemLight_diffuse; } + /** + * Gets the light_specular element. + * @return a daeSmartRef to the light_specular element. + */ + const domLight_specularRef getLight_specular() const { return elemLight_specular; } + /** + * Gets the light_position element. + * @return a daeSmartRef to the light_position element. + */ + const domLight_positionRef getLight_position() const { return elemLight_position; } + /** + * Gets the light_constant_attenuation element. + * @return a daeSmartRef to the light_constant_attenuation element. + */ + const domLight_constant_attenuationRef getLight_constant_attenuation() const { return elemLight_constant_attenuation; } + /** + * Gets the light_linear_attenutation element. + * @return a daeSmartRef to the light_linear_attenutation element. + */ + const domLight_linear_attenutationRef getLight_linear_attenutation() const { return elemLight_linear_attenutation; } + /** + * Gets the light_quadratic_attenuation element. + * @return a daeSmartRef to the light_quadratic_attenuation element. + */ + const domLight_quadratic_attenuationRef getLight_quadratic_attenuation() const { return elemLight_quadratic_attenuation; } + /** + * Gets the light_spot_cutoff element. + * @return a daeSmartRef to the light_spot_cutoff element. + */ + const domLight_spot_cutoffRef getLight_spot_cutoff() const { return elemLight_spot_cutoff; } + /** + * Gets the light_spot_direction element. + * @return a daeSmartRef to the light_spot_direction element. + */ + const domLight_spot_directionRef getLight_spot_direction() const { return elemLight_spot_direction; } + /** + * Gets the light_spot_exponent element. + * @return a daeSmartRef to the light_spot_exponent element. + */ + const domLight_spot_exponentRef getLight_spot_exponent() const { return elemLight_spot_exponent; } + /** + * Gets the light_model_ambient element. + * @return a daeSmartRef to the light_model_ambient element. + */ + const domLight_model_ambientRef getLight_model_ambient() const { return elemLight_model_ambient; } + /** + * Gets the line_width element. + * @return a daeSmartRef to the line_width element. + */ + const domLine_widthRef getLine_width() const { return elemLine_width; } + /** + * Gets the material_ambient element. + * @return a daeSmartRef to the material_ambient element. + */ + const domMaterial_ambientRef getMaterial_ambient() const { return elemMaterial_ambient; } + /** + * Gets the material_diffuse element. + * @return a daeSmartRef to the material_diffuse element. + */ + const domMaterial_diffuseRef getMaterial_diffuse() const { return elemMaterial_diffuse; } + /** + * Gets the material_emission element. + * @return a daeSmartRef to the material_emission element. + */ + const domMaterial_emissionRef getMaterial_emission() const { return elemMaterial_emission; } + /** + * Gets the material_shininess element. + * @return a daeSmartRef to the material_shininess element. + */ + const domMaterial_shininessRef getMaterial_shininess() const { return elemMaterial_shininess; } + /** + * Gets the material_specular element. + * @return a daeSmartRef to the material_specular element. + */ + const domMaterial_specularRef getMaterial_specular() const { return elemMaterial_specular; } + /** + * Gets the model_view_matrix element. + * @return a daeSmartRef to the model_view_matrix element. + */ + const domModel_view_matrixRef getModel_view_matrix() const { return elemModel_view_matrix; } + /** + * Gets the point_distance_attenuation element. + * @return a daeSmartRef to the point_distance_attenuation element. + */ + const domPoint_distance_attenuationRef getPoint_distance_attenuation() const { return elemPoint_distance_attenuation; } + /** + * Gets the point_fade_threshold_size element. + * @return a daeSmartRef to the point_fade_threshold_size element. + */ + const domPoint_fade_threshold_sizeRef getPoint_fade_threshold_size() const { return elemPoint_fade_threshold_size; } + /** + * Gets the point_size element. + * @return a daeSmartRef to the point_size element. + */ + const domPoint_sizeRef getPoint_size() const { return elemPoint_size; } + /** + * Gets the point_size_min element. + * @return a daeSmartRef to the point_size_min element. + */ + const domPoint_size_minRef getPoint_size_min() const { return elemPoint_size_min; } + /** + * Gets the point_size_max element. + * @return a daeSmartRef to the point_size_max element. + */ + const domPoint_size_maxRef getPoint_size_max() const { return elemPoint_size_max; } + /** + * Gets the polygon_offset element. + * @return a daeSmartRef to the polygon_offset element. + */ + const domPolygon_offsetRef getPolygon_offset() const { return elemPolygon_offset; } + /** + * Gets the projection_matrix element. + * @return a daeSmartRef to the projection_matrix element. + */ + const domProjection_matrixRef getProjection_matrix() const { return elemProjection_matrix; } + /** + * Gets the scissor element. + * @return a daeSmartRef to the scissor element. + */ + const domScissorRef getScissor() const { return elemScissor; } + /** + * Gets the shade_model element. + * @return a daeSmartRef to the shade_model element. + */ + const domShade_modelRef getShade_model() const { return elemShade_model; } + /** + * Gets the stencil_func element. + * @return a daeSmartRef to the stencil_func element. + */ + const domStencil_funcRef getStencil_func() const { return elemStencil_func; } + /** + * Gets the stencil_mask element. + * @return a daeSmartRef to the stencil_mask element. + */ + const domStencil_maskRef getStencil_mask() const { return elemStencil_mask; } + /** + * Gets the stencil_op element. + * @return a daeSmartRef to the stencil_op element. + */ + const domStencil_opRef getStencil_op() const { return elemStencil_op; } + /** + * Gets the alpha_test_enable element. + * @return a daeSmartRef to the alpha_test_enable element. + */ + const domAlpha_test_enableRef getAlpha_test_enable() const { return elemAlpha_test_enable; } + /** + * Gets the blend_enable element. + * @return a daeSmartRef to the blend_enable element. + */ + const domBlend_enableRef getBlend_enable() const { return elemBlend_enable; } + /** + * Gets the clip_plane_enable element. + * @return a daeSmartRef to the clip_plane_enable element. + */ + const domClip_plane_enableRef getClip_plane_enable() const { return elemClip_plane_enable; } + /** + * Gets the color_logic_op_enable element. + * @return a daeSmartRef to the color_logic_op_enable element. + */ + const domColor_logic_op_enableRef getColor_logic_op_enable() const { return elemColor_logic_op_enable; } + /** + * Gets the color_material_enable element. + * @return a daeSmartRef to the color_material_enable element. + */ + const domColor_material_enableRef getColor_material_enable() const { return elemColor_material_enable; } + /** + * Gets the cull_face_enable element. + * @return a daeSmartRef to the cull_face_enable element. + */ + const domCull_face_enableRef getCull_face_enable() const { return elemCull_face_enable; } + /** + * Gets the depth_test_enable element. + * @return a daeSmartRef to the depth_test_enable element. + */ + const domDepth_test_enableRef getDepth_test_enable() const { return elemDepth_test_enable; } + /** + * Gets the dither_enable element. + * @return a daeSmartRef to the dither_enable element. + */ + const domDither_enableRef getDither_enable() const { return elemDither_enable; } + /** + * Gets the fog_enable element. + * @return a daeSmartRef to the fog_enable element. + */ + const domFog_enableRef getFog_enable() const { return elemFog_enable; } + /** + * Gets the texture_pipeline_enable element. + * @return a daeSmartRef to the texture_pipeline_enable element. + */ + const domTexture_pipeline_enableRef getTexture_pipeline_enable() const { return elemTexture_pipeline_enable; } + /** + * Gets the light_enable element. + * @return a daeSmartRef to the light_enable element. + */ + const domLight_enableRef getLight_enable() const { return elemLight_enable; } + /** + * Gets the lighting_enable element. + * @return a daeSmartRef to the lighting_enable element. + */ + const domLighting_enableRef getLighting_enable() const { return elemLighting_enable; } + /** + * Gets the light_model_two_side_enable element. + * @return a daeSmartRef to the light_model_two_side_enable element. + */ + const domLight_model_two_side_enableRef getLight_model_two_side_enable() const { return elemLight_model_two_side_enable; } + /** + * Gets the line_smooth_enable element. + * @return a daeSmartRef to the line_smooth_enable element. + */ + const domLine_smooth_enableRef getLine_smooth_enable() const { return elemLine_smooth_enable; } + /** + * Gets the multisample_enable element. + * @return a daeSmartRef to the multisample_enable element. + */ + const domMultisample_enableRef getMultisample_enable() const { return elemMultisample_enable; } + /** + * Gets the normalize_enable element. + * @return a daeSmartRef to the normalize_enable element. + */ + const domNormalize_enableRef getNormalize_enable() const { return elemNormalize_enable; } + /** + * Gets the point_smooth_enable element. + * @return a daeSmartRef to the point_smooth_enable element. + */ + const domPoint_smooth_enableRef getPoint_smooth_enable() const { return elemPoint_smooth_enable; } + /** + * Gets the polygon_offset_fill_enable element. + * @return a daeSmartRef to the polygon_offset_fill_enable element. + */ + const domPolygon_offset_fill_enableRef getPolygon_offset_fill_enable() const { return elemPolygon_offset_fill_enable; } + /** + * Gets the rescale_normal_enable element. + * @return a daeSmartRef to the rescale_normal_enable element. + */ + const domRescale_normal_enableRef getRescale_normal_enable() const { return elemRescale_normal_enable; } + /** + * Gets the sample_alpha_to_coverage_enable element. + * @return a daeSmartRef to the sample_alpha_to_coverage_enable element. + */ + const domSample_alpha_to_coverage_enableRef getSample_alpha_to_coverage_enable() const { return elemSample_alpha_to_coverage_enable; } + /** + * Gets the sample_alpha_to_one_enable element. + * @return a daeSmartRef to the sample_alpha_to_one_enable element. + */ + const domSample_alpha_to_one_enableRef getSample_alpha_to_one_enable() const { return elemSample_alpha_to_one_enable; } + /** + * Gets the sample_coverage_enable element. + * @return a daeSmartRef to the sample_coverage_enable element. + */ + const domSample_coverage_enableRef getSample_coverage_enable() const { return elemSample_coverage_enable; } + /** + * Gets the scissor_test_enable element. + * @return a daeSmartRef to the scissor_test_enable element. + */ + const domScissor_test_enableRef getScissor_test_enable() const { return elemScissor_test_enable; } + /** + * Gets the stencil_test_enable element. + * @return a daeSmartRef to the stencil_test_enable element. + */ + const domStencil_test_enableRef getStencil_test_enable() const { return elemStencil_test_enable; } + /** + * Gets the _contents array. + * @return Returns a reference to the _contents element array. + */ + daeElementRefArray &getContents() { return _contents; } + /** + * Gets the _contents array. + * @return Returns a constant reference to the _contents element array. + */ + const daeElementRefArray &getContents() const { return _contents; } + +protected: + /** + * Constructor + */ + domGles_pipeline_settings() : elemAlpha_func(), elemBlend_func(), elemClear_color(), elemClear_stencil(), elemClear_depth(), elemClip_plane(), elemColor_mask(), elemCull_face(), elemDepth_func(), elemDepth_mask(), elemDepth_range(), elemFog_color(), elemFog_density(), elemFog_mode(), elemFog_start(), elemFog_end(), elemFront_face(), elemTexture_pipeline(), elemLogic_op(), elemLight_ambient(), elemLight_diffuse(), elemLight_specular(), elemLight_position(), elemLight_constant_attenuation(), elemLight_linear_attenutation(), elemLight_quadratic_attenuation(), elemLight_spot_cutoff(), elemLight_spot_direction(), elemLight_spot_exponent(), elemLight_model_ambient(), elemLine_width(), elemMaterial_ambient(), elemMaterial_diffuse(), elemMaterial_emission(), elemMaterial_shininess(), elemMaterial_specular(), elemModel_view_matrix(), elemPoint_distance_attenuation(), elemPoint_fade_threshold_size(), elemPoint_size(), elemPoint_size_min(), elemPoint_size_max(), elemPolygon_offset(), elemProjection_matrix(), elemScissor(), elemShade_model(), elemStencil_func(), elemStencil_mask(), elemStencil_op(), elemAlpha_test_enable(), elemBlend_enable(), elemClip_plane_enable(), elemColor_logic_op_enable(), elemColor_material_enable(), elemCull_face_enable(), elemDepth_test_enable(), elemDither_enable(), elemFog_enable(), elemTexture_pipeline_enable(), elemLight_enable(), elemLighting_enable(), elemLight_model_two_side_enable(), elemLine_smooth_enable(), elemMultisample_enable(), elemNormalize_enable(), elemPoint_smooth_enable(), elemPolygon_offset_fill_enable(), elemRescale_normal_enable(), elemSample_alpha_to_coverage_enable(), elemSample_alpha_to_one_enable(), elemSample_coverage_enable(), elemScissor_test_enable(), elemStencil_test_enable() {} + /** + * Destructor + */ + virtual ~domGles_pipeline_settings() {} + /** + * Copy Constructor + */ + domGles_pipeline_settings( const domGles_pipeline_settings &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domGles_pipeline_settings &operator=( const domGles_pipeline_settings &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGles_sampler_state.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGles_sampler_state.h new file mode 100644 index 00000000..2407018f --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGles_sampler_state.h @@ -0,0 +1,657 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domGles_sampler_state_h__ +#define __domGles_sampler_state_h__ + +#include +#include + +#include + +/** + * Two-dimensional texture sampler state for profile_GLES. This is a bundle + * of sampler-specific states that will be referenced by one or more texture_units. + */ +class domGles_sampler_state_complexType +{ +public: + class domWrap_s; + + typedef daeSmartRef domWrap_sRef; + typedef daeTArray domWrap_s_Array; + + class domWrap_s : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::WRAP_S; } + + protected: // Value + /** + * The domGles_sampler_wrap value of the text data of this element. + */ + domGles_sampler_wrap _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a domGles_sampler_wrap of the value. + */ + domGles_sampler_wrap getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( domGles_sampler_wrap val ) { _value = val; } + + protected: + /** + * Constructor + */ + domWrap_s() : _value() {} + /** + * Destructor + */ + virtual ~domWrap_s() {} + /** + * Copy Constructor + */ + domWrap_s( const domWrap_s &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domWrap_s &operator=( const domWrap_s &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domWrap_t; + + typedef daeSmartRef domWrap_tRef; + typedef daeTArray domWrap_t_Array; + + class domWrap_t : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::WRAP_T; } + + protected: // Value + /** + * The domGles_sampler_wrap value of the text data of this element. + */ + domGles_sampler_wrap _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a domGles_sampler_wrap of the value. + */ + domGles_sampler_wrap getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( domGles_sampler_wrap val ) { _value = val; } + + protected: + /** + * Constructor + */ + domWrap_t() : _value() {} + /** + * Destructor + */ + virtual ~domWrap_t() {} + /** + * Copy Constructor + */ + domWrap_t( const domWrap_t &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domWrap_t &operator=( const domWrap_t &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domMinfilter; + + typedef daeSmartRef domMinfilterRef; + typedef daeTArray domMinfilter_Array; + + class domMinfilter : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::MINFILTER; } + + protected: // Value + /** + * The domFx_sampler_filter_common value of the text data of this element. + */ + domFx_sampler_filter_common _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a domFx_sampler_filter_common of the value. + */ + domFx_sampler_filter_common getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( domFx_sampler_filter_common val ) { _value = val; } + + protected: + /** + * Constructor + */ + domMinfilter() : _value() {} + /** + * Destructor + */ + virtual ~domMinfilter() {} + /** + * Copy Constructor + */ + domMinfilter( const domMinfilter &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domMinfilter &operator=( const domMinfilter &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domMagfilter; + + typedef daeSmartRef domMagfilterRef; + typedef daeTArray domMagfilter_Array; + + class domMagfilter : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::MAGFILTER; } + + protected: // Value + /** + * The domFx_sampler_filter_common value of the text data of this element. + */ + domFx_sampler_filter_common _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a domFx_sampler_filter_common of the value. + */ + domFx_sampler_filter_common getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( domFx_sampler_filter_common val ) { _value = val; } + + protected: + /** + * Constructor + */ + domMagfilter() : _value() {} + /** + * Destructor + */ + virtual ~domMagfilter() {} + /** + * Copy Constructor + */ + domMagfilter( const domMagfilter &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domMagfilter &operator=( const domMagfilter &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domMipfilter; + + typedef daeSmartRef domMipfilterRef; + typedef daeTArray domMipfilter_Array; + + class domMipfilter : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::MIPFILTER; } + + protected: // Value + /** + * The domFx_sampler_filter_common value of the text data of this element. + */ + domFx_sampler_filter_common _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a domFx_sampler_filter_common of the value. + */ + domFx_sampler_filter_common getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( domFx_sampler_filter_common val ) { _value = val; } + + protected: + /** + * Constructor + */ + domMipfilter() : _value() {} + /** + * Destructor + */ + virtual ~domMipfilter() {} + /** + * Copy Constructor + */ + domMipfilter( const domMipfilter &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domMipfilter &operator=( const domMipfilter &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domMipmap_maxlevel; + + typedef daeSmartRef domMipmap_maxlevelRef; + typedef daeTArray domMipmap_maxlevel_Array; + + class domMipmap_maxlevel : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::MIPMAP_MAXLEVEL; } + + protected: // Value + /** + * The xsUnsignedByte value of the text data of this element. + */ + xsUnsignedByte _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a xsUnsignedByte of the value. + */ + xsUnsignedByte getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( xsUnsignedByte val ) { _value = val; } + + protected: + /** + * Constructor + */ + domMipmap_maxlevel() : _value() {} + /** + * Destructor + */ + virtual ~domMipmap_maxlevel() {} + /** + * Copy Constructor + */ + domMipmap_maxlevel( const domMipmap_maxlevel &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domMipmap_maxlevel &operator=( const domMipmap_maxlevel &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domMipmap_bias; + + typedef daeSmartRef domMipmap_biasRef; + typedef daeTArray domMipmap_bias_Array; + + class domMipmap_bias : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::MIPMAP_BIAS; } + + protected: // Value + /** + * The xsFloat value of the text data of this element. + */ + xsFloat _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a xsFloat of the value. + */ + xsFloat getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( xsFloat val ) { _value = val; } + + protected: + /** + * Constructor + */ + domMipmap_bias() : _value() {} + /** + * Destructor + */ + virtual ~domMipmap_bias() {} + /** + * Copy Constructor + */ + domMipmap_bias( const domMipmap_bias &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domMipmap_bias &operator=( const domMipmap_bias &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + +protected: // Attribute +/** + * The sid attribute is a text string value containing the sub-identifier + * of this element. This value must be unique within the scope of the parent + * element. Optional attribute. + */ + xsNCName attrSid; + +protected: // Elements + domWrap_sRef elemWrap_s; + domWrap_tRef elemWrap_t; + domMinfilterRef elemMinfilter; + domMagfilterRef elemMagfilter; + domMipfilterRef elemMipfilter; + domMipmap_maxlevelRef elemMipmap_maxlevel; + domMipmap_biasRef elemMipmap_bias; +/** + * The extra element may appear any number of times. OpenGL ES extensions + * may be used here. @see domExtra + */ + domExtra_Array elemExtra_array; + +public: //Accessors and Mutators + /** + * Gets the sid attribute. + * @return Returns a xsNCName of the sid attribute. + */ + xsNCName getSid() const { return attrSid; } + /** + * Sets the sid attribute. + * @param atSid The new value for the sid attribute. + */ + void setSid( xsNCName atSid ) { *(daeStringRef*)&attrSid = atSid; } + + /** + * Gets the wrap_s element. + * @return a daeSmartRef to the wrap_s element. + */ + const domWrap_sRef getWrap_s() const { return elemWrap_s; } + /** + * Gets the wrap_t element. + * @return a daeSmartRef to the wrap_t element. + */ + const domWrap_tRef getWrap_t() const { return elemWrap_t; } + /** + * Gets the minfilter element. + * @return a daeSmartRef to the minfilter element. + */ + const domMinfilterRef getMinfilter() const { return elemMinfilter; } + /** + * Gets the magfilter element. + * @return a daeSmartRef to the magfilter element. + */ + const domMagfilterRef getMagfilter() const { return elemMagfilter; } + /** + * Gets the mipfilter element. + * @return a daeSmartRef to the mipfilter element. + */ + const domMipfilterRef getMipfilter() const { return elemMipfilter; } + /** + * Gets the mipmap_maxlevel element. + * @return a daeSmartRef to the mipmap_maxlevel element. + */ + const domMipmap_maxlevelRef getMipmap_maxlevel() const { return elemMipmap_maxlevel; } + /** + * Gets the mipmap_bias element. + * @return a daeSmartRef to the mipmap_bias element. + */ + const domMipmap_biasRef getMipmap_bias() const { return elemMipmap_bias; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } +protected: + /** + * Constructor + */ + domGles_sampler_state_complexType() : attrSid(), elemWrap_s(), elemWrap_t(), elemMinfilter(), elemMagfilter(), elemMipfilter(), elemMipmap_maxlevel(), elemMipmap_bias(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domGles_sampler_state_complexType() {} + /** + * Copy Constructor + */ + domGles_sampler_state_complexType( const domGles_sampler_state_complexType &cpy ) { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domGles_sampler_state_complexType &operator=( const domGles_sampler_state_complexType &cpy ) { (void)cpy; return *this; } +}; + +/** + * An element of type domGles_sampler_state_complexType. + */ +class domGles_sampler_state : public daeElement, public domGles_sampler_state_complexType +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::GLES_SAMPLER_STATE; } + +public: //Accessors and Mutators + /** + * Gets the sid attribute. + * @return Returns a xsNCName of the sid attribute. + */ + xsNCName getSid() const { return attrSid; } + /** + * Sets the sid attribute. + * @param atSid The new value for the sid attribute. + */ + void setSid( xsNCName atSid ) { *(daeStringRef*)&attrSid = atSid; + _validAttributeArray[0] = true; } + +protected: + /** + * Constructor + */ + domGles_sampler_state() {} + /** + * Destructor + */ + virtual ~domGles_sampler_state() {} + /** + * Copy Constructor + */ + domGles_sampler_state( const domGles_sampler_state &cpy ) : daeElement(), domGles_sampler_state_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domGles_sampler_state &operator=( const domGles_sampler_state &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGles_texcombiner_argumentAlpha_type.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGles_texcombiner_argumentAlpha_type.h new file mode 100644 index 00000000..4c85e318 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGles_texcombiner_argumentAlpha_type.h @@ -0,0 +1,166 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domGles_texcombiner_argumentAlpha_type_h__ +#define __domGles_texcombiner_argumentAlpha_type_h__ + +#include +#include + + +class domGles_texcombiner_argumentAlpha_type_complexType +{ +protected: // Attributes + domGles_texcombiner_source_enums attrSource; + domGles_texcombiner_operandAlpha_enums attrOperand; + xsNCName attrUnit; + + +public: //Accessors and Mutators + /** + * Gets the source attribute. + * @return Returns a domGles_texcombiner_source_enums of the source attribute. + */ + domGles_texcombiner_source_enums getSource() const { return attrSource; } + /** + * Sets the source attribute. + * @param atSource The new value for the source attribute. + */ + void setSource( domGles_texcombiner_source_enums atSource ) { attrSource = atSource; } + + /** + * Gets the operand attribute. + * @return Returns a domGles_texcombiner_operandAlpha_enums of the operand attribute. + */ + domGles_texcombiner_operandAlpha_enums getOperand() const { return attrOperand; } + /** + * Sets the operand attribute. + * @param atOperand The new value for the operand attribute. + */ + void setOperand( domGles_texcombiner_operandAlpha_enums atOperand ) { attrOperand = atOperand; } + + /** + * Gets the unit attribute. + * @return Returns a xsNCName of the unit attribute. + */ + xsNCName getUnit() const { return attrUnit; } + /** + * Sets the unit attribute. + * @param atUnit The new value for the unit attribute. + */ + void setUnit( xsNCName atUnit ) { *(daeStringRef*)&attrUnit = atUnit; } + +protected: + /** + * Constructor + */ + domGles_texcombiner_argumentAlpha_type_complexType() : attrSource(), attrOperand(), attrUnit() {} + /** + * Destructor + */ + virtual ~domGles_texcombiner_argumentAlpha_type_complexType() {} + /** + * Copy Constructor + */ + domGles_texcombiner_argumentAlpha_type_complexType( const domGles_texcombiner_argumentAlpha_type_complexType &cpy ) { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domGles_texcombiner_argumentAlpha_type_complexType &operator=( const domGles_texcombiner_argumentAlpha_type_complexType &cpy ) { (void)cpy; return *this; } +}; + +/** + * An element of type domGles_texcombiner_argumentAlpha_type_complexType. + */ +class domGles_texcombiner_argumentAlpha_type : public daeElement, public domGles_texcombiner_argumentAlpha_type_complexType +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::GLES_TEXCOMBINER_ARGUMENTALPHA_TYPE; } + +public: //Accessors and Mutators + /** + * Gets the source attribute. + * @return Returns a domGles_texcombiner_source_enums of the source attribute. + */ + domGles_texcombiner_source_enums getSource() const { return attrSource; } + /** + * Sets the source attribute. + * @param atSource The new value for the source attribute. + */ + void setSource( domGles_texcombiner_source_enums atSource ) { attrSource = atSource; + _validAttributeArray[0] = true; } + + /** + * Gets the operand attribute. + * @return Returns a domGles_texcombiner_operandAlpha_enums of the operand attribute. + */ + domGles_texcombiner_operandAlpha_enums getOperand() const { return attrOperand; } + /** + * Sets the operand attribute. + * @param atOperand The new value for the operand attribute. + */ + void setOperand( domGles_texcombiner_operandAlpha_enums atOperand ) { attrOperand = atOperand; + _validAttributeArray[1] = true; } + + /** + * Gets the unit attribute. + * @return Returns a xsNCName of the unit attribute. + */ + xsNCName getUnit() const { return attrUnit; } + /** + * Sets the unit attribute. + * @param atUnit The new value for the unit attribute. + */ + void setUnit( xsNCName atUnit ) { *(daeStringRef*)&attrUnit = atUnit; + _validAttributeArray[2] = true; } + +protected: + /** + * Constructor + */ + domGles_texcombiner_argumentAlpha_type() {} + /** + * Destructor + */ + virtual ~domGles_texcombiner_argumentAlpha_type() {} + /** + * Copy Constructor + */ + domGles_texcombiner_argumentAlpha_type( const domGles_texcombiner_argumentAlpha_type &cpy ) : daeElement(), domGles_texcombiner_argumentAlpha_type_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domGles_texcombiner_argumentAlpha_type &operator=( const domGles_texcombiner_argumentAlpha_type &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGles_texcombiner_argumentRGB_type.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGles_texcombiner_argumentRGB_type.h new file mode 100644 index 00000000..c2aeaeee --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGles_texcombiner_argumentRGB_type.h @@ -0,0 +1,166 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domGles_texcombiner_argumentRGB_type_h__ +#define __domGles_texcombiner_argumentRGB_type_h__ + +#include +#include + + +class domGles_texcombiner_argumentRGB_type_complexType +{ +protected: // Attributes + domGles_texcombiner_source_enums attrSource; + domGles_texcombiner_operandRGB_enums attrOperand; + xsNCName attrUnit; + + +public: //Accessors and Mutators + /** + * Gets the source attribute. + * @return Returns a domGles_texcombiner_source_enums of the source attribute. + */ + domGles_texcombiner_source_enums getSource() const { return attrSource; } + /** + * Sets the source attribute. + * @param atSource The new value for the source attribute. + */ + void setSource( domGles_texcombiner_source_enums atSource ) { attrSource = atSource; } + + /** + * Gets the operand attribute. + * @return Returns a domGles_texcombiner_operandRGB_enums of the operand attribute. + */ + domGles_texcombiner_operandRGB_enums getOperand() const { return attrOperand; } + /** + * Sets the operand attribute. + * @param atOperand The new value for the operand attribute. + */ + void setOperand( domGles_texcombiner_operandRGB_enums atOperand ) { attrOperand = atOperand; } + + /** + * Gets the unit attribute. + * @return Returns a xsNCName of the unit attribute. + */ + xsNCName getUnit() const { return attrUnit; } + /** + * Sets the unit attribute. + * @param atUnit The new value for the unit attribute. + */ + void setUnit( xsNCName atUnit ) { *(daeStringRef*)&attrUnit = atUnit; } + +protected: + /** + * Constructor + */ + domGles_texcombiner_argumentRGB_type_complexType() : attrSource(), attrOperand(), attrUnit() {} + /** + * Destructor + */ + virtual ~domGles_texcombiner_argumentRGB_type_complexType() {} + /** + * Copy Constructor + */ + domGles_texcombiner_argumentRGB_type_complexType( const domGles_texcombiner_argumentRGB_type_complexType &cpy ) { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domGles_texcombiner_argumentRGB_type_complexType &operator=( const domGles_texcombiner_argumentRGB_type_complexType &cpy ) { (void)cpy; return *this; } +}; + +/** + * An element of type domGles_texcombiner_argumentRGB_type_complexType. + */ +class domGles_texcombiner_argumentRGB_type : public daeElement, public domGles_texcombiner_argumentRGB_type_complexType +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::GLES_TEXCOMBINER_ARGUMENTRGB_TYPE; } + +public: //Accessors and Mutators + /** + * Gets the source attribute. + * @return Returns a domGles_texcombiner_source_enums of the source attribute. + */ + domGles_texcombiner_source_enums getSource() const { return attrSource; } + /** + * Sets the source attribute. + * @param atSource The new value for the source attribute. + */ + void setSource( domGles_texcombiner_source_enums atSource ) { attrSource = atSource; + _validAttributeArray[0] = true; } + + /** + * Gets the operand attribute. + * @return Returns a domGles_texcombiner_operandRGB_enums of the operand attribute. + */ + domGles_texcombiner_operandRGB_enums getOperand() const { return attrOperand; } + /** + * Sets the operand attribute. + * @param atOperand The new value for the operand attribute. + */ + void setOperand( domGles_texcombiner_operandRGB_enums atOperand ) { attrOperand = atOperand; + _validAttributeArray[1] = true; } + + /** + * Gets the unit attribute. + * @return Returns a xsNCName of the unit attribute. + */ + xsNCName getUnit() const { return attrUnit; } + /** + * Sets the unit attribute. + * @param atUnit The new value for the unit attribute. + */ + void setUnit( xsNCName atUnit ) { *(daeStringRef*)&attrUnit = atUnit; + _validAttributeArray[2] = true; } + +protected: + /** + * Constructor + */ + domGles_texcombiner_argumentRGB_type() {} + /** + * Destructor + */ + virtual ~domGles_texcombiner_argumentRGB_type() {} + /** + * Copy Constructor + */ + domGles_texcombiner_argumentRGB_type( const domGles_texcombiner_argumentRGB_type &cpy ) : daeElement(), domGles_texcombiner_argumentRGB_type_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domGles_texcombiner_argumentRGB_type &operator=( const domGles_texcombiner_argumentRGB_type &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGles_texcombiner_commandAlpha_type.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGles_texcombiner_commandAlpha_type.h new file mode 100644 index 00000000..27c04131 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGles_texcombiner_commandAlpha_type.h @@ -0,0 +1,155 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domGles_texcombiner_commandAlpha_type_h__ +#define __domGles_texcombiner_commandAlpha_type_h__ + +#include +#include + +#include + +class domGles_texcombiner_commandAlpha_type_complexType +{ +protected: // Attributes + domGles_texcombiner_operatorAlpha_enums attrOperator; + xsFloat attrScale; + +protected: // Element + domGles_texcombiner_argumentAlpha_type_Array elemArgument_array; + +public: //Accessors and Mutators + /** + * Gets the operator attribute. + * @return Returns a domGles_texcombiner_operatorAlpha_enums of the operator attribute. + */ + domGles_texcombiner_operatorAlpha_enums getOperator() const { return attrOperator; } + /** + * Sets the operator attribute. + * @param atOperator The new value for the operator attribute. + */ + void setOperator( domGles_texcombiner_operatorAlpha_enums atOperator ) { attrOperator = atOperator; } + + /** + * Gets the scale attribute. + * @return Returns a xsFloat of the scale attribute. + */ + xsFloat getScale() const { return attrScale; } + /** + * Sets the scale attribute. + * @param atScale The new value for the scale attribute. + */ + void setScale( xsFloat atScale ) { attrScale = atScale; } + + /** + * Gets the argument element array. + * @return Returns a reference to the array of argument elements. + */ + domGles_texcombiner_argumentAlpha_type_Array &getArgument_array() { return elemArgument_array; } + /** + * Gets the argument element array. + * @return Returns a constant reference to the array of argument elements. + */ + const domGles_texcombiner_argumentAlpha_type_Array &getArgument_array() const { return elemArgument_array; } +protected: + /** + * Constructor + */ + domGles_texcombiner_commandAlpha_type_complexType() : attrOperator(), attrScale(), elemArgument_array() {} + /** + * Destructor + */ + virtual ~domGles_texcombiner_commandAlpha_type_complexType() {} + /** + * Copy Constructor + */ + domGles_texcombiner_commandAlpha_type_complexType( const domGles_texcombiner_commandAlpha_type_complexType &cpy ) { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domGles_texcombiner_commandAlpha_type_complexType &operator=( const domGles_texcombiner_commandAlpha_type_complexType &cpy ) { (void)cpy; return *this; } +}; + +/** + * An element of type domGles_texcombiner_commandAlpha_type_complexType. + */ +class domGles_texcombiner_commandAlpha_type : public daeElement, public domGles_texcombiner_commandAlpha_type_complexType +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::GLES_TEXCOMBINER_COMMANDALPHA_TYPE; } + +public: //Accessors and Mutators + /** + * Gets the operator attribute. + * @return Returns a domGles_texcombiner_operatorAlpha_enums of the operator attribute. + */ + domGles_texcombiner_operatorAlpha_enums getOperator() const { return attrOperator; } + /** + * Sets the operator attribute. + * @param atOperator The new value for the operator attribute. + */ + void setOperator( domGles_texcombiner_operatorAlpha_enums atOperator ) { attrOperator = atOperator; + _validAttributeArray[0] = true; } + + /** + * Gets the scale attribute. + * @return Returns a xsFloat of the scale attribute. + */ + xsFloat getScale() const { return attrScale; } + /** + * Sets the scale attribute. + * @param atScale The new value for the scale attribute. + */ + void setScale( xsFloat atScale ) { attrScale = atScale; + _validAttributeArray[1] = true; } + +protected: + /** + * Constructor + */ + domGles_texcombiner_commandAlpha_type() {} + /** + * Destructor + */ + virtual ~domGles_texcombiner_commandAlpha_type() {} + /** + * Copy Constructor + */ + domGles_texcombiner_commandAlpha_type( const domGles_texcombiner_commandAlpha_type &cpy ) : daeElement(), domGles_texcombiner_commandAlpha_type_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domGles_texcombiner_commandAlpha_type &operator=( const domGles_texcombiner_commandAlpha_type &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGles_texcombiner_commandRGB_type.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGles_texcombiner_commandRGB_type.h new file mode 100644 index 00000000..386f8c7c --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGles_texcombiner_commandRGB_type.h @@ -0,0 +1,159 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domGles_texcombiner_commandRGB_type_h__ +#define __domGles_texcombiner_commandRGB_type_h__ + +#include +#include + +#include + +/** + * Defines the RGB portion of a texture_pipeline command. This is a combiner-mode + * texturing operation. + */ +class domGles_texcombiner_commandRGB_type_complexType +{ +protected: // Attributes + domGles_texcombiner_operatorRGB_enums attrOperator; + xsFloat attrScale; + +protected: // Element + domGles_texcombiner_argumentRGB_type_Array elemArgument_array; + +public: //Accessors and Mutators + /** + * Gets the operator attribute. + * @return Returns a domGles_texcombiner_operatorRGB_enums of the operator attribute. + */ + domGles_texcombiner_operatorRGB_enums getOperator() const { return attrOperator; } + /** + * Sets the operator attribute. + * @param atOperator The new value for the operator attribute. + */ + void setOperator( domGles_texcombiner_operatorRGB_enums atOperator ) { attrOperator = atOperator; } + + /** + * Gets the scale attribute. + * @return Returns a xsFloat of the scale attribute. + */ + xsFloat getScale() const { return attrScale; } + /** + * Sets the scale attribute. + * @param atScale The new value for the scale attribute. + */ + void setScale( xsFloat atScale ) { attrScale = atScale; } + + /** + * Gets the argument element array. + * @return Returns a reference to the array of argument elements. + */ + domGles_texcombiner_argumentRGB_type_Array &getArgument_array() { return elemArgument_array; } + /** + * Gets the argument element array. + * @return Returns a constant reference to the array of argument elements. + */ + const domGles_texcombiner_argumentRGB_type_Array &getArgument_array() const { return elemArgument_array; } +protected: + /** + * Constructor + */ + domGles_texcombiner_commandRGB_type_complexType() : attrOperator(), attrScale(), elemArgument_array() {} + /** + * Destructor + */ + virtual ~domGles_texcombiner_commandRGB_type_complexType() {} + /** + * Copy Constructor + */ + domGles_texcombiner_commandRGB_type_complexType( const domGles_texcombiner_commandRGB_type_complexType &cpy ) { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domGles_texcombiner_commandRGB_type_complexType &operator=( const domGles_texcombiner_commandRGB_type_complexType &cpy ) { (void)cpy; return *this; } +}; + +/** + * An element of type domGles_texcombiner_commandRGB_type_complexType. + */ +class domGles_texcombiner_commandRGB_type : public daeElement, public domGles_texcombiner_commandRGB_type_complexType +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::GLES_TEXCOMBINER_COMMANDRGB_TYPE; } + +public: //Accessors and Mutators + /** + * Gets the operator attribute. + * @return Returns a domGles_texcombiner_operatorRGB_enums of the operator attribute. + */ + domGles_texcombiner_operatorRGB_enums getOperator() const { return attrOperator; } + /** + * Sets the operator attribute. + * @param atOperator The new value for the operator attribute. + */ + void setOperator( domGles_texcombiner_operatorRGB_enums atOperator ) { attrOperator = atOperator; + _validAttributeArray[0] = true; } + + /** + * Gets the scale attribute. + * @return Returns a xsFloat of the scale attribute. + */ + xsFloat getScale() const { return attrScale; } + /** + * Sets the scale attribute. + * @param atScale The new value for the scale attribute. + */ + void setScale( xsFloat atScale ) { attrScale = atScale; + _validAttributeArray[1] = true; } + +protected: + /** + * Constructor + */ + domGles_texcombiner_commandRGB_type() {} + /** + * Destructor + */ + virtual ~domGles_texcombiner_commandRGB_type() {} + /** + * Copy Constructor + */ + domGles_texcombiner_commandRGB_type( const domGles_texcombiner_commandRGB_type &cpy ) : daeElement(), domGles_texcombiner_commandRGB_type_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domGles_texcombiner_commandRGB_type &operator=( const domGles_texcombiner_commandRGB_type &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGles_texcombiner_command_type.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGles_texcombiner_command_type.h new file mode 100644 index 00000000..0e6f62a8 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGles_texcombiner_command_type.h @@ -0,0 +1,113 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domGles_texcombiner_command_type_h__ +#define __domGles_texcombiner_command_type_h__ + +#include +#include + +#include +#include +#include + +class domGles_texcombiner_command_type_complexType +{ + +protected: // Elements + domGles_texture_constant_typeRef elemConstant; + domGles_texcombiner_commandRGB_typeRef elemRGB; + domGles_texcombiner_commandAlpha_typeRef elemAlpha; + +public: //Accessors and Mutators + /** + * Gets the constant element. + * @return a daeSmartRef to the constant element. + */ + const domGles_texture_constant_typeRef getConstant() const { return elemConstant; } + /** + * Gets the RGB element. + * @return a daeSmartRef to the RGB element. + */ + const domGles_texcombiner_commandRGB_typeRef getRGB() const { return elemRGB; } + /** + * Gets the alpha element. + * @return a daeSmartRef to the alpha element. + */ + const domGles_texcombiner_commandAlpha_typeRef getAlpha() const { return elemAlpha; } +protected: + /** + * Constructor + */ + domGles_texcombiner_command_type_complexType() : elemConstant(), elemRGB(), elemAlpha() {} + /** + * Destructor + */ + virtual ~domGles_texcombiner_command_type_complexType() {} + /** + * Copy Constructor + */ + domGles_texcombiner_command_type_complexType( const domGles_texcombiner_command_type_complexType &cpy ) { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domGles_texcombiner_command_type_complexType &operator=( const domGles_texcombiner_command_type_complexType &cpy ) { (void)cpy; return *this; } +}; + +/** + * An element of type domGles_texcombiner_command_type_complexType. + */ +class domGles_texcombiner_command_type : public daeElement, public domGles_texcombiner_command_type_complexType +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::GLES_TEXCOMBINER_COMMAND_TYPE; } +protected: + /** + * Constructor + */ + domGles_texcombiner_command_type() {} + /** + * Destructor + */ + virtual ~domGles_texcombiner_command_type() {} + /** + * Copy Constructor + */ + domGles_texcombiner_command_type( const domGles_texcombiner_command_type &cpy ) : daeElement(), domGles_texcombiner_command_type_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domGles_texcombiner_command_type &operator=( const domGles_texcombiner_command_type &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGles_texenv_command_type.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGles_texenv_command_type.h new file mode 100644 index 00000000..8e4f8e18 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGles_texenv_command_type.h @@ -0,0 +1,150 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domGles_texenv_command_type_h__ +#define __domGles_texenv_command_type_h__ + +#include +#include + +#include + +class domGles_texenv_command_type_complexType +{ +protected: // Attributes + domGles_texenv_mode_enums attrOperator; + xsNCName attrUnit; + +protected: // Element + domGles_texture_constant_typeRef elemConstant; + +public: //Accessors and Mutators + /** + * Gets the operator attribute. + * @return Returns a domGles_texenv_mode_enums of the operator attribute. + */ + domGles_texenv_mode_enums getOperator() const { return attrOperator; } + /** + * Sets the operator attribute. + * @param atOperator The new value for the operator attribute. + */ + void setOperator( domGles_texenv_mode_enums atOperator ) { attrOperator = atOperator; } + + /** + * Gets the unit attribute. + * @return Returns a xsNCName of the unit attribute. + */ + xsNCName getUnit() const { return attrUnit; } + /** + * Sets the unit attribute. + * @param atUnit The new value for the unit attribute. + */ + void setUnit( xsNCName atUnit ) { *(daeStringRef*)&attrUnit = atUnit; } + + /** + * Gets the constant element. + * @return a daeSmartRef to the constant element. + */ + const domGles_texture_constant_typeRef getConstant() const { return elemConstant; } +protected: + /** + * Constructor + */ + domGles_texenv_command_type_complexType() : attrOperator(), attrUnit(), elemConstant() {} + /** + * Destructor + */ + virtual ~domGles_texenv_command_type_complexType() {} + /** + * Copy Constructor + */ + domGles_texenv_command_type_complexType( const domGles_texenv_command_type_complexType &cpy ) { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domGles_texenv_command_type_complexType &operator=( const domGles_texenv_command_type_complexType &cpy ) { (void)cpy; return *this; } +}; + +/** + * An element of type domGles_texenv_command_type_complexType. + */ +class domGles_texenv_command_type : public daeElement, public domGles_texenv_command_type_complexType +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::GLES_TEXENV_COMMAND_TYPE; } + +public: //Accessors and Mutators + /** + * Gets the operator attribute. + * @return Returns a domGles_texenv_mode_enums of the operator attribute. + */ + domGles_texenv_mode_enums getOperator() const { return attrOperator; } + /** + * Sets the operator attribute. + * @param atOperator The new value for the operator attribute. + */ + void setOperator( domGles_texenv_mode_enums atOperator ) { attrOperator = atOperator; + _validAttributeArray[0] = true; } + + /** + * Gets the unit attribute. + * @return Returns a xsNCName of the unit attribute. + */ + xsNCName getUnit() const { return attrUnit; } + /** + * Sets the unit attribute. + * @param atUnit The new value for the unit attribute. + */ + void setUnit( xsNCName atUnit ) { *(daeStringRef*)&attrUnit = atUnit; + _validAttributeArray[1] = true; } + +protected: + /** + * Constructor + */ + domGles_texenv_command_type() {} + /** + * Destructor + */ + virtual ~domGles_texenv_command_type() {} + /** + * Copy Constructor + */ + domGles_texenv_command_type( const domGles_texenv_command_type &cpy ) : daeElement(), domGles_texenv_command_type_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domGles_texenv_command_type &operator=( const domGles_texenv_command_type &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGles_texture_constant_type.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGles_texture_constant_type.h new file mode 100644 index 00000000..2b7e4713 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGles_texture_constant_type.h @@ -0,0 +1,152 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domGles_texture_constant_type_h__ +#define __domGles_texture_constant_type_h__ + +#include +#include + + +class domGles_texture_constant_type_complexType +{ +protected: // Attributes + domFloat4 attrValue; + xsNCName attrParam; + + +public: //Accessors and Mutators + /** + * Gets the value array attribute. + * @return Returns a domFloat4 reference of the value array attribute. + */ + domFloat4 &getValue() { return attrValue; } + /** + * Gets the value array attribute. + * @return Returns a constant domFloat4 reference of the value array attribute. + */ + const domFloat4 &getValue() const { return attrValue; } + /** + * Sets the value array attribute. + * @param atValue The new value for the value array attribute. + */ + void setValue( const domFloat4 &atValue ) { attrValue = atValue; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; } + +protected: + /** + * Constructor + */ + domGles_texture_constant_type_complexType() : attrValue(), attrParam() {} + /** + * Destructor + */ + virtual ~domGles_texture_constant_type_complexType() {} + /** + * Copy Constructor + */ + domGles_texture_constant_type_complexType( const domGles_texture_constant_type_complexType &cpy ) { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domGles_texture_constant_type_complexType &operator=( const domGles_texture_constant_type_complexType &cpy ) { (void)cpy; return *this; } +}; + +/** + * An element of type domGles_texture_constant_type_complexType. + */ +class domGles_texture_constant_type : public daeElement, public domGles_texture_constant_type_complexType +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::GLES_TEXTURE_CONSTANT_TYPE; } + +public: //Accessors and Mutators + /** + * Gets the value array attribute. + * @return Returns a domFloat4 reference of the value array attribute. + */ + domFloat4 &getValue() { return attrValue; } + /** + * Gets the value array attribute. + * @return Returns a constant domFloat4 reference of the value array attribute. + */ + const domFloat4 &getValue() const { return attrValue; } + /** + * Sets the value array attribute. + * @param atValue The new value for the value array attribute. + */ + void setValue( const domFloat4 &atValue ) { attrValue = atValue; + _validAttributeArray[0] = true; } + + /** + * Gets the param attribute. + * @return Returns a xsNCName of the param attribute. + */ + xsNCName getParam() const { return attrParam; } + /** + * Sets the param attribute. + * @param atParam The new value for the param attribute. + */ + void setParam( xsNCName atParam ) { *(daeStringRef*)&attrParam = atParam; + _validAttributeArray[1] = true; } + +protected: + /** + * Constructor + */ + domGles_texture_constant_type() {} + /** + * Destructor + */ + virtual ~domGles_texture_constant_type() {} + /** + * Copy Constructor + */ + domGles_texture_constant_type( const domGles_texture_constant_type &cpy ) : daeElement(), domGles_texture_constant_type_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domGles_texture_constant_type &operator=( const domGles_texture_constant_type &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGles_texture_pipeline.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGles_texture_pipeline.h new file mode 100644 index 00000000..4df426ea --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGles_texture_pipeline.h @@ -0,0 +1,196 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domGles_texture_pipeline_h__ +#define __domGles_texture_pipeline_h__ + +#include +#include + +#include +#include +#include + +/** + * Defines a set of texturing commands that will be converted into multitexturing + * operations using glTexEnv in regular and combiner mode. + */ +class domGles_texture_pipeline_complexType +{ +protected: // Attribute +/** + * The sid attribute is a text string value containing the sub-identifier + * of this element. This value must be unique within the scope of the parent + * element. Optional attribute. + */ + xsNCName attrSid; + +protected: // Elements +/** + * Defines a texture_pipeline command. This is a combiner-mode texturing operation. + * @see domTexcombiner + */ + domGles_texcombiner_command_type_Array elemTexcombiner_array; +/** + * Defines a texture_pipeline command. It is a simple noncombiner mode of + * texturing operations. @see domTexenv + */ + domGles_texenv_command_type_Array elemTexenv_array; +/** + * The extra element may appear any number of times. OpenGL ES extensions + * may be used here. @see domExtra + */ + domExtra_Array elemExtra_array; + /** + * Used to preserve order in elements that do not specify strict sequencing of sub-elements. + */ + daeElementRefArray _contents; + /** + * Used to preserve order in elements that have a complex content model. + */ + daeUIntArray _contentsOrder; + + +public: //Accessors and Mutators + /** + * Gets the sid attribute. + * @return Returns a xsNCName of the sid attribute. + */ + xsNCName getSid() const { return attrSid; } + /** + * Sets the sid attribute. + * @param atSid The new value for the sid attribute. + */ + void setSid( xsNCName atSid ) { *(daeStringRef*)&attrSid = atSid; } + + /** + * Gets the texcombiner element array. + * @return Returns a reference to the array of texcombiner elements. + */ + domGles_texcombiner_command_type_Array &getTexcombiner_array() { return elemTexcombiner_array; } + /** + * Gets the texcombiner element array. + * @return Returns a constant reference to the array of texcombiner elements. + */ + const domGles_texcombiner_command_type_Array &getTexcombiner_array() const { return elemTexcombiner_array; } + /** + * Gets the texenv element array. + * @return Returns a reference to the array of texenv elements. + */ + domGles_texenv_command_type_Array &getTexenv_array() { return elemTexenv_array; } + /** + * Gets the texenv element array. + * @return Returns a constant reference to the array of texenv elements. + */ + const domGles_texenv_command_type_Array &getTexenv_array() const { return elemTexenv_array; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } + /** + * Gets the _contents array. + * @return Returns a reference to the _contents element array. + */ + daeElementRefArray &getContents() { return _contents; } + /** + * Gets the _contents array. + * @return Returns a constant reference to the _contents element array. + */ + const daeElementRefArray &getContents() const { return _contents; } + +protected: + /** + * Constructor + */ + domGles_texture_pipeline_complexType() : attrSid(), elemTexcombiner_array(), elemTexenv_array(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domGles_texture_pipeline_complexType() {} + /** + * Copy Constructor + */ + domGles_texture_pipeline_complexType( const domGles_texture_pipeline_complexType &cpy ) { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domGles_texture_pipeline_complexType &operator=( const domGles_texture_pipeline_complexType &cpy ) { (void)cpy; return *this; } +}; + +/** + * An element of type domGles_texture_pipeline_complexType. + */ +class domGles_texture_pipeline : public daeElement, public domGles_texture_pipeline_complexType +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::GLES_TEXTURE_PIPELINE; } + +public: //Accessors and Mutators + /** + * Gets the sid attribute. + * @return Returns a xsNCName of the sid attribute. + */ + xsNCName getSid() const { return attrSid; } + /** + * Sets the sid attribute. + * @param atSid The new value for the sid attribute. + */ + void setSid( xsNCName atSid ) { *(daeStringRef*)&attrSid = atSid; + _validAttributeArray[0] = true; } + +protected: + /** + * Constructor + */ + domGles_texture_pipeline() {} + /** + * Destructor + */ + virtual ~domGles_texture_pipeline() {} + /** + * Copy Constructor + */ + domGles_texture_pipeline( const domGles_texture_pipeline &cpy ) : daeElement(), domGles_texture_pipeline_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domGles_texture_pipeline &operator=( const domGles_texture_pipeline &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGles_texture_unit.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGles_texture_unit.h new file mode 100644 index 00000000..9d069340 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGles_texture_unit.h @@ -0,0 +1,355 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domGles_texture_unit_h__ +#define __domGles_texture_unit_h__ + +#include +#include + +#include + +class domGles_texture_unit_complexType +{ +public: + class domSurface; + + typedef daeSmartRef domSurfaceRef; + typedef daeTArray domSurface_Array; + + class domSurface : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::SURFACE; } + + protected: // Value + /** + * The xsNCName value of the text data of this element. + */ + xsNCName _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return Returns a xsNCName of the value. + */ + xsNCName getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( xsNCName val ) { *(daeStringRef*)&_value = val; } + + protected: + /** + * Constructor + */ + domSurface() : _value() {} + /** + * Destructor + */ + virtual ~domSurface() {} + /** + * Copy Constructor + */ + domSurface( const domSurface &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domSurface &operator=( const domSurface &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domSampler_state; + + typedef daeSmartRef domSampler_stateRef; + typedef daeTArray domSampler_state_Array; + + class domSampler_state : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::SAMPLER_STATE; } + + protected: // Value + /** + * The xsNCName value of the text data of this element. + */ + xsNCName _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return Returns a xsNCName of the value. + */ + xsNCName getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( xsNCName val ) { *(daeStringRef*)&_value = val; } + + protected: + /** + * Constructor + */ + domSampler_state() : _value() {} + /** + * Destructor + */ + virtual ~domSampler_state() {} + /** + * Copy Constructor + */ + domSampler_state( const domSampler_state &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domSampler_state &operator=( const domSampler_state &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domTexcoord; + + typedef daeSmartRef domTexcoordRef; + typedef daeTArray domTexcoord_Array; + + class domTexcoord : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::TEXCOORD; } + protected: // Attribute + xsNCName attrSemantic; + + + public: //Accessors and Mutators + /** + * Gets the semantic attribute. + * @return Returns a xsNCName of the semantic attribute. + */ + xsNCName getSemantic() const { return attrSemantic; } + /** + * Sets the semantic attribute. + * @param atSemantic The new value for the semantic attribute. + */ + void setSemantic( xsNCName atSemantic ) { *(daeStringRef*)&attrSemantic = atSemantic; + _validAttributeArray[0] = true; } + + protected: + /** + * Constructor + */ + domTexcoord() : attrSemantic() {} + /** + * Destructor + */ + virtual ~domTexcoord() {} + /** + * Copy Constructor + */ + domTexcoord( const domTexcoord &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domTexcoord &operator=( const domTexcoord &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + +protected: // Attribute +/** + * The sid attribute is a text string value containing the sub-identifier + * of this element. This value must be unique within the scope of the parent + * element. Optional attribute. + */ + xsNCName attrSid; + +protected: // Elements + domSurfaceRef elemSurface; + domSampler_stateRef elemSampler_state; + domTexcoordRef elemTexcoord; + domExtra_Array elemExtra_array; + +public: //Accessors and Mutators + /** + * Gets the sid attribute. + * @return Returns a xsNCName of the sid attribute. + */ + xsNCName getSid() const { return attrSid; } + /** + * Sets the sid attribute. + * @param atSid The new value for the sid attribute. + */ + void setSid( xsNCName atSid ) { *(daeStringRef*)&attrSid = atSid; } + + /** + * Gets the surface element. + * @return a daeSmartRef to the surface element. + */ + const domSurfaceRef getSurface() const { return elemSurface; } + /** + * Gets the sampler_state element. + * @return a daeSmartRef to the sampler_state element. + */ + const domSampler_stateRef getSampler_state() const { return elemSampler_state; } + /** + * Gets the texcoord element. + * @return a daeSmartRef to the texcoord element. + */ + const domTexcoordRef getTexcoord() const { return elemTexcoord; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } +protected: + /** + * Constructor + */ + domGles_texture_unit_complexType() : attrSid(), elemSurface(), elemSampler_state(), elemTexcoord(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domGles_texture_unit_complexType() {} + /** + * Copy Constructor + */ + domGles_texture_unit_complexType( const domGles_texture_unit_complexType &cpy ) { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domGles_texture_unit_complexType &operator=( const domGles_texture_unit_complexType &cpy ) { (void)cpy; return *this; } +}; + +/** + * An element of type domGles_texture_unit_complexType. + */ +class domGles_texture_unit : public daeElement, public domGles_texture_unit_complexType +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::GLES_TEXTURE_UNIT; } + +public: //Accessors and Mutators + /** + * Gets the sid attribute. + * @return Returns a xsNCName of the sid attribute. + */ + xsNCName getSid() const { return attrSid; } + /** + * Sets the sid attribute. + * @param atSid The new value for the sid attribute. + */ + void setSid( xsNCName atSid ) { *(daeStringRef*)&attrSid = atSid; + _validAttributeArray[0] = true; } + +protected: + /** + * Constructor + */ + domGles_texture_unit() {} + /** + * Destructor + */ + virtual ~domGles_texture_unit() {} + /** + * Copy Constructor + */ + domGles_texture_unit( const domGles_texture_unit &cpy ) : daeElement(), domGles_texture_unit_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domGles_texture_unit &operator=( const domGles_texture_unit &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGlsl_newarray_type.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGlsl_newarray_type.h new file mode 100644 index 00000000..87512df6 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGlsl_newarray_type.h @@ -0,0 +1,174 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domGlsl_newarray_type_h__ +#define __domGlsl_newarray_type_h__ + +#include +#include + +#include +#include + +/** + * The glsl_newarray_type is used to creates a parameter of a one-dimensional + * array type. + */ +class domGlsl_newarray_type_complexType +{ +protected: // Attribute +/** + * The length attribute specifies the length of the array. + */ + xsPositiveInteger attrLength; + +protected: // Elements + domGlsl_param_type_Array elemGlsl_param_type_array; +/** + * You may recursively nest glsl_newarray elements to create multidimensional + * arrays. @see domArray + */ + domGlsl_newarray_type_Array elemArray_array; + /** + * Used to preserve order in elements that do not specify strict sequencing of sub-elements. + */ + daeElementRefArray _contents; + /** + * Used to preserve order in elements that have a complex content model. + */ + daeUIntArray _contentsOrder; + + +public: //Accessors and Mutators + /** + * Gets the length attribute. + * @return Returns a xsPositiveInteger of the length attribute. + */ + xsPositiveInteger getLength() const { return attrLength; } + /** + * Sets the length attribute. + * @param atLength The new value for the length attribute. + */ + void setLength( xsPositiveInteger atLength ) { attrLength = atLength; } + + /** + * Gets the glsl_param_type element array. + * @return Returns a reference to the array of glsl_param_type elements. + */ + domGlsl_param_type_Array &getGlsl_param_type_array() { return elemGlsl_param_type_array; } + /** + * Gets the glsl_param_type element array. + * @return Returns a constant reference to the array of glsl_param_type elements. + */ + const domGlsl_param_type_Array &getGlsl_param_type_array() const { return elemGlsl_param_type_array; } + /** + * Gets the array element array. + * @return Returns a reference to the array of array elements. + */ + domGlsl_newarray_type_Array &getArray_array() { return elemArray_array; } + /** + * Gets the array element array. + * @return Returns a constant reference to the array of array elements. + */ + const domGlsl_newarray_type_Array &getArray_array() const { return elemArray_array; } + /** + * Gets the _contents array. + * @return Returns a reference to the _contents element array. + */ + daeElementRefArray &getContents() { return _contents; } + /** + * Gets the _contents array. + * @return Returns a constant reference to the _contents element array. + */ + const daeElementRefArray &getContents() const { return _contents; } + +protected: + /** + * Constructor + */ + domGlsl_newarray_type_complexType() : attrLength(), elemGlsl_param_type_array(), elemArray_array() {} + /** + * Destructor + */ + virtual ~domGlsl_newarray_type_complexType() {} + /** + * Copy Constructor + */ + domGlsl_newarray_type_complexType( const domGlsl_newarray_type_complexType &cpy ) { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domGlsl_newarray_type_complexType &operator=( const domGlsl_newarray_type_complexType &cpy ) { (void)cpy; return *this; } +}; + +/** + * An element of type domGlsl_newarray_type_complexType. + */ +class domGlsl_newarray_type : public daeElement, public domGlsl_newarray_type_complexType +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::GLSL_NEWARRAY_TYPE; } + +public: //Accessors and Mutators + /** + * Gets the length attribute. + * @return Returns a xsPositiveInteger of the length attribute. + */ + xsPositiveInteger getLength() const { return attrLength; } + /** + * Sets the length attribute. + * @param atLength The new value for the length attribute. + */ + void setLength( xsPositiveInteger atLength ) { attrLength = atLength; + _validAttributeArray[0] = true; } + +protected: + /** + * Constructor + */ + domGlsl_newarray_type() {} + /** + * Destructor + */ + virtual ~domGlsl_newarray_type() {} + /** + * Copy Constructor + */ + domGlsl_newarray_type( const domGlsl_newarray_type &cpy ) : daeElement(), domGlsl_newarray_type_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domGlsl_newarray_type &operator=( const domGlsl_newarray_type &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGlsl_newparam.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGlsl_newparam.h new file mode 100644 index 00000000..73ca965a --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGlsl_newparam.h @@ -0,0 +1,313 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domGlsl_newparam_h__ +#define __domGlsl_newparam_h__ + +#include +#include + +#include +#include +#include + +class domGlsl_newparam_complexType +{ +public: + class domSemantic; + + typedef daeSmartRef domSemanticRef; + typedef daeTArray domSemantic_Array; + + class domSemantic : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::SEMANTIC; } + + protected: // Value + /** + * The xsNCName value of the text data of this element. + */ + xsNCName _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return Returns a xsNCName of the value. + */ + xsNCName getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( xsNCName val ) { *(daeStringRef*)&_value = val; } + + protected: + /** + * Constructor + */ + domSemantic() : _value() {} + /** + * Destructor + */ + virtual ~domSemantic() {} + /** + * Copy Constructor + */ + domSemantic( const domSemantic &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domSemantic &operator=( const domSemantic &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domModifier; + + typedef daeSmartRef domModifierRef; + typedef daeTArray domModifier_Array; + + class domModifier : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::MODIFIER; } + + protected: // Value + /** + * The domFx_modifier_enum_common value of the text data of this element. + */ + domFx_modifier_enum_common _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a domFx_modifier_enum_common of the value. + */ + domFx_modifier_enum_common getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( domFx_modifier_enum_common val ) { _value = val; } + + protected: + /** + * Constructor + */ + domModifier() : _value() {} + /** + * Destructor + */ + virtual ~domModifier() {} + /** + * Copy Constructor + */ + domModifier( const domModifier &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domModifier &operator=( const domModifier &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + +protected: // Attribute + domGlsl_identifier attrSid; + +protected: // Elements + domFx_annotate_common_Array elemAnnotate_array; + domSemanticRef elemSemantic; + domModifierRef elemModifier; + domGlsl_param_typeRef elemGlsl_param_type; + domGlsl_newarray_typeRef elemArray; + /** + * Used to preserve order in elements that do not specify strict sequencing of sub-elements. + */ + daeElementRefArray _contents; + /** + * Used to preserve order in elements that have a complex content model. + */ + daeUIntArray _contentsOrder; + + +public: //Accessors and Mutators + /** + * Gets the sid attribute. + * @return Returns a domGlsl_identifier of the sid attribute. + */ + domGlsl_identifier getSid() const { return attrSid; } + /** + * Sets the sid attribute. + * @param atSid The new value for the sid attribute. + */ + void setSid( domGlsl_identifier atSid ) { attrSid = atSid; } + + /** + * Gets the annotate element array. + * @return Returns a reference to the array of annotate elements. + */ + domFx_annotate_common_Array &getAnnotate_array() { return elemAnnotate_array; } + /** + * Gets the annotate element array. + * @return Returns a constant reference to the array of annotate elements. + */ + const domFx_annotate_common_Array &getAnnotate_array() const { return elemAnnotate_array; } + /** + * Gets the semantic element. + * @return a daeSmartRef to the semantic element. + */ + const domSemanticRef getSemantic() const { return elemSemantic; } + /** + * Gets the modifier element. + * @return a daeSmartRef to the modifier element. + */ + const domModifierRef getModifier() const { return elemModifier; } + /** + * Gets the glsl_param_type element. + * @return a daeSmartRef to the glsl_param_type element. + */ + const domGlsl_param_typeRef getGlsl_param_type() const { return elemGlsl_param_type; } + /** + * Gets the array element. + * @return a daeSmartRef to the array element. + */ + const domGlsl_newarray_typeRef getArray() const { return elemArray; } + /** + * Gets the _contents array. + * @return Returns a reference to the _contents element array. + */ + daeElementRefArray &getContents() { return _contents; } + /** + * Gets the _contents array. + * @return Returns a constant reference to the _contents element array. + */ + const daeElementRefArray &getContents() const { return _contents; } + +protected: + /** + * Constructor + */ + domGlsl_newparam_complexType() : attrSid(), elemAnnotate_array(), elemSemantic(), elemModifier(), elemGlsl_param_type(), elemArray() {} + /** + * Destructor + */ + virtual ~domGlsl_newparam_complexType() {} + /** + * Copy Constructor + */ + domGlsl_newparam_complexType( const domGlsl_newparam_complexType &cpy ) { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domGlsl_newparam_complexType &operator=( const domGlsl_newparam_complexType &cpy ) { (void)cpy; return *this; } +}; + +/** + * An element of type domGlsl_newparam_complexType. + */ +class domGlsl_newparam : public daeElement, public domGlsl_newparam_complexType +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::GLSL_NEWPARAM; } + +public: //Accessors and Mutators + /** + * Gets the sid attribute. + * @return Returns a domGlsl_identifier of the sid attribute. + */ + domGlsl_identifier getSid() const { return attrSid; } + /** + * Sets the sid attribute. + * @param atSid The new value for the sid attribute. + */ + void setSid( domGlsl_identifier atSid ) { attrSid = atSid; + _validAttributeArray[0] = true; } + +protected: + /** + * Constructor + */ + domGlsl_newparam() {} + /** + * Destructor + */ + virtual ~domGlsl_newparam() {} + /** + * Copy Constructor + */ + domGlsl_newparam( const domGlsl_newparam &cpy ) : daeElement(), domGlsl_newparam_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domGlsl_newparam &operator=( const domGlsl_newparam &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGlsl_param_type.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGlsl_param_type.h new file mode 100644 index 00000000..5b888550 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGlsl_param_type.h @@ -0,0 +1,1370 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domGlsl_param_type_h__ +#define __domGlsl_param_type_h__ + +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +/** + * A group that specifies the allowable types for GLSL profile parameters. + */ +class domGlsl_param_type : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::GLSL_PARAM_TYPE; } +public: + class domBool; + + typedef daeSmartRef domBoolRef; + typedef daeTArray domBool_Array; + + class domBool : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::BOOL; } + + protected: // Value + /** + * The domGlsl_bool value of the text data of this element. + */ + domGlsl_bool _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a domGlsl_bool of the value. + */ + domGlsl_bool getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( domGlsl_bool val ) { _value = val; } + + protected: + /** + * Constructor + */ + domBool() : _value() {} + /** + * Destructor + */ + virtual ~domBool() {} + /** + * Copy Constructor + */ + domBool( const domBool &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domBool &operator=( const domBool &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domBool2; + + typedef daeSmartRef domBool2Ref; + typedef daeTArray domBool2_Array; + + class domBool2 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::BOOL2; } + + protected: // Value + /** + * The domGlsl_bool2 value of the text data of this element. + */ + domGlsl_bool2 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domGlsl_bool2 reference of the _value array. + */ + domGlsl_bool2 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domGlsl_bool2 reference of the _value array. + */ + const domGlsl_bool2 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domGlsl_bool2 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domBool2() : _value() {} + /** + * Destructor + */ + virtual ~domBool2() {} + /** + * Copy Constructor + */ + domBool2( const domBool2 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domBool2 &operator=( const domBool2 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domBool3; + + typedef daeSmartRef domBool3Ref; + typedef daeTArray domBool3_Array; + + class domBool3 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::BOOL3; } + + protected: // Value + /** + * The domGlsl_bool3 value of the text data of this element. + */ + domGlsl_bool3 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domGlsl_bool3 reference of the _value array. + */ + domGlsl_bool3 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domGlsl_bool3 reference of the _value array. + */ + const domGlsl_bool3 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domGlsl_bool3 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domBool3() : _value() {} + /** + * Destructor + */ + virtual ~domBool3() {} + /** + * Copy Constructor + */ + domBool3( const domBool3 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domBool3 &operator=( const domBool3 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domBool4; + + typedef daeSmartRef domBool4Ref; + typedef daeTArray domBool4_Array; + + class domBool4 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::BOOL4; } + + protected: // Value + /** + * The domGlsl_bool4 value of the text data of this element. + */ + domGlsl_bool4 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domGlsl_bool4 reference of the _value array. + */ + domGlsl_bool4 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domGlsl_bool4 reference of the _value array. + */ + const domGlsl_bool4 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domGlsl_bool4 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domBool4() : _value() {} + /** + * Destructor + */ + virtual ~domBool4() {} + /** + * Copy Constructor + */ + domBool4( const domBool4 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domBool4 &operator=( const domBool4 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFloat; + + typedef daeSmartRef domFloatRef; + typedef daeTArray domFloat_Array; + + class domFloat : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FLOAT; } + + protected: // Value + /** + * The domGlsl_float value of the text data of this element. + */ + domGlsl_float _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a domGlsl_float of the value. + */ + domGlsl_float getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( domGlsl_float val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFloat() : _value() {} + /** + * Destructor + */ + virtual ~domFloat() {} + /** + * Copy Constructor + */ + domFloat( const domFloat &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFloat &operator=( const domFloat &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFloat2; + + typedef daeSmartRef domFloat2Ref; + typedef daeTArray domFloat2_Array; + + class domFloat2 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FLOAT2; } + + protected: // Value + /** + * The domGlsl_float2 value of the text data of this element. + */ + domGlsl_float2 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domGlsl_float2 reference of the _value array. + */ + domGlsl_float2 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domGlsl_float2 reference of the _value array. + */ + const domGlsl_float2 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domGlsl_float2 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFloat2() : _value() {} + /** + * Destructor + */ + virtual ~domFloat2() {} + /** + * Copy Constructor + */ + domFloat2( const domFloat2 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFloat2 &operator=( const domFloat2 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFloat3; + + typedef daeSmartRef domFloat3Ref; + typedef daeTArray domFloat3_Array; + + class domFloat3 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FLOAT3; } + + protected: // Value + /** + * The domGlsl_float3 value of the text data of this element. + */ + domGlsl_float3 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domGlsl_float3 reference of the _value array. + */ + domGlsl_float3 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domGlsl_float3 reference of the _value array. + */ + const domGlsl_float3 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domGlsl_float3 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFloat3() : _value() {} + /** + * Destructor + */ + virtual ~domFloat3() {} + /** + * Copy Constructor + */ + domFloat3( const domFloat3 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFloat3 &operator=( const domFloat3 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFloat4; + + typedef daeSmartRef domFloat4Ref; + typedef daeTArray domFloat4_Array; + + class domFloat4 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FLOAT4; } + + protected: // Value + /** + * The domGlsl_float4 value of the text data of this element. + */ + domGlsl_float4 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domGlsl_float4 reference of the _value array. + */ + domGlsl_float4 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domGlsl_float4 reference of the _value array. + */ + const domGlsl_float4 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domGlsl_float4 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFloat4() : _value() {} + /** + * Destructor + */ + virtual ~domFloat4() {} + /** + * Copy Constructor + */ + domFloat4( const domFloat4 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFloat4 &operator=( const domFloat4 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFloat2x2; + + typedef daeSmartRef domFloat2x2Ref; + typedef daeTArray domFloat2x2_Array; + + class domFloat2x2 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FLOAT2X2; } + + protected: // Value + /** + * The domGlsl_float2x2 value of the text data of this element. + */ + domGlsl_float2x2 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domGlsl_float2x2 reference of the _value array. + */ + domGlsl_float2x2 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domGlsl_float2x2 reference of the _value array. + */ + const domGlsl_float2x2 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domGlsl_float2x2 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFloat2x2() : _value() {} + /** + * Destructor + */ + virtual ~domFloat2x2() {} + /** + * Copy Constructor + */ + domFloat2x2( const domFloat2x2 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFloat2x2 &operator=( const domFloat2x2 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFloat3x3; + + typedef daeSmartRef domFloat3x3Ref; + typedef daeTArray domFloat3x3_Array; + + class domFloat3x3 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FLOAT3X3; } + + protected: // Value + /** + * The domGlsl_float3x3 value of the text data of this element. + */ + domGlsl_float3x3 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domGlsl_float3x3 reference of the _value array. + */ + domGlsl_float3x3 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domGlsl_float3x3 reference of the _value array. + */ + const domGlsl_float3x3 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domGlsl_float3x3 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFloat3x3() : _value() {} + /** + * Destructor + */ + virtual ~domFloat3x3() {} + /** + * Copy Constructor + */ + domFloat3x3( const domFloat3x3 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFloat3x3 &operator=( const domFloat3x3 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domFloat4x4; + + typedef daeSmartRef domFloat4x4Ref; + typedef daeTArray domFloat4x4_Array; + + class domFloat4x4 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::FLOAT4X4; } + + protected: // Value + /** + * The domGlsl_float4x4 value of the text data of this element. + */ + domGlsl_float4x4 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domGlsl_float4x4 reference of the _value array. + */ + domGlsl_float4x4 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domGlsl_float4x4 reference of the _value array. + */ + const domGlsl_float4x4 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domGlsl_float4x4 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domFloat4x4() : _value() {} + /** + * Destructor + */ + virtual ~domFloat4x4() {} + /** + * Copy Constructor + */ + domFloat4x4( const domFloat4x4 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domFloat4x4 &operator=( const domFloat4x4 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domInt; + + typedef daeSmartRef domIntRef; + typedef daeTArray domInt_Array; + + class domInt : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::INT; } + + protected: // Value + /** + * The domGlsl_int value of the text data of this element. + */ + domGlsl_int _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a domGlsl_int of the value. + */ + domGlsl_int getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( domGlsl_int val ) { _value = val; } + + protected: + /** + * Constructor + */ + domInt() : _value() {} + /** + * Destructor + */ + virtual ~domInt() {} + /** + * Copy Constructor + */ + domInt( const domInt &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domInt &operator=( const domInt &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domInt2; + + typedef daeSmartRef domInt2Ref; + typedef daeTArray domInt2_Array; + + class domInt2 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::INT2; } + + protected: // Value + /** + * The domGlsl_int2 value of the text data of this element. + */ + domGlsl_int2 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domGlsl_int2 reference of the _value array. + */ + domGlsl_int2 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domGlsl_int2 reference of the _value array. + */ + const domGlsl_int2 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domGlsl_int2 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domInt2() : _value() {} + /** + * Destructor + */ + virtual ~domInt2() {} + /** + * Copy Constructor + */ + domInt2( const domInt2 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domInt2 &operator=( const domInt2 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domInt3; + + typedef daeSmartRef domInt3Ref; + typedef daeTArray domInt3_Array; + + class domInt3 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::INT3; } + + protected: // Value + /** + * The domGlsl_int3 value of the text data of this element. + */ + domGlsl_int3 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domGlsl_int3 reference of the _value array. + */ + domGlsl_int3 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domGlsl_int3 reference of the _value array. + */ + const domGlsl_int3 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domGlsl_int3 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domInt3() : _value() {} + /** + * Destructor + */ + virtual ~domInt3() {} + /** + * Copy Constructor + */ + domInt3( const domInt3 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domInt3 &operator=( const domInt3 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domInt4; + + typedef daeSmartRef domInt4Ref; + typedef daeTArray domInt4_Array; + + class domInt4 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::INT4; } + + protected: // Value + /** + * The domGlsl_int4 value of the text data of this element. + */ + domGlsl_int4 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domGlsl_int4 reference of the _value array. + */ + domGlsl_int4 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domGlsl_int4 reference of the _value array. + */ + const domGlsl_int4 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domGlsl_int4 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domInt4() : _value() {} + /** + * Destructor + */ + virtual ~domInt4() {} + /** + * Copy Constructor + */ + domInt4( const domInt4 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domInt4 &operator=( const domInt4 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domEnum; + + typedef daeSmartRef domEnumRef; + typedef daeTArray domEnum_Array; + + class domEnum : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::ENUM; } + + protected: // Value + /** + * The domGl_enumeration value of the text data of this element. + */ + domGl_enumeration _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a domGl_enumeration of the value. + */ + domGl_enumeration getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( domGl_enumeration val ) { _value = val; } + + protected: + /** + * Constructor + */ + domEnum() : _value() {} + /** + * Destructor + */ + virtual ~domEnum() {} + /** + * Copy Constructor + */ + domEnum( const domEnum &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domEnum &operator=( const domEnum &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + + +protected: // Elements + domBoolRef elemBool; + domBool2Ref elemBool2; + domBool3Ref elemBool3; + domBool4Ref elemBool4; + domFloatRef elemFloat; + domFloat2Ref elemFloat2; + domFloat3Ref elemFloat3; + domFloat4Ref elemFloat4; + domFloat2x2Ref elemFloat2x2; + domFloat3x3Ref elemFloat3x3; + domFloat4x4Ref elemFloat4x4; + domIntRef elemInt; + domInt2Ref elemInt2; + domInt3Ref elemInt3; + domInt4Ref elemInt4; + domGlsl_surface_typeRef elemSurface; + domGl_sampler1DRef elemSampler1D; + domGl_sampler2DRef elemSampler2D; + domGl_sampler3DRef elemSampler3D; + domGl_samplerCUBERef elemSamplerCUBE; + domGl_samplerRECTRef elemSamplerRECT; + domGl_samplerDEPTHRef elemSamplerDEPTH; + domEnumRef elemEnum; + /** + * Used to preserve order in elements that do not specify strict sequencing of sub-elements. + */ + daeElementRefArray _contents; + /** + * Used to preserve order in elements that have a complex content model. + */ + daeUIntArray _contentsOrder; + + +public: //Accessors and Mutators + /** + * Gets the bool element. + * @return a daeSmartRef to the bool element. + */ + const domBoolRef getBool() const { return elemBool; } + /** + * Gets the bool2 element. + * @return a daeSmartRef to the bool2 element. + */ + const domBool2Ref getBool2() const { return elemBool2; } + /** + * Gets the bool3 element. + * @return a daeSmartRef to the bool3 element. + */ + const domBool3Ref getBool3() const { return elemBool3; } + /** + * Gets the bool4 element. + * @return a daeSmartRef to the bool4 element. + */ + const domBool4Ref getBool4() const { return elemBool4; } + /** + * Gets the float element. + * @return a daeSmartRef to the float element. + */ + const domFloatRef getFloat() const { return elemFloat; } + /** + * Gets the float2 element. + * @return a daeSmartRef to the float2 element. + */ + const domFloat2Ref getFloat2() const { return elemFloat2; } + /** + * Gets the float3 element. + * @return a daeSmartRef to the float3 element. + */ + const domFloat3Ref getFloat3() const { return elemFloat3; } + /** + * Gets the float4 element. + * @return a daeSmartRef to the float4 element. + */ + const domFloat4Ref getFloat4() const { return elemFloat4; } + /** + * Gets the float2x2 element. + * @return a daeSmartRef to the float2x2 element. + */ + const domFloat2x2Ref getFloat2x2() const { return elemFloat2x2; } + /** + * Gets the float3x3 element. + * @return a daeSmartRef to the float3x3 element. + */ + const domFloat3x3Ref getFloat3x3() const { return elemFloat3x3; } + /** + * Gets the float4x4 element. + * @return a daeSmartRef to the float4x4 element. + */ + const domFloat4x4Ref getFloat4x4() const { return elemFloat4x4; } + /** + * Gets the int element. + * @return a daeSmartRef to the int element. + */ + const domIntRef getInt() const { return elemInt; } + /** + * Gets the int2 element. + * @return a daeSmartRef to the int2 element. + */ + const domInt2Ref getInt2() const { return elemInt2; } + /** + * Gets the int3 element. + * @return a daeSmartRef to the int3 element. + */ + const domInt3Ref getInt3() const { return elemInt3; } + /** + * Gets the int4 element. + * @return a daeSmartRef to the int4 element. + */ + const domInt4Ref getInt4() const { return elemInt4; } + /** + * Gets the surface element. + * @return a daeSmartRef to the surface element. + */ + const domGlsl_surface_typeRef getSurface() const { return elemSurface; } + /** + * Gets the sampler1D element. + * @return a daeSmartRef to the sampler1D element. + */ + const domGl_sampler1DRef getSampler1D() const { return elemSampler1D; } + /** + * Gets the sampler2D element. + * @return a daeSmartRef to the sampler2D element. + */ + const domGl_sampler2DRef getSampler2D() const { return elemSampler2D; } + /** + * Gets the sampler3D element. + * @return a daeSmartRef to the sampler3D element. + */ + const domGl_sampler3DRef getSampler3D() const { return elemSampler3D; } + /** + * Gets the samplerCUBE element. + * @return a daeSmartRef to the samplerCUBE element. + */ + const domGl_samplerCUBERef getSamplerCUBE() const { return elemSamplerCUBE; } + /** + * Gets the samplerRECT element. + * @return a daeSmartRef to the samplerRECT element. + */ + const domGl_samplerRECTRef getSamplerRECT() const { return elemSamplerRECT; } + /** + * Gets the samplerDEPTH element. + * @return a daeSmartRef to the samplerDEPTH element. + */ + const domGl_samplerDEPTHRef getSamplerDEPTH() const { return elemSamplerDEPTH; } + /** + * Gets the enum element. + * @return a daeSmartRef to the enum element. + */ + const domEnumRef getEnum() const { return elemEnum; } + /** + * Gets the _contents array. + * @return Returns a reference to the _contents element array. + */ + daeElementRefArray &getContents() { return _contents; } + /** + * Gets the _contents array. + * @return Returns a constant reference to the _contents element array. + */ + const daeElementRefArray &getContents() const { return _contents; } + +protected: + /** + * Constructor + */ + domGlsl_param_type() : elemBool(), elemBool2(), elemBool3(), elemBool4(), elemFloat(), elemFloat2(), elemFloat3(), elemFloat4(), elemFloat2x2(), elemFloat3x3(), elemFloat4x4(), elemInt(), elemInt2(), elemInt3(), elemInt4(), elemSurface(), elemSampler1D(), elemSampler2D(), elemSampler3D(), elemSamplerCUBE(), elemSamplerRECT(), elemSamplerDEPTH(), elemEnum() {} + /** + * Destructor + */ + virtual ~domGlsl_param_type() {} + /** + * Copy Constructor + */ + domGlsl_param_type( const domGlsl_param_type &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domGlsl_param_type &operator=( const domGlsl_param_type &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGlsl_setarray_type.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGlsl_setarray_type.h new file mode 100644 index 00000000..249c0913 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGlsl_setarray_type.h @@ -0,0 +1,174 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domGlsl_setarray_type_h__ +#define __domGlsl_setarray_type_h__ + +#include +#include + +#include +#include + +/** + * The glsl_newarray_type is used to creates a parameter of a one-dimensional + * array type. + */ +class domGlsl_setarray_type_complexType +{ +protected: // Attribute +/** + * The length attribute specifies the length of the array. + */ + xsPositiveInteger attrLength; + +protected: // Elements + domGlsl_param_type_Array elemGlsl_param_type_array; +/** + * You may recursively nest glsl_newarray elements to create multidimensional + * arrays. @see domArray + */ + domGlsl_setarray_type_Array elemArray_array; + /** + * Used to preserve order in elements that do not specify strict sequencing of sub-elements. + */ + daeElementRefArray _contents; + /** + * Used to preserve order in elements that have a complex content model. + */ + daeUIntArray _contentsOrder; + + +public: //Accessors and Mutators + /** + * Gets the length attribute. + * @return Returns a xsPositiveInteger of the length attribute. + */ + xsPositiveInteger getLength() const { return attrLength; } + /** + * Sets the length attribute. + * @param atLength The new value for the length attribute. + */ + void setLength( xsPositiveInteger atLength ) { attrLength = atLength; } + + /** + * Gets the glsl_param_type element array. + * @return Returns a reference to the array of glsl_param_type elements. + */ + domGlsl_param_type_Array &getGlsl_param_type_array() { return elemGlsl_param_type_array; } + /** + * Gets the glsl_param_type element array. + * @return Returns a constant reference to the array of glsl_param_type elements. + */ + const domGlsl_param_type_Array &getGlsl_param_type_array() const { return elemGlsl_param_type_array; } + /** + * Gets the array element array. + * @return Returns a reference to the array of array elements. + */ + domGlsl_setarray_type_Array &getArray_array() { return elemArray_array; } + /** + * Gets the array element array. + * @return Returns a constant reference to the array of array elements. + */ + const domGlsl_setarray_type_Array &getArray_array() const { return elemArray_array; } + /** + * Gets the _contents array. + * @return Returns a reference to the _contents element array. + */ + daeElementRefArray &getContents() { return _contents; } + /** + * Gets the _contents array. + * @return Returns a constant reference to the _contents element array. + */ + const daeElementRefArray &getContents() const { return _contents; } + +protected: + /** + * Constructor + */ + domGlsl_setarray_type_complexType() : attrLength(), elemGlsl_param_type_array(), elemArray_array() {} + /** + * Destructor + */ + virtual ~domGlsl_setarray_type_complexType() {} + /** + * Copy Constructor + */ + domGlsl_setarray_type_complexType( const domGlsl_setarray_type_complexType &cpy ) { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domGlsl_setarray_type_complexType &operator=( const domGlsl_setarray_type_complexType &cpy ) { (void)cpy; return *this; } +}; + +/** + * An element of type domGlsl_setarray_type_complexType. + */ +class domGlsl_setarray_type : public daeElement, public domGlsl_setarray_type_complexType +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::GLSL_SETARRAY_TYPE; } + +public: //Accessors and Mutators + /** + * Gets the length attribute. + * @return Returns a xsPositiveInteger of the length attribute. + */ + xsPositiveInteger getLength() const { return attrLength; } + /** + * Sets the length attribute. + * @param atLength The new value for the length attribute. + */ + void setLength( xsPositiveInteger atLength ) { attrLength = atLength; + _validAttributeArray[0] = true; } + +protected: + /** + * Constructor + */ + domGlsl_setarray_type() {} + /** + * Destructor + */ + virtual ~domGlsl_setarray_type() {} + /** + * Copy Constructor + */ + domGlsl_setarray_type( const domGlsl_setarray_type &cpy ) : daeElement(), domGlsl_setarray_type_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domGlsl_setarray_type &operator=( const domGlsl_setarray_type &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGlsl_setparam.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGlsl_setparam.h new file mode 100644 index 00000000..2f9a7460 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGlsl_setparam.h @@ -0,0 +1,189 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domGlsl_setparam_h__ +#define __domGlsl_setparam_h__ + +#include +#include + +#include +#include +#include + +class domGlsl_setparam_complexType +{ +protected: // Attributes + domGlsl_identifier attrRef; + xsNCName attrProgram; + +protected: // Elements + domFx_annotate_common_Array elemAnnotate_array; + domGlsl_param_typeRef elemGlsl_param_type; + domGlsl_setarray_typeRef elemArray; + /** + * Used to preserve order in elements that do not specify strict sequencing of sub-elements. + */ + daeElementRefArray _contents; + /** + * Used to preserve order in elements that have a complex content model. + */ + daeUIntArray _contentsOrder; + + +public: //Accessors and Mutators + /** + * Gets the ref attribute. + * @return Returns a domGlsl_identifier of the ref attribute. + */ + domGlsl_identifier getRef() const { return attrRef; } + /** + * Sets the ref attribute. + * @param atRef The new value for the ref attribute. + */ + void setRef( domGlsl_identifier atRef ) { attrRef = atRef; } + + /** + * Gets the program attribute. + * @return Returns a xsNCName of the program attribute. + */ + xsNCName getProgram() const { return attrProgram; } + /** + * Sets the program attribute. + * @param atProgram The new value for the program attribute. + */ + void setProgram( xsNCName atProgram ) { *(daeStringRef*)&attrProgram = atProgram; } + + /** + * Gets the annotate element array. + * @return Returns a reference to the array of annotate elements. + */ + domFx_annotate_common_Array &getAnnotate_array() { return elemAnnotate_array; } + /** + * Gets the annotate element array. + * @return Returns a constant reference to the array of annotate elements. + */ + const domFx_annotate_common_Array &getAnnotate_array() const { return elemAnnotate_array; } + /** + * Gets the glsl_param_type element. + * @return a daeSmartRef to the glsl_param_type element. + */ + const domGlsl_param_typeRef getGlsl_param_type() const { return elemGlsl_param_type; } + /** + * Gets the array element. + * @return a daeSmartRef to the array element. + */ + const domGlsl_setarray_typeRef getArray() const { return elemArray; } + /** + * Gets the _contents array. + * @return Returns a reference to the _contents element array. + */ + daeElementRefArray &getContents() { return _contents; } + /** + * Gets the _contents array. + * @return Returns a constant reference to the _contents element array. + */ + const daeElementRefArray &getContents() const { return _contents; } + +protected: + /** + * Constructor + */ + domGlsl_setparam_complexType() : attrRef(), attrProgram(), elemAnnotate_array(), elemGlsl_param_type(), elemArray() {} + /** + * Destructor + */ + virtual ~domGlsl_setparam_complexType() {} + /** + * Copy Constructor + */ + domGlsl_setparam_complexType( const domGlsl_setparam_complexType &cpy ) { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domGlsl_setparam_complexType &operator=( const domGlsl_setparam_complexType &cpy ) { (void)cpy; return *this; } +}; + +/** + * An element of type domGlsl_setparam_complexType. + */ +class domGlsl_setparam : public daeElement, public domGlsl_setparam_complexType +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::GLSL_SETPARAM; } + +public: //Accessors and Mutators + /** + * Gets the ref attribute. + * @return Returns a domGlsl_identifier of the ref attribute. + */ + domGlsl_identifier getRef() const { return attrRef; } + /** + * Sets the ref attribute. + * @param atRef The new value for the ref attribute. + */ + void setRef( domGlsl_identifier atRef ) { attrRef = atRef; + _validAttributeArray[0] = true; } + + /** + * Gets the program attribute. + * @return Returns a xsNCName of the program attribute. + */ + xsNCName getProgram() const { return attrProgram; } + /** + * Sets the program attribute. + * @param atProgram The new value for the program attribute. + */ + void setProgram( xsNCName atProgram ) { *(daeStringRef*)&attrProgram = atProgram; + _validAttributeArray[1] = true; } + +protected: + /** + * Constructor + */ + domGlsl_setparam() {} + /** + * Destructor + */ + virtual ~domGlsl_setparam() {} + /** + * Copy Constructor + */ + domGlsl_setparam( const domGlsl_setparam &cpy ) : daeElement(), domGlsl_setparam_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domGlsl_setparam &operator=( const domGlsl_setparam &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGlsl_setparam_simple.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGlsl_setparam_simple.h new file mode 100644 index 00000000..3cf16434 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGlsl_setparam_simple.h @@ -0,0 +1,138 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domGlsl_setparam_simple_h__ +#define __domGlsl_setparam_simple_h__ + +#include +#include + +#include +#include + +class domGlsl_setparam_simple_complexType +{ +protected: // Attribute + domGlsl_identifier attrRef; + +protected: // Elements + domFx_annotate_common_Array elemAnnotate_array; + domGlsl_param_typeRef elemGlsl_param_type; + +public: //Accessors and Mutators + /** + * Gets the ref attribute. + * @return Returns a domGlsl_identifier of the ref attribute. + */ + domGlsl_identifier getRef() const { return attrRef; } + /** + * Sets the ref attribute. + * @param atRef The new value for the ref attribute. + */ + void setRef( domGlsl_identifier atRef ) { attrRef = atRef; } + + /** + * Gets the annotate element array. + * @return Returns a reference to the array of annotate elements. + */ + domFx_annotate_common_Array &getAnnotate_array() { return elemAnnotate_array; } + /** + * Gets the annotate element array. + * @return Returns a constant reference to the array of annotate elements. + */ + const domFx_annotate_common_Array &getAnnotate_array() const { return elemAnnotate_array; } + /** + * Gets the glsl_param_type element. + * @return a daeSmartRef to the glsl_param_type element. + */ + const domGlsl_param_typeRef getGlsl_param_type() const { return elemGlsl_param_type; } +protected: + /** + * Constructor + */ + domGlsl_setparam_simple_complexType() : attrRef(), elemAnnotate_array(), elemGlsl_param_type() {} + /** + * Destructor + */ + virtual ~domGlsl_setparam_simple_complexType() {} + /** + * Copy Constructor + */ + domGlsl_setparam_simple_complexType( const domGlsl_setparam_simple_complexType &cpy ) { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domGlsl_setparam_simple_complexType &operator=( const domGlsl_setparam_simple_complexType &cpy ) { (void)cpy; return *this; } +}; + +/** + * An element of type domGlsl_setparam_simple_complexType. + */ +class domGlsl_setparam_simple : public daeElement, public domGlsl_setparam_simple_complexType +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::GLSL_SETPARAM_SIMPLE; } + +public: //Accessors and Mutators + /** + * Gets the ref attribute. + * @return Returns a domGlsl_identifier of the ref attribute. + */ + domGlsl_identifier getRef() const { return attrRef; } + /** + * Sets the ref attribute. + * @param atRef The new value for the ref attribute. + */ + void setRef( domGlsl_identifier atRef ) { attrRef = atRef; + _validAttributeArray[0] = true; } + +protected: + /** + * Constructor + */ + domGlsl_setparam_simple() {} + /** + * Destructor + */ + virtual ~domGlsl_setparam_simple() {} + /** + * Copy Constructor + */ + domGlsl_setparam_simple( const domGlsl_setparam_simple &cpy ) : daeElement(), domGlsl_setparam_simple_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domGlsl_setparam_simple &operator=( const domGlsl_setparam_simple &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGlsl_surface_type.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGlsl_surface_type.h new file mode 100644 index 00000000..66bd03fe --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domGlsl_surface_type.h @@ -0,0 +1,342 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domGlsl_surface_type_h__ +#define __domGlsl_surface_type_h__ + +#include +#include + +#include +#include +#include +#include +#include + +/** + * A surface type for the GLSL profile. This surface inherits from the fx_surface_common + * type and adds the ability to programmatically generate textures. + */ +class domGlsl_surface_type_complexType : public domFx_surface_common_complexType +{ +public: + class domGenerator; + + typedef daeSmartRef domGeneratorRef; + typedef daeTArray domGenerator_Array; + +/** + * A procedural surface generator. + */ + class domGenerator : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::GENERATOR; } + public: + class domName; + + typedef daeSmartRef domNameRef; + typedef daeTArray domName_Array; + +/** + * The entry symbol for the shader function. + */ + class domName : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::NAME; } + protected: // Attribute + xsNCName attrSource; + + protected: // Value + /** + * The xsNCName value of the text data of this element. + */ + xsNCName _value; + + public: //Accessors and Mutators + /** + * Gets the source attribute. + * @return Returns a xsNCName of the source attribute. + */ + xsNCName getSource() const { return attrSource; } + /** + * Sets the source attribute. + * @param atSource The new value for the source attribute. + */ + void setSource( xsNCName atSource ) { *(daeStringRef*)&attrSource = atSource; + _validAttributeArray[0] = true; } + + /** + * Gets the value of this element. + * @return Returns a xsNCName of the value. + */ + xsNCName getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( xsNCName val ) { *(daeStringRef*)&_value = val; } + + protected: + /** + * Constructor + */ + domName() : attrSource(), _value() {} + /** + * Destructor + */ + virtual ~domName() {} + /** + * Copy Constructor + */ + domName( const domName &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domName &operator=( const domName &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + + + protected: // Elements +/** + * The annotate element allows you to specify an annotation for this surface + * generator. @see domAnnotate + */ + domFx_annotate_common_Array elemAnnotate_array; +/** + * The code element allows you to embed GLSL code to use for this surface + * generator. @see domCode + */ + domFx_code_profile_Array elemCode_array; +/** + * The include element allows you to import GLSL code to use for this surface + * generator. @see domInclude + */ + domFx_include_common_Array elemInclude_array; +/** + * The entry symbol for the shader function. @see domName + */ + domNameRef elemName; +/** + * The setparam element allows you to assign a new value to a previously defined + * parameter. @see domSetparam + */ + domGlsl_setparam_simple_Array elemSetparam_array; + /** + * Used to preserve order in elements that do not specify strict sequencing of sub-elements. + */ + daeElementRefArray _contents; + /** + * Used to preserve order in elements that have a complex content model. + */ + daeUIntArray _contentsOrder; + + + public: //Accessors and Mutators + /** + * Gets the annotate element array. + * @return Returns a reference to the array of annotate elements. + */ + domFx_annotate_common_Array &getAnnotate_array() { return elemAnnotate_array; } + /** + * Gets the annotate element array. + * @return Returns a constant reference to the array of annotate elements. + */ + const domFx_annotate_common_Array &getAnnotate_array() const { return elemAnnotate_array; } + /** + * Gets the code element array. + * @return Returns a reference to the array of code elements. + */ + domFx_code_profile_Array &getCode_array() { return elemCode_array; } + /** + * Gets the code element array. + * @return Returns a constant reference to the array of code elements. + */ + const domFx_code_profile_Array &getCode_array() const { return elemCode_array; } + /** + * Gets the include element array. + * @return Returns a reference to the array of include elements. + */ + domFx_include_common_Array &getInclude_array() { return elemInclude_array; } + /** + * Gets the include element array. + * @return Returns a constant reference to the array of include elements. + */ + const domFx_include_common_Array &getInclude_array() const { return elemInclude_array; } + /** + * Gets the name element. + * @return a daeSmartRef to the name element. + */ + const domNameRef getName() const { return elemName; } + /** + * Gets the setparam element array. + * @return Returns a reference to the array of setparam elements. + */ + domGlsl_setparam_simple_Array &getSetparam_array() { return elemSetparam_array; } + /** + * Gets the setparam element array. + * @return Returns a constant reference to the array of setparam elements. + */ + const domGlsl_setparam_simple_Array &getSetparam_array() const { return elemSetparam_array; } + /** + * Gets the _contents array. + * @return Returns a reference to the _contents element array. + */ + daeElementRefArray &getContents() { return _contents; } + /** + * Gets the _contents array. + * @return Returns a constant reference to the _contents element array. + */ + const daeElementRefArray &getContents() const { return _contents; } + + protected: + /** + * Constructor + */ + domGenerator() : elemAnnotate_array(), elemCode_array(), elemInclude_array(), elemName(), elemSetparam_array() {} + /** + * Destructor + */ + virtual ~domGenerator() {} + /** + * Copy Constructor + */ + domGenerator( const domGenerator &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domGenerator &operator=( const domGenerator &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + + +protected: // Element +/** + * A procedural surface generator. @see domGenerator + */ + domGeneratorRef elemGenerator; + +public: //Accessors and Mutators + /** + * Gets the generator element. + * @return a daeSmartRef to the generator element. + */ + const domGeneratorRef getGenerator() const { return elemGenerator; } +protected: + /** + * Constructor + */ + domGlsl_surface_type_complexType() : elemGenerator() {} + /** + * Destructor + */ + virtual ~domGlsl_surface_type_complexType() {} + /** + * Copy Constructor + */ + domGlsl_surface_type_complexType( const domGlsl_surface_type_complexType &cpy ) : domFx_surface_common_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domGlsl_surface_type_complexType &operator=( const domGlsl_surface_type_complexType &cpy ) { (void)cpy; return *this; } +}; + +/** + * An element of type domGlsl_surface_type_complexType. + */ +class domGlsl_surface_type : public daeElement, public domGlsl_surface_type_complexType +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::GLSL_SURFACE_TYPE; } +protected: + /** + * Constructor + */ + domGlsl_surface_type() {} + /** + * Destructor + */ + virtual ~domGlsl_surface_type() {} + /** + * Copy Constructor + */ + domGlsl_surface_type( const domGlsl_surface_type &cpy ) : daeElement(), domGlsl_surface_type_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domGlsl_surface_type &operator=( const domGlsl_surface_type &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domIDREF_array.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domIDREF_array.h new file mode 100644 index 00000000..4df132e0 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domIDREF_array.h @@ -0,0 +1,144 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domIDREF_array_h__ +#define __domIDREF_array_h__ + +#include +#include + + +/** + * The IDREF_array element declares the storage for a homogenous array of + * ID reference values. + */ +class domIDREF_array : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::IDREF_ARRAY; } +protected: // Attributes +/** + * The id attribute is a text string containing the unique identifier of + * this element. This value must be unique within the instance document. + * Optional attribute. + */ + xsID attrId; +/** + * The name attribute is the text string name of this element. Optional attribute. + */ + xsNCName attrName; +/** + * The count attribute indicates the number of values in the array. Required + * attribute. + */ + domUint attrCount; + +protected: // Value + /** + * The xsIDREFS value of the text data of this element. + */ + xsIDREFS _value; + +public: //Accessors and Mutators + /** + * Gets the id attribute. + * @return Returns a xsID of the id attribute. + */ + xsID getId() const { return attrId; } + /** + * Sets the id attribute. + * @param atId The new value for the id attribute. + */ + void setId( xsID atId ) { *(daeStringRef*)&attrId = atId; + _validAttributeArray[0] = true; } + + /** + * Gets the name attribute. + * @return Returns a xsNCName of the name attribute. + */ + xsNCName getName() const { return attrName; } + /** + * Sets the name attribute. + * @param atName The new value for the name attribute. + */ + void setName( xsNCName atName ) { *(daeStringRef*)&attrName = atName; + _validAttributeArray[1] = true; } + + /** + * Gets the count attribute. + * @return Returns a domUint of the count attribute. + */ + domUint getCount() const { return attrCount; } + /** + * Sets the count attribute. + * @param atCount The new value for the count attribute. + */ + void setCount( domUint atCount ) { attrCount = atCount; + _validAttributeArray[2] = true; } + + /** + * Gets the _value array. + * @return Returns a xsIDREFS reference of the _value array. + */ + xsIDREFS &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant xsIDREFS reference of the _value array. + */ + const xsIDREFS &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const xsIDREFS &val ) { _value = val; } + +protected: + /** + * Constructor + */ + domIDREF_array() : attrId(), attrName(), attrCount(), _value() {} + /** + * Destructor + */ + virtual ~domIDREF_array() {} + /** + * Copy Constructor + */ + domIDREF_array( const domIDREF_array &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domIDREF_array &operator=( const domIDREF_array &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domImage.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domImage.h new file mode 100644 index 00000000..0c31ec24 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domImage.h @@ -0,0 +1,398 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domImage_h__ +#define __domImage_h__ + +#include +#include + +#include +#include + +/** + * The image element declares the storage for the graphical representation + * of an object. The image element best describes raster image data, but + * can conceivably handle other forms of imagery. The image elements allows + * for specifying an external image file with the init_from element or embed + * image data with the data element. + */ +class domImage : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::IMAGE; } +public: + class domData; + + typedef daeSmartRef domDataRef; + typedef daeTArray domData_Array; + +/** + * The data child element contains a sequence of hexadecimal encoded binary + * octets representing the embedded image data. + */ + class domData : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::DATA; } + + protected: // Value + /** + * The domListOfHexBinary value of the text data of this element. + */ + domListOfHexBinary _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domListOfHexBinary reference of the _value array. + */ + domListOfHexBinary &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domListOfHexBinary reference of the _value array. + */ + const domListOfHexBinary &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domListOfHexBinary &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domData() : _value() {} + /** + * Destructor + */ + virtual ~domData() {} + /** + * Copy Constructor + */ + domData( const domData &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domData &operator=( const domData &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domInit_from; + + typedef daeSmartRef domInit_fromRef; + typedef daeTArray domInit_from_Array; + +/** + * The init_from element allows you to specify an external image file to use + * for the image element. + */ + class domInit_from : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::INIT_FROM; } + + protected: // Value + /** + * The xsAnyURI value of the text data of this element. + */ + xsAnyURI _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return Returns a xsAnyURI of the value. + */ + xsAnyURI &getValue() { return _value; } + /** + * Gets the value of this element. + * @return Returns a constant xsAnyURI of the value. + */ + const xsAnyURI &getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( const xsAnyURI &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domInit_from() : _value() {} + /** + * Destructor + */ + virtual ~domInit_from() {} + /** + * Copy Constructor + */ + domInit_from( const domInit_from &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domInit_from &operator=( const domInit_from &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + +protected: // Attributes +/** + * The id attribute is a text string containing the unique identifier of + * this element. This value must be unique within the instance document. + * Optional attribute. + */ + xsID attrId; +/** + * The name attribute is the text string name of this element. Optional attribute. + */ + xsNCName attrName; +/** + * The format attribute is a text string value that indicates the image format. + * Optional attribute. + */ + xsToken attrFormat; +/** + * The height attribute is an integer value that indicates the height of + * the image in pixel units. Optional attribute. + */ + domUint attrHeight; +/** + * The width attribute is an integer value that indicates the width of the + * image in pixel units. Optional attribute. + */ + domUint attrWidth; +/** + * The depth attribute is an integer value that indicates the depth of the + * image in pixel units. A 2-D image has a depth of 1, which is also the + * default value. Optional attribute. + */ + domUint attrDepth; + +protected: // Elements +/** + * The image element may contain an asset element. @see domAsset + */ + domAssetRef elemAsset; +/** + * The data child element contains a sequence of hexadecimal encoded binary + * octets representing the embedded image data. @see domData + */ + domDataRef elemData; +/** + * The init_from element allows you to specify an external image file to use + * for the image element. @see domInit_from + */ + domInit_fromRef elemInit_from; +/** + * The extra element may appear any number of times. @see domExtra + */ + domExtra_Array elemExtra_array; + /** + * Used to preserve order in elements that do not specify strict sequencing of sub-elements. + */ + daeElementRefArray _contents; + /** + * Used to preserve order in elements that have a complex content model. + */ + daeUIntArray _contentsOrder; + + +public: //Accessors and Mutators + /** + * Gets the id attribute. + * @return Returns a xsID of the id attribute. + */ + xsID getId() const { return attrId; } + /** + * Sets the id attribute. + * @param atId The new value for the id attribute. + */ + void setId( xsID atId ) { *(daeStringRef*)&attrId = atId; + _validAttributeArray[0] = true; } + + /** + * Gets the name attribute. + * @return Returns a xsNCName of the name attribute. + */ + xsNCName getName() const { return attrName; } + /** + * Sets the name attribute. + * @param atName The new value for the name attribute. + */ + void setName( xsNCName atName ) { *(daeStringRef*)&attrName = atName; + _validAttributeArray[1] = true; } + + /** + * Gets the format attribute. + * @return Returns a xsToken of the format attribute. + */ + xsToken getFormat() const { return attrFormat; } + /** + * Sets the format attribute. + * @param atFormat The new value for the format attribute. + */ + void setFormat( xsToken atFormat ) { *(daeStringRef*)&attrFormat = atFormat; + _validAttributeArray[2] = true; } + + /** + * Gets the height attribute. + * @return Returns a domUint of the height attribute. + */ + domUint getHeight() const { return attrHeight; } + /** + * Sets the height attribute. + * @param atHeight The new value for the height attribute. + */ + void setHeight( domUint atHeight ) { attrHeight = atHeight; + _validAttributeArray[3] = true; } + + /** + * Gets the width attribute. + * @return Returns a domUint of the width attribute. + */ + domUint getWidth() const { return attrWidth; } + /** + * Sets the width attribute. + * @param atWidth The new value for the width attribute. + */ + void setWidth( domUint atWidth ) { attrWidth = atWidth; + _validAttributeArray[4] = true; } + + /** + * Gets the depth attribute. + * @return Returns a domUint of the depth attribute. + */ + domUint getDepth() const { return attrDepth; } + /** + * Sets the depth attribute. + * @param atDepth The new value for the depth attribute. + */ + void setDepth( domUint atDepth ) { attrDepth = atDepth; + _validAttributeArray[5] = true; } + + /** + * Gets the asset element. + * @return a daeSmartRef to the asset element. + */ + const domAssetRef getAsset() const { return elemAsset; } + /** + * Gets the data element. + * @return a daeSmartRef to the data element. + */ + const domDataRef getData() const { return elemData; } + /** + * Gets the init_from element. + * @return a daeSmartRef to the init_from element. + */ + const domInit_fromRef getInit_from() const { return elemInit_from; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } + /** + * Gets the _contents array. + * @return Returns a reference to the _contents element array. + */ + daeElementRefArray &getContents() { return _contents; } + /** + * Gets the _contents array. + * @return Returns a constant reference to the _contents element array. + */ + const daeElementRefArray &getContents() const { return _contents; } + +protected: + /** + * Constructor + */ + domImage() : attrId(), attrName(), attrFormat(), attrHeight(), attrWidth(), attrDepth(), elemAsset(), elemData(), elemInit_from(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domImage() {} + /** + * Copy Constructor + */ + domImage( const domImage &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domImage &operator=( const domImage &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domInputGlobal.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domInputGlobal.h new file mode 100644 index 00000000..72f5d263 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domInputGlobal.h @@ -0,0 +1,164 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domInputGlobal_h__ +#define __domInputGlobal_h__ + +#include +#include + + +/** + * The InputGlobal type is used to represent inputs that can reference external + * resources. + */ +class domInputGlobal_complexType +{ +protected: // Attributes +/** + * The semantic attribute is the user-defined meaning of the input connection. + * Required attribute. + */ + xsNMTOKEN attrSemantic; +/** + * The source attribute indicates the location of the data source. Required + * attribute. + */ + xsAnyURI attrSource; + + +public: //Accessors and Mutators + /** + * Gets the semantic attribute. + * @return Returns a xsNMTOKEN of the semantic attribute. + */ + xsNMTOKEN getSemantic() const { return attrSemantic; } + /** + * Sets the semantic attribute. + * @param atSemantic The new value for the semantic attribute. + */ + void setSemantic( xsNMTOKEN atSemantic ) { *(daeStringRef*)&attrSemantic = atSemantic; } + + /** + * Gets the source attribute. + * @return Returns a xsAnyURI reference of the source attribute. + */ + xsAnyURI &getSource() { return attrSource; } + /** + * Gets the source attribute. + * @return Returns a constant xsAnyURI reference of the source attribute. + */ + const xsAnyURI &getSource() const { return attrSource; } + /** + * Sets the source attribute. + * @param atSource The new value for the source attribute. + */ + void setSource( const xsAnyURI &atSource ) { attrSource = atSource; } + +protected: + /** + * Constructor + */ + domInputGlobal_complexType() : attrSemantic(), attrSource() {} + /** + * Destructor + */ + virtual ~domInputGlobal_complexType() {} + /** + * Copy Constructor + */ + domInputGlobal_complexType( const domInputGlobal_complexType &cpy ) { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domInputGlobal_complexType &operator=( const domInputGlobal_complexType &cpy ) { (void)cpy; return *this; } +}; + +/** + * An element of type domInputGlobal_complexType. + */ +class domInputGlobal : public daeElement, public domInputGlobal_complexType +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::INPUTGLOBAL; } + +public: //Accessors and Mutators + /** + * Gets the semantic attribute. + * @return Returns a xsNMTOKEN of the semantic attribute. + */ + xsNMTOKEN getSemantic() const { return attrSemantic; } + /** + * Sets the semantic attribute. + * @param atSemantic The new value for the semantic attribute. + */ + void setSemantic( xsNMTOKEN atSemantic ) { *(daeStringRef*)&attrSemantic = atSemantic; + _validAttributeArray[0] = true; } + + /** + * Gets the source attribute. + * @return Returns a xsAnyURI reference of the source attribute. + */ + xsAnyURI &getSource() { return attrSource; } + /** + * Gets the source attribute. + * @return Returns a constant xsAnyURI reference of the source attribute. + */ + const xsAnyURI &getSource() const { return attrSource; } + /** + * Sets the source attribute. + * @param atSource The new value for the source attribute. + */ + void setSource( const xsAnyURI &atSource ) { attrSource = atSource; + _validAttributeArray[1] = true; } + +protected: + /** + * Constructor + */ + domInputGlobal() {} + /** + * Destructor + */ + virtual ~domInputGlobal() {} + /** + * Copy Constructor + */ + domInputGlobal( const domInputGlobal &cpy ) : daeElement(), domInputGlobal_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domInputGlobal &operator=( const domInputGlobal &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domInputLocal.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domInputLocal.h new file mode 100644 index 00000000..4443870b --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domInputLocal.h @@ -0,0 +1,164 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domInputLocal_h__ +#define __domInputLocal_h__ + +#include +#include + + +/** + * The InputLocal type is used to represent inputs that can only reference + * resources declared in the same document. + */ +class domInputLocal_complexType +{ +protected: // Attributes +/** + * The semantic attribute is the user-defined meaning of the input connection. + * Required attribute. + */ + xsNMTOKEN attrSemantic; +/** + * The source attribute indicates the location of the data source. Required + * attribute. + */ + domURIFragmentType attrSource; + + +public: //Accessors and Mutators + /** + * Gets the semantic attribute. + * @return Returns a xsNMTOKEN of the semantic attribute. + */ + xsNMTOKEN getSemantic() const { return attrSemantic; } + /** + * Sets the semantic attribute. + * @param atSemantic The new value for the semantic attribute. + */ + void setSemantic( xsNMTOKEN atSemantic ) { *(daeStringRef*)&attrSemantic = atSemantic; } + + /** + * Gets the source attribute. + * @return Returns a domURIFragmentType reference of the source attribute. + */ + domURIFragmentType &getSource() { return attrSource; } + /** + * Gets the source attribute. + * @return Returns a constant domURIFragmentType reference of the source attribute. + */ + const domURIFragmentType &getSource() const { return attrSource; } + /** + * Sets the source attribute. + * @param atSource The new value for the source attribute. + */ + void setSource( const domURIFragmentType &atSource ) { attrSource = atSource; } + +protected: + /** + * Constructor + */ + domInputLocal_complexType() : attrSemantic(), attrSource() {} + /** + * Destructor + */ + virtual ~domInputLocal_complexType() {} + /** + * Copy Constructor + */ + domInputLocal_complexType( const domInputLocal_complexType &cpy ) { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domInputLocal_complexType &operator=( const domInputLocal_complexType &cpy ) { (void)cpy; return *this; } +}; + +/** + * An element of type domInputLocal_complexType. + */ +class domInputLocal : public daeElement, public domInputLocal_complexType +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::INPUTLOCAL; } + +public: //Accessors and Mutators + /** + * Gets the semantic attribute. + * @return Returns a xsNMTOKEN of the semantic attribute. + */ + xsNMTOKEN getSemantic() const { return attrSemantic; } + /** + * Sets the semantic attribute. + * @param atSemantic The new value for the semantic attribute. + */ + void setSemantic( xsNMTOKEN atSemantic ) { *(daeStringRef*)&attrSemantic = atSemantic; + _validAttributeArray[0] = true; } + + /** + * Gets the source attribute. + * @return Returns a domURIFragmentType reference of the source attribute. + */ + domURIFragmentType &getSource() { return attrSource; } + /** + * Gets the source attribute. + * @return Returns a constant domURIFragmentType reference of the source attribute. + */ + const domURIFragmentType &getSource() const { return attrSource; } + /** + * Sets the source attribute. + * @param atSource The new value for the source attribute. + */ + void setSource( const domURIFragmentType &atSource ) { attrSource = atSource; + _validAttributeArray[1] = true; } + +protected: + /** + * Constructor + */ + domInputLocal() {} + /** + * Destructor + */ + virtual ~domInputLocal() {} + /** + * Copy Constructor + */ + domInputLocal( const domInputLocal &cpy ) : daeElement(), domInputLocal_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domInputLocal &operator=( const domInputLocal &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domInputLocalOffset.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domInputLocalOffset.h new file mode 100644 index 00000000..625a57da --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domInputLocalOffset.h @@ -0,0 +1,222 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domInputLocalOffset_h__ +#define __domInputLocalOffset_h__ + +#include +#include + + +/** + * The InputLocalOffset type is used to represent indexed inputs that can + * only reference resources declared in the same document. + */ +class domInputLocalOffset_complexType +{ +protected: // Attributes +/** + * The offset attribute represents the offset into the list of indices. + * If two input elements share the same offset, they will be indexed the + * same. This works as a simple form of compression for the list of indices + * as well as defining the order the inputs should be used in. Required attribute. + */ + domUint attrOffset; +/** + * The semantic attribute is the user-defined meaning of the input connection. + * Required attribute. + */ + xsNMTOKEN attrSemantic; +/** + * The source attribute indicates the location of the data source. Required + * attribute. + */ + domURIFragmentType attrSource; +/** + * The set attribute indicates which inputs should be grouped together as + * a single set. This is helpful when multiple inputs share the same semantics. + */ + domUint attrSet; + + +public: //Accessors and Mutators + /** + * Gets the offset attribute. + * @return Returns a domUint of the offset attribute. + */ + domUint getOffset() const { return attrOffset; } + /** + * Sets the offset attribute. + * @param atOffset The new value for the offset attribute. + */ + void setOffset( domUint atOffset ) { attrOffset = atOffset; } + + /** + * Gets the semantic attribute. + * @return Returns a xsNMTOKEN of the semantic attribute. + */ + xsNMTOKEN getSemantic() const { return attrSemantic; } + /** + * Sets the semantic attribute. + * @param atSemantic The new value for the semantic attribute. + */ + void setSemantic( xsNMTOKEN atSemantic ) { *(daeStringRef*)&attrSemantic = atSemantic; } + + /** + * Gets the source attribute. + * @return Returns a domURIFragmentType reference of the source attribute. + */ + domURIFragmentType &getSource() { return attrSource; } + /** + * Gets the source attribute. + * @return Returns a constant domURIFragmentType reference of the source attribute. + */ + const domURIFragmentType &getSource() const { return attrSource; } + /** + * Sets the source attribute. + * @param atSource The new value for the source attribute. + */ + void setSource( const domURIFragmentType &atSource ) { attrSource = atSource; } + + /** + * Gets the set attribute. + * @return Returns a domUint of the set attribute. + */ + domUint getSet() const { return attrSet; } + /** + * Sets the set attribute. + * @param atSet The new value for the set attribute. + */ + void setSet( domUint atSet ) { attrSet = atSet; } + +protected: + /** + * Constructor + */ + domInputLocalOffset_complexType() : attrOffset(), attrSemantic(), attrSource(), attrSet() {} + /** + * Destructor + */ + virtual ~domInputLocalOffset_complexType() {} + /** + * Copy Constructor + */ + domInputLocalOffset_complexType( const domInputLocalOffset_complexType &cpy ) { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domInputLocalOffset_complexType &operator=( const domInputLocalOffset_complexType &cpy ) { (void)cpy; return *this; } +}; + +/** + * An element of type domInputLocalOffset_complexType. + */ +class domInputLocalOffset : public daeElement, public domInputLocalOffset_complexType +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::INPUTLOCALOFFSET; } + +public: //Accessors and Mutators + /** + * Gets the offset attribute. + * @return Returns a domUint of the offset attribute. + */ + domUint getOffset() const { return attrOffset; } + /** + * Sets the offset attribute. + * @param atOffset The new value for the offset attribute. + */ + void setOffset( domUint atOffset ) { attrOffset = atOffset; + _validAttributeArray[0] = true; } + + /** + * Gets the semantic attribute. + * @return Returns a xsNMTOKEN of the semantic attribute. + */ + xsNMTOKEN getSemantic() const { return attrSemantic; } + /** + * Sets the semantic attribute. + * @param atSemantic The new value for the semantic attribute. + */ + void setSemantic( xsNMTOKEN atSemantic ) { *(daeStringRef*)&attrSemantic = atSemantic; + _validAttributeArray[1] = true; } + + /** + * Gets the source attribute. + * @return Returns a domURIFragmentType reference of the source attribute. + */ + domURIFragmentType &getSource() { return attrSource; } + /** + * Gets the source attribute. + * @return Returns a constant domURIFragmentType reference of the source attribute. + */ + const domURIFragmentType &getSource() const { return attrSource; } + /** + * Sets the source attribute. + * @param atSource The new value for the source attribute. + */ + void setSource( const domURIFragmentType &atSource ) { attrSource = atSource; + _validAttributeArray[2] = true; } + + /** + * Gets the set attribute. + * @return Returns a domUint of the set attribute. + */ + domUint getSet() const { return attrSet; } + /** + * Sets the set attribute. + * @param atSet The new value for the set attribute. + */ + void setSet( domUint atSet ) { attrSet = atSet; + _validAttributeArray[3] = true; } + +protected: + /** + * Constructor + */ + domInputLocalOffset() {} + /** + * Destructor + */ + virtual ~domInputLocalOffset() {} + /** + * Copy Constructor + */ + domInputLocalOffset( const domInputLocalOffset &cpy ) : daeElement(), domInputLocalOffset_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domInputLocalOffset &operator=( const domInputLocalOffset &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domInstanceWithExtra.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domInstanceWithExtra.h new file mode 100644 index 00000000..4929cb03 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domInstanceWithExtra.h @@ -0,0 +1,211 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domInstanceWithExtra_h__ +#define __domInstanceWithExtra_h__ + +#include +#include + +#include + +/** + * The InstanceWithExtra type is used for all generic instance elements. A + * generic instance element is one which does not have any specific child + * elements declared. + */ +class domInstanceWithExtra_complexType +{ +protected: // Attributes +/** + * The url attribute refers to resource to instantiate. This may refer to + * a local resource using a relative URL fragment identifier that begins + * with the “#†character. The url attribute may refer to an external + * resource using an absolute or relative URL. + */ + xsAnyURI attrUrl; +/** + * The sid attribute is a text string value containing the sub-identifier + * of this element. This value must be unique within the scope of the parent + * element. Optional attribute. + */ + xsNCName attrSid; +/** + * The name attribute is the text string name of this element. Optional attribute. + */ + xsNCName attrName; + +protected: // Element +/** + * The extra element may occur any number of times. @see domExtra + */ + domExtra_Array elemExtra_array; + +public: //Accessors and Mutators + /** + * Gets the url attribute. + * @return Returns a xsAnyURI reference of the url attribute. + */ + xsAnyURI &getUrl() { return attrUrl; } + /** + * Gets the url attribute. + * @return Returns a constant xsAnyURI reference of the url attribute. + */ + const xsAnyURI &getUrl() const { return attrUrl; } + /** + * Sets the url attribute. + * @param atUrl The new value for the url attribute. + */ + void setUrl( const xsAnyURI &atUrl ) { attrUrl = atUrl; } + + /** + * Gets the sid attribute. + * @return Returns a xsNCName of the sid attribute. + */ + xsNCName getSid() const { return attrSid; } + /** + * Sets the sid attribute. + * @param atSid The new value for the sid attribute. + */ + void setSid( xsNCName atSid ) { *(daeStringRef*)&attrSid = atSid; } + + /** + * Gets the name attribute. + * @return Returns a xsNCName of the name attribute. + */ + xsNCName getName() const { return attrName; } + /** + * Sets the name attribute. + * @param atName The new value for the name attribute. + */ + void setName( xsNCName atName ) { *(daeStringRef*)&attrName = atName; } + + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } +protected: + /** + * Constructor + */ + domInstanceWithExtra_complexType() : attrUrl(), attrSid(), attrName(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domInstanceWithExtra_complexType() {} + /** + * Copy Constructor + */ + domInstanceWithExtra_complexType( const domInstanceWithExtra_complexType &cpy ) { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domInstanceWithExtra_complexType &operator=( const domInstanceWithExtra_complexType &cpy ) { (void)cpy; return *this; } +}; + +/** + * An element of type domInstanceWithExtra_complexType. + */ +class domInstanceWithExtra : public daeElement, public domInstanceWithExtra_complexType +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::INSTANCEWITHEXTRA; } + +public: //Accessors and Mutators + /** + * Gets the url attribute. + * @return Returns a xsAnyURI reference of the url attribute. + */ + xsAnyURI &getUrl() { return attrUrl; } + /** + * Gets the url attribute. + * @return Returns a constant xsAnyURI reference of the url attribute. + */ + const xsAnyURI &getUrl() const { return attrUrl; } + /** + * Sets the url attribute. + * @param atUrl The new value for the url attribute. + */ + void setUrl( const xsAnyURI &atUrl ) { attrUrl = atUrl; + _validAttributeArray[0] = true; } + + /** + * Gets the sid attribute. + * @return Returns a xsNCName of the sid attribute. + */ + xsNCName getSid() const { return attrSid; } + /** + * Sets the sid attribute. + * @param atSid The new value for the sid attribute. + */ + void setSid( xsNCName atSid ) { *(daeStringRef*)&attrSid = atSid; + _validAttributeArray[1] = true; } + + /** + * Gets the name attribute. + * @return Returns a xsNCName of the name attribute. + */ + xsNCName getName() const { return attrName; } + /** + * Sets the name attribute. + * @param atName The new value for the name attribute. + */ + void setName( xsNCName atName ) { *(daeStringRef*)&attrName = atName; + _validAttributeArray[2] = true; } + +protected: + /** + * Constructor + */ + domInstanceWithExtra() {} + /** + * Destructor + */ + virtual ~domInstanceWithExtra() {} + /** + * Copy Constructor + */ + domInstanceWithExtra( const domInstanceWithExtra &cpy ) : daeElement(), domInstanceWithExtra_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domInstanceWithExtra &operator=( const domInstanceWithExtra &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domInstance_camera.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domInstance_camera.h new file mode 100644 index 00000000..d553adeb --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domInstance_camera.h @@ -0,0 +1,70 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domInstance_camera_h__ +#define __domInstance_camera_h__ + +#include +#include + +#include + +/** + * The instance_camera element declares the instantiation of a COLLADA camera + * resource. + */ +class domInstance_camera : public daeElement, public domInstanceWithExtra_complexType +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::INSTANCE_CAMERA; } + +protected: + /** + * Constructor + */ + domInstance_camera() {} + /** + * Destructor + */ + virtual ~domInstance_camera() {} + /** + * Copy Constructor + */ + domInstance_camera( const domInstance_camera &cpy ) : daeElement(), domInstanceWithExtra_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domInstance_camera &operator=( const domInstance_camera &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domInstance_controller.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domInstance_controller.h new file mode 100644 index 00000000..208cd3da --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domInstance_controller.h @@ -0,0 +1,252 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domInstance_controller_h__ +#define __domInstance_controller_h__ + +#include +#include + +#include +#include + +/** + * The instance_controller element declares the instantiation of a COLLADA + * controller resource. + */ +class domInstance_controller : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::INSTANCE_CONTROLLER; } +public: + class domSkeleton; + + typedef daeSmartRef domSkeletonRef; + typedef daeTArray domSkeleton_Array; + +/** + * The skeleton element is used to indicate where a skin controller is to + * start to search for the joint nodes it needs. This element is meaningless + * for morph controllers. + */ + class domSkeleton : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::SKELETON; } + + protected: // Value + /** + * The xsAnyURI value of the text data of this element. + */ + xsAnyURI _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return Returns a xsAnyURI of the value. + */ + xsAnyURI &getValue() { return _value; } + /** + * Gets the value of this element. + * @return Returns a constant xsAnyURI of the value. + */ + const xsAnyURI &getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( const xsAnyURI &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domSkeleton() : _value() {} + /** + * Destructor + */ + virtual ~domSkeleton() {} + /** + * Copy Constructor + */ + domSkeleton( const domSkeleton &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domSkeleton &operator=( const domSkeleton &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + +protected: // Attributes +/** + * The url attribute refers to resource. This may refer to a local resource + * using a relative URL fragment identifier that begins with the “#†+ * character. The url attribute may refer to an external resource using an + * absolute or relative URL. + */ + xsAnyURI attrUrl; +/** + * The sid attribute is a text string value containing the sub-identifier + * of this element. This value must be unique within the scope of the parent + * element. Optional attribute. + */ + xsNCName attrSid; +/** + * The name attribute is the text string name of this element. Optional attribute. + */ + xsNCName attrName; + +protected: // Elements +/** + * The skeleton element is used to indicate where a skin controller is to + * start to search for the joint nodes it needs. This element is meaningless + * for morph controllers. @see domSkeleton + */ + domSkeleton_Array elemSkeleton_array; +/** + * Bind a specific material to a piece of geometry, binding varying and uniform + * parameters at the same time. @see domBind_material + */ + domBind_materialRef elemBind_material; +/** + * The extra element may appear any number of times. @see domExtra + */ + domExtra_Array elemExtra_array; + +public: //Accessors and Mutators + /** + * Gets the url attribute. + * @return Returns a xsAnyURI reference of the url attribute. + */ + xsAnyURI &getUrl() { return attrUrl; } + /** + * Gets the url attribute. + * @return Returns a constant xsAnyURI reference of the url attribute. + */ + const xsAnyURI &getUrl() const { return attrUrl; } + /** + * Sets the url attribute. + * @param atUrl The new value for the url attribute. + */ + void setUrl( const xsAnyURI &atUrl ) { attrUrl = atUrl; + _validAttributeArray[0] = true; } + + /** + * Gets the sid attribute. + * @return Returns a xsNCName of the sid attribute. + */ + xsNCName getSid() const { return attrSid; } + /** + * Sets the sid attribute. + * @param atSid The new value for the sid attribute. + */ + void setSid( xsNCName atSid ) { *(daeStringRef*)&attrSid = atSid; + _validAttributeArray[1] = true; } + + /** + * Gets the name attribute. + * @return Returns a xsNCName of the name attribute. + */ + xsNCName getName() const { return attrName; } + /** + * Sets the name attribute. + * @param atName The new value for the name attribute. + */ + void setName( xsNCName atName ) { *(daeStringRef*)&attrName = atName; + _validAttributeArray[2] = true; } + + /** + * Gets the skeleton element array. + * @return Returns a reference to the array of skeleton elements. + */ + domSkeleton_Array &getSkeleton_array() { return elemSkeleton_array; } + /** + * Gets the skeleton element array. + * @return Returns a constant reference to the array of skeleton elements. + */ + const domSkeleton_Array &getSkeleton_array() const { return elemSkeleton_array; } + /** + * Gets the bind_material element. + * @return a daeSmartRef to the bind_material element. + */ + const domBind_materialRef getBind_material() const { return elemBind_material; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } +protected: + /** + * Constructor + */ + domInstance_controller() : attrUrl(), attrSid(), attrName(), elemSkeleton_array(), elemBind_material(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domInstance_controller() {} + /** + * Copy Constructor + */ + domInstance_controller( const domInstance_controller &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domInstance_controller &operator=( const domInstance_controller &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domInstance_effect.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domInstance_effect.h new file mode 100644 index 00000000..e38f68b7 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domInstance_effect.h @@ -0,0 +1,358 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domInstance_effect_h__ +#define __domInstance_effect_h__ + +#include +#include + +#include +#include + +/** + * The instance_effect element declares the instantiation of a COLLADA effect + * resource. + */ +class domInstance_effect : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::INSTANCE_EFFECT; } +public: + class domTechnique_hint; + + typedef daeSmartRef domTechnique_hintRef; + typedef daeTArray domTechnique_hint_Array; + +/** + * Add a hint for a platform of which technique to use in this effect. + */ + class domTechnique_hint : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::TECHNIQUE_HINT; } + protected: // Attributes +/** + * A platform defines a string that specifies which platform this is hint + * is aimed for. + */ + xsNCName attrPlatform; +/** + * A profile defines a string that specifies which API profile this is hint + * is aimed for. + */ + xsNCName attrProfile; +/** + * A reference to the technique to use for the specified platform. + */ + xsNCName attrRef; + + + public: //Accessors and Mutators + /** + * Gets the platform attribute. + * @return Returns a xsNCName of the platform attribute. + */ + xsNCName getPlatform() const { return attrPlatform; } + /** + * Sets the platform attribute. + * @param atPlatform The new value for the platform attribute. + */ + void setPlatform( xsNCName atPlatform ) { *(daeStringRef*)&attrPlatform = atPlatform; + _validAttributeArray[0] = true; } + + /** + * Gets the profile attribute. + * @return Returns a xsNCName of the profile attribute. + */ + xsNCName getProfile() const { return attrProfile; } + /** + * Sets the profile attribute. + * @param atProfile The new value for the profile attribute. + */ + void setProfile( xsNCName atProfile ) { *(daeStringRef*)&attrProfile = atProfile; + _validAttributeArray[1] = true; } + + /** + * Gets the ref attribute. + * @return Returns a xsNCName of the ref attribute. + */ + xsNCName getRef() const { return attrRef; } + /** + * Sets the ref attribute. + * @param atRef The new value for the ref attribute. + */ + void setRef( xsNCName atRef ) { *(daeStringRef*)&attrRef = atRef; + _validAttributeArray[2] = true; } + + protected: + /** + * Constructor + */ + domTechnique_hint() : attrPlatform(), attrProfile(), attrRef() {} + /** + * Destructor + */ + virtual ~domTechnique_hint() {} + /** + * Copy Constructor + */ + domTechnique_hint( const domTechnique_hint &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domTechnique_hint &operator=( const domTechnique_hint &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domSetparam; + + typedef daeSmartRef domSetparamRef; + typedef daeTArray domSetparam_Array; + +/** + * Assigns a new value to a previously defined parameter + */ + class domSetparam : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::SETPARAM; } + protected: // Attribute + xsToken attrRef; + + protected: // Element + domFx_basic_type_commonRef elemFx_basic_type_common; + + public: //Accessors and Mutators + /** + * Gets the ref attribute. + * @return Returns a xsToken of the ref attribute. + */ + xsToken getRef() const { return attrRef; } + /** + * Sets the ref attribute. + * @param atRef The new value for the ref attribute. + */ + void setRef( xsToken atRef ) { *(daeStringRef*)&attrRef = atRef; + _validAttributeArray[0] = true; } + + /** + * Gets the fx_basic_type_common element. + * @return a daeSmartRef to the fx_basic_type_common element. + */ + const domFx_basic_type_commonRef getFx_basic_type_common() const { return elemFx_basic_type_common; } + protected: + /** + * Constructor + */ + domSetparam() : attrRef(), elemFx_basic_type_common() {} + /** + * Destructor + */ + virtual ~domSetparam() {} + /** + * Copy Constructor + */ + domSetparam( const domSetparam &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domSetparam &operator=( const domSetparam &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + +protected: // Attributes +/** + * The url attribute refers to resource. This may refer to a local resource + * using a relative URL fragment identifier that begins with the “#†+ * character. The url attribute may refer to an external resource using an + * absolute or relative URL. + */ + xsAnyURI attrUrl; +/** + * The sid attribute is a text string value containing the sub-identifier + * of this element. This value must be unique within the scope of the parent + * element. Optional attribute. + */ + xsNCName attrSid; +/** + * The name attribute is the text string name of this element. Optional attribute. + */ + xsNCName attrName; + +protected: // Elements +/** + * Add a hint for a platform of which technique to use in this effect. @see + * domTechnique_hint + */ + domTechnique_hint_Array elemTechnique_hint_array; +/** + * Assigns a new value to a previously defined parameter @see domSetparam + */ + domSetparam_Array elemSetparam_array; +/** + * The extra element may appear any number of times. @see domExtra + */ + domExtra_Array elemExtra_array; + +public: //Accessors and Mutators + /** + * Gets the url attribute. + * @return Returns a xsAnyURI reference of the url attribute. + */ + xsAnyURI &getUrl() { return attrUrl; } + /** + * Gets the url attribute. + * @return Returns a constant xsAnyURI reference of the url attribute. + */ + const xsAnyURI &getUrl() const { return attrUrl; } + /** + * Sets the url attribute. + * @param atUrl The new value for the url attribute. + */ + void setUrl( const xsAnyURI &atUrl ) { attrUrl = atUrl; + _validAttributeArray[0] = true; } + + /** + * Gets the sid attribute. + * @return Returns a xsNCName of the sid attribute. + */ + xsNCName getSid() const { return attrSid; } + /** + * Sets the sid attribute. + * @param atSid The new value for the sid attribute. + */ + void setSid( xsNCName atSid ) { *(daeStringRef*)&attrSid = atSid; + _validAttributeArray[1] = true; } + + /** + * Gets the name attribute. + * @return Returns a xsNCName of the name attribute. + */ + xsNCName getName() const { return attrName; } + /** + * Sets the name attribute. + * @param atName The new value for the name attribute. + */ + void setName( xsNCName atName ) { *(daeStringRef*)&attrName = atName; + _validAttributeArray[2] = true; } + + /** + * Gets the technique_hint element array. + * @return Returns a reference to the array of technique_hint elements. + */ + domTechnique_hint_Array &getTechnique_hint_array() { return elemTechnique_hint_array; } + /** + * Gets the technique_hint element array. + * @return Returns a constant reference to the array of technique_hint elements. + */ + const domTechnique_hint_Array &getTechnique_hint_array() const { return elemTechnique_hint_array; } + /** + * Gets the setparam element array. + * @return Returns a reference to the array of setparam elements. + */ + domSetparam_Array &getSetparam_array() { return elemSetparam_array; } + /** + * Gets the setparam element array. + * @return Returns a constant reference to the array of setparam elements. + */ + const domSetparam_Array &getSetparam_array() const { return elemSetparam_array; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } +protected: + /** + * Constructor + */ + domInstance_effect() : attrUrl(), attrSid(), attrName(), elemTechnique_hint_array(), elemSetparam_array(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domInstance_effect() {} + /** + * Copy Constructor + */ + domInstance_effect( const domInstance_effect &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domInstance_effect &operator=( const domInstance_effect &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domInstance_force_field.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domInstance_force_field.h new file mode 100644 index 00000000..24769217 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domInstance_force_field.h @@ -0,0 +1,70 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domInstance_force_field_h__ +#define __domInstance_force_field_h__ + +#include +#include + +#include + +/** + * The instance_force_field element declares the instantiation of a COLLADA + * force_field resource. + */ +class domInstance_force_field : public daeElement, public domInstanceWithExtra_complexType +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::INSTANCE_FORCE_FIELD; } + +protected: + /** + * Constructor + */ + domInstance_force_field() {} + /** + * Destructor + */ + virtual ~domInstance_force_field() {} + /** + * Copy Constructor + */ + domInstance_force_field( const domInstance_force_field &cpy ) : daeElement(), domInstanceWithExtra_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domInstance_force_field &operator=( const domInstance_force_field &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domInstance_geometry.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domInstance_geometry.h new file mode 100644 index 00000000..b87c82e9 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domInstance_geometry.h @@ -0,0 +1,157 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domInstance_geometry_h__ +#define __domInstance_geometry_h__ + +#include +#include + +#include +#include + +/** + * The instance_geometry element declares the instantiation of a COLLADA geometry + * resource. + */ +class domInstance_geometry : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::INSTANCE_GEOMETRY; } +protected: // Attributes +/** + * The url attribute refers to resource. This may refer to a local resource + * using a relative URL fragment identifier that begins with the “#†+ * character. The url attribute may refer to an external resource using an + * absolute or relative URL. + */ + xsAnyURI attrUrl; +/** + * The sid attribute is a text string value containing the sub-identifier + * of this element. This value must be unique within the scope of the parent + * element. Optional attribute. + */ + xsNCName attrSid; +/** + * The name attribute is the text string name of this element. Optional attribute. + */ + xsNCName attrName; + +protected: // Elements +/** + * Bind a specific material to a piece of geometry, binding varying and uniform + * parameters at the same time. @see domBind_material + */ + domBind_materialRef elemBind_material; +/** + * The extra element may appear any number of times. @see domExtra + */ + domExtra_Array elemExtra_array; + +public: //Accessors and Mutators + /** + * Gets the url attribute. + * @return Returns a xsAnyURI reference of the url attribute. + */ + xsAnyURI &getUrl() { return attrUrl; } + /** + * Gets the url attribute. + * @return Returns a constant xsAnyURI reference of the url attribute. + */ + const xsAnyURI &getUrl() const { return attrUrl; } + /** + * Sets the url attribute. + * @param atUrl The new value for the url attribute. + */ + void setUrl( const xsAnyURI &atUrl ) { attrUrl = atUrl; + _validAttributeArray[0] = true; } + + /** + * Gets the sid attribute. + * @return Returns a xsNCName of the sid attribute. + */ + xsNCName getSid() const { return attrSid; } + /** + * Sets the sid attribute. + * @param atSid The new value for the sid attribute. + */ + void setSid( xsNCName atSid ) { *(daeStringRef*)&attrSid = atSid; + _validAttributeArray[1] = true; } + + /** + * Gets the name attribute. + * @return Returns a xsNCName of the name attribute. + */ + xsNCName getName() const { return attrName; } + /** + * Sets the name attribute. + * @param atName The new value for the name attribute. + */ + void setName( xsNCName atName ) { *(daeStringRef*)&attrName = atName; + _validAttributeArray[2] = true; } + + /** + * Gets the bind_material element. + * @return a daeSmartRef to the bind_material element. + */ + const domBind_materialRef getBind_material() const { return elemBind_material; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } +protected: + /** + * Constructor + */ + domInstance_geometry() : attrUrl(), attrSid(), attrName(), elemBind_material(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domInstance_geometry() {} + /** + * Copy Constructor + */ + domInstance_geometry( const domInstance_geometry &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domInstance_geometry &operator=( const domInstance_geometry &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domInstance_light.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domInstance_light.h new file mode 100644 index 00000000..7f050fd6 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domInstance_light.h @@ -0,0 +1,70 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domInstance_light_h__ +#define __domInstance_light_h__ + +#include +#include + +#include + +/** + * The instance_light element declares the instantiation of a COLLADA light + * resource. + */ +class domInstance_light : public daeElement, public domInstanceWithExtra_complexType +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::INSTANCE_LIGHT; } + +protected: + /** + * Constructor + */ + domInstance_light() {} + /** + * Destructor + */ + virtual ~domInstance_light() {} + /** + * Copy Constructor + */ + domInstance_light( const domInstance_light &cpy ) : daeElement(), domInstanceWithExtra_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domInstance_light &operator=( const domInstance_light &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domInstance_material.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domInstance_material.h new file mode 100644 index 00000000..ba46e434 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domInstance_material.h @@ -0,0 +1,386 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domInstance_material_h__ +#define __domInstance_material_h__ + +#include +#include + +#include + +/** + * The instance_material element declares the instantiation of a COLLADA material + * resource. + */ +class domInstance_material : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::INSTANCE_MATERIAL; } +public: + class domBind; + + typedef daeSmartRef domBindRef; + typedef daeTArray domBind_Array; + +/** + * The bind element binds values to effect parameters upon instantiation. + */ + class domBind : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::BIND; } + protected: // Attributes +/** + * The semantic attribute specifies which effect parameter to bind. + */ + xsNCName attrSemantic; +/** + * The target attribute specifies the location of the value to bind to the + * specified semantic. This text string is a path-name following a simple + * syntax described in the “Addressing Syntax†section. + */ + xsToken attrTarget; + + + public: //Accessors and Mutators + /** + * Gets the semantic attribute. + * @return Returns a xsNCName of the semantic attribute. + */ + xsNCName getSemantic() const { return attrSemantic; } + /** + * Sets the semantic attribute. + * @param atSemantic The new value for the semantic attribute. + */ + void setSemantic( xsNCName atSemantic ) { *(daeStringRef*)&attrSemantic = atSemantic; + _validAttributeArray[0] = true; } + + /** + * Gets the target attribute. + * @return Returns a xsToken of the target attribute. + */ + xsToken getTarget() const { return attrTarget; } + /** + * Sets the target attribute. + * @param atTarget The new value for the target attribute. + */ + void setTarget( xsToken atTarget ) { *(daeStringRef*)&attrTarget = atTarget; + _validAttributeArray[1] = true; } + + protected: + /** + * Constructor + */ + domBind() : attrSemantic(), attrTarget() {} + /** + * Destructor + */ + virtual ~domBind() {} + /** + * Copy Constructor + */ + domBind( const domBind &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domBind &operator=( const domBind &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domBind_vertex_input; + + typedef daeSmartRef domBind_vertex_inputRef; + typedef daeTArray domBind_vertex_input_Array; + +/** + * The bind_vertex_input element binds vertex inputs to effect parameters + * upon instantiation. + */ + class domBind_vertex_input : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::BIND_VERTEX_INPUT; } + protected: // Attributes +/** + * The semantic attribute specifies which effect parameter to bind. + */ + xsNCName attrSemantic; +/** + * The input_semantic attribute specifies which input semantic to bind. + */ + xsNCName attrInput_semantic; +/** + * The input_set attribute specifies which input set to bind. + */ + domUint attrInput_set; + + + public: //Accessors and Mutators + /** + * Gets the semantic attribute. + * @return Returns a xsNCName of the semantic attribute. + */ + xsNCName getSemantic() const { return attrSemantic; } + /** + * Sets the semantic attribute. + * @param atSemantic The new value for the semantic attribute. + */ + void setSemantic( xsNCName atSemantic ) { *(daeStringRef*)&attrSemantic = atSemantic; + _validAttributeArray[0] = true; } + + /** + * Gets the input_semantic attribute. + * @return Returns a xsNCName of the input_semantic attribute. + */ + xsNCName getInput_semantic() const { return attrInput_semantic; } + /** + * Sets the input_semantic attribute. + * @param atInput_semantic The new value for the input_semantic attribute. + */ + void setInput_semantic( xsNCName atInput_semantic ) { *(daeStringRef*)&attrInput_semantic = atInput_semantic; + _validAttributeArray[1] = true; } + + /** + * Gets the input_set attribute. + * @return Returns a domUint of the input_set attribute. + */ + domUint getInput_set() const { return attrInput_set; } + /** + * Sets the input_set attribute. + * @param atInput_set The new value for the input_set attribute. + */ + void setInput_set( domUint atInput_set ) { attrInput_set = atInput_set; + _validAttributeArray[2] = true; } + + protected: + /** + * Constructor + */ + domBind_vertex_input() : attrSemantic(), attrInput_semantic(), attrInput_set() {} + /** + * Destructor + */ + virtual ~domBind_vertex_input() {} + /** + * Copy Constructor + */ + domBind_vertex_input( const domBind_vertex_input &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domBind_vertex_input &operator=( const domBind_vertex_input &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + +protected: // Attributes +/** + * The symbol attribute specifies which symbol defined from within the geometry + * this material binds to. + */ + xsNCName attrSymbol; +/** + * The target attribute specifies the URL of the location of the object to + * instantiate. + */ + xsAnyURI attrTarget; +/** + * The sid attribute is a text string value containing the sub-identifier + * of this element. This value must be unique within the scope of the parent + * element. Optional attribute. + */ + xsNCName attrSid; +/** + * The name attribute is the text string name of this element. Optional attribute. + */ + xsNCName attrName; + +protected: // Elements +/** + * The bind element binds values to effect parameters upon instantiation. + * @see domBind + */ + domBind_Array elemBind_array; +/** + * The bind_vertex_input element binds vertex inputs to effect parameters + * upon instantiation. @see domBind_vertex_input + */ + domBind_vertex_input_Array elemBind_vertex_input_array; +/** + * The extra element may appear any number of times. @see domExtra + */ + domExtra_Array elemExtra_array; + +public: //Accessors and Mutators + /** + * Gets the symbol attribute. + * @return Returns a xsNCName of the symbol attribute. + */ + xsNCName getSymbol() const { return attrSymbol; } + /** + * Sets the symbol attribute. + * @param atSymbol The new value for the symbol attribute. + */ + void setSymbol( xsNCName atSymbol ) { *(daeStringRef*)&attrSymbol = atSymbol; + _validAttributeArray[0] = true; } + + /** + * Gets the target attribute. + * @return Returns a xsAnyURI reference of the target attribute. + */ + xsAnyURI &getTarget() { return attrTarget; } + /** + * Gets the target attribute. + * @return Returns a constant xsAnyURI reference of the target attribute. + */ + const xsAnyURI &getTarget() const { return attrTarget; } + /** + * Sets the target attribute. + * @param atTarget The new value for the target attribute. + */ + void setTarget( const xsAnyURI &atTarget ) { attrTarget = atTarget; + _validAttributeArray[1] = true; } + + /** + * Gets the sid attribute. + * @return Returns a xsNCName of the sid attribute. + */ + xsNCName getSid() const { return attrSid; } + /** + * Sets the sid attribute. + * @param atSid The new value for the sid attribute. + */ + void setSid( xsNCName atSid ) { *(daeStringRef*)&attrSid = atSid; + _validAttributeArray[2] = true; } + + /** + * Gets the name attribute. + * @return Returns a xsNCName of the name attribute. + */ + xsNCName getName() const { return attrName; } + /** + * Sets the name attribute. + * @param atName The new value for the name attribute. + */ + void setName( xsNCName atName ) { *(daeStringRef*)&attrName = atName; + _validAttributeArray[3] = true; } + + /** + * Gets the bind element array. + * @return Returns a reference to the array of bind elements. + */ + domBind_Array &getBind_array() { return elemBind_array; } + /** + * Gets the bind element array. + * @return Returns a constant reference to the array of bind elements. + */ + const domBind_Array &getBind_array() const { return elemBind_array; } + /** + * Gets the bind_vertex_input element array. + * @return Returns a reference to the array of bind_vertex_input elements. + */ + domBind_vertex_input_Array &getBind_vertex_input_array() { return elemBind_vertex_input_array; } + /** + * Gets the bind_vertex_input element array. + * @return Returns a constant reference to the array of bind_vertex_input elements. + */ + const domBind_vertex_input_Array &getBind_vertex_input_array() const { return elemBind_vertex_input_array; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } +protected: + /** + * Constructor + */ + domInstance_material() : attrSymbol(), attrTarget(), attrSid(), attrName(), elemBind_array(), elemBind_vertex_input_array(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domInstance_material() {} + /** + * Copy Constructor + */ + domInstance_material( const domInstance_material &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domInstance_material &operator=( const domInstance_material &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domInstance_node.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domInstance_node.h new file mode 100644 index 00000000..cd1ea2b1 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domInstance_node.h @@ -0,0 +1,70 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domInstance_node_h__ +#define __domInstance_node_h__ + +#include +#include + +#include + +/** + * The instance_node element declares the instantiation of a COLLADA node + * resource. + */ +class domInstance_node : public daeElement, public domInstanceWithExtra_complexType +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::INSTANCE_NODE; } + +protected: + /** + * Constructor + */ + domInstance_node() {} + /** + * Destructor + */ + virtual ~domInstance_node() {} + /** + * Copy Constructor + */ + domInstance_node( const domInstance_node &cpy ) : daeElement(), domInstanceWithExtra_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domInstance_node &operator=( const domInstance_node &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domInstance_physics_material.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domInstance_physics_material.h new file mode 100644 index 00000000..8e086c78 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domInstance_physics_material.h @@ -0,0 +1,70 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domInstance_physics_material_h__ +#define __domInstance_physics_material_h__ + +#include +#include + +#include + +/** + * The instance_physics_material element declares the instantiation of a COLLADA + * physics_material resource. + */ +class domInstance_physics_material : public daeElement, public domInstanceWithExtra_complexType +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::INSTANCE_PHYSICS_MATERIAL; } + +protected: + /** + * Constructor + */ + domInstance_physics_material() {} + /** + * Destructor + */ + virtual ~domInstance_physics_material() {} + /** + * Copy Constructor + */ + domInstance_physics_material( const domInstance_physics_material &cpy ) : daeElement(), domInstanceWithExtra_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domInstance_physics_material &operator=( const domInstance_physics_material &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domInstance_physics_model.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domInstance_physics_model.h new file mode 100644 index 00000000..81a1c8b0 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domInstance_physics_model.h @@ -0,0 +1,218 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domInstance_physics_model_h__ +#define __domInstance_physics_model_h__ + +#include +#include + +#include +#include +#include +#include + +/** + * This element allows instancing physics model within another physics model, + * or in a physics scene. + */ +class domInstance_physics_model : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::INSTANCE_PHYSICS_MODEL; } +protected: // Attributes +/** + * The url attribute refers to resource. This may refer to a local resource + * using a relative URL fragment identifier that begins with the “#†+ * character. The url attribute may refer to an external resource using an + * absolute or relative URL. + */ + xsAnyURI attrUrl; +/** + * The sid attribute is a text string value containing the sub-identifier + * of this element. This value must be unique within the scope of the parent + * element. Optional attribute. + */ + xsNCName attrSid; +/** + * The name attribute is the text string name of this element. Optional attribute. + */ + xsNCName attrName; +/** + * The parent attribute points to the id of a node in the visual scene. This + * allows a physics model to be instantiated under a specific transform node, + * which will dictate the initial position and orientation, and could be + * animated to influence kinematic rigid bodies. + */ + xsAnyURI attrParent; + +protected: // Elements +/** + * The instance_physics_model element may instance any number of force_field + * elements. @see domInstance_force_field + */ + domInstance_force_field_Array elemInstance_force_field_array; +/** + * The instance_physics_model element may instance any number of rigid_body + * elements. @see domInstance_rigid_body + */ + domInstance_rigid_body_Array elemInstance_rigid_body_array; +/** + * The instance_physics_model element may instance any number of rigid_constraint + * elements. @see domInstance_rigid_constraint + */ + domInstance_rigid_constraint_Array elemInstance_rigid_constraint_array; +/** + * The extra element may appear any number of times. @see domExtra + */ + domExtra_Array elemExtra_array; + +public: //Accessors and Mutators + /** + * Gets the url attribute. + * @return Returns a xsAnyURI reference of the url attribute. + */ + xsAnyURI &getUrl() { return attrUrl; } + /** + * Gets the url attribute. + * @return Returns a constant xsAnyURI reference of the url attribute. + */ + const xsAnyURI &getUrl() const { return attrUrl; } + /** + * Sets the url attribute. + * @param atUrl The new value for the url attribute. + */ + void setUrl( const xsAnyURI &atUrl ) { attrUrl = atUrl; + _validAttributeArray[0] = true; } + + /** + * Gets the sid attribute. + * @return Returns a xsNCName of the sid attribute. + */ + xsNCName getSid() const { return attrSid; } + /** + * Sets the sid attribute. + * @param atSid The new value for the sid attribute. + */ + void setSid( xsNCName atSid ) { *(daeStringRef*)&attrSid = atSid; + _validAttributeArray[1] = true; } + + /** + * Gets the name attribute. + * @return Returns a xsNCName of the name attribute. + */ + xsNCName getName() const { return attrName; } + /** + * Sets the name attribute. + * @param atName The new value for the name attribute. + */ + void setName( xsNCName atName ) { *(daeStringRef*)&attrName = atName; + _validAttributeArray[2] = true; } + + /** + * Gets the parent attribute. + * @return Returns a xsAnyURI reference of the parent attribute. + */ + xsAnyURI &getParent() { return attrParent; } + /** + * Gets the parent attribute. + * @return Returns a constant xsAnyURI reference of the parent attribute. + */ + const xsAnyURI &getParent() const { return attrParent; } + /** + * Sets the parent attribute. + * @param atParent The new value for the parent attribute. + */ + void setParent( const xsAnyURI &atParent ) { attrParent = atParent; + _validAttributeArray[3] = true; } + + /** + * Gets the instance_force_field element array. + * @return Returns a reference to the array of instance_force_field elements. + */ + domInstance_force_field_Array &getInstance_force_field_array() { return elemInstance_force_field_array; } + /** + * Gets the instance_force_field element array. + * @return Returns a constant reference to the array of instance_force_field elements. + */ + const domInstance_force_field_Array &getInstance_force_field_array() const { return elemInstance_force_field_array; } + /** + * Gets the instance_rigid_body element array. + * @return Returns a reference to the array of instance_rigid_body elements. + */ + domInstance_rigid_body_Array &getInstance_rigid_body_array() { return elemInstance_rigid_body_array; } + /** + * Gets the instance_rigid_body element array. + * @return Returns a constant reference to the array of instance_rigid_body elements. + */ + const domInstance_rigid_body_Array &getInstance_rigid_body_array() const { return elemInstance_rigid_body_array; } + /** + * Gets the instance_rigid_constraint element array. + * @return Returns a reference to the array of instance_rigid_constraint elements. + */ + domInstance_rigid_constraint_Array &getInstance_rigid_constraint_array() { return elemInstance_rigid_constraint_array; } + /** + * Gets the instance_rigid_constraint element array. + * @return Returns a constant reference to the array of instance_rigid_constraint elements. + */ + const domInstance_rigid_constraint_Array &getInstance_rigid_constraint_array() const { return elemInstance_rigid_constraint_array; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } +protected: + /** + * Constructor + */ + domInstance_physics_model() : attrUrl(), attrSid(), attrName(), attrParent(), elemInstance_force_field_array(), elemInstance_rigid_body_array(), elemInstance_rigid_constraint_array(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domInstance_physics_model() {} + /** + * Copy Constructor + */ + domInstance_physics_model( const domInstance_physics_model &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domInstance_physics_model &operator=( const domInstance_physics_model &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domInstance_rigid_body.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domInstance_rigid_body.h new file mode 100644 index 00000000..9ed15e8c --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domInstance_rigid_body.h @@ -0,0 +1,954 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domInstance_rigid_body_h__ +#define __domInstance_rigid_body_h__ + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/** + * This element allows instancing a rigid_body within an instance_physics_model. + */ +class domInstance_rigid_body : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::INSTANCE_RIGID_BODY; } +public: + class domTechnique_common; + + typedef daeSmartRef domTechnique_commonRef; + typedef daeTArray domTechnique_common_Array; + +/** + * The technique_common element specifies the instance_rigid_body information + * for the common profile which all COLLADA implementations need to support. + */ + class domTechnique_common : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::TECHNIQUE_COMMON; } + public: + class domAngular_velocity; + + typedef daeSmartRef domAngular_velocityRef; + typedef daeTArray domAngular_velocity_Array; + +/** + * Specifies the initial angular velocity of the rigid_body instance in degrees + * per second around each axis, in the form of an X-Y-Z Euler rotation. + */ + class domAngular_velocity : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::ANGULAR_VELOCITY; } + + protected: // Value + /** + * The domFloat3 value of the text data of this element. + */ + domFloat3 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domFloat3 reference of the _value array. + */ + domFloat3 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domFloat3 reference of the _value array. + */ + const domFloat3 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domFloat3 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domAngular_velocity() : _value() {} + /** + * Destructor + */ + virtual ~domAngular_velocity() {} + /** + * Copy Constructor + */ + domAngular_velocity( const domAngular_velocity &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domAngular_velocity &operator=( const domAngular_velocity &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domVelocity; + + typedef daeSmartRef domVelocityRef; + typedef daeTArray domVelocity_Array; + +/** + * Specifies the initial linear velocity of the rigid_body instance. + */ + class domVelocity : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::VELOCITY; } + + protected: // Value + /** + * The domFloat3 value of the text data of this element. + */ + domFloat3 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domFloat3 reference of the _value array. + */ + domFloat3 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domFloat3 reference of the _value array. + */ + const domFloat3 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domFloat3 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domVelocity() : _value() {} + /** + * Destructor + */ + virtual ~domVelocity() {} + /** + * Copy Constructor + */ + domVelocity( const domVelocity &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domVelocity &operator=( const domVelocity &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domDynamic; + + typedef daeSmartRef domDynamicRef; + typedef daeTArray domDynamic_Array; + + class domDynamic : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::DYNAMIC; } + protected: // Attribute +/** + * The sid attribute is a text string value containing the sub-identifier + * of this element. This value must be unique within the scope of the parent + * element. Optional attribute. + */ + xsNCName attrSid; + + protected: // Value + /** + * The domBool value of the text data of this element. + */ + domBool _value; + + public: //Accessors and Mutators + /** + * Gets the sid attribute. + * @return Returns a xsNCName of the sid attribute. + */ + xsNCName getSid() const { return attrSid; } + /** + * Sets the sid attribute. + * @param atSid The new value for the sid attribute. + */ + void setSid( xsNCName atSid ) { *(daeStringRef*)&attrSid = atSid; + _validAttributeArray[0] = true; } + + /** + * Gets the value of this element. + * @return a domBool of the value. + */ + domBool getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( domBool val ) { _value = val; } + + protected: + /** + * Constructor + */ + domDynamic() : attrSid(), _value() {} + /** + * Destructor + */ + virtual ~domDynamic() {} + /** + * Copy Constructor + */ + domDynamic( const domDynamic &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domDynamic &operator=( const domDynamic &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domMass_frame; + + typedef daeSmartRef domMass_frameRef; + typedef daeTArray domMass_frame_Array; + + class domMass_frame : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::MASS_FRAME; } + + protected: // Elements + domTranslate_Array elemTranslate_array; + domRotate_Array elemRotate_array; + /** + * Used to preserve order in elements that do not specify strict sequencing of sub-elements. + */ + daeElementRefArray _contents; + /** + * Used to preserve order in elements that have a complex content model. + */ + daeUIntArray _contentsOrder; + + + public: //Accessors and Mutators + /** + * Gets the translate element array. + * @return Returns a reference to the array of translate elements. + */ + domTranslate_Array &getTranslate_array() { return elemTranslate_array; } + /** + * Gets the translate element array. + * @return Returns a constant reference to the array of translate elements. + */ + const domTranslate_Array &getTranslate_array() const { return elemTranslate_array; } + /** + * Gets the rotate element array. + * @return Returns a reference to the array of rotate elements. + */ + domRotate_Array &getRotate_array() { return elemRotate_array; } + /** + * Gets the rotate element array. + * @return Returns a constant reference to the array of rotate elements. + */ + const domRotate_Array &getRotate_array() const { return elemRotate_array; } + /** + * Gets the _contents array. + * @return Returns a reference to the _contents element array. + */ + daeElementRefArray &getContents() { return _contents; } + /** + * Gets the _contents array. + * @return Returns a constant reference to the _contents element array. + */ + const daeElementRefArray &getContents() const { return _contents; } + + protected: + /** + * Constructor + */ + domMass_frame() : elemTranslate_array(), elemRotate_array() {} + /** + * Destructor + */ + virtual ~domMass_frame() {} + /** + * Copy Constructor + */ + domMass_frame( const domMass_frame &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domMass_frame &operator=( const domMass_frame &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domShape; + + typedef daeSmartRef domShapeRef; + typedef daeTArray domShape_Array; + + class domShape : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::SHAPE; } + public: + class domHollow; + + typedef daeSmartRef domHollowRef; + typedef daeTArray domHollow_Array; + + class domHollow : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::HOLLOW; } + protected: // Attribute +/** + * The sid attribute is a text string value containing the sub-identifier + * of this element. This value must be unique within the scope of the parent + * element. Optional attribute. + */ + xsNCName attrSid; + + protected: // Value + /** + * The domBool value of the text data of this element. + */ + domBool _value; + + public: //Accessors and Mutators + /** + * Gets the sid attribute. + * @return Returns a xsNCName of the sid attribute. + */ + xsNCName getSid() const { return attrSid; } + /** + * Sets the sid attribute. + * @param atSid The new value for the sid attribute. + */ + void setSid( xsNCName atSid ) { *(daeStringRef*)&attrSid = atSid; + _validAttributeArray[0] = true; } + + /** + * Gets the value of this element. + * @return a domBool of the value. + */ + domBool getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( domBool val ) { _value = val; } + + protected: + /** + * Constructor + */ + domHollow() : attrSid(), _value() {} + /** + * Destructor + */ + virtual ~domHollow() {} + /** + * Copy Constructor + */ + domHollow( const domHollow &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domHollow &operator=( const domHollow &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + + + protected: // Elements + domHollowRef elemHollow; + domTargetableFloatRef elemMass; + domTargetableFloatRef elemDensity; + domInstance_physics_materialRef elemInstance_physics_material; + domPhysics_materialRef elemPhysics_material; + domInstance_geometryRef elemInstance_geometry; + domPlaneRef elemPlane; + domBoxRef elemBox; + domSphereRef elemSphere; + domCylinderRef elemCylinder; + domTapered_cylinderRef elemTapered_cylinder; + domCapsuleRef elemCapsule; + domTapered_capsuleRef elemTapered_capsule; + domTranslate_Array elemTranslate_array; + domRotate_Array elemRotate_array; +/** + * The extra element may appear any number of times. @see domExtra + */ + domExtra_Array elemExtra_array; + /** + * Used to preserve order in elements that do not specify strict sequencing of sub-elements. + */ + daeElementRefArray _contents; + /** + * Used to preserve order in elements that have a complex content model. + */ + daeUIntArray _contentsOrder; + + + public: //Accessors and Mutators + /** + * Gets the hollow element. + * @return a daeSmartRef to the hollow element. + */ + const domHollowRef getHollow() const { return elemHollow; } + /** + * Gets the mass element. + * @return a daeSmartRef to the mass element. + */ + const domTargetableFloatRef getMass() const { return elemMass; } + /** + * Gets the density element. + * @return a daeSmartRef to the density element. + */ + const domTargetableFloatRef getDensity() const { return elemDensity; } + /** + * Gets the instance_physics_material element. + * @return a daeSmartRef to the instance_physics_material element. + */ + const domInstance_physics_materialRef getInstance_physics_material() const { return elemInstance_physics_material; } + /** + * Gets the physics_material element. + * @return a daeSmartRef to the physics_material element. + */ + const domPhysics_materialRef getPhysics_material() const { return elemPhysics_material; } + /** + * Gets the instance_geometry element. + * @return a daeSmartRef to the instance_geometry element. + */ + const domInstance_geometryRef getInstance_geometry() const { return elemInstance_geometry; } + /** + * Gets the plane element. + * @return a daeSmartRef to the plane element. + */ + const domPlaneRef getPlane() const { return elemPlane; } + /** + * Gets the box element. + * @return a daeSmartRef to the box element. + */ + const domBoxRef getBox() const { return elemBox; } + /** + * Gets the sphere element. + * @return a daeSmartRef to the sphere element. + */ + const domSphereRef getSphere() const { return elemSphere; } + /** + * Gets the cylinder element. + * @return a daeSmartRef to the cylinder element. + */ + const domCylinderRef getCylinder() const { return elemCylinder; } + /** + * Gets the tapered_cylinder element. + * @return a daeSmartRef to the tapered_cylinder element. + */ + const domTapered_cylinderRef getTapered_cylinder() const { return elemTapered_cylinder; } + /** + * Gets the capsule element. + * @return a daeSmartRef to the capsule element. + */ + const domCapsuleRef getCapsule() const { return elemCapsule; } + /** + * Gets the tapered_capsule element. + * @return a daeSmartRef to the tapered_capsule element. + */ + const domTapered_capsuleRef getTapered_capsule() const { return elemTapered_capsule; } + /** + * Gets the translate element array. + * @return Returns a reference to the array of translate elements. + */ + domTranslate_Array &getTranslate_array() { return elemTranslate_array; } + /** + * Gets the translate element array. + * @return Returns a constant reference to the array of translate elements. + */ + const domTranslate_Array &getTranslate_array() const { return elemTranslate_array; } + /** + * Gets the rotate element array. + * @return Returns a reference to the array of rotate elements. + */ + domRotate_Array &getRotate_array() { return elemRotate_array; } + /** + * Gets the rotate element array. + * @return Returns a constant reference to the array of rotate elements. + */ + const domRotate_Array &getRotate_array() const { return elemRotate_array; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } + /** + * Gets the _contents array. + * @return Returns a reference to the _contents element array. + */ + daeElementRefArray &getContents() { return _contents; } + /** + * Gets the _contents array. + * @return Returns a constant reference to the _contents element array. + */ + const daeElementRefArray &getContents() const { return _contents; } + + protected: + /** + * Constructor + */ + domShape() : elemHollow(), elemMass(), elemDensity(), elemInstance_physics_material(), elemPhysics_material(), elemInstance_geometry(), elemPlane(), elemBox(), elemSphere(), elemCylinder(), elemTapered_cylinder(), elemCapsule(), elemTapered_capsule(), elemTranslate_array(), elemRotate_array(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domShape() {} + /** + * Copy Constructor + */ + domShape( const domShape &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domShape &operator=( const domShape &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + + + protected: // Elements +/** + * Specifies the initial angular velocity of the rigid_body instance in degrees + * per second around each axis, in the form of an X-Y-Z Euler rotation. @see + * domAngular_velocity + */ + domAngular_velocityRef elemAngular_velocity; +/** + * Specifies the initial linear velocity of the rigid_body instance. @see + * domVelocity + */ + domVelocityRef elemVelocity; + domDynamicRef elemDynamic; + domTargetableFloatRef elemMass; + domMass_frameRef elemMass_frame; + domTargetableFloat3Ref elemInertia; + domInstance_physics_materialRef elemInstance_physics_material; + domPhysics_materialRef elemPhysics_material; + domShape_Array elemShape_array; + /** + * Used to preserve order in elements that do not specify strict sequencing of sub-elements. + */ + daeElementRefArray _contents; + /** + * Used to preserve order in elements that have a complex content model. + */ + daeUIntArray _contentsOrder; + + + public: //Accessors and Mutators + /** + * Gets the angular_velocity element. + * @return a daeSmartRef to the angular_velocity element. + */ + const domAngular_velocityRef getAngular_velocity() const { return elemAngular_velocity; } + /** + * Gets the velocity element. + * @return a daeSmartRef to the velocity element. + */ + const domVelocityRef getVelocity() const { return elemVelocity; } + /** + * Gets the dynamic element. + * @return a daeSmartRef to the dynamic element. + */ + const domDynamicRef getDynamic() const { return elemDynamic; } + /** + * Gets the mass element. + * @return a daeSmartRef to the mass element. + */ + const domTargetableFloatRef getMass() const { return elemMass; } + /** + * Gets the mass_frame element. + * @return a daeSmartRef to the mass_frame element. + */ + const domMass_frameRef getMass_frame() const { return elemMass_frame; } + /** + * Gets the inertia element. + * @return a daeSmartRef to the inertia element. + */ + const domTargetableFloat3Ref getInertia() const { return elemInertia; } + /** + * Gets the instance_physics_material element. + * @return a daeSmartRef to the instance_physics_material element. + */ + const domInstance_physics_materialRef getInstance_physics_material() const { return elemInstance_physics_material; } + /** + * Gets the physics_material element. + * @return a daeSmartRef to the physics_material element. + */ + const domPhysics_materialRef getPhysics_material() const { return elemPhysics_material; } + /** + * Gets the shape element array. + * @return Returns a reference to the array of shape elements. + */ + domShape_Array &getShape_array() { return elemShape_array; } + /** + * Gets the shape element array. + * @return Returns a constant reference to the array of shape elements. + */ + const domShape_Array &getShape_array() const { return elemShape_array; } + /** + * Gets the _contents array. + * @return Returns a reference to the _contents element array. + */ + daeElementRefArray &getContents() { return _contents; } + /** + * Gets the _contents array. + * @return Returns a constant reference to the _contents element array. + */ + const daeElementRefArray &getContents() const { return _contents; } + + protected: + /** + * Constructor + */ + domTechnique_common() : elemAngular_velocity(), elemVelocity(), elemDynamic(), elemMass(), elemMass_frame(), elemInertia(), elemInstance_physics_material(), elemPhysics_material(), elemShape_array() {} + /** + * Destructor + */ + virtual ~domTechnique_common() {} + /** + * Copy Constructor + */ + domTechnique_common( const domTechnique_common &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domTechnique_common &operator=( const domTechnique_common &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + +protected: // Attributes +/** + * The body attribute indicates which rigid_body to instantiate. Required + * attribute. + */ + xsNCName attrBody; +/** + * The sid attribute is a text string value containing the sub-identifier + * of this element. This value must be unique within the scope of the parent + * element. Optional attribute. + */ + xsNCName attrSid; +/** + * The name attribute is the text string name of this element. Optional attribute. + */ + xsNCName attrName; +/** + * The target attribute indicates which node is influenced by this rigid_body + * instance. Required attribute + */ + xsAnyURI attrTarget; + +protected: // Elements +/** + * The technique_common element specifies the instance_rigid_body information + * for the common profile which all COLLADA implementations need to support. + * @see domTechnique_common + */ + domTechnique_commonRef elemTechnique_common; +/** + * This element may contain any number of non-common profile techniques. + * @see domTechnique + */ + domTechnique_Array elemTechnique_array; +/** + * The extra element may appear any number of times. @see domExtra + */ + domExtra_Array elemExtra_array; + +public: //Accessors and Mutators + /** + * Gets the body attribute. + * @return Returns a xsNCName of the body attribute. + */ + xsNCName getBody() const { return attrBody; } + /** + * Sets the body attribute. + * @param atBody The new value for the body attribute. + */ + void setBody( xsNCName atBody ) { *(daeStringRef*)&attrBody = atBody; + _validAttributeArray[0] = true; } + + /** + * Gets the sid attribute. + * @return Returns a xsNCName of the sid attribute. + */ + xsNCName getSid() const { return attrSid; } + /** + * Sets the sid attribute. + * @param atSid The new value for the sid attribute. + */ + void setSid( xsNCName atSid ) { *(daeStringRef*)&attrSid = atSid; + _validAttributeArray[1] = true; } + + /** + * Gets the name attribute. + * @return Returns a xsNCName of the name attribute. + */ + xsNCName getName() const { return attrName; } + /** + * Sets the name attribute. + * @param atName The new value for the name attribute. + */ + void setName( xsNCName atName ) { *(daeStringRef*)&attrName = atName; + _validAttributeArray[2] = true; } + + /** + * Gets the target attribute. + * @return Returns a xsAnyURI reference of the target attribute. + */ + xsAnyURI &getTarget() { return attrTarget; } + /** + * Gets the target attribute. + * @return Returns a constant xsAnyURI reference of the target attribute. + */ + const xsAnyURI &getTarget() const { return attrTarget; } + /** + * Sets the target attribute. + * @param atTarget The new value for the target attribute. + */ + void setTarget( const xsAnyURI &atTarget ) { attrTarget = atTarget; + _validAttributeArray[3] = true; } + + /** + * Gets the technique_common element. + * @return a daeSmartRef to the technique_common element. + */ + const domTechnique_commonRef getTechnique_common() const { return elemTechnique_common; } + /** + * Gets the technique element array. + * @return Returns a reference to the array of technique elements. + */ + domTechnique_Array &getTechnique_array() { return elemTechnique_array; } + /** + * Gets the technique element array. + * @return Returns a constant reference to the array of technique elements. + */ + const domTechnique_Array &getTechnique_array() const { return elemTechnique_array; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } +protected: + /** + * Constructor + */ + domInstance_rigid_body() : attrBody(), attrSid(), attrName(), attrTarget(), elemTechnique_common(), elemTechnique_array(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domInstance_rigid_body() {} + /** + * Copy Constructor + */ + domInstance_rigid_body( const domInstance_rigid_body &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domInstance_rigid_body &operator=( const domInstance_rigid_body &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domInstance_rigid_constraint.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domInstance_rigid_constraint.h new file mode 100644 index 00000000..2ecd5809 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domInstance_rigid_constraint.h @@ -0,0 +1,138 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domInstance_rigid_constraint_h__ +#define __domInstance_rigid_constraint_h__ + +#include +#include + +#include + +/** + * This element allows instancing a rigid_constraint within an instance_physics_model. + */ +class domInstance_rigid_constraint : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::INSTANCE_RIGID_CONSTRAINT; } +protected: // Attributes +/** + * The constraint attribute indicates which rigid_constraing to instantiate. + * Required attribute. + */ + xsNCName attrConstraint; +/** + * The sid attribute is a text string value containing the sub-identifier + * of this element. This value must be unique within the scope of the parent + * element. Optional attribute. + */ + xsNCName attrSid; +/** + * The name attribute is the text string name of this element. Optional attribute. + */ + xsNCName attrName; + +protected: // Element +/** + * The extra element may appear any number of times. @see domExtra + */ + domExtra_Array elemExtra_array; + +public: //Accessors and Mutators + /** + * Gets the constraint attribute. + * @return Returns a xsNCName of the constraint attribute. + */ + xsNCName getConstraint() const { return attrConstraint; } + /** + * Sets the constraint attribute. + * @param atConstraint The new value for the constraint attribute. + */ + void setConstraint( xsNCName atConstraint ) { *(daeStringRef*)&attrConstraint = atConstraint; + _validAttributeArray[0] = true; } + + /** + * Gets the sid attribute. + * @return Returns a xsNCName of the sid attribute. + */ + xsNCName getSid() const { return attrSid; } + /** + * Sets the sid attribute. + * @param atSid The new value for the sid attribute. + */ + void setSid( xsNCName atSid ) { *(daeStringRef*)&attrSid = atSid; + _validAttributeArray[1] = true; } + + /** + * Gets the name attribute. + * @return Returns a xsNCName of the name attribute. + */ + xsNCName getName() const { return attrName; } + /** + * Sets the name attribute. + * @param atName The new value for the name attribute. + */ + void setName( xsNCName atName ) { *(daeStringRef*)&attrName = atName; + _validAttributeArray[2] = true; } + + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } +protected: + /** + * Constructor + */ + domInstance_rigid_constraint() : attrConstraint(), attrSid(), attrName(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domInstance_rigid_constraint() {} + /** + * Copy Constructor + */ + domInstance_rigid_constraint( const domInstance_rigid_constraint &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domInstance_rigid_constraint &operator=( const domInstance_rigid_constraint &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domInt_array.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domInt_array.h new file mode 100644 index 00000000..152bdad6 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domInt_array.h @@ -0,0 +1,179 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domInt_array_h__ +#define __domInt_array_h__ + +#include +#include + + +/** + * The int_array element declares the storage for a homogenous array of integer + * values. + */ +class domInt_array : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::INT_ARRAY; } +protected: // Attributes +/** + * The id attribute is a text string containing the unique identifier of + * this element. This value must be unique within the instance document. + * Optional attribute. + */ + xsID attrId; +/** + * The name attribute is the text string name of this element. Optional attribute. + */ + xsNCName attrName; +/** + * The count attribute indicates the number of values in the array. Required + * attribute. + */ + domUint attrCount; +/** + * The minInclusive attribute indicates the smallest integer value that can + * be contained in the array. The default value is –2147483648. Optional + * attribute. + */ + xsInteger attrMinInclusive; +/** + * The maxInclusive attribute indicates the largest integer value that can + * be contained in the array. The default value is 2147483647. Optional attribute. + */ + xsInteger attrMaxInclusive; + +protected: // Value + /** + * The domListOfInts value of the text data of this element. + */ + domListOfInts _value; + +public: //Accessors and Mutators + /** + * Gets the id attribute. + * @return Returns a xsID of the id attribute. + */ + xsID getId() const { return attrId; } + /** + * Sets the id attribute. + * @param atId The new value for the id attribute. + */ + void setId( xsID atId ) { *(daeStringRef*)&attrId = atId; + _validAttributeArray[0] = true; } + + /** + * Gets the name attribute. + * @return Returns a xsNCName of the name attribute. + */ + xsNCName getName() const { return attrName; } + /** + * Sets the name attribute. + * @param atName The new value for the name attribute. + */ + void setName( xsNCName atName ) { *(daeStringRef*)&attrName = atName; + _validAttributeArray[1] = true; } + + /** + * Gets the count attribute. + * @return Returns a domUint of the count attribute. + */ + domUint getCount() const { return attrCount; } + /** + * Sets the count attribute. + * @param atCount The new value for the count attribute. + */ + void setCount( domUint atCount ) { attrCount = atCount; + _validAttributeArray[2] = true; } + + /** + * Gets the minInclusive attribute. + * @return Returns a xsInteger of the minInclusive attribute. + */ + xsInteger getMinInclusive() const { return attrMinInclusive; } + /** + * Sets the minInclusive attribute. + * @param atMinInclusive The new value for the minInclusive attribute. + */ + void setMinInclusive( xsInteger atMinInclusive ) { attrMinInclusive = atMinInclusive; + _validAttributeArray[3] = true; } + + /** + * Gets the maxInclusive attribute. + * @return Returns a xsInteger of the maxInclusive attribute. + */ + xsInteger getMaxInclusive() const { return attrMaxInclusive; } + /** + * Sets the maxInclusive attribute. + * @param atMaxInclusive The new value for the maxInclusive attribute. + */ + void setMaxInclusive( xsInteger atMaxInclusive ) { attrMaxInclusive = atMaxInclusive; + _validAttributeArray[4] = true; } + + /** + * Gets the _value array. + * @return Returns a domListOfInts reference of the _value array. + */ + domListOfInts &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domListOfInts reference of the _value array. + */ + const domListOfInts &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domListOfInts &val ) { _value = val; } + +protected: + /** + * Constructor + */ + domInt_array() : attrId(), attrName(), attrCount(), attrMinInclusive(), attrMaxInclusive(), _value() {} + /** + * Destructor + */ + virtual ~domInt_array() {} + /** + * Copy Constructor + */ + domInt_array( const domInt_array &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domInt_array &operator=( const domInt_array &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domLibrary_animation_clips.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domLibrary_animation_clips.h new file mode 100644 index 00000000..e986f67d --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domLibrary_animation_clips.h @@ -0,0 +1,148 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domLibrary_animation_clips_h__ +#define __domLibrary_animation_clips_h__ + +#include +#include + +#include +#include +#include + +/** + * The library_animation_clips element declares a module of animation_clip + * elements. + */ +class domLibrary_animation_clips : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::LIBRARY_ANIMATION_CLIPS; } +protected: // Attributes +/** + * The id attribute is a text string containing the unique identifier of + * this element. This value must be unique within the instance document. + * Optional attribute. + */ + xsID attrId; +/** + * The name attribute is the text string name of this element. Optional attribute. + */ + xsNCName attrName; + +protected: // Elements +/** + * The library_animation_clips element may contain an asset element. @see + * domAsset + */ + domAssetRef elemAsset; +/** + * There must be at least one animation_clip element. @see domAnimation_clip + */ + domAnimation_clip_Array elemAnimation_clip_array; +/** + * The extra element may appear any number of times. @see domExtra + */ + domExtra_Array elemExtra_array; + +public: //Accessors and Mutators + /** + * Gets the id attribute. + * @return Returns a xsID of the id attribute. + */ + xsID getId() const { return attrId; } + /** + * Sets the id attribute. + * @param atId The new value for the id attribute. + */ + void setId( xsID atId ) { *(daeStringRef*)&attrId = atId; + _validAttributeArray[0] = true; } + + /** + * Gets the name attribute. + * @return Returns a xsNCName of the name attribute. + */ + xsNCName getName() const { return attrName; } + /** + * Sets the name attribute. + * @param atName The new value for the name attribute. + */ + void setName( xsNCName atName ) { *(daeStringRef*)&attrName = atName; + _validAttributeArray[1] = true; } + + /** + * Gets the asset element. + * @return a daeSmartRef to the asset element. + */ + const domAssetRef getAsset() const { return elemAsset; } + /** + * Gets the animation_clip element array. + * @return Returns a reference to the array of animation_clip elements. + */ + domAnimation_clip_Array &getAnimation_clip_array() { return elemAnimation_clip_array; } + /** + * Gets the animation_clip element array. + * @return Returns a constant reference to the array of animation_clip elements. + */ + const domAnimation_clip_Array &getAnimation_clip_array() const { return elemAnimation_clip_array; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } +protected: + /** + * Constructor + */ + domLibrary_animation_clips() : attrId(), attrName(), elemAsset(), elemAnimation_clip_array(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domLibrary_animation_clips() {} + /** + * Copy Constructor + */ + domLibrary_animation_clips( const domLibrary_animation_clips &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domLibrary_animation_clips &operator=( const domLibrary_animation_clips &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domLibrary_animations.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domLibrary_animations.h new file mode 100644 index 00000000..0402b814 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domLibrary_animations.h @@ -0,0 +1,146 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domLibrary_animations_h__ +#define __domLibrary_animations_h__ + +#include +#include + +#include +#include +#include + +/** + * The library_animations element declares a module of animation elements. + */ +class domLibrary_animations : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::LIBRARY_ANIMATIONS; } +protected: // Attributes +/** + * The id attribute is a text string containing the unique identifier of + * this element. This value must be unique within the instance document. + * Optional attribute. + */ + xsID attrId; +/** + * The name attribute is the text string name of this element. Optional attribute. + */ + xsNCName attrName; + +protected: // Elements +/** + * The library_animations element may contain an asset element. @see domAsset + */ + domAssetRef elemAsset; +/** + * There must be at least one animation element. @see domAnimation + */ + domAnimation_Array elemAnimation_array; +/** + * The extra element may appear any number of times. @see domExtra + */ + domExtra_Array elemExtra_array; + +public: //Accessors and Mutators + /** + * Gets the id attribute. + * @return Returns a xsID of the id attribute. + */ + xsID getId() const { return attrId; } + /** + * Sets the id attribute. + * @param atId The new value for the id attribute. + */ + void setId( xsID atId ) { *(daeStringRef*)&attrId = atId; + _validAttributeArray[0] = true; } + + /** + * Gets the name attribute. + * @return Returns a xsNCName of the name attribute. + */ + xsNCName getName() const { return attrName; } + /** + * Sets the name attribute. + * @param atName The new value for the name attribute. + */ + void setName( xsNCName atName ) { *(daeStringRef*)&attrName = atName; + _validAttributeArray[1] = true; } + + /** + * Gets the asset element. + * @return a daeSmartRef to the asset element. + */ + const domAssetRef getAsset() const { return elemAsset; } + /** + * Gets the animation element array. + * @return Returns a reference to the array of animation elements. + */ + domAnimation_Array &getAnimation_array() { return elemAnimation_array; } + /** + * Gets the animation element array. + * @return Returns a constant reference to the array of animation elements. + */ + const domAnimation_Array &getAnimation_array() const { return elemAnimation_array; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } +protected: + /** + * Constructor + */ + domLibrary_animations() : attrId(), attrName(), elemAsset(), elemAnimation_array(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domLibrary_animations() {} + /** + * Copy Constructor + */ + domLibrary_animations( const domLibrary_animations &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domLibrary_animations &operator=( const domLibrary_animations &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domLibrary_cameras.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domLibrary_cameras.h new file mode 100644 index 00000000..28b6fc53 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domLibrary_cameras.h @@ -0,0 +1,146 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domLibrary_cameras_h__ +#define __domLibrary_cameras_h__ + +#include +#include + +#include +#include +#include + +/** + * The library_cameras element declares a module of camera elements. + */ +class domLibrary_cameras : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::LIBRARY_CAMERAS; } +protected: // Attributes +/** + * The id attribute is a text string containing the unique identifier of + * this element. This value must be unique within the instance document. + * Optional attribute. + */ + xsID attrId; +/** + * The name attribute is the text string name of this element. Optional attribute. + */ + xsNCName attrName; + +protected: // Elements +/** + * The library_cameras element may contain an asset element. @see domAsset + */ + domAssetRef elemAsset; +/** + * There must be at least one camera element. @see domCamera + */ + domCamera_Array elemCamera_array; +/** + * The extra element may appear any number of times. @see domExtra + */ + domExtra_Array elemExtra_array; + +public: //Accessors and Mutators + /** + * Gets the id attribute. + * @return Returns a xsID of the id attribute. + */ + xsID getId() const { return attrId; } + /** + * Sets the id attribute. + * @param atId The new value for the id attribute. + */ + void setId( xsID atId ) { *(daeStringRef*)&attrId = atId; + _validAttributeArray[0] = true; } + + /** + * Gets the name attribute. + * @return Returns a xsNCName of the name attribute. + */ + xsNCName getName() const { return attrName; } + /** + * Sets the name attribute. + * @param atName The new value for the name attribute. + */ + void setName( xsNCName atName ) { *(daeStringRef*)&attrName = atName; + _validAttributeArray[1] = true; } + + /** + * Gets the asset element. + * @return a daeSmartRef to the asset element. + */ + const domAssetRef getAsset() const { return elemAsset; } + /** + * Gets the camera element array. + * @return Returns a reference to the array of camera elements. + */ + domCamera_Array &getCamera_array() { return elemCamera_array; } + /** + * Gets the camera element array. + * @return Returns a constant reference to the array of camera elements. + */ + const domCamera_Array &getCamera_array() const { return elemCamera_array; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } +protected: + /** + * Constructor + */ + domLibrary_cameras() : attrId(), attrName(), elemAsset(), elemCamera_array(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domLibrary_cameras() {} + /** + * Copy Constructor + */ + domLibrary_cameras( const domLibrary_cameras &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domLibrary_cameras &operator=( const domLibrary_cameras &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domLibrary_controllers.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domLibrary_controllers.h new file mode 100644 index 00000000..c5e1d0e2 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domLibrary_controllers.h @@ -0,0 +1,146 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domLibrary_controllers_h__ +#define __domLibrary_controllers_h__ + +#include +#include + +#include +#include +#include + +/** + * The library_controllers element declares a module of controller elements. + */ +class domLibrary_controllers : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::LIBRARY_CONTROLLERS; } +protected: // Attributes +/** + * The id attribute is a text string containing the unique identifier of + * this element. This value must be unique within the instance document. + * Optional attribute. + */ + xsID attrId; +/** + * The name attribute is the text string name of this element. Optional attribute. + */ + xsNCName attrName; + +protected: // Elements +/** + * The library_controllers element may contain an asset element. @see domAsset + */ + domAssetRef elemAsset; +/** + * There must be at least one controller element. @see domController + */ + domController_Array elemController_array; +/** + * The extra element may appear any number of times. @see domExtra + */ + domExtra_Array elemExtra_array; + +public: //Accessors and Mutators + /** + * Gets the id attribute. + * @return Returns a xsID of the id attribute. + */ + xsID getId() const { return attrId; } + /** + * Sets the id attribute. + * @param atId The new value for the id attribute. + */ + void setId( xsID atId ) { *(daeStringRef*)&attrId = atId; + _validAttributeArray[0] = true; } + + /** + * Gets the name attribute. + * @return Returns a xsNCName of the name attribute. + */ + xsNCName getName() const { return attrName; } + /** + * Sets the name attribute. + * @param atName The new value for the name attribute. + */ + void setName( xsNCName atName ) { *(daeStringRef*)&attrName = atName; + _validAttributeArray[1] = true; } + + /** + * Gets the asset element. + * @return a daeSmartRef to the asset element. + */ + const domAssetRef getAsset() const { return elemAsset; } + /** + * Gets the controller element array. + * @return Returns a reference to the array of controller elements. + */ + domController_Array &getController_array() { return elemController_array; } + /** + * Gets the controller element array. + * @return Returns a constant reference to the array of controller elements. + */ + const domController_Array &getController_array() const { return elemController_array; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } +protected: + /** + * Constructor + */ + domLibrary_controllers() : attrId(), attrName(), elemAsset(), elemController_array(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domLibrary_controllers() {} + /** + * Copy Constructor + */ + domLibrary_controllers( const domLibrary_controllers &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domLibrary_controllers &operator=( const domLibrary_controllers &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domLibrary_effects.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domLibrary_effects.h new file mode 100644 index 00000000..cbe42d0c --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domLibrary_effects.h @@ -0,0 +1,146 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domLibrary_effects_h__ +#define __domLibrary_effects_h__ + +#include +#include + +#include +#include +#include + +/** + * The library_effects element declares a module of effect elements. + */ +class domLibrary_effects : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::LIBRARY_EFFECTS; } +protected: // Attributes +/** + * The id attribute is a text string containing the unique identifier of + * this element. This value must be unique within the instance document. + * Optional attribute. + */ + xsID attrId; +/** + * The name attribute is the text string name of this element. Optional attribute. + */ + xsNCName attrName; + +protected: // Elements +/** + * The library_effects element may contain an asset element. @see domAsset + */ + domAssetRef elemAsset; +/** + * There must be at least one effect element. @see domEffect + */ + domEffect_Array elemEffect_array; +/** + * The extra element may appear any number of times. @see domExtra + */ + domExtra_Array elemExtra_array; + +public: //Accessors and Mutators + /** + * Gets the id attribute. + * @return Returns a xsID of the id attribute. + */ + xsID getId() const { return attrId; } + /** + * Sets the id attribute. + * @param atId The new value for the id attribute. + */ + void setId( xsID atId ) { *(daeStringRef*)&attrId = atId; + _validAttributeArray[0] = true; } + + /** + * Gets the name attribute. + * @return Returns a xsNCName of the name attribute. + */ + xsNCName getName() const { return attrName; } + /** + * Sets the name attribute. + * @param atName The new value for the name attribute. + */ + void setName( xsNCName atName ) { *(daeStringRef*)&attrName = atName; + _validAttributeArray[1] = true; } + + /** + * Gets the asset element. + * @return a daeSmartRef to the asset element. + */ + const domAssetRef getAsset() const { return elemAsset; } + /** + * Gets the effect element array. + * @return Returns a reference to the array of effect elements. + */ + domEffect_Array &getEffect_array() { return elemEffect_array; } + /** + * Gets the effect element array. + * @return Returns a constant reference to the array of effect elements. + */ + const domEffect_Array &getEffect_array() const { return elemEffect_array; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } +protected: + /** + * Constructor + */ + domLibrary_effects() : attrId(), attrName(), elemAsset(), elemEffect_array(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domLibrary_effects() {} + /** + * Copy Constructor + */ + domLibrary_effects( const domLibrary_effects &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domLibrary_effects &operator=( const domLibrary_effects &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domLibrary_force_fields.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domLibrary_force_fields.h new file mode 100644 index 00000000..c1db0250 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domLibrary_force_fields.h @@ -0,0 +1,146 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domLibrary_force_fields_h__ +#define __domLibrary_force_fields_h__ + +#include +#include + +#include +#include +#include + +/** + * The library_force_fields element declares a module of force_field elements. + */ +class domLibrary_force_fields : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::LIBRARY_FORCE_FIELDS; } +protected: // Attributes +/** + * The id attribute is a text string containing the unique identifier of + * this element. This value must be unique within the instance document. + * Optional attribute. + */ + xsID attrId; +/** + * The name attribute is the text string name of this element. Optional attribute. + */ + xsNCName attrName; + +protected: // Elements +/** + * The library_force_fields element may contain an asset element. @see domAsset + */ + domAssetRef elemAsset; +/** + * There must be at least one force_field element. @see domForce_field + */ + domForce_field_Array elemForce_field_array; +/** + * The extra element may appear any number of times. @see domExtra + */ + domExtra_Array elemExtra_array; + +public: //Accessors and Mutators + /** + * Gets the id attribute. + * @return Returns a xsID of the id attribute. + */ + xsID getId() const { return attrId; } + /** + * Sets the id attribute. + * @param atId The new value for the id attribute. + */ + void setId( xsID atId ) { *(daeStringRef*)&attrId = atId; + _validAttributeArray[0] = true; } + + /** + * Gets the name attribute. + * @return Returns a xsNCName of the name attribute. + */ + xsNCName getName() const { return attrName; } + /** + * Sets the name attribute. + * @param atName The new value for the name attribute. + */ + void setName( xsNCName atName ) { *(daeStringRef*)&attrName = atName; + _validAttributeArray[1] = true; } + + /** + * Gets the asset element. + * @return a daeSmartRef to the asset element. + */ + const domAssetRef getAsset() const { return elemAsset; } + /** + * Gets the force_field element array. + * @return Returns a reference to the array of force_field elements. + */ + domForce_field_Array &getForce_field_array() { return elemForce_field_array; } + /** + * Gets the force_field element array. + * @return Returns a constant reference to the array of force_field elements. + */ + const domForce_field_Array &getForce_field_array() const { return elemForce_field_array; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } +protected: + /** + * Constructor + */ + domLibrary_force_fields() : attrId(), attrName(), elemAsset(), elemForce_field_array(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domLibrary_force_fields() {} + /** + * Copy Constructor + */ + domLibrary_force_fields( const domLibrary_force_fields &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domLibrary_force_fields &operator=( const domLibrary_force_fields &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domLibrary_geometries.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domLibrary_geometries.h new file mode 100644 index 00000000..81deadd2 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domLibrary_geometries.h @@ -0,0 +1,146 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domLibrary_geometries_h__ +#define __domLibrary_geometries_h__ + +#include +#include + +#include +#include +#include + +/** + * The library_geometries element declares a module of geometry elements. + */ +class domLibrary_geometries : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::LIBRARY_GEOMETRIES; } +protected: // Attributes +/** + * The id attribute is a text string containing the unique identifier of + * this element. This value must be unique within the instance document. + * Optional attribute. + */ + xsID attrId; +/** + * The name attribute is the text string name of this element. Optional attribute. + */ + xsNCName attrName; + +protected: // Elements +/** + * The library_geometries element may contain an asset element. @see domAsset + */ + domAssetRef elemAsset; +/** + * There must be at least one geometry element. @see domGeometry + */ + domGeometry_Array elemGeometry_array; +/** + * The extra element may appear any number of times. @see domExtra + */ + domExtra_Array elemExtra_array; + +public: //Accessors and Mutators + /** + * Gets the id attribute. + * @return Returns a xsID of the id attribute. + */ + xsID getId() const { return attrId; } + /** + * Sets the id attribute. + * @param atId The new value for the id attribute. + */ + void setId( xsID atId ) { *(daeStringRef*)&attrId = atId; + _validAttributeArray[0] = true; } + + /** + * Gets the name attribute. + * @return Returns a xsNCName of the name attribute. + */ + xsNCName getName() const { return attrName; } + /** + * Sets the name attribute. + * @param atName The new value for the name attribute. + */ + void setName( xsNCName atName ) { *(daeStringRef*)&attrName = atName; + _validAttributeArray[1] = true; } + + /** + * Gets the asset element. + * @return a daeSmartRef to the asset element. + */ + const domAssetRef getAsset() const { return elemAsset; } + /** + * Gets the geometry element array. + * @return Returns a reference to the array of geometry elements. + */ + domGeometry_Array &getGeometry_array() { return elemGeometry_array; } + /** + * Gets the geometry element array. + * @return Returns a constant reference to the array of geometry elements. + */ + const domGeometry_Array &getGeometry_array() const { return elemGeometry_array; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } +protected: + /** + * Constructor + */ + domLibrary_geometries() : attrId(), attrName(), elemAsset(), elemGeometry_array(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domLibrary_geometries() {} + /** + * Copy Constructor + */ + domLibrary_geometries( const domLibrary_geometries &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domLibrary_geometries &operator=( const domLibrary_geometries &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domLibrary_images.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domLibrary_images.h new file mode 100644 index 00000000..138ff001 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domLibrary_images.h @@ -0,0 +1,146 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domLibrary_images_h__ +#define __domLibrary_images_h__ + +#include +#include + +#include +#include +#include + +/** + * The library_images element declares a module of image elements. + */ +class domLibrary_images : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::LIBRARY_IMAGES; } +protected: // Attributes +/** + * The id attribute is a text string containing the unique identifier of + * this element. This value must be unique within the instance document. + * Optional attribute. + */ + xsID attrId; +/** + * The name attribute is the text string name of this element. Optional attribute. + */ + xsNCName attrName; + +protected: // Elements +/** + * The library_images element may contain an asset element. @see domAsset + */ + domAssetRef elemAsset; +/** + * There must be at least one image element. @see domImage + */ + domImage_Array elemImage_array; +/** + * The extra element may appear any number of times. @see domExtra + */ + domExtra_Array elemExtra_array; + +public: //Accessors and Mutators + /** + * Gets the id attribute. + * @return Returns a xsID of the id attribute. + */ + xsID getId() const { return attrId; } + /** + * Sets the id attribute. + * @param atId The new value for the id attribute. + */ + void setId( xsID atId ) { *(daeStringRef*)&attrId = atId; + _validAttributeArray[0] = true; } + + /** + * Gets the name attribute. + * @return Returns a xsNCName of the name attribute. + */ + xsNCName getName() const { return attrName; } + /** + * Sets the name attribute. + * @param atName The new value for the name attribute. + */ + void setName( xsNCName atName ) { *(daeStringRef*)&attrName = atName; + _validAttributeArray[1] = true; } + + /** + * Gets the asset element. + * @return a daeSmartRef to the asset element. + */ + const domAssetRef getAsset() const { return elemAsset; } + /** + * Gets the image element array. + * @return Returns a reference to the array of image elements. + */ + domImage_Array &getImage_array() { return elemImage_array; } + /** + * Gets the image element array. + * @return Returns a constant reference to the array of image elements. + */ + const domImage_Array &getImage_array() const { return elemImage_array; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } +protected: + /** + * Constructor + */ + domLibrary_images() : attrId(), attrName(), elemAsset(), elemImage_array(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domLibrary_images() {} + /** + * Copy Constructor + */ + domLibrary_images( const domLibrary_images &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domLibrary_images &operator=( const domLibrary_images &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domLibrary_lights.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domLibrary_lights.h new file mode 100644 index 00000000..c97610d6 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domLibrary_lights.h @@ -0,0 +1,146 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domLibrary_lights_h__ +#define __domLibrary_lights_h__ + +#include +#include + +#include +#include +#include + +/** + * The library_lights element declares a module of light elements. + */ +class domLibrary_lights : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::LIBRARY_LIGHTS; } +protected: // Attributes +/** + * The id attribute is a text string containing the unique identifier of + * this element. This value must be unique within the instance document. + * Optional attribute. + */ + xsID attrId; +/** + * The name attribute is the text string name of this element. Optional attribute. + */ + xsNCName attrName; + +protected: // Elements +/** + * The library_lights element may contain an asset element. @see domAsset + */ + domAssetRef elemAsset; +/** + * There must be at least one light element. @see domLight + */ + domLight_Array elemLight_array; +/** + * The extra element may appear any number of times. @see domExtra + */ + domExtra_Array elemExtra_array; + +public: //Accessors and Mutators + /** + * Gets the id attribute. + * @return Returns a xsID of the id attribute. + */ + xsID getId() const { return attrId; } + /** + * Sets the id attribute. + * @param atId The new value for the id attribute. + */ + void setId( xsID atId ) { *(daeStringRef*)&attrId = atId; + _validAttributeArray[0] = true; } + + /** + * Gets the name attribute. + * @return Returns a xsNCName of the name attribute. + */ + xsNCName getName() const { return attrName; } + /** + * Sets the name attribute. + * @param atName The new value for the name attribute. + */ + void setName( xsNCName atName ) { *(daeStringRef*)&attrName = atName; + _validAttributeArray[1] = true; } + + /** + * Gets the asset element. + * @return a daeSmartRef to the asset element. + */ + const domAssetRef getAsset() const { return elemAsset; } + /** + * Gets the light element array. + * @return Returns a reference to the array of light elements. + */ + domLight_Array &getLight_array() { return elemLight_array; } + /** + * Gets the light element array. + * @return Returns a constant reference to the array of light elements. + */ + const domLight_Array &getLight_array() const { return elemLight_array; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } +protected: + /** + * Constructor + */ + domLibrary_lights() : attrId(), attrName(), elemAsset(), elemLight_array(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domLibrary_lights() {} + /** + * Copy Constructor + */ + domLibrary_lights( const domLibrary_lights &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domLibrary_lights &operator=( const domLibrary_lights &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domLibrary_materials.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domLibrary_materials.h new file mode 100644 index 00000000..792c39a6 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domLibrary_materials.h @@ -0,0 +1,146 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domLibrary_materials_h__ +#define __domLibrary_materials_h__ + +#include +#include + +#include +#include +#include + +/** + * The library_materials element declares a module of material elements. + */ +class domLibrary_materials : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::LIBRARY_MATERIALS; } +protected: // Attributes +/** + * The id attribute is a text string containing the unique identifier of + * this element. This value must be unique within the instance document. + * Optional attribute. + */ + xsID attrId; +/** + * The name attribute is the text string name of this element. Optional attribute. + */ + xsNCName attrName; + +protected: // Elements +/** + * The library_materials element may contain an asset element. @see domAsset + */ + domAssetRef elemAsset; +/** + * There must be at least one material element. @see domMaterial + */ + domMaterial_Array elemMaterial_array; +/** + * The extra element may appear any number of times. @see domExtra + */ + domExtra_Array elemExtra_array; + +public: //Accessors and Mutators + /** + * Gets the id attribute. + * @return Returns a xsID of the id attribute. + */ + xsID getId() const { return attrId; } + /** + * Sets the id attribute. + * @param atId The new value for the id attribute. + */ + void setId( xsID atId ) { *(daeStringRef*)&attrId = atId; + _validAttributeArray[0] = true; } + + /** + * Gets the name attribute. + * @return Returns a xsNCName of the name attribute. + */ + xsNCName getName() const { return attrName; } + /** + * Sets the name attribute. + * @param atName The new value for the name attribute. + */ + void setName( xsNCName atName ) { *(daeStringRef*)&attrName = atName; + _validAttributeArray[1] = true; } + + /** + * Gets the asset element. + * @return a daeSmartRef to the asset element. + */ + const domAssetRef getAsset() const { return elemAsset; } + /** + * Gets the material element array. + * @return Returns a reference to the array of material elements. + */ + domMaterial_Array &getMaterial_array() { return elemMaterial_array; } + /** + * Gets the material element array. + * @return Returns a constant reference to the array of material elements. + */ + const domMaterial_Array &getMaterial_array() const { return elemMaterial_array; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } +protected: + /** + * Constructor + */ + domLibrary_materials() : attrId(), attrName(), elemAsset(), elemMaterial_array(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domLibrary_materials() {} + /** + * Copy Constructor + */ + domLibrary_materials( const domLibrary_materials &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domLibrary_materials &operator=( const domLibrary_materials &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domLibrary_nodes.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domLibrary_nodes.h new file mode 100644 index 00000000..ed8ea77b --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domLibrary_nodes.h @@ -0,0 +1,146 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domLibrary_nodes_h__ +#define __domLibrary_nodes_h__ + +#include +#include + +#include +#include +#include + +/** + * The library_nodes element declares a module of node elements. + */ +class domLibrary_nodes : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::LIBRARY_NODES; } +protected: // Attributes +/** + * The id attribute is a text string containing the unique identifier of + * this element. This value must be unique within the instance document. + * Optional attribute. + */ + xsID attrId; +/** + * The name attribute is the text string name of this element. Optional attribute. + */ + xsNCName attrName; + +protected: // Elements +/** + * The library_nodes element may contain an asset element. @see domAsset + */ + domAssetRef elemAsset; +/** + * There must be at least one node element. @see domNode + */ + domNode_Array elemNode_array; +/** + * The extra element may appear any number of times. @see domExtra + */ + domExtra_Array elemExtra_array; + +public: //Accessors and Mutators + /** + * Gets the id attribute. + * @return Returns a xsID of the id attribute. + */ + xsID getId() const { return attrId; } + /** + * Sets the id attribute. + * @param atId The new value for the id attribute. + */ + void setId( xsID atId ) { *(daeStringRef*)&attrId = atId; + _validAttributeArray[0] = true; } + + /** + * Gets the name attribute. + * @return Returns a xsNCName of the name attribute. + */ + xsNCName getName() const { return attrName; } + /** + * Sets the name attribute. + * @param atName The new value for the name attribute. + */ + void setName( xsNCName atName ) { *(daeStringRef*)&attrName = atName; + _validAttributeArray[1] = true; } + + /** + * Gets the asset element. + * @return a daeSmartRef to the asset element. + */ + const domAssetRef getAsset() const { return elemAsset; } + /** + * Gets the node element array. + * @return Returns a reference to the array of node elements. + */ + domNode_Array &getNode_array() { return elemNode_array; } + /** + * Gets the node element array. + * @return Returns a constant reference to the array of node elements. + */ + const domNode_Array &getNode_array() const { return elemNode_array; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } +protected: + /** + * Constructor + */ + domLibrary_nodes() : attrId(), attrName(), elemAsset(), elemNode_array(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domLibrary_nodes() {} + /** + * Copy Constructor + */ + domLibrary_nodes( const domLibrary_nodes &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domLibrary_nodes &operator=( const domLibrary_nodes &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domLibrary_physics_materials.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domLibrary_physics_materials.h new file mode 100644 index 00000000..26ed9058 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domLibrary_physics_materials.h @@ -0,0 +1,148 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domLibrary_physics_materials_h__ +#define __domLibrary_physics_materials_h__ + +#include +#include + +#include +#include +#include + +/** + * The library_physics_materials element declares a module of physics_material + * elements. + */ +class domLibrary_physics_materials : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::LIBRARY_PHYSICS_MATERIALS; } +protected: // Attributes +/** + * The id attribute is a text string containing the unique identifier of + * this element. This value must be unique within the instance document. + * Optional attribute. + */ + xsID attrId; +/** + * The name attribute is the text string name of this element. Optional attribute. + */ + xsNCName attrName; + +protected: // Elements +/** + * The library_physics_materials element may contain an asset element. @see + * domAsset + */ + domAssetRef elemAsset; +/** + * There must be at least one physics_material element. @see domPhysics_material + */ + domPhysics_material_Array elemPhysics_material_array; +/** + * The extra element may appear any number of times. @see domExtra + */ + domExtra_Array elemExtra_array; + +public: //Accessors and Mutators + /** + * Gets the id attribute. + * @return Returns a xsID of the id attribute. + */ + xsID getId() const { return attrId; } + /** + * Sets the id attribute. + * @param atId The new value for the id attribute. + */ + void setId( xsID atId ) { *(daeStringRef*)&attrId = atId; + _validAttributeArray[0] = true; } + + /** + * Gets the name attribute. + * @return Returns a xsNCName of the name attribute. + */ + xsNCName getName() const { return attrName; } + /** + * Sets the name attribute. + * @param atName The new value for the name attribute. + */ + void setName( xsNCName atName ) { *(daeStringRef*)&attrName = atName; + _validAttributeArray[1] = true; } + + /** + * Gets the asset element. + * @return a daeSmartRef to the asset element. + */ + const domAssetRef getAsset() const { return elemAsset; } + /** + * Gets the physics_material element array. + * @return Returns a reference to the array of physics_material elements. + */ + domPhysics_material_Array &getPhysics_material_array() { return elemPhysics_material_array; } + /** + * Gets the physics_material element array. + * @return Returns a constant reference to the array of physics_material elements. + */ + const domPhysics_material_Array &getPhysics_material_array() const { return elemPhysics_material_array; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } +protected: + /** + * Constructor + */ + domLibrary_physics_materials() : attrId(), attrName(), elemAsset(), elemPhysics_material_array(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domLibrary_physics_materials() {} + /** + * Copy Constructor + */ + domLibrary_physics_materials( const domLibrary_physics_materials &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domLibrary_physics_materials &operator=( const domLibrary_physics_materials &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domLibrary_physics_models.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domLibrary_physics_models.h new file mode 100644 index 00000000..6c4b27db --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domLibrary_physics_models.h @@ -0,0 +1,147 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domLibrary_physics_models_h__ +#define __domLibrary_physics_models_h__ + +#include +#include + +#include +#include +#include + +/** + * The library_physics_models element declares a module of physics_model elements. + */ +class domLibrary_physics_models : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::LIBRARY_PHYSICS_MODELS; } +protected: // Attributes +/** + * The id attribute is a text string containing the unique identifier of + * this element. This value must be unique within the instance document. + * Optional attribute. + */ + xsID attrId; +/** + * The name attribute is the text string name of this element. Optional attribute. + */ + xsNCName attrName; + +protected: // Elements +/** + * The library_physics_models element may contain an asset element. @see + * domAsset + */ + domAssetRef elemAsset; +/** + * There must be at least one physics_model element. @see domPhysics_model + */ + domPhysics_model_Array elemPhysics_model_array; +/** + * The extra element may appear any number of times. @see domExtra + */ + domExtra_Array elemExtra_array; + +public: //Accessors and Mutators + /** + * Gets the id attribute. + * @return Returns a xsID of the id attribute. + */ + xsID getId() const { return attrId; } + /** + * Sets the id attribute. + * @param atId The new value for the id attribute. + */ + void setId( xsID atId ) { *(daeStringRef*)&attrId = atId; + _validAttributeArray[0] = true; } + + /** + * Gets the name attribute. + * @return Returns a xsNCName of the name attribute. + */ + xsNCName getName() const { return attrName; } + /** + * Sets the name attribute. + * @param atName The new value for the name attribute. + */ + void setName( xsNCName atName ) { *(daeStringRef*)&attrName = atName; + _validAttributeArray[1] = true; } + + /** + * Gets the asset element. + * @return a daeSmartRef to the asset element. + */ + const domAssetRef getAsset() const { return elemAsset; } + /** + * Gets the physics_model element array. + * @return Returns a reference to the array of physics_model elements. + */ + domPhysics_model_Array &getPhysics_model_array() { return elemPhysics_model_array; } + /** + * Gets the physics_model element array. + * @return Returns a constant reference to the array of physics_model elements. + */ + const domPhysics_model_Array &getPhysics_model_array() const { return elemPhysics_model_array; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } +protected: + /** + * Constructor + */ + domLibrary_physics_models() : attrId(), attrName(), elemAsset(), elemPhysics_model_array(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domLibrary_physics_models() {} + /** + * Copy Constructor + */ + domLibrary_physics_models( const domLibrary_physics_models &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domLibrary_physics_models &operator=( const domLibrary_physics_models &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domLibrary_physics_scenes.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domLibrary_physics_scenes.h new file mode 100644 index 00000000..e3f5fa87 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domLibrary_physics_scenes.h @@ -0,0 +1,147 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domLibrary_physics_scenes_h__ +#define __domLibrary_physics_scenes_h__ + +#include +#include + +#include +#include +#include + +/** + * The library_physics_scenes element declares a module of physics_scene elements. + */ +class domLibrary_physics_scenes : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::LIBRARY_PHYSICS_SCENES; } +protected: // Attributes +/** + * The id attribute is a text string containing the unique identifier of + * this element. This value must be unique within the instance document. + * Optional attribute. + */ + xsID attrId; +/** + * The name attribute is the text string name of this element. Optional attribute. + */ + xsNCName attrName; + +protected: // Elements +/** + * The library_physics_scenes element may contain an asset element. @see + * domAsset + */ + domAssetRef elemAsset; +/** + * There must be at least one physics_scene element. @see domPhysics_scene + */ + domPhysics_scene_Array elemPhysics_scene_array; +/** + * The extra element may appear any number of times. @see domExtra + */ + domExtra_Array elemExtra_array; + +public: //Accessors and Mutators + /** + * Gets the id attribute. + * @return Returns a xsID of the id attribute. + */ + xsID getId() const { return attrId; } + /** + * Sets the id attribute. + * @param atId The new value for the id attribute. + */ + void setId( xsID atId ) { *(daeStringRef*)&attrId = atId; + _validAttributeArray[0] = true; } + + /** + * Gets the name attribute. + * @return Returns a xsNCName of the name attribute. + */ + xsNCName getName() const { return attrName; } + /** + * Sets the name attribute. + * @param atName The new value for the name attribute. + */ + void setName( xsNCName atName ) { *(daeStringRef*)&attrName = atName; + _validAttributeArray[1] = true; } + + /** + * Gets the asset element. + * @return a daeSmartRef to the asset element. + */ + const domAssetRef getAsset() const { return elemAsset; } + /** + * Gets the physics_scene element array. + * @return Returns a reference to the array of physics_scene elements. + */ + domPhysics_scene_Array &getPhysics_scene_array() { return elemPhysics_scene_array; } + /** + * Gets the physics_scene element array. + * @return Returns a constant reference to the array of physics_scene elements. + */ + const domPhysics_scene_Array &getPhysics_scene_array() const { return elemPhysics_scene_array; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } +protected: + /** + * Constructor + */ + domLibrary_physics_scenes() : attrId(), attrName(), elemAsset(), elemPhysics_scene_array(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domLibrary_physics_scenes() {} + /** + * Copy Constructor + */ + domLibrary_physics_scenes( const domLibrary_physics_scenes &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domLibrary_physics_scenes &operator=( const domLibrary_physics_scenes &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domLibrary_visual_scenes.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domLibrary_visual_scenes.h new file mode 100644 index 00000000..007e6533 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domLibrary_visual_scenes.h @@ -0,0 +1,147 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domLibrary_visual_scenes_h__ +#define __domLibrary_visual_scenes_h__ + +#include +#include + +#include +#include +#include + +/** + * The library_visual_scenes element declares a module of visual_scene elements. + */ +class domLibrary_visual_scenes : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::LIBRARY_VISUAL_SCENES; } +protected: // Attributes +/** + * The id attribute is a text string containing the unique identifier of + * this element. This value must be unique within the instance document. + * Optional attribute. + */ + xsID attrId; +/** + * The name attribute is the text string name of this element. Optional attribute. + */ + xsNCName attrName; + +protected: // Elements +/** + * The library_visual_scenes element may contain an asset element. @see + * domAsset + */ + domAssetRef elemAsset; +/** + * There must be at least one visual_scene element. @see domVisual_scene + */ + domVisual_scene_Array elemVisual_scene_array; +/** + * The extra element may appear any number of times. @see domExtra + */ + domExtra_Array elemExtra_array; + +public: //Accessors and Mutators + /** + * Gets the id attribute. + * @return Returns a xsID of the id attribute. + */ + xsID getId() const { return attrId; } + /** + * Sets the id attribute. + * @param atId The new value for the id attribute. + */ + void setId( xsID atId ) { *(daeStringRef*)&attrId = atId; + _validAttributeArray[0] = true; } + + /** + * Gets the name attribute. + * @return Returns a xsNCName of the name attribute. + */ + xsNCName getName() const { return attrName; } + /** + * Sets the name attribute. + * @param atName The new value for the name attribute. + */ + void setName( xsNCName atName ) { *(daeStringRef*)&attrName = atName; + _validAttributeArray[1] = true; } + + /** + * Gets the asset element. + * @return a daeSmartRef to the asset element. + */ + const domAssetRef getAsset() const { return elemAsset; } + /** + * Gets the visual_scene element array. + * @return Returns a reference to the array of visual_scene elements. + */ + domVisual_scene_Array &getVisual_scene_array() { return elemVisual_scene_array; } + /** + * Gets the visual_scene element array. + * @return Returns a constant reference to the array of visual_scene elements. + */ + const domVisual_scene_Array &getVisual_scene_array() const { return elemVisual_scene_array; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } +protected: + /** + * Constructor + */ + domLibrary_visual_scenes() : attrId(), attrName(), elemAsset(), elemVisual_scene_array(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domLibrary_visual_scenes() {} + /** + * Copy Constructor + */ + domLibrary_visual_scenes( const domLibrary_visual_scenes &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domLibrary_visual_scenes &operator=( const domLibrary_visual_scenes &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domLight.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domLight.h new file mode 100644 index 00000000..d106d908 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domLight.h @@ -0,0 +1,666 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domLight_h__ +#define __domLight_h__ + +#include +#include + +#include +#include +#include +#include +#include + +/** + * The light element declares a light source that illuminates the scene. Light + * sources have many different properties and radiate light in many different + * patterns and frequencies. + */ +class domLight : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::LIGHT; } +public: + class domTechnique_common; + + typedef daeSmartRef domTechnique_commonRef; + typedef daeTArray domTechnique_common_Array; + +/** + * The technique_common element specifies the light information for the common + * profile which all COLLADA implementations need to support. + */ + class domTechnique_common : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::TECHNIQUE_COMMON; } + public: + class domAmbient; + + typedef daeSmartRef domAmbientRef; + typedef daeTArray domAmbient_Array; + +/** + * The ambient element declares the parameters required to describe an ambient + * light source. An ambient light is one that lights everything evenly, + * regardless of location or orientation. + */ + class domAmbient : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::AMBIENT; } + + protected: // Element +/** + * The color element contains three floating point numbers specifying the + * color of the light. The color element must occur exactly once. @see domColor + */ + domTargetableFloat3Ref elemColor; + + public: //Accessors and Mutators + /** + * Gets the color element. + * @return a daeSmartRef to the color element. + */ + const domTargetableFloat3Ref getColor() const { return elemColor; } + protected: + /** + * Constructor + */ + domAmbient() : elemColor() {} + /** + * Destructor + */ + virtual ~domAmbient() {} + /** + * Copy Constructor + */ + domAmbient( const domAmbient &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domAmbient &operator=( const domAmbient &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domDirectional; + + typedef daeSmartRef domDirectionalRef; + typedef daeTArray domDirectional_Array; + +/** + * The directional element declares the parameters required to describe a + * directional light source. A directional light is one that lights everything + * from the same direction, regardless of location. The light’s default + * direction vector in local coordinates is [0,0,-1], pointing down the -Z + * axis. The actual direction of the light is defined by the transform of + * the node where the light is instantiated. + */ + class domDirectional : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::DIRECTIONAL; } + + protected: // Element +/** + * The color element contains three floating point numbers specifying the + * color of the light. The color element must occur exactly once. @see domColor + */ + domTargetableFloat3Ref elemColor; + + public: //Accessors and Mutators + /** + * Gets the color element. + * @return a daeSmartRef to the color element. + */ + const domTargetableFloat3Ref getColor() const { return elemColor; } + protected: + /** + * Constructor + */ + domDirectional() : elemColor() {} + /** + * Destructor + */ + virtual ~domDirectional() {} + /** + * Copy Constructor + */ + domDirectional( const domDirectional &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domDirectional &operator=( const domDirectional &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domPoint; + + typedef daeSmartRef domPointRef; + typedef daeTArray domPoint_Array; + +/** + * The point element declares the parameters required to describe a point + * light source. A point light source radiates light in all directions from + * a known location in space. The intensity of a point light source is attenuated + * as the distance to the light source increases. The position of the light + * is defined by the transform of the node in which it is instantiated. + */ + class domPoint : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::POINT; } + + protected: // Elements +/** + * The color element contains three floating point numbers specifying the + * color of the light. The color element must occur exactly once. @see domColor + */ + domTargetableFloat3Ref elemColor; +/** + * The constant_attenuation is used to calculate the total attenuation of + * this light given a distance. The equation used is A = constant_attenuation + * + Dist*linear_attenuation + Dist^2*quadratic_attenuation. @see domConstant_attenuation + */ + domTargetableFloatRef elemConstant_attenuation; +/** + * The linear_attenuation is used to calculate the total attenuation of this + * light given a distance. The equation used is A = constant_attenuation + * + Dist*linear_attenuation + Dist^2*quadratic_attenuation. @see domLinear_attenuation + */ + domTargetableFloatRef elemLinear_attenuation; +/** + * The quadratic_attenuation is used to calculate the total attenuation of + * this light given a distance. The equation used is A = constant_attenuation + * + Dist*linear_attenuation + Dist^2*quadratic_attenuation. @see domQuadratic_attenuation + */ + domTargetableFloatRef elemQuadratic_attenuation; + + public: //Accessors and Mutators + /** + * Gets the color element. + * @return a daeSmartRef to the color element. + */ + const domTargetableFloat3Ref getColor() const { return elemColor; } + /** + * Gets the constant_attenuation element. + * @return a daeSmartRef to the constant_attenuation element. + */ + const domTargetableFloatRef getConstant_attenuation() const { return elemConstant_attenuation; } + /** + * Gets the linear_attenuation element. + * @return a daeSmartRef to the linear_attenuation element. + */ + const domTargetableFloatRef getLinear_attenuation() const { return elemLinear_attenuation; } + /** + * Gets the quadratic_attenuation element. + * @return a daeSmartRef to the quadratic_attenuation element. + */ + const domTargetableFloatRef getQuadratic_attenuation() const { return elemQuadratic_attenuation; } + protected: + /** + * Constructor + */ + domPoint() : elemColor(), elemConstant_attenuation(), elemLinear_attenuation(), elemQuadratic_attenuation() {} + /** + * Destructor + */ + virtual ~domPoint() {} + /** + * Copy Constructor + */ + domPoint( const domPoint &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domPoint &operator=( const domPoint &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domSpot; + + typedef daeSmartRef domSpotRef; + typedef daeTArray domSpot_Array; + +/** + * The spot element declares the parameters required to describe a spot light + * source. A spot light source radiates light in one direction from a known + * location in space. The light radiates from the spot light source in a + * cone shape. The intensity of the light is attenuated as the radiation + * angle increases away from the direction of the light source. The intensity + * of a spot light source is also attenuated as the distance to the light + * source increases. The position of the light is defined by the transform + * of the node in which it is instantiated. The light’s default direction + * vector in local coordinates is [0,0,-1], pointing down the -Z axis. The + * actual direction of the light is defined by the transform of the node + * where the light is instantiated. + */ + class domSpot : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::SPOT; } + + protected: // Elements +/** + * The color element contains three floating point numbers specifying the + * color of the light. The color element must occur exactly once. @see domColor + */ + domTargetableFloat3Ref elemColor; +/** + * The constant_attenuation is used to calculate the total attenuation of + * this light given a distance. The equation used is A = constant_attenuation + * + Dist*linear_attenuation + Dist^2*quadratic_attenuation. @see domConstant_attenuation + */ + domTargetableFloatRef elemConstant_attenuation; +/** + * The linear_attenuation is used to calculate the total attenuation of this + * light given a distance. The equation used is A = constant_attenuation + * + Dist*linear_attenuation + Dist^2*quadratic_attenuation. @see domLinear_attenuation + */ + domTargetableFloatRef elemLinear_attenuation; +/** + * The quadratic_attenuation is used to calculate the total attenuation of + * this light given a distance. The equation used is A = constant_attenuation + * + Dist*linear_attenuation + Dist^2*quadratic_attenuation. @see domQuadratic_attenuation + */ + domTargetableFloatRef elemQuadratic_attenuation; +/** + * The falloff_angle is used to specify the amount of attenuation based on + * the direction of the light. @see domFalloff_angle + */ + domTargetableFloatRef elemFalloff_angle; +/** + * The falloff_exponent is used to specify the amount of attenuation based + * on the direction of the light. @see domFalloff_exponent + */ + domTargetableFloatRef elemFalloff_exponent; + + public: //Accessors and Mutators + /** + * Gets the color element. + * @return a daeSmartRef to the color element. + */ + const domTargetableFloat3Ref getColor() const { return elemColor; } + /** + * Gets the constant_attenuation element. + * @return a daeSmartRef to the constant_attenuation element. + */ + const domTargetableFloatRef getConstant_attenuation() const { return elemConstant_attenuation; } + /** + * Gets the linear_attenuation element. + * @return a daeSmartRef to the linear_attenuation element. + */ + const domTargetableFloatRef getLinear_attenuation() const { return elemLinear_attenuation; } + /** + * Gets the quadratic_attenuation element. + * @return a daeSmartRef to the quadratic_attenuation element. + */ + const domTargetableFloatRef getQuadratic_attenuation() const { return elemQuadratic_attenuation; } + /** + * Gets the falloff_angle element. + * @return a daeSmartRef to the falloff_angle element. + */ + const domTargetableFloatRef getFalloff_angle() const { return elemFalloff_angle; } + /** + * Gets the falloff_exponent element. + * @return a daeSmartRef to the falloff_exponent element. + */ + const domTargetableFloatRef getFalloff_exponent() const { return elemFalloff_exponent; } + protected: + /** + * Constructor + */ + domSpot() : elemColor(), elemConstant_attenuation(), elemLinear_attenuation(), elemQuadratic_attenuation(), elemFalloff_angle(), elemFalloff_exponent() {} + /** + * Destructor + */ + virtual ~domSpot() {} + /** + * Copy Constructor + */ + domSpot( const domSpot &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domSpot &operator=( const domSpot &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + + + protected: // Elements +/** + * The ambient element declares the parameters required to describe an ambient + * light source. An ambient light is one that lights everything evenly, + * regardless of location or orientation. @see domAmbient + */ + domAmbientRef elemAmbient; +/** + * The directional element declares the parameters required to describe a + * directional light source. A directional light is one that lights everything + * from the same direction, regardless of location. The light’s default + * direction vector in local coordinates is [0,0,-1], pointing down the -Z + * axis. The actual direction of the light is defined by the transform of + * the node where the light is instantiated. @see domDirectional + */ + domDirectionalRef elemDirectional; +/** + * The point element declares the parameters required to describe a point + * light source. A point light source radiates light in all directions from + * a known location in space. The intensity of a point light source is attenuated + * as the distance to the light source increases. The position of the light + * is defined by the transform of the node in which it is instantiated. @see + * domPoint + */ + domPointRef elemPoint; +/** + * The spot element declares the parameters required to describe a spot light + * source. A spot light source radiates light in one direction from a known + * location in space. The light radiates from the spot light source in a + * cone shape. The intensity of the light is attenuated as the radiation + * angle increases away from the direction of the light source. The intensity + * of a spot light source is also attenuated as the distance to the light + * source increases. The position of the light is defined by the transform + * of the node in which it is instantiated. The light’s default direction + * vector in local coordinates is [0,0,-1], pointing down the -Z axis. The + * actual direction of the light is defined by the transform of the node + * where the light is instantiated. @see domSpot + */ + domSpotRef elemSpot; + /** + * Used to preserve order in elements that do not specify strict sequencing of sub-elements. + */ + daeElementRefArray _contents; + /** + * Used to preserve order in elements that have a complex content model. + */ + daeUIntArray _contentsOrder; + + + public: //Accessors and Mutators + /** + * Gets the ambient element. + * @return a daeSmartRef to the ambient element. + */ + const domAmbientRef getAmbient() const { return elemAmbient; } + /** + * Gets the directional element. + * @return a daeSmartRef to the directional element. + */ + const domDirectionalRef getDirectional() const { return elemDirectional; } + /** + * Gets the point element. + * @return a daeSmartRef to the point element. + */ + const domPointRef getPoint() const { return elemPoint; } + /** + * Gets the spot element. + * @return a daeSmartRef to the spot element. + */ + const domSpotRef getSpot() const { return elemSpot; } + /** + * Gets the _contents array. + * @return Returns a reference to the _contents element array. + */ + daeElementRefArray &getContents() { return _contents; } + /** + * Gets the _contents array. + * @return Returns a constant reference to the _contents element array. + */ + const daeElementRefArray &getContents() const { return _contents; } + + protected: + /** + * Constructor + */ + domTechnique_common() : elemAmbient(), elemDirectional(), elemPoint(), elemSpot() {} + /** + * Destructor + */ + virtual ~domTechnique_common() {} + /** + * Copy Constructor + */ + domTechnique_common( const domTechnique_common &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domTechnique_common &operator=( const domTechnique_common &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + +protected: // Attributes +/** + * The id attribute is a text string containing the unique identifier of + * this element. This value must be unique within the instance document. + * Optional attribute. + */ + xsID attrId; +/** + * The name attribute is the text string name of this element. Optional attribute. + */ + xsNCName attrName; + +protected: // Elements +/** + * The light element may contain an asset element. @see domAsset + */ + domAssetRef elemAsset; +/** + * The technique_common element specifies the light information for the common + * profile which all COLLADA implementations need to support. @see domTechnique_common + */ + domTechnique_commonRef elemTechnique_common; +/** + * This element may contain any number of non-common profile techniques. + * @see domTechnique + */ + domTechnique_Array elemTechnique_array; +/** + * The extra element may appear any number of times. @see domExtra + */ + domExtra_Array elemExtra_array; + +public: //Accessors and Mutators + /** + * Gets the id attribute. + * @return Returns a xsID of the id attribute. + */ + xsID getId() const { return attrId; } + /** + * Sets the id attribute. + * @param atId The new value for the id attribute. + */ + void setId( xsID atId ) { *(daeStringRef*)&attrId = atId; + _validAttributeArray[0] = true; } + + /** + * Gets the name attribute. + * @return Returns a xsNCName of the name attribute. + */ + xsNCName getName() const { return attrName; } + /** + * Sets the name attribute. + * @param atName The new value for the name attribute. + */ + void setName( xsNCName atName ) { *(daeStringRef*)&attrName = atName; + _validAttributeArray[1] = true; } + + /** + * Gets the asset element. + * @return a daeSmartRef to the asset element. + */ + const domAssetRef getAsset() const { return elemAsset; } + /** + * Gets the technique_common element. + * @return a daeSmartRef to the technique_common element. + */ + const domTechnique_commonRef getTechnique_common() const { return elemTechnique_common; } + /** + * Gets the technique element array. + * @return Returns a reference to the array of technique elements. + */ + domTechnique_Array &getTechnique_array() { return elemTechnique_array; } + /** + * Gets the technique element array. + * @return Returns a constant reference to the array of technique elements. + */ + const domTechnique_Array &getTechnique_array() const { return elemTechnique_array; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } +protected: + /** + * Constructor + */ + domLight() : attrId(), attrName(), elemAsset(), elemTechnique_common(), elemTechnique_array(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domLight() {} + /** + * Copy Constructor + */ + domLight( const domLight &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domLight &operator=( const domLight &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domLines.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domLines.h new file mode 100644 index 00000000..667dd721 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domLines.h @@ -0,0 +1,169 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domLines_h__ +#define __domLines_h__ + +#include +#include + +#include +#include +#include + +/** + * The lines element provides the information needed to bind vertex attributes + * together and then organize those vertices into individual lines. Each + * line described by the mesh has two vertices. The first line is formed + * from first and second vertices. The second line is formed from the third + * and fourth vertices and so on. + */ +class domLines : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::LINES; } +protected: // Attributes +/** + * The name attribute is the text string name of this element. Optional attribute. + */ + xsNCName attrName; +/** + * The count attribute indicates the number of line primitives. Required + * attribute. + */ + domUint attrCount; +/** + * The material attribute declares a symbol for a material. This symbol is + * bound to a material at the time of instantiation. If the material attribute + * is not specified then the lighting and shading results are application + * defined. Optional attribute. + */ + xsNCName attrMaterial; + +protected: // Elements +/** + * The input element may occur any number of times. This input is a local + * input with the offset and set attributes. @see domInput + */ + domInputLocalOffset_Array elemInput_array; +/** + * The p element may occur once. @see domP + */ + domPRef elemP; +/** + * The extra element may appear any number of times. @see domExtra + */ + domExtra_Array elemExtra_array; + +public: //Accessors and Mutators + /** + * Gets the name attribute. + * @return Returns a xsNCName of the name attribute. + */ + xsNCName getName() const { return attrName; } + /** + * Sets the name attribute. + * @param atName The new value for the name attribute. + */ + void setName( xsNCName atName ) { *(daeStringRef*)&attrName = atName; + _validAttributeArray[0] = true; } + + /** + * Gets the count attribute. + * @return Returns a domUint of the count attribute. + */ + domUint getCount() const { return attrCount; } + /** + * Sets the count attribute. + * @param atCount The new value for the count attribute. + */ + void setCount( domUint atCount ) { attrCount = atCount; + _validAttributeArray[1] = true; } + + /** + * Gets the material attribute. + * @return Returns a xsNCName of the material attribute. + */ + xsNCName getMaterial() const { return attrMaterial; } + /** + * Sets the material attribute. + * @param atMaterial The new value for the material attribute. + */ + void setMaterial( xsNCName atMaterial ) { *(daeStringRef*)&attrMaterial = atMaterial; + _validAttributeArray[2] = true; } + + /** + * Gets the input element array. + * @return Returns a reference to the array of input elements. + */ + domInputLocalOffset_Array &getInput_array() { return elemInput_array; } + /** + * Gets the input element array. + * @return Returns a constant reference to the array of input elements. + */ + const domInputLocalOffset_Array &getInput_array() const { return elemInput_array; } + /** + * Gets the p element. + * @return a daeSmartRef to the p element. + */ + const domPRef getP() const { return elemP; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } +protected: + /** + * Constructor + */ + domLines() : attrName(), attrCount(), attrMaterial(), elemInput_array(), elemP(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domLines() {} + /** + * Copy Constructor + */ + domLines( const domLines &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domLines &operator=( const domLines &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domLinestrips.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domLinestrips.h new file mode 100644 index 00000000..6b85df1e --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domLinestrips.h @@ -0,0 +1,174 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domLinestrips_h__ +#define __domLinestrips_h__ + +#include +#include + +#include +#include +#include + +/** + * The linestrips element provides the information needed to bind vertex attributes + * together and then organize those vertices into connected line-strips. + * Each line-strip described by the mesh has an arbitrary number of vertices. + * Each line segment within the line-strip is formed from the current vertex + * and the preceding vertex. + */ +class domLinestrips : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::LINESTRIPS; } +protected: // Attributes +/** + * The name attribute is the text string name of this element. Optional attribute. + */ + xsNCName attrName; +/** + * The count attribute indicates the number of linestrip primitives. Required + * attribute. + */ + domUint attrCount; +/** + * The material attribute declares a symbol for a material. This symbol is + * bound to a material at the time of instantiation. If the material attribute + * is not specified then the lighting and shading results are application + * defined. Optional attribute. + */ + xsNCName attrMaterial; + +protected: // Elements +/** + * The input element may occur any number of times. This input is a local + * input with the offset and set attributes. @see domInput + */ + domInputLocalOffset_Array elemInput_array; +/** + * The linestrips element may have any number of p elements. @see domP + */ + domP_Array elemP_array; +/** + * The extra element may appear any number of times. @see domExtra + */ + domExtra_Array elemExtra_array; + +public: //Accessors and Mutators + /** + * Gets the name attribute. + * @return Returns a xsNCName of the name attribute. + */ + xsNCName getName() const { return attrName; } + /** + * Sets the name attribute. + * @param atName The new value for the name attribute. + */ + void setName( xsNCName atName ) { *(daeStringRef*)&attrName = atName; + _validAttributeArray[0] = true; } + + /** + * Gets the count attribute. + * @return Returns a domUint of the count attribute. + */ + domUint getCount() const { return attrCount; } + /** + * Sets the count attribute. + * @param atCount The new value for the count attribute. + */ + void setCount( domUint atCount ) { attrCount = atCount; + _validAttributeArray[1] = true; } + + /** + * Gets the material attribute. + * @return Returns a xsNCName of the material attribute. + */ + xsNCName getMaterial() const { return attrMaterial; } + /** + * Sets the material attribute. + * @param atMaterial The new value for the material attribute. + */ + void setMaterial( xsNCName atMaterial ) { *(daeStringRef*)&attrMaterial = atMaterial; + _validAttributeArray[2] = true; } + + /** + * Gets the input element array. + * @return Returns a reference to the array of input elements. + */ + domInputLocalOffset_Array &getInput_array() { return elemInput_array; } + /** + * Gets the input element array. + * @return Returns a constant reference to the array of input elements. + */ + const domInputLocalOffset_Array &getInput_array() const { return elemInput_array; } + /** + * Gets the p element array. + * @return Returns a reference to the array of p elements. + */ + domP_Array &getP_array() { return elemP_array; } + /** + * Gets the p element array. + * @return Returns a constant reference to the array of p elements. + */ + const domP_Array &getP_array() const { return elemP_array; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } +protected: + /** + * Constructor + */ + domLinestrips() : attrName(), attrCount(), attrMaterial(), elemInput_array(), elemP_array(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domLinestrips() {} + /** + * Copy Constructor + */ + domLinestrips( const domLinestrips &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domLinestrips &operator=( const domLinestrips &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domLookat.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domLookat.h new file mode 100644 index 00000000..4a50f0c5 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domLookat.h @@ -0,0 +1,113 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domLookat_h__ +#define __domLookat_h__ + +#include +#include + + +/** + * The lookat element contains a position and orientation transformation suitable + * for aiming a camera. The lookat element contains three mathematical vectors + * within it that describe: 1.The position of the object; 2.The position + * of the interest point; 3.The direction that points up. + */ +class domLookat : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::LOOKAT; } +protected: // Attribute +/** + * The sid attribute is a text string value containing the sub-identifier + * of this element. This value must be unique within the scope of the parent + * element. Optional attribute. + */ + xsNCName attrSid; + +protected: // Value + /** + * The domFloat3x3 value of the text data of this element. + */ + domFloat3x3 _value; + +public: //Accessors and Mutators + /** + * Gets the sid attribute. + * @return Returns a xsNCName of the sid attribute. + */ + xsNCName getSid() const { return attrSid; } + /** + * Sets the sid attribute. + * @param atSid The new value for the sid attribute. + */ + void setSid( xsNCName atSid ) { *(daeStringRef*)&attrSid = atSid; + _validAttributeArray[0] = true; } + + /** + * Gets the _value array. + * @return Returns a domFloat3x3 reference of the _value array. + */ + domFloat3x3 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domFloat3x3 reference of the _value array. + */ + const domFloat3x3 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domFloat3x3 &val ) { _value = val; } + +protected: + /** + * Constructor + */ + domLookat() : attrSid(), _value() {} + /** + * Destructor + */ + virtual ~domLookat() {} + /** + * Copy Constructor + */ + domLookat( const domLookat &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domLookat &operator=( const domLookat &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domMaterial.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domMaterial.h new file mode 100644 index 00000000..2cd7b53e --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domMaterial.h @@ -0,0 +1,141 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domMaterial_h__ +#define __domMaterial_h__ + +#include +#include + +#include +#include +#include + +/** + * Materials describe the visual appearance of a geometric object. + */ +class domMaterial : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::MATERIAL; } +protected: // Attributes +/** + * The id attribute is a text string containing the unique identifier of + * this element. This value must be unique within the instance document. + * Optional attribute. + */ + xsID attrId; +/** + * The name attribute is the text string name of this element. Optional attribute. + */ + xsNCName attrName; + +protected: // Elements +/** + * The material element may contain an asset element. @see domAsset + */ + domAssetRef elemAsset; +/** + * The material must instance an effect. @see domInstance_effect + */ + domInstance_effectRef elemInstance_effect; +/** + * The extra element may appear any number of times. @see domExtra + */ + domExtra_Array elemExtra_array; + +public: //Accessors and Mutators + /** + * Gets the id attribute. + * @return Returns a xsID of the id attribute. + */ + xsID getId() const { return attrId; } + /** + * Sets the id attribute. + * @param atId The new value for the id attribute. + */ + void setId( xsID atId ) { *(daeStringRef*)&attrId = atId; + _validAttributeArray[0] = true; } + + /** + * Gets the name attribute. + * @return Returns a xsNCName of the name attribute. + */ + xsNCName getName() const { return attrName; } + /** + * Sets the name attribute. + * @param atName The new value for the name attribute. + */ + void setName( xsNCName atName ) { *(daeStringRef*)&attrName = atName; + _validAttributeArray[1] = true; } + + /** + * Gets the asset element. + * @return a daeSmartRef to the asset element. + */ + const domAssetRef getAsset() const { return elemAsset; } + /** + * Gets the instance_effect element. + * @return a daeSmartRef to the instance_effect element. + */ + const domInstance_effectRef getInstance_effect() const { return elemInstance_effect; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } +protected: + /** + * Constructor + */ + domMaterial() : attrId(), attrName(), elemAsset(), elemInstance_effect(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domMaterial() {} + /** + * Copy Constructor + */ + domMaterial( const domMaterial &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domMaterial &operator=( const domMaterial &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domMatrix.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domMatrix.h new file mode 100644 index 00000000..a6a92c49 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domMatrix.h @@ -0,0 +1,112 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domMatrix_h__ +#define __domMatrix_h__ + +#include +#include + + +/** + * Matrix transformations embody mathematical changes to points within a coordinate + * systems or the coordinate system itself. The matrix element contains a + * 4-by-4 matrix of floating-point values. + */ +class domMatrix : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::MATRIX; } +protected: // Attribute +/** + * The sid attribute is a text string value containing the sub-identifier + * of this element. This value must be unique within the scope of the parent + * element. Optional attribute. + */ + xsNCName attrSid; + +protected: // Value + /** + * The domFloat4x4 value of the text data of this element. + */ + domFloat4x4 _value; + +public: //Accessors and Mutators + /** + * Gets the sid attribute. + * @return Returns a xsNCName of the sid attribute. + */ + xsNCName getSid() const { return attrSid; } + /** + * Sets the sid attribute. + * @param atSid The new value for the sid attribute. + */ + void setSid( xsNCName atSid ) { *(daeStringRef*)&attrSid = atSid; + _validAttributeArray[0] = true; } + + /** + * Gets the _value array. + * @return Returns a domFloat4x4 reference of the _value array. + */ + domFloat4x4 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domFloat4x4 reference of the _value array. + */ + const domFloat4x4 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domFloat4x4 &val ) { _value = val; } + +protected: + /** + * Constructor + */ + domMatrix() : attrSid(), _value() {} + /** + * Destructor + */ + virtual ~domMatrix() {} + /** + * Copy Constructor + */ + domMatrix( const domMatrix &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domMatrix &operator=( const domMatrix &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domMesh.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domMesh.h new file mode 100644 index 00000000..f6cc2763 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domMesh.h @@ -0,0 +1,238 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domMesh_h__ +#define __domMesh_h__ + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/** + * The mesh element contains vertex and primitive information sufficient to + * describe basic geometric meshes. + */ +class domMesh : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::MESH; } + +protected: // Elements +/** + * The mesh element must contain one or more source elements. @see domSource + */ + domSource_Array elemSource_array; +/** + * The mesh element must contain one vertices element. @see domVertices + */ + domVerticesRef elemVertices; +/** + * The mesh element may contain any number of lines elements. @see domLines + */ + domLines_Array elemLines_array; +/** + * The mesh element may contain any number of linestrips elements. @see + * domLinestrips + */ + domLinestrips_Array elemLinestrips_array; +/** + * The mesh element may contain any number of polygons elements. @see domPolygons + */ + domPolygons_Array elemPolygons_array; +/** + * The mesh element may contain any number of polylist elements. @see domPolylist + */ + domPolylist_Array elemPolylist_array; +/** + * The mesh element may contain any number of triangles elements. @see domTriangles + */ + domTriangles_Array elemTriangles_array; +/** + * The mesh element may contain any number of trifans elements. @see domTrifans + */ + domTrifans_Array elemTrifans_array; +/** + * The mesh element may contain any number of tristrips elements. @see domTristrips + */ + domTristrips_Array elemTristrips_array; +/** + * The extra element may appear any number of times. @see domExtra + */ + domExtra_Array elemExtra_array; + /** + * Used to preserve order in elements that do not specify strict sequencing of sub-elements. + */ + daeElementRefArray _contents; + /** + * Used to preserve order in elements that have a complex content model. + */ + daeUIntArray _contentsOrder; + + +public: //Accessors and Mutators + /** + * Gets the source element array. + * @return Returns a reference to the array of source elements. + */ + domSource_Array &getSource_array() { return elemSource_array; } + /** + * Gets the source element array. + * @return Returns a constant reference to the array of source elements. + */ + const domSource_Array &getSource_array() const { return elemSource_array; } + /** + * Gets the vertices element. + * @return a daeSmartRef to the vertices element. + */ + const domVerticesRef getVertices() const { return elemVertices; } + /** + * Gets the lines element array. + * @return Returns a reference to the array of lines elements. + */ + domLines_Array &getLines_array() { return elemLines_array; } + /** + * Gets the lines element array. + * @return Returns a constant reference to the array of lines elements. + */ + const domLines_Array &getLines_array() const { return elemLines_array; } + /** + * Gets the linestrips element array. + * @return Returns a reference to the array of linestrips elements. + */ + domLinestrips_Array &getLinestrips_array() { return elemLinestrips_array; } + /** + * Gets the linestrips element array. + * @return Returns a constant reference to the array of linestrips elements. + */ + const domLinestrips_Array &getLinestrips_array() const { return elemLinestrips_array; } + /** + * Gets the polygons element array. + * @return Returns a reference to the array of polygons elements. + */ + domPolygons_Array &getPolygons_array() { return elemPolygons_array; } + /** + * Gets the polygons element array. + * @return Returns a constant reference to the array of polygons elements. + */ + const domPolygons_Array &getPolygons_array() const { return elemPolygons_array; } + /** + * Gets the polylist element array. + * @return Returns a reference to the array of polylist elements. + */ + domPolylist_Array &getPolylist_array() { return elemPolylist_array; } + /** + * Gets the polylist element array. + * @return Returns a constant reference to the array of polylist elements. + */ + const domPolylist_Array &getPolylist_array() const { return elemPolylist_array; } + /** + * Gets the triangles element array. + * @return Returns a reference to the array of triangles elements. + */ + domTriangles_Array &getTriangles_array() { return elemTriangles_array; } + /** + * Gets the triangles element array. + * @return Returns a constant reference to the array of triangles elements. + */ + const domTriangles_Array &getTriangles_array() const { return elemTriangles_array; } + /** + * Gets the trifans element array. + * @return Returns a reference to the array of trifans elements. + */ + domTrifans_Array &getTrifans_array() { return elemTrifans_array; } + /** + * Gets the trifans element array. + * @return Returns a constant reference to the array of trifans elements. + */ + const domTrifans_Array &getTrifans_array() const { return elemTrifans_array; } + /** + * Gets the tristrips element array. + * @return Returns a reference to the array of tristrips elements. + */ + domTristrips_Array &getTristrips_array() { return elemTristrips_array; } + /** + * Gets the tristrips element array. + * @return Returns a constant reference to the array of tristrips elements. + */ + const domTristrips_Array &getTristrips_array() const { return elemTristrips_array; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } + /** + * Gets the _contents array. + * @return Returns a reference to the _contents element array. + */ + daeElementRefArray &getContents() { return _contents; } + /** + * Gets the _contents array. + * @return Returns a constant reference to the _contents element array. + */ + const daeElementRefArray &getContents() const { return _contents; } + +protected: + /** + * Constructor + */ + domMesh() : elemSource_array(), elemVertices(), elemLines_array(), elemLinestrips_array(), elemPolygons_array(), elemPolylist_array(), elemTriangles_array(), elemTrifans_array(), elemTristrips_array(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domMesh() {} + /** + * Copy Constructor + */ + domMesh( const domMesh &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domMesh &operator=( const domMesh &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domMorph.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domMorph.h new file mode 100644 index 00000000..093a19e4 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domMorph.h @@ -0,0 +1,241 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domMorph_h__ +#define __domMorph_h__ + +#include +#include + +#include +#include +#include + +/** + * The morph element describes the data required to blend between sets of + * static meshes. Each possible mesh that can be blended (a morph target) + * must be specified. + */ +class domMorph : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::MORPH; } +public: + class domTargets; + + typedef daeSmartRef domTargetsRef; + typedef daeTArray domTargets_Array; + +/** + * The targets element declares the morph targets, their weights and any user + * defined attributes associated with them. + */ + class domTargets : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::TARGETS; } + + protected: // Elements +/** + * The input element must occur at least twice. These inputs are local inputs. + * @see domInput + */ + domInputLocal_Array elemInput_array; +/** + * The extra element may appear any number of times. @see domExtra + */ + domExtra_Array elemExtra_array; + + public: //Accessors and Mutators + /** + * Gets the input element array. + * @return Returns a reference to the array of input elements. + */ + domInputLocal_Array &getInput_array() { return elemInput_array; } + /** + * Gets the input element array. + * @return Returns a constant reference to the array of input elements. + */ + const domInputLocal_Array &getInput_array() const { return elemInput_array; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } + protected: + /** + * Constructor + */ + domTargets() : elemInput_array(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domTargets() {} + /** + * Copy Constructor + */ + domTargets( const domTargets &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domTargets &operator=( const domTargets &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + +protected: // Attributes +/** + * The method attribute specifies the which blending technique to use. The + * accepted values are NORMALIZED, and RELATIVE. The default value if not + * specified is NORMALIZED. Optional attribute. + */ + domMorphMethodType attrMethod; +/** + * The source attribute indicates the base mesh. Required attribute. + */ + xsAnyURI attrSource; + +protected: // Elements +/** + * The morph element must contain at least two source elements. @see domSource + */ + domSource_Array elemSource_array; +/** + * The targets element declares the morph targets, their weights and any user + * defined attributes associated with them. @see domTargets + */ + domTargetsRef elemTargets; +/** + * The extra element may appear any number of times. @see domExtra + */ + domExtra_Array elemExtra_array; + +public: //Accessors and Mutators + /** + * Gets the method attribute. + * @return Returns a domMorphMethodType of the method attribute. + */ + domMorphMethodType getMethod() const { return attrMethod; } + /** + * Sets the method attribute. + * @param atMethod The new value for the method attribute. + */ + void setMethod( domMorphMethodType atMethod ) { attrMethod = atMethod; + _validAttributeArray[0] = true; } + + /** + * Gets the source attribute. + * @return Returns a xsAnyURI reference of the source attribute. + */ + xsAnyURI &getSource() { return attrSource; } + /** + * Gets the source attribute. + * @return Returns a constant xsAnyURI reference of the source attribute. + */ + const xsAnyURI &getSource() const { return attrSource; } + /** + * Sets the source attribute. + * @param atSource The new value for the source attribute. + */ + void setSource( const xsAnyURI &atSource ) { attrSource = atSource; + _validAttributeArray[1] = true; } + + /** + * Gets the source element array. + * @return Returns a reference to the array of source elements. + */ + domSource_Array &getSource_array() { return elemSource_array; } + /** + * Gets the source element array. + * @return Returns a constant reference to the array of source elements. + */ + const domSource_Array &getSource_array() const { return elemSource_array; } + /** + * Gets the targets element. + * @return a daeSmartRef to the targets element. + */ + const domTargetsRef getTargets() const { return elemTargets; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } +protected: + /** + * Constructor + */ + domMorph() : attrMethod(), attrSource(), elemSource_array(), elemTargets(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domMorph() {} + /** + * Copy Constructor + */ + domMorph( const domMorph &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domMorph &operator=( const domMorph &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domName_array.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domName_array.h new file mode 100644 index 00000000..6ef07885 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domName_array.h @@ -0,0 +1,144 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domName_array_h__ +#define __domName_array_h__ + +#include +#include + + +/** + * The Name_array element declares the storage for a homogenous array of Name + * string values. + */ +class domName_array : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::NAME_ARRAY; } +protected: // Attributes +/** + * The id attribute is a text string containing the unique identifier of + * this element. This value must be unique within the instance document. + * Optional attribute. + */ + xsID attrId; +/** + * The name attribute is the text string name of this element. Optional attribute. + */ + xsNCName attrName; +/** + * The count attribute indicates the number of values in the array. Required + * attribute. + */ + domUint attrCount; + +protected: // Value + /** + * The domListOfNames value of the text data of this element. + */ + domListOfNames _value; + +public: //Accessors and Mutators + /** + * Gets the id attribute. + * @return Returns a xsID of the id attribute. + */ + xsID getId() const { return attrId; } + /** + * Sets the id attribute. + * @param atId The new value for the id attribute. + */ + void setId( xsID atId ) { *(daeStringRef*)&attrId = atId; + _validAttributeArray[0] = true; } + + /** + * Gets the name attribute. + * @return Returns a xsNCName of the name attribute. + */ + xsNCName getName() const { return attrName; } + /** + * Sets the name attribute. + * @param atName The new value for the name attribute. + */ + void setName( xsNCName atName ) { *(daeStringRef*)&attrName = atName; + _validAttributeArray[1] = true; } + + /** + * Gets the count attribute. + * @return Returns a domUint of the count attribute. + */ + domUint getCount() const { return attrCount; } + /** + * Sets the count attribute. + * @param atCount The new value for the count attribute. + */ + void setCount( domUint atCount ) { attrCount = atCount; + _validAttributeArray[2] = true; } + + /** + * Gets the _value array. + * @return Returns a domListOfNames reference of the _value array. + */ + domListOfNames &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domListOfNames reference of the _value array. + */ + const domListOfNames &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domListOfNames &val ) { _value = val; } + +protected: + /** + * Constructor + */ + domName_array() : attrId(), attrName(), attrCount(), _value() {} + /** + * Destructor + */ + virtual ~domName_array() {} + /** + * Copy Constructor + */ + domName_array( const domName_array &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domName_array &operator=( const domName_array &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domNode.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domNode.h new file mode 100644 index 00000000..b3f1e4b2 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domNode.h @@ -0,0 +1,394 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domNode_h__ +#define __domNode_h__ + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/** + * Nodes embody the hierarchical relationship of elements in the scene. + */ +class domNode : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::NODE; } +protected: // Attributes +/** + * The id attribute is a text string containing the unique identifier of + * this element. This value must be unique within the instance document. + * Optional attribute. + */ + xsID attrId; +/** + * The name attribute is the text string name of this element. Optional attribute. + */ + xsNCName attrName; +/** + * The sid attribute is a text string value containing the sub-identifier + * of this element. This value must be unique within the scope of the parent + * element. Optional attribute. + */ + xsNCName attrSid; +/** + * The type attribute indicates the type of the node element. The default + * value is “NODEâ€. Optional attribute. + */ + domNodeType attrType; +/** + * The layer attribute indicates the names of the layers to which this node + * belongs. For example, a value of “foreground glowing†indicates that + * this node belongs to both the ‘foreground’ layer and the ‘glowing’ + * layer. The default value is empty, indicating that the node doesn’t + * belong to any layer. Optional attribute. + */ + domListOfNames attrLayer; + +protected: // Elements +/** + * The node element may contain an asset element. @see domAsset + */ + domAssetRef elemAsset; +/** + * The node element may contain any number of lookat elements. @see domLookat + */ + domLookat_Array elemLookat_array; +/** + * The node element may contain any number of matrix elements. @see domMatrix + */ + domMatrix_Array elemMatrix_array; +/** + * The node element may contain any number of rotate elements. @see domRotate + */ + domRotate_Array elemRotate_array; +/** + * The node element may contain any number of scale elements. @see domScale + */ + domScale_Array elemScale_array; +/** + * The node element may contain any number of skew elements. @see domSkew + */ + domSkew_Array elemSkew_array; +/** + * The node element may contain any number of translate elements. @see domTranslate + */ + domTranslate_Array elemTranslate_array; +/** + * The node element may instance any number of camera objects. @see domInstance_camera + */ + domInstance_camera_Array elemInstance_camera_array; +/** + * The node element may instance any number of controller objects. @see + * domInstance_controller + */ + domInstance_controller_Array elemInstance_controller_array; +/** + * The node element may instance any number of geometry objects. @see domInstance_geometry + */ + domInstance_geometry_Array elemInstance_geometry_array; +/** + * The node element may instance any number of light objects. @see domInstance_light + */ + domInstance_light_Array elemInstance_light_array; +/** + * The node element may instance any number of node elements or hierarchies + * objects. @see domInstance_node + */ + domInstance_node_Array elemInstance_node_array; +/** + * The node element may be hierarchical and be the parent of any number of + * other node elements. @see domNode + */ + domNode_Array elemNode_array; +/** + * The extra element may appear any number of times. @see domExtra + */ + domExtra_Array elemExtra_array; + /** + * Used to preserve order in elements that do not specify strict sequencing of sub-elements. + */ + daeElementRefArray _contents; + /** + * Used to preserve order in elements that have a complex content model. + */ + daeUIntArray _contentsOrder; + + +public: //Accessors and Mutators + /** + * Gets the id attribute. + * @return Returns a xsID of the id attribute. + */ + xsID getId() const { return attrId; } + /** + * Sets the id attribute. + * @param atId The new value for the id attribute. + */ + void setId( xsID atId ) { *(daeStringRef*)&attrId = atId; + _validAttributeArray[0] = true; } + + /** + * Gets the name attribute. + * @return Returns a xsNCName of the name attribute. + */ + xsNCName getName() const { return attrName; } + /** + * Sets the name attribute. + * @param atName The new value for the name attribute. + */ + void setName( xsNCName atName ) { *(daeStringRef*)&attrName = atName; + _validAttributeArray[1] = true; } + + /** + * Gets the sid attribute. + * @return Returns a xsNCName of the sid attribute. + */ + xsNCName getSid() const { return attrSid; } + /** + * Sets the sid attribute. + * @param atSid The new value for the sid attribute. + */ + void setSid( xsNCName atSid ) { *(daeStringRef*)&attrSid = atSid; + _validAttributeArray[2] = true; } + + /** + * Gets the type attribute. + * @return Returns a domNodeType of the type attribute. + */ + domNodeType getType() const { return attrType; } + /** + * Sets the type attribute. + * @param atType The new value for the type attribute. + */ + void setType( domNodeType atType ) { attrType = atType; + _validAttributeArray[3] = true; } + + /** + * Gets the layer array attribute. + * @return Returns a domListOfNames reference of the layer array attribute. + */ + domListOfNames &getLayer() { return attrLayer; } + /** + * Gets the layer array attribute. + * @return Returns a constant domListOfNames reference of the layer array attribute. + */ + const domListOfNames &getLayer() const { return attrLayer; } + /** + * Sets the layer array attribute. + * @param atLayer The new value for the layer array attribute. + */ + void setLayer( const domListOfNames &atLayer ) { attrLayer = atLayer; + _validAttributeArray[4] = true; } + + /** + * Gets the asset element. + * @return a daeSmartRef to the asset element. + */ + const domAssetRef getAsset() const { return elemAsset; } + /** + * Gets the lookat element array. + * @return Returns a reference to the array of lookat elements. + */ + domLookat_Array &getLookat_array() { return elemLookat_array; } + /** + * Gets the lookat element array. + * @return Returns a constant reference to the array of lookat elements. + */ + const domLookat_Array &getLookat_array() const { return elemLookat_array; } + /** + * Gets the matrix element array. + * @return Returns a reference to the array of matrix elements. + */ + domMatrix_Array &getMatrix_array() { return elemMatrix_array; } + /** + * Gets the matrix element array. + * @return Returns a constant reference to the array of matrix elements. + */ + const domMatrix_Array &getMatrix_array() const { return elemMatrix_array; } + /** + * Gets the rotate element array. + * @return Returns a reference to the array of rotate elements. + */ + domRotate_Array &getRotate_array() { return elemRotate_array; } + /** + * Gets the rotate element array. + * @return Returns a constant reference to the array of rotate elements. + */ + const domRotate_Array &getRotate_array() const { return elemRotate_array; } + /** + * Gets the scale element array. + * @return Returns a reference to the array of scale elements. + */ + domScale_Array &getScale_array() { return elemScale_array; } + /** + * Gets the scale element array. + * @return Returns a constant reference to the array of scale elements. + */ + const domScale_Array &getScale_array() const { return elemScale_array; } + /** + * Gets the skew element array. + * @return Returns a reference to the array of skew elements. + */ + domSkew_Array &getSkew_array() { return elemSkew_array; } + /** + * Gets the skew element array. + * @return Returns a constant reference to the array of skew elements. + */ + const domSkew_Array &getSkew_array() const { return elemSkew_array; } + /** + * Gets the translate element array. + * @return Returns a reference to the array of translate elements. + */ + domTranslate_Array &getTranslate_array() { return elemTranslate_array; } + /** + * Gets the translate element array. + * @return Returns a constant reference to the array of translate elements. + */ + const domTranslate_Array &getTranslate_array() const { return elemTranslate_array; } + /** + * Gets the instance_camera element array. + * @return Returns a reference to the array of instance_camera elements. + */ + domInstance_camera_Array &getInstance_camera_array() { return elemInstance_camera_array; } + /** + * Gets the instance_camera element array. + * @return Returns a constant reference to the array of instance_camera elements. + */ + const domInstance_camera_Array &getInstance_camera_array() const { return elemInstance_camera_array; } + /** + * Gets the instance_controller element array. + * @return Returns a reference to the array of instance_controller elements. + */ + domInstance_controller_Array &getInstance_controller_array() { return elemInstance_controller_array; } + /** + * Gets the instance_controller element array. + * @return Returns a constant reference to the array of instance_controller elements. + */ + const domInstance_controller_Array &getInstance_controller_array() const { return elemInstance_controller_array; } + /** + * Gets the instance_geometry element array. + * @return Returns a reference to the array of instance_geometry elements. + */ + domInstance_geometry_Array &getInstance_geometry_array() { return elemInstance_geometry_array; } + /** + * Gets the instance_geometry element array. + * @return Returns a constant reference to the array of instance_geometry elements. + */ + const domInstance_geometry_Array &getInstance_geometry_array() const { return elemInstance_geometry_array; } + /** + * Gets the instance_light element array. + * @return Returns a reference to the array of instance_light elements. + */ + domInstance_light_Array &getInstance_light_array() { return elemInstance_light_array; } + /** + * Gets the instance_light element array. + * @return Returns a constant reference to the array of instance_light elements. + */ + const domInstance_light_Array &getInstance_light_array() const { return elemInstance_light_array; } + /** + * Gets the instance_node element array. + * @return Returns a reference to the array of instance_node elements. + */ + domInstance_node_Array &getInstance_node_array() { return elemInstance_node_array; } + /** + * Gets the instance_node element array. + * @return Returns a constant reference to the array of instance_node elements. + */ + const domInstance_node_Array &getInstance_node_array() const { return elemInstance_node_array; } + /** + * Gets the node element array. + * @return Returns a reference to the array of node elements. + */ + domNode_Array &getNode_array() { return elemNode_array; } + /** + * Gets the node element array. + * @return Returns a constant reference to the array of node elements. + */ + const domNode_Array &getNode_array() const { return elemNode_array; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } + /** + * Gets the _contents array. + * @return Returns a reference to the _contents element array. + */ + daeElementRefArray &getContents() { return _contents; } + /** + * Gets the _contents array. + * @return Returns a constant reference to the _contents element array. + */ + const daeElementRefArray &getContents() const { return _contents; } + +protected: + /** + * Constructor + */ + domNode() : attrId(), attrName(), attrSid(), attrType(), attrLayer(), elemAsset(), elemLookat_array(), elemMatrix_array(), elemRotate_array(), elemScale_array(), elemSkew_array(), elemTranslate_array(), elemInstance_camera_array(), elemInstance_controller_array(), elemInstance_geometry_array(), elemInstance_light_array(), elemInstance_node_array(), elemNode_array(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domNode() {} + /** + * Copy Constructor + */ + domNode( const domNode &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domNode &operator=( const domNode &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domP.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domP.h new file mode 100644 index 00000000..f4f95418 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domP.h @@ -0,0 +1,94 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domP_h__ +#define __domP_h__ + +#include +#include + + +/** + * The p element represents primitive data for the primitive types (lines, + * linestrips, polygons, polylist, triangles, trifans, tristrips). The p + * element contains indices that reference into the parent's source elements + * referenced by the input elements. + */ +class domP : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::P; } + +protected: // Value + /** + * The domListOfUInts value of the text data of this element. + */ + domListOfUInts _value; + +public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domListOfUInts reference of the _value array. + */ + domListOfUInts &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domListOfUInts reference of the _value array. + */ + const domListOfUInts &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domListOfUInts &val ) { _value = val; } + +protected: + /** + * Constructor + */ + domP() : _value() {} + /** + * Destructor + */ + virtual ~domP() {} + /** + * Copy Constructor + */ + domP( const domP &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domP &operator=( const domP &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domParam.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domParam.h new file mode 100644 index 00000000..83e222e7 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domParam.h @@ -0,0 +1,156 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domParam_h__ +#define __domParam_h__ + +#include +#include + + +/** + * The param element declares parametric information regarding its parent + * element. + */ +class domParam : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::PARAM; } +protected: // Attributes +/** + * The name attribute is the text string name of this element. Optional attribute. + */ + xsNCName attrName; +/** + * The sid attribute is a text string value containing the sub-identifier + * of this element. This value must be unique within the scope of the parent + * element. Optional attribute. + */ + xsNCName attrSid; +/** + * The semantic attribute is the user-defined meaning of the parameter. Optional + * attribute. + */ + xsNMTOKEN attrSemantic; +/** + * The type attribute indicates the type of the value data. This text string + * must be understood by the application. Required attribute. + */ + xsNMTOKEN attrType; + +protected: // Value + /** + * The xsString value of the text data of this element. + */ + xsString _value; + +public: //Accessors and Mutators + /** + * Gets the name attribute. + * @return Returns a xsNCName of the name attribute. + */ + xsNCName getName() const { return attrName; } + /** + * Sets the name attribute. + * @param atName The new value for the name attribute. + */ + void setName( xsNCName atName ) { *(daeStringRef*)&attrName = atName; + _validAttributeArray[0] = true; } + + /** + * Gets the sid attribute. + * @return Returns a xsNCName of the sid attribute. + */ + xsNCName getSid() const { return attrSid; } + /** + * Sets the sid attribute. + * @param atSid The new value for the sid attribute. + */ + void setSid( xsNCName atSid ) { *(daeStringRef*)&attrSid = atSid; + _validAttributeArray[1] = true; } + + /** + * Gets the semantic attribute. + * @return Returns a xsNMTOKEN of the semantic attribute. + */ + xsNMTOKEN getSemantic() const { return attrSemantic; } + /** + * Sets the semantic attribute. + * @param atSemantic The new value for the semantic attribute. + */ + void setSemantic( xsNMTOKEN atSemantic ) { *(daeStringRef*)&attrSemantic = atSemantic; + _validAttributeArray[2] = true; } + + /** + * Gets the type attribute. + * @return Returns a xsNMTOKEN of the type attribute. + */ + xsNMTOKEN getType() const { return attrType; } + /** + * Sets the type attribute. + * @param atType The new value for the type attribute. + */ + void setType( xsNMTOKEN atType ) { *(daeStringRef*)&attrType = atType; + _validAttributeArray[3] = true; } + + /** + * Gets the value of this element. + * @return Returns a xsString of the value. + */ + xsString getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( xsString val ) { *(daeStringRef*)&_value = val; } + +protected: + /** + * Constructor + */ + domParam() : attrName(), attrSid(), attrSemantic(), attrType(), _value() {} + /** + * Destructor + */ + virtual ~domParam() {} + /** + * Copy Constructor + */ + domParam( const domParam &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domParam &operator=( const domParam &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domPhysics_material.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domPhysics_material.h new file mode 100644 index 00000000..01b8cf9e --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domPhysics_material.h @@ -0,0 +1,247 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domPhysics_material_h__ +#define __domPhysics_material_h__ + +#include +#include + +#include +#include +#include +#include + +/** + * This element defines the physical properties of an object. It contains + * a technique/profile with parameters. The COMMON profile defines the built-in + * names, such as static_friction. + */ +class domPhysics_material : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::PHYSICS_MATERIAL; } +public: + class domTechnique_common; + + typedef daeSmartRef domTechnique_commonRef; + typedef daeTArray domTechnique_common_Array; + +/** + * The technique_common element specifies the physics_material information + * for the common profile which all COLLADA implementations need to support. + */ + class domTechnique_common : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::TECHNIQUE_COMMON; } + + protected: // Elements +/** + * Dynamic friction coefficient @see domDynamic_friction + */ + domTargetableFloatRef elemDynamic_friction; +/** + * The proportion of the kinetic energy preserved in the impact (typically + * ranges from 0.0 to 1.0) @see domRestitution + */ + domTargetableFloatRef elemRestitution; +/** + * Static friction coefficient @see domStatic_friction + */ + domTargetableFloatRef elemStatic_friction; + + public: //Accessors and Mutators + /** + * Gets the dynamic_friction element. + * @return a daeSmartRef to the dynamic_friction element. + */ + const domTargetableFloatRef getDynamic_friction() const { return elemDynamic_friction; } + /** + * Gets the restitution element. + * @return a daeSmartRef to the restitution element. + */ + const domTargetableFloatRef getRestitution() const { return elemRestitution; } + /** + * Gets the static_friction element. + * @return a daeSmartRef to the static_friction element. + */ + const domTargetableFloatRef getStatic_friction() const { return elemStatic_friction; } + protected: + /** + * Constructor + */ + domTechnique_common() : elemDynamic_friction(), elemRestitution(), elemStatic_friction() {} + /** + * Destructor + */ + virtual ~domTechnique_common() {} + /** + * Copy Constructor + */ + domTechnique_common( const domTechnique_common &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domTechnique_common &operator=( const domTechnique_common &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + +protected: // Attributes +/** + * The id attribute is a text string containing the unique identifier of + * this element. This value must be unique within the instance document. + * Optional attribute. + */ + xsID attrId; +/** + * The name attribute is the text string name of this element. Optional attribute. + */ + xsNCName attrName; + +protected: // Elements +/** + * The physics_material element may contain an asset element. @see domAsset + */ + domAssetRef elemAsset; +/** + * The technique_common element specifies the physics_material information + * for the common profile which all COLLADA implementations need to support. + * @see domTechnique_common + */ + domTechnique_commonRef elemTechnique_common; +/** + * This element may contain any number of non-common profile techniques. + * @see domTechnique + */ + domTechnique_Array elemTechnique_array; +/** + * The extra element may appear any number of times. @see domExtra + */ + domExtra_Array elemExtra_array; + +public: //Accessors and Mutators + /** + * Gets the id attribute. + * @return Returns a xsID of the id attribute. + */ + xsID getId() const { return attrId; } + /** + * Sets the id attribute. + * @param atId The new value for the id attribute. + */ + void setId( xsID atId ) { *(daeStringRef*)&attrId = atId; + _validAttributeArray[0] = true; } + + /** + * Gets the name attribute. + * @return Returns a xsNCName of the name attribute. + */ + xsNCName getName() const { return attrName; } + /** + * Sets the name attribute. + * @param atName The new value for the name attribute. + */ + void setName( xsNCName atName ) { *(daeStringRef*)&attrName = atName; + _validAttributeArray[1] = true; } + + /** + * Gets the asset element. + * @return a daeSmartRef to the asset element. + */ + const domAssetRef getAsset() const { return elemAsset; } + /** + * Gets the technique_common element. + * @return a daeSmartRef to the technique_common element. + */ + const domTechnique_commonRef getTechnique_common() const { return elemTechnique_common; } + /** + * Gets the technique element array. + * @return Returns a reference to the array of technique elements. + */ + domTechnique_Array &getTechnique_array() { return elemTechnique_array; } + /** + * Gets the technique element array. + * @return Returns a constant reference to the array of technique elements. + */ + const domTechnique_Array &getTechnique_array() const { return elemTechnique_array; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } +protected: + /** + * Constructor + */ + domPhysics_material() : attrId(), attrName(), elemAsset(), elemTechnique_common(), elemTechnique_array(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domPhysics_material() {} + /** + * Copy Constructor + */ + domPhysics_material( const domPhysics_material &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domPhysics_material &operator=( const domPhysics_material &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domPhysics_model.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domPhysics_model.h new file mode 100644 index 00000000..54a1d6f0 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domPhysics_model.h @@ -0,0 +1,180 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domPhysics_model_h__ +#define __domPhysics_model_h__ + +#include +#include + +#include +#include +#include +#include +#include + +/** + * This element allows for building complex combinations of rigid-bodies and + * constraints that may be instantiated multiple times. + */ +class domPhysics_model : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::PHYSICS_MODEL; } +protected: // Attributes +/** + * The id attribute is a text string containing the unique identifier of + * this element. This value must be unique within the instance document. + * Optional attribute. + */ + xsID attrId; +/** + * The name attribute is the text string name of this element. Optional attribute. + */ + xsNCName attrName; + +protected: // Elements +/** + * The physics_model element may contain an asset element. @see domAsset + */ + domAssetRef elemAsset; +/** + * The physics_model may define any number of rigid_body elements. @see + * domRigid_body + */ + domRigid_body_Array elemRigid_body_array; +/** + * The physics_model may define any number of rigid_constraint elements. + * @see domRigid_constraint + */ + domRigid_constraint_Array elemRigid_constraint_array; +/** + * The physics_model may instance any number of other physics_model elements. + * @see domInstance_physics_model + */ + domInstance_physics_model_Array elemInstance_physics_model_array; +/** + * The extra element may appear any number of times. @see domExtra + */ + domExtra_Array elemExtra_array; + +public: //Accessors and Mutators + /** + * Gets the id attribute. + * @return Returns a xsID of the id attribute. + */ + xsID getId() const { return attrId; } + /** + * Sets the id attribute. + * @param atId The new value for the id attribute. + */ + void setId( xsID atId ) { *(daeStringRef*)&attrId = atId; + _validAttributeArray[0] = true; } + + /** + * Gets the name attribute. + * @return Returns a xsNCName of the name attribute. + */ + xsNCName getName() const { return attrName; } + /** + * Sets the name attribute. + * @param atName The new value for the name attribute. + */ + void setName( xsNCName atName ) { *(daeStringRef*)&attrName = atName; + _validAttributeArray[1] = true; } + + /** + * Gets the asset element. + * @return a daeSmartRef to the asset element. + */ + const domAssetRef getAsset() const { return elemAsset; } + /** + * Gets the rigid_body element array. + * @return Returns a reference to the array of rigid_body elements. + */ + domRigid_body_Array &getRigid_body_array() { return elemRigid_body_array; } + /** + * Gets the rigid_body element array. + * @return Returns a constant reference to the array of rigid_body elements. + */ + const domRigid_body_Array &getRigid_body_array() const { return elemRigid_body_array; } + /** + * Gets the rigid_constraint element array. + * @return Returns a reference to the array of rigid_constraint elements. + */ + domRigid_constraint_Array &getRigid_constraint_array() { return elemRigid_constraint_array; } + /** + * Gets the rigid_constraint element array. + * @return Returns a constant reference to the array of rigid_constraint elements. + */ + const domRigid_constraint_Array &getRigid_constraint_array() const { return elemRigid_constraint_array; } + /** + * Gets the instance_physics_model element array. + * @return Returns a reference to the array of instance_physics_model elements. + */ + domInstance_physics_model_Array &getInstance_physics_model_array() { return elemInstance_physics_model_array; } + /** + * Gets the instance_physics_model element array. + * @return Returns a constant reference to the array of instance_physics_model elements. + */ + const domInstance_physics_model_Array &getInstance_physics_model_array() const { return elemInstance_physics_model_array; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } +protected: + /** + * Constructor + */ + domPhysics_model() : attrId(), attrName(), elemAsset(), elemRigid_body_array(), elemRigid_constraint_array(), elemInstance_physics_model_array(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domPhysics_model() {} + /** + * Copy Constructor + */ + domPhysics_model( const domPhysics_model &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domPhysics_model &operator=( const domPhysics_model &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domPhysics_scene.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domPhysics_scene.h new file mode 100644 index 00000000..7df8d665 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domPhysics_scene.h @@ -0,0 +1,263 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domPhysics_scene_h__ +#define __domPhysics_scene_h__ + +#include +#include + +#include +#include +#include +#include +#include +#include +#include + +class domPhysics_scene : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::PHYSICS_SCENE; } +public: + class domTechnique_common; + + typedef daeSmartRef domTechnique_commonRef; + typedef daeTArray domTechnique_common_Array; + +/** + * The technique_common element specifies the physics_scene information for + * the common profile which all COLLADA implementations need to support. + */ + class domTechnique_common : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::TECHNIQUE_COMMON; } + + protected: // Elements +/** + * The gravity vector to use for the physics_scene. @see domGravity + */ + domTargetableFloat3Ref elemGravity; +/** + * The time_step for the physics_scene. @see domTime_step + */ + domTargetableFloatRef elemTime_step; + + public: //Accessors and Mutators + /** + * Gets the gravity element. + * @return a daeSmartRef to the gravity element. + */ + const domTargetableFloat3Ref getGravity() const { return elemGravity; } + /** + * Gets the time_step element. + * @return a daeSmartRef to the time_step element. + */ + const domTargetableFloatRef getTime_step() const { return elemTime_step; } + protected: + /** + * Constructor + */ + domTechnique_common() : elemGravity(), elemTime_step() {} + /** + * Destructor + */ + virtual ~domTechnique_common() {} + /** + * Copy Constructor + */ + domTechnique_common( const domTechnique_common &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domTechnique_common &operator=( const domTechnique_common &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + +protected: // Attributes +/** + * The id attribute is a text string containing the unique identifier of + * this element. This value must be unique within the instance document. + * Optional attribute. + */ + xsID attrId; +/** + * The name attribute is the text string name of this element. Optional attribute. + */ + xsNCName attrName; + +protected: // Elements +/** + * The physics_scene element may contain an asset element. @see domAsset + */ + domAssetRef elemAsset; +/** + * There may be any number of instance_force_field elements. @see domInstance_force_field + */ + domInstance_force_field_Array elemInstance_force_field_array; +/** + * There may be any number of instance_physics_model elements. @see domInstance_physics_model + */ + domInstance_physics_model_Array elemInstance_physics_model_array; +/** + * The technique_common element specifies the physics_scene information for + * the common profile which all COLLADA implementations need to support. + * @see domTechnique_common + */ + domTechnique_commonRef elemTechnique_common; +/** + * This element may contain any number of non-common profile techniques. + * @see domTechnique + */ + domTechnique_Array elemTechnique_array; +/** + * The extra element may appear any number of times. @see domExtra + */ + domExtra_Array elemExtra_array; + +public: //Accessors and Mutators + /** + * Gets the id attribute. + * @return Returns a xsID of the id attribute. + */ + xsID getId() const { return attrId; } + /** + * Sets the id attribute. + * @param atId The new value for the id attribute. + */ + void setId( xsID atId ) { *(daeStringRef*)&attrId = atId; + _validAttributeArray[0] = true; } + + /** + * Gets the name attribute. + * @return Returns a xsNCName of the name attribute. + */ + xsNCName getName() const { return attrName; } + /** + * Sets the name attribute. + * @param atName The new value for the name attribute. + */ + void setName( xsNCName atName ) { *(daeStringRef*)&attrName = atName; + _validAttributeArray[1] = true; } + + /** + * Gets the asset element. + * @return a daeSmartRef to the asset element. + */ + const domAssetRef getAsset() const { return elemAsset; } + /** + * Gets the instance_force_field element array. + * @return Returns a reference to the array of instance_force_field elements. + */ + domInstance_force_field_Array &getInstance_force_field_array() { return elemInstance_force_field_array; } + /** + * Gets the instance_force_field element array. + * @return Returns a constant reference to the array of instance_force_field elements. + */ + const domInstance_force_field_Array &getInstance_force_field_array() const { return elemInstance_force_field_array; } + /** + * Gets the instance_physics_model element array. + * @return Returns a reference to the array of instance_physics_model elements. + */ + domInstance_physics_model_Array &getInstance_physics_model_array() { return elemInstance_physics_model_array; } + /** + * Gets the instance_physics_model element array. + * @return Returns a constant reference to the array of instance_physics_model elements. + */ + const domInstance_physics_model_Array &getInstance_physics_model_array() const { return elemInstance_physics_model_array; } + /** + * Gets the technique_common element. + * @return a daeSmartRef to the technique_common element. + */ + const domTechnique_commonRef getTechnique_common() const { return elemTechnique_common; } + /** + * Gets the technique element array. + * @return Returns a reference to the array of technique elements. + */ + domTechnique_Array &getTechnique_array() { return elemTechnique_array; } + /** + * Gets the technique element array. + * @return Returns a constant reference to the array of technique elements. + */ + const domTechnique_Array &getTechnique_array() const { return elemTechnique_array; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } +protected: + /** + * Constructor + */ + domPhysics_scene() : attrId(), attrName(), elemAsset(), elemInstance_force_field_array(), elemInstance_physics_model_array(), elemTechnique_common(), elemTechnique_array(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domPhysics_scene() {} + /** + * Copy Constructor + */ + domPhysics_scene( const domPhysics_scene &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domPhysics_scene &operator=( const domPhysics_scene &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domPlane.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domPlane.h new file mode 100644 index 00000000..d9cb475a --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domPlane.h @@ -0,0 +1,174 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domPlane_h__ +#define __domPlane_h__ + +#include +#include + +#include + +/** + * An infinite plane primitive. + */ +class domPlane : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::PLANE; } +public: + class domEquation; + + typedef daeSmartRef domEquationRef; + typedef daeTArray domEquation_Array; + +/** + * 4 float values that represent the coefficients for the plane’s equation: + * Ax + By + Cz + D = 0 + */ + class domEquation : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::EQUATION; } + + protected: // Value + /** + * The domFloat4 value of the text data of this element. + */ + domFloat4 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domFloat4 reference of the _value array. + */ + domFloat4 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domFloat4 reference of the _value array. + */ + const domFloat4 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domFloat4 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domEquation() : _value() {} + /** + * Destructor + */ + virtual ~domEquation() {} + /** + * Copy Constructor + */ + domEquation( const domEquation &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domEquation &operator=( const domEquation &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + + +protected: // Elements +/** + * 4 float values that represent the coefficients for the plane’s equation: + * Ax + By + Cz + D = 0 @see domEquation + */ + domEquationRef elemEquation; +/** + * The extra element may appear any number of times. @see domExtra + */ + domExtra_Array elemExtra_array; + +public: //Accessors and Mutators + /** + * Gets the equation element. + * @return a daeSmartRef to the equation element. + */ + const domEquationRef getEquation() const { return elemEquation; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } +protected: + /** + * Constructor + */ + domPlane() : elemEquation(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domPlane() {} + /** + * Copy Constructor + */ + domPlane( const domPlane &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domPlane &operator=( const domPlane &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domPolygons.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domPolygons.h new file mode 100644 index 00000000..2c2610dd --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domPolygons.h @@ -0,0 +1,366 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domPolygons_h__ +#define __domPolygons_h__ + +#include +#include + +#include +#include +#include + +/** + * The polygons element provides the information needed to bind vertex attributes + * together and then organize those vertices into individual polygons. The + * polygons described can contain arbitrary numbers of vertices. These polygons + * may be self intersecting and may also contain holes. + */ +class domPolygons : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::POLYGONS; } +public: + class domPh; + + typedef daeSmartRef domPhRef; + typedef daeTArray domPh_Array; + +/** + * The ph element descripes a polygon with holes. + */ + class domPh : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::PH; } + public: + class domH; + + typedef daeSmartRef domHRef; + typedef daeTArray domH_Array; + +/** + * The h element represents a hole in the polygon specified. There must be + * at least one h element. + */ + class domH : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::H; } + + protected: // Value + /** + * The domListOfUInts value of the text data of this element. + */ + domListOfUInts _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domListOfUInts reference of the _value array. + */ + domListOfUInts &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domListOfUInts reference of the _value array. + */ + const domListOfUInts &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domListOfUInts &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domH() : _value() {} + /** + * Destructor + */ + virtual ~domH() {} + /** + * Copy Constructor + */ + domH( const domH &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domH &operator=( const domH &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + + + protected: // Elements +/** + * Theere may only be one p element. @see domP + */ + domPRef elemP; +/** + * The h element represents a hole in the polygon specified. There must be + * at least one h element. @see domH + */ + domH_Array elemH_array; + + public: //Accessors and Mutators + /** + * Gets the p element. + * @return a daeSmartRef to the p element. + */ + const domPRef getP() const { return elemP; } + /** + * Gets the h element array. + * @return Returns a reference to the array of h elements. + */ + domH_Array &getH_array() { return elemH_array; } + /** + * Gets the h element array. + * @return Returns a constant reference to the array of h elements. + */ + const domH_Array &getH_array() const { return elemH_array; } + protected: + /** + * Constructor + */ + domPh() : elemP(), elemH_array() {} + /** + * Destructor + */ + virtual ~domPh() {} + /** + * Copy Constructor + */ + domPh( const domPh &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domPh &operator=( const domPh &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + +protected: // Attributes +/** + * The name attribute is the text string name of this element. Optional attribute. + */ + xsNCName attrName; +/** + * The count attribute indicates the number of polygon primitives. Required + * attribute. + */ + domUint attrCount; +/** + * The material attribute declares a symbol for a material. This symbol is + * bound to a material at the time of instantiation. If the material attribute + * is not specified then the lighting and shading results are application + * defined. Optional attribute. + */ + xsNCName attrMaterial; + +protected: // Elements +/** + * The input element may occur any number of times. This input is a local + * input with the offset and set attributes. @see domInput + */ + domInputLocalOffset_Array elemInput_array; +/** + * The p element may occur any number of times. @see domP + */ + domP_Array elemP_array; +/** + * The ph element descripes a polygon with holes. @see domPh + */ + domPh_Array elemPh_array; +/** + * The extra element may appear any number of times. @see domExtra + */ + domExtra_Array elemExtra_array; + /** + * Used to preserve order in elements that do not specify strict sequencing of sub-elements. + */ + daeElementRefArray _contents; + /** + * Used to preserve order in elements that have a complex content model. + */ + daeUIntArray _contentsOrder; + + +public: //Accessors and Mutators + /** + * Gets the name attribute. + * @return Returns a xsNCName of the name attribute. + */ + xsNCName getName() const { return attrName; } + /** + * Sets the name attribute. + * @param atName The new value for the name attribute. + */ + void setName( xsNCName atName ) { *(daeStringRef*)&attrName = atName; + _validAttributeArray[0] = true; } + + /** + * Gets the count attribute. + * @return Returns a domUint of the count attribute. + */ + domUint getCount() const { return attrCount; } + /** + * Sets the count attribute. + * @param atCount The new value for the count attribute. + */ + void setCount( domUint atCount ) { attrCount = atCount; + _validAttributeArray[1] = true; } + + /** + * Gets the material attribute. + * @return Returns a xsNCName of the material attribute. + */ + xsNCName getMaterial() const { return attrMaterial; } + /** + * Sets the material attribute. + * @param atMaterial The new value for the material attribute. + */ + void setMaterial( xsNCName atMaterial ) { *(daeStringRef*)&attrMaterial = atMaterial; + _validAttributeArray[2] = true; } + + /** + * Gets the input element array. + * @return Returns a reference to the array of input elements. + */ + domInputLocalOffset_Array &getInput_array() { return elemInput_array; } + /** + * Gets the input element array. + * @return Returns a constant reference to the array of input elements. + */ + const domInputLocalOffset_Array &getInput_array() const { return elemInput_array; } + /** + * Gets the p element array. + * @return Returns a reference to the array of p elements. + */ + domP_Array &getP_array() { return elemP_array; } + /** + * Gets the p element array. + * @return Returns a constant reference to the array of p elements. + */ + const domP_Array &getP_array() const { return elemP_array; } + /** + * Gets the ph element array. + * @return Returns a reference to the array of ph elements. + */ + domPh_Array &getPh_array() { return elemPh_array; } + /** + * Gets the ph element array. + * @return Returns a constant reference to the array of ph elements. + */ + const domPh_Array &getPh_array() const { return elemPh_array; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } + /** + * Gets the _contents array. + * @return Returns a reference to the _contents element array. + */ + daeElementRefArray &getContents() { return _contents; } + /** + * Gets the _contents array. + * @return Returns a constant reference to the _contents element array. + */ + const daeElementRefArray &getContents() const { return _contents; } + +protected: + /** + * Constructor + */ + domPolygons() : attrName(), attrCount(), attrMaterial(), elemInput_array(), elemP_array(), elemPh_array(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domPolygons() {} + /** + * Copy Constructor + */ + domPolygons( const domPolygons &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domPolygons &operator=( const domPolygons &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domPolylist.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domPolylist.h new file mode 100644 index 00000000..468945c5 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domPolylist.h @@ -0,0 +1,259 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domPolylist_h__ +#define __domPolylist_h__ + +#include +#include + +#include +#include +#include + +/** + * The polylist element provides the information needed to bind vertex attributes + * together and then organize those vertices into individual polygons. The + * polygons described in polylist can contain arbitrary numbers of vertices. + * Unlike the polygons element, the polylist element cannot contain polygons + * with holes. + */ +class domPolylist : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::POLYLIST; } +public: + class domVcount; + + typedef daeSmartRef domVcountRef; + typedef daeTArray domVcount_Array; + +/** + * The vcount element contains a list of integers describing the number of + * sides for each polygon described by the polylist element. The vcount element + * may occur once. + */ + class domVcount : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::VCOUNT; } + + protected: // Value + /** + * The domListOfUInts value of the text data of this element. + */ + domListOfUInts _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domListOfUInts reference of the _value array. + */ + domListOfUInts &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domListOfUInts reference of the _value array. + */ + const domListOfUInts &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domListOfUInts &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domVcount() : _value() {} + /** + * Destructor + */ + virtual ~domVcount() {} + /** + * Copy Constructor + */ + domVcount( const domVcount &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domVcount &operator=( const domVcount &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + +protected: // Attributes +/** + * The name attribute is the text string name of this element. Optional attribute. + */ + xsNCName attrName; +/** + * The count attribute indicates the number of polygon primitives. Required + * attribute. + */ + domUint attrCount; +/** + * The material attribute declares a symbol for a material. This symbol is + * bound to a material at the time of instantiation. If the material attribute + * is not specified then the lighting and shading results are application + * defined. Optional attribute. + */ + xsNCName attrMaterial; + +protected: // Elements +/** + * The input element may occur any number of times. This input is a local + * input with the offset and set attributes. @see domInput + */ + domInputLocalOffset_Array elemInput_array; +/** + * The vcount element contains a list of integers describing the number of + * sides for each polygon described by the polylist element. The vcount element + * may occur once. @see domVcount + */ + domVcountRef elemVcount; +/** + * The p element may occur once. @see domP + */ + domPRef elemP; +/** + * The extra element may appear any number of times. @see domExtra + */ + domExtra_Array elemExtra_array; + +public: //Accessors and Mutators + /** + * Gets the name attribute. + * @return Returns a xsNCName of the name attribute. + */ + xsNCName getName() const { return attrName; } + /** + * Sets the name attribute. + * @param atName The new value for the name attribute. + */ + void setName( xsNCName atName ) { *(daeStringRef*)&attrName = atName; + _validAttributeArray[0] = true; } + + /** + * Gets the count attribute. + * @return Returns a domUint of the count attribute. + */ + domUint getCount() const { return attrCount; } + /** + * Sets the count attribute. + * @param atCount The new value for the count attribute. + */ + void setCount( domUint atCount ) { attrCount = atCount; + _validAttributeArray[1] = true; } + + /** + * Gets the material attribute. + * @return Returns a xsNCName of the material attribute. + */ + xsNCName getMaterial() const { return attrMaterial; } + /** + * Sets the material attribute. + * @param atMaterial The new value for the material attribute. + */ + void setMaterial( xsNCName atMaterial ) { *(daeStringRef*)&attrMaterial = atMaterial; + _validAttributeArray[2] = true; } + + /** + * Gets the input element array. + * @return Returns a reference to the array of input elements. + */ + domInputLocalOffset_Array &getInput_array() { return elemInput_array; } + /** + * Gets the input element array. + * @return Returns a constant reference to the array of input elements. + */ + const domInputLocalOffset_Array &getInput_array() const { return elemInput_array; } + /** + * Gets the vcount element. + * @return a daeSmartRef to the vcount element. + */ + const domVcountRef getVcount() const { return elemVcount; } + /** + * Gets the p element. + * @return a daeSmartRef to the p element. + */ + const domPRef getP() const { return elemP; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } +protected: + /** + * Constructor + */ + domPolylist() : attrName(), attrCount(), attrMaterial(), elemInput_array(), elemVcount(), elemP(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domPolylist() {} + /** + * Copy Constructor + */ + domPolylist( const domPolylist &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domPolylist &operator=( const domPolylist &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domProfile_CG.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domProfile_CG.h new file mode 100644 index 00000000..bcdcad35 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domProfile_CG.h @@ -0,0 +1,1248 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domProfile_CG_h__ +#define __domProfile_CG_h__ + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/** + * Opens a block of CG platform-specific data types and technique declarations. + */ +class domProfile_CG : public domFx_profile_abstract +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::PROFILE_CG; } +public: + class domTechnique; + + typedef daeSmartRef domTechniqueRef; + typedef daeTArray domTechnique_Array; + +/** + * Holds a description of the textures, samplers, shaders, parameters, and + * passes necessary for rendering this effect using one method. + */ + class domTechnique : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::TECHNIQUE; } + public: + class domPass; + + typedef daeSmartRef domPassRef; + typedef daeTArray domPass_Array; + +/** + * A static declaration of all the render states, shaders, and settings for + * one rendering pipeline. + */ + class domPass : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::PASS; } + public: + class domDraw; + + typedef daeSmartRef domDrawRef; + typedef daeTArray domDraw_Array; + + class domDraw : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::DRAW; } + + protected: // Value + /** + * The domFx_draw_common value of the text data of this element. + */ + domFx_draw_common _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a domFx_draw_common of the value. + */ + domFx_draw_common getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( domFx_draw_common val ) { _value = val; } + + protected: + /** + * Constructor + */ + domDraw() : _value() {} + /** + * Destructor + */ + virtual ~domDraw() {} + /** + * Copy Constructor + */ + domDraw( const domDraw &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domDraw &operator=( const domDraw &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domShader; + + typedef daeSmartRef domShaderRef; + typedef daeTArray domShader_Array; + +/** + * Declare and prepare a shader for execution in the rendering pipeline of + * a pass. + */ + class domShader : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::SHADER; } + public: + class domCompiler_target; + + typedef daeSmartRef domCompiler_targetRef; + typedef daeTArray domCompiler_target_Array; + + class domCompiler_target : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::COMPILER_TARGET; } + + protected: // Value + /** + * The xsNMTOKEN value of the text data of this element. + */ + xsNMTOKEN _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return Returns a xsNMTOKEN of the value. + */ + xsNMTOKEN getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( xsNMTOKEN val ) { *(daeStringRef*)&_value = val; } + + protected: + /** + * Constructor + */ + domCompiler_target() : _value() {} + /** + * Destructor + */ + virtual ~domCompiler_target() {} + /** + * Copy Constructor + */ + domCompiler_target( const domCompiler_target &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domCompiler_target &operator=( const domCompiler_target &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domCompiler_options; + + typedef daeSmartRef domCompiler_optionsRef; + typedef daeTArray domCompiler_options_Array; + +/** + * A string containing command-line operations for the shader compiler. + */ + class domCompiler_options : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::COMPILER_OPTIONS; } + + protected: // Value + /** + * The xsString value of the text data of this element. + */ + xsString _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return Returns a xsString of the value. + */ + xsString getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( xsString val ) { *(daeStringRef*)&_value = val; } + + protected: + /** + * Constructor + */ + domCompiler_options() : _value() {} + /** + * Destructor + */ + virtual ~domCompiler_options() {} + /** + * Copy Constructor + */ + domCompiler_options( const domCompiler_options &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domCompiler_options &operator=( const domCompiler_options &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domName; + + typedef daeSmartRef domNameRef; + typedef daeTArray domName_Array; + +/** + * The entry symbol for the shader function. + */ + class domName : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::NAME; } + protected: // Attribute + xsNCName attrSource; + + protected: // Value + /** + * The xsNCName value of the text data of this element. + */ + xsNCName _value; + + public: //Accessors and Mutators + /** + * Gets the source attribute. + * @return Returns a xsNCName of the source attribute. + */ + xsNCName getSource() const { return attrSource; } + /** + * Sets the source attribute. + * @param atSource The new value for the source attribute. + */ + void setSource( xsNCName atSource ) { *(daeStringRef*)&attrSource = atSource; + _validAttributeArray[0] = true; } + + /** + * Gets the value of this element. + * @return Returns a xsNCName of the value. + */ + xsNCName getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( xsNCName val ) { *(daeStringRef*)&_value = val; } + + protected: + /** + * Constructor + */ + domName() : attrSource(), _value() {} + /** + * Destructor + */ + virtual ~domName() {} + /** + * Copy Constructor + */ + domName( const domName &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domName &operator=( const domName &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domBind; + + typedef daeSmartRef domBindRef; + typedef daeTArray domBind_Array; + +/** + * Binds values to uniform inputs of a shader. + */ + class domBind : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::BIND; } + public: + class domParam; + + typedef daeSmartRef domParamRef; + typedef daeTArray domParam_Array; + +/** + * References a predefined parameter in shader binding declarations. + */ + class domParam : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::PARAM; } + protected: // Attribute + xsNCName attrRef; + + + public: //Accessors and Mutators + /** + * Gets the ref attribute. + * @return Returns a xsNCName of the ref attribute. + */ + xsNCName getRef() const { return attrRef; } + /** + * Sets the ref attribute. + * @param atRef The new value for the ref attribute. + */ + void setRef( xsNCName atRef ) { *(daeStringRef*)&attrRef = atRef; + _validAttributeArray[0] = true; } + + protected: + /** + * Constructor + */ + domParam() : attrRef() {} + /** + * Destructor + */ + virtual ~domParam() {} + /** + * Copy Constructor + */ + domParam( const domParam &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domParam &operator=( const domParam &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + + protected: // Attribute +/** + * The identifier for a uniform input parameter to the shader (a formal function + * parameter or in-scope global) that will be bound to an external resource. + */ + xsNCName attrSymbol; + + protected: // Elements + domCg_param_typeRef elemCg_param_type; +/** + * References a predefined parameter in shader binding declarations. @see + * domParam + */ + domParamRef elemParam; + /** + * Used to preserve order in elements that do not specify strict sequencing of sub-elements. + */ + daeElementRefArray _contents; + /** + * Used to preserve order in elements that have a complex content model. + */ + daeUIntArray _contentsOrder; + + + public: //Accessors and Mutators + /** + * Gets the symbol attribute. + * @return Returns a xsNCName of the symbol attribute. + */ + xsNCName getSymbol() const { return attrSymbol; } + /** + * Sets the symbol attribute. + * @param atSymbol The new value for the symbol attribute. + */ + void setSymbol( xsNCName atSymbol ) { *(daeStringRef*)&attrSymbol = atSymbol; + _validAttributeArray[0] = true; } + + /** + * Gets the cg_param_type element. + * @return a daeSmartRef to the cg_param_type element. + */ + const domCg_param_typeRef getCg_param_type() const { return elemCg_param_type; } + /** + * Gets the param element. + * @return a daeSmartRef to the param element. + */ + const domParamRef getParam() const { return elemParam; } + /** + * Gets the _contents array. + * @return Returns a reference to the _contents element array. + */ + daeElementRefArray &getContents() { return _contents; } + /** + * Gets the _contents array. + * @return Returns a constant reference to the _contents element array. + */ + const daeElementRefArray &getContents() const { return _contents; } + + protected: + /** + * Constructor + */ + domBind() : attrSymbol(), elemCg_param_type(), elemParam() {} + /** + * Destructor + */ + virtual ~domBind() {} + /** + * Copy Constructor + */ + domBind( const domBind &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domBind &operator=( const domBind &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + + protected: // Attribute +/** + * In which pipeline stage this programmable shader is designed to execute, + * for example, VERTEX, FRAGMENT, etc. + */ + domCg_pipeline_stage attrStage; + + protected: // Elements + domFx_annotate_common_Array elemAnnotate_array; + domCompiler_targetRef elemCompiler_target; +/** + * A string containing command-line operations for the shader compiler. @see + * domCompiler_options + */ + domCompiler_optionsRef elemCompiler_options; +/** + * The entry symbol for the shader function. @see domName + */ + domNameRef elemName; +/** + * Binds values to uniform inputs of a shader. @see domBind + */ + domBind_Array elemBind_array; + + public: //Accessors and Mutators + /** + * Gets the stage attribute. + * @return Returns a domCg_pipeline_stage of the stage attribute. + */ + domCg_pipeline_stage getStage() const { return attrStage; } + /** + * Sets the stage attribute. + * @param atStage The new value for the stage attribute. + */ + void setStage( domCg_pipeline_stage atStage ) { attrStage = atStage; + _validAttributeArray[0] = true; } + + /** + * Gets the annotate element array. + * @return Returns a reference to the array of annotate elements. + */ + domFx_annotate_common_Array &getAnnotate_array() { return elemAnnotate_array; } + /** + * Gets the annotate element array. + * @return Returns a constant reference to the array of annotate elements. + */ + const domFx_annotate_common_Array &getAnnotate_array() const { return elemAnnotate_array; } + /** + * Gets the compiler_target element. + * @return a daeSmartRef to the compiler_target element. + */ + const domCompiler_targetRef getCompiler_target() const { return elemCompiler_target; } + /** + * Gets the compiler_options element. + * @return a daeSmartRef to the compiler_options element. + */ + const domCompiler_optionsRef getCompiler_options() const { return elemCompiler_options; } + /** + * Gets the name element. + * @return a daeSmartRef to the name element. + */ + const domNameRef getName() const { return elemName; } + /** + * Gets the bind element array. + * @return Returns a reference to the array of bind elements. + */ + domBind_Array &getBind_array() { return elemBind_array; } + /** + * Gets the bind element array. + * @return Returns a constant reference to the array of bind elements. + */ + const domBind_Array &getBind_array() const { return elemBind_array; } + protected: + /** + * Constructor + */ + domShader() : attrStage(), elemAnnotate_array(), elemCompiler_target(), elemCompiler_options(), elemName(), elemBind_array() {} + /** + * Destructor + */ + virtual ~domShader() {} + /** + * Copy Constructor + */ + domShader( const domShader &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domShader &operator=( const domShader &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + + protected: // Attribute +/** + * The sid attribute is a text string value containing the sub-identifier + * of this element. This value must be unique within the scope of the parent + * element. Optional attribute. + */ + xsNCName attrSid; + + protected: // Elements + domFx_annotate_common_Array elemAnnotate_array; + domFx_colortarget_common_Array elemColor_target_array; + domFx_depthtarget_common_Array elemDepth_target_array; + domFx_stenciltarget_common_Array elemStencil_target_array; + domFx_clearcolor_common_Array elemColor_clear_array; + domFx_cleardepth_common_Array elemDepth_clear_array; + domFx_clearstencil_common_Array elemStencil_clear_array; + domDrawRef elemDraw; + domGl_pipeline_settings_Array elemGl_pipeline_settings_array; +/** + * Declare and prepare a shader for execution in the rendering pipeline of + * a pass. @see domShader + */ + domShader_Array elemShader_array; + domExtra_Array elemExtra_array; + /** + * Used to preserve order in elements that do not specify strict sequencing of sub-elements. + */ + daeElementRefArray _contents; + /** + * Used to preserve order in elements that have a complex content model. + */ + daeUIntArray _contentsOrder; + + + public: //Accessors and Mutators + /** + * Gets the sid attribute. + * @return Returns a xsNCName of the sid attribute. + */ + xsNCName getSid() const { return attrSid; } + /** + * Sets the sid attribute. + * @param atSid The new value for the sid attribute. + */ + void setSid( xsNCName atSid ) { *(daeStringRef*)&attrSid = atSid; + _validAttributeArray[0] = true; } + + /** + * Gets the annotate element array. + * @return Returns a reference to the array of annotate elements. + */ + domFx_annotate_common_Array &getAnnotate_array() { return elemAnnotate_array; } + /** + * Gets the annotate element array. + * @return Returns a constant reference to the array of annotate elements. + */ + const domFx_annotate_common_Array &getAnnotate_array() const { return elemAnnotate_array; } + /** + * Gets the color_target element array. + * @return Returns a reference to the array of color_target elements. + */ + domFx_colortarget_common_Array &getColor_target_array() { return elemColor_target_array; } + /** + * Gets the color_target element array. + * @return Returns a constant reference to the array of color_target elements. + */ + const domFx_colortarget_common_Array &getColor_target_array() const { return elemColor_target_array; } + /** + * Gets the depth_target element array. + * @return Returns a reference to the array of depth_target elements. + */ + domFx_depthtarget_common_Array &getDepth_target_array() { return elemDepth_target_array; } + /** + * Gets the depth_target element array. + * @return Returns a constant reference to the array of depth_target elements. + */ + const domFx_depthtarget_common_Array &getDepth_target_array() const { return elemDepth_target_array; } + /** + * Gets the stencil_target element array. + * @return Returns a reference to the array of stencil_target elements. + */ + domFx_stenciltarget_common_Array &getStencil_target_array() { return elemStencil_target_array; } + /** + * Gets the stencil_target element array. + * @return Returns a constant reference to the array of stencil_target elements. + */ + const domFx_stenciltarget_common_Array &getStencil_target_array() const { return elemStencil_target_array; } + /** + * Gets the color_clear element array. + * @return Returns a reference to the array of color_clear elements. + */ + domFx_clearcolor_common_Array &getColor_clear_array() { return elemColor_clear_array; } + /** + * Gets the color_clear element array. + * @return Returns a constant reference to the array of color_clear elements. + */ + const domFx_clearcolor_common_Array &getColor_clear_array() const { return elemColor_clear_array; } + /** + * Gets the depth_clear element array. + * @return Returns a reference to the array of depth_clear elements. + */ + domFx_cleardepth_common_Array &getDepth_clear_array() { return elemDepth_clear_array; } + /** + * Gets the depth_clear element array. + * @return Returns a constant reference to the array of depth_clear elements. + */ + const domFx_cleardepth_common_Array &getDepth_clear_array() const { return elemDepth_clear_array; } + /** + * Gets the stencil_clear element array. + * @return Returns a reference to the array of stencil_clear elements. + */ + domFx_clearstencil_common_Array &getStencil_clear_array() { return elemStencil_clear_array; } + /** + * Gets the stencil_clear element array. + * @return Returns a constant reference to the array of stencil_clear elements. + */ + const domFx_clearstencil_common_Array &getStencil_clear_array() const { return elemStencil_clear_array; } + /** + * Gets the draw element. + * @return a daeSmartRef to the draw element. + */ + const domDrawRef getDraw() const { return elemDraw; } + /** + * Gets the gl_pipeline_settings element array. + * @return Returns a reference to the array of gl_pipeline_settings elements. + */ + domGl_pipeline_settings_Array &getGl_pipeline_settings_array() { return elemGl_pipeline_settings_array; } + /** + * Gets the gl_pipeline_settings element array. + * @return Returns a constant reference to the array of gl_pipeline_settings elements. + */ + const domGl_pipeline_settings_Array &getGl_pipeline_settings_array() const { return elemGl_pipeline_settings_array; } + /** + * Gets the shader element array. + * @return Returns a reference to the array of shader elements. + */ + domShader_Array &getShader_array() { return elemShader_array; } + /** + * Gets the shader element array. + * @return Returns a constant reference to the array of shader elements. + */ + const domShader_Array &getShader_array() const { return elemShader_array; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } + /** + * Gets the _contents array. + * @return Returns a reference to the _contents element array. + */ + daeElementRefArray &getContents() { return _contents; } + /** + * Gets the _contents array. + * @return Returns a constant reference to the _contents element array. + */ + const daeElementRefArray &getContents() const { return _contents; } + + protected: + /** + * Constructor + */ + domPass() : attrSid(), elemAnnotate_array(), elemColor_target_array(), elemDepth_target_array(), elemStencil_target_array(), elemColor_clear_array(), elemDepth_clear_array(), elemStencil_clear_array(), elemDraw(), elemGl_pipeline_settings_array(), elemShader_array(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domPass() {} + /** + * Copy Constructor + */ + domPass( const domPass &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domPass &operator=( const domPass &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + + protected: // Attributes +/** + * The id attribute is a text string containing the unique identifier of + * this element. This value must be unique within the instance document. + * Optional attribute. + */ + xsID attrId; +/** + * The sid attribute is a text string value containing the sub-identifier + * of this element. This value must be unique within the scope of the parent + * element. Optional attribute. + */ + xsNCName attrSid; + + protected: // Elements +/** + * The technique element may contain an asset element. @see domAsset + */ + domAssetRef elemAsset; + domFx_annotate_common_Array elemAnnotate_array; + domFx_code_profile_Array elemCode_array; + domFx_include_common_Array elemInclude_array; + domImage_Array elemImage_array; + domCg_newparam_Array elemNewparam_array; + domCg_setparam_Array elemSetparam_array; +/** + * A static declaration of all the render states, shaders, and settings for + * one rendering pipeline. @see domPass + */ + domPass_Array elemPass_array; + domExtra_Array elemExtra_array; + /** + * Used to preserve order in elements that do not specify strict sequencing of sub-elements. + */ + daeElementRefArray _contents; + /** + * Used to preserve order in elements that have a complex content model. + */ + daeUIntArray _contentsOrder; + + + public: //Accessors and Mutators + /** + * Gets the id attribute. + * @return Returns a xsID of the id attribute. + */ + xsID getId() const { return attrId; } + /** + * Sets the id attribute. + * @param atId The new value for the id attribute. + */ + void setId( xsID atId ) { *(daeStringRef*)&attrId = atId; + _validAttributeArray[0] = true; } + + /** + * Gets the sid attribute. + * @return Returns a xsNCName of the sid attribute. + */ + xsNCName getSid() const { return attrSid; } + /** + * Sets the sid attribute. + * @param atSid The new value for the sid attribute. + */ + void setSid( xsNCName atSid ) { *(daeStringRef*)&attrSid = atSid; + _validAttributeArray[1] = true; } + + /** + * Gets the asset element. + * @return a daeSmartRef to the asset element. + */ + const domAssetRef getAsset() const { return elemAsset; } + /** + * Gets the annotate element array. + * @return Returns a reference to the array of annotate elements. + */ + domFx_annotate_common_Array &getAnnotate_array() { return elemAnnotate_array; } + /** + * Gets the annotate element array. + * @return Returns a constant reference to the array of annotate elements. + */ + const domFx_annotate_common_Array &getAnnotate_array() const { return elemAnnotate_array; } + /** + * Gets the code element array. + * @return Returns a reference to the array of code elements. + */ + domFx_code_profile_Array &getCode_array() { return elemCode_array; } + /** + * Gets the code element array. + * @return Returns a constant reference to the array of code elements. + */ + const domFx_code_profile_Array &getCode_array() const { return elemCode_array; } + /** + * Gets the include element array. + * @return Returns a reference to the array of include elements. + */ + domFx_include_common_Array &getInclude_array() { return elemInclude_array; } + /** + * Gets the include element array. + * @return Returns a constant reference to the array of include elements. + */ + const domFx_include_common_Array &getInclude_array() const { return elemInclude_array; } + /** + * Gets the image element array. + * @return Returns a reference to the array of image elements. + */ + domImage_Array &getImage_array() { return elemImage_array; } + /** + * Gets the image element array. + * @return Returns a constant reference to the array of image elements. + */ + const domImage_Array &getImage_array() const { return elemImage_array; } + /** + * Gets the newparam element array. + * @return Returns a reference to the array of newparam elements. + */ + domCg_newparam_Array &getNewparam_array() { return elemNewparam_array; } + /** + * Gets the newparam element array. + * @return Returns a constant reference to the array of newparam elements. + */ + const domCg_newparam_Array &getNewparam_array() const { return elemNewparam_array; } + /** + * Gets the setparam element array. + * @return Returns a reference to the array of setparam elements. + */ + domCg_setparam_Array &getSetparam_array() { return elemSetparam_array; } + /** + * Gets the setparam element array. + * @return Returns a constant reference to the array of setparam elements. + */ + const domCg_setparam_Array &getSetparam_array() const { return elemSetparam_array; } + /** + * Gets the pass element array. + * @return Returns a reference to the array of pass elements. + */ + domPass_Array &getPass_array() { return elemPass_array; } + /** + * Gets the pass element array. + * @return Returns a constant reference to the array of pass elements. + */ + const domPass_Array &getPass_array() const { return elemPass_array; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } + /** + * Gets the _contents array. + * @return Returns a reference to the _contents element array. + */ + daeElementRefArray &getContents() { return _contents; } + /** + * Gets the _contents array. + * @return Returns a constant reference to the _contents element array. + */ + const daeElementRefArray &getContents() const { return _contents; } + + protected: + /** + * Constructor + */ + domTechnique() : attrId(), attrSid(), elemAsset(), elemAnnotate_array(), elemCode_array(), elemInclude_array(), elemImage_array(), elemNewparam_array(), elemSetparam_array(), elemPass_array(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domTechnique() {} + /** + * Copy Constructor + */ + domTechnique( const domTechnique &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domTechnique &operator=( const domTechnique &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + +protected: // Attributes +/** + * The id attribute is a text string containing the unique identifier of + * this element. This value must be unique within the instance document. + * Optional attribute. + */ + xsID attrId; +/** + * The type of platform. This is a vendor-defined character string that indicates + * the platform or capability target for the technique. Optional + */ + xsNCName attrPlatform; + +protected: // Elements + domAssetRef elemAsset; + domFx_code_profile_Array elemCode_array; + domFx_include_common_Array elemInclude_array; + domImage_Array elemImage_array; + domCg_newparam_Array elemNewparam_array; +/** + * Holds a description of the textures, samplers, shaders, parameters, and + * passes necessary for rendering this effect using one method. @see domTechnique + */ + domTechnique_Array elemTechnique_array; + domExtra_Array elemExtra_array; + /** + * Used to preserve order in elements that do not specify strict sequencing of sub-elements. + */ + daeElementRefArray _contents; + /** + * Used to preserve order in elements that have a complex content model. + */ + daeUIntArray _contentsOrder; + + +public: //Accessors and Mutators + /** + * Gets the id attribute. + * @return Returns a xsID of the id attribute. + */ + xsID getId() const { return attrId; } + /** + * Sets the id attribute. + * @param atId The new value for the id attribute. + */ + void setId( xsID atId ) { *(daeStringRef*)&attrId = atId; + _validAttributeArray[0] = true; } + + /** + * Gets the platform attribute. + * @return Returns a xsNCName of the platform attribute. + */ + xsNCName getPlatform() const { return attrPlatform; } + /** + * Sets the platform attribute. + * @param atPlatform The new value for the platform attribute. + */ + void setPlatform( xsNCName atPlatform ) { *(daeStringRef*)&attrPlatform = atPlatform; + _validAttributeArray[1] = true; } + + /** + * Gets the asset element. + * @return a daeSmartRef to the asset element. + */ + const domAssetRef getAsset() const { return elemAsset; } + /** + * Gets the code element array. + * @return Returns a reference to the array of code elements. + */ + domFx_code_profile_Array &getCode_array() { return elemCode_array; } + /** + * Gets the code element array. + * @return Returns a constant reference to the array of code elements. + */ + const domFx_code_profile_Array &getCode_array() const { return elemCode_array; } + /** + * Gets the include element array. + * @return Returns a reference to the array of include elements. + */ + domFx_include_common_Array &getInclude_array() { return elemInclude_array; } + /** + * Gets the include element array. + * @return Returns a constant reference to the array of include elements. + */ + const domFx_include_common_Array &getInclude_array() const { return elemInclude_array; } + /** + * Gets the image element array. + * @return Returns a reference to the array of image elements. + */ + domImage_Array &getImage_array() { return elemImage_array; } + /** + * Gets the image element array. + * @return Returns a constant reference to the array of image elements. + */ + const domImage_Array &getImage_array() const { return elemImage_array; } + /** + * Gets the newparam element array. + * @return Returns a reference to the array of newparam elements. + */ + domCg_newparam_Array &getNewparam_array() { return elemNewparam_array; } + /** + * Gets the newparam element array. + * @return Returns a constant reference to the array of newparam elements. + */ + const domCg_newparam_Array &getNewparam_array() const { return elemNewparam_array; } + /** + * Gets the technique element array. + * @return Returns a reference to the array of technique elements. + */ + domTechnique_Array &getTechnique_array() { return elemTechnique_array; } + /** + * Gets the technique element array. + * @return Returns a constant reference to the array of technique elements. + */ + const domTechnique_Array &getTechnique_array() const { return elemTechnique_array; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } + /** + * Gets the _contents array. + * @return Returns a reference to the _contents element array. + */ + daeElementRefArray &getContents() { return _contents; } + /** + * Gets the _contents array. + * @return Returns a constant reference to the _contents element array. + */ + const daeElementRefArray &getContents() const { return _contents; } + +protected: + /** + * Constructor + */ + domProfile_CG() : attrId(), attrPlatform(), elemAsset(), elemCode_array(), elemInclude_array(), elemImage_array(), elemNewparam_array(), elemTechnique_array(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domProfile_CG() {} + /** + * Copy Constructor + */ + domProfile_CG( const domProfile_CG &cpy ) : domFx_profile_abstract() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domProfile_CG &operator=( const domProfile_CG &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domProfile_COMMON.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domProfile_COMMON.h new file mode 100644 index 00000000..7fa5f63c --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domProfile_COMMON.h @@ -0,0 +1,768 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domProfile_COMMON_h__ +#define __domProfile_COMMON_h__ + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +/** + * Opens a block of COMMON platform-specific data types and technique declarations. + */ +class domProfile_COMMON : public domFx_profile_abstract +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::PROFILE_COMMON; } +public: + class domTechnique; + + typedef daeSmartRef domTechniqueRef; + typedef daeTArray domTechnique_Array; + +/** + * Holds a description of the textures, samplers, shaders, parameters, and + * passes necessary for rendering this effect using one method. + */ + class domTechnique : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::TECHNIQUE; } + public: + class domConstant; + + typedef daeSmartRef domConstantRef; + typedef daeTArray domConstant_Array; + + class domConstant : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::CONSTANT; } + + protected: // Elements + domCommon_color_or_texture_typeRef elemEmission; + domCommon_color_or_texture_typeRef elemReflective; + domCommon_float_or_param_typeRef elemReflectivity; + domCommon_transparent_typeRef elemTransparent; + domCommon_float_or_param_typeRef elemTransparency; + domCommon_float_or_param_typeRef elemIndex_of_refraction; + + public: //Accessors and Mutators + /** + * Gets the emission element. + * @return a daeSmartRef to the emission element. + */ + const domCommon_color_or_texture_typeRef getEmission() const { return elemEmission; } + /** + * Gets the reflective element. + * @return a daeSmartRef to the reflective element. + */ + const domCommon_color_or_texture_typeRef getReflective() const { return elemReflective; } + /** + * Gets the reflectivity element. + * @return a daeSmartRef to the reflectivity element. + */ + const domCommon_float_or_param_typeRef getReflectivity() const { return elemReflectivity; } + /** + * Gets the transparent element. + * @return a daeSmartRef to the transparent element. + */ + const domCommon_transparent_typeRef getTransparent() const { return elemTransparent; } + /** + * Gets the transparency element. + * @return a daeSmartRef to the transparency element. + */ + const domCommon_float_or_param_typeRef getTransparency() const { return elemTransparency; } + /** + * Gets the index_of_refraction element. + * @return a daeSmartRef to the index_of_refraction element. + */ + const domCommon_float_or_param_typeRef getIndex_of_refraction() const { return elemIndex_of_refraction; } + protected: + /** + * Constructor + */ + domConstant() : elemEmission(), elemReflective(), elemReflectivity(), elemTransparent(), elemTransparency(), elemIndex_of_refraction() {} + /** + * Destructor + */ + virtual ~domConstant() {} + /** + * Copy Constructor + */ + domConstant( const domConstant &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domConstant &operator=( const domConstant &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domLambert; + + typedef daeSmartRef domLambertRef; + typedef daeTArray domLambert_Array; + + class domLambert : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::LAMBERT; } + + protected: // Elements + domCommon_color_or_texture_typeRef elemEmission; + domCommon_color_or_texture_typeRef elemAmbient; + domCommon_color_or_texture_typeRef elemDiffuse; + domCommon_color_or_texture_typeRef elemReflective; + domCommon_float_or_param_typeRef elemReflectivity; + domCommon_transparent_typeRef elemTransparent; + domCommon_float_or_param_typeRef elemTransparency; + domCommon_float_or_param_typeRef elemIndex_of_refraction; + + public: //Accessors and Mutators + /** + * Gets the emission element. + * @return a daeSmartRef to the emission element. + */ + const domCommon_color_or_texture_typeRef getEmission() const { return elemEmission; } + /** + * Gets the ambient element. + * @return a daeSmartRef to the ambient element. + */ + const domCommon_color_or_texture_typeRef getAmbient() const { return elemAmbient; } + /** + * Gets the diffuse element. + * @return a daeSmartRef to the diffuse element. + */ + const domCommon_color_or_texture_typeRef getDiffuse() const { return elemDiffuse; } + /** + * Gets the reflective element. + * @return a daeSmartRef to the reflective element. + */ + const domCommon_color_or_texture_typeRef getReflective() const { return elemReflective; } + /** + * Gets the reflectivity element. + * @return a daeSmartRef to the reflectivity element. + */ + const domCommon_float_or_param_typeRef getReflectivity() const { return elemReflectivity; } + /** + * Gets the transparent element. + * @return a daeSmartRef to the transparent element. + */ + const domCommon_transparent_typeRef getTransparent() const { return elemTransparent; } + /** + * Gets the transparency element. + * @return a daeSmartRef to the transparency element. + */ + const domCommon_float_or_param_typeRef getTransparency() const { return elemTransparency; } + /** + * Gets the index_of_refraction element. + * @return a daeSmartRef to the index_of_refraction element. + */ + const domCommon_float_or_param_typeRef getIndex_of_refraction() const { return elemIndex_of_refraction; } + protected: + /** + * Constructor + */ + domLambert() : elemEmission(), elemAmbient(), elemDiffuse(), elemReflective(), elemReflectivity(), elemTransparent(), elemTransparency(), elemIndex_of_refraction() {} + /** + * Destructor + */ + virtual ~domLambert() {} + /** + * Copy Constructor + */ + domLambert( const domLambert &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domLambert &operator=( const domLambert &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domPhong; + + typedef daeSmartRef domPhongRef; + typedef daeTArray domPhong_Array; + + class domPhong : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::PHONG; } + + protected: // Elements + domCommon_color_or_texture_typeRef elemEmission; + domCommon_color_or_texture_typeRef elemAmbient; + domCommon_color_or_texture_typeRef elemDiffuse; + domCommon_color_or_texture_typeRef elemSpecular; + domCommon_float_or_param_typeRef elemShininess; + domCommon_color_or_texture_typeRef elemReflective; + domCommon_float_or_param_typeRef elemReflectivity; + domCommon_transparent_typeRef elemTransparent; + domCommon_float_or_param_typeRef elemTransparency; + domCommon_float_or_param_typeRef elemIndex_of_refraction; + + public: //Accessors and Mutators + /** + * Gets the emission element. + * @return a daeSmartRef to the emission element. + */ + const domCommon_color_or_texture_typeRef getEmission() const { return elemEmission; } + /** + * Gets the ambient element. + * @return a daeSmartRef to the ambient element. + */ + const domCommon_color_or_texture_typeRef getAmbient() const { return elemAmbient; } + /** + * Gets the diffuse element. + * @return a daeSmartRef to the diffuse element. + */ + const domCommon_color_or_texture_typeRef getDiffuse() const { return elemDiffuse; } + /** + * Gets the specular element. + * @return a daeSmartRef to the specular element. + */ + const domCommon_color_or_texture_typeRef getSpecular() const { return elemSpecular; } + /** + * Gets the shininess element. + * @return a daeSmartRef to the shininess element. + */ + const domCommon_float_or_param_typeRef getShininess() const { return elemShininess; } + /** + * Gets the reflective element. + * @return a daeSmartRef to the reflective element. + */ + const domCommon_color_or_texture_typeRef getReflective() const { return elemReflective; } + /** + * Gets the reflectivity element. + * @return a daeSmartRef to the reflectivity element. + */ + const domCommon_float_or_param_typeRef getReflectivity() const { return elemReflectivity; } + /** + * Gets the transparent element. + * @return a daeSmartRef to the transparent element. + */ + const domCommon_transparent_typeRef getTransparent() const { return elemTransparent; } + /** + * Gets the transparency element. + * @return a daeSmartRef to the transparency element. + */ + const domCommon_float_or_param_typeRef getTransparency() const { return elemTransparency; } + /** + * Gets the index_of_refraction element. + * @return a daeSmartRef to the index_of_refraction element. + */ + const domCommon_float_or_param_typeRef getIndex_of_refraction() const { return elemIndex_of_refraction; } + protected: + /** + * Constructor + */ + domPhong() : elemEmission(), elemAmbient(), elemDiffuse(), elemSpecular(), elemShininess(), elemReflective(), elemReflectivity(), elemTransparent(), elemTransparency(), elemIndex_of_refraction() {} + /** + * Destructor + */ + virtual ~domPhong() {} + /** + * Copy Constructor + */ + domPhong( const domPhong &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domPhong &operator=( const domPhong &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domBlinn; + + typedef daeSmartRef domBlinnRef; + typedef daeTArray domBlinn_Array; + + class domBlinn : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::BLINN; } + + protected: // Elements + domCommon_color_or_texture_typeRef elemEmission; + domCommon_color_or_texture_typeRef elemAmbient; + domCommon_color_or_texture_typeRef elemDiffuse; + domCommon_color_or_texture_typeRef elemSpecular; + domCommon_float_or_param_typeRef elemShininess; + domCommon_color_or_texture_typeRef elemReflective; + domCommon_float_or_param_typeRef elemReflectivity; + domCommon_transparent_typeRef elemTransparent; + domCommon_float_or_param_typeRef elemTransparency; + domCommon_float_or_param_typeRef elemIndex_of_refraction; + + public: //Accessors and Mutators + /** + * Gets the emission element. + * @return a daeSmartRef to the emission element. + */ + const domCommon_color_or_texture_typeRef getEmission() const { return elemEmission; } + /** + * Gets the ambient element. + * @return a daeSmartRef to the ambient element. + */ + const domCommon_color_or_texture_typeRef getAmbient() const { return elemAmbient; } + /** + * Gets the diffuse element. + * @return a daeSmartRef to the diffuse element. + */ + const domCommon_color_or_texture_typeRef getDiffuse() const { return elemDiffuse; } + /** + * Gets the specular element. + * @return a daeSmartRef to the specular element. + */ + const domCommon_color_or_texture_typeRef getSpecular() const { return elemSpecular; } + /** + * Gets the shininess element. + * @return a daeSmartRef to the shininess element. + */ + const domCommon_float_or_param_typeRef getShininess() const { return elemShininess; } + /** + * Gets the reflective element. + * @return a daeSmartRef to the reflective element. + */ + const domCommon_color_or_texture_typeRef getReflective() const { return elemReflective; } + /** + * Gets the reflectivity element. + * @return a daeSmartRef to the reflectivity element. + */ + const domCommon_float_or_param_typeRef getReflectivity() const { return elemReflectivity; } + /** + * Gets the transparent element. + * @return a daeSmartRef to the transparent element. + */ + const domCommon_transparent_typeRef getTransparent() const { return elemTransparent; } + /** + * Gets the transparency element. + * @return a daeSmartRef to the transparency element. + */ + const domCommon_float_or_param_typeRef getTransparency() const { return elemTransparency; } + /** + * Gets the index_of_refraction element. + * @return a daeSmartRef to the index_of_refraction element. + */ + const domCommon_float_or_param_typeRef getIndex_of_refraction() const { return elemIndex_of_refraction; } + protected: + /** + * Constructor + */ + domBlinn() : elemEmission(), elemAmbient(), elemDiffuse(), elemSpecular(), elemShininess(), elemReflective(), elemReflectivity(), elemTransparent(), elemTransparency(), elemIndex_of_refraction() {} + /** + * Destructor + */ + virtual ~domBlinn() {} + /** + * Copy Constructor + */ + domBlinn( const domBlinn &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domBlinn &operator=( const domBlinn &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + + protected: // Attributes +/** + * The id attribute is a text string containing the unique identifier of + * this element. This value must be unique within the instance document. + * Optional attribute. + */ + xsID attrId; +/** + * The sid attribute is a text string value containing the sub-identifier + * of this element. This value must be unique within the scope of the parent + * element. Optional attribute. + */ + xsNCName attrSid; + + protected: // Elements +/** + * The technique element may contain an asset element. @see domAsset + */ + domAssetRef elemAsset; + domImage_Array elemImage_array; + domCommon_newparam_type_Array elemNewparam_array; + domConstantRef elemConstant; + domLambertRef elemLambert; + domPhongRef elemPhong; + domBlinnRef elemBlinn; +/** + * The extra element may appear any number of times. @see domExtra + */ + domExtra_Array elemExtra_array; + /** + * Used to preserve order in elements that do not specify strict sequencing of sub-elements. + */ + daeElementRefArray _contents; + /** + * Used to preserve order in elements that have a complex content model. + */ + daeUIntArray _contentsOrder; + + + public: //Accessors and Mutators + /** + * Gets the id attribute. + * @return Returns a xsID of the id attribute. + */ + xsID getId() const { return attrId; } + /** + * Sets the id attribute. + * @param atId The new value for the id attribute. + */ + void setId( xsID atId ) { *(daeStringRef*)&attrId = atId; + _validAttributeArray[0] = true; } + + /** + * Gets the sid attribute. + * @return Returns a xsNCName of the sid attribute. + */ + xsNCName getSid() const { return attrSid; } + /** + * Sets the sid attribute. + * @param atSid The new value for the sid attribute. + */ + void setSid( xsNCName atSid ) { *(daeStringRef*)&attrSid = atSid; + _validAttributeArray[1] = true; } + + /** + * Gets the asset element. + * @return a daeSmartRef to the asset element. + */ + const domAssetRef getAsset() const { return elemAsset; } + /** + * Gets the image element array. + * @return Returns a reference to the array of image elements. + */ + domImage_Array &getImage_array() { return elemImage_array; } + /** + * Gets the image element array. + * @return Returns a constant reference to the array of image elements. + */ + const domImage_Array &getImage_array() const { return elemImage_array; } + /** + * Gets the newparam element array. + * @return Returns a reference to the array of newparam elements. + */ + domCommon_newparam_type_Array &getNewparam_array() { return elemNewparam_array; } + /** + * Gets the newparam element array. + * @return Returns a constant reference to the array of newparam elements. + */ + const domCommon_newparam_type_Array &getNewparam_array() const { return elemNewparam_array; } + /** + * Gets the constant element. + * @return a daeSmartRef to the constant element. + */ + const domConstantRef getConstant() const { return elemConstant; } + /** + * Gets the lambert element. + * @return a daeSmartRef to the lambert element. + */ + const domLambertRef getLambert() const { return elemLambert; } + /** + * Gets the phong element. + * @return a daeSmartRef to the phong element. + */ + const domPhongRef getPhong() const { return elemPhong; } + /** + * Gets the blinn element. + * @return a daeSmartRef to the blinn element. + */ + const domBlinnRef getBlinn() const { return elemBlinn; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } + /** + * Gets the _contents array. + * @return Returns a reference to the _contents element array. + */ + daeElementRefArray &getContents() { return _contents; } + /** + * Gets the _contents array. + * @return Returns a constant reference to the _contents element array. + */ + const daeElementRefArray &getContents() const { return _contents; } + + protected: + /** + * Constructor + */ + domTechnique() : attrId(), attrSid(), elemAsset(), elemImage_array(), elemNewparam_array(), elemConstant(), elemLambert(), elemPhong(), elemBlinn(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domTechnique() {} + /** + * Copy Constructor + */ + domTechnique( const domTechnique &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domTechnique &operator=( const domTechnique &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + +protected: // Attribute +/** + * The id attribute is a text string containing the unique identifier of + * this element. This value must be unique within the instance document. + * Optional attribute. + */ + xsID attrId; + +protected: // Elements + domAssetRef elemAsset; + domImage_Array elemImage_array; + domCommon_newparam_type_Array elemNewparam_array; +/** + * Holds a description of the textures, samplers, shaders, parameters, and + * passes necessary for rendering this effect using one method. @see domTechnique + */ + domTechniqueRef elemTechnique; +/** + * The extra element may appear any number of times. @see domExtra + */ + domExtra_Array elemExtra_array; + /** + * Used to preserve order in elements that do not specify strict sequencing of sub-elements. + */ + daeElementRefArray _contents; + /** + * Used to preserve order in elements that have a complex content model. + */ + daeUIntArray _contentsOrder; + + +public: //Accessors and Mutators + /** + * Gets the id attribute. + * @return Returns a xsID of the id attribute. + */ + xsID getId() const { return attrId; } + /** + * Sets the id attribute. + * @param atId The new value for the id attribute. + */ + void setId( xsID atId ) { *(daeStringRef*)&attrId = atId; + _validAttributeArray[0] = true; } + + /** + * Gets the asset element. + * @return a daeSmartRef to the asset element. + */ + const domAssetRef getAsset() const { return elemAsset; } + /** + * Gets the image element array. + * @return Returns a reference to the array of image elements. + */ + domImage_Array &getImage_array() { return elemImage_array; } + /** + * Gets the image element array. + * @return Returns a constant reference to the array of image elements. + */ + const domImage_Array &getImage_array() const { return elemImage_array; } + /** + * Gets the newparam element array. + * @return Returns a reference to the array of newparam elements. + */ + domCommon_newparam_type_Array &getNewparam_array() { return elemNewparam_array; } + /** + * Gets the newparam element array. + * @return Returns a constant reference to the array of newparam elements. + */ + const domCommon_newparam_type_Array &getNewparam_array() const { return elemNewparam_array; } + /** + * Gets the technique element. + * @return a daeSmartRef to the technique element. + */ + const domTechniqueRef getTechnique() const { return elemTechnique; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } + /** + * Gets the _contents array. + * @return Returns a reference to the _contents element array. + */ + daeElementRefArray &getContents() { return _contents; } + /** + * Gets the _contents array. + * @return Returns a constant reference to the _contents element array. + */ + const daeElementRefArray &getContents() const { return _contents; } + +protected: + /** + * Constructor + */ + domProfile_COMMON() : attrId(), elemAsset(), elemImage_array(), elemNewparam_array(), elemTechnique(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domProfile_COMMON() {} + /** + * Copy Constructor + */ + domProfile_COMMON( const domProfile_COMMON &cpy ) : domFx_profile_abstract() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domProfile_COMMON &operator=( const domProfile_COMMON &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domProfile_GLES.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domProfile_GLES.h new file mode 100644 index 00000000..25b384cb --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domProfile_GLES.h @@ -0,0 +1,1106 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domProfile_GLES_h__ +#define __domProfile_GLES_h__ + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +/** + * Opens a block of GLES platform-specific data types and technique declarations. + */ +class domProfile_GLES : public domFx_profile_abstract +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::PROFILE_GLES; } +public: + class domTechnique; + + typedef daeSmartRef domTechniqueRef; + typedef daeTArray domTechnique_Array; + +/** + * Holds a description of the textures, samplers, shaders, parameters, and + * passes necessary for rendering this effect using one method. + */ + class domTechnique : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::TECHNIQUE; } + public: + class domSetparam; + + typedef daeSmartRef domSetparamRef; + typedef daeTArray domSetparam_Array; + + class domSetparam : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::SETPARAM; } + protected: // Attribute + xsNCName attrRef; + + protected: // Elements + domFx_annotate_common_Array elemAnnotate_array; + domGles_basic_type_commonRef elemGles_basic_type_common; + + public: //Accessors and Mutators + /** + * Gets the ref attribute. + * @return Returns a xsNCName of the ref attribute. + */ + xsNCName getRef() const { return attrRef; } + /** + * Sets the ref attribute. + * @param atRef The new value for the ref attribute. + */ + void setRef( xsNCName atRef ) { *(daeStringRef*)&attrRef = atRef; + _validAttributeArray[0] = true; } + + /** + * Gets the annotate element array. + * @return Returns a reference to the array of annotate elements. + */ + domFx_annotate_common_Array &getAnnotate_array() { return elemAnnotate_array; } + /** + * Gets the annotate element array. + * @return Returns a constant reference to the array of annotate elements. + */ + const domFx_annotate_common_Array &getAnnotate_array() const { return elemAnnotate_array; } + /** + * Gets the gles_basic_type_common element. + * @return a daeSmartRef to the gles_basic_type_common element. + */ + const domGles_basic_type_commonRef getGles_basic_type_common() const { return elemGles_basic_type_common; } + protected: + /** + * Constructor + */ + domSetparam() : attrRef(), elemAnnotate_array(), elemGles_basic_type_common() {} + /** + * Destructor + */ + virtual ~domSetparam() {} + /** + * Copy Constructor + */ + domSetparam( const domSetparam &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domSetparam &operator=( const domSetparam &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domPass; + + typedef daeSmartRef domPassRef; + typedef daeTArray domPass_Array; + +/** + * A static declaration of all the render states, shaders, and settings for + * one rendering pipeline. + */ + class domPass : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::PASS; } + public: + class domColor_target; + + typedef daeSmartRef domColor_targetRef; + typedef daeTArray domColor_target_Array; + + class domColor_target : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::COLOR_TARGET; } + + protected: // Value + /** + * The domGles_rendertarget_common value of the text data of this element. + */ + domGles_rendertarget_common _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a domGles_rendertarget_common of the value. + */ + domGles_rendertarget_common getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( domGles_rendertarget_common val ) { _value = val; } + + protected: + /** + * Constructor + */ + domColor_target() : _value() {} + /** + * Destructor + */ + virtual ~domColor_target() {} + /** + * Copy Constructor + */ + domColor_target( const domColor_target &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domColor_target &operator=( const domColor_target &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domDepth_target; + + typedef daeSmartRef domDepth_targetRef; + typedef daeTArray domDepth_target_Array; + + class domDepth_target : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::DEPTH_TARGET; } + + protected: // Value + /** + * The domGles_rendertarget_common value of the text data of this element. + */ + domGles_rendertarget_common _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a domGles_rendertarget_common of the value. + */ + domGles_rendertarget_common getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( domGles_rendertarget_common val ) { _value = val; } + + protected: + /** + * Constructor + */ + domDepth_target() : _value() {} + /** + * Destructor + */ + virtual ~domDepth_target() {} + /** + * Copy Constructor + */ + domDepth_target( const domDepth_target &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domDepth_target &operator=( const domDepth_target &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domStencil_target; + + typedef daeSmartRef domStencil_targetRef; + typedef daeTArray domStencil_target_Array; + + class domStencil_target : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::STENCIL_TARGET; } + + protected: // Value + /** + * The domGles_rendertarget_common value of the text data of this element. + */ + domGles_rendertarget_common _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a domGles_rendertarget_common of the value. + */ + domGles_rendertarget_common getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( domGles_rendertarget_common val ) { _value = val; } + + protected: + /** + * Constructor + */ + domStencil_target() : _value() {} + /** + * Destructor + */ + virtual ~domStencil_target() {} + /** + * Copy Constructor + */ + domStencil_target( const domStencil_target &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domStencil_target &operator=( const domStencil_target &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domColor_clear; + + typedef daeSmartRef domColor_clearRef; + typedef daeTArray domColor_clear_Array; + + class domColor_clear : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::COLOR_CLEAR; } + + protected: // Value + /** + * The domFx_color_common value of the text data of this element. + */ + domFx_color_common _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domFx_color_common reference of the _value array. + */ + domFx_color_common &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domFx_color_common reference of the _value array. + */ + const domFx_color_common &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domFx_color_common &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domColor_clear() : _value() {} + /** + * Destructor + */ + virtual ~domColor_clear() {} + /** + * Copy Constructor + */ + domColor_clear( const domColor_clear &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domColor_clear &operator=( const domColor_clear &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domDepth_clear; + + typedef daeSmartRef domDepth_clearRef; + typedef daeTArray domDepth_clear_Array; + + class domDepth_clear : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::DEPTH_CLEAR; } + + protected: // Value + /** + * The domFloat value of the text data of this element. + */ + domFloat _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a domFloat of the value. + */ + domFloat getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( domFloat val ) { _value = val; } + + protected: + /** + * Constructor + */ + domDepth_clear() : _value() {} + /** + * Destructor + */ + virtual ~domDepth_clear() {} + /** + * Copy Constructor + */ + domDepth_clear( const domDepth_clear &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domDepth_clear &operator=( const domDepth_clear &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domStencil_clear; + + typedef daeSmartRef domStencil_clearRef; + typedef daeTArray domStencil_clear_Array; + + class domStencil_clear : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::STENCIL_CLEAR; } + + protected: // Value + /** + * The xsByte value of the text data of this element. + */ + xsByte _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a xsByte of the value. + */ + xsByte getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( xsByte val ) { _value = val; } + + protected: + /** + * Constructor + */ + domStencil_clear() : _value() {} + /** + * Destructor + */ + virtual ~domStencil_clear() {} + /** + * Copy Constructor + */ + domStencil_clear( const domStencil_clear &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domStencil_clear &operator=( const domStencil_clear &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domDraw; + + typedef daeSmartRef domDrawRef; + typedef daeTArray domDraw_Array; + + class domDraw : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::DRAW; } + + protected: // Value + /** + * The domFx_draw_common value of the text data of this element. + */ + domFx_draw_common _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a domFx_draw_common of the value. + */ + domFx_draw_common getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( domFx_draw_common val ) { _value = val; } + + protected: + /** + * Constructor + */ + domDraw() : _value() {} + /** + * Destructor + */ + virtual ~domDraw() {} + /** + * Copy Constructor + */ + domDraw( const domDraw &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domDraw &operator=( const domDraw &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + + protected: // Attribute +/** + * The sid attribute is a text string value containing the sub-identifier + * of this element. This value must be unique within the scope of the parent + * element. Optional attribute. + */ + xsNCName attrSid; + + protected: // Elements + domFx_annotate_common_Array elemAnnotate_array; + domColor_targetRef elemColor_target; + domDepth_targetRef elemDepth_target; + domStencil_targetRef elemStencil_target; + domColor_clearRef elemColor_clear; + domDepth_clearRef elemDepth_clear; + domStencil_clearRef elemStencil_clear; + domDrawRef elemDraw; + domGles_pipeline_settings_Array elemGles_pipeline_settings_array; + domExtra_Array elemExtra_array; + /** + * Used to preserve order in elements that do not specify strict sequencing of sub-elements. + */ + daeElementRefArray _contents; + /** + * Used to preserve order in elements that have a complex content model. + */ + daeUIntArray _contentsOrder; + + + public: //Accessors and Mutators + /** + * Gets the sid attribute. + * @return Returns a xsNCName of the sid attribute. + */ + xsNCName getSid() const { return attrSid; } + /** + * Sets the sid attribute. + * @param atSid The new value for the sid attribute. + */ + void setSid( xsNCName atSid ) { *(daeStringRef*)&attrSid = atSid; + _validAttributeArray[0] = true; } + + /** + * Gets the annotate element array. + * @return Returns a reference to the array of annotate elements. + */ + domFx_annotate_common_Array &getAnnotate_array() { return elemAnnotate_array; } + /** + * Gets the annotate element array. + * @return Returns a constant reference to the array of annotate elements. + */ + const domFx_annotate_common_Array &getAnnotate_array() const { return elemAnnotate_array; } + /** + * Gets the color_target element. + * @return a daeSmartRef to the color_target element. + */ + const domColor_targetRef getColor_target() const { return elemColor_target; } + /** + * Gets the depth_target element. + * @return a daeSmartRef to the depth_target element. + */ + const domDepth_targetRef getDepth_target() const { return elemDepth_target; } + /** + * Gets the stencil_target element. + * @return a daeSmartRef to the stencil_target element. + */ + const domStencil_targetRef getStencil_target() const { return elemStencil_target; } + /** + * Gets the color_clear element. + * @return a daeSmartRef to the color_clear element. + */ + const domColor_clearRef getColor_clear() const { return elemColor_clear; } + /** + * Gets the depth_clear element. + * @return a daeSmartRef to the depth_clear element. + */ + const domDepth_clearRef getDepth_clear() const { return elemDepth_clear; } + /** + * Gets the stencil_clear element. + * @return a daeSmartRef to the stencil_clear element. + */ + const domStencil_clearRef getStencil_clear() const { return elemStencil_clear; } + /** + * Gets the draw element. + * @return a daeSmartRef to the draw element. + */ + const domDrawRef getDraw() const { return elemDraw; } + /** + * Gets the gles_pipeline_settings element array. + * @return Returns a reference to the array of gles_pipeline_settings elements. + */ + domGles_pipeline_settings_Array &getGles_pipeline_settings_array() { return elemGles_pipeline_settings_array; } + /** + * Gets the gles_pipeline_settings element array. + * @return Returns a constant reference to the array of gles_pipeline_settings elements. + */ + const domGles_pipeline_settings_Array &getGles_pipeline_settings_array() const { return elemGles_pipeline_settings_array; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } + /** + * Gets the _contents array. + * @return Returns a reference to the _contents element array. + */ + daeElementRefArray &getContents() { return _contents; } + /** + * Gets the _contents array. + * @return Returns a constant reference to the _contents element array. + */ + const daeElementRefArray &getContents() const { return _contents; } + + protected: + /** + * Constructor + */ + domPass() : attrSid(), elemAnnotate_array(), elemColor_target(), elemDepth_target(), elemStencil_target(), elemColor_clear(), elemDepth_clear(), elemStencil_clear(), elemDraw(), elemGles_pipeline_settings_array(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domPass() {} + /** + * Copy Constructor + */ + domPass( const domPass &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domPass &operator=( const domPass &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + + protected: // Attributes + xsID attrId; +/** + * The sid attribute is a text string value containing the sub-identifier + * of this element. This value must be unique within the scope of the parent + * element. + */ + xsNCName attrSid; + + protected: // Elements + domAssetRef elemAsset; + domFx_annotate_common_Array elemAnnotate_array; + domImage_Array elemImage_array; + domGles_newparam_Array elemNewparam_array; + domSetparam_Array elemSetparam_array; +/** + * A static declaration of all the render states, shaders, and settings for + * one rendering pipeline. @see domPass + */ + domPass_Array elemPass_array; + domExtra_Array elemExtra_array; + /** + * Used to preserve order in elements that do not specify strict sequencing of sub-elements. + */ + daeElementRefArray _contents; + /** + * Used to preserve order in elements that have a complex content model. + */ + daeUIntArray _contentsOrder; + + + public: //Accessors and Mutators + /** + * Gets the id attribute. + * @return Returns a xsID of the id attribute. + */ + xsID getId() const { return attrId; } + /** + * Sets the id attribute. + * @param atId The new value for the id attribute. + */ + void setId( xsID atId ) { *(daeStringRef*)&attrId = atId; + _validAttributeArray[0] = true; } + + /** + * Gets the sid attribute. + * @return Returns a xsNCName of the sid attribute. + */ + xsNCName getSid() const { return attrSid; } + /** + * Sets the sid attribute. + * @param atSid The new value for the sid attribute. + */ + void setSid( xsNCName atSid ) { *(daeStringRef*)&attrSid = atSid; + _validAttributeArray[1] = true; } + + /** + * Gets the asset element. + * @return a daeSmartRef to the asset element. + */ + const domAssetRef getAsset() const { return elemAsset; } + /** + * Gets the annotate element array. + * @return Returns a reference to the array of annotate elements. + */ + domFx_annotate_common_Array &getAnnotate_array() { return elemAnnotate_array; } + /** + * Gets the annotate element array. + * @return Returns a constant reference to the array of annotate elements. + */ + const domFx_annotate_common_Array &getAnnotate_array() const { return elemAnnotate_array; } + /** + * Gets the image element array. + * @return Returns a reference to the array of image elements. + */ + domImage_Array &getImage_array() { return elemImage_array; } + /** + * Gets the image element array. + * @return Returns a constant reference to the array of image elements. + */ + const domImage_Array &getImage_array() const { return elemImage_array; } + /** + * Gets the newparam element array. + * @return Returns a reference to the array of newparam elements. + */ + domGles_newparam_Array &getNewparam_array() { return elemNewparam_array; } + /** + * Gets the newparam element array. + * @return Returns a constant reference to the array of newparam elements. + */ + const domGles_newparam_Array &getNewparam_array() const { return elemNewparam_array; } + /** + * Gets the setparam element array. + * @return Returns a reference to the array of setparam elements. + */ + domSetparam_Array &getSetparam_array() { return elemSetparam_array; } + /** + * Gets the setparam element array. + * @return Returns a constant reference to the array of setparam elements. + */ + const domSetparam_Array &getSetparam_array() const { return elemSetparam_array; } + /** + * Gets the pass element array. + * @return Returns a reference to the array of pass elements. + */ + domPass_Array &getPass_array() { return elemPass_array; } + /** + * Gets the pass element array. + * @return Returns a constant reference to the array of pass elements. + */ + const domPass_Array &getPass_array() const { return elemPass_array; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } + /** + * Gets the _contents array. + * @return Returns a reference to the _contents element array. + */ + daeElementRefArray &getContents() { return _contents; } + /** + * Gets the _contents array. + * @return Returns a constant reference to the _contents element array. + */ + const daeElementRefArray &getContents() const { return _contents; } + + protected: + /** + * Constructor + */ + domTechnique() : attrId(), attrSid(), elemAsset(), elemAnnotate_array(), elemImage_array(), elemNewparam_array(), elemSetparam_array(), elemPass_array(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domTechnique() {} + /** + * Copy Constructor + */ + domTechnique( const domTechnique &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domTechnique &operator=( const domTechnique &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + +protected: // Attributes +/** + * The id attribute is a text string containing the unique identifier of + * this element. This value must be unique within the instance document. + * Optional attribute. + */ + xsID attrId; +/** + * The type of platform. This is a vendor-defined character string that indicates + * the platform or capability target for the technique. Optional + */ + xsNCName attrPlatform; + +protected: // Elements + domAssetRef elemAsset; + domImage_Array elemImage_array; + domGles_newparam_Array elemNewparam_array; +/** + * Holds a description of the textures, samplers, shaders, parameters, and + * passes necessary for rendering this effect using one method. @see domTechnique + */ + domTechnique_Array elemTechnique_array; + domExtra_Array elemExtra_array; + /** + * Used to preserve order in elements that do not specify strict sequencing of sub-elements. + */ + daeElementRefArray _contents; + /** + * Used to preserve order in elements that have a complex content model. + */ + daeUIntArray _contentsOrder; + + +public: //Accessors and Mutators + /** + * Gets the id attribute. + * @return Returns a xsID of the id attribute. + */ + xsID getId() const { return attrId; } + /** + * Sets the id attribute. + * @param atId The new value for the id attribute. + */ + void setId( xsID atId ) { *(daeStringRef*)&attrId = atId; + _validAttributeArray[0] = true; } + + /** + * Gets the platform attribute. + * @return Returns a xsNCName of the platform attribute. + */ + xsNCName getPlatform() const { return attrPlatform; } + /** + * Sets the platform attribute. + * @param atPlatform The new value for the platform attribute. + */ + void setPlatform( xsNCName atPlatform ) { *(daeStringRef*)&attrPlatform = atPlatform; + _validAttributeArray[1] = true; } + + /** + * Gets the asset element. + * @return a daeSmartRef to the asset element. + */ + const domAssetRef getAsset() const { return elemAsset; } + /** + * Gets the image element array. + * @return Returns a reference to the array of image elements. + */ + domImage_Array &getImage_array() { return elemImage_array; } + /** + * Gets the image element array. + * @return Returns a constant reference to the array of image elements. + */ + const domImage_Array &getImage_array() const { return elemImage_array; } + /** + * Gets the newparam element array. + * @return Returns a reference to the array of newparam elements. + */ + domGles_newparam_Array &getNewparam_array() { return elemNewparam_array; } + /** + * Gets the newparam element array. + * @return Returns a constant reference to the array of newparam elements. + */ + const domGles_newparam_Array &getNewparam_array() const { return elemNewparam_array; } + /** + * Gets the technique element array. + * @return Returns a reference to the array of technique elements. + */ + domTechnique_Array &getTechnique_array() { return elemTechnique_array; } + /** + * Gets the technique element array. + * @return Returns a constant reference to the array of technique elements. + */ + const domTechnique_Array &getTechnique_array() const { return elemTechnique_array; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } + /** + * Gets the _contents array. + * @return Returns a reference to the _contents element array. + */ + daeElementRefArray &getContents() { return _contents; } + /** + * Gets the _contents array. + * @return Returns a constant reference to the _contents element array. + */ + const daeElementRefArray &getContents() const { return _contents; } + +protected: + /** + * Constructor + */ + domProfile_GLES() : attrId(), attrPlatform(), elemAsset(), elemImage_array(), elemNewparam_array(), elemTechnique_array(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domProfile_GLES() {} + /** + * Copy Constructor + */ + domProfile_GLES( const domProfile_GLES &cpy ) : domFx_profile_abstract() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domProfile_GLES &operator=( const domProfile_GLES &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domProfile_GLSL.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domProfile_GLSL.h new file mode 100644 index 00000000..dafb8223 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domProfile_GLSL.h @@ -0,0 +1,1223 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domProfile_GLSL_h__ +#define __domProfile_GLSL_h__ + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/** + * Opens a block of GLSL platform-specific data types and technique declarations. + */ +class domProfile_GLSL : public domFx_profile_abstract +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::PROFILE_GLSL; } +public: + class domTechnique; + + typedef daeSmartRef domTechniqueRef; + typedef daeTArray domTechnique_Array; + +/** + * Holds a description of the textures, samplers, shaders, parameters, and + * passes necessary for rendering this effect using one method. + */ + class domTechnique : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::TECHNIQUE; } + public: + class domPass; + + typedef daeSmartRef domPassRef; + typedef daeTArray domPass_Array; + +/** + * A static declaration of all the render states, shaders, and settings for + * one rendering pipeline. + */ + class domPass : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::PASS; } + public: + class domDraw; + + typedef daeSmartRef domDrawRef; + typedef daeTArray domDraw_Array; + + class domDraw : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::DRAW; } + + protected: // Value + /** + * The domFx_draw_common value of the text data of this element. + */ + domFx_draw_common _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a domFx_draw_common of the value. + */ + domFx_draw_common getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( domFx_draw_common val ) { _value = val; } + + protected: + /** + * Constructor + */ + domDraw() : _value() {} + /** + * Destructor + */ + virtual ~domDraw() {} + /** + * Copy Constructor + */ + domDraw( const domDraw &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domDraw &operator=( const domDraw &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domShader; + + typedef daeSmartRef domShaderRef; + typedef daeTArray domShader_Array; + +/** + * Declare and prepare a shader for execution in the rendering pipeline of + * a pass. + */ + class domShader : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::SHADER; } + public: + class domCompiler_target; + + typedef daeSmartRef domCompiler_targetRef; + typedef daeTArray domCompiler_target_Array; + +/** + * A string declaring which profile or platform the compiler is targeting + * this shader for. + */ + class domCompiler_target : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::COMPILER_TARGET; } + + protected: // Value + /** + * The xsNMTOKEN value of the text data of this element. + */ + xsNMTOKEN _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return Returns a xsNMTOKEN of the value. + */ + xsNMTOKEN getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( xsNMTOKEN val ) { *(daeStringRef*)&_value = val; } + + protected: + /** + * Constructor + */ + domCompiler_target() : _value() {} + /** + * Destructor + */ + virtual ~domCompiler_target() {} + /** + * Copy Constructor + */ + domCompiler_target( const domCompiler_target &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domCompiler_target &operator=( const domCompiler_target &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domCompiler_options; + + typedef daeSmartRef domCompiler_optionsRef; + typedef daeTArray domCompiler_options_Array; + +/** + * A string containing command-line operations for the shader compiler. + */ + class domCompiler_options : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::COMPILER_OPTIONS; } + + protected: // Value + /** + * The xsString value of the text data of this element. + */ + xsString _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return Returns a xsString of the value. + */ + xsString getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( xsString val ) { *(daeStringRef*)&_value = val; } + + protected: + /** + * Constructor + */ + domCompiler_options() : _value() {} + /** + * Destructor + */ + virtual ~domCompiler_options() {} + /** + * Copy Constructor + */ + domCompiler_options( const domCompiler_options &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domCompiler_options &operator=( const domCompiler_options &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domName; + + typedef daeSmartRef domNameRef; + typedef daeTArray domName_Array; + +/** + * The entry symbol for the shader function. + */ + class domName : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::NAME; } + protected: // Attribute + xsNCName attrSource; + + protected: // Value + /** + * The xsNCName value of the text data of this element. + */ + xsNCName _value; + + public: //Accessors and Mutators + /** + * Gets the source attribute. + * @return Returns a xsNCName of the source attribute. + */ + xsNCName getSource() const { return attrSource; } + /** + * Sets the source attribute. + * @param atSource The new value for the source attribute. + */ + void setSource( xsNCName atSource ) { *(daeStringRef*)&attrSource = atSource; + _validAttributeArray[0] = true; } + + /** + * Gets the value of this element. + * @return Returns a xsNCName of the value. + */ + xsNCName getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( xsNCName val ) { *(daeStringRef*)&_value = val; } + + protected: + /** + * Constructor + */ + domName() : attrSource(), _value() {} + /** + * Destructor + */ + virtual ~domName() {} + /** + * Copy Constructor + */ + domName( const domName &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domName &operator=( const domName &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domBind; + + typedef daeSmartRef domBindRef; + typedef daeTArray domBind_Array; + +/** + * Binds values to uniform inputs of a shader. + */ + class domBind : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::BIND; } + public: + class domParam; + + typedef daeSmartRef domParamRef; + typedef daeTArray domParam_Array; + + class domParam : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::PARAM; } + protected: // Attribute + xsString attrRef; + + + public: //Accessors and Mutators + /** + * Gets the ref attribute. + * @return Returns a xsString of the ref attribute. + */ + xsString getRef() const { return attrRef; } + /** + * Sets the ref attribute. + * @param atRef The new value for the ref attribute. + */ + void setRef( xsString atRef ) { *(daeStringRef*)&attrRef = atRef; + _validAttributeArray[0] = true; } + + protected: + /** + * Constructor + */ + domParam() : attrRef() {} + /** + * Destructor + */ + virtual ~domParam() {} + /** + * Copy Constructor + */ + domParam( const domParam &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domParam &operator=( const domParam &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + + protected: // Attribute +/** + * The identifier for a uniform input parameter to the shader (a formal function + * parameter or in-scope global) that will be bound to an external resource. + */ + xsNCName attrSymbol; + + protected: // Elements + domGlsl_param_typeRef elemGlsl_param_type; + domParamRef elemParam; + /** + * Used to preserve order in elements that do not specify strict sequencing of sub-elements. + */ + daeElementRefArray _contents; + /** + * Used to preserve order in elements that have a complex content model. + */ + daeUIntArray _contentsOrder; + + + public: //Accessors and Mutators + /** + * Gets the symbol attribute. + * @return Returns a xsNCName of the symbol attribute. + */ + xsNCName getSymbol() const { return attrSymbol; } + /** + * Sets the symbol attribute. + * @param atSymbol The new value for the symbol attribute. + */ + void setSymbol( xsNCName atSymbol ) { *(daeStringRef*)&attrSymbol = atSymbol; + _validAttributeArray[0] = true; } + + /** + * Gets the glsl_param_type element. + * @return a daeSmartRef to the glsl_param_type element. + */ + const domGlsl_param_typeRef getGlsl_param_type() const { return elemGlsl_param_type; } + /** + * Gets the param element. + * @return a daeSmartRef to the param element. + */ + const domParamRef getParam() const { return elemParam; } + /** + * Gets the _contents array. + * @return Returns a reference to the _contents element array. + */ + daeElementRefArray &getContents() { return _contents; } + /** + * Gets the _contents array. + * @return Returns a constant reference to the _contents element array. + */ + const daeElementRefArray &getContents() const { return _contents; } + + protected: + /** + * Constructor + */ + domBind() : attrSymbol(), elemGlsl_param_type(), elemParam() {} + /** + * Destructor + */ + virtual ~domBind() {} + /** + * Copy Constructor + */ + domBind( const domBind &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domBind &operator=( const domBind &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + + protected: // Attribute +/** + * In which pipeline stage this programmable shader is designed to execute, + * for example, VERTEX, FRAGMENT, etc. + */ + domGlsl_pipeline_stage attrStage; + + protected: // Elements + domFx_annotate_common_Array elemAnnotate_array; +/** + * A string declaring which profile or platform the compiler is targeting + * this shader for. @see domCompiler_target + */ + domCompiler_targetRef elemCompiler_target; +/** + * A string containing command-line operations for the shader compiler. @see + * domCompiler_options + */ + domCompiler_optionsRef elemCompiler_options; +/** + * The entry symbol for the shader function. @see domName + */ + domNameRef elemName; +/** + * Binds values to uniform inputs of a shader. @see domBind + */ + domBind_Array elemBind_array; + + public: //Accessors and Mutators + /** + * Gets the stage attribute. + * @return Returns a domGlsl_pipeline_stage of the stage attribute. + */ + domGlsl_pipeline_stage getStage() const { return attrStage; } + /** + * Sets the stage attribute. + * @param atStage The new value for the stage attribute. + */ + void setStage( domGlsl_pipeline_stage atStage ) { attrStage = atStage; + _validAttributeArray[0] = true; } + + /** + * Gets the annotate element array. + * @return Returns a reference to the array of annotate elements. + */ + domFx_annotate_common_Array &getAnnotate_array() { return elemAnnotate_array; } + /** + * Gets the annotate element array. + * @return Returns a constant reference to the array of annotate elements. + */ + const domFx_annotate_common_Array &getAnnotate_array() const { return elemAnnotate_array; } + /** + * Gets the compiler_target element. + * @return a daeSmartRef to the compiler_target element. + */ + const domCompiler_targetRef getCompiler_target() const { return elemCompiler_target; } + /** + * Gets the compiler_options element. + * @return a daeSmartRef to the compiler_options element. + */ + const domCompiler_optionsRef getCompiler_options() const { return elemCompiler_options; } + /** + * Gets the name element. + * @return a daeSmartRef to the name element. + */ + const domNameRef getName() const { return elemName; } + /** + * Gets the bind element array. + * @return Returns a reference to the array of bind elements. + */ + domBind_Array &getBind_array() { return elemBind_array; } + /** + * Gets the bind element array. + * @return Returns a constant reference to the array of bind elements. + */ + const domBind_Array &getBind_array() const { return elemBind_array; } + protected: + /** + * Constructor + */ + domShader() : attrStage(), elemAnnotate_array(), elemCompiler_target(), elemCompiler_options(), elemName(), elemBind_array() {} + /** + * Destructor + */ + virtual ~domShader() {} + /** + * Copy Constructor + */ + domShader( const domShader &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domShader &operator=( const domShader &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + + protected: // Attribute +/** + * The sid attribute is a text string value containing the sub-identifier + * of this element. This value must be unique within the scope of the parent + * element. Optional attribute. + */ + xsNCName attrSid; + + protected: // Elements + domFx_annotate_common_Array elemAnnotate_array; + domFx_colortarget_common_Array elemColor_target_array; + domFx_depthtarget_common_Array elemDepth_target_array; + domFx_stenciltarget_common_Array elemStencil_target_array; + domFx_clearcolor_common_Array elemColor_clear_array; + domFx_cleardepth_common_Array elemDepth_clear_array; + domFx_clearstencil_common_Array elemStencil_clear_array; + domDrawRef elemDraw; + domGl_pipeline_settings_Array elemGl_pipeline_settings_array; +/** + * Declare and prepare a shader for execution in the rendering pipeline of + * a pass. @see domShader + */ + domShader_Array elemShader_array; + domExtra_Array elemExtra_array; + /** + * Used to preserve order in elements that do not specify strict sequencing of sub-elements. + */ + daeElementRefArray _contents; + /** + * Used to preserve order in elements that have a complex content model. + */ + daeUIntArray _contentsOrder; + + + public: //Accessors and Mutators + /** + * Gets the sid attribute. + * @return Returns a xsNCName of the sid attribute. + */ + xsNCName getSid() const { return attrSid; } + /** + * Sets the sid attribute. + * @param atSid The new value for the sid attribute. + */ + void setSid( xsNCName atSid ) { *(daeStringRef*)&attrSid = atSid; + _validAttributeArray[0] = true; } + + /** + * Gets the annotate element array. + * @return Returns a reference to the array of annotate elements. + */ + domFx_annotate_common_Array &getAnnotate_array() { return elemAnnotate_array; } + /** + * Gets the annotate element array. + * @return Returns a constant reference to the array of annotate elements. + */ + const domFx_annotate_common_Array &getAnnotate_array() const { return elemAnnotate_array; } + /** + * Gets the color_target element array. + * @return Returns a reference to the array of color_target elements. + */ + domFx_colortarget_common_Array &getColor_target_array() { return elemColor_target_array; } + /** + * Gets the color_target element array. + * @return Returns a constant reference to the array of color_target elements. + */ + const domFx_colortarget_common_Array &getColor_target_array() const { return elemColor_target_array; } + /** + * Gets the depth_target element array. + * @return Returns a reference to the array of depth_target elements. + */ + domFx_depthtarget_common_Array &getDepth_target_array() { return elemDepth_target_array; } + /** + * Gets the depth_target element array. + * @return Returns a constant reference to the array of depth_target elements. + */ + const domFx_depthtarget_common_Array &getDepth_target_array() const { return elemDepth_target_array; } + /** + * Gets the stencil_target element array. + * @return Returns a reference to the array of stencil_target elements. + */ + domFx_stenciltarget_common_Array &getStencil_target_array() { return elemStencil_target_array; } + /** + * Gets the stencil_target element array. + * @return Returns a constant reference to the array of stencil_target elements. + */ + const domFx_stenciltarget_common_Array &getStencil_target_array() const { return elemStencil_target_array; } + /** + * Gets the color_clear element array. + * @return Returns a reference to the array of color_clear elements. + */ + domFx_clearcolor_common_Array &getColor_clear_array() { return elemColor_clear_array; } + /** + * Gets the color_clear element array. + * @return Returns a constant reference to the array of color_clear elements. + */ + const domFx_clearcolor_common_Array &getColor_clear_array() const { return elemColor_clear_array; } + /** + * Gets the depth_clear element array. + * @return Returns a reference to the array of depth_clear elements. + */ + domFx_cleardepth_common_Array &getDepth_clear_array() { return elemDepth_clear_array; } + /** + * Gets the depth_clear element array. + * @return Returns a constant reference to the array of depth_clear elements. + */ + const domFx_cleardepth_common_Array &getDepth_clear_array() const { return elemDepth_clear_array; } + /** + * Gets the stencil_clear element array. + * @return Returns a reference to the array of stencil_clear elements. + */ + domFx_clearstencil_common_Array &getStencil_clear_array() { return elemStencil_clear_array; } + /** + * Gets the stencil_clear element array. + * @return Returns a constant reference to the array of stencil_clear elements. + */ + const domFx_clearstencil_common_Array &getStencil_clear_array() const { return elemStencil_clear_array; } + /** + * Gets the draw element. + * @return a daeSmartRef to the draw element. + */ + const domDrawRef getDraw() const { return elemDraw; } + /** + * Gets the gl_pipeline_settings element array. + * @return Returns a reference to the array of gl_pipeline_settings elements. + */ + domGl_pipeline_settings_Array &getGl_pipeline_settings_array() { return elemGl_pipeline_settings_array; } + /** + * Gets the gl_pipeline_settings element array. + * @return Returns a constant reference to the array of gl_pipeline_settings elements. + */ + const domGl_pipeline_settings_Array &getGl_pipeline_settings_array() const { return elemGl_pipeline_settings_array; } + /** + * Gets the shader element array. + * @return Returns a reference to the array of shader elements. + */ + domShader_Array &getShader_array() { return elemShader_array; } + /** + * Gets the shader element array. + * @return Returns a constant reference to the array of shader elements. + */ + const domShader_Array &getShader_array() const { return elemShader_array; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } + /** + * Gets the _contents array. + * @return Returns a reference to the _contents element array. + */ + daeElementRefArray &getContents() { return _contents; } + /** + * Gets the _contents array. + * @return Returns a constant reference to the _contents element array. + */ + const daeElementRefArray &getContents() const { return _contents; } + + protected: + /** + * Constructor + */ + domPass() : attrSid(), elemAnnotate_array(), elemColor_target_array(), elemDepth_target_array(), elemStencil_target_array(), elemColor_clear_array(), elemDepth_clear_array(), elemStencil_clear_array(), elemDraw(), elemGl_pipeline_settings_array(), elemShader_array(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domPass() {} + /** + * Copy Constructor + */ + domPass( const domPass &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domPass &operator=( const domPass &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + + protected: // Attributes +/** + * The id attribute is a text string containing the unique identifier of + * this element. This value must be unique within the instance document. + * Optional attribute. + */ + xsID attrId; +/** + * The sid attribute is a text string value containing the sub-identifier + * of this element. This value must be unique within the scope of the parent + * element. Optional attribute. + */ + xsNCName attrSid; + + protected: // Elements + domFx_annotate_common_Array elemAnnotate_array; + domFx_code_profile_Array elemCode_array; + domFx_include_common_Array elemInclude_array; + domImage_Array elemImage_array; + domGlsl_newparam_Array elemNewparam_array; + domGlsl_setparam_Array elemSetparam_array; +/** + * A static declaration of all the render states, shaders, and settings for + * one rendering pipeline. @see domPass + */ + domPass_Array elemPass_array; + domExtra_Array elemExtra_array; + /** + * Used to preserve order in elements that do not specify strict sequencing of sub-elements. + */ + daeElementRefArray _contents; + /** + * Used to preserve order in elements that have a complex content model. + */ + daeUIntArray _contentsOrder; + + + public: //Accessors and Mutators + /** + * Gets the id attribute. + * @return Returns a xsID of the id attribute. + */ + xsID getId() const { return attrId; } + /** + * Sets the id attribute. + * @param atId The new value for the id attribute. + */ + void setId( xsID atId ) { *(daeStringRef*)&attrId = atId; + _validAttributeArray[0] = true; } + + /** + * Gets the sid attribute. + * @return Returns a xsNCName of the sid attribute. + */ + xsNCName getSid() const { return attrSid; } + /** + * Sets the sid attribute. + * @param atSid The new value for the sid attribute. + */ + void setSid( xsNCName atSid ) { *(daeStringRef*)&attrSid = atSid; + _validAttributeArray[1] = true; } + + /** + * Gets the annotate element array. + * @return Returns a reference to the array of annotate elements. + */ + domFx_annotate_common_Array &getAnnotate_array() { return elemAnnotate_array; } + /** + * Gets the annotate element array. + * @return Returns a constant reference to the array of annotate elements. + */ + const domFx_annotate_common_Array &getAnnotate_array() const { return elemAnnotate_array; } + /** + * Gets the code element array. + * @return Returns a reference to the array of code elements. + */ + domFx_code_profile_Array &getCode_array() { return elemCode_array; } + /** + * Gets the code element array. + * @return Returns a constant reference to the array of code elements. + */ + const domFx_code_profile_Array &getCode_array() const { return elemCode_array; } + /** + * Gets the include element array. + * @return Returns a reference to the array of include elements. + */ + domFx_include_common_Array &getInclude_array() { return elemInclude_array; } + /** + * Gets the include element array. + * @return Returns a constant reference to the array of include elements. + */ + const domFx_include_common_Array &getInclude_array() const { return elemInclude_array; } + /** + * Gets the image element array. + * @return Returns a reference to the array of image elements. + */ + domImage_Array &getImage_array() { return elemImage_array; } + /** + * Gets the image element array. + * @return Returns a constant reference to the array of image elements. + */ + const domImage_Array &getImage_array() const { return elemImage_array; } + /** + * Gets the newparam element array. + * @return Returns a reference to the array of newparam elements. + */ + domGlsl_newparam_Array &getNewparam_array() { return elemNewparam_array; } + /** + * Gets the newparam element array. + * @return Returns a constant reference to the array of newparam elements. + */ + const domGlsl_newparam_Array &getNewparam_array() const { return elemNewparam_array; } + /** + * Gets the setparam element array. + * @return Returns a reference to the array of setparam elements. + */ + domGlsl_setparam_Array &getSetparam_array() { return elemSetparam_array; } + /** + * Gets the setparam element array. + * @return Returns a constant reference to the array of setparam elements. + */ + const domGlsl_setparam_Array &getSetparam_array() const { return elemSetparam_array; } + /** + * Gets the pass element array. + * @return Returns a reference to the array of pass elements. + */ + domPass_Array &getPass_array() { return elemPass_array; } + /** + * Gets the pass element array. + * @return Returns a constant reference to the array of pass elements. + */ + const domPass_Array &getPass_array() const { return elemPass_array; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } + /** + * Gets the _contents array. + * @return Returns a reference to the _contents element array. + */ + daeElementRefArray &getContents() { return _contents; } + /** + * Gets the _contents array. + * @return Returns a constant reference to the _contents element array. + */ + const daeElementRefArray &getContents() const { return _contents; } + + protected: + /** + * Constructor + */ + domTechnique() : attrId(), attrSid(), elemAnnotate_array(), elemCode_array(), elemInclude_array(), elemImage_array(), elemNewparam_array(), elemSetparam_array(), elemPass_array(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domTechnique() {} + /** + * Copy Constructor + */ + domTechnique( const domTechnique &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domTechnique &operator=( const domTechnique &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + +protected: // Attribute +/** + * The id attribute is a text string containing the unique identifier of + * this element. This value must be unique within the instance document. + * Optional attribute. + */ + xsID attrId; + +protected: // Elements + domAssetRef elemAsset; + domFx_code_profile_Array elemCode_array; + domFx_include_common_Array elemInclude_array; + domImage_Array elemImage_array; + domGlsl_newparam_Array elemNewparam_array; +/** + * Holds a description of the textures, samplers, shaders, parameters, and + * passes necessary for rendering this effect using one method. @see domTechnique + */ + domTechnique_Array elemTechnique_array; + domExtra_Array elemExtra_array; + /** + * Used to preserve order in elements that do not specify strict sequencing of sub-elements. + */ + daeElementRefArray _contents; + /** + * Used to preserve order in elements that have a complex content model. + */ + daeUIntArray _contentsOrder; + + +public: //Accessors and Mutators + /** + * Gets the id attribute. + * @return Returns a xsID of the id attribute. + */ + xsID getId() const { return attrId; } + /** + * Sets the id attribute. + * @param atId The new value for the id attribute. + */ + void setId( xsID atId ) { *(daeStringRef*)&attrId = atId; + _validAttributeArray[0] = true; } + + /** + * Gets the asset element. + * @return a daeSmartRef to the asset element. + */ + const domAssetRef getAsset() const { return elemAsset; } + /** + * Gets the code element array. + * @return Returns a reference to the array of code elements. + */ + domFx_code_profile_Array &getCode_array() { return elemCode_array; } + /** + * Gets the code element array. + * @return Returns a constant reference to the array of code elements. + */ + const domFx_code_profile_Array &getCode_array() const { return elemCode_array; } + /** + * Gets the include element array. + * @return Returns a reference to the array of include elements. + */ + domFx_include_common_Array &getInclude_array() { return elemInclude_array; } + /** + * Gets the include element array. + * @return Returns a constant reference to the array of include elements. + */ + const domFx_include_common_Array &getInclude_array() const { return elemInclude_array; } + /** + * Gets the image element array. + * @return Returns a reference to the array of image elements. + */ + domImage_Array &getImage_array() { return elemImage_array; } + /** + * Gets the image element array. + * @return Returns a constant reference to the array of image elements. + */ + const domImage_Array &getImage_array() const { return elemImage_array; } + /** + * Gets the newparam element array. + * @return Returns a reference to the array of newparam elements. + */ + domGlsl_newparam_Array &getNewparam_array() { return elemNewparam_array; } + /** + * Gets the newparam element array. + * @return Returns a constant reference to the array of newparam elements. + */ + const domGlsl_newparam_Array &getNewparam_array() const { return elemNewparam_array; } + /** + * Gets the technique element array. + * @return Returns a reference to the array of technique elements. + */ + domTechnique_Array &getTechnique_array() { return elemTechnique_array; } + /** + * Gets the technique element array. + * @return Returns a constant reference to the array of technique elements. + */ + const domTechnique_Array &getTechnique_array() const { return elemTechnique_array; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } + /** + * Gets the _contents array. + * @return Returns a reference to the _contents element array. + */ + daeElementRefArray &getContents() { return _contents; } + /** + * Gets the _contents array. + * @return Returns a constant reference to the _contents element array. + */ + const daeElementRefArray &getContents() const { return _contents; } + +protected: + /** + * Constructor + */ + domProfile_GLSL() : attrId(), elemAsset(), elemCode_array(), elemInclude_array(), elemImage_array(), elemNewparam_array(), elemTechnique_array(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domProfile_GLSL() {} + /** + * Copy Constructor + */ + domProfile_GLSL( const domProfile_GLSL &cpy ) : domFx_profile_abstract() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domProfile_GLSL &operator=( const domProfile_GLSL &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domRigid_body.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domRigid_body.h new file mode 100644 index 00000000..2c2b31f4 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domRigid_body.h @@ -0,0 +1,832 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domRigid_body_h__ +#define __domRigid_body_h__ + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +/** + * This element allows for describing simulated bodies that do not deform. + * These bodies may or may not be connected by constraints (hinge, ball-joint + * etc.). Rigid-bodies, constraints etc. are encapsulated in physics_model + * elements to allow for instantiating complex models. + */ +class domRigid_body : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::RIGID_BODY; } +public: + class domTechnique_common; + + typedef daeSmartRef domTechnique_commonRef; + typedef daeTArray domTechnique_common_Array; + +/** + * The technique_common element specifies the rigid_body information for the + * common profile which all COLLADA implementations need to support. + */ + class domTechnique_common : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::TECHNIQUE_COMMON; } + public: + class domDynamic; + + typedef daeSmartRef domDynamicRef; + typedef daeTArray domDynamic_Array; + +/** + * If false, the rigid_body is not moveable + */ + class domDynamic : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::DYNAMIC; } + protected: // Attribute +/** + * The sid attribute is a text string value containing the sub-identifier + * of this element. This value must be unique within the scope of the parent + * element. Optional attribute. + */ + xsNCName attrSid; + + protected: // Value + /** + * The domBool value of the text data of this element. + */ + domBool _value; + + public: //Accessors and Mutators + /** + * Gets the sid attribute. + * @return Returns a xsNCName of the sid attribute. + */ + xsNCName getSid() const { return attrSid; } + /** + * Sets the sid attribute. + * @param atSid The new value for the sid attribute. + */ + void setSid( xsNCName atSid ) { *(daeStringRef*)&attrSid = atSid; + _validAttributeArray[0] = true; } + + /** + * Gets the value of this element. + * @return a domBool of the value. + */ + domBool getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( domBool val ) { _value = val; } + + protected: + /** + * Constructor + */ + domDynamic() : attrSid(), _value() {} + /** + * Destructor + */ + virtual ~domDynamic() {} + /** + * Copy Constructor + */ + domDynamic( const domDynamic &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domDynamic &operator=( const domDynamic &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domMass_frame; + + typedef daeSmartRef domMass_frameRef; + typedef daeTArray domMass_frame_Array; + +/** + * Defines the center and orientation of mass of the rigid-body relative to + * the local origin of the “root†shape.This makes the off-diagonal elements + * of the inertia tensor (products of inertia) all 0 and allows us to just + * store the diagonal elements (moments of inertia). + */ + class domMass_frame : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::MASS_FRAME; } + + protected: // Elements + domTranslate_Array elemTranslate_array; + domRotate_Array elemRotate_array; + /** + * Used to preserve order in elements that do not specify strict sequencing of sub-elements. + */ + daeElementRefArray _contents; + /** + * Used to preserve order in elements that have a complex content model. + */ + daeUIntArray _contentsOrder; + + + public: //Accessors and Mutators + /** + * Gets the translate element array. + * @return Returns a reference to the array of translate elements. + */ + domTranslate_Array &getTranslate_array() { return elemTranslate_array; } + /** + * Gets the translate element array. + * @return Returns a constant reference to the array of translate elements. + */ + const domTranslate_Array &getTranslate_array() const { return elemTranslate_array; } + /** + * Gets the rotate element array. + * @return Returns a reference to the array of rotate elements. + */ + domRotate_Array &getRotate_array() { return elemRotate_array; } + /** + * Gets the rotate element array. + * @return Returns a constant reference to the array of rotate elements. + */ + const domRotate_Array &getRotate_array() const { return elemRotate_array; } + /** + * Gets the _contents array. + * @return Returns a reference to the _contents element array. + */ + daeElementRefArray &getContents() { return _contents; } + /** + * Gets the _contents array. + * @return Returns a constant reference to the _contents element array. + */ + const daeElementRefArray &getContents() const { return _contents; } + + protected: + /** + * Constructor + */ + domMass_frame() : elemTranslate_array(), elemRotate_array() {} + /** + * Destructor + */ + virtual ~domMass_frame() {} + /** + * Copy Constructor + */ + domMass_frame( const domMass_frame &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domMass_frame &operator=( const domMass_frame &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domShape; + + typedef daeSmartRef domShapeRef; + typedef daeTArray domShape_Array; + +/** + * This element allows for describing components of a rigid_body. + */ + class domShape : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::SHAPE; } + public: + class domHollow; + + typedef daeSmartRef domHollowRef; + typedef daeTArray domHollow_Array; + +/** + * If true, the mass is distributed along the surface of the shape + */ + class domHollow : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::HOLLOW; } + protected: // Attribute +/** + * The sid attribute is a text string value containing the sub-identifier + * of this element. This value must be unique within the scope of the parent + * element. Optional attribute. + */ + xsNCName attrSid; + + protected: // Value + /** + * The domBool value of the text data of this element. + */ + domBool _value; + + public: //Accessors and Mutators + /** + * Gets the sid attribute. + * @return Returns a xsNCName of the sid attribute. + */ + xsNCName getSid() const { return attrSid; } + /** + * Sets the sid attribute. + * @param atSid The new value for the sid attribute. + */ + void setSid( xsNCName atSid ) { *(daeStringRef*)&attrSid = atSid; + _validAttributeArray[0] = true; } + + /** + * Gets the value of this element. + * @return a domBool of the value. + */ + domBool getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( domBool val ) { _value = val; } + + protected: + /** + * Constructor + */ + domHollow() : attrSid(), _value() {} + /** + * Destructor + */ + virtual ~domHollow() {} + /** + * Copy Constructor + */ + domHollow( const domHollow &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domHollow &operator=( const domHollow &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + + + protected: // Elements +/** + * If true, the mass is distributed along the surface of the shape @see domHollow + */ + domHollowRef elemHollow; +/** + * The mass of the shape. @see domMass + */ + domTargetableFloatRef elemMass; +/** + * The density of the shape. @see domDensity + */ + domTargetableFloatRef elemDensity; +/** + * References a physics_material for the shape. @see domInstance_physics_material + */ + domInstance_physics_materialRef elemInstance_physics_material; +/** + * Defines a physics_material for the shape. @see domPhysics_material + */ + domPhysics_materialRef elemPhysics_material; +/** + * Instances a geometry to use to define this shape. @see domInstance_geometry + */ + domInstance_geometryRef elemInstance_geometry; +/** + * Defines a plane to use for this shape. @see domPlane + */ + domPlaneRef elemPlane; +/** + * Defines a box to use for this shape. @see domBox + */ + domBoxRef elemBox; +/** + * Defines a sphere to use for this shape. @see domSphere + */ + domSphereRef elemSphere; +/** + * Defines a cyliner to use for this shape. @see domCylinder + */ + domCylinderRef elemCylinder; +/** + * Defines a tapered_cylinder to use for this shape. @see domTapered_cylinder + */ + domTapered_cylinderRef elemTapered_cylinder; +/** + * Defines a capsule to use for this shape. @see domCapsule + */ + domCapsuleRef elemCapsule; +/** + * Defines a tapered_capsule to use for this shape. @see domTapered_capsule + */ + domTapered_capsuleRef elemTapered_capsule; +/** + * Allows a tranformation for the shape. @see domTranslate + */ + domTranslate_Array elemTranslate_array; +/** + * Allows a tranformation for the shape. @see domRotate + */ + domRotate_Array elemRotate_array; +/** + * The extra element may appear any number of times. @see domExtra + */ + domExtra_Array elemExtra_array; + /** + * Used to preserve order in elements that do not specify strict sequencing of sub-elements. + */ + daeElementRefArray _contents; + /** + * Used to preserve order in elements that have a complex content model. + */ + daeUIntArray _contentsOrder; + + + public: //Accessors and Mutators + /** + * Gets the hollow element. + * @return a daeSmartRef to the hollow element. + */ + const domHollowRef getHollow() const { return elemHollow; } + /** + * Gets the mass element. + * @return a daeSmartRef to the mass element. + */ + const domTargetableFloatRef getMass() const { return elemMass; } + /** + * Gets the density element. + * @return a daeSmartRef to the density element. + */ + const domTargetableFloatRef getDensity() const { return elemDensity; } + /** + * Gets the instance_physics_material element. + * @return a daeSmartRef to the instance_physics_material element. + */ + const domInstance_physics_materialRef getInstance_physics_material() const { return elemInstance_physics_material; } + /** + * Gets the physics_material element. + * @return a daeSmartRef to the physics_material element. + */ + const domPhysics_materialRef getPhysics_material() const { return elemPhysics_material; } + /** + * Gets the instance_geometry element. + * @return a daeSmartRef to the instance_geometry element. + */ + const domInstance_geometryRef getInstance_geometry() const { return elemInstance_geometry; } + /** + * Gets the plane element. + * @return a daeSmartRef to the plane element. + */ + const domPlaneRef getPlane() const { return elemPlane; } + /** + * Gets the box element. + * @return a daeSmartRef to the box element. + */ + const domBoxRef getBox() const { return elemBox; } + /** + * Gets the sphere element. + * @return a daeSmartRef to the sphere element. + */ + const domSphereRef getSphere() const { return elemSphere; } + /** + * Gets the cylinder element. + * @return a daeSmartRef to the cylinder element. + */ + const domCylinderRef getCylinder() const { return elemCylinder; } + /** + * Gets the tapered_cylinder element. + * @return a daeSmartRef to the tapered_cylinder element. + */ + const domTapered_cylinderRef getTapered_cylinder() const { return elemTapered_cylinder; } + /** + * Gets the capsule element. + * @return a daeSmartRef to the capsule element. + */ + const domCapsuleRef getCapsule() const { return elemCapsule; } + /** + * Gets the tapered_capsule element. + * @return a daeSmartRef to the tapered_capsule element. + */ + const domTapered_capsuleRef getTapered_capsule() const { return elemTapered_capsule; } + /** + * Gets the translate element array. + * @return Returns a reference to the array of translate elements. + */ + domTranslate_Array &getTranslate_array() { return elemTranslate_array; } + /** + * Gets the translate element array. + * @return Returns a constant reference to the array of translate elements. + */ + const domTranslate_Array &getTranslate_array() const { return elemTranslate_array; } + /** + * Gets the rotate element array. + * @return Returns a reference to the array of rotate elements. + */ + domRotate_Array &getRotate_array() { return elemRotate_array; } + /** + * Gets the rotate element array. + * @return Returns a constant reference to the array of rotate elements. + */ + const domRotate_Array &getRotate_array() const { return elemRotate_array; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } + /** + * Gets the _contents array. + * @return Returns a reference to the _contents element array. + */ + daeElementRefArray &getContents() { return _contents; } + /** + * Gets the _contents array. + * @return Returns a constant reference to the _contents element array. + */ + const daeElementRefArray &getContents() const { return _contents; } + + protected: + /** + * Constructor + */ + domShape() : elemHollow(), elemMass(), elemDensity(), elemInstance_physics_material(), elemPhysics_material(), elemInstance_geometry(), elemPlane(), elemBox(), elemSphere(), elemCylinder(), elemTapered_cylinder(), elemCapsule(), elemTapered_capsule(), elemTranslate_array(), elemRotate_array(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domShape() {} + /** + * Copy Constructor + */ + domShape( const domShape &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domShape &operator=( const domShape &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + + + protected: // Elements +/** + * If false, the rigid_body is not moveable @see domDynamic + */ + domDynamicRef elemDynamic; +/** + * The total mass of the rigid-body @see domMass + */ + domTargetableFloatRef elemMass; +/** + * Defines the center and orientation of mass of the rigid-body relative to + * the local origin of the “root†shape.This makes the off-diagonal elements + * of the inertia tensor (products of inertia) all 0 and allows us to just + * store the diagonal elements (moments of inertia). @see domMass_frame + */ + domMass_frameRef elemMass_frame; +/** + * float3 – The diagonal elements of the inertia tensor (moments of inertia), + * which is represented in the local frame of the center of mass. See above. + * @see domInertia + */ + domTargetableFloat3Ref elemInertia; +/** + * References a physics_material for the rigid_body. @see domInstance_physics_material + */ + domInstance_physics_materialRef elemInstance_physics_material; +/** + * Defines a physics_material for the rigid_body. @see domPhysics_material + */ + domPhysics_materialRef elemPhysics_material; +/** + * This element allows for describing components of a rigid_body. @see domShape + */ + domShape_Array elemShape_array; + /** + * Used to preserve order in elements that do not specify strict sequencing of sub-elements. + */ + daeElementRefArray _contents; + /** + * Used to preserve order in elements that have a complex content model. + */ + daeUIntArray _contentsOrder; + + + public: //Accessors and Mutators + /** + * Gets the dynamic element. + * @return a daeSmartRef to the dynamic element. + */ + const domDynamicRef getDynamic() const { return elemDynamic; } + /** + * Gets the mass element. + * @return a daeSmartRef to the mass element. + */ + const domTargetableFloatRef getMass() const { return elemMass; } + /** + * Gets the mass_frame element. + * @return a daeSmartRef to the mass_frame element. + */ + const domMass_frameRef getMass_frame() const { return elemMass_frame; } + /** + * Gets the inertia element. + * @return a daeSmartRef to the inertia element. + */ + const domTargetableFloat3Ref getInertia() const { return elemInertia; } + /** + * Gets the instance_physics_material element. + * @return a daeSmartRef to the instance_physics_material element. + */ + const domInstance_physics_materialRef getInstance_physics_material() const { return elemInstance_physics_material; } + /** + * Gets the physics_material element. + * @return a daeSmartRef to the physics_material element. + */ + const domPhysics_materialRef getPhysics_material() const { return elemPhysics_material; } + /** + * Gets the shape element array. + * @return Returns a reference to the array of shape elements. + */ + domShape_Array &getShape_array() { return elemShape_array; } + /** + * Gets the shape element array. + * @return Returns a constant reference to the array of shape elements. + */ + const domShape_Array &getShape_array() const { return elemShape_array; } + /** + * Gets the _contents array. + * @return Returns a reference to the _contents element array. + */ + daeElementRefArray &getContents() { return _contents; } + /** + * Gets the _contents array. + * @return Returns a constant reference to the _contents element array. + */ + const daeElementRefArray &getContents() const { return _contents; } + + protected: + /** + * Constructor + */ + domTechnique_common() : elemDynamic(), elemMass(), elemMass_frame(), elemInertia(), elemInstance_physics_material(), elemPhysics_material(), elemShape_array() {} + /** + * Destructor + */ + virtual ~domTechnique_common() {} + /** + * Copy Constructor + */ + domTechnique_common( const domTechnique_common &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domTechnique_common &operator=( const domTechnique_common &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + +protected: // Attributes +/** + * The sid attribute is a text string value containing the sub-identifier + * of this element. This value must be unique within the scope of the parent + * element. Optional attribute. + */ + xsNCName attrSid; +/** + * The name attribute is the text string name of this element. Optional attribute. + */ + xsNCName attrName; + +protected: // Elements +/** + * The technique_common element specifies the rigid_body information for the + * common profile which all COLLADA implementations need to support. @see + * domTechnique_common + */ + domTechnique_commonRef elemTechnique_common; +/** + * This element may contain any number of non-common profile techniques. + * @see domTechnique + */ + domTechnique_Array elemTechnique_array; +/** + * The extra element may appear any number of times. @see domExtra + */ + domExtra_Array elemExtra_array; + +public: //Accessors and Mutators + /** + * Gets the sid attribute. + * @return Returns a xsNCName of the sid attribute. + */ + xsNCName getSid() const { return attrSid; } + /** + * Sets the sid attribute. + * @param atSid The new value for the sid attribute. + */ + void setSid( xsNCName atSid ) { *(daeStringRef*)&attrSid = atSid; + _validAttributeArray[0] = true; } + + /** + * Gets the name attribute. + * @return Returns a xsNCName of the name attribute. + */ + xsNCName getName() const { return attrName; } + /** + * Sets the name attribute. + * @param atName The new value for the name attribute. + */ + void setName( xsNCName atName ) { *(daeStringRef*)&attrName = atName; + _validAttributeArray[1] = true; } + + /** + * Gets the technique_common element. + * @return a daeSmartRef to the technique_common element. + */ + const domTechnique_commonRef getTechnique_common() const { return elemTechnique_common; } + /** + * Gets the technique element array. + * @return Returns a reference to the array of technique elements. + */ + domTechnique_Array &getTechnique_array() { return elemTechnique_array; } + /** + * Gets the technique element array. + * @return Returns a constant reference to the array of technique elements. + */ + const domTechnique_Array &getTechnique_array() const { return elemTechnique_array; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } +protected: + /** + * Constructor + */ + domRigid_body() : attrSid(), attrName(), elemTechnique_common(), elemTechnique_array(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domRigid_body() {} + /** + * Copy Constructor + */ + domRigid_body( const domRigid_body &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domRigid_body &operator=( const domRigid_body &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domRigid_constraint.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domRigid_constraint.h new file mode 100644 index 00000000..d3cde20b --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domRigid_constraint.h @@ -0,0 +1,1198 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domRigid_constraint_h__ +#define __domRigid_constraint_h__ + +#include +#include + +#include +#include +#include +#include +#include +#include + +/** + * This element allows for connecting components, such as rigid_body into + * complex physics models with moveable parts. + */ +class domRigid_constraint : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::RIGID_CONSTRAINT; } +public: + class domRef_attachment; + + typedef daeSmartRef domRef_attachmentRef; + typedef daeTArray domRef_attachment_Array; + +/** + * Defines the attachment (to a rigid_body or a node) to be used as the reference-frame. + */ + class domRef_attachment : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::REF_ATTACHMENT; } + protected: // Attribute +/** + * The “rigid_body†attribute is a relative reference to a rigid-body + * within the same physics_model. + */ + xsAnyURI attrRigid_body; + + protected: // Elements +/** + * Allows you to "position" the attachment point. @see domTranslate + */ + domTranslate_Array elemTranslate_array; +/** + * Allows you to "position" the attachment point. @see domRotate + */ + domRotate_Array elemRotate_array; +/** + * The extra element may appear any number of times. @see domExtra + */ + domExtra_Array elemExtra_array; + /** + * Used to preserve order in elements that do not specify strict sequencing of sub-elements. + */ + daeElementRefArray _contents; + /** + * Used to preserve order in elements that have a complex content model. + */ + daeUIntArray _contentsOrder; + + + public: //Accessors and Mutators + /** + * Gets the rigid_body attribute. + * @return Returns a xsAnyURI reference of the rigid_body attribute. + */ + xsAnyURI &getRigid_body() { return attrRigid_body; } + /** + * Gets the rigid_body attribute. + * @return Returns a constant xsAnyURI reference of the rigid_body attribute. + */ + const xsAnyURI &getRigid_body() const { return attrRigid_body; } + /** + * Sets the rigid_body attribute. + * @param atRigid_body The new value for the rigid_body attribute. + */ + void setRigid_body( const xsAnyURI &atRigid_body ) { attrRigid_body = atRigid_body; + _validAttributeArray[0] = true; } + + /** + * Gets the translate element array. + * @return Returns a reference to the array of translate elements. + */ + domTranslate_Array &getTranslate_array() { return elemTranslate_array; } + /** + * Gets the translate element array. + * @return Returns a constant reference to the array of translate elements. + */ + const domTranslate_Array &getTranslate_array() const { return elemTranslate_array; } + /** + * Gets the rotate element array. + * @return Returns a reference to the array of rotate elements. + */ + domRotate_Array &getRotate_array() { return elemRotate_array; } + /** + * Gets the rotate element array. + * @return Returns a constant reference to the array of rotate elements. + */ + const domRotate_Array &getRotate_array() const { return elemRotate_array; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } + /** + * Gets the _contents array. + * @return Returns a reference to the _contents element array. + */ + daeElementRefArray &getContents() { return _contents; } + /** + * Gets the _contents array. + * @return Returns a constant reference to the _contents element array. + */ + const daeElementRefArray &getContents() const { return _contents; } + + protected: + /** + * Constructor + */ + domRef_attachment() : attrRigid_body(), elemTranslate_array(), elemRotate_array(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domRef_attachment() {} + /** + * Copy Constructor + */ + domRef_attachment( const domRef_attachment &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domRef_attachment &operator=( const domRef_attachment &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domAttachment; + + typedef daeSmartRef domAttachmentRef; + typedef daeTArray domAttachment_Array; + +/** + * Defines an attachment to a rigid-body or a node. + */ + class domAttachment : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::ATTACHMENT; } + protected: // Attribute +/** + * The “rigid_body†attribute is a relative reference to a rigid-body + * within the same physics_model. + */ + xsAnyURI attrRigid_body; + + protected: // Elements +/** + * Allows you to "position" the attachment point. @see domTranslate + */ + domTranslate_Array elemTranslate_array; +/** + * Allows you to "position" the attachment point. @see domRotate + */ + domRotate_Array elemRotate_array; +/** + * The extra element may appear any number of times. @see domExtra + */ + domExtra_Array elemExtra_array; + /** + * Used to preserve order in elements that do not specify strict sequencing of sub-elements. + */ + daeElementRefArray _contents; + /** + * Used to preserve order in elements that have a complex content model. + */ + daeUIntArray _contentsOrder; + + + public: //Accessors and Mutators + /** + * Gets the rigid_body attribute. + * @return Returns a xsAnyURI reference of the rigid_body attribute. + */ + xsAnyURI &getRigid_body() { return attrRigid_body; } + /** + * Gets the rigid_body attribute. + * @return Returns a constant xsAnyURI reference of the rigid_body attribute. + */ + const xsAnyURI &getRigid_body() const { return attrRigid_body; } + /** + * Sets the rigid_body attribute. + * @param atRigid_body The new value for the rigid_body attribute. + */ + void setRigid_body( const xsAnyURI &atRigid_body ) { attrRigid_body = atRigid_body; + _validAttributeArray[0] = true; } + + /** + * Gets the translate element array. + * @return Returns a reference to the array of translate elements. + */ + domTranslate_Array &getTranslate_array() { return elemTranslate_array; } + /** + * Gets the translate element array. + * @return Returns a constant reference to the array of translate elements. + */ + const domTranslate_Array &getTranslate_array() const { return elemTranslate_array; } + /** + * Gets the rotate element array. + * @return Returns a reference to the array of rotate elements. + */ + domRotate_Array &getRotate_array() { return elemRotate_array; } + /** + * Gets the rotate element array. + * @return Returns a constant reference to the array of rotate elements. + */ + const domRotate_Array &getRotate_array() const { return elemRotate_array; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } + /** + * Gets the _contents array. + * @return Returns a reference to the _contents element array. + */ + daeElementRefArray &getContents() { return _contents; } + /** + * Gets the _contents array. + * @return Returns a constant reference to the _contents element array. + */ + const daeElementRefArray &getContents() const { return _contents; } + + protected: + /** + * Constructor + */ + domAttachment() : attrRigid_body(), elemTranslate_array(), elemRotate_array(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domAttachment() {} + /** + * Copy Constructor + */ + domAttachment( const domAttachment &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domAttachment &operator=( const domAttachment &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domTechnique_common; + + typedef daeSmartRef domTechnique_commonRef; + typedef daeTArray domTechnique_common_Array; + +/** + * The technique_common element specifies the rigid_constraint information + * for the common profile which all COLLADA implementations need to support. + */ + class domTechnique_common : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::TECHNIQUE_COMMON; } + public: + class domEnabled; + + typedef daeSmartRef domEnabledRef; + typedef daeTArray domEnabled_Array; + +/** + * If false, the constraint doesn’t exert any force or influence on the + * rigid bodies. + */ + class domEnabled : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::ENABLED; } + protected: // Attribute +/** + * The sid attribute is a text string value containing the sub-identifier + * of this element. This value must be unique within the scope of the parent + * element. Optional attribute. + */ + xsNCName attrSid; + + protected: // Value + /** + * The domBool value of the text data of this element. + */ + domBool _value; + + public: //Accessors and Mutators + /** + * Gets the sid attribute. + * @return Returns a xsNCName of the sid attribute. + */ + xsNCName getSid() const { return attrSid; } + /** + * Sets the sid attribute. + * @param atSid The new value for the sid attribute. + */ + void setSid( xsNCName atSid ) { *(daeStringRef*)&attrSid = atSid; + _validAttributeArray[0] = true; } + + /** + * Gets the value of this element. + * @return a domBool of the value. + */ + domBool getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( domBool val ) { _value = val; } + + protected: + /** + * Constructor + */ + domEnabled() : attrSid(), _value() {} + /** + * Destructor + */ + virtual ~domEnabled() {} + /** + * Copy Constructor + */ + domEnabled( const domEnabled &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domEnabled &operator=( const domEnabled &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domInterpenetrate; + + typedef daeSmartRef domInterpenetrateRef; + typedef daeTArray domInterpenetrate_Array; + +/** + * Indicates whether the attached rigid bodies may inter-penetrate. + */ + class domInterpenetrate : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::INTERPENETRATE; } + protected: // Attribute +/** + * The sid attribute is a text string value containing the sub-identifier + * of this element. This value must be unique within the scope of the parent + * element. Optional attribute. + */ + xsNCName attrSid; + + protected: // Value + /** + * The domBool value of the text data of this element. + */ + domBool _value; + + public: //Accessors and Mutators + /** + * Gets the sid attribute. + * @return Returns a xsNCName of the sid attribute. + */ + xsNCName getSid() const { return attrSid; } + /** + * Sets the sid attribute. + * @param atSid The new value for the sid attribute. + */ + void setSid( xsNCName atSid ) { *(daeStringRef*)&attrSid = atSid; + _validAttributeArray[0] = true; } + + /** + * Gets the value of this element. + * @return a domBool of the value. + */ + domBool getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( domBool val ) { _value = val; } + + protected: + /** + * Constructor + */ + domInterpenetrate() : attrSid(), _value() {} + /** + * Destructor + */ + virtual ~domInterpenetrate() {} + /** + * Copy Constructor + */ + domInterpenetrate( const domInterpenetrate &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domInterpenetrate &operator=( const domInterpenetrate &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domLimits; + + typedef daeSmartRef domLimitsRef; + typedef daeTArray domLimits_Array; + +/** + * The limits element provides a flexible way to specify the constraint limits + * (degrees of freedom and ranges). + */ + class domLimits : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::LIMITS; } + public: + class domSwing_cone_and_twist; + + typedef daeSmartRef domSwing_cone_and_twistRef; + typedef daeTArray domSwing_cone_and_twist_Array; + +/** + * The swing_cone_and_twist element describes the angular limits along each + * rotation axis in degrees. The the X and Y limits describe a “swing cone†+ * and the Z limits describe the “twist angle†range + */ + class domSwing_cone_and_twist : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::SWING_CONE_AND_TWIST; } + + protected: // Elements +/** + * The minimum values for the limit. @see domMin + */ + domTargetableFloat3Ref elemMin; +/** + * The maximum values for the limit. @see domMax + */ + domTargetableFloat3Ref elemMax; + + public: //Accessors and Mutators + /** + * Gets the min element. + * @return a daeSmartRef to the min element. + */ + const domTargetableFloat3Ref getMin() const { return elemMin; } + /** + * Gets the max element. + * @return a daeSmartRef to the max element. + */ + const domTargetableFloat3Ref getMax() const { return elemMax; } + protected: + /** + * Constructor + */ + domSwing_cone_and_twist() : elemMin(), elemMax() {} + /** + * Destructor + */ + virtual ~domSwing_cone_and_twist() {} + /** + * Copy Constructor + */ + domSwing_cone_and_twist( const domSwing_cone_and_twist &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domSwing_cone_and_twist &operator=( const domSwing_cone_and_twist &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domLinear; + + typedef daeSmartRef domLinearRef; + typedef daeTArray domLinear_Array; + +/** + * The linear element describes linear (translational) limits along each axis. + */ + class domLinear : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::LINEAR; } + + protected: // Elements +/** + * The minimum values for the limit. @see domMin + */ + domTargetableFloat3Ref elemMin; +/** + * The maximum values for the limit. @see domMax + */ + domTargetableFloat3Ref elemMax; + + public: //Accessors and Mutators + /** + * Gets the min element. + * @return a daeSmartRef to the min element. + */ + const domTargetableFloat3Ref getMin() const { return elemMin; } + /** + * Gets the max element. + * @return a daeSmartRef to the max element. + */ + const domTargetableFloat3Ref getMax() const { return elemMax; } + protected: + /** + * Constructor + */ + domLinear() : elemMin(), elemMax() {} + /** + * Destructor + */ + virtual ~domLinear() {} + /** + * Copy Constructor + */ + domLinear( const domLinear &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domLinear &operator=( const domLinear &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + + + protected: // Elements +/** + * The swing_cone_and_twist element describes the angular limits along each + * rotation axis in degrees. The the X and Y limits describe a “swing cone†+ * and the Z limits describe the “twist angle†range @see domSwing_cone_and_twist + */ + domSwing_cone_and_twistRef elemSwing_cone_and_twist; +/** + * The linear element describes linear (translational) limits along each axis. + * @see domLinear + */ + domLinearRef elemLinear; + + public: //Accessors and Mutators + /** + * Gets the swing_cone_and_twist element. + * @return a daeSmartRef to the swing_cone_and_twist element. + */ + const domSwing_cone_and_twistRef getSwing_cone_and_twist() const { return elemSwing_cone_and_twist; } + /** + * Gets the linear element. + * @return a daeSmartRef to the linear element. + */ + const domLinearRef getLinear() const { return elemLinear; } + protected: + /** + * Constructor + */ + domLimits() : elemSwing_cone_and_twist(), elemLinear() {} + /** + * Destructor + */ + virtual ~domLimits() {} + /** + * Copy Constructor + */ + domLimits( const domLimits &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domLimits &operator=( const domLimits &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domSpring; + + typedef daeSmartRef domSpringRef; + typedef daeTArray domSpring_Array; + +/** + * Spring, based on distance (“LINEARâ€) or angle (“ANGULARâ€). + */ + class domSpring : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::SPRING; } + public: + class domAngular; + + typedef daeSmartRef domAngularRef; + typedef daeTArray domAngular_Array; + +/** + * The angular spring properties. + */ + class domAngular : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::ANGULAR; } + + protected: // Elements +/** + * The stiffness (also called spring coefficient) has units of force/angle + * in degrees. @see domStiffness + */ + domTargetableFloatRef elemStiffness; +/** + * The spring damping coefficient. @see domDamping + */ + domTargetableFloatRef elemDamping; +/** + * The spring's target or resting distance. @see domTarget_value + */ + domTargetableFloatRef elemTarget_value; + + public: //Accessors and Mutators + /** + * Gets the stiffness element. + * @return a daeSmartRef to the stiffness element. + */ + const domTargetableFloatRef getStiffness() const { return elemStiffness; } + /** + * Gets the damping element. + * @return a daeSmartRef to the damping element. + */ + const domTargetableFloatRef getDamping() const { return elemDamping; } + /** + * Gets the target_value element. + * @return a daeSmartRef to the target_value element. + */ + const domTargetableFloatRef getTarget_value() const { return elemTarget_value; } + protected: + /** + * Constructor + */ + domAngular() : elemStiffness(), elemDamping(), elemTarget_value() {} + /** + * Destructor + */ + virtual ~domAngular() {} + /** + * Copy Constructor + */ + domAngular( const domAngular &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domAngular &operator=( const domAngular &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domLinear; + + typedef daeSmartRef domLinearRef; + typedef daeTArray domLinear_Array; + +/** + * The linear spring properties. + */ + class domLinear : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::LINEAR; } + + protected: // Elements +/** + * The stiffness (also called spring coefficient) has units of force/distance. + * @see domStiffness + */ + domTargetableFloatRef elemStiffness; +/** + * The spring damping coefficient. @see domDamping + */ + domTargetableFloatRef elemDamping; +/** + * The spring's target or resting distance. @see domTarget_value + */ + domTargetableFloatRef elemTarget_value; + + public: //Accessors and Mutators + /** + * Gets the stiffness element. + * @return a daeSmartRef to the stiffness element. + */ + const domTargetableFloatRef getStiffness() const { return elemStiffness; } + /** + * Gets the damping element. + * @return a daeSmartRef to the damping element. + */ + const domTargetableFloatRef getDamping() const { return elemDamping; } + /** + * Gets the target_value element. + * @return a daeSmartRef to the target_value element. + */ + const domTargetableFloatRef getTarget_value() const { return elemTarget_value; } + protected: + /** + * Constructor + */ + domLinear() : elemStiffness(), elemDamping(), elemTarget_value() {} + /** + * Destructor + */ + virtual ~domLinear() {} + /** + * Copy Constructor + */ + domLinear( const domLinear &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domLinear &operator=( const domLinear &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + + + protected: // Elements +/** + * The angular spring properties. @see domAngular + */ + domAngularRef elemAngular; +/** + * The linear spring properties. @see domLinear + */ + domLinearRef elemLinear; + + public: //Accessors and Mutators + /** + * Gets the angular element. + * @return a daeSmartRef to the angular element. + */ + const domAngularRef getAngular() const { return elemAngular; } + /** + * Gets the linear element. + * @return a daeSmartRef to the linear element. + */ + const domLinearRef getLinear() const { return elemLinear; } + protected: + /** + * Constructor + */ + domSpring() : elemAngular(), elemLinear() {} + /** + * Destructor + */ + virtual ~domSpring() {} + /** + * Copy Constructor + */ + domSpring( const domSpring &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domSpring &operator=( const domSpring &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + + + protected: // Elements +/** + * If false, the constraint doesn’t exert any force or influence on the + * rigid bodies. @see domEnabled + */ + domEnabledRef elemEnabled; +/** + * Indicates whether the attached rigid bodies may inter-penetrate. @see domInterpenetrate + */ + domInterpenetrateRef elemInterpenetrate; +/** + * The limits element provides a flexible way to specify the constraint limits + * (degrees of freedom and ranges). @see domLimits + */ + domLimitsRef elemLimits; +/** + * Spring, based on distance (“LINEARâ€) or angle (“ANGULARâ€). @see + * domSpring + */ + domSpringRef elemSpring; + + public: //Accessors and Mutators + /** + * Gets the enabled element. + * @return a daeSmartRef to the enabled element. + */ + const domEnabledRef getEnabled() const { return elemEnabled; } + /** + * Gets the interpenetrate element. + * @return a daeSmartRef to the interpenetrate element. + */ + const domInterpenetrateRef getInterpenetrate() const { return elemInterpenetrate; } + /** + * Gets the limits element. + * @return a daeSmartRef to the limits element. + */ + const domLimitsRef getLimits() const { return elemLimits; } + /** + * Gets the spring element. + * @return a daeSmartRef to the spring element. + */ + const domSpringRef getSpring() const { return elemSpring; } + protected: + /** + * Constructor + */ + domTechnique_common() : elemEnabled(), elemInterpenetrate(), elemLimits(), elemSpring() {} + /** + * Destructor + */ + virtual ~domTechnique_common() {} + /** + * Copy Constructor + */ + domTechnique_common( const domTechnique_common &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domTechnique_common &operator=( const domTechnique_common &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + +protected: // Attributes +/** + * The sid attribute is a text string value containing the sub-identifier + * of this element. This value must be unique within the scope of the parent + * element. Optional attribute. + */ + xsNCName attrSid; +/** + * The name attribute is the text string name of this element. Optional attribute. + */ + xsNCName attrName; + +protected: // Elements +/** + * Defines the attachment (to a rigid_body or a node) to be used as the reference-frame. + * @see domRef_attachment + */ + domRef_attachmentRef elemRef_attachment; +/** + * Defines an attachment to a rigid-body or a node. @see domAttachment + */ + domAttachmentRef elemAttachment; +/** + * The technique_common element specifies the rigid_constraint information + * for the common profile which all COLLADA implementations need to support. + * @see domTechnique_common + */ + domTechnique_commonRef elemTechnique_common; +/** + * This element may contain any number of non-common profile techniques. + * @see domTechnique + */ + domTechnique_Array elemTechnique_array; +/** + * The extra element may appear any number of times. @see domExtra + */ + domExtra_Array elemExtra_array; + +public: //Accessors and Mutators + /** + * Gets the sid attribute. + * @return Returns a xsNCName of the sid attribute. + */ + xsNCName getSid() const { return attrSid; } + /** + * Sets the sid attribute. + * @param atSid The new value for the sid attribute. + */ + void setSid( xsNCName atSid ) { *(daeStringRef*)&attrSid = atSid; + _validAttributeArray[0] = true; } + + /** + * Gets the name attribute. + * @return Returns a xsNCName of the name attribute. + */ + xsNCName getName() const { return attrName; } + /** + * Sets the name attribute. + * @param atName The new value for the name attribute. + */ + void setName( xsNCName atName ) { *(daeStringRef*)&attrName = atName; + _validAttributeArray[1] = true; } + + /** + * Gets the ref_attachment element. + * @return a daeSmartRef to the ref_attachment element. + */ + const domRef_attachmentRef getRef_attachment() const { return elemRef_attachment; } + /** + * Gets the attachment element. + * @return a daeSmartRef to the attachment element. + */ + const domAttachmentRef getAttachment() const { return elemAttachment; } + /** + * Gets the technique_common element. + * @return a daeSmartRef to the technique_common element. + */ + const domTechnique_commonRef getTechnique_common() const { return elemTechnique_common; } + /** + * Gets the technique element array. + * @return Returns a reference to the array of technique elements. + */ + domTechnique_Array &getTechnique_array() { return elemTechnique_array; } + /** + * Gets the technique element array. + * @return Returns a constant reference to the array of technique elements. + */ + const domTechnique_Array &getTechnique_array() const { return elemTechnique_array; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } +protected: + /** + * Constructor + */ + domRigid_constraint() : attrSid(), attrName(), elemRef_attachment(), elemAttachment(), elemTechnique_common(), elemTechnique_array(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domRigid_constraint() {} + /** + * Copy Constructor + */ + domRigid_constraint( const domRigid_constraint &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domRigid_constraint &operator=( const domRigid_constraint &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domRotate.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domRotate.h new file mode 100644 index 00000000..2898603e --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domRotate.h @@ -0,0 +1,111 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domRotate_h__ +#define __domRotate_h__ + +#include +#include + + +/** + * The rotate element contains an angle and a mathematical vector that represents + * the axis of rotation. + */ +class domRotate : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::ROTATE; } +protected: // Attribute +/** + * The sid attribute is a text string value containing the sub-identifier + * of this element. This value must be unique within the scope of the parent + * element. Optional attribute. + */ + xsNCName attrSid; + +protected: // Value + /** + * The domFloat4 value of the text data of this element. + */ + domFloat4 _value; + +public: //Accessors and Mutators + /** + * Gets the sid attribute. + * @return Returns a xsNCName of the sid attribute. + */ + xsNCName getSid() const { return attrSid; } + /** + * Sets the sid attribute. + * @param atSid The new value for the sid attribute. + */ + void setSid( xsNCName atSid ) { *(daeStringRef*)&attrSid = atSid; + _validAttributeArray[0] = true; } + + /** + * Gets the _value array. + * @return Returns a domFloat4 reference of the _value array. + */ + domFloat4 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domFloat4 reference of the _value array. + */ + const domFloat4 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domFloat4 &val ) { _value = val; } + +protected: + /** + * Constructor + */ + domRotate() : attrSid(), _value() {} + /** + * Destructor + */ + virtual ~domRotate() {} + /** + * Copy Constructor + */ + domRotate( const domRotate &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domRotate &operator=( const domRotate &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domSampler.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domSampler.h new file mode 100644 index 00000000..f6b35d09 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domSampler.h @@ -0,0 +1,108 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domSampler_h__ +#define __domSampler_h__ + +#include +#include + +#include + +/** + * The sampler element declares an N-dimensional function used for animation. + * Animation function curves are represented by 1-D sampler elements in COLLADA. + * The sampler defines sampling points and how to interpolate between them. + */ +class domSampler : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::SAMPLER; } +protected: // Attribute +/** + * The id attribute is a text string containing the unique identifier of + * this element. This value must be unique within the instance document. + * Optional attribute. + */ + xsID attrId; + +protected: // Element +/** + * The input element must occur at least one time. These inputs are local + * inputs. @see domInput + */ + domInputLocal_Array elemInput_array; + +public: //Accessors and Mutators + /** + * Gets the id attribute. + * @return Returns a xsID of the id attribute. + */ + xsID getId() const { return attrId; } + /** + * Sets the id attribute. + * @param atId The new value for the id attribute. + */ + void setId( xsID atId ) { *(daeStringRef*)&attrId = atId; + _validAttributeArray[0] = true; } + + /** + * Gets the input element array. + * @return Returns a reference to the array of input elements. + */ + domInputLocal_Array &getInput_array() { return elemInput_array; } + /** + * Gets the input element array. + * @return Returns a constant reference to the array of input elements. + */ + const domInputLocal_Array &getInput_array() const { return elemInput_array; } +protected: + /** + * Constructor + */ + domSampler() : attrId(), elemInput_array() {} + /** + * Destructor + */ + virtual ~domSampler() {} + /** + * Copy Constructor + */ + domSampler( const domSampler &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domSampler &operator=( const domSampler &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domScale.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domScale.h new file mode 100644 index 00000000..e49648df --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domScale.h @@ -0,0 +1,70 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domScale_h__ +#define __domScale_h__ + +#include +#include + +#include + +/** + * The scale element contains a mathematical vector that represents the relative + * proportions of the X, Y and Z axes of a coordinated system. + */ +class domScale : public daeElement, public domTargetableFloat3_complexType +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::SCALE; } + +protected: + /** + * Constructor + */ + domScale() {} + /** + * Destructor + */ + virtual ~domScale() {} + /** + * Copy Constructor + */ + domScale( const domScale &cpy ) : daeElement(), domTargetableFloat3_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domScale &operator=( const domScale &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domSkew.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domSkew.h new file mode 100644 index 00000000..7dd22c42 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domSkew.h @@ -0,0 +1,111 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domSkew_h__ +#define __domSkew_h__ + +#include +#include + + +/** + * The skew element contains an angle and two mathematical vectors that represent + * the axis of rotation and the axis of translation. + */ +class domSkew : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::SKEW; } +protected: // Attribute +/** + * The sid attribute is a text string value containing the sub-identifier + * of this element. This value must be unique within the scope of the parent + * element. Optional attribute. + */ + xsNCName attrSid; + +protected: // Value + /** + * The domFloat7 value of the text data of this element. + */ + domFloat7 _value; + +public: //Accessors and Mutators + /** + * Gets the sid attribute. + * @return Returns a xsNCName of the sid attribute. + */ + xsNCName getSid() const { return attrSid; } + /** + * Sets the sid attribute. + * @param atSid The new value for the sid attribute. + */ + void setSid( xsNCName atSid ) { *(daeStringRef*)&attrSid = atSid; + _validAttributeArray[0] = true; } + + /** + * Gets the _value array. + * @return Returns a domFloat7 reference of the _value array. + */ + domFloat7 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domFloat7 reference of the _value array. + */ + const domFloat7 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domFloat7 &val ) { _value = val; } + +protected: + /** + * Constructor + */ + domSkew() : attrSid(), _value() {} + /** + * Destructor + */ + virtual ~domSkew() {} + /** + * Copy Constructor + */ + domSkew( const domSkew &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domSkew &operator=( const domSkew &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domSkin.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domSkin.h new file mode 100644 index 00000000..c6b9f590 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domSkin.h @@ -0,0 +1,607 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domSkin_h__ +#define __domSkin_h__ + +#include +#include + +#include +#include +#include +#include + +/** + * The skin element contains vertex and primitive information sufficient to + * describe blend-weight skinning. + */ +class domSkin : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::SKIN; } +public: + class domBind_shape_matrix; + + typedef daeSmartRef domBind_shape_matrixRef; + typedef daeTArray domBind_shape_matrix_Array; + +/** + * This provides extra information about the position and orientation of the + * base mesh before binding. If bind_shape_matrix is not specified then an + * identity matrix may be used as the bind_shape_matrix. The bind_shape_matrix + * element may occur zero or one times. + */ + class domBind_shape_matrix : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::BIND_SHAPE_MATRIX; } + + protected: // Value + /** + * The domFloat4x4 value of the text data of this element. + */ + domFloat4x4 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domFloat4x4 reference of the _value array. + */ + domFloat4x4 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domFloat4x4 reference of the _value array. + */ + const domFloat4x4 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domFloat4x4 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domBind_shape_matrix() : _value() {} + /** + * Destructor + */ + virtual ~domBind_shape_matrix() {} + /** + * Copy Constructor + */ + domBind_shape_matrix( const domBind_shape_matrix &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domBind_shape_matrix &operator=( const domBind_shape_matrix &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domJoints; + + typedef daeSmartRef domJointsRef; + typedef daeTArray domJoints_Array; + +/** + * The joints element associates joint, or skeleton, nodes with attribute + * data. In COLLADA, this is specified by the inverse bind matrix of each + * joint (influence) in the skeleton. + */ + class domJoints : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::JOINTS; } + + protected: // Elements +/** + * The input element must occur at least twice. These inputs are local inputs. + * @see domInput + */ + domInputLocal_Array elemInput_array; +/** + * The extra element may appear any number of times. @see domExtra + */ + domExtra_Array elemExtra_array; + + public: //Accessors and Mutators + /** + * Gets the input element array. + * @return Returns a reference to the array of input elements. + */ + domInputLocal_Array &getInput_array() { return elemInput_array; } + /** + * Gets the input element array. + * @return Returns a constant reference to the array of input elements. + */ + const domInputLocal_Array &getInput_array() const { return elemInput_array; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } + protected: + /** + * Constructor + */ + domJoints() : elemInput_array(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domJoints() {} + /** + * Copy Constructor + */ + domJoints( const domJoints &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domJoints &operator=( const domJoints &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domVertex_weights; + + typedef daeSmartRef domVertex_weightsRef; + typedef daeTArray domVertex_weights_Array; + +/** + * The vertex_weights element associates a set of joint-weight pairs with + * each vertex in the base mesh. + */ + class domVertex_weights : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::VERTEX_WEIGHTS; } + public: + class domVcount; + + typedef daeSmartRef domVcountRef; + typedef daeTArray domVcount_Array; + +/** + * The vcount element contains a list of integers describing the number of + * influences for each vertex. The vcount element may occur once. + */ + class domVcount : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::VCOUNT; } + + protected: // Value + /** + * The domListOfUInts value of the text data of this element. + */ + domListOfUInts _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domListOfUInts reference of the _value array. + */ + domListOfUInts &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domListOfUInts reference of the _value array. + */ + const domListOfUInts &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domListOfUInts &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domVcount() : _value() {} + /** + * Destructor + */ + virtual ~domVcount() {} + /** + * Copy Constructor + */ + domVcount( const domVcount &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domVcount &operator=( const domVcount &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domV; + + typedef daeSmartRef domVRef; + typedef daeTArray domV_Array; + +/** + * The v element describes which bones and attributes are associated with + * each vertex. An index of –1 into the array of joints refers to the + * bind shape. Weights should be normalized before use. The v element must + * occur zero or one times. + */ + class domV : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::V; } + + protected: // Value + /** + * The domListOfInts value of the text data of this element. + */ + domListOfInts _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domListOfInts reference of the _value array. + */ + domListOfInts &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domListOfInts reference of the _value array. + */ + const domListOfInts &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domListOfInts &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domV() : _value() {} + /** + * Destructor + */ + virtual ~domV() {} + /** + * Copy Constructor + */ + domV( const domV &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domV &operator=( const domV &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + + protected: // Attribute +/** + * The count attribute describes the number of vertices in the base mesh. + * Required element. + */ + domUint attrCount; + + protected: // Elements +/** + * The input element must occur at least twice. @see domInput + */ + domInputLocalOffset_Array elemInput_array; +/** + * The vcount element contains a list of integers describing the number of + * influences for each vertex. The vcount element may occur once. @see domVcount + */ + domVcountRef elemVcount; +/** + * The v element describes which bones and attributes are associated with + * each vertex. An index of –1 into the array of joints refers to the + * bind shape. Weights should be normalized before use. The v element must + * occur zero or one times. @see domV + */ + domVRef elemV; +/** + * The extra element may appear any number of times. @see domExtra + */ + domExtra_Array elemExtra_array; + + public: //Accessors and Mutators + /** + * Gets the count attribute. + * @return Returns a domUint of the count attribute. + */ + domUint getCount() const { return attrCount; } + /** + * Sets the count attribute. + * @param atCount The new value for the count attribute. + */ + void setCount( domUint atCount ) { attrCount = atCount; + _validAttributeArray[0] = true; } + + /** + * Gets the input element array. + * @return Returns a reference to the array of input elements. + */ + domInputLocalOffset_Array &getInput_array() { return elemInput_array; } + /** + * Gets the input element array. + * @return Returns a constant reference to the array of input elements. + */ + const domInputLocalOffset_Array &getInput_array() const { return elemInput_array; } + /** + * Gets the vcount element. + * @return a daeSmartRef to the vcount element. + */ + const domVcountRef getVcount() const { return elemVcount; } + /** + * Gets the v element. + * @return a daeSmartRef to the v element. + */ + const domVRef getV() const { return elemV; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } + protected: + /** + * Constructor + */ + domVertex_weights() : attrCount(), elemInput_array(), elemVcount(), elemV(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domVertex_weights() {} + /** + * Copy Constructor + */ + domVertex_weights( const domVertex_weights &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domVertex_weights &operator=( const domVertex_weights &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + +protected: // Attribute +/** + * The source attribute contains a URI reference to the base mesh, (a static + * mesh or a morphed mesh). This also provides the bind-shape of the skinned + * mesh. Required attribute. + */ + xsAnyURI attrSource; + +protected: // Elements +/** + * This provides extra information about the position and orientation of the + * base mesh before binding. If bind_shape_matrix is not specified then an + * identity matrix may be used as the bind_shape_matrix. The bind_shape_matrix + * element may occur zero or one times. @see domBind_shape_matrix + */ + domBind_shape_matrixRef elemBind_shape_matrix; +/** + * The skin element must contain at least three source elements. @see domSource + */ + domSource_Array elemSource_array; +/** + * The joints element associates joint, or skeleton, nodes with attribute + * data. In COLLADA, this is specified by the inverse bind matrix of each + * joint (influence) in the skeleton. @see domJoints + */ + domJointsRef elemJoints; +/** + * The vertex_weights element associates a set of joint-weight pairs with + * each vertex in the base mesh. @see domVertex_weights + */ + domVertex_weightsRef elemVertex_weights; +/** + * The extra element may appear any number of times. @see domExtra + */ + domExtra_Array elemExtra_array; + +public: //Accessors and Mutators + /** + * Gets the source attribute. + * @return Returns a xsAnyURI reference of the source attribute. + */ + xsAnyURI &getSource() { return attrSource; } + /** + * Gets the source attribute. + * @return Returns a constant xsAnyURI reference of the source attribute. + */ + const xsAnyURI &getSource() const { return attrSource; } + /** + * Sets the source attribute. + * @param atSource The new value for the source attribute. + */ + void setSource( const xsAnyURI &atSource ) { attrSource = atSource; + _validAttributeArray[0] = true; } + + /** + * Gets the bind_shape_matrix element. + * @return a daeSmartRef to the bind_shape_matrix element. + */ + const domBind_shape_matrixRef getBind_shape_matrix() const { return elemBind_shape_matrix; } + /** + * Gets the source element array. + * @return Returns a reference to the array of source elements. + */ + domSource_Array &getSource_array() { return elemSource_array; } + /** + * Gets the source element array. + * @return Returns a constant reference to the array of source elements. + */ + const domSource_Array &getSource_array() const { return elemSource_array; } + /** + * Gets the joints element. + * @return a daeSmartRef to the joints element. + */ + const domJointsRef getJoints() const { return elemJoints; } + /** + * Gets the vertex_weights element. + * @return a daeSmartRef to the vertex_weights element. + */ + const domVertex_weightsRef getVertex_weights() const { return elemVertex_weights; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } +protected: + /** + * Constructor + */ + domSkin() : attrSource(), elemBind_shape_matrix(), elemSource_array(), elemJoints(), elemVertex_weights(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domSkin() {} + /** + * Copy Constructor + */ + domSkin( const domSkin &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domSkin &operator=( const domSkin &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domSource.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domSource.h new file mode 100644 index 00000000..17cc76aa --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domSource.h @@ -0,0 +1,282 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domSource_h__ +#define __domSource_h__ + +#include +#include + +#include +#include +#include +#include +#include +#include +#include +#include + +/** + * The source element declares a data repository that provides values according + * to the semantics of an input element that refers to it. + */ +class domSource : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::SOURCE; } +public: + class domTechnique_common; + + typedef daeSmartRef domTechnique_commonRef; + typedef daeTArray domTechnique_common_Array; + +/** + * The technique common specifies the common method for accessing this source + * element's data. + */ + class domTechnique_common : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::TECHNIQUE_COMMON; } + + protected: // Element +/** + * The source's technique_common must have one and only one accessor. @see + * domAccessor + */ + domAccessorRef elemAccessor; + + public: //Accessors and Mutators + /** + * Gets the accessor element. + * @return a daeSmartRef to the accessor element. + */ + const domAccessorRef getAccessor() const { return elemAccessor; } + protected: + /** + * Constructor + */ + domTechnique_common() : elemAccessor() {} + /** + * Destructor + */ + virtual ~domTechnique_common() {} + /** + * Copy Constructor + */ + domTechnique_common( const domTechnique_common &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domTechnique_common &operator=( const domTechnique_common &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + +protected: // Attributes +/** + * The id attribute is a text string containing the unique identifier of + * this element. This value must be unique within the instance document. + * Required attribute. + */ + xsID attrId; +/** + * The name attribute is the text string name of this element. Optional attribute. + */ + xsNCName attrName; + +protected: // Elements +/** + * The source element may contain an asset element. @see domAsset + */ + domAssetRef elemAsset; +/** + * The source element may contain an IDREF_array. @see domIDREF_array + */ + domIDREF_arrayRef elemIDREF_array; +/** + * The source element may contain a Name_array. @see domName_array + */ + domName_arrayRef elemName_array; +/** + * The source element may contain a bool_array. @see domBool_array + */ + domBool_arrayRef elemBool_array; +/** + * The source element may contain a float_array. @see domFloat_array + */ + domFloat_arrayRef elemFloat_array; +/** + * The source element may contain an int_array. @see domInt_array + */ + domInt_arrayRef elemInt_array; +/** + * The technique common specifies the common method for accessing this source + * element's data. @see domTechnique_common + */ + domTechnique_commonRef elemTechnique_common; +/** + * This element may contain any number of non-common profile techniques. + * @see domTechnique + */ + domTechnique_Array elemTechnique_array; + /** + * Used to preserve order in elements that do not specify strict sequencing of sub-elements. + */ + daeElementRefArray _contents; + /** + * Used to preserve order in elements that have a complex content model. + */ + daeUIntArray _contentsOrder; + + +public: //Accessors and Mutators + /** + * Gets the id attribute. + * @return Returns a xsID of the id attribute. + */ + xsID getId() const { return attrId; } + /** + * Sets the id attribute. + * @param atId The new value for the id attribute. + */ + void setId( xsID atId ) { *(daeStringRef*)&attrId = atId; + _validAttributeArray[0] = true; } + + /** + * Gets the name attribute. + * @return Returns a xsNCName of the name attribute. + */ + xsNCName getName() const { return attrName; } + /** + * Sets the name attribute. + * @param atName The new value for the name attribute. + */ + void setName( xsNCName atName ) { *(daeStringRef*)&attrName = atName; + _validAttributeArray[1] = true; } + + /** + * Gets the asset element. + * @return a daeSmartRef to the asset element. + */ + const domAssetRef getAsset() const { return elemAsset; } + /** + * Gets the IDREF_array element. + * @return a daeSmartRef to the IDREF_array element. + */ + const domIDREF_arrayRef getIDREF_array() const { return elemIDREF_array; } + /** + * Gets the Name_array element. + * @return a daeSmartRef to the Name_array element. + */ + const domName_arrayRef getName_array() const { return elemName_array; } + /** + * Gets the bool_array element. + * @return a daeSmartRef to the bool_array element. + */ + const domBool_arrayRef getBool_array() const { return elemBool_array; } + /** + * Gets the float_array element. + * @return a daeSmartRef to the float_array element. + */ + const domFloat_arrayRef getFloat_array() const { return elemFloat_array; } + /** + * Gets the int_array element. + * @return a daeSmartRef to the int_array element. + */ + const domInt_arrayRef getInt_array() const { return elemInt_array; } + /** + * Gets the technique_common element. + * @return a daeSmartRef to the technique_common element. + */ + const domTechnique_commonRef getTechnique_common() const { return elemTechnique_common; } + /** + * Gets the technique element array. + * @return Returns a reference to the array of technique elements. + */ + domTechnique_Array &getTechnique_array() { return elemTechnique_array; } + /** + * Gets the technique element array. + * @return Returns a constant reference to the array of technique elements. + */ + const domTechnique_Array &getTechnique_array() const { return elemTechnique_array; } + /** + * Gets the _contents array. + * @return Returns a reference to the _contents element array. + */ + daeElementRefArray &getContents() { return _contents; } + /** + * Gets the _contents array. + * @return Returns a constant reference to the _contents element array. + */ + const daeElementRefArray &getContents() const { return _contents; } + +protected: + /** + * Constructor + */ + domSource() : attrId(), attrName(), elemAsset(), elemIDREF_array(), elemName_array(), elemBool_array(), elemFloat_array(), elemInt_array(), elemTechnique_common(), elemTechnique_array() {} + /** + * Destructor + */ + virtual ~domSource() {} + /** + * Copy Constructor + */ + domSource( const domSource &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domSource &operator=( const domSource &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domSphere.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domSphere.h new file mode 100644 index 00000000..f16134f5 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domSphere.h @@ -0,0 +1,167 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domSphere_h__ +#define __domSphere_h__ + +#include +#include + +#include + +/** + * A centered sphere primitive. + */ +class domSphere : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::SPHERE; } +public: + class domRadius; + + typedef daeSmartRef domRadiusRef; + typedef daeTArray domRadius_Array; + +/** + * A float value that represents the radius of the sphere + */ + class domRadius : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::RADIUS; } + + protected: // Value + /** + * The domFloat value of the text data of this element. + */ + domFloat _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a domFloat of the value. + */ + domFloat getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( domFloat val ) { _value = val; } + + protected: + /** + * Constructor + */ + domRadius() : _value() {} + /** + * Destructor + */ + virtual ~domRadius() {} + /** + * Copy Constructor + */ + domRadius( const domRadius &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domRadius &operator=( const domRadius &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + + +protected: // Elements +/** + * A float value that represents the radius of the sphere @see domRadius + */ + domRadiusRef elemRadius; +/** + * The extra element may appear any number of times. @see domExtra + */ + domExtra_Array elemExtra_array; + +public: //Accessors and Mutators + /** + * Gets the radius element. + * @return a daeSmartRef to the radius element. + */ + const domRadiusRef getRadius() const { return elemRadius; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } +protected: + /** + * Constructor + */ + domSphere() : elemRadius(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domSphere() {} + /** + * Copy Constructor + */ + domSphere( const domSphere &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domSphere &operator=( const domSphere &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domSpline.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domSpline.h new file mode 100644 index 00000000..6d8c98ad --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domSpline.h @@ -0,0 +1,214 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domSpline_h__ +#define __domSpline_h__ + +#include +#include + +#include +#include +#include + +/** + * The spline element contains control vertex information sufficient to describe + * basic splines. + */ +class domSpline : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::SPLINE; } +public: + class domControl_vertices; + + typedef daeSmartRef domControl_verticesRef; + typedef daeTArray domControl_vertices_Array; + +/** + * The control vertices element must occur exactly one time. It is used + * to describe the CVs of the spline. + */ + class domControl_vertices : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::CONTROL_VERTICES; } + + protected: // Elements +/** + * The input element must occur at least one time. These inputs are local + * inputs. @see domInput + */ + domInputLocal_Array elemInput_array; +/** + * The extra element may appear any number of times. @see domExtra + */ + domExtra_Array elemExtra_array; + + public: //Accessors and Mutators + /** + * Gets the input element array. + * @return Returns a reference to the array of input elements. + */ + domInputLocal_Array &getInput_array() { return elemInput_array; } + /** + * Gets the input element array. + * @return Returns a constant reference to the array of input elements. + */ + const domInputLocal_Array &getInput_array() const { return elemInput_array; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } + protected: + /** + * Constructor + */ + domControl_vertices() : elemInput_array(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domControl_vertices() {} + /** + * Copy Constructor + */ + domControl_vertices( const domControl_vertices &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domControl_vertices &operator=( const domControl_vertices &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + +protected: // Attribute + domBool attrClosed; + +protected: // Elements +/** + * The mesh element must contain one or more source elements. @see domSource + */ + domSource_Array elemSource_array; +/** + * The control vertices element must occur exactly one time. It is used + * to describe the CVs of the spline. @see domControl_vertices + */ + domControl_verticesRef elemControl_vertices; +/** + * The extra element may appear any number of times. @see domExtra + */ + domExtra_Array elemExtra_array; + +public: //Accessors and Mutators + /** + * Gets the closed attribute. + * @return Returns a domBool of the closed attribute. + */ + domBool getClosed() const { return attrClosed; } + /** + * Sets the closed attribute. + * @param atClosed The new value for the closed attribute. + */ + void setClosed( domBool atClosed ) { attrClosed = atClosed; + _validAttributeArray[0] = true; } + + /** + * Gets the source element array. + * @return Returns a reference to the array of source elements. + */ + domSource_Array &getSource_array() { return elemSource_array; } + /** + * Gets the source element array. + * @return Returns a constant reference to the array of source elements. + */ + const domSource_Array &getSource_array() const { return elemSource_array; } + /** + * Gets the control_vertices element. + * @return a daeSmartRef to the control_vertices element. + */ + const domControl_verticesRef getControl_vertices() const { return elemControl_vertices; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } +protected: + /** + * Constructor + */ + domSpline() : attrClosed(), elemSource_array(), elemControl_vertices(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domSpline() {} + /** + * Copy Constructor + */ + domSpline( const domSpline &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domSpline &operator=( const domSpline &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domTapered_capsule.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domTapered_capsule.h new file mode 100644 index 00000000..6b86c92e --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domTapered_capsule.h @@ -0,0 +1,344 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domTapered_capsule_h__ +#define __domTapered_capsule_h__ + +#include +#include + +#include + +/** + * A tapered capsule primitive that is centered on, and aligned with, the + * local Y axis. + */ +class domTapered_capsule : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::TAPERED_CAPSULE; } +public: + class domHeight; + + typedef daeSmartRef domHeightRef; + typedef daeTArray domHeight_Array; + +/** + * A float value that represents the length of the line segment connecting + * the centers of the capping hemispheres. + */ + class domHeight : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::HEIGHT; } + + protected: // Value + /** + * The domFloat value of the text data of this element. + */ + domFloat _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a domFloat of the value. + */ + domFloat getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( domFloat val ) { _value = val; } + + protected: + /** + * Constructor + */ + domHeight() : _value() {} + /** + * Destructor + */ + virtual ~domHeight() {} + /** + * Copy Constructor + */ + domHeight( const domHeight &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domHeight &operator=( const domHeight &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domRadius1; + + typedef daeSmartRef domRadius1Ref; + typedef daeTArray domRadius1_Array; + +/** + * Two float values that represent the radii of the tapered capsule at the + * positive (height/2) Y value.Both ends of the tapered capsule may be elliptical. + */ + class domRadius1 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::RADIUS1; } + + protected: // Value + /** + * The domFloat2 value of the text data of this element. + */ + domFloat2 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domFloat2 reference of the _value array. + */ + domFloat2 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domFloat2 reference of the _value array. + */ + const domFloat2 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domFloat2 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domRadius1() : _value() {} + /** + * Destructor + */ + virtual ~domRadius1() {} + /** + * Copy Constructor + */ + domRadius1( const domRadius1 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domRadius1 &operator=( const domRadius1 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domRadius2; + + typedef daeSmartRef domRadius2Ref; + typedef daeTArray domRadius2_Array; + +/** + * Two float values that represent the radii of the tapered capsule at the + * negative (height/2) Y value.Both ends of the tapered capsule may be elliptical. + */ + class domRadius2 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::RADIUS2; } + + protected: // Value + /** + * The domFloat2 value of the text data of this element. + */ + domFloat2 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domFloat2 reference of the _value array. + */ + domFloat2 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domFloat2 reference of the _value array. + */ + const domFloat2 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domFloat2 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domRadius2() : _value() {} + /** + * Destructor + */ + virtual ~domRadius2() {} + /** + * Copy Constructor + */ + domRadius2( const domRadius2 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domRadius2 &operator=( const domRadius2 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + + +protected: // Elements +/** + * A float value that represents the length of the line segment connecting + * the centers of the capping hemispheres. @see domHeight + */ + domHeightRef elemHeight; +/** + * Two float values that represent the radii of the tapered capsule at the + * positive (height/2) Y value.Both ends of the tapered capsule may be elliptical. + * @see domRadius1 + */ + domRadius1Ref elemRadius1; +/** + * Two float values that represent the radii of the tapered capsule at the + * negative (height/2) Y value.Both ends of the tapered capsule may be elliptical. + * @see domRadius2 + */ + domRadius2Ref elemRadius2; +/** + * The extra element may appear any number of times. @see domExtra + */ + domExtra_Array elemExtra_array; + +public: //Accessors and Mutators + /** + * Gets the height element. + * @return a daeSmartRef to the height element. + */ + const domHeightRef getHeight() const { return elemHeight; } + /** + * Gets the radius1 element. + * @return a daeSmartRef to the radius1 element. + */ + const domRadius1Ref getRadius1() const { return elemRadius1; } + /** + * Gets the radius2 element. + * @return a daeSmartRef to the radius2 element. + */ + const domRadius2Ref getRadius2() const { return elemRadius2; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } +protected: + /** + * Constructor + */ + domTapered_capsule() : elemHeight(), elemRadius1(), elemRadius2(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domTapered_capsule() {} + /** + * Copy Constructor + */ + domTapered_capsule( const domTapered_capsule &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domTapered_capsule &operator=( const domTapered_capsule &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domTapered_cylinder.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domTapered_cylinder.h new file mode 100644 index 00000000..f1e51f02 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domTapered_cylinder.h @@ -0,0 +1,344 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domTapered_cylinder_h__ +#define __domTapered_cylinder_h__ + +#include +#include + +#include + +/** + * A tapered cylinder primitive that is centered on and aligned with the local + * Y axis. + */ +class domTapered_cylinder : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::TAPERED_CYLINDER; } +public: + class domHeight; + + typedef daeSmartRef domHeightRef; + typedef daeTArray domHeight_Array; + +/** + * A float value that represents the length of the cylinder along the Y axis. + */ + class domHeight : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::HEIGHT; } + + protected: // Value + /** + * The domFloat value of the text data of this element. + */ + domFloat _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return a domFloat of the value. + */ + domFloat getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( domFloat val ) { _value = val; } + + protected: + /** + * Constructor + */ + domHeight() : _value() {} + /** + * Destructor + */ + virtual ~domHeight() {} + /** + * Copy Constructor + */ + domHeight( const domHeight &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domHeight &operator=( const domHeight &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domRadius1; + + typedef daeSmartRef domRadius1Ref; + typedef daeTArray domRadius1_Array; + +/** + * Two float values that represent the radii of the tapered cylinder at the + * positive (height/2) Y value. Both ends of the tapered cylinder may be + * elliptical. + */ + class domRadius1 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::RADIUS1; } + + protected: // Value + /** + * The domFloat2 value of the text data of this element. + */ + domFloat2 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domFloat2 reference of the _value array. + */ + domFloat2 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domFloat2 reference of the _value array. + */ + const domFloat2 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domFloat2 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domRadius1() : _value() {} + /** + * Destructor + */ + virtual ~domRadius1() {} + /** + * Copy Constructor + */ + domRadius1( const domRadius1 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domRadius1 &operator=( const domRadius1 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + class domRadius2; + + typedef daeSmartRef domRadius2Ref; + typedef daeTArray domRadius2_Array; + +/** + * Two float values that represent the radii of the tapered cylinder at the + * negative (height/2) Y value.Both ends of the tapered cylinder may be elliptical. + */ + class domRadius2 : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::RADIUS2; } + + protected: // Value + /** + * The domFloat2 value of the text data of this element. + */ + domFloat2 _value; + + public: //Accessors and Mutators + /** + * Gets the _value array. + * @return Returns a domFloat2 reference of the _value array. + */ + domFloat2 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domFloat2 reference of the _value array. + */ + const domFloat2 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domFloat2 &val ) { _value = val; } + + protected: + /** + * Constructor + */ + domRadius2() : _value() {} + /** + * Destructor + */ + virtual ~domRadius2() {} + /** + * Copy Constructor + */ + domRadius2( const domRadius2 &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domRadius2 &operator=( const domRadius2 &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + + +protected: // Elements +/** + * A float value that represents the length of the cylinder along the Y axis. + * @see domHeight + */ + domHeightRef elemHeight; +/** + * Two float values that represent the radii of the tapered cylinder at the + * positive (height/2) Y value. Both ends of the tapered cylinder may be + * elliptical. @see domRadius1 + */ + domRadius1Ref elemRadius1; +/** + * Two float values that represent the radii of the tapered cylinder at the + * negative (height/2) Y value.Both ends of the tapered cylinder may be elliptical. + * @see domRadius2 + */ + domRadius2Ref elemRadius2; +/** + * The extra element may appear any number of times. @see domExtra + */ + domExtra_Array elemExtra_array; + +public: //Accessors and Mutators + /** + * Gets the height element. + * @return a daeSmartRef to the height element. + */ + const domHeightRef getHeight() const { return elemHeight; } + /** + * Gets the radius1 element. + * @return a daeSmartRef to the radius1 element. + */ + const domRadius1Ref getRadius1() const { return elemRadius1; } + /** + * Gets the radius2 element. + * @return a daeSmartRef to the radius2 element. + */ + const domRadius2Ref getRadius2() const { return elemRadius2; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } +protected: + /** + * Constructor + */ + domTapered_cylinder() : elemHeight(), elemRadius1(), elemRadius2(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domTapered_cylinder() {} + /** + * Copy Constructor + */ + domTapered_cylinder( const domTapered_cylinder &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domTapered_cylinder &operator=( const domTapered_cylinder &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domTargetableFloat.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domTargetableFloat.h new file mode 100644 index 00000000..d0301ceb --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domTargetableFloat.h @@ -0,0 +1,143 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domTargetableFloat_h__ +#define __domTargetableFloat_h__ + +#include +#include + + +/** + * The TargetableFloat type is used to represent elements which contain a + * single float value which can be targeted for animation. + */ +class domTargetableFloat_complexType +{ +protected: // Attribute +/** + * The sid attribute is a text string value containing the sub-identifier + * of this element. This value must be unique within the scope of the parent + * element. Optional attribute. + */ + xsNCName attrSid; + +protected: // Value + /** + * The domFloat value of the text data of this element. + */ + domFloat _value; + +public: //Accessors and Mutators + /** + * Gets the sid attribute. + * @return Returns a xsNCName of the sid attribute. + */ + xsNCName getSid() const { return attrSid; } + /** + * Sets the sid attribute. + * @param atSid The new value for the sid attribute. + */ + void setSid( xsNCName atSid ) { *(daeStringRef*)&attrSid = atSid; } + + /** + * Gets the value of this element. + * @return a domFloat of the value. + */ + domFloat getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( domFloat val ) { _value = val; } + +protected: + /** + * Constructor + */ + domTargetableFloat_complexType() : attrSid(), _value() {} + /** + * Destructor + */ + virtual ~domTargetableFloat_complexType() {} + /** + * Copy Constructor + */ + domTargetableFloat_complexType( const domTargetableFloat_complexType &cpy ) { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domTargetableFloat_complexType &operator=( const domTargetableFloat_complexType &cpy ) { (void)cpy; return *this; } +}; + +/** + * An element of type domTargetableFloat_complexType. + */ +class domTargetableFloat : public daeElement, public domTargetableFloat_complexType +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::TARGETABLEFLOAT; } + +public: //Accessors and Mutators + /** + * Gets the sid attribute. + * @return Returns a xsNCName of the sid attribute. + */ + xsNCName getSid() const { return attrSid; } + /** + * Sets the sid attribute. + * @param atSid The new value for the sid attribute. + */ + void setSid( xsNCName atSid ) { *(daeStringRef*)&attrSid = atSid; + _validAttributeArray[0] = true; } + +protected: + /** + * Constructor + */ + domTargetableFloat() {} + /** + * Destructor + */ + virtual ~domTargetableFloat() {} + /** + * Copy Constructor + */ + domTargetableFloat( const domTargetableFloat &cpy ) : daeElement(), domTargetableFloat_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domTargetableFloat &operator=( const domTargetableFloat &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domTargetableFloat3.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domTargetableFloat3.h new file mode 100644 index 00000000..f813ecd2 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domTargetableFloat3.h @@ -0,0 +1,148 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domTargetableFloat3_h__ +#define __domTargetableFloat3_h__ + +#include +#include + + +/** + * The TargetableFloat3 type is used to represent elements which contain a + * float3 value which can be targeted for animation. + */ +class domTargetableFloat3_complexType +{ +protected: // Attribute +/** + * The sid attribute is a text string value containing the sub-identifier + * of this element. This value must be unique within the scope of the parent + * element. Optional attribute. + */ + xsNCName attrSid; + +protected: // Value + /** + * The domFloat3 value of the text data of this element. + */ + domFloat3 _value; + +public: //Accessors and Mutators + /** + * Gets the sid attribute. + * @return Returns a xsNCName of the sid attribute. + */ + xsNCName getSid() const { return attrSid; } + /** + * Sets the sid attribute. + * @param atSid The new value for the sid attribute. + */ + void setSid( xsNCName atSid ) { *(daeStringRef*)&attrSid = atSid; } + + /** + * Gets the _value array. + * @return Returns a domFloat3 reference of the _value array. + */ + domFloat3 &getValue() { return _value; } + /** + * Gets the _value array. + * @return Returns a constant domFloat3 reference of the _value array. + */ + const domFloat3 &getValue() const { return _value; } + /** + * Sets the _value array. + * @param val The new value for the _value array. + */ + void setValue( const domFloat3 &val ) { _value = val; } + +protected: + /** + * Constructor + */ + domTargetableFloat3_complexType() : attrSid(), _value() {} + /** + * Destructor + */ + virtual ~domTargetableFloat3_complexType() {} + /** + * Copy Constructor + */ + domTargetableFloat3_complexType( const domTargetableFloat3_complexType &cpy ) { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domTargetableFloat3_complexType &operator=( const domTargetableFloat3_complexType &cpy ) { (void)cpy; return *this; } +}; + +/** + * An element of type domTargetableFloat3_complexType. + */ +class domTargetableFloat3 : public daeElement, public domTargetableFloat3_complexType +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::TARGETABLEFLOAT3; } + +public: //Accessors and Mutators + /** + * Gets the sid attribute. + * @return Returns a xsNCName of the sid attribute. + */ + xsNCName getSid() const { return attrSid; } + /** + * Sets the sid attribute. + * @param atSid The new value for the sid attribute. + */ + void setSid( xsNCName atSid ) { *(daeStringRef*)&attrSid = atSid; + _validAttributeArray[0] = true; } + +protected: + /** + * Constructor + */ + domTargetableFloat3() {} + /** + * Destructor + */ + virtual ~domTargetableFloat3() {} + /** + * Copy Constructor + */ + domTargetableFloat3( const domTargetableFloat3 &cpy ) : daeElement(), domTargetableFloat3_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domTargetableFloat3 &operator=( const domTargetableFloat3 &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domTechnique.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domTechnique.h new file mode 100644 index 00000000..a5c0a356 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domTechnique.h @@ -0,0 +1,137 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domTechnique_h__ +#define __domTechnique_h__ + +#include +#include + + +/** + * The technique element declares the information used to process some portion + * of the content. Each technique conforms to an associated profile. Techniques + * generally act as a “switchâ€. If more than one is present for a particular + * portion of content, on import, one or the other is picked, but usually + * not both. Selection should be based on which profile the importing application + * can support. Techniques contain application data and programs, making them + * assets that can be managed as a unit. + */ +class domTechnique : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::TECHNIQUE; } +protected: // Attribute + /** + * This element may specify its own xmlns. + */ + xsAnyURI attrXmlns; +/** + * The profile attribute indicates the type of profile. This is a vendor + * defined character string that indicates the platform or capability target + * for the technique. Required attribute. + */ + xsNMTOKEN attrProfile; + +protected: // Element + /** + * Used to preserve order in elements that do not specify strict sequencing of sub-elements. + */ + daeElementRefArray _contents; + /** + * Used to preserve order in elements that have a complex content model. + */ + daeUIntArray _contentsOrder; + + +public: //Accessors and Mutators + /** + * Gets the xmlns attribute. + * @return Returns a xsAnyURI reference of the xmlns attribute. + */ + xsAnyURI &getXmlns() { return attrXmlns; } + /** + * Gets the xmlns attribute. + * @return Returns a constant xsAnyURI reference of the xmlns attribute. + */ + const xsAnyURI &getXmlns() const { return attrXmlns; } + /** + * Sets the xmlns attribute. + * @param xmlns The new value for the xmlns attribute. + */ + void setXmlns( const xsAnyURI &xmlns ) { attrXmlns = xmlns; + _validAttributeArray[0] = true; } + + /** + * Gets the profile attribute. + * @return Returns a xsNMTOKEN of the profile attribute. + */ + xsNMTOKEN getProfile() const { return attrProfile; } + /** + * Sets the profile attribute. + * @param atProfile The new value for the profile attribute. + */ + void setProfile( xsNMTOKEN atProfile ) { *(daeStringRef*)&attrProfile = atProfile; + _validAttributeArray[1] = true; } + + /** + * Gets the _contents array. + * @return Returns a reference to the _contents element array. + */ + daeElementRefArray &getContents() { return _contents; } + /** + * Gets the _contents array. + * @return Returns a constant reference to the _contents element array. + */ + const daeElementRefArray &getContents() const { return _contents; } + +protected: + /** + * Constructor + */ + domTechnique() : attrProfile() {} + /** + * Destructor + */ + virtual ~domTechnique() {} + /** + * Copy Constructor + */ + domTechnique( const domTechnique &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domTechnique &operator=( const domTechnique &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domTranslate.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domTranslate.h new file mode 100644 index 00000000..3df4c9d3 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domTranslate.h @@ -0,0 +1,70 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domTranslate_h__ +#define __domTranslate_h__ + +#include +#include + +#include + +/** + * The translate element contains a mathematical vector that represents the + * distance along the X, Y and Z-axes. + */ +class domTranslate : public daeElement, public domTargetableFloat3_complexType +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::TRANSLATE; } + +protected: + /** + * Constructor + */ + domTranslate() {} + /** + * Destructor + */ + virtual ~domTranslate() {} + /** + * Copy Constructor + */ + domTranslate( const domTranslate &cpy ) : daeElement(), domTargetableFloat3_complexType() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domTranslate &operator=( const domTranslate &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domTriangles.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domTriangles.h new file mode 100644 index 00000000..e20b330d --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domTriangles.h @@ -0,0 +1,169 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domTriangles_h__ +#define __domTriangles_h__ + +#include +#include + +#include +#include +#include + +/** + * The triangles element provides the information needed to bind vertex attributes + * together and then organize those vertices into individual triangles.Each + * triangle described by the mesh has three vertices. The first triangle + * is formed from the first, second, and third vertices. The second triangle + * is formed from the fourth, fifth, and sixth vertices, and so on. + */ +class domTriangles : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::TRIANGLES; } +protected: // Attributes +/** + * The name attribute is the text string name of this element. Optional attribute. + */ + xsNCName attrName; +/** + * The count attribute indicates the number of triangle primitives. Required + * attribute. + */ + domUint attrCount; +/** + * The material attribute declares a symbol for a material. This symbol is + * bound to a material at the time of instantiation. Optional attribute. + * If the material attribute is not specified then the lighting and shading + * results are application defined. + */ + xsNCName attrMaterial; + +protected: // Elements +/** + * The input element may occur any number of times. This input is a local + * input with the offset and set attributes. @see domInput + */ + domInputLocalOffset_Array elemInput_array; +/** + * The triangles element may have any number of p elements. @see domP + */ + domPRef elemP; +/** + * The extra element may appear any number of times. @see domExtra + */ + domExtra_Array elemExtra_array; + +public: //Accessors and Mutators + /** + * Gets the name attribute. + * @return Returns a xsNCName of the name attribute. + */ + xsNCName getName() const { return attrName; } + /** + * Sets the name attribute. + * @param atName The new value for the name attribute. + */ + void setName( xsNCName atName ) { *(daeStringRef*)&attrName = atName; + _validAttributeArray[0] = true; } + + /** + * Gets the count attribute. + * @return Returns a domUint of the count attribute. + */ + domUint getCount() const { return attrCount; } + /** + * Sets the count attribute. + * @param atCount The new value for the count attribute. + */ + void setCount( domUint atCount ) { attrCount = atCount; + _validAttributeArray[1] = true; } + + /** + * Gets the material attribute. + * @return Returns a xsNCName of the material attribute. + */ + xsNCName getMaterial() const { return attrMaterial; } + /** + * Sets the material attribute. + * @param atMaterial The new value for the material attribute. + */ + void setMaterial( xsNCName atMaterial ) { *(daeStringRef*)&attrMaterial = atMaterial; + _validAttributeArray[2] = true; } + + /** + * Gets the input element array. + * @return Returns a reference to the array of input elements. + */ + domInputLocalOffset_Array &getInput_array() { return elemInput_array; } + /** + * Gets the input element array. + * @return Returns a constant reference to the array of input elements. + */ + const domInputLocalOffset_Array &getInput_array() const { return elemInput_array; } + /** + * Gets the p element. + * @return a daeSmartRef to the p element. + */ + const domPRef getP() const { return elemP; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } +protected: + /** + * Constructor + */ + domTriangles() : attrName(), attrCount(), attrMaterial(), elemInput_array(), elemP(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domTriangles() {} + /** + * Copy Constructor + */ + domTriangles( const domTriangles &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domTriangles &operator=( const domTriangles &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domTrifans.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domTrifans.h new file mode 100644 index 00000000..32c6af4e --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domTrifans.h @@ -0,0 +1,174 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domTrifans_h__ +#define __domTrifans_h__ + +#include +#include + +#include +#include +#include + +/** + * The trifans element provides the information needed to bind vertex attributes + * together and then organize those vertices into connected triangles. Each + * triangle described by the mesh has three vertices. The first triangle + * is formed from first, second, and third vertices. Each subsequent triangle + * is formed from the current vertex, reusing the first and the previous vertices. + */ +class domTrifans : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::TRIFANS; } +protected: // Attributes +/** + * The name attribute is the text string name of this element. Optional attribute. + */ + xsNCName attrName; +/** + * The count attribute indicates the number of triangle fan primitives. Required + * attribute. + */ + domUint attrCount; +/** + * The material attribute declares a symbol for a material. This symbol is + * bound to a material at the time of instantiation. If the material attribute + * is not specified then the lighting and shading results are application + * defined. Optional attribute. + */ + xsNCName attrMaterial; + +protected: // Elements +/** + * The input element may occur any number of times. This input is a local + * input with the offset and set attributes. @see domInput + */ + domInputLocalOffset_Array elemInput_array; +/** + * The trifans element may have any number of p elements. @see domP + */ + domP_Array elemP_array; +/** + * The extra element may appear any number of times. @see domExtra + */ + domExtra_Array elemExtra_array; + +public: //Accessors and Mutators + /** + * Gets the name attribute. + * @return Returns a xsNCName of the name attribute. + */ + xsNCName getName() const { return attrName; } + /** + * Sets the name attribute. + * @param atName The new value for the name attribute. + */ + void setName( xsNCName atName ) { *(daeStringRef*)&attrName = atName; + _validAttributeArray[0] = true; } + + /** + * Gets the count attribute. + * @return Returns a domUint of the count attribute. + */ + domUint getCount() const { return attrCount; } + /** + * Sets the count attribute. + * @param atCount The new value for the count attribute. + */ + void setCount( domUint atCount ) { attrCount = atCount; + _validAttributeArray[1] = true; } + + /** + * Gets the material attribute. + * @return Returns a xsNCName of the material attribute. + */ + xsNCName getMaterial() const { return attrMaterial; } + /** + * Sets the material attribute. + * @param atMaterial The new value for the material attribute. + */ + void setMaterial( xsNCName atMaterial ) { *(daeStringRef*)&attrMaterial = atMaterial; + _validAttributeArray[2] = true; } + + /** + * Gets the input element array. + * @return Returns a reference to the array of input elements. + */ + domInputLocalOffset_Array &getInput_array() { return elemInput_array; } + /** + * Gets the input element array. + * @return Returns a constant reference to the array of input elements. + */ + const domInputLocalOffset_Array &getInput_array() const { return elemInput_array; } + /** + * Gets the p element array. + * @return Returns a reference to the array of p elements. + */ + domP_Array &getP_array() { return elemP_array; } + /** + * Gets the p element array. + * @return Returns a constant reference to the array of p elements. + */ + const domP_Array &getP_array() const { return elemP_array; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } +protected: + /** + * Constructor + */ + domTrifans() : attrName(), attrCount(), attrMaterial(), elemInput_array(), elemP_array(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domTrifans() {} + /** + * Copy Constructor + */ + domTrifans( const domTrifans &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domTrifans &operator=( const domTrifans &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domTristrips.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domTristrips.h new file mode 100644 index 00000000..4b8a6c5f --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domTristrips.h @@ -0,0 +1,174 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domTristrips_h__ +#define __domTristrips_h__ + +#include +#include + +#include +#include +#include + +/** + * The tristrips element provides the information needed to bind vertex attributes + * together and then organize those vertices into connected triangles. Each + * triangle described by the mesh has three vertices. The first triangle + * is formed from first, second, and third vertices. Each subsequent triangle + * is formed from the current vertex, reusing the previous two vertices. + */ +class domTristrips : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::TRISTRIPS; } +protected: // Attributes +/** + * The name attribute is the text string name of this element. Optional attribute. + */ + xsNCName attrName; +/** + * The count attribute indicates the number of triangle strip primitives. + * Required attribute. + */ + domUint attrCount; +/** + * The material attribute declares a symbol for a material. This symbol is + * bound to a material at the time of instantiation. If the material attribute + * is not specified then the lighting and shading results are application + * defined. Optional attribute. + */ + xsNCName attrMaterial; + +protected: // Elements +/** + * The input element may occur any number of times. This input is a local + * input with the offset and set attributes. @see domInput + */ + domInputLocalOffset_Array elemInput_array; +/** + * The tristrips element may have any number of p elements. @see domP + */ + domP_Array elemP_array; +/** + * The extra element may appear any number of times. @see domExtra + */ + domExtra_Array elemExtra_array; + +public: //Accessors and Mutators + /** + * Gets the name attribute. + * @return Returns a xsNCName of the name attribute. + */ + xsNCName getName() const { return attrName; } + /** + * Sets the name attribute. + * @param atName The new value for the name attribute. + */ + void setName( xsNCName atName ) { *(daeStringRef*)&attrName = atName; + _validAttributeArray[0] = true; } + + /** + * Gets the count attribute. + * @return Returns a domUint of the count attribute. + */ + domUint getCount() const { return attrCount; } + /** + * Sets the count attribute. + * @param atCount The new value for the count attribute. + */ + void setCount( domUint atCount ) { attrCount = atCount; + _validAttributeArray[1] = true; } + + /** + * Gets the material attribute. + * @return Returns a xsNCName of the material attribute. + */ + xsNCName getMaterial() const { return attrMaterial; } + /** + * Sets the material attribute. + * @param atMaterial The new value for the material attribute. + */ + void setMaterial( xsNCName atMaterial ) { *(daeStringRef*)&attrMaterial = atMaterial; + _validAttributeArray[2] = true; } + + /** + * Gets the input element array. + * @return Returns a reference to the array of input elements. + */ + domInputLocalOffset_Array &getInput_array() { return elemInput_array; } + /** + * Gets the input element array. + * @return Returns a constant reference to the array of input elements. + */ + const domInputLocalOffset_Array &getInput_array() const { return elemInput_array; } + /** + * Gets the p element array. + * @return Returns a reference to the array of p elements. + */ + domP_Array &getP_array() { return elemP_array; } + /** + * Gets the p element array. + * @return Returns a constant reference to the array of p elements. + */ + const domP_Array &getP_array() const { return elemP_array; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } +protected: + /** + * Constructor + */ + domTristrips() : attrName(), attrCount(), attrMaterial(), elemInput_array(), elemP_array(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domTristrips() {} + /** + * Copy Constructor + */ + domTristrips( const domTristrips &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domTristrips &operator=( const domTristrips &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domTypes.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domTypes.h new file mode 100644 index 00000000..e328e9a9 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domTypes.h @@ -0,0 +1,1258 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#ifndef __DOM_TYPES_H__ +#define __DOM_TYPES_H__ + +#include + +// Register all types +extern void registerDomTypes(); + +typedef xsBoolean domBool; +typedef xsDateTime domDateTime; +typedef xsDouble domFloat; +typedef xsLong domInt; +typedef xsName domName; +typedef xsString domString; +typedef xsToken domToken; +typedef xsUnsignedLong domUint; +typedef daeTArray domListOfBools; +typedef daeTArray domListOfFloats; +typedef xsHexBinaryArray domListOfHexBinary; +typedef daeTArray domListOfInts; +typedef daeTArray domListOfNames; +typedef daeTArray domListOfTokens; +typedef daeTArray domListOfUInts; +typedef domListOfBools domBool2; +typedef domListOfBools domBool3; +typedef domListOfBools domBool4; +typedef domListOfFloats domFloat2; +typedef domListOfFloats domFloat3; +typedef domListOfFloats domFloat4; +typedef domListOfFloats domFloat7; +typedef domListOfFloats domFloat2x2; +typedef domListOfFloats domFloat3x3; +typedef domListOfFloats domFloat4x4; +typedef domListOfFloats domFloat2x3; +typedef domListOfFloats domFloat2x4; +typedef domListOfFloats domFloat3x2; +typedef domListOfFloats domFloat3x4; +typedef domListOfFloats domFloat4x2; +typedef domListOfFloats domFloat4x3; +typedef domListOfInts domInt2; +typedef domListOfInts domInt3; +typedef domListOfInts domInt4; +typedef domListOfInts domInt2x2; +typedef domListOfInts domInt3x3; +typedef domListOfInts domInt4x4; +/** + * This type is used for URI reference which can only reference a resource + * declared within it's same document. + */ +typedef xsAnyURI domURIFragmentType; +typedef domFloat4 domFx_color_common; +typedef xsString domFx_draw_common; +typedef xsNonNegativeInteger domGL_MAX_LIGHTS_index; +typedef xsNonNegativeInteger domGL_MAX_CLIP_PLANES_index; +typedef xsNonNegativeInteger domGL_MAX_TEXTURE_IMAGE_UNITS_index; +typedef xsFloat domGl_alpha_value_type; +typedef xsFloat domGlsl_float; +typedef xsInt domGlsl_int; +typedef xsBoolean domGlsl_bool; +typedef daeTArray domGlsl_ListOfBool; +typedef daeTArray domGlsl_ListOfFloat; +typedef daeTArray domGlsl_ListOfInt; +typedef domGlsl_ListOfBool domGlsl_bool2; +typedef domGlsl_ListOfBool domGlsl_bool3; +typedef domGlsl_ListOfBool domGlsl_bool4; +typedef domGlsl_ListOfFloat domGlsl_float2; +typedef domGlsl_ListOfFloat domGlsl_float3; +typedef domGlsl_ListOfFloat domGlsl_float4; +typedef domGlsl_ListOfFloat domGlsl_float2x2; +typedef domGlsl_ListOfFloat domGlsl_float3x3; +typedef domGlsl_ListOfFloat domGlsl_float4x4; +typedef domGlsl_ListOfInt domGlsl_int2; +typedef domGlsl_ListOfInt domGlsl_int3; +typedef domGlsl_ListOfInt domGlsl_int4; +typedef xsToken domGlsl_identifier; +typedef xsBoolean domCg_bool; +typedef xsFloat domCg_float; +typedef xsInt domCg_int; +typedef xsFloat domCg_half; +typedef xsFloat domCg_fixed; +typedef xsBoolean domCg_bool1; +typedef xsFloat domCg_float1; +typedef xsInt domCg_int1; +typedef xsFloat domCg_half1; +typedef xsFloat domCg_fixed1; +typedef daeTArray domCg_ListOfBool; +typedef daeTArray domCg_ListOfFloat; +typedef daeTArray domCg_ListOfInt; +typedef daeTArray domCg_ListOfHalf; +typedef daeTArray domCg_ListOfFixed; +typedef domCg_ListOfBool domCg_bool2; +typedef domCg_ListOfBool domCg_bool3; +typedef domCg_ListOfBool domCg_bool4; +typedef domCg_ListOfBool domCg_bool1x1; +typedef domCg_ListOfBool domCg_bool1x2; +typedef domCg_ListOfBool domCg_bool1x3; +typedef domCg_ListOfBool domCg_bool1x4; +typedef domCg_ListOfBool domCg_bool2x1; +typedef domCg_ListOfBool domCg_bool2x2; +typedef domCg_ListOfBool domCg_bool2x3; +typedef domCg_ListOfBool domCg_bool2x4; +typedef domCg_ListOfBool domCg_bool3x1; +typedef domCg_ListOfBool domCg_bool3x2; +typedef domCg_ListOfBool domCg_bool3x3; +typedef domCg_ListOfBool domCg_bool3x4; +typedef domCg_ListOfBool domCg_bool4x1; +typedef domCg_ListOfBool domCg_bool4x2; +typedef domCg_ListOfBool domCg_bool4x3; +typedef domCg_ListOfBool domCg_bool4x4; +typedef domCg_ListOfFloat domCg_float2; +typedef domCg_ListOfFloat domCg_float3; +typedef domCg_ListOfFloat domCg_float4; +typedef domCg_ListOfFloat domCg_float1x1; +typedef domCg_ListOfFloat domCg_float1x2; +typedef domCg_ListOfFloat domCg_float1x3; +typedef domCg_ListOfFloat domCg_float1x4; +typedef domCg_ListOfFloat domCg_float2x1; +typedef domCg_ListOfFloat domCg_float2x2; +typedef domCg_ListOfFloat domCg_float2x3; +typedef domCg_ListOfFloat domCg_float2x4; +typedef domCg_ListOfFloat domCg_float3x1; +typedef domCg_ListOfFloat domCg_float3x2; +typedef domCg_ListOfFloat domCg_float3x3; +typedef domCg_ListOfFloat domCg_float3x4; +typedef domCg_ListOfFloat domCg_float4x1; +typedef domCg_ListOfFloat domCg_float4x2; +typedef domCg_ListOfFloat domCg_float4x3; +typedef domCg_ListOfFloat domCg_float4x4; +typedef domCg_ListOfInt domCg_int2; +typedef domCg_ListOfInt domCg_int3; +typedef domCg_ListOfInt domCg_int4; +typedef domCg_ListOfInt domCg_int1x1; +typedef domCg_ListOfInt domCg_int1x2; +typedef domCg_ListOfInt domCg_int1x3; +typedef domCg_ListOfInt domCg_int1x4; +typedef domCg_ListOfInt domCg_int2x1; +typedef domCg_ListOfInt domCg_int2x2; +typedef domCg_ListOfInt domCg_int2x3; +typedef domCg_ListOfInt domCg_int2x4; +typedef domCg_ListOfInt domCg_int3x1; +typedef domCg_ListOfInt domCg_int3x2; +typedef domCg_ListOfInt domCg_int3x3; +typedef domCg_ListOfInt domCg_int3x4; +typedef domCg_ListOfInt domCg_int4x1; +typedef domCg_ListOfInt domCg_int4x2; +typedef domCg_ListOfInt domCg_int4x3; +typedef domCg_ListOfInt domCg_int4x4; +typedef domCg_ListOfHalf domCg_half2; +typedef domCg_ListOfHalf domCg_half3; +typedef domCg_ListOfHalf domCg_half4; +typedef domCg_ListOfHalf domCg_half1x1; +typedef domCg_ListOfHalf domCg_half1x2; +typedef domCg_ListOfHalf domCg_half1x3; +typedef domCg_ListOfHalf domCg_half1x4; +typedef domCg_ListOfHalf domCg_half2x1; +typedef domCg_ListOfHalf domCg_half2x2; +typedef domCg_ListOfHalf domCg_half2x3; +typedef domCg_ListOfHalf domCg_half2x4; +typedef domCg_ListOfHalf domCg_half3x1; +typedef domCg_ListOfHalf domCg_half3x2; +typedef domCg_ListOfHalf domCg_half3x3; +typedef domCg_ListOfHalf domCg_half3x4; +typedef domCg_ListOfHalf domCg_half4x1; +typedef domCg_ListOfHalf domCg_half4x2; +typedef domCg_ListOfHalf domCg_half4x3; +typedef domCg_ListOfHalf domCg_half4x4; +typedef domCg_ListOfFixed domCg_fixed2; +typedef domCg_ListOfFixed domCg_fixed3; +typedef domCg_ListOfFixed domCg_fixed4; +typedef domCg_ListOfFixed domCg_fixed1x1; +typedef domCg_ListOfFixed domCg_fixed1x2; +typedef domCg_ListOfFixed domCg_fixed1x3; +typedef domCg_ListOfFixed domCg_fixed1x4; +typedef domCg_ListOfFixed domCg_fixed2x1; +typedef domCg_ListOfFixed domCg_fixed2x2; +typedef domCg_ListOfFixed domCg_fixed2x3; +typedef domCg_ListOfFixed domCg_fixed2x4; +typedef domCg_ListOfFixed domCg_fixed3x1; +typedef domCg_ListOfFixed domCg_fixed3x2; +typedef domCg_ListOfFixed domCg_fixed3x3; +typedef domCg_ListOfFixed domCg_fixed3x4; +typedef domCg_ListOfFixed domCg_fixed4x1; +typedef domCg_ListOfFixed domCg_fixed4x2; +typedef domCg_ListOfFixed domCg_fixed4x3; +typedef domCg_ListOfFixed domCg_fixed4x4; +typedef xsToken domCg_identifier; +typedef xsNonNegativeInteger domGLES_MAX_LIGHTS_index; +typedef xsNonNegativeInteger domGLES_MAX_CLIP_PLANES_index; +typedef xsNonNegativeInteger domGLES_MAX_TEXTURE_COORDS_index; +typedef xsNonNegativeInteger domGLES_MAX_TEXTURE_IMAGE_UNITS_index; +typedef xsNonNegativeInteger domGles_texcombiner_argument_index_type; +typedef xsNCName domGles_rendertarget_common; + +/** + * An enumuerated type specifying the acceptable morph methods. + */ +enum domMorphMethodType { + MORPHMETHODTYPE_NORMALIZED, + MORPHMETHODTYPE_RELATIVE, + MORPHMETHODTYPE_COUNT = 2 +}; + +/** + * An enumerated type specifying the acceptable node types. + */ +enum domNodeType { + NODETYPE_JOINT, + NODETYPE_NODE, + NODETYPE_COUNT = 2 +}; + +/** + * An enumerated type specifying the acceptable up-axis values. + */ +enum domUpAxisType { + UPAXISTYPE_X_UP, + UPAXISTYPE_Y_UP, + UPAXISTYPE_Z_UP, + UPAXISTYPE_COUNT = 3 +}; + +/** + * An enumerated type specifying the acceptable document versions. + */ +enum domVersionType { + VERSIONTYPE_1_4_0, + VERSIONTYPE_1_4_1, + VERSIONTYPE_COUNT = 2 +}; + +enum domFx_opaque_enum { + FX_OPAQUE_ENUM_A_ONE, /**< When a transparent opaque attribute is set to A_ONE, it means the transparency information will be taken from the alpha channel of the color, texture, or parameter supplying the value. The value of 1.0 is opaque in this mode. */ + FX_OPAQUE_ENUM_RGB_ZERO, /**< When a transparent opaque attribute is set to RGB_ZERO, it means the transparency information will be taken from the red, green, and blue channels of the color, texture, or parameter supplying the value. Each channel is modulated independently. The value of 0.0 is opaque in this mode. */ + FX_OPAQUE_ENUM_COUNT = 2 +}; + +enum domFx_surface_type_enum { + FX_SURFACE_TYPE_ENUM_UNTYPED, /**< When a surface's type attribute is set to UNTYPED, its type is initially unknown and established later by the context in which it is used, such as by a texture sampler that references it. A surface of any other type may be changed into an UNTYPED surface at run-time, as if it were created by , using . If there is a type mismatch between a operation and what the run-time decides the type should be, the result is profile- and platform-specific behavior. */ + FX_SURFACE_TYPE_ENUM_1D, + FX_SURFACE_TYPE_ENUM_2D, + FX_SURFACE_TYPE_ENUM_3D, + FX_SURFACE_TYPE_ENUM_RECT, + FX_SURFACE_TYPE_ENUM_CUBE, + FX_SURFACE_TYPE_ENUM_DEPTH, + FX_SURFACE_TYPE_ENUM_COUNT = 7 +}; + +enum domFx_surface_face_enum { + FX_SURFACE_FACE_ENUM_POSITIVE_X, + FX_SURFACE_FACE_ENUM_NEGATIVE_X, + FX_SURFACE_FACE_ENUM_POSITIVE_Y, + FX_SURFACE_FACE_ENUM_NEGATIVE_Y, + FX_SURFACE_FACE_ENUM_POSITIVE_Z, + FX_SURFACE_FACE_ENUM_NEGATIVE_Z, + FX_SURFACE_FACE_ENUM_COUNT = 6 +}; + +/** + * The per-texel layout of the format. The length of the string indicate + * how many channels there are and the letter respresents the name of the + * channel. There are typically 0 to 4 channels. + */ +enum domFx_surface_format_hint_channels_enum { + FX_SURFACE_FORMAT_HINT_CHANNELS_ENUM_RGB, /**< RGB color map */ + FX_SURFACE_FORMAT_HINT_CHANNELS_ENUM_RGBA, /**< RGB color + Alpha map often used for color + transparency or other things packed into channel A like specular power */ + FX_SURFACE_FORMAT_HINT_CHANNELS_ENUM_L, /**< Luminance map often used for light mapping */ + FX_SURFACE_FORMAT_HINT_CHANNELS_ENUM_LA, /**< Luminance+Alpha map often used for light mapping */ + FX_SURFACE_FORMAT_HINT_CHANNELS_ENUM_D, /**< Depth map often used for displacement, parellax, relief, or shadow mapping */ + FX_SURFACE_FORMAT_HINT_CHANNELS_ENUM_XYZ, /**< Typically used for normal maps or 3component displacement maps. */ + FX_SURFACE_FORMAT_HINT_CHANNELS_ENUM_XYZW, /**< Typically used for normal maps where W is the depth for relief or parrallax mapping */ + FX_SURFACE_FORMAT_HINT_CHANNELS_ENUM_COUNT = 7 +}; + +/** + * Each channel of the texel has a precision. Typically these are all linked + * together. An exact format lay lower the precision of an individual channel + * but applying a higher precision by linking the channels together may still + * convey the same information. + */ +enum domFx_surface_format_hint_precision_enum { + FX_SURFACE_FORMAT_HINT_PRECISION_ENUM_LOW, /**< For integers this typically represents 8 bits. For floats typically 16 bits. */ + FX_SURFACE_FORMAT_HINT_PRECISION_ENUM_MID, /**< For integers this typically represents 8 to 24 bits. For floats typically 16 to 32 bits. */ + FX_SURFACE_FORMAT_HINT_PRECISION_ENUM_HIGH, /**< For integers this typically represents 16 to 32 bits. For floats typically 24 to 32 bits. */ + FX_SURFACE_FORMAT_HINT_PRECISION_ENUM_COUNT = 3 +}; + +/** + * Each channel represents a range of values. Some example ranges are signed + * or unsigned integers, or between between a clamped range such as 0.0f to + * 1.0f, or high dynamic range via floating point + */ +enum domFx_surface_format_hint_range_enum { + FX_SURFACE_FORMAT_HINT_RANGE_ENUM_SNORM, /**< Format is representing a decimal value that remains within the -1 to 1 range. Implimentation could be integer-fixedpoint or floats. */ + FX_SURFACE_FORMAT_HINT_RANGE_ENUM_UNORM, /**< Format is representing a decimal value that remains within the 0 to 1 range. Implimentation could be integer-fixedpoint or floats. */ + FX_SURFACE_FORMAT_HINT_RANGE_ENUM_SINT, /**< Format is representing signed integer numbers. (ex. 8bits = -128 to 127) */ + FX_SURFACE_FORMAT_HINT_RANGE_ENUM_UINT, /**< Format is representing unsigned integer numbers. (ex. 8bits = 0 to 255) */ + FX_SURFACE_FORMAT_HINT_RANGE_ENUM_FLOAT, /**< Format should support full floating point ranges. High precision is expected to be 32bit. Mid precision may be 16 to 32 bit. Low precision is expected to be 16 bit. */ + FX_SURFACE_FORMAT_HINT_RANGE_ENUM_COUNT = 5 +}; + +/** + * Additional hints about data relationships and other things to help the + * application pick the best format. + */ +enum domFx_surface_format_hint_option_enum { + FX_SURFACE_FORMAT_HINT_OPTION_ENUM_SRGB_GAMMA, /**< colors are stored with respect to the sRGB 2.2 gamma curve rather than linear */ + FX_SURFACE_FORMAT_HINT_OPTION_ENUM_NORMALIZED3, /**< the texel's XYZ/RGB should be normalized such as in a normal map. */ + FX_SURFACE_FORMAT_HINT_OPTION_ENUM_NORMALIZED4, /**< the texel's XYZW/RGBA should be normalized such as in a normal map. */ + FX_SURFACE_FORMAT_HINT_OPTION_ENUM_COMPRESSABLE, /**< The surface may use run-time compression. Considering the best compression based on desired, channel, range, precision, and options */ + FX_SURFACE_FORMAT_HINT_OPTION_ENUM_COUNT = 4 +}; + +enum domFx_sampler_wrap_common { + FX_SAMPLER_WRAP_COMMON_NONE, + FX_SAMPLER_WRAP_COMMON_WRAP, + FX_SAMPLER_WRAP_COMMON_MIRROR, + FX_SAMPLER_WRAP_COMMON_CLAMP, + FX_SAMPLER_WRAP_COMMON_BORDER, + FX_SAMPLER_WRAP_COMMON_COUNT = 5 +}; + +enum domFx_sampler_filter_common { + FX_SAMPLER_FILTER_COMMON_NONE, + FX_SAMPLER_FILTER_COMMON_NEAREST, + FX_SAMPLER_FILTER_COMMON_LINEAR, + FX_SAMPLER_FILTER_COMMON_NEAREST_MIPMAP_NEAREST, + FX_SAMPLER_FILTER_COMMON_LINEAR_MIPMAP_NEAREST, + FX_SAMPLER_FILTER_COMMON_NEAREST_MIPMAP_LINEAR, + FX_SAMPLER_FILTER_COMMON_LINEAR_MIPMAP_LINEAR, + FX_SAMPLER_FILTER_COMMON_COUNT = 7 +}; + +enum domFx_modifier_enum_common { + FX_MODIFIER_ENUM_COMMON_CONST, + FX_MODIFIER_ENUM_COMMON_UNIFORM, + FX_MODIFIER_ENUM_COMMON_VARYING, + FX_MODIFIER_ENUM_COMMON_STATIC, + FX_MODIFIER_ENUM_COMMON_VOLATILE, + FX_MODIFIER_ENUM_COMMON_EXTERN, + FX_MODIFIER_ENUM_COMMON_SHARED, + FX_MODIFIER_ENUM_COMMON_COUNT = 7 +}; + +enum domFx_pipeline_stage_common { + FX_PIPELINE_STAGE_COMMON_VERTEXPROGRAM, + FX_PIPELINE_STAGE_COMMON_FRAGMENTPROGRAM, + FX_PIPELINE_STAGE_COMMON_VERTEXSHADER, + FX_PIPELINE_STAGE_COMMON_PIXELSHADER, + FX_PIPELINE_STAGE_COMMON_COUNT = 4 +}; + +enum domGl_blend_type { + GL_BLEND_TYPE_ZERO = 0x0, + GL_BLEND_TYPE_ONE = 0x1, + GL_BLEND_TYPE_SRC_COLOR = 0x0300, + GL_BLEND_TYPE_ONE_MINUS_SRC_COLOR = 0x0301, + GL_BLEND_TYPE_DEST_COLOR = 0x0306, + GL_BLEND_TYPE_ONE_MINUS_DEST_COLOR = 0x0307, + GL_BLEND_TYPE_SRC_ALPHA = 0x0302, + GL_BLEND_TYPE_ONE_MINUS_SRC_ALPHA = 0x0303, + GL_BLEND_TYPE_DST_ALPHA = 0x0304, + GL_BLEND_TYPE_ONE_MINUS_DST_ALPHA = 0x0305, + GL_BLEND_TYPE_CONSTANT_COLOR = 0x8001, + GL_BLEND_TYPE_ONE_MINUS_CONSTANT_COLOR = 0x8002, + GL_BLEND_TYPE_CONSTANT_ALPHA = 0x8003, + GL_BLEND_TYPE_ONE_MINUS_CONSTANT_ALPHA = 0x8004, + GL_BLEND_TYPE_SRC_ALPHA_SATURATE = 0x0308, + GL_BLEND_TYPE_COUNT = 15 +}; + +enum domGl_face_type { + GL_FACE_TYPE_FRONT = 0x0404, + GL_FACE_TYPE_BACK = 0x0405, + GL_FACE_TYPE_FRONT_AND_BACK = 0x0408, + GL_FACE_TYPE_COUNT = 3 +}; + +enum domGl_blend_equation_type { + GL_BLEND_EQUATION_TYPE_FUNC_ADD = 0x8006, + GL_BLEND_EQUATION_TYPE_FUNC_SUBTRACT = 0x800A, + GL_BLEND_EQUATION_TYPE_FUNC_REVERSE_SUBTRACT = 0x800B, + GL_BLEND_EQUATION_TYPE_MIN = 0x8007, + GL_BLEND_EQUATION_TYPE_MAX = 0x8008, + GL_BLEND_EQUATION_TYPE_COUNT = 5 +}; + +enum domGl_func_type { + GL_FUNC_TYPE_NEVER = 0x0200, + GL_FUNC_TYPE_LESS = 0x0201, + GL_FUNC_TYPE_LEQUAL = 0x0203, + GL_FUNC_TYPE_EQUAL = 0x0202, + GL_FUNC_TYPE_GREATER = 0x0204, + GL_FUNC_TYPE_NOTEQUAL = 0x0205, + GL_FUNC_TYPE_GEQUAL = 0x0206, + GL_FUNC_TYPE_ALWAYS = 0x0207, + GL_FUNC_TYPE_COUNT = 8 +}; + +enum domGl_stencil_op_type { + GL_STENCIL_OP_TYPE_KEEP = 0x1E00, + GL_STENCIL_OP_TYPE_ZERO = 0x0, + GL_STENCIL_OP_TYPE_REPLACE = 0x1E01, + GL_STENCIL_OP_TYPE_INCR = 0x1E02, + GL_STENCIL_OP_TYPE_DECR = 0x1E03, + GL_STENCIL_OP_TYPE_INVERT = 0x150A, + GL_STENCIL_OP_TYPE_INCR_WRAP = 0x8507, + GL_STENCIL_OP_TYPE_DECR_WRAP = 0x8508, + GL_STENCIL_OP_TYPE_COUNT = 8 +}; + +enum domGl_material_type { + GL_MATERIAL_TYPE_EMISSION = 0x1600, + GL_MATERIAL_TYPE_AMBIENT = 0x1200, + GL_MATERIAL_TYPE_DIFFUSE = 0x1201, + GL_MATERIAL_TYPE_SPECULAR = 0x1202, + GL_MATERIAL_TYPE_AMBIENT_AND_DIFFUSE = 0x1602, + GL_MATERIAL_TYPE_COUNT = 5 +}; + +enum domGl_fog_type { + GL_FOG_TYPE_LINEAR = 0x2601, + GL_FOG_TYPE_EXP = 0x0800, + GL_FOG_TYPE_EXP2 = 0x0801, + GL_FOG_TYPE_COUNT = 3 +}; + +enum domGl_fog_coord_src_type { + GL_FOG_COORD_SRC_TYPE_FOG_COORDINATE = 0x8451, + GL_FOG_COORD_SRC_TYPE_FRAGMENT_DEPTH = 0x8452, + GL_FOG_COORD_SRC_TYPE_COUNT = 2 +}; + +enum domGl_front_face_type { + GL_FRONT_FACE_TYPE_CW = 0x0900, + GL_FRONT_FACE_TYPE_CCW = 0x0901, + GL_FRONT_FACE_TYPE_COUNT = 2 +}; + +enum domGl_light_model_color_control_type { + GL_LIGHT_MODEL_COLOR_CONTROL_TYPE_SINGLE_COLOR = 0x81F9, + GL_LIGHT_MODEL_COLOR_CONTROL_TYPE_SEPARATE_SPECULAR_COLOR = 0x81FA, + GL_LIGHT_MODEL_COLOR_CONTROL_TYPE_COUNT = 2 +}; + +enum domGl_logic_op_type { + GL_LOGIC_OP_TYPE_CLEAR = 0x1500, + GL_LOGIC_OP_TYPE_AND = 0x1501, + GL_LOGIC_OP_TYPE_AND_REVERSE = 0x1502, + GL_LOGIC_OP_TYPE_COPY = 0x1503, + GL_LOGIC_OP_TYPE_AND_INVERTED = 0x1504, + GL_LOGIC_OP_TYPE_NOOP = 0x1505, + GL_LOGIC_OP_TYPE_XOR = 0x1506, + GL_LOGIC_OP_TYPE_OR = 0x1507, + GL_LOGIC_OP_TYPE_NOR = 0x1508, + GL_LOGIC_OP_TYPE_EQUIV = 0x1509, + GL_LOGIC_OP_TYPE_INVERT = 0x150A, + GL_LOGIC_OP_TYPE_OR_REVERSE = 0x150B, + GL_LOGIC_OP_TYPE_COPY_INVERTED = 0x150C, + GL_LOGIC_OP_TYPE_NAND = 0x150E, + GL_LOGIC_OP_TYPE_SET = 0x150F, + GL_LOGIC_OP_TYPE_COUNT = 15 +}; + +enum domGl_polygon_mode_type { + GL_POLYGON_MODE_TYPE_POINT = 0x1B00, + GL_POLYGON_MODE_TYPE_LINE = 0x1B01, + GL_POLYGON_MODE_TYPE_FILL = 0x1B02, + GL_POLYGON_MODE_TYPE_COUNT = 3 +}; + +enum domGl_shade_model_type { + GL_SHADE_MODEL_TYPE_FLAT = 0x1D00, + GL_SHADE_MODEL_TYPE_SMOOTH = 0x1D01, + GL_SHADE_MODEL_TYPE_COUNT = 2 +}; + +enum domGlsl_pipeline_stage { + GLSL_PIPELINE_STAGE_VERTEXPROGRAM, + GLSL_PIPELINE_STAGE_FRAGMENTPROGRAM, + GLSL_PIPELINE_STAGE_COUNT = 2 +}; + +enum domCg_pipeline_stage { + CG_PIPELINE_STAGE_VERTEX, + CG_PIPELINE_STAGE_FRAGMENT, + CG_PIPELINE_STAGE_COUNT = 2 +}; + +enum domGles_texenv_mode_enums { + GLES_TEXENV_MODE_ENUMS_REPLACE = 0x1E01, + GLES_TEXENV_MODE_ENUMS_MODULATE = 0x2100, + GLES_TEXENV_MODE_ENUMS_DECAL = 0x2101, + GLES_TEXENV_MODE_ENUMS_BLEND = 0x0BE2, + GLES_TEXENV_MODE_ENUMS_ADD = 0x0104, + GLES_TEXENV_MODE_ENUMS_COUNT = 5 +}; + +enum domGles_texcombiner_operatorRGB_enums { + GLES_TEXCOMBINER_OPERATORRGB_ENUMS_REPLACE = 0x1E01, + GLES_TEXCOMBINER_OPERATORRGB_ENUMS_MODULATE = 0x2100, + GLES_TEXCOMBINER_OPERATORRGB_ENUMS_ADD = 0x0104, + GLES_TEXCOMBINER_OPERATORRGB_ENUMS_ADD_SIGNED = 0x8574, + GLES_TEXCOMBINER_OPERATORRGB_ENUMS_INTERPOLATE = 0x8575, + GLES_TEXCOMBINER_OPERATORRGB_ENUMS_SUBTRACT = 0x84E7, + GLES_TEXCOMBINER_OPERATORRGB_ENUMS_DOT3_RGB = 0x86AE, + GLES_TEXCOMBINER_OPERATORRGB_ENUMS_DOT3_RGBA = 0x86AF, + GLES_TEXCOMBINER_OPERATORRGB_ENUMS_COUNT = 8 +}; + +enum domGles_texcombiner_operatorAlpha_enums { + GLES_TEXCOMBINER_OPERATORALPHA_ENUMS_REPLACE = 0x1E01, + GLES_TEXCOMBINER_OPERATORALPHA_ENUMS_MODULATE = 0x2100, + GLES_TEXCOMBINER_OPERATORALPHA_ENUMS_ADD = 0x0104, + GLES_TEXCOMBINER_OPERATORALPHA_ENUMS_ADD_SIGNED = 0x8574, + GLES_TEXCOMBINER_OPERATORALPHA_ENUMS_INTERPOLATE = 0x8575, + GLES_TEXCOMBINER_OPERATORALPHA_ENUMS_SUBTRACT = 0x84E7, + GLES_TEXCOMBINER_OPERATORALPHA_ENUMS_COUNT = 6 +}; + +enum domGles_texcombiner_source_enums { + GLES_TEXCOMBINER_SOURCE_ENUMS_TEXTURE = 0x1702, + GLES_TEXCOMBINER_SOURCE_ENUMS_CONSTANT = 0x8576, + GLES_TEXCOMBINER_SOURCE_ENUMS_PRIMARY = 0x8577, + GLES_TEXCOMBINER_SOURCE_ENUMS_PREVIOUS = 0x8578, + GLES_TEXCOMBINER_SOURCE_ENUMS_COUNT = 4 +}; + +enum domGles_texcombiner_operandRGB_enums { + GLES_TEXCOMBINER_OPERANDRGB_ENUMS_SRC_COLOR = 0x0300, + GLES_TEXCOMBINER_OPERANDRGB_ENUMS_ONE_MINUS_SRC_COLOR = 0x0301, + GLES_TEXCOMBINER_OPERANDRGB_ENUMS_SRC_ALPHA = 0x0302, + GLES_TEXCOMBINER_OPERANDRGB_ENUMS_ONE_MINUS_SRC_ALPHA = 0x0303, + GLES_TEXCOMBINER_OPERANDRGB_ENUMS_COUNT = 4 +}; + +enum domGles_texcombiner_operandAlpha_enums { + GLES_TEXCOMBINER_OPERANDALPHA_ENUMS_SRC_ALPHA = 0x0302, + GLES_TEXCOMBINER_OPERANDALPHA_ENUMS_ONE_MINUS_SRC_ALPHA = 0x0303, + GLES_TEXCOMBINER_OPERANDALPHA_ENUMS_COUNT = 2 +}; + +enum domGles_sampler_wrap { + GLES_SAMPLER_WRAP_REPEAT, + GLES_SAMPLER_WRAP_CLAMP, + GLES_SAMPLER_WRAP_CLAMP_TO_EDGE, + GLES_SAMPLER_WRAP_MIRRORED_REPEAT, /**< supported by GLES 1.1 only */ + GLES_SAMPLER_WRAP_COUNT = 4 +}; + +enum domGles_stencil_op_type { + GLES_STENCIL_OP_TYPE_KEEP = 0x1E00, + GLES_STENCIL_OP_TYPE_ZERO = 0x0, + GLES_STENCIL_OP_TYPE_REPLACE = 0x1E01, + GLES_STENCIL_OP_TYPE_INCR = 0x1E02, + GLES_STENCIL_OP_TYPE_DECR = 0x1E03, + GLES_STENCIL_OP_TYPE_INVERT = 0x150A, + GLES_STENCIL_OP_TYPE_COUNT = 6 +}; + +enum domSpringType { + SPRINGTYPE_LINEAR, + SPRINGTYPE_ANGULAR, + SPRINGTYPE_COUNT = 2 +}; + +enum domGl_enumeration { + GL_ENUMERATION_ZERO = 0x0, + GL_ENUMERATION_ONE = 0x1, + GL_ENUMERATION_SRC_COLOR = 0x0300, + GL_ENUMERATION_ONE_MINUS_SRC_COLOR = 0x0301, + GL_ENUMERATION_DEST_COLOR = 0x0306, + GL_ENUMERATION_ONE_MINUS_DEST_COLOR = 0x0307, + GL_ENUMERATION_SRC_ALPHA = 0x0302, + GL_ENUMERATION_ONE_MINUS_SRC_ALPHA = 0x0303, + GL_ENUMERATION_DST_ALPHA = 0x0304, + GL_ENUMERATION_ONE_MINUS_DST_ALPHA = 0x0305, + GL_ENUMERATION_CONSTANT_COLOR = 0x8001, + GL_ENUMERATION_ONE_MINUS_CONSTANT_COLOR = 0x8002, + GL_ENUMERATION_CONSTANT_ALPHA = 0x8003, + GL_ENUMERATION_ONE_MINUS_CONSTANT_ALPHA = 0x8004, + GL_ENUMERATION_SRC_ALPHA_SATURATE = 0x0308, + GL_ENUMERATION_FRONT = 0x0404, + GL_ENUMERATION_BACK = 0x0405, + GL_ENUMERATION_FRONT_AND_BACK = 0x0408, + GL_ENUMERATION_FUNC_ADD = 0x8006, + GL_ENUMERATION_FUNC_SUBTRACT = 0x800A, + GL_ENUMERATION_FUNC_REVERSE_SUBTRACT = 0x800B, + GL_ENUMERATION_MIN = 0x8007, + GL_ENUMERATION_MAX = 0x8008, + GL_ENUMERATION_NEVER = 0x0200, + GL_ENUMERATION_LESS = 0x0201, + GL_ENUMERATION_LEQUAL = 0x0203, + GL_ENUMERATION_EQUAL = 0x0202, + GL_ENUMERATION_GREATER = 0x0204, + GL_ENUMERATION_NOTEQUAL = 0x0205, + GL_ENUMERATION_GEQUAL = 0x0206, + GL_ENUMERATION_ALWAYS = 0x0207, + GL_ENUMERATION_KEEP = 0x1E00, + GL_ENUMERATION_REPLACE = 0x1E01, + GL_ENUMERATION_INCR = 0x1E02, + GL_ENUMERATION_DECR = 0x1E03, + GL_ENUMERATION_INVERT = 0x150A, + GL_ENUMERATION_INCR_WRAP = 0x8507, + GL_ENUMERATION_DECR_WRAP = 0x8508, + GL_ENUMERATION_EMISSION = 0x1600, + GL_ENUMERATION_AMBIENT = 0x1200, + GL_ENUMERATION_DIFFUSE = 0x1201, + GL_ENUMERATION_SPECULAR = 0x1202, + GL_ENUMERATION_AMBIENT_AND_DIFFUSE = 0x1602, + GL_ENUMERATION_LINEAR = 0x2601, + GL_ENUMERATION_EXP = 0x0800, + GL_ENUMERATION_EXP2 = 0x0801, + GL_ENUMERATION_FOG_COORDINATE = 0x8451, + GL_ENUMERATION_FRAGMENT_DEPTH = 0x8452, + GL_ENUMERATION_CW = 0x0900, + GL_ENUMERATION_CCW = 0x0901, + GL_ENUMERATION_SINGLE_COLOR = 0x81F9, + GL_ENUMERATION_SEPARATE_SPECULAR_COLOR = 0x81FA, + GL_ENUMERATION_CLEAR = 0x1500, + GL_ENUMERATION_AND = 0x1501, + GL_ENUMERATION_AND_REVERSE = 0x1502, + GL_ENUMERATION_COPY = 0x1503, + GL_ENUMERATION_AND_INVERTED = 0x1504, + GL_ENUMERATION_NOOP = 0x1505, + GL_ENUMERATION_XOR = 0x1506, + GL_ENUMERATION_OR = 0x1507, + GL_ENUMERATION_NOR = 0x1508, + GL_ENUMERATION_EQUIV = 0x1509, + GL_ENUMERATION_OR_REVERSE = 0x150B, + GL_ENUMERATION_COPY_INVERTED = 0x150C, + GL_ENUMERATION_NAND = 0x150E, + GL_ENUMERATION_SET = 0x150F, + GL_ENUMERATION_POINT = 0x1B00, + GL_ENUMERATION_LINE = 0x1B01, + GL_ENUMERATION_FILL = 0x1B02, + GL_ENUMERATION_FLAT = 0x1D00, + GL_ENUMERATION_SMOOTH = 0x1D01, + GL_ENUMERATION_COUNT = 72 +}; + +enum domGles_enumeration { + GLES_ENUMERATION_ZERO = 0x0, + GLES_ENUMERATION_ONE = 0x1, + GLES_ENUMERATION_SRC_COLOR = 0x0300, + GLES_ENUMERATION_ONE_MINUS_SRC_COLOR = 0x0301, + GLES_ENUMERATION_DEST_COLOR = 0x0306, + GLES_ENUMERATION_ONE_MINUS_DEST_COLOR = 0x0307, + GLES_ENUMERATION_SRC_ALPHA = 0x0302, + GLES_ENUMERATION_ONE_MINUS_SRC_ALPHA = 0x0303, + GLES_ENUMERATION_DST_ALPHA = 0x0304, + GLES_ENUMERATION_ONE_MINUS_DST_ALPHA = 0x0305, + GLES_ENUMERATION_CONSTANT_COLOR = 0x8001, + GLES_ENUMERATION_ONE_MINUS_CONSTANT_COLOR = 0x8002, + GLES_ENUMERATION_CONSTANT_ALPHA = 0x8003, + GLES_ENUMERATION_ONE_MINUS_CONSTANT_ALPHA = 0x8004, + GLES_ENUMERATION_SRC_ALPHA_SATURATE = 0x0308, + GLES_ENUMERATION_FRONT = 0x0404, + GLES_ENUMERATION_BACK = 0x0405, + GLES_ENUMERATION_FRONT_AND_BACK = 0x0408, + GLES_ENUMERATION_NEVER = 0x0200, + GLES_ENUMERATION_LESS = 0x0201, + GLES_ENUMERATION_LEQUAL = 0x0203, + GLES_ENUMERATION_EQUAL = 0x0202, + GLES_ENUMERATION_GREATER = 0x0204, + GLES_ENUMERATION_NOTEQUAL = 0x0205, + GLES_ENUMERATION_GEQUAL = 0x0206, + GLES_ENUMERATION_ALWAYS = 0x0207, + GLES_ENUMERATION_KEEP = 0x1E00, + GLES_ENUMERATION_REPLACE = 0x1E01, + GLES_ENUMERATION_INCR = 0x1E02, + GLES_ENUMERATION_DECR = 0x1E03, + GLES_ENUMERATION_INVERT = 0x150A, + GLES_ENUMERATION_INCR_WRAP = 0x8507, + GLES_ENUMERATION_DECR_WRAP = 0x8508, + GLES_ENUMERATION_EMISSION = 0x1600, + GLES_ENUMERATION_AMBIENT = 0x1200, + GLES_ENUMERATION_DIFFUSE = 0x1201, + GLES_ENUMERATION_SPECULAR = 0x1202, + GLES_ENUMERATION_AMBIENT_AND_DIFFUSE = 0x1602, + GLES_ENUMERATION_LINEAR = 0x2601, + GLES_ENUMERATION_EXP = 0x0800, + GLES_ENUMERATION_EXP2 = 0x0801, + GLES_ENUMERATION_CW = 0x0900, + GLES_ENUMERATION_CCW = 0x0901, + GLES_ENUMERATION_SINGLE_COLOR = 0x81F9, + GLES_ENUMERATION_SEPARATE_SPECULAR_COLOR = 0x81FA, + GLES_ENUMERATION_CLEAR = 0x1500, + GLES_ENUMERATION_AND = 0x1501, + GLES_ENUMERATION_AND_REVERSE = 0x1502, + GLES_ENUMERATION_COPY = 0x1503, + GLES_ENUMERATION_AND_INVERTED = 0x1504, + GLES_ENUMERATION_NOOP = 0x1505, + GLES_ENUMERATION_XOR = 0x1506, + GLES_ENUMERATION_OR = 0x1507, + GLES_ENUMERATION_NOR = 0x1508, + GLES_ENUMERATION_EQUIV = 0x1509, + GLES_ENUMERATION_OR_REVERSE = 0x150B, + GLES_ENUMERATION_COPY_INVERTED = 0x150C, + GLES_ENUMERATION_NAND = 0x150E, + GLES_ENUMERATION_SET = 0x150F, + GLES_ENUMERATION_POINT = 0x1B00, + GLES_ENUMERATION_LINE = 0x1B01, + GLES_ENUMERATION_FILL = 0x1B02, + GLES_ENUMERATION_FLAT = 0x1D00, + GLES_ENUMERATION_SMOOTH = 0x1D01, + GLES_ENUMERATION_COUNT = 65 +}; + +//Element Type Enum +namespace COLLADA_TYPE +{ +#ifdef _MSC_VER + enum TypeEnum + { +#else + const int +#endif + NO_TYPE = 0, + ANY = 1, + INPUTGLOBAL = 2, + INPUTLOCAL = 3, + INPUTLOCALOFFSET = 4, + INSTANCEWITHEXTRA = 5, + TARGETABLEFLOAT = 6, + TARGETABLEFLOAT3 = 7, + FX_SURFACE_FORMAT_HINT_COMMON = 8, + CHANNELS = 9, + RANGE = 10, + PRECISION = 11, + OPTION = 12, + FX_SURFACE_INIT_PLANAR_COMMON = 13, + ALL = 14, + FX_SURFACE_INIT_VOLUME_COMMON = 15, + PRIMARY = 16, + FX_SURFACE_INIT_CUBE_COMMON = 17, + ORDER = 18, + FACE = 19, + FX_SURFACE_INIT_FROM_COMMON = 20, + FX_SURFACE_COMMON = 21, + FORMAT = 22, + SIZE = 23, + VIEWPORT_RATIO = 24, + MIP_LEVELS = 25, + MIPMAP_GENERATE = 26, + FX_SAMPLER1D_COMMON = 27, + SOURCE = 28, + WRAP_S = 29, + MINFILTER = 30, + MAGFILTER = 31, + MIPFILTER = 32, + BORDER_COLOR = 33, + MIPMAP_MAXLEVEL = 34, + MIPMAP_BIAS = 35, + FX_SAMPLER2D_COMMON = 36, + WRAP_T = 37, + FX_SAMPLER3D_COMMON = 38, + WRAP_P = 39, + FX_SAMPLERCUBE_COMMON = 40, + FX_SAMPLERRECT_COMMON = 41, + FX_SAMPLERDEPTH_COMMON = 42, + FX_COLORTARGET_COMMON = 43, + FX_DEPTHTARGET_COMMON = 44, + FX_STENCILTARGET_COMMON = 45, + FX_CLEARCOLOR_COMMON = 46, + FX_CLEARDEPTH_COMMON = 47, + FX_CLEARSTENCIL_COMMON = 48, + FX_ANNOTATE_COMMON = 49, + FX_INCLUDE_COMMON = 50, + FX_NEWPARAM_COMMON = 51, + SEMANTIC = 52, + MODIFIER = 53, + FX_CODE_PROFILE = 54, + GL_SAMPLER1D = 55, + GL_SAMPLER2D = 56, + GL_SAMPLER3D = 57, + GL_SAMPLERCUBE = 58, + GL_SAMPLERRECT = 59, + GL_SAMPLERDEPTH = 60, + GLSL_NEWARRAY_TYPE = 61, + GLSL_SETARRAY_TYPE = 62, + GLSL_SURFACE_TYPE = 63, + GENERATOR = 64, + NAME = 65, + GLSL_NEWPARAM = 66, + GLSL_SETPARAM_SIMPLE = 67, + GLSL_SETPARAM = 68, + COMMON_FLOAT_OR_PARAM_TYPE = 69, + FLOAT = 70, + PARAM = 71, + COMMON_COLOR_OR_TEXTURE_TYPE = 72, + COLOR = 73, + TEXTURE = 74, + COMMON_TRANSPARENT_TYPE = 75, + COMMON_NEWPARAM_TYPE = 76, + FLOAT2 = 77, + FLOAT3 = 78, + FLOAT4 = 79, + CG_SAMPLER1D = 80, + CG_SAMPLER2D = 81, + CG_SAMPLER3D = 82, + CG_SAMPLERCUBE = 83, + CG_SAMPLERRECT = 84, + CG_SAMPLERDEPTH = 85, + CG_CONNECT_PARAM = 86, + CG_NEWARRAY_TYPE = 87, + CG_SETARRAY_TYPE = 88, + CG_SETUSER_TYPE = 89, + CG_SURFACE_TYPE = 90, + CG_NEWPARAM = 91, + CG_SETPARAM_SIMPLE = 92, + CG_SETPARAM = 93, + GLES_TEXTURE_CONSTANT_TYPE = 94, + GLES_TEXENV_COMMAND_TYPE = 95, + GLES_TEXCOMBINER_ARGUMENTRGB_TYPE = 96, + GLES_TEXCOMBINER_ARGUMENTALPHA_TYPE = 97, + GLES_TEXCOMBINER_COMMANDRGB_TYPE = 98, + GLES_TEXCOMBINER_COMMANDALPHA_TYPE = 99, + GLES_TEXCOMBINER_COMMAND_TYPE = 100, + GLES_TEXTURE_PIPELINE = 101, + GLES_TEXTURE_UNIT = 102, + SURFACE = 103, + SAMPLER_STATE = 104, + TEXCOORD = 105, + GLES_SAMPLER_STATE = 106, + GLES_NEWPARAM = 107, + FX_SURFACE_INIT_COMMON = 108, + INIT_AS_NULL = 109, + INIT_AS_TARGET = 110, + FX_ANNOTATE_TYPE_COMMON = 111, + BOOL = 112, + BOOL2 = 113, + BOOL3 = 114, + BOOL4 = 115, + INT = 116, + INT2 = 117, + INT3 = 118, + INT4 = 119, + FLOAT2X2 = 120, + FLOAT3X3 = 121, + FLOAT4X4 = 122, + STRING = 123, + FX_BASIC_TYPE_COMMON = 124, + FLOAT1X1 = 125, + FLOAT1X2 = 126, + FLOAT1X3 = 127, + FLOAT1X4 = 128, + FLOAT2X1 = 129, + FLOAT2X3 = 130, + FLOAT2X4 = 131, + FLOAT3X1 = 132, + FLOAT3X2 = 133, + FLOAT3X4 = 134, + FLOAT4X1 = 135, + FLOAT4X2 = 136, + FLOAT4X3 = 137, + ENUM = 138, + GL_PIPELINE_SETTINGS = 139, + ALPHA_FUNC = 140, + FUNC = 141, + VALUE = 142, + BLEND_FUNC = 143, + SRC = 144, + DEST = 145, + BLEND_FUNC_SEPARATE = 146, + SRC_RGB = 147, + DEST_RGB = 148, + SRC_ALPHA = 149, + DEST_ALPHA = 150, + BLEND_EQUATION = 151, + BLEND_EQUATION_SEPARATE = 152, + RGB = 153, + ALPHA = 154, + COLOR_MATERIAL = 155, + MODE = 156, + CULL_FACE = 157, + DEPTH_FUNC = 158, + FOG_MODE = 159, + FOG_COORD_SRC = 160, + FRONT_FACE = 161, + LIGHT_MODEL_COLOR_CONTROL = 162, + LOGIC_OP = 163, + POLYGON_MODE = 164, + SHADE_MODEL = 165, + STENCIL_FUNC = 166, + REF = 167, + MASK = 168, + STENCIL_OP = 169, + FAIL = 170, + ZFAIL = 171, + ZPASS = 172, + STENCIL_FUNC_SEPARATE = 173, + FRONT = 174, + BACK = 175, + STENCIL_OP_SEPARATE = 176, + STENCIL_MASK_SEPARATE = 177, + LIGHT_ENABLE = 178, + LIGHT_AMBIENT = 179, + LIGHT_DIFFUSE = 180, + LIGHT_SPECULAR = 181, + LIGHT_POSITION = 182, + LIGHT_CONSTANT_ATTENUATION = 183, + LIGHT_LINEAR_ATTENUATION = 184, + LIGHT_QUADRATIC_ATTENUATION = 185, + LIGHT_SPOT_CUTOFF = 186, + LIGHT_SPOT_DIRECTION = 187, + LIGHT_SPOT_EXPONENT = 188, + TEXTURE1D = 189, + TEXTURE2D = 190, + TEXTURE3D = 191, + TEXTURECUBE = 192, + TEXTURERECT = 193, + TEXTUREDEPTH = 194, + TEXTURE1D_ENABLE = 195, + TEXTURE2D_ENABLE = 196, + TEXTURE3D_ENABLE = 197, + TEXTURECUBE_ENABLE = 198, + TEXTURERECT_ENABLE = 199, + TEXTUREDEPTH_ENABLE = 200, + TEXTURE_ENV_COLOR = 201, + TEXTURE_ENV_MODE = 202, + CLIP_PLANE = 203, + CLIP_PLANE_ENABLE = 204, + BLEND_COLOR = 205, + CLEAR_COLOR = 206, + CLEAR_STENCIL = 207, + CLEAR_DEPTH = 208, + COLOR_MASK = 209, + DEPTH_BOUNDS = 210, + DEPTH_MASK = 211, + DEPTH_RANGE = 212, + FOG_DENSITY = 213, + FOG_START = 214, + FOG_END = 215, + FOG_COLOR = 216, + LIGHT_MODEL_AMBIENT = 217, + LIGHTING_ENABLE = 218, + LINE_STIPPLE = 219, + LINE_WIDTH = 220, + MATERIAL_AMBIENT = 221, + MATERIAL_DIFFUSE = 222, + MATERIAL_EMISSION = 223, + MATERIAL_SHININESS = 224, + MATERIAL_SPECULAR = 225, + MODEL_VIEW_MATRIX = 226, + POINT_DISTANCE_ATTENUATION = 227, + POINT_FADE_THRESHOLD_SIZE = 228, + POINT_SIZE = 229, + POINT_SIZE_MIN = 230, + POINT_SIZE_MAX = 231, + POLYGON_OFFSET = 232, + PROJECTION_MATRIX = 233, + SCISSOR = 234, + STENCIL_MASK = 235, + ALPHA_TEST_ENABLE = 236, + AUTO_NORMAL_ENABLE = 237, + BLEND_ENABLE = 238, + COLOR_LOGIC_OP_ENABLE = 239, + COLOR_MATERIAL_ENABLE = 240, + CULL_FACE_ENABLE = 241, + DEPTH_BOUNDS_ENABLE = 242, + DEPTH_CLAMP_ENABLE = 243, + DEPTH_TEST_ENABLE = 244, + DITHER_ENABLE = 245, + FOG_ENABLE = 246, + LIGHT_MODEL_LOCAL_VIEWER_ENABLE = 247, + LIGHT_MODEL_TWO_SIDE_ENABLE = 248, + LINE_SMOOTH_ENABLE = 249, + LINE_STIPPLE_ENABLE = 250, + LOGIC_OP_ENABLE = 251, + MULTISAMPLE_ENABLE = 252, + NORMALIZE_ENABLE = 253, + POINT_SMOOTH_ENABLE = 254, + POLYGON_OFFSET_FILL_ENABLE = 255, + POLYGON_OFFSET_LINE_ENABLE = 256, + POLYGON_OFFSET_POINT_ENABLE = 257, + POLYGON_SMOOTH_ENABLE = 258, + POLYGON_STIPPLE_ENABLE = 259, + RESCALE_NORMAL_ENABLE = 260, + SAMPLE_ALPHA_TO_COVERAGE_ENABLE = 261, + SAMPLE_ALPHA_TO_ONE_ENABLE = 262, + SAMPLE_COVERAGE_ENABLE = 263, + SCISSOR_TEST_ENABLE = 264, + STENCIL_TEST_ENABLE = 265, + GLSL_PARAM_TYPE = 266, + CG_PARAM_TYPE = 267, + BOOL1 = 268, + BOOL1X1 = 269, + BOOL1X2 = 270, + BOOL1X3 = 271, + BOOL1X4 = 272, + BOOL2X1 = 273, + BOOL2X2 = 274, + BOOL2X3 = 275, + BOOL2X4 = 276, + BOOL3X1 = 277, + BOOL3X2 = 278, + BOOL3X3 = 279, + BOOL3X4 = 280, + BOOL4X1 = 281, + BOOL4X2 = 282, + BOOL4X3 = 283, + BOOL4X4 = 284, + FLOAT1 = 285, + INT1 = 286, + INT1X1 = 287, + INT1X2 = 288, + INT1X3 = 289, + INT1X4 = 290, + INT2X1 = 291, + INT2X2 = 292, + INT2X3 = 293, + INT2X4 = 294, + INT3X1 = 295, + INT3X2 = 296, + INT3X3 = 297, + INT3X4 = 298, + INT4X1 = 299, + INT4X2 = 300, + INT4X3 = 301, + INT4X4 = 302, + HALF = 303, + HALF1 = 304, + HALF2 = 305, + HALF3 = 306, + HALF4 = 307, + HALF1X1 = 308, + HALF1X2 = 309, + HALF1X3 = 310, + HALF1X4 = 311, + HALF2X1 = 312, + HALF2X2 = 313, + HALF2X3 = 314, + HALF2X4 = 315, + HALF3X1 = 316, + HALF3X2 = 317, + HALF3X3 = 318, + HALF3X4 = 319, + HALF4X1 = 320, + HALF4X2 = 321, + HALF4X3 = 322, + HALF4X4 = 323, + FIXED = 324, + FIXED1 = 325, + FIXED2 = 326, + FIXED3 = 327, + FIXED4 = 328, + FIXED1X1 = 329, + FIXED1X2 = 330, + FIXED1X3 = 331, + FIXED1X4 = 332, + FIXED2X1 = 333, + FIXED2X2 = 334, + FIXED2X3 = 335, + FIXED2X4 = 336, + FIXED3X1 = 337, + FIXED3X2 = 338, + FIXED3X3 = 339, + FIXED3X4 = 340, + FIXED4X1 = 341, + FIXED4X2 = 342, + FIXED4X3 = 343, + FIXED4X4 = 344, + GLES_PIPELINE_SETTINGS = 345, + TEXTURE_PIPELINE = 346, + LIGHT_LINEAR_ATTENUTATION = 347, + TEXTURE_PIPELINE_ENABLE = 348, + GLES_BASIC_TYPE_COMMON = 349, + COLLADA = 350, + SCENE = 351, + IDREF_ARRAY = 352, + NAME_ARRAY = 353, + BOOL_ARRAY = 354, + FLOAT_ARRAY = 355, + INT_ARRAY = 356, + ACCESSOR = 357, + TECHNIQUE_COMMON = 358, + GEOMETRY = 359, + MESH = 360, + SPLINE = 361, + CONTROL_VERTICES = 362, + P = 363, + LINES = 364, + LINESTRIPS = 365, + POLYGONS = 366, + PH = 367, + H = 368, + POLYLIST = 369, + VCOUNT = 370, + TRIANGLES = 371, + TRIFANS = 372, + TRISTRIPS = 373, + VERTICES = 374, + LOOKAT = 375, + MATRIX = 376, + ROTATE = 377, + SCALE = 378, + SKEW = 379, + TRANSLATE = 380, + IMAGE = 381, + DATA = 382, + INIT_FROM = 383, + LIGHT = 384, + AMBIENT = 385, + DIRECTIONAL = 386, + POINT = 387, + SPOT = 388, + MATERIAL = 389, + CAMERA = 390, + OPTICS = 391, + ORTHOGRAPHIC = 392, + PERSPECTIVE = 393, + IMAGER = 394, + ANIMATION = 395, + ANIMATION_CLIP = 396, + CHANNEL = 397, + SAMPLER = 398, + CONTROLLER = 399, + SKIN = 400, + BIND_SHAPE_MATRIX = 401, + JOINTS = 402, + VERTEX_WEIGHTS = 403, + V = 404, + MORPH = 405, + TARGETS = 406, + ASSET = 407, + CONTRIBUTOR = 408, + AUTHOR = 409, + AUTHORING_TOOL = 410, + COMMENTS = 411, + COPYRIGHT = 412, + SOURCE_DATA = 413, + CREATED = 414, + KEYWORDS = 415, + MODIFIED = 416, + REVISION = 417, + SUBJECT = 418, + TITLE = 419, + UNIT = 420, + UP_AXIS = 421, + EXTRA = 422, + TECHNIQUE = 423, + NODE = 424, + VISUAL_SCENE = 425, + EVALUATE_SCENE = 426, + RENDER = 427, + LAYER = 428, + BIND_MATERIAL = 429, + INSTANCE_CAMERA = 430, + INSTANCE_CONTROLLER = 431, + SKELETON = 432, + INSTANCE_EFFECT = 433, + TECHNIQUE_HINT = 434, + SETPARAM = 435, + INSTANCE_FORCE_FIELD = 436, + INSTANCE_GEOMETRY = 437, + INSTANCE_LIGHT = 438, + INSTANCE_MATERIAL = 439, + BIND = 440, + BIND_VERTEX_INPUT = 441, + INSTANCE_NODE = 442, + INSTANCE_PHYSICS_MATERIAL = 443, + INSTANCE_PHYSICS_MODEL = 444, + INSTANCE_RIGID_BODY = 445, + ANGULAR_VELOCITY = 446, + VELOCITY = 447, + DYNAMIC = 448, + MASS_FRAME = 449, + SHAPE = 450, + HOLLOW = 451, + INSTANCE_RIGID_CONSTRAINT = 452, + LIBRARY_ANIMATIONS = 453, + LIBRARY_ANIMATION_CLIPS = 454, + LIBRARY_CAMERAS = 455, + LIBRARY_CONTROLLERS = 456, + LIBRARY_GEOMETRIES = 457, + LIBRARY_EFFECTS = 458, + LIBRARY_FORCE_FIELDS = 459, + LIBRARY_IMAGES = 460, + LIBRARY_LIGHTS = 461, + LIBRARY_MATERIALS = 462, + LIBRARY_NODES = 463, + LIBRARY_PHYSICS_MATERIALS = 464, + LIBRARY_PHYSICS_MODELS = 465, + LIBRARY_PHYSICS_SCENES = 466, + LIBRARY_VISUAL_SCENES = 467, + FX_PROFILE_ABSTRACT = 468, + EFFECT = 469, + GL_HOOK_ABSTRACT = 470, + PROFILE_GLSL = 471, + PASS = 472, + DRAW = 473, + SHADER = 474, + COMPILER_TARGET = 475, + COMPILER_OPTIONS = 476, + PROFILE_COMMON = 477, + CONSTANT = 478, + LAMBERT = 479, + PHONG = 480, + BLINN = 481, + PROFILE_CG = 482, + PROFILE_GLES = 483, + COLOR_TARGET = 484, + DEPTH_TARGET = 485, + STENCIL_TARGET = 486, + COLOR_CLEAR = 487, + DEPTH_CLEAR = 488, + STENCIL_CLEAR = 489, + BOX = 490, + HALF_EXTENTS = 491, + PLANE = 492, + EQUATION = 493, + SPHERE = 494, + RADIUS = 495, + ELLIPSOID = 496, + CYLINDER = 497, + HEIGHT = 498, + TAPERED_CYLINDER = 499, + RADIUS1 = 500, + RADIUS2 = 501, + CAPSULE = 502, + TAPERED_CAPSULE = 503, + CONVEX_MESH = 504, + FORCE_FIELD = 505, + PHYSICS_MATERIAL = 506, + PHYSICS_SCENE = 507, + RIGID_BODY = 508, + RIGID_CONSTRAINT = 509, + REF_ATTACHMENT = 510, + ATTACHMENT = 511, + ENABLED = 512, + INTERPENETRATE = 513, + LIMITS = 514, + SWING_CONE_AND_TWIST = 515, + LINEAR = 516, + SPRING = 517, + ANGULAR = 518, + PHYSICS_MODEL = 519 +#ifdef _MSC_VER + }; +#else + ; +#endif +} + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domVertices.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domVertices.h new file mode 100644 index 00000000..ce8a1062 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domVertices.h @@ -0,0 +1,140 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domVertices_h__ +#define __domVertices_h__ + +#include +#include + +#include +#include + +/** + * The vertices element declares the attributes and identity of mesh-vertices. + * The vertices element describes mesh-vertices in a mesh geometry. The mesh-vertices + * represent the position (identity) of the vertices comprising the mesh + * and other vertex attributes that are invariant to tessellation. + */ +class domVertices : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::VERTICES; } +protected: // Attributes +/** + * The id attribute is a text string containing the unique identifier of + * this element. This value must be unique within the instance document. + * Required attribute. + */ + xsID attrId; +/** + * The name attribute is the text string name of this element. Optional attribute. + */ + xsNCName attrName; + +protected: // Elements +/** + * The input element must occur at least one time. These inputs are local + * inputs. @see domInput + */ + domInputLocal_Array elemInput_array; +/** + * The extra element may appear any number of times. @see domExtra + */ + domExtra_Array elemExtra_array; + +public: //Accessors and Mutators + /** + * Gets the id attribute. + * @return Returns a xsID of the id attribute. + */ + xsID getId() const { return attrId; } + /** + * Sets the id attribute. + * @param atId The new value for the id attribute. + */ + void setId( xsID atId ) { *(daeStringRef*)&attrId = atId; + _validAttributeArray[0] = true; } + + /** + * Gets the name attribute. + * @return Returns a xsNCName of the name attribute. + */ + xsNCName getName() const { return attrName; } + /** + * Sets the name attribute. + * @param atName The new value for the name attribute. + */ + void setName( xsNCName atName ) { *(daeStringRef*)&attrName = atName; + _validAttributeArray[1] = true; } + + /** + * Gets the input element array. + * @return Returns a reference to the array of input elements. + */ + domInputLocal_Array &getInput_array() { return elemInput_array; } + /** + * Gets the input element array. + * @return Returns a constant reference to the array of input elements. + */ + const domInputLocal_Array &getInput_array() const { return elemInput_array; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } +protected: + /** + * Constructor + */ + domVertices() : attrId(), attrName(), elemInput_array(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domVertices() {} + /** + * Copy Constructor + */ + domVertices( const domVertices &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domVertices &operator=( const domVertices &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domVisual_scene.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domVisual_scene.h new file mode 100644 index 00000000..6f517361 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/1.4/dom/domVisual_scene.h @@ -0,0 +1,437 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domVisual_scene_h__ +#define __domVisual_scene_h__ + +#include +#include + +#include +#include +#include +#include + +/** + * The visual_scene element declares the base of the visual_scene hierarchy + * or scene graph. The scene contains elements that comprise much of the + * visual and transformational information content as created by the authoring + * tools. + */ +class domVisual_scene : public daeElement +{ +public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::VISUAL_SCENE; } +public: + class domEvaluate_scene; + + typedef daeSmartRef domEvaluate_sceneRef; + typedef daeTArray domEvaluate_scene_Array; + +/** + * The evaluate_scene element declares information specifying a specific way + * to evaluate this visual_scene. There may be any number of evaluate_scene + * elements. + */ + class domEvaluate_scene : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::EVALUATE_SCENE; } + public: + class domRender; + + typedef daeSmartRef domRenderRef; + typedef daeTArray domRender_Array; + +/** + * The render element describes one effect pass to evaluate the scene. There + * must be at least one render element. + */ + class domRender : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::RENDER; } + public: + class domLayer; + + typedef daeSmartRef domLayerRef; + typedef daeTArray domLayer_Array; + +/** + * The layer element specifies which layer to render in this compositing step + * while evaluating the scene. You may specify any number of layers. + */ + class domLayer : public daeElement + { + public: + COLLADA_TYPE::TypeEnum getElementType() const { return COLLADA_TYPE::LAYER; } + + protected: // Value + /** + * The xsNCName value of the text data of this element. + */ + xsNCName _value; + + public: //Accessors and Mutators + /** + * Gets the value of this element. + * @return Returns a xsNCName of the value. + */ + xsNCName getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( xsNCName val ) { *(daeStringRef*)&_value = val; } + + protected: + /** + * Constructor + */ + domLayer() : _value() {} + /** + * Destructor + */ + virtual ~domLayer() {} + /** + * Copy Constructor + */ + domLayer( const domLayer &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domLayer &operator=( const domLayer &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + + protected: // Attribute +/** + * The camera_node attribute refers to a node that contains a camera describing + * the viewpoint to render this compositing step from. + */ + xsAnyURI attrCamera_node; + + protected: // Elements +/** + * The layer element specifies which layer to render in this compositing step + * while evaluating the scene. You may specify any number of layers. @see + * domLayer + */ + domLayer_Array elemLayer_array; +/** + * The instance_effect element specifies which effect to render in this compositing + * step while evaluating the scene. @see domInstance_effect + */ + domInstance_effectRef elemInstance_effect; + + public: //Accessors and Mutators + /** + * Gets the camera_node attribute. + * @return Returns a xsAnyURI reference of the camera_node attribute. + */ + xsAnyURI &getCamera_node() { return attrCamera_node; } + /** + * Gets the camera_node attribute. + * @return Returns a constant xsAnyURI reference of the camera_node attribute. + */ + const xsAnyURI &getCamera_node() const { return attrCamera_node; } + /** + * Sets the camera_node attribute. + * @param atCamera_node The new value for the camera_node attribute. + */ + void setCamera_node( const xsAnyURI &atCamera_node ) { attrCamera_node = atCamera_node; + _validAttributeArray[0] = true; } + + /** + * Gets the layer element array. + * @return Returns a reference to the array of layer elements. + */ + domLayer_Array &getLayer_array() { return elemLayer_array; } + /** + * Gets the layer element array. + * @return Returns a constant reference to the array of layer elements. + */ + const domLayer_Array &getLayer_array() const { return elemLayer_array; } + /** + * Gets the instance_effect element. + * @return a daeSmartRef to the instance_effect element. + */ + const domInstance_effectRef getInstance_effect() const { return elemInstance_effect; } + protected: + /** + * Constructor + */ + domRender() : attrCamera_node(), elemLayer_array(), elemInstance_effect() {} + /** + * Destructor + */ + virtual ~domRender() {} + /** + * Copy Constructor + */ + domRender( const domRender &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domRender &operator=( const domRender &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + + protected: // Attribute +/** + * The name attribute is the text string name of this element. Optional attribute. + */ + xsNCName attrName; + + protected: // Element +/** + * The render element describes one effect pass to evaluate the scene. There + * must be at least one render element. @see domRender + */ + domRender_Array elemRender_array; + + public: //Accessors and Mutators + /** + * Gets the name attribute. + * @return Returns a xsNCName of the name attribute. + */ + xsNCName getName() const { return attrName; } + /** + * Sets the name attribute. + * @param atName The new value for the name attribute. + */ + void setName( xsNCName atName ) { *(daeStringRef*)&attrName = atName; + _validAttributeArray[0] = true; } + + /** + * Gets the render element array. + * @return Returns a reference to the array of render elements. + */ + domRender_Array &getRender_array() { return elemRender_array; } + /** + * Gets the render element array. + * @return Returns a constant reference to the array of render elements. + */ + const domRender_Array &getRender_array() const { return elemRender_array; } + protected: + /** + * Constructor + */ + domEvaluate_scene() : attrName(), elemRender_array() {} + /** + * Destructor + */ + virtual ~domEvaluate_scene() {} + /** + * Copy Constructor + */ + domEvaluate_scene( const domEvaluate_scene &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domEvaluate_scene &operator=( const domEvaluate_scene &cpy ) { (void)cpy; return *this; } + + public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + + public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; + }; + + +protected: // Attributes +/** + * The id attribute is a text string containing the unique identifier of + * this element. This value must be unique within the instance document. + * Optional attribute. + */ + xsID attrId; +/** + * The name attribute is the text string name of this element. Optional attribute. + */ + xsNCName attrName; + +protected: // Elements +/** + * The visual_scene element may contain an asset element. @see domAsset + */ + domAssetRef elemAsset; +/** + * The visual_scene element must have at least one node element. @see domNode + */ + domNode_Array elemNode_array; +/** + * The evaluate_scene element declares information specifying a specific way + * to evaluate this visual_scene. There may be any number of evaluate_scene + * elements. @see domEvaluate_scene + */ + domEvaluate_scene_Array elemEvaluate_scene_array; +/** + * The extra element may appear any number of times. @see domExtra + */ + domExtra_Array elemExtra_array; + +public: //Accessors and Mutators + /** + * Gets the id attribute. + * @return Returns a xsID of the id attribute. + */ + xsID getId() const { return attrId; } + /** + * Sets the id attribute. + * @param atId The new value for the id attribute. + */ + void setId( xsID atId ) { *(daeStringRef*)&attrId = atId; + _validAttributeArray[0] = true; } + + /** + * Gets the name attribute. + * @return Returns a xsNCName of the name attribute. + */ + xsNCName getName() const { return attrName; } + /** + * Sets the name attribute. + * @param atName The new value for the name attribute. + */ + void setName( xsNCName atName ) { *(daeStringRef*)&attrName = atName; + _validAttributeArray[1] = true; } + + /** + * Gets the asset element. + * @return a daeSmartRef to the asset element. + */ + const domAssetRef getAsset() const { return elemAsset; } + /** + * Gets the node element array. + * @return Returns a reference to the array of node elements. + */ + domNode_Array &getNode_array() { return elemNode_array; } + /** + * Gets the node element array. + * @return Returns a constant reference to the array of node elements. + */ + const domNode_Array &getNode_array() const { return elemNode_array; } + /** + * Gets the evaluate_scene element array. + * @return Returns a reference to the array of evaluate_scene elements. + */ + domEvaluate_scene_Array &getEvaluate_scene_array() { return elemEvaluate_scene_array; } + /** + * Gets the evaluate_scene element array. + * @return Returns a constant reference to the array of evaluate_scene elements. + */ + const domEvaluate_scene_Array &getEvaluate_scene_array() const { return elemEvaluate_scene_array; } + /** + * Gets the extra element array. + * @return Returns a reference to the array of extra elements. + */ + domExtra_Array &getExtra_array() { return elemExtra_array; } + /** + * Gets the extra element array. + * @return Returns a constant reference to the array of extra elements. + */ + const domExtra_Array &getExtra_array() const { return elemExtra_array; } +protected: + /** + * Constructor + */ + domVisual_scene() : attrId(), attrName(), elemAsset(), elemNode_array(), elemEvaluate_scene_array(), elemExtra_array() {} + /** + * Destructor + */ + virtual ~domVisual_scene() {} + /** + * Copy Constructor + */ + domVisual_scene( const domVisual_scene &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domVisual_scene &operator=( const domVisual_scene &cpy ) { (void)cpy; return *this; } + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * If a daeMetaElement already exists it will return that instead of creating a new one. + * @return A daeMetaElement describing this COLLADA element. + */ + static DLLSPEC daeMetaElement* registerElement(); + +public: // STATIC MEMBERS + /** + * The daeMetaElement that describes this element in the meta object reflection framework. + */ + static DLLSPEC daeMetaElement* _Meta; +}; + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae.h new file mode 100644 index 00000000..cf803d04 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae.h @@ -0,0 +1,104 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#ifndef __DAE__ +#define __DAE__ + +#include +#include +#include +#include +#include +#include + +class daeIDRefResolver; +class domCOLLADA; + +/** + * The @c DAE class implements a standard interface to the + * COLLADA runtime database. + * + * @c DAE serves as a wrapper for the entire pipeline ensuring + * a consistent interface, regardless of extensions to or replacements + * for the various API components. It provides methods to load, store, + * translate and query COLLADA elements. A @c DAE object automatically creates + * and initializes default versions of the COLLADA backend, the COLLADA + * runtime database, and registered integration libraries. + */ +class DAE : public daeInterface +{ +public: + /** + * Constructor. + */ + DLLSPEC DAE(); + /** + * Destructor. + */ + virtual DLLSPEC ~DAE(); + + /** + * Releases all static meta information associated with the COLLADA DOM. + * Ff there are no remaining instances of a @c DAE cleanup happens automatically. + * @note This function is useless if called by the application in a non-static + * context. + */ + static DLLSPEC void cleanup(); + + // Abstract Interface Class for the daeDatabase front end +public: + // Database setup + virtual DLLSPEC daeDatabase* getDatabase(); + virtual DLLSPEC daeInt setDatabase(daeDatabase* database); + + // IO Plugin setup + virtual DLLSPEC daeIOPlugin* getIOPlugin(); + virtual DLLSPEC daeInt setIOPlugin(daeIOPlugin* plugin); + + // Integration Library Setup + virtual DLLSPEC daeIntegrationLibraryFunc getIntegrationLibrary(); + virtual DLLSPEC daeInt setIntegrationLibrary(daeIntegrationLibraryFunc regFunc); + + // batch file operations + virtual DLLSPEC daeInt load(daeString name, daeString docBuffer = NULL); + virtual DLLSPEC daeInt save(daeString documentName, daeBool replace=true); + virtual DLLSPEC daeInt save(daeUInt documentIndex, daeBool replace=true); + virtual DLLSPEC daeInt saveAs(daeString name, daeString documentName, daeBool replace=true); + virtual DLLSPEC daeInt saveAs(daeString name, daeUInt documentIndex=0, daeBool replace=true); + + virtual DLLSPEC daeInt unload(daeString name); + virtual DLLSPEC daeInt clear(); + + // Load/Save Progress + virtual DLLSPEC void getProgress(daeInt* bytesParsed, + daeInt* lineNumber, + daeInt* totalBytes, + daeBool reset = false ); + + // Simple Query + virtual DLLSPEC domCOLLADA* getDom(daeString name); + virtual DLLSPEC daeString getDomVersion(); + virtual DLLSPEC daeInt setDom(daeString name, domCOLLADA* dom); + +private: + daeDatabase *database; + daeIOPlugin *plugin; + daeURIResolver* resolver; + daeIDRefResolver* idResolver; + bool defaultDatabase; + bool defaultPlugin; + daeIntegrationLibraryFunc registerFunc; + static daeMetaElement *topMeta; +}; + +#endif // __DAE_INTERFACE__ diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeArray.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeArray.h new file mode 100644 index 00000000..78a01ac6 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeArray.h @@ -0,0 +1,635 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#ifndef __DAE_ARRAY_H__ +#define __DAE_ARRAY_H__ +#include + +class daeAtomicType; + +/** + * COLLADA C++ class that implements storage for resizable array containers. + */ +class daeArray +{ +protected: + size_t _count; + size_t _capacity; + daeMemoryRef _data; + size_t _elementSize; + daeAtomicType* _type; +public: + /** + * Constructor + */ + DLLSPEC daeArray(); + /** + * Copy Constructor + */ + daeArray( const daeArray &cpy ): _count(cpy._count), _capacity(cpy._capacity), _data(0), + _elementSize( cpy._elementSize), _type( cpy._type ) { + grow(_capacity); + memcpy( _data, cpy._data, _elementSize * _count ); + } + + /** + * Destructor + */ + virtual DLLSPEC ~daeArray(); + /** + * Clears the contents of the array. Do not use this function if the array contains @c daeSmartRef objects and the + * @c dom* class the array belongs to has a @c _contents member. + * + * Many @c dom* objects have a @c _contents member that stores the original creation order of the @c daeElements + * that are their children. If you use @c clear() on a @c daeArray of @c daeSmartRef derived objects, these + * objects will not be removed from @c _contents, which can cause problems when you + * save the data. We recommended that @c clear() not be used on arrays that are part of a @c dom* object. + */ + virtual DLLSPEC void clear(); + /** + * Sets the size of an element in the array when creating a @c daeArray of a specific type. + * @param elementSize Size of an element in the array. + */ + void setElementSize(size_t elementSize) {_elementSize = elementSize;} + /** + * Grows the array to the specified size and sets the @c daeArray to that size. + * @param cnt Size to grow the array to. + */ + inline void setRawCount(size_t cnt) {grow(cnt);_count = cnt;} + /** + * Gets the current capacity of the array, the biggest it can get without incurring a realloc. + * @return Returns the capacity of the array. + */ + inline size_t getCapacity() const {return _capacity;} + /** + * Gets the number of items stored in this @c daeArray. + * @return Returns the number of items stored in this @c daeArray. + */ + inline size_t getCount() const {return _count;} + /** + * Gets the size of an element in this array. + * @return Returns the size of an element in this array. + */ + inline size_t getElementSize() const {return _elementSize;} + /** + * Gets a pointer to the memory where the raw data for this @c daeArray is stored. + * @return Returns a pointer to the memory for the raw data. + */ + inline daeMemoryRef getRawData() const {return _data;} + + /** + * Increases the size of the @c daeArray. + * @param sz Size to grow the array to. + */ + void DLLSPEC grow(size_t sz); + /** + * Removes an item at a specific index in the @c daeArray. + * @param index Index number of the item to delete. + * @return Returns DAE_OK if success, a negative value defined in daeError.h otherwise. + * @note The @c daeElement objects sometimes list + * objects in two places, the class member and the @c _contents array, when you remove something from the + * dom, you must remove it from both places. + */ + virtual DLLSPEC daeInt removeIndex(size_t index); +}; + +/** + * COLLADA C++ templated version of @c daeArray for storing items of various types. + */ +template +class daeTArray : public daeArray +{ +public: + /** + * Constructor. + */ + daeTArray() { +// _type = daeAtomicType::getType("" T ""); + _elementSize = sizeof( T ); + } + /** + * Copy Constructor + */ + daeTArray( const daeTArray &cpy ) : daeArray() { + _count = cpy._count; + //_capacity = cpy._capacity; + _data = NULL; + _elementSize = cpy._elementSize; + _type = cpy._type; + grow(_count); + for(size_t i=0;i<_count;i++) + set( i, cpy[i] ); + } + /** + * Constructor that takes one element and turns into an array + */ + daeTArray( const T &el ) : daeArray() { + _elementSize = sizeof(T); + append( el ); + } + /** + * Destructor. + */ + virtual ~daeTArray() { + clear(); + } + /** + * Frees the memory in this array and resets it to it's initial state. + */ + virtual void clear() + { + size_t i; + for(i=0;i<_count;i++) + ((T*)_data + i)->~T(); + daeArray::clear(); + } + + /** + * Removes an item at a specific index in the @c daeArray. + * @param index Index number of the item to delete. + * @return Returns DAE_OK if success, a negative value defined in daeError.h otherwise. + * @note The @c daeElement objects sometimes list + * objects in two places, the class member and the @c _contents array, when you remove something from the + * dom, you must remove it from both places. + */ + virtual daeInt removeIndex(size_t index) + { + if ((index >= _count)||(_count < 1)) + return(DAE_ERR_INVALID_CALL); + ((T*)_data + index)->~T(); + return(daeArray::removeIndex(index)); + + } + + /** + * Resets the count of items in a daeArray to an absolute value, if necessary the array + * storage will grow to the requested size and new elements will be initialized to zero + * @param nElements The new size of the array. + * @note Shrinking the array does NOT free up memory. + */ + inline void setCount(size_t nElements) + { + grow(nElements); + if(nElements < _count) + { + // If the array shrank, destruct the elements + size_t i; + for(i=_count; i>nElements; i--) + { + ((T*)_data + (i-1))->~T(); + memset(_data+(i-1)*_elementSize,0,_elementSize); + } + } + _count = nElements; + } + + /** + * Sets a specific index in the @c daeArray, growing the array if necessary. + * @param index Index of the object to set, asserts if the index is out of bounds. + * @param value Value to store at index in the array. + */ + inline void set(size_t index, const T& value) { + if (index >= _count) + { + //grow(index); + setCount(index+1); + } + ((T*)_data)[index] = value; } + + /** + * Gets the object at a specific index in the @c daeArray. + * @param index Index of the object to get, asserts if the index is out of bounds. + * @return Returns the object at index. + */ + inline T& get(size_t index) const { + assert(index < _count); + return ((T*)_data)[index]; } + + /** + * Appends a new object to the end of the @c daeArray. + * @param value Value of the object to append. + * @return Returns the index of the new object. + */ + inline size_t append(const T& value) { + set(_count, value); + //_count++; + return _count-1; + } + + /** + * Appends a unique object to the end of the @c daeArray. + * Functions the same as @c append(), but does nothing if the value is already in the @c daeArray. + * @param value Value of the object to append. + * @return Returns the index where this value was appended. If the value already exists in the array, + * returns the index in this array where the value was found. + */ + inline size_t appendUnique(const T& value) { + size_t ret; + if (find(value,ret) != DAE_OK) + return append(value); + else + return ret; + } + + /** + * Removes an item from the @c daeArray. + * @param value A reference to the item to delete. + * @return Returns DAE_OK if success, a negative value defined in daeError.h otherwise. + * @note The @c daeElement objects sometimes list + * objects in two places, the class member and the @c _contents array, when you remove something from the + * do, you must remove it from both places. + */ + inline daeInt remove(const T& value, size_t *idx = NULL ) + { + size_t index; + if(find(value,index) == DAE_OK) + { + if ( idx != NULL ) { + *idx = index; + } + return(removeIndex( index )); + } + else + { + return(DAE_ERR_INVALID_CALL); + } + } + /** + * Finds an item from the @c daeArray. + * @param value A reference to the item to find. + * @param index If the function returns DAE_OK, this is set to the index where the value appears in the array. + * @return Returns DAE_OK if no error or DAE_ERR_QUERY_NO_MATCH if the value was not found. + */ + inline daeInt find(const T& value, size_t &index) const + { + size_t i; + for(i=0;i<_count;i++) + { + if (((T*)_data)[i] == value) + { + index = i; + return DAE_OK; + } + } + return DAE_ERR_QUERY_NO_MATCH; + } + /** + * Gets the object at a specific index in the @c daeArray. + * @param index Index of the object to get, asserts if the index is out of bounds. + * @return Returns the object at @c index. + */ + inline T& operator[](size_t index) const { + assert(index < _count); + return ((T*)_data)[index]; } + + /** + * Inserts an object at a specific index in the daeArray, growing the array if neccessary + * @param index Index into the array for where to place the object, asserts if the index is out of bounds + * @param value of the object to append + */ + inline void insertAt(size_t index, const T& value) { + assert(index <= _capacity); + if ( _count == _capacity ) { + grow( _count +1 ); + } + //memmove( &(((T*)_data)[index+1]), &(((T*)_data)[index]), (_count - index)*_elementSize ); + for (size_t i = _count; i > index; i-- ) + { + T tmp = ((T*)_data)[i-1]; + set( i, tmp ); + //set( i, ((T*)_data)[i-1] ); + } + set( index, value ); + //_count++; + } + + /** + * Overloaded assignment operator. + * @param other A reference to the array to copy + * @return A reference to this object. + */ + inline daeTArray &operator=( const daeTArray &other ) { + clear(); + _count = other._count; + //_capacity = other._capacity; + grow(_count); + for(size_t i=0;i<_count;i++) + set( i, other[i] ); + + return *this; + } + + //some helpers + /** + * Sets the array to the contain the two values specified. + * @param one The first value. + * @param two The second value. + */ + void set2( const T &one, const T &two ) + { + setCount( 2 ); + set( 0, one ); + set( 1, two ); + } + /** + * Sets the array to the contain the three values specified. + * @param one The first value. + * @param two The second value. + * @param three The third value. + */ + void set3( const T &one, const T &two, const T &three ) + { + setCount( 3 ); + set( 0, one ); + set( 1, two ); + set( 2, three ); + } + /** + * Sets the array to the contain the four values specified. + * @param one The first value. + * @param two The second value. + * @param three The third value. + * @param four The fourth value. + */ + void set4( const T &one, const T &two, const T &three, const T &four ) + { + setCount( 4 ); + set( 0, one ); + set( 1, two ); + set( 2, three ); + set( 3, four ); + } + + /** + * Sets the values in the array at the specified location to the contain the two + * values specified. This function will grow the array if needed. + * @param index The position in the array to start setting. + * @param one The first value. + * @param two The second value. + */ + void set2at( size_t index, const T &one, const T &two ) + { + set( index, one ); + set( index+1, two ); + } + /** + * Sets the values in the array at the specified location to the contain the three + * values specified. This function will grow the array if needed. + * @param index The position in the array to start setting. + * @param one The first value. + * @param two The second value. + * @param three The third value. + */ + void set3at( size_t index, const T &one, const T &two, const T &three ) + { + set( index, one ); + set( index+1, two ); + set( index+2, three ); + } + /** + * Sets the values in the array at the specified location to the contain the four + * values specified. This function will grow the array if needed. + * @param index The position in the array to start setting. + * @param one The first value. + * @param two The second value. + * @param three The third value. + * @param four The fourth value. + */ + void set4at( size_t index, const T &one, const T &two, const T &three, const T &four ) + { + set( index, one ); + set( index+1, two ); + set( index+2, three ); + set( index+3, four ); + } + + /** + * Appends two values to the array. + * @param one The first value. + * @param two The second value. + */ + void append2( const T &one, const T &two ) + { + append( one ); + append( two ); + } + /** + * Appends three values to the array. + * @param one The first value. + * @param two The second value. + * @param three The third value. + */ + void append3( const T &one, const T &two, const T &three ) + { + append( one ); + append( two ); + append( three ); + } + /** + * Appends four values to the array. + * @param one The first value. + * @param two The second value. + * @param three The third value. + * @param four The fourth value. + */ + void append4( const T &one, const T &two, const T &three, const T &four ) + { + append( one ); + append( two ); + append( three ); + append( four ); + } + + /** + * Inserts two values into the array at the specified location. + * @param index The position in the array to start inserting. + * @param one The first value. + * @param two The second value. + */ + void insert2at( size_t index, const T &one, const T &two ) + { + if ( index > _count ) + setCount( index +2 ); + else + setCount( _count +2 ); + + for (size_t i = _count; i > index+2; i-- ) + { + T tmp = ((T*)_data)[i-3]; + set( i-1, tmp ); + } + set( index, one ); + set( index+1, two ); + } + /** + * Inserts three values into the array at the specified location. + * @param index The position in the array to start inserting. + * @param one The first value. + * @param two The second value. + * @param three The third value. + */ + void insert3at( size_t index, const T &one, const T &two, const T &three ) + { + if ( index > _count ) + setCount( index +3 ); + else + setCount( _count +3 ); + + for (size_t i = _count; i > index+3; i-- ) + { + T tmp = ((T*)_data)[i-4]; + set( i-1, tmp ); + } + set( index, one ); + set( index+1, two ); + set( index+2, three ); + } + /** + * Inserts four values into the array at the specified location. + * @param index The position in the array to start inserting. + * @param one The first value. + * @param two The second value. + * @param three The third value. + * @param four The fourth value. + */ + void insert4at( size_t index, const T &one, const T &two, const T &three, const T &four ) + { + if ( index > _count ) + setCount( index +4 ); + else + setCount( _count +4 ); + + for (size_t i = _count; i > index+4; i-- ) + { + T tmp = ((T*)_data)[i-5]; + set( i-1, tmp ); + } + set( index, one ); + set( index+1, two ); + set( index+2, three ); + set( index+4, four ); + } + + /** + * Gets two values from the array at the specified location. + * @param index The position in the array to start getting. + * @param one Variable to store the first value. + * @param two Variable to store the second value. + * @return Returns The number of elements retrieved. + */ + daeInt get2at( size_t index, T &one, T &two ) + { + daeInt retVal = 0; + if ( index < _count ) + { + one = get(index); + retVal++; + } + if ( index+1 < _count ) + { + two = get(index+1); + retVal++; + } + return retVal; + } + /** + * Gets three values from the array at the specified location. + * @param index The position in the array to start getting. + * @param one Variable to store the first value. + * @param two Variable to store the second value. + * @param three Variable to store the third value. + * @return Returns The number of elements retrieved. + */ + daeInt get3at( size_t index, T &one, T &two, T &three ) + { + daeInt retVal = 0; + if ( index < _count ) + { + one = get(index); + retVal++; + } + if ( index+1 < _count ) + { + two = get(index+1); + retVal++; + } + if ( index+2 < _count ) + { + two = get(index+2); + retVal++; + } + return retVal; + } + /** + * Gets four values from the array at the specified location. + * @param index The position in the array to start getting. + * @param one Variable to store the first value. + * @param two Variable to store the second value. + * @param three Variable to store the third value. + * @param four Variable to store the fourth value. + * @return Returns The number of elements retrieved. + */ + daeInt get4at( size_t index, T &one, T &two, T &three, T &four ) + { + daeInt retVal = 0; + if ( index < _count ) + { + one = get(index); + retVal++; + } + if ( index+1 < _count ) + { + two = get(index+1); + retVal++; + } + if ( index+2 < _count ) + { + two = get(index+2); + retVal++; + } + if ( index+3 < _count ) + { + two = get(index+3); + retVal++; + } + return retVal; + } + + /** + * Appends a number of elements to this array from a C native array. + * @param num The number of elements to append. + * @param array The C native array that contains the values to append. + */ + void appendArray( size_t num, T *array ) + { + if ( array == NULL ) + return; + + for ( size_t i = 0; i < num; i++ ) + append( array[i] ); + } + /** + * Appends a number of elements to this array from another daeTArray. + * @param array The daeTArray that contains the values to append. + */ + void appendArray( const daeTArray &array ){ + size_t num = array.getCount(); + for ( size_t i = 0; i < num; i++ ) + append( array[i] ); + } +}; + + +#endif //__DAE_ARRAY_H__ + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeArrayTypes.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeArrayTypes.h new file mode 100644 index 00000000..13781e02 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeArrayTypes.h @@ -0,0 +1,30 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#ifndef __DAE_ARRAY_TYPES_H__ +#define __DAE_ARRAY_TYPES_H__ + +#include +#include +typedef daeTArray daeIntArray; +typedef daeTArray daeUIntArray; +typedef daeTArray daeFloatArray; +typedef daeTArray daeEnumArray; +typedef daeTArray daeStringArray; +typedef daeTArray daeCharArray; +typedef daeTArray daeBoolArray; +typedef daeTArray daeDoubleArray; +typedef daeTArray daeLongArray; +typedef daeTArray daeShortArray; + +#endif //__DAE_ARRAY_TYPES_H__ diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeAtomicType.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeAtomicType.h new file mode 100644 index 00000000..c4ad1012 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeAtomicType.h @@ -0,0 +1,736 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#ifndef __DAE_ATOMIC_TYPE_H__ +#define __DAE_ATOMIC_TYPE_H__ + +#include +#include +#include +#include + +#ifndef _WIN32 +#include +#endif + +class daeAtomicType; +class daeMetaElement; + +typedef daeTArray daeAtomicTypeArray; +class daeMetaAttribute; +typedef daeSmartRef daeMetaAttributeRef; + +/** + * The @c daeAtomicType class implements a standard interface for + * data elements in the reflective object system. + * + * @c daeAtomicType provides a central virtual interface that can be + * used by the rest of the reflective object system. + * + * The atomic type system if very useful for file IO and building + * automatic tools for data inspection and manipulation, + * such as hierarchy examiners and object editors. + * + * Types provide the following symantic operations: + * - @c print() + * - @c memoryToString() + * - @c stringToMemory() + * - @c resolve() + * + * Types are also able to align data pointers appropriately. + */ +class daeAtomicType +{ +public: + /** + * destructor + */ + virtual ~daeAtomicType() {} + + /** + * constructor + */ + daeAtomicType(); + +public: + /** + * Prints an atomic typed element into a destination string. + * @param src Source of the raw data from which to get the typed items. + * @param dst Destination to output the string version of the elements to. + * @param dstSize Number of bytes available in the destination memory. + * @return Returns true if the operation was successful, false if not successful. + */ + virtual daeBool memoryToString(daeChar* src, daeChar* dst, daeInt dstSize); + + /** + * Reads an atomic typed item into the destination runtime memory. + * @param src Source string. + * @param dst Raw binary location to store the resulting value. + * @return Returns true if the operation was successful, false if not successful. + */ + virtual daeBool stringToMemory(daeChar* src, daeChar* dst); + + /** + * Resolves a reference, if indeed this type is a reference type. + * @param element The containing element. + * @param src Source of the raw data to resolve. + * should be placed. + */ + virtual void resolve(daeElementRef element, daeChar* src); + + /** + * Determines if this atomic type requires a special string-based + * parse state. + * @return Returns true if this type requires string contents parsing, false if not. + */ + virtual daeBool getUsesStrings() { return false; } + + /** + * Gets the array of strings as name bindings for this type. + * @return Returns the array of strings. + */ + daeStringRefArray& getNameBindings() { return _nameBindings; } + + /** + * Gets the enum associated with this atomic type. This is not scalable and only + * works for base types, otherwise 'extension' is used. + * @return Returns the enum associated with this atomic type. + */ + daeEnum getTypeEnum() { return _typeEnum; } + + /** + * Gets the size in bytes for this atomic type. + * @return Returns the size of the atomic type in bytes. + */ + daeInt getSize() { return _size; } + + /** + * Gets the scanf format used for this type. + * @return Returns the scanf format. + * @note + * Warning - this field is only for convenience and may not always work. + * It is used only when the read functions are left to the base + * implementation. + */ + daeStringRef getScanFormat() { return _scanFormat; } + + /** + * Gets the printf format used for this type. + * @return Returns the printf format. + * @note + * Warning - this field is only for convenience and may not always work. + * It is used only when the print functions are left to the base + * implementation. + */ + daeStringRef getPrintFormat() { return _printFormat; } + + /** + * Gets the alignment in bytes necessary for this type on this + * platform. + * @return Returns the alignment in bytes. + */ + daeInt getAlignment() { return _alignment; } + + /** + * Gets the string associated with this type. + * @return Returns the string associated with this type. + */ + daeStringRef getTypeString() { return _typeString; } + + /** + * Performs an alignment based on the alignment for this type. + * @param ptr Pointer to be aligned. + * @return Returns the aligned pointer computed via + * (ptr+alignment-1)&(~(alignment-1). + * + */ + daeChar* align(daeChar* ptr) { + return (daeChar*)(((intptr_t)(ptr+_alignment-1))&(~(_alignment - 1))); } + +protected: + daeInt _size; + daeInt _alignment; + daeEnum _typeEnum; + daeStringRef _typeString; + daeStringRef _printFormat; + daeStringRef _scanFormat; + //daeStringRefArray _nameBindings; + daeInt _maxStringLength; + +public: + /** + * An array of strings as name bindings for this type. + */ + daeStringRefArray _nameBindings; + +private: // Static Members + static daeAtomicTypeArray* _Types; + static daeBool _TypesInitialized; +public: // Static Interface + /** An enum for identifying the different atomic types */ + enum daeAtomicTypes { + /** bool atomic type */ + BoolType, + /** enum atomic type */ + EnumType, + /** character atomic type */ + CharType, + /** short integer atomic type */ + ShortType, + /** integer atomic type */ + IntType, + /** unsigned integer atomic type */ + UIntType, + /** long integer atomic type */ + LongType, + /** unsigned long integer atomic type */ + ULongType, + /** floating point atomic type */ + FloatType, + /** double precision floating point atomic type */ + DoubleType, + /** string reference atomic type */ + StringRefType, + /** element reference atomic type */ + ElementRefType, + /** memory reference atomic type */ + MemoryRefType, + /** void reference atomic type */ + RawRefType, + /** resolver atomic type */ + ResolverType, + /** ID resolver atomic type */ + IDResolverType, + /** string token atomic type */ + TokenType, + /** extension atomic type */ + ExtensionType + }; + +public: // STATIC INTERFACE + /** + * Appends a new type to the global list of types. + * @param t Type to append. + * @return Returns the index of the type in the list of types. + */ + static daeInt append(daeAtomicType* t); + + /** + * Performs a static initialization of all known atomic types. + */ + static void initializeKnownTypes(); + + /** + * Performs an uninitialization for all known types, freeing associated memory. + */ + static void uninitializeKnownTypes(); + /** + * Performs a static initialization of all known base atomic types. + */ + static void initializeKnownBaseTypes(); + + /** + * Gets a type from the list of types, based on its index. + * @param index Index of the type to retrieve. + * @return Returns the @c daeAtomicType indicated by index. + */ + static const daeAtomicType* getByIndex(daeInt index); + + /** + * Gets the number of known atomic types. + * @return Returns the number of known atomic types. + */ + static daeInt getCount(); + + /** + * Finds a type by its string name. + * @param type String name of the type. + * @return Returns the type with the corresponding name. + */ + static daeAtomicType* get(daeStringRef type); + + /** + * Finds a type by its enum. + * @param type Enum representing the desired type. + * @return Returns the type with the corresponding enum. + */ + static daeAtomicType* get(daeEnum type); +}; + +/** + * The @c daeBoolType class is derived from @c daeAtomicType, and implements + * the reflective system for objects of type @c daeBool. + */ +class daeBoolType : public daeAtomicType +{ +public: + /** + * Constructor + */ + daeBoolType(); +public: + /** + * Overrides the base class memory to string conversion function. + * @param src Raw data from which to get the typed items. + * @param dst Destination to output the string version of the elements to. + * @param dstSize Number of bytes available in the destination memory. + * @return Returns true if the operation was successful, + * false if the operation would cause the destination buffer to overflow. + */ + virtual daeBool memoryToString(daeChar* src, daeChar* dst, daeInt dstSize); + + /** + * Overrides the base class @c stringToMemoryFunction(). + * Reads an atomic typed item into the destination runtime memory. + * @param src Source string. + * @param dst Raw binary to store the resulting value. + * @return Returns true if the operation was successful, false if not successful. + */ + virtual daeBool stringToMemory(daeChar* src, daeChar* dst); + +}; + +/** + * The @c daeIntType class is derived from @c daeAtomicType, and implements + * the reflective system for objects of type @c daeInt. + */ +class daeIntType : public daeAtomicType +{ +public: + /** + * Constructor + */ + daeIntType(); +public: + /** + * Overrides the base class memory to string conversion function. + * @param src Raw data from which to get the typed items. + * @param dst Destination to output the string version of the elements to. + * @param dstSize Number of bytes available in the destination memory. + * @return Returns true if the operation was successful, + * false if the operation would cause the destination buffer to overflow. + */ + virtual daeBool memoryToString(daeChar* src, daeChar* dst, daeInt dstSize); +}; + +/** + * The @c daeLongType class is derived from @c daeAtomicType, and implements + * the reflective system for objects of type @c daeLong. + */ +class daeLongType : public daeAtomicType +{ +public: + /** + * Constructor + */ + daeLongType(); +public: + /** + * Overrides the base class memory to string conversion function. + * @param src Raw data from which to get the typed items. + * @param dst Destination to output the string version of the elements to. + * @param dstSize Number of bytes available in the destination memory. + * @return Returns true if the operation was successful, + * false if the operation would cause the destination buffer to overflow. + */ + virtual daeBool memoryToString(daeChar* src, daeChar* dst, daeInt dstSize); +}; + +/** + * The @c daeUIntType class is derived from @c daeAtomicType, and implements + * the reflective system for objects of type @c daeUInt. + */ +class daeUIntType : public daeAtomicType +{ +public: + /** + * Constructor + */ + daeUIntType(); +public: + /** + * Overrides the base class memory to string conversion function. + * @param src Raw data from which to get the typed items. + * @param dst Destination to output the string version of the elements to. + * @param dstSize Number of bytes available in the destination memory. + * @return Returns true if the operation was successful, + * false if the operation would cause the destination buffer to overflow. + */ + virtual daeBool memoryToString(daeChar* src, daeChar* dst, daeInt dstSize); +}; + +/** + * The @c daeUIntType class is derived from @c daeAtomicType, and implements + * the reflective system for objects of type @c daeUInt. + */ +class daeULongType : public daeAtomicType +{ +public: + /** + * Constructor + */ + daeULongType(); +public: + /** + * Overrides the base class memory to string conversion function. + * @param src Raw data from which to get the typed items. + * @param dst Destination to output the string version of the elements to. + * @param dstSize Number of bytes available in the destination memory. + * @return Returns true if the operation was successful, + * false if the operation would cause the destination buffer to overflow. + */ + virtual daeBool memoryToString(daeChar* src, daeChar* dst, daeInt dstSize); +}; + +/** + * The @c daeShortType is derived from @c daeAtomicType, and implements + * the reflective system for objects of type @c daeShort. + */ +class daeShortType : public daeAtomicType +{ +public: + /** + * Constructor + */ + daeShortType(); +public: + /** + * Overrides the base class memory to string conversion function. + * @param src Raw data from which to get the typed items. + * @param dst Destination to output the string version of the elements to. + * @param dstSize Number of bytes available in the destination memory. + * @return Returns true if the operation was successful, + * false if the operation would cause the destination buffer to overflow. + */ + virtual daeBool memoryToString(daeChar* src, daeChar* dst, daeInt dstSize); +}; + +/** + * The @c daeFloatType is derived from @c daeAtomicType, and implements + * the reflective system for objects of type @c daeFloat. + */ +class daeFloatType : public daeAtomicType +{ +public: + /** + * Constructor + */ + daeFloatType(); +public: + /** + * Overrides the base class memory to string conversion function. + * @param src Raw data from which to get the typed items. + * @param dst Destination to output the string version of the elements to. + * @param dstSize Number of bytes available in the destination memory. + * @return Returns true if the operation was successful, + * false if the operation would cause the destination buffer to overflow. + */ + virtual daeBool memoryToString(daeChar* src, daeChar* dst, daeInt dstSize); + /** + * Overrides the base class @c stringToMemoryFunction(). + * Reads an atomic typed item into the destination runtime memory. + * @param src Source string. + * @param dst Raw binary to store the resulting value. + * @return Returns true if the operation was successful, false if not successful. + */ + virtual daeBool stringToMemory(daeChar* src, daeChar* dst); +}; + +/** + * The @c daeDoubleType is derived from @c daeAtomicType, and implements + * the reflective system for objects of type @c daeDouble. + */ +class daeDoubleType : public daeAtomicType +{ +public: + /** + * Constructor + */ + daeDoubleType(); +public: + /** + * Overrides the base class memory to string conversion function. + * @param src Raw data from which to get the typed items. + * @param dst Destination to output the string version of the elements to. + * @param dstSize Number of bytes available in the destination memory. + * @return Returns true if the operation was successful, + * false if the operation would cause the destination buffer to overflow. + */ + virtual daeBool memoryToString(daeChar* src, daeChar* dst, daeInt dstSize); + /** + * Overrides the base class @c stringToMemoryFunction(). + * Reads an atomic typed item into the destination runtime memory. + * @param src Source string. + * @param dst Raw binary to store the resulting value. + * @return Returns true if the operation was successful, false if not successful. + */ + virtual daeBool stringToMemory(daeChar* src, daeChar* dst); +}; + +/** + * The @c daeStringRefType class is derived from @c daeAtomicType, and implements + * the reflective system for objects of type @c daeStringRef. + */ +class daeStringRefType : public daeAtomicType +{ +public: + /** + * Constructor + */ + daeStringRefType(); +public: + /** + * Override base class function. + * Determines if this atomic type requires a special string-based + * parse state. + * @return Returns true if this type requires string contents parsing, false if not. + */ + virtual daeBool getUsesStrings(); + /** + * Overrides the base class memory to string conversion function. + * @param src Raw data from which to get the typed items. + * @param dst Destination to output the string version of the elements to. + * @param dstSize Number of bytes available in the destination memory. + * @return Returns true if the operation was successful, + * false if the operation would cause the destination buffer to overflow. + */ + virtual daeBool memoryToString(daeChar* src, daeChar* dst, daeInt dstSize); + /** + * Overrides the base class @c stringToMemoryFunction(). + * Reads an atomic typed item into the destination runtime memory. + * @param src Source string. + * @param dst Raw binary to store the resulting value. + * @return Returns true if the operation was successful, false if not successful. + */ + virtual daeBool stringToMemory(daeChar* src, daeChar* dst); + +}; + +/** + * The @c daeTokenType class is derived from @c daeStringRefType, and implements + * the reflective system for objects of type daeStringRef, with specialized + * treatment from the parser. + */ +class daeTokenType : public daeStringRefType +{ +public: + /** + * Constructor + */ + daeTokenType(); + +public: + /** + * Override base class function. + * Determines if this atomic type requires a special string-based + * parse state. + * @return Returns true if this type requires string contents parsing, false if not. + */ + virtual daeBool getUsesStrings(); + +}; + +/** + * The @c daeElementRefType class is derived from @c daeAtomicType, and implements + * the reflective system for objects of type @c daeElementRef. + */ +class daeElementRefType : public daeAtomicType +{ +public: + /** + * The @c daeMetaElement for the type this @c daeElementRefType represents. + */ + daeMetaElement* _elementType; + +public: + /** + * Constructor + */ + daeElementRefType(); +public: + /** + * Overrides the base class memory to string conversion function. + * @param src Raw data from which to get the typed items. + * @param dst Destination to output the string version of the elements to. + * @param dstSize Number of bytes available in the destination memory. + * @return Returns true if the operation was successful, + * false if the operation would cause the destination buffer to overflow. + */ + virtual daeBool memoryToString(daeChar* src, daeChar* dst, daeInt dstSize); +}; + +/** + * The @c daeEnumType class is derived from @c daeAtomicType, and implements + * the reflective system for objects of type daeEnum. + */ +class daeEnumType: public daeAtomicType +{ +public: + /** + * The array which contains the values used in this enum. + */ + daeEnumArray* _values; + /** + * The array which contains the strings to associate with the values used in this enum. + */ + daeStringRefArray* _strings; + +public: + /** + * Constructor + */ + daeEnumType(); + + /** + * Destructor + */ + ~daeEnumType(); + +public: + /** + * Overrides the base class memory to string conversion function. + * @param src Raw data from which to get the typed items. + * @param dst Destination to output the string version of the elements to. + * @param dstSize Number of bytes available in the destination memory. + * @return Returns true if the operation was successful, + * false if the operation would cause the destination buffer to overflow. + */ + virtual daeBool memoryToString(daeChar* src, daeChar* dst, daeInt dstSize); + /** + * Overrides the base class @c stringToMemoryFunction(). + * Reads an atomic typed item into the destination runtime memory. + * @param src Source string. + * @param dst Raw binary to store the resulting value. + * @return Returns true if the operation was successful, false if not successful. + */ + virtual daeBool stringToMemory(daeChar* src, daeChar* dst); + +}; + +/** + * The @c daeRawRefType class is derived from @c daeAtomicType, and implements + * the reflective system for objects of type @c daeRawRef. + */ +class daeRawRefType: public daeAtomicType +{ +public: + /** + * Constructor. + */ + daeRawRefType(); + +public: + /** + * Overrides the base class memory to string conversion function. + * @param src Raw data from which to get the typed items. + * @param dst Destination to output the string version of the elements to. + * @param dstSize Number of bytes available in the destination memory. + * @return Returns true if the operation was successful, + * false if the operation would cause the destination buffer to overflow. + */ + virtual daeBool memoryToString(daeChar* src, daeChar* dst, daeInt dstSize); +}; + +/** + * The @c daeResolverType class is derived from @c daeAtomicType, and implements + * the reflective system for objects of type @c daeResolver. + */ +class daeResolverType : public daeAtomicType +{ +public: + /** + * Constructor. + */ + daeResolverType(); +public: + /** + * Overrides the base class memory to string conversion function. + * @param src Raw data from which to get the typed items. + * @param dst Destination to output the string version of the elements to. + * @param dstSize Number of bytes available in the destination memory. + * @return Returns true if the operation was successful, + * false if the operation would cause the destination buffer to overflow. + */ + virtual daeBool memoryToString(daeChar* src, daeChar* dst, daeInt dstSize); + /** + * Overrides the base class @c stringToMemoryFunction(). + * Reads an atomic typed item into the destination runtime memory. + * @param src Source string. + * @param dst Raw binary to store the resulting value. + * @return Returns true if the operation was successful, false if not successful. + */ + virtual daeBool stringToMemory(daeChar* src, daeChar* dst); + + /** + * Overrides the base class @c resolve() function + * Resolves a reference, if indeed this type is a reference type + * @param element The containing element. + * @param src Source of the raw data to resolve. + * should be placed. + */ + virtual void resolve(daeElementRef element, daeChar* src); + /** + * Override base class function. + * Determines if this atomic type requires a special string-based + * parse state. + * @return Returns true if this type requires string contents parsing, false if not. + */ + virtual daeBool getUsesStrings() { return true; } +}; + +/** + * The @c daeIDResolverType class is derived from @c daeAtomicType, and implements + * the reflective system for objects of type @c daeIDResolver. + */ +class daeIDResolverType : public daeAtomicType +{ +public: + /** + * Constructor. + */ + daeIDResolverType(); +public: + /** + * Overrides the base class memory to string conversion function. + * @param src Raw data from which to get the typed items. + * @param dst Destination to output the string version of the elements to. + * @param dstSize Number of bytes available in the destination memory. + * @return Returns true if the operation was successful, + * false if the operation would cause the destination buffer to overflow. + */ + virtual daeBool memoryToString(daeChar* src, daeChar* dst, daeInt dstSize); + /** + * Overrides the base class @c stringToMemoryFunction(). + * Reads an atomic typed item into the destination runtime memory. + * @param src Source string. + * @param dst Raw binary to store the resulting value. + * @return Returns true if the operation was successful, false if not successful. + */ + virtual daeBool stringToMemory(daeChar* src, daeChar* dst); + + /** + * Overrides the base class @c resolve() function + * Resolves a reference, if indeed this type is a reference type. + * @param element The containing element. + * @param src Source of the raw data to resolve. + * should be placed. + */ + virtual void resolve(daeElementRef element, daeChar* src); +}; + + + +#endif // __DAE_ATOMIC_TYPE_H__ + + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeDatabase.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeDatabase.h new file mode 100644 index 00000000..67d11738 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeDatabase.h @@ -0,0 +1,265 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#ifndef __DAE_DATABASE__ +#define __DAE_DATABASE__ + +#include +#include +#include +#include + + +/** + * The @c daeDatabase class defines the COLLADA runtime database interface. + */ +class daeDatabase +{ +public: + /** + * Destructor. + */ + virtual DLLSPEC ~daeDatabase() {} + + /** @name Documents */ + //@{ + /** + * Creates a new document, defining its root as the dom object; returns an error if the document name already exists. + * @param name Name of the new document, must be a valid URI. + * @param dom Existing @c domCOLLADA root element of the document + * @param document Pointer to a @c daeDocument pointer that receives the document created + * @return Returns @c DAE_OK if the document was created successfully, otherwise returns a negative value as defined in daeError.h. + * @note The @c daeElement passed in as dom should always be a @c domCOLLADA object, the API may enforce this in the future. + * @deprecated This function will be removed in future versions. Please use createDocument. + */ + virtual DLLSPEC daeInt insertDocument(daeString name, daeElement* dom, daeDocument** document = NULL) = 0; + /** + * Creates a new @c domCOLLADA root element and a new document; returns an error if the document name already exists. + * @param name Name of the new document, must be a valid URI. + * @param document Pointer to a @c daeDocument pointer that receives the document created + * @return Returns DAE_OK if the document was created successfully, otherwise returns a negative value as defined in daeError.h. + * @deprecated This function will be removed in future versions. Please use createDocument. + */ + virtual DLLSPEC daeInt insertDocument(daeString name, daeDocument** document = NULL) = 0; + /** + * Creates a new document, defining its root as the dom object; returns an error if the document name already exists. + * @param name Name of the new document, must be a valid URI. + * @param dom Existing @c domCOLLADA root element of the document + * @param document Pointer to a @c daeDocument pointer that receives the document created + * @return Returns @c DAE_OK if the document was created successfully, otherwise returns a negative value as defined in daeError.h. + * @note The @c daeElement passed in as dom should always be a @c domCOLLADA object, the API may enforce this in the future. + */ + virtual DLLSPEC daeInt createDocument(daeString name, daeElement* dom, daeDocument** document = NULL) = 0; + /** + * Creates a new @c domCOLLADA root element and a new document; returns an error if the document name already exists. + * @param name Name of the new document, must be a valid URI. + * @param document Pointer to a @c daeDocument pointer that receives the document created + * @return Returns DAE_OK if the document was created successfully, otherwise returns a negative value as defined in daeError.h. + */ + virtual DLLSPEC daeInt createDocument(daeString name, daeDocument** document = NULL) = 0; + + /** + * Inserts an already existing document into the database. + * @param c The document to insert. + * @return Returns DAE_OK if the document was inserted successfully, otherwise returns a negative value as defined in daeError.h. + */ + virtual DLLSPEC daeInt insertDocument( daeDocument *c ) = 0; + + /** + * Removes a document from the database. + * @param document Document to remove from the database + * @return Returns DAE_OK if the document was successfully removed, otherwise returns a negative value as defined in daeError.h. + */ + virtual DLLSPEC daeInt removeDocument(daeDocument* document) = 0; + /** + * Gets the number of documents. + * @return Returns the number of documents. + */ + virtual DLLSPEC daeUInt getDocumentCount() = 0; + /** + * Gets a document based on the document index. + * @param index Index of the document to get. + * @return Returns a pointer on the document, or NULL if not found. + */ + virtual DLLSPEC daeDocument* getDocument(daeUInt index) = 0; + /** + * Gets a document based on the document name. + * @param name The name of the document as a URI. + * @return Returns a pointer to the document, or NULL if not found. + * @note If the URI contains a fragment, the fragment is stripped off. + */ + virtual DLLSPEC daeDocument* getDocument(daeString name) = 0; + /** + * Gets a document name. + * @param index Index of the document to get. + * @return Returns the name of the document at the given index. + */ + virtual DLLSPEC daeString getDocumentName(daeUInt index) = 0; + /** + * Indicates if a document is loaded or not. + * @param name Name of the document as a URI. + * @return Returns true if the document is loaded, false otherwise. + * @note If the URI contains a fragment, the fragment is stripped off. + */ + virtual DLLSPEC daeBool isDocumentLoaded(daeString name) = 0; + //@} + + /** @name Elements */ + //@{ + /** + * Gets the number of types in the database. + * @return Returns the number of different types of objects inserted in the database. + */ + virtual DLLSPEC daeUInt getTypeCount() = 0; + /** + * Retrieves the name of a type of object inserted in the database. + * @param index Index of the type; must be between 0 and daeDatabase::getTypeCount()-1 + * @return Returns the name of the type, NULL if the index is invalid. + */ + virtual DLLSPEC daeString getTypeName(daeUInt index) = 0; + /** + * Inserts a @c daeElement into the runtime database. + * @param document Document in which the @c daeElement lives. + * @param element @c daeElement to insert in the database + * @return Returns @c DAE_OK if element successfully inserted, otherwise returns a negative value as defined in daeError.h. + */ + virtual DLLSPEC daeInt insertElement(daeDocument* document, + daeElement* element) = 0; + /** + * Removes a @c daeElement from the runtime database; not implemented in the reference STL implementation. + * @param document Document in which the @c daeElement lives. + * @param element Element to remove. + * @return Returns @c DAE_OK if element successfully removed, otherwise returns a negative value as defined in daeError.h. + * @note This function is not implemented in the reference STL implementation. + */ + virtual DLLSPEC daeInt removeElement(daeDocument* document, + daeElement* element) = 0; + /** + * Unloads all of the documents of the runtime database. + * This function frees all the @c dom* objects and integration objects created so far, + * except any objects on which you still have a smart pointer reference (@c daeSmartRef). + * @return Returns @c DAE_OK if all documents successfully unloaded, otherwise returns a negative value as defined in daeError.h. + */ + virtual DLLSPEC daeInt clear() = 0; + /** + * Optimizes the database. + * This function takes time; it is called by the interface at the end of a load operation. + * Some databases cannot be queried when items are being inserted; for instance, they may + * need to be sorted. All database search functions call @c validate(); you should not need to + * call this function directly. + */ + virtual DLLSPEC void validate() = 0; + //@} + + /** @name Queries */ + //@{ + /** + * Gets the number of daeElement objects that match the search criteria + * Any combination of search criteria can be NULL, if a criterion is NULL all + * the parameters will match for this criterion. + * Hence @c getElementCount() called without parameters returns the total number of @c daeElement objects in the database. + * Criteria can not be specified with wildcards, either a criterion is set and it will have + * to match, or it is not set and all @c daeElements match for this criterion. + * @param name Name or id of the @c daeElement, for example, "mycube1", can be NULL + * @param type Type of @c daeElement to find, this can be any COLLADA tag such as or , can be NULL + * @param file Name of the document or file, for example, "myDocument.xml", can be NULL + * @return Returns the number of elements matching this query. + */ + virtual DLLSPEC daeUInt getElementCount(daeString name = NULL, + daeString type = NULL, + daeString file = NULL) = 0; + /** + * Returns the @c daeElement which matches the search criteria. + * Any combination of search criteria can be NULL, if a criterion is NULL all + * the parameters will match for this criterion. + * The function operates on the set of assets that match the name, type and file search criteria, + * with the index parameter indicating which asset within the set is returned. + * Calling @c daeElement(&pElement,index) without search criteria returns the @c daeElement number index in the database without + * any consideration of name, type or document. + * Criteria can not be specified with wildcards, either a criterion is set and it will have + * to match, or it is not set and all @c daeElements match for this criterion. + * The default database search is roughly in log2(n). Maximum performance is obtained when querying + * by type and a name. Any other combination results in a slight overhead, but the overall search time + * remains around log2(n). + * @param pElement Pointer of a @c daeElement* which receives the found @c daeElement if the search succeeds + * @param index Index within the set of @c daeElements that match the search criteria + * @param name Name or id of the @c daeElement, for example "mycube1", can be NULL + * @param type Type of the @c daeElement to get, this can be any COLLADA tag such as or , can be NULL + * @param file Name of the document or file, for example, "myDocument.xml", can be NULL + * @return Returns DAE_OK upon success, returns DAE_ERR_QUERY_NO_MATCH if there is no match, otherwise, returns a negative value as defined in daeError.h. + */ + virtual DLLSPEC daeInt getElement(daeElement** pElement, + daeInt index, + daeString name = NULL, + daeString type = NULL, + daeString file = NULL ) = 0; + /** + * Returns the @c daeElement which matches the genericQuery parameter; not implemented. + * @param pElement Element to return. + * @param genericQuery Generic query + * @return Returns DAE_OK if it succeeds, returns DAE_ERR_QUERY_NO_MATCH if there is no match, otherwise returns a negative value as defined in daeError.h. + * @note This function is not implemented. + */ + virtual DLLSPEC daeInt queryElement(daeElement** pElement, daeString genericQuery) = 0; + //@} + + /** + * Sets the top meta object. + * Called by @c dae::setDatabase() when the database changes. It passes to this function the + * top meta object, which is the root of a + * hierarchy of @c daeMetaElement objects. This top meta object is capable of creating + * any of the root objects in the DOM tree. + * @param _topMeta Top meta object to use to create objects to fill the database. + * @return Returns DAE_OK if successful, otherwise returns a negative value defined in daeError.h. + */ + virtual DLLSPEC daeInt setMeta(daeMetaElement *_topMeta) = 0; + +public: //Depricated methods + inline DLLSPEC daeInt insertCollection(daeString name, daeElement* dom, daeDocument** document = NULL) { + return insertDocument( name, dom, document ); + } + inline DLLSPEC daeInt insertCollection(daeString name, daeDocument** document = NULL) { + return insertDocument( name, document ); + } + inline DLLSPEC daeInt createCollection(daeString name, daeElement* dom, daeDocument** document = NULL) { + return createDocument( name, dom, document ); + } + inline DLLSPEC daeInt createCollection(daeString name, daeDocument** document = NULL) { + return createDocument( name, document ); + } + inline DLLSPEC daeInt insertCollection( daeDocument *c ) { + return insertDocument( c ); + } + inline DLLSPEC daeInt removeCollection(daeDocument* document) { + return removeDocument( document ); + } + inline DLLSPEC daeUInt getCollectionCount() { + return getDocumentCount(); + } + inline DLLSPEC daeDocument* getCollection(daeUInt index) { + return getDocument( index ); + } + inline DLLSPEC daeDocument* getCollection(daeString name) { + return getDocument( name ); + } + inline DLLSPEC daeString getCollectionName(daeUInt index) { + return getDocumentName( index ); + } + inline DLLSPEC daeBool isCollectionLoaded(daeString name) { + return isDocumentLoaded( name ); + } + +}; + +#endif //__DAE_DATABASE__ + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeDocument.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeDocument.h new file mode 100644 index 00000000..e7df3641 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeDocument.h @@ -0,0 +1,157 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#ifndef __DAE_DOCUMENT__ +#define __DAE_DOCUMENT__ + +#include +#include +#include +#include + +/** + * The @c daeDocument class implements a COLLADA runtime database entry. + */ +class daeDocument +{ +public: + // sthomas + /** + * Destructor + */ + DLLSPEC ~daeDocument(); + + /** + * Accessor to get the @c domCollada associated with this document. + * @return A @c daeElementRef for the @c domCollada that is the root of this document. + * @note This function should really return a domColladaRef, + * but we're trying to avoid having @c dae classes depend on generated dom classes. + */ + daeElement* getDomRoot() const {return(dom);} + /** + * Accessor to set the domCollada associated with this document + * @param domRoot the domCollada that is the root of this document + * @remarks Should really require a domColladaRef but we're trying to avoid having dae classes depend on generated dom classes. + */ + void setDomRoot(daeElement* domRoot) {dom = domRoot; domRoot->setDocument(this); } + /** + * Accessor to get the URI associated with the document in this document; + * this is currently set to the URI from which the document was loaded, but + * is blank if the document was created with @c insertDocument(). + * @return Returns a pointer to the URI for this document. + * @note This is the full URI of the document and not the document base URI. + */ + daeURI* getDocumentURI() {return (&uri);} + + /** + * Const accessor to get the URI associated with the document in this collection; + * this is currently set to the URI from which the collection was loaded, but + * is blank if the collection was created with @c insertCollection(). + * @return Returns a pointer to the URI for this collection. + * @note This is the full URI of the document and not the document base URI. + */ + const daeURI* getDocumentURI() const {return (&uri);} + + /** + * Accessor to get if this document has been modified since the last time the database was validated. + * @return Returns true if the document was modified, false otherwise. + */ + daeBool getModified() const {return modified;} + /** + * Sets if this document has been modified since the last time the database was validated. + * @param A boolean value specifying if the document was modified. + */ + void setModified( daeBool mod ) { if (!mod) { insertedElements.clear(); removedElements.clear(); } modified = mod;} + + /** + * This function is used to track how a document gets modified. It gets called internally. + * @param element The element that was added to this document. + * @note This function is called internally and not meant to be called by the client application. + * Calling this function from the client application may result in unexpected behavior. + */ + DLLSPEC void insertElement( daeElementRef element ); + /** + * This function is used to track how a document gets modified. It gets called internally. + * @param element The element that was removed from this document. + * @note This function is called internally and not meant to be called by the client application. + * Calling this function from the client application may result in unexpected behavior. + */ + DLLSPEC void removeElement( daeElementRef element ); + + /** + * This function is used to track how a document gets modified. It gets called internally. + * @return Returns an array of elements that have been added since the last database update. + */ + const daeElementRefArray &getInsertedArray() const { return insertedElements; } + /** + * This function is used to track how a document gets modified. It gets called internally. + * @return Returns an array of elements that have been removed since the last database update. + */ + const daeElementRefArray &getRemovedArray() const { return removedElements; } + /** + * Adds a URI to the list of external references in this document. + * @param uri The URI that is the external reference. + * @note This function gets called internally from daeURI upon trying to resolve an element. + * Calling this function in your client code my result in unexpected behavior. + */ + DLLSPEC void addExternalReference( daeURI &uri ); + /** + * Removes a URI to the list of external references in this document. + * @param uri The URI that was the external reference. + * @note This function gets called internally from daeURI upon trying to resolve an element. + * Calling this function in your client code my result in unexpected behavior. + */ + DLLSPEC void removeExternalReference( daeURI &uri ); + /** + * Gets a list of all the documents that are referenced from URI contained within this document. + * @return Returns a list of URI strings, each being a URI which is referenced from within this document. + */ + const daeStringRefArray &getReferencedDocuments() const { return referencedDocuments; } + /** + * Resolves the URIs that reference the document specified by docURI. + * @param docURI The URI string of the document that you want to resolve against. + * @note This function is called internally whenever a new document is loaded. + */ + DLLSPEC void resolveExternals( daeString docURI); + + DLLSPEC const daeTArray *getExternalURIs(daeStringRef docURI) const; + +private: + /** + * Top Level element for of the document, always a domCollada + * @remarks This member will eventually be taken private, use getDomRoot() to access it. + */ + daeElementRef dom; + + /** + * The URI of the document, may be blank if the document wasn't loaded from a URI + * @remarks This member will eventually be taken private, use getDocumentURI() to access it. + */ + daeURI uri; + + /** + * A flag that indicates if this document has been modified. + */ + daeBool modified; + + daeElementRefArray insertedElements; + daeElementRefArray removedElements; + + daeStringRefArray referencedDocuments; + daeTArray< daeTArray* > externalURIs; +}; + +typedef daeDocument daeCollection; + +#endif + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeDom.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeDom.h new file mode 100644 index 00000000..5d46b235 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeDom.h @@ -0,0 +1,32 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#ifndef __DAE_DOM__ +#define __DAE_DOM__ + +class daeMetaElement; + +#ifdef WIN32 + #pragma warning(disable : 4324) // disable padding warning + #pragma warning(disable:4530) // Disable the exception disable but used in MSCV Stl warning. + #pragma warning(disable:4996) //Turn off warnings about deprecated C routines + #pragma warning(disable:4786) // Disable the "debug name too long" warning + #pragma warning(disable:4244) // Disable the "possible loss of data" warning + #pragma warning(disable:4018) // signed/unsigned int mismatch + #pragma warning(disable:4267) // possible loss of data + #pragma warning(disable:4530) // C++ exception handler used +#endif + +daeMetaElement* initializeDomMeta(); + +#endif //__DAE_DOM__ diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeDomTypes.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeDomTypes.h new file mode 100644 index 00000000..17363ce6 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeDomTypes.h @@ -0,0 +1,68 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#ifndef __DAE_DOM_TYPES__ +#define __DAE_DOM_TYPES__ + +#include +#include +#include +#include +#include + +//This line is used as a workaround because the array types enum is invalid when autogenerated +//typedef daeString domArrayTypes; // ENUM +typedef daeElement domElement; + +typedef daeURI xsAnyURI; +typedef daeString xsDateTime; + +typedef daeString xsID; +typedef daeIDRef xsIDREF; +typedef daeTArray xsIDREFS; +typedef daeString xsNCName; +typedef daeString xsNMTOKEN; +typedef daeString xsName; +typedef daeString xsToken; +typedef daeString xsString; +typedef daeBool xsBoolean; +typedef daeShort xsShort; +typedef daeInt xsInt; +typedef daeLong xsInteger; +typedef daeUInt xsNonNegativeInteger; +typedef daeLong xsLong; +typedef daeFloat xsFloat; +typedef daeDouble xsDouble; +typedef daeDouble xsDecimal; +typedef daeCharArray xsHexBinaryArray; +typedef daeBoolArray xsBooleanArray; +typedef daeFloatArray xsFloatArray; +typedef daeDoubleArray xsDoubleArray; +typedef daeShortArray xsShortArray; +typedef daeIntArray xsIntegerArray; +typedef daeLongArray xsLongArray; +typedef daeStringRefArray xsNameArray; +typedef daeStringRefArray xsNCNameArray; +typedef daeStringRefArray xsTokenArray; + +typedef daeChar xsByte; +typedef daeUChar xsUnsignedByte; +typedef daeUInt xsUnsignedInt; +typedef daeUInt xsPositiveInteger; +typedef daeULong xsUnsignedLong; + + +#define daeTSmartRef daeSmartRef + +#endif //__DAE_DOM_TYPES__ + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeElement.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeElement.h new file mode 100644 index 00000000..dcbee1c8 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeElement.h @@ -0,0 +1,476 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#ifndef __DAE_ELEMENT_H__ +#define __DAE_ELEMENT_H__ +#include +#include +#include +#include + +//#ifndef NO_MALLOC_HEADER +//#include +//#endif + +namespace COLLADA_TYPE +{ +#ifdef _MSC_VER + enum TypeEnum; +#else + typedef const int TypeEnum; +#endif +} + +class daeMetaElement; +class daeIntegrationObject; +class daeDocument; +class daeURI; + +template class daeSmartRef; + +//Contributed by Nus - Wed, 08 Nov 2006 +/** + * Initializing resolve array. + */ +extern "C" void initializeResolveArray(void); + +/** + * Terminating resolve array. + */ +extern "C" void terminateResolveArray(void); +//------------------- + +/** + * The @c daeElement class represents an instance of a COLLADA "Element"; + * it is the main base class for the COLLADA Dom. + * Features of this class include: + * - Uses factory concepts defined via daeMetaElement + * - Composed of attributes, content elements and content values + * - Reference counted via daeSmartRef + * - Contains information for XML base URI, and XML containing element + */ +class daeElement +{ +public: + /** + * Macro that defines new and delete overrides for this class + */ + DAE_ALLOC; +private: + mutable daeInt _refCount; + daeIntegrationObject* _intObject; + daeElement* _parent; + daeDocument* _document; + +protected: + daeMetaElement* _meta; + daeString _elementName; + daeBoolArray _validAttributeArray; + +public: + /** An enum that describes the state of user integration with this object */ + DLLSPEC enum IntegrationState { + /** The user integration is not initialized */ + int_uninitialized, + /** The user integration object has been created */ + int_created, + /** The user integration object has been converted */ + int_converted, + /** The user integration object is completed */ + int_finished + }; +protected: + daeElement( const daeElement &cpy ) { (void)cpy; }; + virtual daeElement &operator=( const daeElement &cpy ) { (void)cpy; return *this; } + +public: + /** + * Element Constructor. + * @note This should not be used externally. + * Use factories to create elements + */ + DLLSPEC daeElement(); + /** + * Element Destructor. + * @note This should not be used externally, + * if daeSmartRefs are being used. + */ + virtual DLLSPEC ~daeElement(); + + // sthomas (see https://collada.org/public_forum/viewtopic.php?t=325&) + static void releaseElements(); + /** + * Decrements the reference count and deletes the object if reference count is zero. + * @note Should not be used externally if daeSmartRefs are being used, they call it + * automatically. + */ + DLLSPEC void release() const; + + /** + * Increments the reference count of this element. + * @note Should not be used externally if daeSmartRefs are being used, they call it + * automatically. + */ + inline void ref() const {_refCount++;} + + /** + * Resolves all fields of type daeURI and IDRef. + * This is done via database query of the URI or IDRef. + */ + DLLSPEC void resolve(); + + /** + * Sets up a @c daeElement. Called on all @c daeElements as part of their initialization. + * @param meta Meta element to use to configure this element. + * @note Should not be called externally. + */ + DLLSPEC void setup(daeMetaElement* meta); + + /** + * Places an element as a child of @c this element. + * This function searches through the list of potential child element + * fields in @c this element, checking for a matching element type where the new element can be added. + * If a match of type is found, the element* is assigned or appended to + * that field, based on whether it is a single child or an array of + * children. This automatically adds the new element to the _contents of its parent, if the parent has one. + * + * @param element Element to be placed in the @c this container. + * @return Returns true if the element was successfully placed, false otherwise. + */ + DLLSPEC daeBool placeElement(daeElement* element); + + /** + * This function searches through the list of potential child elements + * (fields) checking for a matching element type where this element can be added. + * If a match of type is found, the element* is assigned or appended to + * that field (based on whether it is a single child or an array of + * children. + * If the parent element contains a _contents array, element will be placed at the specified index, + * otherwise element gets placed among elements of the same type. + * + * @param index is the place in the _contents array to insert element. + * @param element is the element to be placed in the 'this' container. + * @return return whether or not the element was successfully placed. + */ + DLLSPEC daeBool placeElementAt(daeInt index, daeElement* element); + + /** + * Places an element as a child of @c this element. + * This function inserts the new element before the element specified as marker. + * This automatically adds the new element to the _contents of its parent, if the parent has one. + * @param marker The daeElement used to determine where the new child will be placed. + * @param element Element to be placed in the @c this container. + * @return Returns true if the element was successfully placed, false otherwise. + */ + DLLSPEC daeBool placeElementBefore( daeElement* marker, daeElement *element ); + + /** + * Places an element as a child of @c this element. + * This function inserts the new element After the element specified as marker. + * This automatically adds the new element to the _contents of its parent, if the parent has one. + * @param marker The daeElement used to determine where the new child will be placed. + * @param element Element to be placed in the @c this container. + * @return Returns true if the element was successfully placed, false otherwise. + */ + DLLSPEC daeBool placeElementAfter( daeElement* marker, daeElement *element ); + + /** + * Finds the last index into the array of children of the type specified. + * @param elementName The name to look for. + * @return Returns the index into the children array of the last element of type typeName. -1 if + * there are no children of type typeName. + */ + DLLSPEC daeInt findLastIndexOf( daeString elementName ); + + /** + * Removes the specified element from it parent, the @c this element. + * This function is the opposite of @c placeElement(). It removes the specified + * element from the _contents array, and from wherever else it appears + * inside of the @c this element. Use this function instead of @c clear(), @c remove() or @c delete() + * if you want to keep the _contents field up-to-date. + * + * @param element Element to be removed in the @c this container. + * @return Returns true if the element was successfully removed, false otherwise. + */ + DLLSPEC daeBool removeChildElement(daeElement* element); + + /** + * Removes the specified element from its parent element. + * This function is the opposite of @c placeElement(). It removes the specified + * element from both the _contents array and from wherever else it appears + * inside of its parent. The function itself finds the parent, and is defined as a static method, + * since removing the element from its parent may result in the deletion of the element. + * If the element has no parent, nothing is done. + * + * Use this function instead of @c clear(), @c remove() or @c delete() + * if you want to keep _contents up-to-date. + * + * @param element Element to remove from its parent container, the function finds the parent element. + * @return Returns true if the element was successfully removed, false otherwise. + */ + static daeBool removeFromParent(daeElement* element) + { + if(element != NULL && element->_parent != NULL) + return(element->_parent->removeChildElement(element)); + return false; + }; + + /** + * Looks up an attribute field via its meta name and assign its value + * as the attrValue String. + * @param attrName Attribute to set. + * @param attrValue String-based value to apply to the attribute. + * @return Returns true if the attribute was found and the value was set, false otherwise. + */ + virtual DLLSPEC daeBool setAttribute(daeString attrName, daeString attrValue); + + /** + * Checks if an attribute has been set either by being loaded from the COLLADA document or set + * programmatically. + * @param attrName The name of the attribute to check. + * @return Returns true if the attribute has been set. False if the attribute hasn't been set + * or doesn't exist for this element. + */ + DLLSPEC daeBool isAttributeSet( daeString attrName ); + + /** + * Checks if this element can have the attribute specified. + * @param attrName The name of the attribute to look for. + * @return Returns true is this element can have an attribute with the name specified. False otherwise. + */ + DLLSPEC daeBool hasAttribute( daeString attrName ); + + /** + * Gets a pointer to the value of the attribute specified. + * @param attrName The name of the attribute to look for. + * @return Returns a daeMemoryRef (char *) to the value of the attribute. The return value will need + * to be typecast to the appropriate type. Returns NULL if the attribute does not exist. + */ + DLLSPEC daeMemoryRef getAttributeValue( daeString attrName ); + + /** + * Checks if this element can have a value. + * @return Returns true is this element can have a value. False otherwise. + */ + DLLSPEC daeBool hasValue(); + + /** + * Gets a pointer to the element's value. + * @return Returns a daeMemoryRef (char *) to the value of the element. The return value will need + * to be typecast to the appropriate type. Returns NULL if the element does not allow a value. + */ + DLLSPEC daeMemoryRef getValuePointer(); + + /** + * Finds the database document associated with @c this element. + * @return Returns the @c daeDocument representing the containing file or database + * group. + */ + daeDocument* getDocument() const { return _document; } + + /** + * Deprecated. + */ + daeDocument* getCollection() const { return _document; } + + /** + * Sets the database document associated with this element. + * @param c The daeDocument to associate with this element. + */ + DLLSPEC void setDocument(daeDocument* c ); + /** + * Deprecated. + */ + DLLSPEC void setCollection(daeDocument* c ); + + /** + * Gets the URI of the document containing this element, note that this is NOT the URI of the element. + * @return Returns a pointer to the daeURI of the document containing this element. + */ + DLLSPEC daeURI* getDocumentURI() const; + + /** + * Creates an element via the element factory system. This creation + * is based @em only on potential child elements of this element. + * @param elementName Class name of the subelement to create. + * @return Returns the created @c daeElement, if it was successfully created. + */ + DLLSPEC daeSmartRef createElement(daeString elementName); + + /** + * Creates a subelement via @c createElement() and places it via @c placeElement(). + * Automatically adds the new element to the _contents of its parent, if the parent has one. + * This is the primary method used to construct the COLLADA dom hierarchy. + * @param elementName - Class name of the subelement to create. + * @return Returns the created @c daeElement, if it was successfully created. + */ + DLLSPEC daeElement* createAndPlace(daeString elementName); + + /** + * Create a sub-element via #createElement and place it via #placeElementAt + * This also automatically inserts the new element at the specified index in the _contents of it's + * parent, if the parent has one. + * This is useful when constructing the COLLADA dom hierarchy + * @param index the position in the _contents array the newly created element is to be placed at + * @param elementName - the className of the sub-element to be created + * @return the created element if it was in fact successfully created. + */ + DLLSPEC daeElement* createAndPlaceAt(daeInt index, daeString elementName); + + /** + * Gets the container element for @c this element. + * If @c createAndPlace() was used to create the element, its parent is the the caller of @c createAndPlace(). + * @return Returns the parent element, if @c this is not the top level element. + */ + daeElement* getParentElement() { return _parent;} + /** + * Deprecated. Use getParentElement() + * @deprecated + */ + daeElement* getXMLParentElement() { return _parent;} + /** + * Sets the parent element for this element. + * @param newParent The element which is the new parent element for this element. + * @note This function is called internally and not meant to be called form the client application. + */ + void setParentElement( daeElement *parent ) { _parent = parent; } + + /** + * Gets the associated Meta information for this element. This + * Meta also acts as a factory. See @c daeMetaElement documentation for more + * information. + * @return Returns the associated meta information. + */ + inline daeMetaElement* getMeta() { return _meta; } + + /** + * Gets the integration object associated with this @c daeElement object. + * See @c daeIntegrationObject for more details. + * Integration Objects can be automatically created and associated + * with the COLLADA dom via the meta-factory mechanism and + * can be very useful for using the API to integrate with COLLADA. + * @param from_state Specifies where in the conversion process from COLLADA you are interested. A full conversion is the default. + * @param to_state Specifies where in the conversion process to COLLADA you are interested. No conversion is the default. + * @return Returns the @c daeIntegrationObject associated with this COLLADA element + * instance. + */ + DLLSPEC daeIntegrationObject* getIntObject( IntegrationState from_state = int_converted, IntegrationState to_state = int_uninitialized ); + + /** + * Gets the element type. + * @return Returns the COLLADA_TYPE::TypeEnum value corresponding to this element's type. + */ + virtual COLLADA_TYPE::TypeEnum getElementType() const { return (COLLADA_TYPE::TypeEnum)0; } + /** + * Gets the element type name for this element. + * @return Returns the string for the type name. + */ + DLLSPEC daeString getTypeName() const; + + /** + * Gets this element's name. + * @return Returns the string for the name. + * @remarks This function returns NULL if the element's name is identical to it's type's name. + */ + DLLSPEC daeString getElementName() const; + /** + * Sets this element's name. + * @param nm Specifies the string to use as the element's name. + * @remarks Use caution when using this function since you can easily create invalid COLLADA documents. + */ + DLLSPEC void setElementName( daeString nm ); + + /** + * Gets the element ID if it exists. + * @return Returns the value of the ID attribute, if there is such + * an attribute on this element type. + * @return the string for the element ID if it exists. + */ + DLLSPEC daeString getID() const; + + /** + * Gets the children/sub-elements of this element. + * This is a helper function used to easily access an element's children without the use of the + * _meta objects. This function adds the convenience of the _contents array to elements that do + * not contain a _contents array. + * @param array The return value. An elementref array to append this element's children to. + */ + //void getChildren( daeElementRefArray &array ); + DLLSPEC void getChildren( daeTArray > &array ); + + /** + * Clones/deep copies this @c daeElement and all of it's subtree. + * @param idSuffix A string to append to the copied element's ID, if one exists. + * Default is no ID mangling. + * @param nameSuffix A string to append to the copied element's name, if one exists. + * Default is no name mangling. + * @return Returns a @c daeElement smartref of the copy of this element. + */ + DLLSPEC daeSmartRef clone( daeString idSuffix = NULL, daeString nameSuffix = NULL ); + +public: + /** + * Resolves all @c daeURIs yet to be resolved in all @c daeElements that have been + * created. + * This is used as part of post-parsing process of a COLLADA instance document, + * which results in a new document in the database. + */ + static DLLSPEC void resolveAll(); + + /** + * Clears the resolveArray. + */ + static DLLSPEC void clearResolveArray(); +public: + /** + * Releases the element passed in. This function is a static wrapper that invokes + * elem->release() on the passed in element, + * if it is not NULL. + * @param elem Element to call @c release() for, if the element exists. + */ + static DLLSPEC void release(const daeElement* elem) {if (elem != NULL) elem->release();} + + /** + * Increments the reference counter for the element passed in. This function is a static wrapper + * that invokes elem->ref() on the passed in element, + * if it is not NULL. + * @param elem Element to call @c ref() for, if the element exists. + */ + static DLLSPEC void ref(const daeElement* elem) { if (elem != NULL) elem->ref(); } + + /** + * Appends the passed in element to the list of elements that need to be resolved. + * The elements in this list will be resolved during @c resolveAll(). + * @param elem Element to add to the list of elements + * waiting for their @c daeURIs to be resolved. + */ + static DLLSPEC void appendResolveElement(daeElement* elem); + +}; +#include +typedef daeSmartRef daeElementRef; +typedef daeSmartRef daeElementConstRef; +//#include +typedef daeTArray daeElementRefArray; + +extern daeElementRef DAECreateElement(int nbytes); + +template +inline T *daeSafeCast( daeElement *element ) +{ + if ( element && element->getMeta() == T::_Meta ) + return (T *)element; + return NULL; +} + +#endif //__DAE_ELEMENT_H__ diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeError.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeError.h new file mode 100644 index 00000000..f6972deb --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeError.h @@ -0,0 +1,50 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#ifndef __DAE__ERROR__ +#define __DAE__ERROR__ + +/** Success */ +#define DAE_OK 0 +/** Fatal Error, should never be returned unless there is a bug in the library. */ +#define DAE_ERR_FATAL -1 +/** Call invalid, the combination of parameters given is invalid. */ +#define DAE_ERR_INVALID_CALL -2 +/** IO error, the file hasn't been found or there is a problem with the IO plugin. */ +#define DAE_ERR_BACKEND_IO -100 +/** The IOPlugin backend wasn't able to successfully validate the data. */ +#define DAE_ERR_BACKEND_VALIDATION -101 +/** The IOPlugin tried to write to a file that already exists and the "replace" parameter was set to false */ +#define DAE_ERR_BACKEND_FILE_EXISTS -102 +/** Error in the syntax of the query. */ +#define DAE_ERR_QUERY_SYNTAX -200 +/** No match to the search criteria. */ +#define DAE_ERR_QUERY_NO_MATCH -201 +/** A document with that name already exists. */ +#define DAE_ERR_COLLECTION_ALREADY_EXISTS -202 +/** A document with that name does not exist. */ +#define DAE_ERR_COLLECTION_DOES_NOT_EXIST -203 +/** Function is not implemented. */ +#define DAE_ERR_NOT_IMPLEMENTED -1000 + +/** Gets the ASCII error string. +* @param errorCode Error code returned by a function of the API. +* @return Returns an English string describing the error. +*/ +#ifdef WIN32 +__declspec( dllexport ) const char *daeErrorString(int errorCode); +#else +const char *daeErrorString(int errorCode); +#endif + +#endif //__DAE__ERROR__ diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeErrorHandler.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeErrorHandler.h new file mode 100644 index 00000000..294339fa --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeErrorHandler.h @@ -0,0 +1,65 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#ifndef _DAE_ERROR_HANDLER_ +#define _DAE_ERROR_HANDLER_ + +#include + +/** + * The @c daeErrorHandler class is a plugin that allows the use to overwrite how error and warning + * messages get handled in the client application. An example of this would be a class that reports + * the message to a gui front end instead of just printing on stdout. + */ +class DLLSPEC daeErrorHandler { +public: + /** + * Constructor. + */ + daeErrorHandler(); + /** + * Destructor. + */ + virtual ~daeErrorHandler(); + + /** + * This function is called when there is an error and a string needs to be sent to the user. + * You must overwrite this function in your plugin. + * @param msg Error message. + */ + virtual void handleError( daeString msg ) = 0; + /** + * This function is called when there is a warning and a string needs to be sent to the user. + * You must overwrite this function in your plugin. + * @param msg Warning message. + */ + virtual void handleWarning( daeString msg ) = 0; + + /** + * Sets the daeErrorHandler to the one specified. + * @param eh The new daeErrorHandler to use. Passing in NULL results in the default plugin being used. + */ + static void setErrorHandler( daeErrorHandler *eh ); + /** + * Returns the current daeErrorHandlerPlugin. DaeErrorHandler implements a singleton design pattern + * so you can get the current daeErrorHandler statically. + * @return The current daeErrorHandler. + */ + static daeErrorHandler *get(); + +private: + static daeErrorHandler *_instance; + static daeBool _default; +}; + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeGCCPlatform.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeGCCPlatform.h new file mode 100644 index 00000000..5dbf11b7 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeGCCPlatform.h @@ -0,0 +1,30 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#ifndef __DAE_GCC_PLATFORM_H__ +#define __DAE_GCC_PLATFORM_H__ + +#define PLATFORM_INT8 char +#define PLATFORM_INT16 short +#define PLATFORM_INT32 int +#define PLATFORM_INT64 long long +#define PLATFORM_UINT8 unsigned char +#define PLATFORM_UINT16 unsigned short +#define PLATFORM_UINT32 unsigned int +#define PLATFORM_UINT64 unsigned long long +#define PLATFORM_FLOAT32 float +#define PLATFORM_FLOAT64 double + +#define DLLSPEC + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeGenericPlatform.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeGenericPlatform.h new file mode 100644 index 00000000..821771d6 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeGenericPlatform.h @@ -0,0 +1,32 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#ifndef __DAE_GENERIC_PLATFORM_H__ +#define __DAE_GENERIC_PLATFORM_H__ + +#include + +#define PLATFORM_INT8 char +#define PLATFORM_INT16 short +#define PLATFORM_INT32 int +#define PLATFORM_INT64 long long +#define PLATFORM_UINT8 unsigned char +#define PLATFORM_UINT16 unsigned short +#define PLATFORM_UINT32 unsigned int +#define PLATFORM_UINT64 unsigned long long +#define PLATFORM_FLOAT32 float +#define PLATFORM_FLOAT64 double + +#define DLLSPEC + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeIDRef.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeIDRef.h new file mode 100644 index 00000000..71e8060d --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeIDRef.h @@ -0,0 +1,346 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#ifndef __DAE_IDREF_H__ +#define __DAE_IDREF_H__ + +#include +#include + +/** + * The @c daeIDRef is a simple class designed to aid in the parsing and resolution of + * ID references inside of COLLADA elements. + * A @c daeIDRef is created for every IDREF data type in the COLLADA schema. + * It also has the capability to attempt to resolve this reference + * into a @c daeElement. If a @c daeIDRef is stored within a @c daeElement it fills + * in its container field to point to the containing element. + * + * The main API is the @c daeIDRef::resolveElement() will use a @c daeIDRefResolver + * to search for the @c daeElement inside of a @c daeDatabase. + * + */ +class daeIDRef +{ +public: + /** + * An enum describing the status of the ID resolution process. + */ + DLLSPEC enum ResolveState{ + /** No ID specified */ + id_empty, + /** ID specified but not resolved */ + id_loaded, + /** ID resolution pending */ + id_pending, + /** ID resolved correctly */ + id_success, + /** Resolution failed because ID was not found */ + id_failed_id_not_found, + /** Resolution failed because ID was invalid */ + id_failed_invalid_id, + /** Resoltion failed due to invalid reference */ + id_failed_invalid_reference, + /** Resolution failed due to an external error */ + id_failed_externalization + }; + +private: + /** Id used to refer to another element */ + daeString id; + + /** Reference to the actual element the ID refers to */ + daeElementRef element; + + /** Element that owns this ID (if any) */ + daeElement* container; + + /** Current state of this id's resolution */ + ResolveState state; + +public: + /** + * Gets the element that this URI resolves to in memory. + * @return Returns a ref to the element. + */ + inline daeElementRef getElement(){return(element);}; + + /** + * Gets the element that this URI resolves to in memory. + * @return Returns a ref to the element. + */ + inline daeElementConstRef getElement() const {return(element);}; + + /** + * Sets the element that this URI resolves to in memory. + * @param newref A ref to the element. + */ + inline void setElement(daeElementRef newref){element=newref;}; + + /** + * Gets the resolve state of the URI. + * @return Returns the current state. + * @note This will be removed when daeURI starts managing its state internally. + */ + inline ResolveState getState() const {return(state);}; + + /** + * Sets the resolve state of the URI. + * @param newState The new state. + * @note This will be removed when daeURI starts managing its state internally. + */ + inline void setState(ResolveState newState){state=newState;}; + + /** + * Gets a pointer to the @c daeElement that contains this URI. + * @return Returns the pointer to the containing daeElmement. + */ + + inline daeElement* getContainer() const {return(container);}; + /** + * Sets the pointer to the @c daeElement that contains this URI. + * @param element Pointer to the containing @c daeElmement. + */ + inline void setContainer(daeElement* element){container=element;}; + +public: + /** + * Simple Constructor + */ + DLLSPEC daeIDRef(); + /** + * Destructor + */ + DLLSPEC ~daeIDRef(); + + /** + * Constructs an id reference via a string, using @c setID(); loads the status. + * @param id ID to construct a reference for, passed to @c setID() automatically. + */ + DLLSPEC daeIDRef(daeString id); + + /** + * Constructs a new id reference by copying an existing one. + * @param constructFromIDRef @c daeIDRef to copy into this one. + */ + DLLSPEC daeIDRef(daeIDRef& constructFromIDRef); + + /** + * Copies ID into the id data member. + * After the call to @c setID(), the state is set to @c id_loaded + * @param ID String to use to configure this @c daeIDRef. + */ + DLLSPEC void setID(daeString ID); + + /** + * Gets the ID string + * @return Returns the full ID string from id. + */ + DLLSPEC daeString getID() const; + + /** + * Uses the @c daeIDRefResolver static API to try to resolve this ID + * into a @c daeElement reference. + * This function can effectively force a load of a file, perform + * a database query, et cetera based on the @c daeIDRefResolver plugins + * implemented. + */ + DLLSPEC void resolveElement( daeString typeNameHint = NULL ); + + /** + * Configures the id string of this @c daeIDRef based on the element set its element data member. + * Uses @c daeElement::getID() to get the element's ID information to configure + * the id string. + */ + DLLSPEC void resolveID(); + + /** + * Sets the state of this @c daeIDRef to @c id_pending, as it is awaiting a call to + * @c resolveElement(). + */ + DLLSPEC void validate(); + + /** + * Copies from into this. + * The function does a simple copy, and not "base validation". + * @param from @c daeIDRef to copy from. + */ + DLLSPEC void copyFrom(daeIDRef& from); + + /** + * Outputs all components of this @c daeIDRef to stderr. + */ + DLLSPEC void print(); + + /** + * Resets this @c daeIDRef; frees all string references + * and returns state to @c empty. + */ + DLLSPEC void reset(); + + /** + * Initializes the @c daeIDREf, setting id, element, and container to NULL. + */ + DLLSPEC void initialize(); + + /** + * Comparison operator. + * @return Returns true if URI's are equal. + */ + inline bool operator==(const daeIDRef& other) const{ + return (!strcmp(other.getID(), getID())); } + + daeIDRef &operator=( const daeIDRef& other) { + setID(other.getID()); + element = other.element; + state = other.state; + return *this; + } + + //Backwards Compatibility + daeIDRef &get( daeUInt idx ) { (void)idx; return *this; } + size_t getCount() const { return 1; } + daeIDRef& operator[](size_t index) { (void)index; return *this; } +}; + +class daeIDRefResolver; +typedef daeTArray daeIDRefResolverPtrArray; + +/** + * The @c daeIDRefResolver class is the plugin point for @c daeIDRef resolution. + * This class is an abstract base class that defines an interface for + * resolving @c daeIDRefs. + * All instances of @c daeIDRefResolvers are tracked centrally. + * Every @c daeIDRef is passed through this list of @c aeIDRefResolvers for resolution. + * The list is ordered on a first come, first serve basis, and resolution + * terminates after any resolver instance is able to resolve the ID. + */ +class daeIDRefResolver +{ +public: + /** + * Constructor; base constructor appends @c this to _KnownResolvers list. + */ + DLLSPEC daeIDRefResolver(); + + /** + * Destructor + */ + virtual DLLSPEC ~daeIDRefResolver(); + +//Contributed by Nus - Wed, 08 Nov 2006 + /** + * Initialize ID reference solver + */ + static void initializeIDRefSolver(void); + + /** + * Terminate ID reference solver + */ + static void terminateIDRefSolver(void); +//------------------------- + +protected: + static daeIDRefResolverPtrArray* _KnownResolvers; + +public: + /** + * Iterates through known resolvers + * calling @c resolveElement(). + * @param id @c daeIDRef to resolve. + */ + static DLLSPEC void attemptResolveElement(daeIDRef &id, daeString typeNameHint = NULL ); + + /** + * attemptResolveID iterates through known resolvers + * calling resolveID(). + * @param id @c daeIDRef to resolve. + */ + static DLLSPEC void attemptResolveID(daeIDRef &id); + +public: // Abstract Interface + /** + * Provides an abstract interface to convert a @c daeIDRef into a @c daeElement. + * @param IDRef @c daeIDRef to resolve. + * @return Returns true if the @c daeIDRefResolver successfully resolved the IDRef, + * returns false otherwise. + */ + virtual DLLSPEC daeBool resolveElement(daeIDRef& IDRef, daeString typeNameHint = NULL ) = 0; + /** + * Provides an abstract interface to convert a @c daeElement into a @c daeIDRef. + * @param IDRef @c daeIDRef to resolve. + * @return Returns true if the @c daeIDRefResolver successfully resolved the element + * into a @c daeIDRef, returns false otherwise. + */ + virtual DLLSPEC daeBool resolveID(daeIDRef& IDRef) = 0; + + /** + * Gets the name of this resolver. + * @return Returns the string name. + */ + virtual DLLSPEC daeString getName() = 0; + +}; + +class daeDatabase; + +/** + * The @c daeDefaultIDRefResolver resolves a @c daeIDRef by checking with a database. + * It is a concrete implementation for @c daeIDRefResolver. + */ +class daeDefaultIDRefResolver : public daeIDRefResolver +{ +public: + /** + * Constructor + * @param database @c daeDatabase for this implementation. + */ + DLLSPEC daeDefaultIDRefResolver(daeDatabase* database); + + /** + * Destructor + */ + DLLSPEC ~daeDefaultIDRefResolver(); + +protected: + daeDatabase* _database; + +public: // Abstract Interface + /* + * Implements base class abstract routine from @c daeIDRefResolver. + */ + virtual DLLSPEC daeBool resolveElement(daeIDRef& id, daeString typeNameHint = NULL ); + + /* + * Implements base class abstract routine from @c daeIDRefResolver. + */ + virtual DLLSPEC daeBool resolveID(daeIDRef& id); + + /* + * Implements base class abstract routine from @c daeIDRefResolver. + */ + virtual DLLSPEC daeString getName(); +}; + +#endif //__DAE_IDREF_H__ + + + + + + + + + + + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeIOPlugin.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeIOPlugin.h new file mode 100644 index 00000000..4d161db9 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeIOPlugin.h @@ -0,0 +1,112 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#ifndef __DAE_IOPLUGIN__ +#define __DAE_IOPLUGIN__ + +#include +class daeDatabase; +class daeMetaElement; +class daeURI; +class daeDocument; + +/** +* The @c daeIOPlugin class provides the input/output plugin interface, which is +* the interface between the COLLADA runtime and the backend storage. A native +* COLLADA XML plugin implementation is provided along with this interface. +*/ +class daeIOPlugin +{ +public: + /** + * Destructor + */ + virtual ~daeIOPlugin() {} + /** + * Sets the top meta object. + * Called by @c dae::setIOPlugin() when the IO plugin changes. It passes to this function the + * top meta object, which is the root of a + * hierarchy of @c daeMetaElement objects. This top meta object is capable of creating + * any of the root objects in the DOM tree. + * @param topMeta Top meta object to use to create objects to fill the database. + * @return Returns DAE_OK if successful, otherwise returns a negative value defined in daeError.h. + */ + virtual DLLSPEC daeInt setMeta(daeMetaElement *topMeta) = 0; + + /** @name Database setup */ + //@{ + /** + * Sets the database to use. + * All @c daeIOPlugins use the same interface to the @c daeDatabase, + * @c setDatabase() tells the @c daeIOPlugin which @c daeDatabase object it should use + * for storage and queries. + * @param database Database to set. + */ + virtual DLLSPEC void setDatabase(daeDatabase* database) = 0; + //@} + + + /** @name Operations */ + //@{ + /** + * Imports content into the database from an input. + * The input can be a file, a database or another runtime. + * @param uri the URI of the COLLADA document to load, not all plugins accept all types of URIs, + * check the documentation for the IO plugin you are using. + * @param docBuffer A string containing the text of the document to load. This is an optional attribute + * and should only be used if the document has already been loaded into memory. + * @return Returns DAE_OK if successfully loaded, otherwise returns a negative value defined in daeError.h. + * @see @c daeInterface::load(). + */ + virtual DLLSPEC daeInt read(daeURI& uri, daeString docBuffer) = 0; + + /** @name Operations */ + //@{ + /** + * Writes a specific document to an output. + * @param name URI to write the document to, not all IO plugins support all types of URIs + * check the documentation for the IO plugin you are using. + * @param document Pointer to the document that we're going to write out. + * @param replace True if write should overwrite an existing file. False otherwise. + * @return Returns DAE_OK if success, a negative value defined in daeError.h otherwise. + * @see @c daeInterface::saveAS() + */ + virtual DLLSPEC daeInt write(daeURI *name, daeDocument *document, daeBool replace) = 0; + //@} + + /** @name Load/Save Progress */ + //@{ + /** + * Gets the progress of @c load() operation. + * This function can be used from another thread to check the progress of a @c load() + * operation. The user can update a progress bar bytesParsed/totalBytes gives the + * percentage of progress of the operation. + * @param bytesParsed Pointer to an integer that receives the number of bytes already + * consumed from the file, can be NULL if the user don't want to retrieve this information. + * @param lineNumber Pointer to an integer that receives the number of lines read so far, + * can be NULL. + * @param totalBytes Pointer to an integer that receives the total number of bytes in the + * file currently beeing loaded, can be NULL. + * @param reset Indicates whether to reset the counters. A value of false is the default behaviour + * that fits most usage. Set it to true to reset + * the bytesParsed and lineNumber counters. The system resets the counter at the beginning of + * each file. + */ + virtual DLLSPEC void getProgress(daeInt* bytesParsed, + daeInt* lineNumber, + daeInt* totalBytes, + daeBool reset = false ) = 0; + //@} +}; + +#endif // __DAE_IOPLUGIN__ diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeIntegrationObject.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeIntegrationObject.h new file mode 100644 index 00000000..f33a44b6 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeIntegrationObject.h @@ -0,0 +1,179 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#ifndef __DAE_INTEGRATION_OBJECT_H__ +#define __DAE_INTEGRATION_OBJECT_H__ + +#include + +class daeIntegrationObject; +typedef daeSmartRef daeIntegrationObjectRef; +/** + * The @c daeIntegrationObject class provides methods to translate COLLADA + * objects to and from application objects. + */ +class daeIntegrationObject : public daeElement +{ +public: + /** + * Constructor. + */ + DLLSPEC daeIntegrationObject() { _element = NULL; _object = NULL; _from_state = int_uninitialized; _to_state = int_uninitialized; } + /** + * Destructor. + */ + virtual DLLSPEC ~daeIntegrationObject() {} + +public: + /** A pointer to the element associated with this integration object. */ + daeElement *_element; + /** A pointer at which to store the user object associated with this element. */ + void* _object; + /** An enum describing the state of the conversion from COLLADA. */ + IntegrationState _from_state; + /** An enum describing the state of the conversion to COLLADA. */ + IntegrationState _to_state; + +public: + /** + * Sets the element associated with this integration object. + * @param element A daeSmartRef to the element for this integration object. + */ + void setElement(daeElementRef element) { _element = element; } + /** + * Gets the element associated with this integration object. + * @return The element associated with this integration object. + */ + daeElementRef getElement() { return _element; } + /** + * Sets the user object associated with this integration object. + * @param object A void * to the user object to be associated with this integration object. + */ + void setObject(void* object) { _object = object; } + /** + * Gets the user object associated with this integration object. + * @return The user object associated with this integration object. + */ + void* getObject() { return _object; } +public: // Do not implement these by default + virtual daeElementRef lookupElement(daeString s) { (void)s; return NULL;} + virtual daeIntegrationObjectRef lookup(daeString s) { (void)s; return NULL;} +protected: + /** + * Defines the code to create the application-specific data structure associated with the DOM class + * for this integration template. This method sets up the integration object for the DOM class. + * @param element A daeSmartRef to the element to convert into the user's structure. + */ + virtual DLLSPEC void createFrom(daeElementRef element) = 0; + /** + * Defines the code to convert the COLLADA Object Model data structure into your application-specific + * data structure. + */ + virtual DLLSPEC void fromCOLLADA() = 0; + /** + * Defines any postprocessing code that must execute after the basic conversion. + */ + virtual DLLSPEC void fromCOLLADAPostProcess() = 0; + /** + * Defines code to create the COLLADA Object Model data structure associated with the DOM class for + * this template. + * @param userData A pointer to the application-specific data structure to convert to the DOM structure. + */ + virtual DLLSPEC void createTo(void *userData) = 0; + /** + * Defines the code to convert your application's data structures back into COLLADA Object Model data + * structures. + */ + virtual DLLSPEC void toCOLLADA() = 0; + /** + * Defines any postprocessing code that must execute after the basic conversion. + */ + virtual DLLSPEC void toCOLLADAPostProcess() = 0; + +public: + /** + * Defines the code to create the application-specific data structure associated with the DOM class + * for this integration template. This method sets up the integration object for the DOM class. This + * method checks and updates the conversion state stored in _from_state and converts only if + * necessary. + * @param element A daeSmartRef to the element to convert into the user's structure. + */ + void createFromChecked(daeElementRef element) { + if ( _from_state >= int_created ) { + return; + } + createFrom(element); + _from_state = int_created; + }; + /** + * Defines the code to convert the COLLADA Object Model data structure into your application-specific + * data structure. This method checks and updates the conversion state stored in _from_state and + * converts only if necessary. + */ + void fromCOLLADAChecked() { + if ( _from_state >= int_converted ) { + return; + } + fromCOLLADA(); + _from_state = int_converted; + }; + /** + * Defines any postprocessing code that must execute after the basic conversion. This method + * checks and updates the conversion state stored in _from_state and converts only if necessary. + */ + void fromCOLLADAPostProcessChecked() { + if ( _from_state >= int_finished) { + return; + } + fromCOLLADAPostProcess(); + _from_state = int_finished; + }; + /** + * Defines code to create the COLLADA Object Model data structure associated with the DOM class for + * this template. This method checks and updates the conversion state stored in _to_state and + * converts only if necessary. + * @param userData A pointer to the application-specific data structure to convert to the DOM structure. + */ + void createToChecked(void *userData) { + if ( _to_state >= int_created ) { + return; + } + createTo(userData); + _to_state = int_created; + }; + /** + * Defines the code to convert your application's data structures back into COLLADA Object Model data + * structures. This method checks and updates the conversion state stored in _to_state and + * converts only if necessary. + */ + void toCOLLADAChecked() { + if ( _to_state >= int_converted ) { + return; + } + toCOLLADA(); + _to_state = int_converted; + }; + /** + * Defines any postprocessing code that must execute after the basic conversion. This method + * checks and updates the conversion state stored in _to_state and converts only if necessary. + */ + void toCOLLADAPostProcessChecked() { + if ( _to_state >= int_finished) { + return; + } + toCOLLADAPostProcess(); + _to_state = int_finished; + }; + +}; +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeInterface.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeInterface.h new file mode 100644 index 00000000..b347578d --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeInterface.h @@ -0,0 +1,231 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#ifndef __DAE_INTERFACE__ +#define __DAE_INTERFACE__ + +#include +class daeElement; +class daeDatabase; +class daeIOPlugin; +class domCOLLADA; + +/** +* Integration library meta register function. +* +* Such a function (@c intRegisterElements() )is autogenerated by the COLLADA code generator +* and can be modified if necessary to register the meta of the +* integration library objects. +*/ +typedef void (*daeIntegrationLibraryFunc)(); + +/** +* The @c daeInterface class provides an interface with the COLLADA runtime database. +*/ +class daeInterface +{ +public: + /** + * Destructor. + */ + virtual DLLSPEC ~daeInterface() {} + + /** @name Database setup + * management of the database that stores the COLLADA elements. + */ + //@{ + /** + * Gets the COLLADA runtime database currently being used. + * @return Returns the database currently being used. + */ + virtual DLLSPEC daeDatabase* getDatabase() = 0; + /** + * Sets the COLLADA runtime database to use. + * @param database Database that stores the COLLADA data, + * if set to NULL a default database is set. + * @return Returns @c DAE_OK if success, otherwise, returns a negative error value as defined in daeError.h. + */ + virtual DLLSPEC daeInt setDatabase(daeDatabase* database) = 0; + //@} + + /** @name IOPlugin setup + * handle the backend, which can import or export the COLLADA + * database to a file system, to a runtime or to any other storage system. + */ + //@{ + /** + * Gets the @c daeIOPlugin currently set. + * @return Returns the @c daeIOPlugin currently set on the interface. + */ + virtual DLLSPEC daeIOPlugin* getIOPlugin() = 0; + /** + * Sets the plugin which will be the interface between the COLLADA runtime database + * and the rest of the system. + * It can be used to read or write from a native XML file, to convert, or to store + * in a more complex structure like a storage database. + * @param plugin Plugin to use, if set to NULL a default plugin is set. + * @return Returns @c DAE_OK if success, otherwise, returns a negative error value as defined in daeError.h. + */ + virtual DLLSPEC daeInt setIOPlugin(daeIOPlugin* plugin) = 0; + //@} + + /** @name Integration Library Setup + * definition of an integration library to use when processing COLLADA file. + * It defines a framework for a user to insert a source code that will be called + * in the context of an import or export. Hence, it's the preferred way of + * accessing COLLADA runtime structure and convert between COLLADA and the user's + * runtime. + */ + //@{ + /** + * Gets the integration library register function currently being used. + * @return Returns the integration library register function currently being used. + */ + virtual DLLSPEC daeIntegrationLibraryFunc getIntegrationLibrary() = 0; + /** + * Sets the integration library register function. + * @param regFunc Integration library register function to use. + * @return Returns DAE_OK if success, a negative value defined in daeError.h otherwise. + */ + virtual DLLSPEC daeInt setIntegrationLibrary(daeIntegrationLibraryFunc regFunc)=0; + //@} + + /** @name Batch import/export operations + * import or export a COLLADA database by using the daeIOPlugin currently set. + */ + //@{ + /** + * Loads a COLLADA document into the runtime database + * @param name the document to load. The format for this is defined by the IO plugin + * being used, in most cases this will be an rfc 2396 compliant relative or absolute URI. Please check + * the class documentation for the IO plugin you are using for specific restrictions. Not all IO plugins + * support all types of URIs. + * @param docBuffer A string containing the text of the document to load. This is an optional attribute + * and should only be used if the document has already been loaded into memory. + * @return Returns DAE_OK if success, a negative value defined in daeError.h otherwise. + */ + virtual DLLSPEC daeInt load(daeString name, daeString docBuffer = NULL) = 0; + /** + * Saves a single document/document back to the location it was loaded from. + * @param documentName the name of the loaded document to be saved, in most cases this will be an rfc 2396 compliant + * URI but some IO plugins may work differently. Please check the class documentation for the IO plugin you are using for specific restrictions. + * @param replace If set to false, save won't save over top of an existing document and will return a DAE_ERR_BACKEND_FILE_EXISTS + * error. + * @return Returns DAE_OK if success, a negative value defined in daeError.h otherwise. + */ + virtual DLLSPEC daeInt save(daeString documentName, daeBool replace=true) = 0; + /** + * Saves a single document/document back to the location it was loaded from. + * @param documentIndex the index of a loaded document to be saved. + * @param replace If set to false, save won't save over top of an existing document and will return a DAE_ERR_BACKEND_FILE_EXISTS + * error. + * @return Returns DAE_OK if success, a negative value defined in daeError.h otherwise. + */ + virtual DLLSPEC daeInt save(daeUInt documentIndex=0, daeBool replace=true) = 0; + /** + * Saves a single document/document from the runtime database by name. + * @param name the name to save the document to. The format for this is defined by the IO plugin + * being used, in most cases this will be an rfc 2396 compliant relative or absolute URI. Please check + * the class documentation for the IO plugin you are using for specific restrictions. Not all IO plugins + * support all types of URIs. + * @param documentName the name of the document/document to save. This is also defined by the IO plugin, in + * most cases this will be the URI of where the document was loaded from. + * @param replace If set to false, saveAs won't save over top of an existing document and will return a DAE_ERR_BACKEND_FILE_EXISTS + * error. + * @return Returns DAE_OK if success, a negative value defined in daeError.h otherwise. + */ + virtual DLLSPEC daeInt saveAs(daeString name, daeString documentName, daeBool replace=true) = 0; + /** + * Saves a single document/document from the runtime database by index. + * @param name the name to save the document to. The format for this is defined by the IO plugin + * being used, in most cases this will be an rfc 2396 compliant relative or absolute URI. Please check + * the class documentation for the IO plugin you are using for specific restrictions. Not all IO plugins + * support all types of URIs. + * @param documentIndex the index of the document/document to save, 0 is the first document loaded...etc. + * Defaults to saving the first document loaded + * @param replace If set to false, saveAs won't save over top of an existing document and will return a DAE_ERR_BACKEND_FILE_EXISTS + * error. + * @return Returns DAE_OK if success, a negative value defined in daeError.h otherwise. + */ + virtual DLLSPEC daeInt saveAs(daeString name, daeUInt documentIndex=0, daeBool replace=true) = 0; + /** + * Unloads a specific document from the runtime database. + * @param name Name of the document to remove. + * @return Returns DAE_OK if unloaded successfully, otherwise returns a negative value as defined in daeError.h. + * @note This function is not currently implemented. + */ + virtual DLLSPEC daeInt unload(daeString name) = 0; + /** + * Unloads all the documents of the runtime database. + * This function frees all the @c dom* objects and integration objects created so far, + * except the object on which the user still has a smart pointer reference. + * @return Returns DAE_OK if all documents unloaded successfully, otherwise returns a negative value as defined in daeError.h. + */ + virtual DLLSPEC daeInt clear() = 0; + //@} + + /** @name Import/export progress + */ + //@{ + /** + * Gets the progress of @c load() operation. + * This function can be used from another thread to check the progress of a @c load() + * operation. The user can update a progress bar bytesParsed/totalBytes gives the + * percentage of progress of the operation. + * @param bytesParsed Pointer to an integer that receives the number of bytes already + * consumed from the file, can be NULL if the user don't want to retrieve this information. + * @param lineNumber Pointer to an integer that receives the number of lines read so far, + * can be NULL. + * @param totalBytes Pointer to an integer that receives the total number of bytes in the + * file currently being loaded, can be NULL. + * @param reset Indicates whether to reset the counters. A value of false is the default behavior + * that fits most usage. Set it to true to reset + * the bytesParsed and lineNumber counters. The system resets the counter at the beginning of + * each file. + */ + virtual DLLSPEC void getProgress(daeInt* bytesParsed, + daeInt* lineNumber, + daeInt* totalBytes, + daeBool reset = false )=0; + //@} + + /** @name Main DOM Query + */ + //@{ + /** + * Gets the COLLADA tree root of a given document. + * @param name Document name, for the file @c daeIOPlugin, this will be the filename for a file. + * @return Returns the @c domCOLLADA root object of the document, or NULL if the document is not found. + */ + virtual DLLSPEC domCOLLADA* getDom(daeString name) = 0; + /** + * Gets the COLLADA schema version that was used to build the DOM classes + * @return a text string with the version number in it (ie: 1.3.1) + */ + virtual DLLSPEC daeString getDomVersion() = 0; + /** + * Sets or inserts a COLLADA tree into the database. + * The system creates a default database if none is set and then creates a document + * if the document doesn't already exist. The document keeps a reference on the + * @c daeElement, so you can then delete your own reference to the object safely. + * @param name the document name, may be an absolute or relative URI. The URI will be resolved to an absolute version + * and then compared with the absolute version of the document's URI. If the URI contains a fragment, it is stripped out. + * @param dom Root tree. + * @return Returns DAE_OK if success, otherwise returns a negative value as defined in daeError.h. + */ + virtual DLLSPEC daeInt setDom(daeString name, domCOLLADA* dom) = 0; + //@} +}; + +#endif // __DAE_INTERFACE__ + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeMemorySystem.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeMemorySystem.h new file mode 100644 index 00000000..9a5aa60b --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeMemorySystem.h @@ -0,0 +1,63 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#ifndef __DAE_MEMORY_SYSTEM_H__ +#define __DAE_MEMORY_SYSTEM_H__ + +#include + +/** + * The @c daeMemorySystem class is a simple wrapper for memory operations. + * Every allocation passes a string pool name such that + * in the future different pools can be used based on allocation type. + * Currently the system is just a pass-through to system @c malloc. + */ +class daeMemorySystem +{ +public: + /** + * Provides a wrapper malloc with pool field. + * @param pool String name of the pool to use for this allocation. + * @param n Number of bytes to allocate. + * @return Returns the memory allocated if successful, or NULL if not. + */ + static DLLSPEC daeRawRef malloc(daeString pool, size_t n); + + /** + * Provides a wrapper free with pool argument. + * @param pool Pool the memory should be freed from. + * @param mem Memory to be freed. + */ + static DLLSPEC void free(daeString pool, daeRawRef mem); +}; + +// Shorthand for defining new and delete overrides for classes, bad use of macros! + +#define DAE_ALLOC \ + inline void* operator new(size_t n) { \ + return daeMemorySystem::malloc("meta",n); \ + } \ + inline void* operator new(size_t , size_t runtimeSize) { \ + return daeMemorySystem::malloc("meta",runtimeSize); \ + } \ + inline void operator delete(void* p) { \ + daeMemorySystem::free("meta",p); \ + } \ + inline void operator delete(void* p, size_t runtimeSize) { \ + (void)runtimeSize; \ + daeMemorySystem::free("meta",p); \ + } + + + +#endif // __DAE_MEMORY_H__ diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeMetaAny.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeMetaAny.h new file mode 100644 index 00000000..92e8ba2d --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeMetaAny.h @@ -0,0 +1,44 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#ifndef __DAE_META_ANY_H__ +#define __DAE_META_ANY_H__ + +#include + +/** + * The daeMetaAny class defines the behavior of an xs:any content model in the COLLADA Schema. + */ +class daeMetaAny : public daeMetaCMPolicy +{ +public: + /** + * Constructor. + * @param container The daeMetaElement that this policy object belongs to. + * @param parent The daeMetaCMPolicy parent of this policy object. + * @param odinal The ordinal value offset of this specific policy object. Used for maintaining the + * correct order of child elements. + * @param minO The minimum number of times this CMPolicy object must appear. This value comes from the COLLADA schema. + * @param maxO The maximum number of times this CMPolicy object may appear. This value comes from the COLLADA schema. + */ + daeMetaAny( daeMetaElement *container, daeMetaCMPolicy *parent = NULL, daeUInt ordinal = 0, daeInt minO = 1, daeInt maxO = 1 ); + ~daeMetaAny(); + + daeElement *placeElement( daeElement *parent, daeElement *child, daeUInt &ordinal, daeInt offset = 0, daeElement* before = NULL, daeElement *after = NULL ); + daeBool removeElement(daeElement* parent, daeElement* child); + daeMetaElement *findChild( daeString elementName ); + void getChildren( daeElement* parent, daeElementRefArray &array ); +}; + +#endif + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeMetaAttribute.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeMetaAttribute.h new file mode 100644 index 00000000..c053f25a --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeMetaAttribute.h @@ -0,0 +1,287 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#ifndef __DAE_META_ATTRIBUTE_H__ +#define __DAE_META_ATTRIBUTE_H__ + +#include +#include +#include +#include +#include + +class daeElement; +class daeMetaElement; +class daeMetaAttribute; +class daeMetaElementAttribute; + +/** + * The @c daeMetaAttribute class describes one attribute in a C++ COLLADA dom element. + * + * In the case of the C++ object model a conceptual attribute can be + * either a dom attribute, a dom element, or a dom value. + * Essentially, the meta attribute describes fields on the C++ class. + * However these attributes are stored separately in the containing meta + * @c daeMetaElement. + * @c daeMetaAttributes always exist inside of @c daeMetaElements. + * Each @c daeMetaAttribute has certain symantic operations it is capable of + * including @c set(), @c get(), @c print(), and @c resolve(). + * @c daeMetaAttributes use the @c daeAtomicType system as their underlying semantic + * implementation, but contain additional information about the packaging + * of the atomic types into the C++ dom classes such as offset, and + * array information. + */ +class daeMetaAttribute : public daeElement +{ +protected: + daeStringRef _name; + daeInt _offset; + daeAtomicType* _type; + daeMetaElement* _container; + daeString _default; + daeBool _isRequired; + +public: + /** + * Constructor + */ + daeMetaAttribute(); + + /** + * Destructor + */ + ~daeMetaAttribute() {} +public: + /** + * Determines if the schema indicates that this is a required attribute. + * @return Returns true if this is a required attribute, false if not. + */ + daeBool getIsRequired() {return _isRequired; } + /** + * Sets the value that indicates that this attribute is required by the schema. If set, the attribute + * will always be exported by the API regardless of its value. + * @param isRequired Indicates if the schema says this attribute is required, true if it is, false if not. + */ + void setIsRequired(daeBool isRequired) {_isRequired = isRequired;} + /** + * Sets the byte offset (from @c this) where this attribute's storage is + * found in its container element class. + * @param offset Integer byte offset from @c this pointer. + */ + void setOffset(daeInt offset) { _offset = offset; } + + /** + * Gets the byte offset (from @ this) where this attribute's storage is + * found in its container element class. + * @return Returns the integer byte offset from @c this pointer for this attribute. + */ + daeInt getOffset() { return _offset; } + + /** + * Sets the name of the attribute. + * @param name @c daeString that is directly stored as a pointer + * without being copied. + */ + void setName(daeString name) { _name = name; } + + /** + * Gets the name of this attribute. + * @return Returnsthe name of this attribute. + */ + daeStringRef getName() { return _name; } + + /** + * Sets the type of the attribute. + * @param type @c daeAtomicType to use for interacting with this + * attribute in a containing @c daeElement. + */ + void setType(daeAtomicType* type) { _type = type; } + + /** + * Gets the @c daeAtomicType used by this attribute. + * @return Returns the @c daeAtomicType that this attribute uses for its + * implementation. + */ + daeAtomicType* getType() { return _type; } + + /** + * Sets the default for this attribute via a string. The attribute's + * type is used to convert the string into a binary value + * inside of an element. + * @param defaultVal @c daeString representing the default value. + */ + void setDefault(daeString defaultVal) { _default = defaultVal; } + + /** + * Gets the default for this attribute via a string. The attribute's + * type is used to convert the string into a binary value + * inside of an element. + * @return Returns a @c daeString representing the default value. + */ + daeString getDefault() { return _default; } + + /** + * Sets the containing @c daeMetaElement for this attribute. + * @param container Element on which this @c daeMetaAttribute belongs. + */ + void setContainer(daeMetaElement* container) { _container = container; } + + /** + * Gets the containing @c daeMetaElement for this attribute. + * @return Returns the @c daeMetaElement to which this @c daeAttribute belongs. + */ + daeMetaElement* getContainer() { return _container; } + + /** + * Gets the number of particles associated with this attribute in instance e. + * @param e Containing element to run the operation on. + * @return Returns the number of particles associated with this attribute + * in instance e. + */ + virtual daeInt getCount(daeElement* e); + + /** + * Gets a particle from containing element e based on index. + * @param e Containing element from which to get the element. + * @param index Index of the particle to retrieve if indeed + * there is an array of elements rather than a singleton. + * @return Returns the associated particle out of parent element e, based on index, if necessary. + */ + virtual daeMemoryRef get(daeElement* e, daeInt index); + + /** + * Gets if this attribute is an array attribute. + * @return Returns true if this attribute is an array type. + */ + virtual daeBool isArrayAttribute() { return false; } + +public: + /** + * Resolves a reference (if there is one) in the attribute type; + * only useful for reference types. + * @param elem Containing element on which this attribute + * should be resolved. + */ + virtual void resolve(daeElementRef elem); + + /** + * Gets the number of bytes for this attribute. + * @return Returns the number of bytes in the C++ COLLADA dom element for this + * attribute. + */ + virtual daeInt getSize(); + + /** + * Gets the alignment in bytes on the class of this meta attribute type. + * @return Returns the alignment in bytes. + */ + virtual daeInt getAlignment(); + + /** + * Sets the value of this attribute on element by converting string s + * to a binary value and assigning it via the underlying @c daeAtomicType + * system. + * @param element Element on which to set this attribute. + * @param s String containing the value to be converted via the + * atomic type system. + */ + virtual void set(daeElement* element, daeString s); + + /** + * Copys the value of this attribute from fromElement into toElement. + * @param toElement Pointer to a @c daeElement to copy this attribute to. + * @param fromElement Pointer to a @c daeElement to copy this attribute from. + */ + virtual void copy(daeElement* toElement, daeElement* fromElement); + +public: + /** + * Gets the storage inside of e associated with + * this attribute. It is very useful for performing generic processing + * on elements and attributes from external tools regardless of element + * and attribute type. + * @param e Element from which to apply this attributes offset. + * @return Returns the storage associate with this attribute in e. + */ + inline daeChar* getWritableMemory(daeElement* e) { + return (daeChar*)e+_offset; } +}; + + +/** + * The @c daeMetaArrayAttribute class is simple a wrapper that implements + * an array of atomic types rather than a singleton. + * The corresponding storage is an array + * and the corresponding operations are implemented on the array + * data structure rather than on inlined storage in elements. + */ +class daeMetaArrayAttribute : public daeMetaAttribute +{ +public: + /** + * Defines the override version of this method from @c daeMetaAttribute. + * @param element Element on which to set this attribute. + * @param s String containing the value to be converted via the + * atomic type system. + */ + virtual void set(daeElement* element, daeString s); + /** + * Defines the override version of this method from @c daeMetaAttribute. + * @param toElement Pointer to a @c daeElement to copy this attribute to. + * @param fromElement Pointer to a @c daeElement to copy this attribute from. + */ + virtual void copy(daeElement* toElement, daeElement* fromElement); + /** + * Defines the override version of this method from @c daeMetaElement. + * @param e Containing element to run the operation on. + * @return Returns the number of particles associated with this attribute + * in instance e. + */ + virtual daeInt getCount(daeElement* e); + /** + * Defines the override version of this method from @c daeMetaElement. + * @param e Containing element from which to get the element. + * @param index Index of the particle to retrieve if indeed + * there is an array of elements rather than a singleton. + * @return Returns the associated particle out of parent element e, based on index, if necessary. + */ + virtual daeMemoryRef get(daeElement* e, daeInt index); + + /** + * Gets if this attribute is an array attribute. + * @return Returns true if this attribute is an array type. + */ + virtual daeBool isArrayAttribute() { return true; } + + /** + * Resolves a reference (if there is one) in the attribute type; + * only useful for reference types. + * @param elem Containing element on which this attribute + * should be resolved. + */ + virtual void resolve(daeElementRef elem); +}; + + +typedef daeSmartRef daeMetaAttributeRef; + +typedef daeTArray daeMetaAttributeRefArray; +typedef daeTArray daeMetaAttributePtrArray; + +#endif //__DAE_META_ATTRIBUTE_H__ + + + + + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeMetaCMPolicy.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeMetaCMPolicy.h new file mode 100644 index 00000000..83779fbc --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeMetaCMPolicy.h @@ -0,0 +1,120 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#ifndef __DAE_META_CM_POLICY_H__ +#define __DAE_META_CM_POLICY_H__ + +#include +#include +//class daeElement; +class daeMetaElement; + +/** + * The daeMetaCMPolicy class is the base class for the content model policy classes which are used to + * describe the availability and ordering of an element's children. + */ +class daeMetaCMPolicy +{ +public: + /** + * Places an element into the parent element based on this content model policy object. + * @param parent The parent element for which the child element will be placed. + * @param child The new child element. + * @param ordinal A reference to a daeUInt which holds the ordinal return value for a placed child. Used + * to maintain proper ording of child elements. + * @param offset The offset to used when attempting to place this element. Affects comparison against + * minOccurs and maxOccurs. + * @param before The element that the child should appear before. Optional. + * @param after The element that the child should appear after. Optional. + * @return Returns The child element that was placed within this content model object or any of its + * children. NULL if placement failed. + */ + virtual daeElement *placeElement( daeElement *parent, daeElement *child, daeUInt &ordinal, daeInt offset = 0, daeElement* before = NULL, daeElement *after = NULL ) = 0; + /** + * Removes an element from the parent based on this content model object. + * @param parent The parent element for which child you want to remove. + * @param child The child that will be removed from the parent. + * @return Returns true if the child was successfully removed from this content model object or any of + * its children. False otherwise. + */ + virtual daeBool removeElement(daeElement* parent, daeElement* child ) = 0; + /** + * Gets the daeMetaElement of an acceptable child of this content model object. + * @param elementName The name of the element whos metaElement information you are interested in. + * @return Returns a pointer to a daeMetaElement class that describes the element interested in. + * Returns NULL if the element is not valid in this content model. + */ + virtual daeMetaElement *findChild( daeString elementName ) = 0; + /** + * Populates an array with the children of parent based on this content model object. + * @param parent The parent element whos children you want. + * @param array The array where you the children will be appended to. + */ + virtual void getChildren( daeElement* parent, daeElementRefArray &array ) = 0; + + /** + * Adds a child to this content model object. + * @param p The child content model policy object. + */ + void appendChild( daeMetaCMPolicy *p ) { _children.append( p ); } + + /** + * Gets the parent of this content model policy object. + * @return Returns a pointer to the parent node. + */ + daeMetaCMPolicy *getParent() { return _parent; } + + /** + * Sets the maximum ordinal value of this policy objects children. Used to keep proper ording for + * cm objects that may appear multiple times. + * @param ord The maximum ordinal value for this content model object. + */ + void setMaxOrdinal( daeUInt ord ) { _maxOrdinal = ord; } + +protected: + /** + * Constructor. + * @param container The daeMetaElement that this policy object belongs to. + * @param parent The daeMetaCMPolicy parent of this policy object. + * @param odinal The ordinal value offset of this specific policy object. Used for maintaining the + * correct order of child elements. + * @param minO The minimum number of times this CMPolicy object must appear. This value comes from the COLLADA schema. + * @param maxO The maximum number of times this CMPolicy object may appear. This value comes from the COLLADA schema. + */ + daeMetaCMPolicy( daeMetaElement *container ,daeMetaCMPolicy *parent, daeUInt ordinal, + daeInt minO, daeInt maxO ) : _container( container ), _parent( parent ), _minOccurs( minO ), + _maxOccurs( maxO ), _maxOrdinal( 0 ), _ordinalOffset( ordinal ) {} + + /** + * Destructor. + */ +public: // sthomas + virtual ~daeMetaCMPolicy(); +protected: // sthomas + + daeMetaElement * _container; + daeMetaCMPolicy * _parent; + daeTArray _children; + + /** Minimum number of times this meta element can occur. */ + daeInt _minOccurs; + /** Maximum number of times this meta element can occur. -1 for unbounded */ + daeInt _maxOccurs; + + daeUInt _maxOrdinal; + daeUInt _ordinalOffset; + +}; + +#endif + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeMetaChoice.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeMetaChoice.h new file mode 100644 index 00000000..cd640ac7 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeMetaChoice.h @@ -0,0 +1,44 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#ifndef __DAE_META_CHOICE_H__ +#define __DAE_META_CHOICE_H__ + +#include + +/** + * The daeMetaChoice class defines the behavior of an xs:choice content model in the COLLADA Schema. + */ +class daeMetaChoice : public daeMetaCMPolicy +{ +public: + /** + * Constructor. + * @param container The daeMetaElement that this policy object belongs to. + * @param parent The daeMetaCMPolicy parent of this policy object. + * @param odinal The ordinal value offset of this specific policy object. Used for maintaining the + * correct order of child elements. + * @param minO The minimum number of times this CMPolicy object must appear. This value comes from the COLLADA schema. + * @param maxO The maximum number of times this CMPolicy object may appear. This value comes from the COLLADA schema. + */ + daeMetaChoice( daeMetaElement *container, daeMetaCMPolicy *parent = NULL, daeUInt ordinal = 0, daeInt minO = 1, daeInt maxO = 1 ); + ~daeMetaChoice(); + + daeElement *placeElement( daeElement *parent, daeElement *child, daeUInt &ordinal, daeInt offset = 0, daeElement* before = NULL, daeElement *after = NULL ); + daeBool removeElement(daeElement* parent, daeElement* child); + daeMetaElement *findChild( daeString elementName ); + void getChildren( daeElement* parent, daeElementRefArray &array ); +}; + +#endif + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeMetaElement.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeMetaElement.h new file mode 100644 index 00000000..ded428be --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeMetaElement.h @@ -0,0 +1,395 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#ifndef __DAE_META_ELEMENT_H__ +#define __DAE_META_ELEMENT_H__ + +#include +#include +#include +#include + +class daeMetaCMPolicy; +class daeMetaElementArrayAttribute; + +typedef daeElementRef (*daeElementConstructFunctionPtr)(daeInt bytes); + +/** + * Each instance of the @c daeMetaElement class describes a C++ COLLADA dom + * element type. + * @par + * The meta information in @c daeMetaElement is a combination of the information + * required to create and maintain C++ object instances and + * the information necessary to parse and construct a hierarchy of COLLADA + * elements. + * @par + * @c daeMetaElement objects also act as factories for C++ COLLADA dom classes where + * each @c daeElement is capable of creating an instance of the class it describes. + * Further, each @c daeMetaElement contains references to other @c daeMetaElements + * for potential XML children elements. This enables this system to easily + * create @c daeElements of the appropriate type while navigating through XML + * recursive parse. + * @par + * See @c daeElement for information about the functionality that every @c daeElement implements. + */ +class daeMetaElement : public daeElement +{ +protected: + daeStringRef _name; + + daeElementConstructFunctionPtr _createFunc; + daeBool _needsResolve; + daeInt _elementSize; + + daeMetaAttributeRefArray _metaAttributes; + daeMetaAttributeRef _metaValue; + daeMetaElementArrayAttribute* _metaContents; + daeMetaArrayAttribute* _metaContentsOrder; + + daeMetaElement * _metaIntegration; + daeMetaAttributeRef _metaID; + + daeMetaAttributePtrArray _resolvers; + + daeBool _isTrackableForQueries; + daeBool _usesStringContents; + + daeBool _isTransparent; + daeBool _isAbstract; + daeBool _allowsAny; + daeBool _innerClass; + + static daeTArray > &_metas(); + static daeTArray< daeMetaElement** > &_classMetaPointers(); + + daeMetaCMPolicy * _contentModel; + +public: + /** + * Constructor + */ + DLLSPEC daeMetaElement(); + + /** + * Destructor + */ + DLLSPEC ~daeMetaElement(); + +public: // public accessors + + /** + * Determines if elements of this type is an inner class. + * @return Returns true if this element type is an inner class. + */ + daeBool getIsInnerClass() { return _innerClass; } + /** + * Sets if elements of this type are inner classes. + * @param abstract True if this type is an inner class. + */ + void setIsInnerClass( daeBool ic ) { _innerClass = ic; } + /** + * Determines if elements of this type can be placed in the object model. + * @return Returns true if this element type is abstract, false otherwise. + */ + daeBool getIsAbstract() { return _isAbstract; } + /** + * Determines if elements of this type should have an element tag printed when saving. + * @return Returns true if this element type should not have a tag, false otherwise. + */ + daeBool getIsTransparent() { return _isTransparent; } + /** + * Sets if elements of this type are abstract. + * @param abstract True if this type is abstract. + */ + void setIsAbstract( daeBool abstract ) { _isAbstract = abstract; } + /** + * Sets whether or not elements of this type should have an element tag printed when saving. + * @param transparent True if this type is transparent. + */ + void setIsTransparent( daeBool transparent ) { _isTransparent = transparent; } + + /** + * Determines if elements of this type should be tracked + * for daeDatabase queries. + * @return Returns true if this element type should be tracked + */ + daeBool getIsTrackableForQueries() { return _isTrackableForQueries; } + + /** + * Gets whether elements of this type have "string" based + * contents; this is necessary to change the parsing mode for strings. + * @return Returns true if this element type has string contents, false if not. + */ + daeBool getUsesStringContents() { return _usesStringContents; } + + /** + * Sets whether elements of this type should be tracked + * for @c daeDatabase queries. + * @param trackable Indicates whether this element should be tracked. + * A value of true indicates this element type should be tracked and be available for + * database queries. + */ + void setIsTrackableForQueries(daeBool trackable) { + _isTrackableForQueries = trackable; } + + /** + * Determines if elements of this type allow for any element as a child. + * @return Returns true if this element can have any child element, false otherwise. + */ + daeBool getAllowsAny() { return _allowsAny; } + /** + * Sets if elements of this type allow for any element as a child. + * @param allows True if this element allows for any child element, false otherwise. + */ + void setAllowsAny( daeBool allows ) { _allowsAny = allows; } + + /** + * Gets the @c daeMetaElement for the corresponding integration object + * associated with this COLLADA element (if any). + * @return Returns the @c daeMetaElement for the integration object; this can + * be used as a factory. + */ + daeMetaElement* getMetaIntegration() { return _metaIntegration; } + + /** + * Sets the @c daeMetaElement for the corresponding integration object + * associated with this COLLADA element (if any). + * @param mI @c daeMetaElement for the integration object; this is + * used as a factory to automatically create this integration object + * whenever an instance of this element is created. + */ + void setMetaIntegration(daeMetaElement* mI) { _metaIntegration = mI; } + + /** + * Gets the @c daeMetaAttribute for the non-element contents of a @c daeElement. + * This corresponds to a @c daeMetaFloatAttribute, @c daeMetaFloatArrayAttribute, + * et cetera. + * @return Returns the @c daeMetaAttribute pointer for the non-element contents of + * this element type. + */ + daeMetaAttribute* getValueAttribute() { return _metaValue; } + + /** + * Gets the @c daeMetaAttribute for the ID attribute of a @c daeElement. + * @return Returns the ID @c daeMetaAttribute, or NULL if the element type + * does not have an ID attribute. + */ + daeMetaAttribute* getIDAttribute() { return _metaID; } + + /** + * Gets the name of this element type. + * @return Returns the name of this element type. + */ + daeStringRef getName() { return _name; } + + /** + * Sets the name of this element type. + * @param s String name to set. + */ + void setName(daeString s) { _name = s; } + + /** + * Gets the array of attributes that represent URI fields that need + * to be "resolved" after the database is completely read in. + * @return Returns the array of @c daeMetaAttribute*'s with all of the relevant + * attributes. + */ + daeMetaAttributePtrArray& getMetaResolvers() { + return _resolvers; } + + /** + * Gets the array of all known attributes on this element type. + * This includes all meta attributes except those describing child + * elements. It does include the value element. + * @return Returns the array of @c daeMetaAttributeRefs. + */ + daeMetaAttributeRefArray& getMetaAttributes() { + return _metaAttributes; } + + /** + * Gets the attribute which has a name as provided by the s parameter. + * @param s String containing the desired attribute's name. + * @return Returns the corresponding @c daeMetaAttribute, or NULL if none found. + */ + DLLSPEC daeMetaAttribute* getMetaAttribute(daeString s); + + /** + * Sets the size in bytes of each instance of this element type. + * Used for factory element creation. + * @param size Number of bytes for each C++ element instance. + */ + void setElementSize(daeInt size) {_elementSize = size;} + + /** + * Gets the size in bytes of each instance of this element type. + * Used for factory element creation. + * @return Returns the number of bytes for each C++ element instance. + */ + daeInt getElementSize() { return _elementSize;} + +public: + /** + * Registers with the reflective object system that the dom class described by this @c daeMetaElement + * contains a _contents array. This method is @em only for @c daeMetaElement contstuction, and + * should only be called by the system as it sets up the Reflective Object System. + * @param offset Byte offset for the contents field in the C++ element class. + */ + DLLSPEC void addContents(daeInt offset); + /** + * Registers with the reflective object system the array that stores the _contents ordering. This method is @em + * only for @c daeMetaElement contstuction, and should only be called by the system as it sets up the Reflective + * Object System. + * @param offset Byte offset for the contents order array in the C++ element class. + */ + DLLSPEC void addContentsOrder( daeInt offset ); + + /** + * Gets the attribute associated with the contents meta information. + * @see @c addContents() + * @return Returns the @c daeMetaElementArrayAttribute. + */ + daeMetaElementArrayAttribute* getContents() { return _metaContents; } + + /** + * Appends a @c daeMetaAttribute that represents a field corresponding to an + * XML attribute to the C++ version of this element type. + * @param attr Attribute to append to this element types list + * of potential attributes. + */ + DLLSPEC void appendAttribute(daeMetaAttribute* attr); + + /** + * Registers the function that can construct a C++ instance of this class and the + * pointer to the classes static meta. Necessary for the factory system such that C++ + * can still call @c new and the @c vptr will still be initialized even when + * constructed via the factory system. + * @param func Pointer to a function that does object construction. + * @param metaPtr Pointer to the class static meta pointer. + */ + void registerClass(daeElementConstructFunctionPtr func, daeMetaElement** metaPtr = NULL ) { + _createFunc = func; if ( metaPtr != NULL ) _classMetaPointers().append( metaPtr ); } + + /** + * Determines if this element contains attributes + * of type @c daeURI which need to be resolved after they are read + * or setup. + * @return Returns true if this element type requires resolving, false if not. + */ + daeBool needsResolve() { return _needsResolve; } + + /** + * Validates this class to be used by the runtime c++ object model + * including factory creation. + */ + DLLSPEC void validate(); + + /** + * Places a child element into the parent element where the + * calling object is the @c daeMetaElement for the parent element. + * @param parent Element to act as the container. + * @param child Child element to place in the parent. + * @return Returns true if the operation was successful, false otherwise. + */ + DLLSPEC daeBool place(daeElement *parent, daeElement *child, daeUInt *ordinal = NULL); + /** + * Places a child element into the parent element at a specific location + * where the calling object is the @c daeMetaElement for the parent element. + * @param index The location in the contents array to insert. + * @param parent Element to act as the container. + * @param child Child element to place in the parent. + * @return Returns true if the operation was successful, false otherwise. + * @note This should only be called on elements that have a _contents array. Elements without + * a _contents array will be placed normally. + */ + DLLSPEC daeBool placeAt( daeInt index, daeElement *parent, daeElement *child ); + /** + * Places a child element into the parent element at a specific location which is right + * before the marker element. + * @param marker The element location in the contents array to insert before. + * @param parent Element to act as the container. + * @param child Child element to place in the parent. + * @return Returns true if the operation was successful, false otherwise. + */ + DLLSPEC daeBool placeBefore( daeElement* marker, daeElement *parent, daeElement *child, daeUInt *ordinal = NULL ); + /** + * Places a child element into the parent element at a specific location which is right + * after the marker element. + * @param marker The element location in the contents array to insert after. + * @param parent Element to act as the container. + * @param child Child element to place in the parent. + * @return Returns true if the operation was successful, false otherwise. + */ + DLLSPEC daeBool placeAfter( daeElement* marker, daeElement *parent, daeElement *child, daeUInt *ordinal = NULL ); + + /** + * Removes a child element from its parent element. + * @param parent Element That is the parent. + * @param child Child element to remove. + * @return Returns true if the operation was successful, false otherwise. + */ + DLLSPEC daeBool remove( daeElement *parent, daeElement *child ); + /** + * Gets all of the children from an element of this type. + * @param parent The element that you want to get the children from. + * @param array The return value. An elementref array to append this element's children to. + */ + DLLSPEC void getChildren( daeElement* parent, daeElementRefArray &array ); + + /** + * Invokes the factory element creation routine set by @c registerConstructor() + * to return a C++ COLLADA Object Model instance of this element type. + * @return Returns a created @c daeElement of appropriate type via the + * object creation function and the daeElement::setup() function. + */ + DLLSPEC daeElementRef create(); + + /** + * Looks through the list of potential child elements + * for this element type finding the corresponding element type; if a corresponding element type + * is found, use that type as a factory and return an instance of that + * child type. Typically @c place() is called after @c create(childelementname) + * @param childElementTypeName Type name to create. + * @return Returns the created element if the type was found as a potential child element. + */ + DLLSPEC daeElementRef create(daeString childElementTypeName); + + /** + * Gets the root of the content model policy tree. + * @return Returns the root element of the tree of content model policy elements. + */ + daeMetaCMPolicy *getCMRoot() { return _contentModel; } + /** + * Sets the root of the content model policy tree. + * @param cm The root element of the tree of content model policy elements. + */ + DLLSPEC void setCMRoot( daeMetaCMPolicy *cm ); + +public: + + /** + * Releases all of the meta information contained in @c daeMetaElements. + */ + static DLLSPEC void releaseMetas(); + + static const daeTArray > &getAllMetas() { return _metas(); } +}; + +typedef daeSmartRef daeMetaElementRef; +typedef daeTArray daeMetaElementRefArray; + +#endif //__DAE_META_ELEMENT_H__ + + + + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeMetaElementAttribute.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeMetaElementAttribute.h new file mode 100644 index 00000000..3ebdc7ae --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeMetaElementAttribute.h @@ -0,0 +1,189 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#ifndef __DAE_META_ELEMENT_ATTRIBUTE_H__ +#define __DAE_META_ELEMENT_ATTRIBUTE_H__ + +#include +#include +#include + +class daeMetaElement; +class daeElement; +class daeDocument; + +/** +* The @c daeMetaElementAttribute class represents a content model object that is an element. +*/ +class daeMetaElementAttribute : public daeMetaAttribute, public daeMetaCMPolicy +{ +public: + /** The metaElement that describes the element type of this attribute */ + daeMetaElement* _elementType; + +public: + /** + * Constructor. + * @param container The daeMetaElement that this policy object belongs to. + * @param parent The daeMetaCMPolicy parent of this policy object. + * @param odinal The ordinal value offset of this specific policy object. Used for maintaining the + * correct order of child elements. + * @param minO The minimum number of times this CMPolicy object must appear. This value comes from the COLLADA schema. + * @param maxO The maximum number of times this CMPolicy object may appear. This value comes from the COLLADA schema. + */ + daeMetaElementAttribute( daeMetaElement *container, daeMetaCMPolicy *parent = NULL, daeUInt ordinal = 0, daeInt minO = 1, daeInt maxO = 1); + /** + * Destructor + */ + virtual ~daeMetaElementAttribute(); + +public: + + virtual daeElement *placeElement(daeElement* parent, daeElement* child, daeUInt &ordinal, daeInt offset = 0, daeElement* before = NULL, daeElement *after = NULL); + virtual daeBool removeElement(daeElement* parent, daeElement* child); + + daeMetaElement *findChild( daeString elementName ); + + virtual void getChildren( daeElement* parent, daeElementRefArray &array ); + +public: + /** + * Sets the element type for the element that this attribute points to. + * @param elementType @c daeMetaElement representing the type. + */ + void setElementType(daeMetaElement *elementType) { + _elementType = elementType; } + + /** + * Gets the element type for the element that this attribute points to. + * @return Returns the @c daeMetaElement representing the type. + */ + daeMetaElement* getElementType() { return _elementType; } + + /** + * Sets the database document associated with this element. + * @param parent The daeElement to set the document. + * @param c The @c daeDocument to associate with this element. + */ + virtual void setDocument(daeElement *parent, daeDocument* c ); + inline void setCollection(daeElement *parent, daeDocument* c ) { + setDocument( parent, c ); + } + + /** + * Gets the number of elements associated with this attribute in instance e. + * @param e Containing element to run the operation on. + * @return Returns the number of elements associated with this attribute + * in instance e. + */ + virtual daeInt getCount(daeElement* e); + + /** + * Gets an element from containing element e based on index. + * @param e Containing element from which to get the element. + * @param index Index of the element to retrieve if indeed + * there is an array of elements rather than a singleton. + * @return Returns the associated element out of parent element e, based on index, if necessary. + */ + virtual daeMemoryRef get(daeElement* e, daeInt index); + + /** + * Defines the override version of base method. + * @param element Element on which to set this attribute. + * @param s String containing the value to be converted via the + * atomic type system. + */ + virtual void set(daeElement* element, daeString s); + /** + * Defines the override version of base method. + * @param toElement Pointer to a @c daeElement to copy this attribute to. + * @param fromElement Pointer to a @c daeElement to copy this attribute from. + */ + virtual void copy(daeElement* toElement, daeElement* fromElement); + + /** + * Gets if this attribute is an array attribute. + * @return Returns true if this attribute is an array type. + */ + virtual daeBool isArrayAttribute() { return false; } +}; +typedef daeSmartRef daeMetaElementAttributeRef; +typedef daeTArray daeMetaElementAttributeArray; + + +/** + * The @c daeMetaElementArrayAttribute class is similar to daeMetaElementAttribute + * except that this meta attribute describes an array of elements rather than a singleton. + */ +class daeMetaElementArrayAttribute : public daeMetaElementAttribute +{ +public: + /** + * Constructor. + * @param container The daeMetaElement that this policy object belongs to. + * @param parent The daeMetaCMPolicy parent of this policy object. + * @param odinal The ordinal value offset of this specific policy object. Used for maintaining the + * correct order of child elements. + * @param minO The minimum number of times this CMPolicy object must appear. This value comes from the COLLADA schema. + * @param maxO The maximum number of times this CMPolicy object may appear. This value comes from the COLLADA schema. + */ + daeMetaElementArrayAttribute(daeMetaElement *container, daeMetaCMPolicy *parent = NULL, daeUInt ordinal = 0, daeInt minO = 1, daeInt maxO = 1); + ~daeMetaElementArrayAttribute(); +public: + virtual daeElement *placeElement(daeElement* parent, daeElement* child, daeUInt &ordinal, daeInt offset = 0, daeElement* before = NULL, daeElement *after = NULL); + virtual daeBool removeElement(daeElement* parent, daeElement* child); + + void getChildren( daeElement* parent, daeElementRefArray &array ); + + /** + * Sets the database document associated with this element. + * @param c The @c daeDocument to associate with this element. + */ + virtual void setDocument(daeElement *parent, daeDocument* c ); + inline void setCollection(daeElement *parent, daeDocument* c ) { + setDocument( parent, c ); + } + + /** + * Defines the override version of this method from @c daeMetaElement. + * @param e Containing element to run the operation on. + * @return Returns the number of particles associated with this attribute + * in instance e. + */ + virtual daeInt getCount(daeElement* e); + /** + * Defines the override version of this method from @c daeMetaElement. + * @param e Containing element from which to get the element. + * @param index Index of the particle to retrieve if indeed + * there is an array of elements rather than a singleton. + * @return Returns the associated particle out of parent element e, based on index, if necessary. + */ + virtual daeMemoryRef get(daeElement* e, daeInt index); + /** + * Defines the override version of this method from @c daeMetaElement. + * @param toElement Pointer to a @c daeElement to copy this attribute to. + * @param fromElement Pointer to a @c daeElement to copy this attribute from. + */ + virtual void copy(daeElement* toElement, daeElement* fromElement); + + /** + * Gets if this attribute is an array attribute. + * @return Returns true if this attribute is an array type. + */ + virtual daeBool isArrayAttribute() { return true; } +}; +typedef daeSmartRef daeMetaElementArrayAttributeRef; +typedef daeTArray daeMetaElementArrayAttributeArray; + +#endif + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeMetaGroup.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeMetaGroup.h new file mode 100644 index 00000000..f03d12a6 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeMetaGroup.h @@ -0,0 +1,55 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#ifndef __DAE_META_GROUP_H__ +#define __DAE_META_GROUP_H__ + +#include + +class daeMetaElementAttribute; + +/** + * The daeMetaGroup class defines the behavior of an xs:group ref content model from the COLLADA Schema. + */ +class daeMetaGroup : public daeMetaCMPolicy +{ +public: + /** + * Constructor. + * @param econ The daeMetaElementAttribute that represents the group element in the parent. + * @param container The daeMetaElement that this policy object belongs to. + * @param parent The daeMetaCMPolicy parent of this policy object. + * @param odinal The ordinal value offset of this specific policy object. Used for maintaining the + * correct order of child elements. + * @param minO The minimum number of times this CMPolicy object must appear. This value comes from the COLLADA schema. + * @param maxO The maximum number of times this CMPolicy object may appear. This value comes from the COLLADA schema. + */ + daeMetaGroup( daeMetaElementAttribute *econ, daeMetaElement *container, daeMetaCMPolicy *parent = NULL, + daeUInt ordinal = 0, daeInt minO = 1, daeInt maxO = 1 ); + + /** + * Destructor. + */ + ~daeMetaGroup(); + + daeElement *placeElement( daeElement *parent, daeElement *child, daeUInt &ordinal, daeInt offset = 0, daeElement* before = NULL, daeElement *after = NULL ); + daeBool removeElement(daeElement* parent, daeElement* child); + daeMetaElement *findChild( daeString elementName ); + void getChildren( daeElement* parent, daeElementRefArray &array ); + +protected: + daeMetaElementAttribute *_elementContainer; +}; + +#endif + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeMetaSequence.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeMetaSequence.h new file mode 100644 index 00000000..b2028b47 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeMetaSequence.h @@ -0,0 +1,51 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#ifndef __DAE_META_SEQUENCE_H__ +#define __DAE_META_SEQUENCE_H__ + +#include + +/** + * The daeMetaSequence class defines the behavior of an xs:sequence content model in the COLLADA Schema. + */ +class daeMetaSequence : public daeMetaCMPolicy +{ +public: + /** + * Constructor. + * @param container The daeMetaElement that this policy object belongs to. + * @param parent The daeMetaCMPolicy parent of this policy object. + * @param odinal The ordinal value offset of this specific policy object. Used for maintaining the + * correct order of child elements. + * @param minO The minimum number of times this CMPolicy object must appear. This value comes from the COLLADA schema. + * @param maxO The maximum number of times this CMPolicy object may appear. This value comes from the COLLADA schema. + */ + daeMetaSequence( daeMetaElement *container, daeMetaCMPolicy *parent = NULL, daeUInt ordinal = 0, daeInt minO = 1, daeInt maxO = 1 ); + + /** + * Destructor. + */ + ~daeMetaSequence(); + + daeElement *placeElement( daeElement *parent, daeElement *child, daeUInt &ordinal, daeInt offset = 0, daeElement* before = NULL, daeElement *after = NULL ); + daeBool removeElement(daeElement* parent, daeElement* child); + daeMetaElement *findChild( daeString elementName ); + void getChildren( daeElement* parent, daeElementRefArray &array ); + +}; + + +#endif + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeSIDResolver.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeSIDResolver.h new file mode 100644 index 00000000..88b8e654 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeSIDResolver.h @@ -0,0 +1,149 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#ifndef __DAE_SIDRESOLVER_H__ +#define __DAE_SIDRESOLVER_H__ + +#include +#include + +/** + * The daeSIDResolver class is designed to resolve sid references within a COLLADA document. + * The rules for sid resolution are set forth by the Addressing Syntax section in Chapter 3 of the + * COLLADA specification which can be found at https://www.khronos.org/collada . + * This resolver always attempts to resolve to the daeElement which is referenced. If the element contains + * a daeDoubleArray (domFloatArray) value, the resolver will set the pointer to that array. The + * resolver will also do this if the sid target points to a element which has a as + * a child. If the sid target specifies a value, i.e. blah.X or blah(6), the resolver will attempt to + * get a pointer to that specific value. The resolver only attempts to resolve to that level for values which + * are defined in the COMMON profile glossary of the COLLADA specification, or values reference with the (#) + * syntax. You can check the return value from getState() to see which level of resolution is possible. + */ +class daeSIDResolver +{ +public: + /** + * An enum describing the status of the SID resolution process. + */ + DLLSPEC enum ResolveState{ + /** No target specified */ + target_empty, + /** target specified but not resolved */ + target_loaded, + /** Resolution failed because target was not found */ + sid_failed_not_found, + /** Resolution successful to the Element level */ + sid_success_element, + /** Resolution successful to the Double Array level */ + sid_success_array, + /** Resolution successful to the Double level */ + sid_success_double + }; + + /** + * Constructor. + * @param container The element which contains the target that you want to resolve. + * @param target The target string which needs to be resolved. + * @param platform The platform name of the technique to use. A NULL value indicates the common platform. + */ + DLLSPEC daeSIDResolver( daeElement *container, daeString target, daeString platform = NULL ); + + /** + * Destructor. + */ + DLLSPEC ~daeSIDResolver(); + + /** + * Gets the target string. + * @return Returns the target string of this SID resolver. + */ + daeString getTarget() const { return target; } + /** + * Sets the target string. + * @param t The new target string for this resolver. + */ + DLLSPEC void setTarget( daeString t ); + + /** + * Gets the name of the profile to use when resolving. + * @return Returns the name of the profile or NULL for the common profile. + */ + daeString getProfile() const { return profile; } + /** + * Sets the profile to use when resolving. + * @param p The profile name of the technique to use. A NULL value indicates the common profile. + */ + DLLSPEC void setProfile( daeString p ); + + /** + * Gets a pointer to the @c daeElement that contains the target to resolve. + * @return Returns the pointer to the containing daeElmement. + */ + daeElement* getContainer() const { return container; } + /** + * Sets the pointer to the @c daeElement that contains the target to resolve. + * @param element Pointer to the containing @c daeElmement. + */ + DLLSPEC void setContainer(daeElement* element); + + /** + * Gets the resolution state. + * @return Returns the current state of SID resolution. + */ + ResolveState getState() const { return state; } + + /** + * Gets the element that this SID resolves to. + * @return Returns the element that the URI resolves to. + */ + DLLSPEC daeElementRef getElement(); + + /** + * Gets the value array of the element that the SID resolves to. + * @return Returns a pointer to the value array that the SID resolves to + * @note The daeSIDResolver can only resolve to this level for daeDoubleArray values. + */ + DLLSPEC daeDoubleArray *getDoubleArray(); + + /** + * Gets a pointer to the particle this target resolved to. + * @return Returns a pointer to a double value which is the fully resolved target. + * @note The daeSIDResolver can only resolve to this level for domDouble values and only if the + * final symbolic name is from the COMMON profile or a cardinal value is specified. + * @note The daeSIDResolver assumes the value is a 4x4 matrix if there are 2 cardinal values specified. + */ + DLLSPEC daeDouble *getDouble(); + +private: + + void resolve(); + /** + * Recursive function which will find an element with specified sid in the subtree of el. + */ + daeElement *findSID( daeElement *el, daeString sid ); + +private: + + daeString target; + daeString profile; + daeElement *container; + ResolveState state; + + daeElement *element; + daeDoubleArray *doubleArray; + daeDouble *doublePtr; + +}; + +#endif + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeSmartRef.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeSmartRef.h new file mode 100644 index 00000000..7f6cdf5d --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeSmartRef.h @@ -0,0 +1,156 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#ifndef __DAE_SMARTREF_H__ +#define __DAE_SMARTREF_H__ + +#include +#include + +template class daeElementWrapper {}; + +/** + * The @c daeSmartRef template class automates reference counting for + * objects derived from @c daeElement. + */ +template class daeSmartRef +{ +public: + /** + * Constructor + */ + inline daeSmartRef() : _ptr((T*) NULL){} + + /** + * Destructor + */ + inline ~daeSmartRef() { + daeElement::release((daeElement*)_ptr); } + + /** + * Constructor that will convert from one template to the other. + * unimplemented. + * @param + */ + template + inline daeSmartRef(const daeElementWrapper&) : _ptr(U::instance()) {} + + /** + * Copy Constructor that will convert from one template to the other. + * @param smartRef a daeSmartRef to the object to copy from. + */ + template + inline daeSmartRef(const daeSmartRef& smartRef) : _ptr(smartRef.cast()){ + daeElement::ref((const daeElement*)_ptr); } + + /** + * Function that returns a pointer to object being reference counted. + * @return the object being reference counted. + */ + inline T* cast() const { return _ptr; } + + /** + * Copy Constructor. + * @param smartRef a daeSmartRef of the same template type to copy from + */ + inline daeSmartRef(const daeSmartRef& smartRef) : _ptr(smartRef._ptr){ + daeElement::ref((const daeElement*)_ptr); } + + /** + * Constructor + * @param ptr a pointer to an object of the same template type. + */ + inline daeSmartRef(T* ptr) : _ptr(ptr) { + daeElement::ref((const daeElement*)_ptr); } + + /** + * Overloaded assignment operator which will convert between template types. + * @return Returns a reference to this object. + * @note Unimplemented + */ + template + inline const daeSmartRef& operator=(const daeElementWrapper&){ + daeElement::release((const daeElement*)_ptr); + _ptr = U::instance(); + return *this; } + + /** + * Overloaded assignment operator which will convert between template types. + * @param smartRef a daeSmartRef to the object to copy from. + * @return Returns a reference to this object. + */ + template + inline const daeSmartRef& operator=(const daeSmartRef& smartRef) { + T* ptr = smartRef.cast(); + daeElement::ref((const daeElement*)ptr); + daeElement::release((const daeElement*)_ptr); + _ptr = ptr; + return *this; } + + /** + * Overloaded assignment operator. + * @param other a daeSmartRef to the object to copy from. Must be of the same template type. + * @return Returns a reference to this object. + */ + inline const daeSmartRef& operator=(const daeSmartRef& other) { + T* ptr = other._ptr; + daeElement::ref((const daeElement*)ptr); + daeElement::release((const daeElement *)_ptr); + _ptr = ptr; + return *this; } + + /** + * Overloaded assignment operator. + * @param ptr a pointer to the object to copy from. Must be of the same template type. + * @return Returns a reference to this object. + */ + inline const daeSmartRef& operator=(T* ptr) { + daeElement::ref((const daeElement*)ptr); + daeElement::release((const daeElement*)_ptr); + _ptr = ptr; + return *this; } + + /** + * Overloaded member selection operator. + * @return a pointer of the template class to the object. + */ + inline T* operator->() const { + assert (_ptr != (T*)NULL); return _ptr; } + + /** + * Overloaded cast operator. + * @return a pointer of the template class to the object. + */ + inline operator T*() const { + return _ptr; } + + /** + * Static cast function. + * @param smartRef a smartRef to cast from + * @return a pointer to an object of this template class + */ + template + inline static T* staticCast(const daeSmartRef& smartRef) { + return static_cast(smartRef.cast()); } + +private: + /* The pointer to the element which is being reference counted */ + T* _ptr; +}; + +#endif // __DAE_SMARTREF_H__ + + + + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeStringRef.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeStringRef.h new file mode 100644 index 00000000..3cc5bce3 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeStringRef.h @@ -0,0 +1,108 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#ifndef __DAE_STRING_REF_H__ +#define __DAE_STRING_REF_H__ + +#include +#include + +/** + *Defines the @c daeStringRef class. + */ +class daeStringRef +{ +public: + /** + * Macro that defines new and delete overrides for this class + */ + DAE_ALLOC; +private: + daeString _string; + static daeStringTable &_stringTable(); +public: + + /** + * Destructor + */ + inline ~daeStringRef() { _string = NULL; } + + /** + * Constructor + */ + inline daeStringRef() { _string = NULL; } + + /** + * Constructor that copies from another @c daeStringRef. + * @param other Reference to copy from. + */ + inline daeStringRef(const daeStringRef& other) { + _string = other._string; } + + /** + * Constructor that creates from a const char *. + * @param string External string to create from. + */ + DLLSPEC daeStringRef(daeString string); + + /** + * Assignment operator. + * @param other The daeStringRef to copy. + * @return A reference to this object. + */ + inline const daeStringRef& operator= (const daeStringRef& other) { + _string = other._string; + return *this; + } + + /** + * Sets a string from an external const char *. + * @param string The daeString to copy. + * @return A reference to this object. + */ + DLLSPEC const daeStringRef& set(daeString string); + + /** + * Assignment operator from an external const char *. + * @param string The daeString to copy. + * @return A reference to this object. + */ + DLLSPEC const daeStringRef& operator= (daeString string); + + /** + * Cast operator that returns a const char *. + */ + inline operator daeString() const { return _string; } + + /** + * Comparison operator, the comparison is done via pointers as both + * strings will have same pointer if they are the same address + * @param other The daeStringRef to compare + * @return True if strings are equal. False otherwise. + */ + inline bool operator==(const daeStringRef& other) const{ + //return (other._string == _string); } + return (!strcmp(other._string, _string)); } + +//Contributed by Nus - Wed, 08 Nov 2006 + /** + * Release string table... + */ + static void releaseStringTable(void); +//-------------------- +}; + +typedef daeTArray daeStringRefArray; +typedef daeTArray daeStringRefArrayArray; + +#endif //__DAE_STRING_REF_H__ diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeStringTable.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeStringTable.h new file mode 100644 index 00000000..c8abc669 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeStringTable.h @@ -0,0 +1,64 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#ifndef __DAE_STRING_TABLE_H__ +#define __DAE_STRING_TABLE_H__ +#include +#include + +/** + * The @c daeStringTable is a simple string table class to hold a float list of strings + * without a lot of allocations. + */ +class daeStringTable +{ +public: // allocate/construct/destruct/deallocate + /** + * Macro that defines new and delete overrides for this class + */ + DAE_ALLOC; + /** + * Constructor which specifies fixed buffer size. + * @param stringBufferSize The size of the buffer to create for string allocation. + */ + DLLSPEC daeStringTable(int stringBufferSize = 1024*1024); + + /** + * Destructor. + */ + ~daeStringTable() { clear(); } + +public: // INTERFACE + /** + * Allocates a string from the table. + * @param string const char * to copy into the table. + * @return Returns an allocated string. + */ + DLLSPEC daeString allocString(daeString string); + + /** + * Clears the storage. + */ + DLLSPEC void clear(); + +private: // MEMBERS + size_t _stringBufferSize; + size_t _stringBufferIndex; + daeStringArray _stringBuffersList; + + daeString allocateBuffer(); + + daeString _empty; +}; + +#endif //__DAE_STRING_TABLE_H__ diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeTypes.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeTypes.h new file mode 100644 index 00000000..b90db0b2 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeTypes.h @@ -0,0 +1,70 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#ifndef __DAE_TYPES_H__ +#define __DAE_TYPES_H__ + +#ifdef WIN32 + #pragma warning(disable : 4324) // disable padding warning + #pragma warning(disable:4530) // Disable the exception disable but used in MSCV Stl warning. + #pragma warning(disable:4996) //Turn off warnings about deprecated C routines + #pragma warning(disable:4786) // Disable the "debug name too long" warning + #pragma warning(disable:4244) // Disable the "possible loss of data" warning + #pragma warning(disable:4018) // signed/unsigned int mismatch + #pragma warning(disable:4267) // possible loss of data + #pragma warning(disable:4530) // C++ exception handler used + +#include +#elif defined( __GCC__ ) +#include +#else +#include +#endif +#include +#include +#include +#include +#include +#include + +#include + +#define daeOffsetOf(class, member) \ + ((size_t)&(((class*)0x0100)->member) - (size_t)0x0100) + +typedef PLATFORM_INT8 daeChar; +typedef PLATFORM_INT16 daeShort; +typedef PLATFORM_INT32 daeInt; +typedef PLATFORM_INT64 daeLong; +typedef PLATFORM_UINT8 daeUChar; +typedef PLATFORM_UINT16 daeUShort; +typedef PLATFORM_UINT32 daeUInt; +typedef PLATFORM_UINT64 daeULong; +typedef PLATFORM_FLOAT32 daeFloat; +typedef PLATFORM_FLOAT64 daeDouble; + +// base types + +typedef const char* daeString; +typedef bool daeBool; +typedef const void* daeConstRawRef; +typedef void* daeRawRef; +typedef daeInt daeEnum; +typedef daeChar* daeMemoryRef; + +typedef daeChar daeFixedName[512]; + +#include +#include + +#endif //__DAE_TYPES_H__ diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeURI.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeURI.h new file mode 100644 index 00000000..fccd21da --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeURI.h @@ -0,0 +1,506 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#ifndef __DAE_URI_H__ +#define __DAE_URI_H__ + +#include +#include + +//Contributed by Nus - Wed, 08 Nov 2006 +/** + * Initializing URI. + */ +extern "C" void initializeURI(void); + +/** + * Terminating URI. + */ +extern "C" void terminateURI(void); +//------------------------- + +/** + * The @c daeURI is a simple class designed to aid in the parsing and resolution + * of URI references inside COLLADA elements. + * A @c daeURI is created for every @c anyURL and @c IDREF in the COLLADA schema. + * For example, the element has the url= attribute of type @c anyURL, and the + * element has the target= attribute of type @c IDREF. + * The @c daeURI class contains a URI string; the @c setURI() method breaks the string into + * its components including protocol, authority, path (directory), and ID. + * It also has the capability to attempt to resolve this reference + * into a @c daeElement, through the method @c resolveElement(). + * If a @c daeURI is stored within a @c daeElement, it fills + * its container field to point to the containing element. + * + * The main API on the @c daeURI, @c resolveElement(), uses a @c daeURIResolver + * to search for the @c daeElement inside a @c daeDatabase. + * + * URIs are resolved hierarchically, where each URI is resolved based on + * the following criteria via itself and its element's base URI, which represents the + * URI of the document that contains the element, retrieved by + * daeElement::getBaseURI(). + * If no base URI is provided, then the application URI + * is used as a base. + * + * The URI resolution order for the COLLADA DOM is as follows: + * - Absolute URI is specified (see definition below): + * The URI ignores its parent/base URI when validating. + * - Relative URI is specified: + * The URI uses the base URI to provide the protocol, authority, and base path. + * This URI's path is appended to the path given the the base URI. + * This URI's file and ID are used. + * - Each level of URI is resolved in this way against the base URI of the + * containing file until the top level is reached. Then the application URI + * is used as the default. + * + * Definition of Absolute URI: + * For the purposes of the COLLADA DOM, a URI is considered absolute + * if it starts by specifying a protocol. + * For example, + * - file://c:/data/foo.dae#myScene is an absolute URI. + * - foo.dae#myScene is relative. + * - foo.dae is a top-level file reference and is relative. + * If the URI does not include a pound sign (#), the id is empty. + */ +class daeURI +{ +private: + void internalSetURI(daeString uri); + +public: + /** + * An enum describing the status of the URI resolution process. + */ + DLLSPEC enum ResolveState{ + /** No URI specified */ + uri_empty, + /** URI specified but unresolved */ + uri_loaded, + /** Resolution pending */ + uri_pending, + /** Resolution successful */ + uri_success, + /** Failure due to unsupported URI scheme */ + uri_failed_unsupported_protocol, + /** Failure because the file was not found */ + uri_failed_file_not_found, + /** Failure because the ID was not found */ + uri_failed_id_not_found, + /** Failure due to an invalid ID */ + uri_failed_invalid_id, + /** A flag specifying that the URI should be resolved locally to its own document */ + uri_resolve_local, + /** A flag specifying that the URI should be resolved using this relative URI */ + uri_resolve_relative, + /** A flag specifying that the URI should be resolved using this absolute URI */ + uri_resolve_absolute, + /** Failure due to an invalid reference */ + uri_failed_invalid_reference, + /** Failure due to an external error */ + uri_failed_externalization, + /** Failure due to missing document */ + uri_failed_missing_container, + /** Failure because autmoatic loading of a document is turned off */ + uri_failed_external_document + }; + +private: + /** Resolved version of the URI */ + daeString uriString; + + /** Original URI before resolution */ + daeString originalURIString; + + // Parceled out of storage as const char*'s + /** Protocol substring parsed from the URI */ + daeString protocol; + /** authority substring parsed from the URI */ + daeString authority; + /** Path substring parsed from the URI */ + daeString filepath; + /** File name substring parsed from the URI */ + daeString file; + /** Id substring parsed from the URI */ + daeString id; + /** Extension parsed from the filename in the URI */ + daeString extension; + /** Reference to the element that the URI resolves to in memory */ + daeElementRef element; + /** Pointer to the element that owns this URI */ + daeElement* container; + /** Current resolver state of the URI */ + ResolveState state; + /** Flag for if this URI references an external element. */ + daeBool external; + +public: + /** + * Constructs a daeURI object that contains no URI reference. + */ + DLLSPEC daeURI(); + /** + * Destructor + */ + DLLSPEC ~daeURI(); + + /** + * Constructs a daeURI object that points to the application's current working + * directory. + * @param dummy An integer value that has no meaning. + * @note This is used only to initialize the Application URI. It's a simple + * workaround to insure that the ApplicationURI is initialized only once and before the user can call + * daeURI::setBaseURI() (so when we initialize ApplicationURI there is no chance of wiping out a user value). + */ + DLLSPEC daeURI(int dummy); + + /** + * Constructs a daeURI object from a URI passed in as a string. + * @param URIString Passed to setURI() automatically. + * @param nofrag If true, the fragment part of the URI is stripped off before construction. + */ + DLLSPEC daeURI(daeString URIString, daeBool nofrag = false); + + /** + * Constructs a daeURI object using a baseURI and a uriString. + * Calls setURI(URIString), and @c validate(baseURI). + * @param baseURI Base URI to resolve against. + * @param URIString String designating this URI. + */ + DLLSPEC daeURI(daeURI& baseURI, daeString URIString); + + /** + * Constructs a daeURI object based on a simple copy from an existing @c daeURI. + * @param constructFromURI URI to copy into this one. + */ + DLLSPEC daeURI(daeURI& constructFromURI); + + /** + * Gets the ID string parsed from the URI. + * @return Returns a pointer to the string. + */ + inline daeString getID(){return(id);}; + + /** + * Gets the file string parsed from the URI. + * @return Returns a pointer to the string. + */ + inline daeString getFile(){return(file);}; + + /** + * Gets the path string to the file, without the path name, parsed from the URI. + * @return Returns a pointer to the string. + */ + inline daeString getFilepath(){return(filepath);}; + + /** + * Gets the protocol string parsed from the URI. + * @return Returns a pointer to the string. + */ + inline daeString getProtocol(){return(protocol);}; + + /** + * Gets the authority string parsed from the URI. + * @return Returns a pointer to the string. + */ + inline daeString getAuthority(){return(authority);}; + + /** + * Gets the extension string parsed from the URI. + * @return Returns a pointer to the string. + */ + inline daeString getExtension(){return(extension);}; + + /** + * Gets the element that this URI resolves to in memory. + * @return Returns a ref to the element. + */ + inline daeElementRef getElement(){return(element);}; + + /** + * Gets the element that this URI resolves to in memory. + * @return Returns a ref to the element. + */ + inline daeElementConstRef getElement() const {return(element);}; + + /** + * Sets the element that this URI resolves to in memory. + * @param newref A ref to the element. + */ + inline void setElement(daeElementRef newref){element=newref;}; + + /** + * Gets the resolve state of the URI. + * @return Returns the current state. + * @note This will be removed when daeURI starts managing its state internally. + */ + inline ResolveState getState() const {return(state);}; + + /** + * Sets the resolve state of the URI. + * @param newState The new state. + * @note This will be removed when daeURI starts managing its state internally. + */ + inline void setState(ResolveState newState){state=newState;}; + + /** + * Gets a pointer to the @c daeElement that contains this URI. + * @return Returns the pointer to the containing daeElmement. + */ + inline daeElement* getContainer() const {return(container);}; + + /** + * Sets the pointer to the @c daeElement that contains this URI. + * @param element Pointer to the containing @c daeElmement. + */ + inline void setContainer(daeElement* element){container=element;}; + + /** + * Copies parameter uri into data member uriString, and then decomposes each of + * protocol, authority, filepath, file, and id. + * After @c setURI(), the state is set to @c uri_loaded. + * @param uri String to use to configure this URI. + */ + DLLSPEC void setURI(daeString uri); + + /** + * Gets the URI stored in the daeURI. + * @return Returns the full URI String, from uriString. + */ + DLLSPEC daeString getURI() const; + + /** + * Gets the original URI String as originally set, not flattened against the base URI. + * @return Returns the original URI String as originally set, not flattened against the base URI. + */ + DLLSPEC daeString getOriginalURI() const; + + /** + * Gets if this URI resolves to an element that is not contained in the same document as the URI. + * @return Returns true if the URI references an external element. False otherwise. + */ + daeBool isExternalReference() const { return external; } + + /** + * Uses the @c daeURIResolver static API to try to resolve this URI + * into a @c daeElement reference, placing the resolved element into element. + * This function can effectively force a load of a file, perform + * a database query, and so on, based on the @c daeURIResolver plugins implemented. + */ + DLLSPEC void resolveElement(daeString typeNameHint = NULL); + + /** + * Configures the uriString for this @c daeURI based on the element set in element. + * Uses the element's base URI and ID information to configure + * the URI string. + */ + DLLSPEC void resolveURI(); + + /** + * Flattens this URI with base URI to obtain a useable + * complete URI for resolution. + * @param baseURI Base URI to flatten against if this URI is + * relative. + * @note After @c validate(), state is @c uri_pending as it is awaiting a call to + * @c resolveElement(). + */ + DLLSPEC void validate(daeURI* baseURI = NULL); + + /** + * Copies the URI specified in from into @c this. + * Performs a simple copy without validating the URI. + * @param from URI to copy from. + */ + DLLSPEC void copyFrom(daeURI& from); + + /** + * Outputs all components of this URI to stderr. + * Useful for debugging URIs, this outputs each part of the URI separately. + */ + DLLSPEC void print(); + + /** + * Makes the "originalURI" in this URI relative to some other uri + * @param uri the URI to make "this" relative to. + * @note this is experimental and not fully tested, please don't use in critical code yet. + */ + DLLSPEC int makeRelativeTo(daeURI* uri); + + /** + * Comparison operator. + * @return Returns true if URI's are equal. + */ + inline bool operator==(const daeURI& other) const{ + return (!strcmp(other.getURI(), getURI())); } + + daeURI &operator=( const daeURI& other) { + setURI(other.getOriginalURI()); + element = other.element; + state = other.state; + return *this; + } + +private: + /** + * Resets this URI; frees all string references + * and returns state to @c empty. + */ + void reset(); + + /** + * Provides a shared initialization for all constructors + */ + void initialize(); +public: + /** + * Gets the path part of the URI, including everything from immediately after the authority up to and + * including the file name, but not the query or fragment. + * @param dest The user allocated buffer that will receive the path. + * @param size The size of the buffer. + * @return Returns true for success, false if the path exceeded the size of the user provided buffer. + */ + DLLSPEC daeBool getPath(daeChar *dest, daeInt size); + +public: + /** + * Sets the application's default base URI. This is effectively the default protocol, + * authority, and path in the case of top-level relative URIs. + * @param uri Base URI to use as the default application URI. + */ + static DLLSPEC void setBaseURI(daeURI& uri); + + /** + * Gets the application's default base URI. + * @return Returns the base URI used in the case of top-level relative URIs. + */ + static DLLSPEC daeURI* getBaseURI(); + + /** + * Performs RFC2396 path normalization. + * @param path Path to be normalized. + */ + static DLLSPEC void normalizeURIPath(char *path); + +}; + +class daeURIResolver; +typedef daeTArray daeURIResolverPtrArray; + +/** + * The @c daeURIResolver class is the plugin point for URI resolution. + * This class is an abstract base class that defines an interface for + * resolving URIs. + * All instances of @c daeURIResolvers are tracked centrally. + * Every URI is passed through this list of @c daeURIResolvers for resolution. + * Before a @c daeURIResolver receives a URI, the API checks whether it supports + * the protocol. + * The list is ordered on a first come, first serve basis, and resolution + * terminates after any resolver instance resolves the URI. + */ +class daeURIResolver +{ +public: + /** + * This base constructor appends @c this to KnownResolvers list. + */ + DLLSPEC daeURIResolver(); + + /** + * Destructor + */ + virtual DLLSPEC ~daeURIResolver(); + +protected: + static daeURIResolverPtrArray &_KnownResolvers(); + + static daeBool _loadExternalDocuments; + +public: + /** + * Iterates through known resolvers + * calling @c isProtocolSupported() and, if it is supported, calling + * @c resolveElement(). + * @param uri @c daeURI to resolve. + */ + static DLLSPEC void attemptResolveElement(daeURI &uri, daeString typeNameHint = NULL); + + /** + * Iterates through known resolvers + * calling @c isProtocolSupported() and, if it is supported, calling + * @c resolveURI(). + * @param uri @c daeURI to resolve. + */ + static DLLSPEC void attemptResolveURI(daeURI &uri); + + /** + * Sets a flag that tells the URI resolver whether or not to load a separate document if a URI + * being resolved points to one. + * @param load Set to true if you want the URI Resolver to automatically load other documents to + * resolve URIs. + */ + static DLLSPEC void setAutoLoadExternalDocuments( daeBool load ); + + /** + * Gets a flag that tells if the URI resolver is set to load an external document if a URI + * being resolved points to one. + * @return Returns true if the resolver will automatically load documents to resolve a URI. + * False otherwise. + */ + static DLLSPEC daeBool getAutoLoadExternalDocuments(); + +public: // Abstract Interface + /** + * Provides an abstract interface for converting a @c daeURI into a @c daeElement + * @param uri @c daeURI to resolve. + * @return Returns true if the @c daeURIResolver successfully resolved the URI, + * returns false otherwise. + */ + virtual DLLSPEC daeBool resolveElement(daeURI& uri, daeString typeNameHint = NULL) = 0; + /** + * Provides an abstract interface for converting a @c daeElement into a @c daeURI + * @param uri @c daeURI to resolve. + * @return Returns true if the @c daeURIResolver successfully resolved the element + * into a URI, returns false otherwise. + */ + virtual DLLSPEC daeBool resolveURI(daeURI& uri) = 0; + + /** + * Gets the name of this resolver. + * @return Returns the resolver name as a string. + */ + virtual DLLSPEC daeString getName() = 0; + + /** + * Determines whether this resolver supports a particular protocol + * for resolution. + * @param protocol Determine whether the resolver supports this protocol. + * @return Returns true if this @c daeURIResolver understands how to resolve using this protocol, returns + * false otherwise + */ + virtual DLLSPEC daeBool isProtocolSupported(daeString protocol) = 0; + + /** + * Determines whether this resolver supports the given extension. + * This keeps parsers from trying to process incompatible + * file formats. + * @param extension Extension string found after the '.' in the file name. + * @return Returns true if the given extension is supported, returns false otherwise. + */ + virtual DLLSPEC daeBool isExtensionSupported(daeString extension) = 0; + +}; + + +#endif //__DAE_URI_H__ + + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeWin32Platform.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeWin32Platform.h new file mode 100644 index 00000000..dde4d081 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/daeWin32Platform.h @@ -0,0 +1,51 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#ifndef __DAE_WIN32_PLATFORM_H__ +#define __DAE_WIN32_PLATFORM_H__ + +#define PLATFORM_INT8 __int8 +#define PLATFORM_INT16 __int16 +#define PLATFORM_INT32 __int32 +#define PLATFORM_INT64 __int64 +#define PLATFORM_UINT8 unsigned __int8 +#define PLATFORM_UINT16 unsigned __int16 +#define PLATFORM_UINT32 unsigned __int32 +#define PLATFORM_UINT64 unsigned __int64 +#define PLATFORM_FLOAT32 float +#define PLATFORM_FLOAT64 double + +#if _MSC_VER <= 1200 +typedef int intptr_t; +#undef PLATFORM_INT8 +#define PLATFORM_INT8 char +#undef PLATFORM_UINT8 +#define PLATFORM_UINT8 unsigned char + + +#endif + + +#ifdef DOM_DYNAMIC + +#ifdef DOM_EXPORT +#define DLLSPEC __declspec( dllexport ) +#else +#define DLLSPEC __declspec( dllimport ) +#endif + +#else +#define DLLSPEC +#endif + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/domAny.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/domAny.h new file mode 100644 index 00000000..6e3be7ec --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dae/domAny.h @@ -0,0 +1,139 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __domAny_h__ +#define __domAny_h__ + +#include +#include +#include +#include +#include + +#define MAX_ATTRIBUTES 32 + +/** + * The domAny class allows for weakly typed xml elements. This class is used anywhere in the + * COLLADA schema where an xs:any element appears. The content and type information for a domAny + * object is generated at runtime. + */ +class domAny : public daeElement +{ +protected: // Attribute + + /** + * The array of daeStrings to hold attribute data for this element. + */ + daeString attrs[MAX_ATTRIBUTES]; + /** + * The domString value of the text data of this element. + */ + daeString _value; + /** + * Used to preserve order in elements that do not specify strict sequencing of sub-elements. + */ + daeElementRefArray _contents; + /** + * Used to preserve order in elements that have a complex content model. + */ + daeUIntArray _contentsOrder; + +public: + /** + * Gets the _contents array. + * @return Returns a reference to the _contents element array. + */ + daeElementRefArray &getContents() { return _contents; } + /** + * Gets the _contents array. + * @return Returns a constant reference to the _contents element array. + */ + const daeElementRefArray &getContents() const { return _contents; } + + /** + * Gets the number of attributes this element has. + * @return Returns the number of attributes on this element. + */ + daeUInt getAttributeCount() const { return (daeUInt)_meta->getMetaAttributes().getCount(); } + /** + * Gets an attribute's name. + * @param index The index into the attribute list. + * @return Returns the attribute's name. + */ + daeString getAttributeName( daeUInt index ) const { return _meta->getMetaAttributes()[index]->getName(); } + /** + * Gets an attribute's value. + * @param index The index into the attribute list. + * @return Returns the attribute's value as a string. + */ + daeString getAttributeValue( daeUInt index ) const { return attrs[ index ]; } + /** + * Gets the value of this element. + * @return Returns a daeString of the value. + */ + daeString getValue() const { return _value; } + /** + * Sets the _value of this element. + * @param val The new value for this element. + */ + void setValue( daeString val ) { *(daeStringRef*)&_value = val; } + +protected: + /** + * Constructor + */ + domAny() : _value() {} + /** + * Destructor + */ + virtual ~domAny() {} + /** + * Copy Constructor + */ + domAny( const domAny &cpy ) : daeElement() { (void)cpy; } + /** + * Overloaded assignment operator + */ + virtual domAny &operator=( const domAny &cpy ) { (void)cpy; return *this; } + +public: //METHODS + /** + * Override of the Base class method. Creates and registers an attribute field with its meta + * and assigns its value as the attrValue String. + * @param attrName Attribute to set. + * @param attrValue String-based value to apply to the attribute. + * @return Returns true if the attribute was created and the value was set, false otherwise. + */ + virtual DLLSPEC daeBool setAttribute(daeString attrName, daeString attrValue); + +public: // STATIC METHODS + /** + * Creates an instance of this class and returns a daeElementRef referencing it. + * @param bytes The size allocated for this instance. + * @return a daeElementRef referencing an instance of this object. + */ + static DLLSPEC daeElementRef create(daeInt bytes); + /** + * Creates a daeMetaElement object that describes this element in the meta object reflection framework. + * @return A daeMetaElement describing this COLLADA element. + * @remarks Unlike other dom* elements, domAny will always create a new daeMetaElement when this + * function is called. + */ + static DLLSPEC daeMetaElement* registerElement(); + +}; + +typedef daeSmartRef domAnyRef; +typedef daeTArray domAny_Array; + +#endif + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dom.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dom.h new file mode 100644 index 00000000..8405e7bc --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/dom.h @@ -0,0 +1,28 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#ifndef __DOM__ +#define __DOM__ + +class daeMetaElement; + +extern daeString COLLADA_VERSION; +extern daeString COLLADA_NAMESPACE; + +// Register all types +void registerDomTypes(); + +// Register all elements +daeMetaElement* registerDomElements(); + + +#endif // __DOM_INTERFACE__ diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/modules/daeLIBXMLPlugin.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/modules/daeLIBXMLPlugin.h new file mode 100644 index 00000000..ea829a6c --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/modules/daeLIBXMLPlugin.h @@ -0,0 +1,92 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#ifndef __DAE_LIBXMLPLUGIN__ +#define __DAE_LIBXMLPLUGIN__ + +#include +#include +#include +#include + +class daeElement; +class daeIntegrationObject; +class daeMetaElement; +class daeDocument; + +struct _xmlTextReader; +struct _xmlTextWriter; + +/** + * The @c daeLIBXMLPlugin class derives from @c daeIOPlugin and implements an XML + * input/output backend using libxml2 as a parser. When using this plugin, daeInterface::load() expects + * an rfc 2396 compliant URI, any URI supported by libxml2 should be properly + * handled including ones with network schemes and authority. If the URI contains a fragment it will be ignored + * and the entire referenced document will be loaded. daeInterface::saveAs will only + * handle a filename path at present (ie: no scheme or authority). + */ +class daeLIBXMLPlugin : public daeIOPlugin +{ +public: + // Constructor / destructor + /** + * Constructor. + */ + DLLSPEC daeLIBXMLPlugin(); + /** + * Destructor. + */ + virtual DLLSPEC ~daeLIBXMLPlugin(); + virtual DLLSPEC daeInt setMeta(daeMetaElement *topMeta); + + // Database setup + virtual DLLSPEC void setDatabase(daeDatabase* database); + + // Operations + virtual DLLSPEC daeInt read(daeURI& uri, daeString docBuffer); + virtual DLLSPEC daeInt write(daeURI *name, daeDocument *document, daeBool replace); + + // Parsing support + DLLSPEC daeElementRef startParse(daeMetaElement* thisMetaElement, _xmlTextReader *reader); + DLLSPEC daeElementRef nextElement(daeMetaElement* thisMetaElement, _xmlTextReader *reader); + + // Stats + virtual DLLSPEC void getProgress(daeInt* bytesParsed, + daeInt* lineNumber, + daeInt* totalBytes, + daeBool reset = false ); + +private: +// xmlTextReaderPtr reader; + _xmlTextWriter *writer; + + typedef struct + { + daeElement* element; + daeIntegrationObject* intObject; + } INTEGRATION_ITEM; + + daeMetaElement* topMeta; +// std::vector intItems; + daeDatabase* database; + + void postProcessDom(daeDocument *document, daeElement* element, std::vector &intItems); + + void writeElement( daeElement* element ); + void writeAttribute( daeMetaAttribute* attr, daeElement* element, daeInt attrNum = -1 ); + + void readAttributes( daeElement *element, _xmlTextReader *reader ); + void readValue( daeElement *element, _xmlTextReader *reader ); +}; + +#endif //__DAE_XMLPLUGIN__ diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/modules/daeLIBXMLResolver.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/modules/daeLIBXMLResolver.h new file mode 100644 index 00000000..c14733a4 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/modules/daeLIBXMLResolver.h @@ -0,0 +1,52 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#ifndef __DAE_LIBXMLRESOLVER__ +#define __DAE_LIBXMLRESOVLER__ + +#include "dae/daeURI.h" +class daeIOPlugin; +class daeDatabase; + +/** + * The @c daeLIBXMLResolver class derives from @c daeURIResolver and implements + * the default XML backend resolver. + */ +class daeLIBXMLResolver : public daeURIResolver +{ +public: + /** + * Constructor. + * @param database The @c daeDatabase used. + * @param plugin The @c daeIOPlugin used. + */ + DLLSPEC daeLIBXMLResolver(daeDatabase* database, daeIOPlugin* plugin); + /** + * Destructor. + */ + DLLSPEC ~daeLIBXMLResolver(); + +protected: + daeDatabase* _database; + daeIOPlugin* _plugin; + +public: // Abstract Interface + virtual DLLSPEC daeBool resolveElement(daeURI& uri, daeString typeNameHint = NULL); + virtual DLLSPEC daeBool resolveURI(daeURI& uri); + virtual DLLSPEC daeString getName(); + virtual DLLSPEC daeBool isProtocolSupported(daeString protocol); + virtual DLLSPEC daeBool isExtensionSupported(daeString extension); +}; + +#endif //__DAE_XMLRESOLVER__ + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/modules/daeSTLDatabase.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/modules/daeSTLDatabase.h new file mode 100644 index 00000000..34225231 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/modules/daeSTLDatabase.h @@ -0,0 +1,93 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#ifndef __DAE_STLDATABASE__ +#define __DAE_STLDATABASE__ + +#include + +#include +#include +#include +#include +#include + +#include +#include + +/** + * The @c daeSTLDatabase class derives from @c daeDatabase and implements + * the default database. + */ +class daeSTLDatabase : public daeDatabase +{ +public: + /** + * Constructor + */ + DLLSPEC daeSTLDatabase(); + /** + * Destructor + */ + virtual DLLSPEC ~daeSTLDatabase(); + +public: + // Element Types of all Elements + virtual DLLSPEC daeUInt getTypeCount(); + virtual DLLSPEC daeString getTypeName(daeUInt index); + virtual DLLSPEC daeInt setMeta(daeMetaElement *_topMeta); + + // Documents + virtual DLLSPEC daeInt insertDocument(const char *name, daeElement* dom, daeDocument** document = NULL); + virtual DLLSPEC daeInt insertDocument(daeString name, daeDocument** document = NULL); + virtual DLLSPEC daeInt createDocument(daeString name, daeElement* dom, daeDocument** document = NULL); + virtual DLLSPEC daeInt createDocument(daeString name, daeDocument** document = NULL); + virtual DLLSPEC daeInt insertDocument( daeDocument *c ); + + virtual DLLSPEC daeInt removeDocument(daeDocument* document); + virtual DLLSPEC daeUInt getDocumentCount(); + virtual DLLSPEC daeDocument* getDocument(daeUInt index); + virtual DLLSPEC daeDocument* getDocument(daeString name); + virtual DLLSPEC daeString getDocumentName(daeUInt index); + virtual DLLSPEC daeBool isDocumentLoaded(daeString name); + + // Elements + virtual DLLSPEC daeInt insertElement(daeDocument* document, daeElement* element); + virtual DLLSPEC daeInt removeElement(daeDocument* document, daeElement* element); + virtual DLLSPEC daeInt clear(); + virtual DLLSPEC void validate(); + virtual DLLSPEC daeUInt getElementCount(daeString name = NULL, + daeString type = NULL, + daeString file = NULL); + virtual DLLSPEC daeInt getElement(daeElement** pElement, + daeInt index, + daeString name = NULL, + daeString type = NULL, + daeString file = NULL); + + // Generic Query + virtual DLLSPEC daeInt queryElement(daeElement** pElement, daeString genericQuery); + +private: + + std::map< std::string, std::vector< daeElement* > > elements; //map for all elements keyed on Type + std::multimap< std::string, daeElement* > elementsIDMap; //map for elements keyed on ID + + std::vector documents; + daeMetaElement* topMeta; + + daeInt insertChildren( daeDocument *c, daeElement *element ); + daeInt removeChildren( daeDocument *c, daeElement *element ); +}; + +#endif // __DAE_STLDATABASE__ diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/modules/stdErrPlugin.h b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/modules/stdErrPlugin.h new file mode 100644 index 00000000..a754384f --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/include/modules/stdErrPlugin.h @@ -0,0 +1,33 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#ifndef _STDERR_PLUGIN_ +#define _STDERR_PLUGIN_ + +#include +#include +/** + * The @c stdErrPlugin class is the default implementation of daeErrorHandler. It routes the Error + * and Warning messaged to stdout. + */ +class DLLSPEC stdErrPlugin : public daeErrorHandler { +public: + stdErrPlugin(); + virtual ~stdErrPlugin(); + +public: + void handleError( daeString msg ); + void handleWarning( daeString msg ); +}; + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/readme.txt b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/readme.txt new file mode 100644 index 00000000..640a1764 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/readme.txt @@ -0,0 +1,3 @@ +Download COLLADA 1.4 DOM COLLADA DOM Patch3 or later and unzip here. +http://sourceforge.net/projects/collada-dom +Visual Studio 2005 projectfiles are provided. diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/scea-shared-source-lic1.0.txt b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/scea-shared-source-lic1.0.txt new file mode 100644 index 00000000..4ba12ea7 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/scea-shared-source-lic1.0.txt @@ -0,0 +1,64 @@ +SCEA Shared Source License 1.0 + + + +Terms and Conditions: + +1. Definitions: + +"Software" shall mean the software and related documentation, whether in Source or Object Form, made available under this SCEA Shared Source license ("License"), that is indicated by a copyright notice file included in the source files or attached or accompanying the source files. + +"Licensor" shall mean Sony Computer Entertainment America, Inc. (herein "SCEA") + +"Object Code" or "Object Form" shall mean any form that results from translation or transformation of Source Code, including but not limited to compiled object code or conversions to other forms intended for machine execution. + +"Source Code" or "Source Form" shall have the plain meaning generally accepted in the software industry, including but not limited to software source code, documentation source, header and configuration files. + +"You" or "Your" shall mean you as an individual or as a company, or whichever form under which you are exercising rights under this License. + + 2. License Grant. + +Licensor hereby grants to You, free of charge subject to the terms and conditions of this License, an irrevocable, non-exclusive, worldwide, perpetual, and royalty-free license to use, modify, reproduce, distribute, publicly perform or display the Software in Object or Source Form . + +3. No Right to File for Patent. + +In exchange for the rights that are granted to You free of charge under this License, You agree that You will not file for any patent application, seek copyright protection or take any other action that might otherwise impair the ownership rights in and to the Software that may belong to SCEA or any of the other contributors/authors of the Software. + +4. Contributions. + +SCEA welcomes contributions in form of modifications, optimizations, tools or documentation designed to improve or expand the performance and scope of the Software (collectively "Contributions"). Per the terms of this License You are free to modify the Software and those modifications would belong to You. You may however wish to donate Your Contributions to SCEA for consideration for inclusion into the Software. For the avoidance of doubt, if You elect to send Your Contributions to SCEA, You are doing so voluntarily and are giving the Contributions to SCEA and its parent company Sony Computer Entertainment, Inc., free of charge, to use, modify or distribute in any form or in any manner. SCEA acknowledges that if You make a donation of Your Contributions to SCEA, such Contributions shall not exclusively belong to SCEA or its parent company and such donation shall not be to Your exclusion. SCEA, in its sole discretion, shall determine whether or not to include Your donated Contributions into the Software, in whole, in part, or as modified by SCEA. Should SCEA elect to include any such Contributions into the Software, it shall do so at its own risk and may elect to give credit or special thanks to any such contributors in the attached copyright notice. However, if any of Your contributions are included into the Software, they will become part of the Software and will be distributed under the terms and conditions of this License. Further, if Your donated Contributions are integrated into the Software then Sony Computer Entertainment, Inc. shall become the copyright owner of the Software now containing Your contributions and SCEA would be the Licensor. + +5. Redistribution in Source Form + +You may redistribute copies of the Software, modifications or derivatives thereof in Source Code Form, provided that You: +a. Include a copy of this License and any copyright notices with source +b. Identify modifications if any were made to the Software +c. Include a copy of all documentation accompanying the Software and modifications made by You + +6. Redistribution in Object Form + +If You redistribute copies of the Software, modifications or derivatives thereof in Object Form only (as incorporated into finished goods, i.e. end user applications) then You will not have a duty to include any copies of the code, this License, copyright notices, other attributions or documentation. + +7. No Warranty + +THE SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT ANY REPRESENTATIONS OR WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED, INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE. YOU ARE SOLELY RESPONSIBLE FOR DETERMINING THE APPROPRIATENESS OF USING, MODIFYING OR REDISTRIBUTING THE SOFTWARE AND ASSUME ANY RISKS ASSOCIATED WITH YOUR EXERCISE OF PERMISSIONS UNDER THIS LICENSE. + +8. Limitation of Liability + +UNDER NO CIRCUMSTANCES AND UNDER NO LEGAL THEORY WILL EITHER PARTY BE LIABLE TO THE OTHER PARTY OR ANY THIRD PARTY FOR ANY DIRECT, INDIRECT, CONSEQUENTIAL, SPECIAL, INCIDENTAL, OR EXEMPLARY DAMAGES WITH RESPECT TO ANY INJURY, LOSS, OR DAMAGE, ARISING UNDER OR IN CONNECTION WITH THIS LETTER AGREEMENT, WHETHER FORESEEABLE OR UNFORESEEABLE, EVEN IF SUCH PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH INJURY, LOSS, OR DAMAGE. THE LIMITATIONS OF LIABILITY SET FORTH IN THIS SECTION SHALL APPLY TO THE FULLEST EXTENT PERMISSIBLE AT LAW OR ANY GOVERMENTAL REGULATIONS. + +9. Governing Law and Consent to Jurisdiction + +This Agreement shall be governed by and interpreted in accordance with the laws of the State of California, excluding that body of law related to choice of laws, and of the United States of America. Any action or proceeding brought to enforce the terms of this Agreement or to adjudicate any dispute arising hereunder shall be brought in the Superior Court of the County of San Mateo, State of California or the United States District Court for the Northern District of California. Each of the parties hereby submits itself to the exclusive jurisdiction and venue of such courts for purposes of any such action. In addition, each party hereby waives the right to a jury trial in any action or proceeding related to this Agreement. + +10. Copyright Notice for Redistribution of Source Code + +Copyright 2005 Sony Computer Entertainment Inc. + +Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this file except in compliance with the License. You may obtain a copy of the License at: + +http://research.scea.com/scea_shared_source_license.html + +Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the specific language governing permissions and limitations under the License. + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/scea-shared-source-license1.0.pdf b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/scea-shared-source-license1.0.pdf new file mode 100644 index 0000000000000000000000000000000000000000..6ef1008884628b6905938893a789b059f6ac47a1 GIT binary patch literal 18764 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 literal 0 HcmV?d00001 diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/dom1.4_vc8.vcproj b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/dom1.4_vc8.vcproj new file mode 100644 index 00000000..bee0d6bb --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/dom1.4_vc8.vcproj @@ -0,0 +1,1499 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domAccessor.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domAccessor.cpp new file mode 100644 index 00000000..47e0b626 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domAccessor.cpp @@ -0,0 +1,111 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domAccessor::create(daeInt bytes) +{ + domAccessorRef ref = new(bytes) domAccessor; + ref->attrSource.setContainer( (domAccessor*)ref ); + return ref; +} + + +daeMetaElement * +domAccessor::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "accessor" ); + _Meta->registerClass(domAccessor::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 0, -1 ); + mea->setName( "param" ); + mea->setOffset( daeOffsetOf(domAccessor,elemParam_array) ); + mea->setElementType( domParam::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + _Meta->setCMRoot( cm ); + + // Add attribute: count + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "count" ); + ma->setType( daeAtomicType::get("Uint")); + ma->setOffset( daeOffsetOf( domAccessor , attrCount )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: offset + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "offset" ); + ma->setType( daeAtomicType::get("Uint")); + ma->setOffset( daeOffsetOf( domAccessor , attrOffset )); + ma->setContainer( _Meta ); + ma->setDefault( "0"); + + _Meta->appendAttribute(ma); + } + + // Add attribute: source + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "source" ); + ma->setType( daeAtomicType::get("xsAnyURI")); + ma->setOffset( daeOffsetOf( domAccessor , attrSource )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: stride + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "stride" ); + ma->setType( daeAtomicType::get("Uint")); + ma->setOffset( daeOffsetOf( domAccessor , attrStride )); + ma->setContainer( _Meta ); + ma->setDefault( "1"); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domAccessor)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domAccessor::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domAnimation.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domAnimation.cpp new file mode 100644 index 00000000..d2ca104a --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domAnimation.cpp @@ -0,0 +1,179 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domAnimation::create(daeInt bytes) +{ + domAnimationRef ref = new(bytes) domAnimation; + return ref; +} + + +daeMetaElement * +domAnimation::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "animation" ); + _Meta->registerClass(domAnimation::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 0, 1 ); + mea->setName( "asset" ); + mea->setOffset( daeOffsetOf(domAnimation,elemAsset) ); + mea->setElementType( domAsset::registerElement() ); + cm->appendChild( mea ); + + cm = new daeMetaChoice( _Meta, cm, 1, 1, 1 ); + + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, -1 ); + mea->setName( "source" ); + mea->setOffset( daeOffsetOf(domAnimation,elemSource_array) ); + mea->setElementType( domSource::registerElement() ); + cm->appendChild( mea ); + + cm = new daeMetaChoice( _Meta, cm, 1, 1, 1 ); + + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, -1 ); + mea->setName( "sampler" ); + mea->setOffset( daeOffsetOf(domAnimation,elemSampler_array) ); + mea->setElementType( domSampler::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 1, 1, -1 ); + mea->setName( "channel" ); + mea->setOffset( daeOffsetOf(domAnimation,elemChannel_array) ); + mea->setElementType( domChannel::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 2, 0, -1 ); + mea->setName( "animation" ); + mea->setOffset( daeOffsetOf(domAnimation,elemAnimation_array) ); + mea->setElementType( domAnimation::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 2 ); + cm->getParent()->appendChild( cm ); + cm = cm->getParent(); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 3, 1, -1 ); + mea->setName( "animation" ); + mea->setOffset( daeOffsetOf(domAnimation,elemAnimation_array) ); + mea->setElementType( domAnimation::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 2 ); + cm->getParent()->appendChild( cm ); + cm = cm->getParent(); + + cm->setMaxOrdinal( 1 ); + cm->getParent()->appendChild( cm ); + cm = cm->getParent(); + + cm = new daeMetaSequence( _Meta, cm, 2, 1, 1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, -1 ); + mea->setName( "sampler" ); + mea->setOffset( daeOffsetOf(domAnimation,elemSampler_array) ); + mea->setElementType( domSampler::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 1, 1, -1 ); + mea->setName( "channel" ); + mea->setOffset( daeOffsetOf(domAnimation,elemChannel_array) ); + mea->setElementType( domChannel::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 2, 0, -1 ); + mea->setName( "animation" ); + mea->setOffset( daeOffsetOf(domAnimation,elemAnimation_array) ); + mea->setElementType( domAnimation::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 2 ); + cm->getParent()->appendChild( cm ); + cm = cm->getParent(); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 5, 1, -1 ); + mea->setName( "animation" ); + mea->setOffset( daeOffsetOf(domAnimation,elemAnimation_array) ); + mea->setElementType( domAnimation::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 4 ); + cm->getParent()->appendChild( cm ); + cm = cm->getParent(); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 2, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domAnimation,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 2 ); + _Meta->setCMRoot( cm ); + // Ordered list of sub-elements + _Meta->addContents(daeOffsetOf(domAnimation,_contents)); + _Meta->addContentsOrder(daeOffsetOf(domAnimation,_contentsOrder)); + + + // Add attribute: id + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "id" ); + ma->setType( daeAtomicType::get("xsID")); + ma->setOffset( daeOffsetOf( domAnimation , attrId )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: name + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "name" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domAnimation , attrName )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domAnimation)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domAnimation::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domAnimation_clip.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domAnimation_clip.cpp new file mode 100644 index 00000000..025f2faa --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domAnimation_clip.cpp @@ -0,0 +1,120 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domAnimation_clip::create(daeInt bytes) +{ + domAnimation_clipRef ref = new(bytes) domAnimation_clip; + return ref; +} + + +daeMetaElement * +domAnimation_clip::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "animation_clip" ); + _Meta->registerClass(domAnimation_clip::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 0, 1 ); + mea->setName( "asset" ); + mea->setOffset( daeOffsetOf(domAnimation_clip,elemAsset) ); + mea->setElementType( domAsset::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 1, 1, -1 ); + mea->setName( "instance_animation" ); + mea->setOffset( daeOffsetOf(domAnimation_clip,elemInstance_animation_array) ); + mea->setElementType( domInstanceWithExtra::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 2, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domAnimation_clip,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 2 ); + _Meta->setCMRoot( cm ); + + // Add attribute: id + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "id" ); + ma->setType( daeAtomicType::get("xsID")); + ma->setOffset( daeOffsetOf( domAnimation_clip , attrId )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: name + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "name" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domAnimation_clip , attrName )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: start + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "start" ); + ma->setType( daeAtomicType::get("xsDouble")); + ma->setOffset( daeOffsetOf( domAnimation_clip , attrStart )); + ma->setContainer( _Meta ); + ma->setDefault( "0.0"); + + _Meta->appendAttribute(ma); + } + + // Add attribute: end + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "end" ); + ma->setType( daeAtomicType::get("xsDouble")); + ma->setOffset( daeOffsetOf( domAnimation_clip , attrEnd )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domAnimation_clip)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domAnimation_clip::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domAsset.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domAsset.cpp new file mode 100644 index 00000000..b34123ff --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domAsset.cpp @@ -0,0 +1,658 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domAsset::create(daeInt bytes) +{ + domAssetRef ref = new(bytes) domAsset; + return ref; +} + + +daeMetaElement * +domAsset::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "asset" ); + _Meta->registerClass(domAsset::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 0, -1 ); + mea->setName( "contributor" ); + mea->setOffset( daeOffsetOf(domAsset,elemContributor_array) ); + mea->setElementType( domAsset::domContributor::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 1, 1 ); + mea->setName( "created" ); + mea->setOffset( daeOffsetOf(domAsset,elemCreated) ); + mea->setElementType( domAsset::domCreated::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 2, 0, 1 ); + mea->setName( "keywords" ); + mea->setOffset( daeOffsetOf(domAsset,elemKeywords) ); + mea->setElementType( domAsset::domKeywords::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 3, 1, 1 ); + mea->setName( "modified" ); + mea->setOffset( daeOffsetOf(domAsset,elemModified) ); + mea->setElementType( domAsset::domModified::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 4, 0, 1 ); + mea->setName( "revision" ); + mea->setOffset( daeOffsetOf(domAsset,elemRevision) ); + mea->setElementType( domAsset::domRevision::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 5, 0, 1 ); + mea->setName( "subject" ); + mea->setOffset( daeOffsetOf(domAsset,elemSubject) ); + mea->setElementType( domAsset::domSubject::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 6, 0, 1 ); + mea->setName( "title" ); + mea->setOffset( daeOffsetOf(domAsset,elemTitle) ); + mea->setElementType( domAsset::domTitle::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 7, 0, 1 ); + mea->setName( "unit" ); + mea->setOffset( daeOffsetOf(domAsset,elemUnit) ); + mea->setElementType( domAsset::domUnit::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 8, 0, 1 ); + mea->setName( "up_axis" ); + mea->setOffset( daeOffsetOf(domAsset,elemUp_axis) ); + mea->setElementType( domAsset::domUp_axis::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 8 ); + _Meta->setCMRoot( cm ); + + + _Meta->setElementSize(sizeof(domAsset)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domAsset::domContributor::create(daeInt bytes) +{ + domAsset::domContributorRef ref = new(bytes) domAsset::domContributor; + return ref; +} + + +daeMetaElement * +domAsset::domContributor::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "contributor" ); + _Meta->registerClass(domAsset::domContributor::create, &_Meta); + + _Meta->setIsInnerClass( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 0, 1 ); + mea->setName( "author" ); + mea->setOffset( daeOffsetOf(domAsset::domContributor,elemAuthor) ); + mea->setElementType( domAsset::domContributor::domAuthor::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 0, 1 ); + mea->setName( "authoring_tool" ); + mea->setOffset( daeOffsetOf(domAsset::domContributor,elemAuthoring_tool) ); + mea->setElementType( domAsset::domContributor::domAuthoring_tool::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 2, 0, 1 ); + mea->setName( "comments" ); + mea->setOffset( daeOffsetOf(domAsset::domContributor,elemComments) ); + mea->setElementType( domAsset::domContributor::domComments::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 3, 0, 1 ); + mea->setName( "copyright" ); + mea->setOffset( daeOffsetOf(domAsset::domContributor,elemCopyright) ); + mea->setElementType( domAsset::domContributor::domCopyright::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 4, 0, 1 ); + mea->setName( "source_data" ); + mea->setOffset( daeOffsetOf(domAsset::domContributor,elemSource_data) ); + mea->setElementType( domAsset::domContributor::domSource_data::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 4 ); + _Meta->setCMRoot( cm ); + + + _Meta->setElementSize(sizeof(domAsset::domContributor)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domAsset::domContributor::domAuthor::create(daeInt bytes) +{ + domAsset::domContributor::domAuthorRef ref = new(bytes) domAsset::domContributor::domAuthor; + return ref; +} + + +daeMetaElement * +domAsset::domContributor::domAuthor::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "author" ); + _Meta->registerClass(domAsset::domContributor::domAuthor::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("xsString")); + ma->setOffset( daeOffsetOf( domAsset::domContributor::domAuthor , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domAsset::domContributor::domAuthor)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domAsset::domContributor::domAuthoring_tool::create(daeInt bytes) +{ + domAsset::domContributor::domAuthoring_toolRef ref = new(bytes) domAsset::domContributor::domAuthoring_tool; + return ref; +} + + +daeMetaElement * +domAsset::domContributor::domAuthoring_tool::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "authoring_tool" ); + _Meta->registerClass(domAsset::domContributor::domAuthoring_tool::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("xsString")); + ma->setOffset( daeOffsetOf( domAsset::domContributor::domAuthoring_tool , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domAsset::domContributor::domAuthoring_tool)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domAsset::domContributor::domComments::create(daeInt bytes) +{ + domAsset::domContributor::domCommentsRef ref = new(bytes) domAsset::domContributor::domComments; + return ref; +} + + +daeMetaElement * +domAsset::domContributor::domComments::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "comments" ); + _Meta->registerClass(domAsset::domContributor::domComments::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("xsString")); + ma->setOffset( daeOffsetOf( domAsset::domContributor::domComments , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domAsset::domContributor::domComments)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domAsset::domContributor::domCopyright::create(daeInt bytes) +{ + domAsset::domContributor::domCopyrightRef ref = new(bytes) domAsset::domContributor::domCopyright; + return ref; +} + + +daeMetaElement * +domAsset::domContributor::domCopyright::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "copyright" ); + _Meta->registerClass(domAsset::domContributor::domCopyright::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("xsString")); + ma->setOffset( daeOffsetOf( domAsset::domContributor::domCopyright , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domAsset::domContributor::domCopyright)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domAsset::domContributor::domSource_data::create(daeInt bytes) +{ + domAsset::domContributor::domSource_dataRef ref = new(bytes) domAsset::domContributor::domSource_data; + ref->_value.setContainer( (domAsset::domContributor::domSource_data*)ref ); + return ref; +} + + +daeMetaElement * +domAsset::domContributor::domSource_data::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "source_data" ); + _Meta->registerClass(domAsset::domContributor::domSource_data::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("xsAnyURI")); + ma->setOffset( daeOffsetOf( domAsset::domContributor::domSource_data , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domAsset::domContributor::domSource_data)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domAsset::domCreated::create(daeInt bytes) +{ + domAsset::domCreatedRef ref = new(bytes) domAsset::domCreated; + return ref; +} + + +daeMetaElement * +domAsset::domCreated::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "created" ); + _Meta->registerClass(domAsset::domCreated::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("xsDateTime")); + ma->setOffset( daeOffsetOf( domAsset::domCreated , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domAsset::domCreated)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domAsset::domKeywords::create(daeInt bytes) +{ + domAsset::domKeywordsRef ref = new(bytes) domAsset::domKeywords; + return ref; +} + + +daeMetaElement * +domAsset::domKeywords::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "keywords" ); + _Meta->registerClass(domAsset::domKeywords::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("xsString")); + ma->setOffset( daeOffsetOf( domAsset::domKeywords , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domAsset::domKeywords)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domAsset::domModified::create(daeInt bytes) +{ + domAsset::domModifiedRef ref = new(bytes) domAsset::domModified; + return ref; +} + + +daeMetaElement * +domAsset::domModified::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "modified" ); + _Meta->registerClass(domAsset::domModified::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("xsDateTime")); + ma->setOffset( daeOffsetOf( domAsset::domModified , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domAsset::domModified)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domAsset::domRevision::create(daeInt bytes) +{ + domAsset::domRevisionRef ref = new(bytes) domAsset::domRevision; + return ref; +} + + +daeMetaElement * +domAsset::domRevision::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "revision" ); + _Meta->registerClass(domAsset::domRevision::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("xsString")); + ma->setOffset( daeOffsetOf( domAsset::domRevision , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domAsset::domRevision)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domAsset::domSubject::create(daeInt bytes) +{ + domAsset::domSubjectRef ref = new(bytes) domAsset::domSubject; + return ref; +} + + +daeMetaElement * +domAsset::domSubject::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "subject" ); + _Meta->registerClass(domAsset::domSubject::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("xsString")); + ma->setOffset( daeOffsetOf( domAsset::domSubject , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domAsset::domSubject)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domAsset::domTitle::create(daeInt bytes) +{ + domAsset::domTitleRef ref = new(bytes) domAsset::domTitle; + return ref; +} + + +daeMetaElement * +domAsset::domTitle::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "title" ); + _Meta->registerClass(domAsset::domTitle::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("xsString")); + ma->setOffset( daeOffsetOf( domAsset::domTitle , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domAsset::domTitle)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domAsset::domUnit::create(daeInt bytes) +{ + domAsset::domUnitRef ref = new(bytes) domAsset::domUnit; + return ref; +} + + +daeMetaElement * +domAsset::domUnit::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "unit" ); + _Meta->registerClass(domAsset::domUnit::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: meter + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "meter" ); + ma->setType( daeAtomicType::get("Float")); + ma->setOffset( daeOffsetOf( domAsset::domUnit , attrMeter )); + ma->setContainer( _Meta ); + ma->setDefault( "1.0"); + + _Meta->appendAttribute(ma); + } + + // Add attribute: name + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "name" ); + ma->setType( daeAtomicType::get("xsNMTOKEN")); + ma->setOffset( daeOffsetOf( domAsset::domUnit , attrName )); + ma->setContainer( _Meta ); + ma->setDefault( "meter"); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domAsset::domUnit)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domAsset::domUp_axis::create(daeInt bytes) +{ + domAsset::domUp_axisRef ref = new(bytes) domAsset::domUp_axis; + return ref; +} + + +daeMetaElement * +domAsset::domUp_axis::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "up_axis" ); + _Meta->registerClass(domAsset::domUp_axis::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("UpAxisType")); + ma->setOffset( daeOffsetOf( domAsset::domUp_axis , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domAsset::domUp_axis)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domAsset::_Meta = NULL; +daeMetaElement * domAsset::domContributor::_Meta = NULL; +daeMetaElement * domAsset::domContributor::domAuthor::_Meta = NULL; +daeMetaElement * domAsset::domContributor::domAuthoring_tool::_Meta = NULL; +daeMetaElement * domAsset::domContributor::domComments::_Meta = NULL; +daeMetaElement * domAsset::domContributor::domCopyright::_Meta = NULL; +daeMetaElement * domAsset::domContributor::domSource_data::_Meta = NULL; +daeMetaElement * domAsset::domCreated::_Meta = NULL; +daeMetaElement * domAsset::domKeywords::_Meta = NULL; +daeMetaElement * domAsset::domModified::_Meta = NULL; +daeMetaElement * domAsset::domRevision::_Meta = NULL; +daeMetaElement * domAsset::domSubject::_Meta = NULL; +daeMetaElement * domAsset::domTitle::_Meta = NULL; +daeMetaElement * domAsset::domUnit::_Meta = NULL; +daeMetaElement * domAsset::domUp_axis::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domBind_material.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domBind_material.cpp new file mode 100644 index 00000000..baa8a565 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domBind_material.cpp @@ -0,0 +1,120 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domBind_material::create(daeInt bytes) +{ + domBind_materialRef ref = new(bytes) domBind_material; + return ref; +} + + +daeMetaElement * +domBind_material::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "bind_material" ); + _Meta->registerClass(domBind_material::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 0, -1 ); + mea->setName( "param" ); + mea->setOffset( daeOffsetOf(domBind_material,elemParam_array) ); + mea->setElementType( domParam::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 1, 1 ); + mea->setName( "technique_common" ); + mea->setOffset( daeOffsetOf(domBind_material,elemTechnique_common) ); + mea->setElementType( domBind_material::domTechnique_common::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 2, 0, -1 ); + mea->setName( "technique" ); + mea->setOffset( daeOffsetOf(domBind_material,elemTechnique_array) ); + mea->setElementType( domTechnique::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 3, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domBind_material,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 3 ); + _Meta->setCMRoot( cm ); + + + _Meta->setElementSize(sizeof(domBind_material)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domBind_material::domTechnique_common::create(daeInt bytes) +{ + domBind_material::domTechnique_commonRef ref = new(bytes) domBind_material::domTechnique_common; + return ref; +} + + +daeMetaElement * +domBind_material::domTechnique_common::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "technique_common" ); + _Meta->registerClass(domBind_material::domTechnique_common::create, &_Meta); + + _Meta->setIsInnerClass( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, -1 ); + mea->setName( "instance_material" ); + mea->setOffset( daeOffsetOf(domBind_material::domTechnique_common,elemInstance_material_array) ); + mea->setElementType( domInstance_material::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + _Meta->setCMRoot( cm ); + + + _Meta->setElementSize(sizeof(domBind_material::domTechnique_common)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domBind_material::_Meta = NULL; +daeMetaElement * domBind_material::domTechnique_common::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domBool_array.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domBool_array.cpp new file mode 100644 index 00000000..e462d731 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domBool_array.cpp @@ -0,0 +1,94 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domBool_array::create(daeInt bytes) +{ + domBool_arrayRef ref = new(bytes) domBool_array; + return ref; +} + + +daeMetaElement * +domBool_array::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "bool_array" ); + _Meta->registerClass(domBool_array::create, &_Meta); + + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("ListOfBools")); + ma->setOffset( daeOffsetOf( domBool_array , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + // Add attribute: id + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "id" ); + ma->setType( daeAtomicType::get("xsID")); + ma->setOffset( daeOffsetOf( domBool_array , attrId )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: name + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "name" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domBool_array , attrName )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: count + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "count" ); + ma->setType( daeAtomicType::get("Uint")); + ma->setOffset( daeOffsetOf( domBool_array , attrCount )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domBool_array)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domBool_array::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domBox.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domBox.cpp new file mode 100644 index 00000000..c371769e --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domBox.cpp @@ -0,0 +1,105 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domBox::create(daeInt bytes) +{ + domBoxRef ref = new(bytes) domBox; + return ref; +} + + +daeMetaElement * +domBox::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "box" ); + _Meta->registerClass(domBox::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "half_extents" ); + mea->setOffset( daeOffsetOf(domBox,elemHalf_extents) ); + mea->setElementType( domBox::domHalf_extents::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 1, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domBox,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 1 ); + _Meta->setCMRoot( cm ); + + + _Meta->setElementSize(sizeof(domBox)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domBox::domHalf_extents::create(daeInt bytes) +{ + domBox::domHalf_extentsRef ref = new(bytes) domBox::domHalf_extents; + return ref; +} + + +daeMetaElement * +domBox::domHalf_extents::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "half_extents" ); + _Meta->registerClass(domBox::domHalf_extents::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Float3")); + ma->setOffset( daeOffsetOf( domBox::domHalf_extents , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domBox::domHalf_extents)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domBox::_Meta = NULL; +daeMetaElement * domBox::domHalf_extents::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCOLLADA.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCOLLADA.cpp new file mode 100644 index 00000000..9a35dc6b --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCOLLADA.cpp @@ -0,0 +1,268 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +extern daeString COLLADA_VERSION; +extern daeString COLLADA_NAMESPACE; + +daeElementRef +domCOLLADA::create(daeInt bytes) +{ + domCOLLADARef ref = new(bytes) domCOLLADA; + ref->attrXmlns.setContainer( (domCOLLADA*)ref ); + ref->attrXml_base.setContainer( (domCOLLADA*)ref ); + ref->_meta = _Meta; + ref->setAttribute("version", COLLADA_VERSION ); + ref->setAttribute("xmlns", COLLADA_NAMESPACE ); + ref->_meta = NULL; + return ref; +} + + +daeMetaElement * +domCOLLADA::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "COLLADA" ); + _Meta->registerClass(domCOLLADA::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "asset" ); + mea->setOffset( daeOffsetOf(domCOLLADA,elemAsset) ); + mea->setElementType( domAsset::registerElement() ); + cm->appendChild( mea ); + + cm = new daeMetaChoice( _Meta, cm, 1, 0, -1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "library_animations" ); + mea->setOffset( daeOffsetOf(domCOLLADA,elemLibrary_animations_array) ); + mea->setElementType( domLibrary_animations::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "library_animation_clips" ); + mea->setOffset( daeOffsetOf(domCOLLADA,elemLibrary_animation_clips_array) ); + mea->setElementType( domLibrary_animation_clips::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "library_cameras" ); + mea->setOffset( daeOffsetOf(domCOLLADA,elemLibrary_cameras_array) ); + mea->setElementType( domLibrary_cameras::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "library_controllers" ); + mea->setOffset( daeOffsetOf(domCOLLADA,elemLibrary_controllers_array) ); + mea->setElementType( domLibrary_controllers::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "library_geometries" ); + mea->setOffset( daeOffsetOf(domCOLLADA,elemLibrary_geometries_array) ); + mea->setElementType( domLibrary_geometries::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "library_effects" ); + mea->setOffset( daeOffsetOf(domCOLLADA,elemLibrary_effects_array) ); + mea->setElementType( domLibrary_effects::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "library_force_fields" ); + mea->setOffset( daeOffsetOf(domCOLLADA,elemLibrary_force_fields_array) ); + mea->setElementType( domLibrary_force_fields::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "library_images" ); + mea->setOffset( daeOffsetOf(domCOLLADA,elemLibrary_images_array) ); + mea->setElementType( domLibrary_images::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "library_lights" ); + mea->setOffset( daeOffsetOf(domCOLLADA,elemLibrary_lights_array) ); + mea->setElementType( domLibrary_lights::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "library_materials" ); + mea->setOffset( daeOffsetOf(domCOLLADA,elemLibrary_materials_array) ); + mea->setElementType( domLibrary_materials::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "library_nodes" ); + mea->setOffset( daeOffsetOf(domCOLLADA,elemLibrary_nodes_array) ); + mea->setElementType( domLibrary_nodes::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "library_physics_materials" ); + mea->setOffset( daeOffsetOf(domCOLLADA,elemLibrary_physics_materials_array) ); + mea->setElementType( domLibrary_physics_materials::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "library_physics_models" ); + mea->setOffset( daeOffsetOf(domCOLLADA,elemLibrary_physics_models_array) ); + mea->setElementType( domLibrary_physics_models::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "library_physics_scenes" ); + mea->setOffset( daeOffsetOf(domCOLLADA,elemLibrary_physics_scenes_array) ); + mea->setElementType( domLibrary_physics_scenes::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "library_visual_scenes" ); + mea->setOffset( daeOffsetOf(domCOLLADA,elemLibrary_visual_scenes_array) ); + mea->setElementType( domLibrary_visual_scenes::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + cm->getParent()->appendChild( cm ); + cm = cm->getParent(); + + mea = new daeMetaElementAttribute( _Meta, cm, 3002, 0, 1 ); + mea->setName( "scene" ); + mea->setOffset( daeOffsetOf(domCOLLADA,elemScene) ); + mea->setElementType( domCOLLADA::domScene::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 3003, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domCOLLADA,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 3003 ); + _Meta->setCMRoot( cm ); + // Ordered list of sub-elements + _Meta->addContents(daeOffsetOf(domCOLLADA,_contents)); + _Meta->addContentsOrder(daeOffsetOf(domCOLLADA,_contentsOrder)); + + // Add attribute: xmlns + { + daeMetaAttribute* ma = new daeMetaAttribute; + ma->setName( "xmlns" ); + ma->setType( daeAtomicType::get("xsAnyURI")); + ma->setOffset( daeOffsetOf( domCOLLADA , attrXmlns )); + ma->setContainer( _Meta ); + //ma->setIsRequired( true ); + _Meta->appendAttribute(ma); + } + + // Add attribute: version + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "version" ); + ma->setType( daeAtomicType::get("VersionType")); + ma->setOffset( daeOffsetOf( domCOLLADA , attrVersion )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: xml_base + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "xml_base" ); + ma->setType( daeAtomicType::get("xsAnyURI")); + ma->setOffset( daeOffsetOf( domCOLLADA , attrXml_base )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCOLLADA)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCOLLADA::domScene::create(daeInt bytes) +{ + domCOLLADA::domSceneRef ref = new(bytes) domCOLLADA::domScene; + return ref; +} + + +daeMetaElement * +domCOLLADA::domScene::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "scene" ); + _Meta->registerClass(domCOLLADA::domScene::create, &_Meta); + + _Meta->setIsInnerClass( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 0, -1 ); + mea->setName( "instance_physics_scene" ); + mea->setOffset( daeOffsetOf(domCOLLADA::domScene,elemInstance_physics_scene_array) ); + mea->setElementType( domInstanceWithExtra::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 0, 1 ); + mea->setName( "instance_visual_scene" ); + mea->setOffset( daeOffsetOf(domCOLLADA::domScene,elemInstance_visual_scene) ); + mea->setElementType( domInstanceWithExtra::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 2, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domCOLLADA::domScene,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 2 ); + _Meta->setCMRoot( cm ); + + + _Meta->setElementSize(sizeof(domCOLLADA::domScene)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domCOLLADA::_Meta = NULL; +daeMetaElement * domCOLLADA::domScene::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCamera.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCamera.cpp new file mode 100644 index 00000000..8d49b9d3 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCamera.cpp @@ -0,0 +1,454 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domCamera::create(daeInt bytes) +{ + domCameraRef ref = new(bytes) domCamera; + return ref; +} + + +daeMetaElement * +domCamera::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "camera" ); + _Meta->registerClass(domCamera::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 0, 1 ); + mea->setName( "asset" ); + mea->setOffset( daeOffsetOf(domCamera,elemAsset) ); + mea->setElementType( domAsset::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 1, 1 ); + mea->setName( "optics" ); + mea->setOffset( daeOffsetOf(domCamera,elemOptics) ); + mea->setElementType( domCamera::domOptics::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 2, 0, 1 ); + mea->setName( "imager" ); + mea->setOffset( daeOffsetOf(domCamera,elemImager) ); + mea->setElementType( domCamera::domImager::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 3, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domCamera,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 3 ); + _Meta->setCMRoot( cm ); + + // Add attribute: id + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "id" ); + ma->setType( daeAtomicType::get("xsID")); + ma->setOffset( daeOffsetOf( domCamera , attrId )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: name + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "name" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domCamera , attrName )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCamera)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCamera::domOptics::create(daeInt bytes) +{ + domCamera::domOpticsRef ref = new(bytes) domCamera::domOptics; + return ref; +} + + +daeMetaElement * +domCamera::domOptics::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "optics" ); + _Meta->registerClass(domCamera::domOptics::create, &_Meta); + + _Meta->setIsInnerClass( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "technique_common" ); + mea->setOffset( daeOffsetOf(domCamera::domOptics,elemTechnique_common) ); + mea->setElementType( domCamera::domOptics::domTechnique_common::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 1, 0, -1 ); + mea->setName( "technique" ); + mea->setOffset( daeOffsetOf(domCamera::domOptics,elemTechnique_array) ); + mea->setElementType( domTechnique::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 2, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domCamera::domOptics,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 2 ); + _Meta->setCMRoot( cm ); + + + _Meta->setElementSize(sizeof(domCamera::domOptics)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCamera::domOptics::domTechnique_common::create(daeInt bytes) +{ + domCamera::domOptics::domTechnique_commonRef ref = new(bytes) domCamera::domOptics::domTechnique_common; + return ref; +} + + +daeMetaElement * +domCamera::domOptics::domTechnique_common::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "technique_common" ); + _Meta->registerClass(domCamera::domOptics::domTechnique_common::create, &_Meta); + + _Meta->setIsInnerClass( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaChoice( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "orthographic" ); + mea->setOffset( daeOffsetOf(domCamera::domOptics::domTechnique_common,elemOrthographic) ); + mea->setElementType( domCamera::domOptics::domTechnique_common::domOrthographic::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "perspective" ); + mea->setOffset( daeOffsetOf(domCamera::domOptics::domTechnique_common,elemPerspective) ); + mea->setElementType( domCamera::domOptics::domTechnique_common::domPerspective::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + _Meta->setCMRoot( cm ); + // Ordered list of sub-elements + _Meta->addContents(daeOffsetOf(domCamera::domOptics::domTechnique_common,_contents)); + _Meta->addContentsOrder(daeOffsetOf(domCamera::domOptics::domTechnique_common,_contentsOrder)); + + + + _Meta->setElementSize(sizeof(domCamera::domOptics::domTechnique_common)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCamera::domOptics::domTechnique_common::domOrthographic::create(daeInt bytes) +{ + domCamera::domOptics::domTechnique_common::domOrthographicRef ref = new(bytes) domCamera::domOptics::domTechnique_common::domOrthographic; + return ref; +} + + +daeMetaElement * +domCamera::domOptics::domTechnique_common::domOrthographic::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "orthographic" ); + _Meta->registerClass(domCamera::domOptics::domTechnique_common::domOrthographic::create, &_Meta); + + _Meta->setIsInnerClass( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + cm = new daeMetaChoice( _Meta, cm, 0, 1, 1 ); + + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "xmag" ); + mea->setOffset( daeOffsetOf(domCamera::domOptics::domTechnique_common::domOrthographic,elemXmag) ); + mea->setElementType( domTargetableFloat::registerElement() ); + cm->appendChild( mea ); + + cm = new daeMetaChoice( _Meta, cm, 1, 0, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "ymag" ); + mea->setOffset( daeOffsetOf(domCamera::domOptics::domTechnique_common::domOrthographic,elemYmag) ); + mea->setElementType( domTargetableFloat::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "aspect_ratio" ); + mea->setOffset( daeOffsetOf(domCamera::domOptics::domTechnique_common::domOrthographic,elemAspect_ratio) ); + mea->setElementType( domTargetableFloat::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + cm->getParent()->appendChild( cm ); + cm = cm->getParent(); + + cm->setMaxOrdinal( 1 ); + cm->getParent()->appendChild( cm ); + cm = cm->getParent(); + + cm = new daeMetaSequence( _Meta, cm, 2, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "ymag" ); + mea->setOffset( daeOffsetOf(domCamera::domOptics::domTechnique_common::domOrthographic,elemYmag) ); + mea->setElementType( domTargetableFloat::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 0, 1 ); + mea->setName( "aspect_ratio" ); + mea->setOffset( daeOffsetOf(domCamera::domOptics::domTechnique_common::domOrthographic,elemAspect_ratio) ); + mea->setElementType( domTargetableFloat::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 1 ); + cm->getParent()->appendChild( cm ); + cm = cm->getParent(); + + cm->setMaxOrdinal( 3 ); + cm->getParent()->appendChild( cm ); + cm = cm->getParent(); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 1, 1 ); + mea->setName( "znear" ); + mea->setOffset( daeOffsetOf(domCamera::domOptics::domTechnique_common::domOrthographic,elemZnear) ); + mea->setElementType( domTargetableFloat::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 2, 1, 1 ); + mea->setName( "zfar" ); + mea->setOffset( daeOffsetOf(domCamera::domOptics::domTechnique_common::domOrthographic,elemZfar) ); + mea->setElementType( domTargetableFloat::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 2 ); + _Meta->setCMRoot( cm ); + // Ordered list of sub-elements + _Meta->addContents(daeOffsetOf(domCamera::domOptics::domTechnique_common::domOrthographic,_contents)); + _Meta->addContentsOrder(daeOffsetOf(domCamera::domOptics::domTechnique_common::domOrthographic,_contentsOrder)); + + + + _Meta->setElementSize(sizeof(domCamera::domOptics::domTechnique_common::domOrthographic)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCamera::domOptics::domTechnique_common::domPerspective::create(daeInt bytes) +{ + domCamera::domOptics::domTechnique_common::domPerspectiveRef ref = new(bytes) domCamera::domOptics::domTechnique_common::domPerspective; + return ref; +} + + +daeMetaElement * +domCamera::domOptics::domTechnique_common::domPerspective::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "perspective" ); + _Meta->registerClass(domCamera::domOptics::domTechnique_common::domPerspective::create, &_Meta); + + _Meta->setIsInnerClass( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + cm = new daeMetaChoice( _Meta, cm, 0, 1, 1 ); + + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "xfov" ); + mea->setOffset( daeOffsetOf(domCamera::domOptics::domTechnique_common::domPerspective,elemXfov) ); + mea->setElementType( domTargetableFloat::registerElement() ); + cm->appendChild( mea ); + + cm = new daeMetaChoice( _Meta, cm, 1, 0, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "yfov" ); + mea->setOffset( daeOffsetOf(domCamera::domOptics::domTechnique_common::domPerspective,elemYfov) ); + mea->setElementType( domTargetableFloat::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "aspect_ratio" ); + mea->setOffset( daeOffsetOf(domCamera::domOptics::domTechnique_common::domPerspective,elemAspect_ratio) ); + mea->setElementType( domTargetableFloat::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + cm->getParent()->appendChild( cm ); + cm = cm->getParent(); + + cm->setMaxOrdinal( 1 ); + cm->getParent()->appendChild( cm ); + cm = cm->getParent(); + + cm = new daeMetaSequence( _Meta, cm, 2, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "yfov" ); + mea->setOffset( daeOffsetOf(domCamera::domOptics::domTechnique_common::domPerspective,elemYfov) ); + mea->setElementType( domTargetableFloat::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 0, 1 ); + mea->setName( "aspect_ratio" ); + mea->setOffset( daeOffsetOf(domCamera::domOptics::domTechnique_common::domPerspective,elemAspect_ratio) ); + mea->setElementType( domTargetableFloat::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 1 ); + cm->getParent()->appendChild( cm ); + cm = cm->getParent(); + + cm->setMaxOrdinal( 3 ); + cm->getParent()->appendChild( cm ); + cm = cm->getParent(); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 1, 1 ); + mea->setName( "znear" ); + mea->setOffset( daeOffsetOf(domCamera::domOptics::domTechnique_common::domPerspective,elemZnear) ); + mea->setElementType( domTargetableFloat::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 2, 1, 1 ); + mea->setName( "zfar" ); + mea->setOffset( daeOffsetOf(domCamera::domOptics::domTechnique_common::domPerspective,elemZfar) ); + mea->setElementType( domTargetableFloat::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 2 ); + _Meta->setCMRoot( cm ); + // Ordered list of sub-elements + _Meta->addContents(daeOffsetOf(domCamera::domOptics::domTechnique_common::domPerspective,_contents)); + _Meta->addContentsOrder(daeOffsetOf(domCamera::domOptics::domTechnique_common::domPerspective,_contentsOrder)); + + + + _Meta->setElementSize(sizeof(domCamera::domOptics::domTechnique_common::domPerspective)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCamera::domImager::create(daeInt bytes) +{ + domCamera::domImagerRef ref = new(bytes) domCamera::domImager; + return ref; +} + + +daeMetaElement * +domCamera::domImager::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "imager" ); + _Meta->registerClass(domCamera::domImager::create, &_Meta); + + _Meta->setIsInnerClass( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, -1 ); + mea->setName( "technique" ); + mea->setOffset( daeOffsetOf(domCamera::domImager,elemTechnique_array) ); + mea->setElementType( domTechnique::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 1, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domCamera::domImager,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 1 ); + _Meta->setCMRoot( cm ); + + + _Meta->setElementSize(sizeof(domCamera::domImager)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domCamera::_Meta = NULL; +daeMetaElement * domCamera::domOptics::_Meta = NULL; +daeMetaElement * domCamera::domOptics::domTechnique_common::_Meta = NULL; +daeMetaElement * domCamera::domOptics::domTechnique_common::domOrthographic::_Meta = NULL; +daeMetaElement * domCamera::domOptics::domTechnique_common::domPerspective::_Meta = NULL; +daeMetaElement * domCamera::domImager::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCapsule.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCapsule.cpp new file mode 100644 index 00000000..b607e6de --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCapsule.cpp @@ -0,0 +1,147 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domCapsule::create(daeInt bytes) +{ + domCapsuleRef ref = new(bytes) domCapsule; + return ref; +} + + +daeMetaElement * +domCapsule::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "capsule" ); + _Meta->registerClass(domCapsule::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "height" ); + mea->setOffset( daeOffsetOf(domCapsule,elemHeight) ); + mea->setElementType( domCapsule::domHeight::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 1, 1 ); + mea->setName( "radius" ); + mea->setOffset( daeOffsetOf(domCapsule,elemRadius) ); + mea->setElementType( domCapsule::domRadius::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 2, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domCapsule,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 2 ); + _Meta->setCMRoot( cm ); + + + _Meta->setElementSize(sizeof(domCapsule)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCapsule::domHeight::create(daeInt bytes) +{ + domCapsule::domHeightRef ref = new(bytes) domCapsule::domHeight; + return ref; +} + + +daeMetaElement * +domCapsule::domHeight::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "height" ); + _Meta->registerClass(domCapsule::domHeight::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Float")); + ma->setOffset( daeOffsetOf( domCapsule::domHeight , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCapsule::domHeight)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCapsule::domRadius::create(daeInt bytes) +{ + domCapsule::domRadiusRef ref = new(bytes) domCapsule::domRadius; + return ref; +} + + +daeMetaElement * +domCapsule::domRadius::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "radius" ); + _Meta->registerClass(domCapsule::domRadius::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Float2")); + ma->setOffset( daeOffsetOf( domCapsule::domRadius , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCapsule::domRadius)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domCapsule::_Meta = NULL; +daeMetaElement * domCapsule::domHeight::_Meta = NULL; +daeMetaElement * domCapsule::domRadius::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCg_connect_param.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCg_connect_param.cpp new file mode 100644 index 00000000..4e743d93 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCg_connect_param.cpp @@ -0,0 +1,63 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domCg_connect_param::create(daeInt bytes) +{ + domCg_connect_paramRef ref = new(bytes) domCg_connect_param; + return ref; +} + + +daeMetaElement * +domCg_connect_param::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "cg_connect_param" ); + _Meta->registerClass(domCg_connect_param::create, &_Meta); + + + // Add attribute: ref + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "ref" ); + ma->setType( daeAtomicType::get("Cg_identifier")); + ma->setOffset( daeOffsetOf( domCg_connect_param , attrRef )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_connect_param)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domCg_connect_param::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCg_newarray_type.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCg_newarray_type.cpp new file mode 100644 index 00000000..454932a5 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCg_newarray_type.cpp @@ -0,0 +1,97 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domCg_newarray_type::create(daeInt bytes) +{ + domCg_newarray_typeRef ref = new(bytes) domCg_newarray_type; + return ref; +} + + +daeMetaElement * +domCg_newarray_type::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "cg_newarray_type" ); + _Meta->registerClass(domCg_newarray_type::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaChoice( _Meta, cm, 0, 0, -1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "cg_param_type" ); + mea->setOffset( daeOffsetOf(domCg_newarray_type,elemCg_param_type_array) ); + mea->setElementType( domCg_param_type::registerElement() ); + cm->appendChild( new daeMetaGroup( mea, _Meta, cm, 0, 1, 1 ) ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "array" ); + mea->setOffset( daeOffsetOf(domCg_newarray_type,elemArray_array) ); + mea->setElementType( domCg_newarray_type::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "usertype" ); + mea->setOffset( daeOffsetOf(domCg_newarray_type,elemUsertype_array) ); + mea->setElementType( domCg_setuser_type::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "connect_param" ); + mea->setOffset( daeOffsetOf(domCg_newarray_type,elemConnect_param_array) ); + mea->setElementType( domCg_connect_param::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 3000 ); + _Meta->setCMRoot( cm ); + // Ordered list of sub-elements + _Meta->addContents(daeOffsetOf(domCg_newarray_type,_contents)); + _Meta->addContentsOrder(daeOffsetOf(domCg_newarray_type,_contentsOrder)); + + + // Add attribute: length + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "length" ); + ma->setType( daeAtomicType::get("xsPositiveInteger")); + ma->setOffset( daeOffsetOf( domCg_newarray_type , attrLength )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_newarray_type)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domCg_newarray_type::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCg_newparam.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCg_newparam.cpp new file mode 100644 index 00000000..ba30c2d9 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCg_newparam.cpp @@ -0,0 +1,187 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domCg_newparam::create(daeInt bytes) +{ + domCg_newparamRef ref = new(bytes) domCg_newparam; + return ref; +} + + +daeMetaElement * +domCg_newparam::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "cg_newparam" ); + _Meta->registerClass(domCg_newparam::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 0, -1 ); + mea->setName( "annotate" ); + mea->setOffset( daeOffsetOf(domCg_newparam,elemAnnotate_array) ); + mea->setElementType( domFx_annotate_common::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 0, 1 ); + mea->setName( "semantic" ); + mea->setOffset( daeOffsetOf(domCg_newparam,elemSemantic) ); + mea->setElementType( domCg_newparam::domSemantic::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 2, 0, 1 ); + mea->setName( "modifier" ); + mea->setOffset( daeOffsetOf(domCg_newparam,elemModifier) ); + mea->setElementType( domCg_newparam::domModifier::registerElement() ); + cm->appendChild( mea ); + + cm = new daeMetaChoice( _Meta, cm, 3, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "cg_param_type" ); + mea->setOffset( daeOffsetOf(domCg_newparam,elemCg_param_type) ); + mea->setElementType( domCg_param_type::registerElement() ); + cm->appendChild( new daeMetaGroup( mea, _Meta, cm, 0, 1, 1 ) ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "usertype" ); + mea->setOffset( daeOffsetOf(domCg_newparam,elemUsertype) ); + mea->setElementType( domCg_setuser_type::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "array" ); + mea->setOffset( daeOffsetOf(domCg_newparam,elemArray) ); + mea->setElementType( domCg_newarray_type::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + cm->getParent()->appendChild( cm ); + cm = cm->getParent(); + + cm->setMaxOrdinal( 3 ); + _Meta->setCMRoot( cm ); + // Ordered list of sub-elements + _Meta->addContents(daeOffsetOf(domCg_newparam,_contents)); + _Meta->addContentsOrder(daeOffsetOf(domCg_newparam,_contentsOrder)); + + + // Add attribute: sid + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "sid" ); + ma->setType( daeAtomicType::get("Cg_identifier")); + ma->setOffset( daeOffsetOf( domCg_newparam , attrSid )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_newparam)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_newparam::domSemantic::create(daeInt bytes) +{ + domCg_newparam::domSemanticRef ref = new(bytes) domCg_newparam::domSemantic; + return ref; +} + + +daeMetaElement * +domCg_newparam::domSemantic::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "semantic" ); + _Meta->registerClass(domCg_newparam::domSemantic::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domCg_newparam::domSemantic , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_newparam::domSemantic)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_newparam::domModifier::create(daeInt bytes) +{ + domCg_newparam::domModifierRef ref = new(bytes) domCg_newparam::domModifier; + return ref; +} + + +daeMetaElement * +domCg_newparam::domModifier::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "modifier" ); + _Meta->registerClass(domCg_newparam::domModifier::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Fx_modifier_enum_common")); + ma->setOffset( daeOffsetOf( domCg_newparam::domModifier , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_newparam::domModifier)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domCg_newparam::_Meta = NULL; +daeMetaElement * domCg_newparam::domSemantic::_Meta = NULL; +daeMetaElement * domCg_newparam::domModifier::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCg_param_type.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCg_param_type.cpp new file mode 100644 index 00000000..d62bf761 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCg_param_type.cpp @@ -0,0 +1,4598 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domCg_param_type::create(daeInt bytes) +{ + domCg_param_typeRef ref = new(bytes) domCg_param_type; + return ref; +} + + +daeMetaElement * +domCg_param_type::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "cg_param_type" ); + _Meta->registerClass(domCg_param_type::create, &_Meta); + + _Meta->setIsTransparent( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaChoice( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "bool" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemBool) ); + mea->setElementType( domCg_param_type::domBool::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "bool1" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemBool1) ); + mea->setElementType( domCg_param_type::domBool1::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "bool2" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemBool2) ); + mea->setElementType( domCg_param_type::domBool2::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "bool3" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemBool3) ); + mea->setElementType( domCg_param_type::domBool3::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "bool4" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemBool4) ); + mea->setElementType( domCg_param_type::domBool4::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "bool1x1" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemBool1x1) ); + mea->setElementType( domCg_param_type::domBool1x1::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "bool1x2" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemBool1x2) ); + mea->setElementType( domCg_param_type::domBool1x2::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "bool1x3" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemBool1x3) ); + mea->setElementType( domCg_param_type::domBool1x3::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "bool1x4" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemBool1x4) ); + mea->setElementType( domCg_param_type::domBool1x4::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "bool2x1" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemBool2x1) ); + mea->setElementType( domCg_param_type::domBool2x1::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "bool2x2" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemBool2x2) ); + mea->setElementType( domCg_param_type::domBool2x2::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "bool2x3" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemBool2x3) ); + mea->setElementType( domCg_param_type::domBool2x3::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "bool2x4" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemBool2x4) ); + mea->setElementType( domCg_param_type::domBool2x4::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "bool3x1" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemBool3x1) ); + mea->setElementType( domCg_param_type::domBool3x1::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "bool3x2" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemBool3x2) ); + mea->setElementType( domCg_param_type::domBool3x2::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "bool3x3" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemBool3x3) ); + mea->setElementType( domCg_param_type::domBool3x3::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "bool3x4" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemBool3x4) ); + mea->setElementType( domCg_param_type::domBool3x4::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "bool4x1" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemBool4x1) ); + mea->setElementType( domCg_param_type::domBool4x1::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "bool4x2" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemBool4x2) ); + mea->setElementType( domCg_param_type::domBool4x2::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "bool4x3" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemBool4x3) ); + mea->setElementType( domCg_param_type::domBool4x3::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "bool4x4" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemBool4x4) ); + mea->setElementType( domCg_param_type::domBool4x4::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "float" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemFloat) ); + mea->setElementType( domCg_param_type::domFloat::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "float1" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemFloat1) ); + mea->setElementType( domCg_param_type::domFloat1::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "float2" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemFloat2) ); + mea->setElementType( domCg_param_type::domFloat2::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "float3" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemFloat3) ); + mea->setElementType( domCg_param_type::domFloat3::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "float4" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemFloat4) ); + mea->setElementType( domCg_param_type::domFloat4::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "float1x1" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemFloat1x1) ); + mea->setElementType( domCg_param_type::domFloat1x1::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "float1x2" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemFloat1x2) ); + mea->setElementType( domCg_param_type::domFloat1x2::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "float1x3" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemFloat1x3) ); + mea->setElementType( domCg_param_type::domFloat1x3::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "float1x4" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemFloat1x4) ); + mea->setElementType( domCg_param_type::domFloat1x4::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "float2x1" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemFloat2x1) ); + mea->setElementType( domCg_param_type::domFloat2x1::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "float2x2" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemFloat2x2) ); + mea->setElementType( domCg_param_type::domFloat2x2::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "float2x3" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemFloat2x3) ); + mea->setElementType( domCg_param_type::domFloat2x3::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "float2x4" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemFloat2x4) ); + mea->setElementType( domCg_param_type::domFloat2x4::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "float3x1" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemFloat3x1) ); + mea->setElementType( domCg_param_type::domFloat3x1::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "float3x2" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemFloat3x2) ); + mea->setElementType( domCg_param_type::domFloat3x2::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "float3x3" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemFloat3x3) ); + mea->setElementType( domCg_param_type::domFloat3x3::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "float3x4" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemFloat3x4) ); + mea->setElementType( domCg_param_type::domFloat3x4::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "float4x1" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemFloat4x1) ); + mea->setElementType( domCg_param_type::domFloat4x1::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "float4x2" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemFloat4x2) ); + mea->setElementType( domCg_param_type::domFloat4x2::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "float4x3" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemFloat4x3) ); + mea->setElementType( domCg_param_type::domFloat4x3::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "float4x4" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemFloat4x4) ); + mea->setElementType( domCg_param_type::domFloat4x4::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "int" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemInt) ); + mea->setElementType( domCg_param_type::domInt::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "int1" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemInt1) ); + mea->setElementType( domCg_param_type::domInt1::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "int2" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemInt2) ); + mea->setElementType( domCg_param_type::domInt2::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "int3" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemInt3) ); + mea->setElementType( domCg_param_type::domInt3::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "int4" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemInt4) ); + mea->setElementType( domCg_param_type::domInt4::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "int1x1" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemInt1x1) ); + mea->setElementType( domCg_param_type::domInt1x1::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "int1x2" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemInt1x2) ); + mea->setElementType( domCg_param_type::domInt1x2::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "int1x3" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemInt1x3) ); + mea->setElementType( domCg_param_type::domInt1x3::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "int1x4" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemInt1x4) ); + mea->setElementType( domCg_param_type::domInt1x4::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "int2x1" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemInt2x1) ); + mea->setElementType( domCg_param_type::domInt2x1::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "int2x2" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemInt2x2) ); + mea->setElementType( domCg_param_type::domInt2x2::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "int2x3" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemInt2x3) ); + mea->setElementType( domCg_param_type::domInt2x3::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "int2x4" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemInt2x4) ); + mea->setElementType( domCg_param_type::domInt2x4::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "int3x1" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemInt3x1) ); + mea->setElementType( domCg_param_type::domInt3x1::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "int3x2" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemInt3x2) ); + mea->setElementType( domCg_param_type::domInt3x2::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "int3x3" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemInt3x3) ); + mea->setElementType( domCg_param_type::domInt3x3::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "int3x4" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemInt3x4) ); + mea->setElementType( domCg_param_type::domInt3x4::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "int4x1" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemInt4x1) ); + mea->setElementType( domCg_param_type::domInt4x1::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "int4x2" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemInt4x2) ); + mea->setElementType( domCg_param_type::domInt4x2::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "int4x3" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemInt4x3) ); + mea->setElementType( domCg_param_type::domInt4x3::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "int4x4" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemInt4x4) ); + mea->setElementType( domCg_param_type::domInt4x4::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "half" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemHalf) ); + mea->setElementType( domCg_param_type::domHalf::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "half1" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemHalf1) ); + mea->setElementType( domCg_param_type::domHalf1::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "half2" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemHalf2) ); + mea->setElementType( domCg_param_type::domHalf2::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "half3" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemHalf3) ); + mea->setElementType( domCg_param_type::domHalf3::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "half4" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemHalf4) ); + mea->setElementType( domCg_param_type::domHalf4::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "half1x1" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemHalf1x1) ); + mea->setElementType( domCg_param_type::domHalf1x1::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "half1x2" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemHalf1x2) ); + mea->setElementType( domCg_param_type::domHalf1x2::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "half1x3" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemHalf1x3) ); + mea->setElementType( domCg_param_type::domHalf1x3::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "half1x4" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemHalf1x4) ); + mea->setElementType( domCg_param_type::domHalf1x4::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "half2x1" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemHalf2x1) ); + mea->setElementType( domCg_param_type::domHalf2x1::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "half2x2" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemHalf2x2) ); + mea->setElementType( domCg_param_type::domHalf2x2::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "half2x3" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemHalf2x3) ); + mea->setElementType( domCg_param_type::domHalf2x3::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "half2x4" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemHalf2x4) ); + mea->setElementType( domCg_param_type::domHalf2x4::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "half3x1" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemHalf3x1) ); + mea->setElementType( domCg_param_type::domHalf3x1::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "half3x2" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemHalf3x2) ); + mea->setElementType( domCg_param_type::domHalf3x2::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "half3x3" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemHalf3x3) ); + mea->setElementType( domCg_param_type::domHalf3x3::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "half3x4" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemHalf3x4) ); + mea->setElementType( domCg_param_type::domHalf3x4::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "half4x1" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemHalf4x1) ); + mea->setElementType( domCg_param_type::domHalf4x1::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "half4x2" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemHalf4x2) ); + mea->setElementType( domCg_param_type::domHalf4x2::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "half4x3" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemHalf4x3) ); + mea->setElementType( domCg_param_type::domHalf4x3::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "half4x4" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemHalf4x4) ); + mea->setElementType( domCg_param_type::domHalf4x4::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "fixed" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemFixed) ); + mea->setElementType( domCg_param_type::domFixed::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "fixed1" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemFixed1) ); + mea->setElementType( domCg_param_type::domFixed1::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "fixed2" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemFixed2) ); + mea->setElementType( domCg_param_type::domFixed2::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "fixed3" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemFixed3) ); + mea->setElementType( domCg_param_type::domFixed3::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "fixed4" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemFixed4) ); + mea->setElementType( domCg_param_type::domFixed4::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "fixed1x1" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemFixed1x1) ); + mea->setElementType( domCg_param_type::domFixed1x1::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "fixed1x2" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemFixed1x2) ); + mea->setElementType( domCg_param_type::domFixed1x2::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "fixed1x3" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemFixed1x3) ); + mea->setElementType( domCg_param_type::domFixed1x3::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "fixed1x4" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemFixed1x4) ); + mea->setElementType( domCg_param_type::domFixed1x4::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "fixed2x1" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemFixed2x1) ); + mea->setElementType( domCg_param_type::domFixed2x1::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "fixed2x2" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemFixed2x2) ); + mea->setElementType( domCg_param_type::domFixed2x2::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "fixed2x3" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemFixed2x3) ); + mea->setElementType( domCg_param_type::domFixed2x3::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "fixed2x4" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemFixed2x4) ); + mea->setElementType( domCg_param_type::domFixed2x4::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "fixed3x1" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemFixed3x1) ); + mea->setElementType( domCg_param_type::domFixed3x1::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "fixed3x2" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemFixed3x2) ); + mea->setElementType( domCg_param_type::domFixed3x2::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "fixed3x3" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemFixed3x3) ); + mea->setElementType( domCg_param_type::domFixed3x3::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "fixed3x4" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemFixed3x4) ); + mea->setElementType( domCg_param_type::domFixed3x4::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "fixed4x1" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemFixed4x1) ); + mea->setElementType( domCg_param_type::domFixed4x1::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "fixed4x2" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemFixed4x2) ); + mea->setElementType( domCg_param_type::domFixed4x2::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "fixed4x3" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemFixed4x3) ); + mea->setElementType( domCg_param_type::domFixed4x3::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "fixed4x4" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemFixed4x4) ); + mea->setElementType( domCg_param_type::domFixed4x4::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "surface" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemSurface) ); + mea->setElementType( domCg_surface_type::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "sampler1D" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemSampler1D) ); + mea->setElementType( domCg_sampler1D::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "sampler2D" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemSampler2D) ); + mea->setElementType( domCg_sampler2D::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "sampler3D" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemSampler3D) ); + mea->setElementType( domCg_sampler3D::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "samplerRECT" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemSamplerRECT) ); + mea->setElementType( domCg_samplerRECT::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "samplerCUBE" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemSamplerCUBE) ); + mea->setElementType( domCg_samplerCUBE::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "samplerDEPTH" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemSamplerDEPTH) ); + mea->setElementType( domCg_samplerDEPTH::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "string" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemString) ); + mea->setElementType( domCg_param_type::domString::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "enum" ); + mea->setOffset( daeOffsetOf(domCg_param_type,elemEnum) ); + mea->setElementType( domCg_param_type::domEnum::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + _Meta->setCMRoot( cm ); + // Ordered list of sub-elements + _Meta->addContents(daeOffsetOf(domCg_param_type,_contents)); + _Meta->addContentsOrder(daeOffsetOf(domCg_param_type,_contentsOrder)); + + + + _Meta->setElementSize(sizeof(domCg_param_type)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domBool::create(daeInt bytes) +{ + domCg_param_type::domBoolRef ref = new(bytes) domCg_param_type::domBool; + return ref; +} + + +daeMetaElement * +domCg_param_type::domBool::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "bool" ); + _Meta->registerClass(domCg_param_type::domBool::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_bool")); + ma->setOffset( daeOffsetOf( domCg_param_type::domBool , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domBool)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domBool1::create(daeInt bytes) +{ + domCg_param_type::domBool1Ref ref = new(bytes) domCg_param_type::domBool1; + return ref; +} + + +daeMetaElement * +domCg_param_type::domBool1::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "bool1" ); + _Meta->registerClass(domCg_param_type::domBool1::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_bool1")); + ma->setOffset( daeOffsetOf( domCg_param_type::domBool1 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domBool1)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domBool2::create(daeInt bytes) +{ + domCg_param_type::domBool2Ref ref = new(bytes) domCg_param_type::domBool2; + return ref; +} + + +daeMetaElement * +domCg_param_type::domBool2::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "bool2" ); + _Meta->registerClass(domCg_param_type::domBool2::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_bool2")); + ma->setOffset( daeOffsetOf( domCg_param_type::domBool2 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domBool2)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domBool3::create(daeInt bytes) +{ + domCg_param_type::domBool3Ref ref = new(bytes) domCg_param_type::domBool3; + return ref; +} + + +daeMetaElement * +domCg_param_type::domBool3::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "bool3" ); + _Meta->registerClass(domCg_param_type::domBool3::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_bool3")); + ma->setOffset( daeOffsetOf( domCg_param_type::domBool3 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domBool3)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domBool4::create(daeInt bytes) +{ + domCg_param_type::domBool4Ref ref = new(bytes) domCg_param_type::domBool4; + return ref; +} + + +daeMetaElement * +domCg_param_type::domBool4::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "bool4" ); + _Meta->registerClass(domCg_param_type::domBool4::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_bool4")); + ma->setOffset( daeOffsetOf( domCg_param_type::domBool4 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domBool4)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domBool1x1::create(daeInt bytes) +{ + domCg_param_type::domBool1x1Ref ref = new(bytes) domCg_param_type::domBool1x1; + return ref; +} + + +daeMetaElement * +domCg_param_type::domBool1x1::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "bool1x1" ); + _Meta->registerClass(domCg_param_type::domBool1x1::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_bool1x1")); + ma->setOffset( daeOffsetOf( domCg_param_type::domBool1x1 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domBool1x1)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domBool1x2::create(daeInt bytes) +{ + domCg_param_type::domBool1x2Ref ref = new(bytes) domCg_param_type::domBool1x2; + return ref; +} + + +daeMetaElement * +domCg_param_type::domBool1x2::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "bool1x2" ); + _Meta->registerClass(domCg_param_type::domBool1x2::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_bool1x2")); + ma->setOffset( daeOffsetOf( domCg_param_type::domBool1x2 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domBool1x2)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domBool1x3::create(daeInt bytes) +{ + domCg_param_type::domBool1x3Ref ref = new(bytes) domCg_param_type::domBool1x3; + return ref; +} + + +daeMetaElement * +domCg_param_type::domBool1x3::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "bool1x3" ); + _Meta->registerClass(domCg_param_type::domBool1x3::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_bool1x3")); + ma->setOffset( daeOffsetOf( domCg_param_type::domBool1x3 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domBool1x3)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domBool1x4::create(daeInt bytes) +{ + domCg_param_type::domBool1x4Ref ref = new(bytes) domCg_param_type::domBool1x4; + return ref; +} + + +daeMetaElement * +domCg_param_type::domBool1x4::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "bool1x4" ); + _Meta->registerClass(domCg_param_type::domBool1x4::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_bool1x4")); + ma->setOffset( daeOffsetOf( domCg_param_type::domBool1x4 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domBool1x4)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domBool2x1::create(daeInt bytes) +{ + domCg_param_type::domBool2x1Ref ref = new(bytes) domCg_param_type::domBool2x1; + return ref; +} + + +daeMetaElement * +domCg_param_type::domBool2x1::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "bool2x1" ); + _Meta->registerClass(domCg_param_type::domBool2x1::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_bool2x1")); + ma->setOffset( daeOffsetOf( domCg_param_type::domBool2x1 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domBool2x1)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domBool2x2::create(daeInt bytes) +{ + domCg_param_type::domBool2x2Ref ref = new(bytes) domCg_param_type::domBool2x2; + return ref; +} + + +daeMetaElement * +domCg_param_type::domBool2x2::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "bool2x2" ); + _Meta->registerClass(domCg_param_type::domBool2x2::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_bool2x2")); + ma->setOffset( daeOffsetOf( domCg_param_type::domBool2x2 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domBool2x2)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domBool2x3::create(daeInt bytes) +{ + domCg_param_type::domBool2x3Ref ref = new(bytes) domCg_param_type::domBool2x3; + return ref; +} + + +daeMetaElement * +domCg_param_type::domBool2x3::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "bool2x3" ); + _Meta->registerClass(domCg_param_type::domBool2x3::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_bool2x3")); + ma->setOffset( daeOffsetOf( domCg_param_type::domBool2x3 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domBool2x3)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domBool2x4::create(daeInt bytes) +{ + domCg_param_type::domBool2x4Ref ref = new(bytes) domCg_param_type::domBool2x4; + return ref; +} + + +daeMetaElement * +domCg_param_type::domBool2x4::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "bool2x4" ); + _Meta->registerClass(domCg_param_type::domBool2x4::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_bool2x4")); + ma->setOffset( daeOffsetOf( domCg_param_type::domBool2x4 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domBool2x4)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domBool3x1::create(daeInt bytes) +{ + domCg_param_type::domBool3x1Ref ref = new(bytes) domCg_param_type::domBool3x1; + return ref; +} + + +daeMetaElement * +domCg_param_type::domBool3x1::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "bool3x1" ); + _Meta->registerClass(domCg_param_type::domBool3x1::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_bool3x1")); + ma->setOffset( daeOffsetOf( domCg_param_type::domBool3x1 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domBool3x1)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domBool3x2::create(daeInt bytes) +{ + domCg_param_type::domBool3x2Ref ref = new(bytes) domCg_param_type::domBool3x2; + return ref; +} + + +daeMetaElement * +domCg_param_type::domBool3x2::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "bool3x2" ); + _Meta->registerClass(domCg_param_type::domBool3x2::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_bool3x2")); + ma->setOffset( daeOffsetOf( domCg_param_type::domBool3x2 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domBool3x2)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domBool3x3::create(daeInt bytes) +{ + domCg_param_type::domBool3x3Ref ref = new(bytes) domCg_param_type::domBool3x3; + return ref; +} + + +daeMetaElement * +domCg_param_type::domBool3x3::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "bool3x3" ); + _Meta->registerClass(domCg_param_type::domBool3x3::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_bool3x3")); + ma->setOffset( daeOffsetOf( domCg_param_type::domBool3x3 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domBool3x3)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domBool3x4::create(daeInt bytes) +{ + domCg_param_type::domBool3x4Ref ref = new(bytes) domCg_param_type::domBool3x4; + return ref; +} + + +daeMetaElement * +domCg_param_type::domBool3x4::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "bool3x4" ); + _Meta->registerClass(domCg_param_type::domBool3x4::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_bool3x4")); + ma->setOffset( daeOffsetOf( domCg_param_type::domBool3x4 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domBool3x4)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domBool4x1::create(daeInt bytes) +{ + domCg_param_type::domBool4x1Ref ref = new(bytes) domCg_param_type::domBool4x1; + return ref; +} + + +daeMetaElement * +domCg_param_type::domBool4x1::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "bool4x1" ); + _Meta->registerClass(domCg_param_type::domBool4x1::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_bool4x1")); + ma->setOffset( daeOffsetOf( domCg_param_type::domBool4x1 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domBool4x1)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domBool4x2::create(daeInt bytes) +{ + domCg_param_type::domBool4x2Ref ref = new(bytes) domCg_param_type::domBool4x2; + return ref; +} + + +daeMetaElement * +domCg_param_type::domBool4x2::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "bool4x2" ); + _Meta->registerClass(domCg_param_type::domBool4x2::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_bool4x2")); + ma->setOffset( daeOffsetOf( domCg_param_type::domBool4x2 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domBool4x2)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domBool4x3::create(daeInt bytes) +{ + domCg_param_type::domBool4x3Ref ref = new(bytes) domCg_param_type::domBool4x3; + return ref; +} + + +daeMetaElement * +domCg_param_type::domBool4x3::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "bool4x3" ); + _Meta->registerClass(domCg_param_type::domBool4x3::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_bool4x3")); + ma->setOffset( daeOffsetOf( domCg_param_type::domBool4x3 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domBool4x3)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domBool4x4::create(daeInt bytes) +{ + domCg_param_type::domBool4x4Ref ref = new(bytes) domCg_param_type::domBool4x4; + return ref; +} + + +daeMetaElement * +domCg_param_type::domBool4x4::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "bool4x4" ); + _Meta->registerClass(domCg_param_type::domBool4x4::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_bool4x4")); + ma->setOffset( daeOffsetOf( domCg_param_type::domBool4x4 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domBool4x4)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domFloat::create(daeInt bytes) +{ + domCg_param_type::domFloatRef ref = new(bytes) domCg_param_type::domFloat; + return ref; +} + + +daeMetaElement * +domCg_param_type::domFloat::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "float" ); + _Meta->registerClass(domCg_param_type::domFloat::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_float")); + ma->setOffset( daeOffsetOf( domCg_param_type::domFloat , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domFloat)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domFloat1::create(daeInt bytes) +{ + domCg_param_type::domFloat1Ref ref = new(bytes) domCg_param_type::domFloat1; + return ref; +} + + +daeMetaElement * +domCg_param_type::domFloat1::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "float1" ); + _Meta->registerClass(domCg_param_type::domFloat1::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_float1")); + ma->setOffset( daeOffsetOf( domCg_param_type::domFloat1 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domFloat1)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domFloat2::create(daeInt bytes) +{ + domCg_param_type::domFloat2Ref ref = new(bytes) domCg_param_type::domFloat2; + return ref; +} + + +daeMetaElement * +domCg_param_type::domFloat2::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "float2" ); + _Meta->registerClass(domCg_param_type::domFloat2::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_float2")); + ma->setOffset( daeOffsetOf( domCg_param_type::domFloat2 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domFloat2)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domFloat3::create(daeInt bytes) +{ + domCg_param_type::domFloat3Ref ref = new(bytes) domCg_param_type::domFloat3; + return ref; +} + + +daeMetaElement * +domCg_param_type::domFloat3::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "float3" ); + _Meta->registerClass(domCg_param_type::domFloat3::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_float3")); + ma->setOffset( daeOffsetOf( domCg_param_type::domFloat3 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domFloat3)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domFloat4::create(daeInt bytes) +{ + domCg_param_type::domFloat4Ref ref = new(bytes) domCg_param_type::domFloat4; + return ref; +} + + +daeMetaElement * +domCg_param_type::domFloat4::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "float4" ); + _Meta->registerClass(domCg_param_type::domFloat4::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_float4")); + ma->setOffset( daeOffsetOf( domCg_param_type::domFloat4 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domFloat4)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domFloat1x1::create(daeInt bytes) +{ + domCg_param_type::domFloat1x1Ref ref = new(bytes) domCg_param_type::domFloat1x1; + return ref; +} + + +daeMetaElement * +domCg_param_type::domFloat1x1::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "float1x1" ); + _Meta->registerClass(domCg_param_type::domFloat1x1::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_float1x1")); + ma->setOffset( daeOffsetOf( domCg_param_type::domFloat1x1 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domFloat1x1)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domFloat1x2::create(daeInt bytes) +{ + domCg_param_type::domFloat1x2Ref ref = new(bytes) domCg_param_type::domFloat1x2; + return ref; +} + + +daeMetaElement * +domCg_param_type::domFloat1x2::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "float1x2" ); + _Meta->registerClass(domCg_param_type::domFloat1x2::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_float1x2")); + ma->setOffset( daeOffsetOf( domCg_param_type::domFloat1x2 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domFloat1x2)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domFloat1x3::create(daeInt bytes) +{ + domCg_param_type::domFloat1x3Ref ref = new(bytes) domCg_param_type::domFloat1x3; + return ref; +} + + +daeMetaElement * +domCg_param_type::domFloat1x3::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "float1x3" ); + _Meta->registerClass(domCg_param_type::domFloat1x3::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_float1x3")); + ma->setOffset( daeOffsetOf( domCg_param_type::domFloat1x3 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domFloat1x3)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domFloat1x4::create(daeInt bytes) +{ + domCg_param_type::domFloat1x4Ref ref = new(bytes) domCg_param_type::domFloat1x4; + return ref; +} + + +daeMetaElement * +domCg_param_type::domFloat1x4::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "float1x4" ); + _Meta->registerClass(domCg_param_type::domFloat1x4::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_float1x4")); + ma->setOffset( daeOffsetOf( domCg_param_type::domFloat1x4 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domFloat1x4)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domFloat2x1::create(daeInt bytes) +{ + domCg_param_type::domFloat2x1Ref ref = new(bytes) domCg_param_type::domFloat2x1; + return ref; +} + + +daeMetaElement * +domCg_param_type::domFloat2x1::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "float2x1" ); + _Meta->registerClass(domCg_param_type::domFloat2x1::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_float2x1")); + ma->setOffset( daeOffsetOf( domCg_param_type::domFloat2x1 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domFloat2x1)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domFloat2x2::create(daeInt bytes) +{ + domCg_param_type::domFloat2x2Ref ref = new(bytes) domCg_param_type::domFloat2x2; + return ref; +} + + +daeMetaElement * +domCg_param_type::domFloat2x2::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "float2x2" ); + _Meta->registerClass(domCg_param_type::domFloat2x2::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_float2x2")); + ma->setOffset( daeOffsetOf( domCg_param_type::domFloat2x2 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domFloat2x2)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domFloat2x3::create(daeInt bytes) +{ + domCg_param_type::domFloat2x3Ref ref = new(bytes) domCg_param_type::domFloat2x3; + return ref; +} + + +daeMetaElement * +domCg_param_type::domFloat2x3::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "float2x3" ); + _Meta->registerClass(domCg_param_type::domFloat2x3::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_float2x3")); + ma->setOffset( daeOffsetOf( domCg_param_type::domFloat2x3 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domFloat2x3)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domFloat2x4::create(daeInt bytes) +{ + domCg_param_type::domFloat2x4Ref ref = new(bytes) domCg_param_type::domFloat2x4; + return ref; +} + + +daeMetaElement * +domCg_param_type::domFloat2x4::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "float2x4" ); + _Meta->registerClass(domCg_param_type::domFloat2x4::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_float2x4")); + ma->setOffset( daeOffsetOf( domCg_param_type::domFloat2x4 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domFloat2x4)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domFloat3x1::create(daeInt bytes) +{ + domCg_param_type::domFloat3x1Ref ref = new(bytes) domCg_param_type::domFloat3x1; + return ref; +} + + +daeMetaElement * +domCg_param_type::domFloat3x1::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "float3x1" ); + _Meta->registerClass(domCg_param_type::domFloat3x1::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_float3x1")); + ma->setOffset( daeOffsetOf( domCg_param_type::domFloat3x1 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domFloat3x1)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domFloat3x2::create(daeInt bytes) +{ + domCg_param_type::domFloat3x2Ref ref = new(bytes) domCg_param_type::domFloat3x2; + return ref; +} + + +daeMetaElement * +domCg_param_type::domFloat3x2::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "float3x2" ); + _Meta->registerClass(domCg_param_type::domFloat3x2::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_float3x2")); + ma->setOffset( daeOffsetOf( domCg_param_type::domFloat3x2 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domFloat3x2)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domFloat3x3::create(daeInt bytes) +{ + domCg_param_type::domFloat3x3Ref ref = new(bytes) domCg_param_type::domFloat3x3; + return ref; +} + + +daeMetaElement * +domCg_param_type::domFloat3x3::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "float3x3" ); + _Meta->registerClass(domCg_param_type::domFloat3x3::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_float3x3")); + ma->setOffset( daeOffsetOf( domCg_param_type::domFloat3x3 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domFloat3x3)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domFloat3x4::create(daeInt bytes) +{ + domCg_param_type::domFloat3x4Ref ref = new(bytes) domCg_param_type::domFloat3x4; + return ref; +} + + +daeMetaElement * +domCg_param_type::domFloat3x4::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "float3x4" ); + _Meta->registerClass(domCg_param_type::domFloat3x4::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_float3x4")); + ma->setOffset( daeOffsetOf( domCg_param_type::domFloat3x4 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domFloat3x4)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domFloat4x1::create(daeInt bytes) +{ + domCg_param_type::domFloat4x1Ref ref = new(bytes) domCg_param_type::domFloat4x1; + return ref; +} + + +daeMetaElement * +domCg_param_type::domFloat4x1::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "float4x1" ); + _Meta->registerClass(domCg_param_type::domFloat4x1::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_float4x1")); + ma->setOffset( daeOffsetOf( domCg_param_type::domFloat4x1 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domFloat4x1)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domFloat4x2::create(daeInt bytes) +{ + domCg_param_type::domFloat4x2Ref ref = new(bytes) domCg_param_type::domFloat4x2; + return ref; +} + + +daeMetaElement * +domCg_param_type::domFloat4x2::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "float4x2" ); + _Meta->registerClass(domCg_param_type::domFloat4x2::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_float4x2")); + ma->setOffset( daeOffsetOf( domCg_param_type::domFloat4x2 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domFloat4x2)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domFloat4x3::create(daeInt bytes) +{ + domCg_param_type::domFloat4x3Ref ref = new(bytes) domCg_param_type::domFloat4x3; + return ref; +} + + +daeMetaElement * +domCg_param_type::domFloat4x3::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "float4x3" ); + _Meta->registerClass(domCg_param_type::domFloat4x3::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_float4x3")); + ma->setOffset( daeOffsetOf( domCg_param_type::domFloat4x3 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domFloat4x3)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domFloat4x4::create(daeInt bytes) +{ + domCg_param_type::domFloat4x4Ref ref = new(bytes) domCg_param_type::domFloat4x4; + return ref; +} + + +daeMetaElement * +domCg_param_type::domFloat4x4::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "float4x4" ); + _Meta->registerClass(domCg_param_type::domFloat4x4::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_float4x4")); + ma->setOffset( daeOffsetOf( domCg_param_type::domFloat4x4 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domFloat4x4)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domInt::create(daeInt bytes) +{ + domCg_param_type::domIntRef ref = new(bytes) domCg_param_type::domInt; + return ref; +} + + +daeMetaElement * +domCg_param_type::domInt::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "int" ); + _Meta->registerClass(domCg_param_type::domInt::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_int")); + ma->setOffset( daeOffsetOf( domCg_param_type::domInt , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domInt)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domInt1::create(daeInt bytes) +{ + domCg_param_type::domInt1Ref ref = new(bytes) domCg_param_type::domInt1; + return ref; +} + + +daeMetaElement * +domCg_param_type::domInt1::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "int1" ); + _Meta->registerClass(domCg_param_type::domInt1::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_int1")); + ma->setOffset( daeOffsetOf( domCg_param_type::domInt1 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domInt1)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domInt2::create(daeInt bytes) +{ + domCg_param_type::domInt2Ref ref = new(bytes) domCg_param_type::domInt2; + return ref; +} + + +daeMetaElement * +domCg_param_type::domInt2::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "int2" ); + _Meta->registerClass(domCg_param_type::domInt2::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_int2")); + ma->setOffset( daeOffsetOf( domCg_param_type::domInt2 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domInt2)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domInt3::create(daeInt bytes) +{ + domCg_param_type::domInt3Ref ref = new(bytes) domCg_param_type::domInt3; + return ref; +} + + +daeMetaElement * +domCg_param_type::domInt3::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "int3" ); + _Meta->registerClass(domCg_param_type::domInt3::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_int3")); + ma->setOffset( daeOffsetOf( domCg_param_type::domInt3 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domInt3)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domInt4::create(daeInt bytes) +{ + domCg_param_type::domInt4Ref ref = new(bytes) domCg_param_type::domInt4; + return ref; +} + + +daeMetaElement * +domCg_param_type::domInt4::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "int4" ); + _Meta->registerClass(domCg_param_type::domInt4::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_int4")); + ma->setOffset( daeOffsetOf( domCg_param_type::domInt4 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domInt4)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domInt1x1::create(daeInt bytes) +{ + domCg_param_type::domInt1x1Ref ref = new(bytes) domCg_param_type::domInt1x1; + return ref; +} + + +daeMetaElement * +domCg_param_type::domInt1x1::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "int1x1" ); + _Meta->registerClass(domCg_param_type::domInt1x1::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_int1x1")); + ma->setOffset( daeOffsetOf( domCg_param_type::domInt1x1 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domInt1x1)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domInt1x2::create(daeInt bytes) +{ + domCg_param_type::domInt1x2Ref ref = new(bytes) domCg_param_type::domInt1x2; + return ref; +} + + +daeMetaElement * +domCg_param_type::domInt1x2::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "int1x2" ); + _Meta->registerClass(domCg_param_type::domInt1x2::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_int1x2")); + ma->setOffset( daeOffsetOf( domCg_param_type::domInt1x2 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domInt1x2)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domInt1x3::create(daeInt bytes) +{ + domCg_param_type::domInt1x3Ref ref = new(bytes) domCg_param_type::domInt1x3; + return ref; +} + + +daeMetaElement * +domCg_param_type::domInt1x3::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "int1x3" ); + _Meta->registerClass(domCg_param_type::domInt1x3::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_int1x3")); + ma->setOffset( daeOffsetOf( domCg_param_type::domInt1x3 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domInt1x3)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domInt1x4::create(daeInt bytes) +{ + domCg_param_type::domInt1x4Ref ref = new(bytes) domCg_param_type::domInt1x4; + return ref; +} + + +daeMetaElement * +domCg_param_type::domInt1x4::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "int1x4" ); + _Meta->registerClass(domCg_param_type::domInt1x4::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_int1x4")); + ma->setOffset( daeOffsetOf( domCg_param_type::domInt1x4 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domInt1x4)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domInt2x1::create(daeInt bytes) +{ + domCg_param_type::domInt2x1Ref ref = new(bytes) domCg_param_type::domInt2x1; + return ref; +} + + +daeMetaElement * +domCg_param_type::domInt2x1::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "int2x1" ); + _Meta->registerClass(domCg_param_type::domInt2x1::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_int2x1")); + ma->setOffset( daeOffsetOf( domCg_param_type::domInt2x1 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domInt2x1)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domInt2x2::create(daeInt bytes) +{ + domCg_param_type::domInt2x2Ref ref = new(bytes) domCg_param_type::domInt2x2; + return ref; +} + + +daeMetaElement * +domCg_param_type::domInt2x2::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "int2x2" ); + _Meta->registerClass(domCg_param_type::domInt2x2::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_int2x2")); + ma->setOffset( daeOffsetOf( domCg_param_type::domInt2x2 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domInt2x2)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domInt2x3::create(daeInt bytes) +{ + domCg_param_type::domInt2x3Ref ref = new(bytes) domCg_param_type::domInt2x3; + return ref; +} + + +daeMetaElement * +domCg_param_type::domInt2x3::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "int2x3" ); + _Meta->registerClass(domCg_param_type::domInt2x3::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_int2x3")); + ma->setOffset( daeOffsetOf( domCg_param_type::domInt2x3 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domInt2x3)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domInt2x4::create(daeInt bytes) +{ + domCg_param_type::domInt2x4Ref ref = new(bytes) domCg_param_type::domInt2x4; + return ref; +} + + +daeMetaElement * +domCg_param_type::domInt2x4::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "int2x4" ); + _Meta->registerClass(domCg_param_type::domInt2x4::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_int2x4")); + ma->setOffset( daeOffsetOf( domCg_param_type::domInt2x4 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domInt2x4)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domInt3x1::create(daeInt bytes) +{ + domCg_param_type::domInt3x1Ref ref = new(bytes) domCg_param_type::domInt3x1; + return ref; +} + + +daeMetaElement * +domCg_param_type::domInt3x1::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "int3x1" ); + _Meta->registerClass(domCg_param_type::domInt3x1::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_int3x1")); + ma->setOffset( daeOffsetOf( domCg_param_type::domInt3x1 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domInt3x1)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domInt3x2::create(daeInt bytes) +{ + domCg_param_type::domInt3x2Ref ref = new(bytes) domCg_param_type::domInt3x2; + return ref; +} + + +daeMetaElement * +domCg_param_type::domInt3x2::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "int3x2" ); + _Meta->registerClass(domCg_param_type::domInt3x2::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_int3x2")); + ma->setOffset( daeOffsetOf( domCg_param_type::domInt3x2 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domInt3x2)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domInt3x3::create(daeInt bytes) +{ + domCg_param_type::domInt3x3Ref ref = new(bytes) domCg_param_type::domInt3x3; + return ref; +} + + +daeMetaElement * +domCg_param_type::domInt3x3::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "int3x3" ); + _Meta->registerClass(domCg_param_type::domInt3x3::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_int3x3")); + ma->setOffset( daeOffsetOf( domCg_param_type::domInt3x3 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domInt3x3)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domInt3x4::create(daeInt bytes) +{ + domCg_param_type::domInt3x4Ref ref = new(bytes) domCg_param_type::domInt3x4; + return ref; +} + + +daeMetaElement * +domCg_param_type::domInt3x4::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "int3x4" ); + _Meta->registerClass(domCg_param_type::domInt3x4::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_int3x4")); + ma->setOffset( daeOffsetOf( domCg_param_type::domInt3x4 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domInt3x4)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domInt4x1::create(daeInt bytes) +{ + domCg_param_type::domInt4x1Ref ref = new(bytes) domCg_param_type::domInt4x1; + return ref; +} + + +daeMetaElement * +domCg_param_type::domInt4x1::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "int4x1" ); + _Meta->registerClass(domCg_param_type::domInt4x1::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_int4x1")); + ma->setOffset( daeOffsetOf( domCg_param_type::domInt4x1 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domInt4x1)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domInt4x2::create(daeInt bytes) +{ + domCg_param_type::domInt4x2Ref ref = new(bytes) domCg_param_type::domInt4x2; + return ref; +} + + +daeMetaElement * +domCg_param_type::domInt4x2::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "int4x2" ); + _Meta->registerClass(domCg_param_type::domInt4x2::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_int4x2")); + ma->setOffset( daeOffsetOf( domCg_param_type::domInt4x2 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domInt4x2)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domInt4x3::create(daeInt bytes) +{ + domCg_param_type::domInt4x3Ref ref = new(bytes) domCg_param_type::domInt4x3; + return ref; +} + + +daeMetaElement * +domCg_param_type::domInt4x3::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "int4x3" ); + _Meta->registerClass(domCg_param_type::domInt4x3::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_int4x3")); + ma->setOffset( daeOffsetOf( domCg_param_type::domInt4x3 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domInt4x3)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domInt4x4::create(daeInt bytes) +{ + domCg_param_type::domInt4x4Ref ref = new(bytes) domCg_param_type::domInt4x4; + return ref; +} + + +daeMetaElement * +domCg_param_type::domInt4x4::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "int4x4" ); + _Meta->registerClass(domCg_param_type::domInt4x4::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_int4x4")); + ma->setOffset( daeOffsetOf( domCg_param_type::domInt4x4 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domInt4x4)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domHalf::create(daeInt bytes) +{ + domCg_param_type::domHalfRef ref = new(bytes) domCg_param_type::domHalf; + return ref; +} + + +daeMetaElement * +domCg_param_type::domHalf::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "half" ); + _Meta->registerClass(domCg_param_type::domHalf::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_half")); + ma->setOffset( daeOffsetOf( domCg_param_type::domHalf , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domHalf)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domHalf1::create(daeInt bytes) +{ + domCg_param_type::domHalf1Ref ref = new(bytes) domCg_param_type::domHalf1; + return ref; +} + + +daeMetaElement * +domCg_param_type::domHalf1::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "half1" ); + _Meta->registerClass(domCg_param_type::domHalf1::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_half1")); + ma->setOffset( daeOffsetOf( domCg_param_type::domHalf1 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domHalf1)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domHalf2::create(daeInt bytes) +{ + domCg_param_type::domHalf2Ref ref = new(bytes) domCg_param_type::domHalf2; + return ref; +} + + +daeMetaElement * +domCg_param_type::domHalf2::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "half2" ); + _Meta->registerClass(domCg_param_type::domHalf2::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_half2")); + ma->setOffset( daeOffsetOf( domCg_param_type::domHalf2 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domHalf2)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domHalf3::create(daeInt bytes) +{ + domCg_param_type::domHalf3Ref ref = new(bytes) domCg_param_type::domHalf3; + return ref; +} + + +daeMetaElement * +domCg_param_type::domHalf3::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "half3" ); + _Meta->registerClass(domCg_param_type::domHalf3::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_half3")); + ma->setOffset( daeOffsetOf( domCg_param_type::domHalf3 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domHalf3)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domHalf4::create(daeInt bytes) +{ + domCg_param_type::domHalf4Ref ref = new(bytes) domCg_param_type::domHalf4; + return ref; +} + + +daeMetaElement * +domCg_param_type::domHalf4::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "half4" ); + _Meta->registerClass(domCg_param_type::domHalf4::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_half4")); + ma->setOffset( daeOffsetOf( domCg_param_type::domHalf4 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domHalf4)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domHalf1x1::create(daeInt bytes) +{ + domCg_param_type::domHalf1x1Ref ref = new(bytes) domCg_param_type::domHalf1x1; + return ref; +} + + +daeMetaElement * +domCg_param_type::domHalf1x1::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "half1x1" ); + _Meta->registerClass(domCg_param_type::domHalf1x1::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_half1x1")); + ma->setOffset( daeOffsetOf( domCg_param_type::domHalf1x1 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domHalf1x1)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domHalf1x2::create(daeInt bytes) +{ + domCg_param_type::domHalf1x2Ref ref = new(bytes) domCg_param_type::domHalf1x2; + return ref; +} + + +daeMetaElement * +domCg_param_type::domHalf1x2::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "half1x2" ); + _Meta->registerClass(domCg_param_type::domHalf1x2::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_half1x2")); + ma->setOffset( daeOffsetOf( domCg_param_type::domHalf1x2 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domHalf1x2)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domHalf1x3::create(daeInt bytes) +{ + domCg_param_type::domHalf1x3Ref ref = new(bytes) domCg_param_type::domHalf1x3; + return ref; +} + + +daeMetaElement * +domCg_param_type::domHalf1x3::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "half1x3" ); + _Meta->registerClass(domCg_param_type::domHalf1x3::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_half1x3")); + ma->setOffset( daeOffsetOf( domCg_param_type::domHalf1x3 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domHalf1x3)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domHalf1x4::create(daeInt bytes) +{ + domCg_param_type::domHalf1x4Ref ref = new(bytes) domCg_param_type::domHalf1x4; + return ref; +} + + +daeMetaElement * +domCg_param_type::domHalf1x4::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "half1x4" ); + _Meta->registerClass(domCg_param_type::domHalf1x4::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_half1x4")); + ma->setOffset( daeOffsetOf( domCg_param_type::domHalf1x4 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domHalf1x4)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domHalf2x1::create(daeInt bytes) +{ + domCg_param_type::domHalf2x1Ref ref = new(bytes) domCg_param_type::domHalf2x1; + return ref; +} + + +daeMetaElement * +domCg_param_type::domHalf2x1::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "half2x1" ); + _Meta->registerClass(domCg_param_type::domHalf2x1::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_half2x1")); + ma->setOffset( daeOffsetOf( domCg_param_type::domHalf2x1 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domHalf2x1)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domHalf2x2::create(daeInt bytes) +{ + domCg_param_type::domHalf2x2Ref ref = new(bytes) domCg_param_type::domHalf2x2; + return ref; +} + + +daeMetaElement * +domCg_param_type::domHalf2x2::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "half2x2" ); + _Meta->registerClass(domCg_param_type::domHalf2x2::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_half2x2")); + ma->setOffset( daeOffsetOf( domCg_param_type::domHalf2x2 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domHalf2x2)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domHalf2x3::create(daeInt bytes) +{ + domCg_param_type::domHalf2x3Ref ref = new(bytes) domCg_param_type::domHalf2x3; + return ref; +} + + +daeMetaElement * +domCg_param_type::domHalf2x3::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "half2x3" ); + _Meta->registerClass(domCg_param_type::domHalf2x3::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_half2x3")); + ma->setOffset( daeOffsetOf( domCg_param_type::domHalf2x3 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domHalf2x3)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domHalf2x4::create(daeInt bytes) +{ + domCg_param_type::domHalf2x4Ref ref = new(bytes) domCg_param_type::domHalf2x4; + return ref; +} + + +daeMetaElement * +domCg_param_type::domHalf2x4::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "half2x4" ); + _Meta->registerClass(domCg_param_type::domHalf2x4::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_half2x4")); + ma->setOffset( daeOffsetOf( domCg_param_type::domHalf2x4 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domHalf2x4)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domHalf3x1::create(daeInt bytes) +{ + domCg_param_type::domHalf3x1Ref ref = new(bytes) domCg_param_type::domHalf3x1; + return ref; +} + + +daeMetaElement * +domCg_param_type::domHalf3x1::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "half3x1" ); + _Meta->registerClass(domCg_param_type::domHalf3x1::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_half3x1")); + ma->setOffset( daeOffsetOf( domCg_param_type::domHalf3x1 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domHalf3x1)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domHalf3x2::create(daeInt bytes) +{ + domCg_param_type::domHalf3x2Ref ref = new(bytes) domCg_param_type::domHalf3x2; + return ref; +} + + +daeMetaElement * +domCg_param_type::domHalf3x2::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "half3x2" ); + _Meta->registerClass(domCg_param_type::domHalf3x2::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_half3x2")); + ma->setOffset( daeOffsetOf( domCg_param_type::domHalf3x2 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domHalf3x2)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domHalf3x3::create(daeInt bytes) +{ + domCg_param_type::domHalf3x3Ref ref = new(bytes) domCg_param_type::domHalf3x3; + return ref; +} + + +daeMetaElement * +domCg_param_type::domHalf3x3::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "half3x3" ); + _Meta->registerClass(domCg_param_type::domHalf3x3::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_half3x3")); + ma->setOffset( daeOffsetOf( domCg_param_type::domHalf3x3 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domHalf3x3)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domHalf3x4::create(daeInt bytes) +{ + domCg_param_type::domHalf3x4Ref ref = new(bytes) domCg_param_type::domHalf3x4; + return ref; +} + + +daeMetaElement * +domCg_param_type::domHalf3x4::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "half3x4" ); + _Meta->registerClass(domCg_param_type::domHalf3x4::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_half3x4")); + ma->setOffset( daeOffsetOf( domCg_param_type::domHalf3x4 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domHalf3x4)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domHalf4x1::create(daeInt bytes) +{ + domCg_param_type::domHalf4x1Ref ref = new(bytes) domCg_param_type::domHalf4x1; + return ref; +} + + +daeMetaElement * +domCg_param_type::domHalf4x1::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "half4x1" ); + _Meta->registerClass(domCg_param_type::domHalf4x1::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_half4x1")); + ma->setOffset( daeOffsetOf( domCg_param_type::domHalf4x1 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domHalf4x1)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domHalf4x2::create(daeInt bytes) +{ + domCg_param_type::domHalf4x2Ref ref = new(bytes) domCg_param_type::domHalf4x2; + return ref; +} + + +daeMetaElement * +domCg_param_type::domHalf4x2::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "half4x2" ); + _Meta->registerClass(domCg_param_type::domHalf4x2::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_half4x2")); + ma->setOffset( daeOffsetOf( domCg_param_type::domHalf4x2 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domHalf4x2)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domHalf4x3::create(daeInt bytes) +{ + domCg_param_type::domHalf4x3Ref ref = new(bytes) domCg_param_type::domHalf4x3; + return ref; +} + + +daeMetaElement * +domCg_param_type::domHalf4x3::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "half4x3" ); + _Meta->registerClass(domCg_param_type::domHalf4x3::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_half4x3")); + ma->setOffset( daeOffsetOf( domCg_param_type::domHalf4x3 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domHalf4x3)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domHalf4x4::create(daeInt bytes) +{ + domCg_param_type::domHalf4x4Ref ref = new(bytes) domCg_param_type::domHalf4x4; + return ref; +} + + +daeMetaElement * +domCg_param_type::domHalf4x4::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "half4x4" ); + _Meta->registerClass(domCg_param_type::domHalf4x4::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_half4x4")); + ma->setOffset( daeOffsetOf( domCg_param_type::domHalf4x4 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domHalf4x4)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domFixed::create(daeInt bytes) +{ + domCg_param_type::domFixedRef ref = new(bytes) domCg_param_type::domFixed; + return ref; +} + + +daeMetaElement * +domCg_param_type::domFixed::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "fixed" ); + _Meta->registerClass(domCg_param_type::domFixed::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_fixed")); + ma->setOffset( daeOffsetOf( domCg_param_type::domFixed , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domFixed)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domFixed1::create(daeInt bytes) +{ + domCg_param_type::domFixed1Ref ref = new(bytes) domCg_param_type::domFixed1; + return ref; +} + + +daeMetaElement * +domCg_param_type::domFixed1::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "fixed1" ); + _Meta->registerClass(domCg_param_type::domFixed1::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_fixed1")); + ma->setOffset( daeOffsetOf( domCg_param_type::domFixed1 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domFixed1)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domFixed2::create(daeInt bytes) +{ + domCg_param_type::domFixed2Ref ref = new(bytes) domCg_param_type::domFixed2; + return ref; +} + + +daeMetaElement * +domCg_param_type::domFixed2::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "fixed2" ); + _Meta->registerClass(domCg_param_type::domFixed2::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_fixed2")); + ma->setOffset( daeOffsetOf( domCg_param_type::domFixed2 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domFixed2)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domFixed3::create(daeInt bytes) +{ + domCg_param_type::domFixed3Ref ref = new(bytes) domCg_param_type::domFixed3; + return ref; +} + + +daeMetaElement * +domCg_param_type::domFixed3::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "fixed3" ); + _Meta->registerClass(domCg_param_type::domFixed3::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_fixed3")); + ma->setOffset( daeOffsetOf( domCg_param_type::domFixed3 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domFixed3)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domFixed4::create(daeInt bytes) +{ + domCg_param_type::domFixed4Ref ref = new(bytes) domCg_param_type::domFixed4; + return ref; +} + + +daeMetaElement * +domCg_param_type::domFixed4::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "fixed4" ); + _Meta->registerClass(domCg_param_type::domFixed4::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_fixed4")); + ma->setOffset( daeOffsetOf( domCg_param_type::domFixed4 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domFixed4)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domFixed1x1::create(daeInt bytes) +{ + domCg_param_type::domFixed1x1Ref ref = new(bytes) domCg_param_type::domFixed1x1; + return ref; +} + + +daeMetaElement * +domCg_param_type::domFixed1x1::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "fixed1x1" ); + _Meta->registerClass(domCg_param_type::domFixed1x1::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_fixed1x1")); + ma->setOffset( daeOffsetOf( domCg_param_type::domFixed1x1 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domFixed1x1)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domFixed1x2::create(daeInt bytes) +{ + domCg_param_type::domFixed1x2Ref ref = new(bytes) domCg_param_type::domFixed1x2; + return ref; +} + + +daeMetaElement * +domCg_param_type::domFixed1x2::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "fixed1x2" ); + _Meta->registerClass(domCg_param_type::domFixed1x2::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_fixed1x2")); + ma->setOffset( daeOffsetOf( domCg_param_type::domFixed1x2 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domFixed1x2)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domFixed1x3::create(daeInt bytes) +{ + domCg_param_type::domFixed1x3Ref ref = new(bytes) domCg_param_type::domFixed1x3; + return ref; +} + + +daeMetaElement * +domCg_param_type::domFixed1x3::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "fixed1x3" ); + _Meta->registerClass(domCg_param_type::domFixed1x3::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_fixed1x3")); + ma->setOffset( daeOffsetOf( domCg_param_type::domFixed1x3 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domFixed1x3)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domFixed1x4::create(daeInt bytes) +{ + domCg_param_type::domFixed1x4Ref ref = new(bytes) domCg_param_type::domFixed1x4; + return ref; +} + + +daeMetaElement * +domCg_param_type::domFixed1x4::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "fixed1x4" ); + _Meta->registerClass(domCg_param_type::domFixed1x4::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_fixed1x4")); + ma->setOffset( daeOffsetOf( domCg_param_type::domFixed1x4 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domFixed1x4)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domFixed2x1::create(daeInt bytes) +{ + domCg_param_type::domFixed2x1Ref ref = new(bytes) domCg_param_type::domFixed2x1; + return ref; +} + + +daeMetaElement * +domCg_param_type::domFixed2x1::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "fixed2x1" ); + _Meta->registerClass(domCg_param_type::domFixed2x1::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_fixed2x1")); + ma->setOffset( daeOffsetOf( domCg_param_type::domFixed2x1 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domFixed2x1)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domFixed2x2::create(daeInt bytes) +{ + domCg_param_type::domFixed2x2Ref ref = new(bytes) domCg_param_type::domFixed2x2; + return ref; +} + + +daeMetaElement * +domCg_param_type::domFixed2x2::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "fixed2x2" ); + _Meta->registerClass(domCg_param_type::domFixed2x2::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_fixed2x2")); + ma->setOffset( daeOffsetOf( domCg_param_type::domFixed2x2 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domFixed2x2)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domFixed2x3::create(daeInt bytes) +{ + domCg_param_type::domFixed2x3Ref ref = new(bytes) domCg_param_type::domFixed2x3; + return ref; +} + + +daeMetaElement * +domCg_param_type::domFixed2x3::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "fixed2x3" ); + _Meta->registerClass(domCg_param_type::domFixed2x3::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_fixed2x3")); + ma->setOffset( daeOffsetOf( domCg_param_type::domFixed2x3 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domFixed2x3)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domFixed2x4::create(daeInt bytes) +{ + domCg_param_type::domFixed2x4Ref ref = new(bytes) domCg_param_type::domFixed2x4; + return ref; +} + + +daeMetaElement * +domCg_param_type::domFixed2x4::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "fixed2x4" ); + _Meta->registerClass(domCg_param_type::domFixed2x4::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_fixed2x4")); + ma->setOffset( daeOffsetOf( domCg_param_type::domFixed2x4 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domFixed2x4)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domFixed3x1::create(daeInt bytes) +{ + domCg_param_type::domFixed3x1Ref ref = new(bytes) domCg_param_type::domFixed3x1; + return ref; +} + + +daeMetaElement * +domCg_param_type::domFixed3x1::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "fixed3x1" ); + _Meta->registerClass(domCg_param_type::domFixed3x1::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_fixed3x1")); + ma->setOffset( daeOffsetOf( domCg_param_type::domFixed3x1 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domFixed3x1)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domFixed3x2::create(daeInt bytes) +{ + domCg_param_type::domFixed3x2Ref ref = new(bytes) domCg_param_type::domFixed3x2; + return ref; +} + + +daeMetaElement * +domCg_param_type::domFixed3x2::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "fixed3x2" ); + _Meta->registerClass(domCg_param_type::domFixed3x2::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_fixed3x2")); + ma->setOffset( daeOffsetOf( domCg_param_type::domFixed3x2 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domFixed3x2)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domFixed3x3::create(daeInt bytes) +{ + domCg_param_type::domFixed3x3Ref ref = new(bytes) domCg_param_type::domFixed3x3; + return ref; +} + + +daeMetaElement * +domCg_param_type::domFixed3x3::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "fixed3x3" ); + _Meta->registerClass(domCg_param_type::domFixed3x3::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_fixed3x3")); + ma->setOffset( daeOffsetOf( domCg_param_type::domFixed3x3 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domFixed3x3)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domFixed3x4::create(daeInt bytes) +{ + domCg_param_type::domFixed3x4Ref ref = new(bytes) domCg_param_type::domFixed3x4; + return ref; +} + + +daeMetaElement * +domCg_param_type::domFixed3x4::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "fixed3x4" ); + _Meta->registerClass(domCg_param_type::domFixed3x4::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_fixed3x4")); + ma->setOffset( daeOffsetOf( domCg_param_type::domFixed3x4 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domFixed3x4)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domFixed4x1::create(daeInt bytes) +{ + domCg_param_type::domFixed4x1Ref ref = new(bytes) domCg_param_type::domFixed4x1; + return ref; +} + + +daeMetaElement * +domCg_param_type::domFixed4x1::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "fixed4x1" ); + _Meta->registerClass(domCg_param_type::domFixed4x1::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_fixed4x1")); + ma->setOffset( daeOffsetOf( domCg_param_type::domFixed4x1 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domFixed4x1)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domFixed4x2::create(daeInt bytes) +{ + domCg_param_type::domFixed4x2Ref ref = new(bytes) domCg_param_type::domFixed4x2; + return ref; +} + + +daeMetaElement * +domCg_param_type::domFixed4x2::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "fixed4x2" ); + _Meta->registerClass(domCg_param_type::domFixed4x2::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_fixed4x2")); + ma->setOffset( daeOffsetOf( domCg_param_type::domFixed4x2 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domFixed4x2)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domFixed4x3::create(daeInt bytes) +{ + domCg_param_type::domFixed4x3Ref ref = new(bytes) domCg_param_type::domFixed4x3; + return ref; +} + + +daeMetaElement * +domCg_param_type::domFixed4x3::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "fixed4x3" ); + _Meta->registerClass(domCg_param_type::domFixed4x3::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_fixed4x3")); + ma->setOffset( daeOffsetOf( domCg_param_type::domFixed4x3 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domFixed4x3)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domFixed4x4::create(daeInt bytes) +{ + domCg_param_type::domFixed4x4Ref ref = new(bytes) domCg_param_type::domFixed4x4; + return ref; +} + + +daeMetaElement * +domCg_param_type::domFixed4x4::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "fixed4x4" ); + _Meta->registerClass(domCg_param_type::domFixed4x4::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Cg_fixed4x4")); + ma->setOffset( daeOffsetOf( domCg_param_type::domFixed4x4 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domFixed4x4)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domString::create(daeInt bytes) +{ + domCg_param_type::domStringRef ref = new(bytes) domCg_param_type::domString; + return ref; +} + + +daeMetaElement * +domCg_param_type::domString::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "string" ); + _Meta->registerClass(domCg_param_type::domString::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("xsString")); + ma->setOffset( daeOffsetOf( domCg_param_type::domString , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domString)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_param_type::domEnum::create(daeInt bytes) +{ + domCg_param_type::domEnumRef ref = new(bytes) domCg_param_type::domEnum; + return ref; +} + + +daeMetaElement * +domCg_param_type::domEnum::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "enum" ); + _Meta->registerClass(domCg_param_type::domEnum::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Gl_enumeration")); + ma->setOffset( daeOffsetOf( domCg_param_type::domEnum , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_param_type::domEnum)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domCg_param_type::_Meta = NULL; +daeMetaElement * domCg_param_type::domBool::_Meta = NULL; +daeMetaElement * domCg_param_type::domBool1::_Meta = NULL; +daeMetaElement * domCg_param_type::domBool2::_Meta = NULL; +daeMetaElement * domCg_param_type::domBool3::_Meta = NULL; +daeMetaElement * domCg_param_type::domBool4::_Meta = NULL; +daeMetaElement * domCg_param_type::domBool1x1::_Meta = NULL; +daeMetaElement * domCg_param_type::domBool1x2::_Meta = NULL; +daeMetaElement * domCg_param_type::domBool1x3::_Meta = NULL; +daeMetaElement * domCg_param_type::domBool1x4::_Meta = NULL; +daeMetaElement * domCg_param_type::domBool2x1::_Meta = NULL; +daeMetaElement * domCg_param_type::domBool2x2::_Meta = NULL; +daeMetaElement * domCg_param_type::domBool2x3::_Meta = NULL; +daeMetaElement * domCg_param_type::domBool2x4::_Meta = NULL; +daeMetaElement * domCg_param_type::domBool3x1::_Meta = NULL; +daeMetaElement * domCg_param_type::domBool3x2::_Meta = NULL; +daeMetaElement * domCg_param_type::domBool3x3::_Meta = NULL; +daeMetaElement * domCg_param_type::domBool3x4::_Meta = NULL; +daeMetaElement * domCg_param_type::domBool4x1::_Meta = NULL; +daeMetaElement * domCg_param_type::domBool4x2::_Meta = NULL; +daeMetaElement * domCg_param_type::domBool4x3::_Meta = NULL; +daeMetaElement * domCg_param_type::domBool4x4::_Meta = NULL; +daeMetaElement * domCg_param_type::domFloat::_Meta = NULL; +daeMetaElement * domCg_param_type::domFloat1::_Meta = NULL; +daeMetaElement * domCg_param_type::domFloat2::_Meta = NULL; +daeMetaElement * domCg_param_type::domFloat3::_Meta = NULL; +daeMetaElement * domCg_param_type::domFloat4::_Meta = NULL; +daeMetaElement * domCg_param_type::domFloat1x1::_Meta = NULL; +daeMetaElement * domCg_param_type::domFloat1x2::_Meta = NULL; +daeMetaElement * domCg_param_type::domFloat1x3::_Meta = NULL; +daeMetaElement * domCg_param_type::domFloat1x4::_Meta = NULL; +daeMetaElement * domCg_param_type::domFloat2x1::_Meta = NULL; +daeMetaElement * domCg_param_type::domFloat2x2::_Meta = NULL; +daeMetaElement * domCg_param_type::domFloat2x3::_Meta = NULL; +daeMetaElement * domCg_param_type::domFloat2x4::_Meta = NULL; +daeMetaElement * domCg_param_type::domFloat3x1::_Meta = NULL; +daeMetaElement * domCg_param_type::domFloat3x2::_Meta = NULL; +daeMetaElement * domCg_param_type::domFloat3x3::_Meta = NULL; +daeMetaElement * domCg_param_type::domFloat3x4::_Meta = NULL; +daeMetaElement * domCg_param_type::domFloat4x1::_Meta = NULL; +daeMetaElement * domCg_param_type::domFloat4x2::_Meta = NULL; +daeMetaElement * domCg_param_type::domFloat4x3::_Meta = NULL; +daeMetaElement * domCg_param_type::domFloat4x4::_Meta = NULL; +daeMetaElement * domCg_param_type::domInt::_Meta = NULL; +daeMetaElement * domCg_param_type::domInt1::_Meta = NULL; +daeMetaElement * domCg_param_type::domInt2::_Meta = NULL; +daeMetaElement * domCg_param_type::domInt3::_Meta = NULL; +daeMetaElement * domCg_param_type::domInt4::_Meta = NULL; +daeMetaElement * domCg_param_type::domInt1x1::_Meta = NULL; +daeMetaElement * domCg_param_type::domInt1x2::_Meta = NULL; +daeMetaElement * domCg_param_type::domInt1x3::_Meta = NULL; +daeMetaElement * domCg_param_type::domInt1x4::_Meta = NULL; +daeMetaElement * domCg_param_type::domInt2x1::_Meta = NULL; +daeMetaElement * domCg_param_type::domInt2x2::_Meta = NULL; +daeMetaElement * domCg_param_type::domInt2x3::_Meta = NULL; +daeMetaElement * domCg_param_type::domInt2x4::_Meta = NULL; +daeMetaElement * domCg_param_type::domInt3x1::_Meta = NULL; +daeMetaElement * domCg_param_type::domInt3x2::_Meta = NULL; +daeMetaElement * domCg_param_type::domInt3x3::_Meta = NULL; +daeMetaElement * domCg_param_type::domInt3x4::_Meta = NULL; +daeMetaElement * domCg_param_type::domInt4x1::_Meta = NULL; +daeMetaElement * domCg_param_type::domInt4x2::_Meta = NULL; +daeMetaElement * domCg_param_type::domInt4x3::_Meta = NULL; +daeMetaElement * domCg_param_type::domInt4x4::_Meta = NULL; +daeMetaElement * domCg_param_type::domHalf::_Meta = NULL; +daeMetaElement * domCg_param_type::domHalf1::_Meta = NULL; +daeMetaElement * domCg_param_type::domHalf2::_Meta = NULL; +daeMetaElement * domCg_param_type::domHalf3::_Meta = NULL; +daeMetaElement * domCg_param_type::domHalf4::_Meta = NULL; +daeMetaElement * domCg_param_type::domHalf1x1::_Meta = NULL; +daeMetaElement * domCg_param_type::domHalf1x2::_Meta = NULL; +daeMetaElement * domCg_param_type::domHalf1x3::_Meta = NULL; +daeMetaElement * domCg_param_type::domHalf1x4::_Meta = NULL; +daeMetaElement * domCg_param_type::domHalf2x1::_Meta = NULL; +daeMetaElement * domCg_param_type::domHalf2x2::_Meta = NULL; +daeMetaElement * domCg_param_type::domHalf2x3::_Meta = NULL; +daeMetaElement * domCg_param_type::domHalf2x4::_Meta = NULL; +daeMetaElement * domCg_param_type::domHalf3x1::_Meta = NULL; +daeMetaElement * domCg_param_type::domHalf3x2::_Meta = NULL; +daeMetaElement * domCg_param_type::domHalf3x3::_Meta = NULL; +daeMetaElement * domCg_param_type::domHalf3x4::_Meta = NULL; +daeMetaElement * domCg_param_type::domHalf4x1::_Meta = NULL; +daeMetaElement * domCg_param_type::domHalf4x2::_Meta = NULL; +daeMetaElement * domCg_param_type::domHalf4x3::_Meta = NULL; +daeMetaElement * domCg_param_type::domHalf4x4::_Meta = NULL; +daeMetaElement * domCg_param_type::domFixed::_Meta = NULL; +daeMetaElement * domCg_param_type::domFixed1::_Meta = NULL; +daeMetaElement * domCg_param_type::domFixed2::_Meta = NULL; +daeMetaElement * domCg_param_type::domFixed3::_Meta = NULL; +daeMetaElement * domCg_param_type::domFixed4::_Meta = NULL; +daeMetaElement * domCg_param_type::domFixed1x1::_Meta = NULL; +daeMetaElement * domCg_param_type::domFixed1x2::_Meta = NULL; +daeMetaElement * domCg_param_type::domFixed1x3::_Meta = NULL; +daeMetaElement * domCg_param_type::domFixed1x4::_Meta = NULL; +daeMetaElement * domCg_param_type::domFixed2x1::_Meta = NULL; +daeMetaElement * domCg_param_type::domFixed2x2::_Meta = NULL; +daeMetaElement * domCg_param_type::domFixed2x3::_Meta = NULL; +daeMetaElement * domCg_param_type::domFixed2x4::_Meta = NULL; +daeMetaElement * domCg_param_type::domFixed3x1::_Meta = NULL; +daeMetaElement * domCg_param_type::domFixed3x2::_Meta = NULL; +daeMetaElement * domCg_param_type::domFixed3x3::_Meta = NULL; +daeMetaElement * domCg_param_type::domFixed3x4::_Meta = NULL; +daeMetaElement * domCg_param_type::domFixed4x1::_Meta = NULL; +daeMetaElement * domCg_param_type::domFixed4x2::_Meta = NULL; +daeMetaElement * domCg_param_type::domFixed4x3::_Meta = NULL; +daeMetaElement * domCg_param_type::domFixed4x4::_Meta = NULL; +daeMetaElement * domCg_param_type::domString::_Meta = NULL; +daeMetaElement * domCg_param_type::domEnum::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCg_sampler1D.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCg_sampler1D.cpp new file mode 100644 index 00000000..0e48cfbd --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCg_sampler1D.cpp @@ -0,0 +1,117 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domCg_sampler1D::create(daeInt bytes) +{ + domCg_sampler1DRef ref = new(bytes) domCg_sampler1D; + return ref; +} + + +daeMetaElement * +domCg_sampler1D::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "cg_sampler1D" ); + _Meta->registerClass(domCg_sampler1D::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "source" ); + mea->setOffset( daeOffsetOf(domCg_sampler1D,elemSource) ); + mea->setElementType( domSource::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 0, 1 ); + mea->setName( "wrap_s" ); + mea->setOffset( daeOffsetOf(domCg_sampler1D,elemWrap_s) ); + mea->setElementType( domWrap_s::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 2, 0, 1 ); + mea->setName( "minfilter" ); + mea->setOffset( daeOffsetOf(domCg_sampler1D,elemMinfilter) ); + mea->setElementType( domMinfilter::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 3, 0, 1 ); + mea->setName( "magfilter" ); + mea->setOffset( daeOffsetOf(domCg_sampler1D,elemMagfilter) ); + mea->setElementType( domMagfilter::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 4, 0, 1 ); + mea->setName( "mipfilter" ); + mea->setOffset( daeOffsetOf(domCg_sampler1D,elemMipfilter) ); + mea->setElementType( domMipfilter::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 5, 0, 1 ); + mea->setName( "border_color" ); + mea->setOffset( daeOffsetOf(domCg_sampler1D,elemBorder_color) ); + mea->setElementType( domBorder_color::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 6, 0, 1 ); + mea->setName( "mipmap_maxlevel" ); + mea->setOffset( daeOffsetOf(domCg_sampler1D,elemMipmap_maxlevel) ); + mea->setElementType( domMipmap_maxlevel::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 7, 0, 1 ); + mea->setName( "mipmap_bias" ); + mea->setOffset( daeOffsetOf(domCg_sampler1D,elemMipmap_bias) ); + mea->setElementType( domMipmap_bias::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 8, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domCg_sampler1D,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 8 ); + cm->getParent()->appendChild( cm ); + cm = cm->getParent(); + + cm->setMaxOrdinal( 8 ); + _Meta->setCMRoot( cm ); + + + _Meta->setElementSize(sizeof(domCg_sampler1D)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domCg_sampler1D::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCg_sampler2D.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCg_sampler2D.cpp new file mode 100644 index 00000000..4540aa7d --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCg_sampler2D.cpp @@ -0,0 +1,123 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domCg_sampler2D::create(daeInt bytes) +{ + domCg_sampler2DRef ref = new(bytes) domCg_sampler2D; + return ref; +} + + +daeMetaElement * +domCg_sampler2D::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "cg_sampler2D" ); + _Meta->registerClass(domCg_sampler2D::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "source" ); + mea->setOffset( daeOffsetOf(domCg_sampler2D,elemSource) ); + mea->setElementType( domSource::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 0, 1 ); + mea->setName( "wrap_s" ); + mea->setOffset( daeOffsetOf(domCg_sampler2D,elemWrap_s) ); + mea->setElementType( domWrap_s::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 2, 0, 1 ); + mea->setName( "wrap_t" ); + mea->setOffset( daeOffsetOf(domCg_sampler2D,elemWrap_t) ); + mea->setElementType( domWrap_t::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 3, 0, 1 ); + mea->setName( "minfilter" ); + mea->setOffset( daeOffsetOf(domCg_sampler2D,elemMinfilter) ); + mea->setElementType( domMinfilter::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 4, 0, 1 ); + mea->setName( "magfilter" ); + mea->setOffset( daeOffsetOf(domCg_sampler2D,elemMagfilter) ); + mea->setElementType( domMagfilter::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 5, 0, 1 ); + mea->setName( "mipfilter" ); + mea->setOffset( daeOffsetOf(domCg_sampler2D,elemMipfilter) ); + mea->setElementType( domMipfilter::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 6, 0, 1 ); + mea->setName( "border_color" ); + mea->setOffset( daeOffsetOf(domCg_sampler2D,elemBorder_color) ); + mea->setElementType( domBorder_color::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 7, 0, 1 ); + mea->setName( "mipmap_maxlevel" ); + mea->setOffset( daeOffsetOf(domCg_sampler2D,elemMipmap_maxlevel) ); + mea->setElementType( domMipmap_maxlevel::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 8, 0, 1 ); + mea->setName( "mipmap_bias" ); + mea->setOffset( daeOffsetOf(domCg_sampler2D,elemMipmap_bias) ); + mea->setElementType( domMipmap_bias::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 9, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domCg_sampler2D,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 9 ); + cm->getParent()->appendChild( cm ); + cm = cm->getParent(); + + cm->setMaxOrdinal( 9 ); + _Meta->setCMRoot( cm ); + + + _Meta->setElementSize(sizeof(domCg_sampler2D)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domCg_sampler2D::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCg_sampler3D.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCg_sampler3D.cpp new file mode 100644 index 00000000..fed172e5 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCg_sampler3D.cpp @@ -0,0 +1,129 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domCg_sampler3D::create(daeInt bytes) +{ + domCg_sampler3DRef ref = new(bytes) domCg_sampler3D; + return ref; +} + + +daeMetaElement * +domCg_sampler3D::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "cg_sampler3D" ); + _Meta->registerClass(domCg_sampler3D::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "source" ); + mea->setOffset( daeOffsetOf(domCg_sampler3D,elemSource) ); + mea->setElementType( domSource::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 0, 1 ); + mea->setName( "wrap_s" ); + mea->setOffset( daeOffsetOf(domCg_sampler3D,elemWrap_s) ); + mea->setElementType( domWrap_s::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 2, 0, 1 ); + mea->setName( "wrap_t" ); + mea->setOffset( daeOffsetOf(domCg_sampler3D,elemWrap_t) ); + mea->setElementType( domWrap_t::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 3, 0, 1 ); + mea->setName( "wrap_p" ); + mea->setOffset( daeOffsetOf(domCg_sampler3D,elemWrap_p) ); + mea->setElementType( domWrap_p::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 4, 0, 1 ); + mea->setName( "minfilter" ); + mea->setOffset( daeOffsetOf(domCg_sampler3D,elemMinfilter) ); + mea->setElementType( domMinfilter::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 5, 0, 1 ); + mea->setName( "magfilter" ); + mea->setOffset( daeOffsetOf(domCg_sampler3D,elemMagfilter) ); + mea->setElementType( domMagfilter::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 6, 0, 1 ); + mea->setName( "mipfilter" ); + mea->setOffset( daeOffsetOf(domCg_sampler3D,elemMipfilter) ); + mea->setElementType( domMipfilter::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 7, 0, 1 ); + mea->setName( "border_color" ); + mea->setOffset( daeOffsetOf(domCg_sampler3D,elemBorder_color) ); + mea->setElementType( domBorder_color::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 8, 0, 1 ); + mea->setName( "mipmap_maxlevel" ); + mea->setOffset( daeOffsetOf(domCg_sampler3D,elemMipmap_maxlevel) ); + mea->setElementType( domMipmap_maxlevel::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 9, 0, 1 ); + mea->setName( "mipmap_bias" ); + mea->setOffset( daeOffsetOf(domCg_sampler3D,elemMipmap_bias) ); + mea->setElementType( domMipmap_bias::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 10, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domCg_sampler3D,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 10 ); + cm->getParent()->appendChild( cm ); + cm = cm->getParent(); + + cm->setMaxOrdinal( 10 ); + _Meta->setCMRoot( cm ); + + + _Meta->setElementSize(sizeof(domCg_sampler3D)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domCg_sampler3D::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCg_samplerCUBE.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCg_samplerCUBE.cpp new file mode 100644 index 00000000..3c052fab --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCg_samplerCUBE.cpp @@ -0,0 +1,129 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domCg_samplerCUBE::create(daeInt bytes) +{ + domCg_samplerCUBERef ref = new(bytes) domCg_samplerCUBE; + return ref; +} + + +daeMetaElement * +domCg_samplerCUBE::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "cg_samplerCUBE" ); + _Meta->registerClass(domCg_samplerCUBE::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "source" ); + mea->setOffset( daeOffsetOf(domCg_samplerCUBE,elemSource) ); + mea->setElementType( domSource::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 0, 1 ); + mea->setName( "wrap_s" ); + mea->setOffset( daeOffsetOf(domCg_samplerCUBE,elemWrap_s) ); + mea->setElementType( domWrap_s::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 2, 0, 1 ); + mea->setName( "wrap_t" ); + mea->setOffset( daeOffsetOf(domCg_samplerCUBE,elemWrap_t) ); + mea->setElementType( domWrap_t::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 3, 0, 1 ); + mea->setName( "wrap_p" ); + mea->setOffset( daeOffsetOf(domCg_samplerCUBE,elemWrap_p) ); + mea->setElementType( domWrap_p::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 4, 0, 1 ); + mea->setName( "minfilter" ); + mea->setOffset( daeOffsetOf(domCg_samplerCUBE,elemMinfilter) ); + mea->setElementType( domMinfilter::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 5, 0, 1 ); + mea->setName( "magfilter" ); + mea->setOffset( daeOffsetOf(domCg_samplerCUBE,elemMagfilter) ); + mea->setElementType( domMagfilter::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 6, 0, 1 ); + mea->setName( "mipfilter" ); + mea->setOffset( daeOffsetOf(domCg_samplerCUBE,elemMipfilter) ); + mea->setElementType( domMipfilter::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 7, 0, 1 ); + mea->setName( "border_color" ); + mea->setOffset( daeOffsetOf(domCg_samplerCUBE,elemBorder_color) ); + mea->setElementType( domBorder_color::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 8, 0, 1 ); + mea->setName( "mipmap_maxlevel" ); + mea->setOffset( daeOffsetOf(domCg_samplerCUBE,elemMipmap_maxlevel) ); + mea->setElementType( domMipmap_maxlevel::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 9, 0, 1 ); + mea->setName( "mipmap_bias" ); + mea->setOffset( daeOffsetOf(domCg_samplerCUBE,elemMipmap_bias) ); + mea->setElementType( domMipmap_bias::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 10, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domCg_samplerCUBE,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 10 ); + cm->getParent()->appendChild( cm ); + cm = cm->getParent(); + + cm->setMaxOrdinal( 10 ); + _Meta->setCMRoot( cm ); + + + _Meta->setElementSize(sizeof(domCg_samplerCUBE)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domCg_samplerCUBE::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCg_samplerDEPTH.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCg_samplerDEPTH.cpp new file mode 100644 index 00000000..694b7bf4 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCg_samplerDEPTH.cpp @@ -0,0 +1,99 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domCg_samplerDEPTH::create(daeInt bytes) +{ + domCg_samplerDEPTHRef ref = new(bytes) domCg_samplerDEPTH; + return ref; +} + + +daeMetaElement * +domCg_samplerDEPTH::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "cg_samplerDEPTH" ); + _Meta->registerClass(domCg_samplerDEPTH::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "source" ); + mea->setOffset( daeOffsetOf(domCg_samplerDEPTH,elemSource) ); + mea->setElementType( domSource::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 0, 1 ); + mea->setName( "wrap_s" ); + mea->setOffset( daeOffsetOf(domCg_samplerDEPTH,elemWrap_s) ); + mea->setElementType( domWrap_s::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 2, 0, 1 ); + mea->setName( "wrap_t" ); + mea->setOffset( daeOffsetOf(domCg_samplerDEPTH,elemWrap_t) ); + mea->setElementType( domWrap_t::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 3, 0, 1 ); + mea->setName( "minfilter" ); + mea->setOffset( daeOffsetOf(domCg_samplerDEPTH,elemMinfilter) ); + mea->setElementType( domMinfilter::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 4, 0, 1 ); + mea->setName( "magfilter" ); + mea->setOffset( daeOffsetOf(domCg_samplerDEPTH,elemMagfilter) ); + mea->setElementType( domMagfilter::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 5, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domCg_samplerDEPTH,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 5 ); + cm->getParent()->appendChild( cm ); + cm = cm->getParent(); + + cm->setMaxOrdinal( 5 ); + _Meta->setCMRoot( cm ); + + + _Meta->setElementSize(sizeof(domCg_samplerDEPTH)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domCg_samplerDEPTH::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCg_samplerRECT.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCg_samplerRECT.cpp new file mode 100644 index 00000000..88f05c77 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCg_samplerRECT.cpp @@ -0,0 +1,123 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domCg_samplerRECT::create(daeInt bytes) +{ + domCg_samplerRECTRef ref = new(bytes) domCg_samplerRECT; + return ref; +} + + +daeMetaElement * +domCg_samplerRECT::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "cg_samplerRECT" ); + _Meta->registerClass(domCg_samplerRECT::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "source" ); + mea->setOffset( daeOffsetOf(domCg_samplerRECT,elemSource) ); + mea->setElementType( domSource::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 0, 1 ); + mea->setName( "wrap_s" ); + mea->setOffset( daeOffsetOf(domCg_samplerRECT,elemWrap_s) ); + mea->setElementType( domWrap_s::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 2, 0, 1 ); + mea->setName( "wrap_t" ); + mea->setOffset( daeOffsetOf(domCg_samplerRECT,elemWrap_t) ); + mea->setElementType( domWrap_t::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 3, 0, 1 ); + mea->setName( "minfilter" ); + mea->setOffset( daeOffsetOf(domCg_samplerRECT,elemMinfilter) ); + mea->setElementType( domMinfilter::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 4, 0, 1 ); + mea->setName( "magfilter" ); + mea->setOffset( daeOffsetOf(domCg_samplerRECT,elemMagfilter) ); + mea->setElementType( domMagfilter::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 5, 0, 1 ); + mea->setName( "mipfilter" ); + mea->setOffset( daeOffsetOf(domCg_samplerRECT,elemMipfilter) ); + mea->setElementType( domMipfilter::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 6, 0, 1 ); + mea->setName( "border_color" ); + mea->setOffset( daeOffsetOf(domCg_samplerRECT,elemBorder_color) ); + mea->setElementType( domBorder_color::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 7, 0, 1 ); + mea->setName( "mipmap_maxlevel" ); + mea->setOffset( daeOffsetOf(domCg_samplerRECT,elemMipmap_maxlevel) ); + mea->setElementType( domMipmap_maxlevel::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 8, 0, 1 ); + mea->setName( "mipmap_bias" ); + mea->setOffset( daeOffsetOf(domCg_samplerRECT,elemMipmap_bias) ); + mea->setElementType( domMipmap_bias::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 9, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domCg_samplerRECT,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 9 ); + cm->getParent()->appendChild( cm ); + cm = cm->getParent(); + + cm->setMaxOrdinal( 9 ); + _Meta->setCMRoot( cm ); + + + _Meta->setElementSize(sizeof(domCg_samplerRECT)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domCg_samplerRECT::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCg_setarray_type.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCg_setarray_type.cpp new file mode 100644 index 00000000..e64ff045 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCg_setarray_type.cpp @@ -0,0 +1,91 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domCg_setarray_type::create(daeInt bytes) +{ + domCg_setarray_typeRef ref = new(bytes) domCg_setarray_type; + return ref; +} + + +daeMetaElement * +domCg_setarray_type::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "cg_setarray_type" ); + _Meta->registerClass(domCg_setarray_type::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaChoice( _Meta, cm, 0, 0, -1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "cg_param_type" ); + mea->setOffset( daeOffsetOf(domCg_setarray_type,elemCg_param_type_array) ); + mea->setElementType( domCg_param_type::registerElement() ); + cm->appendChild( new daeMetaGroup( mea, _Meta, cm, 0, 1, 1 ) ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "array" ); + mea->setOffset( daeOffsetOf(domCg_setarray_type,elemArray_array) ); + mea->setElementType( domCg_setarray_type::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "usertype" ); + mea->setOffset( daeOffsetOf(domCg_setarray_type,elemUsertype_array) ); + mea->setElementType( domCg_setuser_type::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 3000 ); + _Meta->setCMRoot( cm ); + // Ordered list of sub-elements + _Meta->addContents(daeOffsetOf(domCg_setarray_type,_contents)); + _Meta->addContentsOrder(daeOffsetOf(domCg_setarray_type,_contentsOrder)); + + + // Add attribute: length + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "length" ); + ma->setType( daeAtomicType::get("xsPositiveInteger")); + ma->setOffset( daeOffsetOf( domCg_setarray_type , attrLength )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_setarray_type)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domCg_setarray_type::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCg_setparam.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCg_setparam.cpp new file mode 100644 index 00000000..7ef0abfd --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCg_setparam.cpp @@ -0,0 +1,108 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domCg_setparam::create(daeInt bytes) +{ + domCg_setparamRef ref = new(bytes) domCg_setparam; + return ref; +} + + +daeMetaElement * +domCg_setparam::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "cg_setparam" ); + _Meta->registerClass(domCg_setparam::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaChoice( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "cg_param_type" ); + mea->setOffset( daeOffsetOf(domCg_setparam,elemCg_param_type) ); + mea->setElementType( domCg_param_type::registerElement() ); + cm->appendChild( new daeMetaGroup( mea, _Meta, cm, 0, 1, 1 ) ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "usertype" ); + mea->setOffset( daeOffsetOf(domCg_setparam,elemUsertype) ); + mea->setElementType( domCg_setuser_type::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "array" ); + mea->setOffset( daeOffsetOf(domCg_setparam,elemArray) ); + mea->setElementType( domCg_setarray_type::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "connect_param" ); + mea->setOffset( daeOffsetOf(domCg_setparam,elemConnect_param) ); + mea->setElementType( domCg_connect_param::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + _Meta->setCMRoot( cm ); + // Ordered list of sub-elements + _Meta->addContents(daeOffsetOf(domCg_setparam,_contents)); + _Meta->addContentsOrder(daeOffsetOf(domCg_setparam,_contentsOrder)); + + + // Add attribute: ref + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "ref" ); + ma->setType( daeAtomicType::get("Cg_identifier")); + ma->setOffset( daeOffsetOf( domCg_setparam , attrRef )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: program + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "program" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domCg_setparam , attrProgram )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_setparam)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domCg_setparam::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCg_setparam_simple.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCg_setparam_simple.cpp new file mode 100644 index 00000000..0e08feb0 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCg_setparam_simple.cpp @@ -0,0 +1,81 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domCg_setparam_simple::create(daeInt bytes) +{ + domCg_setparam_simpleRef ref = new(bytes) domCg_setparam_simple; + return ref; +} + + +daeMetaElement * +domCg_setparam_simple::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "cg_setparam_simple" ); + _Meta->registerClass(domCg_setparam_simple::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 0, -1 ); + mea->setName( "annotate" ); + mea->setOffset( daeOffsetOf(domCg_setparam_simple,elemAnnotate_array) ); + mea->setElementType( domFx_annotate_common::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 1, 1 ); + mea->setName( "cg_param_type" ); + mea->setOffset( daeOffsetOf(domCg_setparam_simple,elemCg_param_type) ); + mea->setElementType( domCg_param_type::registerElement() ); + cm->appendChild( new daeMetaGroup( mea, _Meta, cm, 1, 1, 1 ) ); + + cm->setMaxOrdinal( 1 ); + _Meta->setCMRoot( cm ); + + // Add attribute: ref + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "ref" ); + ma->setType( daeAtomicType::get("Cg_identifier")); + ma->setOffset( daeOffsetOf( domCg_setparam_simple , attrRef )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_setparam_simple)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domCg_setparam_simple::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCg_setuser_type.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCg_setuser_type.cpp new file mode 100644 index 00000000..6ac9b6f2 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCg_setuser_type.cpp @@ -0,0 +1,121 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domCg_setuser_type::create(daeInt bytes) +{ + domCg_setuser_typeRef ref = new(bytes) domCg_setuser_type; + return ref; +} + + +daeMetaElement * +domCg_setuser_type::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "cg_setuser_type" ); + _Meta->registerClass(domCg_setuser_type::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaChoice( _Meta, cm, 0, 0, 1 ); + + cm = new daeMetaChoice( _Meta, cm, 0, 1, -1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "cg_param_type" ); + mea->setOffset( daeOffsetOf(domCg_setuser_type,elemCg_param_type_array) ); + mea->setElementType( domCg_param_type::registerElement() ); + cm->appendChild( new daeMetaGroup( mea, _Meta, cm, 0, 1, 1 ) ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "array" ); + mea->setOffset( daeOffsetOf(domCg_setuser_type,elemArray_array) ); + mea->setElementType( domCg_setarray_type::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "usertype" ); + mea->setOffset( daeOffsetOf(domCg_setuser_type,elemUsertype_array) ); + mea->setElementType( domCg_setuser_type::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "connect_param" ); + mea->setOffset( daeOffsetOf(domCg_setuser_type,elemConnect_param_array) ); + mea->setElementType( domCg_connect_param::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + cm->getParent()->appendChild( cm ); + cm = cm->getParent(); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 3001, 1, -1 ); + mea->setName( "setparam" ); + mea->setOffset( daeOffsetOf(domCg_setuser_type,elemSetparam_array) ); + mea->setElementType( domCg_setparam::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + _Meta->setCMRoot( cm ); + // Ordered list of sub-elements + _Meta->addContents(daeOffsetOf(domCg_setuser_type,_contents)); + _Meta->addContentsOrder(daeOffsetOf(domCg_setuser_type,_contentsOrder)); + + + // Add attribute: name + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "name" ); + ma->setType( daeAtomicType::get("Cg_identifier")); + ma->setOffset( daeOffsetOf( domCg_setuser_type , attrName )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: source + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "source" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domCg_setuser_type , attrSource )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_setuser_type)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domCg_setuser_type::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCg_surface_type.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCg_surface_type.cpp new file mode 100644 index 00000000..315e18b5 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCg_surface_type.cpp @@ -0,0 +1,266 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domCg_surface_type::create(daeInt bytes) +{ + domCg_surface_typeRef ref = new(bytes) domCg_surface_type; + return ref; +} + + +daeMetaElement * +domCg_surface_type::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "cg_surface_type" ); + _Meta->registerClass(domCg_surface_type::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 0, 1 ); + mea->setName( "fx_surface_init_common" ); + mea->setOffset( daeOffsetOf(domCg_surface_type,elemFx_surface_init_common) ); + mea->setElementType( domFx_surface_init_common::registerElement() ); + cm->appendChild( new daeMetaGroup( mea, _Meta, cm, 0, 0, 1 ) ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 0, 1 ); + mea->setName( "format" ); + mea->setOffset( daeOffsetOf(domCg_surface_type,elemFormat) ); + mea->setElementType( domFormat::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 2, 0, 1 ); + mea->setName( "format_hint" ); + mea->setOffset( daeOffsetOf(domCg_surface_type,elemFormat_hint) ); + mea->setElementType( domFx_surface_format_hint_common::registerElement() ); + cm->appendChild( mea ); + + cm = new daeMetaChoice( _Meta, cm, 3, 0, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "size" ); + mea->setOffset( daeOffsetOf(domCg_surface_type,elemSize) ); + mea->setElementType( domSize::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "viewport_ratio" ); + mea->setOffset( daeOffsetOf(domCg_surface_type,elemViewport_ratio) ); + mea->setElementType( domViewport_ratio::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + cm->getParent()->appendChild( cm ); + cm = cm->getParent(); + + mea = new daeMetaElementAttribute( _Meta, cm, 4, 0, 1 ); + mea->setName( "mip_levels" ); + mea->setOffset( daeOffsetOf(domCg_surface_type,elemMip_levels) ); + mea->setElementType( domMip_levels::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 5, 0, 1 ); + mea->setName( "mipmap_generate" ); + mea->setOffset( daeOffsetOf(domCg_surface_type,elemMipmap_generate) ); + mea->setElementType( domMipmap_generate::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 6, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domCg_surface_type,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 6 ); + cm->getParent()->appendChild( cm ); + cm = cm->getParent(); + + cm = new daeMetaSequence( _Meta, cm, 7, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 0, 1 ); + mea->setName( "generator" ); + mea->setOffset( daeOffsetOf(domCg_surface_type,elemGenerator) ); + mea->setElementType( domGenerator::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + cm->getParent()->appendChild( cm ); + cm = cm->getParent(); + + cm->setMaxOrdinal( 7 ); + _Meta->setCMRoot( cm ); + // Ordered list of sub-elements + _Meta->addContents(daeOffsetOf(domCg_surface_type,_contents)); + _Meta->addContentsOrder(daeOffsetOf(domCg_surface_type,_contentsOrder)); + + + // Add attribute: type + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "type" ); + ma->setType( daeAtomicType::get("Fx_surface_type_enum")); + ma->setOffset( daeOffsetOf( domCg_surface_type , attrType )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_surface_type)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_surface_type::domGenerator::create(daeInt bytes) +{ + domCg_surface_type::domGeneratorRef ref = new(bytes) domCg_surface_type::domGenerator; + return ref; +} + + +daeMetaElement * +domCg_surface_type::domGenerator::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "generator" ); + _Meta->registerClass(domCg_surface_type::domGenerator::create, &_Meta); + + _Meta->setIsInnerClass( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 0, -1 ); + mea->setName( "annotate" ); + mea->setOffset( daeOffsetOf(domCg_surface_type::domGenerator,elemAnnotate_array) ); + mea->setElementType( domFx_annotate_common::registerElement() ); + cm->appendChild( mea ); + + cm = new daeMetaChoice( _Meta, cm, 1, 1, -1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "code" ); + mea->setOffset( daeOffsetOf(domCg_surface_type::domGenerator,elemCode_array) ); + mea->setElementType( domFx_code_profile::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "include" ); + mea->setOffset( daeOffsetOf(domCg_surface_type::domGenerator,elemInclude_array) ); + mea->setElementType( domFx_include_common::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + cm->getParent()->appendChild( cm ); + cm = cm->getParent(); + + mea = new daeMetaElementAttribute( _Meta, cm, 3002, 1, 1 ); + mea->setName( "name" ); + mea->setOffset( daeOffsetOf(domCg_surface_type::domGenerator,elemName) ); + mea->setElementType( domCg_surface_type::domGenerator::domName::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 3003, 0, -1 ); + mea->setName( "setparam" ); + mea->setOffset( daeOffsetOf(domCg_surface_type::domGenerator,elemSetparam_array) ); + mea->setElementType( domCg_setparam_simple::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 3003 ); + _Meta->setCMRoot( cm ); + // Ordered list of sub-elements + _Meta->addContents(daeOffsetOf(domCg_surface_type::domGenerator,_contents)); + _Meta->addContentsOrder(daeOffsetOf(domCg_surface_type::domGenerator,_contentsOrder)); + + + + _Meta->setElementSize(sizeof(domCg_surface_type::domGenerator)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCg_surface_type::domGenerator::domName::create(daeInt bytes) +{ + domCg_surface_type::domGenerator::domNameRef ref = new(bytes) domCg_surface_type::domGenerator::domName; + return ref; +} + + +daeMetaElement * +domCg_surface_type::domGenerator::domName::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "name" ); + _Meta->registerClass(domCg_surface_type::domGenerator::domName::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domCg_surface_type::domGenerator::domName , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + // Add attribute: source + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "source" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domCg_surface_type::domGenerator::domName , attrSource )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCg_surface_type::domGenerator::domName)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domCg_surface_type::_Meta = NULL; +daeMetaElement * domCg_surface_type::domGenerator::_Meta = NULL; +daeMetaElement * domCg_surface_type::domGenerator::domName::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domChannel.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domChannel.cpp new file mode 100644 index 00000000..ad55aa4b --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domChannel.cpp @@ -0,0 +1,76 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domChannel::create(daeInt bytes) +{ + domChannelRef ref = new(bytes) domChannel; + ref->attrSource.setContainer( (domChannel*)ref ); + return ref; +} + + +daeMetaElement * +domChannel::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "channel" ); + _Meta->registerClass(domChannel::create, &_Meta); + + + // Add attribute: source + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "source" ); + ma->setType( daeAtomicType::get("URIFragmentType")); + ma->setOffset( daeOffsetOf( domChannel , attrSource )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: target + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "target" ); + ma->setType( daeAtomicType::get("xsToken")); + ma->setOffset( daeOffsetOf( domChannel , attrTarget )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domChannel)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domChannel::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCommon_color_or_texture_type.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCommon_color_or_texture_type.cpp new file mode 100644 index 00000000..18f31acb --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCommon_color_or_texture_type.cpp @@ -0,0 +1,228 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domCommon_color_or_texture_type::create(daeInt bytes) +{ + domCommon_color_or_texture_typeRef ref = new(bytes) domCommon_color_or_texture_type; + return ref; +} + + +daeMetaElement * +domCommon_color_or_texture_type::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "common_color_or_texture_type" ); + _Meta->registerClass(domCommon_color_or_texture_type::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaChoice( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "color" ); + mea->setOffset( daeOffsetOf(domCommon_color_or_texture_type,elemColor) ); + mea->setElementType( domCommon_color_or_texture_type::domColor::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "param" ); + mea->setOffset( daeOffsetOf(domCommon_color_or_texture_type,elemParam) ); + mea->setElementType( domCommon_color_or_texture_type::domParam::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "texture" ); + mea->setOffset( daeOffsetOf(domCommon_color_or_texture_type,elemTexture) ); + mea->setElementType( domCommon_color_or_texture_type::domTexture::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + _Meta->setCMRoot( cm ); + // Ordered list of sub-elements + _Meta->addContents(daeOffsetOf(domCommon_color_or_texture_type,_contents)); + _Meta->addContentsOrder(daeOffsetOf(domCommon_color_or_texture_type,_contentsOrder)); + + + + _Meta->setElementSize(sizeof(domCommon_color_or_texture_type)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCommon_color_or_texture_type::domColor::create(daeInt bytes) +{ + domCommon_color_or_texture_type::domColorRef ref = new(bytes) domCommon_color_or_texture_type::domColor; + return ref; +} + + +daeMetaElement * +domCommon_color_or_texture_type::domColor::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "color" ); + _Meta->registerClass(domCommon_color_or_texture_type::domColor::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Fx_color_common")); + ma->setOffset( daeOffsetOf( domCommon_color_or_texture_type::domColor , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + // Add attribute: sid + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "sid" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domCommon_color_or_texture_type::domColor , attrSid )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCommon_color_or_texture_type::domColor)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCommon_color_or_texture_type::domParam::create(daeInt bytes) +{ + domCommon_color_or_texture_type::domParamRef ref = new(bytes) domCommon_color_or_texture_type::domParam; + return ref; +} + + +daeMetaElement * +domCommon_color_or_texture_type::domParam::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "param" ); + _Meta->registerClass(domCommon_color_or_texture_type::domParam::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: ref + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "ref" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domCommon_color_or_texture_type::domParam , attrRef )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCommon_color_or_texture_type::domParam)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCommon_color_or_texture_type::domTexture::create(daeInt bytes) +{ + domCommon_color_or_texture_type::domTextureRef ref = new(bytes) domCommon_color_or_texture_type::domTexture; + return ref; +} + + +daeMetaElement * +domCommon_color_or_texture_type::domTexture::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "texture" ); + _Meta->registerClass(domCommon_color_or_texture_type::domTexture::create, &_Meta); + + _Meta->setIsInnerClass( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 0, 1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domCommon_color_or_texture_type::domTexture,elemExtra) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + _Meta->setCMRoot( cm ); + + // Add attribute: texture + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "texture" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domCommon_color_or_texture_type::domTexture , attrTexture )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: texcoord + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "texcoord" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domCommon_color_or_texture_type::domTexture , attrTexcoord )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCommon_color_or_texture_type::domTexture)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domCommon_color_or_texture_type::_Meta = NULL; +daeMetaElement * domCommon_color_or_texture_type::domColor::_Meta = NULL; +daeMetaElement * domCommon_color_or_texture_type::domParam::_Meta = NULL; +daeMetaElement * domCommon_color_or_texture_type::domTexture::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCommon_float_or_param_type.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCommon_float_or_param_type.cpp new file mode 100644 index 00000000..8eb09dfe --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCommon_float_or_param_type.cpp @@ -0,0 +1,159 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domCommon_float_or_param_type::create(daeInt bytes) +{ + domCommon_float_or_param_typeRef ref = new(bytes) domCommon_float_or_param_type; + return ref; +} + + +daeMetaElement * +domCommon_float_or_param_type::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "common_float_or_param_type" ); + _Meta->registerClass(domCommon_float_or_param_type::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaChoice( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "float" ); + mea->setOffset( daeOffsetOf(domCommon_float_or_param_type,elemFloat) ); + mea->setElementType( domCommon_float_or_param_type::domFloat::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "param" ); + mea->setOffset( daeOffsetOf(domCommon_float_or_param_type,elemParam) ); + mea->setElementType( domCommon_float_or_param_type::domParam::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + _Meta->setCMRoot( cm ); + // Ordered list of sub-elements + _Meta->addContents(daeOffsetOf(domCommon_float_or_param_type,_contents)); + _Meta->addContentsOrder(daeOffsetOf(domCommon_float_or_param_type,_contentsOrder)); + + + + _Meta->setElementSize(sizeof(domCommon_float_or_param_type)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCommon_float_or_param_type::domFloat::create(daeInt bytes) +{ + domCommon_float_or_param_type::domFloatRef ref = new(bytes) domCommon_float_or_param_type::domFloat; + return ref; +} + + +daeMetaElement * +domCommon_float_or_param_type::domFloat::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "float" ); + _Meta->registerClass(domCommon_float_or_param_type::domFloat::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Float")); + ma->setOffset( daeOffsetOf( domCommon_float_or_param_type::domFloat , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + // Add attribute: sid + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "sid" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domCommon_float_or_param_type::domFloat , attrSid )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCommon_float_or_param_type::domFloat)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCommon_float_or_param_type::domParam::create(daeInt bytes) +{ + domCommon_float_or_param_type::domParamRef ref = new(bytes) domCommon_float_or_param_type::domParam; + return ref; +} + + +daeMetaElement * +domCommon_float_or_param_type::domParam::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "param" ); + _Meta->registerClass(domCommon_float_or_param_type::domParam::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: ref + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "ref" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domCommon_float_or_param_type::domParam , attrRef )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCommon_float_or_param_type::domParam)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domCommon_float_or_param_type::_Meta = NULL; +daeMetaElement * domCommon_float_or_param_type::domFloat::_Meta = NULL; +daeMetaElement * domCommon_float_or_param_type::domParam::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCommon_newparam_type.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCommon_newparam_type.cpp new file mode 100644 index 00000000..89e0982a --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCommon_newparam_type.cpp @@ -0,0 +1,301 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domCommon_newparam_type::create(daeInt bytes) +{ + domCommon_newparam_typeRef ref = new(bytes) domCommon_newparam_type; + return ref; +} + + +daeMetaElement * +domCommon_newparam_type::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "common_newparam_type" ); + _Meta->registerClass(domCommon_newparam_type::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 0, 1 ); + mea->setName( "semantic" ); + mea->setOffset( daeOffsetOf(domCommon_newparam_type,elemSemantic) ); + mea->setElementType( domCommon_newparam_type::domSemantic::registerElement() ); + cm->appendChild( mea ); + + cm = new daeMetaChoice( _Meta, cm, 1, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "float" ); + mea->setOffset( daeOffsetOf(domCommon_newparam_type,elemFloat) ); + mea->setElementType( domCommon_newparam_type::domFloat::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "float2" ); + mea->setOffset( daeOffsetOf(domCommon_newparam_type,elemFloat2) ); + mea->setElementType( domCommon_newparam_type::domFloat2::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "float3" ); + mea->setOffset( daeOffsetOf(domCommon_newparam_type,elemFloat3) ); + mea->setElementType( domCommon_newparam_type::domFloat3::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "float4" ); + mea->setOffset( daeOffsetOf(domCommon_newparam_type,elemFloat4) ); + mea->setElementType( domCommon_newparam_type::domFloat4::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "surface" ); + mea->setOffset( daeOffsetOf(domCommon_newparam_type,elemSurface) ); + mea->setElementType( domFx_surface_common::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "sampler2D" ); + mea->setOffset( daeOffsetOf(domCommon_newparam_type,elemSampler2D) ); + mea->setElementType( domFx_sampler2D_common::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + cm->getParent()->appendChild( cm ); + cm = cm->getParent(); + + cm->setMaxOrdinal( 1 ); + _Meta->setCMRoot( cm ); + // Ordered list of sub-elements + _Meta->addContents(daeOffsetOf(domCommon_newparam_type,_contents)); + _Meta->addContentsOrder(daeOffsetOf(domCommon_newparam_type,_contentsOrder)); + + + // Add attribute: sid + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "sid" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domCommon_newparam_type , attrSid )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCommon_newparam_type)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCommon_newparam_type::domSemantic::create(daeInt bytes) +{ + domCommon_newparam_type::domSemanticRef ref = new(bytes) domCommon_newparam_type::domSemantic; + return ref; +} + + +daeMetaElement * +domCommon_newparam_type::domSemantic::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "semantic" ); + _Meta->registerClass(domCommon_newparam_type::domSemantic::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domCommon_newparam_type::domSemantic , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCommon_newparam_type::domSemantic)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCommon_newparam_type::domFloat::create(daeInt bytes) +{ + domCommon_newparam_type::domFloatRef ref = new(bytes) domCommon_newparam_type::domFloat; + return ref; +} + + +daeMetaElement * +domCommon_newparam_type::domFloat::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "float" ); + _Meta->registerClass(domCommon_newparam_type::domFloat::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Float")); + ma->setOffset( daeOffsetOf( domCommon_newparam_type::domFloat , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCommon_newparam_type::domFloat)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCommon_newparam_type::domFloat2::create(daeInt bytes) +{ + domCommon_newparam_type::domFloat2Ref ref = new(bytes) domCommon_newparam_type::domFloat2; + return ref; +} + + +daeMetaElement * +domCommon_newparam_type::domFloat2::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "float2" ); + _Meta->registerClass(domCommon_newparam_type::domFloat2::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Float2")); + ma->setOffset( daeOffsetOf( domCommon_newparam_type::domFloat2 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCommon_newparam_type::domFloat2)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCommon_newparam_type::domFloat3::create(daeInt bytes) +{ + domCommon_newparam_type::domFloat3Ref ref = new(bytes) domCommon_newparam_type::domFloat3; + return ref; +} + + +daeMetaElement * +domCommon_newparam_type::domFloat3::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "float3" ); + _Meta->registerClass(domCommon_newparam_type::domFloat3::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Float3")); + ma->setOffset( daeOffsetOf( domCommon_newparam_type::domFloat3 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCommon_newparam_type::domFloat3)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCommon_newparam_type::domFloat4::create(daeInt bytes) +{ + domCommon_newparam_type::domFloat4Ref ref = new(bytes) domCommon_newparam_type::domFloat4; + return ref; +} + + +daeMetaElement * +domCommon_newparam_type::domFloat4::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "float4" ); + _Meta->registerClass(domCommon_newparam_type::domFloat4::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Float4")); + ma->setOffset( daeOffsetOf( domCommon_newparam_type::domFloat4 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCommon_newparam_type::domFloat4)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domCommon_newparam_type::_Meta = NULL; +daeMetaElement * domCommon_newparam_type::domSemantic::_Meta = NULL; +daeMetaElement * domCommon_newparam_type::domFloat::_Meta = NULL; +daeMetaElement * domCommon_newparam_type::domFloat2::_Meta = NULL; +daeMetaElement * domCommon_newparam_type::domFloat3::_Meta = NULL; +daeMetaElement * domCommon_newparam_type::domFloat4::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCommon_transparent_type.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCommon_transparent_type.cpp new file mode 100644 index 00000000..641c4e22 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCommon_transparent_type.cpp @@ -0,0 +1,97 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domCommon_transparent_type::create(daeInt bytes) +{ + domCommon_transparent_typeRef ref = new(bytes) domCommon_transparent_type; + return ref; +} + + +daeMetaElement * +domCommon_transparent_type::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "common_transparent_type" ); + _Meta->registerClass(domCommon_transparent_type::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + cm = new daeMetaChoice( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "color" ); + mea->setOffset( daeOffsetOf(domCommon_transparent_type,elemColor) ); + mea->setElementType( domColor::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "param" ); + mea->setOffset( daeOffsetOf(domCommon_transparent_type,elemParam) ); + mea->setElementType( domParam::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "texture" ); + mea->setOffset( daeOffsetOf(domCommon_transparent_type,elemTexture) ); + mea->setElementType( domTexture::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + cm->getParent()->appendChild( cm ); + cm = cm->getParent(); + + cm->setMaxOrdinal( 0 ); + _Meta->setCMRoot( cm ); + // Ordered list of sub-elements + _Meta->addContents(daeOffsetOf(domCommon_transparent_type,_contents)); + _Meta->addContentsOrder(daeOffsetOf(domCommon_transparent_type,_contentsOrder)); + + + // Add attribute: opaque + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "opaque" ); + ma->setType( daeAtomicType::get("Fx_opaque_enum")); + ma->setOffset( daeOffsetOf( domCommon_transparent_type , attrOpaque )); + ma->setContainer( _Meta ); + ma->setDefault( "A_ONE"); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCommon_transparent_type)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domCommon_transparent_type::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domConstants.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domConstants.cpp new file mode 100644 index 00000000..fa23d70e --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domConstants.cpp @@ -0,0 +1,1088 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include + +DLLSPEC daeString COLLADA_VERSION = "1.4.1"; +DLLSPEC daeString COLLADA_NAMESPACE = "http://www.collada.org/2005/11/COLLADASchema"; + +DLLSPEC daeString COMMON_PROFILE_INPUT_BINORMAL = "BINORMAL"; +DLLSPEC daeString COMMON_PROFILE_INPUT_COLOR = "COLOR"; +DLLSPEC daeString COMMON_PROFILE_INPUT_CONTINUITY = "CONTINUITY"; +DLLSPEC daeString COMMON_PROFILE_INPUT_IMAGE = "IMAGE"; +DLLSPEC daeString COMMON_PROFILE_INPUT_IN_TANGENT = "IN_TANGENT"; +DLLSPEC daeString COMMON_PROFILE_INPUT_INPUT = "INPUT"; +DLLSPEC daeString COMMON_PROFILE_INPUT_INTERPOLATION = "INTERPOLATION"; +DLLSPEC daeString COMMON_PROFILE_INPUT_INV_BIND_MATRIX = "INV_BIND_MATRIX"; +DLLSPEC daeString COMMON_PROFILE_INPUT_JOINT = "JOINT"; +DLLSPEC daeString COMMON_PROFILE_INPUT_LINEAR_STEPS = "LINEAR_STEPS"; +DLLSPEC daeString COMMON_PROFILE_INPUT_MORPH_TARGET = "MORPH_TARGET"; +DLLSPEC daeString COMMON_PROFILE_INPUT_MORPH_WEIGHT = "MORPH_WEIGHT"; +DLLSPEC daeString COMMON_PROFILE_INPUT_NORMAL = "NORMAL"; +DLLSPEC daeString COMMON_PROFILE_INPUT_OUTPUT = "OUTPUT"; +DLLSPEC daeString COMMON_PROFILE_INPUT_OUT_TANGENT = "OUT_TANGENT"; +DLLSPEC daeString COMMON_PROFILE_INPUT_POSITION = "POSITION"; +DLLSPEC daeString COMMON_PROFILE_INPUT_TANGENT = "TANGENT"; +DLLSPEC daeString COMMON_PROFILE_INPUT_TEXBINORMAL = "TEXBINORMAL"; +DLLSPEC daeString COMMON_PROFILE_INPUT_TEXCOORD = "TEXCOORD"; +DLLSPEC daeString COMMON_PROFILE_INPUT_TEXTANGENT = "TEXTANGENT"; +DLLSPEC daeString COMMON_PROFILE_INPUT_UV = "UV"; +DLLSPEC daeString COMMON_PROFILE_INPUT_VERTEX = "VERTEX"; +DLLSPEC daeString COMMON_PROFILE_INPUT_WEIGHT = "WEIGHT"; + +DLLSPEC daeString COMMON_PROFILE_PARAM_A = "A"; +DLLSPEC daeString COMMON_PROFILE_PARAM_ANGLE = "ANGLE"; +DLLSPEC daeString COMMON_PROFILE_PARAM_B = "B"; +DLLSPEC daeString COMMON_PROFILE_PARAM_DOUBLE_SIDED = "DOUBLE_SIDED"; +DLLSPEC daeString COMMON_PROFILE_PARAM_G = "G"; +DLLSPEC daeString COMMON_PROFILE_PARAM_P = "P"; +DLLSPEC daeString COMMON_PROFILE_PARAM_Q = "Q"; +DLLSPEC daeString COMMON_PROFILE_PARAM_R = "R"; +DLLSPEC daeString COMMON_PROFILE_PARAM_S = "S"; +DLLSPEC daeString COMMON_PROFILE_PARAM_T = "T"; +DLLSPEC daeString COMMON_PROFILE_PARAM_TIME = "TIME"; +DLLSPEC daeString COMMON_PROFILE_PARAM_U = "U"; +DLLSPEC daeString COMMON_PROFILE_PARAM_V = "V"; +DLLSPEC daeString COMMON_PROFILE_PARAM_W = "W"; +DLLSPEC daeString COMMON_PROFILE_PARAM_X = "X"; +DLLSPEC daeString COMMON_PROFILE_PARAM_Y = "Y"; +DLLSPEC daeString COMMON_PROFILE_PARAM_Z = "Z"; + + +DLLSPEC daeString COLLADA_TYPE_INPUTGLOBAL = "InputGlobal"; +DLLSPEC daeString COLLADA_TYPE_INPUTLOCAL = "InputLocal"; +DLLSPEC daeString COLLADA_TYPE_INPUTLOCALOFFSET = "InputLocalOffset"; +DLLSPEC daeString COLLADA_TYPE_INSTANCEWITHEXTRA = "InstanceWithExtra"; +DLLSPEC daeString COLLADA_TYPE_TARGETABLEFLOAT = "TargetableFloat"; +DLLSPEC daeString COLLADA_TYPE_TARGETABLEFLOAT3 = "TargetableFloat3"; +DLLSPEC daeString COLLADA_TYPE_FX_SURFACE_FORMAT_HINT_COMMON = "fx_surface_format_hint_common"; +DLLSPEC daeString COLLADA_TYPE_CHANNELS = "channels"; +DLLSPEC daeString COLLADA_TYPE_RANGE = "range"; +DLLSPEC daeString COLLADA_TYPE_PRECISION = "precision"; +DLLSPEC daeString COLLADA_TYPE_OPTION = "option"; +DLLSPEC daeString COLLADA_TYPE_FX_SURFACE_INIT_PLANAR_COMMON = "fx_surface_init_planar_common"; +DLLSPEC daeString COLLADA_TYPE_ALL = "all"; +DLLSPEC daeString COLLADA_TYPE_FX_SURFACE_INIT_VOLUME_COMMON = "fx_surface_init_volume_common"; +DLLSPEC daeString COLLADA_TYPE_PRIMARY = "primary"; +DLLSPEC daeString COLLADA_TYPE_FX_SURFACE_INIT_CUBE_COMMON = "fx_surface_init_cube_common"; +DLLSPEC daeString COLLADA_TYPE_ORDER = "order"; +DLLSPEC daeString COLLADA_TYPE_FACE = "face"; +DLLSPEC daeString COLLADA_TYPE_FX_SURFACE_INIT_FROM_COMMON = "fx_surface_init_from_common"; +DLLSPEC daeString COLLADA_TYPE_FX_SURFACE_COMMON = "fx_surface_common"; +DLLSPEC daeString COLLADA_TYPE_FORMAT = "format"; +DLLSPEC daeString COLLADA_TYPE_SIZE = "size"; +DLLSPEC daeString COLLADA_TYPE_VIEWPORT_RATIO = "viewport_ratio"; +DLLSPEC daeString COLLADA_TYPE_MIP_LEVELS = "mip_levels"; +DLLSPEC daeString COLLADA_TYPE_MIPMAP_GENERATE = "mipmap_generate"; +DLLSPEC daeString COLLADA_TYPE_FX_SAMPLER1D_COMMON = "fx_sampler1D_common"; +DLLSPEC daeString COLLADA_TYPE_SOURCE = "source"; +DLLSPEC daeString COLLADA_TYPE_WRAP_S = "wrap_s"; +DLLSPEC daeString COLLADA_TYPE_MINFILTER = "minfilter"; +DLLSPEC daeString COLLADA_TYPE_MAGFILTER = "magfilter"; +DLLSPEC daeString COLLADA_TYPE_MIPFILTER = "mipfilter"; +DLLSPEC daeString COLLADA_TYPE_BORDER_COLOR = "border_color"; +DLLSPEC daeString COLLADA_TYPE_MIPMAP_MAXLEVEL = "mipmap_maxlevel"; +DLLSPEC daeString COLLADA_TYPE_MIPMAP_BIAS = "mipmap_bias"; +DLLSPEC daeString COLLADA_TYPE_FX_SAMPLER2D_COMMON = "fx_sampler2D_common"; +DLLSPEC daeString COLLADA_TYPE_WRAP_T = "wrap_t"; +DLLSPEC daeString COLLADA_TYPE_FX_SAMPLER3D_COMMON = "fx_sampler3D_common"; +DLLSPEC daeString COLLADA_TYPE_WRAP_P = "wrap_p"; +DLLSPEC daeString COLLADA_TYPE_FX_SAMPLERCUBE_COMMON = "fx_samplerCUBE_common"; +DLLSPEC daeString COLLADA_TYPE_FX_SAMPLERRECT_COMMON = "fx_samplerRECT_common"; +DLLSPEC daeString COLLADA_TYPE_FX_SAMPLERDEPTH_COMMON = "fx_samplerDEPTH_common"; +DLLSPEC daeString COLLADA_TYPE_FX_COLORTARGET_COMMON = "fx_colortarget_common"; +DLLSPEC daeString COLLADA_TYPE_FX_DEPTHTARGET_COMMON = "fx_depthtarget_common"; +DLLSPEC daeString COLLADA_TYPE_FX_STENCILTARGET_COMMON = "fx_stenciltarget_common"; +DLLSPEC daeString COLLADA_TYPE_FX_CLEARCOLOR_COMMON = "fx_clearcolor_common"; +DLLSPEC daeString COLLADA_TYPE_FX_CLEARDEPTH_COMMON = "fx_cleardepth_common"; +DLLSPEC daeString COLLADA_TYPE_FX_CLEARSTENCIL_COMMON = "fx_clearstencil_common"; +DLLSPEC daeString COLLADA_TYPE_FX_ANNOTATE_COMMON = "fx_annotate_common"; +DLLSPEC daeString COLLADA_TYPE_FX_INCLUDE_COMMON = "fx_include_common"; +DLLSPEC daeString COLLADA_TYPE_FX_NEWPARAM_COMMON = "fx_newparam_common"; +DLLSPEC daeString COLLADA_TYPE_SEMANTIC = "semantic"; +DLLSPEC daeString COLLADA_TYPE_MODIFIER = "modifier"; +DLLSPEC daeString COLLADA_TYPE_FX_CODE_PROFILE = "fx_code_profile"; +DLLSPEC daeString COLLADA_TYPE_GL_SAMPLER1D = "gl_sampler1D"; +DLLSPEC daeString COLLADA_TYPE_GL_SAMPLER2D = "gl_sampler2D"; +DLLSPEC daeString COLLADA_TYPE_GL_SAMPLER3D = "gl_sampler3D"; +DLLSPEC daeString COLLADA_TYPE_GL_SAMPLERCUBE = "gl_samplerCUBE"; +DLLSPEC daeString COLLADA_TYPE_GL_SAMPLERRECT = "gl_samplerRECT"; +DLLSPEC daeString COLLADA_TYPE_GL_SAMPLERDEPTH = "gl_samplerDEPTH"; +DLLSPEC daeString COLLADA_TYPE_GLSL_NEWARRAY_TYPE = "glsl_newarray_type"; +DLLSPEC daeString COLLADA_TYPE_GLSL_SETARRAY_TYPE = "glsl_setarray_type"; +DLLSPEC daeString COLLADA_TYPE_GLSL_SURFACE_TYPE = "glsl_surface_type"; +DLLSPEC daeString COLLADA_TYPE_GENERATOR = "generator"; +DLLSPEC daeString COLLADA_TYPE_NAME = "name"; +DLLSPEC daeString COLLADA_TYPE_GLSL_NEWPARAM = "glsl_newparam"; +DLLSPEC daeString COLLADA_TYPE_GLSL_SETPARAM_SIMPLE = "glsl_setparam_simple"; +DLLSPEC daeString COLLADA_TYPE_GLSL_SETPARAM = "glsl_setparam"; +DLLSPEC daeString COLLADA_TYPE_COMMON_FLOAT_OR_PARAM_TYPE = "common_float_or_param_type"; +DLLSPEC daeString COLLADA_TYPE_FLOAT = "float"; +DLLSPEC daeString COLLADA_TYPE_PARAM = "param"; +DLLSPEC daeString COLLADA_TYPE_COMMON_COLOR_OR_TEXTURE_TYPE = "common_color_or_texture_type"; +DLLSPEC daeString COLLADA_TYPE_COLOR = "color"; +DLLSPEC daeString COLLADA_TYPE_TEXTURE = "texture"; +DLLSPEC daeString COLLADA_TYPE_COMMON_TRANSPARENT_TYPE = "common_transparent_type"; +DLLSPEC daeString COLLADA_TYPE_COMMON_NEWPARAM_TYPE = "common_newparam_type"; +DLLSPEC daeString COLLADA_TYPE_FLOAT2 = "float2"; +DLLSPEC daeString COLLADA_TYPE_FLOAT3 = "float3"; +DLLSPEC daeString COLLADA_TYPE_FLOAT4 = "float4"; +DLLSPEC daeString COLLADA_TYPE_CG_SAMPLER1D = "cg_sampler1D"; +DLLSPEC daeString COLLADA_TYPE_CG_SAMPLER2D = "cg_sampler2D"; +DLLSPEC daeString COLLADA_TYPE_CG_SAMPLER3D = "cg_sampler3D"; +DLLSPEC daeString COLLADA_TYPE_CG_SAMPLERCUBE = "cg_samplerCUBE"; +DLLSPEC daeString COLLADA_TYPE_CG_SAMPLERRECT = "cg_samplerRECT"; +DLLSPEC daeString COLLADA_TYPE_CG_SAMPLERDEPTH = "cg_samplerDEPTH"; +DLLSPEC daeString COLLADA_TYPE_CG_CONNECT_PARAM = "cg_connect_param"; +DLLSPEC daeString COLLADA_TYPE_CG_NEWARRAY_TYPE = "cg_newarray_type"; +DLLSPEC daeString COLLADA_TYPE_CG_SETARRAY_TYPE = "cg_setarray_type"; +DLLSPEC daeString COLLADA_TYPE_CG_SETUSER_TYPE = "cg_setuser_type"; +DLLSPEC daeString COLLADA_TYPE_CG_SURFACE_TYPE = "cg_surface_type"; +DLLSPEC daeString COLLADA_TYPE_CG_NEWPARAM = "cg_newparam"; +DLLSPEC daeString COLLADA_TYPE_CG_SETPARAM_SIMPLE = "cg_setparam_simple"; +DLLSPEC daeString COLLADA_TYPE_CG_SETPARAM = "cg_setparam"; +DLLSPEC daeString COLLADA_TYPE_GLES_TEXTURE_CONSTANT_TYPE = "gles_texture_constant_type"; +DLLSPEC daeString COLLADA_TYPE_GLES_TEXENV_COMMAND_TYPE = "gles_texenv_command_type"; +DLLSPEC daeString COLLADA_TYPE_GLES_TEXCOMBINER_ARGUMENTRGB_TYPE = "gles_texcombiner_argumentRGB_type"; +DLLSPEC daeString COLLADA_TYPE_GLES_TEXCOMBINER_ARGUMENTALPHA_TYPE = "gles_texcombiner_argumentAlpha_type"; +DLLSPEC daeString COLLADA_TYPE_GLES_TEXCOMBINER_COMMANDRGB_TYPE = "gles_texcombiner_commandRGB_type"; +DLLSPEC daeString COLLADA_TYPE_GLES_TEXCOMBINER_COMMANDALPHA_TYPE = "gles_texcombiner_commandAlpha_type"; +DLLSPEC daeString COLLADA_TYPE_GLES_TEXCOMBINER_COMMAND_TYPE = "gles_texcombiner_command_type"; +DLLSPEC daeString COLLADA_TYPE_GLES_TEXTURE_PIPELINE = "gles_texture_pipeline"; +DLLSPEC daeString COLLADA_TYPE_GLES_TEXTURE_UNIT = "gles_texture_unit"; +DLLSPEC daeString COLLADA_TYPE_SURFACE = "surface"; +DLLSPEC daeString COLLADA_TYPE_SAMPLER_STATE = "sampler_state"; +DLLSPEC daeString COLLADA_TYPE_TEXCOORD = "texcoord"; +DLLSPEC daeString COLLADA_TYPE_GLES_SAMPLER_STATE = "gles_sampler_state"; +DLLSPEC daeString COLLADA_TYPE_GLES_NEWPARAM = "gles_newparam"; +DLLSPEC daeString COLLADA_TYPE_FX_SURFACE_INIT_COMMON = "fx_surface_init_common"; +DLLSPEC daeString COLLADA_TYPE_INIT_AS_NULL = "init_as_null"; +DLLSPEC daeString COLLADA_TYPE_INIT_AS_TARGET = "init_as_target"; +DLLSPEC daeString COLLADA_TYPE_FX_ANNOTATE_TYPE_COMMON = "fx_annotate_type_common"; +DLLSPEC daeString COLLADA_TYPE_BOOL = "bool"; +DLLSPEC daeString COLLADA_TYPE_BOOL2 = "bool2"; +DLLSPEC daeString COLLADA_TYPE_BOOL3 = "bool3"; +DLLSPEC daeString COLLADA_TYPE_BOOL4 = "bool4"; +DLLSPEC daeString COLLADA_TYPE_INT = "int"; +DLLSPEC daeString COLLADA_TYPE_INT2 = "int2"; +DLLSPEC daeString COLLADA_TYPE_INT3 = "int3"; +DLLSPEC daeString COLLADA_TYPE_INT4 = "int4"; +DLLSPEC daeString COLLADA_TYPE_FLOAT2X2 = "float2x2"; +DLLSPEC daeString COLLADA_TYPE_FLOAT3X3 = "float3x3"; +DLLSPEC daeString COLLADA_TYPE_FLOAT4X4 = "float4x4"; +DLLSPEC daeString COLLADA_TYPE_STRING = "string"; +DLLSPEC daeString COLLADA_TYPE_FX_BASIC_TYPE_COMMON = "fx_basic_type_common"; +DLLSPEC daeString COLLADA_TYPE_FLOAT1X1 = "float1x1"; +DLLSPEC daeString COLLADA_TYPE_FLOAT1X2 = "float1x2"; +DLLSPEC daeString COLLADA_TYPE_FLOAT1X3 = "float1x3"; +DLLSPEC daeString COLLADA_TYPE_FLOAT1X4 = "float1x4"; +DLLSPEC daeString COLLADA_TYPE_FLOAT2X1 = "float2x1"; +DLLSPEC daeString COLLADA_TYPE_FLOAT2X3 = "float2x3"; +DLLSPEC daeString COLLADA_TYPE_FLOAT2X4 = "float2x4"; +DLLSPEC daeString COLLADA_TYPE_FLOAT3X1 = "float3x1"; +DLLSPEC daeString COLLADA_TYPE_FLOAT3X2 = "float3x2"; +DLLSPEC daeString COLLADA_TYPE_FLOAT3X4 = "float3x4"; +DLLSPEC daeString COLLADA_TYPE_FLOAT4X1 = "float4x1"; +DLLSPEC daeString COLLADA_TYPE_FLOAT4X2 = "float4x2"; +DLLSPEC daeString COLLADA_TYPE_FLOAT4X3 = "float4x3"; +DLLSPEC daeString COLLADA_TYPE_ENUM = "enum"; +DLLSPEC daeString COLLADA_TYPE_GL_PIPELINE_SETTINGS = "gl_pipeline_settings"; +DLLSPEC daeString COLLADA_TYPE_ALPHA_FUNC = "alpha_func"; +DLLSPEC daeString COLLADA_TYPE_FUNC = "func"; +DLLSPEC daeString COLLADA_TYPE_VALUE = "value"; +DLLSPEC daeString COLLADA_TYPE_BLEND_FUNC = "blend_func"; +DLLSPEC daeString COLLADA_TYPE_SRC = "src"; +DLLSPEC daeString COLLADA_TYPE_DEST = "dest"; +DLLSPEC daeString COLLADA_TYPE_BLEND_FUNC_SEPARATE = "blend_func_separate"; +DLLSPEC daeString COLLADA_TYPE_SRC_RGB = "src_rgb"; +DLLSPEC daeString COLLADA_TYPE_DEST_RGB = "dest_rgb"; +DLLSPEC daeString COLLADA_TYPE_SRC_ALPHA = "src_alpha"; +DLLSPEC daeString COLLADA_TYPE_DEST_ALPHA = "dest_alpha"; +DLLSPEC daeString COLLADA_TYPE_BLEND_EQUATION = "blend_equation"; +DLLSPEC daeString COLLADA_TYPE_BLEND_EQUATION_SEPARATE = "blend_equation_separate"; +DLLSPEC daeString COLLADA_TYPE_RGB = "rgb"; +DLLSPEC daeString COLLADA_TYPE_ALPHA = "alpha"; +DLLSPEC daeString COLLADA_TYPE_COLOR_MATERIAL = "color_material"; +DLLSPEC daeString COLLADA_TYPE_MODE = "mode"; +DLLSPEC daeString COLLADA_TYPE_CULL_FACE = "cull_face"; +DLLSPEC daeString COLLADA_TYPE_DEPTH_FUNC = "depth_func"; +DLLSPEC daeString COLLADA_TYPE_FOG_MODE = "fog_mode"; +DLLSPEC daeString COLLADA_TYPE_FOG_COORD_SRC = "fog_coord_src"; +DLLSPEC daeString COLLADA_TYPE_FRONT_FACE = "front_face"; +DLLSPEC daeString COLLADA_TYPE_LIGHT_MODEL_COLOR_CONTROL = "light_model_color_control"; +DLLSPEC daeString COLLADA_TYPE_LOGIC_OP = "logic_op"; +DLLSPEC daeString COLLADA_TYPE_POLYGON_MODE = "polygon_mode"; +DLLSPEC daeString COLLADA_TYPE_SHADE_MODEL = "shade_model"; +DLLSPEC daeString COLLADA_TYPE_STENCIL_FUNC = "stencil_func"; +DLLSPEC daeString COLLADA_TYPE_REF = "ref"; +DLLSPEC daeString COLLADA_TYPE_MASK = "mask"; +DLLSPEC daeString COLLADA_TYPE_STENCIL_OP = "stencil_op"; +DLLSPEC daeString COLLADA_TYPE_FAIL = "fail"; +DLLSPEC daeString COLLADA_TYPE_ZFAIL = "zfail"; +DLLSPEC daeString COLLADA_TYPE_ZPASS = "zpass"; +DLLSPEC daeString COLLADA_TYPE_STENCIL_FUNC_SEPARATE = "stencil_func_separate"; +DLLSPEC daeString COLLADA_TYPE_FRONT = "front"; +DLLSPEC daeString COLLADA_TYPE_BACK = "back"; +DLLSPEC daeString COLLADA_TYPE_STENCIL_OP_SEPARATE = "stencil_op_separate"; +DLLSPEC daeString COLLADA_TYPE_STENCIL_MASK_SEPARATE = "stencil_mask_separate"; +DLLSPEC daeString COLLADA_TYPE_LIGHT_ENABLE = "light_enable"; +DLLSPEC daeString COLLADA_TYPE_LIGHT_AMBIENT = "light_ambient"; +DLLSPEC daeString COLLADA_TYPE_LIGHT_DIFFUSE = "light_diffuse"; +DLLSPEC daeString COLLADA_TYPE_LIGHT_SPECULAR = "light_specular"; +DLLSPEC daeString COLLADA_TYPE_LIGHT_POSITION = "light_position"; +DLLSPEC daeString COLLADA_TYPE_LIGHT_CONSTANT_ATTENUATION = "light_constant_attenuation"; +DLLSPEC daeString COLLADA_TYPE_LIGHT_LINEAR_ATTENUATION = "light_linear_attenuation"; +DLLSPEC daeString COLLADA_TYPE_LIGHT_QUADRATIC_ATTENUATION = "light_quadratic_attenuation"; +DLLSPEC daeString COLLADA_TYPE_LIGHT_SPOT_CUTOFF = "light_spot_cutoff"; +DLLSPEC daeString COLLADA_TYPE_LIGHT_SPOT_DIRECTION = "light_spot_direction"; +DLLSPEC daeString COLLADA_TYPE_LIGHT_SPOT_EXPONENT = "light_spot_exponent"; +DLLSPEC daeString COLLADA_TYPE_TEXTURE1D = "texture1D"; +DLLSPEC daeString COLLADA_TYPE_TEXTURE2D = "texture2D"; +DLLSPEC daeString COLLADA_TYPE_TEXTURE3D = "texture3D"; +DLLSPEC daeString COLLADA_TYPE_TEXTURECUBE = "textureCUBE"; +DLLSPEC daeString COLLADA_TYPE_TEXTURERECT = "textureRECT"; +DLLSPEC daeString COLLADA_TYPE_TEXTUREDEPTH = "textureDEPTH"; +DLLSPEC daeString COLLADA_TYPE_TEXTURE1D_ENABLE = "texture1D_enable"; +DLLSPEC daeString COLLADA_TYPE_TEXTURE2D_ENABLE = "texture2D_enable"; +DLLSPEC daeString COLLADA_TYPE_TEXTURE3D_ENABLE = "texture3D_enable"; +DLLSPEC daeString COLLADA_TYPE_TEXTURECUBE_ENABLE = "textureCUBE_enable"; +DLLSPEC daeString COLLADA_TYPE_TEXTURERECT_ENABLE = "textureRECT_enable"; +DLLSPEC daeString COLLADA_TYPE_TEXTUREDEPTH_ENABLE = "textureDEPTH_enable"; +DLLSPEC daeString COLLADA_TYPE_TEXTURE_ENV_COLOR = "texture_env_color"; +DLLSPEC daeString COLLADA_TYPE_TEXTURE_ENV_MODE = "texture_env_mode"; +DLLSPEC daeString COLLADA_TYPE_CLIP_PLANE = "clip_plane"; +DLLSPEC daeString COLLADA_TYPE_CLIP_PLANE_ENABLE = "clip_plane_enable"; +DLLSPEC daeString COLLADA_TYPE_BLEND_COLOR = "blend_color"; +DLLSPEC daeString COLLADA_TYPE_CLEAR_COLOR = "clear_color"; +DLLSPEC daeString COLLADA_TYPE_CLEAR_STENCIL = "clear_stencil"; +DLLSPEC daeString COLLADA_TYPE_CLEAR_DEPTH = "clear_depth"; +DLLSPEC daeString COLLADA_TYPE_COLOR_MASK = "color_mask"; +DLLSPEC daeString COLLADA_TYPE_DEPTH_BOUNDS = "depth_bounds"; +DLLSPEC daeString COLLADA_TYPE_DEPTH_MASK = "depth_mask"; +DLLSPEC daeString COLLADA_TYPE_DEPTH_RANGE = "depth_range"; +DLLSPEC daeString COLLADA_TYPE_FOG_DENSITY = "fog_density"; +DLLSPEC daeString COLLADA_TYPE_FOG_START = "fog_start"; +DLLSPEC daeString COLLADA_TYPE_FOG_END = "fog_end"; +DLLSPEC daeString COLLADA_TYPE_FOG_COLOR = "fog_color"; +DLLSPEC daeString COLLADA_TYPE_LIGHT_MODEL_AMBIENT = "light_model_ambient"; +DLLSPEC daeString COLLADA_TYPE_LIGHTING_ENABLE = "lighting_enable"; +DLLSPEC daeString COLLADA_TYPE_LINE_STIPPLE = "line_stipple"; +DLLSPEC daeString COLLADA_TYPE_LINE_WIDTH = "line_width"; +DLLSPEC daeString COLLADA_TYPE_MATERIAL_AMBIENT = "material_ambient"; +DLLSPEC daeString COLLADA_TYPE_MATERIAL_DIFFUSE = "material_diffuse"; +DLLSPEC daeString COLLADA_TYPE_MATERIAL_EMISSION = "material_emission"; +DLLSPEC daeString COLLADA_TYPE_MATERIAL_SHININESS = "material_shininess"; +DLLSPEC daeString COLLADA_TYPE_MATERIAL_SPECULAR = "material_specular"; +DLLSPEC daeString COLLADA_TYPE_MODEL_VIEW_MATRIX = "model_view_matrix"; +DLLSPEC daeString COLLADA_TYPE_POINT_DISTANCE_ATTENUATION = "point_distance_attenuation"; +DLLSPEC daeString COLLADA_TYPE_POINT_FADE_THRESHOLD_SIZE = "point_fade_threshold_size"; +DLLSPEC daeString COLLADA_TYPE_POINT_SIZE = "point_size"; +DLLSPEC daeString COLLADA_TYPE_POINT_SIZE_MIN = "point_size_min"; +DLLSPEC daeString COLLADA_TYPE_POINT_SIZE_MAX = "point_size_max"; +DLLSPEC daeString COLLADA_TYPE_POLYGON_OFFSET = "polygon_offset"; +DLLSPEC daeString COLLADA_TYPE_PROJECTION_MATRIX = "projection_matrix"; +DLLSPEC daeString COLLADA_TYPE_SCISSOR = "scissor"; +DLLSPEC daeString COLLADA_TYPE_STENCIL_MASK = "stencil_mask"; +DLLSPEC daeString COLLADA_TYPE_ALPHA_TEST_ENABLE = "alpha_test_enable"; +DLLSPEC daeString COLLADA_TYPE_AUTO_NORMAL_ENABLE = "auto_normal_enable"; +DLLSPEC daeString COLLADA_TYPE_BLEND_ENABLE = "blend_enable"; +DLLSPEC daeString COLLADA_TYPE_COLOR_LOGIC_OP_ENABLE = "color_logic_op_enable"; +DLLSPEC daeString COLLADA_TYPE_COLOR_MATERIAL_ENABLE = "color_material_enable"; +DLLSPEC daeString COLLADA_TYPE_CULL_FACE_ENABLE = "cull_face_enable"; +DLLSPEC daeString COLLADA_TYPE_DEPTH_BOUNDS_ENABLE = "depth_bounds_enable"; +DLLSPEC daeString COLLADA_TYPE_DEPTH_CLAMP_ENABLE = "depth_clamp_enable"; +DLLSPEC daeString COLLADA_TYPE_DEPTH_TEST_ENABLE = "depth_test_enable"; +DLLSPEC daeString COLLADA_TYPE_DITHER_ENABLE = "dither_enable"; +DLLSPEC daeString COLLADA_TYPE_FOG_ENABLE = "fog_enable"; +DLLSPEC daeString COLLADA_TYPE_LIGHT_MODEL_LOCAL_VIEWER_ENABLE = "light_model_local_viewer_enable"; +DLLSPEC daeString COLLADA_TYPE_LIGHT_MODEL_TWO_SIDE_ENABLE = "light_model_two_side_enable"; +DLLSPEC daeString COLLADA_TYPE_LINE_SMOOTH_ENABLE = "line_smooth_enable"; +DLLSPEC daeString COLLADA_TYPE_LINE_STIPPLE_ENABLE = "line_stipple_enable"; +DLLSPEC daeString COLLADA_TYPE_LOGIC_OP_ENABLE = "logic_op_enable"; +DLLSPEC daeString COLLADA_TYPE_MULTISAMPLE_ENABLE = "multisample_enable"; +DLLSPEC daeString COLLADA_TYPE_NORMALIZE_ENABLE = "normalize_enable"; +DLLSPEC daeString COLLADA_TYPE_POINT_SMOOTH_ENABLE = "point_smooth_enable"; +DLLSPEC daeString COLLADA_TYPE_POLYGON_OFFSET_FILL_ENABLE = "polygon_offset_fill_enable"; +DLLSPEC daeString COLLADA_TYPE_POLYGON_OFFSET_LINE_ENABLE = "polygon_offset_line_enable"; +DLLSPEC daeString COLLADA_TYPE_POLYGON_OFFSET_POINT_ENABLE = "polygon_offset_point_enable"; +DLLSPEC daeString COLLADA_TYPE_POLYGON_SMOOTH_ENABLE = "polygon_smooth_enable"; +DLLSPEC daeString COLLADA_TYPE_POLYGON_STIPPLE_ENABLE = "polygon_stipple_enable"; +DLLSPEC daeString COLLADA_TYPE_RESCALE_NORMAL_ENABLE = "rescale_normal_enable"; +DLLSPEC daeString COLLADA_TYPE_SAMPLE_ALPHA_TO_COVERAGE_ENABLE = "sample_alpha_to_coverage_enable"; +DLLSPEC daeString COLLADA_TYPE_SAMPLE_ALPHA_TO_ONE_ENABLE = "sample_alpha_to_one_enable"; +DLLSPEC daeString COLLADA_TYPE_SAMPLE_COVERAGE_ENABLE = "sample_coverage_enable"; +DLLSPEC daeString COLLADA_TYPE_SCISSOR_TEST_ENABLE = "scissor_test_enable"; +DLLSPEC daeString COLLADA_TYPE_STENCIL_TEST_ENABLE = "stencil_test_enable"; +DLLSPEC daeString COLLADA_TYPE_GLSL_PARAM_TYPE = "glsl_param_type"; +DLLSPEC daeString COLLADA_TYPE_CG_PARAM_TYPE = "cg_param_type"; +DLLSPEC daeString COLLADA_TYPE_BOOL1 = "bool1"; +DLLSPEC daeString COLLADA_TYPE_BOOL1X1 = "bool1x1"; +DLLSPEC daeString COLLADA_TYPE_BOOL1X2 = "bool1x2"; +DLLSPEC daeString COLLADA_TYPE_BOOL1X3 = "bool1x3"; +DLLSPEC daeString COLLADA_TYPE_BOOL1X4 = "bool1x4"; +DLLSPEC daeString COLLADA_TYPE_BOOL2X1 = "bool2x1"; +DLLSPEC daeString COLLADA_TYPE_BOOL2X2 = "bool2x2"; +DLLSPEC daeString COLLADA_TYPE_BOOL2X3 = "bool2x3"; +DLLSPEC daeString COLLADA_TYPE_BOOL2X4 = "bool2x4"; +DLLSPEC daeString COLLADA_TYPE_BOOL3X1 = "bool3x1"; +DLLSPEC daeString COLLADA_TYPE_BOOL3X2 = "bool3x2"; +DLLSPEC daeString COLLADA_TYPE_BOOL3X3 = "bool3x3"; +DLLSPEC daeString COLLADA_TYPE_BOOL3X4 = "bool3x4"; +DLLSPEC daeString COLLADA_TYPE_BOOL4X1 = "bool4x1"; +DLLSPEC daeString COLLADA_TYPE_BOOL4X2 = "bool4x2"; +DLLSPEC daeString COLLADA_TYPE_BOOL4X3 = "bool4x3"; +DLLSPEC daeString COLLADA_TYPE_BOOL4X4 = "bool4x4"; +DLLSPEC daeString COLLADA_TYPE_FLOAT1 = "float1"; +DLLSPEC daeString COLLADA_TYPE_INT1 = "int1"; +DLLSPEC daeString COLLADA_TYPE_INT1X1 = "int1x1"; +DLLSPEC daeString COLLADA_TYPE_INT1X2 = "int1x2"; +DLLSPEC daeString COLLADA_TYPE_INT1X3 = "int1x3"; +DLLSPEC daeString COLLADA_TYPE_INT1X4 = "int1x4"; +DLLSPEC daeString COLLADA_TYPE_INT2X1 = "int2x1"; +DLLSPEC daeString COLLADA_TYPE_INT2X2 = "int2x2"; +DLLSPEC daeString COLLADA_TYPE_INT2X3 = "int2x3"; +DLLSPEC daeString COLLADA_TYPE_INT2X4 = "int2x4"; +DLLSPEC daeString COLLADA_TYPE_INT3X1 = "int3x1"; +DLLSPEC daeString COLLADA_TYPE_INT3X2 = "int3x2"; +DLLSPEC daeString COLLADA_TYPE_INT3X3 = "int3x3"; +DLLSPEC daeString COLLADA_TYPE_INT3X4 = "int3x4"; +DLLSPEC daeString COLLADA_TYPE_INT4X1 = "int4x1"; +DLLSPEC daeString COLLADA_TYPE_INT4X2 = "int4x2"; +DLLSPEC daeString COLLADA_TYPE_INT4X3 = "int4x3"; +DLLSPEC daeString COLLADA_TYPE_INT4X4 = "int4x4"; +DLLSPEC daeString COLLADA_TYPE_HALF = "half"; +DLLSPEC daeString COLLADA_TYPE_HALF1 = "half1"; +DLLSPEC daeString COLLADA_TYPE_HALF2 = "half2"; +DLLSPEC daeString COLLADA_TYPE_HALF3 = "half3"; +DLLSPEC daeString COLLADA_TYPE_HALF4 = "half4"; +DLLSPEC daeString COLLADA_TYPE_HALF1X1 = "half1x1"; +DLLSPEC daeString COLLADA_TYPE_HALF1X2 = "half1x2"; +DLLSPEC daeString COLLADA_TYPE_HALF1X3 = "half1x3"; +DLLSPEC daeString COLLADA_TYPE_HALF1X4 = "half1x4"; +DLLSPEC daeString COLLADA_TYPE_HALF2X1 = "half2x1"; +DLLSPEC daeString COLLADA_TYPE_HALF2X2 = "half2x2"; +DLLSPEC daeString COLLADA_TYPE_HALF2X3 = "half2x3"; +DLLSPEC daeString COLLADA_TYPE_HALF2X4 = "half2x4"; +DLLSPEC daeString COLLADA_TYPE_HALF3X1 = "half3x1"; +DLLSPEC daeString COLLADA_TYPE_HALF3X2 = "half3x2"; +DLLSPEC daeString COLLADA_TYPE_HALF3X3 = "half3x3"; +DLLSPEC daeString COLLADA_TYPE_HALF3X4 = "half3x4"; +DLLSPEC daeString COLLADA_TYPE_HALF4X1 = "half4x1"; +DLLSPEC daeString COLLADA_TYPE_HALF4X2 = "half4x2"; +DLLSPEC daeString COLLADA_TYPE_HALF4X3 = "half4x3"; +DLLSPEC daeString COLLADA_TYPE_HALF4X4 = "half4x4"; +DLLSPEC daeString COLLADA_TYPE_FIXED = "fixed"; +DLLSPEC daeString COLLADA_TYPE_FIXED1 = "fixed1"; +DLLSPEC daeString COLLADA_TYPE_FIXED2 = "fixed2"; +DLLSPEC daeString COLLADA_TYPE_FIXED3 = "fixed3"; +DLLSPEC daeString COLLADA_TYPE_FIXED4 = "fixed4"; +DLLSPEC daeString COLLADA_TYPE_FIXED1X1 = "fixed1x1"; +DLLSPEC daeString COLLADA_TYPE_FIXED1X2 = "fixed1x2"; +DLLSPEC daeString COLLADA_TYPE_FIXED1X3 = "fixed1x3"; +DLLSPEC daeString COLLADA_TYPE_FIXED1X4 = "fixed1x4"; +DLLSPEC daeString COLLADA_TYPE_FIXED2X1 = "fixed2x1"; +DLLSPEC daeString COLLADA_TYPE_FIXED2X2 = "fixed2x2"; +DLLSPEC daeString COLLADA_TYPE_FIXED2X3 = "fixed2x3"; +DLLSPEC daeString COLLADA_TYPE_FIXED2X4 = "fixed2x4"; +DLLSPEC daeString COLLADA_TYPE_FIXED3X1 = "fixed3x1"; +DLLSPEC daeString COLLADA_TYPE_FIXED3X2 = "fixed3x2"; +DLLSPEC daeString COLLADA_TYPE_FIXED3X3 = "fixed3x3"; +DLLSPEC daeString COLLADA_TYPE_FIXED3X4 = "fixed3x4"; +DLLSPEC daeString COLLADA_TYPE_FIXED4X1 = "fixed4x1"; +DLLSPEC daeString COLLADA_TYPE_FIXED4X2 = "fixed4x2"; +DLLSPEC daeString COLLADA_TYPE_FIXED4X3 = "fixed4x3"; +DLLSPEC daeString COLLADA_TYPE_FIXED4X4 = "fixed4x4"; +DLLSPEC daeString COLLADA_TYPE_GLES_PIPELINE_SETTINGS = "gles_pipeline_settings"; +DLLSPEC daeString COLLADA_TYPE_TEXTURE_PIPELINE = "texture_pipeline"; +DLLSPEC daeString COLLADA_TYPE_LIGHT_LINEAR_ATTENUTATION = "light_linear_attenutation"; +DLLSPEC daeString COLLADA_TYPE_TEXTURE_PIPELINE_ENABLE = "texture_pipeline_enable"; +DLLSPEC daeString COLLADA_TYPE_GLES_BASIC_TYPE_COMMON = "gles_basic_type_common"; +DLLSPEC daeString COLLADA_TYPE_COLLADA = "COLLADA"; +DLLSPEC daeString COLLADA_TYPE_SCENE = "scene"; +DLLSPEC daeString COLLADA_TYPE_IDREF_ARRAY = "IDREF_array"; +DLLSPEC daeString COLLADA_TYPE_NAME_ARRAY = "Name_array"; +DLLSPEC daeString COLLADA_TYPE_BOOL_ARRAY = "bool_array"; +DLLSPEC daeString COLLADA_TYPE_FLOAT_ARRAY = "float_array"; +DLLSPEC daeString COLLADA_TYPE_INT_ARRAY = "int_array"; +DLLSPEC daeString COLLADA_TYPE_ACCESSOR = "accessor"; +DLLSPEC daeString COLLADA_TYPE_TECHNIQUE_COMMON = "technique_common"; +DLLSPEC daeString COLLADA_TYPE_GEOMETRY = "geometry"; +DLLSPEC daeString COLLADA_TYPE_MESH = "mesh"; +DLLSPEC daeString COLLADA_TYPE_SPLINE = "spline"; +DLLSPEC daeString COLLADA_TYPE_CONTROL_VERTICES = "control_vertices"; +DLLSPEC daeString COLLADA_TYPE_P = "p"; +DLLSPEC daeString COLLADA_TYPE_LINES = "lines"; +DLLSPEC daeString COLLADA_TYPE_LINESTRIPS = "linestrips"; +DLLSPEC daeString COLLADA_TYPE_POLYGONS = "polygons"; +DLLSPEC daeString COLLADA_TYPE_PH = "ph"; +DLLSPEC daeString COLLADA_TYPE_H = "h"; +DLLSPEC daeString COLLADA_TYPE_POLYLIST = "polylist"; +DLLSPEC daeString COLLADA_TYPE_VCOUNT = "vcount"; +DLLSPEC daeString COLLADA_TYPE_TRIANGLES = "triangles"; +DLLSPEC daeString COLLADA_TYPE_TRIFANS = "trifans"; +DLLSPEC daeString COLLADA_TYPE_TRISTRIPS = "tristrips"; +DLLSPEC daeString COLLADA_TYPE_VERTICES = "vertices"; +DLLSPEC daeString COLLADA_TYPE_LOOKAT = "lookat"; +DLLSPEC daeString COLLADA_TYPE_MATRIX = "matrix"; +DLLSPEC daeString COLLADA_TYPE_ROTATE = "rotate"; +DLLSPEC daeString COLLADA_TYPE_SCALE = "scale"; +DLLSPEC daeString COLLADA_TYPE_SKEW = "skew"; +DLLSPEC daeString COLLADA_TYPE_TRANSLATE = "translate"; +DLLSPEC daeString COLLADA_TYPE_IMAGE = "image"; +DLLSPEC daeString COLLADA_TYPE_DATA = "data"; +DLLSPEC daeString COLLADA_TYPE_INIT_FROM = "init_from"; +DLLSPEC daeString COLLADA_TYPE_LIGHT = "light"; +DLLSPEC daeString COLLADA_TYPE_AMBIENT = "ambient"; +DLLSPEC daeString COLLADA_TYPE_DIRECTIONAL = "directional"; +DLLSPEC daeString COLLADA_TYPE_POINT = "point"; +DLLSPEC daeString COLLADA_TYPE_SPOT = "spot"; +DLLSPEC daeString COLLADA_TYPE_MATERIAL = "material"; +DLLSPEC daeString COLLADA_TYPE_CAMERA = "camera"; +DLLSPEC daeString COLLADA_TYPE_OPTICS = "optics"; +DLLSPEC daeString COLLADA_TYPE_ORTHOGRAPHIC = "orthographic"; +DLLSPEC daeString COLLADA_TYPE_PERSPECTIVE = "perspective"; +DLLSPEC daeString COLLADA_TYPE_IMAGER = "imager"; +DLLSPEC daeString COLLADA_TYPE_ANIMATION = "animation"; +DLLSPEC daeString COLLADA_TYPE_ANIMATION_CLIP = "animation_clip"; +DLLSPEC daeString COLLADA_TYPE_CHANNEL = "channel"; +DLLSPEC daeString COLLADA_TYPE_SAMPLER = "sampler"; +DLLSPEC daeString COLLADA_TYPE_CONTROLLER = "controller"; +DLLSPEC daeString COLLADA_TYPE_SKIN = "skin"; +DLLSPEC daeString COLLADA_TYPE_BIND_SHAPE_MATRIX = "bind_shape_matrix"; +DLLSPEC daeString COLLADA_TYPE_JOINTS = "joints"; +DLLSPEC daeString COLLADA_TYPE_VERTEX_WEIGHTS = "vertex_weights"; +DLLSPEC daeString COLLADA_TYPE_V = "v"; +DLLSPEC daeString COLLADA_TYPE_MORPH = "morph"; +DLLSPEC daeString COLLADA_TYPE_TARGETS = "targets"; +DLLSPEC daeString COLLADA_TYPE_ASSET = "asset"; +DLLSPEC daeString COLLADA_TYPE_CONTRIBUTOR = "contributor"; +DLLSPEC daeString COLLADA_TYPE_AUTHOR = "author"; +DLLSPEC daeString COLLADA_TYPE_AUTHORING_TOOL = "authoring_tool"; +DLLSPEC daeString COLLADA_TYPE_COMMENTS = "comments"; +DLLSPEC daeString COLLADA_TYPE_COPYRIGHT = "copyright"; +DLLSPEC daeString COLLADA_TYPE_SOURCE_DATA = "source_data"; +DLLSPEC daeString COLLADA_TYPE_CREATED = "created"; +DLLSPEC daeString COLLADA_TYPE_KEYWORDS = "keywords"; +DLLSPEC daeString COLLADA_TYPE_MODIFIED = "modified"; +DLLSPEC daeString COLLADA_TYPE_REVISION = "revision"; +DLLSPEC daeString COLLADA_TYPE_SUBJECT = "subject"; +DLLSPEC daeString COLLADA_TYPE_TITLE = "title"; +DLLSPEC daeString COLLADA_TYPE_UNIT = "unit"; +DLLSPEC daeString COLLADA_TYPE_UP_AXIS = "up_axis"; +DLLSPEC daeString COLLADA_TYPE_EXTRA = "extra"; +DLLSPEC daeString COLLADA_TYPE_TECHNIQUE = "technique"; +DLLSPEC daeString COLLADA_TYPE_NODE = "node"; +DLLSPEC daeString COLLADA_TYPE_VISUAL_SCENE = "visual_scene"; +DLLSPEC daeString COLLADA_TYPE_EVALUATE_SCENE = "evaluate_scene"; +DLLSPEC daeString COLLADA_TYPE_RENDER = "render"; +DLLSPEC daeString COLLADA_TYPE_LAYER = "layer"; +DLLSPEC daeString COLLADA_TYPE_BIND_MATERIAL = "bind_material"; +DLLSPEC daeString COLLADA_TYPE_INSTANCE_CAMERA = "instance_camera"; +DLLSPEC daeString COLLADA_TYPE_INSTANCE_CONTROLLER = "instance_controller"; +DLLSPEC daeString COLLADA_TYPE_SKELETON = "skeleton"; +DLLSPEC daeString COLLADA_TYPE_INSTANCE_EFFECT = "instance_effect"; +DLLSPEC daeString COLLADA_TYPE_TECHNIQUE_HINT = "technique_hint"; +DLLSPEC daeString COLLADA_TYPE_SETPARAM = "setparam"; +DLLSPEC daeString COLLADA_TYPE_INSTANCE_FORCE_FIELD = "instance_force_field"; +DLLSPEC daeString COLLADA_TYPE_INSTANCE_GEOMETRY = "instance_geometry"; +DLLSPEC daeString COLLADA_TYPE_INSTANCE_LIGHT = "instance_light"; +DLLSPEC daeString COLLADA_TYPE_INSTANCE_MATERIAL = "instance_material"; +DLLSPEC daeString COLLADA_TYPE_BIND = "bind"; +DLLSPEC daeString COLLADA_TYPE_BIND_VERTEX_INPUT = "bind_vertex_input"; +DLLSPEC daeString COLLADA_TYPE_INSTANCE_NODE = "instance_node"; +DLLSPEC daeString COLLADA_TYPE_INSTANCE_PHYSICS_MATERIAL = "instance_physics_material"; +DLLSPEC daeString COLLADA_TYPE_INSTANCE_PHYSICS_MODEL = "instance_physics_model"; +DLLSPEC daeString COLLADA_TYPE_INSTANCE_RIGID_BODY = "instance_rigid_body"; +DLLSPEC daeString COLLADA_TYPE_ANGULAR_VELOCITY = "angular_velocity"; +DLLSPEC daeString COLLADA_TYPE_VELOCITY = "velocity"; +DLLSPEC daeString COLLADA_TYPE_DYNAMIC = "dynamic"; +DLLSPEC daeString COLLADA_TYPE_MASS_FRAME = "mass_frame"; +DLLSPEC daeString COLLADA_TYPE_SHAPE = "shape"; +DLLSPEC daeString COLLADA_TYPE_HOLLOW = "hollow"; +DLLSPEC daeString COLLADA_TYPE_INSTANCE_RIGID_CONSTRAINT = "instance_rigid_constraint"; +DLLSPEC daeString COLLADA_TYPE_LIBRARY_ANIMATIONS = "library_animations"; +DLLSPEC daeString COLLADA_TYPE_LIBRARY_ANIMATION_CLIPS = "library_animation_clips"; +DLLSPEC daeString COLLADA_TYPE_LIBRARY_CAMERAS = "library_cameras"; +DLLSPEC daeString COLLADA_TYPE_LIBRARY_CONTROLLERS = "library_controllers"; +DLLSPEC daeString COLLADA_TYPE_LIBRARY_GEOMETRIES = "library_geometries"; +DLLSPEC daeString COLLADA_TYPE_LIBRARY_EFFECTS = "library_effects"; +DLLSPEC daeString COLLADA_TYPE_LIBRARY_FORCE_FIELDS = "library_force_fields"; +DLLSPEC daeString COLLADA_TYPE_LIBRARY_IMAGES = "library_images"; +DLLSPEC daeString COLLADA_TYPE_LIBRARY_LIGHTS = "library_lights"; +DLLSPEC daeString COLLADA_TYPE_LIBRARY_MATERIALS = "library_materials"; +DLLSPEC daeString COLLADA_TYPE_LIBRARY_NODES = "library_nodes"; +DLLSPEC daeString COLLADA_TYPE_LIBRARY_PHYSICS_MATERIALS = "library_physics_materials"; +DLLSPEC daeString COLLADA_TYPE_LIBRARY_PHYSICS_MODELS = "library_physics_models"; +DLLSPEC daeString COLLADA_TYPE_LIBRARY_PHYSICS_SCENES = "library_physics_scenes"; +DLLSPEC daeString COLLADA_TYPE_LIBRARY_VISUAL_SCENES = "library_visual_scenes"; +DLLSPEC daeString COLLADA_TYPE_FX_PROFILE_ABSTRACT = "fx_profile_abstract"; +DLLSPEC daeString COLLADA_TYPE_EFFECT = "effect"; +DLLSPEC daeString COLLADA_TYPE_GL_HOOK_ABSTRACT = "gl_hook_abstract"; +DLLSPEC daeString COLLADA_TYPE_PROFILE_GLSL = "profile_GLSL"; +DLLSPEC daeString COLLADA_TYPE_PASS = "pass"; +DLLSPEC daeString COLLADA_TYPE_DRAW = "draw"; +DLLSPEC daeString COLLADA_TYPE_SHADER = "shader"; +DLLSPEC daeString COLLADA_TYPE_COMPILER_TARGET = "compiler_target"; +DLLSPEC daeString COLLADA_TYPE_COMPILER_OPTIONS = "compiler_options"; +DLLSPEC daeString COLLADA_TYPE_PROFILE_COMMON = "profile_COMMON"; +DLLSPEC daeString COLLADA_TYPE_CONSTANT = "constant"; +DLLSPEC daeString COLLADA_TYPE_LAMBERT = "lambert"; +DLLSPEC daeString COLLADA_TYPE_PHONG = "phong"; +DLLSPEC daeString COLLADA_TYPE_BLINN = "blinn"; +DLLSPEC daeString COLLADA_TYPE_PROFILE_CG = "profile_CG"; +DLLSPEC daeString COLLADA_TYPE_PROFILE_GLES = "profile_GLES"; +DLLSPEC daeString COLLADA_TYPE_COLOR_TARGET = "color_target"; +DLLSPEC daeString COLLADA_TYPE_DEPTH_TARGET = "depth_target"; +DLLSPEC daeString COLLADA_TYPE_STENCIL_TARGET = "stencil_target"; +DLLSPEC daeString COLLADA_TYPE_COLOR_CLEAR = "color_clear"; +DLLSPEC daeString COLLADA_TYPE_DEPTH_CLEAR = "depth_clear"; +DLLSPEC daeString COLLADA_TYPE_STENCIL_CLEAR = "stencil_clear"; +DLLSPEC daeString COLLADA_TYPE_BOX = "box"; +DLLSPEC daeString COLLADA_TYPE_HALF_EXTENTS = "half_extents"; +DLLSPEC daeString COLLADA_TYPE_PLANE = "plane"; +DLLSPEC daeString COLLADA_TYPE_EQUATION = "equation"; +DLLSPEC daeString COLLADA_TYPE_SPHERE = "sphere"; +DLLSPEC daeString COLLADA_TYPE_RADIUS = "radius"; +DLLSPEC daeString COLLADA_TYPE_ELLIPSOID = "ellipsoid"; +DLLSPEC daeString COLLADA_TYPE_CYLINDER = "cylinder"; +DLLSPEC daeString COLLADA_TYPE_HEIGHT = "height"; +DLLSPEC daeString COLLADA_TYPE_TAPERED_CYLINDER = "tapered_cylinder"; +DLLSPEC daeString COLLADA_TYPE_RADIUS1 = "radius1"; +DLLSPEC daeString COLLADA_TYPE_RADIUS2 = "radius2"; +DLLSPEC daeString COLLADA_TYPE_CAPSULE = "capsule"; +DLLSPEC daeString COLLADA_TYPE_TAPERED_CAPSULE = "tapered_capsule"; +DLLSPEC daeString COLLADA_TYPE_CONVEX_MESH = "convex_mesh"; +DLLSPEC daeString COLLADA_TYPE_FORCE_FIELD = "force_field"; +DLLSPEC daeString COLLADA_TYPE_PHYSICS_MATERIAL = "physics_material"; +DLLSPEC daeString COLLADA_TYPE_PHYSICS_SCENE = "physics_scene"; +DLLSPEC daeString COLLADA_TYPE_RIGID_BODY = "rigid_body"; +DLLSPEC daeString COLLADA_TYPE_RIGID_CONSTRAINT = "rigid_constraint"; +DLLSPEC daeString COLLADA_TYPE_REF_ATTACHMENT = "ref_attachment"; +DLLSPEC daeString COLLADA_TYPE_ATTACHMENT = "attachment"; +DLLSPEC daeString COLLADA_TYPE_ENABLED = "enabled"; +DLLSPEC daeString COLLADA_TYPE_INTERPENETRATE = "interpenetrate"; +DLLSPEC daeString COLLADA_TYPE_LIMITS = "limits"; +DLLSPEC daeString COLLADA_TYPE_SWING_CONE_AND_TWIST = "swing_cone_and_twist"; +DLLSPEC daeString COLLADA_TYPE_LINEAR = "linear"; +DLLSPEC daeString COLLADA_TYPE_SPRING = "spring"; +DLLSPEC daeString COLLADA_TYPE_ANGULAR = "angular"; +DLLSPEC daeString COLLADA_TYPE_PHYSICS_MODEL = "physics_model"; + +DLLSPEC daeString COLLADA_ELEMENT_COLLADA = "COLLADA"; +DLLSPEC daeString COLLADA_ELEMENT_EXTRA = "extra"; +DLLSPEC daeString COLLADA_ELEMENT_CHANNELS = "channels"; +DLLSPEC daeString COLLADA_ELEMENT_RANGE = "range"; +DLLSPEC daeString COLLADA_ELEMENT_PRECISION = "precision"; +DLLSPEC daeString COLLADA_ELEMENT_OPTION = "option"; +DLLSPEC daeString COLLADA_ELEMENT_ALL = "all"; +DLLSPEC daeString COLLADA_ELEMENT_PRIMARY = "primary"; +DLLSPEC daeString COLLADA_ELEMENT_FACE = "face"; +DLLSPEC daeString COLLADA_ELEMENT_ORDER = "order"; +DLLSPEC daeString COLLADA_ELEMENT_FX_SURFACE_INIT_COMMON = "fx_surface_init_common"; +DLLSPEC daeString COLLADA_ELEMENT_FORMAT = "format"; +DLLSPEC daeString COLLADA_ELEMENT_FORMAT_HINT = "format_hint"; +DLLSPEC daeString COLLADA_ELEMENT_SIZE = "size"; +DLLSPEC daeString COLLADA_ELEMENT_VIEWPORT_RATIO = "viewport_ratio"; +DLLSPEC daeString COLLADA_ELEMENT_MIP_LEVELS = "mip_levels"; +DLLSPEC daeString COLLADA_ELEMENT_MIPMAP_GENERATE = "mipmap_generate"; +DLLSPEC daeString COLLADA_ELEMENT_SOURCE = "source"; +DLLSPEC daeString COLLADA_ELEMENT_WRAP_S = "wrap_s"; +DLLSPEC daeString COLLADA_ELEMENT_MINFILTER = "minfilter"; +DLLSPEC daeString COLLADA_ELEMENT_MAGFILTER = "magfilter"; +DLLSPEC daeString COLLADA_ELEMENT_MIPFILTER = "mipfilter"; +DLLSPEC daeString COLLADA_ELEMENT_BORDER_COLOR = "border_color"; +DLLSPEC daeString COLLADA_ELEMENT_MIPMAP_MAXLEVEL = "mipmap_maxlevel"; +DLLSPEC daeString COLLADA_ELEMENT_MIPMAP_BIAS = "mipmap_bias"; +DLLSPEC daeString COLLADA_ELEMENT_WRAP_T = "wrap_t"; +DLLSPEC daeString COLLADA_ELEMENT_WRAP_P = "wrap_p"; +DLLSPEC daeString COLLADA_ELEMENT_FX_ANNOTATE_TYPE_COMMON = "fx_annotate_type_common"; +DLLSPEC daeString COLLADA_ELEMENT_ANNOTATE = "annotate"; +DLLSPEC daeString COLLADA_ELEMENT_SEMANTIC = "semantic"; +DLLSPEC daeString COLLADA_ELEMENT_MODIFIER = "modifier"; +DLLSPEC daeString COLLADA_ELEMENT_FX_BASIC_TYPE_COMMON = "fx_basic_type_common"; +DLLSPEC daeString COLLADA_ELEMENT_GLSL_PARAM_TYPE = "glsl_param_type"; +DLLSPEC daeString COLLADA_ELEMENT_ARRAY = "array"; +DLLSPEC daeString COLLADA_ELEMENT_GENERATOR = "generator"; +DLLSPEC daeString COLLADA_ELEMENT_CODE = "code"; +DLLSPEC daeString COLLADA_ELEMENT_INCLUDE = "include"; +DLLSPEC daeString COLLADA_ELEMENT_NAME = "name"; +DLLSPEC daeString COLLADA_ELEMENT_SETPARAM = "setparam"; +DLLSPEC daeString COLLADA_ELEMENT_FLOAT = "float"; +DLLSPEC daeString COLLADA_ELEMENT_PARAM = "param"; +DLLSPEC daeString COLLADA_ELEMENT_COLOR = "color"; +DLLSPEC daeString COLLADA_ELEMENT_TEXTURE = "texture"; +DLLSPEC daeString COLLADA_ELEMENT_FLOAT2 = "float2"; +DLLSPEC daeString COLLADA_ELEMENT_FLOAT3 = "float3"; +DLLSPEC daeString COLLADA_ELEMENT_FLOAT4 = "float4"; +DLLSPEC daeString COLLADA_ELEMENT_SURFACE = "surface"; +DLLSPEC daeString COLLADA_ELEMENT_SAMPLER2D = "sampler2D"; +DLLSPEC daeString COLLADA_ELEMENT_CG_PARAM_TYPE = "cg_param_type"; +DLLSPEC daeString COLLADA_ELEMENT_USERTYPE = "usertype"; +DLLSPEC daeString COLLADA_ELEMENT_CONNECT_PARAM = "connect_param"; +DLLSPEC daeString COLLADA_ELEMENT_CONSTANT = "constant"; +DLLSPEC daeString COLLADA_ELEMENT_ARGUMENT = "argument"; +DLLSPEC daeString COLLADA_ELEMENT_RGB = "RGB"; +DLLSPEC daeString COLLADA_ELEMENT_ALPHA = "alpha"; +DLLSPEC daeString COLLADA_ELEMENT_TEXCOMBINER = "texcombiner"; +DLLSPEC daeString COLLADA_ELEMENT_TEXENV = "texenv"; +DLLSPEC daeString COLLADA_ELEMENT_SAMPLER_STATE = "sampler_state"; +DLLSPEC daeString COLLADA_ELEMENT_TEXCOORD = "texcoord"; +DLLSPEC daeString COLLADA_ELEMENT_GLES_BASIC_TYPE_COMMON = "gles_basic_type_common"; +DLLSPEC daeString COLLADA_ELEMENT_INIT_AS_NULL = "init_as_null"; +DLLSPEC daeString COLLADA_ELEMENT_INIT_AS_TARGET = "init_as_target"; +DLLSPEC daeString COLLADA_ELEMENT_INIT_CUBE = "init_cube"; +DLLSPEC daeString COLLADA_ELEMENT_INIT_VOLUME = "init_volume"; +DLLSPEC daeString COLLADA_ELEMENT_INIT_PLANAR = "init_planar"; +DLLSPEC daeString COLLADA_ELEMENT_INIT_FROM = "init_from"; +DLLSPEC daeString COLLADA_ELEMENT_BOOL = "bool"; +DLLSPEC daeString COLLADA_ELEMENT_BOOL2 = "bool2"; +DLLSPEC daeString COLLADA_ELEMENT_BOOL3 = "bool3"; +DLLSPEC daeString COLLADA_ELEMENT_BOOL4 = "bool4"; +DLLSPEC daeString COLLADA_ELEMENT_INT = "int"; +DLLSPEC daeString COLLADA_ELEMENT_INT2 = "int2"; +DLLSPEC daeString COLLADA_ELEMENT_INT3 = "int3"; +DLLSPEC daeString COLLADA_ELEMENT_INT4 = "int4"; +DLLSPEC daeString COLLADA_ELEMENT_FLOAT2X2 = "float2x2"; +DLLSPEC daeString COLLADA_ELEMENT_FLOAT3X3 = "float3x3"; +DLLSPEC daeString COLLADA_ELEMENT_FLOAT4X4 = "float4x4"; +DLLSPEC daeString COLLADA_ELEMENT_STRING = "string"; +DLLSPEC daeString COLLADA_ELEMENT_FLOAT1X1 = "float1x1"; +DLLSPEC daeString COLLADA_ELEMENT_FLOAT1X2 = "float1x2"; +DLLSPEC daeString COLLADA_ELEMENT_FLOAT1X3 = "float1x3"; +DLLSPEC daeString COLLADA_ELEMENT_FLOAT1X4 = "float1x4"; +DLLSPEC daeString COLLADA_ELEMENT_FLOAT2X1 = "float2x1"; +DLLSPEC daeString COLLADA_ELEMENT_FLOAT2X3 = "float2x3"; +DLLSPEC daeString COLLADA_ELEMENT_FLOAT2X4 = "float2x4"; +DLLSPEC daeString COLLADA_ELEMENT_FLOAT3X1 = "float3x1"; +DLLSPEC daeString COLLADA_ELEMENT_FLOAT3X2 = "float3x2"; +DLLSPEC daeString COLLADA_ELEMENT_FLOAT3X4 = "float3x4"; +DLLSPEC daeString COLLADA_ELEMENT_FLOAT4X1 = "float4x1"; +DLLSPEC daeString COLLADA_ELEMENT_FLOAT4X2 = "float4x2"; +DLLSPEC daeString COLLADA_ELEMENT_FLOAT4X3 = "float4x3"; +DLLSPEC daeString COLLADA_ELEMENT_SAMPLER1D = "sampler1D"; +DLLSPEC daeString COLLADA_ELEMENT_SAMPLER3D = "sampler3D"; +DLLSPEC daeString COLLADA_ELEMENT_SAMPLERCUBE = "samplerCUBE"; +DLLSPEC daeString COLLADA_ELEMENT_SAMPLERRECT = "samplerRECT"; +DLLSPEC daeString COLLADA_ELEMENT_SAMPLERDEPTH = "samplerDEPTH"; +DLLSPEC daeString COLLADA_ELEMENT_ENUM = "enum"; +DLLSPEC daeString COLLADA_ELEMENT_ALPHA_FUNC = "alpha_func"; +DLLSPEC daeString COLLADA_ELEMENT_BLEND_FUNC = "blend_func"; +DLLSPEC daeString COLLADA_ELEMENT_BLEND_FUNC_SEPARATE = "blend_func_separate"; +DLLSPEC daeString COLLADA_ELEMENT_BLEND_EQUATION = "blend_equation"; +DLLSPEC daeString COLLADA_ELEMENT_BLEND_EQUATION_SEPARATE = "blend_equation_separate"; +DLLSPEC daeString COLLADA_ELEMENT_COLOR_MATERIAL = "color_material"; +DLLSPEC daeString COLLADA_ELEMENT_CULL_FACE = "cull_face"; +DLLSPEC daeString COLLADA_ELEMENT_DEPTH_FUNC = "depth_func"; +DLLSPEC daeString COLLADA_ELEMENT_FOG_MODE = "fog_mode"; +DLLSPEC daeString COLLADA_ELEMENT_FOG_COORD_SRC = "fog_coord_src"; +DLLSPEC daeString COLLADA_ELEMENT_FRONT_FACE = "front_face"; +DLLSPEC daeString COLLADA_ELEMENT_LIGHT_MODEL_COLOR_CONTROL = "light_model_color_control"; +DLLSPEC daeString COLLADA_ELEMENT_LOGIC_OP = "logic_op"; +DLLSPEC daeString COLLADA_ELEMENT_POLYGON_MODE = "polygon_mode"; +DLLSPEC daeString COLLADA_ELEMENT_SHADE_MODEL = "shade_model"; +DLLSPEC daeString COLLADA_ELEMENT_STENCIL_FUNC = "stencil_func"; +DLLSPEC daeString COLLADA_ELEMENT_STENCIL_OP = "stencil_op"; +DLLSPEC daeString COLLADA_ELEMENT_STENCIL_FUNC_SEPARATE = "stencil_func_separate"; +DLLSPEC daeString COLLADA_ELEMENT_STENCIL_OP_SEPARATE = "stencil_op_separate"; +DLLSPEC daeString COLLADA_ELEMENT_STENCIL_MASK_SEPARATE = "stencil_mask_separate"; +DLLSPEC daeString COLLADA_ELEMENT_LIGHT_ENABLE = "light_enable"; +DLLSPEC daeString COLLADA_ELEMENT_LIGHT_AMBIENT = "light_ambient"; +DLLSPEC daeString COLLADA_ELEMENT_LIGHT_DIFFUSE = "light_diffuse"; +DLLSPEC daeString COLLADA_ELEMENT_LIGHT_SPECULAR = "light_specular"; +DLLSPEC daeString COLLADA_ELEMENT_LIGHT_POSITION = "light_position"; +DLLSPEC daeString COLLADA_ELEMENT_LIGHT_CONSTANT_ATTENUATION = "light_constant_attenuation"; +DLLSPEC daeString COLLADA_ELEMENT_LIGHT_LINEAR_ATTENUATION = "light_linear_attenuation"; +DLLSPEC daeString COLLADA_ELEMENT_LIGHT_QUADRATIC_ATTENUATION = "light_quadratic_attenuation"; +DLLSPEC daeString COLLADA_ELEMENT_LIGHT_SPOT_CUTOFF = "light_spot_cutoff"; +DLLSPEC daeString COLLADA_ELEMENT_LIGHT_SPOT_DIRECTION = "light_spot_direction"; +DLLSPEC daeString COLLADA_ELEMENT_LIGHT_SPOT_EXPONENT = "light_spot_exponent"; +DLLSPEC daeString COLLADA_ELEMENT_TEXTURE1D = "texture1D"; +DLLSPEC daeString COLLADA_ELEMENT_TEXTURE2D = "texture2D"; +DLLSPEC daeString COLLADA_ELEMENT_TEXTURE3D = "texture3D"; +DLLSPEC daeString COLLADA_ELEMENT_TEXTURECUBE = "textureCUBE"; +DLLSPEC daeString COLLADA_ELEMENT_TEXTURERECT = "textureRECT"; +DLLSPEC daeString COLLADA_ELEMENT_TEXTUREDEPTH = "textureDEPTH"; +DLLSPEC daeString COLLADA_ELEMENT_TEXTURE1D_ENABLE = "texture1D_enable"; +DLLSPEC daeString COLLADA_ELEMENT_TEXTURE2D_ENABLE = "texture2D_enable"; +DLLSPEC daeString COLLADA_ELEMENT_TEXTURE3D_ENABLE = "texture3D_enable"; +DLLSPEC daeString COLLADA_ELEMENT_TEXTURECUBE_ENABLE = "textureCUBE_enable"; +DLLSPEC daeString COLLADA_ELEMENT_TEXTURERECT_ENABLE = "textureRECT_enable"; +DLLSPEC daeString COLLADA_ELEMENT_TEXTUREDEPTH_ENABLE = "textureDEPTH_enable"; +DLLSPEC daeString COLLADA_ELEMENT_TEXTURE_ENV_COLOR = "texture_env_color"; +DLLSPEC daeString COLLADA_ELEMENT_TEXTURE_ENV_MODE = "texture_env_mode"; +DLLSPEC daeString COLLADA_ELEMENT_CLIP_PLANE = "clip_plane"; +DLLSPEC daeString COLLADA_ELEMENT_CLIP_PLANE_ENABLE = "clip_plane_enable"; +DLLSPEC daeString COLLADA_ELEMENT_BLEND_COLOR = "blend_color"; +DLLSPEC daeString COLLADA_ELEMENT_CLEAR_COLOR = "clear_color"; +DLLSPEC daeString COLLADA_ELEMENT_CLEAR_STENCIL = "clear_stencil"; +DLLSPEC daeString COLLADA_ELEMENT_CLEAR_DEPTH = "clear_depth"; +DLLSPEC daeString COLLADA_ELEMENT_COLOR_MASK = "color_mask"; +DLLSPEC daeString COLLADA_ELEMENT_DEPTH_BOUNDS = "depth_bounds"; +DLLSPEC daeString COLLADA_ELEMENT_DEPTH_MASK = "depth_mask"; +DLLSPEC daeString COLLADA_ELEMENT_DEPTH_RANGE = "depth_range"; +DLLSPEC daeString COLLADA_ELEMENT_FOG_DENSITY = "fog_density"; +DLLSPEC daeString COLLADA_ELEMENT_FOG_START = "fog_start"; +DLLSPEC daeString COLLADA_ELEMENT_FOG_END = "fog_end"; +DLLSPEC daeString COLLADA_ELEMENT_FOG_COLOR = "fog_color"; +DLLSPEC daeString COLLADA_ELEMENT_LIGHT_MODEL_AMBIENT = "light_model_ambient"; +DLLSPEC daeString COLLADA_ELEMENT_LIGHTING_ENABLE = "lighting_enable"; +DLLSPEC daeString COLLADA_ELEMENT_LINE_STIPPLE = "line_stipple"; +DLLSPEC daeString COLLADA_ELEMENT_LINE_WIDTH = "line_width"; +DLLSPEC daeString COLLADA_ELEMENT_MATERIAL_AMBIENT = "material_ambient"; +DLLSPEC daeString COLLADA_ELEMENT_MATERIAL_DIFFUSE = "material_diffuse"; +DLLSPEC daeString COLLADA_ELEMENT_MATERIAL_EMISSION = "material_emission"; +DLLSPEC daeString COLLADA_ELEMENT_MATERIAL_SHININESS = "material_shininess"; +DLLSPEC daeString COLLADA_ELEMENT_MATERIAL_SPECULAR = "material_specular"; +DLLSPEC daeString COLLADA_ELEMENT_MODEL_VIEW_MATRIX = "model_view_matrix"; +DLLSPEC daeString COLLADA_ELEMENT_POINT_DISTANCE_ATTENUATION = "point_distance_attenuation"; +DLLSPEC daeString COLLADA_ELEMENT_POINT_FADE_THRESHOLD_SIZE = "point_fade_threshold_size"; +DLLSPEC daeString COLLADA_ELEMENT_POINT_SIZE = "point_size"; +DLLSPEC daeString COLLADA_ELEMENT_POINT_SIZE_MIN = "point_size_min"; +DLLSPEC daeString COLLADA_ELEMENT_POINT_SIZE_MAX = "point_size_max"; +DLLSPEC daeString COLLADA_ELEMENT_POLYGON_OFFSET = "polygon_offset"; +DLLSPEC daeString COLLADA_ELEMENT_PROJECTION_MATRIX = "projection_matrix"; +DLLSPEC daeString COLLADA_ELEMENT_SCISSOR = "scissor"; +DLLSPEC daeString COLLADA_ELEMENT_STENCIL_MASK = "stencil_mask"; +DLLSPEC daeString COLLADA_ELEMENT_ALPHA_TEST_ENABLE = "alpha_test_enable"; +DLLSPEC daeString COLLADA_ELEMENT_AUTO_NORMAL_ENABLE = "auto_normal_enable"; +DLLSPEC daeString COLLADA_ELEMENT_BLEND_ENABLE = "blend_enable"; +DLLSPEC daeString COLLADA_ELEMENT_COLOR_LOGIC_OP_ENABLE = "color_logic_op_enable"; +DLLSPEC daeString COLLADA_ELEMENT_COLOR_MATERIAL_ENABLE = "color_material_enable"; +DLLSPEC daeString COLLADA_ELEMENT_CULL_FACE_ENABLE = "cull_face_enable"; +DLLSPEC daeString COLLADA_ELEMENT_DEPTH_BOUNDS_ENABLE = "depth_bounds_enable"; +DLLSPEC daeString COLLADA_ELEMENT_DEPTH_CLAMP_ENABLE = "depth_clamp_enable"; +DLLSPEC daeString COLLADA_ELEMENT_DEPTH_TEST_ENABLE = "depth_test_enable"; +DLLSPEC daeString COLLADA_ELEMENT_DITHER_ENABLE = "dither_enable"; +DLLSPEC daeString COLLADA_ELEMENT_FOG_ENABLE = "fog_enable"; +DLLSPEC daeString COLLADA_ELEMENT_LIGHT_MODEL_LOCAL_VIEWER_ENABLE = "light_model_local_viewer_enable"; +DLLSPEC daeString COLLADA_ELEMENT_LIGHT_MODEL_TWO_SIDE_ENABLE = "light_model_two_side_enable"; +DLLSPEC daeString COLLADA_ELEMENT_LINE_SMOOTH_ENABLE = "line_smooth_enable"; +DLLSPEC daeString COLLADA_ELEMENT_LINE_STIPPLE_ENABLE = "line_stipple_enable"; +DLLSPEC daeString COLLADA_ELEMENT_LOGIC_OP_ENABLE = "logic_op_enable"; +DLLSPEC daeString COLLADA_ELEMENT_MULTISAMPLE_ENABLE = "multisample_enable"; +DLLSPEC daeString COLLADA_ELEMENT_NORMALIZE_ENABLE = "normalize_enable"; +DLLSPEC daeString COLLADA_ELEMENT_POINT_SMOOTH_ENABLE = "point_smooth_enable"; +DLLSPEC daeString COLLADA_ELEMENT_POLYGON_OFFSET_FILL_ENABLE = "polygon_offset_fill_enable"; +DLLSPEC daeString COLLADA_ELEMENT_POLYGON_OFFSET_LINE_ENABLE = "polygon_offset_line_enable"; +DLLSPEC daeString COLLADA_ELEMENT_POLYGON_OFFSET_POINT_ENABLE = "polygon_offset_point_enable"; +DLLSPEC daeString COLLADA_ELEMENT_POLYGON_SMOOTH_ENABLE = "polygon_smooth_enable"; +DLLSPEC daeString COLLADA_ELEMENT_POLYGON_STIPPLE_ENABLE = "polygon_stipple_enable"; +DLLSPEC daeString COLLADA_ELEMENT_RESCALE_NORMAL_ENABLE = "rescale_normal_enable"; +DLLSPEC daeString COLLADA_ELEMENT_SAMPLE_ALPHA_TO_COVERAGE_ENABLE = "sample_alpha_to_coverage_enable"; +DLLSPEC daeString COLLADA_ELEMENT_SAMPLE_ALPHA_TO_ONE_ENABLE = "sample_alpha_to_one_enable"; +DLLSPEC daeString COLLADA_ELEMENT_SAMPLE_COVERAGE_ENABLE = "sample_coverage_enable"; +DLLSPEC daeString COLLADA_ELEMENT_SCISSOR_TEST_ENABLE = "scissor_test_enable"; +DLLSPEC daeString COLLADA_ELEMENT_STENCIL_TEST_ENABLE = "stencil_test_enable"; +DLLSPEC daeString COLLADA_ELEMENT_GL_HOOK_ABSTRACT = "gl_hook_abstract"; +DLLSPEC daeString COLLADA_ELEMENT_FUNC = "func"; +DLLSPEC daeString COLLADA_ELEMENT_VALUE = "value"; +DLLSPEC daeString COLLADA_ELEMENT_SRC = "src"; +DLLSPEC daeString COLLADA_ELEMENT_DEST = "dest"; +DLLSPEC daeString COLLADA_ELEMENT_SRC_RGB = "src_rgb"; +DLLSPEC daeString COLLADA_ELEMENT_DEST_RGB = "dest_rgb"; +DLLSPEC daeString COLLADA_ELEMENT_SRC_ALPHA = "src_alpha"; +DLLSPEC daeString COLLADA_ELEMENT_DEST_ALPHA = "dest_alpha"; +DLLSPEC daeString COLLADA_ELEMENT_rgb = "rgb"; +DLLSPEC daeString COLLADA_ELEMENT_MODE = "mode"; +DLLSPEC daeString COLLADA_ELEMENT_REF = "ref"; +DLLSPEC daeString COLLADA_ELEMENT_MASK = "mask"; +DLLSPEC daeString COLLADA_ELEMENT_FAIL = "fail"; +DLLSPEC daeString COLLADA_ELEMENT_ZFAIL = "zfail"; +DLLSPEC daeString COLLADA_ELEMENT_ZPASS = "zpass"; +DLLSPEC daeString COLLADA_ELEMENT_FRONT = "front"; +DLLSPEC daeString COLLADA_ELEMENT_BACK = "back"; +DLLSPEC daeString COLLADA_ELEMENT_BOOL1 = "bool1"; +DLLSPEC daeString COLLADA_ELEMENT_BOOL1X1 = "bool1x1"; +DLLSPEC daeString COLLADA_ELEMENT_BOOL1X2 = "bool1x2"; +DLLSPEC daeString COLLADA_ELEMENT_BOOL1X3 = "bool1x3"; +DLLSPEC daeString COLLADA_ELEMENT_BOOL1X4 = "bool1x4"; +DLLSPEC daeString COLLADA_ELEMENT_BOOL2X1 = "bool2x1"; +DLLSPEC daeString COLLADA_ELEMENT_BOOL2X2 = "bool2x2"; +DLLSPEC daeString COLLADA_ELEMENT_BOOL2X3 = "bool2x3"; +DLLSPEC daeString COLLADA_ELEMENT_BOOL2X4 = "bool2x4"; +DLLSPEC daeString COLLADA_ELEMENT_BOOL3X1 = "bool3x1"; +DLLSPEC daeString COLLADA_ELEMENT_BOOL3X2 = "bool3x2"; +DLLSPEC daeString COLLADA_ELEMENT_BOOL3X3 = "bool3x3"; +DLLSPEC daeString COLLADA_ELEMENT_BOOL3X4 = "bool3x4"; +DLLSPEC daeString COLLADA_ELEMENT_BOOL4X1 = "bool4x1"; +DLLSPEC daeString COLLADA_ELEMENT_BOOL4X2 = "bool4x2"; +DLLSPEC daeString COLLADA_ELEMENT_BOOL4X3 = "bool4x3"; +DLLSPEC daeString COLLADA_ELEMENT_BOOL4X4 = "bool4x4"; +DLLSPEC daeString COLLADA_ELEMENT_FLOAT1 = "float1"; +DLLSPEC daeString COLLADA_ELEMENT_INT1 = "int1"; +DLLSPEC daeString COLLADA_ELEMENT_INT1X1 = "int1x1"; +DLLSPEC daeString COLLADA_ELEMENT_INT1X2 = "int1x2"; +DLLSPEC daeString COLLADA_ELEMENT_INT1X3 = "int1x3"; +DLLSPEC daeString COLLADA_ELEMENT_INT1X4 = "int1x4"; +DLLSPEC daeString COLLADA_ELEMENT_INT2X1 = "int2x1"; +DLLSPEC daeString COLLADA_ELEMENT_INT2X2 = "int2x2"; +DLLSPEC daeString COLLADA_ELEMENT_INT2X3 = "int2x3"; +DLLSPEC daeString COLLADA_ELEMENT_INT2X4 = "int2x4"; +DLLSPEC daeString COLLADA_ELEMENT_INT3X1 = "int3x1"; +DLLSPEC daeString COLLADA_ELEMENT_INT3X2 = "int3x2"; +DLLSPEC daeString COLLADA_ELEMENT_INT3X3 = "int3x3"; +DLLSPEC daeString COLLADA_ELEMENT_INT3X4 = "int3x4"; +DLLSPEC daeString COLLADA_ELEMENT_INT4X1 = "int4x1"; +DLLSPEC daeString COLLADA_ELEMENT_INT4X2 = "int4x2"; +DLLSPEC daeString COLLADA_ELEMENT_INT4X3 = "int4x3"; +DLLSPEC daeString COLLADA_ELEMENT_INT4X4 = "int4x4"; +DLLSPEC daeString COLLADA_ELEMENT_HALF = "half"; +DLLSPEC daeString COLLADA_ELEMENT_HALF1 = "half1"; +DLLSPEC daeString COLLADA_ELEMENT_HALF2 = "half2"; +DLLSPEC daeString COLLADA_ELEMENT_HALF3 = "half3"; +DLLSPEC daeString COLLADA_ELEMENT_HALF4 = "half4"; +DLLSPEC daeString COLLADA_ELEMENT_HALF1X1 = "half1x1"; +DLLSPEC daeString COLLADA_ELEMENT_HALF1X2 = "half1x2"; +DLLSPEC daeString COLLADA_ELEMENT_HALF1X3 = "half1x3"; +DLLSPEC daeString COLLADA_ELEMENT_HALF1X4 = "half1x4"; +DLLSPEC daeString COLLADA_ELEMENT_HALF2X1 = "half2x1"; +DLLSPEC daeString COLLADA_ELEMENT_HALF2X2 = "half2x2"; +DLLSPEC daeString COLLADA_ELEMENT_HALF2X3 = "half2x3"; +DLLSPEC daeString COLLADA_ELEMENT_HALF2X4 = "half2x4"; +DLLSPEC daeString COLLADA_ELEMENT_HALF3X1 = "half3x1"; +DLLSPEC daeString COLLADA_ELEMENT_HALF3X2 = "half3x2"; +DLLSPEC daeString COLLADA_ELEMENT_HALF3X3 = "half3x3"; +DLLSPEC daeString COLLADA_ELEMENT_HALF3X4 = "half3x4"; +DLLSPEC daeString COLLADA_ELEMENT_HALF4X1 = "half4x1"; +DLLSPEC daeString COLLADA_ELEMENT_HALF4X2 = "half4x2"; +DLLSPEC daeString COLLADA_ELEMENT_HALF4X3 = "half4x3"; +DLLSPEC daeString COLLADA_ELEMENT_HALF4X4 = "half4x4"; +DLLSPEC daeString COLLADA_ELEMENT_FIXED = "fixed"; +DLLSPEC daeString COLLADA_ELEMENT_FIXED1 = "fixed1"; +DLLSPEC daeString COLLADA_ELEMENT_FIXED2 = "fixed2"; +DLLSPEC daeString COLLADA_ELEMENT_FIXED3 = "fixed3"; +DLLSPEC daeString COLLADA_ELEMENT_FIXED4 = "fixed4"; +DLLSPEC daeString COLLADA_ELEMENT_FIXED1X1 = "fixed1x1"; +DLLSPEC daeString COLLADA_ELEMENT_FIXED1X2 = "fixed1x2"; +DLLSPEC daeString COLLADA_ELEMENT_FIXED1X3 = "fixed1x3"; +DLLSPEC daeString COLLADA_ELEMENT_FIXED1X4 = "fixed1x4"; +DLLSPEC daeString COLLADA_ELEMENT_FIXED2X1 = "fixed2x1"; +DLLSPEC daeString COLLADA_ELEMENT_FIXED2X2 = "fixed2x2"; +DLLSPEC daeString COLLADA_ELEMENT_FIXED2X3 = "fixed2x3"; +DLLSPEC daeString COLLADA_ELEMENT_FIXED2X4 = "fixed2x4"; +DLLSPEC daeString COLLADA_ELEMENT_FIXED3X1 = "fixed3x1"; +DLLSPEC daeString COLLADA_ELEMENT_FIXED3X2 = "fixed3x2"; +DLLSPEC daeString COLLADA_ELEMENT_FIXED3X3 = "fixed3x3"; +DLLSPEC daeString COLLADA_ELEMENT_FIXED3X4 = "fixed3x4"; +DLLSPEC daeString COLLADA_ELEMENT_FIXED4X1 = "fixed4x1"; +DLLSPEC daeString COLLADA_ELEMENT_FIXED4X2 = "fixed4x2"; +DLLSPEC daeString COLLADA_ELEMENT_FIXED4X3 = "fixed4x3"; +DLLSPEC daeString COLLADA_ELEMENT_FIXED4X4 = "fixed4x4"; +DLLSPEC daeString COLLADA_ELEMENT_TEXTURE_PIPELINE = "texture_pipeline"; +DLLSPEC daeString COLLADA_ELEMENT_LIGHT_LINEAR_ATTENUTATION = "light_linear_attenutation"; +DLLSPEC daeString COLLADA_ELEMENT_TEXTURE_PIPELINE_ENABLE = "texture_pipeline_enable"; +DLLSPEC daeString COLLADA_ELEMENT_TEXTURE_UNIT = "texture_unit"; +DLLSPEC daeString COLLADA_ELEMENT_ASSET = "asset"; +DLLSPEC daeString COLLADA_ELEMENT_LIBRARY_ANIMATIONS = "library_animations"; +DLLSPEC daeString COLLADA_ELEMENT_LIBRARY_ANIMATION_CLIPS = "library_animation_clips"; +DLLSPEC daeString COLLADA_ELEMENT_LIBRARY_CAMERAS = "library_cameras"; +DLLSPEC daeString COLLADA_ELEMENT_LIBRARY_CONTROLLERS = "library_controllers"; +DLLSPEC daeString COLLADA_ELEMENT_LIBRARY_GEOMETRIES = "library_geometries"; +DLLSPEC daeString COLLADA_ELEMENT_LIBRARY_EFFECTS = "library_effects"; +DLLSPEC daeString COLLADA_ELEMENT_LIBRARY_FORCE_FIELDS = "library_force_fields"; +DLLSPEC daeString COLLADA_ELEMENT_LIBRARY_IMAGES = "library_images"; +DLLSPEC daeString COLLADA_ELEMENT_LIBRARY_LIGHTS = "library_lights"; +DLLSPEC daeString COLLADA_ELEMENT_LIBRARY_MATERIALS = "library_materials"; +DLLSPEC daeString COLLADA_ELEMENT_LIBRARY_NODES = "library_nodes"; +DLLSPEC daeString COLLADA_ELEMENT_LIBRARY_PHYSICS_MATERIALS = "library_physics_materials"; +DLLSPEC daeString COLLADA_ELEMENT_LIBRARY_PHYSICS_MODELS = "library_physics_models"; +DLLSPEC daeString COLLADA_ELEMENT_LIBRARY_PHYSICS_SCENES = "library_physics_scenes"; +DLLSPEC daeString COLLADA_ELEMENT_LIBRARY_VISUAL_SCENES = "library_visual_scenes"; +DLLSPEC daeString COLLADA_ELEMENT_SCENE = "scene"; +DLLSPEC daeString COLLADA_ELEMENT_INSTANCE_PHYSICS_SCENE = "instance_physics_scene"; +DLLSPEC daeString COLLADA_ELEMENT_INSTANCE_VISUAL_SCENE = "instance_visual_scene"; +DLLSPEC daeString COLLADA_ELEMENT_IDREF_ARRAY = "IDREF_array"; +DLLSPEC daeString COLLADA_ELEMENT_NAME_ARRAY = "Name_array"; +DLLSPEC daeString COLLADA_ELEMENT_BOOL_ARRAY = "bool_array"; +DLLSPEC daeString COLLADA_ELEMENT_FLOAT_ARRAY = "float_array"; +DLLSPEC daeString COLLADA_ELEMENT_INT_ARRAY = "int_array"; +DLLSPEC daeString COLLADA_ELEMENT_TECHNIQUE_COMMON = "technique_common"; +DLLSPEC daeString COLLADA_ELEMENT_TECHNIQUE = "technique"; +DLLSPEC daeString COLLADA_ELEMENT_ACCESSOR = "accessor"; +DLLSPEC daeString COLLADA_ELEMENT_CONVEX_MESH = "convex_mesh"; +DLLSPEC daeString COLLADA_ELEMENT_MESH = "mesh"; +DLLSPEC daeString COLLADA_ELEMENT_SPLINE = "spline"; +DLLSPEC daeString COLLADA_ELEMENT_VERTICES = "vertices"; +DLLSPEC daeString COLLADA_ELEMENT_LINES = "lines"; +DLLSPEC daeString COLLADA_ELEMENT_LINESTRIPS = "linestrips"; +DLLSPEC daeString COLLADA_ELEMENT_POLYGONS = "polygons"; +DLLSPEC daeString COLLADA_ELEMENT_POLYLIST = "polylist"; +DLLSPEC daeString COLLADA_ELEMENT_TRIANGLES = "triangles"; +DLLSPEC daeString COLLADA_ELEMENT_TRIFANS = "trifans"; +DLLSPEC daeString COLLADA_ELEMENT_TRISTRIPS = "tristrips"; +DLLSPEC daeString COLLADA_ELEMENT_CONTROL_VERTICES = "control_vertices"; +DLLSPEC daeString COLLADA_ELEMENT_INPUT = "input"; +DLLSPEC daeString COLLADA_ELEMENT_P = "p"; +DLLSPEC daeString COLLADA_ELEMENT_PH = "ph"; +DLLSPEC daeString COLLADA_ELEMENT_H = "h"; +DLLSPEC daeString COLLADA_ELEMENT_VCOUNT = "vcount"; +DLLSPEC daeString COLLADA_ELEMENT_DATA = "data"; +DLLSPEC daeString COLLADA_ELEMENT_AMBIENT = "ambient"; +DLLSPEC daeString COLLADA_ELEMENT_DIRECTIONAL = "directional"; +DLLSPEC daeString COLLADA_ELEMENT_POINT = "point"; +DLLSPEC daeString COLLADA_ELEMENT_SPOT = "spot"; +DLLSPEC daeString COLLADA_ELEMENT_CONSTANT_ATTENUATION = "constant_attenuation"; +DLLSPEC daeString COLLADA_ELEMENT_LINEAR_ATTENUATION = "linear_attenuation"; +DLLSPEC daeString COLLADA_ELEMENT_QUADRATIC_ATTENUATION = "quadratic_attenuation"; +DLLSPEC daeString COLLADA_ELEMENT_FALLOFF_ANGLE = "falloff_angle"; +DLLSPEC daeString COLLADA_ELEMENT_FALLOFF_EXPONENT = "falloff_exponent"; +DLLSPEC daeString COLLADA_ELEMENT_INSTANCE_EFFECT = "instance_effect"; +DLLSPEC daeString COLLADA_ELEMENT_OPTICS = "optics"; +DLLSPEC daeString COLLADA_ELEMENT_IMAGER = "imager"; +DLLSPEC daeString COLLADA_ELEMENT_ORTHOGRAPHIC = "orthographic"; +DLLSPEC daeString COLLADA_ELEMENT_PERSPECTIVE = "perspective"; +DLLSPEC daeString COLLADA_ELEMENT_XMAG = "xmag"; +DLLSPEC daeString COLLADA_ELEMENT_YMAG = "ymag"; +DLLSPEC daeString COLLADA_ELEMENT_ASPECT_RATIO = "aspect_ratio"; +DLLSPEC daeString COLLADA_ELEMENT_ZNEAR = "znear"; +DLLSPEC daeString COLLADA_ELEMENT_ZFAR = "zfar"; +DLLSPEC daeString COLLADA_ELEMENT_XFOV = "xfov"; +DLLSPEC daeString COLLADA_ELEMENT_YFOV = "yfov"; +DLLSPEC daeString COLLADA_ELEMENT_SAMPLER = "sampler"; +DLLSPEC daeString COLLADA_ELEMENT_CHANNEL = "channel"; +DLLSPEC daeString COLLADA_ELEMENT_ANIMATION = "animation"; +DLLSPEC daeString COLLADA_ELEMENT_INSTANCE_ANIMATION = "instance_animation"; +DLLSPEC daeString COLLADA_ELEMENT_SKIN = "skin"; +DLLSPEC daeString COLLADA_ELEMENT_MORPH = "morph"; +DLLSPEC daeString COLLADA_ELEMENT_BIND_SHAPE_MATRIX = "bind_shape_matrix"; +DLLSPEC daeString COLLADA_ELEMENT_JOINTS = "joints"; +DLLSPEC daeString COLLADA_ELEMENT_VERTEX_WEIGHTS = "vertex_weights"; +DLLSPEC daeString COLLADA_ELEMENT_V = "v"; +DLLSPEC daeString COLLADA_ELEMENT_TARGETS = "targets"; +DLLSPEC daeString COLLADA_ELEMENT_CONTRIBUTOR = "contributor"; +DLLSPEC daeString COLLADA_ELEMENT_CREATED = "created"; +DLLSPEC daeString COLLADA_ELEMENT_KEYWORDS = "keywords"; +DLLSPEC daeString COLLADA_ELEMENT_MODIFIED = "modified"; +DLLSPEC daeString COLLADA_ELEMENT_REVISION = "revision"; +DLLSPEC daeString COLLADA_ELEMENT_SUBJECT = "subject"; +DLLSPEC daeString COLLADA_ELEMENT_TITLE = "title"; +DLLSPEC daeString COLLADA_ELEMENT_UNIT = "unit"; +DLLSPEC daeString COLLADA_ELEMENT_UP_AXIS = "up_axis"; +DLLSPEC daeString COLLADA_ELEMENT_AUTHOR = "author"; +DLLSPEC daeString COLLADA_ELEMENT_AUTHORING_TOOL = "authoring_tool"; +DLLSPEC daeString COLLADA_ELEMENT_COMMENTS = "comments"; +DLLSPEC daeString COLLADA_ELEMENT_COPYRIGHT = "copyright"; +DLLSPEC daeString COLLADA_ELEMENT_SOURCE_DATA = "source_data"; +DLLSPEC daeString COLLADA_ELEMENT_LOOKAT = "lookat"; +DLLSPEC daeString COLLADA_ELEMENT_MATRIX = "matrix"; +DLLSPEC daeString COLLADA_ELEMENT_ROTATE = "rotate"; +DLLSPEC daeString COLLADA_ELEMENT_SCALE = "scale"; +DLLSPEC daeString COLLADA_ELEMENT_SKEW = "skew"; +DLLSPEC daeString COLLADA_ELEMENT_TRANSLATE = "translate"; +DLLSPEC daeString COLLADA_ELEMENT_INSTANCE_CAMERA = "instance_camera"; +DLLSPEC daeString COLLADA_ELEMENT_INSTANCE_CONTROLLER = "instance_controller"; +DLLSPEC daeString COLLADA_ELEMENT_INSTANCE_GEOMETRY = "instance_geometry"; +DLLSPEC daeString COLLADA_ELEMENT_INSTANCE_LIGHT = "instance_light"; +DLLSPEC daeString COLLADA_ELEMENT_INSTANCE_NODE = "instance_node"; +DLLSPEC daeString COLLADA_ELEMENT_NODE = "node"; +DLLSPEC daeString COLLADA_ELEMENT_EVALUATE_SCENE = "evaluate_scene"; +DLLSPEC daeString COLLADA_ELEMENT_RENDER = "render"; +DLLSPEC daeString COLLADA_ELEMENT_LAYER = "layer"; +DLLSPEC daeString COLLADA_ELEMENT_INSTANCE_MATERIAL = "instance_material"; +DLLSPEC daeString COLLADA_ELEMENT_SKELETON = "skeleton"; +DLLSPEC daeString COLLADA_ELEMENT_BIND_MATERIAL = "bind_material"; +DLLSPEC daeString COLLADA_ELEMENT_TECHNIQUE_HINT = "technique_hint"; +DLLSPEC daeString COLLADA_ELEMENT_BIND = "bind"; +DLLSPEC daeString COLLADA_ELEMENT_BIND_VERTEX_INPUT = "bind_vertex_input"; +DLLSPEC daeString COLLADA_ELEMENT_INSTANCE_FORCE_FIELD = "instance_force_field"; +DLLSPEC daeString COLLADA_ELEMENT_INSTANCE_RIGID_BODY = "instance_rigid_body"; +DLLSPEC daeString COLLADA_ELEMENT_INSTANCE_RIGID_CONSTRAINT = "instance_rigid_constraint"; +DLLSPEC daeString COLLADA_ELEMENT_ANGULAR_VELOCITY = "angular_velocity"; +DLLSPEC daeString COLLADA_ELEMENT_VELOCITY = "velocity"; +DLLSPEC daeString COLLADA_ELEMENT_DYNAMIC = "dynamic"; +DLLSPEC daeString COLLADA_ELEMENT_MASS = "mass"; +DLLSPEC daeString COLLADA_ELEMENT_MASS_FRAME = "mass_frame"; +DLLSPEC daeString COLLADA_ELEMENT_INERTIA = "inertia"; +DLLSPEC daeString COLLADA_ELEMENT_INSTANCE_PHYSICS_MATERIAL = "instance_physics_material"; +DLLSPEC daeString COLLADA_ELEMENT_PHYSICS_MATERIAL = "physics_material"; +DLLSPEC daeString COLLADA_ELEMENT_SHAPE = "shape"; +DLLSPEC daeString COLLADA_ELEMENT_HOLLOW = "hollow"; +DLLSPEC daeString COLLADA_ELEMENT_DENSITY = "density"; +DLLSPEC daeString COLLADA_ELEMENT_PLANE = "plane"; +DLLSPEC daeString COLLADA_ELEMENT_BOX = "box"; +DLLSPEC daeString COLLADA_ELEMENT_SPHERE = "sphere"; +DLLSPEC daeString COLLADA_ELEMENT_CYLINDER = "cylinder"; +DLLSPEC daeString COLLADA_ELEMENT_TAPERED_CYLINDER = "tapered_cylinder"; +DLLSPEC daeString COLLADA_ELEMENT_CAPSULE = "capsule"; +DLLSPEC daeString COLLADA_ELEMENT_TAPERED_CAPSULE = "tapered_capsule"; +DLLSPEC daeString COLLADA_ELEMENT_ANIMATION_CLIP = "animation_clip"; +DLLSPEC daeString COLLADA_ELEMENT_CAMERA = "camera"; +DLLSPEC daeString COLLADA_ELEMENT_CONTROLLER = "controller"; +DLLSPEC daeString COLLADA_ELEMENT_GEOMETRY = "geometry"; +DLLSPEC daeString COLLADA_ELEMENT_EFFECT = "effect"; +DLLSPEC daeString COLLADA_ELEMENT_FORCE_FIELD = "force_field"; +DLLSPEC daeString COLLADA_ELEMENT_IMAGE = "image"; +DLLSPEC daeString COLLADA_ELEMENT_LIGHT = "light"; +DLLSPEC daeString COLLADA_ELEMENT_MATERIAL = "material"; +DLLSPEC daeString COLLADA_ELEMENT_PHYSICS_MODEL = "physics_model"; +DLLSPEC daeString COLLADA_ELEMENT_PHYSICS_SCENE = "physics_scene"; +DLLSPEC daeString COLLADA_ELEMENT_VISUAL_SCENE = "visual_scene"; +DLLSPEC daeString COLLADA_ELEMENT_NEWPARAM = "newparam"; +DLLSPEC daeString COLLADA_ELEMENT_FX_PROFILE_ABSTRACT = "fx_profile_abstract"; +DLLSPEC daeString COLLADA_ELEMENT_PROFILE_GLSL = "profile_GLSL"; +DLLSPEC daeString COLLADA_ELEMENT_PASS = "pass"; +DLLSPEC daeString COLLADA_ELEMENT_COLOR_TARGET = "color_target"; +DLLSPEC daeString COLLADA_ELEMENT_DEPTH_TARGET = "depth_target"; +DLLSPEC daeString COLLADA_ELEMENT_STENCIL_TARGET = "stencil_target"; +DLLSPEC daeString COLLADA_ELEMENT_COLOR_CLEAR = "color_clear"; +DLLSPEC daeString COLLADA_ELEMENT_DEPTH_CLEAR = "depth_clear"; +DLLSPEC daeString COLLADA_ELEMENT_STENCIL_CLEAR = "stencil_clear"; +DLLSPEC daeString COLLADA_ELEMENT_DRAW = "draw"; +DLLSPEC daeString COLLADA_ELEMENT_GL_PIPELINE_SETTINGS = "gl_pipeline_settings"; +DLLSPEC daeString COLLADA_ELEMENT_SHADER = "shader"; +DLLSPEC daeString COLLADA_ELEMENT_COMPILER_TARGET = "compiler_target"; +DLLSPEC daeString COLLADA_ELEMENT_COMPILER_OPTIONS = "compiler_options"; +DLLSPEC daeString COLLADA_ELEMENT_PROFILE_COMMON = "profile_COMMON"; +DLLSPEC daeString COLLADA_ELEMENT_LAMBERT = "lambert"; +DLLSPEC daeString COLLADA_ELEMENT_PHONG = "phong"; +DLLSPEC daeString COLLADA_ELEMENT_BLINN = "blinn"; +DLLSPEC daeString COLLADA_ELEMENT_EMISSION = "emission"; +DLLSPEC daeString COLLADA_ELEMENT_REFLECTIVE = "reflective"; +DLLSPEC daeString COLLADA_ELEMENT_REFLECTIVITY = "reflectivity"; +DLLSPEC daeString COLLADA_ELEMENT_TRANSPARENT = "transparent"; +DLLSPEC daeString COLLADA_ELEMENT_TRANSPARENCY = "transparency"; +DLLSPEC daeString COLLADA_ELEMENT_INDEX_OF_REFRACTION = "index_of_refraction"; +DLLSPEC daeString COLLADA_ELEMENT_DIFFUSE = "diffuse"; +DLLSPEC daeString COLLADA_ELEMENT_SPECULAR = "specular"; +DLLSPEC daeString COLLADA_ELEMENT_SHININESS = "shininess"; +DLLSPEC daeString COLLADA_ELEMENT_PROFILE_CG = "profile_CG"; +DLLSPEC daeString COLLADA_ELEMENT_PROFILE_GLES = "profile_GLES"; +DLLSPEC daeString COLLADA_ELEMENT_GLES_PIPELINE_SETTINGS = "gles_pipeline_settings"; +DLLSPEC daeString COLLADA_ELEMENT_HALF_EXTENTS = "half_extents"; +DLLSPEC daeString COLLADA_ELEMENT_EQUATION = "equation"; +DLLSPEC daeString COLLADA_ELEMENT_RADIUS = "radius"; +DLLSPEC daeString COLLADA_ELEMENT_HEIGHT = "height"; +DLLSPEC daeString COLLADA_ELEMENT_RADIUS1 = "radius1"; +DLLSPEC daeString COLLADA_ELEMENT_RADIUS2 = "radius2"; +DLLSPEC daeString COLLADA_ELEMENT_DYNAMIC_FRICTION = "dynamic_friction"; +DLLSPEC daeString COLLADA_ELEMENT_RESTITUTION = "restitution"; +DLLSPEC daeString COLLADA_ELEMENT_STATIC_FRICTION = "static_friction"; +DLLSPEC daeString COLLADA_ELEMENT_INSTANCE_PHYSICS_MODEL = "instance_physics_model"; +DLLSPEC daeString COLLADA_ELEMENT_GRAVITY = "gravity"; +DLLSPEC daeString COLLADA_ELEMENT_TIME_STEP = "time_step"; +DLLSPEC daeString COLLADA_ELEMENT_REF_ATTACHMENT = "ref_attachment"; +DLLSPEC daeString COLLADA_ELEMENT_ATTACHMENT = "attachment"; +DLLSPEC daeString COLLADA_ELEMENT_ENABLED = "enabled"; +DLLSPEC daeString COLLADA_ELEMENT_INTERPENETRATE = "interpenetrate"; +DLLSPEC daeString COLLADA_ELEMENT_LIMITS = "limits"; +DLLSPEC daeString COLLADA_ELEMENT_SPRING = "spring"; +DLLSPEC daeString COLLADA_ELEMENT_SWING_CONE_AND_TWIST = "swing_cone_and_twist"; +DLLSPEC daeString COLLADA_ELEMENT_LINEAR = "linear"; +DLLSPEC daeString COLLADA_ELEMENT_MIN = "min"; +DLLSPEC daeString COLLADA_ELEMENT_MAX = "max"; +DLLSPEC daeString COLLADA_ELEMENT_ANGULAR = "angular"; +DLLSPEC daeString COLLADA_ELEMENT_STIFFNESS = "stiffness"; +DLLSPEC daeString COLLADA_ELEMENT_DAMPING = "damping"; +DLLSPEC daeString COLLADA_ELEMENT_TARGET_VALUE = "target_value"; +DLLSPEC daeString COLLADA_ELEMENT_RIGID_BODY = "rigid_body"; +DLLSPEC daeString COLLADA_ELEMENT_RIGID_CONSTRAINT = "rigid_constraint"; diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domController.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domController.cpp new file mode 100644 index 00000000..a8dcd23d --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domController.cpp @@ -0,0 +1,113 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domController::create(daeInt bytes) +{ + domControllerRef ref = new(bytes) domController; + return ref; +} + + +daeMetaElement * +domController::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "controller" ); + _Meta->registerClass(domController::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 0, 1 ); + mea->setName( "asset" ); + mea->setOffset( daeOffsetOf(domController,elemAsset) ); + mea->setElementType( domAsset::registerElement() ); + cm->appendChild( mea ); + + cm = new daeMetaChoice( _Meta, cm, 1, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "skin" ); + mea->setOffset( daeOffsetOf(domController,elemSkin) ); + mea->setElementType( domSkin::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "morph" ); + mea->setOffset( daeOffsetOf(domController,elemMorph) ); + mea->setElementType( domMorph::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + cm->getParent()->appendChild( cm ); + cm = cm->getParent(); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 2, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domController,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 2 ); + _Meta->setCMRoot( cm ); + // Ordered list of sub-elements + _Meta->addContents(daeOffsetOf(domController,_contents)); + _Meta->addContentsOrder(daeOffsetOf(domController,_contentsOrder)); + + + // Add attribute: id + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "id" ); + ma->setType( daeAtomicType::get("xsID")); + ma->setOffset( daeOffsetOf( domController , attrId )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: name + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "name" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domController , attrName )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domController)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domController::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domConvex_mesh.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domConvex_mesh.cpp new file mode 100644 index 00000000..27f640fc --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domConvex_mesh.cpp @@ -0,0 +1,139 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domConvex_mesh::create(daeInt bytes) +{ + domConvex_meshRef ref = new(bytes) domConvex_mesh; + ref->attrConvex_hull_of.setContainer( (domConvex_mesh*)ref ); + return ref; +} + + +daeMetaElement * +domConvex_mesh::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "convex_mesh" ); + _Meta->registerClass(domConvex_mesh::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 0, 1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, -1 ); + mea->setName( "source" ); + mea->setOffset( daeOffsetOf(domConvex_mesh,elemSource_array) ); + mea->setElementType( domSource::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 1, 1 ); + mea->setName( "vertices" ); + mea->setOffset( daeOffsetOf(domConvex_mesh,elemVertices) ); + mea->setElementType( domVertices::registerElement() ); + cm->appendChild( mea ); + + cm = new daeMetaChoice( _Meta, cm, 2, 0, -1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "lines" ); + mea->setOffset( daeOffsetOf(domConvex_mesh,elemLines_array) ); + mea->setElementType( domLines::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "linestrips" ); + mea->setOffset( daeOffsetOf(domConvex_mesh,elemLinestrips_array) ); + mea->setElementType( domLinestrips::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "polygons" ); + mea->setOffset( daeOffsetOf(domConvex_mesh,elemPolygons_array) ); + mea->setElementType( domPolygons::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "polylist" ); + mea->setOffset( daeOffsetOf(domConvex_mesh,elemPolylist_array) ); + mea->setElementType( domPolylist::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "triangles" ); + mea->setOffset( daeOffsetOf(domConvex_mesh,elemTriangles_array) ); + mea->setElementType( domTriangles::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "trifans" ); + mea->setOffset( daeOffsetOf(domConvex_mesh,elemTrifans_array) ); + mea->setElementType( domTrifans::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "tristrips" ); + mea->setOffset( daeOffsetOf(domConvex_mesh,elemTristrips_array) ); + mea->setElementType( domTristrips::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + cm->getParent()->appendChild( cm ); + cm = cm->getParent(); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 3003, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domConvex_mesh,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 3003 ); + _Meta->setCMRoot( cm ); + // Ordered list of sub-elements + _Meta->addContents(daeOffsetOf(domConvex_mesh,_contents)); + _Meta->addContentsOrder(daeOffsetOf(domConvex_mesh,_contentsOrder)); + + + // Add attribute: convex_hull_of + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "convex_hull_of" ); + ma->setType( daeAtomicType::get("xsAnyURI")); + ma->setOffset( daeOffsetOf( domConvex_mesh , attrConvex_hull_of )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domConvex_mesh)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domConvex_mesh::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCylinder.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCylinder.cpp new file mode 100644 index 00000000..c58c3489 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domCylinder.cpp @@ -0,0 +1,147 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domCylinder::create(daeInt bytes) +{ + domCylinderRef ref = new(bytes) domCylinder; + return ref; +} + + +daeMetaElement * +domCylinder::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "cylinder" ); + _Meta->registerClass(domCylinder::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "height" ); + mea->setOffset( daeOffsetOf(domCylinder,elemHeight) ); + mea->setElementType( domCylinder::domHeight::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 1, 1 ); + mea->setName( "radius" ); + mea->setOffset( daeOffsetOf(domCylinder,elemRadius) ); + mea->setElementType( domCylinder::domRadius::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 2, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domCylinder,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 2 ); + _Meta->setCMRoot( cm ); + + + _Meta->setElementSize(sizeof(domCylinder)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCylinder::domHeight::create(daeInt bytes) +{ + domCylinder::domHeightRef ref = new(bytes) domCylinder::domHeight; + return ref; +} + + +daeMetaElement * +domCylinder::domHeight::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "height" ); + _Meta->registerClass(domCylinder::domHeight::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Float")); + ma->setOffset( daeOffsetOf( domCylinder::domHeight , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCylinder::domHeight)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domCylinder::domRadius::create(daeInt bytes) +{ + domCylinder::domRadiusRef ref = new(bytes) domCylinder::domRadius; + return ref; +} + + +daeMetaElement * +domCylinder::domRadius::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "radius" ); + _Meta->registerClass(domCylinder::domRadius::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Float2")); + ma->setOffset( daeOffsetOf( domCylinder::domRadius , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domCylinder::domRadius)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domCylinder::_Meta = NULL; +daeMetaElement * domCylinder::domHeight::_Meta = NULL; +daeMetaElement * domCylinder::domRadius::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domEffect.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domEffect.cpp new file mode 100644 index 00000000..87fa06f8 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domEffect.cpp @@ -0,0 +1,152 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domEffect::create(daeInt bytes) +{ + domEffectRef ref = new(bytes) domEffect; + return ref; +} + +#include +#include +#include +#include + +daeMetaElement * +domEffect::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "effect" ); + _Meta->registerClass(domEffect::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 0, 1 ); + mea->setName( "asset" ); + mea->setOffset( daeOffsetOf(domEffect,elemAsset) ); + mea->setElementType( domAsset::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 1, 0, -1 ); + mea->setName( "annotate" ); + mea->setOffset( daeOffsetOf(domEffect,elemAnnotate_array) ); + mea->setElementType( domFx_annotate_common::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 2, 0, -1 ); + mea->setName( "image" ); + mea->setOffset( daeOffsetOf(domEffect,elemImage_array) ); + mea->setElementType( domImage::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 3, 0, -1 ); + mea->setName( "newparam" ); + mea->setOffset( daeOffsetOf(domEffect,elemNewparam_array) ); + mea->setElementType( domFx_newparam_common::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 4, 1, -1 ); + mea->setName( "fx_profile_abstract" ); + mea->setOffset( daeOffsetOf(domEffect,elemFx_profile_abstract_array) ); + mea->setElementType( domFx_profile_abstract::registerElement() ); + cm->appendChild( mea ); + + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 4, 1, -1 ); + mea->setName( "profile_GLSL" ); + mea->setOffset( daeOffsetOf(domEffect,elemFx_profile_abstract_array) ); + mea->setElementType( domProfile_GLSL::registerElement() ); + cm->appendChild( mea ); + + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 4, 1, -1 ); + mea->setName( "profile_COMMON" ); + mea->setOffset( daeOffsetOf(domEffect,elemFx_profile_abstract_array) ); + mea->setElementType( domProfile_COMMON::registerElement() ); + cm->appendChild( mea ); + + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 4, 1, -1 ); + mea->setName( "profile_CG" ); + mea->setOffset( daeOffsetOf(domEffect,elemFx_profile_abstract_array) ); + mea->setElementType( domProfile_CG::registerElement() ); + cm->appendChild( mea ); + + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 4, 1, -1 ); + mea->setName( "profile_GLES" ); + mea->setOffset( daeOffsetOf(domEffect,elemFx_profile_abstract_array) ); + mea->setElementType( domProfile_GLES::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 5, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domEffect,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 5 ); + _Meta->setCMRoot( cm ); + // Ordered list of sub-elements + _Meta->addContents(daeOffsetOf(domEffect,_contents)); + _Meta->addContentsOrder(daeOffsetOf(domEffect,_contentsOrder)); + + + // Add attribute: id + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "id" ); + ma->setType( daeAtomicType::get("xsID")); + ma->setOffset( daeOffsetOf( domEffect , attrId )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: name + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "name" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domEffect , attrName )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domEffect)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domEffect::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domEllipsoid.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domEllipsoid.cpp new file mode 100644 index 00000000..da6cfc1e --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domEllipsoid.cpp @@ -0,0 +1,99 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domEllipsoid::create(daeInt bytes) +{ + domEllipsoidRef ref = new(bytes) domEllipsoid; + return ref; +} + + +daeMetaElement * +domEllipsoid::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "ellipsoid" ); + _Meta->registerClass(domEllipsoid::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "size" ); + mea->setOffset( daeOffsetOf(domEllipsoid,elemSize) ); + mea->setElementType( domEllipsoid::domSize::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + _Meta->setCMRoot( cm ); + + + _Meta->setElementSize(sizeof(domEllipsoid)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domEllipsoid::domSize::create(daeInt bytes) +{ + domEllipsoid::domSizeRef ref = new(bytes) domEllipsoid::domSize; + return ref; +} + + +daeMetaElement * +domEllipsoid::domSize::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "size" ); + _Meta->registerClass(domEllipsoid::domSize::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Float3")); + ma->setOffset( daeOffsetOf( domEllipsoid::domSize , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domEllipsoid::domSize)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domEllipsoid::_Meta = NULL; +daeMetaElement * domEllipsoid::domSize::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domExtra.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domExtra.cpp new file mode 100644 index 00000000..fddd82db --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domExtra.cpp @@ -0,0 +1,102 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domExtra::create(daeInt bytes) +{ + domExtraRef ref = new(bytes) domExtra; + return ref; +} + + +daeMetaElement * +domExtra::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "extra" ); + _Meta->registerClass(domExtra::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 0, 1 ); + mea->setName( "asset" ); + mea->setOffset( daeOffsetOf(domExtra,elemAsset) ); + mea->setElementType( domAsset::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 1, 1, -1 ); + mea->setName( "technique" ); + mea->setOffset( daeOffsetOf(domExtra,elemTechnique_array) ); + mea->setElementType( domTechnique::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 1 ); + _Meta->setCMRoot( cm ); + + // Add attribute: id + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "id" ); + ma->setType( daeAtomicType::get("xsID")); + ma->setOffset( daeOffsetOf( domExtra , attrId )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: name + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "name" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domExtra , attrName )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: type + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "type" ); + ma->setType( daeAtomicType::get("xsNMTOKEN")); + ma->setOffset( daeOffsetOf( domExtra , attrType )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domExtra)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domExtra::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFloat_array.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFloat_array.cpp new file mode 100644 index 00000000..c1b8079f --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFloat_array.cpp @@ -0,0 +1,118 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domFloat_array::create(daeInt bytes) +{ + domFloat_arrayRef ref = new(bytes) domFloat_array; + return ref; +} + + +daeMetaElement * +domFloat_array::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "float_array" ); + _Meta->registerClass(domFloat_array::create, &_Meta); + + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("ListOfFloats")); + ma->setOffset( daeOffsetOf( domFloat_array , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + // Add attribute: id + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "id" ); + ma->setType( daeAtomicType::get("xsID")); + ma->setOffset( daeOffsetOf( domFloat_array , attrId )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: name + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "name" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domFloat_array , attrName )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: count + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "count" ); + ma->setType( daeAtomicType::get("Uint")); + ma->setOffset( daeOffsetOf( domFloat_array , attrCount )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: digits + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "digits" ); + ma->setType( daeAtomicType::get("xsShort")); + ma->setOffset( daeOffsetOf( domFloat_array , attrDigits )); + ma->setContainer( _Meta ); + ma->setDefault( "6"); + + _Meta->appendAttribute(ma); + } + + // Add attribute: magnitude + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "magnitude" ); + ma->setType( daeAtomicType::get("xsShort")); + ma->setOffset( daeOffsetOf( domFloat_array , attrMagnitude )); + ma->setContainer( _Meta ); + ma->setDefault( "38"); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFloat_array)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domFloat_array::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domForce_field.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domForce_field.cpp new file mode 100644 index 00000000..1d04374f --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domForce_field.cpp @@ -0,0 +1,97 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domForce_field::create(daeInt bytes) +{ + domForce_fieldRef ref = new(bytes) domForce_field; + return ref; +} + + +daeMetaElement * +domForce_field::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "force_field" ); + _Meta->registerClass(domForce_field::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 0, 1 ); + mea->setName( "asset" ); + mea->setOffset( daeOffsetOf(domForce_field,elemAsset) ); + mea->setElementType( domAsset::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 1, 1, -1 ); + mea->setName( "technique" ); + mea->setOffset( daeOffsetOf(domForce_field,elemTechnique_array) ); + mea->setElementType( domTechnique::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 2, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domForce_field,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 2 ); + _Meta->setCMRoot( cm ); + + // Add attribute: id + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "id" ); + ma->setType( daeAtomicType::get("xsID")); + ma->setOffset( daeOffsetOf( domForce_field , attrId )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: name + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "name" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domForce_field , attrName )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domForce_field)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domForce_field::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_annotate_common.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_annotate_common.cpp new file mode 100644 index 00000000..e9cbb672 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_annotate_common.cpp @@ -0,0 +1,75 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domFx_annotate_common::create(daeInt bytes) +{ + domFx_annotate_commonRef ref = new(bytes) domFx_annotate_common; + return ref; +} + + +daeMetaElement * +domFx_annotate_common::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "fx_annotate_common" ); + _Meta->registerClass(domFx_annotate_common::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "fx_annotate_type_common" ); + mea->setOffset( daeOffsetOf(domFx_annotate_common,elemFx_annotate_type_common) ); + mea->setElementType( domFx_annotate_type_common::registerElement() ); + cm->appendChild( new daeMetaGroup( mea, _Meta, cm, 0, 1, 1 ) ); + + cm->setMaxOrdinal( 0 ); + _Meta->setCMRoot( cm ); + + // Add attribute: name + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "name" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domFx_annotate_common , attrName )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_annotate_common)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domFx_annotate_common::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_annotate_type_common.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_annotate_type_common.cpp new file mode 100644 index 00000000..1fc62e5f --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_annotate_type_common.cpp @@ -0,0 +1,734 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domFx_annotate_type_common::create(daeInt bytes) +{ + domFx_annotate_type_commonRef ref = new(bytes) domFx_annotate_type_common; + return ref; +} + + +daeMetaElement * +domFx_annotate_type_common::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "fx_annotate_type_common" ); + _Meta->registerClass(domFx_annotate_type_common::create, &_Meta); + + _Meta->setIsTransparent( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaChoice( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "bool" ); + mea->setOffset( daeOffsetOf(domFx_annotate_type_common,elemBool) ); + mea->setElementType( domFx_annotate_type_common::domBool::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "bool2" ); + mea->setOffset( daeOffsetOf(domFx_annotate_type_common,elemBool2) ); + mea->setElementType( domFx_annotate_type_common::domBool2::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "bool3" ); + mea->setOffset( daeOffsetOf(domFx_annotate_type_common,elemBool3) ); + mea->setElementType( domFx_annotate_type_common::domBool3::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "bool4" ); + mea->setOffset( daeOffsetOf(domFx_annotate_type_common,elemBool4) ); + mea->setElementType( domFx_annotate_type_common::domBool4::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "int" ); + mea->setOffset( daeOffsetOf(domFx_annotate_type_common,elemInt) ); + mea->setElementType( domFx_annotate_type_common::domInt::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "int2" ); + mea->setOffset( daeOffsetOf(domFx_annotate_type_common,elemInt2) ); + mea->setElementType( domFx_annotate_type_common::domInt2::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "int3" ); + mea->setOffset( daeOffsetOf(domFx_annotate_type_common,elemInt3) ); + mea->setElementType( domFx_annotate_type_common::domInt3::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "int4" ); + mea->setOffset( daeOffsetOf(domFx_annotate_type_common,elemInt4) ); + mea->setElementType( domFx_annotate_type_common::domInt4::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "float" ); + mea->setOffset( daeOffsetOf(domFx_annotate_type_common,elemFloat) ); + mea->setElementType( domFx_annotate_type_common::domFloat::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "float2" ); + mea->setOffset( daeOffsetOf(domFx_annotate_type_common,elemFloat2) ); + mea->setElementType( domFx_annotate_type_common::domFloat2::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "float3" ); + mea->setOffset( daeOffsetOf(domFx_annotate_type_common,elemFloat3) ); + mea->setElementType( domFx_annotate_type_common::domFloat3::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "float4" ); + mea->setOffset( daeOffsetOf(domFx_annotate_type_common,elemFloat4) ); + mea->setElementType( domFx_annotate_type_common::domFloat4::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "float2x2" ); + mea->setOffset( daeOffsetOf(domFx_annotate_type_common,elemFloat2x2) ); + mea->setElementType( domFx_annotate_type_common::domFloat2x2::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "float3x3" ); + mea->setOffset( daeOffsetOf(domFx_annotate_type_common,elemFloat3x3) ); + mea->setElementType( domFx_annotate_type_common::domFloat3x3::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "float4x4" ); + mea->setOffset( daeOffsetOf(domFx_annotate_type_common,elemFloat4x4) ); + mea->setElementType( domFx_annotate_type_common::domFloat4x4::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "string" ); + mea->setOffset( daeOffsetOf(domFx_annotate_type_common,elemString) ); + mea->setElementType( domFx_annotate_type_common::domString::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + _Meta->setCMRoot( cm ); + // Ordered list of sub-elements + _Meta->addContents(daeOffsetOf(domFx_annotate_type_common,_contents)); + _Meta->addContentsOrder(daeOffsetOf(domFx_annotate_type_common,_contentsOrder)); + + + + _Meta->setElementSize(sizeof(domFx_annotate_type_common)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_annotate_type_common::domBool::create(daeInt bytes) +{ + domFx_annotate_type_common::domBoolRef ref = new(bytes) domFx_annotate_type_common::domBool; + return ref; +} + + +daeMetaElement * +domFx_annotate_type_common::domBool::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "bool" ); + _Meta->registerClass(domFx_annotate_type_common::domBool::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Bool")); + ma->setOffset( daeOffsetOf( domFx_annotate_type_common::domBool , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_annotate_type_common::domBool)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_annotate_type_common::domBool2::create(daeInt bytes) +{ + domFx_annotate_type_common::domBool2Ref ref = new(bytes) domFx_annotate_type_common::domBool2; + return ref; +} + + +daeMetaElement * +domFx_annotate_type_common::domBool2::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "bool2" ); + _Meta->registerClass(domFx_annotate_type_common::domBool2::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Bool2")); + ma->setOffset( daeOffsetOf( domFx_annotate_type_common::domBool2 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_annotate_type_common::domBool2)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_annotate_type_common::domBool3::create(daeInt bytes) +{ + domFx_annotate_type_common::domBool3Ref ref = new(bytes) domFx_annotate_type_common::domBool3; + return ref; +} + + +daeMetaElement * +domFx_annotate_type_common::domBool3::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "bool3" ); + _Meta->registerClass(domFx_annotate_type_common::domBool3::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Bool3")); + ma->setOffset( daeOffsetOf( domFx_annotate_type_common::domBool3 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_annotate_type_common::domBool3)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_annotate_type_common::domBool4::create(daeInt bytes) +{ + domFx_annotate_type_common::domBool4Ref ref = new(bytes) domFx_annotate_type_common::domBool4; + return ref; +} + + +daeMetaElement * +domFx_annotate_type_common::domBool4::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "bool4" ); + _Meta->registerClass(domFx_annotate_type_common::domBool4::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Bool4")); + ma->setOffset( daeOffsetOf( domFx_annotate_type_common::domBool4 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_annotate_type_common::domBool4)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_annotate_type_common::domInt::create(daeInt bytes) +{ + domFx_annotate_type_common::domIntRef ref = new(bytes) domFx_annotate_type_common::domInt; + return ref; +} + + +daeMetaElement * +domFx_annotate_type_common::domInt::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "int" ); + _Meta->registerClass(domFx_annotate_type_common::domInt::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Int")); + ma->setOffset( daeOffsetOf( domFx_annotate_type_common::domInt , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_annotate_type_common::domInt)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_annotate_type_common::domInt2::create(daeInt bytes) +{ + domFx_annotate_type_common::domInt2Ref ref = new(bytes) domFx_annotate_type_common::domInt2; + return ref; +} + + +daeMetaElement * +domFx_annotate_type_common::domInt2::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "int2" ); + _Meta->registerClass(domFx_annotate_type_common::domInt2::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Int2")); + ma->setOffset( daeOffsetOf( domFx_annotate_type_common::domInt2 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_annotate_type_common::domInt2)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_annotate_type_common::domInt3::create(daeInt bytes) +{ + domFx_annotate_type_common::domInt3Ref ref = new(bytes) domFx_annotate_type_common::domInt3; + return ref; +} + + +daeMetaElement * +domFx_annotate_type_common::domInt3::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "int3" ); + _Meta->registerClass(domFx_annotate_type_common::domInt3::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Int3")); + ma->setOffset( daeOffsetOf( domFx_annotate_type_common::domInt3 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_annotate_type_common::domInt3)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_annotate_type_common::domInt4::create(daeInt bytes) +{ + domFx_annotate_type_common::domInt4Ref ref = new(bytes) domFx_annotate_type_common::domInt4; + return ref; +} + + +daeMetaElement * +domFx_annotate_type_common::domInt4::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "int4" ); + _Meta->registerClass(domFx_annotate_type_common::domInt4::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Int4")); + ma->setOffset( daeOffsetOf( domFx_annotate_type_common::domInt4 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_annotate_type_common::domInt4)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_annotate_type_common::domFloat::create(daeInt bytes) +{ + domFx_annotate_type_common::domFloatRef ref = new(bytes) domFx_annotate_type_common::domFloat; + return ref; +} + + +daeMetaElement * +domFx_annotate_type_common::domFloat::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "float" ); + _Meta->registerClass(domFx_annotate_type_common::domFloat::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Float")); + ma->setOffset( daeOffsetOf( domFx_annotate_type_common::domFloat , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_annotate_type_common::domFloat)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_annotate_type_common::domFloat2::create(daeInt bytes) +{ + domFx_annotate_type_common::domFloat2Ref ref = new(bytes) domFx_annotate_type_common::domFloat2; + return ref; +} + + +daeMetaElement * +domFx_annotate_type_common::domFloat2::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "float2" ); + _Meta->registerClass(domFx_annotate_type_common::domFloat2::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Float2")); + ma->setOffset( daeOffsetOf( domFx_annotate_type_common::domFloat2 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_annotate_type_common::domFloat2)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_annotate_type_common::domFloat3::create(daeInt bytes) +{ + domFx_annotate_type_common::domFloat3Ref ref = new(bytes) domFx_annotate_type_common::domFloat3; + return ref; +} + + +daeMetaElement * +domFx_annotate_type_common::domFloat3::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "float3" ); + _Meta->registerClass(domFx_annotate_type_common::domFloat3::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Float3")); + ma->setOffset( daeOffsetOf( domFx_annotate_type_common::domFloat3 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_annotate_type_common::domFloat3)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_annotate_type_common::domFloat4::create(daeInt bytes) +{ + domFx_annotate_type_common::domFloat4Ref ref = new(bytes) domFx_annotate_type_common::domFloat4; + return ref; +} + + +daeMetaElement * +domFx_annotate_type_common::domFloat4::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "float4" ); + _Meta->registerClass(domFx_annotate_type_common::domFloat4::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Float4")); + ma->setOffset( daeOffsetOf( domFx_annotate_type_common::domFloat4 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_annotate_type_common::domFloat4)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_annotate_type_common::domFloat2x2::create(daeInt bytes) +{ + domFx_annotate_type_common::domFloat2x2Ref ref = new(bytes) domFx_annotate_type_common::domFloat2x2; + return ref; +} + + +daeMetaElement * +domFx_annotate_type_common::domFloat2x2::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "float2x2" ); + _Meta->registerClass(domFx_annotate_type_common::domFloat2x2::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Float2x2")); + ma->setOffset( daeOffsetOf( domFx_annotate_type_common::domFloat2x2 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_annotate_type_common::domFloat2x2)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_annotate_type_common::domFloat3x3::create(daeInt bytes) +{ + domFx_annotate_type_common::domFloat3x3Ref ref = new(bytes) domFx_annotate_type_common::domFloat3x3; + return ref; +} + + +daeMetaElement * +domFx_annotate_type_common::domFloat3x3::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "float3x3" ); + _Meta->registerClass(domFx_annotate_type_common::domFloat3x3::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Float3x3")); + ma->setOffset( daeOffsetOf( domFx_annotate_type_common::domFloat3x3 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_annotate_type_common::domFloat3x3)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_annotate_type_common::domFloat4x4::create(daeInt bytes) +{ + domFx_annotate_type_common::domFloat4x4Ref ref = new(bytes) domFx_annotate_type_common::domFloat4x4; + return ref; +} + + +daeMetaElement * +domFx_annotate_type_common::domFloat4x4::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "float4x4" ); + _Meta->registerClass(domFx_annotate_type_common::domFloat4x4::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Float4x4")); + ma->setOffset( daeOffsetOf( domFx_annotate_type_common::domFloat4x4 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_annotate_type_common::domFloat4x4)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_annotate_type_common::domString::create(daeInt bytes) +{ + domFx_annotate_type_common::domStringRef ref = new(bytes) domFx_annotate_type_common::domString; + return ref; +} + + +daeMetaElement * +domFx_annotate_type_common::domString::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "string" ); + _Meta->registerClass(domFx_annotate_type_common::domString::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("xsString")); + ma->setOffset( daeOffsetOf( domFx_annotate_type_common::domString , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_annotate_type_common::domString)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domFx_annotate_type_common::_Meta = NULL; +daeMetaElement * domFx_annotate_type_common::domBool::_Meta = NULL; +daeMetaElement * domFx_annotate_type_common::domBool2::_Meta = NULL; +daeMetaElement * domFx_annotate_type_common::domBool3::_Meta = NULL; +daeMetaElement * domFx_annotate_type_common::domBool4::_Meta = NULL; +daeMetaElement * domFx_annotate_type_common::domInt::_Meta = NULL; +daeMetaElement * domFx_annotate_type_common::domInt2::_Meta = NULL; +daeMetaElement * domFx_annotate_type_common::domInt3::_Meta = NULL; +daeMetaElement * domFx_annotate_type_common::domInt4::_Meta = NULL; +daeMetaElement * domFx_annotate_type_common::domFloat::_Meta = NULL; +daeMetaElement * domFx_annotate_type_common::domFloat2::_Meta = NULL; +daeMetaElement * domFx_annotate_type_common::domFloat3::_Meta = NULL; +daeMetaElement * domFx_annotate_type_common::domFloat4::_Meta = NULL; +daeMetaElement * domFx_annotate_type_common::domFloat2x2::_Meta = NULL; +daeMetaElement * domFx_annotate_type_common::domFloat3x3::_Meta = NULL; +daeMetaElement * domFx_annotate_type_common::domFloat4x4::_Meta = NULL; +daeMetaElement * domFx_annotate_type_common::domString::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_basic_type_common.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_basic_type_common.cpp new file mode 100644 index 00000000..b769e1d2 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_basic_type_common.cpp @@ -0,0 +1,1322 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domFx_basic_type_common::create(daeInt bytes) +{ + domFx_basic_type_commonRef ref = new(bytes) domFx_basic_type_common; + return ref; +} + + +daeMetaElement * +domFx_basic_type_common::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "fx_basic_type_common" ); + _Meta->registerClass(domFx_basic_type_common::create, &_Meta); + + _Meta->setIsTransparent( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaChoice( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "bool" ); + mea->setOffset( daeOffsetOf(domFx_basic_type_common,elemBool) ); + mea->setElementType( domFx_basic_type_common::domBool::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "bool2" ); + mea->setOffset( daeOffsetOf(domFx_basic_type_common,elemBool2) ); + mea->setElementType( domFx_basic_type_common::domBool2::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "bool3" ); + mea->setOffset( daeOffsetOf(domFx_basic_type_common,elemBool3) ); + mea->setElementType( domFx_basic_type_common::domBool3::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "bool4" ); + mea->setOffset( daeOffsetOf(domFx_basic_type_common,elemBool4) ); + mea->setElementType( domFx_basic_type_common::domBool4::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "int" ); + mea->setOffset( daeOffsetOf(domFx_basic_type_common,elemInt) ); + mea->setElementType( domFx_basic_type_common::domInt::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "int2" ); + mea->setOffset( daeOffsetOf(domFx_basic_type_common,elemInt2) ); + mea->setElementType( domFx_basic_type_common::domInt2::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "int3" ); + mea->setOffset( daeOffsetOf(domFx_basic_type_common,elemInt3) ); + mea->setElementType( domFx_basic_type_common::domInt3::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "int4" ); + mea->setOffset( daeOffsetOf(domFx_basic_type_common,elemInt4) ); + mea->setElementType( domFx_basic_type_common::domInt4::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "float" ); + mea->setOffset( daeOffsetOf(domFx_basic_type_common,elemFloat) ); + mea->setElementType( domFx_basic_type_common::domFloat::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "float2" ); + mea->setOffset( daeOffsetOf(domFx_basic_type_common,elemFloat2) ); + mea->setElementType( domFx_basic_type_common::domFloat2::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "float3" ); + mea->setOffset( daeOffsetOf(domFx_basic_type_common,elemFloat3) ); + mea->setElementType( domFx_basic_type_common::domFloat3::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "float4" ); + mea->setOffset( daeOffsetOf(domFx_basic_type_common,elemFloat4) ); + mea->setElementType( domFx_basic_type_common::domFloat4::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "float1x1" ); + mea->setOffset( daeOffsetOf(domFx_basic_type_common,elemFloat1x1) ); + mea->setElementType( domFx_basic_type_common::domFloat1x1::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "float1x2" ); + mea->setOffset( daeOffsetOf(domFx_basic_type_common,elemFloat1x2) ); + mea->setElementType( domFx_basic_type_common::domFloat1x2::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "float1x3" ); + mea->setOffset( daeOffsetOf(domFx_basic_type_common,elemFloat1x3) ); + mea->setElementType( domFx_basic_type_common::domFloat1x3::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "float1x4" ); + mea->setOffset( daeOffsetOf(domFx_basic_type_common,elemFloat1x4) ); + mea->setElementType( domFx_basic_type_common::domFloat1x4::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "float2x1" ); + mea->setOffset( daeOffsetOf(domFx_basic_type_common,elemFloat2x1) ); + mea->setElementType( domFx_basic_type_common::domFloat2x1::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "float2x2" ); + mea->setOffset( daeOffsetOf(domFx_basic_type_common,elemFloat2x2) ); + mea->setElementType( domFx_basic_type_common::domFloat2x2::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "float2x3" ); + mea->setOffset( daeOffsetOf(domFx_basic_type_common,elemFloat2x3) ); + mea->setElementType( domFx_basic_type_common::domFloat2x3::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "float2x4" ); + mea->setOffset( daeOffsetOf(domFx_basic_type_common,elemFloat2x4) ); + mea->setElementType( domFx_basic_type_common::domFloat2x4::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "float3x1" ); + mea->setOffset( daeOffsetOf(domFx_basic_type_common,elemFloat3x1) ); + mea->setElementType( domFx_basic_type_common::domFloat3x1::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "float3x2" ); + mea->setOffset( daeOffsetOf(domFx_basic_type_common,elemFloat3x2) ); + mea->setElementType( domFx_basic_type_common::domFloat3x2::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "float3x3" ); + mea->setOffset( daeOffsetOf(domFx_basic_type_common,elemFloat3x3) ); + mea->setElementType( domFx_basic_type_common::domFloat3x3::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "float3x4" ); + mea->setOffset( daeOffsetOf(domFx_basic_type_common,elemFloat3x4) ); + mea->setElementType( domFx_basic_type_common::domFloat3x4::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "float4x1" ); + mea->setOffset( daeOffsetOf(domFx_basic_type_common,elemFloat4x1) ); + mea->setElementType( domFx_basic_type_common::domFloat4x1::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "float4x2" ); + mea->setOffset( daeOffsetOf(domFx_basic_type_common,elemFloat4x2) ); + mea->setElementType( domFx_basic_type_common::domFloat4x2::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "float4x3" ); + mea->setOffset( daeOffsetOf(domFx_basic_type_common,elemFloat4x3) ); + mea->setElementType( domFx_basic_type_common::domFloat4x3::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "float4x4" ); + mea->setOffset( daeOffsetOf(domFx_basic_type_common,elemFloat4x4) ); + mea->setElementType( domFx_basic_type_common::domFloat4x4::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "surface" ); + mea->setOffset( daeOffsetOf(domFx_basic_type_common,elemSurface) ); + mea->setElementType( domFx_surface_common::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "sampler1D" ); + mea->setOffset( daeOffsetOf(domFx_basic_type_common,elemSampler1D) ); + mea->setElementType( domFx_sampler1D_common::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "sampler2D" ); + mea->setOffset( daeOffsetOf(domFx_basic_type_common,elemSampler2D) ); + mea->setElementType( domFx_sampler2D_common::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "sampler3D" ); + mea->setOffset( daeOffsetOf(domFx_basic_type_common,elemSampler3D) ); + mea->setElementType( domFx_sampler3D_common::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "samplerCUBE" ); + mea->setOffset( daeOffsetOf(domFx_basic_type_common,elemSamplerCUBE) ); + mea->setElementType( domFx_samplerCUBE_common::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "samplerRECT" ); + mea->setOffset( daeOffsetOf(domFx_basic_type_common,elemSamplerRECT) ); + mea->setElementType( domFx_samplerRECT_common::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "samplerDEPTH" ); + mea->setOffset( daeOffsetOf(domFx_basic_type_common,elemSamplerDEPTH) ); + mea->setElementType( domFx_samplerDEPTH_common::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "enum" ); + mea->setOffset( daeOffsetOf(domFx_basic_type_common,elemEnum) ); + mea->setElementType( domFx_basic_type_common::domEnum::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + _Meta->setCMRoot( cm ); + // Ordered list of sub-elements + _Meta->addContents(daeOffsetOf(domFx_basic_type_common,_contents)); + _Meta->addContentsOrder(daeOffsetOf(domFx_basic_type_common,_contentsOrder)); + + + + _Meta->setElementSize(sizeof(domFx_basic_type_common)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_basic_type_common::domBool::create(daeInt bytes) +{ + domFx_basic_type_common::domBoolRef ref = new(bytes) domFx_basic_type_common::domBool; + return ref; +} + + +daeMetaElement * +domFx_basic_type_common::domBool::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "bool" ); + _Meta->registerClass(domFx_basic_type_common::domBool::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Bool")); + ma->setOffset( daeOffsetOf( domFx_basic_type_common::domBool , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_basic_type_common::domBool)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_basic_type_common::domBool2::create(daeInt bytes) +{ + domFx_basic_type_common::domBool2Ref ref = new(bytes) domFx_basic_type_common::domBool2; + return ref; +} + + +daeMetaElement * +domFx_basic_type_common::domBool2::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "bool2" ); + _Meta->registerClass(domFx_basic_type_common::domBool2::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Bool2")); + ma->setOffset( daeOffsetOf( domFx_basic_type_common::domBool2 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_basic_type_common::domBool2)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_basic_type_common::domBool3::create(daeInt bytes) +{ + domFx_basic_type_common::domBool3Ref ref = new(bytes) domFx_basic_type_common::domBool3; + return ref; +} + + +daeMetaElement * +domFx_basic_type_common::domBool3::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "bool3" ); + _Meta->registerClass(domFx_basic_type_common::domBool3::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Bool3")); + ma->setOffset( daeOffsetOf( domFx_basic_type_common::domBool3 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_basic_type_common::domBool3)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_basic_type_common::domBool4::create(daeInt bytes) +{ + domFx_basic_type_common::domBool4Ref ref = new(bytes) domFx_basic_type_common::domBool4; + return ref; +} + + +daeMetaElement * +domFx_basic_type_common::domBool4::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "bool4" ); + _Meta->registerClass(domFx_basic_type_common::domBool4::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Bool4")); + ma->setOffset( daeOffsetOf( domFx_basic_type_common::domBool4 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_basic_type_common::domBool4)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_basic_type_common::domInt::create(daeInt bytes) +{ + domFx_basic_type_common::domIntRef ref = new(bytes) domFx_basic_type_common::domInt; + return ref; +} + + +daeMetaElement * +domFx_basic_type_common::domInt::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "int" ); + _Meta->registerClass(domFx_basic_type_common::domInt::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Int")); + ma->setOffset( daeOffsetOf( domFx_basic_type_common::domInt , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_basic_type_common::domInt)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_basic_type_common::domInt2::create(daeInt bytes) +{ + domFx_basic_type_common::domInt2Ref ref = new(bytes) domFx_basic_type_common::domInt2; + return ref; +} + + +daeMetaElement * +domFx_basic_type_common::domInt2::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "int2" ); + _Meta->registerClass(domFx_basic_type_common::domInt2::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Int2")); + ma->setOffset( daeOffsetOf( domFx_basic_type_common::domInt2 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_basic_type_common::domInt2)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_basic_type_common::domInt3::create(daeInt bytes) +{ + domFx_basic_type_common::domInt3Ref ref = new(bytes) domFx_basic_type_common::domInt3; + return ref; +} + + +daeMetaElement * +domFx_basic_type_common::domInt3::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "int3" ); + _Meta->registerClass(domFx_basic_type_common::domInt3::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Int3")); + ma->setOffset( daeOffsetOf( domFx_basic_type_common::domInt3 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_basic_type_common::domInt3)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_basic_type_common::domInt4::create(daeInt bytes) +{ + domFx_basic_type_common::domInt4Ref ref = new(bytes) domFx_basic_type_common::domInt4; + return ref; +} + + +daeMetaElement * +domFx_basic_type_common::domInt4::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "int4" ); + _Meta->registerClass(domFx_basic_type_common::domInt4::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Int4")); + ma->setOffset( daeOffsetOf( domFx_basic_type_common::domInt4 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_basic_type_common::domInt4)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_basic_type_common::domFloat::create(daeInt bytes) +{ + domFx_basic_type_common::domFloatRef ref = new(bytes) domFx_basic_type_common::domFloat; + return ref; +} + + +daeMetaElement * +domFx_basic_type_common::domFloat::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "float" ); + _Meta->registerClass(domFx_basic_type_common::domFloat::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Float")); + ma->setOffset( daeOffsetOf( domFx_basic_type_common::domFloat , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_basic_type_common::domFloat)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_basic_type_common::domFloat2::create(daeInt bytes) +{ + domFx_basic_type_common::domFloat2Ref ref = new(bytes) domFx_basic_type_common::domFloat2; + return ref; +} + + +daeMetaElement * +domFx_basic_type_common::domFloat2::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "float2" ); + _Meta->registerClass(domFx_basic_type_common::domFloat2::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Float2")); + ma->setOffset( daeOffsetOf( domFx_basic_type_common::domFloat2 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_basic_type_common::domFloat2)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_basic_type_common::domFloat3::create(daeInt bytes) +{ + domFx_basic_type_common::domFloat3Ref ref = new(bytes) domFx_basic_type_common::domFloat3; + return ref; +} + + +daeMetaElement * +domFx_basic_type_common::domFloat3::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "float3" ); + _Meta->registerClass(domFx_basic_type_common::domFloat3::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Float3")); + ma->setOffset( daeOffsetOf( domFx_basic_type_common::domFloat3 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_basic_type_common::domFloat3)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_basic_type_common::domFloat4::create(daeInt bytes) +{ + domFx_basic_type_common::domFloat4Ref ref = new(bytes) domFx_basic_type_common::domFloat4; + return ref; +} + + +daeMetaElement * +domFx_basic_type_common::domFloat4::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "float4" ); + _Meta->registerClass(domFx_basic_type_common::domFloat4::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Float4")); + ma->setOffset( daeOffsetOf( domFx_basic_type_common::domFloat4 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_basic_type_common::domFloat4)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_basic_type_common::domFloat1x1::create(daeInt bytes) +{ + domFx_basic_type_common::domFloat1x1Ref ref = new(bytes) domFx_basic_type_common::domFloat1x1; + return ref; +} + + +daeMetaElement * +domFx_basic_type_common::domFloat1x1::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "float1x1" ); + _Meta->registerClass(domFx_basic_type_common::domFloat1x1::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Float")); + ma->setOffset( daeOffsetOf( domFx_basic_type_common::domFloat1x1 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_basic_type_common::domFloat1x1)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_basic_type_common::domFloat1x2::create(daeInt bytes) +{ + domFx_basic_type_common::domFloat1x2Ref ref = new(bytes) domFx_basic_type_common::domFloat1x2; + return ref; +} + + +daeMetaElement * +domFx_basic_type_common::domFloat1x2::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "float1x2" ); + _Meta->registerClass(domFx_basic_type_common::domFloat1x2::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Float2")); + ma->setOffset( daeOffsetOf( domFx_basic_type_common::domFloat1x2 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_basic_type_common::domFloat1x2)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_basic_type_common::domFloat1x3::create(daeInt bytes) +{ + domFx_basic_type_common::domFloat1x3Ref ref = new(bytes) domFx_basic_type_common::domFloat1x3; + return ref; +} + + +daeMetaElement * +domFx_basic_type_common::domFloat1x3::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "float1x3" ); + _Meta->registerClass(domFx_basic_type_common::domFloat1x3::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Float3")); + ma->setOffset( daeOffsetOf( domFx_basic_type_common::domFloat1x3 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_basic_type_common::domFloat1x3)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_basic_type_common::domFloat1x4::create(daeInt bytes) +{ + domFx_basic_type_common::domFloat1x4Ref ref = new(bytes) domFx_basic_type_common::domFloat1x4; + return ref; +} + + +daeMetaElement * +domFx_basic_type_common::domFloat1x4::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "float1x4" ); + _Meta->registerClass(domFx_basic_type_common::domFloat1x4::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Float4")); + ma->setOffset( daeOffsetOf( domFx_basic_type_common::domFloat1x4 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_basic_type_common::domFloat1x4)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_basic_type_common::domFloat2x1::create(daeInt bytes) +{ + domFx_basic_type_common::domFloat2x1Ref ref = new(bytes) domFx_basic_type_common::domFloat2x1; + return ref; +} + + +daeMetaElement * +domFx_basic_type_common::domFloat2x1::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "float2x1" ); + _Meta->registerClass(domFx_basic_type_common::domFloat2x1::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Float2")); + ma->setOffset( daeOffsetOf( domFx_basic_type_common::domFloat2x1 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_basic_type_common::domFloat2x1)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_basic_type_common::domFloat2x2::create(daeInt bytes) +{ + domFx_basic_type_common::domFloat2x2Ref ref = new(bytes) domFx_basic_type_common::domFloat2x2; + return ref; +} + + +daeMetaElement * +domFx_basic_type_common::domFloat2x2::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "float2x2" ); + _Meta->registerClass(domFx_basic_type_common::domFloat2x2::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Float2x2")); + ma->setOffset( daeOffsetOf( domFx_basic_type_common::domFloat2x2 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_basic_type_common::domFloat2x2)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_basic_type_common::domFloat2x3::create(daeInt bytes) +{ + domFx_basic_type_common::domFloat2x3Ref ref = new(bytes) domFx_basic_type_common::domFloat2x3; + return ref; +} + + +daeMetaElement * +domFx_basic_type_common::domFloat2x3::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "float2x3" ); + _Meta->registerClass(domFx_basic_type_common::domFloat2x3::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Float2x3")); + ma->setOffset( daeOffsetOf( domFx_basic_type_common::domFloat2x3 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_basic_type_common::domFloat2x3)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_basic_type_common::domFloat2x4::create(daeInt bytes) +{ + domFx_basic_type_common::domFloat2x4Ref ref = new(bytes) domFx_basic_type_common::domFloat2x4; + return ref; +} + + +daeMetaElement * +domFx_basic_type_common::domFloat2x4::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "float2x4" ); + _Meta->registerClass(domFx_basic_type_common::domFloat2x4::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Float2x4")); + ma->setOffset( daeOffsetOf( domFx_basic_type_common::domFloat2x4 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_basic_type_common::domFloat2x4)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_basic_type_common::domFloat3x1::create(daeInt bytes) +{ + domFx_basic_type_common::domFloat3x1Ref ref = new(bytes) domFx_basic_type_common::domFloat3x1; + return ref; +} + + +daeMetaElement * +domFx_basic_type_common::domFloat3x1::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "float3x1" ); + _Meta->registerClass(domFx_basic_type_common::domFloat3x1::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Float3")); + ma->setOffset( daeOffsetOf( domFx_basic_type_common::domFloat3x1 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_basic_type_common::domFloat3x1)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_basic_type_common::domFloat3x2::create(daeInt bytes) +{ + domFx_basic_type_common::domFloat3x2Ref ref = new(bytes) domFx_basic_type_common::domFloat3x2; + return ref; +} + + +daeMetaElement * +domFx_basic_type_common::domFloat3x2::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "float3x2" ); + _Meta->registerClass(domFx_basic_type_common::domFloat3x2::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Float3x2")); + ma->setOffset( daeOffsetOf( domFx_basic_type_common::domFloat3x2 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_basic_type_common::domFloat3x2)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_basic_type_common::domFloat3x3::create(daeInt bytes) +{ + domFx_basic_type_common::domFloat3x3Ref ref = new(bytes) domFx_basic_type_common::domFloat3x3; + return ref; +} + + +daeMetaElement * +domFx_basic_type_common::domFloat3x3::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "float3x3" ); + _Meta->registerClass(domFx_basic_type_common::domFloat3x3::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Float3x3")); + ma->setOffset( daeOffsetOf( domFx_basic_type_common::domFloat3x3 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_basic_type_common::domFloat3x3)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_basic_type_common::domFloat3x4::create(daeInt bytes) +{ + domFx_basic_type_common::domFloat3x4Ref ref = new(bytes) domFx_basic_type_common::domFloat3x4; + return ref; +} + + +daeMetaElement * +domFx_basic_type_common::domFloat3x4::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "float3x4" ); + _Meta->registerClass(domFx_basic_type_common::domFloat3x4::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Float3x4")); + ma->setOffset( daeOffsetOf( domFx_basic_type_common::domFloat3x4 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_basic_type_common::domFloat3x4)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_basic_type_common::domFloat4x1::create(daeInt bytes) +{ + domFx_basic_type_common::domFloat4x1Ref ref = new(bytes) domFx_basic_type_common::domFloat4x1; + return ref; +} + + +daeMetaElement * +domFx_basic_type_common::domFloat4x1::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "float4x1" ); + _Meta->registerClass(domFx_basic_type_common::domFloat4x1::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Float4")); + ma->setOffset( daeOffsetOf( domFx_basic_type_common::domFloat4x1 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_basic_type_common::domFloat4x1)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_basic_type_common::domFloat4x2::create(daeInt bytes) +{ + domFx_basic_type_common::domFloat4x2Ref ref = new(bytes) domFx_basic_type_common::domFloat4x2; + return ref; +} + + +daeMetaElement * +domFx_basic_type_common::domFloat4x2::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "float4x2" ); + _Meta->registerClass(domFx_basic_type_common::domFloat4x2::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Float4x2")); + ma->setOffset( daeOffsetOf( domFx_basic_type_common::domFloat4x2 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_basic_type_common::domFloat4x2)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_basic_type_common::domFloat4x3::create(daeInt bytes) +{ + domFx_basic_type_common::domFloat4x3Ref ref = new(bytes) domFx_basic_type_common::domFloat4x3; + return ref; +} + + +daeMetaElement * +domFx_basic_type_common::domFloat4x3::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "float4x3" ); + _Meta->registerClass(domFx_basic_type_common::domFloat4x3::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Float4x3")); + ma->setOffset( daeOffsetOf( domFx_basic_type_common::domFloat4x3 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_basic_type_common::domFloat4x3)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_basic_type_common::domFloat4x4::create(daeInt bytes) +{ + domFx_basic_type_common::domFloat4x4Ref ref = new(bytes) domFx_basic_type_common::domFloat4x4; + return ref; +} + + +daeMetaElement * +domFx_basic_type_common::domFloat4x4::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "float4x4" ); + _Meta->registerClass(domFx_basic_type_common::domFloat4x4::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Float4x4")); + ma->setOffset( daeOffsetOf( domFx_basic_type_common::domFloat4x4 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_basic_type_common::domFloat4x4)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_basic_type_common::domEnum::create(daeInt bytes) +{ + domFx_basic_type_common::domEnumRef ref = new(bytes) domFx_basic_type_common::domEnum; + return ref; +} + + +daeMetaElement * +domFx_basic_type_common::domEnum::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "enum" ); + _Meta->registerClass(domFx_basic_type_common::domEnum::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("xsString")); + ma->setOffset( daeOffsetOf( domFx_basic_type_common::domEnum , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_basic_type_common::domEnum)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domFx_basic_type_common::_Meta = NULL; +daeMetaElement * domFx_basic_type_common::domBool::_Meta = NULL; +daeMetaElement * domFx_basic_type_common::domBool2::_Meta = NULL; +daeMetaElement * domFx_basic_type_common::domBool3::_Meta = NULL; +daeMetaElement * domFx_basic_type_common::domBool4::_Meta = NULL; +daeMetaElement * domFx_basic_type_common::domInt::_Meta = NULL; +daeMetaElement * domFx_basic_type_common::domInt2::_Meta = NULL; +daeMetaElement * domFx_basic_type_common::domInt3::_Meta = NULL; +daeMetaElement * domFx_basic_type_common::domInt4::_Meta = NULL; +daeMetaElement * domFx_basic_type_common::domFloat::_Meta = NULL; +daeMetaElement * domFx_basic_type_common::domFloat2::_Meta = NULL; +daeMetaElement * domFx_basic_type_common::domFloat3::_Meta = NULL; +daeMetaElement * domFx_basic_type_common::domFloat4::_Meta = NULL; +daeMetaElement * domFx_basic_type_common::domFloat1x1::_Meta = NULL; +daeMetaElement * domFx_basic_type_common::domFloat1x2::_Meta = NULL; +daeMetaElement * domFx_basic_type_common::domFloat1x3::_Meta = NULL; +daeMetaElement * domFx_basic_type_common::domFloat1x4::_Meta = NULL; +daeMetaElement * domFx_basic_type_common::domFloat2x1::_Meta = NULL; +daeMetaElement * domFx_basic_type_common::domFloat2x2::_Meta = NULL; +daeMetaElement * domFx_basic_type_common::domFloat2x3::_Meta = NULL; +daeMetaElement * domFx_basic_type_common::domFloat2x4::_Meta = NULL; +daeMetaElement * domFx_basic_type_common::domFloat3x1::_Meta = NULL; +daeMetaElement * domFx_basic_type_common::domFloat3x2::_Meta = NULL; +daeMetaElement * domFx_basic_type_common::domFloat3x3::_Meta = NULL; +daeMetaElement * domFx_basic_type_common::domFloat3x4::_Meta = NULL; +daeMetaElement * domFx_basic_type_common::domFloat4x1::_Meta = NULL; +daeMetaElement * domFx_basic_type_common::domFloat4x2::_Meta = NULL; +daeMetaElement * domFx_basic_type_common::domFloat4x3::_Meta = NULL; +daeMetaElement * domFx_basic_type_common::domFloat4x4::_Meta = NULL; +daeMetaElement * domFx_basic_type_common::domEnum::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_clearcolor_common.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_clearcolor_common.cpp new file mode 100644 index 00000000..916a5bf6 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_clearcolor_common.cpp @@ -0,0 +1,73 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domFx_clearcolor_common::create(daeInt bytes) +{ + domFx_clearcolor_commonRef ref = new(bytes) domFx_clearcolor_common; + return ref; +} + + +daeMetaElement * +domFx_clearcolor_common::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "fx_clearcolor_common" ); + _Meta->registerClass(domFx_clearcolor_common::create, &_Meta); + + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Fx_color_common")); + ma->setOffset( daeOffsetOf( domFx_clearcolor_common , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + // Add attribute: index + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "index" ); + ma->setType( daeAtomicType::get("xsNonNegativeInteger")); + ma->setOffset( daeOffsetOf( domFx_clearcolor_common , attrIndex )); + ma->setContainer( _Meta ); + ma->setDefault( "0"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_clearcolor_common)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domFx_clearcolor_common::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_cleardepth_common.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_cleardepth_common.cpp new file mode 100644 index 00000000..61e8dd58 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_cleardepth_common.cpp @@ -0,0 +1,73 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domFx_cleardepth_common::create(daeInt bytes) +{ + domFx_cleardepth_commonRef ref = new(bytes) domFx_cleardepth_common; + return ref; +} + + +daeMetaElement * +domFx_cleardepth_common::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "fx_cleardepth_common" ); + _Meta->registerClass(domFx_cleardepth_common::create, &_Meta); + + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Float")); + ma->setOffset( daeOffsetOf( domFx_cleardepth_common , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + // Add attribute: index + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "index" ); + ma->setType( daeAtomicType::get("xsNonNegativeInteger")); + ma->setOffset( daeOffsetOf( domFx_cleardepth_common , attrIndex )); + ma->setContainer( _Meta ); + ma->setDefault( "0"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_cleardepth_common)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domFx_cleardepth_common::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_clearstencil_common.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_clearstencil_common.cpp new file mode 100644 index 00000000..3dcd9062 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_clearstencil_common.cpp @@ -0,0 +1,73 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domFx_clearstencil_common::create(daeInt bytes) +{ + domFx_clearstencil_commonRef ref = new(bytes) domFx_clearstencil_common; + return ref; +} + + +daeMetaElement * +domFx_clearstencil_common::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "fx_clearstencil_common" ); + _Meta->registerClass(domFx_clearstencil_common::create, &_Meta); + + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("xsByte")); + ma->setOffset( daeOffsetOf( domFx_clearstencil_common , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + // Add attribute: index + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "index" ); + ma->setType( daeAtomicType::get("xsNonNegativeInteger")); + ma->setOffset( daeOffsetOf( domFx_clearstencil_common , attrIndex )); + ma->setContainer( _Meta ); + ma->setDefault( "0"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_clearstencil_common)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domFx_clearstencil_common::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_code_profile.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_code_profile.cpp new file mode 100644 index 00000000..f89a3681 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_code_profile.cpp @@ -0,0 +1,72 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domFx_code_profile::create(daeInt bytes) +{ + domFx_code_profileRef ref = new(bytes) domFx_code_profile; + return ref; +} + + +daeMetaElement * +domFx_code_profile::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "fx_code_profile" ); + _Meta->registerClass(domFx_code_profile::create, &_Meta); + + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("xsString")); + ma->setOffset( daeOffsetOf( domFx_code_profile , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + // Add attribute: sid + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "sid" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domFx_code_profile , attrSid )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_code_profile)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domFx_code_profile::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_colortarget_common.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_colortarget_common.cpp new file mode 100644 index 00000000..78e4ae7e --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_colortarget_common.cpp @@ -0,0 +1,112 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domFx_colortarget_common::create(daeInt bytes) +{ + domFx_colortarget_commonRef ref = new(bytes) domFx_colortarget_common; + return ref; +} + + +daeMetaElement * +domFx_colortarget_common::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "fx_colortarget_common" ); + _Meta->registerClass(domFx_colortarget_common::create, &_Meta); + + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domFx_colortarget_common , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + // Add attribute: index + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "index" ); + ma->setType( daeAtomicType::get("xsNonNegativeInteger")); + ma->setOffset( daeOffsetOf( domFx_colortarget_common , attrIndex )); + ma->setContainer( _Meta ); + ma->setDefault( "0"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: face + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "face" ); + ma->setType( daeAtomicType::get("Fx_surface_face_enum")); + ma->setOffset( daeOffsetOf( domFx_colortarget_common , attrFace )); + ma->setContainer( _Meta ); + ma->setDefault( "POSITIVE_X"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: mip + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "mip" ); + ma->setType( daeAtomicType::get("xsNonNegativeInteger")); + ma->setOffset( daeOffsetOf( domFx_colortarget_common , attrMip )); + ma->setContainer( _Meta ); + ma->setDefault( "0"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: slice + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "slice" ); + ma->setType( daeAtomicType::get("xsNonNegativeInteger")); + ma->setOffset( daeOffsetOf( domFx_colortarget_common , attrSlice )); + ma->setContainer( _Meta ); + ma->setDefault( "0"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_colortarget_common)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domFx_colortarget_common::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_depthtarget_common.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_depthtarget_common.cpp new file mode 100644 index 00000000..79384d64 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_depthtarget_common.cpp @@ -0,0 +1,112 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domFx_depthtarget_common::create(daeInt bytes) +{ + domFx_depthtarget_commonRef ref = new(bytes) domFx_depthtarget_common; + return ref; +} + + +daeMetaElement * +domFx_depthtarget_common::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "fx_depthtarget_common" ); + _Meta->registerClass(domFx_depthtarget_common::create, &_Meta); + + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domFx_depthtarget_common , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + // Add attribute: index + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "index" ); + ma->setType( daeAtomicType::get("xsNonNegativeInteger")); + ma->setOffset( daeOffsetOf( domFx_depthtarget_common , attrIndex )); + ma->setContainer( _Meta ); + ma->setDefault( "0"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: face + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "face" ); + ma->setType( daeAtomicType::get("Fx_surface_face_enum")); + ma->setOffset( daeOffsetOf( domFx_depthtarget_common , attrFace )); + ma->setContainer( _Meta ); + ma->setDefault( "POSITIVE_X"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: mip + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "mip" ); + ma->setType( daeAtomicType::get("xsNonNegativeInteger")); + ma->setOffset( daeOffsetOf( domFx_depthtarget_common , attrMip )); + ma->setContainer( _Meta ); + ma->setDefault( "0"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: slice + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "slice" ); + ma->setType( daeAtomicType::get("xsNonNegativeInteger")); + ma->setOffset( daeOffsetOf( domFx_depthtarget_common , attrSlice )); + ma->setContainer( _Meta ); + ma->setDefault( "0"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_depthtarget_common)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domFx_depthtarget_common::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_include_common.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_include_common.cpp new file mode 100644 index 00000000..29422603 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_include_common.cpp @@ -0,0 +1,76 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domFx_include_common::create(daeInt bytes) +{ + domFx_include_commonRef ref = new(bytes) domFx_include_common; + ref->attrUrl.setContainer( (domFx_include_common*)ref ); + return ref; +} + + +daeMetaElement * +domFx_include_common::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "fx_include_common" ); + _Meta->registerClass(domFx_include_common::create, &_Meta); + + + // Add attribute: sid + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "sid" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domFx_include_common , attrSid )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: url + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "url" ); + ma->setType( daeAtomicType::get("xsAnyURI")); + ma->setOffset( daeOffsetOf( domFx_include_common , attrUrl )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_include_common)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domFx_include_common::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_newparam_common.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_newparam_common.cpp new file mode 100644 index 00000000..d7643a9d --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_newparam_common.cpp @@ -0,0 +1,165 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domFx_newparam_common::create(daeInt bytes) +{ + domFx_newparam_commonRef ref = new(bytes) domFx_newparam_common; + return ref; +} + + +daeMetaElement * +domFx_newparam_common::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "fx_newparam_common" ); + _Meta->registerClass(domFx_newparam_common::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 0, -1 ); + mea->setName( "annotate" ); + mea->setOffset( daeOffsetOf(domFx_newparam_common,elemAnnotate_array) ); + mea->setElementType( domFx_annotate_common::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 0, 1 ); + mea->setName( "semantic" ); + mea->setOffset( daeOffsetOf(domFx_newparam_common,elemSemantic) ); + mea->setElementType( domFx_newparam_common::domSemantic::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 2, 0, 1 ); + mea->setName( "modifier" ); + mea->setOffset( daeOffsetOf(domFx_newparam_common,elemModifier) ); + mea->setElementType( domFx_newparam_common::domModifier::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 3, 1, 1 ); + mea->setName( "fx_basic_type_common" ); + mea->setOffset( daeOffsetOf(domFx_newparam_common,elemFx_basic_type_common) ); + mea->setElementType( domFx_basic_type_common::registerElement() ); + cm->appendChild( new daeMetaGroup( mea, _Meta, cm, 3, 1, 1 ) ); + + cm->setMaxOrdinal( 3 ); + _Meta->setCMRoot( cm ); + + // Add attribute: sid + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "sid" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domFx_newparam_common , attrSid )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_newparam_common)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_newparam_common::domSemantic::create(daeInt bytes) +{ + domFx_newparam_common::domSemanticRef ref = new(bytes) domFx_newparam_common::domSemantic; + return ref; +} + + +daeMetaElement * +domFx_newparam_common::domSemantic::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "semantic" ); + _Meta->registerClass(domFx_newparam_common::domSemantic::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domFx_newparam_common::domSemantic , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_newparam_common::domSemantic)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_newparam_common::domModifier::create(daeInt bytes) +{ + domFx_newparam_common::domModifierRef ref = new(bytes) domFx_newparam_common::domModifier; + return ref; +} + + +daeMetaElement * +domFx_newparam_common::domModifier::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "modifier" ); + _Meta->registerClass(domFx_newparam_common::domModifier::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Fx_modifier_enum_common")); + ma->setOffset( daeOffsetOf( domFx_newparam_common::domModifier , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_newparam_common::domModifier)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domFx_newparam_common::_Meta = NULL; +daeMetaElement * domFx_newparam_common::domSemantic::_Meta = NULL; +daeMetaElement * domFx_newparam_common::domModifier::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_profile_abstract.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_profile_abstract.cpp new file mode 100644 index 00000000..1f2158c4 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_profile_abstract.cpp @@ -0,0 +1,52 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domFx_profile_abstract::create(daeInt bytes) +{ + domFx_profile_abstractRef ref = new(bytes) domFx_profile_abstract; + return ref; +} + + +daeMetaElement * +domFx_profile_abstract::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "fx_profile_abstract" ); + _Meta->registerClass(domFx_profile_abstract::create, &_Meta); + + _Meta->setIsAbstract( true ); + + + _Meta->setElementSize(sizeof(domFx_profile_abstract)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domFx_profile_abstract::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_sampler1D_common.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_sampler1D_common.cpp new file mode 100644 index 00000000..e2eab073 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_sampler1D_common.cpp @@ -0,0 +1,399 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domFx_sampler1D_common::create(daeInt bytes) +{ + domFx_sampler1D_commonRef ref = new(bytes) domFx_sampler1D_common; + return ref; +} + + +daeMetaElement * +domFx_sampler1D_common::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "fx_sampler1D_common" ); + _Meta->registerClass(domFx_sampler1D_common::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "source" ); + mea->setOffset( daeOffsetOf(domFx_sampler1D_common,elemSource) ); + mea->setElementType( domFx_sampler1D_common::domSource::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 0, 1 ); + mea->setName( "wrap_s" ); + mea->setOffset( daeOffsetOf(domFx_sampler1D_common,elemWrap_s) ); + mea->setElementType( domFx_sampler1D_common::domWrap_s::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 2, 0, 1 ); + mea->setName( "minfilter" ); + mea->setOffset( daeOffsetOf(domFx_sampler1D_common,elemMinfilter) ); + mea->setElementType( domFx_sampler1D_common::domMinfilter::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 3, 0, 1 ); + mea->setName( "magfilter" ); + mea->setOffset( daeOffsetOf(domFx_sampler1D_common,elemMagfilter) ); + mea->setElementType( domFx_sampler1D_common::domMagfilter::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 4, 0, 1 ); + mea->setName( "mipfilter" ); + mea->setOffset( daeOffsetOf(domFx_sampler1D_common,elemMipfilter) ); + mea->setElementType( domFx_sampler1D_common::domMipfilter::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 5, 0, 1 ); + mea->setName( "border_color" ); + mea->setOffset( daeOffsetOf(domFx_sampler1D_common,elemBorder_color) ); + mea->setElementType( domFx_sampler1D_common::domBorder_color::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 6, 0, 1 ); + mea->setName( "mipmap_maxlevel" ); + mea->setOffset( daeOffsetOf(domFx_sampler1D_common,elemMipmap_maxlevel) ); + mea->setElementType( domFx_sampler1D_common::domMipmap_maxlevel::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 7, 0, 1 ); + mea->setName( "mipmap_bias" ); + mea->setOffset( daeOffsetOf(domFx_sampler1D_common,elemMipmap_bias) ); + mea->setElementType( domFx_sampler1D_common::domMipmap_bias::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 8, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domFx_sampler1D_common,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 8 ); + _Meta->setCMRoot( cm ); + + + _Meta->setElementSize(sizeof(domFx_sampler1D_common)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_sampler1D_common::domSource::create(daeInt bytes) +{ + domFx_sampler1D_common::domSourceRef ref = new(bytes) domFx_sampler1D_common::domSource; + return ref; +} + + +daeMetaElement * +domFx_sampler1D_common::domSource::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "source" ); + _Meta->registerClass(domFx_sampler1D_common::domSource::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domFx_sampler1D_common::domSource , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_sampler1D_common::domSource)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_sampler1D_common::domWrap_s::create(daeInt bytes) +{ + domFx_sampler1D_common::domWrap_sRef ref = new(bytes) domFx_sampler1D_common::domWrap_s; + return ref; +} + + +daeMetaElement * +domFx_sampler1D_common::domWrap_s::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "wrap_s" ); + _Meta->registerClass(domFx_sampler1D_common::domWrap_s::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Fx_sampler_wrap_common")); + ma->setOffset( daeOffsetOf( domFx_sampler1D_common::domWrap_s , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_sampler1D_common::domWrap_s)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_sampler1D_common::domMinfilter::create(daeInt bytes) +{ + domFx_sampler1D_common::domMinfilterRef ref = new(bytes) domFx_sampler1D_common::domMinfilter; + return ref; +} + + +daeMetaElement * +domFx_sampler1D_common::domMinfilter::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "minfilter" ); + _Meta->registerClass(domFx_sampler1D_common::domMinfilter::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Fx_sampler_filter_common")); + ma->setOffset( daeOffsetOf( domFx_sampler1D_common::domMinfilter , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_sampler1D_common::domMinfilter)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_sampler1D_common::domMagfilter::create(daeInt bytes) +{ + domFx_sampler1D_common::domMagfilterRef ref = new(bytes) domFx_sampler1D_common::domMagfilter; + return ref; +} + + +daeMetaElement * +domFx_sampler1D_common::domMagfilter::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "magfilter" ); + _Meta->registerClass(domFx_sampler1D_common::domMagfilter::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Fx_sampler_filter_common")); + ma->setOffset( daeOffsetOf( domFx_sampler1D_common::domMagfilter , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_sampler1D_common::domMagfilter)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_sampler1D_common::domMipfilter::create(daeInt bytes) +{ + domFx_sampler1D_common::domMipfilterRef ref = new(bytes) domFx_sampler1D_common::domMipfilter; + return ref; +} + + +daeMetaElement * +domFx_sampler1D_common::domMipfilter::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "mipfilter" ); + _Meta->registerClass(domFx_sampler1D_common::domMipfilter::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Fx_sampler_filter_common")); + ma->setOffset( daeOffsetOf( domFx_sampler1D_common::domMipfilter , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_sampler1D_common::domMipfilter)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_sampler1D_common::domBorder_color::create(daeInt bytes) +{ + domFx_sampler1D_common::domBorder_colorRef ref = new(bytes) domFx_sampler1D_common::domBorder_color; + return ref; +} + + +daeMetaElement * +domFx_sampler1D_common::domBorder_color::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "border_color" ); + _Meta->registerClass(domFx_sampler1D_common::domBorder_color::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Fx_color_common")); + ma->setOffset( daeOffsetOf( domFx_sampler1D_common::domBorder_color , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_sampler1D_common::domBorder_color)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_sampler1D_common::domMipmap_maxlevel::create(daeInt bytes) +{ + domFx_sampler1D_common::domMipmap_maxlevelRef ref = new(bytes) domFx_sampler1D_common::domMipmap_maxlevel; + return ref; +} + + +daeMetaElement * +domFx_sampler1D_common::domMipmap_maxlevel::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "mipmap_maxlevel" ); + _Meta->registerClass(domFx_sampler1D_common::domMipmap_maxlevel::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("xsUnsignedByte")); + ma->setOffset( daeOffsetOf( domFx_sampler1D_common::domMipmap_maxlevel , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_sampler1D_common::domMipmap_maxlevel)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_sampler1D_common::domMipmap_bias::create(daeInt bytes) +{ + domFx_sampler1D_common::domMipmap_biasRef ref = new(bytes) domFx_sampler1D_common::domMipmap_bias; + return ref; +} + + +daeMetaElement * +domFx_sampler1D_common::domMipmap_bias::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "mipmap_bias" ); + _Meta->registerClass(domFx_sampler1D_common::domMipmap_bias::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("xsFloat")); + ma->setOffset( daeOffsetOf( domFx_sampler1D_common::domMipmap_bias , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_sampler1D_common::domMipmap_bias)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domFx_sampler1D_common::_Meta = NULL; +daeMetaElement * domFx_sampler1D_common::domSource::_Meta = NULL; +daeMetaElement * domFx_sampler1D_common::domWrap_s::_Meta = NULL; +daeMetaElement * domFx_sampler1D_common::domMinfilter::_Meta = NULL; +daeMetaElement * domFx_sampler1D_common::domMagfilter::_Meta = NULL; +daeMetaElement * domFx_sampler1D_common::domMipfilter::_Meta = NULL; +daeMetaElement * domFx_sampler1D_common::domBorder_color::_Meta = NULL; +daeMetaElement * domFx_sampler1D_common::domMipmap_maxlevel::_Meta = NULL; +daeMetaElement * domFx_sampler1D_common::domMipmap_bias::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_sampler2D_common.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_sampler2D_common.cpp new file mode 100644 index 00000000..cd462053 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_sampler2D_common.cpp @@ -0,0 +1,441 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domFx_sampler2D_common::create(daeInt bytes) +{ + domFx_sampler2D_commonRef ref = new(bytes) domFx_sampler2D_common; + return ref; +} + + +daeMetaElement * +domFx_sampler2D_common::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "fx_sampler2D_common" ); + _Meta->registerClass(domFx_sampler2D_common::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "source" ); + mea->setOffset( daeOffsetOf(domFx_sampler2D_common,elemSource) ); + mea->setElementType( domFx_sampler2D_common::domSource::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 0, 1 ); + mea->setName( "wrap_s" ); + mea->setOffset( daeOffsetOf(domFx_sampler2D_common,elemWrap_s) ); + mea->setElementType( domFx_sampler2D_common::domWrap_s::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 2, 0, 1 ); + mea->setName( "wrap_t" ); + mea->setOffset( daeOffsetOf(domFx_sampler2D_common,elemWrap_t) ); + mea->setElementType( domFx_sampler2D_common::domWrap_t::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 3, 0, 1 ); + mea->setName( "minfilter" ); + mea->setOffset( daeOffsetOf(domFx_sampler2D_common,elemMinfilter) ); + mea->setElementType( domFx_sampler2D_common::domMinfilter::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 4, 0, 1 ); + mea->setName( "magfilter" ); + mea->setOffset( daeOffsetOf(domFx_sampler2D_common,elemMagfilter) ); + mea->setElementType( domFx_sampler2D_common::domMagfilter::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 5, 0, 1 ); + mea->setName( "mipfilter" ); + mea->setOffset( daeOffsetOf(domFx_sampler2D_common,elemMipfilter) ); + mea->setElementType( domFx_sampler2D_common::domMipfilter::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 6, 0, 1 ); + mea->setName( "border_color" ); + mea->setOffset( daeOffsetOf(domFx_sampler2D_common,elemBorder_color) ); + mea->setElementType( domFx_sampler2D_common::domBorder_color::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 7, 0, 1 ); + mea->setName( "mipmap_maxlevel" ); + mea->setOffset( daeOffsetOf(domFx_sampler2D_common,elemMipmap_maxlevel) ); + mea->setElementType( domFx_sampler2D_common::domMipmap_maxlevel::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 8, 0, 1 ); + mea->setName( "mipmap_bias" ); + mea->setOffset( daeOffsetOf(domFx_sampler2D_common,elemMipmap_bias) ); + mea->setElementType( domFx_sampler2D_common::domMipmap_bias::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 9, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domFx_sampler2D_common,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 9 ); + _Meta->setCMRoot( cm ); + + + _Meta->setElementSize(sizeof(domFx_sampler2D_common)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_sampler2D_common::domSource::create(daeInt bytes) +{ + domFx_sampler2D_common::domSourceRef ref = new(bytes) domFx_sampler2D_common::domSource; + return ref; +} + + +daeMetaElement * +domFx_sampler2D_common::domSource::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "source" ); + _Meta->registerClass(domFx_sampler2D_common::domSource::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domFx_sampler2D_common::domSource , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_sampler2D_common::domSource)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_sampler2D_common::domWrap_s::create(daeInt bytes) +{ + domFx_sampler2D_common::domWrap_sRef ref = new(bytes) domFx_sampler2D_common::domWrap_s; + return ref; +} + + +daeMetaElement * +domFx_sampler2D_common::domWrap_s::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "wrap_s" ); + _Meta->registerClass(domFx_sampler2D_common::domWrap_s::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Fx_sampler_wrap_common")); + ma->setOffset( daeOffsetOf( domFx_sampler2D_common::domWrap_s , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_sampler2D_common::domWrap_s)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_sampler2D_common::domWrap_t::create(daeInt bytes) +{ + domFx_sampler2D_common::domWrap_tRef ref = new(bytes) domFx_sampler2D_common::domWrap_t; + return ref; +} + + +daeMetaElement * +domFx_sampler2D_common::domWrap_t::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "wrap_t" ); + _Meta->registerClass(domFx_sampler2D_common::domWrap_t::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Fx_sampler_wrap_common")); + ma->setOffset( daeOffsetOf( domFx_sampler2D_common::domWrap_t , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_sampler2D_common::domWrap_t)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_sampler2D_common::domMinfilter::create(daeInt bytes) +{ + domFx_sampler2D_common::domMinfilterRef ref = new(bytes) domFx_sampler2D_common::domMinfilter; + return ref; +} + + +daeMetaElement * +domFx_sampler2D_common::domMinfilter::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "minfilter" ); + _Meta->registerClass(domFx_sampler2D_common::domMinfilter::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Fx_sampler_filter_common")); + ma->setOffset( daeOffsetOf( domFx_sampler2D_common::domMinfilter , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_sampler2D_common::domMinfilter)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_sampler2D_common::domMagfilter::create(daeInt bytes) +{ + domFx_sampler2D_common::domMagfilterRef ref = new(bytes) domFx_sampler2D_common::domMagfilter; + return ref; +} + + +daeMetaElement * +domFx_sampler2D_common::domMagfilter::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "magfilter" ); + _Meta->registerClass(domFx_sampler2D_common::domMagfilter::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Fx_sampler_filter_common")); + ma->setOffset( daeOffsetOf( domFx_sampler2D_common::domMagfilter , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_sampler2D_common::domMagfilter)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_sampler2D_common::domMipfilter::create(daeInt bytes) +{ + domFx_sampler2D_common::domMipfilterRef ref = new(bytes) domFx_sampler2D_common::domMipfilter; + return ref; +} + + +daeMetaElement * +domFx_sampler2D_common::domMipfilter::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "mipfilter" ); + _Meta->registerClass(domFx_sampler2D_common::domMipfilter::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Fx_sampler_filter_common")); + ma->setOffset( daeOffsetOf( domFx_sampler2D_common::domMipfilter , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_sampler2D_common::domMipfilter)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_sampler2D_common::domBorder_color::create(daeInt bytes) +{ + domFx_sampler2D_common::domBorder_colorRef ref = new(bytes) domFx_sampler2D_common::domBorder_color; + return ref; +} + + +daeMetaElement * +domFx_sampler2D_common::domBorder_color::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "border_color" ); + _Meta->registerClass(domFx_sampler2D_common::domBorder_color::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Fx_color_common")); + ma->setOffset( daeOffsetOf( domFx_sampler2D_common::domBorder_color , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_sampler2D_common::domBorder_color)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_sampler2D_common::domMipmap_maxlevel::create(daeInt bytes) +{ + domFx_sampler2D_common::domMipmap_maxlevelRef ref = new(bytes) domFx_sampler2D_common::domMipmap_maxlevel; + return ref; +} + + +daeMetaElement * +domFx_sampler2D_common::domMipmap_maxlevel::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "mipmap_maxlevel" ); + _Meta->registerClass(domFx_sampler2D_common::domMipmap_maxlevel::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("xsUnsignedByte")); + ma->setOffset( daeOffsetOf( domFx_sampler2D_common::domMipmap_maxlevel , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_sampler2D_common::domMipmap_maxlevel)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_sampler2D_common::domMipmap_bias::create(daeInt bytes) +{ + domFx_sampler2D_common::domMipmap_biasRef ref = new(bytes) domFx_sampler2D_common::domMipmap_bias; + return ref; +} + + +daeMetaElement * +domFx_sampler2D_common::domMipmap_bias::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "mipmap_bias" ); + _Meta->registerClass(domFx_sampler2D_common::domMipmap_bias::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("xsFloat")); + ma->setOffset( daeOffsetOf( domFx_sampler2D_common::domMipmap_bias , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_sampler2D_common::domMipmap_bias)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domFx_sampler2D_common::_Meta = NULL; +daeMetaElement * domFx_sampler2D_common::domSource::_Meta = NULL; +daeMetaElement * domFx_sampler2D_common::domWrap_s::_Meta = NULL; +daeMetaElement * domFx_sampler2D_common::domWrap_t::_Meta = NULL; +daeMetaElement * domFx_sampler2D_common::domMinfilter::_Meta = NULL; +daeMetaElement * domFx_sampler2D_common::domMagfilter::_Meta = NULL; +daeMetaElement * domFx_sampler2D_common::domMipfilter::_Meta = NULL; +daeMetaElement * domFx_sampler2D_common::domBorder_color::_Meta = NULL; +daeMetaElement * domFx_sampler2D_common::domMipmap_maxlevel::_Meta = NULL; +daeMetaElement * domFx_sampler2D_common::domMipmap_bias::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_sampler3D_common.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_sampler3D_common.cpp new file mode 100644 index 00000000..bd439ad7 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_sampler3D_common.cpp @@ -0,0 +1,483 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domFx_sampler3D_common::create(daeInt bytes) +{ + domFx_sampler3D_commonRef ref = new(bytes) domFx_sampler3D_common; + return ref; +} + + +daeMetaElement * +domFx_sampler3D_common::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "fx_sampler3D_common" ); + _Meta->registerClass(domFx_sampler3D_common::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "source" ); + mea->setOffset( daeOffsetOf(domFx_sampler3D_common,elemSource) ); + mea->setElementType( domFx_sampler3D_common::domSource::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 0, 1 ); + mea->setName( "wrap_s" ); + mea->setOffset( daeOffsetOf(domFx_sampler3D_common,elemWrap_s) ); + mea->setElementType( domFx_sampler3D_common::domWrap_s::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 2, 0, 1 ); + mea->setName( "wrap_t" ); + mea->setOffset( daeOffsetOf(domFx_sampler3D_common,elemWrap_t) ); + mea->setElementType( domFx_sampler3D_common::domWrap_t::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 3, 0, 1 ); + mea->setName( "wrap_p" ); + mea->setOffset( daeOffsetOf(domFx_sampler3D_common,elemWrap_p) ); + mea->setElementType( domFx_sampler3D_common::domWrap_p::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 4, 0, 1 ); + mea->setName( "minfilter" ); + mea->setOffset( daeOffsetOf(domFx_sampler3D_common,elemMinfilter) ); + mea->setElementType( domFx_sampler3D_common::domMinfilter::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 5, 0, 1 ); + mea->setName( "magfilter" ); + mea->setOffset( daeOffsetOf(domFx_sampler3D_common,elemMagfilter) ); + mea->setElementType( domFx_sampler3D_common::domMagfilter::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 6, 0, 1 ); + mea->setName( "mipfilter" ); + mea->setOffset( daeOffsetOf(domFx_sampler3D_common,elemMipfilter) ); + mea->setElementType( domFx_sampler3D_common::domMipfilter::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 7, 0, 1 ); + mea->setName( "border_color" ); + mea->setOffset( daeOffsetOf(domFx_sampler3D_common,elemBorder_color) ); + mea->setElementType( domFx_sampler3D_common::domBorder_color::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 8, 0, 1 ); + mea->setName( "mipmap_maxlevel" ); + mea->setOffset( daeOffsetOf(domFx_sampler3D_common,elemMipmap_maxlevel) ); + mea->setElementType( domFx_sampler3D_common::domMipmap_maxlevel::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 9, 0, 1 ); + mea->setName( "mipmap_bias" ); + mea->setOffset( daeOffsetOf(domFx_sampler3D_common,elemMipmap_bias) ); + mea->setElementType( domFx_sampler3D_common::domMipmap_bias::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 10, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domFx_sampler3D_common,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 10 ); + _Meta->setCMRoot( cm ); + + + _Meta->setElementSize(sizeof(domFx_sampler3D_common)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_sampler3D_common::domSource::create(daeInt bytes) +{ + domFx_sampler3D_common::domSourceRef ref = new(bytes) domFx_sampler3D_common::domSource; + return ref; +} + + +daeMetaElement * +domFx_sampler3D_common::domSource::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "source" ); + _Meta->registerClass(domFx_sampler3D_common::domSource::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domFx_sampler3D_common::domSource , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_sampler3D_common::domSource)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_sampler3D_common::domWrap_s::create(daeInt bytes) +{ + domFx_sampler3D_common::domWrap_sRef ref = new(bytes) domFx_sampler3D_common::domWrap_s; + return ref; +} + + +daeMetaElement * +domFx_sampler3D_common::domWrap_s::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "wrap_s" ); + _Meta->registerClass(domFx_sampler3D_common::domWrap_s::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Fx_sampler_wrap_common")); + ma->setOffset( daeOffsetOf( domFx_sampler3D_common::domWrap_s , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_sampler3D_common::domWrap_s)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_sampler3D_common::domWrap_t::create(daeInt bytes) +{ + domFx_sampler3D_common::domWrap_tRef ref = new(bytes) domFx_sampler3D_common::domWrap_t; + return ref; +} + + +daeMetaElement * +domFx_sampler3D_common::domWrap_t::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "wrap_t" ); + _Meta->registerClass(domFx_sampler3D_common::domWrap_t::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Fx_sampler_wrap_common")); + ma->setOffset( daeOffsetOf( domFx_sampler3D_common::domWrap_t , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_sampler3D_common::domWrap_t)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_sampler3D_common::domWrap_p::create(daeInt bytes) +{ + domFx_sampler3D_common::domWrap_pRef ref = new(bytes) domFx_sampler3D_common::domWrap_p; + return ref; +} + + +daeMetaElement * +domFx_sampler3D_common::domWrap_p::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "wrap_p" ); + _Meta->registerClass(domFx_sampler3D_common::domWrap_p::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Fx_sampler_wrap_common")); + ma->setOffset( daeOffsetOf( domFx_sampler3D_common::domWrap_p , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_sampler3D_common::domWrap_p)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_sampler3D_common::domMinfilter::create(daeInt bytes) +{ + domFx_sampler3D_common::domMinfilterRef ref = new(bytes) domFx_sampler3D_common::domMinfilter; + return ref; +} + + +daeMetaElement * +domFx_sampler3D_common::domMinfilter::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "minfilter" ); + _Meta->registerClass(domFx_sampler3D_common::domMinfilter::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Fx_sampler_filter_common")); + ma->setOffset( daeOffsetOf( domFx_sampler3D_common::domMinfilter , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_sampler3D_common::domMinfilter)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_sampler3D_common::domMagfilter::create(daeInt bytes) +{ + domFx_sampler3D_common::domMagfilterRef ref = new(bytes) domFx_sampler3D_common::domMagfilter; + return ref; +} + + +daeMetaElement * +domFx_sampler3D_common::domMagfilter::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "magfilter" ); + _Meta->registerClass(domFx_sampler3D_common::domMagfilter::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Fx_sampler_filter_common")); + ma->setOffset( daeOffsetOf( domFx_sampler3D_common::domMagfilter , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_sampler3D_common::domMagfilter)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_sampler3D_common::domMipfilter::create(daeInt bytes) +{ + domFx_sampler3D_common::domMipfilterRef ref = new(bytes) domFx_sampler3D_common::domMipfilter; + return ref; +} + + +daeMetaElement * +domFx_sampler3D_common::domMipfilter::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "mipfilter" ); + _Meta->registerClass(domFx_sampler3D_common::domMipfilter::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Fx_sampler_filter_common")); + ma->setOffset( daeOffsetOf( domFx_sampler3D_common::domMipfilter , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_sampler3D_common::domMipfilter)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_sampler3D_common::domBorder_color::create(daeInt bytes) +{ + domFx_sampler3D_common::domBorder_colorRef ref = new(bytes) domFx_sampler3D_common::domBorder_color; + return ref; +} + + +daeMetaElement * +domFx_sampler3D_common::domBorder_color::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "border_color" ); + _Meta->registerClass(domFx_sampler3D_common::domBorder_color::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Fx_color_common")); + ma->setOffset( daeOffsetOf( domFx_sampler3D_common::domBorder_color , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_sampler3D_common::domBorder_color)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_sampler3D_common::domMipmap_maxlevel::create(daeInt bytes) +{ + domFx_sampler3D_common::domMipmap_maxlevelRef ref = new(bytes) domFx_sampler3D_common::domMipmap_maxlevel; + return ref; +} + + +daeMetaElement * +domFx_sampler3D_common::domMipmap_maxlevel::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "mipmap_maxlevel" ); + _Meta->registerClass(domFx_sampler3D_common::domMipmap_maxlevel::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("xsUnsignedByte")); + ma->setOffset( daeOffsetOf( domFx_sampler3D_common::domMipmap_maxlevel , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_sampler3D_common::domMipmap_maxlevel)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_sampler3D_common::domMipmap_bias::create(daeInt bytes) +{ + domFx_sampler3D_common::domMipmap_biasRef ref = new(bytes) domFx_sampler3D_common::domMipmap_bias; + return ref; +} + + +daeMetaElement * +domFx_sampler3D_common::domMipmap_bias::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "mipmap_bias" ); + _Meta->registerClass(domFx_sampler3D_common::domMipmap_bias::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("xsFloat")); + ma->setOffset( daeOffsetOf( domFx_sampler3D_common::domMipmap_bias , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_sampler3D_common::domMipmap_bias)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domFx_sampler3D_common::_Meta = NULL; +daeMetaElement * domFx_sampler3D_common::domSource::_Meta = NULL; +daeMetaElement * domFx_sampler3D_common::domWrap_s::_Meta = NULL; +daeMetaElement * domFx_sampler3D_common::domWrap_t::_Meta = NULL; +daeMetaElement * domFx_sampler3D_common::domWrap_p::_Meta = NULL; +daeMetaElement * domFx_sampler3D_common::domMinfilter::_Meta = NULL; +daeMetaElement * domFx_sampler3D_common::domMagfilter::_Meta = NULL; +daeMetaElement * domFx_sampler3D_common::domMipfilter::_Meta = NULL; +daeMetaElement * domFx_sampler3D_common::domBorder_color::_Meta = NULL; +daeMetaElement * domFx_sampler3D_common::domMipmap_maxlevel::_Meta = NULL; +daeMetaElement * domFx_sampler3D_common::domMipmap_bias::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_samplerCUBE_common.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_samplerCUBE_common.cpp new file mode 100644 index 00000000..42dc0197 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_samplerCUBE_common.cpp @@ -0,0 +1,483 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domFx_samplerCUBE_common::create(daeInt bytes) +{ + domFx_samplerCUBE_commonRef ref = new(bytes) domFx_samplerCUBE_common; + return ref; +} + + +daeMetaElement * +domFx_samplerCUBE_common::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "fx_samplerCUBE_common" ); + _Meta->registerClass(domFx_samplerCUBE_common::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "source" ); + mea->setOffset( daeOffsetOf(domFx_samplerCUBE_common,elemSource) ); + mea->setElementType( domFx_samplerCUBE_common::domSource::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 0, 1 ); + mea->setName( "wrap_s" ); + mea->setOffset( daeOffsetOf(domFx_samplerCUBE_common,elemWrap_s) ); + mea->setElementType( domFx_samplerCUBE_common::domWrap_s::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 2, 0, 1 ); + mea->setName( "wrap_t" ); + mea->setOffset( daeOffsetOf(domFx_samplerCUBE_common,elemWrap_t) ); + mea->setElementType( domFx_samplerCUBE_common::domWrap_t::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 3, 0, 1 ); + mea->setName( "wrap_p" ); + mea->setOffset( daeOffsetOf(domFx_samplerCUBE_common,elemWrap_p) ); + mea->setElementType( domFx_samplerCUBE_common::domWrap_p::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 4, 0, 1 ); + mea->setName( "minfilter" ); + mea->setOffset( daeOffsetOf(domFx_samplerCUBE_common,elemMinfilter) ); + mea->setElementType( domFx_samplerCUBE_common::domMinfilter::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 5, 0, 1 ); + mea->setName( "magfilter" ); + mea->setOffset( daeOffsetOf(domFx_samplerCUBE_common,elemMagfilter) ); + mea->setElementType( domFx_samplerCUBE_common::domMagfilter::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 6, 0, 1 ); + mea->setName( "mipfilter" ); + mea->setOffset( daeOffsetOf(domFx_samplerCUBE_common,elemMipfilter) ); + mea->setElementType( domFx_samplerCUBE_common::domMipfilter::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 7, 0, 1 ); + mea->setName( "border_color" ); + mea->setOffset( daeOffsetOf(domFx_samplerCUBE_common,elemBorder_color) ); + mea->setElementType( domFx_samplerCUBE_common::domBorder_color::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 8, 0, 1 ); + mea->setName( "mipmap_maxlevel" ); + mea->setOffset( daeOffsetOf(domFx_samplerCUBE_common,elemMipmap_maxlevel) ); + mea->setElementType( domFx_samplerCUBE_common::domMipmap_maxlevel::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 9, 0, 1 ); + mea->setName( "mipmap_bias" ); + mea->setOffset( daeOffsetOf(domFx_samplerCUBE_common,elemMipmap_bias) ); + mea->setElementType( domFx_samplerCUBE_common::domMipmap_bias::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 10, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domFx_samplerCUBE_common,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 10 ); + _Meta->setCMRoot( cm ); + + + _Meta->setElementSize(sizeof(domFx_samplerCUBE_common)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_samplerCUBE_common::domSource::create(daeInt bytes) +{ + domFx_samplerCUBE_common::domSourceRef ref = new(bytes) domFx_samplerCUBE_common::domSource; + return ref; +} + + +daeMetaElement * +domFx_samplerCUBE_common::domSource::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "source" ); + _Meta->registerClass(domFx_samplerCUBE_common::domSource::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domFx_samplerCUBE_common::domSource , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_samplerCUBE_common::domSource)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_samplerCUBE_common::domWrap_s::create(daeInt bytes) +{ + domFx_samplerCUBE_common::domWrap_sRef ref = new(bytes) domFx_samplerCUBE_common::domWrap_s; + return ref; +} + + +daeMetaElement * +domFx_samplerCUBE_common::domWrap_s::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "wrap_s" ); + _Meta->registerClass(domFx_samplerCUBE_common::domWrap_s::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Fx_sampler_wrap_common")); + ma->setOffset( daeOffsetOf( domFx_samplerCUBE_common::domWrap_s , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_samplerCUBE_common::domWrap_s)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_samplerCUBE_common::domWrap_t::create(daeInt bytes) +{ + domFx_samplerCUBE_common::domWrap_tRef ref = new(bytes) domFx_samplerCUBE_common::domWrap_t; + return ref; +} + + +daeMetaElement * +domFx_samplerCUBE_common::domWrap_t::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "wrap_t" ); + _Meta->registerClass(domFx_samplerCUBE_common::domWrap_t::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Fx_sampler_wrap_common")); + ma->setOffset( daeOffsetOf( domFx_samplerCUBE_common::domWrap_t , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_samplerCUBE_common::domWrap_t)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_samplerCUBE_common::domWrap_p::create(daeInt bytes) +{ + domFx_samplerCUBE_common::domWrap_pRef ref = new(bytes) domFx_samplerCUBE_common::domWrap_p; + return ref; +} + + +daeMetaElement * +domFx_samplerCUBE_common::domWrap_p::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "wrap_p" ); + _Meta->registerClass(domFx_samplerCUBE_common::domWrap_p::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Fx_sampler_wrap_common")); + ma->setOffset( daeOffsetOf( domFx_samplerCUBE_common::domWrap_p , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_samplerCUBE_common::domWrap_p)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_samplerCUBE_common::domMinfilter::create(daeInt bytes) +{ + domFx_samplerCUBE_common::domMinfilterRef ref = new(bytes) domFx_samplerCUBE_common::domMinfilter; + return ref; +} + + +daeMetaElement * +domFx_samplerCUBE_common::domMinfilter::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "minfilter" ); + _Meta->registerClass(domFx_samplerCUBE_common::domMinfilter::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Fx_sampler_filter_common")); + ma->setOffset( daeOffsetOf( domFx_samplerCUBE_common::domMinfilter , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_samplerCUBE_common::domMinfilter)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_samplerCUBE_common::domMagfilter::create(daeInt bytes) +{ + domFx_samplerCUBE_common::domMagfilterRef ref = new(bytes) domFx_samplerCUBE_common::domMagfilter; + return ref; +} + + +daeMetaElement * +domFx_samplerCUBE_common::domMagfilter::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "magfilter" ); + _Meta->registerClass(domFx_samplerCUBE_common::domMagfilter::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Fx_sampler_filter_common")); + ma->setOffset( daeOffsetOf( domFx_samplerCUBE_common::domMagfilter , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_samplerCUBE_common::domMagfilter)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_samplerCUBE_common::domMipfilter::create(daeInt bytes) +{ + domFx_samplerCUBE_common::domMipfilterRef ref = new(bytes) domFx_samplerCUBE_common::domMipfilter; + return ref; +} + + +daeMetaElement * +domFx_samplerCUBE_common::domMipfilter::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "mipfilter" ); + _Meta->registerClass(domFx_samplerCUBE_common::domMipfilter::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Fx_sampler_filter_common")); + ma->setOffset( daeOffsetOf( domFx_samplerCUBE_common::domMipfilter , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_samplerCUBE_common::domMipfilter)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_samplerCUBE_common::domBorder_color::create(daeInt bytes) +{ + domFx_samplerCUBE_common::domBorder_colorRef ref = new(bytes) domFx_samplerCUBE_common::domBorder_color; + return ref; +} + + +daeMetaElement * +domFx_samplerCUBE_common::domBorder_color::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "border_color" ); + _Meta->registerClass(domFx_samplerCUBE_common::domBorder_color::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Fx_color_common")); + ma->setOffset( daeOffsetOf( domFx_samplerCUBE_common::domBorder_color , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_samplerCUBE_common::domBorder_color)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_samplerCUBE_common::domMipmap_maxlevel::create(daeInt bytes) +{ + domFx_samplerCUBE_common::domMipmap_maxlevelRef ref = new(bytes) domFx_samplerCUBE_common::domMipmap_maxlevel; + return ref; +} + + +daeMetaElement * +domFx_samplerCUBE_common::domMipmap_maxlevel::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "mipmap_maxlevel" ); + _Meta->registerClass(domFx_samplerCUBE_common::domMipmap_maxlevel::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("xsUnsignedByte")); + ma->setOffset( daeOffsetOf( domFx_samplerCUBE_common::domMipmap_maxlevel , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_samplerCUBE_common::domMipmap_maxlevel)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_samplerCUBE_common::domMipmap_bias::create(daeInt bytes) +{ + domFx_samplerCUBE_common::domMipmap_biasRef ref = new(bytes) domFx_samplerCUBE_common::domMipmap_bias; + return ref; +} + + +daeMetaElement * +domFx_samplerCUBE_common::domMipmap_bias::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "mipmap_bias" ); + _Meta->registerClass(domFx_samplerCUBE_common::domMipmap_bias::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("xsFloat")); + ma->setOffset( daeOffsetOf( domFx_samplerCUBE_common::domMipmap_bias , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_samplerCUBE_common::domMipmap_bias)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domFx_samplerCUBE_common::_Meta = NULL; +daeMetaElement * domFx_samplerCUBE_common::domSource::_Meta = NULL; +daeMetaElement * domFx_samplerCUBE_common::domWrap_s::_Meta = NULL; +daeMetaElement * domFx_samplerCUBE_common::domWrap_t::_Meta = NULL; +daeMetaElement * domFx_samplerCUBE_common::domWrap_p::_Meta = NULL; +daeMetaElement * domFx_samplerCUBE_common::domMinfilter::_Meta = NULL; +daeMetaElement * domFx_samplerCUBE_common::domMagfilter::_Meta = NULL; +daeMetaElement * domFx_samplerCUBE_common::domMipfilter::_Meta = NULL; +daeMetaElement * domFx_samplerCUBE_common::domBorder_color::_Meta = NULL; +daeMetaElement * domFx_samplerCUBE_common::domMipmap_maxlevel::_Meta = NULL; +daeMetaElement * domFx_samplerCUBE_common::domMipmap_bias::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_samplerDEPTH_common.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_samplerDEPTH_common.cpp new file mode 100644 index 00000000..5b9e65a4 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_samplerDEPTH_common.cpp @@ -0,0 +1,273 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domFx_samplerDEPTH_common::create(daeInt bytes) +{ + domFx_samplerDEPTH_commonRef ref = new(bytes) domFx_samplerDEPTH_common; + return ref; +} + + +daeMetaElement * +domFx_samplerDEPTH_common::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "fx_samplerDEPTH_common" ); + _Meta->registerClass(domFx_samplerDEPTH_common::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "source" ); + mea->setOffset( daeOffsetOf(domFx_samplerDEPTH_common,elemSource) ); + mea->setElementType( domFx_samplerDEPTH_common::domSource::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 0, 1 ); + mea->setName( "wrap_s" ); + mea->setOffset( daeOffsetOf(domFx_samplerDEPTH_common,elemWrap_s) ); + mea->setElementType( domFx_samplerDEPTH_common::domWrap_s::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 2, 0, 1 ); + mea->setName( "wrap_t" ); + mea->setOffset( daeOffsetOf(domFx_samplerDEPTH_common,elemWrap_t) ); + mea->setElementType( domFx_samplerDEPTH_common::domWrap_t::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 3, 0, 1 ); + mea->setName( "minfilter" ); + mea->setOffset( daeOffsetOf(domFx_samplerDEPTH_common,elemMinfilter) ); + mea->setElementType( domFx_samplerDEPTH_common::domMinfilter::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 4, 0, 1 ); + mea->setName( "magfilter" ); + mea->setOffset( daeOffsetOf(domFx_samplerDEPTH_common,elemMagfilter) ); + mea->setElementType( domFx_samplerDEPTH_common::domMagfilter::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 5, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domFx_samplerDEPTH_common,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 5 ); + _Meta->setCMRoot( cm ); + + + _Meta->setElementSize(sizeof(domFx_samplerDEPTH_common)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_samplerDEPTH_common::domSource::create(daeInt bytes) +{ + domFx_samplerDEPTH_common::domSourceRef ref = new(bytes) domFx_samplerDEPTH_common::domSource; + return ref; +} + + +daeMetaElement * +domFx_samplerDEPTH_common::domSource::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "source" ); + _Meta->registerClass(domFx_samplerDEPTH_common::domSource::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domFx_samplerDEPTH_common::domSource , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_samplerDEPTH_common::domSource)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_samplerDEPTH_common::domWrap_s::create(daeInt bytes) +{ + domFx_samplerDEPTH_common::domWrap_sRef ref = new(bytes) domFx_samplerDEPTH_common::domWrap_s; + return ref; +} + + +daeMetaElement * +domFx_samplerDEPTH_common::domWrap_s::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "wrap_s" ); + _Meta->registerClass(domFx_samplerDEPTH_common::domWrap_s::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Fx_sampler_wrap_common")); + ma->setOffset( daeOffsetOf( domFx_samplerDEPTH_common::domWrap_s , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_samplerDEPTH_common::domWrap_s)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_samplerDEPTH_common::domWrap_t::create(daeInt bytes) +{ + domFx_samplerDEPTH_common::domWrap_tRef ref = new(bytes) domFx_samplerDEPTH_common::domWrap_t; + return ref; +} + + +daeMetaElement * +domFx_samplerDEPTH_common::domWrap_t::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "wrap_t" ); + _Meta->registerClass(domFx_samplerDEPTH_common::domWrap_t::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Fx_sampler_wrap_common")); + ma->setOffset( daeOffsetOf( domFx_samplerDEPTH_common::domWrap_t , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_samplerDEPTH_common::domWrap_t)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_samplerDEPTH_common::domMinfilter::create(daeInt bytes) +{ + domFx_samplerDEPTH_common::domMinfilterRef ref = new(bytes) domFx_samplerDEPTH_common::domMinfilter; + return ref; +} + + +daeMetaElement * +domFx_samplerDEPTH_common::domMinfilter::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "minfilter" ); + _Meta->registerClass(domFx_samplerDEPTH_common::domMinfilter::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Fx_sampler_filter_common")); + ma->setOffset( daeOffsetOf( domFx_samplerDEPTH_common::domMinfilter , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_samplerDEPTH_common::domMinfilter)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_samplerDEPTH_common::domMagfilter::create(daeInt bytes) +{ + domFx_samplerDEPTH_common::domMagfilterRef ref = new(bytes) domFx_samplerDEPTH_common::domMagfilter; + return ref; +} + + +daeMetaElement * +domFx_samplerDEPTH_common::domMagfilter::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "magfilter" ); + _Meta->registerClass(domFx_samplerDEPTH_common::domMagfilter::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Fx_sampler_filter_common")); + ma->setOffset( daeOffsetOf( domFx_samplerDEPTH_common::domMagfilter , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_samplerDEPTH_common::domMagfilter)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domFx_samplerDEPTH_common::_Meta = NULL; +daeMetaElement * domFx_samplerDEPTH_common::domSource::_Meta = NULL; +daeMetaElement * domFx_samplerDEPTH_common::domWrap_s::_Meta = NULL; +daeMetaElement * domFx_samplerDEPTH_common::domWrap_t::_Meta = NULL; +daeMetaElement * domFx_samplerDEPTH_common::domMinfilter::_Meta = NULL; +daeMetaElement * domFx_samplerDEPTH_common::domMagfilter::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_samplerRECT_common.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_samplerRECT_common.cpp new file mode 100644 index 00000000..04140933 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_samplerRECT_common.cpp @@ -0,0 +1,441 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domFx_samplerRECT_common::create(daeInt bytes) +{ + domFx_samplerRECT_commonRef ref = new(bytes) domFx_samplerRECT_common; + return ref; +} + + +daeMetaElement * +domFx_samplerRECT_common::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "fx_samplerRECT_common" ); + _Meta->registerClass(domFx_samplerRECT_common::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "source" ); + mea->setOffset( daeOffsetOf(domFx_samplerRECT_common,elemSource) ); + mea->setElementType( domFx_samplerRECT_common::domSource::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 0, 1 ); + mea->setName( "wrap_s" ); + mea->setOffset( daeOffsetOf(domFx_samplerRECT_common,elemWrap_s) ); + mea->setElementType( domFx_samplerRECT_common::domWrap_s::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 2, 0, 1 ); + mea->setName( "wrap_t" ); + mea->setOffset( daeOffsetOf(domFx_samplerRECT_common,elemWrap_t) ); + mea->setElementType( domFx_samplerRECT_common::domWrap_t::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 3, 0, 1 ); + mea->setName( "minfilter" ); + mea->setOffset( daeOffsetOf(domFx_samplerRECT_common,elemMinfilter) ); + mea->setElementType( domFx_samplerRECT_common::domMinfilter::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 4, 0, 1 ); + mea->setName( "magfilter" ); + mea->setOffset( daeOffsetOf(domFx_samplerRECT_common,elemMagfilter) ); + mea->setElementType( domFx_samplerRECT_common::domMagfilter::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 5, 0, 1 ); + mea->setName( "mipfilter" ); + mea->setOffset( daeOffsetOf(domFx_samplerRECT_common,elemMipfilter) ); + mea->setElementType( domFx_samplerRECT_common::domMipfilter::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 6, 0, 1 ); + mea->setName( "border_color" ); + mea->setOffset( daeOffsetOf(domFx_samplerRECT_common,elemBorder_color) ); + mea->setElementType( domFx_samplerRECT_common::domBorder_color::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 7, 0, 1 ); + mea->setName( "mipmap_maxlevel" ); + mea->setOffset( daeOffsetOf(domFx_samplerRECT_common,elemMipmap_maxlevel) ); + mea->setElementType( domFx_samplerRECT_common::domMipmap_maxlevel::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 8, 0, 1 ); + mea->setName( "mipmap_bias" ); + mea->setOffset( daeOffsetOf(domFx_samplerRECT_common,elemMipmap_bias) ); + mea->setElementType( domFx_samplerRECT_common::domMipmap_bias::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 9, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domFx_samplerRECT_common,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 9 ); + _Meta->setCMRoot( cm ); + + + _Meta->setElementSize(sizeof(domFx_samplerRECT_common)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_samplerRECT_common::domSource::create(daeInt bytes) +{ + domFx_samplerRECT_common::domSourceRef ref = new(bytes) domFx_samplerRECT_common::domSource; + return ref; +} + + +daeMetaElement * +domFx_samplerRECT_common::domSource::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "source" ); + _Meta->registerClass(domFx_samplerRECT_common::domSource::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domFx_samplerRECT_common::domSource , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_samplerRECT_common::domSource)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_samplerRECT_common::domWrap_s::create(daeInt bytes) +{ + domFx_samplerRECT_common::domWrap_sRef ref = new(bytes) domFx_samplerRECT_common::domWrap_s; + return ref; +} + + +daeMetaElement * +domFx_samplerRECT_common::domWrap_s::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "wrap_s" ); + _Meta->registerClass(domFx_samplerRECT_common::domWrap_s::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Fx_sampler_wrap_common")); + ma->setOffset( daeOffsetOf( domFx_samplerRECT_common::domWrap_s , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_samplerRECT_common::domWrap_s)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_samplerRECT_common::domWrap_t::create(daeInt bytes) +{ + domFx_samplerRECT_common::domWrap_tRef ref = new(bytes) domFx_samplerRECT_common::domWrap_t; + return ref; +} + + +daeMetaElement * +domFx_samplerRECT_common::domWrap_t::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "wrap_t" ); + _Meta->registerClass(domFx_samplerRECT_common::domWrap_t::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Fx_sampler_wrap_common")); + ma->setOffset( daeOffsetOf( domFx_samplerRECT_common::domWrap_t , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_samplerRECT_common::domWrap_t)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_samplerRECT_common::domMinfilter::create(daeInt bytes) +{ + domFx_samplerRECT_common::domMinfilterRef ref = new(bytes) domFx_samplerRECT_common::domMinfilter; + return ref; +} + + +daeMetaElement * +domFx_samplerRECT_common::domMinfilter::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "minfilter" ); + _Meta->registerClass(domFx_samplerRECT_common::domMinfilter::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Fx_sampler_filter_common")); + ma->setOffset( daeOffsetOf( domFx_samplerRECT_common::domMinfilter , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_samplerRECT_common::domMinfilter)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_samplerRECT_common::domMagfilter::create(daeInt bytes) +{ + domFx_samplerRECT_common::domMagfilterRef ref = new(bytes) domFx_samplerRECT_common::domMagfilter; + return ref; +} + + +daeMetaElement * +domFx_samplerRECT_common::domMagfilter::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "magfilter" ); + _Meta->registerClass(domFx_samplerRECT_common::domMagfilter::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Fx_sampler_filter_common")); + ma->setOffset( daeOffsetOf( domFx_samplerRECT_common::domMagfilter , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_samplerRECT_common::domMagfilter)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_samplerRECT_common::domMipfilter::create(daeInt bytes) +{ + domFx_samplerRECT_common::domMipfilterRef ref = new(bytes) domFx_samplerRECT_common::domMipfilter; + return ref; +} + + +daeMetaElement * +domFx_samplerRECT_common::domMipfilter::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "mipfilter" ); + _Meta->registerClass(domFx_samplerRECT_common::domMipfilter::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Fx_sampler_filter_common")); + ma->setOffset( daeOffsetOf( domFx_samplerRECT_common::domMipfilter , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_samplerRECT_common::domMipfilter)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_samplerRECT_common::domBorder_color::create(daeInt bytes) +{ + domFx_samplerRECT_common::domBorder_colorRef ref = new(bytes) domFx_samplerRECT_common::domBorder_color; + return ref; +} + + +daeMetaElement * +domFx_samplerRECT_common::domBorder_color::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "border_color" ); + _Meta->registerClass(domFx_samplerRECT_common::domBorder_color::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Fx_color_common")); + ma->setOffset( daeOffsetOf( domFx_samplerRECT_common::domBorder_color , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_samplerRECT_common::domBorder_color)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_samplerRECT_common::domMipmap_maxlevel::create(daeInt bytes) +{ + domFx_samplerRECT_common::domMipmap_maxlevelRef ref = new(bytes) domFx_samplerRECT_common::domMipmap_maxlevel; + return ref; +} + + +daeMetaElement * +domFx_samplerRECT_common::domMipmap_maxlevel::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "mipmap_maxlevel" ); + _Meta->registerClass(domFx_samplerRECT_common::domMipmap_maxlevel::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("xsUnsignedByte")); + ma->setOffset( daeOffsetOf( domFx_samplerRECT_common::domMipmap_maxlevel , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_samplerRECT_common::domMipmap_maxlevel)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_samplerRECT_common::domMipmap_bias::create(daeInt bytes) +{ + domFx_samplerRECT_common::domMipmap_biasRef ref = new(bytes) domFx_samplerRECT_common::domMipmap_bias; + return ref; +} + + +daeMetaElement * +domFx_samplerRECT_common::domMipmap_bias::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "mipmap_bias" ); + _Meta->registerClass(domFx_samplerRECT_common::domMipmap_bias::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("xsFloat")); + ma->setOffset( daeOffsetOf( domFx_samplerRECT_common::domMipmap_bias , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_samplerRECT_common::domMipmap_bias)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domFx_samplerRECT_common::_Meta = NULL; +daeMetaElement * domFx_samplerRECT_common::domSource::_Meta = NULL; +daeMetaElement * domFx_samplerRECT_common::domWrap_s::_Meta = NULL; +daeMetaElement * domFx_samplerRECT_common::domWrap_t::_Meta = NULL; +daeMetaElement * domFx_samplerRECT_common::domMinfilter::_Meta = NULL; +daeMetaElement * domFx_samplerRECT_common::domMagfilter::_Meta = NULL; +daeMetaElement * domFx_samplerRECT_common::domMipfilter::_Meta = NULL; +daeMetaElement * domFx_samplerRECT_common::domBorder_color::_Meta = NULL; +daeMetaElement * domFx_samplerRECT_common::domMipmap_maxlevel::_Meta = NULL; +daeMetaElement * domFx_samplerRECT_common::domMipmap_bias::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_stenciltarget_common.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_stenciltarget_common.cpp new file mode 100644 index 00000000..2c376ee7 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_stenciltarget_common.cpp @@ -0,0 +1,112 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domFx_stenciltarget_common::create(daeInt bytes) +{ + domFx_stenciltarget_commonRef ref = new(bytes) domFx_stenciltarget_common; + return ref; +} + + +daeMetaElement * +domFx_stenciltarget_common::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "fx_stenciltarget_common" ); + _Meta->registerClass(domFx_stenciltarget_common::create, &_Meta); + + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domFx_stenciltarget_common , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + // Add attribute: index + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "index" ); + ma->setType( daeAtomicType::get("xsNonNegativeInteger")); + ma->setOffset( daeOffsetOf( domFx_stenciltarget_common , attrIndex )); + ma->setContainer( _Meta ); + ma->setDefault( "0"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: face + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "face" ); + ma->setType( daeAtomicType::get("Fx_surface_face_enum")); + ma->setOffset( daeOffsetOf( domFx_stenciltarget_common , attrFace )); + ma->setContainer( _Meta ); + ma->setDefault( "POSITIVE_X"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: mip + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "mip" ); + ma->setType( daeAtomicType::get("xsNonNegativeInteger")); + ma->setOffset( daeOffsetOf( domFx_stenciltarget_common , attrMip )); + ma->setContainer( _Meta ); + ma->setDefault( "0"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: slice + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "slice" ); + ma->setType( daeAtomicType::get("xsNonNegativeInteger")); + ma->setOffset( daeOffsetOf( domFx_stenciltarget_common , attrSlice )); + ma->setContainer( _Meta ); + ma->setDefault( "0"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_stenciltarget_common)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domFx_stenciltarget_common::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_surface_common.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_surface_common.cpp new file mode 100644 index 00000000..b2fd4784 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_surface_common.cpp @@ -0,0 +1,322 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domFx_surface_common::create(daeInt bytes) +{ + domFx_surface_commonRef ref = new(bytes) domFx_surface_common; + return ref; +} + + +daeMetaElement * +domFx_surface_common::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "fx_surface_common" ); + _Meta->registerClass(domFx_surface_common::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 0, 1 ); + mea->setName( "fx_surface_init_common" ); + mea->setOffset( daeOffsetOf(domFx_surface_common,elemFx_surface_init_common) ); + mea->setElementType( domFx_surface_init_common::registerElement() ); + cm->appendChild( new daeMetaGroup( mea, _Meta, cm, 0, 0, 1 ) ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 0, 1 ); + mea->setName( "format" ); + mea->setOffset( daeOffsetOf(domFx_surface_common,elemFormat) ); + mea->setElementType( domFx_surface_common::domFormat::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 2, 0, 1 ); + mea->setName( "format_hint" ); + mea->setOffset( daeOffsetOf(domFx_surface_common,elemFormat_hint) ); + mea->setElementType( domFx_surface_format_hint_common::registerElement() ); + cm->appendChild( mea ); + + cm = new daeMetaChoice( _Meta, cm, 3, 0, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "size" ); + mea->setOffset( daeOffsetOf(domFx_surface_common,elemSize) ); + mea->setElementType( domFx_surface_common::domSize::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "viewport_ratio" ); + mea->setOffset( daeOffsetOf(domFx_surface_common,elemViewport_ratio) ); + mea->setElementType( domFx_surface_common::domViewport_ratio::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + cm->getParent()->appendChild( cm ); + cm = cm->getParent(); + + mea = new daeMetaElementAttribute( _Meta, cm, 4, 0, 1 ); + mea->setName( "mip_levels" ); + mea->setOffset( daeOffsetOf(domFx_surface_common,elemMip_levels) ); + mea->setElementType( domFx_surface_common::domMip_levels::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 5, 0, 1 ); + mea->setName( "mipmap_generate" ); + mea->setOffset( daeOffsetOf(domFx_surface_common,elemMipmap_generate) ); + mea->setElementType( domFx_surface_common::domMipmap_generate::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 6, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domFx_surface_common,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 6 ); + _Meta->setCMRoot( cm ); + // Ordered list of sub-elements + _Meta->addContents(daeOffsetOf(domFx_surface_common,_contents)); + _Meta->addContentsOrder(daeOffsetOf(domFx_surface_common,_contentsOrder)); + + + // Add attribute: type + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "type" ); + ma->setType( daeAtomicType::get("Fx_surface_type_enum")); + ma->setOffset( daeOffsetOf( domFx_surface_common , attrType )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_surface_common)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_surface_common::domFormat::create(daeInt bytes) +{ + domFx_surface_common::domFormatRef ref = new(bytes) domFx_surface_common::domFormat; + return ref; +} + + +daeMetaElement * +domFx_surface_common::domFormat::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "format" ); + _Meta->registerClass(domFx_surface_common::domFormat::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("xsToken")); + ma->setOffset( daeOffsetOf( domFx_surface_common::domFormat , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_surface_common::domFormat)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_surface_common::domSize::create(daeInt bytes) +{ + domFx_surface_common::domSizeRef ref = new(bytes) domFx_surface_common::domSize; + return ref; +} + + +daeMetaElement * +domFx_surface_common::domSize::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "size" ); + _Meta->registerClass(domFx_surface_common::domSize::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Int3")); + ma->setOffset( daeOffsetOf( domFx_surface_common::domSize , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_surface_common::domSize)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_surface_common::domViewport_ratio::create(daeInt bytes) +{ + domFx_surface_common::domViewport_ratioRef ref = new(bytes) domFx_surface_common::domViewport_ratio; + return ref; +} + + +daeMetaElement * +domFx_surface_common::domViewport_ratio::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "viewport_ratio" ); + _Meta->registerClass(domFx_surface_common::domViewport_ratio::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Float2")); + ma->setOffset( daeOffsetOf( domFx_surface_common::domViewport_ratio , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_surface_common::domViewport_ratio)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_surface_common::domMip_levels::create(daeInt bytes) +{ + domFx_surface_common::domMip_levelsRef ref = new(bytes) domFx_surface_common::domMip_levels; + return ref; +} + + +daeMetaElement * +domFx_surface_common::domMip_levels::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "mip_levels" ); + _Meta->registerClass(domFx_surface_common::domMip_levels::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("xsUnsignedInt")); + ma->setOffset( daeOffsetOf( domFx_surface_common::domMip_levels , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_surface_common::domMip_levels)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_surface_common::domMipmap_generate::create(daeInt bytes) +{ + domFx_surface_common::domMipmap_generateRef ref = new(bytes) domFx_surface_common::domMipmap_generate; + return ref; +} + + +daeMetaElement * +domFx_surface_common::domMipmap_generate::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "mipmap_generate" ); + _Meta->registerClass(domFx_surface_common::domMipmap_generate::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("xsBoolean")); + ma->setOffset( daeOffsetOf( domFx_surface_common::domMipmap_generate , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_surface_common::domMipmap_generate)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domFx_surface_common::_Meta = NULL; +daeMetaElement * domFx_surface_common::domFormat::_Meta = NULL; +daeMetaElement * domFx_surface_common::domSize::_Meta = NULL; +daeMetaElement * domFx_surface_common::domViewport_ratio::_Meta = NULL; +daeMetaElement * domFx_surface_common::domMip_levels::_Meta = NULL; +daeMetaElement * domFx_surface_common::domMipmap_generate::_Meta = NULL; + + +//Backwards Compatibility functions +domFx_surface_common_complexType::domInit_from_Array &domFx_surface_common_complexType::getInit_from_array() { + if (elemFx_surface_init_common != NULL ) { + return elemFx_surface_init_common->getInit_from_array(); + } + return emptyArray; +} + +const domFx_surface_common_complexType::domInit_from_Array &domFx_surface_common_complexType::getInit_from_array() const { + if (elemFx_surface_init_common != NULL ) { + return elemFx_surface_init_common->getInit_from_array(); + } + return emptyArray; +} + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_surface_format_hint_common.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_surface_format_hint_common.cpp new file mode 100644 index 00000000..15417168 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_surface_format_hint_common.cpp @@ -0,0 +1,231 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domFx_surface_format_hint_common::create(daeInt bytes) +{ + domFx_surface_format_hint_commonRef ref = new(bytes) domFx_surface_format_hint_common; + return ref; +} + + +daeMetaElement * +domFx_surface_format_hint_common::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "fx_surface_format_hint_common" ); + _Meta->registerClass(domFx_surface_format_hint_common::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "channels" ); + mea->setOffset( daeOffsetOf(domFx_surface_format_hint_common,elemChannels) ); + mea->setElementType( domFx_surface_format_hint_common::domChannels::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 1, 1 ); + mea->setName( "range" ); + mea->setOffset( daeOffsetOf(domFx_surface_format_hint_common,elemRange) ); + mea->setElementType( domFx_surface_format_hint_common::domRange::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 2, 0, 1 ); + mea->setName( "precision" ); + mea->setOffset( daeOffsetOf(domFx_surface_format_hint_common,elemPrecision) ); + mea->setElementType( domFx_surface_format_hint_common::domPrecision::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 3, 0, -1 ); + mea->setName( "option" ); + mea->setOffset( daeOffsetOf(domFx_surface_format_hint_common,elemOption_array) ); + mea->setElementType( domFx_surface_format_hint_common::domOption::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 4, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domFx_surface_format_hint_common,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 4 ); + _Meta->setCMRoot( cm ); + + + _Meta->setElementSize(sizeof(domFx_surface_format_hint_common)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_surface_format_hint_common::domChannels::create(daeInt bytes) +{ + domFx_surface_format_hint_common::domChannelsRef ref = new(bytes) domFx_surface_format_hint_common::domChannels; + return ref; +} + + +daeMetaElement * +domFx_surface_format_hint_common::domChannels::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "channels" ); + _Meta->registerClass(domFx_surface_format_hint_common::domChannels::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Fx_surface_format_hint_channels_enum")); + ma->setOffset( daeOffsetOf( domFx_surface_format_hint_common::domChannels , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_surface_format_hint_common::domChannels)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_surface_format_hint_common::domRange::create(daeInt bytes) +{ + domFx_surface_format_hint_common::domRangeRef ref = new(bytes) domFx_surface_format_hint_common::domRange; + return ref; +} + + +daeMetaElement * +domFx_surface_format_hint_common::domRange::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "range" ); + _Meta->registerClass(domFx_surface_format_hint_common::domRange::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Fx_surface_format_hint_range_enum")); + ma->setOffset( daeOffsetOf( domFx_surface_format_hint_common::domRange , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_surface_format_hint_common::domRange)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_surface_format_hint_common::domPrecision::create(daeInt bytes) +{ + domFx_surface_format_hint_common::domPrecisionRef ref = new(bytes) domFx_surface_format_hint_common::domPrecision; + return ref; +} + + +daeMetaElement * +domFx_surface_format_hint_common::domPrecision::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "precision" ); + _Meta->registerClass(domFx_surface_format_hint_common::domPrecision::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Fx_surface_format_hint_precision_enum")); + ma->setOffset( daeOffsetOf( domFx_surface_format_hint_common::domPrecision , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_surface_format_hint_common::domPrecision)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_surface_format_hint_common::domOption::create(daeInt bytes) +{ + domFx_surface_format_hint_common::domOptionRef ref = new(bytes) domFx_surface_format_hint_common::domOption; + return ref; +} + + +daeMetaElement * +domFx_surface_format_hint_common::domOption::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "option" ); + _Meta->registerClass(domFx_surface_format_hint_common::domOption::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Fx_surface_format_hint_option_enum")); + ma->setOffset( daeOffsetOf( domFx_surface_format_hint_common::domOption , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_surface_format_hint_common::domOption)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domFx_surface_format_hint_common::_Meta = NULL; +daeMetaElement * domFx_surface_format_hint_common::domChannels::_Meta = NULL; +daeMetaElement * domFx_surface_format_hint_common::domRange::_Meta = NULL; +daeMetaElement * domFx_surface_format_hint_common::domPrecision::_Meta = NULL; +daeMetaElement * domFx_surface_format_hint_common::domOption::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_surface_init_common.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_surface_init_common.cpp new file mode 100644 index 00000000..47499ec8 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_surface_init_common.cpp @@ -0,0 +1,152 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domFx_surface_init_common::create(daeInt bytes) +{ + domFx_surface_init_commonRef ref = new(bytes) domFx_surface_init_common; + return ref; +} + + +daeMetaElement * +domFx_surface_init_common::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "fx_surface_init_common" ); + _Meta->registerClass(domFx_surface_init_common::create, &_Meta); + + _Meta->setIsTransparent( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaChoice( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "init_as_null" ); + mea->setOffset( daeOffsetOf(domFx_surface_init_common,elemInit_as_null) ); + mea->setElementType( domFx_surface_init_common::domInit_as_null::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "init_as_target" ); + mea->setOffset( daeOffsetOf(domFx_surface_init_common,elemInit_as_target) ); + mea->setElementType( domFx_surface_init_common::domInit_as_target::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "init_cube" ); + mea->setOffset( daeOffsetOf(domFx_surface_init_common,elemInit_cube) ); + mea->setElementType( domFx_surface_init_cube_common::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "init_volume" ); + mea->setOffset( daeOffsetOf(domFx_surface_init_common,elemInit_volume) ); + mea->setElementType( domFx_surface_init_volume_common::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "init_planar" ); + mea->setOffset( daeOffsetOf(domFx_surface_init_common,elemInit_planar) ); + mea->setElementType( domFx_surface_init_planar_common::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, -1 ); + mea->setName( "init_from" ); + mea->setOffset( daeOffsetOf(domFx_surface_init_common,elemInit_from_array) ); + mea->setElementType( domFx_surface_init_from_common::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + _Meta->setCMRoot( cm ); + // Ordered list of sub-elements + _Meta->addContents(daeOffsetOf(domFx_surface_init_common,_contents)); + _Meta->addContentsOrder(daeOffsetOf(domFx_surface_init_common,_contentsOrder)); + + + + _Meta->setElementSize(sizeof(domFx_surface_init_common)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_surface_init_common::domInit_as_null::create(daeInt bytes) +{ + domFx_surface_init_common::domInit_as_nullRef ref = new(bytes) domFx_surface_init_common::domInit_as_null; + return ref; +} + + +daeMetaElement * +domFx_surface_init_common::domInit_as_null::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "init_as_null" ); + _Meta->registerClass(domFx_surface_init_common::domInit_as_null::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + + _Meta->setElementSize(sizeof(domFx_surface_init_common::domInit_as_null)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_surface_init_common::domInit_as_target::create(daeInt bytes) +{ + domFx_surface_init_common::domInit_as_targetRef ref = new(bytes) domFx_surface_init_common::domInit_as_target; + return ref; +} + + +daeMetaElement * +domFx_surface_init_common::domInit_as_target::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "init_as_target" ); + _Meta->registerClass(domFx_surface_init_common::domInit_as_target::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + + _Meta->setElementSize(sizeof(domFx_surface_init_common::domInit_as_target)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domFx_surface_init_common::_Meta = NULL; +daeMetaElement * domFx_surface_init_common::domInit_as_null::_Meta = NULL; +daeMetaElement * domFx_surface_init_common::domInit_as_target::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_surface_init_cube_common.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_surface_init_cube_common.cpp new file mode 100644 index 00000000..81ea80a3 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_surface_init_cube_common.cpp @@ -0,0 +1,244 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domFx_surface_init_cube_common::create(daeInt bytes) +{ + domFx_surface_init_cube_commonRef ref = new(bytes) domFx_surface_init_cube_common; + return ref; +} + + +daeMetaElement * +domFx_surface_init_cube_common::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "fx_surface_init_cube_common" ); + _Meta->registerClass(domFx_surface_init_cube_common::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaChoice( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "all" ); + mea->setOffset( daeOffsetOf(domFx_surface_init_cube_common,elemAll) ); + mea->setElementType( domFx_surface_init_cube_common::domAll::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "primary" ); + mea->setOffset( daeOffsetOf(domFx_surface_init_cube_common,elemPrimary) ); + mea->setElementType( domFx_surface_init_cube_common::domPrimary::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 6, 6 ); + mea->setName( "face" ); + mea->setOffset( daeOffsetOf(domFx_surface_init_cube_common,elemFace_array) ); + mea->setElementType( domFx_surface_init_cube_common::domFace::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + _Meta->setCMRoot( cm ); + // Ordered list of sub-elements + _Meta->addContents(daeOffsetOf(domFx_surface_init_cube_common,_contents)); + _Meta->addContentsOrder(daeOffsetOf(domFx_surface_init_cube_common,_contentsOrder)); + + + + _Meta->setElementSize(sizeof(domFx_surface_init_cube_common)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_surface_init_cube_common::domAll::create(daeInt bytes) +{ + domFx_surface_init_cube_common::domAllRef ref = new(bytes) domFx_surface_init_cube_common::domAll; + return ref; +} + + +daeMetaElement * +domFx_surface_init_cube_common::domAll::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "all" ); + _Meta->registerClass(domFx_surface_init_cube_common::domAll::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: ref + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "ref" ); + ma->setType( daeAtomicType::get("xsIDREF")); + ma->setOffset( daeOffsetOf( domFx_surface_init_cube_common::domAll , attrRef )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_surface_init_cube_common::domAll)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_surface_init_cube_common::domPrimary::create(daeInt bytes) +{ + domFx_surface_init_cube_common::domPrimaryRef ref = new(bytes) domFx_surface_init_cube_common::domPrimary; + return ref; +} + + +daeMetaElement * +domFx_surface_init_cube_common::domPrimary::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "primary" ); + _Meta->registerClass(domFx_surface_init_cube_common::domPrimary::create, &_Meta); + + _Meta->setIsInnerClass( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 0, 1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 6, 6 ); + mea->setName( "order" ); + mea->setOffset( daeOffsetOf(domFx_surface_init_cube_common::domPrimary,elemOrder_array) ); + mea->setElementType( domFx_surface_init_cube_common::domPrimary::domOrder::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + _Meta->setCMRoot( cm ); + + // Add attribute: ref + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "ref" ); + ma->setType( daeAtomicType::get("xsIDREF")); + ma->setOffset( daeOffsetOf( domFx_surface_init_cube_common::domPrimary , attrRef )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_surface_init_cube_common::domPrimary)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_surface_init_cube_common::domPrimary::domOrder::create(daeInt bytes) +{ + domFx_surface_init_cube_common::domPrimary::domOrderRef ref = new(bytes) domFx_surface_init_cube_common::domPrimary::domOrder; + return ref; +} + + +daeMetaElement * +domFx_surface_init_cube_common::domPrimary::domOrder::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "order" ); + _Meta->registerClass(domFx_surface_init_cube_common::domPrimary::domOrder::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Fx_surface_face_enum")); + ma->setOffset( daeOffsetOf( domFx_surface_init_cube_common::domPrimary::domOrder , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_surface_init_cube_common::domPrimary::domOrder)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_surface_init_cube_common::domFace::create(daeInt bytes) +{ + domFx_surface_init_cube_common::domFaceRef ref = new(bytes) domFx_surface_init_cube_common::domFace; + return ref; +} + + +daeMetaElement * +domFx_surface_init_cube_common::domFace::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "face" ); + _Meta->registerClass(domFx_surface_init_cube_common::domFace::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: ref + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "ref" ); + ma->setType( daeAtomicType::get("xsIDREF")); + ma->setOffset( daeOffsetOf( domFx_surface_init_cube_common::domFace , attrRef )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_surface_init_cube_common::domFace)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domFx_surface_init_cube_common::_Meta = NULL; +daeMetaElement * domFx_surface_init_cube_common::domAll::_Meta = NULL; +daeMetaElement * domFx_surface_init_cube_common::domPrimary::_Meta = NULL; +daeMetaElement * domFx_surface_init_cube_common::domPrimary::domOrder::_Meta = NULL; +daeMetaElement * domFx_surface_init_cube_common::domFace::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_surface_init_from_common.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_surface_init_from_common.cpp new file mode 100644 index 00000000..5e8981ea --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_surface_init_from_common.cpp @@ -0,0 +1,96 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domFx_surface_init_from_common::create(daeInt bytes) +{ + domFx_surface_init_from_commonRef ref = new(bytes) domFx_surface_init_from_common; + return ref; +} + + +daeMetaElement * +domFx_surface_init_from_common::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "fx_surface_init_from_common" ); + _Meta->registerClass(domFx_surface_init_from_common::create, &_Meta); + + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("xsIDREF")); + ma->setOffset( daeOffsetOf( domFx_surface_init_from_common , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + // Add attribute: mip + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "mip" ); + ma->setType( daeAtomicType::get("xsUnsignedInt")); + ma->setOffset( daeOffsetOf( domFx_surface_init_from_common , attrMip )); + ma->setContainer( _Meta ); + ma->setDefault( "0"); + + _Meta->appendAttribute(ma); + } + + // Add attribute: slice + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "slice" ); + ma->setType( daeAtomicType::get("xsUnsignedInt")); + ma->setOffset( daeOffsetOf( domFx_surface_init_from_common , attrSlice )); + ma->setContainer( _Meta ); + ma->setDefault( "0"); + + _Meta->appendAttribute(ma); + } + + // Add attribute: face + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "face" ); + ma->setType( daeAtomicType::get("Fx_surface_face_enum")); + ma->setOffset( daeOffsetOf( domFx_surface_init_from_common , attrFace )); + ma->setContainer( _Meta ); + ma->setDefault( "POSITIVE_X"); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_surface_init_from_common)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domFx_surface_init_from_common::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_surface_init_planar_common.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_surface_init_planar_common.cpp new file mode 100644 index 00000000..4a6da000 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_surface_init_planar_common.cpp @@ -0,0 +1,101 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domFx_surface_init_planar_common::create(daeInt bytes) +{ + domFx_surface_init_planar_commonRef ref = new(bytes) domFx_surface_init_planar_common; + return ref; +} + + +daeMetaElement * +domFx_surface_init_planar_common::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "fx_surface_init_planar_common" ); + _Meta->registerClass(domFx_surface_init_planar_common::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaChoice( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "all" ); + mea->setOffset( daeOffsetOf(domFx_surface_init_planar_common,elemAll) ); + mea->setElementType( domFx_surface_init_planar_common::domAll::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + _Meta->setCMRoot( cm ); + + _Meta->setElementSize(sizeof(domFx_surface_init_planar_common)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_surface_init_planar_common::domAll::create(daeInt bytes) +{ + domFx_surface_init_planar_common::domAllRef ref = new(bytes) domFx_surface_init_planar_common::domAll; + return ref; +} + + +daeMetaElement * +domFx_surface_init_planar_common::domAll::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "all" ); + _Meta->registerClass(domFx_surface_init_planar_common::domAll::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: ref + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "ref" ); + ma->setType( daeAtomicType::get("xsIDREF")); + ma->setOffset( daeOffsetOf( domFx_surface_init_planar_common::domAll , attrRef )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_surface_init_planar_common::domAll)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domFx_surface_init_planar_common::_Meta = NULL; +daeMetaElement * domFx_surface_init_planar_common::domAll::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_surface_init_volume_common.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_surface_init_volume_common.cpp new file mode 100644 index 00000000..24450b42 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domFx_surface_init_volume_common.cpp @@ -0,0 +1,151 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domFx_surface_init_volume_common::create(daeInt bytes) +{ + domFx_surface_init_volume_commonRef ref = new(bytes) domFx_surface_init_volume_common; + return ref; +} + + +daeMetaElement * +domFx_surface_init_volume_common::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "fx_surface_init_volume_common" ); + _Meta->registerClass(domFx_surface_init_volume_common::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaChoice( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "all" ); + mea->setOffset( daeOffsetOf(domFx_surface_init_volume_common,elemAll) ); + mea->setElementType( domFx_surface_init_volume_common::domAll::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "primary" ); + mea->setOffset( daeOffsetOf(domFx_surface_init_volume_common,elemPrimary) ); + mea->setElementType( domFx_surface_init_volume_common::domPrimary::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + _Meta->setCMRoot( cm ); + // Ordered list of sub-elements + _Meta->addContents(daeOffsetOf(domFx_surface_init_volume_common,_contents)); + _Meta->addContentsOrder(daeOffsetOf(domFx_surface_init_volume_common,_contentsOrder)); + + + + _Meta->setElementSize(sizeof(domFx_surface_init_volume_common)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_surface_init_volume_common::domAll::create(daeInt bytes) +{ + domFx_surface_init_volume_common::domAllRef ref = new(bytes) domFx_surface_init_volume_common::domAll; + return ref; +} + + +daeMetaElement * +domFx_surface_init_volume_common::domAll::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "all" ); + _Meta->registerClass(domFx_surface_init_volume_common::domAll::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: ref + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "ref" ); + ma->setType( daeAtomicType::get("xsIDREF")); + ma->setOffset( daeOffsetOf( domFx_surface_init_volume_common::domAll , attrRef )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_surface_init_volume_common::domAll)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domFx_surface_init_volume_common::domPrimary::create(daeInt bytes) +{ + domFx_surface_init_volume_common::domPrimaryRef ref = new(bytes) domFx_surface_init_volume_common::domPrimary; + return ref; +} + + +daeMetaElement * +domFx_surface_init_volume_common::domPrimary::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "primary" ); + _Meta->registerClass(domFx_surface_init_volume_common::domPrimary::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: ref + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "ref" ); + ma->setType( daeAtomicType::get("xsIDREF")); + ma->setOffset( daeOffsetOf( domFx_surface_init_volume_common::domPrimary , attrRef )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domFx_surface_init_volume_common::domPrimary)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domFx_surface_init_volume_common::_Meta = NULL; +daeMetaElement * domFx_surface_init_volume_common::domAll::_Meta = NULL; +daeMetaElement * domFx_surface_init_volume_common::domPrimary::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGeometry.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGeometry.cpp new file mode 100644 index 00000000..52a5f397 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGeometry.cpp @@ -0,0 +1,119 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domGeometry::create(daeInt bytes) +{ + domGeometryRef ref = new(bytes) domGeometry; + return ref; +} + + +daeMetaElement * +domGeometry::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "geometry" ); + _Meta->registerClass(domGeometry::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 0, 1 ); + mea->setName( "asset" ); + mea->setOffset( daeOffsetOf(domGeometry,elemAsset) ); + mea->setElementType( domAsset::registerElement() ); + cm->appendChild( mea ); + + cm = new daeMetaChoice( _Meta, cm, 1, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "convex_mesh" ); + mea->setOffset( daeOffsetOf(domGeometry,elemConvex_mesh) ); + mea->setElementType( domConvex_mesh::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "mesh" ); + mea->setOffset( daeOffsetOf(domGeometry,elemMesh) ); + mea->setElementType( domMesh::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "spline" ); + mea->setOffset( daeOffsetOf(domGeometry,elemSpline) ); + mea->setElementType( domSpline::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + cm->getParent()->appendChild( cm ); + cm = cm->getParent(); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 2, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domGeometry,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 2 ); + _Meta->setCMRoot( cm ); + // Ordered list of sub-elements + _Meta->addContents(daeOffsetOf(domGeometry,_contents)); + _Meta->addContentsOrder(daeOffsetOf(domGeometry,_contentsOrder)); + + + // Add attribute: id + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "id" ); + ma->setType( daeAtomicType::get("xsID")); + ma->setOffset( daeOffsetOf( domGeometry , attrId )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: name + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "name" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGeometry , attrName )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGeometry)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domGeometry::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGl_hook_abstract.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGl_hook_abstract.cpp new file mode 100644 index 00000000..d0d12741 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGl_hook_abstract.cpp @@ -0,0 +1,52 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domGl_hook_abstract::create(daeInt bytes) +{ + domGl_hook_abstractRef ref = new(bytes) domGl_hook_abstract; + return ref; +} + + +daeMetaElement * +domGl_hook_abstract::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "gl_hook_abstract" ); + _Meta->registerClass(domGl_hook_abstract::create, &_Meta); + + _Meta->setIsAbstract( true ); + + + _Meta->setElementSize(sizeof(domGl_hook_abstract)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domGl_hook_abstract::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGl_pipeline_settings.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGl_pipeline_settings.cpp new file mode 100644 index 00000000..2872a85e --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGl_pipeline_settings.cpp @@ -0,0 +1,8371 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domGl_pipeline_settings::create(daeInt bytes) +{ + domGl_pipeline_settingsRef ref = new(bytes) domGl_pipeline_settings; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "gl_pipeline_settings" ); + _Meta->registerClass(domGl_pipeline_settings::create, &_Meta); + + _Meta->setIsTransparent( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaChoice( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "alpha_func" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemAlpha_func) ); + mea->setElementType( domGl_pipeline_settings::domAlpha_func::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "blend_func" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemBlend_func) ); + mea->setElementType( domGl_pipeline_settings::domBlend_func::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "blend_func_separate" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemBlend_func_separate) ); + mea->setElementType( domGl_pipeline_settings::domBlend_func_separate::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "blend_equation" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemBlend_equation) ); + mea->setElementType( domGl_pipeline_settings::domBlend_equation::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "blend_equation_separate" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemBlend_equation_separate) ); + mea->setElementType( domGl_pipeline_settings::domBlend_equation_separate::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "color_material" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemColor_material) ); + mea->setElementType( domGl_pipeline_settings::domColor_material::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "cull_face" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemCull_face) ); + mea->setElementType( domGl_pipeline_settings::domCull_face::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "depth_func" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemDepth_func) ); + mea->setElementType( domGl_pipeline_settings::domDepth_func::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "fog_mode" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemFog_mode) ); + mea->setElementType( domGl_pipeline_settings::domFog_mode::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "fog_coord_src" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemFog_coord_src) ); + mea->setElementType( domGl_pipeline_settings::domFog_coord_src::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "front_face" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemFront_face) ); + mea->setElementType( domGl_pipeline_settings::domFront_face::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "light_model_color_control" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemLight_model_color_control) ); + mea->setElementType( domGl_pipeline_settings::domLight_model_color_control::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "logic_op" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemLogic_op) ); + mea->setElementType( domGl_pipeline_settings::domLogic_op::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "polygon_mode" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemPolygon_mode) ); + mea->setElementType( domGl_pipeline_settings::domPolygon_mode::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "shade_model" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemShade_model) ); + mea->setElementType( domGl_pipeline_settings::domShade_model::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "stencil_func" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemStencil_func) ); + mea->setElementType( domGl_pipeline_settings::domStencil_func::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "stencil_op" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemStencil_op) ); + mea->setElementType( domGl_pipeline_settings::domStencil_op::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "stencil_func_separate" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemStencil_func_separate) ); + mea->setElementType( domGl_pipeline_settings::domStencil_func_separate::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "stencil_op_separate" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemStencil_op_separate) ); + mea->setElementType( domGl_pipeline_settings::domStencil_op_separate::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "stencil_mask_separate" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemStencil_mask_separate) ); + mea->setElementType( domGl_pipeline_settings::domStencil_mask_separate::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "light_enable" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemLight_enable) ); + mea->setElementType( domGl_pipeline_settings::domLight_enable::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "light_ambient" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemLight_ambient) ); + mea->setElementType( domGl_pipeline_settings::domLight_ambient::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "light_diffuse" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemLight_diffuse) ); + mea->setElementType( domGl_pipeline_settings::domLight_diffuse::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "light_specular" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemLight_specular) ); + mea->setElementType( domGl_pipeline_settings::domLight_specular::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "light_position" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemLight_position) ); + mea->setElementType( domGl_pipeline_settings::domLight_position::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "light_constant_attenuation" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemLight_constant_attenuation) ); + mea->setElementType( domGl_pipeline_settings::domLight_constant_attenuation::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "light_linear_attenuation" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemLight_linear_attenuation) ); + mea->setElementType( domGl_pipeline_settings::domLight_linear_attenuation::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "light_quadratic_attenuation" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemLight_quadratic_attenuation) ); + mea->setElementType( domGl_pipeline_settings::domLight_quadratic_attenuation::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "light_spot_cutoff" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemLight_spot_cutoff) ); + mea->setElementType( domGl_pipeline_settings::domLight_spot_cutoff::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "light_spot_direction" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemLight_spot_direction) ); + mea->setElementType( domGl_pipeline_settings::domLight_spot_direction::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "light_spot_exponent" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemLight_spot_exponent) ); + mea->setElementType( domGl_pipeline_settings::domLight_spot_exponent::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "texture1D" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemTexture1D) ); + mea->setElementType( domGl_pipeline_settings::domTexture1D::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "texture2D" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemTexture2D) ); + mea->setElementType( domGl_pipeline_settings::domTexture2D::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "texture3D" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemTexture3D) ); + mea->setElementType( domGl_pipeline_settings::domTexture3D::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "textureCUBE" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemTextureCUBE) ); + mea->setElementType( domGl_pipeline_settings::domTextureCUBE::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "textureRECT" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemTextureRECT) ); + mea->setElementType( domGl_pipeline_settings::domTextureRECT::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "textureDEPTH" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemTextureDEPTH) ); + mea->setElementType( domGl_pipeline_settings::domTextureDEPTH::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "texture1D_enable" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemTexture1D_enable) ); + mea->setElementType( domGl_pipeline_settings::domTexture1D_enable::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "texture2D_enable" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemTexture2D_enable) ); + mea->setElementType( domGl_pipeline_settings::domTexture2D_enable::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "texture3D_enable" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemTexture3D_enable) ); + mea->setElementType( domGl_pipeline_settings::domTexture3D_enable::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "textureCUBE_enable" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemTextureCUBE_enable) ); + mea->setElementType( domGl_pipeline_settings::domTextureCUBE_enable::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "textureRECT_enable" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemTextureRECT_enable) ); + mea->setElementType( domGl_pipeline_settings::domTextureRECT_enable::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "textureDEPTH_enable" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemTextureDEPTH_enable) ); + mea->setElementType( domGl_pipeline_settings::domTextureDEPTH_enable::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "texture_env_color" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemTexture_env_color) ); + mea->setElementType( domGl_pipeline_settings::domTexture_env_color::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "texture_env_mode" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemTexture_env_mode) ); + mea->setElementType( domGl_pipeline_settings::domTexture_env_mode::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "clip_plane" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemClip_plane) ); + mea->setElementType( domGl_pipeline_settings::domClip_plane::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "clip_plane_enable" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemClip_plane_enable) ); + mea->setElementType( domGl_pipeline_settings::domClip_plane_enable::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "blend_color" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemBlend_color) ); + mea->setElementType( domGl_pipeline_settings::domBlend_color::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "clear_color" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemClear_color) ); + mea->setElementType( domGl_pipeline_settings::domClear_color::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "clear_stencil" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemClear_stencil) ); + mea->setElementType( domGl_pipeline_settings::domClear_stencil::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "clear_depth" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemClear_depth) ); + mea->setElementType( domGl_pipeline_settings::domClear_depth::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "color_mask" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemColor_mask) ); + mea->setElementType( domGl_pipeline_settings::domColor_mask::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "depth_bounds" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemDepth_bounds) ); + mea->setElementType( domGl_pipeline_settings::domDepth_bounds::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "depth_mask" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemDepth_mask) ); + mea->setElementType( domGl_pipeline_settings::domDepth_mask::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "depth_range" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemDepth_range) ); + mea->setElementType( domGl_pipeline_settings::domDepth_range::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "fog_density" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemFog_density) ); + mea->setElementType( domGl_pipeline_settings::domFog_density::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "fog_start" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemFog_start) ); + mea->setElementType( domGl_pipeline_settings::domFog_start::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "fog_end" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemFog_end) ); + mea->setElementType( domGl_pipeline_settings::domFog_end::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "fog_color" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemFog_color) ); + mea->setElementType( domGl_pipeline_settings::domFog_color::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "light_model_ambient" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemLight_model_ambient) ); + mea->setElementType( domGl_pipeline_settings::domLight_model_ambient::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "lighting_enable" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemLighting_enable) ); + mea->setElementType( domGl_pipeline_settings::domLighting_enable::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "line_stipple" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemLine_stipple) ); + mea->setElementType( domGl_pipeline_settings::domLine_stipple::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "line_width" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemLine_width) ); + mea->setElementType( domGl_pipeline_settings::domLine_width::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "material_ambient" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemMaterial_ambient) ); + mea->setElementType( domGl_pipeline_settings::domMaterial_ambient::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "material_diffuse" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemMaterial_diffuse) ); + mea->setElementType( domGl_pipeline_settings::domMaterial_diffuse::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "material_emission" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemMaterial_emission) ); + mea->setElementType( domGl_pipeline_settings::domMaterial_emission::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "material_shininess" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemMaterial_shininess) ); + mea->setElementType( domGl_pipeline_settings::domMaterial_shininess::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "material_specular" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemMaterial_specular) ); + mea->setElementType( domGl_pipeline_settings::domMaterial_specular::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "model_view_matrix" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemModel_view_matrix) ); + mea->setElementType( domGl_pipeline_settings::domModel_view_matrix::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "point_distance_attenuation" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemPoint_distance_attenuation) ); + mea->setElementType( domGl_pipeline_settings::domPoint_distance_attenuation::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "point_fade_threshold_size" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemPoint_fade_threshold_size) ); + mea->setElementType( domGl_pipeline_settings::domPoint_fade_threshold_size::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "point_size" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemPoint_size) ); + mea->setElementType( domGl_pipeline_settings::domPoint_size::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "point_size_min" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemPoint_size_min) ); + mea->setElementType( domGl_pipeline_settings::domPoint_size_min::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "point_size_max" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemPoint_size_max) ); + mea->setElementType( domGl_pipeline_settings::domPoint_size_max::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "polygon_offset" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemPolygon_offset) ); + mea->setElementType( domGl_pipeline_settings::domPolygon_offset::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "projection_matrix" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemProjection_matrix) ); + mea->setElementType( domGl_pipeline_settings::domProjection_matrix::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "scissor" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemScissor) ); + mea->setElementType( domGl_pipeline_settings::domScissor::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "stencil_mask" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemStencil_mask) ); + mea->setElementType( domGl_pipeline_settings::domStencil_mask::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "alpha_test_enable" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemAlpha_test_enable) ); + mea->setElementType( domGl_pipeline_settings::domAlpha_test_enable::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "auto_normal_enable" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemAuto_normal_enable) ); + mea->setElementType( domGl_pipeline_settings::domAuto_normal_enable::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "blend_enable" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemBlend_enable) ); + mea->setElementType( domGl_pipeline_settings::domBlend_enable::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "color_logic_op_enable" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemColor_logic_op_enable) ); + mea->setElementType( domGl_pipeline_settings::domColor_logic_op_enable::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "color_material_enable" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemColor_material_enable) ); + mea->setElementType( domGl_pipeline_settings::domColor_material_enable::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "cull_face_enable" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemCull_face_enable) ); + mea->setElementType( domGl_pipeline_settings::domCull_face_enable::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "depth_bounds_enable" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemDepth_bounds_enable) ); + mea->setElementType( domGl_pipeline_settings::domDepth_bounds_enable::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "depth_clamp_enable" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemDepth_clamp_enable) ); + mea->setElementType( domGl_pipeline_settings::domDepth_clamp_enable::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "depth_test_enable" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemDepth_test_enable) ); + mea->setElementType( domGl_pipeline_settings::domDepth_test_enable::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "dither_enable" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemDither_enable) ); + mea->setElementType( domGl_pipeline_settings::domDither_enable::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "fog_enable" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemFog_enable) ); + mea->setElementType( domGl_pipeline_settings::domFog_enable::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "light_model_local_viewer_enable" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemLight_model_local_viewer_enable) ); + mea->setElementType( domGl_pipeline_settings::domLight_model_local_viewer_enable::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "light_model_two_side_enable" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemLight_model_two_side_enable) ); + mea->setElementType( domGl_pipeline_settings::domLight_model_two_side_enable::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "line_smooth_enable" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemLine_smooth_enable) ); + mea->setElementType( domGl_pipeline_settings::domLine_smooth_enable::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "line_stipple_enable" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemLine_stipple_enable) ); + mea->setElementType( domGl_pipeline_settings::domLine_stipple_enable::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "logic_op_enable" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemLogic_op_enable) ); + mea->setElementType( domGl_pipeline_settings::domLogic_op_enable::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "multisample_enable" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemMultisample_enable) ); + mea->setElementType( domGl_pipeline_settings::domMultisample_enable::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "normalize_enable" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemNormalize_enable) ); + mea->setElementType( domGl_pipeline_settings::domNormalize_enable::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "point_smooth_enable" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemPoint_smooth_enable) ); + mea->setElementType( domGl_pipeline_settings::domPoint_smooth_enable::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "polygon_offset_fill_enable" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemPolygon_offset_fill_enable) ); + mea->setElementType( domGl_pipeline_settings::domPolygon_offset_fill_enable::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "polygon_offset_line_enable" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemPolygon_offset_line_enable) ); + mea->setElementType( domGl_pipeline_settings::domPolygon_offset_line_enable::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "polygon_offset_point_enable" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemPolygon_offset_point_enable) ); + mea->setElementType( domGl_pipeline_settings::domPolygon_offset_point_enable::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "polygon_smooth_enable" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemPolygon_smooth_enable) ); + mea->setElementType( domGl_pipeline_settings::domPolygon_smooth_enable::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "polygon_stipple_enable" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemPolygon_stipple_enable) ); + mea->setElementType( domGl_pipeline_settings::domPolygon_stipple_enable::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "rescale_normal_enable" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemRescale_normal_enable) ); + mea->setElementType( domGl_pipeline_settings::domRescale_normal_enable::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "sample_alpha_to_coverage_enable" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemSample_alpha_to_coverage_enable) ); + mea->setElementType( domGl_pipeline_settings::domSample_alpha_to_coverage_enable::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "sample_alpha_to_one_enable" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemSample_alpha_to_one_enable) ); + mea->setElementType( domGl_pipeline_settings::domSample_alpha_to_one_enable::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "sample_coverage_enable" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemSample_coverage_enable) ); + mea->setElementType( domGl_pipeline_settings::domSample_coverage_enable::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "scissor_test_enable" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemScissor_test_enable) ); + mea->setElementType( domGl_pipeline_settings::domScissor_test_enable::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "stencil_test_enable" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemStencil_test_enable) ); + mea->setElementType( domGl_pipeline_settings::domStencil_test_enable::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "gl_hook_abstract" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings,elemGl_hook_abstract) ); + mea->setElementType( domGl_hook_abstract::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + _Meta->setCMRoot( cm ); + // Ordered list of sub-elements + _Meta->addContents(daeOffsetOf(domGl_pipeline_settings,_contents)); + _Meta->addContentsOrder(daeOffsetOf(domGl_pipeline_settings,_contentsOrder)); + + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domAlpha_func::create(daeInt bytes) +{ + domGl_pipeline_settings::domAlpha_funcRef ref = new(bytes) domGl_pipeline_settings::domAlpha_func; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domAlpha_func::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "alpha_func" ); + _Meta->registerClass(domGl_pipeline_settings::domAlpha_func::create, &_Meta); + + _Meta->setIsInnerClass( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "func" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings::domAlpha_func,elemFunc) ); + mea->setElementType( domGl_pipeline_settings::domAlpha_func::domFunc::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 1, 1 ); + mea->setName( "value" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings::domAlpha_func,elemValue) ); + mea->setElementType( domGl_pipeline_settings::domAlpha_func::domValue::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 1 ); + _Meta->setCMRoot( cm ); + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domAlpha_func)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domAlpha_func::domFunc::create(daeInt bytes) +{ + domGl_pipeline_settings::domAlpha_func::domFuncRef ref = new(bytes) domGl_pipeline_settings::domAlpha_func::domFunc; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domAlpha_func::domFunc::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "func" ); + _Meta->registerClass(domGl_pipeline_settings::domAlpha_func::domFunc::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Gl_func_type")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domAlpha_func::domFunc , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "ALWAYS"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domAlpha_func::domFunc , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domAlpha_func::domFunc)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domAlpha_func::domValue::create(daeInt bytes) +{ + domGl_pipeline_settings::domAlpha_func::domValueRef ref = new(bytes) domGl_pipeline_settings::domAlpha_func::domValue; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domAlpha_func::domValue::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "value" ); + _Meta->registerClass(domGl_pipeline_settings::domAlpha_func::domValue::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Gl_alpha_value_type")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domAlpha_func::domValue , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "0.0"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domAlpha_func::domValue , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domAlpha_func::domValue)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domBlend_func::create(daeInt bytes) +{ + domGl_pipeline_settings::domBlend_funcRef ref = new(bytes) domGl_pipeline_settings::domBlend_func; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domBlend_func::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "blend_func" ); + _Meta->registerClass(domGl_pipeline_settings::domBlend_func::create, &_Meta); + + _Meta->setIsInnerClass( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "src" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings::domBlend_func,elemSrc) ); + mea->setElementType( domGl_pipeline_settings::domBlend_func::domSrc::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 1, 1 ); + mea->setName( "dest" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings::domBlend_func,elemDest) ); + mea->setElementType( domGl_pipeline_settings::domBlend_func::domDest::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 1 ); + _Meta->setCMRoot( cm ); + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domBlend_func)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domBlend_func::domSrc::create(daeInt bytes) +{ + domGl_pipeline_settings::domBlend_func::domSrcRef ref = new(bytes) domGl_pipeline_settings::domBlend_func::domSrc; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domBlend_func::domSrc::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "src" ); + _Meta->registerClass(domGl_pipeline_settings::domBlend_func::domSrc::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Gl_blend_type")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domBlend_func::domSrc , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "ONE"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domBlend_func::domSrc , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domBlend_func::domSrc)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domBlend_func::domDest::create(daeInt bytes) +{ + domGl_pipeline_settings::domBlend_func::domDestRef ref = new(bytes) domGl_pipeline_settings::domBlend_func::domDest; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domBlend_func::domDest::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "dest" ); + _Meta->registerClass(domGl_pipeline_settings::domBlend_func::domDest::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Gl_blend_type")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domBlend_func::domDest , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "ZERO"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domBlend_func::domDest , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domBlend_func::domDest)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domBlend_func_separate::create(daeInt bytes) +{ + domGl_pipeline_settings::domBlend_func_separateRef ref = new(bytes) domGl_pipeline_settings::domBlend_func_separate; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domBlend_func_separate::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "blend_func_separate" ); + _Meta->registerClass(domGl_pipeline_settings::domBlend_func_separate::create, &_Meta); + + _Meta->setIsInnerClass( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "src_rgb" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings::domBlend_func_separate,elemSrc_rgb) ); + mea->setElementType( domGl_pipeline_settings::domBlend_func_separate::domSrc_rgb::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 1, 1 ); + mea->setName( "dest_rgb" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings::domBlend_func_separate,elemDest_rgb) ); + mea->setElementType( domGl_pipeline_settings::domBlend_func_separate::domDest_rgb::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 2, 1, 1 ); + mea->setName( "src_alpha" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings::domBlend_func_separate,elemSrc_alpha) ); + mea->setElementType( domGl_pipeline_settings::domBlend_func_separate::domSrc_alpha::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 3, 1, 1 ); + mea->setName( "dest_alpha" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings::domBlend_func_separate,elemDest_alpha) ); + mea->setElementType( domGl_pipeline_settings::domBlend_func_separate::domDest_alpha::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 3 ); + _Meta->setCMRoot( cm ); + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domBlend_func_separate)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domBlend_func_separate::domSrc_rgb::create(daeInt bytes) +{ + domGl_pipeline_settings::domBlend_func_separate::domSrc_rgbRef ref = new(bytes) domGl_pipeline_settings::domBlend_func_separate::domSrc_rgb; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domBlend_func_separate::domSrc_rgb::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "src_rgb" ); + _Meta->registerClass(domGl_pipeline_settings::domBlend_func_separate::domSrc_rgb::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Gl_blend_type")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domBlend_func_separate::domSrc_rgb , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "ONE"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domBlend_func_separate::domSrc_rgb , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domBlend_func_separate::domSrc_rgb)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domBlend_func_separate::domDest_rgb::create(daeInt bytes) +{ + domGl_pipeline_settings::domBlend_func_separate::domDest_rgbRef ref = new(bytes) domGl_pipeline_settings::domBlend_func_separate::domDest_rgb; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domBlend_func_separate::domDest_rgb::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "dest_rgb" ); + _Meta->registerClass(domGl_pipeline_settings::domBlend_func_separate::domDest_rgb::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Gl_blend_type")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domBlend_func_separate::domDest_rgb , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "ZERO"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domBlend_func_separate::domDest_rgb , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domBlend_func_separate::domDest_rgb)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domBlend_func_separate::domSrc_alpha::create(daeInt bytes) +{ + domGl_pipeline_settings::domBlend_func_separate::domSrc_alphaRef ref = new(bytes) domGl_pipeline_settings::domBlend_func_separate::domSrc_alpha; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domBlend_func_separate::domSrc_alpha::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "src_alpha" ); + _Meta->registerClass(domGl_pipeline_settings::domBlend_func_separate::domSrc_alpha::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Gl_blend_type")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domBlend_func_separate::domSrc_alpha , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "ONE"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domBlend_func_separate::domSrc_alpha , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domBlend_func_separate::domSrc_alpha)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domBlend_func_separate::domDest_alpha::create(daeInt bytes) +{ + domGl_pipeline_settings::domBlend_func_separate::domDest_alphaRef ref = new(bytes) domGl_pipeline_settings::domBlend_func_separate::domDest_alpha; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domBlend_func_separate::domDest_alpha::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "dest_alpha" ); + _Meta->registerClass(domGl_pipeline_settings::domBlend_func_separate::domDest_alpha::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Gl_blend_type")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domBlend_func_separate::domDest_alpha , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "ZERO"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domBlend_func_separate::domDest_alpha , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domBlend_func_separate::domDest_alpha)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domBlend_equation::create(daeInt bytes) +{ + domGl_pipeline_settings::domBlend_equationRef ref = new(bytes) domGl_pipeline_settings::domBlend_equation; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domBlend_equation::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "blend_equation" ); + _Meta->registerClass(domGl_pipeline_settings::domBlend_equation::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Gl_blend_equation_type")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domBlend_equation , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "FUNC_ADD"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domBlend_equation , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domBlend_equation)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domBlend_equation_separate::create(daeInt bytes) +{ + domGl_pipeline_settings::domBlend_equation_separateRef ref = new(bytes) domGl_pipeline_settings::domBlend_equation_separate; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domBlend_equation_separate::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "blend_equation_separate" ); + _Meta->registerClass(domGl_pipeline_settings::domBlend_equation_separate::create, &_Meta); + + _Meta->setIsInnerClass( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "rgb" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings::domBlend_equation_separate,elemRgb) ); + mea->setElementType( domGl_pipeline_settings::domBlend_equation_separate::domRgb::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 1, 1 ); + mea->setName( "alpha" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings::domBlend_equation_separate,elemAlpha) ); + mea->setElementType( domGl_pipeline_settings::domBlend_equation_separate::domAlpha::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 1 ); + _Meta->setCMRoot( cm ); + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domBlend_equation_separate)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domBlend_equation_separate::domRgb::create(daeInt bytes) +{ + domGl_pipeline_settings::domBlend_equation_separate::domRgbRef ref = new(bytes) domGl_pipeline_settings::domBlend_equation_separate::domRgb; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domBlend_equation_separate::domRgb::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "rgb" ); + _Meta->registerClass(domGl_pipeline_settings::domBlend_equation_separate::domRgb::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Gl_blend_equation_type")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domBlend_equation_separate::domRgb , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "FUNC_ADD"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domBlend_equation_separate::domRgb , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domBlend_equation_separate::domRgb)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domBlend_equation_separate::domAlpha::create(daeInt bytes) +{ + domGl_pipeline_settings::domBlend_equation_separate::domAlphaRef ref = new(bytes) domGl_pipeline_settings::domBlend_equation_separate::domAlpha; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domBlend_equation_separate::domAlpha::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "alpha" ); + _Meta->registerClass(domGl_pipeline_settings::domBlend_equation_separate::domAlpha::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Gl_blend_equation_type")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domBlend_equation_separate::domAlpha , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "FUNC_ADD"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domBlend_equation_separate::domAlpha , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domBlend_equation_separate::domAlpha)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domColor_material::create(daeInt bytes) +{ + domGl_pipeline_settings::domColor_materialRef ref = new(bytes) domGl_pipeline_settings::domColor_material; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domColor_material::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "color_material" ); + _Meta->registerClass(domGl_pipeline_settings::domColor_material::create, &_Meta); + + _Meta->setIsInnerClass( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "face" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings::domColor_material,elemFace) ); + mea->setElementType( domGl_pipeline_settings::domColor_material::domFace::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 1, 1 ); + mea->setName( "mode" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings::domColor_material,elemMode) ); + mea->setElementType( domGl_pipeline_settings::domColor_material::domMode::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 1 ); + _Meta->setCMRoot( cm ); + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domColor_material)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domColor_material::domFace::create(daeInt bytes) +{ + domGl_pipeline_settings::domColor_material::domFaceRef ref = new(bytes) domGl_pipeline_settings::domColor_material::domFace; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domColor_material::domFace::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "face" ); + _Meta->registerClass(domGl_pipeline_settings::domColor_material::domFace::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Gl_face_type")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domColor_material::domFace , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "FRONT_AND_BACK"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domColor_material::domFace , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domColor_material::domFace)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domColor_material::domMode::create(daeInt bytes) +{ + domGl_pipeline_settings::domColor_material::domModeRef ref = new(bytes) domGl_pipeline_settings::domColor_material::domMode; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domColor_material::domMode::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "mode" ); + _Meta->registerClass(domGl_pipeline_settings::domColor_material::domMode::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Gl_material_type")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domColor_material::domMode , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "AMBIENT_AND_DIFFUSE"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domColor_material::domMode , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domColor_material::domMode)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domCull_face::create(daeInt bytes) +{ + domGl_pipeline_settings::domCull_faceRef ref = new(bytes) domGl_pipeline_settings::domCull_face; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domCull_face::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "cull_face" ); + _Meta->registerClass(domGl_pipeline_settings::domCull_face::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Gl_face_type")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domCull_face , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "BACK"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domCull_face , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domCull_face)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domDepth_func::create(daeInt bytes) +{ + domGl_pipeline_settings::domDepth_funcRef ref = new(bytes) domGl_pipeline_settings::domDepth_func; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domDepth_func::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "depth_func" ); + _Meta->registerClass(domGl_pipeline_settings::domDepth_func::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Gl_func_type")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domDepth_func , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "ALWAYS"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domDepth_func , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domDepth_func)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domFog_mode::create(daeInt bytes) +{ + domGl_pipeline_settings::domFog_modeRef ref = new(bytes) domGl_pipeline_settings::domFog_mode; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domFog_mode::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "fog_mode" ); + _Meta->registerClass(domGl_pipeline_settings::domFog_mode::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Gl_fog_type")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domFog_mode , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "EXP"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domFog_mode , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domFog_mode)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domFog_coord_src::create(daeInt bytes) +{ + domGl_pipeline_settings::domFog_coord_srcRef ref = new(bytes) domGl_pipeline_settings::domFog_coord_src; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domFog_coord_src::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "fog_coord_src" ); + _Meta->registerClass(domGl_pipeline_settings::domFog_coord_src::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Gl_fog_coord_src_type")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domFog_coord_src , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "FOG_COORDINATE"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domFog_coord_src , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domFog_coord_src)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domFront_face::create(daeInt bytes) +{ + domGl_pipeline_settings::domFront_faceRef ref = new(bytes) domGl_pipeline_settings::domFront_face; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domFront_face::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "front_face" ); + _Meta->registerClass(domGl_pipeline_settings::domFront_face::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Gl_front_face_type")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domFront_face , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "CCW"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domFront_face , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domFront_face)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domLight_model_color_control::create(daeInt bytes) +{ + domGl_pipeline_settings::domLight_model_color_controlRef ref = new(bytes) domGl_pipeline_settings::domLight_model_color_control; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domLight_model_color_control::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "light_model_color_control" ); + _Meta->registerClass(domGl_pipeline_settings::domLight_model_color_control::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Gl_light_model_color_control_type")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domLight_model_color_control , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "SINGLE_COLOR"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domLight_model_color_control , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domLight_model_color_control)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domLogic_op::create(daeInt bytes) +{ + domGl_pipeline_settings::domLogic_opRef ref = new(bytes) domGl_pipeline_settings::domLogic_op; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domLogic_op::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "logic_op" ); + _Meta->registerClass(domGl_pipeline_settings::domLogic_op::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Gl_logic_op_type")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domLogic_op , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "COPY"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domLogic_op , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domLogic_op)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domPolygon_mode::create(daeInt bytes) +{ + domGl_pipeline_settings::domPolygon_modeRef ref = new(bytes) domGl_pipeline_settings::domPolygon_mode; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domPolygon_mode::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "polygon_mode" ); + _Meta->registerClass(domGl_pipeline_settings::domPolygon_mode::create, &_Meta); + + _Meta->setIsInnerClass( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "face" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings::domPolygon_mode,elemFace) ); + mea->setElementType( domGl_pipeline_settings::domPolygon_mode::domFace::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 1, 1 ); + mea->setName( "mode" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings::domPolygon_mode,elemMode) ); + mea->setElementType( domGl_pipeline_settings::domPolygon_mode::domMode::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 1 ); + _Meta->setCMRoot( cm ); + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domPolygon_mode)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domPolygon_mode::domFace::create(daeInt bytes) +{ + domGl_pipeline_settings::domPolygon_mode::domFaceRef ref = new(bytes) domGl_pipeline_settings::domPolygon_mode::domFace; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domPolygon_mode::domFace::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "face" ); + _Meta->registerClass(domGl_pipeline_settings::domPolygon_mode::domFace::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Gl_face_type")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domPolygon_mode::domFace , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "FRONT_AND_BACK"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domPolygon_mode::domFace , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domPolygon_mode::domFace)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domPolygon_mode::domMode::create(daeInt bytes) +{ + domGl_pipeline_settings::domPolygon_mode::domModeRef ref = new(bytes) domGl_pipeline_settings::domPolygon_mode::domMode; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domPolygon_mode::domMode::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "mode" ); + _Meta->registerClass(domGl_pipeline_settings::domPolygon_mode::domMode::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Gl_polygon_mode_type")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domPolygon_mode::domMode , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "FILL"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domPolygon_mode::domMode , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domPolygon_mode::domMode)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domShade_model::create(daeInt bytes) +{ + domGl_pipeline_settings::domShade_modelRef ref = new(bytes) domGl_pipeline_settings::domShade_model; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domShade_model::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "shade_model" ); + _Meta->registerClass(domGl_pipeline_settings::domShade_model::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Gl_shade_model_type")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domShade_model , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "SMOOTH"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domShade_model , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domShade_model)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domStencil_func::create(daeInt bytes) +{ + domGl_pipeline_settings::domStencil_funcRef ref = new(bytes) domGl_pipeline_settings::domStencil_func; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domStencil_func::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "stencil_func" ); + _Meta->registerClass(domGl_pipeline_settings::domStencil_func::create, &_Meta); + + _Meta->setIsInnerClass( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "func" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings::domStencil_func,elemFunc) ); + mea->setElementType( domGl_pipeline_settings::domStencil_func::domFunc::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 1, 1 ); + mea->setName( "ref" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings::domStencil_func,elemRef) ); + mea->setElementType( domGl_pipeline_settings::domStencil_func::domRef::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 2, 1, 1 ); + mea->setName( "mask" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings::domStencil_func,elemMask) ); + mea->setElementType( domGl_pipeline_settings::domStencil_func::domMask::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 2 ); + _Meta->setCMRoot( cm ); + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domStencil_func)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domStencil_func::domFunc::create(daeInt bytes) +{ + domGl_pipeline_settings::domStencil_func::domFuncRef ref = new(bytes) domGl_pipeline_settings::domStencil_func::domFunc; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domStencil_func::domFunc::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "func" ); + _Meta->registerClass(domGl_pipeline_settings::domStencil_func::domFunc::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Gl_func_type")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domStencil_func::domFunc , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "ALWAYS"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domStencil_func::domFunc , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domStencil_func::domFunc)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domStencil_func::domRef::create(daeInt bytes) +{ + domGl_pipeline_settings::domStencil_func::domRefRef ref = new(bytes) domGl_pipeline_settings::domStencil_func::domRef; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domStencil_func::domRef::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "ref" ); + _Meta->registerClass(domGl_pipeline_settings::domStencil_func::domRef::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("xsUnsignedByte")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domStencil_func::domRef , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "0"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domStencil_func::domRef , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domStencil_func::domRef)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domStencil_func::domMask::create(daeInt bytes) +{ + domGl_pipeline_settings::domStencil_func::domMaskRef ref = new(bytes) domGl_pipeline_settings::domStencil_func::domMask; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domStencil_func::domMask::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "mask" ); + _Meta->registerClass(domGl_pipeline_settings::domStencil_func::domMask::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("xsUnsignedByte")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domStencil_func::domMask , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "255"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domStencil_func::domMask , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domStencil_func::domMask)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domStencil_op::create(daeInt bytes) +{ + domGl_pipeline_settings::domStencil_opRef ref = new(bytes) domGl_pipeline_settings::domStencil_op; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domStencil_op::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "stencil_op" ); + _Meta->registerClass(domGl_pipeline_settings::domStencil_op::create, &_Meta); + + _Meta->setIsInnerClass( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "fail" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings::domStencil_op,elemFail) ); + mea->setElementType( domGl_pipeline_settings::domStencil_op::domFail::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 1, 1 ); + mea->setName( "zfail" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings::domStencil_op,elemZfail) ); + mea->setElementType( domGl_pipeline_settings::domStencil_op::domZfail::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 2, 1, 1 ); + mea->setName( "zpass" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings::domStencil_op,elemZpass) ); + mea->setElementType( domGl_pipeline_settings::domStencil_op::domZpass::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 2 ); + _Meta->setCMRoot( cm ); + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domStencil_op)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domStencil_op::domFail::create(daeInt bytes) +{ + domGl_pipeline_settings::domStencil_op::domFailRef ref = new(bytes) domGl_pipeline_settings::domStencil_op::domFail; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domStencil_op::domFail::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "fail" ); + _Meta->registerClass(domGl_pipeline_settings::domStencil_op::domFail::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Gl_stencil_op_type")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domStencil_op::domFail , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "KEEP"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domStencil_op::domFail , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domStencil_op::domFail)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domStencil_op::domZfail::create(daeInt bytes) +{ + domGl_pipeline_settings::domStencil_op::domZfailRef ref = new(bytes) domGl_pipeline_settings::domStencil_op::domZfail; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domStencil_op::domZfail::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "zfail" ); + _Meta->registerClass(domGl_pipeline_settings::domStencil_op::domZfail::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Gl_stencil_op_type")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domStencil_op::domZfail , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "KEEP"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domStencil_op::domZfail , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domStencil_op::domZfail)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domStencil_op::domZpass::create(daeInt bytes) +{ + domGl_pipeline_settings::domStencil_op::domZpassRef ref = new(bytes) domGl_pipeline_settings::domStencil_op::domZpass; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domStencil_op::domZpass::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "zpass" ); + _Meta->registerClass(domGl_pipeline_settings::domStencil_op::domZpass::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Gl_stencil_op_type")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domStencil_op::domZpass , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "KEEP"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domStencil_op::domZpass , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domStencil_op::domZpass)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domStencil_func_separate::create(daeInt bytes) +{ + domGl_pipeline_settings::domStencil_func_separateRef ref = new(bytes) domGl_pipeline_settings::domStencil_func_separate; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domStencil_func_separate::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "stencil_func_separate" ); + _Meta->registerClass(domGl_pipeline_settings::domStencil_func_separate::create, &_Meta); + + _Meta->setIsInnerClass( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "front" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings::domStencil_func_separate,elemFront) ); + mea->setElementType( domGl_pipeline_settings::domStencil_func_separate::domFront::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 1, 1 ); + mea->setName( "back" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings::domStencil_func_separate,elemBack) ); + mea->setElementType( domGl_pipeline_settings::domStencil_func_separate::domBack::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 2, 1, 1 ); + mea->setName( "ref" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings::domStencil_func_separate,elemRef) ); + mea->setElementType( domGl_pipeline_settings::domStencil_func_separate::domRef::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 3, 1, 1 ); + mea->setName( "mask" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings::domStencil_func_separate,elemMask) ); + mea->setElementType( domGl_pipeline_settings::domStencil_func_separate::domMask::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 3 ); + _Meta->setCMRoot( cm ); + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domStencil_func_separate)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domStencil_func_separate::domFront::create(daeInt bytes) +{ + domGl_pipeline_settings::domStencil_func_separate::domFrontRef ref = new(bytes) domGl_pipeline_settings::domStencil_func_separate::domFront; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domStencil_func_separate::domFront::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "front" ); + _Meta->registerClass(domGl_pipeline_settings::domStencil_func_separate::domFront::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Gl_func_type")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domStencil_func_separate::domFront , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "ALWAYS"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domStencil_func_separate::domFront , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domStencil_func_separate::domFront)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domStencil_func_separate::domBack::create(daeInt bytes) +{ + domGl_pipeline_settings::domStencil_func_separate::domBackRef ref = new(bytes) domGl_pipeline_settings::domStencil_func_separate::domBack; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domStencil_func_separate::domBack::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "back" ); + _Meta->registerClass(domGl_pipeline_settings::domStencil_func_separate::domBack::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Gl_func_type")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domStencil_func_separate::domBack , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "ALWAYS"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domStencil_func_separate::domBack , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domStencil_func_separate::domBack)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domStencil_func_separate::domRef::create(daeInt bytes) +{ + domGl_pipeline_settings::domStencil_func_separate::domRefRef ref = new(bytes) domGl_pipeline_settings::domStencil_func_separate::domRef; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domStencil_func_separate::domRef::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "ref" ); + _Meta->registerClass(domGl_pipeline_settings::domStencil_func_separate::domRef::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("xsUnsignedByte")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domStencil_func_separate::domRef , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "0"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domStencil_func_separate::domRef , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domStencil_func_separate::domRef)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domStencil_func_separate::domMask::create(daeInt bytes) +{ + domGl_pipeline_settings::domStencil_func_separate::domMaskRef ref = new(bytes) domGl_pipeline_settings::domStencil_func_separate::domMask; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domStencil_func_separate::domMask::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "mask" ); + _Meta->registerClass(domGl_pipeline_settings::domStencil_func_separate::domMask::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("xsUnsignedByte")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domStencil_func_separate::domMask , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "255"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domStencil_func_separate::domMask , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domStencil_func_separate::domMask)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domStencil_op_separate::create(daeInt bytes) +{ + domGl_pipeline_settings::domStencil_op_separateRef ref = new(bytes) domGl_pipeline_settings::domStencil_op_separate; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domStencil_op_separate::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "stencil_op_separate" ); + _Meta->registerClass(domGl_pipeline_settings::domStencil_op_separate::create, &_Meta); + + _Meta->setIsInnerClass( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "face" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings::domStencil_op_separate,elemFace) ); + mea->setElementType( domGl_pipeline_settings::domStencil_op_separate::domFace::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 1, 1 ); + mea->setName( "fail" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings::domStencil_op_separate,elemFail) ); + mea->setElementType( domGl_pipeline_settings::domStencil_op_separate::domFail::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 2, 1, 1 ); + mea->setName( "zfail" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings::domStencil_op_separate,elemZfail) ); + mea->setElementType( domGl_pipeline_settings::domStencil_op_separate::domZfail::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 3, 1, 1 ); + mea->setName( "zpass" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings::domStencil_op_separate,elemZpass) ); + mea->setElementType( domGl_pipeline_settings::domStencil_op_separate::domZpass::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 3 ); + _Meta->setCMRoot( cm ); + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domStencil_op_separate)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domStencil_op_separate::domFace::create(daeInt bytes) +{ + domGl_pipeline_settings::domStencil_op_separate::domFaceRef ref = new(bytes) domGl_pipeline_settings::domStencil_op_separate::domFace; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domStencil_op_separate::domFace::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "face" ); + _Meta->registerClass(domGl_pipeline_settings::domStencil_op_separate::domFace::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Gl_face_type")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domStencil_op_separate::domFace , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "FRONT_AND_BACK"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domStencil_op_separate::domFace , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domStencil_op_separate::domFace)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domStencil_op_separate::domFail::create(daeInt bytes) +{ + domGl_pipeline_settings::domStencil_op_separate::domFailRef ref = new(bytes) domGl_pipeline_settings::domStencil_op_separate::domFail; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domStencil_op_separate::domFail::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "fail" ); + _Meta->registerClass(domGl_pipeline_settings::domStencil_op_separate::domFail::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Gl_stencil_op_type")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domStencil_op_separate::domFail , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "KEEP"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domStencil_op_separate::domFail , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domStencil_op_separate::domFail)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domStencil_op_separate::domZfail::create(daeInt bytes) +{ + domGl_pipeline_settings::domStencil_op_separate::domZfailRef ref = new(bytes) domGl_pipeline_settings::domStencil_op_separate::domZfail; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domStencil_op_separate::domZfail::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "zfail" ); + _Meta->registerClass(domGl_pipeline_settings::domStencil_op_separate::domZfail::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Gl_stencil_op_type")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domStencil_op_separate::domZfail , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "KEEP"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domStencil_op_separate::domZfail , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domStencil_op_separate::domZfail)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domStencil_op_separate::domZpass::create(daeInt bytes) +{ + domGl_pipeline_settings::domStencil_op_separate::domZpassRef ref = new(bytes) domGl_pipeline_settings::domStencil_op_separate::domZpass; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domStencil_op_separate::domZpass::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "zpass" ); + _Meta->registerClass(domGl_pipeline_settings::domStencil_op_separate::domZpass::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Gl_stencil_op_type")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domStencil_op_separate::domZpass , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "KEEP"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domStencil_op_separate::domZpass , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domStencil_op_separate::domZpass)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domStencil_mask_separate::create(daeInt bytes) +{ + domGl_pipeline_settings::domStencil_mask_separateRef ref = new(bytes) domGl_pipeline_settings::domStencil_mask_separate; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domStencil_mask_separate::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "stencil_mask_separate" ); + _Meta->registerClass(domGl_pipeline_settings::domStencil_mask_separate::create, &_Meta); + + _Meta->setIsInnerClass( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "face" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings::domStencil_mask_separate,elemFace) ); + mea->setElementType( domGl_pipeline_settings::domStencil_mask_separate::domFace::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 1, 1 ); + mea->setName( "mask" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings::domStencil_mask_separate,elemMask) ); + mea->setElementType( domGl_pipeline_settings::domStencil_mask_separate::domMask::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 1 ); + _Meta->setCMRoot( cm ); + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domStencil_mask_separate)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domStencil_mask_separate::domFace::create(daeInt bytes) +{ + domGl_pipeline_settings::domStencil_mask_separate::domFaceRef ref = new(bytes) domGl_pipeline_settings::domStencil_mask_separate::domFace; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domStencil_mask_separate::domFace::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "face" ); + _Meta->registerClass(domGl_pipeline_settings::domStencil_mask_separate::domFace::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Gl_face_type")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domStencil_mask_separate::domFace , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "FRONT_AND_BACK"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domStencil_mask_separate::domFace , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domStencil_mask_separate::domFace)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domStencil_mask_separate::domMask::create(daeInt bytes) +{ + domGl_pipeline_settings::domStencil_mask_separate::domMaskRef ref = new(bytes) domGl_pipeline_settings::domStencil_mask_separate::domMask; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domStencil_mask_separate::domMask::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "mask" ); + _Meta->registerClass(domGl_pipeline_settings::domStencil_mask_separate::domMask::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("xsUnsignedByte")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domStencil_mask_separate::domMask , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "255"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domStencil_mask_separate::domMask , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domStencil_mask_separate::domMask)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domLight_enable::create(daeInt bytes) +{ + domGl_pipeline_settings::domLight_enableRef ref = new(bytes) domGl_pipeline_settings::domLight_enable; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domLight_enable::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "light_enable" ); + _Meta->registerClass(domGl_pipeline_settings::domLight_enable::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Bool")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domLight_enable , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "false"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domLight_enable , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: index + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "index" ); + ma->setType( daeAtomicType::get("GL_MAX_LIGHTS_index")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domLight_enable , attrIndex )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domLight_enable)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domLight_ambient::create(daeInt bytes) +{ + domGl_pipeline_settings::domLight_ambientRef ref = new(bytes) domGl_pipeline_settings::domLight_ambient; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domLight_ambient::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "light_ambient" ); + _Meta->registerClass(domGl_pipeline_settings::domLight_ambient::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Float4")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domLight_ambient , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "0 0 0 1"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domLight_ambient , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: index + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "index" ); + ma->setType( daeAtomicType::get("GL_MAX_LIGHTS_index")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domLight_ambient , attrIndex )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domLight_ambient)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domLight_diffuse::create(daeInt bytes) +{ + domGl_pipeline_settings::domLight_diffuseRef ref = new(bytes) domGl_pipeline_settings::domLight_diffuse; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domLight_diffuse::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "light_diffuse" ); + _Meta->registerClass(domGl_pipeline_settings::domLight_diffuse::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Float4")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domLight_diffuse , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "0 0 0 0"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domLight_diffuse , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: index + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "index" ); + ma->setType( daeAtomicType::get("GL_MAX_LIGHTS_index")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domLight_diffuse , attrIndex )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domLight_diffuse)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domLight_specular::create(daeInt bytes) +{ + domGl_pipeline_settings::domLight_specularRef ref = new(bytes) domGl_pipeline_settings::domLight_specular; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domLight_specular::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "light_specular" ); + _Meta->registerClass(domGl_pipeline_settings::domLight_specular::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Float4")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domLight_specular , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "0 0 0 0"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domLight_specular , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: index + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "index" ); + ma->setType( daeAtomicType::get("GL_MAX_LIGHTS_index")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domLight_specular , attrIndex )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domLight_specular)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domLight_position::create(daeInt bytes) +{ + domGl_pipeline_settings::domLight_positionRef ref = new(bytes) domGl_pipeline_settings::domLight_position; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domLight_position::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "light_position" ); + _Meta->registerClass(domGl_pipeline_settings::domLight_position::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Float4")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domLight_position , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "0 0 1 0"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domLight_position , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: index + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "index" ); + ma->setType( daeAtomicType::get("GL_MAX_LIGHTS_index")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domLight_position , attrIndex )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domLight_position)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domLight_constant_attenuation::create(daeInt bytes) +{ + domGl_pipeline_settings::domLight_constant_attenuationRef ref = new(bytes) domGl_pipeline_settings::domLight_constant_attenuation; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domLight_constant_attenuation::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "light_constant_attenuation" ); + _Meta->registerClass(domGl_pipeline_settings::domLight_constant_attenuation::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Float")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domLight_constant_attenuation , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "1"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domLight_constant_attenuation , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: index + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "index" ); + ma->setType( daeAtomicType::get("GL_MAX_LIGHTS_index")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domLight_constant_attenuation , attrIndex )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domLight_constant_attenuation)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domLight_linear_attenuation::create(daeInt bytes) +{ + domGl_pipeline_settings::domLight_linear_attenuationRef ref = new(bytes) domGl_pipeline_settings::domLight_linear_attenuation; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domLight_linear_attenuation::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "light_linear_attenuation" ); + _Meta->registerClass(domGl_pipeline_settings::domLight_linear_attenuation::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Float")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domLight_linear_attenuation , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "0"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domLight_linear_attenuation , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: index + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "index" ); + ma->setType( daeAtomicType::get("GL_MAX_LIGHTS_index")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domLight_linear_attenuation , attrIndex )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domLight_linear_attenuation)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domLight_quadratic_attenuation::create(daeInt bytes) +{ + domGl_pipeline_settings::domLight_quadratic_attenuationRef ref = new(bytes) domGl_pipeline_settings::domLight_quadratic_attenuation; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domLight_quadratic_attenuation::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "light_quadratic_attenuation" ); + _Meta->registerClass(domGl_pipeline_settings::domLight_quadratic_attenuation::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Float")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domLight_quadratic_attenuation , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "0"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domLight_quadratic_attenuation , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: index + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "index" ); + ma->setType( daeAtomicType::get("GL_MAX_LIGHTS_index")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domLight_quadratic_attenuation , attrIndex )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domLight_quadratic_attenuation)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domLight_spot_cutoff::create(daeInt bytes) +{ + domGl_pipeline_settings::domLight_spot_cutoffRef ref = new(bytes) domGl_pipeline_settings::domLight_spot_cutoff; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domLight_spot_cutoff::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "light_spot_cutoff" ); + _Meta->registerClass(domGl_pipeline_settings::domLight_spot_cutoff::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Float")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domLight_spot_cutoff , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "180"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domLight_spot_cutoff , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: index + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "index" ); + ma->setType( daeAtomicType::get("GL_MAX_LIGHTS_index")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domLight_spot_cutoff , attrIndex )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domLight_spot_cutoff)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domLight_spot_direction::create(daeInt bytes) +{ + domGl_pipeline_settings::domLight_spot_directionRef ref = new(bytes) domGl_pipeline_settings::domLight_spot_direction; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domLight_spot_direction::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "light_spot_direction" ); + _Meta->registerClass(domGl_pipeline_settings::domLight_spot_direction::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Float3")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domLight_spot_direction , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "0 0 -1"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domLight_spot_direction , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: index + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "index" ); + ma->setType( daeAtomicType::get("GL_MAX_LIGHTS_index")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domLight_spot_direction , attrIndex )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domLight_spot_direction)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domLight_spot_exponent::create(daeInt bytes) +{ + domGl_pipeline_settings::domLight_spot_exponentRef ref = new(bytes) domGl_pipeline_settings::domLight_spot_exponent; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domLight_spot_exponent::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "light_spot_exponent" ); + _Meta->registerClass(domGl_pipeline_settings::domLight_spot_exponent::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Float")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domLight_spot_exponent , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "0"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domLight_spot_exponent , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: index + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "index" ); + ma->setType( daeAtomicType::get("GL_MAX_LIGHTS_index")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domLight_spot_exponent , attrIndex )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domLight_spot_exponent)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domTexture1D::create(daeInt bytes) +{ + domGl_pipeline_settings::domTexture1DRef ref = new(bytes) domGl_pipeline_settings::domTexture1D; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domTexture1D::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "texture1D" ); + _Meta->registerClass(domGl_pipeline_settings::domTexture1D::create, &_Meta); + + _Meta->setIsInnerClass( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaChoice( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "value" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings::domTexture1D,elemValue) ); + mea->setElementType( domGl_sampler1D::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "param" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings::domTexture1D,elemParam) ); + mea->setElementType( domGl_pipeline_settings::domTexture1D::domParam::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + _Meta->setCMRoot( cm ); + // Ordered list of sub-elements + _Meta->addContents(daeOffsetOf(domGl_pipeline_settings::domTexture1D,_contents)); + _Meta->addContentsOrder(daeOffsetOf(domGl_pipeline_settings::domTexture1D,_contentsOrder)); + + + // Add attribute: index + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "index" ); + ma->setType( daeAtomicType::get("GL_MAX_TEXTURE_IMAGE_UNITS_index")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domTexture1D , attrIndex )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domTexture1D)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domTexture1D::domParam::create(daeInt bytes) +{ + domGl_pipeline_settings::domTexture1D::domParamRef ref = new(bytes) domGl_pipeline_settings::domTexture1D::domParam; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domTexture1D::domParam::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "param" ); + _Meta->registerClass(domGl_pipeline_settings::domTexture1D::domParam::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domTexture1D::domParam , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domTexture1D::domParam)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domTexture2D::create(daeInt bytes) +{ + domGl_pipeline_settings::domTexture2DRef ref = new(bytes) domGl_pipeline_settings::domTexture2D; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domTexture2D::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "texture2D" ); + _Meta->registerClass(domGl_pipeline_settings::domTexture2D::create, &_Meta); + + _Meta->setIsInnerClass( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaChoice( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "value" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings::domTexture2D,elemValue) ); + mea->setElementType( domGl_sampler2D::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "param" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings::domTexture2D,elemParam) ); + mea->setElementType( domGl_pipeline_settings::domTexture2D::domParam::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + _Meta->setCMRoot( cm ); + // Ordered list of sub-elements + _Meta->addContents(daeOffsetOf(domGl_pipeline_settings::domTexture2D,_contents)); + _Meta->addContentsOrder(daeOffsetOf(domGl_pipeline_settings::domTexture2D,_contentsOrder)); + + + // Add attribute: index + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "index" ); + ma->setType( daeAtomicType::get("GL_MAX_TEXTURE_IMAGE_UNITS_index")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domTexture2D , attrIndex )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domTexture2D)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domTexture2D::domParam::create(daeInt bytes) +{ + domGl_pipeline_settings::domTexture2D::domParamRef ref = new(bytes) domGl_pipeline_settings::domTexture2D::domParam; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domTexture2D::domParam::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "param" ); + _Meta->registerClass(domGl_pipeline_settings::domTexture2D::domParam::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domTexture2D::domParam , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domTexture2D::domParam)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domTexture3D::create(daeInt bytes) +{ + domGl_pipeline_settings::domTexture3DRef ref = new(bytes) domGl_pipeline_settings::domTexture3D; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domTexture3D::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "texture3D" ); + _Meta->registerClass(domGl_pipeline_settings::domTexture3D::create, &_Meta); + + _Meta->setIsInnerClass( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaChoice( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "value" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings::domTexture3D,elemValue) ); + mea->setElementType( domGl_sampler3D::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "param" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings::domTexture3D,elemParam) ); + mea->setElementType( domGl_pipeline_settings::domTexture3D::domParam::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + _Meta->setCMRoot( cm ); + // Ordered list of sub-elements + _Meta->addContents(daeOffsetOf(domGl_pipeline_settings::domTexture3D,_contents)); + _Meta->addContentsOrder(daeOffsetOf(domGl_pipeline_settings::domTexture3D,_contentsOrder)); + + + // Add attribute: index + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "index" ); + ma->setType( daeAtomicType::get("GL_MAX_TEXTURE_IMAGE_UNITS_index")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domTexture3D , attrIndex )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domTexture3D)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domTexture3D::domParam::create(daeInt bytes) +{ + domGl_pipeline_settings::domTexture3D::domParamRef ref = new(bytes) domGl_pipeline_settings::domTexture3D::domParam; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domTexture3D::domParam::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "param" ); + _Meta->registerClass(domGl_pipeline_settings::domTexture3D::domParam::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domTexture3D::domParam , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domTexture3D::domParam)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domTextureCUBE::create(daeInt bytes) +{ + domGl_pipeline_settings::domTextureCUBERef ref = new(bytes) domGl_pipeline_settings::domTextureCUBE; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domTextureCUBE::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "textureCUBE" ); + _Meta->registerClass(domGl_pipeline_settings::domTextureCUBE::create, &_Meta); + + _Meta->setIsInnerClass( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaChoice( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "value" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings::domTextureCUBE,elemValue) ); + mea->setElementType( domGl_samplerCUBE::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "param" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings::domTextureCUBE,elemParam) ); + mea->setElementType( domGl_pipeline_settings::domTextureCUBE::domParam::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + _Meta->setCMRoot( cm ); + // Ordered list of sub-elements + _Meta->addContents(daeOffsetOf(domGl_pipeline_settings::domTextureCUBE,_contents)); + _Meta->addContentsOrder(daeOffsetOf(domGl_pipeline_settings::domTextureCUBE,_contentsOrder)); + + + // Add attribute: index + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "index" ); + ma->setType( daeAtomicType::get("GL_MAX_TEXTURE_IMAGE_UNITS_index")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domTextureCUBE , attrIndex )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domTextureCUBE)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domTextureCUBE::domParam::create(daeInt bytes) +{ + domGl_pipeline_settings::domTextureCUBE::domParamRef ref = new(bytes) domGl_pipeline_settings::domTextureCUBE::domParam; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domTextureCUBE::domParam::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "param" ); + _Meta->registerClass(domGl_pipeline_settings::domTextureCUBE::domParam::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domTextureCUBE::domParam , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domTextureCUBE::domParam)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domTextureRECT::create(daeInt bytes) +{ + domGl_pipeline_settings::domTextureRECTRef ref = new(bytes) domGl_pipeline_settings::domTextureRECT; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domTextureRECT::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "textureRECT" ); + _Meta->registerClass(domGl_pipeline_settings::domTextureRECT::create, &_Meta); + + _Meta->setIsInnerClass( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaChoice( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "value" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings::domTextureRECT,elemValue) ); + mea->setElementType( domGl_samplerRECT::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "param" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings::domTextureRECT,elemParam) ); + mea->setElementType( domGl_pipeline_settings::domTextureRECT::domParam::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + _Meta->setCMRoot( cm ); + // Ordered list of sub-elements + _Meta->addContents(daeOffsetOf(domGl_pipeline_settings::domTextureRECT,_contents)); + _Meta->addContentsOrder(daeOffsetOf(domGl_pipeline_settings::domTextureRECT,_contentsOrder)); + + + // Add attribute: index + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "index" ); + ma->setType( daeAtomicType::get("GL_MAX_TEXTURE_IMAGE_UNITS_index")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domTextureRECT , attrIndex )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domTextureRECT)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domTextureRECT::domParam::create(daeInt bytes) +{ + domGl_pipeline_settings::domTextureRECT::domParamRef ref = new(bytes) domGl_pipeline_settings::domTextureRECT::domParam; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domTextureRECT::domParam::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "param" ); + _Meta->registerClass(domGl_pipeline_settings::domTextureRECT::domParam::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domTextureRECT::domParam , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domTextureRECT::domParam)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domTextureDEPTH::create(daeInt bytes) +{ + domGl_pipeline_settings::domTextureDEPTHRef ref = new(bytes) domGl_pipeline_settings::domTextureDEPTH; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domTextureDEPTH::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "textureDEPTH" ); + _Meta->registerClass(domGl_pipeline_settings::domTextureDEPTH::create, &_Meta); + + _Meta->setIsInnerClass( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaChoice( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "value" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings::domTextureDEPTH,elemValue) ); + mea->setElementType( domGl_samplerDEPTH::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "param" ); + mea->setOffset( daeOffsetOf(domGl_pipeline_settings::domTextureDEPTH,elemParam) ); + mea->setElementType( domGl_pipeline_settings::domTextureDEPTH::domParam::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + _Meta->setCMRoot( cm ); + // Ordered list of sub-elements + _Meta->addContents(daeOffsetOf(domGl_pipeline_settings::domTextureDEPTH,_contents)); + _Meta->addContentsOrder(daeOffsetOf(domGl_pipeline_settings::domTextureDEPTH,_contentsOrder)); + + + // Add attribute: index + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "index" ); + ma->setType( daeAtomicType::get("GL_MAX_TEXTURE_IMAGE_UNITS_index")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domTextureDEPTH , attrIndex )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domTextureDEPTH)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domTextureDEPTH::domParam::create(daeInt bytes) +{ + domGl_pipeline_settings::domTextureDEPTH::domParamRef ref = new(bytes) domGl_pipeline_settings::domTextureDEPTH::domParam; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domTextureDEPTH::domParam::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "param" ); + _Meta->registerClass(domGl_pipeline_settings::domTextureDEPTH::domParam::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domTextureDEPTH::domParam , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domTextureDEPTH::domParam)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domTexture1D_enable::create(daeInt bytes) +{ + domGl_pipeline_settings::domTexture1D_enableRef ref = new(bytes) domGl_pipeline_settings::domTexture1D_enable; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domTexture1D_enable::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "texture1D_enable" ); + _Meta->registerClass(domGl_pipeline_settings::domTexture1D_enable::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Bool")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domTexture1D_enable , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "false"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domTexture1D_enable , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: index + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "index" ); + ma->setType( daeAtomicType::get("GL_MAX_TEXTURE_IMAGE_UNITS_index")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domTexture1D_enable , attrIndex )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domTexture1D_enable)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domTexture2D_enable::create(daeInt bytes) +{ + domGl_pipeline_settings::domTexture2D_enableRef ref = new(bytes) domGl_pipeline_settings::domTexture2D_enable; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domTexture2D_enable::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "texture2D_enable" ); + _Meta->registerClass(domGl_pipeline_settings::domTexture2D_enable::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Bool")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domTexture2D_enable , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "false"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domTexture2D_enable , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: index + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "index" ); + ma->setType( daeAtomicType::get("GL_MAX_TEXTURE_IMAGE_UNITS_index")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domTexture2D_enable , attrIndex )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domTexture2D_enable)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domTexture3D_enable::create(daeInt bytes) +{ + domGl_pipeline_settings::domTexture3D_enableRef ref = new(bytes) domGl_pipeline_settings::domTexture3D_enable; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domTexture3D_enable::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "texture3D_enable" ); + _Meta->registerClass(domGl_pipeline_settings::domTexture3D_enable::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Bool")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domTexture3D_enable , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "false"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domTexture3D_enable , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: index + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "index" ); + ma->setType( daeAtomicType::get("GL_MAX_TEXTURE_IMAGE_UNITS_index")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domTexture3D_enable , attrIndex )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domTexture3D_enable)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domTextureCUBE_enable::create(daeInt bytes) +{ + domGl_pipeline_settings::domTextureCUBE_enableRef ref = new(bytes) domGl_pipeline_settings::domTextureCUBE_enable; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domTextureCUBE_enable::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "textureCUBE_enable" ); + _Meta->registerClass(domGl_pipeline_settings::domTextureCUBE_enable::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Bool")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domTextureCUBE_enable , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "false"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domTextureCUBE_enable , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: index + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "index" ); + ma->setType( daeAtomicType::get("GL_MAX_TEXTURE_IMAGE_UNITS_index")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domTextureCUBE_enable , attrIndex )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domTextureCUBE_enable)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domTextureRECT_enable::create(daeInt bytes) +{ + domGl_pipeline_settings::domTextureRECT_enableRef ref = new(bytes) domGl_pipeline_settings::domTextureRECT_enable; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domTextureRECT_enable::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "textureRECT_enable" ); + _Meta->registerClass(domGl_pipeline_settings::domTextureRECT_enable::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Bool")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domTextureRECT_enable , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "false"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domTextureRECT_enable , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: index + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "index" ); + ma->setType( daeAtomicType::get("GL_MAX_TEXTURE_IMAGE_UNITS_index")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domTextureRECT_enable , attrIndex )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domTextureRECT_enable)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domTextureDEPTH_enable::create(daeInt bytes) +{ + domGl_pipeline_settings::domTextureDEPTH_enableRef ref = new(bytes) domGl_pipeline_settings::domTextureDEPTH_enable; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domTextureDEPTH_enable::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "textureDEPTH_enable" ); + _Meta->registerClass(domGl_pipeline_settings::domTextureDEPTH_enable::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Bool")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domTextureDEPTH_enable , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "false"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domTextureDEPTH_enable , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: index + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "index" ); + ma->setType( daeAtomicType::get("GL_MAX_TEXTURE_IMAGE_UNITS_index")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domTextureDEPTH_enable , attrIndex )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domTextureDEPTH_enable)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domTexture_env_color::create(daeInt bytes) +{ + domGl_pipeline_settings::domTexture_env_colorRef ref = new(bytes) domGl_pipeline_settings::domTexture_env_color; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domTexture_env_color::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "texture_env_color" ); + _Meta->registerClass(domGl_pipeline_settings::domTexture_env_color::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Float4")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domTexture_env_color , attrValue )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domTexture_env_color , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: index + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "index" ); + ma->setType( daeAtomicType::get("GL_MAX_TEXTURE_IMAGE_UNITS_index")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domTexture_env_color , attrIndex )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domTexture_env_color)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domTexture_env_mode::create(daeInt bytes) +{ + domGl_pipeline_settings::domTexture_env_modeRef ref = new(bytes) domGl_pipeline_settings::domTexture_env_mode; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domTexture_env_mode::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "texture_env_mode" ); + _Meta->registerClass(domGl_pipeline_settings::domTexture_env_mode::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("String")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domTexture_env_mode , attrValue )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domTexture_env_mode , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: index + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "index" ); + ma->setType( daeAtomicType::get("GL_MAX_TEXTURE_IMAGE_UNITS_index")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domTexture_env_mode , attrIndex )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domTexture_env_mode)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domClip_plane::create(daeInt bytes) +{ + domGl_pipeline_settings::domClip_planeRef ref = new(bytes) domGl_pipeline_settings::domClip_plane; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domClip_plane::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "clip_plane" ); + _Meta->registerClass(domGl_pipeline_settings::domClip_plane::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Float4")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domClip_plane , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "0 0 0 0"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domClip_plane , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: index + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "index" ); + ma->setType( daeAtomicType::get("GL_MAX_CLIP_PLANES_index")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domClip_plane , attrIndex )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domClip_plane)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domClip_plane_enable::create(daeInt bytes) +{ + domGl_pipeline_settings::domClip_plane_enableRef ref = new(bytes) domGl_pipeline_settings::domClip_plane_enable; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domClip_plane_enable::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "clip_plane_enable" ); + _Meta->registerClass(domGl_pipeline_settings::domClip_plane_enable::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Bool")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domClip_plane_enable , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "false"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domClip_plane_enable , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: index + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "index" ); + ma->setType( daeAtomicType::get("GL_MAX_CLIP_PLANES_index")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domClip_plane_enable , attrIndex )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domClip_plane_enable)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domBlend_color::create(daeInt bytes) +{ + domGl_pipeline_settings::domBlend_colorRef ref = new(bytes) domGl_pipeline_settings::domBlend_color; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domBlend_color::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "blend_color" ); + _Meta->registerClass(domGl_pipeline_settings::domBlend_color::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Float4")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domBlend_color , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "0 0 0 0"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domBlend_color , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domBlend_color)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domClear_color::create(daeInt bytes) +{ + domGl_pipeline_settings::domClear_colorRef ref = new(bytes) domGl_pipeline_settings::domClear_color; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domClear_color::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "clear_color" ); + _Meta->registerClass(domGl_pipeline_settings::domClear_color::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Float4")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domClear_color , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "0 0 0 0"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domClear_color , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domClear_color)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domClear_stencil::create(daeInt bytes) +{ + domGl_pipeline_settings::domClear_stencilRef ref = new(bytes) domGl_pipeline_settings::domClear_stencil; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domClear_stencil::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "clear_stencil" ); + _Meta->registerClass(domGl_pipeline_settings::domClear_stencil::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Int")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domClear_stencil , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "0"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domClear_stencil , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domClear_stencil)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domClear_depth::create(daeInt bytes) +{ + domGl_pipeline_settings::domClear_depthRef ref = new(bytes) domGl_pipeline_settings::domClear_depth; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domClear_depth::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "clear_depth" ); + _Meta->registerClass(domGl_pipeline_settings::domClear_depth::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Float")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domClear_depth , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "1"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domClear_depth , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domClear_depth)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domColor_mask::create(daeInt bytes) +{ + domGl_pipeline_settings::domColor_maskRef ref = new(bytes) domGl_pipeline_settings::domColor_mask; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domColor_mask::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "color_mask" ); + _Meta->registerClass(domGl_pipeline_settings::domColor_mask::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Bool4")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domColor_mask , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "true true true true"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domColor_mask , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domColor_mask)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domDepth_bounds::create(daeInt bytes) +{ + domGl_pipeline_settings::domDepth_boundsRef ref = new(bytes) domGl_pipeline_settings::domDepth_bounds; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domDepth_bounds::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "depth_bounds" ); + _Meta->registerClass(domGl_pipeline_settings::domDepth_bounds::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Float2")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domDepth_bounds , attrValue )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domDepth_bounds , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domDepth_bounds)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domDepth_mask::create(daeInt bytes) +{ + domGl_pipeline_settings::domDepth_maskRef ref = new(bytes) domGl_pipeline_settings::domDepth_mask; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domDepth_mask::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "depth_mask" ); + _Meta->registerClass(domGl_pipeline_settings::domDepth_mask::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Bool")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domDepth_mask , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "true"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domDepth_mask , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domDepth_mask)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domDepth_range::create(daeInt bytes) +{ + domGl_pipeline_settings::domDepth_rangeRef ref = new(bytes) domGl_pipeline_settings::domDepth_range; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domDepth_range::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "depth_range" ); + _Meta->registerClass(domGl_pipeline_settings::domDepth_range::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Float2")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domDepth_range , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "0 1"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domDepth_range , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domDepth_range)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domFog_density::create(daeInt bytes) +{ + domGl_pipeline_settings::domFog_densityRef ref = new(bytes) domGl_pipeline_settings::domFog_density; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domFog_density::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "fog_density" ); + _Meta->registerClass(domGl_pipeline_settings::domFog_density::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Float")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domFog_density , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "1"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domFog_density , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domFog_density)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domFog_start::create(daeInt bytes) +{ + domGl_pipeline_settings::domFog_startRef ref = new(bytes) domGl_pipeline_settings::domFog_start; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domFog_start::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "fog_start" ); + _Meta->registerClass(domGl_pipeline_settings::domFog_start::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Float")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domFog_start , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "0"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domFog_start , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domFog_start)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domFog_end::create(daeInt bytes) +{ + domGl_pipeline_settings::domFog_endRef ref = new(bytes) domGl_pipeline_settings::domFog_end; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domFog_end::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "fog_end" ); + _Meta->registerClass(domGl_pipeline_settings::domFog_end::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Float")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domFog_end , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "1"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domFog_end , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domFog_end)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domFog_color::create(daeInt bytes) +{ + domGl_pipeline_settings::domFog_colorRef ref = new(bytes) domGl_pipeline_settings::domFog_color; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domFog_color::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "fog_color" ); + _Meta->registerClass(domGl_pipeline_settings::domFog_color::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Float4")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domFog_color , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "0 0 0 0"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domFog_color , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domFog_color)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domLight_model_ambient::create(daeInt bytes) +{ + domGl_pipeline_settings::domLight_model_ambientRef ref = new(bytes) domGl_pipeline_settings::domLight_model_ambient; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domLight_model_ambient::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "light_model_ambient" ); + _Meta->registerClass(domGl_pipeline_settings::domLight_model_ambient::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Float4")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domLight_model_ambient , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "0.2 0.2 0.2 1.0"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domLight_model_ambient , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domLight_model_ambient)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domLighting_enable::create(daeInt bytes) +{ + domGl_pipeline_settings::domLighting_enableRef ref = new(bytes) domGl_pipeline_settings::domLighting_enable; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domLighting_enable::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "lighting_enable" ); + _Meta->registerClass(domGl_pipeline_settings::domLighting_enable::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Bool")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domLighting_enable , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "false"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domLighting_enable , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domLighting_enable)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domLine_stipple::create(daeInt bytes) +{ + domGl_pipeline_settings::domLine_stippleRef ref = new(bytes) domGl_pipeline_settings::domLine_stipple; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domLine_stipple::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "line_stipple" ); + _Meta->registerClass(domGl_pipeline_settings::domLine_stipple::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Int2")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domLine_stipple , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "1 65536"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domLine_stipple , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domLine_stipple)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domLine_width::create(daeInt bytes) +{ + domGl_pipeline_settings::domLine_widthRef ref = new(bytes) domGl_pipeline_settings::domLine_width; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domLine_width::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "line_width" ); + _Meta->registerClass(domGl_pipeline_settings::domLine_width::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Float")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domLine_width , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "1"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domLine_width , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domLine_width)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domMaterial_ambient::create(daeInt bytes) +{ + domGl_pipeline_settings::domMaterial_ambientRef ref = new(bytes) domGl_pipeline_settings::domMaterial_ambient; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domMaterial_ambient::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "material_ambient" ); + _Meta->registerClass(domGl_pipeline_settings::domMaterial_ambient::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Float4")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domMaterial_ambient , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "0.2 0.2 0.2 1.0"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domMaterial_ambient , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domMaterial_ambient)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domMaterial_diffuse::create(daeInt bytes) +{ + domGl_pipeline_settings::domMaterial_diffuseRef ref = new(bytes) domGl_pipeline_settings::domMaterial_diffuse; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domMaterial_diffuse::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "material_diffuse" ); + _Meta->registerClass(domGl_pipeline_settings::domMaterial_diffuse::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Float4")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domMaterial_diffuse , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "0.8 0.8 0.8 1.0"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domMaterial_diffuse , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domMaterial_diffuse)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domMaterial_emission::create(daeInt bytes) +{ + domGl_pipeline_settings::domMaterial_emissionRef ref = new(bytes) domGl_pipeline_settings::domMaterial_emission; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domMaterial_emission::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "material_emission" ); + _Meta->registerClass(domGl_pipeline_settings::domMaterial_emission::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Float4")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domMaterial_emission , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "0 0 0 1"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domMaterial_emission , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domMaterial_emission)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domMaterial_shininess::create(daeInt bytes) +{ + domGl_pipeline_settings::domMaterial_shininessRef ref = new(bytes) domGl_pipeline_settings::domMaterial_shininess; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domMaterial_shininess::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "material_shininess" ); + _Meta->registerClass(domGl_pipeline_settings::domMaterial_shininess::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Float")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domMaterial_shininess , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "0"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domMaterial_shininess , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domMaterial_shininess)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domMaterial_specular::create(daeInt bytes) +{ + domGl_pipeline_settings::domMaterial_specularRef ref = new(bytes) domGl_pipeline_settings::domMaterial_specular; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domMaterial_specular::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "material_specular" ); + _Meta->registerClass(domGl_pipeline_settings::domMaterial_specular::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Float4")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domMaterial_specular , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "0 0 0 1"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domMaterial_specular , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domMaterial_specular)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domModel_view_matrix::create(daeInt bytes) +{ + domGl_pipeline_settings::domModel_view_matrixRef ref = new(bytes) domGl_pipeline_settings::domModel_view_matrix; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domModel_view_matrix::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "model_view_matrix" ); + _Meta->registerClass(domGl_pipeline_settings::domModel_view_matrix::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Float4x4")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domModel_view_matrix , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domModel_view_matrix , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domModel_view_matrix)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domPoint_distance_attenuation::create(daeInt bytes) +{ + domGl_pipeline_settings::domPoint_distance_attenuationRef ref = new(bytes) domGl_pipeline_settings::domPoint_distance_attenuation; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domPoint_distance_attenuation::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "point_distance_attenuation" ); + _Meta->registerClass(domGl_pipeline_settings::domPoint_distance_attenuation::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Float3")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domPoint_distance_attenuation , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "1 0 0"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domPoint_distance_attenuation , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domPoint_distance_attenuation)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domPoint_fade_threshold_size::create(daeInt bytes) +{ + domGl_pipeline_settings::domPoint_fade_threshold_sizeRef ref = new(bytes) domGl_pipeline_settings::domPoint_fade_threshold_size; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domPoint_fade_threshold_size::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "point_fade_threshold_size" ); + _Meta->registerClass(domGl_pipeline_settings::domPoint_fade_threshold_size::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Float")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domPoint_fade_threshold_size , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "1"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domPoint_fade_threshold_size , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domPoint_fade_threshold_size)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domPoint_size::create(daeInt bytes) +{ + domGl_pipeline_settings::domPoint_sizeRef ref = new(bytes) domGl_pipeline_settings::domPoint_size; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domPoint_size::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "point_size" ); + _Meta->registerClass(domGl_pipeline_settings::domPoint_size::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Float")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domPoint_size , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "1"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domPoint_size , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domPoint_size)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domPoint_size_min::create(daeInt bytes) +{ + domGl_pipeline_settings::domPoint_size_minRef ref = new(bytes) domGl_pipeline_settings::domPoint_size_min; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domPoint_size_min::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "point_size_min" ); + _Meta->registerClass(domGl_pipeline_settings::domPoint_size_min::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Float")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domPoint_size_min , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "0"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domPoint_size_min , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domPoint_size_min)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domPoint_size_max::create(daeInt bytes) +{ + domGl_pipeline_settings::domPoint_size_maxRef ref = new(bytes) domGl_pipeline_settings::domPoint_size_max; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domPoint_size_max::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "point_size_max" ); + _Meta->registerClass(domGl_pipeline_settings::domPoint_size_max::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Float")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domPoint_size_max , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "1"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domPoint_size_max , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domPoint_size_max)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domPolygon_offset::create(daeInt bytes) +{ + domGl_pipeline_settings::domPolygon_offsetRef ref = new(bytes) domGl_pipeline_settings::domPolygon_offset; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domPolygon_offset::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "polygon_offset" ); + _Meta->registerClass(domGl_pipeline_settings::domPolygon_offset::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Float2")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domPolygon_offset , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "0 0"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domPolygon_offset , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domPolygon_offset)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domProjection_matrix::create(daeInt bytes) +{ + domGl_pipeline_settings::domProjection_matrixRef ref = new(bytes) domGl_pipeline_settings::domProjection_matrix; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domProjection_matrix::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "projection_matrix" ); + _Meta->registerClass(domGl_pipeline_settings::domProjection_matrix::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Float4x4")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domProjection_matrix , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domProjection_matrix , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domProjection_matrix)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domScissor::create(daeInt bytes) +{ + domGl_pipeline_settings::domScissorRef ref = new(bytes) domGl_pipeline_settings::domScissor; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domScissor::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "scissor" ); + _Meta->registerClass(domGl_pipeline_settings::domScissor::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Int4")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domScissor , attrValue )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domScissor , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domScissor)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domStencil_mask::create(daeInt bytes) +{ + domGl_pipeline_settings::domStencil_maskRef ref = new(bytes) domGl_pipeline_settings::domStencil_mask; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domStencil_mask::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "stencil_mask" ); + _Meta->registerClass(domGl_pipeline_settings::domStencil_mask::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Int")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domStencil_mask , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "4294967295"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domStencil_mask , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domStencil_mask)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domAlpha_test_enable::create(daeInt bytes) +{ + domGl_pipeline_settings::domAlpha_test_enableRef ref = new(bytes) domGl_pipeline_settings::domAlpha_test_enable; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domAlpha_test_enable::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "alpha_test_enable" ); + _Meta->registerClass(domGl_pipeline_settings::domAlpha_test_enable::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Bool")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domAlpha_test_enable , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "false"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domAlpha_test_enable , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domAlpha_test_enable)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domAuto_normal_enable::create(daeInt bytes) +{ + domGl_pipeline_settings::domAuto_normal_enableRef ref = new(bytes) domGl_pipeline_settings::domAuto_normal_enable; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domAuto_normal_enable::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "auto_normal_enable" ); + _Meta->registerClass(domGl_pipeline_settings::domAuto_normal_enable::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Bool")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domAuto_normal_enable , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "false"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domAuto_normal_enable , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domAuto_normal_enable)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domBlend_enable::create(daeInt bytes) +{ + domGl_pipeline_settings::domBlend_enableRef ref = new(bytes) domGl_pipeline_settings::domBlend_enable; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domBlend_enable::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "blend_enable" ); + _Meta->registerClass(domGl_pipeline_settings::domBlend_enable::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Bool")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domBlend_enable , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "false"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domBlend_enable , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domBlend_enable)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domColor_logic_op_enable::create(daeInt bytes) +{ + domGl_pipeline_settings::domColor_logic_op_enableRef ref = new(bytes) domGl_pipeline_settings::domColor_logic_op_enable; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domColor_logic_op_enable::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "color_logic_op_enable" ); + _Meta->registerClass(domGl_pipeline_settings::domColor_logic_op_enable::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Bool")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domColor_logic_op_enable , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "false"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domColor_logic_op_enable , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domColor_logic_op_enable)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domColor_material_enable::create(daeInt bytes) +{ + domGl_pipeline_settings::domColor_material_enableRef ref = new(bytes) domGl_pipeline_settings::domColor_material_enable; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domColor_material_enable::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "color_material_enable" ); + _Meta->registerClass(domGl_pipeline_settings::domColor_material_enable::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Bool")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domColor_material_enable , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "true"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domColor_material_enable , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domColor_material_enable)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domCull_face_enable::create(daeInt bytes) +{ + domGl_pipeline_settings::domCull_face_enableRef ref = new(bytes) domGl_pipeline_settings::domCull_face_enable; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domCull_face_enable::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "cull_face_enable" ); + _Meta->registerClass(domGl_pipeline_settings::domCull_face_enable::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Bool")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domCull_face_enable , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "false"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domCull_face_enable , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domCull_face_enable)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domDepth_bounds_enable::create(daeInt bytes) +{ + domGl_pipeline_settings::domDepth_bounds_enableRef ref = new(bytes) domGl_pipeline_settings::domDepth_bounds_enable; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domDepth_bounds_enable::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "depth_bounds_enable" ); + _Meta->registerClass(domGl_pipeline_settings::domDepth_bounds_enable::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Bool")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domDepth_bounds_enable , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "false"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domDepth_bounds_enable , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domDepth_bounds_enable)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domDepth_clamp_enable::create(daeInt bytes) +{ + domGl_pipeline_settings::domDepth_clamp_enableRef ref = new(bytes) domGl_pipeline_settings::domDepth_clamp_enable; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domDepth_clamp_enable::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "depth_clamp_enable" ); + _Meta->registerClass(domGl_pipeline_settings::domDepth_clamp_enable::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Bool")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domDepth_clamp_enable , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "false"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domDepth_clamp_enable , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domDepth_clamp_enable)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domDepth_test_enable::create(daeInt bytes) +{ + domGl_pipeline_settings::domDepth_test_enableRef ref = new(bytes) domGl_pipeline_settings::domDepth_test_enable; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domDepth_test_enable::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "depth_test_enable" ); + _Meta->registerClass(domGl_pipeline_settings::domDepth_test_enable::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Bool")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domDepth_test_enable , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "false"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domDepth_test_enable , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domDepth_test_enable)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domDither_enable::create(daeInt bytes) +{ + domGl_pipeline_settings::domDither_enableRef ref = new(bytes) domGl_pipeline_settings::domDither_enable; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domDither_enable::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "dither_enable" ); + _Meta->registerClass(domGl_pipeline_settings::domDither_enable::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Bool")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domDither_enable , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "true"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domDither_enable , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domDither_enable)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domFog_enable::create(daeInt bytes) +{ + domGl_pipeline_settings::domFog_enableRef ref = new(bytes) domGl_pipeline_settings::domFog_enable; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domFog_enable::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "fog_enable" ); + _Meta->registerClass(domGl_pipeline_settings::domFog_enable::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Bool")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domFog_enable , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "false"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domFog_enable , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domFog_enable)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domLight_model_local_viewer_enable::create(daeInt bytes) +{ + domGl_pipeline_settings::domLight_model_local_viewer_enableRef ref = new(bytes) domGl_pipeline_settings::domLight_model_local_viewer_enable; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domLight_model_local_viewer_enable::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "light_model_local_viewer_enable" ); + _Meta->registerClass(domGl_pipeline_settings::domLight_model_local_viewer_enable::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Bool")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domLight_model_local_viewer_enable , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "false"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domLight_model_local_viewer_enable , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domLight_model_local_viewer_enable)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domLight_model_two_side_enable::create(daeInt bytes) +{ + domGl_pipeline_settings::domLight_model_two_side_enableRef ref = new(bytes) domGl_pipeline_settings::domLight_model_two_side_enable; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domLight_model_two_side_enable::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "light_model_two_side_enable" ); + _Meta->registerClass(domGl_pipeline_settings::domLight_model_two_side_enable::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Bool")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domLight_model_two_side_enable , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "false"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domLight_model_two_side_enable , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domLight_model_two_side_enable)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domLine_smooth_enable::create(daeInt bytes) +{ + domGl_pipeline_settings::domLine_smooth_enableRef ref = new(bytes) domGl_pipeline_settings::domLine_smooth_enable; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domLine_smooth_enable::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "line_smooth_enable" ); + _Meta->registerClass(domGl_pipeline_settings::domLine_smooth_enable::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Bool")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domLine_smooth_enable , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "false"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domLine_smooth_enable , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domLine_smooth_enable)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domLine_stipple_enable::create(daeInt bytes) +{ + domGl_pipeline_settings::domLine_stipple_enableRef ref = new(bytes) domGl_pipeline_settings::domLine_stipple_enable; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domLine_stipple_enable::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "line_stipple_enable" ); + _Meta->registerClass(domGl_pipeline_settings::domLine_stipple_enable::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Bool")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domLine_stipple_enable , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "false"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domLine_stipple_enable , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domLine_stipple_enable)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domLogic_op_enable::create(daeInt bytes) +{ + domGl_pipeline_settings::domLogic_op_enableRef ref = new(bytes) domGl_pipeline_settings::domLogic_op_enable; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domLogic_op_enable::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "logic_op_enable" ); + _Meta->registerClass(domGl_pipeline_settings::domLogic_op_enable::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Bool")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domLogic_op_enable , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "false"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domLogic_op_enable , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domLogic_op_enable)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domMultisample_enable::create(daeInt bytes) +{ + domGl_pipeline_settings::domMultisample_enableRef ref = new(bytes) domGl_pipeline_settings::domMultisample_enable; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domMultisample_enable::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "multisample_enable" ); + _Meta->registerClass(domGl_pipeline_settings::domMultisample_enable::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Bool")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domMultisample_enable , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "false"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domMultisample_enable , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domMultisample_enable)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domNormalize_enable::create(daeInt bytes) +{ + domGl_pipeline_settings::domNormalize_enableRef ref = new(bytes) domGl_pipeline_settings::domNormalize_enable; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domNormalize_enable::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "normalize_enable" ); + _Meta->registerClass(domGl_pipeline_settings::domNormalize_enable::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Bool")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domNormalize_enable , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "false"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domNormalize_enable , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domNormalize_enable)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domPoint_smooth_enable::create(daeInt bytes) +{ + domGl_pipeline_settings::domPoint_smooth_enableRef ref = new(bytes) domGl_pipeline_settings::domPoint_smooth_enable; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domPoint_smooth_enable::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "point_smooth_enable" ); + _Meta->registerClass(domGl_pipeline_settings::domPoint_smooth_enable::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Bool")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domPoint_smooth_enable , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "false"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domPoint_smooth_enable , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domPoint_smooth_enable)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domPolygon_offset_fill_enable::create(daeInt bytes) +{ + domGl_pipeline_settings::domPolygon_offset_fill_enableRef ref = new(bytes) domGl_pipeline_settings::domPolygon_offset_fill_enable; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domPolygon_offset_fill_enable::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "polygon_offset_fill_enable" ); + _Meta->registerClass(domGl_pipeline_settings::domPolygon_offset_fill_enable::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Bool")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domPolygon_offset_fill_enable , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "false"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domPolygon_offset_fill_enable , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domPolygon_offset_fill_enable)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domPolygon_offset_line_enable::create(daeInt bytes) +{ + domGl_pipeline_settings::domPolygon_offset_line_enableRef ref = new(bytes) domGl_pipeline_settings::domPolygon_offset_line_enable; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domPolygon_offset_line_enable::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "polygon_offset_line_enable" ); + _Meta->registerClass(domGl_pipeline_settings::domPolygon_offset_line_enable::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Bool")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domPolygon_offset_line_enable , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "false"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domPolygon_offset_line_enable , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domPolygon_offset_line_enable)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domPolygon_offset_point_enable::create(daeInt bytes) +{ + domGl_pipeline_settings::domPolygon_offset_point_enableRef ref = new(bytes) domGl_pipeline_settings::domPolygon_offset_point_enable; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domPolygon_offset_point_enable::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "polygon_offset_point_enable" ); + _Meta->registerClass(domGl_pipeline_settings::domPolygon_offset_point_enable::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Bool")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domPolygon_offset_point_enable , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "false"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domPolygon_offset_point_enable , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domPolygon_offset_point_enable)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domPolygon_smooth_enable::create(daeInt bytes) +{ + domGl_pipeline_settings::domPolygon_smooth_enableRef ref = new(bytes) domGl_pipeline_settings::domPolygon_smooth_enable; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domPolygon_smooth_enable::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "polygon_smooth_enable" ); + _Meta->registerClass(domGl_pipeline_settings::domPolygon_smooth_enable::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Bool")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domPolygon_smooth_enable , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "false"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domPolygon_smooth_enable , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domPolygon_smooth_enable)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domPolygon_stipple_enable::create(daeInt bytes) +{ + domGl_pipeline_settings::domPolygon_stipple_enableRef ref = new(bytes) domGl_pipeline_settings::domPolygon_stipple_enable; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domPolygon_stipple_enable::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "polygon_stipple_enable" ); + _Meta->registerClass(domGl_pipeline_settings::domPolygon_stipple_enable::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Bool")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domPolygon_stipple_enable , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "false"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domPolygon_stipple_enable , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domPolygon_stipple_enable)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domRescale_normal_enable::create(daeInt bytes) +{ + domGl_pipeline_settings::domRescale_normal_enableRef ref = new(bytes) domGl_pipeline_settings::domRescale_normal_enable; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domRescale_normal_enable::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "rescale_normal_enable" ); + _Meta->registerClass(domGl_pipeline_settings::domRescale_normal_enable::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Bool")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domRescale_normal_enable , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "false"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domRescale_normal_enable , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domRescale_normal_enable)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domSample_alpha_to_coverage_enable::create(daeInt bytes) +{ + domGl_pipeline_settings::domSample_alpha_to_coverage_enableRef ref = new(bytes) domGl_pipeline_settings::domSample_alpha_to_coverage_enable; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domSample_alpha_to_coverage_enable::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "sample_alpha_to_coverage_enable" ); + _Meta->registerClass(domGl_pipeline_settings::domSample_alpha_to_coverage_enable::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Bool")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domSample_alpha_to_coverage_enable , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "false"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domSample_alpha_to_coverage_enable , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domSample_alpha_to_coverage_enable)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domSample_alpha_to_one_enable::create(daeInt bytes) +{ + domGl_pipeline_settings::domSample_alpha_to_one_enableRef ref = new(bytes) domGl_pipeline_settings::domSample_alpha_to_one_enable; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domSample_alpha_to_one_enable::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "sample_alpha_to_one_enable" ); + _Meta->registerClass(domGl_pipeline_settings::domSample_alpha_to_one_enable::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Bool")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domSample_alpha_to_one_enable , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "false"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domSample_alpha_to_one_enable , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domSample_alpha_to_one_enable)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domSample_coverage_enable::create(daeInt bytes) +{ + domGl_pipeline_settings::domSample_coverage_enableRef ref = new(bytes) domGl_pipeline_settings::domSample_coverage_enable; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domSample_coverage_enable::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "sample_coverage_enable" ); + _Meta->registerClass(domGl_pipeline_settings::domSample_coverage_enable::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Bool")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domSample_coverage_enable , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "false"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domSample_coverage_enable , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domSample_coverage_enable)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domScissor_test_enable::create(daeInt bytes) +{ + domGl_pipeline_settings::domScissor_test_enableRef ref = new(bytes) domGl_pipeline_settings::domScissor_test_enable; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domScissor_test_enable::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "scissor_test_enable" ); + _Meta->registerClass(domGl_pipeline_settings::domScissor_test_enable::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Bool")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domScissor_test_enable , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "false"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domScissor_test_enable , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domScissor_test_enable)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGl_pipeline_settings::domStencil_test_enable::create(daeInt bytes) +{ + domGl_pipeline_settings::domStencil_test_enableRef ref = new(bytes) domGl_pipeline_settings::domStencil_test_enable; + return ref; +} + + +daeMetaElement * +domGl_pipeline_settings::domStencil_test_enable::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "stencil_test_enable" ); + _Meta->registerClass(domGl_pipeline_settings::domStencil_test_enable::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Bool")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domStencil_test_enable , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "false"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGl_pipeline_settings::domStencil_test_enable , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGl_pipeline_settings::domStencil_test_enable)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domGl_pipeline_settings::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domAlpha_func::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domAlpha_func::domFunc::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domAlpha_func::domValue::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domBlend_func::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domBlend_func::domSrc::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domBlend_func::domDest::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domBlend_func_separate::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domBlend_func_separate::domSrc_rgb::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domBlend_func_separate::domDest_rgb::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domBlend_func_separate::domSrc_alpha::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domBlend_func_separate::domDest_alpha::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domBlend_equation::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domBlend_equation_separate::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domBlend_equation_separate::domRgb::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domBlend_equation_separate::domAlpha::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domColor_material::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domColor_material::domFace::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domColor_material::domMode::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domCull_face::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domDepth_func::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domFog_mode::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domFog_coord_src::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domFront_face::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domLight_model_color_control::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domLogic_op::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domPolygon_mode::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domPolygon_mode::domFace::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domPolygon_mode::domMode::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domShade_model::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domStencil_func::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domStencil_func::domFunc::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domStencil_func::domRef::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domStencil_func::domMask::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domStencil_op::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domStencil_op::domFail::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domStencil_op::domZfail::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domStencil_op::domZpass::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domStencil_func_separate::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domStencil_func_separate::domFront::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domStencil_func_separate::domBack::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domStencil_func_separate::domRef::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domStencil_func_separate::domMask::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domStencil_op_separate::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domStencil_op_separate::domFace::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domStencil_op_separate::domFail::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domStencil_op_separate::domZfail::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domStencil_op_separate::domZpass::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domStencil_mask_separate::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domStencil_mask_separate::domFace::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domStencil_mask_separate::domMask::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domLight_enable::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domLight_ambient::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domLight_diffuse::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domLight_specular::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domLight_position::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domLight_constant_attenuation::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domLight_linear_attenuation::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domLight_quadratic_attenuation::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domLight_spot_cutoff::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domLight_spot_direction::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domLight_spot_exponent::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domTexture1D::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domTexture1D::domParam::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domTexture2D::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domTexture2D::domParam::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domTexture3D::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domTexture3D::domParam::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domTextureCUBE::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domTextureCUBE::domParam::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domTextureRECT::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domTextureRECT::domParam::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domTextureDEPTH::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domTextureDEPTH::domParam::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domTexture1D_enable::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domTexture2D_enable::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domTexture3D_enable::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domTextureCUBE_enable::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domTextureRECT_enable::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domTextureDEPTH_enable::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domTexture_env_color::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domTexture_env_mode::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domClip_plane::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domClip_plane_enable::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domBlend_color::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domClear_color::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domClear_stencil::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domClear_depth::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domColor_mask::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domDepth_bounds::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domDepth_mask::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domDepth_range::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domFog_density::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domFog_start::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domFog_end::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domFog_color::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domLight_model_ambient::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domLighting_enable::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domLine_stipple::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domLine_width::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domMaterial_ambient::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domMaterial_diffuse::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domMaterial_emission::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domMaterial_shininess::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domMaterial_specular::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domModel_view_matrix::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domPoint_distance_attenuation::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domPoint_fade_threshold_size::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domPoint_size::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domPoint_size_min::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domPoint_size_max::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domPolygon_offset::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domProjection_matrix::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domScissor::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domStencil_mask::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domAlpha_test_enable::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domAuto_normal_enable::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domBlend_enable::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domColor_logic_op_enable::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domColor_material_enable::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domCull_face_enable::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domDepth_bounds_enable::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domDepth_clamp_enable::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domDepth_test_enable::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domDither_enable::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domFog_enable::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domLight_model_local_viewer_enable::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domLight_model_two_side_enable::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domLine_smooth_enable::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domLine_stipple_enable::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domLogic_op_enable::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domMultisample_enable::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domNormalize_enable::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domPoint_smooth_enable::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domPolygon_offset_fill_enable::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domPolygon_offset_line_enable::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domPolygon_offset_point_enable::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domPolygon_smooth_enable::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domPolygon_stipple_enable::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domRescale_normal_enable::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domSample_alpha_to_coverage_enable::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domSample_alpha_to_one_enable::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domSample_coverage_enable::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domScissor_test_enable::_Meta = NULL; +daeMetaElement * domGl_pipeline_settings::domStencil_test_enable::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGl_sampler1D.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGl_sampler1D.cpp new file mode 100644 index 00000000..3751a6b6 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGl_sampler1D.cpp @@ -0,0 +1,117 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domGl_sampler1D::create(daeInt bytes) +{ + domGl_sampler1DRef ref = new(bytes) domGl_sampler1D; + return ref; +} + + +daeMetaElement * +domGl_sampler1D::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "gl_sampler1D" ); + _Meta->registerClass(domGl_sampler1D::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "source" ); + mea->setOffset( daeOffsetOf(domGl_sampler1D,elemSource) ); + mea->setElementType( domSource::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 0, 1 ); + mea->setName( "wrap_s" ); + mea->setOffset( daeOffsetOf(domGl_sampler1D,elemWrap_s) ); + mea->setElementType( domWrap_s::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 2, 0, 1 ); + mea->setName( "minfilter" ); + mea->setOffset( daeOffsetOf(domGl_sampler1D,elemMinfilter) ); + mea->setElementType( domMinfilter::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 3, 0, 1 ); + mea->setName( "magfilter" ); + mea->setOffset( daeOffsetOf(domGl_sampler1D,elemMagfilter) ); + mea->setElementType( domMagfilter::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 4, 0, 1 ); + mea->setName( "mipfilter" ); + mea->setOffset( daeOffsetOf(domGl_sampler1D,elemMipfilter) ); + mea->setElementType( domMipfilter::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 5, 0, 1 ); + mea->setName( "border_color" ); + mea->setOffset( daeOffsetOf(domGl_sampler1D,elemBorder_color) ); + mea->setElementType( domBorder_color::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 6, 0, 1 ); + mea->setName( "mipmap_maxlevel" ); + mea->setOffset( daeOffsetOf(domGl_sampler1D,elemMipmap_maxlevel) ); + mea->setElementType( domMipmap_maxlevel::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 7, 0, 1 ); + mea->setName( "mipmap_bias" ); + mea->setOffset( daeOffsetOf(domGl_sampler1D,elemMipmap_bias) ); + mea->setElementType( domMipmap_bias::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 8, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domGl_sampler1D,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 8 ); + cm->getParent()->appendChild( cm ); + cm = cm->getParent(); + + cm->setMaxOrdinal( 8 ); + _Meta->setCMRoot( cm ); + + + _Meta->setElementSize(sizeof(domGl_sampler1D)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domGl_sampler1D::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGl_sampler2D.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGl_sampler2D.cpp new file mode 100644 index 00000000..b622403b --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGl_sampler2D.cpp @@ -0,0 +1,123 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domGl_sampler2D::create(daeInt bytes) +{ + domGl_sampler2DRef ref = new(bytes) domGl_sampler2D; + return ref; +} + + +daeMetaElement * +domGl_sampler2D::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "gl_sampler2D" ); + _Meta->registerClass(domGl_sampler2D::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "source" ); + mea->setOffset( daeOffsetOf(domGl_sampler2D,elemSource) ); + mea->setElementType( domSource::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 0, 1 ); + mea->setName( "wrap_s" ); + mea->setOffset( daeOffsetOf(domGl_sampler2D,elemWrap_s) ); + mea->setElementType( domWrap_s::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 2, 0, 1 ); + mea->setName( "wrap_t" ); + mea->setOffset( daeOffsetOf(domGl_sampler2D,elemWrap_t) ); + mea->setElementType( domWrap_t::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 3, 0, 1 ); + mea->setName( "minfilter" ); + mea->setOffset( daeOffsetOf(domGl_sampler2D,elemMinfilter) ); + mea->setElementType( domMinfilter::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 4, 0, 1 ); + mea->setName( "magfilter" ); + mea->setOffset( daeOffsetOf(domGl_sampler2D,elemMagfilter) ); + mea->setElementType( domMagfilter::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 5, 0, 1 ); + mea->setName( "mipfilter" ); + mea->setOffset( daeOffsetOf(domGl_sampler2D,elemMipfilter) ); + mea->setElementType( domMipfilter::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 6, 0, 1 ); + mea->setName( "border_color" ); + mea->setOffset( daeOffsetOf(domGl_sampler2D,elemBorder_color) ); + mea->setElementType( domBorder_color::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 7, 0, 1 ); + mea->setName( "mipmap_maxlevel" ); + mea->setOffset( daeOffsetOf(domGl_sampler2D,elemMipmap_maxlevel) ); + mea->setElementType( domMipmap_maxlevel::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 8, 0, 1 ); + mea->setName( "mipmap_bias" ); + mea->setOffset( daeOffsetOf(domGl_sampler2D,elemMipmap_bias) ); + mea->setElementType( domMipmap_bias::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 9, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domGl_sampler2D,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 9 ); + cm->getParent()->appendChild( cm ); + cm = cm->getParent(); + + cm->setMaxOrdinal( 9 ); + _Meta->setCMRoot( cm ); + + + _Meta->setElementSize(sizeof(domGl_sampler2D)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domGl_sampler2D::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGl_sampler3D.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGl_sampler3D.cpp new file mode 100644 index 00000000..47b98f0a --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGl_sampler3D.cpp @@ -0,0 +1,129 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domGl_sampler3D::create(daeInt bytes) +{ + domGl_sampler3DRef ref = new(bytes) domGl_sampler3D; + return ref; +} + + +daeMetaElement * +domGl_sampler3D::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "gl_sampler3D" ); + _Meta->registerClass(domGl_sampler3D::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "source" ); + mea->setOffset( daeOffsetOf(domGl_sampler3D,elemSource) ); + mea->setElementType( domSource::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 0, 1 ); + mea->setName( "wrap_s" ); + mea->setOffset( daeOffsetOf(domGl_sampler3D,elemWrap_s) ); + mea->setElementType( domWrap_s::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 2, 0, 1 ); + mea->setName( "wrap_t" ); + mea->setOffset( daeOffsetOf(domGl_sampler3D,elemWrap_t) ); + mea->setElementType( domWrap_t::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 3, 0, 1 ); + mea->setName( "wrap_p" ); + mea->setOffset( daeOffsetOf(domGl_sampler3D,elemWrap_p) ); + mea->setElementType( domWrap_p::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 4, 0, 1 ); + mea->setName( "minfilter" ); + mea->setOffset( daeOffsetOf(domGl_sampler3D,elemMinfilter) ); + mea->setElementType( domMinfilter::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 5, 0, 1 ); + mea->setName( "magfilter" ); + mea->setOffset( daeOffsetOf(domGl_sampler3D,elemMagfilter) ); + mea->setElementType( domMagfilter::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 6, 0, 1 ); + mea->setName( "mipfilter" ); + mea->setOffset( daeOffsetOf(domGl_sampler3D,elemMipfilter) ); + mea->setElementType( domMipfilter::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 7, 0, 1 ); + mea->setName( "border_color" ); + mea->setOffset( daeOffsetOf(domGl_sampler3D,elemBorder_color) ); + mea->setElementType( domBorder_color::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 8, 0, 1 ); + mea->setName( "mipmap_maxlevel" ); + mea->setOffset( daeOffsetOf(domGl_sampler3D,elemMipmap_maxlevel) ); + mea->setElementType( domMipmap_maxlevel::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 9, 0, 1 ); + mea->setName( "mipmap_bias" ); + mea->setOffset( daeOffsetOf(domGl_sampler3D,elemMipmap_bias) ); + mea->setElementType( domMipmap_bias::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 10, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domGl_sampler3D,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 10 ); + cm->getParent()->appendChild( cm ); + cm = cm->getParent(); + + cm->setMaxOrdinal( 10 ); + _Meta->setCMRoot( cm ); + + + _Meta->setElementSize(sizeof(domGl_sampler3D)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domGl_sampler3D::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGl_samplerCUBE.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGl_samplerCUBE.cpp new file mode 100644 index 00000000..dc0bf359 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGl_samplerCUBE.cpp @@ -0,0 +1,129 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domGl_samplerCUBE::create(daeInt bytes) +{ + domGl_samplerCUBERef ref = new(bytes) domGl_samplerCUBE; + return ref; +} + + +daeMetaElement * +domGl_samplerCUBE::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "gl_samplerCUBE" ); + _Meta->registerClass(domGl_samplerCUBE::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "source" ); + mea->setOffset( daeOffsetOf(domGl_samplerCUBE,elemSource) ); + mea->setElementType( domSource::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 0, 1 ); + mea->setName( "wrap_s" ); + mea->setOffset( daeOffsetOf(domGl_samplerCUBE,elemWrap_s) ); + mea->setElementType( domWrap_s::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 2, 0, 1 ); + mea->setName( "wrap_t" ); + mea->setOffset( daeOffsetOf(domGl_samplerCUBE,elemWrap_t) ); + mea->setElementType( domWrap_t::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 3, 0, 1 ); + mea->setName( "wrap_p" ); + mea->setOffset( daeOffsetOf(domGl_samplerCUBE,elemWrap_p) ); + mea->setElementType( domWrap_p::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 4, 0, 1 ); + mea->setName( "minfilter" ); + mea->setOffset( daeOffsetOf(domGl_samplerCUBE,elemMinfilter) ); + mea->setElementType( domMinfilter::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 5, 0, 1 ); + mea->setName( "magfilter" ); + mea->setOffset( daeOffsetOf(domGl_samplerCUBE,elemMagfilter) ); + mea->setElementType( domMagfilter::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 6, 0, 1 ); + mea->setName( "mipfilter" ); + mea->setOffset( daeOffsetOf(domGl_samplerCUBE,elemMipfilter) ); + mea->setElementType( domMipfilter::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 7, 0, 1 ); + mea->setName( "border_color" ); + mea->setOffset( daeOffsetOf(domGl_samplerCUBE,elemBorder_color) ); + mea->setElementType( domBorder_color::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 8, 0, 1 ); + mea->setName( "mipmap_maxlevel" ); + mea->setOffset( daeOffsetOf(domGl_samplerCUBE,elemMipmap_maxlevel) ); + mea->setElementType( domMipmap_maxlevel::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 9, 0, 1 ); + mea->setName( "mipmap_bias" ); + mea->setOffset( daeOffsetOf(domGl_samplerCUBE,elemMipmap_bias) ); + mea->setElementType( domMipmap_bias::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 10, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domGl_samplerCUBE,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 10 ); + cm->getParent()->appendChild( cm ); + cm = cm->getParent(); + + cm->setMaxOrdinal( 10 ); + _Meta->setCMRoot( cm ); + + + _Meta->setElementSize(sizeof(domGl_samplerCUBE)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domGl_samplerCUBE::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGl_samplerDEPTH.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGl_samplerDEPTH.cpp new file mode 100644 index 00000000..92d65d89 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGl_samplerDEPTH.cpp @@ -0,0 +1,99 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domGl_samplerDEPTH::create(daeInt bytes) +{ + domGl_samplerDEPTHRef ref = new(bytes) domGl_samplerDEPTH; + return ref; +} + + +daeMetaElement * +domGl_samplerDEPTH::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "gl_samplerDEPTH" ); + _Meta->registerClass(domGl_samplerDEPTH::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "source" ); + mea->setOffset( daeOffsetOf(domGl_samplerDEPTH,elemSource) ); + mea->setElementType( domSource::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 0, 1 ); + mea->setName( "wrap_s" ); + mea->setOffset( daeOffsetOf(domGl_samplerDEPTH,elemWrap_s) ); + mea->setElementType( domWrap_s::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 2, 0, 1 ); + mea->setName( "wrap_t" ); + mea->setOffset( daeOffsetOf(domGl_samplerDEPTH,elemWrap_t) ); + mea->setElementType( domWrap_t::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 3, 0, 1 ); + mea->setName( "minfilter" ); + mea->setOffset( daeOffsetOf(domGl_samplerDEPTH,elemMinfilter) ); + mea->setElementType( domMinfilter::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 4, 0, 1 ); + mea->setName( "magfilter" ); + mea->setOffset( daeOffsetOf(domGl_samplerDEPTH,elemMagfilter) ); + mea->setElementType( domMagfilter::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 5, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domGl_samplerDEPTH,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 5 ); + cm->getParent()->appendChild( cm ); + cm = cm->getParent(); + + cm->setMaxOrdinal( 5 ); + _Meta->setCMRoot( cm ); + + + _Meta->setElementSize(sizeof(domGl_samplerDEPTH)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domGl_samplerDEPTH::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGl_samplerRECT.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGl_samplerRECT.cpp new file mode 100644 index 00000000..2c25201e --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGl_samplerRECT.cpp @@ -0,0 +1,123 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domGl_samplerRECT::create(daeInt bytes) +{ + domGl_samplerRECTRef ref = new(bytes) domGl_samplerRECT; + return ref; +} + + +daeMetaElement * +domGl_samplerRECT::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "gl_samplerRECT" ); + _Meta->registerClass(domGl_samplerRECT::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "source" ); + mea->setOffset( daeOffsetOf(domGl_samplerRECT,elemSource) ); + mea->setElementType( domSource::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 0, 1 ); + mea->setName( "wrap_s" ); + mea->setOffset( daeOffsetOf(domGl_samplerRECT,elemWrap_s) ); + mea->setElementType( domWrap_s::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 2, 0, 1 ); + mea->setName( "wrap_t" ); + mea->setOffset( daeOffsetOf(domGl_samplerRECT,elemWrap_t) ); + mea->setElementType( domWrap_t::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 3, 0, 1 ); + mea->setName( "minfilter" ); + mea->setOffset( daeOffsetOf(domGl_samplerRECT,elemMinfilter) ); + mea->setElementType( domMinfilter::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 4, 0, 1 ); + mea->setName( "magfilter" ); + mea->setOffset( daeOffsetOf(domGl_samplerRECT,elemMagfilter) ); + mea->setElementType( domMagfilter::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 5, 0, 1 ); + mea->setName( "mipfilter" ); + mea->setOffset( daeOffsetOf(domGl_samplerRECT,elemMipfilter) ); + mea->setElementType( domMipfilter::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 6, 0, 1 ); + mea->setName( "border_color" ); + mea->setOffset( daeOffsetOf(domGl_samplerRECT,elemBorder_color) ); + mea->setElementType( domBorder_color::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 7, 0, 1 ); + mea->setName( "mipmap_maxlevel" ); + mea->setOffset( daeOffsetOf(domGl_samplerRECT,elemMipmap_maxlevel) ); + mea->setElementType( domMipmap_maxlevel::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 8, 0, 1 ); + mea->setName( "mipmap_bias" ); + mea->setOffset( daeOffsetOf(domGl_samplerRECT,elemMipmap_bias) ); + mea->setElementType( domMipmap_bias::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 9, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domGl_samplerRECT,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 9 ); + cm->getParent()->appendChild( cm ); + cm = cm->getParent(); + + cm->setMaxOrdinal( 9 ); + _Meta->setCMRoot( cm ); + + + _Meta->setElementSize(sizeof(domGl_samplerRECT)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domGl_samplerRECT::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGles_basic_type_common.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGles_basic_type_common.cpp new file mode 100644 index 00000000..1f84688a --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGles_basic_type_common.cpp @@ -0,0 +1,1304 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domGles_basic_type_common::create(daeInt bytes) +{ + domGles_basic_type_commonRef ref = new(bytes) domGles_basic_type_common; + return ref; +} + + +daeMetaElement * +domGles_basic_type_common::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "gles_basic_type_common" ); + _Meta->registerClass(domGles_basic_type_common::create, &_Meta); + + _Meta->setIsTransparent( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaChoice( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "bool" ); + mea->setOffset( daeOffsetOf(domGles_basic_type_common,elemBool) ); + mea->setElementType( domGles_basic_type_common::domBool::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "bool2" ); + mea->setOffset( daeOffsetOf(domGles_basic_type_common,elemBool2) ); + mea->setElementType( domGles_basic_type_common::domBool2::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "bool3" ); + mea->setOffset( daeOffsetOf(domGles_basic_type_common,elemBool3) ); + mea->setElementType( domGles_basic_type_common::domBool3::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "bool4" ); + mea->setOffset( daeOffsetOf(domGles_basic_type_common,elemBool4) ); + mea->setElementType( domGles_basic_type_common::domBool4::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "int" ); + mea->setOffset( daeOffsetOf(domGles_basic_type_common,elemInt) ); + mea->setElementType( domGles_basic_type_common::domInt::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "int2" ); + mea->setOffset( daeOffsetOf(domGles_basic_type_common,elemInt2) ); + mea->setElementType( domGles_basic_type_common::domInt2::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "int3" ); + mea->setOffset( daeOffsetOf(domGles_basic_type_common,elemInt3) ); + mea->setElementType( domGles_basic_type_common::domInt3::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "int4" ); + mea->setOffset( daeOffsetOf(domGles_basic_type_common,elemInt4) ); + mea->setElementType( domGles_basic_type_common::domInt4::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "float" ); + mea->setOffset( daeOffsetOf(domGles_basic_type_common,elemFloat) ); + mea->setElementType( domGles_basic_type_common::domFloat::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "float2" ); + mea->setOffset( daeOffsetOf(domGles_basic_type_common,elemFloat2) ); + mea->setElementType( domGles_basic_type_common::domFloat2::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "float3" ); + mea->setOffset( daeOffsetOf(domGles_basic_type_common,elemFloat3) ); + mea->setElementType( domGles_basic_type_common::domFloat3::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "float4" ); + mea->setOffset( daeOffsetOf(domGles_basic_type_common,elemFloat4) ); + mea->setElementType( domGles_basic_type_common::domFloat4::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "float1x1" ); + mea->setOffset( daeOffsetOf(domGles_basic_type_common,elemFloat1x1) ); + mea->setElementType( domGles_basic_type_common::domFloat1x1::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "float1x2" ); + mea->setOffset( daeOffsetOf(domGles_basic_type_common,elemFloat1x2) ); + mea->setElementType( domGles_basic_type_common::domFloat1x2::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "float1x3" ); + mea->setOffset( daeOffsetOf(domGles_basic_type_common,elemFloat1x3) ); + mea->setElementType( domGles_basic_type_common::domFloat1x3::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "float1x4" ); + mea->setOffset( daeOffsetOf(domGles_basic_type_common,elemFloat1x4) ); + mea->setElementType( domGles_basic_type_common::domFloat1x4::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "float2x1" ); + mea->setOffset( daeOffsetOf(domGles_basic_type_common,elemFloat2x1) ); + mea->setElementType( domGles_basic_type_common::domFloat2x1::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "float2x2" ); + mea->setOffset( daeOffsetOf(domGles_basic_type_common,elemFloat2x2) ); + mea->setElementType( domGles_basic_type_common::domFloat2x2::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "float2x3" ); + mea->setOffset( daeOffsetOf(domGles_basic_type_common,elemFloat2x3) ); + mea->setElementType( domGles_basic_type_common::domFloat2x3::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "float2x4" ); + mea->setOffset( daeOffsetOf(domGles_basic_type_common,elemFloat2x4) ); + mea->setElementType( domGles_basic_type_common::domFloat2x4::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "float3x1" ); + mea->setOffset( daeOffsetOf(domGles_basic_type_common,elemFloat3x1) ); + mea->setElementType( domGles_basic_type_common::domFloat3x1::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "float3x2" ); + mea->setOffset( daeOffsetOf(domGles_basic_type_common,elemFloat3x2) ); + mea->setElementType( domGles_basic_type_common::domFloat3x2::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "float3x3" ); + mea->setOffset( daeOffsetOf(domGles_basic_type_common,elemFloat3x3) ); + mea->setElementType( domGles_basic_type_common::domFloat3x3::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "float3x4" ); + mea->setOffset( daeOffsetOf(domGles_basic_type_common,elemFloat3x4) ); + mea->setElementType( domGles_basic_type_common::domFloat3x4::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "float4x1" ); + mea->setOffset( daeOffsetOf(domGles_basic_type_common,elemFloat4x1) ); + mea->setElementType( domGles_basic_type_common::domFloat4x1::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "float4x2" ); + mea->setOffset( daeOffsetOf(domGles_basic_type_common,elemFloat4x2) ); + mea->setElementType( domGles_basic_type_common::domFloat4x2::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "float4x3" ); + mea->setOffset( daeOffsetOf(domGles_basic_type_common,elemFloat4x3) ); + mea->setElementType( domGles_basic_type_common::domFloat4x3::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "float4x4" ); + mea->setOffset( daeOffsetOf(domGles_basic_type_common,elemFloat4x4) ); + mea->setElementType( domGles_basic_type_common::domFloat4x4::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "surface" ); + mea->setOffset( daeOffsetOf(domGles_basic_type_common,elemSurface) ); + mea->setElementType( domFx_surface_common::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "texture_pipeline" ); + mea->setOffset( daeOffsetOf(domGles_basic_type_common,elemTexture_pipeline) ); + mea->setElementType( domGles_texture_pipeline::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "sampler_state" ); + mea->setOffset( daeOffsetOf(domGles_basic_type_common,elemSampler_state) ); + mea->setElementType( domGles_sampler_state::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "texture_unit" ); + mea->setOffset( daeOffsetOf(domGles_basic_type_common,elemTexture_unit) ); + mea->setElementType( domGles_texture_unit::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "enum" ); + mea->setOffset( daeOffsetOf(domGles_basic_type_common,elemEnum) ); + mea->setElementType( domGles_basic_type_common::domEnum::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + _Meta->setCMRoot( cm ); + // Ordered list of sub-elements + _Meta->addContents(daeOffsetOf(domGles_basic_type_common,_contents)); + _Meta->addContentsOrder(daeOffsetOf(domGles_basic_type_common,_contentsOrder)); + + + + _Meta->setElementSize(sizeof(domGles_basic_type_common)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_basic_type_common::domBool::create(daeInt bytes) +{ + domGles_basic_type_common::domBoolRef ref = new(bytes) domGles_basic_type_common::domBool; + return ref; +} + + +daeMetaElement * +domGles_basic_type_common::domBool::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "bool" ); + _Meta->registerClass(domGles_basic_type_common::domBool::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Bool")); + ma->setOffset( daeOffsetOf( domGles_basic_type_common::domBool , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_basic_type_common::domBool)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_basic_type_common::domBool2::create(daeInt bytes) +{ + domGles_basic_type_common::domBool2Ref ref = new(bytes) domGles_basic_type_common::domBool2; + return ref; +} + + +daeMetaElement * +domGles_basic_type_common::domBool2::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "bool2" ); + _Meta->registerClass(domGles_basic_type_common::domBool2::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Bool2")); + ma->setOffset( daeOffsetOf( domGles_basic_type_common::domBool2 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_basic_type_common::domBool2)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_basic_type_common::domBool3::create(daeInt bytes) +{ + domGles_basic_type_common::domBool3Ref ref = new(bytes) domGles_basic_type_common::domBool3; + return ref; +} + + +daeMetaElement * +domGles_basic_type_common::domBool3::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "bool3" ); + _Meta->registerClass(domGles_basic_type_common::domBool3::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Bool3")); + ma->setOffset( daeOffsetOf( domGles_basic_type_common::domBool3 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_basic_type_common::domBool3)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_basic_type_common::domBool4::create(daeInt bytes) +{ + domGles_basic_type_common::domBool4Ref ref = new(bytes) domGles_basic_type_common::domBool4; + return ref; +} + + +daeMetaElement * +domGles_basic_type_common::domBool4::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "bool4" ); + _Meta->registerClass(domGles_basic_type_common::domBool4::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Bool4")); + ma->setOffset( daeOffsetOf( domGles_basic_type_common::domBool4 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_basic_type_common::domBool4)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_basic_type_common::domInt::create(daeInt bytes) +{ + domGles_basic_type_common::domIntRef ref = new(bytes) domGles_basic_type_common::domInt; + return ref; +} + + +daeMetaElement * +domGles_basic_type_common::domInt::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "int" ); + _Meta->registerClass(domGles_basic_type_common::domInt::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Int")); + ma->setOffset( daeOffsetOf( domGles_basic_type_common::domInt , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_basic_type_common::domInt)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_basic_type_common::domInt2::create(daeInt bytes) +{ + domGles_basic_type_common::domInt2Ref ref = new(bytes) domGles_basic_type_common::domInt2; + return ref; +} + + +daeMetaElement * +domGles_basic_type_common::domInt2::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "int2" ); + _Meta->registerClass(domGles_basic_type_common::domInt2::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Int2")); + ma->setOffset( daeOffsetOf( domGles_basic_type_common::domInt2 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_basic_type_common::domInt2)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_basic_type_common::domInt3::create(daeInt bytes) +{ + domGles_basic_type_common::domInt3Ref ref = new(bytes) domGles_basic_type_common::domInt3; + return ref; +} + + +daeMetaElement * +domGles_basic_type_common::domInt3::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "int3" ); + _Meta->registerClass(domGles_basic_type_common::domInt3::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Int3")); + ma->setOffset( daeOffsetOf( domGles_basic_type_common::domInt3 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_basic_type_common::domInt3)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_basic_type_common::domInt4::create(daeInt bytes) +{ + domGles_basic_type_common::domInt4Ref ref = new(bytes) domGles_basic_type_common::domInt4; + return ref; +} + + +daeMetaElement * +domGles_basic_type_common::domInt4::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "int4" ); + _Meta->registerClass(domGles_basic_type_common::domInt4::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Int4")); + ma->setOffset( daeOffsetOf( domGles_basic_type_common::domInt4 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_basic_type_common::domInt4)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_basic_type_common::domFloat::create(daeInt bytes) +{ + domGles_basic_type_common::domFloatRef ref = new(bytes) domGles_basic_type_common::domFloat; + return ref; +} + + +daeMetaElement * +domGles_basic_type_common::domFloat::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "float" ); + _Meta->registerClass(domGles_basic_type_common::domFloat::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Float")); + ma->setOffset( daeOffsetOf( domGles_basic_type_common::domFloat , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_basic_type_common::domFloat)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_basic_type_common::domFloat2::create(daeInt bytes) +{ + domGles_basic_type_common::domFloat2Ref ref = new(bytes) domGles_basic_type_common::domFloat2; + return ref; +} + + +daeMetaElement * +domGles_basic_type_common::domFloat2::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "float2" ); + _Meta->registerClass(domGles_basic_type_common::domFloat2::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Float2")); + ma->setOffset( daeOffsetOf( domGles_basic_type_common::domFloat2 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_basic_type_common::domFloat2)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_basic_type_common::domFloat3::create(daeInt bytes) +{ + domGles_basic_type_common::domFloat3Ref ref = new(bytes) domGles_basic_type_common::domFloat3; + return ref; +} + + +daeMetaElement * +domGles_basic_type_common::domFloat3::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "float3" ); + _Meta->registerClass(domGles_basic_type_common::domFloat3::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Float3")); + ma->setOffset( daeOffsetOf( domGles_basic_type_common::domFloat3 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_basic_type_common::domFloat3)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_basic_type_common::domFloat4::create(daeInt bytes) +{ + domGles_basic_type_common::domFloat4Ref ref = new(bytes) domGles_basic_type_common::domFloat4; + return ref; +} + + +daeMetaElement * +domGles_basic_type_common::domFloat4::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "float4" ); + _Meta->registerClass(domGles_basic_type_common::domFloat4::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Float4")); + ma->setOffset( daeOffsetOf( domGles_basic_type_common::domFloat4 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_basic_type_common::domFloat4)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_basic_type_common::domFloat1x1::create(daeInt bytes) +{ + domGles_basic_type_common::domFloat1x1Ref ref = new(bytes) domGles_basic_type_common::domFloat1x1; + return ref; +} + + +daeMetaElement * +domGles_basic_type_common::domFloat1x1::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "float1x1" ); + _Meta->registerClass(domGles_basic_type_common::domFloat1x1::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Float")); + ma->setOffset( daeOffsetOf( domGles_basic_type_common::domFloat1x1 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_basic_type_common::domFloat1x1)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_basic_type_common::domFloat1x2::create(daeInt bytes) +{ + domGles_basic_type_common::domFloat1x2Ref ref = new(bytes) domGles_basic_type_common::domFloat1x2; + return ref; +} + + +daeMetaElement * +domGles_basic_type_common::domFloat1x2::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "float1x2" ); + _Meta->registerClass(domGles_basic_type_common::domFloat1x2::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Float2")); + ma->setOffset( daeOffsetOf( domGles_basic_type_common::domFloat1x2 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_basic_type_common::domFloat1x2)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_basic_type_common::domFloat1x3::create(daeInt bytes) +{ + domGles_basic_type_common::domFloat1x3Ref ref = new(bytes) domGles_basic_type_common::domFloat1x3; + return ref; +} + + +daeMetaElement * +domGles_basic_type_common::domFloat1x3::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "float1x3" ); + _Meta->registerClass(domGles_basic_type_common::domFloat1x3::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Float3")); + ma->setOffset( daeOffsetOf( domGles_basic_type_common::domFloat1x3 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_basic_type_common::domFloat1x3)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_basic_type_common::domFloat1x4::create(daeInt bytes) +{ + domGles_basic_type_common::domFloat1x4Ref ref = new(bytes) domGles_basic_type_common::domFloat1x4; + return ref; +} + + +daeMetaElement * +domGles_basic_type_common::domFloat1x4::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "float1x4" ); + _Meta->registerClass(domGles_basic_type_common::domFloat1x4::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Float4")); + ma->setOffset( daeOffsetOf( domGles_basic_type_common::domFloat1x4 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_basic_type_common::domFloat1x4)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_basic_type_common::domFloat2x1::create(daeInt bytes) +{ + domGles_basic_type_common::domFloat2x1Ref ref = new(bytes) domGles_basic_type_common::domFloat2x1; + return ref; +} + + +daeMetaElement * +domGles_basic_type_common::domFloat2x1::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "float2x1" ); + _Meta->registerClass(domGles_basic_type_common::domFloat2x1::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Float2")); + ma->setOffset( daeOffsetOf( domGles_basic_type_common::domFloat2x1 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_basic_type_common::domFloat2x1)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_basic_type_common::domFloat2x2::create(daeInt bytes) +{ + domGles_basic_type_common::domFloat2x2Ref ref = new(bytes) domGles_basic_type_common::domFloat2x2; + return ref; +} + + +daeMetaElement * +domGles_basic_type_common::domFloat2x2::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "float2x2" ); + _Meta->registerClass(domGles_basic_type_common::domFloat2x2::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Float2x2")); + ma->setOffset( daeOffsetOf( domGles_basic_type_common::domFloat2x2 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_basic_type_common::domFloat2x2)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_basic_type_common::domFloat2x3::create(daeInt bytes) +{ + domGles_basic_type_common::domFloat2x3Ref ref = new(bytes) domGles_basic_type_common::domFloat2x3; + return ref; +} + + +daeMetaElement * +domGles_basic_type_common::domFloat2x3::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "float2x3" ); + _Meta->registerClass(domGles_basic_type_common::domFloat2x3::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Float2x3")); + ma->setOffset( daeOffsetOf( domGles_basic_type_common::domFloat2x3 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_basic_type_common::domFloat2x3)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_basic_type_common::domFloat2x4::create(daeInt bytes) +{ + domGles_basic_type_common::domFloat2x4Ref ref = new(bytes) domGles_basic_type_common::domFloat2x4; + return ref; +} + + +daeMetaElement * +domGles_basic_type_common::domFloat2x4::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "float2x4" ); + _Meta->registerClass(domGles_basic_type_common::domFloat2x4::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Float2x4")); + ma->setOffset( daeOffsetOf( domGles_basic_type_common::domFloat2x4 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_basic_type_common::domFloat2x4)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_basic_type_common::domFloat3x1::create(daeInt bytes) +{ + domGles_basic_type_common::domFloat3x1Ref ref = new(bytes) domGles_basic_type_common::domFloat3x1; + return ref; +} + + +daeMetaElement * +domGles_basic_type_common::domFloat3x1::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "float3x1" ); + _Meta->registerClass(domGles_basic_type_common::domFloat3x1::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Float3")); + ma->setOffset( daeOffsetOf( domGles_basic_type_common::domFloat3x1 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_basic_type_common::domFloat3x1)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_basic_type_common::domFloat3x2::create(daeInt bytes) +{ + domGles_basic_type_common::domFloat3x2Ref ref = new(bytes) domGles_basic_type_common::domFloat3x2; + return ref; +} + + +daeMetaElement * +domGles_basic_type_common::domFloat3x2::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "float3x2" ); + _Meta->registerClass(domGles_basic_type_common::domFloat3x2::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Float3x2")); + ma->setOffset( daeOffsetOf( domGles_basic_type_common::domFloat3x2 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_basic_type_common::domFloat3x2)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_basic_type_common::domFloat3x3::create(daeInt bytes) +{ + domGles_basic_type_common::domFloat3x3Ref ref = new(bytes) domGles_basic_type_common::domFloat3x3; + return ref; +} + + +daeMetaElement * +domGles_basic_type_common::domFloat3x3::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "float3x3" ); + _Meta->registerClass(domGles_basic_type_common::domFloat3x3::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Float3x3")); + ma->setOffset( daeOffsetOf( domGles_basic_type_common::domFloat3x3 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_basic_type_common::domFloat3x3)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_basic_type_common::domFloat3x4::create(daeInt bytes) +{ + domGles_basic_type_common::domFloat3x4Ref ref = new(bytes) domGles_basic_type_common::domFloat3x4; + return ref; +} + + +daeMetaElement * +domGles_basic_type_common::domFloat3x4::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "float3x4" ); + _Meta->registerClass(domGles_basic_type_common::domFloat3x4::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Float3x4")); + ma->setOffset( daeOffsetOf( domGles_basic_type_common::domFloat3x4 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_basic_type_common::domFloat3x4)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_basic_type_common::domFloat4x1::create(daeInt bytes) +{ + domGles_basic_type_common::domFloat4x1Ref ref = new(bytes) domGles_basic_type_common::domFloat4x1; + return ref; +} + + +daeMetaElement * +domGles_basic_type_common::domFloat4x1::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "float4x1" ); + _Meta->registerClass(domGles_basic_type_common::domFloat4x1::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Float4")); + ma->setOffset( daeOffsetOf( domGles_basic_type_common::domFloat4x1 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_basic_type_common::domFloat4x1)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_basic_type_common::domFloat4x2::create(daeInt bytes) +{ + domGles_basic_type_common::domFloat4x2Ref ref = new(bytes) domGles_basic_type_common::domFloat4x2; + return ref; +} + + +daeMetaElement * +domGles_basic_type_common::domFloat4x2::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "float4x2" ); + _Meta->registerClass(domGles_basic_type_common::domFloat4x2::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Float4x2")); + ma->setOffset( daeOffsetOf( domGles_basic_type_common::domFloat4x2 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_basic_type_common::domFloat4x2)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_basic_type_common::domFloat4x3::create(daeInt bytes) +{ + domGles_basic_type_common::domFloat4x3Ref ref = new(bytes) domGles_basic_type_common::domFloat4x3; + return ref; +} + + +daeMetaElement * +domGles_basic_type_common::domFloat4x3::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "float4x3" ); + _Meta->registerClass(domGles_basic_type_common::domFloat4x3::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Float4x3")); + ma->setOffset( daeOffsetOf( domGles_basic_type_common::domFloat4x3 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_basic_type_common::domFloat4x3)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_basic_type_common::domFloat4x4::create(daeInt bytes) +{ + domGles_basic_type_common::domFloat4x4Ref ref = new(bytes) domGles_basic_type_common::domFloat4x4; + return ref; +} + + +daeMetaElement * +domGles_basic_type_common::domFloat4x4::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "float4x4" ); + _Meta->registerClass(domGles_basic_type_common::domFloat4x4::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Float4x4")); + ma->setOffset( daeOffsetOf( domGles_basic_type_common::domFloat4x4 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_basic_type_common::domFloat4x4)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_basic_type_common::domEnum::create(daeInt bytes) +{ + domGles_basic_type_common::domEnumRef ref = new(bytes) domGles_basic_type_common::domEnum; + return ref; +} + + +daeMetaElement * +domGles_basic_type_common::domEnum::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "enum" ); + _Meta->registerClass(domGles_basic_type_common::domEnum::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Gles_enumeration")); + ma->setOffset( daeOffsetOf( domGles_basic_type_common::domEnum , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_basic_type_common::domEnum)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domGles_basic_type_common::_Meta = NULL; +daeMetaElement * domGles_basic_type_common::domBool::_Meta = NULL; +daeMetaElement * domGles_basic_type_common::domBool2::_Meta = NULL; +daeMetaElement * domGles_basic_type_common::domBool3::_Meta = NULL; +daeMetaElement * domGles_basic_type_common::domBool4::_Meta = NULL; +daeMetaElement * domGles_basic_type_common::domInt::_Meta = NULL; +daeMetaElement * domGles_basic_type_common::domInt2::_Meta = NULL; +daeMetaElement * domGles_basic_type_common::domInt3::_Meta = NULL; +daeMetaElement * domGles_basic_type_common::domInt4::_Meta = NULL; +daeMetaElement * domGles_basic_type_common::domFloat::_Meta = NULL; +daeMetaElement * domGles_basic_type_common::domFloat2::_Meta = NULL; +daeMetaElement * domGles_basic_type_common::domFloat3::_Meta = NULL; +daeMetaElement * domGles_basic_type_common::domFloat4::_Meta = NULL; +daeMetaElement * domGles_basic_type_common::domFloat1x1::_Meta = NULL; +daeMetaElement * domGles_basic_type_common::domFloat1x2::_Meta = NULL; +daeMetaElement * domGles_basic_type_common::domFloat1x3::_Meta = NULL; +daeMetaElement * domGles_basic_type_common::domFloat1x4::_Meta = NULL; +daeMetaElement * domGles_basic_type_common::domFloat2x1::_Meta = NULL; +daeMetaElement * domGles_basic_type_common::domFloat2x2::_Meta = NULL; +daeMetaElement * domGles_basic_type_common::domFloat2x3::_Meta = NULL; +daeMetaElement * domGles_basic_type_common::domFloat2x4::_Meta = NULL; +daeMetaElement * domGles_basic_type_common::domFloat3x1::_Meta = NULL; +daeMetaElement * domGles_basic_type_common::domFloat3x2::_Meta = NULL; +daeMetaElement * domGles_basic_type_common::domFloat3x3::_Meta = NULL; +daeMetaElement * domGles_basic_type_common::domFloat3x4::_Meta = NULL; +daeMetaElement * domGles_basic_type_common::domFloat4x1::_Meta = NULL; +daeMetaElement * domGles_basic_type_common::domFloat4x2::_Meta = NULL; +daeMetaElement * domGles_basic_type_common::domFloat4x3::_Meta = NULL; +daeMetaElement * domGles_basic_type_common::domFloat4x4::_Meta = NULL; +daeMetaElement * domGles_basic_type_common::domEnum::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGles_newparam.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGles_newparam.cpp new file mode 100644 index 00000000..7381d69b --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGles_newparam.cpp @@ -0,0 +1,165 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domGles_newparam::create(daeInt bytes) +{ + domGles_newparamRef ref = new(bytes) domGles_newparam; + return ref; +} + + +daeMetaElement * +domGles_newparam::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "gles_newparam" ); + _Meta->registerClass(domGles_newparam::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 0, -1 ); + mea->setName( "annotate" ); + mea->setOffset( daeOffsetOf(domGles_newparam,elemAnnotate_array) ); + mea->setElementType( domFx_annotate_common::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 0, 1 ); + mea->setName( "semantic" ); + mea->setOffset( daeOffsetOf(domGles_newparam,elemSemantic) ); + mea->setElementType( domGles_newparam::domSemantic::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 2, 0, 1 ); + mea->setName( "modifier" ); + mea->setOffset( daeOffsetOf(domGles_newparam,elemModifier) ); + mea->setElementType( domGles_newparam::domModifier::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 3, 1, 1 ); + mea->setName( "gles_basic_type_common" ); + mea->setOffset( daeOffsetOf(domGles_newparam,elemGles_basic_type_common) ); + mea->setElementType( domGles_basic_type_common::registerElement() ); + cm->appendChild( new daeMetaGroup( mea, _Meta, cm, 3, 1, 1 ) ); + + cm->setMaxOrdinal( 3 ); + _Meta->setCMRoot( cm ); + + // Add attribute: sid + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "sid" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_newparam , attrSid )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_newparam)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_newparam::domSemantic::create(daeInt bytes) +{ + domGles_newparam::domSemanticRef ref = new(bytes) domGles_newparam::domSemantic; + return ref; +} + + +daeMetaElement * +domGles_newparam::domSemantic::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "semantic" ); + _Meta->registerClass(domGles_newparam::domSemantic::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_newparam::domSemantic , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_newparam::domSemantic)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_newparam::domModifier::create(daeInt bytes) +{ + domGles_newparam::domModifierRef ref = new(bytes) domGles_newparam::domModifier; + return ref; +} + + +daeMetaElement * +domGles_newparam::domModifier::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "modifier" ); + _Meta->registerClass(domGles_newparam::domModifier::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Fx_modifier_enum_common")); + ma->setOffset( daeOffsetOf( domGles_newparam::domModifier , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_newparam::domModifier)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domGles_newparam::_Meta = NULL; +daeMetaElement * domGles_newparam::domSemantic::_Meta = NULL; +daeMetaElement * domGles_newparam::domModifier::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGles_pipeline_settings.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGles_pipeline_settings.cpp new file mode 100644 index 00000000..2e2c3c93 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGles_pipeline_settings.cpp @@ -0,0 +1,4948 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domGles_pipeline_settings::create(daeInt bytes) +{ + domGles_pipeline_settingsRef ref = new(bytes) domGles_pipeline_settings; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "gles_pipeline_settings" ); + _Meta->registerClass(domGles_pipeline_settings::create, &_Meta); + + _Meta->setIsTransparent( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaChoice( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "alpha_func" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings,elemAlpha_func) ); + mea->setElementType( domGles_pipeline_settings::domAlpha_func::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "blend_func" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings,elemBlend_func) ); + mea->setElementType( domGles_pipeline_settings::domBlend_func::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "clear_color" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings,elemClear_color) ); + mea->setElementType( domGles_pipeline_settings::domClear_color::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "clear_stencil" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings,elemClear_stencil) ); + mea->setElementType( domGles_pipeline_settings::domClear_stencil::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "clear_depth" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings,elemClear_depth) ); + mea->setElementType( domGles_pipeline_settings::domClear_depth::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "clip_plane" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings,elemClip_plane) ); + mea->setElementType( domGles_pipeline_settings::domClip_plane::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "color_mask" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings,elemColor_mask) ); + mea->setElementType( domGles_pipeline_settings::domColor_mask::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "cull_face" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings,elemCull_face) ); + mea->setElementType( domGles_pipeline_settings::domCull_face::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "depth_func" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings,elemDepth_func) ); + mea->setElementType( domGles_pipeline_settings::domDepth_func::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "depth_mask" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings,elemDepth_mask) ); + mea->setElementType( domGles_pipeline_settings::domDepth_mask::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "depth_range" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings,elemDepth_range) ); + mea->setElementType( domGles_pipeline_settings::domDepth_range::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "fog_color" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings,elemFog_color) ); + mea->setElementType( domGles_pipeline_settings::domFog_color::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "fog_density" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings,elemFog_density) ); + mea->setElementType( domGles_pipeline_settings::domFog_density::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "fog_mode" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings,elemFog_mode) ); + mea->setElementType( domGles_pipeline_settings::domFog_mode::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "fog_start" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings,elemFog_start) ); + mea->setElementType( domGles_pipeline_settings::domFog_start::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "fog_end" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings,elemFog_end) ); + mea->setElementType( domGles_pipeline_settings::domFog_end::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "front_face" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings,elemFront_face) ); + mea->setElementType( domGles_pipeline_settings::domFront_face::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "texture_pipeline" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings,elemTexture_pipeline) ); + mea->setElementType( domGles_pipeline_settings::domTexture_pipeline::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "logic_op" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings,elemLogic_op) ); + mea->setElementType( domGles_pipeline_settings::domLogic_op::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "light_ambient" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings,elemLight_ambient) ); + mea->setElementType( domGles_pipeline_settings::domLight_ambient::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "light_diffuse" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings,elemLight_diffuse) ); + mea->setElementType( domGles_pipeline_settings::domLight_diffuse::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "light_specular" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings,elemLight_specular) ); + mea->setElementType( domGles_pipeline_settings::domLight_specular::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "light_position" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings,elemLight_position) ); + mea->setElementType( domGles_pipeline_settings::domLight_position::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "light_constant_attenuation" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings,elemLight_constant_attenuation) ); + mea->setElementType( domGles_pipeline_settings::domLight_constant_attenuation::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "light_linear_attenutation" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings,elemLight_linear_attenutation) ); + mea->setElementType( domGles_pipeline_settings::domLight_linear_attenutation::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "light_quadratic_attenuation" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings,elemLight_quadratic_attenuation) ); + mea->setElementType( domGles_pipeline_settings::domLight_quadratic_attenuation::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "light_spot_cutoff" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings,elemLight_spot_cutoff) ); + mea->setElementType( domGles_pipeline_settings::domLight_spot_cutoff::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "light_spot_direction" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings,elemLight_spot_direction) ); + mea->setElementType( domGles_pipeline_settings::domLight_spot_direction::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "light_spot_exponent" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings,elemLight_spot_exponent) ); + mea->setElementType( domGles_pipeline_settings::domLight_spot_exponent::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "light_model_ambient" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings,elemLight_model_ambient) ); + mea->setElementType( domGles_pipeline_settings::domLight_model_ambient::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "line_width" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings,elemLine_width) ); + mea->setElementType( domGles_pipeline_settings::domLine_width::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "material_ambient" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings,elemMaterial_ambient) ); + mea->setElementType( domGles_pipeline_settings::domMaterial_ambient::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "material_diffuse" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings,elemMaterial_diffuse) ); + mea->setElementType( domGles_pipeline_settings::domMaterial_diffuse::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "material_emission" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings,elemMaterial_emission) ); + mea->setElementType( domGles_pipeline_settings::domMaterial_emission::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "material_shininess" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings,elemMaterial_shininess) ); + mea->setElementType( domGles_pipeline_settings::domMaterial_shininess::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "material_specular" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings,elemMaterial_specular) ); + mea->setElementType( domGles_pipeline_settings::domMaterial_specular::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "model_view_matrix" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings,elemModel_view_matrix) ); + mea->setElementType( domGles_pipeline_settings::domModel_view_matrix::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "point_distance_attenuation" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings,elemPoint_distance_attenuation) ); + mea->setElementType( domGles_pipeline_settings::domPoint_distance_attenuation::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "point_fade_threshold_size" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings,elemPoint_fade_threshold_size) ); + mea->setElementType( domGles_pipeline_settings::domPoint_fade_threshold_size::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "point_size" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings,elemPoint_size) ); + mea->setElementType( domGles_pipeline_settings::domPoint_size::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "point_size_min" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings,elemPoint_size_min) ); + mea->setElementType( domGles_pipeline_settings::domPoint_size_min::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "point_size_max" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings,elemPoint_size_max) ); + mea->setElementType( domGles_pipeline_settings::domPoint_size_max::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "polygon_offset" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings,elemPolygon_offset) ); + mea->setElementType( domGles_pipeline_settings::domPolygon_offset::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "projection_matrix" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings,elemProjection_matrix) ); + mea->setElementType( domGles_pipeline_settings::domProjection_matrix::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "scissor" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings,elemScissor) ); + mea->setElementType( domGles_pipeline_settings::domScissor::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "shade_model" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings,elemShade_model) ); + mea->setElementType( domGles_pipeline_settings::domShade_model::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "stencil_func" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings,elemStencil_func) ); + mea->setElementType( domGles_pipeline_settings::domStencil_func::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "stencil_mask" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings,elemStencil_mask) ); + mea->setElementType( domGles_pipeline_settings::domStencil_mask::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "stencil_op" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings,elemStencil_op) ); + mea->setElementType( domGles_pipeline_settings::domStencil_op::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "alpha_test_enable" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings,elemAlpha_test_enable) ); + mea->setElementType( domGles_pipeline_settings::domAlpha_test_enable::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "blend_enable" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings,elemBlend_enable) ); + mea->setElementType( domGles_pipeline_settings::domBlend_enable::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "clip_plane_enable" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings,elemClip_plane_enable) ); + mea->setElementType( domGles_pipeline_settings::domClip_plane_enable::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "color_logic_op_enable" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings,elemColor_logic_op_enable) ); + mea->setElementType( domGles_pipeline_settings::domColor_logic_op_enable::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "color_material_enable" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings,elemColor_material_enable) ); + mea->setElementType( domGles_pipeline_settings::domColor_material_enable::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "cull_face_enable" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings,elemCull_face_enable) ); + mea->setElementType( domGles_pipeline_settings::domCull_face_enable::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "depth_test_enable" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings,elemDepth_test_enable) ); + mea->setElementType( domGles_pipeline_settings::domDepth_test_enable::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "dither_enable" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings,elemDither_enable) ); + mea->setElementType( domGles_pipeline_settings::domDither_enable::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "fog_enable" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings,elemFog_enable) ); + mea->setElementType( domGles_pipeline_settings::domFog_enable::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "texture_pipeline_enable" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings,elemTexture_pipeline_enable) ); + mea->setElementType( domGles_pipeline_settings::domTexture_pipeline_enable::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "light_enable" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings,elemLight_enable) ); + mea->setElementType( domGles_pipeline_settings::domLight_enable::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "lighting_enable" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings,elemLighting_enable) ); + mea->setElementType( domGles_pipeline_settings::domLighting_enable::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "light_model_two_side_enable" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings,elemLight_model_two_side_enable) ); + mea->setElementType( domGles_pipeline_settings::domLight_model_two_side_enable::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "line_smooth_enable" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings,elemLine_smooth_enable) ); + mea->setElementType( domGles_pipeline_settings::domLine_smooth_enable::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "multisample_enable" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings,elemMultisample_enable) ); + mea->setElementType( domGles_pipeline_settings::domMultisample_enable::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "normalize_enable" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings,elemNormalize_enable) ); + mea->setElementType( domGles_pipeline_settings::domNormalize_enable::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "point_smooth_enable" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings,elemPoint_smooth_enable) ); + mea->setElementType( domGles_pipeline_settings::domPoint_smooth_enable::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "polygon_offset_fill_enable" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings,elemPolygon_offset_fill_enable) ); + mea->setElementType( domGles_pipeline_settings::domPolygon_offset_fill_enable::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "rescale_normal_enable" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings,elemRescale_normal_enable) ); + mea->setElementType( domGles_pipeline_settings::domRescale_normal_enable::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "sample_alpha_to_coverage_enable" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings,elemSample_alpha_to_coverage_enable) ); + mea->setElementType( domGles_pipeline_settings::domSample_alpha_to_coverage_enable::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "sample_alpha_to_one_enable" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings,elemSample_alpha_to_one_enable) ); + mea->setElementType( domGles_pipeline_settings::domSample_alpha_to_one_enable::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "sample_coverage_enable" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings,elemSample_coverage_enable) ); + mea->setElementType( domGles_pipeline_settings::domSample_coverage_enable::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "scissor_test_enable" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings,elemScissor_test_enable) ); + mea->setElementType( domGles_pipeline_settings::domScissor_test_enable::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "stencil_test_enable" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings,elemStencil_test_enable) ); + mea->setElementType( domGles_pipeline_settings::domStencil_test_enable::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + _Meta->setCMRoot( cm ); + // Ordered list of sub-elements + _Meta->addContents(daeOffsetOf(domGles_pipeline_settings,_contents)); + _Meta->addContentsOrder(daeOffsetOf(domGles_pipeline_settings,_contentsOrder)); + + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_pipeline_settings::domAlpha_func::create(daeInt bytes) +{ + domGles_pipeline_settings::domAlpha_funcRef ref = new(bytes) domGles_pipeline_settings::domAlpha_func; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::domAlpha_func::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "alpha_func" ); + _Meta->registerClass(domGles_pipeline_settings::domAlpha_func::create, &_Meta); + + _Meta->setIsInnerClass( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "func" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings::domAlpha_func,elemFunc) ); + mea->setElementType( domGles_pipeline_settings::domAlpha_func::domFunc::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 1, 1 ); + mea->setName( "value" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings::domAlpha_func,elemValue) ); + mea->setElementType( domGles_pipeline_settings::domAlpha_func::domValue::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 1 ); + _Meta->setCMRoot( cm ); + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings::domAlpha_func)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_pipeline_settings::domAlpha_func::domFunc::create(daeInt bytes) +{ + domGles_pipeline_settings::domAlpha_func::domFuncRef ref = new(bytes) domGles_pipeline_settings::domAlpha_func::domFunc; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::domAlpha_func::domFunc::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "func" ); + _Meta->registerClass(domGles_pipeline_settings::domAlpha_func::domFunc::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Gl_func_type")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domAlpha_func::domFunc , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "ALWAYS"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domAlpha_func::domFunc , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings::domAlpha_func::domFunc)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_pipeline_settings::domAlpha_func::domValue::create(daeInt bytes) +{ + domGles_pipeline_settings::domAlpha_func::domValueRef ref = new(bytes) domGles_pipeline_settings::domAlpha_func::domValue; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::domAlpha_func::domValue::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "value" ); + _Meta->registerClass(domGles_pipeline_settings::domAlpha_func::domValue::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Gl_alpha_value_type")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domAlpha_func::domValue , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "0.0"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domAlpha_func::domValue , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings::domAlpha_func::domValue)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_pipeline_settings::domBlend_func::create(daeInt bytes) +{ + domGles_pipeline_settings::domBlend_funcRef ref = new(bytes) domGles_pipeline_settings::domBlend_func; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::domBlend_func::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "blend_func" ); + _Meta->registerClass(domGles_pipeline_settings::domBlend_func::create, &_Meta); + + _Meta->setIsInnerClass( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "src" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings::domBlend_func,elemSrc) ); + mea->setElementType( domGles_pipeline_settings::domBlend_func::domSrc::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 1, 1 ); + mea->setName( "dest" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings::domBlend_func,elemDest) ); + mea->setElementType( domGles_pipeline_settings::domBlend_func::domDest::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 1 ); + _Meta->setCMRoot( cm ); + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings::domBlend_func)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_pipeline_settings::domBlend_func::domSrc::create(daeInt bytes) +{ + domGles_pipeline_settings::domBlend_func::domSrcRef ref = new(bytes) domGles_pipeline_settings::domBlend_func::domSrc; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::domBlend_func::domSrc::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "src" ); + _Meta->registerClass(domGles_pipeline_settings::domBlend_func::domSrc::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Gl_blend_type")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domBlend_func::domSrc , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "ONE"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domBlend_func::domSrc , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings::domBlend_func::domSrc)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_pipeline_settings::domBlend_func::domDest::create(daeInt bytes) +{ + domGles_pipeline_settings::domBlend_func::domDestRef ref = new(bytes) domGles_pipeline_settings::domBlend_func::domDest; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::domBlend_func::domDest::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "dest" ); + _Meta->registerClass(domGles_pipeline_settings::domBlend_func::domDest::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Gl_blend_type")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domBlend_func::domDest , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "ZERO"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domBlend_func::domDest , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings::domBlend_func::domDest)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_pipeline_settings::domClear_color::create(daeInt bytes) +{ + domGles_pipeline_settings::domClear_colorRef ref = new(bytes) domGles_pipeline_settings::domClear_color; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::domClear_color::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "clear_color" ); + _Meta->registerClass(domGles_pipeline_settings::domClear_color::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Float4")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domClear_color , attrValue )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domClear_color , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings::domClear_color)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_pipeline_settings::domClear_stencil::create(daeInt bytes) +{ + domGles_pipeline_settings::domClear_stencilRef ref = new(bytes) domGles_pipeline_settings::domClear_stencil; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::domClear_stencil::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "clear_stencil" ); + _Meta->registerClass(domGles_pipeline_settings::domClear_stencil::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Int")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domClear_stencil , attrValue )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domClear_stencil , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings::domClear_stencil)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_pipeline_settings::domClear_depth::create(daeInt bytes) +{ + domGles_pipeline_settings::domClear_depthRef ref = new(bytes) domGles_pipeline_settings::domClear_depth; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::domClear_depth::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "clear_depth" ); + _Meta->registerClass(domGles_pipeline_settings::domClear_depth::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Float")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domClear_depth , attrValue )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domClear_depth , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings::domClear_depth)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_pipeline_settings::domClip_plane::create(daeInt bytes) +{ + domGles_pipeline_settings::domClip_planeRef ref = new(bytes) domGles_pipeline_settings::domClip_plane; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::domClip_plane::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "clip_plane" ); + _Meta->registerClass(domGles_pipeline_settings::domClip_plane::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Bool4")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domClip_plane , attrValue )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domClip_plane , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: index + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "index" ); + ma->setType( daeAtomicType::get("GLES_MAX_CLIP_PLANES_index")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domClip_plane , attrIndex )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings::domClip_plane)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_pipeline_settings::domColor_mask::create(daeInt bytes) +{ + domGles_pipeline_settings::domColor_maskRef ref = new(bytes) domGles_pipeline_settings::domColor_mask; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::domColor_mask::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "color_mask" ); + _Meta->registerClass(domGles_pipeline_settings::domColor_mask::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Bool4")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domColor_mask , attrValue )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domColor_mask , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings::domColor_mask)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_pipeline_settings::domCull_face::create(daeInt bytes) +{ + domGles_pipeline_settings::domCull_faceRef ref = new(bytes) domGles_pipeline_settings::domCull_face; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::domCull_face::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "cull_face" ); + _Meta->registerClass(domGles_pipeline_settings::domCull_face::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Gl_face_type")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domCull_face , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "BACK"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domCull_face , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings::domCull_face)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_pipeline_settings::domDepth_func::create(daeInt bytes) +{ + domGles_pipeline_settings::domDepth_funcRef ref = new(bytes) domGles_pipeline_settings::domDepth_func; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::domDepth_func::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "depth_func" ); + _Meta->registerClass(domGles_pipeline_settings::domDepth_func::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Gl_func_type")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domDepth_func , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "ALWAYS"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domDepth_func , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings::domDepth_func)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_pipeline_settings::domDepth_mask::create(daeInt bytes) +{ + domGles_pipeline_settings::domDepth_maskRef ref = new(bytes) domGles_pipeline_settings::domDepth_mask; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::domDepth_mask::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "depth_mask" ); + _Meta->registerClass(domGles_pipeline_settings::domDepth_mask::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Bool")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domDepth_mask , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "false"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domDepth_mask , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings::domDepth_mask)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_pipeline_settings::domDepth_range::create(daeInt bytes) +{ + domGles_pipeline_settings::domDepth_rangeRef ref = new(bytes) domGles_pipeline_settings::domDepth_range; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::domDepth_range::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "depth_range" ); + _Meta->registerClass(domGles_pipeline_settings::domDepth_range::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Float2")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domDepth_range , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "0 1"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domDepth_range , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings::domDepth_range)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_pipeline_settings::domFog_color::create(daeInt bytes) +{ + domGles_pipeline_settings::domFog_colorRef ref = new(bytes) domGles_pipeline_settings::domFog_color; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::domFog_color::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "fog_color" ); + _Meta->registerClass(domGles_pipeline_settings::domFog_color::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Float4")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domFog_color , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "0 0 0 0"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domFog_color , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings::domFog_color)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_pipeline_settings::domFog_density::create(daeInt bytes) +{ + domGles_pipeline_settings::domFog_densityRef ref = new(bytes) domGles_pipeline_settings::domFog_density; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::domFog_density::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "fog_density" ); + _Meta->registerClass(domGles_pipeline_settings::domFog_density::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Float")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domFog_density , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "1"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domFog_density , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings::domFog_density)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_pipeline_settings::domFog_mode::create(daeInt bytes) +{ + domGles_pipeline_settings::domFog_modeRef ref = new(bytes) domGles_pipeline_settings::domFog_mode; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::domFog_mode::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "fog_mode" ); + _Meta->registerClass(domGles_pipeline_settings::domFog_mode::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Gl_fog_type")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domFog_mode , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "EXP"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domFog_mode , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings::domFog_mode)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_pipeline_settings::domFog_start::create(daeInt bytes) +{ + domGles_pipeline_settings::domFog_startRef ref = new(bytes) domGles_pipeline_settings::domFog_start; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::domFog_start::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "fog_start" ); + _Meta->registerClass(domGles_pipeline_settings::domFog_start::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Float")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domFog_start , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "0"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domFog_start , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings::domFog_start)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_pipeline_settings::domFog_end::create(daeInt bytes) +{ + domGles_pipeline_settings::domFog_endRef ref = new(bytes) domGles_pipeline_settings::domFog_end; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::domFog_end::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "fog_end" ); + _Meta->registerClass(domGles_pipeline_settings::domFog_end::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Float")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domFog_end , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "1"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domFog_end , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings::domFog_end)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_pipeline_settings::domFront_face::create(daeInt bytes) +{ + domGles_pipeline_settings::domFront_faceRef ref = new(bytes) domGles_pipeline_settings::domFront_face; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::domFront_face::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "front_face" ); + _Meta->registerClass(domGles_pipeline_settings::domFront_face::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Gl_front_face_type")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domFront_face , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "CCW"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domFront_face , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings::domFront_face)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_pipeline_settings::domTexture_pipeline::create(daeInt bytes) +{ + domGles_pipeline_settings::domTexture_pipelineRef ref = new(bytes) domGles_pipeline_settings::domTexture_pipeline; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::domTexture_pipeline::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "texture_pipeline" ); + _Meta->registerClass(domGles_pipeline_settings::domTexture_pipeline::create, &_Meta); + + _Meta->setIsInnerClass( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 0, 1 ); + mea->setName( "value" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings::domTexture_pipeline,elemValue) ); + mea->setElementType( domGles_texture_pipeline::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + _Meta->setCMRoot( cm ); + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domTexture_pipeline , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings::domTexture_pipeline)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_pipeline_settings::domLogic_op::create(daeInt bytes) +{ + domGles_pipeline_settings::domLogic_opRef ref = new(bytes) domGles_pipeline_settings::domLogic_op; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::domLogic_op::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "logic_op" ); + _Meta->registerClass(domGles_pipeline_settings::domLogic_op::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Gl_logic_op_type")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domLogic_op , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "COPY"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domLogic_op , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings::domLogic_op)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_pipeline_settings::domLight_ambient::create(daeInt bytes) +{ + domGles_pipeline_settings::domLight_ambientRef ref = new(bytes) domGles_pipeline_settings::domLight_ambient; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::domLight_ambient::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "light_ambient" ); + _Meta->registerClass(domGles_pipeline_settings::domLight_ambient::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Float4")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domLight_ambient , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "0 0 0 1"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domLight_ambient , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: index + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "index" ); + ma->setType( daeAtomicType::get("GLES_MAX_LIGHTS_index")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domLight_ambient , attrIndex )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings::domLight_ambient)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_pipeline_settings::domLight_diffuse::create(daeInt bytes) +{ + domGles_pipeline_settings::domLight_diffuseRef ref = new(bytes) domGles_pipeline_settings::domLight_diffuse; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::domLight_diffuse::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "light_diffuse" ); + _Meta->registerClass(domGles_pipeline_settings::domLight_diffuse::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Float4")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domLight_diffuse , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "0 0 0 0"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domLight_diffuse , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: index + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "index" ); + ma->setType( daeAtomicType::get("GLES_MAX_LIGHTS_index")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domLight_diffuse , attrIndex )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings::domLight_diffuse)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_pipeline_settings::domLight_specular::create(daeInt bytes) +{ + domGles_pipeline_settings::domLight_specularRef ref = new(bytes) domGles_pipeline_settings::domLight_specular; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::domLight_specular::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "light_specular" ); + _Meta->registerClass(domGles_pipeline_settings::domLight_specular::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Float4")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domLight_specular , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "0 0 0 0"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domLight_specular , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: index + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "index" ); + ma->setType( daeAtomicType::get("GLES_MAX_LIGHTS_index")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domLight_specular , attrIndex )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings::domLight_specular)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_pipeline_settings::domLight_position::create(daeInt bytes) +{ + domGles_pipeline_settings::domLight_positionRef ref = new(bytes) domGles_pipeline_settings::domLight_position; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::domLight_position::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "light_position" ); + _Meta->registerClass(domGles_pipeline_settings::domLight_position::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Float4")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domLight_position , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "0 0 1 0"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domLight_position , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: index + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "index" ); + ma->setType( daeAtomicType::get("GLES_MAX_LIGHTS_index")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domLight_position , attrIndex )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings::domLight_position)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_pipeline_settings::domLight_constant_attenuation::create(daeInt bytes) +{ + domGles_pipeline_settings::domLight_constant_attenuationRef ref = new(bytes) domGles_pipeline_settings::domLight_constant_attenuation; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::domLight_constant_attenuation::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "light_constant_attenuation" ); + _Meta->registerClass(domGles_pipeline_settings::domLight_constant_attenuation::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Float")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domLight_constant_attenuation , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "1"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domLight_constant_attenuation , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: index + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "index" ); + ma->setType( daeAtomicType::get("GLES_MAX_LIGHTS_index")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domLight_constant_attenuation , attrIndex )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings::domLight_constant_attenuation)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_pipeline_settings::domLight_linear_attenutation::create(daeInt bytes) +{ + domGles_pipeline_settings::domLight_linear_attenutationRef ref = new(bytes) domGles_pipeline_settings::domLight_linear_attenutation; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::domLight_linear_attenutation::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "light_linear_attenutation" ); + _Meta->registerClass(domGles_pipeline_settings::domLight_linear_attenutation::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Float")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domLight_linear_attenutation , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "1"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domLight_linear_attenutation , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: index + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "index" ); + ma->setType( daeAtomicType::get("GLES_MAX_LIGHTS_index")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domLight_linear_attenutation , attrIndex )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings::domLight_linear_attenutation)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_pipeline_settings::domLight_quadratic_attenuation::create(daeInt bytes) +{ + domGles_pipeline_settings::domLight_quadratic_attenuationRef ref = new(bytes) domGles_pipeline_settings::domLight_quadratic_attenuation; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::domLight_quadratic_attenuation::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "light_quadratic_attenuation" ); + _Meta->registerClass(domGles_pipeline_settings::domLight_quadratic_attenuation::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Float")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domLight_quadratic_attenuation , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "1"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domLight_quadratic_attenuation , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: index + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "index" ); + ma->setType( daeAtomicType::get("GLES_MAX_LIGHTS_index")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domLight_quadratic_attenuation , attrIndex )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings::domLight_quadratic_attenuation)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_pipeline_settings::domLight_spot_cutoff::create(daeInt bytes) +{ + domGles_pipeline_settings::domLight_spot_cutoffRef ref = new(bytes) domGles_pipeline_settings::domLight_spot_cutoff; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::domLight_spot_cutoff::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "light_spot_cutoff" ); + _Meta->registerClass(domGles_pipeline_settings::domLight_spot_cutoff::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Float")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domLight_spot_cutoff , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "180"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domLight_spot_cutoff , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: index + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "index" ); + ma->setType( daeAtomicType::get("GLES_MAX_LIGHTS_index")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domLight_spot_cutoff , attrIndex )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings::domLight_spot_cutoff)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_pipeline_settings::domLight_spot_direction::create(daeInt bytes) +{ + domGles_pipeline_settings::domLight_spot_directionRef ref = new(bytes) domGles_pipeline_settings::domLight_spot_direction; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::domLight_spot_direction::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "light_spot_direction" ); + _Meta->registerClass(domGles_pipeline_settings::domLight_spot_direction::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Float3")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domLight_spot_direction , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "0 0 -1"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domLight_spot_direction , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: index + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "index" ); + ma->setType( daeAtomicType::get("GLES_MAX_LIGHTS_index")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domLight_spot_direction , attrIndex )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings::domLight_spot_direction)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_pipeline_settings::domLight_spot_exponent::create(daeInt bytes) +{ + domGles_pipeline_settings::domLight_spot_exponentRef ref = new(bytes) domGles_pipeline_settings::domLight_spot_exponent; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::domLight_spot_exponent::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "light_spot_exponent" ); + _Meta->registerClass(domGles_pipeline_settings::domLight_spot_exponent::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Float")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domLight_spot_exponent , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "0"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domLight_spot_exponent , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: index + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "index" ); + ma->setType( daeAtomicType::get("GLES_MAX_LIGHTS_index")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domLight_spot_exponent , attrIndex )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings::domLight_spot_exponent)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_pipeline_settings::domLight_model_ambient::create(daeInt bytes) +{ + domGles_pipeline_settings::domLight_model_ambientRef ref = new(bytes) domGles_pipeline_settings::domLight_model_ambient; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::domLight_model_ambient::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "light_model_ambient" ); + _Meta->registerClass(domGles_pipeline_settings::domLight_model_ambient::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Float4")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domLight_model_ambient , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "0.2 0.2 0.2 1.0"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domLight_model_ambient , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings::domLight_model_ambient)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_pipeline_settings::domLine_width::create(daeInt bytes) +{ + domGles_pipeline_settings::domLine_widthRef ref = new(bytes) domGles_pipeline_settings::domLine_width; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::domLine_width::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "line_width" ); + _Meta->registerClass(domGles_pipeline_settings::domLine_width::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Float")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domLine_width , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "1"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domLine_width , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings::domLine_width)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_pipeline_settings::domMaterial_ambient::create(daeInt bytes) +{ + domGles_pipeline_settings::domMaterial_ambientRef ref = new(bytes) domGles_pipeline_settings::domMaterial_ambient; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::domMaterial_ambient::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "material_ambient" ); + _Meta->registerClass(domGles_pipeline_settings::domMaterial_ambient::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Float4")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domMaterial_ambient , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "0.2 0.2 0.2 1.0"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domMaterial_ambient , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings::domMaterial_ambient)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_pipeline_settings::domMaterial_diffuse::create(daeInt bytes) +{ + domGles_pipeline_settings::domMaterial_diffuseRef ref = new(bytes) domGles_pipeline_settings::domMaterial_diffuse; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::domMaterial_diffuse::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "material_diffuse" ); + _Meta->registerClass(domGles_pipeline_settings::domMaterial_diffuse::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Float4")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domMaterial_diffuse , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "0.8 0.8 0.8 1.0"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domMaterial_diffuse , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings::domMaterial_diffuse)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_pipeline_settings::domMaterial_emission::create(daeInt bytes) +{ + domGles_pipeline_settings::domMaterial_emissionRef ref = new(bytes) domGles_pipeline_settings::domMaterial_emission; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::domMaterial_emission::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "material_emission" ); + _Meta->registerClass(domGles_pipeline_settings::domMaterial_emission::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Float4")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domMaterial_emission , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "0 0 0 1"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domMaterial_emission , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings::domMaterial_emission)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_pipeline_settings::domMaterial_shininess::create(daeInt bytes) +{ + domGles_pipeline_settings::domMaterial_shininessRef ref = new(bytes) domGles_pipeline_settings::domMaterial_shininess; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::domMaterial_shininess::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "material_shininess" ); + _Meta->registerClass(domGles_pipeline_settings::domMaterial_shininess::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Float")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domMaterial_shininess , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "0"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domMaterial_shininess , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings::domMaterial_shininess)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_pipeline_settings::domMaterial_specular::create(daeInt bytes) +{ + domGles_pipeline_settings::domMaterial_specularRef ref = new(bytes) domGles_pipeline_settings::domMaterial_specular; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::domMaterial_specular::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "material_specular" ); + _Meta->registerClass(domGles_pipeline_settings::domMaterial_specular::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Float4")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domMaterial_specular , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "0 0 0 1"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domMaterial_specular , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings::domMaterial_specular)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_pipeline_settings::domModel_view_matrix::create(daeInt bytes) +{ + domGles_pipeline_settings::domModel_view_matrixRef ref = new(bytes) domGles_pipeline_settings::domModel_view_matrix; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::domModel_view_matrix::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "model_view_matrix" ); + _Meta->registerClass(domGles_pipeline_settings::domModel_view_matrix::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Float4x4")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domModel_view_matrix , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domModel_view_matrix , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings::domModel_view_matrix)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_pipeline_settings::domPoint_distance_attenuation::create(daeInt bytes) +{ + domGles_pipeline_settings::domPoint_distance_attenuationRef ref = new(bytes) domGles_pipeline_settings::domPoint_distance_attenuation; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::domPoint_distance_attenuation::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "point_distance_attenuation" ); + _Meta->registerClass(domGles_pipeline_settings::domPoint_distance_attenuation::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Float3")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domPoint_distance_attenuation , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "1 0 0"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domPoint_distance_attenuation , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings::domPoint_distance_attenuation)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_pipeline_settings::domPoint_fade_threshold_size::create(daeInt bytes) +{ + domGles_pipeline_settings::domPoint_fade_threshold_sizeRef ref = new(bytes) domGles_pipeline_settings::domPoint_fade_threshold_size; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::domPoint_fade_threshold_size::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "point_fade_threshold_size" ); + _Meta->registerClass(domGles_pipeline_settings::domPoint_fade_threshold_size::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Float")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domPoint_fade_threshold_size , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "1"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domPoint_fade_threshold_size , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings::domPoint_fade_threshold_size)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_pipeline_settings::domPoint_size::create(daeInt bytes) +{ + domGles_pipeline_settings::domPoint_sizeRef ref = new(bytes) domGles_pipeline_settings::domPoint_size; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::domPoint_size::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "point_size" ); + _Meta->registerClass(domGles_pipeline_settings::domPoint_size::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Float")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domPoint_size , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "1"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domPoint_size , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings::domPoint_size)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_pipeline_settings::domPoint_size_min::create(daeInt bytes) +{ + domGles_pipeline_settings::domPoint_size_minRef ref = new(bytes) domGles_pipeline_settings::domPoint_size_min; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::domPoint_size_min::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "point_size_min" ); + _Meta->registerClass(domGles_pipeline_settings::domPoint_size_min::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Float")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domPoint_size_min , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "0"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domPoint_size_min , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings::domPoint_size_min)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_pipeline_settings::domPoint_size_max::create(daeInt bytes) +{ + domGles_pipeline_settings::domPoint_size_maxRef ref = new(bytes) domGles_pipeline_settings::domPoint_size_max; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::domPoint_size_max::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "point_size_max" ); + _Meta->registerClass(domGles_pipeline_settings::domPoint_size_max::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Float")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domPoint_size_max , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "1"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domPoint_size_max , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings::domPoint_size_max)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_pipeline_settings::domPolygon_offset::create(daeInt bytes) +{ + domGles_pipeline_settings::domPolygon_offsetRef ref = new(bytes) domGles_pipeline_settings::domPolygon_offset; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::domPolygon_offset::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "polygon_offset" ); + _Meta->registerClass(domGles_pipeline_settings::domPolygon_offset::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Float2")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domPolygon_offset , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "0 0"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domPolygon_offset , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings::domPolygon_offset)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_pipeline_settings::domProjection_matrix::create(daeInt bytes) +{ + domGles_pipeline_settings::domProjection_matrixRef ref = new(bytes) domGles_pipeline_settings::domProjection_matrix; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::domProjection_matrix::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "projection_matrix" ); + _Meta->registerClass(domGles_pipeline_settings::domProjection_matrix::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Float4x4")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domProjection_matrix , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "1 0 0 0 0 1 0 0 0 0 1 0 0 0 0 1"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domProjection_matrix , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings::domProjection_matrix)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_pipeline_settings::domScissor::create(daeInt bytes) +{ + domGles_pipeline_settings::domScissorRef ref = new(bytes) domGles_pipeline_settings::domScissor; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::domScissor::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "scissor" ); + _Meta->registerClass(domGles_pipeline_settings::domScissor::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Int4")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domScissor , attrValue )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domScissor , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings::domScissor)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_pipeline_settings::domShade_model::create(daeInt bytes) +{ + domGles_pipeline_settings::domShade_modelRef ref = new(bytes) domGles_pipeline_settings::domShade_model; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::domShade_model::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "shade_model" ); + _Meta->registerClass(domGles_pipeline_settings::domShade_model::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Gl_shade_model_type")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domShade_model , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "SMOOTH"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domShade_model , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings::domShade_model)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_pipeline_settings::domStencil_func::create(daeInt bytes) +{ + domGles_pipeline_settings::domStencil_funcRef ref = new(bytes) domGles_pipeline_settings::domStencil_func; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::domStencil_func::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "stencil_func" ); + _Meta->registerClass(domGles_pipeline_settings::domStencil_func::create, &_Meta); + + _Meta->setIsInnerClass( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "func" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings::domStencil_func,elemFunc) ); + mea->setElementType( domGles_pipeline_settings::domStencil_func::domFunc::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 1, 1 ); + mea->setName( "ref" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings::domStencil_func,elemRef) ); + mea->setElementType( domGles_pipeline_settings::domStencil_func::domRef::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 2, 1, 1 ); + mea->setName( "mask" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings::domStencil_func,elemMask) ); + mea->setElementType( domGles_pipeline_settings::domStencil_func::domMask::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 2 ); + _Meta->setCMRoot( cm ); + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings::domStencil_func)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_pipeline_settings::domStencil_func::domFunc::create(daeInt bytes) +{ + domGles_pipeline_settings::domStencil_func::domFuncRef ref = new(bytes) domGles_pipeline_settings::domStencil_func::domFunc; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::domStencil_func::domFunc::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "func" ); + _Meta->registerClass(domGles_pipeline_settings::domStencil_func::domFunc::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Gl_func_type")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domStencil_func::domFunc , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "ALWAYS"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domStencil_func::domFunc , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings::domStencil_func::domFunc)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_pipeline_settings::domStencil_func::domRef::create(daeInt bytes) +{ + domGles_pipeline_settings::domStencil_func::domRefRef ref = new(bytes) domGles_pipeline_settings::domStencil_func::domRef; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::domStencil_func::domRef::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "ref" ); + _Meta->registerClass(domGles_pipeline_settings::domStencil_func::domRef::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("xsUnsignedByte")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domStencil_func::domRef , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "0"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domStencil_func::domRef , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings::domStencil_func::domRef)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_pipeline_settings::domStencil_func::domMask::create(daeInt bytes) +{ + domGles_pipeline_settings::domStencil_func::domMaskRef ref = new(bytes) domGles_pipeline_settings::domStencil_func::domMask; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::domStencil_func::domMask::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "mask" ); + _Meta->registerClass(domGles_pipeline_settings::domStencil_func::domMask::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("xsUnsignedByte")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domStencil_func::domMask , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "255"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domStencil_func::domMask , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings::domStencil_func::domMask)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_pipeline_settings::domStencil_mask::create(daeInt bytes) +{ + domGles_pipeline_settings::domStencil_maskRef ref = new(bytes) domGles_pipeline_settings::domStencil_mask; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::domStencil_mask::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "stencil_mask" ); + _Meta->registerClass(domGles_pipeline_settings::domStencil_mask::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Int")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domStencil_mask , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "4294967295"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domStencil_mask , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings::domStencil_mask)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_pipeline_settings::domStencil_op::create(daeInt bytes) +{ + domGles_pipeline_settings::domStencil_opRef ref = new(bytes) domGles_pipeline_settings::domStencil_op; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::domStencil_op::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "stencil_op" ); + _Meta->registerClass(domGles_pipeline_settings::domStencil_op::create, &_Meta); + + _Meta->setIsInnerClass( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "fail" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings::domStencil_op,elemFail) ); + mea->setElementType( domGles_pipeline_settings::domStencil_op::domFail::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 1, 1 ); + mea->setName( "zfail" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings::domStencil_op,elemZfail) ); + mea->setElementType( domGles_pipeline_settings::domStencil_op::domZfail::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 2, 1, 1 ); + mea->setName( "zpass" ); + mea->setOffset( daeOffsetOf(domGles_pipeline_settings::domStencil_op,elemZpass) ); + mea->setElementType( domGles_pipeline_settings::domStencil_op::domZpass::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 2 ); + _Meta->setCMRoot( cm ); + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings::domStencil_op)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_pipeline_settings::domStencil_op::domFail::create(daeInt bytes) +{ + domGles_pipeline_settings::domStencil_op::domFailRef ref = new(bytes) domGles_pipeline_settings::domStencil_op::domFail; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::domStencil_op::domFail::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "fail" ); + _Meta->registerClass(domGles_pipeline_settings::domStencil_op::domFail::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Gles_stencil_op_type")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domStencil_op::domFail , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "KEEP"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domStencil_op::domFail , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings::domStencil_op::domFail)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_pipeline_settings::domStencil_op::domZfail::create(daeInt bytes) +{ + domGles_pipeline_settings::domStencil_op::domZfailRef ref = new(bytes) domGles_pipeline_settings::domStencil_op::domZfail; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::domStencil_op::domZfail::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "zfail" ); + _Meta->registerClass(domGles_pipeline_settings::domStencil_op::domZfail::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Gles_stencil_op_type")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domStencil_op::domZfail , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "KEEP"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domStencil_op::domZfail , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings::domStencil_op::domZfail)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_pipeline_settings::domStencil_op::domZpass::create(daeInt bytes) +{ + domGles_pipeline_settings::domStencil_op::domZpassRef ref = new(bytes) domGles_pipeline_settings::domStencil_op::domZpass; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::domStencil_op::domZpass::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "zpass" ); + _Meta->registerClass(domGles_pipeline_settings::domStencil_op::domZpass::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Gles_stencil_op_type")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domStencil_op::domZpass , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "KEEP"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domStencil_op::domZpass , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings::domStencil_op::domZpass)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_pipeline_settings::domAlpha_test_enable::create(daeInt bytes) +{ + domGles_pipeline_settings::domAlpha_test_enableRef ref = new(bytes) domGles_pipeline_settings::domAlpha_test_enable; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::domAlpha_test_enable::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "alpha_test_enable" ); + _Meta->registerClass(domGles_pipeline_settings::domAlpha_test_enable::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Bool")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domAlpha_test_enable , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "false"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domAlpha_test_enable , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings::domAlpha_test_enable)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_pipeline_settings::domBlend_enable::create(daeInt bytes) +{ + domGles_pipeline_settings::domBlend_enableRef ref = new(bytes) domGles_pipeline_settings::domBlend_enable; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::domBlend_enable::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "blend_enable" ); + _Meta->registerClass(domGles_pipeline_settings::domBlend_enable::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Bool")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domBlend_enable , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "false"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domBlend_enable , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings::domBlend_enable)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_pipeline_settings::domClip_plane_enable::create(daeInt bytes) +{ + domGles_pipeline_settings::domClip_plane_enableRef ref = new(bytes) domGles_pipeline_settings::domClip_plane_enable; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::domClip_plane_enable::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "clip_plane_enable" ); + _Meta->registerClass(domGles_pipeline_settings::domClip_plane_enable::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Bool")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domClip_plane_enable , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "false"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domClip_plane_enable , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: index + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "index" ); + ma->setType( daeAtomicType::get("GLES_MAX_CLIP_PLANES_index")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domClip_plane_enable , attrIndex )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings::domClip_plane_enable)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_pipeline_settings::domColor_logic_op_enable::create(daeInt bytes) +{ + domGles_pipeline_settings::domColor_logic_op_enableRef ref = new(bytes) domGles_pipeline_settings::domColor_logic_op_enable; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::domColor_logic_op_enable::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "color_logic_op_enable" ); + _Meta->registerClass(domGles_pipeline_settings::domColor_logic_op_enable::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Bool")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domColor_logic_op_enable , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "false"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domColor_logic_op_enable , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings::domColor_logic_op_enable)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_pipeline_settings::domColor_material_enable::create(daeInt bytes) +{ + domGles_pipeline_settings::domColor_material_enableRef ref = new(bytes) domGles_pipeline_settings::domColor_material_enable; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::domColor_material_enable::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "color_material_enable" ); + _Meta->registerClass(domGles_pipeline_settings::domColor_material_enable::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Bool")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domColor_material_enable , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "true"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domColor_material_enable , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings::domColor_material_enable)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_pipeline_settings::domCull_face_enable::create(daeInt bytes) +{ + domGles_pipeline_settings::domCull_face_enableRef ref = new(bytes) domGles_pipeline_settings::domCull_face_enable; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::domCull_face_enable::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "cull_face_enable" ); + _Meta->registerClass(domGles_pipeline_settings::domCull_face_enable::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Bool")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domCull_face_enable , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "false"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domCull_face_enable , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings::domCull_face_enable)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_pipeline_settings::domDepth_test_enable::create(daeInt bytes) +{ + domGles_pipeline_settings::domDepth_test_enableRef ref = new(bytes) domGles_pipeline_settings::domDepth_test_enable; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::domDepth_test_enable::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "depth_test_enable" ); + _Meta->registerClass(domGles_pipeline_settings::domDepth_test_enable::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Bool")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domDepth_test_enable , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "false"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domDepth_test_enable , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings::domDepth_test_enable)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_pipeline_settings::domDither_enable::create(daeInt bytes) +{ + domGles_pipeline_settings::domDither_enableRef ref = new(bytes) domGles_pipeline_settings::domDither_enable; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::domDither_enable::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "dither_enable" ); + _Meta->registerClass(domGles_pipeline_settings::domDither_enable::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Bool")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domDither_enable , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "false"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domDither_enable , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings::domDither_enable)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_pipeline_settings::domFog_enable::create(daeInt bytes) +{ + domGles_pipeline_settings::domFog_enableRef ref = new(bytes) domGles_pipeline_settings::domFog_enable; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::domFog_enable::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "fog_enable" ); + _Meta->registerClass(domGles_pipeline_settings::domFog_enable::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Bool")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domFog_enable , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "false"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domFog_enable , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings::domFog_enable)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_pipeline_settings::domTexture_pipeline_enable::create(daeInt bytes) +{ + domGles_pipeline_settings::domTexture_pipeline_enableRef ref = new(bytes) domGles_pipeline_settings::domTexture_pipeline_enable; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::domTexture_pipeline_enable::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "texture_pipeline_enable" ); + _Meta->registerClass(domGles_pipeline_settings::domTexture_pipeline_enable::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Bool")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domTexture_pipeline_enable , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "false"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domTexture_pipeline_enable , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings::domTexture_pipeline_enable)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_pipeline_settings::domLight_enable::create(daeInt bytes) +{ + domGles_pipeline_settings::domLight_enableRef ref = new(bytes) domGles_pipeline_settings::domLight_enable; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::domLight_enable::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "light_enable" ); + _Meta->registerClass(domGles_pipeline_settings::domLight_enable::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Bool")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domLight_enable , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "false"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domLight_enable , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: index + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "index" ); + ma->setType( daeAtomicType::get("GLES_MAX_LIGHTS_index")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domLight_enable , attrIndex )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings::domLight_enable)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_pipeline_settings::domLighting_enable::create(daeInt bytes) +{ + domGles_pipeline_settings::domLighting_enableRef ref = new(bytes) domGles_pipeline_settings::domLighting_enable; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::domLighting_enable::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "lighting_enable" ); + _Meta->registerClass(domGles_pipeline_settings::domLighting_enable::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Bool")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domLighting_enable , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "false"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domLighting_enable , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings::domLighting_enable)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_pipeline_settings::domLight_model_two_side_enable::create(daeInt bytes) +{ + domGles_pipeline_settings::domLight_model_two_side_enableRef ref = new(bytes) domGles_pipeline_settings::domLight_model_two_side_enable; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::domLight_model_two_side_enable::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "light_model_two_side_enable" ); + _Meta->registerClass(domGles_pipeline_settings::domLight_model_two_side_enable::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Bool")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domLight_model_two_side_enable , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "false"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domLight_model_two_side_enable , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings::domLight_model_two_side_enable)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_pipeline_settings::domLine_smooth_enable::create(daeInt bytes) +{ + domGles_pipeline_settings::domLine_smooth_enableRef ref = new(bytes) domGles_pipeline_settings::domLine_smooth_enable; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::domLine_smooth_enable::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "line_smooth_enable" ); + _Meta->registerClass(domGles_pipeline_settings::domLine_smooth_enable::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Bool")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domLine_smooth_enable , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "false"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domLine_smooth_enable , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings::domLine_smooth_enable)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_pipeline_settings::domMultisample_enable::create(daeInt bytes) +{ + domGles_pipeline_settings::domMultisample_enableRef ref = new(bytes) domGles_pipeline_settings::domMultisample_enable; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::domMultisample_enable::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "multisample_enable" ); + _Meta->registerClass(domGles_pipeline_settings::domMultisample_enable::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Bool")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domMultisample_enable , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "false"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domMultisample_enable , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings::domMultisample_enable)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_pipeline_settings::domNormalize_enable::create(daeInt bytes) +{ + domGles_pipeline_settings::domNormalize_enableRef ref = new(bytes) domGles_pipeline_settings::domNormalize_enable; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::domNormalize_enable::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "normalize_enable" ); + _Meta->registerClass(domGles_pipeline_settings::domNormalize_enable::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Bool")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domNormalize_enable , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "false"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domNormalize_enable , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings::domNormalize_enable)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_pipeline_settings::domPoint_smooth_enable::create(daeInt bytes) +{ + domGles_pipeline_settings::domPoint_smooth_enableRef ref = new(bytes) domGles_pipeline_settings::domPoint_smooth_enable; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::domPoint_smooth_enable::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "point_smooth_enable" ); + _Meta->registerClass(domGles_pipeline_settings::domPoint_smooth_enable::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Bool")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domPoint_smooth_enable , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "false"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domPoint_smooth_enable , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings::domPoint_smooth_enable)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_pipeline_settings::domPolygon_offset_fill_enable::create(daeInt bytes) +{ + domGles_pipeline_settings::domPolygon_offset_fill_enableRef ref = new(bytes) domGles_pipeline_settings::domPolygon_offset_fill_enable; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::domPolygon_offset_fill_enable::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "polygon_offset_fill_enable" ); + _Meta->registerClass(domGles_pipeline_settings::domPolygon_offset_fill_enable::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Bool")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domPolygon_offset_fill_enable , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "false"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domPolygon_offset_fill_enable , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings::domPolygon_offset_fill_enable)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_pipeline_settings::domRescale_normal_enable::create(daeInt bytes) +{ + domGles_pipeline_settings::domRescale_normal_enableRef ref = new(bytes) domGles_pipeline_settings::domRescale_normal_enable; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::domRescale_normal_enable::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "rescale_normal_enable" ); + _Meta->registerClass(domGles_pipeline_settings::domRescale_normal_enable::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Bool")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domRescale_normal_enable , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "false"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domRescale_normal_enable , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings::domRescale_normal_enable)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_pipeline_settings::domSample_alpha_to_coverage_enable::create(daeInt bytes) +{ + domGles_pipeline_settings::domSample_alpha_to_coverage_enableRef ref = new(bytes) domGles_pipeline_settings::domSample_alpha_to_coverage_enable; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::domSample_alpha_to_coverage_enable::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "sample_alpha_to_coverage_enable" ); + _Meta->registerClass(domGles_pipeline_settings::domSample_alpha_to_coverage_enable::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Bool")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domSample_alpha_to_coverage_enable , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "false"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domSample_alpha_to_coverage_enable , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings::domSample_alpha_to_coverage_enable)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_pipeline_settings::domSample_alpha_to_one_enable::create(daeInt bytes) +{ + domGles_pipeline_settings::domSample_alpha_to_one_enableRef ref = new(bytes) domGles_pipeline_settings::domSample_alpha_to_one_enable; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::domSample_alpha_to_one_enable::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "sample_alpha_to_one_enable" ); + _Meta->registerClass(domGles_pipeline_settings::domSample_alpha_to_one_enable::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Bool")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domSample_alpha_to_one_enable , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "false"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domSample_alpha_to_one_enable , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings::domSample_alpha_to_one_enable)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_pipeline_settings::domSample_coverage_enable::create(daeInt bytes) +{ + domGles_pipeline_settings::domSample_coverage_enableRef ref = new(bytes) domGles_pipeline_settings::domSample_coverage_enable; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::domSample_coverage_enable::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "sample_coverage_enable" ); + _Meta->registerClass(domGles_pipeline_settings::domSample_coverage_enable::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Bool")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domSample_coverage_enable , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "false"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domSample_coverage_enable , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings::domSample_coverage_enable)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_pipeline_settings::domScissor_test_enable::create(daeInt bytes) +{ + domGles_pipeline_settings::domScissor_test_enableRef ref = new(bytes) domGles_pipeline_settings::domScissor_test_enable; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::domScissor_test_enable::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "scissor_test_enable" ); + _Meta->registerClass(domGles_pipeline_settings::domScissor_test_enable::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Bool")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domScissor_test_enable , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "false"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domScissor_test_enable , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings::domScissor_test_enable)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_pipeline_settings::domStencil_test_enable::create(daeInt bytes) +{ + domGles_pipeline_settings::domStencil_test_enableRef ref = new(bytes) domGles_pipeline_settings::domStencil_test_enable; + return ref; +} + + +daeMetaElement * +domGles_pipeline_settings::domStencil_test_enable::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "stencil_test_enable" ); + _Meta->registerClass(domGles_pipeline_settings::domStencil_test_enable::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Bool")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domStencil_test_enable , attrValue )); + ma->setContainer( _Meta ); + ma->setDefault( "false"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_pipeline_settings::domStencil_test_enable , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_pipeline_settings::domStencil_test_enable)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domGles_pipeline_settings::_Meta = NULL; +daeMetaElement * domGles_pipeline_settings::domAlpha_func::_Meta = NULL; +daeMetaElement * domGles_pipeline_settings::domAlpha_func::domFunc::_Meta = NULL; +daeMetaElement * domGles_pipeline_settings::domAlpha_func::domValue::_Meta = NULL; +daeMetaElement * domGles_pipeline_settings::domBlend_func::_Meta = NULL; +daeMetaElement * domGles_pipeline_settings::domBlend_func::domSrc::_Meta = NULL; +daeMetaElement * domGles_pipeline_settings::domBlend_func::domDest::_Meta = NULL; +daeMetaElement * domGles_pipeline_settings::domClear_color::_Meta = NULL; +daeMetaElement * domGles_pipeline_settings::domClear_stencil::_Meta = NULL; +daeMetaElement * domGles_pipeline_settings::domClear_depth::_Meta = NULL; +daeMetaElement * domGles_pipeline_settings::domClip_plane::_Meta = NULL; +daeMetaElement * domGles_pipeline_settings::domColor_mask::_Meta = NULL; +daeMetaElement * domGles_pipeline_settings::domCull_face::_Meta = NULL; +daeMetaElement * domGles_pipeline_settings::domDepth_func::_Meta = NULL; +daeMetaElement * domGles_pipeline_settings::domDepth_mask::_Meta = NULL; +daeMetaElement * domGles_pipeline_settings::domDepth_range::_Meta = NULL; +daeMetaElement * domGles_pipeline_settings::domFog_color::_Meta = NULL; +daeMetaElement * domGles_pipeline_settings::domFog_density::_Meta = NULL; +daeMetaElement * domGles_pipeline_settings::domFog_mode::_Meta = NULL; +daeMetaElement * domGles_pipeline_settings::domFog_start::_Meta = NULL; +daeMetaElement * domGles_pipeline_settings::domFog_end::_Meta = NULL; +daeMetaElement * domGles_pipeline_settings::domFront_face::_Meta = NULL; +daeMetaElement * domGles_pipeline_settings::domTexture_pipeline::_Meta = NULL; +daeMetaElement * domGles_pipeline_settings::domLogic_op::_Meta = NULL; +daeMetaElement * domGles_pipeline_settings::domLight_ambient::_Meta = NULL; +daeMetaElement * domGles_pipeline_settings::domLight_diffuse::_Meta = NULL; +daeMetaElement * domGles_pipeline_settings::domLight_specular::_Meta = NULL; +daeMetaElement * domGles_pipeline_settings::domLight_position::_Meta = NULL; +daeMetaElement * domGles_pipeline_settings::domLight_constant_attenuation::_Meta = NULL; +daeMetaElement * domGles_pipeline_settings::domLight_linear_attenutation::_Meta = NULL; +daeMetaElement * domGles_pipeline_settings::domLight_quadratic_attenuation::_Meta = NULL; +daeMetaElement * domGles_pipeline_settings::domLight_spot_cutoff::_Meta = NULL; +daeMetaElement * domGles_pipeline_settings::domLight_spot_direction::_Meta = NULL; +daeMetaElement * domGles_pipeline_settings::domLight_spot_exponent::_Meta = NULL; +daeMetaElement * domGles_pipeline_settings::domLight_model_ambient::_Meta = NULL; +daeMetaElement * domGles_pipeline_settings::domLine_width::_Meta = NULL; +daeMetaElement * domGles_pipeline_settings::domMaterial_ambient::_Meta = NULL; +daeMetaElement * domGles_pipeline_settings::domMaterial_diffuse::_Meta = NULL; +daeMetaElement * domGles_pipeline_settings::domMaterial_emission::_Meta = NULL; +daeMetaElement * domGles_pipeline_settings::domMaterial_shininess::_Meta = NULL; +daeMetaElement * domGles_pipeline_settings::domMaterial_specular::_Meta = NULL; +daeMetaElement * domGles_pipeline_settings::domModel_view_matrix::_Meta = NULL; +daeMetaElement * domGles_pipeline_settings::domPoint_distance_attenuation::_Meta = NULL; +daeMetaElement * domGles_pipeline_settings::domPoint_fade_threshold_size::_Meta = NULL; +daeMetaElement * domGles_pipeline_settings::domPoint_size::_Meta = NULL; +daeMetaElement * domGles_pipeline_settings::domPoint_size_min::_Meta = NULL; +daeMetaElement * domGles_pipeline_settings::domPoint_size_max::_Meta = NULL; +daeMetaElement * domGles_pipeline_settings::domPolygon_offset::_Meta = NULL; +daeMetaElement * domGles_pipeline_settings::domProjection_matrix::_Meta = NULL; +daeMetaElement * domGles_pipeline_settings::domScissor::_Meta = NULL; +daeMetaElement * domGles_pipeline_settings::domShade_model::_Meta = NULL; +daeMetaElement * domGles_pipeline_settings::domStencil_func::_Meta = NULL; +daeMetaElement * domGles_pipeline_settings::domStencil_func::domFunc::_Meta = NULL; +daeMetaElement * domGles_pipeline_settings::domStencil_func::domRef::_Meta = NULL; +daeMetaElement * domGles_pipeline_settings::domStencil_func::domMask::_Meta = NULL; +daeMetaElement * domGles_pipeline_settings::domStencil_mask::_Meta = NULL; +daeMetaElement * domGles_pipeline_settings::domStencil_op::_Meta = NULL; +daeMetaElement * domGles_pipeline_settings::domStencil_op::domFail::_Meta = NULL; +daeMetaElement * domGles_pipeline_settings::domStencil_op::domZfail::_Meta = NULL; +daeMetaElement * domGles_pipeline_settings::domStencil_op::domZpass::_Meta = NULL; +daeMetaElement * domGles_pipeline_settings::domAlpha_test_enable::_Meta = NULL; +daeMetaElement * domGles_pipeline_settings::domBlend_enable::_Meta = NULL; +daeMetaElement * domGles_pipeline_settings::domClip_plane_enable::_Meta = NULL; +daeMetaElement * domGles_pipeline_settings::domColor_logic_op_enable::_Meta = NULL; +daeMetaElement * domGles_pipeline_settings::domColor_material_enable::_Meta = NULL; +daeMetaElement * domGles_pipeline_settings::domCull_face_enable::_Meta = NULL; +daeMetaElement * domGles_pipeline_settings::domDepth_test_enable::_Meta = NULL; +daeMetaElement * domGles_pipeline_settings::domDither_enable::_Meta = NULL; +daeMetaElement * domGles_pipeline_settings::domFog_enable::_Meta = NULL; +daeMetaElement * domGles_pipeline_settings::domTexture_pipeline_enable::_Meta = NULL; +daeMetaElement * domGles_pipeline_settings::domLight_enable::_Meta = NULL; +daeMetaElement * domGles_pipeline_settings::domLighting_enable::_Meta = NULL; +daeMetaElement * domGles_pipeline_settings::domLight_model_two_side_enable::_Meta = NULL; +daeMetaElement * domGles_pipeline_settings::domLine_smooth_enable::_Meta = NULL; +daeMetaElement * domGles_pipeline_settings::domMultisample_enable::_Meta = NULL; +daeMetaElement * domGles_pipeline_settings::domNormalize_enable::_Meta = NULL; +daeMetaElement * domGles_pipeline_settings::domPoint_smooth_enable::_Meta = NULL; +daeMetaElement * domGles_pipeline_settings::domPolygon_offset_fill_enable::_Meta = NULL; +daeMetaElement * domGles_pipeline_settings::domRescale_normal_enable::_Meta = NULL; +daeMetaElement * domGles_pipeline_settings::domSample_alpha_to_coverage_enable::_Meta = NULL; +daeMetaElement * domGles_pipeline_settings::domSample_alpha_to_one_enable::_Meta = NULL; +daeMetaElement * domGles_pipeline_settings::domSample_coverage_enable::_Meta = NULL; +daeMetaElement * domGles_pipeline_settings::domScissor_test_enable::_Meta = NULL; +daeMetaElement * domGles_pipeline_settings::domStencil_test_enable::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGles_sampler_state.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGles_sampler_state.cpp new file mode 100644 index 00000000..c0e1888a --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGles_sampler_state.cpp @@ -0,0 +1,368 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domGles_sampler_state::create(daeInt bytes) +{ + domGles_sampler_stateRef ref = new(bytes) domGles_sampler_state; + return ref; +} + + +daeMetaElement * +domGles_sampler_state::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "gles_sampler_state" ); + _Meta->registerClass(domGles_sampler_state::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 0, 1 ); + mea->setName( "wrap_s" ); + mea->setOffset( daeOffsetOf(domGles_sampler_state,elemWrap_s) ); + mea->setElementType( domGles_sampler_state::domWrap_s::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 0, 1 ); + mea->setName( "wrap_t" ); + mea->setOffset( daeOffsetOf(domGles_sampler_state,elemWrap_t) ); + mea->setElementType( domGles_sampler_state::domWrap_t::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 2, 0, 1 ); + mea->setName( "minfilter" ); + mea->setOffset( daeOffsetOf(domGles_sampler_state,elemMinfilter) ); + mea->setElementType( domGles_sampler_state::domMinfilter::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 3, 0, 1 ); + mea->setName( "magfilter" ); + mea->setOffset( daeOffsetOf(domGles_sampler_state,elemMagfilter) ); + mea->setElementType( domGles_sampler_state::domMagfilter::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 4, 0, 1 ); + mea->setName( "mipfilter" ); + mea->setOffset( daeOffsetOf(domGles_sampler_state,elemMipfilter) ); + mea->setElementType( domGles_sampler_state::domMipfilter::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 5, 0, 1 ); + mea->setName( "mipmap_maxlevel" ); + mea->setOffset( daeOffsetOf(domGles_sampler_state,elemMipmap_maxlevel) ); + mea->setElementType( domGles_sampler_state::domMipmap_maxlevel::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 6, 0, 1 ); + mea->setName( "mipmap_bias" ); + mea->setOffset( daeOffsetOf(domGles_sampler_state,elemMipmap_bias) ); + mea->setElementType( domGles_sampler_state::domMipmap_bias::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 7, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domGles_sampler_state,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 7 ); + _Meta->setCMRoot( cm ); + + // Add attribute: sid + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "sid" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_sampler_state , attrSid )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_sampler_state)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_sampler_state::domWrap_s::create(daeInt bytes) +{ + domGles_sampler_state::domWrap_sRef ref = new(bytes) domGles_sampler_state::domWrap_s; + return ref; +} + + +daeMetaElement * +domGles_sampler_state::domWrap_s::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "wrap_s" ); + _Meta->registerClass(domGles_sampler_state::domWrap_s::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Gles_sampler_wrap")); + ma->setOffset( daeOffsetOf( domGles_sampler_state::domWrap_s , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_sampler_state::domWrap_s)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_sampler_state::domWrap_t::create(daeInt bytes) +{ + domGles_sampler_state::domWrap_tRef ref = new(bytes) domGles_sampler_state::domWrap_t; + return ref; +} + + +daeMetaElement * +domGles_sampler_state::domWrap_t::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "wrap_t" ); + _Meta->registerClass(domGles_sampler_state::domWrap_t::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Gles_sampler_wrap")); + ma->setOffset( daeOffsetOf( domGles_sampler_state::domWrap_t , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_sampler_state::domWrap_t)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_sampler_state::domMinfilter::create(daeInt bytes) +{ + domGles_sampler_state::domMinfilterRef ref = new(bytes) domGles_sampler_state::domMinfilter; + return ref; +} + + +daeMetaElement * +domGles_sampler_state::domMinfilter::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "minfilter" ); + _Meta->registerClass(domGles_sampler_state::domMinfilter::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Fx_sampler_filter_common")); + ma->setOffset( daeOffsetOf( domGles_sampler_state::domMinfilter , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_sampler_state::domMinfilter)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_sampler_state::domMagfilter::create(daeInt bytes) +{ + domGles_sampler_state::domMagfilterRef ref = new(bytes) domGles_sampler_state::domMagfilter; + return ref; +} + + +daeMetaElement * +domGles_sampler_state::domMagfilter::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "magfilter" ); + _Meta->registerClass(domGles_sampler_state::domMagfilter::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Fx_sampler_filter_common")); + ma->setOffset( daeOffsetOf( domGles_sampler_state::domMagfilter , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_sampler_state::domMagfilter)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_sampler_state::domMipfilter::create(daeInt bytes) +{ + domGles_sampler_state::domMipfilterRef ref = new(bytes) domGles_sampler_state::domMipfilter; + return ref; +} + + +daeMetaElement * +domGles_sampler_state::domMipfilter::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "mipfilter" ); + _Meta->registerClass(domGles_sampler_state::domMipfilter::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Fx_sampler_filter_common")); + ma->setOffset( daeOffsetOf( domGles_sampler_state::domMipfilter , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_sampler_state::domMipfilter)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_sampler_state::domMipmap_maxlevel::create(daeInt bytes) +{ + domGles_sampler_state::domMipmap_maxlevelRef ref = new(bytes) domGles_sampler_state::domMipmap_maxlevel; + return ref; +} + + +daeMetaElement * +domGles_sampler_state::domMipmap_maxlevel::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "mipmap_maxlevel" ); + _Meta->registerClass(domGles_sampler_state::domMipmap_maxlevel::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("xsUnsignedByte")); + ma->setOffset( daeOffsetOf( domGles_sampler_state::domMipmap_maxlevel , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_sampler_state::domMipmap_maxlevel)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_sampler_state::domMipmap_bias::create(daeInt bytes) +{ + domGles_sampler_state::domMipmap_biasRef ref = new(bytes) domGles_sampler_state::domMipmap_bias; + return ref; +} + + +daeMetaElement * +domGles_sampler_state::domMipmap_bias::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "mipmap_bias" ); + _Meta->registerClass(domGles_sampler_state::domMipmap_bias::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("xsFloat")); + ma->setOffset( daeOffsetOf( domGles_sampler_state::domMipmap_bias , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_sampler_state::domMipmap_bias)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domGles_sampler_state::_Meta = NULL; +daeMetaElement * domGles_sampler_state::domWrap_s::_Meta = NULL; +daeMetaElement * domGles_sampler_state::domWrap_t::_Meta = NULL; +daeMetaElement * domGles_sampler_state::domMinfilter::_Meta = NULL; +daeMetaElement * domGles_sampler_state::domMagfilter::_Meta = NULL; +daeMetaElement * domGles_sampler_state::domMipfilter::_Meta = NULL; +daeMetaElement * domGles_sampler_state::domMipmap_maxlevel::_Meta = NULL; +daeMetaElement * domGles_sampler_state::domMipmap_bias::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGles_texcombiner_argumentAlpha_type.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGles_texcombiner_argumentAlpha_type.cpp new file mode 100644 index 00000000..d72b09ca --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGles_texcombiner_argumentAlpha_type.cpp @@ -0,0 +1,86 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domGles_texcombiner_argumentAlpha_type::create(daeInt bytes) +{ + domGles_texcombiner_argumentAlpha_typeRef ref = new(bytes) domGles_texcombiner_argumentAlpha_type; + return ref; +} + + +daeMetaElement * +domGles_texcombiner_argumentAlpha_type::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "gles_texcombiner_argumentAlpha_type" ); + _Meta->registerClass(domGles_texcombiner_argumentAlpha_type::create, &_Meta); + + + // Add attribute: source + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "source" ); + ma->setType( daeAtomicType::get("Gles_texcombiner_source_enums")); + ma->setOffset( daeOffsetOf( domGles_texcombiner_argumentAlpha_type , attrSource )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: operand + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "operand" ); + ma->setType( daeAtomicType::get("Gles_texcombiner_operandAlpha_enums")); + ma->setOffset( daeOffsetOf( domGles_texcombiner_argumentAlpha_type , attrOperand )); + ma->setContainer( _Meta ); + ma->setDefault( "SRC_ALPHA"); + + _Meta->appendAttribute(ma); + } + + // Add attribute: unit + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "unit" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_texcombiner_argumentAlpha_type , attrUnit )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_texcombiner_argumentAlpha_type)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domGles_texcombiner_argumentAlpha_type::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGles_texcombiner_argumentRGB_type.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGles_texcombiner_argumentRGB_type.cpp new file mode 100644 index 00000000..ac0774ad --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGles_texcombiner_argumentRGB_type.cpp @@ -0,0 +1,86 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domGles_texcombiner_argumentRGB_type::create(daeInt bytes) +{ + domGles_texcombiner_argumentRGB_typeRef ref = new(bytes) domGles_texcombiner_argumentRGB_type; + return ref; +} + + +daeMetaElement * +domGles_texcombiner_argumentRGB_type::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "gles_texcombiner_argumentRGB_type" ); + _Meta->registerClass(domGles_texcombiner_argumentRGB_type::create, &_Meta); + + + // Add attribute: source + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "source" ); + ma->setType( daeAtomicType::get("Gles_texcombiner_source_enums")); + ma->setOffset( daeOffsetOf( domGles_texcombiner_argumentRGB_type , attrSource )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: operand + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "operand" ); + ma->setType( daeAtomicType::get("Gles_texcombiner_operandRGB_enums")); + ma->setOffset( daeOffsetOf( domGles_texcombiner_argumentRGB_type , attrOperand )); + ma->setContainer( _Meta ); + ma->setDefault( "SRC_COLOR"); + + _Meta->appendAttribute(ma); + } + + // Add attribute: unit + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "unit" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_texcombiner_argumentRGB_type , attrUnit )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_texcombiner_argumentRGB_type)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domGles_texcombiner_argumentRGB_type::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGles_texcombiner_commandAlpha_type.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGles_texcombiner_commandAlpha_type.cpp new file mode 100644 index 00000000..89a966f2 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGles_texcombiner_commandAlpha_type.cpp @@ -0,0 +1,86 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domGles_texcombiner_commandAlpha_type::create(daeInt bytes) +{ + domGles_texcombiner_commandAlpha_typeRef ref = new(bytes) domGles_texcombiner_commandAlpha_type; + return ref; +} + + +daeMetaElement * +domGles_texcombiner_commandAlpha_type::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "gles_texcombiner_commandAlpha_type" ); + _Meta->registerClass(domGles_texcombiner_commandAlpha_type::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 3 ); + mea->setName( "argument" ); + mea->setOffset( daeOffsetOf(domGles_texcombiner_commandAlpha_type,elemArgument_array) ); + mea->setElementType( domGles_texcombiner_argumentAlpha_type::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + _Meta->setCMRoot( cm ); + + // Add attribute: operator + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "operator" ); + ma->setType( daeAtomicType::get("Gles_texcombiner_operatorAlpha_enums")); + ma->setOffset( daeOffsetOf( domGles_texcombiner_commandAlpha_type , attrOperator )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: scale + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "scale" ); + ma->setType( daeAtomicType::get("xsFloat")); + ma->setOffset( daeOffsetOf( domGles_texcombiner_commandAlpha_type , attrScale )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_texcombiner_commandAlpha_type)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domGles_texcombiner_commandAlpha_type::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGles_texcombiner_commandRGB_type.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGles_texcombiner_commandRGB_type.cpp new file mode 100644 index 00000000..599014c1 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGles_texcombiner_commandRGB_type.cpp @@ -0,0 +1,86 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domGles_texcombiner_commandRGB_type::create(daeInt bytes) +{ + domGles_texcombiner_commandRGB_typeRef ref = new(bytes) domGles_texcombiner_commandRGB_type; + return ref; +} + + +daeMetaElement * +domGles_texcombiner_commandRGB_type::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "gles_texcombiner_commandRGB_type" ); + _Meta->registerClass(domGles_texcombiner_commandRGB_type::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 3 ); + mea->setName( "argument" ); + mea->setOffset( daeOffsetOf(domGles_texcombiner_commandRGB_type,elemArgument_array) ); + mea->setElementType( domGles_texcombiner_argumentRGB_type::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + _Meta->setCMRoot( cm ); + + // Add attribute: operator + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "operator" ); + ma->setType( daeAtomicType::get("Gles_texcombiner_operatorRGB_enums")); + ma->setOffset( daeOffsetOf( domGles_texcombiner_commandRGB_type , attrOperator )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: scale + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "scale" ); + ma->setType( daeAtomicType::get("xsFloat")); + ma->setOffset( daeOffsetOf( domGles_texcombiner_commandRGB_type , attrScale )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_texcombiner_commandRGB_type)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domGles_texcombiner_commandRGB_type::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGles_texcombiner_command_type.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGles_texcombiner_command_type.cpp new file mode 100644 index 00000000..1c3f73d9 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGles_texcombiner_command_type.cpp @@ -0,0 +1,75 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domGles_texcombiner_command_type::create(daeInt bytes) +{ + domGles_texcombiner_command_typeRef ref = new(bytes) domGles_texcombiner_command_type; + return ref; +} + + +daeMetaElement * +domGles_texcombiner_command_type::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "gles_texcombiner_command_type" ); + _Meta->registerClass(domGles_texcombiner_command_type::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 0, 1 ); + mea->setName( "constant" ); + mea->setOffset( daeOffsetOf(domGles_texcombiner_command_type,elemConstant) ); + mea->setElementType( domGles_texture_constant_type::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 0, 1 ); + mea->setName( "RGB" ); + mea->setOffset( daeOffsetOf(domGles_texcombiner_command_type,elemRGB) ); + mea->setElementType( domGles_texcombiner_commandRGB_type::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 2, 0, 1 ); + mea->setName( "alpha" ); + mea->setOffset( daeOffsetOf(domGles_texcombiner_command_type,elemAlpha) ); + mea->setElementType( domGles_texcombiner_commandAlpha_type::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 2 ); + _Meta->setCMRoot( cm ); + + + _Meta->setElementSize(sizeof(domGles_texcombiner_command_type)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domGles_texcombiner_command_type::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGles_texenv_command_type.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGles_texenv_command_type.cpp new file mode 100644 index 00000000..3c5600ba --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGles_texenv_command_type.cpp @@ -0,0 +1,85 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domGles_texenv_command_type::create(daeInt bytes) +{ + domGles_texenv_command_typeRef ref = new(bytes) domGles_texenv_command_type; + return ref; +} + + +daeMetaElement * +domGles_texenv_command_type::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "gles_texenv_command_type" ); + _Meta->registerClass(domGles_texenv_command_type::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 0, 1 ); + mea->setName( "constant" ); + mea->setOffset( daeOffsetOf(domGles_texenv_command_type,elemConstant) ); + mea->setElementType( domGles_texture_constant_type::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + _Meta->setCMRoot( cm ); + + // Add attribute: operator + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "operator" ); + ma->setType( daeAtomicType::get("Gles_texenv_mode_enums")); + ma->setOffset( daeOffsetOf( domGles_texenv_command_type , attrOperator )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: unit + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "unit" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_texenv_command_type , attrUnit )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_texenv_command_type)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domGles_texenv_command_type::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGles_texture_constant_type.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGles_texture_constant_type.cpp new file mode 100644 index 00000000..d36de179 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGles_texture_constant_type.cpp @@ -0,0 +1,75 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domGles_texture_constant_type::create(daeInt bytes) +{ + domGles_texture_constant_typeRef ref = new(bytes) domGles_texture_constant_type; + return ref; +} + + +daeMetaElement * +domGles_texture_constant_type::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "gles_texture_constant_type" ); + _Meta->registerClass(domGles_texture_constant_type::create, &_Meta); + + + // Add attribute: value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "value" ); + ma->setType( daeAtomicType::get("Float4")); + ma->setOffset( daeOffsetOf( domGles_texture_constant_type , attrValue )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: param + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "param" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_texture_constant_type , attrParam )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_texture_constant_type)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domGles_texture_constant_type::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGles_texture_pipeline.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGles_texture_pipeline.cpp new file mode 100644 index 00000000..be73c5a2 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGles_texture_pipeline.cpp @@ -0,0 +1,90 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domGles_texture_pipeline::create(daeInt bytes) +{ + domGles_texture_pipelineRef ref = new(bytes) domGles_texture_pipeline; + return ref; +} + + +daeMetaElement * +domGles_texture_pipeline::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "gles_texture_pipeline" ); + _Meta->registerClass(domGles_texture_pipeline::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaChoice( _Meta, cm, 0, 1, -1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "texcombiner" ); + mea->setOffset( daeOffsetOf(domGles_texture_pipeline,elemTexcombiner_array) ); + mea->setElementType( domGles_texcombiner_command_type::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "texenv" ); + mea->setOffset( daeOffsetOf(domGles_texture_pipeline,elemTexenv_array) ); + mea->setElementType( domGles_texenv_command_type::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domGles_texture_pipeline,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 3000 ); + _Meta->setCMRoot( cm ); + // Ordered list of sub-elements + _Meta->addContents(daeOffsetOf(domGles_texture_pipeline,_contents)); + _Meta->addContentsOrder(daeOffsetOf(domGles_texture_pipeline,_contentsOrder)); + + + // Add attribute: sid + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "sid" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_texture_pipeline , attrSid )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_texture_pipeline)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domGles_texture_pipeline::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGles_texture_unit.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGles_texture_unit.cpp new file mode 100644 index 00000000..b6e77306 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGles_texture_unit.cpp @@ -0,0 +1,202 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domGles_texture_unit::create(daeInt bytes) +{ + domGles_texture_unitRef ref = new(bytes) domGles_texture_unit; + return ref; +} + + +daeMetaElement * +domGles_texture_unit::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "gles_texture_unit" ); + _Meta->registerClass(domGles_texture_unit::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 0, 1 ); + mea->setName( "surface" ); + mea->setOffset( daeOffsetOf(domGles_texture_unit,elemSurface) ); + mea->setElementType( domGles_texture_unit::domSurface::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 0, 1 ); + mea->setName( "sampler_state" ); + mea->setOffset( daeOffsetOf(domGles_texture_unit,elemSampler_state) ); + mea->setElementType( domGles_texture_unit::domSampler_state::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 2, 0, 1 ); + mea->setName( "texcoord" ); + mea->setOffset( daeOffsetOf(domGles_texture_unit,elemTexcoord) ); + mea->setElementType( domGles_texture_unit::domTexcoord::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 3, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domGles_texture_unit,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 3 ); + _Meta->setCMRoot( cm ); + + // Add attribute: sid + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "sid" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_texture_unit , attrSid )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_texture_unit)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_texture_unit::domSurface::create(daeInt bytes) +{ + domGles_texture_unit::domSurfaceRef ref = new(bytes) domGles_texture_unit::domSurface; + return ref; +} + + +daeMetaElement * +domGles_texture_unit::domSurface::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "surface" ); + _Meta->registerClass(domGles_texture_unit::domSurface::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_texture_unit::domSurface , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_texture_unit::domSurface)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_texture_unit::domSampler_state::create(daeInt bytes) +{ + domGles_texture_unit::domSampler_stateRef ref = new(bytes) domGles_texture_unit::domSampler_state; + return ref; +} + + +daeMetaElement * +domGles_texture_unit::domSampler_state::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "sampler_state" ); + _Meta->registerClass(domGles_texture_unit::domSampler_state::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_texture_unit::domSampler_state , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_texture_unit::domSampler_state)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGles_texture_unit::domTexcoord::create(daeInt bytes) +{ + domGles_texture_unit::domTexcoordRef ref = new(bytes) domGles_texture_unit::domTexcoord; + return ref; +} + + +daeMetaElement * +domGles_texture_unit::domTexcoord::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "texcoord" ); + _Meta->registerClass(domGles_texture_unit::domTexcoord::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: semantic + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "semantic" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGles_texture_unit::domTexcoord , attrSemantic )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGles_texture_unit::domTexcoord)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domGles_texture_unit::_Meta = NULL; +daeMetaElement * domGles_texture_unit::domSurface::_Meta = NULL; +daeMetaElement * domGles_texture_unit::domSampler_state::_Meta = NULL; +daeMetaElement * domGles_texture_unit::domTexcoord::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGlsl_newarray_type.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGlsl_newarray_type.cpp new file mode 100644 index 00000000..586c8d23 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGlsl_newarray_type.cpp @@ -0,0 +1,85 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domGlsl_newarray_type::create(daeInt bytes) +{ + domGlsl_newarray_typeRef ref = new(bytes) domGlsl_newarray_type; + return ref; +} + + +daeMetaElement * +domGlsl_newarray_type::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "glsl_newarray_type" ); + _Meta->registerClass(domGlsl_newarray_type::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaChoice( _Meta, cm, 0, 0, -1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "glsl_param_type" ); + mea->setOffset( daeOffsetOf(domGlsl_newarray_type,elemGlsl_param_type_array) ); + mea->setElementType( domGlsl_param_type::registerElement() ); + cm->appendChild( new daeMetaGroup( mea, _Meta, cm, 0, 1, 1 ) ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "array" ); + mea->setOffset( daeOffsetOf(domGlsl_newarray_type,elemArray_array) ); + mea->setElementType( domGlsl_newarray_type::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 3000 ); + _Meta->setCMRoot( cm ); + // Ordered list of sub-elements + _Meta->addContents(daeOffsetOf(domGlsl_newarray_type,_contents)); + _Meta->addContentsOrder(daeOffsetOf(domGlsl_newarray_type,_contentsOrder)); + + + // Add attribute: length + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "length" ); + ma->setType( daeAtomicType::get("xsPositiveInteger")); + ma->setOffset( daeOffsetOf( domGlsl_newarray_type , attrLength )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGlsl_newarray_type)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domGlsl_newarray_type::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGlsl_newparam.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGlsl_newparam.cpp new file mode 100644 index 00000000..0dd072d9 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGlsl_newparam.cpp @@ -0,0 +1,181 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domGlsl_newparam::create(daeInt bytes) +{ + domGlsl_newparamRef ref = new(bytes) domGlsl_newparam; + return ref; +} + + +daeMetaElement * +domGlsl_newparam::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "glsl_newparam" ); + _Meta->registerClass(domGlsl_newparam::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 0, -1 ); + mea->setName( "annotate" ); + mea->setOffset( daeOffsetOf(domGlsl_newparam,elemAnnotate_array) ); + mea->setElementType( domFx_annotate_common::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 0, 1 ); + mea->setName( "semantic" ); + mea->setOffset( daeOffsetOf(domGlsl_newparam,elemSemantic) ); + mea->setElementType( domGlsl_newparam::domSemantic::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 2, 0, 1 ); + mea->setName( "modifier" ); + mea->setOffset( daeOffsetOf(domGlsl_newparam,elemModifier) ); + mea->setElementType( domGlsl_newparam::domModifier::registerElement() ); + cm->appendChild( mea ); + + cm = new daeMetaChoice( _Meta, cm, 3, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "glsl_param_type" ); + mea->setOffset( daeOffsetOf(domGlsl_newparam,elemGlsl_param_type) ); + mea->setElementType( domGlsl_param_type::registerElement() ); + cm->appendChild( new daeMetaGroup( mea, _Meta, cm, 0, 1, 1 ) ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "array" ); + mea->setOffset( daeOffsetOf(domGlsl_newparam,elemArray) ); + mea->setElementType( domGlsl_newarray_type::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + cm->getParent()->appendChild( cm ); + cm = cm->getParent(); + + cm->setMaxOrdinal( 3 ); + _Meta->setCMRoot( cm ); + // Ordered list of sub-elements + _Meta->addContents(daeOffsetOf(domGlsl_newparam,_contents)); + _Meta->addContentsOrder(daeOffsetOf(domGlsl_newparam,_contentsOrder)); + + + // Add attribute: sid + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "sid" ); + ma->setType( daeAtomicType::get("Glsl_identifier")); + ma->setOffset( daeOffsetOf( domGlsl_newparam , attrSid )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGlsl_newparam)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGlsl_newparam::domSemantic::create(daeInt bytes) +{ + domGlsl_newparam::domSemanticRef ref = new(bytes) domGlsl_newparam::domSemantic; + return ref; +} + + +daeMetaElement * +domGlsl_newparam::domSemantic::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "semantic" ); + _Meta->registerClass(domGlsl_newparam::domSemantic::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGlsl_newparam::domSemantic , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGlsl_newparam::domSemantic)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGlsl_newparam::domModifier::create(daeInt bytes) +{ + domGlsl_newparam::domModifierRef ref = new(bytes) domGlsl_newparam::domModifier; + return ref; +} + + +daeMetaElement * +domGlsl_newparam::domModifier::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "modifier" ); + _Meta->registerClass(domGlsl_newparam::domModifier::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Fx_modifier_enum_common")); + ma->setOffset( daeOffsetOf( domGlsl_newparam::domModifier , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGlsl_newparam::domModifier)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domGlsl_newparam::_Meta = NULL; +daeMetaElement * domGlsl_newparam::domSemantic::_Meta = NULL; +daeMetaElement * domGlsl_newparam::domModifier::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGlsl_param_type.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGlsl_param_type.cpp new file mode 100644 index 00000000..5a2ec31a --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGlsl_param_type.cpp @@ -0,0 +1,776 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domGlsl_param_type::create(daeInt bytes) +{ + domGlsl_param_typeRef ref = new(bytes) domGlsl_param_type; + return ref; +} + + +daeMetaElement * +domGlsl_param_type::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "glsl_param_type" ); + _Meta->registerClass(domGlsl_param_type::create, &_Meta); + + _Meta->setIsTransparent( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaChoice( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "bool" ); + mea->setOffset( daeOffsetOf(domGlsl_param_type,elemBool) ); + mea->setElementType( domGlsl_param_type::domBool::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "bool2" ); + mea->setOffset( daeOffsetOf(domGlsl_param_type,elemBool2) ); + mea->setElementType( domGlsl_param_type::domBool2::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "bool3" ); + mea->setOffset( daeOffsetOf(domGlsl_param_type,elemBool3) ); + mea->setElementType( domGlsl_param_type::domBool3::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "bool4" ); + mea->setOffset( daeOffsetOf(domGlsl_param_type,elemBool4) ); + mea->setElementType( domGlsl_param_type::domBool4::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "float" ); + mea->setOffset( daeOffsetOf(domGlsl_param_type,elemFloat) ); + mea->setElementType( domGlsl_param_type::domFloat::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "float2" ); + mea->setOffset( daeOffsetOf(domGlsl_param_type,elemFloat2) ); + mea->setElementType( domGlsl_param_type::domFloat2::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "float3" ); + mea->setOffset( daeOffsetOf(domGlsl_param_type,elemFloat3) ); + mea->setElementType( domGlsl_param_type::domFloat3::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "float4" ); + mea->setOffset( daeOffsetOf(domGlsl_param_type,elemFloat4) ); + mea->setElementType( domGlsl_param_type::domFloat4::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "float2x2" ); + mea->setOffset( daeOffsetOf(domGlsl_param_type,elemFloat2x2) ); + mea->setElementType( domGlsl_param_type::domFloat2x2::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "float3x3" ); + mea->setOffset( daeOffsetOf(domGlsl_param_type,elemFloat3x3) ); + mea->setElementType( domGlsl_param_type::domFloat3x3::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "float4x4" ); + mea->setOffset( daeOffsetOf(domGlsl_param_type,elemFloat4x4) ); + mea->setElementType( domGlsl_param_type::domFloat4x4::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "int" ); + mea->setOffset( daeOffsetOf(domGlsl_param_type,elemInt) ); + mea->setElementType( domGlsl_param_type::domInt::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "int2" ); + mea->setOffset( daeOffsetOf(domGlsl_param_type,elemInt2) ); + mea->setElementType( domGlsl_param_type::domInt2::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "int3" ); + mea->setOffset( daeOffsetOf(domGlsl_param_type,elemInt3) ); + mea->setElementType( domGlsl_param_type::domInt3::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "int4" ); + mea->setOffset( daeOffsetOf(domGlsl_param_type,elemInt4) ); + mea->setElementType( domGlsl_param_type::domInt4::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "surface" ); + mea->setOffset( daeOffsetOf(domGlsl_param_type,elemSurface) ); + mea->setElementType( domGlsl_surface_type::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "sampler1D" ); + mea->setOffset( daeOffsetOf(domGlsl_param_type,elemSampler1D) ); + mea->setElementType( domGl_sampler1D::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "sampler2D" ); + mea->setOffset( daeOffsetOf(domGlsl_param_type,elemSampler2D) ); + mea->setElementType( domGl_sampler2D::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "sampler3D" ); + mea->setOffset( daeOffsetOf(domGlsl_param_type,elemSampler3D) ); + mea->setElementType( domGl_sampler3D::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "samplerCUBE" ); + mea->setOffset( daeOffsetOf(domGlsl_param_type,elemSamplerCUBE) ); + mea->setElementType( domGl_samplerCUBE::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "samplerRECT" ); + mea->setOffset( daeOffsetOf(domGlsl_param_type,elemSamplerRECT) ); + mea->setElementType( domGl_samplerRECT::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "samplerDEPTH" ); + mea->setOffset( daeOffsetOf(domGlsl_param_type,elemSamplerDEPTH) ); + mea->setElementType( domGl_samplerDEPTH::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "enum" ); + mea->setOffset( daeOffsetOf(domGlsl_param_type,elemEnum) ); + mea->setElementType( domGlsl_param_type::domEnum::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + _Meta->setCMRoot( cm ); + // Ordered list of sub-elements + _Meta->addContents(daeOffsetOf(domGlsl_param_type,_contents)); + _Meta->addContentsOrder(daeOffsetOf(domGlsl_param_type,_contentsOrder)); + + + + _Meta->setElementSize(sizeof(domGlsl_param_type)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGlsl_param_type::domBool::create(daeInt bytes) +{ + domGlsl_param_type::domBoolRef ref = new(bytes) domGlsl_param_type::domBool; + return ref; +} + + +daeMetaElement * +domGlsl_param_type::domBool::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "bool" ); + _Meta->registerClass(domGlsl_param_type::domBool::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Glsl_bool")); + ma->setOffset( daeOffsetOf( domGlsl_param_type::domBool , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGlsl_param_type::domBool)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGlsl_param_type::domBool2::create(daeInt bytes) +{ + domGlsl_param_type::domBool2Ref ref = new(bytes) domGlsl_param_type::domBool2; + return ref; +} + + +daeMetaElement * +domGlsl_param_type::domBool2::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "bool2" ); + _Meta->registerClass(domGlsl_param_type::domBool2::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Glsl_bool2")); + ma->setOffset( daeOffsetOf( domGlsl_param_type::domBool2 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGlsl_param_type::domBool2)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGlsl_param_type::domBool3::create(daeInt bytes) +{ + domGlsl_param_type::domBool3Ref ref = new(bytes) domGlsl_param_type::domBool3; + return ref; +} + + +daeMetaElement * +domGlsl_param_type::domBool3::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "bool3" ); + _Meta->registerClass(domGlsl_param_type::domBool3::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Glsl_bool3")); + ma->setOffset( daeOffsetOf( domGlsl_param_type::domBool3 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGlsl_param_type::domBool3)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGlsl_param_type::domBool4::create(daeInt bytes) +{ + domGlsl_param_type::domBool4Ref ref = new(bytes) domGlsl_param_type::domBool4; + return ref; +} + + +daeMetaElement * +domGlsl_param_type::domBool4::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "bool4" ); + _Meta->registerClass(domGlsl_param_type::domBool4::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Glsl_bool4")); + ma->setOffset( daeOffsetOf( domGlsl_param_type::domBool4 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGlsl_param_type::domBool4)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGlsl_param_type::domFloat::create(daeInt bytes) +{ + domGlsl_param_type::domFloatRef ref = new(bytes) domGlsl_param_type::domFloat; + return ref; +} + + +daeMetaElement * +domGlsl_param_type::domFloat::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "float" ); + _Meta->registerClass(domGlsl_param_type::domFloat::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Glsl_float")); + ma->setOffset( daeOffsetOf( domGlsl_param_type::domFloat , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGlsl_param_type::domFloat)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGlsl_param_type::domFloat2::create(daeInt bytes) +{ + domGlsl_param_type::domFloat2Ref ref = new(bytes) domGlsl_param_type::domFloat2; + return ref; +} + + +daeMetaElement * +domGlsl_param_type::domFloat2::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "float2" ); + _Meta->registerClass(domGlsl_param_type::domFloat2::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Glsl_float2")); + ma->setOffset( daeOffsetOf( domGlsl_param_type::domFloat2 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGlsl_param_type::domFloat2)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGlsl_param_type::domFloat3::create(daeInt bytes) +{ + domGlsl_param_type::domFloat3Ref ref = new(bytes) domGlsl_param_type::domFloat3; + return ref; +} + + +daeMetaElement * +domGlsl_param_type::domFloat3::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "float3" ); + _Meta->registerClass(domGlsl_param_type::domFloat3::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Glsl_float3")); + ma->setOffset( daeOffsetOf( domGlsl_param_type::domFloat3 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGlsl_param_type::domFloat3)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGlsl_param_type::domFloat4::create(daeInt bytes) +{ + domGlsl_param_type::domFloat4Ref ref = new(bytes) domGlsl_param_type::domFloat4; + return ref; +} + + +daeMetaElement * +domGlsl_param_type::domFloat4::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "float4" ); + _Meta->registerClass(domGlsl_param_type::domFloat4::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Glsl_float4")); + ma->setOffset( daeOffsetOf( domGlsl_param_type::domFloat4 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGlsl_param_type::domFloat4)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGlsl_param_type::domFloat2x2::create(daeInt bytes) +{ + domGlsl_param_type::domFloat2x2Ref ref = new(bytes) domGlsl_param_type::domFloat2x2; + return ref; +} + + +daeMetaElement * +domGlsl_param_type::domFloat2x2::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "float2x2" ); + _Meta->registerClass(domGlsl_param_type::domFloat2x2::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Glsl_float2x2")); + ma->setOffset( daeOffsetOf( domGlsl_param_type::domFloat2x2 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGlsl_param_type::domFloat2x2)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGlsl_param_type::domFloat3x3::create(daeInt bytes) +{ + domGlsl_param_type::domFloat3x3Ref ref = new(bytes) domGlsl_param_type::domFloat3x3; + return ref; +} + + +daeMetaElement * +domGlsl_param_type::domFloat3x3::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "float3x3" ); + _Meta->registerClass(domGlsl_param_type::domFloat3x3::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Glsl_float3x3")); + ma->setOffset( daeOffsetOf( domGlsl_param_type::domFloat3x3 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGlsl_param_type::domFloat3x3)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGlsl_param_type::domFloat4x4::create(daeInt bytes) +{ + domGlsl_param_type::domFloat4x4Ref ref = new(bytes) domGlsl_param_type::domFloat4x4; + return ref; +} + + +daeMetaElement * +domGlsl_param_type::domFloat4x4::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "float4x4" ); + _Meta->registerClass(domGlsl_param_type::domFloat4x4::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Glsl_float4x4")); + ma->setOffset( daeOffsetOf( domGlsl_param_type::domFloat4x4 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGlsl_param_type::domFloat4x4)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGlsl_param_type::domInt::create(daeInt bytes) +{ + domGlsl_param_type::domIntRef ref = new(bytes) domGlsl_param_type::domInt; + return ref; +} + + +daeMetaElement * +domGlsl_param_type::domInt::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "int" ); + _Meta->registerClass(domGlsl_param_type::domInt::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Glsl_int")); + ma->setOffset( daeOffsetOf( domGlsl_param_type::domInt , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGlsl_param_type::domInt)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGlsl_param_type::domInt2::create(daeInt bytes) +{ + domGlsl_param_type::domInt2Ref ref = new(bytes) domGlsl_param_type::domInt2; + return ref; +} + + +daeMetaElement * +domGlsl_param_type::domInt2::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "int2" ); + _Meta->registerClass(domGlsl_param_type::domInt2::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Glsl_int2")); + ma->setOffset( daeOffsetOf( domGlsl_param_type::domInt2 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGlsl_param_type::domInt2)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGlsl_param_type::domInt3::create(daeInt bytes) +{ + domGlsl_param_type::domInt3Ref ref = new(bytes) domGlsl_param_type::domInt3; + return ref; +} + + +daeMetaElement * +domGlsl_param_type::domInt3::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "int3" ); + _Meta->registerClass(domGlsl_param_type::domInt3::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Glsl_int3")); + ma->setOffset( daeOffsetOf( domGlsl_param_type::domInt3 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGlsl_param_type::domInt3)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGlsl_param_type::domInt4::create(daeInt bytes) +{ + domGlsl_param_type::domInt4Ref ref = new(bytes) domGlsl_param_type::domInt4; + return ref; +} + + +daeMetaElement * +domGlsl_param_type::domInt4::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "int4" ); + _Meta->registerClass(domGlsl_param_type::domInt4::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Glsl_int4")); + ma->setOffset( daeOffsetOf( domGlsl_param_type::domInt4 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGlsl_param_type::domInt4)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGlsl_param_type::domEnum::create(daeInt bytes) +{ + domGlsl_param_type::domEnumRef ref = new(bytes) domGlsl_param_type::domEnum; + return ref; +} + + +daeMetaElement * +domGlsl_param_type::domEnum::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "enum" ); + _Meta->registerClass(domGlsl_param_type::domEnum::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Gl_enumeration")); + ma->setOffset( daeOffsetOf( domGlsl_param_type::domEnum , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGlsl_param_type::domEnum)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domGlsl_param_type::_Meta = NULL; +daeMetaElement * domGlsl_param_type::domBool::_Meta = NULL; +daeMetaElement * domGlsl_param_type::domBool2::_Meta = NULL; +daeMetaElement * domGlsl_param_type::domBool3::_Meta = NULL; +daeMetaElement * domGlsl_param_type::domBool4::_Meta = NULL; +daeMetaElement * domGlsl_param_type::domFloat::_Meta = NULL; +daeMetaElement * domGlsl_param_type::domFloat2::_Meta = NULL; +daeMetaElement * domGlsl_param_type::domFloat3::_Meta = NULL; +daeMetaElement * domGlsl_param_type::domFloat4::_Meta = NULL; +daeMetaElement * domGlsl_param_type::domFloat2x2::_Meta = NULL; +daeMetaElement * domGlsl_param_type::domFloat3x3::_Meta = NULL; +daeMetaElement * domGlsl_param_type::domFloat4x4::_Meta = NULL; +daeMetaElement * domGlsl_param_type::domInt::_Meta = NULL; +daeMetaElement * domGlsl_param_type::domInt2::_Meta = NULL; +daeMetaElement * domGlsl_param_type::domInt3::_Meta = NULL; +daeMetaElement * domGlsl_param_type::domInt4::_Meta = NULL; +daeMetaElement * domGlsl_param_type::domEnum::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGlsl_setarray_type.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGlsl_setarray_type.cpp new file mode 100644 index 00000000..2eefe1f1 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGlsl_setarray_type.cpp @@ -0,0 +1,85 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domGlsl_setarray_type::create(daeInt bytes) +{ + domGlsl_setarray_typeRef ref = new(bytes) domGlsl_setarray_type; + return ref; +} + + +daeMetaElement * +domGlsl_setarray_type::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "glsl_setarray_type" ); + _Meta->registerClass(domGlsl_setarray_type::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaChoice( _Meta, cm, 0, 0, -1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "glsl_param_type" ); + mea->setOffset( daeOffsetOf(domGlsl_setarray_type,elemGlsl_param_type_array) ); + mea->setElementType( domGlsl_param_type::registerElement() ); + cm->appendChild( new daeMetaGroup( mea, _Meta, cm, 0, 1, 1 ) ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "array" ); + mea->setOffset( daeOffsetOf(domGlsl_setarray_type,elemArray_array) ); + mea->setElementType( domGlsl_setarray_type::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 3000 ); + _Meta->setCMRoot( cm ); + // Ordered list of sub-elements + _Meta->addContents(daeOffsetOf(domGlsl_setarray_type,_contents)); + _Meta->addContentsOrder(daeOffsetOf(domGlsl_setarray_type,_contentsOrder)); + + + // Add attribute: length + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "length" ); + ma->setType( daeAtomicType::get("xsPositiveInteger")); + ma->setOffset( daeOffsetOf( domGlsl_setarray_type , attrLength )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGlsl_setarray_type)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domGlsl_setarray_type::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGlsl_setparam.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGlsl_setparam.cpp new file mode 100644 index 00000000..20ec4b71 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGlsl_setparam.cpp @@ -0,0 +1,108 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domGlsl_setparam::create(daeInt bytes) +{ + domGlsl_setparamRef ref = new(bytes) domGlsl_setparam; + return ref; +} + + +daeMetaElement * +domGlsl_setparam::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "glsl_setparam" ); + _Meta->registerClass(domGlsl_setparam::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 0, -1 ); + mea->setName( "annotate" ); + mea->setOffset( daeOffsetOf(domGlsl_setparam,elemAnnotate_array) ); + mea->setElementType( domFx_annotate_common::registerElement() ); + cm->appendChild( mea ); + + cm = new daeMetaChoice( _Meta, cm, 1, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "glsl_param_type" ); + mea->setOffset( daeOffsetOf(domGlsl_setparam,elemGlsl_param_type) ); + mea->setElementType( domGlsl_param_type::registerElement() ); + cm->appendChild( new daeMetaGroup( mea, _Meta, cm, 0, 1, 1 ) ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "array" ); + mea->setOffset( daeOffsetOf(domGlsl_setparam,elemArray) ); + mea->setElementType( domGlsl_setarray_type::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + cm->getParent()->appendChild( cm ); + cm = cm->getParent(); + + cm->setMaxOrdinal( 1 ); + _Meta->setCMRoot( cm ); + // Ordered list of sub-elements + _Meta->addContents(daeOffsetOf(domGlsl_setparam,_contents)); + _Meta->addContentsOrder(daeOffsetOf(domGlsl_setparam,_contentsOrder)); + + + // Add attribute: ref + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "ref" ); + ma->setType( daeAtomicType::get("Glsl_identifier")); + ma->setOffset( daeOffsetOf( domGlsl_setparam , attrRef )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: program + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "program" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGlsl_setparam , attrProgram )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGlsl_setparam)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domGlsl_setparam::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGlsl_setparam_simple.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGlsl_setparam_simple.cpp new file mode 100644 index 00000000..59fee2d1 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGlsl_setparam_simple.cpp @@ -0,0 +1,81 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domGlsl_setparam_simple::create(daeInt bytes) +{ + domGlsl_setparam_simpleRef ref = new(bytes) domGlsl_setparam_simple; + return ref; +} + + +daeMetaElement * +domGlsl_setparam_simple::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "glsl_setparam_simple" ); + _Meta->registerClass(domGlsl_setparam_simple::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 0, -1 ); + mea->setName( "annotate" ); + mea->setOffset( daeOffsetOf(domGlsl_setparam_simple,elemAnnotate_array) ); + mea->setElementType( domFx_annotate_common::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 1, 1 ); + mea->setName( "glsl_param_type" ); + mea->setOffset( daeOffsetOf(domGlsl_setparam_simple,elemGlsl_param_type) ); + mea->setElementType( domGlsl_param_type::registerElement() ); + cm->appendChild( new daeMetaGroup( mea, _Meta, cm, 1, 1, 1 ) ); + + cm->setMaxOrdinal( 1 ); + _Meta->setCMRoot( cm ); + + // Add attribute: ref + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "ref" ); + ma->setType( daeAtomicType::get("Glsl_identifier")); + ma->setOffset( daeOffsetOf( domGlsl_setparam_simple , attrRef )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGlsl_setparam_simple)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domGlsl_setparam_simple::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGlsl_surface_type.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGlsl_surface_type.cpp new file mode 100644 index 00000000..956e38c1 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domGlsl_surface_type.cpp @@ -0,0 +1,266 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domGlsl_surface_type::create(daeInt bytes) +{ + domGlsl_surface_typeRef ref = new(bytes) domGlsl_surface_type; + return ref; +} + + +daeMetaElement * +domGlsl_surface_type::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "glsl_surface_type" ); + _Meta->registerClass(domGlsl_surface_type::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 0, 1 ); + mea->setName( "fx_surface_init_common" ); + mea->setOffset( daeOffsetOf(domGlsl_surface_type,elemFx_surface_init_common) ); + mea->setElementType( domFx_surface_init_common::registerElement() ); + cm->appendChild( new daeMetaGroup( mea, _Meta, cm, 0, 0, 1 ) ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 0, 1 ); + mea->setName( "format" ); + mea->setOffset( daeOffsetOf(domGlsl_surface_type,elemFormat) ); + mea->setElementType( domFormat::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 2, 0, 1 ); + mea->setName( "format_hint" ); + mea->setOffset( daeOffsetOf(domGlsl_surface_type,elemFormat_hint) ); + mea->setElementType( domFx_surface_format_hint_common::registerElement() ); + cm->appendChild( mea ); + + cm = new daeMetaChoice( _Meta, cm, 3, 0, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "size" ); + mea->setOffset( daeOffsetOf(domGlsl_surface_type,elemSize) ); + mea->setElementType( domSize::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "viewport_ratio" ); + mea->setOffset( daeOffsetOf(domGlsl_surface_type,elemViewport_ratio) ); + mea->setElementType( domViewport_ratio::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + cm->getParent()->appendChild( cm ); + cm = cm->getParent(); + + mea = new daeMetaElementAttribute( _Meta, cm, 4, 0, 1 ); + mea->setName( "mip_levels" ); + mea->setOffset( daeOffsetOf(domGlsl_surface_type,elemMip_levels) ); + mea->setElementType( domMip_levels::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 5, 0, 1 ); + mea->setName( "mipmap_generate" ); + mea->setOffset( daeOffsetOf(domGlsl_surface_type,elemMipmap_generate) ); + mea->setElementType( domMipmap_generate::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 6, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domGlsl_surface_type,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 6 ); + cm->getParent()->appendChild( cm ); + cm = cm->getParent(); + + cm = new daeMetaSequence( _Meta, cm, 7, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 0, 1 ); + mea->setName( "generator" ); + mea->setOffset( daeOffsetOf(domGlsl_surface_type,elemGenerator) ); + mea->setElementType( domGenerator::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + cm->getParent()->appendChild( cm ); + cm = cm->getParent(); + + cm->setMaxOrdinal( 7 ); + _Meta->setCMRoot( cm ); + // Ordered list of sub-elements + _Meta->addContents(daeOffsetOf(domGlsl_surface_type,_contents)); + _Meta->addContentsOrder(daeOffsetOf(domGlsl_surface_type,_contentsOrder)); + + + // Add attribute: type + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "type" ); + ma->setType( daeAtomicType::get("Fx_surface_type_enum")); + ma->setOffset( daeOffsetOf( domGlsl_surface_type , attrType )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGlsl_surface_type)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGlsl_surface_type::domGenerator::create(daeInt bytes) +{ + domGlsl_surface_type::domGeneratorRef ref = new(bytes) domGlsl_surface_type::domGenerator; + return ref; +} + + +daeMetaElement * +domGlsl_surface_type::domGenerator::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "generator" ); + _Meta->registerClass(domGlsl_surface_type::domGenerator::create, &_Meta); + + _Meta->setIsInnerClass( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 0, -1 ); + mea->setName( "annotate" ); + mea->setOffset( daeOffsetOf(domGlsl_surface_type::domGenerator,elemAnnotate_array) ); + mea->setElementType( domFx_annotate_common::registerElement() ); + cm->appendChild( mea ); + + cm = new daeMetaChoice( _Meta, cm, 1, 1, -1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "code" ); + mea->setOffset( daeOffsetOf(domGlsl_surface_type::domGenerator,elemCode_array) ); + mea->setElementType( domFx_code_profile::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "include" ); + mea->setOffset( daeOffsetOf(domGlsl_surface_type::domGenerator,elemInclude_array) ); + mea->setElementType( domFx_include_common::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + cm->getParent()->appendChild( cm ); + cm = cm->getParent(); + + mea = new daeMetaElementAttribute( _Meta, cm, 3002, 1, 1 ); + mea->setName( "name" ); + mea->setOffset( daeOffsetOf(domGlsl_surface_type::domGenerator,elemName) ); + mea->setElementType( domGlsl_surface_type::domGenerator::domName::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 3003, 0, -1 ); + mea->setName( "setparam" ); + mea->setOffset( daeOffsetOf(domGlsl_surface_type::domGenerator,elemSetparam_array) ); + mea->setElementType( domGlsl_setparam_simple::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 3003 ); + _Meta->setCMRoot( cm ); + // Ordered list of sub-elements + _Meta->addContents(daeOffsetOf(domGlsl_surface_type::domGenerator,_contents)); + _Meta->addContentsOrder(daeOffsetOf(domGlsl_surface_type::domGenerator,_contentsOrder)); + + + + _Meta->setElementSize(sizeof(domGlsl_surface_type::domGenerator)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domGlsl_surface_type::domGenerator::domName::create(daeInt bytes) +{ + domGlsl_surface_type::domGenerator::domNameRef ref = new(bytes) domGlsl_surface_type::domGenerator::domName; + return ref; +} + + +daeMetaElement * +domGlsl_surface_type::domGenerator::domName::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "name" ); + _Meta->registerClass(domGlsl_surface_type::domGenerator::domName::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGlsl_surface_type::domGenerator::domName , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + // Add attribute: source + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "source" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domGlsl_surface_type::domGenerator::domName , attrSource )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domGlsl_surface_type::domGenerator::domName)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domGlsl_surface_type::_Meta = NULL; +daeMetaElement * domGlsl_surface_type::domGenerator::_Meta = NULL; +daeMetaElement * domGlsl_surface_type::domGenerator::domName::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domIDREF_array.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domIDREF_array.cpp new file mode 100644 index 00000000..e2d61d0b --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domIDREF_array.cpp @@ -0,0 +1,94 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domIDREF_array::create(daeInt bytes) +{ + domIDREF_arrayRef ref = new(bytes) domIDREF_array; + return ref; +} + + +daeMetaElement * +domIDREF_array::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "IDREF_array" ); + _Meta->registerClass(domIDREF_array::create, &_Meta); + + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("xsIDREFS")); + ma->setOffset( daeOffsetOf( domIDREF_array , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + // Add attribute: id + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "id" ); + ma->setType( daeAtomicType::get("xsID")); + ma->setOffset( daeOffsetOf( domIDREF_array , attrId )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: name + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "name" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domIDREF_array , attrName )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: count + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "count" ); + ma->setType( daeAtomicType::get("Uint")); + ma->setOffset( daeOffsetOf( domIDREF_array , attrCount )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domIDREF_array)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domIDREF_array::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domImage.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domImage.cpp new file mode 100644 index 00000000..04c5c3e7 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domImage.cpp @@ -0,0 +1,231 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domImage::create(daeInt bytes) +{ + domImageRef ref = new(bytes) domImage; + return ref; +} + + +daeMetaElement * +domImage::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "image" ); + _Meta->registerClass(domImage::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 0, 1 ); + mea->setName( "asset" ); + mea->setOffset( daeOffsetOf(domImage,elemAsset) ); + mea->setElementType( domAsset::registerElement() ); + cm->appendChild( mea ); + + cm = new daeMetaChoice( _Meta, cm, 1, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "data" ); + mea->setOffset( daeOffsetOf(domImage,elemData) ); + mea->setElementType( domImage::domData::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "init_from" ); + mea->setOffset( daeOffsetOf(domImage,elemInit_from) ); + mea->setElementType( domImage::domInit_from::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + cm->getParent()->appendChild( cm ); + cm = cm->getParent(); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 2, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domImage,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 2 ); + _Meta->setCMRoot( cm ); + // Ordered list of sub-elements + _Meta->addContents(daeOffsetOf(domImage,_contents)); + _Meta->addContentsOrder(daeOffsetOf(domImage,_contentsOrder)); + + + // Add attribute: id + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "id" ); + ma->setType( daeAtomicType::get("xsID")); + ma->setOffset( daeOffsetOf( domImage , attrId )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: name + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "name" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domImage , attrName )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: format + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "format" ); + ma->setType( daeAtomicType::get("xsToken")); + ma->setOffset( daeOffsetOf( domImage , attrFormat )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: height + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "height" ); + ma->setType( daeAtomicType::get("Uint")); + ma->setOffset( daeOffsetOf( domImage , attrHeight )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: width + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "width" ); + ma->setType( daeAtomicType::get("Uint")); + ma->setOffset( daeOffsetOf( domImage , attrWidth )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: depth + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "depth" ); + ma->setType( daeAtomicType::get("Uint")); + ma->setOffset( daeOffsetOf( domImage , attrDepth )); + ma->setContainer( _Meta ); + ma->setDefault( "1"); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domImage)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domImage::domData::create(daeInt bytes) +{ + domImage::domDataRef ref = new(bytes) domImage::domData; + return ref; +} + + +daeMetaElement * +domImage::domData::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "data" ); + _Meta->registerClass(domImage::domData::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("ListOfHexBinary")); + ma->setOffset( daeOffsetOf( domImage::domData , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domImage::domData)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domImage::domInit_from::create(daeInt bytes) +{ + domImage::domInit_fromRef ref = new(bytes) domImage::domInit_from; + ref->_value.setContainer( (domImage::domInit_from*)ref ); + return ref; +} + + +daeMetaElement * +domImage::domInit_from::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "init_from" ); + _Meta->registerClass(domImage::domInit_from::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("xsAnyURI")); + ma->setOffset( daeOffsetOf( domImage::domInit_from , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domImage::domInit_from)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domImage::_Meta = NULL; +daeMetaElement * domImage::domData::_Meta = NULL; +daeMetaElement * domImage::domInit_from::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domInputGlobal.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domInputGlobal.cpp new file mode 100644 index 00000000..183acb51 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domInputGlobal.cpp @@ -0,0 +1,76 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domInputGlobal::create(daeInt bytes) +{ + domInputGlobalRef ref = new(bytes) domInputGlobal; + ref->attrSource.setContainer( (domInputGlobal*)ref ); + return ref; +} + + +daeMetaElement * +domInputGlobal::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "InputGlobal" ); + _Meta->registerClass(domInputGlobal::create, &_Meta); + + + // Add attribute: semantic + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "semantic" ); + ma->setType( daeAtomicType::get("xsNMTOKEN")); + ma->setOffset( daeOffsetOf( domInputGlobal , attrSemantic )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: source + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "source" ); + ma->setType( daeAtomicType::get("xsAnyURI")); + ma->setOffset( daeOffsetOf( domInputGlobal , attrSource )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domInputGlobal)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domInputGlobal::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domInputLocal.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domInputLocal.cpp new file mode 100644 index 00000000..b65f0631 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domInputLocal.cpp @@ -0,0 +1,76 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domInputLocal::create(daeInt bytes) +{ + domInputLocalRef ref = new(bytes) domInputLocal; + ref->attrSource.setContainer( (domInputLocal*)ref ); + return ref; +} + + +daeMetaElement * +domInputLocal::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "InputLocal" ); + _Meta->registerClass(domInputLocal::create, &_Meta); + + + // Add attribute: semantic + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "semantic" ); + ma->setType( daeAtomicType::get("xsNMTOKEN")); + ma->setOffset( daeOffsetOf( domInputLocal , attrSemantic )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: source + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "source" ); + ma->setType( daeAtomicType::get("URIFragmentType")); + ma->setOffset( daeOffsetOf( domInputLocal , attrSource )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domInputLocal)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domInputLocal::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domInputLocalOffset.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domInputLocalOffset.cpp new file mode 100644 index 00000000..c77878e0 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domInputLocalOffset.cpp @@ -0,0 +1,99 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domInputLocalOffset::create(daeInt bytes) +{ + domInputLocalOffsetRef ref = new(bytes) domInputLocalOffset; + ref->attrSource.setContainer( (domInputLocalOffset*)ref ); + return ref; +} + + +daeMetaElement * +domInputLocalOffset::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "InputLocalOffset" ); + _Meta->registerClass(domInputLocalOffset::create, &_Meta); + + + // Add attribute: offset + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "offset" ); + ma->setType( daeAtomicType::get("Uint")); + ma->setOffset( daeOffsetOf( domInputLocalOffset , attrOffset )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: semantic + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "semantic" ); + ma->setType( daeAtomicType::get("xsNMTOKEN")); + ma->setOffset( daeOffsetOf( domInputLocalOffset , attrSemantic )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: source + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "source" ); + ma->setType( daeAtomicType::get("URIFragmentType")); + ma->setOffset( daeOffsetOf( domInputLocalOffset , attrSource )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: set + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "set" ); + ma->setType( daeAtomicType::get("Uint")); + ma->setOffset( daeOffsetOf( domInputLocalOffset , attrSet )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domInputLocalOffset)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domInputLocalOffset::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domInstanceWithExtra.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domInstanceWithExtra.cpp new file mode 100644 index 00000000..0dac4fbd --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domInstanceWithExtra.cpp @@ -0,0 +1,98 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domInstanceWithExtra::create(daeInt bytes) +{ + domInstanceWithExtraRef ref = new(bytes) domInstanceWithExtra; + ref->attrUrl.setContainer( (domInstanceWithExtra*)ref ); + return ref; +} + + +daeMetaElement * +domInstanceWithExtra::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "InstanceWithExtra" ); + _Meta->registerClass(domInstanceWithExtra::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domInstanceWithExtra,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + _Meta->setCMRoot( cm ); + + // Add attribute: url + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "url" ); + ma->setType( daeAtomicType::get("xsAnyURI")); + ma->setOffset( daeOffsetOf( domInstanceWithExtra , attrUrl )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: sid + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "sid" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domInstanceWithExtra , attrSid )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: name + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "name" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domInstanceWithExtra , attrName )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domInstanceWithExtra)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domInstanceWithExtra::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domInstance_camera.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domInstance_camera.cpp new file mode 100644 index 00000000..dd01eac1 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domInstance_camera.cpp @@ -0,0 +1,97 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domInstance_camera::create(daeInt bytes) +{ + domInstance_cameraRef ref = new(bytes) domInstance_camera; + return ref; +} + + +daeMetaElement * +domInstance_camera::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "instance_camera" ); + _Meta->registerClass(domInstance_camera::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domInstance_camera,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + _Meta->setCMRoot( cm ); + + // Add attribute: url + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "url" ); + ma->setType( daeAtomicType::get("xsAnyURI")); + ma->setOffset( daeOffsetOf( domInstance_camera , attrUrl )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: sid + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "sid" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domInstance_camera , attrSid )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: name + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "name" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domInstance_camera , attrName )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domInstance_camera)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domInstance_camera::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domInstance_controller.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domInstance_controller.cpp new file mode 100644 index 00000000..13baee87 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domInstance_controller.cpp @@ -0,0 +1,147 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domInstance_controller::create(daeInt bytes) +{ + domInstance_controllerRef ref = new(bytes) domInstance_controller; + ref->attrUrl.setContainer( (domInstance_controller*)ref ); + return ref; +} + + +daeMetaElement * +domInstance_controller::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "instance_controller" ); + _Meta->registerClass(domInstance_controller::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 0, -1 ); + mea->setName( "skeleton" ); + mea->setOffset( daeOffsetOf(domInstance_controller,elemSkeleton_array) ); + mea->setElementType( domInstance_controller::domSkeleton::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 0, 1 ); + mea->setName( "bind_material" ); + mea->setOffset( daeOffsetOf(domInstance_controller,elemBind_material) ); + mea->setElementType( domBind_material::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 2, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domInstance_controller,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 2 ); + _Meta->setCMRoot( cm ); + + // Add attribute: url + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "url" ); + ma->setType( daeAtomicType::get("xsAnyURI")); + ma->setOffset( daeOffsetOf( domInstance_controller , attrUrl )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: sid + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "sid" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domInstance_controller , attrSid )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: name + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "name" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domInstance_controller , attrName )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domInstance_controller)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domInstance_controller::domSkeleton::create(daeInt bytes) +{ + domInstance_controller::domSkeletonRef ref = new(bytes) domInstance_controller::domSkeleton; + ref->_value.setContainer( (domInstance_controller::domSkeleton*)ref ); + return ref; +} + + +daeMetaElement * +domInstance_controller::domSkeleton::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "skeleton" ); + _Meta->registerClass(domInstance_controller::domSkeleton::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("xsAnyURI")); + ma->setOffset( daeOffsetOf( domInstance_controller::domSkeleton , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domInstance_controller::domSkeleton)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domInstance_controller::_Meta = NULL; +daeMetaElement * domInstance_controller::domSkeleton::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domInstance_effect.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domInstance_effect.cpp new file mode 100644 index 00000000..f1beb62b --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domInstance_effect.cpp @@ -0,0 +1,224 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domInstance_effect::create(daeInt bytes) +{ + domInstance_effectRef ref = new(bytes) domInstance_effect; + ref->attrUrl.setContainer( (domInstance_effect*)ref ); + return ref; +} + + +daeMetaElement * +domInstance_effect::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "instance_effect" ); + _Meta->registerClass(domInstance_effect::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 0, -1 ); + mea->setName( "technique_hint" ); + mea->setOffset( daeOffsetOf(domInstance_effect,elemTechnique_hint_array) ); + mea->setElementType( domInstance_effect::domTechnique_hint::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 1, 0, -1 ); + mea->setName( "setparam" ); + mea->setOffset( daeOffsetOf(domInstance_effect,elemSetparam_array) ); + mea->setElementType( domInstance_effect::domSetparam::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 2, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domInstance_effect,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 2 ); + _Meta->setCMRoot( cm ); + + // Add attribute: url + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "url" ); + ma->setType( daeAtomicType::get("xsAnyURI")); + ma->setOffset( daeOffsetOf( domInstance_effect , attrUrl )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: sid + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "sid" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domInstance_effect , attrSid )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: name + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "name" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domInstance_effect , attrName )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domInstance_effect)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domInstance_effect::domTechnique_hint::create(daeInt bytes) +{ + domInstance_effect::domTechnique_hintRef ref = new(bytes) domInstance_effect::domTechnique_hint; + return ref; +} + + +daeMetaElement * +domInstance_effect::domTechnique_hint::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "technique_hint" ); + _Meta->registerClass(domInstance_effect::domTechnique_hint::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: platform + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "platform" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domInstance_effect::domTechnique_hint , attrPlatform )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: profile + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "profile" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domInstance_effect::domTechnique_hint , attrProfile )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: ref + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "ref" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domInstance_effect::domTechnique_hint , attrRef )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domInstance_effect::domTechnique_hint)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domInstance_effect::domSetparam::create(daeInt bytes) +{ + domInstance_effect::domSetparamRef ref = new(bytes) domInstance_effect::domSetparam; + return ref; +} + + +daeMetaElement * +domInstance_effect::domSetparam::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "setparam" ); + _Meta->registerClass(domInstance_effect::domSetparam::create, &_Meta); + + _Meta->setIsInnerClass( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "fx_basic_type_common" ); + mea->setOffset( daeOffsetOf(domInstance_effect::domSetparam,elemFx_basic_type_common) ); + mea->setElementType( domFx_basic_type_common::registerElement() ); + cm->appendChild( new daeMetaGroup( mea, _Meta, cm, 0, 1, 1 ) ); + + cm->setMaxOrdinal( 0 ); + _Meta->setCMRoot( cm ); + + // Add attribute: ref + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "ref" ); + ma->setType( daeAtomicType::get("xsToken")); + ma->setOffset( daeOffsetOf( domInstance_effect::domSetparam , attrRef )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domInstance_effect::domSetparam)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domInstance_effect::_Meta = NULL; +daeMetaElement * domInstance_effect::domTechnique_hint::_Meta = NULL; +daeMetaElement * domInstance_effect::domSetparam::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domInstance_force_field.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domInstance_force_field.cpp new file mode 100644 index 00000000..3dda2fa8 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domInstance_force_field.cpp @@ -0,0 +1,97 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domInstance_force_field::create(daeInt bytes) +{ + domInstance_force_fieldRef ref = new(bytes) domInstance_force_field; + return ref; +} + + +daeMetaElement * +domInstance_force_field::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "instance_force_field" ); + _Meta->registerClass(domInstance_force_field::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domInstance_force_field,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + _Meta->setCMRoot( cm ); + + // Add attribute: url + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "url" ); + ma->setType( daeAtomicType::get("xsAnyURI")); + ma->setOffset( daeOffsetOf( domInstance_force_field , attrUrl )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: sid + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "sid" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domInstance_force_field , attrSid )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: name + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "name" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domInstance_force_field , attrName )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domInstance_force_field)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domInstance_force_field::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domInstance_geometry.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domInstance_geometry.cpp new file mode 100644 index 00000000..3369b4a3 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domInstance_geometry.cpp @@ -0,0 +1,104 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domInstance_geometry::create(daeInt bytes) +{ + domInstance_geometryRef ref = new(bytes) domInstance_geometry; + ref->attrUrl.setContainer( (domInstance_geometry*)ref ); + return ref; +} + + +daeMetaElement * +domInstance_geometry::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "instance_geometry" ); + _Meta->registerClass(domInstance_geometry::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 0, 1 ); + mea->setName( "bind_material" ); + mea->setOffset( daeOffsetOf(domInstance_geometry,elemBind_material) ); + mea->setElementType( domBind_material::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 1, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domInstance_geometry,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 1 ); + _Meta->setCMRoot( cm ); + + // Add attribute: url + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "url" ); + ma->setType( daeAtomicType::get("xsAnyURI")); + ma->setOffset( daeOffsetOf( domInstance_geometry , attrUrl )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: sid + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "sid" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domInstance_geometry , attrSid )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: name + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "name" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domInstance_geometry , attrName )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domInstance_geometry)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domInstance_geometry::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domInstance_light.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domInstance_light.cpp new file mode 100644 index 00000000..4139d0de --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domInstance_light.cpp @@ -0,0 +1,97 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domInstance_light::create(daeInt bytes) +{ + domInstance_lightRef ref = new(bytes) domInstance_light; + return ref; +} + + +daeMetaElement * +domInstance_light::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "instance_light" ); + _Meta->registerClass(domInstance_light::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domInstance_light,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + _Meta->setCMRoot( cm ); + + // Add attribute: url + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "url" ); + ma->setType( daeAtomicType::get("xsAnyURI")); + ma->setOffset( daeOffsetOf( domInstance_light , attrUrl )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: sid + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "sid" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domInstance_light , attrSid )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: name + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "name" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domInstance_light , attrName )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domInstance_light)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domInstance_light::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domInstance_material.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domInstance_material.cpp new file mode 100644 index 00000000..4de460cd --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domInstance_material.cpp @@ -0,0 +1,235 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domInstance_material::create(daeInt bytes) +{ + domInstance_materialRef ref = new(bytes) domInstance_material; + ref->attrTarget.setContainer( (domInstance_material*)ref ); + return ref; +} + + +daeMetaElement * +domInstance_material::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "instance_material" ); + _Meta->registerClass(domInstance_material::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 0, -1 ); + mea->setName( "bind" ); + mea->setOffset( daeOffsetOf(domInstance_material,elemBind_array) ); + mea->setElementType( domInstance_material::domBind::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 1, 0, -1 ); + mea->setName( "bind_vertex_input" ); + mea->setOffset( daeOffsetOf(domInstance_material,elemBind_vertex_input_array) ); + mea->setElementType( domInstance_material::domBind_vertex_input::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 2, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domInstance_material,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 2 ); + _Meta->setCMRoot( cm ); + + // Add attribute: symbol + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "symbol" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domInstance_material , attrSymbol )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: target + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "target" ); + ma->setType( daeAtomicType::get("xsAnyURI")); + ma->setOffset( daeOffsetOf( domInstance_material , attrTarget )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: sid + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "sid" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domInstance_material , attrSid )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: name + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "name" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domInstance_material , attrName )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domInstance_material)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domInstance_material::domBind::create(daeInt bytes) +{ + domInstance_material::domBindRef ref = new(bytes) domInstance_material::domBind; + return ref; +} + + +daeMetaElement * +domInstance_material::domBind::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "bind" ); + _Meta->registerClass(domInstance_material::domBind::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: semantic + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "semantic" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domInstance_material::domBind , attrSemantic )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: target + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "target" ); + ma->setType( daeAtomicType::get("xsToken")); + ma->setOffset( daeOffsetOf( domInstance_material::domBind , attrTarget )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domInstance_material::domBind)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domInstance_material::domBind_vertex_input::create(daeInt bytes) +{ + domInstance_material::domBind_vertex_inputRef ref = new(bytes) domInstance_material::domBind_vertex_input; + return ref; +} + + +daeMetaElement * +domInstance_material::domBind_vertex_input::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "bind_vertex_input" ); + _Meta->registerClass(domInstance_material::domBind_vertex_input::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: semantic + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "semantic" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domInstance_material::domBind_vertex_input , attrSemantic )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: input_semantic + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "input_semantic" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domInstance_material::domBind_vertex_input , attrInput_semantic )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: input_set + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "input_set" ); + ma->setType( daeAtomicType::get("Uint")); + ma->setOffset( daeOffsetOf( domInstance_material::domBind_vertex_input , attrInput_set )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domInstance_material::domBind_vertex_input)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domInstance_material::_Meta = NULL; +daeMetaElement * domInstance_material::domBind::_Meta = NULL; +daeMetaElement * domInstance_material::domBind_vertex_input::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domInstance_node.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domInstance_node.cpp new file mode 100644 index 00000000..af145287 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domInstance_node.cpp @@ -0,0 +1,97 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domInstance_node::create(daeInt bytes) +{ + domInstance_nodeRef ref = new(bytes) domInstance_node; + return ref; +} + + +daeMetaElement * +domInstance_node::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "instance_node" ); + _Meta->registerClass(domInstance_node::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domInstance_node,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + _Meta->setCMRoot( cm ); + + // Add attribute: url + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "url" ); + ma->setType( daeAtomicType::get("xsAnyURI")); + ma->setOffset( daeOffsetOf( domInstance_node , attrUrl )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: sid + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "sid" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domInstance_node , attrSid )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: name + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "name" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domInstance_node , attrName )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domInstance_node)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domInstance_node::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domInstance_physics_material.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domInstance_physics_material.cpp new file mode 100644 index 00000000..6063c48d --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domInstance_physics_material.cpp @@ -0,0 +1,97 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domInstance_physics_material::create(daeInt bytes) +{ + domInstance_physics_materialRef ref = new(bytes) domInstance_physics_material; + return ref; +} + + +daeMetaElement * +domInstance_physics_material::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "instance_physics_material" ); + _Meta->registerClass(domInstance_physics_material::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domInstance_physics_material,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + _Meta->setCMRoot( cm ); + + // Add attribute: url + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "url" ); + ma->setType( daeAtomicType::get("xsAnyURI")); + ma->setOffset( daeOffsetOf( domInstance_physics_material , attrUrl )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: sid + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "sid" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domInstance_physics_material , attrSid )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: name + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "name" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domInstance_physics_material , attrName )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domInstance_physics_material)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domInstance_physics_material::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domInstance_physics_model.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domInstance_physics_model.cpp new file mode 100644 index 00000000..4b9ed324 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domInstance_physics_model.cpp @@ -0,0 +1,128 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domInstance_physics_model::create(daeInt bytes) +{ + domInstance_physics_modelRef ref = new(bytes) domInstance_physics_model; + ref->attrUrl.setContainer( (domInstance_physics_model*)ref ); + ref->attrParent.setContainer( (domInstance_physics_model*)ref ); + return ref; +} + + +daeMetaElement * +domInstance_physics_model::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "instance_physics_model" ); + _Meta->registerClass(domInstance_physics_model::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 0, -1 ); + mea->setName( "instance_force_field" ); + mea->setOffset( daeOffsetOf(domInstance_physics_model,elemInstance_force_field_array) ); + mea->setElementType( domInstance_force_field::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 1, 0, -1 ); + mea->setName( "instance_rigid_body" ); + mea->setOffset( daeOffsetOf(domInstance_physics_model,elemInstance_rigid_body_array) ); + mea->setElementType( domInstance_rigid_body::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 2, 0, -1 ); + mea->setName( "instance_rigid_constraint" ); + mea->setOffset( daeOffsetOf(domInstance_physics_model,elemInstance_rigid_constraint_array) ); + mea->setElementType( domInstance_rigid_constraint::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 3, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domInstance_physics_model,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 3 ); + _Meta->setCMRoot( cm ); + + // Add attribute: url + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "url" ); + ma->setType( daeAtomicType::get("xsAnyURI")); + ma->setOffset( daeOffsetOf( domInstance_physics_model , attrUrl )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: sid + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "sid" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domInstance_physics_model , attrSid )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: name + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "name" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domInstance_physics_model , attrName )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: parent + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "parent" ); + ma->setType( daeAtomicType::get("xsAnyURI")); + ma->setOffset( daeOffsetOf( domInstance_physics_model , attrParent )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domInstance_physics_model)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domInstance_physics_model::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domInstance_rigid_body.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domInstance_rigid_body.cpp new file mode 100644 index 00000000..832e12b5 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domInstance_rigid_body.cpp @@ -0,0 +1,585 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domInstance_rigid_body::create(daeInt bytes) +{ + domInstance_rigid_bodyRef ref = new(bytes) domInstance_rigid_body; + ref->attrTarget.setContainer( (domInstance_rigid_body*)ref ); + return ref; +} + + +daeMetaElement * +domInstance_rigid_body::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "instance_rigid_body" ); + _Meta->registerClass(domInstance_rigid_body::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "technique_common" ); + mea->setOffset( daeOffsetOf(domInstance_rigid_body,elemTechnique_common) ); + mea->setElementType( domInstance_rigid_body::domTechnique_common::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 1, 0, -1 ); + mea->setName( "technique" ); + mea->setOffset( daeOffsetOf(domInstance_rigid_body,elemTechnique_array) ); + mea->setElementType( domTechnique::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 2, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domInstance_rigid_body,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 2 ); + _Meta->setCMRoot( cm ); + + // Add attribute: body + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "body" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domInstance_rigid_body , attrBody )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: sid + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "sid" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domInstance_rigid_body , attrSid )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: name + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "name" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domInstance_rigid_body , attrName )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: target + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "target" ); + ma->setType( daeAtomicType::get("xsAnyURI")); + ma->setOffset( daeOffsetOf( domInstance_rigid_body , attrTarget )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domInstance_rigid_body)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domInstance_rigid_body::domTechnique_common::create(daeInt bytes) +{ + domInstance_rigid_body::domTechnique_commonRef ref = new(bytes) domInstance_rigid_body::domTechnique_common; + return ref; +} + + +daeMetaElement * +domInstance_rigid_body::domTechnique_common::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "technique_common" ); + _Meta->registerClass(domInstance_rigid_body::domTechnique_common::create, &_Meta); + + _Meta->setIsInnerClass( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 0, 1 ); + mea->setName( "angular_velocity" ); + mea->setOffset( daeOffsetOf(domInstance_rigid_body::domTechnique_common,elemAngular_velocity) ); + mea->setElementType( domInstance_rigid_body::domTechnique_common::domAngular_velocity::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 0, 1 ); + mea->setName( "velocity" ); + mea->setOffset( daeOffsetOf(domInstance_rigid_body::domTechnique_common,elemVelocity) ); + mea->setElementType( domInstance_rigid_body::domTechnique_common::domVelocity::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 2, 0, 1 ); + mea->setName( "dynamic" ); + mea->setOffset( daeOffsetOf(domInstance_rigid_body::domTechnique_common,elemDynamic) ); + mea->setElementType( domInstance_rigid_body::domTechnique_common::domDynamic::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 3, 0, 1 ); + mea->setName( "mass" ); + mea->setOffset( daeOffsetOf(domInstance_rigid_body::domTechnique_common,elemMass) ); + mea->setElementType( domTargetableFloat::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 4, 0, 1 ); + mea->setName( "mass_frame" ); + mea->setOffset( daeOffsetOf(domInstance_rigid_body::domTechnique_common,elemMass_frame) ); + mea->setElementType( domInstance_rigid_body::domTechnique_common::domMass_frame::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 5, 0, 1 ); + mea->setName( "inertia" ); + mea->setOffset( daeOffsetOf(domInstance_rigid_body::domTechnique_common,elemInertia) ); + mea->setElementType( domTargetableFloat3::registerElement() ); + cm->appendChild( mea ); + + cm = new daeMetaChoice( _Meta, cm, 6, 0, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "instance_physics_material" ); + mea->setOffset( daeOffsetOf(domInstance_rigid_body::domTechnique_common,elemInstance_physics_material) ); + mea->setElementType( domInstance_physics_material::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "physics_material" ); + mea->setOffset( daeOffsetOf(domInstance_rigid_body::domTechnique_common,elemPhysics_material) ); + mea->setElementType( domPhysics_material::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + cm->getParent()->appendChild( cm ); + cm = cm->getParent(); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 7, 0, -1 ); + mea->setName( "shape" ); + mea->setOffset( daeOffsetOf(domInstance_rigid_body::domTechnique_common,elemShape_array) ); + mea->setElementType( domInstance_rigid_body::domTechnique_common::domShape::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 7 ); + _Meta->setCMRoot( cm ); + // Ordered list of sub-elements + _Meta->addContents(daeOffsetOf(domInstance_rigid_body::domTechnique_common,_contents)); + _Meta->addContentsOrder(daeOffsetOf(domInstance_rigid_body::domTechnique_common,_contentsOrder)); + + + + _Meta->setElementSize(sizeof(domInstance_rigid_body::domTechnique_common)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domInstance_rigid_body::domTechnique_common::domAngular_velocity::create(daeInt bytes) +{ + domInstance_rigid_body::domTechnique_common::domAngular_velocityRef ref = new(bytes) domInstance_rigid_body::domTechnique_common::domAngular_velocity; + return ref; +} + + +daeMetaElement * +domInstance_rigid_body::domTechnique_common::domAngular_velocity::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "angular_velocity" ); + _Meta->registerClass(domInstance_rigid_body::domTechnique_common::domAngular_velocity::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Float3")); + ma->setOffset( daeOffsetOf( domInstance_rigid_body::domTechnique_common::domAngular_velocity , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domInstance_rigid_body::domTechnique_common::domAngular_velocity)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domInstance_rigid_body::domTechnique_common::domVelocity::create(daeInt bytes) +{ + domInstance_rigid_body::domTechnique_common::domVelocityRef ref = new(bytes) domInstance_rigid_body::domTechnique_common::domVelocity; + return ref; +} + + +daeMetaElement * +domInstance_rigid_body::domTechnique_common::domVelocity::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "velocity" ); + _Meta->registerClass(domInstance_rigid_body::domTechnique_common::domVelocity::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Float3")); + ma->setOffset( daeOffsetOf( domInstance_rigid_body::domTechnique_common::domVelocity , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domInstance_rigid_body::domTechnique_common::domVelocity)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domInstance_rigid_body::domTechnique_common::domDynamic::create(daeInt bytes) +{ + domInstance_rigid_body::domTechnique_common::domDynamicRef ref = new(bytes) domInstance_rigid_body::domTechnique_common::domDynamic; + return ref; +} + + +daeMetaElement * +domInstance_rigid_body::domTechnique_common::domDynamic::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "dynamic" ); + _Meta->registerClass(domInstance_rigid_body::domTechnique_common::domDynamic::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Bool")); + ma->setOffset( daeOffsetOf( domInstance_rigid_body::domTechnique_common::domDynamic , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + // Add attribute: sid + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "sid" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domInstance_rigid_body::domTechnique_common::domDynamic , attrSid )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domInstance_rigid_body::domTechnique_common::domDynamic)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domInstance_rigid_body::domTechnique_common::domMass_frame::create(daeInt bytes) +{ + domInstance_rigid_body::domTechnique_common::domMass_frameRef ref = new(bytes) domInstance_rigid_body::domTechnique_common::domMass_frame; + return ref; +} + + +daeMetaElement * +domInstance_rigid_body::domTechnique_common::domMass_frame::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "mass_frame" ); + _Meta->registerClass(domInstance_rigid_body::domTechnique_common::domMass_frame::create, &_Meta); + + _Meta->setIsInnerClass( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaChoice( _Meta, cm, 0, 1, -1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "translate" ); + mea->setOffset( daeOffsetOf(domInstance_rigid_body::domTechnique_common::domMass_frame,elemTranslate_array) ); + mea->setElementType( domTranslate::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "rotate" ); + mea->setOffset( daeOffsetOf(domInstance_rigid_body::domTechnique_common::domMass_frame,elemRotate_array) ); + mea->setElementType( domRotate::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 3000 ); + _Meta->setCMRoot( cm ); + // Ordered list of sub-elements + _Meta->addContents(daeOffsetOf(domInstance_rigid_body::domTechnique_common::domMass_frame,_contents)); + _Meta->addContentsOrder(daeOffsetOf(domInstance_rigid_body::domTechnique_common::domMass_frame,_contentsOrder)); + + + + _Meta->setElementSize(sizeof(domInstance_rigid_body::domTechnique_common::domMass_frame)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domInstance_rigid_body::domTechnique_common::domShape::create(daeInt bytes) +{ + domInstance_rigid_body::domTechnique_common::domShapeRef ref = new(bytes) domInstance_rigid_body::domTechnique_common::domShape; + return ref; +} + + +daeMetaElement * +domInstance_rigid_body::domTechnique_common::domShape::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "shape" ); + _Meta->registerClass(domInstance_rigid_body::domTechnique_common::domShape::create, &_Meta); + + _Meta->setIsInnerClass( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 0, 1 ); + mea->setName( "hollow" ); + mea->setOffset( daeOffsetOf(domInstance_rigid_body::domTechnique_common::domShape,elemHollow) ); + mea->setElementType( domInstance_rigid_body::domTechnique_common::domShape::domHollow::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 0, 1 ); + mea->setName( "mass" ); + mea->setOffset( daeOffsetOf(domInstance_rigid_body::domTechnique_common::domShape,elemMass) ); + mea->setElementType( domTargetableFloat::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 2, 0, 1 ); + mea->setName( "density" ); + mea->setOffset( daeOffsetOf(domInstance_rigid_body::domTechnique_common::domShape,elemDensity) ); + mea->setElementType( domTargetableFloat::registerElement() ); + cm->appendChild( mea ); + + cm = new daeMetaChoice( _Meta, cm, 3, 0, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "instance_physics_material" ); + mea->setOffset( daeOffsetOf(domInstance_rigid_body::domTechnique_common::domShape,elemInstance_physics_material) ); + mea->setElementType( domInstance_physics_material::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "physics_material" ); + mea->setOffset( daeOffsetOf(domInstance_rigid_body::domTechnique_common::domShape,elemPhysics_material) ); + mea->setElementType( domPhysics_material::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + cm->getParent()->appendChild( cm ); + cm = cm->getParent(); + + cm = new daeMetaChoice( _Meta, cm, 4, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "instance_geometry" ); + mea->setOffset( daeOffsetOf(domInstance_rigid_body::domTechnique_common::domShape,elemInstance_geometry) ); + mea->setElementType( domInstance_geometry::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "plane" ); + mea->setOffset( daeOffsetOf(domInstance_rigid_body::domTechnique_common::domShape,elemPlane) ); + mea->setElementType( domPlane::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "box" ); + mea->setOffset( daeOffsetOf(domInstance_rigid_body::domTechnique_common::domShape,elemBox) ); + mea->setElementType( domBox::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "sphere" ); + mea->setOffset( daeOffsetOf(domInstance_rigid_body::domTechnique_common::domShape,elemSphere) ); + mea->setElementType( domSphere::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "cylinder" ); + mea->setOffset( daeOffsetOf(domInstance_rigid_body::domTechnique_common::domShape,elemCylinder) ); + mea->setElementType( domCylinder::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "tapered_cylinder" ); + mea->setOffset( daeOffsetOf(domInstance_rigid_body::domTechnique_common::domShape,elemTapered_cylinder) ); + mea->setElementType( domTapered_cylinder::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "capsule" ); + mea->setOffset( daeOffsetOf(domInstance_rigid_body::domTechnique_common::domShape,elemCapsule) ); + mea->setElementType( domCapsule::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "tapered_capsule" ); + mea->setOffset( daeOffsetOf(domInstance_rigid_body::domTechnique_common::domShape,elemTapered_capsule) ); + mea->setElementType( domTapered_capsule::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + cm->getParent()->appendChild( cm ); + cm = cm->getParent(); + + cm = new daeMetaChoice( _Meta, cm, 5, 0, -1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "translate" ); + mea->setOffset( daeOffsetOf(domInstance_rigid_body::domTechnique_common::domShape,elemTranslate_array) ); + mea->setElementType( domTranslate::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "rotate" ); + mea->setOffset( daeOffsetOf(domInstance_rigid_body::domTechnique_common::domShape,elemRotate_array) ); + mea->setElementType( domRotate::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + cm->getParent()->appendChild( cm ); + cm = cm->getParent(); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 3006, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domInstance_rigid_body::domTechnique_common::domShape,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 3006 ); + _Meta->setCMRoot( cm ); + // Ordered list of sub-elements + _Meta->addContents(daeOffsetOf(domInstance_rigid_body::domTechnique_common::domShape,_contents)); + _Meta->addContentsOrder(daeOffsetOf(domInstance_rigid_body::domTechnique_common::domShape,_contentsOrder)); + + + + _Meta->setElementSize(sizeof(domInstance_rigid_body::domTechnique_common::domShape)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domInstance_rigid_body::domTechnique_common::domShape::domHollow::create(daeInt bytes) +{ + domInstance_rigid_body::domTechnique_common::domShape::domHollowRef ref = new(bytes) domInstance_rigid_body::domTechnique_common::domShape::domHollow; + return ref; +} + + +daeMetaElement * +domInstance_rigid_body::domTechnique_common::domShape::domHollow::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "hollow" ); + _Meta->registerClass(domInstance_rigid_body::domTechnique_common::domShape::domHollow::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Bool")); + ma->setOffset( daeOffsetOf( domInstance_rigid_body::domTechnique_common::domShape::domHollow , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + // Add attribute: sid + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "sid" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domInstance_rigid_body::domTechnique_common::domShape::domHollow , attrSid )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domInstance_rigid_body::domTechnique_common::domShape::domHollow)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domInstance_rigid_body::_Meta = NULL; +daeMetaElement * domInstance_rigid_body::domTechnique_common::_Meta = NULL; +daeMetaElement * domInstance_rigid_body::domTechnique_common::domAngular_velocity::_Meta = NULL; +daeMetaElement * domInstance_rigid_body::domTechnique_common::domVelocity::_Meta = NULL; +daeMetaElement * domInstance_rigid_body::domTechnique_common::domDynamic::_Meta = NULL; +daeMetaElement * domInstance_rigid_body::domTechnique_common::domMass_frame::_Meta = NULL; +daeMetaElement * domInstance_rigid_body::domTechnique_common::domShape::_Meta = NULL; +daeMetaElement * domInstance_rigid_body::domTechnique_common::domShape::domHollow::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domInstance_rigid_constraint.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domInstance_rigid_constraint.cpp new file mode 100644 index 00000000..a612cee1 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domInstance_rigid_constraint.cpp @@ -0,0 +1,97 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domInstance_rigid_constraint::create(daeInt bytes) +{ + domInstance_rigid_constraintRef ref = new(bytes) domInstance_rigid_constraint; + return ref; +} + + +daeMetaElement * +domInstance_rigid_constraint::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "instance_rigid_constraint" ); + _Meta->registerClass(domInstance_rigid_constraint::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domInstance_rigid_constraint,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + _Meta->setCMRoot( cm ); + + // Add attribute: constraint + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "constraint" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domInstance_rigid_constraint , attrConstraint )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: sid + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "sid" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domInstance_rigid_constraint , attrSid )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: name + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "name" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domInstance_rigid_constraint , attrName )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domInstance_rigid_constraint)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domInstance_rigid_constraint::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domInt_array.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domInt_array.cpp new file mode 100644 index 00000000..33b7d753 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domInt_array.cpp @@ -0,0 +1,118 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domInt_array::create(daeInt bytes) +{ + domInt_arrayRef ref = new(bytes) domInt_array; + return ref; +} + + +daeMetaElement * +domInt_array::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "int_array" ); + _Meta->registerClass(domInt_array::create, &_Meta); + + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("ListOfInts")); + ma->setOffset( daeOffsetOf( domInt_array , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + // Add attribute: id + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "id" ); + ma->setType( daeAtomicType::get("xsID")); + ma->setOffset( daeOffsetOf( domInt_array , attrId )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: name + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "name" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domInt_array , attrName )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: count + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "count" ); + ma->setType( daeAtomicType::get("Uint")); + ma->setOffset( daeOffsetOf( domInt_array , attrCount )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: minInclusive + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "minInclusive" ); + ma->setType( daeAtomicType::get("xsInteger")); + ma->setOffset( daeOffsetOf( domInt_array , attrMinInclusive )); + ma->setContainer( _Meta ); + ma->setDefault( "-2147483648"); + + _Meta->appendAttribute(ma); + } + + // Add attribute: maxInclusive + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "maxInclusive" ); + ma->setType( daeAtomicType::get("xsInteger")); + ma->setOffset( daeOffsetOf( domInt_array , attrMaxInclusive )); + ma->setContainer( _Meta ); + ma->setDefault( "2147483647"); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domInt_array)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domInt_array::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domLibrary_animation_clips.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domLibrary_animation_clips.cpp new file mode 100644 index 00000000..f0025b49 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domLibrary_animation_clips.cpp @@ -0,0 +1,97 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domLibrary_animation_clips::create(daeInt bytes) +{ + domLibrary_animation_clipsRef ref = new(bytes) domLibrary_animation_clips; + return ref; +} + + +daeMetaElement * +domLibrary_animation_clips::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "library_animation_clips" ); + _Meta->registerClass(domLibrary_animation_clips::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 0, 1 ); + mea->setName( "asset" ); + mea->setOffset( daeOffsetOf(domLibrary_animation_clips,elemAsset) ); + mea->setElementType( domAsset::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 1, 1, -1 ); + mea->setName( "animation_clip" ); + mea->setOffset( daeOffsetOf(domLibrary_animation_clips,elemAnimation_clip_array) ); + mea->setElementType( domAnimation_clip::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 2, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domLibrary_animation_clips,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 2 ); + _Meta->setCMRoot( cm ); + + // Add attribute: id + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "id" ); + ma->setType( daeAtomicType::get("xsID")); + ma->setOffset( daeOffsetOf( domLibrary_animation_clips , attrId )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: name + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "name" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domLibrary_animation_clips , attrName )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domLibrary_animation_clips)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domLibrary_animation_clips::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domLibrary_animations.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domLibrary_animations.cpp new file mode 100644 index 00000000..d3519df3 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domLibrary_animations.cpp @@ -0,0 +1,97 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domLibrary_animations::create(daeInt bytes) +{ + domLibrary_animationsRef ref = new(bytes) domLibrary_animations; + return ref; +} + + +daeMetaElement * +domLibrary_animations::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "library_animations" ); + _Meta->registerClass(domLibrary_animations::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 0, 1 ); + mea->setName( "asset" ); + mea->setOffset( daeOffsetOf(domLibrary_animations,elemAsset) ); + mea->setElementType( domAsset::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 1, 1, -1 ); + mea->setName( "animation" ); + mea->setOffset( daeOffsetOf(domLibrary_animations,elemAnimation_array) ); + mea->setElementType( domAnimation::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 2, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domLibrary_animations,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 2 ); + _Meta->setCMRoot( cm ); + + // Add attribute: id + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "id" ); + ma->setType( daeAtomicType::get("xsID")); + ma->setOffset( daeOffsetOf( domLibrary_animations , attrId )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: name + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "name" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domLibrary_animations , attrName )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domLibrary_animations)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domLibrary_animations::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domLibrary_cameras.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domLibrary_cameras.cpp new file mode 100644 index 00000000..a3e495d9 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domLibrary_cameras.cpp @@ -0,0 +1,97 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domLibrary_cameras::create(daeInt bytes) +{ + domLibrary_camerasRef ref = new(bytes) domLibrary_cameras; + return ref; +} + + +daeMetaElement * +domLibrary_cameras::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "library_cameras" ); + _Meta->registerClass(domLibrary_cameras::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 0, 1 ); + mea->setName( "asset" ); + mea->setOffset( daeOffsetOf(domLibrary_cameras,elemAsset) ); + mea->setElementType( domAsset::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 1, 1, -1 ); + mea->setName( "camera" ); + mea->setOffset( daeOffsetOf(domLibrary_cameras,elemCamera_array) ); + mea->setElementType( domCamera::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 2, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domLibrary_cameras,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 2 ); + _Meta->setCMRoot( cm ); + + // Add attribute: id + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "id" ); + ma->setType( daeAtomicType::get("xsID")); + ma->setOffset( daeOffsetOf( domLibrary_cameras , attrId )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: name + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "name" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domLibrary_cameras , attrName )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domLibrary_cameras)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domLibrary_cameras::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domLibrary_controllers.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domLibrary_controllers.cpp new file mode 100644 index 00000000..fa0c90f4 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domLibrary_controllers.cpp @@ -0,0 +1,97 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domLibrary_controllers::create(daeInt bytes) +{ + domLibrary_controllersRef ref = new(bytes) domLibrary_controllers; + return ref; +} + + +daeMetaElement * +domLibrary_controllers::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "library_controllers" ); + _Meta->registerClass(domLibrary_controllers::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 0, 1 ); + mea->setName( "asset" ); + mea->setOffset( daeOffsetOf(domLibrary_controllers,elemAsset) ); + mea->setElementType( domAsset::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 1, 1, -1 ); + mea->setName( "controller" ); + mea->setOffset( daeOffsetOf(domLibrary_controllers,elemController_array) ); + mea->setElementType( domController::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 2, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domLibrary_controllers,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 2 ); + _Meta->setCMRoot( cm ); + + // Add attribute: id + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "id" ); + ma->setType( daeAtomicType::get("xsID")); + ma->setOffset( daeOffsetOf( domLibrary_controllers , attrId )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: name + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "name" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domLibrary_controllers , attrName )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domLibrary_controllers)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domLibrary_controllers::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domLibrary_effects.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domLibrary_effects.cpp new file mode 100644 index 00000000..0c9eafb5 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domLibrary_effects.cpp @@ -0,0 +1,97 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domLibrary_effects::create(daeInt bytes) +{ + domLibrary_effectsRef ref = new(bytes) domLibrary_effects; + return ref; +} + + +daeMetaElement * +domLibrary_effects::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "library_effects" ); + _Meta->registerClass(domLibrary_effects::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 0, 1 ); + mea->setName( "asset" ); + mea->setOffset( daeOffsetOf(domLibrary_effects,elemAsset) ); + mea->setElementType( domAsset::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 1, 1, -1 ); + mea->setName( "effect" ); + mea->setOffset( daeOffsetOf(domLibrary_effects,elemEffect_array) ); + mea->setElementType( domEffect::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 2, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domLibrary_effects,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 2 ); + _Meta->setCMRoot( cm ); + + // Add attribute: id + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "id" ); + ma->setType( daeAtomicType::get("xsID")); + ma->setOffset( daeOffsetOf( domLibrary_effects , attrId )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: name + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "name" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domLibrary_effects , attrName )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domLibrary_effects)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domLibrary_effects::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domLibrary_force_fields.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domLibrary_force_fields.cpp new file mode 100644 index 00000000..9fd6438d --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domLibrary_force_fields.cpp @@ -0,0 +1,97 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domLibrary_force_fields::create(daeInt bytes) +{ + domLibrary_force_fieldsRef ref = new(bytes) domLibrary_force_fields; + return ref; +} + + +daeMetaElement * +domLibrary_force_fields::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "library_force_fields" ); + _Meta->registerClass(domLibrary_force_fields::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 0, 1 ); + mea->setName( "asset" ); + mea->setOffset( daeOffsetOf(domLibrary_force_fields,elemAsset) ); + mea->setElementType( domAsset::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 1, 1, -1 ); + mea->setName( "force_field" ); + mea->setOffset( daeOffsetOf(domLibrary_force_fields,elemForce_field_array) ); + mea->setElementType( domForce_field::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 2, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domLibrary_force_fields,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 2 ); + _Meta->setCMRoot( cm ); + + // Add attribute: id + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "id" ); + ma->setType( daeAtomicType::get("xsID")); + ma->setOffset( daeOffsetOf( domLibrary_force_fields , attrId )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: name + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "name" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domLibrary_force_fields , attrName )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domLibrary_force_fields)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domLibrary_force_fields::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domLibrary_geometries.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domLibrary_geometries.cpp new file mode 100644 index 00000000..53c31264 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domLibrary_geometries.cpp @@ -0,0 +1,97 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domLibrary_geometries::create(daeInt bytes) +{ + domLibrary_geometriesRef ref = new(bytes) domLibrary_geometries; + return ref; +} + + +daeMetaElement * +domLibrary_geometries::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "library_geometries" ); + _Meta->registerClass(domLibrary_geometries::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 0, 1 ); + mea->setName( "asset" ); + mea->setOffset( daeOffsetOf(domLibrary_geometries,elemAsset) ); + mea->setElementType( domAsset::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 1, 1, -1 ); + mea->setName( "geometry" ); + mea->setOffset( daeOffsetOf(domLibrary_geometries,elemGeometry_array) ); + mea->setElementType( domGeometry::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 2, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domLibrary_geometries,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 2 ); + _Meta->setCMRoot( cm ); + + // Add attribute: id + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "id" ); + ma->setType( daeAtomicType::get("xsID")); + ma->setOffset( daeOffsetOf( domLibrary_geometries , attrId )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: name + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "name" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domLibrary_geometries , attrName )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domLibrary_geometries)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domLibrary_geometries::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domLibrary_images.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domLibrary_images.cpp new file mode 100644 index 00000000..9384c08c --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domLibrary_images.cpp @@ -0,0 +1,97 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domLibrary_images::create(daeInt bytes) +{ + domLibrary_imagesRef ref = new(bytes) domLibrary_images; + return ref; +} + + +daeMetaElement * +domLibrary_images::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "library_images" ); + _Meta->registerClass(domLibrary_images::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 0, 1 ); + mea->setName( "asset" ); + mea->setOffset( daeOffsetOf(domLibrary_images,elemAsset) ); + mea->setElementType( domAsset::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 1, 1, -1 ); + mea->setName( "image" ); + mea->setOffset( daeOffsetOf(domLibrary_images,elemImage_array) ); + mea->setElementType( domImage::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 2, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domLibrary_images,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 2 ); + _Meta->setCMRoot( cm ); + + // Add attribute: id + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "id" ); + ma->setType( daeAtomicType::get("xsID")); + ma->setOffset( daeOffsetOf( domLibrary_images , attrId )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: name + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "name" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domLibrary_images , attrName )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domLibrary_images)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domLibrary_images::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domLibrary_lights.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domLibrary_lights.cpp new file mode 100644 index 00000000..276eb3a0 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domLibrary_lights.cpp @@ -0,0 +1,97 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domLibrary_lights::create(daeInt bytes) +{ + domLibrary_lightsRef ref = new(bytes) domLibrary_lights; + return ref; +} + + +daeMetaElement * +domLibrary_lights::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "library_lights" ); + _Meta->registerClass(domLibrary_lights::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 0, 1 ); + mea->setName( "asset" ); + mea->setOffset( daeOffsetOf(domLibrary_lights,elemAsset) ); + mea->setElementType( domAsset::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 1, 1, -1 ); + mea->setName( "light" ); + mea->setOffset( daeOffsetOf(domLibrary_lights,elemLight_array) ); + mea->setElementType( domLight::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 2, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domLibrary_lights,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 2 ); + _Meta->setCMRoot( cm ); + + // Add attribute: id + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "id" ); + ma->setType( daeAtomicType::get("xsID")); + ma->setOffset( daeOffsetOf( domLibrary_lights , attrId )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: name + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "name" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domLibrary_lights , attrName )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domLibrary_lights)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domLibrary_lights::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domLibrary_materials.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domLibrary_materials.cpp new file mode 100644 index 00000000..62406b39 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domLibrary_materials.cpp @@ -0,0 +1,97 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domLibrary_materials::create(daeInt bytes) +{ + domLibrary_materialsRef ref = new(bytes) domLibrary_materials; + return ref; +} + + +daeMetaElement * +domLibrary_materials::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "library_materials" ); + _Meta->registerClass(domLibrary_materials::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 0, 1 ); + mea->setName( "asset" ); + mea->setOffset( daeOffsetOf(domLibrary_materials,elemAsset) ); + mea->setElementType( domAsset::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 1, 1, -1 ); + mea->setName( "material" ); + mea->setOffset( daeOffsetOf(domLibrary_materials,elemMaterial_array) ); + mea->setElementType( domMaterial::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 2, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domLibrary_materials,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 2 ); + _Meta->setCMRoot( cm ); + + // Add attribute: id + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "id" ); + ma->setType( daeAtomicType::get("xsID")); + ma->setOffset( daeOffsetOf( domLibrary_materials , attrId )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: name + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "name" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domLibrary_materials , attrName )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domLibrary_materials)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domLibrary_materials::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domLibrary_nodes.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domLibrary_nodes.cpp new file mode 100644 index 00000000..117f9fde --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domLibrary_nodes.cpp @@ -0,0 +1,97 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domLibrary_nodes::create(daeInt bytes) +{ + domLibrary_nodesRef ref = new(bytes) domLibrary_nodes; + return ref; +} + + +daeMetaElement * +domLibrary_nodes::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "library_nodes" ); + _Meta->registerClass(domLibrary_nodes::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 0, 1 ); + mea->setName( "asset" ); + mea->setOffset( daeOffsetOf(domLibrary_nodes,elemAsset) ); + mea->setElementType( domAsset::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 1, 1, -1 ); + mea->setName( "node" ); + mea->setOffset( daeOffsetOf(domLibrary_nodes,elemNode_array) ); + mea->setElementType( domNode::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 2, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domLibrary_nodes,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 2 ); + _Meta->setCMRoot( cm ); + + // Add attribute: id + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "id" ); + ma->setType( daeAtomicType::get("xsID")); + ma->setOffset( daeOffsetOf( domLibrary_nodes , attrId )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: name + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "name" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domLibrary_nodes , attrName )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domLibrary_nodes)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domLibrary_nodes::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domLibrary_physics_materials.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domLibrary_physics_materials.cpp new file mode 100644 index 00000000..0c1c987b --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domLibrary_physics_materials.cpp @@ -0,0 +1,97 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domLibrary_physics_materials::create(daeInt bytes) +{ + domLibrary_physics_materialsRef ref = new(bytes) domLibrary_physics_materials; + return ref; +} + + +daeMetaElement * +domLibrary_physics_materials::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "library_physics_materials" ); + _Meta->registerClass(domLibrary_physics_materials::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 0, 1 ); + mea->setName( "asset" ); + mea->setOffset( daeOffsetOf(domLibrary_physics_materials,elemAsset) ); + mea->setElementType( domAsset::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 1, 1, -1 ); + mea->setName( "physics_material" ); + mea->setOffset( daeOffsetOf(domLibrary_physics_materials,elemPhysics_material_array) ); + mea->setElementType( domPhysics_material::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 2, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domLibrary_physics_materials,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 2 ); + _Meta->setCMRoot( cm ); + + // Add attribute: id + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "id" ); + ma->setType( daeAtomicType::get("xsID")); + ma->setOffset( daeOffsetOf( domLibrary_physics_materials , attrId )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: name + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "name" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domLibrary_physics_materials , attrName )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domLibrary_physics_materials)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domLibrary_physics_materials::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domLibrary_physics_models.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domLibrary_physics_models.cpp new file mode 100644 index 00000000..b685ca0c --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domLibrary_physics_models.cpp @@ -0,0 +1,97 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domLibrary_physics_models::create(daeInt bytes) +{ + domLibrary_physics_modelsRef ref = new(bytes) domLibrary_physics_models; + return ref; +} + + +daeMetaElement * +domLibrary_physics_models::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "library_physics_models" ); + _Meta->registerClass(domLibrary_physics_models::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 0, 1 ); + mea->setName( "asset" ); + mea->setOffset( daeOffsetOf(domLibrary_physics_models,elemAsset) ); + mea->setElementType( domAsset::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 1, 1, -1 ); + mea->setName( "physics_model" ); + mea->setOffset( daeOffsetOf(domLibrary_physics_models,elemPhysics_model_array) ); + mea->setElementType( domPhysics_model::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 2, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domLibrary_physics_models,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 2 ); + _Meta->setCMRoot( cm ); + + // Add attribute: id + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "id" ); + ma->setType( daeAtomicType::get("xsID")); + ma->setOffset( daeOffsetOf( domLibrary_physics_models , attrId )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: name + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "name" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domLibrary_physics_models , attrName )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domLibrary_physics_models)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domLibrary_physics_models::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domLibrary_physics_scenes.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domLibrary_physics_scenes.cpp new file mode 100644 index 00000000..55a2fbf8 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domLibrary_physics_scenes.cpp @@ -0,0 +1,97 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domLibrary_physics_scenes::create(daeInt bytes) +{ + domLibrary_physics_scenesRef ref = new(bytes) domLibrary_physics_scenes; + return ref; +} + + +daeMetaElement * +domLibrary_physics_scenes::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "library_physics_scenes" ); + _Meta->registerClass(domLibrary_physics_scenes::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 0, 1 ); + mea->setName( "asset" ); + mea->setOffset( daeOffsetOf(domLibrary_physics_scenes,elemAsset) ); + mea->setElementType( domAsset::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 1, 1, -1 ); + mea->setName( "physics_scene" ); + mea->setOffset( daeOffsetOf(domLibrary_physics_scenes,elemPhysics_scene_array) ); + mea->setElementType( domPhysics_scene::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 2, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domLibrary_physics_scenes,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 2 ); + _Meta->setCMRoot( cm ); + + // Add attribute: id + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "id" ); + ma->setType( daeAtomicType::get("xsID")); + ma->setOffset( daeOffsetOf( domLibrary_physics_scenes , attrId )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: name + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "name" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domLibrary_physics_scenes , attrName )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domLibrary_physics_scenes)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domLibrary_physics_scenes::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domLibrary_visual_scenes.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domLibrary_visual_scenes.cpp new file mode 100644 index 00000000..891165d9 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domLibrary_visual_scenes.cpp @@ -0,0 +1,97 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domLibrary_visual_scenes::create(daeInt bytes) +{ + domLibrary_visual_scenesRef ref = new(bytes) domLibrary_visual_scenes; + return ref; +} + + +daeMetaElement * +domLibrary_visual_scenes::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "library_visual_scenes" ); + _Meta->registerClass(domLibrary_visual_scenes::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 0, 1 ); + mea->setName( "asset" ); + mea->setOffset( daeOffsetOf(domLibrary_visual_scenes,elemAsset) ); + mea->setElementType( domAsset::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 1, 1, -1 ); + mea->setName( "visual_scene" ); + mea->setOffset( daeOffsetOf(domLibrary_visual_scenes,elemVisual_scene_array) ); + mea->setElementType( domVisual_scene::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 2, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domLibrary_visual_scenes,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 2 ); + _Meta->setCMRoot( cm ); + + // Add attribute: id + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "id" ); + ma->setType( daeAtomicType::get("xsID")); + ma->setOffset( daeOffsetOf( domLibrary_visual_scenes , attrId )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: name + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "name" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domLibrary_visual_scenes , attrName )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domLibrary_visual_scenes)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domLibrary_visual_scenes::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domLight.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domLight.cpp new file mode 100644 index 00000000..aaa4e692 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domLight.cpp @@ -0,0 +1,368 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domLight::create(daeInt bytes) +{ + domLightRef ref = new(bytes) domLight; + return ref; +} + + +daeMetaElement * +domLight::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "light" ); + _Meta->registerClass(domLight::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 0, 1 ); + mea->setName( "asset" ); + mea->setOffset( daeOffsetOf(domLight,elemAsset) ); + mea->setElementType( domAsset::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 1, 1 ); + mea->setName( "technique_common" ); + mea->setOffset( daeOffsetOf(domLight,elemTechnique_common) ); + mea->setElementType( domLight::domTechnique_common::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 2, 0, -1 ); + mea->setName( "technique" ); + mea->setOffset( daeOffsetOf(domLight,elemTechnique_array) ); + mea->setElementType( domTechnique::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 3, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domLight,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 3 ); + _Meta->setCMRoot( cm ); + + // Add attribute: id + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "id" ); + ma->setType( daeAtomicType::get("xsID")); + ma->setOffset( daeOffsetOf( domLight , attrId )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: name + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "name" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domLight , attrName )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domLight)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domLight::domTechnique_common::create(daeInt bytes) +{ + domLight::domTechnique_commonRef ref = new(bytes) domLight::domTechnique_common; + return ref; +} + + +daeMetaElement * +domLight::domTechnique_common::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "technique_common" ); + _Meta->registerClass(domLight::domTechnique_common::create, &_Meta); + + _Meta->setIsInnerClass( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaChoice( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "ambient" ); + mea->setOffset( daeOffsetOf(domLight::domTechnique_common,elemAmbient) ); + mea->setElementType( domLight::domTechnique_common::domAmbient::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "directional" ); + mea->setOffset( daeOffsetOf(domLight::domTechnique_common,elemDirectional) ); + mea->setElementType( domLight::domTechnique_common::domDirectional::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "point" ); + mea->setOffset( daeOffsetOf(domLight::domTechnique_common,elemPoint) ); + mea->setElementType( domLight::domTechnique_common::domPoint::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "spot" ); + mea->setOffset( daeOffsetOf(domLight::domTechnique_common,elemSpot) ); + mea->setElementType( domLight::domTechnique_common::domSpot::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + _Meta->setCMRoot( cm ); + // Ordered list of sub-elements + _Meta->addContents(daeOffsetOf(domLight::domTechnique_common,_contents)); + _Meta->addContentsOrder(daeOffsetOf(domLight::domTechnique_common,_contentsOrder)); + + + + _Meta->setElementSize(sizeof(domLight::domTechnique_common)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domLight::domTechnique_common::domAmbient::create(daeInt bytes) +{ + domLight::domTechnique_common::domAmbientRef ref = new(bytes) domLight::domTechnique_common::domAmbient; + return ref; +} + + +daeMetaElement * +domLight::domTechnique_common::domAmbient::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "ambient" ); + _Meta->registerClass(domLight::domTechnique_common::domAmbient::create, &_Meta); + + _Meta->setIsInnerClass( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "color" ); + mea->setOffset( daeOffsetOf(domLight::domTechnique_common::domAmbient,elemColor) ); + mea->setElementType( domTargetableFloat3::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + _Meta->setCMRoot( cm ); + + + _Meta->setElementSize(sizeof(domLight::domTechnique_common::domAmbient)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domLight::domTechnique_common::domDirectional::create(daeInt bytes) +{ + domLight::domTechnique_common::domDirectionalRef ref = new(bytes) domLight::domTechnique_common::domDirectional; + return ref; +} + + +daeMetaElement * +domLight::domTechnique_common::domDirectional::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "directional" ); + _Meta->registerClass(domLight::domTechnique_common::domDirectional::create, &_Meta); + + _Meta->setIsInnerClass( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "color" ); + mea->setOffset( daeOffsetOf(domLight::domTechnique_common::domDirectional,elemColor) ); + mea->setElementType( domTargetableFloat3::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + _Meta->setCMRoot( cm ); + + + _Meta->setElementSize(sizeof(domLight::domTechnique_common::domDirectional)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domLight::domTechnique_common::domPoint::create(daeInt bytes) +{ + domLight::domTechnique_common::domPointRef ref = new(bytes) domLight::domTechnique_common::domPoint; + return ref; +} + + +daeMetaElement * +domLight::domTechnique_common::domPoint::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "point" ); + _Meta->registerClass(domLight::domTechnique_common::domPoint::create, &_Meta); + + _Meta->setIsInnerClass( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "color" ); + mea->setOffset( daeOffsetOf(domLight::domTechnique_common::domPoint,elemColor) ); + mea->setElementType( domTargetableFloat3::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 0, 1 ); + mea->setName( "constant_attenuation" ); + mea->setOffset( daeOffsetOf(domLight::domTechnique_common::domPoint,elemConstant_attenuation) ); + mea->setElementType( domTargetableFloat::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 2, 0, 1 ); + mea->setName( "linear_attenuation" ); + mea->setOffset( daeOffsetOf(domLight::domTechnique_common::domPoint,elemLinear_attenuation) ); + mea->setElementType( domTargetableFloat::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 3, 0, 1 ); + mea->setName( "quadratic_attenuation" ); + mea->setOffset( daeOffsetOf(domLight::domTechnique_common::domPoint,elemQuadratic_attenuation) ); + mea->setElementType( domTargetableFloat::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 3 ); + _Meta->setCMRoot( cm ); + + + _Meta->setElementSize(sizeof(domLight::domTechnique_common::domPoint)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domLight::domTechnique_common::domSpot::create(daeInt bytes) +{ + domLight::domTechnique_common::domSpotRef ref = new(bytes) domLight::domTechnique_common::domSpot; + return ref; +} + + +daeMetaElement * +domLight::domTechnique_common::domSpot::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "spot" ); + _Meta->registerClass(domLight::domTechnique_common::domSpot::create, &_Meta); + + _Meta->setIsInnerClass( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "color" ); + mea->setOffset( daeOffsetOf(domLight::domTechnique_common::domSpot,elemColor) ); + mea->setElementType( domTargetableFloat3::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 0, 1 ); + mea->setName( "constant_attenuation" ); + mea->setOffset( daeOffsetOf(domLight::domTechnique_common::domSpot,elemConstant_attenuation) ); + mea->setElementType( domTargetableFloat::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 2, 0, 1 ); + mea->setName( "linear_attenuation" ); + mea->setOffset( daeOffsetOf(domLight::domTechnique_common::domSpot,elemLinear_attenuation) ); + mea->setElementType( domTargetableFloat::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 3, 0, 1 ); + mea->setName( "quadratic_attenuation" ); + mea->setOffset( daeOffsetOf(domLight::domTechnique_common::domSpot,elemQuadratic_attenuation) ); + mea->setElementType( domTargetableFloat::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 4, 0, 1 ); + mea->setName( "falloff_angle" ); + mea->setOffset( daeOffsetOf(domLight::domTechnique_common::domSpot,elemFalloff_angle) ); + mea->setElementType( domTargetableFloat::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 5, 0, 1 ); + mea->setName( "falloff_exponent" ); + mea->setOffset( daeOffsetOf(domLight::domTechnique_common::domSpot,elemFalloff_exponent) ); + mea->setElementType( domTargetableFloat::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 5 ); + _Meta->setCMRoot( cm ); + + + _Meta->setElementSize(sizeof(domLight::domTechnique_common::domSpot)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domLight::_Meta = NULL; +daeMetaElement * domLight::domTechnique_common::_Meta = NULL; +daeMetaElement * domLight::domTechnique_common::domAmbient::_Meta = NULL; +daeMetaElement * domLight::domTechnique_common::domDirectional::_Meta = NULL; +daeMetaElement * domLight::domTechnique_common::domPoint::_Meta = NULL; +daeMetaElement * domLight::domTechnique_common::domSpot::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domLines.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domLines.cpp new file mode 100644 index 00000000..27f2dae2 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domLines.cpp @@ -0,0 +1,109 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domLines::create(daeInt bytes) +{ + domLinesRef ref = new(bytes) domLines; + return ref; +} + + +daeMetaElement * +domLines::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "lines" ); + _Meta->registerClass(domLines::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 0, -1 ); + mea->setName( "input" ); + mea->setOffset( daeOffsetOf(domLines,elemInput_array) ); + mea->setElementType( domInputLocalOffset::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 0, 1 ); + mea->setName( "p" ); + mea->setOffset( daeOffsetOf(domLines,elemP) ); + mea->setElementType( domP::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 2, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domLines,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 2 ); + _Meta->setCMRoot( cm ); + + // Add attribute: name + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "name" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domLines , attrName )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: count + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "count" ); + ma->setType( daeAtomicType::get("Uint")); + ma->setOffset( daeOffsetOf( domLines , attrCount )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: material + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "material" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domLines , attrMaterial )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domLines)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domLines::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domLinestrips.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domLinestrips.cpp new file mode 100644 index 00000000..6533f20c --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domLinestrips.cpp @@ -0,0 +1,109 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domLinestrips::create(daeInt bytes) +{ + domLinestripsRef ref = new(bytes) domLinestrips; + return ref; +} + + +daeMetaElement * +domLinestrips::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "linestrips" ); + _Meta->registerClass(domLinestrips::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 0, -1 ); + mea->setName( "input" ); + mea->setOffset( daeOffsetOf(domLinestrips,elemInput_array) ); + mea->setElementType( domInputLocalOffset::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 1, 0, -1 ); + mea->setName( "p" ); + mea->setOffset( daeOffsetOf(domLinestrips,elemP_array) ); + mea->setElementType( domP::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 2, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domLinestrips,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 2 ); + _Meta->setCMRoot( cm ); + + // Add attribute: name + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "name" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domLinestrips , attrName )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: count + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "count" ); + ma->setType( daeAtomicType::get("Uint")); + ma->setOffset( daeOffsetOf( domLinestrips , attrCount )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: material + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "material" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domLinestrips , attrMaterial )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domLinestrips)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domLinestrips::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domLookat.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domLookat.cpp new file mode 100644 index 00000000..b6513592 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domLookat.cpp @@ -0,0 +1,71 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domLookat::create(daeInt bytes) +{ + domLookatRef ref = new(bytes) domLookat; + return ref; +} + + +daeMetaElement * +domLookat::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "lookat" ); + _Meta->registerClass(domLookat::create, &_Meta); + + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Float3x3")); + ma->setOffset( daeOffsetOf( domLookat , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + // Add attribute: sid + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "sid" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domLookat , attrSid )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domLookat)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domLookat::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domMaterial.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domMaterial.cpp new file mode 100644 index 00000000..9b3b3ca9 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domMaterial.cpp @@ -0,0 +1,97 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domMaterial::create(daeInt bytes) +{ + domMaterialRef ref = new(bytes) domMaterial; + return ref; +} + + +daeMetaElement * +domMaterial::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "material" ); + _Meta->registerClass(domMaterial::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 0, 1 ); + mea->setName( "asset" ); + mea->setOffset( daeOffsetOf(domMaterial,elemAsset) ); + mea->setElementType( domAsset::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 1, 1 ); + mea->setName( "instance_effect" ); + mea->setOffset( daeOffsetOf(domMaterial,elemInstance_effect) ); + mea->setElementType( domInstance_effect::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 2, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domMaterial,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 2 ); + _Meta->setCMRoot( cm ); + + // Add attribute: id + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "id" ); + ma->setType( daeAtomicType::get("xsID")); + ma->setOffset( daeOffsetOf( domMaterial , attrId )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: name + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "name" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domMaterial , attrName )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domMaterial)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domMaterial::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domMatrix.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domMatrix.cpp new file mode 100644 index 00000000..4b919ec1 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domMatrix.cpp @@ -0,0 +1,71 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domMatrix::create(daeInt bytes) +{ + domMatrixRef ref = new(bytes) domMatrix; + return ref; +} + + +daeMetaElement * +domMatrix::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "matrix" ); + _Meta->registerClass(domMatrix::create, &_Meta); + + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Float4x4")); + ma->setOffset( daeOffsetOf( domMatrix , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + // Add attribute: sid + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "sid" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domMatrix , attrSid )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domMatrix)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domMatrix::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domMesh.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domMesh.cpp new file mode 100644 index 00000000..2b325061 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domMesh.cpp @@ -0,0 +1,127 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domMesh::create(daeInt bytes) +{ + domMeshRef ref = new(bytes) domMesh; + return ref; +} + + +daeMetaElement * +domMesh::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "mesh" ); + _Meta->registerClass(domMesh::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, -1 ); + mea->setName( "source" ); + mea->setOffset( daeOffsetOf(domMesh,elemSource_array) ); + mea->setElementType( domSource::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 1, 1 ); + mea->setName( "vertices" ); + mea->setOffset( daeOffsetOf(domMesh,elemVertices) ); + mea->setElementType( domVertices::registerElement() ); + cm->appendChild( mea ); + + cm = new daeMetaChoice( _Meta, cm, 2, 0, -1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "lines" ); + mea->setOffset( daeOffsetOf(domMesh,elemLines_array) ); + mea->setElementType( domLines::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "linestrips" ); + mea->setOffset( daeOffsetOf(domMesh,elemLinestrips_array) ); + mea->setElementType( domLinestrips::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "polygons" ); + mea->setOffset( daeOffsetOf(domMesh,elemPolygons_array) ); + mea->setElementType( domPolygons::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "polylist" ); + mea->setOffset( daeOffsetOf(domMesh,elemPolylist_array) ); + mea->setElementType( domPolylist::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "triangles" ); + mea->setOffset( daeOffsetOf(domMesh,elemTriangles_array) ); + mea->setElementType( domTriangles::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "trifans" ); + mea->setOffset( daeOffsetOf(domMesh,elemTrifans_array) ); + mea->setElementType( domTrifans::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "tristrips" ); + mea->setOffset( daeOffsetOf(domMesh,elemTristrips_array) ); + mea->setElementType( domTristrips::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + cm->getParent()->appendChild( cm ); + cm = cm->getParent(); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 3003, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domMesh,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 3003 ); + _Meta->setCMRoot( cm ); + // Ordered list of sub-elements + _Meta->addContents(daeOffsetOf(domMesh,_contents)); + _Meta->addContentsOrder(daeOffsetOf(domMesh,_contentsOrder)); + + + + _Meta->setElementSize(sizeof(domMesh)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domMesh::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domMorph.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domMorph.cpp new file mode 100644 index 00000000..0cfe5e1a --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domMorph.cpp @@ -0,0 +1,145 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domMorph::create(daeInt bytes) +{ + domMorphRef ref = new(bytes) domMorph; + ref->attrSource.setContainer( (domMorph*)ref ); + return ref; +} + + +daeMetaElement * +domMorph::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "morph" ); + _Meta->registerClass(domMorph::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 2, -1 ); + mea->setName( "source" ); + mea->setOffset( daeOffsetOf(domMorph,elemSource_array) ); + mea->setElementType( domSource::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 1, 1 ); + mea->setName( "targets" ); + mea->setOffset( daeOffsetOf(domMorph,elemTargets) ); + mea->setElementType( domMorph::domTargets::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 2, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domMorph,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 2 ); + _Meta->setCMRoot( cm ); + + // Add attribute: method + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "method" ); + ma->setType( daeAtomicType::get("MorphMethodType")); + ma->setOffset( daeOffsetOf( domMorph , attrMethod )); + ma->setContainer( _Meta ); + ma->setDefault( "NORMALIZED"); + + _Meta->appendAttribute(ma); + } + + // Add attribute: source + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "source" ); + ma->setType( daeAtomicType::get("xsAnyURI")); + ma->setOffset( daeOffsetOf( domMorph , attrSource )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domMorph)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domMorph::domTargets::create(daeInt bytes) +{ + domMorph::domTargetsRef ref = new(bytes) domMorph::domTargets; + return ref; +} + + +daeMetaElement * +domMorph::domTargets::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "targets" ); + _Meta->registerClass(domMorph::domTargets::create, &_Meta); + + _Meta->setIsInnerClass( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 2, -1 ); + mea->setName( "input" ); + mea->setOffset( daeOffsetOf(domMorph::domTargets,elemInput_array) ); + mea->setElementType( domInputLocal::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 1, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domMorph::domTargets,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 1 ); + _Meta->setCMRoot( cm ); + + + _Meta->setElementSize(sizeof(domMorph::domTargets)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domMorph::_Meta = NULL; +daeMetaElement * domMorph::domTargets::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domName_array.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domName_array.cpp new file mode 100644 index 00000000..ada335ae --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domName_array.cpp @@ -0,0 +1,94 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domName_array::create(daeInt bytes) +{ + domName_arrayRef ref = new(bytes) domName_array; + return ref; +} + + +daeMetaElement * +domName_array::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "Name_array" ); + _Meta->registerClass(domName_array::create, &_Meta); + + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("ListOfNames")); + ma->setOffset( daeOffsetOf( domName_array , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + // Add attribute: id + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "id" ); + ma->setType( daeAtomicType::get("xsID")); + ma->setOffset( daeOffsetOf( domName_array , attrId )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: name + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "name" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domName_array , attrName )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: count + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "count" ); + ma->setType( daeAtomicType::get("Uint")); + ma->setOffset( daeOffsetOf( domName_array , attrCount )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domName_array)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domName_array::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domNode.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domNode.cpp new file mode 100644 index 00000000..77f9f9b3 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domNode.cpp @@ -0,0 +1,207 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domNode::create(daeInt bytes) +{ + domNodeRef ref = new(bytes) domNode; + return ref; +} + + +daeMetaElement * +domNode::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "node" ); + _Meta->registerClass(domNode::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 0, 1 ); + mea->setName( "asset" ); + mea->setOffset( daeOffsetOf(domNode,elemAsset) ); + mea->setElementType( domAsset::registerElement() ); + cm->appendChild( mea ); + + cm = new daeMetaChoice( _Meta, cm, 1, 0, -1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "lookat" ); + mea->setOffset( daeOffsetOf(domNode,elemLookat_array) ); + mea->setElementType( domLookat::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "matrix" ); + mea->setOffset( daeOffsetOf(domNode,elemMatrix_array) ); + mea->setElementType( domMatrix::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "rotate" ); + mea->setOffset( daeOffsetOf(domNode,elemRotate_array) ); + mea->setElementType( domRotate::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "scale" ); + mea->setOffset( daeOffsetOf(domNode,elemScale_array) ); + mea->setElementType( domScale::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "skew" ); + mea->setOffset( daeOffsetOf(domNode,elemSkew_array) ); + mea->setElementType( domSkew::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "translate" ); + mea->setOffset( daeOffsetOf(domNode,elemTranslate_array) ); + mea->setElementType( domTranslate::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + cm->getParent()->appendChild( cm ); + cm = cm->getParent(); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 3002, 0, -1 ); + mea->setName( "instance_camera" ); + mea->setOffset( daeOffsetOf(domNode,elemInstance_camera_array) ); + mea->setElementType( domInstance_camera::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 3003, 0, -1 ); + mea->setName( "instance_controller" ); + mea->setOffset( daeOffsetOf(domNode,elemInstance_controller_array) ); + mea->setElementType( domInstance_controller::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 3004, 0, -1 ); + mea->setName( "instance_geometry" ); + mea->setOffset( daeOffsetOf(domNode,elemInstance_geometry_array) ); + mea->setElementType( domInstance_geometry::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 3005, 0, -1 ); + mea->setName( "instance_light" ); + mea->setOffset( daeOffsetOf(domNode,elemInstance_light_array) ); + mea->setElementType( domInstance_light::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 3006, 0, -1 ); + mea->setName( "instance_node" ); + mea->setOffset( daeOffsetOf(domNode,elemInstance_node_array) ); + mea->setElementType( domInstance_node::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 3007, 0, -1 ); + mea->setName( "node" ); + mea->setOffset( daeOffsetOf(domNode,elemNode_array) ); + mea->setElementType( domNode::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 3008, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domNode,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 3008 ); + _Meta->setCMRoot( cm ); + // Ordered list of sub-elements + _Meta->addContents(daeOffsetOf(domNode,_contents)); + _Meta->addContentsOrder(daeOffsetOf(domNode,_contentsOrder)); + + + // Add attribute: id + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "id" ); + ma->setType( daeAtomicType::get("xsID")); + ma->setOffset( daeOffsetOf( domNode , attrId )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: name + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "name" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domNode , attrName )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: sid + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "sid" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domNode , attrSid )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: type + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "type" ); + ma->setType( daeAtomicType::get("NodeType")); + ma->setOffset( daeOffsetOf( domNode , attrType )); + ma->setContainer( _Meta ); + ma->setDefault( "NODE"); + + _Meta->appendAttribute(ma); + } + + // Add attribute: layer + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "layer" ); + ma->setType( daeAtomicType::get("ListOfNames")); + ma->setOffset( daeOffsetOf( domNode , attrLayer )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domNode)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domNode::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domP.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domP.cpp new file mode 100644 index 00000000..152e036f --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domP.cpp @@ -0,0 +1,60 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domP::create(daeInt bytes) +{ + domPRef ref = new(bytes) domP; + return ref; +} + + +daeMetaElement * +domP::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "p" ); + _Meta->registerClass(domP::create, &_Meta); + + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("ListOfUInts")); + ma->setOffset( daeOffsetOf( domP , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domP)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domP::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domParam.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domParam.cpp new file mode 100644 index 00000000..e1221a9f --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domParam.cpp @@ -0,0 +1,105 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domParam::create(daeInt bytes) +{ + domParamRef ref = new(bytes) domParam; + return ref; +} + + +daeMetaElement * +domParam::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "param" ); + _Meta->registerClass(domParam::create, &_Meta); + + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("xsString")); + ma->setOffset( daeOffsetOf( domParam , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + // Add attribute: name + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "name" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domParam , attrName )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: sid + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "sid" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domParam , attrSid )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: semantic + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "semantic" ); + ma->setType( daeAtomicType::get("xsNMTOKEN")); + ma->setOffset( daeOffsetOf( domParam , attrSemantic )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: type + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "type" ); + ma->setType( daeAtomicType::get("xsNMTOKEN")); + ma->setOffset( daeOffsetOf( domParam , attrType )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domParam)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domParam::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domPhysics_material.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domPhysics_material.cpp new file mode 100644 index 00000000..d1c88f53 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domPhysics_material.cpp @@ -0,0 +1,154 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domPhysics_material::create(daeInt bytes) +{ + domPhysics_materialRef ref = new(bytes) domPhysics_material; + return ref; +} + + +daeMetaElement * +domPhysics_material::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "physics_material" ); + _Meta->registerClass(domPhysics_material::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 0, 1 ); + mea->setName( "asset" ); + mea->setOffset( daeOffsetOf(domPhysics_material,elemAsset) ); + mea->setElementType( domAsset::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 1, 1 ); + mea->setName( "technique_common" ); + mea->setOffset( daeOffsetOf(domPhysics_material,elemTechnique_common) ); + mea->setElementType( domPhysics_material::domTechnique_common::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 2, 0, -1 ); + mea->setName( "technique" ); + mea->setOffset( daeOffsetOf(domPhysics_material,elemTechnique_array) ); + mea->setElementType( domTechnique::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 3, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domPhysics_material,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 3 ); + _Meta->setCMRoot( cm ); + + // Add attribute: id + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "id" ); + ma->setType( daeAtomicType::get("xsID")); + ma->setOffset( daeOffsetOf( domPhysics_material , attrId )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: name + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "name" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domPhysics_material , attrName )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domPhysics_material)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domPhysics_material::domTechnique_common::create(daeInt bytes) +{ + domPhysics_material::domTechnique_commonRef ref = new(bytes) domPhysics_material::domTechnique_common; + return ref; +} + + +daeMetaElement * +domPhysics_material::domTechnique_common::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "technique_common" ); + _Meta->registerClass(domPhysics_material::domTechnique_common::create, &_Meta); + + _Meta->setIsInnerClass( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 0, 1 ); + mea->setName( "dynamic_friction" ); + mea->setOffset( daeOffsetOf(domPhysics_material::domTechnique_common,elemDynamic_friction) ); + mea->setElementType( domTargetableFloat::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 0, 1 ); + mea->setName( "restitution" ); + mea->setOffset( daeOffsetOf(domPhysics_material::domTechnique_common,elemRestitution) ); + mea->setElementType( domTargetableFloat::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 2, 0, 1 ); + mea->setName( "static_friction" ); + mea->setOffset( daeOffsetOf(domPhysics_material::domTechnique_common,elemStatic_friction) ); + mea->setElementType( domTargetableFloat::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 2 ); + _Meta->setCMRoot( cm ); + + + _Meta->setElementSize(sizeof(domPhysics_material::domTechnique_common)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domPhysics_material::_Meta = NULL; +daeMetaElement * domPhysics_material::domTechnique_common::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domPhysics_model.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domPhysics_model.cpp new file mode 100644 index 00000000..d321efb1 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domPhysics_model.cpp @@ -0,0 +1,109 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domPhysics_model::create(daeInt bytes) +{ + domPhysics_modelRef ref = new(bytes) domPhysics_model; + return ref; +} + + +daeMetaElement * +domPhysics_model::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "physics_model" ); + _Meta->registerClass(domPhysics_model::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 0, 1 ); + mea->setName( "asset" ); + mea->setOffset( daeOffsetOf(domPhysics_model,elemAsset) ); + mea->setElementType( domAsset::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 1, 0, -1 ); + mea->setName( "rigid_body" ); + mea->setOffset( daeOffsetOf(domPhysics_model,elemRigid_body_array) ); + mea->setElementType( domRigid_body::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 2, 0, -1 ); + mea->setName( "rigid_constraint" ); + mea->setOffset( daeOffsetOf(domPhysics_model,elemRigid_constraint_array) ); + mea->setElementType( domRigid_constraint::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 3, 0, -1 ); + mea->setName( "instance_physics_model" ); + mea->setOffset( daeOffsetOf(domPhysics_model,elemInstance_physics_model_array) ); + mea->setElementType( domInstance_physics_model::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 4, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domPhysics_model,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 4 ); + _Meta->setCMRoot( cm ); + + // Add attribute: id + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "id" ); + ma->setType( daeAtomicType::get("xsID")); + ma->setOffset( daeOffsetOf( domPhysics_model , attrId )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: name + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "name" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domPhysics_model , attrName )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domPhysics_model)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domPhysics_model::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domPhysics_scene.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domPhysics_scene.cpp new file mode 100644 index 00000000..ff945171 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domPhysics_scene.cpp @@ -0,0 +1,160 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domPhysics_scene::create(daeInt bytes) +{ + domPhysics_sceneRef ref = new(bytes) domPhysics_scene; + return ref; +} + + +daeMetaElement * +domPhysics_scene::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "physics_scene" ); + _Meta->registerClass(domPhysics_scene::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 0, 1 ); + mea->setName( "asset" ); + mea->setOffset( daeOffsetOf(domPhysics_scene,elemAsset) ); + mea->setElementType( domAsset::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 1, 0, -1 ); + mea->setName( "instance_force_field" ); + mea->setOffset( daeOffsetOf(domPhysics_scene,elemInstance_force_field_array) ); + mea->setElementType( domInstance_force_field::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 2, 0, -1 ); + mea->setName( "instance_physics_model" ); + mea->setOffset( daeOffsetOf(domPhysics_scene,elemInstance_physics_model_array) ); + mea->setElementType( domInstance_physics_model::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 3, 1, 1 ); + mea->setName( "technique_common" ); + mea->setOffset( daeOffsetOf(domPhysics_scene,elemTechnique_common) ); + mea->setElementType( domPhysics_scene::domTechnique_common::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 4, 0, -1 ); + mea->setName( "technique" ); + mea->setOffset( daeOffsetOf(domPhysics_scene,elemTechnique_array) ); + mea->setElementType( domTechnique::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 5, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domPhysics_scene,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 5 ); + _Meta->setCMRoot( cm ); + + // Add attribute: id + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "id" ); + ma->setType( daeAtomicType::get("xsID")); + ma->setOffset( daeOffsetOf( domPhysics_scene , attrId )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: name + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "name" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domPhysics_scene , attrName )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domPhysics_scene)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domPhysics_scene::domTechnique_common::create(daeInt bytes) +{ + domPhysics_scene::domTechnique_commonRef ref = new(bytes) domPhysics_scene::domTechnique_common; + return ref; +} + + +daeMetaElement * +domPhysics_scene::domTechnique_common::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "technique_common" ); + _Meta->registerClass(domPhysics_scene::domTechnique_common::create, &_Meta); + + _Meta->setIsInnerClass( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 0, 1 ); + mea->setName( "gravity" ); + mea->setOffset( daeOffsetOf(domPhysics_scene::domTechnique_common,elemGravity) ); + mea->setElementType( domTargetableFloat3::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 0, 1 ); + mea->setName( "time_step" ); + mea->setOffset( daeOffsetOf(domPhysics_scene::domTechnique_common,elemTime_step) ); + mea->setElementType( domTargetableFloat::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 1 ); + _Meta->setCMRoot( cm ); + + + _Meta->setElementSize(sizeof(domPhysics_scene::domTechnique_common)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domPhysics_scene::_Meta = NULL; +daeMetaElement * domPhysics_scene::domTechnique_common::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domPlane.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domPlane.cpp new file mode 100644 index 00000000..ecc3e11b --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domPlane.cpp @@ -0,0 +1,105 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domPlane::create(daeInt bytes) +{ + domPlaneRef ref = new(bytes) domPlane; + return ref; +} + + +daeMetaElement * +domPlane::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "plane" ); + _Meta->registerClass(domPlane::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "equation" ); + mea->setOffset( daeOffsetOf(domPlane,elemEquation) ); + mea->setElementType( domPlane::domEquation::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 1, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domPlane,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 1 ); + _Meta->setCMRoot( cm ); + + + _Meta->setElementSize(sizeof(domPlane)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domPlane::domEquation::create(daeInt bytes) +{ + domPlane::domEquationRef ref = new(bytes) domPlane::domEquation; + return ref; +} + + +daeMetaElement * +domPlane::domEquation::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "equation" ); + _Meta->registerClass(domPlane::domEquation::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Float4")); + ma->setOffset( daeOffsetOf( domPlane::domEquation , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domPlane::domEquation)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domPlane::_Meta = NULL; +daeMetaElement * domPlane::domEquation::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domPolygons.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domPolygons.cpp new file mode 100644 index 00000000..90967aee --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domPolygons.cpp @@ -0,0 +1,206 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domPolygons::create(daeInt bytes) +{ + domPolygonsRef ref = new(bytes) domPolygons; + return ref; +} + + +daeMetaElement * +domPolygons::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "polygons" ); + _Meta->registerClass(domPolygons::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 0, -1 ); + mea->setName( "input" ); + mea->setOffset( daeOffsetOf(domPolygons,elemInput_array) ); + mea->setElementType( domInputLocalOffset::registerElement() ); + cm->appendChild( mea ); + + cm = new daeMetaChoice( _Meta, cm, 1, 0, -1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "p" ); + mea->setOffset( daeOffsetOf(domPolygons,elemP_array) ); + mea->setElementType( domP::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "ph" ); + mea->setOffset( daeOffsetOf(domPolygons,elemPh_array) ); + mea->setElementType( domPolygons::domPh::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + cm->getParent()->appendChild( cm ); + cm = cm->getParent(); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 3002, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domPolygons,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 3002 ); + _Meta->setCMRoot( cm ); + // Ordered list of sub-elements + _Meta->addContents(daeOffsetOf(domPolygons,_contents)); + _Meta->addContentsOrder(daeOffsetOf(domPolygons,_contentsOrder)); + + + // Add attribute: name + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "name" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domPolygons , attrName )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: count + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "count" ); + ma->setType( daeAtomicType::get("Uint")); + ma->setOffset( daeOffsetOf( domPolygons , attrCount )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: material + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "material" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domPolygons , attrMaterial )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domPolygons)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domPolygons::domPh::create(daeInt bytes) +{ + domPolygons::domPhRef ref = new(bytes) domPolygons::domPh; + return ref; +} + + +daeMetaElement * +domPolygons::domPh::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "ph" ); + _Meta->registerClass(domPolygons::domPh::create, &_Meta); + + _Meta->setIsInnerClass( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "p" ); + mea->setOffset( daeOffsetOf(domPolygons::domPh,elemP) ); + mea->setElementType( domP::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 1, 1, -1 ); + mea->setName( "h" ); + mea->setOffset( daeOffsetOf(domPolygons::domPh,elemH_array) ); + mea->setElementType( domPolygons::domPh::domH::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 1 ); + _Meta->setCMRoot( cm ); + + + _Meta->setElementSize(sizeof(domPolygons::domPh)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domPolygons::domPh::domH::create(daeInt bytes) +{ + domPolygons::domPh::domHRef ref = new(bytes) domPolygons::domPh::domH; + return ref; +} + + +daeMetaElement * +domPolygons::domPh::domH::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "h" ); + _Meta->registerClass(domPolygons::domPh::domH::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("ListOfUInts")); + ma->setOffset( daeOffsetOf( domPolygons::domPh::domH , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domPolygons::domPh::domH)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domPolygons::_Meta = NULL; +daeMetaElement * domPolygons::domPh::_Meta = NULL; +daeMetaElement * domPolygons::domPh::domH::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domPolylist.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domPolylist.cpp new file mode 100644 index 00000000..1b7d0607 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domPolylist.cpp @@ -0,0 +1,151 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domPolylist::create(daeInt bytes) +{ + domPolylistRef ref = new(bytes) domPolylist; + return ref; +} + + +daeMetaElement * +domPolylist::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "polylist" ); + _Meta->registerClass(domPolylist::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 0, -1 ); + mea->setName( "input" ); + mea->setOffset( daeOffsetOf(domPolylist,elemInput_array) ); + mea->setElementType( domInputLocalOffset::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 0, 1 ); + mea->setName( "vcount" ); + mea->setOffset( daeOffsetOf(domPolylist,elemVcount) ); + mea->setElementType( domPolylist::domVcount::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 2, 0, 1 ); + mea->setName( "p" ); + mea->setOffset( daeOffsetOf(domPolylist,elemP) ); + mea->setElementType( domP::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 3, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domPolylist,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 3 ); + _Meta->setCMRoot( cm ); + + // Add attribute: name + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "name" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domPolylist , attrName )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: count + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "count" ); + ma->setType( daeAtomicType::get("Uint")); + ma->setOffset( daeOffsetOf( domPolylist , attrCount )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: material + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "material" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domPolylist , attrMaterial )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domPolylist)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domPolylist::domVcount::create(daeInt bytes) +{ + domPolylist::domVcountRef ref = new(bytes) domPolylist::domVcount; + return ref; +} + + +daeMetaElement * +domPolylist::domVcount::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "vcount" ); + _Meta->registerClass(domPolylist::domVcount::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("ListOfUInts")); + ma->setOffset( daeOffsetOf( domPolylist::domVcount , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domPolylist::domVcount)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domPolylist::_Meta = NULL; +daeMetaElement * domPolylist::domVcount::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domProfile_CG.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domProfile_CG.cpp new file mode 100644 index 00000000..ad5b980e --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domProfile_CG.cpp @@ -0,0 +1,723 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domProfile_CG::create(daeInt bytes) +{ + domProfile_CGRef ref = new(bytes) domProfile_CG; + return ref; +} + + +daeMetaElement * +domProfile_CG::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "profile_CG" ); + _Meta->registerClass(domProfile_CG::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 0, 1 ); + mea->setName( "asset" ); + mea->setOffset( daeOffsetOf(domProfile_CG,elemAsset) ); + mea->setElementType( domAsset::registerElement() ); + cm->appendChild( mea ); + + cm = new daeMetaChoice( _Meta, cm, 1, 0, -1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "code" ); + mea->setOffset( daeOffsetOf(domProfile_CG,elemCode_array) ); + mea->setElementType( domFx_code_profile::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "include" ); + mea->setOffset( daeOffsetOf(domProfile_CG,elemInclude_array) ); + mea->setElementType( domFx_include_common::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + cm->getParent()->appendChild( cm ); + cm = cm->getParent(); + + cm = new daeMetaChoice( _Meta, cm, 3002, 0, -1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "image" ); + mea->setOffset( daeOffsetOf(domProfile_CG,elemImage_array) ); + mea->setElementType( domImage::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "newparam" ); + mea->setOffset( daeOffsetOf(domProfile_CG,elemNewparam_array) ); + mea->setElementType( domCg_newparam::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + cm->getParent()->appendChild( cm ); + cm = cm->getParent(); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 6003, 1, -1 ); + mea->setName( "technique" ); + mea->setOffset( daeOffsetOf(domProfile_CG,elemTechnique_array) ); + mea->setElementType( domProfile_CG::domTechnique::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 6004, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domProfile_CG,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 6004 ); + _Meta->setCMRoot( cm ); + // Ordered list of sub-elements + _Meta->addContents(daeOffsetOf(domProfile_CG,_contents)); + _Meta->addContentsOrder(daeOffsetOf(domProfile_CG,_contentsOrder)); + + + // Add attribute: id + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "id" ); + ma->setType( daeAtomicType::get("xsID")); + ma->setOffset( daeOffsetOf( domProfile_CG , attrId )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: platform + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "platform" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domProfile_CG , attrPlatform )); + ma->setContainer( _Meta ); + ma->setDefault( "PC"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domProfile_CG)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domProfile_CG::domTechnique::create(daeInt bytes) +{ + domProfile_CG::domTechniqueRef ref = new(bytes) domProfile_CG::domTechnique; + return ref; +} + + +daeMetaElement * +domProfile_CG::domTechnique::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "technique" ); + _Meta->registerClass(domProfile_CG::domTechnique::create, &_Meta); + + _Meta->setIsInnerClass( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 0, 1 ); + mea->setName( "asset" ); + mea->setOffset( daeOffsetOf(domProfile_CG::domTechnique,elemAsset) ); + mea->setElementType( domAsset::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 1, 0, -1 ); + mea->setName( "annotate" ); + mea->setOffset( daeOffsetOf(domProfile_CG::domTechnique,elemAnnotate_array) ); + mea->setElementType( domFx_annotate_common::registerElement() ); + cm->appendChild( mea ); + + cm = new daeMetaChoice( _Meta, cm, 2, 0, -1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "code" ); + mea->setOffset( daeOffsetOf(domProfile_CG::domTechnique,elemCode_array) ); + mea->setElementType( domFx_code_profile::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "include" ); + mea->setOffset( daeOffsetOf(domProfile_CG::domTechnique,elemInclude_array) ); + mea->setElementType( domFx_include_common::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + cm->getParent()->appendChild( cm ); + cm = cm->getParent(); + + cm = new daeMetaChoice( _Meta, cm, 3003, 0, -1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "image" ); + mea->setOffset( daeOffsetOf(domProfile_CG::domTechnique,elemImage_array) ); + mea->setElementType( domImage::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "newparam" ); + mea->setOffset( daeOffsetOf(domProfile_CG::domTechnique,elemNewparam_array) ); + mea->setElementType( domCg_newparam::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "setparam" ); + mea->setOffset( daeOffsetOf(domProfile_CG::domTechnique,elemSetparam_array) ); + mea->setElementType( domCg_setparam::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + cm->getParent()->appendChild( cm ); + cm = cm->getParent(); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 6004, 1, -1 ); + mea->setName( "pass" ); + mea->setOffset( daeOffsetOf(domProfile_CG::domTechnique,elemPass_array) ); + mea->setElementType( domProfile_CG::domTechnique::domPass::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 6005, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domProfile_CG::domTechnique,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 6005 ); + _Meta->setCMRoot( cm ); + // Ordered list of sub-elements + _Meta->addContents(daeOffsetOf(domProfile_CG::domTechnique,_contents)); + _Meta->addContentsOrder(daeOffsetOf(domProfile_CG::domTechnique,_contentsOrder)); + + + // Add attribute: id + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "id" ); + ma->setType( daeAtomicType::get("xsID")); + ma->setOffset( daeOffsetOf( domProfile_CG::domTechnique , attrId )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: sid + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "sid" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domProfile_CG::domTechnique , attrSid )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domProfile_CG::domTechnique)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domProfile_CG::domTechnique::domPass::create(daeInt bytes) +{ + domProfile_CG::domTechnique::domPassRef ref = new(bytes) domProfile_CG::domTechnique::domPass; + return ref; +} + + +daeMetaElement * +domProfile_CG::domTechnique::domPass::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "pass" ); + _Meta->registerClass(domProfile_CG::domTechnique::domPass::create, &_Meta); + + _Meta->setIsInnerClass( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 0, -1 ); + mea->setName( "annotate" ); + mea->setOffset( daeOffsetOf(domProfile_CG::domTechnique::domPass,elemAnnotate_array) ); + mea->setElementType( domFx_annotate_common::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 1, 0, -1 ); + mea->setName( "color_target" ); + mea->setOffset( daeOffsetOf(domProfile_CG::domTechnique::domPass,elemColor_target_array) ); + mea->setElementType( domFx_colortarget_common::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 2, 0, -1 ); + mea->setName( "depth_target" ); + mea->setOffset( daeOffsetOf(domProfile_CG::domTechnique::domPass,elemDepth_target_array) ); + mea->setElementType( domFx_depthtarget_common::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 3, 0, -1 ); + mea->setName( "stencil_target" ); + mea->setOffset( daeOffsetOf(domProfile_CG::domTechnique::domPass,elemStencil_target_array) ); + mea->setElementType( domFx_stenciltarget_common::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 4, 0, -1 ); + mea->setName( "color_clear" ); + mea->setOffset( daeOffsetOf(domProfile_CG::domTechnique::domPass,elemColor_clear_array) ); + mea->setElementType( domFx_clearcolor_common::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 5, 0, -1 ); + mea->setName( "depth_clear" ); + mea->setOffset( daeOffsetOf(domProfile_CG::domTechnique::domPass,elemDepth_clear_array) ); + mea->setElementType( domFx_cleardepth_common::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 6, 0, -1 ); + mea->setName( "stencil_clear" ); + mea->setOffset( daeOffsetOf(domProfile_CG::domTechnique::domPass,elemStencil_clear_array) ); + mea->setElementType( domFx_clearstencil_common::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 7, 0, 1 ); + mea->setName( "draw" ); + mea->setOffset( daeOffsetOf(domProfile_CG::domTechnique::domPass,elemDraw) ); + mea->setElementType( domProfile_CG::domTechnique::domPass::domDraw::registerElement() ); + cm->appendChild( mea ); + + cm = new daeMetaChoice( _Meta, cm, 8, 1, -1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "gl_pipeline_settings" ); + mea->setOffset( daeOffsetOf(domProfile_CG::domTechnique::domPass,elemGl_pipeline_settings_array) ); + mea->setElementType( domGl_pipeline_settings::registerElement() ); + cm->appendChild( new daeMetaGroup( mea, _Meta, cm, 0, 1, 1 ) ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "shader" ); + mea->setOffset( daeOffsetOf(domProfile_CG::domTechnique::domPass,elemShader_array) ); + mea->setElementType( domProfile_CG::domTechnique::domPass::domShader::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + cm->getParent()->appendChild( cm ); + cm = cm->getParent(); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 3009, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domProfile_CG::domTechnique::domPass,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 3009 ); + _Meta->setCMRoot( cm ); + // Ordered list of sub-elements + _Meta->addContents(daeOffsetOf(domProfile_CG::domTechnique::domPass,_contents)); + _Meta->addContentsOrder(daeOffsetOf(domProfile_CG::domTechnique::domPass,_contentsOrder)); + + + // Add attribute: sid + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "sid" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domProfile_CG::domTechnique::domPass , attrSid )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domProfile_CG::domTechnique::domPass)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domProfile_CG::domTechnique::domPass::domDraw::create(daeInt bytes) +{ + domProfile_CG::domTechnique::domPass::domDrawRef ref = new(bytes) domProfile_CG::domTechnique::domPass::domDraw; + return ref; +} + + +daeMetaElement * +domProfile_CG::domTechnique::domPass::domDraw::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "draw" ); + _Meta->registerClass(domProfile_CG::domTechnique::domPass::domDraw::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Fx_draw_common")); + ma->setOffset( daeOffsetOf( domProfile_CG::domTechnique::domPass::domDraw , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domProfile_CG::domTechnique::domPass::domDraw)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domProfile_CG::domTechnique::domPass::domShader::create(daeInt bytes) +{ + domProfile_CG::domTechnique::domPass::domShaderRef ref = new(bytes) domProfile_CG::domTechnique::domPass::domShader; + return ref; +} + + +daeMetaElement * +domProfile_CG::domTechnique::domPass::domShader::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "shader" ); + _Meta->registerClass(domProfile_CG::domTechnique::domPass::domShader::create, &_Meta); + + _Meta->setIsInnerClass( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 0, -1 ); + mea->setName( "annotate" ); + mea->setOffset( daeOffsetOf(domProfile_CG::domTechnique::domPass::domShader,elemAnnotate_array) ); + mea->setElementType( domFx_annotate_common::registerElement() ); + cm->appendChild( mea ); + + cm = new daeMetaSequence( _Meta, cm, 1, 0, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "compiler_target" ); + mea->setOffset( daeOffsetOf(domProfile_CG::domTechnique::domPass::domShader,elemCompiler_target) ); + mea->setElementType( domProfile_CG::domTechnique::domPass::domShader::domCompiler_target::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 0, 1 ); + mea->setName( "compiler_options" ); + mea->setOffset( daeOffsetOf(domProfile_CG::domTechnique::domPass::domShader,elemCompiler_options) ); + mea->setElementType( domProfile_CG::domTechnique::domPass::domShader::domCompiler_options::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 1 ); + cm->getParent()->appendChild( cm ); + cm = cm->getParent(); + + mea = new daeMetaElementAttribute( _Meta, cm, 3, 1, 1 ); + mea->setName( "name" ); + mea->setOffset( daeOffsetOf(domProfile_CG::domTechnique::domPass::domShader,elemName) ); + mea->setElementType( domProfile_CG::domTechnique::domPass::domShader::domName::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 4, 0, -1 ); + mea->setName( "bind" ); + mea->setOffset( daeOffsetOf(domProfile_CG::domTechnique::domPass::domShader,elemBind_array) ); + mea->setElementType( domProfile_CG::domTechnique::domPass::domShader::domBind::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 4 ); + _Meta->setCMRoot( cm ); + + // Add attribute: stage + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "stage" ); + ma->setType( daeAtomicType::get("Cg_pipeline_stage")); + ma->setOffset( daeOffsetOf( domProfile_CG::domTechnique::domPass::domShader , attrStage )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domProfile_CG::domTechnique::domPass::domShader)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domProfile_CG::domTechnique::domPass::domShader::domCompiler_target::create(daeInt bytes) +{ + domProfile_CG::domTechnique::domPass::domShader::domCompiler_targetRef ref = new(bytes) domProfile_CG::domTechnique::domPass::domShader::domCompiler_target; + return ref; +} + + +daeMetaElement * +domProfile_CG::domTechnique::domPass::domShader::domCompiler_target::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "compiler_target" ); + _Meta->registerClass(domProfile_CG::domTechnique::domPass::domShader::domCompiler_target::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("xsNMTOKEN")); + ma->setOffset( daeOffsetOf( domProfile_CG::domTechnique::domPass::domShader::domCompiler_target , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domProfile_CG::domTechnique::domPass::domShader::domCompiler_target)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domProfile_CG::domTechnique::domPass::domShader::domCompiler_options::create(daeInt bytes) +{ + domProfile_CG::domTechnique::domPass::domShader::domCompiler_optionsRef ref = new(bytes) domProfile_CG::domTechnique::domPass::domShader::domCompiler_options; + return ref; +} + + +daeMetaElement * +domProfile_CG::domTechnique::domPass::domShader::domCompiler_options::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "compiler_options" ); + _Meta->registerClass(domProfile_CG::domTechnique::domPass::domShader::domCompiler_options::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("xsString")); + ma->setOffset( daeOffsetOf( domProfile_CG::domTechnique::domPass::domShader::domCompiler_options , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domProfile_CG::domTechnique::domPass::domShader::domCompiler_options)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domProfile_CG::domTechnique::domPass::domShader::domName::create(daeInt bytes) +{ + domProfile_CG::domTechnique::domPass::domShader::domNameRef ref = new(bytes) domProfile_CG::domTechnique::domPass::domShader::domName; + return ref; +} + + +daeMetaElement * +domProfile_CG::domTechnique::domPass::domShader::domName::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "name" ); + _Meta->registerClass(domProfile_CG::domTechnique::domPass::domShader::domName::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domProfile_CG::domTechnique::domPass::domShader::domName , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + // Add attribute: source + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "source" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domProfile_CG::domTechnique::domPass::domShader::domName , attrSource )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domProfile_CG::domTechnique::domPass::domShader::domName)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domProfile_CG::domTechnique::domPass::domShader::domBind::create(daeInt bytes) +{ + domProfile_CG::domTechnique::domPass::domShader::domBindRef ref = new(bytes) domProfile_CG::domTechnique::domPass::domShader::domBind; + return ref; +} + + +daeMetaElement * +domProfile_CG::domTechnique::domPass::domShader::domBind::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "bind" ); + _Meta->registerClass(domProfile_CG::domTechnique::domPass::domShader::domBind::create, &_Meta); + + _Meta->setIsInnerClass( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaChoice( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "cg_param_type" ); + mea->setOffset( daeOffsetOf(domProfile_CG::domTechnique::domPass::domShader::domBind,elemCg_param_type) ); + mea->setElementType( domCg_param_type::registerElement() ); + cm->appendChild( new daeMetaGroup( mea, _Meta, cm, 0, 1, 1 ) ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "param" ); + mea->setOffset( daeOffsetOf(domProfile_CG::domTechnique::domPass::domShader::domBind,elemParam) ); + mea->setElementType( domProfile_CG::domTechnique::domPass::domShader::domBind::domParam::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + _Meta->setCMRoot( cm ); + // Ordered list of sub-elements + _Meta->addContents(daeOffsetOf(domProfile_CG::domTechnique::domPass::domShader::domBind,_contents)); + _Meta->addContentsOrder(daeOffsetOf(domProfile_CG::domTechnique::domPass::domShader::domBind,_contentsOrder)); + + + // Add attribute: symbol + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "symbol" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domProfile_CG::domTechnique::domPass::domShader::domBind , attrSymbol )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domProfile_CG::domTechnique::domPass::domShader::domBind)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domProfile_CG::domTechnique::domPass::domShader::domBind::domParam::create(daeInt bytes) +{ + domProfile_CG::domTechnique::domPass::domShader::domBind::domParamRef ref = new(bytes) domProfile_CG::domTechnique::domPass::domShader::domBind::domParam; + return ref; +} + + +daeMetaElement * +domProfile_CG::domTechnique::domPass::domShader::domBind::domParam::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "param" ); + _Meta->registerClass(domProfile_CG::domTechnique::domPass::domShader::domBind::domParam::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: ref + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "ref" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domProfile_CG::domTechnique::domPass::domShader::domBind::domParam , attrRef )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domProfile_CG::domTechnique::domPass::domShader::domBind::domParam)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domProfile_CG::_Meta = NULL; +daeMetaElement * domProfile_CG::domTechnique::_Meta = NULL; +daeMetaElement * domProfile_CG::domTechnique::domPass::_Meta = NULL; +daeMetaElement * domProfile_CG::domTechnique::domPass::domDraw::_Meta = NULL; +daeMetaElement * domProfile_CG::domTechnique::domPass::domShader::_Meta = NULL; +daeMetaElement * domProfile_CG::domTechnique::domPass::domShader::domCompiler_target::_Meta = NULL; +daeMetaElement * domProfile_CG::domTechnique::domPass::domShader::domCompiler_options::_Meta = NULL; +daeMetaElement * domProfile_CG::domTechnique::domPass::domShader::domName::_Meta = NULL; +daeMetaElement * domProfile_CG::domTechnique::domPass::domShader::domBind::_Meta = NULL; +daeMetaElement * domProfile_CG::domTechnique::domPass::domShader::domBind::domParam::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domProfile_COMMON.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domProfile_COMMON.cpp new file mode 100644 index 00000000..6ade9562 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domProfile_COMMON.cpp @@ -0,0 +1,565 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domProfile_COMMON::create(daeInt bytes) +{ + domProfile_COMMONRef ref = new(bytes) domProfile_COMMON; + return ref; +} + + +daeMetaElement * +domProfile_COMMON::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "profile_COMMON" ); + _Meta->registerClass(domProfile_COMMON::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 0, 1 ); + mea->setName( "asset" ); + mea->setOffset( daeOffsetOf(domProfile_COMMON,elemAsset) ); + mea->setElementType( domAsset::registerElement() ); + cm->appendChild( mea ); + + cm = new daeMetaChoice( _Meta, cm, 1, 0, -1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "image" ); + mea->setOffset( daeOffsetOf(domProfile_COMMON,elemImage_array) ); + mea->setElementType( domImage::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "newparam" ); + mea->setOffset( daeOffsetOf(domProfile_COMMON,elemNewparam_array) ); + mea->setElementType( domCommon_newparam_type::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + cm->getParent()->appendChild( cm ); + cm = cm->getParent(); + + mea = new daeMetaElementAttribute( _Meta, cm, 3002, 1, 1 ); + mea->setName( "technique" ); + mea->setOffset( daeOffsetOf(domProfile_COMMON,elemTechnique) ); + mea->setElementType( domProfile_COMMON::domTechnique::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 3003, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domProfile_COMMON,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 3003 ); + _Meta->setCMRoot( cm ); + // Ordered list of sub-elements + _Meta->addContents(daeOffsetOf(domProfile_COMMON,_contents)); + _Meta->addContentsOrder(daeOffsetOf(domProfile_COMMON,_contentsOrder)); + + + // Add attribute: id + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "id" ); + ma->setType( daeAtomicType::get("xsID")); + ma->setOffset( daeOffsetOf( domProfile_COMMON , attrId )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domProfile_COMMON)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domProfile_COMMON::domTechnique::create(daeInt bytes) +{ + domProfile_COMMON::domTechniqueRef ref = new(bytes) domProfile_COMMON::domTechnique; + return ref; +} + + +daeMetaElement * +domProfile_COMMON::domTechnique::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "technique" ); + _Meta->registerClass(domProfile_COMMON::domTechnique::create, &_Meta); + + _Meta->setIsInnerClass( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 0, 1 ); + mea->setName( "asset" ); + mea->setOffset( daeOffsetOf(domProfile_COMMON::domTechnique,elemAsset) ); + mea->setElementType( domAsset::registerElement() ); + cm->appendChild( mea ); + + cm = new daeMetaChoice( _Meta, cm, 1, 0, -1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "image" ); + mea->setOffset( daeOffsetOf(domProfile_COMMON::domTechnique,elemImage_array) ); + mea->setElementType( domImage::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "newparam" ); + mea->setOffset( daeOffsetOf(domProfile_COMMON::domTechnique,elemNewparam_array) ); + mea->setElementType( domCommon_newparam_type::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + cm->getParent()->appendChild( cm ); + cm = cm->getParent(); + + cm = new daeMetaChoice( _Meta, cm, 3002, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "constant" ); + mea->setOffset( daeOffsetOf(domProfile_COMMON::domTechnique,elemConstant) ); + mea->setElementType( domProfile_COMMON::domTechnique::domConstant::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "lambert" ); + mea->setOffset( daeOffsetOf(domProfile_COMMON::domTechnique,elemLambert) ); + mea->setElementType( domProfile_COMMON::domTechnique::domLambert::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "phong" ); + mea->setOffset( daeOffsetOf(domProfile_COMMON::domTechnique,elemPhong) ); + mea->setElementType( domProfile_COMMON::domTechnique::domPhong::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "blinn" ); + mea->setOffset( daeOffsetOf(domProfile_COMMON::domTechnique,elemBlinn) ); + mea->setElementType( domProfile_COMMON::domTechnique::domBlinn::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + cm->getParent()->appendChild( cm ); + cm = cm->getParent(); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 3003, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domProfile_COMMON::domTechnique,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 3003 ); + _Meta->setCMRoot( cm ); + // Ordered list of sub-elements + _Meta->addContents(daeOffsetOf(domProfile_COMMON::domTechnique,_contents)); + _Meta->addContentsOrder(daeOffsetOf(domProfile_COMMON::domTechnique,_contentsOrder)); + + + // Add attribute: id + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "id" ); + ma->setType( daeAtomicType::get("xsID")); + ma->setOffset( daeOffsetOf( domProfile_COMMON::domTechnique , attrId )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: sid + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "sid" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domProfile_COMMON::domTechnique , attrSid )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domProfile_COMMON::domTechnique)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domProfile_COMMON::domTechnique::domConstant::create(daeInt bytes) +{ + domProfile_COMMON::domTechnique::domConstantRef ref = new(bytes) domProfile_COMMON::domTechnique::domConstant; + return ref; +} + + +daeMetaElement * +domProfile_COMMON::domTechnique::domConstant::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "constant" ); + _Meta->registerClass(domProfile_COMMON::domTechnique::domConstant::create, &_Meta); + + _Meta->setIsInnerClass( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 0, 1 ); + mea->setName( "emission" ); + mea->setOffset( daeOffsetOf(domProfile_COMMON::domTechnique::domConstant,elemEmission) ); + mea->setElementType( domCommon_color_or_texture_type::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 0, 1 ); + mea->setName( "reflective" ); + mea->setOffset( daeOffsetOf(domProfile_COMMON::domTechnique::domConstant,elemReflective) ); + mea->setElementType( domCommon_color_or_texture_type::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 2, 0, 1 ); + mea->setName( "reflectivity" ); + mea->setOffset( daeOffsetOf(domProfile_COMMON::domTechnique::domConstant,elemReflectivity) ); + mea->setElementType( domCommon_float_or_param_type::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 3, 0, 1 ); + mea->setName( "transparent" ); + mea->setOffset( daeOffsetOf(domProfile_COMMON::domTechnique::domConstant,elemTransparent) ); + mea->setElementType( domCommon_transparent_type::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 4, 0, 1 ); + mea->setName( "transparency" ); + mea->setOffset( daeOffsetOf(domProfile_COMMON::domTechnique::domConstant,elemTransparency) ); + mea->setElementType( domCommon_float_or_param_type::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 5, 0, 1 ); + mea->setName( "index_of_refraction" ); + mea->setOffset( daeOffsetOf(domProfile_COMMON::domTechnique::domConstant,elemIndex_of_refraction) ); + mea->setElementType( domCommon_float_or_param_type::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 5 ); + _Meta->setCMRoot( cm ); + + + _Meta->setElementSize(sizeof(domProfile_COMMON::domTechnique::domConstant)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domProfile_COMMON::domTechnique::domLambert::create(daeInt bytes) +{ + domProfile_COMMON::domTechnique::domLambertRef ref = new(bytes) domProfile_COMMON::domTechnique::domLambert; + return ref; +} + + +daeMetaElement * +domProfile_COMMON::domTechnique::domLambert::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "lambert" ); + _Meta->registerClass(domProfile_COMMON::domTechnique::domLambert::create, &_Meta); + + _Meta->setIsInnerClass( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 0, 1 ); + mea->setName( "emission" ); + mea->setOffset( daeOffsetOf(domProfile_COMMON::domTechnique::domLambert,elemEmission) ); + mea->setElementType( domCommon_color_or_texture_type::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 0, 1 ); + mea->setName( "ambient" ); + mea->setOffset( daeOffsetOf(domProfile_COMMON::domTechnique::domLambert,elemAmbient) ); + mea->setElementType( domCommon_color_or_texture_type::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 2, 0, 1 ); + mea->setName( "diffuse" ); + mea->setOffset( daeOffsetOf(domProfile_COMMON::domTechnique::domLambert,elemDiffuse) ); + mea->setElementType( domCommon_color_or_texture_type::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 3, 0, 1 ); + mea->setName( "reflective" ); + mea->setOffset( daeOffsetOf(domProfile_COMMON::domTechnique::domLambert,elemReflective) ); + mea->setElementType( domCommon_color_or_texture_type::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 4, 0, 1 ); + mea->setName( "reflectivity" ); + mea->setOffset( daeOffsetOf(domProfile_COMMON::domTechnique::domLambert,elemReflectivity) ); + mea->setElementType( domCommon_float_or_param_type::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 5, 0, 1 ); + mea->setName( "transparent" ); + mea->setOffset( daeOffsetOf(domProfile_COMMON::domTechnique::domLambert,elemTransparent) ); + mea->setElementType( domCommon_transparent_type::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 6, 0, 1 ); + mea->setName( "transparency" ); + mea->setOffset( daeOffsetOf(domProfile_COMMON::domTechnique::domLambert,elemTransparency) ); + mea->setElementType( domCommon_float_or_param_type::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 7, 0, 1 ); + mea->setName( "index_of_refraction" ); + mea->setOffset( daeOffsetOf(domProfile_COMMON::domTechnique::domLambert,elemIndex_of_refraction) ); + mea->setElementType( domCommon_float_or_param_type::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 7 ); + _Meta->setCMRoot( cm ); + + + _Meta->setElementSize(sizeof(domProfile_COMMON::domTechnique::domLambert)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domProfile_COMMON::domTechnique::domPhong::create(daeInt bytes) +{ + domProfile_COMMON::domTechnique::domPhongRef ref = new(bytes) domProfile_COMMON::domTechnique::domPhong; + return ref; +} + + +daeMetaElement * +domProfile_COMMON::domTechnique::domPhong::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "phong" ); + _Meta->registerClass(domProfile_COMMON::domTechnique::domPhong::create, &_Meta); + + _Meta->setIsInnerClass( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 0, 1 ); + mea->setName( "emission" ); + mea->setOffset( daeOffsetOf(domProfile_COMMON::domTechnique::domPhong,elemEmission) ); + mea->setElementType( domCommon_color_or_texture_type::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 0, 1 ); + mea->setName( "ambient" ); + mea->setOffset( daeOffsetOf(domProfile_COMMON::domTechnique::domPhong,elemAmbient) ); + mea->setElementType( domCommon_color_or_texture_type::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 2, 0, 1 ); + mea->setName( "diffuse" ); + mea->setOffset( daeOffsetOf(domProfile_COMMON::domTechnique::domPhong,elemDiffuse) ); + mea->setElementType( domCommon_color_or_texture_type::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 3, 0, 1 ); + mea->setName( "specular" ); + mea->setOffset( daeOffsetOf(domProfile_COMMON::domTechnique::domPhong,elemSpecular) ); + mea->setElementType( domCommon_color_or_texture_type::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 4, 0, 1 ); + mea->setName( "shininess" ); + mea->setOffset( daeOffsetOf(domProfile_COMMON::domTechnique::domPhong,elemShininess) ); + mea->setElementType( domCommon_float_or_param_type::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 5, 0, 1 ); + mea->setName( "reflective" ); + mea->setOffset( daeOffsetOf(domProfile_COMMON::domTechnique::domPhong,elemReflective) ); + mea->setElementType( domCommon_color_or_texture_type::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 6, 0, 1 ); + mea->setName( "reflectivity" ); + mea->setOffset( daeOffsetOf(domProfile_COMMON::domTechnique::domPhong,elemReflectivity) ); + mea->setElementType( domCommon_float_or_param_type::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 7, 0, 1 ); + mea->setName( "transparent" ); + mea->setOffset( daeOffsetOf(domProfile_COMMON::domTechnique::domPhong,elemTransparent) ); + mea->setElementType( domCommon_transparent_type::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 8, 0, 1 ); + mea->setName( "transparency" ); + mea->setOffset( daeOffsetOf(domProfile_COMMON::domTechnique::domPhong,elemTransparency) ); + mea->setElementType( domCommon_float_or_param_type::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 9, 0, 1 ); + mea->setName( "index_of_refraction" ); + mea->setOffset( daeOffsetOf(domProfile_COMMON::domTechnique::domPhong,elemIndex_of_refraction) ); + mea->setElementType( domCommon_float_or_param_type::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 9 ); + _Meta->setCMRoot( cm ); + + + _Meta->setElementSize(sizeof(domProfile_COMMON::domTechnique::domPhong)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domProfile_COMMON::domTechnique::domBlinn::create(daeInt bytes) +{ + domProfile_COMMON::domTechnique::domBlinnRef ref = new(bytes) domProfile_COMMON::domTechnique::domBlinn; + return ref; +} + + +daeMetaElement * +domProfile_COMMON::domTechnique::domBlinn::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "blinn" ); + _Meta->registerClass(domProfile_COMMON::domTechnique::domBlinn::create, &_Meta); + + _Meta->setIsInnerClass( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 0, 1 ); + mea->setName( "emission" ); + mea->setOffset( daeOffsetOf(domProfile_COMMON::domTechnique::domBlinn,elemEmission) ); + mea->setElementType( domCommon_color_or_texture_type::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 0, 1 ); + mea->setName( "ambient" ); + mea->setOffset( daeOffsetOf(domProfile_COMMON::domTechnique::domBlinn,elemAmbient) ); + mea->setElementType( domCommon_color_or_texture_type::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 2, 0, 1 ); + mea->setName( "diffuse" ); + mea->setOffset( daeOffsetOf(domProfile_COMMON::domTechnique::domBlinn,elemDiffuse) ); + mea->setElementType( domCommon_color_or_texture_type::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 3, 0, 1 ); + mea->setName( "specular" ); + mea->setOffset( daeOffsetOf(domProfile_COMMON::domTechnique::domBlinn,elemSpecular) ); + mea->setElementType( domCommon_color_or_texture_type::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 4, 0, 1 ); + mea->setName( "shininess" ); + mea->setOffset( daeOffsetOf(domProfile_COMMON::domTechnique::domBlinn,elemShininess) ); + mea->setElementType( domCommon_float_or_param_type::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 5, 0, 1 ); + mea->setName( "reflective" ); + mea->setOffset( daeOffsetOf(domProfile_COMMON::domTechnique::domBlinn,elemReflective) ); + mea->setElementType( domCommon_color_or_texture_type::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 6, 0, 1 ); + mea->setName( "reflectivity" ); + mea->setOffset( daeOffsetOf(domProfile_COMMON::domTechnique::domBlinn,elemReflectivity) ); + mea->setElementType( domCommon_float_or_param_type::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 7, 0, 1 ); + mea->setName( "transparent" ); + mea->setOffset( daeOffsetOf(domProfile_COMMON::domTechnique::domBlinn,elemTransparent) ); + mea->setElementType( domCommon_transparent_type::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 8, 0, 1 ); + mea->setName( "transparency" ); + mea->setOffset( daeOffsetOf(domProfile_COMMON::domTechnique::domBlinn,elemTransparency) ); + mea->setElementType( domCommon_float_or_param_type::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 9, 0, 1 ); + mea->setName( "index_of_refraction" ); + mea->setOffset( daeOffsetOf(domProfile_COMMON::domTechnique::domBlinn,elemIndex_of_refraction) ); + mea->setElementType( domCommon_float_or_param_type::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 9 ); + _Meta->setCMRoot( cm ); + + + _Meta->setElementSize(sizeof(domProfile_COMMON::domTechnique::domBlinn)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domProfile_COMMON::_Meta = NULL; +daeMetaElement * domProfile_COMMON::domTechnique::_Meta = NULL; +daeMetaElement * domProfile_COMMON::domTechnique::domConstant::_Meta = NULL; +daeMetaElement * domProfile_COMMON::domTechnique::domLambert::_Meta = NULL; +daeMetaElement * domProfile_COMMON::domTechnique::domPhong::_Meta = NULL; +daeMetaElement * domProfile_COMMON::domTechnique::domBlinn::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domProfile_GLES.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domProfile_GLES.cpp new file mode 100644 index 00000000..e8e01a06 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domProfile_GLES.cpp @@ -0,0 +1,654 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domProfile_GLES::create(daeInt bytes) +{ + domProfile_GLESRef ref = new(bytes) domProfile_GLES; + return ref; +} + + +daeMetaElement * +domProfile_GLES::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "profile_GLES" ); + _Meta->registerClass(domProfile_GLES::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 0, 1 ); + mea->setName( "asset" ); + mea->setOffset( daeOffsetOf(domProfile_GLES,elemAsset) ); + mea->setElementType( domAsset::registerElement() ); + cm->appendChild( mea ); + + cm = new daeMetaChoice( _Meta, cm, 1, 0, -1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "image" ); + mea->setOffset( daeOffsetOf(domProfile_GLES,elemImage_array) ); + mea->setElementType( domImage::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "newparam" ); + mea->setOffset( daeOffsetOf(domProfile_GLES,elemNewparam_array) ); + mea->setElementType( domGles_newparam::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + cm->getParent()->appendChild( cm ); + cm = cm->getParent(); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 3002, 1, -1 ); + mea->setName( "technique" ); + mea->setOffset( daeOffsetOf(domProfile_GLES,elemTechnique_array) ); + mea->setElementType( domProfile_GLES::domTechnique::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 3003, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domProfile_GLES,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 3003 ); + _Meta->setCMRoot( cm ); + // Ordered list of sub-elements + _Meta->addContents(daeOffsetOf(domProfile_GLES,_contents)); + _Meta->addContentsOrder(daeOffsetOf(domProfile_GLES,_contentsOrder)); + + + // Add attribute: id + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "id" ); + ma->setType( daeAtomicType::get("xsID")); + ma->setOffset( daeOffsetOf( domProfile_GLES , attrId )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: platform + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "platform" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domProfile_GLES , attrPlatform )); + ma->setContainer( _Meta ); + ma->setDefault( "PC"); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domProfile_GLES)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domProfile_GLES::domTechnique::create(daeInt bytes) +{ + domProfile_GLES::domTechniqueRef ref = new(bytes) domProfile_GLES::domTechnique; + return ref; +} + + +daeMetaElement * +domProfile_GLES::domTechnique::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "technique" ); + _Meta->registerClass(domProfile_GLES::domTechnique::create, &_Meta); + + _Meta->setIsInnerClass( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 0, 1 ); + mea->setName( "asset" ); + mea->setOffset( daeOffsetOf(domProfile_GLES::domTechnique,elemAsset) ); + mea->setElementType( domAsset::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 1, 0, -1 ); + mea->setName( "annotate" ); + mea->setOffset( daeOffsetOf(domProfile_GLES::domTechnique,elemAnnotate_array) ); + mea->setElementType( domFx_annotate_common::registerElement() ); + cm->appendChild( mea ); + + cm = new daeMetaChoice( _Meta, cm, 2, 0, -1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "image" ); + mea->setOffset( daeOffsetOf(domProfile_GLES::domTechnique,elemImage_array) ); + mea->setElementType( domImage::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "newparam" ); + mea->setOffset( daeOffsetOf(domProfile_GLES::domTechnique,elemNewparam_array) ); + mea->setElementType( domGles_newparam::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "setparam" ); + mea->setOffset( daeOffsetOf(domProfile_GLES::domTechnique,elemSetparam_array) ); + mea->setElementType( domProfile_GLES::domTechnique::domSetparam::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + cm->getParent()->appendChild( cm ); + cm = cm->getParent(); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 3003, 1, -1 ); + mea->setName( "pass" ); + mea->setOffset( daeOffsetOf(domProfile_GLES::domTechnique,elemPass_array) ); + mea->setElementType( domProfile_GLES::domTechnique::domPass::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 3004, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domProfile_GLES::domTechnique,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 3004 ); + _Meta->setCMRoot( cm ); + // Ordered list of sub-elements + _Meta->addContents(daeOffsetOf(domProfile_GLES::domTechnique,_contents)); + _Meta->addContentsOrder(daeOffsetOf(domProfile_GLES::domTechnique,_contentsOrder)); + + + // Add attribute: id + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "id" ); + ma->setType( daeAtomicType::get("xsID")); + ma->setOffset( daeOffsetOf( domProfile_GLES::domTechnique , attrId )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: sid + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "sid" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domProfile_GLES::domTechnique , attrSid )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domProfile_GLES::domTechnique)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domProfile_GLES::domTechnique::domSetparam::create(daeInt bytes) +{ + domProfile_GLES::domTechnique::domSetparamRef ref = new(bytes) domProfile_GLES::domTechnique::domSetparam; + return ref; +} + + +daeMetaElement * +domProfile_GLES::domTechnique::domSetparam::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "setparam" ); + _Meta->registerClass(domProfile_GLES::domTechnique::domSetparam::create, &_Meta); + + _Meta->setIsInnerClass( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 0, -1 ); + mea->setName( "annotate" ); + mea->setOffset( daeOffsetOf(domProfile_GLES::domTechnique::domSetparam,elemAnnotate_array) ); + mea->setElementType( domFx_annotate_common::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 1, 1 ); + mea->setName( "gles_basic_type_common" ); + mea->setOffset( daeOffsetOf(domProfile_GLES::domTechnique::domSetparam,elemGles_basic_type_common) ); + mea->setElementType( domGles_basic_type_common::registerElement() ); + cm->appendChild( new daeMetaGroup( mea, _Meta, cm, 1, 1, 1 ) ); + + cm->setMaxOrdinal( 1 ); + _Meta->setCMRoot( cm ); + + // Add attribute: ref + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "ref" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domProfile_GLES::domTechnique::domSetparam , attrRef )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domProfile_GLES::domTechnique::domSetparam)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domProfile_GLES::domTechnique::domPass::create(daeInt bytes) +{ + domProfile_GLES::domTechnique::domPassRef ref = new(bytes) domProfile_GLES::domTechnique::domPass; + return ref; +} + + +daeMetaElement * +domProfile_GLES::domTechnique::domPass::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "pass" ); + _Meta->registerClass(domProfile_GLES::domTechnique::domPass::create, &_Meta); + + _Meta->setIsInnerClass( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 0, -1 ); + mea->setName( "annotate" ); + mea->setOffset( daeOffsetOf(domProfile_GLES::domTechnique::domPass,elemAnnotate_array) ); + mea->setElementType( domFx_annotate_common::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 0, 1 ); + mea->setName( "color_target" ); + mea->setOffset( daeOffsetOf(domProfile_GLES::domTechnique::domPass,elemColor_target) ); + mea->setElementType( domProfile_GLES::domTechnique::domPass::domColor_target::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 2, 0, 1 ); + mea->setName( "depth_target" ); + mea->setOffset( daeOffsetOf(domProfile_GLES::domTechnique::domPass,elemDepth_target) ); + mea->setElementType( domProfile_GLES::domTechnique::domPass::domDepth_target::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 3, 0, 1 ); + mea->setName( "stencil_target" ); + mea->setOffset( daeOffsetOf(domProfile_GLES::domTechnique::domPass,elemStencil_target) ); + mea->setElementType( domProfile_GLES::domTechnique::domPass::domStencil_target::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 4, 0, 1 ); + mea->setName( "color_clear" ); + mea->setOffset( daeOffsetOf(domProfile_GLES::domTechnique::domPass,elemColor_clear) ); + mea->setElementType( domProfile_GLES::domTechnique::domPass::domColor_clear::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 5, 0, 1 ); + mea->setName( "depth_clear" ); + mea->setOffset( daeOffsetOf(domProfile_GLES::domTechnique::domPass,elemDepth_clear) ); + mea->setElementType( domProfile_GLES::domTechnique::domPass::domDepth_clear::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 6, 0, 1 ); + mea->setName( "stencil_clear" ); + mea->setOffset( daeOffsetOf(domProfile_GLES::domTechnique::domPass,elemStencil_clear) ); + mea->setElementType( domProfile_GLES::domTechnique::domPass::domStencil_clear::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 7, 0, 1 ); + mea->setName( "draw" ); + mea->setOffset( daeOffsetOf(domProfile_GLES::domTechnique::domPass,elemDraw) ); + mea->setElementType( domProfile_GLES::domTechnique::domPass::domDraw::registerElement() ); + cm->appendChild( mea ); + + cm = new daeMetaChoice( _Meta, cm, 8, 0, -1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "gles_pipeline_settings" ); + mea->setOffset( daeOffsetOf(domProfile_GLES::domTechnique::domPass,elemGles_pipeline_settings_array) ); + mea->setElementType( domGles_pipeline_settings::registerElement() ); + cm->appendChild( new daeMetaGroup( mea, _Meta, cm, 0, 1, 1 ) ); + + cm->setMaxOrdinal( 0 ); + cm->getParent()->appendChild( cm ); + cm = cm->getParent(); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 3009, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domProfile_GLES::domTechnique::domPass,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 3009 ); + _Meta->setCMRoot( cm ); + // Ordered list of sub-elements + _Meta->addContents(daeOffsetOf(domProfile_GLES::domTechnique::domPass,_contents)); + _Meta->addContentsOrder(daeOffsetOf(domProfile_GLES::domTechnique::domPass,_contentsOrder)); + + + // Add attribute: sid + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "sid" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domProfile_GLES::domTechnique::domPass , attrSid )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domProfile_GLES::domTechnique::domPass)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domProfile_GLES::domTechnique::domPass::domColor_target::create(daeInt bytes) +{ + domProfile_GLES::domTechnique::domPass::domColor_targetRef ref = new(bytes) domProfile_GLES::domTechnique::domPass::domColor_target; + return ref; +} + + +daeMetaElement * +domProfile_GLES::domTechnique::domPass::domColor_target::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "color_target" ); + _Meta->registerClass(domProfile_GLES::domTechnique::domPass::domColor_target::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Gles_rendertarget_common")); + ma->setOffset( daeOffsetOf( domProfile_GLES::domTechnique::domPass::domColor_target , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domProfile_GLES::domTechnique::domPass::domColor_target)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domProfile_GLES::domTechnique::domPass::domDepth_target::create(daeInt bytes) +{ + domProfile_GLES::domTechnique::domPass::domDepth_targetRef ref = new(bytes) domProfile_GLES::domTechnique::domPass::domDepth_target; + return ref; +} + + +daeMetaElement * +domProfile_GLES::domTechnique::domPass::domDepth_target::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "depth_target" ); + _Meta->registerClass(domProfile_GLES::domTechnique::domPass::domDepth_target::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Gles_rendertarget_common")); + ma->setOffset( daeOffsetOf( domProfile_GLES::domTechnique::domPass::domDepth_target , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domProfile_GLES::domTechnique::domPass::domDepth_target)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domProfile_GLES::domTechnique::domPass::domStencil_target::create(daeInt bytes) +{ + domProfile_GLES::domTechnique::domPass::domStencil_targetRef ref = new(bytes) domProfile_GLES::domTechnique::domPass::domStencil_target; + return ref; +} + + +daeMetaElement * +domProfile_GLES::domTechnique::domPass::domStencil_target::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "stencil_target" ); + _Meta->registerClass(domProfile_GLES::domTechnique::domPass::domStencil_target::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Gles_rendertarget_common")); + ma->setOffset( daeOffsetOf( domProfile_GLES::domTechnique::domPass::domStencil_target , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domProfile_GLES::domTechnique::domPass::domStencil_target)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domProfile_GLES::domTechnique::domPass::domColor_clear::create(daeInt bytes) +{ + domProfile_GLES::domTechnique::domPass::domColor_clearRef ref = new(bytes) domProfile_GLES::domTechnique::domPass::domColor_clear; + return ref; +} + + +daeMetaElement * +domProfile_GLES::domTechnique::domPass::domColor_clear::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "color_clear" ); + _Meta->registerClass(domProfile_GLES::domTechnique::domPass::domColor_clear::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Fx_color_common")); + ma->setOffset( daeOffsetOf( domProfile_GLES::domTechnique::domPass::domColor_clear , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domProfile_GLES::domTechnique::domPass::domColor_clear)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domProfile_GLES::domTechnique::domPass::domDepth_clear::create(daeInt bytes) +{ + domProfile_GLES::domTechnique::domPass::domDepth_clearRef ref = new(bytes) domProfile_GLES::domTechnique::domPass::domDepth_clear; + return ref; +} + + +daeMetaElement * +domProfile_GLES::domTechnique::domPass::domDepth_clear::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "depth_clear" ); + _Meta->registerClass(domProfile_GLES::domTechnique::domPass::domDepth_clear::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Float")); + ma->setOffset( daeOffsetOf( domProfile_GLES::domTechnique::domPass::domDepth_clear , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domProfile_GLES::domTechnique::domPass::domDepth_clear)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domProfile_GLES::domTechnique::domPass::domStencil_clear::create(daeInt bytes) +{ + domProfile_GLES::domTechnique::domPass::domStencil_clearRef ref = new(bytes) domProfile_GLES::domTechnique::domPass::domStencil_clear; + return ref; +} + + +daeMetaElement * +domProfile_GLES::domTechnique::domPass::domStencil_clear::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "stencil_clear" ); + _Meta->registerClass(domProfile_GLES::domTechnique::domPass::domStencil_clear::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("xsByte")); + ma->setOffset( daeOffsetOf( domProfile_GLES::domTechnique::domPass::domStencil_clear , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domProfile_GLES::domTechnique::domPass::domStencil_clear)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domProfile_GLES::domTechnique::domPass::domDraw::create(daeInt bytes) +{ + domProfile_GLES::domTechnique::domPass::domDrawRef ref = new(bytes) domProfile_GLES::domTechnique::domPass::domDraw; + return ref; +} + + +daeMetaElement * +domProfile_GLES::domTechnique::domPass::domDraw::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "draw" ); + _Meta->registerClass(domProfile_GLES::domTechnique::domPass::domDraw::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Fx_draw_common")); + ma->setOffset( daeOffsetOf( domProfile_GLES::domTechnique::domPass::domDraw , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domProfile_GLES::domTechnique::domPass::domDraw)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domProfile_GLES::_Meta = NULL; +daeMetaElement * domProfile_GLES::domTechnique::_Meta = NULL; +daeMetaElement * domProfile_GLES::domTechnique::domSetparam::_Meta = NULL; +daeMetaElement * domProfile_GLES::domTechnique::domPass::_Meta = NULL; +daeMetaElement * domProfile_GLES::domTechnique::domPass::domColor_target::_Meta = NULL; +daeMetaElement * domProfile_GLES::domTechnique::domPass::domDepth_target::_Meta = NULL; +daeMetaElement * domProfile_GLES::domTechnique::domPass::domStencil_target::_Meta = NULL; +daeMetaElement * domProfile_GLES::domTechnique::domPass::domColor_clear::_Meta = NULL; +daeMetaElement * domProfile_GLES::domTechnique::domPass::domDepth_clear::_Meta = NULL; +daeMetaElement * domProfile_GLES::domTechnique::domPass::domStencil_clear::_Meta = NULL; +daeMetaElement * domProfile_GLES::domTechnique::domPass::domDraw::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domProfile_GLSL.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domProfile_GLSL.cpp new file mode 100644 index 00000000..94bed2e3 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domProfile_GLSL.cpp @@ -0,0 +1,704 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domProfile_GLSL::create(daeInt bytes) +{ + domProfile_GLSLRef ref = new(bytes) domProfile_GLSL; + return ref; +} + + +daeMetaElement * +domProfile_GLSL::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "profile_GLSL" ); + _Meta->registerClass(domProfile_GLSL::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 0, 1 ); + mea->setName( "asset" ); + mea->setOffset( daeOffsetOf(domProfile_GLSL,elemAsset) ); + mea->setElementType( domAsset::registerElement() ); + cm->appendChild( mea ); + + cm = new daeMetaChoice( _Meta, cm, 1, 0, -1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "code" ); + mea->setOffset( daeOffsetOf(domProfile_GLSL,elemCode_array) ); + mea->setElementType( domFx_code_profile::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "include" ); + mea->setOffset( daeOffsetOf(domProfile_GLSL,elemInclude_array) ); + mea->setElementType( domFx_include_common::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + cm->getParent()->appendChild( cm ); + cm = cm->getParent(); + + cm = new daeMetaChoice( _Meta, cm, 3002, 0, -1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "image" ); + mea->setOffset( daeOffsetOf(domProfile_GLSL,elemImage_array) ); + mea->setElementType( domImage::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "newparam" ); + mea->setOffset( daeOffsetOf(domProfile_GLSL,elemNewparam_array) ); + mea->setElementType( domGlsl_newparam::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + cm->getParent()->appendChild( cm ); + cm = cm->getParent(); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 6003, 1, -1 ); + mea->setName( "technique" ); + mea->setOffset( daeOffsetOf(domProfile_GLSL,elemTechnique_array) ); + mea->setElementType( domProfile_GLSL::domTechnique::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 6004, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domProfile_GLSL,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 6004 ); + _Meta->setCMRoot( cm ); + // Ordered list of sub-elements + _Meta->addContents(daeOffsetOf(domProfile_GLSL,_contents)); + _Meta->addContentsOrder(daeOffsetOf(domProfile_GLSL,_contentsOrder)); + + + // Add attribute: id + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "id" ); + ma->setType( daeAtomicType::get("xsID")); + ma->setOffset( daeOffsetOf( domProfile_GLSL , attrId )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domProfile_GLSL)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domProfile_GLSL::domTechnique::create(daeInt bytes) +{ + domProfile_GLSL::domTechniqueRef ref = new(bytes) domProfile_GLSL::domTechnique; + return ref; +} + + +daeMetaElement * +domProfile_GLSL::domTechnique::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "technique" ); + _Meta->registerClass(domProfile_GLSL::domTechnique::create, &_Meta); + + _Meta->setIsInnerClass( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 0, -1 ); + mea->setName( "annotate" ); + mea->setOffset( daeOffsetOf(domProfile_GLSL::domTechnique,elemAnnotate_array) ); + mea->setElementType( domFx_annotate_common::registerElement() ); + cm->appendChild( mea ); + + cm = new daeMetaChoice( _Meta, cm, 1, 0, -1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "code" ); + mea->setOffset( daeOffsetOf(domProfile_GLSL::domTechnique,elemCode_array) ); + mea->setElementType( domFx_code_profile::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "include" ); + mea->setOffset( daeOffsetOf(domProfile_GLSL::domTechnique,elemInclude_array) ); + mea->setElementType( domFx_include_common::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + cm->getParent()->appendChild( cm ); + cm = cm->getParent(); + + cm = new daeMetaChoice( _Meta, cm, 3002, 0, -1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "image" ); + mea->setOffset( daeOffsetOf(domProfile_GLSL::domTechnique,elemImage_array) ); + mea->setElementType( domImage::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "newparam" ); + mea->setOffset( daeOffsetOf(domProfile_GLSL::domTechnique,elemNewparam_array) ); + mea->setElementType( domGlsl_newparam::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "setparam" ); + mea->setOffset( daeOffsetOf(domProfile_GLSL::domTechnique,elemSetparam_array) ); + mea->setElementType( domGlsl_setparam::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + cm->getParent()->appendChild( cm ); + cm = cm->getParent(); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 6003, 1, -1 ); + mea->setName( "pass" ); + mea->setOffset( daeOffsetOf(domProfile_GLSL::domTechnique,elemPass_array) ); + mea->setElementType( domProfile_GLSL::domTechnique::domPass::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 6004, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domProfile_GLSL::domTechnique,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 6004 ); + _Meta->setCMRoot( cm ); + // Ordered list of sub-elements + _Meta->addContents(daeOffsetOf(domProfile_GLSL::domTechnique,_contents)); + _Meta->addContentsOrder(daeOffsetOf(domProfile_GLSL::domTechnique,_contentsOrder)); + + + // Add attribute: id + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "id" ); + ma->setType( daeAtomicType::get("xsID")); + ma->setOffset( daeOffsetOf( domProfile_GLSL::domTechnique , attrId )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: sid + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "sid" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domProfile_GLSL::domTechnique , attrSid )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domProfile_GLSL::domTechnique)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domProfile_GLSL::domTechnique::domPass::create(daeInt bytes) +{ + domProfile_GLSL::domTechnique::domPassRef ref = new(bytes) domProfile_GLSL::domTechnique::domPass; + return ref; +} + + +daeMetaElement * +domProfile_GLSL::domTechnique::domPass::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "pass" ); + _Meta->registerClass(domProfile_GLSL::domTechnique::domPass::create, &_Meta); + + _Meta->setIsInnerClass( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 0, -1 ); + mea->setName( "annotate" ); + mea->setOffset( daeOffsetOf(domProfile_GLSL::domTechnique::domPass,elemAnnotate_array) ); + mea->setElementType( domFx_annotate_common::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 1, 0, -1 ); + mea->setName( "color_target" ); + mea->setOffset( daeOffsetOf(domProfile_GLSL::domTechnique::domPass,elemColor_target_array) ); + mea->setElementType( domFx_colortarget_common::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 2, 0, -1 ); + mea->setName( "depth_target" ); + mea->setOffset( daeOffsetOf(domProfile_GLSL::domTechnique::domPass,elemDepth_target_array) ); + mea->setElementType( domFx_depthtarget_common::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 3, 0, -1 ); + mea->setName( "stencil_target" ); + mea->setOffset( daeOffsetOf(domProfile_GLSL::domTechnique::domPass,elemStencil_target_array) ); + mea->setElementType( domFx_stenciltarget_common::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 4, 0, -1 ); + mea->setName( "color_clear" ); + mea->setOffset( daeOffsetOf(domProfile_GLSL::domTechnique::domPass,elemColor_clear_array) ); + mea->setElementType( domFx_clearcolor_common::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 5, 0, -1 ); + mea->setName( "depth_clear" ); + mea->setOffset( daeOffsetOf(domProfile_GLSL::domTechnique::domPass,elemDepth_clear_array) ); + mea->setElementType( domFx_cleardepth_common::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 6, 0, -1 ); + mea->setName( "stencil_clear" ); + mea->setOffset( daeOffsetOf(domProfile_GLSL::domTechnique::domPass,elemStencil_clear_array) ); + mea->setElementType( domFx_clearstencil_common::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 7, 0, 1 ); + mea->setName( "draw" ); + mea->setOffset( daeOffsetOf(domProfile_GLSL::domTechnique::domPass,elemDraw) ); + mea->setElementType( domProfile_GLSL::domTechnique::domPass::domDraw::registerElement() ); + cm->appendChild( mea ); + + cm = new daeMetaChoice( _Meta, cm, 8, 1, -1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "gl_pipeline_settings" ); + mea->setOffset( daeOffsetOf(domProfile_GLSL::domTechnique::domPass,elemGl_pipeline_settings_array) ); + mea->setElementType( domGl_pipeline_settings::registerElement() ); + cm->appendChild( new daeMetaGroup( mea, _Meta, cm, 0, 1, 1 ) ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "shader" ); + mea->setOffset( daeOffsetOf(domProfile_GLSL::domTechnique::domPass,elemShader_array) ); + mea->setElementType( domProfile_GLSL::domTechnique::domPass::domShader::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + cm->getParent()->appendChild( cm ); + cm = cm->getParent(); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 3009, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domProfile_GLSL::domTechnique::domPass,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 3009 ); + _Meta->setCMRoot( cm ); + // Ordered list of sub-elements + _Meta->addContents(daeOffsetOf(domProfile_GLSL::domTechnique::domPass,_contents)); + _Meta->addContentsOrder(daeOffsetOf(domProfile_GLSL::domTechnique::domPass,_contentsOrder)); + + + // Add attribute: sid + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "sid" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domProfile_GLSL::domTechnique::domPass , attrSid )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domProfile_GLSL::domTechnique::domPass)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domProfile_GLSL::domTechnique::domPass::domDraw::create(daeInt bytes) +{ + domProfile_GLSL::domTechnique::domPass::domDrawRef ref = new(bytes) domProfile_GLSL::domTechnique::domPass::domDraw; + return ref; +} + + +daeMetaElement * +domProfile_GLSL::domTechnique::domPass::domDraw::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "draw" ); + _Meta->registerClass(domProfile_GLSL::domTechnique::domPass::domDraw::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Fx_draw_common")); + ma->setOffset( daeOffsetOf( domProfile_GLSL::domTechnique::domPass::domDraw , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domProfile_GLSL::domTechnique::domPass::domDraw)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domProfile_GLSL::domTechnique::domPass::domShader::create(daeInt bytes) +{ + domProfile_GLSL::domTechnique::domPass::domShaderRef ref = new(bytes) domProfile_GLSL::domTechnique::domPass::domShader; + return ref; +} + + +daeMetaElement * +domProfile_GLSL::domTechnique::domPass::domShader::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "shader" ); + _Meta->registerClass(domProfile_GLSL::domTechnique::domPass::domShader::create, &_Meta); + + _Meta->setIsInnerClass( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 0, -1 ); + mea->setName( "annotate" ); + mea->setOffset( daeOffsetOf(domProfile_GLSL::domTechnique::domPass::domShader,elemAnnotate_array) ); + mea->setElementType( domFx_annotate_common::registerElement() ); + cm->appendChild( mea ); + + cm = new daeMetaSequence( _Meta, cm, 1, 0, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "compiler_target" ); + mea->setOffset( daeOffsetOf(domProfile_GLSL::domTechnique::domPass::domShader,elemCompiler_target) ); + mea->setElementType( domProfile_GLSL::domTechnique::domPass::domShader::domCompiler_target::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 0, 1 ); + mea->setName( "compiler_options" ); + mea->setOffset( daeOffsetOf(domProfile_GLSL::domTechnique::domPass::domShader,elemCompiler_options) ); + mea->setElementType( domProfile_GLSL::domTechnique::domPass::domShader::domCompiler_options::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 1 ); + cm->getParent()->appendChild( cm ); + cm = cm->getParent(); + + mea = new daeMetaElementAttribute( _Meta, cm, 3, 1, 1 ); + mea->setName( "name" ); + mea->setOffset( daeOffsetOf(domProfile_GLSL::domTechnique::domPass::domShader,elemName) ); + mea->setElementType( domProfile_GLSL::domTechnique::domPass::domShader::domName::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 4, 0, -1 ); + mea->setName( "bind" ); + mea->setOffset( daeOffsetOf(domProfile_GLSL::domTechnique::domPass::domShader,elemBind_array) ); + mea->setElementType( domProfile_GLSL::domTechnique::domPass::domShader::domBind::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 4 ); + _Meta->setCMRoot( cm ); + + // Add attribute: stage + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "stage" ); + ma->setType( daeAtomicType::get("Glsl_pipeline_stage")); + ma->setOffset( daeOffsetOf( domProfile_GLSL::domTechnique::domPass::domShader , attrStage )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domProfile_GLSL::domTechnique::domPass::domShader)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domProfile_GLSL::domTechnique::domPass::domShader::domCompiler_target::create(daeInt bytes) +{ + domProfile_GLSL::domTechnique::domPass::domShader::domCompiler_targetRef ref = new(bytes) domProfile_GLSL::domTechnique::domPass::domShader::domCompiler_target; + return ref; +} + + +daeMetaElement * +domProfile_GLSL::domTechnique::domPass::domShader::domCompiler_target::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "compiler_target" ); + _Meta->registerClass(domProfile_GLSL::domTechnique::domPass::domShader::domCompiler_target::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("xsNMTOKEN")); + ma->setOffset( daeOffsetOf( domProfile_GLSL::domTechnique::domPass::domShader::domCompiler_target , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domProfile_GLSL::domTechnique::domPass::domShader::domCompiler_target)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domProfile_GLSL::domTechnique::domPass::domShader::domCompiler_options::create(daeInt bytes) +{ + domProfile_GLSL::domTechnique::domPass::domShader::domCompiler_optionsRef ref = new(bytes) domProfile_GLSL::domTechnique::domPass::domShader::domCompiler_options; + return ref; +} + + +daeMetaElement * +domProfile_GLSL::domTechnique::domPass::domShader::domCompiler_options::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "compiler_options" ); + _Meta->registerClass(domProfile_GLSL::domTechnique::domPass::domShader::domCompiler_options::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("xsString")); + ma->setOffset( daeOffsetOf( domProfile_GLSL::domTechnique::domPass::domShader::domCompiler_options , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domProfile_GLSL::domTechnique::domPass::domShader::domCompiler_options)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domProfile_GLSL::domTechnique::domPass::domShader::domName::create(daeInt bytes) +{ + domProfile_GLSL::domTechnique::domPass::domShader::domNameRef ref = new(bytes) domProfile_GLSL::domTechnique::domPass::domShader::domName; + return ref; +} + + +daeMetaElement * +domProfile_GLSL::domTechnique::domPass::domShader::domName::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "name" ); + _Meta->registerClass(domProfile_GLSL::domTechnique::domPass::domShader::domName::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domProfile_GLSL::domTechnique::domPass::domShader::domName , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + // Add attribute: source + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "source" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domProfile_GLSL::domTechnique::domPass::domShader::domName , attrSource )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domProfile_GLSL::domTechnique::domPass::domShader::domName)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domProfile_GLSL::domTechnique::domPass::domShader::domBind::create(daeInt bytes) +{ + domProfile_GLSL::domTechnique::domPass::domShader::domBindRef ref = new(bytes) domProfile_GLSL::domTechnique::domPass::domShader::domBind; + return ref; +} + + +daeMetaElement * +domProfile_GLSL::domTechnique::domPass::domShader::domBind::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "bind" ); + _Meta->registerClass(domProfile_GLSL::domTechnique::domPass::domShader::domBind::create, &_Meta); + + _Meta->setIsInnerClass( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaChoice( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "glsl_param_type" ); + mea->setOffset( daeOffsetOf(domProfile_GLSL::domTechnique::domPass::domShader::domBind,elemGlsl_param_type) ); + mea->setElementType( domGlsl_param_type::registerElement() ); + cm->appendChild( new daeMetaGroup( mea, _Meta, cm, 0, 1, 1 ) ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "param" ); + mea->setOffset( daeOffsetOf(domProfile_GLSL::domTechnique::domPass::domShader::domBind,elemParam) ); + mea->setElementType( domProfile_GLSL::domTechnique::domPass::domShader::domBind::domParam::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + _Meta->setCMRoot( cm ); + // Ordered list of sub-elements + _Meta->addContents(daeOffsetOf(domProfile_GLSL::domTechnique::domPass::domShader::domBind,_contents)); + _Meta->addContentsOrder(daeOffsetOf(domProfile_GLSL::domTechnique::domPass::domShader::domBind,_contentsOrder)); + + + // Add attribute: symbol + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "symbol" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domProfile_GLSL::domTechnique::domPass::domShader::domBind , attrSymbol )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domProfile_GLSL::domTechnique::domPass::domShader::domBind)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domProfile_GLSL::domTechnique::domPass::domShader::domBind::domParam::create(daeInt bytes) +{ + domProfile_GLSL::domTechnique::domPass::domShader::domBind::domParamRef ref = new(bytes) domProfile_GLSL::domTechnique::domPass::domShader::domBind::domParam; + return ref; +} + + +daeMetaElement * +domProfile_GLSL::domTechnique::domPass::domShader::domBind::domParam::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "param" ); + _Meta->registerClass(domProfile_GLSL::domTechnique::domPass::domShader::domBind::domParam::create, &_Meta); + + _Meta->setIsInnerClass( true ); + + // Add attribute: ref + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "ref" ); + ma->setType( daeAtomicType::get("xsString")); + ma->setOffset( daeOffsetOf( domProfile_GLSL::domTechnique::domPass::domShader::domBind::domParam , attrRef )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domProfile_GLSL::domTechnique::domPass::domShader::domBind::domParam)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domProfile_GLSL::_Meta = NULL; +daeMetaElement * domProfile_GLSL::domTechnique::_Meta = NULL; +daeMetaElement * domProfile_GLSL::domTechnique::domPass::_Meta = NULL; +daeMetaElement * domProfile_GLSL::domTechnique::domPass::domDraw::_Meta = NULL; +daeMetaElement * domProfile_GLSL::domTechnique::domPass::domShader::_Meta = NULL; +daeMetaElement * domProfile_GLSL::domTechnique::domPass::domShader::domCompiler_target::_Meta = NULL; +daeMetaElement * domProfile_GLSL::domTechnique::domPass::domShader::domCompiler_options::_Meta = NULL; +daeMetaElement * domProfile_GLSL::domTechnique::domPass::domShader::domName::_Meta = NULL; +daeMetaElement * domProfile_GLSL::domTechnique::domPass::domShader::domBind::_Meta = NULL; +daeMetaElement * domProfile_GLSL::domTechnique::domPass::domShader::domBind::domParam::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domRigid_body.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domRigid_body.cpp new file mode 100644 index 00000000..22caad88 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domRigid_body.cpp @@ -0,0 +1,477 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domRigid_body::create(daeInt bytes) +{ + domRigid_bodyRef ref = new(bytes) domRigid_body; + return ref; +} + + +daeMetaElement * +domRigid_body::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "rigid_body" ); + _Meta->registerClass(domRigid_body::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "technique_common" ); + mea->setOffset( daeOffsetOf(domRigid_body,elemTechnique_common) ); + mea->setElementType( domRigid_body::domTechnique_common::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 1, 0, -1 ); + mea->setName( "technique" ); + mea->setOffset( daeOffsetOf(domRigid_body,elemTechnique_array) ); + mea->setElementType( domTechnique::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 2, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domRigid_body,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 2 ); + _Meta->setCMRoot( cm ); + + // Add attribute: sid + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "sid" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domRigid_body , attrSid )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: name + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "name" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domRigid_body , attrName )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domRigid_body)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domRigid_body::domTechnique_common::create(daeInt bytes) +{ + domRigid_body::domTechnique_commonRef ref = new(bytes) domRigid_body::domTechnique_common; + return ref; +} + + +daeMetaElement * +domRigid_body::domTechnique_common::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "technique_common" ); + _Meta->registerClass(domRigid_body::domTechnique_common::create, &_Meta); + + _Meta->setIsInnerClass( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 0, 1 ); + mea->setName( "dynamic" ); + mea->setOffset( daeOffsetOf(domRigid_body::domTechnique_common,elemDynamic) ); + mea->setElementType( domRigid_body::domTechnique_common::domDynamic::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 0, 1 ); + mea->setName( "mass" ); + mea->setOffset( daeOffsetOf(domRigid_body::domTechnique_common,elemMass) ); + mea->setElementType( domTargetableFloat::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 2, 0, 1 ); + mea->setName( "mass_frame" ); + mea->setOffset( daeOffsetOf(domRigid_body::domTechnique_common,elemMass_frame) ); + mea->setElementType( domRigid_body::domTechnique_common::domMass_frame::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 3, 0, 1 ); + mea->setName( "inertia" ); + mea->setOffset( daeOffsetOf(domRigid_body::domTechnique_common,elemInertia) ); + mea->setElementType( domTargetableFloat3::registerElement() ); + cm->appendChild( mea ); + + cm = new daeMetaChoice( _Meta, cm, 4, 0, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "instance_physics_material" ); + mea->setOffset( daeOffsetOf(domRigid_body::domTechnique_common,elemInstance_physics_material) ); + mea->setElementType( domInstance_physics_material::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "physics_material" ); + mea->setOffset( daeOffsetOf(domRigid_body::domTechnique_common,elemPhysics_material) ); + mea->setElementType( domPhysics_material::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + cm->getParent()->appendChild( cm ); + cm = cm->getParent(); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 5, 1, -1 ); + mea->setName( "shape" ); + mea->setOffset( daeOffsetOf(domRigid_body::domTechnique_common,elemShape_array) ); + mea->setElementType( domRigid_body::domTechnique_common::domShape::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 5 ); + _Meta->setCMRoot( cm ); + // Ordered list of sub-elements + _Meta->addContents(daeOffsetOf(domRigid_body::domTechnique_common,_contents)); + _Meta->addContentsOrder(daeOffsetOf(domRigid_body::domTechnique_common,_contentsOrder)); + + + + _Meta->setElementSize(sizeof(domRigid_body::domTechnique_common)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domRigid_body::domTechnique_common::domDynamic::create(daeInt bytes) +{ + domRigid_body::domTechnique_common::domDynamicRef ref = new(bytes) domRigid_body::domTechnique_common::domDynamic; + return ref; +} + + +daeMetaElement * +domRigid_body::domTechnique_common::domDynamic::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "dynamic" ); + _Meta->registerClass(domRigid_body::domTechnique_common::domDynamic::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Bool")); + ma->setOffset( daeOffsetOf( domRigid_body::domTechnique_common::domDynamic , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + // Add attribute: sid + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "sid" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domRigid_body::domTechnique_common::domDynamic , attrSid )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domRigid_body::domTechnique_common::domDynamic)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domRigid_body::domTechnique_common::domMass_frame::create(daeInt bytes) +{ + domRigid_body::domTechnique_common::domMass_frameRef ref = new(bytes) domRigid_body::domTechnique_common::domMass_frame; + return ref; +} + + +daeMetaElement * +domRigid_body::domTechnique_common::domMass_frame::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "mass_frame" ); + _Meta->registerClass(domRigid_body::domTechnique_common::domMass_frame::create, &_Meta); + + _Meta->setIsInnerClass( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaChoice( _Meta, cm, 0, 1, -1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "translate" ); + mea->setOffset( daeOffsetOf(domRigid_body::domTechnique_common::domMass_frame,elemTranslate_array) ); + mea->setElementType( domTranslate::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "rotate" ); + mea->setOffset( daeOffsetOf(domRigid_body::domTechnique_common::domMass_frame,elemRotate_array) ); + mea->setElementType( domRotate::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 3000 ); + _Meta->setCMRoot( cm ); + // Ordered list of sub-elements + _Meta->addContents(daeOffsetOf(domRigid_body::domTechnique_common::domMass_frame,_contents)); + _Meta->addContentsOrder(daeOffsetOf(domRigid_body::domTechnique_common::domMass_frame,_contentsOrder)); + + + + _Meta->setElementSize(sizeof(domRigid_body::domTechnique_common::domMass_frame)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domRigid_body::domTechnique_common::domShape::create(daeInt bytes) +{ + domRigid_body::domTechnique_common::domShapeRef ref = new(bytes) domRigid_body::domTechnique_common::domShape; + return ref; +} + + +daeMetaElement * +domRigid_body::domTechnique_common::domShape::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "shape" ); + _Meta->registerClass(domRigid_body::domTechnique_common::domShape::create, &_Meta); + + _Meta->setIsInnerClass( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 0, 1 ); + mea->setName( "hollow" ); + mea->setOffset( daeOffsetOf(domRigid_body::domTechnique_common::domShape,elemHollow) ); + mea->setElementType( domRigid_body::domTechnique_common::domShape::domHollow::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 0, 1 ); + mea->setName( "mass" ); + mea->setOffset( daeOffsetOf(domRigid_body::domTechnique_common::domShape,elemMass) ); + mea->setElementType( domTargetableFloat::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 2, 0, 1 ); + mea->setName( "density" ); + mea->setOffset( daeOffsetOf(domRigid_body::domTechnique_common::domShape,elemDensity) ); + mea->setElementType( domTargetableFloat::registerElement() ); + cm->appendChild( mea ); + + cm = new daeMetaChoice( _Meta, cm, 3, 0, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "instance_physics_material" ); + mea->setOffset( daeOffsetOf(domRigid_body::domTechnique_common::domShape,elemInstance_physics_material) ); + mea->setElementType( domInstance_physics_material::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "physics_material" ); + mea->setOffset( daeOffsetOf(domRigid_body::domTechnique_common::domShape,elemPhysics_material) ); + mea->setElementType( domPhysics_material::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + cm->getParent()->appendChild( cm ); + cm = cm->getParent(); + + cm = new daeMetaChoice( _Meta, cm, 4, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "instance_geometry" ); + mea->setOffset( daeOffsetOf(domRigid_body::domTechnique_common::domShape,elemInstance_geometry) ); + mea->setElementType( domInstance_geometry::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "plane" ); + mea->setOffset( daeOffsetOf(domRigid_body::domTechnique_common::domShape,elemPlane) ); + mea->setElementType( domPlane::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "box" ); + mea->setOffset( daeOffsetOf(domRigid_body::domTechnique_common::domShape,elemBox) ); + mea->setElementType( domBox::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "sphere" ); + mea->setOffset( daeOffsetOf(domRigid_body::domTechnique_common::domShape,elemSphere) ); + mea->setElementType( domSphere::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "cylinder" ); + mea->setOffset( daeOffsetOf(domRigid_body::domTechnique_common::domShape,elemCylinder) ); + mea->setElementType( domCylinder::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "tapered_cylinder" ); + mea->setOffset( daeOffsetOf(domRigid_body::domTechnique_common::domShape,elemTapered_cylinder) ); + mea->setElementType( domTapered_cylinder::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "capsule" ); + mea->setOffset( daeOffsetOf(domRigid_body::domTechnique_common::domShape,elemCapsule) ); + mea->setElementType( domCapsule::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "tapered_capsule" ); + mea->setOffset( daeOffsetOf(domRigid_body::domTechnique_common::domShape,elemTapered_capsule) ); + mea->setElementType( domTapered_capsule::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + cm->getParent()->appendChild( cm ); + cm = cm->getParent(); + + cm = new daeMetaChoice( _Meta, cm, 5, 0, -1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "translate" ); + mea->setOffset( daeOffsetOf(domRigid_body::domTechnique_common::domShape,elemTranslate_array) ); + mea->setElementType( domTranslate::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "rotate" ); + mea->setOffset( daeOffsetOf(domRigid_body::domTechnique_common::domShape,elemRotate_array) ); + mea->setElementType( domRotate::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + cm->getParent()->appendChild( cm ); + cm = cm->getParent(); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 3006, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domRigid_body::domTechnique_common::domShape,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 3006 ); + _Meta->setCMRoot( cm ); + // Ordered list of sub-elements + _Meta->addContents(daeOffsetOf(domRigid_body::domTechnique_common::domShape,_contents)); + _Meta->addContentsOrder(daeOffsetOf(domRigid_body::domTechnique_common::domShape,_contentsOrder)); + + + + _Meta->setElementSize(sizeof(domRigid_body::domTechnique_common::domShape)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domRigid_body::domTechnique_common::domShape::domHollow::create(daeInt bytes) +{ + domRigid_body::domTechnique_common::domShape::domHollowRef ref = new(bytes) domRigid_body::domTechnique_common::domShape::domHollow; + return ref; +} + + +daeMetaElement * +domRigid_body::domTechnique_common::domShape::domHollow::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "hollow" ); + _Meta->registerClass(domRigid_body::domTechnique_common::domShape::domHollow::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Bool")); + ma->setOffset( daeOffsetOf( domRigid_body::domTechnique_common::domShape::domHollow , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + // Add attribute: sid + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "sid" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domRigid_body::domTechnique_common::domShape::domHollow , attrSid )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domRigid_body::domTechnique_common::domShape::domHollow)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domRigid_body::_Meta = NULL; +daeMetaElement * domRigid_body::domTechnique_common::_Meta = NULL; +daeMetaElement * domRigid_body::domTechnique_common::domDynamic::_Meta = NULL; +daeMetaElement * domRigid_body::domTechnique_common::domMass_frame::_Meta = NULL; +daeMetaElement * domRigid_body::domTechnique_common::domShape::_Meta = NULL; +daeMetaElement * domRigid_body::domTechnique_common::domShape::domHollow::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domRigid_constraint.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domRigid_constraint.cpp new file mode 100644 index 00000000..5d54a154 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domRigid_constraint.cpp @@ -0,0 +1,677 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domRigid_constraint::create(daeInt bytes) +{ + domRigid_constraintRef ref = new(bytes) domRigid_constraint; + return ref; +} + + +daeMetaElement * +domRigid_constraint::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "rigid_constraint" ); + _Meta->registerClass(domRigid_constraint::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "ref_attachment" ); + mea->setOffset( daeOffsetOf(domRigid_constraint,elemRef_attachment) ); + mea->setElementType( domRigid_constraint::domRef_attachment::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 1, 1 ); + mea->setName( "attachment" ); + mea->setOffset( daeOffsetOf(domRigid_constraint,elemAttachment) ); + mea->setElementType( domRigid_constraint::domAttachment::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 2, 1, 1 ); + mea->setName( "technique_common" ); + mea->setOffset( daeOffsetOf(domRigid_constraint,elemTechnique_common) ); + mea->setElementType( domRigid_constraint::domTechnique_common::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 3, 0, -1 ); + mea->setName( "technique" ); + mea->setOffset( daeOffsetOf(domRigid_constraint,elemTechnique_array) ); + mea->setElementType( domTechnique::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 4, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domRigid_constraint,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 4 ); + _Meta->setCMRoot( cm ); + + // Add attribute: sid + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "sid" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domRigid_constraint , attrSid )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: name + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "name" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domRigid_constraint , attrName )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domRigid_constraint)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domRigid_constraint::domRef_attachment::create(daeInt bytes) +{ + domRigid_constraint::domRef_attachmentRef ref = new(bytes) domRigid_constraint::domRef_attachment; + ref->attrRigid_body.setContainer( (domRigid_constraint::domRef_attachment*)ref ); + return ref; +} + + +daeMetaElement * +domRigid_constraint::domRef_attachment::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "ref_attachment" ); + _Meta->registerClass(domRigid_constraint::domRef_attachment::create, &_Meta); + + _Meta->setIsInnerClass( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaChoice( _Meta, cm, 0, 0, -1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "translate" ); + mea->setOffset( daeOffsetOf(domRigid_constraint::domRef_attachment,elemTranslate_array) ); + mea->setElementType( domTranslate::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "rotate" ); + mea->setOffset( daeOffsetOf(domRigid_constraint::domRef_attachment,elemRotate_array) ); + mea->setElementType( domRotate::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domRigid_constraint::domRef_attachment,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 3000 ); + _Meta->setCMRoot( cm ); + // Ordered list of sub-elements + _Meta->addContents(daeOffsetOf(domRigid_constraint::domRef_attachment,_contents)); + _Meta->addContentsOrder(daeOffsetOf(domRigid_constraint::domRef_attachment,_contentsOrder)); + + + // Add attribute: rigid_body + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "rigid_body" ); + ma->setType( daeAtomicType::get("xsAnyURI")); + ma->setOffset( daeOffsetOf( domRigid_constraint::domRef_attachment , attrRigid_body )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domRigid_constraint::domRef_attachment)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domRigid_constraint::domAttachment::create(daeInt bytes) +{ + domRigid_constraint::domAttachmentRef ref = new(bytes) domRigid_constraint::domAttachment; + ref->attrRigid_body.setContainer( (domRigid_constraint::domAttachment*)ref ); + return ref; +} + + +daeMetaElement * +domRigid_constraint::domAttachment::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "attachment" ); + _Meta->registerClass(domRigid_constraint::domAttachment::create, &_Meta); + + _Meta->setIsInnerClass( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaChoice( _Meta, cm, 0, 0, -1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "translate" ); + mea->setOffset( daeOffsetOf(domRigid_constraint::domAttachment,elemTranslate_array) ); + mea->setElementType( domTranslate::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "rotate" ); + mea->setOffset( daeOffsetOf(domRigid_constraint::domAttachment,elemRotate_array) ); + mea->setElementType( domRotate::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domRigid_constraint::domAttachment,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 3000 ); + _Meta->setCMRoot( cm ); + // Ordered list of sub-elements + _Meta->addContents(daeOffsetOf(domRigid_constraint::domAttachment,_contents)); + _Meta->addContentsOrder(daeOffsetOf(domRigid_constraint::domAttachment,_contentsOrder)); + + + // Add attribute: rigid_body + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "rigid_body" ); + ma->setType( daeAtomicType::get("xsAnyURI")); + ma->setOffset( daeOffsetOf( domRigid_constraint::domAttachment , attrRigid_body )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domRigid_constraint::domAttachment)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domRigid_constraint::domTechnique_common::create(daeInt bytes) +{ + domRigid_constraint::domTechnique_commonRef ref = new(bytes) domRigid_constraint::domTechnique_common; + return ref; +} + + +daeMetaElement * +domRigid_constraint::domTechnique_common::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "technique_common" ); + _Meta->registerClass(domRigid_constraint::domTechnique_common::create, &_Meta); + + _Meta->setIsInnerClass( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 0, 1 ); + mea->setName( "enabled" ); + mea->setOffset( daeOffsetOf(domRigid_constraint::domTechnique_common,elemEnabled) ); + mea->setElementType( domRigid_constraint::domTechnique_common::domEnabled::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 0, 1 ); + mea->setName( "interpenetrate" ); + mea->setOffset( daeOffsetOf(domRigid_constraint::domTechnique_common,elemInterpenetrate) ); + mea->setElementType( domRigid_constraint::domTechnique_common::domInterpenetrate::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 2, 0, 1 ); + mea->setName( "limits" ); + mea->setOffset( daeOffsetOf(domRigid_constraint::domTechnique_common,elemLimits) ); + mea->setElementType( domRigid_constraint::domTechnique_common::domLimits::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 3, 0, 1 ); + mea->setName( "spring" ); + mea->setOffset( daeOffsetOf(domRigid_constraint::domTechnique_common,elemSpring) ); + mea->setElementType( domRigid_constraint::domTechnique_common::domSpring::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 3 ); + _Meta->setCMRoot( cm ); + + + _Meta->setElementSize(sizeof(domRigid_constraint::domTechnique_common)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domRigid_constraint::domTechnique_common::domEnabled::create(daeInt bytes) +{ + domRigid_constraint::domTechnique_common::domEnabledRef ref = new(bytes) domRigid_constraint::domTechnique_common::domEnabled; + return ref; +} + + +daeMetaElement * +domRigid_constraint::domTechnique_common::domEnabled::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "enabled" ); + _Meta->registerClass(domRigid_constraint::domTechnique_common::domEnabled::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Bool")); + ma->setOffset( daeOffsetOf( domRigid_constraint::domTechnique_common::domEnabled , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + // Add attribute: sid + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "sid" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domRigid_constraint::domTechnique_common::domEnabled , attrSid )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domRigid_constraint::domTechnique_common::domEnabled)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domRigid_constraint::domTechnique_common::domInterpenetrate::create(daeInt bytes) +{ + domRigid_constraint::domTechnique_common::domInterpenetrateRef ref = new(bytes) domRigid_constraint::domTechnique_common::domInterpenetrate; + return ref; +} + + +daeMetaElement * +domRigid_constraint::domTechnique_common::domInterpenetrate::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "interpenetrate" ); + _Meta->registerClass(domRigid_constraint::domTechnique_common::domInterpenetrate::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Bool")); + ma->setOffset( daeOffsetOf( domRigid_constraint::domTechnique_common::domInterpenetrate , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + // Add attribute: sid + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "sid" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domRigid_constraint::domTechnique_common::domInterpenetrate , attrSid )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domRigid_constraint::domTechnique_common::domInterpenetrate)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domRigid_constraint::domTechnique_common::domLimits::create(daeInt bytes) +{ + domRigid_constraint::domTechnique_common::domLimitsRef ref = new(bytes) domRigid_constraint::domTechnique_common::domLimits; + return ref; +} + + +daeMetaElement * +domRigid_constraint::domTechnique_common::domLimits::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "limits" ); + _Meta->registerClass(domRigid_constraint::domTechnique_common::domLimits::create, &_Meta); + + _Meta->setIsInnerClass( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 0, 1 ); + mea->setName( "swing_cone_and_twist" ); + mea->setOffset( daeOffsetOf(domRigid_constraint::domTechnique_common::domLimits,elemSwing_cone_and_twist) ); + mea->setElementType( domRigid_constraint::domTechnique_common::domLimits::domSwing_cone_and_twist::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 0, 1 ); + mea->setName( "linear" ); + mea->setOffset( daeOffsetOf(domRigid_constraint::domTechnique_common::domLimits,elemLinear) ); + mea->setElementType( domRigid_constraint::domTechnique_common::domLimits::domLinear::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 1 ); + _Meta->setCMRoot( cm ); + + + _Meta->setElementSize(sizeof(domRigid_constraint::domTechnique_common::domLimits)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domRigid_constraint::domTechnique_common::domLimits::domSwing_cone_and_twist::create(daeInt bytes) +{ + domRigid_constraint::domTechnique_common::domLimits::domSwing_cone_and_twistRef ref = new(bytes) domRigid_constraint::domTechnique_common::domLimits::domSwing_cone_and_twist; + return ref; +} + + +daeMetaElement * +domRigid_constraint::domTechnique_common::domLimits::domSwing_cone_and_twist::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "swing_cone_and_twist" ); + _Meta->registerClass(domRigid_constraint::domTechnique_common::domLimits::domSwing_cone_and_twist::create, &_Meta); + + _Meta->setIsInnerClass( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 0, 1 ); + mea->setName( "min" ); + mea->setOffset( daeOffsetOf(domRigid_constraint::domTechnique_common::domLimits::domSwing_cone_and_twist,elemMin) ); + mea->setElementType( domTargetableFloat3::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 0, 1 ); + mea->setName( "max" ); + mea->setOffset( daeOffsetOf(domRigid_constraint::domTechnique_common::domLimits::domSwing_cone_and_twist,elemMax) ); + mea->setElementType( domTargetableFloat3::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 1 ); + _Meta->setCMRoot( cm ); + + + _Meta->setElementSize(sizeof(domRigid_constraint::domTechnique_common::domLimits::domSwing_cone_and_twist)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domRigid_constraint::domTechnique_common::domLimits::domLinear::create(daeInt bytes) +{ + domRigid_constraint::domTechnique_common::domLimits::domLinearRef ref = new(bytes) domRigid_constraint::domTechnique_common::domLimits::domLinear; + return ref; +} + + +daeMetaElement * +domRigid_constraint::domTechnique_common::domLimits::domLinear::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "linear" ); + _Meta->registerClass(domRigid_constraint::domTechnique_common::domLimits::domLinear::create, &_Meta); + + _Meta->setIsInnerClass( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 0, 1 ); + mea->setName( "min" ); + mea->setOffset( daeOffsetOf(domRigid_constraint::domTechnique_common::domLimits::domLinear,elemMin) ); + mea->setElementType( domTargetableFloat3::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 0, 1 ); + mea->setName( "max" ); + mea->setOffset( daeOffsetOf(domRigid_constraint::domTechnique_common::domLimits::domLinear,elemMax) ); + mea->setElementType( domTargetableFloat3::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 1 ); + _Meta->setCMRoot( cm ); + + + _Meta->setElementSize(sizeof(domRigid_constraint::domTechnique_common::domLimits::domLinear)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domRigid_constraint::domTechnique_common::domSpring::create(daeInt bytes) +{ + domRigid_constraint::domTechnique_common::domSpringRef ref = new(bytes) domRigid_constraint::domTechnique_common::domSpring; + return ref; +} + + +daeMetaElement * +domRigid_constraint::domTechnique_common::domSpring::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "spring" ); + _Meta->registerClass(domRigid_constraint::domTechnique_common::domSpring::create, &_Meta); + + _Meta->setIsInnerClass( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 0, 1 ); + mea->setName( "angular" ); + mea->setOffset( daeOffsetOf(domRigid_constraint::domTechnique_common::domSpring,elemAngular) ); + mea->setElementType( domRigid_constraint::domTechnique_common::domSpring::domAngular::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 0, 1 ); + mea->setName( "linear" ); + mea->setOffset( daeOffsetOf(domRigid_constraint::domTechnique_common::domSpring,elemLinear) ); + mea->setElementType( domRigid_constraint::domTechnique_common::domSpring::domLinear::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 1 ); + _Meta->setCMRoot( cm ); + + + _Meta->setElementSize(sizeof(domRigid_constraint::domTechnique_common::domSpring)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domRigid_constraint::domTechnique_common::domSpring::domAngular::create(daeInt bytes) +{ + domRigid_constraint::domTechnique_common::domSpring::domAngularRef ref = new(bytes) domRigid_constraint::domTechnique_common::domSpring::domAngular; + return ref; +} + + +daeMetaElement * +domRigid_constraint::domTechnique_common::domSpring::domAngular::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "angular" ); + _Meta->registerClass(domRigid_constraint::domTechnique_common::domSpring::domAngular::create, &_Meta); + + _Meta->setIsInnerClass( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 0, 1 ); + mea->setName( "stiffness" ); + mea->setOffset( daeOffsetOf(domRigid_constraint::domTechnique_common::domSpring::domAngular,elemStiffness) ); + mea->setElementType( domTargetableFloat::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 0, 1 ); + mea->setName( "damping" ); + mea->setOffset( daeOffsetOf(domRigid_constraint::domTechnique_common::domSpring::domAngular,elemDamping) ); + mea->setElementType( domTargetableFloat::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 2, 0, 1 ); + mea->setName( "target_value" ); + mea->setOffset( daeOffsetOf(domRigid_constraint::domTechnique_common::domSpring::domAngular,elemTarget_value) ); + mea->setElementType( domTargetableFloat::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 2 ); + _Meta->setCMRoot( cm ); + + + _Meta->setElementSize(sizeof(domRigid_constraint::domTechnique_common::domSpring::domAngular)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domRigid_constraint::domTechnique_common::domSpring::domLinear::create(daeInt bytes) +{ + domRigid_constraint::domTechnique_common::domSpring::domLinearRef ref = new(bytes) domRigid_constraint::domTechnique_common::domSpring::domLinear; + return ref; +} + + +daeMetaElement * +domRigid_constraint::domTechnique_common::domSpring::domLinear::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "linear" ); + _Meta->registerClass(domRigid_constraint::domTechnique_common::domSpring::domLinear::create, &_Meta); + + _Meta->setIsInnerClass( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 0, 1 ); + mea->setName( "stiffness" ); + mea->setOffset( daeOffsetOf(domRigid_constraint::domTechnique_common::domSpring::domLinear,elemStiffness) ); + mea->setElementType( domTargetableFloat::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 0, 1 ); + mea->setName( "damping" ); + mea->setOffset( daeOffsetOf(domRigid_constraint::domTechnique_common::domSpring::domLinear,elemDamping) ); + mea->setElementType( domTargetableFloat::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 2, 0, 1 ); + mea->setName( "target_value" ); + mea->setOffset( daeOffsetOf(domRigid_constraint::domTechnique_common::domSpring::domLinear,elemTarget_value) ); + mea->setElementType( domTargetableFloat::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 2 ); + _Meta->setCMRoot( cm ); + + + _Meta->setElementSize(sizeof(domRigid_constraint::domTechnique_common::domSpring::domLinear)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domRigid_constraint::_Meta = NULL; +daeMetaElement * domRigid_constraint::domRef_attachment::_Meta = NULL; +daeMetaElement * domRigid_constraint::domAttachment::_Meta = NULL; +daeMetaElement * domRigid_constraint::domTechnique_common::_Meta = NULL; +daeMetaElement * domRigid_constraint::domTechnique_common::domEnabled::_Meta = NULL; +daeMetaElement * domRigid_constraint::domTechnique_common::domInterpenetrate::_Meta = NULL; +daeMetaElement * domRigid_constraint::domTechnique_common::domLimits::_Meta = NULL; +daeMetaElement * domRigid_constraint::domTechnique_common::domLimits::domSwing_cone_and_twist::_Meta = NULL; +daeMetaElement * domRigid_constraint::domTechnique_common::domLimits::domLinear::_Meta = NULL; +daeMetaElement * domRigid_constraint::domTechnique_common::domSpring::_Meta = NULL; +daeMetaElement * domRigid_constraint::domTechnique_common::domSpring::domAngular::_Meta = NULL; +daeMetaElement * domRigid_constraint::domTechnique_common::domSpring::domLinear::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domRotate.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domRotate.cpp new file mode 100644 index 00000000..a5d9a4f8 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domRotate.cpp @@ -0,0 +1,71 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domRotate::create(daeInt bytes) +{ + domRotateRef ref = new(bytes) domRotate; + return ref; +} + + +daeMetaElement * +domRotate::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "rotate" ); + _Meta->registerClass(domRotate::create, &_Meta); + + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Float4")); + ma->setOffset( daeOffsetOf( domRotate , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + // Add attribute: sid + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "sid" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domRotate , attrSid )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domRotate)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domRotate::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domSampler.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domSampler.cpp new file mode 100644 index 00000000..1eaae9dd --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domSampler.cpp @@ -0,0 +1,74 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domSampler::create(daeInt bytes) +{ + domSamplerRef ref = new(bytes) domSampler; + return ref; +} + + +daeMetaElement * +domSampler::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "sampler" ); + _Meta->registerClass(domSampler::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, -1 ); + mea->setName( "input" ); + mea->setOffset( daeOffsetOf(domSampler,elemInput_array) ); + mea->setElementType( domInputLocal::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + _Meta->setCMRoot( cm ); + + // Add attribute: id + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "id" ); + ma->setType( daeAtomicType::get("xsID")); + ma->setOffset( daeOffsetOf( domSampler , attrId )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domSampler)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domSampler::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domScale.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domScale.cpp new file mode 100644 index 00000000..dac262b5 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domScale.cpp @@ -0,0 +1,71 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domScale::create(daeInt bytes) +{ + domScaleRef ref = new(bytes) domScale; + return ref; +} + + +daeMetaElement * +domScale::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "scale" ); + _Meta->registerClass(domScale::create, &_Meta); + + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Float3")); + ma->setOffset( daeOffsetOf( domScale , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + // Add attribute: sid + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "sid" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domScale , attrSid )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domScale)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domScale::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domSkew.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domSkew.cpp new file mode 100644 index 00000000..37caae20 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domSkew.cpp @@ -0,0 +1,71 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domSkew::create(daeInt bytes) +{ + domSkewRef ref = new(bytes) domSkew; + return ref; +} + + +daeMetaElement * +domSkew::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "skew" ); + _Meta->registerClass(domSkew::create, &_Meta); + + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Float7")); + ma->setOffset( daeOffsetOf( domSkew , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + // Add attribute: sid + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "sid" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domSkew , attrSid )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domSkew)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domSkew::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domSkin.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domSkin.cpp new file mode 100644 index 00000000..ffbc4e63 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domSkin.cpp @@ -0,0 +1,322 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domSkin::create(daeInt bytes) +{ + domSkinRef ref = new(bytes) domSkin; + ref->attrSource.setContainer( (domSkin*)ref ); + return ref; +} + + +daeMetaElement * +domSkin::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "skin" ); + _Meta->registerClass(domSkin::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 0, 1 ); + mea->setName( "bind_shape_matrix" ); + mea->setOffset( daeOffsetOf(domSkin,elemBind_shape_matrix) ); + mea->setElementType( domSkin::domBind_shape_matrix::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 1, 3, -1 ); + mea->setName( "source" ); + mea->setOffset( daeOffsetOf(domSkin,elemSource_array) ); + mea->setElementType( domSource::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 2, 1, 1 ); + mea->setName( "joints" ); + mea->setOffset( daeOffsetOf(domSkin,elemJoints) ); + mea->setElementType( domSkin::domJoints::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 3, 1, 1 ); + mea->setName( "vertex_weights" ); + mea->setOffset( daeOffsetOf(domSkin,elemVertex_weights) ); + mea->setElementType( domSkin::domVertex_weights::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 4, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domSkin,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 4 ); + _Meta->setCMRoot( cm ); + + // Add attribute: source + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "source" ); + ma->setType( daeAtomicType::get("xsAnyURI")); + ma->setOffset( daeOffsetOf( domSkin , attrSource )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domSkin)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domSkin::domBind_shape_matrix::create(daeInt bytes) +{ + domSkin::domBind_shape_matrixRef ref = new(bytes) domSkin::domBind_shape_matrix; + return ref; +} + + +daeMetaElement * +domSkin::domBind_shape_matrix::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "bind_shape_matrix" ); + _Meta->registerClass(domSkin::domBind_shape_matrix::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Float4x4")); + ma->setOffset( daeOffsetOf( domSkin::domBind_shape_matrix , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domSkin::domBind_shape_matrix)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domSkin::domJoints::create(daeInt bytes) +{ + domSkin::domJointsRef ref = new(bytes) domSkin::domJoints; + return ref; +} + + +daeMetaElement * +domSkin::domJoints::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "joints" ); + _Meta->registerClass(domSkin::domJoints::create, &_Meta); + + _Meta->setIsInnerClass( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 2, -1 ); + mea->setName( "input" ); + mea->setOffset( daeOffsetOf(domSkin::domJoints,elemInput_array) ); + mea->setElementType( domInputLocal::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 1, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domSkin::domJoints,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 1 ); + _Meta->setCMRoot( cm ); + + + _Meta->setElementSize(sizeof(domSkin::domJoints)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domSkin::domVertex_weights::create(daeInt bytes) +{ + domSkin::domVertex_weightsRef ref = new(bytes) domSkin::domVertex_weights; + return ref; +} + + +daeMetaElement * +domSkin::domVertex_weights::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "vertex_weights" ); + _Meta->registerClass(domSkin::domVertex_weights::create, &_Meta); + + _Meta->setIsInnerClass( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 2, -1 ); + mea->setName( "input" ); + mea->setOffset( daeOffsetOf(domSkin::domVertex_weights,elemInput_array) ); + mea->setElementType( domInputLocalOffset::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 0, 1 ); + mea->setName( "vcount" ); + mea->setOffset( daeOffsetOf(domSkin::domVertex_weights,elemVcount) ); + mea->setElementType( domSkin::domVertex_weights::domVcount::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 2, 0, 1 ); + mea->setName( "v" ); + mea->setOffset( daeOffsetOf(domSkin::domVertex_weights,elemV) ); + mea->setElementType( domSkin::domVertex_weights::domV::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 3, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domSkin::domVertex_weights,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 3 ); + _Meta->setCMRoot( cm ); + + // Add attribute: count + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "count" ); + ma->setType( daeAtomicType::get("Uint")); + ma->setOffset( daeOffsetOf( domSkin::domVertex_weights , attrCount )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domSkin::domVertex_weights)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domSkin::domVertex_weights::domVcount::create(daeInt bytes) +{ + domSkin::domVertex_weights::domVcountRef ref = new(bytes) domSkin::domVertex_weights::domVcount; + return ref; +} + + +daeMetaElement * +domSkin::domVertex_weights::domVcount::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "vcount" ); + _Meta->registerClass(domSkin::domVertex_weights::domVcount::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("ListOfUInts")); + ma->setOffset( daeOffsetOf( domSkin::domVertex_weights::domVcount , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domSkin::domVertex_weights::domVcount)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domSkin::domVertex_weights::domV::create(daeInt bytes) +{ + domSkin::domVertex_weights::domVRef ref = new(bytes) domSkin::domVertex_weights::domV; + return ref; +} + + +daeMetaElement * +domSkin::domVertex_weights::domV::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "v" ); + _Meta->registerClass(domSkin::domVertex_weights::domV::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("ListOfInts")); + ma->setOffset( daeOffsetOf( domSkin::domVertex_weights::domV , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domSkin::domVertex_weights::domV)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domSkin::_Meta = NULL; +daeMetaElement * domSkin::domBind_shape_matrix::_Meta = NULL; +daeMetaElement * domSkin::domJoints::_Meta = NULL; +daeMetaElement * domSkin::domVertex_weights::_Meta = NULL; +daeMetaElement * domSkin::domVertex_weights::domVcount::_Meta = NULL; +daeMetaElement * domSkin::domVertex_weights::domV::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domSource.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domSource.cpp new file mode 100644 index 00000000..633c8178 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domSource.cpp @@ -0,0 +1,177 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domSource::create(daeInt bytes) +{ + domSourceRef ref = new(bytes) domSource; + return ref; +} + + +daeMetaElement * +domSource::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "source" ); + _Meta->registerClass(domSource::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 0, 1 ); + mea->setName( "asset" ); + mea->setOffset( daeOffsetOf(domSource,elemAsset) ); + mea->setElementType( domAsset::registerElement() ); + cm->appendChild( mea ); + + cm = new daeMetaChoice( _Meta, cm, 1, 0, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "IDREF_array" ); + mea->setOffset( daeOffsetOf(domSource,elemIDREF_array) ); + mea->setElementType( domIDREF_array::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "Name_array" ); + mea->setOffset( daeOffsetOf(domSource,elemName_array) ); + mea->setElementType( domName_array::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "bool_array" ); + mea->setOffset( daeOffsetOf(domSource,elemBool_array) ); + mea->setElementType( domBool_array::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "float_array" ); + mea->setOffset( daeOffsetOf(domSource,elemFloat_array) ); + mea->setElementType( domFloat_array::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "int_array" ); + mea->setOffset( daeOffsetOf(domSource,elemInt_array) ); + mea->setElementType( domInt_array::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + cm->getParent()->appendChild( cm ); + cm = cm->getParent(); + + mea = new daeMetaElementAttribute( _Meta, cm, 2, 0, 1 ); + mea->setName( "technique_common" ); + mea->setOffset( daeOffsetOf(domSource,elemTechnique_common) ); + mea->setElementType( domSource::domTechnique_common::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 3, 0, -1 ); + mea->setName( "technique" ); + mea->setOffset( daeOffsetOf(domSource,elemTechnique_array) ); + mea->setElementType( domTechnique::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 3 ); + _Meta->setCMRoot( cm ); + // Ordered list of sub-elements + _Meta->addContents(daeOffsetOf(domSource,_contents)); + _Meta->addContentsOrder(daeOffsetOf(domSource,_contentsOrder)); + + + // Add attribute: id + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "id" ); + ma->setType( daeAtomicType::get("xsID")); + ma->setOffset( daeOffsetOf( domSource , attrId )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: name + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "name" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domSource , attrName )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domSource)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domSource::domTechnique_common::create(daeInt bytes) +{ + domSource::domTechnique_commonRef ref = new(bytes) domSource::domTechnique_common; + return ref; +} + + +daeMetaElement * +domSource::domTechnique_common::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "technique_common" ); + _Meta->registerClass(domSource::domTechnique_common::create, &_Meta); + + _Meta->setIsInnerClass( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "accessor" ); + mea->setOffset( daeOffsetOf(domSource::domTechnique_common,elemAccessor) ); + mea->setElementType( domAccessor::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + _Meta->setCMRoot( cm ); + + + _Meta->setElementSize(sizeof(domSource::domTechnique_common)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domSource::_Meta = NULL; +daeMetaElement * domSource::domTechnique_common::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domSphere.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domSphere.cpp new file mode 100644 index 00000000..972caf10 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domSphere.cpp @@ -0,0 +1,105 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domSphere::create(daeInt bytes) +{ + domSphereRef ref = new(bytes) domSphere; + return ref; +} + + +daeMetaElement * +domSphere::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "sphere" ); + _Meta->registerClass(domSphere::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "radius" ); + mea->setOffset( daeOffsetOf(domSphere,elemRadius) ); + mea->setElementType( domSphere::domRadius::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 1, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domSphere,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 1 ); + _Meta->setCMRoot( cm ); + + + _Meta->setElementSize(sizeof(domSphere)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domSphere::domRadius::create(daeInt bytes) +{ + domSphere::domRadiusRef ref = new(bytes) domSphere::domRadius; + return ref; +} + + +daeMetaElement * +domSphere::domRadius::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "radius" ); + _Meta->registerClass(domSphere::domRadius::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Float")); + ma->setOffset( daeOffsetOf( domSphere::domRadius , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domSphere::domRadius)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domSphere::_Meta = NULL; +daeMetaElement * domSphere::domRadius::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domSpline.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domSpline.cpp new file mode 100644 index 00000000..e1cc9075 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domSpline.cpp @@ -0,0 +1,132 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domSpline::create(daeInt bytes) +{ + domSplineRef ref = new(bytes) domSpline; + return ref; +} + + +daeMetaElement * +domSpline::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "spline" ); + _Meta->registerClass(domSpline::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, -1 ); + mea->setName( "source" ); + mea->setOffset( daeOffsetOf(domSpline,elemSource_array) ); + mea->setElementType( domSource::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 1, 1 ); + mea->setName( "control_vertices" ); + mea->setOffset( daeOffsetOf(domSpline,elemControl_vertices) ); + mea->setElementType( domSpline::domControl_vertices::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 2, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domSpline,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 2 ); + _Meta->setCMRoot( cm ); + + // Add attribute: closed + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "closed" ); + ma->setType( daeAtomicType::get("Bool")); + ma->setOffset( daeOffsetOf( domSpline , attrClosed )); + ma->setContainer( _Meta ); + ma->setDefault( "false"); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domSpline)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domSpline::domControl_vertices::create(daeInt bytes) +{ + domSpline::domControl_verticesRef ref = new(bytes) domSpline::domControl_vertices; + return ref; +} + + +daeMetaElement * +domSpline::domControl_vertices::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "control_vertices" ); + _Meta->registerClass(domSpline::domControl_vertices::create, &_Meta); + + _Meta->setIsInnerClass( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, -1 ); + mea->setName( "input" ); + mea->setOffset( daeOffsetOf(domSpline::domControl_vertices,elemInput_array) ); + mea->setElementType( domInputLocal::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 1, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domSpline::domControl_vertices,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 1 ); + _Meta->setCMRoot( cm ); + + + _Meta->setElementSize(sizeof(domSpline::domControl_vertices)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domSpline::_Meta = NULL; +daeMetaElement * domSpline::domControl_vertices::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domTapered_capsule.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domTapered_capsule.cpp new file mode 100644 index 00000000..1410fc09 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domTapered_capsule.cpp @@ -0,0 +1,189 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domTapered_capsule::create(daeInt bytes) +{ + domTapered_capsuleRef ref = new(bytes) domTapered_capsule; + return ref; +} + + +daeMetaElement * +domTapered_capsule::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "tapered_capsule" ); + _Meta->registerClass(domTapered_capsule::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "height" ); + mea->setOffset( daeOffsetOf(domTapered_capsule,elemHeight) ); + mea->setElementType( domTapered_capsule::domHeight::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 1, 1 ); + mea->setName( "radius1" ); + mea->setOffset( daeOffsetOf(domTapered_capsule,elemRadius1) ); + mea->setElementType( domTapered_capsule::domRadius1::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 2, 1, 1 ); + mea->setName( "radius2" ); + mea->setOffset( daeOffsetOf(domTapered_capsule,elemRadius2) ); + mea->setElementType( domTapered_capsule::domRadius2::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 3, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domTapered_capsule,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 3 ); + _Meta->setCMRoot( cm ); + + + _Meta->setElementSize(sizeof(domTapered_capsule)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domTapered_capsule::domHeight::create(daeInt bytes) +{ + domTapered_capsule::domHeightRef ref = new(bytes) domTapered_capsule::domHeight; + return ref; +} + + +daeMetaElement * +domTapered_capsule::domHeight::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "height" ); + _Meta->registerClass(domTapered_capsule::domHeight::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Float")); + ma->setOffset( daeOffsetOf( domTapered_capsule::domHeight , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domTapered_capsule::domHeight)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domTapered_capsule::domRadius1::create(daeInt bytes) +{ + domTapered_capsule::domRadius1Ref ref = new(bytes) domTapered_capsule::domRadius1; + return ref; +} + + +daeMetaElement * +domTapered_capsule::domRadius1::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "radius1" ); + _Meta->registerClass(domTapered_capsule::domRadius1::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Float2")); + ma->setOffset( daeOffsetOf( domTapered_capsule::domRadius1 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domTapered_capsule::domRadius1)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domTapered_capsule::domRadius2::create(daeInt bytes) +{ + domTapered_capsule::domRadius2Ref ref = new(bytes) domTapered_capsule::domRadius2; + return ref; +} + + +daeMetaElement * +domTapered_capsule::domRadius2::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "radius2" ); + _Meta->registerClass(domTapered_capsule::domRadius2::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Float2")); + ma->setOffset( daeOffsetOf( domTapered_capsule::domRadius2 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domTapered_capsule::domRadius2)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domTapered_capsule::_Meta = NULL; +daeMetaElement * domTapered_capsule::domHeight::_Meta = NULL; +daeMetaElement * domTapered_capsule::domRadius1::_Meta = NULL; +daeMetaElement * domTapered_capsule::domRadius2::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domTapered_cylinder.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domTapered_cylinder.cpp new file mode 100644 index 00000000..10b6ff3e --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domTapered_cylinder.cpp @@ -0,0 +1,189 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domTapered_cylinder::create(daeInt bytes) +{ + domTapered_cylinderRef ref = new(bytes) domTapered_cylinder; + return ref; +} + + +daeMetaElement * +domTapered_cylinder::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "tapered_cylinder" ); + _Meta->registerClass(domTapered_cylinder::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 1, 1 ); + mea->setName( "height" ); + mea->setOffset( daeOffsetOf(domTapered_cylinder,elemHeight) ); + mea->setElementType( domTapered_cylinder::domHeight::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 1, 1 ); + mea->setName( "radius1" ); + mea->setOffset( daeOffsetOf(domTapered_cylinder,elemRadius1) ); + mea->setElementType( domTapered_cylinder::domRadius1::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 2, 1, 1 ); + mea->setName( "radius2" ); + mea->setOffset( daeOffsetOf(domTapered_cylinder,elemRadius2) ); + mea->setElementType( domTapered_cylinder::domRadius2::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 3, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domTapered_cylinder,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 3 ); + _Meta->setCMRoot( cm ); + + + _Meta->setElementSize(sizeof(domTapered_cylinder)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domTapered_cylinder::domHeight::create(daeInt bytes) +{ + domTapered_cylinder::domHeightRef ref = new(bytes) domTapered_cylinder::domHeight; + return ref; +} + + +daeMetaElement * +domTapered_cylinder::domHeight::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "height" ); + _Meta->registerClass(domTapered_cylinder::domHeight::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Float")); + ma->setOffset( daeOffsetOf( domTapered_cylinder::domHeight , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domTapered_cylinder::domHeight)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domTapered_cylinder::domRadius1::create(daeInt bytes) +{ + domTapered_cylinder::domRadius1Ref ref = new(bytes) domTapered_cylinder::domRadius1; + return ref; +} + + +daeMetaElement * +domTapered_cylinder::domRadius1::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "radius1" ); + _Meta->registerClass(domTapered_cylinder::domRadius1::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Float2")); + ma->setOffset( daeOffsetOf( domTapered_cylinder::domRadius1 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domTapered_cylinder::domRadius1)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domTapered_cylinder::domRadius2::create(daeInt bytes) +{ + domTapered_cylinder::domRadius2Ref ref = new(bytes) domTapered_cylinder::domRadius2; + return ref; +} + + +daeMetaElement * +domTapered_cylinder::domRadius2::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "radius2" ); + _Meta->registerClass(domTapered_cylinder::domRadius2::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Float2")); + ma->setOffset( daeOffsetOf( domTapered_cylinder::domRadius2 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domTapered_cylinder::domRadius2)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domTapered_cylinder::_Meta = NULL; +daeMetaElement * domTapered_cylinder::domHeight::_Meta = NULL; +daeMetaElement * domTapered_cylinder::domRadius1::_Meta = NULL; +daeMetaElement * domTapered_cylinder::domRadius2::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domTargetableFloat.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domTargetableFloat.cpp new file mode 100644 index 00000000..1eebd615 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domTargetableFloat.cpp @@ -0,0 +1,71 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domTargetableFloat::create(daeInt bytes) +{ + domTargetableFloatRef ref = new(bytes) domTargetableFloat; + return ref; +} + + +daeMetaElement * +domTargetableFloat::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "TargetableFloat" ); + _Meta->registerClass(domTargetableFloat::create, &_Meta); + + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Float")); + ma->setOffset( daeOffsetOf( domTargetableFloat , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + // Add attribute: sid + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "sid" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domTargetableFloat , attrSid )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domTargetableFloat)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domTargetableFloat::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domTargetableFloat3.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domTargetableFloat3.cpp new file mode 100644 index 00000000..b876e49c --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domTargetableFloat3.cpp @@ -0,0 +1,71 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domTargetableFloat3::create(daeInt bytes) +{ + domTargetableFloat3Ref ref = new(bytes) domTargetableFloat3; + return ref; +} + + +daeMetaElement * +domTargetableFloat3::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "TargetableFloat3" ); + _Meta->registerClass(domTargetableFloat3::create, &_Meta); + + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Float3")); + ma->setOffset( daeOffsetOf( domTargetableFloat3 , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + // Add attribute: sid + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "sid" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domTargetableFloat3 , attrSid )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domTargetableFloat3)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domTargetableFloat3::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domTechnique.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domTechnique.cpp new file mode 100644 index 00000000..11b311cd --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domTechnique.cpp @@ -0,0 +1,90 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domTechnique::create(daeInt bytes) +{ + domTechniqueRef ref = new(bytes) domTechnique; + ref->attrXmlns.setContainer( (domTechnique*)ref ); + return ref; +} + + +daeMetaElement * +domTechnique::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "technique" ); + _Meta->registerClass(domTechnique::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + cm = new daeMetaAny( _Meta, cm, 0, 0, -1 ); + + cm->setMaxOrdinal( 0 ); + cm->getParent()->appendChild( cm ); + cm = cm->getParent(); + + cm->setMaxOrdinal( 0 ); + _Meta->setCMRoot( cm ); + _Meta->setAllowsAny( true ); + // Ordered list of sub-elements + _Meta->addContents(daeOffsetOf(domTechnique,_contents)); + _Meta->addContentsOrder(daeOffsetOf(domTechnique,_contentsOrder)); + + // Add attribute: xmlns + { + daeMetaAttribute* ma = new daeMetaAttribute; + ma->setName( "xmlns" ); + ma->setType( daeAtomicType::get("xsAnyURI")); + ma->setOffset( daeOffsetOf( domTechnique , attrXmlns )); + ma->setContainer( _Meta ); + //ma->setIsRequired( true ); + _Meta->appendAttribute(ma); + } + + // Add attribute: profile + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "profile" ); + ma->setType( daeAtomicType::get("xsNMTOKEN")); + ma->setOffset( daeOffsetOf( domTechnique , attrProfile )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domTechnique)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domTechnique::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domTranslate.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domTranslate.cpp new file mode 100644 index 00000000..630c5821 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domTranslate.cpp @@ -0,0 +1,71 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domTranslate::create(daeInt bytes) +{ + domTranslateRef ref = new(bytes) domTranslate; + return ref; +} + + +daeMetaElement * +domTranslate::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "translate" ); + _Meta->registerClass(domTranslate::create, &_Meta); + + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaArrayAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("Float3")); + ma->setOffset( daeOffsetOf( domTranslate , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + // Add attribute: sid + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "sid" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domTranslate , attrSid )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domTranslate)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domTranslate::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domTriangles.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domTriangles.cpp new file mode 100644 index 00000000..7d2cc0cd --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domTriangles.cpp @@ -0,0 +1,109 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domTriangles::create(daeInt bytes) +{ + domTrianglesRef ref = new(bytes) domTriangles; + return ref; +} + + +daeMetaElement * +domTriangles::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "triangles" ); + _Meta->registerClass(domTriangles::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 0, -1 ); + mea->setName( "input" ); + mea->setOffset( daeOffsetOf(domTriangles,elemInput_array) ); + mea->setElementType( domInputLocalOffset::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 0, 1 ); + mea->setName( "p" ); + mea->setOffset( daeOffsetOf(domTriangles,elemP) ); + mea->setElementType( domP::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 2, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domTriangles,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 2 ); + _Meta->setCMRoot( cm ); + + // Add attribute: name + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "name" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domTriangles , attrName )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: count + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "count" ); + ma->setType( daeAtomicType::get("Uint")); + ma->setOffset( daeOffsetOf( domTriangles , attrCount )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: material + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "material" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domTriangles , attrMaterial )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domTriangles)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domTriangles::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domTrifans.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domTrifans.cpp new file mode 100644 index 00000000..ff31efa2 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domTrifans.cpp @@ -0,0 +1,109 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domTrifans::create(daeInt bytes) +{ + domTrifansRef ref = new(bytes) domTrifans; + return ref; +} + + +daeMetaElement * +domTrifans::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "trifans" ); + _Meta->registerClass(domTrifans::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 0, -1 ); + mea->setName( "input" ); + mea->setOffset( daeOffsetOf(domTrifans,elemInput_array) ); + mea->setElementType( domInputLocalOffset::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 1, 0, -1 ); + mea->setName( "p" ); + mea->setOffset( daeOffsetOf(domTrifans,elemP_array) ); + mea->setElementType( domP::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 2, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domTrifans,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 2 ); + _Meta->setCMRoot( cm ); + + // Add attribute: name + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "name" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domTrifans , attrName )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: count + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "count" ); + ma->setType( daeAtomicType::get("Uint")); + ma->setOffset( daeOffsetOf( domTrifans , attrCount )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: material + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "material" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domTrifans , attrMaterial )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domTrifans)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domTrifans::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domTristrips.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domTristrips.cpp new file mode 100644 index 00000000..f97c77f6 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domTristrips.cpp @@ -0,0 +1,109 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domTristrips::create(daeInt bytes) +{ + domTristripsRef ref = new(bytes) domTristrips; + return ref; +} + + +daeMetaElement * +domTristrips::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "tristrips" ); + _Meta->registerClass(domTristrips::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 0, -1 ); + mea->setName( "input" ); + mea->setOffset( daeOffsetOf(domTristrips,elemInput_array) ); + mea->setElementType( domInputLocalOffset::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 1, 0, -1 ); + mea->setName( "p" ); + mea->setOffset( daeOffsetOf(domTristrips,elemP_array) ); + mea->setElementType( domP::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 2, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domTristrips,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 2 ); + _Meta->setCMRoot( cm ); + + // Add attribute: name + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "name" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domTristrips , attrName )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: count + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "count" ); + ma->setType( daeAtomicType::get("Uint")); + ma->setOffset( daeOffsetOf( domTristrips , attrCount )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: material + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "material" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domTristrips , attrMaterial )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domTristrips)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domTristrips::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domTypes.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domTypes.cpp new file mode 100644 index 00000000..9e667358 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domTypes.cpp @@ -0,0 +1,2937 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + + +#include +#include +#include + + +void registerDomTypes() +{ + + daeAtomicType* type = NULL; + // TYPEDEF: Bool //check if this type has an existing base + type = daeAtomicType::get("xsBoolean"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Bool"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Bool"); + } + + // TYPEDEF: DateTime //check if this type has an existing base + type = daeAtomicType::get("xsDateTime"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("DateTime"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("DateTime"); + } + + // TYPEDEF: Float //check if this type has an existing base + type = daeAtomicType::get("xsDouble"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Float"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Float"); + } + + // TYPEDEF: Int //check if this type has an existing base + type = daeAtomicType::get("xsLong"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Int"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Int"); + } + + // TYPEDEF: Name //check if this type has an existing base + type = daeAtomicType::get("xsName"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Name"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Name"); + } + + // TYPEDEF: String //check if this type has an existing base + type = daeAtomicType::get("xsString"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("String"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("String"); + } + + // TYPEDEF: Token //check if this type has an existing base + type = daeAtomicType::get("xsToken"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Token"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Token"); + } + + // TYPEDEF: Uint //check if this type has an existing base + type = daeAtomicType::get("xsUnsignedLong"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Uint"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Uint"); + } + + // TYPEDEF: ListOfBools //check if this type has an existing base + type = daeAtomicType::get("Bool"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("ListOfBools"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("ListOfBools"); + } + + // TYPEDEF: ListOfFloats //check if this type has an existing base + type = daeAtomicType::get("Float"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("ListOfFloats"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("ListOfFloats"); + } + + // TYPEDEF: ListOfHexBinary //check if this type has an existing base + type = daeAtomicType::get("xsHexBinary"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("ListOfHexBinary"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("ListOfHexBinary"); + } + + // TYPEDEF: ListOfInts //check if this type has an existing base + type = daeAtomicType::get("Int"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("ListOfInts"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("ListOfInts"); + } + + // TYPEDEF: ListOfNames //check if this type has an existing base + type = daeAtomicType::get("Name"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("ListOfNames"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("ListOfNames"); + } + + // TYPEDEF: ListOfTokens //check if this type has an existing base + type = daeAtomicType::get("Token"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("ListOfTokens"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("ListOfTokens"); + } + + // TYPEDEF: ListOfUInts //check if this type has an existing base + type = daeAtomicType::get("Uint"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("ListOfUInts"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("ListOfUInts"); + } + + // TYPEDEF: Bool2 //check if this type has an existing base + type = daeAtomicType::get("ListOfBools"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Bool2"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Bool2"); + } + + // TYPEDEF: Bool3 //check if this type has an existing base + type = daeAtomicType::get("ListOfBools"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Bool3"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Bool3"); + } + + // TYPEDEF: Bool4 //check if this type has an existing base + type = daeAtomicType::get("ListOfBools"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Bool4"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Bool4"); + } + + // TYPEDEF: Float2 //check if this type has an existing base + type = daeAtomicType::get("ListOfFloats"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Float2"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Float2"); + } + + // TYPEDEF: Float3 //check if this type has an existing base + type = daeAtomicType::get("ListOfFloats"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Float3"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Float3"); + } + + // TYPEDEF: Float4 //check if this type has an existing base + type = daeAtomicType::get("ListOfFloats"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Float4"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Float4"); + } + + // TYPEDEF: Float7 //check if this type has an existing base + type = daeAtomicType::get("ListOfFloats"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Float7"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Float7"); + } + + // TYPEDEF: Float2x2 //check if this type has an existing base + type = daeAtomicType::get("ListOfFloats"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Float2x2"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Float2x2"); + } + + // TYPEDEF: Float3x3 //check if this type has an existing base + type = daeAtomicType::get("ListOfFloats"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Float3x3"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Float3x3"); + } + + // TYPEDEF: Float4x4 //check if this type has an existing base + type = daeAtomicType::get("ListOfFloats"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Float4x4"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Float4x4"); + } + + // TYPEDEF: Float2x3 //check if this type has an existing base + type = daeAtomicType::get("ListOfFloats"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Float2x3"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Float2x3"); + } + + // TYPEDEF: Float2x4 //check if this type has an existing base + type = daeAtomicType::get("ListOfFloats"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Float2x4"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Float2x4"); + } + + // TYPEDEF: Float3x2 //check if this type has an existing base + type = daeAtomicType::get("ListOfFloats"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Float3x2"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Float3x2"); + } + + // TYPEDEF: Float3x4 //check if this type has an existing base + type = daeAtomicType::get("ListOfFloats"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Float3x4"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Float3x4"); + } + + // TYPEDEF: Float4x2 //check if this type has an existing base + type = daeAtomicType::get("ListOfFloats"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Float4x2"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Float4x2"); + } + + // TYPEDEF: Float4x3 //check if this type has an existing base + type = daeAtomicType::get("ListOfFloats"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Float4x3"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Float4x3"); + } + + // TYPEDEF: Int2 //check if this type has an existing base + type = daeAtomicType::get("ListOfInts"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Int2"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Int2"); + } + + // TYPEDEF: Int3 //check if this type has an existing base + type = daeAtomicType::get("ListOfInts"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Int3"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Int3"); + } + + // TYPEDEF: Int4 //check if this type has an existing base + type = daeAtomicType::get("ListOfInts"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Int4"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Int4"); + } + + // TYPEDEF: Int2x2 //check if this type has an existing base + type = daeAtomicType::get("ListOfInts"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Int2x2"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Int2x2"); + } + + // TYPEDEF: Int3x3 //check if this type has an existing base + type = daeAtomicType::get("ListOfInts"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Int3x3"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Int3x3"); + } + + // TYPEDEF: Int4x4 //check if this type has an existing base + type = daeAtomicType::get("ListOfInts"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Int4x4"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Int4x4"); + } + + // ENUM: MorphMethodType + type = new daeEnumType; + type->_nameBindings.append("MorphMethodType"); + ((daeEnumType*)type)->_strings = new daeStringRefArray; + ((daeEnumType*)type)->_values = new daeEnumArray; + ((daeEnumType*)type)->_strings->append("NORMALIZED"); + ((daeEnumType*)type)->_values->append(MORPHMETHODTYPE_NORMALIZED); + ((daeEnumType*)type)->_strings->append("RELATIVE"); + ((daeEnumType*)type)->_values->append(MORPHMETHODTYPE_RELATIVE); + daeAtomicType::append( type ); + + // ENUM: NodeType + type = new daeEnumType; + type->_nameBindings.append("NodeType"); + ((daeEnumType*)type)->_strings = new daeStringRefArray; + ((daeEnumType*)type)->_values = new daeEnumArray; + ((daeEnumType*)type)->_strings->append("JOINT"); + ((daeEnumType*)type)->_values->append(NODETYPE_JOINT); + ((daeEnumType*)type)->_strings->append("NODE"); + ((daeEnumType*)type)->_values->append(NODETYPE_NODE); + daeAtomicType::append( type ); + + // TYPEDEF: URIFragmentType //check if this type has an existing base + type = daeAtomicType::get("xsAnyURI"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("URIFragmentType"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("URIFragmentType"); + } + + // ENUM: UpAxisType + type = new daeEnumType; + type->_nameBindings.append("UpAxisType"); + ((daeEnumType*)type)->_strings = new daeStringRefArray; + ((daeEnumType*)type)->_values = new daeEnumArray; + ((daeEnumType*)type)->_strings->append("X_UP"); + ((daeEnumType*)type)->_values->append(UPAXISTYPE_X_UP); + ((daeEnumType*)type)->_strings->append("Y_UP"); + ((daeEnumType*)type)->_values->append(UPAXISTYPE_Y_UP); + ((daeEnumType*)type)->_strings->append("Z_UP"); + ((daeEnumType*)type)->_values->append(UPAXISTYPE_Z_UP); + daeAtomicType::append( type ); + + // ENUM: VersionType + type = new daeEnumType; + type->_nameBindings.append("VersionType"); + ((daeEnumType*)type)->_strings = new daeStringRefArray; + ((daeEnumType*)type)->_values = new daeEnumArray; + ((daeEnumType*)type)->_strings->append("1.4.0"); + ((daeEnumType*)type)->_values->append(VERSIONTYPE_1_4_0); + ((daeEnumType*)type)->_strings->append("1.4.1"); + ((daeEnumType*)type)->_values->append(VERSIONTYPE_1_4_1); + daeAtomicType::append( type ); + + // TYPEDEF: Fx_color_common //check if this type has an existing base + type = daeAtomicType::get("Float4"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Fx_color_common"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Fx_color_common"); + } + + // ENUM: Fx_opaque_enum + type = new daeEnumType; + type->_nameBindings.append("Fx_opaque_enum"); + ((daeEnumType*)type)->_strings = new daeStringRefArray; + ((daeEnumType*)type)->_values = new daeEnumArray; + ((daeEnumType*)type)->_strings->append("A_ONE"); + ((daeEnumType*)type)->_values->append(FX_OPAQUE_ENUM_A_ONE); + ((daeEnumType*)type)->_strings->append("RGB_ZERO"); + ((daeEnumType*)type)->_values->append(FX_OPAQUE_ENUM_RGB_ZERO); + daeAtomicType::append( type ); + + // ENUM: Fx_surface_type_enum + type = new daeEnumType; + type->_nameBindings.append("Fx_surface_type_enum"); + ((daeEnumType*)type)->_strings = new daeStringRefArray; + ((daeEnumType*)type)->_values = new daeEnumArray; + ((daeEnumType*)type)->_strings->append("UNTYPED"); + ((daeEnumType*)type)->_values->append(FX_SURFACE_TYPE_ENUM_UNTYPED); + ((daeEnumType*)type)->_strings->append("1D"); + ((daeEnumType*)type)->_values->append(FX_SURFACE_TYPE_ENUM_1D); + ((daeEnumType*)type)->_strings->append("2D"); + ((daeEnumType*)type)->_values->append(FX_SURFACE_TYPE_ENUM_2D); + ((daeEnumType*)type)->_strings->append("3D"); + ((daeEnumType*)type)->_values->append(FX_SURFACE_TYPE_ENUM_3D); + ((daeEnumType*)type)->_strings->append("RECT"); + ((daeEnumType*)type)->_values->append(FX_SURFACE_TYPE_ENUM_RECT); + ((daeEnumType*)type)->_strings->append("CUBE"); + ((daeEnumType*)type)->_values->append(FX_SURFACE_TYPE_ENUM_CUBE); + ((daeEnumType*)type)->_strings->append("DEPTH"); + ((daeEnumType*)type)->_values->append(FX_SURFACE_TYPE_ENUM_DEPTH); + daeAtomicType::append( type ); + + // ENUM: Fx_surface_face_enum + type = new daeEnumType; + type->_nameBindings.append("Fx_surface_face_enum"); + ((daeEnumType*)type)->_strings = new daeStringRefArray; + ((daeEnumType*)type)->_values = new daeEnumArray; + ((daeEnumType*)type)->_strings->append("POSITIVE_X"); + ((daeEnumType*)type)->_values->append(FX_SURFACE_FACE_ENUM_POSITIVE_X); + ((daeEnumType*)type)->_strings->append("NEGATIVE_X"); + ((daeEnumType*)type)->_values->append(FX_SURFACE_FACE_ENUM_NEGATIVE_X); + ((daeEnumType*)type)->_strings->append("POSITIVE_Y"); + ((daeEnumType*)type)->_values->append(FX_SURFACE_FACE_ENUM_POSITIVE_Y); + ((daeEnumType*)type)->_strings->append("NEGATIVE_Y"); + ((daeEnumType*)type)->_values->append(FX_SURFACE_FACE_ENUM_NEGATIVE_Y); + ((daeEnumType*)type)->_strings->append("POSITIVE_Z"); + ((daeEnumType*)type)->_values->append(FX_SURFACE_FACE_ENUM_POSITIVE_Z); + ((daeEnumType*)type)->_strings->append("NEGATIVE_Z"); + ((daeEnumType*)type)->_values->append(FX_SURFACE_FACE_ENUM_NEGATIVE_Z); + daeAtomicType::append( type ); + + // ENUM: Fx_surface_format_hint_channels_enum + type = new daeEnumType; + type->_nameBindings.append("Fx_surface_format_hint_channels_enum"); + ((daeEnumType*)type)->_strings = new daeStringRefArray; + ((daeEnumType*)type)->_values = new daeEnumArray; + ((daeEnumType*)type)->_strings->append("RGB"); + ((daeEnumType*)type)->_values->append(FX_SURFACE_FORMAT_HINT_CHANNELS_ENUM_RGB); + ((daeEnumType*)type)->_strings->append("RGBA"); + ((daeEnumType*)type)->_values->append(FX_SURFACE_FORMAT_HINT_CHANNELS_ENUM_RGBA); + ((daeEnumType*)type)->_strings->append("L"); + ((daeEnumType*)type)->_values->append(FX_SURFACE_FORMAT_HINT_CHANNELS_ENUM_L); + ((daeEnumType*)type)->_strings->append("LA"); + ((daeEnumType*)type)->_values->append(FX_SURFACE_FORMAT_HINT_CHANNELS_ENUM_LA); + ((daeEnumType*)type)->_strings->append("D"); + ((daeEnumType*)type)->_values->append(FX_SURFACE_FORMAT_HINT_CHANNELS_ENUM_D); + ((daeEnumType*)type)->_strings->append("XYZ"); + ((daeEnumType*)type)->_values->append(FX_SURFACE_FORMAT_HINT_CHANNELS_ENUM_XYZ); + ((daeEnumType*)type)->_strings->append("XYZW"); + ((daeEnumType*)type)->_values->append(FX_SURFACE_FORMAT_HINT_CHANNELS_ENUM_XYZW); + daeAtomicType::append( type ); + + // ENUM: Fx_surface_format_hint_precision_enum + type = new daeEnumType; + type->_nameBindings.append("Fx_surface_format_hint_precision_enum"); + ((daeEnumType*)type)->_strings = new daeStringRefArray; + ((daeEnumType*)type)->_values = new daeEnumArray; + ((daeEnumType*)type)->_strings->append("LOW"); + ((daeEnumType*)type)->_values->append(FX_SURFACE_FORMAT_HINT_PRECISION_ENUM_LOW); + ((daeEnumType*)type)->_strings->append("MID"); + ((daeEnumType*)type)->_values->append(FX_SURFACE_FORMAT_HINT_PRECISION_ENUM_MID); + ((daeEnumType*)type)->_strings->append("HIGH"); + ((daeEnumType*)type)->_values->append(FX_SURFACE_FORMAT_HINT_PRECISION_ENUM_HIGH); + daeAtomicType::append( type ); + + // ENUM: Fx_surface_format_hint_range_enum + type = new daeEnumType; + type->_nameBindings.append("Fx_surface_format_hint_range_enum"); + ((daeEnumType*)type)->_strings = new daeStringRefArray; + ((daeEnumType*)type)->_values = new daeEnumArray; + ((daeEnumType*)type)->_strings->append("SNORM"); + ((daeEnumType*)type)->_values->append(FX_SURFACE_FORMAT_HINT_RANGE_ENUM_SNORM); + ((daeEnumType*)type)->_strings->append("UNORM"); + ((daeEnumType*)type)->_values->append(FX_SURFACE_FORMAT_HINT_RANGE_ENUM_UNORM); + ((daeEnumType*)type)->_strings->append("SINT"); + ((daeEnumType*)type)->_values->append(FX_SURFACE_FORMAT_HINT_RANGE_ENUM_SINT); + ((daeEnumType*)type)->_strings->append("UINT"); + ((daeEnumType*)type)->_values->append(FX_SURFACE_FORMAT_HINT_RANGE_ENUM_UINT); + ((daeEnumType*)type)->_strings->append("FLOAT"); + ((daeEnumType*)type)->_values->append(FX_SURFACE_FORMAT_HINT_RANGE_ENUM_FLOAT); + daeAtomicType::append( type ); + + // ENUM: Fx_surface_format_hint_option_enum + type = new daeEnumType; + type->_nameBindings.append("Fx_surface_format_hint_option_enum"); + ((daeEnumType*)type)->_strings = new daeStringRefArray; + ((daeEnumType*)type)->_values = new daeEnumArray; + ((daeEnumType*)type)->_strings->append("SRGB_GAMMA"); + ((daeEnumType*)type)->_values->append(FX_SURFACE_FORMAT_HINT_OPTION_ENUM_SRGB_GAMMA); + ((daeEnumType*)type)->_strings->append("NORMALIZED3"); + ((daeEnumType*)type)->_values->append(FX_SURFACE_FORMAT_HINT_OPTION_ENUM_NORMALIZED3); + ((daeEnumType*)type)->_strings->append("NORMALIZED4"); + ((daeEnumType*)type)->_values->append(FX_SURFACE_FORMAT_HINT_OPTION_ENUM_NORMALIZED4); + ((daeEnumType*)type)->_strings->append("COMPRESSABLE"); + ((daeEnumType*)type)->_values->append(FX_SURFACE_FORMAT_HINT_OPTION_ENUM_COMPRESSABLE); + daeAtomicType::append( type ); + + // ENUM: Fx_sampler_wrap_common + type = new daeEnumType; + type->_nameBindings.append("Fx_sampler_wrap_common"); + ((daeEnumType*)type)->_strings = new daeStringRefArray; + ((daeEnumType*)type)->_values = new daeEnumArray; + ((daeEnumType*)type)->_strings->append("NONE"); + ((daeEnumType*)type)->_values->append(FX_SAMPLER_WRAP_COMMON_NONE); + ((daeEnumType*)type)->_strings->append("WRAP"); + ((daeEnumType*)type)->_values->append(FX_SAMPLER_WRAP_COMMON_WRAP); + ((daeEnumType*)type)->_strings->append("MIRROR"); + ((daeEnumType*)type)->_values->append(FX_SAMPLER_WRAP_COMMON_MIRROR); + ((daeEnumType*)type)->_strings->append("CLAMP"); + ((daeEnumType*)type)->_values->append(FX_SAMPLER_WRAP_COMMON_CLAMP); + ((daeEnumType*)type)->_strings->append("BORDER"); + ((daeEnumType*)type)->_values->append(FX_SAMPLER_WRAP_COMMON_BORDER); + daeAtomicType::append( type ); + + // ENUM: Fx_sampler_filter_common + type = new daeEnumType; + type->_nameBindings.append("Fx_sampler_filter_common"); + ((daeEnumType*)type)->_strings = new daeStringRefArray; + ((daeEnumType*)type)->_values = new daeEnumArray; + ((daeEnumType*)type)->_strings->append("NONE"); + ((daeEnumType*)type)->_values->append(FX_SAMPLER_FILTER_COMMON_NONE); + ((daeEnumType*)type)->_strings->append("NEAREST"); + ((daeEnumType*)type)->_values->append(FX_SAMPLER_FILTER_COMMON_NEAREST); + ((daeEnumType*)type)->_strings->append("LINEAR"); + ((daeEnumType*)type)->_values->append(FX_SAMPLER_FILTER_COMMON_LINEAR); + ((daeEnumType*)type)->_strings->append("NEAREST_MIPMAP_NEAREST"); + ((daeEnumType*)type)->_values->append(FX_SAMPLER_FILTER_COMMON_NEAREST_MIPMAP_NEAREST); + ((daeEnumType*)type)->_strings->append("LINEAR_MIPMAP_NEAREST"); + ((daeEnumType*)type)->_values->append(FX_SAMPLER_FILTER_COMMON_LINEAR_MIPMAP_NEAREST); + ((daeEnumType*)type)->_strings->append("NEAREST_MIPMAP_LINEAR"); + ((daeEnumType*)type)->_values->append(FX_SAMPLER_FILTER_COMMON_NEAREST_MIPMAP_LINEAR); + ((daeEnumType*)type)->_strings->append("LINEAR_MIPMAP_LINEAR"); + ((daeEnumType*)type)->_values->append(FX_SAMPLER_FILTER_COMMON_LINEAR_MIPMAP_LINEAR); + daeAtomicType::append( type ); + + // ENUM: Fx_modifier_enum_common + type = new daeEnumType; + type->_nameBindings.append("Fx_modifier_enum_common"); + ((daeEnumType*)type)->_strings = new daeStringRefArray; + ((daeEnumType*)type)->_values = new daeEnumArray; + ((daeEnumType*)type)->_strings->append("CONST"); + ((daeEnumType*)type)->_values->append(FX_MODIFIER_ENUM_COMMON_CONST); + ((daeEnumType*)type)->_strings->append("UNIFORM"); + ((daeEnumType*)type)->_values->append(FX_MODIFIER_ENUM_COMMON_UNIFORM); + ((daeEnumType*)type)->_strings->append("VARYING"); + ((daeEnumType*)type)->_values->append(FX_MODIFIER_ENUM_COMMON_VARYING); + ((daeEnumType*)type)->_strings->append("STATIC"); + ((daeEnumType*)type)->_values->append(FX_MODIFIER_ENUM_COMMON_STATIC); + ((daeEnumType*)type)->_strings->append("VOLATILE"); + ((daeEnumType*)type)->_values->append(FX_MODIFIER_ENUM_COMMON_VOLATILE); + ((daeEnumType*)type)->_strings->append("EXTERN"); + ((daeEnumType*)type)->_values->append(FX_MODIFIER_ENUM_COMMON_EXTERN); + ((daeEnumType*)type)->_strings->append("SHARED"); + ((daeEnumType*)type)->_values->append(FX_MODIFIER_ENUM_COMMON_SHARED); + daeAtomicType::append( type ); + + // TYPEDEF: Fx_draw_common //check if this type has an existing base + type = daeAtomicType::get("xsString"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Fx_draw_common"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Fx_draw_common"); + } + + // ENUM: Fx_pipeline_stage_common + type = new daeEnumType; + type->_nameBindings.append("Fx_pipeline_stage_common"); + ((daeEnumType*)type)->_strings = new daeStringRefArray; + ((daeEnumType*)type)->_values = new daeEnumArray; + ((daeEnumType*)type)->_strings->append("VERTEXPROGRAM"); + ((daeEnumType*)type)->_values->append(FX_PIPELINE_STAGE_COMMON_VERTEXPROGRAM); + ((daeEnumType*)type)->_strings->append("FRAGMENTPROGRAM"); + ((daeEnumType*)type)->_values->append(FX_PIPELINE_STAGE_COMMON_FRAGMENTPROGRAM); + ((daeEnumType*)type)->_strings->append("VERTEXSHADER"); + ((daeEnumType*)type)->_values->append(FX_PIPELINE_STAGE_COMMON_VERTEXSHADER); + ((daeEnumType*)type)->_strings->append("PIXELSHADER"); + ((daeEnumType*)type)->_values->append(FX_PIPELINE_STAGE_COMMON_PIXELSHADER); + daeAtomicType::append( type ); + + // TYPEDEF: GL_MAX_LIGHTS_index //check if this type has an existing base + type = daeAtomicType::get("xsNonNegativeInteger"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("GL_MAX_LIGHTS_index"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("GL_MAX_LIGHTS_index"); + } + + // TYPEDEF: GL_MAX_CLIP_PLANES_index //check if this type has an existing base + type = daeAtomicType::get("xsNonNegativeInteger"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("GL_MAX_CLIP_PLANES_index"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("GL_MAX_CLIP_PLANES_index"); + } + + // TYPEDEF: GL_MAX_TEXTURE_IMAGE_UNITS_index //check if this type has an existing base + type = daeAtomicType::get("xsNonNegativeInteger"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("GL_MAX_TEXTURE_IMAGE_UNITS_index"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("GL_MAX_TEXTURE_IMAGE_UNITS_index"); + } + + // ENUM: Gl_blend_type + type = new daeEnumType; + type->_nameBindings.append("Gl_blend_type"); + ((daeEnumType*)type)->_strings = new daeStringRefArray; + ((daeEnumType*)type)->_values = new daeEnumArray; + ((daeEnumType*)type)->_strings->append("ZERO"); + ((daeEnumType*)type)->_values->append(GL_BLEND_TYPE_ZERO); + ((daeEnumType*)type)->_strings->append("ONE"); + ((daeEnumType*)type)->_values->append(GL_BLEND_TYPE_ONE); + ((daeEnumType*)type)->_strings->append("SRC_COLOR"); + ((daeEnumType*)type)->_values->append(GL_BLEND_TYPE_SRC_COLOR); + ((daeEnumType*)type)->_strings->append("ONE_MINUS_SRC_COLOR"); + ((daeEnumType*)type)->_values->append(GL_BLEND_TYPE_ONE_MINUS_SRC_COLOR); + ((daeEnumType*)type)->_strings->append("DEST_COLOR"); + ((daeEnumType*)type)->_values->append(GL_BLEND_TYPE_DEST_COLOR); + ((daeEnumType*)type)->_strings->append("ONE_MINUS_DEST_COLOR"); + ((daeEnumType*)type)->_values->append(GL_BLEND_TYPE_ONE_MINUS_DEST_COLOR); + ((daeEnumType*)type)->_strings->append("SRC_ALPHA"); + ((daeEnumType*)type)->_values->append(GL_BLEND_TYPE_SRC_ALPHA); + ((daeEnumType*)type)->_strings->append("ONE_MINUS_SRC_ALPHA"); + ((daeEnumType*)type)->_values->append(GL_BLEND_TYPE_ONE_MINUS_SRC_ALPHA); + ((daeEnumType*)type)->_strings->append("DST_ALPHA"); + ((daeEnumType*)type)->_values->append(GL_BLEND_TYPE_DST_ALPHA); + ((daeEnumType*)type)->_strings->append("ONE_MINUS_DST_ALPHA"); + ((daeEnumType*)type)->_values->append(GL_BLEND_TYPE_ONE_MINUS_DST_ALPHA); + ((daeEnumType*)type)->_strings->append("CONSTANT_COLOR"); + ((daeEnumType*)type)->_values->append(GL_BLEND_TYPE_CONSTANT_COLOR); + ((daeEnumType*)type)->_strings->append("ONE_MINUS_CONSTANT_COLOR"); + ((daeEnumType*)type)->_values->append(GL_BLEND_TYPE_ONE_MINUS_CONSTANT_COLOR); + ((daeEnumType*)type)->_strings->append("CONSTANT_ALPHA"); + ((daeEnumType*)type)->_values->append(GL_BLEND_TYPE_CONSTANT_ALPHA); + ((daeEnumType*)type)->_strings->append("ONE_MINUS_CONSTANT_ALPHA"); + ((daeEnumType*)type)->_values->append(GL_BLEND_TYPE_ONE_MINUS_CONSTANT_ALPHA); + ((daeEnumType*)type)->_strings->append("SRC_ALPHA_SATURATE"); + ((daeEnumType*)type)->_values->append(GL_BLEND_TYPE_SRC_ALPHA_SATURATE); + daeAtomicType::append( type ); + + // ENUM: Gl_face_type + type = new daeEnumType; + type->_nameBindings.append("Gl_face_type"); + ((daeEnumType*)type)->_strings = new daeStringRefArray; + ((daeEnumType*)type)->_values = new daeEnumArray; + ((daeEnumType*)type)->_strings->append("FRONT"); + ((daeEnumType*)type)->_values->append(GL_FACE_TYPE_FRONT); + ((daeEnumType*)type)->_strings->append("BACK"); + ((daeEnumType*)type)->_values->append(GL_FACE_TYPE_BACK); + ((daeEnumType*)type)->_strings->append("FRONT_AND_BACK"); + ((daeEnumType*)type)->_values->append(GL_FACE_TYPE_FRONT_AND_BACK); + daeAtomicType::append( type ); + + // ENUM: Gl_blend_equation_type + type = new daeEnumType; + type->_nameBindings.append("Gl_blend_equation_type"); + ((daeEnumType*)type)->_strings = new daeStringRefArray; + ((daeEnumType*)type)->_values = new daeEnumArray; + ((daeEnumType*)type)->_strings->append("FUNC_ADD"); + ((daeEnumType*)type)->_values->append(GL_BLEND_EQUATION_TYPE_FUNC_ADD); + ((daeEnumType*)type)->_strings->append("FUNC_SUBTRACT"); + ((daeEnumType*)type)->_values->append(GL_BLEND_EQUATION_TYPE_FUNC_SUBTRACT); + ((daeEnumType*)type)->_strings->append("FUNC_REVERSE_SUBTRACT"); + ((daeEnumType*)type)->_values->append(GL_BLEND_EQUATION_TYPE_FUNC_REVERSE_SUBTRACT); + ((daeEnumType*)type)->_strings->append("MIN"); + ((daeEnumType*)type)->_values->append(GL_BLEND_EQUATION_TYPE_MIN); + ((daeEnumType*)type)->_strings->append("MAX"); + ((daeEnumType*)type)->_values->append(GL_BLEND_EQUATION_TYPE_MAX); + daeAtomicType::append( type ); + + // ENUM: Gl_func_type + type = new daeEnumType; + type->_nameBindings.append("Gl_func_type"); + ((daeEnumType*)type)->_strings = new daeStringRefArray; + ((daeEnumType*)type)->_values = new daeEnumArray; + ((daeEnumType*)type)->_strings->append("NEVER"); + ((daeEnumType*)type)->_values->append(GL_FUNC_TYPE_NEVER); + ((daeEnumType*)type)->_strings->append("LESS"); + ((daeEnumType*)type)->_values->append(GL_FUNC_TYPE_LESS); + ((daeEnumType*)type)->_strings->append("LEQUAL"); + ((daeEnumType*)type)->_values->append(GL_FUNC_TYPE_LEQUAL); + ((daeEnumType*)type)->_strings->append("EQUAL"); + ((daeEnumType*)type)->_values->append(GL_FUNC_TYPE_EQUAL); + ((daeEnumType*)type)->_strings->append("GREATER"); + ((daeEnumType*)type)->_values->append(GL_FUNC_TYPE_GREATER); + ((daeEnumType*)type)->_strings->append("NOTEQUAL"); + ((daeEnumType*)type)->_values->append(GL_FUNC_TYPE_NOTEQUAL); + ((daeEnumType*)type)->_strings->append("GEQUAL"); + ((daeEnumType*)type)->_values->append(GL_FUNC_TYPE_GEQUAL); + ((daeEnumType*)type)->_strings->append("ALWAYS"); + ((daeEnumType*)type)->_values->append(GL_FUNC_TYPE_ALWAYS); + daeAtomicType::append( type ); + + // ENUM: Gl_stencil_op_type + type = new daeEnumType; + type->_nameBindings.append("Gl_stencil_op_type"); + ((daeEnumType*)type)->_strings = new daeStringRefArray; + ((daeEnumType*)type)->_values = new daeEnumArray; + ((daeEnumType*)type)->_strings->append("KEEP"); + ((daeEnumType*)type)->_values->append(GL_STENCIL_OP_TYPE_KEEP); + ((daeEnumType*)type)->_strings->append("ZERO"); + ((daeEnumType*)type)->_values->append(GL_STENCIL_OP_TYPE_ZERO); + ((daeEnumType*)type)->_strings->append("REPLACE"); + ((daeEnumType*)type)->_values->append(GL_STENCIL_OP_TYPE_REPLACE); + ((daeEnumType*)type)->_strings->append("INCR"); + ((daeEnumType*)type)->_values->append(GL_STENCIL_OP_TYPE_INCR); + ((daeEnumType*)type)->_strings->append("DECR"); + ((daeEnumType*)type)->_values->append(GL_STENCIL_OP_TYPE_DECR); + ((daeEnumType*)type)->_strings->append("INVERT"); + ((daeEnumType*)type)->_values->append(GL_STENCIL_OP_TYPE_INVERT); + ((daeEnumType*)type)->_strings->append("INCR_WRAP"); + ((daeEnumType*)type)->_values->append(GL_STENCIL_OP_TYPE_INCR_WRAP); + ((daeEnumType*)type)->_strings->append("DECR_WRAP"); + ((daeEnumType*)type)->_values->append(GL_STENCIL_OP_TYPE_DECR_WRAP); + daeAtomicType::append( type ); + + // ENUM: Gl_material_type + type = new daeEnumType; + type->_nameBindings.append("Gl_material_type"); + ((daeEnumType*)type)->_strings = new daeStringRefArray; + ((daeEnumType*)type)->_values = new daeEnumArray; + ((daeEnumType*)type)->_strings->append("EMISSION"); + ((daeEnumType*)type)->_values->append(GL_MATERIAL_TYPE_EMISSION); + ((daeEnumType*)type)->_strings->append("AMBIENT"); + ((daeEnumType*)type)->_values->append(GL_MATERIAL_TYPE_AMBIENT); + ((daeEnumType*)type)->_strings->append("DIFFUSE"); + ((daeEnumType*)type)->_values->append(GL_MATERIAL_TYPE_DIFFUSE); + ((daeEnumType*)type)->_strings->append("SPECULAR"); + ((daeEnumType*)type)->_values->append(GL_MATERIAL_TYPE_SPECULAR); + ((daeEnumType*)type)->_strings->append("AMBIENT_AND_DIFFUSE"); + ((daeEnumType*)type)->_values->append(GL_MATERIAL_TYPE_AMBIENT_AND_DIFFUSE); + daeAtomicType::append( type ); + + // ENUM: Gl_fog_type + type = new daeEnumType; + type->_nameBindings.append("Gl_fog_type"); + ((daeEnumType*)type)->_strings = new daeStringRefArray; + ((daeEnumType*)type)->_values = new daeEnumArray; + ((daeEnumType*)type)->_strings->append("LINEAR"); + ((daeEnumType*)type)->_values->append(GL_FOG_TYPE_LINEAR); + ((daeEnumType*)type)->_strings->append("EXP"); + ((daeEnumType*)type)->_values->append(GL_FOG_TYPE_EXP); + ((daeEnumType*)type)->_strings->append("EXP2"); + ((daeEnumType*)type)->_values->append(GL_FOG_TYPE_EXP2); + daeAtomicType::append( type ); + + // ENUM: Gl_fog_coord_src_type + type = new daeEnumType; + type->_nameBindings.append("Gl_fog_coord_src_type"); + ((daeEnumType*)type)->_strings = new daeStringRefArray; + ((daeEnumType*)type)->_values = new daeEnumArray; + ((daeEnumType*)type)->_strings->append("FOG_COORDINATE"); + ((daeEnumType*)type)->_values->append(GL_FOG_COORD_SRC_TYPE_FOG_COORDINATE); + ((daeEnumType*)type)->_strings->append("FRAGMENT_DEPTH"); + ((daeEnumType*)type)->_values->append(GL_FOG_COORD_SRC_TYPE_FRAGMENT_DEPTH); + daeAtomicType::append( type ); + + // ENUM: Gl_front_face_type + type = new daeEnumType; + type->_nameBindings.append("Gl_front_face_type"); + ((daeEnumType*)type)->_strings = new daeStringRefArray; + ((daeEnumType*)type)->_values = new daeEnumArray; + ((daeEnumType*)type)->_strings->append("CW"); + ((daeEnumType*)type)->_values->append(GL_FRONT_FACE_TYPE_CW); + ((daeEnumType*)type)->_strings->append("CCW"); + ((daeEnumType*)type)->_values->append(GL_FRONT_FACE_TYPE_CCW); + daeAtomicType::append( type ); + + // ENUM: Gl_light_model_color_control_type + type = new daeEnumType; + type->_nameBindings.append("Gl_light_model_color_control_type"); + ((daeEnumType*)type)->_strings = new daeStringRefArray; + ((daeEnumType*)type)->_values = new daeEnumArray; + ((daeEnumType*)type)->_strings->append("SINGLE_COLOR"); + ((daeEnumType*)type)->_values->append(GL_LIGHT_MODEL_COLOR_CONTROL_TYPE_SINGLE_COLOR); + ((daeEnumType*)type)->_strings->append("SEPARATE_SPECULAR_COLOR"); + ((daeEnumType*)type)->_values->append(GL_LIGHT_MODEL_COLOR_CONTROL_TYPE_SEPARATE_SPECULAR_COLOR); + daeAtomicType::append( type ); + + // ENUM: Gl_logic_op_type + type = new daeEnumType; + type->_nameBindings.append("Gl_logic_op_type"); + ((daeEnumType*)type)->_strings = new daeStringRefArray; + ((daeEnumType*)type)->_values = new daeEnumArray; + ((daeEnumType*)type)->_strings->append("CLEAR"); + ((daeEnumType*)type)->_values->append(GL_LOGIC_OP_TYPE_CLEAR); + ((daeEnumType*)type)->_strings->append("AND"); + ((daeEnumType*)type)->_values->append(GL_LOGIC_OP_TYPE_AND); + ((daeEnumType*)type)->_strings->append("AND_REVERSE"); + ((daeEnumType*)type)->_values->append(GL_LOGIC_OP_TYPE_AND_REVERSE); + ((daeEnumType*)type)->_strings->append("COPY"); + ((daeEnumType*)type)->_values->append(GL_LOGIC_OP_TYPE_COPY); + ((daeEnumType*)type)->_strings->append("AND_INVERTED"); + ((daeEnumType*)type)->_values->append(GL_LOGIC_OP_TYPE_AND_INVERTED); + ((daeEnumType*)type)->_strings->append("NOOP"); + ((daeEnumType*)type)->_values->append(GL_LOGIC_OP_TYPE_NOOP); + ((daeEnumType*)type)->_strings->append("XOR"); + ((daeEnumType*)type)->_values->append(GL_LOGIC_OP_TYPE_XOR); + ((daeEnumType*)type)->_strings->append("OR"); + ((daeEnumType*)type)->_values->append(GL_LOGIC_OP_TYPE_OR); + ((daeEnumType*)type)->_strings->append("NOR"); + ((daeEnumType*)type)->_values->append(GL_LOGIC_OP_TYPE_NOR); + ((daeEnumType*)type)->_strings->append("EQUIV"); + ((daeEnumType*)type)->_values->append(GL_LOGIC_OP_TYPE_EQUIV); + ((daeEnumType*)type)->_strings->append("INVERT"); + ((daeEnumType*)type)->_values->append(GL_LOGIC_OP_TYPE_INVERT); + ((daeEnumType*)type)->_strings->append("OR_REVERSE"); + ((daeEnumType*)type)->_values->append(GL_LOGIC_OP_TYPE_OR_REVERSE); + ((daeEnumType*)type)->_strings->append("COPY_INVERTED"); + ((daeEnumType*)type)->_values->append(GL_LOGIC_OP_TYPE_COPY_INVERTED); + ((daeEnumType*)type)->_strings->append("NAND"); + ((daeEnumType*)type)->_values->append(GL_LOGIC_OP_TYPE_NAND); + ((daeEnumType*)type)->_strings->append("SET"); + ((daeEnumType*)type)->_values->append(GL_LOGIC_OP_TYPE_SET); + daeAtomicType::append( type ); + + // ENUM: Gl_polygon_mode_type + type = new daeEnumType; + type->_nameBindings.append("Gl_polygon_mode_type"); + ((daeEnumType*)type)->_strings = new daeStringRefArray; + ((daeEnumType*)type)->_values = new daeEnumArray; + ((daeEnumType*)type)->_strings->append("POINT"); + ((daeEnumType*)type)->_values->append(GL_POLYGON_MODE_TYPE_POINT); + ((daeEnumType*)type)->_strings->append("LINE"); + ((daeEnumType*)type)->_values->append(GL_POLYGON_MODE_TYPE_LINE); + ((daeEnumType*)type)->_strings->append("FILL"); + ((daeEnumType*)type)->_values->append(GL_POLYGON_MODE_TYPE_FILL); + daeAtomicType::append( type ); + + // ENUM: Gl_shade_model_type + type = new daeEnumType; + type->_nameBindings.append("Gl_shade_model_type"); + ((daeEnumType*)type)->_strings = new daeStringRefArray; + ((daeEnumType*)type)->_values = new daeEnumArray; + ((daeEnumType*)type)->_strings->append("FLAT"); + ((daeEnumType*)type)->_values->append(GL_SHADE_MODEL_TYPE_FLAT); + ((daeEnumType*)type)->_strings->append("SMOOTH"); + ((daeEnumType*)type)->_values->append(GL_SHADE_MODEL_TYPE_SMOOTH); + daeAtomicType::append( type ); + + // TYPEDEF: Gl_alpha_value_type //check if this type has an existing base + type = daeAtomicType::get("xsFloat"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Gl_alpha_value_type"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Gl_alpha_value_type"); + } + + // ENUM: Gl_enumeration + type = new daeEnumType; + type->_nameBindings.append("Gl_enumeration"); + ((daeEnumType*)type)->_strings = new daeStringRefArray; + ((daeEnumType*)type)->_values = new daeEnumArray; + ((daeEnumType*)type)->_strings->append("ZERO"); + ((daeEnumType*)type)->_values->append(GL_ENUMERATION_ZERO); + ((daeEnumType*)type)->_strings->append("ONE"); + ((daeEnumType*)type)->_values->append(GL_ENUMERATION_ONE); + ((daeEnumType*)type)->_strings->append("SRC_COLOR"); + ((daeEnumType*)type)->_values->append(GL_ENUMERATION_SRC_COLOR); + ((daeEnumType*)type)->_strings->append("ONE_MINUS_SRC_COLOR"); + ((daeEnumType*)type)->_values->append(GL_ENUMERATION_ONE_MINUS_SRC_COLOR); + ((daeEnumType*)type)->_strings->append("DEST_COLOR"); + ((daeEnumType*)type)->_values->append(GL_ENUMERATION_DEST_COLOR); + ((daeEnumType*)type)->_strings->append("ONE_MINUS_DEST_COLOR"); + ((daeEnumType*)type)->_values->append(GL_ENUMERATION_ONE_MINUS_DEST_COLOR); + ((daeEnumType*)type)->_strings->append("SRC_ALPHA"); + ((daeEnumType*)type)->_values->append(GL_ENUMERATION_SRC_ALPHA); + ((daeEnumType*)type)->_strings->append("ONE_MINUS_SRC_ALPHA"); + ((daeEnumType*)type)->_values->append(GL_ENUMERATION_ONE_MINUS_SRC_ALPHA); + ((daeEnumType*)type)->_strings->append("DST_ALPHA"); + ((daeEnumType*)type)->_values->append(GL_ENUMERATION_DST_ALPHA); + ((daeEnumType*)type)->_strings->append("ONE_MINUS_DST_ALPHA"); + ((daeEnumType*)type)->_values->append(GL_ENUMERATION_ONE_MINUS_DST_ALPHA); + ((daeEnumType*)type)->_strings->append("CONSTANT_COLOR"); + ((daeEnumType*)type)->_values->append(GL_ENUMERATION_CONSTANT_COLOR); + ((daeEnumType*)type)->_strings->append("ONE_MINUS_CONSTANT_COLOR"); + ((daeEnumType*)type)->_values->append(GL_ENUMERATION_ONE_MINUS_CONSTANT_COLOR); + ((daeEnumType*)type)->_strings->append("CONSTANT_ALPHA"); + ((daeEnumType*)type)->_values->append(GL_ENUMERATION_CONSTANT_ALPHA); + ((daeEnumType*)type)->_strings->append("ONE_MINUS_CONSTANT_ALPHA"); + ((daeEnumType*)type)->_values->append(GL_ENUMERATION_ONE_MINUS_CONSTANT_ALPHA); + ((daeEnumType*)type)->_strings->append("SRC_ALPHA_SATURATE"); + ((daeEnumType*)type)->_values->append(GL_ENUMERATION_SRC_ALPHA_SATURATE); + ((daeEnumType*)type)->_strings->append("FRONT"); + ((daeEnumType*)type)->_values->append(GL_ENUMERATION_FRONT); + ((daeEnumType*)type)->_strings->append("BACK"); + ((daeEnumType*)type)->_values->append(GL_ENUMERATION_BACK); + ((daeEnumType*)type)->_strings->append("FRONT_AND_BACK"); + ((daeEnumType*)type)->_values->append(GL_ENUMERATION_FRONT_AND_BACK); + ((daeEnumType*)type)->_strings->append("FUNC_ADD"); + ((daeEnumType*)type)->_values->append(GL_ENUMERATION_FUNC_ADD); + ((daeEnumType*)type)->_strings->append("FUNC_SUBTRACT"); + ((daeEnumType*)type)->_values->append(GL_ENUMERATION_FUNC_SUBTRACT); + ((daeEnumType*)type)->_strings->append("FUNC_REVERSE_SUBTRACT"); + ((daeEnumType*)type)->_values->append(GL_ENUMERATION_FUNC_REVERSE_SUBTRACT); + ((daeEnumType*)type)->_strings->append("MIN"); + ((daeEnumType*)type)->_values->append(GL_ENUMERATION_MIN); + ((daeEnumType*)type)->_strings->append("MAX"); + ((daeEnumType*)type)->_values->append(GL_ENUMERATION_MAX); + ((daeEnumType*)type)->_strings->append("NEVER"); + ((daeEnumType*)type)->_values->append(GL_ENUMERATION_NEVER); + ((daeEnumType*)type)->_strings->append("LESS"); + ((daeEnumType*)type)->_values->append(GL_ENUMERATION_LESS); + ((daeEnumType*)type)->_strings->append("LEQUAL"); + ((daeEnumType*)type)->_values->append(GL_ENUMERATION_LEQUAL); + ((daeEnumType*)type)->_strings->append("EQUAL"); + ((daeEnumType*)type)->_values->append(GL_ENUMERATION_EQUAL); + ((daeEnumType*)type)->_strings->append("GREATER"); + ((daeEnumType*)type)->_values->append(GL_ENUMERATION_GREATER); + ((daeEnumType*)type)->_strings->append("NOTEQUAL"); + ((daeEnumType*)type)->_values->append(GL_ENUMERATION_NOTEQUAL); + ((daeEnumType*)type)->_strings->append("GEQUAL"); + ((daeEnumType*)type)->_values->append(GL_ENUMERATION_GEQUAL); + ((daeEnumType*)type)->_strings->append("ALWAYS"); + ((daeEnumType*)type)->_values->append(GL_ENUMERATION_ALWAYS); + ((daeEnumType*)type)->_strings->append("KEEP"); + ((daeEnumType*)type)->_values->append(GL_ENUMERATION_KEEP); + ((daeEnumType*)type)->_strings->append("REPLACE"); + ((daeEnumType*)type)->_values->append(GL_ENUMERATION_REPLACE); + ((daeEnumType*)type)->_strings->append("INCR"); + ((daeEnumType*)type)->_values->append(GL_ENUMERATION_INCR); + ((daeEnumType*)type)->_strings->append("DECR"); + ((daeEnumType*)type)->_values->append(GL_ENUMERATION_DECR); + ((daeEnumType*)type)->_strings->append("INVERT"); + ((daeEnumType*)type)->_values->append(GL_ENUMERATION_INVERT); + ((daeEnumType*)type)->_strings->append("INCR_WRAP"); + ((daeEnumType*)type)->_values->append(GL_ENUMERATION_INCR_WRAP); + ((daeEnumType*)type)->_strings->append("DECR_WRAP"); + ((daeEnumType*)type)->_values->append(GL_ENUMERATION_DECR_WRAP); + ((daeEnumType*)type)->_strings->append("EMISSION"); + ((daeEnumType*)type)->_values->append(GL_ENUMERATION_EMISSION); + ((daeEnumType*)type)->_strings->append("AMBIENT"); + ((daeEnumType*)type)->_values->append(GL_ENUMERATION_AMBIENT); + ((daeEnumType*)type)->_strings->append("DIFFUSE"); + ((daeEnumType*)type)->_values->append(GL_ENUMERATION_DIFFUSE); + ((daeEnumType*)type)->_strings->append("SPECULAR"); + ((daeEnumType*)type)->_values->append(GL_ENUMERATION_SPECULAR); + ((daeEnumType*)type)->_strings->append("AMBIENT_AND_DIFFUSE"); + ((daeEnumType*)type)->_values->append(GL_ENUMERATION_AMBIENT_AND_DIFFUSE); + ((daeEnumType*)type)->_strings->append("LINEAR"); + ((daeEnumType*)type)->_values->append(GL_ENUMERATION_LINEAR); + ((daeEnumType*)type)->_strings->append("EXP"); + ((daeEnumType*)type)->_values->append(GL_ENUMERATION_EXP); + ((daeEnumType*)type)->_strings->append("EXP2"); + ((daeEnumType*)type)->_values->append(GL_ENUMERATION_EXP2); + ((daeEnumType*)type)->_strings->append("FOG_COORDINATE"); + ((daeEnumType*)type)->_values->append(GL_ENUMERATION_FOG_COORDINATE); + ((daeEnumType*)type)->_strings->append("FRAGMENT_DEPTH"); + ((daeEnumType*)type)->_values->append(GL_ENUMERATION_FRAGMENT_DEPTH); + ((daeEnumType*)type)->_strings->append("CW"); + ((daeEnumType*)type)->_values->append(GL_ENUMERATION_CW); + ((daeEnumType*)type)->_strings->append("CCW"); + ((daeEnumType*)type)->_values->append(GL_ENUMERATION_CCW); + ((daeEnumType*)type)->_strings->append("SINGLE_COLOR"); + ((daeEnumType*)type)->_values->append(GL_ENUMERATION_SINGLE_COLOR); + ((daeEnumType*)type)->_strings->append("SEPARATE_SPECULAR_COLOR"); + ((daeEnumType*)type)->_values->append(GL_ENUMERATION_SEPARATE_SPECULAR_COLOR); + ((daeEnumType*)type)->_strings->append("CLEAR"); + ((daeEnumType*)type)->_values->append(GL_ENUMERATION_CLEAR); + ((daeEnumType*)type)->_strings->append("AND"); + ((daeEnumType*)type)->_values->append(GL_ENUMERATION_AND); + ((daeEnumType*)type)->_strings->append("AND_REVERSE"); + ((daeEnumType*)type)->_values->append(GL_ENUMERATION_AND_REVERSE); + ((daeEnumType*)type)->_strings->append("COPY"); + ((daeEnumType*)type)->_values->append(GL_ENUMERATION_COPY); + ((daeEnumType*)type)->_strings->append("AND_INVERTED"); + ((daeEnumType*)type)->_values->append(GL_ENUMERATION_AND_INVERTED); + ((daeEnumType*)type)->_strings->append("NOOP"); + ((daeEnumType*)type)->_values->append(GL_ENUMERATION_NOOP); + ((daeEnumType*)type)->_strings->append("XOR"); + ((daeEnumType*)type)->_values->append(GL_ENUMERATION_XOR); + ((daeEnumType*)type)->_strings->append("OR"); + ((daeEnumType*)type)->_values->append(GL_ENUMERATION_OR); + ((daeEnumType*)type)->_strings->append("NOR"); + ((daeEnumType*)type)->_values->append(GL_ENUMERATION_NOR); + ((daeEnumType*)type)->_strings->append("EQUIV"); + ((daeEnumType*)type)->_values->append(GL_ENUMERATION_EQUIV); + ((daeEnumType*)type)->_strings->append("OR_REVERSE"); + ((daeEnumType*)type)->_values->append(GL_ENUMERATION_OR_REVERSE); + ((daeEnumType*)type)->_strings->append("COPY_INVERTED"); + ((daeEnumType*)type)->_values->append(GL_ENUMERATION_COPY_INVERTED); + ((daeEnumType*)type)->_strings->append("NAND"); + ((daeEnumType*)type)->_values->append(GL_ENUMERATION_NAND); + ((daeEnumType*)type)->_strings->append("SET"); + ((daeEnumType*)type)->_values->append(GL_ENUMERATION_SET); + ((daeEnumType*)type)->_strings->append("POINT"); + ((daeEnumType*)type)->_values->append(GL_ENUMERATION_POINT); + ((daeEnumType*)type)->_strings->append("LINE"); + ((daeEnumType*)type)->_values->append(GL_ENUMERATION_LINE); + ((daeEnumType*)type)->_strings->append("FILL"); + ((daeEnumType*)type)->_values->append(GL_ENUMERATION_FILL); + ((daeEnumType*)type)->_strings->append("FLAT"); + ((daeEnumType*)type)->_values->append(GL_ENUMERATION_FLAT); + ((daeEnumType*)type)->_strings->append("SMOOTH"); + ((daeEnumType*)type)->_values->append(GL_ENUMERATION_SMOOTH); + daeAtomicType::append( type ); + + // TYPEDEF: Glsl_float //check if this type has an existing base + type = daeAtomicType::get("xsFloat"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Glsl_float"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Glsl_float"); + } + + // TYPEDEF: Glsl_int //check if this type has an existing base + type = daeAtomicType::get("xsInt"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Glsl_int"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Glsl_int"); + } + + // TYPEDEF: Glsl_bool //check if this type has an existing base + type = daeAtomicType::get("xsBoolean"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Glsl_bool"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Glsl_bool"); + } + + // TYPEDEF: Glsl_ListOfBool //check if this type has an existing base + type = daeAtomicType::get("Glsl_bool"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Glsl_ListOfBool"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Glsl_ListOfBool"); + } + + // TYPEDEF: Glsl_ListOfFloat //check if this type has an existing base + type = daeAtomicType::get("Glsl_float"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Glsl_ListOfFloat"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Glsl_ListOfFloat"); + } + + // TYPEDEF: Glsl_ListOfInt //check if this type has an existing base + type = daeAtomicType::get("Glsl_int"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Glsl_ListOfInt"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Glsl_ListOfInt"); + } + + // TYPEDEF: Glsl_bool2 //check if this type has an existing base + type = daeAtomicType::get("Glsl_ListOfBool"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Glsl_bool2"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Glsl_bool2"); + } + + // TYPEDEF: Glsl_bool3 //check if this type has an existing base + type = daeAtomicType::get("Glsl_ListOfBool"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Glsl_bool3"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Glsl_bool3"); + } + + // TYPEDEF: Glsl_bool4 //check if this type has an existing base + type = daeAtomicType::get("Glsl_ListOfBool"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Glsl_bool4"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Glsl_bool4"); + } + + // TYPEDEF: Glsl_float2 //check if this type has an existing base + type = daeAtomicType::get("Glsl_ListOfFloat"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Glsl_float2"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Glsl_float2"); + } + + // TYPEDEF: Glsl_float3 //check if this type has an existing base + type = daeAtomicType::get("Glsl_ListOfFloat"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Glsl_float3"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Glsl_float3"); + } + + // TYPEDEF: Glsl_float4 //check if this type has an existing base + type = daeAtomicType::get("Glsl_ListOfFloat"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Glsl_float4"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Glsl_float4"); + } + + // TYPEDEF: Glsl_float2x2 //check if this type has an existing base + type = daeAtomicType::get("Glsl_ListOfFloat"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Glsl_float2x2"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Glsl_float2x2"); + } + + // TYPEDEF: Glsl_float3x3 //check if this type has an existing base + type = daeAtomicType::get("Glsl_ListOfFloat"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Glsl_float3x3"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Glsl_float3x3"); + } + + // TYPEDEF: Glsl_float4x4 //check if this type has an existing base + type = daeAtomicType::get("Glsl_ListOfFloat"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Glsl_float4x4"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Glsl_float4x4"); + } + + // TYPEDEF: Glsl_int2 //check if this type has an existing base + type = daeAtomicType::get("Glsl_ListOfInt"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Glsl_int2"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Glsl_int2"); + } + + // TYPEDEF: Glsl_int3 //check if this type has an existing base + type = daeAtomicType::get("Glsl_ListOfInt"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Glsl_int3"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Glsl_int3"); + } + + // TYPEDEF: Glsl_int4 //check if this type has an existing base + type = daeAtomicType::get("Glsl_ListOfInt"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Glsl_int4"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Glsl_int4"); + } + + // ENUM: Glsl_pipeline_stage + type = new daeEnumType; + type->_nameBindings.append("Glsl_pipeline_stage"); + ((daeEnumType*)type)->_strings = new daeStringRefArray; + ((daeEnumType*)type)->_values = new daeEnumArray; + ((daeEnumType*)type)->_strings->append("VERTEXPROGRAM"); + ((daeEnumType*)type)->_values->append(GLSL_PIPELINE_STAGE_VERTEXPROGRAM); + ((daeEnumType*)type)->_strings->append("FRAGMENTPROGRAM"); + ((daeEnumType*)type)->_values->append(GLSL_PIPELINE_STAGE_FRAGMENTPROGRAM); + daeAtomicType::append( type ); + + // TYPEDEF: Glsl_identifier //check if this type has an existing base + type = daeAtomicType::get("xsToken"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Glsl_identifier"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Glsl_identifier"); + } + + // TYPEDEF: Cg_bool //check if this type has an existing base + type = daeAtomicType::get("xsBoolean"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_bool"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_bool"); + } + + // TYPEDEF: Cg_float //check if this type has an existing base + type = daeAtomicType::get("xsFloat"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_float"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_float"); + } + + // TYPEDEF: Cg_int //check if this type has an existing base + type = daeAtomicType::get("xsInt"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_int"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_int"); + } + + // TYPEDEF: Cg_half //check if this type has an existing base + type = daeAtomicType::get("xsFloat"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_half"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_half"); + } + + // TYPEDEF: Cg_fixed //check if this type has an existing base + type = daeAtomicType::get("xsFloat"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_fixed"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_fixed"); + } + + // TYPEDEF: Cg_bool1 //check if this type has an existing base + type = daeAtomicType::get("xsBoolean"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_bool1"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_bool1"); + } + + // TYPEDEF: Cg_float1 //check if this type has an existing base + type = daeAtomicType::get("xsFloat"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_float1"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_float1"); + } + + // TYPEDEF: Cg_int1 //check if this type has an existing base + type = daeAtomicType::get("xsInt"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_int1"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_int1"); + } + + // TYPEDEF: Cg_half1 //check if this type has an existing base + type = daeAtomicType::get("xsFloat"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_half1"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_half1"); + } + + // TYPEDEF: Cg_fixed1 //check if this type has an existing base + type = daeAtomicType::get("xsFloat"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_fixed1"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_fixed1"); + } + + // TYPEDEF: Cg_ListOfBool //check if this type has an existing base + type = daeAtomicType::get("Cg_bool"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_ListOfBool"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_ListOfBool"); + } + + // TYPEDEF: Cg_ListOfFloat //check if this type has an existing base + type = daeAtomicType::get("Cg_float"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_ListOfFloat"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_ListOfFloat"); + } + + // TYPEDEF: Cg_ListOfInt //check if this type has an existing base + type = daeAtomicType::get("Cg_int"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_ListOfInt"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_ListOfInt"); + } + + // TYPEDEF: Cg_ListOfHalf //check if this type has an existing base + type = daeAtomicType::get("Cg_half"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_ListOfHalf"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_ListOfHalf"); + } + + // TYPEDEF: Cg_ListOfFixed //check if this type has an existing base + type = daeAtomicType::get("Cg_fixed"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_ListOfFixed"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_ListOfFixed"); + } + + // TYPEDEF: Cg_bool2 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfBool"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_bool2"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_bool2"); + } + + // TYPEDEF: Cg_bool3 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfBool"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_bool3"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_bool3"); + } + + // TYPEDEF: Cg_bool4 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfBool"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_bool4"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_bool4"); + } + + // TYPEDEF: Cg_bool1x1 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfBool"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_bool1x1"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_bool1x1"); + } + + // TYPEDEF: Cg_bool1x2 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfBool"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_bool1x2"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_bool1x2"); + } + + // TYPEDEF: Cg_bool1x3 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfBool"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_bool1x3"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_bool1x3"); + } + + // TYPEDEF: Cg_bool1x4 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfBool"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_bool1x4"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_bool1x4"); + } + + // TYPEDEF: Cg_bool2x1 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfBool"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_bool2x1"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_bool2x1"); + } + + // TYPEDEF: Cg_bool2x2 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfBool"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_bool2x2"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_bool2x2"); + } + + // TYPEDEF: Cg_bool2x3 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfBool"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_bool2x3"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_bool2x3"); + } + + // TYPEDEF: Cg_bool2x4 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfBool"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_bool2x4"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_bool2x4"); + } + + // TYPEDEF: Cg_bool3x1 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfBool"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_bool3x1"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_bool3x1"); + } + + // TYPEDEF: Cg_bool3x2 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfBool"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_bool3x2"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_bool3x2"); + } + + // TYPEDEF: Cg_bool3x3 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfBool"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_bool3x3"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_bool3x3"); + } + + // TYPEDEF: Cg_bool3x4 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfBool"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_bool3x4"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_bool3x4"); + } + + // TYPEDEF: Cg_bool4x1 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfBool"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_bool4x1"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_bool4x1"); + } + + // TYPEDEF: Cg_bool4x2 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfBool"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_bool4x2"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_bool4x2"); + } + + // TYPEDEF: Cg_bool4x3 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfBool"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_bool4x3"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_bool4x3"); + } + + // TYPEDEF: Cg_bool4x4 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfBool"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_bool4x4"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_bool4x4"); + } + + // TYPEDEF: Cg_float2 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfFloat"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_float2"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_float2"); + } + + // TYPEDEF: Cg_float3 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfFloat"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_float3"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_float3"); + } + + // TYPEDEF: Cg_float4 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfFloat"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_float4"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_float4"); + } + + // TYPEDEF: Cg_float1x1 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfFloat"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_float1x1"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_float1x1"); + } + + // TYPEDEF: Cg_float1x2 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfFloat"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_float1x2"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_float1x2"); + } + + // TYPEDEF: Cg_float1x3 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfFloat"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_float1x3"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_float1x3"); + } + + // TYPEDEF: Cg_float1x4 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfFloat"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_float1x4"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_float1x4"); + } + + // TYPEDEF: Cg_float2x1 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfFloat"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_float2x1"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_float2x1"); + } + + // TYPEDEF: Cg_float2x2 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfFloat"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_float2x2"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_float2x2"); + } + + // TYPEDEF: Cg_float2x3 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfFloat"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_float2x3"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_float2x3"); + } + + // TYPEDEF: Cg_float2x4 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfFloat"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_float2x4"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_float2x4"); + } + + // TYPEDEF: Cg_float3x1 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfFloat"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_float3x1"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_float3x1"); + } + + // TYPEDEF: Cg_float3x2 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfFloat"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_float3x2"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_float3x2"); + } + + // TYPEDEF: Cg_float3x3 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfFloat"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_float3x3"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_float3x3"); + } + + // TYPEDEF: Cg_float3x4 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfFloat"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_float3x4"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_float3x4"); + } + + // TYPEDEF: Cg_float4x1 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfFloat"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_float4x1"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_float4x1"); + } + + // TYPEDEF: Cg_float4x2 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfFloat"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_float4x2"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_float4x2"); + } + + // TYPEDEF: Cg_float4x3 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfFloat"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_float4x3"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_float4x3"); + } + + // TYPEDEF: Cg_float4x4 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfFloat"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_float4x4"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_float4x4"); + } + + // TYPEDEF: Cg_int2 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfInt"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_int2"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_int2"); + } + + // TYPEDEF: Cg_int3 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfInt"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_int3"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_int3"); + } + + // TYPEDEF: Cg_int4 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfInt"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_int4"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_int4"); + } + + // TYPEDEF: Cg_int1x1 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfInt"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_int1x1"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_int1x1"); + } + + // TYPEDEF: Cg_int1x2 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfInt"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_int1x2"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_int1x2"); + } + + // TYPEDEF: Cg_int1x3 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfInt"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_int1x3"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_int1x3"); + } + + // TYPEDEF: Cg_int1x4 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfInt"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_int1x4"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_int1x4"); + } + + // TYPEDEF: Cg_int2x1 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfInt"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_int2x1"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_int2x1"); + } + + // TYPEDEF: Cg_int2x2 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfInt"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_int2x2"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_int2x2"); + } + + // TYPEDEF: Cg_int2x3 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfInt"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_int2x3"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_int2x3"); + } + + // TYPEDEF: Cg_int2x4 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfInt"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_int2x4"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_int2x4"); + } + + // TYPEDEF: Cg_int3x1 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfInt"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_int3x1"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_int3x1"); + } + + // TYPEDEF: Cg_int3x2 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfInt"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_int3x2"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_int3x2"); + } + + // TYPEDEF: Cg_int3x3 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfInt"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_int3x3"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_int3x3"); + } + + // TYPEDEF: Cg_int3x4 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfInt"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_int3x4"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_int3x4"); + } + + // TYPEDEF: Cg_int4x1 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfInt"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_int4x1"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_int4x1"); + } + + // TYPEDEF: Cg_int4x2 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfInt"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_int4x2"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_int4x2"); + } + + // TYPEDEF: Cg_int4x3 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfInt"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_int4x3"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_int4x3"); + } + + // TYPEDEF: Cg_int4x4 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfInt"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_int4x4"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_int4x4"); + } + + // TYPEDEF: Cg_half2 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfHalf"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_half2"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_half2"); + } + + // TYPEDEF: Cg_half3 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfHalf"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_half3"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_half3"); + } + + // TYPEDEF: Cg_half4 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfHalf"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_half4"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_half4"); + } + + // TYPEDEF: Cg_half1x1 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfHalf"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_half1x1"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_half1x1"); + } + + // TYPEDEF: Cg_half1x2 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfHalf"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_half1x2"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_half1x2"); + } + + // TYPEDEF: Cg_half1x3 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfHalf"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_half1x3"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_half1x3"); + } + + // TYPEDEF: Cg_half1x4 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfHalf"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_half1x4"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_half1x4"); + } + + // TYPEDEF: Cg_half2x1 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfHalf"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_half2x1"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_half2x1"); + } + + // TYPEDEF: Cg_half2x2 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfHalf"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_half2x2"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_half2x2"); + } + + // TYPEDEF: Cg_half2x3 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfHalf"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_half2x3"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_half2x3"); + } + + // TYPEDEF: Cg_half2x4 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfHalf"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_half2x4"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_half2x4"); + } + + // TYPEDEF: Cg_half3x1 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfHalf"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_half3x1"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_half3x1"); + } + + // TYPEDEF: Cg_half3x2 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfHalf"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_half3x2"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_half3x2"); + } + + // TYPEDEF: Cg_half3x3 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfHalf"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_half3x3"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_half3x3"); + } + + // TYPEDEF: Cg_half3x4 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfHalf"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_half3x4"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_half3x4"); + } + + // TYPEDEF: Cg_half4x1 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfHalf"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_half4x1"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_half4x1"); + } + + // TYPEDEF: Cg_half4x2 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfHalf"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_half4x2"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_half4x2"); + } + + // TYPEDEF: Cg_half4x3 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfHalf"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_half4x3"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_half4x3"); + } + + // TYPEDEF: Cg_half4x4 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfHalf"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_half4x4"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_half4x4"); + } + + // TYPEDEF: Cg_fixed2 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfFixed"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_fixed2"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_fixed2"); + } + + // TYPEDEF: Cg_fixed3 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfFixed"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_fixed3"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_fixed3"); + } + + // TYPEDEF: Cg_fixed4 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfFixed"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_fixed4"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_fixed4"); + } + + // TYPEDEF: Cg_fixed1x1 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfFixed"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_fixed1x1"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_fixed1x1"); + } + + // TYPEDEF: Cg_fixed1x2 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfFixed"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_fixed1x2"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_fixed1x2"); + } + + // TYPEDEF: Cg_fixed1x3 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfFixed"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_fixed1x3"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_fixed1x3"); + } + + // TYPEDEF: Cg_fixed1x4 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfFixed"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_fixed1x4"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_fixed1x4"); + } + + // TYPEDEF: Cg_fixed2x1 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfFixed"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_fixed2x1"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_fixed2x1"); + } + + // TYPEDEF: Cg_fixed2x2 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfFixed"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_fixed2x2"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_fixed2x2"); + } + + // TYPEDEF: Cg_fixed2x3 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfFixed"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_fixed2x3"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_fixed2x3"); + } + + // TYPEDEF: Cg_fixed2x4 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfFixed"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_fixed2x4"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_fixed2x4"); + } + + // TYPEDEF: Cg_fixed3x1 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfFixed"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_fixed3x1"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_fixed3x1"); + } + + // TYPEDEF: Cg_fixed3x2 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfFixed"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_fixed3x2"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_fixed3x2"); + } + + // TYPEDEF: Cg_fixed3x3 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfFixed"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_fixed3x3"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_fixed3x3"); + } + + // TYPEDEF: Cg_fixed3x4 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfFixed"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_fixed3x4"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_fixed3x4"); + } + + // TYPEDEF: Cg_fixed4x1 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfFixed"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_fixed4x1"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_fixed4x1"); + } + + // TYPEDEF: Cg_fixed4x2 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfFixed"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_fixed4x2"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_fixed4x2"); + } + + // TYPEDEF: Cg_fixed4x3 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfFixed"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_fixed4x3"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_fixed4x3"); + } + + // TYPEDEF: Cg_fixed4x4 //check if this type has an existing base + type = daeAtomicType::get("Cg_ListOfFixed"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_fixed4x4"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_fixed4x4"); + } + + // ENUM: Cg_pipeline_stage + type = new daeEnumType; + type->_nameBindings.append("Cg_pipeline_stage"); + ((daeEnumType*)type)->_strings = new daeStringRefArray; + ((daeEnumType*)type)->_values = new daeEnumArray; + ((daeEnumType*)type)->_strings->append("VERTEX"); + ((daeEnumType*)type)->_values->append(CG_PIPELINE_STAGE_VERTEX); + ((daeEnumType*)type)->_strings->append("FRAGMENT"); + ((daeEnumType*)type)->_values->append(CG_PIPELINE_STAGE_FRAGMENT); + daeAtomicType::append( type ); + + // TYPEDEF: Cg_identifier //check if this type has an existing base + type = daeAtomicType::get("xsToken"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Cg_identifier"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Cg_identifier"); + } + + // TYPEDEF: GLES_MAX_LIGHTS_index //check if this type has an existing base + type = daeAtomicType::get("xsNonNegativeInteger"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("GLES_MAX_LIGHTS_index"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("GLES_MAX_LIGHTS_index"); + } + + // TYPEDEF: GLES_MAX_CLIP_PLANES_index //check if this type has an existing base + type = daeAtomicType::get("xsNonNegativeInteger"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("GLES_MAX_CLIP_PLANES_index"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("GLES_MAX_CLIP_PLANES_index"); + } + + // TYPEDEF: GLES_MAX_TEXTURE_COORDS_index //check if this type has an existing base + type = daeAtomicType::get("xsNonNegativeInteger"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("GLES_MAX_TEXTURE_COORDS_index"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("GLES_MAX_TEXTURE_COORDS_index"); + } + + // TYPEDEF: GLES_MAX_TEXTURE_IMAGE_UNITS_index //check if this type has an existing base + type = daeAtomicType::get("xsNonNegativeInteger"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("GLES_MAX_TEXTURE_IMAGE_UNITS_index"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("GLES_MAX_TEXTURE_IMAGE_UNITS_index"); + } + + // ENUM: Gles_texenv_mode_enums + type = new daeEnumType; + type->_nameBindings.append("Gles_texenv_mode_enums"); + ((daeEnumType*)type)->_strings = new daeStringRefArray; + ((daeEnumType*)type)->_values = new daeEnumArray; + ((daeEnumType*)type)->_strings->append("REPLACE"); + ((daeEnumType*)type)->_values->append(GLES_TEXENV_MODE_ENUMS_REPLACE); + ((daeEnumType*)type)->_strings->append("MODULATE"); + ((daeEnumType*)type)->_values->append(GLES_TEXENV_MODE_ENUMS_MODULATE); + ((daeEnumType*)type)->_strings->append("DECAL"); + ((daeEnumType*)type)->_values->append(GLES_TEXENV_MODE_ENUMS_DECAL); + ((daeEnumType*)type)->_strings->append("BLEND"); + ((daeEnumType*)type)->_values->append(GLES_TEXENV_MODE_ENUMS_BLEND); + ((daeEnumType*)type)->_strings->append("ADD"); + ((daeEnumType*)type)->_values->append(GLES_TEXENV_MODE_ENUMS_ADD); + daeAtomicType::append( type ); + + // ENUM: Gles_texcombiner_operatorRGB_enums + type = new daeEnumType; + type->_nameBindings.append("Gles_texcombiner_operatorRGB_enums"); + ((daeEnumType*)type)->_strings = new daeStringRefArray; + ((daeEnumType*)type)->_values = new daeEnumArray; + ((daeEnumType*)type)->_strings->append("REPLACE"); + ((daeEnumType*)type)->_values->append(GLES_TEXCOMBINER_OPERATORRGB_ENUMS_REPLACE); + ((daeEnumType*)type)->_strings->append("MODULATE"); + ((daeEnumType*)type)->_values->append(GLES_TEXCOMBINER_OPERATORRGB_ENUMS_MODULATE); + ((daeEnumType*)type)->_strings->append("ADD"); + ((daeEnumType*)type)->_values->append(GLES_TEXCOMBINER_OPERATORRGB_ENUMS_ADD); + ((daeEnumType*)type)->_strings->append("ADD_SIGNED"); + ((daeEnumType*)type)->_values->append(GLES_TEXCOMBINER_OPERATORRGB_ENUMS_ADD_SIGNED); + ((daeEnumType*)type)->_strings->append("INTERPOLATE"); + ((daeEnumType*)type)->_values->append(GLES_TEXCOMBINER_OPERATORRGB_ENUMS_INTERPOLATE); + ((daeEnumType*)type)->_strings->append("SUBTRACT"); + ((daeEnumType*)type)->_values->append(GLES_TEXCOMBINER_OPERATORRGB_ENUMS_SUBTRACT); + ((daeEnumType*)type)->_strings->append("DOT3_RGB"); + ((daeEnumType*)type)->_values->append(GLES_TEXCOMBINER_OPERATORRGB_ENUMS_DOT3_RGB); + ((daeEnumType*)type)->_strings->append("DOT3_RGBA"); + ((daeEnumType*)type)->_values->append(GLES_TEXCOMBINER_OPERATORRGB_ENUMS_DOT3_RGBA); + daeAtomicType::append( type ); + + // ENUM: Gles_texcombiner_operatorAlpha_enums + type = new daeEnumType; + type->_nameBindings.append("Gles_texcombiner_operatorAlpha_enums"); + ((daeEnumType*)type)->_strings = new daeStringRefArray; + ((daeEnumType*)type)->_values = new daeEnumArray; + ((daeEnumType*)type)->_strings->append("REPLACE"); + ((daeEnumType*)type)->_values->append(GLES_TEXCOMBINER_OPERATORALPHA_ENUMS_REPLACE); + ((daeEnumType*)type)->_strings->append("MODULATE"); + ((daeEnumType*)type)->_values->append(GLES_TEXCOMBINER_OPERATORALPHA_ENUMS_MODULATE); + ((daeEnumType*)type)->_strings->append("ADD"); + ((daeEnumType*)type)->_values->append(GLES_TEXCOMBINER_OPERATORALPHA_ENUMS_ADD); + ((daeEnumType*)type)->_strings->append("ADD_SIGNED"); + ((daeEnumType*)type)->_values->append(GLES_TEXCOMBINER_OPERATORALPHA_ENUMS_ADD_SIGNED); + ((daeEnumType*)type)->_strings->append("INTERPOLATE"); + ((daeEnumType*)type)->_values->append(GLES_TEXCOMBINER_OPERATORALPHA_ENUMS_INTERPOLATE); + ((daeEnumType*)type)->_strings->append("SUBTRACT"); + ((daeEnumType*)type)->_values->append(GLES_TEXCOMBINER_OPERATORALPHA_ENUMS_SUBTRACT); + daeAtomicType::append( type ); + + // ENUM: Gles_texcombiner_source_enums + type = new daeEnumType; + type->_nameBindings.append("Gles_texcombiner_source_enums"); + ((daeEnumType*)type)->_strings = new daeStringRefArray; + ((daeEnumType*)type)->_values = new daeEnumArray; + ((daeEnumType*)type)->_strings->append("TEXTURE"); + ((daeEnumType*)type)->_values->append(GLES_TEXCOMBINER_SOURCE_ENUMS_TEXTURE); + ((daeEnumType*)type)->_strings->append("CONSTANT"); + ((daeEnumType*)type)->_values->append(GLES_TEXCOMBINER_SOURCE_ENUMS_CONSTANT); + ((daeEnumType*)type)->_strings->append("PRIMARY"); + ((daeEnumType*)type)->_values->append(GLES_TEXCOMBINER_SOURCE_ENUMS_PRIMARY); + ((daeEnumType*)type)->_strings->append("PREVIOUS"); + ((daeEnumType*)type)->_values->append(GLES_TEXCOMBINER_SOURCE_ENUMS_PREVIOUS); + daeAtomicType::append( type ); + + // ENUM: Gles_texcombiner_operandRGB_enums + type = new daeEnumType; + type->_nameBindings.append("Gles_texcombiner_operandRGB_enums"); + ((daeEnumType*)type)->_strings = new daeStringRefArray; + ((daeEnumType*)type)->_values = new daeEnumArray; + ((daeEnumType*)type)->_strings->append("SRC_COLOR"); + ((daeEnumType*)type)->_values->append(GLES_TEXCOMBINER_OPERANDRGB_ENUMS_SRC_COLOR); + ((daeEnumType*)type)->_strings->append("ONE_MINUS_SRC_COLOR"); + ((daeEnumType*)type)->_values->append(GLES_TEXCOMBINER_OPERANDRGB_ENUMS_ONE_MINUS_SRC_COLOR); + ((daeEnumType*)type)->_strings->append("SRC_ALPHA"); + ((daeEnumType*)type)->_values->append(GLES_TEXCOMBINER_OPERANDRGB_ENUMS_SRC_ALPHA); + ((daeEnumType*)type)->_strings->append("ONE_MINUS_SRC_ALPHA"); + ((daeEnumType*)type)->_values->append(GLES_TEXCOMBINER_OPERANDRGB_ENUMS_ONE_MINUS_SRC_ALPHA); + daeAtomicType::append( type ); + + // ENUM: Gles_texcombiner_operandAlpha_enums + type = new daeEnumType; + type->_nameBindings.append("Gles_texcombiner_operandAlpha_enums"); + ((daeEnumType*)type)->_strings = new daeStringRefArray; + ((daeEnumType*)type)->_values = new daeEnumArray; + ((daeEnumType*)type)->_strings->append("SRC_ALPHA"); + ((daeEnumType*)type)->_values->append(GLES_TEXCOMBINER_OPERANDALPHA_ENUMS_SRC_ALPHA); + ((daeEnumType*)type)->_strings->append("ONE_MINUS_SRC_ALPHA"); + ((daeEnumType*)type)->_values->append(GLES_TEXCOMBINER_OPERANDALPHA_ENUMS_ONE_MINUS_SRC_ALPHA); + daeAtomicType::append( type ); + + // TYPEDEF: Gles_texcombiner_argument_index_type //check if this type has an existing base + type = daeAtomicType::get("xsNonNegativeInteger"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Gles_texcombiner_argument_index_type"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Gles_texcombiner_argument_index_type"); + } + + // ENUM: Gles_sampler_wrap + type = new daeEnumType; + type->_nameBindings.append("Gles_sampler_wrap"); + ((daeEnumType*)type)->_strings = new daeStringRefArray; + ((daeEnumType*)type)->_values = new daeEnumArray; + ((daeEnumType*)type)->_strings->append("REPEAT"); + ((daeEnumType*)type)->_values->append(GLES_SAMPLER_WRAP_REPEAT); + ((daeEnumType*)type)->_strings->append("CLAMP"); + ((daeEnumType*)type)->_values->append(GLES_SAMPLER_WRAP_CLAMP); + ((daeEnumType*)type)->_strings->append("CLAMP_TO_EDGE"); + ((daeEnumType*)type)->_values->append(GLES_SAMPLER_WRAP_CLAMP_TO_EDGE); + ((daeEnumType*)type)->_strings->append("MIRRORED_REPEAT"); + ((daeEnumType*)type)->_values->append(GLES_SAMPLER_WRAP_MIRRORED_REPEAT); + daeAtomicType::append( type ); + + // ENUM: Gles_stencil_op_type + type = new daeEnumType; + type->_nameBindings.append("Gles_stencil_op_type"); + ((daeEnumType*)type)->_strings = new daeStringRefArray; + ((daeEnumType*)type)->_values = new daeEnumArray; + ((daeEnumType*)type)->_strings->append("KEEP"); + ((daeEnumType*)type)->_values->append(GLES_STENCIL_OP_TYPE_KEEP); + ((daeEnumType*)type)->_strings->append("ZERO"); + ((daeEnumType*)type)->_values->append(GLES_STENCIL_OP_TYPE_ZERO); + ((daeEnumType*)type)->_strings->append("REPLACE"); + ((daeEnumType*)type)->_values->append(GLES_STENCIL_OP_TYPE_REPLACE); + ((daeEnumType*)type)->_strings->append("INCR"); + ((daeEnumType*)type)->_values->append(GLES_STENCIL_OP_TYPE_INCR); + ((daeEnumType*)type)->_strings->append("DECR"); + ((daeEnumType*)type)->_values->append(GLES_STENCIL_OP_TYPE_DECR); + ((daeEnumType*)type)->_strings->append("INVERT"); + ((daeEnumType*)type)->_values->append(GLES_STENCIL_OP_TYPE_INVERT); + daeAtomicType::append( type ); + + // ENUM: Gles_enumeration + type = new daeEnumType; + type->_nameBindings.append("Gles_enumeration"); + ((daeEnumType*)type)->_strings = new daeStringRefArray; + ((daeEnumType*)type)->_values = new daeEnumArray; + ((daeEnumType*)type)->_strings->append("ZERO"); + ((daeEnumType*)type)->_values->append(GLES_ENUMERATION_ZERO); + ((daeEnumType*)type)->_strings->append("ONE"); + ((daeEnumType*)type)->_values->append(GLES_ENUMERATION_ONE); + ((daeEnumType*)type)->_strings->append("SRC_COLOR"); + ((daeEnumType*)type)->_values->append(GLES_ENUMERATION_SRC_COLOR); + ((daeEnumType*)type)->_strings->append("ONE_MINUS_SRC_COLOR"); + ((daeEnumType*)type)->_values->append(GLES_ENUMERATION_ONE_MINUS_SRC_COLOR); + ((daeEnumType*)type)->_strings->append("DEST_COLOR"); + ((daeEnumType*)type)->_values->append(GLES_ENUMERATION_DEST_COLOR); + ((daeEnumType*)type)->_strings->append("ONE_MINUS_DEST_COLOR"); + ((daeEnumType*)type)->_values->append(GLES_ENUMERATION_ONE_MINUS_DEST_COLOR); + ((daeEnumType*)type)->_strings->append("SRC_ALPHA"); + ((daeEnumType*)type)->_values->append(GLES_ENUMERATION_SRC_ALPHA); + ((daeEnumType*)type)->_strings->append("ONE_MINUS_SRC_ALPHA"); + ((daeEnumType*)type)->_values->append(GLES_ENUMERATION_ONE_MINUS_SRC_ALPHA); + ((daeEnumType*)type)->_strings->append("DST_ALPHA"); + ((daeEnumType*)type)->_values->append(GLES_ENUMERATION_DST_ALPHA); + ((daeEnumType*)type)->_strings->append("ONE_MINUS_DST_ALPHA"); + ((daeEnumType*)type)->_values->append(GLES_ENUMERATION_ONE_MINUS_DST_ALPHA); + ((daeEnumType*)type)->_strings->append("CONSTANT_COLOR"); + ((daeEnumType*)type)->_values->append(GLES_ENUMERATION_CONSTANT_COLOR); + ((daeEnumType*)type)->_strings->append("ONE_MINUS_CONSTANT_COLOR"); + ((daeEnumType*)type)->_values->append(GLES_ENUMERATION_ONE_MINUS_CONSTANT_COLOR); + ((daeEnumType*)type)->_strings->append("CONSTANT_ALPHA"); + ((daeEnumType*)type)->_values->append(GLES_ENUMERATION_CONSTANT_ALPHA); + ((daeEnumType*)type)->_strings->append("ONE_MINUS_CONSTANT_ALPHA"); + ((daeEnumType*)type)->_values->append(GLES_ENUMERATION_ONE_MINUS_CONSTANT_ALPHA); + ((daeEnumType*)type)->_strings->append("SRC_ALPHA_SATURATE"); + ((daeEnumType*)type)->_values->append(GLES_ENUMERATION_SRC_ALPHA_SATURATE); + ((daeEnumType*)type)->_strings->append("FRONT"); + ((daeEnumType*)type)->_values->append(GLES_ENUMERATION_FRONT); + ((daeEnumType*)type)->_strings->append("BACK"); + ((daeEnumType*)type)->_values->append(GLES_ENUMERATION_BACK); + ((daeEnumType*)type)->_strings->append("FRONT_AND_BACK"); + ((daeEnumType*)type)->_values->append(GLES_ENUMERATION_FRONT_AND_BACK); + ((daeEnumType*)type)->_strings->append("NEVER"); + ((daeEnumType*)type)->_values->append(GLES_ENUMERATION_NEVER); + ((daeEnumType*)type)->_strings->append("LESS"); + ((daeEnumType*)type)->_values->append(GLES_ENUMERATION_LESS); + ((daeEnumType*)type)->_strings->append("LEQUAL"); + ((daeEnumType*)type)->_values->append(GLES_ENUMERATION_LEQUAL); + ((daeEnumType*)type)->_strings->append("EQUAL"); + ((daeEnumType*)type)->_values->append(GLES_ENUMERATION_EQUAL); + ((daeEnumType*)type)->_strings->append("GREATER"); + ((daeEnumType*)type)->_values->append(GLES_ENUMERATION_GREATER); + ((daeEnumType*)type)->_strings->append("NOTEQUAL"); + ((daeEnumType*)type)->_values->append(GLES_ENUMERATION_NOTEQUAL); + ((daeEnumType*)type)->_strings->append("GEQUAL"); + ((daeEnumType*)type)->_values->append(GLES_ENUMERATION_GEQUAL); + ((daeEnumType*)type)->_strings->append("ALWAYS"); + ((daeEnumType*)type)->_values->append(GLES_ENUMERATION_ALWAYS); + ((daeEnumType*)type)->_strings->append("KEEP"); + ((daeEnumType*)type)->_values->append(GLES_ENUMERATION_KEEP); + ((daeEnumType*)type)->_strings->append("REPLACE"); + ((daeEnumType*)type)->_values->append(GLES_ENUMERATION_REPLACE); + ((daeEnumType*)type)->_strings->append("INCR"); + ((daeEnumType*)type)->_values->append(GLES_ENUMERATION_INCR); + ((daeEnumType*)type)->_strings->append("DECR"); + ((daeEnumType*)type)->_values->append(GLES_ENUMERATION_DECR); + ((daeEnumType*)type)->_strings->append("INVERT"); + ((daeEnumType*)type)->_values->append(GLES_ENUMERATION_INVERT); + ((daeEnumType*)type)->_strings->append("INCR_WRAP"); + ((daeEnumType*)type)->_values->append(GLES_ENUMERATION_INCR_WRAP); + ((daeEnumType*)type)->_strings->append("DECR_WRAP"); + ((daeEnumType*)type)->_values->append(GLES_ENUMERATION_DECR_WRAP); + ((daeEnumType*)type)->_strings->append("EMISSION"); + ((daeEnumType*)type)->_values->append(GLES_ENUMERATION_EMISSION); + ((daeEnumType*)type)->_strings->append("AMBIENT"); + ((daeEnumType*)type)->_values->append(GLES_ENUMERATION_AMBIENT); + ((daeEnumType*)type)->_strings->append("DIFFUSE"); + ((daeEnumType*)type)->_values->append(GLES_ENUMERATION_DIFFUSE); + ((daeEnumType*)type)->_strings->append("SPECULAR"); + ((daeEnumType*)type)->_values->append(GLES_ENUMERATION_SPECULAR); + ((daeEnumType*)type)->_strings->append("AMBIENT_AND_DIFFUSE"); + ((daeEnumType*)type)->_values->append(GLES_ENUMERATION_AMBIENT_AND_DIFFUSE); + ((daeEnumType*)type)->_strings->append("LINEAR"); + ((daeEnumType*)type)->_values->append(GLES_ENUMERATION_LINEAR); + ((daeEnumType*)type)->_strings->append("EXP"); + ((daeEnumType*)type)->_values->append(GLES_ENUMERATION_EXP); + ((daeEnumType*)type)->_strings->append("EXP2"); + ((daeEnumType*)type)->_values->append(GLES_ENUMERATION_EXP2); + ((daeEnumType*)type)->_strings->append("CW"); + ((daeEnumType*)type)->_values->append(GLES_ENUMERATION_CW); + ((daeEnumType*)type)->_strings->append("CCW"); + ((daeEnumType*)type)->_values->append(GLES_ENUMERATION_CCW); + ((daeEnumType*)type)->_strings->append("SINGLE_COLOR"); + ((daeEnumType*)type)->_values->append(GLES_ENUMERATION_SINGLE_COLOR); + ((daeEnumType*)type)->_strings->append("SEPARATE_SPECULAR_COLOR"); + ((daeEnumType*)type)->_values->append(GLES_ENUMERATION_SEPARATE_SPECULAR_COLOR); + ((daeEnumType*)type)->_strings->append("CLEAR"); + ((daeEnumType*)type)->_values->append(GLES_ENUMERATION_CLEAR); + ((daeEnumType*)type)->_strings->append("AND"); + ((daeEnumType*)type)->_values->append(GLES_ENUMERATION_AND); + ((daeEnumType*)type)->_strings->append("AND_REVERSE"); + ((daeEnumType*)type)->_values->append(GLES_ENUMERATION_AND_REVERSE); + ((daeEnumType*)type)->_strings->append("COPY"); + ((daeEnumType*)type)->_values->append(GLES_ENUMERATION_COPY); + ((daeEnumType*)type)->_strings->append("AND_INVERTED"); + ((daeEnumType*)type)->_values->append(GLES_ENUMERATION_AND_INVERTED); + ((daeEnumType*)type)->_strings->append("NOOP"); + ((daeEnumType*)type)->_values->append(GLES_ENUMERATION_NOOP); + ((daeEnumType*)type)->_strings->append("XOR"); + ((daeEnumType*)type)->_values->append(GLES_ENUMERATION_XOR); + ((daeEnumType*)type)->_strings->append("OR"); + ((daeEnumType*)type)->_values->append(GLES_ENUMERATION_OR); + ((daeEnumType*)type)->_strings->append("NOR"); + ((daeEnumType*)type)->_values->append(GLES_ENUMERATION_NOR); + ((daeEnumType*)type)->_strings->append("EQUIV"); + ((daeEnumType*)type)->_values->append(GLES_ENUMERATION_EQUIV); + ((daeEnumType*)type)->_strings->append("OR_REVERSE"); + ((daeEnumType*)type)->_values->append(GLES_ENUMERATION_OR_REVERSE); + ((daeEnumType*)type)->_strings->append("COPY_INVERTED"); + ((daeEnumType*)type)->_values->append(GLES_ENUMERATION_COPY_INVERTED); + ((daeEnumType*)type)->_strings->append("NAND"); + ((daeEnumType*)type)->_values->append(GLES_ENUMERATION_NAND); + ((daeEnumType*)type)->_strings->append("SET"); + ((daeEnumType*)type)->_values->append(GLES_ENUMERATION_SET); + ((daeEnumType*)type)->_strings->append("POINT"); + ((daeEnumType*)type)->_values->append(GLES_ENUMERATION_POINT); + ((daeEnumType*)type)->_strings->append("LINE"); + ((daeEnumType*)type)->_values->append(GLES_ENUMERATION_LINE); + ((daeEnumType*)type)->_strings->append("FILL"); + ((daeEnumType*)type)->_values->append(GLES_ENUMERATION_FILL); + ((daeEnumType*)type)->_strings->append("FLAT"); + ((daeEnumType*)type)->_values->append(GLES_ENUMERATION_FLAT); + ((daeEnumType*)type)->_strings->append("SMOOTH"); + ((daeEnumType*)type)->_values->append(GLES_ENUMERATION_SMOOTH); + daeAtomicType::append( type ); + + // TYPEDEF: Gles_rendertarget_common //check if this type has an existing base + type = daeAtomicType::get("xsNCName"); + if ( type == NULL ) { //register as a raw type + type = new daeRawRefType; + type->_nameBindings.append("Gles_rendertarget_common"); + daeAtomicType::append( type ); + } + else { //add binding to existing type + type->_nameBindings.append("Gles_rendertarget_common"); + } + + // ENUM: SpringType + type = new daeEnumType; + type->_nameBindings.append("SpringType"); + ((daeEnumType*)type)->_strings = new daeStringRefArray; + ((daeEnumType*)type)->_values = new daeEnumArray; + ((daeEnumType*)type)->_strings->append("LINEAR"); + ((daeEnumType*)type)->_values->append(SPRINGTYPE_LINEAR); + ((daeEnumType*)type)->_strings->append("ANGULAR"); + ((daeEnumType*)type)->_values->append(SPRINGTYPE_ANGULAR); + daeAtomicType::append( type ); + +} + +daeMetaElement* registerDomElements() +{ + daeMetaElement* meta = domCOLLADA::registerElement(); + // Enable tracking of top level object by default + domCOLLADA::_Meta->setIsTrackableForQueries(true); + return meta; +} diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domVertices.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domVertices.cpp new file mode 100644 index 00000000..08f9ccac --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domVertices.cpp @@ -0,0 +1,92 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domVertices::create(daeInt bytes) +{ + domVerticesRef ref = new(bytes) domVertices; + return ref; +} + + +daeMetaElement * +domVertices::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "vertices" ); + _Meta->registerClass(domVertices::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, -1 ); + mea->setName( "input" ); + mea->setOffset( daeOffsetOf(domVertices,elemInput_array) ); + mea->setElementType( domInputLocal::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 1, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domVertices,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 1 ); + _Meta->setCMRoot( cm ); + + // Add attribute: id + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "id" ); + ma->setType( daeAtomicType::get("xsID")); + ma->setOffset( daeOffsetOf( domVertices , attrId )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: name + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "name" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domVertices , attrName )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domVertices)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domVertices::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domVisual_scene.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domVisual_scene.cpp new file mode 100644 index 00000000..91084acf --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/1.4/dom/domVisual_scene.cpp @@ -0,0 +1,248 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domVisual_scene::create(daeInt bytes) +{ + domVisual_sceneRef ref = new(bytes) domVisual_scene; + return ref; +} + + +daeMetaElement * +domVisual_scene::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "visual_scene" ); + _Meta->registerClass(domVisual_scene::create, &_Meta); + + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementAttribute( _Meta, cm, 0, 0, 1 ); + mea->setName( "asset" ); + mea->setOffset( daeOffsetOf(domVisual_scene,elemAsset) ); + mea->setElementType( domAsset::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 1, 1, -1 ); + mea->setName( "node" ); + mea->setOffset( daeOffsetOf(domVisual_scene,elemNode_array) ); + mea->setElementType( domNode::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 2, 0, -1 ); + mea->setName( "evaluate_scene" ); + mea->setOffset( daeOffsetOf(domVisual_scene,elemEvaluate_scene_array) ); + mea->setElementType( domVisual_scene::domEvaluate_scene::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 3, 0, -1 ); + mea->setName( "extra" ); + mea->setOffset( daeOffsetOf(domVisual_scene,elemExtra_array) ); + mea->setElementType( domExtra::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 3 ); + _Meta->setCMRoot( cm ); + + // Add attribute: id + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "id" ); + ma->setType( daeAtomicType::get("xsID")); + ma->setOffset( daeOffsetOf( domVisual_scene , attrId )); + ma->setContainer( _Meta ); + ma->setIsRequired( false ); + + _Meta->appendAttribute(ma); + } + + // Add attribute: name + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "name" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domVisual_scene , attrName )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domVisual_scene)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domVisual_scene::domEvaluate_scene::create(daeInt bytes) +{ + domVisual_scene::domEvaluate_sceneRef ref = new(bytes) domVisual_scene::domEvaluate_scene; + return ref; +} + + +daeMetaElement * +domVisual_scene::domEvaluate_scene::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "evaluate_scene" ); + _Meta->registerClass(domVisual_scene::domEvaluate_scene::create, &_Meta); + + _Meta->setIsInnerClass( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 1, -1 ); + mea->setName( "render" ); + mea->setOffset( daeOffsetOf(domVisual_scene::domEvaluate_scene,elemRender_array) ); + mea->setElementType( domVisual_scene::domEvaluate_scene::domRender::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 0 ); + _Meta->setCMRoot( cm ); + + // Add attribute: name + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "name" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domVisual_scene::domEvaluate_scene , attrName )); + ma->setContainer( _Meta ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domVisual_scene::domEvaluate_scene)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domVisual_scene::domEvaluate_scene::domRender::create(daeInt bytes) +{ + domVisual_scene::domEvaluate_scene::domRenderRef ref = new(bytes) domVisual_scene::domEvaluate_scene::domRender; + ref->attrCamera_node.setContainer( (domVisual_scene::domEvaluate_scene::domRender*)ref ); + return ref; +} + + +daeMetaElement * +domVisual_scene::domEvaluate_scene::domRender::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "render" ); + _Meta->registerClass(domVisual_scene::domEvaluate_scene::domRender::create, &_Meta); + + _Meta->setIsInnerClass( true ); + daeMetaCMPolicy *cm = NULL; + daeMetaElementAttribute *mea = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + mea = new daeMetaElementArrayAttribute( _Meta, cm, 0, 0, -1 ); + mea->setName( "layer" ); + mea->setOffset( daeOffsetOf(domVisual_scene::domEvaluate_scene::domRender,elemLayer_array) ); + mea->setElementType( domVisual_scene::domEvaluate_scene::domRender::domLayer::registerElement() ); + cm->appendChild( mea ); + + mea = new daeMetaElementAttribute( _Meta, cm, 1, 0, 1 ); + mea->setName( "instance_effect" ); + mea->setOffset( daeOffsetOf(domVisual_scene::domEvaluate_scene::domRender,elemInstance_effect) ); + mea->setElementType( domInstance_effect::registerElement() ); + cm->appendChild( mea ); + + cm->setMaxOrdinal( 1 ); + _Meta->setCMRoot( cm ); + + // Add attribute: camera_node + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "camera_node" ); + ma->setType( daeAtomicType::get("xsAnyURI")); + ma->setOffset( daeOffsetOf( domVisual_scene::domEvaluate_scene::domRender , attrCamera_node )); + ma->setContainer( _Meta ); + ma->setIsRequired( true ); + + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domVisual_scene::domEvaluate_scene::domRender)); + _Meta->validate(); + + return _Meta; +} + +daeElementRef +domVisual_scene::domEvaluate_scene::domRender::domLayer::create(daeInt bytes) +{ + domVisual_scene::domEvaluate_scene::domRender::domLayerRef ref = new(bytes) domVisual_scene::domEvaluate_scene::domRender::domLayer; + return ref; +} + + +daeMetaElement * +domVisual_scene::domEvaluate_scene::domRender::domLayer::registerElement() +{ + if ( _Meta != NULL ) return _Meta; + + _Meta = new daeMetaElement; + _Meta->setName( "layer" ); + _Meta->registerClass(domVisual_scene::domEvaluate_scene::domRender::domLayer::create, &_Meta); + + _Meta->setIsInnerClass( true ); + // Add attribute: _value + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("xsNCName")); + ma->setOffset( daeOffsetOf( domVisual_scene::domEvaluate_scene::domRender::domLayer , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + + _Meta->setElementSize(sizeof(domVisual_scene::domEvaluate_scene::domRender::domLayer)); + _Meta->validate(); + + return _Meta; +} + + +daeMetaElement * domVisual_scene::_Meta = NULL; +daeMetaElement * domVisual_scene::domEvaluate_scene::_Meta = NULL; +daeMetaElement * domVisual_scene::domEvaluate_scene::domRender::_Meta = NULL; +daeMetaElement * domVisual_scene::domEvaluate_scene::domRender::domLayer::_Meta = NULL; + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/dae.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/dae.cpp new file mode 100644 index 00000000..a3855c78 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/dae.cpp @@ -0,0 +1,385 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include + +#ifndef NO_DEFAULT_PLUGIN +#ifndef DEFAULT_BXCEPLUGIN +#include +#include +#else +//This plugin is not provided with the public release. If you don't know about it then you don't need +//to worry about it. +#include +#include +#endif +#endif + +// Don't include domConstants.h because it varies depending on the dom version, +// just extern the one thing we need (COLLADA_VERSION) which all versions of +// domConstants.h/.cpp are required to define. + +extern daeString COLLADA_VERSION; + +daeInt DAEInstanceCount = 0; +daeMetaElement *DAE::topMeta = NULL; + +void +DAE::cleanup() +{ + if (topMeta != NULL) { + daeMetaElement::releaseMetas(); + daeAtomicType::uninitializeKnownTypes(); + topMeta = NULL; +//Contributed by Nus - Wed, 08 Nov 2006 + terminateURI(); + terminateResolveArray(); + daeStringRef::releaseStringTable(); + daeIDRefResolver::terminateIDRefSolver(); +//---------------------- + } +} + +// constructor +DAE::DAE() : database(NULL), + plugin(NULL), + resolver(NULL), + idResolver(NULL), + defaultDatabase(false), + defaultPlugin(false), + registerFunc(NULL) +{ +//Contributed by Nus - Wed, 08 Nov 2006 + initializeURI(); + initializeResolveArray(); + daeIDRefResolver::initializeIDRefSolver(); +//------------------------ + if ( DAEInstanceCount == 0 ) { + topMeta = initializeDomMeta(); + } + DAEInstanceCount++; +} + +DAE::~DAE() +{ + if (defaultDatabase) + delete database; + if (defaultPlugin) { + delete plugin; + delete resolver; + delete idResolver; + } + daeElement::clearResolveArray(); + --DAEInstanceCount; + if ( DAEInstanceCount <= 0 ) + { + cleanup(); + } +} + +// Database setup +daeDatabase* DAE::getDatabase() +{ + return database; +} + +daeInt DAE::setDatabase(daeDatabase* _database) +{ + if (defaultDatabase) + delete database; + if (_database) + database = _database; + else + { + //create default database + database = new daeSTLDatabase; + defaultDatabase = true; + } + // !!!GAC Not sure what good the error return is, current implementations never fail, what would we do if they did? + int res = database->setMeta(topMeta); + (void)res; + return DAE_OK; +} + +// IO Plugin setup +daeIOPlugin* DAE::getIOPlugin() +{ + return plugin; +} + +daeInt DAE::setIOPlugin(daeIOPlugin* _plugin) +{ + if (defaultPlugin) + delete plugin; + if (_plugin) + plugin = _plugin; + else + { + //create default plugin +#ifndef NO_DEFAULT_PLUGIN +#ifndef DEFAULT_BXCEPLUGIN + plugin = new daeLIBXMLPlugin; + defaultPlugin = true; + resolver = new daeLIBXMLResolver(database,plugin); +#else + plugin = new daebXCePlugin(); + defaultPlugin = true; + resolver = new daebXCeResolver(database, plugin); +#endif +#else + daeErrorHandler::get()->handleWarning( "No IOPlugin Set! NO_DEFAULT_PLUGIN is defined." ); + plugin = NULL; + return DAE_ERR_BACKEND_IO; +#endif + + // Setup the IDRef resolver + idResolver = new daeDefaultIDRefResolver(database); + } + int res = plugin->setMeta(topMeta); + if (res != DAE_OK) + { + if (defaultPlugin) + { + defaultPlugin = false; + delete plugin; + } + plugin = NULL; + return res; + } + return DAE_OK; +} + +// Integration Library Setup +daeIntegrationLibraryFunc DAE::getIntegrationLibrary() +{ + return registerFunc; +} + +daeInt DAE::setIntegrationLibrary(daeIntegrationLibraryFunc _registerFunc) +{ + registerFunc = _registerFunc; + return DAE_OK; +} + +// batch file operations +daeInt DAE::load(daeString name, daeString docBuffer) +{ + if (!database) + setDatabase(NULL); + + if (!plugin) + setIOPlugin(NULL); + + if (registerFunc) + registerFunc(); + + if ( !plugin || !database ) { + //printf( "no plugin or database\n" ); + daeErrorHandler::get()->handleError("no plugin or database\n"); + return DAE_ERR_BACKEND_IO; + } + + plugin->setDatabase(database); + + if (!name || name[0] == '\0') + return DAE_ERR_INVALID_CALL; + + daeURI tempURI(name); + + return plugin->read(tempURI, docBuffer); +} +daeInt DAE::save(daeString documentName, daeBool replace) +{ + if (!database) + setDatabase(NULL); + + if (!plugin) + setIOPlugin(NULL); + + if (registerFunc) + registerFunc(); + + if ( !plugin || !database ) { + return DAE_ERR_BACKEND_IO; + } + + plugin->setDatabase(database); + + // Find the document we want by name + daeDocument* document = database->getDocument(documentName); + if(document == NULL) + return DAE_ERR_COLLECTION_DOES_NOT_EXIST; + + // Save it out to the URI it was loaded from + return plugin->write(document->getDocumentURI(), document, replace); + +} +daeInt DAE::save(daeUInt documentIndex, daeBool replace) +{ + if (!database) + setDatabase(NULL); + + if (!plugin) + setIOPlugin(NULL); + + if (registerFunc) + registerFunc(); + + if ( !plugin || !database ) { + return DAE_ERR_BACKEND_IO; + } + + plugin->setDatabase(database); + + if(documentIndex >= database->getDocumentCount()) + return DAE_ERR_COLLECTION_DOES_NOT_EXIST; + + daeDocument *document = database->getDocument(documentIndex); + + // Save it out to the URI it was loaded from + return plugin->write(document->getDocumentURI(), document, replace); +} +daeInt DAE::saveAs(daeString name, daeString documentName, daeBool replace) +{ + if (!database) + setDatabase(NULL); + + if (!plugin) + setIOPlugin(NULL); + + if (registerFunc) + registerFunc(); + + if ( !plugin || !database ) { + return DAE_ERR_BACKEND_IO; + } + + plugin->setDatabase(database); + + // Find the document we want by name + daeDocument* document = database->getDocument(documentName); + if(document == NULL) + return DAE_ERR_COLLECTION_DOES_NOT_EXIST; + + // Make a URI from "name" and save to that + + daeURI tempURI(name, true); + return plugin->write(&tempURI, document, replace); + +} +daeInt DAE::saveAs(daeString name, daeUInt documentIndex, daeBool replace) +{ + if (!database) + setDatabase(NULL); + + if (!plugin) + setIOPlugin(NULL); + + if (registerFunc) + registerFunc(); + + if ( !plugin || !database ) { + return DAE_ERR_BACKEND_IO; + } + + plugin->setDatabase(database); + + if(documentIndex >= database->getDocumentCount()) + return DAE_ERR_COLLECTION_DOES_NOT_EXIST; + + daeDocument *document = database->getDocument(documentIndex); + + daeURI tempURI(name); + return plugin->write(&tempURI, document, replace); +} +daeInt DAE::unload(daeString name) +{ + daeDocument *col = database->getDocument( name ); + if ( col == NULL ) return DAE_ERR_COLLECTION_DOES_NOT_EXIST; + return database->removeDocument( col ); +} + +daeInt DAE::clear() +{ + daeElement::clearResolveArray(); + if (database) + database->clear(); + return DAE_OK; +} + +// Load/Save Progress +void DAE::getProgress(daeInt* bytesParsed,daeInt* lineNumber,daeInt* totalBytes,daeBool reset) +{ + if (!database || !plugin) + { + if (bytesParsed) + *bytesParsed=0; + if (bytesParsed) + *lineNumber=0; + if (totalBytes) + *totalBytes=0; + } + else + plugin->getProgress(bytesParsed,lineNumber,totalBytes,reset); +} + +// Simple Query +domCOLLADA* DAE::getDom(daeString name) +{ + if (!database) + return NULL; + + // Find the document by name + daeDocument *document = database->getDocument(name); + if(document) + { + // Return the root domCOLLADA element + return (domCOLLADA*)(daeElement*)document->getDomRoot(); + } + else + { + return(NULL); + } +} + +daeInt DAE::setDom(daeString name, domCOLLADA* dom) +{ + if (!database) + setDatabase(NULL); + + // Find the document by name + + daeDocument *document = database->getDocument(name); + + if(document) + { + //replace a DOM on an existing document by the one provided. + // Note that the casts are needed because we don't want to include the full definition of domCOLLADA + document->setDomRoot((daeElement*)dom); + return DAE_OK; + } + else + { + // Document doesn't exist, make a new one + return database->insertDocument(name,(daeElement*)dom); + } +} +daeString DAE::getDomVersion() +{ + return(COLLADA_VERSION); +} diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/daeArray.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/daeArray.cpp new file mode 100644 index 00000000..13945d90 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/daeArray.cpp @@ -0,0 +1,85 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include + +daeArray::daeArray():_count(0),_capacity(0),_data(NULL),_elementSize(4),_type(NULL) +{ +} + +daeArray::~daeArray() +{ + clear(); +} + +void +daeArray::clear() +{ + if (_data) + { + daeMemorySystem::free("array",_data); + _capacity = 0; + _data = NULL; + _count = 0; + } +} + +daeInt +daeArray::removeIndex(size_t index) +{ + if ((index >= _count)||(_count < 1)||(_data == NULL)) + return(DAE_ERR_INVALID_CALL); + if (_count-1-index) + memmove(_data+index*_elementSize, _data+(index+1)*_elementSize, _elementSize*(_count-1-index)); + memset(_data+(_count-1)*_elementSize,0,_elementSize); + _count--; + return(DAE_OK); +} + +void +daeArray::grow(size_t sz) +{ + + if (sz < _capacity) + return; + + size_t newSize = 4*_elementSize; + size_t neccesarySize = (sz+1)*_elementSize; + + while(newSize < neccesarySize) { + if (newSize < 16384) + newSize *= 2; + else + newSize += 16384; + } + + size_t newCapacity = newSize/_elementSize; + daeChar* newData = + (daeChar*)daeMemorySystem::malloc("array", newCapacity*_elementSize); + + if (_data != NULL) + memcpy(newData,_data,_capacity*_elementSize); + //else + // memset(newData,0,_capacity*_elementSize); + + memset(newData+_capacity*_elementSize,0, + (newCapacity-_capacity)*_elementSize); + + if (_data != NULL) + daeMemorySystem::free("array",_data); + + _data = newData; + _capacity = newCapacity; +} + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/daeAtomicType.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/daeAtomicType.cpp new file mode 100644 index 00000000..f2f4c5c5 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/daeAtomicType.cpp @@ -0,0 +1,779 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include + +daeAtomicTypeArray* daeAtomicType::_Types = NULL; +daeBool daeAtomicType::_TypesInitialized = false; + +void +daeAtomicType::initializeKnownTypes() +{ + _Types = new daeAtomicTypeArray; + initializeKnownBaseTypes(); + //mandatory to set here, because the array types are querying the atomic types + _TypesInitialized = true; +} + +void +daeAtomicType::uninitializeKnownTypes() +{ + if ( _TypesInitialized ) + { + _TypesInitialized = false; + unsigned int i; + for (i=0;i<_Types->getCount();i++) + { + daeAtomicType* type = _Types->get(i); + delete type; + } + delete _Types; + } +} + +void +daeAtomicType::initializeKnownBaseTypes() +{ + _Types->append(new daeUIntType); + _Types->append(new daeIntType); + _Types->append(new daeLongType); + _Types->append(new daeShortType); + _Types->append(new daeUIntType); + _Types->append(new daeULongType); + _Types->append(new daeFloatType); + _Types->append(new daeDoubleType); + _Types->append(new daeStringRefType); + _Types->append(new daeElementRefType); + _Types->append(new daeEnumType); + _Types->append(new daeRawRefType); + _Types->append(new daeResolverType); + _Types->append(new daeIDResolverType); + _Types->append(new daeBoolType); + _Types->append(new daeTokenType); +} + +daeAtomicType* +daeAtomicType::get(daeStringRef typeString) +{ + if (!_TypesInitialized) + daeAtomicType::initializeKnownTypes(); + + int tCount = (int)_Types->getCount(); + int i; + for(i=0; iget(i); + daeStringRefArray& nameBindings = type->getNameBindings(); + int count = (int)nameBindings.getCount(); + int j; + for(j=0;jgetCount(); + int i; + for(i=0; iget(i); + if (type->getTypeEnum() == typeEnum) + return type; + } + return NULL; +} + +daeBool +daeAtomicType::stringToMemory(daeChar *src, daeChar* dstMemory) +{ + sscanf(src, _scanFormat, dstMemory); + return true; +} + +daeBool +daeAtomicType::memoryToString(daeChar* src, daeChar* dst, daeInt dstSize) +{ + // just to remove the warnings + (void)src; + + if (dstSize > 32) + sprintf(dst,"unknown type string conversion\n"); + return true; +} + +daeInt +daeAtomicType::append(daeAtomicType* t) { + if (!_TypesInitialized) + daeAtomicType::initializeKnownTypes(); + return (daeInt)_Types->append(t); +} + +const daeAtomicType* +daeAtomicType::getByIndex(daeInt index) { + return _Types->get(index); +} + +daeInt +daeAtomicType::getCount() { + return (daeInt)_Types->getCount(); +} + +daeEnumType::daeEnumType() +{ + _size = sizeof(daeEnum); + _alignment = sizeof(daeEnum); + _typeEnum = EnumType; + _nameBindings.append("enum"); + _printFormat = "%s";//"%%.%ds"; + _scanFormat = "%s"; + _strings = NULL; + _values = NULL; + _typeString = "enum"; +} + +daeEnumType::~daeEnumType() { + if ( _strings ) { + delete _strings; + _strings = NULL; + } + if ( _values ) { + delete _values; + _values = NULL; + } +} + +daeBoolType::daeBoolType() +{ + _size = sizeof(daeBool); + _alignment = sizeof(daeBool); + _typeEnum = BoolType; + _printFormat = "%d"; + _scanFormat = "%d"; + _typeString = "bool"; + _maxStringLength = (daeInt)strlen("false")+1; + _nameBindings.append("bool"); + //_nameBindings.append("xsBool"); + _nameBindings.append("xsBoolean"); +} + +daeIntType::daeIntType() +{ + _size = sizeof(daeInt); + _alignment = sizeof(daeInt); + _typeEnum = IntType; + _maxStringLength = 16; + _nameBindings.append("int"); + _nameBindings.append("xsInteger"); + _nameBindings.append("xsHexBinary"); + _nameBindings.append("xsIntegerArray"); + _nameBindings.append("xsHexBinaryArray"); + _nameBindings.append("xsByte"); + _nameBindings.append("xsInt"); + _printFormat = "%d"; + _scanFormat = "%d"; + _typeString = "int"; +} +daeLongType::daeLongType() +{ + _size = sizeof(daeLong); + _alignment = sizeof(daeLong); + _typeEnum = LongType; + _maxStringLength = 32; + _nameBindings.append("xsLong"); + _nameBindings.append("xsLongArray"); + _printFormat = "%lld"; + _scanFormat = "%lld"; + _typeString = "long"; +} +daeShortType::daeShortType() +{ + _maxStringLength = 8; + _size = sizeof(daeShort); + _alignment = sizeof(daeShort); + _typeEnum = ShortType; + _nameBindings.append("short"); + _nameBindings.append("xsShort"); + _printFormat = "%hd"; + _scanFormat = "%hd"; + _typeString = "short"; +} +daeUIntType::daeUIntType() +{ + _maxStringLength = 16; + _size = sizeof(daeUInt); + _alignment = sizeof(daeUInt); + _typeEnum = UIntType; + _nameBindings.append("uint"); + _nameBindings.append("xsNonNegativeInteger"); + _nameBindings.append("xsUnsignedByte"); + _nameBindings.append("xsUnsignedInt"); + _nameBindings.append("xsPositiveInteger"); + _printFormat = "%u"; + _scanFormat = "%u"; + _typeString = "uint"; +} +daeULongType::daeULongType() +{ + _size = sizeof(daeULong); + _alignment = sizeof(daeULong); + _typeEnum = ULongType; + _maxStringLength = 32; + _nameBindings.append("ulong"); + _nameBindings.append("xsUnsignedLong"); + _printFormat = "%llu"; + _scanFormat = "%llu"; + _typeString = "ulong"; +} +daeFloatType::daeFloatType() +{ + _maxStringLength = 64; + _size = sizeof(daeFloat); + _alignment = sizeof(daeFloat); + _typeEnum = FloatType; + _nameBindings.append("float"); + _nameBindings.append("xsFloat"); + _printFormat = "%g"; + _scanFormat = "%g"; + _typeString = "float"; +} +daeDoubleType::daeDoubleType() +{ + _size = sizeof(daeDouble); + _alignment = sizeof(daeDouble); + _typeEnum = DoubleType; + _nameBindings.append("double"); + _nameBindings.append("xsDouble"); + _nameBindings.append("xsDecimal"); + _printFormat = "%lg"; + _scanFormat = "%lg"; + _typeString = "double"; + _maxStringLength = 64; +} + +daeStringRefType::daeStringRefType() +{ + _size = sizeof(daeStringRef); + _alignment = sizeof(daeStringRef); + _typeEnum = StringRefType; + _nameBindings.append("string"); + _nameBindings.append("xsString"); + _nameBindings.append("xsDateTime"); + _printFormat = "%s"; + _scanFormat = "%s"; + _typeString = "string"; +} + +daeTokenType::daeTokenType() +{ + _size = sizeof(daeStringRef); + _alignment = sizeof(daeStringRef); + _typeEnum = TokenType; + _nameBindings.append("token"); + _nameBindings.append("xsID"); + _nameBindings.append("xsNCName"); + _nameBindings.append("xsNMTOKEN"); + _nameBindings.append("xsName"); + _nameBindings.append("xsToken"); + _nameBindings.append("xsNameArray"); + _nameBindings.append("xsTokenArray"); + _nameBindings.append("xsNCNameArray"); + _printFormat = "%s"; + _scanFormat = "%s"; + _typeString = "token"; +} + +daeElementRefType::daeElementRefType() +{ + _size = sizeof(daeElementRef); + _alignment = sizeof(daeElementRef); + _typeEnum = ElementRefType; + _nameBindings.append("element"); + _nameBindings.append("Element"); + _nameBindings.append("TrackedElement"); + _printFormat = "%p"; + _scanFormat = "%p"; + _typeString = "element"; + _maxStringLength = 64; +} + +daeRawRefType::daeRawRefType() +{ + _size = sizeof(daeRawRef); + _alignment = sizeof(daeRawRef); + _typeEnum = RawRefType; + _nameBindings.append("raw"); + _printFormat = "%p"; + _scanFormat = "%p"; + _typeString = "raw"; + _maxStringLength = 64; +} + +daeResolverType::daeResolverType() +{ + _size = sizeof(daeURI); + _alignment = sizeof(daeURI); + _typeEnum = ResolverType; + _nameBindings.append("resolver"); + _nameBindings.append("xsAnyURI"); + _printFormat = "%s"; + _scanFormat = "%s"; + _typeString = "resolver"; +} +daeIDResolverType::daeIDResolverType() +{ + _size = sizeof(daeIDRef); + _alignment = sizeof(daeIDRef); + _typeEnum = IDResolverType; + _nameBindings.append("xsIDREF"); + _nameBindings.append("xsIDREFS"); + _printFormat = "%s"; + _scanFormat = "%s"; + _typeString = "idref_resolver"; +} +daeBool + daeIntType::memoryToString(daeChar* src, daeChar* dst, daeInt dstSize) +{ + if (_maxStringLength > dstSize) return false; + sprintf(dst,_printFormat,*((daeInt*)src)); + return true; +} +daeBool + daeLongType::memoryToString(daeChar* src, daeChar* dst, daeInt dstSize) +{ + if (_maxStringLength > dstSize) return false; + sprintf(dst,_printFormat,*((daeLong*)src)); + return true; +} +daeBool + daeShortType::memoryToString(daeChar* src, daeChar* dst, daeInt dstSize) +{ + if (_maxStringLength > dstSize) return false; + sprintf(dst,_printFormat,*((daeShort*)src)); + return true; +} +daeBool + daeUIntType::memoryToString(daeChar* src, daeChar* dst, daeInt dstSize) +{ + if (_maxStringLength > dstSize) return false; + sprintf(dst,_printFormat,*((daeUInt*)src)); + return true; +} +daeBool + daeULongType::memoryToString(daeChar* src, daeChar* dst, daeInt dstSize) +{ + if (_maxStringLength > dstSize) return false; + sprintf(dst,_printFormat,*((daeULong*)src)); + return true; +} +daeBool + daeFloatType::memoryToString(daeChar* src, daeChar* dst, daeInt dstSize) +{ + if (_maxStringLength > dstSize) return false; + if ( *(daeFloat*)src != *(daeFloat*)src ) //NAN + { + strcpy( dst, "NaN" ); + } + else if ( *(daeUInt*)src == 0x7f800000 ) //+INF + { + strcpy( dst, "INF" ); + } + else if ( *(daeUInt*)src == 0xff800000 ) //-INF + { + strcpy( dst, "-INF" ); + } + else + { + sprintf(dst,_printFormat,*((daeFloat*)src)); + } + return true; +} + +daeBool +daeFloatType::stringToMemory(daeChar *src, daeChar* dstMemory) +{ + if ( strcmp(src, "NaN") == 0 ) { + daeErrorHandler::get()->handleWarning("NaN encountered while setting an attribute or value\n"); + *(daeInt*)(dstMemory) = 0x7f800002; + } + else if ( strcmp(src, "INF") == 0 ) { + daeErrorHandler::get()->handleWarning( "INF encountered while setting an attribute or value\n" ); + *(daeInt*)(dstMemory) = 0x7f800000; + } + else if ( strcmp(src, "-INF") == 0 ) { + daeErrorHandler::get()->handleWarning( "-INF encountered while setting an attribute or value\n" ); + *(daeInt*)(dstMemory) = 0xff800000; + } + else + { + sscanf(src, _scanFormat, dstMemory); + } + return true; +} + +daeBool + daeDoubleType::memoryToString(daeChar* src, daeChar* dst, daeInt dstSize) +{ + if (_maxStringLength > dstSize) return false; + if ( *(daeDouble*)src != *(daeDouble*)src ) //NAN + { + strcpy( dst, "NaN" ); + } +#if !(defined (_MSC_VER) && _MSC_VER < 1300) + //this breaks visual studio 2006, so ignore NaN/INF rather then break the build + else if ( *(daeULong*)src == 0x7ff0000000000000LL ) //+INF + { + strcpy( dst, "INF" ); + } + else if ( *(daeULong*)src == 0xfff0000000000000LL ) //-INF + { + strcpy( dst, "-INF" ); + } +#endif + else + { + sprintf(dst,_printFormat,*((daeDouble*)src)); + } + return true; +} + +daeBool +daeDoubleType::stringToMemory(daeChar *src, daeChar* dstMemory) +{ +#if !(defined (_MSC_VER) && _MSC_VER < 1300) + //this breaks visual studio 2006, so ignore NaN/INF rather then break the build + if ( strcmp(src, "NaN") == 0 ) { + daeErrorHandler::get()->handleWarning( "NaN encountered while setting an attribute or value\n" ); + *(daeLong*)(dstMemory) = 0x7ff0000000000002LL; + } + else if ( strcmp(src, "INF") == 0 ) { + daeErrorHandler::get()->handleWarning( "INF encountered while setting an attribute or value\n" ); + *(daeLong*)(dstMemory) = 0x7ff0000000000000LL; + } + else if ( strcmp(src, "-INF") == 0 ) { + daeErrorHandler::get()->handleWarning( "-INF encountered while setting an attribute or value\n" ); + *(daeLong*)(dstMemory) = 0xfff0000000000000LL; + } + else +#endif + { + sscanf(src, _scanFormat, dstMemory); + } + return true; +} + +daeBool + daeRawRefType::memoryToString(daeChar* src, daeChar* dst, daeInt dstSize) +{ + if (_maxStringLength > dstSize) return false; + sprintf(dst,"%p",(void *)(*((daeRawRef*)src))); + return true; +} + +daeBool +daeStringRefType::getUsesStrings() +{ + return true; +} +daeBool +daeTokenType::getUsesStrings() +{ + return false; +} +daeBool +daeStringRefType::memoryToString(daeChar* src, daeChar* dst, daeInt dstSize) +{ + daeString s = *((daeStringRef *)src); + if (!s || strlen(s) == 0) + dst[0] = '\0'; + else { + char tmp[64]; + sprintf(tmp,"%%.%ds",dstSize-1); + sprintf(dst,tmp,(const char*)s); + + if ((daeInt)(strlen(s)+1) > dstSize) + return false; + } + return true; +} + +daeBool +daeResolverType::memoryToString(daeChar* src, daeChar* dst, daeInt dstSize) +{ +#if 1 + // Get the URI we are trying to write + daeURI *thisURI = ((daeURI *)src); + daeString s; + + // !!!GAC We may want to re-resolve the URI before writing, if so call thisURI->resolveURI() here + // !!!GAC if you're willing to trust that everything is properly resolved, this isn't needed + + // Was this URI successfully resolved ? (if element or collection is null, we can't write the URI correctly) + if(thisURI->getState() != daeURI::uri_success || !(thisURI->getElement()) || !(thisURI->getContainer())) + { + // This URI was never successfully resolved, so write out it's original value + s = thisURI->getOriginalURI(); + if ( s == NULL ) s = ""; + } + else + { + // This URI was successfully resolved, we need to determine if it is referencing this document (the one being written) + // or some other document so we know what URI to write out. + // !!!GAC this approach should be safe, if the collection pointer of our document matches the collection pointer + // !!!GAC of the element our URI is pointing at, we are pointing at our own doc. + if(thisURI->getElement()->getDocument() == thisURI->getContainer()->getDocument()) + { + // we will send back the original URI if we're pointing at ourselves + s = thisURI->getOriginalURI(); + if ( s == NULL ) s = ""; + } + else + { + // !!!GAC change this to test outputting of relative URIs, NOT FULLY TESTED!!! +#if 1 + // we will send back the full resolved URI + s = thisURI->getURI(); + if ( s == NULL ) s = ""; +#else + // Makes the URI relative to the document being written, EXPERIMENTAL, not fully tested!!! + thisURI->makeRelativeTo(thisURI->getDocument()->getCollection()->getDocumentURI()); + s = thisURI->getOriginalURI(); + if ( s == NULL ) s = ""; +#endif + } + } + // Copy at most dstSize-1 characters, null terminate and return error if the string was too long + daeChar *d; + int i; + for(d = dst, i = 1; *s != 0 && iresolveURI(); + + // Get the URI String as set, not the composited one from the base + // as per SCEA request + daeString s = ((daeURI *)src)->getOriginalURI(); + char tmp[64]; + sprintf(tmp,"%%.%ds",dstSize-1); + sprintf(dst,tmp,s); + + if ((daeInt)(strlen(s)+1) > dstSize) + return false; + return true; +#endif +} +daeBool +daeIDResolverType::memoryToString(daeChar* src, daeChar* dst, daeInt dstSize) +{ + ((daeIDRef*)src)->resolveID(); + + daeString s = ((daeIDRef *)src)->getID(); + char tmp[64]; + sprintf(tmp,"%%.%ds",dstSize-1); + sprintf(dst,tmp,s); + + if ((daeInt)(strlen(s)+1) > dstSize) + return false; + return true; +} + +void +daeAtomicType::resolve(daeElementRef element, daeChar* src) +{ + // just to remove the warnings + (void)element; + (void)src; +} + +void +daeResolverType::resolve(daeElementRef element, daeChar* src) +{ + daeURI* resolver = (daeURI*)src; + resolver->setContainer(element); + resolver->resolveElement(); +} + +daeBool +daeResolverType::stringToMemory(daeChar* src, daeChar* dstMemory) +{ +#define MAX_PATH 1024 + daeChar tempstr[MAX_PATH]; + memset(tempstr,0,MAX_PATH); + daeChar* s; + daeChar* t; + for(s=src, t=tempstr; *s!=0; s++,t++) + { + if (*s == '%') { + if ((*(s+1) == '2') && (*(s+2) == '0')) + { + (*t)=' '; + s+=2; + continue; + } + } else if (*s == ' ') { + char err[512]; + memset( err, 0, 512 ); + sprintf(err,"uri contains white space, dom will convert them to %%20 in output files!\n uri=%s", src); + daeErrorHandler::get()->handleWarning( err ); + } + *t=*s; + } + ((daeURI*)dstMemory)->setURI(tempstr); + return true; +} +void +daeIDResolverType::resolve(daeElementRef element, daeChar* src) +{ + daeIDRef* resolver = (daeIDRef*)src; + resolver->setContainer( element ); + resolver->resolveElement(); +} + +daeBool +daeIDResolverType::stringToMemory(daeChar* src, daeChar* dstMemory) +{ + ((daeIDRef*)dstMemory)->setID(src); + return true; +} + +daeBool +daeStringRefType::stringToMemory(daeChar* srcChars, daeChar* dstMemory) +{ + *((daeStringRef*)dstMemory) = srcChars; + return true; +} + +daeBool +daeEnumType::stringToMemory(daeChar* src, daeChar* dst ) +{ + size_t index(0); + if ( _strings->find(src,index) == DAE_ERR_QUERY_NO_MATCH ) return false; + daeEnum val = _values->get( index ); + *((daeEnum*)dst) = val; + + return true; +} + +daeBool +daeEnumType::memoryToString(daeChar* src, daeChar* dst, daeInt dstSize) +{ + daeStringRef s = "unknown"; + if (_strings != NULL) { + size_t index; + if (_values->find(*((daeEnum*)src), index) == DAE_OK) + s = _strings->get(index); + } + sprintf(dst,_printFormat,(const char*)s); + (void)dstSize; + return true; +} +daeBool +daeBoolType::stringToMemory(daeChar* srcChars, daeChar* dstMemory) +{ + if (strncmp(srcChars,"true",4)==0 || strncmp(srcChars,"1",1)==0) + *((daeBool*)dstMemory) = true; + else + *((daeBool*)dstMemory) = false; + return true; +} + +daeBool +daeBoolType::memoryToString(daeChar* src, daeChar* dst, daeInt dstSize) +{ + if (*((daeBool*)src)) { + if (dstSize < 5) + return false; + else + sprintf(dst,"true"); + } + else { + if (dstSize < 6) + return false; + else + sprintf(dst,"false"); + } + return true; +} +//!!!ACL added for 1.4 complex types and groups + +//unImplemented +daeBool +daeElementRefType::memoryToString(daeChar* src, daeChar* dst, daeInt dstSize) +{ + /*if (*((daeBool*)src)) { + if (dstSize < 5) + return false; + else + sprintf(dst,"true"); + } + else { + if (dstSize < 6) + return false; + else + sprintf(dst,"false"); + }*/ + (void)src; + (void)dst; + (void)dstSize; + return false; +} + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/daeDocument.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/daeDocument.cpp new file mode 100644 index 00000000..be42a39e --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/daeDocument.cpp @@ -0,0 +1,104 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include + +// sthomas +daeDocument::~daeDocument() +{ + for( unsigned int i = 0; i < externalURIs.getCount(); i++ ) { + delete externalURIs[i]; + } +} + +void daeDocument::insertElement( daeElementRef element ) { + daeElement *parent = element->getParentElement(); + size_t idx; + while ( parent != NULL ) { + if ( insertedElements.find( parent, idx ) == DAE_OK ) { + //found an ancestor in the list.. this child will already be added to the database + return; + } + parent = parent->getParentElement(); + } + //if no ancestors are scheduled to be added then we can add element. + insertedElements.append( element ); +} + +void daeDocument::removeElement( daeElementRef element ) { + daeElement *parent = element->getParentElement(); + size_t idx; + while ( parent != NULL ) { + if ( removedElements.find( parent, idx ) == DAE_OK ) { + //found an ancestor in the list.. this child will already be added to the database + return; + } + parent = parent->getParentElement(); + } + removedElements.append( element ); +} + +void daeDocument::addExternalReference( daeURI &uri ) { + if ( uri.getContainer() == NULL || uri.getContainer()->getDocument() != this ) { + return; + } + size_t idx; + daeURI tempURI( uri.getURI(), true ); + daeStringRef docURI( tempURI.getURI() ); + if ( referencedDocuments.find( docURI, idx ) == DAE_OK ) { + externalURIs[idx]->appendUnique( &uri ); + } + else { + referencedDocuments.append( docURI ); + idx = externalURIs.append( new daeTArray ); + externalURIs[idx]->append( &uri ); + } +} + +void daeDocument::removeExternalReference( daeURI &uri ) { + for( unsigned int i = 0; i < externalURIs.getCount(); i++ ) { + for ( unsigned int j = 0; j < externalURIs[i]->getCount(); j++ ) { + daeURI *tempURI = externalURIs[i]->get(j); + if ( tempURI == &uri ) { + //found the uri. now remove it + externalURIs[i]->removeIndex(j); + if ( externalURIs[i]->getCount() == 0 ) { + externalURIs.removeIndex(i); + referencedDocuments.removeIndex(i); + } + return; + } + } + } +} + +void daeDocument::resolveExternals( daeString docURI ) { + size_t idx(0); + if ( referencedDocuments.find( docURI, idx ) == DAE_OK ) { + for ( unsigned int j = 0; j < externalURIs[idx]->getCount(); j++ ) { + daeURI *tempURI = externalURIs[idx]->get(j); + tempURI->resolveElement(); + } + return; + } +} + +const daeTArray *daeDocument::getExternalURIs(daeStringRef docURI) const +{ + size_t idx; + + if (referencedDocuments.find(docURI, idx) != DAE_OK) + return NULL; + + return externalURIs[idx]; +} diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/daeDom.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/daeDom.cpp new file mode 100644 index 00000000..34044e44 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/daeDom.cpp @@ -0,0 +1,24 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ +#include + +#include + +#include + +daeMetaElement* initializeDomMeta() +{ + registerDomTypes(); + + return registerDomElements(); +} diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/daeElement.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/daeElement.cpp new file mode 100644 index 00000000..da9307d8 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/daeElement.cpp @@ -0,0 +1,554 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include + +#include +#include + +void +daeElement::release() const +{ + if (--_refCount <= 0) + delete this; +} +daeElementRef DAECreateElement(int nbytes) +{ + return new(nbytes) daeElement; +} + +//Contributed by Nus - Wed, 08 Nov 2006 +// static daeElementRefArray resolveArray; +static daeElementRefArray* pResolveArray = NULL; +//static char StaticIndentBuf[] = ""; + +extern "C" void initializeResolveArray(void) +{ + if(!pResolveArray) { + pResolveArray = new daeElementRefArray; + } +} + +extern "C" void terminateResolveArray(void) +{ + if(pResolveArray) { + delete pResolveArray; + pResolveArray = NULL; + } +} +//---------------------------------- + +// sthomas (see https://collada.org/public_forum/viewtopic.php?t=325&) +void daeElement::releaseElements() +{ + // resolveArray.clear(); + pResolveArray->clear(); +} + +daeIntegrationObject* +daeElement::getIntObject( IntegrationState from_state, IntegrationState to_state ) +{ + if ( !_intObject ) { + return NULL; + } + if ( from_state >= int_created ) { + if ( _intObject->_from_state < int_created ) { + daeErrorHandler::get()->handleWarning("Warning: getIntObject tries to get object that is not created (from)"); + return NULL; + } + if ( from_state >= int_converted ) { + _intObject->fromCOLLADAChecked(); + if ( from_state == int_finished ) { + _intObject->fromCOLLADAPostProcessChecked(); + } + } + } + if ( to_state >= int_created ) { + if ( _intObject->_to_state < int_created ) { + daeErrorHandler::get()->handleWarning("Warning: getIntObject tries to get object that is not created (to)"); + return NULL; + } + if ( to_state >= int_converted ) { + _intObject->toCOLLADAChecked(); + if ( to_state == int_finished ) { + _intObject->toCOLLADAPostProcessChecked(); + } + } + } + return _intObject; +} + +daeElementRef +daeElement::createElement(daeString className) +{ + daeElementRef elem = _meta->create(className); + // Bug #225 work around +// if ( elem != NULL) +// elem->ref(); // change premature delete into memory leak. + return elem; +} + +daeElement* +daeElement::createAndPlace(daeString className) +{ + daeElementRef elem = _meta->create(className); + daeBool place = false; + if (elem != NULL) + place = placeElement(elem); + if (place) + return elem; + return NULL; +} + +daeElement* +daeElement::createAndPlaceAt(daeInt index, daeString className) +{ + daeElementRef elem = _meta->create(className); + daeBool place = false; + if (elem != NULL) + place = placeElementAt(index, elem); + if (place) + return elem; + return NULL; +} + +daeBool +daeElement::placeElement(daeElement* e) +{ + if (e == NULL || e == this) + return false; + return _meta->place( this, e ); +} + +daeBool daeElement::placeElementAt(daeInt index, daeElement* e) { + if (e == NULL || e == this) + return false; + return _meta->placeAt( index, this, e ); +} + +daeBool daeElement::placeElementBefore( daeElement *marker, daeElement *element ) { + if (marker == NULL || element == NULL || marker->getXMLParentElement() != this ) { + return false; + } + //if ( _meta->getContents() != NULL ) { + // size_t idx; + // daeElementRefArray* contents = + // (daeElementRefArray*)_meta->getContents()->getWritableMemory(this); + // if ( contents->find( marker, idx ) != DAE_OK ) { + // return false; + // } + // return placeElementAt( (daeInt)idx, element ); + //} + //if ( strcmp( marker->getTypeName(), element->getTypeName() ) == 0 ) { + // //same type + // daeMetaElementAttribute *mea = _meta->getChildMetaElementAttribute( element->getTypeName() ); + // daeElementRefArray* era = (daeElementRefArray*)mea->getWritableMemory(this); + // size_t idx; + // if ( era->find( marker, idx ) != DAE_OK ) { + // return false; + // } + // era->insertAt( idx, element ); + // return true; + //} + //return placeElement( element ); + return _meta->placeBefore( marker, this, element ); +} + +daeBool daeElement::placeElementAfter( daeElement *marker, daeElement *element ) { + if (marker == NULL || element == NULL || marker->getXMLParentElement() != this ) { + return false; + } + /*if ( _meta->getContents() != NULL ) { + size_t idx; + daeElementRefArray* contents = + (daeElementRefArray*)_meta->getContents()->getWritableMemory(this); + if ( contents->find( marker, idx ) != DAE_OK ) { + return false; + } + return placeElementAt( (daeInt)idx+1, element ); + } + if ( strcmp( marker->getTypeName(), element->getTypeName() ) == 0 ) { + daeMetaElementAttribute *mea = _meta->getChildMetaElementAttribute( element->getTypeName() ); + daeElementRefArray* era = (daeElementRefArray*)mea->getWritableMemory(this); + size_t idx; + if ( era->find( marker, idx ) != DAE_OK ) { + return false; + } + era->insertAt( idx+1, element ); + return true; + }*/ + return _meta->placeAfter( marker, this, element ); +} + +daeInt daeElement::findLastIndexOf( daeString elementName ) { + if ( _meta->getContents() != NULL ) { + daeElementRefArray* contents = + (daeElementRefArray*)_meta->getContents()->getWritableMemory(this); + for ( int i = (int)contents->getCount()-1; i >= 0; --i ) { + daeString nm = contents->get(i)->getElementName(); + if ( nm == NULL ) { + nm = contents->get(i)->getTypeName(); + } + if ( strcmp( nm, elementName ) == 0 ) { + return i; + } + } + } + return -1; +} + +daeBool +daeElement::removeChildElement(daeElement* element) +{ + // error traps + if(element==NULL) + return false; + if(element->_parent != this) + return false; + + // Clear the element's parent pointer, if the element has references outside + // 'this' it won't go away, so we want to make sure it's parent is valid + if ( _meta->remove( this, element ) ) { + element->_parent = NULL; + return true; + } + return false; +} + +// !!!ACL Added to fix mantis issue 0000416 +void daeElement::setDocument( daeDocument *c ) { + if( _document == c ) { + return; + } + if (_document != NULL ) + { + _document->removeElement(this); + } + _document = c; + if ( _document != NULL ) + { + _document->insertElement(this); + } + + daeElementRefArray ea; + getChildren( ea ); + for ( size_t x = 0; x < ea.getCount(); x++ ) { + ea[x]->setDocument( c ); + } +} + +daeBool +daeElement::setAttribute(daeString attrName, daeString attrValue) +{ + if (_meta == NULL) + return false; + + daeMetaAttributeRefArray& metaAttrs = _meta->getMetaAttributes(); + int n = (int)metaAttrs.getCount(); + int i; + for(i=0;igetName() != NULL) && + (strcmp(metaAttrs[i]->getName(),attrName)==0)) { +#if 0 //debug stuff + printf("%s(%s)->setAttr(%s,%s)\n", + (const char*)_meta->getName(), + metaAttrs[i]->getType()->getTypeString(), + attrName, + attrValue); +#endif + if (metaAttrs[i]->getType() != NULL) + { + metaAttrs[i]->set(this,attrValue); + _validAttributeArray.set(i, true); + } + return true; + } + } + return false; +} + +daeBool daeElement::isAttributeSet( daeString attrName ) { + if (_meta == NULL) + return false; + + daeMetaAttributeRefArray& metaAttrs = _meta->getMetaAttributes(); + int n = (int)metaAttrs.getCount(); + int i; + for(i=0;igetName() != NULL) && + (strcmp(metaAttrs[i]->getName(),attrName)==0)) { + + return _validAttributeArray[i]; + } + } + return false; +} + +daeBool daeElement::hasAttribute( daeString attrName ) { + if (_meta == NULL) + return false; + + daeMetaAttributeRefArray& metaAttrs = _meta->getMetaAttributes(); + int n = (int)metaAttrs.getCount(); + int i; + for(i=0;igetName() != NULL) && + (strcmp(metaAttrs[i]->getName(),attrName)==0)) { + + return true; + } + } + return false; +} + +daeMemoryRef daeElement::getAttributeValue( daeString attrName ) { + if (_meta == NULL) + return false; + + daeMetaAttributeRefArray& metaAttrs = _meta->getMetaAttributes(); + int n = (int)metaAttrs.getCount(); + int i; + for(i=0;igetName() != NULL) && + (strcmp(metaAttrs[i]->getName(),attrName)==0)) { + + return metaAttrs[i]->getWritableMemory(this); + } + } + return NULL; +} + +daeBool daeElement::hasValue() { + if (_meta == NULL) + return false; + + return (_meta->getValueAttribute() != NULL ); +} + +daeMemoryRef daeElement::getValuePointer() { + if (_meta == NULL) + return false; + + if ( _meta->getValueAttribute() != NULL ) + { + return _meta->getValueAttribute()->getWritableMemory(this); + } + return NULL; +} + +void +daeElement::appendResolveElement(daeElement* elem) +{ +//Contributed by Nus - Wed, 08 Nov 2006 + // resolveArray.append(elem); + pResolveArray->append(elem); +//---------------------- +} +void +daeElement::resolveAll() +{ + int cnt; +//Contributed by Nus - Wed, 08 Nov 2006 + // while(resolveArray.getCount()) { + while(pResolveArray->getCount()) { + // cnt = (int)resolveArray.getCount(); + cnt = (int)pResolveArray->getCount(); + // daeElementRef elem = resolveArray[cnt-1]; + daeElementRef elem = (*pResolveArray)[cnt-1]; + // resolveArray.removeIndex(cnt-1); + pResolveArray->removeIndex(cnt-1); +//-------------------------- + elem->resolve(); + } + /*size_t cnt = resolveArray.getCount(); + for ( size_t i =0; i < cnt; i++ ) { + resolveArray[i]->resolve(); + } + resolveArray.clear();*/ +} + +void +daeElement::clearResolveArray() +{ +//Contributed by Nus - Wed, 08 Nov 2006 + // resolveArray.clear(); + pResolveArray->clear(); +//------------------------ +} + +void +daeElement::resolve() +{ + if (_meta == NULL) + return; + + daeMetaAttributePtrArray& maa = _meta->getMetaResolvers(); + int n = (int)maa.getCount(); + int i; + for(i=0;iresolve(this); +} + +void +daeElement::setup(daeMetaElement* meta) +{ + if (_meta) + return; + _meta = meta; + if (meta->needsResolve()) + appendResolveElement((daeElement*)this); + daeMetaElement* intlibMeta = meta->getMetaIntegration(); + if (intlibMeta != NULL) + { + daeElementRef intObj = intlibMeta->create(); + intObj->ref(); //inc the ref count + _intObject = (daeIntegrationObject*)(daeElement*)intObj; + } + daeMetaAttributeRefArray& attrs = meta->getMetaAttributes(); + int macnt = (int)attrs.getCount(); + + _validAttributeArray.setCount( macnt ); + + int i; + for(i=0;igetDefault() != NULL) { + attrs[i]->set(this, attrs[i]->getDefault()); + _validAttributeArray[i] = true; + } +// else { +// _validAttributeArray[i] = false; +// } + } + +#if 0 + // Setup resolvers to know their containers and thus their file context + daeMetaAttributePtrArray& resolvers = meta->getMetaResolvers(); + int racnt = resolvers.getCount(); + for(i=0;igetWritableMemory(this)))->_container = + this; +#endif +} + +daeElement::daeElement(): + _refCount(0), + _intObject(0), + _parent(NULL), + _document(NULL), + _meta(NULL), + _elementName(NULL) +{} + +daeElement::~daeElement() +{ + if (_intObject) + _intObject->release(); + + if (_elementName) { + delete[] (void*) _elementName; + _elementName = NULL; + } +} + +//function used until we clarify what's a type and what's a name for an element +daeString daeElement::getTypeName() const +{ + return _meta->getName(); +} +daeString daeElement::getElementName() const +{ + return _elementName; +} +void daeElement::setElementName( daeString nm ) { + if ( nm == NULL ) { + if ( _elementName ) delete[] (void*)_elementName; + _elementName = NULL; + return; + } + if ( !_elementName ) _elementName = new daeChar[128]; + strcpy( (char*)_elementName, nm ); +} + +daeString daeElement::getID() const +{ + if ((_meta == NULL) || (!_meta->getIDAttribute())) + return NULL; + else + return *(daeStringRef*)_meta->getIDAttribute()->getWritableMemory(const_cast(this)); +} + +void daeElement::getChildren( daeElementRefArray &array ) { + _meta->getChildren( this, array ); +} + +daeSmartRef daeElement::clone(daeString idSuffix, daeString nameSuffix) { + //use the meta object system to create a new instance of this element + daeElementRef ret = _meta->create(); + ret->setElementName( getElementName() ); + //use meta system to copy attributes + daeMetaAttributeRefArray &attrs = _meta->getMetaAttributes(); + for ( unsigned int i = 0; i < attrs.getCount(); i++ ) { + //memcpy( attrs[i]->getWritableMemory( ret ), attrs[i]->getWritableMemory( this ), attrs[i]->getSize() ); + attrs[i]->copy( ret, this ); + ret->_validAttributeArray[i] = _validAttributeArray[i]; + } + if ( _meta->getValueAttribute() != NULL ) { + daeMetaAttribute *val = _meta->getValueAttribute(); + //memcpy( val->getWritableMemory( ret ), val->getWritableMemory( this ), val->getSize() ); + val->copy( ret, this ); + } + daeElementRefArray children; + _meta->getChildren( this, children ); + for ( size_t x = 0; x < children.getCount(); x++ ) { + ret->placeElement( children.get(x)->clone( idSuffix, nameSuffix ) ); + } + + //mangle the id + daeMetaAttribute *id = _meta->getIDAttribute(); + if ( idSuffix != NULL && id != NULL ) { + daeChar str[2048]; + id->getType()->memoryToString( id->getWritableMemory( ret ), str, 2048 ); + if ( strcmp( str, "" ) ) { + strcat( str, idSuffix ); + } + //id->getType()->stringToMemory( str, id->getWritableMemory( ret ) ); + id->set( ret, str ); + } + //mangle the name + daeMetaAttribute *nm = _meta->getMetaAttribute("name"); + if ( nameSuffix != NULL && nm != NULL ) { + daeChar str[2048]; + nm->getType()->memoryToString( nm->getWritableMemory( ret ), str, 2048 ); + if ( strcmp( str, "" ) ) { + strcat( str, nameSuffix ); + } + //nm->getType()->stringToMemory( str, nm->getWritableMemory( ret ) ); + nm->set( ret, str ); + } + //ret->_intObject = _intObject; + return ret; +} + +daeURI *daeElement::getDocumentURI() const { + if ( _document == NULL ) { + return NULL; + } + return _document->getDocumentURI(); +} diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/daeError.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/daeError.cpp new file mode 100644 index 00000000..124f8910 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/daeError.cpp @@ -0,0 +1,45 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include + +typedef struct +{ + int errCode; + const char *errString; +} DAEERROR; + +static DAEERROR errorsArray[] = +{ + { DAE_OK, "Success" }, + { DAE_ERR_INVALID_CALL, "Invalid function call" }, + { DAE_ERR_FATAL, "Fatal" }, + { DAE_ERR_BACKEND_IO, "Backend IO" }, + { DAE_ERR_BACKEND_VALIDATION, "Backend validation" }, + { DAE_ERR_QUERY_SYNTAX, "Query syntax" }, + { DAE_ERR_QUERY_NO_MATCH, "Query no match" }, + { DAE_ERR_COLLECTION_ALREADY_EXISTS, "A document with the same name exists already" }, + { DAE_ERR_COLLECTION_DOES_NOT_EXIST, "No document is loaded with that name or index" }, + { DAE_ERR_NOT_IMPLEMENTED, "This function is not implemented in this reference implementation" }, +}; + +const char *daeErrorString(int errorCode) +{ + int iErrorCount = (int)(sizeof(errorsArray)/sizeof(DAEERROR)); + for (int i=0;i +#include + +daeErrorHandler *daeErrorHandler::_instance = NULL; +daeBool daeErrorHandler::_default = false; + +daeErrorHandler::daeErrorHandler() { +} + +daeErrorHandler::~daeErrorHandler() { + if (_instance != NULL && _default ) { + delete _instance; + _instance = 0; + } +} + +void daeErrorHandler::setErrorHandler( daeErrorHandler *eh ) { + if ( _instance != NULL && _default ) { + delete _instance; + } + _instance = eh; +} + +daeErrorHandler *daeErrorHandler::get() { + if ( _instance == NULL ) { + _instance = new stdErrPlugin(); + _default = true; + } + return _instance; +} diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/daeIDRef.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/daeIDRef.cpp new file mode 100644 index 00000000..c965f7e7 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/daeIDRef.cpp @@ -0,0 +1,276 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include + +//Contributed by Nus - Wed, 08 Nov 2006 +daeIDRefResolverPtrArray* daeIDRefResolver::_KnownResolvers = NULL; +//---------------------------------- + +void +daeIDRef::initialize() +{ + id = NULL; + element = NULL; + container = NULL; +} + +daeIDRef::~daeIDRef() +{ + reset(); +} + +daeIDRef::daeIDRef() +{ + initialize(); + reset(); +} + +daeIDRef::daeIDRef(daeString IDRefString) +{ + initialize(); + setID(IDRefString); + validate(); +} + +daeIDRef::daeIDRef(daeIDRef& copyFrom) +{ + initialize(); + element = copyFrom.element; + setID(copyFrom.getID()); + state = copyFrom.state; + container = copyFrom.container; +} + +void +daeIDRef::copyFrom(daeIDRef& copyFrom) +{ + element = copyFrom.element; + setID(copyFrom.getID()); + state = copyFrom.state; + container = copyFrom.container; +} + +daeString emptyID = ""; + +void +daeIDRef::reset() +{ + if ((id != NULL) && (strcmp(id, emptyID) != 0)) + daeMemorySystem::free("idref",(void*)id); + + id = emptyID; +} + +daeString safeCreateID(daeString src) +{ + if (src == NULL) + return emptyID; + daeChar* ret = (daeChar*)daeMemorySystem::malloc("idref",strlen(src)+1); + if (ret == NULL) + return emptyID; + strcpy(ret,src); + + return ret; +} + +void +daeIDRef::setID(daeString _IDString) +{ + reset(); + + id = safeCreateID(_IDString); + + state = id_loaded; +} + +void +daeIDRef::print() +{ + fprintf(stderr,"id = %s\n",id); + fflush(stderr); +} + +daeString +daeIDRef::getID() const +{ + return id; +} + +void +daeIDRef::validate() +{ + state = id_pending; +} + +void +daeIDRef::resolveElement( daeString typeNameHint ) +{ + if (state == id_empty) + return; + + if (state == id_loaded) + validate(); + + daeIDRefResolver::attemptResolveElement(*((daeIDRef*)this), typeNameHint ); +} + +void +daeIDRef::resolveID() +{ + if (state == id_empty) { + if (element != NULL) + setID(element->getID()); + else + state = id_failed_invalid_reference; + } +} + +//Contributed by Nus - Wed, 08 Nov 2006 +void daeIDRefResolver::initializeIDRefSolver(void) +{ + if(!_KnownResolvers) { + _KnownResolvers = new daeIDRefResolverPtrArray(); + } +} + +void daeIDRefResolver::terminateIDRefSolver(void) +{ + if(_KnownResolvers) { + delete _KnownResolvers; + _KnownResolvers = NULL; + } +} +//------------------------------------- + +void +daeIDRefResolver::attemptResolveElement(daeIDRef& id, daeString typeNameHint) +{ + int i; +//Contributed by Nus - Wed, 08 Nov 2006 + // int cnt = (int)_KnownResolvers.getCount(); + int cnt = (int)_KnownResolvers->getCount(); +//------------------------------- + + for(i=0;iresolveElement(id, typeNameHint)) + if ((*_KnownResolvers)[i]->resolveElement(id, typeNameHint)) +//------------------------- + return; +} + +void +daeIDRefResolver::attemptResolveID(daeIDRef& id) +{ +//Contributed by Nus - Wed, 08 Nov 2006 + // int i,cnt = (int)_KnownResolvers.getCount(); + int i,cnt = (int)_KnownResolvers->getCount(); +//------------------------------- + +// daeBool foundProtocol = false; + for(i=0;iresolveID(id)) + if ((*_KnownResolvers)[i]->resolveID(id)) +//----------------------------- + return; + +#if defined(_DEBUG) && defined(WIN32) + char msg[128]; + sprintf(msg,"daeIDRefResolver::attemptResolveID(%s) - failed\n",id.getID()); + daeErrorHandler::get()->handleWarning( msg ); +#endif + +} + +daeIDRefResolver::daeIDRefResolver() +{ +//Contributed by Nus - Wed, 08 Nov 2006 + // _KnownResolvers.append((daeIDRefResolver*)this); + _KnownResolvers->append((daeIDRefResolver*)this); +//------------------------------ +} + +daeIDRefResolver::~daeIDRefResolver() +{ +//Contributed by Nus - Wed, 08 Nov 2006 + // _KnownResolvers.remove((daeIDRefResolver*)this); + _KnownResolvers->remove((daeIDRefResolver*)this); +//----------------------------------------- +} + + + +daeDefaultIDRefResolver::daeDefaultIDRefResolver(daeDatabase* database) +{ + _database = database; +} + +daeDefaultIDRefResolver::~daeDefaultIDRefResolver() +{ +} + +daeBool +daeDefaultIDRefResolver::resolveID(daeIDRef& id) +{ + (void)id; + return false; +} + +daeString +daeDefaultIDRefResolver::getName() +{ + return "DefaultIDRefResolver"; +} + +daeBool +daeDefaultIDRefResolver::resolveElement(daeIDRef& idref, daeString typeNameHint) +{ + if (idref.getState() == daeIDRef::id_loaded) + idref.validate(); + + daeElement* resolved = NULL; + int status; + + daeString id = idref.getID(); + + if ( idref.getContainer() == NULL ) + { + char msg[128]; + sprintf(msg,"daeDefaultIDRefResolver::resolveElement() - failed to resolve %s%s\n",idref.getID(), ". IDRef needs a container element!" ); + daeErrorHandler::get()->handleWarning( msg ); + return false; + } + + status = _database->getElement( &resolved, 0, id, typeNameHint, idref.getContainer()->getDocumentURI()->getURI() ); + + idref.setElement( resolved ); + + if (status||(resolved==NULL)) { + idref.setState( daeIDRef::id_failed_id_not_found ); + char msg[128]; + sprintf(msg,"daeDefaultIDRefResolver::resolveElement() - failed to resolve %s\n",idref.getID()); + daeErrorHandler::get()->handleWarning( msg ); + return false; + } + + idref.setState( daeIDRef::id_success ); + return true; +} + + + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/daeMemorySystem.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/daeMemorySystem.cpp new file mode 100644 index 00000000..ec902a3a --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/daeMemorySystem.cpp @@ -0,0 +1,34 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +//#include + +daeRawRef +daeMemorySystem::malloc(daeString pool, size_t n) +{ + (void)pool; + void *mem = ::malloc(n); +// memset(mem,0,n); +// printf("alloc[%s] - %d = 0x%x\n",pool,n,mem); + return (daeRawRef)mem; +} + +void +daeMemorySystem::free(daeString pool, daeRawRef mem) +{ + (void)pool; +// printf("free[%s] - 0x%x\n",pool,mem); + ::free(mem); +} + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/daeMetaAny.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/daeMetaAny.cpp new file mode 100644 index 00000000..af4c3e87 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/daeMetaAny.cpp @@ -0,0 +1,61 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include + +daeMetaAny::daeMetaAny( daeMetaElement *container, daeMetaCMPolicy *parent, daeUInt ordinal, + daeInt minO, daeInt maxO) : daeMetaCMPolicy( container, parent, ordinal, minO, maxO ) +{} + +daeMetaAny::~daeMetaAny() +{} + +daeElement *daeMetaAny::placeElement( daeElement *parent, daeElement *child, daeUInt &ordinal, daeInt offset, daeElement* before, daeElement *after ) { + //remove element from praent + (void)offset; + (void)before; + (void)after; + daeElement::removeFromParent( child ); + child->setParentElement( parent ); + //************************************************************************* + ordinal = 0; + return child; +} + +daeBool daeMetaAny::removeElement( daeElement *parent, daeElement *child ) { + (void)parent; + (void)child; + return true; +} + +daeMetaElement * daeMetaAny::findChild( daeString elementName ) { + if ( elementName != NULL ) { + const daeMetaElementRefArray &metas = daeMetaElement::getAllMetas(); + size_t cnt = metas.getCount(); + for ( size_t x = 0; x < cnt; x++ ) { + if ( !metas[x]->getIsInnerClass() && strcmp( elementName, metas[x]->getName() ) == 0 ) { + return metas[x]; + } + } + } + return domAny::registerElement(); +} + +void daeMetaAny::getChildren( daeElement *parent, daeElementRefArray &array ) { + (void)parent; + (void)array; + //this is taken care of by the _contents in metaElement +} + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/daeMetaAttribute.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/daeMetaAttribute.cpp new file mode 100644 index 00000000..0b48c4fb --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/daeMetaAttribute.cpp @@ -0,0 +1,174 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include + +void +daeMetaAttribute::set(daeElement* e, daeString s) +{ + if( _type->getTypeEnum() == daeAtomicType::FloatType || _type->getTypeEnum() == daeAtomicType::DoubleType ) { + if ( strcmp(s, "NaN") == 0 ) { + char msg[256]; + sprintf(msg, "NaN encountered while setting %s attribute in %s element.\n", (daeString)_name, (daeString)_container->getName() ); + daeErrorHandler::get()->handleWarning(msg); + } + else if ( strcmp(s, "INF") == 0 ) { + //quick workaround for http://sourceforge.net/tracker/index.php?func=detail&aid=1530106&group_id=157838&atid=805424 + s = "999999.9"; + //char msg[256]; + //sprintf(msg, "INF encountered while setting %s attribute in %s element.\n", (daeString)_name, (daeString)_container->getName() ); + //daeErrorHandler::get()->handleWarning( msg ); + } + else if ( strcmp(s, "-INF") == 0 ) { + s = "-999999.9"; + //quick workaround for http://sourceforge.net/tracker/index.php?func=detail&aid=1530106&group_id=157838&atid=805424 + //char msg[256]; + //sprintf(msg, "-INF encountered while setting %s attribute in %s element.\n", (daeString)_name, (daeString)_container->getName() ); + //daeErrorHandler::get()->handleWarning( msg ); + } + } + _type->stringToMemory((char*)s, getWritableMemory(e)); +} + +void daeMetaAttribute::copy(daeElement* to, daeElement *from) { + daeChar str[4096]; + _type->memoryToString( getWritableMemory(from), str, 4096 ); + _type->stringToMemory( str, getWritableMemory( to ) ); + //memcpy( getWritableMemory( to ), getWritableMemory( from ), getSize() ); +} + +void +daeMetaArrayAttribute::set(daeElement* e, daeString s) +{ + if( _type->getTypeEnum() == daeAtomicType::FloatType || _type->getTypeEnum() == daeAtomicType::DoubleType ) { + if ( strcmp(s, "NaN") == 0 ) { + char msg[256]; + sprintf(msg, "NaN encountered while setting %s attribute in %s element.\n", (daeString)_name, (daeString)_container->getName() ); + daeErrorHandler::get()->handleWarning(msg); + } + else if ( strcmp(s, "INF") == 0 ) { + s = "999999.9"; + //quick workaround for http://sourceforge.net/tracker/index.php?func=detail&aid=1530106&group_id=157838&atid=805424 + //char msg[256]; + //sprintf(msg, "INF encountered while setting %s attribute in %s element.\n", (daeString)_name, (daeString)_container->getName() ); + //daeErrorHandler::get()->handleWarning( msg ); + } + else if ( strcmp(s, "-INF") == 0 ) { + s = "-999999.9"; + //quick workaround for http://sourceforge.net/tracker/index.php?func=detail&aid=1530106&group_id=157838&atid=805424 + //char msg[256]; + //sprintf(msg, "-INF encountered while setting %s attribute in %s element.\n", (daeString)_name, (daeString)_container->getName() ); + //daeErrorHandler::get()->handleWarning( msg ); + } + } + daeArray* array = (daeArray*)getWritableMemory(e); + daeInt typeSize = _type->getSize(); + daeInt cnt = (daeInt)array->getCount(); + array->setRawCount(++cnt); + _type->stringToMemory((char*)s, array->getRawData()+(cnt-1)*typeSize); +} + +void daeMetaArrayAttribute::copy(daeElement* to, daeElement *from) { + daeArray* toArray = (daeArray*)getWritableMemory(to); + daeArray* fromArray = (daeArray*)getWritableMemory(from); + daeInt typeSize = _type->getSize(); + daeInt cnt = (daeInt)fromArray->getCount(); + toArray->setRawCount( cnt ); + //memcpy( toArray->getRawData(), fromArray->getRawData(), cnt * typeSize ); + daeChar *toData = toArray->getRawData(); + daeChar *fromData = fromArray->getRawData(); + daeChar str[4096]; + for ( int i = 0; i < cnt; i++ ) { + _type->memoryToString( fromData+i*typeSize, str, 2048 ); + _type->stringToMemory( str, toData+i*typeSize ); + } +} + +daeMetaAttribute::daeMetaAttribute() +{ + _name = "noname"; + _offset = -1; + _type = NULL; + _container = NULL; + _default = NULL; + _isRequired = false; +} + +void +daeMetaAttribute::resolve(daeElementRef element) +{ + if (_type != NULL) + _type->resolve(element, getWritableMemory(element) ); +} + +void +daeMetaArrayAttribute::resolve(daeElementRef element) +{ + daeArray* era = (daeArray*)getWritableMemory(element); + size_t cnt = era->getCount(); + for ( size_t i = 0; i < cnt; i++ ) + { + _type->resolve( element, era->getRawData()+(i*era->getElementSize()) ); + } +} + +daeInt +daeMetaAttribute::getSize() +{ + return _type->getSize(); +} +daeInt +daeMetaAttribute::getAlignment() +{ + return _type->getAlignment(); +} + +daeInt +daeMetaAttribute::getCount(daeElement* e) +{ + if (e == NULL) + return 0; + return (getWritableMemory(e) != NULL); +} + +daeMemoryRef +daeMetaAttribute::get(daeElement *e, daeInt index) +{ + (void)index; + return getWritableMemory(e); +} + +daeInt +daeMetaArrayAttribute::getCount(daeElement *e) +{ + if (e == NULL) + return 0; + daeArray* era = (daeArray*)getWritableMemory(e); + if (era == NULL) + return 0; + return (daeInt)era->getCount(); +} + +daeMemoryRef +daeMetaArrayAttribute::get(daeElement* e, daeInt index) +{ + if (e == NULL) + return NULL; + daeArray* era = (daeArray*)getWritableMemory(e); + if (era == NULL || index >= (daeInt)era->getCount() ) + return NULL; + return era->getRawData()+(index*era->getElementSize()); +} + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/daeMetaCMPolicy.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/daeMetaCMPolicy.cpp new file mode 100644 index 00000000..04e4e52e --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/daeMetaCMPolicy.cpp @@ -0,0 +1,22 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include + +daeMetaCMPolicy::~daeMetaCMPolicy() +{ + for( size_t i = 0; i < _children.getCount(); i++ ) { + delete _children[i]; + } +} + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/daeMetaChoice.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/daeMetaChoice.cpp new file mode 100644 index 00000000..878e0f16 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/daeMetaChoice.cpp @@ -0,0 +1,99 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include + +daeMetaChoice::daeMetaChoice( daeMetaElement *container, daeMetaCMPolicy *parent, daeUInt ordinal, + daeInt minO, daeInt maxO) : daeMetaCMPolicy( container, parent, ordinal, minO, maxO ) +{} + +daeMetaChoice::~daeMetaChoice() +{} + +daeElement *daeMetaChoice::placeElement( daeElement *parent, daeElement *child, daeUInt &ordinal, daeInt offset, daeElement* before, daeElement *after ) { + (void)offset; + if ( _maxOccurs == -1 ) { + //Needed to prevent infinate loops. If unbounded check to see if you have the child before just trying to place + daeString nm = child->getElementName(); + if ( nm == NULL ) { + nm = child->getTypeName(); + } + if ( findChild( nm ) == NULL ) { + return NULL; + } + } + + daeElement *retVal = NULL; + size_t cnt = _children.getCount(); + + for ( daeInt i = 0; ( i < _maxOccurs || _maxOccurs == -1 ); i++ ) { + for ( size_t x = 0; x < cnt; x++ ) { + if ( _children[x]->placeElement( parent, child, ordinal, i, before, after ) != NULL ) { + retVal = child; + ordinal = ordinal + _ordinalOffset; + break; + } + } + if ( retVal != NULL ) break; + } + /*if ( retVal && _maxOccurs != -1 ) { + //check if the place was valid - only if we aren't unbounded. unbounded is always valid + daeInt cnt = 0; + daeElementRefArray array; + size_t arrayCnt = 0; //saves us from having to clear the array every child + for ( size_t x = 0; x < _children.getCount(); x++ ) { + _children[x]->getChildren( parent, array ); + if ( array.getCount() != arrayCnt ) { + //this part of the content model has children. + cnt++; + if ( cnt > _maxOccurs ) { + //picked too many choices - remove element and return false + removeElement( parent, child ); + return false; + } + arrayCnt = array.getCount(); + } + } + + }*/ + return retVal; +} + +daeBool daeMetaChoice::removeElement( daeElement *parent, daeElement *child ) { + size_t cnt = _children.getCount(); + for ( size_t x = 0; x < cnt; x++ ) { + if ( _children[x]->removeElement( parent, child ) ) { + return true; + } + } + return false; +} + +daeMetaElement * daeMetaChoice::findChild( daeString elementName ) { + daeMetaElement *me = NULL; + size_t cnt = _children.getCount(); + for ( size_t x = 0; x < cnt; x++ ) { + me = _children[x]->findChild( elementName ); + if ( me != NULL ) { + return me; + } + } + return NULL; +} + +void daeMetaChoice::getChildren( daeElement *parent, daeElementRefArray &array ) { + (void)parent; + (void)array; + //this is taken care of by the _contents in metaElement +} + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/daeMetaElement.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/daeMetaElement.cpp new file mode 100644 index 00000000..d88d6299 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/daeMetaElement.cpp @@ -0,0 +1,522 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include + +static daeMetaElementRefArray *mera = NULL; +static daeTArray< daeMetaElement** > *mes = NULL; + +daeElementRef +daeMetaElement::create() +{ +#if defined(_DEBUG) && defined(WIN32) + if (_createFunc == NULL) + return NULL; +#endif + daeElementRef ret = (*_createFunc)(_elementSize); + ret->setup(this); + + return ret; +} + +daeElementRef +daeMetaElement::create(daeString s) +{ + daeMetaElement* me = NULL; + if ( strcmp( s, _name ) == 0 ) { + //looking for this meta + me = this; + } + else { + me = _contentModel->findChild(s); + } + if (me != NULL) { + daeElementRef ret = me->create(); + if ( strcmp(s, me->getName() ) != 0 ) { + ret->setElementName(s); + } + return ret; + } + if ( getAllowsAny() ) { + daeElementRef ret = domAny::registerElement()->create(); + ret->setElementName(s); + return ret; + } + return NULL; +} + +/* +daeMetaElement* +daeMetaElement::findChild(daeString s) +{ + if (s != NULL) { + if ( strcmp( _name, s) == 0 ) { + return this; + } + int n = (int)_metaElements.getCount(); + int i; + for(i=0;i_elementType; + + if ((me == NULL) || ((daeString)(me->_name) == NULL)) + continue; + + if (strcmp(me->_name,s)==0) + return me; + + if (strcmp(_metaElements[i]->getName(),s)==0) + return me; + } + //!!!ACL Added for testing complex types and groups + for( i =0; i < (int)_otherChildren.getCount(); i++ ) { + if ( strcmp( _otherChildren[i], s) == 0 ) { + daeMetaElementAttribute *mea = _otherChildrenContainer[i]; + daeMetaElement *me = mea->getElementType(); + return me->findChild(s); + } + } + } + return NULL; +}*/ + +daeMetaElement::daeMetaElement() +{ + _name = "noname"; + _createFunc = NULL; + _needsResolve = false; + _elementSize = sizeof(daeElement); + _metaValue = NULL; + _metaContents = NULL; + _metaContentsOrder = NULL; // sthomas + _metaIntegration = NULL; + _metaID = NULL; + _isTrackableForQueries = true; + _usesStringContents = false; + _isTransparent = false; + _isAbstract = false; + _allowsAny = false; + _innerClass = false; + _metas().append(this); + + _contentModel = NULL; +} + +daeMetaElement::~daeMetaElement() +{ + if (_metaContents) + delete _metaContents; + if (_contentModel) // sthomas + delete _contentModel; + if (_metaContentsOrder) // sthomas + delete _metaContentsOrder; +} + +void daeMetaElement::setCMRoot( daeMetaCMPolicy *cm ) +{ + if (_contentModel) + delete _contentModel; + _contentModel = cm; +} + +void +daeMetaElement::addContents(daeInt offset) +{ + daeMetaElementArrayAttribute* meaa = new daeMetaElementArrayAttribute( this, NULL, 0, 1, -1 ); + meaa->setType(daeAtomicType::get("element")); + meaa->setName("contents"); + meaa->setOffset(offset); + meaa->setContainer( this); + meaa->setElementType( daeElement::getMeta() ); + _metaContents = meaa; +} +void +daeMetaElement::addContentsOrder(daeInt offset) +{ + daeMetaArrayAttribute* meaa = new daeMetaArrayAttribute(); + meaa->setType(daeAtomicType::get("uint")); + meaa->setName("contentsOrder"); + meaa->setOffset(offset); + meaa->setContainer( this); + + if (_metaContentsOrder) + delete _metaContentsOrder; + + _metaContentsOrder = meaa; +} + + +/*void +daeMetaElement::appendArrayElement(daeMetaElement* element, daeInt offset, daeString name) +{ + daeMetaElementArrayAttribute* meaa = new daeMetaElementArrayAttribute; + meaa->setType(daeAtomicType::get("element")); + if ( name ) { + meaa->setName(name); + } + else { + meaa->setName(element->getName()); + } + meaa->setOffset(offset); + meaa->setContainer(this); + meaa->setElementType( element); + _metaElements.append(meaa); +} +void +daeMetaElement::appendElement(daeMetaElement* element, daeInt offset, daeString name) +{ + daeMetaElementAttribute* meaa = new daeMetaElementAttribute; + meaa->setType(daeAtomicType::get("element")); + if ( name ) { + meaa->setName(name); + } + else { + meaa->setName(element->getName()); + } + meaa->setOffset( offset); + meaa->setContainer( this ); + meaa->setElementType( element ); + _metaElements.append(meaa); +}*/ + +void +daeMetaElement::appendAttribute(daeMetaAttribute* attr) +{ + if (attr == NULL) + return; + + if (strcmp(attr->getName(),"_value") == 0) { + _usesStringContents = attr->getType()->getUsesStrings(); + + _metaValue = attr; + } + else + _metaAttributes.append(attr); + + if ((attr->getType() != NULL) && + ((strcmp(attr->getType()->getTypeString(),"resolver")==0)|| + (strcmp(attr->getType()->getTypeString(),"idref_resolver")==0))) { + _resolvers.append(attr); + _needsResolve = true; + } + + if ((attr->getName() != NULL) && + (strcmp(attr->getName(),"id") == 0)) { + _metaID = attr; + _isTrackableForQueries = true; + } +} + +void +daeMetaElement::validate() +{ + if (_createFunc == NULL) + _createFunc = (daeElementConstructFunctionPtr) DAECreateElement; + if (_elementSize == 0) + { + daeInt place=0; + unsigned int i; + for(i=0;i<_metaAttributes.getCount();i++) { + place += _metaAttributes[i]->getSize(); + int align = _metaAttributes[i]->getAlignment(); + place += align; + place &= (~(align-1)); + } + _elementSize = place; + } +} + +daeMetaAttribute* +daeMetaElement::getMetaAttribute(daeString s) +{ + int cnt = (int)_metaAttributes.getCount(); + int i; + for(i=0;igetName(),s) == 0) + return _metaAttributes[i]; + return NULL; +} + + +void daeMetaElement::releaseMetas() +{ + _metas().clear(); + size_t count = _classMetaPointers().getCount(); + for ( size_t i = 0; i < count; i++ ) + { + *(_classMetaPointers()[i]) = NULL; + } + _classMetaPointers().clear(); + if (mera) + { + delete mera; + mera = NULL; + } + if (mes) + { + delete mes; + mes = NULL; + } +} + +daeBool daeMetaElement::place(daeElement *parent, daeElement *child, daeUInt *ordinal ) +{ + if (child->getMeta()->getIsAbstract() || parent->getMeta() != this ) { + return false; + } + daeUInt ord; + daeElement *retVal = _contentModel->placeElement( parent, child, ord ); + if ( retVal != NULL ) { + //update document pointer + child->setDocument( parent->getDocument() ); + if ( parent->getDocument() ) { + parent->getDocument()->insertElement( retVal ); + parent->getDocument()->setModified(true); + } + //add to _contents array + if (_metaContents != NULL) { + daeElementRefArray* contents = + (daeElementRefArray*)_metaContents->getWritableMemory(parent); + daeUIntArray* contentsOrder = + (daeUIntArray*)_metaContentsOrder->getWritableMemory(parent); + daeBool needsAppend = true; + size_t cnt = contentsOrder->getCount(); + for ( size_t x = 0; x < cnt; x++ ) { + if ( contentsOrder->get(x) > ord ) { + contents->insertAt( x, retVal ); + contentsOrder->insertAt( x, ord ); + needsAppend = false; + break; + } + } + if ( needsAppend ) { + contents->append(retVal); + contentsOrder->append( ord ); + } + } + if ( ordinal != NULL ) { + *ordinal = ord; + } + } + return retVal!=NULL; +} + +daeBool daeMetaElement::placeAt( daeInt index, daeElement *parent, daeElement *child ) +{ + if (child->getMeta()->getIsAbstract() || parent->getMeta() != this || index < 0 ) { + return false; + } + daeUInt ord; + daeElement *retVal = _contentModel->placeElement( parent, child, ord ); + if ( retVal != NULL ) { + //add to _contents array + if (_metaContents != NULL) { + daeElementRefArray* contents = + (daeElementRefArray*)_metaContents->getWritableMemory(parent); + daeUIntArray* contentsOrder = + (daeUIntArray*)_metaContentsOrder->getWritableMemory(parent); + daeBool validLoc; + if ( index > 0 ) { + validLoc = contentsOrder->get(index) >= ord && contentsOrder->get(index) <= ord; + } + else { + if ( contentsOrder->getCount() == 0 ) { + validLoc = true; + } + else { + validLoc = contentsOrder->get(index) >= ord; + } + } + if ( validLoc ) { + contents->insertAt( index, retVal ); + contentsOrder->insertAt( index, ord ); + } + else { + _contentModel->removeElement( parent, retVal ); + retVal = NULL; + } + } + } + if ( retVal != NULL ) { + //update document pointer + child->setDocument( parent->getDocument() ); + if ( parent->getDocument() ) { + parent->getDocument()->insertElement( retVal ); + parent->getDocument()->setModified(true); + } + } + return retVal!=NULL; +} + +daeBool daeMetaElement::placeBefore( daeElement *marker, daeElement *parent, daeElement *child, daeUInt *ordinal ) +{ + if (child->getMeta()->getIsAbstract() || parent->getMeta() != this ) { + return false; + } + daeUInt ord; + daeElement *retVal = _contentModel->placeElement( parent, child, ord, 0, marker, NULL ); + if ( retVal != NULL ) { + //add to _contents array + if (_metaContents != NULL) { + daeElementRefArray* contents = + (daeElementRefArray*)_metaContents->getWritableMemory(parent); + daeUIntArray* contentsOrder = + (daeUIntArray*)_metaContentsOrder->getWritableMemory(parent); + size_t index(0); + daeBool validLoc = false; + if ( contents->find( marker, index ) == DAE_OK ) { + if ( index > 0 ) { + daeUInt gt = contentsOrder->get(index-1); + daeUInt lt = contentsOrder->get(index); + validLoc = gt <= ord && lt >= ord; + } + else { + validLoc = contentsOrder->get(index) >= ord; + } + } + if ( validLoc ) { + contents->insertAt( index, retVal ); + contentsOrder->insertAt( index, ord ); + if ( ordinal != NULL ) { + *ordinal = ord; + } + } + else { + _contentModel->removeElement( parent, retVal ); + retVal = NULL; + } + } + } + if ( retVal != NULL ) { + //update document pointer + child->setDocument( parent->getDocument() ); + if ( parent->getDocument() ) { + parent->getDocument()->insertElement( retVal ); + parent->getDocument()->setModified(true); + } + } + return retVal!=NULL; +} + +daeBool daeMetaElement::placeAfter( daeElement *marker, daeElement *parent, daeElement *child, daeUInt *ordinal ) +{ + if (child->getMeta()->getIsAbstract() || parent->getMeta() != this ) { + return false; + } + daeUInt ord; + daeElement *retVal = _contentModel->placeElement( parent, child, ord, 0, marker, NULL ); + if ( retVal != NULL ) { + //add to _contents array + if (_metaContents != NULL) { + daeElementRefArray* contents = + (daeElementRefArray*)_metaContents->getWritableMemory(parent); + daeUIntArray* contentsOrder = + (daeUIntArray*)_metaContentsOrder->getWritableMemory(parent); + size_t index(0); + daeBool validLoc = false; + if ( contents->find( marker, index ) == DAE_OK ) { + if ( index < contentsOrder->getCount()-1 ) { + validLoc = contentsOrder->get(index) <= ord && contentsOrder->get(index+1) >= ord; + } + else { + validLoc = contentsOrder->get(index) <= ord; + } + } + if ( validLoc ) { + contents->insertAt( index+1, retVal ); + contentsOrder->insertAt( index+1, ord ); + if ( ordinal != NULL ) { + *ordinal = ord; + } + } + else { + _contentModel->removeElement( parent, retVal ); + retVal = NULL; + } + } + } + if ( retVal != NULL ) { + //update document pointer + child->setDocument( parent->getDocument() ); + if ( parent->getDocument() ) { + parent->getDocument()->insertElement( retVal ); + parent->getDocument()->setModified(true); + } + } + return retVal!=NULL; +} + +daeBool daeMetaElement::remove(daeElement *parent, daeElement *child) +{ + if ( parent->getMeta() != this ) { + return false; + } + //prevent child from being deleted + daeElementRef el( child ); + if ( _contentModel->removeElement( parent, child ) ) { + if ( _metaContents != NULL) + { + daeElementRefArray* contents = (daeElementRefArray*)_metaContents->getWritableMemory(parent); + daeUIntArray* contentsOrder = (daeUIntArray*)_metaContentsOrder->getWritableMemory(parent); + size_t idx(0); + if ( contents->remove(child, &idx) == DAE_OK ) { + contentsOrder->removeIndex( idx ); + } + } + if ( child->getDocument() ) { + child->getDocument()->removeElement( child ); + child->getDocument()->setModified(true); + } + return true; + } + return false; +} + +void daeMetaElement::getChildren( daeElement* parent, daeElementRefArray &array ) +{ + if ( parent->getMeta() != this ) { + return; + } + if ( _metaContents != NULL ) { + daeElementRefArray* contents = (daeElementRefArray*)_metaContents->getWritableMemory(parent); + for ( size_t x = 0; x < contents->getCount(); x++ ) { + array.append( contents->get(x) ); + } + } + else if ( _contentModel != NULL ) { + _contentModel->getChildren( parent, array ); + } +} + +daeMetaElementRefArray &daeMetaElement::_metas() +{ + if (!mera) + { + mera = new daeMetaElementRefArray(); + } + return *mera; +} + +daeTArray< daeMetaElement** > &daeMetaElement::_classMetaPointers() +{ + if (!mes) + { + mes = new daeTArray< daeMetaElement** >(); + } + return *mes; +} + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/daeMetaElementAttribute.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/daeMetaElementAttribute.cpp new file mode 100644 index 00000000..a9039f84 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/daeMetaElementAttribute.cpp @@ -0,0 +1,227 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include + +daeMetaElementAttribute::daeMetaElementAttribute( daeMetaElement *container, daeMetaCMPolicy *parent, daeUInt ordinal, + daeInt minO, daeInt maxO) : daeMetaCMPolicy( container, parent, ordinal, minO, maxO ) +{ + _elementType = NULL; +} + +daeMetaElementAttribute::~daeMetaElementAttribute() +{} + +daeMetaElementArrayAttribute::daeMetaElementArrayAttribute( daeMetaElement *container, daeMetaCMPolicy *parent, daeUInt ordinal, + daeInt minO, daeInt maxO) : daeMetaElementAttribute( container, parent, ordinal, minO, maxO ) +{ +} + +daeMetaElementArrayAttribute::~daeMetaElementArrayAttribute() +{} + + +void daeMetaElementAttribute::set(daeElement* e, daeString s) +{ + //_type->stringToMemory((char*)s, getWritableMemory(e)); + daeElementRef *ref = (daeElementRef*)(getWritableMemory(e)); + if ((*ref) == NULL) { + (*ref) = _elementType->create(); + } + (*ref)->getMeta()->getValueAttribute()->set((*ref), s); +} + +void daeMetaElementAttribute::copy(daeElement* to, daeElement *from) { + daeElement *cpy = (*(daeElementRef*)(getWritableMemory(from)))->clone(); + (*(daeElementRef*)(getWritableMemory(to))) = cpy; +} + +void daeMetaElementArrayAttribute::copy(daeElement* to, daeElement *from) { + (void)to; + (void)from; +} + +void +daeMetaElementAttribute::setDocument( daeElement * parent, daeDocument* c ) +{ + daeElementRef* er = (daeElementRef*)getWritableMemory( parent ); + if ( ((daeElement*)(*er)) != NULL ) { + (*er)->setDocument( c ); + } +} + +void +daeMetaElementArrayAttribute::setDocument( daeElement * parent, daeDocument* c ) +{ + daeElementRefArray* era = (daeElementRefArray*)getWritableMemory( parent ); + for ( unsigned int i = 0; i < era->getCount(); i++ ) { + era->get(i)->setDocument( c ); + } +} + +daeInt +daeMetaElementAttribute::getCount(daeElement* e) +{ + if (e == NULL) + return 0; + return ((*((daeElementRef*)getWritableMemory(e))) != NULL); +} + +daeMemoryRef +daeMetaElementAttribute::get(daeElement *e, daeInt index) +{ + (void)index; + return getWritableMemory(e); +} + +daeInt +daeMetaElementArrayAttribute::getCount(daeElement *e) +{ + if (e == NULL) + return 0; + daeElementRefArray* era = (daeElementRefArray*)getWritableMemory(e); + if (era == NULL) + return 0; + return (daeInt)era->getCount(); +} + +daeMemoryRef +daeMetaElementArrayAttribute::get(daeElement* e, daeInt index) +{ + if (e == NULL) + return NULL; + daeElementRefArray* era = (daeElementRefArray*)getWritableMemory(e); + if (era == NULL || index >= (daeInt)era->getCount() ) + return NULL; + return (daeMemoryRef)&(era->get(index)); +} + +daeElement * +daeMetaElementAttribute::placeElement(daeElement* parent, daeElement* child, daeUInt &ordinal, daeInt offset, daeElement* before, daeElement *after ) +{ + (void)offset; + (void)before; + (void)after; + if ((parent == NULL)||(child == NULL)) + return NULL; + if ( child->getMeta() != _elementType || ( child->getElementName() != NULL && strcmp( child->getElementName(), _name ) != 0 ) ) { + return NULL; + } + if (child->getParentElement() == parent) { + //I Don't know why this gets called when the child already has this as parent. + return child; + } + daeElementRef* er = (daeElementRef*)getWritableMemory(parent); + + daeElement::removeFromParent( child ); + child->setParentElement( parent ); + + *er = child; + ordinal = _ordinalOffset; + + return child; +} + +daeElement * +daeMetaElementArrayAttribute::placeElement(daeElement* parent, daeElement* child, daeUInt &ordinal, daeInt offset, daeElement* before, daeElement *after ) +{ + if ((parent == NULL)||(child == NULL)) + return NULL; + if ( child->getMeta() != _elementType || ( child->getElementName() != NULL && strcmp( child->getElementName(), _name ) != 0 ) ) { + return NULL; + } + daeElement *p = child->getParentElement(); + daeElementRefArray* era = (daeElementRefArray*)getWritableMemory(parent); + if ( _maxOccurs != -1 && (daeInt)era->getCount()-offset >= _maxOccurs ) { + return NULL; + } + removeElement( p, child ); + child->setParentElement( parent ); + + if ( before != NULL && before->getMeta() == _elementType ) { + size_t idx(0); + if ( era->find( before, idx ) == DAE_OK ) { + era->insertAt( idx, child ); + } + } + else if ( after != NULL && after->getMeta() == _elementType ) { + size_t idx(0); + if ( era->find( after, idx ) == DAE_OK ) { + era->insertAt( idx+1, child ); + } + } + else { + era->append(child); + } + ordinal = _ordinalOffset; + + return child; +} + +// These are the opposite of the placeElement functions above +daeBool +daeMetaElementAttribute::removeElement(daeElement* parent, daeElement* child) +{ + (void)child; // silence unused variable warning + + if ((parent == NULL)||(child == NULL )) + return false; + + daeElementRef* er = (daeElementRef*)getWritableMemory(parent); + if ( *er != child ) { + return false; + } + *er = NULL; + return true; +} + +daeBool +daeMetaElementArrayAttribute::removeElement(daeElement* parent, + daeElement* child) +{ + if ((parent == NULL)||(child == NULL)) + return false ; + + daeElementRefArray* era = (daeElementRefArray*)getWritableMemory(parent); +/* if ( (daeInt)era->getCount() <= _minOccurs ) { + return false; + }*/ + daeInt error = era->remove(child); + if ( error != DAE_OK ) { + return false; + } + return true; +} + +daeMetaElement *daeMetaElementAttribute::findChild( daeString elementName ) { + if ( strcmp( elementName, _name ) == 0 ) { + return _elementType; + } + return NULL; +} + +void daeMetaElementAttribute::getChildren( daeElement *parent, daeElementRefArray &array ) { + daeElementRef* er = (daeElementRef*)getWritableMemory(parent); + if ( *er != NULL ) { + array.append( *er ); + } +} + +void daeMetaElementArrayAttribute::getChildren( daeElement *parent, daeElementRefArray &array ) { + daeElementRefArray* era = (daeElementRefArray*)getWritableMemory(parent); + size_t cnt = era->getCount(); + for ( size_t x = 0; x < cnt; x++ ) { + array.append( era->get(x) ); + } +} diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/daeMetaGroup.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/daeMetaGroup.cpp new file mode 100644 index 00000000..4b38badc --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/daeMetaGroup.cpp @@ -0,0 +1,139 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include + +daeMetaGroup::daeMetaGroup( daeMetaElementAttribute *econ, daeMetaElement *container, + daeMetaCMPolicy *parent, daeUInt ordinal, daeInt minO, daeInt maxO) : + daeMetaCMPolicy( container, parent, ordinal, minO, maxO ), _elementContainer( econ ) +{} + +daeMetaGroup::~daeMetaGroup() +{ + if ( _elementContainer != NULL ) { + delete _elementContainer; + } +} + +daeElement *daeMetaGroup::placeElement( daeElement *parent, daeElement *child, daeUInt &ordinal, daeInt offset, daeElement* before, daeElement *after ) { + (void)offset; + daeString nm = child->getElementName(); + if ( nm == NULL ) { + nm = child->getTypeName(); + } + if ( findChild( nm ) == NULL ) { + return false; + } + daeElementRef el; +#if 0 + daeInt elCnt = _elementContainer->getCount(parent); + //check existing groups + //This doesn't work properly. Because the choice can't check if you make two decisions you cannot fail + //here when you are supposed to. Luckily the current schema just has groups with single choices so + //every element needs a new group container. Wasteful but thats how the schema is and its how it works. + for ( daeInt x = 0; x < elCnt; x++ ) { + daeMemoryRef mem = _elementContainer->get(parent, x ); + if ( mem != NULL ) { + el = *(daeElementRef*)mem; + } + if ( el == NULL ) { + continue; + } + if ( before != NULL ) { + if ( _elementContainer->_elementType->placeBefore( before, el, child, &ordinal ) ) { + ordinal = ordinal + _ordinalOffset; + return true; + } + } + else if ( after != NULL ) { + if ( _elementContainer->_elementType->placeAfter( after, el, child, &ordinal ) ) { + ordinal = ordinal + _ordinalOffset; + return true; + } + } + else { + if ( _elementContainer->_elementType->place( el, child, &ordinal ) ) { + ordinal = ordinal + _ordinalOffset; + return true; + } + } + } +#endif + //check if the element trying to be placed is a group element. If so Just add it don't create a new one. + if ( strcmp( nm, _elementContainer->getName() ) == 0 ) { + if ( _elementContainer->placeElement(parent, child, ordinal, offset ) != NULL ) { + return child; + } + } + //if you couldn't place in existing groups make a new one if you can + el = _elementContainer->placeElement(parent, _elementContainer->_elementType->create(), ordinal, offset ); + if ( el != NULL ) { + //el = *(daeElementRef*)_elementContainer->get(parent, elCnt ); + if ( before != NULL ) { + if ( _elementContainer->_elementType->placeBefore( before, el, child, &ordinal ) ) { + ordinal = ordinal + _ordinalOffset; + return el; + } + } + else if ( after != NULL ) { + if ( _elementContainer->_elementType->placeAfter( after, el, child, &ordinal ) ) { + ordinal = ordinal + _ordinalOffset; + return el; + } + } + else { + if ( _elementContainer->_elementType->place( el, child, &ordinal ) ) { + ordinal = ordinal + _ordinalOffset; + return el; + } + } + } + return NULL; +} + +daeBool daeMetaGroup::removeElement( daeElement *parent, daeElement *child ) { + daeElementRef el; + daeInt elCnt = _elementContainer->getCount(parent); + for ( daeInt x = 0; x < elCnt; x++ ) { + daeMemoryRef mem = _elementContainer->get(parent, x ); + if ( mem != NULL ) { + el = *(daeElementRef*)mem; + } + if ( el == NULL ) { + continue; + } + if ( el->removeChildElement( child ) ) { + _elementContainer->removeChildElement( el ); + return true; + } + } + return false; +} + +daeMetaElement * daeMetaGroup::findChild( daeString elementName ) { + if ( strcmp( _elementContainer->getName(), elementName ) == 0 ) { + return _elementContainer->getElementType(); + } + return _elementContainer->_elementType->getCMRoot()->findChild( elementName ); +} + +void daeMetaGroup::getChildren( daeElement *parent, daeElementRefArray &array ) { + size_t cnt = _elementContainer->getCount( parent ); + for ( size_t x = 0; x < cnt; x++ ) { + (*((daeElementRef*)_elementContainer->get(parent, (daeInt)x )))->getChildren(array); + } + //_elementContainer->_elementType->getChildren( parent, array ); +} + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/daeMetaSequence.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/daeMetaSequence.cpp new file mode 100644 index 00000000..38dbaa10 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/daeMetaSequence.cpp @@ -0,0 +1,76 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include + +daeMetaSequence::daeMetaSequence( daeMetaElement *container, daeMetaCMPolicy *parent, daeUInt ordinal, + daeInt minO, daeInt maxO) : + daeMetaCMPolicy( container, parent, ordinal, minO, maxO ) +{} + +daeMetaSequence::~daeMetaSequence() +{} + +daeElement *daeMetaSequence::placeElement( daeElement *parent, daeElement *child, daeUInt &ordinal, daeInt offset, daeElement* before, daeElement *after ) { + (void)offset; + if ( _maxOccurs == -1 ) { + //Needed to prevent infinate loops. If unbounded check to see if you have the child before just trying to place + daeString nm = child->getElementName(); + if ( nm == NULL ) { + nm = child->getTypeName(); + } + if ( findChild( nm ) == NULL ) { + return NULL; + } + } + + size_t cnt = _children.getCount(); + for ( daeInt i = 0; ( i < _maxOccurs || _maxOccurs == -1 ); i++ ) { + for ( size_t x = 0; x < cnt; x++ ) { + if ( _children[x]->placeElement( parent, child, ordinal, i, before, after ) != NULL ) { + ordinal = ordinal + (i * ( _maxOrdinal + 1 )) + _ordinalOffset; + return child; + } + } + } + return NULL; +} + +daeBool daeMetaSequence::removeElement( daeElement *parent, daeElement *child ) { + size_t cnt = _children.getCount(); + for ( size_t x = 0; x < cnt; x++ ) { + if ( _children[x]->removeElement( parent, child ) ) { + return true; + } + } + return false; +} + +daeMetaElement * daeMetaSequence::findChild( daeString elementName ) { + daeMetaElement *me = NULL; + size_t cnt = _children.getCount(); + for ( size_t x = 0; x < cnt; x++ ) { + me = _children[x]->findChild( elementName ); + if ( me != NULL ) { + return me; + } + } + return NULL; +} + +void daeMetaSequence::getChildren( daeElement *parent, daeElementRefArray &array ) { + size_t cnt = _children.getCount(); + for ( size_t x = 0; x < cnt; x++ ) { + _children[x]->getChildren( parent, array ); + } +} diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/daeSIDResolver.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/daeSIDResolver.cpp new file mode 100644 index 00000000..65c753d1 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/daeSIDResolver.cpp @@ -0,0 +1,371 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include + +daeSIDResolver::daeSIDResolver( daeElement *container, daeString target, daeString profile ) +{ + element = NULL; + doubleArray = NULL; + doublePtr = NULL; + + this->container = container; + if ( target != NULL ) { + this->target = new char[ strlen( target ) +1 ]; + strcpy( (char*)this->target, target ); + state = target_loaded; + } + else { + this->target = NULL; + state = target_empty; + } + if ( profile != NULL ) { + this->profile = new char[ strlen( profile ) +1 ]; + strcpy( (char*)this->profile, profile ); + } + else { + this->profile = NULL; + } +} + +daeSIDResolver::~daeSIDResolver() +{ + if ( target != NULL ) { + delete[] (void*)target; + target = NULL; + } + if ( profile != NULL ) { + delete[] (void*)profile; + profile = NULL; + } +} + +void daeSIDResolver::setTarget( daeString t ) +{ + if ( target != NULL ) { + delete[] (void*)target; + } + if ( t != NULL ) { + target = new char[ strlen( t ) +1 ]; + strcpy( (char*)target, t ); + state = target_loaded; + } + else { + target = NULL; + state = target_empty; + } + element = NULL; + doubleArray = NULL; + doublePtr = NULL; +} + + +void daeSIDResolver::setProfile( daeString p ) +{ + if ( profile != NULL ) { + delete[] (void*)target; + } + if ( p != NULL ) { + profile = new char[ strlen( p ) +1 ]; + strcpy( (char*)profile, p ); + } + else { + profile = NULL; + } + element = NULL; + doubleArray = NULL; + doublePtr = NULL; +} + +void daeSIDResolver::setContainer(daeElement* element) +{ + if ( element != container ) { + container = element; + element = NULL; + doubleArray = NULL; + doublePtr = NULL; + if ( target != NULL ) { + state = target_loaded; + } + else { + state = state = target_empty; + } + } +} + +daeElementRef daeSIDResolver::getElement() +{ + if ( state == target_loaded ) { + resolve(); + } + return element; +} + +daeDoubleArray *daeSIDResolver::getDoubleArray() +{ + if ( state == target_loaded ) { + resolve(); + } + return doubleArray; +} + +daeDouble *daeSIDResolver::getDouble() +{ + if ( state == target_loaded ) { + resolve(); + } + return doublePtr; +} + +void daeSIDResolver::resolve() +{ + char * str = (char *)target; + char * pos = strchr( str, '/'); + char * id; + if ( pos == NULL ) { + pos = strchr( str, '.' ); + } + if ( pos == NULL ) { + pos = strchr( str, '(' ); + } + if ( pos != NULL ) { + id = new char[ pos - str + 1 ]; + strncpy( id, str, pos - str ); + id[ pos - str ] = 0; + str = pos; + } + else { + id = new char[ strlen( str ) + 1 ]; + strcpy( id, str ); + str = str + strlen( str ); + } + if ( strcmp( id, "." ) == 0 ) { + element = container; + state = sid_success_element; + } + else { + daeIDRef idref( id ); + idref.setContainer( container ); + idref.resolveElement(); + if ( idref.getState() != daeIDRef::id_success ) { + state = sid_failed_not_found; + delete[] id; + element = NULL; + return; + } + element = idref.getElement(); + state = sid_success_element; + } + + char * next = NULL; + while ( *str != '.' && *str != '(' && *str != 0 ) { + if ( *str == '/' ) { + str++; + } + if ( next != NULL ) { + delete[] next; + next = NULL; + } + pos = strchr( str, '/'); + if ( pos == NULL ) { + pos = strchr( str, '.' ); + } + if ( pos == NULL ) { + pos = strchr( str, '(' ); + } + if ( pos != NULL ) { + next = new char[ pos - str + 1 ]; + strncpy( next, str, pos - str ); + next[ pos - str ] = 0; + str = pos; + } + else { + next = new char[ strlen( str ) + 1 ]; + strcpy( next, str ); + str = str + strlen( str ); + } + //find the child element with SID of next + daeElement *el = findSID( element, next ); + element = el; + if ( element == NULL ) { + //failed + state = sid_failed_not_found; + if ( id != NULL ) { + delete[] id; + } + if ( next != NULL ) { + delete[] next; + next = NULL; + } + return; + } + } + //check for the double array + if ( strcmp( element->getTypeName(), "source" ) == 0 ) { + daeElementRefArray children; + element->getChildren( children ); + size_t cnt = children.getCount(); + + for ( size_t x = 0; x < cnt; x++ ) { + if ( strcmp( children[x]->getTypeName(), "float_array" ) == 0 ) { + doubleArray = (daeDoubleArray*)children[x]->getMeta()->getValueAttribute()->getWritableMemory( children[x] ); + state = sid_success_array; + break; + } + } + } + else + { + daeMetaAttribute *ma = element->getMeta()->getValueAttribute(); + if ( ma != NULL ) { + if ( ma->isArrayAttribute() && ma->getType()->getTypeEnum() == daeAtomicType::DoubleType ) { + doubleArray = (daeDoubleArray*)ma->getWritableMemory( element ); + state = sid_success_array; + } + } + } + + if( state == sid_success_array ) { + //found the double array + if ( *str == '.' ) { + //do the double lookup stuff based on COMMON profile offset + str++; + if ( strcmp( str, "ANGLE" ) == 0 ) { + doublePtr = &(doubleArray->get(3)); + state = sid_success_double; + } + else if ( strlen( str ) == 1 ) { + switch ( *str ) { + case 'X': + case 'R': + case 'U': + case 'S': + doublePtr = &(doubleArray->get(0)); + state = sid_success_double; + break; + case 'Y': + case 'G': + case 'V': + case 'T': + doublePtr = &(doubleArray->get(1)); + state = sid_success_double; + break; + case 'Z': + case 'B': + case 'P': + doublePtr = &(doubleArray->get(2)); + state = sid_success_double; + break; + case 'W': + case 'A': + case 'Q': + doublePtr = &(doubleArray->get(3)); + state = sid_success_double; + break; + }; + } + } + else if ( *str == '(' ) { + //do the double lookup stuff based on the offset given + str++; + pos = strchr( str, '(' ); + daeInt i = atoi( str ); + if ( pos != NULL && doubleArray->getCount() == 16 ) { + //we are doing a matrix lookup + pos++; + daeInt j = atoi( pos ); + doublePtr = &(doubleArray->get( i*4 + j )); + state = sid_success_double; + } + else { + //vector lookup + if ( (daeInt)doubleArray->getCount() > i ) { + doublePtr = &(doubleArray->get(i)); + state = sid_success_double; + } + } + } + } + + if ( id != NULL ) { + delete[] id; + } + if ( next != NULL ) { + delete[] next; + } +} + +daeElement *daeSIDResolver::findSID( daeElement *el, daeString sid ) { + //first check yourself + daeString *s = (daeString*)el->getAttributeValue( "sid" ); + if ( s != NULL && *s != NULL && strcmp( *s, sid ) == 0 ) { + //found it + return el; + } + //and if you are a instance_* then check what you point to + daeString nm = el->getElementName(); + if ( nm == NULL ) { + nm = el->getTypeName(); + } + if ( strncmp( nm, "instance_", 9 ) == 0 ) { + daeURI *uri = (daeURI*)el->getAttributeValue("url"); + if ( uri != NULL && uri->getElement() != NULL ) { + daeElement *e = findSID( uri->getElement(), sid ); + if ( e != NULL ) { + //found it + return e; + } + } + } + + daeElementRefArray children; + el->getChildren( children ); + size_t cnt = children.getCount(); + size_t x; + + for ( x = 0; x < cnt; x++ ) { + //examine the children + //char s[56]; + //daeAtomicType::get( "token" )->memoryToString( children[x]->getAttributeValue( "sid" ), s, 56 ); + daeString *s = (daeString*)children[x]->getAttributeValue( "sid" ); + if ( s != NULL && *s != NULL && strcmp( *s, sid ) == 0 ) { + //found it + return children[x]; + } + } + for ( x = 0; x < cnt; x++ ) { + //if not found look for it in each child + if ( profile != NULL && strcmp( children[x]->getTypeName(), "technique_COMMON" ) == 0 ) { + //not looking for common profile + continue; + } + else if ( strcmp( children[x]->getTypeName(), "technique" ) == 0 && children[x]->hasAttribute( "profile" ) ) { + if ( profile == NULL || strcmp( profile, children[x]->getAttributeValue( "profile" ) ) != 0 ) { + //not looking for this technique profile + continue; + } + } + daeElement *e = findSID( children[x], sid ); + if ( e != NULL ) { + //found it + return e; + } + } + return NULL; +} + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/daeStringRef.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/daeStringRef.cpp new file mode 100644 index 00000000..bcb1d8a7 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/daeStringRef.cpp @@ -0,0 +1,58 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include + +//Contributed by Nus - Wed, 08 Nov 2006 +// Nus: Use global pointer instead of local static. +static daeStringTable *pST = NULL; +//--------------------------- + +daeStringTable &daeStringRef::_stringTable() +{ +//Contributed by Nus - Wed, 08 Nov 2006 + // static daeStringTable *st = new daeStringTable(); + // return *st; + if(!pST) + pST = new daeStringTable(); + return *pST; +} + +void daeStringRef::releaseStringTable(void) +{ + if(pST) { + delete pST; + pST = NULL; + } +} +//-------------------------------- + +daeStringRef::daeStringRef(daeString string) +{ + daeStringTable &st = _stringTable(); + _string = st.allocString(string); +} + +const daeStringRef& +daeStringRef::set(daeString string) +{ + daeStringTable &st = _stringTable(); + _string = st.allocString(string); + return *this; +} + +const daeStringRef& +daeStringRef::operator= (daeString string) +{ + return set(string); +} diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/daeStringTable.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/daeStringTable.cpp new file mode 100644 index 00000000..abc44c7d --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/daeStringTable.cpp @@ -0,0 +1,78 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include + +daeStringTable::daeStringTable(int stringBufferSize):_stringBufferSize(stringBufferSize), _empty( "" ) +{ + _stringBufferIndex = _stringBufferSize; + //allocate initial buffer + //allocateBuffer(); +} + +daeString daeStringTable::allocateBuffer() +{ + daeString buf = new daeChar[_stringBufferSize]; + _stringBuffersList.append(buf); + _stringBufferIndex = 0; + return buf; +} + +daeString daeStringTable::allocString(daeString string) +{ + if ( string == NULL ) return _empty; + size_t stringSize = strlen(string) + 1; + size_t sizeLeft = _stringBufferSize - _stringBufferIndex; + daeString buf; + if (sizeLeft < stringSize) + { + buf = allocateBuffer(); + } + else + { + buf = _stringBuffersList.get((daeInt)_stringBuffersList.getCount()-1); + } + daeChar *str = (char*)buf + _stringBufferIndex; + memcpy(str,string,stringSize); + _stringBufferIndex += stringSize; + + int align = sizeof(void*); + _stringBufferIndex = (_stringBufferIndex+(align-1)) & (~(align-1)); + + //assert +#if defined(_DEBUG) && defined(WIN32) + if (_stringBufferIndex>_stringBufferSize) + { + //error the size of the buffer is not aligned, + //or there is an internal error + assert(0); + return NULL; + } +#endif + + return str; +} + +void daeStringTable::clear() +{ + unsigned int i; + for (i=0;i<_stringBuffersList.getCount();i++) +#if _MSC_VER <= 1200 + delete [] (char *) _stringBuffersList[i]; +#else + delete [] _stringBuffersList[i]; +#endif + + _stringBuffersList.clear(); + _stringBufferIndex = 0; +} diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/daeURI.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/daeURI.cpp new file mode 100644 index 00000000..e4cefffa --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/daeURI.cpp @@ -0,0 +1,1282 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include + +#ifdef _WIN32 +#include // for getcwd (windows) +#else +#include // for getcwd (linux) +#endif + +daeString safeCreate(daeString src); +void safeDelete(daeString src); +daeString findCharacterReverse(daeString string, daeChar stopChar); + +//Contributed by Nus - Wed, 08 Nov 2006 +static daeURIResolverPtrArray *pKR = NULL; +//--------------------------- + +daeURIResolverPtrArray &daeURIResolver::_KnownResolvers() +{ +//Contributed by Nus - Wed, 08 Nov 2006 + // static daeURIResolverPtrArray *kr = new daeURIResolverPtrArray(); + // return *kr; + return *pKR; +//-------------------------------- +} + +//Contributed by Nus - Wed, 08 Nov 2006 +static daeURI* pAppURI = NULL; +// static daeURI ApplicationURI(1); + +extern "C" void initializeURI(void) +{ + if(!pAppURI) { + pAppURI = new daeURI(1); + } + if(!pKR) { + pKR = new daeURIResolverPtrArray(); + } +} + +extern "C" void terminateURI(void) +{ + delete pAppURI; + pAppURI = NULL; + delete pKR; + pKR = NULL; +} +//-------------------------------------- + +void +daeURI::setBaseURI(daeURI& uri) +{ +//Contributed by Nus - Wed, 08 Nov 2006 + // ApplicationURI.reset(); + // ApplicationURI.setURI(uri.getURI()); + pAppURI->reset(); + pAppURI->setURI(uri.getURI()); +//------------------------ +} + +daeURI* +daeURI::getBaseURI() +{ +//Contributed by Nus - Wed, 08 Nov 2006 + return pAppURI; +//-------------------------------------- +} + +void +daeURI::initialize() +{ + // Initialize a URI to it's empty state, same as daeURI::reset but also clears out "container" + + uriString = NULL; + originalURIString = NULL; + protocol = NULL; + authority = NULL; + filepath = NULL; + file = NULL; + id = NULL; + extension = NULL; + state = uri_empty; + element = NULL; + container = NULL; + external = false; +} + +daeURI::~daeURI() +{ + reset(); +} + +daeURI::daeURI() +{ + initialize(); +// reset(); // No need to call reset in the constructor, initialize does the same thing. +} +daeURI::daeURI(int dummy) +{ + (void)dummy; + // This constructor builds a base URI from the current working directory + // This should work for windows or linux + // !!!GAC the buffers should probably be bigger + char buffer[1024], *b1; + strcpy(buffer, "file:///"); +#ifdef NO_GETCWD + // The platform has no getcwd call, so leave the value as file:/// +#else + #ifdef _WIN32 + // Windows getcwd always returns a path beginning with a drive letter, so we add file:/// to the beginning + getcwd(&buffer[8],1024-8); + #else + // Linux getcwd always returns a path beginning with a slash, so we add file:// to the beginning + getcwd(&buffer[7],1024-7); + #endif +#endif + // If the path contains windows backslashes, flip them to forward slashes + for(b1 = buffer;*b1 != 0;b1++) + { + if(*b1 == '\\') + { + *b1 = '/'; + } + } + // The path must end in a slash or the last part of it will be taken as a filename + if(*(b1-1) != '/') + { + *(b1++) = '/'; + } + *b1 = '\0'; + initialize(); + setURI(buffer); + validate(); +} +daeURI::daeURI(daeString uriString, daeBool nofrag) +{ + initialize(); + // !!!GAC this is inefficient as hell, but was the best way to isolate this functionality till the + // !!!GAC daeURI class can be written to support modifying URIs better (should be possible to make a URI, + // !!!GAC change any member and have getURI return the proper const string URI) + if(nofrag) + { + // Strip off the fragment part before constructing the URI + daeString temp = safeCreate(uriString); + daeChar* fragment = (daeChar*)findCharacterReverse(temp, '#'); + if(fragment) + { + *fragment = 0; + } + setURI(temp); + safeDelete(temp); + } + else + { + // Generate the URI without changing the string + setURI(uriString); + } + if(nofrag) + validate(); +} +daeURI::daeURI(daeURI& baseURI, daeString uriString) +{ + initialize(); + setURI(uriString); + validate(&baseURI); +} +daeURI::daeURI(daeURI& copyFrom) +{ + initialize(); + setURI(copyFrom.getOriginalURI()); + element = copyFrom.element; // !!!GAC SetURI immediately clears element so we must do this after + state = copyFrom.state; +} +void +daeURI::copyFrom(daeURI& copyFrom) +{ + setURI(copyFrom.getOriginalURI()); + element = copyFrom.element; // !!!GAC SetURI immediately clears element so we must do this after + state = copyFrom.state; + // !!!GAC Should there be a call to validate in here? +} +void +daeURI::reset() +{ + // Free up any allocated memory + + if (uriString != NULL) + safeDelete(uriString); + + if (originalURIString != NULL) + safeDelete(originalURIString); + + if (protocol != NULL) + safeDelete(protocol); + + if (authority != NULL) + safeDelete(authority); + + if (filepath != NULL) + safeDelete(filepath); + + if (file != NULL) + safeDelete(file); + + if (id != NULL) + safeDelete(id); + + if (extension != NULL) + safeDelete(extension); + + // Set everything to the empty string + + uriString = NULL; + originalURIString = NULL; + protocol = NULL; + authority = NULL; + filepath = NULL; + file = NULL; + id = NULL; + extension = NULL; + + state = uri_empty; + element = NULL; +// container = NULL; // !!!GAC don't want to clear this, our container doesn't change once it's set +} +daeString +findCharacterReverse(daeString string, daeChar stopChar) +{ + if (string == NULL) + return NULL; + daeString cur = string + strlen(string)-1; + while((cur >= string) && (*cur != stopChar)) + cur--; + + if ((cur >= string) && (*cur == stopChar)) + return cur; + + return NULL; +} +daeString +findCharacter(daeString string, daeChar stopChar) +{ + if (string == NULL) + return NULL; + daeString end = string + strlen(string); + daeString cur = string; + while((*cur != stopChar) && (cur < end)) + cur++; + + if (*cur == stopChar) + return cur; + + return NULL; +} +daeString safeCreate(daeString src) +{ + if (src == NULL) + return NULL; + daeChar* ret = (daeChar*)daeMemorySystem::malloc("uri",strlen(src)+1); + if (ret == NULL) + return NULL; + strcpy(ret,src); + + return ret; +} +void safeDelete(daeString src) +{ + if(src != NULL) + { + daeMemorySystem::free("uri",(void*)src); + src = NULL; + } + +} +void +daeURI::setURI(daeString _URIString) +{ +//Contributed by Nus - Wed, 08 Nov 2006 + // Nus: Checking for existing string. + if(originalURIString && _URIString) { + if(strcmp(originalURIString, _URIString) == 0) + return; + } + // Nus: If the string exist, delete it first. + if(originalURIString) { + safeDelete(originalURIString); + originalURIString = NULL; + } +//--------------------------- + originalURIString = safeCreate(_URIString); + internalSetURI(_URIString); +} +daeChar *validScheme(daeString uri_string) +{ + // attempt to find a valid scheme in a string + // Failure to find a scheme returns a NULL, success returns the position of the terminating : + + // First character must be alpha, fail if it's not + if(!isalpha(*uri_string)) + return(NULL); + + // Advance to the next character + uri_string++; + + // Scheme must be at least two (valid) characters long, so go through this loop at least once + do + { + // If the character is NOT alpha, digit, +, - or . then this isn't a valid scheme + // Note this also fails if we encounter a null terminator before hitting the first : + if(!(isalpha(*uri_string) || isdigit(*uri_string) || *uri_string == '.' || *uri_string == '+' || *uri_string == '-')) + return(NULL); + uri_string++; + } while(*uri_string != ':' ); + + return((daeChar *)uri_string); +} +void +daeURI::internalSetURI(daeString _URIString) +{ + daeChar* tmp; + + // Store the originalURI so you can fix it post Reset + daeString oURI = originalURIString; + originalURIString = NULL; + + // Reset everything + reset(); + + // Fix original URI String + originalURIString = oURI; + + uriString = safeCreate(_URIString); + + tmp = (daeChar*)daeMemorySystem::malloc("tmp",strlen(_URIString)+1); + if ((uriString == NULL)||(tmp == NULL)) + return; + strcpy(tmp,uriString); + + daeChar* curSrc = tmp; + +#if 1 + // Check for a scheme, two or more characters followed by a : + +// daeChar* colon = (daeChar*)findCharacter(curSrc,':'); + + daeChar* colon = validScheme(curSrc); + +// if(colon && (colon-tmp >= 2 )) + if(colon) + { + // Found a scheme, remember it (protocol should be named scheme) + *colon = '\0'; + protocol = safeCreate(curSrc); + // Advance the current pointer past the colon + curSrc = colon+1; + } + + // Check for a net path containing an authority, this would begin with // + + if(curSrc[0] == '/' && curSrc[1] == '/') + { + // Advance past the double slash to where the authority would start, then find the next slash + curSrc = curSrc + 2; + daeChar* slash = (daeChar*)findCharacter(curSrc,'/'); + // Temporarily remove that slash (avoids some branches) + if ( slash != NULL ) { + *slash = '\0'; + } + // Save the text between the slashes as the authority + authority = safeCreate(curSrc); + // Put the slash back and advance the current pointer to it, this puts us at the start of the path + if (slash != NULL ) { + *slash = '/'; + curSrc = slash; + } + } + + // Search backwards from the end of the URI for the # which denotes the fragment (called ID here) + daeChar* idSymbol = (daeChar*)findCharacterReverse(curSrc,'#'); + if (idSymbol != NULL) + { + // There was a fragment, isolate it by changing the # to a null + *idSymbol = '\0'; + idSymbol++; + } + id = safeCreate(idSymbol); + + // Search backwards for the last / in the path, everything after is the filename + + daeChar* fname = (daeChar*)findCharacterReverse(curSrc,'/'); + daeChar* dir; + if (fname == NULL) + { + // No / found, so the whole thing is the file name and there is no path + fname = curSrc; + dir = NULL; + } + else + { + // Found a slash, so the filename starts after it and dir starts at curSrc + fname++; + dir = curSrc; + } + file = safeCreate(fname); + + // Pull the extension (if any) off of the filepath + + daeString extStr = findCharacterReverse(fname,'.'); + if (extStr != NULL) + extension = safeCreate(extStr+1); + + // Now pull off the directory path if it exists by putting a zero at the beginning of fname, this insures filepath will end in a slash + + if(fname != NULL) *fname = 0; + filepath = safeCreate(dir); + + state = uri_loaded; + daeMemorySystem::free("tmp",tmp); + +#else + daeBool isAbsolute; + daeChar* colon = (daeChar*)findCharacter(curSrc,':'); + + // IS ABSOLUTE REFERENCE + if (colon && (strlen(colon) > 2) && (colon[1] == '/') && (colon[2] == '/')) + { + *colon = '\0'; + protocol = safeCreate(curSrc); + curSrc = colon+3; + daeString hosttmp = curSrc; + daeChar* slash = (daeChar*)findCharacter(curSrc,'/'); + if (slash != NULL) + { + *slash = '\0'; + authority = safeCreate(hosttmp); + curSrc = slash+1; + } + isAbsolute = true; + } + else { + protocol = NULL; + isAbsolute = false; + } + + // Look for the # which denotes the fragment (called ID here) + daeChar* idSymbol = (daeChar*)findCharacterReverse(curSrc,'#'); + if (idSymbol != NULL) + { + // There was a fragment, isolate it by changing the # to a null + *idSymbol = '\0'; + idSymbol++; + } + + daeChar* dir = NULL; + daeChar* fname = (daeChar*)findCharacterReverse(curSrc,'/'); + if (fname == NULL) + fname = curSrc; + else { + *fname = '\0'; + fname++; + dir = curSrc; + } + + filepath = safeCreate(dir); + int dirLen = (int)strlen(filepath); + + // append a '/' + if ((filepath != NULL) && (dirLen > 0) && + (filepath[dirLen-1] != '/')) { + daeMemorySystem::free("uri",(void*)filepath); + filepath = (daeString)daeMemorySystem::malloc("uri", dirLen+2); + strcpy((daeChar*)filepath,dir); + *((daeChar*)filepath+dirLen) = '/'; + *((daeChar*)filepath+dirLen+1) = '\0'; + } + + file = safeCreate(fname); + id = safeCreate(idSymbol); + + daeString extStr = findCharacterReverse(fname,'.'); + if (extStr != NULL) + extension = safeCreate(extStr+1); + + state = uri_loaded; + daeMemorySystem::free("tmp",tmp); +#endif +} + +void +daeURI::print() +{ + fprintf(stderr,"URI(%s)\n",uriString); + fprintf(stderr,"protocol = %s\n",protocol); + fprintf(stderr,"authority = %s\n",authority); + fprintf(stderr,"path = %s\n",filepath); + fprintf(stderr,"file = %s\n",file); + fprintf(stderr,"id = %s\n",id); + fprintf(stderr,"URI without base = %s\n",originalURIString); + fflush(stderr); +} + +const char* protoString = "://"; +const char* hostString = "/"; +const char* queryString = "#"; +const char* filepathString = "/"; + +daeString +daeURI::getURI() const +{ + return uriString; +} + +daeString +daeURI::getOriginalURI() const +{ + return originalURIString; +} + +void +daeURI::validate(daeURI* baseURI) +{ + // If no base URI was supplied, get the application base and use it + if (baseURI == NULL) + { + if ( container == NULL || (baseURI = container->getDocumentURI()) == NULL ) { + baseURI = getBaseURI(); + } + if (this == baseURI ) { + return; + } + } + +#if 1 + // This is rewritten according to the updated rfc 3986 + if((protocol != NULL) && (strlen(protocol)>0)) // if defined(R.scheme) then + { + // Everything stays the same except path which we normalize + // T.scheme = R.scheme; + // T.authority = R.authority; + // T.path = remove_dot_segments(R.path); + // T.query = R.query; + normalizeURIPath((char *)filepath); + if ( (file == NULL) || (strlen(file)==0) ) { + //safeDelete(file); + //safeDelete(extension); + //file = safeCreate(baseURI->file); + //extension = safeCreate(baseURI->extension); + } + } + else + { + if((authority != NULL) && (strlen(authority)>0)) // if defined(R.authority) then + { + // Authority and query stay the same, path is normalized + // T.authority = R.authority; + // T.path = remove_dot_segments(R.path); + // T.query = R.query; + normalizeURIPath((char *)filepath); + if ( (file == NULL) || (strlen(file)==0) ) { + //safeDelete(file); + //safeDelete(extension); + //file = safeCreate(baseURI->file); + //extension = safeCreate(baseURI->extension); + } + } + else + { + if(((filepath == NULL) || (strlen(filepath)==0)) && ((file == NULL) || (strlen(file)==0))) // if (R.path == "") then + { + // T.path = Base.path; + safeDelete(filepath); + safeDelete(file); + safeDelete(extension); + filepath = safeCreate(baseURI->filepath); + file = safeCreate(baseURI->file); + extension = safeCreate(baseURI->extension); + // We don't handle querys, but if we did + //if defined(R.query) then + // T.query = R.query; + //else + // T.query = Base.query; + //endif; + } + else + { + if((filepath != NULL) && (*filepath == '/')) //if (R.path starts-with "/") then + { + // T.path = remove_dot_segments(R.path); + normalizeURIPath((char *)filepath); + } + else + { + //T.path = merge(Base.path, R.path); + daeChar* newPath; + if((strlen(baseURI->authority) != 0) && (strlen(baseURI->filepath)==0) && (strlen(baseURI->file) == 0)) //authority defined, path empty + { + newPath = (daeChar*)daeMemorySystem::malloc("uri", strlen(filepath) + 2); + *newPath = '/'; + *(newPath+1) = 0; + strcat(newPath,filepath); + } + else + { + size_t l = 0; + if ( filepath != NULL ) { + l = strlen(filepath); + } + newPath = (daeChar*)daeMemorySystem::malloc("uri", strlen(baseURI->filepath) + l + 1); + *newPath = 0; + strcat(newPath,baseURI->filepath); + if ( filepath != NULL ) { + strcat(newPath,filepath); + } + else { + strcat(newPath,""); + } + } + //T.path = remove_dot_segments(T.path); + normalizeURIPath(newPath); + safeDelete(filepath); + filepath = newPath; + } + // T.query = R.query; + } + // T.authority = Base.authority; + safeDelete(authority); + authority = safeCreate(baseURI->authority); + } + // T.scheme = Base.scheme; + safeDelete(protocol); + protocol = safeCreate(baseURI->protocol); + } + // T.fragment = R.fragment; + + // Now for the purpose of maintaining the class members, we reassemble all this into a string version of the URI + size_t len = 0; + if ( protocol != NULL ) { + len += strlen(protocol); + } + if ( authority != NULL ) { + len += strlen(authority); + } + if ( filepath != NULL ) { + len += strlen(filepath); + } + if ( file != NULL ) { + len += strlen(file); + } + if ( queryString != NULL ) { + len += strlen(queryString); + } + if ( id != NULL ) { + len += strlen(id); + } + daeChar* newURI = (daeChar*) + daeMemorySystem::malloc("uri", len + 4 ); + *newURI = 0; + + if(protocol != NULL && *protocol != 0) + { + strcat(newURI, protocol); + strcat(newURI, ":"); + } + strcat(newURI, "//"); + if(authority != NULL && *authority != 0) + { + strcat(newURI, authority); + } + if(filepath != NULL) + strcat(newURI, filepath); + if(file != NULL) + strcat(newURI, file); + + if(id != NULL && *id != 0) + { + strcat(newURI,"#"); + strcat(newURI,id); + } + // This becomes the new uriString, no need to call internalSetUri because all the class members are up to date + safeDelete(uriString); + uriString = newURI; + state = uri_pending; + + if ( container != NULL && container->getDocumentURI() != NULL ) { + daeString fp = container->getDocumentURI()->getFilepath(); + daeString f = container->getDocumentURI()->getFile(); + if ( strcmp( fp, filepath ) != 0 || strcmp( f, file ) != 0 ) { + //external reference + container->getDocument()->addExternalReference( *this ); + external = true; + } + else if ( external ) { + //was external but now isn't + container->getDocument()->removeExternalReference( *this ); + external = false; + } + } + +#else + // RFC 2396 part 5.2 step 3, if the scheme (protocol here) is defined we are done, otherwise inherit the base URI's protocol + if ((protocol == NULL)||(strlen(protocol)==0)) + { + // Make a copy of the base's protocol, not a reference to it + safeDelete(protocol); + protocol = safeCreate(baseURI->protocol); + // part 5.2 step 4, if the authority is defined we skip to step 7, otherwise inherit the base URI's authority + if((authority == NULL) || (strlen(authority)== 0)) + { + // Make a copy of the base's authority, not a reference to it + safeDelete(authority); + authority = safeCreate(baseURI->authority); + // part 5.2 step 5 if the path part (filepath here) begins with a slash we skip to step 7, otherwise resolve the relative path against the base + if((filepath == NULL) || (*filepath != '/')) + { + // part 5.2 step 2, if scheme, authority and path are all empty, this is a reference to the current doc + // COLLADA DOM wants this to resolve to the URI of the document + the fragment + // To make this happen we have the URI inherit the file part of the base (if present) and the path + if( ((filepath == NULL) || (strlen(filepath)==0)) && // filepath empty + ((file == NULL) || (strlen(file)==0)) && // file empty + ((baseURI->file != NULL) && (strlen(baseURI->file) > 0))) // baseURI file NOT empty + { + // inherit the base's filename + safeDelete(file); + file = safeCreate(baseURI->file); + } + // part 5.2 step 6, resolving a relative path reference + // note that in this implementation the filepath does not contain the last segment (the filename.ext) + // Allocate enough memory to hold the merged path + daeChar* newPath = (daeChar*)daeMemorySystem::malloc( + "uri", + strlen(baseURI->filepath) + + strlen(filepath) + 1); + *newPath = 0; + // part 5.2 step 6(a) copy the baseURI filepath to the buffer + strcat(newPath,baseURI->filepath); + // part 5.2 step 6(b) copy this URI's filepath to the buffer + if(*filepath != 0) + { + strcat(newPath,filepath); + } + // part 5.2 step 6(c-g) normalize the new path + normalizeURIPath(newPath); + // part 5.2 step 6(h) replace the old filepath with the new path + safeDelete(filepath); + filepath = newPath; + } + } + // part 5.2 step 7 assemble the final complete URI + // Allocate memory to hold the assembled version of the URI + daeChar* newURI = (daeChar*) + daeMemorySystem::malloc( + "uri", + strlen(protocol) + // really scheme + 1 + // space for ":" + strlen(authority) + // really authority + 2 + // space for "//" + strlen(filepath) + // path without the filename + strlen(file) + // filename part of the path + strlen(queryString) + // "#" + strlen(id) + // really fragment + 1); // terminating zero + *newURI = 0; + if(protocol != NULL && *protocol != 0) + { + strcat(newURI, protocol); + strcat(newURI, ":"); + } + if(authority != NULL && *authority != 0) + { + strcat(newURI, authority); + } + strcat(newURI, "//"); + if(filepath != NULL) + strcat(newURI, filepath); + if(file != NULL) + strcat(newURI, file); + if(id != NULL && *id != 0) + { + strcat(newURI,"#"); + strcat(newURI,id); + } + // Reset the URI to the new one + // Just setting the uriString would probably be enough + internalSetURI(newURI); + daeMemorySystem::free("uri",newURI); + } + state = uri_pending; + +#endif +#if 0 + // If there is no protocol, assume this is a relative URI that needs to be resolved against the base + if ((protocol == NULL)||(strlen(protocol)==0)) + { + // !!!GAC if the base URI contains a file and this uri does not, copy it over (why??) + if (((baseURI->file != NULL) && (strlen(baseURI->file)>0)) && + ((file == NULL)||(strlen(file)==0))) + { + if (file != NULL) + safeDelete(file); + file = safeCreate(baseURI->file); + } + + // !!!GAC this is a quick and dirty attempt to get the relative URIs properly resolved and the internal + // !!!GAC paths normalized. This code should be rewritten when there's time, I wanted to get this up quick + // !!!GAC so we could test the rest of the system to make sure handing it "correct" URIs doesn't break things. + + // Start by allocating memory and putting together just the path component + daeChar* newPath = (daeChar*) + daeMemorySystem::malloc( + "tmp", + strlen(baseURI->filepath) + + strlen(filepathString) + + strlen(filepath) + + strlen(filepathString) + + strlen(file)+1); + *newPath = 0; + strcat(newPath,baseURI->filepath); + strcat(newPath,filepathString); // !!!GAC this may put in an extra / but if it does the normalization will fix it + if(*filepath != 0) + { + strcat(newPath,filepath); // !!!GAC only do this if filepath is not empty + strcat(newPath,filepathString); // !!!GAC only do this if filepath is not empty + } + strcat(newPath,file); + // Normalize the path according to RFC 2396 (removes extra /, .., . and so on) + normalizeURIPath(newPath); + // !!!GAC Allocate memory for the complete URI and assemble it + daeChar* newURI = (daeChar*) + daeMemorySystem::malloc( + "tmp", + strlen(baseURI->protocol) + + strlen(protoString) + + strlen(authority) + + strlen(hostString) + + strlen(newPath) + + strlen(queryString) + + strlen(id)+1); + *newURI = 0; + strcat(newURI,baseURI->protocol); // Should be called "scheme" from RFC 2396 + strcat(newURI,protoString); + strcat(newURI,authority); // Should be called "authority" +// strcat(newURI,hostString); // !!!GAC not necessary, path always begins with a / + strcat(newURI,newPath); + if(strlen(id) != 0) + { + // !!!GAC don't append the #id unless it's needed (bug 297) + strcat(newURI,queryString); + strcat(newURI,id); + } + internalSetURI(newURI); + daeMemorySystem::free("tmp",newPath); + daeMemorySystem::free("tmp",newURI); + } + state = uri_pending; +#endif +} + +void +daeURI::resolveElement(daeString typeNameHint) +{ + if (state == uri_empty) + return; + + if (state == uri_loaded) { + if (container != NULL) + validate(container->getDocumentURI()); + else + validate(); + } + daeURIResolver::attemptResolveElement(*((daeURI*)this), typeNameHint ); +} + +void +daeURI::resolveURI() +{ + // !!!GAC bug 486, there used to be code here that just returned if state was uri_empty or uri_resolve_local this has been removed. + if (element != NULL) + { + // !!!GAC bug 388 and 421, need to add a fragment (#) before the ID (was setURI(element->getID())) + if(element->getID() == NULL || element->getID()[0] == 0) + { + // We can't resolve to an element that has no ID, so if the ID is blank, fail and return + state = uri_failed_invalid_reference; + return; + } + daeChar* newID = (daeChar*)daeMemorySystem::malloc("tmp",strlen(element->getID())+2); + strcpy(newID,"#"); + strcat(newID,element->getID()); + // !!!GAC We have to save element and container because setURI clears them for some reason + daeElementRef elementSave = element; + setURI(newID); + // !!!GAC Hopefully, calling validate like below is the right thing to do to get the full URI resolution + element = elementSave; + validate(element->getDocumentURI()); + element = elementSave; + daeMemorySystem::free("tmp",newID); + state = uri_success; // !!!GAC The element pointer and the URI should agree now, so set success + } + else + { + state = uri_failed_invalid_reference; + } +} + +daeBool daeURI::getPath(daeChar *dest, daeInt size) +{ + + if( file == NULL ) + { + //printf("****** %s : %s\n", uriString, originalURIString); + return false; + } + *dest = 0; + int lenPath = 0; + if ( filepath != NULL ) lenPath = (int)strlen(filepath); + int lenFile = (int)strlen(file); + + int len = lenPath + lenFile; + if (len < size) + { + if ( filepath != NULL ) { + strcpy(dest,filepath); + } + strcat(dest,file); + return true; + } + else + return false; +} + +void +daeURIResolver::attemptResolveElement(daeURI& uri, daeString typeNameHint) +{ + int i; + int cnt =(int) _KnownResolvers().getCount(); + + for(i=0;iisProtocolSupported(uri.getProtocol()))&& + ((uri.getFile() == NULL) || + (uri.getFile()[0] == '\0') || + (_KnownResolvers()[i]->isExtensionSupported(uri.getExtension()))) && + (_KnownResolvers()[i]->resolveElement(uri, typeNameHint))) + return; +} + +void +daeURIResolver::attemptResolveURI(daeURI& uri) +{ + int i,cnt = (int)_KnownResolvers().getCount(); + + daeBool foundProtocol = false; + for(i=0;iisProtocolSupported(uri.getProtocol())) { + foundProtocol = true; + if (_KnownResolvers()[i]->resolveURI(uri)) + return; + } +#if defined(_DEBUG) && defined(WIN32) + char msg[256]; + sprintf(msg,"daeURIResolver::attemptResolveURI(%s) - failed\n", uri.getURI()); + daeErrorHandler::get()->handleWarning( msg ); +#endif + + if (!foundProtocol) { + uri.setState(daeURI::uri_failed_unsupported_protocol); +#if defined(_DEBUG) && defined(WIN32) + char msg[128]; + sprintf(msg,"**protocol '%s' is not supported**\n",uri.getProtocol()); + daeErrorHandler::get()->handleWarning( msg ); +#endif + } + else { +#if defined(_DEBUG) && defined(WIN32) + char msg[256]; + sprintf(msg,"**file(%s/%s) or id(%s) failed to resolve\n", + uri.getFilepath(),uri.getFile(),uri.getID()); + daeErrorHandler::get()->handleWarning( msg ); +#endif + } + +} + +daeBool daeURIResolver::_loadExternalDocuments = true; + +daeURIResolver::daeURIResolver() +{ + _KnownResolvers().append((daeURIResolver*)this); +} + +daeURIResolver::~daeURIResolver() +{ + _KnownResolvers().remove((daeURIResolver*)this); +} +// This code is loosely based on the RFC 2396 normalization code from +// libXML. Specifically it does the RFC steps 6.c->6.g from section 5.2 +// The path is modified in place, there is no error return. +void daeURI::normalizeURIPath(char *path) +{ + char + *cur, // location we are currently processing + *out; // Everything from this back we are done with + + // Return if the path pointer is null + + if (path == NULL) return; + + // Skip any initial / characters to get us to the start of the first segment + + for(cur=path; *cur == '/'; cur++); + + // Return if we hit the end of the string + + if (*cur == 0) return; + + // Keep everything we've seen so far. + + out = cur; + + // Analyze each segment in sequence for cases (c) and (d). + + while (*cur != 0) + { + // (c) All occurrences of "./", where "." is a complete path segment, are removed from the buffer string. + + if ((*cur == '.') && (*(cur+1) == '/')) + { + cur += 2; + // If there were multiple slashes, skip them too + while (*cur == '/') cur++; + continue; + } + + // (d) If the buffer string ends with "." as a complete path segment, that "." is removed. + + if ((*cur == '.') && (*(cur+1) == 0)) + break; + + // If we passed the above tests copy the segment to the output side + + while (*cur != '/' && *cur != 0) + { + *(out++) = *(cur++); + } + + if(*cur != 0) + { + // Skip any occurrances of // at the end of the segment + + while ((*cur == '/') && (*(cur+1) == '/')) cur++; + + // Bring the last character in the segment (/ or a null terminator) into the output + + *(out++) = *(cur++); + } + } + + *out = 0; + + // Restart at the beginning of the first segment for the next part + + for(cur=path; *cur == '/'; cur++); + if (*cur == 0) return; + + // Analyze each segment in sequence for cases (e) and (f). + // + // e) All occurrences of "/../", where is a + // complete path segment not equal to "..", are removed from the + // buffer string. Removal of these path segments is performed + // iteratively, removing the leftmost matching pattern on each + // iteration, until no matching pattern remains. + // + // f) If the buffer string ends with "/..", where + // is a complete path segment not equal to "..", that + // "/.." is removed. + // + // To satisfy the "iterative" clause in (e), we need to collapse the + // string every time we find something that needs to be removed. Thus, + // we don't need to keep two pointers into the string: we only need a + // "current position" pointer. + // + bool trew = true; + while (trew) + { + char *segp, *tmp; + + // At the beginning of each iteration of this loop, "cur" points to + // the first character of the segment we want to examine. + + // Find the end of the current segment. + + for(segp = cur;(*segp != '/') && (*segp != 0); ++segp); + + // If this is the last segment, we're done (we need at least two + // segments to meet the criteria for the (e) and (f) cases). + + if (*segp == 0) + break; + + // If the first segment is "..", or if the next segment _isn't_ "..", + // keep this segment and try the next one. + + ++segp; + if (((*cur == '.') && (cur[1] == '.') && (segp == cur+3)) + || ((*segp != '.') || (segp[1] != '.') + || ((segp[2] != '/') && (segp[2] != 0)))) + { + cur = segp; + continue; + } + + // If we get here, remove this segment and the next one and back up + // to the previous segment (if there is one), to implement the + // "iteratively" clause. It's pretty much impossible to back up + // while maintaining two pointers into the buffer, so just compact + // the whole buffer now. + + // If this is the end of the buffer, we're done. + + if (segp[2] == 0) + { + *cur = 0; + break; + } + + // Strings overlap during this copy, but not in a bad way, just avoid using strcpy + + tmp = cur; + segp += 3; + while ((*(tmp++) = *(segp++)) != 0); + + // If there are no previous segments, then keep going from here. + + segp = cur; + while ((segp > path) && (*(--segp) == '/')); + + if (segp == path) + continue; + + // "segp" is pointing to the end of a previous segment; find it's + // start. We need to back up to the previous segment and start + // over with that to handle things like "foo/bar/../..". If we + // don't do this, then on the first pass we'll remove the "bar/..", + // but be pointing at the second ".." so we won't realize we can also + // remove the "foo/..". + + for(cur = segp;(cur > path) && (*(cur-1) != '/'); cur--); + } + + *out = 0; + + // g) If the resulting buffer string still begins with one or more + // complete path segments of "..", then the reference is + // considered to be in error. Implementations may handle this + // error by retaining these components in the resolved path (i.e., + // treating them as part of the final URI), by removing them from + // the resolved path (i.e., discarding relative levels above the + // root), or by avoiding traversal of the reference. + // + // We discard them from the final path. + + if (*path == '/') + { + for(cur=path; (*cur == '/') && (cur[1] == '.') && (cur[2] == '.') && ((cur[3] == '/') || (cur[3] == 0)); cur += 3); + + if (cur != path) + { + for(out=path; *cur != 0; *(out++) = *(cur++)); + + *out = 0; + } + } + return; +} +// This function will take a resolved URI and create a version of it that is relative to +// another existing URI. The new URI is stored in the "originalURI" +int daeURI::makeRelativeTo(daeURI* relativeToURI) +{ + if( getState() == uri_empty || relativeToURI->getState() == uri_empty ) + return(DAE_ERR_INVALID_CALL); + if( getState() == uri_loaded ) + { + if (container != NULL) + validate(container->getDocumentURI()); + else + validate(); + } + if( relativeToURI->getState() == uri_loaded ) + { + if (relativeToURI->getContainer() != NULL) + relativeToURI->validate(relativeToURI->getContainer()->getDocumentURI()); + else + relativeToURI->validate(); + } + + + // Can only do this function if both URIs have the same scheme and authority + + if((strcmp(getProtocol(), relativeToURI->getProtocol()) != 0) || (strcmp(getAuthority(), relativeToURI->getAuthority()) != 0)) + return(DAE_ERR_INVALID_CALL); // !!!GAC Need to assign a real error code to this + + // advance till we find a segment that doesn't match + + const char *this_filepath = getFilepath(); + const char *relativeTo_filepath = relativeToURI->getFilepath(); + const char *this_slash = this_filepath; + const char *relativeTo_slash = relativeTo_filepath; + + while(*this_filepath == *relativeTo_filepath) + { + if(*this_filepath == '/') + { + this_slash = this_filepath; + relativeTo_slash = relativeTo_filepath; + } + this_filepath++; + relativeTo_filepath++; + } + + // Decide how many ../ segments are needed (Filepath should always end in a /) + int segment_count = 0; + relativeTo_slash++; + while(*relativeTo_slash != 0) + { + if(*relativeTo_slash == '/') + segment_count ++; + relativeTo_slash++; + } + this_slash++; + // Delete old URI string + safeDelete(originalURIString); + // Allocate memory for a new "originalURI" and free the old one + char *newRelativeURI; + if ( getID() == NULL ) + { + newRelativeURI = (char*) daeMemorySystem::malloc("uri",strlen(this_slash)+ strlen(file)+(segment_count*3)+1); + } + else + { + newRelativeURI = (char*) daeMemorySystem::malloc("uri",strlen(this_slash)+ strlen(file)+(segment_count*3)+strlen(id)+2); + } + char *temp = newRelativeURI; + for(int i = 0; i < segment_count; i++) + { + strcpy(temp,"../"); + temp += 3; + } + strcpy(temp,this_slash); + strcat(temp,file); + if(id!=NULL && strlen(getID()) != 0) + { + strcat(temp,"#"); + strcat(temp,getID()); + } + originalURIString = newRelativeURI; + return(DAE_OK); +} + +void daeURIResolver::setAutoLoadExternalDocuments( daeBool load ) +{ + _loadExternalDocuments = load; +} + +daeBool daeURIResolver::getAutoLoadExternalDocuments() +{ + return _loadExternalDocuments; +} + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/dae_vc8.vcproj b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/dae_vc8.vcproj new file mode 100644 index 00000000..d97ca5fb --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/dae_vc8.vcproj @@ -0,0 +1,463 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/domAny.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/domAny.cpp new file mode 100644 index 00000000..5c89d7ec --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/dae/domAny.cpp @@ -0,0 +1,113 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +daeElementRef +domAny::create(daeInt bytes) +{ + domAnyRef ref = new(bytes) domAny; + return ref; +} + + +daeMetaElement * +domAny::registerElement() +{ + //if ( _Meta != NULL ) return _Meta; + daeMetaElement *_Meta = new daeMetaElement; + _Meta->setName( "any" ); + //_Meta->setStaticPointerAddress(&domAny::_Meta); + _Meta->registerClass(domAny::create); + _Meta->setIsInnerClass( true ); + + daeMetaCMPolicy *cm = NULL; + cm = new daeMetaSequence( _Meta, cm, 0, 1, 1 ); + + cm = new daeMetaAny( _Meta, cm, 0, 0, -1 ); + cm->getParent()->appendChild( cm ); // sthomas + cm = cm->getParent(); + + cm->setMaxOrdinal( 0 ); + _Meta->setCMRoot( cm ); + _Meta->setAllowsAny( true ); + + _Meta->addContents(daeOffsetOf(domAny,_contents)); + _Meta->addContentsOrder(daeOffsetOf(domAny,_contentsOrder)); + + //VALUE + { + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( "_value" ); + ma->setType( daeAtomicType::get("xsString")); + ma->setOffset( daeOffsetOf( domAny , _value )); + ma->setContainer( _Meta ); + _Meta->appendAttribute(ma); + } + + _Meta->setElementSize(sizeof(domAny)); + _Meta->validate(); + + return _Meta; +} + +//daeMetaElement * domAny::_Meta = NULL; + +daeBool domAny::setAttribute(daeString attrName, daeString attrValue) { + if (_meta == NULL) + return false; + + //if the attribute already exists set it. + daeMetaAttributeRefArray& metaAttrs = _meta->getMetaAttributes(); + int n = (int)metaAttrs.getCount(); + int i; + for(i=0;igetName() != NULL) && (strcmp(metaAttrs[i]->getName(),attrName)==0)) { + if (metaAttrs[i]->getType() != NULL) { + metaAttrs[i]->set(this,attrValue); + _validAttributeArray[i] = true; + } + return true; + } + } + //else register it and then set it. + if ( n >= MAX_ATTRIBUTES ) { + daeErrorHandler::get()->handleWarning( "domAny::setAttribute() - too many attributes on this domAny. The maximum number of attributes allowed is MAX_ATTRIBUTES" ); + return false; + } + daeMetaAttribute *ma = new daeMetaAttribute; + ma->setName( attrName ); + ma->setType( daeAtomicType::get("xsString")); + ma->setOffset( (daeInt)daeOffsetOf( domAny , attrs[n] )); + ma->setContainer( _meta ); + _meta->appendAttribute(ma); + _validAttributeArray.append( true ); + if (metaAttrs[i]->getType() != NULL) { + metaAttrs[i]->set(this,attrValue); + return true; + } + + return false; +} + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/modules/LIBXMLPlugin/LIBXMLPlugin_vc8.vcproj b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/modules/LIBXMLPlugin/LIBXMLPlugin_vc8.vcproj new file mode 100644 index 00000000..bb2da92a --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/modules/LIBXMLPlugin/LIBXMLPlugin_vc8.vcproj @@ -0,0 +1,311 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/modules/LIBXMLPlugin/daeLIBXMLPlugin.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/modules/LIBXMLPlugin/daeLIBXMLPlugin.cpp new file mode 100644 index 00000000..5c7e6d80 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/modules/LIBXMLPlugin/daeLIBXMLPlugin.cpp @@ -0,0 +1,920 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +// This is a rework of the XML plugin that contains a complete interface to libxml2 "readXML" +// This is intended to be a seperate plugin but I'm starting out by rewriting it in daeLIBXMLPlugin +// because I'm not sure if all the plugin handling stuff has been tested. Once I get a working +// plugin I'll look into renaming it so the old daeLIBXMLPlugin can coexist with it. +// +#include +#include +#include +#include + +#include +#include +#include +#include +#include + +daeLIBXMLPlugin::daeLIBXMLPlugin():topMeta(NULL),database(NULL) +{ + xmlInitParser(); +} + +daeLIBXMLPlugin::~daeLIBXMLPlugin() +{ + xmlCleanupParser(); +} + +daeInt daeLIBXMLPlugin::setMeta(daeMetaElement *_topMeta) +{ + topMeta = _topMeta; + return DAE_OK; +} + +void daeLIBXMLPlugin::setDatabase(daeDatabase* _database) +{ + database = _database; +} + +void daeLIBXMLPlugin::getProgress(daeInt* bytesParsed, + daeInt* lineNumber, + daeInt* totalBytes, + daeBool reset) +{ + // Need to interface this to libxml + if (reset) + { + //daeChunkBuffer::resetProgress(); + } +#if LIBXML_VERSION >= 20620 + if (bytesParsed) + *bytesParsed= 0; //xmlTextReaderByteConsumed(reader); // Not sure if this is the right data + if (lineNumber) + *lineNumber = 0; //xmlTextReaderGetParserLineNumber(reader); +#else + if (bytesParsed) + *bytesParsed= 0; + if (lineNumber) + *lineNumber = 0; +#endif + if (totalBytes) + *totalBytes = 0; // Not available +} +// This function needs to be re-entrant, it can be called recursively from inside of resolveAll +// to load files that the first file depends on. +daeInt daeLIBXMLPlugin::read(daeURI& uri, daeString docBuffer) +{ + // Make sure topMeta has been set before proceeding + + if (topMeta == NULL) + { + return DAE_ERR_BACKEND_IO; + } + + // Generate a version of the URI with the fragment removed + + daeURI fileURI(uri.getURI(),true); + + //check if document already exists + if ( database->isDocumentLoaded( fileURI.getURI() ) ) + { + return DAE_ERR_COLLECTION_ALREADY_EXISTS; + } + + // Create the right type of xmlTextReader on the stack so this function can be re-entrant + + xmlTextReaderPtr reader; + + if(docBuffer) + { + // Load from memory (experimental) +#if 0 //debug stuff + printf("Reading %s from memory buffer\n", fileURI.getURI()); +#endif + reader = xmlReaderForDoc((xmlChar*)docBuffer, fileURI.getURI(), NULL,0); + } + else + { + // Load from URI +#if 0 //debug stuff + printf("Opening %s\n", fileURI.getURI()); +#endif + reader = xmlReaderForFile(fileURI.getURI(), NULL,0); + } + + if(!reader) + { + char msg[512]; + sprintf( msg, "Failed to open %s\n", fileURI.getURI() ); + daeErrorHandler::get()->handleError( msg ); + return DAE_ERR_BACKEND_IO; + } + + // Start parsing the file + + daeElementRef domObject = startParse(topMeta, reader); + + // Parsing done, free the xmlReader and error check to make sure we got a valid DOM back + + xmlFreeTextReader(reader); + + if (!domObject) + { + char msg[512]; + sprintf(msg,"daeLIBXMLPlugin::read(%s) failed - XML Parse Failed\n",fileURI.getFile()); + daeErrorHandler::get()->handleError( msg ); + return DAE_ERR_BACKEND_IO; + } + + // Insert the document into the database, the Database will keep a ref on the main dom, so it won't gets deleted + // until we clear the database + + daeDocument *document = NULL; + + int res = database->insertDocument(fileURI.getURI(),domObject,&document); + if (res!= DAE_OK) + return res; + + // Make a vector to store a list of the integration items that need to be processed later + // postProcessDom will fill this in for us (this should probably not be done in the IOPlugin) + + std::vector intItems; + + //insert the elements into the database, for this DB the elements are the Collada object which have + //an ID. + //this function will fill the _integrationItems array as well + postProcessDom(document, domObject, intItems); + database->validate(); + daeElement::resolveAll(); + + //create the integration objects + int size = (int)intItems.size(); + int i; + for (i=0;icreateFromChecked(intItems[i].element); + + for (i=0;ifromCOLLADAChecked(); + + for (i=0;ifromCOLLADAPostProcessChecked(); + + //clear the temporary integration items array + intItems.clear(); + + return DAE_OK; +} +daeElementRef +daeLIBXMLPlugin::startParse(daeMetaElement* thisMetaElement, xmlTextReaderPtr reader) +{ + // The original parsing system would drop everything up to the first element open, usually + // This behavior will have to be replicated here till we have someplace to put the headers/comments + + int ret = xmlTextReaderRead(reader); + if(ret != 1) + { + // empty or hit end of file + return NULL; + } + //printf("xmlTextReaderConstBaseUri is %s\n",xmlTextReaderConstBaseUri(reader)); + //printf("xmlTextReaderConstNamespaceUri is %s\n",xmlTextReaderConstNamespaceUri(reader)); + //printf("xmlTextReaderConstPrefix is %s\n",xmlTextReaderConstPrefix(reader)); + //printf("xmlTextReaderName is %s\n",xmlTextReaderName(reader)); + + // Process the current element + // Skip over things we don't understand + while(xmlTextReaderNodeType(reader) != XML_READER_TYPE_ELEMENT) + { + ret = xmlTextReaderRead(reader); + if(ret != 1) + return(NULL); + } + + // Create the element that we found + daeElementRef element = thisMetaElement->create((const daeString)xmlTextReaderConstName(reader)); + if(!element) + { + char err[512]; + memset( err, 0, 512 ); + const xmlChar * mine =xmlTextReaderConstName(reader); +#if LIBXML_VERSION >= 20620 + sprintf(err,"The DOM was unable to create an element type %s at line %d\nProbably a schema violation.\n", mine,xmlTextReaderGetParserLineNumber(reader)); +#else + sprintf(err,"The DOM was unable to create an element type %s\nProbably a schema violation.\n", mine); +#endif + daeErrorHandler::get()->handleWarning( err ); + xmlTextReaderNext(reader); + return NULL; + } + int currentDepth = xmlTextReaderDepth(reader); + + //try and read attributes + readAttributes( element, reader ); + +#if 1 + //Check COLLADA Version + if ( strcmp( element->getTypeName(), "COLLADA" ) != 0 ) { + //invalid root + daeErrorHandler::get()->handleError("Loading document with invalid root element!"); + return NULL; + } + daeURI *xmlns = (daeURI*)(element->getMeta()->getMetaAttribute( "xmlns" )->getWritableMemory( element )); + if ( strcmp( xmlns->getURI(), COLLADA_NAMESPACE ) != 0 ) { + //invalid COLLADA version + daeErrorHandler::get()->handleError("Trying to load an invalid COLLADA version for this DOM build!"); + return NULL; + } +#endif + + + ret = xmlTextReaderRead(reader); + // If we're out of data, return the element + if(ret != 1) + return(element); + + // Read all the tags that are part of this tag + bool trew = true; + while(trew) + { + int thisType = xmlTextReaderNodeType(reader); + if(thisType == XML_READER_TYPE_ELEMENT) + { + // Is the new element at the same depth as this one? + if(currentDepth == xmlTextReaderDepth(reader)) + { + // Same depth means the current element ended in a /> so this is a sibling + // so we return and let our parent process it. + return(element); + } + else + { + // The element is a child of this one, so we recurse + if(!element->placeElement(nextElement(element->getMeta(), reader))) + { + char err[512]; + memset( err, 0, 512 ); +#if LIBXML_VERSION >= 20620 + sprintf(err,"placeElement failed at line %d\n", xmlTextReaderGetParserLineNumber(reader)); +#else + sprintf(err,"placeElement failed\n"); +#endif + daeErrorHandler::get()->handleWarning(err); + ret = xmlTextReaderRead(reader); + if ( ret != 1 ) { + return element; + } + } + } + } + else if(thisType == XML_READER_TYPE_TEXT) + { + readValue( element, reader ); + } + else if(thisType == XML_READER_TYPE_END_ELEMENT) + { + // Done with this element so read again and return + ret = xmlTextReaderRead(reader); + return(element); + } + else + { // Skip element types we don't care about + ret = xmlTextReaderRead(reader); + // If we're out of data, return the element + if(ret != 1) + return(element); + } + } + // Return NULL on an error + return NULL; +} + +void daeLIBXMLPlugin::readAttributes( daeElement *element, xmlTextReaderPtr reader ) { + // See if the element has attributes + if(xmlTextReaderHasAttributes(reader)) + { + // Read in and set all the attributes + while(xmlTextReaderMoveToNextAttribute(reader)) + { + daeMetaAttribute *ma = element->getMeta()->getMetaAttribute((const daeString)xmlTextReaderConstName(reader)); + if( ( ma != NULL && ma->getType() != NULL && ma->getType()->getUsesStrings() ) || + strcmp(element->getMeta()->getName(), "any") == 0 ) + { + // String is used as one piece + if(!element->setAttribute( (const daeString)xmlTextReaderConstName(reader), + (const daeString)xmlTextReaderConstValue(reader) ) ) + { + const xmlChar * attName = xmlTextReaderConstName(reader); + const xmlChar * attValue = xmlTextReaderConstValue(reader); + char err[512]; + memset( err, 0, 512 ); +#if LIBXML_VERSION >= 20620 + sprintf(err,"The DOM was unable to create an attribute %s = %s at line %d\nProbably a schema violation.\n", attName, attValue ,xmlTextReaderGetParserLineNumber(reader)); +#else + sprintf(err,"The DOM was unable to create an attribute %s = %s \nProbably a schema violation.\n", attName, attValue); +#endif + daeErrorHandler::get()->handleWarning( err ); + } + } + else + { + // String needs to be broken up into whitespace seperated items. The "set" methods for numbers are smart enough to + // grab just the first number in a string, but the ones for string lists require a null terminator between each + // string. If this could be fixed we could avoid a copy and memory allocation by using xmlTextReaderConstValue(reader) + if ( ma == NULL ) { + const xmlChar * attName = xmlTextReaderConstName(reader); + const xmlChar * attValue = xmlTextReaderConstValue(reader); + char err[512]; + memset( err, 0, 512 ); +#if LIBXML_VERSION >= 20620 + sprintf(err,"The DOM was unable to create an attribute %s = %s at line %d\nProbably a schema violation.\n", attName, attValue ,xmlTextReaderGetParserLineNumber(reader)); +#else + sprintf(err,"The DOM was unable to create an attribute %s = %s \nProbably a schema violation.\n", attName, attValue); +#endif + daeErrorHandler::get()->handleWarning( err ); + continue; + } + xmlChar* value = xmlTextReaderValue(reader); + daeChar* current = (daeChar *)value; + while(*current != 0) + { + // !!!GAC NEEDS TO BE CHANGED to use XML standard whitespace parsing + // Skip leading whitespace + while(*current == ' ' || *current == '\r' || *current == '\n' || *current == '\t') current++; + if(*current != 0) + { + daeChar* start=current; + // Find end of string and insert a zero terminator + while(*current != ' ' && *current != '\r' && *current != '\n' && *current != '\t' && *current != 0) current++; + if(*current != 0) + { + *current = 0; + current++; + } + if(!element->setAttribute( (const daeString)xmlTextReaderConstName(reader), start) ) + { + const xmlChar * attName = xmlTextReaderConstName(reader); + const xmlChar * attValue = xmlTextReaderConstValue(reader); + char err[512]; + memset( err, 0, 512 ); +#if LIBXML_VERSION >= 20620 + sprintf(err,"The DOM was unable to create an attribute %s = %s at line %d\nProbably a schema violation.\n", attName, attValue ,xmlTextReaderGetParserLineNumber(reader)); +#else + sprintf(err,"The DOM was unable to create an attribute %s = %s \nProbably a schema violation.\n", attName, attValue); +#endif + daeErrorHandler::get()->handleWarning( err ); + } + } + } + //rather leak than break compilers (CodeBlocks/MinGW) + //xmlFree(value); + } + } + } +} + +void daeLIBXMLPlugin::readValue( daeElement *element, xmlTextReaderPtr reader ) { + if ( element->getMeta()->getValueAttribute() == NULL ) { + char err[512]; + memset( err, 0, 512 ); +#if LIBXML_VERSION >= 20620 + sprintf(err,"The DOM was unable to set a value for element of type %s at line %d\nProbably a schema violation.\n", element->getTypeName() ,xmlTextReaderGetParserLineNumber(reader)); +#else + sprintf(err,"The DOM was unable to set a value for element of type %s at line %d\nProbably a schema violation.\n", element->getTypeName() ); +#endif + daeErrorHandler::get()->handleWarning( err ); + } + else if(element->getMeta()->getUsesStringContents()) + { + // String is used as one piece + element->getMeta()->getValueAttribute()->set(element,(const daeString)xmlTextReaderConstValue(reader)); + } + else + { + // String needs to be broken up into whitespace seperated items. The "set" methods for numbers are smart enough to + // grab just the first number in a string, but the ones for string lists require a null terminator between each + // string. If this could be fixed we could avoid a copy and memory allocation by using xmlTextReaderConstValue(reader) + xmlChar* value = xmlTextReaderValue(reader); + daeChar* current = (daeChar *)value; + while(*current != 0) + { + // !!!GAC NEEDS TO BE CHANGED to use XML standard whitespace parsing + // Skip leading whitespace + while(*current == ' ' || *current == '\r' || *current == '\n' || *current == '\t') current++; + if(*current != 0) + { + daeChar* start=current; + // Find end of string and insert a zero terminator + while(*current != ' ' && *current != '\r' && *current != '\n' && *current != '\t' && *current != 0) current++; + if(*current != 0) + { + *current = 0; + current++; + } + element->getMeta()->getValueAttribute()->set(element,start); + // eat the characters we just read (would be nice if set returned characters used. + } + } + //rather leak than break compilers (CodeBlocks/MinGW) + //xmlFree(value); + } + int ret = xmlTextReaderRead(reader); + assert(ret==1); +} + + + +daeElementRef +daeLIBXMLPlugin::nextElement(daeMetaElement* thisMetaElement, xmlTextReaderPtr reader) +{ + int ret; + // Process the current element + // Skip over things we don't understand + while(xmlTextReaderNodeType(reader) != XML_READER_TYPE_ELEMENT) + { + ret = xmlTextReaderRead(reader); + if(ret != 1) + return(NULL); + } + + // Create the element that we found + daeElementRef element = thisMetaElement->create((const daeString)xmlTextReaderConstName(reader)); + if(!element) + { + const xmlChar * mine =xmlTextReaderConstName(reader); + char err[512]; + memset( err, 0, 512 ); +#if LIBXML_VERSION >= 20620 + sprintf(err,"The DOM was unable to create an element type %s at line %d\nProbably a schema violation.\n", mine,xmlTextReaderGetParserLineNumber(reader)); +#else + sprintf(err,"The DOM was unable to create an element type %s\nProbably a schema violation.\n", mine); +#endif + daeErrorHandler::get()->handleWarning( err ); + xmlTextReaderNext(reader); + return NULL; + } + int currentDepth = xmlTextReaderDepth(reader); + + //try and read attributes + readAttributes( element, reader ); + + ret = xmlTextReaderRead(reader); + // If we're out of data, return the element + if(ret != 1) + return(element); + + // Read all the tags that are part of this tag + bool trew = true; + while(trew) + { + int thisType = xmlTextReaderNodeType(reader); + if(thisType == XML_READER_TYPE_ELEMENT) + { + // Is the new element at the same depth as this one? + if(currentDepth == xmlTextReaderDepth(reader)) + { + // Same depth means the current element ended in a /> so this is a sibling + // so we return and let our parent process it. + return(element); + } + else + { + // The element is a child of this one, so we recurse + daeElementRef newEl = nextElement(element->getMeta(), reader); + if( newEl != NULL && !element->placeElement(newEl) ) + { + char err[512]; + memset( err, 0, 512 ); + sprintf(err,"placeElement failed placing element %s in element %s\n", newEl->getTypeName(), element->getTypeName() ); + daeErrorHandler::get()->handleWarning( err ); + ret = xmlTextReaderRead(reader); + if ( ret != 1 ) { + return element; + } + } + } + } + else if(thisType == XML_READER_TYPE_TEXT) + { + readValue( element, reader ); + } + else if(thisType == XML_READER_TYPE_END_ELEMENT) + { + // Done with this element so read again and return + ret = xmlTextReaderRead(reader); + return(element); + } + else + { // Skip element types we don't care about + ret = xmlTextReaderRead(reader); + // If we're out of data, return the element + if(ret != 1) + return(element); + } + } + //program will never get here but this line is needed to supress a warning + return NULL; +} +// postProcessDom traverses all elements below the passed in one and creates a list of all the integration objects. +// this should probably NOT be done in the IO plugin. +void daeLIBXMLPlugin::postProcessDom(daeDocument *document, daeElement* element, std::vector &intItems) +{ + // Null element? Return + + if (!element) + return; + + //element->setDocument(document); + // If this element has an integration object, add it to a list so we can process them all in a bunch later + + if (element->getIntObject(daeElement::int_uninitialized)) + { + INTEGRATION_ITEM item; + item.element = element; + item.intObject = element->getIntObject(daeElement::int_uninitialized); + intItems.push_back(item); + } + + // Recursively call postProcessDom on all of this element's children + daeElementRefArray children; + element->getChildren( children ); + for ( size_t x = 0; x < children.getCount(); x++ ) { + postProcessDom(document, children.get(x), intItems); + } + + /*if (element->getMeta()->getContents() != NULL) { + daeMetaElementArrayAttribute *contents = element->getMeta()->getContents(); + for ( int i = 0; i < contents->getCount( element ); i++ ) { + //array.append( *(daeElementRef*)contents->get( this, i ) ); + daeElementRef elem = *(daeElementRef*)contents->get(element,i); + postProcessDom(document,elem, intItems); + } + } + else + { + daeMetaElementAttributeArray& children = element->getMeta()->getMetaElements(); + int cnt = (int)children.getCount(); + for(int i=0;igetCount(element); + int j; + for(j=0;jget(element,j); + postProcessDom(document,elem, intItems); + } + } + }*/ +} + +daeInt daeLIBXMLPlugin::write(daeURI *name, daeDocument *document, daeBool replace) +{ + // Make sure database and document are both set + if (!database) + return DAE_ERR_INVALID_CALL; + if(!document) + return DAE_ERR_COLLECTION_DOES_NOT_EXIST; + + // Extract just the file path from the URI + daeFixedName finalname; + if (!name->getPath(finalname,sizeof(finalname))) + { + daeErrorHandler::get()->handleError( "can't get path in write\n" ); + return DAE_ERR_BACKEND_IO; + } + + // If replace=false, don't replace existing files + if(!replace) + { + // Using "stat" would be better, but it's not available on all platforms + FILE *tempfd = fopen(finalname,"r"); + if(tempfd != NULL) + { + // File exists, return error + fclose(tempfd); + return DAE_ERR_BACKEND_FILE_EXISTS; + } + } + + // Open the file we will write to + writer = xmlNewTextWriterFilename(name->getURI(), 0); + if ( !writer ) { + char msg[512]; + sprintf(msg,"daeLIBXMLPlugin::write(%s) failed\n",name->getURI()); + daeErrorHandler::get()->handleError( msg ); + return DAE_ERR_BACKEND_IO; + } + xmlChar indentString[10] = " "; + xmlTextWriterSetIndentString( writer, indentString ); + xmlTextWriterSetIndent( writer, 1 ); + xmlTextWriterStartDocument( writer, NULL, NULL, NULL ); + + writeElement( document->getDomRoot() ); + + xmlTextWriterEndDocument( writer ); + xmlTextWriterFlush( writer ); + xmlFreeTextWriter( writer ); + return DAE_OK; +} + +void daeLIBXMLPlugin::writeElement( daeElement* element ) +{ + daeIntegrationObject* _intObject = element->getIntObject(); + daeMetaElement* _meta = element->getMeta(); + if(_intObject) + { + // added in response to bug 478 + _intObject->toCOLLADAChecked(); + _intObject->toCOLLADAPostProcessChecked(); + } + if (!_meta->getIsTransparent() ) { + if ( element->getElementName() ) { + xmlTextWriterStartElement(writer, (xmlChar*)element->getElementName()); + } + else { + xmlTextWriterStartElement(writer, (xmlChar*)(daeString)_meta->getName()); + } + daeMetaAttributeRefArray& attrs = _meta->getMetaAttributes(); + + int acnt = (int)attrs.getCount(); + + for(int i=0;igetValueAttribute(); + if (valueAttr!=NULL) + writeAttribute(valueAttr, element); + + daeElementRefArray children; + element->getChildren( children ); + for ( size_t x = 0; x < children.getCount(); x++ ) { + writeElement( children.get(x) ); + } + + /*if (_meta->getContents() != NULL) { + daeElementRefArray* era = (daeElementRefArray*)_meta->getContents()->getWritableMemory(element); + int elemCnt = (int)era->getCount(); + for(int i = 0; i < elemCnt; i++) { + daeElementRef elem = (daeElementRef)era->get(i); + if (elem != NULL) { + writeElement( elem ); + } + } + } + else + { + daeMetaElementAttributeArray& children = _meta->getMetaElements(); + int cnt = (int)children.getCount(); + for(int i=0;igetElementType(); + if ( !type->getIsAbstract() ) { + for (int c = 0; c < children[i]->getCount(element); c++ ) { + writeElement( *(daeElementRef*)children[i]->get(element,c) ); + } + } + } + }*/ + if (!_meta->getIsTransparent() ) { + xmlTextWriterEndElement(writer); + } +} + +#define TYPE_BUFFER_SIZE 1024*1024 + +/*void daeLIBXMLPlugin::writeAttribute( daeMetaAttribute* attr, daeElement* element, daeInt attrNum ) +{ + static daeChar atomicTypeBuf[TYPE_BUFFER_SIZE]; + + if (element == NULL) + return; + if ( attr->getCount(element) == 0 ) { + //we don't have a value if its required print it empty else just skip + if ( attr->getIsRequired() ) { + xmlTextWriterStartAttribute( writer, (xmlChar*)(daeString)attr->getName() ); + xmlTextWriterEndAttribute( writer ); + } + return; + } + else if ( attr->getCount(element) == 1 ) { + //single value or an array of a single value + char* elemMem = attr->get(element, 0); + + // !!!GAC recoded the suppression logic so you could enable suppressions individually + if(!attr->getIsRequired()) + { + // This attribute was not required and might get suppressed + int typeSize = attr->getType()->getSize(); + if(attr->getDefault() != NULL) + { + #if 1 + // The attribute has a default, convert the default to binary and suppress + // output of the attribute if the value matches the default. + // DISABLE THIS CODE IF YOU WANT DEFAULT VALUES TO ALWAYS EXPORT + if(typeSize >= TYPE_BUFFER_SIZE) + { + char msg[512]; + sprintf(msg, + "daeMetaAttribute::print() - buffer too small for default value of %s in %s\n", + (daeString)attr->getName(),(daeString)attr->getContainer()->getName()); + daeErrorHandler::get()->handleError( msg ); + return; + } + attr->getType()->stringToMemory((daeChar*)attr->getDefault(),atomicTypeBuf); + if(memcmp(atomicTypeBuf,elemMem,typeSize) == 0) + return; + #endif + } + else + { + #if 0 + // The attribute does not have a default, suppress it if its value is all zeros (binary) + // DISABLE THIS CODE IF YOU WANT OPTIONAL ATTRIBUTES THAT HAVE A VALUE OF ZERO TO EXPORT + // Disabling this code may cause some unused attributes to be exported if _isValid is not + // enabled and properly used. + int i; + for(i=0; igetContainer()->getValueAttribute() != attr && + attr->getType()->getTypeEnum() != daeAtomicType::BoolType && + attr->getType()->getTypeEnum() != daeAtomicType::EnumType ) + return; + #endif + if ( attrNum != -1 && !element->isAttributeSet( attr->getName() ) ) { + return; + } + } + } + + // Convert the attribute to a string + + if (attr->getType()->memoryToString(elemMem, atomicTypeBuf, TYPE_BUFFER_SIZE)== false) { + char msg[512]; + sprintf(msg, + "daeMetaAttribute::print() - buffer too small for %s in %s\n", + (daeString)attr->getName(),(daeString)attr->getContainer()->getName()); + daeErrorHandler::get()->handleError( msg ); + } + + // Suppress attributes that convert to an empty string. + + if (strlen(atomicTypeBuf) == 0) + return; + + // Is this a value attribute or something else? + + if (attr->getContainer()->getValueAttribute() == attr) + { + // Always export value attributes + xmlTextWriterWriteString( writer, (xmlChar*)atomicTypeBuf); + } + else + { + // Suppress attributes not marked as containing valid values + // DO NOT TURN THIS ON TILL ALL USER CODE HAS BEEN CHANGED TO SET _isValid OR + // ATTRIBUTES THAT WERE CREATED/SET BY USER CODE MAY NOT EXPORT. + #if 0 + // NOTE: even if a value is marked REQUIRED by the schema, if _isValid isn't true it means + // the value in this parameter was never set and may be garbage, so we suppress it even though it is required. + // To change this add && !_isRequired to the expression below. + if(!attr->getIsValid() ) + return; + #endif + // Export the attribute name and value + xmlTextWriterWriteAttribute( writer, (xmlChar*)(daeString)attr->getName(), (xmlChar*)atomicTypeBuf); + } + } + else { + if (attr->getContainer()->getValueAttribute() != attr) + { + xmlTextWriterStartAttribute( writer, (xmlChar*)(daeString)attr->getName() ); + } + for( int i = 0; i < attr->getCount(element); i++ ) { + char* elemMem = attr->get(element, i); + if (attr->getType()->memoryToString(elemMem, atomicTypeBuf, TYPE_BUFFER_SIZE)== false) + { + char msg[512]; + sprintf(msg, + "daeMetaArrayAttribute::print() - buffer too small for %s in %s\n", + (daeString)attr->getName(),(daeString)attr->getContainer()->getName()); + daeErrorHandler::get()->handleError( msg ); + } + xmlTextWriterWriteFormatString( writer, "%s ", (xmlChar*)atomicTypeBuf ); + } + if (attr->getContainer()->getValueAttribute() != attr) + { + xmlTextWriterEndAttribute( writer ); + } + } +}*/ + +void daeLIBXMLPlugin::writeAttribute( daeMetaAttribute* attr, daeElement* element, daeInt attrNum ) +{ + static daeChar atomicTypeBuf[TYPE_BUFFER_SIZE+1]; + daeChar *buf = atomicTypeBuf; + daeUInt bufSz = TYPE_BUFFER_SIZE; + + size_t valCount = attr->getCount(element); + //default values will not check correctly if they are arrays. Luckily there is only one array attribute in COLLADA. + //don't write if !required and is set && is default + + int typeSize = attr->getType()->getSize(); + if ( typeSize >= TYPE_BUFFER_SIZE ) + { + char msg[512]; + sprintf(msg, + "daeMetaAttribute::print() - buffer too small for %s in %s\n", + (daeString)attr->getName(),(daeString)attr->getContainer()->getName()); + daeErrorHandler::get()->handleError( msg ); + return; + } + + if ( !attr->isArrayAttribute() && ( attr->getType()->getTypeEnum() == daeAtomicType::StringRefType || + attr->getType()->getTypeEnum() == daeAtomicType::TokenType ) && + *(char**)attr->getWritableMemory( element ) != NULL ) + { + daeUInt sz = (daeUInt)strlen( *(char**)attr->getWritableMemory( element ) ) +1; + if ( bufSz > TYPE_BUFFER_SIZE ) { + buf = new char[ bufSz ]; + bufSz = sz; + } + } + + //always print value + if ( attrNum != -1 ) + { + //not value attribute + if ( !attr->getIsRequired() ) + { + //not required + if ( !element->isAttributeSet( attr->getName() ) ) + { + //early out if !value && !required && !set + return; + } + + //is set + //check for default suppression + if ( attr->getDefault() != NULL ) + { + //has a default value + attr->getType()->stringToMemory( (daeChar*)attr->getDefault(), buf ); + char* elemMem = attr->get( element, 0 ); + if( memcmp( buf, elemMem, typeSize ) == 0 ) + { + //is the default value so exit early + return; + } + } + + //not default so print + xmlTextWriterStartAttribute( writer, (xmlChar*)(daeString)attr->getName() ); + } + else { + //print it because its required + xmlTextWriterStartAttribute( writer, (xmlChar*)(daeString)attr->getName() ); + } + } + if (valCount>0) + { + //do val 0 first then space and the rest of the vals. + char* elemMem = attr->get( element, 0 ); + attr->getType()->memoryToString( elemMem, buf, bufSz ); + if ( buf[0] != 0 ) //null string check + { + xmlTextWriterWriteString( writer, (xmlChar*)buf ); + } + + *buf = ' '; + for( size_t i = 1; i < valCount; i++ ) + { + elemMem = attr->get( element, (int)i ); + attr->getType()->memoryToString( elemMem, buf+1, bufSz ); + xmlTextWriterWriteString( writer, (xmlChar*)buf ); + } + } + if ( attrNum != -1 ) + { + xmlTextWriterEndAttribute( writer ); + } + if ( buf != atomicTypeBuf ) + { + delete[] buf; + } +} + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/modules/LIBXMLPlugin/daeLIBXMLResolver.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/modules/LIBXMLPlugin/daeLIBXMLResolver.cpp new file mode 100644 index 00000000..6c0dc30e --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/modules/LIBXMLPlugin/daeLIBXMLResolver.cpp @@ -0,0 +1,138 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include +#include +#include +#include + +daeLIBXMLResolver::daeLIBXMLResolver(daeDatabase* database,daeIOPlugin* plugin) +{ + _database = database; + _plugin = plugin; +} + +daeLIBXMLResolver::~daeLIBXMLResolver() +{ +} + +daeBool +daeLIBXMLResolver::resolveURI(daeURI& uri) +{ + (void)uri; + return false; +} + +daeString +daeLIBXMLResolver::getName() +{ + return "XMLResolver"; +} + +daeBool +daeLIBXMLResolver::isExtensionSupported(daeString extension) +{ + if ((extension!=NULL) && + (strlen(extension) > 0) && + ((strncmp(extension,"xml",3)==0) || + (strncmp(extension,"XML",3)==0) || + (strncmp(extension,"DAE",3)==0) || + (strncmp(extension,"dae",3)==0))) + return true; + return false; +} + +daeBool +daeLIBXMLResolver::isProtocolSupported(daeString protocol) +{ + if ((protocol!=NULL) && + (strlen(protocol) > 0) && + ((strncmp(protocol,"file",4) == 0) || + (strncmp(protocol,"http",4) == 0))) + return true; + return false; +} + +daeBool +daeLIBXMLResolver::resolveElement(daeURI& uri, daeString typeNameHint) +{ + // Make sure the URI is validated + if (uri.getState() == daeURI::uri_loaded) + { + uri.validate(); + } + + daeElement* resolved = NULL; + int status; + + // Does the URI have a document reference? + if ( (uri.getFile() != NULL) && (strlen(uri.getFile())>0)) + { + // The URI contains a document reference, see if it is loaded and try to load it if it's not + if (!_database->isDocumentLoaded(uri.getURI())) { + if ( _loadExternalDocuments ) { + _plugin->read(uri,NULL); + } + else { + uri.setState( daeURI::uri_failed_external_document ); + return false; + } + } + // Try to find the id by searching this document only + status = _database->getElement(&resolved,0,uri.getID(),typeNameHint,uri.getURI()); + } + else + { + // The URI was just a fragment, so try to find it in the document that contains it. + // !!!GAC not sure if all these pointers will be set when we get here, so assert if any of them aren't + daeElement *tempElement = uri.getContainer(); + //assert(tempElement); + daeDocument *tempDocument; + if ( tempElement == NULL || (tempDocument = tempElement->getDocument()) == NULL ) { + uri.setState(daeURI::uri_failed_missing_container); + char msg[256]; + sprintf(msg, + "daeLIBXMLResolver::resolveElement() - failed to resolve %s\n", + uri.getURI()); + daeErrorHandler::get()->handleError( msg ); + return false; + } + //assert(tempDocument); + daeURI *tempURI = tempDocument->getDocumentURI(); + //assert(tempURI); + status = _database->getElement(&resolved,0,uri.getID(),typeNameHint,tempURI->getURI()); + } + + uri.setElement(resolved); + + // Error if we didn't successfully resolve the uri + + if (status ||(resolved==NULL)) + { + uri.setState(daeURI::uri_failed_id_not_found); + char msg[256]; + sprintf(msg, + "daeLIBXMLResolver::resolveElement() - failed to resolve %s\n", + uri.getURI()); + daeErrorHandler::get()->handleError( msg ); + return false; + } + + uri.setState(daeURI::uri_success); + return true; +} + + + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/modules/STLDatabase/STLDatabase_vc8.vcproj b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/modules/STLDatabase/STLDatabase_vc8.vcproj new file mode 100644 index 00000000..92649d3d --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/modules/STLDatabase/STLDatabase_vc8.vcproj @@ -0,0 +1,298 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/modules/STLDatabase/daeSTLDatabase.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/modules/STLDatabase/daeSTLDatabase.cpp new file mode 100644 index 00000000..b19c7159 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/modules/STLDatabase/daeSTLDatabase.cpp @@ -0,0 +1,619 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include + +daeSTLDatabase::daeSTLDatabase() +{} + +daeSTLDatabase::~daeSTLDatabase() +{ + clear(); +} + +daeInt daeSTLDatabase::setMeta(daeMetaElement *_topMeta) +{ + topMeta = _topMeta; + return DAE_OK; +} + +daeBool +daeSTLDatabase::isDocumentLoaded(daeString name) +{ + daeDocument* document = getDocument(name); + if(document) + return(true); + else + return(false); +} + +// Element Types of all Elements +daeUInt daeSTLDatabase::getTypeCount() +{ + validate(); + return (daeUInt)elements.size(); +} + + +daeString daeSTLDatabase::getTypeName(daeUInt index) +{ + validate(); + daeUInt count = 0; + + std::map >::iterator iter = elements.begin(); + std::map >::iterator end = elements.end(); + while ( iter != end ) + { + if ( count == index ) + { + return (*iter).first.c_str(); + } + ++count; + ++iter; + } + + return NULL; +} + +// Documents +daeInt daeSTLDatabase::insertDocument(const char *name, daeElement* dom, daeDocument** document) +{ + return createDocument( name, dom, document ); +} +daeInt daeSTLDatabase::createDocument(const char *name, daeElement* dom, daeDocument** document) +{ + // If a document already exists with the same name, error + if(isDocumentLoaded(name)) + { + if (document) + *document = NULL; + return DAE_ERR_COLLECTION_ALREADY_EXISTS; + } + + // Make a new document + daeDocument *newDocument = new daeDocument; + // Create a Reference on the domCOLLADA passed into us + newDocument->setDomRoot(dom); + // Set the domCollada's document to this one + //dom->setDocument(newDocument); + // Set and resolve the document URI + newDocument->getDocumentURI()->setURI(name); + newDocument->getDocumentURI()->validate(); + //insertElement( newDocument, dom ); + newDocument->setModified(true); + // Push the connection into the database + documents.push_back(newDocument); + + if (document) + *document = newDocument; + + //check if an already loaded document has external references to this one and resolve them. + for ( unsigned int i = 0; i < documents.size(); i++ ) { + if ( documents[i] != newDocument ) { + documents[i]->resolveExternals( name ); + } + } + + return DAE_OK; +} +// !!!GAC revised version of insertDocument, creates a domCollada and fills it in for you. +daeInt daeSTLDatabase::insertDocument(const char *name, daeDocument** document) +{ + return createDocument( name, document ); +} +daeInt daeSTLDatabase::createDocument(const char *name, daeDocument** document) +{ + + // If a document already exists with the same name, error + if(isDocumentLoaded(name)) + { + if (document) + *document = NULL; + return DAE_ERR_COLLECTION_ALREADY_EXISTS; + } + // Make the new document + daeDocument *newDocument = new daeDocument; + // Make a domCOLLADA to be the root of this new document (this makes a reference so the domCOLLADA won't delete itself + daeElementRef myCOLLADA = topMeta->create(); + // Set the domCollada's document to this one + myCOLLADA->setDocument(newDocument); + newDocument->setDomRoot(myCOLLADA); + // Set and resolve the document URI + newDocument->getDocumentURI()->setURI(name); + newDocument->getDocumentURI()->validate(); + + newDocument->setModified(true); + // Add this document to the list. + documents.push_back(newDocument); + // If the user gave us a place to put the document, send it back to them. + if (document) + *document = newDocument; + + return DAE_OK; +} + +daeInt daeSTLDatabase::insertDocument( daeDocument *c ) { + documents.push_back(c); + insertElement( c, c->getDomRoot() ); + return DAE_OK; +} + +daeInt daeSTLDatabase::removeDocument(daeDocument *document) +{ + std::vector< daeDocument* >::iterator iter = documents.begin(); + while ( iter != documents.end() ) { + if ( (*iter) == document ) { + //delete all of its children + removeElement( *iter, (*iter)->getDomRoot() ); + delete *iter; // sthomas (see bug 1466019) + iter = documents.erase(iter); + } + else { + iter++; + } + } + return DAE_OK; +} + +daeUInt daeSTLDatabase::getDocumentCount() +{ + return (daeUInt)documents.size(); +} + +daeDocument* daeSTLDatabase::getDocument(daeUInt index) +{ + if (indexgetDocumentURI()->getURI(), targetURI)==0) + return(document); + } + return(NULL); +} + +daeString daeSTLDatabase::getDocumentName(daeUInt index) +{ + if (indexgetDocumentURI()->getURI(); + else + return NULL; +} + +// Elements +daeInt daeSTLDatabase::insertElement(daeDocument* document,daeElement* element) +{ + insertChildren( document, element ); + + std::map >::iterator iter = elements.find( std::string( element->getTypeName() ) ); + if ( iter != elements.end() ) + { + (*iter).second.push_back( element ); + } + else + { + std::vector< daeElement* > vec; + vec.push_back( element ); + elements.insert( std::make_pair( std::string( element->getTypeName() ), vec ) ); + } + + //insert into IDMap if element has an ID. IDMap is used to speed up URI resolution + if ( element->getID() != NULL ) { + elementsIDMap.insert( std::make_pair( std::string( element->getID() ), element ) ); + } + + return DAE_OK; +} + +daeInt daeSTLDatabase::insertChildren( daeDocument *c, daeElement *element ) +{ + daeElementRefArray era; + element->getChildren( era ); + for ( unsigned int i = 0; i < era.getCount(); i++ ) { + insertElement( c, era[i] ); + } + return DAE_OK; +} + +daeInt daeSTLDatabase::removeElement(daeDocument* document,daeElement* element) +{ + if ( !element ) { + return DAE_ERR_INVALID_CALL; + } + removeChildren( document, element ); + + std::map >::iterator iter = elements.find( std::string( element->getTypeName() ) ); + if ( iter != elements.end() ) + { + std::vector< daeElement* > &vec = (*iter).second; + std::vector< daeElement* >::iterator i = vec.begin(); + std::vector< daeElement* >::iterator end = vec.end(); + while( i != end ) + { + if ( (*i) == element ) + { + vec.erase( i ); + break; + } + ++i; + } + } + + if ( element->getID() != NULL ) { + std::pair< std::multimap::iterator, std::multimap::iterator> range; + range = elementsIDMap.equal_range( std::string( element->getID() ) ); + std::multimap::iterator iter = range.first; + while( iter != range.second ) { + if ( (*iter).second == element ) { + elementsIDMap.erase( iter ); + break; + } + ++iter; + } + } + return DAE_OK; +} + +daeInt daeSTLDatabase::removeChildren( daeDocument *c, daeElement *element ) +{ + daeElementRefArray era; + element->getChildren( era ); + for ( unsigned int i = 0; i < era.getCount(); i++ ) { + removeElement( c, era[i] ); + } + return DAE_OK; +} + + +daeInt daeSTLDatabase::clear() +{ + elements.clear(); + elementsIDMap.clear(); + int i; + for (i=0;i<(int)documents.size();i++) + delete documents[i]; + documents.clear(); //this will free the daeElement + return DAE_OK; +} + +daeUInt daeSTLDatabase::getElementCount(daeString name,daeString type,daeString file) +{ + validate(); + + // If none of the search keys was specified, return the total element count in the database + if ( !name && !type && !file ) + { + daeUInt count = 0; + std::map< std::string, std::vector< daeElement*> >::iterator iter = elements.begin(); + std::map< std::string, std::vector< daeElement*> >::iterator end = elements.end(); + while( iter != end ) + { + count += (daeUInt)(*iter).second.size(); + ++iter; + } + return count; + } + + if ( name ) + { + // name specified + int count = 0; + if ( file ) + { + // If a document URI was a search key (in file) resolve it to a text URI with no fragment + daeURI tempURI(file,true); + daeDocument *col = getDocument( tempURI.getURI() ); + if ( col == NULL ) { + return 0; + } + // a document was specified + std::pair< std::multimap< std::string, daeElement* >::iterator, std::multimap< std::string, daeElement* >::iterator > range; + range = elementsIDMap.equal_range( std::string( name ) ); + std::multimap< std::string, daeElement* >::iterator i = range.first; + while ( i != range.second ) + { + if ( col == (*i).second->getDocument() ) + { + count++; + } + ++i; + } + return count; + } + else + { + //no file specified - just name + return (daeUInt)elementsIDMap.count( std::string( name ) ); + } + } + + if ( type ) + { + // type specified + std::map< std::string, std::vector< daeElement*> >::iterator iter = elements.find( std::string( type ) ); + if ( iter == elements.end() ) + { + return 0; + } + + int count = 0; + if ( file ) + { + // If a document URI was a search key (in file) resolve it to a text URI with no fragment + daeURI tempURI(file,true); + daeDocument *col = getDocument( tempURI.getURI() ); + if ( col == NULL ) { + return 0; + } + // a document was specified + std::vector< daeElement* > &vec = (*iter).second; + std::vector< daeElement* >::iterator i = vec.begin(); + std::vector< daeElement* >::iterator end = vec.end(); + while( i != end ) + { + if ( col == (*i)->getDocument() ) + { + ++count; + } + ++i; + } + return count; + } + else + { + //no file specified - just type + return (daeUInt)(*iter).second.size(); + } + } + + //if you get here only a file was specified + daeURI tempURI(file,true); + daeDocument *col = getDocument( tempURI.getURI() ); + if ( col == NULL ) { + return 0; + } + //a document was specified + int count = 0; + std::map< std::string, std::vector< daeElement*> >::iterator iter = elements.begin(); + std::map< std::string, std::vector< daeElement*> >::iterator end = elements.end(); + while( iter != end ) + { + std::vector< daeElement* > &vec = (*iter).second; + std::vector< daeElement* >::iterator i = vec.begin(); + std::vector< daeElement* >::iterator end2 = vec.end(); + while( i != end2 ) + { + if( col == (*i)->getDocument() ) + { + ++count; + } + ++i; + } + ++iter; + } + return count; + +} + +daeInt daeSTLDatabase::getElement(daeElement** pElement,daeInt index,daeString name,daeString type,daeString file) +{ + // this sorts the vector if necessary + validate(); + + // If the index is out of range, there can be no match + if ( index < 0 ) + { + return DAE_ERR_QUERY_NO_MATCH; + } + + // If no name, type or file was specified we return the element at "index" - SLOW + if ( !name && !type && !file ) + { + daeUInt count = 0; + std::map< std::string, std::vector< daeElement*> >::iterator iter = elements.begin(); + std::map< std::string, std::vector< daeElement*> >::iterator end = elements.end(); + while( iter != end ) + { + count += (daeUInt)(*iter).second.size(); + if ( (daeInt)count > index ) + { + *pElement = (*iter).second[index - (count - (*iter).second.size())] ; + return DAE_OK; + } + ++iter; + } + return DAE_ERR_QUERY_NO_MATCH; + } + + if ( name ) + { + //name specified + int count = 0; + if ( file ) + { + // If a document URI was a search key (in file) resolve it to a text URI with no fragment + daeURI tempURI(file,true); + daeDocument *col = getDocument( tempURI.getURI() ); + if ( col == NULL ) { + *pElement = NULL; + return DAE_ERR_QUERY_NO_MATCH; + } + //a document was specified + std::pair< std::multimap< std::string, daeElement* >::iterator, std::multimap< std::string, daeElement* >::iterator> range; + range = elementsIDMap.equal_range( std::string( name ) ); + std::multimap< std::string, daeElement* >::iterator i = range.first; + while ( i != range.second ) + { + if ( col == (*i).second->getDocument() ) + { + if ( count == index ) + { + *pElement = (*i).second; + return DAE_OK; + } + count++; + } + ++i; + } + *pElement = NULL; + return DAE_ERR_QUERY_NO_MATCH; + } + else + { + //no document specified + std::multimap< std::string, daeElement* >::iterator i = elementsIDMap.find( std::string( name ) ); + if ( index > (daeInt)elementsIDMap.count( std::string( name ) ) || i == elementsIDMap.end() ) + { + *pElement = NULL; + return DAE_ERR_QUERY_NO_MATCH; + } + for ( int x = 0; x < index; x++ ) + { + ++i; + } + *pElement = i->second; + return DAE_OK; + } + } + + if ( type ) + { + std::map< std::string, std::vector< daeElement*> >::iterator iter = elements.find( std::string( type ) ); + if ( iter == elements.end() ) + { + *pElement = NULL; + return DAE_ERR_QUERY_NO_MATCH; + } + //type specified + int count = 0; + if ( file ) + { + // If a document URI was a search key (in file) resolve it to a text URI with no fragment + daeURI tempURI(file,true); + daeDocument *col = getDocument( tempURI.getURI() ); + if ( col == NULL ) { + return DAE_ERR_QUERY_NO_MATCH; + } + //a document was specified + // a document was specified + std::vector< daeElement* > &vec = (*iter).second; + std::vector< daeElement* >::iterator i = vec.begin(); + std::vector< daeElement* >::iterator end = vec.end(); + while( i != end ) + { + if ( col == (*i)->getDocument() ) + { + if ( count == index ) + { + *pElement = (*i); + return DAE_OK; + } + ++count; + } + ++i; + } + return DAE_ERR_QUERY_NO_MATCH; + } + else + { + //no document specified + if ( index >= (daeInt)(*iter).second.size() ) + { + *pElement = NULL; + return DAE_ERR_QUERY_NO_MATCH; + } + *pElement = (*iter).second[index]; + return DAE_OK; + } + } + + //if you get here only the file was specified - SLOW + daeURI tempURI(file,true); + daeDocument *col = getDocument( tempURI.getURI() ); + if ( col == NULL ) { + return DAE_ERR_QUERY_NO_MATCH; + } + //a document was specified + int count = 0; + std::map< std::string, std::vector< daeElement*> >::iterator iter = elements.begin(); + std::map< std::string, std::vector< daeElement*> >::iterator end = elements.end(); + while( iter != end ) + { + std::vector< daeElement* > &vec = (*iter).second; + std::vector< daeElement* >::iterator i = vec.begin(); + std::vector< daeElement* >::iterator end2 = vec.end(); + while( i != end2 ) + { + if( col == (*i)->getDocument() ) + { + if( count == index ) + { + *pElement = (*i); + return DAE_OK; + } + ++count; + } + ++i; + } + ++iter; + } + return DAE_ERR_QUERY_NO_MATCH; + +} + +// Generic Query +daeInt daeSTLDatabase::queryElement(daeElement** pElement, daeString genericQuery) +{ + (void)pElement; + (void)genericQuery; + return DAE_ERR_NOT_IMPLEMENTED; +} + +void daeSTLDatabase::validate() +{ + for( unsigned int i = 0; i < documents.size(); i++ ) { + if (documents[i]->getModified() ) { + daeDocument *tmp = documents[i]; + const daeElementRefArray &rea = tmp->getRemovedArray(); + unsigned int x; + for ( x = 0; x < rea.getCount(); x++ ) { + removeElement( tmp, rea[x] ); + } + + const daeElementRefArray &iea = tmp->getInsertedArray(); + for ( x = 0; x < iea.getCount(); x++ ) { + insertElement( tmp, iea[x] ); + } + + tmp->setModified(false); + } + } +} + diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/modules/stdErrPlugin/stdErrPlugin.cpp b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/modules/stdErrPlugin/stdErrPlugin.cpp new file mode 100644 index 00000000..15d52042 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/modules/stdErrPlugin/stdErrPlugin.cpp @@ -0,0 +1,33 @@ +/* + * Copyright 2006 Sony Computer Entertainment Inc. + * + * Licensed under the SCEA Shared Source License, Version 1.0 (the "License"); you may not use this + * file except in compliance with the License. You may obtain a copy of the License at: + * http://research.scea.com/scea_shared_source_license.html + * + * Unless required by applicable law or agreed to in writing, software distributed under the License + * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + * implied. See the License for the specific language governing permissions and limitations under the + * License. + */ + +#include +#include + +stdErrPlugin::stdErrPlugin() { +} + +stdErrPlugin::~stdErrPlugin() { +} + +void stdErrPlugin::handleError( daeString msg ) { + //fprintf( stderr, "Error: %s\n", msg ); + //fflush( stderr ); + printf( "Error: %s\n", msg ); +} + +void stdErrPlugin::handleWarning( daeString msg ) { + //fprintf( stderr, "Warning: %s\n", msg ); + //fflush( stderr ); + printf( "Warning: %s\n", msg ); +} diff --git a/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/modules/stdErrPlugin/stdErrPlugin_vc8.vcproj b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/modules/stdErrPlugin/stdErrPlugin_vc8.vcproj new file mode 100644 index 00000000..2f396941 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/COLLADA_DOM/src/modules/stdErrPlugin/stdErrPlugin_vc8.vcproj @@ -0,0 +1,299 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/BulletPhysics/bulletTrunk/Extras/CSharpWrapper/AssemblyInfo.cpp b/BulletPhysics/bulletTrunk/Extras/CSharpWrapper/AssemblyInfo.cpp new file mode 100644 index 00000000..b3c5ac74 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CSharpWrapper/AssemblyInfo.cpp @@ -0,0 +1,42 @@ +//#include "stdafx.h" + +using namespace System; +using namespace System::Reflection; +using namespace System::Runtime::CompilerServices; +using namespace System::Runtime::InteropServices; +using namespace System::Security::Permissions; + +// +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +// +[assembly:AssemblyTitleAttribute("Scea.BulletPhysics")]; +[assembly:AssemblyDescriptionAttribute("managed bullet physics engine C-API library ")]; +[assembly:AssemblyConfigurationAttribute("")]; +[assembly:AssemblyCompanyAttribute("")]; +[assembly:AssemblyProductAttribute("Scea.BulletPhysics")]; +[assembly:AssemblyCopyrightAttribute("Copyright (c) 2008")]; +[assembly:AssemblyTrademarkAttribute("")]; +[assembly:AssemblyCultureAttribute("")]; + +// +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +// You can specify all the value or you can default the Revision and Build Numbers +// by using the '*' as shown below: + +[assembly:AssemblyVersionAttribute("1.0.*")]; + +[assembly:ComVisible(false)]; + +[assembly:CLSCompliantAttribute(true)]; + +[assembly:Guid("c3dfa120-9f17-11dd-ad8b-0800200c9a66")] + +[assembly:SecurityPermission(SecurityAction::RequestMinimum, UnmanagedCode = true)]; diff --git a/BulletPhysics/bulletTrunk/Extras/CSharpWrapper/BulletPhysics.sln b/BulletPhysics/bulletTrunk/Extras/CSharpWrapper/BulletPhysics.sln new file mode 100644 index 00000000..91a74b13 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CSharpWrapper/BulletPhysics.sln @@ -0,0 +1,198 @@ + +Microsoft Visual Studio Solution File, Format Version 10.00 +# Visual Studio 2008 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "BulletPhysics", "BulletPhysics.vcproj", "{5EE4C1C4-4C81-46BB-A1C4-416F74BF9239}" + ProjectSection(ProjectDependencies) = postProject + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} = {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} + {61BD1097-CF2E-B296-DAA9-73A6FE135319} = {61BD1097-CF2E-B296-DAA9-73A6FE135319} + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} + EndProjectSection +EndProject +Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "BulletPhysicsapp", "BulletPhysicsapp.csproj", "{11E65486-3C29-4D36-B488-4E05D9E4B46B}" + ProjectSection(ProjectDependencies) = postProject + {5EE4C1C4-4C81-46BB-A1C4-416F74BF9239} = {5EE4C1C4-4C81-46BB-A1C4-416F74BF9239} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libbulletmath", "..\..\msvc\8\libbulletmath.vcproj", "{7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libbulletcollision", "..\..\msvc\8\libbulletcollision.vcproj", "{6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libbulletdynamics", "..\..\msvc\8\libbulletdynamics.vcproj", "{61BD1097-CF2E-B296-DAA9-73A6FE135319}" +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Any CPU = Debug|Any CPU + Debug|Mixed Platforms = Debug|Mixed Platforms + Debug|Win32 = Debug|Win32 + DebugDll|Any CPU = DebugDll|Any CPU + DebugDll|Mixed Platforms = DebugDll|Mixed Platforms + DebugDll|Win32 = DebugDll|Win32 + DebugDoublePrecision|Any CPU = DebugDoublePrecision|Any CPU + DebugDoublePrecision|Mixed Platforms = DebugDoublePrecision|Mixed Platforms + DebugDoublePrecision|Win32 = DebugDoublePrecision|Win32 + Release|Any CPU = Release|Any CPU + Release|Mixed Platforms = Release|Mixed Platforms + Release|Win32 = Release|Win32 + ReleaseDll|Any CPU = ReleaseDll|Any CPU + ReleaseDll|Mixed Platforms = ReleaseDll|Mixed Platforms + ReleaseDll|Win32 = ReleaseDll|Win32 + ReleaseDoublePrecision|Any CPU = ReleaseDoublePrecision|Any CPU + ReleaseDoublePrecision|Mixed Platforms = ReleaseDoublePrecision|Mixed Platforms + ReleaseDoublePrecision|Win32 = ReleaseDoublePrecision|Win32 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {5EE4C1C4-4C81-46BB-A1C4-416F74BF9239}.Debug|Any CPU.ActiveCfg = Debug|Win32 + {5EE4C1C4-4C81-46BB-A1C4-416F74BF9239}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {5EE4C1C4-4C81-46BB-A1C4-416F74BF9239}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {5EE4C1C4-4C81-46BB-A1C4-416F74BF9239}.Debug|Win32.ActiveCfg = Debug|Win32 + {5EE4C1C4-4C81-46BB-A1C4-416F74BF9239}.Debug|Win32.Build.0 = Debug|Win32 + {5EE4C1C4-4C81-46BB-A1C4-416F74BF9239}.DebugDll|Any CPU.ActiveCfg = Debug|Win32 + {5EE4C1C4-4C81-46BB-A1C4-416F74BF9239}.DebugDll|Mixed Platforms.ActiveCfg = Debug|Win32 + {5EE4C1C4-4C81-46BB-A1C4-416F74BF9239}.DebugDll|Mixed Platforms.Build.0 = Debug|Win32 + {5EE4C1C4-4C81-46BB-A1C4-416F74BF9239}.DebugDll|Win32.ActiveCfg = Debug|Win32 + {5EE4C1C4-4C81-46BB-A1C4-416F74BF9239}.DebugDll|Win32.Build.0 = Debug|Win32 + {5EE4C1C4-4C81-46BB-A1C4-416F74BF9239}.DebugDoublePrecision|Any CPU.ActiveCfg = Debug|Win32 + {5EE4C1C4-4C81-46BB-A1C4-416F74BF9239}.DebugDoublePrecision|Mixed Platforms.ActiveCfg = Debug|Win32 + {5EE4C1C4-4C81-46BB-A1C4-416F74BF9239}.DebugDoublePrecision|Mixed Platforms.Build.0 = Debug|Win32 + {5EE4C1C4-4C81-46BB-A1C4-416F74BF9239}.DebugDoublePrecision|Win32.ActiveCfg = Debug|Win32 + {5EE4C1C4-4C81-46BB-A1C4-416F74BF9239}.DebugDoublePrecision|Win32.Build.0 = Debug|Win32 + {5EE4C1C4-4C81-46BB-A1C4-416F74BF9239}.Release|Any CPU.ActiveCfg = Release|Win32 + {5EE4C1C4-4C81-46BB-A1C4-416F74BF9239}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {5EE4C1C4-4C81-46BB-A1C4-416F74BF9239}.Release|Mixed Platforms.Build.0 = Release|Win32 + {5EE4C1C4-4C81-46BB-A1C4-416F74BF9239}.Release|Win32.ActiveCfg = Release|Win32 + {5EE4C1C4-4C81-46BB-A1C4-416F74BF9239}.Release|Win32.Build.0 = Release|Win32 + {5EE4C1C4-4C81-46BB-A1C4-416F74BF9239}.ReleaseDll|Any CPU.ActiveCfg = Release|Win32 + {5EE4C1C4-4C81-46BB-A1C4-416F74BF9239}.ReleaseDll|Mixed Platforms.ActiveCfg = Release|Win32 + {5EE4C1C4-4C81-46BB-A1C4-416F74BF9239}.ReleaseDll|Mixed Platforms.Build.0 = Release|Win32 + {5EE4C1C4-4C81-46BB-A1C4-416F74BF9239}.ReleaseDll|Win32.ActiveCfg = Release|Win32 + {5EE4C1C4-4C81-46BB-A1C4-416F74BF9239}.ReleaseDll|Win32.Build.0 = Release|Win32 + {5EE4C1C4-4C81-46BB-A1C4-416F74BF9239}.ReleaseDoublePrecision|Any CPU.ActiveCfg = Release|Win32 + {5EE4C1C4-4C81-46BB-A1C4-416F74BF9239}.ReleaseDoublePrecision|Mixed Platforms.ActiveCfg = Release|Win32 + {5EE4C1C4-4C81-46BB-A1C4-416F74BF9239}.ReleaseDoublePrecision|Mixed Platforms.Build.0 = Release|Win32 + {5EE4C1C4-4C81-46BB-A1C4-416F74BF9239}.ReleaseDoublePrecision|Win32.ActiveCfg = Release|Win32 + {5EE4C1C4-4C81-46BB-A1C4-416F74BF9239}.ReleaseDoublePrecision|Win32.Build.0 = Release|Win32 + {11E65486-3C29-4D36-B488-4E05D9E4B46B}.Debug|Any CPU.ActiveCfg = Debug|Any CPU + {11E65486-3C29-4D36-B488-4E05D9E4B46B}.Debug|Any CPU.Build.0 = Debug|Any CPU + {11E65486-3C29-4D36-B488-4E05D9E4B46B}.Debug|Mixed Platforms.ActiveCfg = Debug|Any CPU + {11E65486-3C29-4D36-B488-4E05D9E4B46B}.Debug|Mixed Platforms.Build.0 = Debug|Any CPU + {11E65486-3C29-4D36-B488-4E05D9E4B46B}.Debug|Win32.ActiveCfg = Debug|Any CPU + {11E65486-3C29-4D36-B488-4E05D9E4B46B}.DebugDll|Any CPU.ActiveCfg = Debug|Any CPU + {11E65486-3C29-4D36-B488-4E05D9E4B46B}.DebugDll|Any CPU.Build.0 = Debug|Any CPU + {11E65486-3C29-4D36-B488-4E05D9E4B46B}.DebugDll|Mixed Platforms.ActiveCfg = Debug|Any CPU + {11E65486-3C29-4D36-B488-4E05D9E4B46B}.DebugDll|Mixed Platforms.Build.0 = Debug|Any CPU + {11E65486-3C29-4D36-B488-4E05D9E4B46B}.DebugDll|Win32.ActiveCfg = Debug|Any CPU + {11E65486-3C29-4D36-B488-4E05D9E4B46B}.DebugDoublePrecision|Any CPU.ActiveCfg = Debug|Any CPU + {11E65486-3C29-4D36-B488-4E05D9E4B46B}.DebugDoublePrecision|Any CPU.Build.0 = Debug|Any CPU + {11E65486-3C29-4D36-B488-4E05D9E4B46B}.DebugDoublePrecision|Mixed Platforms.ActiveCfg = Debug|Any CPU + {11E65486-3C29-4D36-B488-4E05D9E4B46B}.DebugDoublePrecision|Mixed Platforms.Build.0 = Debug|Any CPU + {11E65486-3C29-4D36-B488-4E05D9E4B46B}.DebugDoublePrecision|Win32.ActiveCfg = Debug|Any CPU + {11E65486-3C29-4D36-B488-4E05D9E4B46B}.Release|Any CPU.ActiveCfg = Release|Any CPU + {11E65486-3C29-4D36-B488-4E05D9E4B46B}.Release|Any CPU.Build.0 = Release|Any CPU + {11E65486-3C29-4D36-B488-4E05D9E4B46B}.Release|Mixed Platforms.ActiveCfg = Release|Any CPU + {11E65486-3C29-4D36-B488-4E05D9E4B46B}.Release|Mixed Platforms.Build.0 = Release|Any CPU + {11E65486-3C29-4D36-B488-4E05D9E4B46B}.Release|Win32.ActiveCfg = Release|Any CPU + {11E65486-3C29-4D36-B488-4E05D9E4B46B}.ReleaseDll|Any CPU.ActiveCfg = Release|Any CPU + {11E65486-3C29-4D36-B488-4E05D9E4B46B}.ReleaseDll|Any CPU.Build.0 = Release|Any CPU + {11E65486-3C29-4D36-B488-4E05D9E4B46B}.ReleaseDll|Mixed Platforms.ActiveCfg = Release|Any CPU + {11E65486-3C29-4D36-B488-4E05D9E4B46B}.ReleaseDll|Mixed Platforms.Build.0 = Release|Any CPU + {11E65486-3C29-4D36-B488-4E05D9E4B46B}.ReleaseDll|Win32.ActiveCfg = Release|Any CPU + {11E65486-3C29-4D36-B488-4E05D9E4B46B}.ReleaseDoublePrecision|Any CPU.ActiveCfg = Release|Any CPU + {11E65486-3C29-4D36-B488-4E05D9E4B46B}.ReleaseDoublePrecision|Any CPU.Build.0 = Release|Any CPU + {11E65486-3C29-4D36-B488-4E05D9E4B46B}.ReleaseDoublePrecision|Mixed Platforms.ActiveCfg = Release|Any CPU + {11E65486-3C29-4D36-B488-4E05D9E4B46B}.ReleaseDoublePrecision|Mixed Platforms.Build.0 = Release|Any CPU + {11E65486-3C29-4D36-B488-4E05D9E4B46B}.ReleaseDoublePrecision|Win32.ActiveCfg = Release|Any CPU + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.Debug|Any CPU.ActiveCfg = Debug|Win32 + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.Debug|Win32.ActiveCfg = Debug|Win32 + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.Debug|Win32.Build.0 = Debug|Win32 + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.DebugDll|Any CPU.ActiveCfg = DebugDll|Win32 + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.DebugDll|Mixed Platforms.ActiveCfg = DebugDll|Win32 + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.DebugDll|Mixed Platforms.Build.0 = DebugDll|Win32 + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.DebugDll|Win32.ActiveCfg = DebugDll|Win32 + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.DebugDll|Win32.Build.0 = DebugDll|Win32 + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.DebugDoublePrecision|Any CPU.ActiveCfg = DebugDoublePrecision|Win32 + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.DebugDoublePrecision|Mixed Platforms.ActiveCfg = DebugDoublePrecision|Win32 + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.DebugDoublePrecision|Mixed Platforms.Build.0 = DebugDoublePrecision|Win32 + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.DebugDoublePrecision|Win32.ActiveCfg = DebugDoublePrecision|Win32 + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.DebugDoublePrecision|Win32.Build.0 = DebugDoublePrecision|Win32 + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.Release|Any CPU.ActiveCfg = Release|Win32 + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.Release|Mixed Platforms.Build.0 = Release|Win32 + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.Release|Win32.ActiveCfg = Release|Win32 + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.Release|Win32.Build.0 = Release|Win32 + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.ReleaseDll|Any CPU.ActiveCfg = ReleaseDll|Win32 + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.ReleaseDll|Mixed Platforms.ActiveCfg = ReleaseDll|Win32 + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.ReleaseDll|Mixed Platforms.Build.0 = ReleaseDll|Win32 + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.ReleaseDll|Win32.ActiveCfg = ReleaseDll|Win32 + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.ReleaseDll|Win32.Build.0 = ReleaseDll|Win32 + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.ReleaseDoublePrecision|Any CPU.ActiveCfg = ReleaseDoublePrecision|Win32 + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.ReleaseDoublePrecision|Mixed Platforms.ActiveCfg = ReleaseDoublePrecision|Win32 + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.ReleaseDoublePrecision|Mixed Platforms.Build.0 = ReleaseDoublePrecision|Win32 + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.ReleaseDoublePrecision|Win32.ActiveCfg = ReleaseDoublePrecision|Win32 + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.ReleaseDoublePrecision|Win32.Build.0 = ReleaseDoublePrecision|Win32 + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.Debug|Any CPU.ActiveCfg = Debug|Win32 + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.Debug|Win32.ActiveCfg = Debug|Win32 + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.Debug|Win32.Build.0 = Debug|Win32 + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.DebugDll|Any CPU.ActiveCfg = DebugDll|Win32 + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.DebugDll|Mixed Platforms.ActiveCfg = DebugDll|Win32 + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.DebugDll|Mixed Platforms.Build.0 = DebugDll|Win32 + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.DebugDll|Win32.ActiveCfg = DebugDll|Win32 + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.DebugDll|Win32.Build.0 = DebugDll|Win32 + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.DebugDoublePrecision|Any CPU.ActiveCfg = DebugDoublePrecision|Win32 + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.DebugDoublePrecision|Mixed Platforms.ActiveCfg = DebugDoublePrecision|Win32 + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.DebugDoublePrecision|Mixed Platforms.Build.0 = DebugDoublePrecision|Win32 + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.DebugDoublePrecision|Win32.ActiveCfg = DebugDoublePrecision|Win32 + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.DebugDoublePrecision|Win32.Build.0 = DebugDoublePrecision|Win32 + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.Release|Any CPU.ActiveCfg = Release|Win32 + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.Release|Mixed Platforms.Build.0 = Release|Win32 + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.Release|Win32.ActiveCfg = Release|Win32 + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.Release|Win32.Build.0 = Release|Win32 + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.ReleaseDll|Any CPU.ActiveCfg = ReleaseDll|Win32 + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.ReleaseDll|Mixed Platforms.ActiveCfg = ReleaseDll|Win32 + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.ReleaseDll|Mixed Platforms.Build.0 = ReleaseDll|Win32 + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.ReleaseDll|Win32.ActiveCfg = ReleaseDll|Win32 + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.ReleaseDll|Win32.Build.0 = ReleaseDll|Win32 + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.ReleaseDoublePrecision|Any CPU.ActiveCfg = ReleaseDoublePrecision|Win32 + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.ReleaseDoublePrecision|Mixed Platforms.ActiveCfg = ReleaseDoublePrecision|Win32 + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.ReleaseDoublePrecision|Mixed Platforms.Build.0 = ReleaseDoublePrecision|Win32 + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.ReleaseDoublePrecision|Win32.ActiveCfg = ReleaseDoublePrecision|Win32 + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.ReleaseDoublePrecision|Win32.Build.0 = ReleaseDoublePrecision|Win32 + {61BD1097-CF2E-B296-DAA9-73A6FE135319}.Debug|Any CPU.ActiveCfg = Debug|Win32 + {61BD1097-CF2E-B296-DAA9-73A6FE135319}.Debug|Mixed Platforms.ActiveCfg = Debug|Win32 + {61BD1097-CF2E-B296-DAA9-73A6FE135319}.Debug|Mixed Platforms.Build.0 = Debug|Win32 + {61BD1097-CF2E-B296-DAA9-73A6FE135319}.Debug|Win32.ActiveCfg = Debug|Win32 + {61BD1097-CF2E-B296-DAA9-73A6FE135319}.Debug|Win32.Build.0 = Debug|Win32 + {61BD1097-CF2E-B296-DAA9-73A6FE135319}.DebugDll|Any CPU.ActiveCfg = DebugDll|Win32 + {61BD1097-CF2E-B296-DAA9-73A6FE135319}.DebugDll|Mixed Platforms.ActiveCfg = DebugDll|Win32 + {61BD1097-CF2E-B296-DAA9-73A6FE135319}.DebugDll|Mixed Platforms.Build.0 = DebugDll|Win32 + {61BD1097-CF2E-B296-DAA9-73A6FE135319}.DebugDll|Win32.ActiveCfg = DebugDll|Win32 + {61BD1097-CF2E-B296-DAA9-73A6FE135319}.DebugDll|Win32.Build.0 = DebugDll|Win32 + {61BD1097-CF2E-B296-DAA9-73A6FE135319}.DebugDoublePrecision|Any CPU.ActiveCfg = DebugDoublePrecision|Win32 + {61BD1097-CF2E-B296-DAA9-73A6FE135319}.DebugDoublePrecision|Mixed Platforms.ActiveCfg = DebugDoublePrecision|Win32 + {61BD1097-CF2E-B296-DAA9-73A6FE135319}.DebugDoublePrecision|Mixed Platforms.Build.0 = DebugDoublePrecision|Win32 + {61BD1097-CF2E-B296-DAA9-73A6FE135319}.DebugDoublePrecision|Win32.ActiveCfg = DebugDoublePrecision|Win32 + {61BD1097-CF2E-B296-DAA9-73A6FE135319}.DebugDoublePrecision|Win32.Build.0 = DebugDoublePrecision|Win32 + {61BD1097-CF2E-B296-DAA9-73A6FE135319}.Release|Any CPU.ActiveCfg = Release|Win32 + {61BD1097-CF2E-B296-DAA9-73A6FE135319}.Release|Mixed Platforms.ActiveCfg = Release|Win32 + {61BD1097-CF2E-B296-DAA9-73A6FE135319}.Release|Mixed Platforms.Build.0 = Release|Win32 + {61BD1097-CF2E-B296-DAA9-73A6FE135319}.Release|Win32.ActiveCfg = Release|Win32 + {61BD1097-CF2E-B296-DAA9-73A6FE135319}.Release|Win32.Build.0 = Release|Win32 + {61BD1097-CF2E-B296-DAA9-73A6FE135319}.ReleaseDll|Any CPU.ActiveCfg = ReleaseDll|Win32 + {61BD1097-CF2E-B296-DAA9-73A6FE135319}.ReleaseDll|Mixed Platforms.ActiveCfg = ReleaseDll|Win32 + {61BD1097-CF2E-B296-DAA9-73A6FE135319}.ReleaseDll|Mixed Platforms.Build.0 = ReleaseDll|Win32 + {61BD1097-CF2E-B296-DAA9-73A6FE135319}.ReleaseDll|Win32.ActiveCfg = ReleaseDll|Win32 + {61BD1097-CF2E-B296-DAA9-73A6FE135319}.ReleaseDll|Win32.Build.0 = ReleaseDll|Win32 + {61BD1097-CF2E-B296-DAA9-73A6FE135319}.ReleaseDoublePrecision|Any CPU.ActiveCfg = ReleaseDoublePrecision|Win32 + {61BD1097-CF2E-B296-DAA9-73A6FE135319}.ReleaseDoublePrecision|Mixed Platforms.ActiveCfg = ReleaseDoublePrecision|Win32 + {61BD1097-CF2E-B296-DAA9-73A6FE135319}.ReleaseDoublePrecision|Mixed Platforms.Build.0 = ReleaseDoublePrecision|Win32 + {61BD1097-CF2E-B296-DAA9-73A6FE135319}.ReleaseDoublePrecision|Win32.ActiveCfg = ReleaseDoublePrecision|Win32 + {61BD1097-CF2E-B296-DAA9-73A6FE135319}.ReleaseDoublePrecision|Win32.Build.0 = ReleaseDoublePrecision|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/BulletPhysics/bulletTrunk/Extras/CSharpWrapper/BulletPhysics.vcproj b/BulletPhysics/bulletTrunk/Extras/CSharpWrapper/BulletPhysics.vcproj new file mode 100644 index 00000000..b01de376 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CSharpWrapper/BulletPhysics.vcproj @@ -0,0 +1,209 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/BulletPhysics/bulletTrunk/Extras/CSharpWrapper/BulletPhysicsapp.csproj b/BulletPhysics/bulletTrunk/Extras/CSharpWrapper/BulletPhysicsapp.csproj new file mode 100644 index 00000000..e7dab29f --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CSharpWrapper/BulletPhysicsapp.csproj @@ -0,0 +1,78 @@ + + + Debug + AnyCPU + 8.0.50727 + 2.0 + {11E65486-3C29-4D36-B488-4E05D9E4B46B} + WinExe + Properties + bulletapp + bulletapp + + + 2.0 + + + + + true + full + false + bin\Debug\ + DEBUG;TRACE + prompt + 4 + + + pdbonly + true + bin\Release\ + TRACE + prompt + 4 + + + + False + debug\BulletPhysics.dll + + + + + + + + + + + + + ResXFileCodeGenerator + Resources.Designer.cs + Designer + + + True + Resources.resx + True + + + SettingsSingleFileGenerator + Settings.Designer.cs + + + True + Settings.settings + True + + + + + \ No newline at end of file diff --git a/BulletPhysics/bulletTrunk/Extras/CSharpWrapper/BulletWrapper.cpp b/BulletPhysics/bulletTrunk/Extras/CSharpWrapper/BulletWrapper.cpp new file mode 100644 index 00000000..da55a47a --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CSharpWrapper/BulletWrapper.cpp @@ -0,0 +1,21 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2008 SCEI + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +/* + This is a C++/CLI wrapper of the high-level generic physics C-API. + You will be able to use it in C# +*/ + +#include "BulletWrapper.h" diff --git a/BulletPhysics/bulletTrunk/Extras/CSharpWrapper/BulletWrapper.h b/BulletPhysics/bulletTrunk/Extras/CSharpWrapper/BulletWrapper.h new file mode 100644 index 00000000..2c32466c --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CSharpWrapper/BulletWrapper.h @@ -0,0 +1,422 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2008 SCEI + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +/* + This is a C++/CLI wrapper of the high-level generic physics C-API. + You will be able to use it in C# +*/ + +#pragma once + +#include "Bullet-C-Api.h" + +namespace Scea +{ + namespace BulletPhysics + { + ///

+ /// Base Bullet Class + public __gc class Bullet; + public __gc class RigidBodyHandle; + public __gc class CollisionShapeHandle; + public __gc class MeshInterfaceHandle; + + /// + /// A Mesh Interface Handle for Bullet + public __gc class MeshInterfaceHandle + { + public: + /// + /// Constructor for Mesh Interface Handle + MeshInterfaceHandle(plMeshInterfaceHandle handle) + { + _plMeshInterfaceHandle = handle; + } + /// + /// Destructor for Mesh Interface Handle + ~MeshInterfaceHandle() + { + _plMeshInterfaceHandle = 0; + }; + plMeshInterfaceHandle _plMeshInterfaceHandle; + }; + + /// + /// A RigidBody handle for Bullet + public __gc class RigidBodyHandle + { + public: + /// + /// Constructor for RigidBody handle + RigidBodyHandle(plRigidBodyHandle handle) + { + _plRigidBodyHandle = handle; + } + /// + /// Destructor for RigidBody handle + ~RigidBodyHandle() + { + _plRigidBodyHandle = 0; + }; + plRigidBodyHandle _plRigidBodyHandle; + }; + + /// + /// A Collision Shape handle for Bullet + public __gc class CollisionShapeHandle + { + public: + /// + /// Constructor for Collision Shape handle + CollisionShapeHandle(plCollisionShapeHandle handle) + { + _plCollisionShapeHandle = handle; + } + + /// + /// Destructor for Collision Shape handle + ~CollisionShapeHandle() + { + _plCollisionShapeHandle = 0; + }; + plCollisionShapeHandle _plCollisionShapeHandle; + }; + + /// + /// A RigidBody class in Bullet + public __gc class RigidBody + { + public: + /// + /// Constructor for RigidBody + /// The mass of this RigidBody + /// The Collision Shape handle of this RigidBody + /// stationary object has mass=0.f + RigidBody(float mass, CollisionShapeHandle * shape) + { + _plCollisionShapeHandle = shape->_plCollisionShapeHandle; + _plRigidBodyHandle = plCreateRigidBody(0, mass, _plCollisionShapeHandle); + } + + /// + /// Destructor for RigidBody + ~RigidBody() + { + if (_plRigidBodyHandle != 0) + { + plDeleteRigidBody(_plRigidBodyHandle ); + _plRigidBodyHandle = 0; + } + } + + /// + /// Dispose function for RigidBody + void Dispose() + { + if (_plRigidBodyHandle != 0) + { + plDeleteRigidBody(_plRigidBodyHandle ); + _plRigidBodyHandle = 0; + } + } + + /// + /// Get the Position for this RigidBody + /// The float[3] position of this RigidBody + void GetPosition(float float_array __gc[]) + { + float position[3]; + plGetPosition(_plRigidBodyHandle, position); + for (int i=0; i<3; i++) + float_array[i] = position[i]; + } + + /// + /// Get the Open GL World Matrix for this RigidBody + /// The float[16] GL world matrix of this RigidBody + void GetOpenGLMatrix(float float_array __gc[]) + { + float matrix[16]; + plGetOpenGLMatrix(_plRigidBodyHandle, matrix); + for (int i=0; i<16; i++) + float_array[i] = matrix[i]; + } + + /// + /// Get the orientation for this RigidBody + /// The float[4] orientation of this RigidBody + void GetOrientation(float float_array __gc[]) + { + float orientation[4]; + plGetOrientation(_plRigidBodyHandle, orientation); + for (int i=0; i<4; i++) + float_array[i] = orientation[i]; + } + + /// + /// Set the position for this RigidBody + /// The float[3] position of this RigidBody + void SetPosition(float float_array __gc[]) + { + float position[3]; + for (int i=0; i<3; i++) + position[i] = float_array[i]; + plSetPosition(_plRigidBodyHandle, position); + } + + /// + /// Set the orientation for this RigidBody + /// The float[3] orientation of this RigidBody + void SetOrientation(float float_array __gc[]) + { + float orientation[3]; + for (int i=0; i<3; i++) + orientation[i] = float_array[i]; + plSetOrientation(_plRigidBodyHandle, orientation); + } + + /// + /// Set the orientation for this RigidBody + /// The yaw orientation of this RigidBody + /// The pitch orientation of this RigidBody + /// The roll orientation of this RigidBody + void SetOrientation(float yaw, float pitch, float roll) + { + float orient[4]; + plSetEuler(yaw, pitch, roll, orient); + plSetOrientation(_plRigidBodyHandle, orient); + } + + /// + /// Set the Open GL World Matrix for this RigidBody + /// The float[16] GL world matrix of this RigidBody + void SetOpenGLMatrix(float float_array __gc[]) + { + float matrix[16]; + for (int i=0; i<16; i++) + matrix[i] = float_array[i]; + plSetOpenGLMatrix(_plRigidBodyHandle, matrix); + } + + plRigidBodyHandle _plRigidBodyHandle; + plCollisionShapeHandle _plCollisionShapeHandle; + }; + + + /// + /// Base Bullet Class + public __gc class Bullet + { + public: + /// + /// Constructor for the Bullet + Bullet() + { + m_rigidbody_count = 0; + _plDynamicsWorldHandle = 0; + _plPhysicsSdkHandle = plNewBulletSdk(); + } + /// + /// Destructor for the Bullet + ~Bullet() + { + plDeletePhysicsSdk(_plPhysicsSdkHandle); + _plDynamicsWorldHandle = 0; + _plPhysicsSdkHandle = 0; + } + + /// + /// Step Simulation for Bullet + /// + /// The amount of time to step in this simulation + void StepSimulation(plReal timeStep) + { + plStepSimulation(_plDynamicsWorldHandle, timeStep); + } + + /// + /// Create collision shape handle for sphere + /// + /// The radius of the sphere + CollisionShapeHandle * CreateSphere(float radius) + { + return new CollisionShapeHandle(plNewSphereShape(radius)); + } + + /// + /// Create collision shape handle for Box + /// + /// extend x of the box + /// extend y of the box + /// extend z of the box + CollisionShapeHandle * CreateBox(float x, float y, float z) + { + return new CollisionShapeHandle( plNewBoxShape(x, y, z)); + } + + /// + /// Create collision shape handle for Capsule + /// + /// The radius of the capsule + /// The height of the capsule + CollisionShapeHandle * CreateCapsule(float radius, float height) + { + return new CollisionShapeHandle( plNewCapsuleShape(radius, height)); + } + + /// + /// Create collision shape handle for cone + /// + /// The radius of the cone + /// The height of the cone + CollisionShapeHandle * CreateCone(float radius, float height) + { + return new CollisionShapeHandle( plNewConeShape(radius, height)); + } + + /// + /// Create collision shape handle for cylinder + /// + /// The radius of the cylinder + /// The height of the cylinder + CollisionShapeHandle * CreateCylinder(float radius, float height) + { + return new CollisionShapeHandle( plNewCylinderShape(radius, height)); + } + + /// + /// Create a Compound Shape collision shape handle + /// + CollisionShapeHandle * CreateCompoundShape() + { + return new CollisionShapeHandle( plNewCompoundShape()); + } + + /// + /// Add shape to this Compound Shape collision shape handle + /// + /// compoundShape + /// childShape + /// childPos + /// childOrn + void AddCompoundShape(CollisionShapeHandle * compoundShape, CollisionShapeHandle * childShape, plVector3 childPos,plQuaternion childOrn) + { + plAddChildShape(compoundShape->_plCollisionShapeHandle, childShape->_plCollisionShapeHandle, childPos,childOrn); + } + + /// + /// Destroy a collision shape handle + /// + void DestroyShape(CollisionShapeHandle * shape) + { + plDeleteShape(shape->_plCollisionShapeHandle); + delete shape; + } + + /// + /// Create collision shape handle for Convex Meshes + /// + CollisionShapeHandle * CreateConvexHull() + { + return new CollisionShapeHandle(plNewConvexHullShape()); + } + + /// + /// Add Convex Hull Vertex to the Convex Mesh shape handle + /// + void AddConvexHullVertex(CollisionShapeHandle * handle, float x, float y, float z) + { + plAddVertex(handle->_plCollisionShapeHandle, x, y, z); + } + +/* CollisionShapeHandle * CreateTriangleMesh() + { + MeshInterfaceHandle * handle = new MeshInterfaceHandle(plNewMeshInterface()); + + return new CollisionShapeHandle(plNewStaticTriangleMeshShape(handle->_plMeshInterfaceHandle)); + } + + MeshInterfaceHandle * CreateMeshInterface() + { + + return new MeshInterfaceHandle(plNewMeshInterface()); + } +/* + void AddMeshTriangle(MeshInterfaceHandle * handle, float * v0, float * v1,float * v2) + { + plAddTriangle(handle->_plMeshInterfaceHandle, v0, v1, v2); + } +/* + CollisionShapeHandle * CreateTriangleMesh(MeshInterfaceHandle * handle) + { + return new CollisionShapeHandle(plNewStaticTriangleMeshShape(handle->_plMeshInterfaceHandle)); + } +*/ /* Concave static triangle meshes */ +/* extern void plAddTriangle(plMeshInterfaceHandle meshHandle, plVector3 v0,plVector3 v1,plVector3 v2); + extern plCollisionShapeHandle plNewStaticTriangleMeshShape(plMeshInterfaceHandle); + extern void plSetScaling(plCollisionShapeHandle shape, plVector3 scaling); +*/ + + void SetEuler(float yaw, float pitch, float roll, float * orient) + { + plSetEuler(yaw, pitch, roll, orient); + } + + /// + /// Add RigidBody, If won't haven't created a dynamic world, create one + /// + void AddRigidBody(RigidBody * body) + { + if (m_rigidbody_count == 0) + CreateDynamicsWorld(); + plAddRigidBody(_plDynamicsWorldHandle, body->_plRigidBodyHandle); + m_rigidbody_count++; + } + + /// + /// Remove RigidBody, If we remove everything in this dynamic world, we destroy the dynamic world + /// + void RemoveRigidBody(RigidBody * body) + { + plRemoveRigidBody(_plDynamicsWorldHandle, body->_plRigidBodyHandle); + m_rigidbody_count--; + if (m_rigidbody_count == 0) + DestroyDynamicsWorld(); + } + private: + /// + /// Create a Dynamic World + /// + void CreateDynamicsWorld () + { + _plDynamicsWorldHandle = plCreateDynamicsWorld(_plPhysicsSdkHandle); + } + /// + /// Destroy a Dynamic World + /// + void DestroyDynamicsWorld() + { + plDeleteDynamicsWorld(_plDynamicsWorldHandle); + } + + // The count of rigidbody in this world. + int m_rigidbody_count; + plPhysicsSdkHandle _plPhysicsSdkHandle; + + // This wrapper will let you support only one world at a time. + plDynamicsWorldHandle _plDynamicsWorldHandle; + }; + } +} \ No newline at end of file diff --git a/BulletPhysics/bulletTrunk/Extras/CSharpWrapper/Program.cs b/BulletPhysics/bulletTrunk/Extras/CSharpWrapper/Program.cs new file mode 100644 index 00000000..85916777 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CSharpWrapper/Program.cs @@ -0,0 +1,52 @@ +using System; +using System.Collections.Generic; +using System.Windows.Forms; + +using Scea.BulletPhysics; + +namespace bulletapp +{ + static class Program + { + /// + /// The main entry point for the application. + /// + [STAThread] + static void Main() + { + Bullet bullet = new Bullet(); + + CollisionShapeHandle s_handle = bullet.CreateSphere(1); + RigidBody body = new RigidBody(1, s_handle); + float [] position = new float[3]; + position[0] = 1.0f; position[1] = 1.1f; position[2] = 1.2f; + body.SetPosition(position); + body.SetOrientation(0.1f, 0.2f, 0.3f); + + bullet.AddRigidBody(body); + System.Console.WriteLine("Original Position (" + position[0] + ", " + position[1] + ", " + position[2] + ")"); + + float[] new_position = new float[3]; + for (int i = 0; i < 10; i++) + { + bullet.StepSimulation(0.1f); + System.Console.WriteLine("StepSimulation " + 0.1); + body.GetPosition(new_position); + System.Console.WriteLine("New Position (" + new_position[0] + ", " + new_position[1] + ", " + new_position[2] + ")"); + } + + float[] matrix = new float[16]; + body.GetOpenGLMatrix(matrix); + System.Console.WriteLine("GetOpenGLMatrix (" + + matrix[0] + ", " + matrix[1] + ", " + matrix[2] + ", " + matrix[3] + ", " + + matrix[4] + ", " + matrix[5] + ", " + matrix[6] + ", " + matrix[7] + ", " + + matrix[8] + ", " + matrix[9] + ", " + matrix[10] + ", " + matrix[11] + ", " + + matrix[12] + ", " + matrix[13] + ", " + matrix[14] + ", " + matrix[15] + ")" + ); + + float[] quot = new float[4]; + body.GetOrientation(quot); + System.Console.WriteLine("GetOrientation (" + quot[0] + ", " + quot[1] + ", " + quot[2] + ", " + quot[3] + ")"); + } + } +} \ No newline at end of file diff --git a/BulletPhysics/bulletTrunk/Extras/CSharpWrapper/Properties/AssemblyInfo.cs b/BulletPhysics/bulletTrunk/Extras/CSharpWrapper/Properties/AssemblyInfo.cs new file mode 100644 index 00000000..13f6794e --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CSharpWrapper/Properties/AssemblyInfo.cs @@ -0,0 +1,33 @@ +using System.Reflection; +using System.Runtime.CompilerServices; +using System.Runtime.InteropServices; + +// General Information about an assembly is controlled through the following +// set of attributes. Change these attribute values to modify the information +// associated with an assembly. +[assembly: AssemblyTitle("bulletapp")] +[assembly: AssemblyDescription("")] +[assembly: AssemblyConfiguration("")] +[assembly: AssemblyCompany("PlayStation")] +[assembly: AssemblyProduct("bulletapp")] +[assembly: AssemblyCopyright("Copyright © PlayStation 2008")] +[assembly: AssemblyTrademark("")] +[assembly: AssemblyCulture("")] + +// Setting ComVisible to false makes the types in this assembly not visible +// to COM components. If you need to access a type in this assembly from +// COM, set the ComVisible attribute to true on that type. +[assembly: ComVisible(false)] + +// The following GUID is for the ID of the typelib if this project is exposed to COM +[assembly: Guid("0cae17bf-da40-4b83-8ce2-d21c5d1ec28a")] + +// Version information for an assembly consists of the following four values: +// +// Major Version +// Minor Version +// Build Number +// Revision +// +[assembly: AssemblyVersion("1.0.0.0")] +[assembly: AssemblyFileVersion("1.0.0.0")] diff --git a/BulletPhysics/bulletTrunk/Extras/CSharpWrapper/Properties/Resources.Designer.cs b/BulletPhysics/bulletTrunk/Extras/CSharpWrapper/Properties/Resources.Designer.cs new file mode 100644 index 00000000..0e1a88e9 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CSharpWrapper/Properties/Resources.Designer.cs @@ -0,0 +1,63 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50727.3053 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace bulletapp.Properties { + using System; + + + /// + /// A strongly-typed resource class, for looking up localized strings, etc. + /// + // This class was auto-generated by the StronglyTypedResourceBuilder + // class via a tool like ResGen or Visual Studio. + // To add or remove a member, edit your .ResX file then rerun ResGen + // with the /str option, or rebuild your VS project. + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("System.Resources.Tools.StronglyTypedResourceBuilder", "2.0.0.0")] + [global::System.Diagnostics.DebuggerNonUserCodeAttribute()] + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + internal class Resources { + + private static global::System.Resources.ResourceManager resourceMan; + + private static global::System.Globalization.CultureInfo resourceCulture; + + [global::System.Diagnostics.CodeAnalysis.SuppressMessageAttribute("Microsoft.Performance", "CA1811:AvoidUncalledPrivateCode")] + internal Resources() { + } + + /// + /// Returns the cached ResourceManager instance used by this class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Resources.ResourceManager ResourceManager { + get { + if (object.ReferenceEquals(resourceMan, null)) { + global::System.Resources.ResourceManager temp = new global::System.Resources.ResourceManager("bulletapp.Properties.Resources", typeof(Resources).Assembly); + resourceMan = temp; + } + return resourceMan; + } + } + + /// + /// Overrides the current thread's CurrentUICulture property for all + /// resource lookups using this strongly typed resource class. + /// + [global::System.ComponentModel.EditorBrowsableAttribute(global::System.ComponentModel.EditorBrowsableState.Advanced)] + internal static global::System.Globalization.CultureInfo Culture { + get { + return resourceCulture; + } + set { + resourceCulture = value; + } + } + } +} diff --git a/BulletPhysics/bulletTrunk/Extras/CSharpWrapper/Properties/Resources.resx b/BulletPhysics/bulletTrunk/Extras/CSharpWrapper/Properties/Resources.resx new file mode 100644 index 00000000..af7dbebb --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CSharpWrapper/Properties/Resources.resx @@ -0,0 +1,117 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + text/microsoft-resx + + + 2.0 + + + System.Resources.ResXResourceReader, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + + System.Resources.ResXResourceWriter, System.Windows.Forms, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089 + + \ No newline at end of file diff --git a/BulletPhysics/bulletTrunk/Extras/CSharpWrapper/Properties/Settings.Designer.cs b/BulletPhysics/bulletTrunk/Extras/CSharpWrapper/Properties/Settings.Designer.cs new file mode 100644 index 00000000..cfdcc3b7 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CSharpWrapper/Properties/Settings.Designer.cs @@ -0,0 +1,26 @@ +//------------------------------------------------------------------------------ +// +// This code was generated by a tool. +// Runtime Version:2.0.50727.3053 +// +// Changes to this file may cause incorrect behavior and will be lost if +// the code is regenerated. +// +//------------------------------------------------------------------------------ + +namespace bulletapp.Properties { + + + [global::System.Runtime.CompilerServices.CompilerGeneratedAttribute()] + [global::System.CodeDom.Compiler.GeneratedCodeAttribute("Microsoft.VisualStudio.Editors.SettingsDesigner.SettingsSingleFileGenerator", "9.0.0.0")] + internal sealed partial class Settings : global::System.Configuration.ApplicationSettingsBase { + + private static Settings defaultInstance = ((Settings)(global::System.Configuration.ApplicationSettingsBase.Synchronized(new Settings()))); + + public static Settings Default { + get { + return defaultInstance; + } + } + } +} diff --git a/BulletPhysics/bulletTrunk/Extras/CSharpWrapper/Properties/Settings.settings b/BulletPhysics/bulletTrunk/Extras/CSharpWrapper/Properties/Settings.settings new file mode 100644 index 00000000..39645652 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CSharpWrapper/Properties/Settings.settings @@ -0,0 +1,7 @@ + + + + + + + diff --git a/BulletPhysics/bulletTrunk/Extras/CUDA/README.txt b/BulletPhysics/bulletTrunk/Extras/CUDA/README.txt new file mode 100644 index 00000000..46b5c8c6 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CUDA/README.txt @@ -0,0 +1,13 @@ +btCudaBroadphase is some R&D work, a first attempt to use CUDA in Bullet. +It uses the NVidia CUDA particle demo grid broadphase as Bullet broadphase. + +Press 's' to toggle between the original CUDA particle demo and using Bullet+btCudaBroadphase. +Press '1', '2','3','4' for different start configurations. +Right click for options menu. + +See some related discussion here: +http://www.bulletphysics.com/Bullet/phpBB3/viewtopic.php?f=9&t=500&start=105 + + +Get NVidia CUDA from here: +http://www.nvidia.com/object/cuda_get.html \ No newline at end of file diff --git a/BulletPhysics/bulletTrunk/Extras/CUDA/bt3DGridBroadphase.cpp b/BulletPhysics/bulletTrunk/Extras/CUDA/bt3DGridBroadphase.cpp new file mode 100644 index 00000000..f2709c75 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CUDA/bt3DGridBroadphase.cpp @@ -0,0 +1,604 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2008 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +//-------------------------------------------------------------------------- + +#include "LinearMath/btAlignedAllocator.h" +#include "LinearMath/btQuickprof.h" +#include "BulletCollision/BroadphaseCollision/btOverlappingPairCache.h" +#include "btCudaBroadphaseKernel.h" +#include "btCudaBroadphase.h" + +//-------------------------------------------------------------------------- + +#include + +//-------------------------------------------------------------------------- + +static btCudaBroadphaseParams s3DGridBroadphaseParams; + +//-------------------------------------------------------------------------- + +bt3DGridBroadphase::bt3DGridBroadphase( const btVector3& worldAabbMin,const btVector3& worldAabbMax, + int gridSizeX, int gridSizeY, int gridSizeZ, + int maxSmallProxies, int maxLargeProxies, int maxPairsPerBody, + int maxBodiesPerCell, + btScalar cellFactorAABB) : + btSimpleBroadphase(maxSmallProxies, +// new (btAlignedAlloc(sizeof(btSortedOverlappingPairCache),16)) btSortedOverlappingPairCache), + new (btAlignedAlloc(sizeof(btHashedOverlappingPairCache),16)) btHashedOverlappingPairCache), + m_bInitialized(false), + m_numBodies(0) +{ + m_ownsPairCache = true; + m_params.m_gridSizeX = gridSizeX; + m_params.m_gridSizeY = gridSizeY; + m_params.m_gridSizeZ = gridSizeZ; + m_params.m_numCells = m_params.m_gridSizeX * m_params.m_gridSizeY * m_params.m_gridSizeZ; + btVector3 w_org = worldAabbMin; + m_params.m_worldOriginX = w_org.getX(); + m_params.m_worldOriginY = w_org.getY(); + m_params.m_worldOriginZ = w_org.getZ(); + btVector3 w_size = worldAabbMax - worldAabbMin; + m_params.m_cellSizeX = w_size.getX() / m_params.m_gridSizeX; + m_params.m_cellSizeY = w_size.getY() / m_params.m_gridSizeY; + m_params.m_cellSizeZ = w_size.getZ() / m_params.m_gridSizeZ; + m_maxRadius = btMin(btMin(m_params.m_cellSizeX, m_params.m_cellSizeY), m_params.m_cellSizeZ); + m_maxRadius *= btScalar(0.5f); + m_params.m_numBodies = m_numBodies; + m_params.m_maxBodiesPerCell = maxBodiesPerCell; + + m_numLargeHandles = 0; + m_maxLargeHandles = maxLargeProxies; + + m_maxPairsPerBody = maxPairsPerBody; + + m_cellFactorAABB = cellFactorAABB; + + m_LastLargeHandleIndex = -1; + + _initialize(); +} // bt3DGridBroadphase::bt3DGridBroadphase() + +//-------------------------------------------------------------------------- + +bt3DGridBroadphase::~bt3DGridBroadphase() +{ + //btSimpleBroadphase will free memory of btSortedOverlappingPairCache, because m_ownsPairCache + assert(m_bInitialized); + _finalize(); +} // bt3DGridBroadphase::~bt3DGridBroadphase() + +//-------------------------------------------------------------------------- + +void bt3DGridBroadphase::_initialize() +{ + assert(!m_bInitialized); + // allocate host storage + m_hBodiesHash = new unsigned int[m_maxHandles * 2]; + memset(m_hBodiesHash, 0x00, m_maxHandles*2*sizeof(unsigned int)); + + m_hCellStart = new unsigned int[m_params.m_numCells]; + memset(m_hCellStart, 0x00, m_params.m_numCells * sizeof(unsigned int)); + + m_hPairBuffStartCurr = new unsigned int[m_maxHandles * 2 + 2]; + // --------------- for now, init with m_maxPairsPerBody for each body + m_hPairBuffStartCurr[0] = 0; + m_hPairBuffStartCurr[1] = 0; + for(int i = 1; i <= m_maxHandles; i++) + { + m_hPairBuffStartCurr[i * 2] = m_hPairBuffStartCurr[(i-1) * 2] + m_maxPairsPerBody; + m_hPairBuffStartCurr[i * 2 + 1] = 0; + } + //---------------- + unsigned int numAABB = m_maxHandles + m_maxLargeHandles; + m_hAABB = new btCuda3F1U[numAABB * 2]; // AABB Min & Max + + m_hPairBuff = new unsigned int[m_maxHandles * m_maxPairsPerBody]; + memset(m_hPairBuff, 0x00, m_maxHandles * m_maxPairsPerBody * sizeof(unsigned int)); // needed? + + m_hPairScan = new unsigned int[m_maxHandles + 1]; + + m_hPairOut = new unsigned int[m_maxHandles * m_maxPairsPerBody]; + +// large proxies + + // allocate handles buffer and put all handles on free list + m_pLargeHandlesRawPtr = btAlignedAlloc(sizeof(btSimpleBroadphaseProxy) * m_maxLargeHandles, 16); + m_pLargeHandles = new(m_pLargeHandlesRawPtr) btSimpleBroadphaseProxy[m_maxLargeHandles]; + m_firstFreeLargeHandle = 0; + { + for (int i = m_firstFreeLargeHandle; i < m_maxLargeHandles; i++) + { + m_pLargeHandles[i].SetNextFree(i + 1); + m_pLargeHandles[i].m_uniqueId = m_maxHandles+2+i; + } + m_pLargeHandles[m_maxLargeHandles - 1].SetNextFree(0); + } + +// debug data + m_numPairsAdded = 0; + m_numOverflows = 0; + + m_bInitialized = true; +} // bt3DGridBroadphase::_initialize() + +//-------------------------------------------------------------------------- + +void bt3DGridBroadphase::_finalize() +{ + assert(m_bInitialized); + delete [] m_hBodiesHash; + delete [] m_hCellStart; + delete [] m_hPairBuffStartCurr; + delete [] m_hAABB; + delete [] m_hPairBuff; + delete [] m_hPairScan; + delete [] m_hPairOut; + btAlignedFree(m_pLargeHandlesRawPtr); + m_bInitialized = false; +} // bt3DGridBroadphase::_finalize() + +//-------------------------------------------------------------------------- + +void bt3DGridBroadphase::calculateOverlappingPairs(btDispatcher* dispatcher) +{ + if(m_numHandles <= 0) + { + BT_PROFILE("addLarge2LargePairsToCache"); + addLarge2LargePairsToCache(dispatcher); + return; + } + // update constants + setParameters(&m_params); + // prepare AABB array + prepareAABB(); + // calculate hash + calcHashAABB(); + // sort bodies based on hash + sortHash(); + // find start of each cell + findCellStart(); + // findOverlappingPairs (small/small) + findOverlappingPairs(); + // findOverlappingPairs (small/large) + findPairsLarge(); + // add pairs to CPU cache + computePairCacheChanges(); + scanOverlappingPairBuff(); + squeezeOverlappingPairBuff(); + addPairsToCache(dispatcher); + // find and add large/large pairs to CPU cache + addLarge2LargePairsToCache(dispatcher); + return; +} // bt3DGridBroadphase::calculateOverlappingPairs() + +//-------------------------------------------------------------------------- + +void bt3DGridBroadphase::addPairsToCache(btDispatcher* dispatcher) +{ + m_numPairsAdded = 0; + m_numPairsRemoved = 0; + for(int i = 0; i < m_numHandles; i++) + { + unsigned int num = m_hPairScan[i+1] - m_hPairScan[i]; + if(!num) + { + continue; + } + unsigned int* pInp = m_hPairOut + m_hPairScan[i]; + unsigned int index0 = m_hAABB[i * 2].uw; + btSimpleBroadphaseProxy* proxy0 = &m_pHandles[index0]; + for(unsigned int j = 0; j < num; j++) + { + unsigned int indx1_s = pInp[j]; + unsigned int index1 = indx1_s & (~BT_CUDA_PAIR_ANY_FLG); + btSimpleBroadphaseProxy* proxy1; + if(index1 < (unsigned int)m_maxHandles) + { + proxy1 = &m_pHandles[index1]; + } + else + { + index1 -= m_maxHandles; + btAssert((index1 >= 0) && (index1 < (unsigned int)m_maxLargeHandles)); + proxy1 = &m_pLargeHandles[index1]; + } + if(indx1_s & BT_CUDA_PAIR_NEW_FLG) + { + m_pairCache->addOverlappingPair(proxy0,proxy1); + m_numPairsAdded++; + } + else + { + m_pairCache->removeOverlappingPair(proxy0,proxy1,dispatcher); + m_numPairsRemoved++; + } + } + } +} // bt3DGridBroadphase::addPairsToCache() + +//-------------------------------------------------------------------------- + +btBroadphaseProxy* bt3DGridBroadphase::createProxy( const btVector3& aabbMin, const btVector3& aabbMax,int shapeType,void* userPtr ,short int collisionFilterGroup,short int collisionFilterMask, btDispatcher* dispatcher,void* multiSapProxy) +{ + btBroadphaseProxy* proxy; + bool bIsLarge = isLargeProxy(aabbMin, aabbMax); + if(bIsLarge) + { + if (m_numLargeHandles >= m_maxLargeHandles) + { + btAssert(0); + return 0; //should never happen, but don't let the game crash ;-) + } + btAssert((aabbMin[0]<= aabbMax[0]) && (aabbMin[1]<= aabbMax[1]) && (aabbMin[2]<= aabbMax[2])); + int newHandleIndex = allocLargeHandle(); + proxy = new (&m_pLargeHandles[newHandleIndex])btSimpleBroadphaseProxy(aabbMin,aabbMax,shapeType,userPtr,collisionFilterGroup,collisionFilterMask,multiSapProxy); + } + else + { + proxy = btSimpleBroadphase::createProxy(aabbMin, aabbMax, shapeType, userPtr, collisionFilterGroup, collisionFilterMask, dispatcher, multiSapProxy); + } + return proxy; +} // bt3DGridBroadphase::createProxy() + +//-------------------------------------------------------------------------- + +void bt3DGridBroadphase::destroyProxy(btBroadphaseProxy* proxy, btDispatcher* dispatcher) +{ + bool bIsLarge = isLargeProxy(proxy); + if(bIsLarge) + { + + btSimpleBroadphaseProxy* proxy0 = static_cast(proxy); + freeLargeHandle(proxy0); + m_pairCache->removeOverlappingPairsContainingProxy(proxy,dispatcher); + } + else + { + btSimpleBroadphase::destroyProxy(proxy, dispatcher); + } + return; +} // bt3DGridBroadphase::destroyProxy() + +//-------------------------------------------------------------------------- + +bool bt3DGridBroadphase::isLargeProxy(const btVector3& aabbMin, const btVector3& aabbMax) +{ + btVector3 diag = aabbMax - aabbMin; + btScalar radius = diag.length() * btScalar(0.5f); + + radius *= m_cellFactorAABB; // user-defined factor + + return (radius > m_maxRadius); +} // bt3DGridBroadphase::isLargeProxy() + +//-------------------------------------------------------------------------- + +bool bt3DGridBroadphase::isLargeProxy(btBroadphaseProxy* proxy) +{ + return (proxy->getUid() >= (m_maxHandles+2)); +} // bt3DGridBroadphase::isLargeProxy() + +//-------------------------------------------------------------------------- + +void bt3DGridBroadphase::addLarge2LargePairsToCache(btDispatcher* dispatcher) +{ + int i,j; + if (m_numLargeHandles <= 0) + { + return; + } + int new_largest_index = -1; + for(i = 0; i <= m_LastLargeHandleIndex; i++) + { + btSimpleBroadphaseProxy* proxy0 = &m_pLargeHandles[i]; + if(!proxy0->m_clientObject) + { + continue; + } + new_largest_index = i; + for(j = i + 1; j <= m_LastLargeHandleIndex; j++) + { + btSimpleBroadphaseProxy* proxy1 = &m_pLargeHandles[j]; + if(!proxy1->m_clientObject) + { + continue; + } + btAssert(proxy0 != proxy1); + btSimpleBroadphaseProxy* p0 = getSimpleProxyFromProxy(proxy0); + btSimpleBroadphaseProxy* p1 = getSimpleProxyFromProxy(proxy1); + if(aabbOverlap(p0,p1)) + { + if (!m_pairCache->findPair(proxy0,proxy1)) + { + m_pairCache->addOverlappingPair(proxy0,proxy1); + } + } + else + { + if(m_pairCache->findPair(proxy0,proxy1)) + { + m_pairCache->removeOverlappingPair(proxy0,proxy1,dispatcher); + } + } + } + } + m_LastLargeHandleIndex = new_largest_index; + return; +} // bt3DGridBroadphase::addLarge2LargePairsToCache() + +//-------------------------------------------------------------------------- + +void bt3DGridBroadphase::rayTest(const btVector3& rayFrom,const btVector3& rayTo, btBroadphaseRayCallback& rayCallback) +{ + btSimpleBroadphase::rayTest(rayFrom, rayTo, rayCallback); + for (int i=0; i <= m_LastLargeHandleIndex; i++) + { + btSimpleBroadphaseProxy* proxy = &m_pLargeHandles[i]; + if(!proxy->m_clientObject) + { + continue; + } + rayCallback.process(proxy); + } +} // bt3DGridBroadphase::rayTest() + +//-------------------------------------------------------------------------- +//-------------------------------------------------------------------------- +// +// overrides for CPU version +// +//-------------------------------------------------------------------------- +//-------------------------------------------------------------------------- + +void bt3DGridBroadphase::prepareAABB() +{ + BT_PROFILE("prepareAABB"); + btCuda3F1U* pBB = m_hAABB; + int i; + int new_largest_index = -1; + unsigned int num_small = 0; + for(i = 0; i <= m_LastHandleIndex; i++) + { + btSimpleBroadphaseProxy* proxy0 = &m_pHandles[i]; + if(!proxy0->m_clientObject) + { + continue; + } + new_largest_index = i; + pBB->fx = proxy0->m_aabbMin.getX(); + pBB->fy = proxy0->m_aabbMin.getY(); + pBB->fz = proxy0->m_aabbMin.getZ(); + pBB->uw = i; + pBB++; + pBB->fx = proxy0->m_aabbMax.getX(); + pBB->fy = proxy0->m_aabbMax.getY(); + pBB->fz = proxy0->m_aabbMax.getZ(); + pBB->uw = num_small; + pBB++; + num_small++; + } + m_LastHandleIndex = new_largest_index; + new_largest_index = -1; + unsigned int num_large = 0; + for(i = 0; i <= m_LastLargeHandleIndex; i++) + { + btSimpleBroadphaseProxy* proxy0 = &m_pLargeHandles[i]; + if(!proxy0->m_clientObject) + { + continue; + } + new_largest_index = i; + pBB->fx = proxy0->m_aabbMin.getX(); + pBB->fy = proxy0->m_aabbMin.getY(); + pBB->fz = proxy0->m_aabbMin.getZ(); + pBB->uw = i + m_maxHandles; + pBB++; + pBB->fx = proxy0->m_aabbMax.getX(); + pBB->fy = proxy0->m_aabbMax.getY(); + pBB->fz = proxy0->m_aabbMax.getZ(); + pBB->uw = num_large + m_maxHandles; + pBB++; + num_large++; + } + m_LastLargeHandleIndex = new_largest_index; + // paranoid checks + btAssert(num_small == m_numHandles); + btAssert(num_large == m_numLargeHandles); + return; +} // bt3DGridBroadphase::prepareAABB() + +//-------------------------------------------------------------------------- + +void bt3DGridBroadphase::setParameters(btCudaBroadphaseParams* hostParams) +{ + s3DGridBroadphaseParams = *hostParams; + return; +} // bt3DGridBroadphase::setParameters() + +//-------------------------------------------------------------------------- + +void bt3DGridBroadphase::calcHashAABB() +{ + BT_PROFILE("bt3DGrid_calcHashAABB"); + bt3DGrid_calcHashAABB(m_hAABB, m_hBodiesHash, m_numHandles); + return; +} // bt3DGridBroadphase::calcHashAABB() + +//-------------------------------------------------------------------------- + +void bt3DGridBroadphase::sortHash() +{ + class bt3DGridHashKey + { + public: + unsigned int hash; + unsigned int index; + void quickSort(bt3DGridHashKey* pData, int lo, int hi) + { + int i=lo, j=hi; + bt3DGridHashKey x = pData[(lo+hi)/2]; + do + { + while(pData[i].hash > x.hash) i++; + while(x.hash > pData[j].hash) j--; + if(i <= j) + { + bt3DGridHashKey t = pData[i]; + pData[i] = pData[j]; + pData[j] = t; + i++; j--; + } + } while(i <= j); + if(lo < j) pData->quickSort(pData, lo, j); + if(i < hi) pData->quickSort(pData, i, hi); + } + }; + BT_PROFILE("bt3DGrid_sortHash"); + bt3DGridHashKey* pHash = (bt3DGridHashKey*)m_hBodiesHash; + pHash->quickSort(pHash, 0, m_numHandles - 1); + return; +} // bt3DGridBroadphase::sortHash() + +//-------------------------------------------------------------------------- + +void bt3DGridBroadphase::findCellStart() +{ + BT_PROFILE("bt3DGrid_findCellStart"); + bt3DGrid_findCellStart(m_hBodiesHash, m_hCellStart, m_numHandles, m_params.m_numCells); + return; +} // bt3DGridBroadphase::findCellStart() + +//-------------------------------------------------------------------------- + +void bt3DGridBroadphase::findOverlappingPairs() +{ + BT_PROFILE("bt3DGrid_findOverlappingPairs"); + bt3DGrid_findOverlappingPairs(m_hAABB, m_hBodiesHash, m_hCellStart, m_hPairBuff, m_hPairBuffStartCurr, m_numHandles); + return; +} // bt3DGridBroadphase::findOverlappingPairs() + +//-------------------------------------------------------------------------- + +void bt3DGridBroadphase::findPairsLarge() +{ + BT_PROFILE("bt3DGrid_findPairsLarge"); + bt3DGrid_findPairsLarge(m_hAABB, m_hBodiesHash, m_hCellStart, m_hPairBuff, m_hPairBuffStartCurr, m_numHandles, m_numLargeHandles); + return; +} // bt3DGridBroadphase::findPairsLarge() + +//-------------------------------------------------------------------------- + +void bt3DGridBroadphase::computePairCacheChanges() +{ + BT_PROFILE("bt3DGrid_computePairCacheChanges"); + bt3DGrid_computePairCacheChanges(m_hPairBuff, m_hPairBuffStartCurr, m_hPairScan, m_hAABB, m_numHandles); + return; +} // bt3DGridBroadphase::computePairCacheChanges() + +//-------------------------------------------------------------------------- + +void bt3DGridBroadphase::scanOverlappingPairBuff() +{ + BT_PROFILE("bt3DGrid_scanOverlappingPairBuff"); + m_hPairScan[0] = 0; + for(int i = 1; i <= m_numHandles; i++) + { + unsigned int delta = m_hPairScan[i]; + m_hPairScan[i] = m_hPairScan[i-1] + delta; + } + return; +} // bt3DGridBroadphase::scanOverlappingPairBuff() + +//-------------------------------------------------------------------------- + +void bt3DGridBroadphase::squeezeOverlappingPairBuff() +{ + BT_PROFILE("bt3DGrid_squeezeOverlappingPairBuff"); + bt3DGrid_squeezeOverlappingPairBuff(m_hPairBuff, m_hPairBuffStartCurr, m_hPairScan, m_hPairOut, m_hAABB, m_numHandles); + return; +} // bt3DGridBroadphase::squeezeOverlappingPairBuff() + +//-------------------------------------------------------------------------- + +typedef unsigned int uint; + +struct uint2 +{ + unsigned int x, y; +}; + +struct int3 +{ + int x, y, z; +}; + +struct uint3 +{ + unsigned int x, y, z; +}; + +struct float4 +{ + float x, y, z, w; +}; + + +#define BT3DGRID__device__ inline +#define BT3DGRIDmax(a, b) ((a) > (b) ? (a) : (b)) +#define BT3DGRIDmin(a, b) ((a) < (b) ? (a) : (b)) +#define BT3DGRIDparams s3DGridBroadphaseParams +#define BT3DGRID__mul24(a, b) ((a)*(b)) +#define BT3DGRID__global__ inline +#define BT3DGRID__shared__ static +#define BT3DGRID__syncthreads() + + +static inline uint2 bt3dGrid_make_uint2(unsigned int x, unsigned int y) +{ + uint2 t; t.x = x; t.y = y; return t; +} +#define BT3DGRIDmake_uint2(x, y) bt3dGrid_make_uint2(x, y) + +static inline int3 bt3dGrid_make_int3(int x, int y, int z) +{ + int3 t; t.x = x; t.y = y; t.z = z; return t; +} +inline int3 operator+(int3 a, int3 b) +{ + return bt3dGrid_make_int3(a.x + b.x, a.y + b.y, a.z + b.z); +} +#define BT3DGRIDmake_int3(x, y, z) bt3dGrid_make_int3(x, y, z) + +#define BT3DGRIDFETCH(a, b) a[b] +#define BT3DGRIDPREF(func) bt3DGrid_##func +#define MY_CUDA_SAFE_CALL(func) func +#define BT3DGPRDMemset memset + +static uint2 s_blockIdx, s_blockDim, s_threadIdx; +#define BT3DGRIDblockIdx s_blockIdx +#define BT3DGRIDblockDim s_blockDim +#define BT3DGRIDthreadIdx s_threadIdx +#define BT3DGRIDEXECKERNEL(numb, numt, kfunc, args) {s_blockDim.x=numt;for(int nb=0;nb= (int)numBodies) + { + return; + } + btCuda3F1U bbMin = pAABB[index*2]; + btCuda3F1U bbMax = pAABB[index*2 + 1]; + float4 pos; + pos.x = (bbMin.fx + bbMax.fx) * 0.5f; + pos.y = (bbMin.fy + bbMax.fy) * 0.5f; + pos.z = (bbMin.fz + bbMax.fz) * 0.5f; + // get address in grid + int3 gridPos = btCuda_calcGridPos(pos); + uint gridHash = btCuda_calcGridHash(gridPos); + // store grid hash and body index + pHash[index] = BT3DGRIDmake_uint2(gridHash, index); +} + +//---------------------------------------------------------------------------------------- + +BT3DGRID__global__ void findCellStartD(uint2* pHash, uint* cellStart, uint numBodies) +{ + int index = BT3DGRID__mul24(BT3DGRIDblockIdx.x, BT3DGRIDblockDim.x) + BT3DGRIDthreadIdx.x; + if(index >= (int)numBodies) + { + return; + } + uint2 sortedData = pHash[index]; + // Load hash data into shared memory so that we can look + // at neighboring body's hash value without loading + // two hash values per thread + BT3DGRID__shared__ uint sharedHash[257]; + sharedHash[BT3DGRIDthreadIdx.x+1] = sortedData.x; + if((index > 0) && (BT3DGRIDthreadIdx.x == 0)) + { + // first thread in block must load neighbor body hash + volatile uint2 prevData = pHash[index-1]; + sharedHash[0] = prevData.x; + } + BT3DGRID__syncthreads(); + if((index == 0) || (sortedData.x != sharedHash[BT3DGRIDthreadIdx.x])) + { + cellStart[sortedData.x] = index; + } +} + +//---------------------------------------------------------------------------------------- + +BT3DGRID__device__ uint cudaTestAABBOverlap(btCuda3F1U min0, btCuda3F1U max0, btCuda3F1U min1, btCuda3F1U max1) +{ + return (min0.fx <= max1.fx)&& (min1.fx <= max0.fx) && + (min0.fy <= max1.fy)&& (min1.fy <= max0.fy) && + (min0.fz <= max1.fz)&& (min1.fz <= max0.fz); +} + +//---------------------------------------------------------------------------------------- + +BT3DGRID__device__ void findPairsInCell(int3 gridPos, + uint index, + uint2* pHash, + uint* pCellStart, + btCuda3F1U* pAABB, + uint* pPairBuff, + uint2* pPairBuffStartCurr, + uint numBodies) +{ + if ( (gridPos.x < 0) || (gridPos.x > (int)BT3DGRIDparams.m_gridSizeX - 1) + || (gridPos.y < 0) || (gridPos.y > (int)BT3DGRIDparams.m_gridSizeY - 1) + || (gridPos.z < 0) || (gridPos.z > (int)BT3DGRIDparams.m_gridSizeZ - 1)) + { + return; + } + uint gridHash = btCuda_calcGridHash(gridPos); + // get start of bucket for this cell + uint bucketStart = pCellStart[gridHash]; + if (bucketStart == 0xffffffff) + { + return; // cell empty + } + // iterate over bodies in this cell + uint2 sortedData = pHash[index]; + uint unsorted_indx = sortedData.y; + btCuda3F1U min0 = BT3DGRIDFETCH(pAABB, unsorted_indx*2); + btCuda3F1U max0 = BT3DGRIDFETCH(pAABB, unsorted_indx*2 + 1); + uint handleIndex = min0.uw; + uint2 start_curr = pPairBuffStartCurr[handleIndex]; + uint start = start_curr.x; + uint curr = start_curr.y; + uint2 start_curr_next = pPairBuffStartCurr[handleIndex+1]; + uint curr_max = start_curr_next.x - start - 1; + uint bucketEnd = bucketStart + BT3DGRIDparams.m_maxBodiesPerCell; + bucketEnd = (bucketEnd > numBodies) ? numBodies : bucketEnd; + for(uint index2 = bucketStart; index2 < bucketEnd; index2++) + { + uint2 cellData = pHash[index2]; + if (cellData.x != gridHash) + { + break; // no longer in same bucket + } + uint unsorted_indx2 = cellData.y; + if (unsorted_indx2 < unsorted_indx) // check not colliding with self + { + btCuda3F1U min1 = BT3DGRIDFETCH(pAABB, unsorted_indx2*2); + btCuda3F1U max1 = BT3DGRIDFETCH(pAABB, unsorted_indx2*2 + 1); + if(cudaTestAABBOverlap(min0, max0, min1, max1)) + { + uint handleIndex2 = min1.uw; + uint k; + for(k = 0; k < curr; k++) + { + uint old_pair = pPairBuff[start+k] & (~BT_CUDA_PAIR_ANY_FLG); + if(old_pair == handleIndex2) + { + pPairBuff[start+k] |= BT_CUDA_PAIR_FOUND_FLG; + break; + } + } + if(k == curr) + { + pPairBuff[start+curr] = handleIndex2 | BT_CUDA_PAIR_NEW_FLG; + if(curr >= curr_max) + { // not a good solution, but let's avoid crash + break; + } + curr++; + } + } + } + } + pPairBuffStartCurr[handleIndex] = BT3DGRIDmake_uint2(start, curr); + return; +} + +//---------------------------------------------------------------------------------------- + +BT3DGRID__global__ void +findOverlappingPairsD( btCuda3F1U* pAABB, uint2* pHash, uint* pCellStart, uint* pPairBuff, + uint2* pPairBuffStartCurr, uint numBodies) +{ + int index = BT3DGRID__mul24(BT3DGRIDblockIdx.x, BT3DGRIDblockDim.x) + BT3DGRIDthreadIdx.x; + if(index >= (int)numBodies) + { + return; + } + uint2 sortedData = pHash[index]; + uint unsorted_indx = sortedData.y; + btCuda3F1U bbMin = BT3DGRIDFETCH(pAABB, unsorted_indx*2); + btCuda3F1U bbMax = BT3DGRIDFETCH(pAABB, unsorted_indx*2 + 1); + float4 pos; + pos.x = (bbMin.fx + bbMax.fx) * 0.5f; + pos.y = (bbMin.fy + bbMax.fy) * 0.5f; + pos.z = (bbMin.fz + bbMax.fz) * 0.5f; + // get address in grid + int3 gridPos = btCuda_calcGridPos(pos); + // examine only neighbouring cells + for(int z=-1; z<=1; z++) { + for(int y=-1; y<=1; y++) { + for(int x=-1; x<=1; x++) { + findPairsInCell(gridPos + BT3DGRIDmake_int3(x, y, z), index, pHash, pCellStart, pAABB, pPairBuff, pPairBuffStartCurr, numBodies); + } + } + } +} + +//---------------------------------------------------------------------------------------- + +BT3DGRID__global__ void +findPairsLargeD( btCuda3F1U* pAABB, uint2* pHash, uint* pCellStart, uint* pPairBuff, + uint2* pPairBuffStartCurr, uint numBodies, uint numLarge) +{ + int index = BT3DGRID__mul24(BT3DGRIDblockIdx.x, BT3DGRIDblockDim.x) + BT3DGRIDthreadIdx.x; + if(index >= (int)numBodies) + { + return; + } + uint2 sortedData = pHash[index]; + uint unsorted_indx = sortedData.y; + btCuda3F1U min0 = BT3DGRIDFETCH(pAABB, unsorted_indx*2); + btCuda3F1U max0 = BT3DGRIDFETCH(pAABB, unsorted_indx*2 + 1); + uint handleIndex = min0.uw; + uint2 start_curr = pPairBuffStartCurr[handleIndex]; + uint start = start_curr.x; + uint curr = start_curr.y; + uint2 start_curr_next = pPairBuffStartCurr[handleIndex+1]; + uint curr_max = start_curr_next.x - start - 1; + for(uint i = 0; i < numLarge; i++) + { + uint indx2 = numBodies + i; + btCuda3F1U min1 = BT3DGRIDFETCH(pAABB, indx2*2); + btCuda3F1U max1 = BT3DGRIDFETCH(pAABB, indx2*2 + 1); + if(cudaTestAABBOverlap(min0, max0, min1, max1)) + { + uint k; + uint handleIndex2 = min1.uw; + for(k = 0; k < curr; k++) + { + uint old_pair = pPairBuff[start+k] & (~BT_CUDA_PAIR_ANY_FLG); + if(old_pair == handleIndex2) + { + pPairBuff[start+k] |= BT_CUDA_PAIR_FOUND_FLG; + break; + } + } + if(k == curr) + { + pPairBuff[start+curr] = handleIndex2 | BT_CUDA_PAIR_NEW_FLG; + if(curr >= curr_max) + { // not a good solution, but let's avoid crash + break; + } + curr++; + } + } + } + pPairBuffStartCurr[handleIndex] = BT3DGRIDmake_uint2(start, curr); + return; +} + +//---------------------------------------------------------------------------------------- + +BT3DGRID__global__ void computePairCacheChangesD(uint* pPairBuff, uint2* pPairBuffStartCurr, uint* pPairScan, btCuda3F1U* pAABB, uint numBodies) +{ + int index = BT3DGRID__mul24(BT3DGRIDblockIdx.x, BT3DGRIDblockDim.x) + BT3DGRIDthreadIdx.x; + if(index >= (int)numBodies) + { + return; + } + btCuda3F1U bbMin = pAABB[index * 2]; + uint handleIndex = bbMin.uw; + uint2 start_curr = pPairBuffStartCurr[handleIndex]; + uint start = start_curr.x; + uint curr = start_curr.y; + uint *pInp = pPairBuff + start; + uint num_changes = 0; + for(uint k = 0; k < curr; k++, pInp++) + { + if(!((*pInp) & BT_CUDA_PAIR_FOUND_FLG)) + { + num_changes++; + } + } + pPairScan[index+1] = num_changes; +} + +//---------------------------------------------------------------------------------------- + +BT3DGRID__global__ void squeezeOverlappingPairBuffD(uint* pPairBuff, uint2* pPairBuffStartCurr, uint* pPairScan, uint* pPairOut, btCuda3F1U* pAABB, uint numBodies) +{ + int index = BT3DGRID__mul24(BT3DGRIDblockIdx.x, BT3DGRIDblockDim.x) + BT3DGRIDthreadIdx.x; + if(index >= (int)numBodies) + { + return; + } + btCuda3F1U bbMin = pAABB[index * 2]; + uint handleIndex = bbMin.uw; + uint2 start_curr = pPairBuffStartCurr[handleIndex]; + uint start = start_curr.x; + uint curr = start_curr.y; + uint* pInp = pPairBuff + start; + uint* pOut = pPairOut + pPairScan[index]; + uint* pOut2 = pInp; + uint num = 0; + for(uint k = 0; k < curr; k++, pInp++) + { + if(!((*pInp) & BT_CUDA_PAIR_FOUND_FLG)) + { + *pOut = *pInp; + pOut++; + } + if((*pInp) & BT_CUDA_PAIR_ANY_FLG) + { + *pOut2 = (*pInp) & (~BT_CUDA_PAIR_ANY_FLG); + pOut2++; + num++; + } + } + pPairBuffStartCurr[handleIndex] = BT3DGRIDmake_uint2(start, num); +} // squeezeOverlappingPairBuffD() + + +//---------------------------------------------------------------------------------------- +//---------------------------------------------------------------------------------------- +//---------------------------------------------------------------------------------------- +//---------------------------------------------------------------------------------------- +// E N D O F K E R N E L F U N C T I O N S +//---------------------------------------------------------------------------------------- +//---------------------------------------------------------------------------------------- +//---------------------------------------------------------------------------------------- +//---------------------------------------------------------------------------------------- + +extern "C" +{ + +//Round a / b to nearest higher integer value +int BT3DGRIDPREF(iDivUp)(int a, int b) +{ + return (a % b != 0) ? (a / b + 1) : (a / b); +} + +// compute grid and thread block size for a given number of elements +void BT3DGRIDPREF(computeGridSize)(int n, int blockSize, int &numBlocks, int &numThreads) +{ + numThreads = BT3DGRIDmin(blockSize, n); + numBlocks = BT3DGRIDPREF(iDivUp)(n, numThreads); +} + +void BT3DGRIDPREF(calcHashAABB)(btCuda3F1U* pAABB, unsigned int* hash, unsigned int numBodies) +{ + int numThreads, numBlocks; + BT3DGRIDPREF(computeGridSize)(numBodies, 256, numBlocks, numThreads); + // execute the kernel + BT3DGRIDEXECKERNEL(numBlocks, numThreads, calcHashAABBD, (pAABB, (uint2*)hash, numBodies)); + // check if kernel invocation generated an error + CUT_CHECK_ERROR("calcHashAABBD kernel execution failed"); +} + +void BT3DGRIDPREF(findCellStart(unsigned int* hash, unsigned int* cellStart, unsigned int numBodies, unsigned int numCells)) +{ + int numThreads, numBlocks; + BT3DGRIDPREF(computeGridSize)(numBodies, 256, numBlocks, numThreads); + MY_CUDA_SAFE_CALL(BT3DGPRDMemset(cellStart, 0xffffffff, numCells*sizeof(uint))); + BT3DGRIDEXECKERNEL(numBlocks, numThreads, findCellStartD, ((uint2*)hash, (uint*)cellStart, numBodies)); + CUT_CHECK_ERROR("Kernel execution failed: findCellStartD"); +} + +void BT3DGRIDPREF(findOverlappingPairs(btCuda3F1U* pAABB, unsigned int* pHash, unsigned int* pCellStart, unsigned int* pPairBuff, unsigned int* pPairBuffStartCurr, unsigned int numBodies)) +{ +#if B_CUDA_USE_TEX + MY_CUDA_SAFE_CALL(cudaBindTexture(0, pAABBTex, pAABB, numBodies * 2 * sizeof(btCuda3F1U))); +#endif + int numThreads, numBlocks; + BT3DGRIDPREF(computeGridSize)(numBodies, 64, numBlocks, numThreads); + BT3DGRIDEXECKERNEL(numBlocks, numThreads, findOverlappingPairsD, (pAABB,(uint2*)pHash,(uint*)pCellStart,(uint*)pPairBuff,(uint2*)pPairBuffStartCurr,numBodies)); + CUT_CHECK_ERROR("Kernel execution failed: bt_CudaFindOverlappingPairsD"); +#if B_CUDA_USE_TEX + MY_CUDA_SAFE_CALL(cudaUnbindTexture(pAABBTex)); +#endif + } + + + +void BT3DGRIDPREF(findPairsLarge(btCuda3F1U* pAABB, unsigned int* pHash, unsigned int* pCellStart, unsigned int* pPairBuff, unsigned int* pPairBuffStartCurr, unsigned int numBodies, unsigned int numLarge)) +{ +#if B_CUDA_USE_TEX + MY_CUDA_SAFE_CALL(cudaBindTexture(0, pAABBTex, pAABB, (numBodies+numLarge) * 2 * sizeof(btCuda3F1U))); +#endif + int numThreads, numBlocks; + BT3DGRIDPREF(computeGridSize)(numBodies, 64, numBlocks, numThreads); + BT3DGRIDEXECKERNEL(numBlocks, numThreads, findPairsLargeD, (pAABB,(uint2*)pHash,(uint*)pCellStart,(uint*)pPairBuff,(uint2*)pPairBuffStartCurr,numBodies,numLarge)); + CUT_CHECK_ERROR("Kernel execution failed: btCuda_findPairsLargeD"); +#if B_CUDA_USE_TEX + MY_CUDA_SAFE_CALL(cudaUnbindTexture(pAABBTex)); +#endif + } + + +void BT3DGRIDPREF(computePairCacheChanges(unsigned int* pPairBuff, unsigned int* pPairBuffStartCurr, unsigned int* pPairScan, btCuda3F1U* pAABB, unsigned int numBodies)) +{ + int numThreads, numBlocks; + BT3DGRIDPREF(computeGridSize)(numBodies, 256, numBlocks, numThreads); + BT3DGRIDEXECKERNEL(numBlocks, numThreads, computePairCacheChangesD, ((uint*)pPairBuff,(uint2*)pPairBuffStartCurr,(uint*)pPairScan,pAABB,numBodies)); + CUT_CHECK_ERROR("Kernel execution failed: btCudaComputePairCacheChangesD"); + } + + +void BT3DGRIDPREF(squeezeOverlappingPairBuff(unsigned int* pPairBuff, unsigned int* pPairBuffStartCurr, unsigned int* pPairScan, unsigned int* pPairOut, btCuda3F1U* pAABB, unsigned int numBodies)) +{ + int numThreads, numBlocks; + BT3DGRIDPREF(computeGridSize)(numBodies, 256, numBlocks, numThreads); + BT3DGRIDEXECKERNEL(numBlocks, numThreads, squeezeOverlappingPairBuffD, ((uint*)pPairBuff,(uint2*)pPairBuffStartCurr,(uint*)pPairScan,(uint*)pPairOut,pAABB,numBodies)); + CUT_CHECK_ERROR("Kernel execution failed: btCudaSqueezeOverlappingPairBuffD"); +} // btCuda_squeezeOverlappingPairBuff() + + +} // extern "C" diff --git a/BulletPhysics/bulletTrunk/Extras/CUDA/btCudaBroadphase.cpp b/BulletPhysics/bulletTrunk/Extras/CUDA/btCudaBroadphase.cpp new file mode 100644 index 00000000..f50afe24 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CUDA/btCudaBroadphase.cpp @@ -0,0 +1,201 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2008 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +//-------------------------------------------------------------------------- + +#include "LinearMath/btAlignedAllocator.h" +#include "LinearMath/btQuickprof.h" +#include "BulletCollision/BroadphaseCollision/btOverlappingPairCache.h" +#include "btCudaBroadphaseKernel.h" +#include "btCudaBroadphase.h" +#include "radixsort.cuh" +//#include "vector_functions.h" + +//-------------------------------------------------------------------------- + +#include + +//-------------------------------------------------------------------------- + +btCudaBroadphase::btCudaBroadphase(const btVector3& worldAabbMin,const btVector3& worldAabbMax, + int gridSizeX, int gridSizeY, int gridSizeZ, + int maxSmallProxies, int maxLargeProxies, int maxPairsPerBody, + int maxBodiesPerCell, + btScalar cellFactorAABB) : + bt3DGridBroadphase(worldAabbMin, worldAabbMax, gridSizeX, gridSizeY, gridSizeZ, maxSmallProxies, maxLargeProxies, maxPairsPerBody, maxBodiesPerCell,cellFactorAABB) +{ + _initialize(); +} // btCudaBroadphase::btCudaBroadphase() + +//-------------------------------------------------------------------------- + +btCudaBroadphase::~btCudaBroadphase() +{ + //btSimpleBroadphase will free memory of btSortedOverlappingPairCache, because m_ownsPairCache + assert(m_bInitialized); + _finalize(); +} // btCudaBroadphase::~btCudaBroadphase() + +//-------------------------------------------------------------------------- + +void btCudaBroadphase::_initialize() +{ + // allocate GPU data + btCuda_allocateArray((void**)&m_dBodiesHash[0], m_maxHandles * 2 * sizeof(unsigned int)); + btCuda_allocateArray((void**)&m_dBodiesHash[1], m_maxHandles * 2 * sizeof(unsigned int)); + + btCuda_allocateArray((void**)&m_dCellStart, m_params.m_numCells * sizeof(unsigned int)); + + btCuda_allocateArray((void**)&m_dPairBuff, m_maxHandles * m_maxPairsPerBody * sizeof(unsigned int)); + btCuda_copyArrayToDevice(m_dPairBuff, m_hPairBuff, m_maxHandles * m_maxPairsPerBody * sizeof(unsigned int)); // needed? + + btCuda_allocateArray((void**)&m_dPairBuffStartCurr, (m_maxHandles * 2 + 1) * sizeof(unsigned int)); + btCuda_copyArrayToDevice(m_dPairBuffStartCurr, m_hPairBuffStartCurr, (m_maxHandles * 2 + 1) * sizeof(unsigned int)); + + unsigned int numAABB = m_maxHandles + m_maxLargeHandles; + btCuda_allocateArray((void**)&m_dAABB, numAABB * sizeof(btCuda3F1U) * 2); + + btCuda_allocateArray((void**)&m_dPairScan, (m_maxHandles + 1) * sizeof(unsigned int)); + + btCuda_allocateArray((void**)&m_dPairOut, m_maxHandles * m_maxPairsPerBody * sizeof(unsigned int)); +} // btCudaBroadphase::_initialize() + +//-------------------------------------------------------------------------- + +void btCudaBroadphase::_finalize() +{ + assert(m_bInitialized); + delete [] m_hBodiesHash; + delete [] m_hCellStart; + delete [] m_hPairBuffStartCurr; + delete [] m_hAABB; + delete [] m_hPairBuff; + delete [] m_hPairScan; + delete [] m_hPairOut; + btCuda_freeArray(m_dBodiesHash[0]); + btCuda_freeArray(m_dBodiesHash[1]); + btCuda_freeArray(m_dCellStart); + btCuda_freeArray(m_dPairBuffStartCurr); + btCuda_freeArray(m_dAABB); + btCuda_freeArray(m_dPairBuff); + btCuda_freeArray(m_dPairScan); + btCuda_freeArray(m_dPairOut); + + btAlignedFree(m_pLargeHandlesRawPtr); + + m_bInitialized = false; +} // btCudaBroadphase::_finalize() + +//-------------------------------------------------------------------------- +//-------------------------------------------------------------------------- +// +// overrides for CUDA version +// +//-------------------------------------------------------------------------- +//-------------------------------------------------------------------------- + +void btCudaBroadphase::prepareAABB() +{ + bt3DGridBroadphase::prepareAABB(); + btCuda_copyArrayToDevice(m_dAABB, m_hAABB, sizeof(btCuda3F1U) * 2 * (m_numHandles + m_numLargeHandles)); + return; +} // btCudaBroadphase::prepareAABB() + +//-------------------------------------------------------------------------- + +void btCudaBroadphase::setParameters(btCudaBroadphaseParams* hostParams) +{ + btCuda_setParameters(hostParams); + return; +} // btCudaBroadphase::setParameters() + +//-------------------------------------------------------------------------- + +void btCudaBroadphase::calcHashAABB() +{ + BT_PROFILE("btCuda_calcHashAABB"); + btCuda_calcHashAABB(m_dAABB, m_dBodiesHash[0], m_numHandles); +// btCuda_copyArrayFromDevice((void*)m_hBodiesHash, (void*)m_dBodiesHash[0], sizeof(unsigned int) * 2 * m_numHandles); + return; +} // btCudaBroadphase::calcHashAABB() + +//-------------------------------------------------------------------------- + +void btCudaBroadphase::sortHash() +{ + BT_PROFILE("RadixSort-- CUDA"); + RadixSort((KeyValuePair*)m_dBodiesHash[0], (KeyValuePair*)m_dBodiesHash[1], m_numHandles, 32); + return; +} // btCudaBroadphase::sortHash() + +//-------------------------------------------------------------------------- + +void btCudaBroadphase::findCellStart() +{ + BT_PROFILE("btCuda_findCellStart"); + btCuda_findCellStart(m_dBodiesHash[0], m_dCellStart, m_numHandles, m_params.m_numCells); +// btCuda_copyArrayFromDevice((void*)m_hBodiesHash, (void*)m_dBodiesHash[0], sizeof(unsigned int) * 2 * m_numHandles); +// btCuda_copyArrayFromDevice((void*)m_hCellStart, (void*)m_dCellStart, sizeof(unsigned int) * m_params.m_numCells); + return; +} // btCudaBroadphase::findCellStart() + +//-------------------------------------------------------------------------- + +void btCudaBroadphase::findOverlappingPairs() +{ + BT_PROFILE("btCuda_findOverlappingPairs"); + btCuda_findOverlappingPairs(m_dAABB, m_dBodiesHash[0], m_dCellStart, m_dPairBuff, m_dPairBuffStartCurr, m_numHandles); + return; +} // btCudaBroadphase::findOverlappingPairs() + +//-------------------------------------------------------------------------- + +void btCudaBroadphase::findPairsLarge() +{ + BT_PROFILE("btCuda_findPairsLarge"); + btCuda_findPairsLarge(m_dAABB, m_dBodiesHash[0], m_dCellStart, m_dPairBuff, m_dPairBuffStartCurr, m_numHandles, m_numLargeHandles); + return; +} // btCudaBroadphase::findPairsLarge() + +//-------------------------------------------------------------------------- + +void btCudaBroadphase::computePairCacheChanges() +{ + BT_PROFILE("btCuda_computePairCacheChanges"); + btCuda_computePairCacheChanges(m_dPairBuff, m_dPairBuffStartCurr, m_dPairScan, m_dAABB, m_numHandles); + return; +} // btCudaBroadphase::computePairCacheChanges() + +//-------------------------------------------------------------------------- + +void btCudaBroadphase::scanOverlappingPairBuff() +{ + btCuda_copyArrayFromDevice(m_hPairScan, m_dPairScan, sizeof(unsigned int)*(m_numHandles + 1)); + bt3DGridBroadphase::scanOverlappingPairBuff(); + btCuda_copyArrayToDevice(m_dPairScan, m_hPairScan, sizeof(unsigned int)*(m_numHandles + 1)); + return; +} // btCudaBroadphase::scanOverlappingPairBuff() + +//-------------------------------------------------------------------------- + +void btCudaBroadphase::squeezeOverlappingPairBuff() +{ + BT_PROFILE("btCuda_squeezeOverlappingPairBuff"); + btCuda_squeezeOverlappingPairBuff(m_dPairBuff, m_dPairBuffStartCurr, m_dPairScan, m_dPairOut, m_dAABB, m_numHandles); + btCuda_copyArrayFromDevice(m_hPairOut, m_dPairOut, sizeof(unsigned int) * m_hPairScan[m_numHandles]); + return; +} // btCudaBroadphase::squeezeOverlappingPairBuff() + +//-------------------------------------------------------------------------- diff --git a/BulletPhysics/bulletTrunk/Extras/CUDA/btCudaBroadphase.cu b/BulletPhysics/bulletTrunk/Extras/CUDA/btCudaBroadphase.cu new file mode 100644 index 00000000..d81671b1 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CUDA/btCudaBroadphase.cu @@ -0,0 +1,173 @@ +/* + * Copyright 1993-2006 NVIDIA Corporation. All rights reserved. + * + * NOTICE TO USER: + * + * This source code is subject to NVIDIA ownership rights under U.S. and + * international Copyright laws. + * + * NVIDIA MAKES NO REPRESENTATION ABOUT THE SUITABILITY OF THIS SOURCE + * CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR + * IMPLIED WARRANTY OF ANY KIND. NVIDIA DISCLAIMS ALL WARRANTIES WITH + * REGARD TO THIS SOURCE CODE, INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE. + * IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL, + * OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS + * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE + * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE + * OR PERFORMANCE OF THIS SOURCE CODE. + * + * U.S. Government End Users. This source code is a "commercial item" as + * that term is defined at 48 C.F.R. 2.101 (OCT 1995), consisting of + * "commercial computer software" and "commercial computer software + * documentation" as such terms are used in 48 C.F.R. 12.212 (SEPT 1995) + * and is provided to the U.S. Government only as a commercial end item. + * Consistent with 48 C.F.R.12.212 and 48 C.F.R. 227.7202-1 through + * 227.7202-4 (JUNE 1995), all U.S. Government End Users acquire the + * source code with only those rights set forth herein. + */ + +#include +#include +#include + +#include "cutil_math.h" +#include "math_constants.h" + +#if defined(__APPLE__) || defined(MACOSX) +#include +#else +#include +#endif + +#include + +#include "btCudaBroadphaseKernel.h" +//#include "radixsort.cu" + + +//---------------------------------------------------------------------------------------- +//---------------------------------------------------------------------------------------- +//---------------------------------------------------------------------------------------- +//---------------------------------------------------------------------------------------- +// K E R N E L F U N C T I O N S +//---------------------------------------------------------------------------------------- +//---------------------------------------------------------------------------------------- +//---------------------------------------------------------------------------------------- +//---------------------------------------------------------------------------------------- + +#ifdef __DEVICE_EMULATION__ + #define B_CUDA_USE_TEX 0 +#else + #define B_CUDA_USE_TEX 1 +#endif + +__device__ inline btCuda3F1U tex_fetch3F1U(float4 a) { return *((btCuda3F1U*)(&a)); } + +#if B_CUDA_USE_TEX + #define BT3DGRIDFETCH(t, i) tex_fetch3F1U(tex1Dfetch(t##Tex, i)) +#else + #define BT3DGRIDFETCH(t, i) t[i] +#endif + +texture particleHashTex; +texture cellStartTex; +texture pAABBTex; + +//---------------------------------------------------------------------------------------- + +__constant__ btCudaBroadphaseParams params; + +//---------------------------------------------------------------------------------------- + +#define BT3DGRID__device__ __device__ +#define BT3DGRIDmax(a, b) max(a, b) +#define BT3DGRIDmin(a, b) min(a, b) +#define BT3DGRIDparams params +#define BT3DGRID__mul24(a, b) __mul24(a, b) +#define BT3DGRID__global__ __global__ +#define BT3DGRID__shared__ __shared__ +#define BT3DGRID__syncthreads() __syncthreads() +#define BT3DGRIDmake_uint2(x, y) make_uint2(x, y) +#define BT3DGRIDmake_int3(x, y, z) make_int3(x, y, z) +#define BT3DGRIDPREF(func) btCuda_##func +#define BT3DGPRDMemset cudaMemset +#define BT3DGRIDblockIdx blockIdx +#define BT3DGRIDblockDim blockDim +#define BT3DGRIDthreadIdx threadIdx +#define BT3DGRIDEXECKERNEL(numb, numt, kfunc, args) kfunc<<>>args + +//---------------------------------------------------------------------------------------- + +//! Check for CUDA error +# define CUT_CHECK_ERROR(errorMessage) do { \ + cudaError_t err = cudaGetLastError(); \ + if( cudaSuccess != err) { \ + fprintf(stderr, "Cuda error: %s in file '%s' in line %i : %s.\n", \ + errorMessage, __FILE__, __LINE__, cudaGetErrorString( err) );\ + btCuda_exit(EXIT_FAILURE); \ + } \ + err = cudaThreadSynchronize(); \ + if( cudaSuccess != err) { \ + fprintf(stderr, "Cuda error: %s in file '%s' in line %i : %s.\n", \ + errorMessage, __FILE__, __LINE__, cudaGetErrorString( err) );\ + btCuda_exit(EXIT_FAILURE); \ + } } while (0) + + +# define MY_CUDA_SAFE_CALL_NO_SYNC( call) do { \ + cudaError err = call; \ + if( cudaSuccess != err) { \ + fprintf(stderr, "Cuda error in file '%s' in line %i : %s.\n", \ + __FILE__, __LINE__, cudaGetErrorString( err) ); \ + btCuda_exit(EXIT_FAILURE); \ + } } while (0) + +# define MY_CUDA_SAFE_CALL( call) do { \ + MY_CUDA_SAFE_CALL_NO_SYNC(call); \ + cudaError err = cudaThreadSynchronize(); \ + if( cudaSuccess != err) { \ + fprintf(stderr, "Cuda errorSync in file '%s' in line %i : %s.\n", \ + __FILE__, __LINE__, cudaGetErrorString( err) ); \ + btCuda_exit(EXIT_FAILURE); \ + } } while (0) + +//---------------------------------------------------------------------------------------- + +void btCuda_exit(int val) +{ + exit(val); +} + +void btCuda_allocateArray(void** devPtr, unsigned int size) +{ + MY_CUDA_SAFE_CALL(cudaMalloc(devPtr, size)); +} + +void btCuda_freeArray(void* devPtr) +{ + MY_CUDA_SAFE_CALL(cudaFree(devPtr)); +} + +void btCuda_copyArrayFromDevice(void* host, const void* device, unsigned int size) +{ + MY_CUDA_SAFE_CALL(cudaMemcpy(host, device, size, cudaMemcpyDeviceToHost)); +} + +void btCuda_copyArrayToDevice(void* device, const void* host, unsigned int size) +{ + MY_CUDA_SAFE_CALL(cudaMemcpy((char*)device, host, size, cudaMemcpyHostToDevice)); +} + +void btCuda_setParameters(btCudaBroadphaseParams* hostParams) +{ + // copy parameters to constant memory + MY_CUDA_SAFE_CALL(cudaMemcpyToSymbol(params, hostParams, sizeof(btCudaBroadphaseParams))); +} + +//---------------------------------------------------------------------------------------- + +#include "bt3DGridBroadphaseFunc.h" + +//---------------------------------------------------------------------------------------- + diff --git a/BulletPhysics/bulletTrunk/Extras/CUDA/btCudaBroadphase.h b/BulletPhysics/bulletTrunk/Extras/CUDA/btCudaBroadphase.h new file mode 100644 index 00000000..b250c36a --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CUDA/btCudaBroadphase.h @@ -0,0 +1,152 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2008 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef CUDA_BROADPHASE_H +#define CUDA_BROADPHASE_H + +#include "BulletCollision/BroadphaseCollision/btSimpleBroadphase.h" + +#include "btCudaBroadphaseKernel.h" + + +///The bt3DGridBroadphase uses CUDA to compute overlapping pairs using a GPU. +class bt3DGridBroadphase : public btSimpleBroadphase +{ +protected: + bool m_bInitialized; + unsigned int m_numBodies; + unsigned int m_numCells; + unsigned int m_maxPairsPerBody; + btScalar m_cellFactorAABB; + unsigned int m_maxBodiesPerCell; + btCudaBroadphaseParams m_params; + btScalar m_maxRadius; + // CPU data + unsigned int* m_hBodiesHash; + unsigned int* m_hCellStart; + unsigned int* m_hPairBuffStartCurr; + btCuda3F1U* m_hAABB; + unsigned int* m_hPairBuff; + unsigned int* m_hPairScan; + unsigned int* m_hPairOut; +// large proxies + int m_numLargeHandles; + int m_maxLargeHandles; + int m_LastLargeHandleIndex; + btSimpleBroadphaseProxy* m_pLargeHandles; + void* m_pLargeHandlesRawPtr; + int m_firstFreeLargeHandle; + int allocLargeHandle() + { + btAssert(m_numLargeHandles < m_maxLargeHandles); + int freeLargeHandle = m_firstFreeLargeHandle; + m_firstFreeLargeHandle = m_pLargeHandles[freeLargeHandle].GetNextFree(); + m_numLargeHandles++; + if(freeLargeHandle > m_LastLargeHandleIndex) + { + m_LastLargeHandleIndex = freeLargeHandle; + } + return freeLargeHandle; + } + void freeLargeHandle(btSimpleBroadphaseProxy* proxy) + { + int handle = int(proxy - m_pLargeHandles); + btAssert((handle >= 0) && (handle < m_maxHandles)); + if(handle == m_LastLargeHandleIndex) + { + m_LastLargeHandleIndex--; + } + proxy->SetNextFree(m_firstFreeLargeHandle); + m_firstFreeLargeHandle = handle; + proxy->m_clientObject = 0; + m_numLargeHandles--; + } + bool isLargeProxy(const btVector3& aabbMin, const btVector3& aabbMax); + bool isLargeProxy(btBroadphaseProxy* proxy); +// debug + unsigned int m_numPairsAdded; + unsigned int m_numPairsRemoved; + unsigned int m_numOverflows; +// +public: + bt3DGridBroadphase(const btVector3& worldAabbMin,const btVector3& worldAabbMax, + int gridSizeX, int gridSizeY, int gridSizeZ, + int maxSmallProxies, int maxLargeProxies, int maxPairsPerBody, + int maxBodiesPerCell = 8, + btScalar cellFactorAABB = btScalar(1.0f)); + virtual ~bt3DGridBroadphase(); + virtual void calculateOverlappingPairs(btDispatcher* dispatcher); + + virtual btBroadphaseProxy* createProxy(const btVector3& aabbMin, const btVector3& aabbMax,int shapeType,void* userPtr ,short int collisionFilterGroup,short int collisionFilterMask, btDispatcher* dispatcher,void* multiSapProxy); + virtual void destroyProxy(btBroadphaseProxy* proxy,btDispatcher* dispatcher); + virtual void rayTest(const btVector3& rayFrom,const btVector3& rayTo, btBroadphaseRayCallback& rayCallback); +protected: + void _initialize(); + void _finalize(); + void addPairsToCache(btDispatcher* dispatcher); + void addLarge2LargePairsToCache(btDispatcher* dispatcher); + +// overrides for CPU version + virtual void setParameters(btCudaBroadphaseParams* hostParams); + virtual void prepareAABB(); + virtual void calcHashAABB(); + virtual void sortHash(); + virtual void findCellStart(); + virtual void findOverlappingPairs(); + virtual void findPairsLarge(); + virtual void computePairCacheChanges(); + virtual void scanOverlappingPairBuff(); + virtual void squeezeOverlappingPairBuff(); +}; + + + +///The btCudaBroadphase uses CUDA to compute overlapping pairs using a GPU. +class btCudaBroadphase : public bt3DGridBroadphase +{ +protected: + // GPU data + unsigned int* m_dBodiesHash[2]; + unsigned int* m_dCellStart; + unsigned int* m_dPairBuff; + unsigned int* m_dPairBuffStartCurr; + btCuda3F1U* m_dAABB; + unsigned int* m_dPairScan; + unsigned int* m_dPairOut; +public: + btCudaBroadphase(const btVector3& worldAabbMin,const btVector3& worldAabbMax, + int gridSizeX, int gridSizeY, int gridSizeZ, + int maxSmallProxies, int maxLargeProxies, int maxPairsPerBody, + int maxBodiesPerCell = 8, + btScalar cellFactorAABB = btScalar(1.0f)); + virtual ~btCudaBroadphase(); +protected: + void _initialize(); + void _finalize(); + void allocateArray(void** devPtr, unsigned int size); + void freeArray(void* devPtr); +// overrides for CUDA version + virtual void setParameters(btCudaBroadphaseParams* hostParams); + virtual void prepareAABB(); + virtual void calcHashAABB(); + virtual void sortHash(); + virtual void findCellStart(); + virtual void findOverlappingPairs(); + virtual void findPairsLarge(); + virtual void computePairCacheChanges(); + virtual void scanOverlappingPairBuff(); + virtual void squeezeOverlappingPairBuff(); +}; +#endif //CUDA_BROADPHASE_H \ No newline at end of file diff --git a/BulletPhysics/bulletTrunk/Extras/CUDA/btCudaBroadphaseKernel.h b/BulletPhysics/bulletTrunk/Extras/CUDA/btCudaBroadphaseKernel.h new file mode 100644 index 00000000..ac738dbb --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CUDA/btCudaBroadphaseKernel.h @@ -0,0 +1,105 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2008 Erwin Coumans http://continuousphysics.com/Bullet/ + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! +// Keep this file free from Bullet headers +// it is included into CUDA program +//!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!! + +#ifndef CUDA_BROADPHASE_KERNEL_H +#define CUDA_BROADPHASE_KERNEL_H + +#define CUDA_BROADPHASE_USE_CUDA 1 + +#define BT_CUDA_PAIR_FOUND_FLG (0x40000000) +#define BT_CUDA_PAIR_NEW_FLG (0x20000000) +#define BT_CUDA_PAIR_ANY_FLG (BT_CUDA_PAIR_FOUND_FLG | BT_CUDA_PAIR_NEW_FLG) + +struct btCudaBroadphaseParams +{ + unsigned int m_gridSizeX; + unsigned int m_gridSizeY; + unsigned int m_gridSizeZ; + unsigned int m_numCells; + float m_worldOriginX; + float m_worldOriginY; + float m_worldOriginZ; + float m_cellSizeX; + float m_cellSizeY; + float m_cellSizeZ; + unsigned int m_numBodies; + unsigned int m_maxBodiesPerCell; +}; + +struct btCuda3F1U +{ + float fx; + float fy; + float fz; + unsigned int uw; +}; + + +extern "C" +{ +// CPU functions + void bt3DGrid_setParameters(btCudaBroadphaseParams* hostParams); + void bt3DGrid_calcHashAABB(btCuda3F1U* pAABB, unsigned int* hash, unsigned int numBodies); + void bt3DGrid_findCellStart(unsigned int* hash, unsigned int* cellStart, unsigned int numBodies, unsigned int numCells); + void bt3DGrid_findOverlappingPairs( btCuda3F1U* pAABB, unsigned int* pHash, + unsigned int* pCellStart, + unsigned int* pPairBuff, + unsigned int* pPairBuffStartCurr, + unsigned int numBodies); + void bt3DGrid_findPairsLarge( btCuda3F1U* pAABB, unsigned int* pHash, + unsigned int* pCellStart, + unsigned int* pPairBuff, + unsigned int* pPairBuffStartCurr, + unsigned int numBodies, + unsigned int numLarge); + + void bt3DGrid_computePairCacheChanges( unsigned int* pPairBuff, unsigned int* pPairBuffStartCurr, + unsigned int* pPairScan, btCuda3F1U* pAABB, unsigned int numBodies); + void bt3DGrid_squeezeOverlappingPairBuff( unsigned int* pPairBuff, unsigned int* pPairBuffStartCurr, unsigned int* pPairScan, + unsigned int* pPairOut, btCuda3F1U* pAABB, unsigned int numBodies); + +// CUDA functions + void btCuda_allocateArray(void** devPtr, unsigned int size); + void btCuda_freeArray(void* devPtr); + void btCuda_copyArrayFromDevice(void* host, const void* device, unsigned int size); + void btCuda_copyArrayToDevice(void* device, const void* host, unsigned int size); + void btCuda_setParameters(btCudaBroadphaseParams* hostParams); + void btCuda_calcHashAABB(btCuda3F1U* pAABB, unsigned int* hash, unsigned int numBodies); + void btCuda_findCellStart(unsigned int* hash, unsigned int* cellStart, unsigned int numBodies, unsigned int numCells); + void btCuda_findOverlappingPairs( btCuda3F1U* pAABB, unsigned int* pHash, + unsigned int* pCellStart, + unsigned int* pPairBuff, + unsigned int* pPairBuffStartCurr, + unsigned int numBodies); + void btCuda_findPairsLarge( btCuda3F1U* pAABB, unsigned int* pHash, + unsigned int* pCellStart, + unsigned int* pPairBuff, + unsigned int* pPairBuffStartCurr, + unsigned int numBodies, + unsigned int numLarge); + + void btCuda_computePairCacheChanges(unsigned int* pPairBuff, unsigned int* pPairBuffStartCurr, + unsigned int* pPairScan, btCuda3F1U* pAABB, unsigned int numBodies); + void btCuda_squeezeOverlappingPairBuff( unsigned int* pPairBuff, unsigned int* pPairBuffStartCurr, unsigned int* pPairScan, + unsigned int* pPairOut, btCuda3F1U* pAABB, unsigned int numBodies); +} + + +#endif // CUDA_BROADPHASE_KERNEL_H \ No newline at end of file diff --git a/BulletPhysics/bulletTrunk/Extras/CUDA/cutil_gl_error.h b/BulletPhysics/bulletTrunk/Extras/CUDA/cutil_gl_error.h new file mode 100644 index 00000000..3d1a5adf --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CUDA/cutil_gl_error.h @@ -0,0 +1,86 @@ +/* +* Copyright 1993-2006 NVIDIA Corporation. All rights reserved. +* +* NOTICE TO USER: +* +* This source code is subject to NVIDIA ownership rights under U.S. and +* international Copyright laws. +* +* NVIDIA MAKES NO REPRESENTATION ABOUT THE SUITABILITY OF THIS SOURCE +* CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR +* IMPLIED WARRANTY OF ANY KIND. NVIDIA DISCLAIMS ALL WARRANTIES WITH +* REGARD TO THIS SOURCE CODE, INCLUDING ALL IMPLIED WARRANTIES OF +* MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE. +* IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL, +* OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS +* OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE +* OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE +* OR PERFORMANCE OF THIS SOURCE CODE. +* +* U.S. Government End Users. This source code is a "commercial item" as +* that term is defined at 48 C.F.R. 2.101 (OCT 1995), consisting of +* "commercial computer software" and "commercial computer software +* documentation" as such terms are used in 48 C.F.R. 12.212 (SEPT 1995) +* and is provided to the U.S. Government only as a commercial end item. +* Consistent with 48 C.F.R.12.212 and 48 C.F.R. 227.7202-1 through +* 227.7202-4 (JUNE 1995), all U.S. Government End Users acquire the +* source code with only those rights set forth herein. +*/ + +#ifndef CUTIL_GL_ERROR +#define CUTIL_GL_ERROR + +/* CUda UTility Library */ + +// includes, system +#ifdef _WIN32 +# define WINDOWS_LEAN_AND_MEAN +# include +# include +# undef min +# undef max +#endif + +// includes, graphics +#if defined (__APPLE__) || defined(MACOSX) +#include +#include +#else +#include +#include +#endif + +//////////////////////////////////////////////////////////////////////////// +//! Check for OpenGL error +//! @return CUTTrue if no GL error has been encountered, otherwise 0 +//! @param file __FILE__ macro +//! @param line __LINE__ macro +//! @note The GL error is listed on stderr +//! @note This function should be used via the CHECK_ERROR_GL() macro +//////////////////////////////////////////////////////////////////////////// +CUTBoolean CUTIL_API +cutCheckErrorGL( const char* file, const int line) +{ + CUTBoolean ret_val = CUTTrue; + + // check for error + GLenum gl_error = glGetError(); + if (gl_error != GL_NO_ERROR) + { + fprintf(stderr, "GL Error in file '%s' in line %d :\n", file, line); + fprintf(stderr, "%s\n", gluErrorString(gl_error)); + ret_val = CUTFalse; + } + return ret_val; +} + +#ifdef _DEBUG + +#define CUT_CHECK_ERROR_GL() \ + if( CUTFalse == cutCheckErrorGL( __FILE__, __LINE__)) { \ + exit(EXIT_FAILURE); \ + } + +#endif // _DEBUG + +#endif // CUTIL_GL_ERROR diff --git a/BulletPhysics/bulletTrunk/Extras/CUDA/cutil_math.h b/BulletPhysics/bulletTrunk/Extras/CUDA/cutil_math.h new file mode 100644 index 00000000..55d655d8 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CUDA/cutil_math.h @@ -0,0 +1,767 @@ + /* + * Copyright 1993-2007 NVIDIA Corporation. All rights reserved. + * + * NOTICE TO USER: + * + * This source code is subject to NVIDIA ownership rights under U.S. and + * international Copyright laws. Users and possessors of this source code + * are hereby granted a nonexclusive, royalty-free license to use this code + * in individual and commercial software. + * + * NVIDIA MAKES NO REPRESENTATION ABOUT THE SUITABILITY OF THIS SOURCE + * CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR + * IMPLIED WARRANTY OF ANY KIND. NVIDIA DISCLAIMS ALL WARRANTIES WITH + * REGARD TO THIS SOURCE CODE, INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE. + * IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL, + * OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS + * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE + * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE + * OR PERFORMANCE OF THIS SOURCE CODE. + * + * U.S. Government End Users. This source code is a "commercial item" as + * that term is defined at 48 C.F.R. 2.101 (OCT 1995), consisting of + * "commercial computer software" and "commercial computer software + * documentation" as such terms are used in 48 C.F.R. 12.212 (SEPT 1995) + * and is provided to the U.S. Government only as a commercial end item. + * Consistent with 48 C.F.R.12.212 and 48 C.F.R. 227.7202-1 through + * 227.7202-4 (JUNE 1995), all U.S. Government End Users acquire the + * source code with only those rights set forth herein. + * + * Any use of this source code in individual and commercial software must + * include, in the user documentation and internal comments to the code, + * the above Disclaimer and U.S. Government End Users Notice. + */ + +/* + This file implements common mathematical operations on vector types + (float3, float4 etc.) since these are not provided as standard by CUDA. + + The syntax is modelled on the Cg standard library. +*/ + +#ifndef CUTIL_MATH_H +#define CUTIL_MATH_H + +#include "cuda_runtime.h" + +//////////////////////////////////////////////////////////////////////////////// +typedef unsigned int uint; +typedef unsigned short ushort; + +#ifndef __CUDACC__ +#include + +inline float fminf(float a, float b) +{ + return a < b ? a : b; +} + +inline float fmaxf(float a, float b) +{ + return a < b ? a : b; +} + +inline int max(int a, int b) +{ + return a > b ? a : b; +} + +inline int min(int a, int b) +{ + return a < b ? a : b; +} +#endif + +// float functions +//////////////////////////////////////////////////////////////////////////////// + +// lerp +inline __device__ __host__ float lerp(float a, float b, float t) +{ + return a + t*(b-a); +} + +// clamp +inline __device__ __host__ float clamp(float f, float a, float b) +{ + return fmaxf(a, fminf(f, b)); +} + +// int2 functions +//////////////////////////////////////////////////////////////////////////////// + +// negate +inline __host__ __device__ int2 operator-(int2 &a) +{ + return make_int2(-a.x, -a.y); +} + +// addition +inline __host__ __device__ int2 operator+(int2 a, int2 b) +{ + return make_int2(a.x + b.x, a.y + b.y); +} +inline __host__ __device__ void operator+=(int2 &a, int2 b) +{ + a.x += b.x; a.y += b.y; +} + +// subtract +inline __host__ __device__ int2 operator-(int2 a, int2 b) +{ + return make_int2(a.x - b.x, a.y - b.y); +} +inline __host__ __device__ void operator-=(int2 &a, int2 b) +{ + a.x -= b.x; a.y -= b.y; +} + +// multiply +inline __host__ __device__ int2 operator*(int2 a, int2 b) +{ + return make_int2(a.x * b.x, a.y * b.y); +} +inline __host__ __device__ int2 operator*(int2 a, int s) +{ + return make_int2(a.x * s, a.y * s); +} +inline __host__ __device__ int2 operator*(int s, int2 a) +{ + return make_int2(a.x * s, a.y * s); +} +inline __host__ __device__ void operator*=(int2 &a, int s) +{ + a.x *= s; a.y *= s; +} + +// float2 functions +//////////////////////////////////////////////////////////////////////////////// + +// additional constructors +inline __host__ __device__ float2 make_float2(float s) +{ + return make_float2(s, s); +} +inline __host__ __device__ float2 make_float2(int2 a) +{ + return make_float2(float(a.x), float(a.y)); +} + +// negate +inline __host__ __device__ float2 operator-(float2 &a) +{ + return make_float2(-a.x, -a.y); +} + +// addition +inline __host__ __device__ float2 operator+(float2 a, float2 b) +{ + return make_float2(a.x + b.x, a.y + b.y); +} +inline __host__ __device__ void operator+=(float2 &a, float2 b) +{ + a.x += b.x; a.y += b.y; +} + +// subtract +inline __host__ __device__ float2 operator-(float2 a, float2 b) +{ + return make_float2(a.x - b.x, a.y - b.y); +} +inline __host__ __device__ void operator-=(float2 &a, float2 b) +{ + a.x -= b.x; a.y -= b.y; +} + +// multiply +inline __host__ __device__ float2 operator*(float2 a, float2 b) +{ + return make_float2(a.x * b.x, a.y * b.y); +} +inline __host__ __device__ float2 operator*(float2 a, float s) +{ + return make_float2(a.x * s, a.y * s); +} +inline __host__ __device__ float2 operator*(float s, float2 a) +{ + return make_float2(a.x * s, a.y * s); +} +inline __host__ __device__ void operator*=(float2 &a, float s) +{ + a.x *= s; a.y *= s; +} + +// divide +inline __host__ __device__ float2 operator/(float2 a, float2 b) +{ + return make_float2(a.x / b.x, a.y / b.y); +} +inline __host__ __device__ float2 operator/(float2 a, float s) +{ + float inv = 1.0f / s; + return a * inv; +} +inline __host__ __device__ float2 operator/(float s, float2 a) +{ + float inv = 1.0f / s; + return a * inv; +} +inline __host__ __device__ void operator/=(float2 &a, float s) +{ + float inv = 1.0f / s; + a *= inv; +} + +// lerp +inline __device__ __host__ float2 lerp(float2 a, float2 b, float t) +{ + return a + t*(b-a); +} + +// clamp +inline __device__ __host__ float2 clamp(float2 v, float a, float b) +{ + return make_float2(clamp(v.x, a, b), clamp(v.y, a, b)); +} + +inline __device__ __host__ float2 clamp(float2 v, float2 a, float2 b) +{ + return make_float2(clamp(v.x, a.x, b.x), clamp(v.y, a.y, b.y)); +} + +// dot product +inline __host__ __device__ float dot(float2 a, float2 b) +{ + return a.x * b.x + a.y * b.y; +} + +// length +inline __host__ __device__ float length(float2 v) +{ + return sqrtf(dot(v, v)); +} + +// normalize +inline __host__ __device__ float2 normalize(float2 v) +{ + float invLen = 1.0f / sqrtf(dot(v, v)); + return v * invLen; +} + +// floor +inline __host__ __device__ float2 floor(const float2 v) +{ + return make_float2(floor(v.x), floor(v.y)); +} + +// reflect +inline __host__ __device__ float2 reflect(float2 i, float2 n) +{ + return i - 2.0f * n * dot(n,i); +} + +// float3 functions +//////////////////////////////////////////////////////////////////////////////// + +// additional constructors +inline __host__ __device__ float3 make_float3(float s) +{ + return make_float3(s, s, s); +} +inline __host__ __device__ float3 make_float3(float2 a) +{ + return make_float3(a.x, a.y, 0.0f); +} +inline __host__ __device__ float3 make_float3(float2 a, float s) +{ + return make_float3(a.x, a.y, s); +} +inline __host__ __device__ float3 make_float3(float4 a) +{ + return make_float3(a.x, a.y, a.z); // discards w +} +inline __host__ __device__ float3 make_float3(int3 a) +{ + return make_float3(float(a.x), float(a.y), float(a.z)); +} + +// negate +inline __host__ __device__ float3 operator-(float3 &a) +{ + return make_float3(-a.x, -a.y, -a.z); +} + +// min +static __inline__ __host__ __device__ float3 fminf(float3 a, float3 b) +{ + return make_float3(fminf(a.x,b.x), fminf(a.y,b.y), fminf(a.z,b.z)); +} + +// max +static __inline__ __host__ __device__ float3 fmaxf(float3 a, float3 b) +{ + return make_float3(fmaxf(a.x,b.x), fmaxf(a.y,b.y), fmaxf(a.z,b.z)); +} + +// addition +inline __host__ __device__ float3 operator+(float3 a, float3 b) +{ + return make_float3(a.x + b.x, a.y + b.y, a.z + b.z); +} +inline __host__ __device__ float3 operator+(float3 a, float b) +{ + return make_float3(a.x + b, a.y + b, a.z + b); +} +inline __host__ __device__ void operator+=(float3 &a, float3 b) +{ + a.x += b.x; a.y += b.y; a.z += b.z; +} + +// subtract +inline __host__ __device__ float3 operator-(float3 a, float3 b) +{ + return make_float3(a.x - b.x, a.y - b.y, a.z - b.z); +} +inline __host__ __device__ float3 operator-(float3 a, float b) +{ + return make_float3(a.x - b, a.y - b, a.z - b); +} +inline __host__ __device__ void operator-=(float3 &a, float3 b) +{ + a.x -= b.x; a.y -= b.y; a.z -= b.z; +} + +// multiply +inline __host__ __device__ float3 operator*(float3 a, float3 b) +{ + return make_float3(a.x * b.x, a.y * b.y, a.z * b.z); +} +inline __host__ __device__ float3 operator*(float3 a, float s) +{ + return make_float3(a.x * s, a.y * s, a.z * s); +} +inline __host__ __device__ float3 operator*(float s, float3 a) +{ + return make_float3(a.x * s, a.y * s, a.z * s); +} +inline __host__ __device__ void operator*=(float3 &a, float s) +{ + a.x *= s; a.y *= s; a.z *= s; +} + +// divide +inline __host__ __device__ float3 operator/(float3 a, float3 b) +{ + return make_float3(a.x / b.x, a.y / b.y, a.z / b.z); +} +inline __host__ __device__ float3 operator/(float3 a, float s) +{ + float inv = 1.0f / s; + return a * inv; +} +inline __host__ __device__ float3 operator/(float s, float3 a) +{ + float inv = 1.0f / s; + return a * inv; +} +inline __host__ __device__ void operator/=(float3 &a, float s) +{ + float inv = 1.0f / s; + a *= inv; +} + +// lerp +inline __device__ __host__ float3 lerp(float3 a, float3 b, float t) +{ + return a + t*(b-a); +} + +// clamp +inline __device__ __host__ float3 clamp(float3 v, float a, float b) +{ + return make_float3(clamp(v.x, a, b), clamp(v.y, a, b), clamp(v.z, a, b)); +} + +inline __device__ __host__ float3 clamp(float3 v, float3 a, float3 b) +{ + return make_float3(clamp(v.x, a.x, b.x), clamp(v.y, a.y, b.y), clamp(v.z, a.z, b.z)); +} + +// dot product +inline __host__ __device__ float dot(float3 a, float3 b) +{ + return a.x * b.x + a.y * b.y + a.z * b.z; +} + +// cross product +inline __host__ __device__ float3 cross(float3 a, float3 b) +{ + return make_float3(a.y*b.z - a.z*b.y, a.z*b.x - a.x*b.z, a.x*b.y - a.y*b.x); +} + +// length +inline __host__ __device__ float length(float3 v) +{ + return sqrtf(dot(v, v)); +} + +// normalize +inline __host__ __device__ float3 normalize(float3 v) +{ + float invLen = 1.0f / sqrtf(dot(v, v)); + return v * invLen; +} + +// floor +inline __host__ __device__ float3 floor(const float3 v) +{ + return make_float3(floor(v.x), floor(v.y), floor(v.z)); +} + +// reflect +inline __host__ __device__ float3 reflect(float3 i, float3 n) +{ + return i - 2.0f * n * dot(n,i); +} + +// float4 functions +//////////////////////////////////////////////////////////////////////////////// + +// additional constructors +inline __host__ __device__ float4 make_float4(float s) +{ + return make_float4(s, s, s, s); +} +inline __host__ __device__ float4 make_float4(float3 a) +{ + return make_float4(a.x, a.y, a.z, 0.0f); +} +inline __host__ __device__ float4 make_float4(float3 a, float w) +{ + return make_float4(a.x, a.y, a.z, w); +} +inline __host__ __device__ float4 make_float4(int4 a) +{ + return make_float4(float(a.x), float(a.y), float(a.z), float(a.w)); +} + +// negate +inline __host__ __device__ float4 operator-(float4 &a) +{ + return make_float4(-a.x, -a.y, -a.z, -a.w); +} + +// min +static __inline__ __host__ __device__ float4 fminf(float4 a, float4 b) +{ + return make_float4(fminf(a.x,b.x), fminf(a.y,b.y), fminf(a.z,b.z), fminf(a.w,b.w)); +} + +// max +static __inline__ __host__ __device__ float4 fmaxf(float4 a, float4 b) +{ + return make_float4(fmaxf(a.x,b.x), fmaxf(a.y,b.y), fmaxf(a.z,b.z), fmaxf(a.w,b.w)); +} + +// addition +inline __host__ __device__ float4 operator+(float4 a, float4 b) +{ + return make_float4(a.x + b.x, a.y + b.y, a.z + b.z, a.w + b.w); +} +inline __host__ __device__ void operator+=(float4 &a, float4 b) +{ + a.x += b.x; a.y += b.y; a.z += b.z; a.w += b.w; +} + +// subtract +inline __host__ __device__ float4 operator-(float4 a, float4 b) +{ + return make_float4(a.x - b.x, a.y - b.y, a.z - b.z, a.w - b.w); +} +inline __host__ __device__ void operator-=(float4 &a, float4 b) +{ + a.x -= b.x; a.y -= b.y; a.z -= b.z; a.w -= b.w; +} + +// multiply +inline __host__ __device__ float4 operator*(float4 a, float s) +{ + return make_float4(a.x * s, a.y * s, a.z * s, a.w * s); +} +inline __host__ __device__ float4 operator*(float s, float4 a) +{ + return make_float4(a.x * s, a.y * s, a.z * s, a.w * s); +} +inline __host__ __device__ void operator*=(float4 &a, float s) +{ + a.x *= s; a.y *= s; a.z *= s; a.w *= s; +} + +// divide +inline __host__ __device__ float4 operator/(float4 a, float4 b) +{ + return make_float4(a.x / b.x, a.y / b.y, a.z / b.z, a.w / b.w); +} +inline __host__ __device__ float4 operator/(float4 a, float s) +{ + float inv = 1.0f / s; + return a * inv; +} +inline __host__ __device__ float4 operator/(float s, float4 a) +{ + float inv = 1.0f / s; + return a * inv; +} +inline __host__ __device__ void operator/=(float4 &a, float s) +{ + float inv = 1.0f / s; + a *= inv; +} + +// lerp +inline __device__ __host__ float4 lerp(float4 a, float4 b, float t) +{ + return a + t*(b-a); +} + +// clamp +inline __device__ __host__ float4 clamp(float4 v, float a, float b) +{ + return make_float4(clamp(v.x, a, b), clamp(v.y, a, b), clamp(v.z, a, b), clamp(v.w, a, b)); +} + +inline __device__ __host__ float4 clamp(float4 v, float4 a, float4 b) +{ + return make_float4(clamp(v.x, a.x, b.x), clamp(v.y, a.y, b.y), clamp(v.z, a.z, b.z), clamp(v.w, a.w, b.w)); +} + +// dot product +inline __host__ __device__ float dot(float4 a, float4 b) +{ + return a.x * b.x + a.y * b.y + a.z * b.z + a.w * b.w; +} + +// length +inline __host__ __device__ float length(float4 r) +{ + return sqrtf(dot(r, r)); +} + +// normalize +inline __host__ __device__ float4 normalize(float4 v) +{ + float invLen = 1.0f / sqrtf(dot(v, v)); + return v * invLen; +} + +// floor +inline __host__ __device__ float4 floor(const float4 v) +{ + return make_float4(floor(v.x), floor(v.y), floor(v.z), floor(v.w)); +} + +// int3 functions +//////////////////////////////////////////////////////////////////////////////// + +// additional constructors +inline __host__ __device__ int3 make_int3(int s) +{ + return make_int3(s, s, s); +} +inline __host__ __device__ int3 make_int3(float3 a) +{ + return make_int3(int(a.x), int(a.y), int(a.z)); +} + +// negate +inline __host__ __device__ int3 operator-(int3 &a) +{ + return make_int3(-a.x, -a.y, -a.z); +} + +// min +inline __host__ __device__ int3 min(int3 a, int3 b) +{ + return make_int3(min(a.x,b.x), min(a.y,b.y), min(a.z,b.z)); +} + +// max +inline __host__ __device__ int3 max(int3 a, int3 b) +{ + return make_int3(max(a.x,b.x), max(a.y,b.y), max(a.z,b.z)); +} + +// addition +inline __host__ __device__ int3 operator+(int3 a, int3 b) +{ + return make_int3(a.x + b.x, a.y + b.y, a.z + b.z); +} +inline __host__ __device__ void operator+=(int3 &a, int3 b) +{ + a.x += b.x; a.y += b.y; a.z += b.z; +} + +// subtract +inline __host__ __device__ int3 operator-(int3 a, int3 b) +{ + return make_int3(a.x - b.x, a.y - b.y, a.z - b.z); +} + +inline __host__ __device__ void operator-=(int3 &a, int3 b) +{ + a.x -= b.x; a.y -= b.y; a.z -= b.z; +} + +// multiply +inline __host__ __device__ int3 operator*(int3 a, int3 b) +{ + return make_int3(a.x * b.x, a.y * b.y, a.z * b.z); +} +inline __host__ __device__ int3 operator*(int3 a, int s) +{ + return make_int3(a.x * s, a.y * s, a.z * s); +} +inline __host__ __device__ int3 operator*(int s, int3 a) +{ + return make_int3(a.x * s, a.y * s, a.z * s); +} +inline __host__ __device__ void operator*=(int3 &a, int s) +{ + a.x *= s; a.y *= s; a.z *= s; +} + +// divide +inline __host__ __device__ int3 operator/(int3 a, int3 b) +{ + return make_int3(a.x / b.x, a.y / b.y, a.z / b.z); +} +inline __host__ __device__ int3 operator/(int3 a, int s) +{ + return make_int3(a.x / s, a.y / s, a.z / s); +} +inline __host__ __device__ int3 operator/(int s, int3 a) +{ + return make_int3(a.x / s, a.y / s, a.z / s); +} +inline __host__ __device__ void operator/=(int3 &a, int s) +{ + a.x /= s; a.y /= s; a.z /= s; +} + +// clamp +inline __device__ __host__ int clamp(int f, int a, int b) +{ + return max(a, min(f, b)); +} + +inline __device__ __host__ int3 clamp(int3 v, int a, int b) +{ + return make_int3(clamp(v.x, a, b), clamp(v.y, a, b), clamp(v.z, a, b)); +} + +inline __device__ __host__ int3 clamp(int3 v, int3 a, int3 b) +{ + return make_int3(clamp(v.x, a.x, b.x), clamp(v.y, a.y, b.y), clamp(v.z, a.z, b.z)); +} + + +// uint3 functions +//////////////////////////////////////////////////////////////////////////////// + +// additional constructors +inline __host__ __device__ uint3 make_uint3(uint s) +{ + return make_uint3(s, s, s); +} +inline __host__ __device__ uint3 make_uint3(float3 a) +{ + return make_uint3(uint(a.x), uint(a.y), uint(a.z)); +} + +// min +inline __host__ __device__ uint3 min(uint3 a, uint3 b) +{ + return make_uint3(min(a.x,b.x), min(a.y,b.y), min(a.z,b.z)); +} + +// max +inline __host__ __device__ uint3 max(uint3 a, uint3 b) +{ + return make_uint3(max(a.x,b.x), max(a.y,b.y), max(a.z,b.z)); +} + +// addition +inline __host__ __device__ uint3 operator+(uint3 a, uint3 b) +{ + return make_uint3(a.x + b.x, a.y + b.y, a.z + b.z); +} +inline __host__ __device__ void operator+=(uint3 &a, uint3 b) +{ + a.x += b.x; a.y += b.y; a.z += b.z; +} + +// subtract +inline __host__ __device__ uint3 operator-(uint3 a, uint3 b) +{ + return make_uint3(a.x - b.x, a.y - b.y, a.z - b.z); +} + +inline __host__ __device__ void operator-=(uint3 &a, uint3 b) +{ + a.x -= b.x; a.y -= b.y; a.z -= b.z; +} + +// multiply +inline __host__ __device__ uint3 operator*(uint3 a, uint3 b) +{ + return make_uint3(a.x * b.x, a.y * b.y, a.z * b.z); +} +inline __host__ __device__ uint3 operator*(uint3 a, uint s) +{ + return make_uint3(a.x * s, a.y * s, a.z * s); +} +inline __host__ __device__ uint3 operator*(uint s, uint3 a) +{ + return make_uint3(a.x * s, a.y * s, a.z * s); +} +inline __host__ __device__ void operator*=(uint3 &a, uint s) +{ + a.x *= s; a.y *= s; a.z *= s; +} + +// divide +inline __host__ __device__ uint3 operator/(uint3 a, uint3 b) +{ + return make_uint3(a.x / b.x, a.y / b.y, a.z / b.z); +} +inline __host__ __device__ uint3 operator/(uint3 a, uint s) +{ + return make_uint3(a.x / s, a.y / s, a.z / s); +} +inline __host__ __device__ uint3 operator/(uint s, uint3 a) +{ + return make_uint3(a.x / s, a.y / s, a.z / s); +} +inline __host__ __device__ void operator/=(uint3 &a, uint s) +{ + a.x /= s; a.y /= s; a.z /= s; +} + +// clamp +inline __device__ __host__ uint clamp(uint f, uint a, uint b) +{ + return max(a, min(f, b)); +} + +inline __device__ __host__ uint3 clamp(uint3 v, uint a, uint b) +{ + return make_uint3(clamp(v.x, a, b), clamp(v.y, a, b), clamp(v.z, a, b)); +} + +inline __device__ __host__ uint3 clamp(uint3 v, uint3 a, uint3 b) +{ + return make_uint3(clamp(v.x, a.x, b.x), clamp(v.y, a.y, b.y), clamp(v.z, a.z, b.z)); +} + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/CUDA/libbulletcuda.vcproj b/BulletPhysics/bulletTrunk/Extras/CUDA/libbulletcuda.vcproj new file mode 100644 index 00000000..b337f876 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CUDA/libbulletcuda.vcproj @@ -0,0 +1,601 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/BulletPhysics/bulletTrunk/Extras/CUDA/param.cpp b/BulletPhysics/bulletTrunk/Extras/CUDA/param.cpp new file mode 100644 index 00000000..822a4712 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CUDA/param.cpp @@ -0,0 +1,3 @@ +#include + +const Param dummy("error"); diff --git a/BulletPhysics/bulletTrunk/Extras/CUDA/param.h b/BulletPhysics/bulletTrunk/Extras/CUDA/param.h new file mode 100644 index 00000000..82c15670 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CUDA/param.h @@ -0,0 +1,226 @@ +/* + Simple parameter system + sgreen@nvidia.com 4/2001 +*/ + +#ifndef PARAM_H +#define PARAM_H + +#ifdef _WIN32 +# pragma warning(disable:4786) // No stupid debug warnings +#endif + +#include +#include +#include +#include +#include +#include + +// base class for named parameter +class ParamBase { +public: + ParamBase(char *name) { m_name = name; } + + virtual ~ParamBase() { } + + std::string *GetName() { return &m_name; } + + virtual float GetFloatValue() = 0; + virtual int GetIntValue() = 0; + + virtual std::string GetValueString() = 0; + + virtual void Reset() = 0; + virtual void Increment() = 0; + virtual void Decrement() = 0; + + virtual float GetPercentage() = 0; + virtual void SetPercentage(float p) = 0; + + virtual void Write(std::ostream &stream) = 0; + virtual void Read(std::istream &stream) = 0; + + virtual bool IsList() = 0; + +protected: + std::string m_name; +}; + +// derived class for single-valued parameter +template class Param : public ParamBase { +public: + Param(char *name, T value = 0, T min = 0, T max = 10000, T step = 1, T* ptr = 0) + : ParamBase(name) + { + if (ptr) { + m_ptr = ptr; + } else { + m_ptr = &m_value; + } + *m_ptr = value; + m_default = value; + + m_min = min; + m_max = max; + m_step = step; + } + + virtual ~Param() { } + + virtual float GetFloatValue() { return (float) *m_ptr; } + virtual int GetIntValue() { return (int) *m_ptr; } + + T GetValue() const { return *m_ptr; } + T SetValue(const T value) { *m_ptr = value; } + + // inherited functions + std::string GetValueString() + { + std::ostringstream ost; + ost< m_max) + *m_ptr = m_max; + } + + void Decrement() + { + *m_ptr -= m_step; + if (*m_ptr < m_min) + *m_ptr = m_min; + } + + void Write(std::ostream &stream) { stream << m_name << " " << *m_ptr << '\n'; } + void Read(std::istream &stream) { stream >> m_name >> *m_ptr; } + + bool IsList() { return false; } + +private: + T m_value; + T *m_ptr; // pointer to value declared elsewhere + T m_default, m_min, m_max; + T m_step; +}; + + +extern const Param dummy; + +// list of parameters +class ParamList : public ParamBase { +public: + ParamList(char *name = "") + : ParamBase(name) + { + active = true; + } + + virtual ~ParamList() { } + + virtual float GetFloatValue() { return 0.0f; } + virtual int GetIntValue() { return 0; } + + void AddParam(ParamBase *param) + { + m_params.push_back(param); + m_map[*param->GetName()] = param; + m_current = m_params.begin(); + } + + // look-up parameter based on name + ParamBase *GetParam(char *name) + { + ParamBase *p = m_map[name]; + + if (p) + return p; + else + return (ParamBase *) &dummy; + } + + ParamBase *GetParam(int i) + { + return m_params[i]; + } + + ParamBase *GetCurrent() + { + return *m_current; + } + + int GetSize() { return (int)m_params.size(); } + + // inherited functions + std::string GetValueString() + { +// return m_name; + return "list"; + } + + void Reset() + { + m_current = m_params.begin(); + } + + void Increment() + { + m_current++; + if (m_current == m_params.end()) + m_current = m_params.begin(); + } + + void Decrement() + { + if (m_current == m_params.begin()) + m_current = m_params.end()-1; + else + m_current--; + + } + + float GetPercentage() { return 0.0f; } + void SetPercentage(float /*p*/) { ; } + + void Write(std::ostream &stream) + { + stream << m_name << '\n'; + for(std::vector::const_iterator p = m_params.begin(); p != m_params.end(); ++p) { + (*p)->Write(stream); + } + } + + void Read(std::istream &stream) + { + stream >> m_name; + for(std::vector::const_iterator p = m_params.begin(); p != m_params.end(); ++p) { + (*p)->Read(stream); + } + } + + bool IsList() { return true; } + +protected: + bool active; + std::vector m_params; + std::map m_map; + std::vector::const_iterator m_current; +}; + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/CUDA/paramgl.cpp b/BulletPhysics/bulletTrunk/Extras/CUDA/paramgl.cpp new file mode 100644 index 00000000..b9c1aa45 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CUDA/paramgl.cpp @@ -0,0 +1,209 @@ +/* + ParamListGL + - class derived from ParamList to do simple OpenGL rendering of a parameter list + sgg 8/2001 +*/ + +#include +#include + +void beginWinCoords(void) +{ + glMatrixMode(GL_MODELVIEW); + glPushMatrix(); + glLoadIdentity(); + glTranslatef(0.0, glutGet(GLUT_WINDOW_HEIGHT) - 1, 0.0); + glScalef(1.0, -1.0, 1.0); + + glMatrixMode(GL_PROJECTION); + glPushMatrix(); + glLoadIdentity(); + glOrtho(0, glutGet(GLUT_WINDOW_WIDTH), 0, glutGet(GLUT_WINDOW_HEIGHT), -1, 1); + + glMatrixMode(GL_MODELVIEW); +} + +void endWinCoords(void) +{ + glMatrixMode(GL_PROJECTION); + glPopMatrix(); + + glMatrixMode(GL_MODELVIEW); + glPopMatrix(); +} + +void glPrint(int x, int y, const char *s, void *font) +{ + int i, len; + + glRasterPos2f(x, y); + len = (int) strlen(s); + for (i = 0; i < len; i++) { + glutBitmapCharacter(font, s[i]); + } +} + +void glPrintShadowed(int x, int y, const char *s, void *font, float *color) +{ + glColor3f(0.0, 0.0, 0.0); + glPrint(x-1, y-1, s, font); + + glColor3fv((GLfloat *) color); + glPrint(x, y, s, font); +} + + +ParamListGL::ParamListGL(char *name) : ParamList(name) +{ + font = (void *) GLUT_BITMAP_9_BY_15; +// font = (void *) GLUT_BITMAP_8_BY_13; + + bar_x = 250; + bar_w = 250; + bar_h = 10; + bar_offset = 5; + text_x = 5; + separation = 15; + value_x = 200; + font_h = 15; + start_x = 0; + start_y = 0; + + text_col_selected[0] = 1.0; + text_col_selected[1] = 1.0; + text_col_selected[2] = 1.0; + + text_col_unselected[0] = 0.75; + text_col_unselected[1] = 0.75; + text_col_unselected[2] = 0.75; + + bar_col_outer[0] = 0.0; + bar_col_outer[1] = 0.0; + bar_col_outer[2] = 0.0; + + bar_col_inner[0] = 0.0; + bar_col_inner[1] = 0.0; + bar_col_inner[2] = 0.0; + + text_col_shadow[0] = 0.0; + text_col_shadow[1] = 0.0; + text_col_shadow[2] = 0.0; +} + +void +ParamListGL::Render(int x, int y, bool shadow) +{ + beginWinCoords(); + + start_x = x; start_y = y; + + for(std::vector::const_iterator p = m_params.begin(); p != m_params.end(); ++p) { + if ((*p)->IsList()) { + ParamListGL *list = (ParamListGL *) (*p); + list->Render(x+10, y); + y += separation*list->GetSize(); + + } else { + if (p == m_current) + glColor3fv(text_col_selected); + else + glColor3fv(text_col_unselected); + + if (shadow) { + glPrintShadowed(x + text_x, y + font_h, (*p)->GetName()->c_str(), font, (p == m_current) ? text_col_selected : text_col_unselected); + glPrintShadowed(x + value_x, y + font_h, (*p)->GetValueString().c_str(), font, (p == m_current) ? text_col_selected : text_col_unselected); + } + else { + glPrint(x + text_x, y + font_h, (*p)->GetName()->c_str(), font); + glPrint(x + value_x, y + font_h, (*p)->GetValueString().c_str(), font); + } + +// glColor3fv((GLfloat *) &bar_col_outer); + glBegin(GL_LINE_LOOP); + glVertex2f(x + bar_x, y + bar_offset); + glVertex2f(x + bar_x + bar_w, y + bar_offset); + glVertex2f(x + bar_x + bar_w, y + bar_offset + bar_h); + glVertex2f(x + bar_x, y + bar_offset + bar_h); + glEnd(); + +// glColor3fv((GLfloat *) &bar_col_inner); + glRectf(x + bar_x, y + bar_offset + bar_h, x + bar_x + (bar_w*(*p)->GetPercentage()), y + bar_offset); + + y += separation; + } + + } + + endWinCoords(); +} + + +bool +ParamListGL::Mouse(int x, int y, int button, int state) +{ + if ((y < start_y) || (y > (int)(start_y + (separation * m_params.size()) - 1))) + return false; + + int i = (y - start_y) / separation; + + if ((button==GLUT_LEFT_BUTTON) && (state==GLUT_DOWN)) { +#if defined(__GNUC__) && (__GNUC__ < 3) + m_current = &m_params[i]; +#else + // MJH: workaround since the version of vector::at used here is non-standard + for (m_current = m_params.begin(); m_current != m_params.end() && i > 0; m_current++, i--); + //m_current = (std::vector::const_iterator)&m_params.at(i); +#endif + + if ((x > bar_x) && (x < bar_x + bar_w)) { + Motion(x, y); + } + } + return true; +} + +bool +ParamListGL::Motion(int x, int y) +{ + if ((y < start_y) || (y > start_y + (separation * (int)m_params.size()) - 1) ) + return false; + + if (x < bar_x) { + (*m_current)->SetPercentage(0.0); + return true; + } + + if (x > bar_x + bar_w) { + (*m_current)->SetPercentage(1.0); + return true; + } + + (*m_current)->SetPercentage((x-bar_x) / (float) bar_w); + return true; +} + +void +ParamListGL::Special(int key, int /*x*/, int /*y*/) +{ + switch(key) { + case GLUT_KEY_DOWN: + Increment(); + break; + case GLUT_KEY_UP: + Decrement(); + break; + case GLUT_KEY_RIGHT: + GetCurrent()->Increment(); + break; + case GLUT_KEY_LEFT: + GetCurrent()->Decrement(); + break; + case GLUT_KEY_HOME: + GetCurrent()->Reset(); + break; + case GLUT_KEY_END: + GetCurrent()->SetPercentage(1.0); + break; + } + glutPostRedisplay(); +} diff --git a/BulletPhysics/bulletTrunk/Extras/CUDA/paramgl.h b/BulletPhysics/bulletTrunk/Extras/CUDA/paramgl.h new file mode 100644 index 00000000..3a760d46 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CUDA/paramgl.h @@ -0,0 +1,54 @@ +/* + ParamListGL + - class derived from ParamList to do simple OpenGL rendering of a parameter list + sgg 8/2001 +*/ + +#ifndef PARAMGL_H +#define PARAMGL_H + +#if defined(__APPLE__) || defined(MACOSX) +#include +#else +#include +#endif + +#include + +void beginWinCoords(); +void endWinCoords(); +void glPrint(int x, int y, const char *s, void *font); +void glPrintShadowed(int x, int y, const char *s, void *font, float *color); + +class ParamListGL : public ParamList { +public: + ParamListGL(char *name = ""); + + void Render(int x, int y, bool shadow = false); + bool Mouse(int x, int y, int button=GLUT_LEFT_BUTTON, int state=GLUT_DOWN); + bool Motion(int x, int y); + void Special(int key, int x, int y); + + void SetSelectedColor(float r, float g, float b) { text_col_selected[0] = r; text_col_selected[1] = g; text_col_selected[2] = b; } + void SetUnSelectedColor(float r, float g, float b) { text_col_unselected[0] = r; text_col_unselected[1] = g; text_col_unselected[2] = b; } + + int bar_x; + int bar_w; + int bar_h; + int text_x; + int separation; + int value_x; + int font_h; + int start_x, start_y; + int bar_offset; + + float text_col_selected[3]; + float text_col_unselected[3]; + float text_col_shadow[3]; + float bar_col_outer[3]; + float bar_col_inner[3]; + + void *font; +}; + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/CUDA/particleSystem.cpp b/BulletPhysics/bulletTrunk/Extras/CUDA/particleSystem.cpp new file mode 100644 index 00000000..2133127c --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CUDA/particleSystem.cpp @@ -0,0 +1,806 @@ +/* + * Copyright 1993-2006 NVIDIA Corporation. All rights reserved. + * + * NOTICE TO USER: + * + * This source code is subject to NVIDIA ownership rights under U.S. and + * international Copyright laws. + * + * NVIDIA MAKES NO REPRESENTATION ABOUT THE SUITABILITY OF THIS SOURCE + * CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR + * IMPLIED WARRANTY OF ANY KIND. NVIDIA DISCLAIMS ALL WARRANTIES WITH + * REGARD TO THIS SOURCE CODE, INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE. + * IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL, + * OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS + * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE + * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE + * OR PERFORMANCE OF THIS SOURCE CODE. + * + * U.S. Government End Users. This source code is a "commercial item" as + * that term is defined at 48 C.F.R. 2.101 (OCT 1995), consisting of + * "commercial computer software" and "commercial computer software + * documentation" as such terms are used in 48 C.F.R. 12.212 (SEPT 1995) + * and is provided to the U.S. Government only as a commercial end item. + * Consistent with 48 C.F.R.12.212 and 48 C.F.R. 227.7202-1 through + * 227.7202-4 (JUNE 1995), all U.S. Government End Users acquire the + * source code with only those rights set forth herein. + */ + +#include "particleSystem.h" +#include "particleSystem.cuh" +#include "radixsort.cuh" +#include "particles_kernel.cuh" + +//#include + +#include +#include +#include +#include +#include +#include +#include + +#include +#include "../../Demos/OpenGL/GLDebugDrawer.h" + +#include "btCudaBroadphase.h" + + +#ifndef CUDART_PI_F +#define CUDART_PI_F 3.141592654f +#endif + +#define USE_BULLET 1 + +#define VEL_DIR_FACT (30.0F) +#define ACC_DIR_FACT (VEL_DIR_FACT*VEL_DIR_FACT) +#define VEL_INV_FACT (1.0F/VEL_DIR_FACT) +#define ACC_INV_FACT (1.0F/ACC_DIR_FACT) + +GLDebugDrawer debugDrawer; + + +ParticleSystem::ParticleSystem(uint numParticles, uint3 gridSize) : + m_bInitialized(false), + m_numParticles(numParticles), + m_hPos(0), + m_hVel(0), + m_currentPosRead(0), + m_currentVelRead(0), + m_currentPosWrite(1), + m_currentVelWrite(1), + m_gridSize(gridSize), + m_maxParticlesPerCell(4), + m_timer(0), + m_solverIterations(1), +// m_simulationMode(SIMULATION_CUDA) + m_simulationMode(SIMULATION_BULLET_CPU) +{ + m_dPos[0] = m_dPos[1] = 0; + m_dVel[0] = m_dVel[1] = 0; + + m_numGridCells = m_gridSize.x*m_gridSize.y*m_gridSize.z; + float3 worldSize = make_float3(2.0f, 2.0f, 2.0f); + + // set simulation parameters + m_params.gridSize = m_gridSize; + m_params.numCells = m_numGridCells; + m_params.numBodies = m_numParticles; + m_params.maxParticlesPerCell = m_maxParticlesPerCell; + + m_params.worldOrigin = make_float3(-1.0f, -1.0f, -1.0f); + m_params.cellSize = make_float3(worldSize.x / m_gridSize.x, worldSize.y / m_gridSize.y, worldSize.z / m_gridSize.z); + + m_params.particleRadius = m_params.cellSize.x * 0.5f; + m_params.colliderPos = make_float4(0.0f, -0.7f, 0.0f, 1.0f); + m_params.colliderRadius = 0.2f; + + m_params.spring = 0.5f; + m_params.damping = 0.02f; + m_params.shear = 0.1f; + m_params.attraction = 0.0f; + m_params.boundaryDamping = -0.5f; + + m_params.gravity = make_float3(0.0f, -0.0003f, 0.0f); + m_params.globalDamping = 1.0f; + + _initialize(numParticles); + +#if USE_BULLET + initializeBullet(); +#endif +} + +ParticleSystem::~ParticleSystem() +{ +#if USE_BULLET + finalizeBullet(); +#endif + _finalize(); + m_numParticles = 0; +} + +uint +ParticleSystem::createVBO(uint size) +{ + GLuint vbo; + glGenBuffers(1, &vbo); + glBindBuffer(GL_ARRAY_BUFFER, vbo); + glBufferData(GL_ARRAY_BUFFER, size, 0, GL_DYNAMIC_DRAW); + glBindBuffer(GL_ARRAY_BUFFER, 0); + registerGLBufferObject(vbo); + return vbo; +} + +inline float lerp(float a, float b, float t) +{ + return a + t*(b-a); +} + +void colorRamp(float t, float *r) +{ + const int ncolors = 7; + float c[ncolors][3] = { + { 1.0, 0.0, 0.0, }, + { 1.0, 0.5, 0.0, }, + { 1.0, 1.0, 0.0, }, + { 0.0, 1.0, 0.0, }, + { 0.0, 1.0, 1.0, }, + { 0.0, 0.0, 1.0, }, + { 1.0, 0.0, 1.0, }, + }; + t = t * (ncolors-1); + int i = (int) t; + float u = t - floor(t); + r[0] = lerp(c[i][0], c[i+1][0], u); + r[1] = lerp(c[i][1], c[i+1][1], u); + r[2] = lerp(c[i][2], c[i+1][2], u); +} + +void +ParticleSystem::_initialize(int numParticles) +{ + assert(!m_bInitialized); + + m_numParticles = numParticles; + + // allocate host storage + m_hPos = new float[m_numParticles*4]; + m_hVel = new float[m_numParticles*4]; + memset(m_hPos, 0, m_numParticles*4*sizeof(float)); + memset(m_hVel, 0, m_numParticles*4*sizeof(float)); + + m_hGridCounters = new uint[m_numGridCells]; + m_hGridCells = new uint[m_numGridCells*m_maxParticlesPerCell]; + memset(m_hGridCounters, 0, m_numGridCells*sizeof(uint)); + memset(m_hGridCells, 0, m_numGridCells*m_maxParticlesPerCell*sizeof(uint)); + + m_hParticleHash = new uint[m_numParticles*2]; + memset(m_hParticleHash, 0, m_numParticles*2*sizeof(uint)); + + m_hCellStart = new uint[m_numGridCells]; + memset(m_hCellStart, 0, m_numGridCells*sizeof(uint)); + + // allocate GPU data + unsigned int memSize = sizeof(float) * 4 * m_numParticles; + + m_posVbo[0] = createVBO(memSize); + m_posVbo[1] = createVBO(memSize); + + allocateArray((void**)&m_dVel[0], memSize); + allocateArray((void**)&m_dVel[1], memSize); + + allocateArray((void**)&m_dSortedPos, memSize); + allocateArray((void**)&m_dSortedVel, memSize); + +#if USE_SORT + allocateArray((void**)&m_dParticleHash[0], m_numParticles*2*sizeof(uint)); + allocateArray((void**)&m_dParticleHash[1], m_numParticles*2*sizeof(uint)); + allocateArray((void**)&m_dCellStart, m_numGridCells*sizeof(uint)); +#else + allocateArray((void**)&m_dGridCounters, m_numGridCells*sizeof(uint)); + allocateArray((void**)&m_dGridCells, m_numGridCells*m_maxParticlesPerCell*sizeof(uint)); +#endif + + m_colorVBO = createVBO(m_numParticles*4*sizeof(float)); + +#if 1 + // fill color buffer + glBindBufferARB(GL_ARRAY_BUFFER, m_colorVBO); + float *data = (float *) glMapBufferARB(GL_ARRAY_BUFFER, GL_WRITE_ONLY); + float *ptr = data; + for(uint i=0; i 1.0f - m_params.particleRadius) { pos.x = 1.0f - m_params.particleRadius; vel.x *= m_params.boundaryDamping; } +// if (pos.x < -1.0f + m_params.particleRadius) { pos.x = -1.0f + m_params.particleRadius; vel.x *= m_params.boundaryDamping;} +// if (pos.y > 1.0f - m_params.particleRadius) { pos.y = 1.0f - m_params.particleRadius; vel.y *= m_params.boundaryDamping; } +// if (pos.y < -1.0f + m_params.particleRadius) { pos.y = -1.0f + m_params.particleRadius; vel.y *= m_params.boundaryDamping;} +// if (pos.z > 1.0f - m_params.particleRadius) { pos.z = 1.0f - m_params.particleRadius; vel.z *= m_params.boundaryDamping; } +// if (pos.z < -1.0f + m_params.particleRadius) { pos.z = -1.0f + m_params.particleRadius; vel.z *= m_params.boundaryDamping;} + btTransform& trans = m_bulletParticles[i]->getWorldTransform(); + trans.setOrigin(btVector3(pos.x, pos.y, pos.z)); + m_bulletParticles[i]->setLinearVelocity(btVector3(vel.x, vel.y, vel.z)*btScalar(VEL_DIR_FACT)); + m_bulletParticles[i]->setAngularVelocity(btVector3(0,0,0)); + } + + glUnmapBufferARB(GL_ARRAY_BUFFER); + + std::swap(m_currentPosRead, m_currentPosWrite); + std::swap(m_currentVelRead, m_currentVelWrite); + + btTransform& collTrans = m_bulletCollider->getWorldTransform(); + collTrans.setOrigin(btVector3(m_params.colliderPos.x, m_params.colliderPos.y, m_params.colliderPos.z)); + + m_dynamicsWorld->stepSimulation(deltaTime); + + glBindBufferARB(GL_ARRAY_BUFFER, m_posVbo[m_currentPosRead]); + hPos = (float *) glMapBufferARB(GL_ARRAY_BUFFER, GL_READ_WRITE);//GL_WRITE_ONLY); + + //sync transform and velocity from Bullet to particle system + for (uint i=0;igetWorldTransform(); + hPos[i*4] = trans.getOrigin().getX(); + hPos[i*4+1] = trans.getOrigin().getY(); + hPos[i*4+2] = trans.getOrigin().getZ(); + hVel[i*4] = m_bulletParticles[i]->getLinearVelocity().getX() * VEL_INV_FACT; + hVel[i*4+1] = m_bulletParticles[i]->getLinearVelocity().getY() * VEL_INV_FACT; + hVel[i*4+2] = m_bulletParticles[i]->getLinearVelocity().getZ() * VEL_INV_FACT; + } + copyBuffersFromHostToDevice(); + + collTrans = m_bulletCollider->getWorldTransform(); + m_params.colliderPos.x = collTrans.getOrigin().getX(); + m_params.colliderPos.y = collTrans.getOrigin().getY(); + m_params.colliderPos.z = collTrans.getOrigin().getZ(); + +} + + + +void +ParticleSystem::updateCuda(float deltaTime) +{ +#ifndef BT_NO_PROFILE + CProfileManager::Reset(); +#endif //BT_NO_PROFILE + BT_PROFILE("update CUDA"); + // update constants + setParameters(&m_params); + + // integrate + { + BT_PROFILE("integrate"); + integrateSystem(m_posVbo[m_currentPosRead], m_posVbo[m_currentPosWrite], + m_dVel[m_currentVelRead], m_dVel[m_currentVelWrite], + deltaTime, + m_numParticles); + } + std::swap(m_currentPosRead, m_currentPosWrite); + std::swap(m_currentVelRead, m_currentVelWrite); + +#if USE_SORT + // sort and search method + + // calculate hash + { + BT_PROFILE("calcHash"); + calcHash(m_posVbo[m_currentPosRead], + m_dParticleHash[0], + m_numParticles); + } + +#if DEBUG_GRID + copyArrayFromDevice((void *) m_hParticleHash, (void *) m_dParticleHash[0], 0, sizeof(uint)*2*m_numParticles); + printf("particle hash:\n"); + for(uint i=0; i maxPerCell) + maxPerCell = m_hGridCounters[i]; + if (m_hGridCounters[i] > 0) { + printf("%d (%d): ", i, m_hGridCounters[i]); + for(uint j=0; jsetDebugDrawer(&debugDrawer); + //debugDrawer.setDebugMode(btIDebugDraw::DBG_DrawPairs); + + +// m_dynamicsWorld->setGravity(100*btVector3(m_params.gravity.x,m_params.gravity.y,m_params.gravity.z)); + m_dynamicsWorld->setGravity(btScalar(ACC_DIR_FACT) * btVector3(m_params.gravity.x,m_params.gravity.y,m_params.gravity.z)); + m_dynamicsWorld->getSolverInfo().m_numIterations=1; + + btRigidBody* body; + + btCollisionShape* boxShape = new btBoxShape(btVector3(btScalar(1.2),btScalar(0.05),btScalar(1.2))); +// boxShape->setMargin(0.03f); + + btScalar mass(0.); + btVector3 localInertia(0,0,0); + btRigidBody::btRigidBodyConstructionInfo boxRbcInfo(mass, 0, boxShape, localInertia); + boxRbcInfo.m_startWorldTransform.setIdentity(); + boxRbcInfo.m_startWorldTransform.setOrigin(btVector3(0, -1.05f,0)); + boxRbcInfo.m_friction = 0.0f; + body = new btRigidBody(boxRbcInfo); + m_dynamicsWorld->addRigidBody(body); + + boxRbcInfo.m_startWorldTransform.setIdentity(); + boxRbcInfo.m_startWorldTransform.setOrigin(btVector3(0, 1.05f,0)); + boxRbcInfo.m_friction = 0.0f; + body = new btRigidBody(boxRbcInfo); + m_dynamicsWorld->addRigidBody(body); + + boxRbcInfo.m_startWorldTransform.setIdentity(); + boxRbcInfo.m_startWorldTransform.getBasis().setEulerZYX(0, 0, SIMD_HALF_PI); + boxRbcInfo.m_startWorldTransform.setOrigin(btVector3(-1.05f, 0, 0)); + boxRbcInfo.m_friction = 0.0f; + body = new btRigidBody(boxRbcInfo); + m_dynamicsWorld->addRigidBody(body); + + boxRbcInfo.m_startWorldTransform.setIdentity(); + boxRbcInfo.m_startWorldTransform.getBasis().setEulerZYX(0, 0, SIMD_HALF_PI); + boxRbcInfo.m_startWorldTransform.setOrigin(btVector3(1.05f, 0, 0)); + boxRbcInfo.m_friction = 0.0f; + body = new btRigidBody(boxRbcInfo); + m_dynamicsWorld->addRigidBody(body); + + boxRbcInfo.m_startWorldTransform.setIdentity(); + boxRbcInfo.m_startWorldTransform.getBasis().setEulerZYX(SIMD_HALF_PI, 0, 0); + boxRbcInfo.m_startWorldTransform.setOrigin(btVector3(0, 0, -1.05f)); + boxRbcInfo.m_friction = 0.0f; + body = new btRigidBody(boxRbcInfo); + m_dynamicsWorld->addRigidBody(body); + + boxRbcInfo.m_startWorldTransform.setIdentity(); + boxRbcInfo.m_startWorldTransform.getBasis().setEulerZYX(SIMD_HALF_PI, 0, 0); + boxRbcInfo.m_startWorldTransform.setOrigin(btVector3(0, 0, 1.05f)); + boxRbcInfo.m_friction = 0.0f; + body = new btRigidBody(boxRbcInfo); + m_dynamicsWorld->addRigidBody(body); + + + + unsigned int i; + + btSphereShape* particleSphere = new btSphereShape(m_params.particleRadius); + particleSphere->setMargin(0.0); + particleSphere->calculateLocalInertia(1,localInertia); + + reset(CONFIG_GRID); + + for (i=0;isetActivationState(DISABLE_DEACTIVATION); + m_bulletParticles.push_back(body); + m_dynamicsWorld->addRigidBody(body); + } + + btSphereShape* colliderSphere = new btSphereShape(m_params.colliderRadius); + colliderSphere->setMargin(0.0); + colliderSphere->calculateLocalInertia(10., localInertia); + btRigidBody::btRigidBodyConstructionInfo rbci(5., 0, colliderSphere,localInertia); + rbci.m_startWorldTransform.setOrigin(btVector3(m_params.colliderPos.x, m_params.colliderPos.y, m_params.colliderPos.z)); + body = new btRigidBody(rbci); + body->setActivationState(DISABLE_DEACTIVATION); + m_bulletCollider = body; + m_dynamicsWorld->addRigidBody(body); + +/* for (i=0;i<6;i++) + { + btVector4 planeEq; + worldBox->getPlaneEquation(planeEq,i); + + planeShape = new btStaticPlaneShape(-planeEq,planeEq.getW()); + planeShape->setMargin(0.f); + btRigidBody::btRigidBodyConstructionInfo rbci(0.f,0,planeShape); + body = new btRigidBody(rbci); + m_dynamicsWorld->addRigidBody(body); + } +*/ +} + +void ParticleSystem::finalizeBullet() +{ + delete m_dynamicsWorld; + delete m_constraintSolver; + delete m_broadphase; + delete m_dispatcher ; + delete m_collisionConfiguration; +} + +float* ParticleSystem::copyBuffersFromDeviceToHost() +{ + copyArrayFromDevice(m_hVel, m_dVel[m_currentVelRead], 0, sizeof(float)*4*m_numParticles); + // fill color buffer + glBindBufferARB(GL_ARRAY_BUFFER, m_posVbo[m_currentPosRead]); + float* hPosData = (float *) glMapBufferARB(GL_ARRAY_BUFFER, GL_READ_WRITE);//GL_WRITE_ONLY); + return hPosData; +} + +void ParticleSystem::copyBuffersFromHostToDevice() +{ + glUnmapBufferARB(GL_ARRAY_BUFFER); + copyArrayToDevice(m_dVel[m_currentVelRead],m_hVel, 0, sizeof(float)*4*m_numParticles); +} + + +void ParticleSystem::debugDraw() +{ +#if USE_BULLET + glDisable(GL_DEPTH_TEST); + m_dynamicsWorld->debugDrawWorld(); + glEnable(GL_DEPTH_TEST); +#endif +} + + diff --git a/BulletPhysics/bulletTrunk/Extras/CUDA/particleSystem.cu b/BulletPhysics/bulletTrunk/Extras/CUDA/particleSystem.cu new file mode 100644 index 00000000..3edd67fc --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CUDA/particleSystem.cu @@ -0,0 +1,336 @@ +/* + * Copyright 1993-2006 NVIDIA Corporation. All rights reserved. + * + * NOTICE TO USER: + * + * This source code is subject to NVIDIA ownership rights under U.S. and + * international Copyright laws. + * + * NVIDIA MAKES NO REPRESENTATION ABOUT THE SUITABILITY OF THIS SOURCE + * CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR + * IMPLIED WARRANTY OF ANY KIND. NVIDIA DISCLAIMS ALL WARRANTIES WITH + * REGARD TO THIS SOURCE CODE, INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE. + * IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL, + * OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS + * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE + * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE + * OR PERFORMANCE OF THIS SOURCE CODE. + * + * U.S. Government End Users. This source code is a "commercial item" as + * that term is defined at 48 C.F.R. 2.101 (OCT 1995), consisting of + * "commercial computer software" and "commercial computer software + * documentation" as such terms are used in 48 C.F.R. 12.212 (SEPT 1995) + * and is provided to the U.S. Government only as a commercial end item. + * Consistent with 48 C.F.R.12.212 and 48 C.F.R. 227.7202-1 through + * 227.7202-4 (JUNE 1995), all U.S. Government End Users acquire the + * source code with only those rights set forth herein. + */ + +//#include +#include +#include +#include + +#if defined(__APPLE__) || defined(MACOSX) +#include +#else +#include +#endif + +#include + +#include "particles_kernel.cu" +//#include "radixsort.cu" + + //! Check for CUDA error +# define CUT_CHECK_ERROR(errorMessage) do { \ + cudaError_t err = cudaGetLastError(); \ + if( cudaSuccess != err) { \ + fprintf(stderr, "Cuda error: %s in file '%s' in line %i : %s.\n", \ + errorMessage, __FILE__, __LINE__, cudaGetErrorString( err) );\ + mm_exit(EXIT_FAILURE); \ + } \ + err = cudaThreadSynchronize(); \ + if( cudaSuccess != err) { \ + fprintf(stderr, "Cuda error: %s in file '%s' in line %i : %s.\n", \ + errorMessage, __FILE__, __LINE__, cudaGetErrorString( err) );\ + mm_exit(EXIT_FAILURE); \ + } } while (0) + + +# define MY_CUDA_SAFE_CALL_NO_SYNC( call) do { \ + cudaError err = call; \ + if( cudaSuccess != err) { \ + fprintf(stderr, "Cuda error in file '%s' in line %i : %s.\n", \ + __FILE__, __LINE__, cudaGetErrorString( err) ); \ + mm_exit(EXIT_FAILURE); \ + } } while (0) + +# define MY_CUDA_SAFE_CALL( call) do { \ + MY_CUDA_SAFE_CALL_NO_SYNC(call); \ + cudaError err = cudaThreadSynchronize(); \ + if( cudaSuccess != err) { \ + fprintf(stderr, "Cuda errorSync in file '%s' in line %i : %s.\n", \ + __FILE__, __LINE__, cudaGetErrorString( err) ); \ + mm_exit(EXIT_FAILURE); \ + } } while (0) + + + +extern "C" +{ +void mm_exit(int val) +{ + exit(val); +} + +void cudaInit(int argc, char **argv) +{ +// CUT_DEVICE_INIT(argc, argv); +} + +void allocateArray(void **devPtr, size_t size) +{ + MY_CUDA_SAFE_CALL(cudaMalloc(devPtr, size)); +} + +void freeArray(void *devPtr) +{ + MY_CUDA_SAFE_CALL(cudaFree(devPtr)); +} + +void threadSync() +{ + MY_CUDA_SAFE_CALL(cudaThreadSynchronize()); +} + +void copyArrayFromDevice(void* host, const void* device, unsigned int vbo, int size) +{ + if (vbo) + MY_CUDA_SAFE_CALL(cudaGLMapBufferObject((void**)&device, vbo)); + MY_CUDA_SAFE_CALL(cudaMemcpy(host, device, size, cudaMemcpyDeviceToHost)); + if (vbo) + MY_CUDA_SAFE_CALL(cudaGLUnmapBufferObject(vbo)); +} + +void copyArrayToDevice(void* device, const void* host, int offset, int size) +{ + MY_CUDA_SAFE_CALL(cudaMemcpy((char *) device + offset, host, size, cudaMemcpyHostToDevice)); +} + +void registerGLBufferObject(uint vbo) +{ + MY_CUDA_SAFE_CALL(cudaGLRegisterBufferObject(vbo)); +} + +void unregisterGLBufferObject(uint vbo) +{ + MY_CUDA_SAFE_CALL(cudaGLUnregisterBufferObject(vbo)); +} + +void setParameters(SimParams *hostParams) +{ + // copy parameters to constant memory + MY_CUDA_SAFE_CALL( cudaMemcpyToSymbol(params, hostParams, sizeof(SimParams)) ); +} + +//Round a / b to nearest higher integer value +int iDivUp(int a, int b){ + return (a % b != 0) ? (a / b + 1) : (a / b); +} + +// compute grid and thread block size for a given number of elements +void computeGridSize(int n, int blockSize, int &numBlocks, int &numThreads) +{ + numThreads = min(blockSize, n); + numBlocks = iDivUp(n, numThreads); +} + +void +integrateSystem(uint vboOldPos, uint vboNewPos, + float* oldVel, float* newVel, + float deltaTime, + int numBodies) +{ + int numThreads, numBlocks; + computeGridSize(numBodies, 256, numBlocks, numThreads); + + float *oldPos, *newPos; + MY_CUDA_SAFE_CALL(cudaGLMapBufferObject((void**)&oldPos, vboOldPos)); + MY_CUDA_SAFE_CALL(cudaGLMapBufferObject((void**)&newPos, vboNewPos)); + + // execute the kernel + integrate<<< numBlocks, numThreads >>>((float4*)newPos, (float4*)newVel, + (float4*)oldPos, (float4*)oldVel, + deltaTime); + + // check if kernel invocation generated an error + CUT_CHECK_ERROR("integrate kernel execution failed"); + + MY_CUDA_SAFE_CALL(cudaGLUnmapBufferObject(vboOldPos)); + MY_CUDA_SAFE_CALL(cudaGLUnmapBufferObject(vboNewPos)); +} + +void +updateGrid(uint vboPos, + uint* gridCounters, + uint* gridCells, + uint numBodies, + uint numCells) +{ + int numThreads, numBlocks; + computeGridSize(numBodies, 256, numBlocks, numThreads); + + float *pos; + MY_CUDA_SAFE_CALL(cudaGLMapBufferObject((void**)&pos, vboPos)); + + MY_CUDA_SAFE_CALL(cudaMemset(gridCounters, 0, numCells*sizeof(uint))); + + // execute the kernel + updateGridD<<< numBlocks, numThreads >>>((float4 *) pos, + gridCounters, + gridCells); + + // check if kernel invocation generated an error + CUT_CHECK_ERROR("Kernel execution failed"); + + MY_CUDA_SAFE_CALL(cudaGLUnmapBufferObject(vboPos)); +} + + +void +calcHash(uint vboPos, + uint* particleHash, + int numBodies) +{ + int numThreads, numBlocks; + computeGridSize(numBodies, 256, numBlocks, numThreads); + + float *pos; + MY_CUDA_SAFE_CALL(cudaGLMapBufferObject((void**)&pos, vboPos)); + + // execute the kernel + calcHashD<<< numBlocks, numThreads >>>((float4 *) pos, + (uint2 *) particleHash); + + // check if kernel invocation generated an error + CUT_CHECK_ERROR("Kernel execution failed"); + + MY_CUDA_SAFE_CALL(cudaGLUnmapBufferObject(vboPos)); +} + +void +reorderDataAndFindCellStart(uint* particleHash, + uint vboOldPos, + float* oldVel, + float* sortedPos, + float* sortedVel, + uint* cellStart, + uint numBodies, + uint numCells) +{ + int numThreads, numBlocks; + computeGridSize(numBodies, 256, numBlocks, numThreads); + + MY_CUDA_SAFE_CALL(cudaMemset(cellStart, 0xffffffff, numCells*sizeof(uint))); + + float *oldPos; + MY_CUDA_SAFE_CALL(cudaGLMapBufferObject((void**)&oldPos, vboOldPos)); + +#if USE_TEX + MY_CUDA_SAFE_CALL(cudaBindTexture(0, oldPosTex, oldPos, numBodies*sizeof(float4))); + MY_CUDA_SAFE_CALL(cudaBindTexture(0, oldVelTex, oldVel, numBodies*sizeof(float4))); +#endif + + reorderDataAndFindCellStartD<<< numBlocks, numThreads >>>( + (uint2 *) particleHash, + (float4 *) oldPos, + (float4 *) oldVel, + (float4 *) sortedPos, + (float4 *) sortedVel, + (uint *) cellStart); + CUT_CHECK_ERROR("Kernel execution failed: reorderDataAndFindCellStartD"); + +#if USE_TEX + MY_CUDA_SAFE_CALL(cudaUnbindTexture(oldPosTex)); + MY_CUDA_SAFE_CALL(cudaUnbindTexture(oldVelTex)); +#endif + + MY_CUDA_SAFE_CALL(cudaGLUnmapBufferObject(vboOldPos)); +} + +void +collide(uint vboOldPos, uint vboNewPos, + float* sortedPos, float* sortedVel, + float* oldVel, float* newVel, + uint* gridCounters, + uint* gridCells, + uint* particleHash, + uint* cellStart, + uint numBodies, + uint numCells, + uint maxParticlesPerCell) +{ + float4 *oldPos, *newPos; + MY_CUDA_SAFE_CALL(cudaGLMapBufferObject((void**)&oldPos, vboOldPos)); + MY_CUDA_SAFE_CALL(cudaGLMapBufferObject((void**)&newPos, vboNewPos)); + +#if USE_TEX + +#if USE_SORT + // use sorted arrays + MY_CUDA_SAFE_CALL(cudaBindTexture(0, oldPosTex, sortedPos, numBodies*sizeof(float4))); + MY_CUDA_SAFE_CALL(cudaBindTexture(0, oldVelTex, sortedVel, numBodies*sizeof(float4))); + + MY_CUDA_SAFE_CALL(cudaBindTexture(0, particleHashTex, particleHash, numBodies*sizeof(uint2))); + MY_CUDA_SAFE_CALL(cudaBindTexture(0, cellStartTex, cellStart, numCells*sizeof(uint))); +#else + + MY_CUDA_SAFE_CALL(cudaBindTexture(0, oldPosTex, oldPos, numBodies*sizeof(float4))); + MY_CUDA_SAFE_CALL(cudaBindTexture(0, oldVelTex, oldVel, numBodies*sizeof(float4))); + + MY_CUDA_SAFE_CALL(cudaBindTexture(0, gridCountersTex, gridCounters,numCells*sizeof(uint))); + MY_CUDA_SAFE_CALL(cudaBindTexture(0, gridCellsTex, gridCells, numCells*maxParticlesPerCell*sizeof(uint))); +#endif + +#endif + + // thread per particle + int numThreads, numBlocks; + computeGridSize(numBodies, BLOCKDIM, numBlocks, numThreads); + + // execute the kernel + collideD<<< numBlocks, numThreads >>>((float4*)newPos, (float4*)newVel, +#if USE_SORT + (float4*)sortedPos, (float4*)sortedVel, + (uint2 *) particleHash, + cellStart +#else + (float4*)oldPos, (float4*)oldVel, + gridCounters, + gridCells +#endif + ); + + // check if kernel invocation generated an error + CUT_CHECK_ERROR("Kernel execution failed"); + + MY_CUDA_SAFE_CALL(cudaGLUnmapBufferObject(vboNewPos)); + MY_CUDA_SAFE_CALL(cudaGLUnmapBufferObject(vboOldPos)); + +#if USE_TEX + MY_CUDA_SAFE_CALL(cudaUnbindTexture(oldPosTex)); + MY_CUDA_SAFE_CALL(cudaUnbindTexture(oldVelTex)); + +#if USE_SORT + MY_CUDA_SAFE_CALL(cudaUnbindTexture(particleHashTex)); + MY_CUDA_SAFE_CALL(cudaUnbindTexture(cellStartTex)); +#else + MY_CUDA_SAFE_CALL(cudaUnbindTexture(gridCountersTex)); + MY_CUDA_SAFE_CALL(cudaUnbindTexture(gridCellsTex)); +#endif +#endif +} + +} // extern "C" diff --git a/BulletPhysics/bulletTrunk/Extras/CUDA/particleSystem.cuh b/BulletPhysics/bulletTrunk/Extras/CUDA/particleSystem.cuh new file mode 100644 index 00000000..c85a2a85 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CUDA/particleSystem.cuh @@ -0,0 +1,57 @@ +extern "C" +{ +void cudaInit(int argc, char **argv); + +void allocateArray(void **devPtr, int size); +void freeArray(void *devPtr); + +void threadSync(); + +void copyArrayFromDevice(void* host, const void* device, unsigned int vbo, int size); +void copyArrayToDevice(void* device, const void* host, int offset, int size); +void registerGLBufferObject(unsigned int vbo); +void unregisterGLBufferObject(unsigned int vbo); + +void setParameters(SimParams *hostParams); + +void +integrateSystem(uint vboOldPos, uint vboNewPos, + float* oldVel, float* newVel, + float deltaTime, + int numBodies); + +void +updateGrid(uint vboPos, + uint* gridCounters, + uint* gridCells, + uint numBodies, + uint numCells); + +void +calcHash(uint vboPos, + uint* particleHash, + int numBodies); + +void +reorderDataAndFindCellStart(uint* particleHash, + uint vboOldPos, + float* oldVel, + float* sortedPos, + float* sortedVel, + uint* cellStart, + uint numBodies, + uint numCells); + +void +collide(uint vboOldPos, uint vboNewPos, + float* sortedPos, float* sortedVel, + float* oldVel, float* newVel, + uint* gridCounters, + uint* gridCells, + uint* particleHash, + uint* cellStart, + uint numBodies, + uint numCells, + uint maxParticlesPerCell); + +} diff --git a/BulletPhysics/bulletTrunk/Extras/CUDA/particleSystem.h b/BulletPhysics/bulletTrunk/Extras/CUDA/particleSystem.h new file mode 100644 index 00000000..bbd2413e --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CUDA/particleSystem.h @@ -0,0 +1,193 @@ +/* + * Copyright 1993-2006 NVIDIA Corporation. All rights reserved. + * + * NOTICE TO USER: + * + * This source code is subject to NVIDIA ownership rights under U.S. and + * international Copyright laws. + * + * NVIDIA MAKES NO REPRESENTATION ABOUT THE SUITABILITY OF THIS SOURCE + * CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR + * IMPLIED WARRANTY OF ANY KIND. NVIDIA DISCLAIMS ALL WARRANTIES WITH + * REGARD TO THIS SOURCE CODE, INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE. + * IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL, + * OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS + * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE + * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE + * OR PERFORMANCE OF THIS SOURCE CODE. + * + * U.S. Government End Users. This source code is a "commercial item" as + * that term is defined at 48 C.F.R. 2.101 (OCT 1995), consisting of + * "commercial computer software" and "commercial computer software + * documentation" as such terms are used in 48 C.F.R. 12.212 (SEPT 1995) + * and is provided to the U.S. Government only as a commercial end item. + * Consistent with 48 C.F.R.12.212 and 48 C.F.R. 227.7202-1 through + * 227.7202-4 (JUNE 1995), all U.S. Government End Users acquire the + * source code with only those rights set forth herein. + */ + +#ifndef __BODYSYSTEMCUDA_H__ +#define __BODYSYSTEMCUDA_H__ + +#define DEBUG_GRID 0 +#define DO_TIMING 0 + +#include "particles_kernel.cuh" +#include "vector_functions.h" + +#include "LinearMath/btAlignedObjectArray.h" + +// CUDA BodySystem: runs on the GPU +class ParticleSystem +{ +public: + ParticleSystem(uint numParticles, uint3 gridSize); + ~ParticleSystem(); + + enum ParticleConfig + { + CONFIG_RANDOM, + CONFIG_GRID, + _NUM_CONFIGS + }; + + enum ParticleArray + { + POSITION, + VELOCITY, + }; + + enum SimulationMode + { + SIMULATION_CUDA, + SIMULATION_BULLET_CPU, + SIMULATION_NUM_MODES + }; + + + void update(float deltaTime); + void updateCuda(float deltaTime); + void updateBullet(float deltaTime); + void reset(ParticleConfig config); + + float* getArray(ParticleArray array); + void setArray(ParticleArray array, const float* data, int start, int count); + + int getNumParticles() const { return m_numParticles; } + + unsigned int getCurrentReadBuffer() const { return m_posVbo[m_currentPosRead]; } + unsigned int getColorBuffer() const { return m_colorVBO; } + + void dumpGrid(); + void dumpParticles(uint start, uint count); + + void setIterations(int i) { m_solverIterations = i; } + + void setDamping(float x) { m_params.globalDamping = x; } + void setGravity(float x) { m_params.gravity = make_float3(0.0f, x, 0.0f); } + + void setCollideSpring(float x) { m_params.spring = x; } + void setCollideDamping(float x) { m_params.damping = x; } + void setCollideShear(float x) { m_params.shear = x; } + void setCollideAttraction(float x) { m_params.attraction = x; } + + void setColliderPos(float4 x) { m_params.colliderPos = x; } + + float getParticleRadius() { return m_params.particleRadius; } + float4 getColliderPos() { return m_params.colliderPos; } + float getColliderRadius() { return m_params.colliderRadius; } + uint3 getGridSize() { return m_params.gridSize; } + float3 getWorldOrigin() { return m_params.worldOrigin; } + float3 getCellSize() { return m_params.cellSize; } + + void addSphere(int index, float *pos, float *vel, int r, float spacing); + + SimulationMode getSimulationMode() const + { + return m_simulationMode; + } + + void setSimulationMode(SimulationMode mode) + { + m_simulationMode=mode; + } + + void debugDraw(); + +protected: // methods + ParticleSystem() {} + uint createVBO(uint size); + + void _initialize(int numParticles); + void _finalize(); + + void initGrid(uint *size, float spacing, float jitter, uint numParticles); + + +protected: + // Bullet data + void initializeBullet(); + void finalizeBullet(); + class btDiscreteDynamicsWorld* m_dynamicsWorld; + class btDefaultCollisionConfiguration* m_collisionConfiguration; + class btCollisionDispatcher* m_dispatcher; +// class btCudaBroadphase* m_broadphase; + class btBroadphaseInterface* m_broadphase; + class btSequentialImpulseConstraintSolver* m_constraintSolver; + btAlignedObjectArray m_bulletParticles; + btRigidBody* m_bulletCollider; + + + float* copyBuffersFromDeviceToHost(); + void copyBuffersFromHostToDevice(); + +protected: // data + bool m_bInitialized; + uint m_numParticles; + + // CPU data + float* m_hPos; + float* m_hVel; + + uint* m_hGridCounters; + uint* m_hGridCells; + + uint* m_hParticleHash; + uint* m_hCellStart; + + // GPU data + float* m_dPos[2]; + float* m_dVel[2]; + + float* m_dSortedPos; + float* m_dSortedVel; + + // uniform grid data + uint* m_dGridCounters; // counts number of entries per grid cell + uint* m_dGridCells; // contains indices of up to "m_maxParticlesPerCell" particles per cell + + uint* m_dParticleHash[2]; + uint* m_dCellStart; + + uint m_posVbo[2]; + uint m_colorVBO; + + uint m_currentPosRead, m_currentVelRead; + uint m_currentPosWrite, m_currentVelWrite; + + // params + SimParams m_params; + uint3 m_gridSize; + uint m_numGridCells; + uint m_maxParticlesPerCell; + + uint m_timer; + + uint m_solverIterations; + + SimulationMode m_simulationMode; + +}; + +#endif // __BODYSYSTEMCUDA_H__ diff --git a/BulletPhysics/bulletTrunk/Extras/CUDA/particles.cpp b/BulletPhysics/bulletTrunk/Extras/CUDA/particles.cpp new file mode 100644 index 00000000..2cea89d0 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CUDA/particles.cpp @@ -0,0 +1,571 @@ +/* + * Copyright 1993-2007 NVIDIA Corporation. All rights reserved. + * + * NOTICE TO USER: + * + * This source code is subject to NVIDIA ownership rights under U.S. and + * international Copyright laws. + * + * NVIDIA MAKES NO REPRESENTATION ABOUT THE SUITABILITY OF THIS SOURCE + * CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR + * IMPLIED WARRANTY OF ANY KIND. NVIDIA DISCLAIMS ALL WARRANTIES WITH + * REGARD TO THIS SOURCE CODE, INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE. + * IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL, + * OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS + * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE + * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE + * OR PERFORMANCE OF THIS SOURCE CODE. + * + * U.S. Government End Users. This source code is a "commercial item" as + * that term is defined at 48 C.F.R. 2.101 (OCT 1995), consisting of + * "commercial computer software" and "commercial computer software + * documentation" as such terms are used in 48 C.F.R. 12.212 (SEPT 1995) + * and is provided to the U.S. Government only as a commercial end item. + * Consistent with 48 C.F.R.12.212 and 48 C.F.R. 227.7202-1 through + * 227.7202-4 (JUNE 1995), all U.S. Government End Users acquire the + * source code with only those rights set forth herein. + */ + +/* + Particle system example with collisions using uniform grid +*/ + +#include +#include +#include +#include +//#include + +#include + +#if defined(__APPLE__) || defined(MACOSX) +#include +#else +#include +#endif + +#include "LinearMath/btQuickprof.h" + +#include "particleSystem.h" +#include "render_particles.h" +#include "paramgl.h" + +// view params +int ox, oy; +int buttonState = 0; +float camera_trans[] = {0, 0, -3}; +float camera_rot[] = {0, 0, 0}; +float camera_trans_lag[] = {0, 0, -3}; +float camera_rot_lag[] = {0, 0, 0}; +const float inertia = 0.1; +ParticleRenderer::DisplayMode displayMode = ParticleRenderer::PARTICLE_SPHERES; + +int mode = 0; +bool displayEnabled = true; +bool bPause = false; +bool displaySliders = false; +bool wireframe = false; + +enum { M_VIEW = 0, M_MOVE }; + +uint numParticles = 0; +uint3 gridSize; +int numIterations = 0; // run until exit + +// simulation parameters +float timestep = 0.5f; +float damping = 1.0f; +float gravity = 0.0003f; +int iterations = 1; +int ballr = 10; + +float collideSpring = 0.5f;; +float collideDamping = 0.02f;; +float collideShear = 0.1f; +float collideAttraction = 0.0f; + +ParticleSystem *psystem = 0; + +// fps +static int fpsCount = 0; +static int fpsLimit = 1; +unsigned int timer; + +ParticleRenderer *renderer = 0; + +float modelView[16]; + +ParamListGL *params; + +extern "C" void cudaInit(int argc, char **argv); + +void init(int numParticles, uint3 gridSize) +{ + psystem = new ParticleSystem(numParticles, gridSize); + psystem->reset(ParticleSystem::CONFIG_GRID); + + renderer = new ParticleRenderer; + renderer->setParticleRadius(psystem->getParticleRadius()); + renderer->setColorBuffer(psystem->getColorBuffer()); + +// CUT_SAFE_CALL(cutCreateTimer(&timer)); +} + +void initGL() +{ + glewInit(); + if (!glewIsSupported("GL_VERSION_2_0 GL_VERSION_1_5 GL_ARB_multitexture GL_ARB_vertex_buffer_object")) { + fprintf(stderr, "Required OpenGL extensions missing."); + exit(-1); + } + + glEnable(GL_DEPTH_TEST); + glClearColor(0.25, 0.25, 0.25, 1.0); + + glutReportErrors(); +} + + +void display() +{ + // update the simulation + if (!bPause) + { + psystem->setIterations(iterations); + psystem->setDamping(damping); + psystem->setGravity(-gravity); + psystem->setCollideSpring(collideSpring); + psystem->setCollideDamping(collideDamping); + psystem->setCollideShear(collideShear); + psystem->setCollideAttraction(collideAttraction); + + psystem->update(timestep); + renderer->setVertexBuffer(psystem->getCurrentReadBuffer(), psystem->getNumParticles()); + } + + // render + glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + + // view transform + glMatrixMode(GL_MODELVIEW); + glLoadIdentity(); + for (int c = 0; c < 3; ++c) + { + camera_trans_lag[c] += (camera_trans[c] - camera_trans_lag[c]) * inertia; + camera_rot_lag[c] += (camera_rot[c] - camera_rot_lag[c]) * inertia; + } + glTranslatef(camera_trans_lag[0], camera_trans_lag[1], camera_trans_lag[2]); + glRotatef(camera_rot_lag[0], 1.0, 0.0, 0.0); + glRotatef(camera_rot_lag[1], 0.0, 1.0, 0.0); + + glGetFloatv(GL_MODELVIEW_MATRIX, modelView); + + // cube + glColor3f(1.0, 1.0, 1.0); + glutWireCube(2.0); + + // collider + glPushMatrix(); + float4 p = psystem->getColliderPos(); + glTranslatef(p.x, p.y, p.z); + glColor3f(1.0, 0.0, 0.0); + glutSolidSphere(psystem->getColliderRadius(), 20, 10); + glPopMatrix(); + + if (displayEnabled) + { + renderer->display(displayMode); + } + + if (displaySliders) { + glDisable(GL_DEPTH_TEST); + glBlendFunc(GL_ONE_MINUS_DST_COLOR, GL_ZERO); // invert color + glEnable(GL_BLEND); + params->Render(0, 0); + glDisable(GL_BLEND); + glEnable(GL_DEPTH_TEST); + } + + psystem->debugDraw(); + + glDisable(GL_DEPTH_TEST); + float offsX = 10.f; + float offsY = 10.f; + renderer->showProfileInfo(offsX, offsY, 20.f); + glEnable(GL_DEPTH_TEST); + + + glutSwapBuffers(); + + { + char fps[256]; + //float ifps = 1.f / (cutGetAverageTimerValue(timer) / 1000.f); + switch (psystem->getSimulationMode()) + { + case ParticleSystem::SIMULATION_CUDA: + { + sprintf(fps, "CUDA particles (%d particles)", numParticles); + break; + } + case ParticleSystem::SIMULATION_BULLET_CPU: + { + sprintf(fps, "Bullet btCudaBroadphase (%d btSphereShapes)", numParticles); + break; + } + default: + { + sprintf(fps, "Unknown simulation mode"); + } + } + glutSetWindowTitle(fps); + } + + glutReportErrors(); + +} + +void reshape(int w, int h) +{ + glMatrixMode(GL_PROJECTION); + glLoadIdentity(); + gluPerspective(60.0, (float) w / (float) h, 0.1, 10.0); + + glMatrixMode(GL_MODELVIEW); + glViewport(0, 0, w, h); + + renderer->setWindowSize(w, h); + renderer->setFOV(60.0); +} + +void mouse(int button, int state, int x, int y) +{ + int mods; + + if (state == GLUT_DOWN) + buttonState |= 1<Mouse(x, y, button, state)) { + glutPostRedisplay(); + return; + } + } + + glutPostRedisplay(); +} + +// transfrom vector by matrix +void xform(float *v, float *r, GLfloat *m) +{ + r[0] = v[0]*m[0] + v[1]*m[4] + v[2]*m[8] + m[12]; + r[1] = v[0]*m[1] + v[1]*m[5] + v[2]*m[9] + m[13]; + r[2] = v[0]*m[2] + v[1]*m[6] + v[2]*m[10] + m[14]; +} + +// transform vector by transpose of matrix +void ixform(float *v, float *r, GLfloat *m) +{ + r[0] = v[0]*m[0] + v[1]*m[1] + v[2]*m[2]; + r[1] = v[0]*m[4] + v[1]*m[5] + v[2]*m[6]; + r[2] = v[0]*m[8] + v[1]*m[9] + v[2]*m[10]; +} + +void ixformPoint(float *v, float *r, GLfloat *m) +{ + float x[4]; + x[0] = v[0] - m[12]; + x[1] = v[1] - m[13]; + x[2] = v[2] - m[14]; + x[3] = 1.0f; + ixform(x, r, m); +} + +void motion(int x, int y) +{ + float dx, dy; + dx = x - ox; + dy = y - oy; + + if (displaySliders) { + if (params->Motion(x, y)) { + ox = x; oy = y; + glutPostRedisplay(); + return; + } + } + + switch(mode) + { + case M_VIEW: + if (buttonState == 3) { + // left+middle = zoom + camera_trans[2] += (dy / 100.0) * 0.5 * fabs(camera_trans[2]); + } + else if (buttonState & 2) { + // middle = translate + camera_trans[0] += dx / 100.0; + camera_trans[1] -= dy / 100.0; + } + else if (buttonState & 1) { + // left = rotate + camera_rot[0] += dy / 5.0; + camera_rot[1] += dx / 5.0; + } + break; + + case M_MOVE: + { + float translateSpeed = 0.003f; + float4 p = psystem->getColliderPos(); + if (buttonState==1) { + float v[3], r[3]; + v[0] = dx*translateSpeed; + v[1] = -dy*translateSpeed; + v[2] = 0.0f; + ixform(v, r, modelView); + p.x += r[0]; + p.y += r[1]; + p.z += r[2]; + } else if (buttonState==2) { + float v[3], r[3]; + v[0] = 0.0f; + v[1] = 0.0f; + v[2] = dy*translateSpeed; + ixform(v, r, modelView); + p.x += r[0]; + p.y += r[1]; + p.z += r[2]; + } + psystem->setColliderPos(p); + } + break; + } + + ox = x; oy = y; + glutPostRedisplay(); +} + +inline float frand() +{ + return rand() / (float) RAND_MAX; +} + +// commented out to remove unused parameter warnings in Linux +void key(unsigned char key, int /*x*/, int /*y*/) +{ +#ifndef BT_NO_PROFILE + if (key >= 0x31 && key < 0x37) + { + int child = key-0x31; + renderer->m_profileIterator->Enter_Child(child); + } + if (key==0x30) + { + renderer->m_profileIterator->Enter_Parent(); + } +#endif //BT_NO_PROFILE + + switch (key) + { + case ' ': + bPause = !bPause; + break; + case 13: + psystem->update(timestep); + renderer->setVertexBuffer(psystem->getCurrentReadBuffer(), psystem->getNumParticles()); + break; + case '\033': + case 'q': + exit(0); + break; + case 'v': + mode = M_VIEW; + break; + case 'm': + mode = M_MOVE; + break; + case 'p': + displayMode = (ParticleRenderer::DisplayMode) + ((displayMode + 1) % ParticleRenderer::PARTICLE_NUM_MODES); + break; + case 'd': + psystem->dumpGrid(); + break; + case 'u': + psystem->dumpParticles(0, 1); + break; + + case 'r': + displayEnabled = !displayEnabled; + break; + + case 'g': + psystem->reset(ParticleSystem::CONFIG_GRID); + break; + case 'a': + psystem->reset(ParticleSystem::CONFIG_RANDOM); + break; + case 'e': + { + // inject a sphere of particles + float pr = psystem->getParticleRadius(); + float tr = pr+(pr*2.0f)*ballr; + float pos[4], vel[4]; + pos[0] = -1.0 + tr + frand()*(2.0f - tr*2.0f); + pos[1] = 1.0f - tr; + pos[2] = -1.0 + tr + frand()*(2.0f - tr*2.0f); + pos[3] = 0.0f; + vel[0] = vel[1] = vel[2] = vel[3] = 0.0f; + psystem->addSphere(0, pos, vel, ballr, pr*2.0f); + } + break; + case 'b': + { + // shoot ball from camera + float pr = psystem->getParticleRadius(); + float vel[4], velw[4], pos[4], posw[4]; + vel[0] = 0.0f; + vel[1] = 0.0f; + vel[2] = -0.05f; + vel[3] = 0.0f; + ixform(vel, velw, modelView); + + pos[0] = 0.0f; + pos[1] = 0.0f; + pos[2] = -2.5f; + pos[3] = 1.0; + ixformPoint(pos, posw, modelView); + posw[3] = 0.0f; + + psystem->addSphere(0, posw, velw, ballr, pr*2.0f); + } + break; + + case 'w': + wireframe = !wireframe; + break; + + case 'h': + displaySliders = !displaySliders; + break; + case 's': + psystem->setSimulationMode((ParticleSystem::SimulationMode) ((psystem->getSimulationMode() + 1) % ParticleSystem::SIMULATION_NUM_MODES)); + CProfileManager::CleanupMemory(); + break; + } + + glutPostRedisplay(); +} + +void special(int k, int x, int y) +{ + if (displaySliders) { + params->Special(k, x, y); + } +} + +void idle(void) +{ + glutPostRedisplay(); +} + +void initParams() +{ + // create a new parameter list + params = new ParamListGL("misc"); + params->AddParam(new Param("time step", timestep, 0.0, 1.0, 0.01, ×tep)); + params->AddParam(new Param("iterations", iterations, 0, 10, 1, &iterations)); + params->AddParam(new Param("damping", damping, 0.0, 1.0, 0.001, &damping)); + params->AddParam(new Param("gravity", gravity, 0.0, 0.001, 0.0001, &gravity)); + params->AddParam(new Param("ball r", ballr, 1, 20, 1, &ballr)); + + params->AddParam(new Param("collide spring", collideSpring, 0.0, 1.0, 0.001, &collideSpring)); + params->AddParam(new Param("collide damping", collideDamping, 0.0, 0.1, 0.001, &collideDamping)); + params->AddParam(new Param("collide shear", collideShear, 0.0, 0.1, 0.001, &collideShear)); + params->AddParam(new Param("collide attract", collideAttraction, 0.0, 0.1, 0.001, &collideAttraction)); +} + +void mainMenu(int i) +{ + key((unsigned char) i, 0, 0); +} + +void initMenus() +{ + glutCreateMenu(mainMenu); + glutAddMenuEntry("Reset block [g]", 'g'); + glutAddMenuEntry("Reset random [a]", 'a'); + glutAddMenuEntry("Add sphere [e]", 'e'); + glutAddMenuEntry("Shoot ball [b]", 'b'); + glutAddMenuEntry("View mode [v]", 'v'); + glutAddMenuEntry("Move cursor mode [m]", 'm'); + glutAddMenuEntry("Toggle point rendering [p]", 'p'); + glutAddMenuEntry("Toggle Bullet simulation[s]", 's'); + glutAddMenuEntry("Toggle animation [ ]", ' '); + glutAddMenuEntry("Step animation [ret]", 13); + glutAddMenuEntry("Toggle sliders [h]", 'h'); + glutAddMenuEntry("Quit (esc)", '\033'); + glutAttachMenu(GLUT_RIGHT_BUTTON); +} + +//////////////////////////////////////////////////////////////////////////////// +// Program main +//////////////////////////////////////////////////////////////////////////////// +int +main(int argc, char** argv) +{ +// numParticles = 65536*2; +// numParticles = 65536; +// numParticles = 32768; +// numParticles = 8192; +// numParticles = 4096; + numParticles = 2048; +// numParticles = 1024; +// numParticles = 256; +// numParticles = 32; +// numParticles = 2; + uint gridDim = 64; + numIterations = 0; + + gridSize.x = gridSize.y = gridSize.z = gridDim; + printf("grid: %d x %d x %d = %d cells\n", gridSize.x, gridSize.y, gridSize.z, gridSize.x*gridSize.y*gridSize.z); + + cudaInit(argc, argv); + + glutInit(&argc, argv); + glutInitDisplayMode(GLUT_RGB | GLUT_DEPTH | GLUT_DOUBLE); + glutInitWindowSize(640, 480); + glutCreateWindow("CUDA particles"); + + initGL(); + init(numParticles, gridSize); + initParams(); + initMenus(); + + glutDisplayFunc(display); + glutReshapeFunc(reshape); + glutMouseFunc(mouse); + glutMotionFunc(motion); + glutKeyboardFunc(key); + glutSpecialFunc(special); + glutIdleFunc(idle); + + glutMainLoop(); + + if (psystem) + delete psystem; + + return 0; +} diff --git a/BulletPhysics/bulletTrunk/Extras/CUDA/particles.sln b/BulletPhysics/bulletTrunk/Extras/CUDA/particles.sln new file mode 100644 index 00000000..52346d75 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CUDA/particles.sln @@ -0,0 +1,228 @@ + +Microsoft Visual Studio Solution File, Format Version 9.00 +# Visual Studio 2005 +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "particles", "particles.vcproj", "{AF7F45C7-8545-4CA2-B835-FDE8823B7B09}" + ProjectSection(ProjectDependencies) = postProject + {F74E8E02-0B47-4816-BD0B-FAEAE3343165} = {F74E8E02-0B47-4816-BD0B-FAEAE3343165} + {7C428E76-9271-6284-20F0-9B38ED6931E3} = {7C428E76-9271-6284-20F0-9B38ED6931E3} + {61BD1097-CF2E-B296-DAA9-73A6FE135319} = {61BD1097-CF2E-B296-DAA9-73A6FE135319} + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} = {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} + EndProjectSection +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libbulletcollision", "..\..\msvc\8\libbulletcollision.vcproj", "{6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libbulletmath", "..\..\msvc\8\libbulletmath.vcproj", "{7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libbulletdynamics", "..\..\msvc\8\libbulletdynamics.vcproj", "{61BD1097-CF2E-B296-DAA9-73A6FE135319}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libbulletcuda", "libbulletcuda.vcproj", "{F74E8E02-0B47-4816-BD0B-FAEAE3343165}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "libbulletopenglsupport", "..\..\msvc\8\libbulletopenglsupport.vcproj", "{7C428E76-9271-6284-20F0-9B38ED6931E3}" +EndProject +Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "appBasicDemo", "..\..\msvc\8\appBasicDemo.vcproj", "{3578834A-4B06-DE6F-78AC-FE11F7226D35}" + ProjectSection(ProjectDependencies) = postProject + {F74E8E02-0B47-4816-BD0B-FAEAE3343165} = {F74E8E02-0B47-4816-BD0B-FAEAE3343165} + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} = {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE} + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} = {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A} + {61BD1097-CF2E-B296-DAA9-73A6FE135319} = {61BD1097-CF2E-B296-DAA9-73A6FE135319} + {7C428E76-9271-6284-20F0-9B38ED6931E3} = {7C428E76-9271-6284-20F0-9B38ED6931E3} + EndProjectSection +EndProject +Global + GlobalSection(SolutionConfigurationPlatforms) = preSolution + Debug|Win32 = Debug|Win32 + Debug|x64 = Debug|x64 + DebugDll|Win32 = DebugDll|Win32 + DebugDll|x64 = DebugDll|x64 + DebugDoublePrecision|Win32 = DebugDoublePrecision|Win32 + DebugDoublePrecision|x64 = DebugDoublePrecision|x64 + EmuDebug|Win32 = EmuDebug|Win32 + EmuDebug|x64 = EmuDebug|x64 + EmuRelease|Win32 = EmuRelease|Win32 + EmuRelease|x64 = EmuRelease|x64 + Release|Win32 = Release|Win32 + Release|x64 = Release|x64 + ReleaseDll|Win32 = ReleaseDll|Win32 + ReleaseDll|x64 = ReleaseDll|x64 + ReleaseDoublePrecision|Win32 = ReleaseDoublePrecision|Win32 + ReleaseDoublePrecision|x64 = ReleaseDoublePrecision|x64 + EndGlobalSection + GlobalSection(ProjectConfigurationPlatforms) = postSolution + {AF7F45C7-8545-4CA2-B835-FDE8823B7B09}.Debug|Win32.ActiveCfg = Debug|Win32 + {AF7F45C7-8545-4CA2-B835-FDE8823B7B09}.Debug|Win32.Build.0 = Debug|Win32 + {AF7F45C7-8545-4CA2-B835-FDE8823B7B09}.Debug|x64.ActiveCfg = Debug|x64 + {AF7F45C7-8545-4CA2-B835-FDE8823B7B09}.Debug|x64.Build.0 = Debug|x64 + {AF7F45C7-8545-4CA2-B835-FDE8823B7B09}.DebugDll|Win32.ActiveCfg = Debug|x64 + {AF7F45C7-8545-4CA2-B835-FDE8823B7B09}.DebugDll|x64.ActiveCfg = Debug|x64 + {AF7F45C7-8545-4CA2-B835-FDE8823B7B09}.DebugDll|x64.Build.0 = Debug|x64 + {AF7F45C7-8545-4CA2-B835-FDE8823B7B09}.DebugDoublePrecision|Win32.ActiveCfg = Debug|x64 + {AF7F45C7-8545-4CA2-B835-FDE8823B7B09}.DebugDoublePrecision|x64.ActiveCfg = Debug|x64 + {AF7F45C7-8545-4CA2-B835-FDE8823B7B09}.DebugDoublePrecision|x64.Build.0 = Debug|x64 + {AF7F45C7-8545-4CA2-B835-FDE8823B7B09}.EmuDebug|Win32.ActiveCfg = EmuDebug|Win32 + {AF7F45C7-8545-4CA2-B835-FDE8823B7B09}.EmuDebug|Win32.Build.0 = EmuDebug|Win32 + {AF7F45C7-8545-4CA2-B835-FDE8823B7B09}.EmuDebug|x64.ActiveCfg = EmuDebug|x64 + {AF7F45C7-8545-4CA2-B835-FDE8823B7B09}.EmuDebug|x64.Build.0 = EmuDebug|x64 + {AF7F45C7-8545-4CA2-B835-FDE8823B7B09}.EmuRelease|Win32.ActiveCfg = EmuRelease|Win32 + {AF7F45C7-8545-4CA2-B835-FDE8823B7B09}.EmuRelease|Win32.Build.0 = EmuRelease|Win32 + {AF7F45C7-8545-4CA2-B835-FDE8823B7B09}.EmuRelease|x64.ActiveCfg = EmuRelease|x64 + {AF7F45C7-8545-4CA2-B835-FDE8823B7B09}.EmuRelease|x64.Build.0 = EmuRelease|x64 + {AF7F45C7-8545-4CA2-B835-FDE8823B7B09}.Release|Win32.ActiveCfg = Release|Win32 + {AF7F45C7-8545-4CA2-B835-FDE8823B7B09}.Release|Win32.Build.0 = Release|Win32 + {AF7F45C7-8545-4CA2-B835-FDE8823B7B09}.Release|x64.ActiveCfg = Release|x64 + {AF7F45C7-8545-4CA2-B835-FDE8823B7B09}.Release|x64.Build.0 = Release|x64 + {AF7F45C7-8545-4CA2-B835-FDE8823B7B09}.ReleaseDll|Win32.ActiveCfg = Release|x64 + {AF7F45C7-8545-4CA2-B835-FDE8823B7B09}.ReleaseDll|x64.ActiveCfg = Release|x64 + {AF7F45C7-8545-4CA2-B835-FDE8823B7B09}.ReleaseDll|x64.Build.0 = Release|x64 + {AF7F45C7-8545-4CA2-B835-FDE8823B7B09}.ReleaseDoublePrecision|Win32.ActiveCfg = Release|x64 + {AF7F45C7-8545-4CA2-B835-FDE8823B7B09}.ReleaseDoublePrecision|x64.ActiveCfg = Release|x64 + {AF7F45C7-8545-4CA2-B835-FDE8823B7B09}.ReleaseDoublePrecision|x64.Build.0 = Release|x64 + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.Debug|Win32.ActiveCfg = Debug|Win32 + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.Debug|Win32.Build.0 = Debug|Win32 + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.Debug|x64.ActiveCfg = Debug|Win32 + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.DebugDll|Win32.ActiveCfg = DebugDll|Win32 + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.DebugDll|Win32.Build.0 = DebugDll|Win32 + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.DebugDll|x64.ActiveCfg = DebugDll|Win32 + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.DebugDoublePrecision|Win32.ActiveCfg = DebugDoublePrecision|Win32 + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.DebugDoublePrecision|Win32.Build.0 = DebugDoublePrecision|Win32 + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.DebugDoublePrecision|x64.ActiveCfg = DebugDoublePrecision|Win32 + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.EmuDebug|Win32.ActiveCfg = Debug|Win32 + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.EmuDebug|Win32.Build.0 = Debug|Win32 + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.EmuDebug|x64.ActiveCfg = Debug|Win32 + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.EmuRelease|Win32.ActiveCfg = Release|Win32 + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.EmuRelease|Win32.Build.0 = Release|Win32 + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.EmuRelease|x64.ActiveCfg = Release|Win32 + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.Release|Win32.ActiveCfg = Release|Win32 + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.Release|Win32.Build.0 = Release|Win32 + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.Release|x64.ActiveCfg = Release|Win32 + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.ReleaseDll|Win32.ActiveCfg = ReleaseDll|Win32 + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.ReleaseDll|Win32.Build.0 = ReleaseDll|Win32 + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.ReleaseDll|x64.ActiveCfg = ReleaseDll|Win32 + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.ReleaseDoublePrecision|Win32.ActiveCfg = ReleaseDoublePrecision|Win32 + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.ReleaseDoublePrecision|Win32.Build.0 = ReleaseDoublePrecision|Win32 + {6ADA430D-009C-2ED4-A787-2AC2D6FEB8CE}.ReleaseDoublePrecision|x64.ActiveCfg = ReleaseDoublePrecision|Win32 + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.Debug|Win32.ActiveCfg = Debug|Win32 + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.Debug|Win32.Build.0 = Debug|Win32 + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.Debug|x64.ActiveCfg = Debug|Win32 + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.DebugDll|Win32.ActiveCfg = DebugDll|Win32 + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.DebugDll|Win32.Build.0 = DebugDll|Win32 + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.DebugDll|x64.ActiveCfg = DebugDll|Win32 + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.DebugDoublePrecision|Win32.ActiveCfg = DebugDoublePrecision|Win32 + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.DebugDoublePrecision|Win32.Build.0 = DebugDoublePrecision|Win32 + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.DebugDoublePrecision|x64.ActiveCfg = DebugDoublePrecision|Win32 + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.EmuDebug|Win32.ActiveCfg = Debug|Win32 + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.EmuDebug|Win32.Build.0 = Debug|Win32 + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.EmuDebug|x64.ActiveCfg = Debug|Win32 + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.EmuRelease|Win32.ActiveCfg = Release|Win32 + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.EmuRelease|Win32.Build.0 = Release|Win32 + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.EmuRelease|x64.ActiveCfg = Release|Win32 + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.Release|Win32.ActiveCfg = Release|Win32 + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.Release|Win32.Build.0 = Release|Win32 + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.Release|x64.ActiveCfg = Release|Win32 + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.ReleaseDll|Win32.ActiveCfg = ReleaseDll|Win32 + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.ReleaseDll|Win32.Build.0 = ReleaseDll|Win32 + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.ReleaseDll|x64.ActiveCfg = ReleaseDll|Win32 + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.ReleaseDoublePrecision|Win32.ActiveCfg = ReleaseDoublePrecision|Win32 + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.ReleaseDoublePrecision|Win32.Build.0 = ReleaseDoublePrecision|Win32 + {7D6E339F-9C2C-31DA-FDB0-5EE50973CF2A}.ReleaseDoublePrecision|x64.ActiveCfg = ReleaseDoublePrecision|Win32 + {61BD1097-CF2E-B296-DAA9-73A6FE135319}.Debug|Win32.ActiveCfg = Debug|Win32 + {61BD1097-CF2E-B296-DAA9-73A6FE135319}.Debug|Win32.Build.0 = Debug|Win32 + {61BD1097-CF2E-B296-DAA9-73A6FE135319}.Debug|x64.ActiveCfg = Debug|Win32 + {61BD1097-CF2E-B296-DAA9-73A6FE135319}.DebugDll|Win32.ActiveCfg = DebugDll|Win32 + {61BD1097-CF2E-B296-DAA9-73A6FE135319}.DebugDll|Win32.Build.0 = DebugDll|Win32 + {61BD1097-CF2E-B296-DAA9-73A6FE135319}.DebugDll|x64.ActiveCfg = DebugDll|Win32 + {61BD1097-CF2E-B296-DAA9-73A6FE135319}.DebugDoublePrecision|Win32.ActiveCfg = DebugDoublePrecision|Win32 + {61BD1097-CF2E-B296-DAA9-73A6FE135319}.DebugDoublePrecision|Win32.Build.0 = DebugDoublePrecision|Win32 + {61BD1097-CF2E-B296-DAA9-73A6FE135319}.DebugDoublePrecision|x64.ActiveCfg = DebugDoublePrecision|Win32 + {61BD1097-CF2E-B296-DAA9-73A6FE135319}.EmuDebug|Win32.ActiveCfg = Debug|Win32 + {61BD1097-CF2E-B296-DAA9-73A6FE135319}.EmuDebug|Win32.Build.0 = Debug|Win32 + {61BD1097-CF2E-B296-DAA9-73A6FE135319}.EmuDebug|x64.ActiveCfg = Debug|Win32 + {61BD1097-CF2E-B296-DAA9-73A6FE135319}.EmuRelease|Win32.ActiveCfg = Release|Win32 + {61BD1097-CF2E-B296-DAA9-73A6FE135319}.EmuRelease|Win32.Build.0 = Release|Win32 + {61BD1097-CF2E-B296-DAA9-73A6FE135319}.EmuRelease|x64.ActiveCfg = Release|Win32 + {61BD1097-CF2E-B296-DAA9-73A6FE135319}.Release|Win32.ActiveCfg = Release|Win32 + {61BD1097-CF2E-B296-DAA9-73A6FE135319}.Release|Win32.Build.0 = Release|Win32 + {61BD1097-CF2E-B296-DAA9-73A6FE135319}.Release|x64.ActiveCfg = Release|Win32 + {61BD1097-CF2E-B296-DAA9-73A6FE135319}.ReleaseDll|Win32.ActiveCfg = ReleaseDll|Win32 + {61BD1097-CF2E-B296-DAA9-73A6FE135319}.ReleaseDll|Win32.Build.0 = ReleaseDll|Win32 + {61BD1097-CF2E-B296-DAA9-73A6FE135319}.ReleaseDll|x64.ActiveCfg = ReleaseDll|Win32 + {61BD1097-CF2E-B296-DAA9-73A6FE135319}.ReleaseDoublePrecision|Win32.ActiveCfg = ReleaseDoublePrecision|Win32 + {61BD1097-CF2E-B296-DAA9-73A6FE135319}.ReleaseDoublePrecision|Win32.Build.0 = ReleaseDoublePrecision|Win32 + {61BD1097-CF2E-B296-DAA9-73A6FE135319}.ReleaseDoublePrecision|x64.ActiveCfg = ReleaseDoublePrecision|Win32 + {F74E8E02-0B47-4816-BD0B-FAEAE3343165}.Debug|Win32.ActiveCfg = Debug|Win32 + {F74E8E02-0B47-4816-BD0B-FAEAE3343165}.Debug|Win32.Build.0 = Debug|Win32 + {F74E8E02-0B47-4816-BD0B-FAEAE3343165}.Debug|x64.ActiveCfg = Debug|Win32 + {F74E8E02-0B47-4816-BD0B-FAEAE3343165}.DebugDll|Win32.ActiveCfg = DebugDll|Win32 + {F74E8E02-0B47-4816-BD0B-FAEAE3343165}.DebugDll|Win32.Build.0 = DebugDll|Win32 + {F74E8E02-0B47-4816-BD0B-FAEAE3343165}.DebugDll|x64.ActiveCfg = DebugDll|Win32 + {F74E8E02-0B47-4816-BD0B-FAEAE3343165}.DebugDoublePrecision|Win32.ActiveCfg = DebugDoublePrecision|Win32 + {F74E8E02-0B47-4816-BD0B-FAEAE3343165}.DebugDoublePrecision|Win32.Build.0 = DebugDoublePrecision|Win32 + {F74E8E02-0B47-4816-BD0B-FAEAE3343165}.DebugDoublePrecision|x64.ActiveCfg = DebugDoublePrecision|Win32 + {F74E8E02-0B47-4816-BD0B-FAEAE3343165}.EmuDebug|Win32.ActiveCfg = Debug|Win32 + {F74E8E02-0B47-4816-BD0B-FAEAE3343165}.EmuDebug|Win32.Build.0 = Debug|Win32 + {F74E8E02-0B47-4816-BD0B-FAEAE3343165}.EmuDebug|x64.ActiveCfg = Debug|Win32 + {F74E8E02-0B47-4816-BD0B-FAEAE3343165}.EmuRelease|Win32.ActiveCfg = Release|Win32 + {F74E8E02-0B47-4816-BD0B-FAEAE3343165}.EmuRelease|Win32.Build.0 = Release|Win32 + {F74E8E02-0B47-4816-BD0B-FAEAE3343165}.EmuRelease|x64.ActiveCfg = Release|Win32 + {F74E8E02-0B47-4816-BD0B-FAEAE3343165}.Release|Win32.ActiveCfg = Release|Win32 + {F74E8E02-0B47-4816-BD0B-FAEAE3343165}.Release|Win32.Build.0 = Release|Win32 + {F74E8E02-0B47-4816-BD0B-FAEAE3343165}.Release|x64.ActiveCfg = Release|Win32 + {F74E8E02-0B47-4816-BD0B-FAEAE3343165}.ReleaseDll|Win32.ActiveCfg = ReleaseDll|Win32 + {F74E8E02-0B47-4816-BD0B-FAEAE3343165}.ReleaseDll|Win32.Build.0 = ReleaseDll|Win32 + {F74E8E02-0B47-4816-BD0B-FAEAE3343165}.ReleaseDll|x64.ActiveCfg = ReleaseDll|Win32 + {F74E8E02-0B47-4816-BD0B-FAEAE3343165}.ReleaseDoublePrecision|Win32.ActiveCfg = ReleaseDoublePrecision|Win32 + {F74E8E02-0B47-4816-BD0B-FAEAE3343165}.ReleaseDoublePrecision|Win32.Build.0 = ReleaseDoublePrecision|Win32 + {F74E8E02-0B47-4816-BD0B-FAEAE3343165}.ReleaseDoublePrecision|x64.ActiveCfg = ReleaseDoublePrecision|Win32 + {7C428E76-9271-6284-20F0-9B38ED6931E3}.Debug|Win32.ActiveCfg = Debug|Win32 + {7C428E76-9271-6284-20F0-9B38ED6931E3}.Debug|Win32.Build.0 = Debug|Win32 + {7C428E76-9271-6284-20F0-9B38ED6931E3}.Debug|x64.ActiveCfg = Debug|Win32 + {7C428E76-9271-6284-20F0-9B38ED6931E3}.DebugDll|Win32.ActiveCfg = DebugDll|Win32 + {7C428E76-9271-6284-20F0-9B38ED6931E3}.DebugDll|Win32.Build.0 = DebugDll|Win32 + {7C428E76-9271-6284-20F0-9B38ED6931E3}.DebugDll|x64.ActiveCfg = DebugDll|Win32 + {7C428E76-9271-6284-20F0-9B38ED6931E3}.DebugDoublePrecision|Win32.ActiveCfg = DebugDoublePrecision|Win32 + {7C428E76-9271-6284-20F0-9B38ED6931E3}.DebugDoublePrecision|Win32.Build.0 = DebugDoublePrecision|Win32 + {7C428E76-9271-6284-20F0-9B38ED6931E3}.DebugDoublePrecision|x64.ActiveCfg = DebugDoublePrecision|Win32 + {7C428E76-9271-6284-20F0-9B38ED6931E3}.EmuDebug|Win32.ActiveCfg = Debug|Win32 + {7C428E76-9271-6284-20F0-9B38ED6931E3}.EmuDebug|Win32.Build.0 = Debug|Win32 + {7C428E76-9271-6284-20F0-9B38ED6931E3}.EmuDebug|x64.ActiveCfg = Debug|Win32 + {7C428E76-9271-6284-20F0-9B38ED6931E3}.EmuRelease|Win32.ActiveCfg = Release|Win32 + {7C428E76-9271-6284-20F0-9B38ED6931E3}.EmuRelease|Win32.Build.0 = Release|Win32 + {7C428E76-9271-6284-20F0-9B38ED6931E3}.EmuRelease|x64.ActiveCfg = Release|Win32 + {7C428E76-9271-6284-20F0-9B38ED6931E3}.Release|Win32.ActiveCfg = Release|Win32 + {7C428E76-9271-6284-20F0-9B38ED6931E3}.Release|Win32.Build.0 = Release|Win32 + {7C428E76-9271-6284-20F0-9B38ED6931E3}.Release|x64.ActiveCfg = Release|Win32 + {7C428E76-9271-6284-20F0-9B38ED6931E3}.ReleaseDll|Win32.ActiveCfg = ReleaseDll|Win32 + {7C428E76-9271-6284-20F0-9B38ED6931E3}.ReleaseDll|Win32.Build.0 = ReleaseDll|Win32 + {7C428E76-9271-6284-20F0-9B38ED6931E3}.ReleaseDll|x64.ActiveCfg = ReleaseDll|Win32 + {7C428E76-9271-6284-20F0-9B38ED6931E3}.ReleaseDoublePrecision|Win32.ActiveCfg = ReleaseDoublePrecision|Win32 + {7C428E76-9271-6284-20F0-9B38ED6931E3}.ReleaseDoublePrecision|Win32.Build.0 = ReleaseDoublePrecision|Win32 + {7C428E76-9271-6284-20F0-9B38ED6931E3}.ReleaseDoublePrecision|x64.ActiveCfg = ReleaseDoublePrecision|Win32 + {3578834A-4B06-DE6F-78AC-FE11F7226D35}.Debug|Win32.ActiveCfg = Debug|Win32 + {3578834A-4B06-DE6F-78AC-FE11F7226D35}.Debug|Win32.Build.0 = Debug|Win32 + {3578834A-4B06-DE6F-78AC-FE11F7226D35}.Debug|x64.ActiveCfg = Debug|Win32 + {3578834A-4B06-DE6F-78AC-FE11F7226D35}.DebugDll|Win32.ActiveCfg = DebugDll|Win32 + {3578834A-4B06-DE6F-78AC-FE11F7226D35}.DebugDll|Win32.Build.0 = DebugDll|Win32 + {3578834A-4B06-DE6F-78AC-FE11F7226D35}.DebugDll|x64.ActiveCfg = DebugDll|Win32 + {3578834A-4B06-DE6F-78AC-FE11F7226D35}.DebugDoublePrecision|Win32.ActiveCfg = DebugDoublePrecision|Win32 + {3578834A-4B06-DE6F-78AC-FE11F7226D35}.DebugDoublePrecision|Win32.Build.0 = DebugDoublePrecision|Win32 + {3578834A-4B06-DE6F-78AC-FE11F7226D35}.DebugDoublePrecision|x64.ActiveCfg = DebugDoublePrecision|Win32 + {3578834A-4B06-DE6F-78AC-FE11F7226D35}.EmuDebug|Win32.ActiveCfg = Debug|Win32 + {3578834A-4B06-DE6F-78AC-FE11F7226D35}.EmuDebug|Win32.Build.0 = Debug|Win32 + {3578834A-4B06-DE6F-78AC-FE11F7226D35}.EmuDebug|x64.ActiveCfg = Debug|Win32 + {3578834A-4B06-DE6F-78AC-FE11F7226D35}.EmuRelease|Win32.ActiveCfg = Release|Win32 + {3578834A-4B06-DE6F-78AC-FE11F7226D35}.EmuRelease|Win32.Build.0 = Release|Win32 + {3578834A-4B06-DE6F-78AC-FE11F7226D35}.EmuRelease|x64.ActiveCfg = Release|Win32 + {3578834A-4B06-DE6F-78AC-FE11F7226D35}.Release|Win32.ActiveCfg = Release|Win32 + {3578834A-4B06-DE6F-78AC-FE11F7226D35}.Release|Win32.Build.0 = Release|Win32 + {3578834A-4B06-DE6F-78AC-FE11F7226D35}.Release|x64.ActiveCfg = Release|Win32 + {3578834A-4B06-DE6F-78AC-FE11F7226D35}.ReleaseDll|Win32.ActiveCfg = ReleaseDll|Win32 + {3578834A-4B06-DE6F-78AC-FE11F7226D35}.ReleaseDll|Win32.Build.0 = ReleaseDll|Win32 + {3578834A-4B06-DE6F-78AC-FE11F7226D35}.ReleaseDll|x64.ActiveCfg = ReleaseDll|Win32 + {3578834A-4B06-DE6F-78AC-FE11F7226D35}.ReleaseDoublePrecision|Win32.ActiveCfg = ReleaseDoublePrecision|Win32 + {3578834A-4B06-DE6F-78AC-FE11F7226D35}.ReleaseDoublePrecision|Win32.Build.0 = ReleaseDoublePrecision|Win32 + {3578834A-4B06-DE6F-78AC-FE11F7226D35}.ReleaseDoublePrecision|x64.ActiveCfg = ReleaseDoublePrecision|Win32 + EndGlobalSection + GlobalSection(SolutionProperties) = preSolution + HideSolutionNode = FALSE + EndGlobalSection +EndGlobal diff --git a/BulletPhysics/bulletTrunk/Extras/CUDA/particles.vcproj b/BulletPhysics/bulletTrunk/Extras/CUDA/particles.vcproj new file mode 100644 index 00000000..25e2a982 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CUDA/particles.vcproj @@ -0,0 +1,880 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/BulletPhysics/bulletTrunk/Extras/CUDA/particles_kernel.cu b/BulletPhysics/bulletTrunk/Extras/CUDA/particles_kernel.cu new file mode 100644 index 00000000..0e16151c --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CUDA/particles_kernel.cu @@ -0,0 +1,381 @@ +/* + * Copyright 1993-2006 NVIDIA Corporation. All rights reserved. + * + * NOTICE TO USER: + * + * This source code is subject to NVIDIA ownership rights under U.S. and + * international Copyright laws. + * + * NVIDIA MAKES NO REPRESENTATION ABOUT THE SUITABILITY OF THIS SOURCE + * CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR + * IMPLIED WARRANTY OF ANY KIND. NVIDIA DISCLAIMS ALL WARRANTIES WITH + * REGARD TO THIS SOURCE CODE, INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE. + * IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL, + * OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS + * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE + * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE + * OR PERFORMANCE OF THIS SOURCE CODE. + * + * U.S. Government End Users. This source code is a "commercial item" as + * that term is defined at 48 C.F.R. 2.101 (OCT 1995), consisting of + * "commercial computer software" and "commercial computer software + * documentation" as such terms are used in 48 C.F.R. 12.212 (SEPT 1995) + * and is provided to the U.S. Government only as a commercial end item. + * Consistent with 48 C.F.R.12.212 and 48 C.F.R. 227.7202-1 through + * 227.7202-4 (JUNE 1995), all U.S. Government End Users acquire the + * source code with only those rights set forth herein. + */ + +/* + * Device code. + */ + +#ifndef _PARTICLES_KERNEL_H_ +#define _PARTICLES_KERNEL_H_ + +#include +#include +#include "cutil_math.h" +#include "math_constants.h" +#include "particles_kernel.cuh" + +#if USE_TEX +// textures for particle position and velocity +texture oldPosTex; +texture oldVelTex; + +texture particleHashTex; +texture cellStartTex; + +texture gridCountersTex; +texture gridCellsTex; +#endif + +__constant__ SimParams params; + +// integrate particle attributes +__global__ void +integrate(float4* newPos, float4* newVel, + float4* oldPos, float4* oldVel, + float deltaTime) +{ + int index = __mul24(blockIdx.x,blockDim.x) + threadIdx.x; + + float4 pos4 = oldPos[index]; + float4 vel4 = oldVel[index]; + float3 pos = make_float3(pos4); + float3 vel = make_float3(vel4); + + vel += params.gravity * deltaTime; + vel *= params.globalDamping; + + // new position = old position + velocity * deltaTime + pos += vel * deltaTime; + + // bounce off cube sides + if (pos.x > 1.0f - params.particleRadius) { pos.x = 1.0f - params.particleRadius; vel.x *= params.boundaryDamping; } + if (pos.x < -1.0f + params.particleRadius) { pos.x = -1.0f + params.particleRadius; vel.x *= params.boundaryDamping;} + if (pos.y > 1.0f - params.particleRadius) { pos.y = 1.0f - params.particleRadius; vel.y *= params.boundaryDamping; } + if (pos.y < -1.0f + params.particleRadius) { pos.y = -1.0f + params.particleRadius; vel.y *= params.boundaryDamping;} + if (pos.z > 1.0f - params.particleRadius) { pos.z = 1.0f - params.particleRadius; vel.z *= params.boundaryDamping; } + if (pos.z < -1.0f + params.particleRadius) { pos.z = -1.0f + params.particleRadius; vel.z *= params.boundaryDamping;} + + // store new position and velocity + newPos[index] = make_float4(pos, pos4.w); + newVel[index] = make_float4(vel, vel4.w); +} + +// calculate position in uniform grid +__device__ int3 calcGridPos(float4 p) +{ + int3 gridPos; + gridPos.x = floor((p.x - params.worldOrigin.x) / params.cellSize.x); + gridPos.y = floor((p.y - params.worldOrigin.y) / params.cellSize.y); + gridPos.z = floor((p.z - params.worldOrigin.z) / params.cellSize.z); + return gridPos; +} + +// calculate address in grid from position (clamping to edges) +__device__ uint calcGridHash(int3 gridPos) +{ + gridPos.x = max(0, min(gridPos.x, params.gridSize.x-1)); + gridPos.y = max(0, min(gridPos.y, params.gridSize.y-1)); + gridPos.z = max(0, min(gridPos.z, params.gridSize.z-1)); + return __mul24(__mul24(gridPos.z, params.gridSize.y), params.gridSize.x) + __mul24(gridPos.y, params.gridSize.x) + gridPos.x; +} + +// add particle to cell using atomics +__device__ void addParticleToCell(int3 gridPos, + uint index, + uint* gridCounters, + uint* gridCells) +{ + // calculate grid hash + uint gridHash = calcGridHash(gridPos); + + // increment cell counter using atomics +#if defined CUDA_NO_SM_11_ATOMIC_INTRINSICS + int counter = 0; +#else + int counter = atomicAdd(&gridCounters[gridHash], 1); // returns previous value + counter = min(counter, params.maxParticlesPerCell-1); +#endif + + // write particle index into this cell (very uncoalesced!) + gridCells[gridHash*params.maxParticlesPerCell + counter] = index; +} + + +// update uniform grid +__global__ void +updateGridD(float4* pos, + uint* gridCounters, + uint* gridCells) +{ + int index = __mul24(blockIdx.x,blockDim.x) + threadIdx.x; + float4 p = pos[index]; + + // get address in grid + int3 gridPos = calcGridPos(p); + + addParticleToCell(gridPos, index, gridCounters, gridCells); +} + +// calculate grid hash value for each particle +__global__ void +calcHashD(float4* pos, + uint2* particleHash) +{ + int index = __mul24(blockIdx.x, blockDim.x) + threadIdx.x; + float4 p = pos[index]; + + // get address in grid + int3 gridPos = calcGridPos(p); + uint gridHash = calcGridHash(gridPos); + + // store grid hash and particle index + particleHash[index] = make_uint2(gridHash, index); +} + +// rearrange particle data into sorted order, and find the start of each cell in the +// sorted hash array +__global__ void +reorderDataAndFindCellStartD(uint2* particleHash, // particle id sorted by hash + float4* oldPos, + float4* oldVel, + float4* sortedPos, + float4* sortedVel, + uint* cellStart) +{ + int index = __mul24(blockIdx.x,blockDim.x) + threadIdx.x; + + uint2 sortedData = particleHash[index]; + + // Load hash data into shared memory so that we can look + // at neighboring particle's hash value without loading + // two hash values per thread + __shared__ uint sharedHash[257]; + sharedHash[threadIdx.x+1] = sortedData.x; + if (index > 0 && threadIdx.x == 0) + { + // first thread in block must load neighbor particle hash + volatile uint2 prevData = particleHash[index-1]; + sharedHash[0] = prevData.x; + } + + __syncthreads(); + if (index == 0 || sortedData.x != sharedHash[threadIdx.x]) + { + cellStart[sortedData.x] = index; + } + + // Now use the sorted index to reorder the pos and vel data + float4 pos = FETCH(oldPos, sortedData.y); // macro does either global read or texture fetch + float4 vel = FETCH(oldVel, sortedData.y); // see particles_kernel.cuh + + sortedPos[index] = pos; + sortedVel[index] = vel; + +} + +// collide two spheres using DEM method +__device__ float3 collideSpheres(float4 posA, float4 posB, + float4 velA, float4 velB, + float radiusA, float radiusB, + float attraction) +{ + // calculate relative position + float3 relPos; + relPos.x = posB.x - posA.x; + relPos.y = posB.y - posA.y; + relPos.z = posB.z - posA.z; + + float dist = length(relPos); + float collideDist = radiusA + radiusB; + + float3 force = make_float3(0.0f); + if (dist < collideDist) { + float3 norm = relPos / dist; + + // relative velocity + float3 relVel; + relVel.x = velB.x - velA.x; + relVel.y = velB.y - velA.y; + relVel.z = velB.z - velA.z; + + // relative tangential velocity + float3 tanVel = relVel - (dot(relVel, norm) * norm); + + // spring force + force = -params.spring*(collideDist - dist) * norm; + // dashpot (damping) force + force += params.damping*relVel; + // tangential shear force + force += params.shear*tanVel; + // attraction + force += attraction*relPos; + } + + return force; +} + + +// collide particle with all particles in a given cell +// version using grid built with atomics +__device__ +float3 collideCell(int3 gridPos, + uint index, + float4 pos, + float4 vel, + float4* oldPos, + float4* oldVel, + uint* gridCounters, + uint* gridCells) +{ + float3 force = make_float3(0.0f); + + if ((gridPos.x < 0) || (gridPos.x > params.gridSize.x-1) || + (gridPos.y < 0) || (gridPos.y > params.gridSize.y-1) || + (gridPos.z < 0) || (gridPos.z > params.gridSize.z-1)) { + return force; + } + + uint gridHash = calcGridHash(gridPos); + + // iterate over particles in this cell + uint particlesInCell = FETCH(gridCounters, gridHash); + particlesInCell = min(particlesInCell, params.maxParticlesPerCell-1); + + for(uint i=0; i params.gridSize.x-1) || + (gridPos.y < 0) || (gridPos.y > params.gridSize.y-1) || + (gridPos.z < 0) || (gridPos.z > params.gridSize.z-1)) { + return force; + } + + uint gridHash = calcGridHash(gridPos); + + // get start of bucket for this cell + uint bucketStart = FETCH(cellStart, gridHash); + if (bucketStart == 0xffffffff) + return force; // cell empty + + // iterate over particles in this cell + for(uint i=0; i>>(pData0, elements, elements_rounded_to_3072, shift); + // Prefix sum in radix groups, and then between groups throughout a block + RadixPrefixSum<<>>(); + // Sum the block offsets and then shuffle data into bins + RadixAddOffsetsAndShuffle<<>>(pData0, pData1, elements, elements_rounded_to_3072, shift); + + // Exchange data pointers + KeyValuePair* pTemp = pData0; + pData0 = pData1; + pData1 = pTemp; + } +} + +} diff --git a/BulletPhysics/bulletTrunk/Extras/CUDA/radixsort.cuh b/BulletPhysics/bulletTrunk/Extras/CUDA/radixsort.cuh new file mode 100644 index 00000000..538bb11f --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CUDA/radixsort.cuh @@ -0,0 +1,63 @@ +/* + * Copyright 1993-2006 NVIDIA Corporation. All rights reserved. + * + * NOTICE TO USER: + * + * This source code is subject to NVIDIA ownership rights under U.S. and + * international Copyright laws. + * + * NVIDIA MAKES NO REPRESENTATION ABOUT THE SUITABILITY OF THIS SOURCE + * CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR + * IMPLIED WARRANTY OF ANY KIND. NVIDIA DISCLAIMS ALL WARRANTIES WITH + * REGARD TO THIS SOURCE CODE, INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE. + * IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL, + * OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS + * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE + * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE + * OR PERFORMANCE OF THIS SOURCE CODE. + * + * U.S. Government End Users. This source code is a "commercial item" as + * that term is defined at 48 C.F.R. 2.101 (OCT 1995), consisting of + * "commercial computer software" and "commercial computer software + * documentation" as such terms are used in 48 C.F.R. 12.212 (SEPT 1995) + * and is provided to the U.S. Government only as a commercial end item. + * Consistent with 48 C.F.R.12.212 and 48 C.F.R. 227.7202-1 through + * 227.7202-4 (JUNE 1995), all U.S. Government End Users acquire the + * source code with only those rights set forth herein. + */ + +/* Radixsort project which demonstrates the use of CUDA in a multi phase + * sorting computation. + * Type definitions. + */ + +#ifndef _RADIXSORT_H_ +#define _RADIXSORT_H_ + +#include + +#define SYNCIT __syncthreads() + +// Use 16 bit keys/values +#define SIXTEEN 0 + +typedef unsigned int uint; +typedef unsigned short ushort; + +#if SIXTEEN +typedef struct __align__(4) { + ushort key; + ushort value; +#else +typedef struct __align__(8) { + uint key; + uint value; +#endif +} KeyValuePair; + +extern "C" { + void RadixSort(KeyValuePair *pData0, KeyValuePair *pData1, uint elements, uint bits); +} + +#endif // #ifndef _RADIXSORT_H_ diff --git a/BulletPhysics/bulletTrunk/Extras/CUDA/radixsort_kernel.cu b/BulletPhysics/bulletTrunk/Extras/CUDA/radixsort_kernel.cu new file mode 100644 index 00000000..20258413 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CUDA/radixsort_kernel.cu @@ -0,0 +1,577 @@ +/* + * Copyright 1993-2006 NVIDIA Corporation. All rights reserved. + * + * NOTICE TO USER: + * + * This source code is subject to NVIDIA ownership rights under U.S. and + * international Copyright laws. + * + * NVIDIA MAKES NO REPRESENTATION ABOUT THE SUITABILITY OF THIS SOURCE + * CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR + * IMPLIED WARRANTY OF ANY KIND. NVIDIA DISCLAIMS ALL WARRANTIES WITH + * REGARD TO THIS SOURCE CODE, INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE. + * IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL, + * OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS + * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE + * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE + * OR PERFORMANCE OF THIS SOURCE CODE. + * + * U.S. Government End Users. This source code is a "commercial item" as + * that term is defined at 48 C.F.R. 2.101 (OCT 1995), consisting of + * "commercial computer software" and "commercial computer software + * documentation" as such terms are used in 48 C.F.R. 12.212 (SEPT 1995) + * and is provided to the U.S. Government only as a commercial end item. + * Consistent with 48 C.F.R.12.212 and 48 C.F.R. 227.7202-1 through + * 227.7202-4 (JUNE 1995), all U.S. Government End Users acquire the + * source code with only those rights set forth herein. + */ + +/* Radixsort project with key/value and arbitrary datset size support + * which demonstrates the use of CUDA in a multi phase sorting + * computation. + * Device code. + */ + +#ifndef _RADIXSORT_KERNEL_H_ +#define _RADIXSORT_KERNEL_H_ + +#include +#include "radixsort.cuh" + +#define SYNCIT __syncthreads() + +static const int NUM_SMS = 16; +static const int NUM_THREADS_PER_SM = 192; +static const int NUM_THREADS_PER_BLOCK = 64; +//static const int NUM_THREADS = NUM_THREADS_PER_SM * NUM_SMS; +static const int NUM_BLOCKS = (NUM_THREADS_PER_SM / NUM_THREADS_PER_BLOCK) * NUM_SMS; +static const int RADIX = 8; // Number of bits per radix sort pass +static const int RADICES = 1 << RADIX; // Number of radices +static const int RADIXMASK = RADICES - 1; // Mask for each radix sort pass +#if SIXTEEN +static const int RADIXBITS = 16; // Number of bits to sort over +#else +static const int RADIXBITS = 32; // Number of bits to sort over +#endif +static const int RADIXTHREADS = 16; // Number of threads sharing each radix counter +static const int RADIXGROUPS = NUM_THREADS_PER_BLOCK / RADIXTHREADS; // Number of radix groups per CTA +static const int TOTALRADIXGROUPS = NUM_BLOCKS * RADIXGROUPS; // Number of radix groups for each radix +static const int SORTRADIXGROUPS = TOTALRADIXGROUPS * RADICES; // Total radix count +static const int GRFELEMENTS = (NUM_THREADS_PER_BLOCK / RADIXTHREADS) * RADICES; +static const int GRFSIZE = GRFELEMENTS * sizeof(uint); + +// Prefix sum variables +static const int PREFIX_NUM_THREADS_PER_SM = NUM_THREADS_PER_SM; +static const int PREFIX_NUM_THREADS_PER_BLOCK = PREFIX_NUM_THREADS_PER_SM; +static const int PREFIX_NUM_BLOCKS = (PREFIX_NUM_THREADS_PER_SM / PREFIX_NUM_THREADS_PER_BLOCK) * NUM_SMS; +static const int PREFIX_BLOCKSIZE = SORTRADIXGROUPS / PREFIX_NUM_BLOCKS; +static const int PREFIX_GRFELEMENTS = PREFIX_BLOCKSIZE + 2 * PREFIX_NUM_THREADS_PER_BLOCK; +static const int PREFIX_GRFSIZE = PREFIX_GRFELEMENTS * sizeof(uint); + +// Shuffle variables +static const int SHUFFLE_GRFOFFSET = RADIXGROUPS * RADICES; +static const int SHUFFLE_GRFELEMENTS = SHUFFLE_GRFOFFSET + PREFIX_NUM_BLOCKS; +static const int SHUFFLE_GRFSIZE = SHUFFLE_GRFELEMENTS * sizeof(uint); + + +#define SDATA( index) CUT_BANK_CHECKER(sdata, index) + +// Prefix sum data +uint gRadixSum[TOTALRADIXGROUPS * RADICES]; +__device__ uint dRadixSum[TOTALRADIXGROUPS * RADICES]; +uint gRadixBlockSum[PREFIX_NUM_BLOCKS]; +__device__ uint dRadixBlockSum[PREFIX_NUM_BLOCKS]; + +extern __shared__ uint sRadixSum[]; + + + +//////////////////////////////////////////////////////////////////////////////// +//! Perform a radix sum on the list to be sorted. Each SM holds a set of +//! radix counters for each group of RADIXGROUPS thread in the GRF. +//! +//! @param pData input data +//! @param elements total number of elements +//! @param elements_rounded_to_3072 total number of elements rounded up to the +//! nearest multiple of 3072 +//! @param shift the shift (0 to 24) that we are using to obtain the correct +//! byte +//////////////////////////////////////////////////////////////////////////////// +__global__ void RadixSum(KeyValuePair *pData, uint elements, uint elements_rounded_to_3072, uint shift) +{ + uint pos = threadIdx.x; + + // Zero radix counts + while (pos < GRFELEMENTS) + { + sRadixSum[pos] = 0; + pos += NUM_THREADS_PER_BLOCK; + } + + // Sum up data + // Source addresses computed so that each thread is reading from a block of + // consecutive addresses so there are no conflicts between threads + // They then loop over their combined region and the next batch works elsewhere. + // So threads 0 to 16 work on memory 0 to 320. + // First reading 0,1,2,3...15 then 16,17,18,19...31 and so on + // optimising parallel access to shared memory by a thread accessing 16*threadID + // The next radix group runs from 320 to 640 and the same applies in that region + uint tmod = threadIdx.x % RADIXTHREADS; + uint tpos = threadIdx.x / RADIXTHREADS; + + // Take the rounded element list size so that all threads have a certain size dataset to work with + // and no zero size datasets confusing the issue + // By using a multiple of 3072 we ensure that all threads have elements + // to work with until the last phase, at which point we individually test + uint element_fraction = elements_rounded_to_3072 / TOTALRADIXGROUPS; + + // Generate range + // Note that it is possible for both pos and end to be past the end of the element set + // which will be caught later. + pos = (blockIdx.x * RADIXGROUPS + tpos) * element_fraction; + uint end = pos + element_fraction; + pos += tmod; + //printf("pos: %d\n", pos); + __syncthreads(); + + while (pos < end ) + { + uint key = 0; + + // Read first data element if we are in the set of elements + //if( pos < elements ) + //key = pData[pos].key; + KeyValuePair kvp; + // Read first data element, both items at once as the memory will want to coalesce like that anyway + if (pos < elements) + kvp = pData[pos]; + else + kvp.key = 0; + key = kvp.key; + + + // Calculate position of radix counter to increment + // There are RADICES radices in each pass (256) + // and hence this many counters for bin grouping + // Multiply by RADIXGROUPS (4) to spread through memory + // and into 4 radix groups + uint p = ((key >> shift) & RADIXMASK) * RADIXGROUPS; + + // Increment radix counters + // Each radix group has its own set of counters + // so we add the thread position [0-3], ie the group index. + // We slow down here and take at least 16 cycles to write to the summation boxes + // but other groups will only conflict with themselves and so can also be writing + // 16 cycles here at least avoids retries. + uint ppos = p + tpos; + + // If we are past the last element we don't want to do anything + // We do have to check each time, however, to ensure that all + // threads sync on each sync here. + if (tmod == 0 && pos < elements) + sRadixSum[ppos]++; + SYNCIT; + if (tmod == 1 && pos < elements) + sRadixSum[ppos]++; + SYNCIT; + if (tmod == 2 && pos < elements) + sRadixSum[ppos]++; + SYNCIT; + if (tmod == 3 && pos < elements) + sRadixSum[ppos]++; + SYNCIT; + if (tmod == 4 && pos < elements) + sRadixSum[ppos]++; + SYNCIT; + if (tmod == 5 && pos < elements) + sRadixSum[ppos]++; + SYNCIT; + if (tmod == 6 && pos < elements) + sRadixSum[ppos]++; + SYNCIT; + if (tmod == 7 && pos < elements) + sRadixSum[ppos]++; + SYNCIT; + if (tmod == 8 && pos < elements) + sRadixSum[ppos]++; + SYNCIT; + if (tmod == 9 && pos < elements) + sRadixSum[ppos]++; + SYNCIT; + if (tmod == 10 && pos < elements) + sRadixSum[ppos]++; + SYNCIT; + if (tmod == 11 && pos < elements) + sRadixSum[ppos]++; + SYNCIT; + if (tmod == 12 && pos < elements) + sRadixSum[ppos]++; + SYNCIT; + if (tmod == 13 && pos < elements) + sRadixSum[ppos]++; + SYNCIT; + if (tmod == 14 && pos < elements) + sRadixSum[ppos]++; + SYNCIT; + if (tmod == 15 && pos < elements) + sRadixSum[ppos]++; + SYNCIT; + + pos += RADIXTHREADS; + + } + + __syncthreads(); + + __syncthreads(); + + // Output radix sums into separate memory regions for each radix group + // So this memory then is layed out: + // 0...... 192..... 384 ................ 192*256 + // ie all 256 bins for each radix group + // in there: + // 0.............192 + // 0 4 8 12... - block idx * 4 + // And in the block boxes we see the 4 radix groups for that block + // So 0-192 should contain bin 0 for each radix group, and so on + uint offset = blockIdx.x * RADIXGROUPS; + uint row = threadIdx.x / RADIXGROUPS; + uint column = threadIdx.x % RADIXGROUPS; + while (row < RADICES) + { + dRadixSum[offset + row * TOTALRADIXGROUPS + column] = sRadixSum[row * RADIXGROUPS + column]; + row += NUM_THREADS_PER_BLOCK / RADIXGROUPS; + } +} + +//////////////////////////////////////////////////////////////////////////////// +//! Performs first part of parallel prefix sum - individual sums of each radix +//! count. By the end of this we have prefix sums on a block level in dRadixSum +//! and totals for blocks in dRadixBlockSum. +//////////////////////////////////////////////////////////////////////////////// +__global__ void RadixPrefixSum() +{ + // Read radix groups in offset by one in the GRF so a zero can be inserted at the beginning + // and the final sum of all radix counts summed here is tacked onto the end for reading by + // the next stage + // Each block in this case is the full number of threads per SM (and hence the total number + // of radix groups), 192. We should then have the total set of offsets for an entire radix + // group by the end of this stage + // Device mem addressing + + uint brow = blockIdx.x * (RADICES / PREFIX_NUM_BLOCKS); + uint drow = threadIdx.x / TOTALRADIXGROUPS; // In default parameterisation this is always 0 + uint dcolumn = threadIdx.x % TOTALRADIXGROUPS; // And similarly this is always the same as threadIdx.x + uint dpos = (brow + drow) * TOTALRADIXGROUPS + dcolumn; + uint end = ((blockIdx.x + 1) * (RADICES / PREFIX_NUM_BLOCKS)) * TOTALRADIXGROUPS; + // Shared mem addressing + uint srow = threadIdx.x / (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK); + uint scolumn = threadIdx.x % (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK); + uint spos = srow * (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK + 1) + scolumn; + + // Read (RADICES / PREFIX_NUM_BLOCKS) radix counts into the GRF alongside each other + while (dpos < end) + { + sRadixSum[spos] = dRadixSum[dpos]; + spos += (PREFIX_NUM_THREADS_PER_BLOCK / (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK)) * + (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK + 1); + dpos += (TOTALRADIXGROUPS / PREFIX_NUM_THREADS_PER_BLOCK) * TOTALRADIXGROUPS; + } + __syncthreads(); + + // Perform preliminary sum on each thread's stretch of data + // Each thread having a block of 16, with spacers between 0...16 18...33 and so on + int pos = threadIdx.x * (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK + 1); + end = pos + (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK); + uint sum = 0; + while (pos < end) + { + sum += sRadixSum[pos]; + sRadixSum[pos] = sum; + pos++; + } + __syncthreads(); + + + // Calculate internal offsets by performing a more traditional parallel + // prefix sum of the topmost member of each thread's work data. Right now, + // these are stored between the work data for each thread, allowing us to + // eliminate GRF conflicts as well as hold the offsets needed to complete the sum + // In other words we have: + // 0....15 16 17....32 33 34.... + // Where this first stage updates the intermediate values (so 16=15, 33=32 etc) + int m = (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK + 1); + pos = threadIdx.x * (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK + 1) + + (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK); + sRadixSum[pos] = sRadixSum[pos - 1]; + __syncthreads(); + // This stage then performs a parallel prefix sum (ie use powers of 2 to propagate in log n stages) + // to update 17, 34 etc with the totals to that point (so 34 becomes [34] + [17]) and so on. + while (m < PREFIX_NUM_THREADS_PER_BLOCK * (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK + 1)) + { + int p = pos - m; + uint t = ((p > 0) ? sRadixSum[p] : 0); + __syncthreads(); + sRadixSum[pos] += t; + __syncthreads(); + m *= 2; + } + __syncthreads(); + + + + // Add internal offsets to each thread's work data. + // So now we take 17 and add it to all values 18 to 33 so all offsets for that block + // are updated. + pos = threadIdx.x * (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK + 1); + end = pos + (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK); + int p = pos - 1; + sum = ((p > 0) ? sRadixSum[p] : 0); + while (pos < end) + { + sRadixSum[pos] += sum; + pos++; + } + __syncthreads(); + + // Write summed data back out to global memory in the same way as we read it in + // We now have prefix sum values internal to groups + brow = blockIdx.x * (RADICES / PREFIX_NUM_BLOCKS); + drow = threadIdx.x / TOTALRADIXGROUPS; + dcolumn = threadIdx.x % TOTALRADIXGROUPS; + srow = threadIdx.x / (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK); + scolumn = threadIdx.x % (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK); + dpos = (brow + drow) * TOTALRADIXGROUPS + dcolumn + 1; + spos = srow * (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK + 1) + scolumn; + end = ((blockIdx.x + 1) * RADICES / PREFIX_NUM_BLOCKS) * TOTALRADIXGROUPS; + while (dpos < end) + { + dRadixSum[dpos] = sRadixSum[spos]; + dpos += (TOTALRADIXGROUPS / PREFIX_NUM_THREADS_PER_BLOCK) * TOTALRADIXGROUPS; + spos += (PREFIX_NUM_THREADS_PER_BLOCK / (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK)) * + (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK + 1); + } + + // Write last element to summation + // Storing block sums in a separate array + if (threadIdx.x == 0) { + dRadixBlockSum[blockIdx.x] = sRadixSum[PREFIX_NUM_THREADS_PER_BLOCK * (PREFIX_BLOCKSIZE / PREFIX_NUM_THREADS_PER_BLOCK + 1) - 1]; + dRadixSum[blockIdx.x * PREFIX_BLOCKSIZE] = 0; + } +} + + +//////////////////////////////////////////////////////////////////////////////// +//! Initially perform prefix sum of block totals to obtain final set of offsets. +//! Then make use of radix sums to perform a shuffling of the data into the +//! correct bins. +//! +//! @param pSrc input data +//! @param pDst output data +//! @param elements total number of elements +//! @param shift the shift (0 to 24) that we are using to obtain the correct +//! byte +//////////////////////////////////////////////////////////////////////////////// +__global__ void RadixAddOffsetsAndShuffle(KeyValuePair* pSrc, KeyValuePair* pDst, uint elements, uint elements_rounded_to_3072, int shift) +{ + // Read offsets from previous blocks + if (threadIdx.x == 0) + sRadixSum[SHUFFLE_GRFOFFSET] = 0; + + if (threadIdx.x < PREFIX_NUM_BLOCKS - 1) + sRadixSum[SHUFFLE_GRFOFFSET + threadIdx.x + 1] = dRadixBlockSum[threadIdx.x]; + __syncthreads(); + + // Parallel prefix sum over block sums + int pos = threadIdx.x; + int n = 1; + while (n < PREFIX_NUM_BLOCKS) + { + int ppos = pos - n; + uint t0 = ((pos < PREFIX_NUM_BLOCKS) && (ppos >= 0)) ? sRadixSum[SHUFFLE_GRFOFFSET + ppos] : 0; + __syncthreads(); + if (pos < PREFIX_NUM_BLOCKS) + sRadixSum[SHUFFLE_GRFOFFSET + pos] += t0; + __syncthreads(); + n *= 2; + } + + // Read radix count data and add appropriate block offset + // for each radix at the memory location for this thread + // (where the other threads in the block will be reading + // as well, hence the large stride). + // There is one counter box per radix group per radix + // per block (4*256*3) + // We use 64 threads to read the 4 radix groups set of radices + // for the block. + int row = threadIdx.x / RADIXGROUPS; + int column = threadIdx.x % RADIXGROUPS; + int spos = row * RADIXGROUPS + column; + int dpos = row * TOTALRADIXGROUPS + column + blockIdx.x * RADIXGROUPS; + while (spos < SHUFFLE_GRFOFFSET) + { + sRadixSum[spos] = dRadixSum[dpos] + sRadixSum[SHUFFLE_GRFOFFSET + dpos / (TOTALRADIXGROUPS * RADICES / PREFIX_NUM_BLOCKS)]; + spos += NUM_THREADS_PER_BLOCK; + dpos += (NUM_THREADS_PER_BLOCK / RADIXGROUPS) * TOTALRADIXGROUPS; + } + __syncthreads(); + + //int pos; + // Shuffle data + // Each of the subbins for a block should be filled via the counters, properly interleaved + // Then, as we now iterate over each data value, we increment the subbins (each thread in the + // radix group in turn to avoid miss writes due to conflicts) and set locations correctly. + uint element_fraction = elements_rounded_to_3072 / TOTALRADIXGROUPS; + int tmod = threadIdx.x % RADIXTHREADS; + int tpos = threadIdx.x / RADIXTHREADS; + + pos = (blockIdx.x * RADIXGROUPS + tpos) * element_fraction; + uint end = pos + element_fraction; //(blockIdx.x * RADIXGROUPS + tpos + 1) * element_fraction; + pos += tmod; + + __syncthreads(); + + while (pos < end ) + { + KeyValuePair kvp; +#if 1 // old load + // Read first data element, both items at once as the memory will want to coalesce like that anyway + if (pos < elements) + { + kvp = pSrc[pos]; + } + else + kvp.key = 0; + +#else // casting to float2 to get it to combine loads + int2 kvpf2; + + // Read first data element, both items at once as the memory will want to coalesce like that anyway + if (pos < elements) + { + // kvp = pSrc[pos]; + kvpf2 = ((int2*)pSrc)[pos]; + // printf("kvp: %f %f kvpf2: %f %f\n", kvp.key, kvp.value, kvpf2.x, kvpf2.y); + } + else + //kvp.key = 0; + kvpf2.x = 0; + + kvp.key = kvpf2.x; + kvp.value = kvpf2.y; +#endif + + uint index; + + // Calculate position of radix counter to increment + uint p = ((kvp.key >> shift) & RADIXMASK) * RADIXGROUPS; + + // Move data, keeping counts updated. + // Increment radix counters, relying on hexadecathread + // warp to prevent this code from stepping all over itself. + uint ppos = p + tpos; + if (tmod == 0 && pos < elements) + { + index = sRadixSum[ppos]++; + pDst[index] = kvp; + } + SYNCIT; + if (tmod == 1 && pos < elements) + { + index = sRadixSum[ppos]++; + pDst[index] = kvp; + } + SYNCIT; + if (tmod == 2 && pos < elements) + { + index = sRadixSum[ppos]++; + pDst[index] = kvp; + } + SYNCIT; + if (tmod == 3 && pos < elements) + { + index = sRadixSum[ppos]++; + pDst[index] = kvp; + } + SYNCIT; + if (tmod == 4 && pos < elements) + { + index = sRadixSum[ppos]++; + pDst[index] = kvp; + } + SYNCIT; + if (tmod == 5 && pos < elements) + { + index = sRadixSum[ppos]++; + pDst[index] = kvp; + } + SYNCIT; + if (tmod == 6 && pos < elements) + { + index = sRadixSum[ppos]++; + pDst[index] = kvp; + } + SYNCIT; + if (tmod == 7 && pos < elements) + { + index = sRadixSum[ppos]++; + pDst[index] = kvp; + } + SYNCIT; + if (tmod == 8 && pos < elements) + { + index = sRadixSum[ppos]++; + pDst[index] = kvp; + } + SYNCIT; + if (tmod == 9 && pos < elements) + { + index = sRadixSum[ppos]++; + pDst[index] = kvp; + } + SYNCIT; + if (tmod == 10 && pos < elements) + { + index = sRadixSum[ppos]++; + pDst[index] = kvp; + } + SYNCIT; + if (tmod == 11 && pos < elements) + { + index = sRadixSum[ppos]++; + pDst[index] = kvp; + } + SYNCIT; + if (tmod == 12 && pos < elements) + { + index = sRadixSum[ppos]++; + pDst[index] = kvp; + } + SYNCIT; + if (tmod == 13 && pos < elements) + { + index = sRadixSum[ppos]++; + pDst[index] = kvp; + } + SYNCIT; + if (tmod == 14 && pos < elements) + { + index = sRadixSum[ppos]++; + pDst[index] = kvp; + } + SYNCIT; + if (tmod == 15 && pos < elements) + { + index = sRadixSum[ppos]++; + pDst[index] = kvp; + } + SYNCIT; + + pos += RADIXTHREADS; + } + + __syncthreads(); +} + +#endif // #ifndef _RADIXSORT_KERNEL_H_ diff --git a/BulletPhysics/bulletTrunk/Extras/CUDA/render_particles.cpp b/BulletPhysics/bulletTrunk/Extras/CUDA/render_particles.cpp new file mode 100644 index 00000000..de4bcb81 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CUDA/render_particles.cpp @@ -0,0 +1,260 @@ +/* + * Copyright 1993-2006 NVIDIA Corporation. All rights reserved. + * + * NOTICE TO USER: + * + * This source code is subject to NVIDIA ownership rights under U.S. and + * international Copyright laws. + * + * NVIDIA MAKES NO REPRESENTATION ABOUT THE SUITABILITY OF THIS SOURCE + * CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR + * IMPLIED WARRANTY OF ANY KIND. NVIDIA DISCLAIMS ALL WARRANTIES WITH + * REGARD TO THIS SOURCE CODE, INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE. + * IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL, + * OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS + * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE + * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE + * OR PERFORMANCE OF THIS SOURCE CODE. + * + * U.S. Government End Users. This source code is a "commercial item" as + * that term is defined at 48 C.F.R. 2.101 (OCT 1995), consisting of + * "commercial computer software" and "commercial computer software + * documentation" as such terms are used in 48 C.F.R. 12.212 (SEPT 1995) + * and is provided to the U.S. Government only as a commercial end item. + * Consistent with 48 C.F.R.12.212 and 48 C.F.R. 227.7202-1 through + * 227.7202-4 (JUNE 1995), all U.S. Government End Users acquire the + * source code with only those rights set forth herein. + */ + +#include + +#include +#include +#include + +#include +#include "BMF_Api.h" + +#include "LinearMath/btQuickprof.h" + +#include "render_particles.h" +#include "shaders.h" + +#ifndef M_PI +#define M_PI 3.1415926535897932384626433832795 +#endif + +ParticleRenderer::ParticleRenderer() +: m_pos(0), + m_numParticles(0), + m_pointSize(1.0f), + m_particleRadius(0.125f * 0.5f), + m_program(0), + m_vbo(0), + m_colorVBO(0) +{ + _initGL(); +#ifndef BT_NO_PROFILE + m_profileIterator = CProfileManager::Get_Iterator(); +#endif //BT_NO_PROFILE +} + +ParticleRenderer::~ParticleRenderer() +{ + m_pos = 0; +} + +void ParticleRenderer::setPositions(float *pos, int numParticles) +{ + m_pos = pos; + m_numParticles = numParticles; +} + +void ParticleRenderer::setVertexBuffer(unsigned int vbo, int numParticles) +{ + m_vbo = vbo; + m_numParticles = numParticles; +} + +void ParticleRenderer::_drawPoints() +{ + if (!m_vbo) + { + glBegin(GL_POINTS); + { + int k = 0; + for (int i = 0; i < m_numParticles; ++i) + { + glVertex3fv(&m_pos[k]); + k += 4; + } + } + glEnd(); + } + else + { + glBindBufferARB(GL_ARRAY_BUFFER_ARB, m_vbo); + glVertexPointer(4, GL_FLOAT, 0, 0); + glEnableClientState(GL_VERTEX_ARRAY); + + if (m_colorVBO) { + glBindBufferARB(GL_ARRAY_BUFFER_ARB, m_colorVBO); + glColorPointer(4, GL_FLOAT, 0, 0); + glEnableClientState(GL_COLOR_ARRAY); + } + + glDrawArrays(GL_POINTS, 0, m_numParticles); + + glBindBufferARB(GL_ARRAY_BUFFER_ARB, 0); + glDisableClientState(GL_VERTEX_ARRAY); + glDisableClientState(GL_COLOR_ARRAY); + } +} + +void ParticleRenderer::display(DisplayMode mode /* = PARTICLE_POINTS */) +{ + switch (mode) + { + case PARTICLE_POINTS: + glColor3f(1, 1, 1); + glPointSize(m_pointSize); + _drawPoints(); + break; + + default: + case PARTICLE_SPHERES: + glEnable(GL_POINT_SPRITE_ARB); + glTexEnvi(GL_POINT_SPRITE_ARB, GL_COORD_REPLACE_ARB, GL_TRUE); + glEnable(GL_VERTEX_PROGRAM_POINT_SIZE_NV); + glDepthMask(GL_TRUE); + glEnable(GL_DEPTH_TEST); + + glUseProgram(m_program); + glUniform1f( glGetUniformLocation(m_program, "pointScale"), m_window_h / tanf(m_fov*0.5f*(float)M_PI/180.0f) ); + glUniform1f( glGetUniformLocation(m_program, "pointRadius"), m_particleRadius ); + + glColor3f(1, 1, 1); + _drawPoints(); + + glUseProgram(0); + glDisable(GL_POINT_SPRITE_ARB); + break; + } +} + +GLuint +ParticleRenderer::_compileProgram(const char *vsource, const char *fsource) +{ + GLuint vertexShader = glCreateShader(GL_VERTEX_SHADER); + GLuint fragmentShader = glCreateShader(GL_FRAGMENT_SHADER); + + glShaderSource(vertexShader, 1, &vsource, 0); + glShaderSource(fragmentShader, 1, &fsource, 0); + + glCompileShader(vertexShader); + glCompileShader(fragmentShader); + + GLuint program = glCreateProgram(); + + glAttachShader(program, vertexShader); + glAttachShader(program, fragmentShader); + + glLinkProgram(program); + + // check if program linked + GLint success = 0; + glGetProgramiv(program, GL_LINK_STATUS, &success); + + if (!success) { + char temp[256]; + glGetProgramInfoLog(program, 256, 0, temp); + printf("Failed to link program:\n%s\n", temp); + glDeleteProgram(program); + program = 0; + } + + return program; +} + +void ParticleRenderer::_initGL() +{ + m_program = _compileProgram(vertexShader, spherePixelShader); + +#if !defined(__APPLE__) && !defined(MACOSX) + glClampColorARB(GL_CLAMP_VERTEX_COLOR_ARB, GL_FALSE); + glClampColorARB(GL_CLAMP_FRAGMENT_COLOR_ARB, GL_FALSE); +#endif +} + + +void ParticleRenderer::showProfileInfo(float& xOffset,float& yStart, float yIncr) +{ +#ifndef BT_NO_PROFILE + + static double time_since_reset = 0.f; +// if (!m_idle) + { + time_since_reset = CProfileManager::Get_Time_Since_Reset(); + } + beginWinCoords(); + + { + //recompute profiling data, and store profile strings + + char blockTime[128]; + + double totalTime = 0; + + int frames_since_reset = CProfileManager::Get_Frame_Count_Since_Reset(); + + m_profileIterator->First(); + + double parent_time = m_profileIterator->Is_Root() ? time_since_reset : m_profileIterator->Get_Current_Parent_Total_Time(); + + { + sprintf(blockTime,"--- Profiling: %s (total running time: %.3f ms) ---", m_profileIterator->Get_Current_Parent_Name(), parent_time ); + displayProfileString(xOffset,yStart,blockTime); + yStart += yIncr; + sprintf(blockTime,"press number (1,2...) to display child timings, or 0 to go up to parent" ); + displayProfileString(xOffset,yStart,blockTime); + yStart += yIncr; + + } + double accumulated_time = 0.f; + + for (int i = 0; !m_profileIterator->Is_Done(); m_profileIterator->Next()) + { + double current_total_time = m_profileIterator->Get_Current_Total_Time(); + accumulated_time += current_total_time; + double fraction = parent_time > SIMD_EPSILON ? (current_total_time / parent_time) * 100 : 0.f; + + sprintf(blockTime,"%d -- %s (%.2f %%) :: %.3f ms / frame (%d calls)", + ++i, m_profileIterator->Get_Current_Name(), fraction, + (current_total_time / (double)frames_since_reset),m_profileIterator->Get_Current_Total_Calls()); + displayProfileString(xOffset,yStart,blockTime); + yStart += yIncr; + totalTime += current_total_time; + } + + sprintf(blockTime,"%s (%.3f %%) :: %.3f ms", "Unaccounted", + // (min(0, time_since_reset - totalTime) / time_since_reset) * 100); + parent_time > SIMD_EPSILON ? ((parent_time - accumulated_time) / parent_time) * 100 : 0.f, parent_time - accumulated_time); + + displayProfileString(xOffset,yStart,blockTime); + yStart += yIncr; + sprintf(blockTime,"-------------------------------------------------"); + displayProfileString(xOffset,yStart,blockTime); + yStart += yIncr; + + } + endWinCoords(); +#endif//BT_NO_PROFILE +} + + +void ParticleRenderer::displayProfileString(int xOffset,int yStart,char* message) +{ + glRasterPos3f(xOffset,yStart,0); + BMF_DrawString(BMF_GetFont(BMF_kHelvetica10),message); +} diff --git a/BulletPhysics/bulletTrunk/Extras/CUDA/render_particles.h b/BulletPhysics/bulletTrunk/Extras/CUDA/render_particles.h new file mode 100644 index 00000000..8b766229 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CUDA/render_particles.h @@ -0,0 +1,82 @@ +/* + * Copyright 1993-2006 NVIDIA Corporation. All rights reserved. + * + * NOTICE TO USER: + * + * This source code is subject to NVIDIA ownership rights under U.S. and + * international Copyright laws. + * + * NVIDIA MAKES NO REPRESENTATION ABOUT THE SUITABILITY OF THIS SOURCE + * CODE FOR ANY PURPOSE. IT IS PROVIDED "AS IS" WITHOUT EXPRESS OR + * IMPLIED WARRANTY OF ANY KIND. NVIDIA DISCLAIMS ALL WARRANTIES WITH + * REGARD TO THIS SOURCE CODE, INCLUDING ALL IMPLIED WARRANTIES OF + * MERCHANTABILITY, NONINFRINGEMENT, AND FITNESS FOR A PARTICULAR PURPOSE. + * IN NO EVENT SHALL NVIDIA BE LIABLE FOR ANY SPECIAL, INDIRECT, INCIDENTAL, + * OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS + * OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE + * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE + * OR PERFORMANCE OF THIS SOURCE CODE. + * + * U.S. Government End Users. This source code is a "commercial item" as + * that term is defined at 48 C.F.R. 2.101 (OCT 1995), consisting of + * "commercial computer software" and "commercial computer software + * documentation" as such terms are used in 48 C.F.R. 12.212 (SEPT 1995) + * and is provided to the U.S. Government only as a commercial end item. + * Consistent with 48 C.F.R.12.212 and 48 C.F.R. 227.7202-1 through + * 227.7202-4 (JUNE 1995), all U.S. Government End Users acquire the + * source code with only those rights set forth herein. + */ + +#ifndef __RENDER_PARTICLES__ +#define __RENDER_PARTICLES__ + +class ParticleRenderer +{ +public: + ParticleRenderer(); + ~ParticleRenderer(); + + void setPositions(float *pos, int numParticles); + void setVertexBuffer(unsigned int vbo, int numParticles); + void setColorBuffer(unsigned int vbo) { m_colorVBO = vbo; } + + enum DisplayMode + { + PARTICLE_POINTS, + PARTICLE_SPHERES, + PARTICLE_NUM_MODES + }; + + void display(DisplayMode mode = PARTICLE_POINTS); + void displayGrid(); + + void setPointSize(float size) { m_pointSize = size; } + void setParticleRadius(float r) { m_particleRadius = r; } + void setFOV(float fov) { m_fov = fov; } + void setWindowSize(int w, int h) { m_window_w = w; m_window_h = h; } + + void showProfileInfo(float& xOffset,float& yStart, float yIncr); + void displayProfileString(int xOffset,int yStart,char* message); + class CProfileIterator* m_profileIterator; + +protected: // methods + void _initGL(); + void _drawPoints(); + GLuint _compileProgram(const char *vsource, const char *fsource); + +protected: // data + float *m_pos; + int m_numParticles; + + float m_pointSize; + float m_particleRadius; + float m_fov; + int m_window_w, m_window_h; + + GLuint m_program; + + GLuint m_vbo; + GLuint m_colorVBO; +}; + +#endif //__ RENDER_PARTICLES__ diff --git a/BulletPhysics/bulletTrunk/Extras/CUDA/shaders.cpp b/BulletPhysics/bulletTrunk/Extras/CUDA/shaders.cpp new file mode 100644 index 00000000..0a76cff9 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CUDA/shaders.cpp @@ -0,0 +1,41 @@ +#define STRINGIFY(A) #A + +// vertex shader +const char *vertexShader = STRINGIFY( +uniform float pointRadius; // point size in world space +uniform float pointScale; // scale to calculate size in pixels +uniform float densityScale; +uniform float densityOffset; +void main() +{ + // calculate window-space point size + vec3 posEye = vec3(gl_ModelViewMatrix * vec4(gl_Vertex.xyz, 1.0)); + float dist = length(posEye); + gl_PointSize = pointRadius * (pointScale / dist); + + gl_TexCoord[0] = gl_MultiTexCoord0; + gl_Position = gl_ModelViewProjectionMatrix * vec4(gl_Vertex.xyz, 1.0); + + gl_FrontColor = gl_Color; +} +); + +// pixel shader for rendering points as shaded spheres +const char *spherePixelShader = STRINGIFY( +void main() +{ + const vec3 lightDir = vec3(0.577, 0.577, 0.577); + + // calculate normal from texture coordinates + vec3 N; + N.xy = gl_TexCoord[0].xy*vec2(2.0, -2.0) + vec2(-1.0, 1.0); + float mag = dot(N.xy, N.xy); + if (mag > 1.0) discard; // kill pixels outside circle + N.z = sqrt(1.0-mag); + + // calculate lighting + float diffuse = max(0.0, dot(lightDir, N)); + + gl_FragColor = gl_Color * diffuse; +} +); diff --git a/BulletPhysics/bulletTrunk/Extras/CUDA/shaders.h b/BulletPhysics/bulletTrunk/Extras/CUDA/shaders.h new file mode 100644 index 00000000..e5b4b1d6 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/CUDA/shaders.h @@ -0,0 +1,2 @@ +extern const char *vertexShader; +extern const char *spherePixelShader; diff --git a/BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/CMakeLists.txt b/BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/CMakeLists.txt new file mode 100644 index 00000000..4509f495 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/CMakeLists.txt @@ -0,0 +1,15 @@ +INCLUDE_DIRECTORIES( + ${BULLET_PHYSICS_SOURCE_DIR}/Extras/ConvexDecomposition ${BULLET_PHYSICS_SOURCE_DIR}/src +) + +ADD_LIBRARY(ConvexDecomposition + ConvexDecomposition.h bestfitobb.cpp cd_vector.h concavity.h float_math.h planetri.h splitplane.h +ConvexBuilder.cpp bestfitobb.h cd_wavefront.cpp fitsphere.cpp meshvolume.cpp raytri.cpp vlookup.cpp +ConvexBuilder.h bestfit.cpp cd_hull.cpp cd_wavefront.h fitsphere.h meshvolume.h raytri.h vlookup.h +ConvexDecomposition.cpp bestfit.h cd_hull.h concavity.cpp float_math.cpp planetri.cpp splitplane.cpp + +) + +IF (BUILD_SHARED_LIBS) + TARGET_LINK_LIBRARIES(ConvexDecomposition BulletCollision LinearMath) +ENDIF (BUILD_SHARED_LIBS) diff --git a/BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/ConvexBuilder.cpp b/BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/ConvexBuilder.cpp new file mode 100644 index 00000000..b3d6a8c6 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/ConvexBuilder.cpp @@ -0,0 +1,373 @@ +#include "float_math.h" +#include "ConvexBuilder.h" +#include "meshvolume.h" +#include "bestfit.h" +#include +#include "cd_hull.h" + +#include "fitsphere.h" +#include "bestfitobb.h" + +unsigned int MAXDEPTH = 8 ; +float CONCAVE_PERCENT = 1.0f ; +float MERGE_PERCENT = 2.0f ; + +CHull::CHull(const ConvexResult &result) +{ + mResult = new ConvexResult(result); + mVolume = computeMeshVolume( result.mHullVertices, result.mHullTcount, result.mHullIndices ); + + mDiagonal = getBoundingRegion( result.mHullVcount, result.mHullVertices, sizeof(float)*3, mMin, mMax ); + + float dx = mMax[0] - mMin[0]; + float dy = mMax[1] - mMin[1]; + float dz = mMax[2] - mMin[2]; + + dx*=0.1f; // inflate 1/10th on each edge + dy*=0.1f; // inflate 1/10th on each edge + dz*=0.1f; // inflate 1/10th on each edge + + mMin[0]-=dx; + mMin[1]-=dy; + mMin[2]-=dz; + + mMax[0]+=dx; + mMax[1]+=dy; + mMax[2]+=dz; + + +} + +CHull::~CHull(void) +{ + delete mResult; +} + +bool CHull::overlap(const CHull &h) const +{ + return overlapAABB(mMin,mMax, h.mMin, h.mMax ); +} + + + + +ConvexBuilder::ConvexBuilder(ConvexDecompInterface *callback) +{ + mCallback = callback; +} + +ConvexBuilder::~ConvexBuilder(void) +{ + int i; + for (i=0;ioverlap(*b) ) return 0; // if their AABB's (with a little slop) don't overlap, then return. + + CHull *ret = 0; + + // ok..we are going to combine both meshes into a single mesh + // and then we are going to compute the concavity... + + VertexLookup vc = Vl_createVertexLookup(); + + UintVector indices; + + getMesh( *a->mResult, vc, indices ); + getMesh( *b->mResult, vc, indices ); + + unsigned int vcount = Vl_getVcount(vc); + const float *vertices = Vl_getVertices(vc); + unsigned int tcount = indices.size()/3; + + //don't do anything if hull is empty + if (!tcount) + { + Vl_releaseVertexLookup (vc); + return 0; + } + + HullResult hresult; + HullLibrary hl; + HullDesc desc; + + desc.SetHullFlag(QF_TRIANGLES); + + desc.mVcount = vcount; + desc.mVertices = vertices; + desc.mVertexStride = sizeof(float)*3; + + HullError hret = hl.CreateConvexHull(desc,hresult); + + if ( hret == QE_OK ) + { + + float combineVolume = computeMeshVolume( hresult.mOutputVertices, hresult.mNumFaces, hresult.mIndices ); + float sumVolume = a->mVolume + b->mVolume; + + float percent = (sumVolume*100) / combineVolume; + if ( percent >= (100.0f-MERGE_PERCENT) ) + { + ConvexResult cr(hresult.mNumOutputVertices, hresult.mOutputVertices, hresult.mNumFaces, hresult.mIndices); + ret = new CHull(cr); + } + } + + + Vl_releaseVertexLookup(vc); + + return ret; +} + +bool ConvexBuilder::combineHulls(void) +{ + + bool combine = false; + + sortChulls(mChulls); // sort the convex hulls, largest volume to least... + + CHullVector output; // the output hulls... + + + int i; + + for (i=0;imResult; // the high resolution hull... + + HullResult result; + HullLibrary hl; + HullDesc hdesc; + + hdesc.SetHullFlag(QF_TRIANGLES); + + hdesc.mVcount = c.mHullVcount; + hdesc.mVertices = c.mHullVertices; + hdesc.mVertexStride = sizeof(float)*3; + hdesc.mMaxVertices = desc.mMaxVertices; // maximum number of vertices allowed in the output + + if ( desc.mSkinWidth ) + { + hdesc.mSkinWidth = desc.mSkinWidth; + hdesc.SetHullFlag(QF_SKIN_WIDTH); // do skin width computation. + } + + HullError ret = hl.CreateConvexHull(hdesc,result); + + if ( ret == QE_OK ) + { + ConvexResult r(result.mNumOutputVertices, result.mOutputVertices, result.mNumFaces, result.mIndices); + + r.mHullVolume = computeMeshVolume( result.mOutputVertices, result.mNumFaces, result.mIndices ); // the volume of the hull. + + // compute the best fit OBB + computeBestFitOBB( result.mNumOutputVertices, result.mOutputVertices, sizeof(float)*3, r.mOBBSides, r.mOBBTransform ); + + r.mOBBVolume = r.mOBBSides[0] * r.mOBBSides[1] *r.mOBBSides[2]; // compute the OBB volume. + + fm_getTranslation( r.mOBBTransform, r.mOBBCenter ); // get the translation component of the 4x4 matrix. + + fm_matrixToQuat( r.mOBBTransform, r.mOBBOrientation ); // extract the orientation as a quaternion. + + r.mSphereRadius = computeBoundingSphere( result.mNumOutputVertices, result.mOutputVertices, r.mSphereCenter ); + r.mSphereVolume = fm_sphereVolume( r.mSphereRadius ); + + + mCallback->ConvexDecompResult(r); + } + + hl.ReleaseResult (result); + + + delete cr; + } + + ret = mChulls.size(); + + mChulls.clear(); + + return ret; +} + + +void ConvexBuilder::ConvexDebugTri(const float *p1,const float *p2,const float *p3,unsigned int color) +{ + mCallback->ConvexDebugTri(p1,p2,p3,color); +} + +void ConvexBuilder::ConvexDebugOBB(const float *sides, const float *matrix,unsigned int color) +{ + mCallback->ConvexDebugOBB(sides,matrix,color); +} +void ConvexBuilder::ConvexDebugPoint(const float *p,float dist,unsigned int color) +{ + mCallback->ConvexDebugPoint(p,dist,color); +} + +void ConvexBuilder::ConvexDebugBound(const float *bmin,const float *bmax,unsigned int color) +{ + mCallback->ConvexDebugBound(bmin,bmax,color); +} + +void ConvexBuilder::ConvexDecompResult(ConvexResult &result) +{ + CHull *ch = new CHull(result); + mChulls.push_back(ch); +} + +void ConvexBuilder::sortChulls(CHullVector &hulls) +{ + hulls.quickSort(CHullSort()); + //hulls.heapSort(CHullSort()); +} + + diff --git a/BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/ConvexBuilder.h b/BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/ConvexBuilder.h new file mode 100644 index 00000000..b1d98cb6 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/ConvexBuilder.h @@ -0,0 +1,112 @@ +#ifndef CONVEX_BUILDER_H +#define CONVEX_BUILDER_H + +/*---------------------------------------------------------------------- +Copyright (c) 2004 Open Dynamics Framework Group +www.physicstools.org +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided +that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list of conditions +and the following disclaimer. + +Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation +and/or other materials provided with the distribution. + +Neither the name of the Open Dynamics Framework Group nor the names of its contributors may +be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, +INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-----------------------------------------------------------------------*/ + +// http://codesuppository.blogspot.com +// +// mailto: jratcliff@infiniplex.net +// +// http://www.amillionpixels.us +// + + +#include "ConvexDecomposition.h" +#include "vlookup.h" +#include "LinearMath/btAlignedObjectArray.h" + +using namespace ConvexDecomposition; + + +class CHull +{ +public: + CHull(const ConvexResult &result); + + ~CHull(void); + + bool overlap(const CHull &h) const; + + float mMin[3]; + float mMax[3]; + float mVolume; + float mDiagonal; // long edge.. + ConvexResult *mResult; +}; + +// Usage: std::sort( list.begin(), list.end(), StringSortRef() ); +class CHullSort +{ +public: + + inline bool operator()(const CHull *a,const CHull *b) const + { + return a->mVolume < b->mVolume; + } +}; + + +typedef btAlignedObjectArray< CHull * > CHullVector; + + + +class ConvexBuilder : public ConvexDecompInterface +{ +public: + ConvexBuilder(ConvexDecompInterface *callback); + + virtual ~ConvexBuilder(void); + + bool isDuplicate(unsigned int i1,unsigned int i2,unsigned int i3, + unsigned int ci1,unsigned int ci2,unsigned int ci3); + + void getMesh(const ConvexResult &cr,VertexLookup vc,UintVector &indices); + + CHull * canMerge(CHull *a,CHull *b); + + bool combineHulls(void); + + unsigned int process(const DecompDesc &desc); + + virtual void ConvexDebugTri(const float *p1,const float *p2,const float *p3,unsigned int color); + + virtual void ConvexDebugOBB(const float *sides, const float *matrix,unsigned int color); + virtual void ConvexDebugPoint(const float *p,float dist,unsigned int color); + + virtual void ConvexDebugBound(const float *bmin,const float *bmax,unsigned int color); + + virtual void ConvexDecompResult(ConvexResult &result); + + void sortChulls(CHullVector &hulls); + + CHullVector mChulls; + ConvexDecompInterface *mCallback; +}; + +#endif //CONVEX_BUILDER_H + diff --git a/BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/ConvexDecomposition.cpp b/BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/ConvexDecomposition.cpp new file mode 100644 index 00000000..572d25f5 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/ConvexDecomposition.cpp @@ -0,0 +1,375 @@ +#include "float_math.h" + +#include +#include +#include +#include + + +/*---------------------------------------------------------------------- + Copyright (c) 2004 Open Dynamics Framework Group + www.physicstools.org + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, are permitted provided + that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + Neither the name of the Open Dynamics Framework Group nor the names of its contributors may + be used to endorse or promote products derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-----------------------------------------------------------------------*/ + +// http://codesuppository.blogspot.com +// +// mailto: jratcliff@infiniplex.net +// +// http://www.amillionpixels.us +// + +#include "ConvexDecomposition.h" +#include "cd_vector.h" +#include "cd_hull.h" +#include "bestfit.h" +#include "planetri.h" +#include "vlookup.h" +#include "splitplane.h" +#include "meshvolume.h" +#include "concavity.h" +#include "bestfitobb.h" +#include "float_math.h" +#include "fitsphere.h" + +#define SHOW_MESH 0 +#define MAKE_MESH 1 + + +using namespace ConvexDecomposition; + + + +namespace ConvexDecomposition +{ + +class FaceTri +{ +public: + FaceTri(void) { }; + FaceTri(const float *vertices,unsigned int i1,unsigned int i2,unsigned int i3) + { + mP1.Set( &vertices[i1*3] ); + mP2.Set( &vertices[i2*3] ); + mP3.Set( &vertices[i3*3] ); + } + + Vector3d mP1; + Vector3d mP2; + Vector3d mP3; + Vector3d mNormal; + +}; + + +void addTri(VertexLookup vl,UintVector &list,const Vector3d &p1,const Vector3d &p2,const Vector3d &p3) +{ + unsigned int i1 = Vl_getIndex(vl, p1.Ptr() ); + unsigned int i2 = Vl_getIndex(vl, p2.Ptr() ); + unsigned int i3 = Vl_getIndex(vl, p3.Ptr() ); + + // do *not* process degenerate triangles! + + if ( i1 != i2 && i1 != i3 && i2 != i3 ) + { + list.push_back(i1); + list.push_back(i2); + list.push_back(i3); + } +} + + +void calcConvexDecomposition(unsigned int vcount, + const float *vertices, + unsigned int tcount, + const unsigned int *indices, + ConvexDecompInterface *callback, + float masterVolume, + unsigned int depth) + +{ + + float plane[4]; + + bool split = false; + + + if ( depth < MAXDEPTH ) + { + + float volume; + float c = computeConcavity( vcount, vertices, tcount, indices, callback, plane, volume ); + + if ( depth == 0 ) + { + masterVolume = volume; + } + + float percent = (c*100.0f)/masterVolume; + + if ( percent > CONCAVE_PERCENT ) // if great than 5% of the total volume is concave, go ahead and keep splitting. + { + split = true; + } + + } + + if ( depth >= MAXDEPTH || !split ) + { + +#if 1 + + HullResult result; + HullLibrary hl; + HullDesc desc; + + desc.SetHullFlag(QF_TRIANGLES); + + desc.mVcount = vcount; + desc.mVertices = vertices; + desc.mVertexStride = sizeof(float)*3; + + HullError ret = hl.CreateConvexHull(desc,result); + + if ( ret == QE_OK ) + { + + ConvexResult r(result.mNumOutputVertices, result.mOutputVertices, result.mNumFaces, result.mIndices); + + + callback->ConvexDecompResult(r); + } + + +#else + + static unsigned int colors[8] = + { + 0xFF0000, + 0x00FF00, + 0x0000FF, + 0xFFFF00, + 0x00FFFF, + 0xFF00FF, + 0xFFFFFF, + 0xFF8040 + }; + + static int count = 0; + + count++; + + if ( count == 8 ) count = 0; + + assert( count >= 0 && count < 8 ); + + unsigned int color = colors[count]; + + const unsigned int *source = indices; + + for (unsigned int i=0; iConvexDebugTri( t.mP1.Ptr(), t.mP2.Ptr(), t.mP3.Ptr(), color ); + + } +#endif + + hl.ReleaseResult (result); + return; + + } + + UintVector ifront; + UintVector iback; + + VertexLookup vfront = Vl_createVertexLookup(); + VertexLookup vback = Vl_createVertexLookup(); + + + bool showmesh = false; + #if SHOW_MESH + showmesh = true; + #endif + + if ( 0 ) + { + showmesh = true; + for (float x=-1; x<1; x+=0.10f) + { + for (float y=0; y<1; y+=0.10f) + { + for (float z=-1; z<1; z+=0.04f) + { + float d = x*plane[0] + y*plane[1] + z*plane[2] + plane[3]; + Vector3d p(x,y,z); + if ( d >= 0 ) + callback->ConvexDebugPoint(p.Ptr(), 0.02f, 0x00FF00); + else + callback->ConvexDebugPoint(p.Ptr(), 0.02f, 0xFF0000); + } + } + } + } + + if ( 1 ) + { + // ok..now we are going to 'split' all of the input triangles against this plane! + const unsigned int *source = indices; + for (unsigned int i=0; i 4 || bcount > 4 ) + { + result = planeTriIntersection(plane,t.mP1.Ptr(),sizeof(Vector3d),0.00001f,front[0].Ptr(),fcount,back[0].Ptr(),bcount ); + } + + switch ( result ) + { + case PTR_FRONT: + + assert( fcount == 3 ); + + if ( showmesh ) + callback->ConvexDebugTri( front[0].Ptr(), front[1].Ptr(), front[2].Ptr(), 0x00FF00 ); + + #if MAKE_MESH + + addTri( vfront, ifront, front[0], front[1], front[2] ); + + + #endif + + break; + case PTR_BACK: + assert( bcount == 3 ); + + if ( showmesh ) + callback->ConvexDebugTri( back[0].Ptr(), back[1].Ptr(), back[2].Ptr(), 0xFFFF00 ); + + #if MAKE_MESH + + addTri( vback, iback, back[0], back[1], back[2] ); + + #endif + + break; + case PTR_SPLIT: + + assert( fcount >= 3 && fcount <= 4); + assert( bcount >= 3 && bcount <= 4); + + #if MAKE_MESH + + addTri( vfront, ifront, front[0], front[1], front[2] ); + addTri( vback, iback, back[0], back[1], back[2] ); + + + if ( fcount == 4 ) + { + addTri( vfront, ifront, front[0], front[2], front[3] ); + } + + if ( bcount == 4 ) + { + addTri( vback, iback, back[0], back[2], back[3] ); + } + + #endif + + if ( showmesh ) + { + callback->ConvexDebugTri( front[0].Ptr(), front[1].Ptr(), front[2].Ptr(), 0x00D000 ); + callback->ConvexDebugTri( back[0].Ptr(), back[1].Ptr(), back[2].Ptr(), 0xD0D000 ); + + if ( fcount == 4 ) + { + callback->ConvexDebugTri( front[0].Ptr(), front[2].Ptr(), front[3].Ptr(), 0x00D000 ); + } + if ( bcount == 4 ) + { + callback->ConvexDebugTri( back[0].Ptr(), back[2].Ptr(), back[3].Ptr(), 0xD0D000 ); + } + } + + break; + } + } + + // ok... here we recursively call + if ( ifront.size() ) + { + unsigned int vcount = Vl_getVcount(vfront); + const float *vertices = Vl_getVertices(vfront); + unsigned int tcount = ifront.size()/3; + + calcConvexDecomposition(vcount, vertices, tcount, &ifront[0], callback, masterVolume, depth+1); + + } + + ifront.clear(); + + Vl_releaseVertexLookup(vfront); + + if ( iback.size() ) + { + unsigned int vcount = Vl_getVcount(vback); + const float *vertices = Vl_getVertices(vback); + unsigned int tcount = iback.size()/3; + + calcConvexDecomposition(vcount, vertices, tcount, &iback[0], callback, masterVolume, depth+1); + + } + + iback.clear(); + Vl_releaseVertexLookup(vback); + + } +} + + + + +} diff --git a/BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/ConvexDecomposition.h b/BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/ConvexDecomposition.h new file mode 100644 index 00000000..09045808 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/ConvexDecomposition.h @@ -0,0 +1,220 @@ +#ifndef CONVEX_DECOMPOSITION_H + +#define CONVEX_DECOMPOSITION_H + +/*---------------------------------------------------------------------- +Copyright (c) 2004 Open Dynamics Framework Group +www.physicstools.org +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided +that the following conditions are met: + +Redistributions of source code must retain the above copyright notice, this list of conditions +and the following disclaimer. + +Redistributions in binary form must reproduce the above copyright notice, +this list of conditions and the following disclaimer in the documentation +and/or other materials provided with the distribution. + +Neither the name of the Open Dynamics Framework Group nor the names of its contributors may +be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, +INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, +EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER +IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF +THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-----------------------------------------------------------------------*/ + +// http://codesuppository.blogspot.com +// +// mailto: jratcliff@infiniplex.net +// +// http://www.amillionpixels.us +// + + +#ifdef WIN32 +#include //memcpy +#endif +#include +#include +#include "LinearMath/btAlignedObjectArray.h" + + + +extern unsigned int MAXDEPTH ; +extern float CONCAVE_PERCENT ; +extern float MERGE_PERCENT ; + + +typedef btAlignedObjectArray< unsigned int > UintVector; + + + +namespace ConvexDecomposition +{ + + class ConvexResult + { + public: + ConvexResult(void) + { + mHullVcount = 0; + mHullVertices = 0; + mHullTcount = 0; + mHullIndices = 0; + } + + ConvexResult(unsigned int hvcount,const float *hvertices,unsigned int htcount,const unsigned int *hindices) + { + mHullVcount = hvcount; + if ( mHullVcount ) + { + mHullVertices = new float[mHullVcount*sizeof(float)*3]; + memcpy(mHullVertices, hvertices, sizeof(float)*3*mHullVcount ); + } + else + { + mHullVertices = 0; + } + + mHullTcount = htcount; + + if ( mHullTcount ) + { + mHullIndices = new unsigned int[sizeof(unsigned int)*mHullTcount*3]; + memcpy(mHullIndices,hindices, sizeof(unsigned int)*mHullTcount*3 ); + } + else + { + mHullIndices = 0; + } + + } + + ConvexResult(const ConvexResult &r) + { + mHullVcount = r.mHullVcount; + if ( mHullVcount ) + { + mHullVertices = new float[mHullVcount*sizeof(float)*3]; + memcpy(mHullVertices, r.mHullVertices, sizeof(float)*3*mHullVcount ); + } + else + { + mHullVertices = 0; + } + mHullTcount = r.mHullTcount; + if ( mHullTcount ) + { + mHullIndices = new unsigned int[sizeof(unsigned int)*mHullTcount*3]; + memcpy(mHullIndices, r.mHullIndices, sizeof(unsigned int)*mHullTcount*3 ); + } + else + { + mHullIndices = 0; + } + } + + ~ConvexResult(void) + { + delete [] mHullVertices; + delete [] mHullIndices; + } + + // the convex hull. + unsigned int mHullVcount; + float * mHullVertices; + unsigned int mHullTcount; + unsigned int *mHullIndices; + + float mHullVolume; // the volume of the convex hull. + + float mOBBSides[3]; // the width, height and breadth of the best fit OBB + float mOBBCenter[3]; // the center of the OBB + float mOBBOrientation[4]; // the quaternion rotation of the OBB. + float mOBBTransform[16]; // the 4x4 transform of the OBB. + float mOBBVolume; // the volume of the OBB + + float mSphereRadius; // radius and center of best fit sphere + float mSphereCenter[3]; + float mSphereVolume; // volume of the best fit sphere + + + + }; + + class ConvexDecompInterface + { + public: + virtual ~ConvexDecompInterface() {}; + virtual void ConvexDebugTri(const float *p1,const float *p2,const float *p3,unsigned int color) { }; + virtual void ConvexDebugPoint(const float *p,float dist,unsigned int color) { }; + virtual void ConvexDebugBound(const float *bmin,const float *bmax,unsigned int color) { }; + virtual void ConvexDebugOBB(const float *sides, const float *matrix,unsigned int color) { }; + + virtual void ConvexDecompResult(ConvexResult &result) = 0; + + + + }; + + // just to avoid passing a zillion parameters to the method the + // options are packed into this descriptor. + class DecompDesc + { + public: + DecompDesc(void) + { + mVcount = 0; + mVertices = 0; + mTcount = 0; + mIndices = 0; + mDepth = 5; + mCpercent = 5; + mPpercent = 5; + mMaxVertices = 32; + mSkinWidth = 0; + mCallback = 0; + } + + // describes the input triangle. + unsigned int mVcount; // the number of vertices in the source mesh. + const float *mVertices; // start of the vertex position array. Assumes a stride of 3 floats. + unsigned int mTcount; // the number of triangles in the source mesh. + unsigned int *mIndices; // the indexed triangle list array (zero index based) + + // options + unsigned int mDepth; // depth to split, a maximum of 10, generally not over 7. + float mCpercent; // the concavity threshold percentage. 0=20 is reasonable. + float mPpercent; // the percentage volume conservation threshold to collapse hulls. 0-30 is reasonable. + + // hull output limits. + unsigned int mMaxVertices; // maximum number of vertices in the output hull. Recommended 32 or less. + float mSkinWidth; // a skin width to apply to the output hulls. + + ConvexDecompInterface *mCallback; // the interface to receive back the results. + + }; + + // perform approximate convex decomposition on a mesh. + unsigned int performConvexDecomposition(const DecompDesc &desc); // returns the number of hulls produced. + + + void calcConvexDecomposition(unsigned int vcount, + const float *vertices, + unsigned int tcount, + const unsigned int *indices, + ConvexDecompInterface *callback, + float masterVolume, + unsigned int depth); + + +} + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/Jamfile b/BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/Jamfile new file mode 100644 index 00000000..6b64798a --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/Jamfile @@ -0,0 +1,15 @@ +SubDir TOP Extras ConvexDecomposition ; + +Library convexdecomposition : [ Wildcard *.h *.cpp ] : noinstall ; + +CFlags convexdecomposition : +[ FIncludes $(TOP)/Extras/Decomposition ] +[ FIncludes $(TOP)/src ] +; + +LibDepends convexdecomposition : ; + +MsvcGenConfig ConvexDecomposition.INCDIRS : $(TOP)/Extras/ConvexDecomposition $(TOP)/src ; + + +#InstallHeader [ Wildcard *.h ] : ConvexDecomposition ; diff --git a/BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/bestfit.cpp b/BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/bestfit.cpp new file mode 100644 index 00000000..e6469f6f --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/bestfit.cpp @@ -0,0 +1,466 @@ +#include "float_math.h" +#include +#include +#include +#include +#include + +/*---------------------------------------------------------------------- + Copyright (c) 2004 Open Dynamics Framework Group + www.physicstools.org + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, are permitted provided + that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + Neither the name of the Open Dynamics Framework Group nor the names of its contributors may + be used to endorse or promote products derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-----------------------------------------------------------------------*/ + +// http://codesuppository.blogspot.com +// +// mailto: jratcliff@infiniplex.net +// +// http://www.amillionpixels.us +// +// Geometric Tools, Inc. +// http://www.geometrictools.com +// Copyright (c) 1998-2006. All Rights Reserved +// +// The Wild Magic Library (WM3) source code is supplied under the terms of +// the license agreement +// http://www.geometrictools.com/License/WildMagic3License.pdf +// and may not be copied or disclosed except in accordance with the terms +// of that agreement. + +#include "bestfit.h" + +namespace BestFit +{ + +class Vec3 +{ +public: + Vec3(void) { }; + Vec3(float _x,float _y,float _z) { x = _x; y = _y; z = _z; }; + + + float dot(const Vec3 &v) + { + return x*v.x + y*v.y + z*v.z; // the dot product + } + + float x; + float y; + float z; +}; + + +class Eigen +{ +public: + + + void DecrSortEigenStuff(void) + { + Tridiagonal(); //diagonalize the matrix. + QLAlgorithm(); // + DecreasingSort(); + GuaranteeRotation(); + } + + void Tridiagonal(void) + { + float fM00 = mElement[0][0]; + float fM01 = mElement[0][1]; + float fM02 = mElement[0][2]; + float fM11 = mElement[1][1]; + float fM12 = mElement[1][2]; + float fM22 = mElement[2][2]; + + m_afDiag[0] = fM00; + m_afSubd[2] = 0; + if (fM02 != (float)0.0) + { + float fLength = sqrtf(fM01*fM01+fM02*fM02); + float fInvLength = ((float)1.0)/fLength; + fM01 *= fInvLength; + fM02 *= fInvLength; + float fQ = ((float)2.0)*fM01*fM12+fM02*(fM22-fM11); + m_afDiag[1] = fM11+fM02*fQ; + m_afDiag[2] = fM22-fM02*fQ; + m_afSubd[0] = fLength; + m_afSubd[1] = fM12-fM01*fQ; + mElement[0][0] = (float)1.0; + mElement[0][1] = (float)0.0; + mElement[0][2] = (float)0.0; + mElement[1][0] = (float)0.0; + mElement[1][1] = fM01; + mElement[1][2] = fM02; + mElement[2][0] = (float)0.0; + mElement[2][1] = fM02; + mElement[2][2] = -fM01; + m_bIsRotation = false; + } + else + { + m_afDiag[1] = fM11; + m_afDiag[2] = fM22; + m_afSubd[0] = fM01; + m_afSubd[1] = fM12; + mElement[0][0] = (float)1.0; + mElement[0][1] = (float)0.0; + mElement[0][2] = (float)0.0; + mElement[1][0] = (float)0.0; + mElement[1][1] = (float)1.0; + mElement[1][2] = (float)0.0; + mElement[2][0] = (float)0.0; + mElement[2][1] = (float)0.0; + mElement[2][2] = (float)1.0; + m_bIsRotation = true; + } + } + + bool QLAlgorithm(void) + { + const int iMaxIter = 32; + + for (int i0 = 0; i0 <3; i0++) + { + int i1; + for (i1 = 0; i1 < iMaxIter; i1++) + { + int i2; + for (i2 = i0; i2 <= (3-2); i2++) + { + float fTmp = fabsf(m_afDiag[i2]) + fabsf(m_afDiag[i2+1]); + if ( fabsf(m_afSubd[i2]) + fTmp == fTmp ) + break; + } + if (i2 == i0) + { + break; + } + + float fG = (m_afDiag[i0+1] - m_afDiag[i0])/(((float)2.0) * m_afSubd[i0]); + float fR = sqrtf(fG*fG+(float)1.0); + if (fG < (float)0.0) + { + fG = m_afDiag[i2]-m_afDiag[i0]+m_afSubd[i0]/(fG-fR); + } + else + { + fG = m_afDiag[i2]-m_afDiag[i0]+m_afSubd[i0]/(fG+fR); + } + float fSin = (float)1.0, fCos = (float)1.0, fP = (float)0.0; + for (int i3 = i2-1; i3 >= i0; i3--) + { + float fF = fSin*m_afSubd[i3]; + float fB = fCos*m_afSubd[i3]; + if (fabsf(fF) >= fabsf(fG)) + { + fCos = fG/fF; + fR = sqrtf(fCos*fCos+(float)1.0); + m_afSubd[i3+1] = fF*fR; + fSin = ((float)1.0)/fR; + fCos *= fSin; + } + else + { + fSin = fF/fG; + fR = sqrtf(fSin*fSin+(float)1.0); + m_afSubd[i3+1] = fG*fR; + fCos = ((float)1.0)/fR; + fSin *= fCos; + } + fG = m_afDiag[i3+1]-fP; + fR = (m_afDiag[i3]-fG)*fSin+((float)2.0)*fB*fCos; + fP = fSin*fR; + m_afDiag[i3+1] = fG+fP; + fG = fCos*fR-fB; + for (int i4 = 0; i4 < 3; i4++) + { + fF = mElement[i4][i3+1]; + mElement[i4][i3+1] = fSin*mElement[i4][i3]+fCos*fF; + mElement[i4][i3] = fCos*mElement[i4][i3]-fSin*fF; + } + } + m_afDiag[i0] -= fP; + m_afSubd[i0] = fG; + m_afSubd[i2] = (float)0.0; + } + if (i1 == iMaxIter) + { + return false; + } + } + return true; + } + + void DecreasingSort(void) + { + //sort eigenvalues in decreasing order, e[0] >= ... >= e[iSize-1] + for (int i0 = 0, i1; i0 <= 3-2; i0++) + { + // locate maximum eigenvalue + i1 = i0; + float fMax = m_afDiag[i1]; + int i2; + for (i2 = i0+1; i2 < 3; i2++) + { + if (m_afDiag[i2] > fMax) + { + i1 = i2; + fMax = m_afDiag[i1]; + } + } + + if (i1 != i0) + { + // swap eigenvalues + m_afDiag[i1] = m_afDiag[i0]; + m_afDiag[i0] = fMax; + // swap eigenvectors + for (i2 = 0; i2 < 3; i2++) + { + float fTmp = mElement[i2][i0]; + mElement[i2][i0] = mElement[i2][i1]; + mElement[i2][i1] = fTmp; + m_bIsRotation = !m_bIsRotation; + } + } + } + } + + + void GuaranteeRotation(void) + { + if (!m_bIsRotation) + { + // change sign on the first column + for (int iRow = 0; iRow <3; iRow++) + { + mElement[iRow][0] = -mElement[iRow][0]; + } + } + } + + float mElement[3][3]; + float m_afDiag[3]; + float m_afSubd[3]; + bool m_bIsRotation; +}; + +} + + +using namespace BestFit; + + +bool getBestFitPlane(unsigned int vcount, + const float *points, + unsigned int vstride, + const float *weights, + unsigned int wstride, + float *plane) +{ + bool ret = false; + + Vec3 kOrigin(0,0,0); + + float wtotal = 0; + + if ( 1 ) + { + const char *source = (const char *) points; + const char *wsource = (const char *) weights; + + for (unsigned int i=0; i bmax[0] ) bmax[0] = p[0]; + if ( p[1] > bmax[1] ) bmax[1] = p[1]; + if ( p[2] > bmax[2] ) bmax[2] = p[2]; + + } + + float dx = bmax[0] - bmin[0]; + float dy = bmax[1] - bmin[1]; + float dz = bmax[2] - bmin[2]; + + return sqrtf( dx*dx + dy*dy + dz*dz ); + +} + + +bool overlapAABB(const float *bmin1,const float *bmax1,const float *bmin2,const float *bmax2) // return true if the two AABB's overlap. +{ + if ( bmax2[0] < bmin1[0] ) return false; // if the maximum is less than our minimum on any axis + if ( bmax2[1] < bmin1[1] ) return false; + if ( bmax2[2] < bmin1[2] ) return false; + + if ( bmin2[0] > bmax1[0] ) return false; // if the minimum is greater than our maximum on any axis + if ( bmin2[1] > bmax1[1] ) return false; // if the minimum is greater than our maximum on any axis + if ( bmin2[2] > bmax1[2] ) return false; // if the minimum is greater than our maximum on any axis + + + return true; // the extents overlap +} + + diff --git a/BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/bestfit.h b/BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/bestfit.h new file mode 100644 index 00000000..f2e78e5a --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/bestfit.h @@ -0,0 +1,65 @@ +#ifndef BEST_FIT_H + +#define BEST_FIT_H + +/*---------------------------------------------------------------------- + Copyright (c) 2004 Open Dynamics Framework Group + www.physicstools.org + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, are permitted provided + that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + Neither the name of the Open Dynamics Framework Group nor the names of its contributors may + be used to endorse or promote products derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-----------------------------------------------------------------------*/ + +// http://codesuppository.blogspot.com +// +// mailto: jratcliff@infiniplex.net +// +// http://www.amillionpixels.us +// + + +// This routine was released in 'snippet' form +// by John W. Ratcliff mailto:jratcliff@infiniplex.net +// on March 22, 2006. +// +// This routine computes the 'best fit' plane equation to +// a set of input data points with an optional per vertex +// weighting component. +// +// The implementation for this was lifted directly from +// David Eberly's Magic Software implementation. + +// computes the best fit plane to a collection of data points. +// returns the plane equation as A,B,C,D format. (Ax+By+Cz+D) + +bool getBestFitPlane(unsigned int vcount, // number of input data points + const float *points, // starting address of points array. + unsigned int vstride, // stride between input points. + const float *weights, // *optional point weighting values. + unsigned int wstride, // weight stride for each vertex. + float *plane); + + +float getBoundingRegion(unsigned int vcount,const float *points,unsigned int pstride,float *bmin,float *bmax); // returns the diagonal distance +bool overlapAABB(const float *bmin1,const float *bmax1,const float *bmin2,const float *bmax2); // return true if the two AABB's overlap. + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/bestfitobb.cpp b/BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/bestfitobb.cpp new file mode 100644 index 00000000..396450bc --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/bestfitobb.cpp @@ -0,0 +1,173 @@ +#include "float_math.h" + +#include +#include +#include +#include +#include + +/*---------------------------------------------------------------------- + Copyright (c) 2004 Open Dynamics Framework Group + www.physicstools.org + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, are permitted provided + that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + Neither the name of the Open Dynamics Framework Group nor the names of its contributors may + be used to endorse or promote products derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-----------------------------------------------------------------------*/ + +// http://codesuppository.blogspot.com +// +// mailto: jratcliff@infiniplex.net +// +// http://www.amillionpixels.us +// + +#include "bestfitobb.h" +#include "float_math.h" + +// computes the OBB for this set of points relative to this transform matrix. +void computeOBB(unsigned int vcount,const float *points,unsigned int pstride,float *sides,const float *matrix) +{ + const char *src = (const char *) points; + + float bmin[3] = { 1e9, 1e9, 1e9 }; + float bmax[3] = { -1e9, -1e9, -1e9 }; + + for (unsigned int i=0; i bmax[0] ) bmax[0] = t[0]; + if ( t[1] > bmax[1] ) bmax[1] = t[1]; + if ( t[2] > bmax[2] ) bmax[2] = t[2]; + + src+=pstride; + } + + + sides[0] = bmax[0]; + sides[1] = bmax[1]; + sides[2] = bmax[2]; + + if ( fabsf(bmin[0]) > sides[0] ) sides[0] = fabsf(bmin[0]); + if ( fabsf(bmin[1]) > sides[1] ) sides[1] = fabsf(bmin[1]); + if ( fabsf(bmin[2]) > sides[2] ) sides[2] = fabsf(bmin[2]); + + sides[0]*=2.0f; + sides[1]*=2.0f; + sides[2]*=2.0f; + +} + +void computeBestFitOBB(unsigned int vcount,const float *points,unsigned int pstride,float *sides,float *matrix) +{ + + float bmin[3]; + float bmax[3]; + + fm_getAABB(vcount,points,pstride,bmin,bmax); + + float center[3]; + + center[0] = (bmax[0]-bmin[0])*0.5f + bmin[0]; + center[1] = (bmax[1]-bmin[1])*0.5f + bmin[1]; + center[2] = (bmax[2]-bmin[2])*0.5f + bmin[2]; + + float ax = 0; + float ay = 0; + float az = 0; + + float sweep = 45.0f; // 180 degree sweep on all three axes. + float steps = 8.0f; // 16 steps on each axis. + + float bestVolume = 1e9; + float angle[3]; + + while ( sweep >= 1 ) + { + + bool found = false; + + float stepsize = sweep / steps; + + for (float x=ax-sweep; x<=ax+sweep; x+=stepsize) + { + for (float y=ay-sweep; y<=ay+sweep; y+=stepsize) + { + for (float z=az-sweep; z<=az+sweep; z+=stepsize) + { + float pmatrix[16]; + + fm_eulerMatrix( x*FM_DEG_TO_RAD, y*FM_DEG_TO_RAD, z*FM_DEG_TO_RAD, pmatrix ); + + pmatrix[3*4+0] = center[0]; + pmatrix[3*4+1] = center[1]; + pmatrix[3*4+2] = center[2]; + + float psides[3]; + + computeOBB( vcount, points, pstride, psides, pmatrix ); + + float volume = psides[0]*psides[1]*psides[2]; // the volume of the cube + + if ( volume <= bestVolume ) + { + bestVolume = volume; + + sides[0] = psides[0]; + sides[1] = psides[1]; + sides[2] = psides[2]; + + angle[0] = ax; + angle[1] = ay; + angle[2] = az; + + memcpy(matrix,pmatrix,sizeof(float)*16); + found = true; // yes, we found an improvement. + } + } + } + } + + if ( found ) + { + + ax = angle[0]; + ay = angle[1]; + az = angle[2]; + + sweep*=0.5f; // sweep 1/2 the distance as the last time. + } + else + { + break; // no improvement, so just + } + + } + +} diff --git a/BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/bestfitobb.h b/BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/bestfitobb.h new file mode 100644 index 00000000..3141f587 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/bestfitobb.h @@ -0,0 +1,43 @@ +#ifndef BEST_FIT_OBB_H + +#define BEST_FIT_OBB_H + +/*---------------------------------------------------------------------- + Copyright (c) 2004 Open Dynamics Framework Group + www.physicstools.org + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, are permitted provided + that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + Neither the name of the Open Dynamics Framework Group nor the names of its contributors may + be used to endorse or promote products derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-----------------------------------------------------------------------*/ + +// http://codesuppository.blogspot.com +// +// mailto: jratcliff@infiniplex.net +// +// http://www.amillionpixels.us +// + + + +void computeBestFitOBB(unsigned int vcount,const float *points,unsigned int pstride,float *sides,float *matrix); + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/cd_hull.cpp b/BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/cd_hull.cpp new file mode 100644 index 00000000..b2f6d8b2 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/cd_hull.cpp @@ -0,0 +1,3257 @@ +#include "float_math.h" + +#include +#include +#include +#include +#include +#include + +/*---------------------------------------------------------------------- + Copyright (c) 2004 Open Dynamics Framework Group + www.physicstools.org + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, are permitted provided + that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + Neither the name of the Open Dynamics Framework Group nor the names of its contributors may + be used to endorse or promote products derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-----------------------------------------------------------------------*/ + +// http://codesuppository.blogspot.com +// +// mailto: jratcliff@infiniplex.net +// +// http://www.amillionpixels.us +// + +#include "cd_hull.h" + +using namespace ConvexDecomposition; + +/*---------------------------------------------------------------------- + Copyright (c) 2004 Open Dynamics Framework Group + www.physicstools.org + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, are permitted provided + that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + Neither the name of the Open Dynamics Framework Group nor the names of its contributors may + be used to endorse or promote products derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-----------------------------------------------------------------------*/ + +#define PI 3.14159264f + +//***************************************************** +//***************************************************** +//********* Stan Melax's vector math template needed +//********* to use his hull building code. +//***************************************************** +//***************************************************** + +#define DEG2RAD (PI / 180.0f) +#define RAD2DEG (180.0f / PI) +#define SQRT_OF_2 (1.4142135f) +#define OFFSET(Class,Member) (((char*) (&(((Class*)NULL)-> Member )))- ((char*)NULL)) + +namespace ConvexDecomposition +{ + + +int argmin(float a[],int n); +float sqr(float a); +float clampf(float a) ; +float Round(float a,float precision); +float Interpolate(const float &f0,const float &f1,float alpha) ; + +template +void Swap(T &a,T &b) +{ + T tmp = a; + a=b; + b=tmp; +} + + + +template +T Max(const T &a,const T &b) +{ + return (a>b)?a:b; +} + +template +T Min(const T &a,const T &b) +{ + return (a=0&&i<2);return ((float*)this)[i];} + const float& operator[](int i) const {assert(i>=0&&i<2);return ((float*)this)[i];} +}; +inline float2 operator-( const float2& a, const float2& b ){return float2(a.x-b.x,a.y-b.y);} +inline float2 operator+( const float2& a, const float2& b ){return float2(a.x+b.x,a.y+b.y);} + +//--------- 3D --------- + +class float3 // 3D +{ + public: + float x,y,z; + float3(){x=0;y=0;z=0;}; + float3(float _x,float _y,float _z){x=_x;y=_y;z=_z;}; + //operator float *() { return &x;}; + float& operator[](int i) {assert(i>=0&&i<3);return ((float*)this)[i];} + const float& operator[](int i) const {assert(i>=0&&i<3);return ((float*)this)[i];} +# ifdef PLUGIN_3DSMAX + float3(const Point3 &p):x(p.x),y(p.y),z(p.z){} + operator Point3(){return *((Point3*)this);} +# endif +}; + + +float3& operator+=( float3 &a, const float3& b ); +float3& operator-=( float3 &a ,const float3& b ); +float3& operator*=( float3 &v ,const float s ); +float3& operator/=( float3 &v, const float s ); + +float magnitude( const float3& v ); +float3 normalize( const float3& v ); +float3 safenormalize(const float3 &v); +float3 vabs(const float3 &v); +float3 operator+( const float3& a, const float3& b ); +float3 operator-( const float3& a, const float3& b ); +float3 operator-( const float3& v ); +float3 operator*( const float3& v, const float s ); +float3 operator*( const float s, const float3& v ); +float3 operator/( const float3& v, const float s ); +inline int operator==( const float3 &a, const float3 &b ) { return (a.x==b.x && a.y==b.y && a.z==b.z); } +inline int operator!=( const float3 &a, const float3 &b ) { return (a.x!=b.x || a.y!=b.y || a.z!=b.z); } +// due to ambiguity and inconsistent standards ther are no overloaded operators for mult such as va*vb. +float dot( const float3& a, const float3& b ); +float3 cmul( const float3 &a, const float3 &b); +float3 cross( const float3& a, const float3& b ); +float3 Interpolate(const float3 &v0,const float3 &v1,float alpha); +float3 Round(const float3& a,float precision); +float3 VectorMax(const float3 &a, const float3 &b); +float3 VectorMin(const float3 &a, const float3 &b); + + + +class float3x3 +{ + public: + float3 x,y,z; // the 3 rows of the Matrix + float3x3(){} + float3x3(float xx,float xy,float xz,float yx,float yy,float yz,float zx,float zy,float zz):x(xx,xy,xz),y(yx,yy,yz),z(zx,zy,zz){} + float3x3(float3 _x,float3 _y,float3 _z):x(_x),y(_y),z(_z){} + float3& operator[](int i) {assert(i>=0&&i<3);return (&x)[i];} + const float3& operator[](int i) const {assert(i>=0&&i<3);return (&x)[i];} + float& operator()(int r, int c) {assert(r>=0&&r<3&&c>=0&&c<3);return ((&x)[r])[c];} + const float& operator()(int r, int c) const {assert(r>=0&&r<3&&c>=0&&c<3);return ((&x)[r])[c];} +}; +float3x3 Transpose( const float3x3& m ); +float3 operator*( const float3& v , const float3x3& m ); +float3 operator*( const float3x3& m , const float3& v ); +float3x3 operator*( const float3x3& m , const float& s ); +float3x3 operator*( const float3x3& ma, const float3x3& mb ); +float3x3 operator/( const float3x3& a, const float& s ) ; +float3x3 operator+( const float3x3& a, const float3x3& b ); +float3x3 operator-( const float3x3& a, const float3x3& b ); +float3x3 &operator+=( float3x3& a, const float3x3& b ); +float3x3 &operator-=( float3x3& a, const float3x3& b ); +float3x3 &operator*=( float3x3& a, const float& s ); +float Determinant(const float3x3& m ); +float3x3 Inverse(const float3x3& a); // its just 3x3 so we simply do that cofactor method + + +//-------- 4D Math -------- + +class float4 +{ +public: + float x,y,z,w; + float4(){x=0;y=0;z=0;w=0;}; + float4(float _x,float _y,float _z,float _w){x=_x;y=_y;z=_z;w=_w;} + float4(const float3 &v,float _w){x=v.x;y=v.y;z=v.z;w=_w;} + //operator float *() { return &x;}; + float& operator[](int i) {assert(i>=0&&i<4);return ((float*)this)[i];} + const float& operator[](int i) const {assert(i>=0&&i<4);return ((float*)this)[i];} + const float3& xyz() const { return *((float3*)this);} + float3& xyz() { return *((float3*)this);} +}; + + +struct D3DXMATRIX; + +class float4x4 +{ + public: + float4 x,y,z,w; // the 4 rows + float4x4(){} + float4x4(const float4 &_x, const float4 &_y, const float4 &_z, const float4 &_w):x(_x),y(_y),z(_z),w(_w){} + float4x4(float m00, float m01, float m02, float m03, + float m10, float m11, float m12, float m13, + float m20, float m21, float m22, float m23, + float m30, float m31, float m32, float m33 ) + :x(m00,m01,m02,m03),y(m10,m11,m12,m13),z(m20,m21,m22,m23),w(m30,m31,m32,m33){} + float& operator()(int r, int c) {assert(r>=0&&r<4&&c>=0&&c<4);return ((&x)[r])[c];} + const float& operator()(int r, int c) const {assert(r>=0&&r<4&&c>=0&&c<4);return ((&x)[r])[c];} + operator float* () {return &x.x;} + operator const float* () const {return &x.x;} + operator struct D3DXMATRIX* () { return (struct D3DXMATRIX*) this;} + operator const struct D3DXMATRIX* () const { return (struct D3DXMATRIX*) this;} +}; + + +int operator==( const float4 &a, const float4 &b ); +float4 Homogenize(const float3 &v3,const float &w=1.0f); // Turns a 3D float3 4D vector4 by appending w +float4 cmul( const float4 &a, const float4 &b); +float4 operator*( const float4 &v, float s); +float4 operator*( float s, const float4 &v); +float4 operator+( const float4 &a, const float4 &b); +float4 operator-( const float4 &a, const float4 &b); +float4x4 operator*( const float4x4& a, const float4x4& b ); +float4 operator*( const float4& v, const float4x4& m ); +float4x4 Inverse(const float4x4 &m); +float4x4 MatrixRigidInverse(const float4x4 &m); +float4x4 MatrixTranspose(const float4x4 &m); +float4x4 MatrixPerspectiveFov(float fovy, float Aspect, float zn, float zf ); +float4x4 MatrixTranslation(const float3 &t); +float4x4 MatrixRotationZ(const float angle_radians); +float4x4 MatrixLookAt(const float3& eye, const float3& at, const float3& up); +int operator==( const float4x4 &a, const float4x4 &b ); + + +//-------- Quaternion ------------ + +class Quaternion :public float4 +{ + public: + Quaternion() { x = y = z = 0.0f; w = 1.0f; } + Quaternion( float3 v, float t ) { v = normalize(v); w = cosf(t/2.0f); v = v*sinf(t/2.0f); x = v.x; y = v.y; z = v.z; } + Quaternion(float _x, float _y, float _z, float _w){x=_x;y=_y;z=_z;w=_w;} + float angle() const { return acosf(w)*2.0f; } + float3 axis() const { float3 a(x,y,z); if(fabsf(angle())<0.0000001f) return float3(1,0,0); return a*(1/sinf(angle()/2.0f)); } + float3 xdir() const { return float3( 1-2*(y*y+z*z), 2*(x*y+w*z), 2*(x*z-w*y) ); } + float3 ydir() const { return float3( 2*(x*y-w*z),1-2*(x*x+z*z), 2*(y*z+w*x) ); } + float3 zdir() const { return float3( 2*(x*z+w*y), 2*(y*z-w*x),1-2*(x*x+y*y) ); } + float3x3 getmatrix() const { return float3x3( xdir(), ydir(), zdir() ); } + operator float3x3() { return getmatrix(); } + void Normalize(); +}; + +Quaternion& operator*=(Quaternion& a, float s ); +Quaternion operator*( const Quaternion& a, float s ); +Quaternion operator*( const Quaternion& a, const Quaternion& b); +Quaternion operator+( const Quaternion& a, const Quaternion& b ); +Quaternion normalize( Quaternion a ); +float dot( const Quaternion &a, const Quaternion &b ); +float3 operator*( const Quaternion& q, const float3& v ); +float3 operator*( const float3& v, const Quaternion& q ); +Quaternion slerp( Quaternion a, const Quaternion& b, float interp ); +Quaternion Interpolate(const Quaternion &q0,const Quaternion &q1,float alpha); +Quaternion RotationArc(float3 v0, float3 v1 ); // returns quat q where q*v0=v1 +Quaternion Inverse(const Quaternion &q); +float4x4 MatrixFromQuatVec(const Quaternion &q, const float3 &v); + + +//------ Euler Angle ----- + +Quaternion YawPitchRoll( float yaw, float pitch, float roll ); +float Yaw( const Quaternion& q ); +float Pitch( const Quaternion& q ); +float Roll( Quaternion q ); +float Yaw( const float3& v ); +float Pitch( const float3& v ); + + +//------- Plane ---------- + +class Plane +{ + public: + float3 normal; + float dist; // distance below origin - the D from plane equasion Ax+By+Cz+D=0 + Plane(const float3 &n,float d):normal(n),dist(d){} + Plane():normal(),dist(0){} + void Transform(const float3 &position, const Quaternion &orientation); +}; + +inline Plane PlaneFlip(const Plane &plane){return Plane(-plane.normal,-plane.dist);} +inline int operator==( const Plane &a, const Plane &b ) { return (a.normal==b.normal && a.dist==b.dist); } +inline int coplanar( const Plane &a, const Plane &b ) { return (a==b || a==PlaneFlip(b)); } + + +//--------- Utility Functions ------ + +float3 PlaneLineIntersection(const Plane &plane, const float3 &p0, const float3 &p1); +float3 PlaneProject(const Plane &plane, const float3 &point); +float3 LineProject(const float3 &p0, const float3 &p1, const float3 &a); // projects a onto infinite line p0p1 +float LineProjectTime(const float3 &p0, const float3 &p1, const float3 &a); +float3 ThreePlaneIntersection(const Plane &p0,const Plane &p1, const Plane &p2); +int PolyHit(const float3 *vert,const int n,const float3 &v0, const float3 &v1, float3 *impact=NULL, float3 *normal=NULL); +int BoxInside(const float3 &p,const float3 &bmin, const float3 &bmax) ; +int BoxIntersect(const float3 &v0, const float3 &v1, const float3 &bmin, const float3 &bmax, float3 *impact); +float DistanceBetweenLines(const float3 &ustart, const float3 &udir, const float3 &vstart, const float3 &vdir, float3 *upoint=NULL, float3 *vpoint=NULL); +float3 TriNormal(const float3 &v0, const float3 &v1, const float3 &v2); +float3 NormalOf(const float3 *vert, const int n); +Quaternion VirtualTrackBall(const float3 &cop, const float3 &cor, const float3 &dir0, const float3 &dir1); + + +float sqr(float a) {return a*a;} +float clampf(float a) {return Min(1.0f,Max(0.0f,a));} + + +float Round(float a,float precision) +{ + return floorf(0.5f+a/precision)*precision; +} + + +float Interpolate(const float &f0,const float &f1,float alpha) +{ + return f0*(1-alpha) + f1*alpha; +} + + +int argmin(float a[],int n) +{ + int r=0; + for(int i=1;i=1.0) { + return a; + } + float theta = acosf(d); + if(theta==0.0f) { return(a);} + return a*(sinf(theta-interp*theta)/sinf(theta)) + b*(sinf(interp*theta)/sinf(theta)); +} + + +Quaternion Interpolate(const Quaternion &q0,const Quaternion &q1,float alpha) { + return slerp(q0,q1,alpha); +} + + +Quaternion YawPitchRoll( float yaw, float pitch, float roll ) +{ + roll *= DEG2RAD; + yaw *= DEG2RAD; + pitch *= DEG2RAD; + return Quaternion(float3(0.0f,0.0f,1.0f),yaw)*Quaternion(float3(1.0f,0.0f,0.0f),pitch)*Quaternion(float3(0.0f,1.0f,0.0f),roll); +} + +float Yaw( const Quaternion& q ) +{ + static float3 v; + v=q.ydir(); + return (v.y==0.0&&v.x==0.0) ? 0.0f: atan2f(-v.x,v.y)*RAD2DEG; +} + +float Pitch( const Quaternion& q ) +{ + static float3 v; + v=q.ydir(); + return atan2f(v.z,sqrtf(sqr(v.x)+sqr(v.y)))*RAD2DEG; +} + +float Roll( Quaternion q ) +{ + q = Quaternion(float3(0.0f,0.0f,1.0f),-Yaw(q)*DEG2RAD) *q; + q = Quaternion(float3(1.0f,0.0f,0.0f),-Pitch(q)*DEG2RAD) *q; + return atan2f(-q.xdir().z,q.xdir().x)*RAD2DEG; +} + +float Yaw( const float3& v ) +{ + return (v.y==0.0&&v.x==0.0) ? 0.0f: atan2f(-v.x,v.y)*RAD2DEG; +} + +float Pitch( const float3& v ) +{ + return atan2f(v.z,sqrtf(sqr(v.x)+sqr(v.y)))*RAD2DEG; +} + + +//------------- Plane -------------- + + +void Plane::Transform(const float3 &position, const Quaternion &orientation) { + // Transforms the plane to the space defined by the + // given position/orientation. + static float3 newnormal; + static float3 origin; + + newnormal = Inverse(orientation)*normal; + origin = Inverse(orientation)*(-normal*dist - position); + + normal = newnormal; + dist = -dot(newnormal, origin); +} + + + + +//--------- utility functions ------------- + +// RotationArc() +// Given two vectors v0 and v1 this function +// returns quaternion q where q*v0==v1. +// Routine taken from game programming gems. +Quaternion RotationArc(float3 v0,float3 v1){ + static Quaternion q; + v0 = normalize(v0); // Comment these two lines out if you know its not needed. + v1 = normalize(v1); // If vector is already unit length then why do it again? + float3 c = cross(v0,v1); + float d = dot(v0,v1); + if(d<=-1.0f) { return Quaternion(1,0,0,0);} // 180 about x axis + float s = sqrtf((1+d)*2); + q.x = c.x / s; + q.y = c.y / s; + q.z = c.z / s; + q.w = s /2.0f; + return q; +} + + +float4x4 MatrixFromQuatVec(const Quaternion &q, const float3 &v) +{ + // builds a 4x4 transformation matrix based on orientation q and translation v + float qx2 = q.x*q.x; + float qy2 = q.y*q.y; + float qz2 = q.z*q.z; + + float qxqy = q.x*q.y; + float qxqz = q.x*q.z; + float qxqw = q.x*q.w; + float qyqz = q.y*q.z; + float qyqw = q.y*q.w; + float qzqw = q.z*q.w; + + return float4x4( + 1-2*(qy2+qz2), + 2*(qxqy+qzqw), + 2*(qxqz-qyqw), + 0 , + 2*(qxqy-qzqw), + 1-2*(qx2+qz2), + 2*(qyqz+qxqw), + 0 , + 2*(qxqz+qyqw), + 2*(qyqz-qxqw), + 1-2*(qx2+qy2), + 0 , + v.x , + v.y , + v.z , + 1.0f ); +} + + +float3 PlaneLineIntersection(const Plane &plane, const float3 &p0, const float3 &p1) +{ + // returns the point where the line p0-p1 intersects the plane n&d + static float3 dif; + dif = p1-p0; + float dn= dot(plane.normal,dif); + float t = -(plane.dist+dot(plane.normal,p0) )/dn; + return p0 + (dif*t); +} + +float3 PlaneProject(const Plane &plane, const float3 &point) +{ + return point - plane.normal * (dot(point,plane.normal)+plane.dist); +} + +float3 LineProject(const float3 &p0, const float3 &p1, const float3 &a) +{ + float3 w; + w = p1-p0; + float t= dot(w,(a-p0)) / (sqr(w.x)+sqr(w.y)+sqr(w.z)); + return p0+ w*t; +} + + +float LineProjectTime(const float3 &p0, const float3 &p1, const float3 &a) +{ + float3 w; + w = p1-p0; + float t= dot(w,(a-p0)) / (sqr(w.x)+sqr(w.y)+sqr(w.z)); + return t; +} + + + +float3 TriNormal(const float3 &v0, const float3 &v1, const float3 &v2) +{ + // return the normal of the triangle + // inscribed by v0, v1, and v2 + float3 cp=cross(v1-v0,v2-v1); + float m=magnitude(cp); + if(m==0) return float3(1,0,0); + return cp*(1.0f/m); +} + + + +int BoxInside(const float3 &p, const float3 &bmin, const float3 &bmax) +{ + return (p.x >= bmin.x && p.x <=bmax.x && + p.y >= bmin.y && p.y <=bmax.y && + p.z >= bmin.z && p.z <=bmax.z ); +} + + +int BoxIntersect(const float3 &v0, const float3 &v1, const float3 &bmin, const float3 &bmax,float3 *impact) +{ + if(BoxInside(v0,bmin,bmax)) + { + *impact=v0; + return 1; + } + if(v0.x<=bmin.x && v1.x>=bmin.x) + { + float a = (bmin.x-v0.x)/(v1.x-v0.x); + //v.x = bmin.x; + float vy = (1-a) *v0.y + a*v1.y; + float vz = (1-a) *v0.z + a*v1.z; + if(vy>=bmin.y && vy<=bmax.y && vz>=bmin.z && vz<=bmax.z) + { + impact->x = bmin.x; + impact->y = vy; + impact->z = vz; + return 1; + } + } + else if(v0.x >= bmax.x && v1.x <= bmax.x) + { + float a = (bmax.x-v0.x)/(v1.x-v0.x); + //v.x = bmax.x; + float vy = (1-a) *v0.y + a*v1.y; + float vz = (1-a) *v0.z + a*v1.z; + if(vy>=bmin.y && vy<=bmax.y && vz>=bmin.z && vz<=bmax.z) + { + impact->x = bmax.x; + impact->y = vy; + impact->z = vz; + return 1; + } + } + if(v0.y<=bmin.y && v1.y>=bmin.y) + { + float a = (bmin.y-v0.y)/(v1.y-v0.y); + float vx = (1-a) *v0.x + a*v1.x; + //v.y = bmin.y; + float vz = (1-a) *v0.z + a*v1.z; + if(vx>=bmin.x && vx<=bmax.x && vz>=bmin.z && vz<=bmax.z) + { + impact->x = vx; + impact->y = bmin.y; + impact->z = vz; + return 1; + } + } + else if(v0.y >= bmax.y && v1.y <= bmax.y) + { + float a = (bmax.y-v0.y)/(v1.y-v0.y); + float vx = (1-a) *v0.x + a*v1.x; + // vy = bmax.y; + float vz = (1-a) *v0.z + a*v1.z; + if(vx>=bmin.x && vx<=bmax.x && vz>=bmin.z && vz<=bmax.z) + { + impact->x = vx; + impact->y = bmax.y; + impact->z = vz; + return 1; + } + } + if(v0.z<=bmin.z && v1.z>=bmin.z) + { + float a = (bmin.z-v0.z)/(v1.z-v0.z); + float vx = (1-a) *v0.x + a*v1.x; + float vy = (1-a) *v0.y + a*v1.y; + // v.z = bmin.z; + if(vy>=bmin.y && vy<=bmax.y && vx>=bmin.x && vx<=bmax.x) + { + impact->x = vx; + impact->y = vy; + impact->z = bmin.z; + return 1; + } + } + else if(v0.z >= bmax.z && v1.z <= bmax.z) + { + float a = (bmax.z-v0.z)/(v1.z-v0.z); + float vx = (1-a) *v0.x + a*v1.x; + float vy = (1-a) *v0.y + a*v1.y; + // v.z = bmax.z; + if(vy>=bmin.y && vy<=bmax.y && vx>=bmin.x && vx<=bmax.x) + { + impact->x = vx; + impact->y = vy; + impact->z = bmax.z; + return 1; + } + } + return 0; +} + + +float DistanceBetweenLines(const float3 &ustart, const float3 &udir, const float3 &vstart, const float3 &vdir, float3 *upoint, float3 *vpoint) +{ + static float3 cp; + cp = normalize(cross(udir,vdir)); + + float distu = -dot(cp,ustart); + float distv = -dot(cp,vstart); + float dist = (float)fabs(distu-distv); + if(upoint) + { + Plane plane; + plane.normal = normalize(cross(vdir,cp)); + plane.dist = -dot(plane.normal,vstart); + *upoint = PlaneLineIntersection(plane,ustart,ustart+udir); + } + if(vpoint) + { + Plane plane; + plane.normal = normalize(cross(udir,cp)); + plane.dist = -dot(plane.normal,ustart); + *vpoint = PlaneLineIntersection(plane,vstart,vstart+vdir); + } + return dist; +} + + +Quaternion VirtualTrackBall(const float3 &cop, const float3 &cor, const float3 &dir1, const float3 &dir2) +{ + // routine taken from game programming gems. + // Implement track ball functionality to spin stuf on the screen + // cop center of projection + // cor center of rotation + // dir1 old mouse direction + // dir2 new mouse direction + // pretend there is a sphere around cor. Then find the points + // where dir1 and dir2 intersect that sphere. Find the + // rotation that takes the first point to the second. + float m; + // compute plane + float3 nrml = cor - cop; + float fudgefactor = 1.0f/(magnitude(nrml) * 0.25f); // since trackball proportional to distance from cop + nrml = normalize(nrml); + float dist = -dot(nrml,cor); + float3 u= PlaneLineIntersection(Plane(nrml,dist),cop,cop+dir1); + u=u-cor; + u=u*fudgefactor; + m= magnitude(u); + if(m>1) + { + u/=m; + } + else + { + u=u - (nrml * sqrtf(1-m*m)); + } + float3 v= PlaneLineIntersection(Plane(nrml,dist),cop,cop+dir2); + v=v-cor; + v=v*fudgefactor; + m= magnitude(v); + if(m>1) + { + v/=m; + } + else + { + v=v - (nrml * sqrtf(1-m*m)); + } + return RotationArc(u,v); +} + + +int countpolyhit=0; +int PolyHit(const float3 *vert, const int n, const float3 &v0, const float3 &v1, float3 *impact, float3 *normal) +{ + countpolyhit++; + int i; + float3 nrml(0,0,0); + for(i=0;i0) + { + return 0; + } + + static float3 the_point; + // By using the cached plane distances d0 and d1 + // we can optimize the following: + // the_point = planelineintersection(nrml,dist,v0,v1); + float a = d0/(d0-d1); + the_point = v0*(1-a) + v1*a; + + + int inside=1; + for(int j=0;inside && j= 0.0); + } + if(inside) + { + if(normal){*normal=nrml;} + if(impact){*impact=the_point;} + } + return inside; +} + +//************************************************************************** +//************************************************************************** +//*** Stan Melax's array template, needed to compile his hull generation code +//************************************************************************** +//************************************************************************** + +template class ArrayRet; +template class Array { + public: + Array(int s=0); + Array(Array &array); + Array(ArrayRet &array); + ~Array(); + void allocate(int s); + void SetSize(int s); + void Pack(); + Type& Add(Type); + void AddUnique(Type); + int Contains(Type); + void Insert(Type,int); + int IndexOf(Type); + void Remove(Type); + void DelIndex(int i); + Type * element; + int count; + int array_size; + const Type &operator[](int i) const { assert(i>=0 && i=0 && i &operator=(Array &array); + Array &operator=(ArrayRet &array); + // operator ArrayRet &() { return *(ArrayRet *)this;} // this worked but i suspect could be dangerous +}; + +template class ArrayRet:public Array +{ +}; + +template Array::Array(int s) +{ + count=0; + array_size = 0; + element = NULL; + if(s) + { + allocate(s); + } +} + + +template Array::Array(Array &array) +{ + count=0; + array_size = 0; + element = NULL; + for(int i=0;i Array::Array(ArrayRet &array) +{ + *this = array; +} +template Array &Array::operator=(ArrayRet &array) +{ + count=array.count; + array_size = array.array_size; + element = array.element; + array.element=NULL; + array.count=0; + array.array_size=0; + return *this; +} + + +template Array &Array::operator=(Array &array) +{ + count=0; + for(int i=0;i Array::~Array() +{ + if (element != NULL) + { + free(element); + } + count=0;array_size=0;element=NULL; +} + +template void Array::allocate(int s) +{ + assert(s>0); + assert(s>=count); + Type *old = element; + array_size =s; + element = (Type *) malloc( sizeof(Type)*array_size); + assert(element); + for(int i=0;i void Array::SetSize(int s) +{ + if(s==0) + { + if(element) + { + free(element); + element = NULL; + } + array_size = s; + } + else + { + allocate(s); + } + count=s; +} + +template void Array::Pack() +{ + allocate(count); +} + +template Type& Array::Add(Type t) +{ + assert(count<=array_size); + if(count==array_size) + { + allocate((array_size)?array_size *2:16); + } + element[count++] = t; + return element[count-1]; +} + +template int Array::Contains(Type t) +{ + int i; + int found=0; + for(i=0;i void Array::AddUnique(Type t) +{ + if(!Contains(t)) Add(t); +} + + +template void Array::DelIndex(int i) +{ + assert(i void Array::Remove(Type t) +{ + int i; + for(i=0;i void Array::Insert(Type t,int k) +{ + int i=count; + Add(t); // to allocate space + while(i>k) + { + element[i]=element[i-1]; + i--; + } + assert(i==k); + element[k]=t; +} + + +template int Array::IndexOf(Type t) +{ + int i; + for(i=0;i vertices; + Array edges; + Array facets; + ConvexH(int vertices_size,int edges_size,int facets_size); +}; + +typedef ConvexH::HalfEdge HalfEdge; + +ConvexH::ConvexH(int vertices_size,int edges_size,int facets_size) + :vertices(vertices_size) + ,edges(edges_size) + ,facets(facets_size) +{ + vertices.count=vertices_size; + edges.count = edges_size; + facets.count = facets_size; +} + +ConvexH *ConvexHDup(ConvexH *src) { + ConvexH *dst = new ConvexH(src->vertices.count,src->edges.count,src->facets.count); + memcpy(dst->vertices.element,src->vertices.element,sizeof(float3)*src->vertices.count); + memcpy(dst->edges.element,src->edges.element,sizeof(HalfEdge)*src->edges.count); + memcpy(dst->facets.element,src->facets.element,sizeof(Plane)*src->facets.count); + return dst; +} + + +int PlaneTest(const Plane &p, const REAL3 &v) { + REAL a = dot(v,p.normal)+p.dist; + int flag = (a>planetestepsilon)?OVER:((a<-planetestepsilon)?UNDER:COPLANAR); + return flag; +} + +int SplitTest(ConvexH &convex,const Plane &plane) { + int flag=0; + for(int i=0;i= convex.edges.count || convex.edges[inext].p != convex.edges[i].p) { + inext = estart; + } + assert(convex.edges[inext].p == convex.edges[i].p); + int nb = convex.edges[i].ea; + assert(nb!=255); + if(nb==255 || nb==-1) return 0; + assert(nb!=-1); + assert(i== convex.edges[nb].ea); + } + for(i=0;i= convex.edges.count || convex.edges[i1].p != convex.edges[i].p) { + i1 = estart; + } + int i2 = i1+1; + if(i2>= convex.edges.count || convex.edges[i2].p != convex.edges[i].p) { + i2 = estart; + } + if(i==i2) continue; // i sliced tangent to an edge and created 2 meaningless edges + REAL3 localnormal = TriNormal(convex.vertices[convex.edges[i ].v], + convex.vertices[convex.edges[i1].v], + convex.vertices[convex.edges[i2].v]); + assert(dot(localnormal,convex.facets[convex.edges[i].p].normal)>0); + if(dot(localnormal,convex.facets[convex.edges[i].p].normal)<=0)return 0; + } + return 1; +} + +// back to back quads +ConvexH *test_btbq() { + ConvexH *convex = new ConvexH(4,8,2); + convex->vertices[0] = REAL3(0,0,0); + convex->vertices[1] = REAL3(1,0,0); + convex->vertices[2] = REAL3(1,1,0); + convex->vertices[3] = REAL3(0,1,0); + convex->facets[0] = Plane(REAL3(0,0,1),0); + convex->facets[1] = Plane(REAL3(0,0,-1),0); + convex->edges[0] = HalfEdge(7,0,0); + convex->edges[1] = HalfEdge(6,1,0); + convex->edges[2] = HalfEdge(5,2,0); + convex->edges[3] = HalfEdge(4,3,0); + + convex->edges[4] = HalfEdge(3,0,1); + convex->edges[5] = HalfEdge(2,3,1); + convex->edges[6] = HalfEdge(1,2,1); + convex->edges[7] = HalfEdge(0,1,1); + AssertIntact(*convex); + return convex; +} +ConvexH *test_cube() { + ConvexH *convex = new ConvexH(8,24,6); + convex->vertices[0] = REAL3(0,0,0); + convex->vertices[1] = REAL3(0,0,1); + convex->vertices[2] = REAL3(0,1,0); + convex->vertices[3] = REAL3(0,1,1); + convex->vertices[4] = REAL3(1,0,0); + convex->vertices[5] = REAL3(1,0,1); + convex->vertices[6] = REAL3(1,1,0); + convex->vertices[7] = REAL3(1,1,1); + + convex->facets[0] = Plane(REAL3(-1,0,0),0); + convex->facets[1] = Plane(REAL3(1,0,0),-1); + convex->facets[2] = Plane(REAL3(0,-1,0),0); + convex->facets[3] = Plane(REAL3(0,1,0),-1); + convex->facets[4] = Plane(REAL3(0,0,-1),0); + convex->facets[5] = Plane(REAL3(0,0,1),-1); + + convex->edges[0 ] = HalfEdge(11,0,0); + convex->edges[1 ] = HalfEdge(23,1,0); + convex->edges[2 ] = HalfEdge(15,3,0); + convex->edges[3 ] = HalfEdge(16,2,0); + + convex->edges[4 ] = HalfEdge(13,6,1); + convex->edges[5 ] = HalfEdge(21,7,1); + convex->edges[6 ] = HalfEdge( 9,5,1); + convex->edges[7 ] = HalfEdge(18,4,1); + + convex->edges[8 ] = HalfEdge(19,0,2); + convex->edges[9 ] = HalfEdge( 6,4,2); + convex->edges[10] = HalfEdge(20,5,2); + convex->edges[11] = HalfEdge( 0,1,2); + + convex->edges[12] = HalfEdge(22,3,3); + convex->edges[13] = HalfEdge( 4,7,3); + convex->edges[14] = HalfEdge(17,6,3); + convex->edges[15] = HalfEdge( 2,2,3); + + convex->edges[16] = HalfEdge( 3,0,4); + convex->edges[17] = HalfEdge(14,2,4); + convex->edges[18] = HalfEdge( 7,6,4); + convex->edges[19] = HalfEdge( 8,4,4); + + convex->edges[20] = HalfEdge(10,1,5); + convex->edges[21] = HalfEdge( 5,5,5); + convex->edges[22] = HalfEdge(12,7,5); + convex->edges[23] = HalfEdge( 1,3,5); + + + return convex; +} +ConvexH *ConvexHMakeCube(const REAL3 &bmin, const REAL3 &bmax) { + ConvexH *convex = test_cube(); + convex->vertices[0] = REAL3(bmin.x,bmin.y,bmin.z); + convex->vertices[1] = REAL3(bmin.x,bmin.y,bmax.z); + convex->vertices[2] = REAL3(bmin.x,bmax.y,bmin.z); + convex->vertices[3] = REAL3(bmin.x,bmax.y,bmax.z); + convex->vertices[4] = REAL3(bmax.x,bmin.y,bmin.z); + convex->vertices[5] = REAL3(bmax.x,bmin.y,bmax.z); + convex->vertices[6] = REAL3(bmax.x,bmax.y,bmin.z); + convex->vertices[7] = REAL3(bmax.x,bmax.y,bmax.z); + + convex->facets[0] = Plane(REAL3(-1,0,0), bmin.x); + convex->facets[1] = Plane(REAL3(1,0,0), -bmax.x); + convex->facets[2] = Plane(REAL3(0,-1,0), bmin.y); + convex->facets[3] = Plane(REAL3(0,1,0), -bmax.y); + convex->facets[4] = Plane(REAL3(0,0,-1), bmin.z); + convex->facets[5] = Plane(REAL3(0,0,1), -bmax.z); + return convex; +} +ConvexH *ConvexHCrop(ConvexH &convex,const Plane &slice) +{ + int i; + int vertcountunder=0; + int vertcountover =0; + static Array vertscoplanar; // existing vertex members of convex that are coplanar + vertscoplanar.count=0; + static Array edgesplit; // existing edges that members of convex that cross the splitplane + edgesplit.count=0; + + assert(convex.edges.count<480); + + EdgeFlag edgeflag[512]; + VertFlag vertflag[256]; + PlaneFlag planeflag[128]; + HalfEdge tmpunderedges[512]; + Plane tmpunderplanes[128]; + Coplanar coplanaredges[512]; + int coplanaredges_num=0; + + Array createdverts; + // do the side-of-plane tests + for(i=0;i= convex.edges.count || convex.edges[e1].p!=currentplane) { + enextface = e1; + e1=estart; + } + HalfEdge &edge0 = convex.edges[e0]; + HalfEdge &edge1 = convex.edges[e1]; + HalfEdge &edgea = convex.edges[edge0.ea]; + + + planeside |= vertflag[edge0.v].planetest; + //if((vertflag[edge0.v].planetest & vertflag[edge1.v].planetest) == COPLANAR) { + // assert(ecop==-1); + // ecop=e; + //} + + + if(vertflag[edge0.v].planetest == OVER && vertflag[edge1.v].planetest == OVER){ + // both endpoints over plane + edgeflag[e0].undermap = -1; + } + else if((vertflag[edge0.v].planetest | vertflag[edge1.v].planetest) == UNDER) { + // at least one endpoint under, the other coplanar or under + + edgeflag[e0].undermap = under_edge_count; + tmpunderedges[under_edge_count].v = vertflag[edge0.v].undermap; + tmpunderedges[under_edge_count].p = underplanescount; + if(edge0.ea < e0) { + // connect the neighbors + assert(edgeflag[edge0.ea].undermap !=-1); + tmpunderedges[under_edge_count].ea = edgeflag[edge0.ea].undermap; + tmpunderedges[edgeflag[edge0.ea].undermap].ea = under_edge_count; + } + under_edge_count++; + } + else if((vertflag[edge0.v].planetest | vertflag[edge1.v].planetest) == COPLANAR) { + // both endpoints coplanar + // must check a 3rd point to see if UNDER + int e2 = e1+1; + if(e2>=convex.edges.count || convex.edges[e2].p!=currentplane) { + e2 = estart; + } + assert(convex.edges[e2].p==currentplane); + HalfEdge &edge2 = convex.edges[e2]; + if(vertflag[edge2.v].planetest==UNDER) { + + edgeflag[e0].undermap = under_edge_count; + tmpunderedges[under_edge_count].v = vertflag[edge0.v].undermap; + tmpunderedges[under_edge_count].p = underplanescount; + tmpunderedges[under_edge_count].ea = -1; + // make sure this edge is added to the "coplanar" list + coplanaredge = under_edge_count; + vout = vertflag[edge0.v].undermap; + vin = vertflag[edge1.v].undermap; + under_edge_count++; + } + else { + edgeflag[e0].undermap = -1; + } + } + else if(vertflag[edge0.v].planetest == UNDER && vertflag[edge1.v].planetest == OVER) { + // first is under 2nd is over + + edgeflag[e0].undermap = under_edge_count; + tmpunderedges[under_edge_count].v = vertflag[edge0.v].undermap; + tmpunderedges[under_edge_count].p = underplanescount; + if(edge0.ea < e0) { + assert(edgeflag[edge0.ea].undermap !=-1); + // connect the neighbors + tmpunderedges[under_edge_count].ea = edgeflag[edge0.ea].undermap; + tmpunderedges[edgeflag[edge0.ea].undermap].ea = under_edge_count; + vout = tmpunderedges[edgeflag[edge0.ea].undermap].v; + } + else { + Plane &p0 = convex.facets[edge0.p]; + Plane &pa = convex.facets[edgea.p]; + createdverts.Add(ThreePlaneIntersection(p0,pa,slice)); + //createdverts.Add(PlaneProject(slice,PlaneLineIntersection(slice,convex.vertices[edge0.v],convex.vertices[edgea.v]))); + //createdverts.Add(PlaneLineIntersection(slice,convex.vertices[edge0.v],convex.vertices[edgea.v])); + vout = vertcountunder++; + } + under_edge_count++; + /// hmmm something to think about: i might be able to output this edge regarless of + // wheter or not we know v-in yet. ok i;ll try this now: + tmpunderedges[under_edge_count].v = vout; + tmpunderedges[under_edge_count].p = underplanescount; + tmpunderedges[under_edge_count].ea = -1; + coplanaredge = under_edge_count; + under_edge_count++; + + if(vin!=-1) { + // we previously processed an edge where we came under + // now we know about vout as well + + // ADD THIS EDGE TO THE LIST OF EDGES THAT NEED NEIGHBOR ON PARTITION PLANE!! + } + + } + else if(vertflag[edge0.v].planetest == COPLANAR && vertflag[edge1.v].planetest == OVER) { + // first is coplanar 2nd is over + + edgeflag[e0].undermap = -1; + vout = vertflag[edge0.v].undermap; + // I hate this but i have to make sure part of this face is UNDER before ouputting this vert + int k=estart; + assert(edge0.p == currentplane); + while(!(planeside&UNDER) && k= vertcountunderold); // for debugging only + } + if(vout!=-1) { + // we previously processed an edge where we went over + // now we know vin too + // ADD THIS EDGE TO THE LIST OF EDGES THAT NEED NEIGHBOR ON PARTITION PLANE!! + } + // output edge + tmpunderedges[under_edge_count].v = vin; + tmpunderedges[under_edge_count].p = underplanescount; + edgeflag[e0].undermap = under_edge_count; + if(e0>edge0.ea) { + assert(edgeflag[edge0.ea].undermap !=-1); + // connect the neighbors + tmpunderedges[under_edge_count].ea = edgeflag[edge0.ea].undermap; + tmpunderedges[edgeflag[edge0.ea].undermap].ea = under_edge_count; + } + assert(edgeflag[e0].undermap == under_edge_count); + under_edge_count++; + } + else if(vertflag[edge0.v].planetest == OVER && vertflag[edge1.v].planetest == COPLANAR) { + // first is over next is coplanar + + edgeflag[e0].undermap = -1; + vin = vertflag[edge1.v].undermap; + assert(vin!=-1); + if(vout!=-1) { + // we previously processed an edge where we came under + // now we know both endpoints + // ADD THIS EDGE TO THE LIST OF EDGES THAT NEED NEIGHBOR ON PARTITION PLANE!! + } + + } + else { + assert(0); + } + + + e0=e1; + e1++; // do the modulo at the beginning of the loop + + } while(e0!=estart) ; + e0 = enextface; + if(planeside&UNDER) { + planeflag[currentplane].undermap = underplanescount; + tmpunderplanes[underplanescount] = convex.facets[currentplane]; + underplanescount++; + } + else { + planeflag[currentplane].undermap = 0; + } + if(vout>=0 && (planeside&UNDER)) { + assert(vin>=0); + assert(coplanaredge>=0); + assert(coplanaredge!=511); + coplanaredges[coplanaredges_num].ea = coplanaredge; + coplanaredges[coplanaredges_num].v0 = vin; + coplanaredges[coplanaredges_num].v1 = vout; + coplanaredges_num++; + } + } + + // add the new plane to the mix: + if(coplanaredges_num>0) { + tmpunderplanes[underplanescount++]=slice; + } + for(i=0;i=coplanaredges_num) + { + assert(jvertices.count;j++) + { + d = Max(d,dot(convex->vertices[j],planes[i].normal)+planes[i].dist); + } + if(i==0 || d>md) + { + p=i; + md=d; + } + } + return (md>epsilon)?p:-1; +} + +template +inline int maxdir(const T *p,int count,const T &dir) +{ + assert(count); + int m=0; + float currDotm = dot(p[0], dir); + for(int i=1;i currDotm) + { + currDotm = currDoti; + m=i; + } + } + return m; +} + + +template +int maxdirfiltered(const T *p,int count,const T &dir,Array &allow) +{ + assert(count); + int m=-1; + float currDotm = dot(p[0], dir); + for(int i=0;icurrDotm) + { + currDotm = currDoti; + m=i; + } + } + } + } + assert(m!=-1); + return m; +} + +float3 orth(const float3 &v) +{ + float3 a=cross(v,float3(0,0,1)); + float3 b=cross(v,float3(0,1,0)); + return normalize((magnitude(a)>magnitude(b))?a:b); +} + + +template +int maxdirsterid(const T *p,int count,const T &dir,Array &allow) +{ + int m=-1; + while(m==-1) + { + m = maxdirfiltered(p,count,dir,allow); + if(allow[m]==3) return m; + T u = orth(dir); + T v = cross(u,dir); + int ma=-1; + for(float x = 0.0f ; x<= 360.0f ; x+= 45.0f) + { + float s = sinf(DEG2RAD*(x)); + float c = cosf(DEG2RAD*(x)); + int mb = maxdirfiltered(p,count,dir+(u*s+v*c)*0.025f,allow); + if(ma==m && mb==m) + { + allow[m]=3; + return m; + } + if(ma!=-1 && ma!=mb) // Yuck - this is really ugly + { + int mc = ma; + for(float xx = x-40.0f ; xx <= x ; xx+= 5.0f) + { + float s = sinf(DEG2RAD*(xx)); + float c = cosf(DEG2RAD*(xx)); + int md = maxdirfiltered(p,count,dir+(u*s+v*c)*0.025f,allow); + if(mc==m && md==m) + { + allow[m]=3; + return m; + } + mc=md; + } + } + ma=mb; + } + allow[m]=0; + m=-1; + } + assert(0); + return m; +} + + + + +int operator ==(const int3 &a,const int3 &b) +{ + for(int i=0;i<3;i++) + { + if(a[i]!=b[i]) return 0; + } + return 1; +} + +int3 roll3(int3 a) +{ + int tmp=a[0]; + a[0]=a[1]; + a[1]=a[2]; + a[2]=tmp; + return a; +} +int isa(const int3 &a,const int3 &b) +{ + return ( a==b || roll3(a)==b || a==roll3(b) ); +} +int b2b(const int3 &a,const int3 &b) +{ + return isa(a,int3(b[2],b[1],b[0])); +} +int above(float3* vertices,const int3& t, const float3 &p, float epsilon) +{ + float3 n=TriNormal(vertices[t[0]],vertices[t[1]],vertices[t[2]]); + return (dot(n,p-vertices[t[0]]) > epsilon); // EPSILON??? +} +int hasedge(const int3 &t, int a,int b) +{ + for(int i=0;i<3;i++) + { + int i1= (i+1)%3; + if(t[i]==a && t[i1]==b) return 1; + } + return 0; +} +int hasvert(const int3 &t, int v) +{ + return (t[0]==v || t[1]==v || t[2]==v) ; +} +int shareedge(const int3 &a,const int3 &b) +{ + int i; + for(i=0;i<3;i++) + { + int i1= (i+1)%3; + if(hasedge(a,b[i1],b[i])) return 1; + } + return 0; +} + +class btHullTriangle; + +Array tris; + +class btHullTriangle : public int3 +{ +public: + int3 n; + int id; + int vmax; + float rise; + btHullTriangle(int a,int b,int c):int3(a,b,c),n(-1,-1,-1) + { + id = tris.count; + tris.Add(this); + vmax=-1; + rise = 0.0f; + } + ~btHullTriangle() + { + assert(tris[id]==this); + tris[id]=NULL; + } + int &neib(int a,int b); +}; + + +int &btHullTriangle::neib(int a,int b) +{ + static int er=-1; + int i; + for(i=0;i<3;i++) + { + int i1=(i+1)%3; + int i2=(i+2)%3; + if((*this)[i]==a && (*this)[i1]==b) return n[i2]; + if((*this)[i]==b && (*this)[i1]==a) return n[i2]; + } + assert(0); + return er; +} +void b2bfix(btHullTriangle* s,btHullTriangle*t) +{ + int i; + for(i=0;i<3;i++) + { + int i1=(i+1)%3; + int i2=(i+2)%3; + int a = (*s)[i1]; + int b = (*s)[i2]; + assert(tris[s->neib(a,b)]->neib(b,a) == s->id); + assert(tris[t->neib(a,b)]->neib(b,a) == t->id); + tris[s->neib(a,b)]->neib(b,a) = t->neib(b,a); + tris[t->neib(b,a)]->neib(a,b) = s->neib(a,b); + } +} + +void removeb2b(btHullTriangle* s,btHullTriangle*t) +{ + b2bfix(s,t); + delete s; + delete t; +} + +void checkit(btHullTriangle *t) +{ + int i; + assert(tris[t->id]==t); + for(i=0;i<3;i++) + { + int i1=(i+1)%3; + int i2=(i+2)%3; + int a = (*t)[i1]; + int b = (*t)[i2]; + assert(a!=b); + assert( tris[t->n[i]]->neib(b,a) == t->id); + } +} +void extrude(btHullTriangle *t0,int v) +{ + int3 t= *t0; + int n = tris.count; + btHullTriangle* ta = new btHullTriangle(v,t[1],t[2]); + ta->n = int3(t0->n[0],n+1,n+2); + tris[t0->n[0]]->neib(t[1],t[2]) = n+0; + btHullTriangle* tb = new btHullTriangle(v,t[2],t[0]); + tb->n = int3(t0->n[1],n+2,n+0); + tris[t0->n[1]]->neib(t[2],t[0]) = n+1; + btHullTriangle* tc = new btHullTriangle(v,t[0],t[1]); + tc->n = int3(t0->n[2],n+0,n+1); + tris[t0->n[2]]->neib(t[0],t[1]) = n+2; + checkit(ta); + checkit(tb); + checkit(tc); + if(hasvert(*tris[ta->n[0]],v)) removeb2b(ta,tris[ta->n[0]]); + if(hasvert(*tris[tb->n[0]],v)) removeb2b(tb,tris[tb->n[0]]); + if(hasvert(*tris[tc->n[0]],v)) removeb2b(tc,tris[tc->n[0]]); + delete t0; + +} + +btHullTriangle *extrudable(float epsilon) +{ + int i; + btHullTriangle *t=NULL; + for(i=0;iriserise)) + { + t = tris[i]; + } + } + return (t->rise >epsilon)?t:NULL ; +} + +class int4 +{ +public: + int x,y,z,w; + int4(){}; + int4(int _x,int _y, int _z,int _w){x=_x;y=_y;z=_z;w=_w;} + const int& operator[](int i) const {return (&x)[i];} + int& operator[](int i) {return (&x)[i];} +}; + + + +int4 FindSimplex(float3 *verts,int verts_count,Array &allow) +{ + float3 basis[3]; + basis[0] = float3( 0.01f, 0.02f, 1.0f ); + int p0 = maxdirsterid(verts,verts_count, basis[0],allow); + int p1 = maxdirsterid(verts,verts_count,-basis[0],allow); + basis[0] = verts[p0]-verts[p1]; + if(p0==p1 || basis[0]==float3(0,0,0)) + return int4(-1,-1,-1,-1); + basis[1] = cross(float3( 1, 0.02f, 0),basis[0]); + basis[2] = cross(float3(-0.02f, 1, 0),basis[0]); + basis[1] = normalize( (magnitude(basis[1])>magnitude(basis[2])) ? basis[1]:basis[2]); + int p2 = maxdirsterid(verts,verts_count,basis[1],allow); + if(p2 == p0 || p2 == p1) + { + p2 = maxdirsterid(verts,verts_count,-basis[1],allow); + } + if(p2 == p0 || p2 == p1) + return int4(-1,-1,-1,-1); + basis[1] = verts[p2] - verts[p0]; + basis[2] = normalize(cross(basis[1],basis[0])); + int p3 = maxdirsterid(verts,verts_count,basis[2],allow); + if(p3==p0||p3==p1||p3==p2) p3 = maxdirsterid(verts,verts_count,-basis[2],allow); + if(p3==p0||p3==p1||p3==p2) + return int4(-1,-1,-1,-1); + assert(!(p0==p1||p0==p2||p0==p3||p1==p2||p1==p3||p2==p3)); + if(dot(verts[p3]-verts[p0],cross(verts[p1]-verts[p0],verts[p2]-verts[p0])) <0) {Swap(p2,p3);} + return int4(p0,p1,p2,p3); +} + +int calchullgen(float3 *verts,int verts_count, int vlimit) +{ + if(verts_count <4) return 0; + if(vlimit==0) vlimit=1000000000; + int j; + float3 bmin(*verts),bmax(*verts); + Array isextreme(verts_count); + Array allow(verts_count); + for(j=0;jn=int3(2,3,1); + btHullTriangle *t1 = new btHullTriangle(p[3],p[2],p[0]); t1->n=int3(3,2,0); + btHullTriangle *t2 = new btHullTriangle(p[0],p[1],p[3]); t2->n=int3(0,1,3); + btHullTriangle *t3 = new btHullTriangle(p[1],p[0],p[2]); t3->n=int3(1,0,2); + isextreme[p[0]]=isextreme[p[1]]=isextreme[p[2]]=isextreme[p[3]]=1; + checkit(t0);checkit(t1);checkit(t2);checkit(t3); + + for(j=0;jvmax<0); + float3 n=TriNormal(verts[(*t)[0]],verts[(*t)[1]],verts[(*t)[2]]); + t->vmax = maxdirsterid(verts,verts_count,n,allow); + t->rise = dot(n,verts[t->vmax]-verts[(*t)[0]]); + } + btHullTriangle *te; + vlimit-=4; + while(vlimit >0 && (te=extrudable(epsilon))) + { + int3 ti=*te; + int v=te->vmax; + assert(!isextreme[v]); // wtf we've already done this vertex + isextreme[v]=1; + //if(v==p0 || v==p1 || v==p2 || v==p3) continue; // done these already + j=tris.count; + while(j--) { + if(!tris[j]) continue; + int3 t=*tris[j]; + if(above(verts,t,verts[v],0.01f*epsilon)) + { + extrude(tris[j],v); + } + } + // now check for those degenerate cases where we have a flipped triangle or a really skinny triangle + j=tris.count; + while(j--) + { + if(!tris[j]) continue; + if(!hasvert(*tris[j],v)) break; + int3 nt=*tris[j]; + if(above(verts,nt,center,0.01f*epsilon) || magnitude(cross(verts[nt[1]]-verts[nt[0]],verts[nt[2]]-verts[nt[1]]))< epsilon*epsilon*0.1f ) + { + btHullTriangle *nb = tris[tris[j]->n[0]]; + assert(nb);assert(!hasvert(*nb,v));assert(nb->idvmax>=0) break; + float3 n=TriNormal(verts[(*t)[0]],verts[(*t)[1]],verts[(*t)[2]]); + t->vmax = maxdirsterid(verts,verts_count,n,allow); + if(isextreme[t->vmax]) + { + t->vmax=-1; // already done that vertex - algorithm needs to be able to terminate. + } + else + { + t->rise = dot(n,verts[t->vmax]-verts[(*t)[0]]); + } + } + vlimit --; + } + return 1; +} + +int calchull(float3 *verts,int verts_count, int *&tris_out, int &tris_count,int vlimit) +{ + int rc=calchullgen(verts,verts_count, vlimit) ; + if(!rc) return 0; + Array ts; + for(int i=0;i &planes,float bevangle) +{ + int i,j; + planes.count=0; + int rc = calchullgen(verts,verts_count,vlimit); + if(!rc) return 0; + for(i=0;in[j]id) continue; + btHullTriangle *s = tris[t->n[j]]; + REAL3 snormal = TriNormal(verts[(*s)[0]],verts[(*s)[1]],verts[(*s)[2]]); + if(dot(snormal,p.normal)>=cos(bevangle*DEG2RAD)) continue; + REAL3 n = normalize(snormal+p.normal); + planes.Add(Plane(n,-dot(n,verts[maxdir(verts,verts_count,n)]))); + } + } + + for(i=0;i=0) + { + ConvexH *tmp = c; + c = ConvexHCrop(*tmp,planes[k]); + if(c==NULL) {c=tmp; break;} // might want to debug this case better!!! + if(!AssertIntact(*c)) {c=tmp; break;} // might want to debug this case better too!!! + delete tmp; + } + + assert(AssertIntact(*c)); + //return c; + faces_out = (int*)malloc(sizeof(int)*(1+c->facets.count+c->edges.count)); // new int[1+c->facets.count+c->edges.count]; + faces_count_out=0; + i=0; + faces_out[faces_count_out++]=-1; + k=0; + while(iedges.count) + { + j=1; + while(j+iedges.count && c->edges[i].p==c->edges[i+j].p) { j++; } + faces_out[faces_count_out++]=j; + while(j--) + { + faces_out[faces_count_out++] = c->edges[i].v; + i++; + } + k++; + } + faces_out[0]=k; // number of faces. + assert(k==c->facets.count); + assert(faces_count_out == 1+c->facets.count+c->edges.count); + verts_out = c->vertices.element; // new float3[c->vertices.count]; + verts_count_out = c->vertices.count; + for(i=0;ivertices.count;i++) + { + verts_out[i] = float3(c->vertices[i]); + } + c->vertices.count=c->vertices.array_size=0; c->vertices.element=NULL; + delete c; + return 1; +} + +int overhullv(float3 *verts, int verts_count,int maxplanes, + float3 *&verts_out, int &verts_count_out, int *&faces_out, int &faces_count_out ,float inflate,float bevangle,int vlimit) +{ + if(!verts_count) return 0; + extern int calchullpbev(float3 *verts,int verts_count,int vlimit, Array &planes,float bevangle) ; + Array planes; + int rc=calchullpbev(verts,verts_count,vlimit,planes,bevangle) ; + if(!rc) return 0; + return overhull(planes.element,planes.count,verts,verts_count,maxplanes,verts_out,verts_count_out,faces_out,faces_count_out,inflate); +} + + +bool ComputeHull(unsigned int vcount,const float *vertices,PHullResult &result,unsigned int vlimit,float inflate) +{ + + int index_count; + int *faces; + float3 *verts_out; + int verts_count_out; + + if(inflate==0.0f) + { + int *tris_out; + int tris_count; + int ret = calchull( (float3 *) vertices, (int) vcount, tris_out, tris_count, vlimit ); + if(!ret) return false; + result.mIndexCount = (unsigned int) (tris_count*3); + result.mFaceCount = (unsigned int) tris_count; + result.mVertices = (float*) vertices; + result.mVcount = (unsigned int) vcount; + result.mIndices = (unsigned int *) tris_out; + return true; + } + + int ret = overhullv((float3*)vertices,vcount,35,verts_out,verts_count_out,faces,index_count,inflate,120.0f,vlimit); + if(!ret) return false; + + Array tris; + int n=faces[0]; + int k=1; + for(int i=0;i bmax[j] ) bmax[j] = p[j]; + } + } + } + + float dx = bmax[0] - bmin[0]; + float dy = bmax[1] - bmin[1]; + float dz = bmax[2] - bmin[2]; + + float center[3]; + + center[0] = dx*0.5f + bmin[0]; + center[1] = dy*0.5f + bmin[1]; + center[2] = dz*0.5f + bmin[2]; + + if ( dx < EPSILON || dy < EPSILON || dz < EPSILON || svcount < 3 ) + { + + float len = FLT_MAX; + + if ( dx > EPSILON && dx < len ) len = dx; + if ( dy > EPSILON && dy < len ) len = dy; + if ( dz > EPSILON && dz < len ) len = dz; + + if ( len == FLT_MAX ) + { + dx = dy = dz = 0.01f; // one centimeter + } + else + { + if ( dx < EPSILON ) dx = len * 0.05f; // 1/5th the shortest non-zero edge. + if ( dy < EPSILON ) dy = len * 0.05f; + if ( dz < EPSILON ) dz = len * 0.05f; + } + + float x1 = center[0] - dx; + float x2 = center[0] + dx; + + float y1 = center[1] - dy; + float y2 = center[1] + dy; + + float z1 = center[2] - dz; + float z2 = center[2] + dz; + + addPoint(vcount,vertices,x1,y1,z1); + addPoint(vcount,vertices,x2,y1,z1); + addPoint(vcount,vertices,x2,y2,z1); + addPoint(vcount,vertices,x1,y2,z1); + addPoint(vcount,vertices,x1,y1,z2); + addPoint(vcount,vertices,x2,y1,z2); + addPoint(vcount,vertices,x2,y2,z2); + addPoint(vcount,vertices,x1,y2,z2); + + return true; // return cube + + + } + else + { + if ( scale ) + { + scale[0] = dx; + scale[1] = dy; + scale[2] = dz; + + recip[0] = 1 / dx; + recip[1] = 1 / dy; + recip[2] = 1 / dz; + + center[0]*=recip[0]; + center[1]*=recip[1]; + center[2]*=recip[2]; + + } + + } + + + + vtx = (const char *) svertices; + + for (unsigned int i=0; i dist2 ) + { + v[0] = px; + v[1] = py; + v[2] = pz; + } + + break; + } + } + + if ( j == vcount ) + { + float *dest = &vertices[vcount*3]; + dest[0] = px; + dest[1] = py; + dest[2] = pz; + vcount++; + } + } + } + + // ok..now make sure we didn't prune so many vertices it is now invalid. + if ( 1 ) + { + float bmin[3] = { FLT_MAX, FLT_MAX, FLT_MAX }; + float bmax[3] = { -FLT_MAX, -FLT_MAX, -FLT_MAX }; + + for (unsigned int i=0; i bmax[j] ) bmax[j] = p[j]; + } + } + + float dx = bmax[0] - bmin[0]; + float dy = bmax[1] - bmin[1]; + float dz = bmax[2] - bmin[2]; + + if ( dx < EPSILON || dy < EPSILON || dz < EPSILON || vcount < 3) + { + float cx = dx*0.5f + bmin[0]; + float cy = dy*0.5f + bmin[1]; + float cz = dz*0.5f + bmin[2]; + + float len = FLT_MAX; + + if ( dx >= EPSILON && dx < len ) len = dx; + if ( dy >= EPSILON && dy < len ) len = dy; + if ( dz >= EPSILON && dz < len ) len = dz; + + if ( len == FLT_MAX ) + { + dx = dy = dz = 0.01f; // one centimeter + } + else + { + if ( dx < EPSILON ) dx = len * 0.05f; // 1/5th the shortest non-zero edge. + if ( dy < EPSILON ) dy = len * 0.05f; + if ( dz < EPSILON ) dz = len * 0.05f; + } + + float x1 = cx - dx; + float x2 = cx + dx; + + float y1 = cy - dy; + float y2 = cy + dy; + + float z1 = cz - dz; + float z2 = cz + dz; + + vcount = 0; // add box + + addPoint(vcount,vertices,x1,y1,z1); + addPoint(vcount,vertices,x2,y1,z1); + addPoint(vcount,vertices,x2,y2,z1); + addPoint(vcount,vertices,x1,y2,z1); + addPoint(vcount,vertices,x1,y1,z2); + addPoint(vcount,vertices,x2,y1,z2); + addPoint(vcount,vertices,x2,y2,z2); + addPoint(vcount,vertices,x1,y2,z2); + + return true; + } + } + + return true; +} + +void HullLibrary::BringOutYourDead(const float *verts,unsigned int vcount, float *overts,unsigned int &ocount,unsigned int *indices,unsigned indexcount) +{ + unsigned int *used = (unsigned int *)malloc(sizeof(unsigned int)*vcount); + memset(used,0,sizeof(unsigned int)*vcount); + + ocount = 0; + + for (unsigned int i=0; i= 0 && v < vcount ); + + if ( used[v] ) // if already remapped + { + indices[i] = used[v]-1; // index to new array + } + else + { + + indices[i] = ocount; // new index mapping + + overts[ocount*3+0] = verts[v*3+0]; // copy old vert to new vert array + overts[ocount*3+1] = verts[v*3+1]; + overts[ocount*3+2] = verts[v*3+2]; + + ocount++; // increment output vert count + + assert( ocount >=0 && ocount <= vcount ); + + used[v] = ocount; // assign new index remapping + } + } + + free(used); +} + +} diff --git a/BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/cd_hull.h b/BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/cd_hull.h new file mode 100644 index 00000000..420e241b --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/cd_hull.h @@ -0,0 +1,153 @@ +#ifndef CD_HULL_H + +#define CD_HULL_H + +/*---------------------------------------------------------------------- + Copyright (c) 2004 Open Dynamics Framework Group + www.physicstools.org + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, are permitted provided + that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + Neither the name of the Open Dynamics Framework Group nor the names of its contributors may + be used to endorse or promote products derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-----------------------------------------------------------------------*/ + +namespace ConvexDecomposition +{ + +class HullResult +{ +public: + HullResult(void) + { + mPolygons = true; + mNumOutputVertices = 0; + mOutputVertices = 0; + mNumFaces = 0; + mNumIndices = 0; + mIndices = 0; + } + bool mPolygons; // true if indices represents polygons, false indices are triangles + unsigned int mNumOutputVertices; // number of vertices in the output hull + float *mOutputVertices; // array of vertices, 3 floats each x,y,z + unsigned int mNumFaces; // the number of faces produced + unsigned int mNumIndices; // the total number of indices + unsigned int *mIndices; // pointer to indices. + +// If triangles, then indices are array indexes into the vertex list. +// If polygons, indices are in the form (number of points in face) (p1, p2, p3, ..) etc.. +}; + +enum HullFlag +{ + QF_TRIANGLES = (1<<0), // report results as triangles, not polygons. + QF_REVERSE_ORDER = (1<<1), // reverse order of the triangle indices. + QF_SKIN_WIDTH = (1<<2), // extrude hull based on this skin width + QF_DEFAULT = 0 +}; + + +class HullDesc +{ +public: + HullDesc(void) + { + mFlags = QF_DEFAULT; + mVcount = 0; + mVertices = 0; + mVertexStride = sizeof(float)*3; + mNormalEpsilon = 0.001f; + mMaxVertices = 4096; // maximum number of points to be considered for a convex hull. + mMaxFaces = 4096; + mSkinWidth = 0.01f; // default is one centimeter + }; + + HullDesc(HullFlag flag, + unsigned int vcount, + const float *vertices, + unsigned int stride) + { + mFlags = flag; + mVcount = vcount; + mVertices = vertices; + mVertexStride = stride; + mNormalEpsilon = 0.001f; + mMaxVertices = 4096; + mSkinWidth = 0.01f; // default is one centimeter + } + + bool HasHullFlag(HullFlag flag) const + { + if ( mFlags & flag ) return true; + return false; + } + + void SetHullFlag(HullFlag flag) + { + mFlags|=flag; + } + + void ClearHullFlag(HullFlag flag) + { + mFlags&=~flag; + } + + unsigned int mFlags; // flags to use when generating the convex hull. + unsigned int mVcount; // number of vertices in the input point cloud + const float *mVertices; // the array of vertices. + unsigned int mVertexStride; // the stride of each vertex, in bytes. + float mNormalEpsilon; // the epsilon for removing duplicates. This is a normalized value, if normalized bit is on. + float mSkinWidth; + unsigned int mMaxVertices; // maximum number of vertices to be considered for the hull! + unsigned int mMaxFaces; +}; + +enum HullError +{ + QE_OK, // success! + QE_FAIL // failed. +}; + +class HullLibrary +{ +public: + + HullError CreateConvexHull(const HullDesc &desc, // describes the input request + HullResult &result); // contains the resulst + + HullError ReleaseResult(HullResult &result); // release memory allocated for this result, we are done with it. + +private: + + void BringOutYourDead(const float *verts,unsigned int vcount, float *overts,unsigned int &ocount,unsigned int *indices,unsigned indexcount); + + bool CleanupVertices(unsigned int svcount, + const float *svertices, + unsigned int stride, + unsigned int &vcount, // output number of vertices + float *vertices, // location to store the results. + float normalepsilon, + float *scale); +}; + +} + +#endif + diff --git a/BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/cd_vector.h b/BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/cd_vector.h new file mode 100644 index 00000000..382ba753 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/cd_vector.h @@ -0,0 +1,1185 @@ +#ifndef CD_VECTOR_H + +#define CD_VECTOR_H + +/*---------------------------------------------------------------------- + Copyright (c) 2004 Open Dynamics Framework Group + www.physicstools.org + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, are permitted provided + that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + Neither the name of the Open Dynamics Framework Group nor the names of its contributors may + be used to endorse or promote products derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-----------------------------------------------------------------------*/ + +// http://codesuppository.blogspot.com +// +// mailto: jratcliff@infiniplex.net +// +// http://www.amillionpixels.us +// + + +#pragma warning(disable:4786) + +#include +#include +#include + +namespace ConvexDecomposition +{ + + +const float DEG_TO_RAD = ((2.0f * 3.14152654f) / 360.0f); +const float RAD_TO_DEG = (360.0f / (2.0f * 3.141592654f)); + +class Vector3d +{ +public: + Vector3d(void) { }; // null constructor, does not inialize point. + + Vector3d(const Vector3d &a) // constructor copies existing vector. + { + x = a.x; + y = a.y; + z = a.z; + }; + + Vector3d(float a,float b,float c) // construct with initial point. + { + x = a; + y = b; + z = c; + }; + + Vector3d(const float *t) + { + x = t[0]; + y = t[1]; + z = t[2]; + }; + + Vector3d(const int *t) + { + x = t[0]; + y = t[1]; + z = t[2]; + }; + + bool operator==(const Vector3d &a) const + { + return( a.x == x && a.y == y && a.z == z ); + }; + + bool operator!=(const Vector3d &a) const + { + return( a.x != x || a.y != y || a.z != z ); + }; + +// Operators + Vector3d& operator = (const Vector3d& A) // ASSIGNMENT (=) + { x=A.x; y=A.y; z=A.z; + return(*this); }; + + Vector3d operator + (const Vector3d& A) const // ADDITION (+) + { Vector3d Sum(x+A.x, y+A.y, z+A.z); + return(Sum); }; + + Vector3d operator - (const Vector3d& A) const // SUBTRACTION (-) + { Vector3d Diff(x-A.x, y-A.y, z-A.z); + return(Diff); }; + + Vector3d operator * (const float s) const // MULTIPLY BY SCALAR (*) + { Vector3d Scaled(x*s, y*s, z*s); + return(Scaled); }; + + + Vector3d operator + (const float s) const // ADD CONSTANT TO ALL 3 COMPONENTS (*) + { Vector3d Scaled(x+s, y+s, z+s); + return(Scaled); }; + + + + + Vector3d operator / (const float s) const // DIVIDE BY SCALAR (/) + { + float r = 1.0f / s; + Vector3d Scaled(x*r, y*r, z*r); + return(Scaled); + }; + + void operator /= (float A) // ACCUMULATED VECTOR ADDITION (/=) + { x/=A; y/=A; z/=A; }; + + void operator += (const Vector3d A) // ACCUMULATED VECTOR ADDITION (+=) + { x+=A.x; y+=A.y; z+=A.z; }; + void operator -= (const Vector3d A) // ACCUMULATED VECTOR SUBTRACTION (+=) + { x-=A.x; y-=A.y; z-=A.z; }; + void operator *= (const float s) // ACCUMULATED SCALAR MULTIPLICATION (*=) (bpc 4/24/2000) + {x*=s; y*=s; z*=s;} + + void operator += (const float A) // ACCUMULATED VECTOR ADDITION (+=) + { x+=A; y+=A; z+=A; }; + + + Vector3d operator - (void) const // NEGATION (-) + { Vector3d Negated(-x, -y, -z); + return(Negated); }; + + float operator [] (const int i) const // ALLOWS VECTOR ACCESS AS AN ARRAY. + { return( (i==0)?x:((i==1)?y:z) ); }; + float & operator [] (const int i) + { return( (i==0)?x:((i==1)?y:z) ); }; +// + + // accessor methods. + float GetX(void) const { return x; }; + float GetY(void) const { return y; }; + float GetZ(void) const { return z; }; + + float X(void) const { return x; }; + float Y(void) const { return y; }; + float Z(void) const { return z; }; + + void SetX(float t) { x = t; }; + void SetY(float t) { y = t; }; + void SetZ(float t) { z = t; }; + + bool IsSame(const Vector3d &v,float epsilon) const + { + float dx = fabsf( x - v.x ); + if ( dx > epsilon ) return false; + float dy = fabsf( y - v.y ); + if ( dy > epsilon ) return false; + float dz = fabsf( z - v.z ); + if ( dz > epsilon ) return false; + return true; + } + + + float ComputeNormal(const Vector3d &A, + const Vector3d &B, + const Vector3d &C) + { + float vx,vy,vz,wx,wy,wz,vw_x,vw_y,vw_z,mag; + + vx = (B.x - C.x); + vy = (B.y - C.y); + vz = (B.z - C.z); + + wx = (A.x - B.x); + wy = (A.y - B.y); + wz = (A.z - B.z); + + vw_x = vy * wz - vz * wy; + vw_y = vz * wx - vx * wz; + vw_z = vx * wy - vy * wx; + + mag = sqrtf((vw_x * vw_x) + (vw_y * vw_y) + (vw_z * vw_z)); + + if ( mag < 0.000001f ) + { + mag = 0; + } + else + { + mag = 1.0f/mag; + } + + x = vw_x * mag; + y = vw_y * mag; + z = vw_z * mag; + + return mag; + } + + + void ScaleSumScale(float c0,float c1,const Vector3d &pos) + { + x = (x*c0) + (pos.x*c1); + y = (y*c0) + (pos.y*c1); + z = (z*c0) + (pos.z*c1); + } + + void SwapYZ(void) + { + float t = y; + y = z; + z = t; + }; + + void Get(float *v) const + { + v[0] = x; + v[1] = y; + v[2] = z; + }; + + void Set(const int *p) + { + x = (float) p[0]; + y = (float) p[1]; + z = (float) p[2]; + } + + void Set(const float *p) + { + x = (float) p[0]; + y = (float) p[1]; + z = (float) p[2]; + } + + + void Set(float a,float b,float c) + { + x = a; + y = b; + z = c; + }; + + void Zero(void) + { + x = y = z = 0; + }; + + const float* Ptr() const { return &x; } + float* Ptr() { return &x; } + + +// return -(*this). + Vector3d negative(void) const + { + Vector3d result; + result.x = -x; + result.y = -y; + result.z = -z; + return result; + } + + float Magnitude(void) const + { + return float(sqrt(x * x + y * y + z * z)); + }; + + float FastMagnitude(void) const + { + return float(sqrtf(x * x + y * y + z * z)); + }; + + float FasterMagnitude(void) const + { + return float(sqrtf(x * x + y * y + z * z)); + }; + + void Lerp(const Vector3d& from,const Vector3d& to,float slerp) + { + x = ((to.x - from.x) * slerp) + from.x; + y = ((to.y - from.y) * slerp) + from.y; + z = ((to.z - from.z) * slerp) + from.z; + }; + + // Highly specialized interpolate routine. Will compute the interpolated position + // shifted forward or backwards along the ray defined between (from) and (to). + // Reason for existance is so that when a bullet collides with a wall, for + // example, you can generate a graphic effect slightly *before* it hit the + // wall so that the effect doesn't sort into the wall itself. + void Interpolate(const Vector3d &from,const Vector3d &to,float offset) + { + x = to.x-from.x; + y = to.y-from.y; + z = to.z-from.z; + float d = sqrtf( x*x + y*y + z*z ); + float recip = 1.0f / d; + x*=recip; + y*=recip; + z*=recip; // normalize vector + d+=offset; // shift along ray + x = x*d + from.x; + y = y*d + from.y; + z = z*d + from.z; + }; + + bool BinaryEqual(const Vector3d &p) const + { + const int *source = (const int *) &x; + const int *dest = (const int *) &p.x; + + if ( source[0] == dest[0] && + source[1] == dest[1] && + source[2] == dest[2] ) return true; + + return false; + }; + + /*bool BinaryEqual(const Vector3d &p) const + { + if ( x == p.x && y == p.y && z == p.z ) return true; + return false; + } + */ + + + +/** Computes the reflection vector between two vectors.*/ + void Reflection(const Vector3d &a,const Vector3d &b)// compute reflection vector. + { + Vector3d c; + Vector3d d; + + float dot = a.Dot(b) * 2.0f; + + c = b * dot; + + d = c - a; + + x = -d.x; + y = -d.y; + z = -d.z; + }; + + void AngleAxis(float angle,const Vector3d& axis) + { + x = axis.x*angle; + y = axis.y*angle; + z = axis.z*angle; + }; + + float Length(void) const // length of vector. + { + return float(sqrt( x*x + y*y + z*z )); + }; + + + float ComputePlane(const Vector3d &A, + const Vector3d &B, + const Vector3d &C) + { + float vx,vy,vz,wx,wy,wz,vw_x,vw_y,vw_z,mag; + + vx = (B.x - C.x); + vy = (B.y - C.y); + vz = (B.z - C.z); + + wx = (A.x - B.x); + wy = (A.y - B.y); + wz = (A.z - B.z); + + vw_x = vy * wz - vz * wy; + vw_y = vz * wx - vx * wz; + vw_z = vx * wy - vy * wx; + + mag = sqrtf((vw_x * vw_x) + (vw_y * vw_y) + (vw_z * vw_z)); + + if ( mag < 0.000001f ) + { + mag = 0; + } + else + { + mag = 1.0f/mag; + } + + x = vw_x * mag; + y = vw_y * mag; + z = vw_z * mag; + + + float D = 0.0f - ((x*A.x)+(y*A.y)+(z*A.z)); + + return D; + } + + + float FastLength(void) const // length of vector. + { + return float(sqrtf( x*x + y*y + z*z )); + }; + + + float FasterLength(void) const // length of vector. + { + return float(sqrtf( x*x + y*y + z*z )); + }; + + float Length2(void) const // squared distance, prior to square root. + { + float l2 = x*x+y*y+z*z; + return l2; + }; + + float Distance(const Vector3d &a) const // distance between two points. + { + Vector3d d(a.x-x,a.y-y,a.z-z); + return d.Length(); + } + + float FastDistance(const Vector3d &a) const // distance between two points. + { + Vector3d d(a.x-x,a.y-y,a.z-z); + return d.FastLength(); + } + + float FasterDistance(const Vector3d &a) const // distance between two points. + { + Vector3d d(a.x-x,a.y-y,a.z-z); + return d.FasterLength(); + } + + + float DistanceXY(const Vector3d &a) const + { + float dx = a.x - x; + float dy = a.y - y; + float dist = dx*dx + dy*dy; + return dist; + } + + float Distance2(const Vector3d &a) const // squared distance. + { + float dx = a.x - x; + float dy = a.y - y; + float dz = a.z - z; + return dx*dx + dy*dy + dz*dz; + }; + + float Partial(const Vector3d &p) const + { + return (x*p.y) - (p.x*y); + } + + float Area(const Vector3d &p1,const Vector3d &p2) const + { + float A = Partial(p1); + A+= p1.Partial(p2); + A+= p2.Partial(*this); + return A*0.5f; + } + + inline float Normalize(void) // normalize to a unit vector, returns distance. + { + float d = sqrtf( static_cast< float >( x*x + y*y + z*z ) ); + if ( d > 0 ) + { + float r = 1.0f / d; + x *= r; + y *= r; + z *= r; + } + else + { + x = y = z = 1; + } + return d; + }; + + inline float FastNormalize(void) // normalize to a unit vector, returns distance. + { + float d = sqrt( static_cast< float >( x*x + y*y + z*z ) ); + if ( d > 0 ) + { + float r = 1.0f / d; + x *= r; + y *= r; + z *= r; + } + else + { + x = y = z = 1; + } + return d; + }; + + inline float FasterNormalize(void) // normalize to a unit vector, returns distance. + { + float d = sqrtf( static_cast< float >( x*x + y*y + z*z ) ); + if ( d > 0 ) + { + float r = 1.0f / d; + x *= r; + y *= r; + z *= r; + } + else + { + x = y = z = 1; + } + return d; + }; + + + + + float Dot(const Vector3d &a) const // computes dot product. + { + return (x * a.x + y * a.y + z * a.z ); + }; + + + Vector3d Cross( const Vector3d& other ) const + { + Vector3d result( y*other.z - z*other.y, z*other.x - x*other.z, x*other.y - y*other.x ); + + return result; + } + + void Cross(const Vector3d &a,const Vector3d &b) // cross two vectors result in this one. + { + x = a.y*b.z - a.z*b.y; + y = a.z*b.x - a.x*b.z; + z = a.x*b.y - a.y*b.x; + }; + + /******************************************/ + // Check if next edge (b to c) turns inward + // + // Edge from a to b is already in face + // Edge from b to c is being considered for addition to face + /******************************************/ + bool Concave(const Vector3d& a,const Vector3d& b) + { + float vx,vy,vz,wx,wy,wz,vw_x,vw_y,vw_z,mag,nx,ny,nz,mag_a,mag_b; + + wx = b.x - a.x; + wy = b.y - a.y; + wz = b.z - a.z; + + mag_a = (float) sqrtf((wx * wx) + (wy * wy) + (wz * wz)); + + vx = x - b.x; + vy = y - b.y; + vz = z - b.z; + + mag_b = (float) sqrtf((vx * vx) + (vy * vy) + (vz * vz)); + + vw_x = (vy * wz) - (vz * wy); + vw_y = (vz * wx) - (vx * wz); + vw_z = (vx * wy) - (vy * wx); + + mag = (float) sqrtf((vw_x * vw_x) + (vw_y * vw_y) + (vw_z * vw_z)); + + // Check magnitude of cross product, which is a sine function + // i.e., mag (a x b) = mag (a) * mag (b) * sin (theta); + // If sin (theta) small, then angle between edges is very close to + // 180, which we may want to call a concavity. Setting the + // CONCAVITY_TOLERANCE value greater than about 0.01 MAY cause + // face consolidation to get stuck on particular face. Most meshes + // convert properly with a value of 0.0 + + if (mag/(mag_a*mag_b) <= 0.0f ) return true; + + mag = 1.0f / mag; + + nx = vw_x * mag; + ny = vw_y * mag; + nz = vw_z * mag; + + // Dot product of tri normal with cross product result will + // yield positive number if edges are convex (+1.0 if two tris + // are coplanar), negative number if edges are concave (-1.0 if + // two tris are coplanar.) + + mag = ( x * nx) + ( y * ny) + ( z * nz); + + if (mag > 0.0f ) return false; + + return(true); + }; + + bool PointTestXY(const Vector3d &i,const Vector3d &j) const + { + if (((( i.y <= y ) && ( y < j.y )) || + (( j.y <= y ) && ( y < i.y ))) && + ( x < (j.x - i.x) * (y - i.y) / (j.y - i.y) + i.x)) return true; + return false; + } + + // test to see if this point is inside the triangle specified by + // these three points on the X/Y plane. + bool PointInTriXY(const Vector3d &p1, + const Vector3d &p2, + const Vector3d &p3) const + { + float ax = p3.x - p2.x; + float ay = p3.y - p2.y; + float bx = p1.x - p3.x; + float by = p1.y - p3.y; + float cx = p2.x - p1.x; + float cy = p2.y - p1.y; + float apx = x - p1.x; + float apy = y - p1.y; + float bpx = x - p2.x; + float bpy = y - p2.y; + float cpx = x - p3.x; + float cpy = y - p3.y; + + float aCROSSbp = ax*bpy - ay*bpx; + float cCROSSap = cx*apy - cy*apx; + float bCROSScp = bx*cpy - by*cpx; + + return ((aCROSSbp >= 0.0f) && (bCROSScp >= 0.0f) && (cCROSSap >= 0.0f)); + }; + + // test to see if this point is inside the triangle specified by + // these three points on the X/Y plane. + bool PointInTriYZ(const Vector3d &p1, + const Vector3d &p2, + const Vector3d &p3) const + { + float ay = p3.y - p2.y; + float az = p3.z - p2.z; + float by = p1.y - p3.y; + float bz = p1.z - p3.z; + float cy = p2.y - p1.y; + float cz = p2.z - p1.z; + float apy = y - p1.y; + float apz = z - p1.z; + float bpy = y - p2.y; + float bpz = z - p2.z; + float cpy = y - p3.y; + float cpz = z - p3.z; + + float aCROSSbp = ay*bpz - az*bpy; + float cCROSSap = cy*apz - cz*apy; + float bCROSScp = by*cpz - bz*cpy; + + return ((aCROSSbp >= 0.0f) && (bCROSScp >= 0.0f) && (cCROSSap >= 0.0f)); + }; + + + // test to see if this point is inside the triangle specified by + // these three points on the X/Y plane. + bool PointInTriXZ(const Vector3d &p1, + const Vector3d &p2, + const Vector3d &p3) const + { + float az = p3.z - p2.z; + float ax = p3.x - p2.x; + float bz = p1.z - p3.z; + float bx = p1.x - p3.x; + float cz = p2.z - p1.z; + float cx = p2.x - p1.x; + float apz = z - p1.z; + float apx = x - p1.x; + float bpz = z - p2.z; + float bpx = x - p2.x; + float cpz = z - p3.z; + float cpx = x - p3.x; + + float aCROSSbp = az*bpx - ax*bpz; + float cCROSSap = cz*apx - cx*apz; + float bCROSScp = bz*cpx - bx*cpz; + + return ((aCROSSbp >= 0.0f) && (bCROSScp >= 0.0f) && (cCROSSap >= 0.0f)); + }; + + // Given a point and a line (defined by two points), compute the closest point + // in the line. (The line is treated as infinitely long.) + void NearestPointInLine(const Vector3d &point, + const Vector3d &line0, + const Vector3d &line1) + { + Vector3d &nearestPoint = *this; + Vector3d lineDelta = line1 - line0; + + // Handle degenerate lines + if ( lineDelta == Vector3d(0, 0, 0) ) + { + nearestPoint = line0; + } + else + { + float delta = (point-line0).Dot(lineDelta) / (lineDelta).Dot(lineDelta); + nearestPoint = line0 + lineDelta*delta; + } + } + + // Given a point and a line segment (defined by two points), compute the closest point + // in the line. Cap the point at the endpoints of the line segment. + void NearestPointInLineSegment(const Vector3d &point, + const Vector3d &line0, + const Vector3d &line1) + { + Vector3d &nearestPoint = *this; + Vector3d lineDelta = line1 - line0; + + // Handle degenerate lines + if ( lineDelta == Vector3d(0, 0, 0) ) + { + nearestPoint = line0; + } + else + { + float delta = (point-line0).Dot(lineDelta) / (lineDelta).Dot(lineDelta); + + // Clamp the point to conform to the segment's endpoints + if ( delta < 0 ) + delta = 0; + else if ( delta > 1 ) + delta = 1; + + nearestPoint = line0 + lineDelta*delta; + } + } + + // Given a point and a plane (defined by three points), compute the closest point + // in the plane. (The plane is unbounded.) + void NearestPointInPlane(const Vector3d &point, + const Vector3d &triangle0, + const Vector3d &triangle1, + const Vector3d &triangle2) + { + Vector3d &nearestPoint = *this; + Vector3d lineDelta0 = triangle1 - triangle0; + Vector3d lineDelta1 = triangle2 - triangle0; + Vector3d pointDelta = point - triangle0; + Vector3d normal; + + // Get the normal of the polygon (doesn't have to be a unit vector) + normal.Cross(lineDelta0, lineDelta1); + + float delta = normal.Dot(pointDelta) / normal.Dot(normal); + nearestPoint = point - normal*delta; + } + + // Given a point and a plane (defined by a coplanar point and a normal), compute the closest point + // in the plane. (The plane is unbounded.) + void NearestPointInPlane(const Vector3d &point, + const Vector3d &planePoint, + const Vector3d &planeNormal) + { + Vector3d &nearestPoint = *this; + Vector3d pointDelta = point - planePoint; + + float delta = planeNormal.Dot(pointDelta) / planeNormal.Dot(planeNormal); + nearestPoint = point - planeNormal*delta; + } + + // Given a point and a triangle (defined by three points), compute the closest point + // in the triangle. Clamp the point so it's confined to the area of the triangle. + void NearestPointInTriangle(const Vector3d &point, + const Vector3d &triangle0, + const Vector3d &triangle1, + const Vector3d &triangle2) + { + static const Vector3d zeroVector(0, 0, 0); + + Vector3d &nearestPoint = *this; + + Vector3d lineDelta0 = triangle1 - triangle0; + Vector3d lineDelta1 = triangle2 - triangle0; + + // Handle degenerate triangles + if ( (lineDelta0 == zeroVector) || (lineDelta1 == zeroVector) ) + { + nearestPoint.NearestPointInLineSegment(point, triangle1, triangle2); + } + else if ( lineDelta0 == lineDelta1 ) + { + nearestPoint.NearestPointInLineSegment(point, triangle0, triangle1); + } + + else + { + static Vector3d axis[3]; + axis[0].NearestPointInLine(triangle0, triangle1, triangle2); + axis[1].NearestPointInLine(triangle1, triangle0, triangle2); + axis[2].NearestPointInLine(triangle2, triangle0, triangle1); + + float axisDot[3]; + axisDot[0] = (triangle0-axis[0]).Dot(point-axis[0]); + axisDot[1] = (triangle1-axis[1]).Dot(point-axis[1]); + axisDot[2] = (triangle2-axis[2]).Dot(point-axis[2]); + + bool bForce = true; + float bestMagnitude2 = 0; + float closeMagnitude2; + Vector3d closePoint; + + if ( axisDot[0] < 0 ) + { + closePoint.NearestPointInLineSegment(point, triangle1, triangle2); + closeMagnitude2 = point.Distance2(closePoint); + if ( bForce || (bestMagnitude2 > closeMagnitude2) ) + { + bForce = false; + bestMagnitude2 = closeMagnitude2; + nearestPoint = closePoint; + } + } + if ( axisDot[1] < 0 ) + { + closePoint.NearestPointInLineSegment(point, triangle0, triangle2); + closeMagnitude2 = point.Distance2(closePoint); + if ( bForce || (bestMagnitude2 > closeMagnitude2) ) + { + bForce = false; + bestMagnitude2 = closeMagnitude2; + nearestPoint = closePoint; + } + } + if ( axisDot[2] < 0 ) + { + closePoint.NearestPointInLineSegment(point, triangle0, triangle1); + closeMagnitude2 = point.Distance2(closePoint); + if ( bForce || (bestMagnitude2 > closeMagnitude2) ) + { + bForce = false; + bestMagnitude2 = closeMagnitude2; + nearestPoint = closePoint; + } + } + + // If bForce is true at this point, it means the nearest point lies + // inside the triangle; use the nearest-point-on-a-plane equation + if ( bForce ) + { + Vector3d normal; + + // Get the normal of the polygon (doesn't have to be a unit vector) + normal.Cross(lineDelta0, lineDelta1); + + Vector3d pointDelta = point - triangle0; + float delta = normal.Dot(pointDelta) / normal.Dot(normal); + + nearestPoint = point - normal*delta; + } + } + } + + +//private: + + float x; + float y; + float z; +}; + + +class Vector2d +{ +public: + Vector2d(void) { }; // null constructor, does not inialize point. + + Vector2d(const Vector2d &a) // constructor copies existing vector. + { + x = a.x; + y = a.y; + }; + + Vector2d(const float *t) + { + x = t[0]; + y = t[1]; + }; + + + Vector2d(float a,float b) // construct with initial point. + { + x = a; + y = b; + }; + + const float* Ptr() const { return &x; } + float* Ptr() { return &x; } + + Vector2d & operator+=(const Vector2d &a) // += operator. + { + x+=a.x; + y+=a.y; + return *this; + }; + + Vector2d & operator-=(const Vector2d &a) + { + x-=a.x; + y-=a.y; + return *this; + }; + + Vector2d & operator*=(const Vector2d &a) + { + x*=a.x; + y*=a.y; + return *this; + }; + + Vector2d & operator/=(const Vector2d &a) + { + x/=a.x; + y/=a.y; + return *this; + }; + + bool operator==(const Vector2d &a) const + { + if ( a.x == x && a.y == y ) return true; + return false; + }; + + bool operator!=(const Vector2d &a) const + { + if ( a.x != x || a.y != y ) return true; + return false; + }; + + Vector2d operator+(Vector2d a) const + { + a.x+=x; + a.y+=y; + return a; + }; + + Vector2d operator-(Vector2d a) const + { + a.x = x-a.x; + a.y = y-a.y; + return a; + }; + + Vector2d operator - (void) const + { + return negative(); + }; + + Vector2d operator*(Vector2d a) const + { + a.x*=x; + a.y*=y; + return a; + }; + + Vector2d operator*(float c) const + { + Vector2d a; + + a.x = x * c; + a.y = y * c; + + return a; + }; + + Vector2d operator/(Vector2d a) const + { + a.x = x/a.x; + a.y = y/a.y; + return a; + }; + + + float Dot(const Vector2d &a) const // computes dot product. + { + return (x * a.x + y * a.y ); + }; + + float GetX(void) const { return x; }; + float GetY(void) const { return y; }; + + void SetX(float t) { x = t; }; + void SetY(float t) { y = t; }; + + void Set(float a,float b) + { + x = a; + y = b; + }; + + void Zero(void) + { + x = y = 0; + }; + + Vector2d negative(void) const + { + Vector2d result; + result.x = -x; + result.y = -y; + return result; + } + + float magnitude(void) const + { + return (float) sqrtf(x * x + y * y ); + } + + float fastmagnitude(void) const + { + return (float) sqrtf(x * x + y * y ); + } + + float fastermagnitude(void) const + { + return (float) sqrtf( x * x + y * y ); + } + + void Reflection(Vector2d &a,Vector2d &b); // compute reflection vector. + + float Length(void) const // length of vector. + { + return float(sqrtf( x*x + y*y )); + }; + + float FastLength(void) const // length of vector. + { + return float(sqrtf( x*x + y*y )); + }; + + float FasterLength(void) const // length of vector. + { + return float(sqrtf( x*x + y*y )); + }; + + float Length2(void) // squared distance, prior to square root. + { + return x*x+y*y; + } + + float Distance(const Vector2d &a) const // distance between two points. + { + float dx = a.x - x; + float dy = a.y - y; + float d = dx*dx+dy*dy; + return sqrtf(d); + }; + + float FastDistance(const Vector2d &a) const // distance between two points. + { + float dx = a.x - x; + float dy = a.y - y; + float d = dx*dx+dy*dy; + return sqrtf(d); + }; + + float FasterDistance(const Vector2d &a) const // distance between two points. + { + float dx = a.x - x; + float dy = a.y - y; + float d = dx*dx+dy*dy; + return sqrtf(d); + }; + + float Distance2(Vector2d &a) // squared distance. + { + float dx = a.x - x; + float dy = a.y - y; + return dx*dx + dy *dy; + }; + + void Lerp(const Vector2d& from,const Vector2d& to,float slerp) + { + x = ((to.x - from.x)*slerp) + from.x; + y = ((to.y - from.y)*slerp) + from.y; + }; + + + void Cross(const Vector2d &a,const Vector2d &b) // cross two vectors result in this one. + { + x = a.y*b.x - a.x*b.y; + y = a.x*b.x - a.x*b.x; + }; + + float Normalize(void) // normalize to a unit vector, returns distance. + { + float l = Length(); + if ( l != 0 ) + { + l = float( 1 ) / l; + x*=l; + y*=l; + } + else + { + x = y = 0; + } + return l; + }; + + float FastNormalize(void) // normalize to a unit vector, returns distance. + { + float l = FastLength(); + if ( l != 0 ) + { + l = float( 1 ) / l; + x*=l; + y*=l; + } + else + { + x = y = 0; + } + return l; + }; + + float FasterNormalize(void) // normalize to a unit vector, returns distance. + { + float l = FasterLength(); + if ( l != 0 ) + { + l = float( 1 ) / l; + x*=l; + y*=l; + } + else + { + x = y = 0; + } + return l; + }; + + + float x; + float y; +}; + +class Line +{ +public: + Line(const Vector3d &from,const Vector3d &to) + { + mP1 = from; + mP2 = to; + }; + // JWR Test for the intersection of two lines. + + bool Intersect(const Line& src,Vector3d §); +private: + Vector3d mP1; + Vector3d mP2; + +}; + + +typedef std::vector< Vector3d > Vector3dVector; +typedef std::vector< Vector2d > Vector2dVector; + +inline Vector3d operator * (float s, const Vector3d &v ) +{ + Vector3d Scaled(v.x*s, v.y*s, v.z*s); + return(Scaled); +} + +inline Vector2d operator * (float s, const Vector2d &v ) + { + Vector2d Scaled(v.x*s, v.y*s); + return(Scaled); + } + +} + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/cd_wavefront.cpp b/BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/cd_wavefront.cpp new file mode 100644 index 00000000..786f4387 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/cd_wavefront.cpp @@ -0,0 +1,860 @@ +#include +#include +#include +#include +#include + +/*---------------------------------------------------------------------- + Copyright (c) 2004 Open Dynamics Framework Group + www.physicstools.org + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, are permitted provided + that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + Neither the name of the Open Dynamics Framework Group nor the names of its contributors may + be used to endorse or promote products derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-----------------------------------------------------------------------*/ + +// http://codesuppository.blogspot.com +// +// mailto: jratcliff@infiniplex.net +// +// http://www.amillionpixels.us +// +#include "float_math.h" + +#include "cd_wavefront.h" + + +using namespace ConvexDecomposition; + +/*---------------------------------------------------------------------- + Copyright (c) 2004 Open Dynamics Framework Group + www.physicstools.org + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, are permitted provided + that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + Neither the name of the Open Dynamics Framework Group nor the names of its contributors may + be used to endorse or promote products derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-----------------------------------------------------------------------*/ + +#include + +namespace ConvexDecomposition +{ + +typedef std::vector< int > IntVector; +typedef std::vector< float > FloatVector; + +#if defined(__APPLE__) || defined(__CELLOS_LV2__) +#define stricmp(a, b) strcasecmp((a), (b)) +#endif + +/*******************************************************************/ +/******************** InParser.h ********************************/ +/*******************************************************************/ +class InPlaceParserInterface +{ +public: + virtual ~InPlaceParserInterface () {} ; + + virtual int ParseLine(int lineno,int argc,const char **argv) =0; // return TRUE to continue parsing, return FALSE to abort parsing process +}; + +enum SeparatorType +{ + ST_DATA, // is data + ST_HARD, // is a hard separator + ST_SOFT, // is a soft separator + ST_EOS // is a comment symbol, and everything past this character should be ignored +}; + +class InPlaceParser +{ +public: + InPlaceParser(void) + { + Init(); + } + + InPlaceParser(char *data,int len) + { + Init(); + SetSourceData(data,len); + } + + InPlaceParser(const char *fname) + { + Init(); + SetFile(fname); + } + + ~InPlaceParser(void); + + void Init(void) + { + mQuoteChar = 34; + mData = 0; + mLen = 0; + mMyAlloc = false; + for (int i=0; i<256; i++) + { + mHard[i] = ST_DATA; + mHardString[i*2] = i; + mHardString[i*2+1] = 0; + } + mHard[0] = ST_EOS; + mHard[32] = ST_SOFT; + mHard[9] = ST_SOFT; + mHard[13] = ST_SOFT; + mHard[10] = ST_SOFT; + } + + void SetFile(const char *fname); // use this file as source data to parse. + + void SetSourceData(char *data,int len) + { + mData = data; + mLen = len; + mMyAlloc = false; + }; + + int Parse(InPlaceParserInterface *callback); // returns true if entire file was parsed, false if it aborted for some reason + + int ProcessLine(int lineno,char *line,InPlaceParserInterface *callback); + + const char ** GetArglist(char *source,int &count); // convert source string into an arg list, this is a destructive parse. + + void SetHardSeparator(char c) // add a hard separator + { + mHard[(int)c] = ST_HARD; + } + + void SetHard(char c) // add a hard separator + { + mHard[(int)c] = ST_HARD; + } + + + void SetCommentSymbol(char c) // comment character, treated as 'end of string' + { + mHard[(int)c] = ST_EOS; + } + + void ClearHardSeparator(char c) + { + mHard[(int)c] = ST_DATA; + } + + + void DefaultSymbols(void); // set up default symbols for hard seperator and comment symbol of the '#' character. + + bool EOS(char c) + { + if ( mHard[(int)c] == ST_EOS ) + { + return true; + } + return false; + } + + void SetQuoteChar(char c) + { + mQuoteChar = c; + } + +private: + + + inline char * AddHard(int &argc,const char **argv,char *foo); + inline bool IsHard(char c); + inline char * SkipSpaces(char *foo); + inline bool IsWhiteSpace(char c); + inline bool IsNonSeparator(char c); // non seperator,neither hard nor soft + + bool mMyAlloc; // whether or not *I* allocated the buffer and am responsible for deleting it. + char *mData; // ascii data to parse. + int mLen; // length of data + SeparatorType mHard[256]; + char mHardString[256*2]; + char mQuoteChar; +}; + +/*******************************************************************/ +/******************** InParser.cpp ********************************/ +/*******************************************************************/ +void InPlaceParser::SetFile(const char *fname) +{ + if ( mMyAlloc ) + { + free(mData); + } + mData = 0; + mLen = 0; + mMyAlloc = false; + + + FILE *fph = fopen(fname,"rb"); + if ( fph ) + { + fseek(fph,0L,SEEK_END); + mLen = ftell(fph); + fseek(fph,0L,SEEK_SET); + if ( mLen ) + { + mData = (char *) malloc(sizeof(char)*(mLen+1)); + int ok = fread(mData, mLen, 1, fph); + if ( !ok ) + { + free(mData); + mData = 0; + } + else + { + mData[mLen] = 0; // zero byte terminate end of file marker. + mMyAlloc = true; + } + } + fclose(fph); + } +} + +InPlaceParser::~InPlaceParser(void) +{ + if ( mMyAlloc ) + { + free(mData); + } +} + +#define MAXARGS 512 + +bool InPlaceParser::IsHard(char c) +{ + return mHard[(int)c] == ST_HARD; +} + +char * InPlaceParser::AddHard(int &argc,const char **argv,char *foo) +{ + while ( IsHard(*foo) ) + { + const char *hard = &mHardString[*foo*2]; + if ( argc < MAXARGS ) + { + argv[argc++] = hard; + } + foo++; + } + return foo; +} + +bool InPlaceParser::IsWhiteSpace(char c) +{ + return mHard[(int)c] == ST_SOFT; +} + +char * InPlaceParser::SkipSpaces(char *foo) +{ + while ( !EOS(*foo) && IsWhiteSpace(*foo) ) foo++; + return foo; +} + +bool InPlaceParser::IsNonSeparator(char c) +{ + if ( !IsHard(c) && !IsWhiteSpace(c) && c != 0 ) return true; + return false; +} + + +int InPlaceParser::ProcessLine(int lineno,char *line,InPlaceParserInterface *callback) +{ + int ret = 0; + + const char *argv[MAXARGS]; + int argc = 0; + + char *foo = line; + + while ( !EOS(*foo) && argc < MAXARGS ) + { + + foo = SkipSpaces(foo); // skip any leading spaces + + if ( EOS(*foo) ) break; + + if ( *foo == mQuoteChar ) // if it is an open quote + { + foo++; + if ( argc < MAXARGS ) + { + argv[argc++] = foo; + } + while ( !EOS(*foo) && *foo != mQuoteChar ) foo++; + if ( !EOS(*foo) ) + { + *foo = 0; // replace close quote with zero byte EOS + foo++; + } + } + else + { + + foo = AddHard(argc,argv,foo); // add any hard separators, skip any spaces + + if ( IsNonSeparator(*foo) ) // add non-hard argument. + { + bool quote = false; + if ( *foo == mQuoteChar ) + { + foo++; + quote = true; + } + + if ( argc < MAXARGS ) + { + argv[argc++] = foo; + } + + if ( quote ) + { + while (*foo && *foo != mQuoteChar ) foo++; + if ( *foo ) *foo = 32; + } + + // continue..until we hit an eos .. + while ( !EOS(*foo) ) // until we hit EOS + { + if ( IsWhiteSpace(*foo) ) // if we hit a space, stomp a zero byte, and exit + { + *foo = 0; + foo++; + break; + } + else if ( IsHard(*foo) ) // if we hit a hard separator, stomp a zero byte and store the hard separator argument + { + const char *hard = &mHardString[*foo*2]; + *foo = 0; + if ( argc < MAXARGS ) + { + argv[argc++] = hard; + } + foo++; + break; + } + foo++; + } // end of while loop... + } + } + } + + if ( argc ) + { + ret = callback->ParseLine(lineno, argc, argv ); + } + + return ret; +} + +int InPlaceParser::Parse(InPlaceParserInterface *callback) // returns true if entire file was parsed, false if it aborted for some reason +{ + assert( callback ); + if ( !mData ) return 0; + + int ret = 0; + + int lineno = 0; + + char *foo = mData; + char *begin = foo; + + + while ( *foo ) + { + if ( *foo == 10 || *foo == 13 ) + { + lineno++; + *foo = 0; + + if ( *begin ) // if there is any data to parse at all... + { + int v = ProcessLine(lineno,begin,callback); + if ( v ) ret = v; + } + + foo++; + if ( *foo == 10 ) foo++; // skip line feed, if it is in the carraige-return line-feed format... + begin = foo; + } + else + { + foo++; + } + } + + lineno++; // lasst line. + + int v = ProcessLine(lineno,begin,callback); + if ( v ) ret = v; + return ret; +} + + +void InPlaceParser::DefaultSymbols(void) +{ + SetHardSeparator(','); + SetHardSeparator('('); + SetHardSeparator(')'); + SetHardSeparator('='); + SetHardSeparator('['); + SetHardSeparator(']'); + SetHardSeparator('{'); + SetHardSeparator('}'); + SetCommentSymbol('#'); +} + + +const char ** InPlaceParser::GetArglist(char *line,int &count) // convert source string into an arg list, this is a destructive parse. +{ + const char **ret = 0; + + static const char *argv[MAXARGS]; + int argc = 0; + + char *foo = line; + + while ( !EOS(*foo) && argc < MAXARGS ) + { + + foo = SkipSpaces(foo); // skip any leading spaces + + if ( EOS(*foo) ) break; + + if ( *foo == mQuoteChar ) // if it is an open quote + { + foo++; + if ( argc < MAXARGS ) + { + argv[argc++] = foo; + } + while ( !EOS(*foo) && *foo != mQuoteChar ) foo++; + if ( !EOS(*foo) ) + { + *foo = 0; // replace close quote with zero byte EOS + foo++; + } + } + else + { + + foo = AddHard(argc,argv,foo); // add any hard separators, skip any spaces + + if ( IsNonSeparator(*foo) ) // add non-hard argument. + { + bool quote = false; + if ( *foo == mQuoteChar ) + { + foo++; + quote = true; + } + + if ( argc < MAXARGS ) + { + argv[argc++] = foo; + } + + if ( quote ) + { + while (*foo && *foo != mQuoteChar ) foo++; + if ( *foo ) *foo = 32; + } + + // continue..until we hit an eos .. + while ( !EOS(*foo) ) // until we hit EOS + { + if ( IsWhiteSpace(*foo) ) // if we hit a space, stomp a zero byte, and exit + { + *foo = 0; + foo++; + break; + } + else if ( IsHard(*foo) ) // if we hit a hard separator, stomp a zero byte and store the hard separator argument + { + const char *hard = &mHardString[*foo*2]; + *foo = 0; + if ( argc < MAXARGS ) + { + argv[argc++] = hard; + } + foo++; + break; + } + foo++; + } // end of while loop... + } + } + } + + count = argc; + if ( argc ) + { + ret = argv; + } + + return ret; +} + +/*******************************************************************/ +/******************** Geometry.h ********************************/ +/*******************************************************************/ + +class GeometryVertex +{ +public: + float mPos[3]; + float mNormal[3]; + float mTexel[2]; +}; + + +class GeometryInterface +{ +public: + + virtual void NodeTriangle(const GeometryVertex *v1,const GeometryVertex *v2,const GeometryVertex *v3) {} + + virtual ~GeometryInterface () {} +}; + + +/*******************************************************************/ +/******************** Obj.h ********************************/ +/*******************************************************************/ + + +class OBJ : public InPlaceParserInterface +{ +public: + int LoadMesh(const char *fname,GeometryInterface *callback); + int ParseLine(int lineno,int argc,const char **argv); // return TRUE to continue parsing, return FALSE to abort parsing process +private: + + void getVertex(GeometryVertex &v,const char *face) const; + + FloatVector mVerts; + FloatVector mTexels; + FloatVector mNormals; + + GeometryInterface *mCallback; +}; + + +/*******************************************************************/ +/******************** Obj.cpp ********************************/ +/*******************************************************************/ + +int OBJ::LoadMesh(const char *fname,GeometryInterface *iface) +{ + int ret = 0; + + mVerts.clear(); + mTexels.clear(); + mNormals.clear(); + + mCallback = iface; + + InPlaceParser ipp(fname); + + ipp.Parse(this); + + + return ret; +} + +static const char * GetArg(const char **argv,int i,int argc) +{ + const char * ret = 0; + if ( i < argc ) ret = argv[i]; + return ret; +} + +void OBJ::getVertex(GeometryVertex &v,const char *face) const +{ + v.mPos[0] = 0; + v.mPos[1] = 0; + v.mPos[2] = 0; + + v.mTexel[0] = 0; + v.mTexel[1] = 0; + + v.mNormal[0] = 0; + v.mNormal[1] = 1; + v.mNormal[2] = 0; + + int index = atoi( face )-1; + + const char *texel = strstr(face,"/"); + + if ( texel ) + { + int tindex = atoi( texel+1) - 1; + + if ( tindex >=0 && tindex < (int)(mTexels.size()/2) ) + { + const float *t = &mTexels[tindex*2]; + + v.mTexel[0] = t[0]; + v.mTexel[1] = t[1]; + + } + + const char *normal = strstr(texel+1,"/"); + if ( normal ) + { + int nindex = atoi( normal+1 ) - 1; + + if (nindex >= 0 && nindex < (int)(mNormals.size()/3) ) + { + const float *n = &mNormals[nindex*3]; + + v.mNormal[0] = n[0]; + v.mNormal[1] = n[1]; + v.mNormal[2] = n[2]; + } + } + } + + if ( index >= 0 && index < (int)(mVerts.size()/3) ) + { + + const float *p = &mVerts[index*3]; + + v.mPos[0] = p[0]; + v.mPos[1] = p[1]; + v.mPos[2] = p[2]; + } + +} + +int OBJ::ParseLine(int lineno,int argc,const char **argv) // return TRUE to continue parsing, return FALSE to abort parsing process +{ + int ret = 0; + + if ( argc >= 1 ) + { + const char *foo = argv[0]; + if ( *foo != '#' ) + { + if ( strcmp(argv[0],"v") == 0 && argc == 4 ) + + //if ( stricmp(argv[0],"v") == 0 && argc == 4 ) + { + float vx = (float) atof( argv[1] ); + float vy = (float) atof( argv[2] ); + float vz = (float) atof( argv[3] ); + mVerts.push_back(vx); + mVerts.push_back(vy); + mVerts.push_back(vz); + } + else if ( strcmp(argv[0],"vt") == 0 && argc == 3 ) + + // else if ( stricmp(argv[0],"vt") == 0 && argc == 3 ) + { + float tx = (float) atof( argv[1] ); + float ty = (float) atof( argv[2] ); + mTexels.push_back(tx); + mTexels.push_back(ty); + } + // else if ( stricmp(argv[0],"vn") == 0 && argc == 4 ) + + else if ( strcmp(argv[0],"vn") == 0 && argc == 4 ) + { + float normalx = (float) atof(argv[1]); + float normaly = (float) atof(argv[2]); + float normalz = (float) atof(argv[3]); + mNormals.push_back(normalx); + mNormals.push_back(normaly); + mNormals.push_back(normalz); + } +// else if ( stricmp(argv[0],"f") == 0 && argc >= 4 ) + + else if ( strcmp(argv[0],"f") == 0 && argc >= 4 ) + { + GeometryVertex v[32]; + + int vcount = argc-1; + + for (int i=1; i p1( v[0].mPos ); + Vector3d p2( v[1].mPos ); + Vector3d p3( v[2].mPos ); + + Vector3d n; + n.ComputeNormal(p3,p2,p1); + + for (int i=0; iNodeTriangle(&v[0],&v[1],&v[2]); + + if ( vcount >=3 ) // do the fan + { + for (int i=2; i<(vcount-1); i++) + { + mCallback->NodeTriangle(&v[0],&v[i],&v[i+1]); + } + } + + } + } + } + + return ret; +} + + + + +class BuildMesh : public GeometryInterface +{ +public: + + int getIndex(const float *p) + { + + int vcount = mVertices.size()/3; + + if(vcount>0) + { + //New MS STL library checks indices in debug build, so zero causes an assert if it is empty. + const float *v = &mVertices[0]; + + for (int i=0; imPos) ); + mIndices.push_back( getIndex(v2->mPos) ); + mIndices.push_back( getIndex(v3->mPos) ); + } + + const FloatVector& GetVertices(void) const { return mVertices; }; + const IntVector& GetIndices(void) const { return mIndices; }; + +private: + FloatVector mVertices; + IntVector mIndices; +}; + + +WavefrontObj::WavefrontObj(void) +{ + mVertexCount = 0; + mTriCount = 0; + mIndices = 0; + mVertices = 0; +} + +WavefrontObj::~WavefrontObj(void) +{ + delete [] mIndices; + delete [] mVertices; +} + +unsigned int WavefrontObj::loadObj(const char *fname) // load a wavefront obj returns number of triangles that were loaded. Data is persists until the class is destructed. +{ + + unsigned int ret = 0; + + delete [] mVertices; + mVertices = 0; + delete [] mIndices; + mIndices = 0; + mVertexCount = 0; + mTriCount = 0; + + + BuildMesh bm; + + OBJ obj; + + obj.LoadMesh(fname,&bm); + + + const FloatVector &vlist = bm.GetVertices(); + const IntVector &indices = bm.GetIndices(); + if ( vlist.size() ) + { + mVertexCount = vlist.size()/3; + mVertices = new float[mVertexCount*3]; + memcpy( mVertices, &vlist[0], sizeof(float)*mVertexCount*3 ); + mTriCount = indices.size()/3; + mIndices = new int[mTriCount*3*sizeof(int)]; + memcpy(mIndices, &indices[0], sizeof(int)*mTriCount*3); + ret = mTriCount; + } + + + return ret; +} + +} diff --git a/BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/cd_wavefront.h b/BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/cd_wavefront.h new file mode 100644 index 00000000..ba5f90bd --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/cd_wavefront.h @@ -0,0 +1,62 @@ +#ifndef CD_WAVEFRONT_OBJ_H + + +#define CD_WAVEFRONT_OBJ_H + + +/*---------------------------------------------------------------------- + Copyright (c) 2004 Open Dynamics Framework Group + www.physicstools.org + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, are permitted provided + that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + Neither the name of the Open Dynamics Framework Group nor the names of its contributors may + be used to endorse or promote products derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-----------------------------------------------------------------------*/ + +// http://codesuppository.blogspot.com +// +// mailto: jratcliff@infiniplex.net +// +// http://www.amillionpixels.us +// + + +namespace ConvexDecomposition +{ + +class WavefrontObj +{ +public: + + WavefrontObj(void); + ~WavefrontObj(void); + + unsigned int loadObj(const char *fname); // load a wavefront obj returns number of triangles that were loaded. Data is persists until the class is destructed. + + int mVertexCount; + int mTriCount; + int *mIndices; + float *mVertices; +}; + +} + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/concavity.cpp b/BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/concavity.cpp new file mode 100644 index 00000000..f1a46600 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/concavity.cpp @@ -0,0 +1,795 @@ +#include "float_math.h" +#include +#include +#include +#include + +#include + +/*---------------------------------------------------------------------- + Copyright (c) 2004 Open Dynamics Framework Group + www.physicstools.org + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, are permitted provided + that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + Neither the name of the Open Dynamics Framework Group nor the names of its contributors may + be used to endorse or promote products derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-----------------------------------------------------------------------*/ + +// http://codesuppository.blogspot.com +// +// mailto: jratcliff@infiniplex.net +// +// http://www.amillionpixels.us +// + +#include "concavity.h" +#include "raytri.h" +#include "bestfit.h" +#include "cd_hull.h" +#include "meshvolume.h" +#include "cd_vector.h" +#include "splitplane.h" +#include "ConvexDecomposition.h" + + +#define WSCALE 4 +#define CONCAVE_THRESH 0.05f + +namespace ConvexDecomposition +{ + +unsigned int getDebugColor(void) +{ + static unsigned int colors[8] = + { + 0xFF0000, + 0x00FF00, + 0x0000FF, + 0xFFFF00, + 0x00FFFF, + 0xFF00FF, + 0xFFFFFF, + 0xFF8040 + }; + + static int count = 0; + + count++; + + if ( count == 8 ) count = 0; + + assert( count >= 0 && count < 8 ); + + unsigned int color = colors[count]; + + return color; + +} + +class Wpoint +{ +public: + Wpoint(const Vector3d &p,float w) + { + mPoint = p; + mWeight = w; + } + + Vector3d mPoint; + float mWeight; +}; + +typedef std::vector< Wpoint > WpointVector; + + +static inline float DistToPt(const float *p,const float *plane) +{ + float x = p[0]; + float y = p[1]; + float z = p[2]; + float d = x*plane[0] + y*plane[1] + z*plane[2] + plane[3]; + return d; +} + + +static void intersect(const float *p1,const float *p2,float *split,const float *plane) +{ + + float dp1 = DistToPt(p1,plane); + + float dir[3]; + + dir[0] = p2[0] - p1[0]; + dir[1] = p2[1] - p1[1]; + dir[2] = p2[2] - p1[2]; + + float dot1 = dir[0]*plane[0] + dir[1]*plane[1] + dir[2]*plane[2]; + float dot2 = dp1 - plane[3]; + + float t = -(plane[3] + dot2 ) / dot1; + + split[0] = (dir[0]*t)+p1[0]; + split[1] = (dir[1]*t)+p1[1]; + split[2] = (dir[2]*t)+p1[2]; +} + + +class CTri +{ +public: + CTri(void) { }; + + CTri(const float *p1,const float *p2,const float *p3,unsigned int i1,unsigned int i2,unsigned int i3) + { + mProcessed = 0; + mI1 = i1; + mI2 = i2; + mI3 = i3; + + mP1.Set(p1); + mP2.Set(p2); + mP3.Set(p3); + + mPlaneD = mNormal.ComputePlane(mP1,mP2,mP3); + } + + float Facing(const CTri &t) + { + float d = mNormal.Dot(t.mNormal); + return d; + } + + // clip this line segment against this triangle. + bool clip(const Vector3d &start,Vector3d &end) const + { + Vector3d sect; + + bool hit = lineIntersectsTriangle(start.Ptr(), end.Ptr(), mP1.Ptr(), mP2.Ptr(), mP3.Ptr(), sect.Ptr() ); + + if ( hit ) + { + end = sect; + } + return hit; + } + + bool Concave(const Vector3d &p,float &distance,Vector3d &n) const + { + n.NearestPointInTriangle(p,mP1,mP2,mP3); + distance = p.Distance(n); + return true; + } + + void addTri(unsigned int *indices,unsigned int i1,unsigned int i2,unsigned int i3,unsigned int &tcount) const + { + indices[tcount*3+0] = i1; + indices[tcount*3+1] = i2; + indices[tcount*3+2] = i3; + tcount++; + } + + float getVolume(ConvexDecompInterface *callback) const + { + unsigned int indices[8*3]; + + + unsigned int tcount = 0; + + addTri(indices,0,1,2,tcount); + addTri(indices,3,4,5,tcount); + + addTri(indices,0,3,4,tcount); + addTri(indices,0,4,1,tcount); + + addTri(indices,1,4,5,tcount); + addTri(indices,1,5,2,tcount); + + addTri(indices,0,3,5,tcount); + addTri(indices,0,5,2,tcount); + + const float *vertices = mP1.Ptr(); + + if ( callback ) + { + unsigned int color = getDebugColor(); + +#if 0 + Vector3d d1 = mNear1; + Vector3d d2 = mNear2; + Vector3d d3 = mNear3; + + callback->ConvexDebugPoint(mP1.Ptr(),0.01f,0x00FF00); + callback->ConvexDebugPoint(mP2.Ptr(),0.01f,0x00FF00); + callback->ConvexDebugPoint(mP3.Ptr(),0.01f,0x00FF00); + callback->ConvexDebugPoint(d1.Ptr(),0.01f,0xFF0000); + callback->ConvexDebugPoint(d2.Ptr(),0.01f,0xFF0000); + callback->ConvexDebugPoint(d3.Ptr(),0.01f,0xFF0000); + + callback->ConvexDebugTri(mP1.Ptr(), d1.Ptr(), d1.Ptr(),0x00FF00); + callback->ConvexDebugTri(mP2.Ptr(), d2.Ptr(), d2.Ptr(),0x00FF00); + callback->ConvexDebugTri(mP3.Ptr(), d3.Ptr(), d3.Ptr(),0x00FF00); + +#else + for (unsigned int i=0; iConvexDebugTri(p1,p2,p3,color); + + } +#endif + } + + float v = computeMeshVolume(mP1.Ptr(), tcount, indices ); + + return v; + + } + + float raySect(const Vector3d &p,const Vector3d &dir,Vector3d §) const + { + float plane[4]; + + plane[0] = mNormal.x; + plane[1] = mNormal.y; + plane[2] = mNormal.z; + plane[3] = mPlaneD; + + Vector3d dest = p+dir*100000; + + intersect( p.Ptr(), dest.Ptr(), sect.Ptr(), plane ); + + return sect.Distance(p); // return the intersection distance. + + } + + float planeDistance(const Vector3d &p) const + { + float plane[4]; + + plane[0] = mNormal.x; + plane[1] = mNormal.y; + plane[2] = mNormal.z; + plane[3] = mPlaneD; + + return DistToPt( p.Ptr(), plane ); + + } + + bool samePlane(const CTri &t) const + { + const float THRESH = 0.001f; + float dd = fabsf( t.mPlaneD - mPlaneD ); + if ( dd > THRESH ) return false; + dd = fabsf( t.mNormal.x - mNormal.x ); + if ( dd > THRESH ) return false; + dd = fabsf( t.mNormal.y - mNormal.y ); + if ( dd > THRESH ) return false; + dd = fabsf( t.mNormal.z - mNormal.z ); + if ( dd > THRESH ) return false; + return true; + } + + bool hasIndex(unsigned int i) const + { + if ( i == mI1 || i == mI2 || i == mI3 ) return true; + return false; + } + + bool sharesEdge(const CTri &t) const + { + bool ret = false; + unsigned int count = 0; + + if ( t.hasIndex(mI1) ) count++; + if ( t.hasIndex(mI2) ) count++; + if ( t.hasIndex(mI3) ) count++; + + if ( count >= 2 ) ret = true; + + return ret; + } + + void debug(unsigned int color,ConvexDecompInterface *callback) + { + callback->ConvexDebugTri( mP1.Ptr(), mP2.Ptr(), mP3.Ptr(), color ); + callback->ConvexDebugTri( mP1.Ptr(), mP1.Ptr(), mNear1.Ptr(), 0xFF0000 ); + callback->ConvexDebugTri( mP2.Ptr(), mP2.Ptr(), mNear2.Ptr(), 0xFF0000 ); + callback->ConvexDebugTri( mP2.Ptr(), mP3.Ptr(), mNear3.Ptr(), 0xFF0000 ); + callback->ConvexDebugPoint( mNear1.Ptr(), 0.01f, 0xFF0000 ); + callback->ConvexDebugPoint( mNear2.Ptr(), 0.01f, 0xFF0000 ); + callback->ConvexDebugPoint( mNear3.Ptr(), 0.01f, 0xFF0000 ); + } + + float area(void) + { + float a = mConcavity*mP1.Area(mP2,mP3); + return a; + } + + void addWeighted(WpointVector &list,ConvexDecompInterface *callback) + { + + Wpoint p1(mP1,mC1); + Wpoint p2(mP2,mC2); + Wpoint p3(mP3,mC3); + + Vector3d d1 = mNear1 - mP1; + Vector3d d2 = mNear2 - mP2; + Vector3d d3 = mNear3 - mP3; + + d1*=WSCALE; + d2*=WSCALE; + d3*=WSCALE; + + d1 = d1 + mP1; + d2 = d2 + mP2; + d3 = d3 + mP3; + + Wpoint p4(d1,mC1); + Wpoint p5(d2,mC2); + Wpoint p6(d3,mC3); + + list.push_back(p1); + list.push_back(p2); + list.push_back(p3); + + list.push_back(p4); + list.push_back(p5); + list.push_back(p6); + +#if 0 + callback->ConvexDebugPoint(mP1.Ptr(),0.01f,0x00FF00); + callback->ConvexDebugPoint(mP2.Ptr(),0.01f,0x00FF00); + callback->ConvexDebugPoint(mP3.Ptr(),0.01f,0x00FF00); + callback->ConvexDebugPoint(d1.Ptr(),0.01f,0xFF0000); + callback->ConvexDebugPoint(d2.Ptr(),0.01f,0xFF0000); + callback->ConvexDebugPoint(d3.Ptr(),0.01f,0xFF0000); + + callback->ConvexDebugTri(mP1.Ptr(), d1.Ptr(), d1.Ptr(),0x00FF00); + callback->ConvexDebugTri(mP2.Ptr(), d2.Ptr(), d2.Ptr(),0x00FF00); + callback->ConvexDebugTri(mP3.Ptr(), d3.Ptr(), d3.Ptr(),0x00FF00); + + Vector3d np1 = mP1 + mNormal*0.05f; + Vector3d np2 = mP2 + mNormal*0.05f; + Vector3d np3 = mP3 + mNormal*0.05f; + + callback->ConvexDebugTri(mP1.Ptr(), np1.Ptr(), np1.Ptr(), 0xFF00FF ); + callback->ConvexDebugTri(mP2.Ptr(), np2.Ptr(), np2.Ptr(), 0xFF00FF ); + callback->ConvexDebugTri(mP3.Ptr(), np3.Ptr(), np3.Ptr(), 0xFF00FF ); + + callback->ConvexDebugPoint( np1.Ptr(), 0.01F, 0XFF00FF ); + callback->ConvexDebugPoint( np2.Ptr(), 0.01F, 0XFF00FF ); + callback->ConvexDebugPoint( np3.Ptr(), 0.01F, 0XFF00FF ); + +#endif + + + + } + + Vector3d mP1; + Vector3d mP2; + Vector3d mP3; + Vector3d mNear1; + Vector3d mNear2; + Vector3d mNear3; + Vector3d mNormal; + float mPlaneD; + float mConcavity; + float mC1; + float mC2; + float mC3; + unsigned int mI1; + unsigned int mI2; + unsigned int mI3; + int mProcessed; // already been added... +}; + +typedef std::vector< CTri > CTriVector; + +bool featureMatch(CTri &m,const CTriVector &tris,ConvexDecompInterface *callback,const CTriVector &input_mesh) +{ + + bool ret = false; + + float neardot = 0.707f; + + m.mConcavity = 0; + + //gLog->Display("*********** FEATURE MATCH *************\r\n"); + //gLog->Display("Plane: %0.4f,%0.4f,%0.4f %0.4f\r\n", m.mNormal.x, m.mNormal.y, m.mNormal.z, m.mPlaneD ); + //gLog->Display("*********************************************\r\n"); + + CTriVector::const_iterator i; + + CTri nearest; + + + for (i=tris.begin(); i!=tris.end(); ++i) + { + const CTri &t = (*i); + + + //gLog->Display(" HullPlane: %0.4f,%0.4f,%0.4f %0.4f\r\n", t.mNormal.x, t.mNormal.y, t.mNormal.z, t.mPlaneD ); + + if ( t.samePlane(m) ) + { + //gLog->Display("*** PLANE MATCH!!!\r\n"); + ret = false; + break; + } + + float dot = t.mNormal.Dot(m.mNormal); + + if ( dot > neardot ) + { + + float d1 = t.planeDistance( m.mP1 ); + float d2 = t.planeDistance( m.mP2 ); + float d3 = t.planeDistance( m.mP3 ); + + if ( d1 > 0.001f || d2 > 0.001f || d3 > 0.001f ) // can't be near coplaner! + { + + neardot = dot; + + Vector3d n1,n2,n3; + + t.raySect( m.mP1, m.mNormal, m.mNear1 ); + t.raySect( m.mP2, m.mNormal, m.mNear2 ); + t.raySect( m.mP3, m.mNormal, m.mNear3 ); + + nearest = t; + + ret = true; + } + + } + } + + if ( ret ) + { + if ( 0 ) + { + CTriVector::const_iterator i; + for (i=input_mesh.begin(); i!=input_mesh.end(); ++i) + { + const CTri &c = (*i); + if ( c.mI1 != m.mI1 && c.mI2 != m.mI2 && c.mI3 != m.mI3 ) + { + c.clip( m.mP1, m.mNear1 ); + c.clip( m.mP2, m.mNear2 ); + c.clip( m.mP3, m.mNear3 ); + } + } + } + + //gLog->Display("*********************************************\r\n"); + //gLog->Display(" HullPlaneNearest: %0.4f,%0.4f,%0.4f %0.4f\r\n", nearest.mNormal.x, nearest.mNormal.y, nearest.mNormal.z, nearest.mPlaneD ); + + m.mC1 = m.mP1.Distance( m.mNear1 ); + m.mC2 = m.mP2.Distance( m.mNear2 ); + m.mC3 = m.mP3.Distance( m.mNear3 ); + + m.mConcavity = m.mC1; + + if ( m.mC2 > m.mConcavity ) m.mConcavity = m.mC2; + if ( m.mC3 > m.mConcavity ) m.mConcavity = m.mC3; + + #if 0 + callback->ConvexDebugTri( m.mP1.Ptr(), m.mP2.Ptr(), m.mP3.Ptr(), 0x00FF00 ); + callback->ConvexDebugTri( m.mNear1.Ptr(), m.mNear2.Ptr(), m.mNear3.Ptr(), 0xFF0000 ); + + callback->ConvexDebugTri( m.mP1.Ptr(), m.mP1.Ptr(), m.mNear1.Ptr(), 0xFFFF00 ); + callback->ConvexDebugTri( m.mP2.Ptr(), m.mP2.Ptr(), m.mNear2.Ptr(), 0xFFFF00 ); + callback->ConvexDebugTri( m.mP3.Ptr(), m.mP3.Ptr(), m.mNear3.Ptr(), 0xFFFF00 ); + #endif + + } + else + { + //gLog->Display("No match\r\n"); + } + + //gLog->Display("*********************************************\r\n"); + return ret; +} + +bool isFeatureTri(CTri &t,CTriVector &flist,float fc,ConvexDecompInterface *callback,unsigned int color) +{ + bool ret = false; + + if ( t.mProcessed == 0 ) // if not already processed + { + + float c = t.mConcavity / fc; // must be within 80% of the concavity of the parent. + + if ( c > 0.85f ) + { + // see if this triangle is a 'feature' triangle. Meaning it shares an + // edge with any existing feature triangle and is within roughly the same + // concavity of the parent. + if ( flist.size() ) + { + CTriVector::iterator i; + for (i=flist.begin(); i!=flist.end(); ++i) + { + CTri &ftri = (*i); + if ( ftri.sharesEdge(t) ) + { + t.mProcessed = 2; // it is now part of a feature. + flist.push_back(t); // add it to the feature list. +// callback->ConvexDebugTri( t.mP1.Ptr(), t.mP2.Ptr(),t.mP3.Ptr(), color ); + ret = true; + break; + } + } + } + else + { + t.mProcessed = 2; + flist.push_back(t); // add it to the feature list. +// callback->ConvexDebugTri( t.mP1.Ptr(), t.mP2.Ptr(),t.mP3.Ptr(), color ); + ret = true; + } + } + else + { + t.mProcessed = 1; // eliminated for this feature, but might be valid for the next one.. + } + + } + return ret; +} + +float computeConcavity(unsigned int vcount, + const float *vertices, + unsigned int tcount, + const unsigned int *indices, + ConvexDecompInterface *callback, + float *plane, // plane equation to split on + float &volume) +{ + + + float cret = 0; + volume = 1; + + HullResult result; + HullLibrary hl; + HullDesc desc; + + desc.mMaxFaces = 256; + desc.mMaxVertices = 256; + desc.SetHullFlag(QF_TRIANGLES); + + + desc.mVcount = vcount; + desc.mVertices = vertices; + desc.mVertexStride = sizeof(float)*3; + + HullError ret = hl.CreateConvexHull(desc,result); + + if ( ret == QE_OK ) + { +#if 0 + float bmin[3]; + float bmax[3]; + + float dx = bmax[0] - bmin[0]; + float dy = bmax[1] - bmin[1]; + float dz = bmax[2] - bmin[2]; + + Vector3d center; + + center.x = bmin[0] + dx*0.5f; + center.y = bmin[1] + dy*0.5f; + center.z = bmin[2] + dz*0.5f; +#endif + + volume = computeMeshVolume2( result.mOutputVertices, result.mNumFaces, result.mIndices ); + +#if 1 + // ok..now..for each triangle on the original mesh.. + // we extrude the points to the nearest point on the hull. + const unsigned int *source = result.mIndices; + + CTriVector tris; + + for (unsigned int i=0; iConvexDebugTri(p1,p2,p3,0xFFFFFF); + + CTri t(p1,p2,p3,i1,i2,i3); // + tris.push_back(t); + } + + // we have not pre-computed the plane equation for each triangle in the convex hull.. + + float totalVolume = 0; + + CTriVector ftris; // 'feature' triangles. + + const unsigned int *src = indices; + + + float maxc=0; + + + if ( 1 ) + { + CTriVector input_mesh; + if ( 1 ) + { + const unsigned int *src = indices; + for (unsigned int i=0; i CONCAVE_THRESH ) + { + + if ( t.mConcavity > maxc ) + { + maxc = t.mConcavity; + maxctri = t; + } + + float v = t.getVolume(0); + totalVolume+=v; + ftris.push_back(t); + } + + } + } + + if ( ftris.size() && 0 ) + { + + // ok..now we extract the triangles which form the maximum concavity. + CTriVector major_feature; + float maxarea = 0; + + while ( maxc > CONCAVE_THRESH ) + { + + unsigned int color = getDebugColor(); // + + CTriVector flist; + + bool found; + + float totalarea = 0; + + do + { + found = false; + CTriVector::iterator i; + for (i=ftris.begin(); i!=ftris.end(); ++i) + { + CTri &t = (*i); + if ( isFeatureTri(t,flist,maxc,callback,color) ) + { + found = true; + totalarea+=t.area(); + } + } + } while ( found ); + + + if ( totalarea > maxarea ) + { + major_feature = flist; + maxarea = totalarea; + } + + maxc = 0; + + for (unsigned int i=0; i maxc ) + { + maxc = t.mConcavity; + } + } + } + } + + unsigned int color = getDebugColor(); + + WpointVector list; + for (unsigned int i=0; i +#include +#include +#include +#include + +#include "fitsphere.h" + + +/*---------------------------------------------------------------------- + Copyright (c) 2004 Open Dynamics Framework Group + www.physicstools.org + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, are permitted provided + that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + Neither the name of the Open Dynamics Framework Group nor the names of its contributors may + be used to endorse or promote products derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-----------------------------------------------------------------------*/ + +// http://codesuppository.blogspot.com +// +// mailto: jratcliff@infiniplex.net +// +// http://www.amillionpixels.us +// +/* +An Efficient Bounding Sphere +by Jack Ritter +from "Graphics Gems", Academic Press, 1990 +*/ + +/* Routine to calculate tight bounding sphere over */ +/* a set of points in 3D */ +/* This contains the routine find_bounding_sphere(), */ +/* the struct definition, and the globals used for parameters. */ +/* The abs() of all coordinates must be < BIGNUMBER */ +/* Code written by Jack Ritter and Lyle Rains. */ + +#define BIGNUMBER 100000000.0 /* hundred million */ + +static inline void Set(float *n,float x,float y,float z) +{ + n[0] = x; + n[1] = y; + n[2] = z; +} + +static inline void Copy(float *dest,const float *source) +{ + dest[0] = source[0]; + dest[1] = source[1]; + dest[2] = source[2]; +} + +float computeBoundingSphere(unsigned int vcount,const float *points,float *center) +{ + + float mRadius; + float mRadius2; + + float xmin[3]; + float xmax[3]; + float ymin[3]; + float ymax[3]; + float zmin[3]; + float zmax[3]; + float dia1[3]; + float dia2[3]; + + /* FIRST PASS: find 6 minima/maxima points */ + Set(xmin,BIGNUMBER,BIGNUMBER,BIGNUMBER); + Set(xmax,-BIGNUMBER,-BIGNUMBER,-BIGNUMBER); + Set(ymin,BIGNUMBER,BIGNUMBER,BIGNUMBER); + Set(ymax,-BIGNUMBER,-BIGNUMBER,-BIGNUMBER); + Set(zmin,BIGNUMBER,BIGNUMBER,BIGNUMBER); + Set(zmax,-BIGNUMBER,-BIGNUMBER,-BIGNUMBER); + + for (unsigned i=0; ixmax[0]) + Copy(xmax,caller_p); + if (caller_p[1]ymax[1]) + Copy(ymax,caller_p); + if (caller_p[2]zmax[2]) + Copy(zmax,caller_p); + } + + /* Set xspan = distance between the 2 points xmin & xmax (squared) */ + float dx = xmax[0] - xmin[0]; + float dy = xmax[1] - xmin[1]; + float dz = xmax[2] - xmin[2]; + float xspan = dx*dx + dy*dy + dz*dz; + + /* Same for y & z spans */ + dx = ymax[0] - ymin[0]; + dy = ymax[1] - ymin[1]; + dz = ymax[2] - ymin[2]; + float yspan = dx*dx + dy*dy + dz*dz; + + dx = zmax[0] - zmin[0]; + dy = zmax[1] - zmin[1]; + dz = zmax[2] - zmin[2]; + float zspan = dx*dx + dy*dy + dz*dz; + + /* Set points dia1 & dia2 to the maximally separated pair */ + Copy(dia1,xmin); + Copy(dia2,xmax); /* assume xspan biggest */ + float maxspan = xspan; + + if (yspan>maxspan) + { + maxspan = yspan; + Copy(dia1,ymin); + Copy(dia2,ymax); + } + + if (zspan>maxspan) + { + Copy(dia1,zmin); + Copy(dia2,zmax); + } + + + /* dia1,dia2 is a diameter of initial sphere */ + /* calc initial center */ + center[0] = (dia1[0]+dia2[0])*0.5f; + center[1] = (dia1[1]+dia2[1])*0.5f; + center[2] = (dia1[2]+dia2[2])*0.5f; + + /* calculate initial radius**2 and radius */ + + dx = dia2[0]-center[0]; /* x component of radius vector */ + dy = dia2[1]-center[1]; /* y component of radius vector */ + dz = dia2[2]-center[2]; /* z component of radius vector */ + + mRadius2 = dx*dx + dy*dy + dz*dz; + mRadius = float(sqrt(mRadius2)); + + /* SECOND PASS: increment current sphere */ + + if ( 1 ) + { + for (unsigned i=0; i mRadius2) /* do r**2 test first */ + { /* this point is outside of current sphere */ + float old_to_p = float(sqrt(old_to_p_sq)); + /* calc radius of new sphere */ + mRadius = (mRadius + old_to_p) * 0.5f; + mRadius2 = mRadius*mRadius; /* for next r**2 compare */ + float old_to_new = old_to_p - mRadius; + + /* calc center of new sphere */ + + float recip = 1.0f /old_to_p; + + float cx = (mRadius*center[0] + old_to_new*caller_p[0]) * recip; + float cy = (mRadius*center[1] + old_to_new*caller_p[1]) * recip; + float cz = (mRadius*center[2] + old_to_new*caller_p[2]) * recip; + + Set(center,cx,cy,cz); + } + } + } + + return mRadius; +} + + diff --git a/BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/fitsphere.h b/BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/fitsphere.h new file mode 100644 index 00000000..cd4a565c --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/fitsphere.h @@ -0,0 +1,43 @@ +#ifndef FIT_SPHERE_H + +#define FIT_SPHERE_H + +/*---------------------------------------------------------------------- + Copyright (c) 2004 Open Dynamics Framework Group + www.physicstools.org + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, are permitted provided + that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + Neither the name of the Open Dynamics Framework Group nor the names of its contributors may + be used to endorse or promote products derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-----------------------------------------------------------------------*/ + +// http://codesuppository.blogspot.com +// +// mailto: jratcliff@infiniplex.net +// +// http://www.amillionpixels.us +// + + + +float computeBoundingSphere(unsigned int vcount,const float *points,float *center); + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/float_math.cpp b/BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/float_math.cpp new file mode 100644 index 00000000..38c699b5 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/float_math.cpp @@ -0,0 +1,257 @@ +#include "float_math.h" + +#include +#include +#include +#include +#include + + +/*---------------------------------------------------------------------- + Copyright (c) 2004 Open Dynamics Framework Group + www.physicstools.org + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, are permitted provided + that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + Neither the name of the Open Dynamics Framework Group nor the names of its contributors may + be used to endorse or promote products derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-----------------------------------------------------------------------*/ + +// http://codesuppository.blogspot.com +// +// mailto: jratcliff@infiniplex.net +// +// http://www.amillionpixels.us +// + +void fm_inverseRT(const float *matrix,const float *pos,float *t) // inverse rotate translate the point. +{ + + float _x = pos[0] - matrix[3*4+0]; + float _y = pos[1] - matrix[3*4+1]; + float _z = pos[2] - matrix[3*4+2]; + + // Multiply inverse-translated source vector by inverted rotation transform + + t[0] = (matrix[0*4+0] * _x) + (matrix[0*4+1] * _y) + (matrix[0*4+2] * _z); + t[1] = (matrix[1*4+0] * _x) + (matrix[1*4+1] * _y) + (matrix[1*4+2] * _z); + t[2] = (matrix[2*4+0] * _x) + (matrix[2*4+1] * _y) + (matrix[2*4+2] * _z); + +} + + +void fm_identity(float *matrix) // set 4x4 matrix to identity. +{ + matrix[0*4+0] = 1; + matrix[1*4+1] = 1; + matrix[2*4+2] = 1; + matrix[3*4+3] = 1; + + matrix[1*4+0] = 0; + matrix[2*4+0] = 0; + matrix[3*4+0] = 0; + + matrix[0*4+1] = 0; + matrix[2*4+1] = 0; + matrix[3*4+1] = 0; + + matrix[0*4+2] = 0; + matrix[1*4+2] = 0; + matrix[3*4+2] = 0; + + matrix[0*4+3] = 0; + matrix[1*4+3] = 0; + matrix[2*4+3] = 0; + +} + +void fm_eulerMatrix(float ax,float ay,float az,float *matrix) // convert euler (in radians) to a dest 4x4 matrix (translation set to zero) +{ + float quat[4]; + fm_eulerToQuat(ax,ay,az,quat); + fm_quatToMatrix(quat,matrix); +} + +void fm_getAABB(unsigned int vcount,const float *points,unsigned int pstride,float *bmin,float *bmax) +{ + + const unsigned char *source = (const unsigned char *) points; + + bmin[0] = points[0]; + bmin[1] = points[1]; + bmin[2] = points[2]; + + bmax[0] = points[0]; + bmax[1] = points[1]; + bmax[2] = points[2]; + + + for (unsigned int i=1; i bmax[0] ) bmax[0] = p[0]; + if ( p[1] > bmax[1] ) bmax[1] = p[1]; + if ( p[2] > bmax[2] ) bmax[2] = p[2]; + + } +} + + +void fm_eulerToQuat(float roll,float pitch,float yaw,float *quat) // convert euler angles to quaternion. +{ + roll *= 0.5f; + pitch *= 0.5f; + yaw *= 0.5f; + + float cr = cosf(roll); + float cp = cosf(pitch); + float cy = cosf(yaw); + + float sr = sinf(roll); + float sp = sinf(pitch); + float sy = sinf(yaw); + + float cpcy = cp * cy; + float spsy = sp * sy; + float spcy = sp * cy; + float cpsy = cp * sy; + + quat[0] = ( sr * cpcy - cr * spsy); + quat[1] = ( cr * spcy + sr * cpsy); + quat[2] = ( cr * cpsy - sr * spcy); + quat[3] = cr * cpcy + sr * spsy; +} + +void fm_quatToMatrix(const float *quat,float *matrix) // convert quaterinion rotation to matrix, zeros out the translation component. +{ + + float xx = quat[0]*quat[0]; + float yy = quat[1]*quat[1]; + float zz = quat[2]*quat[2]; + float xy = quat[0]*quat[1]; + float xz = quat[0]*quat[2]; + float yz = quat[1]*quat[2]; + float wx = quat[3]*quat[0]; + float wy = quat[3]*quat[1]; + float wz = quat[3]*quat[2]; + + matrix[0*4+0] = 1 - 2 * ( yy + zz ); + matrix[1*4+0] = 2 * ( xy - wz ); + matrix[2*4+0] = 2 * ( xz + wy ); + + matrix[0*4+1] = 2 * ( xy + wz ); + matrix[1*4+1] = 1 - 2 * ( xx + zz ); + matrix[2*4+1] = 2 * ( yz - wx ); + + matrix[0*4+2] = 2 * ( xz - wy ); + matrix[1*4+2] = 2 * ( yz + wx ); + matrix[2*4+2] = 1 - 2 * ( xx + yy ); + + matrix[3*4+0] = matrix[3*4+1] = matrix[3*4+2] = 0.0f; + matrix[0*4+3] = matrix[1*4+3] = matrix[2*4+3] = 0.0f; + matrix[3*4+3] = 1.0f; + +} + + +void fm_quatRotate(const float *quat,const float *v,float *r) // rotate a vector directly by a quaternion. +{ + float left[4]; + + left[0] = quat[3]*v[0] + quat[1]*v[2] - v[1]*quat[2]; + left[1] = quat[3]*v[1] + quat[2]*v[0] - v[2]*quat[0]; + left[2] = quat[3]*v[2] + quat[0]*v[1] - v[0]*quat[1]; + left[3] = - quat[0]*v[0] - quat[1]*v[1] - quat[2]*v[2]; + + r[0] = (left[3]*-quat[0]) + (quat[3]*left[0]) + (left[1]*-quat[2]) - (-quat[1]*left[2]); + r[1] = (left[3]*-quat[1]) + (quat[3]*left[1]) + (left[2]*-quat[0]) - (-quat[2]*left[0]); + r[2] = (left[3]*-quat[2]) + (quat[3]*left[2]) + (left[0]*-quat[1]) - (-quat[0]*left[1]); + +} + + +void fm_getTranslation(const float *matrix,float *t) +{ + t[0] = matrix[3*4+0]; + t[1] = matrix[3*4+1]; + t[2] = matrix[3*4+2]; +} + +void fm_matrixToQuat(const float *matrix,float *quat) // convert the 3x3 portion of a 4x4 matrix into a quaterion as x,y,z,w +{ + + float tr = matrix[0*4+0] + matrix[1*4+1] + matrix[2*4+2]; + + // check the diagonal + + if (tr > 0.0f ) + { + float s = (float) sqrt ( (double) (tr + 1.0f) ); + quat[3] = s * 0.5f; + s = 0.5f / s; + quat[0] = (matrix[1*4+2] - matrix[2*4+1]) * s; + quat[1] = (matrix[2*4+0] - matrix[0*4+2]) * s; + quat[2] = (matrix[0*4+1] - matrix[1*4+0]) * s; + + } + else + { + // diagonal is negative + int nxt[3] = {1, 2, 0}; + float qa[4]; + + int i = 0; + + if (matrix[1*4+1] > matrix[0*4+0]) i = 1; + if (matrix[2*4+2] > matrix[i*4+i]) i = 2; + + int j = nxt[i]; + int k = nxt[j]; + + float s = sqrtf ( ((matrix[i*4+i] - (matrix[j*4+j] + matrix[k*4+k])) + 1.0f) ); + + qa[i] = s * 0.5f; + + if (s != 0.0f ) s = 0.5f / s; + + qa[3] = (matrix[j*4+k] - matrix[k*4+j]) * s; + qa[j] = (matrix[i*4+j] + matrix[j*4+i]) * s; + qa[k] = (matrix[i*4+k] + matrix[k*4+i]) * s; + + quat[0] = qa[0]; + quat[1] = qa[1]; + quat[2] = qa[2]; + quat[3] = qa[3]; + } + + +} + + +float fm_sphereVolume(float radius) // return's the volume of a sphere of this radius (4/3 PI * R cubed ) +{ + return (4.0f / 3.0f ) * FM_PI * radius * radius * radius; +} diff --git a/BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/float_math.h b/BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/float_math.h new file mode 100644 index 00000000..e5d6b26b --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/float_math.h @@ -0,0 +1,72 @@ +#ifndef FLOAT_MATH_H + +#define FLOAT_MATH_H + +#ifdef WIN32 + #pragma warning(disable : 4324) // disable padding warning + #pragma warning(disable : 4244) // disable padding warning + #pragma warning(disable : 4267) // possible loss of data + #pragma warning(disable:4530) // Disable the exception disable but used in MSCV Stl warning. + #pragma warning(disable:4996) //Turn off warnings about deprecated C routines + #pragma warning(disable:4786) // Disable the "debug name too long" warning +#endif + +/*---------------------------------------------------------------------- + Copyright (c) 2004 Open Dynamics Framework Group + www.physicstools.org + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, are permitted provided + that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + Neither the name of the Open Dynamics Framework Group nor the names of its contributors may + be used to endorse or promote products derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-----------------------------------------------------------------------*/ + +// http://codesuppository.blogspot.com +// +// mailto: jratcliff@infiniplex.net +// +// http://www.amillionpixels.us +// + + +// a set of routines that last you do common 3d math +// operations without any vector, matrix, or quaternion +// classes or templates. +// +// a vector (or point) is a 'float *' to 3 floating point numbers. +// a matrix is a 'float *' to an array of 16 floating point numbers representing a 4x4 transformation matrix compatible with D3D or OGL +// a quaternion is a 'float *' to 4 floats representing a quaternion x,y,z,w + +const float FM_PI = 3.141592654f; +const float FM_DEG_TO_RAD = ((2.0f * FM_PI) / 360.0f); +const float FM_RAD_TO_DEG = (360.0f / (2.0f * FM_PI)); + +void fm_identity(float *matrix); // set 4x4 matrix to identity. +void fm_inverseRT(const float *matrix,const float *pos,float *t); // inverse rotate translate the point. +void fm_eulerMatrix(float ax,float ay,float az,float *matrix); // convert euler (in radians) to a dest 4x4 matrix (translation set to zero) +void fm_getAABB(unsigned int vcount,const float *points,unsigned int pstride,float *bmin,float *bmax); +void fm_eulerToQuat(float roll,float pitch,float yaw,float *quat); // convert euler angles to quaternion. +void fm_quatToMatrix(const float *quat,float *matrix); // convert quaterinion rotation to matrix, translation set to zero. +void fm_quatRotate(const float *quat,const float *v,float *r); // rotate a vector directly by a quaternion. +void fm_getTranslation(const float *matrix,float *t); +void fm_matrixToQuat(const float *matrix,float *quat); // convert the 3x3 portion of a 4x4 matrix into a quaterion as x,y,z,w +float fm_sphereVolume(float radius); // return's the volume of a sphere of this radius (4/3 PI * R cubed ) + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/meshvolume.cpp b/BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/meshvolume.cpp new file mode 100644 index 00000000..b9dfa174 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/meshvolume.cpp @@ -0,0 +1,128 @@ +#include "float_math.h" +#include "meshvolume.h" + +/*---------------------------------------------------------------------- + Copyright (c) 2004 Open Dynamics Framework Group + www.physicstools.org + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, are permitted provided + that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + Neither the name of the Open Dynamics Framework Group nor the names of its contributors may + be used to endorse or promote products derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-----------------------------------------------------------------------*/ + +// http://codesuppository.blogspot.com +// +// mailto: jratcliff@infiniplex.net +// +// http://www.amillionpixels.us +// + +inline float det(const float *p1,const float *p2,const float *p3) +{ + return p1[0]*p2[1]*p3[2] + p2[0]*p3[1]*p1[2] + p3[0]*p1[1]*p2[2] -p1[0]*p3[1]*p2[2] - p2[0]*p1[1]*p3[2] - p3[0]*p2[1]*p1[2]; +} + +float computeMeshVolume(const float *vertices,unsigned int tcount,const unsigned int *indices) +{ + float volume = 0; + + for (unsigned int i=0; i +#include +#include +#include + +#include "planetri.h" + +/*---------------------------------------------------------------------- + Copyright (c) 2004 Open Dynamics Framework Group + www.physicstools.org + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, are permitted provided + that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + Neither the name of the Open Dynamics Framework Group nor the names of its contributors may + be used to endorse or promote products derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-----------------------------------------------------------------------*/ + +// http://codesuppository.blogspot.com +// +// mailto: jratcliff@infiniplex.net +// +// http://www.amillionpixels.us +// + +static inline float DistToPt(const float *p,const float *plane) +{ + float x = p[0]; + float y = p[1]; + float z = p[2]; + float d = x*plane[0] + y*plane[1] + z*plane[2] + plane[3]; + return d; +} + + +static PlaneTriResult getSidePlane(const float *p,const float *plane,float epsilon) +{ + + float d = DistToPt(p,plane); + + if ( (d+epsilon) > 0 ) + return PTR_FRONT; // it is 'in front' within the provided epsilon value. + + return PTR_BACK; +} + +static void add(const float *p,float *dest,unsigned int tstride,unsigned int &pcount) +{ + char *d = (char *) dest; + d = d + pcount*tstride; + dest = (float *) d; + dest[0] = p[0]; + dest[1] = p[1]; + dest[2] = p[2]; + pcount++; + assert( pcount <= 4 ); +} + + +// assumes that the points are on opposite sides of the plane! +static void intersect(const float *p1,const float *p2,float *split,const float *plane) +{ + + float dp1 = DistToPt(p1,plane); + + float dir[3]; + + dir[0] = p2[0] - p1[0]; + dir[1] = p2[1] - p1[1]; + dir[2] = p2[2] - p1[2]; + + float dot1 = dir[0]*plane[0] + dir[1]*plane[1] + dir[2]*plane[2]; + float dot2 = dp1 - plane[3]; + + float t = -(plane[3] + dot2 ) / dot1; + + split[0] = (dir[0]*t)+p1[0]; + split[1] = (dir[1]*t)+p1[1]; + split[2] = (dir[2]*t)+p1[2]; + +} + +PlaneTriResult planeTriIntersection(const float *plane, // the plane equation in Ax+By+Cz+D format + const float *triangle, // the source triangle. + unsigned int tstride, // stride in bytes of the input and output triangles + float epsilon, // the co-planer epsilon value. + float *front, // the triangle in front of the + unsigned int &fcount, // number of vertices in the 'front' triangle + float *back, // the triangle in back of the plane + unsigned int &bcount) // the number of vertices in the 'back' triangle. +{ + fcount = 0; + bcount = 0; + + const char *tsource = (const char *) triangle; + + // get the three vertices of the triangle. + const float *p1 = (const float *) (tsource); + const float *p2 = (const float *) (tsource+tstride); + const float *p3 = (const float *) (tsource+tstride*2); + + + PlaneTriResult r1 = getSidePlane(p1,plane,epsilon); // compute the side of the plane each vertex is on + PlaneTriResult r2 = getSidePlane(p2,plane,epsilon); + PlaneTriResult r3 = getSidePlane(p3,plane,epsilon); + + if ( r1 == r2 && r1 == r3 ) // if all three vertices are on the same side of the plane. + { + if ( r1 == PTR_FRONT ) // if all three are in front of the plane, then copy to the 'front' output triangle. + { + add(p1,front,tstride,fcount); + add(p2,front,tstride,fcount); + add(p3,front,tstride,fcount); + } + else + { + add(p1,back,tstride,bcount); // if all three are in 'abck' then copy to the 'back' output triangle. + add(p2,back,tstride,bcount); + add(p3,back,tstride,bcount); + } + return r1; // if all three points are on the same side of the plane return result + } + + // ok.. we need to split the triangle at the plane. + + // First test ray segment P1 to P2 + if ( r1 == r2 ) // if these are both on the same side... + { + if ( r1 == PTR_FRONT ) + { + add( p1, front, tstride, fcount ); + add( p2, front, tstride, fcount ); + } + else + { + add( p1, back, tstride, bcount ); + add( p2, back, tstride, bcount ); + } + } + else + { + float split[3]; // split the point + intersect(p1,p2,split,plane); + + if ( r1 == PTR_FRONT ) + { + + add(p1, front, tstride, fcount ); + add(split, front, tstride, fcount ); + + add(split, back, tstride, bcount ); + add(p2, back, tstride, bcount ); + + } + else + { + add(p1, back, tstride, bcount ); + add(split, back, tstride, bcount ); + + add(split, front, tstride, fcount ); + add(p2, front, tstride, fcount ); + } + + } + + // Next test ray segment P2 to P3 + if ( r2 == r3 ) // if these are both on the same side... + { + if ( r3 == PTR_FRONT ) + { + add( p3, front, tstride, fcount ); + } + else + { + add( p3, back, tstride, bcount ); + } + } + else + { + float split[3]; // split the point + intersect(p2,p3,split,plane); + + if ( r3 == PTR_FRONT ) + { + add(split, front, tstride, fcount ); + add(split, back, tstride, bcount ); + + add(p3, front, tstride, fcount ); + } + else + { + add(split, front, tstride, fcount ); + add(split, back, tstride, bcount ); + + add(p3, back, tstride, bcount ); + } + } + + // Next test ray segment P3 to P1 + if ( r3 != r1 ) // if these are both on the same side... + { + float split[3]; // split the point + + intersect(p3,p1,split,plane); + + if ( r1 == PTR_FRONT ) + { + add(split, front, tstride, fcount ); + add(split, back, tstride, bcount ); + } + else + { + add(split, front, tstride, fcount ); + add(split, back, tstride, bcount ); + } + } + + + + return PTR_SPLIT; +} diff --git a/BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/planetri.h b/BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/planetri.h new file mode 100644 index 00000000..780ac854 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/planetri.h @@ -0,0 +1,58 @@ +#ifndef PLANE_TRI_H + +#define PLANE_TRI_H + +/*---------------------------------------------------------------------- + Copyright (c) 2004 Open Dynamics Framework Group + www.physicstools.org + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, are permitted provided + that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + Neither the name of the Open Dynamics Framework Group nor the names of its contributors may + be used to endorse or promote products derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-----------------------------------------------------------------------*/ + +// http://codesuppository.blogspot.com +// +// mailto: jratcliff@infiniplex.net +// +// http://www.amillionpixels.us +// + + + +enum PlaneTriResult +{ + PTR_FRONT, + PTR_BACK, + PTR_SPLIT +}; + +PlaneTriResult planeTriIntersection(const float *plane, // the plane equation in Ax+By+Cz+D format + const float *triangle, // the source position triangle. + unsigned int tstride, // stride in bytes between vertices of the triangle. + float epsilon, // the co-planer epsilon value. + float *front, // the triangle in front of the + unsigned int &fcount, // number of vertices in the 'front' triangle. + float *back, // the triangle in back of the plane + unsigned int &bcount); // the number of vertices in the 'back' triangle. + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/raytri.cpp b/BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/raytri.cpp new file mode 100644 index 00000000..83b076a2 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/raytri.cpp @@ -0,0 +1,134 @@ +#include "float_math.h" +#include +#include +#include +#include +#include + +#include "raytri.h" + +/*---------------------------------------------------------------------- + Copyright (c) 2004 Open Dynamics Framework Group + www.physicstools.org + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, are permitted provided + that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + Neither the name of the Open Dynamics Framework Group nor the names of its contributors may + be used to endorse or promote products derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-----------------------------------------------------------------------*/ + +// http://codesuppository.blogspot.com +// +// mailto: jratcliff@infiniplex.net +// +// http://www.amillionpixels.us +// + + +/* a = b - c */ +#define vector(a,b,c) \ + (a)[0] = (b)[0] - (c)[0]; \ + (a)[1] = (b)[1] - (c)[1]; \ + (a)[2] = (b)[2] - (c)[2]; + + + +#define innerProduct(v,q) \ + ((v)[0] * (q)[0] + \ + (v)[1] * (q)[1] + \ + (v)[2] * (q)[2]) + +#define crossProduct(a,b,c) \ + (a)[0] = (b)[1] * (c)[2] - (c)[1] * (b)[2]; \ + (a)[1] = (b)[2] * (c)[0] - (c)[2] * (b)[0]; \ + (a)[2] = (b)[0] * (c)[1] - (c)[0] * (b)[1]; + +bool rayIntersectsTriangle(const float *p,const float *d,const float *v0,const float *v1,const float *v2,float &t) +{ + + float e1[3],e2[3],h[3],s[3],q[3]; + float a,f,u,v; + + vector(e1,v1,v0); + vector(e2,v2,v0); + crossProduct(h,d,e2); + a = innerProduct(e1,h); + + if (a > -0.00001 && a < 0.00001) + return(false); + + f = 1/a; + vector(s,p,v0); + u = f * (innerProduct(s,h)); + + if (u < 0.0 || u > 1.0) + return(false); + + crossProduct(q,s,e1); + v = f * innerProduct(d,q); + if (v < 0.0 || u + v > 1.0) + return(false); + // at this stage we can compute t to find out where + // the intersection point is on the line + t = f * innerProduct(e2,q); + if (t > 0) // ray intersection + return(true); + else // this means that there is a line intersection + // but not a ray intersection + return (false); +} + + +bool lineIntersectsTriangle(const float *rayStart,const float *rayEnd,const float *p1,const float *p2,const float *p3,float *sect) +{ + float dir[3]; + + dir[0] = rayEnd[0] - rayStart[0]; + dir[1] = rayEnd[1] - rayStart[1]; + dir[2] = rayEnd[2] - rayStart[2]; + + float d = sqrtf(dir[0]*dir[0] + dir[1]*dir[1] + dir[2]*dir[2]); + float r = 1.0f / d; + + dir[0]*=r; + dir[1]*=r; + dir[2]*=r; + + + float t; + + bool ret = rayIntersectsTriangle(rayStart, dir, p1, p2, p3, t ); + + if ( ret ) + { + if ( t > d ) + { + sect[0] = rayStart[0] + dir[0]*t; + sect[1] = rayStart[1] + dir[1]*t; + sect[2] = rayStart[2] + dir[2]*t; + } + else + { + ret = false; + } + } + + return ret; +} diff --git a/BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/raytri.h b/BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/raytri.h new file mode 100644 index 00000000..76370c6d --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/raytri.h @@ -0,0 +1,45 @@ +#ifndef RAY_TRI_H + +#define RAY_TRI_H + +/*---------------------------------------------------------------------- + Copyright (c) 2004 Open Dynamics Framework Group + www.physicstools.org + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, are permitted provided + that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + Neither the name of the Open Dynamics Framework Group nor the names of its contributors may + be used to endorse or promote products derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-----------------------------------------------------------------------*/ + +// http://codesuppository.blogspot.com +// +// mailto: jratcliff@infiniplex.net +// +// http://www.amillionpixels.us +// + + + +// returns true if the ray intersects the triangle. +bool lineIntersectsTriangle(const float *rayStart,const float *rayEnd,const float *p1,const float *p2,const float *p3,float *sect); +bool rayIntersectsTriangle(const float *p,const float *d,const float *v0,const float *v1,const float *v2,float &t); + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/splitplane.cpp b/BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/splitplane.cpp new file mode 100644 index 00000000..2ae408e6 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/splitplane.cpp @@ -0,0 +1,306 @@ +#include "float_math.h" +#include +#include +#include +#include +#include +#include + + +/*---------------------------------------------------------------------- + Copyright (c) 2004 Open Dynamics Framework Group + www.physicstools.org + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, are permitted provided + that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + Neither the name of the Open Dynamics Framework Group nor the names of its contributors may + be used to endorse or promote products derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-----------------------------------------------------------------------*/ + +// http://codesuppository.blogspot.com +// +// mailto: jratcliff@infiniplex.net +// +// http://www.amillionpixels.us +// + +#include "splitplane.h" +#include "ConvexDecomposition.h" +#include "cd_vector.h" +#include "cd_hull.h" +#include "cd_wavefront.h" +#include "bestfit.h" +#include "planetri.h" +#include "vlookup.h" +#include "meshvolume.h" + +namespace ConvexDecomposition +{ + +static void computePlane(const float *A,const float *B,const float *C,float *plane) +{ + + float vx = (B[0] - C[0]); + float vy = (B[1] - C[1]); + float vz = (B[2] - C[2]); + + float wx = (A[0] - B[0]); + float wy = (A[1] - B[1]); + float wz = (A[2] - B[2]); + + float vw_x = vy * wz - vz * wy; + float vw_y = vz * wx - vx * wz; + float vw_z = vx * wy - vy * wx; + + float mag = sqrtf((vw_x * vw_x) + (vw_y * vw_y) + (vw_z * vw_z)); + + if ( mag < 0.000001f ) + { + mag = 0; + } + else + { + mag = 1.0f/mag; + } + + float x = vw_x * mag; + float y = vw_y * mag; + float z = vw_z * mag; + + + float D = 0.0f - ((x*A[0])+(y*A[1])+(z*A[2])); + + plane[0] = x; + plane[1] = y; + plane[2] = z; + plane[3] = D; + +} + +class Rect3d +{ +public: + Rect3d(void) { }; + + Rect3d(const float *bmin,const float *bmax) + { + + mMin[0] = bmin[0]; + mMin[1] = bmin[1]; + mMin[2] = bmin[2]; + + mMax[0] = bmax[0]; + mMax[1] = bmax[1]; + mMax[2] = bmax[2]; + + } + + void SetMin(const float *bmin) + { + mMin[0] = bmin[0]; + mMin[1] = bmin[1]; + mMin[2] = bmin[2]; + } + + void SetMax(const float *bmax) + { + mMax[0] = bmax[0]; + mMax[1] = bmax[1]; + mMax[2] = bmax[2]; + } + + void SetMin(float x,float y,float z) + { + mMin[0] = x; + mMin[1] = y; + mMin[2] = z; + } + + void SetMax(float x,float y,float z) + { + mMax[0] = x; + mMax[1] = y; + mMax[2] = z; + } + + float mMin[3]; + float mMax[3]; +}; + +void splitRect(unsigned int axis, + const Rect3d &source, + Rect3d &b1, + Rect3d &b2, + const float *midpoint) +{ + switch ( axis ) + { + case 0: + b1.SetMin(source.mMin); + b1.SetMax( midpoint[0], source.mMax[1], source.mMax[2] ); + + b2.SetMin( midpoint[0], source.mMin[1], source.mMin[2] ); + b2.SetMax(source.mMax); + + break; + case 1: + b1.SetMin(source.mMin); + b1.SetMax( source.mMax[0], midpoint[1], source.mMax[2] ); + + b2.SetMin( source.mMin[0], midpoint[1], source.mMin[2] ); + b2.SetMax(source.mMax); + + break; + case 2: + b1.SetMin(source.mMin); + b1.SetMax( source.mMax[0], source.mMax[1], midpoint[2] ); + + b2.SetMin( source.mMin[0], source.mMin[1], midpoint[2] ); + b2.SetMax(source.mMax); + + break; + } +} + +bool computeSplitPlane(unsigned int vcount, + const float *vertices, + unsigned int tcount, + const unsigned int *indices, + ConvexDecompInterface *callback, + float *plane) +{ + float bmin[3] = { 1e9, 1e9, 1e9 }; + float bmax[3] = { -1e9, -1e9, -1e9 }; + + for (unsigned int i=0; i bmax[0] ) bmax[0] = p[0]; + if ( p[1] > bmax[1] ) bmax[1] = p[1]; + if ( p[2] > bmax[2] ) bmax[2] = p[2]; + + } + + float dx = bmax[0] - bmin[0]; + float dy = bmax[1] - bmin[1]; + float dz = bmax[2] - bmin[2]; + + + float laxis = dx; + + unsigned int axis = 0; + + if ( dy > dx ) + { + axis = 1; + laxis = dy; + } + + if ( dz > dx && dz > dy ) + { + axis = 2; + laxis = dz; + } + + float p1[3]; + float p2[3]; + float p3[3]; + + p3[0] = p2[0] = p1[0] = bmin[0] + dx*0.5f; + p3[1] = p2[1] = p1[1] = bmin[1] + dy*0.5f; + p3[2] = p2[2] = p1[2] = bmin[2] + dz*0.5f; + + Rect3d b(bmin,bmax); + + Rect3d b1,b2; + + splitRect(axis,b,b1,b2,p1); + + +// callback->ConvexDebugBound(b1.mMin,b1.mMax,0x00FF00); +// callback->ConvexDebugBound(b2.mMin,b2.mMax,0xFFFF00); + + switch ( axis ) + { + case 0: + p2[1] = bmin[1]; + p2[2] = bmin[2]; + + if ( dz > dy ) + { + p3[1] = bmax[1]; + p3[2] = bmin[2]; + } + else + { + p3[1] = bmin[1]; + p3[2] = bmax[2]; + } + + break; + case 1: + p2[0] = bmin[0]; + p2[2] = bmin[2]; + + if ( dx > dz ) + { + p3[0] = bmax[0]; + p3[2] = bmin[2]; + } + else + { + p3[0] = bmin[0]; + p3[2] = bmax[2]; + } + + break; + case 2: + p2[0] = bmin[0]; + p2[1] = bmin[1]; + + if ( dx > dy ) + { + p3[0] = bmax[0]; + p3[1] = bmin[1]; + } + else + { + p3[0] = bmin[0]; + p3[1] = bmax[1]; + } + + break; + } + +// callback->ConvexDebugTri(p1,p2,p3,0xFF0000); + + computePlane(p1,p2,p3,plane); + + return true; + +} + + +} diff --git a/BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/splitplane.h b/BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/splitplane.h new file mode 100644 index 00000000..26fe2e33 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/splitplane.h @@ -0,0 +1,59 @@ +#ifndef SPLIT_PLANE_H + +#define SPLIT_PLANE_H + +//** Computes an 'optimal' split plane for the supplied mesh. +//** needs much improvement since it currently just splits along +//** the longest side of the AABB. +/*---------------------------------------------------------------------- + Copyright (c) 2004 Open Dynamics Framework Group + www.physicstools.org + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, are permitted provided + that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + Neither the name of the Open Dynamics Framework Group nor the names of its contributors may + be used to endorse or promote products derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-----------------------------------------------------------------------*/ + +// http://codesuppository.blogspot.com +// +// mailto: jratcliff@infiniplex.net +// +// http://www.amillionpixels.us +// + + + +namespace ConvexDecomposition +{ + +class ConvexDecompInterface; + +bool computeSplitPlane(unsigned int vcount, + const float *vertices, + unsigned int tcount, + const unsigned int *indices, + ConvexDecompInterface *callback, + float *plane); + + +} + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/vlookup.cpp b/BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/vlookup.cpp new file mode 100644 index 00000000..8ce4e452 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/vlookup.cpp @@ -0,0 +1,307 @@ +#include "float_math.h" +#include +#include +#include +#include + +#pragma warning(disable:4786) + +#include +#include +#include + + +/*---------------------------------------------------------------------- + Copyright (c) 2004 Open Dynamics Framework Group + www.physicstools.org + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, are permitted provided + that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + Neither the name of the Open Dynamics Framework Group nor the names of its contributors may + be used to endorse or promote products derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-----------------------------------------------------------------------*/ + +// http://codesuppository.blogspot.com +// +// mailto: jratcliff@infiniplex.net +// +// http://www.amillionpixels.us +// + +// CodeSnippet provided by John W. Ratcliff +// on March 23, 2006. +// +// mailto: jratcliff@infiniplex.net +// +// Personal website: http://jratcliffscarab.blogspot.com +// Coding Website: http://codesuppository.blogspot.com +// FundRaising Blog: http://amillionpixels.blogspot.com +// Fundraising site: http://www.amillionpixels.us +// New Temple Site: http://newtemple.blogspot.com +// +// This snippet shows how to 'hide' the complexity of +// the STL by wrapping some useful piece of functionality +// around a handful of discrete API calls. +// +// This API allows you to create an indexed triangle list +// from a collection of raw input triangles. Internally +// it uses an STL set to build the lookup table very rapidly. +// +// Here is how you would use it to build an indexed triangle +// list from a raw list of triangles. +// +// (1) create a 'VertexLookup' interface by calling +// +// VertexLook vl = Vl_createVertexLookup(); +// +// (2) For each vertice in each triangle call: +// +// unsigned int i1 = Vl_getIndex(vl,p1); +// unsigned int i2 = Vl_getIndex(vl,p2); +// unsigned int i3 = Vl_getIndex(vl,p3); +// +// save the 3 indices into your triangle list array. +// +// (3) Get the vertex array by calling: +// +// const float *vertices = Vl_getVertices(vl); +// +// (4) Get the number of vertices so you can copy them into +// your own buffer. +// unsigned int vcount = Vl_getVcount(vl); +// +// (5) Release the VertexLookup interface when you are done with it. +// Vl_releaseVertexLookup(vl); +// +// Teaches the following lessons: +// +// How to wrap the complexity of STL and C++ classes around a +// simple API interface. +// +// How to use an STL set and custom comparator operator for +// a complex data type. +// +// How to create a template class. +// +// How to achieve significant performance improvements by +// taking advantage of built in STL containers in just +// a few lines of code. +// +// You could easily modify this code to support other vertex +// formats with any number of interpolants. + + + + +#include "vlookup.h" + +namespace Vlookup +{ + +class VertexPosition +{ +public: + VertexPosition(void) { }; + VertexPosition(const float *p) + { + mPos[0] = p[0]; + mPos[1] = p[1]; + mPos[2] = p[2]; + }; + + void Set(int index,const float *pos) + { + const float * p = &pos[index*3]; + + mPos[0] = p[0]; + mPos[1] = p[1]; + mPos[2] = p[2]; + + }; + + float GetX(void) const { return mPos[0]; }; + float GetY(void) const { return mPos[1]; }; + float GetZ(void) const { return mPos[2]; }; + + float mPos[3]; +}; + + +class VertexLess +{ +public: + typedef std::vector< VertexPosition > VertexVector; + + bool operator()(int v1,int v2) const; + + static void SetSearch(const VertexPosition& match,VertexVector *list) + { + mFind = match; + mList = list; + }; + +private: + const VertexPosition& Get(int index) const + { + if ( index == -1 ) return mFind; + VertexVector &vlist = *mList; + return vlist[index]; + } + static VertexPosition mFind; // vertice to locate. + static VertexVector *mList; +}; + +template class VertexPool +{ +public: + typedef std::set VertexSet; + typedef std::vector< Type > VertexVector; + + int getVertex(const Type& vtx) + { + VertexLess::SetSearch(vtx,&mVtxs); + VertexSet::iterator found; + found = mVertSet.find( -1 ); + if ( found != mVertSet.end() ) + { + return *found; + } + int idx = (int)mVtxs.size(); + mVtxs.push_back( vtx ); + mVertSet.insert( idx ); + return idx; + }; + + + const float * GetPos(int idx) const + { + return mVtxs[idx].mPos; + } + + const Type& Get(int idx) const + { + return mVtxs[idx]; + }; + + unsigned int GetSize(void) const + { + return mVtxs.size(); + }; + + void Clear(int reservesize) // clear the vertice pool. + { + mVertSet.clear(); + mVtxs.clear(); + mVtxs.reserve(reservesize); + }; + + const VertexVector& GetVertexList(void) const { return mVtxs; }; + + void Set(const Type& vtx) + { + mVtxs.push_back(vtx); + } + + unsigned int GetVertexCount(void) const + { + return mVtxs.size(); + }; + + + Type * getBuffer(void) + { + return &mVtxs[0]; + }; + +private: + VertexSet mVertSet; // ordered list. + VertexVector mVtxs; // set of vertices. +}; + + +VertexPosition VertexLess::mFind; +std::vector *VertexLess::mList=0; + +bool VertexLess::operator()(int v1,int v2) const +{ + + const VertexPosition& a = Get(v1); + const VertexPosition& b = Get(v2); + + int ixA = (int) (a.GetX()*10000.0f); + int ixB = (int) (b.GetX()*10000.0f); + + if ( ixA < ixB ) return true; + if ( ixA > ixB ) return false; + + int iyA = (int) (a.GetY()*10000.0f); + int iyB = (int) (b.GetY()*10000.0f); + + if ( iyA < iyB ) return true; + if ( iyA > iyB ) return false; + + int izA = (int) (a.GetZ()*10000.0f); + int izB = (int) (b.GetZ()*10000.0f); + + if ( izA < izB ) return true; + if ( izA > izB ) return false; + + + return false; +} + + + + +} + +using namespace Vlookup; + +VertexLookup Vl_createVertexLookup(void) +{ + VertexLookup ret = new VertexPool< VertexPosition >; + return ret; +} + +void Vl_releaseVertexLookup(VertexLookup vlook) +{ + VertexPool< VertexPosition > *vp = (VertexPool< VertexPosition > *) vlook; + delete vp; +} + +unsigned int Vl_getIndex(VertexLookup vlook,const float *pos) // get index. +{ + VertexPool< VertexPosition > *vp = (VertexPool< VertexPosition > *) vlook; + VertexPosition p(pos); + return vp->getVertex(p); +} + +const float * Vl_getVertices(VertexLookup vlook) +{ + VertexPool< VertexPosition > *vp = (VertexPool< VertexPosition > *) vlook; + return vp->GetPos(0); +} + + +unsigned int Vl_getVcount(VertexLookup vlook) +{ + VertexPool< VertexPosition > *vp = (VertexPool< VertexPosition > *) vlook; + return vp->GetVertexCount(); +} diff --git a/BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/vlookup.h b/BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/vlookup.h new file mode 100644 index 00000000..1a6e0a9e --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/ConvexDecomposition/vlookup.h @@ -0,0 +1,119 @@ +#ifndef VLOOKUP_H + +#define VLOOKUP_H + + +/*---------------------------------------------------------------------- + Copyright (c) 2004 Open Dynamics Framework Group + www.physicstools.org + All rights reserved. + + Redistribution and use in source and binary forms, with or without modification, are permitted provided + that the following conditions are met: + + Redistributions of source code must retain the above copyright notice, this list of conditions + and the following disclaimer. + + Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + + Neither the name of the Open Dynamics Framework Group nor the names of its contributors may + be used to endorse or promote products derived from this software without specific prior written permission. + + THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 'AS IS' AND ANY EXPRESS OR IMPLIED WARRANTIES, + INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + DISCLAIMED. IN NO EVENT SHALL THE INTEL OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, + EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; + LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER + IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF + THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +-----------------------------------------------------------------------*/ + +// http://codesuppository.blogspot.com +// +// mailto: jratcliff@infiniplex.net +// +// http://www.amillionpixels.us +// + + +// CodeSnippet provided by John W. Ratcliff +// on March 23, 2006. +// +// mailto: jratcliff@infiniplex.net +// +// Personal website: http://jratcliffscarab.blogspot.com +// Coding Website: http://codesuppository.blogspot.com +// FundRaising Blog: http://amillionpixels.blogspot.com +// Fundraising site: http://www.amillionpixels.us +// New Temple Site: http://newtemple.blogspot.com +// +// This snippet shows how to 'hide' the complexity of +// the STL by wrapping some useful piece of functionality +// around a handful of discrete API calls. +// +// This API allows you to create an indexed triangle list +// from a collection of raw input triangles. Internally +// it uses an STL set to build the lookup table very rapidly. +// +// Here is how you would use it to build an indexed triangle +// list from a raw list of triangles. +// +// (1) create a 'VertexLookup' interface by calling +// +// VertexLook vl = Vl_createVertexLookup(); +// +// (2) For each vertice in each triangle call: +// +// unsigned int i1 = Vl_getIndex(vl,p1); +// unsigned int i2 = Vl_getIndex(vl,p2); +// unsigned int i3 = Vl_getIndex(vl,p3); +// +// save the 3 indices into your triangle list array. +// +// (3) Get the vertex array by calling: +// +// const float *vertices = Vl_getVertices(vl); +// +// (4) Get the number of vertices so you can copy them into +// your own buffer. +// unsigned int vcount = Vl_getVcount(vl); +// +// (5) Release the VertexLookup interface when you are done with it. +// Vl_releaseVertexLookup(vl); +// +// Teaches the following lessons: +// +// How to wrap the complexity of STL and C++ classes around a +// simple API interface. +// +// How to use an STL set and custom comparator operator for +// a complex data type. +// +// How to create a template class. +// +// How to achieve significant performance improvements by +// taking advantage of built in STL containers in just +// a few lines of code. +// +// You could easily modify this code to support other vertex +// formats with any number of interpolants. +// +// Hide C++ classes from the rest of your application by +// keeping them in the CPP and wrapping them in a namespace +// Uses an STL set to create an index table for a bunch of vertex positions +// used typically to re-index a collection of raw triangle data. + + +typedef void * VertexLookup; + +VertexLookup Vl_createVertexLookup(void); +void Vl_releaseVertexLookup(VertexLookup vlook); + +unsigned int Vl_getIndex(VertexLookup vlook,const float *pos); // get index. +const float * Vl_getVertices(VertexLookup vlook); +unsigned int Vl_getVcount(VertexLookup vlook); + + +#endif diff --git a/BulletPhysics/bulletTrunk/Extras/EPA/Epa.cpp b/BulletPhysics/bulletTrunk/Extras/EPA/Epa.cpp new file mode 100644 index 00000000..f1cee2e2 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/EPA/Epa.cpp @@ -0,0 +1,569 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +EPA Copyright (c) Ricardo Padrela 2006 + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#include "LinearMath/btScalar.h" +#include "LinearMath/btVector3.h" +#include "LinearMath/btPoint3.h" +#include "LinearMath/btTransform.h" +#include "LinearMath/btMinMax.h" + +#include "BulletCollision/CollisionShapes/btConvexShape.h" + +#include +#include +#include + +#include "BulletCollision/NarrowPhaseCollision/btSimplexSolverInterface.h" + +#include "EpaCommon.h" + +#include "EpaVertex.h" +#include "EpaHalfEdge.h" +#include "EpaFace.h" +#include "EpaPolyhedron.h" +#include "Epa.h" + +const btScalar EPA_MAX_RELATIVE_ERROR = 1e-2f; +const btScalar EPA_MAX_RELATIVE_ERROR_SQRD = EPA_MAX_RELATIVE_ERROR * EPA_MAX_RELATIVE_ERROR; + +Epa::Epa( btConvexShape* pConvexShapeA, btConvexShape* pConvexShapeB, + const btTransform& transformA, const btTransform& transformB ) : m_pConvexShapeA( pConvexShapeA ), + m_pConvexShapeB( pConvexShapeB ), + m_transformA( transformA ), + m_transformB( transformB ) +{ + m_faceEntries.reserve( EPA_MAX_FACE_ENTRIES ); +} + +Epa::~Epa() +{ +} + +bool Epa::Initialize( btSimplexSolverInterface& simplexSolver ) +{ + // Run GJK on the enlarged shapes to obtain a simplex of the enlarged CSO + + btVector3 v( 1, 0, 0 ); + btScalar squaredDistance = SIMD_INFINITY; + + btScalar delta = 0.f; + + simplexSolver.reset(); + + int nbIterations = 0; + + while ( true ) + { + EPA_DEBUG_ASSERT( ( v.length2() > 0 ) ,"Warning : v has zero magnitude!" ); + + btVector3 seperatingAxisInA = -v * m_transformA.getBasis(); + btVector3 seperatingAxisInB = v * m_transformB.getBasis(); + + btVector3 pInA = m_pConvexShapeA->localGetSupportingVertex( seperatingAxisInA ); + btVector3 qInB = m_pConvexShapeB->localGetSupportingVertex( seperatingAxisInB ); + + btPoint3 pWorld = m_transformA( pInA ); + btPoint3 qWorld = m_transformB( qInB ); + + btVector3 w = pWorld - qWorld; + delta = v.dot( w ); + + EPA_DEBUG_ASSERT( ( delta <= 0 ) ,"Shapes are disjoint, EPA should have never been called!" ); + if ( delta > 0.f ) + return false; + + EPA_DEBUG_ASSERT( !simplexSolver.inSimplex( w ) ,"Shapes are disjoint, EPA should have never been called!" ); + if (simplexSolver.inSimplex( w )) + return false; + + // Add support point to simplex + simplexSolver.addVertex( w, pWorld, qWorld ); + + bool closestOk = simplexSolver.closest( v ); + EPA_DEBUG_ASSERT( closestOk ,"Shapes are disjoint, EPA should have never been called!" ); + if (!closestOk) + return false; + + btScalar prevVSqrd = squaredDistance; + squaredDistance = v.length2(); + + // Is v converging to v(A-B) ? + EPA_DEBUG_ASSERT( ( ( prevVSqrd - squaredDistance ) > SIMD_EPSILON * prevVSqrd ) , + "Shapes are disjoint, EPA should have never been called!" ); + if (( ( prevVSqrd - squaredDistance ) <= SIMD_EPSILON * prevVSqrd )) + return false; + + if ( simplexSolver.fullSimplex() || ( squaredDistance <= SIMD_EPSILON * simplexSolver.maxVertex() ) ) + { + break; + } + + ++nbIterations; + } + + btPoint3 simplexPoints[ 5 ]; + btPoint3 wSupportPointsOnA[ 5 ]; + btPoint3 wSupportPointsOnB[ 5 ]; + + int nbSimplexPoints = simplexSolver.getSimplex( wSupportPointsOnA, wSupportPointsOnB, simplexPoints ); + + // nbSimplexPoints can't be one because cases where the origin is on the boundary are handled + // by hybrid penetration depth + EPA_DEBUG_ASSERT( ( ( nbSimplexPoints > 1 ) ,( nbSimplexPoints <= 4 ) ) , + "Hybrid Penetration Depth algorithm failed!" ); + + int nbPolyhedronPoints = nbSimplexPoints; + +#ifndef EPA_POLYHEDRON_USE_PLANES + int initTetraIndices[ 4 ] = { 0, 1, 2, 3 }; +#endif + + // Prepare initial polyhedron to start EPA from + if ( nbSimplexPoints == 1 ) + { + return false; + } + else if ( nbSimplexPoints == 2 ) + { + // We have a line segment inside the CSO that contains the origin + // Create an hexahedron ( two tetrahedron glued together ) by adding 3 new points + + btVector3 d = simplexPoints[ 0 ] - simplexPoints[ 1 ]; + d.normalize(); + + btVector3 v1; + btVector3 v2; + btVector3 v3; + + btVector3 e1; + + btScalar absx = abs( d.getX() ); + btScalar absy = abs( d.getY() ); + btScalar absz = abs( d.getZ() ); + + if ( absx < absy ) + { + if ( absx < absz ) + { + e1.setX( 1 ); + } + else + { + e1.setZ( 1 ); + } + } + else + { + if ( absy < absz ) + { + e1.setY( 1 ); + } + else + { + e1.setZ( 1 ); + } + } + + v1 = d.cross( e1 ); + v1.normalize(); + + v2 = v1.rotate( d, 120 * SIMD_RADS_PER_DEG ); + v3 = v2.rotate( d, 120 * SIMD_RADS_PER_DEG ); + + nbPolyhedronPoints = 5; + + btVector3 seperatingAxisInA = v1 * m_transformA.getBasis(); + btVector3 seperatingAxisInB = -v1 * m_transformB.getBasis(); + + btVector3 p = m_pConvexShapeA->localGetSupportingVertex( seperatingAxisInA ); + btVector3 q = m_pConvexShapeB->localGetSupportingVertex( seperatingAxisInB ); + + btPoint3 pWorld = m_transformA( p ); + btPoint3 qWorld = m_transformB( q ); + + wSupportPointsOnA[ 2 ] = pWorld; + wSupportPointsOnB[ 2 ] = qWorld; + simplexPoints[ 2 ] = wSupportPointsOnA[ 2 ] - wSupportPointsOnB[ 2 ]; + + seperatingAxisInA = v2 * m_transformA.getBasis(); + seperatingAxisInB = -v2 * m_transformB.getBasis(); + + p = m_pConvexShapeA->localGetSupportingVertex( seperatingAxisInA ); + q = m_pConvexShapeB->localGetSupportingVertex( seperatingAxisInB ); + + pWorld = m_transformA( p ); + qWorld = m_transformB( q ); + + wSupportPointsOnA[ 3 ] = pWorld; + wSupportPointsOnB[ 3 ] = qWorld; + simplexPoints[ 3 ] = wSupportPointsOnA[ 3 ] - wSupportPointsOnB[ 3 ]; + + seperatingAxisInA = v3 * m_transformA.getBasis(); + seperatingAxisInB = -v3 * m_transformB.getBasis(); + + p = m_pConvexShapeA->localGetSupportingVertex( seperatingAxisInA ); + q = m_pConvexShapeB->localGetSupportingVertex( seperatingAxisInB ); + + pWorld = m_transformA( p ); + qWorld = m_transformB( q ); + + wSupportPointsOnA[ 4 ] = pWorld; + wSupportPointsOnB[ 4 ] = qWorld; + simplexPoints[ 4 ] = wSupportPointsOnA[ 4 ] - wSupportPointsOnB[ 4 ]; + +#ifndef EPA_POLYHEDRON_USE_PLANES + if ( TetrahedronContainsOrigin( simplexPoints[ 0 ], simplexPoints[ 2 ], simplexPoints[ 3 ], simplexPoints[ 4 ] ) ) + { + initTetraIndices[ 1 ] = 2; + initTetraIndices[ 2 ] = 3; + initTetraIndices[ 3 ] = 4; + } + else + { + if ( TetrahedronContainsOrigin( simplexPoints[ 1 ], simplexPoints[ 2 ], simplexPoints[ 3 ], simplexPoints[ 4 ] ) ) + { + initTetraIndices[ 0 ] = 1; + initTetraIndices[ 1 ] = 2; + initTetraIndices[ 2 ] = 3; + initTetraIndices[ 3 ] = 4; + } + else + { + // No tetrahedron contains the origin + assert( false && "Unable to find an initial tetrahedron that contains the origin!" ); + return false; + } + } +#endif + } + else if ( nbSimplexPoints == 3 ) + { + // We have a triangle inside the CSO that contains the origin + // Create an hexahedron ( two tetrahedron glued together ) by adding 2 new points + + btVector3 v0 = simplexPoints[ 2 ] - simplexPoints[ 0 ]; + btVector3 v1 = simplexPoints[ 1 ] - simplexPoints[ 0 ]; + btVector3 triangleNormal = v0.cross( v1 ); + triangleNormal.normalize(); + + nbPolyhedronPoints = 5; + + btVector3 seperatingAxisInA = triangleNormal * m_transformA.getBasis(); + btVector3 seperatingAxisInB = -triangleNormal * m_transformB.getBasis(); + + btVector3 p = m_pConvexShapeA->localGetSupportingVertex( seperatingAxisInA ); + btVector3 q = m_pConvexShapeB->localGetSupportingVertex( seperatingAxisInB ); + + btPoint3 pWorld = m_transformA( p ); + btPoint3 qWorld = m_transformB( q ); + + wSupportPointsOnA[ 3 ] = pWorld; + wSupportPointsOnB[ 3 ] = qWorld; + simplexPoints[ 3 ] = wSupportPointsOnA[ 3 ] - wSupportPointsOnB[ 3 ]; + +#ifndef EPA_POLYHEDRON_USE_PLANES + // We place this check here because if the tetrahedron contains the origin + // there is no need to sample another support point + if ( !TetrahedronContainsOrigin( simplexPoints[ 0 ], simplexPoints[ 1 ], simplexPoints[ 2 ], simplexPoints[ 3 ] ) ) + { +#endif + seperatingAxisInA = -triangleNormal * m_transformA.getBasis(); + seperatingAxisInB = triangleNormal * m_transformB.getBasis(); + + p = m_pConvexShapeA->localGetSupportingVertex( seperatingAxisInA ); + q = m_pConvexShapeB->localGetSupportingVertex( seperatingAxisInB ); + + pWorld = m_transformA( p ); + qWorld = m_transformB( q ); + + wSupportPointsOnA[ 4 ] = pWorld; + wSupportPointsOnB[ 4 ] = qWorld; + simplexPoints[ 4 ] = wSupportPointsOnA[ 4 ] - wSupportPointsOnB[ 4 ]; + +#ifndef EPA_POLYHEDRON_USE_PLANES + if ( TetrahedronContainsOrigin( simplexPoints[ 0 ], simplexPoints[ 1 ], simplexPoints[ 2 ], simplexPoints[ 4 ] ) ) + { + initTetraIndices[ 3 ] = 4; + } + else + { + // No tetrahedron contains the origin + assert( false && "Unable to find an initial tetrahedron that contains the origin!" ); + return false; + } + } +#endif + } +#ifdef _DEBUG + else if ( nbSimplexPoints == 4 ) + { + EPA_DEBUG_ASSERT( TetrahedronContainsOrigin( simplexPoints ) ,"Initial tetrahedron does not contain the origin!" ); + } +#endif + +#ifndef EPA_POLYHEDRON_USE_PLANES + btPoint3 wTetraPoints[ 4 ] = { simplexPoints[ initTetraIndices[ 0 ] ], + simplexPoints[ initTetraIndices[ 1 ] ], + simplexPoints[ initTetraIndices[ 2 ] ], + simplexPoints[ initTetraIndices[ 3 ] ] }; + + btPoint3 wTetraSupportPointsOnA[ 4 ] = { wSupportPointsOnA[ initTetraIndices[ 0 ] ], + wSupportPointsOnA[ initTetraIndices[ 1 ] ], + wSupportPointsOnA[ initTetraIndices[ 2 ] ], + wSupportPointsOnA[ initTetraIndices[ 3 ] ] }; + + btPoint3 wTetraSupportPointsOnB[ 4 ] = { wSupportPointsOnB[ initTetraIndices[ 0 ] ], + wSupportPointsOnB[ initTetraIndices[ 1 ] ], + wSupportPointsOnB[ initTetraIndices[ 2 ] ], + wSupportPointsOnB[ initTetraIndices[ 3 ] ] }; +#endif + +#ifdef EPA_POLYHEDRON_USE_PLANES + if ( !m_polyhedron.Create( simplexPoints, wSupportPointsOnA, wSupportPointsOnB, nbPolyhedronPoints ) ) +#else + if ( !m_polyhedron.Create( wTetraPoints, wTetraSupportPointsOnA, wTetraSupportPointsOnB, 4 ) ) +#endif + { + // Failed to create initial polyhedron + EPA_DEBUG_ASSERT( false ,"Failed to create initial polyhedron!" ); + return false; + } + + // Add initial faces to priority queue + +#ifdef _DEBUG + //m_polyhedron._dbgSaveToFile( "epa_start.dbg" ); +#endif + + std::list< EpaFace* >& faces = m_polyhedron.GetFaces(); + + std::list< EpaFace* >::iterator facesItr( faces.begin() ); + + while ( facesItr != faces.end() ) + { + EpaFace* pFace = *facesItr; + + if ( !pFace->m_deleted ) + { +//#ifdef EPA_POLYHEDRON_USE_PLANES +// if ( pFace->m_planeDistance >= 0 ) +// { +// m_polyhedron._dbgSaveToFile( "epa_start.dbg" ); +// assert( false && "Face's plane distance equal or greater than 0!" ); +// } +//#endif + + if ( pFace->IsAffinelyDependent() ) + { + EPA_DEBUG_ASSERT( false ,"One initial face is affinely dependent!" ); + return false; + } + + if ( pFace->m_vSqrd <= 0 ) + { + EPA_DEBUG_ASSERT( false ,"Face containing the origin!" ); + return false; + } + + if ( pFace->IsClosestPointInternal() ) + { + m_faceEntries.push_back( pFace ); + std::push_heap( m_faceEntries.begin(), m_faceEntries.end(), CompareEpaFaceEntries ); + } + } + + ++facesItr; + } + +#ifdef _DEBUG + //m_polyhedron._dbgSaveToFile( "epa_start.dbg" ); +#endif + + EPA_DEBUG_ASSERT( !m_faceEntries.empty() ,"No faces added to heap!" ); + + return true; +} + +btScalar Epa::calcPenDepth( btPoint3& wWitnessOnA, btPoint3& wWitnessOnB ) +{ + btVector3 v; + + btScalar upperBoundSqrd = SIMD_INFINITY; + btScalar vSqrd = 0; +#ifdef _DEBUG + btScalar prevVSqrd; +#endif + btScalar delta; + + bool isCloseEnough = false; + + EpaFace* pEpaFace = NULL; + + int nbIterations = 0; + //int nbMaxIterations = 1000; + + do + { + pEpaFace = m_faceEntries.front(); + std::pop_heap( m_faceEntries.begin(), m_faceEntries.end(), CompareEpaFaceEntries ); + m_faceEntries.pop_back(); + + if ( !pEpaFace->m_deleted ) + { +#ifdef _DEBUG + prevVSqrd = vSqrd; +#endif + + vSqrd = pEpaFace->m_vSqrd; + + if ( pEpaFace->m_planeDistance >= 0 ) + { + v = pEpaFace->m_planeNormal; + } + else + { + v = pEpaFace->m_v; + } + +#ifdef _DEBUG + //assert_msg( vSqrd <= upperBoundSqrd, "A triangle was falsely rejected!" ); + EPA_DEBUG_ASSERT( ( vSqrd >= prevVSqrd ) ,"vSqrd decreased!" ); +#endif //_DEBUG + EPA_DEBUG_ASSERT( ( v.length2() > 0 ) ,"Zero vector not allowed!" ); + + btVector3 seperatingAxisInA = v * m_transformA.getBasis(); + btVector3 seperatingAxisInB = -v * m_transformB.getBasis(); + + btVector3 p = m_pConvexShapeA->localGetSupportingVertex( seperatingAxisInA ); + btVector3 q = m_pConvexShapeB->localGetSupportingVertex( seperatingAxisInB ); + + btPoint3 pWorld = m_transformA( p ); + btPoint3 qWorld = m_transformB( q ); + + btPoint3 w = pWorld - qWorld; + delta = v.dot( w ); + + // Keep tighest upper bound + upperBoundSqrd = btMin( upperBoundSqrd, delta * delta / vSqrd ); + //assert_msg( vSqrd <= upperBoundSqrd, "A triangle was falsely rejected!" ); + + isCloseEnough = ( upperBoundSqrd <= ( 1 + 1e-4f ) * vSqrd ); + + if ( !isCloseEnough ) + { + std::list< EpaFace* > newFaces; + bool expandOk = m_polyhedron.Expand( w, pWorld, qWorld, pEpaFace, newFaces ); + + if ( expandOk ) + { + EPA_DEBUG_ASSERT( !newFaces.empty() ,"EPA polyhedron not expanding ?" ); + + bool check = true; + bool areEqual = false; + + while ( !newFaces.empty() ) + { + EpaFace* pNewFace = newFaces.front(); + EPA_DEBUG_ASSERT( !pNewFace->m_deleted ,"New face is deleted!" ); + + if ( !pNewFace->m_deleted ) + { + EPA_DEBUG_ASSERT( ( pNewFace->m_vSqrd > 0 ) ,"Face containing the origin!" ); + EPA_DEBUG_ASSERT( !pNewFace->IsAffinelyDependent() ,"Face is affinely dependent!" ); + +//#ifdef EPA_POLYHEDRON_USE_PLANES +//// if ( pNewFace->m_planeDistance >= 0 ) +//// { +// // assert( false && "Face's plane distance greater than 0!" ); +//#ifdef _DEBUG +//// m_polyhedron._dbgSaveToFile( "epa_beforeFix.dbg" ); +//#endif +// //pNewFace->FixOrder(); +//#ifdef _DEBUG +// //m_polyhedron._dbgSaveToFile( "epa_afterFix.dbg" ); +//#endif +//// } +//#endif +// +//#ifdef EPA_POLYHEDRON_USE_PLANES +// //assert( ( pNewFace->m_planeDistance < 0 ) && "Face's plane distance equal or greater than 0!" ); +//#endif + + if ( pNewFace->IsClosestPointInternal() && ( vSqrd <= pNewFace->m_vSqrd ) && ( pNewFace->m_vSqrd <= upperBoundSqrd ) ) + { + m_faceEntries.push_back( pNewFace ); + std::push_heap( m_faceEntries.begin(), m_faceEntries.end(), CompareEpaFaceEntries ); + } + } + + newFaces.pop_front(); + } + } + else + { + pEpaFace->CalcClosestPointOnA( wWitnessOnA ); + pEpaFace->CalcClosestPointOnB( wWitnessOnB ); + +#ifdef _DEBUG + //m_polyhedron._dbgSaveToFile( "epa_end.dbg" ); +#endif + + return v.length(); + } + } + } + + ++nbIterations; + } + while ( ( m_polyhedron.GetNbFaces() < EPA_MAX_FACE_ENTRIES ) &&/*( nbIterations < nbMaxIterations ) &&*/ + !isCloseEnough && ( m_faceEntries.size() > 0 ) && ( m_faceEntries[ 0 ]->m_vSqrd <= upperBoundSqrd ) ); + +#ifdef _DEBUG + //m_polyhedron._dbgSaveToFile( "epa_end.dbg" ); +#endif + + EPA_DEBUG_ASSERT( pEpaFace ,"Invalid epa face!" ); + + pEpaFace->CalcClosestPointOnA( wWitnessOnA ); + pEpaFace->CalcClosestPointOnB( wWitnessOnB ); + + return v.length(); +} + +bool Epa::TetrahedronContainsOrigin( const btPoint3& point0, const btPoint3& point1, + const btPoint3& point2, const btPoint3& point3 ) +{ + btVector3 facesNormals[ 4 ] = { ( point1 - point0 ).cross( point2 - point0 ), + ( point2 - point1 ).cross( point3 - point1 ), + ( point3 - point2 ).cross( point0 - point2 ), + ( point0 - point3 ).cross( point1 - point3 ) }; + + return ( ( facesNormals[ 0 ].dot( point0 ) > 0 ) != ( facesNormals[ 0 ].dot( point3 ) > 0 ) ) && + ( ( facesNormals[ 1 ].dot( point1 ) > 0 ) != ( facesNormals[ 1 ].dot( point0 ) > 0 ) ) && + ( ( facesNormals[ 2 ].dot( point2 ) > 0 ) != ( facesNormals[ 2 ].dot( point1 ) > 0 ) ) && + ( ( facesNormals[ 3 ].dot( point3 ) > 0 ) != ( facesNormals[ 3 ].dot( point2 ) > 0 ) ); +} + +bool Epa::TetrahedronContainsOrigin( btPoint3* pPoints ) +{ + return TetrahedronContainsOrigin( pPoints[ 0 ], pPoints[ 1 ], pPoints[ 2 ], pPoints[ 3 ] ); +} + +bool CompareEpaFaceEntries( EpaFace* pFaceA, EpaFace* pFaceB ) +{ + return ( pFaceA->m_vSqrd > pFaceB->m_vSqrd ); +} diff --git a/BulletPhysics/bulletTrunk/Extras/EPA/Epa.h b/BulletPhysics/bulletTrunk/Extras/EPA/Epa.h new file mode 100644 index 00000000..a40b88e6 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/EPA/Epa.h @@ -0,0 +1,68 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +EPA Copyright (c) Ricardo Padrela 2006 + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ +#ifndef EPA_H +#define EPA_H + +#define EPA_MAX_FACE_ENTRIES 256 + + + +extern const btScalar EPA_MAX_RELATIVE_ERROR; +extern const btScalar EPA_MAX_RELATIVE_ERROR_SQRD; + +class Epa +{ + private : + + //! Prevents copying objects from this class + Epa( const Epa& epa ); + const Epa& operator = ( const Epa& epa ); + + public : + + Epa( btConvexShape* pConvexShapeA, btConvexShape* pConvexShapeB, + const btTransform& transformA, const btTransform& transformB ); + ~Epa(); + + bool Initialize( btSimplexSolverInterface& simplexSolver ); + + btScalar calcPenDepth( btPoint3& wWitnessOnA, btPoint3& wWitnessOnB ); + + private : + + bool TetrahedronContainsOrigin( btPoint3* pPoints ); + bool TetrahedronContainsOrigin( const btPoint3& point0, const btPoint3& point1, + const btPoint3& point2, const btPoint3& point3 ); + + private : + + //! Priority queue + std::vector< EpaFace* > m_faceEntries; + + btConvexShape* m_pConvexShapeA; + btConvexShape* m_pConvexShapeB; + + btTransform m_transformA; + btTransform m_transformB; + + EpaPolyhedron m_polyhedron; +}; + +extern bool CompareEpaFaceEntries( EpaFace* pFaceA, EpaFace* pFaceB ); + +#endif + diff --git a/BulletPhysics/bulletTrunk/Extras/EPA/EpaCommon.h b/BulletPhysics/bulletTrunk/Extras/EPA/EpaCommon.h new file mode 100644 index 00000000..7224640f --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/EPA/EpaCommon.h @@ -0,0 +1,30 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +EPA Copyright (c) Ricardo Padrela 2006 + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ +#ifndef EPA_COMMON_H +#define EPA_COMMON_H + +#define EPA_POLYHEDRON_USE_PLANES + + +//#define EPA_DEBUG_ASSERT(c,a) +//#define EPA_DEBUG_ASSERT(c,a) assert(c && a) +#define EPA_DEBUG_ASSERT(c,a) if (!c) printf(a) + +//#define EPA_USE_HYBRID + +#endif + diff --git a/BulletPhysics/bulletTrunk/Extras/EPA/EpaFace.cpp b/BulletPhysics/bulletTrunk/Extras/EPA/EpaFace.cpp new file mode 100644 index 00000000..c16b34f2 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/EPA/EpaFace.cpp @@ -0,0 +1,254 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +EPA Copyright (c) Ricardo Padrela 2006 + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ +#include "LinearMath/btScalar.h" +#include "LinearMath/btVector3.h" +#include "LinearMath/btPoint3.h" + +#include "EpaCommon.h" + +#include "EpaVertex.h" +#include "EpaHalfEdge.h" +#include "EpaFace.h" + +#ifdef EPA_POLYHEDRON_USE_PLANES +btScalar PLANE_THICKNESS = 1e-5f; +#endif + +EpaFace::EpaFace() : m_pHalfEdge( 0 ), m_deleted( false ) +{ + m_pVertices[ 0 ] = m_pVertices[ 1 ] = m_pVertices[ 2 ] = 0; +} + +EpaFace::~EpaFace() +{ +} + +bool EpaFace::Initialize() +{ + assert( m_pHalfEdge && "Must setup half-edge first!" ); + + CollectVertices( m_pVertices ); + + const btVector3 e0 = m_pVertices[ 1 ]->m_point - m_pVertices[ 0 ]->m_point; + const btVector3 e1 = m_pVertices[ 2 ]->m_point - m_pVertices[ 0 ]->m_point; + + const btScalar e0Sqrd = e0.length2(); + const btScalar e1Sqrd = e1.length2(); + const btScalar e0e1 = e0.dot( e1 ); + + m_determinant = e0Sqrd * e1Sqrd - e0e1 * e0e1; + + const btScalar e0v0 = e0.dot( m_pVertices[ 0 ]->m_point ); + const btScalar e1v0 = e1.dot( m_pVertices[ 0 ]->m_point ); + + m_lambdas[ 0 ] = e0e1 * e1v0 - e1Sqrd * e0v0; + m_lambdas[ 1 ] = e0e1 * e0v0 - e0Sqrd * e1v0; + + if ( IsAffinelyDependent() ) + { + return false; + } + + CalcClosestPoint(); + +#ifdef EPA_POLYHEDRON_USE_PLANES + if ( !CalculatePlane() ) + { + return false; + } +#endif + + return true; +} + +#ifdef EPA_POLYHEDRON_USE_PLANES +bool EpaFace::CalculatePlane() +{ + assert( ( m_pVertices[ 0 ] && m_pVertices[ 1 ] && m_pVertices[ 2 ] ) + && "Must setup vertices pointers first!" ); + + // Traditional method + + const btVector3 v1 = m_pVertices[ 1 ]->m_point - m_pVertices[ 0 ]->m_point; + const btVector3 v2 = m_pVertices[ 2 ]->m_point - m_pVertices[ 0 ]->m_point; + + m_planeNormal = v2.cross( v1 ); + + if ( m_planeNormal.length2() == 0 ) + { + return false; + } + + m_planeNormal.normalize(); + + m_planeDistance = m_pVertices[ 0 ]->m_point.dot( -m_planeNormal ); + + // Robust method + + //btVector3 _v1 = m_pVertices[ 1 ]->m_point - m_pVertices[ 0 ]->m_point; + //btVector3 _v2 = m_pVertices[ 2 ]->m_point - m_pVertices[ 0 ]->m_point; + + //btVector3 n; + + //n = _v2.cross( _v1 ); + + //_v1 = m_pVertices[ 0 ]->m_point - m_pVertices[ 1 ]->m_point; + //_v2 = m_pVertices[ 2 ]->m_point - m_pVertices[ 1 ]->m_point; + + //n += ( _v1.cross( _v2 ) ); + + //_v1 = m_pVertices[ 0 ]->m_point - m_pVertices[ 2 ]->m_point; + //_v2 = m_pVertices[ 1 ]->m_point - m_pVertices[ 2 ]->m_point; + + //n += ( _v2.cross( _v1 ) ); + + //n /= 3; + //n.normalize(); + + //btVector3 c = ( m_pVertices[ 0 ]->m_point + m_pVertices[ 1 ]->m_point + m_pVertices[ 2 ]->m_point ) / 3; + //btScalar d = c.dot( -n ); + + //m_robustPlaneNormal = n; + //m_robustPlaneDistance = d; + + // Compare results from both methods and check whether they disagree + + //if ( d < 0 ) + //{ + // assert( ( m_planeDistance < 0 ) && "He he! Busted!" ); + //} + //else + //{ + // assert( ( m_planeDistance >= 0 ) && "He he! Busted!" ); + //} + + return true; +} +#endif + +void EpaFace::CalcClosestPoint() +{ + const btVector3 e0 = m_pVertices[ 1 ]->m_point - m_pVertices[ 0 ]->m_point; + const btVector3 e1 = m_pVertices[ 2 ]->m_point - m_pVertices[ 0 ]->m_point; + + m_v = m_pVertices[ 0 ]->m_point + + ( e0 * m_lambdas[ 0 ] + e1 * m_lambdas[ 1 ] ) / m_determinant; + + m_vSqrd = m_v.length2(); +} + +void EpaFace::CalcClosestPointOnA( btVector3& closestPointOnA ) +{ + const btVector3 e0 = m_pVertices[ 1 ]->m_wSupportPointOnA - m_pVertices[ 0 ]->m_wSupportPointOnA; + const btVector3 e1 = m_pVertices[ 2 ]->m_wSupportPointOnA - m_pVertices[ 0 ]->m_wSupportPointOnA; + + closestPointOnA = m_pVertices[ 0 ]->m_wSupportPointOnA + + ( e0 * m_lambdas[ 0 ] + e1 * m_lambdas[ 1 ] ) / + m_determinant; +} + +void EpaFace::CalcClosestPointOnB( btVector3& closestPointOnB ) +{ + const btVector3 e0 = m_pVertices[ 1 ]->m_wSupportPointOnB - m_pVertices[ 0 ]->m_wSupportPointOnB; + const btVector3 e1 = m_pVertices[ 2 ]->m_wSupportPointOnB - m_pVertices[ 0 ]->m_wSupportPointOnB; + + closestPointOnB = m_pVertices[ 0 ]->m_wSupportPointOnB + + ( e0 * m_lambdas[ 0 ] + e1 * m_lambdas[ 1 ] ) / + m_determinant; +} + +bool EpaFace::IsAffinelyDependent() const +{ + return ( m_determinant <= SIMD_EPSILON ); +} + +bool EpaFace::IsClosestPointInternal() const +{ + return ( ( m_lambdas[ 0 ] >= 0 ) && ( m_lambdas[ 1 ] >= 0 ) && ( ( m_lambdas[ 0 ] + m_lambdas[ 1 ] <= m_determinant ) ) ); +} + +void EpaFace::CollectVertices( EpaVertex** ppVertices ) +{ + assert( m_pHalfEdge && "Invalid half-edge pointer!" ); + + int vertexIndex = 0; + + EpaHalfEdge* pCurrentHalfEdge = m_pHalfEdge; + + do + { + assert( ( ( vertexIndex >= 0 ) && ( vertexIndex < 3 ) ) && + "Face is not a triangle!" ); + + assert( pCurrentHalfEdge->m_pVertex && "Half-edge has an invalid vertex pointer!" ); + + ppVertices[ vertexIndex++ ] = pCurrentHalfEdge->m_pVertex; + + pCurrentHalfEdge = pCurrentHalfEdge->m_pNextCCW; + + } + while( pCurrentHalfEdge != m_pHalfEdge ); +} + +//void EpaFace::FixOrder() +//{ +// EpaHalfEdge* pHalfEdges[ 3 ]; +// +// int halfEdgeIndex = 0; +// +// EpaHalfEdge* pCurrentHalfEdge = m_pHalfEdge; +// +// do +// { +// assert( ( ( halfEdgeIndex >= 0 ) && ( halfEdgeIndex < 3 ) ) && +// "Face is not a triangle!" ); +// +// pHalfEdges[ halfEdgeIndex++ ] = pCurrentHalfEdge; +// +// pCurrentHalfEdge = pCurrentHalfEdge->m_pNextCCW; +// } +// while( pCurrentHalfEdge != m_pHalfEdge ); +// +// EpaVertex* pVertices[ 3 ] = { pHalfEdges[ 0 ]->m_pVertex, +// pHalfEdges[ 1 ]->m_pVertex, +// pHalfEdges[ 2 ]->m_pVertex }; +// +// // Make them run in the opposite direction +// pHalfEdges[ 0 ]->m_pNextCCW = pHalfEdges[ 2 ]; +// pHalfEdges[ 1 ]->m_pNextCCW = pHalfEdges[ 0 ]; +// pHalfEdges[ 2 ]->m_pNextCCW = pHalfEdges[ 1 ]; +// +// // Make half-edges point to their correct origin vertices +// +// pHalfEdges[ 1 ]->m_pVertex = pVertices[ 2 ]; +// pHalfEdges[ 2 ]->m_pVertex = pVertices[ 0 ]; +// pHalfEdges[ 0 ]->m_pVertex = pVertices[ 1 ]; +// +// // Make vertices point to the correct half-edges +// +// //pHalfEdges[ 0 ]->m_pVertex->m_pHalfEdge = pHalfEdges[ 0 ]; +// //pHalfEdges[ 1 ]->m_pVertex->m_pHalfEdge = pHalfEdges[ 1 ]; +// //pHalfEdges[ 2 ]->m_pVertex->m_pHalfEdge = pHalfEdges[ 2 ]; +// +// // Flip normal and change the sign of plane distance +// +//#ifdef EPA_POLYHEDRON_USE_PLANES +// m_planeNormal = -m_planeNormal; +// m_planeDistance = -m_planeDistance; +//#endif +//} + diff --git a/BulletPhysics/bulletTrunk/Extras/EPA/EpaFace.h b/BulletPhysics/bulletTrunk/Extras/EPA/EpaFace.h new file mode 100644 index 00000000..3fe8d7d3 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/EPA/EpaFace.h @@ -0,0 +1,83 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +EPA Copyright (c) Ricardo Padrela 2006 + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ +#ifndef EPA_FACE_H +#define EPA_FACE_H + +class EpaVertex; +class EpaHalfEdge; + +#ifdef EPA_POLYHEDRON_USE_PLANES +extern btScalar PLANE_THICKNESS; +#endif + +//! Note : This class is not supposed to be a base class +class EpaFace +{ + private : + + //! Prevents copying objects from this class + EpaFace( const EpaFace& epaFace ); + const EpaFace& operator = ( const EpaFace& epaFace ); + + public : + + EpaFace(); + ~EpaFace(); + + bool Initialize(); + +#ifdef EPA_POLYHEDRON_USE_PLANES + bool CalculatePlane(); +#endif + void CalcClosestPoint(); + void CalcClosestPointOnA( btVector3& closestPointOnA ); + void CalcClosestPointOnB( btVector3& closestPointOnB ); + + bool IsAffinelyDependent() const; + bool IsClosestPointInternal() const; + + void CollectVertices( EpaVertex** ppVertices ); + + //void FixOrder(); + + public : + + EpaHalfEdge* m_pHalfEdge; + + // We keep vertices here so we don't need to call CollectVertices + // every time we need them + EpaVertex* m_pVertices[ 3 ]; + +#ifdef EPA_POLYHEDRON_USE_PLANES + btVector3 m_planeNormal; + btScalar m_planeDistance; + + //btVector3 m_robustPlaneNormal; + //btScalar m_robustPlaneDistance; +#endif + + btVector3 m_v; + btScalar m_vSqrd; + + btScalar m_determinant; + btScalar m_lambdas[ 2 ]; + + bool m_deleted; +}; + +#endif + diff --git a/BulletPhysics/bulletTrunk/Extras/EPA/EpaHalfEdge.h b/BulletPhysics/bulletTrunk/Extras/EPA/EpaHalfEdge.h new file mode 100644 index 00000000..db38356c --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/EPA/EpaHalfEdge.h @@ -0,0 +1,58 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +EPA Copyright (c) Ricardo Padrela 2006 + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ +#ifndef EPA_HALF_EDGE_H +#define EPA_HALF_EDGE_H + +class EpaFace; +class EpaVertex; + +//! Note : This class is not supposed to be a base class +class EpaHalfEdge +{ + private : + + //! Prevents copying objects from this class + EpaHalfEdge( const EpaHalfEdge& epaHalfEdge ); + const EpaHalfEdge& operator = ( const EpaHalfEdge& epaHalfEdge ); + + public : + + EpaHalfEdge() : m_pTwin( 0 ), m_pNextCCW( 0 ), m_pFace( 0 ), m_pVertex( 0 ) + { + } + + ~EpaHalfEdge() + { + } + + public : + + //! Twin half-edge link + EpaHalfEdge* m_pTwin; + + //! Next half-edge in counter clock-wise ( CCW ) order + EpaHalfEdge* m_pNextCCW; + + //! Parent face link + EpaFace* m_pFace; + + //! Origin vertex link + EpaVertex* m_pVertex; +}; + +#endif + diff --git a/BulletPhysics/bulletTrunk/Extras/EPA/EpaPenetrationDepthSolver.cpp b/BulletPhysics/bulletTrunk/Extras/EPA/EpaPenetrationDepthSolver.cpp new file mode 100644 index 00000000..c2fae152 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/EPA/EpaPenetrationDepthSolver.cpp @@ -0,0 +1,202 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +EPA Copyright (c) Ricardo Padrela 2006 + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ +#include "LinearMath/btScalar.h" +#include "LinearMath/btVector3.h" +#include "LinearMath/btPoint3.h" +#include "LinearMath/btTransform.h" +#include "LinearMath/btMinMax.h" + +#include + +#include "BulletCollision/CollisionShapes/btConvexShape.h" + +#include "BulletCollision/NarrowPhaseCollision/btSimplexSolverInterface.h" + +#include "EpaCommon.h" + +#include "EpaVertex.h" +#include "EpaHalfEdge.h" +#include "EpaFace.h" +#include "EpaPolyhedron.h" +#include "Epa.h" +#include "BulletCollision/NarrowPhaseCollision/btConvexPenetrationDepthSolver.h" +#include "EpaPenetrationDepthSolver.h" + +btScalar g_GJKMaxRelError = 1e-3f; +btScalar g_GJKMaxRelErrorSqrd = g_GJKMaxRelError * g_GJKMaxRelError; + +bool EpaPenetrationDepthSolver::calcPenDepth( btSimplexSolverInterface& simplexSolver, + btConvexShape* pConvexA, btConvexShape* pConvexB, + const btTransform& transformA, const btTransform& transformB, + btVector3& v, btPoint3& wWitnessOnA, btPoint3& wWitnessOnB, + class btIDebugDraw* debugDraw,btStackAlloc* stackAlloc ) +{ + EPA_DEBUG_ASSERT( pConvexA ,"Convex shape A is invalid!" ); + EPA_DEBUG_ASSERT( pConvexB ,"Convex shape B is invalid!" ); + + btScalar penDepth; + +#ifdef EPA_USE_HYBRID + bool needsEPA = !HybridPenDepth( simplexSolver, pConvexA, pConvexB, transformA, transformB, + wWitnessOnA, wWitnessOnB, penDepth, v ); + + if ( needsEPA ) + { +#endif + penDepth = EpaPenDepth( simplexSolver, pConvexA, pConvexB, + transformA, transformB, + wWitnessOnA, wWitnessOnB ); + EPA_DEBUG_ASSERT( ( penDepth > 0 ) ,"EPA or Hybrid Technique failed to calculate penetration depth!" ); + +#ifdef EPA_USE_HYBRID + } +#endif + + return ( penDepth > 0 ); +} + +#ifdef EPA_USE_HYBRID +bool EpaPenetrationDepthSolver::HybridPenDepth( btSimplexSolverInterface& simplexSolver, + btConvexShape* pConvexA, btConvexShape* pConvexB, + const btTransform& transformA, const btTransform& transformB, + btPoint3& wWitnessOnA, btPoint3& wWitnessOnB, + btScalar& penDepth, btVector3& v ) +{ + btScalar squaredDistance = SIMD_INFINITY; + btScalar delta = 0.f; + + const btScalar margin = pConvexA->getMargin() + pConvexB->getMargin(); + const btScalar marginSqrd = margin * margin; + + simplexSolver.reset(); + + int nbIterations = 0; + + while ( true ) + { + assert( ( v.length2() > 0 ) && "Warning: v is the zero vector!" ); + + btVector3 seperatingAxisInA = -v * transformA.getBasis(); + btVector3 seperatingAxisInB = v * transformB.getBasis(); + + btVector3 pInA = pConvexA->localGetSupportingVertexWithoutMargin( seperatingAxisInA ); + btVector3 qInB = pConvexB->localGetSupportingVertexWithoutMargin( seperatingAxisInB ); + + btPoint3 pWorld = transformA( pInA ); + btPoint3 qWorld = transformB( qInB ); + + btVector3 w = pWorld - qWorld; + delta = v.dot( w ); + + // potential exit, they don't overlap + if ( ( delta > 0 ) && ( ( delta * delta / squaredDistance ) > marginSqrd ) ) + { + // Convex shapes do not overlap + // Returning true means that Hybrid's result is ok and there's no need to run EPA + penDepth = 0; + return true; + } + + //exit 0: the new point is already in the simplex, or we didn't come any closer + if ( ( squaredDistance - delta <= squaredDistance * g_GJKMaxRelErrorSqrd ) || simplexSolver.inSimplex( w ) ) + { + simplexSolver.compute_points( wWitnessOnA, wWitnessOnB ); + + assert( ( squaredDistance > 0 ) && "squaredDistance is zero!" ); + btScalar vLength = sqrt( squaredDistance ); + + wWitnessOnA -= v * ( pConvexA->getMargin() / vLength ); + wWitnessOnB += v * ( pConvexB->getMargin() / vLength ); + + penDepth = pConvexA->getMargin() + pConvexB->getMargin() - vLength; + + // Returning true means that Hybrid's result is ok and there's no need to run EPA + return true; + } + + //add current vertex to simplex + simplexSolver.addVertex( w, pWorld, qWorld ); + + //calculate the closest point to the origin (update vector v) + if ( !simplexSolver.closest( v ) ) + { + simplexSolver.compute_points( wWitnessOnA, wWitnessOnB ); + + assert( ( squaredDistance > 0 ) && "squaredDistance is zero!" ); + btScalar vLength = sqrt( squaredDistance ); + + wWitnessOnA -= v * ( pConvexA->getMargin() / vLength ); + wWitnessOnB += v * ( pConvexB->getMargin() / vLength ); + + penDepth = pConvexA->getMargin() + pConvexB->getMargin() - vLength; + + // Returning true means that Hybrid's result is ok and there's no need to run EPA + return true; + } + + btScalar previousSquaredDistance = squaredDistance; + squaredDistance = v.length2(); + + //are we getting any closer ? + if ( previousSquaredDistance - squaredDistance <= SIMD_EPSILON * previousSquaredDistance ) + { + simplexSolver.backup_closest( v ); + squaredDistance = v.length2(); + + simplexSolver.compute_points( wWitnessOnA, wWitnessOnB ); + + assert( ( squaredDistance > 0 ) && "squaredDistance is zero!" ); + btScalar vLength = sqrt( squaredDistance ); + + wWitnessOnA -= v * ( pConvexA->getMargin() / vLength ); + wWitnessOnB += v * ( pConvexB->getMargin() / vLength ); + + penDepth = pConvexA->getMargin() + pConvexB->getMargin() - vLength; + + // Returning true means that Hybrid's result is ok and there's no need to run EPA + return true; + } + + if ( simplexSolver.fullSimplex() || ( squaredDistance <= SIMD_EPSILON * simplexSolver.maxVertex() ) ) + { + // Convex Shapes intersect - we need to run EPA + // Returning false means that Hybrid couldn't do anything for us + // and that we need to run EPA to calculate the pen depth + return false; + } + + ++nbIterations; + } +} +#endif + +btScalar EpaPenetrationDepthSolver::EpaPenDepth( btSimplexSolverInterface& simplexSolver, + btConvexShape* pConvexA, btConvexShape* pConvexB, + const btTransform& transformA, const btTransform& transformB, + btPoint3& wWitnessOnA, btPoint3& wWitnessOnB ) +{ + Epa epa( pConvexA, pConvexB, transformA, transformB ); + + if ( !epa.Initialize( simplexSolver ) ) + { + EPA_DEBUG_ASSERT( false ,"Epa failed to initialize!" ); + return 0; + } + + return epa.calcPenDepth( wWitnessOnA, wWitnessOnB ); +} + diff --git a/BulletPhysics/bulletTrunk/Extras/EPA/EpaPenetrationDepthSolver.h b/BulletPhysics/bulletTrunk/Extras/EPA/EpaPenetrationDepthSolver.h new file mode 100644 index 00000000..8ce89500 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/EPA/EpaPenetrationDepthSolver.h @@ -0,0 +1,56 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +EPA Copyright (c) Ricardo Padrela 2006 + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ +#ifndef EPA2_PENETRATION_DEPTH_H +#define EPA2_PENETRATION_DEPTH_H + +/** +* EpaPenetrationDepthSolver uses the Expanding Polytope Algorithm to +* calculate the penetration depth between two convex shapes. +*/ + +extern btScalar g_GJKMaxRelError; +extern btScalar g_GJKMaxRelErrorSqrd; + +//! Note : This class is not supposed to be a base class +class EpaPenetrationDepthSolver : public btConvexPenetrationDepthSolver +{ + public : + + bool calcPenDepth( btSimplexSolverInterface& simplexSolver, + btConvexShape* pConvexA, btConvexShape* pConvexB, + const btTransform& transformA, const btTransform& transformB, + btVector3& v, btPoint3& wWitnessOnA, btPoint3& wWitnessOnB, + class btIDebugDraw* debugDraw,btStackAlloc* stackAlloc ); + + private : + +#ifdef EPA_USE_HYBRID + bool HybridPenDepth( btSimplexSolverInterface& simplexSolver, + btConvexShape* pConvexA, btConvexShape* pConvexB, + const btTransform& transformA, const btTransform& transformB, + btPoint3& wWitnessOnA, btPoint3& wWitnessOnB, + btScalar& penDepth, btVector3& v ); +#endif + + btScalar EpaPenDepth( btSimplexSolverInterface& simplexSolver, + btConvexShape* pConvexA, btConvexShape* pConvexB, + const btTransform& transformA, const btTransform& transformB, + btPoint3& wWitnessOnA, btPoint3& wWitnessOnB ); +}; + +#endif // EPA_PENETRATION_DEPTH_H + diff --git a/BulletPhysics/bulletTrunk/Extras/EPA/EpaPolyhedron.cpp b/BulletPhysics/bulletTrunk/Extras/EPA/EpaPolyhedron.cpp new file mode 100644 index 00000000..6fe55baa --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/EPA/EpaPolyhedron.cpp @@ -0,0 +1,1026 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +EPA Copyright (c) Ricardo Padrela 2006 + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ +#include "LinearMath/btScalar.h" +#include "LinearMath/btVector3.h" +#include "LinearMath/btPoint3.h" +//#include "Memory2.h" + +#include +#ifdef _DEBUG +#include +#endif + + +#include "EpaCommon.h" + +#include "EpaVertex.h" +#include "EpaHalfEdge.h" +#include "EpaFace.h" +#include "EpaPolyhedron.h" + + +EpaPolyhedron::EpaPolyhedron() : m_nbFaces( 0 ) +{ +} + +EpaPolyhedron::~EpaPolyhedron() +{ + Destroy(); +} + +bool EpaPolyhedron::Create( btPoint3* pInitialPoints, + btPoint3* pSupportPointsOnA, btPoint3* pSupportPointsOnB, + const int nbInitialPoints ) +{ +#ifndef EPA_POLYHEDRON_USE_PLANES + EPA_DEBUG_ASSERT( ( nbInitialPoints <= 4 ) ,"nbInitialPoints greater than 4!" ); +#endif + + if ( nbInitialPoints < 4 ) + { + // Insufficient nb of points + return false; + } + + //////////////////////////////////////////////////////////////////////////////// + +#ifdef EPA_POLYHEDRON_USE_PLANES + int nbDiffCoords[ 3 ] = { 0, 0, 0 }; + + bool* pDiffCoords = new bool[ 3 * nbInitialPoints ]; + + + int i; + for (i=0;i nbDiffCoords[ i + 1 ] ) + { + int tmp = nbDiffCoords[ i ]; + nbDiffCoords[ i ] = nbDiffCoords[ i + 1 ]; + nbDiffCoords[ i + 1 ] = tmp; + + tmp = axisOrderIndices[ i ]; + axisOrderIndices[ i ] = axisOrderIndices[ i + 1 ]; + axisOrderIndices[ i + 1 ] = tmp; + } + } + + int nbSuccessfullAxis = 0; + + // The axes with less different coordinates choose first + int minsIndices[ 3 ] = { -1, -1, -1 }; + int maxsIndices[ 3 ] = { -1, -1, -1 }; + + int finalPointsIndex = 0; + + for ( axis = 0; ( axis < 3 ) && ( nbSuccessfullAxis < 2 ); ++axis ) + { + int axisIndex = axisOrderIndices[ axis ]; + + btScalar axisMin = SIMD_INFINITY; + btScalar axisMax = -SIMD_INFINITY; + + for ( int i = 0; i < 4; ++i ) + { + // Among the diff coords pick the min and max coords + + if ( pDiffCoords[ axisIndex * nbInitialPoints + i ] ) + { + if ( pInitialPoints[ i ][ axisIndex ] < axisMin ) + { + axisMin = pInitialPoints[ i ][ axisIndex ]; + minsIndices[ axisIndex ] = i; + } + + if ( pInitialPoints[ i ][ axisIndex ] > axisMax ) + { + axisMax = pInitialPoints[ i ][ axisIndex ]; + maxsIndices[ axisIndex ] = i; + } + } + } + + //assert( ( minsIndices[ axisIndex ] != maxsIndices[ axisIndex ] ) && + // "min and max have the same index!" ); + + if ( ( minsIndices[ axisIndex ] != -1 ) && ( maxsIndices[ axisIndex ] != -1 ) && + ( minsIndices[ axisIndex ] != maxsIndices[ axisIndex ] ) ) + { + ++nbSuccessfullAxis; + + finalPointsIndices[ finalPointsIndex++ ] = minsIndices[ axisIndex ]; + finalPointsIndices[ finalPointsIndex++ ] = maxsIndices[ axisIndex ]; + + // Make the choosen points to be impossible for other axes to choose + + //assert( ( minsIndices[ axisIndex ] != -1 ) && "Invalid index!" ); + //assert( ( maxsIndices[ axisIndex ] != -1 ) && "Invalid index!" ); + + for ( int i = 0; i < 3; ++i ) + { + pDiffCoords[ i * nbInitialPoints + minsIndices[ axisIndex ] ] = false; + pDiffCoords[ i * nbInitialPoints + maxsIndices[ axisIndex ] ] = false; + } + } + } + + if ( nbSuccessfullAxis <= 1 ) + { + // Degenerate input ? + EPA_DEBUG_ASSERT( false ,"nbSuccessfullAxis must be greater than 1!" ); + return false; + } + + delete[] pDiffCoords; +#endif + + ////////////////////////////////////////////////////////////////////////// + +#ifdef EPA_POLYHEDRON_USE_PLANES + btVector3 v0 = pInitialPoints[ finalPointsIndices[ 1 ] ] - pInitialPoints[ finalPointsIndices[ 0 ] ]; + btVector3 v1 = pInitialPoints[ finalPointsIndices[ 2 ] ] - pInitialPoints[ finalPointsIndices[ 0 ] ]; +#else + btVector3 v0 = pInitialPoints[ 1 ] - pInitialPoints[ 0 ]; + btVector3 v1 = pInitialPoints[ 2 ] - pInitialPoints[ 0 ]; +#endif + + btVector3 planeNormal = v1.cross( v0 ); + planeNormal.normalize(); + +#ifdef EPA_POLYHEDRON_USE_PLANES + btScalar planeDistance = pInitialPoints[ finalPointsIndices[ 0 ] ].dot( -planeNormal ); +#else + btScalar planeDistance = pInitialPoints[ 0 ].dot( -planeNormal ); +#endif + +#ifdef EPA_POLYHEDRON_USE_PLANES + bool pointOnPlane0 = btEqual( pInitialPoints[ finalPointsIndices[ 0 ] ].dot( planeNormal ) + planeDistance, PLANE_THICKNESS ); + if (!pointOnPlane0) + { + EPA_DEBUG_ASSERT(0,"Point0 should be on plane!"); + return false; + } + bool pointOnPlane1 = btEqual( pInitialPoints[ finalPointsIndices[ 1 ] ].dot( planeNormal ) + planeDistance, PLANE_THICKNESS ); + if (!pointOnPlane1) + { + EPA_DEBUG_ASSERT(0,"Point1 should be on plane!"); + return false; + } + bool pointOnPlane2 = btEqual( pInitialPoints[ finalPointsIndices[ 2 ] ].dot( planeNormal ) + planeDistance, PLANE_THICKNESS ); + if (!pointOnPlane2) + { + EPA_DEBUG_ASSERT(0,"Point2 should be on plane!"); + return false; + } +#endif + +#ifndef EPA_POLYHEDRON_USE_PLANES + { + if ( planeDistance > 0 ) + { + btVector3 tmp = pInitialPoints[ 1 ]; + pInitialPoints[ 1 ] = pInitialPoints[ 2 ]; + pInitialPoints[ 2 ] = tmp; + + tmp = pSupportPointsOnA[ 1 ]; + pSupportPointsOnA[ 1 ] = pSupportPointsOnA[ 2 ]; + pSupportPointsOnA[ 2 ] = tmp; + + tmp = pSupportPointsOnB[ 1 ]; + pSupportPointsOnB[ 1 ] = pSupportPointsOnB[ 2 ]; + pSupportPointsOnB[ 2 ] = tmp; + } + } + + EpaVertex* pVertexA = CreateVertex( pInitialPoints[ 0 ], pSupportPointsOnA[ 0 ], pSupportPointsOnB[ 0 ] ); + EpaVertex* pVertexB = CreateVertex( pInitialPoints[ 1 ], pSupportPointsOnA[ 1 ], pSupportPointsOnB[ 1 ] ); + EpaVertex* pVertexC = CreateVertex( pInitialPoints[ 2 ], pSupportPointsOnA[ 2 ], pSupportPointsOnB[ 2 ] ); + EpaVertex* pVertexD = CreateVertex( pInitialPoints[ 3 ], pSupportPointsOnA[ 3 ], pSupportPointsOnB[ 3 ] ); +#else + finalPointsIndices[ 3 ] = -1; + + btScalar absMaxDist = -SIMD_INFINITY; + btScalar maxDist; + + for ( int pointIndex = 0; pointIndex < nbInitialPoints; ++pointIndex ) + { + btScalar dist = planeNormal.dot( pInitialPoints[ pointIndex ] ) + planeDistance; + btScalar absDist = abs( dist ); + + if ( ( absDist > absMaxDist ) && + !btEqual( dist, PLANE_THICKNESS ) ) + { + absMaxDist = absDist; + maxDist = dist; + finalPointsIndices[ 3 ] = pointIndex; + } + } + + if ( finalPointsIndices[ 3 ] == -1 ) + { + Destroy(); + return false; + } + + if ( maxDist > PLANE_THICKNESS ) + { + // Can swap indices only + + btPoint3 tmp = pInitialPoints[ finalPointsIndices[ 1 ] ]; + pInitialPoints[ finalPointsIndices[ 1 ] ] = pInitialPoints[ finalPointsIndices[ 2 ] ]; + pInitialPoints[ finalPointsIndices[ 2 ] ] = tmp; + + tmp = pSupportPointsOnA[ finalPointsIndices[ 1 ] ]; + pSupportPointsOnA[ finalPointsIndices[ 1 ] ] = pSupportPointsOnA[ finalPointsIndices[ 2 ] ]; + pSupportPointsOnA[ finalPointsIndices[ 2 ] ] = tmp; + + tmp = pSupportPointsOnB[ finalPointsIndices[ 1 ] ]; + pSupportPointsOnB[ finalPointsIndices[ 1 ] ] = pSupportPointsOnB[ finalPointsIndices[ 2 ] ]; + pSupportPointsOnB[ finalPointsIndices[ 2 ] ] = tmp; + } + + EpaVertex* pVertexA = CreateVertex( pInitialPoints[ finalPointsIndices[ 0 ] ], pSupportPointsOnA[ finalPointsIndices[ 0 ] ], pSupportPointsOnB[ finalPointsIndices[ 0 ] ] ); + EpaVertex* pVertexB = CreateVertex( pInitialPoints[ finalPointsIndices[ 1 ] ], pSupportPointsOnA[ finalPointsIndices[ 1 ] ], pSupportPointsOnB[ finalPointsIndices[ 1 ] ] ); + EpaVertex* pVertexC = CreateVertex( pInitialPoints[ finalPointsIndices[ 2 ] ], pSupportPointsOnA[ finalPointsIndices[ 2 ] ], pSupportPointsOnB[ finalPointsIndices[ 2 ] ] ); + EpaVertex* pVertexD = CreateVertex( pInitialPoints[ finalPointsIndices[ 3 ] ], pSupportPointsOnA[ finalPointsIndices[ 3 ] ], pSupportPointsOnB[ finalPointsIndices[ 3 ] ] ); +#endif + + EpaFace* pFaceA = CreateFace(); + EpaFace* pFaceB = CreateFace(); + EpaFace* pFaceC = CreateFace(); + EpaFace* pFaceD = CreateFace(); + + EpaHalfEdge* pFaceAHalfEdges[ 3 ]; + EpaHalfEdge* pFaceCHalfEdges[ 3 ]; + EpaHalfEdge* pFaceBHalfEdges[ 3 ]; + EpaHalfEdge* pFaceDHalfEdges[ 3 ]; + + pFaceAHalfEdges[ 0 ] = CreateHalfEdge(); + pFaceAHalfEdges[ 1 ] = CreateHalfEdge(); + pFaceAHalfEdges[ 2 ] = CreateHalfEdge(); + + pFaceBHalfEdges[ 0 ] = CreateHalfEdge(); + pFaceBHalfEdges[ 1 ] = CreateHalfEdge(); + pFaceBHalfEdges[ 2 ] = CreateHalfEdge(); + + pFaceCHalfEdges[ 0 ] = CreateHalfEdge(); + pFaceCHalfEdges[ 1 ] = CreateHalfEdge(); + pFaceCHalfEdges[ 2 ] = CreateHalfEdge(); + + pFaceDHalfEdges[ 0 ] = CreateHalfEdge(); + pFaceDHalfEdges[ 1 ] = CreateHalfEdge(); + pFaceDHalfEdges[ 2 ] = CreateHalfEdge(); + + pFaceA->m_pHalfEdge = pFaceAHalfEdges[ 0 ]; + pFaceB->m_pHalfEdge = pFaceBHalfEdges[ 0 ]; + pFaceC->m_pHalfEdge = pFaceCHalfEdges[ 0 ]; + pFaceD->m_pHalfEdge = pFaceDHalfEdges[ 0 ]; + + pFaceAHalfEdges[ 0 ]->m_pNextCCW = pFaceAHalfEdges[ 1 ]; + pFaceAHalfEdges[ 1 ]->m_pNextCCW = pFaceAHalfEdges[ 2 ]; + pFaceAHalfEdges[ 2 ]->m_pNextCCW = pFaceAHalfEdges[ 0 ]; + + pFaceBHalfEdges[ 0 ]->m_pNextCCW = pFaceBHalfEdges[ 1 ]; + pFaceBHalfEdges[ 1 ]->m_pNextCCW = pFaceBHalfEdges[ 2 ]; + pFaceBHalfEdges[ 2 ]->m_pNextCCW = pFaceBHalfEdges[ 0 ]; + + pFaceCHalfEdges[ 0 ]->m_pNextCCW = pFaceCHalfEdges[ 1 ]; + pFaceCHalfEdges[ 1 ]->m_pNextCCW = pFaceCHalfEdges[ 2 ]; + pFaceCHalfEdges[ 2 ]->m_pNextCCW = pFaceCHalfEdges[ 0 ]; + + pFaceDHalfEdges[ 0 ]->m_pNextCCW = pFaceDHalfEdges[ 1 ]; + pFaceDHalfEdges[ 1 ]->m_pNextCCW = pFaceDHalfEdges[ 2 ]; + pFaceDHalfEdges[ 2 ]->m_pNextCCW = pFaceDHalfEdges[ 0 ]; + + + pFaceAHalfEdges[ 0 ]->m_pFace = pFaceA; + pFaceAHalfEdges[ 1 ]->m_pFace = pFaceA; + pFaceAHalfEdges[ 2 ]->m_pFace = pFaceA; + + pFaceBHalfEdges[ 0 ]->m_pFace = pFaceB; + pFaceBHalfEdges[ 1 ]->m_pFace = pFaceB; + pFaceBHalfEdges[ 2 ]->m_pFace = pFaceB; + + pFaceCHalfEdges[ 0 ]->m_pFace = pFaceC; + pFaceCHalfEdges[ 1 ]->m_pFace = pFaceC; + pFaceCHalfEdges[ 2 ]->m_pFace = pFaceC; + + pFaceDHalfEdges[ 0 ]->m_pFace = pFaceD; + pFaceDHalfEdges[ 1 ]->m_pFace = pFaceD; + pFaceDHalfEdges[ 2 ]->m_pFace = pFaceD; + + + pFaceAHalfEdges[ 0 ]->m_pVertex = pVertexA; + pFaceAHalfEdges[ 1 ]->m_pVertex = pVertexB; + pFaceAHalfEdges[ 2 ]->m_pVertex = pVertexC; + + pFaceBHalfEdges[ 0 ]->m_pVertex = pVertexB; + pFaceBHalfEdges[ 1 ]->m_pVertex = pVertexD; + pFaceBHalfEdges[ 2 ]->m_pVertex = pVertexC; + + pFaceCHalfEdges[ 0 ]->m_pVertex = pVertexD; + pFaceCHalfEdges[ 1 ]->m_pVertex = pVertexA; + pFaceCHalfEdges[ 2 ]->m_pVertex = pVertexC; + + pFaceDHalfEdges[ 0 ]->m_pVertex = pVertexB; + pFaceDHalfEdges[ 1 ]->m_pVertex = pVertexA; + pFaceDHalfEdges[ 2 ]->m_pVertex = pVertexD; + + //pVertexA->m_pHalfEdge = pFaceAHalfEdges[ 0 ]; + //pVertexB->m_pHalfEdge = pFaceAHalfEdges[ 1 ]; + //pVertexC->m_pHalfEdge = pFaceAHalfEdges[ 2 ]; + //pVertexD->m_pHalfEdge = pFaceBHalfEdges[ 1 ]; + + pFaceAHalfEdges[ 0 ]->m_pTwin = pFaceDHalfEdges[ 0 ]; + pFaceAHalfEdges[ 1 ]->m_pTwin = pFaceBHalfEdges[ 2 ]; + pFaceAHalfEdges[ 2 ]->m_pTwin = pFaceCHalfEdges[ 1 ]; + + pFaceBHalfEdges[ 0 ]->m_pTwin = pFaceDHalfEdges[ 2 ]; + pFaceBHalfEdges[ 1 ]->m_pTwin = pFaceCHalfEdges[ 2 ]; + pFaceBHalfEdges[ 2 ]->m_pTwin = pFaceAHalfEdges[ 1 ]; + + pFaceCHalfEdges[ 0 ]->m_pTwin = pFaceDHalfEdges[ 1 ]; + pFaceCHalfEdges[ 1 ]->m_pTwin = pFaceAHalfEdges[ 2 ]; + pFaceCHalfEdges[ 2 ]->m_pTwin = pFaceBHalfEdges[ 1 ]; + + pFaceDHalfEdges[ 0 ]->m_pTwin = pFaceAHalfEdges[ 0 ]; + pFaceDHalfEdges[ 1 ]->m_pTwin = pFaceCHalfEdges[ 0 ]; + pFaceDHalfEdges[ 2 ]->m_pTwin = pFaceBHalfEdges[ 0 ]; + + if ( !pFaceA->Initialize() || !pFaceB->Initialize() || + !pFaceC->Initialize() || !pFaceD->Initialize() ) + { + EPA_DEBUG_ASSERT( false, "One initial face failed to initialize!" ); + return false; + } + +#ifdef EPA_POLYHEDRON_USE_PLANES + if ( nbInitialPoints > 4 ) + { + for ( int i = 0; i < nbInitialPoints; ++i ) + { + if ( ( i != finalPointsIndices[ 0 ] ) && ( i != finalPointsIndices[ 1 ] ) && + ( i != finalPointsIndices[ 2 ] ) && ( i != finalPointsIndices[ 3 ] ) ) + { + std::list< EpaFace* >::iterator facesItr( m_faces.begin() ); + + while ( facesItr != m_faces.end() ) + { + EpaFace* pFace = *facesItr; + + btScalar dist = pFace->m_planeNormal.dot( pInitialPoints[ i ] ) + pFace->m_planeDistance; + + if ( dist > PLANE_THICKNESS ) + { + std::list< EpaFace* > newFaces; + + bool expandOk = Expand( pInitialPoints[ i ], pSupportPointsOnA[ i ], pSupportPointsOnB[ i ], + pFace, newFaces ); + + if ( !expandOk ) + { + // One or more new faces are affinely dependent + return false; + } + + EPA_DEBUG_ASSERT( !newFaces.empty() ,"Polyhedron should have expanded!" ); + + break; + } + + ++facesItr; + } + } + } + } +#endif + + return true; +} + +void EpaPolyhedron::Destroy() +{ + DestroyAllVertices(); + + DestroyAllHalfEdges(); + + DestroyAllFaces(); +} + +EpaFace* EpaPolyhedron::CreateFace() +{ + EpaFace* pNewFace = new EpaFace(); + EPA_DEBUG_ASSERT( pNewFace , "Failed to allocate memory for a new EpaFace!" ); + + m_faces.push_back( pNewFace ); + + ++m_nbFaces; + + return pNewFace; +} + +EpaHalfEdge* EpaPolyhedron::CreateHalfEdge() +{ + EpaHalfEdge* pNewHalfEdge = new EpaHalfEdge(); + EPA_DEBUG_ASSERT( pNewHalfEdge ,"Failed to allocate memory for a new EpaHalfEdge!" ); + + m_halfEdges.push_back( pNewHalfEdge ); + + return pNewHalfEdge; +} + +EpaVertex* EpaPolyhedron::CreateVertex( const btPoint3& wSupportPoint, + const btPoint3& wSupportPointOnA, + const btPoint3& wSupportPointOnB ) +{ + EpaVertex* pNewVertex = new EpaVertex( wSupportPoint, wSupportPointOnA, wSupportPointOnB ); + EPA_DEBUG_ASSERT( pNewVertex ,"Failed to allocate memory for a new EpaVertex!" ); + + m_vertices.push_back( pNewVertex ); + + return pNewVertex; +} + +void EpaPolyhedron::DeleteFace( EpaFace* pFace ) +{ + pFace->m_deleted = true; + --m_nbFaces; +} + +void EpaPolyhedron::DestroyAllFaces() +{ + while ( !m_faces.empty() ) + { + EpaFace* pFace = m_faces.front(); + + delete pFace; + + m_faces.pop_front(); + } + + m_nbFaces = 0; +} + +void EpaPolyhedron::DestroyAllHalfEdges() +{ + while ( !m_halfEdges.empty() ) + { + EpaHalfEdge* pHalfEdge = m_halfEdges.front(); + + delete pHalfEdge; + + m_halfEdges.pop_front(); + } +} + +void EpaPolyhedron::DestroyAllVertices() +{ + while ( !m_vertices.empty() ) + { + EpaVertex* pVertex = m_vertices.front(); + + delete pVertex; + + m_vertices.pop_front(); + } +} + +bool EpaPolyhedron::Expand( const btPoint3& wSupportPoint, + const btPoint3& wSupportPointOnA, + const btPoint3& wSupportPointOnB, + EpaFace* pFace, std::list< EpaFace* >& newFaces ) +{ + EPA_DEBUG_ASSERT( !pFace->m_deleted ,"Face is already deleted!" ); + EPA_DEBUG_ASSERT( newFaces.empty() ,"NewFaces list must be empty!" ); + + EPA_DEBUG_ASSERT( !pFace->m_deleted ,"Cannot expand deleted face!" ); + + // wSupportPoint must be front of face's plane used to do the expansion + +#ifdef EPA_POLYHEDRON_USE_PLANES + btScalar dist = pFace->m_planeNormal.dot( wSupportPoint ) + pFace->m_planeDistance; + if ( dist <= PLANE_THICKNESS ) + { + return false; + } +#endif + + std::list< EpaHalfEdge* > coneBaseEdges; + DeleteVisibleFaces( wSupportPoint, pFace, coneBaseEdges ); + + EPA_DEBUG_ASSERT( ( coneBaseEdges.size() >= 3 ) ,"Cone base must have at least 3 edges!" ); + + EpaVertex* pConeAppex = CreateVertex( wSupportPoint, wSupportPointOnA, wSupportPointOnB ); + EPA_DEBUG_ASSERT( pConeAppex ,"Failed to create vertex!" ); + + CreateCone( pConeAppex, coneBaseEdges, newFaces ); + + // Initialize new faces + + std::list< EpaFace* >::iterator newFacesItr( newFaces.begin() ); + + while ( newFacesItr != newFaces.end() ) + { + EpaFace* pNewFace = *newFacesItr; + + if ( !pNewFace->Initialize() ) + { + return false; + } + + ++newFacesItr; + } + + return true; +} + +std::list< EpaFace* >& EpaPolyhedron::GetFaces() +{ + return m_faces; +} + +int EpaPolyhedron::GetNbFaces() const +{ + return m_faces.size(); +} + +void EpaPolyhedron::DeleteVisibleFaces( const btPoint3& point, EpaFace* pFace, + std::list< EpaHalfEdge* >& coneBaseTwinHalfEdges ) +{ + EPA_DEBUG_ASSERT( !pFace->m_deleted ,"Face is already deleted!" ); + + DeleteFace( pFace ); + + EpaHalfEdge* pCurrentHalfEdge = pFace->m_pHalfEdge; + + do + { + EPA_DEBUG_ASSERT( pCurrentHalfEdge->m_pTwin ,"Half-edge without a twin!" ); + + EpaFace* pAdjacentFace = pCurrentHalfEdge->m_pTwin->m_pFace; + EPA_DEBUG_ASSERT( pAdjacentFace ,"Invalid adjacent face!" ); + + if ( !pAdjacentFace->m_deleted ) + { +#ifdef EPA_POLYHEDRON_USE_PLANES + EPA_DEBUG_ASSERT( ( pAdjacentFace->m_planeNormal.length2() > 0 ) ,"Invalid plane!" ); + + btScalar pointDist = pAdjacentFace->m_planeNormal.dot( point ) + + pAdjacentFace->m_planeDistance; + + if ( pointDist > PLANE_THICKNESS ) +#else + btScalar dot = pAdjacentFace->m_v.dot( point ); + if ( dot >= pAdjacentFace->m_vSqrd ) +#endif + { + DeleteVisibleFaces( point, pAdjacentFace, coneBaseTwinHalfEdges ); + } + else + { + coneBaseTwinHalfEdges.push_back( pCurrentHalfEdge->m_pTwin ); + } + } + + pCurrentHalfEdge = pCurrentHalfEdge->m_pNextCCW; + } + while( pCurrentHalfEdge != pFace->m_pHalfEdge ); +} + +void EpaPolyhedron::CreateCone( EpaVertex* pAppexVertex, std::list< EpaHalfEdge* >& baseTwinHalfEdges, + std::list< EpaFace* >& newFaces ) +{ + EPA_DEBUG_ASSERT( ( baseTwinHalfEdges.size() >= 3 ) ,"DeleteVisibleFaces method didn't do its job right!" ); + + std::list< EpaHalfEdge* >::iterator baseHalfEdgesItr( baseTwinHalfEdges.begin() ); + std::list< EpaHalfEdge* > halfEdgesToLink; + + while ( baseHalfEdgesItr != baseTwinHalfEdges.end() ) + { + EpaFace* pNewFace = CreateConeFace( pAppexVertex, *baseHalfEdgesItr, halfEdgesToLink ); + + newFaces.push_back( pNewFace ); + + ++baseHalfEdgesItr; + } + + // Connect consecutive faces by linking twin half-edges + + EPA_DEBUG_ASSERT( ( halfEdgesToLink.size() % 2 == 0 ) ,"Nb half-edges to link is odd!" ); + + int nbLinksToCreate = halfEdgesToLink.size() / 2; + int nbLinksCreated = 0; + + std::list< EpaHalfEdge* >::iterator halfEdgesItr( halfEdgesToLink.begin() ); + + for ( ; ( halfEdgesItr != halfEdgesToLink.end() ) && ( nbLinksCreated < nbLinksToCreate ); ++halfEdgesItr ) + { + std::list< EpaHalfEdge* >::iterator halfEdgesItr2( halfEdgesItr ); + ++halfEdgesItr2; + + for ( ; ( halfEdgesItr2 != halfEdgesToLink.end() ) && ( nbLinksCreated < nbLinksToCreate ); ++halfEdgesItr2 ) + { + EpaHalfEdge* pHalfEdge1 = *halfEdgesItr; + EpaHalfEdge* pHalfEdge2 = *halfEdgesItr2; + + EpaHalfEdge* pHalfEdgeNextCCW1 = pHalfEdge1->m_pNextCCW; + EpaHalfEdge* pHalfEdgeNextCCW2 = pHalfEdge2->m_pNextCCW; + + if ( ( pHalfEdge2->m_pVertex == pHalfEdgeNextCCW1->m_pVertex ) && + ( pHalfEdgeNextCCW2->m_pVertex == pHalfEdge1->m_pVertex ) ) + { + pHalfEdge1->m_pTwin = pHalfEdge2; + pHalfEdge2->m_pTwin = pHalfEdge1; + + ++nbLinksCreated; + } + } + } + + EPA_DEBUG_ASSERT( ( nbLinksCreated == nbLinksToCreate ) ,"Mesh topology not ok!" ); +} + +EpaFace* EpaPolyhedron::CreateConeFace( EpaVertex* pAppexVertex, EpaHalfEdge* pBaseTwinHalfEdge, + std::list< EpaHalfEdge* >& halfEdgesToLink ) +{ + EpaFace* pNewFace = CreateFace(); + + EpaHalfEdge* pNewHalfEdge0 = CreateHalfEdge(); + EpaHalfEdge* pNewHalfEdge1 = CreateHalfEdge(); + EpaHalfEdge* pNewHalfEdge2 = CreateHalfEdge(); + + // Let new face point to one of its new half-edges + pNewFace->m_pHalfEdge = pNewHalfEdge0; + + // Link new half-edges in a loop + + pNewHalfEdge0->m_pNextCCW = pNewHalfEdge1; + pNewHalfEdge1->m_pNextCCW = pNewHalfEdge2; + pNewHalfEdge2->m_pNextCCW = pNewHalfEdge0; + + // Let new half-edges point to new face + + pNewHalfEdge0->m_pFace = pNewFace; + pNewHalfEdge1->m_pFace = pNewFace; + pNewHalfEdge2->m_pFace = pNewFace; + + // Let new half-edge 0 and base twin half-edge point to each other + + pNewHalfEdge0->m_pTwin = pBaseTwinHalfEdge; + pBaseTwinHalfEdge->m_pTwin = pNewHalfEdge0; + + // Let new half-edges know about their origin vertex + + pNewHalfEdge0->m_pVertex = pBaseTwinHalfEdge->m_pNextCCW->m_pVertex; + pNewHalfEdge1->m_pVertex = pBaseTwinHalfEdge->m_pVertex; + pNewHalfEdge2->m_pVertex = pAppexVertex; + + // Let vertices know about one of their outgoing edges + + //pNewHalfEdge0->m_pVertex->m_pHalfEdge = pNewHalfEdge0; + //pNewHalfEdge1->m_pVertex->m_pHalfEdge = pNewHalfEdge1; + //pNewHalfEdge2->m_pVertex->m_pHalfEdge = pNewHalfEdge2; + + halfEdgesToLink.push_back( pNewHalfEdge1 ); + halfEdgesToLink.push_back( pNewHalfEdge2 ); + + return pNewFace; +} + + +#ifdef DO_SOME_DEBUGGING_ +#ifdef _DEBUG +bool EpaPolyhedron::_dbgSaveToFile( const char* pFileName ) +{ + FILE* fp = NULL; + + if ( fopen_s( &fp, pFileName, "wb" ) != 0 ) + { + return false; + } + + unsigned long int nbBytesWritten; + unsigned long int byteIndex = 0; + + unsigned long int fileID = 0xBADC0DE; + fwrite( &fileID, sizeof( fileID ), 1, fp ); + nbBytesWritten = sizeof( fileID ); + byteIndex += nbBytesWritten; + + unsigned char reservedByte = 0; + fwrite( &reservedByte, sizeof( reservedByte ), 1, fp ); + nbBytesWritten = sizeof( reservedByte ); + byteIndex += nbBytesWritten; + fwrite( &reservedByte, sizeof( reservedByte ), 1, fp ); + nbBytesWritten = sizeof( reservedByte ); + byteIndex += nbBytesWritten; + fwrite( &reservedByte, sizeof( reservedByte ), 1, fp ); + nbBytesWritten = sizeof( reservedByte ); + byteIndex += nbBytesWritten; + + fwrite( &reservedByte, sizeof( reservedByte ), 1, fp ); + nbBytesWritten = sizeof( reservedByte ); + byteIndex += nbBytesWritten; + fwrite( &reservedByte, sizeof( reservedByte ), 1, fp ); + nbBytesWritten = sizeof( reservedByte ); + byteIndex += nbBytesWritten; + fwrite( &reservedByte, sizeof( reservedByte ), 1, fp ); + nbBytesWritten = sizeof( reservedByte ); + byteIndex += nbBytesWritten; + + unsigned char stringSize = 5; + fwrite( &stringSize, sizeof( stringSize ), 1, fp ); + nbBytesWritten = sizeof( stringSize ); + byteIndex += nbBytesWritten; + + char exportedFrom[ 6 ] = "01234"; + fwrite( exportedFrom, stringSize * sizeof( char ), 1, fp ); + nbBytesWritten = stringSize * sizeof( char ); + byteIndex += nbBytesWritten; + + unsigned short int w = 0; + + fwrite( &w, sizeof( w ), 1, fp ); + nbBytesWritten = sizeof( w ); + byteIndex += nbBytesWritten; + fwrite( &w, sizeof( w ), 1, fp ); + nbBytesWritten = sizeof( w ); + byteIndex += nbBytesWritten; + fwrite( &w, sizeof( w ), 1, fp ); + nbBytesWritten = sizeof( w ); + byteIndex += nbBytesWritten; + + fwrite( &w, sizeof( w ), 1, fp ); + nbBytesWritten = sizeof( w ); + byteIndex += nbBytesWritten; + fwrite( &w, sizeof( w ), 1, fp ); + nbBytesWritten = sizeof( w ); + byteIndex += nbBytesWritten; + fwrite( &w, sizeof( w ), 1, fp ); + nbBytesWritten = sizeof( w ); + byteIndex += nbBytesWritten; + + unsigned long int geometryOffsetAtByteNb = byteIndex; + + unsigned long int geometryOffset = 0; + unsigned long int geometrySize = 0; + + fseek( fp, sizeof( geometryOffset ) + sizeof( geometrySize ), SEEK_CUR ); + byteIndex += sizeof( geometryOffset ) + sizeof( geometrySize ); + + unsigned long int mappingOffset = 0; + unsigned long int mappingSize = 0; + + fwrite( &mappingOffset, sizeof( mappingOffset ), 1, fp ); + nbBytesWritten = sizeof( mappingOffset ); + byteIndex += nbBytesWritten; + + fwrite( &mappingSize, sizeof( mappingSize ), 1, fp ); + nbBytesWritten = sizeof( mappingSize ); + byteIndex += nbBytesWritten; + + unsigned long int animationOffset = 0; + unsigned long int animationSize = 0; + + fwrite( &animationOffset, sizeof( animationOffset ), 1, fp ); + nbBytesWritten = sizeof( animationOffset ); + byteIndex += nbBytesWritten; + fwrite( &animationSize, sizeof( animationSize ), 1, fp ); + nbBytesWritten = sizeof( animationSize ); + byteIndex += nbBytesWritten; + + unsigned long int reservedDword = 0; + fwrite( &reservedDword, sizeof( reservedDword ), 1, fp ); + nbBytesWritten = sizeof( reservedDword ); + byteIndex += nbBytesWritten; + fwrite( &reservedDword, sizeof( reservedDword ), 1, fp ); + nbBytesWritten = sizeof( reservedDword ); + byteIndex += nbBytesWritten; + + geometryOffset = byteIndex; + + unsigned short int nbMeshs = 1; + fwrite( &nbMeshs, sizeof( nbMeshs ), 1, fp ); + nbBytesWritten = sizeof( nbMeshs ); + byteIndex += nbBytesWritten; + + char meshName[] = "noname mesh"; + unsigned char meshNameSize = strlen( meshName ); + + fwrite( &meshNameSize, sizeof( meshNameSize ), 1, fp ); + nbBytesWritten = sizeof( meshNameSize ); + byteIndex += nbBytesWritten; + + fwrite( meshName, meshNameSize * sizeof( char ), 1, fp ); + nbBytesWritten = meshNameSize * sizeof( char ); + byteIndex += nbBytesWritten; + + stdext::hash_map< unsigned long int, int > verticesMap; + typedef std::pair< unsigned long int, int > PR; + + int vertexIndex = 0; + + // Hash only vertices from faces that are not deleted + + std::list< EpaFace* >::iterator facesItr( m_faces.begin() ); + int nbFaces = 0; + + while ( facesItr != m_faces.end() ) + { + EpaFace* pFace = *facesItr; + + if ( !pFace->m_deleted ) + { + stdext::hash_map< unsigned long int, int >::const_iterator vertexItr; + + vertexItr = verticesMap.find( ( unsigned long int ) pFace->m_pVertices[ 0 ] ); + if ( vertexItr == verticesMap.end() ) + { + verticesMap.insert( PR( ( unsigned long int ) pFace->m_pVertices[ 0 ], vertexIndex ) ); + ++vertexIndex; + } + + vertexItr = verticesMap.find( ( unsigned long int ) pFace->m_pVertices[ 1 ] ); + if ( vertexItr == verticesMap.end() ) + { + verticesMap.insert( PR( ( unsigned long int ) pFace->m_pVertices[ 1 ], vertexIndex ) ); + ++vertexIndex; + } + + vertexItr = verticesMap.find( ( unsigned long int ) pFace->m_pVertices[ 2 ] ); + if ( vertexItr == verticesMap.end() ) + { + verticesMap.insert( PR( ( unsigned long int ) pFace->m_pVertices[ 2 ], vertexIndex ) ); + ++vertexIndex; + } + + ++nbFaces; + } + + ++facesItr; + } + + unsigned long int nbVertices = verticesMap.size(); + fwrite( &nbVertices, sizeof( nbVertices ), 1, fp ); + nbBytesWritten = sizeof( nbVertices ); + byteIndex += nbBytesWritten; + + // Collect all safe vertices + + float* pVertices = new float[ verticesMap.size() * 3 ]; + + stdext::hash_map< unsigned long int, int >::iterator verticesItr( verticesMap.begin() ); + + while ( verticesItr != verticesMap.end() ) + { + stdext::hash_map< unsigned long int, int >::const_iterator vertexItr; + + PR pr = *verticesItr; + + vertexItr = verticesMap.find( pr.first ); + assert( ( vertexItr != verticesMap.end() ) && "Vertex not found in hash table!" ); + + EpaVertex* pVertex = ( EpaVertex* ) vertexItr->first; + + pVertices[ vertexItr->second * 3 ] = pVertex->m_point.x(); + pVertices[ vertexItr->second * 3 + 1 ] = pVertex->m_point.y(); + pVertices[ vertexItr->second * 3 + 2 ] = pVertex->m_point.z(); + + ++verticesItr; + } + + unsigned long int* pIndices = new unsigned long int[ nbFaces * 3 ]; + + facesItr = m_faces.begin(); + + int facesIndex = 0; + while ( facesItr != m_faces.end() ) + { + EpaFace* pFace = *facesItr; + + if ( !pFace->m_deleted ) + { + stdext::hash_map< unsigned long int, int >::const_iterator vertexItr; + + int verticesIndices[ 3 ]; + + vertexItr = verticesMap.find( ( unsigned long int ) pFace->m_pVertices[ 0 ] ); + assert( ( vertexItr != verticesMap.end() ) && "Vertex not found in hash table!" ); + verticesIndices[ 0 ] = vertexItr->second; + + vertexItr = verticesMap.find( ( unsigned long int ) pFace->m_pVertices[ 1 ] ); + assert( ( vertexItr != verticesMap.end() ) && "Vertex not found in hash table!" ); + verticesIndices[ 1 ] = vertexItr->second; + + vertexItr = verticesMap.find( ( unsigned long int ) pFace->m_pVertices[ 2 ] ); + assert( ( vertexItr != verticesMap.end() ) && "Vertex not found in hash table!" ); + verticesIndices[ 2 ] = vertexItr->second; + + pIndices[ facesIndex * 3 ] = verticesIndices[ 0 ]; + pIndices[ facesIndex * 3 + 1 ] = verticesIndices[ 1 ]; + pIndices[ facesIndex * 3 + 2 ] = verticesIndices[ 2 ]; + + ++facesIndex; + } + + ++facesItr; + } + + fwrite( &nbFaces, sizeof( nbFaces ), 1, fp ); + nbBytesWritten = sizeof( nbFaces ); + byteIndex += nbBytesWritten; + + bool hasSmoothingGroups = false; + fwrite( &hasSmoothingGroups, sizeof( hasSmoothingGroups ), 1, fp ); + nbBytesWritten = sizeof( hasSmoothingGroups ); + byteIndex += nbBytesWritten; + + fwrite( pVertices, verticesMap.size() * 3 * sizeof( float ), 1, fp ); + nbBytesWritten = verticesMap.size() * 3 * sizeof( float ); + byteIndex += nbBytesWritten; + + // write indices + fwrite( pIndices, nbFaces * 3 * sizeof( unsigned long int ), 1, fp ); + nbBytesWritten = nbFaces * 3 * sizeof( unsigned long int ); + byteIndex += nbBytesWritten; + + delete[] pVertices; + delete[] pIndices; + + geometrySize = byteIndex - geometryOffset; + + fseek( fp, geometryOffsetAtByteNb, SEEK_SET ); + + fwrite( &geometryOffset, sizeof( geometryOffset ), 1, fp ); + nbBytesWritten = sizeof( geometryOffset ); + byteIndex += nbBytesWritten; + fwrite( &geometrySize, sizeof( geometrySize ), 1, fp ); + nbBytesWritten = sizeof( geometrySize ); + byteIndex += nbBytesWritten; + + fseek( fp, byteIndex, SEEK_SET ); + + fclose( fp ); + + return true; +} +#endif +#endif + diff --git a/BulletPhysics/bulletTrunk/Extras/EPA/EpaPolyhedron.h b/BulletPhysics/bulletTrunk/Extras/EPA/EpaPolyhedron.h new file mode 100644 index 00000000..16f7a71d --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/EPA/EpaPolyhedron.h @@ -0,0 +1,89 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +EPA Copyright (c) Ricardo Padrela 2006 + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ +#ifndef EPA_POLYHEDRON_H +#define EPA_POLYHEDRON_H + +class EpaFace; +class EpaVertex; + +//! Note : This class is not supposed to be a base class +class EpaPolyhedron +{ + private : + + //! Prevents copying objects from this class + EpaPolyhedron( const EpaPolyhedron& epaPolyhedron ); + const EpaPolyhedron& operator = ( const EpaPolyhedron& epaPolyhedron ); + + public : + + EpaPolyhedron(); + ~EpaPolyhedron(); + + bool Create( btPoint3* pInitialPoints, + btPoint3* pSupportPointsOnA, btPoint3* pSupportPointsOnB, + const int nbInitialPoints ); + void Destroy(); + + EpaFace* CreateFace(); + EpaHalfEdge* CreateHalfEdge(); + EpaVertex* CreateVertex( const btPoint3& wSupportPoint, + const btPoint3& wSupportPointOnA, + const btPoint3& wSupportPointOnB ); + + void DeleteFace( EpaFace* pFace ); + + void DestroyAllFaces(); + void DestroyAllHalfEdges(); + void DestroyAllVertices(); + + bool Expand( const btPoint3& wSupportPoint, + const btPoint3& wSupportPointOnA, + const btPoint3& wSupportPointOnB, + EpaFace* pFace, std::list< EpaFace* >& newFaces ); + + std::list< EpaFace* >& GetFaces(); + int GetNbFaces() const; + + private : + + void DeleteVisibleFaces( const btPoint3& point, EpaFace* pFace, + std::list< EpaHalfEdge* >& coneBaseTwinHalfEdges ); + + void CreateCone( EpaVertex* pAppexVertex, std::list< EpaHalfEdge* >& baseTwinHalfEdges, + std::list< EpaFace* >& newFaces ); + EpaFace* CreateConeFace( EpaVertex* pAppexVertex, EpaHalfEdge* pBaseTwinHalfEdge, + std::list< EpaHalfEdge* >& halfEdgesToLink ); + +#ifdef _DEBUG + public : + //! Please don't remove this method, it will help debugging if some problems arise in the future + bool _dbgSaveToFile( const char* pFileName ); +#endif + + private : + + //! This is the number of valid faces, m_faces list also contain deleted faces + int m_nbFaces; + + std::list< EpaFace* > m_faces; + std::list< EpaHalfEdge* > m_halfEdges; + std::list< EpaVertex* > m_vertices; +}; + +#endif + diff --git a/BulletPhysics/bulletTrunk/Extras/EPA/EpaVertex.h b/BulletPhysics/bulletTrunk/Extras/EPA/EpaVertex.h new file mode 100644 index 00000000..30860414 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/EPA/EpaVertex.h @@ -0,0 +1,61 @@ +/* +Bullet Continuous Collision Detection and Physics Library +Copyright (c) 2003-2006 Erwin Coumans http://continuousphysics.com/Bullet/ + +EPA Copyright (c) Ricardo Padrela 2006 + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ +#ifndef EPA_VERTEX_H +#define EPA_VERTEX_H + +class EpaHalfEdge; + +//! Note : This class is not supposed to be a base class +class EpaVertex +{ + private : + + //! Prevents copying objects from this class + EpaVertex( const EpaVertex& epaVertex ); + const EpaVertex& operator = ( const EpaVertex& epaVertex ); + + public : + + EpaVertex( const btPoint3& point ) : /*m_pHalfEdge( 0 ),*/ m_point( point ) + { + } + + EpaVertex( const btPoint3& point, + const btPoint3& wSupportPointOnA, + const btPoint3& wSupportPointOnB ) : /*m_pHalfEdge( 0 ),*/ m_point( point ), + m_wSupportPointOnA( wSupportPointOnA ), + m_wSupportPointOnB( wSupportPointOnB ) + { + } + + ~EpaVertex() + { + } + + public : + + //! This is not necessary + //EpaHalfEdge* m_pHalfEdge; + + btPoint3 m_point; + + btPoint3 m_wSupportPointOnA; + btPoint3 m_wSupportPointOnB; +}; + +#endif + diff --git a/BulletPhysics/bulletTrunk/Extras/EPA/Jamfile b/BulletPhysics/bulletTrunk/Extras/EPA/Jamfile new file mode 100644 index 00000000..fa92e2f6 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/EPA/Jamfile @@ -0,0 +1,10 @@ +SubDir TOP Extras EPA ; + +IncludeDir Extras/EPA ; + +Library EPA : [ Wildcard *.h *.cpp ] ; +CFlags EPA : [ FIncludes $(TOP)/Extras/EPA ] ; +LibDepends EPA : ; + + +InstallHeader [ Wildcard *.h ] : EPA ; diff --git a/BulletPhysics/bulletTrunk/Extras/ExtraSolid35/CombinedSimplexSolver.cpp b/BulletPhysics/bulletTrunk/Extras/ExtraSolid35/CombinedSimplexSolver.cpp new file mode 100644 index 00000000..5168cbb9 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/ExtraSolid35/CombinedSimplexSolver.cpp @@ -0,0 +1,227 @@ +/* + * Copyright (c) 2005 Erwin Coumans http://www.erwincoumans.com + * + * Permission to use, copy, modify, distribute and sell this software + * and its documentation for any purpose is hereby granted without fee, + * provided that the above copyright notice appear in all copies. + * Erwin Coumans makes no representations about the suitability + * of this software for any purpose. + * It is provided "as is" without express or implied warranty. +*/ + +#include "CombinedSimplexSolver.h" +#include +//switch off asserts +//#define MY_ASSERT assert +#define MY_ASSERT + +bool useVoronoi = true; + +CombinedSimplexSolver::CombinedSimplexSolver() +:m_useVoronoiSolver(useVoronoi) +{ + +} + +void CombinedSimplexSolver::reset() +{ + m_voronoiSolver.reset(); + m_johnsonSolver.reset(); +} + + +void CombinedSimplexSolver::addVertex(const btVector3& w, const btPoint3& p, const btPoint3& q) +{ + printf("addVertex (%f %f %f)\n",w[0],w[1],w[2]); + m_voronoiSolver.addVertex(w,p,q); + m_johnsonSolver.addVertex(w,p,q); + int i; + i=0; + + btPoint3 vp1,vp2; + btPoint3 jp1,jp2; +/* + bool isClosest0 = m_voronoiSolver.closest(vp1); + bool isClosest1 = m_johnsonSolver.closest(vp1); + + m_voronoiSolver.compute_points(vp1, vp2); + m_johnsonSolver.compute_points(jp1,jp2); + i=0; + */ +} + + + +bool CombinedSimplexSolver::closest(btVector3& v) +{ + bool result0 = 0; + bool result1 = 0; + + btVector3 v0,v1; + + result0 = m_voronoiSolver.closest(v0); + result1 = m_johnsonSolver.closest(v1); + + if (result0 != result1) + { + result0 = m_voronoiSolver.closest(v0); + result1 = m_johnsonSolver.closest(v1); + int i; + i=0; + } + if (m_useVoronoiSolver) + { + v = v0; + return result0; + } + + v = v1; + return result1; +} + +btScalar CombinedSimplexSolver::maxVertex() +{ + btScalar maxv0 = m_voronoiSolver.maxVertex(); + btScalar maxv1 = m_johnsonSolver.maxVertex(); + MY_ASSERT(maxv0 = maxv1); + if (m_useVoronoiSolver) + return maxv0; + + return maxv1; +} + +bool CombinedSimplexSolver::fullSimplex() const +{ + bool fullSimplex0 = m_voronoiSolver.fullSimplex(); + bool fullSimplex1 = m_johnsonSolver.fullSimplex(); + MY_ASSERT(fullSimplex0 == fullSimplex1); + + if (m_useVoronoiSolver) + return fullSimplex0; + + return fullSimplex1; +} + +int CombinedSimplexSolver::getSimplex(btPoint3 *pBuf, btPoint3 *qBuf, btVector3 *yBuf) const +{ + + + int simplex0 = m_voronoiSolver.getSimplex(pBuf, qBuf, yBuf); + int simplex1 = m_johnsonSolver.getSimplex(pBuf, qBuf, yBuf); +// MY_ASSERT(simplex0 == simplex1); + if (m_useVoronoiSolver) + { + return m_voronoiSolver.getSimplex(pBuf, qBuf, yBuf); + } + + return simplex1; +} + +void CombinedSimplexSolver::debugPrint() +{ + btPoint3 pBuf0[4]; + btPoint3 qBuf0[4]; + btPoint3 yBuf0[4]; + btPoint3 pBuf1[4]; + btPoint3 qBuf1[4]; + btPoint3 yBuf1[4]; + int verts0,verts1; + + verts0 = m_voronoiSolver.getSimplex(&pBuf0[0], &qBuf0[0], &yBuf0[0]); + verts1 = m_johnsonSolver.getSimplex(&pBuf1[0], &qBuf1[0], &yBuf1[0]); + printf("numverts0 = %d, numverts1 = %d\n",verts0,verts1); + for (int i=0;i + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/BulletPhysics/bulletTrunk/Extras/ExtraSolid35/ExtraSolid35_vc8.vcproj b/BulletPhysics/bulletTrunk/Extras/ExtraSolid35/ExtraSolid35_vc8.vcproj new file mode 100644 index 00000000..035432a0 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/ExtraSolid35/ExtraSolid35_vc8.vcproj @@ -0,0 +1,195 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/BulletPhysics/bulletTrunk/Extras/ExtraSolid35/Jamfile b/BulletPhysics/bulletTrunk/Extras/ExtraSolid35/Jamfile new file mode 100644 index 00000000..eb54236d --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/ExtraSolid35/Jamfile @@ -0,0 +1,10 @@ +SubDir TOP Extras ExtraSolid35 ; + +IncludeDir Extras/ExtraSolid35 ; + +Library ExtraSolid35 : [ Wildcard *.h *.cpp ] ; +CFlags ExtraSolid35 : [ FIncludes $(TOP)/Extras/ExtraSolid35 ] ; +LibDepends ExtraSolid35 : ; + + +InstallHeader [ Wildcard *.h ] : ExtraSolid35 ; diff --git a/BulletPhysics/bulletTrunk/Extras/ExtraSolid35/LICENSE_QPL.txt b/BulletPhysics/bulletTrunk/Extras/ExtraSolid35/LICENSE_QPL.txt new file mode 100644 index 00000000..3fca0046 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/ExtraSolid35/LICENSE_QPL.txt @@ -0,0 +1,110 @@ + + The SOLID library is Copyright (C) 2001-2003 Dtecta. + + You may use, distribute and copy the SOLID library under the terms of + the Q Public License, which is displayed below. + +------------------------------------------------------------------------- + THE Q PUBLIC LICENSE + version 1.0 + + Copyright (C) 1999-2000 Trolltech AS, Norway. + Everyone is permitted to copy and + distribute this license document. + +The intent of this license is to establish freedom to share and change the +software regulated by this license under the open source model. + +This license applies to any software containing a notice placed by the +copyright holder saying that it may be distributed under the terms of +the Q Public License version 1.0. Such software is herein referred to as +the Software. This license covers modification and distribution of the +Software, use of third-party application programs based on the Software, +and development of free software which uses the Software. + + Granted Rights + +1. You are granted the non-exclusive rights set forth in this license + provided you agree to and comply with any and all conditions in this + license. Whole or partial distribution of the Software, or software + items that link with the Software, in any form signifies acceptance of + this license. + +2. You may copy and distribute the Software in unmodified form provided + that the entire package, including - but not restricted to - copyright, + trademark notices and disclaimers, as released by the initial developer + of the Software, is distributed. + +3. You may make modifications to the Software and distribute your + modifications, in a form that is separate from the Software, such as + patches. The following restrictions apply to modifications: + + a. Modifications must not alter or remove any copyright notices in + the Software. + + b. When modifications to the Software are released under this + license, a non-exclusive royalty-free right is granted to the + initial developer of the Software to distribute your modification + in future versions of the Software provided such versions remain + available under these terms in addition to any other license(s) of + the initial developer. + +4. You may distribute machine-executable forms of the Software or + machine-executable forms of modified versions of the Software, provided + that you meet these restrictions: + + a. You must include this license document in the distribution. + + b. You must ensure that all recipients of the machine-executable forms + are also able to receive the complete machine-readable source code + to the distributed Software, including all modifications, without + any charge beyond the costs of data transfer, and place prominent + notices in the distribution explaining this. + + c. You must ensure that all modifications included in the + machine-executable forms are available under the terms of this + license. + +5. You may use the original or modified versions of the Software to + compile, link and run application programs legally developed by you + or by others. + +6. You may develop application programs, reusable components and other + software items that link with the original or modified versions of the + Software. These items, when distributed, are subject to the following + requirements: + + a. You must ensure that all recipients of machine-executable forms of + these items are also able to receive and use the complete + machine-readable source code to the items without any charge + beyond the costs of data transfer. + + b. You must explicitly license all recipients of your items to use + and re-distribute original and modified versions of the items in + both machine-executable and source code forms. The recipients must + be able to do so without any charges whatsoever, and they must be + able to re-distribute to anyone they choose. + + + c. If the items are not available to the general public, and the + initial developer of the Software requests a copy of the items, + then you must supply one. + + Limitations of Liability + +In no event shall the initial developers or copyright holders be liable +for any damages whatsoever, including - but not restricted to - lost +revenue or profits or other direct, indirect, special, incidental or +consequential damages, even if they have been advised of the possibility +of such damages, except to the extent invariable law, if any, provides +otherwise. + + No Warranty + +The Software and this license document are provided AS IS with NO WARRANTY +OF ANY KIND, INCLUDING THE WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS +FOR A PARTICULAR PURPOSE. + Choice of Law + +This license is governed by the Laws of Norway. Disputes shall be settled +by Oslo City Court. diff --git a/BulletPhysics/bulletTrunk/Extras/ExtraSolid35/ReadMe.txt b/BulletPhysics/bulletTrunk/Extras/ExtraSolid35/ReadMe.txt new file mode 100644 index 00000000..e3402267 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/ExtraSolid35/ReadMe.txt @@ -0,0 +1,21 @@ +======================================================================== + STATIC LIBRARY : Solid35 Project Overview +======================================================================== + +AppWizard has created this Solid35 library project for you. +No source files were created as part of your project. + + +Solid35.vcproj + This is the main project file for VC++ projects generated using an Application Wizard. + It contains information about the version of Visual C++ that generated the file, and + information about the platforms, configurations, and project features selected with the + Application Wizard. + +///////////////////////////////////////////////////////////////////////////// +Other notes: + +AppWizard uses "TODO:" comments to indicate parts of the source code you +should add to or customize. + +///////////////////////////////////////////////////////////////////////////// diff --git a/BulletPhysics/bulletTrunk/Extras/ExtraSolid35/Solid35.vcproj b/BulletPhysics/bulletTrunk/Extras/ExtraSolid35/Solid35.vcproj new file mode 100644 index 00000000..25a949f9 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/ExtraSolid35/Solid35.vcproj @@ -0,0 +1,129 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/BulletPhysics/bulletTrunk/Extras/ExtraSolid35/Solid3EpaPenetrationDepth.cpp b/BulletPhysics/bulletTrunk/Extras/ExtraSolid35/Solid3EpaPenetrationDepth.cpp new file mode 100644 index 00000000..ea35cda4 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/ExtraSolid35/Solid3EpaPenetrationDepth.cpp @@ -0,0 +1,589 @@ +/* + * SOLID - Software Library for Interference Detection + * + * Copyright (C) 2001-2003 Dtecta. All rights reserved. + * + * This library may be distributed under the terms of the Q Public License + * (QPL) as defined by Trolltech AS of Norway and appearing in the file + * LICENSE.QPL included in the packaging of this file. + * + * This library may be distributed and/or modified under the terms of the + * GNU bteral Public License (GPL) version 2 as published by the Free Software + * Foundation and appearing in the file LICENSE.GPL included in the + * packaging of this file. + * + * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE + * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + * + * Commercial use or any other use of this library not covered by either + * the QPL or the GPL requires an additional license from Dtecta. + * Please contact info@dtecta.com for enquiries about the terms of commercial + * use of this library. + */ + +#include "Solid3EpaPenetrationDepth.h" +#include +#include +#include "BulletCollision/NarrowPhaseCollision/btSimplexSolverInterface.h" +#include "BulletCollision/CollisionShapes/btConvexShape.h" +#include "LinearMath/btMinMax.h" + +#define ASSERT_MESSAGE + +class ReplaceMeAccuracy { +public: + static btScalar rel_error2; // squared relative error in the computed distance + static btScalar depth_tolerance; // terminate EPA if upper_bound <= depth_tolerance * dist2 + static btScalar tol_error; // error tolerance if the distance is almost zero + + static void setAccuracy(btScalar rel_error) + { + rel_error2 = rel_error * rel_error; + depth_tolerance = btScalar(1.0f) + btScalar(2.0f) * rel_error; + } + + static void setTolerance(btScalar epsilon) + { + tol_error = epsilon; + } +}; + + +static const btScalar rel_error = btScalar(1.0e-3); + +btScalar ReplaceMeAccuracy::rel_error2 = rel_error * rel_error; +btScalar ReplaceMeAccuracy::depth_tolerance = btScalar(1.0) + btScalar(2.0) * rel_error; +btScalar ReplaceMeAccuracy::tol_error = SIMD_EPSILON; + + + + +class ReplaceMeFacet; + + +class ReplaceMeEdge { +public: + ReplaceMeEdge() {} + ReplaceMeEdge(ReplaceMeFacet *facet, int index) : + m_facet(facet), + m_index(index) {} + + ReplaceMeFacet *getFacet() const { return m_facet; } + int getIndex() const { return m_index; } + + int getSource() const; + int getTarget() const; + +private: + ReplaceMeFacet *m_facet; + int m_index; +}; + +typedef std::vector ReplaceMeEdgeBuffer; + + +class ReplaceMeFacet { +public: + ReplaceMeFacet() {} + ReplaceMeFacet(int i0, int i1, int i2) + : m_obsolete(false) + { + m_indices[0] = i0; + m_indices[1] = i1; + m_indices[2] = i2; + } + + inline int operator[](int i) const { return m_indices[i]; } + + bool link(int edge0, ReplaceMeFacet *facet, int edge1); + + + bool isObsolete() const { return m_obsolete; } + + + bool computeClosest(const btVector3 *verts); + + const btVector3& getClosest() const { return m_closest; } + + bool isClosestInternal() const + { + return m_lambda1 >= btScalar(0.0) && + m_lambda2 >= btScalar(0.0) && + m_lambda1 + m_lambda2 <= m_det; + } + + btScalar getDist2() const { return m_dist2; } + + btPoint3 getClosestPoint(const btPoint3 *points) const + { + const btPoint3& p0 = points[m_indices[0]]; + + return p0 + (m_lambda1 * (points[m_indices[1]] - p0) + + m_lambda2 * (points[m_indices[2]] - p0)) / m_det; + } + + void silhouette(const btVector3& w, ReplaceMeEdgeBuffer& edgeBuffer) + { + edgeBuffer.clear(); + m_obsolete = true; + m_adjFacets[0]->silhouette(m_adjEdges[0], w, edgeBuffer); + m_adjFacets[1]->silhouette(m_adjEdges[1], w, edgeBuffer); + m_adjFacets[2]->silhouette(m_adjEdges[2], w, edgeBuffer); + } + +private: + void silhouette(int index, const btVector3& w, ReplaceMeEdgeBuffer& edgeBuffer); + + int m_indices[3]; + bool m_obsolete; + ReplaceMeFacet *m_adjFacets[3]; + int m_adjEdges[3]; + + btScalar m_det; + btScalar m_lambda1; + btScalar m_lambda2; + btVector3 m_closest; + btScalar m_dist2; +}; + + +inline int incMod3(int i) { return ++i % 3; } + + +bool ReplaceMeFacet::link(int edge0, ReplaceMeFacet *facet, int edge1) +{ + m_adjFacets[edge0] = facet; + m_adjEdges[edge0] = edge1; + facet->m_adjFacets[edge1] = this; + facet->m_adjEdges[edge1] = edge0; + + bool b = m_indices[edge0] == facet->m_indices[incMod3(edge1)] && + m_indices[incMod3(edge0)] == facet->m_indices[edge1]; + return b; +} + + +bool ReplaceMeFacet::computeClosest(const btVector3 *verts) +{ + const btVector3& p0 = verts[m_indices[0]]; + + btVector3 v1 = verts[m_indices[1]] - p0; + btVector3 v2 = verts[m_indices[2]] - p0; + btScalar v1dv1 = v1.length2(); + btScalar v1dv2 = v1.dot(v2); + btScalar v2dv2 = v2.length2(); + btScalar p0dv1 = p0.dot(v1); + btScalar p0dv2 = p0.dot(v2); + + m_det = v1dv1 * v2dv2 - v1dv2 * v1dv2; // non-negative + //printf("m_det = %f\n",m_det); + //ASSERT(m_det >= 0.f); + + if (m_det >= (SIMD_EPSILON*SIMD_EPSILON)) { + + m_lambda1 = p0dv2 * v1dv2 - p0dv1 * v2dv2; + m_lambda2 = p0dv1 * v1dv2 - p0dv2 * v1dv1; + + m_closest = p0 + (m_lambda1 * v1 + m_lambda2 * v2) / m_det; + m_dist2 = m_closest.length2(); + return true; + } + + return false; +} + +void ReplaceMeFacet::silhouette(int index, const btVector3& w, + ReplaceMeEdgeBuffer& edgeBuffer) +{ + if (!m_obsolete) { + if (m_closest.dot(w) < m_dist2) { + edgeBuffer.push_back(ReplaceMeEdge(this, index)); + } + else { + m_obsolete = true; // Facet is visible + int next = incMod3(index); + m_adjFacets[next]->silhouette(m_adjEdges[next], w, edgeBuffer); + next = incMod3(next); + m_adjFacets[next]->silhouette(m_adjEdges[next], w, edgeBuffer); + } + } +} + + + +inline int ReplaceMeEdge::getSource() const +{ + return (*m_facet)[m_index]; +} + +inline int ReplaceMeEdge::getTarget() const +{ + return (*m_facet)[incMod3(m_index)]; +} + + +//#define DEBUG + +const int MaxSupportPoints = 100;//1000; +const int MaxFacets = 200;//b2000; + +static btPoint3 pBuf[MaxSupportPoints]; +static btPoint3 qBuf[MaxSupportPoints]; +static btVector3 yBuf[MaxSupportPoints]; + +static ReplaceMeFacet facetBuf[MaxFacets]; +static int freeFacet = 0; +static ReplaceMeFacet *facetHeap[MaxFacets]; +static int num_facets; + +class ReplaceMeFacetComp { +public: + + bool operator()(const ReplaceMeFacet *face1, const ReplaceMeFacet *face2) + { + return face1->getDist2() > face2->getDist2(); + } + +}; + +ReplaceMeFacetComp myFacetComp; + +inline ReplaceMeFacet *addFacet(int i0, int i1, int i2, + btScalar lower2, btScalar upper2) +{ + assert(i0 != i1 && i0 != i2 && i1 != i2); + if (freeFacet < MaxFacets) + { + ReplaceMeFacet *facet = new(&facetBuf[freeFacet++]) ReplaceMeFacet(i0, i1, i2); +#ifdef DEBUG + std::cout << "Facet " << i0 << ' ' << i1 << ' ' << i2; +#endif + if (facet->computeClosest(yBuf)) + { + if (facet->isClosestInternal() && + lower2 <= facet->getDist2() && facet->getDist2() <= upper2) + { + facetHeap[num_facets++] = facet; + ASSERT_MESSAGE(num_facetsisClosestInternal()) + { + std::cout << "closest point not internal"; + } + else if (lower2 > facet->getDist2()) + { + std::cout << "facet is closer than orignal facet"; + } + else + { + std::cout << "facet is further than upper bound"; + } + std::cout << std::endl; +#endif + } + + return facet; + } + } + + return 0; +} + + + +inline bool originInTetrahedron(const btVector3& p1, const btVector3& p2, + const btVector3& p3, const btVector3& p4) +{ + btVector3 normal1 = (p2 - p1).cross(p3 - p1); + btVector3 normal2 = (p3 - p2).cross(p4 - p2); + btVector3 normal3 = (p4 - p3).cross(p1 - p3); + btVector3 normal4 = (p1 - p4).cross(p2 - p4); + + return + (normal1.dot(p1) > btScalar(0.0)) != (normal1.dot(p4) > btScalar(0.0)) && + (normal2.dot(p2) > btScalar(0.0)) != (normal2.dot(p1) > btScalar(0.0)) && + (normal3.dot(p3) > btScalar(0.0)) != (normal3.dot(p2) > btScalar(0.0)) && + (normal4.dot(p4) > btScalar(0.0)) != (normal4.dot(p3) > btScalar(0.0)); +} + + + +bool Solid3EpaPenetrationDepth::calcPenDepth( btSimplexSolverInterface& simplexSolver, + btConvexShape* convexA,btConvexShape* convexB, + const btTransform& transformA,const btTransform& transformB, + btVector3& v, btPoint3& pa, btPoint3& pb, + class btIDebugDraw* debugDraw,btStackAlloc* stackAlloc + ) +{ + + int num_verts = simplexSolver.getSimplex(pBuf, qBuf, yBuf); + + switch (num_verts) + { + case 1: + // Touching contact. Yes, we have a collision, + // but no penetration. + return false; + case 2: + { + // We have a line segment inside the Minkowski sum containing the + // origin. Blow it up by adding three additional support points. + + btVector3 dir = (yBuf[1] - yBuf[0]).normalized(); + int axis = dir.furthestAxis(); + + static btScalar sin_60 = 0.8660254037f;//84438646763723170752941.22474487f;//13915890490986420373529;// + + btQuaternion rot(dir[0] * sin_60, dir[1] * sin_60, dir[2] * sin_60, btScalar(0.5)); + btMatrix3x3 rot_mat(rot); + + btVector3 aux1 = dir.cross(btVector3(axis == 0, axis == 1, axis == 2)); + btVector3 aux2 = rot_mat * aux1; + btVector3 aux3 = rot_mat * aux2; + + pBuf[2] = transformA(convexA->localGetSupportingVertex(aux1*transformA.getBasis())); + qBuf[2] = transformB(convexB->localGetSupportingVertex((-aux1)*transformB.getBasis())); + yBuf[2] = pBuf[2] - qBuf[2]; + + pBuf[3] = transformA(convexA->localGetSupportingVertex(aux2*transformA.getBasis())); + qBuf[3] = transformB(convexB->localGetSupportingVertex((-aux2)*transformB.getBasis())); + yBuf[3] = pBuf[3] - qBuf[3]; + + pBuf[4] = transformA(convexA->localGetSupportingVertex(aux3*transformA.getBasis())); + qBuf[4] = transformB(convexB->localGetSupportingVertex((-aux3)*transformB.getBasis())); + yBuf[4] = pBuf[4] - qBuf[4]; + + if (originInTetrahedron(yBuf[0], yBuf[2], yBuf[3], yBuf[4])) + { + pBuf[1] = pBuf[4]; + qBuf[1] = qBuf[4]; + yBuf[1] = yBuf[4]; + } + else if (originInTetrahedron(yBuf[1], yBuf[2], yBuf[3], yBuf[4])) + { + pBuf[0] = pBuf[4]; + qBuf[0] = qBuf[4]; + yBuf[0] = yBuf[4]; + } + else + { + // Origin not in initial polytope + return false; + } + + num_verts = 4; + + break; + } + case 3: + { + // We have a triangle inside the Minkowski sum containing + // the origin. First blow it up. + + btVector3 v1 = yBuf[1] - yBuf[0]; + btVector3 v2 = yBuf[2] - yBuf[0]; + btVector3 vv = v1.cross(v2); + + pBuf[3] = transformA(convexA->localGetSupportingVertex(vv*transformA.getBasis())); + qBuf[3] = transformB(convexB->localGetSupportingVertex((-vv)*transformB.getBasis())); + yBuf[3] = pBuf[3] - qBuf[3]; + pBuf[4] = transformA(convexA->localGetSupportingVertex((-vv)*transformA.getBasis())); + qBuf[4] = transformB(convexB->localGetSupportingVertex(vv*transformB.getBasis())); + yBuf[4] = pBuf[4] - qBuf[4]; + + + if (originInTetrahedron(yBuf[0], yBuf[1], yBuf[2], yBuf[4])) + { + pBuf[3] = pBuf[4]; + qBuf[3] = qBuf[4]; + yBuf[3] = yBuf[4]; + } + else if (!originInTetrahedron(yBuf[0], yBuf[1], yBuf[2], yBuf[3])) + { + // Origin not in initial polytope + return false; + } + + num_verts = 4; + + break; + } + } + + // We have a tetrahedron inside the Minkowski sum containing + // the origin (if GJK did it's job right ;-) + + + if (!originInTetrahedron(yBuf[0], yBuf[1], yBuf[2], yBuf[3])) + { + // assert(false); + return false; + } + + num_facets = 0; + freeFacet = 0; + + ReplaceMeFacet *f0 = addFacet(0, 1, 2, btScalar(0.0), SIMD_INFINITY); + ReplaceMeFacet *f1 = addFacet(0, 3, 1, btScalar(0.0), SIMD_INFINITY); + ReplaceMeFacet *f2 = addFacet(0, 2, 3, btScalar(0.0), SIMD_INFINITY); + ReplaceMeFacet *f3 = addFacet(1, 3, 2, btScalar(0.0), SIMD_INFINITY); + + if (!f0 || f0->getDist2() == btScalar(0.0) || + !f1 || f1->getDist2() == btScalar(0.0) || + !f2 || f2->getDist2() == btScalar(0.0) || + !f3 || f3->getDist2() == btScalar(0.0)) + { + return false; + } + + f0->link(0, f1, 2); + f0->link(1, f3, 2); + f0->link(2, f2, 0); + f1->link(0, f2, 2); + f1->link(1, f3, 0); + f2->link(1, f3, 1); + + if (num_facets == 0) + { + return false; + } + + // at least one facet on the heap. + + ReplaceMeEdgeBuffer edgeBuffer(20); + + ReplaceMeFacet *facet = 0; + + btScalar upper_bound2 = SIMD_INFINITY; + + do { + facet = facetHeap[0]; + std::pop_heap(&facetHeap[0], &facetHeap[num_facets], myFacetComp); + --num_facets; + + if (!facet->isObsolete()) + { + assert(facet->getDist2() > btScalar(0.0)); + + if (num_verts == MaxSupportPoints) + { +#ifdef DEBUG + std::cout << "Ouch, no convergence!!!" << std::endl; +#endif + ASSERT_MESSAGE(false,"Error: pendepth calc failed"); + break; + } + + pBuf[num_verts] = transformA(convexA->localGetSupportingVertex((facet->getClosest())*transformA.getBasis())); + qBuf[num_verts] = transformB(convexB->localGetSupportingVertex((-facet->getClosest())*transformB.getBasis())); + yBuf[num_verts] = pBuf[num_verts] - qBuf[num_verts]; + + + int index = num_verts++; + btScalar far_dist2 = yBuf[index].dot(facet->getClosest()); + + + // Make sure the support mapping is OK. + //assert(far_dist2 > btScalar(0.0)); + + // + // this is to avoid problems with implicit-sphere-touching contact + // + if (far_dist2 < btScalar(0.0)) + { + return false; + } + + GEN_set_min(upper_bound2, (far_dist2 * far_dist2) / facet->getDist2()); + + if (upper_bound2 <= ReplaceMeAccuracy::depth_tolerance * facet->getDist2() +#define CHECK_NEW_SUPPORT +#ifdef CHECK_NEW_SUPPORT + || yBuf[index] == yBuf[(*facet)[0]] + || yBuf[index] == yBuf[(*facet)[1]] + || yBuf[index] == yBuf[(*facet)[2]] +#endif + ) + { + break; + } + + // Compute the silhouette cast by the new vertex + // Note that the new vertex is on the positive side + // of the current facet, so the current facet is will + // not be in the convex hull. Start local search + // from this facet. + + facet->silhouette(yBuf[index], edgeBuffer); + + if (edgeBuffer.empty()) + { + return false; + } + + ReplaceMeEdgeBuffer::const_iterator it = edgeBuffer.begin(); + ReplaceMeFacet *firstFacet = + addFacet((*it).getTarget(), (*it).getSource(), + index, facet->getDist2(), upper_bound2); + + if (!firstFacet) + { + break; + } + + firstFacet->link(0, (*it).getFacet(), (*it).getIndex()); + ReplaceMeFacet *lastFacet = firstFacet; + + ++it; + for (; it != edgeBuffer.end(); ++it) + { + ReplaceMeFacet *newFacet = + addFacet((*it).getTarget(), (*it).getSource(), + index, facet->getDist2(), upper_bound2); + + if (!newFacet) + { + break; + } + + if (!newFacet->link(0, (*it).getFacet(), (*it).getIndex())) + { + break; + } + + if (!newFacet->link(2, lastFacet, 1)) + { + break; + } + + lastFacet = newFacet; + } + if (it != edgeBuffer.end()) + { + break; + } + + firstFacet->link(2, lastFacet, 1); + } + } + while (num_facets > 0 && facetHeap[0]->getDist2() <= upper_bound2); + +#ifdef DEBUG + std::cout << "#facets left = " << num_facets << std::endl; +#endif + + v = facet->getClosest(); + pa = facet->getClosestPoint(pBuf); + pb = facet->getClosestPoint(qBuf); + return true; +} + diff --git a/BulletPhysics/bulletTrunk/Extras/ExtraSolid35/Solid3EpaPenetrationDepth.h b/BulletPhysics/bulletTrunk/Extras/ExtraSolid35/Solid3EpaPenetrationDepth.h new file mode 100644 index 00000000..6727d67a --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/ExtraSolid35/Solid3EpaPenetrationDepth.h @@ -0,0 +1,44 @@ +/* + * SOLID - Software Library for Interference Detection + * + * Copyright (C) 2001-2003 Dtecta. All rights reserved. + * + * This library may be distributed under the terms of the Q Public License + * (QPL) as defined by Trolltech AS of Norway and appearing in the file + * LICENSE.QPL included in the packaging of this file. + * + * This library may be distributed and/or modified under the terms of the + * GNU bteral Public License (GPL) version 2 as published by the Free Software + * Foundation and appearing in the file LICENSE.GPL included in the + * packaging of this file. + * + * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE + * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + * + * Commercial use or any other use of this library not covered by either + * the QPL or the GPL requires an additional license from Dtecta. + * Please contact info@dtecta.com for enquiries about the terms of commercial + * use of this library. + */ + +#ifndef SOLID3_EPA_PENETRATION_DEPTH_H +#define SOLID3_EPA_PENETRATION_DEPTH_H + + +#include "BulletCollision/NarrowPhaseCollision/btConvexPenetrationDepthSolver.h" + +/// Solid3EpaPenetrationDepth contains the 'Expanding Polytope Algorithm' from Solid 3.5 +class Solid3EpaPenetrationDepth : public btConvexPenetrationDepthSolver +{ +public: + + virtual bool calcPenDepth( btSimplexSolverInterface& simplexSolver, + btConvexShape* convexA,btConvexShape* convexB, + const btTransform& transA,const btTransform& transB, + btVector3& v, btPoint3& pa, btPoint3& pb, + class btIDebugDraw* debugDraw,btStackAlloc* stackAlloc + ); + +}; + +#endif //SOLID3_EPA_PENETRATION_DEPTH_H \ No newline at end of file diff --git a/BulletPhysics/bulletTrunk/Extras/ExtraSolid35/Solid3JohnsonSimplexSolver.cpp b/BulletPhysics/bulletTrunk/Extras/ExtraSolid35/Solid3JohnsonSimplexSolver.cpp new file mode 100644 index 00000000..0a4f0ad9 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/ExtraSolid35/Solid3JohnsonSimplexSolver.cpp @@ -0,0 +1,450 @@ +/* + * SOLID - Software Library for Interference Detection + * + * Copyright (C) 2001-2003 Dtecta. All rights reserved. + * + * This library may be distributed under the terms of the Q Public License + * (QPL) as defined by Trolltech AS of Norway and appearing in the file + * LICENSE.QPL included in the packaging of this file. + * + * This library may be distributed and/or modified under the terms of the + * GNU bteral Public License (GPL) version 2 as published by the Free Software + * Foundation and appearing in the file LICENSE.GPL included in the + * packaging of this file. + * + * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE + * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + * + * Commercial use or any other use of this library not covered by either + * the QPL or the GPL requires an additional license from Dtecta. + * Please contact info@dtecta.com for enquiries about the terms of commercial + * use of this library. + */ + +#include "Solid3JohnsonSimplexSolver.h" +#include "LinearMath/btMinMax.h" + +//#define USE_BACKUP_PROCEDURE +//#define FAST_CLOSEST + +Solid3JohnsonSimplexSolver::Solid3JohnsonSimplexSolver() +: +m_bits1(0x0), +m_all_bits(0x0) +{ +} + + +Solid3JohnsonSimplexSolver::~Solid3JohnsonSimplexSolver() +{ + +} + +void Solid3JohnsonSimplexSolver::reset() +{ + m_bits1 = 0x0; + m_all_bits = 0x0; +} + + + +void Solid3JohnsonSimplexSolver::addVertex(const btVector3& w) +{ + assert(!fullSimplex()); + m_last = 0; + m_last_bit = 0x1; + while (contains(m_bits1, m_last_bit)) + { + ++m_last; + m_last_bit <<= 1; + } + m_y[m_last] = w; + m_ylen2[m_last] = w.length2(); + m_all_bits = m_bits1 | m_last_bit; + + update_cache(); + compute_det(); +} + +void Solid3JohnsonSimplexSolver::addVertex(const btVector3& w, const btPoint3& p, const btPoint3& q) +{ + addVertex(w); + m_p[m_last] = p; + m_q[m_last] = q; +} + +bool Solid3JohnsonSimplexSolver::emptySimplex() const +{ + return m_bits1 == 0x0; +} + +bool Solid3JohnsonSimplexSolver::fullSimplex() const +{ + return m_bits1 == 0xf; +} + +btScalar Solid3JohnsonSimplexSolver::maxVertex() +{ + return m_maxlen2; +} + +bool Solid3JohnsonSimplexSolver::closest(btVector3& v) +{ +#ifdef FAST_CLOSEST + T_Bits s; + for (s = m_bits1; s != 0x0; --s) + { + if (subseteq(s, m_bits1) && valid(s | m_last_bit)) + { + //update bits ! + m_bits1 = s | m_last_bit; + compute_vector(m_bits1, v); + return true; + } + } + if (valid(m_last_bit)) + { + //update bits ! + m_bits1 = m_last_bit; + m_maxlen2 = m_ylen2[m_last]; + v = m_y[m_last]; + return true; + } +#else + T_Bits s; + for (s = m_all_bits; s != 0x0; --s) + { + if (subseteq(s, m_all_bits) && valid(s)) + { + m_bits1 = s; + compute_vector(m_bits1, v); + return true; + } + } +#endif + + // Original GJK calls the backup procedure at this point. +#ifdef USE_BACKUP_PROCEDURE + backup_closest(btVector3& v); +#endif + return false; +} + + + +int Solid3JohnsonSimplexSolver::getSimplex(btPoint3 *pBuf, btPoint3 *qBuf, btVector3 *yBuf) const +{ + int num_verts = 0; + int i; + T_Bits bit; + for (i = 0, bit = 0x1; i < 4; ++i, bit <<= 1) + { + if (contains(m_bits1, bit)) + { + pBuf[num_verts] = m_p[i]; + qBuf[num_verts] = m_q[i]; + yBuf[num_verts] = m_y[i]; + +#ifdef DEBUG + std::cout << "Point " << i << " = " << m_y[i] << std::endl; +#endif + + ++num_verts; + } + } + return num_verts; +} + +bool Solid3JohnsonSimplexSolver::inSimplex(const btVector3& w) +{ + int i; + T_Bits bit; + for (i = 0, bit = 0x1; i < 4; ++i, bit <<= 1) + { + if (contains(m_all_bits, bit) && w == m_y[i]) + { + return true; + } + } + return false; +} + + + +void Solid3JohnsonSimplexSolver::backup_closest(btVector3& v) +{ + btScalar min_dist2 = SIMD_INFINITY; + + T_Bits s; + for (s = m_all_bits; s != 0x0; --s) + { + if (subseteq(s, m_all_bits) && proper(s)) + { + btVector3 u; + compute_vector(s, u); + btScalar dist2 = u.length2(); + if (dist2 < min_dist2) + { + min_dist2 = dist2; + //update bits ! + m_bits1 = s; + v = u; + } + } + } +} + + +void Solid3JohnsonSimplexSolver::compute_points(btPoint3& p1, btPoint3& p2) +{ + btScalar sum = btScalar(0.0); + p1.setValue(btScalar(0.0), btScalar(0.0), btScalar(0.0)); + p2.setValue(btScalar(0.0), btScalar(0.0), btScalar(0.0)); + int i; + T_Bits bit; + for (i = 0, bit = 0x1; i < 4; ++i, bit <<= 1) + { + if (contains(m_bits1, bit)) + { + sum += m_det[m_bits1][i]; + p1 += m_p[i] * m_det[m_bits1][i]; + p2 += m_q[i] * m_det[m_bits1][i]; + } + } + + assert(sum > btScalar(0.0)); + btScalar s = btScalar(1.0) / sum; + p1 *= s; + p2 *= s; +} + + + +int Solid3JohnsonSimplexSolver::numVertices() const +{ + int numverts = 0; + int i,bit; + for (i = 0, bit = 0x1; i < 4; ++i, bit <<= 1) + { + if (contains(m_bits1, bit)) + { + numverts++; + } + } + return numverts; +} + + + + +////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////// +////////////////////////////////////////////////////////////// +//internal + +inline void Solid3JohnsonSimplexSolver::update_cache() +{ + int i; + T_Bits bit; + for (i = 0, bit = 0x1; i < 4; ++i, bit <<= 1) + { + if (contains(m_bits1, bit)) + { + m_edge[i][m_last] = m_y[i] - m_y[m_last]; + m_edge[m_last][i] = -m_edge[i][m_last]; + +#ifdef JOHNSON_ROBUST + m_norm[i][m_last] = m_norm[m_last][i] = m_edge[i][m_last].length2(); +#endif + + } + } +} + + +bool Solid3JohnsonSimplexSolver::valid(T_Bits s) +{ + int i; + T_Bits bit; + for (i = 0, bit = 0x1; i < 4; ++i, bit <<= 1) + { + if (contains(m_all_bits, bit)) + { + if (contains(s, bit)) + { + if (m_det[s][i] <= btScalar(0.0)) + { + return false; + } + } + else if (m_det[s | bit][i] > btScalar(0.0)) + { + return false; + } + } + } + return true; +} + +bool Solid3JohnsonSimplexSolver::proper(T_Bits s) +{ + int i; + T_Bits bit; + for (i = 0, bit = 0x1; i < 4; ++i, bit <<= 1) + { + if (contains(s, bit) && m_det[s][i] <= btScalar(0.0)) + { + return false; + } + } + return true; +} + +void Solid3JohnsonSimplexSolver::compute_vector(T_Bits s, btVector3& v) +{ + m_maxlen2 = btScalar(0.0); + btScalar sum = btScalar(0.0); + v .setValue(btScalar(0.0), btScalar(0.0), btScalar(0.0)); + + int i; + T_Bits bit; + for (i = 0, bit = 0x1; i < 4; ++i, bit <<= 1) + { + if (contains(s, bit)) + { + sum += m_det[s][i]; + GEN_set_max(m_maxlen2, m_ylen2[i]); + v += m_y[i] * m_det[s][i]; + } + } + + assert(sum > btScalar(0.0)); + + v /= sum; +} + + + +#ifdef JOHNSON_ROBUST + +inline void Solid3JohnsonSimplexSolver::compute_det() +{ + m_det[m_last_bit][m_last] = 1; + + int i; + T_Bits si; + for (i = 0, si = 0x1; i < 4; ++i, si <<= 1) + { + if (contains(m_bits1, si)) + { + T_Bits s2 = si | m_last_bit; + m_det[s2][i] = m_edge[m_last][i].dot(m_y[m_last]); + m_det[s2][m_last] = m_edge[i][m_last].dot(m_y[i]); + + int j; + T_Bits sj; + for (j = 0, sj = 0x1; j < i; ++j, sj <<= 1) + { + if (contains(m_bits1, sj)) + { + int k; + T_Bits s3 = sj | s2; + + k = m_norm[i][j] < m_norm[m_last][j] ? i : m_last; + m_det[s3][j] = m_det[s2][i] * m_edge[k][j].dot(m_y[i]) + + m_det[s2][m_last] * m_edge[k][j].dot(m_y[m_last]); + k = m_norm[j][i] < m_norm[m_last][i] ? j : m_last; + m_det[s3][i] = m_det[sj|m_last_bit][j] * m_edge[k][i].dot(m_y[j]) + + m_det[sj|m_last_bit][m_last] * m_edge[k][i].dot(m_y[m_last]); + k = m_norm[i][m_last] < m_norm[j][m_last] ? i : j; + m_det[s3][m_last] = m_det[sj|si][j] * m_edge[k][m_last].dot(m_y[j]) + + m_det[sj|si][i] * m_edge[k][m_last].dot(m_y[i]); + } + } + } + } + + if (m_all_bits == 0xf) + { + int k; + + k = m_norm[1][0] < m_norm[2][0] ? (m_norm[1][0] < m_norm[3][0] ? 1 : 3) : (m_norm[2][0] < m_norm[3][0] ? 2 : 3); + + m_det[0xf][0] = m_det[0xe][1] * m_edge[k][0].dot(m_y[1]) + + m_det[0xe][2] * m_edge[k][0].dot(m_y[2]) + + m_det[0xe][3] * m_edge[k][0].dot(m_y[3]); + + k = m_norm[0][1] < m_norm[2][1] ? (m_norm[0][1] < m_norm[3][1] ? 0 : 3) : (m_norm[2][1] < m_norm[3][1] ? 2 : 3); + + m_det[0xf][1] = m_det[0xd][0] * m_edge[k][1].dot(m_y[0]) + + m_det[0xd][2] * m_edge[k][1].dot(m_y[2]) + + m_det[0xd][3] * m_edge[k][1].dot(m_y[3]); + + k = m_norm[0][2] < m_norm[1][2] ? (m_norm[0][2] < m_norm[3][2] ? 0 : 3) : (m_norm[1][2] < m_norm[3][2] ? 1 : 3); + + m_det[0xf][2] = m_det[0xb][0] * m_edge[k][2].dot(m_y[0]) + + m_det[0xb][1] * m_edge[k][2].dot(m_y[1]) + + m_det[0xb][3] * m_edge[k][2].dot(m_y[3]); + + k = m_norm[0][3] < m_norm[1][3] ? (m_norm[0][3] < m_norm[2][3] ? 0 : 2) : (m_norm[1][3] < m_norm[2][3] ? 1 : 2); + + m_det[0xf][3] = m_det[0x7][0] * m_edge[k][3].dot(m_y[0]) + + m_det[0x7][1] * m_edge[k][3].dot(m_y[1]) + + m_det[0x7][2] * m_edge[k][3].dot(m_y[2]); + } +} + +#else //JOHNSON_ROBUST + + +inline void Solid3JohnsonSimplexSolver::compute_det() +{ + m_det[m_last_bit][m_last] = 1; + + int i; + T_Bits si; + for (i = 0, si = 0x1; i < 4; ++i, si <<= 1) + { + if (contains(m_bits1, si)) + { + T_Bits s2 = si | m_last_bit; + m_det[s2][i] = m_edge[m_last][i].dot(m_y[m_last]); + m_det[s2][m_last] = m_edge[i][m_last].dot(m_y[i]); + + int j; + T_Bits sj; + for (j = 0, sj = 0x1; j < i; ++j, sj <<= 1) + { + if (contains(m_bits1, sj)) + { + T_Bits s3 = sj | s2; + m_det[s3][j] = m_det[s2][i] * m_edge[i][j].dot(m_y[i]) + + m_det[s2][m_last] * m_edge[i][j].dot(m_y[m_last]); + m_det[s3][i] = m_det[sj|m_last_bit][j] * m_edge[j][i].dot(m_y[j]) + + m_det[sj|m_last_bit][m_last] * m_edge[j][i].dot(m_y[m_last]); + m_det[s3][m_last] = m_det[sj|si][j] * m_edge[j][m_last].dot(m_y[j]) + + m_det[sj|si][i] * m_edge[j][m_last].dot(m_y[i]); + } + } + } + } + + if (m_all_bits == 0xf) + { + m_det[0xf][0] = m_det[0xe][1] * m_edge[1][0].dot(m_y[1]) + + m_det[0xe][2] * m_edge[1][0].dot(m_y[2]) + + m_det[0xe][3] * m_edge[1][0].dot(m_y[3]); + m_det[0xf][1] = m_det[0xd][0] * m_edge[0][1].dot(m_y[0]) + + m_det[0xd][2] * m_edge[0][1].dot(m_y[2]) + + m_det[0xd][3] * m_edge[0][1].dot(m_y[3]); + m_det[0xf][2] = m_det[0xb][0] * m_edge[0][2].dot(m_y[0]) + + m_det[0xb][1] * m_edge[0][2].dot(m_y[1]) + + m_det[0xb][3] * m_edge[0][2].dot(m_y[3]); + m_det[0xf][3] = m_det[0x7][0] * m_edge[0][3].dot(m_y[0]) + + m_det[0x7][1] * m_edge[0][3].dot(m_y[1]) + + m_det[0x7][2] * m_edge[0][3].dot(m_y[2]); + } +} + + +#endif //JOHNSON_ROBUST diff --git a/BulletPhysics/bulletTrunk/Extras/ExtraSolid35/Solid3JohnsonSimplexSolver.h b/BulletPhysics/bulletTrunk/Extras/ExtraSolid35/Solid3JohnsonSimplexSolver.h new file mode 100644 index 00000000..29071917 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/ExtraSolid35/Solid3JohnsonSimplexSolver.h @@ -0,0 +1,105 @@ +/* + * SOLID - Software Library for Interference Detection + * + * Copyright (C) 2001-2003 Dtecta. All rights reserved. + * + * This library may be distributed under the terms of the Q Public License + * (QPL) as defined by Trolltech AS of Norway and appearing in the file + * LICENSE.QPL included in the packaging of this file. + * + * This library may be distributed and/or modified under the terms of the + * GNU bteral Public License (GPL) version 2 as published by the Free Software + * Foundation and appearing in the file LICENSE.GPL included in the + * packaging of this file. + * + * This library is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE + * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE. + * + * Commercial use or any other use of this library not covered by either + * the QPL or the GPL requires an additional license from Dtecta. + * Please contact info@dtecta.com for enquiries about the terms of commercial + * use of this library. + */ + +#ifndef SOLID3JOHNSON_SIMPLEX_SOLVER_H +#define SOLID3JOHNSON_SIMPLEX_SOLVER_H + +#include "BulletCollision/NarrowPhaseCollision/btSimplexSolverInterface.h" + +//#define JOHNSON_ROBUST + + +/// Solid3JohnsonSimplexSolver contains Johnson subdistance algorithm from Solid 3.5 library +class Solid3JohnsonSimplexSolver : public btSimplexSolverInterface +{ + +private: + typedef unsigned int T_Bits; + inline static bool subseteq(T_Bits a, T_Bits b) { return (a & b) == a; } + inline static bool contains(T_Bits a, T_Bits b) { return (a & b) != 0x0; } + + void update_cache(); + void compute_det(); + bool valid(T_Bits s); + bool proper(T_Bits s); + void compute_vector(T_Bits s, btVector3& v); + + + btScalar m_det[16][4]; // cached sub-determinants + btVector3 m_edge[4][4]; + +#ifdef JOHNSON_ROBUST + btScalar m_norm[4][4]; +#endif + + btPoint3 m_p[4]; // support points of object A in local coordinates + btPoint3 m_q[4]; // support points of object B in local coordinates + btVector3 m_y[4]; // support points of A - B in world coordinates + btScalar m_ylen2[4]; // Squared lengths support points y + + btScalar m_maxlen2; // Maximum squared length to a vertex of the current + // simplex + T_Bits m_bits1; // identifies current simplex + T_Bits m_last; // identifies last found support point + T_Bits m_last_bit; // m_last_bit == 0x1 << last + T_Bits m_all_bits; // m_all_bits == m_bits | m_last_bit + + + +private: + + + void addVertex(const btVector3& w); + +public: + Solid3JohnsonSimplexSolver(); + + virtual ~Solid3JohnsonSimplexSolver(); + + virtual void reset(); + + virtual void addVertex(const btVector3& w, const btPoint3& p, const btPoint3& q); + + virtual bool closest(btVector3& v); + + virtual btScalar maxVertex(); + + virtual bool fullSimplex() const; + + virtual int getSimplex(btPoint3 *pBuf, btPoint3 *qBuf, btVector3 *yBuf) const; + + virtual bool inSimplex(const btVector3& w); + + virtual void backup_closest(btVector3& v) ; + + virtual bool emptySimplex() const ; + + virtual void compute_points(btPoint3& p1, btPoint3& p2) ; + + virtual int numVertices() const ; + + +}; + + +#endif //SOLID3JOHNSON_SIMPLEX_SOLVER_H diff --git a/BulletPhysics/bulletTrunk/Extras/GIMPACTUtils/CMakeLists.txt b/BulletPhysics/bulletTrunk/Extras/GIMPACTUtils/CMakeLists.txt new file mode 100644 index 00000000..e33f7197 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/GIMPACTUtils/CMakeLists.txt @@ -0,0 +1,14 @@ +INCLUDE_DIRECTORIES( +${BULLET_PHYSICS_SOURCE_DIR}/Extras/GIMPACT/include +${BULLET_PHYSICS_SOURCE_DIR}/src +${BULLET_PHYSICS_SOURCE_DIR}/Extras/GIMPACTUtils +${BULLET_PHYSICS_SOURCE_DIR}/Extras/ConvexDecomposition +) + +ADD_LIBRARY(GIMPACTUtils +btGImpactConvexDecompositionShape.cpp btGImpactConvexDecompositionShape.h +) + +IF (BUILD_SHARED_LIBS) + TARGET_LINK_LIBRARIES(GIMPACTUtils ConvexDecomposition BulletCollision) +ENDIF (BUILD_SHARED_LIBS) diff --git a/BulletPhysics/bulletTrunk/Extras/GIMPACTUtils/Jamfile b/BulletPhysics/bulletTrunk/Extras/GIMPACTUtils/Jamfile new file mode 100644 index 00000000..af50674d --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/GIMPACTUtils/Jamfile @@ -0,0 +1,11 @@ +SubDir TOP Extras GIMPACTUtils ; + + +Library GIMPACTUtils : [ Wildcard . : */.h *.cpp ] : noinstall ; +CFlags GIMPACTUtils : [ FIncludes $(TOP)/Extras/GIMPACTUtils ] [ FIncludes $(TOP)/Extras/ConvexDecomposition ] ; +LibDepends GIMPACTUtils : convexdecomposition ; + + MsvcIncDirs GIMPACTUtils : + "../../Extras/GIMPACT/include" "../../Extras/GIMPACTUtils" "../../Extras/ConvexDecomposition" ; + +InstallHeader [ Wildcard *.h ] : GIMPACTUtils ; diff --git a/BulletPhysics/bulletTrunk/Extras/GIMPACTUtils/btGImpactConvexDecompositionShape.cpp b/BulletPhysics/bulletTrunk/Extras/GIMPACTUtils/btGImpactConvexDecompositionShape.cpp new file mode 100644 index 00000000..44d0a6de --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/GIMPACTUtils/btGImpactConvexDecompositionShape.cpp @@ -0,0 +1,240 @@ +/* +This source file is part of GIMPACT Library. + +For the latest info, see http://gimpact.sourceforge.net/ + +Copyright (c) 2007 Francisco Leon Najera. C.C. 80087371. +email: projectileman@yahoo.com + + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#include "btGImpactConvexDecompositionShape.h" +#include "BulletCollision/CollisionShapes/btConvexHullShape.h" + +#include "ConvexBuilder.h" + +class GIM_ConvexDecomposition : public ConvexDecomposition::ConvexDecompInterface +{ +protected: + btGImpactConvexDecompositionShape * m_compoundShape; + + btAlignedObjectArray m_convexShapes; + + +public: + int mBaseCount; + int mHullCount; + bool m_transformSubShapes; + + GIM_ConvexDecomposition(btGImpactConvexDecompositionShape * compoundShape,bool transformSubShapes) + { + mBaseCount = 0; + mHullCount = 0; + m_compoundShape = compoundShape; + m_transformSubShapes = transformSubShapes; + } + + virtual ~GIM_ConvexDecomposition() + { + int i; + for (i=0;i vertices; + + if(m_transformSubShapes) + { + + //const unsigned int *src = result.mHullIndices; + for (unsigned int i=0; isetMargin(m_compoundShape->getMargin()); + + if(m_transformSubShapes) + { + btTransform trans; + trans.setIdentity(); + trans.setOrigin(centroid); + + // add convex shape + + m_compoundShape->addChildShape(trans,convexShape); + } + else + { + btTransform trans; + trans.setIdentity(); + //trans.setOrigin(centroid); + + // add convex shape + + m_compoundShape->addChildShape(trans,convexShape); + + //m_compoundShape->addChildShape(convexShape); + } + } + + void processDecomposition(int part) + { + btGImpactMeshShapePart::TrimeshPrimitiveManager * trimeshInterface = + m_compoundShape->getTrimeshInterface(part); + + + trimeshInterface->lock(); + + //collect vertices + btAlignedObjectArray vertices; + vertices.reserve(trimeshInterface->get_vertex_count()*3); + + for(int vi = 0;viget_vertex_count();vi++) + { + btVector3 vec; + trimeshInterface->get_vertex(vi,vec); + vertices.push_back(vec[0]); + vertices.push_back(vec[1]); + vertices.push_back(vec[2]); + } + + + //collect indices + btAlignedObjectArray indices; + indices.reserve(trimeshInterface->get_primitive_count()*3); + + + for(int i = 0;iget_primitive_count();i++) + { + int i0, i1,i2; + trimeshInterface->get_indices(i,i0,i1,i2); + indices.push_back(i0); + indices.push_back(i1); + indices.push_back(i2); + } + + trimeshInterface->unlock(); + + + + unsigned int depth = 5; + float cpercent = 5; + float ppercent = 15; + unsigned int maxv = 16; + float skinWidth = 0.0; + + + ConvexDecomposition::DecompDesc desc; + desc.mVcount = trimeshInterface->get_vertex_count(); + desc.mVertices = &vertices[0]; + desc.mTcount = trimeshInterface->get_primitive_count(); + desc.mIndices = &indices[0]; + desc.mDepth = depth; + desc.mCpercent = cpercent; + desc.mPpercent = ppercent; + desc.mMaxVertices = maxv; + desc.mSkinWidth = skinWidth; + desc.mCallback = this; + + //convexDecomposition.performConvexDecomposition(desc); + + ConvexBuilder cb(desc.mCallback); + cb.process(desc); + } + + + + +}; + + + +void btGImpactConvexDecompositionShape::buildConvexDecomposition(bool transformSubShapes) +{ + + m_decomposition = new GIM_ConvexDecomposition(this,transformSubShapes); + + int part_count = m_trimeshInterfaces.size(); + for (int i = 0;iprocessDecomposition(i); + } + + postUpdate(); +} + +btGImpactConvexDecompositionShape::~btGImpactConvexDecompositionShape() +{ + delete m_decomposition; +} +void btGImpactConvexDecompositionShape::processAllTriangles(btTriangleCallback* callback,const btVector3& aabbMin,const btVector3& aabbMax) const +{ + + int part_count = m_trimeshInterfaces.size(); + for (int part = 0;part(ptr); + + trimeshInterface->lock(); + + btPrimitiveTriangle triangle; + + + int i = trimeshInterface->get_primitive_count(); + while(i--) + { + trimeshInterface->get_primitive_triangle(i,triangle); + callback->processTriangle(triangle.m_vertices,part,i); + } + + trimeshInterface->unlock(); + } + + +} diff --git a/BulletPhysics/bulletTrunk/Extras/GIMPACTUtils/btGImpactConvexDecompositionShape.h b/BulletPhysics/bulletTrunk/Extras/GIMPACTUtils/btGImpactConvexDecompositionShape.h new file mode 100644 index 00000000..4710861f --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/GIMPACTUtils/btGImpactConvexDecompositionShape.h @@ -0,0 +1,87 @@ +/*! \file btGImpactConvexDecompositionShape.h +\author Francisco León Nájera +*/ +/* +This source file is part of GIMPACT Library. + +For the latest info, see http://gimpact.sourceforge.net/ + +Copyright (c) 2007 Francisco Leon Najera. C.C. 80087371. +email: projectileman@yahoo.com + + +This software is provided 'as-is', without any express or implied warranty. +In no event will the authors be held liable for any damages arising from the use of this software. +Permission is granted to anyone to use this software for any purpose, +including commercial applications, and to alter it and redistribute it freely, +subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. +3. This notice may not be removed or altered from any source distribution. +*/ + +#ifndef GIMPACT_CONVEX_DECOMPOSITION_SHAPE_H +#define GIMPACT_CONVEX_DECOMPOSITION_SHAPE_H + + +#include "BulletCollision/Gimpact/btGImpactShape.h" // box tree class + + + +//! This class creates a decomposition from a trimesh. +/*! + +*/ +class btGImpactConvexDecompositionShape : public btGImpactCompoundShape +{ +protected: + btAlignedObjectArray m_trimeshInterfaces; + + class GIM_ConvexDecomposition* m_decomposition; + + void buildConvexDecomposition(bool transformSubShapes); +public: + + btGImpactConvexDecompositionShape( + btStridingMeshInterface * meshInterface, + const btVector3 & mesh_scale, + btScalar margin = btScalar(0.01),bool children_has_transform = true) + :btGImpactCompoundShape(children_has_transform) + { + + m_collisionMargin = margin; + + btGImpactMeshShapePart::TrimeshPrimitiveManager triInterface; + triInterface.m_meshInterface = meshInterface; + triInterface.m_scale = mesh_scale; + triInterface.m_margin = btScalar(1.0); + + //add parts + int part_count = meshInterface->getNumSubParts(); + for (int i=0;i< part_count;i++ ) + { + triInterface.m_part = i; + m_trimeshInterfaces.push_back(triInterface); + } + + m_decomposition = 0; + + buildConvexDecomposition(children_has_transform); + } + + virtual ~btGImpactConvexDecompositionShape(); + + SIMD_FORCE_INLINE btGImpactMeshShapePart::TrimeshPrimitiveManager * getTrimeshInterface(int part) + { + return &m_trimeshInterfaces[part]; + } + + virtual void processAllTriangles(btTriangleCallback* callback,const btVector3& aabbMin,const btVector3& aabbMax) const; + +}; + + + + +#endif //GIMPACT_MESH_SHAPE_H diff --git a/BulletPhysics/bulletTrunk/Extras/Jamfile b/BulletPhysics/bulletTrunk/Extras/Jamfile new file mode 100644 index 00000000..2a817ac1 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/Jamfile @@ -0,0 +1,15 @@ +SubDir TOP Extras ; + +SubInclude TOP Extras ConvexDecomposition ; +SubInclude TOP Extras COLLADA_DOM ; +SubInclude TOP Extras glui ; +SubInclude TOP Extras LibXML ; +SubInclude TOP Extras BulletColladaConverter ; +SubInclude TOP Extras iff ; +#SubInclude TOP Extras EPA ; +#SubInclude TOP Extras ExtraSolid35 ; +SubInclude TOP Extras GIMPACTUtils ; +#GPUphysics needs 'make', not jam compatible build yet: +#SubInclude TOP Extras GPUphysics ; +#MayaPlugin needs 'make' as well +#SubInclude TOP Extras MayaPlugin ; diff --git a/BulletPhysics/bulletTrunk/Extras/LibXML/AUTHORS b/BulletPhysics/bulletTrunk/Extras/LibXML/AUTHORS new file mode 100644 index 00000000..cf2e9a6f --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/LibXML/AUTHORS @@ -0,0 +1,5 @@ +Daniel Veillard +Bjorn Reese +William Brack +Igor Zlatkovic for the Windows port +Aleksey Sanin diff --git a/BulletPhysics/bulletTrunk/Extras/LibXML/CMakeLists.txt b/BulletPhysics/bulletTrunk/Extras/LibXML/CMakeLists.txt new file mode 100644 index 00000000..2bf11f1d --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/LibXML/CMakeLists.txt @@ -0,0 +1,57 @@ +INCLUDE_DIRECTORIES( + ${BULLET_PHYSICS_SOURCE_DIR}/Extras/LibXML ${BULLET_PHYSICS_SOURCE_DIR}/Extras/LibXML/include } +) + +# Prevent MSVC from moaning +ADD_DEFINITIONS( -D_CRT_SECURE_NO_WARNINGS) +ADD_DEFINITIONS( -D_CRT_SECURE_NO_DEPRECATE) + + + +ADD_LIBRARY(XML + c14n.c + catalog.c + chvalid.c + debugXML.c + dict.c + DOCBparser.c + encoding.c + entities.c + error.c + globals.c + hash.c + HTMLparser.c + HTMLtree.c + list.c + nanoftp.c + nanohttp.c + parser.c + parserInternals.c + pattern.c + relaxng.c + SAX.c + SAX2.c + schematron.c + threads.c + tree.c + trio.c + trionan.c + triostr.c + uri.c + valid.c + xinclude.c + xlink.c + xmlIO.c + xmlmemory.c + xmlmodule.c + xmlreader.c + xmlregexp.c + xmlsave.c + xmlschemas.c + xmlschemastypes.c + xmlstring.c + xmlunicode.c + xmlwriter.c + xpath.c + xpointer.c +) diff --git a/BulletPhysics/bulletTrunk/Extras/LibXML/COPYING b/BulletPhysics/bulletTrunk/Extras/LibXML/COPYING new file mode 100644 index 00000000..417e9553 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/LibXML/COPYING @@ -0,0 +1,27 @@ +Except where otherwise noted in the source code (e.g. the files hash.c, +list.c and the trio files, which are covered by a similar licence but +with different Copyright notices) all the files are: + + Copyright (C) 1998-2003 Daniel Veillard. All Rights Reserved. + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is fur- +nished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FIT- +NESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +DANIEL VEILLARD BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER +IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CON- +NECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + +Except as contained in this notice, the name of Daniel Veillard shall not +be used in advertising or otherwise to promote the sale, use or other deal- +ings in this Software without prior written authorization from him. + diff --git a/BulletPhysics/bulletTrunk/Extras/LibXML/ChangeLog b/BulletPhysics/bulletTrunk/Extras/LibXML/ChangeLog new file mode 100644 index 00000000..f6b31ef0 --- /dev/null +++ b/BulletPhysics/bulletTrunk/Extras/LibXML/ChangeLog @@ -0,0 +1,17734 @@ +Tue Jun 6 17:50:43 CEST 2006 Daniel Veillard + + * configure.ini NEWS doc//* libxml.spec.in : preparing release of 2.6.26 + +Tue Jun 6 17:25:23 CEST 2006 Kasimier Buchcik + + * xpath.c: Fixed self-invented a segfault in xmlXPathCtxtCompile(), + when the expression was not valid and @comp was NULL and I + tried to do the d-o-s rewrite. + +Tue Jun 6 15:19:57 CEST 2006 Daniel Veillard + + * configure.ini NEWS doc//* libxml.spec.in : preparing release of 2.6.25 + +Tue Jun 6 11:28:15 CEST 2006 Kasimier Buchcik + + * xpath.c: Enabled the compound traversal again; I added a + check to use this only if the have an expression starting + with the document node; so in the case of "//foo", we + already know at compilation-time, that there will be only + 1 initial context node. Added the rewrite also to + xmlXPathEvalExpr(). + +Tue Jun 6 10:23:10 CEST 2006 Daniel Veillard + + * xinclude.c: fix bug #343968, include='text' can't lead to a + recursion. + +Fri Jun 2 22:47:08 CEST 2006 Kasimier Buchcik + + * xpath.c: Disabled the compound traversal for the release; + I need first to assure that this is done only if we have + 1 initial node. + +Wed May 31 13:53:41 PST 2006 Aleksey Sanin + + * xpath.c: fixed memory leak in xpath error reporting + +Wed May 31 15:30:16 CEST 2006 Daniel Veillard + + * libxml.h triodef.h: applied patch from Olli Savia for LynxOS + +Wed May 31 14:33:00 CEST 2006 Kasimier Buchcik + + * xpath.c include/libxml/xpath.h runsuite.c: + Changed the name of the recently added public function + xmlXPathContextSetObjectCache() to + xmlXPathContextSetCache(); so a more generic one, in + case we decide to cache more things than only XPath + objects. + +Tue May 30 21:36:16 CEST 2006 Kasimier Buchcik + + * xpath.c: Optimized xmlXPathNodeCollectAndTest() and + xmlXPathNodeCollectAndTestNth() to evaluate a compound + traversal of 2 axes when we have a "//foo" expression. + This is done with a rewrite of the XPath AST in + xmlXPathRewriteDOSExpression(); I added an additional field + to xmlXPathStepOp for this (but the field's name should be + changed). The mechanism: the embracing descendant-or-self + axis traversal (also optimized to return only nodes which + can hold elements), will produce context nodes for the + inner traversal of the child axis. This way we avoid a full + node-collecting traversal of the descendant-or-self axis. + Some tests indicate that this can reduce execution time of + "//foo" to 50%. Together with the XPath object cache this + all significantly speeds up libxslt. + +Tue May 30 11:38:47 CEST 2006 Kasimier Buchcik + + * xmlschemas.c: A warning will now be reported in the value of + the XSD attribute 'schemaLocation' does not consist of tuples + (namespace-name, document-URI). A warning will be reported + if a schema document could not be found at the specified + location (via 'schemaLocation' or + 'noNamespaceSchemaLocation'). + * include/libxml/xmlerror.h: Added XML_SCHEMAV_MISC to + xmlParserErrors. + +Tue May 30 11:21:34 CEST 2006 Kasimier Buchcik + + * xpath.c: Enhanced xmlXPathNodeCollectAndTest() to avoid + recreation (if possible) of the node-set which is used to + collect the nodes in the current axis for the currect context + node. Especially for "//foo" this will decrease dramatically + the number of created node-sets, since for each node in the + result node-set of the evaluation of descendant-or-self::node() + a new temporary node-set was created. Added node iterator + xmlXPathNextChildElement() as a tiny optimization for + child::foo. + +Mon May 29 18:06:17 CEST 2006 Kasimier Buchcik + + * xpath.c include/libxml/xpath.h: Added an XPath object cache. + It sits on an xmlXPathContext and need to be explicitely + activated (or deactivated again) with + xmlXPathContextSetObjectCache(). The cache consists of 5 + lists for node-set, string, number, boolean and misc XPath + objects. Internally the xpath.c module will use object- + deposition and -acquisition functions which will try to reuse + as many XPath objects as possible, and fallback to normal + free/create behaviour if no cache is available or if the cache + is full. + * runsuite.c: Adjusted to deactivate the cache for XML Schema + tests if a cache-creation is turned on by default for the whole + library, e.g. for testing purposes of the cache. It is + deactivated here in order to avoid confusion of the memory leak + detection in runsuite.c. + +Wed May 24 10:54:25 CEST 2006 Kasimier Buchcik + + * xpath.c: Removed a memcpy if xmlXPathNodeSetMerge(); it + seems we really need to walk the whole list, since those + nastly namespace nodes need to be added with + xmlXPathNodeSetDupNs(); thus a pure memcpy is not possible. + A flag on the node-set indicating if namespace nodes are in + the set would help here; this is the 3rd flag which would + be usefull with node-sets. The current flags I have in mind: + 1) Is a node-set already sorted? + This would allow for rebust and optimizable sorting + behaviour. + 2) Of what type are the nodes in the set (or of mixed type)? + This would allow for faster merging of node-sets. + 3) Are namespace nodes in the set? + This would allow to skipp all the namespace node specific + special handling. Faster node-set merging if the first + set is empty; just memcpy the set. + +Mon May 22 17:14:00 CEST 2006 Kasimier Buchcik + + * xpath.c: Optimization of count(): eliminated sorting + (see bug #165547). Optimization of XPATH_OP_FILTER if the + predicate is a [1] (disable with XP_OPTIMIZED_FILTER_FIRST if + it produces trouble). Tiny opt in xmlXPathNodeSetMerge(). + +Mon May 22 13:33:12 CEST 2006 Rob Richards + + * tree.c: Revert behavior change in xmlSetProp to handle attributes + with colons in name and no namespace. + +Fri May 19 21:56:43 CEST 2006 Kasimier Buchcik + + * xpath.c: Substituted all remaining calls to xmlXPathCmpNodes() + for xmlXPathCmpNodesExt(). Tiny further enhancement of + xmlXPathCmpNodesExt(). Added additional checks in various code + parts to avoid calling sorting or merging functions if the + node-set(s) don't need them; i.e., if they are empty or contain + just one node. + +Fri May 19 13:16:58 CEST 2006 Kasimier Buchcik + + * xpath.c: Optimized the comparison for non-element nodes + in xmlXPathCmpNodesExt(); the comparison is used for sorting + of node-sets. This enhancement is related to bug #165547. + There are other places where the old comparison function + xmlXPathCmpNodes() is still called, but I currently don't + know exactly what those calls are for; thus if they can be + substituted (if it makes sense) for the new function. + +Tue May 16 16:55:13 CEST 2006 Kasimier Buchcik + + * xpath.c: Applied patch from Rob Richards, fixing a potential + memory leak in xmlXPathTryStreamCompile(), when a list of + namespaces was assigned to the XPath compilation context; + here a new namespace list was created and passed to + xmlPatterncompile(); but this list was not freed afterwards. + Additionally we avoid now in xmlXPathTryStreamCompile() to + compile the expression, if it has a colon - indicating + prefixed name tests - and no namespace list was given. The + streaming XPath mechanism needs a namespace list at + compilation time (unlike normal XPath, where we can bind + namespace names to prefixes at execution time). + * pattern.c: Enhanced to use a string dict for local-names, + ns-prefixes and and namespace-names. + Fixed xmlStreamPushInternal() not to use string-pointer + comparison if a dict is available; this won't work, since + one does not know it the given strings originate from the + same dict - and they normally don't do, since e.g. + namespaces are hold on xmlNs->href. I think this would be + worth an investigation: if we can add a @doc field to xmlNs + and put the @href in to a additionan namespace dict hold + in xmlDoc. Daniel will surely not like this idea :-) But + evaluation of tons of elements/attributes in namespaces + with xmlStrEqual() isn't the way we should go forever. + +Thu May 11 18:03:49 CEST 2006 Kasimier Buchcik + + * xmlschemas.c: Fixed bug #341337, reported by David Grohmann. + The code expected a node (xmlNodePtr) on the info for a + non-existent default attribute, which clearly cannot be + expected, since the attribute does not exist. I can only + guess that this sneaked trying to eliminate the query + for the owner-element, which is unavoidable actually. + Note that creation of default attributes won't have an + effect if validating via SAX/XMLReader; i.e., the processor + won't fire additional start-attribute events (I'm not even + sure if Libxml2 has such a SAX-event; I think it hands them + all over in the start-element event). + +Tue May 9 21:47:58 CEST 2006 Kasimier Buchcik + + * xmlschemas.c: Fixed bug #341150, reported by Michael Romer. + In xmlSchemaBuildContentModelForSubstGroup(), + xmlAutomataNewOnceTrans2() was incorrectly used instead of + xmlAutomataNewTransition2() to mimic a xs:choice for + substitution-groups. + * test/schemas/subst-group-1_1.xsd + test/schemas/subst-group-1_0.xml + result/schemas/subst-group-1_0_1 + result/schemas/subst-group-1_0_1.err: Added regression test + supplied by Michael Romer for bug #341150. + +Sat May 6 11:05:24 HKT 2006 William M. Brack + + * relaxng.c: Fixed compilation error with patch supplied by + Graham Bennett. + +Thu May 4 19:14:03 CEST 2006 Kasimier Buchcik + + * xmlschemas.c: We'll raise an internal error and stop + validation now when an entity is found in the instance + document, since we don't support automatic entity + substitution by the schema processor (yet?) - + see bug #340316, reported by Nick Wellnhofer. + +Wed May 3 15:16:00 CEST 2006 Daniel Veillard + + * configure.in: applied another Python detection patch from Joseph Sacco + * libxml.spec.in: cleanup the changelog section, asciifies the spec file + too + +Tue May 2 22:34:54 CEST 2006 Daniel Veillard + + * xmlIO.c: fix a mix of code and declarations showing up on Windows + patch from Kjartan Maraas, fixing #340404 + +Tue May 2 14:24:40 CEST 2006 Daniel Veillard + + * encoding.c: fixing bug #340398 xmlCharEncOutFunc writing to + input buffer + +Fri Apr 28 18:29:22 CEST 2006 Daniel Veillard + + * NEWS configure.in doc//*: preparing 2.6.24 release, fixed Python + paths at the last moment + * relaxng.c testapi.c tree.c: fix some comments + +Thu Apr 27 10:15:45 CEST 2006 Daniel Veillard + + * xmlIO.c: applied patch from Roland Schwingel to allow UTF-8 + file paths on Windows + +Thu Apr 27 10:10:58 CEST 2006 Daniel Veillard + + * xmlwriter.c: patch from Jason Viers for line breaks after EndPI + +Tue Apr 25 22:22:58 CEST 2006 Daniel Veillard + + * tree.c: fix compilation without tree + +Tue Apr 25 18:17:37 CEST 2006 Daniel Veillard + + * xmllint.c: applied patch from Gary Coady to really make sure + xmllint --nonet would not reach the network, should fix #337483. + +Tue Apr 25 14:52:15 CEST 2006 Daniel Veillard + + * configure.in: applied patch from Joseph Sacco changing slightly + the python detection scheme should fix bug #338526 + +Mon Apr 24 10:50:19 CEST 2006 Daniel Veillard + + * parser.c: fix the error message for invalid code point in content + c.f. bug #339311 + +Wed Apr 19 13:16:23 CEST 2006 Kasimier Buchcik + + * xmlschemas.c test/schemas/restriction-enum-1* + result/schemas/restriction-enum-1*: Fixed incorrect + validation of restricted enumerations. Added related + regression tests. + +Thu Apr 13 09:47:25 CEST 2006 Daniel Veillard + + * xmlschemas.c: fixing a deallocation problem in xmlSchemaAddSchemaDoc() + in case of errors, should fix bug #338303 + +Thu Apr 13 09:31:45 CEST 2006 Daniel Veillard + + * relaxng.c: fixing a deallocation problem in xmlRelaxNGParse() + in case of errors, should fix bug #338306 + +Thu Apr 6 10:22:17 CEST 2006 Daniel Veillard + + * doc/xmlcatalog.1 doc/xmlcatalog_man.xml doc/xmllint.1 doc/xmllint.xml: + applied man page improvements from Daniel Leidert + +Mon Mar 27 11:44:07 CEST 2006 Daniel Veillard + + * xmlschemas.c: removed unused code or variables, from Stefan Kost + fixing #336163 and #336164 + +Mon Mar 27 11:38:21 CEST 2006 Daniel Veillard + + * xmlschemas.c: applied patch from Stefan Kost fixing #336160 + +Mon Mar 27 11:23:39 CEST 2006 Daniel Veillard + + * chvalid.c genChRanges.py genUnicode.py xmlunicode.c + include/libxml/chvalid.h include/libxml/xmlunicode.h: applied + patches from Aivars Kalvans to make unicode tables const, fixes + bug #336096, this also updates to Unicode 4.01 final with a couple + of character ranges fixes. + +Mon Mar 27 00:51:40 CEST 2006 Daniel Veillard + + * chvalid.c genChRanges.py include/libxml/chvalid.h: fixed bug + #335603 and resync'ed genChRanges.py to the expected output. + +Wed Mar 22 00:14:34 CET 2006 Daniel Veillard + + * xmlregexp.c: applied patch from Youri Golovanov fixing bug + #316338 and adding a couple of optimizations in the regexp + compilation engine. + * test/regexp/bug316338 result/regexp/bug316338: added regression + tests based on the examples provided in the bug report. + +Fri Mar 10 08:40:55 EST 2006 Daniel Veillard + + * c14n.c encoding.c xmlschemas.c xpath.c xpointer.c: fix a few + warning raised by gcc-4.1 and latests changes + +Fri Mar 10 01:34:42 CET 2006 Daniel Veillard + + * runtest.c schematron.c testAutomata.c tree.c valid.c xinclude.c + xmlcatalog.c xmlreader.c xmlregexp.c xpath.c: end of first + pass on coverity reports. + +Thu Mar 9 19:36:14 CET 2006 Daniel Veillard + + * relaxng.c xmlschemas.c xmlschemastypes.c: more cleanups based + on coverity reports. + +Thu Mar 9 17:47:40 CET 2006 Daniel Veillard + + * SAX2.c catalog.c encoding.c entities.c example/gjobread.c + python/libxml.c: more cleanups based on coverity reports. + +Thu Mar 9 15:12:19 CET 2006 Daniel Veillard + + * HTMLparser.c parser.c parserInternals.c pattern.c uri.c: a bunch + of small cleanups based on coverity reports. + +Thu Mar 9 09:42:10 CET 2006 Daniel Veillard + + * win32/Makefile.bcb: added schematron as pointed out by Eric Zurcher + +Tue Mar 7 09:50:09 CET 2006 Daniel Veillard + + * xml2-config.in: fix Red Hat bug #184170 + +Mon Mar 6 14:21:08 CET 2006 Kasimier Buchcik + + * tree.c: Simplified usage of the internal xmlNsMap. Added a + "strict" lookup for namespaces based on a prefix. Fixed a + namespace processing issue in the clone-node function, which + occured if a @ctxt argument was given. + +Fri Mar 3 17:44:10 CET 2006 Rob Richards + + * valid.c: fix HTML attribute ID checking for input element. + Maintain current attribute "name" behavior for now. + +Thu Mar 2 18:59:50 CET 2006 Kasimier Buchcik + + * tree.c: Bundled lookup of attr-nodes and retrieving their + values into the functions xmlGetPropNodeInternal() and + xmlGetPropNodeValueInternal(). Changed relevant code + to use those functions. + +Mon Feb 27 20:42:04 CET 2006 Daniel Veillard + + * xpath.c: workaround HP-UX compiler bug by Rick Jones + +Mon Feb 27 10:57:05 CET 2006 Daniel Veillard + + * python/libxml2.py: remove a tab, as pointed out on IRC + +Sat Feb 25 18:12:10 CET 2006 Rob Richards + + * tree.c: Fix the add sibling functions when passing attributes. + Modify testing for ID in xmlSetProp. + No longer remove IDness when unlinking or replacing an attribute. + +Fri Feb 24 21:20:33 CET 2006 Daniel Veillard + + * catalog.c: Martin Cole pointed out a bug in xmlCatalogAdd() + if /etc/xml/catalog doesn't exist. + +Thu Feb 23 23:06:18 CET 2006 Daniel Veillard + + * doc//*: updated the Ruby bindings links, and regenerated the + docs. + +Thu Feb 23 09:12:27 CET 2006 Daniel Veillard + + * catalog.c: improve catalog debugging message patch from Rick Jones + +Wed Feb 22 16:09:10 CET 2006 Daniel Veillard + + * python/types.c: Nic Ferrier found debug statement left in the + XPath conversion code + +Tue Feb 21 20:23:14 CET 2006 Daniel Veillard + + * doc/xmllint.1 doc/xmllint.xml: small man page improvements from + Daniel Leidert + +Mon Feb 20 15:45:19 CET 2006 Kasimier Buchcik + + * xmlschemas.c: Fixed a side-effect of the previous XSI bugfix: + The constructor needs a bucket to be assigned during component + fixup. + +Mon Feb 20 14:32:36 CET 2006 Kasimier Buchcik + + * xmlschemas.c xmlschemastypes.c: Fixed xs:boolean to reject + the empty string (reported by Bas Driessen on the mailing-list). + Fixed schema XSI-acquisition and construction: the schemata + (xmlSchema) didn't get the targetNamespace in some cases, thus + the component resolution mechanism failed to work. The XSI + stuff needs to be tested more intensively; think about how + to test this for regression. + +Mon Feb 20 09:57:41 CET 2006 Daniel Veillard + + * doc/xmllint.1 doc/xmllint.xml: more man page improvements from + Daniel Leidert + +Sun Feb 19 22:31:33 CET 2006 Daniel Veillard + + * doc/xmllint.1 doc/xmllint.xml: man page improvements from Daniel + Leidert, c.f. #331290 + +Sun Feb 19 17:54:04 CET 2006 Daniel Veillard + + * xmllint.c: fix an error report when using --path and --valid + closes bug #331290 + +Sun Feb 19 16:20:43 CET 2006 Daniel Veillard + + * relaxng.c: trying to fix #331062, this is again a problem + around interleave, there is no good fix unless reimplementing + but this works around some cases and allow to validate in that + case. + +Wed Feb 15 11:55:22 CET 2006 Kasimier Buchcik + + * tree.c: Fixed bug #328896 reported by Liron. The path + for text- and CDATA-section-nodes was computed incorrectly + in xmlGetNodePath(). + +Sun Feb 12 20:12:22 CET 2006 Daniel Veillard + + * xmlregexp.c: bug fixes for #327167 as well as some cleanups + and more thorough tests on atoms comparisons. + +Thu Feb 9 10:07:20 CET 2006 Daniel Veillard + + * include/wsockcompat.h: patch from Eric Zurcher to compile with + Borland C++ 6 + +Sun Feb 5 04:03:59 CET 2006 Daniel Veillard + + * parser.c: bill pointed out a missing block in xmlParseComment + trying to fill with a normal processing of the given character. + +Sun Feb 5 03:41:39 CET 2006 Daniel Veillard + + * parser.c: fixed the comment streaming bug raised by Graham Bennett + * test/badcomment.xml result//badcomment.xml*: added to the regression + suite. + +Fri Feb 3 17:36:41 CET 2006 Kasimier Buchcik + + * include/libxml/tree.h: Added the xmlDOMWrapCloneNode() to + the header file. + +Fri Feb 3 17:29:22 CET 2006 Kasimier Buchcik + + * tree.c: Added an initial version of xmlDOMWrapCloneNode() to + the API. It will be used to reflect DOM's Node.cloneNode and + Document.importNode methods. + The pros: 1) non-recursive, 2) optimized ns-lookup + (mostly pointer comparison), 3) user defined ns-lookup, + 4) save ns-processing. The function is in an unfinished + and experimental state and should be only used to test it. + +Fri Feb 3 10:42:48 CET 2006 Daniel Veillard + + * uri.c: applied patch from Rob Richards fixing the URI regressions + tests on Windows which seems to indicate bad escaping. + +Thu Feb 2 13:11:26 CET 2006 Kasimier Buchcik + + * tree.c: Fixed some bugs xmlDOMWrapReconcileNamespaces() wrt + the previous addition of the removal of redundant ns-decls. + +Wed Feb 1 17:32:25 CET 2006 Kasimier Buchcik + + * tree.c: Enhanced xmlDOMWrapReconcileNamespaces() to remove + redundant ns-decls if the option XML_DOM_RECONNS_REMOVEREDUND + was given. Note that I haven't moved this option to the + header file yet; so just call this function with an @option + of 1 to test the behaviour. + +Wed Feb 1 12:21:08 CET 2006 Kasimier Buchcik + + * tapi.c win32/Makefile.*: Added changed as proposed on + the mailing list by venkat naidu in order to compile + testapi.c on windows. + +Thu Jan 19 09:57:28 CET 2006 Daniel Veillard + + * configure.in xml2-config.in: trying to fix windows/configure + issues reported by Tim Van Holder + +Wed Jan 18 18:21:15 CET 2006 Daniel Veillard + + * HTMLparser.c libxml.h parser.c: try to fix xmlParseInNodeContext + when operating on an HTML document. + +Mon Jan 9 17:27:15 CET 2006 Kasimier Buchcik + + * relaxng.c include/libxml/relaxng.h: Added + xmlRelaxNGSetParserStructuredErrors() to the API. + +Mon Jan 9 15:33:16 CET 2006 Daniel Veillard + + * parser.c: reverted first patches for #319279 which led to #326295 + and fixed the problem in xmlParseChunk() instead + * test/ent11 result//ent11*: added test for #326295 to the regression + suite + +Thu Jan 5 16:25:06 CET 2006 Daniel Veillard + + * NEWS configure.in libxml.spec.in testapi.c doc/*: upated the news + regenerated the docs, preparing for release of 2.6.23 + * pattern.c xmlschemas.c: fixed some comments + +Thu Jan 5 15:48:27 CET 2006 Kasimier Buchcik + + * test/XPath/docs/nodes test/XPath/tests/nodespat + result/XPath/tests/nodespat: Added regression tests for + the latest XPath/pattern fixes. + +Thu Jan 5 15:43:38 CET 2006 Kasimier Buchcik + + * pattern.c: Another fix to handle "foo//.": "foo" was not + included in the resulting node-set. + +Thu Jan 5 13:22:29 CET 2006 Kasimier Buchcik + + * pattern.c xpath.c include/libxml/pattern.h: + Fixed bug #322928, reported by Erich Schubert: The bug was + in pattern.c, which is used for a tiny subset of xpath + expression which can be evaluated in an optimized way. + The doc-node was never considered when evaluating "//" + expressions. Additionally, we fixed resolution + to nodes of any type in pattern.c; i.e. a "//." didn't work + yet, as it did select only element-nodes. Due to this + issue the pushing of nodes in xpath.c needed to be adjusted + as well. + +Wed Jan 4 18:07:47 CET 2006 Daniel Veillard + + * parser.c: tiny refactoring patch from Bjorn Reese + +Wed Jan 4 15:00:51 CET 2006 Daniel Veillard + + * SAX2.c: fix bug #324432 with + * test/ns7 resul//ns7*: added to the regression tests + +Wed Jan 4 10:53:56 CET 2006 Daniel Veillard + + * include/wsockcompat.h: applied patch from Mark Junker, fixing a + MinGW compilation problem, should close bug #324943 + +Tue Jan 3 11:49:54 CET 2006 Kasimier Buchcik + + * xmlschemas.c: Removed last dependency on the obsolete enum + xmlSchemaValidError. + +Mon Jan 2 11:20:00 CET 2006 Daniel Veillard + + * xmlreader.c include/libxml/xmlreader.h xmlschemas.c: compilation + and doc build fixes from Michael Day + +Wed Dec 28 22:12:34 CET 2005 Daniel Veillard + + * xmlregexp.c: bug in xmlRegExecPushString2() pointed out by + Sreeni Nair. + +Tue Dec 20 16:55:31 CET 2005 Rob Richards + + * tree.c: fix bug #322136 in xmlNodeBufGetContent when entity ref is + a child of an element (fix by Oleksandr Kononenko). + * HTMLtree.c include/libxml/HTMLtree.h: Add htmlDocDumpMemoryFormat. + +Tue Dec 20 11:43:06 CET 2005 Kasimier Buchcik + + * xmlschemas.c xmlstring.c: Fixed a segfault during + text concatenation when validating a node tree: + xmlStrncat was called with a @len of -1; but unlike + xmlStrncatNew, it does not calculate the length + automatically in such a case (reported by Judy Hay + on the mailing list). + Updated the descriptions of the involved string + functions to note this. + +Thu Dec 15 12:11:07 CET 2005 Daniel Veillard + + * nanohttp.c: applied patch from Gary Coady to accept gzipped + http resources. + +Wed Dec 14 18:41:26 CET 2005 Kasimier Buchcik + + * win32/configure.js: Added enable/disable of runtime + debugging (LIBXML_DEBUG_RUNTIME). + +Wed Dec 14 18:11:50 CET 2005 Kasimier Buchcik + + * include/libxml/xmlversion.h.in: Fixed to define + LIBXML_DEBUG_RUNTIME on the basis of @WITH_RUN_DEBUG@. + +Tue Dec 13 12:49:23 CET 2005 Kasimier Buchcik + + * test/schemas/bug321475* result/schemas/bug321475*: + Added regression test for bug #321475 (reported by + Gabor Nagy). Fixing of bug #323510 seemed to have + fixed this bug as well. + +Mon Dec 12 16:19:16 CET 2005 Kasimier Buchcik + + * test/schemas/bug323510* result/schemas/bug323510*: + Added regression test for bug #323510. + +Mon Dec 12 16:11:13 CET 2005 Kasimier Buchcik + + * xmlschemas.c: Workaround for bug #323510 (reported by + Jonathan Filiatrault): substituted the epsilon transition + for a labelled transition, in order to avoid a bug in + xmlregexp.c which eliminated the epsilon transition and + marked the initial state as final. + +Mon Dec 12 14:25:46 CET 2005 Daniel Veillard + + * xmlreader.c: Gary Coady pointed a memory leak in + xmlTextReaderReadInnerXml() applied patch fixing #323864 + +Sat Dec 10 12:08:28 CET 2005 Daniel Veillard + + * HTMLparser.c configure.in parserInternals.c runsuite.c runtest.c + testapi.c xmlschemas.c xmlschemastypes.c xmlstring.c: fixed a number + of warnings shown by HP-UX compiler and reported by Rick Jones + +Fri Dec 9 18:57:31 CET 2005 Rob Richards + + * xmlwriter.c: Insert space between pubid and sysid when both + passed to xmlTextWriterStartDTD and indenting not being used. + Remove no longer used Mem callbacks. + +Fri Dec 9 11:01:16 CET 2005 Kasimier Buchcik + + * runsuite.c: Changed to instantly mark instance-tests as + failed if the corresponding schema was invalid. This + reflects the side of the Python code for the XML Schema test + suite. We now get the same number of failed tests on both + sides. + +Wed Dec 7 14:59:01 CET 2005 Kasimier Buchcik + + * xmlreader.c include/libxml/xmlreader.h: Added + xmlTextReaderSchemaValidateCtxt() to the API. + +Wed Dec 7 12:59:56 CET 2005 Kasimier Buchcik + + * xmlschemas.c: Fixed a segfault: the instance document was + still tried to be validated, if the schema, dynamically + acquired using XSI was invalid, thus mangled. The + validation will stop (or rather won't validate) now in + such a case. The schema parser error code will be set + on the validion context now; this is somehow not nice, + but it assures that the validation context indicates an + error in there was a parser error. + +Tue Dec 6 18:57:23 CET 2005 Daniel Veillard + + * xmlreader.c: small doc patch from Aron Stansvik + * legacy.c: another doc patch for a deprecated API + +Mon Dec 5 16:23:49 CET 2005 Kasimier Buchcik + + * Makefile.am: Tiny change for 'make tests': raised + the number of expected failures for James Clark's + XML Schema datatype tests from 10 to 11. The additional + reported error was agreed to be correct long time ago, + but we missed to adjust the message reported by + the testing script. + +Fri Dec 2 13:51:14 CET 2005 Kasimier Buchcik + + * result/schemas/decimal* result/schemas/bug322411*: + Added missing regression test results for the latest IDC + and xs:decimal bugs. + +Wed Nov 30 12:22:23 CET 2005 Kasimier Buchcik + + * test/schemas/decimal* test/schemas/bug322411*: Added + regression tests for the latest IDC and xs:decimal bugs. + +Wed Nov 30 11:57:35 CET 2005 Kasimier Buchcik + + * xmlschemas.c: Fixed bubbling of duplicate IDC nodes: the + parent's list of duplicates was filled with NULLs instead + of the nodes under certain conditions. This lead to a + segfault when the list's entries were accessed. + +Mon Nov 28 17:28:53 CET 2005 Kasimier Buchcik + + * xmlschemastypes.c: Fixed parsing of xs:decimal to + allow/deny special lexical forms. Fixed the totalDigits + for values in the range (x < 1) && (x > -1) && (x != 0); + E.g "0.123" has now a totalDigits of 3 (was 4 previously). + Adjusted the comparison function for decimals due to this + change. As a side effect comparison against zeroes was + optimized. + +Mon Nov 28 13:25:11 CET 2005 Kasimier Buchcik + + * xmlschemas.c: An assignment to a local variable, which was + used to access the IDC node list, was missing after the + reallocation of the list (reported by Fabrice GUY + bug #322411). Renamed the define ENABLE_IDC_NODE_TABLES + to ENABLE_IDC_NODE_TABLES_TEST and *disabled* it, since + it is used to force bubbling of IDC node tables even + if not necessary; this was intended to be used for test + purposes, but I obviously missed to disable it (although + it apparently helped finding the bug). + +Wed Nov 23 17:34:52 CET 2005 Kasimier Buchcik + + * xmlschemas.c: In xmlSchemaAssembleByXSI() the return value + of xmlSchemaGetMetaAttrInfo() was not assigned to anything; + this caused XSI-driven-dynamic schema acquisition to fail + with @noNamespaceSchemaLocation (reported by Julien Lamy + on the mailing list). + +Tue Nov 22 18:31:34 CET 2005 Kasimier Buchcik + + * xmlschemas.c: Fixed a bug in xmlSchemaFindRedefCompInGraph() + which caused the search for components to stop at the + first encountered attribute group component. + Fixed error report in xmlSchemaCheckSRCRedefineFirst(): the + designation of a not-found component was not reported. + +Mon Nov 21 12:23:28 CET 2005 Daniel Veillard + + * xmlschemastypes.c: Albert Chin found another signed/unsigned problem + in the date and time code raised on IRIX 6.5 + +Fri Nov 18 18:13:38 CET 2005 Kasimier Buchcik + + * xmlschemas.c include/libxml/xmlschemas.h: + Added xmlSchemaSetParserStructuredErrors() to the API. + Fixed channeling of error relevant information to + subsequent parser/validation contexts. + +Thu Nov 17 14:11:43 CET 2005 Daniel Veillard + + * parserInternals.c: removed unreachable code pointed out by + Oleksandr Kononenko, fixes bug #321695 + +Thu Nov 17 08:24:31 CET 2005 Daniel Veillard + + * parser.c: use ctxt->standalone = -2 to indicate that the + XMLDecl was parsed but no standalone attribute was found, + suggested by Michael Day to detect if an XMLDecl was found. + +Tue Nov 15 09:49:24 CET 2005 Daniel Veillard + + * runtest.c: Hisashi Fujinaka pointed that errors in Schemas tests + were not properly reported. + +Sun Nov 13 13:42:41 CET 2005 Daniel Veillard + + * xmlIO.c: applied patch from Geert Jansen to remove xmlBufferClose() + which is not needed. + +Fri Nov 11 13:48:52 CET 2005 Kasimier Buchcik + + * xmlschemas.c: Changed xmlSchemaFormatIDCKeySequence() + to use xmlSchemaGetCanonValueWhtspExt() in order to + correctly report values for xs:anySimpleType. + * test/schemas/idc-keyref-err1* + result/schemas/idc-keyref-err1*: Added a test for this change. + +Wed Nov 9 13:07:24 EST 2005 Rob Richards + + * xmlIO.c xmlwriter.c: function consolidation when writing to xmlBuffer. + Return error condition not len if xmlwriter fails writing to buffer. + +Wed Nov 9 09:54:54 CET 2005 Daniel Veillard + + * xmlsave.c xmlIO.c include/libxml/xmlIO.h include/libxml/xmlsave.h: + applied patch from Geert Jansen to implement the save function to + a xmlBuffer, and a bit of cleanup. + +Mon Nov 7 14:58:39 CET 2005 Kasimier Buchcik + + * xmlschemas.c xmlschemastypes.c: Fixed the type of the + totalDigits value to be positiveInteger. + Fixed crash in an error report function when we gave it + the document node; only element and attribute nodes are + processed now (reported by Rob Richards). + +Tue Nov 1 16:22:29 CET 2005 Daniel Veillard + + * xmlregexp.c: fix bug #319897, problem with counted atoms + when the transition itself is counted too + * result/regexp/hard test/regexp/hard: augmented the regression + tests with the problem exposed. + +Tue Nov 1 11:54:39 CET 2005 Daniel Veillard + + * win32/Makefile.mingw include/win32config.h: applied patch from + Mark Junker to fix compilation with MinGW + +Fri Oct 28 18:36:08 CEST 2005 Daniel Veillard + + * libxml.3: tiny fix from Albert Chin + * runsuite.c runtest.c testapi.c: portability cleanup for arch + needing trio for *printf + +Fri Oct 28 12:21:39 EDT 2005 Rob Richards + + * tree.c: add additional checks to prevent tree corruption. fix problem + copying attribute using xmlDocCopyNode from one document to another. + +Fri Oct 28 17:58:13 CEST 2005 Daniel Veillard + + * config.h.in configure.in vms/config.vms macos/src/config-mac.h: + cleanup from Albert Chin + * doc/Makefile.am: html/index.sgml doesn't exist anymore + +Fri Oct 28 16:53:51 CEST 2005 Daniel Veillard + + * xmlIO.c xmlmodule.c: more portability patches from Albert Chin for + HP-UX and AIX + +Fri Oct 28 10:36:10 CEST 2005 Daniel Veillard + + * xmlmodule.c configure.in: applied 2 patches from Albert Chin for + module portability + +Fri Oct 28 10:24:39 CEST 2005 Daniel Veillard + + * error.c: fixing a portability problem on some old Unices with + patch from Albert Chin + +2005-10-27 Aleksey Sanin + + * c14n.c result/c14n/exc-without-comments/test-2 + test/c14n/exc-without-comments/test-2.xml + test/c14n/exc-without-comments/test-2.xpath: fixing + bug in exc-c14n namespace visibility + test case (bug #319367) + +Thu Oct 27 16:10:31 CEST 2005 Daniel Veillard + + * python/libxml.py: remove warnings to stdout patch from Nic Ferrier + +Thu Oct 27 13:54:52 CEST 2005 Daniel Veillard + + * valid.c xmlregexp.c include/libxml/valid.h + include/libxml/xmlregexp.h: avoid function parameters names 'list' + as this seems to give troubles with VC6 and stl as reported by + Samuel Diaz Garcia. + +Wed Oct 26 10:59:21 CEST 2005 Daniel Veillard + + * parserInternals.c: fix a problem in some error case on Solaris + when passed a NULL filename, pointed by Albert Chin. + +Tue Oct 25 14:34:58 CEST 2005 Daniel Veillard + + * HTMLparser.c: script HTML parser error fix, corrects bug #319715 + * result/HTML/53867* test/HTML/53867.html: added test from Michael Day + to the regression suite + +Tue Oct 25 14:21:11 CEST 2005 Daniel Veillard + + * HTMLparser.c: typo fix from Michael Day + +Mon Oct 24 20:16:23 EDT 2005 Rob Richards + + * tree.c: fix issue adding non-namespaced attributes in xmlAddChild(), + xmlAddNextSibling() and xmlAddPrevSibling() (bug #319108) - part 1. + +Sat Oct 22 10:00:41 HKT 2005 William Brack + + * parser.c: fixed second spot where CRLF split between chunks + could cause trouble (bug #319279) + * gentest.py, testapi.c: fixed two problems involved with + --with-minimum compilation (compilation errors with schematron + and formal expressions tests) + +Fri Oct 21 10:50:14 EDT 2005 Rob Richards + + * xmlsave.c: prevent output of fragment tags when serializing XHTML. + +Wed Oct 19 16:53:47 BST 2005 Daniel Veillard + + * xmlregexp.c: commiting a some fixes and debug done yesterday in + the London airport. + +Thu Oct 20 12:54:23 CEST 2005 Kasimier Buchcik + + * xmlschemas.c: Removed creation of a temporary parser context + during validation when processing xsi:type; this previously + added a string to the dict of the schema - to assure thread + safety, we don't want to modify a given schema during + validation. + +Thu Oct 20 17:05:29 HKT 2005 William Brack + + * xmlwriter.c: fixed problem in xmlTextWriterVSprintf caused by + misuse of vsnprintf + * configure.in, config.h.in: added a configuration check for + va_copy and added a define for VA_COPY for xmlwriter.c fix + * parser.c: fixed problem with CRLF split between chunks (bug + #319279) (fix provided by Brion Vibber) + +Wed Oct 19 18:49:52 CEST 2005 Kasimier Buchcik + + * xmlschemas.c: Fixed a potential memory leak in + xmlSchemaCheckCSelectorXPath() when an internal error occurs. + Fixed setting of ctxt->err to the given error code in + the parsing error functions. + * pattern.c: Added internal xmlCompileIDCXPathPath() as a + starting point for IDC XPath compilation; this and some other + tiny changes fixes issues regarding whitespace in the + expressions and IDC selector/field relevant restrictions of + the subset of XPath. Fixed a missing blocking of attributes + in xmlStreamPushInternal(). + +Mon Oct 17 15:06:05 EDT 2005 Daniel Veillard + + * runtest.c: removed the error message + * relaxng.c xmlschemas.c: removed 2 instability warnings from function + documentation + * include/libxml/schemasInternals.h: changed warning about API stability + * xmlregexp.c: trying to improve runtime execution of non-deterministic + regexps and automata. Not fully finished but should be way better. + +Mon Oct 17 16:12:02 CEST 2005 Kasimier Buchcik + + * xmlschemas.c: Fixed a memory leak in + xmlSchemaContentModelDump(). Added output of local types + in xmlSchemaElementDump(). Tiny cosmetical changes to the + dump output. + +Mon Oct 17 14:29:08 CEST 2005 Kasimier Buchcik + + * tree.c pattern.c: Silenced intel compiler warnings (reported + by Kjartan Maraas, bug #318517). + * xmlschemas.c: The above changes in pattern.c revealed an + inconsistency wrt IDCs: we now _only_ pop XPath states, if + we really pushed them beforehand; this was previously not + checked for the case when we discover an element node to be + invalid wrt the content model. + Fixed segfault in xmlSchemaGetEffectiveValueConstraint(). + +Fri Oct 14 16:40:18 CEST 2005 Kasimier Buchcik + + * result/schemas/*.err: Adapted regression test results. + +Fri Oct 14 16:21:22 CEST 2005 Kasimier Buchcik + + * xmlschemas.c: Fixed some identity-constraint issues: + Restructured IDC node-tables + Allowed IDCs to resolve also to nodes of complex type with + simple content. + Added check for keyrefs with references to keyrefs. + IDC target-nodes were interferring with IDC node-tables, + since they used one list of entries only. I separated this + one big list into 3 lists: 1 for IDC node-table entries, + 1 for _duplicates_ of IDC node-table entries and 1 for + IDC target-nodes. More code, but cleaner and it works at last. + Keyrefs will fail to resolve to duplicate key/unique entries. + I thought this was already working this way, but it didn't. + The wording of the definition for [node table] in the spec + can lead to a scenario, where keyrefs resolve perfectly, even + if the relevant key-sequences of the referenced key/unique have + duplicates in the subtree. Currently only Saxon 8.5.1 is + dissallowing resolution to duplicate entries correctly - we + will follow Saxon here. + Removed some intel compiler warnings (reported by + Kjartan Maraas, bug #318517). + * pattern.c: Fixed an IDC-XPath problem when resolving to + attributes. + +Mon Oct 14 01:15:14 CEST 2005 Rob Richards + * nanohttp.c include/wsockcompat.h: applied patch from Kolja Nowak + to use getaddrinfo() if supported in Windows build (bug# 317431). + +Mon Oct 10 15:33:48 CEST 2005 Kasimier Buchcik + + * result/schemas/*: Adapted regression test results. + +Mon Oct 10 15:12:43 CEST 2005 Kasimier Buchcik + + * xmlschemas.c include/libxml/schemasInternals.h + include/libxml/xmlerror.h: Initial implementation for + redefinitions; this still misses checks for restrictions + of the content model of complex types. + Fixed default/fixed values for attributes (looks like they + did not work in the last releases). + Completed constraints for attribute uses. + Seperated attribute derivation from attribute constraints. + Completed constraints for attribute group definitions. + Disallowing s of schemas in no target namespace if the + importing schema is a chameleon schema. This contradicts + the way Saxon, Xerces-J, XSV and IBM's SQC works, but the + W3C XML Schema WG, thinks it is correct to dissalow such + imports. + Added cos-all-limited constraints. + Restructured reference resolution to model groups and element + declarations. + Misc cleanup. + +Fri Oct 7 04:34:12 CEST 2005 Rob Richards + + * schematron.c xmlregexp.c: remove warnings under Windows. + +Wed Sep 28 23:42:14 CEST 2005 Daniel Veillard + + * parser.c: applied patch from Massimo Morara fixing bug #317447 + about risk of invalid write in xmlStringLenDecodeEntities + +Tue Sep 27 11:20:57 CEST 2005 Daniel Veillard + + * error.c: Adrian Mouat pointed out redundancies in xmlReportError() + +Mon Sep 26 19:18:24 CEST 2005 Daniel Veillard + + * xmlregexp.c: seems a test to avoid duplicate transition is + really needed at all times. Luka Por gave an example hitting + this. Changed back the internal API. + +Thu Sep 22 13:14:07 CEST 2005 Daniel Veillard + + * xmlreader.c: fixing leak in xmlTextReaderReadString() #316924 + +Thu Sep 15 16:12:44 CEST 2005 Daniel Veillard + + * uri.c: more fixes to the behaviour of xmlBuildRelativeURI + +Thu Sep 15 15:08:21 CEST 2005 Daniel Veillard + + * xmlregexp.c: detect combinatory explosion and return with + a runtime error in those case, c.f. #316338 though maybe we + should not see such an explosion with that specific regexp, + more checking needs to be done. + +Wed Sep 14 19:52:18 CEST 2005 Kasimier Buchcik + + * include/libxml/schemasInternals.h: Added some comments for the + struct fields. + +Wed Sep 14 13:24:27 HKT 2005 William Brack + + * uri.c: fixed problem when xmlBuildRelativeURI was given a + blank path (bug 316224) + +Mon Sep 12 23:41:40 CEST 2005 Daniel Veillard + + * NEWS configure.in doc//*: release of 2.6.22 updated doc and + rebuild. + * xmlsave.c include/libxml/xmlsave.h: added XML_SAVE_NO_XHTML + xmlSaveOption + * xmlschemas.c: minor cleanups + +Mon Sep 12 21:42:47 CEST 2005 Kasimier Buchcik + + * test/schemas/import1_0.xsd: And adapting another one. + +Mon Sep 12 21:29:35 CEST 2005 Kasimier Buchcik + + * result/schemas/derivation-ok-extension_0_0: Adapted result. + +Mon Sep 12 21:20:41 CEST 2005 Kasimier Buchcik + + * result/schemas/allsg_0_3.err result/schemas/allsg_0_4.err + result/schemas/changelog093_1_0.err + result/schemas/derivation-ok-extension_0_0.err + result/schemas/import1_0_0.err + result/schemas/derivation-ok-restriction-2-1-1_0_0.err: + Adapted regression results. + +Mon Sep 12 21:00:53 CEST 2005 Kasimier Buchcik + + * xmlschemas.c include/libxml/schemasInternals.h + include/libxml/xmlerror.h: Completion of the schema graph. + Centralisation, more robustness of the schema document + aquisition story. Centralised and restructured component fixup. + Fixed attribute derivation when 'prohibiting' attribute uses. + Added warnings: when schema documents cannot be localized + during imports; when we get duplicate and pointless attribute + prohibitions. Changed error reports for IDCs to report + the relevant IDC designation as well (requested by GUY Fabrice). + Misc code-cleanup. + +Mon Sep 12 16:02:12 CEST 2005 Daniel Veillard + + * xmlsave.c: applied second patch from David Madore to be less intrusive + when handling scripts and style elements in XHTML1 should fix #316041 + * test/xhtml1 result//xhtml1\*: updated the test accordingly + +Mon Sep 12 15:09:09 CEST 2005 Daniel Veillard + + * libxml.spec.in doc/devhelp/*: finished the integration with + devhelp, completing the index and inserted into the gtk-doc + database at "make install" stage + +Mon Sep 12 14:14:12 CEST 2005 Rob Richards + + * include/libxml/xmlsave.h xmlsave.c: add XML_SAVE_NO_EMPTY save option + and use option from xmlSaveCtxtPtr rather than global during output. + * xmlsave.c: fix some output formatting for meta element under XHTML. + +Mon Sep 12 11:12:03 CEST 2005 Daniel Veillard + + * include/libxml/parser.h parser.c xmllint.c: damn XML_FEATURE_UNICODE + clashes with Expat headers rename to XML_WITH_ to fix bug #316053. + * doc/Makefile.am: build devhelp before the examples. + * doc/*: regenerated the API + +Mon Sep 12 02:03:12 CEST 2005 Daniel Veillard + + * xmlsave.c: fix bug #316034, where xmlElemDump() can crash if + given a document pointer instead of an element + +Mon Sep 12 01:26:16 CEST 2005 Daniel Veillard + + * doc/devhelp/devhelp.xsl: improvements on the html generation, + should be complete with navigation, what is left done is glueing + +Mon Sep 12 00:03:27 CEST 2005 Daniel Veillard + + * configure.in doc/Makefile.am doc/apibuild.py doc/libxml2-api.xml + doc/devhelp/*: started work needed to generate devhelp content, + not too hard based on the existing format and extractor. + +Fri Sep 9 12:56:19 CEST 2005 Daniel Veillard + + * parser.c: fixes bug #315617 when using push CDATA in some cases. + +Thu Sep 8 23:39:41 CEST 2005 Daniel Veillard + + * xmllint.c: patch from Stéphane Bidoul to compile without schematron + +Wed Sep 7 00:16:27 CEST 2005 Daniel Veillard + + * debugXML.c: patch from Oleg Paraschenko to fix xmlDebugDumpNode() + when handled a namespace node. + +Sun Sep 4 23:36:45 CEST 2005 Daniel Veillard + + * NEWS elfgcchack.h testapi.c doc/*: updated the docs and rebuild + releasing 2.6.21 + * include/libxml/threads.h threads.c: removed xmlIsThreadsEnabled() + * threads.c include/libxml/threads.h xmllint.c: added the more + generic xmlHasFeature() as suggested by Bjorn Reese, xmllint uses it. + +Sun Sep 4 22:45:49 CEST 2005 Daniel Veillard + + * configure.in doc/* configure.in: prepare for release + * xpath.c: work for #303289, fix a formatting bug for MIN_INT + +Sun Sep 4 15:48:57 CEST 2005 Daniel Veillard + + * relaxng.c: real fix for #314881 and #314759 is was a bit more complex + than initially expected as ctxt->error == NULL had behaviour side + effects at the compilation level itself. + +Sun Sep 4 14:01:00 CEST 2005 Daniel Veillard + + * pattern.c xpath.c include/libxml/pattern.h: fixing yet another + pattern induced XPath bug #314282 + * relaxng.c: reverted back last change it was seriously broken + +Sat Sep 3 16:51:55 CEST 2005 Rob Richards + + * xmlsave.c: check for NULL to prevent crash with meta elements + +Sat Sep 3 16:26:55 CEST 2005 Daniel Veillard + + * relaxng.c: structured error reporting problem with Relax-NG + should fix #314881 and #314759 + +Sat Sep 3 15:42:29 CEST 2005 Daniel Veillard + + * pattern.c: fixes a portability problem raised by C370 on Z/OS + +Sat Sep 3 15:26:31 CEST 2005 Daniel Veillard + + * SAX2.c tree.c valid.c: fixing a number of issues raised by xml:id + but more generally related to attributes and ID handling, fixes + #314358 among other things + +Fri Sep 2 14:26:43 CEST 2005 Daniel Veillard + + * encoding.c parserInternals.c: avoid passing a char[] as snprintf + first argument. + * threads.c include/libxml/threads.h: implemented xmlIsThreadsEnabled() + based on Andrew W. Nosenko idea. + * doc/* elfgcchack.h: regenerated the API + +Thu Sep 1 14:44:42 CEST 2005 Daniel Veillard + + * configure.in: the use of AM_PATH_PYTHON is not portable enough + reverting back to AM_PATH_PROG + +Thu Sep 1 11:42:39 CEST 2005 Daniel Veillard + + * HTMLparser.c: Applied the last patch from Gary Coady for #304637 + changing the behaviour when text nodes are found in body + * result/HTML/*: this changes the output of some tests + +Thu Sep 1 11:22:37 CEST 2005 Daniel Veillard + + * doc/downloads.html doc/xml.html: adding reference to Bull AIX rpms + c.f. #160598 + +Wed Aug 31 11:39:02 CEST 2005 Daniel Veillard + + * xml2-config.in: removed the obsolete --libtool-libs option, c.f. + bug #314853 + +Fri Aug 26 17:33:26 CEST 2005 Rob Richards + + * xmlsave.c: move handling of meta element for http-equiv in XHTML docs + to serialization and no longer modify internal tree. + +Fri Aug 26 00:51:58 CEST 2005 Daniel Veillard + + * libxml.spec.in: the profiling usually don't work, disabled + * doc/*: rebuilt + +Thu Aug 25 23:47:55 CEST 2005 Daniel Veillard + + * configure.in: trying to fix the first part of #310033 by + detecting gcc <= 3.2 + +Thu Aug 25 22:13:37 CEST 2005 Daniel Veillard + + * error.c: fixed bug #310033, the URI extraction code given a + node is a bit twisted and broke in the last months. + +Thu Aug 25 16:18:15 CEST 2005 Daniel Veillard + + * debugXML.c result/XPath/xptr/strrange2: uninitialized field and + fix on test. + +Thu Aug 25 16:03:05 CEST 2005 Daniel Veillard + + * debugXML.c: change verbosity depending on API + * result/XPath/tests/* result/XPath/xptr/* result/xmlid/*: get back + to previous outputs + +Thu Aug 25 15:14:56 CEST 2005 Daniel Veillard + + * HTMLparser.c parser.c SAX2.c debugXML.c tree.c valid.c xmlreader.c + xmllint.c include/libxml/HTMLparser.h include/libxml/parser.h: + added a parser XML_PARSE_COMPACT option to allocate small + text nodes (less than 8 bytes on 32bits, less than 16bytes on 64bits) + directly within the node, various changes to cope with this. + * result/XPath/tests/* result/XPath/xptr/* result/xmlid/*: this + slightly change the output + +Thu Aug 25 12:16:26 CEST 2005 Daniel Veillard + + * configure.in: patch from Andrew W. Nosenko, use se $GCC = 'yes' + instead of $CC = 'gcc' because GCC may have a different name + +Thu Aug 25 00:18:20 CEST 2005 Daniel Veillard + + * configure.in: changes the way the python binary is found, should + also fix bug #308004 + +Wed Aug 24 16:44:41 CEST 2005 Daniel Veillard + + * parser.c: found another bug while looking at #309616 on missing + entities. + * result/ent2.sax* result/ent7.sax* result/xml2.sax*: this changed the + SAX stream in missing conditions for a few tests + +Wed Aug 24 16:19:00 CEST 2005 Daniel Veillard + + * encoding.c: applied the patch suggested #309565 which can avoid + looping in error conditions. + +Wed Aug 24 16:04:17 CEST 2005 Daniel Veillard + + * SAX2.c tree.c: line numbers are now carried by most nodes, fixing + xmlGetLineNo() c.f. bug #309205 + +Wed Aug 24 14:43:34 CEST 2005 Daniel Veillard + + * encoding.c error.c include/libxml/xmlerror.h: finally converted + the encoding module to the common error reporting mechanism + * doc/* doc/html/libxml-xmlerror.html: rebuilt + +Wed Aug 24 11:35:26 CEST 2005 Daniel Veillard + + * xpath.c: removed a potentially uninitialized variable error + * python/generator.py: fixed a deprecation warning + * python/tests/tstLastError.py: silent the damn test when Okay ! + +Wed Aug 24 00:11:16 CEST 2005 Daniel Veillard + + * SAX2.c globals.c runtest.c testC14N.c testapi.c tree.c + include/libxml/SAX2.h include/libxml/xmlregexp.h: fixed compilation + when configured --without-sax1 and other cleanups fixes bug #172683 + * doc/* elfgcchack.h: regenerated + +Tue Aug 23 20:05:05 CEST 2005 Daniel Veillard + + * parser.c: fixed bug #170489 reported by Jirka Kosek + * test/valid/objednavka.xml test/valid/dtds/objednavka.dtd + result/valid/objednavka*: added the test to the regression suite. + +Tue Aug 23 18:04:08 CEST 2005 Daniel Veillard + + * HTMLparser.c include/libxml/HTMLparser.h: added a recovery mode + for the HTML parser based on the suggestions of bug #169834 by + Paul Loberg + +Tue Aug 23 15:38:46 CEST 2005 Daniel Veillard + + * elfgcchack.h testapi.c doc/*: regenerated + * schematron.c: fixed a compilation problem + * xmlregexp.c include/libxml/xmlregexp.h: some cleanups and one bug fix + * result/expr/base: slightly changes the number of Cons. + +Mon Aug 22 23:19:50 CEST 2005 Daniel Veillard + + * elfgcchack.h testapi.c doc/*: rescanned code and rebuilt + * xmlregexp.c: small cleanup + * include/libxml/schematron.h include/libxml/xmlexports.h + include/libxml/xmlversion.h.in: cleanup problems from code scanner + +Mon Aug 22 18:00:18 CEST 2005 Daniel Veillard + + * xmlschemastypes.c: applied patch from Kuba Nowakowski fixing bug + #313982 + * result/schemas/bug313982* test/schemas/bug313982*: also added + the test case to the regression suite. + +Mon Aug 22 17:50:20 CEST 2005 Daniel Veillard + + * testRegexp.c: printed the wrong string + +Mon Aug 22 16:42:07 CEST 2005 Daniel Veillard + + * testRegexp.c xmlregexp.c include/libxml/xmlregexp.h: exported + xmlExpExpDerive(), added it to the testRegexp command line + tool when providing multiple expressions. + +Mon Aug 22 14:57:13 CEST 2005 Daniel Veillard + + * Makefile.am result/expr/base test/expr/base: added the first + regression test suite set for the new expression support + +Mon Aug 22 13:49:18 CEST 2005 Daniel Veillard + + * valid.c: fixed an uninitialized variable + * xmlregexp.c include/libxml/xmlregexp.h: extended the API to + add the parser, serializer and some debugging + * include/libxml/xmlversion.h.in: made the new support compiled + by default if Schemas is included + * testRegexp.c: cleanup and integration of the first part of the + new code with a special switch + * xmllint.c: show up Expr in --version if compiled in + * include/libxml/tree.h: moved the xmlBuffer definition up + +Mon Aug 22 12:11:10 CEST 2005 Kasimier Buchcik + + * xmlschemas.c: Some preparation for the creation of a graph + of imported/included/redefined schemas; this is needed for + at least the redefinitions. + Centralized the creation of the parser context in one function. + +Mon Aug 22 02:19:33 CEST 2005 Daniel Veillard + + * xmlregexp.c include/libxml/xmlregexp.h: pushing the formal expression + handling code to have it in CVs from now. Not plugged, and misses + APIs it's not compiled in yet. + +Sat Aug 20 23:13:27 CEST 2005 Daniel Veillard + + * xmlreader.c: applied another patch from Rob Richards to fix + xmlTextReaderGetAttributeNs and xmlTextReaderMoveToAttributeNs + +Wed Aug 17 09:06:33 CEST 2005 Daniel Veillard + + * xmlreader.c: applied patch from Rob Richards to fix + xmlTextReaderGetAttribute behaviour with namespace declarations + +Fri Aug 12 14:12:56 CEST 2005 Kasimier Buchcik + + * xmlschemas.c include/libxml/xmlerror.h: + Changed output for keyref-match errors; the target-node will + be now reported rather than the scope-node of the keyref + definition - allowing easier chasing of instance errors. + This was reported by Guy Fabrice to the mailing list. + Some initial parsing code for schema redefinitions. + * result/schemas/bug303566_1_1.err + result/schemas/bug312957_1_0.err: Adapted test results due + to the keyref changes. + +Fri Aug 12 12:17:52 CEST 2005 Daniel Veillard + + * valid.c: applied patch from Derek Poon fixing bug #310692 + +Wed Aug 10 23:39:02 CEST 2005 Daniel Veillard + + * xmlschemas.c: fix for bug #312945 as pointed by Dean Hill, the + context type was not always properly initialized. + +Wed Aug 10 18:21:41 CEST 2005 Daniel Veillard + + * relaxng.c: fixed bug #307377 about validation of choices in + list values. + * test/relaxng/307377* result/relaxng/307377* Makefile.am runtest.c: + added examples to the regression tests, problem is that streaming + version gives slightly more informations. + +Wed Aug 10 15:25:53 CEST 2005 Daniel Veillard + + * xinclude.c: fixed bug #302302, nasty but the fix is rather simple. + +Wed Aug 10 11:59:46 CEST 2005 Kasimier Buchcik + + * result/schemas/any6_1_0*: Added missing test results. + +Tue Aug 9 23:37:22 CEST 2005 Daniel Veillard + + * xmlregexp.c: fixed a determinism detection problem exposed by + ##other tests commited by Kasimier, also added a small speedup + of determinism detection. + * test/results/any6_2_0* any8_1_0* any7_1_2* any7_2_2*: added + the results to the regression tests now + +Tue Aug 9 15:54:09 CEST 2005 Kasimier Buchcik + + * test/schemas/any7_2.xml test/schemas/any6_2.xsd + test/schemas/any8_1.xsd test/schemas/any8_0.xml: + Added some more tests for element wildcards. + +Tue Aug 9 14:22:47 CEST 2005 Kasimier Buchcik + + * xmlschemas.c: Fixed #312957 reported by Carol Hunter: + streaming XPath states were not popped in every case, + thus failed to resolve correctly for subsequent input. + * test/schemas/bug312957* result/schemas/bug312957*: + Added the test submitted by Carol Hunter. + +Tue Aug 9 13:07:27 CEST 2005 Daniel Veillard + + * xmlregexp.c xmlschemas.c: trying to nail down the remaining + ##other issues + * result/schemas/any7* test/schemas/any7: completed the tests + and added the results + * result/schemas/any3_0_0.err result/schemas/any5_0_0.err + result/schemas/any5_1_0.err: this slightly chnages the output + from 3 existing tests + +Mon Aug 8 22:33:08 CEST 2005 Daniel Veillard + + * nanoftp.c nanohttp.c xmlschemastypes.c: applied patch from + Marcus Boerger to remove warnings on Windows. + +Mon Aug 8 16:43:04 CEST 2005 Daniel Veillard + + * xmlsave.c include/libxml/xmlsave.h: fixed #145092 by adding + an xmlSaveOption to omit XML declaration + +Mon Aug 8 15:44:54 CEST 2005 Daniel Veillard + + * HTMLtree.c: fixed bug #310333 with a patch close to the provided + patch for HTML UTF-8 serialization + * result/HTML/script2.html: this changed the output of that test + +Mon Aug 8 15:01:51 CEST 2005 Daniel Veillard + + * xmlregexp.c: fixed bug #310264, basically it's about reentrancy + of count based transition, when going though the counter must + be reset to 0 + * test/schemas/bug310264* result/schemas/bug310264*: added the + regression test. + +Mon Aug 8 14:40:52 CEST 2005 Kasimier Buchcik + + * xmlschemas.c: Fixed a memory leak: xmlSchemaFreeAnnot() was + only freeing the first annotation in the list. + +Mon Aug 8 09:44:34 CEST 2005 Daniel Veillard + + * xmlreader.c: applied patch from Rob Richards fixing + xmlTextReaderGetAttribute + +Mon Aug 8 01:41:53 CEST 2005 Daniel Veillard + + * HTMLparser.c: fixed an uninitialized memory access spotted by + valgrind + +Sun Aug 7 12:39:35 CEST 2005 Daniel Veillard + + * test/relaxng/docbook_0.xml: get rid of the dependancy on a locally + installed DTD + * uri.c include/libxml/uri.h xmlIO.c nanoftp.c nanohttp.c: try to + cleanup the Path/URI conversion mess, needed fixing in various + layers and a new API to the uri module which also fixes #306861 + * runtest.c: integrated a regression test specific to check the + URI conversions done before calling the I/O handlers. + +Sat Aug 6 11:06:24 CEST 2005 Daniel Veillard + + * doc/XSLT.html doc/xml.html: small doc fix for #312647 + +Tue Aug 2 13:26:42 CEST 2005 Daniel Veillard + + * win32/configure.js: applied patch from Rob Richards to allow + disabling modules in win32, fixes #304071 + +Mon Aug 1 07:18:53 CEST 2005 Daniel Veillard + + * python/libxml.c: applied fix from Jakub Piotr Clapa for + xmlAttr.parent(), closing #312181 + +Sun Jul 31 18:48:55 CEST 2005 Daniel Veillard + + * schematron.c: report improvement + * test/schematron/zvon* result/schematron/zvon*: more tests + +Sun Jul 31 16:02:59 CEST 2005 Daniel Veillard + + * win32/Makefile.msvc win32/configure.js: applied patch from Rob + Richards to add schematron to the build on Windows + * test/schematron/zvon3* result/schematron/zvon3*: second test + * test/schematron/zvon10* result/schematron/zvon10*: this is the + real second test 10 and 2 are swapped. + +Sun Jul 31 15:42:31 CEST 2005 Daniel Veillard + + * schematron.c: more bug fixes, improve the error reporting. + * test/schematron/zvon2* result/schematron/zvon2*: second test + +Sun Jul 31 14:15:31 CEST 2005 Daniel Veillard + + * schematron.c xmllint.c: fixing the loop bug, fixing schematron + text error rendering + * Makefile.am result/schematron/* test/schematron/zvon1*.sct: + started integrating within "make tests" + +Sat Jul 30 17:26:58 EDT 2005 Daniel Veillard + + * test/schematron/*: a few first tests from Zvon unfortunately + with the old syntax + +Sat Jul 30 17:08:07 EDT 2005 Daniel Veillard + + * schematron.c xmllint.c include/libxml/schematron.h: commiting + work done on the plane last week-end + +Sat Jul 30 15:16:29 CEST 2005 Daniel Veillard + + * runtest.c: allows an extra argument to subset the tests + * xmlregexp.c: big speedup for validation, basically avoided + transition creation explosion when removing epsilon transition + +Sat Jul 30 00:00:46 CEST 2005 Daniel Veillard + + * Makefile.am globals.c parserInternals.c xmlreader.c xmlunicode.c + xmlwriter.c: more cleanups based on sparse reports, added + "make sparse" + +Fri Jul 29 12:11:25 CEST 2005 Daniel Veillard + + * python/libxml.c: don't output any message on failed resolver lookups, + better done by the python user provided resolver layer. + +Fri Jul 29 01:48:02 CEST 2005 Daniel Veillard + + * HTMLparser.c SAX2.c encoding.c globals.c parser.c relaxng.c + runsuite.c runtest.c schematron.c testHTML.c testReader.c + testRegexp.c testSAX.c testThreads.c valid.c xinclude.c xmlIO.c + xmllint.c xmlmodule.c xmlschemas.c xpath.c xpointer.c: a lot of + small cleanups based on Linus' sparse check output. + +Thu Jul 28 21:28:33 CEST 2005 Daniel Veillard + + * include/libxml/Makefile.am: added schematron.h, oops ... + +Thu Jul 28 02:38:21 CEST 2005 Kasimier Buchcik + + * xmlschemastypes.c: Added creation of the content type of + xs:anyType. This is needed when trying to extend xs:anyType + (although it makes no sense to extend it; IMHO the schema + people should have ruled this out). This was reported + by Yong Chen to the mailing list. + * xmlschemas.c: Fixed handling of xs:anyType in + xmlSchemaCheckCOSCTExtends() (reported by Young Chen). Tiny + adjustment to an error report output. + * test/schemas/extension2* result/schemas/extension2*: + Added a test case provided by Young Chen. + +Mon Jul 25 11:41:18 PDT 2005 William Brack + + * uri.c: enhanced xmlBuildRelativeURI to allow the URI and the + base to be in "relative" form + +Sun Jul 24 10:25:41 EDT 2005 Daniel Veillard + + * schematron.c xmllint.c: started adding schematron to the xmllint + tool, the report infrastructure is gonna be fun. + +Sat Jul 23 23:23:51 CEST 2005 Kasimier Buchcik + + * test/schemas/any6* test/schemas/any7*: Added regression tests + (they fail currently), but did not added results yet. + +Sat Jul 23 23:07:05 CEST 2005 Kasimier Buchcik + + * xmlschemas.c: Removed the workaround code in + xmlSchemaValidateElemWildcard() for the wildcard + with namespace == ##other. Support for such wildcards was + implemented by Daniel at the automaton level recently, and + the workaround code iterfered with it. + +Sat Jul 23 10:55:50 EDT 2005 Daniel Veillard + + * pattern.c include/libxml/pattern.h: changed xmlPatterncompile + signature to pass an int and not an enum since it can generate + ABI compat troubles. + * include/libxml/schematron.h schematron.c: adding the new + schematron code, work in progress lots to be left and needing + testing + * include/libxml/xmlversion.h.in include/libxml/xmlwin32version.h.in + Makefile.am configure.in: integration of schematron into the + build + * xpath.c include/libxml/xpath.h: adding flags to control compilation + options right now just XML_XPATH_CHECKNS. + +Sat Jul 23 16:39:35 CEST 2005 Kasimier Buchcik + + * xmlschemas.c: Removed an "internal error" message from + xmlSchemaBuildAContentModel() when an empty model group + definition is hit. + +Sat Jul 23 00:34:07 CEST 2005 Kasimier Buchcik + + * pattern.c: Changed xmlCompileStepPattern() and + xmlCompileAttributeTest() to handle the "xml" prefix without + caring if the XML namespace was supplied by the user. + +Fri Jul 22 00:08:43 CEST 2005 Kasimier Buchcik + + * xmlschemas.c: Fixed xmlSchemaPSimpleTypeErr(), which did not + output the given string arguments correctly. + +Thu Jul 21 09:21:00 EDT 2005 Daniel Veillard + + * error.c globals.c parser.c runtest.c testHTML.c testSAX.c + threads.c valid.c xmllint.c xmlreader.c xmlschemas.c xmlstring.c + xmlwriter.c include/libxml/parser.h include/libxml/relaxng.h + include/libxml/valid.h include/libxml/xmlIO.h + include/libxml/xmlerror.h include/libxml/xmlexports.h + include/libxml/xmlschemas.h: applied a patch from Marcus Boerger + to fix problems with calling conventions on Windows this should + fix #309757 + +Wed Jul 20 14:45:39 CEST 2005 Daniel Veillard + + * parser.c: an optimization of the char data inner loop, + can gain up to 10% in pure SAX2 parsing speed + * xmlschemas.c: applied patch from Kupriyanov Anatolij fixing + a bug in XML Schemas facet comparison #310893 + +Tue Jul 19 17:27:26 CEST 2005 Daniel Veillard + + * xmlregexp.c xmlschemas.c: fixed the error reporting for + not transitions + * result/schemas/any5_0_0* result/schemas/any5_0_2* + result/schemas/any5_1_0*: fixed output + +Tue Jul 19 15:34:12 CEST 2005 Daniel Veillard + + * xmlregexp.c xmlschemas.c include/libxml/xmlautomata.h: fixing + bug #172215 about foreign namespaces by adding support for + negated string transitions. Error messages still need to be + improved. + * test/schemas/any5* result/schemas/any5*: adding regression + tests for this. + +Tue Jul 19 12:33:31 CEST 2005 Daniel Veillard + + * tree.c: applied patch from Alexander Pohoyda fixing xmlGetNodePath + on namespaced attributes #310417. + +Mon Jul 18 23:01:15 CEST 2005 Daniel Veillard + + * doc/xmllint.1 doc/xmllint.html doc/xmllint.xml: --nonet was + ducplicated + +Mon Jul 18 20:49:28 CEST 2005 Daniel Veillard + + * xmlschemas.c: fixed xsd:all when used in conjunction with + substitution groups + * test/schemas/allsg_* result/schemas/allsg_*: adding specific + regression tests, strangely missing from NIST/Sun/Microsoft + testsuites + +Sun Jul 17 07:11:27 CEST 2005 Daniel Veillard + + * xmlschemas.c: fixed bug #307508, a bad automata was built but + this showed as an indeterminist result + +Thu Jul 14 17:53:02 CEST 2005 Daniel Veillard + + * xmlschemastypes.c: found the last bug raised by NIST tests in + comparing base64 strings, result from runsuite: + ## NIST test suite for Schemas version NIST2004-01-14 + Ran 23170 tests (3953 schemata), no errors + +Thu Jul 14 14:57:36 CEST 2005 Daniel Veillard + + * testRegexp.c: fixed where xmlMemoryDump() should be called. + * xmlregexp.c: fixed handling of {0}, \n, \r and \t, two bugs + affecting NIST regression tests + +Thu Jul 14 11:30:24 CEST 2005 Daniel Veillard + + * configure.in: applied a patch from Gerrit P. Haase to add + module support on cygwin + +Thu Jul 14 10:56:42 CEST 2005 Daniel Veillard + + * HTMLparser.c: fixed a potential buffer overrun error introduced + on last commit to htmlParseScript() c.f. #310229 + +Thu Jul 14 23:48:17 PDT 2005 William Brack + + * xpath.c: Changed the behaviour of xmlXPathEqualNodeSetFloat to + return TRUE if a nodeset with a numeric value of NaN is compared + for inequality with any numeric value (bug 309914). + +Thu Jul 14 01:03:03 CEST 2005 Daniel Veillard + + * error.c relaxng.c xmlreader.c xmlschemas.c include/libxml/relaxng.h + include/libxml/xmlschemas.h: applied patch from Marcus Boerger + to route relaxng and schemas error messages when using the reader + through the structured interface if activated. + * elfgcchack.h doc/* testapi.c: rebuilt since this add new APIs + to test. + +Wed Jul 13 18:35:47 CEST 2005 Daniel Veillard + + * HTMLparser.c: applied UTF-8 script parsing bug #310229 fix from + Jiri Netolicky + * result/HTML/script2.html* test/HTML/script2.html: added the test + case from the regression suite + +Tue Jul 12 17:08:11 CEST 2005 Daniel Veillard + + * nanohttp.c: fixed bug #310105 with http_proxy environments with + patch provided by Peter Breitenlohner + +Mon Jul 11 00:28:10 CEST 2005 Daniel Veillard + + * Makefile.am NEWS configure.in doc/*: preparing release 2.6.20 + * xmllint.c: removed a compilation problem + +Sun Jul 10 23:33:41 CEST 2005 Daniel Veillard + + * xstc/Makefile.am README README.tests Makefile.tests Makefile.am: + preparing to make testsuite releases along with code source releases + * gentest.py testapi.c: fixed a couple of problem introduced by + the new Schemas support for Readers + * xpath.c: fixed the XPath attribute:: bug #309580, #309864 in a crude + but simple way. + * xmlschemas.c include/libxml/tree.h: fixed a couple of problems + raised by the doc builder. + * doc/*: made rebuild + +Sun Jul 10 21:51:16 CEST 2005 Daniel Veillard + + * xmlschemas.c: fixed a bug introduced on last commit + +Sun Jul 10 21:00:54 CEST 2005 Daniel Veillard + + * doc/xmllint.1 doc/xmllint.html doc/xmllint.xml: fixed a typo + pointed by Jeroen Ruigrok + * include/libxml/xmlreader.h include/libxml/xmlschemas.h: increased + the APIs for xmlReader schemas validation support + * xmllint.c xmlreader.c xmlschemas.c: xmlReader schemas validation + implementation and testing as xmllint --stream --schema ... + +Sun Jul 10 16:11:26 CEST 2005 Daniel Veillard + + * include/libxml/xmlwin32version.h.in: try to avoid conflicts. + +Sat Jul 9 19:29:10 CEST 2005 Daniel Veillard + + * parser.c: fix for #309761 from Dylan Shell + * xmlschemas.c include/libxml/xmlschemas.h: added xmlSchemaSAXPlug + and xmlSchemaSAXUnplug generic APIs for SAX Schemas validation. + * xmllint.c: couple of fixes plus added descriptions for --sax and + --sax1 + +Fri Jul 8 23:35:00 CEST 2005 Kasimier Buchcik + + * xmlschemas.c: Added c-props-correct constraint to check + for equal cardinality of keyref/key. + * include/libxml/xmlerror.h: Added an error code. + +Fri Jul 8 21:56:04 CEST 2005 Kasimier Buchcik + + * pattern.c: Fixed evaluation of attributes. Actually only + attribute at the first level were evaluated (e.g. "@attr"); + expression like "foo/@attr" always failed. + +Fri Jul 8 20:04:29 CEST 2005 Kasimier Buchcik + + * xmlschemas.c: tiny fix in xmlSchemaValidateStream() if a + user-provided SAX handler is given. + +Fri Jul 8 19:25:26 CEST 2005 Daniel Veillard + + * parser.c: fix some potential leaks in error cases. + * xmllint.c: added --sax, to allow testing of --schemas --sax and + various other combinations. + * xmlschemas.c: fix a couple of tiny problems in + xmlSchemaValidateStream() + +Fri Jul 8 18:34:22 CEST 2005 Kasimier Buchcik + + * xmlschemas.c: Changed xmlSchemaValidateFile() to use + xmlSchemaValidateStream() internally. + +Fri Jul 8 17:02:14 CEST 2005 Daniel Veillard + + * test/relaxng/docbook_0.xml: added the missing entity to the + document internal subset to avoid errors if the DocBook catalogs + are not there + * xmlschemas.c: first cut at implementing xmlSchemaValidateStream() + untested yet + +Wed Jul 6 15:45:48 PDT 2005 William Brack + + * parser.c: fixed problem with free on dupl attribute in + dtd (bug309637). + * test/errors/attr3.xml, result/errors/attr3.*: added + regression test for this + +Wed Jul 6 13:11:35 PDT 2005 William Brack + + * win32/Makefile.msvc: try again to fix file format for Windows + +Wed Jul 6 12:20:13 PDT 2005 William Brack + + * win32/Makefile.msvc: removed spurious ^M + * runtest.c: added check for option O_BINARY + * test/schemas/bug309338*, result/schemas/bug309338*: changed + sticky tag to 'binary' + +Wed Jul 6 10:38:02 PDT 2005 William Brack + + * debugXML.c: excluded content string check for XML_ELEMENT_DECL + in xmlCtxtGenericNodeCheck + * runtest.c: changed "open" calls to include O_BINARY for Windows + +Wed Jul 6 17:14:03 CEST 2005 Daniel Veillard + + * parser.c: fixing bug #166777 (and #169838), it was an heuristic + in areBlanks which failed. + * result/winblanks.xml* result/noent/winblanks.xml test/winblanks.xml: + added the input file to the regression tests + +Wed Jul 6 13:40:22 CEST 2005 Kasimier Buchcik + + * xmlschemastypes.c: Fixed bug #309338, reported by Kupriyanov + Anotolij. + * test/schemas/bug309338* result/schemas/bug309338*: + Added a regression test for the above bug. + +Tue Jul 5 16:03:05 CEST 2005 Daniel Veillard + + * Makefile.am: first steps toward a testsuite dist + * SAX2.c include/libxml/xmlerror.h: fixed bug #307870 + +Tue Jul 5 12:38:36 CEST 2005 Kasimier Buchcik + + * runsuite.c runtest.c: Tiny portability adjustment for win. + * win32/Makefile.*: Added runtest.exe and runsuite.exe to + be created. + +Mon Jul 4 17:44:26 CEST 2005 Daniel Veillard + + * runsuite.c: first stb at unimplemnted detection + * runtest.c: fixing Windows code + +Mon Jul 4 17:19:31 CEST 2005 Daniel Veillard + + * runsuite.c: fix on schemas error + * runtest.c: portability glob() on Windows + +Mon Jul 4 16:23:54 CEST 2005 Daniel Veillard + + * runsuite.c runtest.c: cleanups, logfile and portability + * xmllint.c: fixed a memory leak + +Mon Jul 4 13:11:12 CEST 2005 Daniel Veillard + + * parser.c: fixed a bug failing to detect UTF-8 violations in + CData in push mode. + * result/errors/cdata.xml* test/errors/cdata.xml: added the test + to the regressions + +Mon Jul 4 11:26:57 CEST 2005 Daniel Veillard + + * debugXML.c: added enhancement for #309057 in xmllint shell + +Mon Jul 4 00:58:44 CEST 2005 Daniel Veillard + + * HTMLparser.c: applied patch from James Bursa fixing an html parsing + bug in push mode + * result/HTML/repeat.html* test/HTML/repeat.html: added the test to the + regression suite + +Sun Jul 3 23:42:31 CEST 2005 Daniel Veillard + + * testapi.c tree.c: fixing a leak detected by testapi in + xmlDOMWrapAdoptNode, and fixing another side effect in testapi + seems to pass tests fine now. + * include/libxml/parser.h parser.c: xmlStopParser() is no more limited + to push mode + * error.c: remove a warning + * runtest.c xmllint.c: avoid compilation errors if only some parts + of the library are compiled in. + +Mon Jul 4 00:39:35 CEST 2005 Daniel Veillard + + * gentest.py testapi.c: fix a problem with previous patch to + testapi.c + +Sun Jul 3 22:59:28 CEST 2005 Daniel Veillard + + * runsuite.c runtest.c tree.c: fixing compilations when + disabling parts of the library at configure time. + +Sun Jul 3 18:17:58 CEST 2005 Daniel Veillard + + * parserInternals.c: fix bug raised by zamez on IRC + * testapi.c: regenerated, seems to pop-up leaks in new tree functions + * tree.c: added comments missing. + * doc/*: regenerated + +Sun Jul 3 18:06:55 CEST 2005 Daniel Veillard + + * testapi.c runsuite.c runtest.c: fixing #307823 and a couple of + assorted bugs + * python/generator.py python/libxml2-python-api.xml: fixed + conditionals in generator too + * doc/apibuild.py doc/libxml2-api.xml doc/* elfgcchack.h: some + cleanups too and rebuilt + +Sun Jul 3 16:42:00 CEST 2005 Daniel Veillard + + * xmlIO.c: fixed bug #307503 misplaced #ifdef + +Sun Jul 3 16:34:47 CEST 2005 Daniel Veillard + + * runsuite.c: expanded test + * xmlregexp.c: found and fixed the leak exposed by Microsoft regtests + +Sat Jul 2 23:38:24 CEST 2005 Daniel Veillard + + * runsuite.c: a bit of progresses on xstc + +Sat Jul 2 09:30:13 CEST 2005 Daniel Veillard + + * runsuite.c: completed the simple checks for Relax-NG suites + back to the same 11 errors as in the Python runs. + +Thu Jun 30 15:01:52 CEST 2005 Daniel Veillard + + * runtest.c: complete, checking on other platforms is needed + * README: updated + * debugXML.c: fix a bug raised by bill on IRC + * relaxng.c: fix a leak in weird circumstances + * runsuite.c Makefile.am: standalone test tool agaisnt + the regression suites, work in progress + +Tue Jun 28 08:30:26 CEST 2005 Daniel Veillard + + * runtest.c: adding URI tests + +Mon Jun 27 23:55:56 CEST 2005 Daniel Veillard + + * runtest.c: adding xml:id + +Mon Jun 27 23:29:36 CEST 2005 Daniel Veillard + + * runtest.c: finishing XPath, adding XPointer + +Mon Jun 27 17:39:27 CEST 2005 Daniel Veillard + + * runtest.c: adding more coverage, XInclude and starting XPath + +Mon Jun 27 17:02:14 CEST 2005 Kasimier Buchcik + + * tree.c include/libxml/tree.h: Added allocation/deallocation + functions for the DOM-wrapper context. + +Mon Jun 27 15:41:30 CEST 2005 Kasimier Buchcik + + * tree.c: Commented the new functions to be experimental. + +Mon Jun 27 14:41:14 CEST 2005 Daniel Veillard + + * error.c valid.c: working some weird error reporting problem for + DTD validation. + * runtest.c: augmented with DTD validation tests + * result/VC/OneID*: slight change in validation output. + +Mon Jun 27 13:44:41 CEST 2005 Daniel Veillard + + * runtest.c: added most HTML tests + +Mon Jun 27 14:06:10 CEST 2005 Kasimier Buchcik + + * test/namespaces/reconcile/tests.xml + test/namespaces/reconcile/tests-to-c.xsl: Added initial tests + for some new DOM-wrapper helping functions. + +Mon Jun 27 14:01:06 CEST 2005 Kasimier Buchcik + + * xstc/xstc-to-python.xsl: Cleanup. + * xstc/sun-test-def.xml xstc/nist-test-def.xml xstc/ms-test-def.xml: + Removed, those are not needed anymore due to the new test suite. + +Mon Jun 27 11:39:50 CEST 2005 Daniel Veillard + + * result/*.sax2 MAkefile.am: added SAXv2 regression tests apparently + missing. + * runtest.c: added SAX1/SAX2 checks. + +Mon Jun 27 12:24:54 CEST 2005 Kasimier Buchcik + + * tree.c include/libxml/tree.h: Added + xmlDOMWrapReconcileNamespaces(), xmlDOMWrapAdoptNode() and + xmlDOMWrapRemoveNode() to the API. These are functions intended + to be used with DOM-wrappers. + +Mon Jun 27 10:14:57 CEST 2005 Daniel Veillard + + * runtest.c: continue to increase the tests + +Mon Jun 27 09:21:49 CEST 2005 Daniel Veillard + + * runtest.c: continue to increase the tests + +Mon Jun 27 01:01:32 CEST 2005 Daniel Veillard + + * runtest.c: continue to increase the tests + +Sun Jun 26 20:08:24 CEST 2005 Daniel Veillard + + * include/libxml/valid.h valid.c: avoid name glob in agruments as + it matches the glob() routine. + * runtest.c Makefile.am: first steps toward a C regression test + framework. + +Sat Jun 25 01:37:22 PDT 2005 William Brack + + * configure.in: fixed a problem with the detection of + ss_family for ipV6, as reported on the mailing list by + Doug Orleans. + +Tue Jun 21 10:44:34 CEST 2005 Kasimier Buchcik + + * test/schemas/empty-value* result/schemas/empty-value*: + Added regression tests (from Dhyanesh). + +Tue Jun 21 10:35:43 CEST 2005 Kasimier Buchcik + + * xmlschemas.c: Fixed NULL values to be validated as empty + string values (reported by Dhyanesh to the mailing list). + Adjusted text concatenation of mixed content. + +Mon Jun 20 18:11:32 CEST 2005 Daniel Veillard + + * tree.c valid.c: applied patch from Rob Richards for removal + of ID (and xml:id) + * xmlreader.c: applied patch from James Wert implementing + xmlTextReaderReadInnerXml and xmlTextReaderReadOuterXml + +Thu Jun 16 14:38:22 CEST 2005 Kasimier Buchcik + + * xmlschemas.c: Fixed SAX2 validation: grow of internal + namespace list, appending of element character content. + * xstc/xstc.py: Added "--sax" option for SAX2 validation. + +Wed Jun 15 15:34:52 CEST 2005 Kasimier Buchcik + + * xmlschemastypes.c: Added missing function descriptions. + +Wed Jun 15 15:26:14 CEST 2005 Daniel Veillard + + * xmllint.c: if sax1 is used and input is a file use the old + API xmlParseFile() + * xmlschemas.c: cleanups + * doc/* testapi.c elfgcchack.h: rebuilt to add python bindings + for the new functions in Schemas. + +Wed Jun 15 14:50:48 CEST 2005 Kasimier Buchcik + + * xmlschemas.c include/libxml/xmlschemas.h: Added + xmlSchemaValidateFile() to the public API. This will use + SAX2-driven validation. + +Wed Jun 15 11:11:38 CEST 2005 Kasimier Buchcik + + * result/schemas/bug306806_1_0 result/schemas/bug306806_1_0.err: + Added schema test results (Tom Browder, bug #306806). + +Wed Jun 15 11:08:34 CEST 2005 Kasimier Buchcik + + * test/schemas/bug306806_1.xsd test/schemas/bug306806_0.xml: + Added schema tests submitted by Tom Browder (bug #306806). + +Tue Jun 14 15:03:22 PDT 2005 William Brack + + * pattern.c: adjusted last change to xmlCompilePathPattern, + fixed one compilation warning + +Tue Jun 14 21:19:16 CEST 2005 Kasimier Buchcik + + * pattern.c: Some changes/fixes to the streaming evaluation. + * xmlschemas.c: A bit of support for parsing the schema for + schema. Fixed attribute derivation when the use is + "prohibited" and was "optional". Fixed an attribute construction + bug, a left-over from the time, where , + , etc. where created as structs. + +Tue Jun 14 12:35:12 CEST 2005 Daniel Veillard + + * libxml-2.0.pc.in: removed a redundant include path + +Mon Jun 13 14:58:33 CEST 2005 Kasimier Buchcik + + * xstc/Makefile.am: Some more adjustments. + +Mon Jun 13 14:35:59 CEST 2005 Kasimier Buchcik + + * xstc/Makefile.am: Changed test extraction process, since some + boxes don't know about "tar --strip-path". + +Mon Jun 13 13:39:43 CEST 2005 Daniel Veillard + + * relaxng.c: fixed a bug exposed by Rob Richards in the mailing-list + * result//compare0* test//compare0*: added the regression test in + the suite as this went unnoticed ! + +Wed Jun 9 11:07:42 PDT 2005 William Brack + + * pattern.c, xpath.c, include/libxml/pattern.h: Further + enhancement for XPath streaming, consolidated with + schemas usage of pattern.c. Added a new enum + xmlPatternFlags. + * doc/*, testapi.c, elfgcchack.h: updated to reflect new + enum. + * test/XPath/tests/mixedpat, test/XPath/docs/mixed, + result/XPath/mixedpat: added regression test for problems + reported in bug306348 + +Thu Jun 9 16:51:31 CEST 2005 Kasimier Buchcik + + * xmlschemastypes.c: Changed non-prefixed QNames to be bound to a + default namespace if existent. + +Thu Jun 9 15:11:38 CEST 2005 Kasimier Buchcik + + * xmlschemastypes.c: Fixed a bug which I invented: hexBinary's string + values were not duplicated corrently when creating a computed value + in xmlSchemaValAtomicType. + +Thu Jun 9 13:20:57 CEST 2005 Kasimier Buchcik + + * xmlschemas.c result/schemas/include1_0_0.err: + Fixed an attribute fixed/default value constraint error. + +Thu Jun 9 12:51:23 CEST 2005 Kasimier Buchcik + + * result/schemas/*: Adapted regression test results. + +Thu Jun 9 12:22:45 CEST 2005 Kasimier Buchcik + + * xmlschemas.c xmlschemastypes.c include/libxml/schemasInternals.h + include/libxml/xmlschemastypes.h: Changed the validation process + to be able to work in streaming mode. Some datatype fixes, + especially for list and union types. Due to the changes the + error report output has changed in most cases. Initial migration to + functions usable by both, the parser and the validator. This should + ease a yet-to-come XS construction API in the long term as well. + +Thu Jun 9 10:16:11 CEST 2005 Daniel Veillard + + * parser.c: applied patch from Malcolm Rowe to avoid namespace + troubles on rollback parsing of elements start #304761 + * test/nsclean.xml result/noent/nsclean.xml result/nsclean.xml*: + added it to the regression tests. + +Thu Jun 9 00:33:50 CEST 2005 Daniel Veillard + + * parser.c include/libxml/xmlerror.h: applied patch from Rob Richards + for xml:space and xml:lang handling with SAX2 api. + +Wed Jun 8 19:41:38 CEST 2005 Daniel Veillard + + * globals.c: applied patch from Morten Welinder, closing bug #306901 + on compiling subsets of the library + +Wed Jun 8 19:11:42 CEST 2005 Kasimier Buchcik + + * xstc/Makefile.am xstc.py xstc-to-python.xsl: Adapted the + XS tests to use the new release of tests and test-definitions. + +2005-06-07 Aleksey Sanin + + * c14n.c: fix rendering of attributes when parent node + is not in the node set + +2005-06-06 Aleksey Sanin + + * c14n.c: fixed xml attributes processing bug in exc c14n + * xmllint.c: added --exc-c14n command line option + +Mon Jun 6 06:43:33 PDT 2005 William Brack + + * xpath.c, pattern.c: Enhanced xmlXPathRunStreamEval, fixed + handling of depth/level for cases like union operator + (bug #306348 reported by Bob Stayton). Also enhanced + several comments throughout pattern.c. + * doc/apibuild.py: fixed problem in handling of + 'signed' declaration. Rebuilt the docs. + +Tue May 31 20:35:27 PDT 2005 William Brack + + * xinclude.c: Enhanced handling of xml:base for included + elements, fixing bugs 169209 and 302353. + +Wed May 25 18:59:53 CEST 2005 Kasimier Buchcik + + * xmlschemas.c: Fixed facet errors to be channelled back for + union type members; facet-validation will stop now on the + first error. Reported by GUY Fabrice to the mailing-list. + * xmlschemastypes.c: Changed to ignore lengh-related facet + validation for QNames and NOTATIONs as proposed by the + schema people. + * test/schemas/union2* result/schemas/union2*: Added + regression tests for union types (by GUY Fabrice). + +Fri May 20 20:48:08 CEST 2005 Daniel Veillard + + * xmlsave.c: applied patch from Mark Vakoc fixing saving of + CDATA with NULL content. + +Thu May 12 15:14:26 CEST 2005 Kasimier Buchcik + + * xmlschemastypes.c: Changed the VALID_TZO macro to restrict + the timezone to -840 to 840. + +Thu May 12 15:05:11 CEST 2005 Kasimier Buchcik + + * xmlschemastypes.c: Applied patch from Steve Nairn (bug #303670) + for "signed int" of the date-time timezone field. Silenced + a warning. + +Wed May 11 20:04:09 CEST 2005 Daniel Veillard + + * tree.c: applied patch for replaceNode from Brent Hendricks + +Tue May 10 17:27:52 CEST 2005 Daniel Veillard + + * tree.c: fixed bug #303682 of a leak reported by Malcolm Rowe + +Tue May 10 11:50:16 CEST 2005 Daniel Veillard + + * testapi.c: applied patch from Steve Nairn tof fix the compilation + problem exposed in bug #303640 + +Tue May 10 11:11:26 CEST 2005 Kasimier Buchcik + + * test/schemas/bug303566_1* result/schemas/bug303566_1_1*: + Added regression a test provided by Heiko Oberdiek (bug #303566). + +Mon May 9 17:56:58 CEST 2005 Kasimier Buchcik + + * pattern.c: Changed the XPath "." to resolve only on the first + level for XML Schema IDCs (bug #303566 reported by Heiko Oberdiek). + This should not affect pattern-like resolution on every level. + +Sun May 8 13:35:39 CEST 2005 Daniel Veillard + + * xmlmemory.c: fixed #169630 segfault in xmlMemDisplay + +Fri May 6 13:40:03 CEST 2005 Daniel Veillard + + * nanoftp.c: fixing bug #303068 increasing the nanoftp buffer. + * doc/apibuild.py: fixed __attribute() parsing problem + * doc/* testapi.c: regenerated the descriptions and docs. + +Wed May 4 11:16:00 CEST 2005 Daniel Veillard + + * Makefile.am configure.in threads.c: on linux/gcc use weak definitions + to avoid linking with pthread library on non-threaded environments. + * xpath.c: applied patch from Mark Vakoc w.r.t. a buggy namespace + list allocation. + +Fri Apr 29 11:27:37 CEST 2005 Kasimier Buchcik + + * parser.c: Fixed a test for duplicate attributes: Non-prefixed + attributes were treated as being bound to the default namespace. + +Tue Apr 19 17:51:32 CEST 2005 Kasimier Buchcik + + * xmlschemastypes.c: Fixed date-time related validation + (reported by David Crossley, bug #300576). + +Tue Apr 19 16:55:40 CEST 2005 Kasimier Buchcik + + * xmlschemas.c xmlregexp.c: Removed 5 unnecessary + dereferences (reported by Andriy, bug #301074). + +Tue Apr 19 22:33:18 HKT 2005 William Brack + + * xpath.c: Added some code to avoid integer overflow for + ceil, floor and round functions (bug 301162) + +Tue Apr 19 13:21:54 CEST 2005 Kasimier Buchcik + + * xmlschemas.c: Removed workaround for bug #172215, since it + does more harm in some scenarios. Added some of the + "Particle Restriction OK" constraints - not yet enabled. + +Mon Apr 18 13:02:55 CEST 2005 Kasimier Buchcik + + * result/schemas/changelog093*: Added test results. + +Mon Apr 18 12:42:14 CEST 2005 Kasimier Buchcik + + * xmlschemas.c: Added output of canonical values in + identity-constraint error messages. + * xmlschemastypes.c include/libxml/xmlschemastypes.h: + Added xmlSchemaGetCanonValueWhtsp() to the API. + Further enhancement of the canonical value + conversion. + * test/schemas/changelog093_0.*: Added test with an XSD + submitted by Randy J. Ray. + +Fri Apr 15 09:33:21 HKT 2005 William Brack + + * valid.c: Applied Daniel's fix for memory leak in dtd + prefix (bug 300550). + * xpath.c: minor change to comment only + +Thu Apr 14 20:52:41 CEST 2005 Daniel Veillard + + * xmlmemory.c: added the call to the breakpoint routine + when a monitored block is reallocated or freed + +Wed Apr 13 05:55:51 CEST 2005 Daniel Veillard + + * nanohttp.c: applied patch from Aron Stansvik for bug #172525 + about HTTP query string parameter being lost + +Tue Apr 12 04:03:32 CEST 2005 Daniel Veillard + + * python/libxml.c python/libxml.py: applied patch from Brent Hendricks + adding namespace removal at the python level #300209 + * python/tests/Makefile.am python/tests/nsdel.py: added the regression + test + +Sun Apr 10 09:03:22 HKT 2005 William Brack + + * xpath.c: fixed several places where memory cleanup was not + properly done after an error was detected (problem was + reported on the mailing list by Pawel Palucha) + +Fri Apr 8 21:58:04 CEST 2005 Kasimier Buchcik + + * xmlschemas.c: Added substitution group constraints; changed + the build of the pre-computed substitution groups. Channeled + errors during xsi assembling of schemas to the validation + context. Fixed a big memory leak, which occured when using + IDCs: the precomputed value of attributes was not freed if + the attribute did not resolve to an IDC field (discovered + with the help of Randy J. Ray's schema, posted to the + xmlschema-dev maling list). + +Fri Apr 8 13:22:01 CEST 2005 Kasimier Buchcik + + * xmlschemas.c: Added "Particle correct 2" to parsing of model groups. + Added handling substitution groups inside and ; + for this is not supported yet. Changed circular checks for + model groups definitions. "memberTypes" are processed at different + levels now: component resolution first, construction later; this + goes hand in hand with a global change to handle component + resolution in a distinct phase. Fixed invalid default values for + elements to mark the schema as invalid; this just resulted in an + error report previously, but the schema was handled as valid. + Separated the assignment of the model groups to referencing + model group definition references (i.e. particles); this was + needed to perform the circularity check for model group definitions. + Added "Element Declaration Properties Correct (e-props-correct)" + constraints. Separated component resolution for simple/complex + types. + * include/libxml/schemasInternals.h: Added a flag for substitution + group heads. + +Wed Apr 6 23:14:03 CEST 2005 Igor Zlatkovic + + * win32/Makefile.*: make install cleanup + +Wed Apr 6 22:42:23 CEST 2005 Igor Zlatkovic + + * win32/Makefile.mingw: fixed mingw compilation + * testModule.c: removed mingw warnings + +Wed Apr 6 21:59:11 CEST 2005 Igor Zlatkovic + + * .cvsignore: added Eclipse project files to ignore list + +Wed Apr 6 16:08:10 CEST 2005 Daniel Veillard + + * xpath.c: fixed the bug in lang() as raised by Elliotte Rusty Harold + * result/XPath/tests/langsimple test/XPath/tests/langsimple + test/XPath/docs/lang: added a regression test + +Tue Apr 5 23:48:35 CEST 2005 Daniel Veillard + + * nanoftp.c: applied fix from Rob Richards to compile on Windows. + +Tue Apr 5 17:02:58 CEST 2005 Kasimier Buchcik + + * xmlschemas.c: Added "Type Derivation OK (Complex)" constraints + and anchored them in the "Element Locally Valid (Element)" + constraints. This restricts the type substitution via "xsi:type". + +Tue Apr 5 13:10:06 CEST 2005 Daniel Veillard + + * xmlschemas.c: patch from Matthew Burgess to improve some schemas + facets validation messages. + +Sat Apr 2 12:48:41 CEST 2005 Daniel Veillard + + * doc/* configure.in NEWS: preparing release 2.6.19, updated docs and + rebuilding. + +Sat Apr 2 13:27:32 CEST 2005 Daniel Veillard + + * xstc/Makefile.am: integrated fixup-tests.py + +Fri Apr 1 19:14:18 CEST 2005 Daniel Veillard + + * xmlschemastypes.c: fixed a lack of comment and missing test for + a pointer in the API. + +Fri Apr 1 17:54:22 CEST 2005 Kasimier Buchcik + + * xstc/fixup-tests.py: A tiny script to fixup some of the schema + files used for the tests. + +Fri Apr 1 17:33:50 CEST 2005 Kasimier Buchcik + + * xmlschemas.c include/libxml/schemasInternals.h + result/schemas/src-element2-*.err result/schemas/element-*.err: + Committing again, since the CVS server aborted. + +Fri Apr 1 15:29:27 CEST 2005 Kasimier Buchcik + + * xmlschemastypes.c: Corrected 'length' facet validation for + QNames and notations. Corrected xmlSchemaGetCanonValue: some + data types did not return a value if already in normalized + form. + * xmlschemas.c include/libxml/schemasInternals.h: + Eliminated creation of structs for , , + , , and : the + information is now set directly on the corresponding simple/ + complex type. Added some more complex type constraints. + Added facet derivation constraints. Introduced "particle" + components, which seem to be really needed if applying + constraints. Corrected/change some of the parsing functions. + This is all a bit scary, since a significant change to the code. + * result/schemas/src-element2-*.err result/schemas/element-*.err: + Adapted regression test results. + +Fri Apr 1 16:07:59 CEST 2005 Daniel Veillard + + * doc/apibuild.py doc/elfgcchack.xsl: revamped the elfgcchack.h + format to cope with gcc4 change of aliasing allowed scopes, had + to add extra informations to doc/libxml2-api.xml to separate + the header from the c module source. + * *.c: updated all c library files to add a #define bottom_xxx + and reimport elfgcchack.h thereafter, and a bit of cleanups. + * doc//* testapi.c: regenerated when rebuilding the API + +Thu Mar 31 17:20:32 CEST 2005 Daniel Veillard + + * xmlsave.c: fixed bug reported by Petr Pajas, in the absence of + encoding UTF-8 should really be assumed. This may break if + the HTTP headers indicates for example ISO-8859-1 since this + then becomes a well formedness error. + +Thu Mar 31 16:57:18 CEST 2005 Daniel Veillard + + * SAX.c: fixed #172260 redundant assignment. + * parser.c include/libxml/parser.h: fixed xmlSAXParseDoc() and + xmlParseDoc() signatures #172257. + +Thu Mar 31 16:11:10 CEST 2005 Daniel Veillard + + * parser.c: fix potential crash if ctxt->sax->ignorableWhitespace + is NULL as reported by bug #172255 + +Thu Mar 31 15:36:52 CEST 2005 Daniel Veillard + + * relaxng.c: fixed a problem in Relax-NG validation #159968 + * test/relaxng/list.* result/relaxng/list_*: added the test + to the regression suite + +Thu Mar 31 13:06:02 CEST 2005 Daniel Veillard + + * python/libxml.c: fixed bug #168504 + +Thu Mar 31 12:22:54 CEST 2005 Daniel Veillard + + * config.h.in configure.in nanoftp.c nanohttp.c xmllint.c + macos/src/config-mac.h: use XML_SOCKLEN_T instead of SOCKLEN_T + since apparently IBM can't avoid breaking common defines #166922 + +Thu Mar 31 10:41:45 CEST 2005 Daniel Veillard + + * encoding.c: fix unitinialized variable in not frequently used + code bug #172182 + +Thu Mar 31 00:45:18 CEST 2005 Daniel Veillard + + * python/generator.py python/libxml.py: another patch from Brent + Hendricks to add new handlers with the various validity contexts + * python/tests/Makefile.am python/tests/validDTD.py + python/tests/validRNG.py python/tests/validSchemas.py: also + added the regression tests he provided + +Wed Mar 30 09:39:27 CEST 2005 Daniel Veillard + + * python/generator.py python/libxml.c: applied patch from Brent + Hendricks to avoid leak in python bindings when using schemas + error handlers. + +Tue Mar 29 22:29:28 CEST 2005 Daniel Veillard + + * HTMLtree.c: fixing bug 168196, must be URI escaped too + +Sun Mar 27 13:24:24 CEST 2005 Daniel Veillard + + * tree.c: cleanup of the Prop related functions and xmlNewNodeEatName + by Rob Richards + +Thu Mar 24 19:01:22 PST 2005 William Brack + + * gentest.py, testapi.c: fixed problem with 'minimal library' + compilation (LIBXML_PATTERN_ENABLED not properly checked) reported + by Greg Morgan + +Thu Mar 24 12:01:30 CET 2005 Kasimier Buchcik + + * xmlschemas.c: Fixed call to a facet error report: the type of + the error was wrong, resulting in a segfault (bug #171220, reported + by GUY Fabrice). + +Mon Mar 21 22:58:37 CET 2005 Kasimier Buchcik + + * xmlschemas.c: Removed a stupid bug in xmlSchemaValidateAttributes, + failing to build a linked list correctly (bug #169898, reported + by bing song, hmm...). + +Mon Mar 21 21:09:07 CET 2005 Kasimier Buchcik + + * xmlschemas.c: Fixed a segfault, which occured during bubbling + of IDC nodes (bug #170779 and #170778, reported by GUY Fabrice): + a variable was missed to be reset in a loop. Deactivated bubbling, + if not referenced by a keyref. + +Sun Mar 20 11:13:02 PST 2005 Aleksey Sanin + + * c14n.c include/libxml/xmlerror.h: special case "DAV:" namespace + in c14n relative namespaces check and add structured error messages + to c14n code + +Thu Mar 17 12:55:23 CET 2005 Kasimier Buchcik + + * xmlschemas.c: Removed inheritance of "mixed" content type for + short-hand restrictions of "anyType" (reported by Guy Fabrice + to the mailing list). Added the namespace conversion (chameleon + includes) for the base type reference of and + . + * test/schemas/bug152470_1.xsd: Adapted due to the above change + of "mixed" inheritance. + +Thu Mar 17 11:03:59 CET 2005 Daniel Veillard + + * xmlschemas.c: fixed a = -> == error pointed by GUY Fabrice + +Wed Mar 16 22:53:53 CET 2005 Daniel Veillard + + * xmlschemas.c: more debug messages from Matthew Burgess + * xmlschemastypes.c: xmlSchemaValidateLengthFacet API missing check. + +Wed Mar 16 17:37:04 CET 2005 Kasimier Buchcik + + * xmlschemastypes.c: Aaaannnd putting back the previous changes done + by Daniel, which I overwrote with the previous commit. + +Wed Mar 16 17:20:25 CET 2005 Kasimier Buchcik + + * xmlschemas.c xmlschemastypes.c include/libxml/xmlschemastypes.h: + Hopefully finished validation against facets to use the normalized + value of both, the facets and instance values. Added + xmlSchemaValidateLengthFacetWhtsp(), xmlSchemaValidateFacetWhtsp() + and xmlSchemaGetValType() to the schema API. + +Wed Mar 16 13:55:31 CET 2005 Daniel Veillard + + * libxml.spec.in: do not package .la files + * xmllint.c: applied patch from Gerry Murphy for xmllint return code + * xmlschemastypes.c: fixed a couple of missing tests of parameters + at public API entry points. + +Tue Mar 15 23:31:14 HKT 2005 William Brack + + * xmlschemastypes.c: a couple of more changes to various + decimal-handling routines. Fixes python some problems + turned up by the python tests. + * Makefile.am: change SchemasPythonTests message to warn + that there are 10 'expected' errors (rather than 6) since + we now reject a '+' sign on an unsigned. + +Tue Mar 15 15:43:27 CET 2005 Kasimier Buchcik + + * xmlschemastypes.c xmlschemastypes.h: In preparation to use + normalized values of facets during validation: changed the + arguments of some string comparison functions; added a static + xmlSchemaValidateFacetInternal() with more arguments to be + more flexible. Prepared XML_SCHEMA_FACET_ENUMERATION validation + to use the comparison functions. Fixed some assignments in + xmlSchemaValAtomicType(): total digit count, lo, mi, hi. + +Sun Mar 13 19:32:03 CET 2005 Daniel Veillard + + * NEWS configure.in testapi.c doc/*: preparing release of 2.6.18 + updated docs and rebuilt + * libxml.spec.in: reactivated gcc profiling for gcc >= 4.0.0 + +Sat Mar 12 19:50:22 CET 2005 Daniel Veillard + + * encoding.c: removed a static buffer in xmlByteConsumed(), + as pointed by Ben Maurer, fixes #170086 + * xmlschemas.c: remove a potentially uninitialized pointer warning + +Fri Mar 11 23:53:13 HKT 2005 William Brack + + * xmlschemastypes.c: enhanced the parsing of XML_SCHEMAS_DECIMAL + and much of the routine xmlSchemaCompareDecimals. The + changes were necessary to fix a problem reported on the + mailing list by John Hockaday. + +Fri Mar 11 13:22:52 CET 2005 Kasimier Buchcik + + * xmlschemas.c: The schema parser will stop if components could + not be resolved. This is not conforming to the spec but for now + will avoid internal errors during type fixup and content model + creation. Restructured inclusion/import of schemata: this avoids + duplicate, self and circular inclusion. Chameleon includes are + still workarounded. Added restriction to disallow references to + non-imported namespaces. Corrected parsing of . + * result/schemas/bug167754_0_0*: Added a missing test result. + +Thu Mar 10 16:02:17 CET 2005 Daniel Veillard + + * doc/xml.html doc/encoding.html: Enriched encoding.html with more + link and foreword warning to avoid problem with ignorant + programmers, c.f #169721 + +Thu Mar 10 15:01:34 CET 2005 Daniel Veillard + + * python/tests/Makefile.am python/tests/readernext.py: added + a regression test from Rob Richards for the previous bug + +Thu Mar 10 13:22:36 CET 2005 Daniel Veillard + + * xmlreader.c: applied fix for xmlTextReaderNext() bug from + Rob Richards + +Thu Mar 10 11:35:57 CET 2005 Daniel Veillard + + * xmlmodule.c: second patch from Rick Jones, portability fix for + HP-UX + * doc/examples/xpath1.c doc/examples/xpath2.c: first fix from Rick Jones + to avoid warnings. + +Thu Mar 10 10:20:23 CET 2005 Daniel Veillard + + * include/libxml/hash.h libxml.h libxml.spec.in: some gcc4 portability + patches, including a serious aliasing bug exposed in s390 + when trying to convert data pointer to code pointer. + +Mon Mar 7 18:34:00 CET 2005 Kasimier Buchcik + + * xmlschemas.c: Tiny restructuring of the validation start-up + functions. Added cleanup of the validation context at the + end of validation. This takes care of the validation context + being reused. + +Mon Mar 7 12:12:01 CET 2005 Kasimier Buchcik + + * xmlschemastypes.c: Tiny changes in the comparison functions + I forgot to commit last time. + +Fri Mar 4 22:51:42 CET 2005 Kasimier Buchcik + + * xmlschemas.c: Added IDC validation of anySimpleType attribute + values; anyway the IDC key comparison is restricted to + anySimpleType <--> string based types. For other types we + would possibly need the canonical lexical representation of + them; this sounds not performant, since we would need to + build such a representation each time we want to compare against + anySimpleType. TODO: think about buffering the canonical values + somewhere. Fixed error reports for default attributes to work + without a node being specified. This all and the enabling of IDC + validation fixes bug #165346 (reported by Benoit Gr?goire - could + not read his last name correctly from bugzilla). + +Fri Mar 4 18:57:44 CET 2005 Kasimier Buchcik + + * xmlschemas.c: Enabled IDC parsing and validation. + * xmlschemastypes.c include/libxml/xmlschemastypes.h: + Added xmlSchemaCopyValue to the API; this was done due to + validation of default attributes against IDCs: since IDC keys + consume the precomputed value, one needs a copy. + * pattern.c: Enabled IDC support; this is currently done + via calling xmlPatterncompile with a flag arg of 1. + +Wed Mar 2 11:45:18 CET 2005 Daniel Veillard + + * Makefile.am doc/examples/Makefile.am python/tests/Makefile.am + xstc/Makefile.am: try to fix a problem with valgrind. + * python/generator.py python/libxml.c python/tests/Makefile.am + python/tests/tstmem.py: applied memory leak fix from Brent Hendricks + c.f. bug #165349 + +Mon Feb 28 11:18:24 CET 2005 Kasimier Buchcik + + * tree.c: Changed xmlSearchNsByHref to call xmlNsInScope with + the prefix instead of the namespace name. + * test/schemas/annot-err_0.xsd test/schemas/element-err_0.xsd: + Adapted invalid values of the "id" attribute, since they are + validated now. + +Fri Feb 25 08:31:16 CET 2005 Daniel Veillard + + * threads.c: new version with fixes from Rob Richards + +Thu Feb 24 16:37:51 CET 2005 Daniel Veillard + + * threads.c: applied patch from Rich Salz for multithreading on + Windows. + +Wed Feb 23 15:04:46 CET 2005 Daniel Veillard + + * xmlwriter.c: applied a patch from Rob Richards fixing a couple + of bugs in the writer + +Mon Feb 21 21:51:03 HKT 2005 William Brack + + * xmlsave.c: fixed problem when XMLLINT_INDENT was empty (bug 168033). + * xpath.c: fixed compilation warning, no change to logic. + * xmlschemastypes.c: fixed compilation warning, no change to logic. + +Mon Feb 21 14:48:27 CET 2005 Daniel Veillard + + * xmlwriter.c: applied patch from Rob Richards to fix a problem with + xmlTextWriterStartAttributeNS + +Mon Feb 21 11:41:41 CET 2005 Daniel Veillard + + * pattern.c xpath.c: fixed remaining known bugs in the XPath streaming, + and switched XPath to use it by default when possible + +Sat Feb 19 19:25:14 CET 2005 Daniel Veillard + + * xmlschemastypes.c: a bit of cleanup + * elfgcchack.h testapi.c doc/*: rebuilt the API the tests and + the documentation as a result. + +Fri Feb 18 20:34:03 CET 2005 Daniel Veillard + + * xmlreader.c include/libxml/xmlreader.h: applied patch from + Aron Stansvik to add xmlTextReaderByteConsumed() + * testReader.c: added a test option + * xmlschemastypes.c: fix a lack of pointer checking in APIs + +Fri Feb 18 12:41:10 CET 2005 Kasimier Buchcik + + * test/schemas/bug167754_0*: Added the regression test of Frans + Englich for bug #167754. + +Fri Feb 18 12:31:49 CET 2005 Kasimier Buchcik + + * xmlschemas.c: Started support for IDC resolution to default + attributes. If building the content model for : ensured + to put element declarations and not the particles into the + content model automaton (this was bug #167754, reported by + Frans Englich). + +Thu Feb 17 22:31:58 CET 2005 Kasimier Buchcik + + * pattern.c pattern.h: Some experimental addition for parsing + of expressions and streamable validation. + Added xmlStreamPushAttr to the API. + +Thu Feb 17 19:57:35 CET 2005 Kasimier Buchcik + + * xmlschemas.c: Added validation for the attribute "id" in the + schemata; doing this needed error report fixes for notations, + facets and group. Changed NOTATION validation to work with the + declared NOTATIONs in the schema; this does have no impact on + the validation via the relaxng module. + * xmlschemastypes.c include/libxml/xmlschemastypes.h: + Added xmlSchemaNewNOTATIONValue to the API to be able to do + the NOTATION validation described above. + * test/schemas/element-err_0.xsd test/schemas/annot-err_0.xsd: + Fixed the values of the "id" attributes, which were not validated + previously. + +Thu Feb 17 12:03:46 CET 2005 Kasimier Buchcik + + * xmlschemas.c: Fixed comparison for default/fixed attribute + values, if the type was 'xsd:string'. Changed the comparison + for IDCs to use the whitespace aware comparison function. + * xmlschemastypes.c include/libxml/xmlschemastypes.h: + Added xmlSchemaGetCanonValue, xmlSchemaNewStringValue and + xmlSchemaCompareValuesWhtsp to the API. Added functions + to compare strings with whitespace combinations of "preserve", + "replace" and "collapse". + +Wed Feb 16 13:24:35 CET 2005 Kasimier Buchcik + + * xmlschemas.c: Further work on IDCs, especially evaluation for + attribute nodes. + +Wed Feb 16 01:19:27 CET 2005 Daniel Veillard + + * encoding.c: fix the comment to describe the real return values + * pattern.c xpath.c include/libxml/pattern.h: lot of work on + the patterns, pluggin in the XPath default evaluation, but + disabled right now because it's not yet good enough for XSLT. + pattern.h streaming API are likely to be changed to handle + relative and absolute paths in the same expression. + +Tue Feb 15 15:33:32 CET 2005 Kasimier Buchcik + + * xmlschemas.c: Added IDC evaluation for attribute nodes. + Made 'nil'ed elements work. Added a specific error message + for 'strict' attribute wildcards. + * include/libxml/xmlerror.h: Added an error code for + wildcards. + * result/schemas/anyAttr-processContents-err1_0_0.err: Adapted. + +Sun Feb 13 16:15:03 HKT 2005 William Brack + + This change started out as a simple desire to speed up the + execution time of testapi.c, which was being delayed by + nameserver requests for non-existent URL's. From there it + just sort of grew, and grew.... + * nanohttp.c, nanoftp.c: changed the processing of URL's + to use the uri.c routines instead of custom code. + * include/libxml/xmlerror.h: added code XML_FTP_URL_SYNTAX + * uri.c: added accepting ipV6 addresses, in accordance with + RFC's 2732 and 2373 (TODO: allow ipV4 within ipV6) + * gentest.py, testapi.c: fixed a few problems with the + testing of the nanoftp and nanohttp routines. + * include/libxml/xmlversion.h: minor change to fix a + warning on the docs generation + * regenerated the docs + +Sat Feb 12 09:07:11 HKT 2005 William Brack + + * xinclude.c: fixed xmlXIncludeParseFile to prevent + overwriting XML_COMPLETE_ATTRS when setting pctxt->loadsubset + (bug 166199) + * Makefile.am, python/tests/Makefile.am, xstc/Makefile.am: added + code to add $(top_builddir)/.libs to LD_LIBRARY_PATH whenever + PYTHONPATH is set, to assure new libxml2 routines are used. + +Fri Feb 11 22:20:41 HKT 2005 William Brack + + * parser.c: fixed problem when no initial "chunk" was + given to xmlCreatePushParser (bug 162613) + +Fri Feb 11 18:37:22 HKT 2005 William Brack + + * dict.c: fixed compilation warning + * parser.c: changed xmlWarningMsg so ctxt->errNo is not set + * xmllint.c: changed to return non-zero status if error + on xinclude processing + * xmlsave.c: minor deletion of a redundant condition statement + +Wed Feb 9 17:47:40 CET 2005 Daniel Veillard + + * tree.c: applied patch to xmlSetNsProp from Mike Hommey + +Sun Feb 6 00:17:57 CET 2005 Daniel Veillard + + * pattern.c xmllint.c: fixed implementation for | + * test/pattern/conj.* result/pattern/conj: added a specific regression + test + +Sat Feb 5 18:36:56 CET 2005 Daniel Veillard + + * pattern.c: first implementation for | support + +Sat Feb 5 14:58:46 CET 2005 Daniel Veillard + + * pattern.c: fixed the namespaces support + * tree.c: fixed xmlGetNodePath when namespaces are used + * result/pattern/multiple result/pattern/namespaces + test/pattern/multiple.* test/pattern/namespaces.*: added + more regression tests + +Fri Feb 4 18:26:43 CET 2005 Daniel Veillard + + * xmlschemas.c: fixed one internal function + * doc/Makefile.am doc/wiki.xsl: applied patch from Joel Reed + * testapi.c doc/libxml2-api.xml doc/libxml2-refs.xml: regenerated + +Fri Feb 4 00:25:43 CET 2005 Daniel Veillard + + * Makefile.am: use the walker to test the patterns instead of + the normal reader + * pattern.c xmllint.c: bug fixes in the train including fixing the + stupid build break. + +Tue Feb 1 18:15:52 CET 2005 Daniel Veillard + + * pattern.c: more bug fixes for the XPath streaming code. + +Mon Jan 31 17:59:24 CET 2005 Kasimier Buchcik + + * xmlschemas.c: Integrated the streaming pattern from the + pattern module. Fixed some IDC code bugs. Changed + fallback for attribute declaration addition to work like for + element declarations. + +Mon Jan 31 01:27:22 CET 2005 Daniel Veillard + + * pattern.c xmllint.c: bugfixes around the streaming patterns + +Sun Jan 30 23:35:19 CET 2005 Daniel Veillard + + * Makefile.am configure.in result/pattern/simple + test/pattern/simple.*: added first test for the patterns + * pattern.c xmllint.c: a few fixes + +Sun Jan 30 19:27:23 CET 2005 Daniel Veillard + + * pattern.c include/libxml/pattern.h xmllint.c: added a + streaming pattern detector for a subset of XPath, should + help Kasimier for identity constraints + * python/generator.py: applied Stephane Bidoul patch to find + paths without breaking. + +Fri Jan 28 18:53:40 CET 2005 Daniel Veillard + + * xmlschemas.c: fixed an untested pointer dereference and a & vs && + +Fri Jan 28 18:37:18 CET 2005 Daniel Veillard + + * xmlreader.c: implementation of xmlTextReaderReadString by + Bjorn Reese + +Fri Jan 28 16:51:47 CET 2005 Kasimier Buchcik + + * xmlschemas.c: Corrected an ambigious symbol-space for + local attribute declarations. IFDEFed more IDC code to + surpress compiler warnings. + +Fri Jan 28 00:57:04 CET 2005 Daniel Veillard + + * bakefile/Readme.txt bakefile/Bakefiles.bkgen bakefile/libxml2.bkl: + files for the Bakefile generator for Makefiles from Francesco + Montorsi + * win32/configure.js: fixes for Windows compilation with non-default + flags by Joel Reed + +Thu Jan 27 18:23:50 CET 2005 Daniel Veillard + + * tree.c: fixed xmlCopyDoc to also copy the doc->URL as pointed + by Martijn Faassen + +Thu Jan 27 13:39:04 CET 2005 Kasimier Buchcik + + * xmlschemas.c include/libxml/schemasInternals.h: + Added an initial skeleton for indentity-constraints. This is all + defined out, since not complete, plus it needs support from other + modules. + Added machanism to store element information for the + ancestor-or-self axis; this is needed for identity-constraints + and should be helpfull for a future streamable validation. + * include/libxml/xmlerror.h: Added an error code for + identity-constraints. + +Wed Jan 26 01:03:37 CET 2005 Daniel Veillard + + * gentest.py testapi.c: had to fix generation and rebuild. + * valid.c: the testapi found a bug in the last code of course ! + +Wed Jan 26 00:43:05 CET 2005 Daniel Veillard + + * Makefile.am testapi.c doc/Makefile.am: fixing the way testapi.c + is generated, fixes bug #161386 + * dict.c: fix a comment typo + * elfgcchack.h doc/*: regenerated + +Tue Jan 25 22:39:33 CET 2005 Daniel Veillard + + * parser.c: found and fixed 2 problems in the internal subset scanning + code affecting the push parser (and the reader), fixes #165126 + * test/intsubset2.xml result//intsubset2.xml*: added the test case + to the regression tests. + +Tue Jan 25 01:20:11 CET 2005 Daniel Veillard + + * testdso.c xmlregexp.c: warning patches from Peter Breitenlohner + * include/libxml/valid.h valid.c parser.c: serious DTD parsing + speedups, start to deprecate 3 ElementDef related entry point + and replace them with better ones. + +Mon Jan 24 00:47:41 CET 2005 Daniel Veillard + + * xmlschemas.c: more hash dictionary interning changes + +Sun Jan 23 23:54:39 CET 2005 Daniel Veillard + + * hash.c include/libxml/hash.h: added xmlHashCreateDict where + the hash reuses the dictionnary for internal strings + * entities.c valid.c parser.c: reuse that new API, leads to a decent + speedup when parsing for example DocBook documents. + +Sun Jan 23 21:14:20 CET 2005 Daniel Veillard + + * parser.c: small speedup in skipping blanks characters + * entities.c: interning the entities strings + +Sun Jan 23 18:35:00 CET 2005 Daniel Veillard + + * parser.c: boosting common commnent parsing code, it was really + slow. + * test/comment[3-5].xml result//comment[3-5].xml*: added sprecific + regression tests + +Sun Jan 23 01:00:09 CET 2005 Daniel Veillard + + * parser.c: small optimization back. + +Sat Jan 22 00:40:31 CET 2005 Daniel Veillard + + * dict.c parser.c include/libxml/dict.h: a single lock version + mostly avoid the cost penalty of the lock in case of low + parallelism, so applying that version instead. + +Fri Jan 21 17:54:06 CET 2005 Daniel Veillard + + * dict.c: patch from Gary Coady to fix a race in dict reference + counting in multithreaded apps. + +Fri Jan 21 16:08:21 CET 2005 Daniel Veillard + + * parser.c: fixed bug #164556 where non-fatal errors stopped + push parsing and xmlreader. + * Makefile.am: fixup + * test/errors/webdav.xml result/errors/webdav*: adding regression + test for this problem. + +Wed Jan 19 17:24:34 CET 2005 Kasimier Buchcik + + * xmlschemas.c: Corrected targetNamespace in + xmlSchemaElementDump. Cosmetic changes to the dump output. + +Sun Jan 16 21:00:53 CET 2005 Daniel Veillard + + * configure.in NEWS doc/*: preparing release of 2.6.17, + updated and rebuilt the docs + +Sun Jan 16 19:58:36 CET 2005 Daniel Veillard + + * parser.c: better fix for #151694 not killing c14n regression tests + * xmlschemastypes.c: fixing bug #157653 + +Sun Jan 16 19:01:06 CET 2005 Daniel Veillard + + * parser.c: fixing bug #151694, line should always be set in the + elements. + +Sun Jan 16 01:04:18 CET 2005 Daniel Veillard + + * xmlschemastypes.c: trying to fix at least the message from + bug #158628 + * include/libxml/xmlsave.h xmlsave.c: added first xmlsave option + for format, c.f. bug #159997 + +Sat Jan 15 18:44:30 CET 2005 Daniel Veillard + + * python/libxml.py: make __str__ call serialize() on nodes, c.f. + bug #157872 + +Sat Jan 15 18:18:07 CET 2005 Daniel Veillard + + * nanoftp.c: applied patch from Dan McNichol for compilation on AIX + +Sat Jan 15 13:35:19 CET 2005 Daniel Veillard + + * relaxng.c: fixed bug #157633 in relaxng choice optimization + * result/relaxng/choice0* test/relaxng/choice0*: added regression + tests about it. + * doc/*: rebuilt + * testdso.c: removed a warning due to a missing void in signature. + +Thu Jan 13 17:42:55 CET 2005 Kasimier Buchcik + + * include/libxml/schemasInternals.h xmlschemas.c: + Exposed targetNamespace for simple/complex types, model groups, + attribute groups and notations (reported by Michael Hewarth + to the mailing list). Added targetNamespace to xmlSchemaType, + xmlSchemaAttributeGroup and xmlSchemaNotation. + Tiny cosmetic change to the content model error report output. + * result//all_*.err result//any3_0_0.err result//choice_*.err + result//list0_0_1.err result//list0_1_1.err: Adapted output + of regression tests. + +Thu Jan 13 13:20:51 CET 2005 Kasimier Buchcik + + * xmlschemas.c: Put the fix of Daniel (from Tue Jan 11 14:41:47 CET) + back in, since I missed to update xmlschemas.c before doing + the previous commit. + +Thu Jan 13 12:59:25 CET 2005 Kasimier Buchcik + + * xmlschemas.c: Integrated xmlRegExecErrInfo and xmlRegExecNextValues + from xmlregexp.c to report expected elements on content model errors. + * all_*.err any3_0_0.err choice_*.err list0_0_1.err list0_1_1.err: + Adapted output of regression tests. + +Thu Jan 13 12:24:09 CET 2005 Daniel Veillard + + * config.h.in configure.in xmlmodule.c: trying to work around + the compilation problem on HP-UX + +Wed Jan 12 22:03:33 CET 2005 Daniel Veillard + + * pattern.c: fixed the fixed size array structure problem reported by + Patrick Streule + +Wed Jan 12 15:15:02 CET 2005 Daniel Veillard + + * elfgcchack.h testapi.c doc/libxml2-api.xml doc/*: regenerated + the API description, rebuilt, improved navigation in documentation + a bit. + +Wed Jan 12 14:17:14 CET 2005 Daniel Veillard + + * include/libxml/xmlregexp.h xmlregexp.c: extended xmlRegExecErrInfo() + and xmlRegExecNextValues() to return error transition strings too, + and sink state detection and handling. + +Tue Jan 11 14:41:47 CET 2005 Daniel Veillard + + * xmlschemas.c: fixed bug #163641 when the value passed for + an atomic list type is NULL. + +Tue Jan 11 10:14:33 HKT 2005 William Brack + + * Makefile.am configure.in: fixed dependency on python 2.3, + also small improvement for cygwin (bug 163273) + +Sun Jan 9 18:46:32 CET 2005 Daniel Veillard + + * gentest.py testapi.c: William noticed I forgot to add special + support for xmlmodules.c define + * xmlregexp.c include/libxml/xmlregexp.h: added terminal to + xmlRegExecErrInfo() API, adding new xmlRegExecNextValues() + entry point and refactored to use both code. + +Mon Jan 10 01:02:41 HKT 2006 William Brack + + * doc/xml.html, doc/FAQ.html: added an FAQ under Developer for + setting up a "private" library (after some list posts about + people having trouble doing it) + +Sat Jan 8 23:04:10 CET 2005 Daniel Veillard + + * xmlregexp.c: fixing behaviour for xmlRegExecErrInfo in case of + rollback + +Fri Jan 7 14:54:51 CET 2005 Daniel Veillard + + * TODO: small update + * xmlregexp.c: trying to add an API to get useful error informations + back from a failing regexp context. + +Thu Jan 6 17:35:41 HKT 2005 William Brack + + * xpath.c: fixed problem with xmlXPathErr when error number + subscript was out of range (bug 163055) + +Thu Jan 6 09:57:03 HKT 2005 William Brack + + * uri.c: fixed problem with xmlURIEscape when query part was + empty (actually fixed xmlURIEscapeStr to return an empty + string rather than NULL for empty string input) (bug 163079) + +Tue Jan 4 17:08:45 PST 2005 Aleksey Sanin + + * parser.c, parserInternal.c: fixed "col" calculation for + struct _xmlParserInput (based on patch from Rob Richards) + * include/libxml/xmlerror.h, error.c: propagated error column + number in the xmlError structure + +Tue Jan 4 22:47:22 CET 2005 Daniel Veillard + + * parser.c: fixed namespace bug in push mode reported by + Rob Richards + * test/ns6 result//ns6*: added it to the regression tests + * xmlmodule.c testModule.c include/libxml/xmlmodule.h: + added an extra option argument to module opening and defined + a couple of flags to the API. + +Tue Jan 4 21:16:05 CET 2005 Daniel Veillard + + * xmlmodule.c include/libxml/xmlmodule.h: applied patch from + Bjorn Reese, plus some cleanups + * elfgcchack.h doc/elfgcchack.xsl: fixed the stylesheet to + add the new header + * doc/* testapi.c: regenerated the API + +Tue Jan 4 18:47:19 CET 2005 Daniel Veillard + + * configure.in: making DSO support an option + * xmlmodule.c xmlreader.c include/libxml/xmlmodule.h: code + and documentation cleanups + * elfgcchack.h testapi.c doc/*: regenerated the docs and + checks for new module + * test/valid/REC-xml-19980210.xml: fix a small change introduced + previously + +Tue Jan 4 16:07:52 CET 2005 Daniel Veillard + + * Makefile.am config.h.in configure.in error.c libxml-2.0.pc.in + testModule.c testdso.c xml2-config.in xmllint.c xmlmodule.c + include/libxml/Makefile.am include/libxml/xmlerror.h + include/libxml/xmlmodule.h include/libxml/xmlversion.h.in + include/libxml/xmlwin32version.h.in: applied DSO support + patch 2 from Joel Reed + +Tue Jan 4 15:30:15 CET 2005 Daniel Veillard + + * configure.in: applied patch from Marcin Konicki for BeOS + +Mon Jan 3 13:57:21 PST 2005 Aleksey Sanin + + * parser.c: added GetLineNumber and GetColumnNumber functions for xmlReader + +Sun Jan 2 17:51:18 HKT 2005 William Brack + + Re-examined the problems of configuring a "minimal" library. + Synchronized the header files with the library code in order + to assure that all the various conditionals (LIBXML_xxxx_ENABLED) + were the same in both. Modified the API database content to more + accurately reflect the conditionals. Enhanced the generation + of that database. Although there was no substantial change to + any of the library code's logic, a large number of files were + modified to achieve the above, and the configuration script + was enhanced to do some automatic enabling of features (e.g. + --with-xinclude forces --with-xpath). Additionally, all the format + errors discovered by apibuild.py were corrected. + * configure.in: enhanced cross-checking of options + * doc/apibuild.py, doc/elfgcchack.xsl, doc/libxml2-refs.xml, + doc/libxml2-api.xml, gentest.py: changed the usage of the + element in module descriptions + * elfgcchack.h, testapi.c: regenerated with proper conditionals + * HTMLparser.c, SAX.c, globals.c, tree.c, xmlschemas.c, xpath.c, + testSAX.c: cleaned up conditionals + * include/libxml/[SAX.h, SAX2.h, debugXML.h, encoding.h, entities.h, + hash.h, parser.h, parserInternals.h, schemasInternals.h, tree.h, + valid.h, xlink.h, xmlIO.h, xmlautomata.h, xmlreader.h, xpath.h]: + synchronized the conditionals with the corresponding module code + * doc/examples/tree2.c, doc/examples/xpath1.c, doc/examples/xpath2.c: + added additional conditions required for compilation + * doc/*.html, doc/html/*.html: rebuilt the docs + +Sat Dec 25 18:10:02 HKT 2004 William Brack + + * parserInternals.c: fixed to skip (if necessary) the BOM for + encoding 'utf-16'. Completes the fix for bug #152286. + * tree.c, parser.c: minor warning cleanup, no change to logic + +Fri Dec 24 16:31:22 HKT 2004 William Brack + + * python/generator.py: added most required entires to + foreign encoding table, plus some additional logic to + assure only the 1st param uses the 't#' format. Fixes + bug #152286, but may still have some other UTF-16 problems. + +Thu Dec 23 23:44:08 HKT 2004 William Brack + + * Makefile.am, gentest.py: enhanced for enabling build in + a different directory. Added (optional) param to gentest.py + to specify the source directory (bug #155468) + * doc/Makefile.am: changed destination of NEWS from (top_srcdir) + to (top_builddir) (bug #155468) + * python/Makefile.am, python/generator.py: enhanced for enabling + build in a different directory(bug #155468). Added (optional) + param to generator.py to specify the source directory. Added + a new table of functions which have possible "foreign" encodings + (e.g. UTF16), and code to use python 't' format instead of + 'z' format (mostly solving bug #152286, but still need to + populate the table). + +Tue Dec 21 08:10:44 MST 2004 John Fleck + + * doc/site.xsl, doc/xml.html, plus rebuilt all the html pages + Change reference to new site for Solaris binaries, fixing bug + 160598 + + +Mon Dec 20 08:02:57 PST 2004 William Brack + + * parser.c: reset input->base within xmlStopParser + * xmlstring.c: removed call to xmlUTF8Strlen from within + xmlUTF8Strpos (Bill Moseley pointed out it was not + useful) + +Fri Dec 17 16:03:41 PST 2004 William Brack + + * valid.c: changed xmlErrValidWarning to use ctxt->warning + instead of ctxt->error for its reports (bug #160662) + +Fri Dec 17 14:52:17 PST 2004 William Brack + + * python/generator.py: modified to allow the ns and nsDefs + accessors to return None instead of error when no namespace + is present (bug #) + +Fri Dec 17 11:40:21 PST 2004 William Brack + + * doc/Makefile.am: changed maintainer-clean dependency with + suggestion from Crispin Flowerday (bug #157634) + * debugXML.c: fixed crash when ATTRIBUTE or DOCUMENT nodes + were specified with debugDumpNode (bug #160621) + +Fri Dec 10 11:24:41 CET 2004 Daniel Veillard + + * valid.c: fixed ID deallocation problem based on patch from + Steve Shepard fixes bug #160893 + * xmlmemory.c: improving comment. + * testapi.c: new test for xmlDictExists() is generated. + +Wed Dec 1 22:35:37 HKT 2004 William Brack + + * dict.c, xpath.c, include/libxml/hash.h: fixed up some gcc warnings, + no change to logic. New macro XML_CAST_FPTR to circumvent gcc + warnings on function pointer <-> object pointer (a hack). + +Mon Nov 29 14:07:18 CET 2004 Daniel Veillard + + * xpath.c: fixed a memory leak on errors in some circumstances #159812 + +Fri Nov 26 23:20:48 HKT 2004 William Brack + + * xmlIO.c: added a check within xmlOutputBufferWriteEscape to prevent + a dead loop on bad data (bug 159550) + +Fri Nov 26 13:09:04 CET 2004 Kasimier Buchcik + + * xmlschemas.c: Fixed strict/lax element wildcards: the children + of elements for which a declaration existed were still processed + by the wildcard mechanism (reported by philippe ventrillon to the + mailing list). + Changed the import and include machanism to share dictionaries. + +Fri Nov 26 11:44:36 CET 2004 Daniel Veillard + + * HTMLparser.c parser.c: make sure xmlCtxtReadFile and htmlCtxtReadFile + go through the catalog resolution. + * gentest.py testapi.c: fix a side effect wrning of the change + +Wed Nov 24 13:41:52 CET 2004 Daniel Veillard + + * dict.c include/libxml/dict.h: added xmlDictExists() to the + dictionnary interface. + * xmlreader.c: applying xmlTextReaderHasAttributes fix for namespaces + from Rob Richards + +Wed Nov 17 13:54:37 CET 2004 Kasimier Buchcik + + * xmlschemas.c: tiny enhancement for content model error reports + (#157190, #143948). Removed abbreviations: CT, ST and WC + (#157190, reported by Frans Englich). + Initial: no report of local components. + * result/schemas/all* result/schemas/any3_0_0.err + result/schemas/choice* + result/schemas/cos-st-restricts-1-2-err_0_0.err + result/schemas/derivation-ok-extension-err_0_0.err + result/schemas/derivation-ok-extension_0_0.err + result/schemas/derivation-ok-restriction-2-1-1_0_0.err + result/schemas/derivation-ok-restriction-4-1-err_0_0.err + result/schemas/deter0_0_0.err result/schemas/extension1_0_2.err + result/schemas/facet-unionST-err1_0_0.err + result/schemas/hexbinary_0_1.err + result/schemas/list* result/schemas/restriction-attr1_0_0.err + result/schemas/vdv-first4_0_1.err result/schemas/vdv-first4_0_2.err: + Adapted output. + +Mon Nov 15 13:04:28 CET 2004 Kasimier Buchcik + + * xmlschemas.c: Moved execution of xmlSchemaCheckDefaults to + xmlSchemaTypeFixup; this ensures facets of inherited types to be + checked prior to facets of derived types - which caused a seg + fault otherwise (bug #158216, reported by Frans Englich). + +Sun Nov 14 22:23:18 HKT 2004 William Brack + + * gentest.py, testapi.c: further enhancement, now all + compilation warnings have been fixed. + * xmlschemastypes.c: added NULL check for one function + +Fri Nov 12 23:58:14 HKT 2004 William Brack + + * xpath.c: trivial change (changed CHECK_CONTEXT to CHECK_CTXT + on a couple of lines) + * gentest.py, testapi.c: enhanced to reduce compilation warnings + +Fri Nov 12 16:12:48 CET 2004 Kasimier Buchcik + + * xmlschemas.c: Un-commented a TODO in xmlSchemaParseElement. + +Fri Nov 12 14:55:36 CET 2004 Kasimier Buchcik + + * xmlschemas.c: Correct symbol space for 'all' and 'choice'. + * xmlschemastypes.c include/xmlschemastypes.h: Added 'replace' + normalization for 'normalizedString'. + Added xmlSchemaWhiteSpaceReplace to the API. + +Thu Nov 11 21:43:02 CET 2004 Daniel Veillard + + * Makefile.am: forgot a $(srcdir) + * encoding.c: stupid error wrong name #157976 + +Wed Nov 10 15:35:25 CET 2004 Daniel Veillard + + * NEWS configure.in doc/*: preparing release of libxml2-2.6.16 + +Wed Nov 10 12:55:18 CET 2004 Daniel Veillard + + * python/generator.py python/libxml.c python/libxml2class.txt + python/libxml_wrap.h python/types.c: Applied patch from Brent + Hendricks adding support for late DTD validation. + * python/tests/Makefile.am python/tests/dtdvalid.py + python/tests/test.dtd: integrated the provided regression test + +Tue nov 9 19:24:31 CET 2004 Dodji Seketeli + + * configure.in: detect when struct sockaddr_storage + has the __ss_family member instead of ss_family and + behave accordingly. We now can use ipv6 on aix. + +Tue Nov 9 17:15:46 CET 2004 Daniel Veillard + + * Makefile.am gentest.py testapi.c: integrated in "make tests" + added -q option, and more conditional features fixes + * catalog.c debugXML.c parser.c testThreads.c xmllint.c + xmlschemastypes.c xmlwriter.cinclude/libxml/catalog.h + include/libxml/debugXML.h: various compilation and conditional + cleanups. + * doc/*: regenerated + +Tue Nov 9 15:59:50 CET 2004 Daniel Veillard + + * gentest.py testapi.c: better handling of conditional features + * HTMLparser.c SAX2.c parserInternals.c xmlwriter.c: more testing + on parser contexts closed leaks, error messages + +Tue Nov 9 10:21:37 GMT 2004 William Brack + + * xpath.c: fixed problem concerning XPath context corruption + during function argument evaluation (bug 157652) + +Mon Nov 8 18:54:52 CET 2004 Daniel Veillard + + * testapi.c: more types. + * parserInternals.c xpath.c: more fixes + +Mon Nov 8 18:16:43 CET 2004 Daniel Veillard + + * gentest.py testapi.c: better parser options coverage + * SAX2.c xpath.c: more cleanups. + +Tue Nov 9 01:50:08 CET 2004 Daniel Veillard + + * testapi.c: trying to fix some optional support brokenness + +Mon Nov 8 17:25:27 CET 2004 Daniel Veillard + + * gentest.py testapi.c: more coverage + * debugXML.c parser.c xmlregexp.c xpath.c: more fixes + +Mon Nov 8 15:02:39 CET 2004 Daniel Veillard + + * gentest.py testapi.c: more coverage + * SAX2.c parser.c parserInternals.c: more fixes + +Mon Nov 8 12:55:16 CET 2004 Daniel Veillard + + * parser.c testapi.c xmlIO.c xmlstring.c: more fixes. + +Mon Nov 8 11:24:57 CET 2004 Daniel Veillard + + * gentest.py testapi.c: more types, more coverage + * parser.c parserInternals.c relaxng.c valid.c xmlIO.c + xmlschemastypes.c: more problems fixed + +Mon Nov 8 10:24:28 HKT 2004 William Brack + + * gentest.py: fixed test file corruption problem + +Sun Nov 7 13:18:05 CET 2004 Daniel Veillard + + * gentest.py testapi.c: fixed typos and avoid Catalogs verbosity + +Sat Nov 6 23:25:16 CET 2004 Daniel Veillard + + * testapi.c: augmented the number of types + +Sat Nov 6 20:24:07 CET 2004 Daniel Veillard + + * HTMLtree.c tree.c xmlreader.c xmlwriter.c: a number of new + bug fixes and documentation updates. + +Sat Nov 6 15:50:11 CET 2004 Daniel Veillard + + * gentest.py testapi.c: augmented type autogeneration for enums + * xpath.c include/libxml/xpath.h: removed direct error reporting. + +Sat Nov 6 14:27:18 CET 2004 Daniel Veillard + + * encoding.c: fixed a regression in iconv support. + +Fri Nov 5 18:19:23 CET 2004 Daniel Veillard + + * gentest.py testapi.c: autogenerate a minimal NULL value sequence + for unknown pointer types + * HTMLparser.c SAX2.c chvalid.c encoding.c entities.c parser.c + parserInternals.c relaxng.c valid.c xmlIO.c xmlreader.c + xmlsave.c xmlschemas.c xmlschemastypes.c xmlstring.c xpath.c + xpointer.c: This uncovered an impressive amount of entry points + not checking for NULL pointers when they ought to, closing all + the open gaps. + +Fri Nov 5 16:26:28 UTC 2004 William Brack + + * catalog.c: fixed problem with NULL entry (bug 157407) + * xpath.c: fixed a couple of warnings (no change to logic) + +Fri Nov 5 15:30:43 CET 2004 Daniel Veillard + + * gentest.py testapi.c: more coverage + * xmlunicode.c: one fix + +Fri Nov 5 23:15:51 CET 2004 Daniel Veillard + + * entities.c: fixed a compilation problem on a recent change + +Fri Nov 5 12:50:09 CET 2004 Daniel Veillard + + * gentest.py testapi.c: more coverage + * nanoftp.c tree.c: more fixes + +Fri Nov 5 11:02:28 CET 2004 Daniel Veillard + + * gentest.py testapi.c: fixed the way the generator works, + extended the testing, especially with more real trees and nodes. + * HTMLtree.c tree.c valid.c xinclude.c xmlIO.c xmlsave.c: a bunch + of real problems found and fixed. + * entities.c: fix error reporting to go through the new handlers + +Thu Nov 4 18:44:56 CET 2004 Daniel Veillard + + * parser.c: dohh ... stupid change killing xmlParseDoc() + +Thu Nov 4 18:32:22 CET 2004 Daniel Veillard + + * gentest.py testapi.c: changing the way the .c is generated, + extending the tests coverage + * include/libxml/nanoftp.h nanoftp.c elfgcchack.h doc/*: fixing some + function signatures, regenerating stuff + * SAX2.c parser.c xmlIO.c: another set of bug fixes and API hardening + +Thu Nov 4 13:32:19 CET 2004 Daniel Veillard + + * gentest.py testapi.c: extending the tests coverage + +Thu Nov 4 11:52:28 CET 2004 Daniel Veillard + + * Makefile.am: gentest.py was missing from the EXTRA_DIST + +Thu Nov 4 11:48:47 CET 2004 Daniel Veillard + + * gentest.py testapi.c: extending the tests coverage + * HTMLtree.c tree.c xmlsave.c xpointer.c: more fixes and cleanups + +Thu Nov 4 00:25:36 CET 2004 Daniel Veillard + + * gentest.py testapi.c: more fixes and extending the tests coverage + * nanoftp.c xmlIO.c: more fixes and hardening + +Wed Nov 3 20:16:24 CET 2004 Daniel Veillard + + * gentest.py testapi.c: more fixes and extending the tests coverage + * valid.c: bunch of cleanups and 2 leaks removed + +Wed Nov 3 18:06:44 CET 2004 Daniel Veillard + + * gentest.py testapi.c: more fixes and extending the tests coverage + * list.c tree.c: more fixes and hardening + +Wed Nov 3 15:19:22 CET 2004 Daniel Veillard + + * gentest.py testapi.c: more fixes and extending the tests coverage + * relaxng.c include/libxml/relaxng.h: adding a type init interface + * include/libxml/xmlerror.h parser.c xmlreader.c xmlwriter.c: more + cleanups and bug fixes raised by the regression tests + +Wed Nov 3 12:49:30 CET 2004 Daniel Veillard + + * gentest.py testapi.c: more fixes and extending the tests coverage + * xmlwriter.c list.c: more hardeing of APIs + * doc/apibuild.py: skip testapi.c when scanning the C files. + +Tue Nov 2 23:09:06 CET 2004 Daniel Veillard + + * gentest.py testapi.c: more testing and coverage + * elfgcchack.h xmlstring.c include/libxml/xmlstring.h: more cleanups + * doc/*: rebuilt + +Tue Nov 2 19:44:32 CET 2004 Daniel Veillard + + * gentest.py testapi.c: more developments on the API testing + * HTMLparser.c tree.c: more cleanups + * doc/*: rebuilt + +Tue Nov 2 15:49:34 CET 2004 Daniel Veillard + + * xmlmemory.c include/libxml/xmlmemory.h: adding xmlMemBlocks() + * Makefile.am gentest.py testapi.c: work on generator of an + automatic API regression test tool. + * SAX2.c nanoftp.c parser.c parserInternals.c tree.c xmlIO.c + xmlstring.c: various API hardeing changes as a result of running + teh first set of automatic API regression tests. + * test/slashdot16.xml: apparently missing from CVS, commited it + +Mon Nov 1 15:54:18 CET 2004 Daniel Veillard + + * xpath.c: fixed an UTF-8 parsing bug reported by Markus Bertheau + on #fedora-devel + +Sun Oct 31 22:03:38 CET 2004 Daniel Veillard + + * parser.c: fixed a bug reported by Petr Pajas on the list and + affecting XML::Libxml + +Sun Oct 31 16:33:54 CET 2004 Daniel Veillard + + * encoding.c doc/examples/testWriter.c: Fixed bug #153937, making + sure the conversion functions return the number of byte written. + Had to fix one of the examples. + +Fri Oct 29 14:16:56 CEST 2004 Daniel Veillard + + * doc/xmllint.1 doc/xmllint.xml: indicate - means stdin closing #156626 + +Fri Oct 29 14:03:36 CEST 2004 Daniel Veillard + + * python/libxml.c: register xmlSchemaSetValidErrors, patch from + Brent Hendricks in the mailing-list + * include/libxml/valid.h HTMLparser.c SAX2.c valid.c + parserInternals.c: fix #156626 and more generally how to find out + if a validation contect is part of a parsing context or not. This + can probably be improved to make 100% sure that vctxt->userData + is the parser context too. It's a bit hairy because we can't + change the xmlValidCtxt structure without breaking the ABI since + this change xmlParserCtxt information indexes. + +Wed Oct 27 19:26:20 CEST 2004 Daniel Veillard + + * ChangeLog NEWS configure.in doc/*: preparing release 2.6.15 + * debugXML.c nanoftp.c xmlschemas.c xmlschemastypes.c: cleanups + +Wed Oct 27 09:31:24 PDT 2004 William Brack + + * uri.c: fixed a stupid mistake in xmlBuildRelativeURI + (bug 156527) + +Wed Oct 27 11:44:35 CEST 2004 Daniel Veillard + + * nanoftp.c nanohttp.c: second part of the security fix for + xmlNanoFTPConnect() and xmlNanoHTTPConnectHost(). + +Tue Oct 26 23:57:02 CEST 2004 Daniel Veillard + + * nanoftp.c: applied fixes for a couple of potential security problems + * tree.c valid.c xmllint.c: more fixes on the string interning checks + +Tue Oct 26 18:09:59 CEST 2004 Daniel Veillard + + * debugXML.c include/libxml/xmlerror.h: added checking for names + values and dictionnaries generates a tons of errors + * SAX2.ccatalog.c parser.c relaxng.c tree.c xinclude.c xmlwriter.c + include/libxml/tree.h: fixing the errors in the regression tests + +Mon Oct 25 16:04:22 PDT 2004 William Brack + + * parser.c: modified the handling of _private for entity + expansion (bug 155816) + +Mon Oct 25 17:11:37 CEST 2004 Daniel Veillard + + * parser.c: fixed the leak reported by Volker Roth on the list + * test/ent10 result//ent10*: added a specific test for the problem + +Sat Oct 23 11:07:41 PDT 2004 William Brack + + * valid.c: unlinked the internal subset within xmlValidateDtd + (bug 141827) + * configure.in: added -Wall to developer's flags + * doc/examples/reader4.res: added to CVS + +Fri Oct 22 16:36:50 CEST 2004 Daniel Veillard + + * HTMLparser.c: added support for HTML PIs #156087 + * test/HTML/python.html result/HTML/python.html*: added specific tests + +Fri Oct 22 15:20:23 CEST 2004 Daniel Veillard + + * threads.c: fixed nasty bug #156087 + +Fri Oct 22 21:04:20 CEST 2004 Daniel Veillard + + * python/libxml.c: fixed a problem occuring only in x86_64 when + very large error messages are raised to the Python handlers. + +Thu Oct 21 18:03:21 CEST 2004 Daniel Veillard + + * xmlschemas.c: fixed a memory bug + * doc/examples/reader4.c doc/examples/*: added test from Graham Bennett + and regenerated the directory + +Tue Oct 19 11:06:39 CEST 2004 Daniel Veillard + + * include/libxml/xmlreader.h xmlreader.c: applied patch from + Graham Bennett adding 4 convenience functions to the reader API. + +Fri Oct 15 11:22:48 PDT 2004 William Brack + + * debugXML.c: excluded a few nodes (with no content) from the + string check routine. + +Fri Oct 15 10:48:30 EDT 2004 Daniel Veillard + + * debugXML.c include/libxml/xmlerror.h: added UTF-8 string checking, + raise a problem, need debug + +Wed Oct 13 02:17:36 CEST 2004 Daniel Veillard + + * python/Makefile.am: applied patch from Thomas Fitzsimmons fixing + #155240 building outside the source tree. but make tests fails. + +Mon Oct 11 16:26:51 CEST 2004 Daniel Veillard + + * debugXML.c include/libxml/xmlerror.h: added namespace checking + +Sat Oct 9 22:36:21 CEST 2004 Daniel Veillard + + * debugXML.c: some framework preparation to add namespace checkings + +Thu Oct 7 15:12:58 CEST 2004 Daniel Veillard + + * debugXML.c include/libxml/debugXML.h include/libxml/xmlerror.h: + adding the tree debug mode + * parser.c relaxng.c tree.c xpath.c: fixing various problems reported + by the debug mode. + * SAX2.c: another tree fix from Rob Richards + +Wed Oct 6 10:50:03 PDT 2004 William Brack + + * catalog.c: small change to last fix, to get xml:base right + +Wed Oct 6 09:33:51 PDT 2004 William Brack + + * catalog.c: added code to handle , including dumping + to output (bug 151924). + * xmlcatalog.c, xmlstring.c, parser.c: minor compiler warning + cleanup (no change to logic) + +Mon Oct 4 16:09:07 CEST 2004 Daniel Veillard + + * configure.in debugXML.c include/libxml/xmlversion.h.in + include/libxml/xmlwin32version.h.in: revamped the XML debugging + module and prepare for a new checking mode + +Mon Oct 4 13:53:24 CEST 2004 Daniel Veillard + + * parser.c: applied patch from Malcolm Tredinnick fixing bug #152426 + +Mon Oct 4 12:26:28 CEST 2004 Daniel Veillard + + * python/generator.py python/libxml.c python/tests/outbuf.py: + applied patch from Malcolm Tredinnick fixing bug #154294 + related to saving to python file objects. + +Sat Oct 2 21:08:51 PDT 2004 William Brack + + * tree.c: changed xmlHasNsProp to properly handle a request for + the default namespace (bug 153557) + +Sat Oct 2 18:18:27 PDT 2004 William Brack + + * parser.c: fixed problem with dictionary handling within + xmlParseInNodeContext (bug 153175) + +Sat Oct 2 15:46:37 PDT 2004 William Brack + + * check-relaxng-test-suite.py, check-relaxng-test-suite2.py, + check-xinclude-test-suite.py, check-xml-test-suite.py, + check-xsddata-test-suite.py, doc/examples/index.py: changed + changed sys.path setting from 'append' to 'insert' (patch + supplied by Malcolm Tredinnick) (bug 153716) + +Sat Oct 2 15:03:14 PDT 2004 William Brack + + * include/libxml/parserInternals.h: added two new macros + IS_ASCII_LETTER and IS_ASCII_DIGIT used with (html) + parsing and xpath for testing data not necessarily + unicode. + * HTMLparser.c, xpath.c: changed use of IS_LETTER_CH and + IS_DIGIT_CH macros to ascii versions (bug 153936). + +Fri Oct 1 20:37:25 PDT 2004 William Brack + + * error.c: added some coding to attempt to display which file + contains an error when using XInclude (bug 152623) + +Thu Sep 30 11:19:17 CEST 2004 Daniel Veillard + + * configure.in: stupid cut'n paste bug in xmllint detection + +Wed Sep 29 17:47:56 CEST 2004 Daniel Veillard + + * configure.in doc/*: releasing 2.6.14, rebuilding the docs + +Wed Sep 29 15:00:11 CEST 2004 Kasimier Buchcik + + * xmlschemas.c include/libxml/xmlerror.h include/libxml/xmlschemas.h + include/libxml/schemasInternals.h: Parsing of + - handle attribute 'mixed', catch illegal attributes. + Parsing of - handle attributes 'abstract', + 'final' and 'block', catch illegal attributes. + Validation of complex types - handle abstract types. + Added handling of default/fixed attributes and element values. + Per validation option attribute nodes/text nodes are created + on the instance. + Added the corresponding constraints for fixed/default. + Added xmlSchemaSetValidOptions, xmlSchemaGetValidOptions + to the external API. + Extended element declaration constraints. + Got rid of perseverative creation of temporery validation/parser + contexts. + Added handling of xsi:schemaLocation and + xsi:noNamespaceSchemaLocation. + Fixed xsi:type component resolution if using non-prefixed + QNames. + * xmlregexp.c xmlschemas.c include/libxml/xmlautomata.h: + Enabled namespace awareness of the content model if using the + model group "all". + * test/schemas/bug152470_1.xsd: Removed an "abstract" attribute, + which broke the test. + * xstc/xstc.py: Workaround to accomodate case insensitive + test definitions in ms-test.def.xml (was missing in a previous + commit). + +Wed Sep 29 11:03:10 CEST 2004 Daniel Veillard + + * python/drv_libxml2.py: another patch from Malcolm Tredinnick + adding option not to load dtd from the drv_libxml2.py module + #134633 + +Tue Sep 28 14:30:22 CEST 2004 Daniel Veillard + + * acconfig.h config.h.in configure.in xmlIO.c xmlregexp.c xmlschemas.c + xmlschemastypes.c: another patch from Malcolm Tredinnick fixing + warning generated by the Nonstop Kernel Open System Services + compiler #151710 + +Tue Sep 28 13:07:37 CEST 2004 Daniel Veillard + + * python/libxml.py: applied patch from Malcolm Tredinnick fixing + python exception hierarchy #139824 + +Sun Sep 26 16:40:24 CEST 2004 Daniel Veillard + + * valid.c TODO: applied patch from Malcolm Tredinnick fixing errata + E20 concerning NMTOKENS and co. validation #153722 + * result/VC/AttributeNmtokens test/VC/AttributeNmtokens + test/VCM/AttributeNmtokens.xml: also added tests from Malcolm + +Sun Sep 26 16:24:44 CEST 2004 Daniel Veillard + + * xstc/xstc.py: applied patch from Malcolm Tredinnick fixing space/tabs + #153713 + * xpath.c: fixed a realloc potential problem + +Fri Sep 24 16:14:12 CEST 2004 Daniel Veillard + + * Makefile.am: fixed make valgrind xstc + +Thu Sep 23 18:23:46 CEST 2004 Daniel Veillard + + * xmlschemastypes.c: fixing an out of bound adressing issue + +Thu Sep 23 15:14:12 CEST 2004 Daniel Veillard + + * HTMLparser.c parser.c relaxng.c xmlschemas.c: more memory related + code cleanups. + +Thu Sep 23 01:04:30 CEST 2004 Daniel Veillard + + * parser.c: fixed a bunch of errors when realloc failed. + +Wed Sep 22 23:56:05 CEST 2004 Daniel Veillard + + * threads.c uri.c: couple of memory fixes from Mark Vakoc reported + by Purify on Windows. + +Mon Sep 20 22:01:47 CEST 2004 Daniel Veillard + + * xmllint.c: added --timing --copy timing for the copy + * vms/build_libxml.com: applied patch from Craig Berry + to build with recent releases + +Fri Sep 17 21:25:33 PDT 2004 William Brack + + * nanohttp.c, include/libxml/nanohttp.h: added the routine + xmlNanoHTTPContentLength to the external API (bug151968). + * parser.c: fixed unnecessary internal error message (bug152060); + also changed call to strncmp over to xmlStrncmp. + * encoding.c: fixed compilation warning (bug152307). + * tree.c: fixed segfault in xmlCopyPropList (bug152368); fixed + a couple of compilation warnings. + * HTMLtree.c, debugXML.c, xmlmemory.c: fixed a few compilation + warnings; no change to logic. + +Fri Sep 17 10:40:23 CEST 2004 Daniel Veillard + + * parser.c: removed some extern before function code reported by + Kjartan Maraas on IRC + * legacy.c: fixed compiling when configuring out the HTML parser + * Makefile.am: added a declaration for CVS_EXTRA_DIST + * HTMLparser.c: beginning of an attempt at cleaning up the construction + of the HTML parser data structures, current data generate a huge + amount of ELF relocations at loading time. + +Fri Sep 17 10:36:23 CEST 2004 Daniel Veillard + + * ChangeLog: applied fix from Stepan Kasal to fix duplication + in the change log and cleanup of space/tabs issues. + +Thu Sep 16 13:24:27 CEST 2004 Kasimier Buchcik + + * xmlschemas.c include/libxml/schemasInternals.h + test/schemas/bug152470_1.* result/schemas/bug152470_1_1*: + Simpified attribute wildcard creation and assignment to get rid + of memory leaks. + Restructured the validation process. + Restructured and expanded parsing of . + Added initial handing of xsi:type. + Advanced handling of xsi:nil (should work now for simple types). + Added construction of schemata using xsi:schemaLocation and + xsi:noNamespaceSchemaLocation; this is not enabled, since + no corresponding API exists yet. + Moved the content model to complex type components. + Resolution of types for attributes will look for simple types + only (incl. all the built-in simple types). + Extended parsing of 'anyAttribute'. + Fixed content-type type for complex types if derived from + 'anyType' using the short-hand form (see bug # 152470, + submitted by Thilo Jeremias). + * include/libxml/xmlschematypes.h: Cleaned up some comments. + * xstc/xstc.py: Workaround to accomodate case insensitive + test definitions in ms-test.def.xml. + * result/schemas/deter0_0_0.err result/schemas/ns0_0_2.err + result/schemas/ns0_1_2.err: Adapted. + +Sat Sep 11 09:04:22 PDT 2004 William Brack + + * xmlwriter.c: changed char array initialisation to avoid a + complaint from some compiler(s) (bug 152308) + +Thu Sep 9 07:22:11 PDT 2004 William Brack + + * encoding.c: applied fixes for the UTF8ToISO8859x transcoding + routine suggested by Mark Itzcovitz + +Wed Sep 8 22:50:27 CEST 2004 Daniel Veillard + + * valid.c xmlsave.c: fixed 2 problems raised by #152140, one + which is that notation not in the internal subset should + not be saved, and the second more nasty on an error saving + NOTATIONs, if there is a proof that nobody uses notations ! + +Wed Sep 8 11:04:27 CEST 2004 Kasimier Buchcik + + * xmlschemas.c include/libxml/xmlschemas.h: Added the function + xmlSchemaValidateOneElement to the XML Schema validation API, + as proposed by Jeffrey Fink - see bug # 152073. + +Tue Sep 7 11:10:36 CEST 2004 Daniel Veillard + + * configure.in doc/Makefile.am xstc/Makefile.am: some cleanup + checking for xmllint and xsltproc in configure.in, fixed + make dist w.r.t. the new xstc subdir. + * doc/*: rebuilt + +Mon Sep 6 16:42:59 CEST 2004 Kasimier Buchcik + + * xstc/xstc.py: Changed to finally validate instance documents. + +Mon Sep 6 16:04:01 CEST 2004 Daniel Veillard + + * xstc/Makefile.am Makefile.am: integrated to "make valgrind", + heavy ... weight 250MB of VM ! + +Mon Sep 6 14:54:39 CEST 2004 Daniel Veillard + + * xstc/Makefile.am xstc/xstc-to-python.xsl xstc/xstc.py Makefile.am: + more cleanup in integrating the xstc testsuite + +Mon Sep 6 13:56:28 CEST 2004 Daniel Veillard + + * Makefile.am configure.in xstc/.cvsignore xstc/Makefile.am: + starting to integrate the xstc suite in the normal regression + tests + +Mon Sep 6 13:14:11 CEST 2004 Kasimier Buchcik + + * xstc/sun-test-def.xml: The "tsDir" attribute was not + set correctly. + +Mon Sep 6 11:52:50 CEST 2004 Daniel Veillard + + * check-xinclude-test-suite.py: when output and expected do not match + exactly run diff to put the differences in the log c.f. #148691 + +Mon Sep 6 11:17:35 CEST 2004 Kasimier Buchcik + + * xstc/xstc-to-python.xslt xstc/ms-test-def.xml xstc/nist-test-def.xml + xstc/sun-test-def.xml: Initial release of generation files to + create python test scripts, which will run the W3C XML Schema Test + Collection. The ms-test-def.xml and sun-test-def.xml files + were extracted from the online HTML XSTC results [1], since they did + not exist for the SUN tests, and only partially did exist for the + MS tests. The NIST definition file was created by concatenation + of the existing definition files for each single datatype. + The stylesheet "xstc-to-python.xslt" should be run against the + definition files to produce the python scripts. + [1] "http://www.w3.org/XML/2001/05/xmlschema-test-collection/ + results-master.html" + +Fri Sep 3 20:29:59 CEST 2004 Kasimier Buchcik + + * xmlschemas.c include/libxml/schemasInternals.h + include/libxml/xmlerror.h: Fixed a seg fault in xmlGetQNameProp: + a format argument was missing. + Fixed wrong assignment of the owner of a wildcard in + xmlSchemaBuildAttributeValidation (in the shorthandform of + ; this caused a seg fault, due to a double-free + of the wildcard. + Added a check for circular attribute group references. + Added a check for circular model group definition references. + Fixed a dublicate xmlParserErrors enum value - see bug #151738. + +Fri Sep 3 10:08:13 PDT 2004 William Brack + + * xmlstring.c: modified comments on xmlGetUTF8Char in + response to bug 151760 (no change to logic) + +Tue Aug 31 09:46:18 PDT 2004 William Brack + + * xmlstring.c: fixed error reported on the list caused by + my last change + +Tue Aug 31 15:41:52 CEST 2004 Daniel Veillard + + * NEWS configure.in doc/*: release of libxml2-2.6.13 + +Tue Aug 31 14:14:30 CEST 2004 Daniel Veillard + + * xmlIO.c: fixing #151456, an encoding error could generate + a serialization loop. + +Tue Aug 31 11:34:04 CEST 2004 Daniel Veillard + + * Makefile.am: also produce a tar ball with just the sources + * xmllint.c: added --path option and --load-trace options to + xmllint, RFE #147740 based on xsltproc versions + * doc/xmllint.* doc/*: updated the man page and rebuilt + +Tue Aug 31 10:37:23 CEST 2004 Daniel Veillard + + * xmlschemastypes.c: "" is a valid hexbinary string dixit xmlschema-dev + * result/schemas/hexbinary_0_1.err test/schemas/hexbinary_1.xml: + update the test. + * test/ns5 result//ns5*: added a test for the namespace bug fixed + in previous commit. + * Makefile.am: added a message in the regression tests + +Mon Aug 30 23:36:21 PDT 2004 William Brack + + * SAX2.c: fixed bug introduced during OOM fixup causing problems + with default namespace when a named prefix with the same href + was present (reported on the mailing list by Karl Eichwalder. + * xmlstring.c: modified xmlCheckUTF8 with suggested code from + Julius Mittenzwei. + * dict.c: added a typecast to try to avoid problem reported by + Pascal Rodes. + +Mon Aug 30 12:45:46 CEST 2004 Kasimier Buchcik + + * xmlschemas.c: Fixed a bug in xmlSchemasCheckFacet, which did + not create a computed value on a facet and thus crashed during + validation of instances. + Expanded validity checks for min/maxOccurs attributes. + Expanded validity checks for the value of the attribute "form". + +Fri Aug 27 18:32:24 PST 2004 William Brack + + * xmlstring.c: fixed a problem with xmlCheckUTF8 reported on the + mailing list by Julius Mittenzwei + +Fri Aug 27 00:13:39 CEST 2004 Daniel Veillard + + * libxml.spec.in: added BuildRequires: zlib-devel, fixes + Red Hat bug #124942 + +Thu Aug 26 12:27:23 CEST 2004 Daniel Veillard + + * parser.c: remove a warning on Solaris + * xmlschemastype.c: fix a crashing bug #151111 + +Wed Aug 25 22:20:18 CEST 2004 Kasimier Buchcik + + * test/schemas/import-bad-1_0.imp: Added missing test file. + * xmlschemas.c include/libxml/xmlerror.h include/libxml/xmlschemas.h: + Substituted the obsolete xmlSchemaValidError(s) for xmlParserErrors + - see #150840. + Changed the import of schemas to allow failure of location + of a resource to be imported. + * result/schemas/all_* result/schemas/any3_0_0.err + result/schemas/choice_* result/schemas/import1_0_0.err + result/schemas/list0_0_1.err result/schemas/list0_1_0.err + result/schemas/list0_1_1.err result/schemas/ns0_0_2.err + result/schemas/ns0_1_2.err: Adapted regression test results. + +Tue Aug 24 20:49:15 MDT 2004 John Fleck + + * doc/tutorial/xmltutorial.xml, xmltutorial.pdf, *.html + fix Xpath memory leak (thanks to sKaBoy and William Brack) + +Tue Aug 24 21:10:59 CEST 2004 Igor Zlatkovic + + * parser.c: fixed path problem in DTD loading reported by + Sameer Abhinkar + +Tue Aug 24 16:40:51 CEST 2004 Igor Zlatkovic + + * win32/configure.js: added support for version extra + * win32/Makefile.*: upgraded to zlib 1.2.1 + +Mon Aug 23 14:33:54 CEST 2004 Daniel Veillard + + * configure.in: removing -O -g from default gcc flags #150828 + +Sun Aug 22 16:26:46 CEST 2004 Daniel Veillard + + * configure.in doc/* NEWS: preparing 2.6.12 release, updated and + and rebuilt the docs. + +Sun Aug 22 16:07:20 CEST 2004 Daniel Veillard + + * python/libxml.c: fix a problem on last commit + +Sun Aug 22 15:16:53 CEST 2004 Daniel Veillard + + * xmllint.c xpath.c include/libxml/xpath.h + include/libxml/xpathInternals.h python/libxml.c + python/libxml_wrap.h: trying to remove some warning when compiling + on Fedora Core 3 and 64bits + +Sat Aug 21 0:035:10 CET 2004 Kasimier Buchcik + + * xmlschemas.c: modified parsing of , , , + , , , . + Fixed schema defaults (elementFormDefault, etc.) for included + schemas. + Fixed a bug which reported attributes as invalid on + elements declarations with the built-in type 'anyType'. + Added "lax" validation of the content of elements of type + 'anyType'. + Fixed: element declarations with the same name were treated + as duplicate if located in the subtree of -> . + (This was bug 150623, submitted by Roland Lezuo) + Fixed cleanup of error codes in xmlSchemaValidateDoc as proposed + by Igor Kapitanker. (This was bug 150647, submitted by Igor + Kapitanker) + * xmlschemastypes.c: Changed the type of anyType to + XML_SCHEMAS_ANYTYPE. + * include/libxml/xmlerror.h: Added schema parser errors. + * result/schemas/bug145246_0_0* + result/schemas/extension1_0_2.err: Changed test results. + * result/schemas/ct-sc-nobase_0_0* + result/schemas/facet-whiteSpace_0_0* + result/schemas/import1_0_0* result/schemas/import2_0_0* + result/schemas/include2_0_0* result/schemas/include3_0_0* + result/schemas/restriction-attr1_0_0* + result/schemas/seq-dubl-elem1_0_0* + result/schemas/xsd-list-itemType_0_0*: Added new rest results. + test/schemas/bug145246.xsd.imp test/schemas/ct-sc-nobase_0* + test/schemas/facet-whiteSpace_0* test/schemas/import1_0* + test/schemas/import2_0* test/schemas/include2_0* + test/schemas/include3_0* test/schemas/restriction-attr1_0* + test/schemas/seq-dubl-elem1_0* test/schemas/xml.xsd + test/schemas/xsd-list-itemType_0*: Added new tests and missing + files. + +Fri Aug 20 18:51:36 CEST 2004 Daniel Veillard + + * Makefile.am configure.in: a bit of cleanup and a extra variable for + CVS dist + +Thu Aug 19 07:44:07 MDT 2004 John Fleck + + * doc/xmllint.xml, xmllint.1, xmllint.html: + Edit and rebuild the man pages with Daniel's C14 update + +Wed Aug 18 19:15:27 PDT 2004 William Brack + + * parser.c: fixed missing line numbers on entity as reported + on the list by Steve Cheng + +Wed Aug 18 14:04:31 PDT 2004 William Brack + + * configure.in globals.c include/libxml/xmlversion.h.in + include/libxml/xmlwin32version.h.in: added some code to + include the CVS ChangeLog version in the xmlParserVersion + string (printed by xmllint with --version) + +Wed Aug 18 11:14:06 CEST 2004 Daniel Veillard + + * xmlschemas.c include/libxml/xmlschemas.h python/generator.py + python/libxml.c python/libxml_wrap.h python/types.c + python/tests/schema.py python/tests/Makefile.am: Applied patch + from Torkel Lyng to add Schemas support to the Python bindings + and extend the schemas error API, registered a new test. + * doc/* elfgcchack.h: rebuilt to regenerate the bindings + +Mon Aug 16 14:36:25 CEST 2004 Daniel Veillard + + * debugXML.c: added help for new set shell command + * xinclude.c xmllint.c xmlreader.c include/libxml/parser.h: + added parser option to not generate XInclude start/end nodes, + added a specific option to xmllint to test it fixes #130769 + * Makefile.am: regression test the new feature + * doc/xmllint.1 doc/xmllint.xml: updated man page to document option. + +Mon Aug 16 02:42:30 CEST 2004 Daniel Veillard + + * xmlIO.c: small typo pointed out by Mike Hommey + * doc/xmllint.xml, xmllint.html, xmllint.1: slightly improved + the --c14n description, c.f. #144675 . + * nanohttp.c nanoftp.c: applied a first simple patch from + Mike Hommey for $no_proxy, c.f. #133470 + * parserInternals.c include/libxml/parserInternals.h + include/libxml/xmlerror.h: cleanup to avoid 'error' identifier + in includes #137414 + * parser.c SAX2.c debugXML.c include/libxml/parser.h: + first version of the inplementation of parsing within + the context of a node in the tree #142359, new function + xmlParseInNodeContext(), added support at the xmllint --shell + level as the "set" function + * test/scripts/set* result/scripts/* Makefile.am: extended + the script based regression tests to instrument the new function. + +Sat Aug 14 18:53:08 MDT 2004 John Fleck + + * doc/xmllint.xml, xmllint.html, xmllint.1: + add c14n to man page (man, it's hard to keep up with + Daniel!) + +Sat Aug 14 18:45:38 MDT 2004 John Fleck + + * doc/xmllint.xml, xmllint.html, xmllint.1: + add pattern, walker, maxmem, output and xmlout to man page + fixes #144675 + +Sun Aug 15 00:41:12 CEST 2004 Daniel Veillard + + * xmllint.c: added a --c14n option to canonicalize the output + should close the RFE #143226 + +Sat Aug 14 23:50:10 CEST 2004 Daniel Veillard + + * tree.c: Dodji pointed out a bug in xmlGetNodePath() + * xmlcatalog.c: applied patch from Albert Chin to add a + --no-super-update option to xmlcatalog see #145461 + and another patch also from Albert Chin to not crash + on -sgml --del without args see #145462 + * Makefile.am: applied another patch from Albert Chin to + fix a problem with diff on Solaris #145511 + * xmlstring.c: fix xmlCheckUTF8() according to the suggestion + in bug #148115 + * python/libxml.py: apply fix from Marc-Antoine Parent about + the errors in libxml(2).py on the node wrapper #135547 + +Sat Aug 14 13:18:57 CEST 2004 Daniel Veillard + + * Makefile.am: added a dumb rule to able to compile tst.c + when people submit a sample test program + * xmlschemas.c: applied small patch from Eric Haszlakiewicz + to document xmlSchemasSetValidErrors() limitations, #141827 + * error.c: Add information in generic and structured error + setter functions that this need to be done per thread #144308 + * xmlsave.c: fixed bug whith missing NOTATION(s) serialization + bug #144162 + * doc/xmllint.xml: typo fix #144840 + +Tue Aug 10 07:19:31 PDT 2004 Daniel Veillard + + * configure.in xmlregexp.c xmlschemas.c xmlschemastypes.c + include/libxml/schemasInternals.h include/libxml/xmlerror.h + include/libxml/xmlschemastypes.h: applied Schemas patches + from Kasimier Buchcik + * test/ result/ bug141333* annot-err* any[1-4]* bug145246* + element-err* element-minmax-err* include1* restrict-CT-attr-ref*: + lot of new tests for things fixed by the patch + +Fri Aug 6 09:22:34 PDT 2004 William Brack + + * valid.c: fixed my mis-handling of External ID on last + change. + +Wed Aug 4 23:40:21 PDT 2004 William Brack + + * valid.c: changed the parsing of a document's DTD to use + the proper base path (bug 144366) + +Wed Aug 4 16:58:08 CEST 2004 Daniel Veillard + + * Makefile.am config.h.in configure.in python/Makefile.am: + applied a patch from Gerrit P. Haase to get python bindings + on Cygwin + +Tue Aug 3 15:08:22 PDT 2004 William Brack + + * include/libxml/valid.h: elaborated on description of + xmlValidityWarningFunc and xmlValidityErrorFunc (bug + 144760) + * xmlIO.c, xmlschemastypes.c, include/libxml/schemasinternals.h: + minor fixes to comments for doc rebuilding errors. + * doc/*.html: rebuilt the docs + +Tue Aug 3 23:59:23 CEST 2004 Daniel Veillard + + * doc/ChangeLog.xsl doc/downloads.html doc/xml.html doc/*: + fixes documentation glitches raised by Oliver Stoeneberg + +Tue Aug 3 09:42:31 PDT 2004 William Brack + + * tree.c: fixed problem with memory leak on text nodes in DTD + (bug 148965) with patch provided by Darrell Kindred + +Tue Aug 3 08:14:44 PDT 2004 William Brack + + * HTMLparser.c: fixed initialisation problem for htmlReadMemory + (bug 149041) + +Sat Jul 31 11:01:33 PDT 2004 William Brack + + * doc/buildDocBookCatalog: enhanced per bug 119876. Further + info posted to the mailing list. + +Sat Jul 31 09:12:44 PDT 2004 William Brack + + * SAX2.c, encoding.c, error.c, parser.c, tree.c, uri.c, xmlIO.c, + xmlreader.c, include/libxml/tree.h: many further little changes + for OOM problems. Now seems to be getting closer to "ok". + * testOOM.c: added code to intercept more errors, found more + problems with library. Changed method of flagging / counting + errors intercepted. + +Fri Jul 30 13:57:55 CEST 2004 Daniel Veillard + + * tree.c: applied a couple of patch one from Oliver Stoeneberg + and another one from Rob Richards fixing #148448 + +Thu Jul 29 13:20:28 CEST 2004 Daniel Veillard + + * HTMLparser.c: 1 line patch, apparently htmlNewDoc() was not + setting doc->charset. + +Thu Jul 29 00:05:58 PDT 2004 William Brack + + * SAX2.c, tree.c, uri.c, xmlIO.c, xmlreader.c: further + fixes for out of memory condition, mostly from Olivier + Andrieu. + * testOOM.c: some further improvement by Olivier, with + a further small enhancement for easier debugging. + +Tue Jul 27 00:34:07 PDT 2004 William Brack + + * SAX2.c, error.c, parser.c, tree.c, xmlreader.c: + implemented patches supplied by Olivier Andrieu + (bug 148588), plus made some further enhancements, to + correct some problems with out of memory conditions. + * testOOM.c: improved with patches from Olivier Andrieu + +Mon Jul 26 11:03:18 PDT 2004 William Brack + + * tree.c: put in patch for Windows buffer re-allocation + submitted by Steve Hay (bug 146697) + +Sun Jul 25 17:18:39 PDT 2004 William Brack + + * xinclude.c: added some code to check, when an include is + done, whether the requested URL gets mapped to some other + location (e.g. with a catalog entry) and, if so, take care + of the xml:base properly (bug 146988) + +Sun Jul 25 14:02:24 PDT 2004 William Brack + + * error.c: fixed to assure user data param is set correctly + when user structured error handler is called (bug 144823) + +Thu Jul 22 10:14:48 PDT 2004 William Brack + + * xmlreader.c: fixed problem with reader state after + processing attributes (bug 147993) + +Wed Jul 21 17:04:27 HKT 2004 William Brack + + * configure.in, Makefile.am: put in an auto* check for the + path to perl (if it exists), and modified make Timingtests + to use that path instead of just executing the dbgenattr.pl + script (bug 148056) + +Fri Jul 16 18:36:33 HKT 2004 William Brack + + * python/generator.py: added a check on the argument for some + classes (e.g. xmlDoc and xmlNode) to prevent a segfault (as + reported on the list). Further enhancement should be done + to auto-create the appropriate object. + * python/libxml.c: minor fix for a warning message; added a + routine, currently not used, to report the description of a + PyCObject. + * python/libxml2class.txt: regenerated + +Fri Jul 16 11:01:40 CEST 2004 Daniel Veillard + + * catalog.c test/catalogs/white* result/catalogs/white*: + applied patches from Peter Breitenlohner to fix handling + of white space normalization in public ids and add tests + +Tue Jul 13 17:24:13 CEST 2004 Daniel Veillard + + * xmlmemory.c: applied a small fix from Steve Hay + +Tue Jul 13 23:02:19 HKT 2004 William Brack + + * xpath.c: Added code to in PREDICATE/FILTER handling to reset + the xpath context document pointer (part of fix to libxslt + bug 147445) + +Tue Jul 13 00:14:08 HKT 2004 William Brack + + * python/libxml.py: ran 'expand' on the file to get rid of mixture + of tabs and spaces (bug 147424) + +Sun Jul 11 22:38:29 HKT 2004 William Brack + + * python/drv_libxml.py: added an encoding "special comment" to avoid + warning message in python2.3 (bug 146889) + * Makefile.am, python/Makefile.am, python/tests/Makefile.am: small + change to make "make tests" a little quieter (MAKEFLAGS+=--silent) + * xpath.c: enhanced to take advantage of current libxslt handling + of tmpRVT. Fixes bug 145547. + +Fri Jul 9 14:02:54 CEST 2004 Daniel Veillard + + * libxml.h uri.c: fixed a couple of problems in the new + elfgcchack.h trick pointed by Peter Breitenlohner + +Wed Jul 7 00:45:48 CEST 2004 Daniel Veillard + + * elfgcchack.h doc/apibuild.py doc/libxml2-api.xml: fixed a bug + which prevented building with --with-minimum + +Mon Jul 5 19:43:51 CEST 2004 Daniel Veillard + + * configure.in doc/*: releasing 2.6.11, updated and regenerated the + docs + +Mon Jul 5 18:43:47 CEST 2004 Daniel Veillard + + * parser.c: make the push interfaces synchronous + * python/tests/sync.py: added a specific test + * python/tests/Makefile.am doc/examples/Makefile.am + doc/examples/index.py: added the new test, cleaning up + "make tests" output + +Mon Jul 5 15:09:17 CEST 2004 Daniel Veillard + + * xmlschemas.c: applied patch from Kasimier to fix some Relax-NG + datatype facet problem with recent changes. + +Sat Jul 3 11:31:02 HKT 2004 William Brack + + * python/libxml.c: Changed the number of XPath extension functions + allowed to be variable-length (patch supplied by Marc-Antoine + Parent, bug 143805). Added code to "unregister" the functions + when the parser cleanup takes place. + +Fri Jul 2 14:22:14 CEST 2004 Daniel Veillard + + * xmlmemory.c python/libxml.c python/libxml2-python-api.xml: + some updates with memory debugging facilities while messing + with libxslt python bindings + +Thu Jul 1 14:53:36 CEST 2004 Daniel Veillard + + * python/libxml.c python/generator.py python/libxml.py + python/libxml2-python-api.xml python/libxml2class.txt: + applied patch from Stéphane Bidoul to fix some Python bindings + initialization, then had to change the parserCleanup() + to handle memory released there. + * xmlmemory.c: added more debugging comments. + +Thu Jul 1 13:18:02 CEST 2004 Daniel Veillard + + * xmlreader.c: seems the reader buffer could be used while not + allocated, fixes bug #145218 + +Thu Jul 1 11:34:10 CEST 2004 Daniel Veillard + + * python/generator.py: do not provide functions used as destructor + of classes as public methods to avoid double-free problem like + in bug #145185 + +Wed Jun 30 19:45:23 HKT 2004 William Brack + + * xmlschemas.c, xmlschemastypes.c: warning message cleanup. + Now compiles warning-free, all tests passed. + * SAX2.c: small change to comments for documentation. + No change to logic. + +Tue Jun 29 15:00:13 PDT 2004 Daniel Veillard + + * xmlschemas.c: more fixes with Kasimier, looks far cleaner :-) + +Tue Jun 29 23:00:05 CEST 2004 Daniel Veillard + + * xmlschemas.c: Kasimier Buchcik fixed the memory access and + allocation problem + +Tue Jun 29 19:00:32 CEST 2004 Daniel Veillard + + * xmlschemas.c xmlschemastypes.c include/libxml/xmlerror.h + include/libxml/schemasInternals.h include/libxml/xmlschemastypes.h: + applied Schemas patches from Kasimier Buchcik, there is still + one open issue about referencing freed memory. + * test/schemas/* result/schemas/*: updated with new tests from + Kasimier + +Tue Jun 29 14:52:18 CEST 2004 Daniel Veillard + + * include/libxml/globals.h include/libxml/xmlIO.h + doc/libxml2-api.xml doc/libxml2-refs.xml: moved some definitions + to globals.h to avoid some troubles pointed out by Rob Richards + +Mon Jun 28 11:25:31 CEST 2004 Daniel Veillard + + * libxml.m4: applied changes suggested by Mike Hommey, remove + libxml1 support and use CPPFLAGS instead of CFLAGS + +Sun Jun 27 14:17:15 CEST 2004 Daniel Veillard + + * libxml.spec.in: another, more 'experimental' feature to + get compiler optimization based on gcc runtime profiling + +Sun Jun 27 14:02:36 CEST 2004 Daniel Veillard + + * elfgcchack.h doc/elfgcchack.xsl libxml.h: hack based on Arjan van de + Ven suggestion to reduce ELF footprint and generated code. Based on + aliasing of libraries function to generate direct call instead of + indirect ones + * doc/libxml2-api.xml doc/Makefile.am doc/apibuild.py: added automatic + generation of elfgcchack.h based on the API description, extended + the API description to show the conditionals configuration flags + required for symbols. + * nanohttp.c parser.c xmlsave.c include/libxml/*.h: lot of cleanup + * doc/*: regenerated the docs. + +Sun Jun 27 10:02:28 HKT 2004 William Brack + + * regressions.py, regressions.xml: new files for running + regression tests under Python. Not yet complete, but + should provide good testing under both Linux and Windows. + * testHTML.c, testSAX.c, xmllint.c: changed the 'fopen' used + for --push testing to include the 'rb' param when compiled + under Windows. + +Fri Jun 25 13:38:57 HKT 2004 William Brack + + * uri.c: fixed a problem when base path was "./xxx" + * result/XInclude/*: 5 test results changed by above. + * Makefile.am: fixed a couple of spots where a new + result file used different flags that the testing one. + +Thu Jun 24 16:27:44 HKT 2004 William Brack + + * valid.c: suppressed warnings from within xmlValidGetValidElements + (bug 144644) + * doc/examples/testWriter.c: corrected typo in comment for ISO-8859-1 + (bug 144245) + +Thu Jun 24 10:17:31 HKT 2004 William Brack + + * valid.c: implemented bugfix from Massimo Morara for DTD + dumping problem. + * test/valid/t10.xml, result/valid/t10.*: added regression + for above + * configure.in: small change for my profile settings + +Wed Jun 23 20:18:19 MDT 2004 John Fleck + + * doc/xmlcatalog_man.xml, xmlcatalog.1 + Docs patch from Ville Skytta, bugzilla #144841 + +Sat Jun 19 18:34:11 MDT 2004 John Fleck + + * doc/xmllint.xml, xmllint.html, xmllint.1 + update man page to reflect William's newly disciplined return + code mojo + +Thu Jun 17 00:51:55 CEST 2004 Daniel Veillard + + * doc/examples/io2.c doc/examples/parse4.c: fixing a couple of + compilation errors when configured with --with-minimum + +Wed Jun 16 16:07:10 CEST 2004 Daniel Veillard + + * debugXML.c: applied patch from Stefano Debenedetti to register + namespaces in the debug shell + +Mon Jun 14 21:56:31 CEST 2004 Daniel Veillard + + * xmlreader.c: fix from Steve Ball and update of the comment. + * Makefile.am result/errors/*.str: William pointed out that + the streaming error checking part wasn't streaming, fixing + +Mon Jun 14 14:11:52 CEST 2004 Daniel Veillard + + * catalog.c: patch from Igor for the default catalog path on Windows + +Sat Jun 12 09:03:57 HKT 2004 William Brack + + * configure.in: apparently wasn't updated last time + +Thu Jun 10 20:57:48 HKT 2004 William Brack + + * configure.in, xmlmemory.c, globals.c: fixed problem when + configuring using --with-thread-alloc + +Wed Jun 9 16:31:24 CEST 2004 Igor Zlatkovic + + * win32/configure.js win32/Makefile.* minor changes for the new + layout of the Windows binary package + +Tue Jun 8 19:50:25 CEST 2004 Daniel Veillard + + * xmlschemas.c include/libxml/xmlerror.h: applied another patch + from Kasimier Buchcik for Schema Component Constraints + * test/schemas/* result/schemas/*: added the regression tests + +Tue Jun 8 21:27:03 HKT 2004 William Brack + + * xmllint.c: fixed missing error return code for schema + validation (bug 143880), also changed over to an enum for + defining the error return codes for all conditions. + +Tue Jun 8 14:01:14 CEST 2004 Daniel Veillard + + * parser.c xmlreader.c include/libxml/parser.h: fixed a serious + problem when substituing entities using the Reader, the entities + content might be freed and if rereferenced would crash + * Makefile.am test/* result/*: added a new test case and a new + test operation for the reader with substitution of entities. + +Tue Jun 8 12:14:16 CEST 2004 Daniel Veillard + + * globals.c xmlIO.c include/libxml/globals.h include/libxml/xmlIO.h: + applied patch from Rob Richards for the per thread I/O mappings + +Tue Jun 8 09:58:31 HKT 2004 William Brack + + * xinclude.c: some further enhancement to take care of + xml:base for XPointer elements (bug 143886). Also fixed + a problem when xml:base was already specified on an + XInclude'd element. + +Mon Jun 7 22:14:58 HKT 2004 William Brack + + * relaxng.c: fixed a problem with internal cleanup of
element + (bug 143738). + +Mon Jun 7 16:57:43 HKT 2004 William Brack + + * uri.c, include/libxml/uri.h: added a new routine + xmlBuildRelativeURI needed for enhancement of xinclude.c + * xinclude.c: changed handling of xml:base (bug 135864) + * result/XInclude/*: results of 5 tests changed as a result + of the above change + +Fri Jun 4 11:27:37 CEST 2004 Daniel Veillard + + * test/schemas/* result/schemas/*: added a bunch of tests from + Kasimier Buchcik posted on May 11 + +Thu Jun 3 17:58:25 CEST 2004 Daniel Veillard + + * xmlschemas.c: new patch from Kasimier Buchcik for processContents + of wildcards attribute handling + * test/schemas/anyAttr-* result/schemas/anyAttr-*: added specific + regression tests + +Thu Jun 3 13:20:36 CEST 2004 Daniel Veillard + + * parser.c: fixed a bug where invalid charrefs may not be detected + sometimes as pointed by Morus Walter. + * test/errors/charref1.xm result/errors/charref1.xml*: added the + test in the regression suite. + +Thu Jun 3 18:38:27 HKT 2004 William Brack + + * xmlschemas.c: small change to xmlSchemaValidateAttributes, + also corrected typo on error code enum. + * include/libxml/xmlerror.h: corrected typo on schema error + code enum + +Thu Jun 3 10:12:38 HKT 2004 William Brack + + * xmlschemas.c: minor cosmetic changes, no change to logic. + * result/schemas/attruse_0_[12].err: regenerated + * globals.c: added a newline at end to make gcc happy + +Wed Jun 2 21:16:26 CEST 2004 Daniel Veillard + + * xmlschemas.c include/libxml/schemasInternals.h + include/libxml/xmlerror.h: applied a patch from Kasimier Buchcik + implementing attribute uses and wildcards. + * test/schemas/* result/schemas/*: added/fixed a bunch of tests + +Wed Jun 2 18:15:51 CEST 2004 Daniel Veillard + + * globals.c xmlIO.c include/libxml/globals.h: applied patch from + Rob Richards for custom I/O BufferCreateFilenane fixes bug + #143366 + +Wed Jun 02 16:25:32 HKT 2004 William Brack + + * xpath.c: fixed problem with predicate evaluation on an + empty nodeset (bug 143409) + +Wed Jun 02 11:26:41 HKT 2004 William Brack + + * testSAX.c: fixed problem with attribute listing (bug 142674) + and added macro LIBXML_TEST_VERSION to assure xmlInitParser + gets called (bug 142686) + +Sat May 29 21:35:52 CEST 2004 Daniel Veillard + + * test/schemas/date_0.xml xmlschemastypes.c: applied a patch from + Charles Bozeman fixing a side effect in date handling + +Thu May 27 19:47:48 MDT 2004 John Fleck + + * doc/tutorial/xmltutorial.xml fix lack of cast in Xpath example + * doc/tutorial/*.html, xmltutorial.pdf rebuild html, pdf + +2004-05-25 Aleksey Sanin + + * c14n.c: fixed c14n bug with serializing attribute namespaces + +Mon May 24 08:22:48 HKT 2004 William Brack + + * xpath.c: fixed to allow '+' in exponent of number + (bug 143005) + * SAX2.c: fixed typo in last commit + +Sat May 22 09:08:24 HKT 2004 William Brack + + * SAX2.c: skipped call to xmlValidateNCName when compiling + --with-minimum (bug 142917) + +Tue May 18 06:48:00 CEST 2004 Daniel Veillard + + * catalog.c: reverted the broken change. + +Mon May 17 23:07:15 CEST 2004 Daniel Veillard + + * NEWS doc/*: updated the docs for 2.6.10 + +Mon May 17 05:52:03 CEST 2004 Daniel Veillard + + * configure.in : releasing 2.6.10 + +Sun May 16 23:12:35 CEST 2004 Daniel Veillard + + * tree.c: avoid returning default namespace when searching + from an attribute + * entities.c xmlwriter.c: reverse xmlEncodeSpecialChars() behaviour + back to escaping " since the normal serialization routines do not + use it anymore, should close bug #134477 . Tried to make + the writer avoid it too but it didn't work. + +Sun May 16 01:07:16 CEST 2004 Daniel Veillard + + * doc/ChangeLog.awk doc/ChangeLog.xsl: fixed escaping + handling and added direct links to bugzilla report for + bug numbers. + +Sun May 16 11:11:13 HKT 2004 William Brack + + * error.c: modified to assure proper user data is sent to + structured error routine (bug 142598) + +Sun May 16 03:18:52 CEST 2004 Daniel Veillard + + * catalog.c: a couple of large static variable which should really + not be declared as such cluttered the .bss section. + +Sun May 16 03:06:31 CEST 2004 Daniel Veillard + + * doc/ChangeLog.awk: fixed a couple of problems when parsing + libxslt ChangeLog + +Sat May 15 20:14:21 CEST 2004 Daniel Veillard + + * doc/ChangeLog.awk doc/ChangeLog.xsl: first steps of a good + ChangeLog page generation. The awk shoudl escape characters + not okay in XML and the xslt should make links to functions + or variables or bug reported in the entries. + +Sat May 15 14:57:40 CEST 2004 Daniel Veillard + + * xmlsave.c include/libxml/xmlsave.h: start adding API for + escaping customization. + +Sat May 15 12:38:17 CEST 2004 Daniel Veillard + + * xmlsave.c: more xmlSave cleanup, optimization and refactoring + +Fri May 14 17:51:48 CEST 2004 Daniel Veillard + + * xmlIO.c xmlsave.c: third pass at the escaping refactoring. + +Fri May 14 12:37:24 HKT 2004 William Brack + + * parser.c: enhanced the enhancement, fixed another couple of + special cases. + +Fri May 14 11:48:33 HKT 2004 William Brack + + * parser.c: small enhancement to dtd handling of (a?)+ (bug 142487) + +Thu May 13 23:19:00 CEST 2004 Daniel Veillard + + * xmlIO.c xmlsave.c include/libxml/xmlIO.h: second pass on escaping + handling, start to looks better, need to be completed and added + directly at the saving context level. + +Thu May 13 10:31:28 CEST 2004 Daniel Veillard + + * xmlIO.c xmlsave.c include/libxml/xmlIO.h: first pass at refactoring + the escape on save routines for better performances (less malloc) + and more flexibility using the new saving context. Preliminary + work, interface will change. + +Wed May 12 22:34:03 HKT 2004 William Brack + + * xmlschemas.c: added code in xmlSchemaBuildAContentModel to handle + element reference within the xs:all construct (bug 139897) + +Wed May 12 17:27:18 HKT 2004 William Brack + + * xinclude.c: a little further fixing of fallback processing, this + time for fallback with children (bug 139520). + +Wed May 12 08:21:33 HKT 2004 William Brack + + * xmlschemas.c: added code in xmlSchemaBuildContentModel to + allow ref in group definition (bug 134411). Also fixed + misc compilation warning messages. + * result/schema/group0_0_0, result/schema/group0_0_0.err: + regenerated (now no error reported). + +Tue May 11 11:55:59 CEST 2004 Daniel Veillard + + * xmlIO.c: fix to the fix for #141864 from Paul Elseth + * HTMLparser.c result/HTML/doc3.htm: apply fix from David Gatwood for + #141195 about text between comments. + +Tue May 11 23:04:47 HKT 2004 William Brack + + * xmlschemas.c, include/libxml/schemasInternals.h, + include/libxml/xmlerror.h: Applied patches supplied by + Kasimier Buchcik. + * test/schemas/po1_0.xml, test/schemas/po1_0.xsd: + changed test to account for above patch. + +Tue May 11 09:06:53 CEST 2004 Daniel Veillard + + * python/tests/tstLastError.py: better portability fix for f(*args), + use apply(f, args) as Stephane Bidoul suggested + +Mon May 10 15:49:22 HKT 2004 William Brack + + * xmlregexp.c: enhanced xmlRegStateAddTrans to check if transition + is already present and, if so, to ignore the request to add it. + This has a very dramatic effect on memory requirements as well + as efficiency. It also fixes bug 141762. + +Sun May 9 20:40:59 CEST 2004 Daniel Veillard + + * Makefile.am python/tests/Makefile.am python/tests/tstLastError.py: + applied patch from Ed Davis to allow "make tests" to work + with Python 1.5 + +Sun May 9 19:46:13 CEST 2004 Daniel Veillard + + * xmlsave.c: apply fix for XHTML1 formating from Nick Wellnhofer + fixes bug #141266 + * test/xhtmlcomp result//xhtmlcomp*: added the specific regression + test + +Sun May 9 14:07:21 CEST 2004 Daniel Veillard + + * Makefile.am: fix for a pedantic make check without make all request + +Sat May 8 22:56:22 CEST 2004 Daniel Veillard + + * uri.c xmlIO.c: fixing some problems in URI unescaping + and output buffer opening, this should fix #141864 + +Fri May 7 22:31:54 CEST 2004 Daniel Veillard + + * valid.c include/libxml/valid.h: fixes the use of 'list' as a parameter + * xmlIO.c include/libxml/xmlIO.h: added xmlPopInputCallback for + Matt Sergeant + +Thu May 6 21:14:38 PDT 2004 William Brack + + * xmlregexp.c: enhanced the handling of subexpression ranges + which have a minOccurs of 0 (bug 140478 again); cleaned up + comments throughout the module. + +Tue May 4 00:52:16 CEST 2004 Daniel Veillard + + * xmllint.c: adding a --maxmem option to check memory used. + +Sat May 1 01:08:44 CEST 2004 Daniel Veillard + + * xmllint.c xmlsave.c python/generator.py python/libxml.c: Fixed + bug #141529 i.e. various problems when building with --without-html + +Fri Apr 30 18:12:31 CEST 2004 Daniel Veillard + + * xmllint.c xmlreader.c: fixing bug #141384 where the reader didn't + call the deregistering functions. Also added the check to + xmllint --stream --chkregister . + +Fri Apr 30 08:57:47 CEST 2004 Daniel Veillard + + * win32/Makefile.msvc: applied a second patch from Mark Vakoc for + regression tests on Windows + +Thu Apr 29 21:47:23 CEST 2004 Daniel Veillard + + * xmlreader.c: never commit without running make tests first ! + +Thu Apr 29 20:15:20 CEST 2004 Daniel Veillard + + * xmlreader.c: fix a nasty problem with reading over the end + * xmlsave.c: fix a reported memory leak apparently + +Thu Apr 29 17:05:00 CEST 2004 Daniel Veillard + + * win32/Makefile.msvc: patch from Mark Vakoc for regression tests + on Windows. + * xpath.c: the NaN problem also shows up on Borland + +Mon Apr 26 23:37:12 HKT 2004 William Brack + + * xmlregexp.c: enhanced xmlFARegExec range evaluation for min + occurs 0 problems - fixes bug 140478. + +Thu Apr 22 09:12:47 CEST 2004 Daniel Veillard + + * rngparser.c: tiny path fixes the "xmlConvertCRNGFile" function name + from Kasimier Buchcik + * xmlschemas.c: recursive xs:extension fix from taihei goi + +Wed Apr 21 00:19:29 CEST 2004 Daniel Veillard + + * tree.c: small buffer resizing improvement from Morten Welinder + closes #140629 + +Tue Apr 20 23:40:14 CEST 2004 Daniel Veillard + + * xpath.c: last version of the fix for MSC version 1200 + +Tue Apr 20 19:40:37 CEST 2004 Daniel Veillard + + * parser.c: killing the strncmp vs. memcmp controversy and #140593 + +Tue Apr 20 13:27:06 CEST 2004 Daniel Veillard + + * include/libxml/SAX2.h: Kasimier Buchcik pointed out some + inexistent functions, cleaned them out. + +Tue Apr 20 11:42:50 CEST 2004 Daniel Veillard + + * error.c: Johnson Cameron pointed out that + initGenericErrorDefaultFunc() was really wrong. + * xmlreader.c include/libxml/xmlreader.h: xmlTextReaderMode enum + must be made public, added some missing comments on the XMLReader + header. + * c14n.c: Alexsey fixed C14N bug with processing namespaces + from attributes + +Mon Apr 19 23:27:46 CEST 2004 Daniel Veillard + + * xpath.c: fixed a stupid () error + Mark name. + +Sun Apr 18 23:45:46 CEST 2004 Daniel Veillard + + * configure.in: preparing 2.6.9 release + * doc/* News: updated and rebuilt the docs + +Sun Apr 18 22:51:43 CEST 2004 Daniel Veillard + + * xpath.c: relaxed id() to not check taht the name(s) passed + are actually NCName, decided this in agreement with Aleksey Sanin + since existing specs like Visa3D broke that conformance checking + and other tools seems to not implement it sigh... + * SAX2.c: check attribute decls for xml:id and the value is an + NCName. + * test/xmlid/id_err* result/xmlid/id_err*: added error testing + +Sun Apr 18 21:46:17 CEST 2004 Daniel Veillard + + * xpath.c: work around Microsoft compiler NaN bug raise reported + by Mark Vakoc + * xmlschemas.c include/libxml/schemasInternals.h + include/libxml/xmlerror.h: fixed a recusive extention schemas + compilation error raised by taihei goi + +Sun Apr 18 16:57:02 CEST 2004 Daniel Veillard + + * libxml.spec.in: keep the ChangeLog compressed + * xmlreader.c: fix a segfault when using Close() + * python/tests/Makefile.am python/tests/reader8.py: test for + the Close() reader API. + +Sat Apr 17 22:42:13 HKT 2004 William Brack + + * xmlschemas.c, xmlwriter.c, doc/examples/parse4.c, + doc/examples/io2.c: minor warning cleanup (no change to logic) + * xinclude: fixed return value for internal function + xmlXIncludeLoadFallback (now always 0 or -1) + +Sat Apr 17 21:32:32 HKT 2004 William Brack + + * valid.c: small enhancement to fix bug 139791 + +Fri Apr 16 18:44:47 CEST 2004 Daniel Veillard + + * xmlschemas.c include/libxml/schemasInternals.h + include/libxml/xmlerror.h: applied patches from Kasimier Buchcik + for the attribute use support + * test/schemas/attruse* result/schemas/attruse*: added the + tests to the regression suite. + +Fri Apr 16 18:22:25 CEST 2004 Daniel Veillard + + * xmlsave.c: move the TODO as comments as the function while not + finished are usable as-is + * xmlschemas.c include/libxml/xmlerror.h: patch from Kasimier Buchcik + implementing union + * test/schemas/union_0_0.x* result/schemas/union_0_0*: added example + * python/Makefile.am: applied fix from Mike Hommey + +Fri Apr 16 23:58:42 HKT 2004 William Brack + + * parser.c: fixed problem with detecting external dtd + encoding (bug 135229). + * Makefile.am: minor change to test label + +Fri Apr 16 16:09:31 HKT 2004 William Brack + + * xinclude.c: fixed problem causing duplicate fallback + execution (bug 139520) + * test/XInclude/docs/fallback2.xml result/XInclude/fallback2.*: + added testcase + +Fri Apr 9 23:49:37 CEST 2004 Daniel Veillard + + * SAX2.c include/libxml/tree.h: adding xml:id draft support + * Makefile.am test/xmlid/id_tst* result/xmlid/id_tst*: adding + 4 first regression tests + +Fri Apr 9 11:56:08 CEST 2004 Daniel Veillard + + * libxml.spec.in: fixing Red Hat bug #120482 , libxml2-python + should depend on the version of python used to compile it. + +Mon Apr 5 09:07:24 CEST 2004 Daniel Veillard + + * HTMLparser.c: applied patch from James Bursa, frameset should + close head. + +Fri Apr 2 22:02:24 HKT 2004 William Brack + + * relaxng.c: fixed problem in xmlRelaxNGCompareNameClasses + which was causing check-relaxng-test-suite.py test 351 to fail. + +Fri Apr 2 17:03:48 HKT 2004 William Brack + + * nanohttp.c: implemented fix for M$ IIS redirect provided + by Ian Hummel + * relaxng.c: fixed problem with notAllowed compilation + (bug 138793) + +Thu Apr 1 22:07:52 CEST 2004 Daniel Veillard + + * uri.c: fix for xmlUriEscape on "http://user@somewhere.com" + from Mark Vakoc. + +2004-04-01 Johan Dahlin + + * python/.cvsignore: Add generated files, to make cvs silent. + +Thu Apr 1 12:41:36 CEST 2004 Daniel Veillard + + * xmlschemas.c: small signed-ness patch from Steve Little + +Wed Mar 31 17:47:28 CEST 2004 Daniel Veillard + + * xmlregexp.c: patched a bug in parsing production 1 and 2 of + xmlschemas regexp that William pointed out while working on + #134120 + * test/regexp/branch result/regexp/branch: added a specific + regression test + +Wed Mar 31 09:50:32 HKT 2004 William Brack + + * Makefile.am: added PYTHONPATH to python tests for Schemas + and RelaxNG + * test/xsdtest/xsdtestsuite.xml: added testfile for + SchemasPythonTests + +Mon Mar 29 16:56:49 CEST 2004 Daniel Veillard + + * doc/examples/examples.xsl doc/examples/index.html: added + information about compiling on Unix + +Mon Mar 29 14:18:12 CEST 2004 Daniel Veillard + + * catalog.c: fixes the comments for xmlCatalogDump and xmlDumpACatalog + * doc/*: rebuilt to update + +Sun Mar 28 18:11:41 CEST 2004 Daniel Veillard + + * xmlsave.c: optimize indentation based on the new context + +Sun Mar 28 14:17:10 CEST 2004 Daniel Veillard + + * doc/examples/xpath2.c doc/examples/xpath2.res: handle and explain + a very tricky problem when modifying the tree based on an XPath + result query. + +Sat Mar 27 09:56:14 PST 2004 William Brack + + * relaxng.c: fixed problem with IS_COMPILABLE flag + (bug 130216) + +Fri Mar 26 18:28:32 CET 2004 Daniel Veillard + + * parser.c: applied patch from Dave Beckett to correct line number + errors when using push with CDATA + +Fri Mar 26 14:53:58 CET 2004 Daniel Veillard + + * doc/examples/xpath1.c: added a test template + * doc/examples/xpath2.c doc/examples/xpath2.res doc/examples/*: + added a new example, and make valgrind target + +Fri Mar 26 11:47:29 CET 2004 Daniel Veillard + + * parser.c: apply fix for #136693 + +Thu Mar 25 20:21:01 MST 2004 John Fleck + + * doc/examples/io2.c + * doc/examples/io2.res + add xmlDocDumpMemory example in response to mailing list FAQ + (rebuilt xml and html also) + +Thu Mar 25 10:33:05 CET 2004 Daniel Veillard + + * debugXML.c testXPath.c xmllint.c xmlschemastypes.c: applied + patch from Mark Vakoc avoiding using xmlParse* option and use + xmlRead* instead + * win32/Makefile.bcb: patch to Borland C++ builder from Eric Zurcher + to avoid problems with some pathnames. + +Tue Mar 23 12:35:08 CET 2004 Daniel Veillard + + * configure.in doc/* News: preparing 2.6.8 release, updated and rebuilt + the docs. + * Makefile.am: use valgring fro the new Python based regression tests + +Mon Mar 22 20:07:27 CET 2004 Daniel Veillard + + * relaxng.c: remove a memory leak on schemas type facets. + * check-relaxng-test-suite.py check-relaxng-test-suite2.py + check-xsddata-test-suite.py: reduce verbosity + * configure.in Makefile.am: incorporated the Python regressions + tests for Relax-NG and Schemas Datatype to "make tests" + +Mon Mar 22 16:16:18 CET 2004 Daniel Veillard + + * xmlwriter.c include/libxml/xmlwriter.h doc/* : applied patch from + Alfred Mickautsch for better DTD support. + * SAX2.c HTMLparser.c parser.c xinclude.c xmllint.c xmlreader.c + xmlschemas.c: fixed bug #137867 i.e. fixed properly the way + reference counting is handled in the XML parser which had the + side effect of removing a lot of hazardous cruft added to try + to fix the problems associated as they popped up. + * xmlIO.c: FILE * close fixup for stderr/stdout + +Sun Mar 21 19:19:41 HKT 2004 William Brack + + * relaxng.c: added an error message when an element is not + found within a (bug 126093) + +Sat Mar 20 22:25:18 HKT 2004 William Brack + + * xmlregexp.c: enhanced the logic of parsing char groups to + better handle initial or ending '-' (bug 135972) + +Sat Mar 20 19:26:03 HKT 2004 William Brack + + * relaxng.c: added check for external reference in + xmlRelaxNGGetElements (bug 137718) + * test/relaxng/rngbug-001.*, result/relaxng/rngbug-001*: added + regression test for above + +Wed Mar 17 16:37:22 HKT 2004 William Brack + + * nanohttp.c: added a close for the local file descriptor + (bug 137474) + +Mon Mar 15 15:46:59 CET 2004 Daniel Veillard + + * xmlsave.c: switched the output routines to use the new context. + +Mon Mar 15 10:37:18 HKT 2004 William Brack + + * relaxng.c: enhanced to ignore XML_XINCLUDE_START and XML_XINCLUDE_END + nodes (bug 137153) + +Sun Mar 14 13:19:20 CET 2004 Daniel Veillard + + * xmlschemastypes.c: applied patch from John Belmonte for anyURI. + +Wed Mar 10 17:22:48 CET 2004 Daniel Veillard + + * parser.c: fix bug reported by Holger Rauch + * test/att8 result/noent/att8 result/att8 result/att8.rdr + result/att8.sax: added the test to th regression suite + +Wed Mar 10 19:42:22 HKT 2004 William Brack + + * doc/search.php: Minor change for later verson of php requiring + $HTTP_GET_VARS. + +Wed Mar 10 00:12:31 HKT 2004 William Brack + + * tree.c: Changed the flag to xmlDocCopyNode (and similar routines), + previously used only for recursion, to use a value of '2' to + indicate copy properties & namespaces, but not children. + * xinclude.c: changed the handling of ranges to use the above new + facility. Fixes Bug 134268. + +Tue Mar 9 18:48:51 HKT 2004 William Brack + + * win32/Makefile.bcb, win32/Makefile.mingw, win32/Makefile.msvc: + added new module xmlsave with patch supplied by Eric Zurcher + (second attempt - don't know what happened to the first one!) + +Tue Mar 9 09:59:25 CET 2004 Daniel Veillard + + * python/libxml.c python/libxml.py: applied patch from Anthony Carrico + providing Python bindings for the Canonicalization C14N support. + +Mon Mar 8 11:12:23 CET 2004 Hagen Moebius + + * .cvsignore and python/.cvsignore patched + +Mon Mar 8 22:33:14 HKT 2004 William Brack + + * xinclude.c: enhanced to assure that if xpointer is called + for a document, the XML_PARSE_NOENT flag is set before parsing + the included document so that entities will automatically get + taken care of. + * xpointer.c: corrected code so that, if an XML_ENTITY_REF node + is encountered, it will log it and not crash (bug 135713) + +Sun Mar 7 19:03:48 HKT 2004 William Brack + + * xinclude.c: modified to make sub-includes inherit the + parse flags from the parent document (bug 132597) + +Fri Mar 5 01:13:22 CET 2004 Daniel Veillard + + * xmlschemas.c: QName handling fixes for the XML Schemas + support from Adam Dickmeiss + * test/schemas/po1_0.xsd: also fix the schemas + * test/schemas/ns[12]* result/schemas/ns[12]*: added the specific + regression tests + +Thu Mar 4 23:03:02 CET 2004 Daniel Veillard + + * configure.in doc/Makefile.am include/libxml/Makefile.am: + paalied patch from Julio M. Merino Vidal fixing bug #134751 + to fix --with-html-dir option. + * doc/*: rebuilt fully the docs + * doc/html/libxml-xmlsave.html: new file from new header. + +Thu Mar 4 16:57:50 CET 2004 Daniel Veillard + + * debugXML.c testHTML.c tree.c doc/examples/*.c + include/libxml/xmlsave.h: fixing compilation bug with some options + disabled as well as --with-minimum should fix #134695 + +Thu Mar 4 15:00:45 CET 2004 Daniel Veillard + + * xmlcatalog.c: allow fallback to URI lookup when SYSTEM fails, + should close #134092 + +Thu Mar 4 14:39:38 CET 2004 Daniel Veillard + + * Makefile.am tree.c xmlsave.c include/libxml/xmlsave.h: commiting + the new xmlsave module before the actuall big code change. + +Thu Mar 4 12:38:53 CET 2004 Daniel Veillard + + * xmlschemas.c: applied patch from Adam Dickmeiss for mixed content + * test/schemas/mixed* result/schemas/mixed*: added his regression + tests too. + +Mon Mar 1 15:22:06 CET 2004 Daniel Veillard + + * testSAX.c: fix a compilation problem about a missing timb include + +Sat Feb 28 22:35:32 HKT 2004 William Brack + + * testSAX.c: small enhancement to prevent trying to print + strings with null pointers (caused "make tests" errors on + HP-UX) + +Thu Feb 26 20:19:40 MST 2004 John Fleck + + * doc/xmllint.xml + * doc/xmllint.1 + * doc/xmllint.html + * doc/xmlcatalog_man.xml + * doc/xmlcatalog.1 + * doc/xmlcatalog_man.html + applying patch from Mike Hommey to clarify XML_CATALOG_FILES + use + +Thu Feb 26 23:47:43 CET 2004 Daniel Veillard + + * Makefile.am: patch for cross-compilation to Windows from + Christophe de VIENNE. + +Thu Feb 26 18:52:11 HKT 2004 William Brack + + * doc/*.html, doc/html/*.html: regenerated docs using older + version of xsltproc pending resolution of AVT problem + +Thu Feb 26 10:56:29 CET 2004 Daniel Veillard + + * Makefile.am: applied patch from Charles Bozeman to not use + the system xmllint. + +Wed Feb 25 18:07:05 CET 2004 Daniel Veillard + + * include/libxml/xmlexports.h: applied patch from Roland Schwingel + for MingW + +Wed Feb 25 13:57:25 CET 2004 Daniel Veillard + + * Makefile.am catalog.c configure.in: applied a cleanup patch + from Peter Breitenlohner + * tree.c: removed a doc build warning by fixing a param comment + * doc/* : rebuilt the docs + +Wed Feb 25 13:33:07 CET 2004 Daniel Veillard + + * valid.c HTMLparser.c: avoid ID error message if using + HTML_PARSE_NOERROR should fix #130762 + +Wed Feb 25 12:50:53 CET 2004 Daniel Veillard + + * debugXML.c relaxng.c valid.c xinclude.c xmllint.c xmlreader.c: + fixing compilation and link option when configuring with + --without-valid should fix #135309 + +Wed Feb 25 11:36:06 CET 2004 Daniel Veillard + + * catalog.c: fixed the main issues reported by Peter Breitenlohner + * parser.c: cleanup + * valid.c: speedup patch from Petr Pajas + +Wed Feb 25 16:07:14 HKT 2004 William Brack + + * xpath.c: fixed a memory leak (xmlXPathLangFunction) reported + on the list by Mike Hommey + +Mon Feb 23 17:28:34 CET 2004 Daniel Veillard + + * doc/* NEWS configure.in: preparing 2.6.7 release, updated and + rebuilt the documentation. + +Mon Feb 23 11:52:12 CET 2004 Daniel Veillard + + * python/tests/*.py: applied patch from Malcolm Tredinnick + to avoid tabs in python sources, should fix #135095 + +Sun Feb 22 23:16:23 CET 2004 Daniel Veillard + + * testSAX.c: add --timing option + * relaxng.c: use the psvi field of the nodes instead of _private + which may be used for other purposes. + +Sat Feb 21 16:57:48 CET 2004 Daniel Veillard + + * encoding.c: small patch to try to fix a warning with Sun One compiler + +Sat Feb 21 16:22:35 CET 2004 Daniel Veillard + + * encoding.c: small patch removing a warning with MS compiler. + +Sat Feb 21 13:52:30 CET 2004 Daniel Veillard + + * debugXML.c: added "relaxng" option to the debugging shell + * Makefile.am test/errors/* result/errors/*: some regression tests + for some error tests cases. + +Fri Feb 20 09:56:47 CET 2004 Daniel Veillard + + * tree.c: xmlAttrSerializeTxtContent don't segfault if NULL + is passed. + * test/att7 result//att7*: adding an old regression test + laying around on my laptop + +Thu Feb 19 17:33:36 CET 2004 Daniel Veillard + + * xmlreader.c: fixed xmllint --memory --stream memory consumption + on large file by using xmlParserInputBufferCreateStatic() with + the mmap'ed file + +Thu Feb 19 13:56:53 CET 2004 Daniel Veillard + + * tree.c: some clarification in xmlDocDumpMemory() documentation + * xmllint.c: fixed xmllint --stream --timing to get timings back + +Wed Feb 18 15:20:42 CET 2004 Daniel Veillard + + * parser.c: fixed a problem in push mode when attribute contains + unescaped '>' characters, fixes bug #134566 + * test/att6 result//att6*: added the test to the regression suite + +Tue Feb 17 17:26:31 CET 2004 Daniel Veillard + + * valid.c: removing a non-linear behaviour from ID/IDREF raised + by Petr Pajas. Call xmlListAppend instead of xmlListInsert in + xmlAddRef + +Tue Feb 17 13:27:27 CET 2004 Daniel Veillard + + * python/tests/indexes.py python/tests/reader.py: indicated + encoding of the test file, needed for python 2.3 + +Tue Feb 17 21:08:11 HKT 2004 William Brack + + * xpath.c: fixed problem with numbers having > 19 + fractional places (bug 133921) + +Tue Feb 17 12:47:20 CET 2004 Daniel Veillard + + * xpath.c: applied optimization patch from Petr Pajas + +Tue Feb 17 12:39:08 CET 2004 Daniel Veillard + + * xmlwriter.c include/libxml/xmlwriter.h: applied update + from Alfred Mickautsch and the added patch from Lucas Brasilino + +Sun Feb 15 12:01:30 CET 2004 Daniel Veillard + + * benchmark.png index.html xml.html: updating the benchmark + graph and using a PNG instead of a GIF + * xmlreader.c: updated the TODO + +Sat Feb 14 18:55:40 MST 2004 John Fleck + + * doc/tutorial/xmltutorial.xml + * doc/tutorial/xmltutorial.pdf + * doc/tutorial/*.html + Fix bug in XPath example in the tutorial, thanks to Carlos, whose + last name I don't know, for pointing this out + +Thu Feb 12 16:28:12 CET 2004 Daniel Veillard + + * NEWS configure.in: preparing release of 2.6.6 + * doc/*: updated the docs and rebuilt them + +Thu Feb 12 13:41:16 CET 2004 Daniel Veillard + + * xmlregexp.c: fixing bug #132930 with the provided patch, a bit + suspicious about it but this is fairly contained and regression + tests still passes. + * test/schemas/all1* result/schemas/all1*: added the test to + the regression suite. + +Thu Feb 12 12:54:26 CET 2004 Daniel Veillard + + * parser.c: fixed bug #132575 about finding the end of the + internal subset in push mode. + * test/intsubset.xml result/intsubset.xml* result/noent/intsubset.xml: + added the test to the regression suite + +Wed Feb 11 14:19:31 CET 2004 Daniel Veillard + + * parserInternals.c xmlIO.c encoding.c include/libxml/parser.h + include/libxml/xmlIO.h: added xmlByteConsumed() interface + * doc/*: updated the benchmark rebuilt the docs + * python/tests/Makefile.am python/tests/indexes.py: added a + specific regression test for xmlByteConsumed() + * include/libxml/encoding.h rngparser.c tree.c: small cleanups + +Wed Feb 11 08:13:58 HKT 2004 William Brack + + * encoding.c: applied patch supplied by Christophe Dubach + to fix problem with --with-minimum configuration + (bug 133773) + * nanoftp.c: fixed potential buffer overflow problem, + similar to fix just applied to nanohttp.c. + +Mon Feb 9 18:40:21 CET 2004 Igor Zlatkovic + + * nanohttp.c: fixed the fix for the buffer overflow, thanx + William :-) + +Mon Feb 9 22:37:14 HKT 2004 William Brack + + * acinclude.m4, configure.in: fixed problem concerning + determining SOCKLEN_T as pointed out by Daniel Richard G. + on the mailing list + +Mon Feb 9 15:31:24 CET 2004 Igor Zlatkovic + + * nanohttp.c: fixed buffer overflow reported by Yuuichi Teranishi + +Mon Feb 9 13:45:59 CET 2004 Daniel Veillard + + * xpath.c: small patch from Philip Ludlam to avoid warnings. + +Mon Feb 9 13:41:47 CET 2004 Daniel Veillard + + * encoding.c: applied a small patch from Alfred Mickautsch + to avoid an out of bound error in isolat1ToUTF8() + +Mon Feb 9 13:35:50 CET 2004 Daniel Veillard + + * xinclude.c: remove the warning on the 2001 namespace + * parser.c parserInternals.c xpath.c: remove some warnings + when compiling with MSVC6 + * nanohttp.c: applied a patch when using _WINSOCKAPI_ + +Sun Feb 8 12:09:55 HKT 2004 William Brack + + * xinclude.c: added a small hack to fix interference between + my fixes for bugs 132585 and 132588. + * python/libxml.c: fixed problem with serialization of namespace + reported on the mailing list by Anthony Carrico + +Sat Feb 7 16:53:11 HKT 2004 William Brack + + * xinclude.c: fixed problem with function xmlXIncludeCopyRange + (bug 133686). + +Fri Feb 6 21:03:41 HKT 2004 William Brack + + * xmlwriter.c: fixed problem with return value of + xmlTextWriterWriteIndent() (bug 133297) + +Fri Feb 6 19:07:04 HKT 2004 William Brack + + * xinclude.c: changed coding to output good XIncludes when + one or more bad ones are present (bug 132588) + +Fri Feb 6 17:34:21 HKT 2004 William Brack + + * xinclude.c: corrected handling of empty fallback condition + (bug 132585) + +Fri Feb 6 15:28:36 HKT 2004 William Brack + + * HTMLparser.c: added initialisation for ctxt->vctxt + in HTMLInitParser (bug 133127) + * valid.c: minor cosmetic change (removed ATTRIBUTE_UNUSED + from several function params) + +Tue Feb 3 16:48:57 PST 2004 William Brack + + * xinclude.c: fixed problem regarding freeing of dictionary + when there are errors within an XInclude file (bug 133106). + Thanks to Oleg Paraschenko for the assistance. + +Tue Feb 3 09:53:18 PST 2004 William Brack + + * xmlschemastypes.c: fixed validation of maxLength with no + content using patch submitted by Eric Haszlakiewicz + (bug 133259) + +Tue Feb 3 09:21:09 CET 2004 Igor Zlatkovic + + * include/libxml/xmlreader.h include/libxml/xmlmemory.h: added + calling convention to the public function prototypes (rep by + Cameron Johnson) + * include/libxml/xmlexports.h: fixed mingw+msys compilation + (rep by Mikhail Grushinskiy) + +Mon Feb 2 20:22:18 PST 2004 William Brack + + * xmlwriter.c: enhanced output indenting (bug 133264) + +Mon Feb 2 16:13:33 PST 2004 William Brack + + * xmlreader.c, include/libxml/xmlreader.h: applied patch from + Steve Ball to provide structured error reports. + +Sun Feb 1 01:48:14 PST 2004 William Brack + + * tree.c, include/libxml/tree.h: moved serialization of + attribute text data (xmlSerializeContent) into a separate + routine (xmlSerializeTxtContent) so it can be used by xmlwriter.c + * xmlwriter.c: changed handling of attribute string to use the + routine above (fixed bug 131548) + +Sat Jan 31 08:22:02 MST 2004 John Fleck 2.6, rebuild + html - this time doing it correctly :-) + +Fri Jan 30 20:45:36 MST 2004 John Fleck + + * doc/examples/examples.xml + * doc/examples/*.html + add note that reader examples need libmxl2 > 2.6, rebuild + html + +Thu Jan 29 23:51:48 PST 2004 William Brack + + * xpath.c: added (void *) type override to prevent + warning on Solaris (Bug 132671) + +Wed Jan 28 07:20:37 MST 2004 John Fleck + + * doc/examples/Makefile.am + per Jan. 15 email to the list from oliverst, the index.html + file from this directory wasn't making it into the tarball + +Mon Jan 26 18:01:00 CET 2004 Daniel Veillard + + * acinclude.m4: applied fix from Alexander Winston for a problem + related to automake-1.8 , c.f. #132513 and #129861 + +Mon Jan 26 12:53:11 CET 2004 Daniel Veillard + + * doc/examples/index.py: don't rely on . being on the path for + make tests, should keep Mr. Crozat quiet until next time... + +Sun Jan 25 21:45:03 CET 2004 Daniel Veillard + + * configure.in NEWS doc/*: preparing release 2.6.5, rebuilt the + docs, checked rngparser stuff does not end up in the tarball + +Sun Jan 25 20:59:20 CET 2004 Daniel Veillard + + * python/libxml.c: applied patch from Frederic Peters + fixing the wrong arg order in xpath callback in bug #130980 + +Sun Jan 25 20:52:09 CET 2004 Daniel Veillard + + * xinclude.c: fixing #130453 XInclude element with no href attribute + * relaxng.c rngparser.c include/libxml2/relaxng.h: fully integrating + the compact syntax will require more work, postponed for the + 2.6.5 release. + +Sat Jan 24 09:30:22 CET 2004 Daniel Veillard + + * include/libxml/schemasInternals.h xmlschemas.c: applied patch from + Steve Ball to avoid a double-free. + +Fri Jan 23 14:03:21 CET 2004 Daniel Veillard + + * doc/examples/*: added io1.c an example ox xmlIO usage and io1.res + test result, fixed a awful lot of memory leaks showing up in + testWriter.c, changed the examples and the Makefiles to test + memory leaks. + * xmlwriter.c: fixed a memory leak + * Makefile.am: run the doc/examples regression tests as part of + make tests + * xpath.c include/libxml/xpath.h: added xmlXPathCtxtCompile() to + compile an XPath expression within a context, currently the goal + is to be able to reuse the XSLT stylesheet dictionnary, but this + opens the door to others possible optimizations. + * dict.c include/libxml/dict.h: added xmlDictCreateSub() which allows + to build a new dictionnary based on another read-only dictionnary. + This is needed for XSLT to keep the stylesheet dictionnary read-only + while being able to reuse the strings for the transformation + dictionnary. + * xinclude.c: fixed a dictionnar reference counting problem occuring + when document parsing failed. + * testSAX.c: adding option --repeat for timing 100times the parsing + * doc/* : rebuilt all the docs + +Thu Jan 22 14:17:05 2004 Aleksey Sanin + + * xmlmemory.c: make xmlReallocLoc() accept NULL pointer + +Thu Jan 22 08:26:20 CET 2004 Daniel Veillard + + * xmlschemastypes.c: applied patch from John Belmonte for + normalizedString datatype support. + +Thu Jan 22 10:43:22 HKT 2004 William Brack + + * xpath.c: fixed problem with union when last() is used + in predicate (bug #131971) + * xpointer.c: minor change to comment for doc generation + +Wed Jan 21 17:03:17 CET 2004 Daniel Veillard + + * parser.c: fixed bug #131745 raised by Shaun McCance with the + suggested patch + +Wed Jan 21 10:59:55 CET 2004 Daniel Veillard + + * xmlwriter.c: applied patch from Alfred Mickautsch fixing a memory + leak reported on the list. + +Thu Jan 15 00:48:46 CET 2004 Daniel Veillard + + * python/generator.py python/tests/tstLastError.py: applied + patch from Stephane Bidoul to add enums to the Python bindings. + +Tue Jan 13 21:50:05 CET 2004 Daniel Veillard + + * testHTML.c: another small patch from Mark Vakoc + +Tue Jan 13 21:39:58 CET 2004 Daniel Veillard + + * HTMLparser.c relaxng.c testRelax.c testSchemas.c: applied + patch from Mark Vakoc to not use SAX1 unless necessary. + +Mon Jan 12 17:22:57 CET 2004 Daniel Veillard + + * dict.c parser.c xmlstring.c: some parser optimizations, + xmllint --memory --timing --repeat --stream ./db10000.xml + went down from 16.5 secs to 15.5 secs. + +Thu Jan 8 17:57:50 CET 2004 Daniel Veillard + + * xmlschemas.c: removed a memory leak remaining from the switch + to a dictionnary for string allocations c.f. #130891 + +Thu Jan 8 17:48:46 CET 2004 Daniel Veillard + + * xmlreader.c: fixing some problem if configured --without-xinclude + c.f. #130902 + +Thu Jan 8 17:42:48 CET 2004 Daniel Veillard + + * configure.in: changed AC_OUTPUT() macro to avoid a cygwin problem + c.f. #130896 + +Thu Jan 8 00:36:00 CET 2004 Daniel Veillard + + * win32/Makefile.bcb win32/Makefile.mingw win32/Makefile.msvc: + applying patch from Mark Vakoc for Windows + * doc/catalog.html doc/encoding.html doc/xml.html: applied doc + fixes from Sven Zimmerman + +Tue Jan 6 23:51:46 CET 2004 Daniel Veillard + + * python/libxml2-python-api.xml python/libxml_wrap.h python/types.c + python/tests/Makefile.am python/tests/tstLastError.py: applied + patch from Stephane Bidoul for structured error handling from + python, and the associated test + +Tue Jan 6 23:18:11 HKT 2004 William Brack + + * configure.in: fixed Bug130593 + * xmlwriter.c: fixed compilation warning + +Tue Jan 6 15:15:23 CET 2004 Daniel Veillard + + * include/libxml/xmlstring.h: fixed the comment in the header + * doc/*: rebuilt the docs + +Tue Jan 6 19:40:04 HKT 2004 William Brack + + * encoding.c, parser.c, xmlstring.c, Makefile.am, + include/libxml/Makefile.am, include/libxml/catalog.c, + include/libxml/chvalid.h, include/libxml/encoding.h, + include/libxml/parser.h, include/libxml/relaxng.h, + include/libxml/tree.h, include/libxml/xmlwriter.h, + include/libxml/xmlstring.h: + moved string and UTF8 routines out of parser.c and encoding.c + into a new module xmlstring.c with include file + include/libxml/xmlstring.h mostly using patches from Reid + Spencer. Since xmlChar now defined in xmlstring.h, several + include files needed to have a #include added for safety. + * doc/apibuild.py: added some additional sorting for various + references displayed in the APIxxx.html files. Rebuilt the + docs, and also added new file for xmlstring module. + * configure.in: small addition to help my testing; no effect on + normal usage. + * doc/search.php: added $_GET[query] so that persistent globals + can be disabled (for recent versions of PHP) + +Mon Jan 5 20:47:07 MST 2004 John Fleck + + * doc/tutorial/customfo.xsl + * doc/tutorial/customhtml.xsl + update custom tutorial-building stylesheets in preparation + for tutorial update + +Tue Jan 6 00:10:33 CET 2004 Daniel Veillard + + * rngparser.c: commiting the compact relax ng parser. It's not + completely finished, it's not integrated but I want to save the + current state + +Mon Jan 5 22:22:48 HKT 2004 William Brack + + * doc/apibuild.py, doc/APIconstructors.html, doc/libxml2-refs.xml, + win32/libxml2.def.src: fixed apibuild.py's generation of + "constructors" to be in alphabetical order (instead of previous + random sequence); regenerated resulting files. + +Mon Jan 5 14:03:59 CET 2004 Daniel Veillard + + * xmlwriter.c: applied patch from Lucas Brasilino fixing an indent + problem. + +Sun Jan 4 18:54:29 MST 2004 John Fleck + + * doc/newapi.xsl: change background color of function + declaration to improve readability + * doc/*: rebuild docs with new stylesheet + +Sun Jan 4 22:45:14 HKT 2004 William Brack + + * parser.c, include/libxml/parser.h: added a routine + xmlStrncatNew to create a new string from 2 frags. + * tree.c: added code to check if node content is from + dictionary before trying to change or concatenate. + +Sun Jan 4 08:57:51 HKT 2004 William Brack + + * xmlmemory.c: applied suggestion from Miloslav Trmac (see + Bug 130419) and eliminated xmlInitMemoryDone. More + improvement needed. + * xml2-config.in: added an additional flag (--exec-prefix) to + allow library directory to be different from include directory + (Bug 129558). + +Fri Jan 2 21:22:18 CET 2004 Daniel Veillard + + * error.c: applied patch from Stéphane Bidoul for structured error + reporting. + +Fri Jan 2 21:03:17 CET 2004 Daniel Veillard + + * include/libxml/xmlwriter.h xmlwriter.c: applied the patch from + Lucas Brasilino to add indentation support to xmlWriter + +Fri Jan 2 22:58:29 HKT 2004 William Brack + + * xinclude.c: fixed problem with "recursive" include (fallback + contains another include - Bug 129969) + +Fri Jan 2 11:40:06 CET 2004 Daniel Veillard + + * SAX2.c: found and fixed a bug misallocating some non + blank text node strings from the dictionnary. + * xmlmemory.c: fixed a problem with the memory debug mutex + release. + +Wed Dec 31 22:02:37 HKT 2003 William Brack + + * xinclude.c: fixed problem caused by wrong dictionary + reference count, reported on the list by Christopher + Grayce. + +Wed Dec 31 15:55:55 HKT 2003 William Brack + + * python/generator.py, python/libxml2class.txt: fixed problem + pointed out by Stéphane Bidoul on the list. + * xinclude.c, xpointer.c, xpath.c, include/libxml/xpointer.h: + completed modifications required to fix Bug 129967 (at last!). + Now wait to see how long before further trouble... + +Tue Dec 30 16:26:13 HKT 2003 William Brack + + * parser.c, xmlmemory.c, include/libxml/xmlmemory.h: Fixed + memory leak reported by Dave Beckett + * xmlschemas.c: Removed spurious comment reported on the mailing + list + * xinclude.c, xpath.c, xpointer.c, libxml/include/xpointer.h: + Further work on Bug 129967 concerning xpointer range handling + and range-to function; much better, but still not complete + +Mon Dec 29 18:08:05 CET 2003 Daniel Veillard + + * valid.c: xmlValidateElement could crash for element holding a + namespace declaration but not in a namespace. Oliver Fischer + provided the example. + +Mon Dec 29 11:29:31 CET 2003 Daniel Veillard + + * xmllint.c: issue validation status on stderr, not stdout as suggested + by Pawel Palucha + * result/relaxng/*: this change slightly all the output from RNG + regressions. + +Mon Dec 28 10:47:32 HKT 2003 William Brack + + * xmlschemas.c: edited a couple of comments in accordance with + posting on the mailing list (no logic change) + * xpointer.c: working on Bug 129967, added check for NULL + nodeset to prevent crash. Further work required. + * xpath.c: working on Bug 129967, added code to handle + XPATH_LOCATIONSET in RANGETO code, also added code to + handle it in xmlXPathEvaluatePredicateResult. Further + work required. + +Sat Dec 27 12:32:58 HKT 2003 William Brack + + * xmlschemas.c: added tests for xs:all to assure minOccurs + and maxOccurs <= 1 (Bug 130020) + +Sat Dec 27 09:53:06 HKT 2003 William Brack + + * xmlregexp.c: fixed xmlFAParseCharRange for Unicode ranges + with patch from Charles Bozeman. + +Fri Dec 26 14:03:41 HKT 2003 William Brack + + * xmlregexp.c: fixed problem causing segfault on validation error + condition (reported on mailing list) + +Thu Dec 25 21:16:22 HKT 2003 William Brack + + * xmlschemas.c: fixed missing dictionaries for Memory and Doc + parser contexts (problem reported on mailing list) + * doc/apibuild.py: small change to prevent duplicate lines + on API functions list. It will take effect the next time + the docs are rebuilt. + +Wed Dec 24 12:54:25 CET 2003 Daniel Veillard + + * configure.in NEWS doc/*: updated the docs and prepared a new + release 2.6.4 + +Wed Dec 24 12:07:52 CET 2003 Daniel Veillard + + * legacy.c: remove deprecated warning on startElement() + +Wed Dec 24 12:04:35 CET 2003 Daniel Veillard + + * xinclude.c result/XInclude/nodes2.*: XInclude xpointer support + was broken with the new namespace. Fixes #129932 + +Wed Dec 24 00:29:30 CET 2003 Daniel Veillard + + * xmlschemas.c include/libxml/schemasInternals.h: types might be + redefined in includes, quick fix to allow this but lacks the + equality of the redefinition test. + +Tue Dec 23 15:14:37 HKT 2003 William Brack + + * valid.c: fixed bug concerning validation using external + dtd of element with mutiple namespace declarations + (Bug 129821) + +Tue Dec 23 11:41:42 HKT 2003 William Brack + + * tree.c: inhibited production of "(null):" in xmlGetNodePath + when node has default namespace (Bug 129710) + +Tue Dec 23 09:29:14 HKT 2003 William Brack + + * xpath.c: small enhancement to xmlXPathCmpNodes to assure + document order for attributes is retained (Bug 129331) + +Mon Dec 22 19:06:16 CET 2003 Daniel Veillard + + * parser.c xmlreader.c: change xmlReadFd() xmlCtxtReadFd() + xmlReaderNewFd() xmlReaderForFd(), change those to not close + the file descriptor. Updated the comment, should close #129683 + +Mon Dec 22 00:34:09 CET 2003 Daniel Veillard + + * xinclude.c: fixed a serious problem in XInclude #129021 + +Sun Dec 21 13:59:54 CET 2003 Daniel Veillard + + * parser.c: fixed bug #129489, propagation of parsing flags + in entities. + * parser.c xmlreader.c: improved the comments of parsing options + +Sun Dec 21 18:14:04 HKT 2003 William Brack + + * python/Makefile.am, python/tests/Makefile.am, + doc/Makefile.am: applied fixes to allow build from + 'outside' directory (Bug 129172) + +Sat Dec 20 16:42:07 MST 2003 John Fleck + + * tree.c - add explanation of namespace inheritance when + ns is NULL to xmlNewChild and xmlNewTextChild API doc + +Sat Dec 20 18:17:28 HKT 2003 William Brack + + * include/libxml/xpathInternals.h: undid last change (my + bad). Put necessary fix in libxslt/libexslt instead. + * include/libxml/DOCBparser.h: put test for __GCC__ on + warning directive (Bug 129105) + +Sat Dec 20 10:48:37 HKT 2003 William Brack + + * include/libxml/xpathInternals.h: fixed xmlXPathReturnString + to cater for NULL pointer (bug 129561) + * globals.c: added comment to suppress documentation warning + * doc/apibuild.py: fixed problem which caused last APIchunkxx.html + to be lost. Rebuilt doc/* (including adding APIchunk26.html) + +Fri Dec 19 18:24:02 CET 2003 Daniel Veillard + + * xmlreader.c: trying to fix #129692 xmlTextReaderExpand() when + using an xmlReaderWalker() + +Thu Dec 18 20:10:34 MST 2003 John Fleck + + * tree.c: fix misc. typos in doc comments + * include/libxml/tree.h: elaborate on macro define doc comments + * doc/*: rebuild docs + +Wed Dec 17 16:07:33 CET 2003 Daniel Veillard + + * doc/examples/*: don't call the result files .out but .res as + the Makefiles tend to try generating binaries for .out targets... + +Tue Dec 16 20:53:54 MST 2003 John Fleck + + * doc/html/libxml-pattern.html: - cvs add API docs for new + pattern stuff + +Tue Dec 16 20:40:40 MST 2003 John Fleck + + * tree.c + * doc/*: + Elaborate in documentation discussion of xmlNewChild + and xmlNewTextChild. Thanks to Steve Lenti for pointing + out the usefulness of a more explicit explanation of the + reserved character escaping issue. + +Fri Dec 12 15:55:15 CET 2003 Daniel Veillard + + * xmlcatalog.c: applied patch from Stefan Kost + +Thu Dec 11 15:15:31 CET 2003 Daniel Veillard + + * doc/examples/testWriter.c: applied small fix from Lucas Brasilino + +Thu Dec 11 14:55:22 CET 2003 Igor Zlatkovic + + * win32/Makefile.* win32/configure.js: Added pattern support + +Wed Dec 10 14:11:20 CET 2003 Daniel Veillard + + * configure.in doc/* libxml.spec.in: preparing release of + libxml2-2.6.3, updated and regenerated the docs. + +Wed Dec 10 11:43:33 CET 2003 Daniel Veillard + + * SAX2.c pattern.c: removed some compilation warnings + +Wed Dec 10 11:16:29 CET 2003 Daniel Veillard + + * xmllint.c: fixing bug #119264 xmllint failing to report + serialization errors in some cases. + +Tue Dec 9 23:50:23 CET 2003 Daniel Veillard + + * entities.c: fixed an XML entites content serialization + potentially triggered by XInclude, see #126817 + +Tue Dec 9 16:12:50 CET 2003 Daniel Veillard + + * xmlwriter.c: applied the patch to xmlTextWriterStartPI() + suggested by Daniel Schulman in #128313 + +Tue Dec 9 15:18:32 CET 2003 Daniel Veillard + + * configure.in Makefile.am: another patch from Kenneth Haley + for Mingw, c.f. #128787 + +Tue Dec 9 15:07:09 CET 2003 Daniel Veillard + + * include/libxml/xmlexports.h: applied patch from Kenneth Haley + for compiling on Mingw see #128786 + +Tue Dec 9 14:52:59 CET 2003 Daniel Veillard + + * xmllint.c: some flags were not passed down correctly as + parsing options. Fixes #126806 + +Tue Dec 9 12:29:26 CET 2003 Daniel Veillard + + * xinclude.c xmllint.c xmlreader.c include/libxml/xinclude.h + include/libxml/xmlerror.h: augmented the XInclude API + to be able to pass XML parser flags down to the Inclusion + process. Also resynchronized with the Last Call W3C Working + Draft 10 November 2003 for the xpointer attribute. + * Makefile.am test/XInclude/docs/nodes[23].xml + result/XInclude/*: augmented the tests for the new namespace and + testing the xpointer attribute, changed the way error messages + are tested + * doc/*: regenerated the documentation + +Mon Dec 8 18:38:26 CET 2003 Daniel Veillard + + * error.c: filter warning messages if the global setting blocks them + * xinclude.c xmlreader.c include/libxml/xinclude.h + include/libxml/xmlerror.h: updated the change of namespace at + the XInclude level, raise a warning if the old one is found, + and some cleanup + +Mon Dec 8 13:09:39 CET 2003 Daniel Veillard + + * tree.c: tentative fix for #126117 character reference in + attributes output problem in some cornercase. + +Mon Dec 8 11:08:45 CET 2003 Daniel Veillard + + * python/libxml.py: tried to fix the problems reported in + bug #126735 + * xpath.c SAX2.c error.c parser.c valid.c include/libxml/xmlerror.h: + fixed again some problem trying to use the structured error + handlers, c.f. bug #126735 + * result/VC/ElementValid: tiny change due to the fix + +Sun Dec 7 22:27:31 CET 2003 Daniel Veillard + + * error.c: fixed __xmlRaiseError to use structured error handlers + defined by xmlSetStructuredErrorFunc(), fixes bug #126211 + +Sun Dec 7 20:30:53 CET 2003 Daniel Veillard + + * parser.c: attempt to fix #126211 ... + +Fri Dec 5 17:07:29 CET 2003 Daniel Veillard + + * pattern.c xmlreader.c xmllint.c include/libxml/pattern.h + include/libxml/xmlreader.h: fixed the pattern interfaces + but not yet the parser to handle the namespaces. + * doc/examples/reader3.c doc/*: fixed the example, rebuilt the docs. + +Fri Dec 5 15:49:44 CET 2003 Daniel Veillard + + * globals.c xmlwriter.c doc/apibuild.py include/libxml/globals.h + include/libxml/pattern.h include/libxml/schemasInternals.h + include/libxml/xmlexports.h include/libxml/xmlwriter.h: cleanup + the make rebuild in doc, this include new directive to stop + documentation warnings + * doc/* doc/html/*: rebuilt the docs + * pattern.c xmlreader.c include/libxml/pattern.h + include/libxml/xmlreader.h: adding xmlTextReaderPreservePattern() + to save nodes while scanning the tree with the reader, cleanup + the way element were freed, and xmlTextReaderPreserve() + implementation, the API might change for namespace binding support + when compiling patterns. + * doc/examples/*: added reader3.c exposing the xmlTextReaderPreserve() + +Thu Dec 4 15:10:57 CET 2003 Daniel Veillard + + * python/libxml.py: oops forgot to modify/commit the new code. + +Thu Dec 4 13:29:19 CET 2003 Daniel Veillard + + * python/generator.py python/libxml.c python/libxml_wrap.h: + cleanup the output buffer support to at least get the basic + to work + * python/tests/outbuf.py python/tests/serialize.py: fixes and + cleanup. + * include/libxml/xmlwriter.h: cleanup + +Wed Dec 3 21:38:56 MST 2003 John Fleck + + * include/libxml/xmlversion.h.in + * doc/*: add WITH_TRIO comment so it shows up in the docs, rebuild + docs + +Wed Dec 3 13:10:08 CET 2003 Daniel Veillard + + * config.h.in configure.in xmlregexp.c: fix bug #128401 affecting + regexp quantifiers + +Tue Dec 2 23:29:56 CET 2003 Daniel Veillard + + * pattern.c include/libxml/pattern.h: adding the pattern node + selection code. Inheried in part from libxslt but smaller. + * Makefile.am configure.in include/libxml/xmlversion.h.in: + integrated the pattern module, made it a configure time option + * xmllint.c: added --pattern to test when doing --stream + +Tue Dec 2 11:25:25 CET 2003 Daniel Veillard + + * xmlreader.c: fixed a problem in xmlreader validation when + streaming exposed by reader2 example. + +Mon Dec 1 20:40:51 MST 2003 John Fleck + + * doc/xml.html + * doc/docs.html: + add reference to the Code Examples page to docs.html list + of resources + +Mon Dec 1 12:30:28 CET 2003 Igor Zlatkovic + + * win32/Makefile.bcb win32/configure.js: Applied the BCB patch + from Eric + +Sun Nov 30 21:33:37 MST 2003 John Fleck + + * include/libxml/xinclude.h + * doc/*: Add comments for macro definitions in xinclude.h and + rebuild the docs + +Sun Nov 30 21:06:29 MST 2003 John Fleck + + * doc/docdescr.doc + Updating William's explanation of how to build docs, + reflecting Daniel's new docs build system + +Sat Nov 29 18:38:22 HKT 2003 William Brack + + * xmlmemory.c: enhanced by adding mutex to protect global + structures in a multi-threading environment. This fixed + some random errors on the Threads regression tests. + +Fri Nov 28 21:39:49 MST 2003 John Fleck + + * doc/xml.html doc/python.html: fix tst.py text, which didn't + import sys + +Fri Nov 28 17:28:47 HKT 2003 William Brack + + * encoding.c, include/libxml/encoding.h: Enhanced the handling of + UTF-16, UTF-16LE and UTF-16BE encodings. Now UTF-16 output is + handled internally by default, with proper BOM and UTF-16LE + encoding. Native UTF-16LE and UTF-16BE encoding will not generate + BOM on output, and will be automatically recognized on input. + * test/utf16lebom.xml, test/utf16bebom.xml, result/utf16?ebom*: + added regression tests for above. + +Thu Nov 27 19:25:10 CET 2003 Igor Zlatkovic + + * win32/Makefile.* win32/configure.js: Modified to allow coexistent + build with all compilers. Added C-Runtime option for MSVC. Included + xmlWriter. + * xmlwriter.c: Added IN_LIBXML macro + +Wed Nov 26 21:54:01 CET 2003 Igor Zlatkovic + + * win32/Makefile.bcb: applied patch from Eric + +Wed Nov 26 21:33:14 CET 2003 Daniel Veillard + + * include/libxml/tree.h: stefan on IRC pointed out that XML_GET_LINE + is broken on 2.6.x + +Tue Nov 25 18:39:44 CET 2003 Daniel Veillard + + * entities.c: fixed #127877, never output " in element content + * result/isolat3 result/slashdot16.xml result/noent/isolat3 + result/noent/slashdot16.xml result/valid/REC-xml-19980210.xml + result/valid/index.xml result/valid/xlink.xml: this changes the + output of a few tests + +Tue Nov 25 16:36:21 CET 2003 Daniel Veillard + + * include/libxml/schemasInternals.h include/libxml/xmlerror.h + testSchemas.c xmlschemas.c: added xsd:include support, fixed + testSchemas behaviour when a schemas failed to parse. + * test/schemas/vdv-* result/schemas/vdv-first5_0_0*: added one + test for xsd:include from Eric Van der Vlist + +Tue Nov 25 08:18:12 CET 2003 Daniel Veillard + + * parser.c: swapped the attribute defaulting and attribute checking + parts of parsing a new element start, fixes bug #127772 + * result/valid/127772.* test/valid/127772.xml + test/valid/dtds/127772.dtd: added the example in the regression tests + +Tue Nov 25 08:00:15 CET 2003 Daniel Veillard + + * parser.c: moved xmlCleanupThreads() to the end of xmlCleanupParser() + to avoid bug #127851 + +Mon Nov 24 15:26:21 CET 2003 Daniel Veillard + + * xmlregexp.c: fixing some Negative Character Group and + Character Class Subtraction handling. + +Mon Nov 24 14:01:57 CET 2003 Daniel Veillard + + * xmlregexp.c xmlschemas.c: more XML Schemas fixes based + on Eric van der Vlist examples + * result/schemas/vdv-first4* test/schemas/vdv-first4*: + added regression tests + * doc/examples/Makefile.am doc/examples/index.py: do not + regenerate the index on make all target, but only on + make rebuild to avoid troubles. + +Sat Nov 22 21:35:42 CET 2003 Daniel Veillard + + * xmlschemas.c xmlschemastypes.c include/libxml/xmlerror.h + include/libxml/schemasInternals.h: lot of bug fixes, cleanup, + starting to add proper namespace support too. + * test/schemas/* result/schemas/*: added a number of tests + fixed the result from some regression tests too. + +Fri Nov 21 20:50:59 MST 2003 John Fleck + + * doc/xml.html, docs.html: remove reference to gtk-doc now that + Daniel has removed it, fix link to George's IBM article, other + minor edits + +Fri Nov 21 01:26:00 CET 2003 Daniel Veillard + + * xmlschemas.c: applied patch from Robert Stepanek to start + import os schemas support, cleaned up stuff and the patch. + * test/schemas/import0_0.* result/schemas/import0_0_0*: added test + to regression, fixed a few regressions too. + +Thu Nov 20 22:58:00 CET 2003 Daniel Veillard + + * HTMLparser.c: applied two parsing fixes from James Bursa + +Thu Nov 20 19:20:46 CET 2003 Daniel Veillard + + * doc/examples/*: added two xmlReader examples + * xmlreader.c: cleaned up some bugs in the process + +Thu Nov 20 12:54:30 CET 2003 Daniel Veillard + + * xmlwriter.c include/libxml/xmlwriter.h: applied patch from + Alfred Mickautsch, bugfixes and comments + * doc/examples/*: added his test as the xmlWriter example + * doc/html/ doc/*.html: this resulted in some improvements + * include/libxml/hash.h: fixed an inclusion problem when + wasn't preceeded by + +Wed Nov 19 17:19:35 CET 2003 Daniel Veillard + + * xinclude.c: fix an error message + * doc/examples/*: added tree2 example from Lucas Brasilino + +Wed Nov 19 17:50:47 HKT 2003 William Brack + + * doc/newapi.xsl: improve the sort sequence for page content + * doc/html/*.html: regenerate the web pages + +Wed Nov 19 00:48:56 CET 2003 Daniel Veillard + + * Makefile.am: do not package cvs versioning temp files. + * doc/apibuild.py doc/libxml2-api.xml doc/newapi.xsl: more cleanup, + slightly improved the API xml format, fixed a lot of small + rendering problems + * doc/html/libxml*.html: rebuilt + +Tue Nov 18 21:51:15 CET 2003 Daniel Veillard + + * include/libxml/*.h include/libxml/*.h.in: modified the file + header to add more informations, painful... + * genChRanges.py genUnicode.py: updated to generate said changes + in headers + * doc/apibuild.py: extract headers, add them to libxml2-api.xml + * *.html *.xsl *.xml: updated the stylesheets to flag geprecated + APIs modules. Updated the stylesheets, some cleanups, regenerated + * doc/html/*.html: regenerated added back book1 and libxml-lib.html + +Tue Nov 18 14:43:16 CET 2003 Daniel Veillard + + * doc/Makefile.am doc/*.xsl doc/*.html doc/apibuild.py: cleaned up + the build process to remove all remains from the old gtk-doc + inherited, libxml2-refs.xml is now generated by apibuild.py, the + stylesheets have been improved, and the API*html now generated + are XHTML1 valid too + +Tue Nov 18 14:28:32 HKT 2003 William Brack + + * genChRanges.py, chvalid.c, include/libxml/chvalid.h: minor + enhancement to prevent comment with unreferenced variable. + * threads.c xmlreader.c xmlwriter.c: edited some comments to + improve auto-generation of documentation + * apibuild.py: minor change to an error message + +Mon Nov 17 17:55:51 CET 2003 Daniel Veillard + + * doc/apibuild.py doc/libxml2-api.xml doc/newapi.xsl: more cleanup, + improving navigation + * doc/html/*.html: updated the result + +Mon Nov 17 14:54:38 CET 2003 Daniel Veillard + + * doc/Makefile.am doc/apibuild.py doc/libxml2-api.xml doc/newapi.xsl: + improvement of the stylesheets, fixed a API generation problem, + switched the stylesheet and Makefile to build the HTML output. + * doc/html/*.html: complete update, ditched some old files, might + introduce some breakage... + +Mon Nov 17 12:50:28 CET 2003 Daniel Veillard + + * doc/newapi.xsl: lot of improvements, this starts looking good + enough to be usable. + +Mon Nov 17 00:58:09 CET 2003 Daniel Veillard + + * doc/newapi.xsl: stylesheet to build HTML pages from the + API XML description, Work in Progress + +Sun Nov 16 16:03:24 HKT 2003 William Brack + + * xpath.c: fixed bug 126976 (string != empty nodeset + should be false) + +Sun Nov 16 14:00:08 HKT 2003 William Brack + + * doc/html/*.html: Finally - found the problem with the + page generation (XMLPUBFUN not recognized by gtkdoc). + Re-created the pages using a temporary version of + include/libxml/*.h. + * testOOMlib.c,include/libxml/encoding.h, + include/libxml/schemasInternals.h,include/libxml/valid.h, + include/libxml/xlink.h,include/libxml/xmlwin32version.h, + include/libxml/xmlwin32version.h.in, + include/libxml/xpathInternals.h: minor edit of comments + to help automatic documentation generation + * doc/docdescr.doc: small elaboration + * doc/examples/test1.c,doc/examples/Makefile.am: re-commit + (messed up on last try) + * xmlreader.c: minor change to clear warning. + +Sat Nov 15 19:20:32 CET 2003 Daniel Veillard + + * Copyright: fixed some wording + * libxml.spec.in: make sure doc/examples is packaged + * include/libxml/tree.h valid.c xmlreader.c: fixed the really + annoying problem about xmlRemoveID and xmlReader streaming. + Thing looks fixed now, had to add a doc reference to the + xmlID structure though... + +Sat Nov 15 09:53:36 MST 2003 John Fleck + + * doc/docdescr.doc: added description of man page building + +Sat Nov 15 19:08:22 HKT 2003 William Brack + + * doc/html/libxml-chvalid.html, doc/html/libxml-dict.html, + doc/html/libxml-list.html, doc/html/libxml-testOOMlib.html, + doc/html/libxml-wincecompat, doc/html/winsockcompat.html, + doc/html/libxml-xmlexports.html, doc/html/libxml-xmlversion.html, + doc/html/libxml-xmlwin32version.html, doc/html/libxml-xmlwriter.html: + added missing pages for the website. + +Sat Nov 15 18:23:48 HKT 2003 William Brack + + * doc/Makefile.am doc/*.html doc/html/*.html: rebuilt the + generated pages (again), manually restored doc/html/index.html + and manually edited generated file doc/gnome-xml.xml to put + in appropriate headings. + * doc/docdescr.doc: new file to describe details of the + document generation (helps my memory for the next time) + * genChRanges.py,chvalid.c,include/libxml/chvalid.h: minor + enhancement to please the automatic documentation generation. + +Fri Nov 14 23:47:31 HKT 2003 William Brack + + * catalog.c,relaxng.c,testAutomata.c,xpointer.c,genChRanges.py, + chvalid.c,include/libxml/chvalid.h,doc/examples/test1.c: + minor error cleanup for gcc-3.3.[12] compilation warnings. + +Fri Nov 14 15:08:13 HKT 2003 William Brack + + * tree.c: minor changes to some comments + * doc/*.html: rebuilt the generated HTML pages for changes + from jfleck (bug 126945) + +Thu Nov 13 12:44:14 CET 2003 Daniel Veillard + + * doc/examples/*: added Dodji's example, added output handling + +Thu Nov 13 11:35:35 CET 2003 Daniel Veillard + + * doc/examples/*: added Aleksey XPath example, fixed bugs + in the indexer + +Wed Nov 12 23:48:26 CET 2003 Daniel Veillard + + * doc/*: integrating the examples in the navigation menus + * doc/examples/*: added make tests, updated the navigation, + added a new test, cleanups, updates. + +Wed Nov 12 17:50:36 CET 2003 Daniel Veillard + + * doc/*.html: rebuilt the generated HTML pages + * doc/examples/*: updated the stylesheets, added a synopsis, + Makefile.am is now generated by index.py + +Wed Nov 12 01:38:16 CET 2003 Daniel Veillard + + * doc/site.xsl doc/examples/Makefile.am doc/examples/index.html: + added autogeneration of a web page for the examples + * doc/examples/example1.c doc/examples/.cvsignore + doc/examples/examples.xml doc/examples/index.py: updated the + informations extracted, improved the format and indexing. + +Tue Nov 11 22:08:59 CET 2003 Daniel Veillard + + * check-xinclude-test-suite.py: less verbose on difference + * libxml.spec.in: cleanup + * parser.c: fixed xmlCleanupParser() doc + * doc/Makefile.am doc/apibuild.py doc/libxml2-api.xml + doc/examples/Makefile.am doc/examples/example1.c + doc/examples/examples.xml doc/examples/index.py + doc/examples/test1.xml: work on adding C examples and + generating automated information about those. examples.xml + is autogenerated describing the examples. + * example/Makefile.am: cleanup + +Mon Nov 10 23:47:03 HKT 2003 William Brack + + * genUnicode.py, xmlunicode.c, include/libxml/xmlunicode.h: + fixed missing '-' in block names, enhanced the hack for + ABI aliasing. + +Sun Nov 9 20:28:21 HKT 2003 William Brack + + * genUnicode.py, xmlunicode.c, include/libxml/xmlunicode.h, + python/libxml2class.txt: enhanced for range checking, + updated to Unicode version 4.0.1 (API docs also updated) + * python/generator.py: minor change to fix a warning + +Wed Nov 5 23:46:36 CET 2003 Daniel Veillard + + * Makefile.am: apply fix from Karl Eichwalder for script path + +Wed Nov 5 10:49:20 CET 2003 Daniel Veillard + + * win32/configure.js: applied patch from Mark Vakoc to simplify + his work from CVS checkouts. + +Tue Nov 4 21:16:47 MST 2003 John Fleck + + * doc/xmlreader.html: minor cleanups + +Tue Nov 4 15:52:28 PST 2003 William Brack + + * include/libxml/xmlversion.h.in: changed macro ATTRIBUTE_UNUSED + for gcc so that, if undefined, it's defined as + __attribute__((unused)) + +Tue Nov 4 15:28:07 PST 2003 William Brack + + * python/generator.py: small enhancement to assure ATTRIBUTE_UNUSED + appears after the variable declaration. + * valid.c: trivial change to eliminate a warning message + +Tue Nov 4 11:24:04 CET 2003 Daniel Veillard + + * configure.in NEWS doc/*: preparing release 2.6.2, updated and + rebuilt the docs + +Tue Nov 4 09:38:46 CET 2003 Daniel Veillard + + * xmllint.c: change --html to make sure we use the HTML serialization + rule by default when HTML parser is used, add --xmlout to allow to + force the XML serializer on HTML. + * HTMLtree.c: ugly tweak to fix the output on

element and + solve #125093 + * result/HTML/*: this changes the output of some tests + +Mon Nov 3 17:51:28 CET 2003 Daniel Veillard + + * xinclude.c: fixed bug #125812, about XPointer in XInclude + failing but not returning an error. + +Mon Nov 3 17:18:22 CET 2003 Daniel Veillard + + * valid.c: fixed bug #125811 related to DTD post validation + where the DTD doesn't pertain to a document. + +Mon Nov 3 15:25:58 CET 2003 Daniel Veillard + + * parser.c xmlIO.c include/libxml/parserInternals.h: implemented + the XML_PARSE_NONET parser option. + * xmllint.c: converted xmllint.c to use the option instead of + relying on the global resolver variable. + +Mon Nov 3 13:26:32 CET 2003 Daniel Veillard + + * xinclude.c xmlreader.c include/libxml/xinclude.h: adding XInclude + support to the reader interface. Lot of testing of the walker, + various bug fixes. + * xmllint.c: added --walker and made sure --xinclude --stream --debug + works as expected + * Makefile.am result/dtd11.rdr result/ent6.rdr test/dtd11 test/ent6 + result/XInclude/*.rdr: added regression tests for the walker and + XInclude xmlReader support, had to slightly change a couple of tests + because the walker can't distinguish from + +Sat Nov 1 17:42:27 CET 2003 Daniel Veillard + + * tree.c nanohttp.c threads.c: second BeOS patch from + Marcin 'Shard' Konicki + +Fri Oct 31 15:35:20 CET 2003 Daniel Veillard + + * parser.c: always generate line numbers + +Fri Oct 31 11:53:46 CET 2003 Daniel Veillard + + * parser.c: fixed another regression introduced in fixing #125823 + +Fri Oct 31 11:33:18 CET 2003 Daniel Veillard + + * python/libxml.c: previous fix for #124044 was broken, correct + fix provided. + * HTMLparser.c parser.c parserInternals.c xmlIO.c: fix xmlStopParser() + and the error handlers to address #125877 + +Thu Oct 30 23:10:46 CET 2003 Daniel Veillard + + * parser.c: side effect of #123105 patch, namespace resolution + would fail when defined in internal entities, fixes #125823 + +Thu Oct 30 14:10:42 CET 2003 Daniel Veillard + + * python/libxml.c: be more defensive in the xmlReader python bindings + fixing bug #124044 + +Thu Oct 30 11:14:31 CET 2003 Daniel Veillard + + * valid.c: the a-posteriori DTD validation code was not validating + the namespace declarations, this fixes #124110 + +Wed Oct 29 14:13:03 PDT 2003 William Brack + + * xmlIO.c: enhanced to bypass compression detection code + when input file is stdin (bug 125801) + +Wed Oct 29 18:21:00 CET 2003 Daniel Veillard + + * xmlIO.c: fix needed when HTTP is not compiled in by Mark Vakoc + +Wed Oct 29 18:05:53 CET 2003 Daniel Veillard + + * xpath.c: more fixes about unregistering objects + * include/libxml/relaxng.h: applied patch from Mark Vakoc + missing _cplusplus processing clause + +Wed Oct 29 07:49:52 2003 Aleksey Sanin + + * include/libxml/parser.h parser.c: added xmlStrVPrintf function + +Wed Oct 29 14:37:40 CET 2003 Daniel Veillard + + * nanoftp.c nanohttp.c testThreads.c threads.c: applied patch from + Marcin 'Shard' Konicki to provide BeOS thread support. + +Wed Oct 29 14:20:14 CET 2003 Daniel Veillard + + * xmlschemas.c include/libxml/xmlschemas.h: applied patch + from Steve Ball to make a schema parser from a preparsed document. + +Wed Oct 29 13:52:25 CET 2003 Daniel Veillard + + * tree.c: applied a couple of patches from Mark Lilback about text + nodes coalescing + +Wed Oct 29 12:16:52 CET 2003 Daniel Veillard + + * xpath.c: change suggested by Anthony Carrico when unregistering + a namespace prefix to a context + * hash.c: be more careful about calling callbacks with NULL payloads. + +Wed Oct 29 00:04:26 CET 2003 Daniel Veillard + + * configure.in NEWS doc/*: preparing release 2.6.1, updated and + regenerated docs and APIs + * parser.c: cleanup and last change to fix #123105 + +Tue Oct 28 23:02:29 CET 2003 Daniel Veillard + + * HTMLparser.c: Fix #124907 by simply backporting the same + fix as for the XML parser + * result/HTML/doc3.htm.err: change to ID detecting modified one + test result. + +Tue Oct 28 22:28:50 CET 2003 Daniel Veillard + + * parser.c include/libxml/parser.h: included a new function + to reuse a Push parser context, based on Graham Bennett original + code + * valid.c: in HTML, a name in an input is not an ID + * TODO: bug list update + +Tue Oct 28 19:54:37 CET 2003 Daniel Veillard + + * xpath.c: applied patch from nico@xtradyne.com for #125030 + +Tue Oct 28 16:42:16 CET 2003 Daniel Veillard + + * Makefile.am: cleanup + * error.c valid.c include/libxml/xmlerror.h: fixing bug #125653 + sometimes the error handlers can get a parser context on DTD + errors, and sometime they don't. So be very careful when trying + to grab those informations. + +Tue Oct 28 15:26:18 CET 2003 Daniel Veillard + + * tree.c: applied patch from Kasimier Buchcik which fixes a + problem in xmlSearchNs introduced in 2.6.0 + +Tue Oct 28 14:57:03 CET 2003 Daniel Veillard + + * parser.c: fixed #123263, the encoding is mandatory in a textdecl. + +Tue Oct 28 13:48:52 CET 2003 Daniel Veillard + + * tree.c: fix bug #125047 about serializing when finding a + document fragment node. + +Mon Oct 27 11:11:29 EST 2003 Daniel Veillard + + * testSAX.c: fix bug #125592 need a NULL check + * include/libxml/chvalid.h: rename a parameter + +Mon Oct 27 09:43:48 EST 2003 Daniel Veillard + + * parser.c: applied patch from #123105 about defaulted attributes + from element coming from an entity + +Mon Oct 27 21:12:27 HKT 2003 William Brack + + * xmllint.c: fixed warning message from IRIX (bug 125182) + * python/libxml.py: removed tabs, replaced with spaces + (bug 125572) + +Mon Oct 27 06:17:30 EST 2003 Daniel Veillard + + * libxml.h parserInternals.c xmlIO.c: make sure we report errors + if xmlNewInputFromFile() fails. + * xmlreader.c: avoid using _private for the node or document + elements. + +Sat Oct 25 17:33:59 CEST 2003 Igor Zlatkovic + + * win32/configure.js: added declaration for verMicroSuffix + +Fri Oct 24 23:08:17 CEST 2003 Daniel Veillard + + * libxml.m4: applied patch from Patrick Welche provided in + bug #125432 , future proofing the .m4 file. + * parser.c: resetting the context should also reset the error + * TODO: problem of conformance w.r.t. E20 was raised in the + XML Core telconf and libxml2 isn't conformant there. + +Wed Oct 22 14:33:05 CEST 2003 Daniel Veillard + + * xmlwriter.c: applied patch from Alfred Mickautsch fixing #125180 + +Wed Oct 22 10:50:31 CEST 2003 Daniel Veillard + + * chvalid.c genChRanges.py: Stephane Bidoul pointed out another + small glitch missing a const + +Wed Oct 22 10:43:21 CEST 2003 Daniel Veillard + + * chvalid.c genChRanges.py: Stephane Bidoul pointed out that + it doesn't define IN_LIBXML + +Tue Oct 21 21:14:55 CEST 2003 Daniel Veillard + + * win32/Makefile.mingw: typo pointed out by Stephane Bidoul + +Tue Oct 21 11:26:36 CEST 2003 Daniel Veillard + + * win32/Makefile.bcb win32/Makefile.mingw win32/Makefile.msvc + win32/configure.js: set of Win32 patches for 2.6.0 by Joachim Bauch + +Tue Oct 21 02:07:22 CEST 2003 Daniel Veillard + + * tree.c: last minute patch from Eric Zurcher making it into 2.6.0 + +Tue Oct 21 02:03:03 CEST 2003 Daniel Veillard + + * configure.in NEWS doc/libxml2.xsa: preparing libxml2-2.6.0 + * doc/*: updated and regenerated the docs and API + +Tue Oct 21 01:01:55 CEST 2003 Daniel Veillard + + * SAX2.c error.c tree.c: moved the line number to their proper + field in elements now. + +Tue Oct 21 00:28:20 CEST 2003 Daniel Veillard + + * configure.in xmlwriter.c Makefile.am include/libxml/xmlwriter.h + include/libxml/Makefile.am include/libxml/xmlversion.h.in: + added the xmlWriter module contributed by Alfred Mickautsch + * include/libxml/tree.h: added room for line and extra information + * xmlreader.c python/tests/reader6.py: bugfixing some problem some + of them introduced in September + * win32/libxml2.def.src doc/libxml2-api.xml: regenerated the API + +Mon Oct 20 19:02:53 CEST 2003 Daniel Veillard + + * Makefile.am configure.in xmldwalk.c xmlreader.c + include/libxml/Makefile.am include/libxml/xmldwalk.h + include/libxml/xmlversion.h.in: removing xmldwalk module + since it got merged with the xmlreader. + * parser.c: cleanup + * win32/libxml2.def.src python/libxml2class.txt doc/libxml2-api.xml: + rebuilt the API + * python/tests/Makefile.am python/tests/reader7.py + python/tests/walker.py: adding regression testing for the + new xmlreader APIs, new APIs for reader creation, including + makeing reader "walker" operating on preparsed document trees. + +Sun Oct 20 22:37:03 HKT 2003 William Brack + + * entities.c, valid.c: fixed problem reported on the mailing + list by Melvyn Sopacua - wrong argument order on functions + called through xmlHashScan. + +Sun Oct 19 23:57:45 CEST 2003 Daniel Veillard + + * valid.c xmlIO.c: fixes for compiling using --with-minimum + +Sun Oct 19 23:46:04 CEST 2003 Daniel Veillard + + * tree.c: cleanup xmlNodeGetContent() reusing xmlNodeBufGetContent(), + tested it through the xslt regression suite. + +Sun Oct 19 22:42:16 CEST 2003 Daniel Veillard + + * tree.c include/libxml/tree.h: adding xmlNodeBufGetContent() + allowing to grab the content without forcing allocations. + * python/libxml2class.txt doc/libxml2-api.xml: rebuilt the API + * xpath.c xmldwalk.c: removed a couple of comment errors. + +Sun Oct 19 16:39:36 CEST 2003 Daniel Veillard + + * parser.c: applied patch from Chris Anderson to change back + memcmp with CMPx() + +Sun Oct 19 16:24:19 CEST 2003 Daniel Veillard + + * HTMLparser.c: fixed to not send NULL to %s printing + * python/tests/error.py result/HTML/doc3.htm.err + result/HTML/test3.html.err result/HTML/wired.html.err + result/valid/t8.xml.err result/valid/t8a.xml.err: cleaning + up some of the regression tests error + +Sun Oct 19 15:31:43 CEST 2003 Daniel Veillard + + * include/libxml/nanohttp.h include/libxml/parserInternals.h + include/libxml/xmlIO.h nanohttp.c parserInternals.c xmlIO.c: + Fixed the HTTP<->parser interraction, which should fix 2 long + standing bugs #104790 and #124054 , this also fix the fact that + HTTP error code (> 400) should not generate data, we usually + don't want to parse the HTML error information instead of the + resource looked at. + +Sun Oct 19 19:20:48 HKT 2003 William Brack + + * doc/Makefile.am: enhanced the installation of tutorial files + to avoid installing CVS subdirectories (bug 122943) + +Sun Oct 19 17:33:27 HKT 2003 William Brack + + * xmlIO.c: fixed segfault when input file not present + * tree.c: changed output formatting of XML_CDATA_SECTION + (bug 120917) + +Sun Oct 19 00:15:38 HKT 2003 William Brack + + * include/libxml/parserInternals.h HTMLparser.c HTMLtree.c + SAX2.c catalog.c debugXML.c entities.c parser.c relaxng.c + testSAX.c tree.c valid.c xmlschemas.c xmlschemastypes.c + xpath.c: Changed all (?) occurences where validation macros + (IS_xxx) had single-byte arguments to use IS_xxx_CH instead + (e.g. IS_BLANK changed to IS_BLANK_CH). This gets rid of + many warning messages on certain platforms, and also high- + lights places in the library which may need to be enhanced + for proper UTF8 handling. + +Sat Oct 18 20:34:18 HKT 2003 William Brack + + * genChRanges.py, chvalid.c, include/libxml/chvalid.h, + doc/apibuild.py: enhanced to include enough comments to + make the api doc generation happy. + +Sat Oct 18 07:28:25 EDT 2003 Daniel Veillard + + * nanohttp.c xmlIO.c include/libxml/nanohttp.h: starting work + to fix the HTTP/XML parser integration. + +Sat Oct 18 11:04:32 CEST 2003 Daniel Veillard + + * xmlreader.c include/libxml/xmlreader.h: added new APIs + for creating reader from sources or reusing a reader with + a new source, like the xmlReadxx and xmlCtxtReadxxx + * win32/libxml2.def.src doc/libxml2-api.xml doc/apibuild.py + doc/Makefile.am: regenerated the APIs + * doc/xml.html: applied a patch from Stefan Kost for namesapce docs + +Sat Oct 18 12:46:02 HKT 2003 William Brack + + * genChRanges.py, chvalid.c, include/libxml/chvalid.h, + include/libxml/parserInternals.h: enhanced macros to avoid + breaking ABI from previous versions. + * catalog.c, parser.c, tree.c: modified to use IS_* macros + defined in parserInternals.h. Makes maintenance much easier. + * testHTML.c, testSAX.c, python/libxml.c: minor fixes to avoid + compilation warnings + * configuration.in: fixed pushHTML test error; enhanced for + better devel (me) testing + +Fri Oct 17 14:38:54 CEST 2003 Daniel Veillard + + * legacy.c: remove the warning for startDocument(), as it is used by + glade (or glade-python) + * parser.c relaxng.c xmlschemastypes.c: fixed an assorted set of + invalid accesses found by running some Python based regression + tests under valgrind. There is still a few leaks reported by the + relaxng regressions which need some attention. + * doc/Makefile.am: fixed a make install problem c.f. #124539 + * include/libxml/parserInternals.h: addition of xmlParserMaxDepth + patch from crutcher + +Wed Oct 15 12:47:33 CEST 2003 Daniel Veillard + + * parser.c: Marc Liyanage pointed out that xmlCleanupParser() + was missing xmlCleanupInputCallbacks and xmlCleanupOutputCallbacks + calls. + +Wed Oct 15 10:16:47 CEST 2003 Daniel Veillard + + * vms/build_libxml.com trionan.c: VMS patch from Craig A. Berry + +Mon Oct 13 21:46:25 CEST 2003 Daniel Veillard + + * Makefile.am: small fix from Bjorn Reese + +Mon Oct 13 15:59:25 CEST 2003 Daniel Veillard + + * valid.c: fix a call missing arguments + +Sun Oct 12 18:42:18 HKT 2003 William Brack + + * genChRanges.py, chvalid.c, include/libxml/chvalid.h: fixed + a bug in the range search; enhanced range generation (inline code + if a small number of intervals); enhanced the readability of the + output files. + +Sun Oct 12 00:52:14 CEST 2003 Daniel Veillard + + * chvalid.def chvalid.c include/libxml/chvalid.h: rebuilt + chvalid.def from scratch based on XML 2nd edition REC + and regenerated the code. + +Sat Oct 11 22:54:13 CEST 2003 Daniel Veillard + + * check-xml-test-suite.py: removed some annoying warnings + * chvalid.def chvalid.c include/libxml/chvalid.h: fixed a bug + in the PubidChars definition, regenerated, there is still + a bug left somewhere + * genChRanges.py: save the header directly in include/libxml/ + * configure.in: I generated a 2.6.0beta6 earlier today + +Sat Oct 11 23:32:47 HKT 2003 William Brack + + * fixed small error on previous commit (chvalid.h in + base dir instead of include directory) + +Sat Oct 11 23:11:22 HKT 2003 William Brack + + * genChRange.py, chvalid.def, chvalid.c, include/libxml/chvalid.h: + new files for a different method for doing range validation + of character data. + * Makefile.am, parserInternals.c, include/libxml/Makefile.am, + include/libxml/parserInternals.h: modified for new range method. + * catalog.c: small enhance for warning message (using one + of the new range routines) + +Sat Oct 11 13:24:57 CEST 2003 Daniel Veillard + + * valid.c include/libxml/valid.h: adding an serror field to + the validation context breaks the ABI for the xmlParserCtxt + structure since it's embedded by content and not by reference + +Sat Oct 11 12:46:49 CEST 2003 Daniel Veillard + + * configure.in: patch from Mike Hommey + * threads.c: applied Windows patch from Jesse Pelton and Stephane + Bidoul + * parser.c: fix the potentially nasty access to ctxt->serror + without checking first that the SAX block is version 2 + +Fri Oct 10 21:34:01 CEST 2003 Daniel Veillard + + * SAX2.c: fixed a nasty bug with interning some text strings + * configure.in: prepare for beta5 of 2.6.0 + * libxml.h nanoftp.c nanohttp.c xmlIO.c include/libxml/xmlerror.h: + better error handling for I/O and converted FTP and HTTP + * parser.c: fixed another bug + +Fri Oct 10 16:45:20 CEST 2003 Daniel Veillard + + * SAX2.c: fixed uninitialized new field. + * result/VC/OneID2 result/relaxng/*.err: fixed a typo updating + all messages + +Fri Oct 10 16:19:17 CEST 2003 Daniel Veillard + + * include/libxml/tree.h: make room in Doc, Element, Attributes + for PSVI type informations. + +Fri Oct 10 16:08:02 CEST 2003 Daniel Veillard + + * HTMLparser.c c14n.c catalog.c error.c globals.c parser.c + parserInternals.c relaxng.c valid.c xinclude.c xmlIO.c xmlregexp.c + xmlschemas.c xpath.c xpointer.c include/libxml/globals.h + include/libxml/parser.h include/libxml/valid.h + include/libxml/xmlerror.h: Setting up the framework for structured + error reporting, touches a lot of modules, but little code now + the error handling trail has been cleaned up. + +Fri Oct 10 14:29:42 CEST 2003 Daniel Veillard + + * c14n.c include/libxml/xmlerror.h: converted the C14N module too + +Fri Oct 10 13:40:51 CEST 2003 Daniel Veillard + + * xpath.c: cleanup + * xpointer.c include/libxml/xmlerror.h: migrated XPointer module + to the new error mechanism + +Fri Oct 10 12:49:53 CEST 2003 Daniel Veillard + + * error.c xmlschemas.c: a bit of cleanup + * result/schemas/*.err: updated with the new result strings + +Fri Oct 10 03:58:39 PDT 2003 William Brack + + * xpath.c: fixed bug 124061 + +Fri Oct 10 02:47:22 CEST 2003 Daniel Veillard + + * Makefile.am: cleanup + * encoding.c: fix a funny typo + * error.c xmlschemas.c xmlschemastypes.c include/libxml/xmlerror.h: + converted the Schemas code to the new error handling. PITA, + still need to check output from regression tests. + +Thu Oct 9 15:13:53 CEST 2003 Daniel Veillard + + * HTMLtree.c include/libxml/xmlerror.h: converted too + * tree.c: small cleanup + +Thu Oct 9 13:44:57 CEST 2003 Daniel Veillard + + * xinclude.c: comment fix + * catalog.c include/libxml/xmlerror.h: migrating the catalog code + to the new infrastructure + +Thu Oct 9 00:36:03 CEST 2003 Daniel Veillard + + * xmlIO.c: final error handling cleanup + * xinclude.c error.c: converted XInclude to the new error handling + * include/libxml/xmlerror.h: added XInclude errors + +Wed Oct 8 23:31:23 CEST 2003 Daniel Veillard + + * parser.c: bug in compression saving was crashing galeon + reported by teuf + +Wed Oct 8 21:18:12 CEST 2003 Daniel Veillard + + * error.c tree.c xmlIO.c xmllint.c: more cleanup through the + I/O error path + +Wed Oct 8 20:57:27 CEST 2003 Daniel Veillard + + * xmlIO.c: better handling of error cases + +Wed Oct 8 13:51:14 CEST 2003 Daniel Veillard + + * xmlIO.c xmllint.c include/libxml/xmlerror.h: first pass at + cleaning up error handling in the I/O module. + +Wed Oct 8 10:52:05 CEST 2003 Daniel Veillard + + * xmlregexp.c include/libxml/xmlerror.h: error handling + cleanup of the Regexp module. + +Wed Oct 8 01:09:05 CEST 2003 Daniel Veillard + + * tree.c: converting the tree module too + * error.c include/libxml/xmlerror.h: created a simpler internal + error reporting function. + +Tue Oct 7 23:19:39 CEST 2003 Daniel Veillard + + * error.c include/libxml/xmlerror.h include/libxml/xpath.h + include/libxml/xpathInternals.h xpath.c: cleaning up XPath + error reporting that time. + * threads.c: applied the two patches for TLS threads + on Windows from Jesse Pelton + * parser.c: tiny safety patch for xmlStrPrintf() make sure the + return is always zero terminated. Should also help detecting + passing wrong buffer size easilly. + * result/VC/* result/valid/rss.xml.err result/valid/xlink.xml.err: + updated the results to follow the errors string generated by + last commit. + +Tue Oct 7 14:16:45 CEST 2003 Daniel Veillard + + * relaxng.c include/libxml/xmlerror.h: last cleanup of error + handling in the Relax-NG module. + +Tue Oct 7 13:30:39 CEST 2003 Daniel Veillard + + * error.c relaxng.c include/libxml/xmlerror.h: switched Relax-NG + module to teh new error reporting. Better default report, adds + the element associated if found, context and node are included + in the xmlError + * python/tests/reader2.py: the error messages changed. + * result/relaxng/*: error message changed too. + +Mon Oct 6 10:46:35 CEST 2003 Daniel Veillard + + * win32/Makefile.bcb win32/Makefile.mingw win32/Makefile.msvc + win32/configure.js: applied patch from Stéphane Bidoul to + fix the compilation of 2.6.0 code on Win32 + +Mon Oct 6 10:16:30 CEST 2003 Daniel Veillard + + * check-xml-test-suite.py: fixing the script + * parser.c: replace sequences of RAW && NXT(.) == '.' with + memcmp calls, seems to not break conformance, slightly inflate + the size of the gcc generated code though. + +Sun Oct 5 23:30:48 CEST 2003 Daniel Veillard + + * parserInternals.c parser.c valid.c include/libxml/parserInternals.h: + more cleanup of error handling in parserInternals, sharing the + routine for memory errors. + +Sun Oct 5 15:49:14 CEST 2003 Daniel Veillard + + * HTMLparser.c Makefile.am legacy.c parser.c parserInternals.c + include/libxml/xmlerror.h: more code cleanup, especially around + error messages, the HTML parser has now been upgraded to the new + handling. + * result/HTML/*: a few changes in the resulting error messages + +Sat Oct 4 23:06:41 CEST 2003 Daniel Veillard + + * parser.c include/libxml/xmlerror.h: more error/warning + handling cleanups, the XML parser module should be okay now. + +Sat Oct 4 01:58:27 CEST 2003 Daniel Veillard + + * Makefile.am configure.in xmldwalk.c include/libxml/Makefile.am + include/libxml/xmldwalk.h include/libxml/xmlversion.h.in: + integrated the xmlDocWalker API given by Alfred Mickautsch, + and providing an xmlReader like API but working on a xmlDocPtr. + +Sat Oct 4 00:18:29 CEST 2003 Daniel Veillard + + * Makefile.am: more cleanup in make tests + * error.c valid.c parser.c include/libxml/xmlerror.h: more work + in the transition to the new error reporting strategy. + * python/tests/reader2.py result/VC/* result/valid/*: + few changes in the strings generated by the validation output + +Fri Oct 3 00:19:02 CEST 2003 Daniel Veillard + + * Makefile.am: changed 'make tests' to use a concise output, + scrolling to see where thing broke wasn't pleasant + * configure.in: some beta4 preparation, but not ready yet + * error.c globals.c include/libxml/globals.h include/libxml/xmlerror.h: + new error handling code, last error informations are stored + in the parsing context or a global variable, new APIs to + handle the xmlErrorPtr type. + * parser.c parserInternals.c valid.c : started migrating to the + new error handling code, it's a royal pain. + * include/libxml/parser.h include/libxml/parserInternals.h: + moved the definition of xmlNewParserCtxt() + * parser.c: small potential buffer access problem in push code + provided by Justin Fletcher + * result/*.sax result/VC/PENesting* result/namespaces/* + result/valid/*.err: some error messages were sligthly changed. + +Thu Oct 2 13:01:13 2003 Aleksey Sanin + + * include/libxml/parser.h parser.c: introduced xmlStrPrintf + function (wrapper around snprintf) + +Wed Oct 1 21:12:06 CEST 2003 Daniel Veillard + + * entities.c: Fix error on output of high codepoint charref like + 􏿿 , reported by Eric Hanchrow + +Wed Oct 1 14:20:10 CEST 2003 Daniel Veillard + + * DOCBparser.c include/libxml/DOCBparser.h: let's see how much + of a pain murrayc is really gonna be. + +Wed Oct 1 11:03:40 CEST 2003 Daniel Veillard + + * xmlreader.c: Applied fix for bug #123481 reported by Peter Derr + +Tue Sep 30 15:34:31 CEST 2003 Daniel Veillard + + * entities.c legacy.c parser.c: made the predefined entities + static predefined structures to avoid the work, memory and + hazards associated to initialization/cleanup. + +Tue Sep 30 14:30:47 CEST 2003 Daniel Veillard + + * HTMLparser.c Makefile.am configure.in legacy.c parser.c + parserInternals.c testHTML.c xmllint.c include/libxml/HTMLparser.h + include/libxml/parser.h include/libxml/parserInternals.h + include/libxml/xmlversion.h.in: added a new configure + option --with-push, some cleanups, chased code size anomalies. + Now a library configured --with-minimum is around 150KB, + sounds good enough. + +Tue Sep 30 12:31:00 AEST 2003 Malcolm Tredinnick + + * libxml-2.0-uninstalled.pc.in: New file for building against + uninstalled libxml2 builds. + * configure.in, Makefile.am: Support the *-uninstalled.pc file. + * .cvsignore: Ignore the new generated *.pc file. + +Tue Sep 30 02:38:16 CEST 2003 Daniel Veillard + + * Makefile.am SAX.c SAX2.c configure.in globals.c parser.c + parserInternals.c testReader.c testSAX.c xmlIO.c xmllint.c + xmlreader.c example/gjobread.c include/libxml/xmlversion.h.in: + added 2 new configure option: --with-reader --with-sax1 + to allow removing the reader or non-xmlReadxxx() interfaces. + +Mon Sep 29 19:58:26 CEST 2003 Daniel Veillard + + * configure.in entities.c tree.c valid.c xmllint.c + include/libxml/tree.h include/libxml/xmlversion.h.in: + Adding a configure option to remove tree manipulation + code which is not strictly needed by the parser. + +Mon Sep 29 15:23:41 CEST 2003 Daniel Veillard + + * nanoftp.c nanohttp.c: last finishing touch to the BeOS + patch from Marcin 'Shard' Konicki + +Mon Sep 29 15:15:08 CEST 2003 Daniel Veillard + + * HTMLtree.c SAX2.c c14n.c catalog.c configure.in debugXML.c + encoding.c entities.c nanoftp.c nanohttp.c parser.c relaxng.c + testAutomata.c testC14N.c testHTML.c testRegexp.c testRelax.c + testSchemas.c testXPath.c threads.c tree.c valid.c xmlIO.c + xmlcatalog.c xmllint.c xmlmemory.c xmlreader.c xmlschemas.c + example/gjobread.c include/libxml/HTMLtree.h include/libxml/c14n.h + include/libxml/catalog.h include/libxml/debugXML.h + include/libxml/entities.h include/libxml/nanohttp.h + include/libxml/relaxng.h include/libxml/tree.h + include/libxml/valid.h include/libxml/xmlIO.h + include/libxml/xmlschemas.h include/libxml/xmlversion.h.in + include/libxml/xpathInternals.h python/libxml.c: + Okay this is scary but it is just adding a configure option + to disable output, this touches most of the files. + +Mon Sep 29 12:53:56 CEST 2003 Daniel Veillard + + * xmlmemory.c: better fix, avoids breaking the python bindings + +Mon Sep 29 11:21:33 CEST 2003 Daniel Veillard + + * xmlmemory.c: fix a compilation problem when configuring + with debug but without mem-debug + +Sun Sep 28 20:53:17 CEST 2003 Daniel Veillard + + * Makefile.am: cleanup, creating a new legacy.c module, + made sure make tests ran in reduced conditions + * SAX.c SAX2.c configure.in entities.c globals.c parser.c + parserInternals.c tree.c valid.c xlink.c xmlIO.c xmlcatalog.c + xmlmemory.c xpath.c xmlmemory.c include/libxml/xmlversion.h.in: + increased the modularization, allow to configure out + validation code and legacy code, added a configuration + option --with-minimum compiling only the mandatory code + which then shrink to 200KB. + +Sun Sep 28 02:15:07 CEST 2003 Daniel Veillard + + * parser.c: fix a bug raised by the Mips compiler. + * include/libxml/SAX.h include/libxml/parser.h: move the + SAXv1 block definitions to parser.h fixes bug #123380 + * xmlreader.c include/libxml/xmlreader.h: reinstanciate + the attribute and element pool borken 2 commits ago. + Start playing with an entry point to preserve a subtree. + * entities.c: remove a warning. + +Sat Sep 27 12:19:38 PDT 2003 William Brack + + * encoding.c, parser.c, relaxng.c: further (final?) minor + changes for compilation warnings. No change to logic. + +Fri Sep 26 18:03:42 PDT 2003 William Brack + + * parser.c: fixed small problem with missing entities (test/ent2) + +Sat Sep 27 01:25:39 CEST 2003 Daniel Veillard + + * parser.c: William's change allowed to spot a nasty bug in xmlDoRead + if the result is not well formed that ctxt->myDoc is not NULL + and uses the context dictionnary. + +Fri Sep 26 21:09:34 CEST 2003 Daniel Veillard + + * parser.c: other patches from William Brack to avoid + compilation warnings on AIX. + +Fri Sep 26 11:03:08 PDT 2003 William Brack + + * HTMLparser.c, entities.c, xmlreader.c: minor change to + avoid compilation warnings on some (e.g. AIX) systems + +Fri Sep 26 16:49:25 CEST 2003 Daniel Veillard + + * parserInternals.c: fixed a backward compatibility problem + when formatting "deprecated SAXv1 function ignorableWhitespace" + could be reproduced by xmllint --format + +Fri Sep 26 15:50:44 CEST 2003 Daniel Veillard + + * doc/libxml2-api.xml: rebuilt the API + * xmllint.c doc/xmllint.1 doc/xmllint.xml: added the new options + --nocdata and --nsclean to remove CDATA section and surperfluous + namespace declarations + * parser.c SAX2.c: implementation of the 2 new options + +Fri Sep 26 14:41:53 CEST 2003 Daniel Veillard + + * HTMLparser.c testHTML.c xmllint.c include/libxml/HTMLparser.h: + added the same htmlRead APIs than their XML counterparts + * include/libxml/parser.h: new parser options, not yet implemented, + added an options field to the context. + * tree.c: patch from Shaun McCance to fix bug #123238 when ]]> + is found within a cdata section. + * result/noent/cdata2 result/cdata2 result/cdata2.rdr + result/cdata2.sax test/cdata2: add one more cdata test + +Thu Sep 25 23:03:23 CEST 2003 Daniel Veillard + + * parser.c xmllint.c doc/libxml2-api.xml include/libxml/parser.h: + Changed the new xmlRead/xmlCtxtRead APIs to have an extra + base URL parameter when not loading from a file or URL. + +Thu Sep 25 16:23:58 CEST 2003 Daniel Veillard + + * configure.in: preparing a beta3 solving the ABI problems + * globals.c parser.c parserInternals.c testHTML.c HTMLparser.c SAX.c + include/libxml/globals.h include/libxml/SAX.h: make sure the + global variables for the default SAX handler are V1 ones to + avoid ABI compat problems. + * xmlreader.c: cleanup of uneeded code + * hash.c: fix a comment + +Thu Sep 25 14:16:51 CEST 2003 Daniel Veillard + + * SAX2.c hash.c parser.c include/libxml/xmlexports.h + include/libxml/xmlmemory.h include/libxml/xmlversion.h.in: + fixing some comments to avoid warnings from apibuild.py + +Wed Sep 24 23:42:08 CEST 2003 Daniel Veillard + + * win32/configure.js: patch from Stephane Bidoul for configuring + the beta2 version #123104 + +Wed Sep 24 23:17:59 CEST 2003 Daniel Veillard + + * Makefile.am: adding repeated parsing and validating tests + * SAX2.c parser.c tree.c include/libxml/parser.h: make the new + DOM tree building interfaces use the dictionary from the + parsing context to build the element and attributes names + as well as formatting spaces and short text nodes + * include/libxml/dict.h dict.c: added some reference counting + for xmlDictPtr because they can be shared by documents and + a parser context. + * xmlreader.c: a bit of cleanup, remove the specific tree freeing + functions and use the standard ones now. + * xmllint.c: add --nodict + * python/libxml.c: fix a stupid bug so that ns() works on + attribute nodes. + +Tue Sep 23 23:07:45 CEST 2003 Daniel Veillard + + * parser.c include/libxml/parser.h: adding a new set of + API for parsing xmlReadDoc() xmlReadFile() ... xmlReadIO() + and xmlCtxtReadDoc() ... xmlCtxtReadIO(). That with + a clear define of xmlParserOption, xmlCtxtUseOptions() + should simplify custom parsing without being tempted to + use global variables, and xmlCtxtReset() should allow reuse + of a context for multiple parsing. + * xmllint.c: switched to use xmlReadXXX, allow options to + be used simultaneously with less troubles. + * tree.c: simple warning removal + * doc/apibuild.py: small fix + * doc/libxml2-api.xml win32/libxml2.def.src: updated + +Tue Sep 23 11:15:23 CEST 2003 Daniel Veillard + + * parser.c: revert xmlCreateDocParserCtxt() since this break + the parseDoc() python bindings + +Tue Sep 23 11:00:18 CEST 2003 Daniel Veillard + + * parser.c: make sure xmlDetectSAX2() is called only at + parsing time to avoid breaking apps changing the SAX + callbacks after context allocation, change xmlCreateDocParserCtxt() + to use an immutable buffer instead of a copy + +Tue Sep 23 09:40:33 CEST 2003 Daniel Veillard + + * xmlIO.c: applied patch from Markus Keim fixing a problem + with I/O callback registration. + * include/libxml/xmlerror.h: fixed #122994 comment numbering + for xmlParserErrors + +Mon Sep 22 12:21:11 CEST 2003 Daniel Veillard + + * tree.c include/libxml/tree.h: the uri arg to xmlNodeSetBase is + really a const xmlChar* + * xmlreader.c include/libxml/xmlreader.h: addin the + xmlTextReaderConstString() to get an interned string from + the reader + +Sun Sep 20 17:22:20 PDT 2003 William Brack + + * error.c: fixed a warning message (trivial) + * doc/search.php: removed incorrect warning message when word + search not found in last of multiple tables (bug 119535) + +Fri Sep 19 14:26:28 CEST 2003 Daniel Veillard + + * configure.in: preparing a 2.6.0-beta2 release + * xmlIO.c: avoid a warning + * tree.c: avoid duplicate code in xmlReplaceNode as pointed out + by Chris Ryland + * include/libxml/dict.h: add a QName access lookup to the + dictionary. + * xmlreader.c include/libxml/xmlreader.h: adding const access + based on the dictionary interface for string read from the + reader, the node content access is still TODO, it's too different + +Fri Sep 19 00:01:08 CEST 2003 Daniel Veillard + + * SAX2.c: fixing namespace DTD validations + * result/valid/ns2.xml result/valid/ns.xml: the output of defaulted + namespaces is slightly different now. + * Makefile.am: report the memory used in Timingtests (as well as time) + +Thu Sep 18 15:29:46 CEST 2003 Daniel Veillard + + * Makefile.am: add streaming on memory regression tests, found + bad bugs in the reader interface + * xmlreader.c: fixing bugs w.r.t. very large names, and special + condition in end of file. + * xmlIO.c tree.c include/libxml/tree.h include/libxml/xmlIO.h: + adding immutable buffers, and parser input based on those, + but this should not be used (yet) for general parsing + * parser.c: added a comment about using immutable buffers for + general parsing. + * result/bigname.xml.rdr result/bigname2.xml.rdr: fixing the + output of the regression tests + * xmllint.c: using the immutable buffers when streaming on + mmaped file (--stream --memory) + +Thu Sep 18 12:04:50 CEST 2003 Daniel Veillard + + * dict.c: the last patch broke unicity of returned strings, removed + +Thu Sep 18 00:31:02 CEST 2003 Daniel Veillard + + * Makefile.am: add a Timingtests target to check bad behaviour + from the streaming engine + * dbgen.pl dbgenattr.pl: perl script to generate big instances + * xmlreader.c: fix a bad behaviour on large buffer inputs + +Wed Sep 17 23:25:47 CEST 2003 Daniel Veillard + + * dict.c xmlreader.c: two small improvements + +Wed Sep 17 22:53:32 CEST 2003 Daniel Veillard + + * parserInternals.c: avoid a leak with previous patch + +Wed Sep 17 22:06:11 CEST 2003 Daniel Veillard + + * python/libxml.c: use stderr and not stdout for default errors + in python environment bug #122552 + +Wed Sep 17 21:33:57 CEST 2003 Daniel Veillard + + * parserInternals.c: small fix from Rob Richards for input filename + * xmllint.c: fixes for --repeat and --memory/--stream for speed tests + * xmlIO: adding a guard in one function + +Wed Sep 17 15:57:44 CEST 2003 Daniel Veillard + + * SAX2.c xmlreader.c include/libxml/parser.h: more performance hunting + reducing memory allocation and free and avoiding expensive routines + +Wed Sep 17 12:23:41 CEST 2003 Daniel Veillard + + * SAX2.c parser.c parserInternals.c xmlreader.c: started messing + seriously with per-document dict and element and attribute nodes + reuse in the xmlReader. This seems to lead to an interesting + speedup of the xmlReader already. + +Wed Sep 17 01:07:56 CEST 2003 Daniel Veillard + + * dict.c include/libxml/dict.h: do string allocations in large + pools, allowing to find if a string pertain to a dict quickly + * xmllint.c: fix --stream --repeat --timing + * Makefile.am: the testThreads run output should be seen. + +Mon Sep 15 16:46:28 CEST 2003 Daniel Veillard + + * SAX2.c include/libxml/parser.h: starting work on reusing the + parser dictionary for the element and attribute tag names. + Add pools for Element and Attributes in the parser context, + which should help speeding up the reader. + * Makefile.am result/*.rdr : adding non-python reader regression + tests. + +Mon Sep 15 14:54:42 CEST 2003 Daniel Veillard + + * SAX2.c parser.c valid.c: starting to cleanup some of the + problems exposed by the W3C/NIST regression suite. + * result/ent7.sax result/xml2.sax: small fixes. + +Mon Sep 15 11:46:47 CEST 2003 Daniel Veillard + + * parser.c: more parser error factoring + +Sun Sep 14 21:53:39 PDT 2003 William Brack + + * HTMLtree.c: Fixed bug 121394 - missing ns on attributes + +Sun Sep 14 21:43:32 CEST 2003 Daniel Veillard + + * parser.c include/libxml/xmlerror.h: factoring of more + error handling code, serious size reduction and more lisibility + of the resulting code. + * parserInternals.c parser.c include/libxml/parserInternals.h + include/libxml/parser.h: changing the way VC:Proper Group/PE Nesting + checks are done, use a counter for entities. Entities where freed and + reallocated at the same address failing the check. + * tree.c: avoid a warning + * result/valid/* result/VC/*: this slightly changes some validation + error messages. + +Sun Sep 14 11:03:27 PDT 2003 William Brack + + * valid.c: fixed bug 121759 - early declaration of + attribute-list in external DTD + +Sat Sep 13 14:42:11 CEST 2003 Daniel Veillard + + * parser.c include/libxml/xmlerror.h: starting cleaning up + error handling, factorize error processing + * doc/xmllint.html: update of the page, remove --sgml + +Sat Sep 13 02:13:50 CEST 2003 Daniel Veillard + + * Makefile.am DOCBparser.c parserInternals.c testDocbook.c + xmllint.c doc/xmllint.xml doc/xmllint.1: removing the + broken pseudo SGML DocBook parser code. + +Fri Sep 12 17:24:11 CEST 2003 Daniel Veillard + + * xpath.c: fix a problem with strcpy() in xmlXPathFormatNumber() + valgrind pointed out the strings overlapped. cleanup . + +Fri Sep 12 11:43:12 CEST 2003 Daniel Veillard + + * tree.c: applied speedup to xmlSearchNs() as suggested by + Luca Padovani. Cleaned up xmlSearchNsByHref() in the process + applying the same trick. + +Fri Sep 12 01:36:20 CEST 2003 Daniel Veillard + + * parser.c parserInternals.c tree.c include/libxml/parser.h + include/libxml/xmlerror.h: adding namespace checkings + while making sure they still parse as wellformed documents. + Add an nsWellFormed status report to the context, and + provide new appropriate error codes. + * Makefile.am result/namespaces/* test/namespaces/*: add + specific regression testing for the new namespace support + * test/att5 result/noent/att5 result/att5 result/att5.sax: + add more coverage for the attribute parsing and normalization + code. + +Fri Sep 12 01:34:19 CEST 2003 Daniel Veillard + + * threads.c: backport of a thread bugfix from 2_5_X branch + +Thu Sep 11 18:29:18 CEST 2003 Daniel Veillard + + * parser.c: fixed a bug in one corner case of attribute parsing. + +Thu Sep 11 16:21:53 CEST 2003 Daniel Veillard + + * configure.in doc/* : 2.6.0beta1 changes + * SAX2.c hash.c parser.c parserInternals.c: Fixing attribute + normalization, might not be totally fixed but this should + make sure SAX event provide the right strings for attributes + except entities for which libxml2 is different by default + This should fix #109564 + * result/attrib.xml.sax result/ent3.sax result/p3p.sax: minor changes + in attribute callback values + * result/c14n/with-comments/example-4 + result/c14n/without-comments/example-4: this also fixes a subtle + bug in the canonicalization tests. + +Wed Sep 10 12:38:44 CEST 2003 Daniel Veillard + + Time to commit 3 days of work rewriting the parser internal, + fixing bugs and migrating to SAX2 interface by default. There + is some work letf TODO, like namespace validation and attributes + normalization (this break C14N right now) + * Makefile.am: fixed the test rules + * include/libxml/SAX2.h include/libxml/parser.h + include/libxml/parserInternals.h SAX2.c parser.c + parserInternals.c: changing the parser, migrating to SAX2, + adding new interface to switch back to SAX1 or initialize a + SAX block for v1 or v2. Most of the namespace work is done + below SAX, as well as attribute defaulting + * globals.c: changed initialization of the default SAX handlers + * hash.c tree.c include/libxml/hash.h: added QName specific handling + * xmlIO.c: small fix + * xmllint.c testSAX.c: provide a --sax1 switch to test the old + version code path + * result/p3p result/p3p.sax result/noent/p3p test/p3p: the new code + pointed out a typo in a very old test namespace + +Sun Sep 7 19:58:33 PTD 2003 William Brack + + * xmlIO.c include/libxml/xmlIO.h parser.c: Implemented detection + of compressed files, setting doc->compressed appropriately + (bug #120503). + +Sun Sep 7 22:53:06 CEST 2003 Daniel Veillard + + * parser.c: try to cope with the fact that apps may still + have allocated smaller SAX callbak block + +Sun Sep 7 11:11:45 CEST 2003 Daniel Veillard + + * dict.c: allow to give -1 for undefined length in lookups + * include/libxml/parser.h parser.c parserInternals.c testSAX.c: + first round of work on the new SAX2 interfaces, the API + will change but commiting before changing for historical + reference. + +Sat Sep 6 10:55:01 PTD 2003 William Brack + + * SAX2.c, xmlIO.c: fixed bug #121210 (callback to sax->error, + sax->warning with wrong params). + +Fri Sep 5 10:33:42 CEST 2003 Daniel Veillard + + * include/libxml/globals.h: patch from Stéphane Bidoul to export + globals entry points to the python bindings + +Wed Sep 3 15:24:41 CEST 2003 Daniel Veillard + + * HTMLparser.c: when creating a DOCTYPE use "html" lowercase + by default instead of "HTML" + * parser.c xmlreader.c: optimization, gain a few % parsing speed by + avoiding calls to "areBlanks" when not needed. + * include/libxml/parser.h include/libxml/tree.h: some structure + extensions for future work on using per-document dictionaries. + +Wed Sep 3 15:08:06 CEST 2003 Daniel Veillard + + * Makefile.am results/*.sax SAXResult/*: removing the SAXresults + tree, keeping result in the same tree, added SAXtests to the + default "make tests" + +Tue Sep 2 15:59:04 CEST 2003 Igor Zlatkovic + + * include/libxml/xmlexports.h: defined additional macros which + affect exports and added mingw section + +Mon Sep 1 15:15:18 PDT 2003 William Brack + + * doc/index.py: fixed problem parsing xhtml docs + * doc/xmlreader.html,doc/guidelines.html: small modification + to avoid problem in python parsing. + * doc/search.php: fixed upper case filename problem for XSLT docs + +Mon Sep 1 22:55:09 CEST 2003 Daniel Veillard + + * xinclude.c: patch from Mark Vakoc that allows compiling + with XInclude but without XPointer support. + +Mon Sep 1 22:31:38 CEST 2003 Daniel Veillard + + * configure.in xml2-config.in: Applied a patch from Kevin P. Fleming + to add --libtool-libs option to xml2-config script. + +Sun Aug 31 21:52:12 PDT 2003 William Brack + + * doc/README.docs, doc/Makefile.am: new file added, + giving some description of the documentation generation process + * doc/search.php: fixed problem with upper case on filenames + +Fri Aug 29 12:25:01 CEST 2003 Igor Zlatkovic + + * win32/Makefile.bcb: updates by Eric Zurcher + +Thu Aug 28 22:58:38 PDT 2003 William Brack + + * doc/apibuild.py, doc/libxml2-api.xml: enhanced code + to compensate for pollution from Igor's header taint + (quick before Daniel notices) + +Thu Aug 28 23:01:36 CEST 2003 Daniel Veillard + + * SAX2.c: fixed a namespace error on attribute reporting bug + pointed out by Tobias Reif + * test/p3p result/p3p result/noent/p3p: this test case was wrong + using xmlsn instead of xmlns... + +Thu Aug 28 18:25:07 CEST 2003 Igor Zlatkovic + + * include/libxml/globals.h include/libxml/xmlexports.h: fixed + typos reported by Mark Vakoc + +Thu Aug 28 08:59:51 MDT 2003 John Fleck + + add: + * doc/tutorial/api.html + * doc/tutorial/ar01s09.html + * doc/tutorial/includexpath.c + updated + * doc/tutorial/*.html + fix my bad - forgot to check in new files when I last + updated + +Thu Aug 28 14:31:13 CEST 2003 Igor Zlatkovic + + * win32/Makefile.bcb: new file, support for Borland C++ + * xmllint.c: fixed time inclusion for various compilers + +Thu Aug 28 12:32:59 CEST 2003 Igor Zlatkovic + + * parser.c parserInternals.c DOCBparser.c HTMLparser.c: added + few casts to shut the compiler warnings + +Thu Aug 28 12:23:51 CEST 2003 Igor Zlatkovic + + * win32/Makefile.* win32/configure.js: fixed for mingw + +Thu Aug 28 10:01:44 CEST 2003 Daniel Veillard + + * globals.c threads.c: fixing bug #120870 try to avoid problem + with uninitialized mutexes + +Wed Aug 27 16:12:41 CEST 2003 Daniel Veillard + + * relaxng.c: fixed an error reporting bug in Relax-NG when we end + up with multiple states, select the "best" one. Fix #120682 + * result/relaxng/tutor11_2_3.err: small change resulting + +Wed Aug 27 11:25:25 CEST 2003 Daniel Veillard + + * xmlschemastypes.c: applied base64 support patch from Anthony Carrico + +Wed Aug 27 10:58:51 CEST 2003 Igor Zlatkovic + + * include/libxml/[threads-xpointer].h: realigned parameters + after taint + +Wed Aug 27 09:59:54 CEST 2003 Igor Zlatkovic + + * include/libxml/xmlexports.h: fixed defs for Borland compiler, + as reported by Eric Zurcher + +Tue Aug 26 15:54:04 CEST 2003 Daniel Veillard + + * relaxng.c: fixed bug #120386 again a problem introduced when + trying to reuse automata for content validation. Fix a bug report + problem on zeroOrMore + * result/relaxng/tutor3_7_err: change slightly error reporting. + +Mon Aug 25 13:24:57 CEST 2003 Daniel Veillard + + * include/libxml/Makefile.am: make sure the new header will + be included when generating a new distribution. + +Mon Aug 25 12:37:05 CEST 2003 Daniel Veillard + + * relaxng.c: fixed a couple of stupid bugs in the state allocation + routines which led to bug #120040 and the ones reported by + Martijn Faassen + +Mon Aug 25 12:37:23 CEST 2003 Igor Zlatkovic + + * include/libxml/parserInternals.h include/libxml/relaxng.h + include/libxml/SAX.h include/libxml/SAX2.h: realigned the + parameters after taint. + +Mon Aug 25 11:16:01 CEST 2003 Igor Zlatkovic + + * include/libxml/xmlversion.h.in: moved export defs to a separate + file for consistency. + * include/libxml/xmlexports.h: new file, contains export defs. + +Mon Aug 25 11:01:49 CEST 2003 Igor Zlatkovic + + * include/libxml/*.h genUnicode.py: exportability taint + of the headers. + +Thu Aug 21 12:37:46 CEST 2003 Daniel Veillard + + * SAX.c: make the deprecated interfaces log an error message + to be sure it won't get used. + +Thu Aug 21 00:50:32 CEST 2003 Daniel Veillard + + * Makefile.am SAX2.c include/libxml/Makefile.am include/libxml/SAX2.h: + Adding new version of the SAX interface, it's not there yet, + currently just preparing the work + * globals.c parser.c SAX.c include/libxml/SAX.h + include/libxml/globals.h include/libxml/parser.h: doing some + refactoring of the SAXv1 interfaces, obsoleting a bunch of them + while keeping functionalities, preparing SAX2 integration. + * dict.c: small cleanup. + +Wed Aug 20 00:20:01 CEST 2003 Daniel Veillard + + * tree.c: fixes a small bug introduced in last commit and detected + by valgrind. + +Tue Aug 19 16:54:18 CEST 2003 Daniel Veillard + + * dict.c hash.c: optimization when freeing hash tables. + * parser.c xmlIO.c include/libxml/tree.h: some tuning of buffer + allocations + * parser.c parserInternals.c include/libxml/parser.h: keep a + single allocated block for all the attributes callbacks, + avoid useless malloc()/free() + * tree.c: do not realloc() when growing a buffer if the buffer + ain't full, malloc/memcpy/free avoid copying memory. + +Mon Aug 18 18:37:01 CEST 2003 Daniel Veillard + + * xmllint.c doc/xmllint.xml doc/xmllint.1: added option + --dtdvalidfpi for Tobias Reif + +Mon Aug 18 14:03:03 CEST 2003 Daniel Veillard + + * dict.c include/libxml/dict.h Makefile.am include/libxml/Makefile.am: + new dictionary module to keep a single instance of the names used + by the parser + * DOCBparser.c HTMLparser.c parser.c parserInternals.c valid.c: + switched all parsers to use the dictionary internally + * include/libxml/HTMLparser.h include/libxml/parser.h + include/libxml/parserInternals.h include/libxml/valid.h: + Some of the interfaces changed as a result to receive or return + "const xmlChar *" instead of "xmlChar *", this is either + insignificant from an user point of view or when the returning + value changed, those function are really parser internal methods + that no user code should really change + * doc/libxml2-api.xml doc/html/*: the API interface changed and + the docs were regenerated + +Sun Aug 17 23:05:38 CEST 2003 Daniel Veillard + + * parser.c: applied patch to xmlCleanupParser from Dave Beckett + +Sat Aug 16 22:53:42 HKT 2003 William Brack + + * doc/parsedecl.py, doc/libxml2-refs.xml, doc/API*.html: + fixed part (2) of bug 119535 (wrong alpha case on filenames) + +Sat Aug 16 20:35:28 HKT 2003 William Brack + + * doc/API*.html, doc/html/*: regenerated API documentation + for xmlsoft.org (part of Bug 119535) + +Fri Aug 15 14:58:37 HKT 2003 William Brack + + * encoding.c, threads.c, include/libxml/HTMLparser.h, + doc/libxml2-api.xml: Minor changes to comments, etc. for + improving documentation generation + * doc/Makefile.am: further adjustment to auto-generation of + win32/libxml2.def.src + +Fri Aug 15 02:24:20 CEST 2003 Daniel Veillard + + * News configure.in: preparing libxml2-2.5.10 release + * doc/* : updated the doc and rebuilt + +Fri Aug 15 01:55:53 CEST 2003 Daniel Veillard + + * parser.c: fixing the xmlSAXParseDTD bug #119536 raised by + Malcolm Tredinnick with the patch he suggested. + +Fri Aug 15 01:37:10 CEST 2003 Daniel Veillard + + * HTMLparser.c: allocation error #119784 raised by Oliver Stoeneberg + +Fri Aug 15 00:41:58 CEST 2003 Daniel Veillard + + * uri.c: fixing an use of strcpy() where both strings overlap + pointed out by valgrind. + +Thu Aug 14 17:10:39 CEST 2003 Daniel Veillard + + * DOCBparser.c globals.c include/libxml/xmlmemory.h: get rid of + some compilation warnings. + * xinclude.c: fix the performance problem reported by Kevin Ruscoe + plus some cleanup and better error reporting. + +Thu Aug 14 14:13:43 CEST 2003 Daniel Veillard + + * encoding.c: applied UTF-16 encoding handling patch provided by + Mark Itzcovitz + * encoding.c parser.c: more cleanup and fixes for UTF-16 when + not having iconv support. + +Thu Aug 14 03:19:08 CEST 2003 Daniel Veillard + + * Makefile.am configure.in example/Makefile.am libxml.h nanoftp.c + nanohttp.c xmllint.c: Applied patch from Mikhail Grushinskiy for + mingw compiler on Windows. + +Thu Aug 14 02:28:36 CEST 2003 Daniel Veillard + + * parser.c: fixed the serious CPU usage problem reported by + Grant Goodale + * HTMLparser.c: applied patch from Oliver Stoeneberg about a free + missing in htmlSAXParseDoc + +Tue Aug 12 22:48:10 HKT 2003 William Brack + + * doc/Makefile.am: Removed dependency from libxml2.def.src + +Tue Aug 12 18:55:08 HKT 2003 William Brack + + * autogen.sh: took away the requirement for automake-1.4, + changed the messages for getting auto* tools to current + gnu pages. + * configure.in: added check for Linux Dec alpha requiring + -ieee flag, fixed test for ipv6 + * trionan.c: fixed problem for compiling on Linux Dec alpha + using native compiler + * doc/Makefile.am: implemented regeneration of win32/libxml2.def.src + whenever libxml2-api.xml is changed. + +Mon Aug 11 17:02:23 CEST 2003 Daniel Veillard + + * parser.c: cleaning up a problem when parsing UTF-16 and libiconv + is not used. + +Sun Aug 10 08:13:22 HKT 2003 William Brack + + * win32/libxml2.def.src: renerated with fixed libxml2-api.xml + +Sun Aug 10 00:22:55 CEST 2003 Daniel Veillard + + * News configure.in: preparing libxml2-2.5.9 release + * doc/* : updated the doc and rebuilt + +Sat Aug 9 20:00:13 CEST 2003 Daniel Veillard + + * include/libxml/xmlreader.h doc/libxml2-api.xml: changing an enum + definition to get a correct API XML description. This was apparently + breaking Windows build. + +Sat Aug 9 13:41:21 CEST 2003 Daniel Veillard + + * HTMLparser.c: fixed a nasty bug #119387, bad heuristic from + the progressive HTML parser front-end on large character data + island leading to an erroneous end of data detection by the + parser. Some cleanup too to get closer from the XML progressive + parser. + +Sat Aug 9 00:42:47 HKT 2003 William Brack + + * win32/configure.js: Added in support for the ISO8859X + module (patch provided by Jesse Pelton) + +Fri Aug 8 15:56:32 CEST 2003 Daniel Veillard + + * HTMLtree.c tree.c threads.c: hum try to avoid some troubles + when the library is not initialized and one try to save, the + locks in threaded env might not been initialized, playing safe + * xmlschemastypes.c: apply patch for hexBinary from Charles Bozeman + * test/schemas/hexbinary_* result/schemas/hexbinary_*: also added + his tests to the regression suite. + +Fri Aug 8 18:47:38 HKT 2003 William Brack + + * win32/defgen.xsl, win32/libxml2.def.src: Bug 119343 + (with apologies to Igor) - Enhanced handling of docb and + nanohttp. + +Thu Aug 7 21:13:22 HKT 2003 William Brack + + * encoding.c: further small changes for warnings when + configured with --with-iconv=no + +Wed Aug 6 12:32:11 HKT 2003 William Brack + + * error.c trionan.[ch] testThreads.c python/generator.py: + further small changes to elminate most of the remaining + warnings. + +Tue Aug 5 23:51:21 HKT 2003 William Brack + + * error.c HTMLparser.c testC14N.c testHTML.c testURI.c + xmlcatalog.c xmlmemory.c xmlreader.c xmlschemastypes.c + python/libxml.c include/libxml/xmlmemory.h: small changes + to syntax to get rid of compiler warnings. No changes + to logic. + +Mon Aug 4 22:40:54 CEST 2003 Daniel Veillard + + * doc/libxml2-api.xml doc/html/*: rebuilt the API and docs. + +Mon Aug 4 21:40:34 CEST 2003 Daniel Veillard + + * tree.c: fixed a small problem in the patch for #118763 + * result/HTML/doc3.htm*: this reverts back to the previous result + +Sun Aug 3 21:41:49 EDT 2003 Daniel Veillard + + * doc/FAQ.html doc/xml.html: applied doc patch to xml.html + and rebuilt, apparently some C++ wrappers are not available, + c.f. bug #118943 + +Sun Aug 3 21:30:31 EDT 2003 Daniel Veillard + + * tree.c: fixing HTML attribute serialization bug #118763 + applying a modified version of the patch from Bacek + * result/HTML/doc3.htm*: this modifies the output from one test + +Sun Aug 3 21:02:30 EDT 2003 Daniel Veillard + + * tree.c include/libxml/tree.h: added a new API to split a + QName without generating any memory allocation + * valid.c: fixed another problem with namespaces on element + in mixed content case + * python/tests/reader2.py: updated the testcase with + Bjorn Reese fix to reader for unsignificant white space + * parser.c HTMLparser.c: cleanup. + +Sun Aug 3 20:55:40 EDT 2003 Daniel Veillard + + * catalog.c: trying to fix #118754 of possible recursion in the + catalogs. Not fantastically happy about the current fix since + it's likely to break under very thread intensive concurrent + access to the catalog. Better solution might to keep the depth + an extra argument to the resolution functions. + +Sun Aug 3 18:56:54 EDT 2003 Daniel Veillard + + * valid.c: fixed bug #118712 about mixed content, and namespaced + element names. + * test/valid/mixed_ns.xml result/valid/mixed_ns*: added a check + in the regression tests + +Fri Aug 1 23:55:23 HKT 2003 William Brack + + Coninuing work on bug 118559 + * DOCBparser.c: removed 2 unsed vars + * xmlregexp.c: changed some numeric const to their enum symbols + * xmlreader.c: changed one var define from int to enum + (a little more to be done, awaiting co-ordination) + * relaxng.c: deleted one unused var + * xmllint.c: deleted some unused vars, changed one arg + val from int to enum + * testHTML.c, testDocbook.c: changed some arg vals to enum const + * xmlIO.c: fixed typo from last night (small warning msg) + +Thu Jul 31 22:44:33 HKT 2003 William Brack + + Working on bug 118559 + * error.c: deleted unused variable + * parserInternals.c: deleted unneeded 'const' qualifier + * parser.c: changed variable type for enum temp storage + * xmlIO.c: changed debugging var to be inside #ifdef + * valid.c: removed unused variable + * HTMLparser.c: removed some unneeded 'const' qualifiers + * xpath.c: added some type casts, removed some unused vars + * xinclude.c: added one type cast + * nanohttp.c: repositioned some #ifdef to avoid unused var + * nanoftp.c: removed unused var + +Wed Jul 30 14:57:55 EDT 2003 Daniel Veillard + + * HTMLparser.c: applied a patch from William Brack about + the problem of parsing very large HTML instance with comments + as raised by Nick Kew + +Wed Jul 30 12:29:38 EDT 2003 Daniel Veillard + + * xmlreader.c include/libxml/xmlreader.h: applying cleanup + patch from Bjorn Reese for xmlTextReaderNodeType() and + significant whitespace. There is an enum for node type + values now. + +Wed Jul 30 11:08:21 EDT 2003 Daniel Veillard + + * encoding.c: applying patch from Peter Jacobi to added + ISO-8859-x encoding support when iconv is not available + * configure.in include/libxml/xmlversion.h.in + include/libxml/xmlwin32version.h.in: added the glue needed + at the configure level and made it the default for Windows + +Tue Jul 29 16:43:48 EDT 2003 Daniel Veillard + + * python/generator.py python/libxml.c python/libxml2class.txt: + patch from Joachim Bauch + cleanup for Relax NG error callbacks + in python + +Tue Jul 29 12:46:08 EDT 2003 Daniel Veillard + + * parser.c parserInternals.c tree.c: applied Peter Jacobi encoding + cleanup patch, and also avoided a possible memory leak + +Tue Jul 29 09:28:09 EDT 2003 Daniel Veillard + + * encoding.c: fix the previous commit + +Tue Jul 29 12:28:17 HKT 2003 William Brack + + * HTMLparser.c: fixed problem with comments reported by Nick Kew + * encoding.c: added routines xmlUTF8Size and xmlUTF8Charcmp for + some future cleanup of UTF8 handling + +Mon Jul 28 16:39:14 EDT 2003 Daniel Veillard + + * xpath.c: applied a change suggested by Sean Griffin in bug + #118494 about a memory leak in EXSLT + +Sun Jul 27 14:30:56 EDT 2003 Daniel Veillard + + * relaxng.c: fixed a Relax-NG compilation/streaming bug introduced + when fixing the previous Relax-NG bugs + * result/relaxng/*: This slightly changes the output messages of + some regression tests. + * configure.in: added support of -with-fexceptions for nested C++ + support. + +Thu Jul 24 15:46:02 MDT 2003 John Fleck + + * doc/tutorial/apa.html + * doc/tutorial/apb.html + * doc/tutorial/apc.html + * doc/tutorial/apd.html + * doc/tutorial/ape.html + * doc/tutorial/apf.html + * doc/tutorial/apg.html + * doc/tutorial/aph.html + * doc/tutorial/ar01s02.html + * doc/tutorial/ar01s03.html + * doc/tutorial/ar01s04.html + * doc/tutorial/ar01s05.html + * doc/tutorial/ar01s06.html + * doc/tutorial/ar01s07.html + * doc/tutorial/ar01s08.html + * doc/tutorial/index.html + * doc/tutorial/ix01.html + * doc/tutorial/xmltutorial.pdf + * doc/tutorial/xmltutorial.xml + update tutorial with XPath example + +Thu Jul 24 17:07:06 IST 2003 Daniel Veillard + + * SAX.c parser.c: fixing a bug about a special case of namespace + handling, this closes bug #116841 + +Wed Jul 23 20:52:36 IST 2003 Daniel Veillard + + * relaxng.c result/relaxng/*: checked and fixed the compilation + of RNG schemas, fixes a couple of bugs #117097 and #117001 . + This slightly changes the output messages of some regression tests. + +Wed Jul 23 15:15:08 IST 2003 Daniel Veillard + + * xmlreader.c: fixed an out of bound error #118052 , the good + part if that base64 code was not in use yet ... + +Tue Jul 22 19:42:15 MDT 2003 John Fleck + + * doc/xmllint.html + include html version of the xmllint man page, so an + up-to-date version is visible on the Web + +Mon Jul 21 21:53:43 IST 2003 Daniel Veillard + + * xinclude.c include/libxml/xinclude.h: added a new API + xmlXIncludeProcessTree() to process XInclude only on a subtree + this should fix bug #115385 + +Fri Jul 18 17:11:42 CEST 2003 Daniel Veillard + + * relaxng.c include/libxml/relaxng.h: adding Get interface for + the error callback and parameters of parsing and validation + contexts + * xmlreader.c: patch to fix bug #117702 about incomplete Read() + on text nodes. + +Wed Jul 16 23:15:53 CEST 2003 Daniel Veillard + + * parserInternals.c: patch from Dodji Seketeli about UTF16 BOM + when using the push XML parser. + * result/utf16bom.xml result/noent/utf16bom.xml test/utf16bom.xml: + added the test to the regression suite. + +Tue Jul 15 22:03:13 CEST 2003 Daniel Veillard + + * globals.c: add xmlThrDefMutex = NULL in xmlCleanupGlobals() + as suggested by Rob Richards + +Tue Jul 15 15:30:55 CEST 2003 Daniel Veillard + + * DOCBparser.c HTMLparser.c entities.c parser.c relaxng.c + xmlschemas.c xpath.c: removed some warnings by casting xmlChar + to unsigned int and a couple of others. + +Fri Jul 11 16:44:22 CEST 2003 Daniel Veillard + + * xmlschemastypes.c: fixes a segfault on empty hexBinary strings + +Thu Jul 10 16:02:47 CEST 2003 Daniel Veillard + + * nanoftp.c nanohttp.c: cleanup patches from Peter Breitenlohner + +Tue Jul 8 16:02:19 CEST 2003 Daniel Veillard + + * globals.c threads.c: fixes some problem when freeing unititialized + mutexes + +Tue Jul 8 14:15:07 CEST 2003 Daniel Veillard + + * nanoftp.c nanohttp.c: the modules should not import + directly, some cleanups + * xmlschemas.c: Peter Sobisch found a nasty bug in the Schemas + validation code. + +Mon Jul 7 18:00:51 CEST 2003 Daniel Veillard + + * win32/configure.js: Jesse Pelton pointed out a problem in the + javascript code. + +Mon Jul 7 16:39:31 CEST 2003 Daniel Veillard + + * NEWS doc/*: regenerated + * nanoftp.c nanohttp.c: might fix includes problems with the + Ipv6 support on solaris + * tree.c: patch from Markus Keim about xmlHasNsProp() on attributes + defined as #IMPLIED + +Sun Jul 6 23:09:13 CEST 2003 Daniel Veillard + + * configure.in doc/*: preparing release 2.5.8 + * nanohttp.c: changed some preprocessor block + * xmlschemastypes.c: applied patch from Charles Bozeman adding + hexBinary schema datatype and adding support for totalDigits and + fractionDigits facets. + +Sun Jul 6 19:56:18 CEST 2003 Daniel Veillard + + * debugXML.c xpath.c: fixed 2 bugs pointed in #116448 + +Sun Jul 6 19:34:17 CEST 2003 Daniel Veillard + + * xinclude.c: fixed bug #116095 removing the error message when + reapplying XInclude to a document. + +Sat Jul 5 22:40:23 CEST 2003 Daniel Veillard + + * xmlIO.c: applied small changes to portability layer for + compilation on DJGPP Ms-DOS compiler. + +Sat Jul 5 22:30:25 CEST 2003 Daniel Veillard + + * parser.c HTMLparser.c: use the character() SAX callback + if the cdataBlock ain't defined. + * xpath.c: fix bug #115349 allowing compilation when configured + with --without-xpath since the Schemas code needs NAN and co. + +Sat Jul 5 00:51:30 HKT 2003 William Brack + + Fixed problem with multi-threading, shown by the test program + testThreads. After fix, ran mutiple tests on various speed + machines (single and dual processor X86), which all seem okay. + + * catalog.c: added missing xmlRMutexUnlock in xmlLoadCatalog + + * threads.c: added missing initialisation for condition variable + in xmlNewRMutex. + +Sat Jun 21 16:10:24 CEST 2003 Daniel Veillard + + Applying IPv6 patch from Archana Shah + closing bug #114837 + + * configure.in: Added checks for IPv6 support and getaddrinfo(). + + * acconfig.h: Defined HAVE_GETADDRINFO and SUPPORT_IP6. + + * config.h.in: Defined HAVE_GETADDRINFO and SUPPORT_IP6. + + * nanoftp.c: Structure xmlNanoFTPCtxt contains either sockaddr_storage + field or sockaddr_in field, depending upon the availability of IPv6 + support. + have_ipv6(): Added to check for run-time IPv6 support. + (xmlNanoFTPScanURL), (xmlNanoFTPUpdateURL), (xmlNanoFTPScanProxy): + Modified to parse a URI with IPv6 address given in []. + (xmlNanoFTPConnect): Changed to use getaddrinfo for address + resolution, if it is available on the system, as gethostbyname + does not return IPv6 addresses on some platforms. + (xmlNanoFTPGetConnection): Modified type of dataAddr variable to + sockaddr_storage or sockaddr_in depending upon the IPv6 support. + Sending EPSV, EPRT or PASV, PORT depending upon the type of address + we are dealing with. + + * nanohttp.c: (have_ipv6): Added to check for run-time IPv6 support. + (xmlNanoHTTPScanURL), (xmlNanoHTTPScanProxy): Modified to parse + a URI with IPv6 address given in []. + (xmlNanoHTTPConnectHost): Modified to use getaddrinfo if it is + available on the system. Also IPv6 addresses will be resolved by + gethostbyname only if IPv6 run-time support is available. + (xmlNanoHTTPConnectAttempt): Modified to deal with IPv6 address. + +Sat Jun 14 18:46:51 CEST 2003 Igor Zlatkovic + + * win32/configure.js include/win32config.h + include/libxml/xmlversion.h.in: Applied the patch for BCB + by Eric Zurcher. + +Fri Jun 13 14:27:19 CEST 2003 Daniel Veillard + + * doc/Makefile.am doc/html/*: reverted back patch for #113521, + due to #115104 and while fixing #115101 . HTML URLs must not + be version dependant. + +Fri Jun 13 12:03:30 CEST 2003 Daniel Veillard + + * entities.c: do not generate " for " outside of attributes + * result//*: this changes the output of some tests + +Mon Jun 9 12:28:58 CEST 2003 Daniel Veillard + + * parser.c xmlIO.c: trying to fix #114277 about when file + remapping and escaping should really be attempted. + +Mon Jun 9 11:06:09 CEST 2003 Daniel Veillard + + * doc/*: applied a patch from Gman for building docs + * valid.c xmllint.c include/libxml/valid.h: applied a patch from + Gary Pennington to provide an allocator for xmlValidCtxt + * xmlreader.c: applied patch from Jacek Konieczny fixing bug + #113580 about data not being passed immediately. + +Thu Jun 5 11:31:02 CEST 2003 Daniel Veillard + + * tree.c: applied a couple of patches from Mark Itzcovitz + to handle saving back "UTF-16" documents. + +Mon Jun 2 21:56:15 MVT 2003 Daniel Veillard + + * relaxng.c xmlschemas.c include/libxml/schemasInternals.h: commiting + some work done while in the Maldives (hence the timezone on the + laptop !) + * result/schemas/length3* test/schemas/deter0_* + test/schemas/group0_*: some tests added too + +Mon Jun 2 15:34:17 CEST 2003 Daniel Veillard + + * encoding.c: small fix + * xmlIO.c: fixed an error message + +Tue May 20 14:21:23 CEST 2003 Daniel Veillard + + * parserInternals.c: fixing Red Hat bug #91013 where xmllint was + accepting an improper UTF8 sequence + +Sat May 17 12:53:11 CEST 2003 Igor Zlatkovic + + * threads.c: applied the patch from Stéphane Bidoul for getting + rid of extra threads in a dynamic library. + * win32/configure.js: threads default to 'native' now. + +Fri May 16 13:17:52 EDT 2003 Daniel Veillard + + * HTMLtree.c: fixing bug #112904: html output method escaped + plus sign character in URI attribute. + +Thu May 15 18:06:18 EDT 2003 Daniel Veillard + + * build_glob.py global.data globals.c parser.c + include/libxml/globals.h: patch from Stéphane Bidoul for setting + up threads global defaults. + * doc/libxml2-api.xml: this extends the API with new functions + * python/tests/Makefile.am python/tests/reader2.py + python/tests/thread2.py: integrated the associated testcase and + fixed the error string used in reader2 + +Wed May 14 14:56:46 EDT 2003 Daniel Veillard + + * configure.in libxml.spec.in python/Makefile.am: trying + to conciliate --with-python= requirements and RPM builds, + a PITA really... + +Tue May 13 18:30:34 EDT 2003 Daniel Veillard + + * HTMLparser.c: oops last commit introduced a memory leak. + +Tue May 13 18:10:38 EDT 2003 Daniel Veillard + + * xmllint.c doc/xmllint.xml: added --nonet option + * doc/Makefile.am: fixing #112803 by adding --nonet when calling + xsltproc or xmllint + * doc/xmllint.xml doc/xmllint.1: also added --schema doc and + rebuilt + * HTMLparser.c: cleaned up the HTML parser context build when + using an URL + +Tue May 13 16:35:04 EDT 2003 Daniel Veillard + + * libxml.spec.in: added a comment about bug #112902 + +Mon May 12 21:58:00 EDT 2003 William Brack + + * minor cleanup of configure '--help' display + * error.c: enhanced xmlParserPrintFileContext to fix bug #109942 + +Mon May 12 17:53:30 EDT 2003 Daniel Veillard + + * tree.c: PI nodes in external subset were not freed :-\ + fixes bug #112842 + +Mon May 12 11:23:27 EDT 2003 Daniel Veillard + + * xmllint.c: added --schema option to run WXS schema validation + * xmlschemas.c xmlschemastypes.c include/libxml/schemasInternals.h: + tried to improve error reporting in the Schema code, some cleanup + too. + +Sun May 11 16:13:20 EDT 2003 Daniel Veillard + + * xmlschemas.c: fixed some problems in the handling of errors, + and attributes addressed by references. + * test/schemas/* result/schemas/*: dropped the verbosity level + and added a couple of new tests + +Sat May 10 16:01:21 EDT 2003 Daniel Veillard + + * relaxng.c: Stéphane Bidoul found an off by one addressing + error on the error handling. + +Fri May 9 19:08:20 EDT 2003 Daniel Veillard + + * xmlschemastypes.c: trying to fix #112673 + +Fri May 9 18:14:16 EDT 2003 Daniel Veillard + + * DOCBparser.c catalog.c parser.c relaxng.c: removed multiple + warning, this fixed a bug and should close #111574 + +Fri May 9 15:34:32 EDT 2003 Daniel Veillard + + * xmlschemas.c: fixing bug #104081 with xs:all with an element + holding minOccurs="0" + * test/schemas/all_* result/schemas/all_*: added some regression + tests for that bug + * xmllint.c xmlreader.c: patches from Joerg Schmitz-Linneweber and + Garry Pennington to compile without schemas support. + +Thu May 1 10:02:35 CEST 2003 Daniel Veillard + + * tree.c: fixed a problem with xmlUnlinkNode() for DTDs. + +Wed Apr 30 14:16:08 CEST 2003 Daniel Veillard + + * xml2-config.in: try to fix Red hat bug #89957, do not + output -L/usr/lib64 + * xmlreader.c: fixed a typo in a comment + +Tue Apr 29 07:32:02 MDT 2003 John Fleck + + * doc/tutorial/aph.html, ix01.html + forgot to cvs add the new files. Thanks to Roland van Laar + for pointing this out + +Tue Apr 29 14:36:49 CEST 2003 Daniel Veillard + + * xmlschemas.c doc/libxml2-api.xml: fixing a function comment + * doc/Makefile.am doc/apibuild.py doc/gnome-xml.sgml: switching + to the XML/XSLT doc generation closing #111799 + * doc/html/*: complete update of the HTML results + +Mon Apr 28 14:51:41 CEST 2003 Igor Zlatkovic + + * win32/defgen.xsl: fixed the conditional for unicode map, + removed hardcoded schema entries + +Mon Apr 28 02:19:00 CEST 2003 Igor Zlatkovic + + * win32/defgen.xsl: new file, stylesheet for generating + win32/libxml2.def.src from doc/libxml2-api.xml + * win32/libxml2.def.src: is autogenerated from now on, changes + to this file will not appear here anymore + +Mon Apr 28 00:12:11 CEST 2003 Daniel Veillard + + * win32/configure.js python/setup.py.in: applied patch + from Stéphane Bidoul for the Python bindings on the new + release. + +Sun Apr 27 17:56:21 CEST 2003 Igor Zlatkovic + + * debugXML.c: included libxml/uri.h for xmlCanonicPath + declaration + * win32/configure.js: thread-enabled build is now default + * win32/libxml2.def.src: added more exports + +Sun Apr 27 00:23:05 CEST 2003 Daniel Veillard + + * NEWS doc/*.xsl doc/*.html: updated the web site separated + developers from common pages, made the transition to XHTML1, + added validity checking to the makefile rules. + +Sat Apr 26 23:17:51 CEST 2003 Daniel Veillard + + * parser.c: fix for xmlIOParseDTD same as previous and reported + by Petr Pajas + +Sat Apr 26 15:26:04 CEST 2003 Daniel Veillard + + * parser.c: applied fix to xmlSAXParseDTD from Malcolm Tredinnick + closing #111638 + +Sat Apr 26 14:00:58 CEST 2003 Daniel Veillard + + * python/generator.py: fixed a problem in the generator where + the way functions are remapped as methods on classes was + not symetric and dependant on python internal hash order, + as reported by Stéphane Bidoul + +Fri Apr 25 21:52:33 MDT 2003 John Fleck + + * doc/tutorial: + xmltutorial.xml + xmltutorial.pdf + *.html + add appendix on generating compiler flags, more indexing + +Sat Apr 26 01:10:48 CEST 2003 Daniel Veillard + + * triodef.h vms/build_libxml.com: applied patch from Craig A. Berry + to get libxml-2.5.7 to compile on OpenVMS + +Fri Apr 25 18:42:35 CEST 2003 Daniel Veillard + + * parser.c: fixing an xmlParseDTD bug raised by Petr Pajas + +Fri Apr 25 15:20:29 CEST 2003 Daniel Veillard + + * doc/Makefile.am doc/xmlcatalog.1 doc/xmlcatalog_man.xml + doc/xmllint.1 doc/xmllint.xml: automated the generation of the + man page based on xsltproc and a stylesheet PI in the XML. + +Fri Apr 25 12:37:33 CEST 2003 Daniel Veillard + + * doc/xmllint.*: trying to fix #110541 where   generated + character preventing rendering by the man command. + +Fri Apr 25 01:09:23 CEST 2003 Daniel Veillard + + * NEWS configure.in: preparing release 2.5.7 + * doc/*: updated and rebuilt the docs + * doc/apibuild.py: fixed the script + +Thu Apr 24 19:11:12 CEST 2003 Daniel Veillard + + * Makefile.am doc/apibuild.py: make sure the OOM code don't + get in the way of the builds + * doc/libxml2-api.xml python/libxml2class.txt: automatic update + +Thu Apr 24 18:01:46 CEST 2003 Daniel Veillard + + * Makefile.am testOOM.c testOOMlib.[ch] : integrated the Out Of + Memory test from Havoc Pennington #109368 + * SAX.c parser.c parserInternals.c tree.c uri.c valid.c + xmlmemory.c xmlreader.c xmlregexp.c include/libxml/tree.h + include/libxml/parser.h: a lot of memory allocation cleanups + based on the results of the OOM testing + * check-relaxng-test-suite2.py: seems I forgot to commit the + script. + +Wed Apr 23 17:16:41 CEST 2003 Daniel Veillard + + * xmlschemastypes.c: trivial fix for 109774 removing a warning + +Wed Apr 23 15:49:32 CEST 2003 Daniel Veillard + + * DOCBparser.c SAX.c catalog.c debugXML.c parser.c: try to find + more places where xmlCanonicPath() must be used to convert + filenames to URLs, trying to fix #111088 + +Wed Apr 23 09:35:12 CEST 2003 Daniel Veillard + + * python/libxml.c python/libxml.py: applied patch from + Brent M Hendricks adding binding for xmlCatalogAddLocal + +Tue Apr 22 15:18:01 CEST 2003 Daniel Veillard + + * HTMLparser.c: tried to fix #98879 again in a more solid + way. + +Tue Apr 22 13:58:43 CEST 2003 Igor Zlatkovic + + * win32/libxml2.def.src: added more exports from the relaxng and + xmlreader clan + +Tue Apr 22 10:35:13 CEST 2003 Daniel Veillard + + * SAX.c test/valid/ns* test/result/ns*: applied the patch + provided by Brent Hendricks fixing #105992 and integrated the + examples in the testsuite. + +Tue Apr 22 01:06:09 CEST 2003 Daniel Veillard + + * TODO: updated a bit + * configure.in: fixed the comment, threads now default to on + * parserInternals.c: fixed an erroneous xmlMallocAtomic() call + +Mon Apr 21 23:33:38 CEST 2003 Daniel Veillard + + * globals.c libxml.h parser.c parserInternals.c tree.c xmllint.c + xmlreader.c include/libxml/parser.h: a lot of performance work + especially the speed of streaming through the reader and push + interface. Some thread related optimizations. Nearly doubled the + speed of parsing through the reader. + +Sun Apr 20 10:36:05 MDT 2003 John Fleck + + * doc/xmllint.xml + * doc/xmllint.1 + update man page to explain use of --stream + +Sat Apr 19 02:03:24 CEST 2003 Daniel Veillard + + * DOCBparser.c HTMLparser.c c14n.c catalog.c encoding.c globals.c + nanohttp.c parser.c parserInternals.c relaxng.c tree.c uri.c + xmlmemory.c xmlreader.c xmlregexp.c xpath.c xpointer.c + include/libxml/globals.h include/libxml/xmlmemory.h: added + xmlMallocAtomic() to be used when allocating blocks which + do not contains pointers, add xmlGcMemSetup() and xmlGcMemGet() + to allow registering the full set of functions needed by + a garbage collecting allocator like libgc, ref #109944 + +Fri Apr 18 16:37:41 CEST 2003 Daniel Veillard + + * configure.in: switched to have thread support enabled by default, + didn't got troubles with ABI compatibility on Linux, hope it + won't break on strange OSes, if yes, report the system ID + * doc/libxml2-api.xml: just rebuilt the API + +Fri Apr 18 14:31:15 CEST 2003 Daniel Veillard + + * libxml.h include/libxml/parser.h parser.c xmlIO.c DOCBparser.c: + added support for large file, tested with a 3+GB instance, + and some cleanup. + * catalog.c: added a TODO + * Makefile.am: added some "make tests" comments + +Thu Apr 17 14:51:57 CEST 2003 Daniel Veillard + + * relaxng.c: some cleanups + * doc/xmlreader.html: extended the document to cover RelaxNG and + tree operations + * python/tests/Makefile.am python/tests/reader[46].py: added some + xmlReader example/regression tests + * result/relaxng/tutor*.err: updated the output of a number of tests + +Thu Apr 17 11:35:37 CEST 2003 Daniel Veillard + + * relaxng.c: valgrind pointed out an uninitialized variable error. + +Thu Apr 17 11:06:28 CEST 2003 Daniel Veillard + + * include/libxml/relaxng.h relaxng.c include/libxml/xmlreader.h + xmlreader.c: augnemting the APIs, cleanups. + * parser.c: cleanup bug #111005 + * xmlIO.c: added some missing comments + +Wed Apr 16 17:46:50 CEST 2003 Daniel Veillard + + * relaxng.c xmllint.c: more work on RelaxNG streaming validation + trying to improve the subset compiled, and more testing. + * doc/downloads.html doc/xml.html doc/xmlmem.html: some updates on the + documentation + * test/relaxng/tutor11_1_3.xml: fixes the DTD path + * result/relaxng/*.err: fix some of the outputs + +Wed Apr 16 01:28:15 CEST 2003 Daniel Veillard + + * relaxng.c xmlreader.c xmllint.c include/libxml/relaxng.h + include/libxml/xmlreader.h: implemented streaming of + RelaxNG (when possible) on top of the xmlReader interface, + provided it as xmllint --stream --relaxng .rng .xml + This seems to mostly work. + * Makefile.am: updated to test RelaxNG streaming + +Mon Apr 14 18:08:33 CEST 2003 Daniel Veillard + + * relaxng.c include/libxml/relaxng.h: integrated the regexp + based validity checking of fragments of the document for + which the RNG can be compiled to regexps. Works on all regression + tests, only fix needed is related to error messages. + +Sun Apr 13 21:51:00 CEST 2003 Daniel Veillard + + * relaxng.c xmlregexp.c include/libxml/xmlautomata.h + include/libxml/xmlregexp.h: Starting work precompiling + parts of RelaxNG schemas. Not plugged onto validity checking + yet, just the regexp building part. Needed to extend some + of the automata and regexp APIs. + +Fri Apr 11 21:36:21 CEST 2003 Daniel Veillard + + * xmllint.c xmlreader.c include/libxml/xmlreader.h: make sure + xmllint --stream and xmllint --stream --valid returns errors + code appropriately + +Fri Apr 11 10:59:24 CEST 2003 Daniel Veillard + + * xmlreader.c include/libxml/xmlreader.h: Added the Expand() + and Next() operation to work on subtrees within the reader + framework. + * doc/libxml2-api.xml python/libxml2class.txt: resulting updates + * python/tests/reader5.py: added an example for those new + functions of the reader. + +Thu Apr 10 23:38:13 CEST 2003 Daniel Veillard + + * HTMLtree.c: patch from Vasily Tchekalkin to fix #109865 + +Thu Apr 10 15:32:44 CEST 2003 Daniel Veillard + + * xmlreader.c: fixing HasValue for namespace as raised by + Denys Duchier + +Wed Apr 9 14:07:18 CEST 2003 Daniel Veillard + + * HTMLparser.c include/libxml/HTMLparser.h: exported + htmlCreateMemoryParserCtxt() it was static + +Wed Apr 9 13:21:48 CEST 2003 Daniel Veillard + + * xmlschemas.c xmlschemastypes.c include/libxml/xmlschemas.h: + update from Charles Bozeman for date and duration types + * test/schemas/date_0.* test/schemas/dur_0.* + result/schemas/date_0.* result/schemas/dur_0.*: updated too + +Mon Apr 7 12:19:26 CEST 2003 Daniel Veillard + + * tree.c valid.c xpath.c include/libxml/tree.h include/libxml/valid.h: + fixing bug #107129, removing excessive allocation and calls + to *printf in the code to build QName strings. + +Sat Apr 5 11:41:36 CEST 2003 Igoe Zlatkovic + + * win32/libxml2.def.src: fixed conditional exports, reported by + Luke Murray. + +Fri Apr 4 18:08:00 CEST 2003 Daniel Veillard + + * parser.c: fixed a possible problem with xmlRecoverMemory() + +Thu Apr 3 17:24:44 CEST 2003 Daniel Veillard + + * trio.c trio.h triodef.h trionan.c trionan.h triop.h triostr.c + triostr.h: Bjorn sent an update for the TRIO portability layer. + +Tue Apr 1 21:57:26 CEST 2003 Igor Zlatkovic + + * win32/libxml2.def.src: exported new functions + +Tue Apr 1 13:09:46 CEST 2003 Daniel Veillard + + * configure.in NEWS: preparing release 2.5.6 + * doc/*: updated and rebuilt the docs + +Tue Apr 1 11:52:15 CEST 2003 Daniel Veillard + + * SAX.c: fixed an uninitialized memory access pointed by valgrind + on C14Ntests + +Tue Apr 1 00:12:28 CEST 2003 Daniel Veillard + + * relaxng.c: one more fixup of error message reporting + +Mon Mar 31 18:36:32 CEST 2003 Daniel Veillard + + * relaxng.c: more work on bug #109225, and fixed an uninitialized + variable pointed out by valgrind + +Mon Mar 31 18:05:22 CEST 2003 Daniel Veillard + + * relaxng.c: try to work on bug #109225 and provide better + error reports. + * result/relaxng/* : this change the output of a number of tests + * xinclude.c: fixing the parsed entity redefinition problem + raised on the list. + * test/schemas/date_0.xsd: updated the date test c.f. E2-12 + +Mon Mar 31 13:19:04 CEST 2003 Daniel Veillard + + * xmlschemastypes.c: fixed date comparison to handle the tzo + The only failures left are disagreements on Notations and + '+1' not being allowed for ulong, uint, ushort and ubyte. + +Mon Mar 31 12:11:47 CEST 2003 Daniel Veillard + + * xmlschemastypes.c: fixed gMonth parsing routine accordingly + to the XML Schemas errata + http://www.w3.org/2001/05/xmlschema-errata#e2-12 + +Sun Mar 30 23:04:18 CEST 2003 Daniel Veillard + + * relaxng.c xmlschemastypes.c: more work on XML Schemas datatypes + and facets support. Currently only schemas with binHex or + base64 don't compile. A few error left in the test suite: + found 1035 test instances: 919 success 23 failures + most are gdate or gdateyear failing check, and a few cases where + James clark tests results are strange. + * valid.c: allow to reuse the Notation checking routine without + having a validation context. + * SAX.c: removed a #if 0 + +Sat Mar 29 17:35:05 CET 2003 Daniel Veillard + + * xinclude.c: forgot to apply one check from #106931 patch + * xmlschemastypes.c: more work on XML Schemas datatypes + +Sat Mar 29 11:49:25 CET 2003 Daniel Veillard + + * relaxng.c include/libxml/relaxng.h xmlschemastypes.c: more work + on cleaning up XML Schemas datatypes based on James Clark tests + test/xsdtest/xsdtest.xml + +Fri Mar 28 14:24:08 CET 2003 Daniel Veillard + + * relaxng.c: implemented comparisons for Schemas values. + * xmlschemastypes.c include/libxml/xmlschemastypes.h: fixed + some bugs in duration handling, comparisons for durations + and decimals, removed all memory leaks pointed out by James + testsuite. Current status is now + found 238 test schemas: 197 success 41 failures + found 1035 test instances: 803 success 130 failures + +Fri Mar 28 00:41:55 CET 2003 Daniel Veillard + + * xmlschemas.c include/libxml/xmlschemas.h: fixed bugs and memory + leaks in the W3C XML Schemas code + * xmlschemastypes.c: implemented nonPositiveInteger + * test/schemas/length2_0.xsd result/schemas/length2_0_0.err: + fixed the test and result. + +Thu Mar 27 22:23:07 CET 2003 Daniel Veillard + + * HTMLparser.c tree.c: two patches from James Bursa on the HTML + parser and a typo + * xmlschemastypes.c: reindenting, fixing a memory access + problem with dates. + +Thu Mar 27 15:53:35 CET 2003 Daniel Veillard + + * parser.c: fixing #109227 providing more context in case of + start/end tag mismatch + * python/tests/ctxterror.py python/tests/readererr.py: update the + tests accordingly + +Thu Mar 27 15:22:41 CET 2003 Daniel Veillard + + * xinclude.c: should fix #109327 errors on memory accesses + +Thu Mar 27 15:06:13 CET 2003 Daniel Veillard + + * HTMLtree.c: Fixed reopening of #78662

+ is an URI reference + +Wed Mar 26 22:38:39 CET 2003 Daniel Veillard + + * xpath.c: fixed bug #109160 on non-ASCII IDs + +Wed Mar 26 17:30:37 CET 2003 Daniel Veillard + + * parser.c: Norm suggested a nicer error message for xml:space values + errors + +Wed Mar 26 01:34:19 CET 2003 Daniel Veillard + + * xpath.c include/libxml/xpath.h: first part of the fix to + performance bug #108905, adds xmlXPathOrderDocElems() providing + document order for nodes. + * python/libxml.c: Python may require TRIO as Albert Chin pointed out + +Tue Mar 25 16:07:00 CET 2003 Daniel Veillard + + * xmlschemastypes.c: removing a warning with Sun compiler + bug #109154 + +Tue Mar 25 07:02:56 MST 2003 John Fleck + + * doc/xmllint.xml + * doc/xmllint.1 + update xmllint man page with --relaxng option + +Tue Mar 25 12:07:03 CET 2003 Daniel Veillard + + * python/setup.py.in : was missing "drv_libxml2.py" + +Mon Mar 24 19:38:05 CET 2003 Daniel Veillard + + * tree.c xpath.c: some changes related to the new way of + handling Result Value Tree, before 2.5.5 + +Mon Mar 24 16:36:23 CET 2003 Daniel Veillard + + * configure.in NEWS: preparing release 2.5.5 + * doc/* : updated the documentation and regenerated it. + +Mon Mar 24 14:56:01 CET 2003 Daniel Veillard + + * xpath.c: fixed some problems related to #75813 about handling + of Result Value Trees + +Sun Mar 23 22:57:20 CET 2003 Daniel Veillard + + * uri.c: applied a set of patches from Lorenzo Viali correcting + URI parsing errors. + +Sun Mar 23 22:00:14 CET 2003 Daniel Veillard + + * parser.c: validity status was not passed back when validating in + entities, but raised by Oliver Fischer + +Sun Mar 23 21:30:50 CET 2003 Daniel Veillard + + * HTMLtree.c: avoid escaping ',' in URIs + +Sun Mar 23 12:57:00 CET 2003 Daniel Veillard + + * parser.c: fixing bug #108976 get the ID/REFs to reference + the ID in the document content and not in the entity copy + * SAX.c include/libxml/parser.h: more checking of the ID/REF + stuff, better solution for #107208 + * xmlregexp.c: removed a direct printf, dohhh + * xmlreader.c: fixed a bug on streaming validation of empty + elements in entities + * result/VC/ElementValid8 test/VCM/v20.xml result/valid/xhtml1.xhtml: + cleanup of the validation tests + * test/valid/id* test/valid/dtds/destfoo.ent result/valid/id*: + added more ID/IDREF tests to the suite + +Sat Mar 22 23:38:08 CET 2003 Daniel Veillard + + * xmlreader.c: fixed #107043 removing 2 warnings with Sun One + compiler. + +Sat Mar 22 18:50:45 CET 2003 Daniel Veillard + + * relaxng.c: valgrind'ed and cleaned up a couple of memory issues. + +Sat Mar 22 16:15:50 CET 2003 Daniel Veillard + + * SAX.c: fix bug #107208 avoid false duplicates when ID/REFs are + defined in entities content + +Sat Mar 22 15:53:27 CET 2003 Daniel Veillard + + * SAX.c: Fixed validation bug #108858 on namespace names using + entities and reported by Brent Hendricks + * xmllint.c: report xmlTextReaderHasValue() result in --stream + --debug output. + +Sat Mar 22 13:32:39 CET 2003 Daniel Veillard + + * xmlreader.c: fixed bug #108801 reported by Malcolm Tredinnick + about the DocType node not being reported sometimes. + * python/tests/reader.py: added to test to the regression checks + +Sat Mar 22 01:57:40 CET 2003 Daniel Veillard + + * xmlreader.c: fixed bug #108546 on long CDATA (or text nodes) + reported by Edd Dumbill + +Sat Mar 23 01:00:24 CET 2003 Daniel Veillard + + * HTMLparser.c parser.c parserInternals.c: patch from + johan@evenhuis.nl for #107937 fixing some line counting + problems, and some other cleanups. + * result/HTML/: this result in some line number changes + +Fri Mar 21 22:19:14 CET 2003 Daniel Veillard + + * configure.in Makefile.am: fixed Red Hat bug #86118 use libxml2.spec + instead of libxml.spec + * relaxng.c: fixed some of the error reporting excessive + verbosity + * catalog.c debugXML.c valid.c xmlreader.c xmlschemas.c xpath.c + xmlschemastypes.c: removed some warnings from gcc + * doc/libxml2-api.xml: rebuilt + +Fri Mar 21 17:25:23 CET 2003 Daniel Veillard + + * relaxng.c: another optimization, for choice this time + * result/relaxng/spec1* result/relaxng/tutor12_1* + result/relaxng/tutor3_7: cleanups. + +Fri Mar 21 13:41:23 CET 2003 Daniel Veillard + + * relaxng.c: fixed xmlRelaxNGNodeMatchesList + * test/relaxng/testsuite.xml: augmented the test suite + * result/relaxng/spec1* result/relaxng/tutor12_1*: this fixes + some schemas validation tests in the presence of foreign + namespaces. + +Fri Mar 21 02:23:34 CET 2003 Daniel Veillard + + * relaxng.c: added another interleave speedup. + +Thu Mar 20 17:22:00 CET 2003 Daniel Veillard + + * xmlschemastypes.c: added integer and fixed one of the + IDREFS regression tests pbm + * result/relaxng/docbook_0.err: updated + +Wed Mar 19 21:58:47 CET 2003 Daniel Veillard + + * valid.c xmlschemastypes.c: attempt to cope with ID/IDREF(S) + declared both in the DTD and in the Schemas + * relaxng.c: more debug, added a big optimization for + * test/relaxng/testsuite.xml: augmented the testsuite + * test/relaxng/ result/relaxng: added the RelaxNG spec and a + DocBook example to the regression tests + +Wed Mar 19 11:34:10 CET 2003 Daniel Veillard + + * check-xsddata-test-suite.py: cosmetic change for output + * relaxng.c: try to minimize calls to malloc/free for states. + +Tue Mar 18 17:50:31 CET 2003 Daniel Veillard + + * tree.c: removed a warning + * xmlschemastypes.c: more cleanup, added ENTITY and ENTITIES + support + * check-relaxng-test-suite.py check-xsddata-test-suite.py: + cleanup/improvements of the regression tests batch + * test/relaxng/testsuite.xml: augmented libxml2 own testsuite + +Tue Mar 18 12:36:22 CET 2003 Daniel Veillard + + * relaxng.c: fixed error msg cleanup deallocation + * xmlschemastypes.c: added a function to handle lists of + atomic types, added support for IDREFS + +Tue Mar 18 01:28:15 CET 2003 Daniel Veillard + + * relaxng.c valid.c xmlschemastypes.c: added Datatype ID + and IDREF, usable from RelaxNG now + * include/libxml/xmlschemastypes.h: need to add a new interface + because the validation modifies the infoset + * test/relaxng/testsuite.xml: extended the testsuite + +Mon Mar 17 16:34:07 CET 2003 Daniel Veillard + + * relaxng.c: fixed the last core RelaxNG bug known #107083, + shemas datatype ID/IDREF support still missing though. + * xmlreader.c: fix a crashing bug with prefix raised by + Merijn Broeren + * test/relaxng/testsuite.xml: augmented the testsuite with + complex inheritance tests + +Sun Mar 16 18:45:50 CET 2003 Daniel Veillard + + * relaxng.c: switched back to the previous Relax-NG code base, + the derivation algorithm need severe constraining code to avoid + combinatorial explosion. Fixed the problem with Sebastian Rahtz + TEI based example and other bugs + * result/relaxng/*err: updated the results + * test/relaxng/testsuite.xml: started a new test suite + +Sat Mar 15 22:26:46 CET 2003 Daniel Veillard + + * relaxng.c include/libxml/relaxng.h: After coming to the conclusion + that the original RelaxNG validation code was un-fixeable, it got + rewritten to use the derivation algorithm from James Clark and + redebugged it (nearly) from scratch: + found 373 test schemas: 372 success 1 failures + found 529 test instances: 529 success 0 failures + +Tue Mar 11 12:08:23 CET 2003 Daniel Veillard + + * SAX.c parser.c: fix some recursion problems introduced in the + last release. + * relaxng.c: more debugging of the RNG validation engine, still + problems though. + +Mon Mar 10 14:10:47 CET 2003 Daniel Veillard + + * Makefile.am: stop generating wrong result file with * in name + * relaxng.c: fixing the include bug raised by Sebastian Rahtz + * result/relaxng/demo* test/relaxng/demo: added the tests from + Sebastian reproducing the problem. + +Sun Mar 9 18:02:31 MST 2003 John Fleck + + * doc/xmllint.1: regenerating man page from xmllint.xml to pick + up Aleksey's change + +Sun Mar 9 13:53:16 2003 Aleksey Sanin + + * xmllint.c doc/xmllint.xml: use $XMLLINT_INDENT environment + variable to control the indentation for the xmllint "--format" + option + +Sat Mar 8 14:27:43 CET 2003 Igor Zlatkovic + + * encoding.c: applied Gennady's patch against buffer overrun + +Fri Mar 7 19:29:40 CET 2003 Daniel Veillard + + * test/xsdtest/xsdtest.xml uri.c: after and exchange with James + Clark it appeared I had bug in URI parsing code ... + * relaxng.c include/libxml/relaxng.h: completely revamped error + reporting to not loose message from optional parts. + * xmllint.c: added timing for RNG validation steps + * result/relaxng/*: updated the result, all error messages changed + +Fri Mar 7 15:18:32 CET 2003 Daniel Veillard + + * xpath.c: fix bug #107804, the algorithm used for document order + computation was failing on attributes. + +Thu Mar 6 22:35:50 CET 2003 Daniel Veillard + + * valid.c: fix bug #107764 , possibility of buffer overflow + in xmlValidDebug() + +Wed Mar 5 17:41:37 CET 2003 Daniel Veillard + + * nanoftp.c include/libxml/nanoftp.h: adding xmlNanoFTPDele() + from Philipp Dunkel + +Wed Mar 5 10:57:09 CET 2003 Daniel Veillard + + * xmlschemastype.c: made powten array static it should not be exported + * HTMLparser.c: fix bug #107361 by reusing the code from the XML + parser function. + * testHTML.c: get rid of valgrind messages on the HTML SAX tests + +Fri Feb 28 00:23:00 CET 2003 Daniel Veillard + + * tree.c: fixed a node dump crash on attributes + * test/xsdtest/xsdtest.xml test/xsdtest/xsdtest.xsl: fixed + an URI test bug and get better output. + +Thu Feb 27 22:28:40 CET 2003 Daniel Veillard + + * check-xsddata-test-suite.py: give more infos + * relaxng.c: fix a bug reported by Sebastian Rahtz and + REF->DEF in attribute values. + +Thu Feb 27 21:09:32 CET 2003 Daniel Veillard + + * check-xsddata-test-suite.py test/xsdtest/xsdtest.xml + test/xsdtest/xsdtest.xsl: import of the XSD Datatype + regression tests from James Clark. + +Thu Feb 27 18:40:04 CET 2003 Daniel Veillard + + * relaxng.c xmlschemas.c xmlschemastypes.c + include/libxml/xmlschemastypes.h: added param support for relaxng + type checking, started to increment the pool of simple types + registered, still much work to be done on simple types and + facets checkings. + +Wed Feb 26 16:45:39 CET 2003 Daniel Veillard + + * entities.c: fixes again one of the problem raised by + James Clark in #106788 + +Wed Feb 26 15:46:48 CET 2003 Daniel Veillard + + * relaxng.c: Fixed a couple of problem raised by James Clark + in bug #107083, the support for ID/IDREF/IDREFS at the WXS + datatype level still not fixed though. + +Mon Feb 24 21:09:19 CET 2003 Daniel Veillard + + * configure.in: preparing release 2.5.4 + * doc/*: updated and rebuilt the docs + * relaxng.c: removed warnings + * result/relaxng/*: updated the results + +Mon Feb 24 20:53:17 CET 2003 Daniel Veillard + + * valid.c: fixes a DTD regexp generation problem. + +Mon Feb 24 20:12:57 CET 2003 Daniel Veillard + + * parser.c: fixes bug #105998 about false detection of + attribute consumption loop. + +Mon Feb 24 19:14:57 CET 2003 Daniel Veillard + + * xinclude.c: Fixes bug #106931 in XInclude entities merging. + +Mon Feb 24 18:50:35 CET 2003 Daniel Veillard + + * SAX.c: fixed bug #105992 + +Mon Feb 24 18:14:16 CET 2003 Daniel Veillard + + * tree.c: fixed xmlSetProp and al. when the node passed is not an + element. + * relaxng.c: fixed bugs 7.3 (though not complete) and memory leaks + found 373 test schemas: 369 success 4 failures + found 529 test instances: 525 success 4 failures + * check-relaxng-test-suite.py: added memory debug reporting + +Mon Feb 24 12:41:54 CET 2003 Daniel Veillard + + * uri.c parser.c: some warning removal on Igor's patch + * tree.c: seems I messed up with #106788 fix + * python/libxml.c: fixed some base problems when Python provides + the resolver. + * relaxng.c: fixed the interleave algorithm + found 373 test schemas: 364 success 9 failures + found 529 test instances: 525 success 4 failures + the resulting failures are bug in the algorithm from 7.3 and + lack of support for params + +Sun Feb 23 14:49:39 CET 2003 Daniel Veillard + + * parser.c: another fix for nodeinfo in entities problem + * tree.c entities.c: fixed bug #106788 from James Clark + some spaces need to be serialized as character references. + +Sat Feb 22 18:28:16 CET 2003 Igor Zlatkovic + + * parser.c uri.c: fixed the bug I introduced in the path + handling, reported by Sebastian Bergmann + +Sat Feb 22 00:19:48 CET 2003 Daniel Veillard + + * parser.c: fixing some nodeinfo in entities problem raised + by Glenn W. Bach + * relaxng.c: implemented the first section 7.3 check + * result/relaxng/*: updated the results + +Fri Feb 21 18:12:19 CET 2003 Daniel Veillard + + * relaxng.c: fixed some problems in the previous commit + and finished implementing 4.16 rules checking + found 373 test schemas: 353 success 20 failures + found 529 test instances: 519 success 6 failures + * result/relaxng/*: updated the results + +Fri Feb 21 16:37:39 CET 2003 Daniel Veillard + + * relaxng.c: implemented checks from section 7.2 + +Thu Feb 20 16:00:31 CET 2003 Daniel Veillard + + * relaxng.c: implemented the checks from section 7.1, fixed + some of the 4.20 and 4.21 problems. + found 373 test schemas: 338 success 35 failures + found 529 test instances: 519 success 6 failures + * result/relaxng/*: updated the results + +Thu Feb 20 01:09:24 CET 2003 Daniel Veillard + + * relaxng.c: implemented the 4.20 and 4.21 simplification rules. + * result/relaxng/*: updated the results + +Wed Feb 19 18:30:30 CET 2003 Daniel Veillard + + * relaxng.c: more bugfixes + * result/relaxng/*: updated the results + +Wed Feb 19 15:39:56 CET 2003 Igor Zlatkovic + + * DOCBparser.c: obsoleted xmlNormalizeWindowsPath + * HTMLparser.c: obsoleted xmlNormalizeWindowsPath + * SAX.c: ensured xmlDoc.URL is always canonic + * parser.c: obsoleted xmlNormalizeWindowsPath + * uri.c include/libxml/uri.h: introduced xmlCanonicPath + * xmlIO.c include/libxml/xmlIO.h: obsoleted xmlNormalizeWindowsPath + * win32/libxml2.def.src: added few exports + +Wed Feb 19 14:26:51 CET 2003 Daniel Veillard + + * Makefile.am configure.in: patched to have shared libraries + for Python regression tests and static binaries for gdb debug + in my development environment + * relaxng.c: more bugfixes + found 373 test schemas: 296 success 77 failures + found 529 test instances: 516 success 8 failures + * result/relaxng/*: updated the results + +Wed Feb 19 01:17:48 CET 2003 Daniel Veillard + + * relaxng.c: guess what ! Relax-NG bugfixing, what a surprize... + +Tue Feb 18 22:09:50 CET 2003 Daniel Veillard + + * xmlschemastypes.c: float/double check bugfix + * tree.c include/libxml/tree.h: exported a function for NMTOKEN + validation + * xmlreader.c: add a TODO for Jody + * relaxng.c: bugfix bugfix bugfix + found 373 test schemas: 300 success 73 failures + found 529 test instances: 507 success 10 failures + * result/relaxng/*: updated the results + +Tue Feb 18 00:33:17 CET 2003 Daniel Veillard + + * relaxng.c check-relaxng-test-suite.py: more RelaxNG bug hunting + +Mon Feb 17 18:23:32 CET 2003 Daniel Veillard + + * relaxng.c check-relaxng-test-suite.py: more work on the + RelaxNG implementation conformance testing. + found 373 test schemas: 284 success 89 failures + found 529 test instances: 448 success 47 failures + * result/relaxng/*: updated the results + +Sun Feb 16 16:48:38 CET 2003 Daniel Veillard + + * ChangeLog tree.c doc/libxml-doc.el doc/libxml2-api.xml: applied + a patch from Kjartan Maraas to fix some typos + +Sun Feb 16 16:40:52 CET 2003 Daniel Veillard + + * relaxng.c: more bug-hunting + * testRelax.c include/libxml/relaxng.h: added --tree to dump the + intermediate rng tree + * python/generator.py: patch from Stephane Bidoul to fix the generator + on python < 2.2 + +Fri Feb 14 17:49:26 CET 2003 Daniel Veillard + + * check-relaxng-test-suite.py relaxng.c: more testing on the + Relax-NG front, cleaning up the regression tests failures + current state and I forgot support for "mixed": + found 373 test schemas: 280 success 93 failures + found 529 test instances: 401 success 68 failures + * tree.c include/libxml/tree.h xmlschemastypes.c: finished and + moved the Name, NCName and QName validation routine in tree.c + * uri.c: fixed handling of URI ending up with #, i.e. having + an empty fragment ID. + * result/relaxng/*: updated the results + +Thu Feb 13 16:49:24 CET 2003 Daniel Veillard + + * check-xinclude-test-suite.py: improved the script accordingly + to the XInclude regression tests updates + * xpointer.c: Implemented XPointer element() Scheme W3C PR of 13 + November 2002 + * result/XPath/xptr/chapterschildseq result/XPath/xptr/vidchildseq + test/XPath/xptr/chapterschildseq test/XPath/xptr/vidchildseq: + augmented the Xpointer testsuite for the element() scheme + +Thu Feb 13 12:00:30 CET 2003 Daniel Veillard + + * relaxng.c: added TODO for the DTD compatibility spec + * xinclude.c: more bug fixes driven by the testsuite + +Tue Feb 11 19:01:02 CET 2003 Daniel Veillard + + * check-xinclude-test-suite.py xinclude.c: Work on the W3C/NIST + regression tests for XInclude, improved the script, improving + XInclude error reporting mechanism + +Mon Feb 10 17:19:14 CET 2003 Daniel Veillard + + * NEWS doc/* configure.in: preparing release 2.5.3 + +Mon Feb 10 17:11:22 CET 2003 Daniel Veillard + + * tree.c: trying to fix #104934 about some XHTML1 serialization + issues. + +Mon Feb 10 16:41:13 CET 2003 Daniel Veillard + + * encoding.c xmlIO.c: fixing bug #104646 about iconv based + encoding conversion when the input buffer stops in the + middle of a multibyte char + +Mon Feb 10 15:24:47 CET 2003 Daniel Veillard + + * test/relaxng/OASIS/spectest.xml: OASIS RelaxNG testsuite + * check-relaxng-test-suite.py: python script to run regression + against OASIS RelaxNG testsuite + * relaxng.c: some cleanup tweaks + * HTMLparser.c globals.c: cleanups in comments + * doc/libxml2-api.xml: updated the API + * result/relaxng/*: errors moved files, so large diffs but + no changes at the semantic level. + +Mon Feb 10 01:00:31 CET 2003 Daniel Veillard + + * tree.c: fixing #105678 problem when dumping a namespace node. + +Mon Feb 10 00:30:01 CET 2003 Daniel Veillard + + * xpath.c: fixed doc comment problems + * python/generator.py python/libxml_wrap.h python/types.c: adding + RelaxNG wrappers + * python/tests/Makefile.am python/tests/relaxng.py: added a specific + test of those early Python RelaxNG bindings + +Sun Feb 9 15:18:43 CET 2003 Daniel Veillard + + * libxml.spec.in: fixes a libtool problem on AMD 64bits builds + * relaxng.c: found the validation problem I had with interleave + when not covering all remaining siblings + * Makefile.am test.relaxng/* result/relaxng/*: augmented the + testsuite and check the RNG schemas against the RNG schemas + given in appendix A + +Sat Feb 8 18:55:43 CET 2003 Igor Zlatkovic + + * win32/Makefile.msvc: updates for RelaxNG + * win32/Makefile.mingw: updates for RelaxNG + * win32/libxml2.def.src: added RelaxNG exports + +Fri Feb 7 14:00:53 CET 2003 Daniel Veillard + + * xinclude.c: applied another bug fix from Sean Chittenden + +Fri Feb 7 13:34:08 CET 2003 Daniel Veillard + + * configure.in xmllint.c: I f...ed up the default configuration + of schemas and --relaxng option display in xmllint, pointed by + Morus Walter. + * xlink.c: Sean Chittenden pointed a couple of errors in the XLink + detection module, fixes bug #105374. + +Fri Feb 7 01:43:38 CET 2003 Daniel Veillard + + * xmlschemastypes.c: added the boolean base type. + +Thu Feb 6 10:23:52 CET 2003 Daniel Veillard + + * xmlschemastypes.c: started implementing some of the missing + default simple types + * result/relaxng/*: updated the results + +Wed Feb 5 15:28:04 CET 2003 Daniel Veillard + + * NEWS doc/*: updated the docs, ready for 2.5.2 release + +Wed Feb 5 14:15:59 CET 2003 Daniel Veillard + + * HTMLparser.c tree.c xmlIO.c: comments cleanups + * Makefile.am: use xmllint for doing the RelaxNG tests + * configure.in: preparing 2.5.2 made schemas support default to + on instead of off + * relaxng.c: removed the verbosity + * xmllint.c: added --relaxng option + * python/generator.py python/libxml_wrap.h: prepared the integration + of the new RelaxNG module and schemas + * result/relaxng/*: less verbose output + +Wed Feb 5 12:00:36 CET 2003 Daniel Veillard + + * valid.c: do not run content model validation if the + content is not determinist + +Wed Feb 5 11:43:58 CET 2003 Daniel Veillard + + * SAX.c: added the redefinition of namespaced attribute + check that was missing as Fabrice Desré pointed out. + +Wed Feb 5 11:09:29 CET 2003 Daniel Veillard + + * HTMLparser.c include/libxml/HTMLparser.h: applied HTML + improvements from Nick Kew, allowing to do more checking + to HTML elements and attributes. + +Tue Feb 4 23:47:06 CET 2003 Daniel Veillard + + * xinclude.c: fixing bug #105137 about entities declaration + needing to be copied to the including document. + +Tue Feb 4 20:26:22 CET 2003 Daniel Veillard + + * catalog.c: fixed bug #104817 with delegateURI + * xpath.c: fixing bugs #104123 and #104125 + +Tue Feb 4 17:12:56 CET 2003 Daniel Veillard + + * configure.in valid.c xmlreader.c python/libxml_wrap.h + python/types.c: fixing #104096 to compile without regexps + +Tue Feb 4 16:31:55 CET 2003 Daniel Veillard + + * valid.c: fixing bug #103969 forgot to add an epsilon transition + when building the automata for elem* + +Tue Feb 4 16:21:07 CET 2003 Daniel Veillard + + * HTMLparser.c: applied patch from Arne de Bruijn fixing + bug #103827 + +Tue Feb 4 16:17:09 CET 2003 Daniel Veillard + + * HTMLparser.c: updating a comment, fixing #103776 + +Tue Feb 4 16:05:53 CET 2003 Daniel Veillard + + * parser.c: fixing bug 105049 for validity checking of content + within recursive entities. + +Tue Feb 4 15:40:54 CET 2003 Daniel Veillard + + * HTMLparser.c: try to fix # 105049 + * relaxng.c xmlschemastypes.c: a couple of changes and extensions + * tree.c: updated a function comment + +Tue Feb 4 00:20:58 CET 2003 Daniel Veillard + + * relaxng: more work on grammars and refs/defs + * test/relaxng/* result/relaxng/*: augmented/updated the + regression tests + +Mon Feb 3 14:16:59 CET 2003 Daniel Veillard + + * relaxng: more work on name classes, except support + * test/relaxng/* result/relaxng/*: augmented/updated the + regression tests + +Mon Feb 3 11:56:05 CET 2003 Daniel Veillard + + * relaxng: more work on name classes, the "validate all" schemas + seems to work now. + * test/relaxng/* result/relaxng/*: augmented/updated the + regression tests + +Mon Feb 3 09:50:26 CET 2003 Daniel Veillard + + * python/libxml.c: removed an unprotedted debug message Aleksi Suhonen + * parser.c: put a guard against infinite document depth, basically + trying to avoid another kind of DoS attack. + * relaxng.c: some code w.r.t. nameClasses + +Sun Feb 2 17:01:43 CET 2003 Daniel Veillard + + * test/relaxng/* result/relaxng/*: check all the namespace support + was actually correct based on tutorial section 10. + +Sun Feb 2 15:33:38 CET 2003 Daniel Veillard + + * relaxng: include seems to work okay now + * test/relaxng/* result/relaxng/*: augmented/updated the + regression tests + +Sat Feb 1 19:44:58 CET 2003 Daniel Veillard + + * relaxng.c: a bit of work done in the train back. + * test/relaxng/*: added one of the include tests + +Thu Jan 30 14:06:55 CET 2003 Daniel Veillard + + * relaxng: more work done in the train + * test/relaxng/* result/relaxng/*: augmented/updated the + regression tests + +Wed Jan 29 23:44:58 CET 2003 Daniel Veillard + + * relaxng.c: debugging of externalRef + * test/relaxng/* result/relaxng/*: augmented/updated the + regression tests + +Wed Jan 29 22:06:04 CET 2003 Daniel Veillard + + * relaxng.c: more work on Relax-NG, implementing externalRef + * test/relaxng/* result/relaxng/*: augmented/updated the + regression tests + * Makefile.am: cleanup to Relaxtests target + +Wed Jan 29 00:08:38 CET 2003 Daniel Veillard + + * relaxng.c: more work on Relax-NG, implementing interleave + * test/relaxng/* result/relaxng/*: augmented/updated the + regression tests + +Tue Jan 28 21:56:49 CET 2003 Daniel Veillard + + * relaxng.c: more work on Relax-NG, implementing interleave + * test/relaxng/* result/relaxng/*: augmented/updated the + regression tests + +Mon Jan 27 07:35:29 MST 2003 John Fleck + + * doc/tutorial/customfo.xsl + * doc/tutorial/customhtml.xsl + adding stylesheet customizations used to generate fo + for pdf and html + +Mon Jan 27 13:29:43 CET 2003 Daniel Veillard + + * relaxng.c: more work on Relax-NG + * test/relaxng/* result/relaxng/*: augmented/updated the + regression tests + * xmlschemastypes.c: added a number of base type definition but not + the associated checks, those are still TODOs + +Sun Jan 26 17:37:06 MST 2003 John Fleck + + in docs/tutorial: + * apa.html + * apb.html + * apc.html + * apd.html + * ape.html + * apf.html + * apg.html + * ar01s02.html + * ar01s03.html + * ar01s04.html + * ar01s05.html + * ar01s06.html + * ar01s07.html + * ar01s08.html + * index.html + * xmltutorial.pdf + * xmltutorial.xml + add index to tutorial + +Sun Jan 26 17:02:29 MST 2003 John Fleck + + * doc/xmlcatalog.1 + * doc/xmlcatalog_man.html + * doc/xmlcatalog_man.xml + belatedly fixing bug #93622 (adds rewriteURI type to + "--add" option in xmlcatalog man page + +Sun Jan 26 20:47:26 CET 2003 Daniel Veillard + + * xmlcatalog.c xmllint.c: applied patch for NetBSD by + Julio Merino, closing #104475 + +Sun Jan 26 20:38:43 CET 2003 Daniel Veillard + + * relaxng.c: more work on Relax-NG + * test/relaxng/* result/relaxng/*: augmented/updated the + regression tests + +Sun Jan 26 01:49:58 CET 2003 Daniel Veillard + + * relaxng.c: more work on Relax-NG + * test/relaxng/* result/relaxng/*: augmented/updated the + regression tests + +Sat Jan 25 18:59:54 CET 2003 Daniel Veillard + + * README: updated the policy on private mail answers + * relaxng.c: more work on Relax-NG + * test/relaxng/* result/relaxng/*: augmented/updated the + regression tests + +Fri Jan 24 15:12:44 CET 2003 Daniel Veillard + + * error.c parser.c tree.c: applied a documentation patch from + Stefan Kost + +Fri Jan 24 02:00:50 CET 2003 Daniel Veillard + + * relaxng.c: more work on Relax-NG + * doc/*: regenerated the docs + * test/relaxng/* result/relaxng/*: updated and augmented the + Relax-NG regression tests and results + +Thu Jan 23 19:26:20 CET 2003 Daniel Veillard + + * Makefile.am configure.in relaxng.c include/libxml/relaxng.h: + First commit of the new Relax-NG validation code, not generally + useful yet. + * test/relaxng/* result/relaxng/*: current state of the regression + tests + +Thu Jan 23 19:22:54 CET 2003 Daniel Veillard + + * tree.c: minimized the memory allocated for GetContent + and a bit of cleanup. + +Thu Jan 23 17:41:37 CET 2003 Daniel Veillard + + * python/generator.py: seems there is no good reasons to + not generate bindings for XPointer + +Tue Jan 21 13:19:35 CET 2003 Daniel Veillard + + * xmlreader.c doc/apibuild.py: applied a new patch from + Stéphane Bidoul for cleanups + * doc/libxml2-api.xml: rebuilt the API description with + new entry points + +Mon Jan 20 23:25:00 CET 2003 Daniel Veillard + + * xmlreader.c python/drv_libxml2.py python/generator.py + python/libxml.c python/libxml.py python/libxml_wrap.h + python/types.c: patch from Stéphane Bidoul for better per + context error message APIs + * python/tests/ctxterror.py python/tests/readererr.py: + update of the tests + +Sun Jan 19 17:09:28 MST 2003 John Fleck + + * doc/guidelines.html + grammar and spelling cleanup + +Fri Jan 17 00:31:30 CET 2003 Daniel Veillard + + * xmlreader.c include/libxml/xmlreader.h python/generator.py + python/libxml.c python/libxml.py win32/libxml2.def.src: applied + a patch from Stéphane Bidoul to allow per XMLtextReader error + and warning handling + * python/tests/Makefile.am python/tests/readererr.py: adding the + specific regression test + +Tue Jan 14 17:00:08 CET 2003 Daniel Veillard + + * xpath.c: Alexey Efimov pointed out that concat('a', 'b', ) + should raise a syntax error + +Tue Jan 14 15:39:14 CET 2003 Daniel Veillard + + * python/libxml.c: cleanup patch from Stéphane Bidoul + +Tue Jan 14 14:41:18 CET 2003 Daniel Veillard + + * encoding.c: fixing bug #103100 with a dummy UTF8ToUTF8 copy + +Tue Jan 14 12:40:29 CET 2003 Daniel Veillard + + * python/generator.py python/libxml.c python/libxml.py + python/libxml_wrap.h python/types.c: applied and fixed a patch + from Stéphane Bidoul to provide per parser error handlers at the + Python level. + * python/tests/Makefile.am python/tests/ctxterror.py: added a + regression test for it. + +Tue Jan 14 01:15:04 CET 2003 Daniel Veillard + + * xmlreader.c: fixed the streaming property of the reader, + it was generating tree faster than consuming it. Pointed out + by Nate Myers + * tree.c: fixed a bug in xmlSaveFormatFileEnc if passed a NULL doc + +Sun Jan 12 22:18:02 CET 2003 Igor Zlatkovic + + * win32/libxml2.def.src: added more xmlreader and other exports + +Fri Jan 10 18:04:32 CET 2003 Daniel Veillard + + * xpath.c: fix to the XPath implementation for parent and + ancestors axis when operating on a Result Value Tree. + Fixes bug #100271 + +Fri Jan 10 17:07:01 CET 2003 Daniel Veillard + + * nanoftp.c nanohttp.c xmlIO.c: patch from Stefano Zacchiroli + to fix some URI/file escaping problems + +Fri Jan 10 16:20:34 CET 2003 Daniel Veillard + + * python/generator.py: fixed a bug raised by Raymond Wiker, + docSetRootElement() should not raise an exception if the + return is None + +Fri Jan 10 14:13:03 CET 2003 Daniel Veillard + + * python/libxml.py python/libxml.c python/libxml2-python-api.xml: + fixed bug #102181 by applying the suggested change and fixing + the generation/registration problem. + +Fri Jan 10 13:47:55 CET 2003 Daniel Veillard + + * HTMLparser.c: fixed bug #102960 by reusing the XML name parsing + routines. + +Fri Jan 10 00:16:49 CET 2003 Daniel Veillard + + * parser.c: one more IsEmptyElement crazyness, that time in + external parsed entities if substitution is asked. + * python/tests/reader3.py: added a specific test. + +Thu Jan 9 22:35:31 CET 2003 Daniel Veillard + + * python/drv_libxml2.py: update from Stéphane Bidoul: python 2.1 + support and improved error handler registration + +Thu Jan 9 14:16:38 CET 2003 Daniel Veillard + + * HTMLtree.c tree.c: fixes #102920 about namespace handling in + HTML output and section 16.2 "HTML Output Method" of XSLT-1.0 + * README: fixed a link + +Wed Jan 8 18:32:25 CET 2003 Daniel Veillard + + * configure.in doc/* NEWS: preparing 2.5.1 release + * SAX.c parser.c: fixing XmlTextReader bug + +Wed Jan 8 00:13:01 CET 2003 Daniel Veillard + + * SAX.c: fuck, I introduced a memory leak on external parsed + entities in 2.5.0 :-( + +Tue Jan 7 12:12:45 CET 2003 Daniel Veillard + + * xmllint.c: another fix needed as pointed by Christophe Merlet + for --stream --debug if compiled without debug support. + +Mon Jan 6 20:53:08 MST 2003 John Fleck + + * doc/xmllint.xml + * doc/xmllint.1: + update man page with --stream and --chkregister + +Tue Jan 7 01:17:26 CET 2003 Daniel Veillard + + * globals.c: fixed --with-threads compile + * xmllint.c: fixed --without-debug compile + * include/libxml/globals.h: cleanup + * include/libxml/schemasInternals.h: add a missing include + +Mon Jan 6 14:06:07 CET 2003 Daniel Veillard + + * configure.in NEWS: preparing 2.5.0 release + * SAX.c: only warn in pedantic mode about namespace name + brokeness + * globals.c: fix a doc generation problem + * uri.c: fix #101520 + * doc/*: updated and rebuilt the doc for the release, includuding + stylesheet update + * python/Makefile.am: fix a filename bug + +Mon Jan 6 12:05:12 CET 2003 Daniel Veillard + + * doc/tutorial/* : fixed #101894 if doc == NULL xmlFreeDoc + should not be called. + +Mon Jan 6 11:59:09 CET 2003 Daniel Veillard + + * libxml-2.0.pc.in: applied the patch to fix #101894 + +Sun Jan 5 23:35:47 CET 2003 Daniel Veillard + + * tree.c : applied patch from Lukas Schroeder for register callbacks + * valid.c: modified patch from Lukas Schroeder to test + register callbacks with --chkregister + +Sun Jan 5 02:23:20 CET 2003 Daniel Veillard + + * xmlreader.c: seriously changed the way data are pushed to + the underlying parser, go by block of 512 bytes instead of + tryng to detect tag boundaries at that level. Changed the + way empty element are detected and tagged. + * python/tests/reader.py python/tests/reader2.py + python/tests/reader3.py: small changes mostly due to context + reporting being different and DTD node being reported. Some + errors previously undetected are now caught and fixed. + * doc/xmlreader.html: flagged last section as TODO + +Sat Jan 4 20:40:28 CET 2003 Daniel Veillard + + * python/libxml.py: integrated the Python 2.2 optimizations + from Hannu Krosing, while maintaining compatibility with + 1.5 and 2.1 + +Sat Jan 4 17:33:17 CET 2003 Daniel Veillard + + * xmllint.c: a bit of cleanup + * xmlreader.c: small fix + * doc/xmlreader.html: more work on the XmlTextReader tutorial + * python/libxml.py: a few fixes pointed out by Hannu Krosing + +Sat Jan 4 13:46:14 CET 2003 Daniel Veillard + + * python/setup.py.in: patch from Stéphane Bidoul to include + drv_libxml2.py in setup.py + +Sat Jan 4 01:43:06 CET 2003 Daniel Veillard + + * doc/xmlreader.html: starting documenting the new XmlTextReader + interface. + +Fri Jan 3 17:18:32 CET 2003 Daniel Veillard + + * xmllint.c: added the --stream flag to use the TextReader API + * xmlreader.c: small performance tweak + +Fri Jan 3 13:50:55 CET 2003 Daniel Veillard + + * xmlreader.c python/tests/reader2py: okay the DTD validation + code on top of the XMLTextParser API should be solid now. + +Fri Jan 3 02:17:18 CET 2003 Daniel Veillard + + * xmlreader.c python/tests/reader2py: Fixing some more mess + with validation and recursive entities while using the + reader interface, it's getting a bit messy... + +Thu Jan 2 15:15:26 CET 2003 Daniel Veillard + + * xmlreader.c python/tests/reader.py: another couple of problem + related to IsEmptyElement reported by Stéphane Bidoul needed + some fixes. + +Thu Jan 2 13:57:07 CET 2003 Daniel Veillard + + * libxml.spec.in python/Makefile.am python/drv_libxml2.py: + integrated drv_libxml2.py Python xml.sax driver from Stéphane Bidoul + based on the python XmlTextReader interface. + +Wed Jan 1 22:05:40 CET 2003 Daniel Veillard + + * tree.c: backing out one change in the last patch which broke the + regression tests + +Wed Jan 1 21:57:28 CET 2003 Daniel Veillard + + * global.data globals.c tree.c include/libxml/globals.h: applied + an old patch from Lukas Schroeder to track node creation and + destruction. Probably missing a lot of references at the moment + and not usable reliably. + +Wed Jan 1 20:12:07 CET 2003 Daniel Veillard + + * NEWS doc/Makefile.am doc/news.xsl: generate the NEWS file + from doc/news.html and a stylesheet + +Wed Jan 1 16:09:57 CET 2003 Daniel Veillard + + * xmlreader.c python/tests/reader.py: fixed another couple of + xmlreader bugs reported by Stéphane Bidoul and added tests. + +Wed Jan 1 15:42:54 CET 2003 Daniel Veillard + + * xmlreader.c python/tests/reader2.py: fixed another validity + checking in external parsed entities raised by Stéphane Bidoul + and added a specific regression test. + * python/tests/reader3.py: cleanup + +Tue Dec 31 15:44:02 CET 2002 Daniel Veillard + + * xmlreader.c python/tests/reader2.py: fixed a problem with + validation within entities pointed by Stéphane Bidoul, augmented + the tests to catch those. + +Tue Dec 31 12:15:37 CET 2002 Daniel Veillard + + * python/generator.py: modified the generator to allow keeping + class references when creating new classes, needed to fix a bug + pointed by Stéphane Bidoul where the input buffer of the + xmlTextReader instance gets destroyed if the python wrapper for + the input is not referenced anymore. + +Mon Dec 30 19:39:36 CET 2002 Daniel Veillard + + * xmlreader.c python/tests/reader.py: fixed another pair of problem + pointed by Stéphane Bidoul: depth start at 0 and a parse problem. + +Mon Dec 30 13:36:50 CET 2002 Daniel Veillard + + * xmlreader.c python/tests/reader.py: fixed another problem + pointed by Stéphane Bidoul + +Mon Dec 30 12:39:55 CET 2002 Daniel Veillard + + * xmlreader.c python/tests/reader.py: fixed a limit case problem + with "" + +Mon Dec 30 11:53:44 CET 2002 Daniel Veillard + + * SAX.c: warn on xmlns:prefix="foo" + * xmlreader.c python/tests/reader.py: fixed a couple of problem + for namespace attributes handling. + +Mon Dec 30 00:59:07 CET 2002 Daniel Veillard + + * entities.c parser.c tree.c include/libxml/entities.h: Fixed + a really nasty problem raised by a DocBook XSLT transform + provided by Sebastian Bergmann + +Sun Dec 29 12:13:18 CET 2002 Daniel Veillard + + * xmlreader.c python/tests/reader.py: fixed a bug pointed out + by Stéphane Bidoul and integrated it into the tests + +Sat Dec 28 23:49:12 CET 2002 Daniel Veillard + + * xmlreader.c include/libxml/xmlreader.h doc/libxml2-api.xml: + extended the XmlTextReader API a bit, addding accessors for + the current doc and node, and an entity substitution mode for + the parser. + * python/libxml.py python/libxml2class.txt: related updates + * python/tests/Makefile.am python/tests/reader.py + python/tests/reader2.py python/tests/reader3.py: updated a bit + the old tests and added a new one to test the entities handling + +Sat Dec 28 22:11:57 CET 2002 Daniel Veillard + + * python/generator.py python/libxml2class.txt + python/tests/reader.py python/tests/reader2.py: changed the + generator to provide casing for the XmlTextReader similar to + C# so that examples and documentation are more directly transposable. + Fixed the couple of tests in the suite. + +Sat Dec 28 15:55:32 CET 2002 Daniel Veillard + + * doc/guidelines.html: added a document on guildeline for + publishing and deploying XML + +Fri Dec 27 20:35:15 CET 2002 Daniel Veillard + + * valid.c xmlreader.c: final touch running DTD validation + on the XmlTextReader + * python/tests/Makefile.am python/tests/reader2.py: added a + specific run based on the examples from test/valid/*.xml + +Fri Dec 27 15:17:20 CET 2002 Daniel Veillard + + * python/libxml.py: added a few predefined xmlTextReader parser + configuration values. + +Fri Dec 27 12:57:22 CET 2002 Daniel Veillard + + * python/libxml_wrap.h: trying to fix #102037 + +Fri Dec 27 12:18:14 CET 2002 Daniel Veillard + + * SAX.c: fixing bug #95296, when the predefined entities + are redefined in the DTD the default one must be used + instead anyway. + +Wed Dec 25 19:22:06 MST 2002 John Fleck + + * doc/xmllint.xml + * doc/xmllint.1 + Add discussion of XML_DEBUG_CATALOG to xmllint man + page - bug #100907 + +Mon Dec 23 16:54:22 CET 2002 Daniel Veillard + + * xmlreader.c: Fixed the empty node detection to avoid reporting + an inexistant close tag. + +Mon Dec 23 15:42:24 CET 2002 Daniel Veillard + + * python/libxml.c python/setup.py.in: patch from Stéphane Bidoul + for Python 2.1 + +Sun Dec 22 11:24:06 CET 2002 Daniel Veillard + + * testC14N.c vms/config.vms: applied Craig A. Berry patches for VMS + +Fri Dec 20 11:27:49 CET 2002 Daniel Veillard + + * doc/libxml2-api.xml python/tests/reader.py: one really need + to provide the base URI information when creating a reader parser + from an input stream. Updated the API and the example using it. + +Fri Dec 20 01:11:30 CET 2002 Daniel Veillard + + * testReader.c xmlreader.c valid.c include/libxml/tree.h + include/libxml/valid.h include/libxml/xmlreader.h: working on + DTD validation on top of xml reader interfaces. Allows to + validate arbitrary large instances. This required some extensions + to the valid module interface and augmenting the size of xmlID + and xmlRef structs a bit. + * uri.c xmlregexp.c: simple cleanup. + +Wed Dec 18 15:51:22 CET 2002 Daniel Veillard + + * xmlreader.c include/libxml/xmlreader.h doc/libxml2-api.xml: more + work on the xml reader interfaces. + * AUTHORS MAINTAINERS doc/* win32/*: updated Igor's mail and the + Web page for the Windows binaries. + +Tue Dec 17 19:31:07 CET 2002 Daniel Veillard + + * xmlIO.c: applied a patch for VMS following the report by + Nigel Hall + +Tue Dec 17 11:29:41 CET 2002 Daniel Veillard + + * parser.c: the parseStartTag bug fix wasn't complete. + +Mon Dec 16 23:00:05 CET 2002 Daniel Veillard + + * parser.c: Vyacheslav Pindyura managed to trigger a bug in + parseStartTag, fixing it. + * test/att4 result/att4 result/noent/att4: adding the test + * xmlreader.c include/libxml/xmlreader.h doc/libxml2-api.xml: added + more methods to XmlTextReader. + +Mon Dec 16 19:31:16 CET 2002 Igor Zlatkovic + + * win32/libxml2.def.src: added more xml reader exports + * win32/Makefile.msvc win32/Makefile.mingw: added xml reader interface + to the build + +Mon Dec 16 06:36:54 MST 2002 John Fleck + + * doc/tutorial/xmltutorial.xml + plus generated html and pdf + Updating tutorial again based on further comments from Niraj + Tolia on the last iteration + +Sun Dec 15 21:27:30 MST 2002 John Fleck + + * doc/tutorial/xmltutorial.xml + * doc/tutorial/includekeyword.c + * doc/tutorial/includegetattribute.c + plus generated html and pdf + Adding fix from Niraj Tolia to tutorial to properly free memory. + +Mon Dec 16 00:34:25 CET 2002 Daniel Veillard + + * xmlreader.c include/libxml/xmlreader.h doc/libxml2-api.xml: added + more methods of XmlTextReader. + * python/libxml2class.txt python/tests/reader.py: this increased the + methods in the bndings, augmented the test to check those new + functions. + +Sat Dec 14 23:57:39 CET 2002 Daniel Veillard + + * xmlreader.c doc/libxml2-api.xml: added the close and getattribute + methods of XmlTextReader. + * python/generator.py python/libxml_wrap.h python/types.c + python/libxml2class.txt: added the reader to the Python bindings + * python/tests/Makefile.am python/tests/reader.py: added a specific + test for the Python bindings of the Reader APIs + * parser.c: small cleanup. + +Fri Dec 13 11:39:44 CET 2002 Daniel Veillard + + * xinclude.c: fallback was only copying the first child not the + full child list of the fallback element, closes #89684 as reopened + by Bernd Kuemmerlen + +Thu Dec 12 13:34:59 CET 2002 Igor Zlatkovic + + * win32/libxml2.def.src: exported htmlNodeDumpOutput + +Thu Dec 12 10:59:11 CET 2002 Daniel Veillard + + * configure.in: preparing release of 2.4.30 + * doc/apibuild.py doc/libxml2-api.xml: fixups to the api builder, + gives enum values, fix functype return type, put back fields in + structs + * doc/*: updated the docs rebuilt + +Thu Dec 12 01:09:34 CET 2002 Daniel Veillard + + * HTMLtree.c include/libxml/HTMLtree.h: patch from Mark Vakoc + about htmlNodeDumpOutput location. + * xpath.c: removed an undefined function signature + * doc/apibuild.py doc/libxml2-api.xml: the script was exporting + too many symbols in the API breaking the python bindings. + Updated with the libxslt/libexslt changes. + +Wed Dec 11 20:26:15 CET 2002 Daniel Veillard + + * configure.in: preparing release of 2.4.29 + * doc/*: rebuilt the docs and API + * xmlreader.c: a few more fixes for the XmlTextReader API + +Wed Dec 11 18:01:15 CET 2002 Igor Zlatkovic + + * include/win32config.h: applied mingw patch from Magnus Henoch + +Wed Dec 11 16:58:48 CET 2002 Daniel Veillard + + * catalog.c doc/libxml2-api.xml: a bit more cleanup + +Wed Dec 11 14:54:47 CET 2002 Daniel Veillard + + * doc/apibuild.py doc/libxml2-api.xml doc/Makefile.am: new API + building Python script, does the C parsing directly, generates + a better API description including structure fieds defs and + enums. Still a couple of bugs, but good enough for the python + wrappers now. + * DOCBparser.c SAX.c nanohttp.c parser.c parserInternals.c tree.c + valid.c xmlIO.c xmlmemory.c xmlreader.c xmlregexp.c xmlschemas.c + include/libxml/schemasInternals.h include/libxml/tree.h: more + cleanup based on the python analysis script reports. + * libxml.spec.in: make sure the API XML description is part of the + devel package. + +Tue Dec 10 16:16:34 CET 2002 Daniel Veillard + + * DOCBparser.c HTMLparser.c c14n.c debugXML.c encoding.c hash.c + nanoftp.c nanohttp.c parser.c parserInternals.c testC14N.c + testDocbook.c threads.c tree.c valid.c xmlIO.c xmllint.c xmlmemory.c + xmlreader.c xmlregexp.c xmlschemas.c xmlschemastypes.c xpath.c: + code cleanup, especially the function comments. + * tree.c: fixed a small bug when freeing nodes which are XInclude ones. + +Mon Dec 9 15:08:17 CET 2002 Daniel Veillard + + * Makefile.am xmlreader.c include/libxml/Makefile.am + include/libxml/xmlreader.h: Adding a new set of APIs based on + the C# TextXmlReader API but converted to C. Allow to parse + in constant memory usage, far simpler to program and explain + than the SAX like APIs, unfinished but working. + * testReader.c: test program + +Sun Dec 8 18:36:01 CET 2002 Igor Zlatkovic + + * win32/libxml2.def.src: applied YALDSP from Mark Vakoc + +Wed Dec 4 16:08:49 CET 2002 Daniel Veillard + + * tree.c: Chip turner indicated that XHTML1 serialization + rule for style actually break on both IE and Mozilla, + try to avoid the rule if escaping ain't necessary + +Wed Dec 4 12:43:28 CET 2002 Daniel Veillard + + * nanhttp.c: handle HTTP URL escaping, problem reported by + Glen Nakamura and Stefano Zacchiroli + +Sat Nov 30 12:19:17 CET 2002 Daniel Veillard + + * DOCBparser.c HTMLparser.c parser.c valid.c xpath.c: code cleanup + +Thu Nov 28 12:53:22 CET 2002 Daniel Veillard + + * uri.c: Johann Richard pointed out some XPointer problems for + URN based URI references in XInclude. Modified the URI parsing + and saving routines to allow correct parsing and saving of + XPointers, especially when attached to "opaque" scheme accordingly + to RFC 2396 + +Wed Nov 27 20:36:08 CET 2002 Daniel Veillard + + * HTMLtree.c include/libxml/HTMLtree.h: applied the same kind + of refactoring to the HTML saving code. + * doc/libxml2-*.xml doc/API*.html: slight API changes got reflected + in the doc. + +Wed Nov 27 12:40:16 CET 2002 Daniel Veillard + + * tree.c include/libxml/tree.h: refactored the XML dump of a node + to a buffer API to reuse the generic dump to an OutputIO layer, + this reduces code, fixes xmlNodeDump() for XHTML, also made + xmlNodeDump() now return the number of byte written. + +Wed Nov 27 09:00:00 CET 2002 Daniel Veillard + + * python/setup.py.in: another patch from Stéphane Bidoul for + Python bindings on Windows + * doc/parsedecl.py: small cleanup + +Mon Nov 25 17:28:53 CET 2002 Daniel Veillard + + * libxml.spec.in configure.in: add a line in %changelog for releases + +Mon Nov 25 14:18:27 CET 2002 Daniel Veillard + + * parser.c: patch from Marcus Clarke fixing a problem in entities + parsing that was detected in KDe documentations environment. + +Mon Nov 24 14:13:21 CET 2002 ERDI Gergo + + * python/libxml.c (libxml_prev): Return the previous as opposed to + the next node (I guess this is the result of some cut & paste programming:) + +Sat Nov 23 17:22:22 CET 2002 Daniel Veillard + + * doc/Makefile.am: Jan Rafaj pointed a bug in the Makefile. + +Sat Nov 23 12:21:24 CET 2002 Daniel Veillard + + * python/generator.py python/libxml.c python/setup.py.in: trying + to fix the Python bindings build on Windows (Stéphane Bidoul) + +Fri Nov 22 22:41:34 CEST 2002 Igor Zlatkovic + + * win32/configure.js: added option for python bindings + * win32/libxml2.def.src: added more exports + +Fri Nov 22 18:50:34 CET 2002 Igor Zlatkovic + + * win32/Makefile.mingw: fixed unresolved symbols when linking with + pthreads + * win32/wince/*: applied updates to Windows CE port from Javier + +Fri Nov 22 15:51:22 CET 2002 Daniel Veillard + + * configure.in: preparing 2.4.28 + * libxml.spec.in doc/Makefile.am: some cleanup + * doc/*: updated the news and regenerated. + +Fri Nov 22 14:15:14 CET 2002 Daniel Veillard + + * HTMLparser.c: final touch at closing #87235

end tags + need to be generated. + * result/HTML/cf_128.html result/HTML/test2.html result/HTML/test3.html: + this change slightly the output of a few tests + * doc/*: regenerated + +Fri Nov 22 13:26:19 CET 2002 Daniel Veillard + + * parserInternals.c: fixing bug #99190 when UTF8 document are + parsed using the progressive parser and the end of the chunk + is in the middle of an UTF8 multibyte character. + +Fri Nov 22 13:13:00 HKT 2002 William Brack + + * threads.c: fixed initialization problem in xmlNewGlobalState + which was causing crash. + * globals.c: removed duplicate call to initxmlDefaultSAXHandler + in xmlInitializeGlobalState. + * parserInternals.c: cleaned up ctxt->sax initialisation. + +Thu Nov 21 15:05:45 CET 2002 Daniel Veillard + + * tree.c include/libxml/tree.h: modified the existing APIs + to handle XHTML1 serialization rules automatically, also add + xmlIsXHTML() to libxml2 API. Some tweaking to make sure + libxslt serialization uses it when needed without changing + the library API. + * test/xhtml1 result/noent/xhtml1 result/valid/xhtml1.xhtml + result/xhtml1: added a new test specifically for xhtml1 output + and updated the result of one XHTML1 test + +Wed Nov 20 14:24:56 CET 2002 Daniel Veillard + + * xinclude.c parserInternals.c encoding.c: fixed #99082 + for xi:include encoding="..." support on text includes. + * result/XInclude/tstencoding.xml test/XInclude/docs/tstencoding.xml + test/XInclude/ents/isolatin.txt : added a specific regression test + * python/generator.py python/libxml2class.txt: fixed the generator + the new set of comments generated for doc/libxml2-api.xml were + breaking the python generation. + +Tue Nov 19 23:25:47 CET 2002 Daniel Veillard + + * doc/Makefile.am: repair some problem if gtk-doc fail or such + * configure.in: patch for Solaris on new autoconf closes #98880 + * doc/parsedecl.py: repair the frigging API building script, + did I say that python xmllib sucks ? + * doc/libxml2-api.xml doc/libxml2-refs.xml: regenerated, reordering + and some comment are no more truncated. + +Tue Nov 19 09:09:04 CET 2002 Daniel Veillard + + * parser.c: Martin Stoilov pointed out a potential leak in + xmlCreateMemoryParserCtxt + +Mon Nov 18 16:05:51 CET 2002 Daniel Veillard + + * HTMLparser.c: fixed bug #98879 a corner case when 0 is + included in HTML documents and using the push parser. + +Mon Nov 18 00:11:24 CET 2002 ERDI Gergo + + * configure.in (PYTHON_SITE_PACKAGES): If --with-python is + specified, look for the Python interpreter not just in the + specified root but also in the specified location. Fixes #98825 + +Sun Nov 17 23:36:06 CET 2002 Daniel Veillard + + * python/libxml.c: fixing bug #98792 , node may have no doc + and dereferencing without checking ain't good ... + +Sun Nov 17 10:25:43 CET 2002 Daniel Veillard + + * configure.in: preparing release 2.4.27 + * doc/* : updated and rebuilt the docs + * doc/Makefile.am libxml.spec.in: try to make sure the tutorial + and all the docs are actually packaged and in the final RPMs + * parser.c parserInternals.c include/libxml/parser.h: restore + xmllint --recover feature. + +Sat Nov 16 16:30:25 CET 2002 Daniel Veillard + + * parser.c xpath.c: fixing #96925 wich was also dependent on the + processing of parsed entities, and XPath computation on sustitued + entities. + * testXPath.c: make sure entities are substitued. + +Fri Nov 15 16:22:54 CET 2002 Daniel Veillard + + * parser.c: fixed #96594, which was totally dependent on the + processing of internal parsed entities, which had to be changed. + +Fri Nov 15 12:16:07 CET 2002 Daniel Veillard + + * Makefile.am python/Makefile.am python/tests/Makefile.am: + trying to fix bug #98517 about building outside the source tree + * doc/xml.html doc/FAQ.html: fixed the link to libiconv #94585 + +Thu Nov 14 18:41:55 CEST 2002 Igor Zlatkovic + + * include/win32config.h: cleanup + * win32/Makefile.mingw: integrated mingw in JScript configure + * win32/Makefile.msvc: modified to allow mingw coexistence + * win32/configure.js: integrated mingw + * win32/Readme.txt: cleanup + +Tue Nov 12 22:06:45 CET 2002 Daniel Veillard + + * HTMLparser.c: strengthen the guard in the Pop macros, + like in the XML parser, closes bug #97315 + +Tue Nov 12 21:56:39 CET 2002 Daniel Veillard + + * include/libxml/parser.h: fixed bug #98338 , fatalError SAX + callback is never used. + +Tue Nov 12 13:32:50 CET 2002 Daniel Veillard + + * parserInternals.c: fixed the initialization of the SAX structure + which was breaking xsltproc + * xpath.c: patch from Petr Pajas for CDATA nodes + * tree.c: patch from Petr Pajas improving xmlGetNodePath() + * parser.c include/libxml/parser.h: patch from Peter Jones + removing a leak in xmlSAXParseMemory() and adding the + function xmlSAXParseMemoryWithData() + +Mon Nov 11 20:47:03 MST 2002 John Fleck + + adding pdf of tutorial, changing web page to link to it + * doc/tutorial/xmltutorial.pdf + * doc/xml.html + * doc/docs.html + +Sun Nov 10 20:48:57 MST 2002 John Fleck + + * doc/tutorial/ar01s08.html + adding file what I forgot for tutorial + +Sun Nov 10 20:33:13 MST 2002 John Fleck + + Adding encoding discussion to tutorial + Added: + * doc/tutorial/images/*.png: DocBook admonition image files + * doc/tutorial/apf.html, apg.html: new generated html + * doc/tutorial/includeconvert.c: conversion code entity file + changed: + * doc/tutorial/xmltutorial.xml: DocBook original + * doc/tutorial/*.html: generated html + +Fri Nov 8 17:59:32 CEST 2002 Igor Zlatkovic + + * include/libxml/*.h: retired xmlwin32version.h + * doc/Makefile.am: retired xmlwin32version.h + * win32/configure.js: retired xmlwin32version.h + +Fri Nov 8 16:55:47 CEST 2002 Igor Zlatkovic + + * win32/libxml2.def.src: exported additional symbols + * include/libxml/xmlmemory.h: exported the rest of the xmlMem* + sisterhood + +Fri Nov 8 16:08:13 CET 2002 Daniel Veillard + + * globals.c: fixed a typo pointed out by Igor + * xpath.c: try to speed up node compare using line numbers + if available. + +Thu Nov 7 15:16:02 CET 2002 Daniel Veillard + + * tree.c: make xmlFreeNode() handle attributes correctly. + +Wed Nov 6 23:51:11 CET 2002 Igor Zlatkovic + + * catalog.c: completed the #96963 fix, as reported by Karl + Eichwalder + +Wed Nov 6 16:48:44 CET 2002 Daniel Veillard + + * xpointer.c: tried to fix bug #97852 reported by Nicolas Noffke + +Sun Nov 3 10:43:44 CET 2002 Daniel Veillard + + * Makefile.am: switched the order of a couple of includes + to fix bugs #97100 + +Thu Oct 31 17:11:46 CEST 2002 Igor Zlatkovic + + * catalog.c: fixed bug #96963, reverted to the old behaviour of + xmlLoadCatalogs that used to separate directories with a ':'. + +Thu Oct 31 16:55:21 CEST 2002 Igor Zlatkovic + + * threads.c: improvements to the Windows-side of thread handling + * testThreads.c: conditionally excluded unistd.h + * testThradsWin32.c: broke overlong lines + * include/win32config.h: adapted thread-related macros to the new + scheme and for pthreads on Windows + * win32/Makefile.msvc: introduced a more flexible thread build, + added testThreads[Win32].c to the build + * win32/configure.js: introduced a more flexible thread config + +2002-10-31 John Fleck + + * doc/xml.html (and, by implication, FAQ.html) + added UTF-8 conversaion FAQ from Marcus Labib Iskander + +Tue Oct 29 18:32:33 CET 2002 Igor Zlatkovic + + * configure.in: removed xmlwin32version.h + * include/libxml/Makefile.am: removed xmlwin32version.h + +Mon Oct 28 14:01:29 CET 2002 Daniel Veillard + + * tree.c: applied patch from Brian Stafford to fix a bug + in xmlReconciliateNs() + +Mon Oct 28 13:51:55 CET 2002 Daniel Veillard + + * tree.c: applied patch from Christian Glahn to allow + xmlNewChild() on document fragment nodes + +Sat Oct 26 15:27:00 CEST 2002 Daniel Veillard + + * parser.c: Christian Glahn found a problem with a recent + patch to xmlParseBalancedChunkMemoryRecover() + * xmlschemas.c: Charles Bozeman fixed some Schemas validation + problems + * result/schemas/elem* result/schemas/seq* test/schemas.elem* + test/schemas/seq*: added the test cases from Charles + +Wed Oct 23 16:42:29 CEST 2002 Daniel Veillard + + * Makefile.am config.h.in libxml.spec.in doc/Makefile.am: + serious cleanup of the spec file and associated changes + in the Makefiles. + * valid.c: try to remove some warnings on x86_64 + +Wed Oct 23 10:53:42 CEST 2002 Daniel Veillard + + * include/Makefile.am: added winsockcompat.h to EXTRA_DIST to + fix bug #96586 + +Tue Oct 22 21:13:06 CEST 2002 Daniel Veillard + + * HTMLparser.c: Mikhail Sogrine pointed out a bug in HTML + parsing, applied his patch + * result/HTML/attrents.html result/HTML/attrents.html.err + result/HTML/attrents.html.sax test/HTML/attrents.html: + added the test and result case provided by Mikhail Sogrine + +Tue Oct 22 19:33:20 CEST 2002 Daniel Veillard + + * vms/build_libxml.com vms/config.vms vms/readme.vms + include/libxml/parser.h include/libxml/parserInternals.h + include/libxml/tree.h include/libxml/xmlIO.h + HTMLparser.c catalog.c debugXML.c parser.c parserInternals.c + tree.c triodef.h trionan.c uri.c xmlIO.c xpath.c: + Applied the VMS update patch from Craig A. Berry + * doc/*.html: update + +Tue Oct 22 16:27:31 CEST 2002 Daniel Veillard + + * include/libxml/encoding.h encoding.c: made xmlGetUTF8Char public + +Tue Oct 22 16:25:18 CEST 2002 Daniel Veillard + + * debugXML.c: adding a grep command to --shell in xmllint + for T.V. Raman + +Tue Oct 22 16:23:57 CEST 2002 Daniel Veillard + + * xmlcatalog.c: tried to fix some of the problem with --sgml + +Mon Oct 21 09:57:10 CEST 2002 Daniel Veillard + + * parser.c: tried to fix bug #91500 where doc->children may + be overriden by a call to xmlParseBalancedChunkMemory() + +Mon Oct 21 09:04:32 CEST 2002 Daniel Veillard + + * catalog.c: tried to fix bug #90945 w.r.t. parsing of system + identifiers in SGML catalogs containing '&' + +Sun Oct 20 23:31:47 CEST 2002 Daniel Veillard + + * python/types.c: fixed bugs when passing result value tree + to Python functions. + +Fri Oct 18 13:18:53 CEST 2002 Daniel Veillard + + * configure.in: preparing the release of 2.4.26 + * doc/*: updated and rebuilt the documentation + +Wed Oct 16 20:01:46 CEST 2002 Daniel Veillard + + * parser.c: fixed a XML Namespace compliance bug reported by + Alexander Grimalovsky + +Wed Oct 16 17:18:42 CEST 2002 Daniel Veillard + + * HTMLtree.c: fixed serialization of script and style when + they are not lowercase (i.e. added using the API to the tree). + +Wed Oct 16 16:31:05 CEST 2002 Daniel Veillard + + * valid.c: make xmlValidateDocument emit a warning msg if there + is no DTD, pointed by Christian Glahn + +Wed Oct 16 16:05:38 CEST 2002 Daniel Veillard + + * xmlregexp.c xmlschemas.c: fixed the validation of sequences + content model when some of the blocks have min or max, and a couple + of bugs found in the process. + * result/schemas/list0* test/schemas/list0*: added some specific + regression tests + +Tue Oct 15 12:41:01 CEST 2002 Daniel Veillard + + * README: updated the contact informations + +Tue Oct 15 10:35:57 CEST 2002 Daniel Veillard + + * Makefile.am: use test -f instead of test -e since Solaris /bin/sh + misses it, reported by Peter Bray. + +Mon Oct 14 17:37:32 CEST 2002 Daniel Veillard + + * tree.c: investigating xmlNodeGetContent() on namespace nodes + and removed a few warnings + +Mon Oct 14 13:12:55 CEST 2002 Daniel Veillard + + * parser.c: Christian Glahn found a small bug in the push parser. + * xmlIO.c include/libxml/xmlIO.h: cleaned up and made xmlCheckFilename + public + +Wed Oct 9 23:11:02 CEST 2002 Daniel Veillard + + * xmlschemas.c include/libxml/xmlschemas.h: added + xmlSchemaNewMemParserCtxt to parse a schemas from a memory area + * testSchemas.c: added --memory to test the new interface + +Wed Oct 9 16:22:54 CEST 2002 Daniel Veillard + + * doc/index.py doc/search.php: integrated the XSLT indexing, + a few fixed in the indexer, added a scope selection at the + search level. + +Wed Oct 9 12:18:37 CEST 2002 Daniel Veillard + + * valid.c: Joe Marcus Clarke reported a segfault on FBsd + this was due to uninitialized parts of the validation context + +Tue Oct 8 23:24:20 CEST 2002 Daniel Veillard + + * debugXML.c: applied patch from Mark Vakoc except the API + change, preserved it. + * doc/*: updated the docs to point to the search engine for + information lookup or before bug/help reports. + +Tue Oct 8 18:53:31 CEST 2002 Daniel Veillard + + * doc/index.py doc/search.php: added mailing-list archives + indexing and lookup + +Tue Oct 8 10:25:07 CEST 2002 Daniel Veillard + + * tree.c: patch from Mark Vakoc to fix xmlNodeGetPath() + +Mon Oct 7 13:12:03 CEST 2002 Daniel Veillard + + * doc/index.py: improved HTML indexing + * doc/search.php: make the queries also lookup the HTML based indexes + +Sun Oct 6 23:50:29 CEST 2002 Daniel Veillard + + * doc/index.py: added HTML page indexing + +Fri Oct 4 15:33:55 CEST 2002 Igor Zlatkovic + + * xmlIO.c: extended Windows path normalisation to fix the base + problem in libxslt. + * catalog.c: fixed list handling in XML_CATALOG_FILES + +Fri Oct 4 13:43:02 CEST 2002 Daniel Veillard + + * valid.c: typo/bug found by Christian Glahn + +Sun Sep 29 19:44:10 CEST 2002 Igor Zlatkovic + + * xmlIO.c: applied Windows CE patch from Javier. + * win32/wince: new directory, contains support for the PocketPC + with Windows CE from Javier. + * include/win32config.h: reorganised, removed duplicate + definitions and applied WinCE patch from Javier. + * include/wsockcompat.h: new file, now contains WinSock + compatibility macros. + * win32/Makefile.msvc: introduced double-run compilation. + +Thu Sep 26 19:48:06 CEST 2002 Daniel Veillard + + * configure.in include/libxml/xmlwin32version.h: preparing release + of 2.4.25 + * doc/*: updated and regenerated teh docs and web pages. + +Thu Sep 26 17:33:46 CEST 2002 Daniel Veillard + + * SAX.c valid.c include/libxml/valid.h: fixed bug #92518 validation + error were not covering namespace declarations. + * result/valid/dia.xml test/valid/dia.xml: the test wasn't valid, + it was missing the attribute declaration for the namespace + * result/VC/NS3: the fix now report breakages in that test + +Thu Sep 26 14:39:07 CEST 2002 Daniel Veillard + + * HTMLtree.c: fixing bug #94241 on HTML boolean attributes + +Thu Sep 26 14:25:33 CEST 2002 Daniel Veillard + + * doc/*: added the 3 new modules xmlregexp xmlautomata and xmlunicode + and regenerated the docs and web site + +Thu Sep 26 11:45:42 CEST 2002 Daniel Veillard + + * xinclude.c xmlschemas.c xmlschemastypes.c xpath.c: make sure + ATTRIBUTE_UNUSED is always put after the attribute declaration, + not before + +Thu Sep 26 11:33:28 CEST 2002 Daniel Veillard + + * python/generator.py python/libxml2class.txt: fixed a stupid error + breaking the python API + +Thu Sep 26 00:31:46 CEST 2002 Daniel Veillard + + * trio.c trio.h triodef.h trionan.c trionan.h triop.h + triostr.c triostr.h: applied a trio update patch from + Bjorn Reese which should work with MinGW + +Thu Sep 26 00:21:18 CEST 2002 Daniel Veillard + + * tree.c: improving some documentation comments + * xmlregexp.c: found and fixed a mem leak with python regression tests + * doc/*: rebuilt the doc and the API XML file including the + xmlregexp.h xmlautomata.h and xmlunicode.h headers + * python/generator.py python/libxml2class.txt python/libxml_wrap.h + python/types.c: added access to the XML Schemas regexps from + python + * python/tests/Makefile.am python/tests/regexp.py: added a + simple regexp bindings test + +Tue Sep 24 08:10:48 MDT 2002 John Fleck + + * doc/xml.html: + fixing ftp links - thanks to Vitaly Ostanin + +Tue Sep 24 16:08:17 CEST 2002 Daniel Veillard + + * xmlregexp.c: fixed the data callback on transition functionality + which was broken when using the compact form + * result/schemas/*: updated the results, less verbose, all tests + pass like before + * DOCBparser.c testAutomata.c testC14N.c testSchemas.c testThreads.c + testXPath.c valid.c xinclude.c xmllint.c xmlregexp.c xmlschemas.c + xmlschemastypes.c xpath.c python/libxml.c: removed a bunch of + annoying warnings + * xpath.c: try to provide better error report when possible + +Sat Sep 21 14:56:37 CEST 2002 Daniel Veillard + + * Makefile.am: fixed a breakage raised by Jacob + +Fri Sep 20 20:08:18 CEST 2002 Igor Zlatkovic + + * include/win32config.h: added HAVE_ERRNO_H definition for parts + which don't use sockets + +Fri Sep 20 18:40:50 CEST 2002 Igor Zlatkovic + + * win32/Makefile.msvc: applied zlib patch from Daniel Gehriger + * win32/configure.js: applied zlib patch from Daniel Gehriger + +Fri Sep 20 15:40:14 CEST 2002 Igor Zlatkovic + + * win32/configure.js: applied the patch from Mark Vakoc for + regexp support + * win32/libxml2.def.src: applied the patch from Mark Vakoc + for regexp support + +Fri Sep 20 15:35:33 CEST 2002 Daniel Veillard + + * xmlschemastypes.c: as pointed by Igor Float and Double + parsing ain't finished yet + +Fri Sep 20 14:00:16 CEST 2002 Daniel Veillard + + * Makefile.am configure.in: trying to fix #88412 by bypassing + all the python subdir if python ain't detected + +Thu Sep 19 21:46:53 CEST 2002 Daniel Veillard + + * Makefile.am configure.in include/libxml/xmlversion.h.in: + made configuring with regexps/automata/unicode the default + but without schemas ATM + * testRegexp.c valid.c xmlregexp.c include/libxml/xmlregexp.h: + fixed the regexp based DTD validation performance and memory + problem by switching to a compact form for determinist regexps + and detecting the determinism property in the process. Seems + as fast as the old DTD validation specific engine :-) despite + the regexp built and compaction process. + +Wed Sep 18 18:27:26 CEST 2002 Daniel Veillard + + * valid.c: determinism is debugged, new DTD checking code now works + but xmlFAComputesDeterminism takes far too much CPU and the whole + set usues too much memory to be really usable as-is + +Wed Sep 18 00:54:30 CEST 2002 Daniel Veillard + + * tree.c: fixed another stupid bug in xmlGetNodePath() + * xmllint.c: --version now report the options compiled in + +Tue Sep 17 23:48:07 CEST 2002 Daniel Veillard + + * HTMLparser.c: small cleanup + * valid.c xmlregexp.c: switched DTD validation to use only regexp + when configured with them. A bit of debugging around the determinism + checks is still needed + +Tue Sep 17 21:22:25 CEST 2002 Daniel Veillard + + * python/libxml_wrap.h: stupid bug found by mattam@netcourrier.com + +Tue Sep 17 19:58:26 CEST 2002 Daniel Veillard + + * xmlIO.c: small portability glitch fixed. + +Mon Sep 17 12:38:08 CEST 2002 Daniel Veillard + + * xmlschemastypes.c: incomplete steps for real/double support + * testAutomata.c include/libxml/xmlautomata.h + include/libxml/xmlregexp.h: avoiding a compilation problem + * valid.c include/libxml/valid.h: starting the work toward using + the regexps for actual DTD validation + +Fri Sep 13 16:46:14 CEST 2002 Daniel Veillard + + * hash.c: cosmetic cleanup + * valid.c include/libxml/tree.h include/libxml/valid.h: started + integrating a DTD validation layer based on the regexps + +Thu Sep 12 18:01:29 CEST 2002 Daniel Veillard + + * xmlregexp.c xmlschemas.c: fixed a bug reported by Jeff Goff, + the determinism was tested before eliminating the epsilon + transitions :-( + +Thu Sep 12 16:57:45 CEST 2002 Daniel Veillard + + * python/generator.py python/libxml.c python/libxml.py + python/libxml2-python-api.xml python/libxml2class.txt + python/libxml_wrap.h python/types.c: updated the python + bindings, added code for easier File I/O, and the ability to + define a resolver from Python fixing bug #91635 + * python/tests/Makefile.am python/tests/inbuf.py + python/tests/outbuf.py python/tests/pushSAXhtml.py + python/tests/resolver.py python/tests/serialize.py: updated + and augmented the set of Python tests. + +Tue Sep 10 21:05:28 CEST 2002 Igor Zlatkovic + + * win32/configure.js: added more readme info for the binary + package. + +Tue Sep 10 14:15:18 CEST 2002 Daniel Veillard + + * xmlIO.c: fixed a stupid out of bound array error + +Tue Sep 10 13:09:14 CEST 2002 Daniel Veillard + + * include/libxml/xmlIO.h xmlIO.c parser.c HTMLparser.c DOCBparser.c: + messing around with support for Windows path, cleanups, + trying to identify and fix the various code path to the + filename access. Added xmlNormalizeWindowsPath() + +Thu Sep 5 16:19:18 CEST 2002 Daniel Veillard + + * error.c valid.c: working on better error reporting of validity + errors, especially providing an accurate context. + * result/valid/xlink.xml.err result/valid/rss.xml.err: better + error reports in those cases. + +Thu Sep 5 13:29:47 CEST 2002 Daniel Veillard + + * DOCBparser.c HTMLparser.c c14n.c entities.c list.c + parser.c parserInternals.c xmlIO.c: get rid of all the + perror() calls made in the library execution paths. This + should fix both #92059 and #92385 + +Thu Sep 5 13:13:17 CEST 2002 Daniel Veillard + + * xmllint.c: memory leak reporting was broken after a change + of the preprocessor symbol used to activate it. + +Thu Sep 5 13:10:57 CEST 2002 Daniel Veillard + + * tree.c: try to make the copy function work for node of + type XML_DOCUMENT_FRAG_NODE, they are only created by the + DOM layers though, not libxml2 itself. + +Thu Sep 5 12:57:38 CEST 2002 Daniel Veillard + + * valid.c: try to provide file and line informations, not all + messages are covered, but it's a (good) start + +Thu Sep 5 12:49:35 CEST 2002 Daniel Veillard + + * xinclude.c: reimplemented a large part of the XInclude + processor, trying to minimize resources used, James Henstridge + provided a huge test case which was exhibiting severe memory + consumption problems. + +Thu Sep 5 10:07:13 CEST 2002 Daniel Veillard + + * python/Makefile.am: applied patch from Christophe Merlet to + reestablish DESTDIR + +Wed Sep 4 14:13:34 CEST 2002 Daniel Veillard + + * libxml.spec.in: fixes libary path for x86_64 AMD + +Tue Sep 3 21:14:19 MDT 2002 John Fleck + + * doc/tutorial/includekeyword.c + * doc/tutorial/xmltutorial.xml: + (plus resulting generated html files) + fixing one spot I missed in the tutorial where I hadn't freed + memory properly + +Sat Aug 31 19:31:17 MDT 2002 John Fleck + + * doc/tutorial/includeaddattribute.c + * doc/tutorial/includeaddkeyword.c + * doc/tutorial/includegetattribute.c + * doc/tutorial/includekeyword.c + * doc/tutorial/xmltutorial.xml + * doc/tutorial/*.html: + update tutorial to properly free memory (thanks to Christopher + R. Harris for pointing out that this needs to be done) + * doc/tutorial/images/callouts/*.png: + added image files so the callouts are graphical, making it + easier to read ( use "--param callout.graphics 1" to generate + html with graphical callouts) + +Wed Aug 28 13:44:54 CEST 2002 Daniel Veillard + + * doc/Libxml2-Logo-180x168.gif doc/Libxml2-Logo-90x34.gif: + nice logos generated by Marc Liyanage + * doc/site.xsl *.html: changed the stylesheet to show the new + logo and regenerated the pages + +Sun Aug 25 16:38:05 CEST 2002 Daniel Veillard + + * xmlIO.c: handle Windows sepecific file://localhost/ semantic ... + +Thu Aug 22 22:03:19 CEST 2002 Daniel Veillard + + * xpath.c: possible mem leak patch from Jason Adams + +Thu Aug 22 17:27:30 CEST 2002 Daniel Veillard + + * xpath.c: integrated xf:escape-uri() from Wesley Terpstra + in the XQuery namespace + * configure.in: preparing 2.4.24 + * doc/*.html: updated the web pages + +Thu Aug 22 16:19:42 CEST 2002 Daniel Veillard + + * python/generator.py: closing bug #85258 by generating conditional + compile check to avoid linking to routines not configured in. + +2002-08-22 Havoc Pennington + + * autogen.sh: update error message for missing automake + +Thu Aug 22 11:45:50 CEST 2002 Daniel Veillard + + * python/Makefile.am: typo in target name resulted in libxml2.py + to not be rebuilt. fixed DESTDIR similary to the libxslt one. + +Thu Aug 22 09:15:00 CEST 2002 Daniel Veillard + + * win32/win32/Makefile.mingw: updated with version from + Elizabeth Barham at http://soggytrousers.net/repository/ + +Tue Aug 20 16:40:48 CEST 2002 Igor Zlatkovic + + * win32/Makefile.msvc: added the prefix location to the include + and lib search path. + +2002-08-18 Havoc Pennington + + * autogen.sh: hardcode aclocal-1.4/automake-1.4 so that users with + both automake 1.6 and 1.4 installed get the right automake. Means + compilation from CVS will now require the latest automake 1.4 + release, or manually creating symlinks called "automake-1.4" and + "aclocal-1.4" + +Wed Aug 14 18:54:19 CEST 2002 Daniel Veillard + + * configure.in python/Makefile.am: more AMD 64 induced changes from + Frederic Crozat + +Wed Aug 14 16:43:53 CEST 2002 Daniel Veillard + + * xinclude.c: oops I was missing the xml:base fixup too + * result/XInclude/*.xml: this adds xml:base attributes to most + results of the tests + +Wed Aug 14 16:05:37 CEST 2002 Daniel Veillard + + * xinclude.c: quick but apparently working implementation of + xi:fallback, should close bug #89684 + * Makefile.am test/XInclude/docs/fallback.xml + result/XInclude/fallback.xml: added a basic test for fallback, + and run with --nowarning to avoid a spurious warning + * configure.in: applied patch from Frederic Crozat for python + bindings on AMD 64bits machines. + +Wed Aug 14 10:47:46 CEST 2002 Daniel Veillard + + * parser.c: xmlSAXUserParseMemory() really ought to fail if + the caller don't pass a SAX callback block. + +Wed Aug 14 10:29:02 CEST 2002 Daniel Veillard + + * tree.c: applied the same fix for the XML-1.0 namespace to + xmlSearchNsByHref() as was done for xmlSearchNs() + +Mon Aug 12 16:52:08 CEST 2002 Daniel Veillard + + * libxml.3: small cleanup of the man page + * HTMLtree.c: fixed a potential problem raised by Petr Vandrovec + when serializing HREF attributes generated by XSLT. + +Mon Aug 12 15:24:05 CEST 2002 Daniel Veillard + + * HTMLtree.c include/libxml/HTMLtree.h: integrated a cleaned up + version of Marc Liyanage' patch for boolean attributes in HTML + output + +Mon Aug 12 14:11:59 CEST 2002 Daniel Veillard + + * python/tests/serialize.py: fixed the test results, indenting + behaviour changed slightly + +Thu Aug 8 11:00:26 2002 Aleksey Sanin + + * win32/dsp/libxml2.def.src win32/libxml2.def.src: added + new c14n function to Windows def files + +Fri Aug 2 16:46:46 2002 Aleksey Sanin + + * c14n.c: fixed a memory leak in c14n code + +Sat Aug 3 00:15:06 CEST 2002 Daniel Veillard + + * parser.c include/libxml/parser.h: adding a new API for Christian + Glahn: xmlParseBalancedChunkMemoryRecover + * valid.c: patch from Rick Jones for some grammar cleanup in + validation messages + * result/VC/* result/valid/*: this slightly change some of the + regression tests outputs + +Thu Aug 1 14:50:28 CEST 2002 Daniel Veillard + + * tree.c: trying to fix a problem in namespaced attribute handling + raised by Christian Glahn + +Thu Aug 1 12:17:30 CEST 2002 Daniel Veillard + + * encoding.c include/libxml/encoding.h: Opening the interface + xmlNewCharEncodingHandler as requested in #89415 + * python/generator.py python/setup.py.in: applied cleanup + patches from Marc-Andre Lemburg + * tree.c: fixing bug #89332 on a specific case of loosing + the XML-1.0 namespace on xml:xxx attributes + +Wed Jul 31 23:27:42 2002 Aleksey Sanin + + * c14n.c include/libxml/c14n.h: fixed one more c14n + namespaces + corner case from new Merlin's test suite and added a callback + that will be used to improve xmlsec performance + +Mon Jul 29 18:22:00 CEST 2002 Daniel Veillard + + * HTMLtree.c: trying to fix the

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

fjQYB53J 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
?~qv2s{Q)XTTpi zwDQ6VWQ>)9t%qU77sFfiN(;2vKi~IIK9Yc3r?G9>q2Rb*3wp=&*LAV^KZDw{s6SMl z5dwWn9{A&3b4Um?e-4hI;r{tX;jjvKVFrVkn5gd7O0#miG$(0OKp|>n6Iv~z{oaKS zCNPV(xoCH0_SWWo+5=2A&J@vA&kuDyv93-CCv#n|kO#6p{X+z#?OwISLA9 zwhSk7|5pXjO=-|Tt_gr(Y!DqPUba_qd%L1on7$n_Qwa;Krjk$EwAJb}D2z%M(yaxg zREl)*J^GXc3f1U|CsL&z#9&<_rkOGILN07F7VlMl!pk4;0^~b)LV)M54>$~Su+&^U z&`I|4ofkND%gPi+<(vivB39`ldi^FEjihEGCxqXGK~yzhSRxf$mUESHgl~>W&5fNAhB(%vrgpu-52hz%2n57h5=6|KFFrX z0W~pa2)RE#0;Jv8w1HG^a+S>8)>rBu+Ou1EVVtJs>G9UHREP%CJ1#yP-(SwDCt7v*4&s@jkeXrW@I@_q9_h zli@n_Q$$=dnCQ5hyJz07s;`jT#?D;YcfvE};(HJWi6EKj&Y2vr>@f0i_RPCmlqf_y zPRaEtyWZxmGoJ#k%pd_A;n6ncK8BolIqkBr8-#!ius;~AlZ+huUB_@7Sh-u<=BAeE zAzb@>psOW3!;Iu)Jfz?@k$-9uEK{SAAz56l1Dr_H;35vmSqXjN{z!NjH~cekOn{SPCRelSkBBhK|a_GlG9N+~?WWdoq8%Ced#n>OEmAm{ zLdVVjEz_5mhu<{V3iAzI)-V=Tl;P&bk~IH5?^MhzgD!_zCM7jW6$M9dQaU&?`TsMnLYD)^ zkS|jIA-_~0Uo%9*bBXQUD`+H%?-^Svs1q*ju2Usi)-l%;E|8tm;dZUJ30`ATa|E7o zw6OfD!PRTrq9u-={%@@{Nso`PpNxJu{UxMPC!_6W@!;yr^L(-aXR@6cLj?lO8Y)=v zKm}ax5&cO*)9bh+Y61jLdZr5l7<5F6K{{VM-%wUdZ%V2f9xUjOtaY7z5}lL1X!6%t z{~9WB_?i!X_VBF22)o?I)Bro<>PA2Mzql?u10PrRB6Jl>9gxb2G3CGX&R0x75(P8I z2eMJt@k_WRbg+Je)0%e2OWpeR>PuV^E{FR|ne+@fwE}8WcO@b$y-hg}pEwaqB`vRk zVPQ~f&&}$PbI~XcrV~ua%iD>KpfML$02j1}2Uh~+ zbp~Y-C4KUB!N(dcPlx7;BR>fKm?hlL8H6I47i80`en-%u32j`>Hqj8kh+<>>^p|8m zcN<#L^=gYsd&-M`3_q0t4gUW~F_>_DJmVmV1bl3;QZkkcq|h$aOmwXb->9Ks7%7#r zxCp)5$Wz7y0Kfx+fUNz}f^+GqLvMjVdA*31VQp%Oaw8~-+=$Dy<+~{!{bg3g*UB+K z4lJWAt7A|XmL2}h2v-d;ZZ{>~e@Kf;npkppMr-&t{U(K${kQYyN7?Rku|In2`+4uK zo3(83tMi8?ut<4G-r{n@dUR9>nFp0?`>bKe97m9yhO&)lF+m{>OAWB+cKX`;P1c@K z2l^ik+GQr$k2;{r(UhF|-Lp}BrL`;9AAXFuooj&FO64-PCq+piuQhdhwK=mp z08UxF>U^*7HOEbK-AA3s3qR!ZMkv1Ez6dB;e2Ymn3+PjW<7VWtzWnT zG*zZf(D}O0AsFpPEF{mn$*F8h=c_7LV7GYU1(x98-s*54*~|~bPkv%FMZZG3himxD z%aQd|?@g9OaQX(n7vMkxwavFUxvc#{itx5}0e`d?Hh7QBqmA{e4Oop}hYeR^HbVlD z0Ra;;z@Gz(*|#~3bZrbq!p!tcML(_%96HN}tBzjnsv}StHVINM-l4CvAgf4zp z={jN86UlV)LKxqaO50UA;sx&CdxYpg5~og9&LbkryHeI?AsGq0#zKkRBqiR#TQvQJ zQxaWnR{8ly7f1FR;qktdraV&OP#Vb9@91f1t(iZ0?RZ)tJ3Fm=J)j~5kgn=ZJ>HLY zVPe86%@cPuRF%-^X7iwb@=|H(>DO7VO%iQMBT`b5%1tf>BnW1Py9ktcttu@;S{bln zcgjct*o|h^kI@fE!^(s+uoFdmQrzxs%aj>hC%Ns>;Z^-Gebi!Q-*$K3j;X|e&Q*** z`T&ssc|h+2YLr{bx-AsakSK^nw&l>)FZT}}6$|p?-do9iscI^B!mg&;wS%;I2V3qF z_RBgEcAP0B$9{{5S*c@trFY(!W96tIeq3*E){7KbhP3uMqPaHUhwoZv@t8_?$(E8) zPR92*#JnJstbZakyK4fzh~6_d(E8vJkz@lSZNgA!L}Zrq*|FLr#mjNFtHYdjBaG1> zIuLP!zA%SM{)<;80(hD(m8y{L`MKqdq%3rwbaxM#(bZXSm?sIC7VX|Y??1ukdBU$r zODXyqmIhO;d+cE$4jcl9S_tw1cTtl!9l#TkBUek1?pXyGJCISr*`h9KBMhC4)t)+b zHpZe0`itk{sJ55T{zK1FE08=Z=|E!s8Gk1Dq)k(d=PkL744-r*tj)MzyS0Mdjk`WR zRh`z~k#+||QZ|daJc=D3kxo6AxUOVJI^;u4QbC2~!^31fR8&FJzAi~03ca_|R~W5C z7$RBp#a#7fv~TFOu)Az@vdzK5_%2@7!7^T3dpozgHH6)Zv{dF8ZT^-LQHpQxFwTB2+bF!UWCzr;U%y+k^6MzXmGEhOK#{v{DU91=?i2g{e#Z7^X@ppXD=bo?ct)M_WZI<~)}ksG zF2N}Jqd#n_Xf^6UrBGnfN1Gjs4@epm>>YPKGSpH%ePbW55&@tuxbbG+@%&=I*D;7B zR-Ec;F%dh1qW^IDUal{taaisEafBPuTzG$$mE$%y_{}IBa7`V)P+I#Dy$d6eQ?7CW zFsH?r&L1Nchp`qY!U}c_c#VveX-JwEWQdKg&sKh zVb~`_AC>&l%fYo2UgyS7t`iF+=62LfpT4}Y=B-pSgyMVal7;5*Md6j6X+Q=96tKjIZ$Y{DJGKf6^RR%3 z{5rjC^kA2q@Mrx0fR4*2&*1z$D8|Iub_>8vQYx-jh!NmqPF_g^qWio3=ReL;U=(IO ztY_TQEwBG0)$H~mUZ0wonS-JwXX-b(;${1i&^6wqww_>3(i9I_6F5J|4$OiUvYpJ8 zN%yxN)q|Cd4E!GvftpqmmBCDs*QlO}X2xN7LVKB$wXP*NglzAgz*wACac6>^NPAC)*^zE=0qhrJ5)ymhRm%G>m| zNl`1qXLFK_ z!VF2z%XZY$kKNpy=56Q&Y8%y<{W*&@)AFC16~l@7#G>l=^e({j{5v!L9-2S!?hE&h ze+?o27jN*q9RCMy-^0@{{vFR>VGr=pf8lcf27tMK{-J+|rq}$tHNNrR-=JT<>AwvE z0O#qBRW4LYqNkaby>}iNO_csOTl9p8jr(l;5^IWHA%3n5F^UbdB^R&-Qx zmVNQoq62RSH2I;+W1Y?3qOdwv=4st~#Gd1BM`SIdIh@lI7$N(h_w)*ccFy1qzBC?q z4q}myXy_I(+F^~Pn<8XNkB~(liD+`u))-dC=Fl{mGQS-J0%^#v?)n63rU|jrYZc-8 zZ>5!wfu1*NcS@Mc{w@I{talmoG%^&QCv$ca=rp7T7e*+4EA6lDQ$Wk+qq10}cj$!} zl3>tgsW9>?-3!{ai+VK^BesHL-=`B$L`I^G1i}$(xfx@je~-KPZO86Fnr;5;(O?LoQzgJQX^Y6~W3l;Vcl}O-H z<}ZOe5vG{NLE}Zf+>IkUUhR`_2QvG~Y>^sw3Xwp8^gclzT$jjw^Bwa0S!%HW^yFWV z0q!qSV{yGdR4ewSXW`U{FUZKZLX~E93`{})d*8VR-EAQA4iGHTcpX3TYRV! z)t*T4Aj`BphDUh`#Y*xne18oqAl%O={st2^9e$)c9OhVz$4XCG*H}{|h|tfP&AT5+ zJ)pOrqz+JS=~nDfo;+dJQ)J48Y88s09d>?PWK9PEIjWJ~=<}=}8&MewnF^$he4_oC zHF82fN94LI;bw}H*wU+m_Bj1R1{PY2D*qgSFPH4_A(W@0t}QYXTte_&lKt)Vum`_o zD2L&b!G9(b7~^$3k=02RLoD}scs`@#-!|6y+(`B2PiROs;HG&vMJrsO!klwCW5%2+Qwvui|34t zA;lltnU=58CVCx`yGfeQbuyzX%$rHeGa0vVXLYx;W9}5MI2K5ZLyg^wUg$)JMAWQ= zfKkz5%>wqtFBY{L;Ps$0?@p`(GWCDeLMY*c$U|P~H?0koA)Tyq;Q1M!R zw&Ww_wh-89>Xq`#TifRA&sNB<0&&I6ayW8`@PRCQ!8yso(uE)aDL=fpx8@v&-e5dq ziic{=9jM8>CR0~zCM@bS8vYFP3rkxlYYZjF#uGV4pdrA&gTNWY`T*ae2pV=3wRZ~m zIe#8xHe6$%y+GzidexcVV?oObjz#pxS>-h0+Av6XPu<}O5S+4SungV37s#fQN zShUb8N+sY#v(eI3(b&5&Aa$|6!fWV?-RUq&)f)qzhENl7M)V~35QUUbIMoTCnaoh? z<%hux*TWsgO8@j>XJd0a3)bGO6nR5LKzXq8J3)^6~jN*#a@eF zM>(DhG6st~wNs;WpTY49HN9%Ar@Jx#m z-3Cwk<<2H=9^Sv5C)IZhY6sK_YT1-5;BXNXjzny zgM`zZykw%;{g`LyEe=!oaU+P#*4r0AN)#JH>pDo1>pMqqlgQ-E#kC&59ldP!=rbG1 z?prDJg4rt7&u8kmx!%Y>8zvi&ChecoS+P|^BSK}0=}VK^JriC)?ybhI&}Yz0;D$&4 zEb+4VPo@m(Y}TC3G2Rdoo1O4jeZf!Gs$l;2>be-VAP4T%kPJTr(!jw*3tU|F63JAm zk<;>h!xMZqga2j9%9_)!uQM&ge>DRj7~cW{BKGXA=CQMW#ZVexUKxl5$9S=zW6<2A zT(SMAB+uRs+ZiW*h$p?1*5~WFVgx*-oC@R!_Pj68R!Gx{TaY%2V~A=Hy5a?(#E_^k z;q|H6S%F=veCFTOe4s;`-dijo2beEEH%~m{X}sN(s*s)c$Wh!tkM>>WkM=tj(B!{x zk|%KHAcnEEbb0cVNt0v?1+{jb#SnMnl3&92=S->YO>K<@XFk7z4yLKhfH5WQV=6l| zAAs=MWyLQa@T_RAv*9ESWFkWR+zp&JH+d_XHnF}J1JkF4{Xf(l{9|L^dGxW6oF|Nb zj9yOm7K3p@RE_PL095HKCu zc<4Cz4yw`pfS~r7SrDJ3qKwej+kReV}jL(aMOTo>61F&{&3w^lYb>({M#kDn$4 z@cDnD90QS2#AfEkkP8u@5Uqjg2PMb6kdv-F*J%7)XUWMB-9brag6HhVRHzxV6hT8&-;-mUay%l=Mu{q_ugXg2W0VeVBG}t>$5o}r7`N$sT?!Y6@Rce zA-?FxRW6?N`)&)TARF}x0toH4cpi{v1aH7Rj_47?~tTLPLFEC~%iA;M5#FpE)a zedvt2S{QKEhusEVOWus((6|?96Lq+-$Va##iOTM(tD{vt6nZ*p&s22=rI#YS5@ZC( z%g&9T>1~l(!^!u8*yV@mT&wMBV;9K+5mc>|4LBw^j_kg5{c5MxrW*KYnJ3dU-xVg7obI`?c9}%^E--t2lW2Ect>KNHhZM z{9foHoOfL;oNlbfj1F5Z7VILb1Ccfl&1NVS1%c7 z{1P;Z*!Gotc|jwqdjrRaNqrI@5E=ByaQqM4g%i!3Sii}5UMx+MH3?Jd3G`{<);M%) z?hep0C%#!=;FnY){sTWm+LM|%S7v?})x)PO>3gduCt&W;Y~nVrS1;>@-N3}2VX9AP zpsq8ZwLLC+5`Gh%gyOV>e8uNDUA#Xd=hD z=^(bRU>?8*CD|@#EdpPXSSof$x`#*@Y3yUmxyuix%mwdwRu96L1OZXCJsXSVBsuZ+ z9zw4Qk1Z{dVUr}p{&`gEy4B{rOOBB`FjtQ5sC{``5UMOQr3=W)UaV1sb-9~6m^@Es z5+K$P{HsL&27=JlE<=POu&P31P-a>zXK_wYL#3C1F6X#Jh!E)*21qKqm&XcST^yfaYAE<0xhF`~&v7?P&A`B|)&5lk$y zNq5HS9_ULg*J3pGs8~e4rJ4mCg6?kJftmFpn>c>txW~vQeHk!{zy`DJ)j8`%3Ehd9 zc_Hz*d}4vT1K!YR!anQvxDCHtYa zqtsW3Q@N3j&S8tzvqFQJj^SG}&&$(G) z4~FY4;M%{oojQXFcMW@uO=hpnq6mI9CE8(ony-$?b=jH0RJv+;CR8{iCL3)DD?I|QAdj~{?^Th-|<@3{#aS5#xUJ+up^S8h??3fUY zP8PD>@l5D1oO0y6m8W3xYIg=$r}SqE1?;siDus_3eX?n$yuWUG2;0m}=19W>8gQH` zE+!HOHl^X@esCM?Z)uN{#Wx@8c6S&07xkE9-lkRa7(w4ej;!Po14638rzcf~htt}E zHQU4!lZ|<}1A?Fq4XcvAs%MhZZp4LX8 zZW#`5;vYkGq+Kjt7kSyA{8s^L-oRD0tyZ_+8U;U6T6C*++&-9RPpNgarWcvfn;Qr~ltQT-IPA1w`2qdhf)7@K{@yV^hn)|irK65U{bLaCQq!DHPy7nP;xr#zer8O@y=9{Iy zreWQ-xD&;;Dr=m|bCeet5mE>%WTN6U_SK020;VJqeE`#v23J@MWQo~(%f~GWvmr;J zyer~x-r;+Bp>8AJD9-s*W$fE{bA3*`x*4J{coCscb_x`%G5enw#9c zrnz4fV?I6K+(pmV&Ql6nKBSSqrtbjl$$pM@_8}54`~@@HsumA=YXx!a`)m~%PP4_5 z0q~0L%W{}u_sxRHeEO*Q1k=+wB*rHU&2%64##yoI->pVbsb3D3_QmK8dYu1YgL=7m z3i4c)(^ko{E$s{2gzLxk%Ojsa8NwPg(s&_2hPm9}a;p|zh8G9Abk9!1IgN;4Mj@#y z23x1hzS4@L-o1BAAu`+*fIQFv^}OJc`bm$axqr!leuTa@JzkUhM6vnOgW~>=2_<@T zX70CzUD5M(Aq`>5Ck$jlvNq&tHB!7s^&Mn)Mp0u6W5I%#o@$nLDu5ml|7Ca*E=VO64`}~ zj~$H}-vMa98Tgm4LLbmK!cmfllPYInh7Lj7Q!uk(^3b@_uc)6!=f|(vtky{oX_1eP zP&acuoUjFw_I>TVrJeRGtgZ=)Qdf(;7O2vE>W#o9wfjJ~m}(;=n8E zKfk1?QKIPm>EUV7pB37JDLTs~QE)}CUzL9FC@o;8$*^_9=3&OWUUw+psulH&6H05Sv@Uz=Cr0 z#;*pLja?aBORj<1so6TTo<17 z)$NGsVmd9QHzML{Ovr(?aQH~;!J{F?+ygw&n?dj^WaFp;?4)*y&{zSSOZr;Tt}{nPM`@cgnpn zhS95OJ5-6uFwlD2fi+{)54vv_zOpi!7pZ?1J+f#$-rl-sn`%t415xw`O8FF&s@JddTfdzh` zfn4Q`iY$Sxe=q__=a86`+VQYBHm)7dU(T~T(i)fOu`WJ9pH4ejm(=q8ai2F->AsqD z?b!@-dK=R$dS+<6yGp)c*}WD-Gtbl>$yR?;1W&9Emj|p28ybaJkI06XF-}o8VRyZ$ z^!@HKau)GMGlp=(M7|;oaVc&rwHIxP4jYZ2U>zhr@7bKsd513U95fWpoF+=JLbQ*O zR+Q5ykI;>k@$6SekJg<%>jzE}tfA2SVf|uDvdaGHv8}isoN0*V&2j#dx+J;K)_l1} zu~J*v7KuGNpMrUlC}U@{t7hQYdt*<&>#r7-uZE zJi4_$eRU+Z2EftFG53^^n}RJ)<%e2@xAZ>TK-4(LonKr}Igq`$m#=F}z!Z!KH0bFl zF2=S(fvNZ)n(!dqdF5iMsuT{+z;Z|5H>?lu36t9*kz!olx%A*|B(x&VDs21=H&JN; z*=8>Q132$W8C3M7k-+T+^S{!(6{@X&*4HrX)jeuysHU3(<(^+nhCQGf;>5;~b3OY7fnWvaTQtG;RdB!%p5)!yI7-T@cPRsS7@yW0 zAVFOA8s`WsUdzzwcIs)ps)M@4w}tTsxP`U6Sg|7E<(^ZpGV2QH`Jidgk=$Er%4ctfDrT+>k= z>O}TM`A;7`%A|ZAkw_2$ZU>4_!)<~Bti5VNKg=RXsdaULnLP3+E21%@@te;WgDzfP z;>=HRsuJ+2B2;i#j6ehG7Z+__(7)B_1gDhgy*(d)o8D5bJBqzN|1e+}Fg>}PAtV%j z?QjOk{DDD$i`HzY{7aJ05YmhGV6%RxRF-S+C|sB^C7;i1%-2%Q1;aLbUT8_C#>B z_BQ?-w0AwPQZ8)z2pCBy{UdWAY^bh-)=)Ho@U?@?f?3-rGOvDIEE}|DG!e}&Lp!${ z_TKzFbIO%G>4ovdj5)Kgt(o0a`xl~AhK86IJ}H2{pD+QCYCF``r#bjhwe4bLp|QsnQtze zwZOQ`(Gcq4aTM9Z;a$ZfaP406#6_*zPTi}AS$7nyUbsR9>n>BMWF~9;!>ez6gZ9Z~ zq@l=^!66gs59QvGtgw)jD>`Tnwp}+$%iWDw5fUlci#w%4@mJf z#_yyr-COJ({;&gPo7g36_L&8rvQPGq)B$_JFY?F-cODN0jj*B<|gynAGttB_J_?_HU8o z-VSgE@Qjk@zZdB};jqj(1n#`%ZB*N_)+9w6UNHQMD)pN$?Cz2N4KSsjn%>rgT!$>E!XP!yBh->TIH@}lUNQgM`MZ_EuuqV)=!&*Ya7E5Mn z>eK@_xX-O&D|#_qwR7}~lINXEt?FoH>A8Zy5hz(-=*=lzV&>4MO6`#!E@0GOcvyXi zNK_8r#Y;`VK1fbryzj~?Gb|4bYFftlac1XfTfZDy2jm)=K6QnBD@SC3iT{7+<}P1e z^v`7}8j&cek#)~scWm~KL3)~%<=e3|X+3OGkmhwD51rmn<_Lg$*2A9+vG!!z7Ae(+ zZ(I6O_Fh4mhr#WRGu4B+L7||j#ve>kvJx+L_ADeZEnQKJ%e#An8GF)MVrujeZ3!Ar zHGgG<>_N_yzTc8e1kbI{TSz*RVVmM-nbH+HL}v7=NM?v*5I}`ngI&P=$X*D;O8p-8 z;{xTioTW@o2J*b|wI5Tcvm`uFtFv9T`loO?zl{$bYO0B4h%trSd#HKp-!jOGe|`%Sk5Ey zoD)2$UkU}|CBwrH0w&>0$6>ixy_;1EZ{TuoN*#b#{ZHuNM5}Clp>mUN3g%F<(81oK zmF1{`j2nb7(s((zWrdb`P&G%ndlW0{Fs%!Q9f+`u z3T~LIl-W@+4#VW?ZtIlA9w6me@8WS|j3Y&q(xy`CIDW)5(gs_oy@nXAY*wgwBRzY9 z;B~<)J}Fwc`&?S)Y}$jE@G5i55`0L1l&fgu`V5FEk{*}sL+}H?XPU#){&G}`DuDP| zwY(8sDHk&Dm7BDZHFJZR;~dfQ17?K9mW~(FkQgFxy2o`+B#8#<( za_LcbZ1%6hIZ?3bL=o#h$C;9Nm4U`P-@LOH z+v2VqcsbH!qm{n zXZ!d1%Sv52XkbDmFKr-=Val6|ovi84%9 znAd|EDYL`)gVbNWn|2(V#77MK2w`9*16HT|X8_QA-xV1X>>H)iqoN^$ijS6kpgD1n z3+rsOEq8E@h=s>H@jZA>qi(>qA^sXamNY8NnR}15+9UYAfTy_05NU4yu@9&|NtBqZ zpDax>mP z$`gCvrB};2*Ky_%Tbxc(0}NSPx!gWs+L(K!OJe9f`hcyv?-2TZVzkh%X#5xm9+Ic% zl*9&cM*|~4c~V%8Hin8;7@~m34)4HzxQ2$g6Vz0BrqW9@+<+6>RPM-2i%%=qU_(oO ziW`c8y%cJqzM_-&E-4QL1~f3{JY7NVW51zg8me{A$D3)|*K&Sa4i&s-BO)HUSMjyF zn_D{v=C0xbne2AN-3bR*S5<=1D2-t)*XcSC354g@y~1*A2?@~AZ28v-8}s0oc;B*| z8Qqr7Sf^fp*I26*9OvI{xU&$O!xugOEK+DNaE_qa{QXxjrvNL*^4gm~u}K_D*4q(| zud@xKFHSnFV@K#0N)HAc0%nD-H9>V(O>=7o2@e~=TE5jDo(TUY6;*>U=#u{5z6Cg8 zL_$b~x=&x-*d2SIpH6Q&=}w>~np%X8)#Y4*PBSQLwpVtZ3yyD9ww`YW(Fcrt?k*9^ z=~V?o^=F58K4C}bVM{`czCpj51JUJO5NN(Zv{Rq#o|KWR|7mW#QE(m`Bn4iirUZCI z3{dTglnn8bfF`ZH9WLxjqtQZ5Rqkkyg?nVvHQw4CW5_I7mrq2-9m0Od5+wXJDc7z> zrj0U2l#`tR8uF{#Tl*w+@OiGXR=*yKBkEEp4Ez6qTVt)lvC?65S+pm`9<@jEDtOQ4 zcxt77oi~_%K{Swr5Se`x=Otm?QA^$;_8qY!;i;o;=K+jS?4nVAG&$4J`VMGPO|Kg< z!SxO>LwFM#fBld2qqhaaFznxX;P@`0V4p+10Tc;?lpKeE;72QeJOCnzu-wCt_SS+G zphkUi1T7?7udKL;iM=mnr1Jber&LDu1g!8%-vBNF_xokmT4F1FTEh|7hSKXZxX5Ka zmlFi9YiU8D0j2*>O93N@bn~3-KB6useLvgiy@tpk&Pz)M$MgtPSikIC!8$}evRi=h zK|e-@Jl69fP^iK#g$?DPa`a?_ro(pvAu2Us-~0x80ns!2lzLpNECfa?&0^AT_<|(1 zW?w8Zl`bU}(BT{d>rEWWFD)RC4V3^X?YDA(y>Mt{cq&rE#xJH@>>ad0Rr?6l_Yu0n zqMZ;Q*l~q5wJEaD0;^?&!wgKQqt+!w@(aiZaJ!ScPRHF%p*2q6v=xZV6Hr~TDa<6A zN#E!d!7Lb<4nJ|ju>B$#Bmvu*Z8syTY9|E7boNSJSOZlAp!VIaDJta}^B2v*BFECp z;6aDW-$8jV-TzJ3i{QFQ@V1{xH@?P2W`F#`i!kC?t$m@;U?o6R8Cfo`vJf8as|7=U z7)%~b80_7rXVyTf+S*)6P9Te>@Qw>gB=}++FFh*A16|&2{`1T`rG7(j{Ny8W*R<<( z+e*;sn97je@9OcW9-BJ^I#>ObM&=hWTb)b%+}i+S4aIMP@17%rP2XfrwMV;L7sw(E z>4S`iKNQ@<+)-VqQe%8xr}OWTqV@3kp(>Fs%)mifehBNrS_t?pP6Gl7d}x_Cun2?| zJJrEnHwI&oa@*J_C6Lc80njlFm_^bvVKDA%mZ+hB<78MRR6Xw}6tap7<3=<;Y?~{P zD=W>N^xICi(^d8j^U=bljE5-KEM@vN^AL&}CQvBNvQ%uJhMkA3T7meim?hUhQpg0V z@b<>p5r3jt_Ka5ofT*)N*X)8X1sNUA4I+0m4bc7y4_xiM*dbDgo8Dy{&`Ll9*!kHWm@N2chE0% zV+QhH_e~>K3{J)2o^-nMUEhg*Scl)_o;HWj$+Csv(TksxX0)tS*pPb&wdLK9l~c2f zrmPpD+Y#3&Ad_oXv%_L49wxhyDsKb>dG@G3%d}xxkh8N%_-2Mk>)rV-k4?Pa{*XnY zZA4MywGjsO$S!in6=owVLk~N0o=ai=ckY@Z3_|%%V9#=o6=Hb>ml?;s9ai0kf?}3h zEROOGK5O$ed=dadwn#|I6>wvdlklE|=iRHkqo8yaiymQfTpn#bb`tzr@Wi?4m@747 zu%zfY(!n8-uqoHD-f9RF-m7+(?w0llj+D$;ro7-~_jOmGi!}c`1#TpAUx41C?J$s~ z{|=*4>aGGyIdxh?&Z%FlKhplhC^WU$c$pHE3lfSXc&)|xO3a1!%0n|VmJ*{xZ%DC% z&ALacAxBz?eH5>g0cV5cJC1)r$&Lhlx=jGvs4VSFFMbb9u%7E|jlk)r)c5Nh1cYfb zLDxaHMGF+Q=IyJ~di5lNvIy|W9ne@BNlH0VU{0_rcBACi6VQ8i9thJuB>mY|zox*& zQX|q~H)O!9Rs?ju7Jl(x(XzkCMF~UNxa$*Un$ksVy2(96X2s_}W%>VTNqTDKNRxWI znCx$4Iv6`Jelw7npE*sA?a!Ed(P&|h7fiOp4#NW7XB4hk2A-W*P@gg#Z(I`&~4{-*Qk<%*vqDhsJX&(jtt zW3fohBlE&~(zCl|Nz!in$OKSw7tBlQE?OjMEP|7PKsex0*Fup#FX zWo)q;Ij=CemTywLqaZqf-oSipcb6`sXUv~bXYY5i==_3Kd!FeZmk{#eg8yci8~p+b z;UC)(@qWc<4w_s%IXq)JOR@iX=*%X&1+1-J`{=T<-x8DyI*YwVT*xhy&otg9Bk=y7 z>t8ptE&07JUl`lw)Yr|Wzc!X|{+{gqpJe&?{T+Tnm(8#5n*V%yjlljrzxeuX{ykqZ zza6&tG#l5z@@^|Qpl;+5fDF2zNOVlw3SPQ7rRs)BGX)uWwFk_kEm&e}fl~p3UcpD& zc%&q){B_X^S{7`BgPu@&UqnYHW7LWJZFi?dt0kZ`GG4GWsYobG{NK->$lT-6LjP@( z^v>DzPC1@fI+)r91^rde`6|j2PuEHD0Oa||EW0xodwPKMU2pZ!^h(K}?x*ZzSBJ8W zyjBY>DB+(XCQa8r>3k&<+thLC@3Iud=apO6wo4+`zF@s#zCA6k?i$YDgs6BN$FfXt zVWhpjWmO%Eg8x8Fe8XHeuLU*py3_kk-NMQKkB}G8RLdGrjir&{dZ~(!@hEh&RA59R z0Yhzy@Wv+<`Unrp8$c~4^M?IPUd>OyP9CJROf6IhJ+Sc6R}SZ~sT-AOzu0W8o6T}L zd~Bm1e^t^=y8et+~IrH{1VLV7yFWSNGwYn6w;i zr2aw$L%BIvtw@#rpc{)wZrUt^CGs7?8QJyZVGvc7QOiRQY1&tHu5inTTvL~ z5d(CtHjDhz+5zKBv1R5FVVrP@obUx2+3@{Fx_@KCDQ`Dk{=Cs3Dy~w~U49vEOYhHE z=>vxj!Z^qplm8BJ2uqqyhFre+)dVcY)y*$$p@z@ThS#z{)p+BI7jA@J3xQKyK0d|! zB5u`kX1TGzATHnQ|1Y^^t=c6+z-C^H7k|&0D~O`jVX
r< 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]nZ({ov2U(8r}ZpOLzB{4rUrelUAnF4fN!dU%{Fj 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 z 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 aQtrMu;)s5Lu0H2eqm{=^B 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%0DRo!u(l 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